@myrmidon/paged-data-browsers 1.0.0 → 1.1.0

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.
@@ -52,12 +52,12 @@ export class BrowserTreeNodeComponent {
52
52
  this.editNodeFilterRequest.emit(this._node);
53
53
  }
54
54
  }
55
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: BrowserTreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
56
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.1", type: BrowserTreeNodeComponent, selector: "pdb-browser-tree-node", inputs: { node: "node", paging: "paging", debug: "debug", hideLabel: "hideLabel", hidePaging: "hidePaging" }, outputs: { toggleExpandedRequest: "toggleExpandedRequest", changePageRequest: "changePageRequest", editNodeFilterRequest: "editNodeFilterRequest" }, ngImport: i0, template: "<div id=\"node\" *ngIf=\"node\" [style.margin-left.px]=\"(node.y - 1) * 20\">\r\n <!-- pager -->\r\n <div\r\n *ngIf=\"$any(node).expanded && paging && paging.pageCount > 1\"\r\n id=\"pager\"\r\n [style.display]=\"hidePaging ? 'inherit' : 'block'\"\r\n >\r\n <pdb-compact-pager\r\n [paging]=\"paging\"\r\n (pagingChange)=\"onPagingChange($any(node), $event)\"\r\n />\r\n <pdb-range-view\r\n [width]=\"250\"\r\n [domain]=\"[0, paging.pageCount]\"\r\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\r\n />\r\n </div>\r\n <!-- node -->\r\n <div class=\"form-row\">\r\n <!-- expand/collapse button -->\r\n <button\r\n *ngIf=\"node.y > 0\"\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\r\n [disabled]=\"node.hasChildren === false\"\r\n (click)=\"onToggleExpanded()\"\r\n >\r\n <mat-icon>{{\r\n node.hasChildren === true || node.hasChildren === undefined\r\n ? $any(node).expanded\r\n ? \"expand_less\"\r\n : \"expand_more\"\r\n : \"stop\"\r\n }}</mat-icon>\r\n </button>\r\n <!-- tag -->\r\n <ng-container *ngIf=\"!hideLabel\">\r\n <span\r\n class=\"tag\"\r\n [ngStyle]=\"{\r\n 'background-color': (node.tag | stringToColor),\r\n color: node.tag | stringToColor | colorToContrast\r\n }\"\r\n >{{ node.tag }}</span\r\n >\r\n <!-- loc and label -->\r\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\r\n </ng-container>\r\n\r\n <!-- PROJECTED NODE -->\r\n <ng-content></ng-content>\r\n\r\n <!-- debug -->\r\n <span *ngIf=\"debug\" class=\"debug\"\r\n >#{{ node.id }}\r\n <span\r\n >| {{ $any(node).paging.pageNumber }}/{{\r\n $any(node).paging.pageCount\r\n }}\r\n ({{ $any(node).paging.total }})</span\r\n ></span\r\n >\r\n\r\n <!-- filter -->\r\n <div class=\"muted\" *ngIf=\"!$any(node).filter && node.y\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Add filter\"\r\n (click)=\"onEditFilter()\"\r\n >\r\n <mat-icon>filter_list</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"muted\" *ngIf=\"$any(node).filter && node.y\">\r\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\r\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\r\n >filter_alt</mat-icon\r\n >\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center}.form-row *{flex:0 0 auto}.form-row span{flex:0 1 auto;white-space:normal}#node #pager{display:none}#node:hover #pager{display:block}#node{margin-bottom:4px;padding:4px 6px;border:1px solid transparent;border-radius:6px}#node:hover{border:1px solid #98a8d4;border-radius:6px}span.loc{font-size:.85em;color:#666;vertical-align:middle}span.tag{border:1px solid #aaa;border-radius:4px;padding:0 4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 6px;margin:4px 0}legend{color:silver}.muted{opacity:.3}.muted:hover{opacity:1}.debug{font-size:.85em;color:#9c3d3e}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i6.CompactPagerComponent, selector: "pdb-compact-pager", inputs: ["paging"], outputs: ["pagingChange"] }, { kind: "component", type: i7.RangeViewComponent, selector: "pdb-range-view", inputs: ["domain", "range", "width", "height"] }, { kind: "pipe", type: i8.ColorToContrastPipe, name: "colorToContrast" }, { kind: "pipe", type: i8.StringToColorPipe, name: "stringToColor" }] }); }
55
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: BrowserTreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
56
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: BrowserTreeNodeComponent, selector: "pdb-browser-tree-node", inputs: { node: "node", paging: "paging", debug: "debug", hideLabel: "hideLabel", hidePaging: "hidePaging" }, outputs: { toggleExpandedRequest: "toggleExpandedRequest", changePageRequest: "changePageRequest", editNodeFilterRequest: "editNodeFilterRequest" }, ngImport: i0, template: "@if (node) {\n <div id=\"node\" [style.margin-left.px]=\"(node.y - 1) * 20\">\n <!-- pager -->\n @if ($any(node).expanded && paging && paging.pageCount > 1) {\n <div\n id=\"pager\"\n [style.display]=\"hidePaging ? 'inherit' : 'block'\"\n >\n <pdb-compact-pager\n [paging]=\"paging\"\n (pagingChange)=\"onPagingChange($any(node), $event)\"\n />\n <pdb-range-view\n [width]=\"250\"\n [domain]=\"[0, paging.pageCount]\"\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\n />\n </div>\n }\n <!-- node -->\n <div class=\"form-row\">\n <!-- expand/collapse button -->\n @if (node.y > 0) {\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\n [disabled]=\"node.hasChildren === false\"\n (click)=\"onToggleExpanded()\"\n >\n <mat-icon>{{\n node.hasChildren === true || node.hasChildren === undefined\n ? $any(node).expanded\n ? \"expand_less\"\n : \"expand_more\"\n : \"stop\"\n }}</mat-icon>\n </button>\n }\n <!-- tag -->\n @if (!hideLabel) {\n <span\n class=\"tag\"\n [ngStyle]=\"{\r\n 'background-color': (node.tag | stringToColor),\r\n color: node.tag | stringToColor | colorToContrast\r\n }\"\r\n >{{ node.tag }}</span\n >\n <!-- loc and label -->\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\n }\n <!-- PROJECTED NODE -->\n <ng-content></ng-content>\n <!-- debug -->\n @if (debug) {\n <span class=\"debug\"\n >#{{ node.id }}\n <span\n >| {{ $any(node).paging.pageNumber }}/{{\n $any(node).paging.pageCount\n }}\n ({{ $any(node).paging.total }})</span\n ></span\n >\n }\n <!-- filter -->\n @if (!$any(node).filter && node.y) {\n <div class=\"muted\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Add filter\"\n (click)=\"onEditFilter()\"\n >\n <mat-icon>filter_list</mat-icon>\n </button>\n </div>\n }\n @if ($any(node).filter && node.y) {\n <div class=\"muted\">\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\n >filter_alt</mat-icon\n >\n </button>\n </div>\n }\n </div>\n </div>\n }\n", styles: [".form-row{display:flex;gap:8px;align-items:center}.form-row *{flex:0 0 auto}.form-row span{flex:0 1 auto;white-space:normal}#node #pager{display:none}#node:hover #pager{display:block}#node{margin-bottom:4px;padding:4px 6px;border:1px solid transparent;border-radius:6px}#node:hover{border:1px solid #98a8d4;border-radius:6px}span.loc{font-size:.85em;color:#666;vertical-align:middle}span.tag{border:1px solid #aaa;border-radius:4px;padding:0 4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 6px;margin:4px 0}legend{color:silver}.muted{opacity:.3}.muted:hover{opacity:1}.debug{font-size:.85em;color:#9c3d3e}\n"], dependencies: [{ kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i6.CompactPagerComponent, selector: "pdb-compact-pager", inputs: ["paging"], outputs: ["pagingChange"] }, { kind: "component", type: i7.RangeViewComponent, selector: "pdb-range-view", inputs: ["domain", "range", "width", "height"] }, { kind: "pipe", type: i8.ColorToContrastPipe, name: "colorToContrast" }, { kind: "pipe", type: i8.StringToColorPipe, name: "stringToColor" }] }); }
57
57
  }
58
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: BrowserTreeNodeComponent, decorators: [{
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: BrowserTreeNodeComponent, decorators: [{
59
59
  type: Component,
60
- args: [{ selector: 'pdb-browser-tree-node', template: "<div id=\"node\" *ngIf=\"node\" [style.margin-left.px]=\"(node.y - 1) * 20\">\r\n <!-- pager -->\r\n <div\r\n *ngIf=\"$any(node).expanded && paging && paging.pageCount > 1\"\r\n id=\"pager\"\r\n [style.display]=\"hidePaging ? 'inherit' : 'block'\"\r\n >\r\n <pdb-compact-pager\r\n [paging]=\"paging\"\r\n (pagingChange)=\"onPagingChange($any(node), $event)\"\r\n />\r\n <pdb-range-view\r\n [width]=\"250\"\r\n [domain]=\"[0, paging.pageCount]\"\r\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\r\n />\r\n </div>\r\n <!-- node -->\r\n <div class=\"form-row\">\r\n <!-- expand/collapse button -->\r\n <button\r\n *ngIf=\"node.y > 0\"\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\r\n [disabled]=\"node.hasChildren === false\"\r\n (click)=\"onToggleExpanded()\"\r\n >\r\n <mat-icon>{{\r\n node.hasChildren === true || node.hasChildren === undefined\r\n ? $any(node).expanded\r\n ? \"expand_less\"\r\n : \"expand_more\"\r\n : \"stop\"\r\n }}</mat-icon>\r\n </button>\r\n <!-- tag -->\r\n <ng-container *ngIf=\"!hideLabel\">\r\n <span\r\n class=\"tag\"\r\n [ngStyle]=\"{\r\n 'background-color': (node.tag | stringToColor),\r\n color: node.tag | stringToColor | colorToContrast\r\n }\"\r\n >{{ node.tag }}</span\r\n >\r\n <!-- loc and label -->\r\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\r\n </ng-container>\r\n\r\n <!-- PROJECTED NODE -->\r\n <ng-content></ng-content>\r\n\r\n <!-- debug -->\r\n <span *ngIf=\"debug\" class=\"debug\"\r\n >#{{ node.id }}\r\n <span\r\n >| {{ $any(node).paging.pageNumber }}/{{\r\n $any(node).paging.pageCount\r\n }}\r\n ({{ $any(node).paging.total }})</span\r\n ></span\r\n >\r\n\r\n <!-- filter -->\r\n <div class=\"muted\" *ngIf=\"!$any(node).filter && node.y\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Add filter\"\r\n (click)=\"onEditFilter()\"\r\n >\r\n <mat-icon>filter_list</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"muted\" *ngIf=\"$any(node).filter && node.y\">\r\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\r\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\r\n >filter_alt</mat-icon\r\n >\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center}.form-row *{flex:0 0 auto}.form-row span{flex:0 1 auto;white-space:normal}#node #pager{display:none}#node:hover #pager{display:block}#node{margin-bottom:4px;padding:4px 6px;border:1px solid transparent;border-radius:6px}#node:hover{border:1px solid #98a8d4;border-radius:6px}span.loc{font-size:.85em;color:#666;vertical-align:middle}span.tag{border:1px solid #aaa;border-radius:4px;padding:0 4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 6px;margin:4px 0}legend{color:silver}.muted{opacity:.3}.muted:hover{opacity:1}.debug{font-size:.85em;color:#9c3d3e}\n"] }]
60
+ args: [{ selector: 'pdb-browser-tree-node', template: "@if (node) {\n <div id=\"node\" [style.margin-left.px]=\"(node.y - 1) * 20\">\n <!-- pager -->\n @if ($any(node).expanded && paging && paging.pageCount > 1) {\n <div\n id=\"pager\"\n [style.display]=\"hidePaging ? 'inherit' : 'block'\"\n >\n <pdb-compact-pager\n [paging]=\"paging\"\n (pagingChange)=\"onPagingChange($any(node), $event)\"\n />\n <pdb-range-view\n [width]=\"250\"\n [domain]=\"[0, paging.pageCount]\"\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\n />\n </div>\n }\n <!-- node -->\n <div class=\"form-row\">\n <!-- expand/collapse button -->\n @if (node.y > 0) {\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\n [disabled]=\"node.hasChildren === false\"\n (click)=\"onToggleExpanded()\"\n >\n <mat-icon>{{\n node.hasChildren === true || node.hasChildren === undefined\n ? $any(node).expanded\n ? \"expand_less\"\n : \"expand_more\"\n : \"stop\"\n }}</mat-icon>\n </button>\n }\n <!-- tag -->\n @if (!hideLabel) {\n <span\n class=\"tag\"\n [ngStyle]=\"{\r\n 'background-color': (node.tag | stringToColor),\r\n color: node.tag | stringToColor | colorToContrast\r\n }\"\r\n >{{ node.tag }}</span\n >\n <!-- loc and label -->\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\n }\n <!-- PROJECTED NODE -->\n <ng-content></ng-content>\n <!-- debug -->\n @if (debug) {\n <span class=\"debug\"\n >#{{ node.id }}\n <span\n >| {{ $any(node).paging.pageNumber }}/{{\n $any(node).paging.pageCount\n }}\n ({{ $any(node).paging.total }})</span\n ></span\n >\n }\n <!-- filter -->\n @if (!$any(node).filter && node.y) {\n <div class=\"muted\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Add filter\"\n (click)=\"onEditFilter()\"\n >\n <mat-icon>filter_list</mat-icon>\n </button>\n </div>\n }\n @if ($any(node).filter && node.y) {\n <div class=\"muted\">\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\n >filter_alt</mat-icon\n >\n </button>\n </div>\n }\n </div>\n </div>\n }\n", styles: [".form-row{display:flex;gap:8px;align-items:center}.form-row *{flex:0 0 auto}.form-row span{flex:0 1 auto;white-space:normal}#node #pager{display:none}#node:hover #pager{display:block}#node{margin-bottom:4px;padding:4px 6px;border:1px solid transparent;border-radius:6px}#node:hover{border:1px solid #98a8d4;border-radius:6px}span.loc{font-size:.85em;color:#666;vertical-align:middle}span.tag{border:1px solid #aaa;border-radius:4px;padding:0 4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 6px;margin:4px 0}legend{color:silver}.muted{opacity:.3}.muted:hover{opacity:1}.debug{font-size:.85em;color:#9c3d3e}\n"] }]
61
61
  }], ctorParameters: () => [], propDecorators: { node: [{
62
62
  type: Input
63
63
  }], paging: [{
@@ -75,4 +75,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImpor
75
75
  }], editNodeFilterRequest: [{
76
76
  type: Output
77
77
  }] } });
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvYnJvd3Nlci10cmVlLW5vZGUvYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvYnJvd3Nlci10cmVlLW5vZGUvYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVN2RTs7Ozs7Ozs7R0FRRztBQU1ILE1BQU0sT0FBTyx3QkFBd0I7SUFHbkM7O09BRUc7SUFDSCxJQUNXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsSUFBSSxDQUFDLEtBQTRDO1FBQzFELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUU7WUFDeEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQStDRDtRQUNFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUNwRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFDL0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO0lBQ3RFLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUEyQixDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUF3QixFQUFFLE1BQWtCO1FBQ2hFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDMUIsSUFBSTtZQUNKLE1BQU07U0FDUCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sWUFBWTtRQUNqQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM3QztJQUNILENBQUM7OEdBdkZVLHdCQUF3QjtrR0FBeEIsd0JBQXdCLGdVQ3ZCckMsd21GQXFGQTs7MkZEOURhLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDRSx1QkFBdUI7d0RBV3RCLElBQUk7c0JBRGQsS0FBSztnQkFnQk4sTUFBTTtzQkFETCxLQUFLO2dCQU9DLEtBQUs7c0JBRFgsS0FBSztnQkFhQyxTQUFTO3NCQURmLEtBQUs7Z0JBT0MsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxxQkFBcUI7c0JBRDNCLE1BQU07Z0JBT0EsaUJBQWlCO3NCQUR2QixNQUFNO2dCQUlBLHFCQUFxQjtzQkFEM0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFBhZ2VkVHJlZU5vZGUsIFBhZ2luZ0luZm8gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wYWdlZC10cmVlLnN0b3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWdlQ2hhbmdlUmVxdWVzdCB7XG4gIG5vZGU6IFBhZ2VkVHJlZU5vZGU8YW55PjtcbiAgcGFnaW5nOiBQYWdpbmdJbmZvO1xufVxuXG4vKipcbiAqIEJyb3dzZXIgdHJlZSBub2RlIGNvbXBvbmVudCB2aWV3LiBUaGlzIHdyYXBzIHNvbWUgSFRNTCBjb250ZW50IHByb3ZpZGluZ1xuICogYSB0b2dnbGUgYnV0dG9uIHRvIGV4cGFuZC9jb2xsYXBzZSB0aGUgbm9kZSwgYSBwYWdpbmcgY29udHJvbCBmb3IgdGhlXG4gKiBub2RlJ3MgY2hpbGRyZW4sIGFuZCBhIGJ1dHRvbiB0byBlZGl0IHRoZSBub2RlJ3MgZmlsdGVyLiBZb3Ugc2hvdWxkIHRoZW5cbiAqIHByb3ZpZGUgdGhlIEhUTUwgY29udGVudCB0byBkaXNwbGF5IHRoZSBub2RlJ3MgZGF0YSBpbnNpZGUgdGhpcyBjb21wb25lbnQsIGUuZy5cbiAqIDxwZGItYnJvd3Nlci10cmVlLW5vZGUgW25vZGVdPVwibm9kZVwiPlxuICogICA8eW91ci1ub2RlLXZpZXcgW25vZGVdPVwibm9kZVwiIC8+XG4gKiA8cGRiLWJyb3dzZXItdHJlZS1ub2RlPlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwZGItYnJvd3Nlci10cmVlLW5vZGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9icm93c2VyLXRyZWUtbm9kZS5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEJyb3dzZXJUcmVlTm9kZUNvbXBvbmVudCB7XG4gIHByaXZhdGUgX25vZGU6IFBhZ2VkVHJlZU5vZGU8YW55PiB8IHVuZGVmaW5lZCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBub2RlIHRvIGRpc3BsYXkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IG5vZGUoKTogUGFnZWRUcmVlTm9kZTxhbnk+IHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX25vZGU7XG4gIH1cblxuICBwdWJsaWMgc2V0IG5vZGUodmFsdWU6IFBhZ2VkVHJlZU5vZGU8YW55PiB8IHVuZGVmaW5lZCB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5fbm9kZSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fbm9kZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYWdpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBub2RlJ3MgY2hpbGRyZW4uXG4gICAqL1xuICBASW5wdXQoKVxuICBwYWdpbmc/OiBQYWdpbmdJbmZvO1xuXG4gIC8qKlxuICAgKiBUcnVlIHRvIHNob3cgZGVidWcgaW5mb3JtYXRpb24uXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGVidWc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUcnVlIHRvIGhpZGUgdGhlIG5vZGUncyBsb2MgYW5kIGxhYmVsLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0b1xuICAgKiBwcm92aWRlIHlvdXIgb3duIHZpZXcgZm9yIHRoZSBub2RlLCBiZXR3ZWVuIHRoZSBleHBhbnNpb24gdG9nZ2xlIGFuZFxuICAgKiB0aGUgZmlsdGVyIGVkaXQgYnV0dG9uLiBJbiB0aGlzIGNhc2UsIGluIHlvdXIgY29uc3VtZXIgdGVtcGxhdGUgcHJvdmlkZVxuICAgKiB5b3VyIG93biB2aWV3IGFzIHRoZSBjb250ZW50IG9mIHRoaXMgY29tcG9uZW50LiBJZiBpbnN0ZWFkIHlvdSBhcmUgZmluZVxuICAgKiB3aXRoIHRoZSBkZWZhdWx0IGxvYyBhbmQgbGFiZWwsIGFuZCBqdXN0IHdhbnQgdG8gYWRkIG1vcmUgZGF0YSB0b1xuICAgKiB0aGUgdmlldywgdGhlbiB5b3UgY2FuIGp1c3QgYWRkIHlvdXIgb3duIGNvbnRlbnQgdG8gdGhpcyBjb21wb25lbnQnc1xuICAgKiB0ZW1wbGF0ZSwgd2l0aG91dCBzZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoaWRlTGFiZWw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUcnVlIHRvIGhpZGUgdGhlIG5vZGUncyBwYWdpbmcgY29udHJvbCB1bmxlc3MgaG92ZXJlZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoaWRlUGFnaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgdXNlciB3YW50cyB0byB0b2dnbGUgdGhlIGV4cGFuZGVkIHN0YXRlIG9mIHRoZSBub2RlLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyB0b2dnbGVFeHBhbmRlZFJlcXVlc3Q6IEV2ZW50RW1pdHRlcjxQYWdlZFRyZWVOb2RlPGFueT4+O1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSB1c2VyIHdhbnRzIHRvIGNoYW5nZSB0aGUgcGFnZSBudW1iZXIgb2YgdGhlIG5vZGUncyBjaGlsZHJlbi5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgY2hhbmdlUGFnZVJlcXVlc3Q6IEV2ZW50RW1pdHRlcjxQYWdlQ2hhbmdlUmVxdWVzdD47XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBlZGl0Tm9kZUZpbHRlclJlcXVlc3Q6IEV2ZW50RW1pdHRlcjxQYWdlZFRyZWVOb2RlPGFueT4+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudG9nZ2xlRXhwYW5kZWRSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlZFRyZWVOb2RlPGFueT4+KCk7XG4gICAgdGhpcy5jaGFuZ2VQYWdlUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnZUNoYW5nZVJlcXVlc3Q+KCk7XG4gICAgdGhpcy5lZGl0Tm9kZUZpbHRlclJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VkVHJlZU5vZGU8YW55Pj4oKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRvZ2dsZUV4cGFuZGVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkUmVxdWVzdC5lbWl0KHRoaXMuX25vZGUgYXMgUGFnZWRUcmVlTm9kZTxhbnk+KTtcbiAgfVxuXG4gIHB1YmxpYyBvblBhZ2luZ0NoYW5nZShub2RlOiBQYWdlZFRyZWVOb2RlPGFueT4sIHBhZ2luZzogUGFnaW5nSW5mbyk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlUGFnZVJlcXVlc3QuZW1pdCh7XG4gICAgICBub2RlLFxuICAgICAgcGFnaW5nLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uRWRpdEZpbHRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbm9kZSkge1xuICAgICAgdGhpcy5lZGl0Tm9kZUZpbHRlclJlcXVlc3QuZW1pdCh0aGlzLl9ub2RlKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgaWQ9XCJub2RlXCIgKm5nSWY9XCJub2RlXCIgW3N0eWxlLm1hcmdpbi1sZWZ0LnB4XT1cIihub2RlLnkgLSAxKSAqIDIwXCI+XHJcbiAgPCEtLSBwYWdlciAtLT5cclxuICA8ZGl2XHJcbiAgICAqbmdJZj1cIiRhbnkobm9kZSkuZXhwYW5kZWQgJiYgcGFnaW5nICYmIHBhZ2luZy5wYWdlQ291bnQgPiAxXCJcclxuICAgIGlkPVwicGFnZXJcIlxyXG4gICAgW3N0eWxlLmRpc3BsYXldPVwiaGlkZVBhZ2luZyA/ICdpbmhlcml0JyA6ICdibG9jaydcIlxyXG4gID5cclxuICAgIDxwZGItY29tcGFjdC1wYWdlclxyXG4gICAgICBbcGFnaW5nXT1cInBhZ2luZ1wiXHJcbiAgICAgIChwYWdpbmdDaGFuZ2UpPVwib25QYWdpbmdDaGFuZ2UoJGFueShub2RlKSwgJGV2ZW50KVwiXHJcbiAgICAvPlxyXG4gICAgPHBkYi1yYW5nZS12aWV3XHJcbiAgICAgIFt3aWR0aF09XCIyNTBcIlxyXG4gICAgICBbZG9tYWluXT1cIlswLCBwYWdpbmcucGFnZUNvdW50XVwiXHJcbiAgICAgIFtyYW5nZV09XCJbcGFnaW5nLnBhZ2VOdW1iZXIgLSAxLCBwYWdpbmcucGFnZU51bWJlcl1cIlxyXG4gICAgLz5cclxuICA8L2Rpdj5cclxuICA8IS0tIG5vZGUgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICA8IS0tIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gLS0+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgICpuZ0lmPVwibm9kZS55ID4gMFwiXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgW21hdFRvb2x0aXBdPVwiJGFueShub2RlKS5leHBhbmRlZCA/ICdDb2xsYXBzZScgOiAnRXhwYW5kJ1wiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJub2RlLmhhc0NoaWxkcmVuID09PSBmYWxzZVwiXHJcbiAgICAgIChjbGljayk9XCJvblRvZ2dsZUV4cGFuZGVkKClcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb24+e3tcclxuICAgICAgICBub2RlLmhhc0NoaWxkcmVuID09PSB0cnVlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgPyAkYW55KG5vZGUpLmV4cGFuZGVkXHJcbiAgICAgICAgICAgID8gXCJleHBhbmRfbGVzc1wiXHJcbiAgICAgICAgICAgIDogXCJleHBhbmRfbW9yZVwiXHJcbiAgICAgICAgICA6IFwic3RvcFwiXHJcbiAgICAgIH19PC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPCEtLSB0YWcgLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWhpZGVMYWJlbFwiPlxyXG4gICAgICA8c3BhblxyXG4gICAgICAgIGNsYXNzPVwidGFnXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IChub2RlLnRhZyB8IHN0cmluZ1RvQ29sb3IpLFxyXG4gICAgICAgICAgY29sb3I6IG5vZGUudGFnIHwgc3RyaW5nVG9Db2xvciB8IGNvbG9yVG9Db250cmFzdFxyXG4gICAgICAgIH1cIlxyXG4gICAgICAgID57eyBub2RlLnRhZyB9fTwvc3BhblxyXG4gICAgICA+XHJcbiAgICAgIDwhLS0gbG9jIGFuZCBsYWJlbCAtLT5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJsb2NcIj57eyBub2RlLnkgfX0ue3sgbm9kZS54IH19PC9zcGFuPiAtIHt7IG5vZGUubGFiZWwgfX1cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwhLS0gUFJPSkVDVEVEIE5PREUgLS0+XHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcblxyXG4gICAgPCEtLSBkZWJ1ZyAtLT5cclxuICAgIDxzcGFuICpuZ0lmPVwiZGVidWdcIiBjbGFzcz1cImRlYnVnXCJcclxuICAgICAgPiN7eyBub2RlLmlkIH19XHJcbiAgICAgIDxzcGFuXHJcbiAgICAgICAgPnwge3sgJGFueShub2RlKS5wYWdpbmcucGFnZU51bWJlciB9fS97e1xyXG4gICAgICAgICAgJGFueShub2RlKS5wYWdpbmcucGFnZUNvdW50XHJcbiAgICAgICAgfX1cclxuICAgICAgICAoe3sgJGFueShub2RlKS5wYWdpbmcudG90YWwgfX0pPC9zcGFuXHJcbiAgICAgID48L3NwYW5cclxuICAgID5cclxuXHJcbiAgICA8IS0tIGZpbHRlciAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJtdXRlZFwiICpuZ0lmPVwiISRhbnkobm9kZSkuZmlsdGVyICYmIG5vZGUueVwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgbWF0VG9vbHRpcD1cIkFkZCBmaWx0ZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJvbkVkaXRGaWx0ZXIoKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWljb24+ZmlsdGVyX2xpc3Q8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm11dGVkXCIgKm5nSWY9XCIkYW55KG5vZGUpLmZpbHRlciAmJiBub2RlLnlcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJvbkVkaXRGaWx0ZXIoKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbiBbbWF0QmFkZ2VdPVwiJGFueShub2RlKS5maWx0ZXIgPyAnRicgOiAnJ1wiXHJcbiAgICAgICAgICA+ZmlsdGVyX2FsdDwvbWF0LWljb25cclxuICAgICAgICA+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvYnJvd3Nlci10cmVlLW5vZGUvYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvYnJvd3Nlci10cmVlLW5vZGUvYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVN2RTs7Ozs7Ozs7R0FRRztBQU1ILE1BQU0sT0FBTyx3QkFBd0I7SUFHbkM7O09BRUc7SUFDSCxJQUNXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsSUFBSSxDQUFDLEtBQTRDO1FBQzFELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN6QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUErQ0Q7UUFDRSxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFDcEUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBQy9ELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztJQUN0RSxDQUFDO0lBRU0sZ0JBQWdCO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUEyQixDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUF3QixFQUFFLE1BQWtCO1FBQ2hFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDMUIsSUFBSTtZQUNKLE1BQU07U0FDUCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sWUFBWTtRQUNqQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLENBQUM7SUFDSCxDQUFDOzhHQXZGVSx3QkFBd0I7a0dBQXhCLHdCQUF3QixnVUN2QnJDLHF0R0E0RkE7OzJGRHJFYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsdUJBQXVCO3dEQVd0QixJQUFJO3NCQURkLEtBQUs7Z0JBZ0JOLE1BQU07c0JBREwsS0FBSztnQkFPQyxLQUFLO3NCQURYLEtBQUs7Z0JBYUMsU0FBUztzQkFEZixLQUFLO2dCQU9DLFVBQVU7c0JBRGhCLEtBQUs7Z0JBT0MscUJBQXFCO3NCQUQzQixNQUFNO2dCQU9BLGlCQUFpQjtzQkFEdkIsTUFBTTtnQkFJQSxxQkFBcUI7c0JBRDNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBQYWdlZFRyZWVOb2RlLCBQYWdpbmdJbmZvIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGFnZWQtdHJlZS5zdG9yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUNoYW5nZVJlcXVlc3Qge1xuICBub2RlOiBQYWdlZFRyZWVOb2RlPGFueT47XG4gIHBhZ2luZzogUGFnaW5nSW5mbztcbn1cblxuLyoqXG4gKiBCcm93c2VyIHRyZWUgbm9kZSBjb21wb25lbnQgdmlldy4gVGhpcyB3cmFwcyBzb21lIEhUTUwgY29udGVudCBwcm92aWRpbmdcbiAqIGEgdG9nZ2xlIGJ1dHRvbiB0byBleHBhbmQvY29sbGFwc2UgdGhlIG5vZGUsIGEgcGFnaW5nIGNvbnRyb2wgZm9yIHRoZVxuICogbm9kZSdzIGNoaWxkcmVuLCBhbmQgYSBidXR0b24gdG8gZWRpdCB0aGUgbm9kZSdzIGZpbHRlci4gWW91IHNob3VsZCB0aGVuXG4gKiBwcm92aWRlIHRoZSBIVE1MIGNvbnRlbnQgdG8gZGlzcGxheSB0aGUgbm9kZSdzIGRhdGEgaW5zaWRlIHRoaXMgY29tcG9uZW50LCBlLmcuXG4gKiA8cGRiLWJyb3dzZXItdHJlZS1ub2RlIFtub2RlXT1cIm5vZGVcIj5cbiAqICAgPHlvdXItbm9kZS12aWV3IFtub2RlXT1cIm5vZGVcIiAvPlxuICogPHBkYi1icm93c2VyLXRyZWUtbm9kZT5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRiLWJyb3dzZXItdHJlZS1ub2RlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jyb3dzZXItdHJlZS1ub2RlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBCcm93c2VyVHJlZU5vZGVDb21wb25lbnQge1xuICBwcml2YXRlIF9ub2RlOiBQYWdlZFRyZWVOb2RlPGFueT4gfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbm9kZSB0byBkaXNwbGF5LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBub2RlKCk6IFBhZ2VkVHJlZU5vZGU8YW55PiB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9ub2RlO1xuICB9XG5cbiAgcHVibGljIHNldCBub2RlKHZhbHVlOiBQYWdlZFRyZWVOb2RlPGFueT4gfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gICAgaWYgKHRoaXMuX25vZGUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX25vZGUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGFnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZSdzIGNoaWxkcmVuLlxuICAgKi9cbiAgQElucHV0KClcbiAgcGFnaW5nPzogUGFnaW5nSW5mbztcblxuICAvKipcbiAgICogVHJ1ZSB0byBzaG93IGRlYnVnIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGRlYnVnPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVHJ1ZSB0byBoaWRlIHRoZSBub2RlJ3MgbG9jIGFuZCBsYWJlbC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG9cbiAgICogcHJvdmlkZSB5b3VyIG93biB2aWV3IGZvciB0aGUgbm9kZSwgYmV0d2VlbiB0aGUgZXhwYW5zaW9uIHRvZ2dsZSBhbmRcbiAgICogdGhlIGZpbHRlciBlZGl0IGJ1dHRvbi4gSW4gdGhpcyBjYXNlLCBpbiB5b3VyIGNvbnN1bWVyIHRlbXBsYXRlIHByb3ZpZGVcbiAgICogeW91ciBvd24gdmlldyBhcyB0aGUgY29udGVudCBvZiB0aGlzIGNvbXBvbmVudC4gSWYgaW5zdGVhZCB5b3UgYXJlIGZpbmVcbiAgICogd2l0aCB0aGUgZGVmYXVsdCBsb2MgYW5kIGxhYmVsLCBhbmQganVzdCB3YW50IHRvIGFkZCBtb3JlIGRhdGEgdG9cbiAgICogdGhlIHZpZXcsIHRoZW4geW91IGNhbiBqdXN0IGFkZCB5b3VyIG93biBjb250ZW50IHRvIHRoaXMgY29tcG9uZW50J3NcbiAgICogdGVtcGxhdGUsIHdpdGhvdXQgc2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIHRydWUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGlkZUxhYmVsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVHJ1ZSB0byBoaWRlIHRoZSBub2RlJ3MgcGFnaW5nIGNvbnRyb2wgdW5sZXNzIGhvdmVyZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGlkZVBhZ2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gdGhlIHVzZXIgd2FudHMgdG8gdG9nZ2xlIHRoZSBleHBhbmRlZCBzdGF0ZSBvZiB0aGUgbm9kZS5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgdG9nZ2xlRXhwYW5kZWRSZXF1ZXN0OiBFdmVudEVtaXR0ZXI8UGFnZWRUcmVlTm9kZTxhbnk+PjtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgdXNlciB3YW50cyB0byBjaGFuZ2UgdGhlIHBhZ2UgbnVtYmVyIG9mIHRoZSBub2RlJ3MgY2hpbGRyZW4uXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGNoYW5nZVBhZ2VSZXF1ZXN0OiBFdmVudEVtaXR0ZXI8UGFnZUNoYW5nZVJlcXVlc3Q+O1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZWRpdE5vZGVGaWx0ZXJSZXF1ZXN0OiBFdmVudEVtaXR0ZXI8UGFnZWRUcmVlTm9kZTxhbnk+PjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnZWRUcmVlTm9kZTxhbnk+PigpO1xuICAgIHRoaXMuY2hhbmdlUGFnZVJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VDaGFuZ2VSZXF1ZXN0PigpO1xuICAgIHRoaXMuZWRpdE5vZGVGaWx0ZXJSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlZFRyZWVOb2RlPGFueT4+KCk7XG4gIH1cblxuICBwdWJsaWMgb25Ub2dnbGVFeHBhbmRlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX25vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZFJlcXVlc3QuZW1pdCh0aGlzLl9ub2RlIGFzIFBhZ2VkVHJlZU5vZGU8YW55Pik7XG4gIH1cblxuICBwdWJsaWMgb25QYWdpbmdDaGFuZ2Uobm9kZTogUGFnZWRUcmVlTm9kZTxhbnk+LCBwYWdpbmc6IFBhZ2luZ0luZm8pOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZVBhZ2VSZXF1ZXN0LmVtaXQoe1xuICAgICAgbm9kZSxcbiAgICAgIHBhZ2luZyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkVkaXRGaWx0ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX25vZGUpIHtcbiAgICAgIHRoaXMuZWRpdE5vZGVGaWx0ZXJSZXF1ZXN0LmVtaXQodGhpcy5fbm9kZSk7XG4gICAgfVxuICB9XG59XG4iLCJAaWYgKG5vZGUpIHtcbiAgPGRpdiBpZD1cIm5vZGVcIiBbc3R5bGUubWFyZ2luLWxlZnQucHhdPVwiKG5vZGUueSAtIDEpICogMjBcIj5cbiAgICA8IS0tIHBhZ2VyIC0tPlxuICAgIEBpZiAoJGFueShub2RlKS5leHBhbmRlZCAmJiBwYWdpbmcgJiYgcGFnaW5nLnBhZ2VDb3VudCA+IDEpIHtcbiAgICAgIDxkaXZcbiAgICAgICAgaWQ9XCJwYWdlclwiXG4gICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cImhpZGVQYWdpbmcgPyAnaW5oZXJpdCcgOiAnYmxvY2snXCJcbiAgICAgICAgPlxuICAgICAgICA8cGRiLWNvbXBhY3QtcGFnZXJcbiAgICAgICAgICBbcGFnaW5nXT1cInBhZ2luZ1wiXG4gICAgICAgICAgKHBhZ2luZ0NoYW5nZSk9XCJvblBhZ2luZ0NoYW5nZSgkYW55KG5vZGUpLCAkZXZlbnQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxwZGItcmFuZ2Utdmlld1xuICAgICAgICAgICAgW3dpZHRoXT1cIjI1MFwiXG4gICAgICAgICAgICBbZG9tYWluXT1cIlswLCBwYWdpbmcucGFnZUNvdW50XVwiXG4gICAgICAgICAgICBbcmFuZ2VdPVwiW3BhZ2luZy5wYWdlTnVtYmVyIC0gMSwgcGFnaW5nLnBhZ2VOdW1iZXJdXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPCEtLSBub2RlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICAgICAgICA8IS0tIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gLS0+XG4gICAgICAgICAgQGlmIChub2RlLnkgPiAwKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJGFueShub2RlKS5leHBhbmRlZCA/ICdDb2xsYXBzZScgOiAnRXhwYW5kJ1wiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJub2RlLmhhc0NoaWxkcmVuID09PSBmYWxzZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblRvZ2dsZUV4cGFuZGVkKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj57e1xuICAgICAgICAgICAgICAgIG5vZGUuaGFzQ2hpbGRyZW4gPT09IHRydWUgfHwgbm9kZS5oYXNDaGlsZHJlbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyAkYW55KG5vZGUpLmV4cGFuZGVkXG4gICAgICAgICAgICAgICAgPyBcImV4cGFuZF9sZXNzXCJcbiAgICAgICAgICAgICAgICA6IFwiZXhwYW5kX21vcmVcIlxuICAgICAgICAgICAgICAgIDogXCJzdG9wXCJcbiAgICAgICAgICAgICAgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICAgIDwhLS0gdGFnIC0tPlxuICAgICAgICAgIEBpZiAoIWhpZGVMYWJlbCkge1xuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJ0YWdcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IChub2RlLnRhZyB8IHN0cmluZ1RvQ29sb3IpLFxyXG4gICAgICAgICAgY29sb3I6IG5vZGUudGFnIHwgc3RyaW5nVG9Db2xvciB8IGNvbG9yVG9Db250cmFzdFxyXG4gICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgID57eyBub2RlLnRhZyB9fTwvc3BhblxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwhLS0gbG9jIGFuZCBsYWJlbCAtLT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2NcIj57eyBub2RlLnkgfX0ue3sgbm9kZS54IH19PC9zcGFuPiAtIHt7IG5vZGUubGFiZWwgfX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0gUFJPSkVDVEVEIE5PREUgLS0+XG4gICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8IS0tIGRlYnVnIC0tPlxuICAgICAgICAgICAgQGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRlYnVnXCJcbiAgICAgICAgICAgICAgICA+I3t7IG5vZGUuaWQgfX1cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgPnwge3sgJGFueShub2RlKS5wYWdpbmcucGFnZU51bWJlciB9fS97e1xuICAgICAgICAgICAgICAgICAgJGFueShub2RlKS5wYWdpbmcucGFnZUNvdW50XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgKHt7ICRhbnkobm9kZSkucGFnaW5nLnRvdGFsIH19KTwvc3BhblxuICAgICAgICAgICAgICAgICAgPjwvc3BhblxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8IS0tIGZpbHRlciAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKCEkYW55KG5vZGUpLmZpbHRlciAmJiBub2RlLnkpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFkZCBmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXRGaWx0ZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5maWx0ZXJfbGlzdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoJGFueShub2RlKS5maWx0ZXIgJiYgbm9kZS55KSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJvbkVkaXRGaWx0ZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbbWF0QmFkZ2VdPVwiJGFueShub2RlKS5maWx0ZXIgPyAnRicgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+ZmlsdGVyX2FsdDwvbWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuIl19
@@ -1,8 +1,7 @@
1
1
  import { Component, EventEmitter, Input, Output } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- import * as i2 from "@angular/material/button";
