@acorex/layout 6.5.70 → 6.5.72
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +7 -2
- package/esm2022/acorex-layout.mjs +5 -0
- package/esm2022/index.mjs +7 -0
- package/esm2022/lib/widget-board/editors/widget-size-editor/widget-size.editor.mjs +49 -0
- package/esm2022/lib/widget-board/editors/widget-size-editor/widget-size.module.mjs +21 -0
- package/esm2022/lib/widget-board/widget-board.component.mjs +452 -0
- package/esm2022/lib/widget-board/widget-board.module.mjs +109 -0
- package/esm2022/lib/widget-board/widget-config.component.mjs +85 -0
- package/esm2022/lib/widget-board/widget-host.component.mjs +311 -0
- package/esm2022/lib/widget-board/widget-save.component.mjs +79 -0
- package/esm2022/lib/widget-board/widget.class.mjs +130 -0
- package/{fesm2020 → fesm2022}/acorex-layout.mjs +158 -127
- package/fesm2022/acorex-layout.mjs.map +1 -0
- package/lib/widget-board/editors/widget-size-editor/widget-size.editor.d.ts +1 -1
- package/lib/widget-board/widget-board.component.d.ts +1 -1
- package/lib/widget-board/widget-config.component.d.ts +1 -1
- package/lib/widget-board/widget-host.component.d.ts +1 -1
- package/lib/widget-board/widget-save.component.d.ts +1 -1
- package/package.json +12 -18
- package/acorex-layout.d.ts +0 -5
- package/esm2020/acorex-layout.mjs +0 -5
- package/esm2020/lib/widget-board/editors/widget-size-editor/widget-size.editor.mjs +0 -46
- package/esm2020/lib/widget-board/editors/widget-size-editor/widget-size.module.mjs +0 -21
- package/esm2020/lib/widget-board/widget-board.component.mjs +0 -444
- package/esm2020/lib/widget-board/widget-board.module.mjs +0 -111
- package/esm2020/lib/widget-board/widget-config.component.mjs +0 -82
- package/esm2020/lib/widget-board/widget-host.component.mjs +0 -295
- package/esm2020/lib/widget-board/widget-save.component.mjs +0 -79
- package/esm2020/lib/widget-board/widget.class.mjs +0 -127
- package/esm2020/public-api.mjs +0 -7
- package/fesm2015/acorex-layout.mjs +0 -1175
- package/fesm2015/acorex-layout.mjs.map +0 -1
- package/fesm2020/acorex-layout.mjs.map +0 -1
- /package/{public-api.d.ts → index.d.ts} +0 -0
@@ -1,444 +0,0 @@
|
|
1
|
-
import { Component, Input, ViewEncapsulation, ElementRef, ViewChild, NgZone, ChangeDetectionStrategy, ChangeDetectorRef, Output, EventEmitter, ViewChildren, QueryList } from '@angular/core';
|
2
|
-
import { AXWidgetHostComponent } from './widget-host.component';
|
3
|
-
import { AXHtmlUtil, AXClientRec } from '@acorex/core';
|
4
|
-
import { Subject } from 'rxjs';
|
5
|
-
import { debounceTime } from 'rxjs/operators';
|
6
|
-
import * as i0 from "@angular/core";
|
7
|
-
import * as i1 from "./widget-host.component";
|
8
|
-
import * as i2 from "@angular/common";
|
9
|
-
export class AXWidgetBoardComponent {
|
10
|
-
constructor(ref, zone, cdr) {
|
11
|
-
this.ref = ref;
|
12
|
-
this.zone = zone;
|
13
|
-
this.cdr = cdr;
|
14
|
-
this.widgets = [];
|
15
|
-
this.galleryItems = [];
|
16
|
-
this.tileSize = 80;
|
17
|
-
this.gapSize = 5;
|
18
|
-
this.readonly = false;
|
19
|
-
this.newWidget = null;
|
20
|
-
this._isInEditing = false;
|
21
|
-
this.isDragging = false;
|
22
|
-
this.saveSubject = new Subject();
|
23
|
-
this.DATA_COL = 'data-col';
|
24
|
-
this.DATA_ROW = 'data-row';
|
25
|
-
this.DATA_SIZE_X = 'data-size-x';
|
26
|
-
this.DATA_SIZE_Y = 'data-size-y';
|
27
|
-
this.DATA_OLD_COL = 'data-old-col';
|
28
|
-
this.DATA_OLD_ROW = 'data-old-row';
|
29
|
-
this.onConfigChanged = new EventEmitter();
|
30
|
-
this.onWidgetSave = new EventEmitter();
|
31
|
-
}
|
32
|
-
isInEditing() {
|
33
|
-
return this._isInEditing;
|
34
|
-
}
|
35
|
-
ngOnInit() {
|
36
|
-
if (this.rtl == null) {
|
37
|
-
this.rtl = window.getComputedStyle(this.ref.nativeElement, null).getPropertyValue('direction') === 'rtl';
|
38
|
-
}
|
39
|
-
this.saveSubject.pipe(debounceTime(750)).subscribe((value) => {
|
40
|
-
this.emitConfigChanged(value);
|
41
|
-
});
|
42
|
-
}
|
43
|
-
ngOnDestroy() {
|
44
|
-
this.saveSubject?.unsubscribe();
|
45
|
-
}
|
46
|
-
ngAfterViewInit() {
|
47
|
-
this.zone.runOutsideAngular((c) => {
|
48
|
-
const style = document.createElement('style');
|
49
|
-
style.type = 'text/css';
|
50
|
-
this.ref.nativeElement.appendChild(style);
|
51
|
-
// add css data classes
|
52
|
-
for (let i = 1; i <= 50; i++) {
|
53
|
-
style.innerHTML += `[${this.DATA_COL}="${i}"] { ${this.rtl ? 'right' : 'left'}: ${(i - 1) * (this.tileSize + this.gapSize)}px; }`;
|
54
|
-
style.innerHTML += `[${this.DATA_ROW}="${i}"] { top: ${(i - 1) * (this.tileSize + this.gapSize)}px; }`;
|
55
|
-
style.innerHTML += `[${this.DATA_SIZE_X}="${i}"] { width: ${(i * this.tileSize) + ((i - 1) * this.gapSize)}px; }`;
|
56
|
-
style.innerHTML += `[${this.DATA_SIZE_Y}="${i}"] { height: ${(i * this.tileSize) + ((i - 1) * this.gapSize)}px; }`;
|
57
|
-
}
|
58
|
-
});
|
59
|
-
}
|
60
|
-
calcGridSize() {
|
61
|
-
this.zone.runOutsideAngular(() => {
|
62
|
-
const width = (Math.max(...this.widgets.map((c) => c.col + c.sizeX - 1))) * (this.tileSize + this.gapSize);
|
63
|
-
const height = (Math.max(...this.widgets.map((c) => c.row + c.sizeY - 1))) * (this.tileSize + this.gapSize);
|
64
|
-
this.container.nativeElement.style.width = width + 'px';
|
65
|
-
this.container.nativeElement.style.height = height + 'px';
|
66
|
-
});
|
67
|
-
}
|
68
|
-
toggleEdit() {
|
69
|
-
this._isInEditing ? this.finishEdit() : this.startEdit();
|
70
|
-
}
|
71
|
-
dragStart(e) {
|
72
|
-
e.preventDefault();
|
73
|
-
e.stopPropagation();
|
74
|
-
this.zone.runOutsideAngular(() => {
|
75
|
-
if (this._isInEditing && e.which === 1) {
|
76
|
-
this.dragItem = e.currentTarget;
|
77
|
-
this.dragItem.setAttribute('data-x-offset', (this.dragItem.offsetLeft - e.clientX).toString());
|
78
|
-
//
|
79
|
-
this.dragItem.setAttribute('data-y-offset', (this.dragItem.offsetTop - e.clientY).toString());
|
80
|
-
this.dragItem.classList.add('widget-dragging');
|
81
|
-
this.dragItem.classList.remove('animate__animated', 'animate__pulse');
|
82
|
-
}
|
83
|
-
});
|
84
|
-
return false;
|
85
|
-
}
|
86
|
-
removePositionData() {
|
87
|
-
this.zone.runOutsideAngular(() => {
|
88
|
-
if (this.dragItem && this._isInEditing && this.dragItem.getAttribute(this.DATA_OLD_COL) == null) {
|
89
|
-
this.dragItem.setAttribute(this.DATA_OLD_COL, this.dragItem.getAttribute(this.DATA_COL));
|
90
|
-
this.dragItem.setAttribute(this.DATA_OLD_ROW, this.dragItem.getAttribute(this.DATA_ROW));
|
91
|
-
this.dragItem.removeAttribute(this.DATA_COL);
|
92
|
-
this.dragItem.removeAttribute(this.DATA_ROW);
|
93
|
-
}
|
94
|
-
});
|
95
|
-
}
|
96
|
-
resetPositionData() {
|
97
|
-
this.zone.runOutsideAngular(() => {
|
98
|
-
if (this.dragItem && this._isInEditing) {
|
99
|
-
this.setPosition(this.dragItem, this.dragItem.getAttribute(this.DATA_OLD_COL), this.dragItem.getAttribute(this.DATA_OLD_ROW));
|
100
|
-
}
|
101
|
-
});
|
102
|
-
}
|
103
|
-
setPosition(element, col, row) {
|
104
|
-
this.zone.runOutsideAngular(() => {
|
105
|
-
element.setAttribute(this.DATA_COL, col);
|
106
|
-
element.setAttribute(this.DATA_ROW, row);
|
107
|
-
element.removeAttribute(this.DATA_OLD_COL);
|
108
|
-
element.removeAttribute(this.DATA_OLD_ROW);
|
109
|
-
element.style.removeProperty('top');
|
110
|
-
element.style.removeProperty('left');
|
111
|
-
const widget = this.widgets.find(c => c['__meta__'].instance.element === element);
|
112
|
-
widget.col = Number(col);
|
113
|
-
widget.row = Number(row);
|
114
|
-
});
|
115
|
-
}
|
116
|
-
drag(e) {
|
117
|
-
e.preventDefault();
|
118
|
-
e.stopPropagation();
|
119
|
-
this.zone.runOutsideAngular(() => {
|
120
|
-
if (this.dragItem && this._isInEditing) {
|
121
|
-
this.isDragging = true;
|
122
|
-
this.addPlaceholder();
|
123
|
-
const xOffset = Number(this.dragItem.getAttribute('data-x-offset'));
|
124
|
-
const yOffset = Number(this.dragItem.getAttribute('data-y-offset'));
|
125
|
-
this.dragItem.style.left = e.clientX + xOffset + 'px';
|
126
|
-
this.dragItem.style.top = e.clientY + yOffset + 'px';
|
127
|
-
//
|
128
|
-
this.detectBestPlacement();
|
129
|
-
this.removePositionData();
|
130
|
-
}
|
131
|
-
});
|
132
|
-
return false;
|
133
|
-
}
|
134
|
-
dragEnd(e) {
|
135
|
-
this.zone.runOutsideAngular(() => {
|
136
|
-
if (this.dragItem && this._isInEditing && this.isDragging) {
|
137
|
-
this.dragItem.classList.remove('widget-dragging');
|
138
|
-
this.dragItem.classList.add('animate__animated', 'animate__pulse');
|
139
|
-
//
|
140
|
-
const p = this.container.nativeElement.querySelector('.widget-blank-placeholder');
|
141
|
-
if (this.newWidget) {
|
142
|
-
const w = {
|
143
|
-
uniqueName: this.newWidget.uniqueName,
|
144
|
-
component: this.newWidget.component,
|
145
|
-
title: this.newWidget.title,
|
146
|
-
options: this.newWidget.options,
|
147
|
-
sizeX: this.newWidget.sizeX,
|
148
|
-
sizeY: this.newWidget.sizeY,
|
149
|
-
col: Number(p.getAttribute(this.DATA_COL)),
|
150
|
-
row: Number(p.getAttribute(this.DATA_ROW))
|
151
|
-
};
|
152
|
-
this.widgets.push(w);
|
153
|
-
this.newWidget = null;
|
154
|
-
this.container.nativeElement.removeChild(this.dragItem);
|
155
|
-
this.zone.run(() => {
|
156
|
-
this.cdr.detectChanges();
|
157
|
-
this.calcGridSize();
|
158
|
-
setTimeout(() => {
|
159
|
-
w['__meta__'].instance.element.addEventListener('mousedown', this.dragStart.bind(this), false);
|
160
|
-
}, 1000);
|
161
|
-
});
|
162
|
-
}
|
163
|
-
else {
|
164
|
-
if (p) {
|
165
|
-
this.setPosition(this.dragItem, p.getAttribute(this.DATA_COL), p.getAttribute(this.DATA_ROW));
|
166
|
-
}
|
167
|
-
else {
|
168
|
-
this.setPosition(this.dragItem, this.dragItem.getAttribute(this.DATA_OLD_COL), this.dragItem.getAttribute(this.DATA_OLD_ROW));
|
169
|
-
}
|
170
|
-
}
|
171
|
-
//
|
172
|
-
this.removePlaceholder();
|
173
|
-
this.dragItem = null;
|
174
|
-
this.calcGridSize();
|
175
|
-
this.saveSubject.next('config');
|
176
|
-
}
|
177
|
-
this.isDragging = false;
|
178
|
-
});
|
179
|
-
}
|
180
|
-
detectFirstEmptySlot(w) {
|
181
|
-
const xTile = Math.floor(this.ref.nativeElement.parentElement.offsetWidth / this.tileSize);
|
182
|
-
for (let j = 1; j <= 100; j++) {
|
183
|
-
for (let i = 1; i <= xTile - w.sizeX; i++) {
|
184
|
-
const rec = new AXClientRec({
|
185
|
-
left: i,
|
186
|
-
top: j,
|
187
|
-
width: w.sizeX,
|
188
|
-
height: w.sizeY
|
189
|
-
});
|
190
|
-
const el = this.widgets.filter(c => c !== w).find((c) => rec.intersect({
|
191
|
-
left: c.col,
|
192
|
-
top: c.row,
|
193
|
-
width: c.sizeX,
|
194
|
-
height: c.sizeY
|
195
|
-
}));
|
196
|
-
if (el == null) {
|
197
|
-
w.col = i;
|
198
|
-
w.row = j;
|
199
|
-
return;
|
200
|
-
}
|
201
|
-
}
|
202
|
-
}
|
203
|
-
}
|
204
|
-
detectBestPlacement() {
|
205
|
-
this.zone.runOutsideAngular(() => {
|
206
|
-
const p = this.container.nativeElement.querySelector('.widget-blank-placeholder');
|
207
|
-
let col = Math.ceil(this.dragItem.offsetLeft / this.tileSize);
|
208
|
-
if (this.rtl) {
|
209
|
-
col = Math.ceil((this.container.nativeElement.clientWidth - (this.dragItem.offsetLeft + this.dragItem.clientWidth)) / this.tileSize);
|
210
|
-
}
|
211
|
-
let row = Math.ceil(this.dragItem.offsetTop / this.tileSize);
|
212
|
-
if (col < 1) {
|
213
|
-
col = 1;
|
214
|
-
}
|
215
|
-
if (row < 1) {
|
216
|
-
row = 1;
|
217
|
-
}
|
218
|
-
const widgets = Array.from(this.ref.nativeElement.querySelectorAll('.widget-host')).map((c) => c);
|
219
|
-
p.setAttribute(this.DATA_COL, col.toString());
|
220
|
-
p.setAttribute(this.DATA_ROW, row.toString());
|
221
|
-
const collision = widgets.filter(c => c !== this.dragItem).some(c => AXHtmlUtil.collision(c, this.dragItem));
|
222
|
-
if (collision) {
|
223
|
-
this.removePlaceholder();
|
224
|
-
}
|
225
|
-
});
|
226
|
-
}
|
227
|
-
addPlaceholder() {
|
228
|
-
this.zone.runOutsideAngular(() => {
|
229
|
-
this.removePlaceholder();
|
230
|
-
if (this.dragItem) {
|
231
|
-
const p = document.createElement('div');
|
232
|
-
p.classList.add('widget-blank-placeholder');
|
233
|
-
p.setAttribute(this.DATA_COL, this.dragItem.getAttribute(this.DATA_COL));
|
234
|
-
p.setAttribute(this.DATA_ROW, this.dragItem.getAttribute(this.DATA_ROW));
|
235
|
-
p.setAttribute(this.DATA_SIZE_X, this.dragItem.getAttribute(this.DATA_SIZE_X));
|
236
|
-
p.setAttribute(this.DATA_SIZE_Y, this.dragItem.getAttribute(this.DATA_SIZE_Y));
|
237
|
-
this.container.nativeElement.appendChild(p);
|
238
|
-
}
|
239
|
-
});
|
240
|
-
}
|
241
|
-
removePlaceholder() {
|
242
|
-
const p = this.container.nativeElement.querySelector('.widget-blank-placeholder');
|
243
|
-
p?.remove();
|
244
|
-
}
|
245
|
-
startEdit() {
|
246
|
-
this._isInEditing = true;
|
247
|
-
this.calcGridSize();
|
248
|
-
this.ref.nativeElement.classList.add('grid-background');
|
249
|
-
const bg = this.ref.nativeElement;
|
250
|
-
bg.style.setProperty('background-position', `${this.rtl ? 'right' : 'left'} top`);
|
251
|
-
// tslint:disable-next-line: max-line-length
|
252
|
-
const pattern = `url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="${this.tileSize + this.gapSize}" height="${this.tileSize + this.gapSize}"> <rect style="fill: %23dadada" x="${this.rtl ? this.gapSize : 0}" width="${this.tileSize}" height="${this.tileSize}" y="0"></rect></svg>')`;
|
253
|
-
bg.style.setProperty('background-image', pattern);
|
254
|
-
//
|
255
|
-
const widgets = Array.from(this.ref.nativeElement.querySelectorAll('.widget-host'));
|
256
|
-
widgets.forEach((w) => {
|
257
|
-
w.addEventListener('mousedown', this.dragStart.bind(this), false);
|
258
|
-
});
|
259
|
-
this.ref.nativeElement.addEventListener('mousemove', this.drag.bind(this), false);
|
260
|
-
this.ref.nativeElement.addEventListener('mouseup', this.dragEnd.bind(this), false);
|
261
|
-
}
|
262
|
-
finishEdit() {
|
263
|
-
this.ref.nativeElement.classList.remove('grid-background');
|
264
|
-
const bg = this.ref.nativeElement;
|
265
|
-
bg.style.removeProperty('background-image');
|
266
|
-
//
|
267
|
-
this._isInEditing = false;
|
268
|
-
const widgets = Array.from(this.ref.nativeElement.querySelectorAll('.widget-host'));
|
269
|
-
widgets.forEach((w) => {
|
270
|
-
w.removeEventListener('mousedown', this.dragStart.bind(this), false);
|
271
|
-
});
|
272
|
-
this.ref.nativeElement.removeEventListener('mousemove', this.drag.bind(this), false);
|
273
|
-
this.ref.nativeElement.removeEventListener('mouseup', this.dragEnd.bind(this), false);
|
274
|
-
this.saveSubject.next('config');
|
275
|
-
}
|
276
|
-
addWidget(widget) {
|
277
|
-
this.zone.runOutsideAngular(() => {
|
278
|
-
this.newWidget = {
|
279
|
-
uniqueName: widget.uniqueName,
|
280
|
-
component: widget.component,
|
281
|
-
title: widget.title,
|
282
|
-
col: 1,
|
283
|
-
row: 1,
|
284
|
-
sizeX: widget.sizeX,
|
285
|
-
sizeY: widget.sizeY,
|
286
|
-
options: widget.options,
|
287
|
-
props: widget.props
|
288
|
-
};
|
289
|
-
this.detectFirstEmptySlot(this.newWidget);
|
290
|
-
const w = {
|
291
|
-
uniqueName: this.newWidget.uniqueName,
|
292
|
-
component: this.newWidget.component,
|
293
|
-
title: this.newWidget.title,
|
294
|
-
options: this.newWidget.options,
|
295
|
-
props: this.newWidget.props,
|
296
|
-
sizeX: this.newWidget.sizeX,
|
297
|
-
sizeY: this.newWidget.sizeY,
|
298
|
-
col: this.newWidget.col,
|
299
|
-
row: this.newWidget.row
|
300
|
-
};
|
301
|
-
this.widgets.push(w);
|
302
|
-
this.newWidget = null;
|
303
|
-
this.zone.run(() => {
|
304
|
-
this.cdr.detectChanges();
|
305
|
-
this.calcGridSize();
|
306
|
-
this.emitConfigChanged('add');
|
307
|
-
setTimeout(() => {
|
308
|
-
w['__meta__'].instance.element.addEventListener('mousedown', this.dragStart.bind(this), false);
|
309
|
-
}, 1000);
|
310
|
-
});
|
311
|
-
});
|
312
|
-
}
|
313
|
-
handleOnRemove(w) {
|
314
|
-
w.element.classList.add('animate__animated', 'animate__zoomOut');
|
315
|
-
w.element.addEventListener('animationend', () => {
|
316
|
-
this.widgets = this.widgets.filter((c) => c.__meta__.id !== w.config.__meta__.id);
|
317
|
-
this.cdr.detectChanges();
|
318
|
-
this.calcGridSize();
|
319
|
-
this.emitConfigChanged('remove');
|
320
|
-
});
|
321
|
-
}
|
322
|
-
handleOnSave(e) {
|
323
|
-
this.onWidgetSave.emit(e);
|
324
|
-
}
|
325
|
-
trackByFn(index, item) {
|
326
|
-
if (!item['__meta__']?.id) {
|
327
|
-
item['__meta__'] = {};
|
328
|
-
item['__meta__'].id = AXHtmlUtil.getUID();
|
329
|
-
}
|
330
|
-
return item['__meta__']?.id;
|
331
|
-
}
|
332
|
-
load(widgets) {
|
333
|
-
this.clear();
|
334
|
-
return new Promise((resolve, reject) => {
|
335
|
-
if (widgets) {
|
336
|
-
const loadedWidgets = [];
|
337
|
-
if (typeof widgets === 'string') {
|
338
|
-
try {
|
339
|
-
loadedWidgets.push(...JSON.parse(widgets));
|
340
|
-
this.emitConfigChanged('load');
|
341
|
-
}
|
342
|
-
catch (error) {
|
343
|
-
reject('Invalid widget json data!');
|
344
|
-
}
|
345
|
-
}
|
346
|
-
else {
|
347
|
-
loadedWidgets.push(...widgets);
|
348
|
-
this.emitConfigChanged('load');
|
349
|
-
}
|
350
|
-
let intervalId = -1;
|
351
|
-
const loadFunc = () => {
|
352
|
-
if (this.galleryItems && this.galleryItems.length > 0) {
|
353
|
-
loadedWidgets.forEach(w => {
|
354
|
-
const gitem = this.galleryItems.find(c => c.uniqueName === w.uniqueName);
|
355
|
-
if (gitem) {
|
356
|
-
w.component = gitem.component;
|
357
|
-
if (gitem.props) {
|
358
|
-
w.props = JSON.parse(JSON.stringify(gitem.props));
|
359
|
-
}
|
360
|
-
}
|
361
|
-
});
|
362
|
-
this.widgets.push(...loadedWidgets);
|
363
|
-
this.emitConfigChanged('load');
|
364
|
-
window.clearInterval(intervalId);
|
365
|
-
this.cdr.detectChanges();
|
366
|
-
resolve();
|
367
|
-
}
|
368
|
-
};
|
369
|
-
intervalId = window.setInterval(loadFunc, 200);
|
370
|
-
}
|
371
|
-
else {
|
372
|
-
resolve();
|
373
|
-
}
|
374
|
-
});
|
375
|
-
}
|
376
|
-
clear() {
|
377
|
-
if (this.widgets.length) {
|
378
|
-
this.widgets = [];
|
379
|
-
this.cdr.detectChanges();
|
380
|
-
this.saveSubject.next('clear');
|
381
|
-
}
|
382
|
-
}
|
383
|
-
save() {
|
384
|
-
const obj = this.widgets.map(c => ({
|
385
|
-
uniqueName: c.uniqueName,
|
386
|
-
component: c.component,
|
387
|
-
title: c.title,
|
388
|
-
sizeX: c.sizeX,
|
389
|
-
sizeY: c.sizeY,
|
390
|
-
col: c.col,
|
391
|
-
row: c.row,
|
392
|
-
options: c.options,
|
393
|
-
props: c.props
|
394
|
-
}));
|
395
|
-
return Promise.resolve(JSON.stringify(obj));
|
396
|
-
}
|
397
|
-
refresh() {
|
398
|
-
this.widgetHosts.forEach(host => {
|
399
|
-
host.widget.refresh();
|
400
|
-
});
|
401
|
-
}
|
402
|
-
handleOnConfigChanged(e) {
|
403
|
-
this.cdr.detectChanges();
|
404
|
-
this.saveSubject.next('config');
|
405
|
-
}
|
406
|
-
handleOnResizedChanged(e) {
|
407
|
-
this.detectFirstEmptySlot(e.config);
|
408
|
-
this.cdr.detectChanges();
|
409
|
-
this.saveSubject.next('config');
|
410
|
-
}
|
411
|
-
emitConfigChanged(mode) {
|
412
|
-
this.onConfigChanged.emit({
|
413
|
-
component: this,
|
414
|
-
mode: mode
|
415
|
-
});
|
416
|
-
}
|
417
|
-
}
|
418
|
-
AXWidgetBoardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AXWidgetBoardComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
419
|
-
AXWidgetBoardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: AXWidgetBoardComponent, selector: "ax-widget-board", inputs: { galleryItems: "galleryItems", tileSize: "tileSize", gapSize: "gapSize", readonly: "readonly", provideValue: "provideValue" }, outputs: { onConfigChanged: "onConfigChanged", onWidgetSave: "onWidgetSave" }, host: { classAttribute: "ax widget-board" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "widgetHosts", predicate: AXWidgetHostComponent, descendants: true }], ngImport: i0, template: "<div class=\"widgets-container\" [class.rtl]=\"rtl\" #container>\n <ax-widget-host *ngFor=\"let w of widgets;trackBy: trackByFn\" [config]='w' [sizeX]=\"w.sizeX\" [readonly]=\"readonly || w.readonly\"\n [sizeY]=\"w.sizeY\" [col]=\"w.col\" [row]=\"w.row\" (onRemove)=\"handleOnRemove($event)\" (onSave)=\"handleOnSave($event)\"\n (onConfigChanged)=\"handleOnConfigChanged($event)\" (onResized)=\"handleOnResizedChanged($event)\"\n [provideValue]=\"provideValue\">\n </ax-widget-host>\n</div>\n", styles: [".widget-board{display:inline-block;margin:15px 20px;min-width:calc(100% - 40px);min-height:calc(100% - 34px);--animate-duration: .5s;background-repeat:no-repeat}.widget-board.grid-background{background-repeat:repeat!important}.widget-board.grid-background .widgets-container .widget-host{touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.widget-board.grid-background .widgets-container .widget-host .widget-edit-overlay{display:block;cursor:move}.widget-board.grid-background .widgets-container .widget-host.widget-dragging{z-index:1000}.widget-board.grid-background .widgets-container .widget-host:focus{outline-width:1px;outline-style:solid;outline-color:var(--ax-primary-color)}.widget-board.grid-background .widget-blank-placeholder{background:var(--ax-primary-trans-light-color);position:absolute}.widget-board .widgets-container{position:relative;touch-action:none}.widget-board .widgets-container.rtl .widget-host .widget-options-menu{right:unset!important;left:0!important}.widget-board .widgets-container .widget-host{position:absolute;background:#fff;box-shadow:2px 2px 3px #dadada;z-index:0}.widget-board .widgets-container .widget-host .widget-content{width:100%;height:100%;display:flex;flex-direction:column}.widget-board .widgets-container .widget-host .widget-content .widget-title{padding:var(--ax-size-md);text-align:start;font-size:1.5em;position:absolute}.widget-board .widgets-container .widget-host .widget-edit-loading{display:none;background:rgba(255,255,255,.85);position:absolute;width:100%;height:100%;top:0;left:0;z-index:2;display:flex}.widget-board .widgets-container .widget-host .widget-config-overlay{position:absolute;background:white;width:100%;height:100%;top:0;left:0;z-index:1;padding:var(--ax-size-md);cursor:pointer}.widget-board .widgets-container .widget-host .widget-config-overlay:hover .widget-title{text-decoration:underline}.widget-board .widgets-container .widget-host .widget-config-overlay .widget-title{text-align:start;font-size:1.5em}.widget-board .widgets-container .widget-host .widget-config-overlay .widget-config-box{align-self:center;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--ax-gray-dark-color)}.widget-board .widgets-container .widget-host .widget-config-overlay .widget-config-box .config-title{font-size:1.2em;margin-bottom:var(--ax-size-md)}.widget-board .widgets-container .widget-host .widget-edit-overlay{display:none;background:rgba(255,255,255,.5);position:absolute;width:100%;height:100%;top:0;left:0;z-index:10}.widget-board .widgets-container .widget-host .widget-edit-overlay .widget-edit-menu{margin:6px;text-align:end;float:inline-end;opacity:1;transition:opacity 1s ease}.widget-board .widgets-container .widget-host .widget-edit-overlay .widget-edit-menu .widget-edit-menu-button{display:inline-block;background-color:#f0f0f0;border-radius:1px;border:2px solid #fff;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;padding:0;height:32px;width:32px;cursor:pointer;color:#666}.widget-board .widgets-container .widget-host .widget-edit-overlay .widget-edit-menu .widget-edit-menu-button:hover{border-color:#a6a6a6;background-color:#c8c8c8}.widget-board .widgets-container .widget-host .widget-options-menu{display:none;position:absolute;top:0;right:0;z-index:2;cursor:pointer;padding:2px 5px}.widget-board .widgets-container .widget-host .widget-options-menu:hover{background-color:#f0f0f0}.widget-board .widgets-container .widget-host .widget-container{padding:1px;height:100%}.widget-board .widgets-container .widget-host .widget-container:hover .widget-options-menu{display:block}\n"], components: [{ type: i1.AXWidgetHostComponent, selector: "ax-widget-host", inputs: ["provideValue", "config", "readonly", "sizeX", "sizeY", "col", "row"], outputs: ["onRemove", "onConfigChanged", "onResized", "onSave"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
420
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AXWidgetBoardComponent, decorators: [{
|
421
|
-
type: Component,
|
422
|
-
args: [{ selector: 'ax-widget-board', host: { class: 'ax widget-board' }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"widgets-container\" [class.rtl]=\"rtl\" #container>\n <ax-widget-host *ngFor=\"let w of widgets;trackBy: trackByFn\" [config]='w' [sizeX]=\"w.sizeX\" [readonly]=\"readonly || w.readonly\"\n [sizeY]=\"w.sizeY\" [col]=\"w.col\" [row]=\"w.row\" (onRemove)=\"handleOnRemove($event)\" (onSave)=\"handleOnSave($event)\"\n (onConfigChanged)=\"handleOnConfigChanged($event)\" (onResized)=\"handleOnResizedChanged($event)\"\n [provideValue]=\"provideValue\">\n </ax-widget-host>\n</div>\n", styles: [".widget-board{display:inline-block;margin:15px 20px;min-width:calc(100% - 40px);min-height:calc(100% - 34px);--animate-duration: .5s;background-repeat:no-repeat}.widget-board.grid-background{background-repeat:repeat!important}.widget-board.grid-background .widgets-container .widget-host{touch-action:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.widget-board.grid-background .widgets-container .widget-host .widget-edit-overlay{display:block;cursor:move}.widget-board.grid-background .widgets-container .widget-host.widget-dragging{z-index:1000}.widget-board.grid-background .widgets-container .widget-host:focus{outline-width:1px;outline-style:solid;outline-color:var(--ax-primary-color)}.widget-board.grid-background .widget-blank-placeholder{background:var(--ax-primary-trans-light-color);position:absolute}.widget-board .widgets-container{position:relative;touch-action:none}.widget-board .widgets-container.rtl .widget-host .widget-options-menu{right:unset!important;left:0!important}.widget-board .widgets-container .widget-host{position:absolute;background:#fff;box-shadow:2px 2px 3px #dadada;z-index:0}.widget-board .widgets-container .widget-host .widget-content{width:100%;height:100%;display:flex;flex-direction:column}.widget-board .widgets-container .widget-host .widget-content .widget-title{padding:var(--ax-size-md);text-align:start;font-size:1.5em;position:absolute}.widget-board .widgets-container .widget-host .widget-edit-loading{display:none;background:rgba(255,255,255,.85);position:absolute;width:100%;height:100%;top:0;left:0;z-index:2;display:flex}.widget-board .widgets-container .widget-host .widget-config-overlay{position:absolute;background:white;width:100%;height:100%;top:0;left:0;z-index:1;padding:var(--ax-size-md);cursor:pointer}.widget-board .widgets-container .widget-host .widget-config-overlay:hover .widget-title{text-decoration:underline}.widget-board .widgets-container .widget-host .widget-config-overlay .widget-title{text-align:start;font-size:1.5em}.widget-board .widgets-container .widget-host .widget-config-overlay .widget-config-box{align-self:center;text-align:center;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--ax-gray-dark-color)}.widget-board .widgets-container .widget-host .widget-config-overlay .widget-config-box .config-title{font-size:1.2em;margin-bottom:var(--ax-size-md)}.widget-board .widgets-container .widget-host .widget-edit-overlay{display:none;background:rgba(255,255,255,.5);position:absolute;width:100%;height:100%;top:0;left:0;z-index:10}.widget-board .widgets-container .widget-host .widget-edit-overlay .widget-edit-menu{margin:6px;text-align:end;float:inline-end;opacity:1;transition:opacity 1s ease}.widget-board .widgets-container .widget-host .widget-edit-overlay .widget-edit-menu .widget-edit-menu-button{display:inline-block;background-color:#f0f0f0;border-radius:1px;border:2px solid #fff;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;padding:0;height:32px;width:32px;cursor:pointer;color:#666}.widget-board .widgets-container .widget-host .widget-edit-overlay .widget-edit-menu .widget-edit-menu-button:hover{border-color:#a6a6a6;background-color:#c8c8c8}.widget-board .widgets-container .widget-host .widget-options-menu{display:none;position:absolute;top:0;right:0;z-index:2;cursor:pointer;padding:2px 5px}.widget-board .widgets-container .widget-host .widget-options-menu:hover{background-color:#f0f0f0}.widget-board .widgets-container .widget-host .widget-container{padding:1px;height:100%}.widget-board .widgets-container .widget-host .widget-container:hover .widget-options-menu{display:block}\n"] }]
|
423
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { container: [{
|
424
|
-
type: ViewChild,
|
425
|
-
args: ['container']
|
426
|
-
}], widgetHosts: [{
|
427
|
-
type: ViewChildren,
|
428
|
-
args: [AXWidgetHostComponent]
|
429
|
-
}], galleryItems: [{
|
430
|
-
type: Input
|
431
|
-
}], tileSize: [{
|
432
|
-
type: Input
|
433
|
-
}], gapSize: [{
|
434
|
-
type: Input
|
435
|
-
}], readonly: [{
|
436
|
-
type: Input
|
437
|
-
}], provideValue: [{
|
438
|
-
type: Input
|
439
|
-
}], onConfigChanged: [{
|
440
|
-
type: Output
|
441
|
-
}], onWidgetSave: [{
|
442
|
-
type: Output
|
443
|
-
}] } });
|
444
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fjb3JleC9sYXlvdXQvc3JjL2xpYi93aWRnZXQtYm9hcmQvd2lkZ2V0LWJvYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fjb3JleC9sYXlvdXQvc3JjL2xpYi93aWRnZXQtYm9hcmQvd2lkZ2V0LWJvYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsU0FBUyxFQUNULE1BQU0sRUFDTix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFDdEMsTUFBTSxlQUFlLENBQUM7QUFPdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7Ozs7QUFXN0MsTUFBTSxPQUFPLHNCQUFzQjtJQXFEakMsWUFDVSxHQUErQixFQUMvQixJQUFZLEVBQ1osR0FBc0I7UUFGdEIsUUFBRyxHQUFILEdBQUcsQ0FBNEI7UUFDL0IsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBaERoQyxZQUFPLEdBQXFCLEVBQUUsQ0FBQztRQUcvQixpQkFBWSxHQUFxQixFQUFFLENBQUM7UUFHcEMsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUd0QixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBSXBCLGFBQVEsR0FBWSxLQUFLLENBQUM7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LFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVPLGlCQUFpQixDQUFDLElBQW9EO1FBQzVFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO1lBQ3hCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUM7SUFDTCxDQUFDOztvSEFoZVUsc0JBQXNCO3dHQUF0QixzQkFBc0Isb2JBS25CLHFCQUFxQixnREN0Q3JDLDBnQkFPQTs0RkQwQmEsc0JBQXNCO2tCQVJsQyxTQUFTOytCQUNFLGlCQUFpQixRQUdyQixFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxpQkFDbkIsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTTtzSkFLdkMsU0FBUztzQkFEaEIsU0FBUzt1QkFBQyxXQUFXO2dCQUlkLFdBQVc7c0JBRGxCLFlBQVk7dUJBQUMscUJBQXFCO2dCQU1uQyxZQUFZO3NCQURYLEtBQUs7Z0JBSU4sUUFBUTtzQkFEUCxLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFLTixRQUFRO3NCQURQLEtBQUs7Z0JBaUJOLFlBQVk7c0JBRFgsS0FBSztnQkFZTixlQUFlO3NCQURkLE1BQU07Z0JBSVAsWUFBWTtzQkFEWCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIElucHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgRWxlbWVudFJlZixcbiAgVmlld0NoaWxkLFxuICBOZ1pvbmUsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQVhXaWRnZXRDb25maWcsXG4gIEFYV2lkZ2V0Q29uZmlnQ2hhbmdlZCxcbiAgQVhXaWRnZXRCb2FyZENvbmZpZ0NoYW5nZWQsXG4gIEFYV2lkZ2V0Q29uZmlnU2F2ZWRFdmVudFxufSBmcm9tICcuL3dpZGdldC5jbGFzcyc7XG5pbXBvcnQgeyBBWFdpZGdldEhvc3RDb21wb25lbnQgfSBmcm9tICcuL3dpZGdldC1ob3N0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBWEh0bWxVdGlsLCBBWENsaWVudFJlYyB9IGZyb20gJ0BhY29yZXgvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdheC13aWRnZXQtYm9hcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vd2lkZ2V0LWJvYXJkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vd2lkZ2V0LWJvYXJkLmNvbXBvbmVudC5zY3NzJ10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdheCB3aWRnZXQtYm9hcmQnIH0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEFYV2lkZ2V0Qm9hcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpXG4gIHByaXZhdGUgY29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkcmVuKEFYV2lkZ2V0SG9zdENvbXBvbmVudClcbiAgcHJpdmF0ZSB3aWRnZXRIb3N0czogUXVlcnlMaXN0PEFYV2lkZ2V0SG9zdENvbXBvbmVudD47XG5cbiAgd2lkZ2V0czogQVhXaWRnZXRDb25maWdbXSA9IFtdO1xuXG4gIEBJbnB1dCgpXG4gIGdhbGxlcnlJdGVtczogQVhXaWRnZXRDb25maWdbXSA9IFtdO1xuXG4gIEBJbnB1dCgpXG4gIHRpbGVTaXplOiBudW1iZXIgPSA4MDtcblxuICBASW5wdXQoKVxuICBnYXBTaXplOiBudW1iZXIgPSA1O1xuXG5cbiAgQElucHV0KClcbiAgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIG5ld1dpZGdldDogQVhXaWRnZXRDb25maWcgPSBudWxsO1xuXG4gIHB1YmxpYyBydGw6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfaXNJbkVkaXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGlzSW5FZGl0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0luRWRpdGluZztcbiAgfVxuICBwcml2YXRlIGlzRHJhZ2dpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBkcmFnSXRlbTogSFRNTEVsZW1lbnQ7XG5cbiAgcHJpdmF0ZSBzYXZlU3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICBASW5wdXQoKVxuICBwcm92aWRlVmFsdWU6IChlOiBhbnkpID0+IGFueTtcblxuICBwcml2YXRlIHJlYWRvbmx5IERBVEFfQ09MID0gJ2RhdGEtY29sJztcbiAgcHJpdmF0ZSByZWFkb25seSBEQVRBX1JPVyA9ICdkYXRhLXJvdyc7XG4gIHByaXZhdGUgcmVhZG9ubHkgREFUQV9TSVpFX1ggPSAnZGF0YS1zaXplLXgnO1xuICBwcml2YXRlIHJlYWRvbmx5IERBVEFfU0laRV9ZID0gJ2RhdGEtc2l6ZS15JztcbiAgcHJpdmF0ZSByZWFkb25seSBEQVRBX09MRF9DT0wgPSAnZGF0YS1vbGQtY29sJztcbiAgcHJpdmF0ZSByZWFkb25seSBEQVRBX09MRF9ST1cgPSAnZGF0YS1vbGQtcm93JztcblxuXG4gIEBPdXRwdXQoKVxuICBvbkNvbmZpZ0NoYW5nZWQ6IEV2ZW50RW1pdHRlcjxBWFdpZGdldEJvYXJkQ29uZmlnQ2hhbmdlZD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYV2lkZ2V0Qm9hcmRDb25maWdDaGFuZ2VkPigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbldpZGdldFNhdmU6IEV2ZW50RW1pdHRlcjxBWFdpZGdldENvbmZpZ1NhdmVkRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWFdpZGdldENvbmZpZ1NhdmVkRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+LFxuICAgIHByaXZhdGUgem9uZTogTmdab25lLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHsgfVxuXG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMucnRsID09IG51bGwpIHtcbiAgICAgIHRoaXMucnRsID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5yZWYubmF0aXZlRWxlbWVudCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgnZGlyZWN0aW9uJykgPT09ICdydGwnO1xuICAgIH1cbiAgICB0aGlzLnNhdmVTdWJqZWN0LnBpcGUoZGVib3VuY2VUaW1lKDc1MCkpLnN1YnNjcmliZSgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlZCh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpXG4gIHtcbiAgICB0aGlzLnNhdmVTdWJqZWN0Py51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoYykgPT4ge1xuICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgICB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICAgIC8vIGFkZCBjc3MgZGF0YSBjbGFzc2VzXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSA1MDsgaSsrKSB7XG4gICAgICAgIHN0eWxlLmlubmVySFRNTCArPSBgWyR7dGhpcy5EQVRBX0NPTH09XCIke2l9XCJdIHsgICR7dGhpcy5ydGwgPyAncmlnaHQnIDogJ2xlZnQnfTogJHsoaSAtIDEpICogKHRoaXMudGlsZVNpemUgKyB0aGlzLmdhcFNpemUpfXB4OyB9YDtcbiAgICAgICAgc3R5bGUuaW5uZXJIVE1MICs9IGBbJHt0aGlzLkRBVEFfUk9XfT1cIiR7aX1cIl0geyAgdG9wOiAkeyhpIC0gMSkgKiAodGhpcy50aWxlU2l6ZSArIHRoaXMuZ2FwU2l6ZSl9cHg7IH1gO1xuICAgICAgICBzdHlsZS5pbm5lckhUTUwgKz0gYFske3RoaXMuREFUQV9TSVpFX1h9PVwiJHtpfVwiXSB7ICB3aWR0aDogICR7KGkgKiB0aGlzLnRpbGVTaXplKSArICgoaSAtIDEpICogdGhpcy5nYXBTaXplKX1weDsgfWA7XG4gICAgICAgIHN0eWxlLmlubmVySFRNTCArPSBgWyR7dGhpcy5EQVRBX1NJWkVfWX09XCIke2l9XCJdIHsgIGhlaWdodDogJHsoaSAqIHRoaXMudGlsZVNpemUpICsgKChpIC0gMSkgKiB0aGlzLmdhcFNpemUpfXB4OyB9YDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY0dyaWRTaXplKCkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCB3aWR0aCA9XG4gICAgICAgIChNYXRoLm1heCguLi50aGlzLndpZGdldHMubWFwKChjKSA9PiBjLmNvbCArIGMuc2l6ZVggLSAxKSkpICogKHRoaXMudGlsZVNpemUgKyB0aGlzLmdhcFNpemUpO1xuICAgICAgY29uc3QgaGVpZ2h0ID1cbiAgICAgICAgKE1hdGgubWF4KC4uLnRoaXMud2lkZ2V0cy5tYXAoKGMpID0+IGMucm93ICsgYy5zaXplWSAtIDEpKSkgKiAodGhpcy50aWxlU2l6ZSArIHRoaXMuZ2FwU2l6ZSk7XG4gICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICAgICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlRWRpdCgpIHtcbiAgICB0aGlzLl9pc0luRWRpdGluZyA/IHRoaXMuZmluaXNoRWRpdCgpIDogdGhpcy5zdGFydEVkaXQoKTtcbiAgfVxuXG5cblxuICBwcml2YXRlIGRyYWdTdGFydChlOiBNb3VzZUV2ZW50KSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc0luRWRpdGluZyAmJiBlLndoaWNoID09PSAxKSB7XG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0gPSBlLmN1cnJlbnRUYXJnZXQgYXMgYW55O1xuICAgICAgICB0aGlzLmRyYWdJdGVtLnNldEF0dHJpYnV0ZSgnZGF0YS14LW9mZnNldCcsICh0aGlzLmRyYWdJdGVtLm9mZnNldExlZnQgLSBlLmNsaWVudFgpLnRvU3RyaW5nKCkpO1xuICAgICAgICAvL1xuICAgICAgICB0aGlzLmRyYWdJdGVtLnNldEF0dHJpYnV0ZSgnZGF0YS15LW9mZnNldCcsICh0aGlzLmRyYWdJdGVtLm9mZnNldFRvcCAtIGUuY2xpZW50WSkudG9TdHJpbmcoKSk7XG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0uY2xhc3NMaXN0LmFkZCgnd2lkZ2V0LWRyYWdnaW5nJyk7XG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnYW5pbWF0ZV9fYW5pbWF0ZWQnLCAnYW5pbWF0ZV9fcHVsc2UnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZW1vdmVQb3NpdGlvbkRhdGEoKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRyYWdJdGVtICYmIHRoaXMuX2lzSW5FZGl0aW5nICYmIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9PTERfQ09MKSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0uc2V0QXR0cmlidXRlKHRoaXMuREFUQV9PTERfQ09MLCB0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfQ09MKSk7XG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0uc2V0QXR0cmlidXRlKHRoaXMuREFUQV9PTERfUk9XLCB0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfUk9XKSk7XG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0ucmVtb3ZlQXR0cmlidXRlKHRoaXMuREFUQV9DT0wpO1xuICAgICAgICB0aGlzLmRyYWdJdGVtLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLkRBVEFfUk9XKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJlc2V0UG9zaXRpb25EYXRhKCkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kcmFnSXRlbSAmJiB0aGlzLl9pc0luRWRpdGluZykge1xuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMuZHJhZ0l0ZW0sIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9PTERfQ09MKSwgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX09MRF9ST1cpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UG9zaXRpb24oZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbDogc3RyaW5nLCByb3c6IHN0cmluZykge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSh0aGlzLkRBVEFfQ09MLCBjb2wpO1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1JPVywgcm93KTtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHRoaXMuREFUQV9PTERfQ09MKTtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHRoaXMuREFUQV9PTERfUk9XKTtcbiAgICAgIGVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3RvcCcpO1xuICAgICAgZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGVmdCcpO1xuICAgICAgY29uc3Qgd2lkZ2V0ID0gdGhpcy53aWRnZXRzLmZpbmQoYyA9PiBjWydfX21ldGFfXyddLmluc3RhbmNlLmVsZW1lbnQgPT09IGVsZW1lbnQpO1xuICAgICAgd2lkZ2V0LmNvbCA9IE51bWJlcihjb2wpO1xuICAgICAgd2lkZ2V0LnJvdyA9IE51bWJlcihyb3cpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmFnKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZHJhZ0l0ZW0gJiYgdGhpcy5faXNJbkVkaXRpbmcpIHtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hZGRQbGFjZWhvbGRlcigpO1xuICAgICAgICBjb25zdCB4T2Zmc2V0ID0gTnVtYmVyKHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXgtb2Zmc2V0JykpO1xuICAgICAgICBjb25zdCB5T2Zmc2V0ID0gTnVtYmVyKHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXktb2Zmc2V0JykpO1xuICAgICAgICB0aGlzLmRyYWdJdGVtLnN0eWxlLmxlZnQgPSBlLmNsaWVudFggKyB4T2Zmc2V0ICsgJ3B4JztcbiAgICAgICAgdGhpcy5kcmFnSXRlbS5zdHlsZS50b3AgPSBlLmNsaWVudFkgKyB5T2Zmc2V0ICsgJ3B4JztcbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5kZXRlY3RCZXN0UGxhY2VtZW50KCk7XG4gICAgICAgIHRoaXMucmVtb3ZlUG9zaXRpb25EYXRhKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmFnRW5kKGUpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZHJhZ0l0ZW0gJiYgdGhpcy5faXNJbkVkaXRpbmcgJiYgdGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnd2lkZ2V0LWRyYWdnaW5nJyk7XG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0uY2xhc3NMaXN0LmFkZCgnYW5pbWF0ZV9fYW5pbWF0ZWQnLCAnYW5pbWF0ZV9fcHVsc2UnKTtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgcCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLndpZGdldC1ibGFuay1wbGFjZWhvbGRlcicpO1xuICAgICAgICBpZiAodGhpcy5uZXdXaWRnZXQpIHtcbiAgICAgICAgICBjb25zdCB3ID0ge1xuICAgICAgICAgICAgdW5pcXVlTmFtZTogdGhpcy5uZXdXaWRnZXQudW5pcXVlTmFtZSxcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5uZXdXaWRnZXQuY29tcG9uZW50LFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMubmV3V2lkZ2V0LnRpdGxlLFxuICAgICAgICAgICAgb3B0aW9uczogdGhpcy5uZXdXaWRnZXQub3B0aW9ucyxcbiAgICAgICAgICAgIHNpemVYOiB0aGlzLm5ld1dpZGdldC5zaXplWCxcbiAgICAgICAgICAgIHNpemVZOiB0aGlzLm5ld1dpZGdldC5zaXplWSxcbiAgICAgICAgICAgIGNvbDogTnVtYmVyKHAuZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9DT0wpKSxcbiAgICAgICAgICAgIHJvdzogTnVtYmVyKHAuZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9ST1cpKVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0aGlzLndpZGdldHMucHVzaCh3KTtcbiAgICAgICAgICB0aGlzLm5ld1dpZGdldCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmRyYWdJdGVtKTtcbiAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuY2FsY0dyaWRTaXplKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgd1snX19tZXRhX18nXS5pbnN0YW5jZS5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuZHJhZ1N0YXJ0LmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChwKSB7XG4gICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMuZHJhZ0l0ZW0sIHAuZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9DT0wpLCBwLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfUk9XKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbih0aGlzLmRyYWdJdGVtLCB0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfT0xEX0NPTCksIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9PTERfUk9XKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMucmVtb3ZlUGxhY2Vob2xkZXIoKTtcbiAgICAgICAgdGhpcy5kcmFnSXRlbSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FsY0dyaWRTaXplKCk7XG4gICAgICAgIHRoaXMuc2F2ZVN1YmplY3QubmV4dCgnY29uZmlnJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0Rmlyc3RFbXB0eVNsb3QodzogQVhXaWRnZXRDb25maWcpIHtcbiAgICBjb25zdCB4VGlsZSA9IE1hdGguZmxvb3IodGhpcy5yZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldFdpZHRoIC8gdGhpcy50aWxlU2l6ZSk7XG4gICAgZm9yIChsZXQgaiA9IDE7IGogPD0gMTAwOyBqKyspIHtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHhUaWxlIC0gdy5zaXplWDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJlYyA9IG5ldyBBWENsaWVudFJlYyh7XG4gICAgICAgICAgbGVmdDogaSxcbiAgICAgICAgICB0b3A6IGosXG4gICAgICAgICAgd2lkdGg6IHcuc2l6ZVgsXG4gICAgICAgICAgaGVpZ2h0OiB3LnNpemVZXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbCA9IHRoaXMud2lkZ2V0cy5maWx0ZXIoYyA9PiBjICE9PSB3KS5maW5kKChjKSA9PlxuICAgICAgICAgIHJlYy5pbnRlcnNlY3Qoe1xuICAgICAgICAgICAgbGVmdDogYy5jb2wsXG4gICAgICAgICAgICB0b3A6IGMucm93LFxuICAgICAgICAgICAgd2lkdGg6IGMuc2l6ZVgsXG4gICAgICAgICAgICBoZWlnaHQ6IGMuc2l6ZVlcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBpZiAoZWwgPT0gbnVsbCkge1xuICAgICAgICAgIHcuY29sID0gaTtcbiAgICAgICAgICB3LnJvdyA9IGo7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXRlY3RCZXN0UGxhY2VtZW50KCkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBwID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2lkZ2V0LWJsYW5rLXBsYWNlaG9sZGVyJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBsZXQgY29sID0gTWF0aC5jZWlsKHRoaXMuZHJhZ0l0ZW0ub2Zmc2V0TGVmdCAvIHRoaXMudGlsZVNpemUpO1xuICAgICAgaWYgKHRoaXMucnRsKSB7XG4gICAgICAgIGNvbCA9IE1hdGguY2VpbCgodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCAtICh0aGlzLmRyYWdJdGVtLm9mZnNldExlZnQgKyB0aGlzLmRyYWdJdGVtLmNsaWVudFdpZHRoKSkgLyB0aGlzLnRpbGVTaXplKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHJvdyA9IE1hdGguY2VpbCh0aGlzLmRyYWdJdGVtLm9mZnNldFRvcCAvIHRoaXMudGlsZVNpemUpO1xuICAgICAgaWYgKGNvbCA8IDEpIHtcbiAgICAgICAgY29sID0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChyb3cgPCAxKSB7XG4gICAgICAgIHJvdyA9IDE7XG4gICAgICB9XG4gICAgICBjb25zdCB3aWRnZXRzID0gQXJyYXkuZnJvbSh0aGlzLnJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy53aWRnZXQtaG9zdCcpKS5tYXAoKGMpID0+IGMgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgcC5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX0NPTCwgY29sLnRvU3RyaW5nKCkpO1xuICAgICAgcC5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1JPVywgcm93LnRvU3RyaW5nKCkpO1xuICAgICAgY29uc3QgY29sbGlzaW9uID0gd2lkZ2V0cy5maWx0ZXIoYyA9PiBjICE9PSB0aGlzLmRyYWdJdGVtKS5zb21lKGMgPT4gQVhIdG1sVXRpbC5jb2xsaXNpb24oYywgdGhpcy5kcmFnSXRlbSkpO1xuICAgICAgaWYgKGNvbGxpc2lvbikge1xuICAgICAgICB0aGlzLnJlbW92ZVBsYWNlaG9sZGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG4gIHByaXZhdGUgYWRkUGxhY2Vob2xkZXIoKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMucmVtb3ZlUGxhY2Vob2xkZXIoKTtcbiAgICAgIGlmICh0aGlzLmRyYWdJdGVtKSB7XG4gICAgICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcC5jbGFzc0xpc3QuYWRkKCd3aWRnZXQtYmxhbmstcGxhY2Vob2xkZXInKTtcbiAgICAgICAgcC5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX0NPTCwgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX0NPTCkpO1xuICAgICAgICBwLnNldEF0dHJpYnV0ZSh0aGlzLkRBVEFfUk9XLCB0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfUk9XKSk7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKHRoaXMuREFUQV9TSVpFX1gsIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9TSVpFX1gpKTtcbiAgICAgICAgcC5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1NJWkVfWSwgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1NJWkVfWSkpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKHApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVQbGFjZWhvbGRlcigpIHtcbiAgICBjb25zdCBwID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2lkZ2V0LWJsYW5rLXBsYWNlaG9sZGVyJyk7XG4gICAgcD8ucmVtb3ZlKCk7XG4gIH1cblxuICBwdWJsaWMgc3RhcnRFZGl0KCkge1xuICAgIHRoaXMuX2lzSW5FZGl0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNhbGNHcmlkU2l6ZSgpO1xuICAgIHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZ3JpZC1iYWNrZ3JvdW5kJyk7XG4gICAgY29uc3QgYmcgPSB0aGlzLnJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50O1xuICAgIGJnLnN0eWxlLnNldFByb3BlcnR5KCdiYWNrZ3JvdW5kLXBvc2l0aW9uJywgYCR7dGhpcy5ydGwgPyAncmlnaHQnIDogJ2xlZnQnfSB0b3BgKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgIGNvbnN0IHBhdHRlcm4gPSBgdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB3aWR0aD1cIiR7dGhpcy50aWxlU2l6ZSArIHRoaXMuZ2FwU2l6ZX1cIiBoZWlnaHQ9XCIke3RoaXMudGlsZVNpemUgKyB0aGlzLmdhcFNpemV9XCI+IDxyZWN0IHN0eWxlPVwiZmlsbDogJTIzZGFkYWRhXCIgeD1cIiR7dGhpcy5ydGwgPyB0aGlzLmdhcFNpemUgOiAwfVwiIHdpZHRoPVwiJHt0aGlzLnRpbGVTaXplfVwiIGhlaWdodD1cIiR7dGhpcy50aWxlU2l6ZX1cIiB5PVwiMFwiPjwvcmVjdD48L3N2Zz4nKWA7XG4gICAgYmcuc3R5bGUuc2V0UHJvcGVydHkoJ2JhY2tncm91bmQtaW1hZ2UnLCBwYXR0ZXJuKTtcbiAgICAvL1xuICAgIGNvbnN0IHdpZGdldHMgPSBBcnJheS5mcm9tKHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLndpZGdldC1ob3N0JykpO1xuICAgIHdpZGdldHMuZm9yRWFjaCgodykgPT4ge1xuICAgICAgdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmRyYWdTdGFydC5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWcuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgIHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ0VuZC5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgZmluaXNoRWRpdCgpIHtcbiAgICB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2dyaWQtYmFja2dyb3VuZCcpO1xuICAgIGNvbnN0IGJnID0gdGhpcy5yZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICBiZy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnYmFja2dyb3VuZC1pbWFnZScpO1xuICAgIC8vXG4gICAgdGhpcy5faXNJbkVkaXRpbmcgPSBmYWxzZTtcbiAgICBjb25zdCB3aWRnZXRzID0gQXJyYXkuZnJvbSh0aGlzLnJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy53aWRnZXQtaG9zdCcpKTtcbiAgICB3aWRnZXRzLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5kcmFnU3RhcnQuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgIH0pO1xuICAgIHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmRyYWdFbmQuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgIHRoaXMuc2F2ZVN1YmplY3QubmV4dCgnY29uZmlnJyk7XG4gIH1cblxuXG4gIGFkZFdpZGdldCh3aWRnZXQ6IEFYV2lkZ2V0Q29uZmlnKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMubmV3V2lkZ2V0ID0ge1xuICAgICAgICB1bmlxdWVOYW1lOiB3aWRnZXQudW5pcXVlTmFtZSxcbiAgICAgICAgY29tcG9uZW50OiB3aWRnZXQuY29tcG9uZW50LFxuICAgICAgICB0aXRsZTogd2lkZ2V0LnRpdGxlLFxuICAgICAgICBjb2w6IDEsXG4gICAgICAgIHJvdzogMSxcbiAgICAgICAgc2l6ZVg6IHdpZGdldC5zaXplWCxcbiAgICAgICAgc2l6ZVk6IHdpZGdldC5zaXplWSxcbiAgICAgICAgb3B0aW9uczogd2lkZ2V0Lm9wdGlvbnMsXG4gICAgICAgIHByb3BzOiB3aWRnZXQucHJvcHNcbiAgICAgIH07XG4gICAgICB0aGlzLmRldGVjdEZpcnN0RW1wdHlTbG90KHRoaXMubmV3V2lkZ2V0KTtcbiAgICAgIGNvbnN0IHcgPSB7XG4gICAgICAgIHVuaXF1ZU5hbWU6IHRoaXMubmV3V2lkZ2V0LnVuaXF1ZU5hbWUsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcy5uZXdXaWRnZXQuY29tcG9uZW50LFxuICAgICAgICB0aXRsZTogdGhpcy5uZXdXaWRnZXQudGl0bGUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMubmV3V2lkZ2V0Lm9wdGlvbnMsXG4gICAgICAgIHByb3BzOiB0aGlzLm5ld1dpZGdldC5wcm9wcyxcbiAgICAgICAgc2l6ZVg6IHRoaXMubmV3V2lkZ2V0LnNpemVYLFxuICAgICAgICBzaXplWTogdGhpcy5uZXdXaWRnZXQuc2l6ZVksXG4gICAgICAgIGNvbDogdGhpcy5uZXdXaWRnZXQuY29sLFxuICAgICAgICByb3c6IHRoaXMubmV3V2lkZ2V0LnJvd1xuICAgICAgfTtcbiAgICAgIHRoaXMud2lkZ2V0cy5wdXNoKHcpO1xuICAgICAgdGhpcy5uZXdXaWRnZXQgPSBudWxsO1xuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5jYWxjR3JpZFNpemUoKTtcbiAgICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlZCgnYWRkJyk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHdbJ19fbWV0YV9fJ10uaW5zdGFuY2UuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmRyYWdTdGFydC5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuXG4gIGhhbmRsZU9uUmVtb3ZlKHc6IEFYV2lkZ2V0SG9zdENvbXBvbmVudCkge1xuICAgIHcuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhbmltYXRlX19hbmltYXRlZCcsICdhbmltYXRlX196b29tT3V0Jyk7XG4gICAgdy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2FuaW1hdGlvbmVuZCcsICgpID0+IHtcbiAgICAgIHRoaXMud2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5maWx0ZXIoKGMpID0+IChjIGFzIGFueSkuX19tZXRhX18uaWQgIT09ICh3LmNvbmZpZyBhcyBhbnkpLl9fbWV0YV9fLmlkKTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHRoaXMuY2FsY0dyaWRTaXplKCk7XG4gICAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2VkKCdyZW1vdmUnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZU9uU2F2ZShlOiBBWFdpZGdldENvbmZpZ1NhdmVkRXZlbnQpIHtcbiAgICB0aGlzLm9uV2lkZ2V0U2F2ZS5lbWl0KGUpO1xuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4LCBpdGVtKSB7XG4gICAgaWYgKCFpdGVtWydfX21ldGFfXyddPy5pZCkge1xuICAgICAgaXRlbVsnX19tZXRhX18nXSA9IHt9O1xuICAgICAgaXRlbVsnX19tZXRhX18nXS5pZCA9IEFYSHRtbFV0aWwuZ2V0VUlEKCk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtWydfX21ldGFfXyddPy5pZDtcbiAgfVxuXG5cbiAgbG9hZCh3aWRnZXRzOiBzdHJpbmcgfCBBWFdpZGdldENvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAod2lkZ2V0cykge1xuICAgICAgICBjb25zdCBsb2FkZWRXaWRnZXRzOiBBWFdpZGdldENvbmZpZ1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2Ygd2lkZ2V0cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9hZGVkV2lkZ2V0cy5wdXNoKC4uLkpTT04ucGFyc2Uod2lkZ2V0cykpO1xuICAgICAgICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlZCgnbG9hZCcpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZWplY3QoJ0ludmFsaWQgd2lkZ2V0IGpzb24gZGF0YSEnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgbG9hZGVkV2lkZ2V0cy5wdXNoKC4uLndpZGdldHMpO1xuICAgICAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZWQoJ2xvYWQnKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW50ZXJ2YWxJZDogbnVtYmVyID0gLTE7XG4gICAgICAgIGNvbnN0IGxvYWRGdW5jID0gKCkgPT4ge1xuXG4gICAgICAgICAgaWYgKHRoaXMuZ2FsbGVyeUl0ZW1zICYmIHRoaXMuZ2FsbGVyeUl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvYWRlZFdpZGdldHMuZm9yRWFjaCh3ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZ2l0ZW0gPSB0aGlzLmdhbGxlcnlJdGVtcy5maW5kKGMgPT4gYy51bmlxdWVOYW1lID09PSB3LnVuaXF1ZU5hbWUpO1xuICAgICAgICAgICAgICBpZiAoZ2l0ZW0pIHtcbiAgICAgICAgICAgICAgICB3LmNvbXBvbmVudCA9IGdpdGVtLmNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBpZiAoZ2l0ZW0ucHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIHcucHJvcHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdpdGVtLnByb3BzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0cy5wdXNoKC4uLmxvYWRlZFdpZGdldHMpO1xuICAgICAgICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlZCgnbG9hZCcpO1xuICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKGxvYWRGdW5jLCAyMDApO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIGlmICh0aGlzLndpZGdldHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLndpZGdldHMgPSBbXTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHRoaXMuc2F2ZVN1YmplY3QubmV4dCgnY2xlYXInKTtcbiAgICB9XG4gIH1cblxuICBzYXZlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy53aWRnZXRzLm1hcChjID0+ICh7XG4gICAgICB1bmlxdWVOYW1lOiBjLnVuaXF1ZU5hbWUsXG4gICAgICBjb21wb25lbnQ6IGMuY29tcG9uZW50LFxuICAgICAgdGl0bGU6IGMudGl0bGUsXG4gICAgICBzaXplWDogYy5zaXplWCxcbiAgICAgIHNpemVZOiBjLnNpemVZLFxuICAgICAgY29sOiBjLmNvbCxcbiAgICAgIHJvdzogYy5yb3csXG4gICAgICBvcHRpb25zOiBjLm9wdGlvbnMsXG4gICAgICBwcm9wczogYy5wcm9wc1xuICAgIH0pKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9XG5cbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLndpZGdldEhvc3RzLmZvckVhY2goaG9zdCA9PiB7XG4gICAgICBob3N0LndpZGdldC5yZWZyZXNoKCk7XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVPbkNvbmZpZ0NoYW5nZWQoZTogQVhXaWRnZXRDb25maWdDaGFuZ2VkKSB7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuc2F2ZVN1YmplY3QubmV4dCgnY29uZmlnJyk7XG4gIH1cblxuICBoYW5kbGVPblJlc2l6ZWRDaGFuZ2VkKGU6IEFYV2lkZ2V0Q29uZmlnQ2hhbmdlZCkge1xuICAgIHRoaXMuZGV0ZWN0Rmlyc3RFbXB0eVNsb3QoZS5jb25maWcpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLnNhdmVTdWJqZWN0Lm5leHQoJ2NvbmZpZycpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q29uZmlnQ2hhbmdlZChtb2RlOiAnY2xlYXInIHwgJ2FkZCcgfCAncmVtb3ZlJyB8ICdsb2FkJyB8ICdjb25maWcnKSB7XG4gICAgdGhpcy5vbkNvbmZpZ0NoYW5nZWQuZW1pdCh7XG4gICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICBtb2RlOiBtb2RlXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3aWRnZXRzLWNvbnRhaW5lclwiIFtjbGFzcy5ydGxdPVwicnRsXCIgI2NvbnRhaW5lcj5cbiAgICA8YXgtd2lkZ2V0LWhvc3QgKm5nRm9yPVwibGV0IHcgb2Ygd2lkZ2V0czt0cmFja0J5OiB0cmFja0J5Rm5cIiAgW2NvbmZpZ109J3cnIFtzaXplWF09XCJ3LnNpemVYXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5IHx8IHcucmVhZG9ubHlcIlxuICAgICAgICBbc2l6ZVldPVwidy5zaXplWVwiIFtjb2xdPVwidy5jb2xcIiBbcm93XT1cIncucm93XCIgKG9uUmVtb3ZlKT1cImhhbmRsZU9uUmVtb3ZlKCRldmVudClcIiAob25TYXZlKT1cImhhbmRsZU9uU2F2ZSgkZXZlbnQpXCJcbiAgICAgICAgKG9uQ29uZmlnQ2hhbmdlZCk9XCJoYW5kbGVPbkNvbmZpZ0NoYW5nZWQoJGV2ZW50KVwiIChvblJlc2l6ZWQpPVwiaGFuZGxlT25SZXNpemVkQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgW3Byb3ZpZGVWYWx1ZV09XCJwcm92aWRlVmFsdWVcIj5cbiAgICA8L2F4LXdpZGdldC1ob3N0PlxuPC9kaXY+XG4iXX0=
|