@wavemaker/app-ng-runtime 11.4.0-next.25701 → 11.4.0-next.25703
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.
- app-ng-runtime/build-task/basic/tree/tree.build.d.ts +2 -1
- app-ng-runtime/build-task/bundles/index.umd.js +9 -7
- app-ng-runtime/build-task/bundles/index.umd.js.map +1 -1
- app-ng-runtime/build-task/esm2015/basic/tree/tree.build.js +4 -3
- app-ng-runtime/build-task/esm2015/navigation/popover/popover.build.js +3 -3
- app-ng-runtime/build-task/fesm2015/index.js +9 -7
- app-ng-runtime/build-task/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/base/bundles/index.umd.js +3 -6
- app-ng-runtime/components/base/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/base/esm2015/utils/widget-utils.js +4 -7
- app-ng-runtime/components/base/fesm2015/index.js +3 -6
- app-ng-runtime/components/base/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/base/utils/widget-utils.d.ts +1 -1
- app-ng-runtime/components/basic/tree/bundles/index.umd.js +256 -280
- app-ng-runtime/components/basic/tree/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/basic/tree/esm2015/public_api.js +2 -2
- app-ng-runtime/components/basic/tree/esm2015/tree.directive.js +310 -0
- app-ng-runtime/components/basic/tree/esm2015/tree.module.js +3 -3
- app-ng-runtime/components/basic/tree/fesm2015/index.js +248 -260
- app-ng-runtime/components/basic/tree/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/basic/tree/index.metadata.json +1 -1
- app-ng-runtime/components/basic/tree/public_api.d.ts +1 -1
- app-ng-runtime/components/basic/tree/tree.directive.d.ts +35 -0
- app-ng-runtime/components/data/list/bundles/index.umd.js +4 -28
- app-ng-runtime/components/data/list/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/data/list/esm2015/list.component.js +5 -29
- app-ng-runtime/components/data/list/fesm2015/index.js +4 -28
- app-ng-runtime/components/data/list/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/data/list/index.metadata.json +1 -1
- app-ng-runtime/components/dialogs/default/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/dialogs/default/esm2015/base-dialog.js +1 -1
- app-ng-runtime/components/dialogs/default/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/dialogs/default/index.metadata.json +1 -1
- app-ng-runtime/components/input/epoch/bundles/index.umd.js +21 -39
- app-ng-runtime/components/input/epoch/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/input/epoch/esm2015/base-date-time.component.js +25 -43
- app-ng-runtime/components/input/epoch/esm2015/date/date.component.js +3 -3
- app-ng-runtime/components/input/epoch/esm2015/date-time/date-time.component.js +2 -2
- app-ng-runtime/components/input/epoch/fesm2015/index.js +27 -45
- app-ng-runtime/components/input/epoch/fesm2015/index.js.map +1 -1
- app-ng-runtime/components/input/epoch/index.metadata.json +1 -1
- app-ng-runtime/components/navigation/popover/bundles/index.umd.js +4 -3
- app-ng-runtime/components/navigation/popover/bundles/index.umd.js.map +1 -1
- app-ng-runtime/components/navigation/popover/esm2015/popover.component.js +6 -5
- app-ng-runtime/components/navigation/popover/fesm2015/index.js +5 -4
- app-ng-runtime/components/navigation/popover/fesm2015/index.js.map +1 -1
- app-ng-runtime/package.json +1 -1
- app-ng-runtime/scripts/datatable/datatable.js +23 -23
- app-ng-runtime/variables/bundles/index.umd.js +4 -14
- app-ng-runtime/variables/bundles/index.umd.js.map +1 -1
- app-ng-runtime/variables/esm2015/manager/action/notification-action.manager.js +6 -5
- app-ng-runtime/variables/esm2015/service/variables.service.js +1 -8
- app-ng-runtime/variables/fesm2015/index.js +5 -11
- app-ng-runtime/variables/fesm2015/index.js.map +1 -1
- app-ng-runtime/variables/index.metadata.json +1 -1
- app-ng-runtime/variables/service/variables.service.d.ts +0 -4
- app-ng-runtime/components/basic/tree/esm2015/tree.component.js +0 -322
- app-ng-runtime/components/basic/tree/tree.component.d.ts +0 -34
- app-ng-runtime/scripts/tree-keyboard-navigation/keyboard-navigation.js +0 -251
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import { Attribute, Directive, Injector } from '@angular/core';
|
|
2
|
+
import { $appDigest, $parseEvent, $parseExpr, getClonedObject } from '@wm/core';
|
|
3
|
+
import { APPLY_STYLES_TYPE, getEvaluatedData, getOrderedDataset, provideAsWidgetRef, StylableComponent, styler } from '@wm/components/base';
|
|
4
|
+
import { registerProps } from './tree.props';
|
|
5
|
+
const defaultTreeIconClass = 'plus-minus';
|
|
6
|
+
const ICON_CLASSES = {
|
|
7
|
+
'folder': {
|
|
8
|
+
'expanded': 'wi-folder-open',
|
|
9
|
+
'collapsed': 'wi-folder'
|
|
10
|
+
},
|
|
11
|
+
'circle-plus-minus': {
|
|
12
|
+
'expanded': 'wi-remove-circle-outline',
|
|
13
|
+
'collapsed': 'wi-add-circle-outline'
|
|
14
|
+
},
|
|
15
|
+
'chevron': {
|
|
16
|
+
'expanded': 'wi-keyboard-arrow-down',
|
|
17
|
+
'collapsed': 'wi-keyboard-arrow-right'
|
|
18
|
+
},
|
|
19
|
+
'menu': {
|
|
20
|
+
'expanded': 'wi-arrow-down',
|
|
21
|
+
'collapsed': 'wi-arrow-right'
|
|
22
|
+
},
|
|
23
|
+
'triangle': {
|
|
24
|
+
'expanded': 'wi-arrow-drop-down-circle',
|
|
25
|
+
'collapsed': 'wi-play-circle-filled'
|
|
26
|
+
},
|
|
27
|
+
'expand-collapse': {
|
|
28
|
+
'expanded': 'wi-expand-less',
|
|
29
|
+
'collapsed': 'wi-expand-more'
|
|
30
|
+
},
|
|
31
|
+
'plus-minus': {
|
|
32
|
+
'expanded': 'wi-minus',
|
|
33
|
+
'collapsed': 'wi-plus'
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const WIDGET_INFO = { widgetType: 'wm-tree', hostClass: 'app-tree' };
|
|
37
|
+
export class TreeDirective extends StylableComponent {
|
|
38
|
+
constructor(inj, binddatavalue, bindnodelabel, bindnodeicon, bindnodechildren, bindnodeid) {
|
|
39
|
+
super(inj, WIDGET_INFO);
|
|
40
|
+
this.binddatavalue = binddatavalue;
|
|
41
|
+
this.bindnodelabel = bindnodelabel;
|
|
42
|
+
this.bindnodeicon = bindnodeicon;
|
|
43
|
+
this.bindnodechildren = bindnodechildren;
|
|
44
|
+
this.bindnodeid = bindnodeid;
|
|
45
|
+
styler(this.nativeElement, this, APPLY_STYLES_TYPE.CONTAINER);
|
|
46
|
+
this.bindEvents();
|
|
47
|
+
}
|
|
48
|
+
onPropertyChange(key, nv, ov) {
|
|
49
|
+
switch (key) {
|
|
50
|
+
case 'dataset':
|
|
51
|
+
this.nodes = this.getNodes(nv);
|
|
52
|
+
this._selectNode = undefined;
|
|
53
|
+
this.renderTree();
|
|
54
|
+
break;
|
|
55
|
+
case 'nodeicon':
|
|
56
|
+
case 'nodelabel':
|
|
57
|
+
case 'nodechildren':
|
|
58
|
+
case 'orderby':
|
|
59
|
+
this.renderTree();
|
|
60
|
+
break;
|
|
61
|
+
case 'treeicons':
|
|
62
|
+
this.changeTreeIcons(nv, ov);
|
|
63
|
+
break;
|
|
64
|
+
case 'datavalue':
|
|
65
|
+
this.selectById(nv);
|
|
66
|
+
break;
|
|
67
|
+
default:
|
|
68
|
+
super.onPropertyChange(key, nv, ov);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
constructNodes(nodes, parent, levels, deep, _evalDataValue) {
|
|
72
|
+
const $ul = $('<ul></ul>');
|
|
73
|
+
const _iconClses = ICON_CLASSES[this.treeicons || defaultTreeIconClass];
|
|
74
|
+
const _expr = (this.binddatavalue || this.datavalue);
|
|
75
|
+
let _iconCls, _cls;
|
|
76
|
+
_cls = levels > 0 ? ' expanded ' : ' collapsed ';
|
|
77
|
+
_iconCls = _cls + (levels > 0 ? _iconClses.expanded : _iconClses.collapsed);
|
|
78
|
+
deep = deep || 0;
|
|
79
|
+
parent.append($ul);
|
|
80
|
+
nodes.forEach((node, idx) => {
|
|
81
|
+
const $li = $('<li></li>'), $iconNode = $('<i></i>'), nodeLabel = getEvaluatedData(node, { field: this.nodelabel, bindExpression: this.bindnodelabel }, this.viewParent) || node.label, nodeIcon = getEvaluatedData(node, { field: this.nodeicon, bindExpression: this.bindnodeicon }, this.viewParent) || node.icon, nodeChildren = getEvaluatedData(node, { field: this.nodechildren, bindExpression: this.bindnodechildren }, this.viewParent) || node.children;
|
|
82
|
+
let nodeIdValue = getEvaluatedData(node, { field: this.nodeid, bindExpression: this.bindnodeid }, this.viewParent);
|
|
83
|
+
if (nodeIdValue === undefined) {
|
|
84
|
+
nodeIdValue = node.children;
|
|
85
|
+
}
|
|
86
|
+
let isNodeMatched = false, expandCollapseIcon;
|
|
87
|
+
$li.data('nodedata', node)
|
|
88
|
+
.append($iconNode)
|
|
89
|
+
.append(`<span class="title">${nodeLabel}</span>`)
|
|
90
|
+
.appendTo($ul);
|
|
91
|
+
// if datavalue(ie, expr) is provided select the tree node accordingly
|
|
92
|
+
// if datavalue === 'FirstNode' -- select the FirstNode at level 0
|
|
93
|
+
// if datavalue === 'LastNode' -- select the LastNode at level 0
|
|
94
|
+
// if datavalue is a bind expression evaluate the expression for each node of the tree till the condition is satisfied.
|
|
95
|
+
// if node identifier is present then verify the datavalue is bound expr or static value and compare with the node model
|
|
96
|
+
if (this.bindnodeid || this.nodeid) {
|
|
97
|
+
isNodeMatched = this.binddatavalue ? nodeIdValue === _evalDataValue : nodeIdValue === _expr;
|
|
98
|
+
if (nodeIdValue !== undefined) {
|
|
99
|
+
$li.attr('id', nodeIdValue);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else if (this.binddatavalue) { // evaluate the expression only if it is bound (useExpression)
|
|
103
|
+
isNodeMatched = !!$parseExpr(_expr)(this, node);
|
|
104
|
+
}
|
|
105
|
+
// Perform LastNode check only at level 0.(ie, deep = 0);
|
|
106
|
+
if (!this._selectNode) {
|
|
107
|
+
if ((_expr === 'FirstNode' && idx === 0)
|
|
108
|
+
|| (!deep && _expr === 'LastNode' && idx === nodes.length - 1)
|
|
109
|
+
|| isNodeMatched) {
|
|
110
|
+
// save a reference of the node to be selected in `_selectNode`
|
|
111
|
+
this._selectNode = $li;
|
|
112
|
+
this.datavalue = nodeIdValue;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (nodeIcon) {
|
|
116
|
+
$iconNode.addClass(nodeIcon);
|
|
117
|
+
}
|
|
118
|
+
if (nodeChildren && nodeChildren.length) { // parent node
|
|
119
|
+
$li.addClass(`parent-node ${_cls}`);
|
|
120
|
+
expandCollapseIcon = $(`<i class="wi ${_iconCls}"></i>`);
|
|
121
|
+
if (nodeIcon) {
|
|
122
|
+
$iconNode.addClass(nodeIcon);
|
|
123
|
+
}
|
|
124
|
+
$li.prepend(expandCollapseIcon);
|
|
125
|
+
this.constructNodes(nodeChildren, $li, levels - 1, deep + 1, _evalDataValue);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
if (!nodeIcon) {
|
|
129
|
+
$iconNode.addClass('leaf-node');
|
|
130
|
+
}
|
|
131
|
+
$li.addClass('leaf-node');
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
getNodesFromString(value) {
|
|
136
|
+
return value.split(',').map((item) => {
|
|
137
|
+
return {
|
|
138
|
+
'label': item && item.trim()
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
getNodes(newVal) {
|
|
143
|
+
let nodes;
|
|
144
|
+
if (_.isString(newVal) && !_.isEmpty(newVal)) {
|
|
145
|
+
newVal = newVal.trim();
|
|
146
|
+
if (newVal) {
|
|
147
|
+
nodes = this.getNodesFromString(newVal);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else if (_.isArray(newVal)) {
|
|
151
|
+
newVal = getOrderedDataset(newVal, this.orderby);
|
|
152
|
+
nodes = newVal;
|
|
153
|
+
}
|
|
154
|
+
else if (_.isObject(newVal)) {
|
|
155
|
+
nodes = [newVal];
|
|
156
|
+
}
|
|
157
|
+
return nodes;
|
|
158
|
+
}
|
|
159
|
+
changeTreeIcons(nv, ov) {
|
|
160
|
+
const $el = $(this.nativeElement);
|
|
161
|
+
nv = nv || defaultTreeIconClass;
|
|
162
|
+
ov = ov || defaultTreeIconClass;
|
|
163
|
+
$el.find('i.expanded').removeClass(ICON_CLASSES[ov].expanded).addClass(ICON_CLASSES[nv].expanded);
|
|
164
|
+
$el.find('i.collapsed').removeClass(ICON_CLASSES[ov].collapsed).addClass(ICON_CLASSES[nv].collapsed);
|
|
165
|
+
}
|
|
166
|
+
toggleExpandCollapseNode($event, $i, $li) {
|
|
167
|
+
const treeIcons = ICON_CLASSES[this.treeicons || defaultTreeIconClass];
|
|
168
|
+
const $liPath = this.findSelectedNodeParent($li);
|
|
169
|
+
let path = '';
|
|
170
|
+
// construct the path of the node
|
|
171
|
+
$liPath
|
|
172
|
+
.each((i, el) => {
|
|
173
|
+
const current = $(el).children('.title').text();
|
|
174
|
+
path = `/${current + path}`;
|
|
175
|
+
});
|
|
176
|
+
const eventParams = {
|
|
177
|
+
'$event': $event,
|
|
178
|
+
"$item": $li.data('nodedata'),
|
|
179
|
+
"$path": path
|
|
180
|
+
};
|
|
181
|
+
if ($i.hasClass('collapsed')) {
|
|
182
|
+
$i.removeClass(`collapsed ${treeIcons.collapsed}`).addClass(`expanded ${treeIcons.expanded}`);
|
|
183
|
+
$li.removeClass('collapsed').addClass('expanded');
|
|
184
|
+
this.invokeEventCallback('expand', eventParams);
|
|
185
|
+
}
|
|
186
|
+
else if ($i.hasClass('expanded')) {
|
|
187
|
+
$i.removeClass(`expanded ${treeIcons.expanded}`).addClass(`collapsed ${treeIcons.collapsed}`);
|
|
188
|
+
$li.removeClass('expanded').addClass('collapsed');
|
|
189
|
+
this.invokeEventCallback('collapse', eventParams);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
renderTree(forceRender) {
|
|
193
|
+
let docFrag, $li, $liPath, data, path = '';
|
|
194
|
+
const levels = +this.nativeElement.getAttribute('levels') || 0, $el = $(this.nativeElement);
|
|
195
|
+
$el.empty();
|
|
196
|
+
if (forceRender) {
|
|
197
|
+
this._selectNode = undefined;
|
|
198
|
+
}
|
|
199
|
+
if (this.nodes && this.nodes.length) {
|
|
200
|
+
docFrag = document.createDocumentFragment();
|
|
201
|
+
this.constructNodes(this.nodes, $(docFrag), levels, 0, this.datavalue);
|
|
202
|
+
$el.append(docFrag);
|
|
203
|
+
}
|
|
204
|
+
if (this._selectNode) {
|
|
205
|
+
$li = this._selectNode;
|
|
206
|
+
$li.addClass('selected');
|
|
207
|
+
data = $li.data('nodedata');
|
|
208
|
+
$liPath = this.findSelectedNodeParent($li);
|
|
209
|
+
if (!$liPath.length) {
|
|
210
|
+
$liPath = $li;
|
|
211
|
+
}
|
|
212
|
+
$liPath
|
|
213
|
+
.each((i, el) => {
|
|
214
|
+
const $current = $(el), $i = $current.children('i.collapsed'), $title = $current.children('.title');
|
|
215
|
+
this.toggleExpandCollapseNode(undefined, $i, $current);
|
|
216
|
+
path = `/${$title.text() + path}`;
|
|
217
|
+
});
|
|
218
|
+
this.selecteditem = getClonedObject(data) || {};
|
|
219
|
+
this.selecteditem.path = path;
|
|
220
|
+
this.invokeEventCallback('select', { $event: undefined, $item: data, $path: path });
|
|
221
|
+
$appDigest();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
selectNode(evt, value) {
|
|
225
|
+
const target = evt && $(evt.target), $el = $(this.nativeElement), $li = _.isObject(value) ? value : $el.find(`li[id="${value}"]`).first();
|
|
226
|
+
let data, path = '', $liPath, nodeAction;
|
|
227
|
+
$el.find('.selected').removeClass('selected');
|
|
228
|
+
if (!$li.length) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
$li.addClass('selected');
|
|
232
|
+
data = $li.data('nodedata');
|
|
233
|
+
nodeAction = data[this.nodeaction || 'action'];
|
|
234
|
+
// if the selectNode is initiated by click event then use the nativeElement target from event
|
|
235
|
+
$liPath = target ? target.parents('.app-tree li') : this.findSelectedNodeParent($li);
|
|
236
|
+
// construct the path of the node
|
|
237
|
+
$liPath
|
|
238
|
+
.each((i, el) => {
|
|
239
|
+
const current = $(el).children('.title').text();
|
|
240
|
+
path = `/${current + path}`;
|
|
241
|
+
});
|
|
242
|
+
// expand the current node till the viewParent level which is collapsed
|
|
243
|
+
$li.parentsUntil($el, 'li.parent-node.collapsed')
|
|
244
|
+
.each((index, el) => {
|
|
245
|
+
const $current = $(el), $i = $current.children('i.collapsed');
|
|
246
|
+
this.toggleExpandCollapseNode(undefined, $i, $current);
|
|
247
|
+
});
|
|
248
|
+
this.selecteditem = getClonedObject(data) || {};
|
|
249
|
+
this.selecteditem.path = path;
|
|
250
|
+
if (target) {
|
|
251
|
+
if (this.nodeid || this.bindnodeid) {
|
|
252
|
+
this.datavalue = getEvaluatedData(data, { field: this.nodeid, bindExpression: this.bindnodeid }, this.viewParent);
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
this.datavalue = getClonedObject(data) || {};
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
this.datavalue = value;
|
|
260
|
+
}
|
|
261
|
+
//[Todo-CSP]: this data will be dynamic, can not generate function upfront
|
|
262
|
+
if (nodeAction) {
|
|
263
|
+
$parseEvent(nodeAction)(this);
|
|
264
|
+
}
|
|
265
|
+
this.invokeEventCallback('select', { $event: evt, $item: data, $path: path });
|
|
266
|
+
$appDigest();
|
|
267
|
+
}
|
|
268
|
+
// click event is added on the host nativeElement
|
|
269
|
+
bindEvents() {
|
|
270
|
+
$(this.nativeElement).on('click', (evt) => {
|
|
271
|
+
const target = $(evt.target), li = target.closest('li'), $i = target.is('i') ? target : target.siblings('i.collapsed,i.expanded');
|
|
272
|
+
evt.stopPropagation();
|
|
273
|
+
if (target.is('span.title')) { // select the node only if it is nodelabel
|
|
274
|
+
this.selecteditem = {};
|
|
275
|
+
this.selectNode(evt, li);
|
|
276
|
+
}
|
|
277
|
+
if (target.is('i') || (target.is('span.title') && this.nodeclick === 'expand')) {
|
|
278
|
+
this.toggleExpandCollapseNode(evt, $i, li);
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
findSelectedNodeParent($li) {
|
|
283
|
+
return $li.find('> span.title').parents('.app-tree li');
|
|
284
|
+
}
|
|
285
|
+
selectById(value) {
|
|
286
|
+
this.selectNode(undefined, value);
|
|
287
|
+
}
|
|
288
|
+
deselectById(value) {
|
|
289
|
+
this.selecteditem = {};
|
|
290
|
+
this.selectById();
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
TreeDirective.initializeProps = registerProps();
|
|
294
|
+
TreeDirective.decorators = [
|
|
295
|
+
{ type: Directive, args: [{
|
|
296
|
+
selector: 'div[wmTree]',
|
|
297
|
+
providers: [
|
|
298
|
+
provideAsWidgetRef(TreeDirective)
|
|
299
|
+
]
|
|
300
|
+
},] }
|
|
301
|
+
];
|
|
302
|
+
TreeDirective.ctorParameters = () => [
|
|
303
|
+
{ type: Injector },
|
|
304
|
+
{ type: undefined, decorators: [{ type: Attribute, args: ['datavalue.bind',] }] },
|
|
305
|
+
{ type: undefined, decorators: [{ type: Attribute, args: ['nodelabel.bind',] }] },
|
|
306
|
+
{ type: undefined, decorators: [{ type: Attribute, args: ['nodeicon.bind',] }] },
|
|
307
|
+
{ type: undefined, decorators: [{ type: Attribute, args: ['nodechildren.bind',] }] },
|
|
308
|
+
{ type: undefined, decorators: [{ type: Attribute, args: ['nodeid.bind',] }] }
|
|
309
|
+
];
|
|
310
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvYmFzaWMvdHJlZS9zcmMvdHJlZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVJLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHN0MsTUFBTSxvQkFBb0IsR0FBRyxZQUFZLENBQUM7QUFDMUMsTUFBTSxZQUFZLEdBQUc7SUFDakIsUUFBUSxFQUFFO1FBQ04sVUFBVSxFQUFHLGdCQUFnQjtRQUM3QixXQUFXLEVBQUUsV0FBVztLQUMzQjtJQUNELG1CQUFtQixFQUFFO1FBQ2pCLFVBQVUsRUFBRywwQkFBMEI7UUFDdkMsV0FBVyxFQUFFLHVCQUF1QjtLQUN2QztJQUNELFNBQVMsRUFBRTtRQUNQLFVBQVUsRUFBRyx3QkFBd0I7UUFDckMsV0FBVyxFQUFFLHlCQUF5QjtLQUN6QztJQUNELE1BQU0sRUFBRTtRQUNKLFVBQVUsRUFBRyxlQUFlO1FBQzVCLFdBQVcsRUFBRSxnQkFBZ0I7S0FDaEM7SUFDRCxVQUFVLEVBQUU7UUFDUixVQUFVLEVBQUcsMkJBQTJCO1FBQ3hDLFdBQVcsRUFBRSx1QkFBdUI7S0FDdkM7SUFDRCxpQkFBaUIsRUFBRTtRQUNmLFVBQVUsRUFBRyxnQkFBZ0I7UUFDN0IsV0FBVyxFQUFFLGdCQUFnQjtLQUNoQztJQUNE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Z0JBQWdCOzRDQUMxQixTQUFTLFNBQUMsZUFBZTs0Q0FDekIsU0FBUyxTQUFDLG1CQUFtQjs0Q0FDN0IsU0FBUyxTQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdHRyaWJ1dGUsIERpcmVjdGl2ZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgJGFwcERpZ2VzdCwgJHBhcnNlRXZlbnQsICRwYXJzZUV4cHIsIGdldENsb25lZE9iamVjdCB9IGZyb20gJ0B3bS9jb3JlJztcblxuaW1wb3J0IHsgQVBQTFlfU1RZTEVTX1RZUEUsIGdldEV2YWx1YXRlZERhdGEsIGdldE9yZGVyZWREYXRhc2V0LCBwcm92aWRlQXNXaWRnZXRSZWYsIFN0eWxhYmxlQ29tcG9uZW50LCBzdHlsZXIgfSBmcm9tICdAd20vY29tcG9uZW50cy9iYXNlJztcbmltcG9ydCB7IHJlZ2lzdGVyUHJvcHMgfSBmcm9tICcuL3RyZWUucHJvcHMnO1xuXG5kZWNsYXJlIGNvbnN0IF8sICQ7XG5jb25zdCBkZWZhdWx0VHJlZUljb25DbGFzcyA9ICdwbHVzLW1pbnVzJztcbmNvbnN0IElDT05fQ0xBU1NFUyA9IHtcbiAgICAnZm9sZGVyJzoge1xuICAgICAgICAnZXhwYW5kZWQnIDogJ3dpLWZvbGRlci1vcGVuJyxcbiAgICAgICAgJ2NvbGxhcHNlZCc6ICd3aS1mb2xkZXInXG4gICAgfSxcbiAgICAnY2lyY2xlLXBsdXMtbWludXMnOiB7XG4gICAgICAgICdleHBhbmRlZCcgOiAnd2ktcmVtb3ZlLWNpcmNsZS1vdXRsaW5lJyxcbiAgICAgICAgJ2NvbGxhcHNlZCc6ICd3aS1hZGQtY2lyY2xlLW91dGxpbmUnXG4gICAgfSxcbiAgICAnY2hldnJvbic6IHtcbiAgICAgICAgJ2V4cGFuZGVkJyA6ICd3aS1rZXlib2FyZC1hcnJvdy1kb3duJyxcbiAgICAgICAgJ2NvbGxhcHNlZCc6ICd3aS1rZXlib2FyZC1hcnJvdy1yaWdodCdcbiAgICB9LFxuICAgICdtZW51Jzoge1xuICAgICAgICAnZXhwYW5kZWQnIDogJ3dpLWFycm93LWRvd24nLFxuICAgICAgICAnY29sbGFwc2VkJzogJ3dpLWFycm93LXJpZ2h0J1xuICAgIH0sXG4gICAgJ3RyaWFuZ2xlJzoge1xuICAgICAgICAnZXhwYW5kZWQnIDogJ3dpLWFycm93LWRyb3AtZG93bi1jaXJjbGUnLFxuICAgICAgICAnY29sbGFwc2VkJzogJ3dpLXBsYXktY2lyY2xlLWZpbGxlZCdcbiAgICB9LFxuICAgICdleHBhbmQtY29sbGFwc2UnOiB7XG4gICAgICAgICdleHBhbmRlZCcgOiAnd2ktZXhwYW5kLWxlc3MnLFxuICAgICAgICAnY29sbGFwc2VkJzogJ3dpLWV4cGFuZC1tb3JlJ1xuICAgIH0sXG4gICAgJ3BsdXMtbWludXMnOiB7XG4gICAgICAgICdleHBhbmRlZCcgOiAnd2ktbWludXMnLFxuICAgICAgICAnY29sbGFwc2VkJzogJ3dpLXBsdXMnXG4gICAgfVxufTtcblxuY29uc3QgV0lER0VUX0lORk8gPSB7d2lkZ2V0VHlwZTogJ3dtLXRyZWUnLCBob3N0Q2xhc3M6ICdhcHAtdHJlZSd9O1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ2Rpdlt3bVRyZWVdJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzV2lkZ2V0UmVmKFRyZWVEaXJlY3RpdmUpXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBUcmVlRGlyZWN0aXZlIGV4dGVuZHMgU3R5bGFibGVDb21wb25lbnQge1xuICAgIHN0YXRpYyBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlclByb3BzKCk7XG5cbiAgICBwcml2YXRlIF9zZWxlY3ROb2RlOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIG5vZGVzOiBBcnJheTxhbnk+O1xuXG4gICAgcHVibGljIGRhdGF2YWx1ZTogc3RyaW5nO1xuICAgIHB1YmxpYyB0cmVlaWNvbnM6IHN0cmluZztcbiAgICBwdWJsaWMgc2VsZWN0ZWRpdGVtOiBhbnk7XG4gICAgcHVibGljIG5vZGVpZDogc3RyaW5nO1xuICAgIHB1YmxpYyBub2RlYWN0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIG5vZGVjbGljazogc3RyaW5nO1xuICAgIHB1YmxpYyBub2RlbGFiZWw6IHN0cmluZztcbiAgICBwdWJsaWMgbm9kZWljb246IHN0cmluZztcbiAgICBwdWJsaWMgbm9kZWNoaWxkcmVuOiBzdHJpbmc7XG4gICAgcHVibGljIG9yZGVyYnk6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBpbmo6IEluamVjdG9yLFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhdmFsdWUuYmluZCcpIHByaXZhdGUgYmluZGRhdGF2YWx1ZSxcbiAgICAgICAgQEF0dHJpYnV0ZSgnbm9kZWxhYmVsLmJpbmQnKSBwcml2YXRlIGJpbmRub2RlbGFiZWwsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ25vZGVpY29uLmJpbmQnKSBwcml2YXRlIGJpbmRub2RlaWNvbixcbiAgICAgICAgQEF0dHJpYnV0ZSgnbm9kZWNoaWxkcmVuLmJpbmQnKSBwcml2YXRlIGJpbmRub2RlY2hpbGRyZW4sXG4gICAgICAgIEBBdHRyaWJ1dGUoJ25vZGVpZC5iaW5kJykgcHJpdmF0ZSBiaW5kbm9kZWlkXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluaiwgV0lER0VUX0lORk8pO1xuICAgICAgICBzdHlsZXIodGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzLCBBUFBMWV9TVFlMRVNfVFlQRS5DT05UQUlORVIpO1xuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICB9XG5cbiAgICBvblByb3BlcnR5Q2hhbmdlKGtleTogc3RyaW5nLCBudjogYW55LCBvdj86IGFueSkge1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnZGF0YXNldCc6XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlcyA9IHRoaXMuZ2V0Tm9kZXMobnYpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdE5vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUcmVlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdub2RlaWNvbic6XG4gICAgICAgICAgICBjYXNlICdub2RlbGFiZWwnOlxuICAgICAgICAgICAgY2FzZSAnbm9kZWNoaWxkcmVuJzpcbiAgICAgICAgICAgIGNhc2UgJ29yZGVyYnknOlxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVHJlZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndHJlZWljb25zJzpcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVRyZWVJY29ucyhudiwgb3YpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF0YXZhbHVlJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEJ5SWQobnYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBzdXBlci5vblByb3BlcnR5Q2hhbmdlKGtleSwgbnYsIG92KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY29uc3RydWN0Tm9kZXMobm9kZXMsIHBhcmVudCwgbGV2ZWxzLCBkZWVwLCBfZXZhbERhdGFWYWx1ZSkge1xuXG4gICAgICAgIGNvbnN0ICR1bCA9ICQoJzx1bD48L3VsPicpO1xuICAgICAgICBjb25zdCBfaWNvbkNsc2VzID0gSUNPTl9DTEFTU0VTW3RoaXMudHJlZWljb25zIHx8IGRlZmF1bHRUcmVlSWNvbkNsYXNzXTtcbiAgICAgICAgY29uc3QgX2V4cHIgPSAodGhpcy5iaW5kZGF0YXZhbHVlIHx8IHRoaXMuZGF0YXZhbHVlKTtcblxuICAgICAgICBsZXQgX2ljb25DbHMsIF9jbHM7XG5cbiAgICAgICAgX2NscyAgICAgPSBsZXZlbHMgPiAwID8gJyBleHBhbmRlZCAnIDogJyBjb2xsYXBzZWQgJztcbiAgICAgICAgX2ljb25DbHMgPSBfY2xzICsgKGxldmVscyA+IDAgPyBfaWNvbkNsc2VzLmV4cGFuZGVkIDogX2ljb25DbHNlcy5jb2xsYXBzZWQpO1xuXG4gICAgICAgIGRlZXAgPSBkZWVwIHx8IDA7XG5cbiAgICAgICAgcGFyZW50LmFwcGVuZCgkdWwpO1xuICAgICAgICBub2Rlcy5mb3JFYWNoKChub2RlLCBpZHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0ICRsaSA9ICQoJzxsaT48L2xpPicpLFxuICAgICAgICAgICAgICAgICRpY29uTm9kZSA9ICQoJzxpPjwvaT4nKSxcbiAgICAgICAgICAgICAgICBub2RlTGFiZWwgPSBnZXRFdmFsdWF0ZWREYXRhKG5vZGUsIHtmaWVsZDogdGhpcy5ub2RlbGFiZWwsIGJpbmRFeHByZXNzaW9uOiB0aGlzLmJpbmRub2RlbGFiZWx9LCB0aGlzLnZpZXdQYXJlbnQpIHx8IG5vZGUubGFiZWwsXG4gICAgICAgICAgICAgICAgbm9kZUljb24gPSBnZXRFdmFsdWF0ZWREYXRhKG5vZGUsIHtmaWVsZDogdGhpcy5ub2RlaWNvbiwgYmluZEV4cHJlc3Npb246IHRoaXMuYmluZG5vZGVpY29ufSwgdGhpcy52aWV3UGFyZW50KSB8fCBub2RlLmljb24sXG4gICAgICAgICAgICAgICAgbm9kZUNoaWxkcmVuID0gZ2V0RXZhbHVhdGVkRGF0YShub2RlLCB7ZmllbGQ6IHRoaXMubm9kZWNoaWxkcmVuLCBiaW5kRXhwcmVzc2lvbjogdGhpcy5iaW5kbm9kZWNoaWxkcmVufSwgdGhpcy52aWV3UGFyZW50KSB8fCBub2RlLmNoaWxkcmVuO1xuICAgICAgICAgICAgbGV0IG5vZGVJZFZhbHVlID0gZ2V0RXZhbHVhdGVkRGF0YShub2RlLCB7ZmllbGQ6IHRoaXMubm9kZWlkLCBiaW5kRXhwcmVzc2lvbjogdGhpcy5iaW5kbm9kZWlkfSwgdGhpcy52aWV3UGFyZW50KTtcbiAgICAgICAgICAgIGlmIChub2RlSWRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbm9kZUlkVmFsdWUgPSBub2RlLmNoaWxkcmVuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgaXNOb2RlTWF0Y2hlZCA9IGZhbHNlLFxuICAgICAgICAgICAgICAgIGV4cGFuZENvbGxhcHNlSWNvbjtcblxuICAgICAgICAgICAgJGxpLmRhdGEoJ25vZGVkYXRhJywgbm9kZSlcbiAgICAgICAgICAgICAgICAuYXBwZW5kKCRpY29uTm9kZSlcbiAgICAgICAgICAgICAgICAuYXBwZW5kKGA8c3BhbiBjbGFzcz1cInRpdGxlXCI+JHtub2RlTGFiZWx9PC9zcGFuPmApXG4gICAgICAgICAgICAgICAgLmFwcGVuZFRvKCR1bCk7XG5cblxuICAgICAgICAgICAgLy8gaWYgZGF0YXZhbHVlKGllLCBleHByKSBpcyBwcm92aWRlZCBzZWxlY3QgdGhlIHRyZWUgbm9kZSBhY2NvcmRpbmdseVxuICAgICAgICAgICAgLy8gaWYgZGF0YXZhbHVlID09PSAnRmlyc3ROb2RlJyAtLSBzZWxlY3QgdGhlIEZpcnN0Tm9kZSBhdCBsZXZlbCAwXG4gICAgICAgICAgICAvLyBpZiBkYXRhdmFsdWUgPT09ICdMYXN0Tm9kZScgLS0gc2VsZWN0IHRoZSBMYXN0Tm9kZSBhdCBsZXZlbCAwXG4gICAgICAgICAgICAvLyBpZiBkYXRhdmFsdWUgaXMgYSBiaW5kIGV4cHJlc3Npb24gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gZm9yIGVhY2ggbm9kZSBvZiB0aGUgdHJlZSB0aWxsIHRoZSBjb25kaXRpb24gaXMgc2F0aXNmaWVkLlxuXG4gICAgICAgICAgICAvLyBpZiBub2RlIGlkZW50aWZpZXIgaXMgcHJlc2VudCB0aGVuIHZlcmlmeSB0aGUgZGF0YXZhbHVlIGlzIGJvdW5kIGV4cHIgb3Igc3RhdGljIHZhbHVlIGFuZCBjb21wYXJlIHdpdGggdGhlIG5vZGUgbW9kZWxcbiAgICAgICAgICAgIGlmICh0aGlzLmJpbmRub2RlaWQgfHwgdGhpcy5ub2RlaWQpIHtcbiAgICAgICAgICAgICAgICBpc05vZGVNYXRjaGVkID0gdGhpcy5iaW5kZGF0YXZhbHVlID8gbm9kZUlkVmFsdWUgPT09IF9ldmFsRGF0YVZhbHVlIDogbm9kZUlkVmFsdWUgPT09IF9leHByO1xuICAgICAgICAgICAgICAgIGlmIChub2RlSWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICRsaS5hdHRyKCdpZCcsIG5vZGVJZFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYmluZGRhdGF2YWx1ZSkgeyAvLyBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBvbmx5IGlmIGl0IGlzIGJvdW5kICh1c2VFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgIGlzTm9kZU1hdGNoZWQgPSAhISRwYXJzZUV4cHIoX2V4cHIpKHRoaXMsIG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUGVyZm9ybSBMYXN0Tm9kZSBjaGVjayBvbmx5IGF0IGxldmVsIDAuKGllLCBkZWVwID0gMCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoKF9leHByID09PSAnRmlyc3ROb2RlJyAmJiBpZHggPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHx8ICghZGVlcCAmJiBfZXhwciA9PT0gJ0xhc3ROb2RlJyAmJiBpZHggPT09IG5vZGVzLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgICAgICAgIHx8IGlzTm9kZU1hdGNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBhIHJlZmVyZW5jZSBvZiB0aGUgbm9kZSB0byBiZSBzZWxlY3RlZCBpbiBgX3NlbGVjdE5vZGVgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdE5vZGUgPSAkbGk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXZhbHVlICAgPSBub2RlSWRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlSWNvbikge1xuICAgICAgICAgICAgICAgICRpY29uTm9kZS5hZGRDbGFzcyhub2RlSWNvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlQ2hpbGRyZW4gJiYgbm9kZUNoaWxkcmVuLmxlbmd0aCkgeyAvLyBwYXJlbnQgbm9kZVxuICAgICAgICAgICAgICAgICRsaS5hZGRDbGFzcyhgcGFyZW50LW5vZGUgJHtfY2xzfWApO1xuICAgICAgICAgICAgICAgIGV4cGFuZENvbGxhcHNlSWNvbiA9ICQoYDxpIGNsYXNzPVwid2kgJHtfaWNvbkNsc31cIj48L2k+YCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVJY29uKSB7XG4gICAgICAgICAgICAgICAgICAgICRpY29uTm9kZS5hZGRDbGFzcyhub2RlSWNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICRsaS5wcmVwZW5kKGV4cGFuZENvbGxhcHNlSWNvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3ROb2Rlcyhub2RlQ2hpbGRyZW4sICRsaSwgbGV2ZWxzIC0gMSwgZGVlcCArIDEsIF9ldmFsRGF0YVZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlSWNvbikge1xuICAgICAgICAgICAgICAgICAgICAkaWNvbk5vZGUuYWRkQ2xhc3MoJ2xlYWYtbm9kZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkbGkuYWRkQ2xhc3MoJ2xlYWYtbm9kZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5vZGVzRnJvbVN0cmluZyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUuc3BsaXQoJywnKS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgJ2xhYmVsJzogaXRlbSAmJiBpdGVtLnRyaW0oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROb2RlcyhuZXdWYWwpIHtcbiAgICAgICAgbGV0IG5vZGVzO1xuICAgICAgICBpZiAoXy5pc1N0cmluZyhuZXdWYWwpICYmICFfLmlzRW1wdHkobmV3VmFsKSkge1xuICAgICAgICAgICAgbmV3VmFsID0gbmV3VmFsLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChuZXdWYWwpIHtcbiAgICAgICAgICAgICAgICBub2RlcyA9IHRoaXMuZ2V0Tm9kZXNGcm9tU3RyaW5nKG5ld1ZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXy5pc0FycmF5KG5ld1ZhbCkpIHtcbiAgICAgICAgICAgIG5ld1ZhbCA9IGdldE9yZGVyZWREYXRhc2V0KG5ld1ZhbCwgdGhpcy5vcmRlcmJ5KTtcbiAgICAgICAgICAgIG5vZGVzID0gbmV3VmFsO1xuICAgICAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QobmV3VmFsKSkge1xuICAgICAgICAgICAgbm9kZXMgPSBbbmV3VmFsXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGFuZ2VUcmVlSWNvbnMobnYsIG92KSB7XG4gICAgICAgIGNvbnN0ICRlbCA9ICQodGhpcy5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgbnYgPSBudiB8fCBkZWZhdWx0VHJlZUljb25DbGFzcztcbiAgICAgICAgb3YgPSBvdiB8fCBkZWZhdWx0VHJlZUljb25DbGFzcztcbiAgICAgICAgJGVsLmZpbmQoJ2kuZXhwYW5kZWQnKS5yZW1vdmVDbGFzcyhJQ09OX0NMQVNTRVNbb3ZdLmV4cGFuZGVkKS5hZGRDbGFzcyhJQ09OX0NMQVNTRVNbbnZdLmV4cGFuZGVkKTtcbiAgICAgICAgJGVsLmZpbmQoJ2kuY29sbGFwc2VkJykucmVtb3ZlQ2xhc3MoSUNPTl9DTEFTU0VTW292XS5jb2xsYXBzZWQpLmFkZENsYXNzKElDT05fQ0xBU1NFU1tudl0uY29sbGFwc2VkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUV4cGFuZENvbGxhcHNlTm9kZSgkZXZlbnQsICRpLCAkbGkpIHtcbiAgICAgICAgY29uc3QgdHJlZUljb25zID0gSUNPTl9DTEFTU0VTW3RoaXMudHJlZWljb25zIHx8IGRlZmF1bHRUcmVlSWNvbkNsYXNzXTtcbiAgICAgICAgY29uc3QgICRsaVBhdGggPSAgdGhpcy5maW5kU2VsZWN0ZWROb2RlUGFyZW50KCRsaSk7XG4gICAgICAgIGxldCBwYXRoID0gJyc7XG5cbiAgICAgICAgLy8gY29uc3RydWN0IHRoZSBwYXRoIG9mIHRoZSBub2RlXG4gICAgICAgICRsaVBhdGhcbiAgICAgICAgICAgIC5lYWNoKChpLCBlbCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSAkKGVsKS5jaGlsZHJlbignLnRpdGxlJykudGV4dCgpO1xuICAgICAgICAgICAgICAgIHBhdGggPSBgLyR7Y3VycmVudCArIHBhdGh9YDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICBjb25zdCAgZXZlbnRQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgJyRldmVudCcgIDogJGV2ZW50LFxuICAgICAgICAgICAgICAgIFwiJGl0ZW1cIiAgIDogICRsaS5kYXRhKCdub2RlZGF0YScpLFxuICAgICAgICAgICAgICAgIFwiJHBhdGhcIiA6IHBhdGhcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgaWYgKCRpLmhhc0NsYXNzKCdjb2xsYXBzZWQnKSkge1xuICAgICAgICAgICAgJGkucmVtb3ZlQ2xhc3MoYGNvbGxhcHNlZCAke3RyZWVJY29ucy5jb2xsYXBzZWR9YCkuYWRkQ2xhc3MoYGV4cGFuZGVkICR7dHJlZUljb25zLmV4cGFuZGVkfWApO1xuICAgICAgICAgICAgJGxpLnJlbW92ZUNsYXNzKCdjb2xsYXBzZWQnKS5hZGRDbGFzcygnZXhwYW5kZWQnKTtcbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnZXhwYW5kJywgZXZlbnRQYXJhbXMpO1xuICAgICAgICB9IGVsc2UgaWYgKCRpLmhhc0NsYXNzKCdleHBhbmRlZCcpKSB7XG4gICAgICAgICAgICAkaS5yZW1vdmVDbGFzcyhgZXhwYW5kZWQgJHt0cmVlSWNvbnMuZXhwYW5kZWR9YCkuYWRkQ2xhc3MoYGNvbGxhcHNlZCAke3RyZWVJY29ucy5jb2xsYXBzZWR9YCk7XG4gICAgICAgICAgICAkbGkucmVtb3ZlQ2xhc3MoJ2V4cGFuZGVkJykuYWRkQ2xhc3MoJ2NvbGxhcHNlZCcpO1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdjb2xsYXBzZScsIGV2ZW50UGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyVHJlZShmb3JjZVJlbmRlcj8pIHtcbiAgICAgICAgbGV0IGRvY0ZyYWcsXG4gICAgICAgICAgICAkbGksXG4gICAgICAgICAgICAkbGlQYXRoLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhdGggPSAnJztcbiAgICAgICAgY29uc3QgbGV2ZWxzID0gK3RoaXMubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2xldmVscycpIHx8IDAsXG4gICAgICAgICAgICAkZWwgPSAkKHRoaXMubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgJGVsLmVtcHR5KCk7XG5cbiAgICAgICAgaWYgKGZvcmNlUmVuZGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3ROb2RlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubm9kZXMgJiYgdGhpcy5ub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRvY0ZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgICAgICB0aGlzLmNvbnN0cnVjdE5vZGVzKHRoaXMubm9kZXMsICQoZG9jRnJhZyksIGxldmVscywgMCwgdGhpcy5kYXRhdmFsdWUpO1xuICAgICAgICAgICAgJGVsLmFwcGVuZChkb2NGcmFnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3ROb2RlKSB7XG4gICAgICAgICAgICAkbGkgPSB0aGlzLl9zZWxlY3ROb2RlO1xuICAgICAgICAgICAgJGxpLmFkZENsYXNzKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgZGF0YSAgICA9ICRsaS5kYXRhKCdub2RlZGF0YScpO1xuICAgICAgICAgICAgJGxpUGF0aCA9IHRoaXMuZmluZFNlbGVjdGVkTm9kZVBhcmVudCgkbGkpO1xuXG4gICAgICAgICAgICBpZiAoISRsaVBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgJGxpUGF0aCA9ICRsaTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJGxpUGF0aFxuICAgICAgICAgICAgICAgIC5lYWNoKChpLCBlbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCAkY3VycmVudCA9ICQoZWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgJGkgICAgICAgPSAkY3VycmVudC5jaGlsZHJlbignaS5jb2xsYXBzZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICR0aXRsZSAgID0gJGN1cnJlbnQuY2hpbGRyZW4oJy50aXRsZScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUV4cGFuZENvbGxhcHNlTm9kZSh1bmRlZmluZWQsICRpLCAkY3VycmVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGAvJHskdGl0bGUudGV4dCgpICsgcGF0aH1gO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkaXRlbSA9IGdldENsb25lZE9iamVjdChkYXRhKSB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRpdGVtLnBhdGggPSBwYXRoO1xuXG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdCcsIHskZXZlbnQ6IHVuZGVmaW5lZCwgJGl0ZW06IGRhdGEsICRwYXRoOiBwYXRofSk7XG4gICAgICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdE5vZGUoZXZ0LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQgJiYgJChldnQudGFyZ2V0KSxcbiAgICAgICAgICAgICRlbCA9ICQodGhpcy5uYXRpdmVFbGVtZW50KSxcbiAgICAgICAgICAgICRsaSA9IF8uaXNPYmplY3QodmFsdWUpID8gdmFsdWUgOiAkZWwuZmluZChgbGlbaWQ9XCIke3ZhbHVlfVwiXWApLmZpcnN0KCk7XG4gICAgICAgIGxldCBkYXRhLFxuICAgICAgICAgICAgcGF0aCA9ICcnLFxuICAgICAgICAgICAgJGxpUGF0aCxcbiAgICAgICAgICAgIG5vZGVBY3Rpb247XG4gICAgICAgICRlbC5maW5kKCcuc2VsZWN0ZWQnKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgICAgaWYgKCEkbGkubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgJGxpLmFkZENsYXNzKCdzZWxlY3RlZCcpO1xuICAgICAgICBkYXRhID0gJGxpLmRhdGEoJ25vZGVkYXRhJyk7XG4gICAgICAgIG5vZGVBY3Rpb24gPSBkYXRhW3RoaXMubm9kZWFjdGlvbiB8fCAnYWN0aW9uJ107XG5cbiAgICAgICAgLy8gaWYgdGhlIHNlbGVjdE5vZGUgaXMgaW5pdGlhdGVkIGJ5IGNsaWNrIGV2ZW50IHRoZW4gdXNlIHRoZSBuYXRpdmVFbGVtZW50IHRhcmdldCBmcm9tIGV2ZW50XG4gICAgICAgICRsaVBhdGggPSB0YXJnZXQgPyB0YXJnZXQucGFyZW50cygnLmFwcC10cmVlIGxpJykgOiB0aGlzLmZpbmRTZWxlY3RlZE5vZGVQYXJlbnQoJGxpKTtcblxuICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIHBhdGggb2YgdGhlIG5vZGVcbiAgICAgICAgJGxpUGF0aFxuICAgICAgICAgICAgLmVhY2goKGksIGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9ICQoZWwpLmNoaWxkcmVuKCcudGl0bGUnKS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgcGF0aCA9IGAvJHtjdXJyZW50ICsgcGF0aH1gO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZXhwYW5kIHRoZSBjdXJyZW50IG5vZGUgdGlsbCB0aGUgdmlld1BhcmVudCBsZXZlbCB3aGljaCBpcyBjb2xsYXBzZWRcbiAgICAgICAgJGxpLnBhcmVudHNVbnRpbCgkZWwsICdsaS5wYXJlbnQtbm9kZS5jb2xsYXBzZWQnKVxuICAgICAgICAgICAgLmVhY2goKGluZGV4LCBlbCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0ICRjdXJyZW50ID0gJChlbCksXG4gICAgICAgICAgICAgICAgICAgICRpID0gJGN1cnJlbnQuY2hpbGRyZW4oJ2kuY29sbGFwc2VkJyk7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVFeHBhbmRDb2xsYXBzZU5vZGUodW5kZWZpbmVkLCAkaSwgJGN1cnJlbnQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZGl0ZW0gICAgICA9IGdldENsb25lZE9iamVjdChkYXRhKSB8fCB7fTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZGl0ZW0ucGF0aCA9IHBhdGg7XG5cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubm9kZWlkIHx8IHRoaXMuYmluZG5vZGVpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YXZhbHVlID0gZ2V0RXZhbHVhdGVkRGF0YShkYXRhLCB7ZmllbGQ6IHRoaXMubm9kZWlkLCBiaW5kRXhwcmVzc2lvbjogdGhpcy5iaW5kbm9kZWlkfSwgdGhpcy52aWV3UGFyZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhdmFsdWUgPSBnZXRDbG9uZWRPYmplY3QoZGF0YSkgfHwge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRhdGF2YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9bVG9kby1DU1BdOiB0aGlzIGRhdGEgd2lsbCBiZSBkeW5hbWljLCBjYW4gbm90IGdlbmVyYXRlIGZ1bmN0aW9uIHVwZnJvbnRcbiAgICAgICAgaWYgKG5vZGVBY3Rpb24pIHtcbiAgICAgICAgICAgICRwYXJzZUV2ZW50KG5vZGVBY3Rpb24pKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzZWxlY3QnLCB7JGV2ZW50OiBldnQsICRpdGVtOiBkYXRhLCAkcGF0aDogcGF0aH0pO1xuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgfVxuICAgIC8vIGNsaWNrIGV2ZW50IGlzIGFkZGVkIG9uIHRoZSBob3N0IG5hdGl2ZUVsZW1lbnRcbiAgICBwcml2YXRlIGJpbmRFdmVudHMoKSB7XG4gICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5vbignY2xpY2snLCAoZXZ0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSAkKGV2dC50YXJnZXQpLFxuICAgICAgICAgICAgICAgIGxpICAgICA9IHRhcmdldC5jbG9zZXN0KCdsaScpLFxuICAgICAgICAgICAgICAgICRpICAgICA9IHRhcmdldC5pcygnaScpID8gdGFyZ2V0IDogdGFyZ2V0LnNpYmxpbmdzKCdpLmNvbGxhcHNlZCxpLmV4cGFuZGVkJyk7XG5cbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgaWYgKHRhcmdldC5pcygnc3Bhbi50aXRsZScpKSB7IC8vIHNlbGVjdCB0aGUgbm9kZSBvbmx5IGlmIGl0IGlzIG5vZGVsYWJlbFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRpdGVtID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3ROb2RlKGV2dCwgbGkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGFyZ2V0LmlzKCdpJykgfHwgKHRhcmdldC5pcygnc3Bhbi50aXRsZScpICYmIHRoaXMubm9kZWNsaWNrID09PSAnZXhwYW5kJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUV4cGFuZENvbGxhcHNlTm9kZShldnQsICRpLCBsaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZFNlbGVjdGVkTm9kZVBhcmVudCgkbGkpIHtcbiAgICAgICAgcmV0dXJuICRsaS5maW5kKCc+IHNwYW4udGl0bGUnKS5wYXJlbnRzKCcuYXBwLXRyZWUgbGknKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdEJ5SWQodmFsdWU/KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZSh1bmRlZmluZWQsIHZhbHVlKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBkZXNlbGVjdEJ5SWQodmFsdWU/KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRpdGVtID0ge307XG4gICAgICAgIHRoaXMuc2VsZWN0QnlJZCgpO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { NgModule } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { WmComponentsModule } from '@wm/components/base';
|
|
4
|
-
import {
|
|
4
|
+
import { TreeDirective } from './tree.directive';
|
|
5
5
|
const components = [
|
|
6
|
-
|
|
6
|
+
TreeDirective
|
|
7
7
|
];
|
|
8
8
|
export class TreeModule {
|
|
9
9
|
}
|
|
@@ -18,4 +18,4 @@ TreeModule.decorators = [
|
|
|
18
18
|
entryComponents: []
|
|
19
19
|
},] }
|
|
20
20
|
];
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvYmFzaWMvdHJlZS9zcmMvdHJlZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWpELE1BQU0sVUFBVSxHQUFHO0lBQ2YsYUFBYTtDQUNoQixDQUFDO0FBV0YsTUFBTSxPQUFPLFVBQVU7OztZQVR0QixRQUFRLFNBQUM7Z0JBQ04sT0FBTyxFQUFFO29CQUNMLFlBQVk7b0JBQ1osa0JBQWtCO2lCQUNyQjtnQkFDRCxZQUFZLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQztnQkFDN0IsT0FBTyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUM7Z0JBQ3hCLGVBQWUsRUFBRSxFQUFFO2FBQ3RCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IFdtQ29tcG9uZW50c01vZHVsZSB9IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuXG5pbXBvcnQgeyBUcmVlRGlyZWN0aXZlIH0gZnJvbSAnLi90cmVlLmRpcmVjdGl2ZSc7XG5cbmNvbnN0IGNvbXBvbmVudHMgPSBbXG4gICAgVHJlZURpcmVjdGl2ZVxuXTtcblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgV21Db21wb25lbnRzTW9kdWxlXG4gICAgXSxcbiAgICBkZWNsYXJhdGlvbnM6IFsuLi5jb21wb25lbnRzXSxcbiAgICBleHBvcnRzOiBbLi4uY29tcG9uZW50c10sXG4gICAgZW50cnlDb21wb25lbnRzOiBbXVxufSlcbmV4cG9ydCBjbGFzcyBUcmVlTW9kdWxlIHtcbn1cbiJdfQ==
|