@myrmidon/paged-data-browsers 1.1.1 → 2.0.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.
package/README.md CHANGED
@@ -5,3 +5,89 @@ This library provides simple components to display filtered and paged data from
5
5
  There are currently two components, one for displaying a flat list of data, and another to display hierarchically structured data, combining a tree view with paging.
6
6
 
7
7
  Also, there is a LRU cache service and a compact pager used in the paged tree component.
8
+
9
+ ## Paged Tree
10
+
11
+ ### Services
12
+
13
+ The core of the tree is a `PagedTreeStore`.
14
+
15
+ Tree **nodes** extend interface `TreeNode`, having:
16
+
17
+ - id
18
+ - parentId
19
+ - y and x
20
+ - label
21
+ - tag
22
+ - hasChildren
23
+
24
+ The corresponding **node filter** (`TreeNodeFilter`) has `tags` and `parentId`, both optional. Your filters will extend this one, just like your nodes extend `TreeNode`.
25
+
26
+ A **paged tree node** (`PagedTreeNode<F>` where `F` is `TreeNodeFilter` or any extension of it) extends a `TreeNode` by adding paging (`PagingInfo`: page number, count and total items), filtering, and expansion state. All the nodes entering the store are enriched with such data, thus becoming paged nodes.
27
+
28
+ The **service** which fetches nodes into the store is `PagedTreeStoreService<F>`. It provides a single method, `getNodes(filter, pageNumber, pageSize, hasMockRoot?)` to get the specified page of nodes.
29
+
30
+ The **paged tree store** (`PagedTreeStore<E,F>` where `E`=paged tree node and `F`=node filter) is the local store for tree nodes. Its ideal hierarchy is:
31
+
32
+ - *radix*: a single, static radix node (Y=0, X=1) including all the other nodes. This is like the ground where one or more trees can be planted. Each tree is identified by a node's tag.
33
+ - *roots*: the direct children of the radix (Y=1, X=1-N).
34
+ - other descendant nodes, each with a higher Y level.
35
+
36
+ The essential store data are:
37
+
38
+ - flat list of paged nodes (`nodes$`).
39
+ - list of tree tags (`tags$`).
40
+ - global filter (`filter$`). This gets combined with (overridden by) node-specific filters, when specified. You can set it with `setFilter`. To set the filter for the children of a specific node use `setNodeFilter`.
41
+ - page size (`pageSize`), get/set property.
42
+
43
+ To initialize the store, you call `reset`, which loads root nodes (via its service's `getRootNodes`) and their direct children. When getting the children for each root node, an internal cache is used to minimize server fetches (via `getPageFromCacheOrServer`). The nodes got from the service are enriched with data required as paged tree nodes (paging, filtering, expansion).
44
+
45
+ >Methods related to the cache are `clearCache()` and `hasCachedPage(pageNumber, filter)`.
46
+
47
+ Nodes are manipulated in the tree with:
48
+
49
+ - `expand(id)`
50
+ - `expandAll(id)`
51
+ - `getChildren(id)`
52
+ - `collapse(id)`
53
+ - `collapseAll()`
54
+ - `changePage(parentId, pageNumber)`
55
+
56
+ ### Component
57
+
58
+ The component for visualizing each single **node** of the paged tree is `BrowserTreeNodeComponent`. This wraps some HTML content providing a toggle button to expand/collapse the node, a paging control for the node's children, and a button to edit the node's filter. You should then provide the HTML content to display the node's data inside this component, e.g.:
59
+
60
+ ```html
61
+ <pdb-browser-tree-node [node]="node">
62
+ <your-node-view [node]="node" />
63
+ <pdb-browser-tree-node>
64
+ ```
65
+
66
+ This component API has:
67
+
68
+ - ➡️ `node` of type `PagedTreeNode`.
69
+ - ➡️ `paging` (`PagingInfo`) with optional data about children nodes paging.
70
+ - ➡️ `debug` (`boolean`) flag to toggle debug information in the view.
71
+ - ➡️ `hideLabel` (`boolean`) flag to hide the node's loc and label. This is useful if you want to provide your own view for the node, between the expansion toggle and the filter edit button. In this case, in your consumer template provide your own view as the content of this component. If instead you are fine with the default loc and label, and just want to add more data to the view, then you can just add your own content to this component's template, without setting this property to true.
72
+ - ➡️ `hidePaging` (`boolean`): true to hide the node's paging control unless hovered.
73
+ - 🔥 `toggleExpandedRequest` (`PagedTreeNode`): emitted when the user wants to toggle the expanded state of the node.
74
+ - 🔥 `changePageRequest` (`PageChangeRequest`): emitted when the user wants to change the page number of the node's children.
75
+ - 🔥 `editNodeFilterRequest` (`PagedTreeNode`): emitted when the user wants to edit the node's filter for its children.
76
+
77
+ You should provide your components for:
78
+
79
+ - the node's filters component. This is used both for global and node-specific filters (in the latter case as a popup).
80
+ - the tree browser component. This combines:
81
+ - a filters component for global filters. This dummy component gets a `filter$` and emits `filterChange`.
82
+ - a tree view.
83
+
84
+ The tree browser component uses a nested instance of `PagedTreeStore<N,F>`, typically injected via a middleman service like the sample `PagedTreeBrowserService`, which provides a new instance of the store to the component. The component orchestrates:
85
+
86
+ - `filter$` (observable of filters). This simply binds to the global filter of the nested store.
87
+ - `nodes$` (observable of paged tree nodes). Each of these nodes is displayed via a `BrowserTreeNodeComponent`. This simply binds to the nodes from the nested store, so these are all the nodes present in it. They are displayed in a list with various amounts of indentation representing the tree's hierarchy.
88
+ - page change requests
89
+ - filter change requests
90
+ - expand/collapse requests
91
+ - reset requests
92
+
93
+ All the requests are accomplished by virtue of the nested store.
@@ -31,6 +31,10 @@ export class BrowserTreeNodeComponent {
31
31
  this._node = value;
32
32
  }
33
33
  constructor() {
34
+ /**
35
+ * The indent size for the node's children.
36
+ */
37
+ this.indentSize = 30;
34
38
  this.toggleExpandedRequest = new EventEmitter();
35
39
  this.changePageRequest = new EventEmitter();
36
40
  this.editNodeFilterRequest = new EventEmitter();
@@ -53,11 +57,11 @@ export class BrowserTreeNodeComponent {
53
57
  }
54
58
  }
55
59
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: BrowserTreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
56
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.3", 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 id=\"pager\" [style.display]=\"hidePaging ? 'inherit' : 'block'\">\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 [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\n [disabled]=\"node.hasChildren === false\"\n (click)=\"onToggleExpanded()\"\n >\n <mat-icon class=\"mat-primary\">{{\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]=\"{\n 'background-color': (node.tag | stringToColor),\n color: node.tag | stringToColor | colorToContrast\n }\"\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 } @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" }] }); }
60
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.3", type: BrowserTreeNodeComponent, selector: "pdb-browser-tree-node", inputs: { node: "node", paging: "paging", debug: "debug", hideLabel: "hideLabel", hidePaging: "hidePaging", indentSize: "indentSize" }, outputs: { toggleExpandedRequest: "toggleExpandedRequest", changePageRequest: "changePageRequest", editNodeFilterRequest: "editNodeFilterRequest" }, ngImport: i0, template: "@if (node) {\n<div id=\"node\" [style.margin-left.px]=\"(node.y - 1) * indentSize\">\n <!-- pager -->\n @if ($any(node).expanded && paging && paging.pageCount > 1) {\n <div id=\"pager\" [style.display]=\"hidePaging ? 'inherit' : 'block'\">\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 <button\n type=\"button\"\n mat-icon-button\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\n [disabled]=\"node.hasChildren === false\"\n (click)=\"onToggleExpanded()\"\n >\n <mat-icon class=\"mat-primary\">{{\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]=\"{\n 'background-color': (node.tag | stringToColor),\n color: node.tag | stringToColor | colorToContrast\n }\"\n >{{ node.tag }}</span\n >\n\n <!-- loc and label -->\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\n }\n\n <!-- PROJECTED NODE -->\n <ng-content></ng-content>\n\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\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 } @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 #98a8d4;border-radius:6px}#node:hover{background-color:#d6dee9}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
61
  }
