@trudb/tru-common-lib 0.1.220 → 0.1.224
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/esm2022/lib/components/card-column/tru-card-column-module.mjs +45 -0
- package/esm2022/lib/components/card-column/tru-card-column.mjs +285 -0
- package/esm2022/lib/services/tru-entity-accessor.mjs +7 -1
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/trudb-tru-common-lib.mjs +2454 -2135
- package/fesm2022/trudb-tru-common-lib.mjs.map +1 -1
- package/lib/components/card-column/tru-card-column-module.d.ts +14 -0
- package/lib/components/card-column/tru-card-column.d.ts +49 -0
- package/lib/services/tru-entity-accessor.d.ts +1 -0
- package/package.json +5 -6
- package/public-api.d.ts +2 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { NgModule } from "@angular/core";
|
|
2
|
+
import { CommonModule, } from "@angular/common";
|
|
3
|
+
import { FormsModule } from "@angular/forms";
|
|
4
|
+
import { MatIconModule } from "@angular/material/icon";
|
|
5
|
+
import { TruToolbarModule } from "../toolbar/tru-toolbar-module";
|
|
6
|
+
import { TruToolbarButtonModule } from "../toolbar/button/tru-toolbar-button-module";
|
|
7
|
+
import { TruToolbarDropdownModule } from "../toolbar/dropdown/tru-toolbar-dropdown-module";
|
|
8
|
+
import { TruToolbarSeparatorModule } from "../toolbar/separator/tru-toolbar-separator-module";
|
|
9
|
+
import { TruCardColumn } from "./tru-card-column";
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
export class TruCardColumnModule {
|
|
12
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TruCardColumnModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
13
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.5", ngImport: i0, type: TruCardColumnModule, declarations: [TruCardColumn], imports: [CommonModule,
|
|
14
|
+
FormsModule,
|
|
15
|
+
MatIconModule,
|
|
16
|
+
TruToolbarModule,
|
|
17
|
+
TruToolbarButtonModule,
|
|
18
|
+
TruToolbarDropdownModule,
|
|
19
|
+
TruToolbarSeparatorModule], exports: [TruCardColumn] });
|
|
20
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TruCardColumnModule, imports: [CommonModule,
|
|
21
|
+
FormsModule,
|
|
22
|
+
MatIconModule,
|
|
23
|
+
TruToolbarModule,
|
|
24
|
+
TruToolbarButtonModule,
|
|
25
|
+
TruToolbarDropdownModule,
|
|
26
|
+
TruToolbarSeparatorModule] });
|
|
27
|
+
}
|
|
28
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TruCardColumnModule, decorators: [{
|
|
29
|
+
type: NgModule,
|
|
30
|
+
args: [{
|
|
31
|
+
providers: [],
|
|
32
|
+
declarations: [TruCardColumn],
|
|
33
|
+
imports: [
|
|
34
|
+
CommonModule,
|
|
35
|
+
FormsModule,
|
|
36
|
+
MatIconModule,
|
|
37
|
+
TruToolbarModule,
|
|
38
|
+
TruToolbarButtonModule,
|
|
39
|
+
TruToolbarDropdownModule,
|
|
40
|
+
TruToolbarSeparatorModule
|
|
41
|
+
],
|
|
42
|
+
exports: [TruCardColumn]
|
|
43
|
+
}]
|
|
44
|
+
}] });
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1LWNhcmQtY29sdW1uLW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydS1jb21tb24tbGliL3NyYy9saWIvY29tcG9uZW50cy9jYXJkLWNvbHVtbi90cnUtY2FyZC1jb2x1bW4tbW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQW1CLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzNGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzlGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFnQmxELE1BQU0sT0FBTyxtQkFBbUI7dUdBQW5CLG1CQUFtQjt3R0FBbkIsbUJBQW1CLGlCQVpmLGFBQWEsYUFFMUIsWUFBWTtZQUNaLFdBQVc7WUFDWCxhQUFhO1lBQ2IsZ0JBQWdCO1lBQ2hCLHNCQUFzQjtZQUN0Qix3QkFBd0I7WUFDeEIseUJBQXlCLGFBRWpCLGFBQWE7d0dBRVosbUJBQW1CLFlBVjVCLFlBQVk7WUFDWixXQUFXO1lBQ1gsYUFBYTtZQUNiLGdCQUFnQjtZQUNoQixzQkFBc0I7WUFDdEIsd0JBQXdCO1lBQ3hCLHlCQUF5Qjs7MkZBSWhCLG1CQUFtQjtrQkFkL0IsUUFBUTttQkFBQztvQkFDUixTQUFTLEVBQUUsRUFBRTtvQkFDYixZQUFZLEVBQUUsQ0FBQyxhQUFhLENBQUM7b0JBQzdCLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLHNCQUFzQjt3QkFDdEIsd0JBQXdCO3dCQUN4Qix5QkFBeUI7cUJBQzFCO29CQUNELE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQztpQkFDekIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgQVBQX0lOSVRJQUxJWkVSIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pY29uXCJcclxuaW1wb3J0IHsgVHJ1VG9vbGJhck1vZHVsZSB9IGZyb20gXCIuLi90b29sYmFyL3RydS10b29sYmFyLW1vZHVsZVwiO1xyXG5pbXBvcnQgeyBUcnVUb29sYmFyQnV0dG9uTW9kdWxlIH0gZnJvbSBcIi4uL3Rvb2xiYXIvYnV0dG9uL3RydS10b29sYmFyLWJ1dHRvbi1tb2R1bGVcIjtcclxuaW1wb3J0IHsgVHJ1VG9vbGJhckRyb3Bkb3duTW9kdWxlIH0gZnJvbSBcIi4uL3Rvb2xiYXIvZHJvcGRvd24vdHJ1LXRvb2xiYXItZHJvcGRvd24tbW9kdWxlXCI7XHJcbmltcG9ydCB7IFRydVRvb2xiYXJTZXBhcmF0b3JNb2R1bGUgfSBmcm9tIFwiLi4vdG9vbGJhci9zZXBhcmF0b3IvdHJ1LXRvb2xiYXItc2VwYXJhdG9yLW1vZHVsZVwiO1xyXG5pbXBvcnQgeyBUcnVDYXJkQ29sdW1uIH0gZnJvbSBcIi4vdHJ1LWNhcmQtY29sdW1uXCI7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIHByb3ZpZGVyczogW10sXHJcbiAgZGVjbGFyYXRpb25zOiBbVHJ1Q2FyZENvbHVtbl0sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgVHJ1VG9vbGJhck1vZHVsZSxcclxuICAgIFRydVRvb2xiYXJCdXR0b25Nb2R1bGUsXHJcbiAgICBUcnVUb29sYmFyRHJvcGRvd25Nb2R1bGUsXHJcbiAgICBUcnVUb29sYmFyU2VwYXJhdG9yTW9kdWxlXHJcbiAgXSxcclxuICBleHBvcnRzOiBbVHJ1Q2FyZENvbHVtbl1cclxufSlcclxuZXhwb3J0IGNsYXNzIFRydUNhcmRDb2x1bW5Nb2R1bGUgeyB9XHJcbiJdfQ==
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import * as _ from 'underscore';
|
|
3
|
+
import { breeze } from 'breeze-client';
|
|
4
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../services/tru-data-context";
|
|
7
|
+
import * as i2 from "../../services/tru-model-type-lookup";
|
|
8
|
+
import * as i3 from "@angular/common";
|
|
9
|
+
export class TruCardColumn {
|
|
10
|
+
dataContext;
|
|
11
|
+
modelTypeLookup;
|
|
12
|
+
config;
|
|
13
|
+
portal;
|
|
14
|
+
parentTableName = this.config.parentTableName;
|
|
15
|
+
key = this.config.key;
|
|
16
|
+
parentQuery = this.config.parentQuery;
|
|
17
|
+
lockProperty = this.config.lockProperty;
|
|
18
|
+
entityPluralName = this.config.entityPluralName;
|
|
19
|
+
entityName = this.config.entityName;
|
|
20
|
+
columnSort = this.config.columnSort;
|
|
21
|
+
cardSort = this.config.cardSort;
|
|
22
|
+
color = this.config.color;
|
|
23
|
+
unassignedVisible = this.config.unassignedVisible;
|
|
24
|
+
unassignedName = this.config.unassignedName;
|
|
25
|
+
unassignedLocked = this.config.unassignedLocked;
|
|
26
|
+
unassignedColor = this.config.unassignedColor;
|
|
27
|
+
unassignedDraggable = this.config.unassignedDraggable;
|
|
28
|
+
unassignedDroppable = this.config.unassignedDroppable;
|
|
29
|
+
inactiveVisible = this.config.inactiveVisible;
|
|
30
|
+
inactiveDraggable = this.config.inactiveDraggable;
|
|
31
|
+
inactiveDroppable = this.config.inactiveDroppable;
|
|
32
|
+
relatedParentName;
|
|
33
|
+
relatedChildName;
|
|
34
|
+
insertBefore;
|
|
35
|
+
selectedCards = [];
|
|
36
|
+
columnFilterRefs = [];
|
|
37
|
+
cardFilterStr;
|
|
38
|
+
uniqueId;
|
|
39
|
+
columns;
|
|
40
|
+
lockedColumns;
|
|
41
|
+
constructor(dataContext, modelTypeLookup) {
|
|
42
|
+
this.dataContext = dataContext;
|
|
43
|
+
this.modelTypeLookup = modelTypeLookup;
|
|
44
|
+
let index = this.key.lastIndexOf(this.parentTableName);
|
|
45
|
+
let prefix = this.key.substring(index, -1);
|
|
46
|
+
if (prefix) {
|
|
47
|
+
this.relatedParentName = prefix + this.parentTableName;
|
|
48
|
+
this.relatedChildName = prefix + this.entityPluralName;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
this.relatedParentName = this.parentTableName;
|
|
52
|
+
this.relatedChildName = this.entityPluralName;
|
|
53
|
+
}
|
|
54
|
+
this.uniqueId = uuidv4();
|
|
55
|
+
}
|
|
56
|
+
parentTableModel = null; //dataService.model.tables[parentTableName];
|
|
57
|
+
userHasParentTableRole = null; //parentTableModel.canDisplay;
|
|
58
|
+
createDataForEntity = (entity) => {
|
|
59
|
+
var data = this.config.createData(entity);
|
|
60
|
+
data.$entity = entity;
|
|
61
|
+
return data;
|
|
62
|
+
};
|
|
63
|
+
hasUndefinedChildren = (entity) => {
|
|
64
|
+
const entityPropertyName = 'o' + this.relatedChildName;
|
|
65
|
+
return !entity[entityPropertyName];
|
|
66
|
+
};
|
|
67
|
+
hasEmptyChildren = (entity) => {
|
|
68
|
+
const entityPropertyName = 'o' + this.relatedChildName;
|
|
69
|
+
return !entity[entityPropertyName].length;
|
|
70
|
+
};
|
|
71
|
+
hasInactiveChildren = (entity) => {
|
|
72
|
+
const entityPropertyName = 'o' + this.relatedChildName;
|
|
73
|
+
return _.every([entityPropertyName], (child) => { return !child.active; });
|
|
74
|
+
};
|
|
75
|
+
hasAddedUnsavedChildren = (entities, parentRef) => {
|
|
76
|
+
return _.some(entities, (entity) => {
|
|
77
|
+
const entityPropertyName = this.key;
|
|
78
|
+
return entity[entityPropertyName] === parentRef;
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
clear = () => {
|
|
82
|
+
var lockedColumns = this.portal.querySelectorAll('.locked-columns')[0];
|
|
83
|
+
var unlockedColumns = this.portal.querySelectorAll('.unlocked-columns')[0];
|
|
84
|
+
while (lockedColumns && lockedColumns.lastChild) {
|
|
85
|
+
lockedColumns.removeChild(lockedColumns.lastChild);
|
|
86
|
+
}
|
|
87
|
+
;
|
|
88
|
+
while (unlockedColumns && unlockedColumns.lastChild) {
|
|
89
|
+
unlockedColumns.removeChild(unlockedColumns.lastChild);
|
|
90
|
+
}
|
|
91
|
+
while (this.selectedCards.length) {
|
|
92
|
+
this.selectedCards.pop();
|
|
93
|
+
}
|
|
94
|
+
;
|
|
95
|
+
this.config.onSelectionChanged([]);
|
|
96
|
+
this.config.clearFilters();
|
|
97
|
+
};
|
|
98
|
+
getValueFromSortPath = (args) => {
|
|
99
|
+
let current = args[0];
|
|
100
|
+
for (let i = 0; i < args[1].length; i++) {
|
|
101
|
+
let partName;
|
|
102
|
+
if (i !== args[1].length - 1) {
|
|
103
|
+
partName = 'o' + args[1][i];
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
partName = args[1][i];
|
|
107
|
+
}
|
|
108
|
+
if (current[partName]) {
|
|
109
|
+
current = current[partName];
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return current;
|
|
116
|
+
};
|
|
117
|
+
updateItemsSource(newEntities, revert) {
|
|
118
|
+
this.clear();
|
|
119
|
+
if (!revert)
|
|
120
|
+
localStorage.setItem('scroll_position' + uuidv4(), '0');
|
|
121
|
+
if (newEntities.length)
|
|
122
|
+
this.config.busyMessage = 'Rendering...';
|
|
123
|
+
this.columnFilterRefs = [];
|
|
124
|
+
this.cardFilterStr = null;
|
|
125
|
+
if (!newEntities.length) {
|
|
126
|
+
this.lockedColumns = [];
|
|
127
|
+
this.columns = [];
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
let lockedColumns = [];
|
|
131
|
+
let emptyParents = [];
|
|
132
|
+
let columns = [];
|
|
133
|
+
let query = new breeze.EntityQuery('Query' + this.parentTableName);
|
|
134
|
+
var relatedChildProperty = 'o' + this.relatedChildName;
|
|
135
|
+
if (this.config.customCardColumnQueryFactory)
|
|
136
|
+
query = this.config.customCardColumnQueryFactory(query, relatedChildProperty);
|
|
137
|
+
else
|
|
138
|
+
query = query.expand('o' + this.relatedChildName);
|
|
139
|
+
//if (this.parentQuery)
|
|
140
|
+
// query = queries[this.parentQuery](query);
|
|
141
|
+
this.dataContext.entityAccess().customSearch(this.modelTypeLookup.getType(this.parentTableName), query).subscribe((parents) => {
|
|
142
|
+
this.config.addParentsToFilter(parents);
|
|
143
|
+
emptyParents = _.filter(parents, (parent) => {
|
|
144
|
+
if (this.hasUndefinedChildren(parent) || this.hasEmptyChildren(parent) || this.hasInactiveChildren(parent)) {
|
|
145
|
+
if (!this.hasAddedUnsavedChildren(newEntities, parent.Ref)) {
|
|
146
|
+
parent['cards'] = [];
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return false;
|
|
151
|
+
});
|
|
152
|
+
let queryableParentRefs = _.pluck(parents, this.key);
|
|
153
|
+
let inactiveWithParent = [];
|
|
154
|
+
let activeWithoutParent = [
|
|
155
|
+
{
|
|
156
|
+
unassigned: true,
|
|
157
|
+
cards: []
|
|
158
|
+
}
|
|
159
|
+
];
|
|
160
|
+
parents.forEach((parent) => {
|
|
161
|
+
parent['cards'] = [];
|
|
162
|
+
if (queryableParentRefs.indexOf(parent[this.key]) !== -1) {
|
|
163
|
+
if (parent[this.lockProperty]) {
|
|
164
|
+
lockedColumns.push(parent);
|
|
165
|
+
}
|
|
166
|
+
else if (!parent[this.lockProperty] && !_.contains(emptyParents, parent)) {
|
|
167
|
+
columns.push(parent);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
parent['inactive'] = true;
|
|
172
|
+
inactiveWithParent.push(parent);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
newEntities.forEach((entity) => {
|
|
176
|
+
var entityParent = _.find(parents, (p) => {
|
|
177
|
+
if (entity['o' + this.relatedParentName])
|
|
178
|
+
return p.Ref === entity['o' + this.relatedParentName].Ref;
|
|
179
|
+
return false;
|
|
180
|
+
});
|
|
181
|
+
if (entityParent) {
|
|
182
|
+
if (queryableParentRefs.indexOf(entityParent[this.key]) !== -1) {
|
|
183
|
+
entityParent.cards.push(this.createDataForEntity(entity));
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
entityParent.cards.push(this.createDataForEntity(entity));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else if (!entityParent &&
|
|
190
|
+
entity['o' + this.relatedParentName] &&
|
|
191
|
+
entity['o' + this.relatedParentName].Ref > 0) {
|
|
192
|
+
let inactiveParent = entity['o' + this.relatedParentName];
|
|
193
|
+
if (inactiveWithParent.indexOf(inactiveParent) === -1) {
|
|
194
|
+
inactiveParent['cards'] = [];
|
|
195
|
+
inactiveParent['inactive'] = true;
|
|
196
|
+
inactiveWithParent.push(inactiveParent);
|
|
197
|
+
}
|
|
198
|
+
inactiveParent.cards.push(this.createDataForEntity(entity));
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
activeWithoutParent[0].cards.push(this.createDataForEntity(entity));
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
if (this.columnSort) {
|
|
205
|
+
var columnSortParts = this.columnSort.split('/');
|
|
206
|
+
lockedColumns = _.sortBy(lockedColumns, (o) => {
|
|
207
|
+
var v = this.getValueFromSortPath([o, columnSortParts]);
|
|
208
|
+
if (v)
|
|
209
|
+
return _.isString(v) ? v.trim() : v;
|
|
210
|
+
else
|
|
211
|
+
return null;
|
|
212
|
+
});
|
|
213
|
+
columns = _.sortBy(columns, (o) => {
|
|
214
|
+
var v = this.getValueFromSortPath([o, columnSortParts]);
|
|
215
|
+
if (v)
|
|
216
|
+
return _.isString(v) ? v.trim() : v;
|
|
217
|
+
else
|
|
218
|
+
return null;
|
|
219
|
+
});
|
|
220
|
+
inactiveWithParent = _.sortBy(inactiveWithParent, (o) => {
|
|
221
|
+
var v = this.getValueFromSortPath([o, columnSortParts]);
|
|
222
|
+
if (v)
|
|
223
|
+
return _.isString(v) ? v.trim() : v;
|
|
224
|
+
else
|
|
225
|
+
return null;
|
|
226
|
+
});
|
|
227
|
+
emptyParents = _.sortBy(emptyParents, (o) => {
|
|
228
|
+
var v = this.getValueFromSortPath([o, columnSortParts]);
|
|
229
|
+
if (v)
|
|
230
|
+
return _.isString(v) ? v.trim() : v;
|
|
231
|
+
else
|
|
232
|
+
return null;
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
if (this.cardSort) {
|
|
236
|
+
lockedColumns.forEach((column) => {
|
|
237
|
+
column.cards = this.cardSort(column.cards);
|
|
238
|
+
});
|
|
239
|
+
columns.forEach((column) => {
|
|
240
|
+
column.cards = this.cardSort(column.cards);
|
|
241
|
+
});
|
|
242
|
+
inactiveWithParent.forEach((column) => {
|
|
243
|
+
column.cards = this.cardSort(column.cards);
|
|
244
|
+
});
|
|
245
|
+
activeWithoutParent.forEach((column) => {
|
|
246
|
+
column.cards = this.cardSort(column.cards);
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
if (this.inactiveVisible)
|
|
250
|
+
columns = columns.concat(inactiveWithParent);
|
|
251
|
+
columns = columns.concat(emptyParents);
|
|
252
|
+
if (this.unassignedVisible && !this.unassignedLocked)
|
|
253
|
+
columns = columns.concat(activeWithoutParent);
|
|
254
|
+
if (this.unassignedVisible && this.unassignedLocked)
|
|
255
|
+
lockedColumns = columns.concat(lockedColumns);
|
|
256
|
+
this.lockedColumns = lockedColumns;
|
|
257
|
+
this.columns = columns;
|
|
258
|
+
setTimeout(() => {
|
|
259
|
+
this.clear();
|
|
260
|
+
new CardView(this.lockedColumns, this.columns);
|
|
261
|
+
if (revert) {
|
|
262
|
+
let columnElement = this.portal.querySelectorAll('.tru-card-portal-columns')[0];
|
|
263
|
+
let previousScrollPosition = localStorage.getItem('scroll_position' + uuidv4());
|
|
264
|
+
columnElement.scrollLeft = previousScrollPosition ? +previousScrollPosition : 0;
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
class CardView {
|
|
269
|
+
constructor(lockedColumns, columns) {
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TruCardColumn, deps: [{ token: i1.TruDataContext }, { token: i2.TruModelTypeLookup }], target: i0.ɵɵFactoryTarget.Component });
|
|
274
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.5", type: TruCardColumn, selector: "tru-card-column", inputs: { config: "config" }, viewQueries: [{ propertyName: "portal", first: true, predicate: [".tru-card-portal"], descendants: true }], ngImport: i0, template: "<div class=\"tru-card\">\r\n <div *ngIf=\"config.isBusy\"\r\n class=\"tru-card-busy-indicator\">\r\n <p>Searching for {{config.entityPluralLabel}}...</p>\r\n </div>\r\n <div *ngIf=\"config.busyMessage\"\r\n class=\"tru-card-busy-indicator\">\r\n <p>{{config.busyMessage}}</p>\r\n </div>\r\n <!--<tru-toolbar [config]=\"config.toolbarConfig\" class=\"main-toolbar {{config.searchPanelConfig.side}}\"></tru-toolbar>-->\r\n <div class=\"tru-card-portal\">\r\n <div [ngStyle]=\"{'width': ((config.width * lockedColumns.length) + (10 * lockedColumns.length - 1)) + 'px' }\"\r\n [ngClass]=\"{'tru-card-portal-locked-columns-divider': lockedColumns.length}\"\r\n *ngIf=\"lockedColumns.length\"\r\n class=\"tru-card-portal-locked-columns locked-columns\">\r\n\r\n </div>\r\n <div [ngStyle]=\"{'left': lockedColumns.length ? ((config.width * lockedColumns.length) + (10 * lockedColumns.length - 1) + 22) + 'px' : 0 }\"\r\n class=\"tru-card-portal-columns unlocked-columns\">\r\n\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".tru-card-busy-indicator{position:absolute;inset:25px 0 0;z-index:10000;background-color:transparent}.tru-card-busy-indicator p{position:relative;float:left;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff}.tru-card-filter{position:absolute;top:0;left:0;right:0;height:30px;line-height:30px;padding-left:10px}.tru-card-portal{position:absolute;inset:30px 10px 0;border:1px solid #ddd;padding:10px;background-color:#0079bf}.tru-card-portal-disabled>*{opacity:.75;pointer-events:none}.tru-card-portal-locked-columns{position:absolute;top:10px;left:0;bottom:0;padding:0 5px 10px 10px;display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-start}.tru-card-portal-locked-columns .tru-card-portal-column{margin-left:0;margin-bottom:0}.tru-card-portal-locked-columns .tru-card-portal-column:not(:first-child){margin-left:10px!important}.tru-card-portal-locked-columns-divider{border-right:1px solid #cdd2d4}.tru-card-portal-columns{position:absolute;inset:10px 10px 10px 222px;padding-top:0;display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-start;overflow-x:auto;overflow-y:hidden}.tru-card-portal-column{position:relative;border:1px solid #ddd;border-radius:4px;background:#e2e4e6;vertical-align:top;max-height:calc(100% + 8px);margin-left:10px;margin-bottom:10px;display:flex;flex-direction:column}.tru-card-portal-column-inactive *{font-style:italic;opacity:.7}.tru-card-portal-column-header{flex:0 0 auto;padding:5px;position:relative;min-height:18px}.tru-card-portal-column-header-extras{position:absolute;right:5px;top:4px}.tru-card-portal-column-header-extra-button{border-radius:3px;background:transparent}.tru-card-portal-column-header-extra-button:hover{border-radius:3px;background:#cdd2d4}.tru-card-portal-column-footer{flex:0 0 auto;padding:0 3px 3px;position:relative;height:25px;line-height:25px;display:none}.tru-card-portal-column-footer-text{font-size:14px;color:#777;padding-left:5px;text-decoration:none}.tru-card-portal-column-footer-text:hover{text-decoration:underline;color:#777}.tru-card-portal-column-footer-text:active,.tru-card-portal-column-footer-text:visited{color:#777}.tru-card-icon-small{color:#999;height:18px;font-size:14px;line-height:18px;width:19px;-webkit-font-smoothing:antialiased;display:inline-block!important;font-style:normal;font-weight:400;text-align:center;text-decoration:none;position:relative}.tru-card-portal-column-headertext{font-weight:700;font-size:16px;color:#333;padding-left:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:20px}} .tru-card-portal-column-headertext-hover:hover{text-decoration:underline}.tru-card-portal-card-scroll-port{overflow-y:auto;overflow-x:hidden}.tru-card-portal-card-container{margin:0 3px;padding:0 2px;height:37px;transition:all .4s ease-out;opacity:1}.tru-card-portal-card-container.show{opacity:1}.tru-card-portal-card-container *{pointer-events:none}.tru-card-portal-card{background-color:#fff;border:1px solid #fff;border-radius:3px;padding:2px 6px 2px 8px;position:relative;cursor:pointer;display:block;min-height:15px;text-decoration:none;z-index:0;outline:none;box-shadow:0 .5px #ccc}.tru-card-portal-card:hover{background-color:#efefef;border:1px solid #efefef}.tru-card-portal-card p{word-wrap:break-word}.tru-card-portal-card:focus{outline:none}.tru-card-portal-card.empty{border:1px dashed #999}.tru-card-placeholder{position:absolute;left:0;right:0;margin:0;z-index:100;border-color:#0079bf;border-top-style:dashed;border-bottom-style:dashed}.tru-card-selected{border-color:#52a8eccc!important;background-color:#52a8eccc!important}.tru-card-selected p{color:#000!important}.tru-card-menu{position:absolute;top:20px;right:0;background:#fff;border:1px #ccc solid;border-radius:3px;z-index:1;padding:7px;width:200px}.tru-card-menu hr{height:1px;border:1px #ccc solid;border-bottom:0;border-left:0;border-right:0;width:100%;margin:0;padding:0}.tru-card-menu a{color:#777;text-decoration:none;float:left;line-height:16px;margin-top:2px;margin-bottom:2px}.tru-card-menu span{color:#777;float:left;line-height:16px;margin-top:3px}.tru-card-menu a:hover{text-decoration:underline;color:#777}.tru-card-menu a:active,.tru-card-menu a:visited{color:#777}.tru-card-menu-move-container{width:100%!important;display:inline-flex}.tru-card-menu-move-container select{width:100%!important}.tru-card-menu-move-container a{margin-top:1px;margin-left:3px;display:block}.tru-card-menu-move-container span{color:#0079bf;margin-top:0}.tru-card-menu-move-container .move-button-disabled{pointer-events:none;opacity:.75}.tru-card-menu-move-container .move-button-disabled span{color:#ccc}.tru-card-portal-column-filtered,.tru-card-portal-card-filtered{display:none}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
|
|
275
|
+
}
|
|
276
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TruCardColumn, decorators: [{
|
|
277
|
+
type: Component,
|
|
278
|
+
args: [{ selector: 'tru-card-column', template: "<div class=\"tru-card\">\r\n <div *ngIf=\"config.isBusy\"\r\n class=\"tru-card-busy-indicator\">\r\n <p>Searching for {{config.entityPluralLabel}}...</p>\r\n </div>\r\n <div *ngIf=\"config.busyMessage\"\r\n class=\"tru-card-busy-indicator\">\r\n <p>{{config.busyMessage}}</p>\r\n </div>\r\n <!--<tru-toolbar [config]=\"config.toolbarConfig\" class=\"main-toolbar {{config.searchPanelConfig.side}}\"></tru-toolbar>-->\r\n <div class=\"tru-card-portal\">\r\n <div [ngStyle]=\"{'width': ((config.width * lockedColumns.length) + (10 * lockedColumns.length - 1)) + 'px' }\"\r\n [ngClass]=\"{'tru-card-portal-locked-columns-divider': lockedColumns.length}\"\r\n *ngIf=\"lockedColumns.length\"\r\n class=\"tru-card-portal-locked-columns locked-columns\">\r\n\r\n </div>\r\n <div [ngStyle]=\"{'left': lockedColumns.length ? ((config.width * lockedColumns.length) + (10 * lockedColumns.length - 1) + 22) + 'px' : 0 }\"\r\n class=\"tru-card-portal-columns unlocked-columns\">\r\n\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".tru-card-busy-indicator{position:absolute;inset:25px 0 0;z-index:10000;background-color:transparent}.tru-card-busy-indicator p{position:relative;float:left;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff}.tru-card-filter{position:absolute;top:0;left:0;right:0;height:30px;line-height:30px;padding-left:10px}.tru-card-portal{position:absolute;inset:30px 10px 0;border:1px solid #ddd;padding:10px;background-color:#0079bf}.tru-card-portal-disabled>*{opacity:.75;pointer-events:none}.tru-card-portal-locked-columns{position:absolute;top:10px;left:0;bottom:0;padding:0 5px 10px 10px;display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-start}.tru-card-portal-locked-columns .tru-card-portal-column{margin-left:0;margin-bottom:0}.tru-card-portal-locked-columns .tru-card-portal-column:not(:first-child){margin-left:10px!important}.tru-card-portal-locked-columns-divider{border-right:1px solid #cdd2d4}.tru-card-portal-columns{position:absolute;inset:10px 10px 10px 222px;padding-top:0;display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-start;overflow-x:auto;overflow-y:hidden}.tru-card-portal-column{position:relative;border:1px solid #ddd;border-radius:4px;background:#e2e4e6;vertical-align:top;max-height:calc(100% + 8px);margin-left:10px;margin-bottom:10px;display:flex;flex-direction:column}.tru-card-portal-column-inactive *{font-style:italic;opacity:.7}.tru-card-portal-column-header{flex:0 0 auto;padding:5px;position:relative;min-height:18px}.tru-card-portal-column-header-extras{position:absolute;right:5px;top:4px}.tru-card-portal-column-header-extra-button{border-radius:3px;background:transparent}.tru-card-portal-column-header-extra-button:hover{border-radius:3px;background:#cdd2d4}.tru-card-portal-column-footer{flex:0 0 auto;padding:0 3px 3px;position:relative;height:25px;line-height:25px;display:none}.tru-card-portal-column-footer-text{font-size:14px;color:#777;padding-left:5px;text-decoration:none}.tru-card-portal-column-footer-text:hover{text-decoration:underline;color:#777}.tru-card-portal-column-footer-text:active,.tru-card-portal-column-footer-text:visited{color:#777}.tru-card-icon-small{color:#999;height:18px;font-size:14px;line-height:18px;width:19px;-webkit-font-smoothing:antialiased;display:inline-block!important;font-style:normal;font-weight:400;text-align:center;text-decoration:none;position:relative}.tru-card-portal-column-headertext{font-weight:700;font-size:16px;color:#333;padding-left:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:20px}} .tru-card-portal-column-headertext-hover:hover{text-decoration:underline}.tru-card-portal-card-scroll-port{overflow-y:auto;overflow-x:hidden}.tru-card-portal-card-container{margin:0 3px;padding:0 2px;height:37px;transition:all .4s ease-out;opacity:1}.tru-card-portal-card-container.show{opacity:1}.tru-card-portal-card-container *{pointer-events:none}.tru-card-portal-card{background-color:#fff;border:1px solid #fff;border-radius:3px;padding:2px 6px 2px 8px;position:relative;cursor:pointer;display:block;min-height:15px;text-decoration:none;z-index:0;outline:none;box-shadow:0 .5px #ccc}.tru-card-portal-card:hover{background-color:#efefef;border:1px solid #efefef}.tru-card-portal-card p{word-wrap:break-word}.tru-card-portal-card:focus{outline:none}.tru-card-portal-card.empty{border:1px dashed #999}.tru-card-placeholder{position:absolute;left:0;right:0;margin:0;z-index:100;border-color:#0079bf;border-top-style:dashed;border-bottom-style:dashed}.tru-card-selected{border-color:#52a8eccc!important;background-color:#52a8eccc!important}.tru-card-selected p{color:#000!important}.tru-card-menu{position:absolute;top:20px;right:0;background:#fff;border:1px #ccc solid;border-radius:3px;z-index:1;padding:7px;width:200px}.tru-card-menu hr{height:1px;border:1px #ccc solid;border-bottom:0;border-left:0;border-right:0;width:100%;margin:0;padding:0}.tru-card-menu a{color:#777;text-decoration:none;float:left;line-height:16px;margin-top:2px;margin-bottom:2px}.tru-card-menu span{color:#777;float:left;line-height:16px;margin-top:3px}.tru-card-menu a:hover{text-decoration:underline;color:#777}.tru-card-menu a:active,.tru-card-menu a:visited{color:#777}.tru-card-menu-move-container{width:100%!important;display:inline-flex}.tru-card-menu-move-container select{width:100%!important}.tru-card-menu-move-container a{margin-top:1px;margin-left:3px;display:block}.tru-card-menu-move-container span{color:#0079bf;margin-top:0}.tru-card-menu-move-container .move-button-disabled{pointer-events:none;opacity:.75}.tru-card-menu-move-container .move-button-disabled span{color:#ccc}.tru-card-portal-column-filtered,.tru-card-portal-card-filtered{display:none}\n"] }]
|
|
279
|
+
}], ctorParameters: () => [{ type: i1.TruDataContext }, { type: i2.TruModelTypeLookup }], propDecorators: { config: [{
|
|
280
|
+
type: Input
|
|
281
|
+
}], portal: [{
|
|
282
|
+
type: ViewChild,
|
|
283
|
+
args: ['.tru-card-portal', { static: false }]
|
|
284
|
+
}] } });
|
|
285
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1LWNhcmQtY29sdW1uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1LWNvbW1vbi1saWIvc3JjL2xpYi9jb21wb25lbnRzL2NhcmQtY29sdW1uL3RydS1jYXJkLWNvbHVtbi50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydS1jb21tb24tbGliL3NyYy9saWIvY29tcG9uZW50cy9jYXJkLWNvbHVtbi90cnUtY2FyZC1jb2x1bW4uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxLQUFLLENBQUMsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7QUFVcEMsTUFBTSxPQUFPLGFBQWE7SUFzQ2Q7SUFDQTtJQXRDRCxNQUFNLENBQU07SUFFNkIsTUFBTSxDQUFrQjtJQUVsRSxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUM7SUFDOUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ3RCLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUN0QyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDeEMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztJQUNoRCxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFDcEMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ3BDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFD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WUFDWixZQUFZLGFBQWtCLEVBQUUsT0FBWTtZQUU1QyxDQUFDO1NBQ0Y7SUFDSCxDQUFDO3VHQTNTVSxhQUFhOzJGQUFiLGFBQWEsaU1DYjFCLG9qQ0F1QkE7OzJGRFZhLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsaUJBQWlCO29IQUtsQixNQUFNO3NCQUFkLEtBQUs7Z0JBRTRDLE1BQU07c0JBQXZELFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAndW5kZXJzY29yZSc7XHJcbmltcG9ydCB7IGJyZWV6ZSB9IGZyb20gJ2JyZWV6ZS1jbGllbnQnO1xyXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcclxuaW1wb3J0IHsgVHJ1RGF0YUNvbnRleHQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cnUtZGF0YS1jb250ZXh0JztcclxuaW1wb3J0IHsgVHJ1RW50aXR5QmFzZSB9IGZyb20gJy4uLy4uL2Jhc2UtY2xhc3Nlcy90cnUtZW50aXR5LWJhc2UnO1xyXG5pbXBvcnQgeyBUcnVNb2RlbFR5cGVMb29rdXAgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cnUtbW9kZWwtdHlwZS1sb29rdXAnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0cnUtY2FyZC1jb2x1bW4nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90cnUtY2FyZC1jb2x1bW4uaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdHJ1LWNhcmQtY29sdW1uLmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcnVDYXJkQ29sdW1uIHtcclxuICBASW5wdXQoKSBjb25maWchOiBhbnlcclxuXHJcbiAgQFZpZXdDaGlsZCgnLnRydS1jYXJkLXBvcnRhbCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwb3J0YWwhOiBIVE1MRGl2RWxlbWVudDtcclxuXHJcbiAgcHJpdmF0ZSBwYXJlbnRUYWJsZU5hbWUgPSB0aGlzLmNvbmZpZy5wYXJlbnRUYWJsZU5hbWU7XHJcbiAgcHJpdmF0ZSBrZXkgPSB0aGlzLmNvbmZpZy5rZXk7XHJcbiAgcHJpdmF0ZSBwYXJlbnRRdWVyeSA9IHRoaXMuY29uZmlnLnBhcmVudFF1ZXJ5O1xyXG4gIHByaXZhdGUgbG9ja1Byb3BlcnR5ID0gdGhpcy5jb25maWcubG9ja1Byb3BlcnR5O1xyXG4gIHByaXZhdGUgZW50aXR5UGx1cmFsTmFtZSA9IHRoaXMuY29uZmlnLmVudGl0eVBsdXJhbE5hbWU7XHJcbiAgcHJpdmF0ZSBlbnRpdHlOYW1lID0gdGhpcy5jb25maWcuZW50aXR5TmFtZTtcclxuICBwcml2YXRlIGNvbHVtblNvcnQgPSB0aGlzLmNvbmZpZy5jb2x1bW5Tb3J0O1xyXG4gIHByaXZhdGUgY2FyZFNvcnQgPSB0aGlzLmNvbmZpZy5jYXJkU29ydDtcclxuICBwcml2YXRlIGNvbG9yID0gdGhpcy5jb25maWcuY29sb3I7XHJcblxyXG4gIHByaXZhdGUgdW5hc3NpZ25lZFZpc2libGUgPSB0aGlzLmNvbmZpZy51bmFzc2lnbmVkVmlzaWJsZTtcclxuICBwcml2YXRlIHVuYXNzaWduZWROYW1lID0gdGhpcy5jb25maWcudW5hc3NpZ25lZE5hbWU7XHJcbiAgcHJpdmF0ZSB1bmFzc2lnbmVkTG9ja2VkID0gdGhpcy5jb25maWcudW5hc3NpZ25lZExvY2tlZDtcclxuICBwcml2YXRlIHVuYXNzaWduZWRDb2xvciA9IHRoaXMuY29uZmlnLnVuYXNzaWduZWRDb2xvcjtcclxuICBwcml2YXRlIHVuYXNzaWduZWREcmFnZ2FibGUgPSB0aGlzLmNvbmZpZy51bmFzc2lnbmVkRHJhZ2dhYmxlO1xyXG4gIHByaXZhdGUgdW5hc3NpZ25lZERyb3BwYWJsZSA9IHRoaXMuY29uZmlnLnVuYXNzaWduZWREcm9wcGFibGU7XHJcblxyXG4gIHByaXZhdGUgaW5hY3RpdmVWaXNpYmxlID0gdGhpcy5jb25maWcuaW5hY3RpdmVWaXNpYmxlO1xyXG4gIHByaXZhdGUgaW5hY3RpdmVEcmFnZ2FibGUgPSB0aGlzLmNvbmZpZy5pbmFjdGl2ZURyYWdnYWJsZTtcclxuICBwcml2YXRlIGluYWN0aXZlRHJvcHBhYmxlID0gdGhpcy5jb25maWcuaW5hY3RpdmVEcm9wcGFibGU7XHJcblxyXG4gIHByaXZhdGUgcmVsYXRlZFBhcmVudE5hbWU7XHJcbiAgcHJpdmF0ZSByZWxhdGVkQ2hpbGROYW1lO1xyXG4gIHByaXZhdGUgaW5zZXJ0QmVmb3JlOiBhbnk7XHJcbiAgcHJpdmF0ZSBzZWxlY3RlZENhcmRzID0gW107XHJcbiAgcHJpdmF0ZSBjb2x1bW5GaWx0ZXJSZWZzID0gW107XHJcbiAgcHJpdmF0ZSBjYXJkRmlsdGVyU3RyOiBhbnk7XHJcbiAgcHJpdmF0ZSB1bmlxdWVJZDtcclxuXHJcbiAgY29sdW1uczogYW55O1xyXG4gIGxvY2tlZENvbHVtbnM6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGRhdGFDb250ZXh0OiBUcnVEYXRhQ29udGV4dCxcclxuICAgIHByaXZhdGUgbW9kZWxUeXBlTG9va3VwOiBUcnVNb2RlbFR5cGVMb29rdXApIHtcclxuXHJcbiAgICBsZXQgaW5kZXggPSB0aGlzLmtleS5sYXN0SW5kZXhPZih0aGlzLnBhcmVudFRhYmxlTmFtZSk7XHJcbiAgICBsZXQgcHJlZml4ID0gdGhpcy5rZXkuc3Vic3RyaW5nKGluZGV4LCAtMSk7XHJcbiAgICBpZiAocHJlZml4KSB7XHJcbiAgICAgIHRoaXMucmVsYXRlZFBhcmVudE5hbWUgPSBwcmVmaXggKyB0aGlzLnBhcmVudFRhYmxlTmFtZTtcclxuICAgICAgdGhpcy5yZWxhdGVkQ2hpbGROYW1lID0gcHJlZml4ICsgdGhpcy5lbnRpdHlQbHVyYWxOYW1lO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZWxhdGVkUGFyZW50TmFtZSA9IHRoaXMucGFyZW50VGFibGVOYW1lO1xyXG4gICAgICB0aGlzLnJlbGF0ZWRDaGlsZE5hbWUgPSB0aGlzLmVudGl0eVBsdXJhbE5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51bmlxdWVJZCA9IHV1aWR2NCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXJlbnRUYWJsZU1vZGVsID0gbnVsbDsvL2RhdGFTZXJ2aWNlLm1vZGVsLnRhYmxlc1twYXJlbnRUYWJsZU5hbWVdO1xyXG4gIHByaXZhdGUgdXNlckhhc1BhcmVudFRhYmxlUm9sZSA9IG51bGw7IC8vcGFyZW50VGFibGVNb2RlbC5jYW5EaXNwbGF5O1xyXG5cclxuICBwcml2YXRlIGNyZWF0ZURhdGFGb3JFbnRpdHkgPSAoZW50aXR5OiBUcnVFbnRpdHlCYXNlKSA9PiB7XHJcbiAgICB2YXIgZGF0YSA9IHRoaXMuY29uZmlnLmNyZWF0ZURhdGEoZW50aXR5KTtcclxuICAgIGRhdGEuJGVudGl0eSA9IGVudGl0eTtcclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgaGFzVW5kZWZpbmVkQ2hpbGRyZW4gPSAoZW50aXR5OiBUcnVFbnRpdHlCYXNlKSA9PiB7XHJcbiAgICB0eXBlIEVudGl0eU9iamVjdEtleSA9IGtleW9mIHR5cGVvZiBlbnRpdHk7XHJcbiAgICBjb25zdCBlbnRpdHlQcm9wZXJ0eU5hbWUgPSAnbycgKyB0aGlzLnJlbGF0ZWRDaGlsZE5hbWUgYXMgRW50aXR5T2JqZWN0S2V5O1xyXG4gICAgcmV0dXJuICFlbnRpdHlbZW50aXR5UHJvcGVydHlOYW1lXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFzRW1wdHlDaGlsZHJlbiA9IChlbnRpdHk6IFRydUVudGl0eUJhc2UpID0+IHtcclxuICAgIHR5cGUgRW50aXR5T2JqZWN0S2V5ID0ga2V5b2YgdHlwZW9mIGVudGl0eTtcclxuICAgIGNvbnN0IGVudGl0eVByb3BlcnR5TmFtZSA9ICdvJyArIHRoaXMucmVsYXRlZENoaWxkTmFtZSBhcyBFbnRpdHlPYmplY3RLZXk7XHJcbiAgICByZXR1cm4gIWVudGl0eVtlbnRpdHlQcm9wZXJ0eU5hbWVdLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFzSW5hY3RpdmVDaGlsZHJlbiA9IChlbnRpdHk6IFRydUVudGl0eUJhc2UpID0+IHtcclxuICAgIHR5cGUgRW50aXR5T2JqZWN0S2V5ID0ga2V5b2YgdHlwZW9mIGVudGl0eTtcclxuICAgIGNvbnN0IGVudGl0eVByb3BlcnR5TmFtZSA9ICdvJyArIHRoaXMucmVsYXRlZENoaWxkTmFtZSBhcyBFbnRpdHlPYmplY3RLZXk7XHJcbiAgICByZXR1cm4gXy5ldmVyeShbZW50aXR5UHJvcGVydHlOYW1lXSwgKGNoaWxkOiBhbnkpID0+IHsgcmV0dXJuICFjaGlsZC5hY3RpdmU7IH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNBZGRlZFVuc2F2ZWRDaGlsZHJlbiA9IChlbnRpdGllczogQXJyYXk8VHJ1RW50aXR5QmFzZT4sIHBhcmVudFJlZjogbnVtYmVyKSA9PiB7XHJcbiAgICByZXR1cm4gXy5zb21lKGVudGl0aWVzLCAoZW50aXR5OiBUcnVFbnRpdHlCYXNlKSA9PiB7XHJcbiAgICAgIHR5cGUgRW50aXR5T2JqZWN0S2V5ID0ga2V5b2YgdHlwZW9mIGVudGl0eTtcclxuICAgICAgY29uc3QgZW50aXR5UHJvcGVydHlOYW1lID0gdGhpcy5rZXkgYXMgRW50aXR5T2JqZWN0S2V5O1xyXG4gICAgICByZXR1cm4gZW50aXR5W2VudGl0eVByb3BlcnR5TmFtZV0gPT09IHBhcmVudFJlZlxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyID0gKCkgPT4ge1xyXG4gICAgdmFyIGxvY2tlZENvbHVtbnMgPSB0aGlzLnBvcnRhbC5xdWVyeVNlbGVjdG9yQWxsKCcubG9ja2VkLWNvbHVtbnMnKVswXTtcclxuICAgIHZhciB1bmxvY2tlZENvbHVtbnMgPSB0aGlzLnBvcnRhbC5xdWVyeVNlbGVjdG9yQWxsKCcudW5sb2NrZWQtY29sdW1ucycpWzBdO1xyXG5cclxuICAgIHdoaWxlIChsb2NrZWRDb2x1bW5zICYmIGxvY2tlZENvbHVtbnMubGFzdENoaWxkKSB7IGxvY2tlZENvbHVtbnMucmVtb3ZlQ2hpbGQobG9ja2VkQ29sdW1ucy5sYXN0Q2hpbGQpOyB9O1xyXG4gICAgd2hpbGUgKHVubG9ja2VkQ29sdW1ucyAmJiB1bmxvY2tlZENvbHVtbnMubGFzdENoaWxkKSB7IHVubG9ja2VkQ29sdW1ucy5yZW1vdmVDaGlsZCh1bmxvY2tlZENvbHVtbnMubGFzdENoaWxkKTsgfVxyXG4gICAgd2hpbGUgKHRoaXMuc2VsZWN0ZWRDYXJkcy5sZW5ndGgpIHsgdGhpcy5zZWxlY3RlZENhcmRzLnBvcCgpOyB9O1xyXG4gICAgdGhpcy5jb25maWcub25TZWxlY3Rpb25DaGFuZ2VkKFtdKTtcclxuICAgIHRoaXMuY29uZmlnLmNsZWFyRmlsdGVycygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRWYWx1ZUZyb21Tb3J0UGF0aCA9IChhcmdzOiBbYW55LCBzdHJpbmdbXV0pOiBhbnkgPT4ge1xyXG4gICAgbGV0IGN1cnJlbnQ6IGFueSA9IGFyZ3NbMF07XHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYXJnc1sxXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcGFydE5hbWU6IHN0cmluZztcclxuICAgICAgaWYgKGkgIT09IGFyZ3NbMV0ubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIHBhcnROYW1lID0gJ28nICsgYXJnc1sxXVtpXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJ0TmFtZSA9IGFyZ3NbMV1baV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjdXJyZW50W3BhcnROYW1lXSkge1xyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnROYW1lXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUl0ZW1zU291cmNlKG5ld0VudGl0aWVzOiBBcnJheTxhbnk+LCByZXZlcnQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuY2xlYXIoKTtcclxuICAgIGlmICghcmV2ZXJ0KVxyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc2Nyb2xsX3Bvc2l0aW9uJyArIHV1aWR2NCgpLCAnMCcpO1xyXG5cclxuICAgIGlmIChuZXdFbnRpdGllcy5sZW5ndGgpXHJcbiAgICAgIHRoaXMuY29uZmlnLmJ1c3lNZXNzYWdlID0gJ1JlbmRlcmluZy4uLic7XHJcblxyXG4gICAgdGhpcy5jb2x1bW5GaWx0ZXJSZWZzID0gW107XHJcbiAgICB0aGlzLmNhcmRGaWx0ZXJTdHIgPSBudWxsO1xyXG5cclxuICAgIGlmICghbmV3RW50aXRpZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMubG9ja2VkQ29sdW1ucyA9IFtdO1xyXG4gICAgICB0aGlzLmNvbHVtbnMgPSBbXTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBsb2NrZWRDb2x1bW5zOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICBsZXQgZW1wdHlQYXJlbnRzOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICBsZXQgY29sdW1uczogQXJyYXk8YW55PiA9IFtdO1xyXG5cclxuICAgIGxldCBxdWVyeSA9IG5ldyBicmVlemUuRW50aXR5UXVlcnkoJ1F1ZXJ5JyArIHRoaXMucGFyZW50VGFibGVOYW1lKTtcclxuXHJcbiAgICB2YXIgcmVsYXRlZENoaWxkUHJvcGVydHkgPSAnbycgKyB0aGlzLnJlbGF0ZWRDaGlsZE5hbWU7XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLmN1c3RvbUNhcmRDb2x1bW5RdWVyeUZhY3RvcnkpXHJcbiAgICAgIHF1ZXJ5ID0gdGhpcy5jb25maWcuY3VzdG9tQ2FyZENvbHVtblF1ZXJ5RmFjdG9yeShxdWVyeSwgcmVsYXRlZENoaWxkUHJvcGVydHkpO1xyXG4gICAgZWxzZVxyXG4gICAgICBxdWVyeSA9IHF1ZXJ5LmV4cGFuZCgnbycgKyB0aGlzLnJlbGF0ZWRDaGlsZE5hbWUpO1xyXG5cclxuICAgIC8vaWYgKHRoaXMucGFyZW50UXVlcnkpXHJcbiAgICAvLyAgcXVlcnkgPSBxdWVyaWVzW3RoaXMucGFyZW50UXVlcnldKHF1ZXJ5KTtcclxuXHJcbiAgICB0aGlzLmRhdGFDb250ZXh0LmVudGl0eUFjY2VzcygpLmN1c3RvbVNlYXJjaCh0aGlzLm1vZGVsVHlwZUxvb2t1cC5nZXRUeXBlKHRoaXMucGFyZW50VGFibGVOYW1lKSwgcXVlcnkpLnN1YnNjcmliZSgocGFyZW50cykgPT4ge1xyXG4gICAgICB0aGlzLmNvbmZpZy5hZGRQYXJlbnRzVG9GaWx0ZXIocGFyZW50cyk7XHJcblxyXG4gICAgICBlbXB0eVBhcmVudHMgPSBfLmZpbHRlcihwYXJlbnRzLCAocGFyZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzVW5kZWZpbmVkQ2hpbGRyZW4ocGFyZW50KSB8fCB0aGlzLmhhc0VtcHR5Q2hpbGRyZW4ocGFyZW50KSB8fCB0aGlzLmhhc0luYWN0aXZlQ2hpbGRyZW4ocGFyZW50KSkge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0FkZGVkVW5zYXZlZENoaWxkcmVuKG5ld0VudGl0aWVzLCBwYXJlbnQuUmVmKSkge1xyXG4gICAgICAgICAgICBwYXJlbnRbJ2NhcmRzJ10gPSBbXTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICAgIGxldCBxdWVyeWFibGVQYXJlbnRSZWZzID0gXy5wbHVjayhwYXJlbnRzLCB0aGlzLmtleSlcclxuXHJcbiAgICAgIGxldCBpbmFjdGl2ZVdpdGhQYXJlbnQ6IEFycmF5PGFueT4gPSBbXTtcclxuICAgICAgbGV0IGFjdGl2ZVdpdGhvdXRQYXJlbnQ6IEFycmF5PGFueT4gPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdW5hc3NpZ25lZDogdHJ1ZSxcclxuICAgICAgICAgIGNhcmRzOiBbXVxyXG4gICAgICAgIH1cclxuICAgICAgXTtcclxuXHJcbiAgICAgIHBhcmVudHMuZm9yRWFjaCgocGFyZW50OiBhbnkpID0+IHtcclxuICAgICAgICBwYXJlbnRbJ2NhcmRzJ10gPSBbXTtcclxuICAgICAgICBpZiAocXVlcnlhYmxlUGFyZW50UmVmcy5pbmRleE9mKHBhcmVudFt0aGlzLmtleV0pICE9PSAtMSkge1xyXG4gICAgICAgICAgaWYgKHBhcmVudFt0aGlzLmxvY2tQcm9wZXJ0eV0pIHtcclxuICAgICAgICAgICAgbG9ja2VkQ29sdW1ucy5wdXNoKHBhcmVudCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKCFwYXJlbnRbdGhpcy5sb2NrUHJvcGVydHldICYmICFfLmNvbnRhaW5zKGVtcHR5UGFyZW50cywgcGFyZW50KSkge1xyXG4gICAgICAgICAgICBjb2x1bW5zLnB1c2gocGFyZW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcGFyZW50WydpbmFjdGl2ZSddID0gdHJ1ZTtcclxuICAgICAgICAgIGluYWN0aXZlV2l0aFBhcmVudC5wdXNoKHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIG5ld0VudGl0aWVzLmZvckVhY2goKGVudGl0eSkgPT4ge1xyXG4gICAgICAgIHZhciBlbnRpdHlQYXJlbnQgPSBfLmZpbmQocGFyZW50cywgKHApID0+IHtcclxuICAgICAgICAgIGlmIChlbnRpdHlbJ28nICsgdGhpcy5yZWxhdGVkUGFyZW50TmFtZV0pXHJcbiAgICAgICAgICAgIHJldHVybiBwLlJlZiA9PT0gZW50aXR5WydvJyArIHRoaXMucmVsYXRlZFBhcmVudE5hbWVdLlJlZjtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGVudGl0eVBhcmVudCkge1xyXG4gICAgICAgICAgaWYgKHF1ZXJ5YWJsZVBhcmVudFJlZnMuaW5kZXhPZihlbnRpdHlQYXJlbnRbdGhpcy5rZXldKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgZW50aXR5UGFyZW50LmNhcmRzLnB1c2godGhpcy5jcmVhdGVEYXRhRm9yRW50aXR5KGVudGl0eSkpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZW50aXR5UGFyZW50LmNhcmRzLnB1c2godGhpcy5jcmVhdGVEYXRhRm9yRW50aXR5KGVudGl0eSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAhZW50aXR5UGFyZW50ICYmXHJcbiAgICAgICAgICBlbnRpdHlbJ28nICsgdGhpcy5yZWxhdGVkUGFyZW50TmFtZV0gJiZcclxuICAgICAgICAgIGVudGl0eVsnbycgKyB0aGlzLnJlbGF0ZWRQYXJlbnROYW1lXS5SZWYgPiAwKSB7XHJcbiAgICAgICAgICBsZXQgaW5hY3RpdmVQYXJlbnQgPSBlbnRpdHlbJ28nICsgdGhpcy5yZWxhdGVkUGFyZW50TmFtZV07XHJcbiAgICAgICAgICBpZiAoaW5hY3RpdmVXaXRoUGFyZW50LmluZGV4T2YoaW5hY3RpdmVQYXJlbnQpID09PSAtMSkge1xyXG4gICAgICAgICAgICBpbmFjdGl2ZVBhcmVudFsnY2FyZHMnXSA9IFtdO1xyXG4gICAgICAgICAgICBpbmFjdGl2ZVBhcmVudFsnaW5hY3RpdmUnXSA9IHRydWU7XHJcbiAgICAgICAgICAgIGluYWN0aXZlV2l0aFBhcmVudC5wdXNoKGluYWN0aXZlUGFyZW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGluYWN0aXZlUGFyZW50LmNhcmRzLnB1c2godGhpcy5jcmVhdGVEYXRhRm9yRW50aXR5KGVudGl0eSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhY3RpdmVXaXRob3V0UGFyZW50WzBdLmNhcmRzLnB1c2godGhpcy5jcmVhdGVEYXRhRm9yRW50aXR5KGVudGl0eSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5jb2x1bW5Tb3J0KSB7XHJcbiAgICAgICAgdmFyIGNvbHVtblNvcnRQYXJ0cyA9IHRoaXMuY29sdW1uU29ydC5zcGxpdCgnLycpO1xyXG5cclxuICAgICAgICBsb2NrZWRDb2x1bW5zID0gXy5zb3J0QnkobG9ja2VkQ29sdW1ucywgKG8pID0+IHtcclxuICAgICAgICAgIHZhciB2ID0gdGhpcy5nZXRWYWx1ZUZyb21Tb3J0UGF0aChbbywgY29sdW1uU29ydFBhcnRzXSk7XHJcbiAgICAgICAgICBpZiAodilcclxuICAgICAgICAgICAgcmV0dXJuIF8uaXNTdHJpbmcodikgPyB2LnRyaW0oKSA6IHY7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbHVtbnMgPSBfLnNvcnRCeShjb2x1bW5zLCAobykgPT4ge1xyXG4gICAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlRnJvbVNvcnRQYXRoKFtvLCBjb2x1bW5Tb3J0UGFydHNdKTtcclxuICAgICAgICAgIGlmICh2KVxyXG4gICAgICAgICAgICByZXR1cm4gXy5pc1N0cmluZyh2KSA/IHYudHJpbSgpIDogdjtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaW5hY3RpdmVXaXRoUGFyZW50ID0gXy5zb3J0QnkoaW5hY3RpdmVXaXRoUGFyZW50LCAobykgPT4ge1xyXG4gICAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlRnJvbVNvcnRQYXRoKFtvLCBjb2x1bW5Tb3J0UGFydHNdKTtcclxuICAgICAgICAgIGlmICh2KVxyXG4gICAgICAgICAgICByZXR1cm4gXy5pc1N0cmluZyh2KSA/IHYudHJpbSgpIDogdjtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZW1wdHlQYXJlbnRzID0gXy5zb3J0QnkoZW1wdHlQYXJlbnRzLCAobykgPT4ge1xyXG4gICAgICAgICAgdmFyIHYgPSB0aGlzLmdldFZhbHVlRnJvbVNvcnRQYXRoKFtvLCBjb2x1bW5Tb3J0UGFydHNdKTtcclxuICAgICAgICAgIGlmICh2KVxyXG4gICAgICAgICAgICByZXR1cm4gXy5pc1N0cmluZyh2KSA/IHYudHJpbSgpIDogdjtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmNhcmRTb3J0KSB7XHJcbiAgICAgICAgbG9ja2VkQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICAgIGNvbHVtbi5jYXJkcyA9IHRoaXMuY2FyZFNvcnQoY29sdW1uLmNhcmRzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICAgIGNvbHVtbi5jYXJkcyA9IHRoaXMuY2FyZFNvcnQoY29sdW1uLmNhcmRzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaW5hY3RpdmVXaXRoUGFyZW50LmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgY29sdW1uLmNhcmRzID0gdGhpcy5jYXJkU29ydChjb2x1bW4uY2FyZHMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBhY3RpdmVXaXRob3V0UGFyZW50LmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgY29sdW1uLmNhcmRzID0gdGhpcy5jYXJkU29ydChjb2x1bW4uY2FyZHMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pbmFjdGl2ZVZpc2libGUpXHJcbiAgICAgICAgY29sdW1ucyA9IGNvbHVtbnMuY29uY2F0KGluYWN0aXZlV2l0aFBhcmVudCk7XHJcblxyXG4gICAgICBjb2x1bW5zID0gY29sdW1ucy5jb25jYXQoZW1wdHlQYXJlbnRzKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnVuYXNzaWduZWRWaXNpYmxlICYmICF0aGlzLnVuYXNzaWduZWRMb2NrZWQpXHJcbiAgICAgICAgY29sdW1ucyA9IGNvbHVtbnMuY29uY2F0KGFjdGl2ZVdpdGhvdXRQYXJlbnQpO1xyXG5cclxuICAgICAgaWYgKHRoaXMudW5hc3NpZ25lZFZpc2libGUgJiYgdGhpcy51bmFzc2lnbmVkTG9ja2VkKVxyXG4gICAgICAgIGxvY2tlZENvbHVtbnMgPSBjb2x1bW5zLmNvbmNhdChsb2NrZWRDb2x1bW5zKTtcclxuXHJcbiAgICAgIHRoaXMubG9ja2VkQ29sdW1ucyA9IGxvY2tlZENvbHVtbnM7XHJcbiAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgICAgbmV3IENhcmRWaWV3KHRoaXMubG9ja2VkQ29sdW1ucywgdGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAgICAgaWYgKHJldmVydCkge1xyXG4gICAgICAgICAgbGV0IGNvbHVtbkVsZW1lbnQgPSB0aGlzLnBvcnRhbC5xdWVyeVNlbGVjdG9yQWxsKCcudHJ1LWNhcmQtcG9ydGFsLWNvbHVtbnMnKVswXTtcclxuICAgICAgICAgIGxldCBwcmV2aW91c1Njcm9sbFBvc2l0aW9uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Njcm9sbF9wb3NpdGlvbicgKyB1dWlkdjQoKSk7XHJcbiAgICAgICAgICBjb2x1bW5FbGVtZW50LnNjcm9sbExlZnQgPSBwcmV2aW91c1Njcm9sbFBvc2l0aW9uID8gK3ByZXZpb3VzU2Nyb2xsUG9zaXRpb24gOiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjbGFzcyBDYXJkVmlldyB7XHJcbiAgICAgIGNvbnN0cnVjdG9yKGxvY2tlZENvbHVtbnM6IGFueSwgY29sdW1uczogYW55KSB7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJ0cnUtY2FyZFwiPlxyXG4gIDxkaXYgKm5nSWY9XCJjb25maWcuaXNCdXN5XCJcclxuICAgICAgIGNsYXNzPVwidHJ1LWNhcmQtYnVzeS1pbmRpY2F0b3JcIj5cclxuICAgIDxwPlNlYXJjaGluZyBmb3Ige3tjb25maWcuZW50aXR5UGx1cmFsTGFiZWx9fS4uLjwvcD5cclxuICA8L2Rpdj5cclxuICA8ZGl2ICpuZ0lmPVwiY29uZmlnLmJ1c3lNZXNzYWdlXCJcclxuICAgICAgIGNsYXNzPVwidHJ1LWNhcmQtYnVzeS1pbmRpY2F0b3JcIj5cclxuICAgIDxwPnt7Y29uZmlnLmJ1c3lNZXNzYWdlfX08L3A+XHJcbiAgPC9kaXY+XHJcbiAgPCEtLTx0cnUtdG9vbGJhciBbY29uZmlnXT1cImNvbmZpZy50b29sYmFyQ29uZmlnXCIgY2xhc3M9XCJtYWluLXRvb2xiYXIge3tjb25maWcuc2VhcmNoUGFuZWxDb25maWcuc2lkZX19XCI+PC90cnUtdG9vbGJhcj4tLT5cclxuICA8ZGl2IGNsYXNzPVwidHJ1LWNhcmQtcG9ydGFsXCI+XHJcbiAgICA8ZGl2IFtuZ1N0eWxlXT1cInsnd2lkdGgnOiAoKGNvbmZpZy53aWR0aCAqIGxvY2tlZENvbHVtbnMubGVuZ3RoKSArICgxMCAqIGxvY2tlZENvbHVtbnMubGVuZ3RoIC0gMSkpICsgJ3B4JyB9XCJcclxuICAgICAgICAgW25nQ2xhc3NdPVwieyd0cnUtY2FyZC1wb3J0YWwtbG9ja2VkLWNvbHVtbnMtZGl2aWRlcic6IGxvY2tlZENvbHVtbnMubGVuZ3RofVwiXHJcbiAgICAgICAgICpuZ0lmPVwibG9ja2VkQ29sdW1ucy5sZW5ndGhcIlxyXG4gICAgICAgICBjbGFzcz1cInRydS1jYXJkLXBvcnRhbC1sb2NrZWQtY29sdW1ucyBsb2NrZWQtY29sdW1uc1wiPlxyXG5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBbbmdTdHlsZV09XCJ7J2xlZnQnOiBsb2NrZWRDb2x1bW5zLmxlbmd0aCA/ICgoY29uZmlnLndpZHRoICogbG9ja2VkQ29sdW1ucy5sZW5ndGgpICsgKDEwICogbG9ja2VkQ29sdW1ucy5sZW5ndGggLSAxKSArIDIyKSArICdweCcgOiAwIH1cIlxyXG4gICAgICAgICBjbGFzcz1cInRydS1jYXJkLXBvcnRhbC1jb2x1bW5zIHVubG9ja2VkLWNvbHVtbnNcIj5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|