5
- import * as i3 from "@angular/material/icon";
3
+ import * as i1 from "@angular/material/button";
4
+ import * as i2 from "@angular/material/icon";
6
5
  export class CompactPagerComponent {
7
6
  constructor() {
8
7
  this.paging = {
@@ -34,15 +33,15 @@ export class CompactPagerComponent {
34
33
  this.pagingChange.emit(this.paging);
35
34
  }
36
35
  }
37
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: CompactPagerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
38
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.1", type: CompactPagerComponent, selector: "pdb-compact-pager", inputs: { paging: "paging" }, outputs: { pagingChange: "pagingChange" }, ngImport: i0, template: "<div class=\"form-row\" *ngIf=\"paging.pageCount\">\n <span id=\"pages\">{{ paging.pageNumber }}/{{ paging.pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging.total }} </span>\n</div>\n", styles: ["#pages,#total{color:silver}.form-row{display:flex;gap:2px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
36
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: CompactPagerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
37
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: CompactPagerComponent, selector: "pdb-compact-pager", inputs: { paging: "paging" }, outputs: { pagingChange: "pagingChange" }, ngImport: i0, template: "@if (paging.pageCount) {\n <div class=\"form-row\">\n <span id=\"pages\">{{ paging.pageNumber }}/{{ paging.pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging.total }} </span>\n </div>\n}\n", styles: ["#pages,#total{color:silver}.form-row{display:flex;gap:2px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
39
38
  }
40
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: CompactPagerComponent, decorators: [{
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: CompactPagerComponent, decorators: [{
41
40
  type: Component,
42
- args: [{ selector: 'pdb-compact-pager', template: "<div class=\"form-row\" *ngIf=\"paging.pageCount\">\n <span id=\"pages\">{{ paging.pageNumber }}/{{ paging.pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging.total }} </span>\n</div>\n", styles: ["#pages,#total{color:silver}.form-row{display:flex;gap:2px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
41
+ args: [{ selector: 'pdb-compact-pager', template: "@if (paging.pageCount) {\n <div class=\"form-row\">\n <span id=\"pages\">{{ paging.pageNumber }}/{{ paging.pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging.total }} </span>\n </div>\n}\n", styles: ["#pages,#total{color:silver}.form-row{display:flex;gap:2px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
43
42
  }], ctorParameters: () => [], propDecorators: { paging: [{
44
43
  type: Input
45
44
  }], pagingChange: [{
46
45
  type: Output
47
46
  }] } });
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGFjdC1wYWdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9wYWdlZC1kYXRhLWJyb3dzZXJzL3NyYy9saWIvY29tcG9uZW50cy9jb21wYWN0LXBhZ2VyL2NvbXBhY3QtcGFnZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvY29tcGFjdC1wYWdlci9jb21wYWN0LXBhZ2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBU3ZFLE1BQU0sT0FBTyxxQkFBcUI7SUFPaEM7UUFDRSxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osVUFBVSxFQUFFLENBQUM7WUFDYixTQUFTLEVBQUUsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDO1NBQ1QsQ0FBQztRQUNGLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztJQUNyRCxDQUFDO0lBRU0sT0FBTztRQUNaLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2hELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sVUFBVTtRQUNmLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNyQztJQUNILENBQUM7SUFFTSxNQUFNO1FBQ1gsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNsRCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6RSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBRU0sTUFBTTtRQUNYLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDbEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDOzhHQXhDVSxxQkFBcUI7a0dBQXJCLHFCQUFxQixrSUNUbEMsMDZCQW9DQTs7MkZEM0JhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUI7d0RBTXRCLE1BQU07c0JBRFosS0FBSztnQkFJQyxZQUFZO3NCQURsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUGFnaW5nSW5mbyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3BhZ2VkLXRyZWUuc3RvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwZGItY29tcGFjdC1wYWdlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wYWN0LXBhZ2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tcGFjdC1wYWdlci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wYWN0UGFnZXJDb21wb25lbnQge1xuICBASW5wdXQoKVxuICBwdWJsaWMgcGFnaW5nOiBQYWdpbmdJbmZvO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcGFnaW5nQ2hhbmdlOiBFdmVudEVtaXR0ZXI8UGFnaW5nSW5mbz47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wYWdpbmcgPSB7XG4gICAgICBwYWdlTnVtYmVyOiAwLFxuICAgICAgcGFnZUNvdW50OiAwLFxuICAgICAgdG90YWw6IDAsXG4gICAgfTtcbiAgICB0aGlzLnBhZ2luZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnaW5nSW5mbz4oKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkZpcnN0KCk6IHZvaWQge1xuICAgIHRoaXMucGFnaW5nID0geyAuLi50aGlzLnBhZ2luZywgcGFnZU51bWJlcjogMSB9O1xuICAgIHRoaXMucGFnaW5nQ2hhbmdlLmVtaXQodGhpcy5wYWdpbmcpO1xuICB9XG5cbiAgcHVibGljIG9uUHJldmlvdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFnaW5nLnBhZ2VOdW1iZXIgPiAxKSB7XG4gICAgICB0aGlzLnBhZ2luZyA9IHsgLi4udGhpcy5wYWdpbmcsIHBhZ2VOdW1iZXI6IHRoaXMucGFnaW5nLnBhZ2VOdW1iZXIgLSAxIH07XG4gICAgICB0aGlzLnBhZ2luZ0NoYW5nZS5lbWl0KHRoaXMucGFnaW5nKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25OZXh0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhZ2luZy5wYWdlTnVtYmVyIDwgdGhpcy5wYWdpbmcucGFnZUNvdW50KSB7XG4gICAgICB0aGlzLnBhZ2luZyA9IHsgLi4udGhpcy5wYWdpbmcsIHBhZ2VOdW1iZXI6IHRoaXMucGFnaW5nLnBhZ2VOdW1iZXIgKyAxIH07XG4gICAgICB0aGlzLnBhZ2luZ0NoYW5nZS5lbWl0KHRoaXMucGFnaW5nKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25MYXN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhZ2luZy5wYWdlTnVtYmVyIDwgdGhpcy5wYWdpbmcucGFnZUNvdW50KSB7XG4gICAgICB0aGlzLnBhZ2luZyA9IHsgLi4udGhpcy5wYWdpbmcsIHBhZ2VOdW1iZXI6IHRoaXMucGFnaW5nLnBhZ2VDb3VudCB9O1xuICAgICAgdGhpcy5wYWdpbmdDaGFuZ2UuZW1pdCh0aGlzLnBhZ2luZyk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIiAqbmdJZj1cInBhZ2luZy5wYWdlQ291bnRcIj5cbiAgPHNwYW4gaWQ9XCJwYWdlc1wiPnt7IHBhZ2luZy5wYWdlTnVtYmVyIH19L3t7IHBhZ2luZy5wYWdlQ291bnQgfX08L3NwYW4+XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBtYXQtaWNvbi1idXR0b25cbiAgICAoY2xpY2spPVwib25GaXJzdCgpXCJcbiAgICBbZGlzYWJsZWRdPVwicGFnaW5nLnBhZ2VOdW1iZXIgPCAyXCJcbiAgPlxuICAgIDxtYXQtaWNvbj5maXJzdF9wYWdlPC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBtYXQtaWNvbi1idXR0b25cbiAgICAoY2xpY2spPVwib25QcmV2aW91cygpXCJcbiAgICBbZGlzYWJsZWRdPVwicGFnaW5nLnBhZ2VOdW1iZXIgPCAyXCJcbiAgPlxuICAgIDxtYXQtaWNvbj5uYXZpZ2F0ZV9iZWZvcmU8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cbiAgPGJ1dHRvblxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIG1hdC1pY29uLWJ1dHRvblxuICAgIChjbGljayk9XCJvbk5leHQoKVwiXG4gICAgW2Rpc2FibGVkXT1cInBhZ2luZy5wYWdlTnVtYmVyID09PSBwYWdpbmcucGFnZUNvdW50XCJcbiAgPlxuICAgIDxtYXQtaWNvbj5uYXZpZ2F0ZV9uZXh0PC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBtYXQtaWNvbi1idXR0b25cbiAgICAoY2xpY2spPVwib25MYXN0KClcIlxuICAgIFtkaXNhYmxlZF09XCJwYWdpbmcucGFnZU51bWJlciA9PT0gcGFnaW5nLnBhZ2VDb3VudFwiXG4gID5cbiAgICA8bWF0LWljb24+bGFzdF9wYWdlPC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG4gIDxzcGFuIGlkPVwidG90YWxcIj57eyBwYWdpbmcudG90YWwgfX0gPC9zcGFuPlxuPC9kaXY+XG4iXX0=
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGFjdC1wYWdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9wYWdlZC1kYXRhLWJyb3dzZXJzL3NyYy9saWIvY29tcG9uZW50cy9jb21wYWN0LXBhZ2VyL2NvbXBhY3QtcGFnZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvY29tcGFjdC1wYWdlci9jb21wYWN0LXBhZ2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFTdkUsTUFBTSxPQUFPLHFCQUFxQjtJQU9oQztRQUNFLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixVQUFVLEVBQUUsQ0FBQztZQUNiLFNBQVMsRUFBRSxDQUFDO1lBQ1osS0FBSyxFQUFFLENBQUM7U0FDVCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO0lBQ3JELENBQUM7SUFFTSxPQUFPO1FBQ1osSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTSxVQUFVO1FBQ2YsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6RSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFTSxNQUFNO1FBQ1gsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUVNLE1BQU07UUFDWCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7OEdBeENVLHFCQUFxQjtrR0FBckIscUJBQXFCLGtJQ1RsQyw0L0JBc0NBOzsyRkQ3QmEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG1CQUFtQjt3REFNdEIsTUFBTTtzQkFEWixLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBQYWdpbmdJbmZvIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGFnZWQtdHJlZS5zdG9yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BkYi1jb21wYWN0LXBhZ2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBhY3QtcGFnZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wYWN0LXBhZ2VyLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBhY3RQYWdlckNvbXBvbmVudCB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwYWdpbmc6IFBhZ2luZ0luZm87XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBwYWdpbmdDaGFuZ2U6IEV2ZW50RW1pdHRlcjxQYWdpbmdJbmZvPjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnBhZ2luZyA9IHtcbiAgICAgIHBhZ2VOdW1iZXI6IDAsXG4gICAgICBwYWdlQ291bnQ6IDAsXG4gICAgICB0b3RhbDogMCxcbiAgICB9O1xuICAgIHRoaXMucGFnaW5nQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdpbmdJbmZvPigpO1xuICB9XG5cbiAgcHVibGljIG9uRmlyc3QoKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmcgPSB7IC4uLnRoaXMucGFnaW5nLCBwYWdlTnVtYmVyOiAxIH07XG4gICAgdGhpcy5wYWdpbmdDaGFuZ2UuZW1pdCh0aGlzLnBhZ2luZyk7XG4gIH1cblxuICBwdWJsaWMgb25QcmV2aW91cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYWdpbmcucGFnZU51bWJlciA+IDEpIHtcbiAgICAgIHRoaXMucGFnaW5nID0geyAuLi50aGlzLnBhZ2luZywgcGFnZU51bWJlcjogdGhpcy5wYWdpbmcucGFnZU51bWJlciAtIDEgfTtcbiAgICAgIHRoaXMucGFnaW5nQ2hhbmdlLmVtaXQodGhpcy5wYWdpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbk5leHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFnaW5nLnBhZ2VOdW1iZXIgPCB0aGlzLnBhZ2luZy5wYWdlQ291bnQpIHtcbiAgICAgIHRoaXMucGFnaW5nID0geyAuLi50aGlzLnBhZ2luZywgcGFnZU51bWJlcjogdGhpcy5wYWdpbmcucGFnZU51bWJlciArIDEgfTtcbiAgICAgIHRoaXMucGFnaW5nQ2hhbmdlLmVtaXQodGhpcy5wYWdpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkxhc3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFnaW5nLnBhZ2VOdW1iZXIgPCB0aGlzLnBhZ2luZy5wYWdlQ291bnQpIHtcbiAgICAgIHRoaXMucGFnaW5nID0geyAuLi50aGlzLnBhZ2luZywgcGFnZU51bWJlcjogdGhpcy5wYWdpbmcucGFnZUNvdW50IH07XG4gICAgICB0aGlzLnBhZ2luZ0NoYW5nZS5lbWl0KHRoaXMucGFnaW5nKTtcbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAocGFnaW5nLnBhZ2VDb3VudCkge1xuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICA8c3BhbiBpZD1cInBhZ2VzXCI+e3sgcGFnaW5nLnBhZ2VOdW1iZXIgfX0ve3sgcGFnaW5nLnBhZ2VDb3VudCB9fTwvc3Bhbj5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgKGNsaWNrKT1cIm9uRmlyc3QoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwicGFnaW5nLnBhZ2VOdW1iZXIgPCAyXCJcbiAgICAgID5cbiAgICAgIDxtYXQtaWNvbj5maXJzdF9wYWdlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgKGNsaWNrKT1cIm9uUHJldmlvdXMoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwicGFnaW5nLnBhZ2VOdW1iZXIgPCAyXCJcbiAgICAgID5cbiAgICAgIDxtYXQtaWNvbj5uYXZpZ2F0ZV9iZWZvcmU8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAoY2xpY2spPVwib25OZXh0KClcIlxuICAgICAgW2Rpc2FibGVkXT1cInBhZ2luZy5wYWdlTnVtYmVyID09PSBwYWdpbmcucGFnZUNvdW50XCJcbiAgICAgID5cbiAgICAgIDxtYXQtaWNvbj5uYXZpZ2F0ZV9uZXh0PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgKGNsaWNrKT1cIm9uTGFzdCgpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJwYWdpbmcucGFnZU51bWJlciA9PT0gcGFnaW5nLnBhZ2VDb3VudFwiXG4gICAgICA+XG4gICAgICA8bWF0LWljb24+bGFzdF9wYWdlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8c3BhbiBpZD1cInRvdGFsXCI+e3sgcGFnaW5nLnRvdGFsIH19IDwvc3Bhbj5cbiAgPC9kaXY+XG59XG4iXX0=
@@ -17,10 +17,10 @@ export class RangeViewComponent {
17
17
  ((rangeStart + rangeWidth) / domainWidth) * this.width,
18
18
  ];
19
19
  }
20
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: RangeViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
21
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.1", type: RangeViewComponent, selector: "pdb-range-view", inputs: { domain: "domain", range: "range", width: "width", height: "height" }, usesOnChanges: true, ngImport: i0, template: "<svg [attr.width]=\"width\" [attr.height]=\"height\">\n <rect id=\"rdomain\" [attr.width]=\"width\" [attr.height]=\"height\" />\n <rect\n id=\"rrange\"\n [attr.x]=\"scaledRange[0]\"\n [attr.y]=\"0\"\n [attr.width]=\"scaledRange[1] - scaledRange[0]\"\n [attr.height]=\"height\"\n />\n</svg>\n", styles: ["#rdomain{fill:#d3d3d3;stroke-width:3;stroke:#c1ba9b}#rrange{fill:#91aad3;stroke-width:3}\n"] }); }
20
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: RangeViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
21
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.0", type: RangeViewComponent, selector: "pdb-range-view", inputs: { domain: "domain", range: "range", width: "width", height: "height" }, usesOnChanges: true, ngImport: i0, template: "<svg [attr.width]=\"width\" [attr.height]=\"height\">\n <rect id=\"rdomain\" [attr.width]=\"width\" [attr.height]=\"height\" />\n <rect\n id=\"rrange\"\n [attr.x]=\"scaledRange[0]\"\n [attr.y]=\"0\"\n [attr.width]=\"scaledRange[1] - scaledRange[0]\"\n [attr.height]=\"height\"\n />\n</svg>\n", styles: ["#rdomain{fill:#d3d3d3;stroke-width:3;stroke:#c1ba9b}#rrange{fill:#91aad3;stroke-width:3}\n"] }); }
22
22
  }
23
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: RangeViewComponent, decorators: [{
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: RangeViewComponent, decorators: [{
24
24
  type: Component,
25
25
  args: [{ selector: 'pdb-range-view', template: "<svg [attr.width]=\"width\" [attr.height]=\"height\">\n <rect id=\"rdomain\" [attr.width]=\"width\" [attr.height]=\"height\" />\n <rect\n id=\"rrange\"\n [attr.x]=\"scaledRange[0]\"\n [attr.y]=\"0\"\n [attr.width]=\"scaledRange[1] - scaledRange[0]\"\n [attr.height]=\"height\"\n />\n</svg>\n", styles: ["#rdomain{fill:#d3d3d3;stroke-width:3;stroke:#c1ba9b}#rrange{fill:#91aad3;stroke-width:3}\n"] }]
26
26
  }], ctorParameters: () => [], propDecorators: { domain: [{
@@ -18,8 +18,8 @@ import { RangeViewComponent } from './components/range-view/range-view.component
18
18
  import { BrowserTreeNodeComponent } from './components/browser-tree-node/browser-tree-node.component';
19
19
  import * as i0 from "@angular/core";
20
20
  export class PagedDataBrowsersModule {
21
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: PagedDataBrowsersModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
22
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.1", ngImport: i0, type: PagedDataBrowsersModule, declarations: [CompactPagerComponent,
21
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: PagedDataBrowsersModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
22
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.0", ngImport: i0, type: PagedDataBrowsersModule, declarations: [CompactPagerComponent,
23
23
  RangeViewComponent,
24
24
  BrowserTreeNodeComponent], imports: [CommonModule,
25
25
  ReactiveFormsModule,
@@ -39,7 +39,7 @@ export class PagedDataBrowsersModule {
39
39
  NgToolsModule], exports: [CompactPagerComponent,
40
40
  RangeViewComponent,
41
41
  BrowserTreeNodeComponent] }); }
42
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: PagedDataBrowsersModule, imports: [CommonModule,
42
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: PagedDataBrowsersModule, imports: [CommonModule,
43
43
  ReactiveFormsModule,
44
44
  // material
45
45
  MatBadgeModule,
@@ -56,7 +56,7 @@ export class PagedDataBrowsersModule {
56
56
  // myrmidon
57
57
  NgToolsModule] }); }
58
58
  }
59
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: PagedDataBrowsersModule, decorators: [{
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: PagedDataBrowsersModule, decorators: [{
60
60
  type: NgModule,
61
61
  args: [{
62
62
  declarations: [
@@ -116,4 +116,4 @@ export class LRUCache {
116
116
  return totalSize;
117
117
  }
118
118
  }
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHJ1LWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL3NlcnZpY2VzL2xydS1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFPbkI7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLE9BQWUsRUFBRSxlQUF3QixLQUFLO1FBQ3hELElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQzFDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksR0FBRyxDQUFDLEdBQVc7UUFDcEIsSUFBSSxJQUFJLEdBQWtCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEdBQUcsQ0FBQyxHQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxHQUFHLENBQUMsR0FBVyxFQUFFLElBQU8sRUFBRSxJQUFZO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUN0QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzVDLElBQUksVUFBVSxFQUFFO29CQUNkLElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDO2lCQUMvQjtnQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDL0I7U0FDRjthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUN2QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQy9CO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLO1FBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQVE7UUFDeEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtZQUNwQixJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0JBQzdCLFNBQVMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUMvQjtpQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDcEMsU0FBUyxJQUFJLENBQUMsQ0FBQzthQUNoQjtpQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsRUFBRTtnQkFDckMsU0FBUyxJQUFJLENBQUMsQ0FBQzthQUNoQjtpQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUN0RCxTQUFTLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzlDO1NBQ0Y7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBMZWFzdCBSZWNlbnRseSBVc2VkIGNhY2hlIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgYW55IHR5cGUgb2Ygb2JqZWN0LlxyXG4gKiBUaGUgY2FjaGUgd29ya3MgaW4gdHdvIG1vZGVzOiBjb25zaWRlcmluZyB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0cyBvciBub3QuXHJcbiAqIElmIHRoZSBzaXplIGlzIGNvbnNpZGVyZWQsIHRoZSBjYWNoZSB3aWxsIGhhdmUgYSBtYXhpbXVtIHNpemUgYW5kIHdpbGxcclxuICogcmVtb3ZlIHRoZSBvbGRlc3Qgb2JqZWN0cyB3aGVuIHRoZSBtYXhpbXVtIHNpemUgaXMgcmVhY2hlZC4gTm90ZSB0aGF0XHJcbiAqIHRoZSBzaXplIGlzIG9ubHkgcm91Z2hseSBlc3RpbWF0ZWQuIFRoaXMgYXZvaWRzIHJlbW92aW5nIHRvbyBtYW55XHJcbiAqIGVudHJpZXMgZnJvbSB0aGUgY2FjaGUgd2hlbiB0aGUgbWF4aW11bSBpcyByZWFjaGVkLlxyXG4gKiBJZiB0aGUgc2l6ZSBpcyBub3QgY29uc2lkZXJlZCwgdGhlIGNhY2hlIHdpbGwgaGF2ZSBhIG1heGltdW0gbnVtYmVyIG9mXHJcbiAqIG9iamVjdHMgYW5kIHdpbGwgcmVtb3ZlIHRoZSBvbGRlc3Qgb2JqZWN0cyB3aGVuIHRoZSBtYXhpbXVtIG51bWJlciBpc1xyXG4gKiByZWFjaGVkLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExSVUNhY2hlPFQ+IHtcclxuICBwcml2YXRlIF9tYXhTaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfdG90YWxTaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfY29uc2lkZXJTaXplOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX2NhY2hlOiBNYXA8c3RyaW5nLCBUPjtcclxuICBwcml2YXRlIF9zaXplczogTWFwPHN0cmluZywgbnVtYmVyPjtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG5ldyBjYWNoZS5cclxuICAgKiBAcGFyYW0gbWF4U2l6ZSBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZS4gVGhpcyBpcyBlaXRoZXJcclxuICAgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGNhY2hlICh3aGVuIGNvbnNpZGVyU2l6ZVxyXG4gICAqIGlzIGZhbHNlKSBvciB0aGUgbWF4aW11bSB0b3RhbCBzaXplIG9mIGFsbCBpdGVtcyBpbiB0aGVcclxuICAgKiBjYWNoZSBpbiBieXRlcyAod2hlbiBjb25zaWRlclNpemUgaXMgdHJ1ZSkuXHJcbiAgICogQHBhcmFtIGNvbnNpZGVyU2l6ZSBUcnVlIGlmIHRoZSBzaXplIG9mIHRoZSBvYmplY3RzIHNob3VsZCBiZVxyXG4gICAqIGNvbnNpZGVyZWQuXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IobWF4U2l6ZTogbnVtYmVyLCBjb25zaWRlclNpemU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgdGhpcy5fbWF4U2l6ZSA9IG1heFNpemU7XHJcbiAgICB0aGlzLl90b3RhbFNpemUgPSAwO1xyXG4gICAgdGhpcy5fY29uc2lkZXJTaXplID0gY29uc2lkZXJTaXplO1xyXG4gICAgdGhpcy5fY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcclxuICAgIHRoaXMuX3NpemVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbiBpdGVtIGZyb20gdGhlIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgaXRlbSB0byBnZXQuXHJcbiAgICogQHJldHVybnMgVGhlIGl0ZW0gb3IgdW5kZWZpbmVkIGlmIHRoZSBpdGVtIGlzIG5vdCBpbiB0aGUgY2FjaGUuXHJcbiAgICovXHJcbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgbGV0IGl0ZW06IFQgfCB1bmRlZmluZWQgPSB0aGlzLl9jYWNoZS5nZXQoa2V5KTtcclxuICAgIGlmIChpdGVtKSB7XHJcbiAgICAgIHRoaXMuX2NhY2hlLmRlbGV0ZShrZXkpO1xyXG4gICAgICB0aGlzLl9jYWNoZS5zZXQoa2V5LCBpdGVtKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgYW4gaXRlbSBpcyBpbiB0aGUgY2FjaGUuXHJcbiAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBpdGVtIHRvIGNoZWNrLlxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGl0ZW0gaXMgaW4gY2FjaGUuXHJcbiAgICovXHJcbiAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlLmhhcyhrZXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHV0IGFuIGl0ZW0gaW4gdGhlIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgaXRlbSB0byBwdXQuXHJcbiAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gcHV0LlxyXG4gICAqIEBwYXJhbSBzaXplIFRoZSBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgaXRlbSBpbiBieXRlcy5cclxuICAgKiBUaGlzIG11c3QgYmUgY2FsY3VsYXRlZCBieSB0aGUgY2FsbGVyIGJ1dCBvbmx5IHdoZW5cclxuICAgKiBjb25zaWRlclNpemUgaXMgdHJ1ZS5cclxuICAgKi9cclxuICBwdWJsaWMgcHV0KGtleTogc3RyaW5nLCBpdGVtOiBULCBzaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhY2hlLmRlbGV0ZShrZXkpO1xyXG4gICAgdGhpcy5fY2FjaGUuc2V0KGtleSwgaXRlbSk7XHJcbiAgICB0aGlzLl9zaXplcy5zZXQoa2V5LCBzaXplKTtcclxuICAgIGlmICh0aGlzLl9jb25zaWRlclNpemUpIHtcclxuICAgICAgdGhpcy5fdG90YWxTaXplICs9IHNpemU7XHJcbiAgICAgIHdoaWxlICh0aGlzLl90b3RhbFNpemUgPiB0aGlzLl9tYXhTaXplKSB7XHJcbiAgICAgICAgY29uc3Qgb2xkZXN0S2V5ID0gdGhpcy5fY2FjaGUua2V5cygpLm5leHQoKS52YWx1ZTtcclxuICAgICAgICBsZXQgb2xkZXN0U2l6ZSA9IHRoaXMuX3NpemVzLmdldChvbGRlc3RLZXkpO1xyXG4gICAgICAgIGlmIChvbGRlc3RTaXplKSB7XHJcbiAgICAgICAgICB0aGlzLl90b3RhbFNpemUgLT0gb2xkZXN0U2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2FjaGUuZGVsZXRlKG9sZGVzdEtleSk7XHJcbiAgICAgICAgdGhpcy5fc2l6ZXMuZGVsZXRlKG9sZGVzdEtleSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLl9jYWNoZS5zaXplID4gdGhpcy5fbWF4U2l6ZSkge1xyXG4gICAgICAgIGNvbnN0IG9sZGVzdEtleSA9IHRoaXMuX2NhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XHJcbiAgICAgICAgdGhpcy5fY2FjaGUuZGVsZXRlKG9sZGVzdEtleSk7XHJcbiAgICAgICAgdGhpcy5fc2l6ZXMuZGVsZXRlKG9sZGVzdEtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZS5cclxuICAgKi9cclxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYWNoZS5jbGVhcigpO1xyXG4gICAgdGhpcy5fc2l6ZXMuY2xlYXIoKTtcclxuICAgIHRoaXMuX3RvdGFsU2l6ZSA9IDA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc3RpbWF0ZSB0aGUgc2l6ZSBvZiBhbiBvYmplY3QgaW4gYnl0ZXMuXHJcbiAgICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZi5cclxuICAgKiBAcmV0dXJucyBUaGUgZXN0aW1hdGVkIHNpemUgb2YgdGhlIG9iamVjdCBpbiBieXRlcy5cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIGNhbGN1bGF0ZU9iamVjdFNpemUob2JqOiBhbnkpOiBudW1iZXIge1xyXG4gICAgaWYgKCFvYmopIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBsZXQgdG90YWxTaXplID0gMDtcclxuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcclxuICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgIGxldCB2YWx1ZSA9IG9ialtrZXldO1xyXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHRvdGFsU2l6ZSArPSB2YWx1ZS5sZW5ndGggKiAyO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICB0b3RhbFNpemUgKz0gODtcclxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgIHRvdGFsU2l6ZSArPSA0O1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICB0b3RhbFNpemUgKz0gdGhpcy5jYWxjdWxhdGVPYmplY3RTaXplKHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvdGFsU2l6ZTtcclxuICB9XHJcbn1cclxuIl19
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHJ1LWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL3NlcnZpY2VzL2xydS1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFPbkI7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLE9BQWUsRUFBRSxlQUF3QixLQUFLO1FBQ3hELElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQzFDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksR0FBRyxDQUFDLEdBQVc7UUFDcEIsSUFBSSxJQUFJLEdBQWtCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxHQUFHLENBQUMsR0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksR0FBRyxDQUFDLEdBQVcsRUFBRSxJQUFPLEVBQUUsSUFBWTtRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNsRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDZixJQUFJLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQztnQkFDaEMsQ0FBQztnQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLO1FBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQVE7UUFDeEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNyQixJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDOUIsU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7aUJBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDckMsU0FBUyxJQUFJLENBQUMsQ0FBQztZQUNqQixDQUFDO2lCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3RDLFNBQVMsSUFBSSxDQUFDLENBQUM7WUFDakIsQ0FBQztpQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELFNBQVMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBMZWFzdCBSZWNlbnRseSBVc2VkIGNhY2hlIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgYW55IHR5cGUgb2Ygb2JqZWN0LlxyXG4gKiBUaGUgY2FjaGUgd29ya3MgaW4gdHdvIG1vZGVzOiBjb25zaWRlcmluZyB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0cyBvciBub3QuXHJcbiAqIElmIHRoZSBzaXplIGlzIGNvbnNpZGVyZWQsIHRoZSBjYWNoZSB3aWxsIGhhdmUgYSBtYXhpbXVtIHNpemUgYW5kIHdpbGxcclxuICogcmVtb3ZlIHRoZSBvbGRlc3Qgb2JqZWN0cyB3aGVuIHRoZSBtYXhpbXVtIHNpemUgaXMgcmVhY2hlZC4gTm90ZSB0aGF0XHJcbiAqIHRoZSBzaXplIGlzIG9ubHkgcm91Z2hseSBlc3RpbWF0ZWQuIFRoaXMgYXZvaWRzIHJlbW92aW5nIHRvbyBtYW55XHJcbiAqIGVudHJpZXMgZnJvbSB0aGUgY2FjaGUgd2hlbiB0aGUgbWF4aW11bSBpcyByZWFjaGVkLlxyXG4gKiBJZiB0aGUgc2l6ZSBpcyBub3QgY29uc2lkZXJlZCwgdGhlIGNhY2hlIHdpbGwgaGF2ZSBhIG1heGltdW0gbnVtYmVyIG9mXHJcbiAqIG9iamVjdHMgYW5kIHdpbGwgcmVtb3ZlIHRoZSBvbGRlc3Qgb2JqZWN0cyB3aGVuIHRoZSBtYXhpbXVtIG51bWJlciBpc1xyXG4gKiByZWFjaGVkLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExSVUNhY2hlPFQ+IHtcclxuICBwcml2YXRlIF9tYXhTaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfdG90YWxTaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfY29uc2lkZXJTaXplOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX2NhY2hlOiBNYXA8c3RyaW5nLCBUPjtcclxuICBwcml2YXRlIF9zaXplczogTWFwPHN0cmluZywgbnVtYmVyPjtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIG5ldyBjYWNoZS5cclxuICAgKiBAcGFyYW0gbWF4U2l6ZSBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZS4gVGhpcyBpcyBlaXRoZXJcclxuICAgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGNhY2hlICh3aGVuIGNvbnNpZGVyU2l6ZVxyXG4gICAqIGlzIGZhbHNlKSBvciB0aGUgbWF4aW11bSB0b3RhbCBzaXplIG9mIGFsbCBpdGVtcyBpbiB0aGVcclxuICAgKiBjYWNoZSBpbiBieXRlcyAod2hlbiBjb25zaWRlclNpemUgaXMgdHJ1ZSkuXHJcbiAgICogQHBhcmFtIGNvbnNpZGVyU2l6ZSBUcnVlIGlmIHRoZSBzaXplIG9mIHRoZSBvYmplY3RzIHNob3VsZCBiZVxyXG4gICAqIGNvbnNpZGVyZWQuXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IobWF4U2l6ZTogbnVtYmVyLCBjb25zaWRlclNpemU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgdGhpcy5fbWF4U2l6ZSA9IG1heFNpemU7XHJcbiAgICB0aGlzLl90b3RhbFNpemUgPSAwO1xyXG4gICAgdGhpcy5fY29uc2lkZXJTaXplID0gY29uc2lkZXJTaXplO1xyXG4gICAgdGhpcy5fY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcclxuICAgIHRoaXMuX3NpemVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbiBpdGVtIGZyb20gdGhlIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgaXRlbSB0byBnZXQuXHJcbiAgICogQHJldHVybnMgVGhlIGl0ZW0gb3IgdW5kZWZpbmVkIGlmIHRoZSBpdGVtIGlzIG5vdCBpbiB0aGUgY2FjaGUuXHJcbiAgICovXHJcbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgbGV0IGl0ZW06IFQgfCB1bmRlZmluZWQgPSB0aGlzLl9jYWNoZS5nZXQoa2V5KTtcclxuICAgIGlmIChpdGVtKSB7XHJcbiAgICAgIHRoaXMuX2NhY2hlLmRlbGV0ZShrZXkpO1xyXG4gICAgICB0aGlzLl9jYWNoZS5zZXQoa2V5LCBpdGVtKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgYW4gaXRlbSBpcyBpbiB0aGUgY2FjaGUuXHJcbiAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBpdGVtIHRvIGNoZWNrLlxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGl0ZW0gaXMgaW4gY2FjaGUuXHJcbiAgICovXHJcbiAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlLmhhcyhrZXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHV0IGFuIGl0ZW0gaW4gdGhlIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgaXRlbSB0byBwdXQuXHJcbiAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gcHV0LlxyXG4gICAqIEBwYXJhbSBzaXplIFRoZSBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgaXRlbSBpbiBieXRlcy5cclxuICAgKiBUaGlzIG11c3QgYmUgY2FsY3VsYXRlZCBieSB0aGUgY2FsbGVyIGJ1dCBvbmx5IHdoZW5cclxuICAgKiBjb25zaWRlclNpemUgaXMgdHJ1ZS5cclxuICAgKi9cclxuICBwdWJsaWMgcHV0KGtleTogc3RyaW5nLCBpdGVtOiBULCBzaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhY2hlLmRlbGV0ZShrZXkpO1xyXG4gICAgdGhpcy5fY2FjaGUuc2V0KGtleSwgaXRlbSk7XHJcbiAgICB0aGlzLl9zaXplcy5zZXQoa2V5LCBzaXplKTtcclxuICAgIGlmICh0aGlzLl9jb25zaWRlclNpemUpIHtcclxuICAgICAgdGhpcy5fdG90YWxTaXplICs9IHNpemU7XHJcbiAgICAgIHdoaWxlICh0aGlzLl90b3RhbFNpemUgPiB0aGlzLl9tYXhTaXplKSB7XHJcbiAgICAgICAgY29uc3Qgb2xkZXN0S2V5ID0gdGhpcy5fY2FjaGUua2V5cygpLm5leHQoKS52YWx1ZTtcclxuICAgICAgICBsZXQgb2xkZXN0U2l6ZSA9IHRoaXMuX3NpemVzLmdldChvbGRlc3RLZXkpO1xyXG4gICAgICAgIGlmIChvbGRlc3RTaXplKSB7XHJcbiAgICAgICAgICB0aGlzLl90b3RhbFNpemUgLT0gb2xkZXN0U2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2FjaGUuZGVsZXRlKG9sZGVzdEtleSk7XHJcbiAgICAgICAgdGhpcy5fc2l6ZXMuZGVsZXRlKG9sZGVzdEtleSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLl9jYWNoZS5zaXplID4gdGhpcy5fbWF4U2l6ZSkge1xyXG4gICAgICAgIGNvbnN0IG9sZGVzdEtleSA9IHRoaXMuX2NhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XHJcbiAgICAgICAgdGhpcy5fY2FjaGUuZGVsZXRlKG9sZGVzdEtleSk7XHJcbiAgICAgICAgdGhpcy5fc2l6ZXMuZGVsZXRlKG9sZGVzdEtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZS5cclxuICAgKi9cclxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYWNoZS5jbGVhcigpO1xyXG4gICAgdGhpcy5fc2l6ZXMuY2xlYXIoKTtcclxuICAgIHRoaXMuX3RvdGFsU2l6ZSA9IDA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc3RpbWF0ZSB0aGUgc2l6ZSBvZiBhbiBvYmplY3QgaW4gYnl0ZXMuXHJcbiAgICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZi5cclxuICAgKiBAcmV0dXJucyBUaGUgZXN0aW1hdGVkIHNpemUgb2YgdGhlIG9iamVjdCBpbiBieXRlcy5cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIGNhbGN1bGF0ZU9iamVjdFNpemUob2JqOiBhbnkpOiBudW1iZXIge1xyXG4gICAgaWYgKCFvYmopIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBsZXQgdG90YWxTaXplID0gMDtcclxuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcclxuICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgIGxldCB2YWx1ZSA9IG9ialtrZXldO1xyXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHRvdGFsU2l6ZSArPSB2YWx1ZS5sZW5ndGggKiAyO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICB0b3RhbFNpemUgKz0gODtcclxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgIHRvdGFsU2l6ZSArPSA0O1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICB0b3RhbFNpemUgKz0gdGhpcy5jYWxjdWxhdGVPYmplY3RTaXplKHZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvdGFsU2l6ZTtcclxuICB9XHJcbn1cclxuIl19
@@ -156,4 +156,4 @@ export class PagedListStore {
156
156
  return this._cache.has(key);
157
157
  }
158
158
  }
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtbGlzdC5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC1saXN0LnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFJbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQXlCdkM7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBMEI7SUFDckUsUUFBUSxFQUFFLEVBQUU7SUFDWixTQUFTLEVBQUUsRUFBRTtDQUNkLENBQUM7QUFtQkY7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFvQnpCOzs7T0FHRztJQUNILElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUNELElBQVcsUUFBUSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRTtZQUM1QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFDVSxRQUFxQyxFQUM3QyxVQUFpQyxnQ0FBZ0M7UUFEekQsYUFBUSxHQUFSLFFBQVEsQ0FBNkI7UUFHN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQWMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNELE9BQU87UUFDUCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZUFBZSxDQUFjO1lBQzdDLFVBQVUsRUFBRSxDQUFDO1lBQ2IsU0FBUyxFQUFFLENBQUM7WUFDWixRQUFRLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxDQUFDO1lBQ1IsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEMsU0FBUztRQUNULElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxlQUFlLENBQUksRUFBTyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxhQUFhLENBQUMsVUFBa0IsRUFBRSxNQUFTO1FBQ2hELElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN4RDtRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFFBQVEsQ0FBQyxVQUFrQjtRQUNqQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUMzQixVQUFVLEVBQ1YsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE9BQU8sQ0FBQyxVQUFrQixFQUFFLFFBQWlCO1FBQ2xELElBQUksUUFBUSxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQzNDLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxpQ0FBaUM7WUFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QyxJQUFJLFVBQVUsRUFBRTtnQkFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0IsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsT0FBTzthQUNSO1lBRUQsaUJBQWlCO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUNsQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDOUIsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztnQkFDRCxLQUFLLEVBQUUsTUFBTTthQUNkLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksU0FBUyxDQUFDLE1BQVM7UUFDeEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksU0FBUztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUs7UUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxhQUFhLENBQUMsVUFBa0IsRUFBRSxNQUFTO1FBQ2hELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBEYXRhUGFnZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcblxyXG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4vbHJ1LWNhY2hlJztcclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGZvciB0aGUgcGFnZWQgbGlzdCBzdG9yZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZWRMaXN0U3RvcmVPcHRpb25zIHtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiBwYWdlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgcGFnZVNpemU6IG51bWJlcjtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgY2FjaGUgZm9yIHBhZ2VzIGluIHRoZSBzdG9yZS5cclxuICAgKi9cclxuICBjYWNoZVNpemU6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogQSBjdXN0b20gZnVuY3Rpb24gZm9yIGJ1aWxkaW5nIHRoZSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBwYWdlIG51bWJlclxyXG4gICAqIGFuZCBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBBIHN0cmluZyB0byBiZSB1c2VkIGFzIGNhY2hlIGtleS5cclxuICAgKi9cclxuICBidWlsZENhY2hlS2V5PzogKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBhbnkpID0+IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIHBhZ2VkIGxpc3Qgc3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgREVGQVVMVF9QQUdFRF9MSVNUX1NUT1JFX09QVElPTlM6IFBhZ2VkTGlzdFN0b3JlT3B0aW9ucyA9IHtcclxuICBwYWdlU2l6ZTogMjAsXHJcbiAgY2FjaGVTaXplOiA1MCxcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgaW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzZXJ2aWNlIHVzZWQgYnkgUGFnZWRMaXN0U3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkTGlzdFN0b3JlU2VydmljZTxGLCBFPiB7XHJcbiAgLyoqXHJcbiAgICogTG9hZCB0aGUgcGFnZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyIHRvIGxvYWQuXHJcbiAgICogQHBhcmFtIHBhZ2VTaXplIFRoZSBzaXplIG9mIHRoZSBwYWdlIHRvIGxvYWQuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRvIGFwcGx5LlxyXG4gICAqL1xyXG4gIGxvYWRQYWdlKFxyXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxyXG4gICAgcGFnZVNpemU6IG51bWJlcixcclxuICAgIGZpbHRlcjogRlxyXG4gICk6IE9ic2VydmFibGU8RGF0YVBhZ2U8RT4+O1xyXG59XHJcblxyXG4vKipcclxuICogQSBnZW5lcmljIHBhZ2VkIGxpc3Qgc3RvcmUgdXNpbmcgYSBmaWx0ZXIgb2JqZWN0IG9mIHR5cGUgRlxyXG4gKiBhbmQgYSBsaXN0IG9mIGVsZW1lbnRzIG9mIHR5cGUgRS5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBQYWdlZExpc3RTdG9yZTxGLCBFPiB7XHJcbiAgcHJpdmF0ZSBfcGFnZVNpemU6IG51bWJlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jdXN0b21DYWNoZUtleUJ1aWxkZXI/OiAoXHJcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXHJcbiAgICBmaWx0ZXI6IGFueVxyXG4gICkgPT4gc3RyaW5nO1xyXG4gIHByaXZhdGUgX3BhZ2UkOiBCZWhhdmlvclN1YmplY3Q8RGF0YVBhZ2U8RT4+O1xyXG4gIHByaXZhdGUgX2ZpbHRlciQ6IEJlaGF2aW9yU3ViamVjdDxGPjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jYWNoZTogTFJVQ2FjaGU8RGF0YVBhZ2U8RT4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgcGFnZS4gSXQgaXMgdXBkYXRlZCB3aGVuIHRoZSBwYWdlIGlzIGNoYW5nZWQgb3IgdGhlIGZpbHRlciBpcyBjaGFuZ2VkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBwYWdlJDogT2JzZXJ2YWJsZTxSZWFkb25seTxEYXRhUGFnZTxFPj4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZmlsdGVyLiBJdCBpcyB1cGRhdGVkIHdoZW4gdGhlIGZpbHRlciBpcyBjaGFuZ2VkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaWx0ZXIkOiBPYnNlcnZhYmxlPFJlYWRvbmx5PEY+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2Ygbm9kZXMgcGFnZXMgaW4gdGhpcyBzdG9yZS4gSWYgeW91IGNoYW5nZSBpdCwgdGhlIHN0b3JlXHJcbiAgICogaXMgcmVzZXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDIwLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZTtcclxuICB9XHJcbiAgcHVibGljIHNldCBwYWdlU2l6ZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fcGFnZVNpemUgPT09IHZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3BhZ2VTaXplID0gdmFsdWU7XHJcbiAgICB0aGlzLnJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBuZXcgcGFnZWQgbGlzdCBzdG9yZS5cclxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcGFnZWQgbGlzdCBzdG9yZS5cclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX3NlcnZpY2U6IFBhZ2VkTGlzdFN0b3JlU2VydmljZTxGLCBFPixcclxuICAgIG9wdGlvbnM6IFBhZ2VkTGlzdFN0b3JlT3B0aW9ucyA9IERFRkFVTFRfUEFHRURfTElTVF9TVE9SRV9PUFRJT05TXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9wYWdlU2l6ZSA9IG9wdGlvbnMucGFnZVNpemU7XHJcbiAgICB0aGlzLl9jYWNoZSA9IG5ldyBMUlVDYWNoZTxEYXRhUGFnZTxFPj4ob3B0aW9ucy5jYWNoZVNpemUpO1xyXG4gICAgLy8gcGFnZVxyXG4gICAgdGhpcy5fcGFnZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFQYWdlPEU+Pih7XHJcbiAgICAgIHBhZ2VOdW1iZXI6IDAsXHJcbiAgICAgIHBhZ2VDb3VudDogMCxcclxuICAgICAgcGFnZVNpemU6IDAsXHJcbiAgICAgIHRvdGFsOiAwLFxyXG4gICAgICBpdGVtczogW10sXHJcbiAgICB9KTtcclxuICAgIHRoaXMucGFnZSQgPSB0aGlzLl9wYWdlJC5hc09ic2VydmFibGUoKTtcclxuICAgIC8vIGZpbHRlclxyXG4gICAgdGhpcy5fZmlsdGVyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rj4oe30gYXMgRik7XHJcbiAgICB0aGlzLmZpbHRlciQgPSB0aGlzLl9maWx0ZXIkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdG9yZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHN0b3JlIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFnZSQudmFsdWUuaXRlbXMubGVuZ3RoID09PSAwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGQgdGhlIGNhY2hlIGtleSBmb3IgdGhlIGdpdmVuIHBhZ2UgbnVtYmVyIGFuZCBmaWx0ZXIuXHJcbiAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCByZXR1cm5zIGEgc3RyaW5naWZpZWQgb2JqZWN0XHJcbiAgICogY29udGFpbmluZyB0aGUgcGFnZSBudW1iZXIgYW5kIHRoZSBmaWx0ZXIuIFlvdSBtYXkgb3ZlcnJpZGVcclxuICAgKiB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGEgY3VzdG9tIGNhY2hlIGtleS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgY2FjaGUga2V5LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBidWlsZENhY2hlS2V5KHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBGKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl9jdXN0b21DYWNoZUtleUJ1aWxkZXIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbUNhY2hlS2V5QnVpbGRlcihwYWdlTnVtYmVyLCBmaWx0ZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgcGFnZU51bWJlciwgLi4uZmlsdGVyIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCB0aGUgcGFnZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgdGhlIHBhZ2UgbnVtYmVyIHRvIGxvYWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkUGFnZShwYWdlTnVtYmVyOiBudW1iZXIpOiBPYnNlcnZhYmxlPERhdGFQYWdlPEU+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VydmljZS5sb2FkUGFnZShcclxuICAgICAgcGFnZU51bWJlcixcclxuICAgICAgdGhpcy5fcGFnZVNpemUsXHJcbiAgICAgIHRoaXMuX2ZpbHRlciQudmFsdWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlciB0byBsb2FkLlxyXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSBUaGUgcGFnZSBzaXplLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHNldFBhZ2UocGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZT86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHBhZ2VTaXplICYmIHBhZ2VTaXplICE9PSB0aGlzLl9wYWdlU2l6ZSkge1xyXG4gICAgICB0aGlzLl9wYWdlU2l6ZSA9IHBhZ2VTaXplO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgLy8gaWYgcGFnZSBpcyBpbiBjYWNoZSwgcmV0dXJuIGl0XHJcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuYnVpbGRDYWNoZUtleShwYWdlTnVtYmVyLCB0aGlzLl9maWx0ZXIkLnZhbHVlKTtcclxuICAgICAgY29uc3QgY2FjaGVkUGFnZSA9IHRoaXMuX2NhY2hlLmdldChrZXkpO1xyXG4gICAgICBpZiAoY2FjaGVkUGFnZSkge1xyXG4gICAgICAgIHRoaXMuX3BhZ2UkLm5leHQoY2FjaGVkUGFnZSk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZWxzZSBsb2FkIHBhZ2VcclxuICAgICAgdGhpcy5sb2FkUGFnZShwYWdlTnVtYmVyKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChwYWdlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9wYWdlJC5uZXh0KHBhZ2UpO1xyXG4gICAgICAgICAgdGhpcy5fY2FjaGUucHV0KGtleSwgcGFnZSwgMCk7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogcmVqZWN0LFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBjdXJyZW50IHBhZ2UuXHJcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgcGFnZS5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0UGFnZSgpOiBEYXRhUGFnZTxFPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFnZSQudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBseSB0aGUgZ2l2ZW4gZmlsdGVyIGFuZCBsb2FkIHRoZSBmaXJzdCBwYWdlLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0byBhcHBseS5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIHBhZ2UgaXMgbG9hZGVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRGaWx0ZXIoZmlsdGVyOiBGKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLl9maWx0ZXIkLm5leHQoZmlsdGVyKTtcclxuICAgICAgdGhpcy5zZXRQYWdlKDEpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBjdXJyZW50IGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBmaWx0ZXIuXHJcbiAgICovXHJcbiAgcHVibGljIGdldEZpbHRlcigpOiBGIHtcclxuICAgIHJldHVybiB0aGlzLl9maWx0ZXIkLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgdGhlIGZpbHRlciBhbmQgbG9hZCB0aGUgZmlyc3QgcGFnZS4gVGhlIGNhY2hlIGlzIGNsZWFyZWQuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSBwYWdlIGlzIGxvYWRlZC5cclxuICAgKi9cclxuICBwdWJsaWMgcmVzZXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9jYWNoZS5jbGVhcigpO1xyXG4gICAgcmV0dXJuIHRoaXMuc2V0RmlsdGVyKHt9IGFzIEYpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjbGVhckNhY2hlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoZSBwYWdlIHdpdGggdGhlIGdpdmVuIG51bWJlciBhbmQgZmlsdGVyIGlzIGluIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcGFnZSBpcyBpbiBjYWNoZSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBoYXNDYWNoZWRQYWdlKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBGKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIHJldHVybiB0aGlzLl9jYWNoZS5oYXMoa2V5KTtcclxuICB9XHJcbn1cclxuIl19
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtbGlzdC5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC1saXN0LnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFJbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQXlCdkM7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBMEI7SUFDckUsUUFBUSxFQUFFLEVBQUU7SUFDWixTQUFTLEVBQUUsRUFBRTtDQUNkLENBQUM7QUFtQkY7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFvQnpCOzs7T0FHRztJQUNILElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUNELElBQVcsUUFBUSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzdCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQ1UsUUFBcUMsRUFDN0MsVUFBaUMsZ0NBQWdDO1FBRHpELGFBQVEsR0FBUixRQUFRLENBQTZCO1FBRzdDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksUUFBUSxDQUFjLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzRCxPQUFPO1FBQ1AsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBYztZQUM3QyxVQUFVLEVBQUUsQ0FBQztZQUNi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QUM7WUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFNBQVM7UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLO1FBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBTyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksYUFBYSxDQUFDLFVBQWtCLEVBQUUsTUFBUztRQUNoRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgRGF0YVBhZ2UgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xyXG5cclxuaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tICcuL2xydS1jYWNoZSc7XHJcblxyXG4vKipcclxuICogT3B0aW9ucyBmb3IgdGhlIHBhZ2VkIGxpc3Qgc3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkTGlzdFN0b3JlT3B0aW9ucyB7XHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgcGFnZXMgaW4gdGhlIHN0b3JlLlxyXG4gICAqL1xyXG4gIHBhZ2VTaXplOiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgdGhlIGNhY2hlIGZvciBwYWdlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgY2FjaGVTaXplOiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgY3VzdG9tIGZ1bmN0aW9uIGZvciBidWlsZGluZyB0aGUgY2FjaGUga2V5IGZvciB0aGUgZ2l2ZW4gcGFnZSBudW1iZXJcclxuICAgKiBhbmQgZmlsdGVyLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgQSBzdHJpbmcgdG8gYmUgdXNlZCBhcyBjYWNoZSBrZXkuXHJcbiAgICovXHJcbiAgYnVpbGRDYWNoZUtleT86IChwYWdlTnVtYmVyOiBudW1iZXIsIGZpbHRlcjogYW55KSA9PiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBwYWdlZCBsaXN0IHN0b3JlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEFHRURfTElTVF9TVE9SRV9PUFRJT05TOiBQYWdlZExpc3RTdG9yZU9wdGlvbnMgPSB7XHJcbiAgcGFnZVNpemU6IDIwLFxyXG4gIGNhY2hlU2l6ZTogNTAsXHJcbn07XHJcblxyXG4vKipcclxuICogVGhlIGludGVyZmFjZSB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgc2VydmljZSB1c2VkIGJ5IFBhZ2VkTGlzdFN0b3JlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdlZExpc3RTdG9yZVNlcnZpY2U8RiwgRT4ge1xyXG4gIC8qKlxyXG4gICAqIExvYWQgdGhlIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlciB0byBsb2FkLlxyXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSBUaGUgc2l6ZSBvZiB0aGUgcGFnZSB0byBsb2FkLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0byBhcHBseS5cclxuICAgKi9cclxuICBsb2FkUGFnZShcclxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcclxuICAgIHBhZ2VTaXplOiBudW1iZXIsXHJcbiAgICBmaWx0ZXI6IEZcclxuICApOiBPYnNlcnZhYmxlPERhdGFQYWdlPEU+PjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgZ2VuZXJpYyBwYWdlZCBsaXN0IHN0b3JlIHVzaW5nIGEgZmlsdGVyIG9iamVjdCBvZiB0eXBlIEZcclxuICogYW5kIGEgbGlzdCBvZiBlbGVtZW50cyBvZiB0eXBlIEUuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUGFnZWRMaXN0U3RvcmU8RiwgRT4ge1xyXG4gIHByaXZhdGUgX3BhZ2VTaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfY3VzdG9tQ2FjaGVLZXlCdWlsZGVyPzogKFxyXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxyXG4gICAgZmlsdGVyOiBhbnlcclxuICApID0+IHN0cmluZztcclxuICBwcml2YXRlIF9wYWdlJDogQmVoYXZpb3JTdWJqZWN0PERhdGFQYWdlPEU+PjtcclxuICBwcml2YXRlIF9maWx0ZXIkOiBCZWhhdmlvclN1YmplY3Q8Rj47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfY2FjaGU6IExSVUNhY2hlPERhdGFQYWdlPEU+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHBhZ2UuIEl0IGlzIHVwZGF0ZWQgd2hlbiB0aGUgcGFnZSBpcyBjaGFuZ2VkIG9yIHRoZSBmaWx0ZXIgaXMgY2hhbmdlZC5cclxuICAgKi9cclxuICBwdWJsaWMgcGFnZSQ6IE9ic2VydmFibGU8UmVhZG9ubHk8RGF0YVBhZ2U8RT4+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGZpbHRlci4gSXQgaXMgdXBkYXRlZCB3aGVuIHRoZSBmaWx0ZXIgaXMgY2hhbmdlZC5cclxuICAgKi9cclxuICBwdWJsaWMgZmlsdGVyJDogT2JzZXJ2YWJsZTxSZWFkb25seTxGPj47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBzaXplIG9mIG5vZGVzIHBhZ2VzIGluIHRoaXMgc3RvcmUuIElmIHlvdSBjaGFuZ2UgaXQsIHRoZSBzdG9yZVxyXG4gICAqIGlzIHJlc2V0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAyMC5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFnZVNpemU7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgcGFnZVNpemUodmFsdWU6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuX3BhZ2VTaXplID09PSB2YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9wYWdlU2l6ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5yZXNldCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IHBhZ2VkIGxpc3Qgc3RvcmUuXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHBhZ2VkIGxpc3Qgc3RvcmUuXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9zZXJ2aWNlOiBQYWdlZExpc3RTdG9yZVNlcnZpY2U8RiwgRT4sXHJcbiAgICBvcHRpb25zOiBQYWdlZExpc3RTdG9yZU9wdGlvbnMgPSBERUZBVUxUX1BBR0VEX0xJU1RfU1RPUkVfT1BUSU9OU1xyXG4gICkge1xyXG4gICAgdGhpcy5fcGFnZVNpemUgPSBvcHRpb25zLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5fY2FjaGUgPSBuZXcgTFJVQ2FjaGU8RGF0YVBhZ2U8RT4+KG9wdGlvbnMuY2FjaGVTaXplKTtcclxuICAgIC8vIHBhZ2VcclxuICAgIHRoaXMuX3BhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhUGFnZTxFPj4oe1xyXG4gICAgICBwYWdlTnVtYmVyOiAwLFxyXG4gICAgICBwYWdlQ291bnQ6IDAsXHJcbiAgICAgIHBhZ2VTaXplOiAwLFxyXG4gICAgICB0b3RhbDogMCxcclxuICAgICAgaXRlbXM6IFtdLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnBhZ2UkID0gdGhpcy5fcGFnZSQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAvLyBmaWx0ZXJcclxuICAgIHRoaXMuX2ZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEY+KHt9IGFzIEYpO1xyXG4gICAgdGhpcy5maWx0ZXIkID0gdGhpcy5fZmlsdGVyJC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RvcmUgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBzdG9yZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2UkLnZhbHVlLml0ZW1zLmxlbmd0aCA9PT0gMDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkIHRoZSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBwYWdlIG51bWJlciBhbmQgZmlsdGVyLlxyXG4gICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgcmV0dXJucyBhIHN0cmluZ2lmaWVkIG9iamVjdFxyXG4gICAqIGNvbnRhaW5pbmcgdGhlIHBhZ2UgbnVtYmVyIGFuZCB0aGUgZmlsdGVyLiBZb3UgbWF5IG92ZXJyaWRlXHJcbiAgICogdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBhIGN1c3RvbSBjYWNoZSBrZXkuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBBIHN0cmluZyB0byBiZSB1c2VkIGFzIGNhY2hlIGtleS5cclxuICAgKi9cclxuICBwdWJsaWMgYnVpbGRDYWNoZUtleShwYWdlTnVtYmVyOiBudW1iZXIsIGZpbHRlcjogRik6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fY3VzdG9tQ2FjaGVLZXlCdWlsZGVyKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jdXN0b21DYWNoZUtleUJ1aWxkZXIocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIH1cclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHBhZ2VOdW1iZXIsIC4uLmZpbHRlciB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgdGhlIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIHRoZSBwYWdlIG51bWJlciB0byBsb2FkLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZFBhZ2UocGFnZU51bWJlcjogbnVtYmVyKTogT2JzZXJ2YWJsZTxEYXRhUGFnZTxFPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZpY2UubG9hZFBhZ2UoXHJcbiAgICAgIHBhZ2VOdW1iZXIsXHJcbiAgICAgIHRoaXMuX3BhZ2VTaXplLFxyXG4gICAgICB0aGlzLl9maWx0ZXIkLnZhbHVlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBwYWdlIHdpdGggdGhlIGdpdmVuIG51bWJlci5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIgdG8gbG9hZC5cclxuICAgKiBAcGFyYW0gcGFnZVNpemUgVGhlIHBhZ2Ugc2l6ZS5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIHBhZ2UgaXMgbG9hZGVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRQYWdlKHBhZ2VOdW1iZXI6IG51bWJlciwgcGFnZVNpemU/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChwYWdlU2l6ZSAmJiBwYWdlU2l6ZSAhPT0gdGhpcy5fcGFnZVNpemUpIHtcclxuICAgICAgdGhpcy5fcGFnZVNpemUgPSBwYWdlU2l6ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIC8vIGlmIHBhZ2UgaXMgaW4gY2FjaGUsIHJldHVybiBpdFxyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlciwgdGhpcy5fZmlsdGVyJC52YWx1ZSk7XHJcbiAgICAgIGNvbnN0IGNhY2hlZFBhZ2UgPSB0aGlzLl9jYWNoZS5nZXQoa2V5KTtcclxuICAgICAgaWYgKGNhY2hlZFBhZ2UpIHtcclxuICAgICAgICB0aGlzLl9wYWdlJC5uZXh0KGNhY2hlZFBhZ2UpO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGVsc2UgbG9hZCBwYWdlXHJcbiAgICAgIHRoaXMubG9hZFBhZ2UocGFnZU51bWJlcikuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocGFnZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fcGFnZSQubmV4dChwYWdlKTtcclxuICAgICAgICAgIHRoaXMuX2NhY2hlLnB1dChrZXksIHBhZ2UsIDApO1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IHJlamVjdCxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY3VycmVudCBwYWdlLlxyXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHBhZ2UuXHJcbiAgICovXHJcbiAgcHVibGljIGdldFBhZ2UoKTogRGF0YVBhZ2U8RT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2UkLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgdGhlIGdpdmVuIGZpbHRlciBhbmQgbG9hZCB0aGUgZmlyc3QgcGFnZS5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gYXBwbHkuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSBwYWdlIGlzIGxvYWRlZC5cclxuICAgKi9cclxuICBwdWJsaWMgc2V0RmlsdGVyKGZpbHRlcjogRik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5fZmlsdGVyJC5uZXh0KGZpbHRlcik7XHJcbiAgICAgIHRoaXMuc2V0UGFnZSgxKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY3VycmVudCBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgZmlsdGVyLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWx0ZXIoKTogRiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyJC52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHRoZSBmaWx0ZXIgYW5kIGxvYWQgdGhlIGZpcnN0IHBhZ2UuIFRoZSBjYWNoZSBpcyBjbGVhcmVkLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHJlc2V0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICAgIHJldHVybiB0aGlzLnNldEZpbHRlcih7fSBhcyBGKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZS5cclxuICAgKi9cclxuICBwdWJsaWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhY2hlLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiB0aGUgcGFnZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgYW5kIGZpbHRlciBpcyBpbiBjYWNoZS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHBhZ2UgaXMgaW4gY2FjaGUsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgaGFzQ2FjaGVkUGFnZShwYWdlTnVtYmVyOiBudW1iZXIsIGZpbHRlcjogRik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5idWlsZENhY2hlS2V5KHBhZ2VOdW1iZXIsIGZpbHRlcik7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FjaGUuaGFzKGtleSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -432,4 +432,4 @@ export class PagedTreeStore {
432
432
  return this._cache.has(key);
433
433
  }
434
434
  }
435
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtdHJlZS5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC10cmVlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxlQUFlLEVBRWYsUUFBUSxFQUNSLEVBQUUsRUFDRixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBSWQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQWdHdEU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQW9DekI7OztPQUdHO0lBQ0gsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQzVCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFDVSxRQUFrQyxFQUMxQyxVQUFpQyxnQ0FBZ0M7UUFEekQsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7UUFHMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQXFCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsT0FBTyxDQUFDLGFB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QUcsR0FBRyxLQUFLLENBQUMsQ0FBQztvQkFDakMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUksU0FBaUIsQ0FBQyxDQUFDO29CQUM5QyxxQ0FBcUM7b0JBQ3JDLFVBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7b0JBQ2hELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2Y7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxhQUFhLENBQUMsVUFBa0IsRUFBRSxNQUFTO1FBQ2hELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBCZWhhdmlvclN1YmplY3QsXHJcbiAgT2JzZXJ2YWJsZSxcclxuICBmb3JrSm9pbixcclxuICBvZixcclxuICBzd2l0Y2hNYXAsXHJcbiAgdGFwLFxyXG59IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgRGF0YVBhZ2UgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xyXG5cclxuaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tICcuL2xydS1jYWNoZSc7XHJcbmltcG9ydCB7IERFRkFVTFRfUEFHRURfTElTVF9TVE9SRV9PUFRJT05TIH0gZnJvbSAnLi9wYWdlZC1saXN0LnN0b3JlJztcclxuXHJcbi8qKlxyXG4gKiBBIHRyZWUgbm9kZS4gWW91ciBkYXRhIHNlcnZpY2Ugc2hvdWxkIHJldHVybiBhIGxpc3Qgb2YgdGhlc2Ugbm9kZXNcclxuICogb3Igb2YgYW55IHR5cGUgZXh0ZW5kaW5nIHRoaXMgaW50ZXJmYWNlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUcmVlTm9kZSB7XHJcbiAgaWQ6IG51bWJlcjtcclxuICBwYXJlbnRJZD86IG51bWJlcjtcclxuICB5OiBudW1iZXI7XHJcbiAgeDogbnVtYmVyO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdGFnPzogc3RyaW5nO1xyXG4gIGhhc0NoaWxkcmVuPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgZmlsdGVyIGZvciB0cmVlIG5vZGVzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUcmVlTm9kZUZpbHRlciB7XHJcbiAgdGFncz86IHN0cmluZ1tdO1xyXG4gIHBhcmVudElkPzogbnVtYmVyO1xyXG59XHJcblxyXG4vKipcclxuICogUGFnaW5nIGluZm9ybWF0aW9uIGZvciBhIHBhZ2VkIHRyZWUgbm9kZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5nSW5mbyB7XHJcbiAgcGFnZU51bWJlcjogbnVtYmVyO1xyXG4gIHBhZ2VDb3VudDogbnVtYmVyO1xyXG4gIHRvdGFsOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHRyZWUgbm9kZSB3aXRoIHBhZ2luZyBpbmZvcm1hdGlvbiwgdXNlZCBpbiBOb2RlQnJvd3NlclN0b3JlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdlZFRyZWVOb2RlPEYgZXh0ZW5kcyBUcmVlTm9kZUZpbHRlcj4gZXh0ZW5kcyBUcmVlTm9kZSB7XHJcbiAgcGFnaW5nOiBQYWdpbmdJbmZvO1xyXG4gIGV4cGFuZGVkPzogYm9vbGVhbjtcclxuICBmaWx0ZXI/OiBGO1xyXG59XHJcblxyXG4vKipcclxuICogVGhlIGludGVyZmFjZSB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgc2VydmljZSB1c2VkIGJ5IE5vZGVCcm93c2VyU3RvcmVcclxuICogdG8gbG9hZCBub2Rlcy5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZWRUcmVlU3RvcmVTZXJ2aWNlPEYgZXh0ZW5kcyBUcmVlTm9kZUZpbHRlcj4ge1xyXG4gIC8qKlxyXG4gICAqIEdldCBhbGwgdGhlIHJvb3Qgbm9kZXMsIG9yIGp1c3QgdGhlIG9uZXMgaGF2aW5nIG9uZSBvZiB0aGUgc3BlY2lmaWVkXHJcbiAgICogdGFncy5cclxuICAgKiBAcGFyYW0gdGFncyBUaGUgb3B0aW9uYWwgdGFncyB0byBmaWx0ZXIgdGhlIHJvb3Qgbm9kZXMuXHJcbiAgICovXHJcbiAgZ2V0Um9vdE5vZGVzKHRhZ3M/OiBzdHJpbmdbXSk6IE9ic2VydmFibGU8VHJlZU5vZGVbXT47XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgc3BlY2lmaWVkIHBhZ2Ugb2Ygbm9kZXMuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gcGFnZVNpemUgVGhlIHBhZ2Ugc2l6ZS5cclxuICAgKi9cclxuICBnZXROb2RlcyhcclxuICAgIGZpbHRlcjogRixcclxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcclxuICAgIHBhZ2VTaXplOiBudW1iZXJcclxuICApOiBPYnNlcnZhYmxlPERhdGFQYWdlPFRyZWVOb2RlPj47XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgbGlzdCBvZiB1bmlxdWUgbm9kZSB0YWdzLiBFYWNoIHRhZyBjb3JyZXNwb25kcyB0byBhIHRyZWUsXHJcbiAgICogYXMgbm9kZXMgYXJlIHZpcnR1YWxseSBncm91cGVkIGJ5IHRoZWlyIHRhZy5cclxuICAgKi9cclxuICBnZXRUYWdzKCk6IE9ic2VydmFibGU8c3RyaW5nW10+O1xyXG59XHJcblxyXG4vKipcclxuICogT3B0aW9ucyBmb3IgdGhlIE5vZGVCcm93c2VyU3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkVHJlZVN0b3JlT3B0aW9ucyB7XHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgcGFnZXMgaW4gdGhlIHN0b3JlLlxyXG4gICAqL1xyXG4gIHBhZ2VTaXplOiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgdGhlIGNhY2hlIGZvciBwYWdlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgY2FjaGVTaXplOiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgY3VzdG9tIGZ1bmN0aW9uIGZvciBidWlsZGluZyB0aGUgY2FjaGUga2V5IGZvciB0aGUgZ2l2ZW4gcGFnZSBudW1iZXJcclxuICAgKiBhbmQgZmlsdGVyLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgQSBzdHJpbmcgdG8gYmUgdXNlZCBhcyBjYWNoZSBrZXkuXHJcbiAgICovXHJcbiAgYnVpbGRDYWNoZUtleT86IChwYWdlTnVtYmVyOiBudW1iZXIsIGZpbHRlcjogYW55KSA9PiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHN0b3JlIGZvciB0aGUgbm9kZSBicm93c2VyIGNvbXBvbmVudC4gVGhpcyBzdG9yZSBpcyB1c2VkIHRvIGtlZXAgYVxyXG4gKiBsaXN0IG9mIG5vZGVzLCBhbmQgdG8gbG9hZCB0aGVtIGZyb20gdGhlIEFQSS4gSXQgYWxzbyBrZWVwcyB0aGUgcm9vdFxyXG4gKiBub2RlLiBFdmVyeSB0cmVlIG5vZGUgaW4gdGhlIGxpc3QgaXMgZXh0ZW5kZWQgd2l0aCBwYWdlIG51bWJlcixcclxuICogcGFnZSBjb3VudCBhbmQgdG90YWwgaXRlbXMsIHBsdXMgZXhwYW5zaW9uLXJlbGF0ZWQgbWV0YWRhdGEuXHJcbiAqIFRoZSBzdG9yZSBrZWVwcyBhIGZsYXQgbGlzdCBvZiB0aGVzZSB0cmVlIG5vZGVzLCBhbGxvd2luZyB1c2VycyB0b1xyXG4gKiBleHBhbmQgYW5kIGNvbGxhcHNlIHRoZW0uXHJcbiAqIEYgaXMgdGhlIHR5cGUgb2YgdGhlIGZpbHRlciBvYmplY3QsIEUgaXMgdGhlIHR5cGUgb2YgdGhlIHBhZ2VkIHRyZWUgbm9kZXMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUGFnZWRUcmVlU3RvcmU8XHJcbiAgRSBleHRlbmRzIFBhZ2VkVHJlZU5vZGU8Rj4sXHJcbiAgRiBleHRlbmRzIFRyZWVOb2RlRmlsdGVyXHJcbj4ge1xyXG4gIHByaXZhdGUgX3JhZGl4PzogRTtcclxuICBwcml2YXRlIF9yYWRpeExhYmVsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfcm9vdHM6IEVbXTtcclxuICBwcml2YXRlIF9ub2RlcyQ6IEJlaGF2aW9yU3ViamVjdDxFW10+O1xyXG4gIHByaXZhdGUgX3RhZ3MkOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+O1xyXG4gIHByaXZhdGUgX2ZpbHRlciQ6IEJlaGF2aW9yU3ViamVjdDxGPjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jdXN0b21DYWNoZUtleUJ1aWxkZXI/OiAoXHJcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXHJcbiAgICBmaWx0ZXI6IGFueVxyXG4gICkgPT4gc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NhY2hlOiBMUlVDYWNoZTxEYXRhUGFnZTxUcmVlTm9kZT4+O1xyXG5cclxuICBwcml2YXRlIF9wYWdlU2l6ZTogbnVtYmVyO1xyXG4gIC8vIGRpcnR5IHN0YXRlOiB0aGlzIGlzIHJlc2V0IHdoZW4gdGhlIHN0b3JlIGlzIHJlc2V0LCBhbmQgc2V0IHRvIHRydWVcclxuICAvLyB3aGVuIHRoZSBzdG9yZSBpcyBjaGFuZ2VkXHJcbiAgcHJpdmF0ZSBfZGlydHk/OiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZmxhdCBsaXN0IG9mIHBhZ2VkIG5vZGVzIGluIHRoaXMgc3RvcmUuXHJcbiAgICovXHJcbiAgcHVibGljIG5vZGVzJDogT2JzZXJ2YWJsZTxSZWFkb25seTxFW10+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGxpc3Qgb2YgdHJlZSB0YWdzIGluIHRoaXMgc3RvcmUuXHJcbiAgICovXHJcbiAgcHVibGljIHRhZ3MkOiBPYnNlcnZhYmxlPFJlYWRvbmx5PHN0cmluZ1tdPj47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBnbG9iYWwgbm9kZXMgZmlsdGVyLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaWx0ZXIkOiBPYnNlcnZhYmxlPFJlYWRvbmx5PEY+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2Ygbm9kZXMgcGFnZXMgaW4gdGhpcyBzdG9yZS4gSWYgeW91IGNoYW5nZSBpdCwgdGhlIHN0b3JlXHJcbiAgICogaXMgcmVzZXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDIwLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZTtcclxuICB9XHJcbiAgcHVibGljIHNldCBwYWdlU2l6ZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fcGFnZVNpemUgPT09IHZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3BhZ2VTaXplID0gdmFsdWU7XHJcbiAgICB0aGlzLnJlc2V0KHRoaXMuX3JhZGl4Py5sYWJlbCB8fCB0aGlzLl9yYWRpeExhYmVsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgc3RvcmUuXHJcbiAgICogQHBhcmFtIF9zZXJ2aWNlIFRoZSBzZXJ2aWNlIHVzZWQgdG8gbG9hZCBub2Rlcy5cclxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBjb25maWd1cmUgdGhpcyBzdG9yZS5cclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX3NlcnZpY2U6IFBhZ2VkVHJlZVN0b3JlU2VydmljZTxGPixcclxuICAgIG9wdGlvbnM6IFBhZ2VkVHJlZVN0b3JlT3B0aW9ucyA9IERFRkFVTFRfUEFHRURfTElTVF9TVE9SRV9PUFRJT05TXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9wYWdlU2l6ZSA9IG9wdGlvbnMucGFnZVNpemU7XHJcbiAgICB0aGlzLl9jYWNoZSA9IG5ldyBMUlVDYWNoZTxEYXRhUGFnZTxUcmVlTm9kZT4+KG9wdGlvbnMuY2FjaGVTaXplKTtcclxuICAgIHRoaXMuX2N1c3RvbUNhY2hlS2V5QnVpbGRlciA9IG9wdGlvbnMuYnVpbGRDYWNoZUtleTtcclxuICAgIHRoaXMuX3JhZGl4TGFiZWwgPSAnKHJvb3QpJztcclxuICAgIHRoaXMuX3Jvb3RzID0gW107XHJcbiAgICB0aGlzLl9ub2RlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEVbXT4oW10pO1xyXG4gICAgdGhpcy5ub2RlcyQgPSB0aGlzLl9ub2RlcyQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB0aGlzLl90YWdzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+KFtdKTtcclxuICAgIHRoaXMudGFncyQgPSB0aGlzLl90YWdzJC5hc09ic2VydmFibGUoKTtcclxuICAgIHRoaXMuX2ZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEY+KHt9IGFzIEYpO1xyXG4gICAgdGhpcy5maWx0ZXIkID0gdGhpcy5fZmlsdGVyJC5hc09ic2VydmFibGUoKTtcclxuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgIHRoaXMudXBkYXRlVGFncygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVUYWdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VydmljZS5nZXRUYWdzKCkuc3Vic2NyaWJlKCh0YWdzKSA9PiB7XHJcbiAgICAgIHRoaXMuX3RhZ3MkLm5leHQodGFncyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGdsb2JhbCBmaWx0ZXIsIGV2ZW50dWFsbHkgb3ZlcnJpZGRlbiB3aXRoIHZhbHVlc1xyXG4gICAqIGZyb20gdGhlIHNwZWNpZmllZCBub2RlJ3MgZmlsdGVyLlxyXG4gICAqIEBwYXJhbSBub2RlIFRoZSBvcHRpb25hbCBub2RlLlxyXG4gICAqIEByZXR1cm5zIFRoZSBmaWx0ZXIuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXIobm9kZT86IFBhZ2VkVHJlZU5vZGU8Rj4pOiBGIHtcclxuICAgIHJldHVybiBub2RlPy5maWx0ZXJcclxuICAgICAgPyB7XHJcbiAgICAgICAgICAuLi50aGlzLl9maWx0ZXIkLnZhbHVlLFxyXG4gICAgICAgICAgLi4ubm9kZS5maWx0ZXIsXHJcbiAgICAgICAgfVxyXG4gICAgICA6IHRoaXMuX2ZpbHRlciQudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIGFsbCB0aGUgbm9kZXMgaW4gdGhlIHN0b3JlLlxyXG4gICAqIEByZXR1cm5zIFRoZSBub2Rlcy5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0Tm9kZXMoKTogUmVhZG9ubHk8UGFnZWRUcmVlTm9kZTxGPltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBub2RlcyB0YWdzLlxyXG4gICAqIEByZXR1cm5zIFRoZSB0YWdzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRUYWdzKCk6IFJlYWRvbmx5PHN0cmluZ1tdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFncyQudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWlsZCB0aGUgY2FjaGUga2V5IGZvciB0aGUgZ2l2ZW4gcGFnZSBudW1iZXIgYW5kIGZpbHRlci5cclxuICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IHJldHVybnMgYSBzdHJpbmdpZmllZCBvYmplY3RcclxuICAgKiBjb250YWluaW5nIHRoZSBwYWdlIG51bWJlciBhbmQgdGhlIGZpbHRlci4gWW91IG1heSBvdmVycmlkZVxyXG4gICAqIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgYSBjdXN0b20gY2FjaGUga2V5LlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgQSBzdHJpbmcgdG8gYmUgdXNlZCBhcyBjYWNoZSBrZXkuXHJcbiAgICovXHJcbiAgcHVibGljIGJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlcjogbnVtYmVyLCBmaWx0ZXI6IEYpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuX2N1c3RvbUNhY2hlS2V5QnVpbGRlcikge1xyXG4gICAgICByZXR1cm4gdGhpcy5fY3VzdG9tQ2FjaGVLZXlCdWlsZGVyKHBhZ2VOdW1iZXIsIGZpbHRlcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyBwYWdlTnVtYmVyLCAuLi5maWx0ZXIgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFBhZ2VGcm9tQ2FjaGVPclNlcnZlcihcclxuICAgIGZpbHRlcjogRixcclxuICAgIHBhZ2VOdW1iZXI6IG51bWJlclxyXG4gICk6IE9ic2VydmFibGU8RGF0YVBhZ2U8VHJlZU5vZGU+PiB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIGNvbnN0IHBhZ2VJbkNhY2hlID0gdGhpcy5fY2FjaGUuZ2V0KGtleSk7XHJcblxyXG4gICAgaWYgKHBhZ2VJbkNhY2hlKSB7XHJcbiAgICAgIHJldHVybiBvZihwYWdlSW5DYWNoZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2VydmljZS5nZXROb2RlcyhmaWx0ZXIsIHBhZ2VOdW1iZXIsIHRoaXMuX3BhZ2VTaXplKS5waXBlKFxyXG4gICAgICAgIHRhcCgocGFnZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fY2FjaGUucHV0KGtleSwgcGFnZSwgMCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlUGFnZU5vZGVzKHBhZ2U6IERhdGFQYWdlPFRyZWVOb2RlPik6IFBhZ2VkVHJlZU5vZGU8Rj5bXSB7XHJcbiAgICByZXR1cm4gcGFnZS5pdGVtcy5tYXAoKG4pID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5uLFxyXG4gICAgICAgIGhhc0NoaWxkcmVuOiBuLmhhc0NoaWxkcmVuLFxyXG4gICAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgICAgcGFnZU51bWJlcjogcGFnZS5wYWdlTnVtYmVyLFxyXG4gICAgICAgICAgcGFnZUNvdW50OiBwYWdlLnBhZ2VDb3VudCxcclxuICAgICAgICAgIHRvdGFsOiBwYWdlLnRvdGFsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGZpbHRlciBmb3IgdGhpcyBzdG9yZS4gV2hlbmV2ZXIgdGhlIGZpbHRlciBpcyBzZXQsXHJcbiAgICogdGhlIHN0b3JlIGlzIHJlc2V0LlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcGFyYW0gcmFkaXhMYWJlbCBUaGUgbGFiZWwgb2YgdGhlIHJhZGl4IG5vZGUsIGlmIHRoaXMgbmVlZHMgdG8gYmUgc2V0LlxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdHJlZSB3YXMgY2hhbmdlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRGaWx0ZXIoZmlsdGVyOiBGLCByYWRpeExhYmVsPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodGhpcy5fZmlsdGVyJC52YWx1ZSA9PT0gZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZmlsdGVyJC5uZXh0KGZpbHRlcik7XHJcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNldCh0aGlzLl9yYWRpeD8ubGFiZWwgfHwgcmFkaXhMYWJlbCB8fCB0aGlzLl9yYWRpeExhYmVsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IHRoZSBzdG9yZSwgbG9hZGluZyB0aGUgcm9vdCBub2RlcyBhbmQgdGhlaXIgY2hpbGRyZW4uXHJcbiAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBvZiB0aGUgcmFkaXggbm9kZS5cclxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRyZWUgd2FzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgcmVzZXQobGFiZWw6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCF0aGlzLl9kaXJ0eSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2NhY2hlLmNsZWFyKCk7XHJcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLl9maWx0ZXIkLnZhbHVlO1xyXG4gICAgdGhpcy5fcmFkaXggPSB7XHJcbiAgICAgIGlkOiAwLFxyXG4gICAgICB5OiAwLFxyXG4gICAgICB4OiAxLFxyXG4gICAgICBsYWJlbDogbGFiZWwsXHJcbiAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgIHBhZ2VOdW1iZXI6IDAsXHJcbiAgICAgICAgcGFnZUNvdW50OiAwLFxyXG4gICAgICAgIHRvdGFsOiAwLFxyXG4gICAgICB9LFxyXG4gICAgfSBhcyBFO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuX3NlcnZpY2VcclxuICAgICAgICAuZ2V0Um9vdE5vZGVzKGZpbHRlci50YWdzKVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgc3dpdGNoTWFwKChub2RlcykgPT4ge1xyXG4gICAgICAgICAgICAvLyBubyByb290cywgY2xlYXIgYW5kIHJldHVybiBlbXB0eSBzZXRcclxuICAgICAgICAgICAgaWYgKCFub2RlcyB8fCBub2Rlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICB0aGlzLl9yb290cyA9IFtdO1xyXG4gICAgICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gZ290IHJvb3RzLCBzZXQgdGhlbSBhbmQgZ2V0IHRoZWlyIGNoaWxkcmVuXHJcbiAgICAgICAgICAgICAgdGhpcy5fcm9vdHMgPSBub2Rlcy5tYXAoXHJcbiAgICAgICAgICAgICAgICAobm9kZSkgPT5cclxuICAgICAgICAgICAgICAgICAgKHtcclxuICAgICAgICAgICAgICAgICAgICAuLi5ub2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcjogMSxcclxuICAgICAgICAgICAgICAgICAgICAgIHBhZ2VDb3VudDogMSxcclxuICAgICAgICAgICAgICAgICAgICAgIHRvdGFsOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIH0gYXMgRSlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIC8vIGZldGNoIGNoaWxkcmVuIGZvciBlYWNoIHJvb3Qgbm9kZVxyXG4gICAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3RzLm1hcCgocm9vdCkgPT5cclxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgeyAuLi5maWx0ZXIsIHBhcmVudElkOiByb290LmlkIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgMVxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocGFnZXMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHBhZ2VzLnNvbWUoKHBhZ2UpID0+IHBhZ2UudG90YWwpKSB7XHJcbiAgICAgICAgICAgICAgLy8gcmFkaXhcclxuICAgICAgICAgICAgICB0aGlzLl9yYWRpeCEuaGFzQ2hpbGRyZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3JhZGl4IS5leHBhbmRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcmFkaXghLnBhZ2luZyA9IHtcclxuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI6IDEsXHJcbiAgICAgICAgICAgICAgICBwYWdlQ291bnQ6IDEsXHJcbiAgICAgICAgICAgICAgICB0b3RhbDogcGFnZXMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgLy8gcm9vdHNcclxuICAgICAgICAgICAgICB0aGlzLl9yb290cy5mb3JFYWNoKChyb290LCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByb290Lmhhc0NoaWxkcmVuID0gISFwYWdlc1tpXS50b3RhbDtcclxuICAgICAgICAgICAgICAgIHJvb3QuZXhwYW5kZWQgPSAhIXBhZ2VzW2ldLnRvdGFsO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fcm9vdHMuZmxhdE1hcCgocm9vdCwgaSkgPT4gW1xyXG4gICAgICAgICAgICAgICAgcm9vdCxcclxuICAgICAgICAgICAgICAgIC4uLnRoaXMuY3JlYXRlUGFnZU5vZGVzKHBhZ2VzW2ldKSxcclxuICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICB0aGlzLl9ub2RlcyQubmV4dChbdGhpcy5fcmFkaXghLCAuLi4obm9kZXMgYXMgRVtdKV0pO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcm9vdHMuZm9yRWFjaCgocm9vdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcm9vdC5oYXNDaGlsZHJlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgcm9vdC5leHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KFt0aGlzLl9yYWRpeCEsIC4uLnRoaXMuX3Jvb3RzXSk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgbm9kZSBmaWx0ZXIgZm9yIHRoZSBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBJRC5cclxuICAgKiBAcGFyYW0gaWQgVGhlIG5vZGUgSUQuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRvIHNldC5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1ZSBpZiBmaWx0ZXIgd2FzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXROb2RlRmlsdGVyKGlkOiBudW1iZXIsIGZpbHRlcj86IEYgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWlkKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX25vZGVzJC52YWx1ZS5maW5kKChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICAgIGlmICghbm9kZSkge1xyXG4gICAgICAgIHJlamVjdChgTm9kZSBJRCAke2lkfSBub3QgZm91bmQgaW4gc3RvcmVgKTtcclxuICAgICAgfVxyXG4gICAgICBub2RlIS5maWx0ZXIgPSBmaWx0ZXIgfHwgdW5kZWZpbmVkO1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGFuZ2VQYWdlKGlkLCAxKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhwYW5kIHRoZSBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBJRC4gSWYgdGhlIG5vZGUgaXMgbm90IGV4cGFuZGFibGUsXHJcbiAgICogb3IgaXQgaXMgYWxyZWFkeSBleHBhbmRlZCwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLlxyXG4gICAqIEBwYXJhbSBub2RlIFRoZSBJRCBvZiB0aGUgbm9kZSB0byBleHBhbmQuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHRydWUgaWYgdGhlIG5vZGUgd2FzIGV4cGFuZGVkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGV4cGFuZChpZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWlkKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX25vZGVzJC52YWx1ZS5maW5kKChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICAgIGlmICghbm9kZSB8fCBub2RlLmhhc0NoaWxkcmVuID09PSBmYWxzZSB8fCBub2RlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZ2V0UGFnZUZyb21DYWNoZU9yU2VydmVyKFxyXG4gICAgICAgIHsgLi4udGhpcy5nZXRGaWx0ZXIobm9kZSksIHBhcmVudElkOiBpZCB9LFxyXG4gICAgICAgIDFcclxuICAgICAgKS5zdWJzY3JpYmUoKHBhZ2UpID0+IHtcclxuICAgICAgICAvLyBubyBjaGlsZHJlbiwgc2V0IGhhc0NoaWxkcmVuIHRvIGZhbHNlXHJcbiAgICAgICAgaWYgKCFwYWdlLnRvdGFsKSB7XHJcbiAgICAgICAgICBub2RlIS5oYXNDaGlsZHJlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgIC8vIGluc2VydCBwYWdlIG5vZGVzIGFmdGVyIHRoZSBjdXJyZW50IG5vZGVcclxuICAgICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBub2Rlcy5pbmRleE9mKG5vZGUhKTtcclxuICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcmVqZWN0KGBOb2RlIElEICR7aWR9IG5vdCBmb3VuZCBpbiBzdG9yZWApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcGFnZU5vZGVzID0gdGhpcy5jcmVhdGVQYWdlTm9kZXMocGFnZSk7XHJcbiAgICAgICAgICAgIG5vZGVzLnNwbGljZShpbmRleCArIDEsIDAsIC4uLihwYWdlTm9kZXMgYXMgRVtdKSk7XHJcbiAgICAgICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KG5vZGVzKTtcclxuICAgICAgICAgICAgbm9kZSEuaGFzQ2hpbGRyZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICBub2RlIS5leHBhbmRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGV4cGFuZEFsbChpZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWlkKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgLy8gZ2V0IHRoZSBwYXJlbnQgbm9kZSB0byBzdGFydCBmcm9tXHJcbiAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzJC52YWx1ZTtcclxuICAgIGNvbnN0IG5vZGVJbmRleCA9IG5vZGVzLmZpbmRJbmRleCgobikgPT4gbi5pZCA9PT0gaWQpO1xyXG4gICAgaWYgKG5vZGVJbmRleCA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY29sbGVjdCBhbGwgdGhlIGRlc2NlbmRhbnQgbm9kZXMgSURzXHJcbiAgICBsZXQgaSA9IG5vZGVJbmRleCArIDE7XHJcbiAgICB3aGlsZSAoaSA8IG5vZGVzLmxlbmd0aCAmJiBub2Rlc1tpXS55ID4gbm9kZXNbbm9kZUluZGV4XS55KSB7XHJcbiAgICAgIGkrKztcclxuICAgIH1cclxuICAgIGNvbnN0IG5vZGVzVG9FeHBhbmQgPSBub2Rlcy5zbGljZShub2RlSW5kZXgsIGkpLm1hcCgobikgPT4gbi5pZCk7XHJcblxyXG4gICAgLy8gZXhwYW5kIGFsbCB0aGUgZGVzY2VuZGFudCBub2Rlc1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbm9kZXNUb0V4cGFuZC5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kKGlkKTtcclxuICAgICAgICB0aGlzLmV4cGFuZEFsbChpZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2hpbGRyZW4oaWQ6IG51bWJlcik6IEVbXSB7XHJcbiAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgIGlmICghbm9kZSB8fCBub2RlLmhhc0NoaWxkcmVuID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzJC52YWx1ZTtcclxuICAgIGNvbnN0IGluZGV4ID0gbm9kZXMuaW5kZXhPZihub2RlKTtcclxuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY2hpbGRyZW46IEVbXSA9IFtdO1xyXG4gICAgbGV0IGkgPSBpbmRleCArIDE7XHJcbiAgICB3aGlsZSAoaSA8IG5vZGVzLmxlbmd0aCAmJiBub2Rlc1tpXS55ID4gbm9kZS55KSB7XHJcbiAgICAgIGNoaWxkcmVuLnB1c2gobm9kZXNbaV0pO1xyXG4gICAgICBpKys7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hpbGRyZW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZURlc2NlbmRhbnRzKFxyXG4gICAgbm9kZXM6IFBhZ2VkVHJlZU5vZGU8Rj5bXSxcclxuICAgIG5vZGVJbmRleDogbnVtYmVyXHJcbiAgKTogdm9pZCB7XHJcbiAgICBsZXQgaSA9IG5vZGVJbmRleCArIDE7XHJcbiAgICB3aGlsZSAoaSA8IG5vZGVzLmxlbmd0aCAmJiBub2Rlc1tpXS55ID4gbm9kZXNbbm9kZUluZGV4XS55KSB7XHJcbiAgICAgIGkrKztcclxuICAgIH1cclxuICAgIG5vZGVzLnNwbGljZShub2RlSW5kZXggKyAxLCBpIC0gbm9kZUluZGV4IC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2xsYXBzZSB0aGUgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQuIElmIHRoZSBub2RlIGlzIG5vdCBleHBhbmRhYmxlLFxyXG4gICAqIG9yIGl0IGlzIGFscmVhZHkgY29sbGFwc2VkLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gY29sbGFwc2UuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHRydWUgaWYgdGhlIG5vZGUgd2FzIGNvbGxhcHNlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjb2xsYXBzZShpZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWlkKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX25vZGVzJC52YWx1ZS5maW5kKChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICAgIGlmICghbm9kZSB8fCBub2RlLmhhc0NoaWxkcmVuID09PSBmYWxzZSB8fCAhbm9kZS5leHBhbmRlZCkge1xyXG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyByZW1vdmUgYWxsIHRoZSBkZXNjZW5kYW50IG5vZGVzIGFmdGVyIHRoZSBjdXJyZW50IG5vZGVcclxuICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICAgIGNvbnN0IG5vZGVJbmRleCA9IG5vZGVzLmluZGV4T2Yobm9kZSEpO1xyXG4gICAgICBpZiAobm9kZUluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHJlamVjdChgTm9kZSBJRCAke2lkfSBub3QgZm91bmQgaW4gc3RvcmVgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVEZXNjZW5kYW50cyhub2Rlcywgbm9kZUluZGV4KTtcclxuICAgICAgICB0aGlzLl9ub2RlcyQubmV4dChub2Rlcyk7XHJcbiAgICAgICAgbm9kZSEuZXhwYW5kZWQgPSBmYWxzZTtcclxuICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSB0aGUgcGFnZSBpbmNsdWRpbmcgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELlxyXG4gICAqIEBwYXJhbSBub2RlIFRoZSBwYXJlbnQgbm9kZSB3aG9zZSBjaGlsZHJlbiBhcmUgaW5zaWRlIHRoZSBwYWdlIHlvdSB3YW50IHRvIGNoYW5nZS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgbmV3IHBhZ2UgbnVtYmVyLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVlIGlmIHRoZSBwYWdlIHdhcyBjaGFuZ2VkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGNoYW5nZVBhZ2UocGFyZW50SWQ6IG51bWJlciwgcGFnZU51bWJlcjogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IHBhcmVudElkKTtcclxuICAgICAgaWYgKCFwYXJlbnROb2RlKSB7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5nZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICAgICAgeyAuLi50aGlzLmdldEZpbHRlcihwYXJlbnROb2RlKSwgcGFyZW50SWQgfSxcclxuICAgICAgICBwYWdlTnVtYmVyXHJcbiAgICAgICkuc3Vic2NyaWJlKChwYWdlKSA9PiB7XHJcbiAgICAgICAgLy8gaWYgcGFnZSBpcyBlbXB0eSBkbyBub3RoaW5nXHJcbiAgICAgICAgaWYgKCFwYWdlLnRvdGFsKSB7XHJcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgbm9kZXMgaW4gdGhlIHNhbWUgcGFnZSBvZiBub2RlXHJcbiAgICAgICAgICAvLyB3aXRoIGFsbCB0aGVpciBkZXNjZW5kYW50c1xyXG4gICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBub2Rlcy5pbmRleE9mKHBhcmVudE5vZGUhKSArIDE7XHJcbiAgICAgICAgICBjb25zdCBwYWdlTm9kZXMgPSB0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKTtcclxuICAgICAgICAgIC8vIGZpbmQgdGhlIGZpcnN0IG5vZGUgb2YgdGhlIG5vZGUncyBwYWdlXHJcbiAgICAgICAgICBsZXQgc3RhcnQgPSBub2RlSW5kZXg7XHJcbiAgICAgICAgICBjb25zdCBvbGRQYWdlTnIgPSBub2Rlc1tzdGFydF0ucGFnaW5nLnBhZ2VOdW1iZXI7XHJcbiAgICAgICAgICB3aGlsZSAoXHJcbiAgICAgICAgICAgIHN0YXJ0ID4gMCAmJlxyXG4gICAgICAgICAgICBub2Rlc1tzdGFydCAtIDFdLnBhcmVudElkID09PSBwYXJlbnRJZCAmJlxyXG4gICAgICAgICAgICBub2Rlc1tzdGFydCAtIDFdLnBhZ2luZy5wYWdlTnVtYmVyID09PSBvbGRQYWdlTnJcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBzdGFydC0tO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gZmluZCB0aGUgbGFzdCBub2RlIG9mIHRoZSBub2RlJ3MgcGFnZSxcclxuICAgICAgICAgIC8vIGluY2x1ZGluZyBhbGwgdGhlaXIgZGVzY2VuZGFudHNcclxuICAgICAgICAgIGxldCBlbmQgPSBub2RlSW5kZXggKyAxO1xyXG4gICAgICAgICAgd2hpbGUgKFxyXG4gICAgICAgICAgICBlbmQgPCBub2Rlcy5sZW5ndGggJiZcclxuICAgICAgICAgICAgbm9kZXNbZW5kXS5wYXJlbnRJZCA9PT0gcGFyZW50SWQgJiZcclxuICAgICAgICAgICAgbm9kZXNbZW5kXS5wYWdpbmcucGFnZU51bWJlciA9PT0gb2xkUGFnZU5yXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgZW5kKys7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyByZXBsYWNlIGFsbCB0aGVzZSBub2RlcyB3aXRoIHRoZSBuZXcgb25lc1xyXG4gICAgICAgICAgbm9kZXMuc3BsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCk7XHJcbiAgICAgICAgICBub2Rlcy5zcGxpY2Uoc3RhcnQsIDAsIC4uLihwYWdlTm9kZXMgYXMgRVtdKSk7XHJcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHBhcmVudCBub2RlIHBhZ2luZyBpbmZvXHJcbiAgICAgICAgICBwYXJlbnROb2RlIS5wYWdpbmcucGFnZU51bWJlciA9IHBhZ2UucGFnZU51bWJlcjtcclxuICAgICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KG5vZGVzKTtcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGFwc2UgYWxsIHRoZSBub2RlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgcHVibGljIGNvbGxhcHNlQWxsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbm9kZXMkLm5leHQoW3RoaXMuX3JhZGl4ISwgLi4udGhpcy5fcm9vdHNdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBjYWNoZS5cclxuICAgKi9cclxuICBwdWJsaWMgY2xlYXJDYWNoZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhY2hlLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiB0aGUgcGFnZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgYW5kIGZpbHRlciBpcyBpbiBjYWNoZS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHBhZ2UgaXMgaW4gY2FjaGUsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgaGFzQ2FjaGVkUGFnZShwYWdlTnVtYmVyOiBudW1iZXIsIGZpbHRlcjogRik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5idWlsZENhY2hlS2V5KHBhZ2VOdW1iZXIsIGZpbHRlcik7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FjaGUuaGFzKGtleSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
435
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtdHJlZS5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC10cmVlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxlQUFlLEVBRWYsUUFBUSxFQUNSLEVBQUUsRUFDRixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBSWQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQWdHdEU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQW9DekI7OztPQUdHO0lBQ0gsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDN0IsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQ1UsUUFBa0MsRUFDMUMsVUFBaUMsZ0NBQWdDO1FBRHpELGFBQVEsR0FBUixRQUFRLENBQTBCO1FBRzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksUUFBUSxDQUFxQixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE9B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aEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEJlaGF2aW9yU3ViamVjdCxcclxuICBPYnNlcnZhYmxlLFxyXG4gIGZvcmtKb2luLFxyXG4gIG9mLFxyXG4gIHN3aXRjaE1hcCxcclxuICB0YXAsXHJcbn0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBEYXRhUGFnZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcblxyXG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4vbHJ1LWNhY2hlJztcclxuaW1wb3J0IHsgREVGQVVMVF9QQUdFRF9MSVNUX1NUT1JFX09QVElPTlMgfSBmcm9tICcuL3BhZ2VkLWxpc3Quc3RvcmUnO1xyXG5cclxuLyoqXHJcbiAqIEEgdHJlZSBub2RlLiBZb3VyIGRhdGEgc2VydmljZSBzaG91bGQgcmV0dXJuIGEgbGlzdCBvZiB0aGVzZSBub2Rlc1xyXG4gKiBvciBvZiBhbnkgdHlwZSBleHRlbmRpbmcgdGhpcyBpbnRlcmZhY2UuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVOb2RlIHtcclxuICBpZDogbnVtYmVyO1xyXG4gIHBhcmVudElkPzogbnVtYmVyO1xyXG4gIHk6IG51bWJlcjtcclxuICB4OiBudW1iZXI7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB0YWc/OiBzdHJpbmc7XHJcbiAgaGFzQ2hpbGRyZW4/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogQSBmaWx0ZXIgZm9yIHRyZWUgbm9kZXMuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVOb2RlRmlsdGVyIHtcclxuICB0YWdzPzogc3RyaW5nW107XHJcbiAgcGFyZW50SWQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQYWdpbmcgaW5mb3JtYXRpb24gZm9yIGEgcGFnZWQgdHJlZSBub2RlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmdJbmZvIHtcclxuICBwYWdlTnVtYmVyOiBudW1iZXI7XHJcbiAgcGFnZUNvdW50OiBudW1iZXI7XHJcbiAgdG90YWw6IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgdHJlZSBub2RlIHdpdGggcGFnaW5nIGluZm9ybWF0aW9uLCB1c2VkIGluIE5vZGVCcm93c2VyU3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkVHJlZU5vZGU8RiBleHRlbmRzIFRyZWVOb2RlRmlsdGVyPiBleHRlbmRzIFRyZWVOb2RlIHtcclxuICBwYWdpbmc6IFBhZ2luZ0luZm87XHJcbiAgZXhwYW5kZWQ/OiBib29sZWFuO1xyXG4gIGZpbHRlcj86IEY7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgaW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzZXJ2aWNlIHVzZWQgYnkgTm9kZUJyb3dzZXJTdG9yZVxyXG4gKiB0byBsb2FkIG5vZGVzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdlZFRyZWVTdG9yZVNlcnZpY2U8RiBleHRlbmRzIFRyZWVOb2RlRmlsdGVyPiB7XHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCB0aGUgcm9vdCBub2Rlcywgb3IganVzdCB0aGUgb25lcyBoYXZpbmcgb25lIG9mIHRoZSBzcGVjaWZpZWRcclxuICAgKiB0YWdzLlxyXG4gICAqIEBwYXJhbSB0YWdzIFRoZSBvcHRpb25hbCB0YWdzIHRvIGZpbHRlciB0aGUgcm9vdCBub2Rlcy5cclxuICAgKi9cclxuICBnZXRSb290Tm9kZXModGFncz86IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxUcmVlTm9kZVtdPjtcclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBzcGVjaWZpZWQgcGFnZSBvZiBub2Rlcy5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSBUaGUgcGFnZSBzaXplLlxyXG4gICAqL1xyXG4gIGdldE5vZGVzKFxyXG4gICAgZmlsdGVyOiBGLFxyXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxyXG4gICAgcGFnZVNpemU6IG51bWJlclxyXG4gICk6IE9ic2VydmFibGU8RGF0YVBhZ2U8VHJlZU5vZGU+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBsaXN0IG9mIHVuaXF1ZSBub2RlIHRhZ3MuIEVhY2ggdGFnIGNvcnJlc3BvbmRzIHRvIGEgdHJlZSxcclxuICAgKiBhcyBub2RlcyBhcmUgdmlydHVhbGx5IGdyb3VwZWQgYnkgdGhlaXIgdGFnLlxyXG4gICAqL1xyXG4gIGdldFRhZ3MoKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGZvciB0aGUgTm9kZUJyb3dzZXJTdG9yZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZWRUcmVlU3RvcmVPcHRpb25zIHtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiBwYWdlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgcGFnZVNpemU6IG51bWJlcjtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgY2FjaGUgZm9yIHBhZ2VzIGluIHRoZSBzdG9yZS5cclxuICAgKi9cclxuICBjYWNoZVNpemU6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogQSBjdXN0b20gZnVuY3Rpb24gZm9yIGJ1aWxkaW5nIHRoZSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBwYWdlIG51bWJlclxyXG4gICAqIGFuZCBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBBIHN0cmluZyB0byBiZSB1c2VkIGFzIGNhY2hlIGtleS5cclxuICAgKi9cclxuICBidWlsZENhY2hlS2V5PzogKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBhbnkpID0+IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3RvcmUgZm9yIHRoZSBub2RlIGJyb3dzZXIgY29tcG9uZW50LiBUaGlzIHN0b3JlIGlzIHVzZWQgdG8ga2VlcCBhXHJcbiAqIGxpc3Qgb2Ygbm9kZXMsIGFuZCB0byBsb2FkIHRoZW0gZnJvbSB0aGUgQVBJLiBJdCBhbHNvIGtlZXBzIHRoZSByb290XHJcbiAqIG5vZGUuIEV2ZXJ5IHRyZWUgbm9kZSBpbiB0aGUgbGlzdCBpcyBleHRlbmRlZCB3aXRoIHBhZ2UgbnVtYmVyLFxyXG4gKiBwYWdlIGNvdW50IGFuZCB0b3RhbCBpdGVtcywgcGx1cyBleHBhbnNpb24tcmVsYXRlZCBtZXRhZGF0YS5cclxuICogVGhlIHN0b3JlIGtlZXBzIGEgZmxhdCBsaXN0IG9mIHRoZXNlIHRyZWUgbm9kZXMsIGFsbG93aW5nIHVzZXJzIHRvXHJcbiAqIGV4cGFuZCBhbmQgY29sbGFwc2UgdGhlbS5cclxuICogRiBpcyB0aGUgdHlwZSBvZiB0aGUgZmlsdGVyIG9iamVjdCwgRSBpcyB0aGUgdHlwZSBvZiB0aGUgcGFnZWQgdHJlZSBub2Rlcy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBQYWdlZFRyZWVTdG9yZTxcclxuICBFIGV4dGVuZHMgUGFnZWRUcmVlTm9kZTxGPixcclxuICBGIGV4dGVuZHMgVHJlZU5vZGVGaWx0ZXJcclxuPiB7XHJcbiAgcHJpdmF0ZSBfcmFkaXg/OiBFO1xyXG4gIHByaXZhdGUgX3JhZGl4TGFiZWw6IHN0cmluZztcclxuICBwcml2YXRlIF9yb290czogRVtdO1xyXG4gIHByaXZhdGUgX25vZGVzJDogQmVoYXZpb3JTdWJqZWN0PEVbXT47XHJcbiAgcHJpdmF0ZSBfdGFncyQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT47XHJcbiAgcHJpdmF0ZSBfZmlsdGVyJDogQmVoYXZpb3JTdWJqZWN0PEY+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1c3RvbUNhY2hlS2V5QnVpbGRlcj86IChcclxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcclxuICAgIGZpbHRlcjogYW55XHJcbiAgKSA9PiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfY2FjaGU6IExSVUNhY2hlPERhdGFQYWdlPFRyZWVOb2RlPj47XHJcblxyXG4gIHByaXZhdGUgX3BhZ2VTaXplOiBudW1iZXI7XHJcbiAgLy8gZGlydHkgc3RhdGU6IHRoaXMgaXMgcmVzZXQgd2hlbiB0aGUgc3RvcmUgaXMgcmVzZXQsIGFuZCBzZXQgdG8gdHJ1ZVxyXG4gIC8vIHdoZW4gdGhlIHN0b3JlIGlzIGNoYW5nZWRcclxuICBwcml2YXRlIF9kaXJ0eT86IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmbGF0IGxpc3Qgb2YgcGFnZWQgbm9kZXMgaW4gdGhpcyBzdG9yZS5cclxuICAgKi9cclxuICBwdWJsaWMgbm9kZXMkOiBPYnNlcnZhYmxlPFJlYWRvbmx5PEVbXT4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgbGlzdCBvZiB0cmVlIHRhZ3MgaW4gdGhpcyBzdG9yZS5cclxuICAgKi9cclxuICBwdWJsaWMgdGFncyQ6IE9ic2VydmFibGU8UmVhZG9ubHk8c3RyaW5nW10+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGdsb2JhbCBub2RlcyBmaWx0ZXIuXHJcbiAgICovXHJcbiAgcHVibGljIGZpbHRlciQ6IE9ic2VydmFibGU8UmVhZG9ubHk8Rj4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiBub2RlcyBwYWdlcyBpbiB0aGlzIHN0b3JlLiBJZiB5b3UgY2hhbmdlIGl0LCB0aGUgc3RvcmVcclxuICAgKiBpcyByZXNldC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMjAuXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBwYWdlU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VTaXplO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl9wYWdlU2l6ZSA9PT0gdmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcGFnZVNpemUgPSB2YWx1ZTtcclxuICAgIHRoaXMucmVzZXQodGhpcy5fcmFkaXg/LmxhYmVsIHx8IHRoaXMuX3JhZGl4TGFiZWwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBzdG9yZS5cclxuICAgKiBAcGFyYW0gX3NlcnZpY2UgVGhlIHNlcnZpY2UgdXNlZCB0byBsb2FkIG5vZGVzLlxyXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGlzIHN0b3JlLlxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc2VydmljZTogUGFnZWRUcmVlU3RvcmVTZXJ2aWNlPEY+LFxyXG4gICAgb3B0aW9uczogUGFnZWRUcmVlU3RvcmVPcHRpb25zID0gREVGQVVMVF9QQUdFRF9MSVNUX1NUT1JFX09QVElPTlNcclxuICApIHtcclxuICAgIHRoaXMuX3BhZ2VTaXplID0gb3B0aW9ucy5wYWdlU2l6ZTtcclxuICAgIHRoaXMuX2NhY2hlID0gbmV3IExSVUNhY2hlPERhdGFQYWdlPFRyZWVOb2RlPj4ob3B0aW9ucy5jYWNoZVNpemUpO1xyXG4gICAgdGhpcy5fY3VzdG9tQ2FjaGVLZXlCdWlsZGVyID0gb3B0aW9ucy5idWlsZENhY2hlS2V5O1xyXG4gICAgdGhpcy5fcmFkaXhMYWJlbCA9ICcocm9vdCknO1xyXG4gICAgdGhpcy5fcm9vdHMgPSBbXTtcclxuICAgIHRoaXMuX25vZGVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RVtdPihbXSk7XHJcbiAgICB0aGlzLm5vZGVzJCA9IHRoaXMuX25vZGVzJC5hc09ic2VydmFibGUoKTtcclxuICAgIHRoaXMuX3RhZ3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xyXG4gICAgdGhpcy50YWdzJCA9IHRoaXMuX3RhZ3MkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgdGhpcy5fZmlsdGVyJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rj4oe30gYXMgRik7XHJcbiAgICB0aGlzLmZpbHRlciQgPSB0aGlzLl9maWx0ZXIkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgdGhpcy51cGRhdGVUYWdzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVRhZ3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXJ2aWNlLmdldFRhZ3MoKS5zdWJzY3JpYmUoKHRhZ3MpID0+IHtcclxuICAgICAgdGhpcy5fdGFncyQubmV4dCh0YWdzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgZ2xvYmFsIGZpbHRlciwgZXZlbnR1YWxseSBvdmVycmlkZGVuIHdpdGggdmFsdWVzXHJcbiAgICogZnJvbSB0aGUgc3BlY2lmaWVkIG5vZGUncyBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIG9wdGlvbmFsIG5vZGUuXHJcbiAgICogQHJldHVybnMgVGhlIGZpbHRlci5cclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbHRlcihub2RlPzogUGFnZWRUcmVlTm9kZTxGPik6IEYge1xyXG4gICAgcmV0dXJuIG5vZGU/LmZpbHRlclxyXG4gICAgICA/IHtcclxuICAgICAgICAgIC4uLnRoaXMuX2ZpbHRlciQudmFsdWUsXHJcbiAgICAgICAgICAuLi5ub2RlLmZpbHRlcixcclxuICAgICAgICB9XHJcbiAgICAgIDogdGhpcy5fZmlsdGVyJC52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgYWxsIHRoZSBub2RlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICogQHJldHVybnMgVGhlIG5vZGVzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXROb2RlcygpOiBSZWFkb25seTxQYWdlZFRyZWVOb2RlPEY+W10+IHtcclxuICAgIHJldHVybiB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIG5vZGVzIHRhZ3MuXHJcbiAgICogQHJldHVybnMgVGhlIHRhZ3MuXHJcbiAgICovXHJcbiAgcHVibGljIGdldFRhZ3MoKTogUmVhZG9ubHk8c3RyaW5nW10+IHtcclxuICAgIHJldHVybiB0aGlzLl90YWdzJC52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkIHRoZSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBwYWdlIG51bWJlciBhbmQgZmlsdGVyLlxyXG4gICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgcmV0dXJucyBhIHN0cmluZ2lmaWVkIG9iamVjdFxyXG4gICAqIGNvbnRhaW5pbmcgdGhlIHBhZ2UgbnVtYmVyIGFuZCB0aGUgZmlsdGVyLiBZb3UgbWF5IG92ZXJyaWRlXHJcbiAgICogdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBhIGN1c3RvbSBjYWNoZSBrZXkuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBBIHN0cmluZyB0byBiZSB1c2VkIGFzIGNhY2hlIGtleS5cclxuICAgKi9cclxuICBwdWJsaWMgYnVpbGRDYWNoZUtleShwYWdlTnVtYmVyOiBudW1iZXIsIGZpbHRlcjogRik6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fY3VzdG9tQ2FjaGVLZXlCdWlsZGVyKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jdXN0b21DYWNoZUtleUJ1aWxkZXIocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIH1cclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHBhZ2VOdW1iZXIsIC4uLmZpbHRlciB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UGFnZUZyb21DYWNoZU9yU2VydmVyKFxyXG4gICAgZmlsdGVyOiBGLFxyXG4gICAgcGFnZU51bWJlcjogbnVtYmVyXHJcbiAgKTogT2JzZXJ2YWJsZTxEYXRhUGFnZTxUcmVlTm9kZT4+IHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMuYnVpbGRDYWNoZUtleShwYWdlTnVtYmVyLCBmaWx0ZXIpO1xyXG4gICAgY29uc3QgcGFnZUluQ2FjaGUgPSB0aGlzLl9jYWNoZS5nZXQoa2V5KTtcclxuXHJcbiAgICBpZiAocGFnZUluQ2FjaGUpIHtcclxuICAgICAgcmV0dXJuIG9mKHBhZ2VJbkNhY2hlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlLmdldE5vZGVzKGZpbHRlciwgcGFnZU51bWJlciwgdGhpcy5fcGFnZVNpemUpLnBpcGUoXHJcbiAgICAgICAgdGFwKChwYWdlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9jYWNoZS5wdXQoa2V5LCBwYWdlLCAwKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVQYWdlTm9kZXMocGFnZTogRGF0YVBhZ2U8VHJlZU5vZGU+KTogUGFnZWRUcmVlTm9kZTxGPltdIHtcclxuICAgIHJldHVybiBwYWdlLml0ZW1zLm1hcCgobikgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLm4sXHJcbiAgICAgICAgaGFzQ2hpbGRyZW46IG4uaGFzQ2hpbGRyZW4sXHJcbiAgICAgICAgcGFnaW5nOiB7XHJcbiAgICAgICAgICBwYWdlTnVtYmVyOiBwYWdlLnBhZ2VOdW1iZXIsXHJcbiAgICAgICAgICBwYWdlQ291bnQ6IHBhZ2UucGFnZUNvdW50LFxyXG4gICAgICAgICAgdG90YWw6IHBhZ2UudG90YWwsXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgZmlsdGVyIGZvciB0aGlzIHN0b3JlLiBXaGVuZXZlciB0aGUgZmlsdGVyIGlzIHNldCxcclxuICAgKiB0aGUgc3RvcmUgaXMgcmVzZXQuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEBwYXJhbSByYWRpeExhYmVsIFRoZSBsYWJlbCBvZiB0aGUgcmFkaXggbm9kZSwgaWYgdGhpcyBuZWVkcyB0byBiZSBzZXQuXHJcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0cmVlIHdhcyBjaGFuZ2VkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIHNldEZpbHRlcihmaWx0ZXI6IEYsIHJhZGl4TGFiZWw/OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLl9maWx0ZXIkLnZhbHVlID09PSBmaWx0ZXIpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9maWx0ZXIkLm5leHQoZmlsdGVyKTtcclxuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgIHJldHVybiB0aGlzLnJlc2V0KHRoaXMuX3JhZGl4Py5sYWJlbCB8fCByYWRpeExhYmVsIHx8IHRoaXMuX3JhZGl4TGFiZWwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgdGhlIHN0b3JlLCBsb2FkaW5nIHRoZSByb290IG5vZGVzIGFuZCB0aGVpciBjaGlsZHJlbi5cclxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIG9mIHRoZSByYWRpeCBub2RlLlxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdHJlZSB3YXMgY2hhbmdlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyByZXNldChsYWJlbDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuX2RpcnR5KSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuX2ZpbHRlciQudmFsdWU7XHJcbiAgICB0aGlzLl9yYWRpeCA9IHtcclxuICAgICAgaWQ6IDAsXHJcbiAgICAgIHk6IDAsXHJcbiAgICAgIHg6IDEsXHJcbiAgICAgIGxhYmVsOiBsYWJlbCxcclxuICAgICAgcGFnaW5nOiB7XHJcbiAgICAgICAgcGFnZU51bWJlcjogMCxcclxuICAgICAgICBwYWdlQ291bnQ6IDAsXHJcbiAgICAgICAgdG90YWw6IDAsXHJcbiAgICAgIH0sXHJcbiAgICB9IGFzIEU7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5fc2VydmljZVxyXG4gICAgICAgIC5nZXRSb290Tm9kZXMoZmlsdGVyLnRhZ3MpXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBzd2l0Y2hNYXAoKG5vZGVzKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIG5vIHJvb3RzLCBjbGVhciBhbmQgcmV0dXJuIGVtcHR5IHNldFxyXG4gICAgICAgICAgICBpZiAoIW5vZGVzIHx8IG5vZGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3Jvb3RzID0gW107XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBnb3Qgcm9vdHMsIHNldCB0aGVtIGFuZCBnZXQgdGhlaXIgY2hpbGRyZW5cclxuICAgICAgICAgICAgICB0aGlzLl9yb290cyA9IG5vZGVzLm1hcChcclxuICAgICAgICAgICAgICAgIChub2RlKSA9PlxyXG4gICAgICAgICAgICAgICAgICAoe1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLm5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFnaW5nOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFnZUNvdW50OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdG90YWw6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgfSBhcyBFKVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgLy8gZmV0Y2ggY2hpbGRyZW4gZm9yIGVhY2ggcm9vdCBub2RlXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcm9vdHMubWFwKChyb290KSA9PlxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmdldFBhZ2VGcm9tQ2FjaGVPclNlcnZlcihcclxuICAgICAgICAgICAgICAgICAgICB7IC4uLmZpbHRlciwgcGFyZW50SWQ6IHJvb3QuaWQgfSxcclxuICAgICAgICAgICAgICAgICAgICAxXHJcbiAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChwYWdlcykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9kaXJ0eSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAocGFnZXMuc29tZSgocGFnZSkgPT4gcGFnZS50b3RhbCkpIHtcclxuICAgICAgICAgICAgICAvLyByYWRpeFxyXG4gICAgICAgICAgICAgIHRoaXMuX3JhZGl4IS5oYXNDaGlsZHJlbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcmFkaXghLmV4cGFuZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLl9yYWRpeCEucGFnaW5nID0ge1xyXG4gICAgICAgICAgICAgICAgcGFnZU51bWJlcjogMSxcclxuICAgICAgICAgICAgICAgIHBhZ2VDb3VudDogMSxcclxuICAgICAgICAgICAgICAgIHRvdGFsOiBwYWdlcy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAvLyByb290c1xyXG4gICAgICAgICAgICAgIHRoaXMuX3Jvb3RzLmZvckVhY2goKHJvb3QsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgIHJvb3QuaGFzQ2hpbGRyZW4gPSAhIXBhZ2VzW2ldLnRvdGFsO1xyXG4gICAgICAgICAgICAgICAgcm9vdC5leHBhbmRlZCA9ICEhcGFnZXNbaV0udG90YWw7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9yb290cy5mbGF0TWFwKChyb290LCBpKSA9PiBbXHJcbiAgICAgICAgICAgICAgICByb290LFxyXG4gICAgICAgICAgICAgICAgLi4udGhpcy5jcmVhdGVQYWdlTm9kZXMocGFnZXNbaV0pLFxyXG4gICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KFt0aGlzLl9yYWRpeCEsIC4uLihub2RlcyBhcyBFW10pXSk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLl9yb290cy5mb3JFYWNoKChyb290KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByb290Lmhhc0NoaWxkcmVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByb290LmV4cGFuZGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5fbm9kZXMkLm5leHQoW3RoaXMuX3JhZGl4ISwgLi4udGhpcy5fcm9vdHNdKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBub2RlIGZpbHRlciBmb3IgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELlxyXG4gICAqIEBwYXJhbSBpZCBUaGUgbm9kZSBJRC5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gc2V0LlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVlIGlmIGZpbHRlciB3YXMgc2V0LCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIHNldE5vZGVGaWx0ZXIoaWQ6IG51bWJlciwgZmlsdGVyPzogRiB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlKSB7XHJcbiAgICAgICAgcmVqZWN0KGBOb2RlIElEICR7aWR9IG5vdCBmb3VuZCBpbiBzdG9yZWApO1xyXG4gICAgICB9XHJcbiAgICAgIG5vZGUhLmZpbHRlciA9IGZpbHRlciB8fCB1bmRlZmluZWQ7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoYW5nZVBhZ2UoaWQsIDEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHBhbmQgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELiBJZiB0aGUgbm9kZSBpcyBub3QgZXhwYW5kYWJsZSxcclxuICAgKiBvciBpdCBpcyBhbHJlYWR5IGV4cGFuZGVkLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIElEIG9mIHRoZSBub2RlIHRvIGV4cGFuZC5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1ZSBpZiB0aGUgbm9kZSB3YXMgZXhwYW5kZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgZXhwYW5kKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlIHx8IG5vZGUuZXhwYW5kZWQpIHtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5nZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICAgICAgeyAuLi50aGlzLmdldEZpbHRlcihub2RlKSwgcGFyZW50SWQ6IGlkIH0sXHJcbiAgICAgICAgMVxyXG4gICAgICApLnN1YnNjcmliZSgocGFnZSkgPT4ge1xyXG4gICAgICAgIC8vIG5vIGNoaWxkcmVuLCBzZXQgaGFzQ2hpbGRyZW4gdG8gZmFsc2VcclxuICAgICAgICBpZiAoIXBhZ2UudG90YWwpIHtcclxuICAgICAgICAgIG5vZGUhLmhhc0NoaWxkcmVuID0gZmFsc2U7XHJcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gaW5zZXJ0IHBhZ2Ugbm9kZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgbm9kZVxyXG4gICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IG5vZGVzLmluZGV4T2Yobm9kZSEpO1xyXG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZWplY3QoYE5vZGUgSUQgJHtpZH0gbm90IGZvdW5kIGluIHN0b3JlYCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBwYWdlTm9kZXMgPSB0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKTtcclxuICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGluZGV4ICsgMSwgMCwgLi4uKHBhZ2VOb2RlcyBhcyBFW10pKTtcclxuICAgICAgICAgICAgdGhpcy5fbm9kZXMkLm5leHQobm9kZXMpO1xyXG4gICAgICAgICAgICBub2RlIS5oYXNDaGlsZHJlbiA9IHRydWU7XHJcbiAgICAgICAgICAgIG5vZGUhLmV4cGFuZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXhwYW5kQWxsKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICAvLyBnZXQgdGhlIHBhcmVudCBub2RlIHRvIHN0YXJ0IGZyb21cclxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gICAgY29uc3Qgbm9kZUluZGV4ID0gbm9kZXMuZmluZEluZGV4KChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICBpZiAobm9kZUluZGV4ID09PSAtMSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb2xsZWN0IGFsbCB0aGUgZGVzY2VuZGFudCBub2RlcyBJRHNcclxuICAgIGxldCBpID0gbm9kZUluZGV4ICsgMTtcclxuICAgIHdoaWxlIChpIDwgbm9kZXMubGVuZ3RoICYmIG5vZGVzW2ldLnkgPiBub2Rlc1tub2RlSW5kZXhdLnkpIHtcclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm9kZXNUb0V4cGFuZCA9IG5vZGVzLnNsaWNlKG5vZGVJbmRleCwgaSkubWFwKChuKSA9PiBuLmlkKTtcclxuXHJcbiAgICAvLyBleHBhbmQgYWxsIHRoZSBkZXNjZW5kYW50IG5vZGVzXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBub2Rlc1RvRXhwYW5kLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgdGhpcy5leHBhbmQoaWQpO1xyXG4gICAgICAgIHRoaXMuZXhwYW5kQWxsKGlkKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDaGlsZHJlbihpZDogbnVtYmVyKTogRVtdIHtcclxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9ub2RlcyQudmFsdWUuZmluZCgobikgPT4gbi5pZCA9PT0gaWQpO1xyXG4gICAgaWYgKCFub2RlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gICAgY29uc3QgaW5kZXggPSBub2Rlcy5pbmRleE9mKG5vZGUpO1xyXG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBjb25zdCBjaGlsZHJlbjogRVtdID0gW107XHJcbiAgICBsZXQgaSA9IGluZGV4ICsgMTtcclxuICAgIHdoaWxlIChpIDwgbm9kZXMubGVuZ3RoICYmIG5vZGVzW2ldLnkgPiBub2RlLnkpIHtcclxuICAgICAgY2hpbGRyZW4ucHVzaChub2Rlc1tpXSk7XHJcbiAgICAgIGkrKztcclxuICAgIH1cclxuICAgIHJldHVybiBjaGlsZHJlbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRGVzY2VuZGFudHMoXHJcbiAgICBub2RlczogUGFnZWRUcmVlTm9kZTxGPltdLFxyXG4gICAgbm9kZUluZGV4OiBudW1iZXJcclxuICApOiB2b2lkIHtcclxuICAgIGxldCBpID0gbm9kZUluZGV4ICsgMTtcclxuICAgIHdoaWxlIChpIDwgbm9kZXMubGVuZ3RoICYmIG5vZGVzW2ldLnkgPiBub2Rlc1tub2RlSW5kZXhdLnkpIHtcclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgbm9kZXMuc3BsaWNlKG5vZGVJbmRleCArIDEsIGkgLSBub2RlSW5kZXggLSAxKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbGxhcHNlIHRoZSBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBJRC4gSWYgdGhlIG5vZGUgaXMgbm90IGV4cGFuZGFibGUsXHJcbiAgICogb3IgaXQgaXMgYWxyZWFkeSBjb2xsYXBzZWQsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy5cclxuICAgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBjb2xsYXBzZS5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1ZSBpZiB0aGUgbm9kZSB3YXMgY29sbGFwc2VkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGNvbGxhcHNlKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlIHx8ICFub2RlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlbW92ZSBhbGwgdGhlIGRlc2NlbmRhbnQgbm9kZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgbm9kZVxyXG4gICAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzJC52YWx1ZTtcclxuICAgICAgY29uc3Qgbm9kZUluZGV4ID0gbm9kZXMuaW5kZXhPZihub2RlISk7XHJcbiAgICAgIGlmIChub2RlSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgcmVqZWN0KGBOb2RlIElEICR7aWR9IG5vdCBmb3VuZCBpbiBzdG9yZWApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlbW92ZURlc2NlbmRhbnRzKG5vZGVzLCBub2RlSW5kZXgpO1xyXG4gICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KG5vZGVzKTtcclxuICAgICAgICBub2RlIS5leHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hhbmdlIHRoZSBwYWdlIGluY2x1ZGluZyB0aGUgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIHBhcmVudCBub2RlIHdob3NlIGNoaWxkcmVuIGFyZSBpbnNpZGUgdGhlIHBhZ2UgeW91IHdhbnQgdG8gY2hhbmdlLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBuZXcgcGFnZSBudW1iZXIuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHRydWUgaWYgdGhlIHBhZ2Ugd2FzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgY2hhbmdlUGFnZShwYXJlbnRJZDogbnVtYmVyLCBwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9ub2RlcyQudmFsdWUuZmluZCgobikgPT4gbi5pZCA9PT0gcGFyZW50SWQpO1xyXG4gICAgICBpZiAoIXBhcmVudE5vZGUpIHtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdldFBhZ2VGcm9tQ2FjaGVPclNlcnZlcihcclxuICAgICAgICB7IC4uLnRoaXMuZ2V0RmlsdGVyKHBhcmVudE5vZGUpLCBwYXJlbnRJZCB9LFxyXG4gICAgICAgIHBhZ2VOdW1iZXJcclxuICAgICAgKS5zdWJzY3JpYmUoKHBhZ2UpID0+IHtcclxuICAgICAgICAvLyBpZiBwYWdlIGlzIGVtcHR5IGRvIG5vdGhpbmdcclxuICAgICAgICBpZiAoIXBhZ2UudG90YWwpIHtcclxuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgICAvLyByZW1vdmUgYWxsIHRoZSBub2RlcyBpbiB0aGUgc2FtZSBwYWdlIG9mIG5vZGVcclxuICAgICAgICAgIC8vIHdpdGggYWxsIHRoZWlyIGRlc2NlbmRhbnRzXHJcbiAgICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzJC52YWx1ZTtcclxuICAgICAgICAgIGNvbnN0IG5vZGVJbmRleCA9IG5vZGVzLmluZGV4T2YocGFyZW50Tm9kZSEpICsgMTtcclxuICAgICAgICAgIGNvbnN0IHBhZ2VOb2RlcyA9IHRoaXMuY3JlYXRlUGFnZU5vZGVzKHBhZ2UpO1xyXG4gICAgICAgICAgLy8gZmluZCB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgbm9kZSdzIHBhZ2VcclxuICAgICAgICAgIGxldCBzdGFydCA9IG5vZGVJbmRleDtcclxuICAgICAgICAgIGNvbnN0IG9sZFBhZ2VOciA9IG5vZGVzW3N0YXJ0XS5wYWdpbmcucGFnZU51bWJlcjtcclxuICAgICAgICAgIHdoaWxlIChcclxuICAgICAgICAgICAgc3RhcnQgPiAwICYmXHJcbiAgICAgICAgICAgIG5vZGVzW3N0YXJ0IC0gMV0ucGFyZW50SWQgPT09IHBhcmVudElkICYmXHJcbiAgICAgICAgICAgIG5vZGVzW3N0YXJ0IC0gMV0ucGFnaW5nLnBhZ2VOdW1iZXIgPT09IG9sZFBhZ2VOclxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHN0YXJ0LS07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBmaW5kIHRoZSBsYXN0IG5vZGUgb2YgdGhlIG5vZGUncyBwYWdlLFxyXG4gICAgICAgICAgLy8gaW5jbHVkaW5nIGFsbCB0aGVpciBkZXNjZW5kYW50c1xyXG4gICAgICAgICAgbGV0IGVuZCA9IG5vZGVJbmRleCArIDE7XHJcbiAgICAgICAgICB3aGlsZSAoXHJcbiAgICAgICAgICAgIGVuZCA8IG5vZGVzLmxlbmd0aCAmJlxyXG4gICAgICAgICAgICBub2Rlc1tlbmRdLnBhcmVudElkID09PSBwYXJlbnRJZCAmJlxyXG4gICAgICAgICAgICBub2Rlc1tlbmRdLnBhZ2luZy5wYWdlTnVtYmVyID09PSBvbGRQYWdlTnJcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBlbmQrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIHJlcGxhY2UgYWxsIHRoZXNlIG5vZGVzIHdpdGggdGhlIG5ldyBvbmVzXHJcbiAgICAgICAgICBub2Rlcy5zcGxpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0KTtcclxuICAgICAgICAgIG5vZGVzLnNwbGljZShzdGFydCwgMCwgLi4uKHBhZ2VOb2RlcyBhcyBFW10pKTtcclxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgcGFyZW50IG5vZGUgcGFnaW5nIGluZm9cclxuICAgICAgICAgIHBhcmVudE5vZGUhLnBhZ2luZy5wYWdlTnVtYmVyID0gcGFnZS5wYWdlTnVtYmVyO1xyXG4gICAgICAgICAgdGhpcy5fbm9kZXMkLm5leHQobm9kZXMpO1xyXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2xsYXBzZSBhbGwgdGhlIG5vZGVzIGluIHRoZSBzdG9yZS5cclxuICAgKi9cclxuICBwdWJsaWMgY29sbGFwc2VBbGwoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ub2RlcyQubmV4dChbdGhpcy5fcmFkaXghLCAuLi50aGlzLl9yb290c10pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjbGVhckNhY2hlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoZSBwYWdlIHdpdGggdGhlIGdpdmVuIG51bWJlciBhbmQgZmlsdGVyIGlzIGluIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcGFnZSBpcyBpbiBjYWNoZSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBoYXNDYWNoZWRQYWdlKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBGKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIHJldHVybiB0aGlzLl9jYWNoZS5oYXMoa2V5KTtcclxuICB9XHJcbn1cclxuIl19
@@ -1,18 +1,18 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { EventEmitter, Component, Input, Output, NgModule } from '@angular/core';
3
- import * as i1 from '@angular/common';
4
- import { CommonModule } from '@angular/common';
5
- import * as i2 from '@angular/material/button';
3
+ import * as i1 from '@angular/material/button';
6
4
  import { MatButtonModule } from '@angular/material/button';
7
- import * as i3 from '@angular/material/icon';
5
+ import * as i2 from '@angular/material/icon';
8
6
  import { MatIconModule } from '@angular/material/icon';
7
+ import * as i1$1 from '@angular/common';
8
+ import { CommonModule } from '@angular/common';
9
9
  import * as i2$1 from '@angular/material/badge';
10
10
  import { MatBadgeModule } from '@angular/material/badge';
11
11
  import * as i5 from '@angular/material/tooltip';
12
12
  import { MatTooltipModule } from '@angular/material/tooltip';
13
13
  import * as i8 from '@myrmidon/ng-tools';
14
14
  import { NgToolsModule } from '@myrmidon/ng-tools';
15
- import { BehaviorSubject, of, tap, forkJoin, switchMap } from 'rxjs';
15
+ import { BehaviorSubject, of, tap, switchMap, forkJoin } from 'rxjs';
16
16
  import { ReactiveFormsModule } from '@angular/forms';
17
17
  import { MatChipsModule } from '@angular/material/chips';
18
18
  import { MatDialogModule } from '@angular/material/dialog';
@@ -53,12 +53,12 @@ class CompactPagerComponent {
53
53
  this.pagingChange.emit(this.paging);
54
54
  }
55
55
  }
56
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: CompactPagerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
57
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.1", type: CompactPagerComponent, selector: "pdb-compact-pager", inputs: { paging: "paging" }, outputs: { pagingChange: "pagingChange" }, ngImport: i0, template: "<div class=\"form-row\" *ngIf=\"paging.pageCount\">\n <span id=\"pages\">{{ paging.pageNumber }}/{{ paging.pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging.total }} </span>\n</div>\n", styles: ["#pages,#total{color:silver}.form-row{display:flex;gap:2px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
56
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: CompactPagerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
57
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: CompactPagerComponent, selector: "pdb-compact-pager", inputs: { paging: "paging" }, outputs: { pagingChange: "pagingChange" }, ngImport: i0, template: "@if (paging.pageCount) {\n <div class=\"form-row\">\n <span id=\"pages\">{{ paging.pageNumber }}/{{ paging.pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging.total }} </span>\n </div>\n}\n", styles: ["#pages,#total{color:silver}.form-row{display:flex;gap:2px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
58
58
  }
59
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: CompactPagerComponent, decorators: [{
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: CompactPagerComponent, decorators: [{
60
60
  type: Component,
61
- args: [{ selector: 'pdb-compact-pager', template: "<div class=\"form-row\" *ngIf=\"paging.pageCount\">\n <span id=\"pages\">{{ paging.pageNumber }}/{{ paging.pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging.total }} </span>\n</div>\n", styles: ["#pages,#total{color:silver}.form-row{display:flex;gap:2px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
61
+ args: [{ selector: 'pdb-compact-pager', template: "@if (paging.pageCount) {\n <div class=\"form-row\">\n <span id=\"pages\">{{ paging.pageNumber }}/{{ paging.pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging.total }} </span>\n </div>\n}\n", styles: ["#pages,#total{color:silver}.form-row{display:flex;gap:2px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
62
62
  }], ctorParameters: () => [], propDecorators: { paging: [{
63
63
  type: Input
64
64
  }], pagingChange: [{
@@ -82,10 +82,10 @@ class RangeViewComponent {
82
82
  ((rangeStart + rangeWidth) / domainWidth) * this.width,
83
83
  ];
84
84
  }
85
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: RangeViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
86
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.1", type: RangeViewComponent, selector: "pdb-range-view", inputs: { domain: "domain", range: "range", width: "width", height: "height" }, usesOnChanges: true, ngImport: i0, template: "<svg [attr.width]=\"width\" [attr.height]=\"height\">\n <rect id=\"rdomain\" [attr.width]=\"width\" [attr.height]=\"height\" />\n <rect\n id=\"rrange\"\n [attr.x]=\"scaledRange[0]\"\n [attr.y]=\"0\"\n [attr.width]=\"scaledRange[1] - scaledRange[0]\"\n [attr.height]=\"height\"\n />\n</svg>\n", styles: ["#rdomain{fill:#d3d3d3;stroke-width:3;stroke:#c1ba9b}#rrange{fill:#91aad3;stroke-width:3}\n"] }); }
85
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: RangeViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
86
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.0", type: RangeViewComponent, selector: "pdb-range-view", inputs: { domain: "domain", range: "range", width: "width", height: "height" }, usesOnChanges: true, ngImport: i0, template: "<svg [attr.width]=\"width\" [attr.height]=\"height\">\n <rect id=\"rdomain\" [attr.width]=\"width\" [attr.height]=\"height\" />\n <rect\n id=\"rrange\"\n [attr.x]=\"scaledRange[0]\"\n [attr.y]=\"0\"\n [attr.width]=\"scaledRange[1] - scaledRange[0]\"\n [attr.height]=\"height\"\n />\n</svg>\n", styles: ["#rdomain{fill:#d3d3d3;stroke-width:3;stroke:#c1ba9b}#rrange{fill:#91aad3;stroke-width:3}\n"] }); }
87
87
  }
88
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: RangeViewComponent, decorators: [{
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: RangeViewComponent, decorators: [{
89
89
  type: Component,
90
90
  args: [{ selector: 'pdb-range-view', template: "<svg [attr.width]=\"width\" [attr.height]=\"height\">\n <rect id=\"rdomain\" [attr.width]=\"width\" [attr.height]=\"height\" />\n <rect\n id=\"rrange\"\n [attr.x]=\"scaledRange[0]\"\n [attr.y]=\"0\"\n [attr.width]=\"scaledRange[1] - scaledRange[0]\"\n [attr.height]=\"height\"\n />\n</svg>\n", styles: ["#rdomain{fill:#d3d3d3;stroke-width:3;stroke:#c1ba9b}#rrange{fill:#91aad3;stroke-width:3}\n"] }]
91
91
  }], ctorParameters: () => [], propDecorators: { domain: [{
@@ -142,12 +142,12 @@ class BrowserTreeNodeComponent {
142
142
  this.editNodeFilterRequest.emit(this._node);
143
143
  }
144
144
  }
145
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: BrowserTreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
146
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.1", type: BrowserTreeNodeComponent, selector: "pdb-browser-tree-node", inputs: { node: "node", paging: "paging", debug: "debug", hideLabel: "hideLabel", hidePaging: "hidePaging" }, outputs: { toggleExpandedRequest: "toggleExpandedRequest", changePageRequest: "changePageRequest", editNodeFilterRequest: "editNodeFilterRequest" }, ngImport: i0, template: "<div id=\"node\" *ngIf=\"node\" [style.margin-left.px]=\"(node.y - 1) * 20\">\r\n <!-- pager -->\r\n <div\r\n *ngIf=\"$any(node).expanded && paging && paging.pageCount > 1\"\r\n id=\"pager\"\r\n [style.display]=\"hidePaging ? 'inherit' : 'block'\"\r\n >\r\n <pdb-compact-pager\r\n [paging]=\"paging\"\r\n (pagingChange)=\"onPagingChange($any(node), $event)\"\r\n />\r\n <pdb-range-view\r\n [width]=\"250\"\r\n [domain]=\"[0, paging.pageCount]\"\r\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\r\n />\r\n </div>\r\n <!-- node -->\r\n <div class=\"form-row\">\r\n <!-- expand/collapse button -->\r\n <button\r\n *ngIf=\"node.y > 0\"\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\r\n [disabled]=\"node.hasChildren === false\"\r\n (click)=\"onToggleExpanded()\"\r\n >\r\n <mat-icon>{{\r\n node.hasChildren === true || node.hasChildren === undefined\r\n ? $any(node).expanded\r\n ? \"expand_less\"\r\n : \"expand_more\"\r\n : \"stop\"\r\n }}</mat-icon>\r\n </button>\r\n <!-- tag -->\r\n <ng-container *ngIf=\"!hideLabel\">\r\n <span\r\n class=\"tag\"\r\n [ngStyle]=\"{\r\n 'background-color': (node.tag | stringToColor),\r\n color: node.tag | stringToColor | colorToContrast\r\n }\"\r\n >{{ node.tag }}</span\r\n >\r\n <!-- loc and label -->\r\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\r\n </ng-container>\r\n\r\n <!-- PROJECTED NODE -->\r\n <ng-content></ng-content>\r\n\r\n <!-- debug -->\r\n <span *ngIf=\"debug\" class=\"debug\"\r\n >#{{ node.id }}\r\n <span\r\n >| {{ $any(node).paging.pageNumber }}/{{\r\n $any(node).paging.pageCount\r\n }}\r\n ({{ $any(node).paging.total }})</span\r\n ></span\r\n >\r\n\r\n <!-- filter -->\r\n <div class=\"muted\" *ngIf=\"!$any(node).filter && node.y\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Add filter\"\r\n (click)=\"onEditFilter()\"\r\n >\r\n <mat-icon>filter_list</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"muted\" *ngIf=\"$any(node).filter && node.y\">\r\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\r\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\r\n >filter_alt</mat-icon\r\n >\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center}.form-row *{flex:0 0 auto}.form-row span{flex:0 1 auto;white-space:normal}#node #pager{display:none}#node:hover #pager{display:block}#node{margin-bottom:4px;padding:4px 6px;border:1px solid transparent;border-radius:6px}#node:hover{border:1px solid #98a8d4;border-radius:6px}span.loc{font-size:.85em;color:#666;vertical-align:middle}span.tag{border:1px solid #aaa;border-radius:4px;padding:0 4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 6px;margin:4px 0}legend{color:silver}.muted{opacity:.3}.muted:hover{opacity:1}.debug{font-size:.85em;color:#9c3d3e}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2$1.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: CompactPagerComponent, selector: "pdb-compact-pager", inputs: ["paging"], outputs: ["pagingChange"] }, { kind: "component", type: RangeViewComponent, selector: "pdb-range-view", inputs: ["domain", "range", "width", "height"] }, { kind: "pipe", type: i8.ColorToContrastPipe, name: "colorToContrast" }, { kind: "pipe", type: i8.StringToColorPipe, name: "stringToColor" }] }); }
145
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: BrowserTreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
146
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: BrowserTreeNodeComponent, selector: "pdb-browser-tree-node", inputs: { node: "node", paging: "paging", debug: "debug", hideLabel: "hideLabel", hidePaging: "hidePaging" }, outputs: { toggleExpandedRequest: "toggleExpandedRequest", changePageRequest: "changePageRequest", editNodeFilterRequest: "editNodeFilterRequest" }, ngImport: i0, template: "@if (node) {\n <div id=\"node\" [style.margin-left.px]=\"(node.y - 1) * 20\">\n <!-- pager -->\n @if ($any(node).expanded && paging && paging.pageCount > 1) {\n <div\n id=\"pager\"\n [style.display]=\"hidePaging ? 'inherit' : 'block'\"\n >\n <pdb-compact-pager\n [paging]=\"paging\"\n (pagingChange)=\"onPagingChange($any(node), $event)\"\n />\n <pdb-range-view\n [width]=\"250\"\n [domain]=\"[0, paging.pageCount]\"\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\n />\n </div>\n }\n <!-- node -->\n <div class=\"form-row\">\n <!-- expand/collapse button -->\n @if (node.y > 0) {\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\n [disabled]=\"node.hasChildren === false\"\n (click)=\"onToggleExpanded()\"\n >\n <mat-icon>{{\n node.hasChildren === true || node.hasChildren === undefined\n ? $any(node).expanded\n ? \"expand_less\"\n : \"expand_more\"\n : \"stop\"\n }}</mat-icon>\n </button>\n }\n <!-- tag -->\n @if (!hideLabel) {\n <span\n class=\"tag\"\n [ngStyle]=\"{\r\n 'background-color': (node.tag | stringToColor),\r\n color: node.tag | stringToColor | colorToContrast\r\n }\"\r\n >{{ node.tag }}</span\n >\n <!-- loc and label -->\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\n }\n <!-- PROJECTED NODE -->\n <ng-content></ng-content>\n <!-- debug -->\n @if (debug) {\n <span class=\"debug\"\n >#{{ node.id }}\n <span\n >| {{ $any(node).paging.pageNumber }}/{{\n $any(node).paging.pageCount\n }}\n ({{ $any(node).paging.total }})</span\n ></span\n >\n }\n <!-- filter -->\n @if (!$any(node).filter && node.y) {\n <div class=\"muted\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Add filter\"\n (click)=\"onEditFilter()\"\n >\n <mat-icon>filter_list</mat-icon>\n </button>\n </div>\n }\n @if ($any(node).filter && node.y) {\n <div class=\"muted\">\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\n >filter_alt</mat-icon\n >\n </button>\n </div>\n }\n </div>\n </div>\n }\n", styles: [".form-row{display:flex;gap:8px;align-items:center}.form-row *{flex:0 0 auto}.form-row span{flex:0 1 auto;white-space:normal}#node #pager{display:none}#node:hover #pager{display:block}#node{margin-bottom:4px;padding:4px 6px;border:1px solid transparent;border-radius:6px}#node:hover{border:1px solid #98a8d4;border-radius:6px}span.loc{font-size:.85em;color:#666;vertical-align:middle}span.tag{border:1px solid #aaa;border-radius:4px;padding:0 4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 6px;margin:4px 0}legend{color:silver}.muted{opacity:.3}.muted:hover{opacity:1}.debug{font-size:.85em;color:#9c3d3e}\n"], dependencies: [{ kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2$1.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: CompactPagerComponent, selector: "pdb-compact-pager", inputs: ["paging"], outputs: ["pagingChange"] }, { kind: "component", type: RangeViewComponent, selector: "pdb-range-view", inputs: ["domain", "range", "width", "height"] }, { kind: "pipe", type: i8.ColorToContrastPipe, name: "colorToContrast" }, { kind: "pipe", type: i8.StringToColorPipe, name: "stringToColor" }] }); }
147
147
  }
148
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: BrowserTreeNodeComponent, decorators: [{
148
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: BrowserTreeNodeComponent, decorators: [{
149
149
  type: Component,
150
- args: [{ selector: 'pdb-browser-tree-node', template: "<div id=\"node\" *ngIf=\"node\" [style.margin-left.px]=\"(node.y - 1) * 20\">\r\n <!-- pager -->\r\n <div\r\n *ngIf=\"$any(node).expanded && paging && paging.pageCount > 1\"\r\n id=\"pager\"\r\n [style.display]=\"hidePaging ? 'inherit' : 'block'\"\r\n >\r\n <pdb-compact-pager\r\n [paging]=\"paging\"\r\n (pagingChange)=\"onPagingChange($any(node), $event)\"\r\n />\r\n <pdb-range-view\r\n [width]=\"250\"\r\n [domain]=\"[0, paging.pageCount]\"\r\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\r\n />\r\n </div>\r\n <!-- node -->\r\n <div class=\"form-row\">\r\n <!-- expand/collapse button -->\r\n <button\r\n *ngIf=\"node.y > 0\"\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\r\n [disabled]=\"node.hasChildren === false\"\r\n (click)=\"onToggleExpanded()\"\r\n >\r\n <mat-icon>{{\r\n node.hasChildren === true || node.hasChildren === undefined\r\n ? $any(node).expanded\r\n ? \"expand_less\"\r\n : \"expand_more\"\r\n : \"stop\"\r\n }}</mat-icon>\r\n </button>\r\n <!-- tag -->\r\n <ng-container *ngIf=\"!hideLabel\">\r\n <span\r\n class=\"tag\"\r\n [ngStyle]=\"{\r\n 'background-color': (node.tag | stringToColor),\r\n color: node.tag | stringToColor | colorToContrast\r\n }\"\r\n >{{ node.tag }}</span\r\n >\r\n <!-- loc and label -->\r\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\r\n </ng-container>\r\n\r\n <!-- PROJECTED NODE -->\r\n <ng-content></ng-content>\r\n\r\n <!-- debug -->\r\n <span *ngIf=\"debug\" class=\"debug\"\r\n >#{{ node.id }}\r\n <span\r\n >| {{ $any(node).paging.pageNumber }}/{{\r\n $any(node).paging.pageCount\r\n }}\r\n ({{ $any(node).paging.total }})</span\r\n ></span\r\n >\r\n\r\n <!-- filter -->\r\n <div class=\"muted\" *ngIf=\"!$any(node).filter && node.y\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Add filter\"\r\n (click)=\"onEditFilter()\"\r\n >\r\n <mat-icon>filter_list</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"muted\" *ngIf=\"$any(node).filter && node.y\">\r\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\r\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\r\n >filter_alt</mat-icon\r\n >\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center}.form-row *{flex:0 0 auto}.form-row span{flex:0 1 auto;white-space:normal}#node #pager{display:none}#node:hover #pager{display:block}#node{margin-bottom:4px;padding:4px 6px;border:1px solid transparent;border-radius:6px}#node:hover{border:1px solid #98a8d4;border-radius:6px}span.loc{font-size:.85em;color:#666;vertical-align:middle}span.tag{border:1px solid #aaa;border-radius:4px;padding:0 4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 6px;margin:4px 0}legend{color:silver}.muted{opacity:.3}.muted:hover{opacity:1}.debug{font-size:.85em;color:#9c3d3e}\n"] }]
150
+ args: [{ selector: 'pdb-browser-tree-node', template: "@if (node) {\n <div id=\"node\" [style.margin-left.px]=\"(node.y - 1) * 20\">\n <!-- pager -->\n @if ($any(node).expanded && paging && paging.pageCount > 1) {\n <div\n id=\"pager\"\n [style.display]=\"hidePaging ? 'inherit' : 'block'\"\n >\n <pdb-compact-pager\n [paging]=\"paging\"\n (pagingChange)=\"onPagingChange($any(node), $event)\"\n />\n <pdb-range-view\n [width]=\"250\"\n [domain]=\"[0, paging.pageCount]\"\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\n />\n </div>\n }\n <!-- node -->\n <div class=\"form-row\">\n <!-- expand/collapse button -->\n @if (node.y > 0) {\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\n [disabled]=\"node.hasChildren === false\"\n (click)=\"onToggleExpanded()\"\n >\n <mat-icon>{{\n node.hasChildren === true || node.hasChildren === undefined\n ? $any(node).expanded\n ? \"expand_less\"\n : \"expand_more\"\n : \"stop\"\n }}</mat-icon>\n </button>\n }\n <!-- tag -->\n @if (!hideLabel) {\n <span\n class=\"tag\"\n [ngStyle]=\"{\r\n 'background-color': (node.tag | stringToColor),\r\n color: node.tag | stringToColor | colorToContrast\r\n }\"\r\n >{{ node.tag }}</span\n >\n <!-- loc and label -->\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\n }\n <!-- PROJECTED NODE -->\n <ng-content></ng-content>\n <!-- debug -->\n @if (debug) {\n <span class=\"debug\"\n >#{{ node.id }}\n <span\n >| {{ $any(node).paging.pageNumber }}/{{\n $any(node).paging.pageCount\n }}\n ({{ $any(node).paging.total }})</span\n ></span\n >\n }\n <!-- filter -->\n @if (!$any(node).filter && node.y) {\n <div class=\"muted\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Add filter\"\n (click)=\"onEditFilter()\"\n >\n <mat-icon>filter_list</mat-icon>\n </button>\n </div>\n }\n @if ($any(node).filter && node.y) {\n <div class=\"muted\">\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\n >filter_alt</mat-icon\n >\n </button>\n </div>\n }\n </div>\n </div>\n }\n", styles: [".form-row{display:flex;gap:8px;align-items:center}.form-row *{flex:0 0 auto}.form-row span{flex:0 1 auto;white-space:normal}#node #pager{display:none}#node:hover #pager{display:block}#node{margin-bottom:4px;padding:4px 6px;border:1px solid transparent;border-radius:6px}#node:hover{border:1px solid #98a8d4;border-radius:6px}span.loc{font-size:.85em;color:#666;vertical-align:middle}span.tag{border:1px solid #aaa;border-radius:4px;padding:0 4px}fieldset{border:1px solid silver;border-radius:6px;padding:4px 6px;margin:4px 0}legend{color:silver}.muted{opacity:.3}.muted:hover{opacity:1}.debug{font-size:.85em;color:#9c3d3e}\n"] }]
151
151
  }], ctorParameters: () => [], propDecorators: { node: [{
152
152
  type: Input
153
153
  }], paging: [{
@@ -875,8 +875,8 @@ class PagedTreeStore {
875
875
  }
876
876
 
877
877
  class PagedDataBrowsersModule {
878
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: PagedDataBrowsersModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
879
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.1", ngImport: i0, type: PagedDataBrowsersModule, declarations: [CompactPagerComponent,
878
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: PagedDataBrowsersModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
879
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.0.0", ngImport: i0, type: PagedDataBrowsersModule, declarations: [CompactPagerComponent,
880
880
  RangeViewComponent,
881
881
  BrowserTreeNodeComponent], imports: [CommonModule,
882
882
  ReactiveFormsModule,
@@ -896,7 +896,7 @@ class PagedDataBrowsersModule {
896
896
  NgToolsModule], exports: [CompactPagerComponent,
897
897
  RangeViewComponent,
898
898
  BrowserTreeNodeComponent] }); }
899
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: PagedDataBrowsersModule, imports: [CommonModule,
899
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: PagedDataBrowsersModule, imports: [CommonModule,
900
900
  ReactiveFormsModule,
901
901
  // material
902
902
  MatBadgeModule,
@@ -913,7 +913,7 @@ class PagedDataBrowsersModule {
913
913
  // myrmidon
914
914
  NgToolsModule] }); }
915
915
  }
916
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: PagedDataBrowsersModule, decorators: [{
916
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: PagedDataBrowsersModule, decorators: [{
917
917
  type: NgModule,
918
918
  args: [{
919
919
  declarations: [
@@ -1 +1 @@
1
- {"version":3,"file":"myrmidon-paged-data-browsers.mjs","sources":["../../../../projects/myrmidon/paged-data-browsers/src/lib/components/compact-pager/compact-pager.component.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/compact-pager/compact-pager.component.html","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/range-view/range-view.component.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/range-view/range-view.component.html","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/browser-tree-node/browser-tree-node.component.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/browser-tree-node/browser-tree-node.component.html","../../../../projects/myrmidon/paged-data-browsers/src/lib/services/lru-cache.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/services/paged-list.store.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/services/paged-tree.store.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/paged-data-browsers.module.ts","../../../../projects/myrmidon/paged-data-browsers/src/public-api.ts","../../../../projects/myrmidon/paged-data-browsers/src/myrmidon-paged-data-browsers.ts"],"sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { PagingInfo } from '../../services/paged-tree.store';\n\n@Component({\n selector: 'pdb-compact-pager',\n templateUrl: './compact-pager.component.html',\n styleUrls: ['./compact-pager.component.scss'],\n})\nexport class CompactPagerComponent {\n @Input()\n public paging: PagingInfo;\n\n @Output()\n public pagingChange: EventEmitter<PagingInfo>;\n\n constructor() {\n this.paging = {\n pageNumber: 0,\n pageCount: 0,\n total: 0,\n };\n this.pagingChange = new EventEmitter<PagingInfo>();\n }\n\n public onFirst(): void {\n this.paging = { ...this.paging, pageNumber: 1 };\n this.pagingChange.emit(this.paging);\n }\n\n public onPrevious(): void {\n if (this.paging.pageNumber > 1) {\n this.paging = { ...this.paging, pageNumber: this.paging.pageNumber - 1 };\n this.pagingChange.emit(this.paging);\n }\n }\n\n public onNext(): void {\n if (this.paging.pageNumber < this.paging.pageCount) {\n this.paging = { ...this.paging, pageNumber: this.paging.pageNumber + 1 };\n this.pagingChange.emit(this.paging);\n }\n }\n\n public onLast(): void {\n if (this.paging.pageNumber < this.paging.pageCount) {\n this.paging = { ...this.paging, pageNumber: this.paging.pageCount };\n this.pagingChange.emit(this.paging);\n }\n }\n}\n","<div class=\"form-row\" *ngIf=\"paging.pageCount\">\n <span id=\"pages\">{{ paging.pageNumber }}/{{ paging.pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging.total }} </span>\n</div>\n","import { Component, Input, OnChanges } from '@angular/core';\n\n@Component({\n selector: 'pdb-range-view',\n templateUrl: './range-view.component.html',\n styleUrls: ['./range-view.component.scss'],\n})\nexport class RangeViewComponent implements OnChanges {\n /**\n * The domain of the range view (start, limit).\n */\n @Input() public domain: Array<number>;\n /**\n * The range of the range view (start, limit).\n */\n @Input() public range: Array<number>;\n /**\n * The width of the component.\n */\n @Input() public width: number;\n /**\n * The height of the component.\n */\n @Input() public height: number;\n\n public scaledRange: Array<number>;\n\n constructor() {\n this.domain = [0, 100];\n this.range = [0, 100];\n this.width = 100;\n this.height = 5;\n this.scaledRange = [];\n }\n\n ngOnChanges() {\n const domainWidth = this.domain[1] - this.domain[0];\n const rangeWidth = this.range[1] - this.range[0];\n const rangeStart = this.range[0] - this.domain[0];\n\n this.scaledRange = [\n (rangeStart / domainWidth) * this.width,\n ((rangeStart + rangeWidth) / domainWidth) * this.width,\n ];\n }\n}\n","<svg [attr.width]=\"width\" [attr.height]=\"height\">\n <rect id=\"rdomain\" [attr.width]=\"width\" [attr.height]=\"height\" />\n <rect\n id=\"rrange\"\n [attr.x]=\"scaledRange[0]\"\n [attr.y]=\"0\"\n [attr.width]=\"scaledRange[1] - scaledRange[0]\"\n [attr.height]=\"height\"\n />\n</svg>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { PagedTreeNode, PagingInfo } from '../../services/paged-tree.store';\n\nexport interface PageChangeRequest {\n node: PagedTreeNode<any>;\n paging: PagingInfo;\n}\n\n/**\n * Browser tree node component view. This wraps some HTML content providing\n * a toggle button to expand/collapse the node, a paging control for the\n * node's children, and a button to edit the node's filter. You should then\n * provide the HTML content to display the node's data inside this component, e.g.\n * <pdb-browser-tree-node [node]=\"node\">\n * <your-node-view [node]=\"node\" />\n * <pdb-browser-tree-node>\n */\n@Component({\n selector: 'pdb-browser-tree-node',\n templateUrl: './browser-tree-node.component.html',\n styleUrls: ['./browser-tree-node.component.css'],\n})\nexport class BrowserTreeNodeComponent {\n private _node: PagedTreeNode<any> | undefined | null;\n\n /**\n * The node to display.\n */\n @Input()\n public get node(): PagedTreeNode<any> | undefined | null {\n return this._node;\n }\n\n public set node(value: PagedTreeNode<any> | undefined | null) {\n if (this._node === value) {\n return;\n }\n this._node = value;\n }\n\n /**\n * The paging information for the node's children.\n */\n @Input()\n paging?: PagingInfo;\n\n /**\n * True to show debug information.\n */\n @Input()\n public debug?: boolean;\n\n /**\n * True to hide the node's loc and label. This is useful if you want to\n * provide your own view for the node, between the expansion toggle and\n * the filter edit button. In this case, in your consumer template provide\n * your own view as the content of this component. If instead you are fine\n * with the default loc and label, and just want to add more data to\n * the view, then you can just add your own content to this component's\n * template, without setting this property to true.\n */\n @Input()\n public hideLabel?: boolean;\n\n /**\n * True to hide the node's paging control unless hovered.\n */\n @Input()\n public hidePaging?: boolean;\n\n /**\n * Emits when the user wants to toggle the expanded state of the node.\n */\n @Output()\n public toggleExpandedRequest: EventEmitter<PagedTreeNode<any>>;\n\n /**\n * Emits when the user wants to change the page number of the node's children.\n */\n @Output()\n public changePageRequest: EventEmitter<PageChangeRequest>;\n\n @Output()\n public editNodeFilterRequest: EventEmitter<PagedTreeNode<any>>;\n\n constructor() {\n this.toggleExpandedRequest = new EventEmitter<PagedTreeNode<any>>();\n this.changePageRequest = new EventEmitter<PageChangeRequest>();\n this.editNodeFilterRequest = new EventEmitter<PagedTreeNode<any>>();\n }\n\n public onToggleExpanded(): void {\n if (!this._node) {\n return;\n }\n this.toggleExpandedRequest.emit(this._node as PagedTreeNode<any>);\n }\n\n public onPagingChange(node: PagedTreeNode<any>, paging: PagingInfo): void {\n this.changePageRequest.emit({\n node,\n paging,\n });\n }\n\n public onEditFilter(): void {\n if (this._node) {\n this.editNodeFilterRequest.emit(this._node);\n }\n }\n}\n","<div id=\"node\" *ngIf=\"node\" [style.margin-left.px]=\"(node.y - 1) * 20\">\r\n <!-- pager -->\r\n <div\r\n *ngIf=\"$any(node).expanded && paging && paging.pageCount > 1\"\r\n id=\"pager\"\r\n [style.display]=\"hidePaging ? 'inherit' : 'block'\"\r\n >\r\n <pdb-compact-pager\r\n [paging]=\"paging\"\r\n (pagingChange)=\"onPagingChange($any(node), $event)\"\r\n />\r\n <pdb-range-view\r\n [width]=\"250\"\r\n [domain]=\"[0, paging.pageCount]\"\r\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\r\n />\r\n </div>\r\n <!-- node -->\r\n <div class=\"form-row\">\r\n <!-- expand/collapse button -->\r\n <button\r\n *ngIf=\"node.y > 0\"\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\r\n [disabled]=\"node.hasChildren === false\"\r\n (click)=\"onToggleExpanded()\"\r\n >\r\n <mat-icon>{{\r\n node.hasChildren === true || node.hasChildren === undefined\r\n ? $any(node).expanded\r\n ? \"expand_less\"\r\n : \"expand_more\"\r\n : \"stop\"\r\n }}</mat-icon>\r\n </button>\r\n <!-- tag -->\r\n <ng-container *ngIf=\"!hideLabel\">\r\n <span\r\n class=\"tag\"\r\n [ngStyle]=\"{\r\n 'background-color': (node.tag | stringToColor),\r\n color: node.tag | stringToColor | colorToContrast\r\n }\"\r\n >{{ node.tag }}</span\r\n >\r\n <!-- loc and label -->\r\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\r\n </ng-container>\r\n\r\n <!-- PROJECTED NODE -->\r\n <ng-content></ng-content>\r\n\r\n <!-- debug -->\r\n <span *ngIf=\"debug\" class=\"debug\"\r\n >#{{ node.id }}\r\n <span\r\n >| {{ $any(node).paging.pageNumber }}/{{\r\n $any(node).paging.pageCount\r\n }}\r\n ({{ $any(node).paging.total }})</span\r\n ></span\r\n >\r\n\r\n <!-- filter -->\r\n <div class=\"muted\" *ngIf=\"!$any(node).filter && node.y\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Add filter\"\r\n (click)=\"onEditFilter()\"\r\n >\r\n <mat-icon>filter_list</mat-icon>\r\n </button>\r\n </div>\r\n <div class=\"muted\" *ngIf=\"$any(node).filter && node.y\">\r\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\r\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\r\n >filter_alt</mat-icon\r\n >\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n","/**\r\n * A Least Recently Used cache that can be used to store any type of object.\r\n * The cache works in two modes: considering the size of the objects or not.\r\n * If the size is considered, the cache will have a maximum size and will\r\n * remove the oldest objects when the maximum size is reached. Note that\r\n * the size is only roughly estimated. This avoids removing too many\r\n * entries from the cache when the maximum is reached.\r\n * If the size is not considered, the cache will have a maximum number of\r\n * objects and will remove the oldest objects when the maximum number is\r\n * reached.\r\n */\r\nexport class LRUCache<T> {\r\n private _maxSize: number;\r\n private _totalSize: number;\r\n private _considerSize: boolean;\r\n private _cache: Map<string, T>;\r\n private _sizes: Map<string, number>;\r\n\r\n /**\r\n * Creates a new cache.\r\n * @param maxSize The maximum size of the cache. This is either\r\n * the maximum number of items in the cache (when considerSize\r\n * is false) or the maximum total size of all items in the\r\n * cache in bytes (when considerSize is true).\r\n * @param considerSize True if the size of the objects should be\r\n * considered.\r\n */\r\n constructor(maxSize: number, considerSize: boolean = false) {\r\n this._maxSize = maxSize;\r\n this._totalSize = 0;\r\n this._considerSize = considerSize;\r\n this._cache = new Map<string, T>();\r\n this._sizes = new Map<string, number>();\r\n }\r\n\r\n /**\r\n * Get an item from the cache.\r\n * @param key The key of the item to get.\r\n * @returns The item or undefined if the item is not in the cache.\r\n */\r\n public get(key: string): T | undefined {\r\n let item: T | undefined = this._cache.get(key);\r\n if (item) {\r\n this._cache.delete(key);\r\n this._cache.set(key, item);\r\n }\r\n return item;\r\n }\r\n\r\n /**\r\n * Check if an item is in the cache.\r\n * @param key The key of the item to check.\r\n * @returns True if the item is in cache.\r\n */\r\n public has(key: string): boolean {\r\n return this._cache.has(key);\r\n }\r\n\r\n /**\r\n * Put an item in the cache.\r\n * @param key The key of the item to put.\r\n * @param item The item to put.\r\n * @param size The estimated size of the item in bytes.\r\n * This must be calculated by the caller but only when\r\n * considerSize is true.\r\n */\r\n public put(key: string, item: T, size: number): void {\r\n this._cache.delete(key);\r\n this._cache.set(key, item);\r\n this._sizes.set(key, size);\r\n if (this._considerSize) {\r\n this._totalSize += size;\r\n while (this._totalSize > this._maxSize) {\r\n const oldestKey = this._cache.keys().next().value;\r\n let oldestSize = this._sizes.get(oldestKey);\r\n if (oldestSize) {\r\n this._totalSize -= oldestSize;\r\n }\r\n this._cache.delete(oldestKey);\r\n this._sizes.delete(oldestKey);\r\n }\r\n } else {\r\n while (this._cache.size > this._maxSize) {\r\n const oldestKey = this._cache.keys().next().value;\r\n this._cache.delete(oldestKey);\r\n this._sizes.delete(oldestKey);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the cache.\r\n */\r\n public clear(): void {\r\n this._cache.clear();\r\n this._sizes.clear();\r\n this._totalSize = 0;\r\n }\r\n\r\n /**\r\n * Estimate the size of an object in bytes.\r\n * @param obj The object to calculate the size of.\r\n * @returns The estimated size of the object in bytes.\r\n */\r\n public static calculateObjectSize(obj: any): number {\r\n if (!obj) {\r\n return 0;\r\n }\r\n let totalSize = 0;\r\n let keys = Object.keys(obj);\r\n for (let key of keys) {\r\n let value = obj[key];\r\n if (typeof value === 'string') {\r\n totalSize += value.length * 2;\r\n } else if (typeof value === 'number') {\r\n totalSize += 8;\r\n } else if (typeof value === 'boolean') {\r\n totalSize += 4;\r\n } else if (typeof value === 'object' && value !== null) {\r\n totalSize += this.calculateObjectSize(value);\r\n }\r\n }\r\n return totalSize;\r\n }\r\n}\r\n","import { BehaviorSubject, Observable } from 'rxjs';\r\n\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\n\r\nimport { LRUCache } from './lru-cache';\r\n\r\n/**\r\n * Options for the paged list store.\r\n */\r\nexport interface PagedListStoreOptions {\r\n /**\r\n * The size of pages in the store.\r\n */\r\n pageSize: number;\r\n /**\r\n * The size of the cache for pages in the store.\r\n */\r\n cacheSize: number;\r\n\r\n /**\r\n * A custom function for building the cache key for the given page number\r\n * and filter.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n buildCacheKey?: (pageNumber: number, filter: any) => string;\r\n}\r\n\r\n/**\r\n * Default options for the paged list store.\r\n */\r\nexport const DEFAULT_PAGED_LIST_STORE_OPTIONS: PagedListStoreOptions = {\r\n pageSize: 20,\r\n cacheSize: 50,\r\n};\r\n\r\n/**\r\n * The interface to be implemented by the service used by PagedListStore.\r\n */\r\nexport interface PagedListStoreService<F, E> {\r\n /**\r\n * Load the page with the given number.\r\n * @param pageNumber The page number to load.\r\n * @param pageSize The size of the page to load.\r\n * @param filter The filter to apply.\r\n */\r\n loadPage(\r\n pageNumber: number,\r\n pageSize: number,\r\n filter: F\r\n ): Observable<DataPage<E>>;\r\n}\r\n\r\n/**\r\n * A generic paged list store using a filter object of type F\r\n * and a list of elements of type E.\r\n */\r\nexport class PagedListStore<F, E> {\r\n private _pageSize: number;\r\n private readonly _customCacheKeyBuilder?: (\r\n pageNumber: number,\r\n filter: any\r\n ) => string;\r\n private _page$: BehaviorSubject<DataPage<E>>;\r\n private _filter$: BehaviorSubject<F>;\r\n private readonly _cache: LRUCache<DataPage<E>>;\r\n\r\n /**\r\n * The page. It is updated when the page is changed or the filter is changed.\r\n */\r\n public page$: Observable<Readonly<DataPage<E>>>;\r\n\r\n /**\r\n * The filter. It is updated when the filter is changed.\r\n */\r\n public filter$: Observable<Readonly<F>>;\r\n\r\n /**\r\n * The size of nodes pages in this store. If you change it, the store\r\n * is reset. The default value is 20.\r\n */\r\n public get pageSize(): number {\r\n return this._pageSize;\r\n }\r\n public set pageSize(value: number) {\r\n if (this._pageSize === value) {\r\n return;\r\n }\r\n this._pageSize = value;\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Create a new paged list store.\r\n * @param options Options for the paged list store.\r\n */\r\n constructor(\r\n private _service: PagedListStoreService<F, E>,\r\n options: PagedListStoreOptions = DEFAULT_PAGED_LIST_STORE_OPTIONS\r\n ) {\r\n this._pageSize = options.pageSize;\r\n this._cache = new LRUCache<DataPage<E>>(options.cacheSize);\r\n // page\r\n this._page$ = new BehaviorSubject<DataPage<E>>({\r\n pageNumber: 0,\r\n pageCount: 0,\r\n pageSize: 0,\r\n total: 0,\r\n items: [],\r\n });\r\n this.page$ = this._page$.asObservable();\r\n // filter\r\n this._filter$ = new BehaviorSubject<F>({} as F);\r\n this.filter$ = this._filter$.asObservable();\r\n }\r\n\r\n /**\r\n * Returns true if the store is empty, false otherwise.\r\n * @returns true if the store is empty, false otherwise.\r\n */\r\n public isEmpty(): boolean {\r\n return this._page$.value.items.length === 0;\r\n }\r\n\r\n /**\r\n * Build the cache key for the given page number and filter.\r\n * The default implementation just returns a stringified object\r\n * containing the page number and the filter. You may override\r\n * this method to provide a custom cache key.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n public buildCacheKey(pageNumber: number, filter: F): string {\r\n if (this._customCacheKeyBuilder) {\r\n return this._customCacheKeyBuilder(pageNumber, filter);\r\n }\r\n return JSON.stringify({ pageNumber, ...filter });\r\n }\r\n\r\n /**\r\n * Load the page with the given number.\r\n * @param pageNumber the page number to load.\r\n */\r\n private loadPage(pageNumber: number): Observable<DataPage<E>> {\r\n return this._service.loadPage(\r\n pageNumber,\r\n this._pageSize,\r\n this._filter$.value\r\n );\r\n }\r\n\r\n /**\r\n * Set the page with the given number.\r\n * @param pageNumber The page number to load.\r\n * @param pageSize The page size.\r\n * @returns Promise which resolves when the page is loaded.\r\n */\r\n public setPage(pageNumber: number, pageSize?: number): Promise<void> {\r\n if (pageSize && pageSize !== this._pageSize) {\r\n this._pageSize = pageSize;\r\n }\r\n return new Promise((resolve, reject) => {\r\n // if page is in cache, return it\r\n const key = this.buildCacheKey(pageNumber, this._filter$.value);\r\n const cachedPage = this._cache.get(key);\r\n if (cachedPage) {\r\n this._page$.next(cachedPage);\r\n resolve();\r\n return;\r\n }\r\n\r\n // else load page\r\n this.loadPage(pageNumber).subscribe({\r\n next: (page) => {\r\n this._page$.next(page);\r\n this._cache.put(key, page, 0);\r\n resolve();\r\n },\r\n error: reject,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get the current page.\r\n * @returns The current page.\r\n */\r\n public getPage(): DataPage<E> {\r\n return this._page$.value;\r\n }\r\n\r\n /**\r\n * Apply the given filter and load the first page.\r\n * @param filter The filter to apply.\r\n * @returns Promise which resolves when the page is loaded.\r\n */\r\n public setFilter(filter: F): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n this._filter$.next(filter);\r\n this.setPage(1).then(resolve, reject);\r\n });\r\n }\r\n\r\n /**\r\n * Get the current filter.\r\n * @returns The current filter.\r\n */\r\n public getFilter(): F {\r\n return this._filter$.value;\r\n }\r\n\r\n /**\r\n * Reset the filter and load the first page. The cache is cleared.\r\n * @returns Promise which resolves when the page is loaded.\r\n */\r\n public reset(): Promise<void> {\r\n this._cache.clear();\r\n return this.setFilter({} as F);\r\n }\r\n\r\n /**\r\n * Clear the cache.\r\n */\r\n public clearCache(): void {\r\n this._cache.clear();\r\n }\r\n\r\n /**\r\n * Check if the page with the given number and filter is in cache.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns True if the page is in cache, false otherwise.\r\n */\r\n public hasCachedPage(pageNumber: number, filter: F): boolean {\r\n const key = this.buildCacheKey(pageNumber, filter);\r\n return this._cache.has(key);\r\n }\r\n}\r\n","import {\r\n BehaviorSubject,\r\n Observable,\r\n forkJoin,\r\n of,\r\n switchMap,\r\n tap,\r\n} from 'rxjs';\r\n\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\n\r\nimport { LRUCache } from './lru-cache';\r\nimport { DEFAULT_PAGED_LIST_STORE_OPTIONS } from './paged-list.store';\r\n\r\n/**\r\n * A tree node. Your data service should return a list of these nodes\r\n * or of any type extending this interface.\r\n */\r\nexport interface TreeNode {\r\n id: number;\r\n parentId?: number;\r\n y: number;\r\n x: number;\r\n label: string;\r\n tag?: string;\r\n hasChildren?: boolean;\r\n}\r\n\r\n/**\r\n * A filter for tree nodes.\r\n */\r\nexport interface TreeNodeFilter {\r\n tags?: string[];\r\n parentId?: number;\r\n}\r\n\r\n/**\r\n * Paging information for a paged tree node.\r\n */\r\nexport interface PagingInfo {\r\n pageNumber: number;\r\n pageCount: number;\r\n total: number;\r\n}\r\n\r\n/**\r\n * A tree node with paging information, used in NodeBrowserStore.\r\n */\r\nexport interface PagedTreeNode<F extends TreeNodeFilter> extends TreeNode {\r\n paging: PagingInfo;\r\n expanded?: boolean;\r\n filter?: F;\r\n}\r\n\r\n/**\r\n * The interface to be implemented by the service used by NodeBrowserStore\r\n * to load nodes.\r\n */\r\nexport interface PagedTreeStoreService<F extends TreeNodeFilter> {\r\n /**\r\n * Get all the root nodes, or just the ones having one of the specified\r\n * tags.\r\n * @param tags The optional tags to filter the root nodes.\r\n */\r\n getRootNodes(tags?: string[]): Observable<TreeNode[]>;\r\n\r\n /**\r\n * Get the specified page of nodes.\r\n * @param filter The filter.\r\n * @param pageNumber The page number.\r\n * @param pageSize The page size.\r\n */\r\n getNodes(\r\n filter: F,\r\n pageNumber: number,\r\n pageSize: number\r\n ): Observable<DataPage<TreeNode>>;\r\n\r\n /**\r\n * Get the list of unique node tags. Each tag corresponds to a tree,\r\n * as nodes are virtually grouped by their tag.\r\n */\r\n getTags(): Observable<string[]>;\r\n}\r\n\r\n/**\r\n * Options for the NodeBrowserStore.\r\n */\r\nexport interface PagedTreeStoreOptions {\r\n /**\r\n * The size of pages in the store.\r\n */\r\n pageSize: number;\r\n /**\r\n * The size of the cache for pages in the store.\r\n */\r\n cacheSize: number;\r\n\r\n /**\r\n * A custom function for building the cache key for the given page number\r\n * and filter.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n buildCacheKey?: (pageNumber: number, filter: any) => string;\r\n}\r\n\r\n/**\r\n * A store for the node browser component. This store is used to keep a\r\n * list of nodes, and to load them from the API. It also keeps the root\r\n * node. Every tree node in the list is extended with page number,\r\n * page count and total items, plus expansion-related metadata.\r\n * The store keeps a flat list of these tree nodes, allowing users to\r\n * expand and collapse them.\r\n * F is the type of the filter object, E is the type of the paged tree nodes.\r\n */\r\nexport class PagedTreeStore<\r\n E extends PagedTreeNode<F>,\r\n F extends TreeNodeFilter\r\n> {\r\n private _radix?: E;\r\n private _radixLabel: string;\r\n private _roots: E[];\r\n private _nodes$: BehaviorSubject<E[]>;\r\n private _tags$: BehaviorSubject<string[]>;\r\n private _filter$: BehaviorSubject<F>;\r\n private readonly _customCacheKeyBuilder?: (\r\n pageNumber: number,\r\n filter: any\r\n ) => string;\r\n private readonly _cache: LRUCache<DataPage<TreeNode>>;\r\n\r\n private _pageSize: number;\r\n // dirty state: this is reset when the store is reset, and set to true\r\n // when the store is changed\r\n private _dirty?: boolean;\r\n\r\n /**\r\n * The flat list of paged nodes in this store.\r\n */\r\n public nodes$: Observable<Readonly<E[]>>;\r\n\r\n /**\r\n * The list of tree tags in this store.\r\n */\r\n public tags$: Observable<Readonly<string[]>>;\r\n\r\n /**\r\n * The global nodes filter.\r\n */\r\n public filter$: Observable<Readonly<F>>;\r\n\r\n /**\r\n * The size of nodes pages in this store. If you change it, the store\r\n * is reset. The default value is 20.\r\n */\r\n public get pageSize(): number {\r\n return this._pageSize;\r\n }\r\n public set pageSize(value: number) {\r\n if (this._pageSize === value) {\r\n return;\r\n }\r\n this._pageSize = value;\r\n this.reset(this._radix?.label || this._radixLabel);\r\n }\r\n\r\n /**\r\n * Create an instance of the store.\r\n * @param _service The service used to load nodes.\r\n * @param options The options to configure this store.\r\n */\r\n constructor(\r\n private _service: PagedTreeStoreService<F>,\r\n options: PagedTreeStoreOptions = DEFAULT_PAGED_LIST_STORE_OPTIONS\r\n ) {\r\n this._pageSize = options.pageSize;\r\n this._cache = new LRUCache<DataPage<TreeNode>>(options.cacheSize);\r\n this._customCacheKeyBuilder = options.buildCacheKey;\r\n this._radixLabel = '(root)';\r\n this._roots = [];\r\n this._nodes$ = new BehaviorSubject<E[]>([]);\r\n this.nodes$ = this._nodes$.asObservable();\r\n this._tags$ = new BehaviorSubject<string[]>([]);\r\n this.tags$ = this._tags$.asObservable();\r\n this._filter$ = new BehaviorSubject<F>({} as F);\r\n this.filter$ = this._filter$.asObservable();\r\n this._dirty = true;\r\n this.updateTags();\r\n }\r\n\r\n private updateTags(): void {\r\n this._service.getTags().subscribe((tags) => {\r\n this._tags$.next(tags);\r\n });\r\n }\r\n\r\n /**\r\n * Gets the global filter, eventually overridden with values\r\n * from the specified node's filter.\r\n * @param node The optional node.\r\n * @returns The filter.\r\n */\r\n private getFilter(node?: PagedTreeNode<F>): F {\r\n return node?.filter\r\n ? {\r\n ...this._filter$.value,\r\n ...node.filter,\r\n }\r\n : this._filter$.value;\r\n }\r\n\r\n /**\r\n * Gets all the nodes in the store.\r\n * @returns The nodes.\r\n */\r\n public getNodes(): Readonly<PagedTreeNode<F>[]> {\r\n return this._nodes$.value;\r\n }\r\n\r\n /**\r\n * Gets the list of nodes tags.\r\n * @returns The tags.\r\n */\r\n public getTags(): Readonly<string[]> {\r\n return this._tags$.value;\r\n }\r\n\r\n /**\r\n * Build the cache key for the given page number and filter.\r\n * The default implementation just returns a stringified object\r\n * containing the page number and the filter. You may override\r\n * this method to provide a custom cache key.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n public buildCacheKey(pageNumber: number, filter: F): string {\r\n if (this._customCacheKeyBuilder) {\r\n return this._customCacheKeyBuilder(pageNumber, filter);\r\n }\r\n return JSON.stringify({ pageNumber, ...filter });\r\n }\r\n\r\n private getPageFromCacheOrServer(\r\n filter: F,\r\n pageNumber: number\r\n ): Observable<DataPage<TreeNode>> {\r\n const key = this.buildCacheKey(pageNumber, filter);\r\n const pageInCache = this._cache.get(key);\r\n\r\n if (pageInCache) {\r\n return of(pageInCache);\r\n } else {\r\n return this._service.getNodes(filter, pageNumber, this._pageSize).pipe(\r\n tap((page) => {\r\n this._cache.put(key, page, 0);\r\n })\r\n );\r\n }\r\n }\r\n\r\n private createPageNodes(page: DataPage<TreeNode>): PagedTreeNode<F>[] {\r\n return page.items.map((n) => {\r\n return {\r\n ...n,\r\n hasChildren: n.hasChildren,\r\n paging: {\r\n pageNumber: page.pageNumber,\r\n pageCount: page.pageCount,\r\n total: page.total,\r\n },\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Sets the filter for this store. Whenever the filter is set,\r\n * the store is reset.\r\n * @param filter The filter.\r\n * @param radixLabel The label of the radix node, if this needs to be set.\r\n * @returns true if tree was changed, false otherwise.\r\n */\r\n public setFilter(filter: F, radixLabel?: string): Promise<boolean> {\r\n if (this._filter$.value === filter) {\r\n return Promise.resolve(false);\r\n }\r\n this._filter$.next(filter);\r\n this._dirty = true;\r\n return this.reset(this._radix?.label || radixLabel || this._radixLabel);\r\n }\r\n\r\n /**\r\n * Reset the store, loading the root nodes and their children.\r\n * @param label The label of the radix node.\r\n * @returns true if tree was changed, false otherwise.\r\n */\r\n public reset(label: string): Promise<boolean> {\r\n if (!this._dirty) {\r\n return Promise.resolve(false);\r\n }\r\n this._cache.clear();\r\n const filter = this._filter$.value;\r\n this._radix = {\r\n id: 0,\r\n y: 0,\r\n x: 1,\r\n label: label,\r\n paging: {\r\n pageNumber: 0,\r\n pageCount: 0,\r\n total: 0,\r\n },\r\n } as E;\r\n\r\n return new Promise<boolean>((resolve, reject) => {\r\n this._service\r\n .getRootNodes(filter.tags)\r\n .pipe(\r\n switchMap((nodes) => {\r\n // no roots, clear and return empty set\r\n if (!nodes || nodes.length === 0) {\r\n this._roots = [];\r\n return of([]);\r\n } else {\r\n // got roots, set them and get their children\r\n this._roots = nodes.map(\r\n (node) =>\r\n ({\r\n ...node,\r\n paging: {\r\n pageNumber: 1,\r\n pageCount: 1,\r\n total: 1,\r\n },\r\n } as E)\r\n );\r\n // fetch children for each root node\r\n return forkJoin(\r\n this._roots.map((root) =>\r\n this.getPageFromCacheOrServer(\r\n { ...filter, parentId: root.id },\r\n 1\r\n )\r\n )\r\n );\r\n }\r\n })\r\n )\r\n .subscribe({\r\n next: (pages) => {\r\n this._dirty = false;\r\n if (pages.some((page) => page.total)) {\r\n // radix\r\n this._radix!.hasChildren = true;\r\n this._radix!.expanded = true;\r\n this._radix!.paging = {\r\n pageNumber: 1,\r\n pageCount: 1,\r\n total: pages.length,\r\n };\r\n // roots\r\n this._roots.forEach((root, i) => {\r\n root.hasChildren = !!pages[i].total;\r\n root.expanded = !!pages[i].total;\r\n });\r\n const nodes = this._roots.flatMap((root, i) => [\r\n root,\r\n ...this.createPageNodes(pages[i]),\r\n ]);\r\n this._nodes$.next([this._radix!, ...(nodes as E[])]);\r\n resolve(true);\r\n } else {\r\n this._roots.forEach((root) => {\r\n root.hasChildren = false;\r\n root.expanded = false;\r\n });\r\n this._nodes$.next([this._radix!, ...this._roots]);\r\n resolve(true);\r\n }\r\n },\r\n error: (error) => {\r\n reject(error);\r\n },\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Set the node filter for the node with the specified ID.\r\n * @param id The node ID.\r\n * @param filter The filter to set.\r\n * @returns Promise with true if filter was set, false otherwise.\r\n */\r\n public setNodeFilter(id: number, filter?: F | null): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n return new Promise<boolean>((resolve, reject) => {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node) {\r\n reject(`Node ID ${id} not found in store`);\r\n }\r\n node!.filter = filter || undefined;\r\n return this.changePage(id, 1);\r\n });\r\n }\r\n\r\n /**\r\n * Expand the node with the specified ID. If the node is not expandable,\r\n * or it is already expanded, this method does nothing.\r\n * @param node The ID of the node to expand.\r\n * @returns Promise with true if the node was expanded, false otherwise.\r\n */\r\n public expand(id: number): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n return new Promise<boolean>((resolve, reject) => {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node || node.hasChildren === false || node.expanded) {\r\n resolve(false);\r\n }\r\n\r\n this.getPageFromCacheOrServer(\r\n { ...this.getFilter(node), parentId: id },\r\n 1\r\n ).subscribe((page) => {\r\n // no children, set hasChildren to false\r\n if (!page.total) {\r\n node!.hasChildren = false;\r\n resolve(false);\r\n } else {\r\n this._dirty = true;\r\n // insert page nodes after the current node\r\n const nodes = this._nodes$.value;\r\n const index = nodes.indexOf(node!);\r\n if (index === -1) {\r\n reject(`Node ID ${id} not found in store`);\r\n } else {\r\n const pageNodes = this.createPageNodes(page);\r\n nodes.splice(index + 1, 0, ...(pageNodes as E[]));\r\n this._nodes$.next(nodes);\r\n node!.hasChildren = true;\r\n node!.expanded = true;\r\n resolve(true);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public expandAll(id: number): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n // get the parent node to start from\r\n const nodes = this._nodes$.value;\r\n const nodeIndex = nodes.findIndex((n) => n.id === id);\r\n if (nodeIndex === -1) {\r\n return Promise.resolve(false);\r\n }\r\n\r\n // collect all the descendant nodes IDs\r\n let i = nodeIndex + 1;\r\n while (i < nodes.length && nodes[i].y > nodes[nodeIndex].y) {\r\n i++;\r\n }\r\n const nodesToExpand = nodes.slice(nodeIndex, i).map((n) => n.id);\r\n\r\n // expand all the descendant nodes\r\n return new Promise<boolean>((resolve, reject) => {\r\n nodesToExpand.forEach((id) => {\r\n this.expand(id);\r\n this.expandAll(id);\r\n });\r\n resolve(true);\r\n });\r\n }\r\n\r\n public getChildren(id: number): E[] {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node || node.hasChildren === false) {\r\n return [];\r\n }\r\n const nodes = this._nodes$.value;\r\n const index = nodes.indexOf(node);\r\n if (index === -1) {\r\n return [];\r\n }\r\n const children: E[] = [];\r\n let i = index + 1;\r\n while (i < nodes.length && nodes[i].y > node.y) {\r\n children.push(nodes[i]);\r\n i++;\r\n }\r\n return children;\r\n }\r\n\r\n private removeDescendants(\r\n nodes: PagedTreeNode<F>[],\r\n nodeIndex: number\r\n ): void {\r\n let i = nodeIndex + 1;\r\n while (i < nodes.length && nodes[i].y > nodes[nodeIndex].y) {\r\n i++;\r\n }\r\n nodes.splice(nodeIndex + 1, i - nodeIndex - 1);\r\n }\r\n\r\n /**\r\n * Collapse the node with the specified ID. If the node is not expandable,\r\n * or it is already collapsed, this method does nothing.\r\n * @param node The node to collapse.\r\n * @returns Promise with true if the node was collapsed, false otherwise.\r\n */\r\n public collapse(id: number): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n return new Promise<boolean>((resolve, reject) => {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node || node.hasChildren === false || !node.expanded) {\r\n resolve(false);\r\n }\r\n\r\n // remove all the descendant nodes after the current node\r\n const nodes = this._nodes$.value;\r\n const nodeIndex = nodes.indexOf(node!);\r\n if (nodeIndex === -1) {\r\n reject(`Node ID ${id} not found in store`);\r\n } else {\r\n this._dirty = true;\r\n this.removeDescendants(nodes, nodeIndex);\r\n this._nodes$.next(nodes);\r\n node!.expanded = false;\r\n resolve(true);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Change the page including the node with the specified ID.\r\n * @param node The parent node whose children are inside the page you want to change.\r\n * @param pageNumber The new page number.\r\n * @returns Promise with true if the page was changed, false otherwise.\r\n */\r\n public changePage(parentId: number, pageNumber: number): Promise<boolean> {\r\n return new Promise<boolean>((resolve, reject) => {\r\n const parentNode = this._nodes$.value.find((n) => n.id === parentId);\r\n if (!parentNode) {\r\n resolve(false);\r\n }\r\n this.getPageFromCacheOrServer(\r\n { ...this.getFilter(parentNode), parentId },\r\n pageNumber\r\n ).subscribe((page) => {\r\n // if page is empty do nothing\r\n if (!page.total) {\r\n resolve(false);\r\n } else {\r\n this._dirty = true;\r\n // remove all the nodes in the same page of node\r\n // with all their descendants\r\n const nodes = this._nodes$.value;\r\n const nodeIndex = nodes.indexOf(parentNode!) + 1;\r\n const pageNodes = this.createPageNodes(page);\r\n // find the first node of the node's page\r\n let start = nodeIndex;\r\n const oldPageNr = nodes[start].paging.pageNumber;\r\n while (\r\n start > 0 &&\r\n nodes[start - 1].parentId === parentId &&\r\n nodes[start - 1].paging.pageNumber === oldPageNr\r\n ) {\r\n start--;\r\n }\r\n // find the last node of the node's page,\r\n // including all their descendants\r\n let end = nodeIndex + 1;\r\n while (\r\n end < nodes.length &&\r\n nodes[end].parentId === parentId &&\r\n nodes[end].paging.pageNumber === oldPageNr\r\n ) {\r\n end++;\r\n }\r\n // replace all these nodes with the new ones\r\n nodes.splice(start, end - start);\r\n nodes.splice(start, 0, ...(pageNodes as E[]));\r\n // update the parent node paging info\r\n parentNode!.paging.pageNumber = page.pageNumber;\r\n this._nodes$.next(nodes);\r\n resolve(true);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Collapse all the nodes in the store.\r\n */\r\n public collapseAll(): void {\r\n this._nodes$.next([this._radix!, ...this._roots]);\r\n }\r\n\r\n /**\r\n * Clear the cache.\r\n */\r\n public clearCache(): void {\r\n this._cache.clear();\r\n }\r\n\r\n /**\r\n * Check if the page with the given number and filter is in cache.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns True if the page is in cache, false otherwise.\r\n */\r\n public hasCachedPage(pageNumber: number, filter: F): boolean {\r\n const key = this.buildCacheKey(pageNumber, filter);\r\n return this._cache.has(key);\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { NgToolsModule } from '@myrmidon/ng-tools';\n\nimport { CompactPagerComponent } from './components/compact-pager/compact-pager.component';\nimport { RangeViewComponent } from './components/range-view/range-view.component';\nimport { BrowserTreeNodeComponent } from './components/browser-tree-node/browser-tree-node.component';\n\n@NgModule({\n declarations: [\n CompactPagerComponent,\n RangeViewComponent,\n BrowserTreeNodeComponent,\n ],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n // material\n MatBadgeModule,\n MatButtonModule,\n MatChipsModule,\n MatDialogModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatPaginatorModule,\n MatProgressBarModule,\n MatSelectModule,\n MatTooltipModule,\n // myrmidon\n NgToolsModule\n ],\n exports: [\n CompactPagerComponent,\n RangeViewComponent,\n BrowserTreeNodeComponent,\n ],\n})\nexport class PagedDataBrowsersModule {}\n","/*\n * Public API Surface of paged-data-browsers\n */\n\nexport * from './lib/components/compact-pager/compact-pager.component';\nexport * from './lib/components/range-view/range-view.component';\nexport * from './lib/components/browser-tree-node/browser-tree-node.component';\n\nexport * from './lib/services/paged-list.store';\nexport * from './lib/services/paged-tree.store';\nexport * from './lib/services/lru-cache';\n\nexport * from './lib/paged-data-browsers.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i4","i6.CompactPagerComponent","i7.RangeViewComponent"],"mappings":"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"}
1
+ {"version":3,"file":"myrmidon-paged-data-browsers.mjs","sources":["../../../../projects/myrmidon/paged-data-browsers/src/lib/components/compact-pager/compact-pager.component.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/compact-pager/compact-pager.component.html","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/range-view/range-view.component.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/range-view/range-view.component.html","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/browser-tree-node/browser-tree-node.component.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/components/browser-tree-node/browser-tree-node.component.html","../../../../projects/myrmidon/paged-data-browsers/src/lib/services/lru-cache.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/services/paged-list.store.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/services/paged-tree.store.ts","../../../../projects/myrmidon/paged-data-browsers/src/lib/paged-data-browsers.module.ts","../../../../projects/myrmidon/paged-data-browsers/src/public-api.ts","../../../../projects/myrmidon/paged-data-browsers/src/myrmidon-paged-data-browsers.ts"],"sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { PagingInfo } from '../../services/paged-tree.store';\n\n@Component({\n selector: 'pdb-compact-pager',\n templateUrl: './compact-pager.component.html',\n styleUrls: ['./compact-pager.component.scss'],\n})\nexport class CompactPagerComponent {\n @Input()\n public paging: PagingInfo;\n\n @Output()\n public pagingChange: EventEmitter<PagingInfo>;\n\n constructor() {\n this.paging = {\n pageNumber: 0,\n pageCount: 0,\n total: 0,\n };\n this.pagingChange = new EventEmitter<PagingInfo>();\n }\n\n public onFirst(): void {\n this.paging = { ...this.paging, pageNumber: 1 };\n this.pagingChange.emit(this.paging);\n }\n\n public onPrevious(): void {\n if (this.paging.pageNumber > 1) {\n this.paging = { ...this.paging, pageNumber: this.paging.pageNumber - 1 };\n this.pagingChange.emit(this.paging);\n }\n }\n\n public onNext(): void {\n if (this.paging.pageNumber < this.paging.pageCount) {\n this.paging = { ...this.paging, pageNumber: this.paging.pageNumber + 1 };\n this.pagingChange.emit(this.paging);\n }\n }\n\n public onLast(): void {\n if (this.paging.pageNumber < this.paging.pageCount) {\n this.paging = { ...this.paging, pageNumber: this.paging.pageCount };\n this.pagingChange.emit(this.paging);\n }\n }\n}\n","@if (paging.pageCount) {\n <div class=\"form-row\">\n <span id=\"pages\">{{ paging.pageNumber }}/{{ paging.pageCount }}</span>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onFirst()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>first_page</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onPrevious()\"\n [disabled]=\"paging.pageNumber < 2\"\n >\n <mat-icon>navigate_before</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onNext()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>navigate_next</mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"onLast()\"\n [disabled]=\"paging.pageNumber === paging.pageCount\"\n >\n <mat-icon>last_page</mat-icon>\n </button>\n <span id=\"total\">{{ paging.total }} </span>\n </div>\n}\n","import { Component, Input, OnChanges } from '@angular/core';\n\n@Component({\n selector: 'pdb-range-view',\n templateUrl: './range-view.component.html',\n styleUrls: ['./range-view.component.scss'],\n})\nexport class RangeViewComponent implements OnChanges {\n /**\n * The domain of the range view (start, limit).\n */\n @Input() public domain: Array<number>;\n /**\n * The range of the range view (start, limit).\n */\n @Input() public range: Array<number>;\n /**\n * The width of the component.\n */\n @Input() public width: number;\n /**\n * The height of the component.\n */\n @Input() public height: number;\n\n public scaledRange: Array<number>;\n\n constructor() {\n this.domain = [0, 100];\n this.range = [0, 100];\n this.width = 100;\n this.height = 5;\n this.scaledRange = [];\n }\n\n ngOnChanges() {\n const domainWidth = this.domain[1] - this.domain[0];\n const rangeWidth = this.range[1] - this.range[0];\n const rangeStart = this.range[0] - this.domain[0];\n\n this.scaledRange = [\n (rangeStart / domainWidth) * this.width,\n ((rangeStart + rangeWidth) / domainWidth) * this.width,\n ];\n }\n}\n","<svg [attr.width]=\"width\" [attr.height]=\"height\">\n <rect id=\"rdomain\" [attr.width]=\"width\" [attr.height]=\"height\" />\n <rect\n id=\"rrange\"\n [attr.x]=\"scaledRange[0]\"\n [attr.y]=\"0\"\n [attr.width]=\"scaledRange[1] - scaledRange[0]\"\n [attr.height]=\"height\"\n />\n</svg>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { PagedTreeNode, PagingInfo } from '../../services/paged-tree.store';\n\nexport interface PageChangeRequest {\n node: PagedTreeNode<any>;\n paging: PagingInfo;\n}\n\n/**\n * Browser tree node component view. This wraps some HTML content providing\n * a toggle button to expand/collapse the node, a paging control for the\n * node's children, and a button to edit the node's filter. You should then\n * provide the HTML content to display the node's data inside this component, e.g.\n * <pdb-browser-tree-node [node]=\"node\">\n * <your-node-view [node]=\"node\" />\n * <pdb-browser-tree-node>\n */\n@Component({\n selector: 'pdb-browser-tree-node',\n templateUrl: './browser-tree-node.component.html',\n styleUrls: ['./browser-tree-node.component.css'],\n})\nexport class BrowserTreeNodeComponent {\n private _node: PagedTreeNode<any> | undefined | null;\n\n /**\n * The node to display.\n */\n @Input()\n public get node(): PagedTreeNode<any> | undefined | null {\n return this._node;\n }\n\n public set node(value: PagedTreeNode<any> | undefined | null) {\n if (this._node === value) {\n return;\n }\n this._node = value;\n }\n\n /**\n * The paging information for the node's children.\n */\n @Input()\n paging?: PagingInfo;\n\n /**\n * True to show debug information.\n */\n @Input()\n public debug?: boolean;\n\n /**\n * True to hide the node's loc and label. This is useful if you want to\n * provide your own view for the node, between the expansion toggle and\n * the filter edit button. In this case, in your consumer template provide\n * your own view as the content of this component. If instead you are fine\n * with the default loc and label, and just want to add more data to\n * the view, then you can just add your own content to this component's\n * template, without setting this property to true.\n */\n @Input()\n public hideLabel?: boolean;\n\n /**\n * True to hide the node's paging control unless hovered.\n */\n @Input()\n public hidePaging?: boolean;\n\n /**\n * Emits when the user wants to toggle the expanded state of the node.\n */\n @Output()\n public toggleExpandedRequest: EventEmitter<PagedTreeNode<any>>;\n\n /**\n * Emits when the user wants to change the page number of the node's children.\n */\n @Output()\n public changePageRequest: EventEmitter<PageChangeRequest>;\n\n @Output()\n public editNodeFilterRequest: EventEmitter<PagedTreeNode<any>>;\n\n constructor() {\n this.toggleExpandedRequest = new EventEmitter<PagedTreeNode<any>>();\n this.changePageRequest = new EventEmitter<PageChangeRequest>();\n this.editNodeFilterRequest = new EventEmitter<PagedTreeNode<any>>();\n }\n\n public onToggleExpanded(): void {\n if (!this._node) {\n return;\n }\n this.toggleExpandedRequest.emit(this._node as PagedTreeNode<any>);\n }\n\n public onPagingChange(node: PagedTreeNode<any>, paging: PagingInfo): void {\n this.changePageRequest.emit({\n node,\n paging,\n });\n }\n\n public onEditFilter(): void {\n if (this._node) {\n this.editNodeFilterRequest.emit(this._node);\n }\n }\n}\n","@if (node) {\n <div id=\"node\" [style.margin-left.px]=\"(node.y - 1) * 20\">\n <!-- pager -->\n @if ($any(node).expanded && paging && paging.pageCount > 1) {\n <div\n id=\"pager\"\n [style.display]=\"hidePaging ? 'inherit' : 'block'\"\n >\n <pdb-compact-pager\n [paging]=\"paging\"\n (pagingChange)=\"onPagingChange($any(node), $event)\"\n />\n <pdb-range-view\n [width]=\"250\"\n [domain]=\"[0, paging.pageCount]\"\n [range]=\"[paging.pageNumber - 1, paging.pageNumber]\"\n />\n </div>\n }\n <!-- node -->\n <div class=\"form-row\">\n <!-- expand/collapse button -->\n @if (node.y > 0) {\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\n [disabled]=\"node.hasChildren === false\"\n (click)=\"onToggleExpanded()\"\n >\n <mat-icon>{{\n node.hasChildren === true || node.hasChildren === undefined\n ? $any(node).expanded\n ? \"expand_less\"\n : \"expand_more\"\n : \"stop\"\n }}</mat-icon>\n </button>\n }\n <!-- tag -->\n @if (!hideLabel) {\n <span\n class=\"tag\"\n [ngStyle]=\"{\r\n 'background-color': (node.tag | stringToColor),\r\n color: node.tag | stringToColor | colorToContrast\r\n }\"\r\n >{{ node.tag }}</span\n >\n <!-- loc and label -->\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\n }\n <!-- PROJECTED NODE -->\n <ng-content></ng-content>\n <!-- debug -->\n @if (debug) {\n <span class=\"debug\"\n >#{{ node.id }}\n <span\n >| {{ $any(node).paging.pageNumber }}/{{\n $any(node).paging.pageCount\n }}\n ({{ $any(node).paging.total }})</span\n ></span\n >\n }\n <!-- filter -->\n @if (!$any(node).filter && node.y) {\n <div class=\"muted\">\n <button\n type=\"button\"\n mat-icon-button\n matTooltip=\"Add filter\"\n (click)=\"onEditFilter()\"\n >\n <mat-icon>filter_list</mat-icon>\n </button>\n </div>\n }\n @if ($any(node).filter && node.y) {\n <div class=\"muted\">\n <button type=\"button\" mat-icon-button (click)=\"onEditFilter()\">\n <mat-icon [matBadge]=\"$any(node).filter ? 'F' : ''\"\n >filter_alt</mat-icon\n >\n </button>\n </div>\n }\n </div>\n </div>\n }\n","/**\r\n * A Least Recently Used cache that can be used to store any type of object.\r\n * The cache works in two modes: considering the size of the objects or not.\r\n * If the size is considered, the cache will have a maximum size and will\r\n * remove the oldest objects when the maximum size is reached. Note that\r\n * the size is only roughly estimated. This avoids removing too many\r\n * entries from the cache when the maximum is reached.\r\n * If the size is not considered, the cache will have a maximum number of\r\n * objects and will remove the oldest objects when the maximum number is\r\n * reached.\r\n */\r\nexport class LRUCache<T> {\r\n private _maxSize: number;\r\n private _totalSize: number;\r\n private _considerSize: boolean;\r\n private _cache: Map<string, T>;\r\n private _sizes: Map<string, number>;\r\n\r\n /**\r\n * Creates a new cache.\r\n * @param maxSize The maximum size of the cache. This is either\r\n * the maximum number of items in the cache (when considerSize\r\n * is false) or the maximum total size of all items in the\r\n * cache in bytes (when considerSize is true).\r\n * @param considerSize True if the size of the objects should be\r\n * considered.\r\n */\r\n constructor(maxSize: number, considerSize: boolean = false) {\r\n this._maxSize = maxSize;\r\n this._totalSize = 0;\r\n this._considerSize = considerSize;\r\n this._cache = new Map<string, T>();\r\n this._sizes = new Map<string, number>();\r\n }\r\n\r\n /**\r\n * Get an item from the cache.\r\n * @param key The key of the item to get.\r\n * @returns The item or undefined if the item is not in the cache.\r\n */\r\n public get(key: string): T | undefined {\r\n let item: T | undefined = this._cache.get(key);\r\n if (item) {\r\n this._cache.delete(key);\r\n this._cache.set(key, item);\r\n }\r\n return item;\r\n }\r\n\r\n /**\r\n * Check if an item is in the cache.\r\n * @param key The key of the item to check.\r\n * @returns True if the item is in cache.\r\n */\r\n public has(key: string): boolean {\r\n return this._cache.has(key);\r\n }\r\n\r\n /**\r\n * Put an item in the cache.\r\n * @param key The key of the item to put.\r\n * @param item The item to put.\r\n * @param size The estimated size of the item in bytes.\r\n * This must be calculated by the caller but only when\r\n * considerSize is true.\r\n */\r\n public put(key: string, item: T, size: number): void {\r\n this._cache.delete(key);\r\n this._cache.set(key, item);\r\n this._sizes.set(key, size);\r\n if (this._considerSize) {\r\n this._totalSize += size;\r\n while (this._totalSize > this._maxSize) {\r\n const oldestKey = this._cache.keys().next().value;\r\n let oldestSize = this._sizes.get(oldestKey);\r\n if (oldestSize) {\r\n this._totalSize -= oldestSize;\r\n }\r\n this._cache.delete(oldestKey);\r\n this._sizes.delete(oldestKey);\r\n }\r\n } else {\r\n while (this._cache.size > this._maxSize) {\r\n const oldestKey = this._cache.keys().next().value;\r\n this._cache.delete(oldestKey);\r\n this._sizes.delete(oldestKey);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the cache.\r\n */\r\n public clear(): void {\r\n this._cache.clear();\r\n this._sizes.clear();\r\n this._totalSize = 0;\r\n }\r\n\r\n /**\r\n * Estimate the size of an object in bytes.\r\n * @param obj The object to calculate the size of.\r\n * @returns The estimated size of the object in bytes.\r\n */\r\n public static calculateObjectSize(obj: any): number {\r\n if (!obj) {\r\n return 0;\r\n }\r\n let totalSize = 0;\r\n let keys = Object.keys(obj);\r\n for (let key of keys) {\r\n let value = obj[key];\r\n if (typeof value === 'string') {\r\n totalSize += value.length * 2;\r\n } else if (typeof value === 'number') {\r\n totalSize += 8;\r\n } else if (typeof value === 'boolean') {\r\n totalSize += 4;\r\n } else if (typeof value === 'object' && value !== null) {\r\n totalSize += this.calculateObjectSize(value);\r\n }\r\n }\r\n return totalSize;\r\n }\r\n}\r\n","import { BehaviorSubject, Observable } from 'rxjs';\r\n\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\n\r\nimport { LRUCache } from './lru-cache';\r\n\r\n/**\r\n * Options for the paged list store.\r\n */\r\nexport interface PagedListStoreOptions {\r\n /**\r\n * The size of pages in the store.\r\n */\r\n pageSize: number;\r\n /**\r\n * The size of the cache for pages in the store.\r\n */\r\n cacheSize: number;\r\n\r\n /**\r\n * A custom function for building the cache key for the given page number\r\n * and filter.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n buildCacheKey?: (pageNumber: number, filter: any) => string;\r\n}\r\n\r\n/**\r\n * Default options for the paged list store.\r\n */\r\nexport const DEFAULT_PAGED_LIST_STORE_OPTIONS: PagedListStoreOptions = {\r\n pageSize: 20,\r\n cacheSize: 50,\r\n};\r\n\r\n/**\r\n * The interface to be implemented by the service used by PagedListStore.\r\n */\r\nexport interface PagedListStoreService<F, E> {\r\n /**\r\n * Load the page with the given number.\r\n * @param pageNumber The page number to load.\r\n * @param pageSize The size of the page to load.\r\n * @param filter The filter to apply.\r\n */\r\n loadPage(\r\n pageNumber: number,\r\n pageSize: number,\r\n filter: F\r\n ): Observable<DataPage<E>>;\r\n}\r\n\r\n/**\r\n * A generic paged list store using a filter object of type F\r\n * and a list of elements of type E.\r\n */\r\nexport class PagedListStore<F, E> {\r\n private _pageSize: number;\r\n private readonly _customCacheKeyBuilder?: (\r\n pageNumber: number,\r\n filter: any\r\n ) => string;\r\n private _page$: BehaviorSubject<DataPage<E>>;\r\n private _filter$: BehaviorSubject<F>;\r\n private readonly _cache: LRUCache<DataPage<E>>;\r\n\r\n /**\r\n * The page. It is updated when the page is changed or the filter is changed.\r\n */\r\n public page$: Observable<Readonly<DataPage<E>>>;\r\n\r\n /**\r\n * The filter. It is updated when the filter is changed.\r\n */\r\n public filter$: Observable<Readonly<F>>;\r\n\r\n /**\r\n * The size of nodes pages in this store. If you change it, the store\r\n * is reset. The default value is 20.\r\n */\r\n public get pageSize(): number {\r\n return this._pageSize;\r\n }\r\n public set pageSize(value: number) {\r\n if (this._pageSize === value) {\r\n return;\r\n }\r\n this._pageSize = value;\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Create a new paged list store.\r\n * @param options Options for the paged list store.\r\n */\r\n constructor(\r\n private _service: PagedListStoreService<F, E>,\r\n options: PagedListStoreOptions = DEFAULT_PAGED_LIST_STORE_OPTIONS\r\n ) {\r\n this._pageSize = options.pageSize;\r\n this._cache = new LRUCache<DataPage<E>>(options.cacheSize);\r\n // page\r\n this._page$ = new BehaviorSubject<DataPage<E>>({\r\n pageNumber: 0,\r\n pageCount: 0,\r\n pageSize: 0,\r\n total: 0,\r\n items: [],\r\n });\r\n this.page$ = this._page$.asObservable();\r\n // filter\r\n this._filter$ = new BehaviorSubject<F>({} as F);\r\n this.filter$ = this._filter$.asObservable();\r\n }\r\n\r\n /**\r\n * Returns true if the store is empty, false otherwise.\r\n * @returns true if the store is empty, false otherwise.\r\n */\r\n public isEmpty(): boolean {\r\n return this._page$.value.items.length === 0;\r\n }\r\n\r\n /**\r\n * Build the cache key for the given page number and filter.\r\n * The default implementation just returns a stringified object\r\n * containing the page number and the filter. You may override\r\n * this method to provide a custom cache key.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n public buildCacheKey(pageNumber: number, filter: F): string {\r\n if (this._customCacheKeyBuilder) {\r\n return this._customCacheKeyBuilder(pageNumber, filter);\r\n }\r\n return JSON.stringify({ pageNumber, ...filter });\r\n }\r\n\r\n /**\r\n * Load the page with the given number.\r\n * @param pageNumber the page number to load.\r\n */\r\n private loadPage(pageNumber: number): Observable<DataPage<E>> {\r\n return this._service.loadPage(\r\n pageNumber,\r\n this._pageSize,\r\n this._filter$.value\r\n );\r\n }\r\n\r\n /**\r\n * Set the page with the given number.\r\n * @param pageNumber The page number to load.\r\n * @param pageSize The page size.\r\n * @returns Promise which resolves when the page is loaded.\r\n */\r\n public setPage(pageNumber: number, pageSize?: number): Promise<void> {\r\n if (pageSize && pageSize !== this._pageSize) {\r\n this._pageSize = pageSize;\r\n }\r\n return new Promise((resolve, reject) => {\r\n // if page is in cache, return it\r\n const key = this.buildCacheKey(pageNumber, this._filter$.value);\r\n const cachedPage = this._cache.get(key);\r\n if (cachedPage) {\r\n this._page$.next(cachedPage);\r\n resolve();\r\n return;\r\n }\r\n\r\n // else load page\r\n this.loadPage(pageNumber).subscribe({\r\n next: (page) => {\r\n this._page$.next(page);\r\n this._cache.put(key, page, 0);\r\n resolve();\r\n },\r\n error: reject,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get the current page.\r\n * @returns The current page.\r\n */\r\n public getPage(): DataPage<E> {\r\n return this._page$.value;\r\n }\r\n\r\n /**\r\n * Apply the given filter and load the first page.\r\n * @param filter The filter to apply.\r\n * @returns Promise which resolves when the page is loaded.\r\n */\r\n public setFilter(filter: F): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n this._filter$.next(filter);\r\n this.setPage(1).then(resolve, reject);\r\n });\r\n }\r\n\r\n /**\r\n * Get the current filter.\r\n * @returns The current filter.\r\n */\r\n public getFilter(): F {\r\n return this._filter$.value;\r\n }\r\n\r\n /**\r\n * Reset the filter and load the first page. The cache is cleared.\r\n * @returns Promise which resolves when the page is loaded.\r\n */\r\n public reset(): Promise<void> {\r\n this._cache.clear();\r\n return this.setFilter({} as F);\r\n }\r\n\r\n /**\r\n * Clear the cache.\r\n */\r\n public clearCache(): void {\r\n this._cache.clear();\r\n }\r\n\r\n /**\r\n * Check if the page with the given number and filter is in cache.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns True if the page is in cache, false otherwise.\r\n */\r\n public hasCachedPage(pageNumber: number, filter: F): boolean {\r\n const key = this.buildCacheKey(pageNumber, filter);\r\n return this._cache.has(key);\r\n }\r\n}\r\n","import {\r\n BehaviorSubject,\r\n Observable,\r\n forkJoin,\r\n of,\r\n switchMap,\r\n tap,\r\n} from 'rxjs';\r\n\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\n\r\nimport { LRUCache } from './lru-cache';\r\nimport { DEFAULT_PAGED_LIST_STORE_OPTIONS } from './paged-list.store';\r\n\r\n/**\r\n * A tree node. Your data service should return a list of these nodes\r\n * or of any type extending this interface.\r\n */\r\nexport interface TreeNode {\r\n id: number;\r\n parentId?: number;\r\n y: number;\r\n x: number;\r\n label: string;\r\n tag?: string;\r\n hasChildren?: boolean;\r\n}\r\n\r\n/**\r\n * A filter for tree nodes.\r\n */\r\nexport interface TreeNodeFilter {\r\n tags?: string[];\r\n parentId?: number;\r\n}\r\n\r\n/**\r\n * Paging information for a paged tree node.\r\n */\r\nexport interface PagingInfo {\r\n pageNumber: number;\r\n pageCount: number;\r\n total: number;\r\n}\r\n\r\n/**\r\n * A tree node with paging information, used in NodeBrowserStore.\r\n */\r\nexport interface PagedTreeNode<F extends TreeNodeFilter> extends TreeNode {\r\n paging: PagingInfo;\r\n expanded?: boolean;\r\n filter?: F;\r\n}\r\n\r\n/**\r\n * The interface to be implemented by the service used by NodeBrowserStore\r\n * to load nodes.\r\n */\r\nexport interface PagedTreeStoreService<F extends TreeNodeFilter> {\r\n /**\r\n * Get all the root nodes, or just the ones having one of the specified\r\n * tags.\r\n * @param tags The optional tags to filter the root nodes.\r\n */\r\n getRootNodes(tags?: string[]): Observable<TreeNode[]>;\r\n\r\n /**\r\n * Get the specified page of nodes.\r\n * @param filter The filter.\r\n * @param pageNumber The page number.\r\n * @param pageSize The page size.\r\n */\r\n getNodes(\r\n filter: F,\r\n pageNumber: number,\r\n pageSize: number\r\n ): Observable<DataPage<TreeNode>>;\r\n\r\n /**\r\n * Get the list of unique node tags. Each tag corresponds to a tree,\r\n * as nodes are virtually grouped by their tag.\r\n */\r\n getTags(): Observable<string[]>;\r\n}\r\n\r\n/**\r\n * Options for the NodeBrowserStore.\r\n */\r\nexport interface PagedTreeStoreOptions {\r\n /**\r\n * The size of pages in the store.\r\n */\r\n pageSize: number;\r\n /**\r\n * The size of the cache for pages in the store.\r\n */\r\n cacheSize: number;\r\n\r\n /**\r\n * A custom function for building the cache key for the given page number\r\n * and filter.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n buildCacheKey?: (pageNumber: number, filter: any) => string;\r\n}\r\n\r\n/**\r\n * A store for the node browser component. This store is used to keep a\r\n * list of nodes, and to load them from the API. It also keeps the root\r\n * node. Every tree node in the list is extended with page number,\r\n * page count and total items, plus expansion-related metadata.\r\n * The store keeps a flat list of these tree nodes, allowing users to\r\n * expand and collapse them.\r\n * F is the type of the filter object, E is the type of the paged tree nodes.\r\n */\r\nexport class PagedTreeStore<\r\n E extends PagedTreeNode<F>,\r\n F extends TreeNodeFilter\r\n> {\r\n private _radix?: E;\r\n private _radixLabel: string;\r\n private _roots: E[];\r\n private _nodes$: BehaviorSubject<E[]>;\r\n private _tags$: BehaviorSubject<string[]>;\r\n private _filter$: BehaviorSubject<F>;\r\n private readonly _customCacheKeyBuilder?: (\r\n pageNumber: number,\r\n filter: any\r\n ) => string;\r\n private readonly _cache: LRUCache<DataPage<TreeNode>>;\r\n\r\n private _pageSize: number;\r\n // dirty state: this is reset when the store is reset, and set to true\r\n // when the store is changed\r\n private _dirty?: boolean;\r\n\r\n /**\r\n * The flat list of paged nodes in this store.\r\n */\r\n public nodes$: Observable<Readonly<E[]>>;\r\n\r\n /**\r\n * The list of tree tags in this store.\r\n */\r\n public tags$: Observable<Readonly<string[]>>;\r\n\r\n /**\r\n * The global nodes filter.\r\n */\r\n public filter$: Observable<Readonly<F>>;\r\n\r\n /**\r\n * The size of nodes pages in this store. If you change it, the store\r\n * is reset. The default value is 20.\r\n */\r\n public get pageSize(): number {\r\n return this._pageSize;\r\n }\r\n public set pageSize(value: number) {\r\n if (this._pageSize === value) {\r\n return;\r\n }\r\n this._pageSize = value;\r\n this.reset(this._radix?.label || this._radixLabel);\r\n }\r\n\r\n /**\r\n * Create an instance of the store.\r\n * @param _service The service used to load nodes.\r\n * @param options The options to configure this store.\r\n */\r\n constructor(\r\n private _service: PagedTreeStoreService<F>,\r\n options: PagedTreeStoreOptions = DEFAULT_PAGED_LIST_STORE_OPTIONS\r\n ) {\r\n this._pageSize = options.pageSize;\r\n this._cache = new LRUCache<DataPage<TreeNode>>(options.cacheSize);\r\n this._customCacheKeyBuilder = options.buildCacheKey;\r\n this._radixLabel = '(root)';\r\n this._roots = [];\r\n this._nodes$ = new BehaviorSubject<E[]>([]);\r\n this.nodes$ = this._nodes$.asObservable();\r\n this._tags$ = new BehaviorSubject<string[]>([]);\r\n this.tags$ = this._tags$.asObservable();\r\n this._filter$ = new BehaviorSubject<F>({} as F);\r\n this.filter$ = this._filter$.asObservable();\r\n this._dirty = true;\r\n this.updateTags();\r\n }\r\n\r\n private updateTags(): void {\r\n this._service.getTags().subscribe((tags) => {\r\n this._tags$.next(tags);\r\n });\r\n }\r\n\r\n /**\r\n * Gets the global filter, eventually overridden with values\r\n * from the specified node's filter.\r\n * @param node The optional node.\r\n * @returns The filter.\r\n */\r\n private getFilter(node?: PagedTreeNode<F>): F {\r\n return node?.filter\r\n ? {\r\n ...this._filter$.value,\r\n ...node.filter,\r\n }\r\n : this._filter$.value;\r\n }\r\n\r\n /**\r\n * Gets all the nodes in the store.\r\n * @returns The nodes.\r\n */\r\n public getNodes(): Readonly<PagedTreeNode<F>[]> {\r\n return this._nodes$.value;\r\n }\r\n\r\n /**\r\n * Gets the list of nodes tags.\r\n * @returns The tags.\r\n */\r\n public getTags(): Readonly<string[]> {\r\n return this._tags$.value;\r\n }\r\n\r\n /**\r\n * Build the cache key for the given page number and filter.\r\n * The default implementation just returns a stringified object\r\n * containing the page number and the filter. You may override\r\n * this method to provide a custom cache key.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns A string to be used as cache key.\r\n */\r\n public buildCacheKey(pageNumber: number, filter: F): string {\r\n if (this._customCacheKeyBuilder) {\r\n return this._customCacheKeyBuilder(pageNumber, filter);\r\n }\r\n return JSON.stringify({ pageNumber, ...filter });\r\n }\r\n\r\n private getPageFromCacheOrServer(\r\n filter: F,\r\n pageNumber: number\r\n ): Observable<DataPage<TreeNode>> {\r\n const key = this.buildCacheKey(pageNumber, filter);\r\n const pageInCache = this._cache.get(key);\r\n\r\n if (pageInCache) {\r\n return of(pageInCache);\r\n } else {\r\n return this._service.getNodes(filter, pageNumber, this._pageSize).pipe(\r\n tap((page) => {\r\n this._cache.put(key, page, 0);\r\n })\r\n );\r\n }\r\n }\r\n\r\n private createPageNodes(page: DataPage<TreeNode>): PagedTreeNode<F>[] {\r\n return page.items.map((n) => {\r\n return {\r\n ...n,\r\n hasChildren: n.hasChildren,\r\n paging: {\r\n pageNumber: page.pageNumber,\r\n pageCount: page.pageCount,\r\n total: page.total,\r\n },\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Sets the filter for this store. Whenever the filter is set,\r\n * the store is reset.\r\n * @param filter The filter.\r\n * @param radixLabel The label of the radix node, if this needs to be set.\r\n * @returns true if tree was changed, false otherwise.\r\n */\r\n public setFilter(filter: F, radixLabel?: string): Promise<boolean> {\r\n if (this._filter$.value === filter) {\r\n return Promise.resolve(false);\r\n }\r\n this._filter$.next(filter);\r\n this._dirty = true;\r\n return this.reset(this._radix?.label || radixLabel || this._radixLabel);\r\n }\r\n\r\n /**\r\n * Reset the store, loading the root nodes and their children.\r\n * @param label The label of the radix node.\r\n * @returns true if tree was changed, false otherwise.\r\n */\r\n public reset(label: string): Promise<boolean> {\r\n if (!this._dirty) {\r\n return Promise.resolve(false);\r\n }\r\n this._cache.clear();\r\n const filter = this._filter$.value;\r\n this._radix = {\r\n id: 0,\r\n y: 0,\r\n x: 1,\r\n label: label,\r\n paging: {\r\n pageNumber: 0,\r\n pageCount: 0,\r\n total: 0,\r\n },\r\n } as E;\r\n\r\n return new Promise<boolean>((resolve, reject) => {\r\n this._service\r\n .getRootNodes(filter.tags)\r\n .pipe(\r\n switchMap((nodes) => {\r\n // no roots, clear and return empty set\r\n if (!nodes || nodes.length === 0) {\r\n this._roots = [];\r\n return of([]);\r\n } else {\r\n // got roots, set them and get their children\r\n this._roots = nodes.map(\r\n (node) =>\r\n ({\r\n ...node,\r\n paging: {\r\n pageNumber: 1,\r\n pageCount: 1,\r\n total: 1,\r\n },\r\n } as E)\r\n );\r\n // fetch children for each root node\r\n return forkJoin(\r\n this._roots.map((root) =>\r\n this.getPageFromCacheOrServer(\r\n { ...filter, parentId: root.id },\r\n 1\r\n )\r\n )\r\n );\r\n }\r\n })\r\n )\r\n .subscribe({\r\n next: (pages) => {\r\n this._dirty = false;\r\n if (pages.some((page) => page.total)) {\r\n // radix\r\n this._radix!.hasChildren = true;\r\n this._radix!.expanded = true;\r\n this._radix!.paging = {\r\n pageNumber: 1,\r\n pageCount: 1,\r\n total: pages.length,\r\n };\r\n // roots\r\n this._roots.forEach((root, i) => {\r\n root.hasChildren = !!pages[i].total;\r\n root.expanded = !!pages[i].total;\r\n });\r\n const nodes = this._roots.flatMap((root, i) => [\r\n root,\r\n ...this.createPageNodes(pages[i]),\r\n ]);\r\n this._nodes$.next([this._radix!, ...(nodes as E[])]);\r\n resolve(true);\r\n } else {\r\n this._roots.forEach((root) => {\r\n root.hasChildren = false;\r\n root.expanded = false;\r\n });\r\n this._nodes$.next([this._radix!, ...this._roots]);\r\n resolve(true);\r\n }\r\n },\r\n error: (error) => {\r\n reject(error);\r\n },\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Set the node filter for the node with the specified ID.\r\n * @param id The node ID.\r\n * @param filter The filter to set.\r\n * @returns Promise with true if filter was set, false otherwise.\r\n */\r\n public setNodeFilter(id: number, filter?: F | null): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n return new Promise<boolean>((resolve, reject) => {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node) {\r\n reject(`Node ID ${id} not found in store`);\r\n }\r\n node!.filter = filter || undefined;\r\n return this.changePage(id, 1);\r\n });\r\n }\r\n\r\n /**\r\n * Expand the node with the specified ID. If the node is not expandable,\r\n * or it is already expanded, this method does nothing.\r\n * @param node The ID of the node to expand.\r\n * @returns Promise with true if the node was expanded, false otherwise.\r\n */\r\n public expand(id: number): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n return new Promise<boolean>((resolve, reject) => {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node || node.hasChildren === false || node.expanded) {\r\n resolve(false);\r\n }\r\n\r\n this.getPageFromCacheOrServer(\r\n { ...this.getFilter(node), parentId: id },\r\n 1\r\n ).subscribe((page) => {\r\n // no children, set hasChildren to false\r\n if (!page.total) {\r\n node!.hasChildren = false;\r\n resolve(false);\r\n } else {\r\n this._dirty = true;\r\n // insert page nodes after the current node\r\n const nodes = this._nodes$.value;\r\n const index = nodes.indexOf(node!);\r\n if (index === -1) {\r\n reject(`Node ID ${id} not found in store`);\r\n } else {\r\n const pageNodes = this.createPageNodes(page);\r\n nodes.splice(index + 1, 0, ...(pageNodes as E[]));\r\n this._nodes$.next(nodes);\r\n node!.hasChildren = true;\r\n node!.expanded = true;\r\n resolve(true);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public expandAll(id: number): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n // get the parent node to start from\r\n const nodes = this._nodes$.value;\r\n const nodeIndex = nodes.findIndex((n) => n.id === id);\r\n if (nodeIndex === -1) {\r\n return Promise.resolve(false);\r\n }\r\n\r\n // collect all the descendant nodes IDs\r\n let i = nodeIndex + 1;\r\n while (i < nodes.length && nodes[i].y > nodes[nodeIndex].y) {\r\n i++;\r\n }\r\n const nodesToExpand = nodes.slice(nodeIndex, i).map((n) => n.id);\r\n\r\n // expand all the descendant nodes\r\n return new Promise<boolean>((resolve, reject) => {\r\n nodesToExpand.forEach((id) => {\r\n this.expand(id);\r\n this.expandAll(id);\r\n });\r\n resolve(true);\r\n });\r\n }\r\n\r\n public getChildren(id: number): E[] {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node || node.hasChildren === false) {\r\n return [];\r\n }\r\n const nodes = this._nodes$.value;\r\n const index = nodes.indexOf(node);\r\n if (index === -1) {\r\n return [];\r\n }\r\n const children: E[] = [];\r\n let i = index + 1;\r\n while (i < nodes.length && nodes[i].y > node.y) {\r\n children.push(nodes[i]);\r\n i++;\r\n }\r\n return children;\r\n }\r\n\r\n private removeDescendants(\r\n nodes: PagedTreeNode<F>[],\r\n nodeIndex: number\r\n ): void {\r\n let i = nodeIndex + 1;\r\n while (i < nodes.length && nodes[i].y > nodes[nodeIndex].y) {\r\n i++;\r\n }\r\n nodes.splice(nodeIndex + 1, i - nodeIndex - 1);\r\n }\r\n\r\n /**\r\n * Collapse the node with the specified ID. If the node is not expandable,\r\n * or it is already collapsed, this method does nothing.\r\n * @param node The node to collapse.\r\n * @returns Promise with true if the node was collapsed, false otherwise.\r\n */\r\n public collapse(id: number): Promise<boolean> {\r\n if (!id) {\r\n return Promise.resolve(false);\r\n }\r\n return new Promise<boolean>((resolve, reject) => {\r\n const node = this._nodes$.value.find((n) => n.id === id);\r\n if (!node || node.hasChildren === false || !node.expanded) {\r\n resolve(false);\r\n }\r\n\r\n // remove all the descendant nodes after the current node\r\n const nodes = this._nodes$.value;\r\n const nodeIndex = nodes.indexOf(node!);\r\n if (nodeIndex === -1) {\r\n reject(`Node ID ${id} not found in store`);\r\n } else {\r\n this._dirty = true;\r\n this.removeDescendants(nodes, nodeIndex);\r\n this._nodes$.next(nodes);\r\n node!.expanded = false;\r\n resolve(true);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Change the page including the node with the specified ID.\r\n * @param node The parent node whose children are inside the page you want to change.\r\n * @param pageNumber The new page number.\r\n * @returns Promise with true if the page was changed, false otherwise.\r\n */\r\n public changePage(parentId: number, pageNumber: number): Promise<boolean> {\r\n return new Promise<boolean>((resolve, reject) => {\r\n const parentNode = this._nodes$.value.find((n) => n.id === parentId);\r\n if (!parentNode) {\r\n resolve(false);\r\n }\r\n this.getPageFromCacheOrServer(\r\n { ...this.getFilter(parentNode), parentId },\r\n pageNumber\r\n ).subscribe((page) => {\r\n // if page is empty do nothing\r\n if (!page.total) {\r\n resolve(false);\r\n } else {\r\n this._dirty = true;\r\n // remove all the nodes in the same page of node\r\n // with all their descendants\r\n const nodes = this._nodes$.value;\r\n const nodeIndex = nodes.indexOf(parentNode!) + 1;\r\n const pageNodes = this.createPageNodes(page);\r\n // find the first node of the node's page\r\n let start = nodeIndex;\r\n const oldPageNr = nodes[start].paging.pageNumber;\r\n while (\r\n start > 0 &&\r\n nodes[start - 1].parentId === parentId &&\r\n nodes[start - 1].paging.pageNumber === oldPageNr\r\n ) {\r\n start--;\r\n }\r\n // find the last node of the node's page,\r\n // including all their descendants\r\n let end = nodeIndex + 1;\r\n while (\r\n end < nodes.length &&\r\n nodes[end].parentId === parentId &&\r\n nodes[end].paging.pageNumber === oldPageNr\r\n ) {\r\n end++;\r\n }\r\n // replace all these nodes with the new ones\r\n nodes.splice(start, end - start);\r\n nodes.splice(start, 0, ...(pageNodes as E[]));\r\n // update the parent node paging info\r\n parentNode!.paging.pageNumber = page.pageNumber;\r\n this._nodes$.next(nodes);\r\n resolve(true);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Collapse all the nodes in the store.\r\n */\r\n public collapseAll(): void {\r\n this._nodes$.next([this._radix!, ...this._roots]);\r\n }\r\n\r\n /**\r\n * Clear the cache.\r\n */\r\n public clearCache(): void {\r\n this._cache.clear();\r\n }\r\n\r\n /**\r\n * Check if the page with the given number and filter is in cache.\r\n * @param pageNumber The page number.\r\n * @param filter The filter.\r\n * @returns True if the page is in cache, false otherwise.\r\n */\r\n public hasCachedPage(pageNumber: number, filter: F): boolean {\r\n const key = this.buildCacheKey(pageNumber, filter);\r\n return this._cache.has(key);\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { NgToolsModule } from '@myrmidon/ng-tools';\n\nimport { CompactPagerComponent } from './components/compact-pager/compact-pager.component';\nimport { RangeViewComponent } from './components/range-view/range-view.component';\nimport { BrowserTreeNodeComponent } from './components/browser-tree-node/browser-tree-node.component';\n\n@NgModule({\n declarations: [\n CompactPagerComponent,\n RangeViewComponent,\n BrowserTreeNodeComponent,\n ],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n // material\n MatBadgeModule,\n MatButtonModule,\n MatChipsModule,\n MatDialogModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatPaginatorModule,\n MatProgressBarModule,\n MatSelectModule,\n MatTooltipModule,\n // myrmidon\n NgToolsModule\n ],\n exports: [\n CompactPagerComponent,\n RangeViewComponent,\n BrowserTreeNodeComponent,\n ],\n})\nexport class PagedDataBrowsersModule {}\n","/*\n * Public API Surface of paged-data-browsers\n */\n\nexport * from './lib/components/compact-pager/compact-pager.component';\nexport * from './lib/components/range-view/range-view.component';\nexport * from './lib/components/browser-tree-node/browser-tree-node.component';\n\nexport * from './lib/services/paged-list.store';\nexport * from './lib/services/paged-tree.store';\nexport * from './lib/services/lru-cache';\n\nexport * from './lib/paged-data-browsers.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4","i6.CompactPagerComponent","i7.RangeViewComponent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;MASa,qBAAqB,CAAA;AAOhC,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,MAAM,GAAG;AACZ,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,KAAK,EAAE,CAAC;SACT,CAAC;AACF,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAc,CAAC;KACpD;IAEM,OAAO,GAAA;AACZ,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACrC;IAEM,UAAU,GAAA;QACf,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE;AAC9B,YAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACzE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACrC;KACF;IAEM,MAAM,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AAClD,YAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACzE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACrC;KACF;IAEM,MAAM,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AAClD,YAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACpE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACrC;KACF;8GAxCU,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,kICTlC,4/BAsCA,EAAA,MAAA,EAAA,CAAA,0HAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FD7Ba,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBALjC,SAAS;+BACE,mBAAmB,EAAA,QAAA,EAAA,4/BAAA,EAAA,MAAA,EAAA,CAAA,0HAAA,CAAA,EAAA,CAAA;wDAMtB,MAAM,EAAA,CAAA;sBADZ,KAAK;gBAIC,YAAY,EAAA,CAAA;sBADlB,MAAM;;;MENI,kBAAkB,CAAA;AAoB7B,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACtB,QAAA,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;AACjB,QAAA,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAChB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;KACvB;IAED,WAAW,GAAA;AACT,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACjD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAElD,IAAI,CAAC,WAAW,GAAG;AACjB,YAAA,CAAC,UAAU,GAAG,WAAW,IAAI,IAAI,CAAC,KAAK;YACvC,CAAC,CAAC,UAAU,GAAG,UAAU,IAAI,WAAW,IAAI,IAAI,CAAC,KAAK;SACvD,CAAC;KACH;8GArCU,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,2JCP/B,uTAUA,EAAA,MAAA,EAAA,CAAA,4FAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FDHa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAL9B,SAAS;+BACE,gBAAgB,EAAA,QAAA,EAAA,uTAAA,EAAA,MAAA,EAAA,CAAA,4FAAA,CAAA,EAAA,CAAA;wDAQV,MAAM,EAAA,CAAA;sBAArB,KAAK;gBAIU,KAAK,EAAA,CAAA;sBAApB,KAAK;gBAIU,KAAK,EAAA,CAAA;sBAApB,KAAK;gBAIU,MAAM,EAAA,CAAA;sBAArB,KAAK;;;AEdR;;;;;;;;AAQG;MAMU,wBAAwB,CAAA;AAGnC;;AAEG;AACH,IAAA,IACW,IAAI,GAAA;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;IAED,IAAW,IAAI,CAAC,KAA4C,EAAA;AAC1D,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE;YACxB,OAAO;SACR;AACD,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;KACpB;AA+CD,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,YAAY,EAAsB,CAAC;AACpE,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,YAAY,EAAqB,CAAC;AAC/D,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,YAAY,EAAsB,CAAC;KACrE;IAEM,gBAAgB,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,OAAO;SACR;QACD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,KAA2B,CAAC,CAAC;KACnE;IAEM,cAAc,CAAC,IAAwB,EAAE,MAAkB,EAAA;AAChE,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAC1B,IAAI;YACJ,MAAM;AACP,SAAA,CAAC,CAAC;KACJ;IAEM,YAAY,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC7C;KACF;8GAvFU,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,gUCvBrC,qtGA4FA,EAAA,MAAA,EAAA,CAAA,onBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,qBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,IAAA,EAAA,eAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FDrEa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBALpC,SAAS;+BACE,uBAAuB,EAAA,QAAA,EAAA,qtGAAA,EAAA,MAAA,EAAA,CAAA,onBAAA,CAAA,EAAA,CAAA;wDAWtB,IAAI,EAAA,CAAA;sBADd,KAAK;gBAgBN,MAAM,EAAA,CAAA;sBADL,KAAK;gBAOC,KAAK,EAAA,CAAA;sBADX,KAAK;gBAaC,SAAS,EAAA,CAAA;sBADf,KAAK;gBAOC,UAAU,EAAA,CAAA;sBADhB,KAAK;gBAOC,qBAAqB,EAAA,CAAA;sBAD3B,MAAM;gBAOA,iBAAiB,EAAA,CAAA;sBADvB,MAAM;gBAIA,qBAAqB,EAAA,CAAA;sBAD3B,MAAM;;;AEnFT;;;;;;;;;;AAUG;MACU,QAAQ,CAAA;AAOnB;;;;;;;;AAQG;IACH,WAAY,CAAA,OAAe,EAAE,YAAA,GAAwB,KAAK,EAAA;AACxD,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;AACxB,QAAA,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;AACpB,QAAA,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;AAClC,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAa,CAAC;AACnC,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;KACzC;AAED;;;;AAIG;AACI,IAAA,GAAG,CAAC,GAAW,EAAA;QACpB,IAAI,IAAI,GAAkB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;SAC5B;AACD,QAAA,OAAO,IAAI,CAAC;KACb;AAED;;;;AAIG;AACI,IAAA,GAAG,CAAC,GAAW,EAAA;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAC7B;AAED;;;;;;;AAOG;AACI,IAAA,GAAG,CAAC,GAAW,EAAE,IAAO,EAAE,IAAY,EAAA;AAC3C,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC3B,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;YACxB,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE;AACtC,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;gBAClD,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC5C,IAAI,UAAU,EAAE;AACd,oBAAA,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC;iBAC/B;AACD,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC9B,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aAC/B;SACF;aAAM;YACL,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AACvC,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;AAClD,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC9B,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aAC/B;SACF;KACF;AAED;;AAEG;IACI,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;KACrB;AAED;;;;AAIG;IACI,OAAO,mBAAmB,CAAC,GAAQ,EAAA;QACxC,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,CAAC,CAAC;SACV;QACD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5B,QAAA,KAAK,IAAI,GAAG,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AACrB,YAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,gBAAA,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;aAC/B;AAAM,iBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBACpC,SAAS,IAAI,CAAC,CAAC;aAChB;AAAM,iBAAA,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;gBACrC,SAAS,IAAI,CAAC,CAAC;aAChB;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AACtD,gBAAA,SAAS,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;aAC9C;SACF;AACD,QAAA,OAAO,SAAS,CAAC;KAClB;AACF;;AC/FD;;AAEG;AACU,MAAA,gCAAgC,GAA0B;AACrE,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,SAAS,EAAE,EAAE;EACb;AAmBF;;;AAGG;MACU,cAAc,CAAA;AAoBzB;;;AAGG;AACH,IAAA,IAAW,QAAQ,GAAA;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;KACvB;IACD,IAAW,QAAQ,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;YAC5B,OAAO;SACR;AACD,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;KACd;AAED;;;AAGG;IACH,WACU,CAAA,QAAqC,EAC7C,OAAA,GAAiC,gCAAgC,EAAA;QADzD,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAA6B;AAG7C,QAAA,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAc,OAAO,CAAC,SAAS,CAAC,CAAC;;AAE3D,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,CAAc;AAC7C,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,QAAQ,EAAE,CAAC;AACX,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,KAAK,EAAE,EAAE;AACV,SAAA,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;;QAExC,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,CAAI,EAAO,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;KAC7C;AAED;;;AAGG;IACI,OAAO,GAAA;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;KAC7C;AAED;;;;;;;;AAQG;IACI,aAAa,CAAC,UAAkB,EAAE,MAAS,EAAA;AAChD,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE;YAC/B,OAAO,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;SACxD;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;KAClD;AAED;;;AAGG;AACK,IAAA,QAAQ,CAAC,UAAkB,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAC3B,UAAU,EACV,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,QAAQ,CAAC,KAAK,CACpB,CAAC;KACH;AAED;;;;;AAKG;IACI,OAAO,CAAC,UAAkB,EAAE,QAAiB,EAAA;QAClD,IAAI,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,SAAS,EAAE;AAC3C,YAAA,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;SAC3B;QACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;;AAErC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC7B,gBAAA,OAAO,EAAE,CAAC;gBACV,OAAO;aACR;;AAGD,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC;AAClC,gBAAA,IAAI,EAAE,CAAC,IAAI,KAAI;AACb,oBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC9B,oBAAA,OAAO,EAAE,CAAC;iBACX;AACD,gBAAA,KAAK,EAAE,MAAM;AACd,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;AAED;;;AAGG;IACI,OAAO,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;KAC1B;AAED;;;;AAIG;AACI,IAAA,SAAS,CAAC,MAAS,EAAA;QACxB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3B,YAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACxC,SAAC,CAAC,CAAC;KACJ;AAED;;;AAGG;IACI,SAAS,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;KAC5B;AAED;;;AAGG;IACI,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AACpB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,EAAO,CAAC,CAAC;KAChC;AAED;;AAEG;IACI,UAAU,GAAA;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;KACrB;AAED;;;;;AAKG;IACI,aAAa,CAAC,UAAkB,EAAE,MAAS,EAAA;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAC7B;AACF;;ACnID;;;;;;;;AAQG;MACU,cAAc,CAAA;AAoCzB;;;AAGG;AACH,IAAA,IAAW,QAAQ,GAAA;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;KACvB;IACD,IAAW,QAAQ,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;YAC5B,OAAO;SACR;AACD,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;KACpD;AAED;;;;AAIG;IACH,WACU,CAAA,QAAkC,EAC1C,OAAA,GAAiC,gCAAgC,EAAA;QADzD,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAA0B;AAG1C,QAAA,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAqB,OAAO,CAAC,SAAS,CAAC,CAAC;AAClE,QAAA,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC;AACpD,QAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;AAC5B,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,IAAI,eAAe,CAAM,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,CAAW,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,CAAI,EAAO,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;AAC5C,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,UAAU,EAAE,CAAC;KACnB;IAEO,UAAU,GAAA;QAChB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;AACzC,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,SAAC,CAAC,CAAC;KACJ;AAED;;;;;AAKG;AACK,IAAA,SAAS,CAAC,IAAuB,EAAA;QACvC,OAAO,IAAI,EAAE,MAAM;AACjB,cAAE;AACE,gBAAA,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK;gBACtB,GAAG,IAAI,CAAC,MAAM;AACf,aAAA;AACH,cAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;KACzB;AAED;;;AAGG;IACI,QAAQ,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;KAC3B;AAED;;;AAGG;IACI,OAAO,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;KAC1B;AAED;;;;;;;;AAQG;IACI,aAAa,CAAC,UAAkB,EAAE,MAAS,EAAA;AAChD,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE;YAC/B,OAAO,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;SACxD;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;KAClD;IAEO,wBAAwB,CAC9B,MAAS,EACT,UAAkB,EAAA;QAElB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,WAAW,EAAE;AACf,YAAA,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC;SACxB;aAAM;YACL,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CACpE,GAAG,CAAC,CAAC,IAAI,KAAI;gBACX,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;aAC/B,CAAC,CACH,CAAC;SACH;KACF;AAEO,IAAA,eAAe,CAAC,IAAwB,EAAA;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;YAC1B,OAAO;AACL,gBAAA,GAAG,CAAC;gBACJ,WAAW,EAAE,CAAC,CAAC,WAAW;AAC1B,gBAAA,MAAM,EAAE;oBACN,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,KAAK,EAAE,IAAI,CAAC,KAAK;AAClB,iBAAA;aACF,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AAED;;;;;;AAMG;IACI,SAAS,CAAC,MAAS,EAAE,UAAmB,EAAA;QAC7C,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,MAAM,EAAE;AAClC,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC/B;AACD,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACnB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;KACzE;AAED;;;;AAIG;AACI,IAAA,KAAK,CAAC,KAAa,EAAA;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC/B;AACD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AACpB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG;AACZ,YAAA,EAAE,EAAE,CAAC;AACL,YAAA,CAAC,EAAE,CAAC;AACJ,YAAA,CAAC,EAAE,CAAC;AACJ,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,MAAM,EAAE;AACN,gBAAA,UAAU,EAAE,CAAC;AACb,gBAAA,SAAS,EAAE,CAAC;AACZ,gBAAA,KAAK,EAAE,CAAC;AACT,aAAA;SACG,CAAC;QAEP,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,KAAI;AAC9C,YAAA,IAAI,CAAC,QAAQ;AACV,iBAAA,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;AACzB,iBAAA,IAAI,CACH,SAAS,CAAC,CAAC,KAAK,KAAI;;gBAElB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAChC,oBAAA,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;AACjB,oBAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;iBACf;qBAAM;;AAEL,oBAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CACrB,CAAC,IAAI,MACF;AACC,wBAAA,GAAG,IAAI;AACP,wBAAA,MAAM,EAAE;AACN,4BAAA,UAAU,EAAE,CAAC;AACb,4BAAA,SAAS,EAAE,CAAC;AACZ,4BAAA,KAAK,EAAE,CAAC;AACT,yBAAA;AACI,qBAAA,CAAA,CACV,CAAC;;AAEF,oBAAA,OAAO,QAAQ,CACb,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,KACnB,IAAI,CAAC,wBAAwB,CAC3B,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,EAChC,CAAC,CACF,CACF,CACF,CAAC;iBACH;AACH,aAAC,CAAC,CACH;AACA,iBAAA,SAAS,CAAC;AACT,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACd,oBAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;AACpB,oBAAA,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE;;AAEpC,wBAAA,IAAI,CAAC,MAAO,CAAC,WAAW,GAAG,IAAI,CAAC;AAChC,wBAAA,IAAI,CAAC,MAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC7B,wBAAA,IAAI,CAAC,MAAO,CAAC,MAAM,GAAG;AACpB,4BAAA,UAAU,EAAE,CAAC;AACb,4BAAA,SAAS,EAAE,CAAC;4BACZ,KAAK,EAAE,KAAK,CAAC,MAAM;yBACpB,CAAC;;wBAEF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;4BAC9B,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;4BACpC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACnC,yBAAC,CAAC,CAAC;AACH,wBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK;4BAC7C,IAAI;4BACJ,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAClC,yBAAA,CAAC,CAAC;AACH,wBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAO,EAAE,GAAI,KAAa,CAAC,CAAC,CAAC;wBACrD,OAAO,CAAC,IAAI,CAAC,CAAC;qBACf;yBAAM;wBACL,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC3B,4BAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;AACzB,4BAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AACxB,yBAAC,CAAC,CAAC;AACH,wBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;wBAClD,OAAO,CAAC,IAAI,CAAC,CAAC;qBACf;iBACF;AACD,gBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;oBACf,MAAM,CAAC,KAAK,CAAC,CAAC;iBACf;AACF,aAAA,CAAC,CAAC;AACP,SAAC,CAAC,CAAC;KACJ;AAED;;;;;AAKG;IACI,aAAa,CAAC,EAAU,EAAE,MAAiB,EAAA;QAChD,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC/B;QACD,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,KAAI;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI,EAAE;AACT,gBAAA,MAAM,CAAC,CAAA,QAAA,EAAW,EAAE,CAAA,mBAAA,CAAqB,CAAC,CAAC;aAC5C;AACD,YAAA,IAAK,CAAC,MAAM,GAAG,MAAM,IAAI,SAAS,CAAC;YACnC,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAChC,SAAC,CAAC,CAAC;KACJ;AAED;;;;;AAKG;AACI,IAAA,MAAM,CAAC,EAAU,EAAA;QACtB,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC/B;QACD,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,KAAI;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACzD,YAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACxD,OAAO,CAAC,KAAK,CAAC,CAAC;aAChB;YAED,IAAI,CAAC,wBAAwB,CAC3B,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EACzC,CAAC,CACF,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;;AAEnB,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACf,oBAAA,IAAK,CAAC,WAAW,GAAG,KAAK,CAAC;oBAC1B,OAAO,CAAC,KAAK,CAAC,CAAC;iBAChB;qBAAM;AACL,oBAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;;AAEnB,oBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;oBACjC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;AACnC,oBAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AAChB,wBAAA,MAAM,CAAC,CAAA,QAAA,EAAW,EAAE,CAAA,mBAAA,CAAqB,CAAC,CAAC;qBAC5C;yBAAM;wBACL,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AAC7C,wBAAA,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,GAAI,SAAiB,CAAC,CAAC;AAClD,wBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,wBAAA,IAAK,CAAC,WAAW,GAAG,IAAI,CAAC;AACzB,wBAAA,IAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;wBACtB,OAAO,CAAC,IAAI,CAAC,CAAC;qBACf;iBACF;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;AAEM,IAAA,SAAS,CAAC,EAAU,EAAA;QACzB,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC/B;;AAED,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AACjC,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACtD,QAAA,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE;AACpB,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC/B;;AAGD,QAAA,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;AAC1D,YAAA,CAAC,EAAE,CAAC;SACL;QACD,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;;QAGjE,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,KAAI;AAC9C,YAAA,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;AAC3B,gBAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAChB,gBAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AACrB,aAAC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC;AAChB,SAAC,CAAC,CAAC;KACJ;AAEM,IAAA,WAAW,CAAC,EAAU,EAAA;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;AACvC,YAAA,OAAO,EAAE,CAAC;SACX;AACD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACjC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAClC,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AAChB,YAAA,OAAO,EAAE,CAAC;SACX;QACD,MAAM,QAAQ,GAAQ,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAClB,QAAA,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE;YAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACxB,YAAA,CAAC,EAAE,CAAC;SACL;AACD,QAAA,OAAO,QAAQ,CAAC;KACjB;IAEO,iBAAiB,CACvB,KAAyB,EACzB,SAAiB,EAAA;AAEjB,QAAA,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;AAC1D,YAAA,CAAC,EAAE,CAAC;SACL;AACD,QAAA,KAAK,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;KAChD;AAED;;;;;AAKG;AACI,IAAA,QAAQ,CAAC,EAAU,EAAA;QACxB,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC/B;QACD,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,KAAI;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACzD,YAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBACzD,OAAO,CAAC,KAAK,CAAC,CAAC;aAChB;;AAGD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACjC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;AACvC,YAAA,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE;AACpB,gBAAA,MAAM,CAAC,CAAA,QAAA,EAAW,EAAE,CAAA,mBAAA,CAAqB,CAAC,CAAC;aAC5C;iBAAM;AACL,gBAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACnB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACzC,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,gBAAA,IAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,CAAC;aACf;AACH,SAAC,CAAC,CAAC;KACJ;AAED;;;;;AAKG;IACI,UAAU,CAAC,QAAgB,EAAE,UAAkB,EAAA;QACpD,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,KAAI;YAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;YACrE,IAAI,CAAC,UAAU,EAAE;gBACf,OAAO,CAAC,KAAK,CAAC,CAAC;aAChB;YACD,IAAI,CAAC,wBAAwB,CAC3B,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,EAC3C,UAAU,CACX,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;;AAEnB,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;oBACf,OAAO,CAAC,KAAK,CAAC,CAAC;iBAChB;qBAAM;AACL,oBAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;;;AAGnB,oBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;oBACjC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,UAAW,CAAC,GAAG,CAAC,CAAC;oBACjD,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;;oBAE7C,IAAI,KAAK,GAAG,SAAS,CAAC;oBACtB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;oBACjD,OACE,KAAK,GAAG,CAAC;wBACT,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ;AACtC,wBAAA,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,EAChD;AACA,wBAAA,KAAK,EAAE,CAAC;qBACT;;;AAGD,oBAAA,IAAI,GAAG,GAAG,SAAS,GAAG,CAAC,CAAC;AACxB,oBAAA,OACE,GAAG,GAAG,KAAK,CAAC,MAAM;AAClB,wBAAA,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ;wBAChC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,EAC1C;AACA,wBAAA,GAAG,EAAE,CAAC;qBACP;;oBAED,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC;oBACjC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAI,SAAiB,CAAC,CAAC;;oBAE9C,UAAW,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;AAChD,oBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACzB,OAAO,CAAC,IAAI,CAAC,CAAC;iBACf;AACH,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;KACJ;AAED;;AAEG;IACI,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;KACnD;AAED;;AAEG;IACI,UAAU,GAAA;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;KACrB;AAED;;;;;AAKG;IACI,aAAa,CAAC,UAAkB,EAAE,MAAS,EAAA;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAC7B;AACF;;MC5jBY,uBAAuB,CAAA;8GAAvB,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,iBA5BhC,qBAAqB;YACrB,kBAAkB;AAClB,YAAA,wBAAwB,aAGxB,YAAY;YACZ,mBAAmB;;YAEnB,cAAc;YACd,eAAe;YACf,cAAc;YACd,eAAe;YACf,kBAAkB;YAClB,aAAa;YACb,cAAc;YACd,kBAAkB;YAClB,oBAAoB;YACpB,eAAe;YACf,gBAAgB;;AAEhB,YAAA,aAAa,aAGb,qBAAqB;YACrB,kBAAkB;YAClB,wBAAwB,CAAA,EAAA,CAAA,CAAA,EAAA;AAGf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,YAvBhC,YAAY;YACZ,mBAAmB;;YAEnB,cAAc;YACd,eAAe;YACf,cAAc;YACd,eAAe;YACf,kBAAkB;YAClB,aAAa;YACb,cAAc;YACd,kBAAkB;YAClB,oBAAoB;YACpB,eAAe;YACf,gBAAgB;;YAEhB,aAAa,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAQJ,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA9BnC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,qBAAqB;wBACrB,kBAAkB;wBAClB,wBAAwB;AACzB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,mBAAmB;;wBAEnB,cAAc;wBACd,eAAe;wBACf,cAAc;wBACd,eAAe;wBACf,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,kBAAkB;wBAClB,oBAAoB;wBACpB,eAAe;wBACf,gBAAgB;;wBAEhB,aAAa;AACd,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,qBAAqB;wBACrB,kBAAkB;wBAClB,wBAAwB;AACzB,qBAAA;AACF,iBAAA,CAAA;;;ACnDD;;AAEG;;ACFH;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myrmidon/paged-data-browsers",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Generic simple paged data browsers.",
5
5
  "keywords": [
6
6
  "data browsers"
@@ -14,9 +14,9 @@
14
14
  "name": "Daniele Fusi"
15
15
  },
16
16
  "peerDependencies": {
17
- "@angular/common": "^17.0.0",
18
- "@angular/core": "^17.0.0",
19
- "@myrmidon/ng-tools": "^3.0.0"
17
+ "@angular/common": "^18.0.0",
18
+ "@angular/core": "^18.0.0",
19
+ "@myrmidon/ng-tools": "^3.1.0"
20
20
  },
21
21
  "dependencies": {
22
22
  "tslib": "^2.3.0"