58
62
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: BrowserTreeNodeComponent, decorators: [{
59
63
  type: Component,
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 id=\"pager\" [style.display]=\"hidePaging ? 'inherit' : 'block'\">\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 [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\n [disabled]=\"node.hasChildren === false\"\n (click)=\"onToggleExpanded()\"\n >\n <mat-icon class=\"mat-primary\">{{\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]=\"{\n 'background-color': (node.tag | stringToColor),\n color: node.tag | stringToColor | colorToContrast\n }\"\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 } @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"] }]
64
+ args: [{ selector: 'pdb-browser-tree-node', template: "@if (node) {\n<div id=\"node\" [style.margin-left.px]=\"(node.y - 1) * indentSize\">\n <!-- pager -->\n @if ($any(node).expanded && paging && paging.pageCount > 1) {\n <div id=\"pager\" [style.display]=\"hidePaging ? 'inherit' : 'block'\">\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 <button\n type=\"button\"\n mat-icon-button\n [matTooltip]=\"$any(node).expanded ? 'Collapse' : 'Expand'\"\n [disabled]=\"node.hasChildren === false\"\n (click)=\"onToggleExpanded()\"\n >\n <mat-icon class=\"mat-primary\">{{\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]=\"{\n 'background-color': (node.tag | stringToColor),\n color: node.tag | stringToColor | colorToContrast\n }\"\n >{{ node.tag }}</span\n >\n\n <!-- loc and label -->\n <span class=\"loc\">{{ node.y }}.{{ node.x }}</span> - {{ node.label }}\n }\n\n <!-- PROJECTED NODE -->\n <ng-content></ng-content>\n\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\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 } @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 #98a8d4;border-radius:6px}#node:hover{background-color:#d6dee9}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
65
  }], ctorParameters: () => [], propDecorators: { node: [{
62
66
  type: Input
63
67
  }], paging: [{
@@ -68,6 +72,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImpor
68
72
  type: Input
69
73
  }], hidePaging: [{
70
74
  type: Input
75
+ }], indentSize: [{
76
+ type: Input
71
77
  }], toggleExpandedRequest: [{
72
78
  type: Output
73
79
  }], changePageRequest: [{
@@ -75,4 +81,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImpor
75
81
  }], editNodeFilterRequest: [{
76
82
  type: Output
77
83
  }] } });
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvYnJvd3Nlci10cmVlLW5vZGUvYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvYnJvd3Nlci10cmVlLW5vZGUvYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVN2RTs7Ozs7Ozs7R0FRRztBQU1ILE1BQU0sT0FBTyx3QkFBd0I7SUFHbkM7O09BRUc7SUFDSCxJQUNXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsSUFBSSxDQUFDLEtBQTRDO1FBQzFELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN6QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUErQ0Q7UUFDRSxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFDcEUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBQy9ELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztJQUN0RSxDQUFDO0lBRU0sZ0JBQWdCO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUEyQixDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUF3QixFQUFFLE1BQWtCO1FBQ2hFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDMUIsSUFBSTtZQUNKLE1BQU07U0FDUCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sWUFBWTtRQUNqQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLENBQUM7SUFDSCxDQUFDOzhHQXZGVSx3QkFBd0I7a0dBQXhCLHdCQUF3QixnVUN2QnJDLG01RUF1RkE7OzJGRGhFYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsdUJBQXVCO3dEQVd0QixJQUFJO3NCQURkLEtBQUs7Z0JBZ0JOLE1BQU07c0JBREwsS0FBSztnQkFPQyxLQUFLO3NCQURYLEtBQUs7Z0JBYUMsU0FBUztzQkFEZixLQUFLO2dCQU9DLFVBQVU7c0JBRGhCLEtBQUs7Z0JBT0MscUJBQXFCO3NCQUQzQixNQUFNO2dCQU9BLGlCQUFpQjtzQkFEdkIsTUFBTTtnQkFJQSxxQkFBcUI7c0JBRDNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBQYWdlZFRyZWVOb2RlLCBQYWdpbmdJbmZvIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGFnZWQtdHJlZS5zdG9yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUNoYW5nZVJlcXVlc3Qge1xuICBub2RlOiBQYWdlZFRyZWVOb2RlPGFueT47XG4gIHBhZ2luZzogUGFnaW5nSW5mbztcbn1cblxuLyoqXG4gKiBCcm93c2VyIHRyZWUgbm9kZSBjb21wb25lbnQgdmlldy4gVGhpcyB3cmFwcyBzb21lIEhUTUwgY29udGVudCBwcm92aWRpbmdcbiAqIGEgdG9nZ2xlIGJ1dHRvbiB0byBleHBhbmQvY29sbGFwc2UgdGhlIG5vZGUsIGEgcGFnaW5nIGNvbnRyb2wgZm9yIHRoZVxuICogbm9kZSdzIGNoaWxkcmVuLCBhbmQgYSBidXR0b24gdG8gZWRpdCB0aGUgbm9kZSdzIGZpbHRlci4gWW91IHNob3VsZCB0aGVuXG4gKiBwcm92aWRlIHRoZSBIVE1MIGNvbnRlbnQgdG8gZGlzcGxheSB0aGUgbm9kZSdzIGRhdGEgaW5zaWRlIHRoaXMgY29tcG9uZW50LCBlLmcuXG4gKiA8cGRiLWJyb3dzZXItdHJlZS1ub2RlIFtub2RlXT1cIm5vZGVcIj5cbiAqICAgPHlvdXItbm9kZS12aWV3IFtub2RlXT1cIm5vZGVcIiAvPlxuICogPHBkYi1icm93c2VyLXRyZWUtbm9kZT5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRiLWJyb3dzZXItdHJlZS1ub2RlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jyb3dzZXItdHJlZS1ub2RlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBCcm93c2VyVHJlZU5vZGVDb21wb25lbnQge1xuICBwcml2YXRlIF9ub2RlOiBQYWdlZFRyZWVOb2RlPGFueT4gfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbm9kZSB0byBkaXNwbGF5LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBub2RlKCk6IFBhZ2VkVHJlZU5vZGU8YW55PiB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9ub2RlO1xuICB9XG5cbiAgcHVibGljIHNldCBub2RlKHZhbHVlOiBQYWdlZFRyZWVOb2RlPGFueT4gfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gICAgaWYgKHRoaXMuX25vZGUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX25vZGUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGFnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZSdzIGNoaWxkcmVuLlxuICAgKi9cbiAgQElucHV0KClcbiAgcGFnaW5nPzogUGFnaW5nSW5mbztcblxuICAvKipcbiAgICogVHJ1ZSB0byBzaG93IGRlYnVnIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGRlYnVnPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVHJ1ZSB0byBoaWRlIHRoZSBub2RlJ3MgbG9jIGFuZCBsYWJlbC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG9cbiAgICogcHJvdmlkZSB5b3VyIG93biB2aWV3IGZvciB0aGUgbm9kZSwgYmV0d2VlbiB0aGUgZXhwYW5zaW9uIHRvZ2dsZSBhbmRcbiAgICogdGhlIGZpbHRlciBlZGl0IGJ1dHRvbi4gSW4gdGhpcyBjYXNlLCBpbiB5b3VyIGNvbnN1bWVyIHRlbXBsYXRlIHByb3ZpZGVcbiAgICogeW91ciBvd24gdmlldyBhcyB0aGUgY29udGVudCBvZiB0aGlzIGNvbXBvbmVudC4gSWYgaW5zdGVhZCB5b3UgYXJlIGZpbmVcbiAgICogd2l0aCB0aGUgZGVmYXVsdCBsb2MgYW5kIGxhYmVsLCBhbmQganVzdCB3YW50IHRvIGFkZCBtb3JlIGRhdGEgdG9cbiAgICogdGhlIHZpZXcsIHRoZW4geW91IGNhbiBqdXN0IGFkZCB5b3VyIG93biBjb250ZW50IHRvIHRoaXMgY29tcG9uZW50J3NcbiAgICogdGVtcGxhdGUsIHdpdGhvdXQgc2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIHRydWUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGlkZUxhYmVsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVHJ1ZSB0byBoaWRlIHRoZSBub2RlJ3MgcGFnaW5nIGNvbnRyb2wgdW5sZXNzIGhvdmVyZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGlkZVBhZ2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gdGhlIHVzZXIgd2FudHMgdG8gdG9nZ2xlIHRoZSBleHBhbmRlZCBzdGF0ZSBvZiB0aGUgbm9kZS5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgdG9nZ2xlRXhwYW5kZWRSZXF1ZXN0OiBFdmVudEVtaXR0ZXI8UGFnZWRUcmVlTm9kZTxhbnk+PjtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgdXNlciB3YW50cyB0byBjaGFuZ2UgdGhlIHBhZ2UgbnVtYmVyIG9mIHRoZSBub2RlJ3MgY2hpbGRyZW4uXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGNoYW5nZVBhZ2VSZXF1ZXN0OiBFdmVudEVtaXR0ZXI8UGFnZUNoYW5nZVJlcXVlc3Q+O1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZWRpdE5vZGVGaWx0ZXJSZXF1ZXN0OiBFdmVudEVtaXR0ZXI8UGFnZWRUcmVlTm9kZTxhbnk+PjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnZWRUcmVlTm9kZTxhbnk+PigpO1xuICAgIHRoaXMuY2hhbmdlUGFnZVJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VDaGFuZ2VSZXF1ZXN0PigpO1xuICAgIHRoaXMuZWRpdE5vZGVGaWx0ZXJSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlZFRyZWVOb2RlPGFueT4+KCk7XG4gIH1cblxuICBwdWJsaWMgb25Ub2dnbGVFeHBhbmRlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX25vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50b2dnbGVFeHBhbmRlZFJlcXVlc3QuZW1pdCh0aGlzLl9ub2RlIGFzIFBhZ2VkVHJlZU5vZGU8YW55Pik7XG4gIH1cblxuICBwdWJsaWMgb25QYWdpbmdDaGFuZ2Uobm9kZTogUGFnZWRUcmVlTm9kZTxhbnk+LCBwYWdpbmc6IFBhZ2luZ0luZm8pOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZVBhZ2VSZXF1ZXN0LmVtaXQoe1xuICAgICAgbm9kZSxcbiAgICAgIHBhZ2luZyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkVkaXRGaWx0ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX25vZGUpIHtcbiAgICAgIHRoaXMuZWRpdE5vZGVGaWx0ZXJSZXF1ZXN0LmVtaXQodGhpcy5fbm9kZSk7XG4gICAgfVxuICB9XG59XG4iLCJAaWYgKG5vZGUpIHtcbjxkaXYgaWQ9XCJub2RlXCIgW3N0eWxlLm1hcmdpbi1sZWZ0LnB4XT1cIihub2RlLnkgLSAxKSAqIDIwXCI+XG4gIDwhLS0gcGFnZXIgLS0+XG4gIEBpZiAoJGFueShub2RlKS5leHBhbmRlZCAmJiBwYWdpbmcgJiYgcGFnaW5nLnBhZ2VDb3VudCA+IDEpIHtcbiAgPGRpdiBpZD1cInBhZ2VyXCIgW3N0eWxlLmRpc3BsYXldPVwiaGlkZVBhZ2luZyA/ICdpbmhlcml0JyA6ICdibG9jaydcIj5cbiAgICA8cGRiLWNvbXBhY3QtcGFnZXJcbiAgICAgIFtwYWdpbmddPVwicGFnaW5nXCJcbiAgICAgIChwYWdpbmdDaGFuZ2UpPVwib25QYWdpbmdDaGFuZ2UoJGFueShub2RlKSwgJGV2ZW50KVwiXG4gICAgLz5cbiAgICA8cGRiLXJhbmdlLXZpZXdcbiAgICAgIFt3aWR0aF09XCIyNTBcIlxuICAgICAgW2RvbWFpbl09XCJbMCwgcGFnaW5nLnBhZ2VDb3VudF1cIlxuICAgICAgW3JhbmdlXT1cIltwYWdpbmcucGFnZU51bWJlciAtIDEsIHBhZ2luZy5wYWdlTnVtYmVyXVwiXG4gICAgLz5cbiAgPC9kaXY+XG4gIH1cbiAgPCEtLSBub2RlIC0tPlxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICA8IS0tIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gLS0+XG4gICAgQGlmIChub2RlLnkgPiAwKSB7XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIFttYXRUb29sdGlwXT1cIiRhbnkobm9kZSkuZXhwYW5kZWQgPyAnQ29sbGFwc2UnIDogJ0V4cGFuZCdcIlxuICAgICAgW2Rpc2FibGVkXT1cIm5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlXCJcbiAgICAgIChjbGljayk9XCJvblRvZ2dsZUV4cGFuZGVkKClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+e3tcbiAgICAgICAgbm9kZS5oYXNDaGlsZHJlbiA9PT0gdHJ1ZSB8fCBub2RlLmhhc0NoaWxkcmVuID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/ICRhbnkobm9kZSkuZXhwYW5kZWRcbiAgICAgICAgICAgID8gXCJleHBhbmRfbGVzc1wiXG4gICAgICAgICAgICA6IFwiZXhwYW5kX21vcmVcIlxuICAgICAgICAgIDogXCJzdG9wXCJcbiAgICAgIH19PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICB9XG4gICAgPCEtLSB0YWcgLS0+XG4gICAgQGlmICghaGlkZUxhYmVsKSB7XG4gICAgPHNwYW5cbiAgICAgIGNsYXNzPVwidGFnXCJcbiAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAobm9kZS50YWcgfCBzdHJpbmdUb0NvbG9yKSxcbiAgICAgICAgY29sb3I6IG5vZGUudGFnIHwgc3RyaW5nVG9Db2xvciB8IGNvbG9yVG9Db250cmFzdFxuICAgICAgfVwiXG4gICAgICA+e3sgbm9kZS50YWcgfX08L3NwYW5cbiAgICA+XG4gICAgPCEtLSBsb2MgYW5kIGxhYmVsIC0tPlxuICAgIDxzcGFuIGNsYXNzPVwibG9jXCI+e3sgbm9kZS55IH19Lnt7IG5vZGUueCB9fTwvc3Bhbj4gLSB7eyBub2RlLmxhYmVsIH19XG4gICAgfVxuICAgIDwhLS0gUFJPSkVDVEVEIE5PREUgLS0+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwhLS0gZGVidWcgLS0+XG4gICAgQGlmIChkZWJ1Zykge1xuICAgIDxzcGFuIGNsYXNzPVwiZGVidWdcIlxuICAgICAgPiN7eyBub2RlLmlkIH19XG4gICAgICA8c3BhblxuICAgICAgICA+fCB7eyAkYW55KG5vZGUpLnBhZ2luZy5wYWdlTnVtYmVyIH19L3t7XG4gICAgICAgICAgJGFueShub2RlKS5wYWdpbmcucGFnZUNvdW50XG4gICAgICAgIH19XG4gICAgICAgICh7eyAkYW55KG5vZGUpLnBhZ2luZy50b3RhbCB9fSk8L3NwYW5cbiAgICAgID48L3NwYW5cbiAgICA+XG4gICAgfVxuICAgIDwhLS0gZmlsdGVyIC0tPlxuICAgIEBpZiAoISRhbnkobm9kZSkuZmlsdGVyICYmIG5vZGUueSkge1xuICAgIDxkaXYgY2xhc3M9XCJtdXRlZFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIG1hdFRvb2x0aXA9XCJBZGQgZmlsdGVyXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uRWRpdEZpbHRlcigpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPmZpbHRlcl9saXN0PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIH0gQGlmICgkYW55KG5vZGUpLmZpbHRlciAmJiBub2RlLnkpIHtcbiAgICA8ZGl2IGNsYXNzPVwibXV0ZWRcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwib25FZGl0RmlsdGVyKClcIj5cbiAgICAgICAgPG1hdC1pY29uIFttYXRCYWRnZV09XCIkYW55KG5vZGUpLmZpbHRlciA/ICdGJyA6ICcnXCJcbiAgICAgICAgICA+ZmlsdGVyX2FsdDwvbWF0LWljb25cbiAgICAgICAgPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxufVxuIl19
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvYnJvd3Nlci10cmVlLW5vZGUvYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vcGFnZWQtZGF0YS1icm93c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvYnJvd3Nlci10cmVlLW5vZGUvYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVN2RTs7Ozs7Ozs7R0FRRztBQU1ILE1BQU0sT0FBTyx3QkFBd0I7SUFHbkM7O09BRUc7SUFDSCxJQUNXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQVcsSUFBSSxDQUFDLEtBQTRDO1FBQzFELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN6QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFxREQ7UUFyQkE7O1dBRUc7UUFFSSxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBa0JyQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFDcEUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBQy9ELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztJQUN0RSxDQUFDO0lBRU0sZ0JBQWdCO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUEyQixDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUF3QixFQUFFLE1BQWtCO1FBQ2hFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDMUIsSUFBSTtZQUNKLE1BQU07U0FDUCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sWUFBWTtRQUNqQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLENBQUM7SUFDSCxDQUFDOzhHQTdGVSx3QkFBd0I7a0dBQXhCLHdCQUF3QiwwVkN2QnJDLHU0RUEwRkE7OzJGRG5FYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsdUJBQXVCO3dEQVd0QixJQUFJO3NCQURkLEtBQUs7Z0JBZ0JOLE1BQU07c0JBREwsS0FBSztnQkFPQyxLQUFLO3NCQURYLEtBQUs7Z0JBYUMsU0FBUztzQkFEZixLQUFLO2dCQU9DLFVBQVU7c0JBRGhCLEtBQUs7Z0JBT0MsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxxQkFBcUI7c0JBRDNCLE1BQU07Z0JBT0EsaUJBQWlCO3NCQUR2QixNQUFNO2dCQUlBLHFCQUFxQjtzQkFEM0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFBhZ2VkVHJlZU5vZGUsIFBhZ2luZ0luZm8gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wYWdlZC10cmVlLnN0b3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWdlQ2hhbmdlUmVxdWVzdCB7XG4gIG5vZGU6IFBhZ2VkVHJlZU5vZGU8YW55PjtcbiAgcGFnaW5nOiBQYWdpbmdJbmZvO1xufVxuXG4vKipcbiAqIEJyb3dzZXIgdHJlZSBub2RlIGNvbXBvbmVudCB2aWV3LiBUaGlzIHdyYXBzIHNvbWUgSFRNTCBjb250ZW50IHByb3ZpZGluZ1xuICogYSB0b2dnbGUgYnV0dG9uIHRvIGV4cGFuZC9jb2xsYXBzZSB0aGUgbm9kZSwgYSBwYWdpbmcgY29udHJvbCBmb3IgdGhlXG4gKiBub2RlJ3MgY2hpbGRyZW4sIGFuZCBhIGJ1dHRvbiB0byBlZGl0IHRoZSBub2RlJ3MgZmlsdGVyLiBZb3Ugc2hvdWxkIHRoZW5cbiAqIHByb3ZpZGUgdGhlIEhUTUwgY29udGVudCB0byBkaXNwbGF5IHRoZSBub2RlJ3MgZGF0YSBpbnNpZGUgdGhpcyBjb21wb25lbnQsIGUuZy5cbiAqIDxwZGItYnJvd3Nlci10cmVlLW5vZGUgW25vZGVdPVwibm9kZVwiPlxuICogICA8eW91ci1ub2RlLXZpZXcgW25vZGVdPVwibm9kZVwiIC8+XG4gKiA8cGRiLWJyb3dzZXItdHJlZS1ub2RlPlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwZGItYnJvd3Nlci10cmVlLW5vZGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYnJvd3Nlci10cmVlLW5vZGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9icm93c2VyLXRyZWUtbm9kZS5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEJyb3dzZXJUcmVlTm9kZUNvbXBvbmVudCB7XG4gIHByaXZhdGUgX25vZGU6IFBhZ2VkVHJlZU5vZGU8YW55PiB8IHVuZGVmaW5lZCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBub2RlIHRvIGRpc3BsYXkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IG5vZGUoKTogUGFnZWRUcmVlTm9kZTxhbnk+IHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX25vZGU7XG4gIH1cblxuICBwdWJsaWMgc2V0IG5vZGUodmFsdWU6IFBhZ2VkVHJlZU5vZGU8YW55PiB8IHVuZGVmaW5lZCB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5fbm9kZSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fbm9kZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYWdpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBub2RlJ3MgY2hpbGRyZW4uXG4gICAqL1xuICBASW5wdXQoKVxuICBwYWdpbmc/OiBQYWdpbmdJbmZvO1xuXG4gIC8qKlxuICAgKiBUcnVlIHRvIHNob3cgZGVidWcgaW5mb3JtYXRpb24uXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGVidWc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUcnVlIHRvIGhpZGUgdGhlIG5vZGUncyBsb2MgYW5kIGxhYmVsLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0b1xuICAgKiBwcm92aWRlIHlvdXIgb3duIHZpZXcgZm9yIHRoZSBub2RlLCBiZXR3ZWVuIHRoZSBleHBhbnNpb24gdG9nZ2xlIGFuZFxuICAgKiB0aGUgZmlsdGVyIGVkaXQgYnV0dG9uLiBJbiB0aGlzIGNhc2UsIGluIHlvdXIgY29uc3VtZXIgdGVtcGxhdGUgcHJvdmlkZVxuICAgKiB5b3VyIG93biB2aWV3IGFzIHRoZSBjb250ZW50IG9mIHRoaXMgY29tcG9uZW50LiBJZiBpbnN0ZWFkIHlvdSBhcmUgZmluZVxuICAgKiB3aXRoIHRoZSBkZWZhdWx0IGxvYyBhbmQgbGFiZWwsIGFuZCBqdXN0IHdhbnQgdG8gYWRkIG1vcmUgZGF0YSB0b1xuICAgKiB0aGUgdmlldywgdGhlbiB5b3UgY2FuIGp1c3QgYWRkIHlvdXIgb3duIGNvbnRlbnQgdG8gdGhpcyBjb21wb25lbnQnc1xuICAgKiB0ZW1wbGF0ZSwgd2l0aG91dCBzZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoaWRlTGFiZWw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUcnVlIHRvIGhpZGUgdGhlIG5vZGUncyBwYWdpbmcgY29udHJvbCB1bmxlc3MgaG92ZXJlZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoaWRlUGFnaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGluZGVudCBzaXplIGZvciB0aGUgbm9kZSdzIGNoaWxkcmVuLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGluZGVudFNpemUgPSAzMDtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgdXNlciB3YW50cyB0byB0b2dnbGUgdGhlIGV4cGFuZGVkIHN0YXRlIG9mIHRoZSBub2RlLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyB0b2dnbGVFeHBhbmRlZFJlcXVlc3Q6IEV2ZW50RW1pdHRlcjxQYWdlZFRyZWVOb2RlPGFueT4+O1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSB1c2VyIHdhbnRzIHRvIGNoYW5nZSB0aGUgcGFnZSBudW1iZXIgb2YgdGhlIG5vZGUncyBjaGlsZHJlbi5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgY2hhbmdlUGFnZVJlcXVlc3Q6IEV2ZW50RW1pdHRlcjxQYWdlQ2hhbmdlUmVxdWVzdD47XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBlZGl0Tm9kZUZpbHRlclJlcXVlc3Q6IEV2ZW50RW1pdHRlcjxQYWdlZFRyZWVOb2RlPGFueT4+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudG9nZ2xlRXhwYW5kZWRSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlZFRyZWVOb2RlPGFueT4+KCk7XG4gICAgdGhpcy5jaGFuZ2VQYWdlUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnZUNoYW5nZVJlcXVlc3Q+KCk7XG4gICAgdGhpcy5lZGl0Tm9kZUZpbHRlclJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VkVHJlZU5vZGU8YW55Pj4oKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRvZ2dsZUV4cGFuZGVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkUmVxdWVzdC5lbWl0KHRoaXMuX25vZGUgYXMgUGFnZWRUcmVlTm9kZTxhbnk+KTtcbiAgfVxuXG4gIHB1YmxpYyBvblBhZ2luZ0NoYW5nZShub2RlOiBQYWdlZFRyZWVOb2RlPGFueT4sIHBhZ2luZzogUGFnaW5nSW5mbyk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlUGFnZVJlcXVlc3QuZW1pdCh7XG4gICAgICBub2RlLFxuICAgICAgcGFnaW5nLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uRWRpdEZpbHRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbm9kZSkge1xuICAgICAgdGhpcy5lZGl0Tm9kZUZpbHRlclJlcXVlc3QuZW1pdCh0aGlzLl9ub2RlKTtcbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAobm9kZSkge1xuPGRpdiBpZD1cIm5vZGVcIiBbc3R5bGUubWFyZ2luLWxlZnQucHhdPVwiKG5vZGUueSAtIDEpICAqIGluZGVudFNpemVcIj5cbiAgPCEtLSBwYWdlciAtLT5cbiAgQGlmICgkYW55KG5vZGUpLmV4cGFuZGVkICYmIHBhZ2luZyAmJiBwYWdpbmcucGFnZUNvdW50ID4gMSkge1xuICA8ZGl2IGlkPVwicGFnZXJcIiBbc3R5bGUuZGlzcGxheV09XCJoaWRlUGFnaW5nID8gJ2luaGVyaXQnIDogJ2Jsb2NrJ1wiPlxuICAgIDxwZGItY29tcGFjdC1wYWdlclxuICAgICAgW3BhZ2luZ109XCJwYWdpbmdcIlxuICAgICAgKHBhZ2luZ0NoYW5nZSk9XCJvblBhZ2luZ0NoYW5nZSgkYW55KG5vZGUpLCAkZXZlbnQpXCJcbiAgICAvPlxuICAgIDxwZGItcmFuZ2Utdmlld1xuICAgICAgW3dpZHRoXT1cIjI1MFwiXG4gICAgICBbZG9tYWluXT1cIlswLCBwYWdpbmcucGFnZUNvdW50XVwiXG4gICAgICBbcmFuZ2VdPVwiW3BhZ2luZy5wYWdlTnVtYmVyIC0gMSwgcGFnaW5nLnBhZ2VOdW1iZXJdXCJcbiAgICAvPlxuICA8L2Rpdj5cbiAgfVxuICA8IS0tIG5vZGUgLS0+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgIDwhLS0gZXhwYW5kL2NvbGxhcHNlIGJ1dHRvbiAtLT5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgW21hdFRvb2x0aXBdPVwiJGFueShub2RlKS5leHBhbmRlZCA/ICdDb2xsYXBzZScgOiAnRXhwYW5kJ1wiXG4gICAgICBbZGlzYWJsZWRdPVwibm9kZS5oYXNDaGlsZHJlbiA9PT0gZmFsc2VcIlxuICAgICAgKGNsaWNrKT1cIm9uVG9nZ2xlRXhwYW5kZWQoKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj57e1xuICAgICAgICBub2RlLmhhc0NoaWxkcmVuID09PSB0cnVlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gJGFueShub2RlKS5leHBhbmRlZFxuICAgICAgICAgICAgPyBcImV4cGFuZF9sZXNzXCJcbiAgICAgICAgICAgIDogXCJleHBhbmRfbW9yZVwiXG4gICAgICAgICAgOiBcInN0b3BcIlxuICAgICAgfX08L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSB0YWcgLS0+XG4gICAgQGlmICghaGlkZUxhYmVsKSB7XG4gICAgPHNwYW5cbiAgICAgIGNsYXNzPVwidGFnXCJcbiAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAobm9kZS50YWcgfCBzdHJpbmdUb0NvbG9yKSxcbiAgICAgICAgY29sb3I6IG5vZGUudGFnIHwgc3RyaW5nVG9Db2xvciB8IGNvbG9yVG9Db250cmFzdFxuICAgICAgfVwiXG4gICAgICA+e3sgbm9kZS50YWcgfX08L3NwYW5cbiAgICA+XG5cbiAgICA8IS0tIGxvYyBhbmQgbGFiZWwgLS0+XG4gICAgPHNwYW4gY2xhc3M9XCJsb2NcIj57eyBub2RlLnkgfX0ue3sgbm9kZS54IH19PC9zcGFuPiAtIHt7IG5vZGUubGFiZWwgfX1cbiAgICB9XG5cbiAgICA8IS0tIFBST0pFQ1RFRCBOT0RFIC0tPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblxuICAgIDwhLS0gZGVidWcgLS0+XG4gICAgQGlmIChkZWJ1Zykge1xuICAgIDxzcGFuIGNsYXNzPVwiZGVidWdcIlxuICAgICAgPiN7eyBub2RlLmlkIH19XG4gICAgICA8c3BhblxuICAgICAgICA+fCB7eyAkYW55KG5vZGUpLnBhZ2luZy5wYWdlTnVtYmVyIH19L3t7XG4gICAgICAgICAgJGFueShub2RlKS5wYWdpbmcucGFnZUNvdW50XG4gICAgICAgIH19XG4gICAgICAgICh7eyAkYW55KG5vZGUpLnBhZ2luZy50b3RhbCB9fSk8L3NwYW5cbiAgICAgID48L3NwYW5cbiAgICA+XG4gICAgfVxuXG4gICAgPCEtLSBmaWx0ZXIgLS0+XG4gICAgQGlmICghJGFueShub2RlKS5maWx0ZXIgJiYgbm9kZS55KSB7XG4gICAgPGRpdiBjbGFzcz1cIm11dGVkXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgbWF0VG9vbHRpcD1cIkFkZCBmaWx0ZXJcIlxuICAgICAgICAoY2xpY2spPVwib25FZGl0RmlsdGVyKClcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+ZmlsdGVyX2xpc3Q8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgfSBAaWYgKCRhbnkobm9kZSkuZmlsdGVyICYmIG5vZGUueSkge1xuICAgIDxkaXYgY2xhc3M9XCJtdXRlZFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJvbkVkaXRGaWx0ZXIoKVwiPlxuICAgICAgICA8bWF0LWljb24gW21hdEJhZGdlXT1cIiRhbnkobm9kZSkuZmlsdGVyID8gJ0YnIDogJydcIlxuICAgICAgICAgID5maWx0ZXJfYWx0PC9tYXQtaWNvblxuICAgICAgICA+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG59XG4iXX0=
@@ -1,4 +1,4 @@
1
- import { BehaviorSubject, forkJoin, of, switchMap, tap, } from 'rxjs';
1
+ import { BehaviorSubject, forkJoin, of, tap, } from 'rxjs';
2
2
  import { LRUCache } from './lru-cache';
