ontimize-web-ngx 15.5.7 → 15.5.9
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/esm2020/lib/components/o-service-base-component.class.mjs +10 -1
- package/esm2020/lib/components/tree/o-tree-dao.service.mjs +32 -1
- package/esm2020/lib/components/tree/o-tree.component.mjs +236 -33
- package/esm2020/lib/components/tree/o-tree.datasource.mjs +29 -15
- package/esm2020/lib/components/tree/o-tree.module.mjs +1 -1
- package/esm2020/lib/components/tree/tree-node/tree-node.component.mjs +2 -20
- package/esm2020/lib/i18n/i18n.mjs +7 -4
- package/esm2020/lib/services/state/index.mjs +3 -1
- package/esm2020/lib/services/state/o-tree-component-state.class.mjs +1 -1
- package/esm2020/lib/services/state/o-tree-component-state.service.mjs +54 -14
- package/esm2020/lib/types/tree-flat-node.type.mjs +1 -1
- package/fesm2015/ontimize-web-ngx.mjs +392 -61
- package/fesm2015/ontimize-web-ngx.mjs.map +1 -1
- package/fesm2020/ontimize-web-ngx.mjs +388 -61
- package/fesm2020/ontimize-web-ngx.mjs.map +1 -1
- package/lib/components/o-service-base-component.class.d.ts +3 -0
- package/lib/components/tree/o-tree-dao.service.d.ts +4 -2
- package/lib/components/tree/o-tree.component.d.ts +30 -3
- package/lib/components/tree/o-tree.datasource.d.ts +3 -0
- package/lib/components/tree/tree-node/tree-node.component.d.ts +0 -4
- package/lib/i18n/i18n.d.ts +3 -0
- package/lib/services/state/index.d.ts +2 -0
- package/lib/services/state/o-tree-component-state.class.d.ts +3 -0
- package/lib/services/state/o-tree-component-state.service.d.ts +4 -1
- package/lib/types/tree-flat-node.type.d.ts +5 -1
- package/package.json +1 -1
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
2
|
import { SelectionModel } from '@angular/cdk/collections';
|
|
3
3
|
import { FlatTreeControl } from '@angular/cdk/tree';
|
|
4
|
-
import { Component, ContentChild, ElementRef, EventEmitter, forwardRef, Inject, Injector, Optional, TemplateRef, ViewEncapsulation } from '@angular/core';
|
|
4
|
+
import { Component, ContentChild, ElementRef, EventEmitter, forwardRef, Inject, Injector, Optional, TemplateRef, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
5
5
|
import { Subscription } from 'rxjs';
|
|
6
6
|
import { BooleanInputConverter } from '../../decorators/input-converter';
|
|
7
|
-
import { OntimizeServiceProvider } from '../../services/factories';
|
|
7
|
+
import { ComponentStateServiceProvider, O_COMPONENT_STATE_SERVICE, OntimizeServiceProvider } from '../../services/factories';
|
|
8
|
+
import { OTreeComponentStateService } from '../../services/state/o-tree-component-state.service';
|
|
8
9
|
import { Codes } from '../../util/codes';
|
|
9
10
|
import { FilterExpressionUtils } from '../../util/filter-expression.utils';
|
|
10
11
|
import { Util } from '../../util/util';
|
|
@@ -13,6 +14,8 @@ import { AbstractOServiceComponent } from '../o-service-component.class';
|
|
|
13
14
|
import { OTreeDao } from './o-tree-dao.service';
|
|
14
15
|
import { OTreeDataSource } from './o-tree.datasource';
|
|
15
16
|
import { OTreeNodeComponent } from './tree-node/tree-node.component';
|
|
17
|
+
import { ServiceUtils } from '../../util';
|
|
18
|
+
import { MatPaginator } from '@angular/material/paginator';
|
|
16
19
|
import * as i0 from "@angular/core";
|
|
17
20
|
import * as i1 from "@angular/common";
|
|
18
21
|
import * as i2 from "../input/search-input/o-search-input.component";
|
|
@@ -23,10 +26,11 @@ import * as i6 from "@angular/material/checkbox";
|
|
|
23
26
|
import * as i7 from "@angular/material/icon";
|
|
24
27
|
import * as i8 from "@angular/material/menu";
|
|
25
28
|
import * as i9 from "@angular/material/progress-bar";
|
|
26
|
-
import * as i10 from "@angular/material/
|
|
27
|
-
import * as i11 from "
|
|
28
|
-
import * as i12 from "
|
|
29
|
-
import * as i13 from "
|
|
29
|
+
import * as i10 from "@angular/material/paginator";
|
|
30
|
+
import * as i11 from "@angular/material/tree";
|
|
31
|
+
import * as i12 from "./header/tree-menu/o-tree-menu.component";
|
|
32
|
+
import * as i13 from "../../pipes/o-translate.pipe";
|
|
33
|
+
import * as i14 from "../form/o-form.component";
|
|
30
34
|
export const DEFAULT_INPUTS_O_TREE = [
|
|
31
35
|
'oattr: attr',
|
|
32
36
|
'service',
|
|
@@ -61,16 +65,16 @@ export class OTreeComponent extends AbstractOServiceComponent {
|
|
|
61
65
|
if (node.level === 0 && Util.isDefined(this.rootTitle)) {
|
|
62
66
|
return this.rootNodes;
|
|
63
67
|
}
|
|
64
|
-
else if (node.
|
|
65
|
-
if (Util.isDefined(node.
|
|
68
|
+
else if (node.childNode) {
|
|
69
|
+
if (Util.isDefined(node.childNode.rootTitle) && !Util.isDefined(node.rootNode)) {
|
|
66
70
|
let rootNode = {
|
|
67
|
-
id: this.dataSource.data.length + 1, rootNode: true, label: this.translateService.get(node.
|
|
71
|
+
id: this.dataSource.data.length + 1, rootNode: true, label: this.translateService.get(node.childNode.rootTitle), level: node.level + 1, expandable: true, data: node.data, isLoading: false, node: node.childNode, childNode: node.childNode
|
|
68
72
|
};
|
|
69
73
|
this.daoTree.flatNodeMap.set(rootNode, node);
|
|
70
74
|
return [rootNode];
|
|
71
75
|
}
|
|
72
76
|
else {
|
|
73
|
-
return
|
|
77
|
+
return this.childQueryData(node);
|
|
74
78
|
}
|
|
75
79
|
}
|
|
76
80
|
else {
|
|
@@ -82,7 +86,7 @@ export class OTreeComponent extends AbstractOServiceComponent {
|
|
|
82
86
|
return this.rootNodes;
|
|
83
87
|
}
|
|
84
88
|
else {
|
|
85
|
-
return
|
|
89
|
+
return this.childQueryData(node);
|
|
86
90
|
}
|
|
87
91
|
}
|
|
88
92
|
getComponentFilter(existingFilter = {}) {
|
|
@@ -96,6 +100,39 @@ export class OTreeComponent extends AbstractOServiceComponent {
|
|
|
96
100
|
}
|
|
97
101
|
return super.getComponentFilter(filter);
|
|
98
102
|
}
|
|
103
|
+
onLoadMore(event, node) {
|
|
104
|
+
event.stopPropagation();
|
|
105
|
+
event.preventDefault();
|
|
106
|
+
const parentNode = this.getParentNode(node);
|
|
107
|
+
if (!parentNode || parentNode.isLoading)
|
|
108
|
+
return;
|
|
109
|
+
parentNode.isLoading = true;
|
|
110
|
+
parentNode.offset = Math.min((parentNode.offset ?? 0) + parentNode.childNode.queryRows, parentNode.totalQueryRecordsNumber);
|
|
111
|
+
parentNode.hasMore = parentNode.offset + parentNode.childNode.queryRows < parentNode.totalQueryRecordsNumber;
|
|
112
|
+
this.getChildren(parentNode).subscribe({
|
|
113
|
+
next: (res) => {
|
|
114
|
+
if (res.isSuccessful()) {
|
|
115
|
+
const newData = res.data || [];
|
|
116
|
+
this.dataSource.updateTree(parentNode, newData, true);
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
error: (err) => {
|
|
120
|
+
this.dialogService.error('ERROR', 'MESSAGES.ERROR_QUERY');
|
|
121
|
+
parentNode.isLoading = false;
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
isLastChildAndHasMore(node) {
|
|
126
|
+
let parent = this.daoTree.flatNodeMap.get(node);
|
|
127
|
+
if (!parent?.hasMore)
|
|
128
|
+
return false;
|
|
129
|
+
const siblings = this.treeControl.getDescendants(parent)
|
|
130
|
+
.filter(child => child.level === node.level);
|
|
131
|
+
if (!siblings || siblings.length === 0)
|
|
132
|
+
return false;
|
|
133
|
+
const lastSibling = siblings[siblings.length - 1];
|
|
134
|
+
return node.id === lastSibling.id;
|
|
135
|
+
}
|
|
99
136
|
set nodeTemplate(value) {
|
|
100
137
|
if (value != null) {
|
|
101
138
|
this.leafNodeTemplate = value;
|
|
@@ -121,6 +158,7 @@ export class OTreeComponent extends AbstractOServiceComponent {
|
|
|
121
158
|
};
|
|
122
159
|
this.hasChild = (_, _nodeData) => _nodeData.expandable;
|
|
123
160
|
this.hasNoContent = (_, _nodeData) => _nodeData.label === '';
|
|
161
|
+
this.hasLoadMore = (node) => this.getLogicalLevel(node) > 0 && this.treeControl.isExpanded(node) && node.node.pageable;
|
|
124
162
|
this.refreshButton = true;
|
|
125
163
|
this.deleteButton = false;
|
|
126
164
|
this.showButtonsText = false;
|
|
@@ -133,7 +171,6 @@ export class OTreeComponent extends AbstractOServiceComponent {
|
|
|
133
171
|
this.childreNodes = [];
|
|
134
172
|
this.nodesArray = [];
|
|
135
173
|
this.ancestors = [];
|
|
136
|
-
this.checklistSelection = new SelectionModel(true, [], true, (sm1, sm2) => sm1.id === sm2.id);
|
|
137
174
|
this.onNodeSelected = new EventEmitter();
|
|
138
175
|
this.onNodeExpanded = new EventEmitter();
|
|
139
176
|
this.onNodeCollapsed = new EventEmitter();
|
|
@@ -150,11 +187,12 @@ export class OTreeComponent extends AbstractOServiceComponent {
|
|
|
150
187
|
'label': this.getItemText(node),
|
|
151
188
|
'level': level,
|
|
152
189
|
'node': this,
|
|
153
|
-
|
|
190
|
+
childNode: this.treeNode,
|
|
154
191
|
'expandable': Util.isDefined(this.treeNode) || !!nodeChildren?.length || this.recursive,
|
|
155
192
|
'data': node,
|
|
156
193
|
'isLoading': false,
|
|
157
|
-
'route': this.route
|
|
194
|
+
'route': this.route,
|
|
195
|
+
'offset': this.parentComponent?.queryRows ?? 0
|
|
158
196
|
};
|
|
159
197
|
this.daoTree.flatNodeMap.set(flatNode, parentNode);
|
|
160
198
|
nodeChildren.forEach(node => this.transformer(node, level + 1));
|
|
@@ -189,15 +227,24 @@ export class OTreeComponent extends AbstractOServiceComponent {
|
|
|
189
227
|
if (!this.visibleColumns) {
|
|
190
228
|
this.visibleColumns = this.columns;
|
|
191
229
|
}
|
|
230
|
+
if (this.state) {
|
|
231
|
+
this.state.queryRecordOffset = 0;
|
|
232
|
+
this.currentPage = this.state.currentPage ?? 0;
|
|
233
|
+
}
|
|
192
234
|
if (!Util.isDefined(this.quickFilterColumns)) {
|
|
193
235
|
this.quickFilterColumns = this.visibleColumns;
|
|
194
236
|
}
|
|
237
|
+
this.parseSortColumn();
|
|
238
|
+
}
|
|
239
|
+
get state() {
|
|
240
|
+
return this.componentStateService.state;
|
|
195
241
|
}
|
|
196
242
|
ngAfterViewInit() {
|
|
197
243
|
this.visibleColumnsArray = Util.parseArray(this.visibleColumns, true);
|
|
198
244
|
this.quickFilterColArray = Util.parseArray(this.quickFilterColumns, true);
|
|
199
245
|
this.setDatasource();
|
|
200
246
|
this.afterViewInit();
|
|
247
|
+
this.registerQuickFilter(this.searchInputComponent);
|
|
201
248
|
if (this.queryOnInit) {
|
|
202
249
|
this.queryData();
|
|
203
250
|
}
|
|
@@ -254,16 +301,24 @@ export class OTreeComponent extends AbstractOServiceComponent {
|
|
|
254
301
|
this.dataSource.updateTree(node, [], expand);
|
|
255
302
|
}
|
|
256
303
|
}
|
|
257
|
-
updateAsyncTree(children,
|
|
304
|
+
updateAsyncTree(children, flatNode, expand) {
|
|
258
305
|
children.subscribe((res) => {
|
|
259
306
|
let data;
|
|
260
307
|
if (res.isSuccessful()) {
|
|
261
308
|
const arrData = (res.data !== undefined) ? res.data : [];
|
|
262
309
|
data = Util.isArray(arrData) ? arrData : [];
|
|
263
310
|
}
|
|
264
|
-
this.
|
|
311
|
+
const node = this.recursive ? flatNode.node : flatNode.childNode;
|
|
312
|
+
flatNode.hasMore = false;
|
|
313
|
+
flatNode.totalQueryRecordsNumber = node.pageable ? res.totalQueryRecordsNumber : data.length;
|
|
314
|
+
const canLoadMore = this.hasLoadMore(flatNode);
|
|
315
|
+
flatNode.hasMore = false;
|
|
316
|
+
if (canLoadMore) {
|
|
317
|
+
flatNode.hasMore = Util.isDefined(res.startRecordIndex) ? (node.queryRows + res.startRecordIndex < res.totalQueryRecordsNumber) : (this.queryRows < data.length);
|
|
318
|
+
}
|
|
319
|
+
this.dataSource.updateTree(flatNode, data, expand);
|
|
265
320
|
}, err => {
|
|
266
|
-
|
|
321
|
+
flatNode.isLoading = false;
|
|
267
322
|
if (Util.isDefined(this.queryFallbackFunction)) {
|
|
268
323
|
this.queryFallbackFunction(err);
|
|
269
324
|
}
|
|
@@ -277,12 +332,12 @@ export class OTreeComponent extends AbstractOServiceComponent {
|
|
|
277
332
|
this.todoItemSelectionToggle(node);
|
|
278
333
|
}
|
|
279
334
|
todoItemSelectionToggle(node) {
|
|
280
|
-
this.
|
|
335
|
+
this.selection.toggle(node);
|
|
281
336
|
const descendants = this.treeControl.getDescendants(node);
|
|
282
|
-
this.
|
|
283
|
-
? this.
|
|
284
|
-
: this.
|
|
285
|
-
descendants.every((child) => this.
|
|
337
|
+
this.selection.isSelected(node)
|
|
338
|
+
? this.selection.select(...descendants)
|
|
339
|
+
: this.selection.deselect(...descendants);
|
|
340
|
+
descendants.every((child) => this.selection.isSelected(child));
|
|
286
341
|
this.onNodeSelected.emit(node.data);
|
|
287
342
|
}
|
|
288
343
|
descendantsAllSelected(node) {
|
|
@@ -290,16 +345,16 @@ export class OTreeComponent extends AbstractOServiceComponent {
|
|
|
290
345
|
const descendants = this.treeControl.getDescendants(node);
|
|
291
346
|
if (node.expandable) {
|
|
292
347
|
if (this.treeControl.isExpanded(node) && descendants.length > 0) {
|
|
293
|
-
descAllSelected = descendants.every((child) => this.
|
|
294
|
-
descAllSelected ? this.
|
|
348
|
+
descAllSelected = descendants.every((child) => this.selection.isSelected(child));
|
|
349
|
+
descAllSelected ? this.selection.select(node) : this.selection.deselect(node);
|
|
295
350
|
return descAllSelected;
|
|
296
351
|
}
|
|
297
352
|
else {
|
|
298
|
-
return this.
|
|
353
|
+
return this.selection.isSelected(node);
|
|
299
354
|
}
|
|
300
355
|
}
|
|
301
356
|
else {
|
|
302
|
-
return this.
|
|
357
|
+
return this.selection.isSelected(node);
|
|
303
358
|
}
|
|
304
359
|
}
|
|
305
360
|
descendantsPartiallySelected(node) {
|
|
@@ -307,7 +362,7 @@ export class OTreeComponent extends AbstractOServiceComponent {
|
|
|
307
362
|
const descendants = this.treeControl.getDescendants(node);
|
|
308
363
|
if (node.expandable) {
|
|
309
364
|
if (descendants.length > 0) {
|
|
310
|
-
result = descendants.some((child) => this.
|
|
365
|
+
result = descendants.some((child) => this.selection.isSelected(child));
|
|
311
366
|
}
|
|
312
367
|
}
|
|
313
368
|
return result && !this.descendantsAllSelected(node);
|
|
@@ -344,6 +399,15 @@ export class OTreeComponent extends AbstractOServiceComponent {
|
|
|
344
399
|
}
|
|
345
400
|
}
|
|
346
401
|
filterData(value, loadMore) {
|
|
402
|
+
if (this.pageable) {
|
|
403
|
+
const queryArgs = {
|
|
404
|
+
offset: 0,
|
|
405
|
+
length: this.queryRows,
|
|
406
|
+
replace: true
|
|
407
|
+
};
|
|
408
|
+
this.queryData(void 0, queryArgs);
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
347
411
|
let filteredTreeData = [];
|
|
348
412
|
if (value) {
|
|
349
413
|
for (let [nestedNode] of this.daoTree.flatNodeMap) {
|
|
@@ -468,12 +532,146 @@ export class OTreeComponent extends AbstractOServiceComponent {
|
|
|
468
532
|
onItemDetailClick(node) {
|
|
469
533
|
this.handleItemClick(node.data);
|
|
470
534
|
}
|
|
535
|
+
get selection() {
|
|
536
|
+
if (!Util.isDefined(this._selection)) {
|
|
537
|
+
this._selection = new SelectionModel(true, [], true, (sm1, sm2) => sm1.id === sm2.id);
|
|
538
|
+
}
|
|
539
|
+
return this._selection;
|
|
540
|
+
}
|
|
541
|
+
getSelectedItems() {
|
|
542
|
+
const selectedFlatNodes = this.selection.selected;
|
|
543
|
+
const selectedKeys = this.getSelectedNodeKeys(selectedFlatNodes);
|
|
544
|
+
const nodeMap = new Map();
|
|
545
|
+
const rootNodes = [];
|
|
546
|
+
for (const flatNode of selectedFlatNodes) {
|
|
547
|
+
const key = this.getFlatNodeIdentifier(flatNode);
|
|
548
|
+
const treeNode = this.createTreeNode(flatNode);
|
|
549
|
+
nodeMap.set(key, treeNode);
|
|
550
|
+
const parent = this.daoTree.flatNodeMap.get(flatNode);
|
|
551
|
+
if (!parent) {
|
|
552
|
+
rootNodes.push(treeNode);
|
|
553
|
+
continue;
|
|
554
|
+
}
|
|
555
|
+
const parentKey = this.getFlatNodeIdentifier(parent);
|
|
556
|
+
if (!selectedKeys.has(parentKey)) {
|
|
557
|
+
rootNodes.push(treeNode);
|
|
558
|
+
continue;
|
|
559
|
+
}
|
|
560
|
+
const parentNode = this.ensureNodeInMap(parent, nodeMap);
|
|
561
|
+
this.addChildToParent(parentNode, treeNode);
|
|
562
|
+
if (this.shouldBeRoot(parent, selectedKeys) && !rootNodes.includes(parentNode)) {
|
|
563
|
+
rootNodes.push(parentNode);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
return rootNodes;
|
|
567
|
+
}
|
|
568
|
+
parseSortColumn() {
|
|
569
|
+
this.sortColumnArray = ServiceUtils.parseSortColumns(this.sortColumn) || [];
|
|
570
|
+
}
|
|
571
|
+
getQueryArguments(filter, ovrrArgs) {
|
|
572
|
+
const queryArguments = super.getQueryArguments(filter, ovrrArgs);
|
|
573
|
+
if (this.pageable) {
|
|
574
|
+
if (Util.isDefined(this.sortColumnArray)) {
|
|
575
|
+
queryArguments[6] = this.sortColumnArray;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
return queryArguments;
|
|
579
|
+
}
|
|
580
|
+
shouldBeRoot(parent, selectedKeys) {
|
|
581
|
+
const grandParent = this.daoTree.flatNodeMap.get(parent);
|
|
582
|
+
if (!grandParent)
|
|
583
|
+
return true;
|
|
584
|
+
const grandParentKey = this.getFlatNodeIdentifier(grandParent);
|
|
585
|
+
return !selectedKeys.has(grandParentKey);
|
|
586
|
+
}
|
|
587
|
+
createTreeNode(flatNode) {
|
|
588
|
+
return flatNode.node
|
|
589
|
+
? { ...flatNode.data }
|
|
590
|
+
: { label: flatNode.label };
|
|
591
|
+
}
|
|
592
|
+
getFlatNodeIdentifier(flatNode) {
|
|
593
|
+
if (flatNode.node?.getItemKey) {
|
|
594
|
+
return flatNode.node.getItemKey(flatNode.data);
|
|
595
|
+
}
|
|
596
|
+
else if (flatNode.id != null) {
|
|
597
|
+
return flatNode.id.toString();
|
|
598
|
+
}
|
|
599
|
+
return flatNode.label;
|
|
600
|
+
}
|
|
601
|
+
addChildToParent(parentNode, childNode) {
|
|
602
|
+
if (!parentNode.children) {
|
|
603
|
+
parentNode.children = [];
|
|
604
|
+
}
|
|
605
|
+
parentNode.children.push(childNode);
|
|
606
|
+
}
|
|
607
|
+
addParentToRootIfNoGrandparentSelected(parent, parentKey, selectedKeys, nodeMap, rootNodes) {
|
|
608
|
+
const grandParent = this.daoTree.flatNodeMap.get(parent);
|
|
609
|
+
const grandParentKey = grandParent ? this.getFlatNodeIdentifier(grandParent) : null;
|
|
610
|
+
if (!grandParent || !selectedKeys.has(grandParentKey)) {
|
|
611
|
+
const parentNode = nodeMap.get(parentKey);
|
|
612
|
+
if (!rootNodes.includes(parentNode)) {
|
|
613
|
+
rootNodes.push(parentNode);
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
ensureNodeInMap(flatNode, map) {
|
|
618
|
+
const key = this.getFlatNodeIdentifier(flatNode);
|
|
619
|
+
if (!map.has(key)) {
|
|
620
|
+
map.set(key, this.createTreeNode(flatNode));
|
|
621
|
+
}
|
|
622
|
+
return map.get(key);
|
|
623
|
+
}
|
|
624
|
+
getSelectedNodeKeys(nodes) {
|
|
625
|
+
return new Set(nodes.map(node => this.getFlatNodeIdentifier(node)));
|
|
626
|
+
}
|
|
627
|
+
getSelectedFlatNodes() {
|
|
628
|
+
return this.selection.selected;
|
|
629
|
+
}
|
|
630
|
+
getParentNode(node) {
|
|
631
|
+
const currentLevel = this.getLevel(node);
|
|
632
|
+
if (currentLevel < 1) {
|
|
633
|
+
return null;
|
|
634
|
+
}
|
|
635
|
+
const startIndex = this.treeControl.dataNodes.indexOf(node) - 1;
|
|
636
|
+
for (let i = startIndex; i >= 0; i--) {
|
|
637
|
+
const currentNode = this.treeControl.dataNodes[i];
|
|
638
|
+
if (this.getLevel(currentNode) === currentLevel - 1) {
|
|
639
|
+
return currentNode;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
return null;
|
|
643
|
+
}
|
|
644
|
+
reloadData(clearSelectedItems = true) {
|
|
645
|
+
if (clearSelectedItems) {
|
|
646
|
+
this.clearSelection();
|
|
647
|
+
}
|
|
648
|
+
let queryArgs;
|
|
649
|
+
if (this.pageable) {
|
|
650
|
+
queryArgs = {
|
|
651
|
+
offset: this.currentPage * this.queryRows,
|
|
652
|
+
length: this.queryRows
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
this.queryData(void 0, queryArgs);
|
|
656
|
+
}
|
|
657
|
+
getLogicalLevel(node) {
|
|
658
|
+
const hasFakeRoot = this.hasFakeRoot();
|
|
659
|
+
return hasFakeRoot ? node.level - 1 : node.level;
|
|
660
|
+
}
|
|
661
|
+
hasFakeRoot() {
|
|
662
|
+
return !!this.rootTitle;
|
|
663
|
+
}
|
|
664
|
+
childQueryData(flatNode) {
|
|
665
|
+
return this.daoTree.queryNodeChildren(flatNode, this.recursive);
|
|
666
|
+
}
|
|
471
667
|
}
|
|
472
668
|
OTreeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTreeComponent, deps: [{ token: i0.Injector }, { token: i0.ElementRef }, { token: forwardRef(() => OFormComponent), optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
473
669
|
OTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OTreeComponent, selector: "o-tree", inputs: { oattr: ["attr", "oattr"], service: "service", entity: "entity", columns: "columns", keys: "keys", parentKeys: ["parent-keys", "parentKeys"], queryMethod: ["query-method", "queryMethod"], insertButton: ["insert-button", "insertButton"], refreshButton: ["refresh-button", "refreshButton"], deleteButton: ["delete-button", "deleteButton"], visibleColumns: ["visible-columns", "visibleColumns"], selectAllCheckbox: ["select-all-checkbox", "selectAllCheckbox"], separator: "separator", parentColumn: ["parent-column", "parentColumn"], sortColumn: ["sort-column", "sortColumn"], selectAllCheckboxVisible: ["select-all-checkbox-visible", "selectAllCheckboxVisible"], filterCaseSensitive: ["filter-case-sensitive", "filterCaseSensitive"], quickFilter: ["quick-filter", "quickFilter"], quickFilterPlaceholder: ["quick-filter-placeholder", "quickFilterPlaceholder"], quickFilterColumns: ["quick-filter-columns", "quickFilterColumns"], detailMode: ["detail-mode", "detailMode"], detailFormRoute: ["detail-form-route", "detailFormRoute"], showButtonsText: ["show-buttons-text", "showButtonsText"], rootTitle: ["root-title", "rootTitle"], recursive: "recursive", route: "route" }, outputs: { onNodeSelected: "onNodeSelected", onNodeExpanded: "onNodeExpanded", onNodeCollapsed: "onNodeCollapsed", onLoadNextLevel: "onLoadNextLevel", onDataLoaded: "onDataLoaded", onNodeClick: "onNodeClick" }, host: { properties: { "class.o-tree": "true" } }, providers: [
|
|
474
670
|
OTreeDao,
|
|
475
|
-
OntimizeServiceProvider
|
|
476
|
-
], queries: [{ propertyName: "leafNodeTemplate", first: true, predicate: ["leafNodeTemplate"], descendants: true, read: TemplateRef }, { propertyName: "parentNodeTemplate", first: true, predicate: ["parentNodeTemplate"], descendants: true, read: TemplateRef }, { propertyName: "nodeTemplate", first: true, predicate: ["nodeTemplate"], descendants: true, read: TemplateRef }, { propertyName: "treeNode", first: true, predicate: i0.forwardRef(function () { return OTreeNodeComponent; }) }], usesInheritance: true, ngImport: i0, template: "<div fxLayout=\"column\" fxFlex>\n\n <div *ngIf=\"hasControls()\" fxLayout=\"row\" fxLayoutAlign=\"start center\">\n\n <div class=\"buttons\">\n <ng-container *ngIf=\"showButtonsText;else showButtonsWithoutText\">\n\n <button *ngIf=\"insertButton\" type=\"button\" mat-stroked-button aria-label=\"Insert\" [disabled]=\"!enabledInsertButton\" (click)=\"add($event)\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n <span>{{ 'INSERT' | oTranslate }}</span>\n </button>\n\n <button *ngIf=\"refreshButton\" type=\"button\" mat-stroked-button aria-label=\"Refresh\" [disabled]=\"!enabledRefreshButton\" (click)=\"reloadData()\">\n <mat-icon svgIcon=\"ontimize:autorenew\"></mat-icon>\n <span>{{ 'REFRESH' | oTranslate }}</span>\n </button>\n\n <button *ngIf=\"deleteButton\" type=\"button\" mat-stroked-button aria-label=\"Delete\" [disabled]=\"!enabledDeleteButton\"\n [class.disabled]=\"!enabledDeleteButton\">\n <mat-icon svgIcon=\"ontimize:delete\"></mat-icon>\n <span>{{ 'DELETE' | oTranslate }}</span>\n </button>\n\n </ng-container>\n\n <ng-template #showButtonsWithoutText>\n <button *ngIf=\"insertButton\" type=\"button\" mat-icon-button aria-label=\"Insert\" [disabled]=\"!enabledInsertButton\" (click)=\"add($event)\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n </button>\n\n <button *ngIf=\"refreshButton\" type=\"button\" mat-icon-button aria-label=\"Refresh\" [disabled]=\"!enabledRefreshButton\" (click)=\"reloadData()\">\n <mat-icon svgIcon=\"ontimize:autorenew\"></mat-icon>\n </button>\n\n <button *ngIf=\"deleteButton\" type=\"button\" mat-icon-button aria-label=\"Delete\" [disabled]=\"!enabledDeleteButton\"\n [class.disabled]=\"!enabledDeleteButton\">\n <mat-icon svgIcon=\"ontimize:delete\"></mat-icon>\n </button>\n </ng-template>\n\n <ng-content select=\"[o-tree-button]\"></ng-content>\n </div>\n <div fxFlex>\n <span fxLayoutAlign=\"center center\" class=\"title\">{{ title | oTranslate }}</span>\n </div>\n <o-search-input *ngIf=\"quickFilter\" [filter-case-sensitive]=\"filterCaseSensitive\" [show-case-sensitive-checkbox]=\"showCaseSensitiveCheckbox()\"\n [columns]=\"quickFilterColumns\" [placeholder]=\"quickFilterPlaceholder\" appearance=\"outline\" float-label=\"never\" show-menu=\"no\">\n </o-search-input>\n <button type=\"button\" *ngIf=\"showTreeMenuButton\" mat-icon-button class=\"o-tree-menu-button\" [matMenuTriggerFor]=\"treeMenu.matMenu\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon svgIcon=\"ontimize:more_vert\"></mat-icon>\n </button>\n <o-tree-menu #treeMenu [select-all-checkbox]=\"selectAllCheckbox\" [select-all-checkbox-visible]=\"selectAllCheckboxVisible\"\n (onSelectCheckboxChange)=\"onSelectCheckboxChange($event)\"></o-tree-menu>\n\n </div>\n\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node\" (click)=\"leafNodeClicked($event, node)\" matTreeNodeToggle matTreeNodePadding\n [ngClass]=\"{'selected-node': isSelectedNode(node)}\">\n <!-- use a disabled button to provide padding for tree leaf -->\n <button mat-icon-button disabled></button>\n\n <ng-container *ngIf=\"selectAllCheckboxVisible; else simpleLeafNodeTpl\">\n <div class=\"node-wrapper\">\n <mat-checkbox *ngIf=\"selectAllCheckboxVisible; else simpleLeafNodeTpl\" [checked]=\"checklistSelection.isSelected(node)\"\n (click)=\"checkboxClicked($event)\" (change)=\"todoLeafItemSelectionToggle(node)\">\n </mat-checkbox>\n <ng-container [ngTemplateOutlet]=\"leafNodeFulltemplate\" [ngTemplateOutletContext]=\"{$implicit:node}\">\n </ng-container>\n </div>\n </ng-container>\n <ng-template #simpleLeafNodeTpl>\n <ng-container [ngTemplateOutlet]=\"leafNodeFulltemplate\" [ngTemplateOutletContext]=\"{$implicit:node}\">\n </ng-container>\n </ng-template>\n\n </mat-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" (click)=\"parentNodeClicked($event, node)\" matTreeNodePadding\n [ngClass]=\"{'selected-node': isSelectedNode(node)}\">\n <button mat-icon-button [attr.aria-label]=\"'toggle ' + node.label\" matTreeNodeToggle (click)=\"onClickToggleButton($event, node)\">\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}\n </mat-icon>\n </button>\n\n <ng-container *ngIf=\"selectAllCheckboxVisible; else simpleParentNodeTpl\">\n <div class=\"node-wrapper\">\n <mat-checkbox *ngIf=\"selectAllCheckboxVisible; else simpleParentNodeTpl\" (click)=\"checkboxClicked($event)\"\n (change)=\"todoItemSelectionToggle(node)\" [checked]=\"descendantsAllSelected(node)\" [indeterminate]=\"descendantsPartiallySelected(node)\">\n </mat-checkbox>\n <ng-container [ngTemplateOutlet]=\"parentNodeFulltemplate\" [ngTemplateOutletContext]=\"{$implicit:node}\">\n </ng-container>\n </div>\n </ng-container>\n\n <ng-template #simpleParentNodeTpl>\n <ng-container [ngTemplateOutlet]=\"parentNodeFulltemplate\" [ngTemplateOutletContext]=\"{$implicit:node}\">\n </ng-container>\n </ng-template>\n </mat-tree-node>\n </mat-tree>\n</div>\n\n<ng-template let-node #leafNodeFulltemplate>\n <ng-container *ngIf=\"leafNodeTemplate; else defaultLeafNodeTpl\" [ngTemplateOutlet]=\"leafNodeTemplate\"\n [ngTemplateOutletContext]=\"{$implicit:node.data}\">\n </ng-container>\n\n <ng-template #defaultLeafNodeTpl>\n {{node.label}}\n </ng-template>\n</ng-template>\n\n<ng-template let-node #parentNodeFulltemplate>\n <ng-container *ngIf=\"parentNodeTemplate; else defaultParentNodeTpl\" [ngTemplateOutlet]=\"parentNodeTemplate\"\n [ngTemplateOutletContext]=\"{$implicit:node.data}\">\n </ng-container>\n\n <ng-template #defaultParentNodeTpl>\n <span>{{node.label}}</span>\n <mat-progress-bar *ngIf=\"node.isLoading\" mode=\"indeterminate\" fxFlex></mat-progress-bar>\n </ng-template>\n</ng-template>\n", styles: [".o-tree .mat-mdc-progress-bar{margin-left:30px}.o-tree .node-wrapper{align-items:center}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.OSearchInputComponent, selector: "o-search-input", inputs: ["placeholder", "label", "width", "float-label", "appearance", "columns", "filter-case-sensitive", "show-case-sensitive-checkbox", "show-menu"], outputs: ["onSearch"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i9.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i10.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i10.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i10.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i10.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i10.MatTreeNode, selector: "mat-tree-node", inputs: ["role", "disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { kind: "component", type: i11.OTreeMenuComponent, selector: "o-tree-menu", inputs: ["select-all-checkbox", "select-all-checkbox-visible"], outputs: ["onSelectCheckboxChange"] }, { kind: "pipe", type: i12.OTranslatePipe, name: "oTranslate" }], encapsulation: i0.ViewEncapsulation.None });
|
|
671
|
+
OntimizeServiceProvider,
|
|
672
|
+
ComponentStateServiceProvider,
|
|
673
|
+
{ provide: O_COMPONENT_STATE_SERVICE, useClass: OTreeComponentStateService },
|
|
674
|
+
], queries: [{ propertyName: "leafNodeTemplate", first: true, predicate: ["leafNodeTemplate"], descendants: true, read: TemplateRef }, { propertyName: "parentNodeTemplate", first: true, predicate: ["parentNodeTemplate"], descendants: true, read: TemplateRef }, { propertyName: "nodeTemplate", first: true, predicate: ["nodeTemplate"], descendants: true, read: TemplateRef }, { propertyName: "treeNode", first: true, predicate: i0.forwardRef(function () { return OTreeNodeComponent; }) }], viewQueries: [{ propertyName: "matpaginator", first: true, predicate: MatPaginator, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div fxLayout=\"column\" fxFlexFill>\n <div fxFlex>\n <div *ngIf=\"hasControls()\" fxLayout=\"row\" fxLayoutAlign=\"start center\">\n\n <div class=\"buttons\">\n <ng-container *ngIf=\"showButtonsText;else showButtonsWithoutText\">\n\n <button *ngIf=\"insertButton\" type=\"button\" mat-stroked-button aria-label=\"Insert\" [disabled]=\"!enabledInsertButton\" (click)=\"add($event)\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n <span>{{ 'INSERT' | oTranslate }}</span>\n </button>\n\n <button *ngIf=\"refreshButton\" type=\"button\" mat-stroked-button aria-label=\"Refresh\" [disabled]=\"!enabledRefreshButton\"\n (click)=\"reloadData()\">\n <mat-icon svgIcon=\"ontimize:autorenew\"></mat-icon>\n <span>{{ 'REFRESH' | oTranslate }}</span>\n </button>\n\n <button *ngIf=\"deleteButton\" type=\"button\" mat-stroked-button aria-label=\"Delete\" [disabled]=\"!enabledDeleteButton\"\n [class.disabled]=\"!enabledDeleteButton\">\n <mat-icon svgIcon=\"ontimize:delete\"></mat-icon>\n <span>{{ 'DELETE' | oTranslate }}</span>\n </button>\n\n </ng-container>\n\n <ng-template #showButtonsWithoutText>\n <button *ngIf=\"insertButton\" type=\"button\" mat-icon-button aria-label=\"Insert\" [disabled]=\"!enabledInsertButton\" (click)=\"add($event)\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n </button>\n\n <button *ngIf=\"refreshButton\" type=\"button\" mat-icon-button aria-label=\"Refresh\" [disabled]=\"!enabledRefreshButton\" (click)=\"reloadData()\">\n <mat-icon svgIcon=\"ontimize:autorenew\"></mat-icon>\n </button>\n\n <button *ngIf=\"deleteButton\" type=\"button\" mat-icon-button aria-label=\"Delete\" [disabled]=\"!enabledDeleteButton\"\n [class.disabled]=\"!enabledDeleteButton\">\n <mat-icon svgIcon=\"ontimize:delete\"></mat-icon>\n </button>\n </ng-template>\n\n <ng-content select=\"[o-tree-button]\"></ng-content>\n </div>\n <div fxFlex>\n <span fxLayoutAlign=\"center center\" class=\"title\">{{ title | oTranslate }}</span>\n </div>\n <o-search-input *ngIf=\"quickFilter\" [filter-case-sensitive]=\"filterCaseSensitive\" [show-case-sensitive-checkbox]=\"showCaseSensitiveCheckbox()\"\n [columns]=\"quickFilterColumns\" [placeholder]=\"quickFilterPlaceholder\" appearance=\"outline\" float-label=\"never\" show-menu=\"no\">\n </o-search-input>\n <button type=\"button\" *ngIf=\"showTreeMenuButton\" mat-icon-button class=\"o-tree-menu-button\" [matMenuTriggerFor]=\"treeMenu.matMenu\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon svgIcon=\"ontimize:more_vert\"></mat-icon>\n </button>\n <o-tree-menu #treeMenu [select-all-checkbox]=\"selectAllCheckbox\" [select-all-checkbox-visible]=\"selectAllCheckboxVisible\"\n (onSelectCheckboxChange)=\"onSelectCheckboxChange($event)\"></o-tree-menu>\n\n </div>\n\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node\" (click)=\"leafNodeClicked($event, node)\" matTreeNodeToggle matTreeNodePadding\n [ngClass]=\"{'selected-node': isSelectedNode(node)}\">\n <!-- use a disabled button to provide padding for tree leaf -->\n <div fxLayout=\"column\">\n <div fxLayout=\"row\">\n <button mat-icon-button disabled></button>\n\n <ng-container *ngIf=\"selectAllCheckboxVisible; else simpleLeafNodeTpl\">\n <div class=\"node-wrapper\">\n <mat-checkbox *ngIf=\"selectAllCheckboxVisible; else simpleLeafNodeTpl\" [checked]=\"selection.isSelected(node)\"\n (click)=\"checkboxClicked($event)\" (change)=\"todoLeafItemSelectionToggle(node)\" (keyDown)=\"checkboxClicked($event)\">\n </mat-checkbox>\n <ng-container [ngTemplateOutlet]=\"leafNodeFulltemplate\" [ngTemplateOutletContext]=\"{$implicit:node}\">\n </ng-container>\n </div>\n </ng-container>\n <ng-template #simpleLeafNodeTpl>\n <ng-container [ngTemplateOutlet]=\"leafNodeFulltemplate\" [ngTemplateOutletContext]=\"{$implicit:node}\">\n </ng-container>\n </ng-template>\n </div>\n <div *ngIf=\"isLastChildAndHasMore(node)\">\n <button #buttonLoadMore mat-button color=\"primary\" (click)=\"onLoadMore($event, node)\">\n {{ 'O_TREE.LOAD_MORE' | oTranslate}}\n </button>\n </div>\n </div>\n\n </mat-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" (click)=\"parentNodeClicked($event, node)\" matTreeNodePadding\n [ngClass]=\"{'selected-node': isSelectedNode(node)}\">\n <button mat-icon-button [attr.aria-label]=\"'toggle ' + node.label\" matTreeNodeToggle (click)=\"onClickToggleButton($event, node)\">\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}\n </mat-icon>\n </button>\n\n <ng-container *ngIf=\"selectAllCheckboxVisible; else simpleParentNodeTpl\">\n <div class=\"node-wrapper\">\n <mat-checkbox *ngIf=\"selectAllCheckboxVisible; else simpleParentNodeTpl\" (click)=\"checkboxClicked($event)\"\n (change)=\"todoItemSelectionToggle(node)\" [checked]=\"descendantsAllSelected(node)\" [indeterminate]=\"descendantsPartiallySelected(node)\">\n </mat-checkbox>\n <ng-container [ngTemplateOutlet]=\"parentNodeFulltemplate\" [ngTemplateOutletContext]=\"{$implicit:node}\">\n </ng-container>\n </div>\n </ng-container>\n\n <ng-template #simpleParentNodeTpl>\n <ng-container [ngTemplateOutlet]=\"parentNodeFulltemplate\" [ngTemplateOutletContext]=\"{$implicit:node}\">\n </ng-container>\n </ng-template>\n </mat-tree-node>\n\n\n </mat-tree>\n </div>\n\n <!-- mat pagination-->\n <mat-paginator *ngIf=\"paginationControls && pageable\" #matpaginator [length]=\"dataSource?.resultsLength\" [pageSize]=\"queryRows\"\n [pageSizeOptions]=\"pageSizeOptions\" [pageIndex]=\"currentPage\" [showFirstLastButtons]=\"true\" (page)=\"onChangePage($event)\"\n [ngStyle]=\"{'visibility': (loading | async) === false ? 'visible':'hidden'}\"></mat-paginator>\n\n\n</div>\n\n<ng-template let-node #leafNodeFulltemplate>\n <ng-container *ngIf=\"leafNodeTemplate; else defaultLeafNodeTpl\" [ngTemplateOutlet]=\"leafNodeTemplate\"\n [ngTemplateOutletContext]=\"{$implicit:node.data}\">\n </ng-container>\n\n <ng-template #defaultLeafNodeTpl>\n {{node.label}}\n </ng-template>\n</ng-template>\n\n<ng-template let-node #parentNodeFulltemplate>\n <ng-container *ngIf=\"parentNodeTemplate; else defaultParentNodeTpl\" [ngTemplateOutlet]=\"parentNodeTemplate\"\n [ngTemplateOutletContext]=\"{$implicit:node.data}\">\n </ng-container>\n\n <ng-template #defaultParentNodeTpl>\n <span>{{node.label}}</span>\n <mat-progress-bar *ngIf=\"node.isLoading\" mode=\"indeterminate\" fxFlex></mat-progress-bar>\n </ng-template>\n</ng-template>\n", styles: [".o-tree .mat-mdc-progress-bar{margin-left:30px}.o-tree .node-wrapper{align-items:center}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.OSearchInputComponent, selector: "o-search-input", inputs: ["placeholder", "label", "width", "float-label", "appearance", "columns", "filter-case-sensitive", "show-case-sensitive-checkbox", "show-menu"], outputs: ["onSearch"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.FlexFillDirective, selector: "[fxFill], [fxFlexFill]" }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i4.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i9.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i10.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i11.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i11.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i11.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i11.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i11.MatTreeNode, selector: "mat-tree-node", inputs: ["role", "disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { kind: "component", type: i12.OTreeMenuComponent, selector: "o-tree-menu", inputs: ["select-all-checkbox", "select-all-checkbox-visible"], outputs: ["onSelectCheckboxChange"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i13.OTranslatePipe, name: "oTranslate" }], encapsulation: i0.ViewEncapsulation.None });
|
|
477
675
|
__decorate([
|
|
478
676
|
BooleanInputConverter(),
|
|
479
677
|
__metadata("design:type", Boolean)
|
|
@@ -504,9 +702,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
504
702
|
'[class.o-tree]': 'true'
|
|
505
703
|
}, providers: [
|
|
506
704
|
OTreeDao,
|
|
507
|
-
OntimizeServiceProvider
|
|
508
|
-
|
|
509
|
-
|
|
705
|
+
OntimizeServiceProvider,
|
|
706
|
+
ComponentStateServiceProvider,
|
|
707
|
+
{ provide: O_COMPONENT_STATE_SERVICE, useClass: OTreeComponentStateService },
|
|
708
|
+
], template: "<div fxLayout=\"column\" fxFlexFill>\n <div fxFlex>\n <div *ngIf=\"hasControls()\" fxLayout=\"row\" fxLayoutAlign=\"start center\">\n\n <div class=\"buttons\">\n <ng-container *ngIf=\"showButtonsText;else showButtonsWithoutText\">\n\n <button *ngIf=\"insertButton\" type=\"button\" mat-stroked-button aria-label=\"Insert\" [disabled]=\"!enabledInsertButton\" (click)=\"add($event)\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n <span>{{ 'INSERT' | oTranslate }}</span>\n </button>\n\n <button *ngIf=\"refreshButton\" type=\"button\" mat-stroked-button aria-label=\"Refresh\" [disabled]=\"!enabledRefreshButton\"\n (click)=\"reloadData()\">\n <mat-icon svgIcon=\"ontimize:autorenew\"></mat-icon>\n <span>{{ 'REFRESH' | oTranslate }}</span>\n </button>\n\n <button *ngIf=\"deleteButton\" type=\"button\" mat-stroked-button aria-label=\"Delete\" [disabled]=\"!enabledDeleteButton\"\n [class.disabled]=\"!enabledDeleteButton\">\n <mat-icon svgIcon=\"ontimize:delete\"></mat-icon>\n <span>{{ 'DELETE' | oTranslate }}</span>\n </button>\n\n </ng-container>\n\n <ng-template #showButtonsWithoutText>\n <button *ngIf=\"insertButton\" type=\"button\" mat-icon-button aria-label=\"Insert\" [disabled]=\"!enabledInsertButton\" (click)=\"add($event)\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n </button>\n\n <button *ngIf=\"refreshButton\" type=\"button\" mat-icon-button aria-label=\"Refresh\" [disabled]=\"!enabledRefreshButton\" (click)=\"reloadData()\">\n <mat-icon svgIcon=\"ontimize:autorenew\"></mat-icon>\n </button>\n\n <button *ngIf=\"deleteButton\" type=\"button\" mat-icon-button aria-label=\"Delete\" [disabled]=\"!enabledDeleteButton\"\n [class.disabled]=\"!enabledDeleteButton\">\n <mat-icon svgIcon=\"ontimize:delete\"></mat-icon>\n </button>\n </ng-template>\n\n <ng-content select=\"[o-tree-button]\"></ng-content>\n </div>\n <div fxFlex>\n <span fxLayoutAlign=\"center center\" class=\"title\">{{ title | oTranslate }}</span>\n </div>\n <o-search-input *ngIf=\"quickFilter\" [filter-case-sensitive]=\"filterCaseSensitive\" [show-case-sensitive-checkbox]=\"showCaseSensitiveCheckbox()\"\n [columns]=\"quickFilterColumns\" [placeholder]=\"quickFilterPlaceholder\" appearance=\"outline\" float-label=\"never\" show-menu=\"no\">\n </o-search-input>\n <button type=\"button\" *ngIf=\"showTreeMenuButton\" mat-icon-button class=\"o-tree-menu-button\" [matMenuTriggerFor]=\"treeMenu.matMenu\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon svgIcon=\"ontimize:more_vert\"></mat-icon>\n </button>\n <o-tree-menu #treeMenu [select-all-checkbox]=\"selectAllCheckbox\" [select-all-checkbox-visible]=\"selectAllCheckboxVisible\"\n (onSelectCheckboxChange)=\"onSelectCheckboxChange($event)\"></o-tree-menu>\n\n </div>\n\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node\" (click)=\"leafNodeClicked($event, node)\" matTreeNodeToggle matTreeNodePadding\n [ngClass]=\"{'selected-node': isSelectedNode(node)}\">\n <!-- use a disabled button to provide padding for tree leaf -->\n <div fxLayout=\"column\">\n <div fxLayout=\"row\">\n <button mat-icon-button disabled></button>\n\n <ng-container *ngIf=\"selectAllCheckboxVisible; else simpleLeafNodeTpl\">\n <div class=\"node-wrapper\">\n <mat-checkbox *ngIf=\"selectAllCheckboxVisible; else simpleLeafNodeTpl\" [checked]=\"selection.isSelected(node)\"\n (click)=\"checkboxClicked($event)\" (change)=\"todoLeafItemSelectionToggle(node)\" (keyDown)=\"checkboxClicked($event)\">\n </mat-checkbox>\n <ng-container [ngTemplateOutlet]=\"leafNodeFulltemplate\" [ngTemplateOutletContext]=\"{$implicit:node}\">\n </ng-container>\n </div>\n </ng-container>\n <ng-template #simpleLeafNodeTpl>\n <ng-container [ngTemplateOutlet]=\"leafNodeFulltemplate\" [ngTemplateOutletContext]=\"{$implicit:node}\">\n </ng-container>\n </ng-template>\n </div>\n <div *ngIf=\"isLastChildAndHasMore(node)\">\n <button #buttonLoadMore mat-button color=\"primary\" (click)=\"onLoadMore($event, node)\">\n {{ 'O_TREE.LOAD_MORE' | oTranslate}}\n </button>\n </div>\n </div>\n\n </mat-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" (click)=\"parentNodeClicked($event, node)\" matTreeNodePadding\n [ngClass]=\"{'selected-node': isSelectedNode(node)}\">\n <button mat-icon-button [attr.aria-label]=\"'toggle ' + node.label\" matTreeNodeToggle (click)=\"onClickToggleButton($event, node)\">\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}\n </mat-icon>\n </button>\n\n <ng-container *ngIf=\"selectAllCheckboxVisible; else simpleParentNodeTpl\">\n <div class=\"node-wrapper\">\n <mat-checkbox *ngIf=\"selectAllCheckboxVisible; else simpleParentNodeTpl\" (click)=\"checkboxClicked($event)\"\n (change)=\"todoItemSelectionToggle(node)\" [checked]=\"descendantsAllSelected(node)\" [indeterminate]=\"descendantsPartiallySelected(node)\">\n </mat-checkbox>\n <ng-container [ngTemplateOutlet]=\"parentNodeFulltemplate\" [ngTemplateOutletContext]=\"{$implicit:node}\">\n </ng-container>\n </div>\n </ng-container>\n\n <ng-template #simpleParentNodeTpl>\n <ng-container [ngTemplateOutlet]=\"parentNodeFulltemplate\" [ngTemplateOutletContext]=\"{$implicit:node}\">\n </ng-container>\n </ng-template>\n </mat-tree-node>\n\n\n </mat-tree>\n </div>\n\n <!-- mat pagination-->\n <mat-paginator *ngIf=\"paginationControls && pageable\" #matpaginator [length]=\"dataSource?.resultsLength\" [pageSize]=\"queryRows\"\n [pageSizeOptions]=\"pageSizeOptions\" [pageIndex]=\"currentPage\" [showFirstLastButtons]=\"true\" (page)=\"onChangePage($event)\"\n [ngStyle]=\"{'visibility': (loading | async) === false ? 'visible':'hidden'}\"></mat-paginator>\n\n\n</div>\n\n<ng-template let-node #leafNodeFulltemplate>\n <ng-container *ngIf=\"leafNodeTemplate; else defaultLeafNodeTpl\" [ngTemplateOutlet]=\"leafNodeTemplate\"\n [ngTemplateOutletContext]=\"{$implicit:node.data}\">\n </ng-container>\n\n <ng-template #defaultLeafNodeTpl>\n {{node.label}}\n </ng-template>\n</ng-template>\n\n<ng-template let-node #parentNodeFulltemplate>\n <ng-container *ngIf=\"parentNodeTemplate; else defaultParentNodeTpl\" [ngTemplateOutlet]=\"parentNodeTemplate\"\n [ngTemplateOutletContext]=\"{$implicit:node.data}\">\n </ng-container>\n\n <ng-template #defaultParentNodeTpl>\n <span>{{node.label}}</span>\n <mat-progress-bar *ngIf=\"node.isLoading\" mode=\"indeterminate\" fxFlex></mat-progress-bar>\n </ng-template>\n</ng-template>\n", styles: [".o-tree .mat-mdc-progress-bar{margin-left:30px}.o-tree .node-wrapper{align-items:center}\n"] }]
|
|
709
|
+
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ElementRef }, { type: i14.OFormComponent, decorators: [{
|
|
510
710
|
type: Optional
|
|
511
711
|
}, {
|
|
512
712
|
type: Inject,
|
|
@@ -517,6 +717,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
517
717
|
}], parentNodeTemplate: [{
|
|
518
718
|
type: ContentChild,
|
|
519
719
|
args: ['parentNodeTemplate', { read: TemplateRef, static: false }]
|
|
720
|
+
}], matpaginator: [{
|
|
721
|
+
type: ViewChild,
|
|
722
|
+
args: [MatPaginator]
|
|
520
723
|
}], nodeTemplate: [{
|
|
521
724
|
type: ContentChild,
|
|
522
725
|
args: ['nodeTemplate', { read: TemplateRef, static: false }]
|
|
@@ -524,4 +727,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
524
727
|
type: ContentChild,
|
|
525
728
|
args: [forwardRef(() => OTreeNodeComponent), { descendants: false }]
|
|
526
729
|
}] } });
|
|
527
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RyZWUvby10cmVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RyZWUvby10cmVlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBR1IsUUFBUSxFQUNSLFdBQVcsRUFDWCxpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUtuRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVB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Qzs0Q0FuRXRELGFBQWEsTUFFYixZQUFZLE1BRVosZUFBZSxNQU9mLHdCQUF3QixNQUV4QixpQkFBaUIsTUFFakIsU0FBUyxNQXFCVCxnQkFBZ0I7c0JBRGYsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJdEUsa0JBQWtCO3NCQURqQixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQU9wRSxZQUFZO3NCQURmLFlBQVk7dUJBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQVNsRSxRQUFRO3NCQURQLFlBQVk7dUJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgRmxhdFRyZWVDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RyZWUnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQm9vbGVhbklucHV0Q29udmVydGVyIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9pbnB1dC1jb252ZXJ0ZXInO1xuaW1wb3J0IHsgU2VydmljZVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zZXJ2aWNlLXJlc3BvbnNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPbnRpbWl6ZVNlcnZpY2VQcm92aWRlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBPVHJlZUNvbXBvbmVudFN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0YXRlL28tdHJlZS1jb21wb25lbnQtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBPUGVybWlzc2lvbnMgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBPVHJlZVBlcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby10cmVlLXBlcm1pc3Npb25zLnR5cGUnO1xuaW1wb3J0IHsgT1RyZWVGbGF0Tm9kZSB9IGZyb20gJy4uLy4uL3R5cGVzL3RyZWUtZmxhdC1ub2RlLnR5cGUnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuLi8uLi91dGlsL2NvZGVzJztcbmltcG9ydCB7IEZpbHRlckV4cHJlc3Npb25VdGlscyB9IGZyb20gJy4uLy4uL3V0aWwvZmlsdGVyLWV4cHJlc3Npb24udXRpbHMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vby1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBYnN0cmFjdE9TZXJ2aWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vby1zZXJ2aWNlLWNvbXBvbmVudC5jbGFzcyc7XG5pbXBvcnQgeyBPVHJlZURhbyB9IGZyb20gJy4vby10cmVlLWRhby5zZXJ2aWNlJztcbmltcG9ydCB7IE9UcmVlRGF0YVNvdXJjZSB9IGZyb20gJy4vby10cmVlLmRhdGFzb3VyY2UnO1xuaW1wb3J0IHsgT1RyZWVOb2RlQ29tcG9uZW50IH0gZnJvbSAnLi90cmVlLW5vZGUvdHJlZS1ub2RlLmNvbXBvbmVudCc7XG5cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5QVVRTX09fVFJFRSA9IFtcbiAgLy8gYXR0ciBbc3RyaW5nXTogbGlzdCBpZGVudGlmaWVyLiBJdCBpcyBtYW5kYXRvcnkgaWYgZGF0YSBhcmUgcHJvdmlkZWQgdGhyb3VnaCB0aGUgZGF0YSBhdHRyaWJ1dGUuIERlZmF1bHQ6IGVudGl0eSAoaWYgc2V0KS5cbiAgJ29hdHRyOiBhdHRyJyxcblxuICAvLyBzZXJ2aWNlIFtzdHJpbmddOiBKRUUgc2VydmljZSBwYXRoLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ3NlcnZpY2UnLFxuXG4gIC8vIGVudGl0eSBbc3RyaW5nXTogZW50aXR5IG9mIHRoZSBzZXJ2aWNlLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2VudGl0eScsXG5cbiAgLy8gY29sdW1ucyBbc3RyaW5nXTogY29sdW1ucyBvZiB0aGUgZW50aXR5LCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2NvbHVtbnMnLFxuXG4gIC8vIGtleXMgW3N0cmluZ106IGVudGl0eSBrZXlzLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2tleXMnLFxuXG4gIC8vIHBhcmVudC1rZXlzIFtzdHJpbmddOiBwYXJlbnQga2V5cyB0byBmaWx0ZXIsIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAncGFyZW50S2V5czogcGFyZW50LWtleXMnLFxuXG4gIC8vIHF1ZXJ5LW1ldGhvZCBbc3RyaW5nXTogbmFtZSBvZiB0aGUgc2VydmljZSBtZXRob2QgdG8gcGVyZm9ybSBxdWVyaWVzLiBEZWZhdWx0OiBxdWVyeS5cbiAgJ3F1ZXJ5TWV0aG9kOiBxdWVyeS1tZXRob2QnLFxuXG4gIC8vIGluc2VydC1idXR0b24gW25vfHllc106IHNob3cgaW5zZXJ0IGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAnaW5zZXJ0QnV0dG9uOiBpbnNlcnQtYnV0dG9uJyxcblxuICAvLyByZWZyZXNoLWJ1dHRvbiBbbm98eWVzXTogc2hvdyByZWZyZXNoIGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAncmVmcmVzaEJ1dHRvbjogcmVmcmVzaC1idXR0b24nLFxuXG4gIC8vIGRlbGV0ZS1idXR0b24gW25vfHllc106IHNob3cgZGVsZXRlIGJ1dHRvbiB3aGVuIHVzZXIgc2VsZWN0IGl0ZW1zLiBEZWZhdWx0OiB5ZXMuXG4gICdkZWxldGVCdXR0b246IGRlbGV0ZS1idXR0b24nLFxuXG4gIC8vIEVORCBPRiBERUZBVUxUX0lOUFVUU19PX1NFUlZJQ0VfQ09NUE9ORU5UXG4gICd2aXNpYmxlQ29sdW1uczogdmlzaWJsZS1jb2x1bW5zJyxcbiAgJ3NlbGVjdEFsbENoZWNrYm94OiBzZWxlY3QtYWxsLWNoZWNrYm94JyxcbiAgJ3NlcGFyYXRvcicsXG4gICdwYXJlbnRDb2x1bW46IHBhcmVudC1jb2x1bW4nLFxuICAnc29ydENvbHVtbjogc29ydC1jb2x1bW4nLFxuICAvLyBzZWxlY3QtYWxsLWNoZWNrYm94LXZpc2libGUgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBzZWxlY3Rpb24gY2hlY2sgYm94ZXMuRGVmYXVsdDogbm8uXG4gICdzZWxlY3RBbGxDaGVja2JveFZpc2libGU6IHNlbGVjdC1hbGwtY2hlY2tib3gtdmlzaWJsZScsXG4gIC8vIGZpbHRlciBbeWVzfG5vfHRydWV8ZmFsc2VdOiB3aGV0aGVyIGZpbHRlciBpcyBjYXNlIHNlbnNpdGl2ZS4gRGVmYXVsdDogbm8uXG4gICdmaWx0ZXJDYXNlU2Vuc2l0aXZlOiBmaWx0ZXItY2FzZS1zZW5zaXRpdmUnLFxuICAvLyBxdWljay1maWx0ZXIgW25vfHllc106IHNob3cgcXVpY2sgZmlsdGVyLiBEZWZhdWx0OiB5ZXMuXG4gICdxdWlja0ZpbHRlcjogcXVpY2stZmlsdGVyJyxcbiAgLy8gcXVpY2stZmlsdGVyLXBsYWNlaG9sZGVyOiBxdWljayBmaWx0ZXIgcGxhY2Vob2xkZXJcbiAgJ3F1aWNrRmlsdGVyUGxhY2Vob2xkZXI6IHF1aWNrLWZpbHRlci1wbGFjZWhvbGRlcicsXG4gIC8vIHF1aWNrLWZpbHRlci1jb2x1bW5zIFtzdHJpbmddOiBjb2x1bW5zIG9mIHRoZSBmaWx0ZXIsIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAncXVpY2tGaWx0ZXJDb2x1bW5zOiBxdWljay1maWx0ZXItY29sdW1ucycsXG4gIC8vIGRldGFpbC1tb2RlIFtub25lfGNsaWNrfGRvdWJsZWNsaWNrXTogd2F5IHRvIG9wZW4gdGhlIGRldGFpbCBmb3JtIG9mIGEgcm93LiBEZWZhdWx0OiAnY2xpY2snLlxuICAnZGV0YWlsTW9kZTogZGV0YWlsLW1vZGUnLFxuICAvLyBkZXRhaWwtZm9ybS1yb3V0ZSBbc3RyaW5nXTogcm91dGUgb2YgZGV0YWlsIGZvcm0uIERlZmF1bHQ6ICdkZXRhaWwnLlxuICAnZGV0YWlsRm9ybVJvdXRlOiBkZXRhaWwtZm9ybS1yb3V0ZScsXG4gIC8vIHNob3ctYnV0dG9ucy10ZXh0IFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgdGV4dCBvZiBoZWFkZXIgYnV0dG9ucy4gRGVmYXVsdDogeWVzLlxuICAnc2hvd0J1dHRvbnNUZXh0OiBzaG93LWJ1dHRvbnMtdGV4dCcsXG4gICdyb290VGl0bGU6IHJvb3QtdGl0bGUnLFxuICAncmVjdXJzaXZlJyxcbiAgJ3JvdXRlJ1xuXTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1VUUFVUU19PX1RSRUUgPSBbJ29uTm9kZVNlbGVjdGVkJywgJ29uTm9kZUV4cGFuZGVkJywgJ29uTm9kZUNvbGxhcHNlZCcsICdvbkxvYWROZXh0TGV2ZWwnLCAnb25EYXRhTG9hZGVkJywgJ29uTm9kZUNsaWNrJ107XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ28tdHJlZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9vLXRyZWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9vLXRyZWUuY29tcG9uZW50LnNjc3MnXSxcbiAgaW5wdXRzOiBERUZBVUxUX0lOUFVUU19PX1RSRUUsXG4gIG91dHB1dHM6IERFRkFVTFRfT1VUUFVUU19PX1RSRUUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLm8tdHJlZV0nOiAndHJ1ZSdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgT1RyZWVEYW8sXG4gICAgT250aW1pemVTZXJ2aWNlUHJvdmlkZXJcbiAgXVxufSlcblxuZXhwb3J0IGNsYXNzIE9UcmVlQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RPU2VydmljZUNvbXBvbmVudDxPVHJlZUNvbXBvbmVudFN0YXRlU2VydmljZT4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgZ2V0TGV2ZWwgPSAobm9kZTogT1RyZWVGbGF0Tm9kZSkgPT4gbm9kZS5sZXZlbDtcblxuICBpc0V4cGFuZGFibGUgPSAobm9kZTogT1RyZWVGbGF0Tm9kZSkgPT4gbm9kZS5leHBhbmRhYmxlO1xuXG4gIGdldENoaWxkcmVuID0gKG5vZGU6IE9UcmVlRmxhdE5vZGUpOiBhbnkgPT4ge1xuICAgIGlmICh0aGlzLnJlY3Vyc2l2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVjdXJzaXZlQ2hpbGRyZW5Ob2RlKG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRUcmVlTm9kZUNoaWxkcmVuKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIGdldFRyZWVOb2RlQ2hpbGRyZW4obm9kZTogT1RyZWVGbGF0Tm9kZSk6IGFueSB7XG4gICAgaWYgKG5vZGUubGV2ZWwgPT09IDAgJiYgVXRpbC5pc0RlZmluZWQodGhpcy5yb290VGl0bGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290Tm9kZXM7XG4gICAgfSBlbHNlIGlmIChub2RlLnRyZWVOb2RlKSB7XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQobm9kZS50cmVlTm9kZS5yb290VGl0bGUpICYmICFVdGlsLmlzRGVmaW5lZChub2RlLnJvb3ROb2RlKSkge1xuICAgICAgICBsZXQgcm9vdE5vZGU6IE9UcmVlRmxhdE5vZGUgPSB7XG4gICAgICAgICAgaWQ6IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCArIDEsIHJvb3ROb2RlOiB0cnVlLCBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChub2RlLnRyZWVOb2RlLnJvb3RUaXRsZSksIGxldmVsOiBub2RlLmxldmVsICsgMSwgZXhwYW5kYWJsZTogdHJ1ZSwgZGF0YTogbm9kZS5kYXRhLCBpc0xvYWRpbmc6IGZhbHNlLCB0cmVlTm9kZTogbm9kZS50cmVlTm9kZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRhb1RyZWUuZmxhdE5vZGVNYXAuc2V0KHJvb3ROb2RlLCBub2RlKTtcbiAgICAgICAgcmV0dXJuIFtyb290Tm9kZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbm9kZS50cmVlTm9kZS5jaGlsZFF1ZXJ5RGF0YShub2RlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZU5vZGVzLmZpbHRlcigoaXRlbSkgPT4gaXRlbVt0aGlzLnBhcmVudEtleXNdID09PSBub2RlW3RoaXMua2V5c10pO1xuICAgIH1cbiAgfVxuXG4gIGdldFJlY3Vyc2l2ZUNoaWxkcmVuTm9kZShub2RlOiBPVHJlZUZsYXROb2RlKTogYW55IHtcbiAgICBpZiAobm9kZS5sZXZlbCA9PT0gMCAmJiBVdGlsLmlzRGVmaW5lZCh0aGlzLnJvb3RUaXRsZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3ROb2RlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vZGUudHJlZU5vZGUuY2hpbGRRdWVyeURhdGEobm9kZSk7XG4gICAgfVxuXG4gIH1cbiAgZ2V0Q29tcG9uZW50RmlsdGVyKGV4aXN0aW5nRmlsdGVyOiBhbnkgPSB7fSk6IGFueSB7XG4gICAgbGV0IGZpbHRlciA9IGV4aXN0aW5nRmlsdGVyO1xuICAgIGlmICh0aGlzLnJlY3Vyc2l2ZSAmJiB0aGlzLnBhcmVudENvbHVtbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwYXJlbnRJdGVtRXhwciA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25Gcm9tT2JqZWN0KGZpbHRlcik7XG4gICAgICBjb25zdCBwYXJlbnROb3ROdWxsRXhwciA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25Jc051bGwodGhpcy5wYXJlbnRDb2x1bW4pO1xuICAgICAgY29uc3QgZmlsdGVyRXhwciA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZENvbXBsZXhFeHByZXNzaW9uKHBhcmVudEl0ZW1FeHByLCBwYXJlbnROb3ROdWxsRXhwciwgRmlsdGVyRXhwcmVzc2lvblV0aWxzLk9QX0FORCk7XG4gICAgICBmaWx0ZXIgPSB7fTtcbiAgICAgIGZpbHRlcltGaWx0ZXJFeHByZXNzaW9uVXRpbHMuRklMVEVSX0VYUFJFU1NJT05fS0VZXSA9IGZpbHRlckV4cHI7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5nZXRDb21wb25lbnRGaWx0ZXIoZmlsdGVyKTtcbiAgfVxuXG4gIGhhc0NoaWxkID0gKF86IG51bWJlciwgX25vZGVEYXRhOiBPVHJlZUZsYXROb2RlKSA9PiBfbm9kZURhdGEuZXhwYW5kYWJsZTtcblxuICBoYXNOb0NvbnRlbnQgPSAoXzogbnVtYmVyLCBfbm9kZURhdGE6IE9UcmVlRmxhdE5vZGUpID0+IF9ub2RlRGF0YS5sYWJlbCA9PT0gJyc7XG5cblxuICBkYXRhU291cmNlOiBPVHJlZURhdGFTb3VyY2U7XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHJlZnJlc2hCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgZGVsZXRlQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzaG93QnV0dG9uc1RleHQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICB2aXNpYmxlQ29sdW1uczogc3RyaW5nO1xuICBzZXBhcmF0b3I6IHN0cmluZyA9IENvZGVzLkhZUEhFTl9TRVBBUkFUT1I7XG4gIHBhcmVudENvbHVtbjogc3RyaW5nO1xuICBzb3J0Q29sdW1uOiBzdHJpbmc7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzZWxlY3RBbGxDaGVja2JveFZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHNlbGVjdEFsbENoZWNrYm94OiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICByZWN1cnNpdmU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgX3F1aWNrRmlsdGVyOiBib29sZWFuID0gZmFsc2U7XG4gIHBhZ2luYXRpb25Db250cm9scyA9IGZhbHNlO1xuICBxdWlja0ZpbHRlckNvbHVtbnM6IHN0cmluZztcbiAgc2VsZWN0ZWROb2RlOiBPVHJlZUZsYXROb2RlO1xuICBjaGlsZHJlTm9kZXM6IE9UcmVlRmxhdE5vZGVbXSA9IFtdO1xuICBub2Rlc0FycmF5OiBPVHJlZUZsYXROb2RlW10gPSBbXTtcbiAgYW5jZXN0b3JzOiBhbnlbXSA9IFtdO1xuICBjaGVja2xpc3RTZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8T1RyZWVGbGF0Tm9kZT4odHJ1ZSwgW10sIHRydWUsIChzbTEsIHNtMikgPT4gc20xLmlkID09PSBzbTIuaWQpO1xuXG4gIG9uTm9kZVNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgb25Ob2RlRXhwYW5kZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBvbk5vZGVDb2xsYXBzZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBvbkxvYWROZXh0TGV2ZWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBvbk5vZGVDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgcm9vdFRpdGxlOiBzdHJpbmc7XG4gIHJvb3ROb2RlczogT1RyZWVGbGF0Tm9kZVtdID0gW107XG4gIGRhb1RyZWU6IE9UcmVlRGFvO1xuXG4gIEBDb250ZW50Q2hpbGQoJ2xlYWZOb2RlVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gIGxlYWZOb2RlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZCgncGFyZW50Tm9kZVRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICBwYXJlbnROb2RlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgdHJlZUZsYXR0ZW5lcjogYW55O1xuICB0cmVlQ29udHJvbDogRmxhdFRyZWVDb250cm9sPE9UcmVlRmxhdE5vZGUsIE9UcmVlRmxhdE5vZGU+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ25vZGVUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IG5vZGVUZW1wbGF0ZSh2YWx1ZTogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmxlYWZOb2RlVGVtcGxhdGUgPSB2YWx1ZTtcbiAgICAgIHRoaXMucGFyZW50Tm9kZVRlbXBsYXRlID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgQENvbnRlbnRDaGlsZChmb3J3YXJkUmVmKCgpID0+IE9UcmVlTm9kZUNvbXBvbmVudCksIHsgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gIHRyZWVOb2RlITogT1RyZWVOb2RlQ29tcG9uZW50O1xuICBwcm90ZWN0ZWQgcGVybWlzc2lvbnM6IE9UcmVlUGVybWlzc2lvbnM7XG4gIHByb3RlY3RlZCBhY3Rpb25zUGVybWlzc2lvbnM6IE9QZXJtaXNzaW9uc1tdO1xuICBwcm90ZWN0ZWQgdmlzaWJsZUNvbHVtbnNBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIGVuYWJsZWREZWxldGVCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwdWJsaWMgcm91dGU6IHN0cmluZztcbiAgZ2V0IHNob3dUcmVlTWVudUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGF0aWNPcHQgPSB0aGlzLnNlbGVjdEFsbENoZWNrYm94O1xuICAgIHJldHVybiBzdGF0aWNPcHQ7XG4gIH1cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBlbFJlZjogRWxlbWVudFJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gT0Zvcm1Db21wb25lbnQpKSBmb3JtOiBPRm9ybUNvbXBvbmVudFxuICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgZWxSZWYsIGZvcm0pO1xuICAgIHRoaXMuZGFvVHJlZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE9UcmVlRGFvKVxuXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldFRyZWVDb250cm9sKCk7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5pbml0aWFsaXplUGFyYW1zKCk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLnNlbGVjdGlvbi5jaGFuZ2VkLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4gKHRoaXMuZW5hYmxlZERlbGV0ZUJ1dHRvbiA9ICF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLnBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UuZ2V0VHJlZVBlcm1pc3Npb25zKHRoaXMub2F0dHIsIHRoaXMuYWN0Um91dGUpO1xuICAgIHRoaXMuYWN0aW9uc1Blcm1pc3Npb25zID0gdGhpcy5nZXRBY3Rpb25zUGVybWlzc2lvbnModGhpcy5wZXJtaXNzaW9ucyk7XG4gICAgdGhpcy5zZXRCdXR0b25QZXJtaXNzaW9ucyh0aGlzLmFjdGlvbnNQZXJtaXNzaW9ucyk7XG4gIH1cblxuXG4gIHB1YmxpYyBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmluaXRpYWxpemVEYW8oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0aWFsaXplRGFvKCkge1xuXG4gICAgaWYgKHRoaXMuc3RhdGljRGF0YSkge1xuICAgICAgdGhpcy5xdWVyeU9uQmluZCA9IGZhbHNlO1xuICAgICAgdGhpcy5xdWVyeU9uSW5pdCA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXREYXRhQXJyYXkodGhpcy5zdGF0aWNEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWd1cmVTZXJ2aWNlKCk7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbGl6ZVBhcmFtcygpOiB2b2lkIHtcbiAgICAvLyBJZiB2aXNpYmxlLWNvbHVtbnMgaXMgbm90IHByZXNlbnQgdGhlbiB2aXNpYmxlLWNvbHVtbnMgaXMgYWxsIGNvbHVtbnNcbiAgICBpZiAoIXRoaXMudmlzaWJsZUNvbHVtbnMpIHtcbiAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG4gICAgfVxuXG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZCh0aGlzLnF1aWNrRmlsdGVyQ29sdW1ucykpIHtcbiAgICAgIHRoaXMucXVpY2tGaWx0ZXJDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1uc0FycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMudmlzaWJsZUNvbHVtbnMsIHRydWUpO1xuICAgIHRoaXMucXVpY2tGaWx0ZXJDb2xBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLnF1aWNrRmlsdGVyQ29sdW1ucywgdHJ1ZSk7XG4gICAgdGhpcy5zZXREYXRhc291cmNlKCk7XG4gICAgdGhpcy5hZnRlclZpZXdJbml0KCk7XG4gICAgaWYgKHRoaXMucXVlcnlPbkluaXQpIHtcbiAgICAgIHRoaXMucXVlcnlEYXRhKCk7XG4gICAgfVxuICAgIHRoaXMubWFuYWdlQ3VzdG9tUGVybWlzc2lvbnModGhpcy5hY3Rpb25zUGVybWlzc2lvbnMsICdbby10cmVlLWJ1dHRvbl0nKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICByZWdpc3RlclRyZWVOb2RlKG9UcmVlTm9kZTogT1RyZWVOb2RlQ29tcG9uZW50KSB7XG4gICAgLy8gdGhpcy5kYXRhU291cmNlLmRhdGEuZm9yRWFjaCgpXG4gIH1cblxuICBjaGVja2JveENsaWNrZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBsZWFmTm9kZUNsaWNrZWQoZXZlbnQ6IEV2ZW50LCBub2RlOiBPVHJlZUZsYXROb2RlKTogdm9pZCB7XG4gICAgdGhpcy5ub2RlQ2xpY2tlZChub2RlLCBldmVudCk7XG4gIH1cblxuICBwYXJlbnROb2RlQ2xpY2tlZChldmVudDogRXZlbnQsIG5vZGU6IE9UcmVlRmxhdE5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLm5vZGVDbGlja2VkKG5vZGUsIGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBub2RlQ2xpY2tlZChub2RlOiBPVHJlZUZsYXROb2RlLCBldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub25Ob2RlQ2xpY2suZW1pdChub2RlKTtcbiAgICB0aGlzLnNlbGVjdGVkTm9kZSA9IG5vZGU7XG4gICAgaWYgKHRoaXMuZGV0YWlsTW9kZSAhPT0gQ29kZXMuREVUQUlMX01PREVfTk9ORSAmJiAhdGhpcy5pc1Jvb3ROb2RlKG5vZGUpKSB7XG4gICAgICBub2RlLm5vZGUudmlld0RldGFpbChub2RlLmRhdGEsIHsgbGFiZWw6IG5vZGUubGFiZWwgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNSb290Tm9kZShub2RlOiBPVHJlZUZsYXROb2RlKSB7XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKG5vZGUucm9vdE5vZGUpICYmIG5vZGUucm9vdE5vZGU7XG4gIH1cblxuICBvbkNsaWNrVG9nZ2xlQnV0dG9uKGV2ZW50OiBFdmVudCwgbm9kZSkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkpIHtcbiAgICAgIHRoaXMub25Ob2RlRXhwYW5kZWQuZW1pdChub2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbk5vZGVDb2xsYXBzZWQuZW1pdChub2RlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICogVG9nZ2xlIHRoZSBub2RlLCByZW1vdmUgZnJvbSBkaXNwbGF5IGxpc3RcbiAgKi9cbiAgdG9nZ2xlTm9kZShub2RlOiBPVHJlZUZsYXROb2RlLCBleHBhbmQ6IGJvb2xlYW4pIHtcbiAgICBub2RlLmlzTG9hZGluZyA9IHRydWU7XG4gICAgaWYgKGV4cGFuZCAmJiBub2RlLmV4cGFuZGFibGUpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbihub2RlKTtcbiAgICAgIGlmIChVdGlsLmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS51cGRhdGVUcmVlKG5vZGUsIGNoaWxkcmVuLCBleHBhbmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVBc3luY1RyZWUoY2hpbGRyZW4sIG5vZGUsIGV4cGFuZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS51cGRhdGVUcmVlKG5vZGUsIFtdLCBleHBhbmQpO1xuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBc3luY1RyZWUoY2hpbGRyZW46IGFueSwgbm9kZTogT1RyZWVGbGF0Tm9kZSwgZXhwYW5kOiBib29sZWFuKSB7XG4gICAgY2hpbGRyZW4uc3Vic2NyaWJlKChyZXM6IFNlcnZpY2VSZXNwb25zZSkgPT4ge1xuICAgICAgbGV0IGRhdGE7XG4gICAgICBpZiAocmVzLmlzU3VjY2Vzc2Z1bCgpKSB7XG4gICAgICAgIGNvbnN0IGFyckRhdGEgPSAocmVzLmRhdGEgIT09IHVuZGVmaW5lZCkgPyByZXMuZGF0YSA6IFtdO1xuICAgICAgICBkYXRhID0gVXRpbC5pc0FycmF5KGFyckRhdGEpID8gYXJyRGF0YSA6IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhU291cmNlLnVwZGF0ZVRyZWUobm9kZSwgZGF0YSwgZXhwYW5kKTtcbiAgICB9LCBlcnIgPT4ge1xuICAgICAgbm9kZS5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnF1ZXJ5RmFsbGJhY2tGdW5jdGlvbikpIHtcbiAgICAgICAgdGhpcy5xdWVyeUZhbGxiYWNrRnVuY3Rpb24oZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub0Vycm9yRGlhbG9nTWFuYWdlci5vcGVuRXJyb3JEaWFsb2coZXJyKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cblxuICAvKiogVG9nZ2xlIGEgbGVhZiB0by1kbyBpdGVtIHNlbGVjdGlvbi4gQ2hlY2sgYWxsIHRoZSBwYXJlbnRzIHRvIHNlZSBpZiB0aGV5IGNoYW5nZWQgKi9cbiAgdG9kb0xlYWZJdGVtU2VsZWN0aW9uVG9nZ2xlKG5vZGU6IE9UcmVlRmxhdE5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnRvZG9JdGVtU2VsZWN0aW9uVG9nZ2xlKG5vZGUpO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSB0aGUgdG8tZG8gaXRlbSBzZWxlY3Rpb24uIFNlbGVjdC9kZXNlbGVjdCBhbGwgdGhlIGRlc2NlbmRhbnRzIG5vZGUgKi9cbiAgdG9kb0l0ZW1TZWxlY3Rpb25Ub2dnbGUobm9kZTogT1RyZWVGbGF0Tm9kZSk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnRvZ2dsZShub2RlKTtcblxuICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKTtcbiAgICB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpXG4gICAgICA/IHRoaXMuY2hlY2tsaXN0U2VsZWN0aW9uLnNlbGVjdCguLi5kZXNjZW5kYW50cylcbiAgICAgIDogdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uZGVzZWxlY3QoLi4uZGVzY2VuZGFudHMpO1xuXG4gICAgLy8gRm9yY2UgdXBkYXRlIGZvciB0aGUgcGFyZW50XG4gICAgZGVzY2VuZGFudHMuZXZlcnkoKGNoaWxkKSA9PiB0aGlzLmNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKGNoaWxkKSk7XG4gICAgdGhpcy5vbk5vZGVTZWxlY3RlZC5lbWl0KG5vZGUuZGF0YSk7XG5cblxuICB9XG5cblxuICAvKiogV2hldGhlciBhbGwgdGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBub2RlIGFyZSBzZWxlY3RlZC4gKi9cbiAgZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlOiBPVHJlZUZsYXROb2RlKTogYm9vbGVhbiB7XG4gICAgbGV0IGRlc2NBbGxTZWxlY3RlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKTtcbiAgICBpZiAobm9kZS5leHBhbmRhYmxlKSB7XG5cbiAgICAgIGlmICh0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgJiYgZGVzY2VuZGFudHMubGVuZ3RoID4gMCkge1xuICAgICAgICBkZXNjQWxsU2VsZWN0ZWQgPSBkZXNjZW5kYW50cy5ldmVyeSgoY2hpbGQpID0+XG4gICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChjaGlsZClcbiAgICAgICAgKTtcbiAgICAgICAgZGVzY0FsbFNlbGVjdGVkID8gdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0KG5vZGUpIDogdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uZGVzZWxlY3Qobm9kZSk7XG4gICAgICAgIHJldHVybiBkZXNjQWxsU2VsZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHBhcnQgb2YgdGhlIGRlc2NlbmRhbnRzIGFyZSBzZWxlY3RlZCAqL1xuICBkZXNjZW5kYW50c1BhcnRpYWxseVNlbGVjdGVkKG5vZGU6IE9UcmVlRmxhdE5vZGUpOiBib29sZWFuIHtcblxuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZUNvbnRyb2wuZ2V0RGVzY2VuZGFudHMobm9kZSk7XG4gICAgaWYgKG5vZGUuZXhwYW5kYWJsZSkge1xuICAgICAgaWYgKGRlc2NlbmRhbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gZGVzY2VuZGFudHMuc29tZSgoY2hpbGQpID0+XG4gICAgICAgICAgdGhpcy5jaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChjaGlsZClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdCAmJiAhdGhpcy5kZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGUpO1xuXG4gIH1cblxuXG4gIHByb3RlY3RlZCBzZXRUcmVlQ29udHJvbCgpIHtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHRoaXMudHJlZUNvbnRyb2wpKSB7XG4gICAgICB0aGlzLnRyZWVDb250cm9sID0gbmV3IEZsYXRUcmVlQ29udHJvbDxPVHJlZUZsYXROb2RlPih0aGlzLmdldExldmVsLCB0aGlzLmlzRXhwYW5kYWJsZSk7XG4gICAgfVxuICB9XG4gIC8qKiAqL1xuXG4gIHByb3RlY3RlZCBzZXREYXRhc291cmNlKCkge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5kYXRhU291cmNlKSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE9UcmVlRGF0YVNvdXJjZSh0aGlzLCB0aGlzLnRyZWVDb250cm9sLCB0aGlzLmluamVjdG9yKTtcbiAgICB9XG5cbiAgfVxuXG4gIGdldFBhcmVudE5vZGVzKG5vZGU6IE9UcmVlRmxhdE5vZGUsIGluZGV4OiBudW1iZXIsIHRyZWU6IE9UcmVlRmxhdE5vZGVbXSk6IE9UcmVlRmxhdE5vZGVbXSB7XG4gICAgbGV0IHBhcmVudE5vZGUgPSB0aGlzLmRhb1RyZWUuZmxhdE5vZGVNYXAuZ2V0KG5vZGUpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChwYXJlbnROb2RlKSkge1xuICAgICAgY29uc3QgZXhpc3RpbmdOb2RlID0gdHJlZS5maW5kSW5kZXgoeCA9PiB4WydpZCddID09PSBwYXJlbnROb2RlWydpZCddKSA+IC0xO1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKHBhcmVudE5vZGUpKSB7XG4gICAgICAgIGlmICghZXhpc3RpbmdOb2RlKSB7XG4gICAgICAgICAgLy9pZiBub3QgZXhpc3Qgbm9kZSBpbiB0cmVlIHRoZW4sIGFkZCBwYXJlbnQgYmVmb3JlIG5vZGVcbiAgICAgICAgICB0cmVlLnNwbGljZShpbmRleCwgMCwgcGFyZW50Tm9kZSlcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJlbnROb2RlcyhwYXJlbnROb2RlLCBpbmRleCwgdHJlZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy9pZiBub3QgZXhpc3Qgbm9kZSBpbiB0cmVlIHRoZW4sIGFkZCBwYXJlbnQgYmVmb3JlIG5vZGVcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJlbnROb2RlcyhwYXJlbnROb2RlLCBpbmRleCwgdHJlZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cmVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJlZTtcbiAgICB9XG4gIH1cblxuICBmaWx0ZXJEYXRhKHZhbHVlPzogc3RyaW5nLCBsb2FkTW9yZT86IGJvb2xlYW4pOiB2b2lkIHtcblxuICAgIGxldCBmaWx0ZXJlZFRyZWVEYXRhID0gW107XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBmb3IgKGxldCBbbmVzdGVkTm9kZV0gb2YgdGhpcy5kYW9UcmVlLmZsYXROb2RlTWFwKSB7XG4gICAgICAgIGlmIChuZXN0ZWROb2RlLmxhYmVsLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5kZXhPZih2YWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSA+IC0xKSB7XG4gICAgICAgICAgZmlsdGVyZWRUcmVlRGF0YS5wdXNoKG5lc3RlZE5vZGUpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgd2hpbGUgKGluZGV4IDwgZmlsdGVyZWRUcmVlRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBmaWx0ZXJlZFRyZWVEYXRhW2luZGV4XTtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZXMgPSB0aGlzLmdldFBhcmVudE5vZGVzKG5vZGUsIGluZGV4LCBmaWx0ZXJlZFRyZWVEYXRhKTtcbiAgICAgICAgaWYgKCFVdGlsLmlzQXJyYXlFbXB0eShwYXJlbnROb2RlcykpIHtcbiAgICAgICAgICBmaWx0ZXJlZFRyZWVEYXRhID0gcGFyZW50Tm9kZXM7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gZmlsdGVyZWRUcmVlRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsdGVyZWRUcmVlRGF0YSA9IHRoaXMuZGF0YVJlc3BvbnNlQXJyYXk7XG4gICAgICB0aGlzLnNldERhdGFBcnJheShmaWx0ZXJlZFRyZWVEYXRhKTtcbiAgICB9XG5cblxuICAgIC8vIE5vdGlmeSB0aGUgY2hhbmdlLlxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgbGV0IHJvb3ROb2RlcyA9IGZpbHRlcmVkVHJlZURhdGEuZmlsdGVyKG5vZGUgPT4gbm9kZS5sZXZlbCA9PSAwKTtcbiAgICAgIHRoaXMuZXhwYW5kTm9kZXNXaXRoTm9kZXMocm9vdE5vZGVzKTtcbiAgICB9XG5cbiAgfVxuICAvKipcbiAgICogRXhwYW5kcyBub2RlcyB3aXRoIG5vZGVzXG4gICAqIEBwYXJhbSB0cmVlRGF0YVxuICAgKi9cbiAgZXhwYW5kTm9kZXNXaXRoTm9kZXModHJlZURhdGE6IE9UcmVlRmxhdE5vZGVbXSkge1xuICAgIHRyZWVEYXRhLmZpbHRlcihub2RlID0+IG5vZGUuZXhwYW5kYWJsZSkuZm9yRWFjaChub2RlID0+IHtcbiAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKTtcbiAgICAgIGlmIChkZXNjZW5kYW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKG5vZGUpO1xuICAgICAgICB0aGlzLmV4cGFuZE5vZGVzV2l0aE5vZGVzKGRlc2NlbmRhbnRzKVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAgKiBHZXRzIGRhdGEgdHJlZVxuICAgICogQHJldHVybnNcbiAgICAqL1xuICBnZXREYXRhQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGFvVHJlZS5kYXRhO1xuICB9XG5cbiAgc2V0RGF0YUFycmF5KGRhdGE6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZGFvVHJlZS5mbGF0Tm9kZU1hcC5jbGVhcigpO1xuICAgIHRoaXMuZGFvVHJlZS5zZXREYXRhQXJyYXkoZGF0YSk7XG4gICAgaWYgKHRoaXMucmVjdXJzaXZlKSB7XG4gICAgICB0aGlzLmNoaWxkcmVOb2RlcyA9IGRhdGEuZmlsdGVyKFxuICAgICAgICAoaXRlbTogYW55KSA9PiBpdGVtW3RoaXMucGFyZW50Q29sdW1uXSAhPSBudWxsXG4gICAgICApO1xuICAgICAgdGhpcy5yb290Tm9kZXMgPSBkYXRhLmZpbHRlcihcbiAgICAgICAgKGl0ZW06IGFueSkgPT4gIVV0aWwuaXNEZWZpbmVkKGl0ZW1bdGhpcy5wYXJlbnRDb2x1bW5dKSB8fCBpdGVtW3RoaXMucGFyZW50Q29sdW1uXSA9PT0gbnVsbFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnJvb3ROb2RlcyA9IGRhdGE7XG5cbiAgICBsZXQgbGV2ZWwgPSAwO1xuICAgIGxldCByb290Tm9kZTogT1RyZWVGbGF0Tm9kZTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5yb290VGl0bGUpKSB7XG4gICAgICBsZXZlbCA9ICsxO1xuICAgICAgcm9vdE5vZGUgPSB7IGlkOiAwLCBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCh0aGlzLnJvb3RUaXRsZSksIHJvb3ROb2RlOiB0cnVlLCBsZXZlbDogMCwgZXhwYW5kYWJsZTogdHJ1ZSwgZGF0YToge30sIGlzTG9hZGluZzogZmFsc2UgfTtcbiAgICAgIHRoaXMuZGFvVHJlZS5mbGF0Tm9kZU1hcC5zZXQocm9vdE5vZGUsIG51bGwpO1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBbcm9vdE5vZGVdO1xuICAgICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmQocm9vdE5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMucm9vdE5vZGVzLm1hcChub2RlID0+IHRoaXMudHJhbnNmb3JtZXIobm9kZSwgbGV2ZWwpKTtcbiAgICB9XG5cbiAgfVxuXG4gIHRyYW5zZm9ybWVyID0gKG5vZGU6IGFueSwgbGV2ZWw6IG51bWJlciwgcGFyZW50Tm9kZT86IGFueSkgPT4ge1xuXG4gICAgY29uc3Qgbm9kZUNoaWxkcmVuID0gdGhpcy5jaGlsZHJlTm9kZXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtW3RoaXMucGFyZW50Q29sdW1uXSA9PT0gbm9kZVt0aGlzLmtleXNdKTtcbiAgICBjb25zdCBmbGF0Tm9kZTogT1RyZWVGbGF0Tm9kZSA9XG4gICAge1xuICAgICAgJ2lkJzogdGhpcy5nZXROb2RlSWQobm9kZSwgcGFyZW50Tm9kZSksXG4gICAgICAnbGFiZWwnOiB0aGlzLmdldEl0ZW1UZXh0KG5vZGUpLFxuICAgICAgJ2xldmVsJzogbGV2ZWwsXG4gICAgICAnbm9kZSc6IHRoaXMsXG4gICAgICB0cmVlTm9kZTogdGhpcy50cmVlTm9kZSxcbiAgICAgICdleHBhbmRhYmxlJzogVXRpbC5pc0RlZmluZWQodGhpcy50cmVlTm9kZSkgfHwgISFub2RlQ2hpbGRyZW4/Lmxlbmd0aCB8fCB0aGlzLnJlY3Vyc2l2ZSxcbiAgICAgICdkYXRhJzogbm9kZSxcbiAgICAgICdpc0xvYWRpbmcnOiBmYWxzZSxcbiAgICAgICdyb3V0ZSc6IHRoaXMucm91dGVcbiAgICB9O1xuXG4gICAgdGhpcy5kYW9UcmVlLmZsYXROb2RlTWFwLnNldChmbGF0Tm9kZSwgcGFyZW50Tm9kZSk7XG5cbiAgICAvL3JlY3Vyc2l2ZVxuICAgIG5vZGVDaGlsZHJlbi5mb3JFYWNoKG5vZGUgPT4gdGhpcy50cmFuc2Zvcm1lcihub2RlLCBsZXZlbCArIDEpKTtcbiAgICByZXR1cm4gZmxhdE5vZGU7XG5cblxuICB9XG5cbiAgb25TZWxlY3RDaGVja2JveENoYW5nZSh2aXNpYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZWxlY3RBbGxDaGVja2JveFZpc2libGUgPSB2aXNpYmxlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNvcnQoYXJyYXk6IE9UcmVlRmxhdE5vZGVbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNvcnRDb2x1bW4gIT0gbnVsbCkge1xuICAgICAgYXJyYXkuc29ydCgoYSwgYikgPT5cbiAgICAgICAgYS5kYXRhW3RoaXMuc29ydENvbHVtbl0ubG9jYWxlQ29tcGFyZShiLmRhdGFbdGhpcy5zb3J0Q29sdW1uXSlcbiAgICAgICk7XG4gICAgICBhcnJheVxuICAgICAgICAuZmlsdGVyKChub2RlKSA9PiAhIXRoaXMudHJlZUNvbnRyb2wuZ2V0RGVzY2VuZGFudHMobm9kZSkpXG4gICAgICAgIC5mb3JFYWNoKChub2RlKSA9PiB0aGlzLnNvcnQodGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKSkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRJdGVtVGV4dChpdGVtOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVDb2x1bW5zQXJyYXlcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gaXRlbVtjb2xdICE9IG51bGwgJiYgYCR7aXRlbVtjb2xdfWAubGVuZ3RoID4gMClcbiAgICAgIC5tYXAoKGNvbCkgPT4gaXRlbVtjb2xdKVxuICAgICAgLmpvaW4odGhpcy5zZXBhcmF0b3IpO1xuICB9XG5cbiAgZ2V0SXRlbUtleShpdGVtOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtleXNBcnJheS5tYXAoKGNvbCkgPT4gaXRlbVtjb2xdKS5qb2luKCc7Jyk7XG4gIH1cblxuXG4gIHByb3RlY3RlZCBmaWx0ZXJCeVF1aWNrRmlsdGVyQ29sdW1ucyhcbiAgICBpdGVtOiBhbnksXG4gICAgcXVpY2tmaWx0ZXI6IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBjYXNlU2Vuc2l0aXZlID0gdGhpcy5pc0ZpbHRlckNhc2VTZW5zaXRpdmUoKTtcbiAgICBjb25zdCByZWdFeHBTdHIgPSBuZXcgUmVnRXhwKFxuICAgICAgVXRpbC5lc2NhcGVTcGVjaWFsQ2hhcmFjdGVyKFxuICAgICAgICBVdGlsLm5vcm1hbGl6ZVN0cmluZyhxdWlja2ZpbHRlciwgIWNhc2VTZW5zaXRpdmUpXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRRdWlja0ZpbHRlckNvbHVtbnMoKS5zb21lKChjb2wpID0+XG4gICAgICByZWdFeHBTdHIudGVzdChVdGlsLm5vcm1hbGl6ZVN0cmluZyhpdGVtLmRhdGFbY29sXSArICcnLCAhY2FzZVNlbnNpdGl2ZSkpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGQoZT86IEV2ZW50KTogdm9pZCB7XG4gICAgc3VwZXIuaW5zZXJ0RGV0YWlsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Tm9kZUlkKGl0ZW06IGFueSwgcGFyZW50Tm9kZTogYW55KSB7XG4gICAgLyoqIHJldmlzYXJsbzppZ3VhbCBjb24gaWQgaW5jcmVtZW50YWwgZXJhIG1hcyBmYWNpbCBlIGlndWFsIGRlIGVmaWNpZW50ZSAqL1xuICAgIGxldCBpZCA9ICcnO1xuICAgIHRoaXMua2V5c0FycmF5LmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlkICs9IGl0ZW1ba2V5XTtcbiAgICB9KTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5wYXJlbnRLZXlzKSAmJiBVdGlsLmlzRGVmaW5lZChwYXJlbnROb2RlKSkge1xuICAgICAgaWQgKz0gcGFyZW50Tm9kZS5pZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5rZXlzICsgJzonICsgaWQ7XG4gIH1cblxuXG5cblxuICBwcm90ZWN0ZWQgbmF2aWdhdGVUb1ZpZXdEZXRhaWwobm9kZTogT1RyZWVGbGF0Tm9kZSkge1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChub2RlLnJvdXRlKSkge1xuICAgICAgbGV0IHJvdXRlID0gdW5kZWZpbmVkO1xuXG4gICAgICBsZXQgbm9kZVJvdXRlID0gbm9kZS5yb3V0ZTtcbiAgICAgIGxldCByb3V0ZUFycmF5ID0gbm9kZVJvdXRlLnNwbGl0KENvZGVzLlJPVVRFX1NFUEFSQVRPUik7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcm91dGVBcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAocm91dGVBcnJheVtpXS5zdGFydHNXaXRoKENvZGVzLlJPVVRFX1ZBUklBQkxFX0NIQVIpKSB7XG4gICAgICAgICAgcm91dGVBcnJheVtpXSA9IG5vZGUuZGF0YVtyb3V0ZUFycmF5W2ldLnN1YnN0cmluZygxKV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJvdXRlID0gcm91dGVBcnJheS5qb2luKENvZGVzLlJPVVRFX1NFUEFSQVRPUik7XG5cbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChyb3V0ZSkpIHtcbiAgICAgICAgY29uc3QgZXh0cmFzID0ge1xuICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMuYWN0Um91dGVcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3JvdXRlXSwgZXh0cmFzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc1NlbGVjdGVkTm9kZShub2RlOiBPVHJlZUZsYXROb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWROb2RlID09IG5vZGU7XG4gIH1cblxuICBwdWJsaWMgb25JdGVtRGV0YWlsQ2xpY2sobm9kZTogT1RyZWVGbGF0Tm9kZSk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlSXRlbUNsaWNrKG5vZGUuZGF0YSk7XG4gIH1cbn1cbiIsIjxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeEZsZXg+XG5cbiAgPGRpdiAqbmdJZj1cImhhc0NvbnRyb2xzKClcIiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJzdGFydCBjZW50ZXJcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0J1dHRvbnNUZXh0O2Vsc2Ugc2hvd0J1dHRvbnNXaXRob3V0VGV4dFwiPlxuXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJpbnNlcnRCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LXN0cm9rZWQtYnV0dG9uIGFyaWEtbGFiZWw9XCJJbnNlcnRcIiBbZGlzYWJsZWRdPVwiIWVuYWJsZWRJbnNlcnRCdXR0b25cIiAoY2xpY2spPVwiYWRkKCRldmVudClcIj5cbiAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOmFkZFwiPjwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4+e3sgJ0lOU0VSVCcgfCBvVHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwicmVmcmVzaEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBtYXQtc3Ryb2tlZC1idXR0b24gYXJpYS1sYWJlbD1cIlJlZnJlc2hcIiBbZGlzYWJsZWRdPVwiIWVuYWJsZWRSZWZyZXNoQnV0dG9uXCIgKGNsaWNrKT1cInJlbG9hZERhdGEoKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwib250aW1pemU6YXV0b3JlbmV3XCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICA8c3Bhbj57eyAnUkVGUkVTSCcgfCBvVHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZGVsZXRlQnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIG1hdC1zdHJva2VkLWJ1dHRvbiBhcmlhLWxhYmVsPVwiRGVsZXRlXCIgW2Rpc2FibGVkXT1cIiFlbmFibGVkRGVsZXRlQnV0dG9uXCJcbiAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIWVuYWJsZWREZWxldGVCdXR0b25cIj5cbiAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOmRlbGV0ZVwiPjwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4+e3sgJ0RFTEVURScgfCBvVHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd0J1dHRvbnNXaXRob3V0VGV4dD5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImluc2VydEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cIkluc2VydFwiIFtkaXNhYmxlZF09XCIhZW5hYmxlZEluc2VydEJ1dHRvblwiIChjbGljayk9XCJhZGQoJGV2ZW50KVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwib250aW1pemU6YWRkXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInJlZnJlc2hCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJSZWZyZXNoXCIgW2Rpc2FibGVkXT1cIiFlbmFibGVkUmVmcmVzaEJ1dHRvblwiIChjbGljayk9XCJyZWxvYWREYXRhKClcIj5cbiAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOmF1dG9yZW5ld1wiPjwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJkZWxldGVCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJEZWxldGVcIiBbZGlzYWJsZWRdPVwiIWVuYWJsZWREZWxldGVCdXR0b25cIlxuICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCIhZW5hYmxlZERlbGV0ZUJ1dHRvblwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwib250aW1pemU6ZGVsZXRlXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbby10cmVlLWJ1dHRvbl1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBmeEZsZXg+XG4gICAgICA8c3BhbiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiIGNsYXNzPVwidGl0bGVcIj57eyB0aXRsZSB8IG9UcmFuc2xhdGUgfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPG8tc2VhcmNoLWlucHV0ICpuZ0lmPVwicXVpY2tGaWx0ZXJcIiBbZmlsdGVyLWNhc2Utc2Vuc2l0aXZlXT1cImZpbHRlckNhc2VTZW5zaXRpdmVcIiBbc2hvdy1jYXNlLXNlbnNpdGl2ZS1jaGVja2JveF09XCJzaG93Q2FzZVNlbnNpdGl2ZUNoZWNrYm94KClcIlxuICAgICAgW2NvbHVtbnNdPVwicXVpY2tGaWx0ZXJDb2x1bW5zXCIgW3BsYWNlaG9sZGVyXT1cInF1aWNrRmlsdGVyUGxhY2Vob2xkZXJcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGZsb2F0LWxhYmVsPVwibmV2ZXJcIiBzaG93LW1lbnU9XCJub1wiPlxuICAgIDwvby1zZWFyY2gtaW5wdXQ+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJzaG93VHJlZU1lbnVCdXR0b25cIiBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJvLXRyZWUtbWVudS1idXR0b25cIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwidHJlZU1lbnUubWF0TWVudVwiXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOm1vcmVfdmVydFwiPjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPG8tdHJlZS1tZW51ICN0cmVlTWVudSBbc2VsZWN0LWFsbC1jaGVja2JveF09XCJzZWxlY3RBbGxDaGVja2JveFwiIFtzZWxlY3QtYWxsLWNoZWNrYm94LXZpc2libGVdPVwic2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlXCJcbiAgICAgIChvblNlbGVjdENoZWNrYm94Q2hhbmdlKT1cIm9uU2VsZWN0Q2hlY2tib3hDaGFuZ2UoJGV2ZW50KVwiPjwvby10cmVlLW1lbnU+XG5cbiAgPC9kaXY+XG5cbiAgPG1hdC10cmVlIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBbdHJlZUNvbnRyb2xdPVwidHJlZUNvbnRyb2xcIj5cblxuICAgIDwhLS0gVGhpcyBpcyB0aGUgdHJlZSBub2RlIHRlbXBsYXRlIGZvciBsZWFmIG5vZGVzIC0tPlxuICAgIDxtYXQtdHJlZS1ub2RlICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlXCIgKGNsaWNrKT1cImxlYWZOb2RlQ2xpY2tlZCgkZXZlbnQsIG5vZGUpXCIgbWF0VHJlZU5vZGVUb2dnbGUgbWF0VHJlZU5vZGVQYWRkaW5nXG4gICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkLW5vZGUnOiBpc1NlbGVjdGVkTm9kZShub2RlKX1cIj5cbiAgICAgIDwhLS0gdXNlIGEgZGlzYWJsZWQgYnV0dG9uIHRvIHByb3ZpZGUgcGFkZGluZyBmb3IgdHJlZSBsZWFmIC0tPlxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gZGlzYWJsZWQ+PC9idXR0b24+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RBbGxDaGVja2JveFZpc2libGU7IGVsc2Ugc2ltcGxlTGVhZk5vZGVUcGxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtd3JhcHBlclwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKm5nSWY9XCJzZWxlY3RBbGxDaGVja2JveFZpc2libGU7IGVsc2Ugc2ltcGxlTGVhZk5vZGVUcGxcIiBbY2hlY2tlZF09XCJjaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hlY2tib3hDbGlja2VkKCRldmVudClcIiAoY2hhbmdlKT1cInRvZG9MZWFmSXRlbVNlbGVjdGlvblRvZ2dsZShub2RlKVwiPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibGVhZk5vZGVGdWxsdGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDpub2RlfVwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNzaW1wbGVMZWFmTm9kZVRwbD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJsZWFmTm9kZUZ1bGx0ZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0Om5vZGV9XCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwvbWF0LXRyZWUtbm9kZT5cbiAgICA8IS0tIFRoaXMgaXMgdGhlIHRyZWUgbm9kZSB0ZW1wbGF0ZSBmb3IgZXhwYW5kYWJsZSBub2RlcyAtLT5cbiAgICA8bWF0LXRyZWUtbm9kZSAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZTsgd2hlbjogaGFzQ2hpbGRcIiAoY2xpY2spPVwicGFyZW50Tm9kZUNsaWNrZWQoJGV2ZW50LCBub2RlKVwiIG1hdFRyZWVOb2RlUGFkZGluZ1xuICAgICAgW25nQ2xhc3NdPVwieydzZWxlY3RlZC1ub2RlJzogaXNTZWxlY3RlZE5vZGUobm9kZSl9XCI+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbYXR0ci5hcmlhLWxhYmVsXT1cIid0b2dnbGUgJyArIG5vZGUubGFiZWxcIiBtYXRUcmVlTm9kZVRvZ2dsZSAoY2xpY2spPVwib25DbGlja1RvZ2dsZUJ1dHRvbigkZXZlbnQsIG5vZGUpXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uLXJ0bC1taXJyb3JcIj5cbiAgICAgICAgICB7e3RyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgPyAnZXhwYW5kX21vcmUnIDogJ2NoZXZyb25fcmlnaHQnfX1cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlOyBlbHNlIHNpbXBsZVBhcmVudE5vZGVUcGxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtd3JhcHBlclwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKm5nSWY9XCJzZWxlY3RBbGxDaGVja2JveFZpc2libGU7IGVsc2Ugc2ltcGxlUGFyZW50Tm9kZVRwbFwiIChjbGljayk9XCJjaGVja2JveENsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cInRvZG9JdGVtU2VsZWN0aW9uVG9nZ2xlKG5vZGUpXCIgW2NoZWNrZWRdPVwiZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlKVwiIFtpbmRldGVybWluYXRlXT1cImRlc2NlbmRhbnRzUGFydGlhbGx5U2VsZWN0ZWQobm9kZSlcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBhcmVudE5vZGVGdWxsdGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDpub2RlfVwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctdGVtcGxhdGUgI3NpbXBsZVBhcmVudE5vZGVUcGw+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicGFyZW50Tm9kZUZ1bGx0ZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0Om5vZGV9XCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L21hdC10cmVlLW5vZGU+XG4gIDwvbWF0LXRyZWU+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlIGxldC1ub2RlICNsZWFmTm9kZUZ1bGx0ZW1wbGF0ZT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxlYWZOb2RlVGVtcGxhdGU7IGVsc2UgZGVmYXVsdExlYWZOb2RlVHBsXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwibGVhZk5vZGVUZW1wbGF0ZVwiXG4gICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6bm9kZS5kYXRhfVwiPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctdGVtcGxhdGUgI2RlZmF1bHRMZWFmTm9kZVRwbD5cbiAgICB7e25vZGUubGFiZWx9fVxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIGxldC1ub2RlICNwYXJlbnROb2RlRnVsbHRlbXBsYXRlPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFyZW50Tm9kZVRlbXBsYXRlOyBlbHNlIGRlZmF1bHRQYXJlbnROb2RlVHBsXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwicGFyZW50Tm9kZVRlbXBsYXRlXCJcbiAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDpub2RlLmRhdGF9XCI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFBhcmVudE5vZGVUcGw+XG4gICAgPHNwYW4+e3tub2RlLmxhYmVsfX08L3NwYW4+XG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgKm5nSWY9XCJub2RlLmlzTG9hZGluZ1wiIG1vZGU9XCJpbmRldGVybWluYXRlXCIgZnhGbGV4PjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
730
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RyZWUvby10cmVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RyZWUvby10cmVlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBR1IsUUFBUSxFQUNSLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFaEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFekUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLHlCQUF5QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0gsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFHakcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHlCQUF5QixFQUFF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LHFCQUFxQixFQUFFOzt5REFDVztBQUNuQztJQUFDLHFCQUFxQixFQUFFOztpREFDRzs0RkF0SGhCLGNBQWM7a0JBbEIxQixTQUFTOytCQUNFLFFBQVEsVUFHVixxQkFBcUIsV0FDcEIsc0JBQXNCLGlCQUNoQixpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CO3dCQUNKLGdCQUFnQixFQUFFLE1BQU07cUJBQ3pCLGFBQ1U7d0JBQ1QsUUFBUTt3QkFDUix1QkFBdUI7d0JBQ3ZCLDZCQUE2Qjt3QkFDN0IsRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsUUFBUSxFQUFFLDBCQUEwQixFQUFFO3FCQUM3RTs7MEJBZ0xFLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQzs0Q0F0RXRELGFBQWEsTUFFYixZQUFZLE1BRVosZUFBZSxNQU9mLHdCQUF3QixNQUV4QixpQkFBaUIsTUFFakIsU0FBUyxNQW9CVCxnQkFBZ0I7c0JBRGYsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJdEUsa0JBQWtCO3NCQURqQixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQU0vQyxZQUFZO3NCQUFwQyxTQUFTO3VCQUFDLFlBQVk7Z0JBR25CLFlBQVk7c0JBRGYsWUFBWTt1QkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBU2xFLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBGbGF0VHJlZUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEJvb2xlYW5JbnB1dENvbnZlcnRlciB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvaW5wdXQtY29udmVydGVyJztcbmltcG9ydCB7IFNlcnZpY2VSZXNwb25zZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2VydmljZS1yZXNwb25zZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RhdGVTZXJ2aWNlUHJvdmlkZXIsIE9fQ09NUE9ORU5UX1NUQVRFX1NFUlZJQ0UsIE9udGltaXplU2VydmljZVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmFjdG9yaWVzJztcbmltcG9ydCB7IE9UcmVlQ29tcG9uZW50U3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RhdGUvby10cmVlLWNvbXBvbmVudC1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9UcmVlUGVybWlzc2lvbnMgfSBmcm9tICcuLi8uLi90eXBlcy9vLXRyZWUtcGVybWlzc2lvbnMudHlwZSc7XG5pbXBvcnQgeyBPVHJlZUZsYXROb2RlIH0gZnJvbSAnLi4vLi4vdHlwZXMvdHJlZS1mbGF0LW5vZGUudHlwZSc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uLy4uL3V0aWwvY29kZXMnO1xuaW1wb3J0IHsgRmlsdGVyRXhwcmVzc2lvblV0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbC9maWx0ZXItZXhwcmVzc2lvbi51dGlscyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IE9Gb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9vLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEFic3RyYWN0T1NlcnZpY2VDb21wb25lbnQgfSBmcm9tICcuLi9vLXNlcnZpY2UtY29tcG9uZW50LmNsYXNzJztcbmltcG9ydCB7IE9UcmVlRGFvIH0gZnJvbSAnLi9vLXRyZWUtZGFvLnNlcnZpY2UnO1xuaW1wb3J0IHsgT1RyZWVEYXRhU291cmNlIH0gZnJvbSAnLi9vLXRyZWUuZGF0YXNvdXJjZSc7XG5pbXBvcnQgeyBPVHJlZU5vZGVDb21wb25lbnQgfSBmcm9tICcuL3RyZWUtbm9kZS90cmVlLW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IFNlcnZpY2VVdGlscyB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgT1Blcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IFNRTE9yZGVyIH0gZnJvbSAnLi4vLi4vdHlwZXMvc3FsLW9yZGVyLnR5cGUnO1xuaW1wb3J0IHsgT1F1ZXJ5RGF0YUFyZ3MgfSBmcm9tICcuLi8uLi90eXBlcy9xdWVyeS1kYXRhLWFyZ3MudHlwZSc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgT1RyZWVDb21wb25lbnRTdGF0ZUNsYXNzIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RhdGUvby10cmVlLWNvbXBvbmVudC1zdGF0ZS5jbGFzcyc7XG5cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5QVVRTX09fVFJFRSA9IFtcbiAgLy8gYXR0ciBbc3RyaW5nXTogbGlzdCBpZGVudGlmaWVyLiBJdCBpcyBtYW5kYXRvcnkgaWYgZGF0YSBhcmUgcHJvdmlkZWQgdGhyb3VnaCB0aGUgZGF0YSBhdHRyaWJ1dGUuIERlZmF1bHQ6IGVudGl0eSAoaWYgc2V0KS5cbiAgJ29hdHRyOiBhdHRyJyxcblxuICAvLyBzZXJ2aWNlIFtzdHJpbmddOiBKRUUgc2VydmljZSBwYXRoLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ3NlcnZpY2UnLFxuXG4gIC8vIGVudGl0eSBbc3RyaW5nXTogZW50aXR5IG9mIHRoZSBzZXJ2aWNlLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2VudGl0eScsXG5cbiAgLy8gY29sdW1ucyBbc3RyaW5nXTogY29sdW1ucyBvZiB0aGUgZW50aXR5LCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2NvbHVtbnMnLFxuXG4gIC8vIGtleXMgW3N0cmluZ106IGVudGl0eSBrZXlzLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2tleXMnLFxuXG4gIC8vIHBhcmVudC1rZXlzIFtzdHJpbmddOiBwYXJlbnQga2V5cyB0byBmaWx0ZXIsIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAncGFyZW50S2V5czogcGFyZW50LWtleXMnLFxuXG4gIC8vIHF1ZXJ5LW1ldGhvZCBbc3RyaW5nXTogbmFtZSBvZiB0aGUgc2VydmljZSBtZXRob2QgdG8gcGVyZm9ybSBxdWVyaWVzLiBEZWZhdWx0OiBxdWVyeS5cbiAgJ3F1ZXJ5TWV0aG9kOiBxdWVyeS1tZXRob2QnLFxuXG4gIC8vIGluc2VydC1idXR0b24gW25vfHllc106IHNob3cgaW5zZXJ0IGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAnaW5zZXJ0QnV0dG9uOiBpbnNlcnQtYnV0dG9uJyxcblxuICAvLyByZWZyZXNoLWJ1dHRvbiBbbm98eWVzXTogc2hvdyByZWZyZXNoIGJ1dHRvbi4gRGVmYXVsdDogeWVzLlxuICAncmVmcmVzaEJ1dHRvbjogcmVmcmVzaC1idXR0b24nLFxuXG4gIC8vIGRlbGV0ZS1idXR0b24gW25vfHllc106IHNob3cgZGVsZXRlIGJ1dHRvbiB3aGVuIHVzZXIgc2VsZWN0IGl0ZW1zLiBEZWZhdWx0OiB5ZXMuXG4gICdkZWxldGVCdXR0b246IGRlbGV0ZS1idXR0b24nLFxuXG4gIC8vIEVORCBPRiBERUZBVUxUX0lOUFVUU19PX1NFUlZJQ0VfQ09NUE9ORU5UXG4gICd2aXNpYmxlQ29sdW1uczogdmlzaWJsZS1jb2x1bW5zJyxcbiAgJ3NlbGVjdEFsbENoZWNrYm94OiBzZWxlY3QtYWxsLWNoZWNrYm94JyxcbiAgJ3NlcGFyYXRvcicsXG4gICdwYXJlbnRDb2x1bW46IHBhcmVudC1jb2x1bW4nLFxuICAnc29ydENvbHVtbjogc29ydC1jb2x1bW4nLFxuICAvLyBzZWxlY3QtYWxsLWNoZWNrYm94LXZpc2libGUgW3llc3xub3x0cnVlfGZhbHNlXTogc2hvdyBzZWxlY3Rpb24gY2hlY2sgYm94ZXMuRGVmYXVsdDogbm8uXG4gICdzZWxlY3RBbGxDaGVja2JveFZpc2libGU6IHNlbGVjdC1hbGwtY2hlY2tib3gtdmlzaWJsZScsXG4gIC8vIGZpbHRlciBbeWVzfG5vfHRydWV8ZmFsc2VdOiB3aGV0aGVyIGZpbHRlciBpcyBjYXNlIHNlbnNpdGl2ZS4gRGVmYXVsdDogbm8uXG4gICdmaWx0ZXJDYXNlU2Vuc2l0aXZlOiBmaWx0ZXItY2FzZS1zZW5zaXRpdmUnLFxuICAvLyBxdWljay1maWx0ZXIgW25vfHllc106IHNob3cgcXVpY2sgZmlsdGVyLiBEZWZhdWx0OiB5ZXMuXG4gICdxdWlja0ZpbHRlcjogcXVpY2stZmlsdGVyJyxcbiAgLy8gcXVpY2stZmlsdGVyLXBsYWNlaG9sZGVyOiBxdWljayBmaWx0ZXIgcGxhY2Vob2xkZXJcbiAgJ3F1aWNrRmlsdGVyUGxhY2Vob2xkZXI6IHF1aWNrLWZpbHRlci1wbGFjZWhvbGRlcicsXG4gIC8vIHF1aWNrLWZpbHRlci1jb2x1bW5zIFtzdHJpbmddOiBjb2x1bW5zIG9mIHRoZSBmaWx0ZXIsIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAncXVpY2tGaWx0ZXJDb2x1bW5zOiBxdWljay1maWx0ZXItY29sdW1ucycsXG4gIC8vIGRldGFpbC1tb2RlIFtub25lfGNsaWNrfGRvdWJsZWNsaWNrXTogd2F5IHRvIG9wZW4gdGhlIGRldGFpbCBmb3JtIG9mIGEgcm93LiBEZWZhdWx0OiAnY2xpY2snLlxuICAnZGV0YWlsTW9kZTogZGV0YWlsLW1vZGUnLFxuICAvLyBkZXRhaWwtZm9ybS1yb3V0ZSBbc3RyaW5nXTogcm91dGUgb2YgZGV0YWlsIGZvcm0uIERlZmF1bHQ6ICdkZXRhaWwnLlxuICAnZGV0YWlsRm9ybVJvdXRlOiBkZXRhaWwtZm9ybS1yb3V0ZScsXG4gIC8vIHNob3ctYnV0dG9ucy10ZXh0IFt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgdGV4dCBvZiBoZWFkZXIgYnV0dG9ucy4gRGVmYXVsdDogeWVzLlxuICAnc2hvd0J1dHRvbnNUZXh0OiBzaG93LWJ1dHRvbnMtdGV4dCcsXG4gICdyb290VGl0bGU6IHJvb3QtdGl0bGUnLFxuICAncmVjdXJzaXZlJyxcbiAgJ3JvdXRlJ1xuXTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1VUUFVUU19PX1RSRUUgPSBbJ29uTm9kZVNlbGVjdGVkJywgJ29uTm9kZUV4cGFuZGVkJywgJ29uTm9kZUNvbGxhcHNlZCcsICdvbkxvYWROZXh0TGV2ZWwnLCAnb25EYXRhTG9hZGVkJywgJ29uTm9kZUNsaWNrJ107XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ28tdHJlZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9vLXRyZWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9vLXRyZWUuY29tcG9uZW50LnNjc3MnXSxcbiAgaW5wdXRzOiBERUZBVUxUX0lOUFVUU19PX1RSRUUsXG4gIG91dHB1dHM6IERFRkFVTFRfT1VUUFVUU19PX1RSRUUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLm8tdHJlZV0nOiAndHJ1ZSdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgT1RyZWVEYW8sXG4gICAgT250aW1pemVTZXJ2aWNlUHJvdmlkZXIsXG4gICAgQ29tcG9uZW50U3RhdGVTZXJ2aWNlUHJvdmlkZXIsXG4gICAgeyBwcm92aWRlOiBPX0NPTVBPTkVOVF9TVEFURV9TRVJWSUNFLCB1c2VDbGFzczogT1RyZWVDb21wb25lbnRTdGF0ZVNlcnZpY2UgfSxcbiAgXVxufSlcblxuZXhwb3J0IGNsYXNzIE9UcmVlQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RPU2VydmljZUNvbXBvbmVudDxPVHJlZUNvbXBvbmVudFN0YXRlU2VydmljZT4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgZ2V0TGV2ZWwgPSAobm9kZTogT1RyZWVGbGF0Tm9kZSkgPT4gbm9kZS5sZXZlbDtcblxuICBpc0V4cGFuZGFibGUgPSAobm9kZTogT1RyZWVGbGF0Tm9kZSkgPT4gbm9kZS5leHBhbmRhYmxlO1xuXG4gIGdldENoaWxkcmVuID0gKG5vZGU6IE9UcmVlRmxhdE5vZGUpOiBhbnkgPT4ge1xuICAgIGlmICh0aGlzLnJlY3Vyc2l2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVjdXJzaXZlQ2hpbGRyZW5Ob2RlKG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRUcmVlTm9kZUNoaWxkcmVuKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIGdldFRyZWVOb2RlQ2hpbGRyZW4obm9kZTogT1RyZWVGbGF0Tm9kZSk6IGFueSB7XG4gICAgaWYgKG5vZGUubGV2ZWwgPT09IDAgJiYgVXRpbC5pc0RlZmluZWQodGhpcy5yb290VGl0bGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290Tm9kZXM7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkTm9kZSkge1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG5vZGUuY2hpbGROb2RlLnJvb3RUaXRsZSkgJiYgIVV0aWwuaXNEZWZpbmVkKG5vZGUucm9vdE5vZGUpKSB7XG4gICAgICAgIGxldCByb290Tm9kZTogT1RyZWVGbGF0Tm9kZSA9IHtcbiAgICAgICAgICBpZDogdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoICsgMSwgcm9vdE5vZGU6IHRydWUsIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KG5vZGUuY2hpbGROb2RlLnJvb3RUaXRsZSksIGxldmVsOiBub2RlLmxldmVsICsgMSwgZXhwYW5kYWJsZTogdHJ1ZSwgZGF0YTogbm9kZS5kYXRhLCBpc0xvYWRpbmc6IGZhbHNlLCBub2RlOiBub2RlLmNoaWxkTm9kZSwgY2hpbGROb2RlOiBub2RlLmNoaWxkTm9kZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRhb1RyZWUuZmxhdE5vZGVNYXAuc2V0KHJvb3ROb2RlLCBub2RlKTtcbiAgICAgICAgcmV0dXJuIFtyb290Tm9kZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZFF1ZXJ5RGF0YShub2RlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZU5vZGVzLmZpbHRlcigoaXRlbSkgPT4gaXRlbVt0aGlzLnBhcmVudEtleXNdID09PSBub2RlW3RoaXMua2V5c10pO1xuICAgIH1cbiAgfVxuXG4gIGdldFJlY3Vyc2l2ZUNoaWxkcmVuTm9kZShub2RlOiBPVHJlZUZsYXROb2RlKTogYW55IHtcbiAgICBpZiAobm9kZS5sZXZlbCA9PT0gMCAmJiBVdGlsLmlzRGVmaW5lZCh0aGlzLnJvb3RUaXRsZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3ROb2RlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY2hpbGRRdWVyeURhdGEobm9kZSk7XG4gICAgfVxuXG4gIH1cbiAgZ2V0Q29tcG9uZW50RmlsdGVyKGV4aXN0aW5nRmlsdGVyOiBhbnkgPSB7fSk6IGFueSB7XG4gICAgbGV0IGZpbHRlciA9IGV4aXN0aW5nRmlsdGVyO1xuICAgIGlmICh0aGlzLnJlY3Vyc2l2ZSAmJiB0aGlzLnBhcmVudENvbHVtbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwYXJlbnRJdGVtRXhwciA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25Gcm9tT2JqZWN0KGZpbHRlcik7XG4gICAgICBjb25zdCBwYXJlbnROb3ROdWxsRXhwciA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25Jc051bGwodGhpcy5wYXJlbnRDb2x1bW4pO1xuICAgICAgY29uc3QgZmlsdGVyRXhwciA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZENvbXBsZXhFeHByZXNzaW9uKHBhcmVudEl0ZW1FeHByLCBwYXJlbnROb3ROdWxsRXhwciwgRmlsdGVyRXhwcmVzc2lvblV0aWxzLk9QX0FORCk7XG4gICAgICBmaWx0ZXIgPSB7fTtcbiAgICAgIGZpbHRlcltGaWx0ZXJFeHByZXNzaW9uVXRpbHMuRklMVEVSX0VYUFJFU1NJT05fS0VZXSA9IGZpbHRlckV4cHI7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5nZXRDb21wb25lbnRGaWx0ZXIoZmlsdGVyKTtcbiAgfVxuXG4gIGhhc0NoaWxkID0gKF86IG51bWJlciwgX25vZGVEYXRhOiBPVHJlZUZsYXROb2RlKSA9PiBfbm9kZURhdGEuZXhwYW5kYWJsZTtcblxuICBoYXNOb0NvbnRlbnQgPSAoXzogbnVtYmVyLCBfbm9kZURhdGE6IE9UcmVlRmxhdE5vZGUpID0+IF9ub2RlRGF0YS5sYWJlbCA9PT0gJyc7XG5cbiAgaGFzTG9hZE1vcmUgPSAobm9kZTogT1RyZWVGbGF0Tm9kZSkgPT4gdGhpcy5nZXRMb2dpY2FsTGV2ZWwobm9kZSkgPiAwICYmIHRoaXMudHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKSAmJiBub2RlLm5vZGUucGFnZWFibGU7XG5cbiAgb25Mb2FkTW9yZShldmVudDogRXZlbnQsIG5vZGU6IE9UcmVlRmxhdE5vZGUpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuZ2V0UGFyZW50Tm9kZShub2RlKTtcblxuICAgIGlmICghcGFyZW50Tm9kZSB8fCBwYXJlbnROb2RlLmlzTG9hZGluZykgcmV0dXJuO1xuXG4gICAgcGFyZW50Tm9kZS5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHBhcmVudE5vZGUub2Zmc2V0ID0gTWF0aC5taW4oXG4gICAgICAocGFyZW50Tm9kZS5vZmZzZXQgPz8gMCkgKyBwYXJlbnROb2RlLmNoaWxkTm9kZS5xdWVyeVJvd3MsXG4gICAgICBwYXJlbnROb2RlLnRvdGFsUXVlcnlSZWNvcmRzTnVtYmVyKTtcbiAgICBwYXJlbnROb2RlLmhhc01vcmUgPSBwYXJlbnROb2RlLm9mZnNldCArIHBhcmVudE5vZGUuY2hpbGROb2RlLnF1ZXJ5Um93cyA8IHBhcmVudE5vZGUudG90YWxRdWVyeVJlY29yZHNOdW1iZXI7XG5cbiAgICB0aGlzLmdldENoaWxkcmVuKHBhcmVudE5vZGUpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBTZXJ2aWNlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKHJlcy5pc1N1Y2Nlc3NmdWwoKSkge1xuICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSByZXMuZGF0YSB8fCBbXTtcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UudXBkYXRlVHJlZShwYXJlbnROb2RlLCBuZXdEYXRhLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5lcnJvcignRVJST1InLCAnTUVTU0FHRVMuRVJST1JfUVVFUlknKTtcbiAgICAgICAgcGFyZW50Tm9kZS5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlzTGFzdENoaWxkQW5kSGFzTW9yZShub2RlOiBPVHJlZUZsYXROb2RlKTogYm9vbGVhbiB7XG5cbiAgICBsZXQgcGFyZW50ID0gdGhpcy5kYW9UcmVlLmZsYXROb2RlTWFwLmdldChub2RlKTtcbiAgICBpZiAoIXBhcmVudD8uaGFzTW9yZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgc2libGluZ3MgPSB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKHBhcmVudClcbiAgICAgIC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQubGV2ZWwgPT09IG5vZGUubGV2ZWwpO1xuXG4gICAgaWYgKCFzaWJsaW5ncyB8fCBzaWJsaW5ncy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGxhc3RTaWJsaW5nID0gc2libGluZ3Nbc2libGluZ3MubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIG5vZGUuaWQgPT09IGxhc3RTaWJsaW5nLmlkO1xuICB9XG5cbiAgZGF0YVNvdXJjZTogT1RyZWVEYXRhU291cmNlO1xuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICByZWZyZXNoQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGRlbGV0ZUJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd0J1dHRvbnNUZXh0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgdmlzaWJsZUNvbHVtbnM6IHN0cmluZztcbiAgc2VwYXJhdG9yOiBzdHJpbmcgPSBDb2Rlcy5IWVBIRU5fU0VQQVJBVE9SO1xuICBwYXJlbnRDb2x1bW46IHN0cmluZztcbiAgc29ydENvbHVtbjogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBzZWxlY3RBbGxDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcmVjdXJzaXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIF9xdWlja0ZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBwYWdpbmF0aW9uQ29udHJvbHMgPSBmYWxzZTtcbiAgcXVpY2tGaWx0ZXJDb2x1bW5zOiBzdHJpbmc7XG4gIHNlbGVjdGVkTm9kZTogT1RyZWVGbGF0Tm9kZTtcbiAgY2hpbGRyZU5vZGVzOiBPVHJlZUZsYXROb2RlW10gPSBbXTtcbiAgbm9kZXNBcnJheTogT1RyZWVGbGF0Tm9kZVtdID0gW107XG4gIGFuY2VzdG9yczogYW55W10gPSBbXTtcblxuICBvbk5vZGVTZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIG9uTm9kZUV4cGFuZGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgb25Ob2RlQ29sbGFwc2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgb25Mb2FkTmV4dExldmVsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgb25Ob2RlQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIHJvb3RUaXRsZTogc3RyaW5nO1xuICByb290Tm9kZXM6IE9UcmVlRmxhdE5vZGVbXSA9IFtdO1xuICBkYW9UcmVlOiBPVHJlZURhbztcblxuICBAQ29udGVudENoaWxkKCdsZWFmTm9kZVRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICBsZWFmTm9kZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ3BhcmVudE5vZGVUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogZmFsc2UgfSlcbiAgcGFyZW50Tm9kZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIHRyZWVGbGF0dGVuZXI6IGFueTtcbiAgdHJlZUNvbnRyb2w6IEZsYXRUcmVlQ29udHJvbDxPVHJlZUZsYXROb2RlLCBPVHJlZUZsYXROb2RlPlxuXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKSBtYXRwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcblxuICBAQ29udGVudENoaWxkKCdub2RlVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gIHNldCBub2RlVGVtcGxhdGUodmFsdWU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5sZWFmTm9kZVRlbXBsYXRlID0gdmFsdWU7XG4gICAgICB0aGlzLnBhcmVudE5vZGVUZW1wbGF0ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIEBDb250ZW50Q2hpbGQoZm9yd2FyZFJlZigoKSA9PiBPVHJlZU5vZGVDb21wb25lbnQpLCB7IGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICB0cmVlTm9kZSE6IE9UcmVlTm9kZUNvbXBvbmVudDtcbiAgcHJvdGVjdGVkIHBlcm1pc3Npb25zOiBPVHJlZVBlcm1pc3Npb25zO1xuICBwcm90ZWN0ZWQgYWN0aW9uc1Blcm1pc3Npb25zOiBPUGVybWlzc2lvbnNbXTtcbiAgcHJvdGVjdGVkIHZpc2libGVDb2x1bW5zQXJyYXk6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBlbmFibGVkRGVsZXRlQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHVibGljIHJvdXRlOiBzdHJpbmc7XG4gIHB1YmxpYyBzb3J0Q29sdW1uQXJyYXk6IFNRTE9yZGVyW107XG5cbiAgZ2V0IHNob3dUcmVlTWVudUJ1dHRvbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGF0aWNPcHQgPSB0aGlzLnNlbGVjdEFsbENoZWNrYm94O1xuICAgIHJldHVybiBzdGF0aWNPcHQ7XG4gIH1cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBlbFJlZjogRWxlbWVudFJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gT0Zvcm1Db21wb25lbnQpKSBmb3JtOiBPRm9ybUNvbXBvbmVudFxuICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgZWxSZWYsIGZvcm0pO1xuICAgIHRoaXMuZGFvVHJlZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE9UcmVlRGFvKVxuXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldFRyZWVDb250cm9sKCk7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5pbml0aWFsaXplUGFyYW1zKCk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLnNlbGVjdGlvbi5jaGFuZ2VkLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4gKHRoaXMuZW5hYmxlZERlbGV0ZUJ1dHRvbiA9ICF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLnBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UuZ2V0VHJlZVBlcm1pc3Npb25zKHRoaXMub2F0dHIsIHRoaXMuYWN0Um91dGUpO1xuICAgIHRoaXMuYWN0aW9uc1Blcm1pc3Npb25zID0gdGhpcy5nZXRBY3Rpb25zUGVybWlzc2lvbnModGhpcy5wZXJtaXNzaW9ucyk7XG4gICAgdGhpcy5zZXRCdXR0b25QZXJtaXNzaW9ucyh0aGlzLmFjdGlvbnNQZXJtaXNzaW9ucyk7XG4gIH1cblxuXG4gIHB1YmxpYyBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmluaXRpYWxpemVEYW8oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0aWFsaXplRGFvKCkge1xuXG4gICAgaWYgKHRoaXMuc3RhdGljRGF0YSkge1xuICAgICAgdGhpcy5xdWVyeU9uQmluZCA9IGZhbHNlO1xuICAgICAgdGhpcy5xdWVyeU9uSW5pdCA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXREYXRhQXJyYXkodGhpcy5zdGF0aWNEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWd1cmVTZXJ2aWNlKCk7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbGl6ZVBhcmFtcygpOiB2b2lkIHtcbiAgICAvLyBJZiB2aXNpYmxlLWNvbHVtbnMgaXMgbm90IHByZXNlbnQgdGhlbiB2aXNpYmxlLWNvbHVtbnMgaXMgYWxsIGNvbHVtbnNcbiAgICBpZiAoIXRoaXMudmlzaWJsZUNvbHVtbnMpIHtcbiAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUpIHtcbiAgICAgIHRoaXMuc3RhdGUucXVlcnlSZWNvcmRPZmZzZXQgPSAwO1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMuc3RhdGUuY3VycmVudFBhZ2UgPz8gMDtcbiAgICB9XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZCh0aGlzLnF1aWNrRmlsdGVyQ29sdW1ucykpIHtcbiAgICAgIHRoaXMucXVpY2tGaWx0ZXJDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgICB9XG4gICAgdGhpcy5wYXJzZVNvcnRDb2x1bW4oKTtcbiAgfVxuXG4gIGdldCBzdGF0ZSgpOiBPVHJlZUNvbXBvbmVudFN0YXRlQ2xhc3Mge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFN0YXRlU2VydmljZS5zdGF0ZTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy52aXNpYmxlQ29sdW1ucywgdHJ1ZSk7XG4gICAgdGhpcy5xdWlja0ZpbHRlckNvbEFycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMucXVpY2tGaWx0ZXJDb2x1bW5zLCB0cnVlKTtcbiAgICB0aGlzLnNldERhdGFzb3VyY2UoKTtcbiAgICB0aGlzLmFmdGVyVmlld0luaXQoKTtcbiAgICB0aGlzLnJlZ2lzdGVyUXVpY2tGaWx0ZXIodGhpcy5zZWFyY2hJbnB1dENvbXBvbmVudCk7XG4gICAgaWYgKHRoaXMucXVlcnlPbkluaXQpIHtcbiAgICAgIHRoaXMucXVlcnlEYXRhKCk7XG4gICAgfVxuICAgIHRoaXMubWFuYWdlQ3VzdG9tUGVybWlzc2lvbnModGhpcy5hY3Rpb25zUGVybWlzc2lvbnMsICdbby10cmVlLWJ1dHRvbl0nKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICByZWdpc3RlclRyZWVOb2RlKG9UcmVlTm9kZTogT1RyZWVOb2RlQ29tcG9uZW50KSB7XG4gICAgLy8gdGhpcy5kYXRhU291cmNlLmRhdGEuZm9yRWFjaCgpXG4gIH1cblxuICBjaGVja2JveENsaWNrZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBsZWFmTm9kZUNsaWNrZWQoZXZlbnQ6IEV2ZW50LCBub2RlOiBPVHJlZUZsYXROb2RlKTogdm9pZCB7XG4gICAgdGhpcy5ub2RlQ2xpY2tlZChub2RlLCBldmVudCk7XG4gIH1cblxuICBwYXJlbnROb2RlQ2xpY2tlZChldmVudDogRXZlbnQsIG5vZGU6IE9UcmVlRmxhdE5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLm5vZGVDbGlja2VkKG5vZGUsIGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBub2RlQ2xpY2tlZChub2RlOiBPVHJlZUZsYXROb2RlLCBldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub25Ob2RlQ2xpY2suZW1pdChub2RlKTtcbiAgICB0aGlzLnNlbGVjdGVkTm9kZSA9IG5vZGU7XG4gICAgaWYgKHRoaXMuZGV0YWlsTW9kZSAhPT0gQ29kZXMuREVUQUlMX01PREVfTk9ORSAmJiAhdGhpcy5pc1Jvb3ROb2RlKG5vZGUpKSB7XG4gICAgICBub2RlLm5vZGUudmlld0RldGFpbChub2RlLmRhdGEsIHsgbGFiZWw6IG5vZGUubGFiZWwgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNSb290Tm9kZShub2RlOiBPVHJlZUZsYXROb2RlKSB7XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKG5vZGUucm9vdE5vZGUpICYmIG5vZGUucm9vdE5vZGU7XG4gIH1cblxuICBvbkNsaWNrVG9nZ2xlQnV0dG9uKGV2ZW50OiBFdmVudCwgbm9kZSkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkpIHtcbiAgICAgIHRoaXMub25Ob2RlRXhwYW5kZWQuZW1pdChub2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbk5vZGVDb2xsYXBzZWQuZW1pdChub2RlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICogVG9nZ2xlIHRoZSBub2RlLCByZW1vdmUgZnJvbSBkaXNwbGF5IGxpc3RcbiAgKi9cbiAgdG9nZ2xlTm9kZShub2RlOiBPVHJlZUZsYXROb2RlLCBleHBhbmQ6IGJvb2xlYW4pIHtcbiAgICBub2RlLmlzTG9hZGluZyA9IHRydWU7XG4gICAgaWYgKGV4cGFuZCAmJiBub2RlLmV4cGFuZGFibGUpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbihub2RlKTtcbiAgICAgIGlmIChVdGlsLmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS51cGRhdGVUcmVlKG5vZGUsIGNoaWxkcmVuLCBleHBhbmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVBc3luY1RyZWUoY2hpbGRyZW4sIG5vZGUsIGV4cGFuZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS51cGRhdGVUcmVlKG5vZGUsIFtdLCBleHBhbmQpO1xuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBc3luY1RyZWUoY2hpbGRyZW46IGFueSwgZmxhdE5vZGU6IE9UcmVlRmxhdE5vZGUsIGV4cGFuZDogYm9vbGVhbikge1xuICAgIGNoaWxkcmVuLnN1YnNjcmliZSgocmVzOiBTZXJ2aWNlUmVzcG9uc2UpID0+IHtcbiAgICAgIGxldCBkYXRhO1xuICAgICAgaWYgKHJlcy5pc1N1Y2Nlc3NmdWwoKSkge1xuICAgICAgICBjb25zdCBhcnJEYXRhID0gKHJlcy5kYXRhICE9PSB1bmRlZmluZWQpID8gcmVzLmRhdGEgOiBbXTtcbiAgICAgICAgZGF0YSA9IFV0aWwuaXNBcnJheShhcnJEYXRhKSA/IGFyckRhdGEgOiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMucmVjdXJzaXZlID8gZmxhdE5vZGUubm9kZSA6IGZsYXROb2RlLmNoaWxkTm9kZTtcbiAgICAgIGZsYXROb2RlLmhhc01vcmUgPSBmYWxzZTtcblxuICAgICAgZmxhdE5vZGUudG90YWxRdWVyeVJlY29yZHNOdW1iZXIgPSBub2RlLnBhZ2VhYmxlID8gcmVzLnRvdGFsUXVlcnlSZWNvcmRzTnVtYmVyIDogZGF0YS5sZW5ndGg7XG5cbiAgICAgIGNvbnN0IGNhbkxvYWRNb3JlID0gdGhpcy5oYXNMb2FkTW9yZShmbGF0Tm9kZSk7XG4gICAgICBmbGF0Tm9kZS5oYXNNb3JlID0gZmFsc2U7XG4gICAgICBpZiAoY2FuTG9hZE1vcmUpIHtcbiAgICAgICAgZmxhdE5vZGUuaGFzTW9yZSA9IFV0aWwuaXNEZWZpbmVkKHJlcy5zdGFydFJlY29yZEluZGV4KSA/IChub2RlLnF1ZXJ5Um93cyArIHJlcy5zdGFydFJlY29yZEluZGV4IDwgcmVzLnRvdGFsUXVlcnlSZWNvcmRzTnVtYmVyKSA6ICh0aGlzLnF1ZXJ5Um93cyA8IGRhdGEubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YVNvdXJjZS51cGRhdGVUcmVlKGZsYXROb2RlLCBkYXRhLCBleHBhbmQpO1xuICAgIH0sIGVyciA9PiB7XG4gICAgICBmbGF0Tm9kZS5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnF1ZXJ5RmFsbGJhY2tGdW5jdGlvbikpIHtcbiAgICAgICAgdGhpcy5xdWVyeUZhbGxiYWNrRnVuY3Rpb24oZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub0Vycm9yRGlhbG9nTWFuYWdlci5vcGVuRXJyb3JEaWFsb2coZXJyKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cblxuICAvKiogVG9nZ2xlIGEgbGVhZiB0by1kbyBpdGVtIHNlbGVjdGlvbi4gQ2hlY2sgYWxsIHRoZSBwYXJlbnRzIHRvIHNlZSBpZiB0aGV5IGNoYW5nZWQgKi9cbiAgdG9kb0xlYWZJdGVtU2VsZWN0aW9uVG9nZ2xlKG5vZGU6IE9UcmVlRmxhdE5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnRvZG9JdGVtU2VsZWN0aW9uVG9nZ2xlKG5vZGUpO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSB0aGUgdG8tZG8gaXRlbSBzZWxlY3Rpb24uIFNlbGVjdC9kZXNlbGVjdCBhbGwgdGhlIGRlc2NlbmRhbnRzIG5vZGUgKi9cbiAgdG9kb0l0ZW1TZWxlY3Rpb25Ub2dnbGUobm9kZTogT1RyZWVGbGF0Tm9kZSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uLnRvZ2dsZShub2RlKTtcblxuICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKTtcbiAgICB0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpXG4gICAgICA/IHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi5kZXNjZW5kYW50cylcbiAgICAgIDogdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3QoLi4uZGVzY2VuZGFudHMpO1xuXG4gICAgLy8gRm9yY2UgdXBkYXRlIGZvciB0aGUgcGFyZW50XG4gICAgZGVzY2VuZGFudHMuZXZlcnkoKGNoaWxkKSA9PiB0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKGNoaWxkKSk7XG4gICAgdGhpcy5vbk5vZGVTZWxlY3RlZC5lbWl0KG5vZGUuZGF0YSk7XG5cblxuICB9XG5cblxuICAvKiogV2hldGhlciBhbGwgdGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBub2RlIGFyZSBzZWxlY3RlZC4gKi9cbiAgZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlOiBPVHJlZUZsYXROb2RlKTogYm9vbGVhbiB7XG4gICAgbGV0IGRlc2NBbGxTZWxlY3RlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKTtcbiAgICBpZiAobm9kZS5leHBhbmRhYmxlKSB7XG5cbiAgICAgIGlmICh0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSkgJiYgZGVzY2VuZGFudHMubGVuZ3RoID4gMCkge1xuICAgICAgICBkZXNjQWxsU2VsZWN0ZWQgPSBkZXNjZW5kYW50cy5ldmVyeSgoY2hpbGQpID0+XG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZChjaGlsZClcbiAgICAgICAgKTtcbiAgICAgICAgZGVzY0FsbFNlbGVjdGVkID8gdGhpcy5zZWxlY3Rpb24uc2VsZWN0KG5vZGUpIDogdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3Qobm9kZSk7XG4gICAgICAgIHJldHVybiBkZXNjQWxsU2VsZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHBhcnQgb2YgdGhlIGRlc2NlbmRhbnRzIGFyZSBzZWxlY3RlZCAqL1xuICBkZXNjZW5kYW50c1BhcnRpYWxseVNlbGVjdGVkKG5vZGU6IE9UcmVlRmxhdE5vZGUpOiBib29sZWFuIHtcblxuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZUNvbnRyb2wuZ2V0RGVzY2VuZGFudHMobm9kZSk7XG4gICAgaWYgKG5vZGUuZXhwYW5kYWJsZSkge1xuICAgICAgaWYgKGRlc2NlbmRhbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gZGVzY2VuZGFudHMuc29tZSgoY2hpbGQpID0+XG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZChjaGlsZClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdCAmJiAhdGhpcy5kZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGUpO1xuXG4gIH1cblxuXG4gIHByb3RlY3RlZCBzZXRUcmVlQ29udHJvbCgpIHtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHRoaXMudHJlZUNvbnRyb2wpKSB7XG4gICAgICB0aGlzLnRyZWVDb250cm9sID0gbmV3IEZsYXRUcmVlQ29udHJvbDxPVHJlZUZsYXROb2RlPih0aGlzLmdldExldmVsLCB0aGlzLmlzRXhwYW5kYWJsZSk7XG4gICAgfVxuICB9XG4gIC8qKiAqL1xuXG4gIHByb3RlY3RlZCBzZXREYXRhc291cmNlKCkge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5kYXRhU291cmNlKSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE9UcmVlRGF0YVNvdXJjZSh0aGlzLCB0aGlzLnRyZWVDb250cm9sLCB0aGlzLmluamVjdG9yKTtcbiAgICB9XG5cbiAgfVxuXG4gIGdldFBhcmVudE5vZGVzKG5vZGU6IE9UcmVlRmxhdE5vZGUsIGluZGV4OiBudW1iZXIsIHRyZWU6IE9UcmVlRmxhdE5vZGVbXSk6IE9UcmVlRmxhdE5vZGVbXSB7XG4gICAgbGV0IHBhcmVudE5vZGUgPSB0aGlzLmRhb1RyZWUuZmxhdE5vZGVNYXAuZ2V0KG5vZGUpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChwYXJlbnROb2RlKSkge1xuICAgICAgY29uc3QgZXhpc3RpbmdOb2RlID0gdHJlZS5maW5kSW5kZXgoeCA9PiB4WydpZCddID09PSBwYXJlbnROb2RlWydpZCddKSA+IC0xO1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKHBhcmVudE5vZGUpKSB7XG4gICAgICAgIGlmICghZXhpc3RpbmdOb2RlKSB7XG4gICAgICAgICAgLy9pZiBub3QgZXhpc3Qgbm9kZSBpbiB0cmVlIHRoZW4sIGFkZCBwYXJlbnQgYmVmb3JlIG5vZGVcbiAgICAgICAgICB0cmVlLnNwbGljZShpbmRleCwgMCwgcGFyZW50Tm9kZSlcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJlbnROb2RlcyhwYXJlbnROb2RlLCBpbmRleCwgdHJlZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy9pZiBub3QgZXhpc3Qgbm9kZSBpbiB0cmVlIHRoZW4sIGFkZCBwYXJlbnQgYmVmb3JlIG5vZGVcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJlbnROb2RlcyhwYXJlbnROb2RlLCBpbmRleCwgdHJlZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cmVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJlZTtcbiAgICB9XG4gIH1cblxuICBmaWx0ZXJEYXRhKHZhbHVlPzogc3RyaW5nLCBsb2FkTW9yZT86IGJvb2xlYW4pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICBjb25zdCBxdWVyeUFyZ3M6IE9RdWVyeURhdGFBcmdzID0ge1xuICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgIGxlbmd0aDogdGhpcy5xdWVyeVJvd3MsXG4gICAgICAgIHJlcGxhY2U6IHRydWVcbiAgICAgIH07XG4gICAgICB0aGlzLnF1ZXJ5RGF0YSh2b2lkIDAsIHF1ZXJ5QXJncyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGZpbHRlcmVkVHJlZURhdGEgPSBbXTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGZvciAobGV0IFtuZXN0ZWROb2RlXSBvZiB0aGlzLmRhb1RyZWUuZmxhdE5vZGVNYXApIHtcbiAgICAgICAgaWYgKG5lc3RlZE5vZGUubGFiZWwudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmRleE9mKHZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgICAgICBmaWx0ZXJlZFRyZWVEYXRhLnB1c2gobmVzdGVkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICB3aGlsZSAoaW5kZXggPCBmaWx0ZXJlZFRyZWVEYXRhLmxlbmd0aCkge1xuICAgICAgICBsZXQgbm9kZSA9IGZpbHRlcmVkVHJlZURhdGFbaW5kZXhdO1xuICAgICAgICBjb25zdCBwYXJlbnROb2RlcyA9IHRoaXMuZ2V0UGFyZW50Tm9kZXMobm9kZSwgaW5kZXgsIGZpbHRlcmVkVHJlZURhdGEpO1xuICAgICAgICBpZiAoIVV0aWwuaXNBcnJheUVtcHR5KHBhcmVudE5vZGVzKSkge1xuICAgICAgICAgIGZpbHRlcmVkVHJlZURhdGEgPSBwYXJlbnROb2RlcztcbiAgICAgICAgfVxuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBmaWx0ZXJlZFRyZWVEYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWx0ZXJlZFRyZWVEYXRhID0gdGhpcy5kYXRhUmVzcG9uc2VBcnJheTtcbiAgICAgIHRoaXMuc2V0RGF0YUFycmF5KGZpbHRlcmVkVHJlZURhdGEpO1xuICAgIH1cblxuXG4gICAgLy8gTm90aWZ5IHRoZSBjaGFuZ2UuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBsZXQgcm9vdE5vZGVzID0gZmlsdGVyZWRUcmVlRGF0YS5maWx0ZXIobm9kZSA9PiBub2RlLmxldmVsID09IDApO1xuICAgICAgdGhpcy5leHBhbmROb2Rlc1dpdGhOb2Rlcyhyb290Tm9kZXMpO1xuICAgIH1cblxuICB9XG4gIC8qKlxuICAgKiBFeHBhbmRzIG5vZGVzIHdpdGggbm9kZXNcbiAgICogQHBhcmFtIHRyZWVEYXRhXG4gICAqL1xuICBleHBhbmROb2Rlc1dpdGhOb2Rlcyh0cmVlRGF0YTogT1RyZWVGbGF0Tm9kZVtdKSB7XG4gICAgdHJlZURhdGEuZmlsdGVyKG5vZGUgPT4gbm9kZS5leHBhbmRhYmxlKS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKG5vZGUpO1xuICAgICAgaWYgKGRlc2NlbmRhbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmQobm9kZSk7XG4gICAgICAgIHRoaXMuZXhwYW5kTm9kZXNXaXRoTm9kZXMoZGVzY2VuZGFudHMpXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICAqIEdldHMgZGF0YSB0cmVlXG4gICAgKiBAcmV0dXJuc1xuICAgICovXG4gIGdldERhdGFBcnJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYW9UcmVlLmRhdGE7XG4gIH1cblxuICBzZXREYXRhQXJyYXkoZGF0YTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5kYW9UcmVlLmZsYXROb2RlTWFwLmNsZWFyKCk7XG4gICAgdGhpcy5kYW9UcmVlLnNldERhdGFBcnJheShkYXRhKTtcbiAgICBpZiAodGhpcy5yZWN1cnNpdmUpIHtcbiAgICAgIHRoaXMuY2hpbGRyZU5vZGVzID0gZGF0YS5maWx0ZXIoXG4gICAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW1bdGhpcy5wYXJlbnRDb2x1bW5dICE9IG51bGxcbiAgICAgICk7XG4gICAgICB0aGlzLnJvb3ROb2RlcyA9IGRhdGEuZmlsdGVyKFxuICAgICAgICAoaXRlbTogYW55KSA9PiAhVXRpbC5pc0RlZmluZWQoaXRlbVt0aGlzLnBhcmVudENvbHVtbl0pIHx8IGl0ZW1bdGhpcy5wYXJlbnRDb2x1bW5dID09PSBudWxsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMucm9vdE5vZGVzID0gZGF0YTtcblxuICAgIGxldCBsZXZlbCA9IDA7XG4gICAgbGV0IHJvb3ROb2RlOiBPVHJlZUZsYXROb2RlO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnJvb3RUaXRsZSkpIHtcbiAgICAgIGxldmVsID0gKzE7XG4gICAgICByb290Tm9kZSA9IHsgaWQ6IDAsIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KHRoaXMucm9vdFRpdGxlKSwgcm9vdE5vZGU6IHRydWUsIGxldmVsOiAwLCBleHBhbmRhYmxlOiB0cnVlLCBkYXRhOiB7fSwgaXNMb2FkaW5nOiBmYWxzZSB9O1xuICAgICAgdGhpcy5kYW9UcmVlLmZsYXROb2RlTWFwLnNldChyb290Tm9kZSwgbnVsbCk7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFtyb290Tm9kZV07XG4gICAgICB0aGlzLnRyZWVDb250cm9sLmV4cGFuZChyb290Tm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5yb290Tm9kZXMubWFwKG5vZGUgPT4gdGhpcy50cmFuc2Zvcm1lcihub2RlLCBsZXZlbCkpO1xuICAgIH1cblxuICB9XG5cbiAgdHJhbnNmb3JtZXIgPSAobm9kZTogYW55LCBsZXZlbDogbnVtYmVyLCBwYXJlbnROb2RlPzogYW55KSA9PiB7XG5cbiAgICBjb25zdCBub2RlQ2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVOb2Rlcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW1bdGhpcy5wYXJlbnRDb2x1bW5dID09PSBub2RlW3RoaXMua2V5c10pO1xuICAgIGNvbnN0IGZsYXROb2RlOiBPVHJlZUZsYXROb2RlID1cbiAgICB7XG4gICAgICAnaWQnOiB0aGlzLmdldE5vZGVJZChub2RlLCBwYXJlbnROb2RlKSxcbiAgICAgICdsYWJlbCc6IHRoaXMuZ2V0SXRlbVRleHQobm9kZSksXG4gICAgICAnbGV2ZWwnOiBsZXZlbCxcbiAgICAgICdub2RlJzogdGhpcyxcbiAgICAgIGNoaWxkTm9kZTogdGhpcy50cmVlTm9kZSxcbiAgICAgICdleHBhbmRhYmxlJzogVXRpbC5pc0RlZmluZWQodGhpcy50cmVlTm9kZSkgfHwgISFub2RlQ2hpbGRyZW4/Lmxlbmd0aCB8fCB0aGlzLnJlY3Vyc2l2ZSxcbiAgICAgICdkYXRhJzogbm9kZSxcbiAgICAgICdpc0xvYWRpbmcnOiBmYWxzZSxcbiAgICAgICdyb3V0ZSc6IHRoaXMucm91dGUsXG4gICAgICAnb2Zmc2V0JzogdGhpcy5wYXJlbnRDb21wb25lbnQ/LnF1ZXJ5Um93cyA/PyAwXG4gICAgfTtcblxuICAgIHRoaXMuZGFvVHJlZS5mbGF0Tm9kZU1hcC5zZXQoZmxhdE5vZGUsIHBhcmVudE5vZGUpO1xuXG4gICAgLy9yZWN1cnNpdmVcbiAgICBub2RlQ2hpbGRyZW4uZm9yRWFjaChub2RlID0+IHRoaXMudHJhbnNmb3JtZXIobm9kZSwgbGV2ZWwgKyAxKSk7XG4gICAgcmV0dXJuIGZsYXROb2RlO1xuXG5cbiAgfVxuXG4gIG9uU2VsZWN0Q2hlY2tib3hDaGFuZ2UodmlzaWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2VsZWN0QWxsQ2hlY2tib3hWaXNpYmxlID0gdmlzaWJsZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzb3J0KGFycmF5OiBPVHJlZUZsYXROb2RlW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zb3J0Q29sdW1uICE9IG51bGwpIHtcbiAgICAgIGFycmF5LnNvcnQoKGEsIGIpID0+XG4gICAgICAgIGEuZGF0YVt0aGlzLnNvcnRDb2x1bW5dLmxvY2FsZUNvbXBhcmUoYi5kYXRhW3RoaXMuc29ydENvbHVtbl0pXG4gICAgICApO1xuICAgICAgYXJyYXlcbiAgICAgICAgLmZpbHRlcigobm9kZSkgPT4gISF0aGlzLnRyZWVDb250cm9sLmdldERlc2NlbmRhbnRzKG5vZGUpKVxuICAgICAgICAuZm9yRWFjaCgobm9kZSkgPT4gdGhpcy5zb3J0KHRoaXMudHJlZUNvbnRyb2wuZ2V0RGVzY2VuZGFudHMobm9kZSkpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SXRlbVRleHQoaXRlbTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29sdW1uc0FycmF5XG4gICAgICAuZmlsdGVyKChjb2wpID0+IGl0ZW1bY29sXSAhPSBudWxsICYmIGAke2l0ZW1bY29sXX1gLmxlbmd0aCA+IDApXG4gICAgICAubWFwKChjb2wpID0+IGl0ZW1bY29sXSlcbiAgICAgIC5qb2luKHRoaXMuc2VwYXJhdG9yKTtcbiAgfVxuXG4gIGdldEl0ZW1LZXkoaXRlbTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rZXlzQXJyYXkubWFwKChjb2wpID0+IGl0ZW1bY29sXSkuam9pbignOycpO1xuICB9XG5cblxuICBwcm90ZWN0ZWQgZmlsdGVyQnlRdWlja0ZpbHRlckNvbHVtbnMoXG4gICAgaXRlbTogYW55LFxuICAgIHF1aWNrZmlsdGVyOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2FzZVNlbnNpdGl2ZSA9IHRoaXMuaXNGaWx0ZXJDYXNlU2Vuc2l0aXZlKCk7XG4gICAgY29uc3QgcmVnRXhwU3RyID0gbmV3IFJlZ0V4cChcbiAgICAgIFV0aWwuZXNjYXBlU3BlY2lhbENoYXJhY3RlcihcbiAgICAgICAgVXRpbC5ub3JtYWxpemVTdHJpbmcocXVpY2tmaWx0ZXIsICFjYXNlU2Vuc2l0aXZlKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UXVpY2tGaWx0ZXJDb2x1bW5zKCkuc29tZSgoY29sKSA9PlxuICAgICAgcmVnRXhwU3RyLnRlc3QoVXRpbC5ub3JtYWxpemVTdHJpbmcoaXRlbS5kYXRhW2NvbF0gKyAnJywgIWNhc2VTZW5zaXRpdmUpKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYWRkKGU/OiBFdmVudCk6IHZvaWQge1xuICAgIHN1cGVyLmluc2VydERldGFpbCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5vZGVJZChpdGVtOiBhbnksIHBhcmVudE5vZGU6IGFueSkge1xuICAgIC8qKiByZXZpc2FybG86aWd1YWwgY29uIGlkIGluY3JlbWVudGFsIGVyYSBtYXMgZmFjaWwgZSBpZ3VhbCBkZSBlZmljaWVudGUgKi9cbiAgICBsZXQgaWQgPSAnJztcbiAgICB0aGlzLmtleXNBcnJheS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZCArPSBpdGVtW2tleV07XG4gICAgfSk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHRoaXMucGFyZW50S2V5cykgJiYgVXRpbC5pc0RlZmluZWQocGFyZW50Tm9kZSkpIHtcbiAgICAgIGlkICs9IHBhcmVudE5vZGUuaWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMua2V5cyArICc6JyArIGlkO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5hdmlnYXRlVG9WaWV3RGV0YWlsKG5vZGU6IE9UcmVlRmxhdE5vZGUpIHtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQobm9kZS5yb3V0ZSkpIHtcbiAgICAgIGxldCByb3V0ZSA9IHVuZGVmaW5lZDtcblxuICAgICAgbGV0IG5vZGVSb3V0ZSA9IG5vZGUucm91dGU7XG4gICAgICBsZXQgcm91dGVBcnJheSA9IG5vZGVSb3V0ZS5zcGxpdChDb2Rlcy5ST1VURV9TRVBBUkFUT1IpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJvdXRlQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKHJvdXRlQXJyYXlbaV0uc3RhcnRzV2l0aChDb2Rlcy5ST1VURV9WQVJJQUJMRV9DSEFSKSkge1xuICAgICAgICAgIHJvdXRlQXJyYXlbaV0gPSBub2RlLmRhdGFbcm91dGVBcnJheVtpXS5zdWJzdHJpbmcoMSldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByb3V0ZSA9IHJvdXRlQXJyYXkuam9pbihDb2Rlcy5ST1VURV9TRVBBUkFUT1IpO1xuXG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQocm91dGUpKSB7XG4gICAgICAgIGNvbnN0IGV4dHJhcyA9IHtcbiAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLmFjdFJvdXRlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtyb3V0ZV0sIGV4dHJhcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNTZWxlY3RlZE5vZGUobm9kZTogT1RyZWVGbGF0Tm9kZSkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTm9kZSA9PSBub2RlO1xuICB9XG5cbiAgcHVibGljIG9uSXRlbURldGFpbENsaWNrKG5vZGU6IE9UcmVlRmxhdE5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZUl0ZW1DbGljayhub2RlLmRhdGEpO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGlvbigpIHtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHRoaXMuX3NlbGVjdGlvbikpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRydWUsIFtdLCB0cnVlLCAoc20xLCBzbTIpID0+IHNtMS5pZCA9PT0gc20yLmlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbjtcbiAgfVxuXG4gIGdldFNlbGVjdGVkSXRlbXMoKTogYW55W10ge1xuICAgIGNvbnN0IHNlbGVjdGVkRmxhdE5vZGVzID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRLZXlzID0gdGhpcy5nZXRTZWxlY3RlZE5vZGVLZXlzKHNlbGVjdGVkRmxhdE5vZGVzKTtcblxuICAgIGNvbnN0IG5vZGVNYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgIGNvbnN0IHJvb3ROb2RlczogYW55W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZmxhdE5vZGUgb2Ygc2VsZWN0ZWRGbGF0Tm9kZXMpIHtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0RmxhdE5vZGVJZGVudGlmaWVyKGZsYXROb2RlKTtcbiAgICAgIGNvbnN0IHRyZWVOb2RlID0gdGhpcy5jcmVhdGVUcmVlTm9kZShmbGF0Tm9kZSk7XG4gICAgICBub2RlTWFwLnNldChrZXksIHRyZWVOb2RlKTtcblxuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5kYW9UcmVlLmZsYXROb2RlTWFwLmdldChmbGF0Tm9kZSk7XG4gICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICByb290Tm9kZXMucHVzaCh0cmVlTm9kZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnRLZXkgPSB0aGlzLmdldEZsYXROb2RlSWRlbnRpZmllcihwYXJlbnQpO1xuICAgICAgaWYgKCFzZWxlY3RlZEtleXMuaGFzKHBhcmVudEtleSkpIHtcbiAgICAgICAgcm9vdE5vZGVzLnB1c2godHJlZU5vZGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuZW5zdXJlTm9kZUluTWFwKHBhcmVudCwgbm9kZU1hcCk7XG4gICAgICB0aGlzLmFkZENoaWxkVG9QYXJlbnQocGFyZW50Tm9kZSwgdHJlZU5vZGUpO1xuXG4gICAgICBpZiAodGhpcy5zaG91bGRCZVJvb3QocGFyZW50LCBzZWxlY3RlZEtleXMpICYmICFyb290Tm9kZXMuaW5jbHVkZXMocGFyZW50Tm9kZSkpIHtcbiAgICAgICAgcm9vdE5vZGVzLnB1c2gocGFyZW50Tm9kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvb3ROb2RlcztcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZVNvcnRDb2x1bW4oKTogdm9pZCB7XG4gICAgdGhpcy5zb3J0Q29sdW1uQXJyYXkgPSBTZXJ2aWNlVXRpbHMucGFyc2VTb3J0Q29sdW1ucyh0aGlzLnNvcnRDb2x1bW4pIHx8IFtdO1xuICB9XG5cbiAgcHVibGljIGdldFF1ZXJ5QXJndW1lbnRzKGZpbHRlcjogb2JqZWN0LCBvdnJyQXJncz86IE9RdWVyeURhdGFBcmdzKTogYW55W10ge1xuICAgIGNvbnN0IHF1ZXJ5QXJndW1lbnRzID0gc3VwZXIuZ2V0UXVlcnlBcmd1bWVudHMoZmlsdGVyLCBvdnJyQXJncyk7XG4gICAgaWYgKHRoaXMucGFnZWFibGUpIHtcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnNvcnRDb2x1bW5BcnJheSkpIHtcbiAgICAgICAgcXVlcnlBcmd1bWVudHNbNl0gPSB0aGlzLnNvcnRDb2x1bW5BcnJheTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5QXJndW1lbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRCZVJvb3QocGFyZW50OiBPVHJlZUZsYXROb2RlLCBzZWxlY3RlZEtleXM6IFNldDxzdHJpbmc+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZ3JhbmRQYXJlbnQgPSB0aGlzLmRhb1RyZWUuZmxhdE5vZGVNYXAuZ2V0KHBhcmVudCk7XG4gICAgaWYgKCFncmFuZFBhcmVudCkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBncmFuZFBhcmVudEtleSA9IHRoaXMuZ2V0RmxhdE5vZGVJZGVudGlmaWVyKGdyYW5kUGFyZW50KTtcbiAgICByZXR1cm4gIXNlbGVjdGVkS2V5cy5oYXMoZ3JhbmRQYXJlbnRLZXkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVRyZWVOb2RlKGZsYXROb2RlOiBPVHJlZUZsYXROb2RlKTogYW55IHtcbiAgICByZXR1cm4gZmxhdE5vZGUubm9kZVxuICAgICAgPyB7IC4uLmZsYXROb2RlLmRhdGEgfVxuICAgICAgOiB7IGxhYmVsOiBmbGF0Tm9kZS5sYWJlbCB9O1xuICB9XG5cblxuICBwcm90ZWN0ZWQgZ2V0RmxhdE5vZGVJZGVudGlmaWVyKGZsYXROb2RlOiBPVHJlZUZsYXROb2RlKTogc3RyaW5nIHtcbiAgICBpZiAoZmxhdE5vZGUubm9kZT8uZ2V0SXRlbUtleSkge1xuICAgICAgcmV0dXJuIGZsYXROb2RlLm5vZGUuZ2V0SXRlbUtleShmbGF0Tm9kZS5kYXRhKTtcbiAgICB9IGVsc2UgaWYgKGZsYXROb2RlLmlkICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBmbGF0Tm9kZS5pZC50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gZmxhdE5vZGUubGFiZWw7XG5cbiAgfVxuICBwcml2YXRlIGFkZENoaWxkVG9QYXJlbnQocGFyZW50Tm9kZTogYW55LCBjaGlsZE5vZGU6IGFueSk6IHZvaWQge1xuICAgIGlmICghcGFyZW50Tm9kZS5jaGlsZHJlbikge1xuICAgICAgcGFyZW50Tm9kZS5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgICBwYXJlbnROb2RlLmNoaWxkcmVuLnB1c2goY2hpbGROb2RlKTtcbiAgfVxuXG4gIGFkZFBhcmVudFRvUm9vdElmTm9HcmFuZHBhcmVudFNlbGVjdGVkKFxuICAgIHBhcmVudDogT1RyZWVGbGF0Tm9kZSxcbiAgICBwYXJlbnRLZXk6IHN0cmluZyxcbiAgICBzZWxlY3RlZEtleXM6IFNldDxzdHJpbmc+LFxuICAgIG5vZGVNYXA6IE1hcDxzdHJpbmcsIGFueT4sXG4gICAgcm9vdE5vZGVzOiBhbnlbXVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBncmFuZFBhcmVudCA9IHRoaXMuZGFvVHJlZS5mbGF0Tm9kZU1hcC5nZXQocGFyZW50KTtcbiAgICBjb25zdCBncmFuZFBhcmVudEtleSA9IGdyYW5kUGFyZW50ID8gdGhpcy5nZXRGbGF0Tm9kZUlkZW50aWZpZXIoZ3JhbmRQYXJlbnQpIDogbnVsbDtcblxuICAgIGlmICghZ3JhbmRQYXJlbnQgfHwgIXNlbGVjdGVkS2V5cy5oYXMoZ3JhbmRQYXJlbnRLZXkpKSB7XG4gICAgICBjb25zdCBwYXJlbnROb2RlID0gbm9kZU1hcC5nZXQocGFyZW50S2V5KTtcbiAgICAgIGlmICghcm9vdE5vZGVzLmluY2x1ZGVzKHBhcmVudE5vZGUpKSB7XG4gICAgICAgIHJvb3ROb2Rlcy5wdXNoKHBhcmVudE5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGVuc3VyZU5vZGVJbk1hcChmbGF0Tm9kZTogT1RyZWVGbGF0Tm9kZSwgbWFwOiBNYXA8c3RyaW5nLCBhbnk+KTogYW55IHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEZsYXROb2RlSWRlbnRpZmllcihmbGF0Tm9kZSk7XG4gICAgaWYgKCFtYXAuaGFzKGtleSkpIHtcbiAgICAgIG1hcC5zZXQoa2V5LCB0aGlzLmNyZWF0ZVRyZWVOb2RlKGZsYXROb2RlKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXAuZ2V0KGtleSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdGVkTm9kZUtleXMobm9kZXM6IE9UcmVlRmxhdE5vZGVbXSk6IFNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFNldChub2Rlcy5tYXAobm9kZSA9PiB0aGlzLmdldEZsYXROb2RlSWRlbnRpZmllcihub2RlKSkpO1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRGbGF0Tm9kZXMoKTogT1RyZWVGbGF0Tm9kZVtdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQ7XG4gIH1cblxuICBnZXRQYXJlbnROb2RlKG5vZGU6IGFueSk6IE9UcmVlRmxhdE5vZGUge1xuICAgIGNvbnN0IGN1cnJlbnRMZXZlbCA9IHRoaXMuZ2V0TGV2ZWwobm9kZSk7XG4gICAgaWYgKGN1cnJlbnRMZXZlbCA8IDEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2Rlcy5pbmRleE9mKG5vZGUpIC0gMTtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXNbaV07XG4gICAgICBpZiAodGhpcy5nZXRMZXZlbChjdXJyZW50Tm9kZSkgPT09IGN1cnJlbnRMZXZlbCAtIDEpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlbG9hZERhdGEoY2xlYXJTZWxlY3RlZEl0ZW1zOiBib29sZWFuID0gdHJ1ZSkge1xuXG4gICAgaWYgKGNsZWFyU2VsZWN0ZWRJdGVtcykge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIGxldCBxdWVyeUFyZ3M6IE9RdWVyeURhdGFBcmdzO1xuICAgIGlmICh0aGlzLnBhZ2VhYmxlKSB7XG4gICAgICBxdWVyeUFyZ3MgPSB7XG4gICAgICAgIG9mZnNldDogdGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucXVlcnlSb3dzLFxuICAgICAgICBsZW5ndGg6IHRoaXMucXVlcnlSb3dzXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLnF1ZXJ5RGF0YSh2b2lkIDAsIHF1ZXJ5QXJncyk7XG4gIH1cblxuICBnZXRMb2dpY2FsTGV2ZWwobm9kZTogT1RyZWVGbGF0Tm9kZSk6IG51bWJlciB7XG4gICAgY29uc3QgaGFzRmFrZVJvb3QgPSB0aGlzLmhhc0Zha2VSb290KCk7IC8vIExvIGRlZmluZXMgc2Vnw7puIHR1IGVzdHJ1Y3R1cmFcbiAgICByZXR1cm4gaGFzRmFrZVJvb3QgPyBub2RlLmxldmVsIC0gMSA6IG5vZGUubGV2ZWw7XG4gIH1cblxuICBoYXNGYWtlUm9vdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnJvb3RUaXRsZTtcbiAgfVxuXG4gIHB1YmxpYyBjaGlsZFF1ZXJ5RGF0YShmbGF0Tm9kZTogT1RyZWVGbGF0Tm9kZSk6IE9ic2VydmFibGU8U2VydmljZVJlc3BvbnNlPiB8IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZGFvVHJlZS5xdWVyeU5vZGVDaGlsZHJlbihmbGF0Tm9kZSwgdGhpcy5yZWN1cnNpdmUpO1xuICB9XG5cbn1cbiIsIjxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeEZsZXhGaWxsPlxuICA8ZGl2IGZ4RmxleD5cbiAgICA8ZGl2ICpuZ0lmPVwiaGFzQ29udHJvbHMoKVwiIGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0J1dHRvbnNUZXh0O2Vsc2Ugc2hvd0J1dHRvbnNXaXRob3V0VGV4dFwiPlxuXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImluc2VydEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBtYXQtc3Ryb2tlZC1idXR0b24gYXJpYS1sYWJlbD1cIkluc2VydFwiIFtkaXNhYmxlZF09XCIhZW5hYmxlZEluc2VydEJ1dHRvblwiIChjbGljayk9XCJhZGQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJvbnRpbWl6ZTphZGRcIj48L21hdC1pY29uPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ0lOU0VSVCcgfCBvVHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInJlZnJlc2hCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LXN0cm9rZWQtYnV0dG9uIGFyaWEtbGFiZWw9XCJSZWZyZXNoXCIgW2Rpc2FibGVkXT1cIiFlbmFibGVkUmVmcmVzaEJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmVsb2FkRGF0YSgpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOmF1dG9yZW5ld1wiPjwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3Bhbj57eyAnUkVGUkVTSCcgfCBvVHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImRlbGV0ZUJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBtYXQtc3Ryb2tlZC1idXR0b24gYXJpYS1sYWJlbD1cIkRlbGV0ZVwiIFtkaXNhYmxlZF09XCIhZW5hYmxlZERlbGV0ZUJ1dHRvblwiXG4gICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIWVuYWJsZWREZWxldGVCdXR0b25cIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwib250aW1pemU6ZGVsZXRlXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdERUxFVEUnIHwgb1RyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctdGVtcGxhdGUgI3Nob3dCdXR0b25zV2l0aG91dFRleHQ+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImluc2VydEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cIkluc2VydFwiIFtkaXNhYmxlZF09XCIhZW5hYmxlZEluc2VydEJ1dHRvblwiIChjbGljayk9XCJhZGQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJvbnRpbWl6ZTphZGRcIj48L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInJlZnJlc2hCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJSZWZyZXNoXCIgW2Rpc2FibGVkXT1cIiFlbmFibGVkUmVmcmVzaEJ1dHRvblwiIChjbGljayk9XCJyZWxvYWREYXRhKClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwib250aW1pemU6YXV0b3JlbmV3XCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJkZWxldGVCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJEZWxldGVcIiBbZGlzYWJsZWRdPVwiIWVuYWJsZWREZWxldGVCdXR0b25cIlxuICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFlbmFibGVkRGVsZXRlQnV0dG9uXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOmRlbGV0ZVwiPjwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW28tdHJlZS1idXR0b25dXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGZ4RmxleD5cbiAgICAgICAgPHNwYW4gZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIiBjbGFzcz1cInRpdGxlXCI+e3sgdGl0bGUgfCBvVHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8by1zZWFyY2gtaW5wdXQgKm5nSWY9XCJxdWlja0ZpbHRlclwiIFtmaWx0ZXItY2FzZS1zZW5zaXRpdmVdPVwiZmlsdGVyQ2FzZVNlbnNpdGl2ZVwiIFtzaG93LWNhc2Utc2Vuc2l0aXZlLWNoZWNrYm94XT1cInNob3dDYXNlU2Vuc2l0aXZlQ2hlY2tib3goKVwiXG4gICAgICAgIFtjb2x1bW5zXT1cInF1aWNrRmlsdGVyQ29sdW1uc1wiIFtwbGFjZWhvbGRlcl09XCJxdWlja0ZpbHRlclBsYWNlaG9sZGVyXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBmbG9hdC1sYWJlbD1cIm5ldmVyXCIgc2hvdy1tZW51PVwibm9cIj5cbiAgICAgIDwvby1zZWFyY2gtaW5wdXQ+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cInNob3dUcmVlTWVudUJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBjbGFzcz1cIm8tdHJlZS1tZW51LWJ1dHRvblwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJ0cmVlTWVudS5tYXRNZW51XCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm9udGltaXplOm1vcmVfdmVydFwiPjwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxvLXRyZWUtbWVudSAjdHJlZU1lbnUgW3NlbGVjdC1hbGwtY2hlY2tib3hdPVwic2VsZWN0QWxsQ2hlY2tib3hcIiBbc2VsZWN0LWFsbC1jaGVja2JveC12aXNpYmxlXT1cInNlbGVjdEFsbENoZWNrYm94VmlzaWJsZVwiXG4gICAgICAgIChvblNlbGVjdENoZWNrYm94Q2hhbmdlKT1cIm9uU2VsZWN0Q2hlY2tib3hDaGFuZ2UoJGV2ZW50KVwiPjwvby10cmVlLW1lbnU+XG5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtdHJlZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sXCI+XG5cbiAgICAgIDwhLS0gVGhpcyBpcyB0aGUgdHJlZSBub2RlIHRlbXBsYXRlIGZvciBsZWFmIG5vZGVzIC0tPlxuICAgICAgPG1hdC10cmVlLW5vZGUgKm1hdFRyZWVOb2RlRGVmPVwibGV0IG5vZGVcIiAoY2xpY2spPVwibGVhZk5vZGVDbGlja2VkKCRldmVudCwgbm9kZSlcIiBtYXRUcmVlTm9kZVRvZ2dsZSBtYXRUcmVlTm9kZVBhZGRpbmdcbiAgICAgICAgW25nQ2xhc3NdPVwieydzZWxlY3RlZC1ub2RlJzogaXNTZWxlY3RlZE5vZGUobm9kZSl9XCI+XG4gICAgICAgIDwhLS0gdXNlIGEgZGlzYWJsZWQgYnV0dG9uIHRvIHByb3ZpZGUgcGFkZGluZyBmb3IgdHJlZSBsZWFmIC0tPlxuICAgICAgICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCI+XG4gICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gZGlzYWJsZWQ+PC9idXR0b24+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RBbGxDaGVja2JveFZpc2libGU7IGVsc2Ugc2ltcGxlTGVhZk5vZGVUcGxcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKm5nSWY9XCJzZWxlY3RBbGxDaGVja2JveFZpc2libGU7IGVsc2Ugc2ltcGxlTGVhZk5vZGVUcGxcIiBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hlY2tib3hDbGlja2VkKCRldmVudClcIiAoY2hhbmdlKT1cInRvZG9MZWFmSXRlbVNlbGVjdGlvblRvZ2dsZShub2RlKVwiIChrZXlEb3duKT1cImNoZWNrYm94Q2xpY2tlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJsZWFmTm9kZUZ1bGx0ZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0Om5vZGV9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NpbXBsZUxlYWZOb2RlVHBsPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxlYWZOb2RlRnVsbHRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6bm9kZX1cIj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0xhc3RDaGlsZEFuZEhhc01vcmUobm9kZSlcIj5cbiAgICAgICAgICAgIDxidXR0b24gI2J1dHRvbkxvYWRNb3JlIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cIm9uTG9hZE1vcmUoJGV2ZW50LCBub2RlKVwiPlxuICAgICAgICAgICAgICB7eyAnT19UUkVFLkxPQURfTU9SRScgfCBvVHJhbnNsYXRlfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9tYXQtdHJlZS1ub2RlPlxuICAgICAgPCEtLSBUaGlzIGlzIHRoZSB0cmVlIG5vZGUgdGVtcGxhdGUgZm9yIGV4cGFuZGFibGUgbm9kZXMgLS0+XG4gICAgICA8bWF0LXRyZWUtbm9kZSAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZTsgd2hlbjogaGFzQ2hpbGRcIiAoY2xpY2spPVwicGFyZW50Tm9kZUNsaWNrZWQoJGV2ZW50LCBub2RlKVwiIG1hdFRyZWVOb2RlUGFkZGluZ1xuICAgICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkLW5vZGUnOiBpc1NlbGVjdGVkTm9kZShub2RlKX1cIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW2F0dHIuYXJpYS1sYWJlbF09XCIndG9nZ2xlICcgKyBub2RlLmxhYmVsXCIgbWF0VHJlZU5vZGVUb2dnbGUgKGNsaWNrKT1cIm9uQ2xpY2tUb2dnbGVCdXR0b24oJGV2ZW50LCBub2RlKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uLXJ0bC1taXJyb3JcIj5cbiAgICAgICAgICAgIHt7dHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKSA/ICdleHBhbmRfbW9yZScgOiAnY2hldnJvbl9yaWdodCd9fVxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RBbGxDaGVja2JveFZpc2libGU7IGVsc2Ugc2ltcGxlUGFyZW50Tm9kZVRwbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RlLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKm5nSWY9XCJzZWxlY3RBbGxDaGVja2JveFZpc2libGU7IGVsc2Ugc2ltcGxlUGFyZW50Tm9kZVRwbFwiIChjbGljayk9XCJjaGVja2JveENsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9kb0l0ZW1TZWxlY3Rpb25Ub2dnbGUobm9kZSlcIiBbY2hlY2tlZF09XCJkZXNjZW5kYW50c0FsbFNlbGVjdGVkKG5vZGUpXCIgW2luZGV0ZXJtaW5hdGVdPVwiZGVzY2VuZGFudHNQYXJ0aWFsbHlTZWxlY3RlZChub2RlKVwiPlxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBhcmVudE5vZGVGdWxsdGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDpub2RlfVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc2ltcGxlUGFyZW50Tm9kZVRwbD5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBhcmVudE5vZGVGdWxsdGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDpub2RlfVwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9tYXQtdHJlZS1ub2RlPlxuXG5cbiAgICA8L21hdC10cmVlPlxuICA8L2Rpdj5cblxuICA8IS0tIG1hdCBwYWdpbmF0aW9uLS0+XG4gIDxtYXQtcGFnaW5hdG9yICpuZ0lmPVwicGFnaW5hdGlvbkNvbnRyb2xzICYmIHBhZ2VhYmxlXCIgI21hdHBhZ2luYXRvciBbbGVuZ3RoXT1cImRhdGFTb3VyY2U/LnJlc3VsdHNMZW5ndGhcIiBbcGFnZVNpemVdPVwicXVlcnlSb3dzXCJcbiAgICBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiIFtwYWdlSW5kZXhdPVwiY3VycmVudFBhZ2VcIiBbc2hvd0ZpcnN0TGFzdEJ1dHRvbnNdPVwidHJ1ZVwiIChwYWdlKT1cIm9uQ2hhbmdlUGFnZSgkZXZlbnQpXCJcbiAgICBbbmdTdHlsZV09XCJ7J3Zpc2liaWxpdHknOiAobG9hZGluZyB8IGFzeW5jKSA9PT0gZmFsc2UgPyAndmlzaWJsZSc6J2hpZGRlbid9XCI+PC9tYXQtcGFnaW5hdG9yPlxuXG5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgbGV0LW5vZGUgI2xlYWZOb2RlRnVsbHRlbXBsYXRlPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwibGVhZk5vZGVUZW1wbGF0ZTsgZWxzZSBkZWZhdWx0TGVhZk5vZGVUcGxcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJsZWFmTm9kZVRlbXBsYXRlXCJcbiAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDpub2RlLmRhdGF9XCI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExlYWZOb2RlVHBsPlxuICAgIHt7bm9kZS5sYWJlbH19XG4gIDwvbmctdGVtcGxhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgbGV0LW5vZGUgI3BhcmVudE5vZGVGdWxsdGVtcGxhdGU+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXJlbnROb2RlVGVtcGxhdGU7IGVsc2UgZGVmYXVsdFBhcmVudE5vZGVUcGxcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJwYXJlbnROb2RlVGVtcGxhdGVcIlxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0Om5vZGUuZGF0YX1cIj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLXRlbXBsYXRlICNkZWZhdWx0UGFyZW50Tm9kZVRwbD5cbiAgICA8c3Bhbj57e25vZGUubGFiZWx9fTwvc3Bhbj5cbiAgICA8bWF0LXByb2dyZXNzLWJhciAqbmdJZj1cIm5vZGUuaXNMb2FkaW5nXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiBmeEZsZXg+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|