3
3
  import { DEFAULT_PAGED_LIST_STORE_OPTIONS } from './paged-list.store';
4
4
  /**
@@ -23,7 +23,7 @@ export class PagedTreeStore {
23
23
  return;
24
24
  }
25
25
  this._pageSize = value;
26
- this.reset(this._radix?.label || this._radixLabel);
26
+ this.reset();
27
27
  }
28
28
  /**
29
29
  * Create an instance of the store.
@@ -35,21 +35,12 @@ export class PagedTreeStore {
35
35
  this._pageSize = options.pageSize;
36
36
  this._cache = new LRUCache(options.cacheSize);
37
37
  this._customCacheKeyBuilder = options.buildCacheKey;
38
- this._radixLabel = '(root)';
39
- this._roots = [];
40
38
  this._nodes$ = new BehaviorSubject([]);
41
39
  this.nodes$ = this._nodes$.asObservable();
42
- this._tags$ = new BehaviorSubject([]);
43
- this.tags$ = this._tags$.asObservable();
44
40
  this._filter$ = new BehaviorSubject({});
45
41
  this.filter$ = this._filter$.asObservable();
46
42
  this._dirty = true;
47
- this.updateTags();
48
- }
49
- updateTags() {
50
- this._service.getTags().subscribe((tags) => {
51
- this._tags$.next(tags);
52
- });
43
+ this._hasMockRoot = options.hasMockRoot || false;
53
44
  }
54
45
  /**
55
46
  * Gets the global filter, eventually overridden with values
@@ -65,6 +56,13 @@ export class PagedTreeStore {
65
56
  }
66
57
  : this._filter$.value;
67
58
  }
59
+ /**
60
+ * Checks if this store is empty.
61
+ * @returns True if this store is empty.
62
+ */
63
+ isEmpty() {
64
+ return this._nodes$.value.length === 0;
65
+ }
68
66
  /**
69
67
  * Gets all the nodes in the store.
70
68
  * @returns The nodes.
@@ -72,13 +70,6 @@ export class PagedTreeStore {
72
70
  getNodes() {
73
71
  return this._nodes$.value;
74
72
  }
75
- /**
76
- * Gets the list of nodes tags.
77
- * @returns The tags.
78
- */
79
- getTags() {
80
- return this._tags$.value;
81
- }
82
73
  /**
83
74
  * Build the cache key for the given page number and filter.
84
75
  * The default implementation just returns a stringified object
@@ -94,6 +85,13 @@ export class PagedTreeStore {
94
85
  }
95
86
  return JSON.stringify({ pageNumber, ...filter });
96
87
  }
88
+ /**
89
+ * Get the specified page of nodes, either from cache or from the server.
90
+ * When the page is retrieved from the server, it is stored in cache.
91
+ * @param filter The filter to apply.
92
+ * @param pageNumber The page number to get.
93
+ * @returns Observable of the page of nodes.
94
+ */
97
95
  getPageFromCacheOrServer(filter, pageNumber) {
98
96
  const key = this.buildCacheKey(pageNumber, filter);
99
97
  const pageInCache = this._cache.get(key);
@@ -101,11 +99,19 @@ export class PagedTreeStore {
101
99
  return of(pageInCache);
102
100
  }
103
101
  else {
104
- return this._service.getNodes(filter, pageNumber, this._pageSize).pipe(tap((page) => {
102
+ return this._service
103
+ .getNodes(filter, pageNumber, this._pageSize, this._hasMockRoot)
104
+ .pipe(tap((page) => {
105
105
  this._cache.put(key, page, 0);
106
106
  }));
107
107
  }
108
108
  }
109
+ /**
110
+ * Create paged tree nodes from a page of tree nodes, by providing further
111
+ * metadata like page number, page count and total items.
112
+ * @param page The page to create nodes from.
113
+ * @returns Paged nodes.
114
+ */
109
115
  createPageNodes(page) {
110
116
  return page.items.map((n) => {
111
117
  return {
@@ -123,94 +129,44 @@ export class PagedTreeStore {
123
129
  * Sets the filter for this store. Whenever the filter is set,
124
130
  * the store is reset.
125
131
  * @param filter The filter.
126
- * @param radixLabel The label of the radix node, if this needs to be set.
127
132
  * @returns true if tree was changed, false otherwise.
128
133
  */
129
- setFilter(filter, radixLabel) {
134
+ setFilter(filter) {
130
135
  if (this._filter$.value === filter) {
131
136
  return Promise.resolve(false);
132
137
  }
133
138
  this._filter$.next(filter);
134
139
  this._dirty = true;
135
- return this.reset(this._radix?.label || radixLabel || this._radixLabel);
140
+ return this.reset();
136
141
  }
137
142
  /**
138
143
  * Reset the store, loading the root nodes and their children.
139
- * @param label The label of the radix node.
140
144
  * @returns true if tree was changed, false otherwise.
141
145
  */
142
- reset(label) {
146
+ reset() {
143
147
  if (!this._dirty) {
144
148
  return Promise.resolve(false);
145
149
  }
146
150
  this._cache.clear();
147
151
  const filter = this._filter$.value;
148
- this._radix = {
149
- id: 0,
150
- y: 0,
151
- x: 1,
152
- label: label,
153
- paging: {
154
- pageNumber: 0,
155
- pageCount: 0,
156
- total: 0,
157
- },
158
- };
159
152
  return new Promise((resolve, reject) => {
160
153
  this._service
161
- .getRootNodes(filter.tags)
162
- .pipe(switchMap((nodes) => {
163
- // no roots, clear and return empty set
164
- if (!nodes || nodes.length === 0) {
165
- this._roots = [];
166
- return of([]);
167
- }
168
- else {
169
- // got roots, set them and get their children
170
- this._roots = nodes.map((node) => ({
171
- ...node,
172
- paging: {
173
- pageNumber: 1,
174
- pageCount: 1,
175
- total: 1,
176
- },
177
- }));
178
- // fetch children for each root node
179
- return forkJoin(this._roots.map((root) => this.getPageFromCacheOrServer({ ...filter, parentId: root.id }, 1)));
180
- }
181
- }))
154
+ .getNodes({
155
+ ...filter,
156
+ parentId: undefined,
157
+ }, 1, this._pageSize, this._hasMockRoot)
182
158
  .subscribe({
183
- next: (pages) => {
184
- this._dirty = false;
185
- if (pages.some((page) => page.total)) {
186
- // radix
187
- this._radix.hasChildren = true;
188
- this._radix.expanded = true;
189
- this._radix.paging = {
190
- pageNumber: 1,
191
- pageCount: 1,
192
- total: pages.length,
193
- };
194
- // roots
195
- this._roots.forEach((root, i) => {
196
- root.hasChildren = !!pages[i].total;
197
- root.expanded = !!pages[i].total;
198
- });
199
- const nodes = this._roots.flatMap((root, i) => [
200
- root,
201
- ...this.createPageNodes(pages[i]),
202
- ]);
203
- this._nodes$.next([this._radix, ...nodes]);
204
- resolve(true);
205
- }
206
- else {
207
- this._roots.forEach((root) => {
208
- root.hasChildren = false;
209
- root.expanded = false;
159
+ next: (page) => {
160
+ this._nodes$.next(this.createPageNodes(page));
161
+ // get the children of each node thus calculating their hasChildren property
162
+ const childrenObservables = this._nodes$.value.map((node) => this.getPageFromCacheOrServer({ ...filter, parentId: node.id }, 1));
163
+ forkJoin(childrenObservables).subscribe((childrenPages) => {
164
+ childrenPages.forEach((page, i) => {
165
+ this._nodes$.value[i].hasChildren = page.total > 0;
210
166
  });
211
- this._nodes$.next([this._radix, ...this._roots]);
212
- resolve(true);
213
- }
167
+ });
168
+ this._dirty = false;
169
+ resolve(true);
214
170
  },
215
171
  error: (error) => {
216
172
  reject(error);
@@ -413,7 +369,12 @@ export class PagedTreeStore {
413
369
  * Collapse all the nodes in the store.
414
370
  */
415
371
  collapseAll() {
416
- this._nodes$.next([this._radix, ...this._roots]);
372
+ if (this.isEmpty()) {
373
+ return;
374
+ }
375
+ // collapse the first node
376
+ const root = this._nodes$.value[0];
377
+ this.collapse(root.id);
417
378
  }
418
379
  /**
419
380
  * Clear the cache.
@@ -432,4 +393,4 @@ export class PagedTreeStore {
432
393
  return this._cache.has(key);
433
394
  }
434
395
  }
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
396
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtdHJlZS5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC10cmVlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxlQUFlLEVBRWYsUUFBUSxFQUNSLEVBQUUsRUFFRixHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFJZCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBNkZ0RTs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBNEJ6Qjs7O09BR0c7SUFDSCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFXLFFBQVEsQ0FBQyxLQUFhO1FBQy9CLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM3QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFDVSxRQUFrQyxFQUMxQyxVQUFpQyxnQ0FBZ0M7UUFEekQsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7UUFHMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQXFCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUNwRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFNLEVB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QUM7SUFFRDs7T0FFRztJQUNJLFVBQVU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGFBQWEsQ0FBQyxVQUFrQixFQUFFLE1BQVM7UUFDaEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEJlaGF2aW9yU3ViamVjdCxcclxuICBPYnNlcnZhYmxlLFxyXG4gIGZvcmtKb2luLFxyXG4gIG9mLFxyXG4gIHN3aXRjaE1hcCxcclxuICB0YXAsXHJcbn0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBEYXRhUGFnZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcblxyXG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4vbHJ1LWNhY2hlJztcclxuaW1wb3J0IHsgREVGQVVMVF9QQUdFRF9MSVNUX1NUT1JFX09QVElPTlMgfSBmcm9tICcuL3BhZ2VkLWxpc3Quc3RvcmUnO1xyXG5cclxuLyoqXHJcbiAqIEEgdHJlZSBub2RlLiBZb3VyIGRhdGEgc2VydmljZSBzaG91bGQgcmV0dXJuIGEgbGlzdCBvZiB0aGVzZSBub2Rlc1xyXG4gKiBvciBvZiBhbnkgdHlwZSBleHRlbmRpbmcgdGhpcyBpbnRlcmZhY2UuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVOb2RlIHtcclxuICBpZDogbnVtYmVyO1xyXG4gIHBhcmVudElkPzogbnVtYmVyO1xyXG4gIHk6IG51bWJlcjtcclxuICB4OiBudW1iZXI7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB0YWc/OiBzdHJpbmc7XHJcbiAgaGFzQ2hpbGRyZW4/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogQSBmaWx0ZXIgZm9yIHRyZWUgbm9kZXMuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVOb2RlRmlsdGVyIHtcclxuICB0YWdzPzogc3RyaW5nW107XHJcbiAgcGFyZW50SWQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQYWdpbmcgaW5mb3JtYXRpb24gZm9yIGEgcGFnZWQgdHJlZSBub2RlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmdJbmZvIHtcclxuICBwYWdlTnVtYmVyOiBudW1iZXI7XHJcbiAgcGFnZUNvdW50OiBudW1iZXI7XHJcbiAgdG90YWw6IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgdHJlZSBub2RlIHdpdGggcGFnaW5nIGluZm9ybWF0aW9uLCB1c2VkIGluIE5vZGVCcm93c2VyU3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkVHJlZU5vZGU8RiBleHRlbmRzIFRyZWVOb2RlRmlsdGVyPiBleHRlbmRzIFRyZWVOb2RlIHtcclxuICBwYWdpbmc6IFBhZ2luZ0luZm87XHJcbiAgZXhwYW5kZWQ/OiBib29sZWFuO1xyXG4gIGZpbHRlcj86IEY7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgaW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzZXJ2aWNlIHVzZWQgYnkgTm9kZUJyb3dzZXJTdG9yZVxyXG4gKiB0byBsb2FkIG5vZGVzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQYWdlZFRyZWVTdG9yZVNlcnZpY2U8RiBleHRlbmRzIFRyZWVOb2RlRmlsdGVyPiB7XHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBzcGVjaWZpZWQgcGFnZSBvZiBub2Rlcy5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSBUaGUgcGFnZSBzaXplLlxyXG4gICAqIEBwYXJhbSBoYXNNb2NrUm9vdCBJZiB0cnVlLCB0aGUgcm9vdCBub2RlIGlzIGEgbW9jayBub2RlIHByb3ZpZGVkIGJ5IHlvdXJcclxuICAgKiBzZXJ2aWNlLCB3aGljaCBpbXBsaWVzIHRoYXQgaXRzIFkgdmFsdWUgaXMgMCByYXRoZXIgdGhhbiAxLiBEZWZhdWx0IGlzXHJcbiAgICogZmFsc2UsIG1lYW5pbmcgdGhhdCB5b3VyIHNlcnZpY2Ugd2lsbCByZXR1cm4gYSBzaW5nbGUgcm9vdCBub2RlIHdpdGggWVxyXG4gICAqIHZhbHVlIDEuXHJcbiAgICovXHJcbiAgZ2V0Tm9kZXMoXHJcbiAgICBmaWx0ZXI6IEYsXHJcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXHJcbiAgICBwYWdlU2l6ZTogbnVtYmVyLFxyXG4gICAgaGFzTW9ja1Jvb3Q/OiBib29sZWFuXHJcbiAgKTogT2JzZXJ2YWJsZTxEYXRhUGFnZTxUcmVlTm9kZT4+O1xyXG59XHJcblxyXG4vKipcclxuICogT3B0aW9ucyBmb3IgdGhlIE5vZGVCcm93c2VyU3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkVHJlZVN0b3JlT3B0aW9ucyB7XHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgcGFnZXMgaW4gdGhlIHN0b3JlLlxyXG4gICAqL1xyXG4gIHBhZ2VTaXplOiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgdGhlIGNhY2hlIGZvciBwYWdlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgY2FjaGVTaXplOiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogQSBjdXN0b20gZnVuY3Rpb24gZm9yIGJ1aWxkaW5nIHRoZSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBwYWdlIG51bWJlclxyXG4gICAqIGFuZCBmaWx0ZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VOdW1iZXIgVGhlIHBhZ2UgbnVtYmVyLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcmV0dXJucyBBIHN0cmluZyB0byBiZSB1c2VkIGFzIGNhY2hlIGtleS5cclxuICAgKi9cclxuICBidWlsZENhY2hlS2V5PzogKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBhbnkpID0+IHN0cmluZztcclxuICAvKipcclxuICAgKiBJZiB0cnVlLCB0aGUgcm9vdCBub2RlIGlzIGEgbW9jayBub2RlIHByb3ZpZGVkIGJ5IHlvdXIgc2VydmljZSwgd2hpY2hcclxuICAgKiBpbXBsaWVzIHRoYXQgaXRzIFkgdmFsdWUgaXMgMCByYXRoZXIgdGhhbiAxLiBEZWZhdWx0IGlzIGZhbHNlLCBtZWFuaW5nXHJcbiAgICogdGhhdCB5b3VyIHNlcnZpY2Ugd2lsbCByZXR1cm4gYSBzaW5nbGUgcm9vdCBub2RlIHdpdGggWSB2YWx1ZSAxLlxyXG4gICAqL1xyXG4gIGhhc01vY2tSb290PzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3RvcmUgZm9yIHRoZSBub2RlIGJyb3dzZXIgY29tcG9uZW50LiBUaGlzIHN0b3JlIGlzIHVzZWQgdG8ga2VlcCBhXHJcbiAqIGxpc3Qgb2Ygbm9kZXMsIGFuZCB0byBsb2FkIHRoZW0gZnJvbSB0aGUgQVBJLiBJdCBhbHNvIGtlZXBzIHRoZSByb290XHJcbiAqIG5vZGUuIEV2ZXJ5IHRyZWUgbm9kZSBpbiB0aGUgbGlzdCBpcyBleHRlbmRlZCB3aXRoIHBhZ2UgbnVtYmVyLFxyXG4gKiBwYWdlIGNvdW50IGFuZCB0b3RhbCBpdGVtcywgcGx1cyBleHBhbnNpb24tcmVsYXRlZCBtZXRhZGF0YS5cclxuICogVGhlIHN0b3JlIGtlZXBzIGEgZmxhdCBsaXN0IG9mIHRoZXNlIHRyZWUgbm9kZXMsIGFsbG93aW5nIHVzZXJzIHRvXHJcbiAqIGV4cGFuZCBhbmQgY29sbGFwc2UgdGhlbS5cclxuICogRiBpcyB0aGUgdHlwZSBvZiB0aGUgZmlsdGVyIG9iamVjdCwgRSBpcyB0aGUgdHlwZSBvZiB0aGUgcGFnZWQgdHJlZSBub2Rlcy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBQYWdlZFRyZWVTdG9yZTxcclxuICBFIGV4dGVuZHMgUGFnZWRUcmVlTm9kZTxGPixcclxuICBGIGV4dGVuZHMgVHJlZU5vZGVGaWx0ZXJcclxuPiB7XHJcbiAgcHJpdmF0ZSBfbm9kZXMkOiBCZWhhdmlvclN1YmplY3Q8RVtdPjtcclxuICBwcml2YXRlIF9maWx0ZXIkOiBCZWhhdmlvclN1YmplY3Q8Rj47XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfY3VzdG9tQ2FjaGVLZXlCdWlsZGVyPzogKFxyXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxyXG4gICAgZmlsdGVyOiBhbnlcclxuICApID0+IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jYWNoZTogTFJVQ2FjaGU8RGF0YVBhZ2U8VHJlZU5vZGU+PjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9oYXNNb2NrUm9vdDogYm9vbGVhbjtcclxuXHJcbiAgcHJpdmF0ZSBfcGFnZVNpemU6IG51bWJlcjtcclxuICAvLyBkaXJ0eSBzdGF0ZTogdGhpcyBpcyByZXNldCB3aGVuIHRoZSBzdG9yZSBpcyByZXNldCwgYW5kIHNldCB0byB0cnVlXHJcbiAgLy8gd2hlbiB0aGUgc3RvcmUgaXMgY2hhbmdlZFxyXG4gIHByaXZhdGUgX2RpcnR5PzogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGZsYXQgbGlzdCBvZiBwYWdlZCBub2RlcyBpbiB0aGlzIHN0b3JlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBub2RlcyQ6IE9ic2VydmFibGU8UmVhZG9ubHk8RVtdPj47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBnbG9iYWwgZmlsdGVyIGZvciBhbGwgdGhlIG5vZGVzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaWx0ZXIkOiBPYnNlcnZhYmxlPFJlYWRvbmx5PEY+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2Ygbm9kZXMgcGFnZXMgaW4gdGhpcyBzdG9yZS4gSWYgeW91IGNoYW5nZSBpdCwgdGhlIHN0b3JlXHJcbiAgICogaXMgcmVzZXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDIwLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZTtcclxuICB9XHJcbiAgcHVibGljIHNldCBwYWdlU2l6ZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fcGFnZVNpemUgPT09IHZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3BhZ2VTaXplID0gdmFsdWU7XHJcbiAgICB0aGlzLnJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHN0b3JlLlxyXG4gICAqIEBwYXJhbSBfc2VydmljZSBUaGUgc2VydmljZSB1c2VkIHRvIGxvYWQgbm9kZXMuXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoaXMgc3RvcmUuXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9zZXJ2aWNlOiBQYWdlZFRyZWVTdG9yZVNlcnZpY2U8Rj4sXHJcbiAgICBvcHRpb25zOiBQYWdlZFRyZWVTdG9yZU9wdGlvbnMgPSBERUZBVUxUX1BBR0VEX0xJU1RfU1RPUkVfT1BUSU9OU1xyXG4gICkge1xyXG4gICAgdGhpcy5fcGFnZVNpemUgPSBvcHRpb25zLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5fY2FjaGUgPSBuZXcgTFJVQ2FjaGU8RGF0YVBhZ2U8VHJlZU5vZGU+PihvcHRpb25zLmNhY2hlU2l6ZSk7XHJcbiAgICB0aGlzLl9jdXN0b21DYWNoZUtleUJ1aWxkZXIgPSBvcHRpb25zLmJ1aWxkQ2FjaGVLZXk7XHJcbiAgICB0aGlzLl9ub2RlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEVbXT4oW10pO1xyXG4gICAgdGhpcy5ub2RlcyQgPSB0aGlzLl9ub2RlcyQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB0aGlzLl9maWx0ZXIkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGPih7fSBhcyBGKTtcclxuICAgIHRoaXMuZmlsdGVyJCA9IHRoaXMuX2ZpbHRlciQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICB0aGlzLl9oYXNNb2NrUm9vdCA9IG9wdGlvbnMuaGFzTW9ja1Jvb3QgfHwgZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBnbG9iYWwgZmlsdGVyLCBldmVudHVhbGx5IG92ZXJyaWRkZW4gd2l0aCB2YWx1ZXNcclxuICAgKiBmcm9tIHRoZSBzcGVjaWZpZWQgbm9kZSdzIGZpbHRlci5cclxuICAgKiBAcGFyYW0gbm9kZSBUaGUgb3B0aW9uYWwgbm9kZS5cclxuICAgKiBAcmV0dXJucyBUaGUgZmlsdGVyLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmlsdGVyKG5vZGU/OiBQYWdlZFRyZWVOb2RlPEY+KTogRiB7XHJcbiAgICByZXR1cm4gbm9kZT8uZmlsdGVyXHJcbiAgICAgID8ge1xyXG4gICAgICAgICAgLi4udGhpcy5fZmlsdGVyJC52YWx1ZSxcclxuICAgICAgICAgIC4uLm5vZGUuZmlsdGVyLFxyXG4gICAgICAgIH1cclxuICAgICAgOiB0aGlzLl9maWx0ZXIkLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIGlmIHRoaXMgc3RvcmUgaXMgZW1wdHkuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGlzIHN0b3JlIGlzIGVtcHR5LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX25vZGVzJC52YWx1ZS5sZW5ndGggPT09IDA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIGFsbCB0aGUgbm9kZXMgaW4gdGhlIHN0b3JlLlxyXG4gICAqIEByZXR1cm5zIFRoZSBub2Rlcy5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0Tm9kZXMoKTogUmVhZG9ubHk8UGFnZWRUcmVlTm9kZTxGPltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGQgdGhlIGNhY2hlIGtleSBmb3IgdGhlIGdpdmVuIHBhZ2UgbnVtYmVyIGFuZCBmaWx0ZXIuXHJcbiAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCByZXR1cm5zIGEgc3RyaW5naWZpZWQgb2JqZWN0XHJcbiAgICogY29udGFpbmluZyB0aGUgcGFnZSBudW1iZXIgYW5kIHRoZSBmaWx0ZXIuIFlvdSBtYXkgb3ZlcnJpZGVcclxuICAgKiB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGEgY3VzdG9tIGNhY2hlIGtleS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgY2FjaGUga2V5LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBidWlsZENhY2hlS2V5KHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBGKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl9jdXN0b21DYWNoZUtleUJ1aWxkZXIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbUNhY2hlS2V5QnVpbGRlcihwYWdlTnVtYmVyLCBmaWx0ZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgcGFnZU51bWJlciwgLi4uZmlsdGVyIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBzcGVjaWZpZWQgcGFnZSBvZiBub2RlcywgZWl0aGVyIGZyb20gY2FjaGUgb3IgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAqIFdoZW4gdGhlIHBhZ2UgaXMgcmV0cmlldmVkIGZyb20gdGhlIHNlcnZlciwgaXQgaXMgc3RvcmVkIGluIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0byBhcHBseS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIgdG8gZ2V0LlxyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHBhZ2Ugb2Ygbm9kZXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICBmaWx0ZXI6IEYsXHJcbiAgICBwYWdlTnVtYmVyOiBudW1iZXJcclxuICApOiBPYnNlcnZhYmxlPERhdGFQYWdlPFRyZWVOb2RlPj4ge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5idWlsZENhY2hlS2V5KHBhZ2VOdW1iZXIsIGZpbHRlcik7XHJcbiAgICBjb25zdCBwYWdlSW5DYWNoZSA9IHRoaXMuX2NhY2hlLmdldChrZXkpO1xyXG5cclxuICAgIGlmIChwYWdlSW5DYWNoZSkge1xyXG4gICAgICByZXR1cm4gb2YocGFnZUluQ2FjaGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VcclxuICAgICAgICAuZ2V0Tm9kZXMoZmlsdGVyLCBwYWdlTnVtYmVyLCB0aGlzLl9wYWdlU2l6ZSwgdGhpcy5faGFzTW9ja1Jvb3QpXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0YXAoKHBhZ2UpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fY2FjaGUucHV0KGtleSwgcGFnZSwgMCk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgcGFnZWQgdHJlZSBub2RlcyBmcm9tIGEgcGFnZSBvZiB0cmVlIG5vZGVzLCBieSBwcm92aWRpbmcgZnVydGhlclxyXG4gICAqIG1ldGFkYXRhIGxpa2UgcGFnZSBudW1iZXIsIHBhZ2UgY291bnQgYW5kIHRvdGFsIGl0ZW1zLlxyXG4gICAqIEBwYXJhbSBwYWdlIFRoZSBwYWdlIHRvIGNyZWF0ZSBub2RlcyBmcm9tLlxyXG4gICAqIEByZXR1cm5zIFBhZ2VkIG5vZGVzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlUGFnZU5vZGVzKHBhZ2U6IERhdGFQYWdlPFRyZWVOb2RlPik6IEVbXSB7XHJcbiAgICByZXR1cm4gcGFnZS5pdGVtcy5tYXAoKG4pID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5uLFxyXG4gICAgICAgIGhhc0NoaWxkcmVuOiBuLmhhc0NoaWxkcmVuLFxyXG4gICAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgICAgcGFnZU51bWJlcjogcGFnZS5wYWdlTnVtYmVyLFxyXG4gICAgICAgICAgcGFnZUNvdW50OiBwYWdlLnBhZ2VDb3VudCxcclxuICAgICAgICAgIHRvdGFsOiBwYWdlLnRvdGFsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0gYXMgRTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgZmlsdGVyIGZvciB0aGlzIHN0b3JlLiBXaGVuZXZlciB0aGUgZmlsdGVyIGlzIHNldCxcclxuICAgKiB0aGUgc3RvcmUgaXMgcmVzZXQuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdHJlZSB3YXMgY2hhbmdlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRGaWx0ZXIoZmlsdGVyOiBGKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodGhpcy5fZmlsdGVyJC52YWx1ZSA9PT0gZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZmlsdGVyJC5uZXh0KGZpbHRlcik7XHJcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNldCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgdGhlIHN0b3JlLCBsb2FkaW5nIHRoZSByb290IG5vZGVzIGFuZCB0aGVpciBjaGlsZHJlbi5cclxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRyZWUgd2FzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgcmVzZXQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuX2RpcnR5KSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuX2ZpbHRlciQudmFsdWU7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5fc2VydmljZVxyXG4gICAgICAgIC5nZXROb2RlcyhcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLi4uZmlsdGVyLFxyXG4gICAgICAgICAgICBwYXJlbnRJZDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIDEsXHJcbiAgICAgICAgICB0aGlzLl9wYWdlU2l6ZSxcclxuICAgICAgICAgIHRoaXMuX2hhc01vY2tSb290XHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHBhZ2U6IERhdGFQYWdlPFRyZWVOb2RlPikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9ub2RlcyQubmV4dCh0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgdGhlIGNoaWxkcmVuIG9mIGVhY2ggbm9kZSB0aHVzIGNhbGN1bGF0aW5nIHRoZWlyIGhhc0NoaWxkcmVuIHByb3BlcnR5XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuT2JzZXJ2YWJsZXMgPSB0aGlzLl9ub2RlcyQudmFsdWUubWFwKChub2RlKSA9PlxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0UGFnZUZyb21DYWNoZU9yU2VydmVyKHsgLi4uZmlsdGVyLCBwYXJlbnRJZDogbm9kZS5pZCB9LCAxKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBmb3JrSm9pbihjaGlsZHJlbk9ic2VydmFibGVzKS5zdWJzY3JpYmUoKGNoaWxkcmVuUGFnZXMpID0+IHtcclxuICAgICAgICAgICAgICBjaGlsZHJlblBhZ2VzLmZvckVhY2goKHBhZ2UsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vZGVzJC52YWx1ZVtpXS5oYXNDaGlsZHJlbiA9IHBhZ2UudG90YWwgPiAwO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBub2RlIGZpbHRlciBmb3IgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELlxyXG4gICAqIEBwYXJhbSBpZCBUaGUgbm9kZSBJRC5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gc2V0LlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVlIGlmIGZpbHRlciB3YXMgc2V0LCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIHNldE5vZGVGaWx0ZXIoaWQ6IG51bWJlciwgZmlsdGVyPzogRiB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlKSB7XHJcbiAgICAgICAgcmVqZWN0KGBOb2RlIElEICR7aWR9IG5vdCBmb3VuZCBpbiBzdG9yZWApO1xyXG4gICAgICB9XHJcbiAgICAgIG5vZGUhLmZpbHRlciA9IGZpbHRlciB8fCB1bmRlZmluZWQ7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoYW5nZVBhZ2UoaWQsIDEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHBhbmQgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELiBJZiB0aGUgbm9kZSBpcyBub3QgZXhwYW5kYWJsZSxcclxuICAgKiBvciBpdCBpcyBhbHJlYWR5IGV4cGFuZGVkLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIElEIG9mIHRoZSBub2RlIHRvIGV4cGFuZC5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1ZSBpZiB0aGUgbm9kZSB3YXMgZXhwYW5kZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgZXhwYW5kKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlIHx8IG5vZGUuZXhwYW5kZWQpIHtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5nZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICAgICAgeyAuLi50aGlzLmdldEZpbHRlcihub2RlKSwgcGFyZW50SWQ6IGlkIH0sXHJcbiAgICAgICAgMVxyXG4gICAgICApLnN1YnNjcmliZSgocGFnZSkgPT4ge1xyXG4gICAgICAgIC8vIG5vIGNoaWxkcmVuLCBzZXQgaGFzQ2hpbGRyZW4gdG8gZmFsc2VcclxuICAgICAgICBpZiAoIXBhZ2UudG90YWwpIHtcclxuICAgICAgICAgIG5vZGUhLmhhc0NoaWxkcmVuID0gZmFsc2U7XHJcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gaW5zZXJ0IHBhZ2Ugbm9kZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgbm9kZVxyXG4gICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IG5vZGVzLmluZGV4T2Yobm9kZSEpO1xyXG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZWplY3QoYE5vZGUgSUQgJHtpZH0gbm90IGZvdW5kIGluIHN0b3JlYCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBwYWdlTm9kZXMgPSB0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKTtcclxuICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGluZGV4ICsgMSwgMCwgLi4uKHBhZ2VOb2RlcyBhcyBFW10pKTtcclxuICAgICAgICAgICAgdGhpcy5fbm9kZXMkLm5leHQobm9kZXMpO1xyXG4gICAgICAgICAgICBub2RlIS5oYXNDaGlsZHJlbiA9IHRydWU7XHJcbiAgICAgICAgICAgIG5vZGUhLmV4cGFuZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXhwYW5kQWxsKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICAvLyBnZXQgdGhlIHBhcmVudCBub2RlIHRvIHN0YXJ0IGZyb21cclxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gICAgY29uc3Qgbm9kZUluZGV4ID0gbm9kZXMuZmluZEluZGV4KChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICBpZiAobm9kZUluZGV4ID09PSAtMSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb2xsZWN0IGFsbCB0aGUgZGVzY2VuZGFudCBub2RlcyBJRHNcclxuICAgIGxldCBpID0gbm9kZUluZGV4ICsgMTtcclxuICAgIHdoaWxlIChpIDwgbm9kZXMubGVuZ3RoICYmIG5vZGVzW2ldLnkgPiBub2Rlc1tub2RlSW5kZXhdLnkpIHtcclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm9kZXNUb0V4cGFuZCA9IG5vZGVzLnNsaWNlKG5vZGVJbmRleCwgaSkubWFwKChuKSA9PiBuLmlkKTtcclxuXHJcbiAgICAvLyBleHBhbmQgYWxsIHRoZSBkZXNjZW5kYW50IG5vZGVzXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBub2Rlc1RvRXhwYW5kLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgdGhpcy5leHBhbmQoaWQpO1xyXG4gICAgICAgIHRoaXMuZXhwYW5kQWxsKGlkKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDaGlsZHJlbihpZDogbnVtYmVyKTogRVtdIHtcclxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9ub2RlcyQudmFsdWUuZmluZCgobikgPT4gbi5pZCA9PT0gaWQpO1xyXG4gICAgaWYgKCFub2RlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gICAgY29uc3QgaW5kZXggPSBub2Rlcy5pbmRleE9mKG5vZGUpO1xyXG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBjb25zdCBjaGlsZHJlbjogRVtdID0gW107XHJcbiAgICBsZXQgaSA9IGluZGV4ICsgMTtcclxuICAgIHdoaWxlIChpIDwgbm9kZXMubGVuZ3RoICYmIG5vZGVzW2ldLnkgPiBub2RlLnkpIHtcclxuICAgICAgY2hpbGRyZW4ucHVzaChub2Rlc1tpXSk7XHJcbiAgICAgIGkrKztcclxuICAgIH1cclxuICAgIHJldHVybiBjaGlsZHJlbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRGVzY2VuZGFudHMoXHJcbiAgICBub2RlczogUGFnZWRUcmVlTm9kZTxGPltdLFxyXG4gICAgbm9kZUluZGV4OiBudW1iZXJcclxuICApOiB2b2lkIHtcclxuICAgIGxldCBpID0gbm9kZUluZGV4ICsgMTtcclxuICAgIHdoaWxlIChpIDwgbm9kZXMubGVuZ3RoICYmIG5vZGVzW2ldLnkgPiBub2Rlc1tub2RlSW5kZXhdLnkpIHtcclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgbm9kZXMuc3BsaWNlKG5vZGVJbmRleCArIDEsIGkgLSBub2RlSW5kZXggLSAxKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbGxhcHNlIHRoZSBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBJRC4gSWYgdGhlIG5vZGUgaXMgbm90IGV4cGFuZGFibGUsXHJcbiAgICogb3IgaXQgaXMgYWxyZWFkeSBjb2xsYXBzZWQsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy5cclxuICAgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBjb2xsYXBzZS5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1ZSBpZiB0aGUgbm9kZSB3YXMgY29sbGFwc2VkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGNvbGxhcHNlKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlIHx8ICFub2RlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlbW92ZSBhbGwgdGhlIGRlc2NlbmRhbnQgbm9kZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgbm9kZVxyXG4gICAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzJC52YWx1ZTtcclxuICAgICAgY29uc3Qgbm9kZUluZGV4ID0gbm9kZXMuaW5kZXhPZihub2RlISk7XHJcbiAgICAgIGlmIChub2RlSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgcmVqZWN0KGBOb2RlIElEICR7aWR9IG5vdCBmb3VuZCBpbiBzdG9yZWApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlbW92ZURlc2NlbmRhbnRzKG5vZGVzLCBub2RlSW5kZXgpO1xyXG4gICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KG5vZGVzKTtcclxuICAgICAgICBub2RlIS5leHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hhbmdlIHRoZSBwYWdlIGluY2x1ZGluZyB0aGUgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIHBhcmVudCBub2RlIHdob3NlIGNoaWxkcmVuIGFyZSBpbnNpZGUgdGhlIHBhZ2UgeW91IHdhbnQgdG8gY2hhbmdlLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBuZXcgcGFnZSBudW1iZXIuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHRydWUgaWYgdGhlIHBhZ2Ugd2FzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgY2hhbmdlUGFnZShwYXJlbnRJZDogbnVtYmVyLCBwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9ub2RlcyQudmFsdWUuZmluZCgobikgPT4gbi5pZCA9PT0gcGFyZW50SWQpO1xyXG4gICAgICBpZiAoIXBhcmVudE5vZGUpIHtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdldFBhZ2VGcm9tQ2FjaGVPclNlcnZlcihcclxuICAgICAgICB7IC4uLnRoaXMuZ2V0RmlsdGVyKHBhcmVudE5vZGUpLCBwYXJlbnRJZCB9LFxyXG4gICAgICAgIHBhZ2VOdW1iZXJcclxuICAgICAgKS5zdWJzY3JpYmUoKHBhZ2UpID0+IHtcclxuICAgICAgICAvLyBpZiBwYWdlIGlzIGVtcHR5IGRvIG5vdGhpbmdcclxuICAgICAgICBpZiAoIXBhZ2UudG90YWwpIHtcclxuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgICAvLyByZW1vdmUgYWxsIHRoZSBub2RlcyBpbiB0aGUgc2FtZSBwYWdlIG9mIG5vZGVcclxuICAgICAgICAgIC8vIHdpdGggYWxsIHRoZWlyIGRlc2NlbmRhbnRzXHJcbiAgICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMuX25vZGVzJC52YWx1ZTtcclxuICAgICAgICAgIGNvbnN0IG5vZGVJbmRleCA9IG5vZGVzLmluZGV4T2YocGFyZW50Tm9kZSEpICsgMTtcclxuICAgICAgICAgIGNvbnN0IHBhZ2VOb2RlcyA9IHRoaXMuY3JlYXRlUGFnZU5vZGVzKHBhZ2UpO1xyXG4gICAgICAgICAgLy8gZmluZCB0aGUgZmlyc3Qgbm9kZSBvZiB0aGUgbm9kZSdzIHBhZ2VcclxuICAgICAgICAgIGxldCBzdGFydCA9IG5vZGVJbmRleDtcclxuICAgICAgICAgIGNvbnN0IG9sZFBhZ2VOciA9IG5vZGVzW3N0YXJ0XS5wYWdpbmcucGFnZU51bWJlcjtcclxuICAgICAgICAgIHdoaWxlIChcclxuICAgICAgICAgICAgc3RhcnQgPiAwICYmXHJcbiAgICAgICAgICAgIG5vZGVzW3N0YXJ0IC0gMV0ucGFyZW50SWQgPT09IHBhcmVudElkICYmXHJcbiAgICAgICAgICAgIG5vZGVzW3N0YXJ0IC0gMV0ucGFnaW5nLnBhZ2VOdW1iZXIgPT09IG9sZFBhZ2VOclxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHN0YXJ0LS07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBmaW5kIHRoZSBsYXN0IG5vZGUgb2YgdGhlIG5vZGUncyBwYWdlLFxyXG4gICAgICAgICAgLy8gaW5jbHVkaW5nIGFsbCB0aGVpciBkZXNjZW5kYW50c1xyXG4gICAgICAgICAgbGV0IGVuZCA9IG5vZGVJbmRleCArIDE7XHJcbiAgICAgICAgICB3aGlsZSAoXHJcbiAgICAgICAgICAgIGVuZCA8IG5vZGVzLmxlbmd0aCAmJlxyXG4gICAgICAgICAgICBub2Rlc1tlbmRdLnBhcmVudElkID09PSBwYXJlbnRJZCAmJlxyXG4gICAgICAgICAgICBub2Rlc1tlbmRdLnBhZ2luZy5wYWdlTnVtYmVyID09PSBvbGRQYWdlTnJcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBlbmQrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIHJlcGxhY2UgYWxsIHRoZXNlIG5vZGVzIHdpdGggdGhlIG5ldyBvbmVzXHJcbiAgICAgICAgICBub2Rlcy5zcGxpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0KTtcclxuICAgICAgICAgIG5vZGVzLnNwbGljZShzdGFydCwgMCwgLi4uKHBhZ2VOb2RlcyBhcyBFW10pKTtcclxuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgcGFyZW50IG5vZGUgcGFnaW5nIGluZm9cclxuICAgICAgICAgIHBhcmVudE5vZGUhLnBhZ2luZy5wYWdlTnVtYmVyID0gcGFnZS5wYWdlTnVtYmVyO1xyXG4gICAgICAgICAgdGhpcy5fbm9kZXMkLm5leHQobm9kZXMpO1xyXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2xsYXBzZSBhbGwgdGhlIG5vZGVzIGluIHRoZSBzdG9yZS5cclxuICAgKi9cclxuICBwdWJsaWMgY29sbGFwc2VBbGwoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gY29sbGFwc2UgdGhlIGZpcnN0IG5vZGVcclxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9ub2RlcyQudmFsdWVbMF07XHJcbiAgICB0aGlzLmNvbGxhcHNlKHJvb3QuaWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjbGVhckNhY2hlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoZSBwYWdlIHdpdGggdGhlIGdpdmVuIG51bWJlciBhbmQgZmlsdGVyIGlzIGluIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcGFnZSBpcyBpbiBjYWNoZSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBoYXNDYWNoZWRQYWdlKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBGKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIHJldHVybiB0aGlzLl9jYWNoZS5oYXMoa2V5KTtcclxuICB9XHJcbn1cclxuIl19