@acorex/layout 6.5.29 → 6.5.32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (26) hide show
  1. package/README.md +1 -1
  2. package/acorex-layout.d.ts +5 -5
  3. package/esm2020/acorex-layout.mjs +4 -4
  4. package/esm2020/lib/widget-board/editors/widget-size-editor/widget-size.editor.mjs +46 -46
  5. package/esm2020/lib/widget-board/editors/widget-size-editor/widget-size.module.mjs +21 -21
  6. package/esm2020/lib/widget-board/widget-board.component.mjs +450 -450
  7. package/esm2020/lib/widget-board/widget-board.module.mjs +111 -111
  8. package/esm2020/lib/widget-board/widget-config.component.mjs +82 -82
  9. package/esm2020/lib/widget-board/widget-host.component.mjs +295 -295
  10. package/esm2020/lib/widget-board/widget-save.component.mjs +79 -79
  11. package/esm2020/lib/widget-board/widget.class.mjs +127 -127
  12. package/esm2020/public-api.mjs +7 -7
  13. package/fesm2015/acorex-layout.mjs +1147 -1147
  14. package/fesm2015/acorex-layout.mjs.map +1 -1
  15. package/fesm2020/acorex-layout.mjs +1140 -1140
  16. package/fesm2020/acorex-layout.mjs.map +1 -1
  17. package/lib/widget-board/editors/widget-size-editor/widget-size.editor.d.ts +19 -19
  18. package/lib/widget-board/editors/widget-size-editor/widget-size.module.d.ts +10 -10
  19. package/lib/widget-board/widget-board.component.d.ts +61 -61
  20. package/lib/widget-board/widget-board.module.d.ts +18 -18
  21. package/lib/widget-board/widget-config.component.d.ts +23 -23
  22. package/lib/widget-board/widget-host.component.d.ts +52 -52
  23. package/lib/widget-board/widget-save.component.d.ts +19 -19
  24. package/lib/widget-board/widget.class.d.ts +58 -58
  25. package/package.json +1 -1
  26. package/public-api.d.ts +6 -6
@@ -1,450 +1,450 @@
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 * as i0 from "@angular/core";
5
- import * as i1 from "./widget-host.component";
6
- import * as i2 from "@angular/common";
7
- export class AXWidgetBoardComponent {
8
- constructor(ref, zone, cdr) {
9
- this.ref = ref;
10
- this.zone = zone;
11
- this.cdr = cdr;
12
- this.widgets = [];
13
- this.galleryItems = [];
14
- this.tileSize = 80;
15
- this.gapSize = 5;
16
- this.readonly = false;
17
- this.newWidget = null;
18
- this._isInEditing = false;
19
- this.isDragging = false;
20
- this.DATA_COL = 'data-col';
21
- this.DATA_ROW = 'data-row';
22
- this.DATA_SIZE_X = 'data-size-x';
23
- this.DATA_SIZE_Y = 'data-size-y';
24
- this.DATA_OLD_COL = 'data-old-col';
25
- this.DATA_OLD_ROW = 'data-old-row';
26
- this.onConfigChanged = new EventEmitter();
27
- this.onWidgetSave = new EventEmitter();
28
- }
29
- isInEditing() {
30
- return this._isInEditing;
31
- }
32
- ngOnInit() {
33
- if (this.rtl == null) {
34
- this.rtl = window.getComputedStyle(this.ref.nativeElement, null).getPropertyValue('direction') === 'rtl';
35
- }
36
- }
37
- ngAfterViewInit() {
38
- this.zone.runOutsideAngular((c) => {
39
- const style = document.createElement('style');
40
- style.type = 'text/css';
41
- this.ref.nativeElement.appendChild(style);
42
- // add css data classes
43
- for (let i = 1; i <= 50; i++) {
44
- style.innerHTML += `[${this.DATA_COL}="${i}"] { ${this.rtl ? 'right' : 'left'}: ${(i - 1) * (this.tileSize + this.gapSize)}px; }`;
45
- style.innerHTML += `[${this.DATA_ROW}="${i}"] { top: ${(i - 1) * (this.tileSize + this.gapSize)}px; }`;
46
- style.innerHTML += `[${this.DATA_SIZE_X}="${i}"] { width: ${(i * this.tileSize) + ((i - 1) * this.gapSize)}px; }`;
47
- style.innerHTML += `[${this.DATA_SIZE_Y}="${i}"] { height: ${(i * this.tileSize) + ((i - 1) * this.gapSize)}px; }`;
48
- }
49
- });
50
- }
51
- calcGridSize() {
52
- this.zone.runOutsideAngular(() => {
53
- const width = (Math.max(...this.widgets.map((c) => c.col + c.sizeX - 1))) * (this.tileSize + this.gapSize);
54
- const height = (Math.max(...this.widgets.map((c) => c.row + c.sizeY - 1))) * (this.tileSize + this.gapSize);
55
- this.container.nativeElement.style.width = width + 'px';
56
- this.container.nativeElement.style.height = height + 'px';
57
- });
58
- }
59
- toggleEdit() {
60
- this._isInEditing ? this.finishEdit() : this.startEdit();
61
- }
62
- dragStart(e) {
63
- e.preventDefault();
64
- e.stopPropagation();
65
- this.zone.runOutsideAngular(() => {
66
- if (this._isInEditing && e.which === 1) {
67
- this.dragItem = e.currentTarget;
68
- this.dragItem.setAttribute('data-x-offset', (this.dragItem.offsetLeft - e.clientX).toString());
69
- //
70
- this.dragItem.setAttribute('data-y-offset', (this.dragItem.offsetTop - e.clientY).toString());
71
- this.dragItem.classList.add('widget-dragging');
72
- this.dragItem.classList.remove('animate__animated', 'animate__pulse');
73
- }
74
- });
75
- return false;
76
- }
77
- removePositionData() {
78
- this.zone.runOutsideAngular(() => {
79
- if (this.dragItem && this._isInEditing && this.dragItem.getAttribute(this.DATA_OLD_COL) == null) {
80
- this.dragItem.setAttribute(this.DATA_OLD_COL, this.dragItem.getAttribute(this.DATA_COL));
81
- this.dragItem.setAttribute(this.DATA_OLD_ROW, this.dragItem.getAttribute(this.DATA_ROW));
82
- this.dragItem.removeAttribute(this.DATA_COL);
83
- this.dragItem.removeAttribute(this.DATA_ROW);
84
- }
85
- });
86
- }
87
- resetPositionData() {
88
- this.zone.runOutsideAngular(() => {
89
- if (this.dragItem && this._isInEditing) {
90
- this.setPosition(this.dragItem, this.dragItem.getAttribute(this.DATA_OLD_COL), this.dragItem.getAttribute(this.DATA_OLD_ROW));
91
- }
92
- });
93
- }
94
- setPosition(element, col, row) {
95
- this.zone.runOutsideAngular(() => {
96
- element.setAttribute(this.DATA_COL, col);
97
- element.setAttribute(this.DATA_ROW, row);
98
- element.removeAttribute(this.DATA_OLD_COL);
99
- element.removeAttribute(this.DATA_OLD_ROW);
100
- element.style.removeProperty('top');
101
- element.style.removeProperty('left');
102
- const widget = this.widgets.find(c => c['__meta__'].instance.element === element);
103
- widget.col = Number(col);
104
- widget.row = Number(row);
105
- });
106
- }
107
- drag(e) {
108
- e.preventDefault();
109
- e.stopPropagation();
110
- this.zone.runOutsideAngular(() => {
111
- if (this.dragItem && this._isInEditing) {
112
- this.isDragging = true;
113
- this.addPlaceholder();
114
- const xOffset = Number(this.dragItem.getAttribute('data-x-offset'));
115
- const yOffset = Number(this.dragItem.getAttribute('data-y-offset'));
116
- this.dragItem.style.left = e.clientX + xOffset + 'px';
117
- this.dragItem.style.top = e.clientY + yOffset + 'px';
118
- //
119
- this.detectBestPlacement();
120
- this.removePositionData();
121
- }
122
- });
123
- return false;
124
- }
125
- dragEnd(e) {
126
- this.zone.runOutsideAngular(() => {
127
- if (this.dragItem && this._isInEditing && this.isDragging) {
128
- this.dragItem.classList.remove('widget-dragging');
129
- this.dragItem.classList.add('animate__animated', 'animate__pulse');
130
- //
131
- const p = this.container.nativeElement.querySelector('.widget-blank-placeholder');
132
- if (this.newWidget) {
133
- const w = {
134
- uniqueName: this.newWidget.uniqueName,
135
- component: this.newWidget.component,
136
- title: this.newWidget.title,
137
- options: this.newWidget.options,
138
- sizeX: this.newWidget.sizeX,
139
- sizeY: this.newWidget.sizeY,
140
- col: Number(p.getAttribute(this.DATA_COL)),
141
- row: Number(p.getAttribute(this.DATA_ROW))
142
- };
143
- this.widgets.push(w);
144
- this.newWidget = null;
145
- this.container.nativeElement.removeChild(this.dragItem);
146
- this.zone.run(() => {
147
- this.cdr.detectChanges();
148
- this.calcGridSize();
149
- setTimeout(() => {
150
- w['__meta__'].instance.element.addEventListener('mousedown', this.dragStart.bind(this), false);
151
- }, 1000);
152
- });
153
- }
154
- else {
155
- if (p) {
156
- this.setPosition(this.dragItem, p.getAttribute(this.DATA_COL), p.getAttribute(this.DATA_ROW));
157
- }
158
- else {
159
- this.setPosition(this.dragItem, this.dragItem.getAttribute(this.DATA_OLD_COL), this.dragItem.getAttribute(this.DATA_OLD_ROW));
160
- }
161
- }
162
- //
163
- this.removePlaceholder();
164
- this.dragItem = null;
165
- this.calcGridSize();
166
- this.emitConfigChanged('config');
167
- }
168
- this.isDragging = false;
169
- });
170
- }
171
- detectFirstEmptySlot(w) {
172
- const xTile = Math.floor(this.ref.nativeElement.parentElement.offsetWidth / this.tileSize);
173
- for (let j = 1; j <= 100; j++) {
174
- for (let i = 1; i <= xTile - w.sizeX; i++) {
175
- const rec = new AXClientRec({
176
- left: i,
177
- top: j,
178
- width: w.sizeX,
179
- height: w.sizeY
180
- });
181
- const el = this.widgets.filter(c => c !== w).find((c) => rec.intersect({
182
- left: c.col,
183
- top: c.row,
184
- width: c.sizeX,
185
- height: c.sizeY
186
- }));
187
- if (el == null) {
188
- w.col = i;
189
- w.row = j;
190
- return;
191
- }
192
- }
193
- }
194
- }
195
- detectBestPlacement() {
196
- this.zone.runOutsideAngular(() => {
197
- const p = this.container.nativeElement.querySelector('.widget-blank-placeholder');
198
- let col = Math.ceil(this.dragItem.offsetLeft / this.tileSize);
199
- if (this.rtl) {
200
- col = Math.ceil((this.container.nativeElement.clientWidth - (this.dragItem.offsetLeft + this.dragItem.clientWidth)) / this.tileSize);
201
- }
202
- let row = Math.ceil(this.dragItem.offsetTop / this.tileSize);
203
- if (col < 1) {
204
- col = 1;
205
- }
206
- if (row < 1) {
207
- row = 1;
208
- }
209
- const widgets = Array.from(this.ref.nativeElement.querySelectorAll('.widget-host')).map((c) => c);
210
- p.setAttribute(this.DATA_COL, col.toString());
211
- p.setAttribute(this.DATA_ROW, row.toString());
212
- const collision = widgets.filter(c => c !== this.dragItem).some(c => AXHtmlUtil.collision(c, this.dragItem));
213
- if (collision) {
214
- this.removePlaceholder();
215
- }
216
- });
217
- }
218
- addPlaceholder() {
219
- this.zone.runOutsideAngular(() => {
220
- this.removePlaceholder();
221
- if (this.dragItem) {
222
- const p = document.createElement('div');
223
- p.classList.add('widget-blank-placeholder');
224
- p.setAttribute(this.DATA_COL, this.dragItem.getAttribute(this.DATA_COL));
225
- p.setAttribute(this.DATA_ROW, this.dragItem.getAttribute(this.DATA_ROW));
226
- p.setAttribute(this.DATA_SIZE_X, this.dragItem.getAttribute(this.DATA_SIZE_X));
227
- p.setAttribute(this.DATA_SIZE_Y, this.dragItem.getAttribute(this.DATA_SIZE_Y));
228
- this.container.nativeElement.appendChild(p);
229
- }
230
- });
231
- }
232
- removePlaceholder() {
233
- const p = this.container.nativeElement.querySelector('.widget-blank-placeholder');
234
- p?.remove();
235
- }
236
- startEdit() {
237
- this._isInEditing = true;
238
- this.calcGridSize();
239
- this.ref.nativeElement.classList.add('grid-background');
240
- const bg = this.ref.nativeElement;
241
- bg.style.setProperty('background-position', `${this.rtl ? 'right' : 'left'} top`);
242
- // tslint:disable-next-line: max-line-length
243
- 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>')`;
244
- bg.style.setProperty('background-image', pattern);
245
- //
246
- const widgets = Array.from(this.ref.nativeElement.querySelectorAll('.widget-host'));
247
- widgets.forEach((w) => {
248
- w.addEventListener('mousedown', this.dragStart.bind(this), false);
249
- });
250
- this.ref.nativeElement.addEventListener('mousemove', this.drag.bind(this), false);
251
- this.ref.nativeElement.addEventListener('mouseup', this.dragEnd.bind(this), false);
252
- }
253
- finishEdit() {
254
- this.ref.nativeElement.classList.remove('grid-background');
255
- const bg = this.ref.nativeElement;
256
- bg.style.removeProperty('background-image');
257
- //
258
- this._isInEditing = false;
259
- const widgets = Array.from(this.ref.nativeElement.querySelectorAll('.widget-host'));
260
- widgets.forEach((w) => {
261
- w.removeEventListener('mousedown', this.dragStart.bind(this), false);
262
- });
263
- this.ref.nativeElement.removeEventListener('mousemove', this.drag.bind(this), false);
264
- this.ref.nativeElement.removeEventListener('mouseup', this.dragEnd.bind(this), false);
265
- this.emitConfigChanged('config');
266
- }
267
- addWidget(widget) {
268
- this.zone.runOutsideAngular(() => {
269
- this.newWidget = {
270
- uniqueName: widget.uniqueName,
271
- component: widget.component,
272
- title: widget.title,
273
- col: 1,
274
- row: 1,
275
- sizeX: widget.sizeX,
276
- sizeY: widget.sizeY,
277
- options: widget.options,
278
- props: widget.props
279
- };
280
- this.detectFirstEmptySlot(this.newWidget);
281
- const w = {
282
- uniqueName: this.newWidget.uniqueName,
283
- component: this.newWidget.component,
284
- title: this.newWidget.title,
285
- options: this.newWidget.options,
286
- props: this.newWidget.props,
287
- sizeX: this.newWidget.sizeX,
288
- sizeY: this.newWidget.sizeY,
289
- col: this.newWidget.col,
290
- row: this.newWidget.row
291
- };
292
- this.widgets.push(w);
293
- this.newWidget = null;
294
- this.zone.run(() => {
295
- this.cdr.detectChanges();
296
- this.calcGridSize();
297
- this.emitConfigChanged('add');
298
- setTimeout(() => {
299
- w['__meta__'].instance.element.addEventListener('mousedown', this.dragStart.bind(this), false);
300
- }, 1000);
301
- });
302
- });
303
- }
304
- handleOnRemove(w) {
305
- w.element.classList.add('animate__animated', 'animate__zoomOut');
306
- w.element.addEventListener('animationend', () => {
307
- this.widgets = this.widgets.filter((c) => c.__meta__.id !== w.config.__meta__.id);
308
- this.cdr.detectChanges();
309
- this.calcGridSize();
310
- this.emitConfigChanged('remove');
311
- });
312
- }
313
- handleOnSave(e) {
314
- this.onWidgetSave.emit(e);
315
- }
316
- trackByFn(index, item) {
317
- if (!item['__meta__']?.id) {
318
- item['__meta__'] = {};
319
- item['__meta__'].id = AXHtmlUtil.getUID();
320
- }
321
- return item['__meta__']?.id;
322
- }
323
- load(widgets) {
324
- this.clear();
325
- return new Promise((resolve, reject) => {
326
- if (widgets) {
327
- const loadedWidgets = [];
328
- if (typeof widgets === 'string') {
329
- try {
330
- loadedWidgets.push(...JSON.parse(widgets));
331
- this.emitConfigChanged('load');
332
- }
333
- catch (error) {
334
- reject('Invalid widget json data!');
335
- }
336
- }
337
- else {
338
- loadedWidgets.push(...widgets);
339
- this.emitConfigChanged('load');
340
- }
341
- let intervalId = -1;
342
- const loadFunc = () => {
343
- if (this.galleryItems && this.galleryItems.length > 0) {
344
- loadedWidgets.forEach(w => {
345
- const gitem = this.galleryItems.find(c => c.uniqueName === w.uniqueName);
346
- if (gitem) {
347
- w.component = gitem.component;
348
- if (gitem.props) {
349
- w.props = JSON.parse(JSON.stringify(gitem.props));
350
- }
351
- }
352
- });
353
- this.widgets.push(...loadedWidgets);
354
- this.emitConfigChanged('load');
355
- window.clearInterval(intervalId);
356
- this.cdr.detectChanges();
357
- resolve();
358
- }
359
- };
360
- intervalId = window.setInterval(loadFunc, 200);
361
- }
362
- else {
363
- resolve();
364
- }
365
- });
366
- }
367
- clear() {
368
- if (this.widgets.length) {
369
- this.widgets = [];
370
- this.cdr.detectChanges();
371
- this.emitConfigChanged('clear');
372
- }
373
- }
374
- save() {
375
- const obj = this.widgets.map(c => ({
376
- uniqueName: c.uniqueName,
377
- component: c.component,
378
- title: c.title,
379
- sizeX: c.sizeX,
380
- sizeY: c.sizeY,
381
- col: c.col,
382
- row: c.row,
383
- options: c.options,
384
- props: c.props
385
- }));
386
- return Promise.resolve(JSON.stringify(obj));
387
- }
388
- refresh() {
389
- this.widgetHosts.forEach(host => {
390
- host.widget.refresh();
391
- });
392
- }
393
- handleOnConfigChanged(e) {
394
- this.cdr.detectChanges();
395
- this.emitConfigChanged('config');
396
- }
397
- handleOnResizedChanged(e) {
398
- this.detectFirstEmptySlot(e.config);
399
- this.cdr.detectChanges();
400
- this.emitConfigChanged('config');
401
- }
402
- //private resizeChangeObserver: any;
403
- emitConfigChanged(mode) {
404
- // if (!this.resizeChangeObserver) {
405
- // this.resizeChangeObserver = new Observable();
406
- // Observable.create(observer => {
407
- // this.resizeChangeObserver = observer;
408
- // })
409
- // .pipe(debounceTime(750))
410
- // .pipe(distinctUntilChanged())
411
- // .subscribe(c => {
412
- // this.onConfigChanged.emit({
413
- // component: this
414
- // });
415
- // });
416
- // }
417
- // this.resizeChangeObserver.next(new Date());
418
- this.onConfigChanged.emit({
419
- component: this,
420
- mode
421
- });
422
- }
423
- }
424
- 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 });
425
- 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>\r\n <ax-widget-host *ngFor=\"let w of widgets;trackBy: trackByFn\" [config]='w' [sizeX]=\"w.sizeX\" [readonly]=\"readonly || w.readonly\"\r\n [sizeY]=\"w.sizeY\" [col]=\"w.col\" [row]=\"w.row\" (onRemove)=\"handleOnRemove($event)\" (onSave)=\"handleOnSave($event)\"\r\n (onConfigChanged)=\"handleOnConfigChanged($event)\" (onResized)=\"handleOnResizedChanged($event)\"\r\n [provideValue]=\"provideValue\">\r\n </ax-widget-host>\r\n</div>\r\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 });
426
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AXWidgetBoardComponent, decorators: [{
427
- type: Component,
428
- 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>\r\n <ax-widget-host *ngFor=\"let w of widgets;trackBy: trackByFn\" [config]='w' [sizeX]=\"w.sizeX\" [readonly]=\"readonly || w.readonly\"\r\n [sizeY]=\"w.sizeY\" [col]=\"w.col\" [row]=\"w.row\" (onRemove)=\"handleOnRemove($event)\" (onSave)=\"handleOnSave($event)\"\r\n (onConfigChanged)=\"handleOnConfigChanged($event)\" (onResized)=\"handleOnResizedChanged($event)\"\r\n [provideValue]=\"provideValue\">\r\n </ax-widget-host>\r\n</div>\r\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"] }]
429
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { container: [{
430
- type: ViewChild,
431
- args: ['container']
432
- }], widgetHosts: [{
433
- type: ViewChildren,
434
- args: [AXWidgetHostComponent]
435
- }], galleryItems: [{
436
- type: Input
437
- }], tileSize: [{
438
- type: Input
439
- }], gapSize: [{
440
- type: Input
441
- }], readonly: [{
442
- type: Input
443
- }], provideValue: [{
444
- type: Input
445
- }], onConfigChanged: [{
446
- type: Output
447
- }], onWidgetSave: [{
448
- type: Output
449
- }] } });
450
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fjb3JleC9sYXlvdXQvc3JjL2xpYi93aWRnZXQtYm9hcmQvd2lkZ2V0LWJvYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fjb3JleC9sYXlvdXQvc3JjL2xpYi93aWRnZXQtYm9hcmQvd2lkZ2V0LWJvYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsU0FBUyxFQUNULE1BQU0sRUFDTix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFDdEMsTUFBTSxlQUFlLENBQUM7QUFPdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7QUFZdkQsTUFBTSxPQUFPLHNCQUFzQjtJQW1EakMsWUFDVSxHQUErQixFQUMvQixJQUFZLEVBQ1osR0FBc0I7UUFGdEIsUUFBRyxHQUFILEdBQUcsQ0FBNEI7UUFDL0IsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBOUNoQyxZQUFPLEdBQXFCLEVBQUUsQ0FBQztRQUcvQixpQkFBWSxHQUFxQixFQUFFLENBQUM7UUFHcEMsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUd0QixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBSXBCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFbEIsY0FBUyxHQUFtQixJQUFJLENBQUM7UUFJakMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFJOUIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQU1u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cUJBQXFCLGdEQ3JDckMsd2hCQU9BOzRGRHlCYSxzQkFBc0I7a0JBUmxDLFNBQVM7K0JBQ0UsaUJBQWlCLFFBR3JCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLGlCQUNuQixpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNO3NKQUt2QyxTQUFTO3NCQURoQixTQUFTO3VCQUFDLFdBQVc7Z0JBSWQsV0FBVztzQkFEbEIsWUFBWTt1QkFBQyxxQkFBcUI7Z0JBTW5DLFlBQVk7c0JBRFgsS0FBSztnQkFJTixRQUFRO3NCQURQLEtBQUs7Z0JBSU4sT0FBTztzQkFETixLQUFLO2dCQUtOLFFBQVE7c0JBRFAsS0FBSztnQkFlTixZQUFZO3NCQURYLEtBQUs7Z0JBWU4sZUFBZTtzQkFEZCxNQUFNO2dCQUlQLFlBQVk7c0JBRFgsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBJbnB1dCxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBFbGVtZW50UmVmLFxyXG4gIFZpZXdDaGlsZCxcclxuICBOZ1pvbmUsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3RcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBBWFdpZGdldENvbmZpZyxcclxuICBBWFdpZGdldENvbmZpZ0NoYW5nZWQsXHJcbiAgQVhXaWRnZXRCb2FyZENvbmZpZ0NoYW5nZWQsXHJcbiAgQVhXaWRnZXRDb25maWdTYXZlZEV2ZW50XHJcbn0gZnJvbSAnLi93aWRnZXQuY2xhc3MnO1xyXG5pbXBvcnQgeyBBWFdpZGdldEhvc3RDb21wb25lbnQgfSBmcm9tICcuL3dpZGdldC1ob3N0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEFYSHRtbFV0aWwsIEFYQ2xpZW50UmVjIH0gZnJvbSAnQGFjb3JleC9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdheC13aWRnZXQtYm9hcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi93aWRnZXQtYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3dpZGdldC1ib2FyZC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGhvc3Q6IHsgY2xhc3M6ICdheCB3aWRnZXQtYm9hcmQnIH0sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQVhXaWRnZXRCb2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpXHJcbiAgcHJpdmF0ZSBjb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG5cclxuICBAVmlld0NoaWxkcmVuKEFYV2lkZ2V0SG9zdENvbXBvbmVudClcclxuICBwcml2YXRlIHdpZGdldEhvc3RzOiBRdWVyeUxpc3Q8QVhXaWRnZXRIb3N0Q29tcG9uZW50PjtcclxuXHJcbiAgd2lkZ2V0czogQVhXaWRnZXRDb25maWdbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGdhbGxlcnlJdGVtczogQVhXaWRnZXRDb25maWdbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHRpbGVTaXplOiBudW1iZXIgPSA4MDtcclxuXHJcbiAgQElucHV0KClcclxuICBnYXBTaXplOiBudW1iZXIgPSA1O1xyXG5cclxuICBcclxuICBASW5wdXQoKVxyXG4gIHJlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgbmV3V2lkZ2V0OiBBWFdpZGdldENvbmZpZyA9IG51bGw7XHJcblxyXG4gIHB1YmxpYyBydGw6IGJvb2xlYW47XHJcblxyXG4gIHByaXZhdGUgX2lzSW5FZGl0aW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGlzSW5FZGl0aW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzSW5FZGl0aW5nO1xyXG4gIH1cclxuICBwcml2YXRlIGlzRHJhZ2dpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGRyYWdJdGVtOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgQElucHV0KClcclxuICBwcm92aWRlVmFsdWU6IChlOiBhbnkpID0+IGFueTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBEQVRBX0NPTCA9ICdkYXRhLWNvbCc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBEQVRBX1JPVyA9ICdkYXRhLXJvdyc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBEQVRBX1NJWkVfWCA9ICdkYXRhLXNpemUteCc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBEQVRBX1NJWkVfWSA9ICdkYXRhLXNpemUteSc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBEQVRBX09MRF9DT0wgPSAnZGF0YS1vbGQtY29sJztcclxuICBwcml2YXRlIHJlYWRvbmx5IERBVEFfT0xEX1JPVyA9ICdkYXRhLW9sZC1yb3cnO1xyXG5cclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgb25Db25maWdDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8QVhXaWRnZXRCb2FyZENvbmZpZ0NoYW5nZWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWFdpZGdldEJvYXJkQ29uZmlnQ2hhbmdlZD4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgb25XaWRnZXRTYXZlOiBFdmVudEVtaXR0ZXI8QVhXaWRnZXRDb25maWdTYXZlZEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QVhXaWRnZXRDb25maWdTYXZlZEV2ZW50PigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVmOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PixcclxuICAgIHByaXZhdGUgem9uZTogTmdab25lLFxyXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7IH1cclxuXHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKHRoaXMucnRsID09IG51bGwpIHtcclxuICAgICAgdGhpcy5ydGwgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnJlZi5uYXRpdmVFbGVtZW50LCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCdkaXJlY3Rpb24nKSA9PT0gJ3J0bCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKGMpID0+IHtcclxuICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xyXG4gICAgICBzdHlsZS50eXBlID0gJ3RleHQvY3NzJztcclxuICAgICAgdGhpcy5yZWYubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChzdHlsZSk7XHJcbiAgICAgIC8vIGFkZCBjc3MgZGF0YSBjbGFzc2VzXHJcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDUwOyBpKyspIHtcclxuICAgICAgICBzdHlsZS5pbm5lckhUTUwgKz0gYFske3RoaXMuREFUQV9DT0x9PVwiJHtpfVwiXSB7ICAke3RoaXMucnRsID8gJ3JpZ2h0JyA6ICdsZWZ0J306ICR7KGkgLSAxKSAqICh0aGlzLnRpbGVTaXplICsgdGhpcy5nYXBTaXplKX1weDsgfWA7XHJcbiAgICAgICAgc3R5bGUuaW5uZXJIVE1MICs9IGBbJHt0aGlzLkRBVEFfUk9XfT1cIiR7aX1cIl0geyAgdG9wOiAkeyhpIC0gMSkgKiAodGhpcy50aWxlU2l6ZSArIHRoaXMuZ2FwU2l6ZSl9cHg7IH1gO1xyXG4gICAgICAgIHN0eWxlLmlubmVySFRNTCArPSBgWyR7dGhpcy5EQVRBX1NJWkVfWH09XCIke2l9XCJdIHsgIHdpZHRoOiAgJHsoaSAqIHRoaXMudGlsZVNpemUpICsgKChpIC0gMSkgKiB0aGlzLmdhcFNpemUpfXB4OyB9YDtcclxuICAgICAgICBzdHlsZS5pbm5lckhUTUwgKz0gYFske3RoaXMuREFUQV9TSVpFX1l9PVwiJHtpfVwiXSB7ICBoZWlnaHQ6ICR7KGkgKiB0aGlzLnRpbGVTaXplKSArICgoaSAtIDEpICogdGhpcy5nYXBTaXplKX1weDsgfWA7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjR3JpZFNpemUoKSB7XHJcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICBjb25zdCB3aWR0aCA9XHJcbiAgICAgICAgKE1hdGgubWF4KC4uLnRoaXMud2lkZ2V0cy5tYXAoKGMpID0+IGMuY29sICsgYy5zaXplWCAtIDEpKSkgKiAodGhpcy50aWxlU2l6ZSArIHRoaXMuZ2FwU2l6ZSk7XHJcbiAgICAgIGNvbnN0IGhlaWdodCA9XHJcbiAgICAgICAgKE1hdGgubWF4KC4uLnRoaXMud2lkZ2V0cy5tYXAoKGMpID0+IGMucm93ICsgYy5zaXplWSAtIDEpKSkgKiAodGhpcy50aWxlU2l6ZSArIHRoaXMuZ2FwU2l6ZSk7XHJcbiAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XHJcbiAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRWRpdCgpIHtcclxuICAgIHRoaXMuX2lzSW5FZGl0aW5nID8gdGhpcy5maW5pc2hFZGl0KCkgOiB0aGlzLnN0YXJ0RWRpdCgpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBwcml2YXRlIGRyYWdTdGFydChlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuX2lzSW5FZGl0aW5nICYmIGUud2hpY2ggPT09IDEpIHtcclxuICAgICAgICB0aGlzLmRyYWdJdGVtID0gZS5jdXJyZW50VGFyZ2V0IGFzIGFueTtcclxuICAgICAgICB0aGlzLmRyYWdJdGVtLnNldEF0dHJpYnV0ZSgnZGF0YS14LW9mZnNldCcsICh0aGlzLmRyYWdJdGVtLm9mZnNldExlZnQgLSBlLmNsaWVudFgpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5kcmFnSXRlbS5zZXRBdHRyaWJ1dGUoJ2RhdGEteS1vZmZzZXQnLCAodGhpcy5kcmFnSXRlbS5vZmZzZXRUb3AgLSBlLmNsaWVudFkpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0uY2xhc3NMaXN0LmFkZCgnd2lkZ2V0LWRyYWdnaW5nJyk7XHJcbiAgICAgICAgdGhpcy5kcmFnSXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdhbmltYXRlX19hbmltYXRlZCcsICdhbmltYXRlX19wdWxzZScpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVBvc2l0aW9uRGF0YSgpIHtcclxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmRyYWdJdGVtICYmIHRoaXMuX2lzSW5FZGl0aW5nICYmIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9PTERfQ09MKSA9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5kcmFnSXRlbS5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX09MRF9DT0wsIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9DT0wpKTtcclxuICAgICAgICB0aGlzLmRyYWdJdGVtLnNldEF0dHJpYnV0ZSh0aGlzLkRBVEFfT0xEX1JPVywgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1JPVykpO1xyXG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0ucmVtb3ZlQXR0cmlidXRlKHRoaXMuREFUQV9DT0wpO1xyXG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0ucmVtb3ZlQXR0cmlidXRlKHRoaXMuREFUQV9ST1cpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlc2V0UG9zaXRpb25EYXRhKCkge1xyXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuZHJhZ0l0ZW0gJiYgdGhpcy5faXNJbkVkaXRpbmcpIHtcclxuICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMuZHJhZ0l0ZW0sIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9PTERfQ09MKSwgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX09MRF9ST1cpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb2w6IHN0cmluZywgcm93OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHRoaXMuREFUQV9DT0wsIGNvbCk7XHJcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHRoaXMuREFUQV9ST1csIHJvdyk7XHJcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHRoaXMuREFUQV9PTERfQ09MKTtcclxuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUodGhpcy5EQVRBX09MRF9ST1cpO1xyXG4gICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd0b3AnKTtcclxuICAgICAgZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGVmdCcpO1xyXG4gICAgICBjb25zdCB3aWRnZXQgPSB0aGlzLndpZGdldHMuZmluZChjID0+IGNbJ19fbWV0YV9fJ10uaW5zdGFuY2UuZWxlbWVudCA9PT0gZWxlbWVudCk7XHJcbiAgICAgIHdpZGdldC5jb2wgPSBOdW1iZXIoY29sKTtcclxuICAgICAgd2lkZ2V0LnJvdyA9IE51bWJlcihyb3cpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRyYWcoZSkge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmRyYWdJdGVtICYmIHRoaXMuX2lzSW5FZGl0aW5nKSB7XHJcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmFkZFBsYWNlaG9sZGVyKCk7XHJcbiAgICAgICAgY29uc3QgeE9mZnNldCA9IE51bWJlcih0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSgnZGF0YS14LW9mZnNldCcpKTtcclxuICAgICAgICBjb25zdCB5T2Zmc2V0ID0gTnVtYmVyKHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXktb2Zmc2V0JykpO1xyXG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0uc3R5bGUubGVmdCA9IGUuY2xpZW50WCArIHhPZmZzZXQgKyAncHgnO1xyXG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0uc3R5bGUudG9wID0gZS5jbGllbnRZICsgeU9mZnNldCArICdweCc7XHJcbiAgICAgICAgLy9cclxuICAgICAgICB0aGlzLmRldGVjdEJlc3RQbGFjZW1lbnQoKTtcclxuICAgICAgICB0aGlzLnJlbW92ZVBvc2l0aW9uRGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHJhZ0VuZChlKSB7XHJcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5kcmFnSXRlbSAmJiB0aGlzLl9pc0luRWRpdGluZyAmJiB0aGlzLmlzRHJhZ2dpbmcpIHtcclxuICAgICAgICB0aGlzLmRyYWdJdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3dpZGdldC1kcmFnZ2luZycpO1xyXG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0uY2xhc3NMaXN0LmFkZCgnYW5pbWF0ZV9fYW5pbWF0ZWQnLCAnYW5pbWF0ZV9fcHVsc2UnKTtcclxuICAgICAgICAvL1xyXG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy53aWRnZXQtYmxhbmstcGxhY2Vob2xkZXInKTtcclxuICAgICAgICBpZiAodGhpcy5uZXdXaWRnZXQpIHtcclxuICAgICAgICAgIGNvbnN0IHcgPSB7XHJcbiAgICAgICAgICAgIHVuaXF1ZU5hbWU6IHRoaXMubmV3V2lkZ2V0LnVuaXF1ZU5hbWUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5uZXdXaWRnZXQuY29tcG9uZW50LFxyXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5uZXdXaWRnZXQudGl0bGUsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMubmV3V2lkZ2V0Lm9wdGlvbnMsXHJcbiAgICAgICAgICAgIHNpemVYOiB0aGlzLm5ld1dpZGdldC5zaXplWCxcclxuICAgICAgICAgICAgc2l6ZVk6IHRoaXMubmV3V2lkZ2V0LnNpemVZLFxyXG4gICAgICAgICAgICBjb2w6IE51bWJlcihwLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfQ09MKSksXHJcbiAgICAgICAgICAgIHJvdzogTnVtYmVyKHAuZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9ST1cpKVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICB0aGlzLndpZGdldHMucHVzaCh3KTtcclxuICAgICAgICAgIHRoaXMubmV3V2lkZ2V0ID0gbnVsbDtcclxuICAgICAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5kcmFnSXRlbSk7XHJcbiAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGNHcmlkU2l6ZSgpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICB3WydfX21ldGFfXyddLmluc3RhbmNlLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5kcmFnU3RhcnQuYmluZCh0aGlzKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAocCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMuZHJhZ0l0ZW0sIHAuZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9DT0wpLCBwLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfUk9XKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbih0aGlzLmRyYWdJdGVtLCB0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfT0xEX0NPTCksIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9PTERfUk9XKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgdGhpcy5yZW1vdmVQbGFjZWhvbGRlcigpO1xyXG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY2FsY0dyaWRTaXplKCk7XHJcbiAgICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlZCgnY29uZmlnJyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGV0ZWN0Rmlyc3RFbXB0eVNsb3QodzogQVhXaWRnZXRDb25maWcpIHtcclxuICAgIGNvbnN0IHhUaWxlID0gTWF0aC5mbG9vcih0aGlzLnJlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQub2Zmc2V0V2lkdGggLyB0aGlzLnRpbGVTaXplKTtcclxuICAgIGZvciAobGV0IGogPSAxOyBqIDw9IDEwMDsgaisrKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHhUaWxlIC0gdy5zaXplWDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgcmVjID0gbmV3IEFYQ2xpZW50UmVjKHtcclxuICAgICAgICAgIGxlZnQ6IGksXHJcbiAgICAgICAgICB0b3A6IGosXHJcbiAgICAgICAgICB3aWR0aDogdy5zaXplWCxcclxuICAgICAgICAgIGhlaWdodDogdy5zaXplWVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGVsID0gdGhpcy53aWRnZXRzLmZpbHRlcihjID0+IGMgIT09IHcpLmZpbmQoKGMpID0+XHJcbiAgICAgICAgICByZWMuaW50ZXJzZWN0KHtcclxuICAgICAgICAgICAgbGVmdDogYy5jb2wsXHJcbiAgICAgICAgICAgIHRvcDogYy5yb3csXHJcbiAgICAgICAgICAgIHdpZHRoOiBjLnNpemVYLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGMuc2l6ZVlcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoZWwgPT0gbnVsbCkge1xyXG4gICAgICAgICAgdy5jb2wgPSBpO1xyXG4gICAgICAgICAgdy5yb3cgPSBqO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZXRlY3RCZXN0UGxhY2VtZW50KCkge1xyXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgY29uc3QgcCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLndpZGdldC1ibGFuay1wbGFjZWhvbGRlcicpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBsZXQgY29sID0gTWF0aC5jZWlsKHRoaXMuZHJhZ0l0ZW0ub2Zmc2V0TGVmdCAvIHRoaXMudGlsZVNpemUpO1xyXG4gICAgICBpZiAodGhpcy5ydGwpIHtcclxuICAgICAgICBjb2wgPSBNYXRoLmNlaWwoKHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggLSAodGhpcy5kcmFnSXRlbS5vZmZzZXRMZWZ0ICsgdGhpcy5kcmFnSXRlbS5jbGllbnRXaWR0aCkpIC8gdGhpcy50aWxlU2l6ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCByb3cgPSBNYXRoLmNlaWwodGhpcy5kcmFnSXRlbS5vZmZzZXRUb3AgLyB0aGlzLnRpbGVTaXplKTtcclxuICAgICAgaWYgKGNvbCA8IDEpIHtcclxuICAgICAgICBjb2wgPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChyb3cgPCAxKSB7XHJcbiAgICAgICAgcm93ID0gMTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB3aWRnZXRzID0gQXJyYXkuZnJvbSh0aGlzLnJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy53aWRnZXQtaG9zdCcpKS5tYXAoKGMpID0+IGMgYXMgSFRNTEVsZW1lbnQpO1xyXG4gICAgICBwLnNldEF0dHJpYnV0ZSh0aGlzLkRBVEFfQ09MLCBjb2wudG9TdHJpbmcoKSk7XHJcbiAgICAgIHAuc2V0QXR0cmlidXRlKHRoaXMuREFUQV9ST1csIHJvdy50b1N0cmluZygpKTtcclxuICAgICAgY29uc3QgY29sbGlzaW9uID0gd2lkZ2V0cy5maWx0ZXIoYyA9PiBjICE9PSB0aGlzLmRyYWdJdGVtKS5zb21lKGMgPT4gQVhIdG1sVXRpbC5jb2xsaXNpb24oYywgdGhpcy5kcmFnSXRlbSkpO1xyXG4gICAgICBpZiAoY29sbGlzaW9uKSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVQbGFjZWhvbGRlcigpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG4gIHByaXZhdGUgYWRkUGxhY2Vob2xkZXIoKSB7XHJcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJlbW92ZVBsYWNlaG9sZGVyKCk7XHJcbiAgICAgIGlmICh0aGlzLmRyYWdJdGVtKSB7XHJcbiAgICAgICAgY29uc3QgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHAuY2xhc3NMaXN0LmFkZCgnd2lkZ2V0LWJsYW5rLXBsYWNlaG9sZGVyJyk7XHJcbiAgICAgICAgcC5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX0NPTCwgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX0NPTCkpO1xyXG4gICAgICAgIHAuc2V0QXR0cmlidXRlKHRoaXMuREFUQV9ST1csIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9ST1cpKTtcclxuICAgICAgICBwLnNldEF0dHJpYnV0ZSh0aGlzLkRBVEFfU0laRV9YLCB0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfU0laRV9YKSk7XHJcbiAgICAgICAgcC5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1NJWkVfWSwgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1NJWkVfWSkpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQocCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVQbGFjZWhvbGRlcigpIHtcclxuICAgIGNvbnN0IHAgPSB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy53aWRnZXQtYmxhbmstcGxhY2Vob2xkZXInKTtcclxuICAgIHA/LnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0RWRpdCgpIHtcclxuICAgIHRoaXMuX2lzSW5FZGl0aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuY2FsY0dyaWRTaXplKCk7XHJcbiAgICB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2dyaWQtYmFja2dyb3VuZCcpO1xyXG4gICAgY29uc3QgYmcgPSB0aGlzLnJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50O1xyXG4gICAgYmcuc3R5bGUuc2V0UHJvcGVydHkoJ2JhY2tncm91bmQtcG9zaXRpb24nLCBgJHt0aGlzLnJ0bCA/ICdyaWdodCcgOiAnbGVmdCd9IHRvcGApO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgIGNvbnN0IHBhdHRlcm4gPSBgdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB3aWR0aD1cIiR7dGhpcy50aWxlU2l6ZSArIHRoaXMuZ2FwU2l6ZX1cIiBoZWlnaHQ9XCIke3RoaXMudGlsZVNpemUgKyB0aGlzLmdhcFNpemV9XCI+IDxyZWN0IHN0eWxlPVwiZmlsbDogJTIzZGFkYWRhXCIgeD1cIiR7dGhpcy5ydGwgPyB0aGlzLmdhcFNpemUgOiAwfVwiIHdpZHRoPVwiJHt0aGlzLnRpbGVTaXplfVwiIGhlaWdodD1cIiR7dGhpcy50aWxlU2l6ZX1cIiB5PVwiMFwiPjwvcmVjdD48L3N2Zz4nKWA7XHJcbiAgICBiZy5zdHlsZS5zZXRQcm9wZXJ0eSgnYmFja2dyb3VuZC1pbWFnZScsIHBhdHRlcm4pO1xyXG4gICAgLy9cclxuICAgIGNvbnN0IHdpZGdldHMgPSBBcnJheS5mcm9tKHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLndpZGdldC1ob3N0JykpO1xyXG4gICAgd2lkZ2V0cy5mb3JFYWNoKCh3KSA9PiB7XHJcbiAgICAgIHcuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5kcmFnU3RhcnQuYmluZCh0aGlzKSwgZmFsc2UpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZy5iaW5kKHRoaXMpLCBmYWxzZSk7XHJcbiAgICB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmRyYWdFbmQuYmluZCh0aGlzKSwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpbmlzaEVkaXQoKSB7XHJcbiAgICB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2dyaWQtYmFja2dyb3VuZCcpO1xyXG4gICAgY29uc3QgYmcgPSB0aGlzLnJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50O1xyXG4gICAgYmcuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2JhY2tncm91bmQtaW1hZ2UnKTtcclxuICAgIC8vXHJcbiAgICB0aGlzLl9pc0luRWRpdGluZyA9IGZhbHNlO1xyXG4gICAgY29uc3Qgd2lkZ2V0cyA9IEFycmF5LmZyb20odGhpcy5yZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcud2lkZ2V0LWhvc3QnKSk7XHJcbiAgICB3aWRnZXRzLmZvckVhY2goKHcpID0+IHtcclxuICAgICAgdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmRyYWdTdGFydC5iaW5kKHRoaXMpLCBmYWxzZSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnLmJpbmQodGhpcyksIGZhbHNlKTtcclxuICAgIHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ0VuZC5iaW5kKHRoaXMpLCBmYWxzZSk7XHJcbiAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2VkKCdjb25maWcnKTtcclxuICB9XHJcblxyXG5cclxuICBhZGRXaWRnZXQod2lkZ2V0OiBBWFdpZGdldENvbmZpZykge1xyXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgdGhpcy5uZXdXaWRnZXQgPSB7XHJcbiAgICAgICAgdW5pcXVlTmFtZTogd2lkZ2V0LnVuaXF1ZU5hbWUsXHJcbiAgICAgICAgY29tcG9uZW50OiB3aWRnZXQuY29tcG9uZW50LFxyXG4gICAgICAgIHRpdGxlOiB3aWRnZXQudGl0bGUsXHJcbiAgICAgICAgY29sOiAxLFxyXG4gICAgICAgIHJvdzogMSxcclxuICAgICAgICBzaXplWDogd2lkZ2V0LnNpemVYLFxyXG4gICAgICAgIHNpemVZOiB3aWRnZXQuc2l6ZVksXHJcbiAgICAgICAgb3B0aW9uczogd2lkZ2V0Lm9wdGlvbnMsXHJcbiAgICAgICAgcHJvcHM6IHdpZGdldC5wcm9wc1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmRldGVjdEZpcnN0RW1wdHlTbG90KHRoaXMubmV3V2lkZ2V0KTtcclxuICAgICAgY29uc3QgdyA9IHtcclxuICAgICAgICB1bmlxdWVOYW1lOiB0aGlzLm5ld1dpZGdldC51bmlxdWVOYW1lLFxyXG4gICAgICAgIGNvbXBvbmVudDogdGhpcy5uZXdXaWRnZXQuY29tcG9uZW50LFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLm5ld1dpZGdldC50aXRsZSxcclxuICAgICAgICBvcHRpb25zOiB0aGlzLm5ld1dpZGdldC5vcHRpb25zLFxyXG4gICAgICAgIHByb3BzOiB0aGlzLm5ld1dpZGdldC5wcm9wcyxcclxuICAgICAgICBzaXplWDogdGhpcy5uZXdXaWRnZXQuc2l6ZVgsXHJcbiAgICAgICAgc2l6ZVk6IHRoaXMubmV3V2lkZ2V0LnNpemVZLFxyXG4gICAgICAgIGNvbDogdGhpcy5uZXdXaWRnZXQuY29sLFxyXG4gICAgICAgIHJvdzogdGhpcy5uZXdXaWRnZXQucm93XHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMud2lkZ2V0cy5wdXNoKHcpO1xyXG4gICAgICB0aGlzLm5ld1dpZGdldCA9IG51bGw7XHJcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB0aGlzLmNhbGNHcmlkU2l6ZSgpO1xyXG4gICAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZWQoJ2FkZCcpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgd1snX19tZXRhX18nXS5pbnN0YW5jZS5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuZHJhZ1N0YXJ0LmJpbmQodGhpcyksIGZhbHNlKTtcclxuICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBoYW5kbGVPblJlbW92ZSh3OiBBWFdpZGdldEhvc3RDb21wb25lbnQpIHtcclxuICAgIHcuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhbmltYXRlX19hbmltYXRlZCcsICdhbmltYXRlX196b29tT3V0Jyk7XHJcbiAgICB3LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYW5pbWF0aW9uZW5kJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLndpZGdldHMgPSB0aGlzLndpZGdldHMuZmlsdGVyKChjKSA9PiAoYyBhcyBhbnkpLl9fbWV0YV9fLmlkICE9PSAody5jb25maWcgYXMgYW55KS5fX21ldGFfXy5pZCk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgdGhpcy5jYWxjR3JpZFNpemUoKTtcclxuICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlZCgncmVtb3ZlJyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZU9uU2F2ZShlOiBBWFdpZGdldENvbmZpZ1NhdmVkRXZlbnQpIHtcclxuICAgIHRoaXMub25XaWRnZXRTYXZlLmVtaXQoZSk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5Rm4oaW5kZXgsIGl0ZW0pIHtcclxuICAgIGlmICghaXRlbVsnX19tZXRhX18nXT8uaWQpIHtcclxuICAgICAgaXRlbVsnX19tZXRhX18nXSA9IHt9O1xyXG4gICAgICBpdGVtWydfX21ldGFfXyddLmlkID0gQVhIdG1sVXRpbC5nZXRVSUQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpdGVtWydfX21ldGFfXyddPy5pZDtcclxuICB9XHJcblxyXG5cclxuICBsb2FkKHdpZGdldHM6IHN0cmluZyB8IEFYV2lkZ2V0Q29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuY2xlYXIoKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmICh3aWRnZXRzKSB7XHJcbiAgICAgICAgY29uc3QgbG9hZGVkV2lkZ2V0czogQVhXaWRnZXRDb25maWdbXSA9IFtdO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2lkZ2V0cyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxvYWRlZFdpZGdldHMucHVzaCguLi5KU09OLnBhcnNlKHdpZGdldHMpKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlZCgnbG9hZCcpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgcmVqZWN0KCdJbnZhbGlkIHdpZGdldCBqc29uIGRhdGEhJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbG9hZGVkV2lkZ2V0cy5wdXNoKC4uLndpZGdldHMpO1xyXG4gICAgICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlZCgnbG9hZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaW50ZXJ2YWxJZDogbnVtYmVyID0gLTE7XHJcbiAgICAgICAgY29uc3QgbG9hZEZ1bmMgPSAoKSA9PiB7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuZ2FsbGVyeUl0ZW1zICYmIHRoaXMuZ2FsbGVyeUl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbG9hZGVkV2lkZ2V0cy5mb3JFYWNoKHcgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGdpdGVtID0gdGhpcy5nYWxsZXJ5SXRlbXMuZmluZChjID0+IGMudW5pcXVlTmFtZSA9PT0gdy51bmlxdWVOYW1lKTtcclxuICAgICAgICAgICAgICBpZiAoZ2l0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHcuY29tcG9uZW50ID0gZ2l0ZW0uY29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKGdpdGVtLnByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgIHcucHJvcHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdpdGVtLnByb3BzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy53aWRnZXRzLnB1c2goLi4ubG9hZGVkV2lkZ2V0cyk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZWQoJ2xvYWQnKTtcclxuICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbChsb2FkRnVuYywgMjAwKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xlYXIoKSB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLndpZGdldHMgPSBbXTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2VkKCdjbGVhcicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2F2ZSgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3Qgb2JqID0gdGhpcy53aWRnZXRzLm1hcChjID0+ICh7XHJcbiAgICAgIHVuaXF1ZU5hbWU6IGMudW5pcXVlTmFtZSxcclxuICAgICAgY29tcG9uZW50OiBjLmNvbXBvbmVudCxcclxuICAgICAgdGl0bGU6IGMudGl0bGUsXHJcbiAgICAgIHNpemVYOiBjLnNpemVYLFxyXG4gICAgICBzaXplWTogYy5zaXplWSxcclxuICAgICAgY29sOiBjLmNvbCxcclxuICAgICAgcm93OiBjLnJvdyxcclxuICAgICAgb3B0aW9uczogYy5vcHRpb25zLFxyXG4gICAgICBwcm9wczogYy5wcm9wc1xyXG4gICAgfSkpO1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnN0cmluZ2lmeShvYmopKTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2goKSB7XHJcbiAgICB0aGlzLndpZGdldEhvc3RzLmZvckVhY2goaG9zdCA9PiB7XHJcbiAgICAgIGhvc3Qud2lkZ2V0LnJlZnJlc2goKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlT25Db25maWdDaGFuZ2VkKGU6IEFYV2lkZ2V0Q29uZmlnQ2hhbmdlZCkge1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlZCgnY29uZmlnJyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVPblJlc2l6ZWRDaGFuZ2VkKGU6IEFYV2lkZ2V0Q29uZmlnQ2hhbmdlZCkge1xyXG4gICAgdGhpcy5kZXRlY3RGaXJzdEVtcHR5U2xvdChlLmNvbmZpZyk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2VkKCdjb25maWcnKTtcclxuICB9XHJcblxyXG4gIC8vcHJpdmF0ZSByZXNpemVDaGFuZ2VPYnNlcnZlcjogYW55O1xyXG4gIHByaXZhdGUgZW1pdENvbmZpZ0NoYW5nZWQobW9kZTonY2xlYXInfCdhZGQnfCdyZW1vdmUnfCdsb2FkJ3wnY29uZmlnJykge1xyXG4gICAgLy8gaWYgKCF0aGlzLnJlc2l6ZUNoYW5nZU9ic2VydmVyKSB7XHJcbiAgICAvLyAgIHRoaXMucmVzaXplQ2hhbmdlT2JzZXJ2ZXIgPSBuZXcgT2JzZXJ2YWJsZSgpO1xyXG4gICAgLy8gICBPYnNlcnZhYmxlLmNyZWF0ZShvYnNlcnZlciA9PiB7XHJcbiAgICAvLyAgICAgdGhpcy5yZXNpemVDaGFuZ2VPYnNlcnZlciA9IG9ic2VydmVyO1xyXG4gICAgLy8gICB9KVxyXG4gICAgLy8gICAgIC5waXBlKGRlYm91bmNlVGltZSg3NTApKVxyXG4gICAgLy8gICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXHJcbiAgICAvLyAgICAgLnN1YnNjcmliZShjID0+IHtcclxuICAgIC8vICAgICAgIHRoaXMub25Db25maWdDaGFuZ2VkLmVtaXQoe1xyXG4gICAgLy8gICAgICAgICBjb21wb25lbnQ6IHRoaXNcclxuICAgIC8vICAgICAgIH0pO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG4gICAgLy8gdGhpcy5yZXNpemVDaGFuZ2VPYnNlcnZlci5uZXh0KG5ldyBEYXRlKCkpO1xyXG4gICAgdGhpcy5vbkNvbmZpZ0NoYW5nZWQuZW1pdCh7XHJcbiAgICAgIGNvbXBvbmVudDogdGhpcyxcclxuICAgICAgbW9kZVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJ3aWRnZXRzLWNvbnRhaW5lclwiIFtjbGFzcy5ydGxdPVwicnRsXCIgI2NvbnRhaW5lcj5cclxuICAgIDxheC13aWRnZXQtaG9zdCAqbmdGb3I9XCJsZXQgdyBvZiB3aWRnZXRzO3RyYWNrQnk6IHRyYWNrQnlGblwiICBbY29uZmlnXT0ndycgW3NpemVYXT1cIncuc2l6ZVhcIiBbcmVhZG9ubHldPVwicmVhZG9ubHkgfHwgdy5yZWFkb25seVwiXHJcbiAgICAgICAgW3NpemVZXT1cIncuc2l6ZVlcIiBbY29sXT1cIncuY29sXCIgW3Jvd109XCJ3LnJvd1wiIChvblJlbW92ZSk9XCJoYW5kbGVPblJlbW92ZSgkZXZlbnQpXCIgKG9uU2F2ZSk9XCJoYW5kbGVPblNhdmUoJGV2ZW50KVwiXHJcbiAgICAgICAgKG9uQ29uZmlnQ2hhbmdlZCk9XCJoYW5kbGVPbkNvbmZpZ0NoYW5nZWQoJGV2ZW50KVwiIChvblJlc2l6ZWQpPVwiaGFuZGxlT25SZXNpemVkQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICBbcHJvdmlkZVZhbHVlXT1cInByb3ZpZGVWYWx1ZVwiPlxyXG4gICAgPC9heC13aWRnZXQtaG9zdD5cclxuPC9kaXY+XHJcbiJdfQ==
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 * as i0 from "@angular/core";
5
+ import * as i1 from "./widget-host.component";
6
+ import * as i2 from "@angular/common";
7
+ export class AXWidgetBoardComponent {
8
+ constructor(ref, zone, cdr) {
9
+ this.ref = ref;
10
+ this.zone = zone;
11
+ this.cdr = cdr;
12
+ this.widgets = [];
13
+ this.galleryItems = [];
14
+ this.tileSize = 80;
15
+ this.gapSize = 5;
16
+ this.readonly = false;
17
+ this.newWidget = null;
18
+ this._isInEditing = false;
19
+ this.isDragging = false;
20
+ this.DATA_COL = 'data-col';
21
+ this.DATA_ROW = 'data-row';
22
+ this.DATA_SIZE_X = 'data-size-x';
23
+ this.DATA_SIZE_Y = 'data-size-y';
24
+ this.DATA_OLD_COL = 'data-old-col';
25
+ this.DATA_OLD_ROW = 'data-old-row';
26
+ this.onConfigChanged = new EventEmitter();
27
+ this.onWidgetSave = new EventEmitter();
28
+ }
29
+ isInEditing() {
30
+ return this._isInEditing;
31
+ }
32
+ ngOnInit() {
33
+ if (this.rtl == null) {
34
+ this.rtl = window.getComputedStyle(this.ref.nativeElement, null).getPropertyValue('direction') === 'rtl';
35
+ }
36
+ }
37
+ ngAfterViewInit() {
38
+ this.zone.runOutsideAngular((c) => {
39
+ const style = document.createElement('style');
40
+ style.type = 'text/css';
41
+ this.ref.nativeElement.appendChild(style);
42
+ // add css data classes
43
+ for (let i = 1; i <= 50; i++) {
44
+ style.innerHTML += `[${this.DATA_COL}="${i}"] { ${this.rtl ? 'right' : 'left'}: ${(i - 1) * (this.tileSize + this.gapSize)}px; }`;
45
+ style.innerHTML += `[${this.DATA_ROW}="${i}"] { top: ${(i - 1) * (this.tileSize + this.gapSize)}px; }`;
46
+ style.innerHTML += `[${this.DATA_SIZE_X}="${i}"] { width: ${(i * this.tileSize) + ((i - 1) * this.gapSize)}px; }`;
47
+ style.innerHTML += `[${this.DATA_SIZE_Y}="${i}"] { height: ${(i * this.tileSize) + ((i - 1) * this.gapSize)}px; }`;
48
+ }
49
+ });
50
+ }
51
+ calcGridSize() {
52
+ this.zone.runOutsideAngular(() => {
53
+ const width = (Math.max(...this.widgets.map((c) => c.col + c.sizeX - 1))) * (this.tileSize + this.gapSize);
54
+ const height = (Math.max(...this.widgets.map((c) => c.row + c.sizeY - 1))) * (this.tileSize + this.gapSize);
55
+ this.container.nativeElement.style.width = width + 'px';
56
+ this.container.nativeElement.style.height = height + 'px';
57
+ });
58
+ }
59
+ toggleEdit() {
60
+ this._isInEditing ? this.finishEdit() : this.startEdit();
61
+ }
62
+ dragStart(e) {
63
+ e.preventDefault();
64
+ e.stopPropagation();
65
+ this.zone.runOutsideAngular(() => {
66
+ if (this._isInEditing && e.which === 1) {
67
+ this.dragItem = e.currentTarget;
68
+ this.dragItem.setAttribute('data-x-offset', (this.dragItem.offsetLeft - e.clientX).toString());
69
+ //
70
+ this.dragItem.setAttribute('data-y-offset', (this.dragItem.offsetTop - e.clientY).toString());
71
+ this.dragItem.classList.add('widget-dragging');
72
+ this.dragItem.classList.remove('animate__animated', 'animate__pulse');
73
+ }
74
+ });
75
+ return false;
76
+ }
77
+ removePositionData() {
78
+ this.zone.runOutsideAngular(() => {
79
+ if (this.dragItem && this._isInEditing && this.dragItem.getAttribute(this.DATA_OLD_COL) == null) {
80
+ this.dragItem.setAttribute(this.DATA_OLD_COL, this.dragItem.getAttribute(this.DATA_COL));
81
+ this.dragItem.setAttribute(this.DATA_OLD_ROW, this.dragItem.getAttribute(this.DATA_ROW));
82
+ this.dragItem.removeAttribute(this.DATA_COL);
83
+ this.dragItem.removeAttribute(this.DATA_ROW);
84
+ }
85
+ });
86
+ }
87
+ resetPositionData() {
88
+ this.zone.runOutsideAngular(() => {
89
+ if (this.dragItem && this._isInEditing) {
90
+ this.setPosition(this.dragItem, this.dragItem.getAttribute(this.DATA_OLD_COL), this.dragItem.getAttribute(this.DATA_OLD_ROW));
91
+ }
92
+ });
93
+ }
94
+ setPosition(element, col, row) {
95
+ this.zone.runOutsideAngular(() => {
96
+ element.setAttribute(this.DATA_COL, col);
97
+ element.setAttribute(this.DATA_ROW, row);
98
+ element.removeAttribute(this.DATA_OLD_COL);
99
+ element.removeAttribute(this.DATA_OLD_ROW);
100
+ element.style.removeProperty('top');
101
+ element.style.removeProperty('left');
102
+ const widget = this.widgets.find(c => c['__meta__'].instance.element === element);
103
+ widget.col = Number(col);
104
+ widget.row = Number(row);
105
+ });
106
+ }
107
+ drag(e) {
108
+ e.preventDefault();
109
+ e.stopPropagation();
110
+ this.zone.runOutsideAngular(() => {
111
+ if (this.dragItem && this._isInEditing) {
112
+ this.isDragging = true;
113
+ this.addPlaceholder();
114
+ const xOffset = Number(this.dragItem.getAttribute('data-x-offset'));
115
+ const yOffset = Number(this.dragItem.getAttribute('data-y-offset'));
116
+ this.dragItem.style.left = e.clientX + xOffset + 'px';
117
+ this.dragItem.style.top = e.clientY + yOffset + 'px';
118
+ //
119
+ this.detectBestPlacement();
120
+ this.removePositionData();
121
+ }
122
+ });
123
+ return false;
124
+ }
125
+ dragEnd(e) {
126
+ this.zone.runOutsideAngular(() => {
127
+ if (this.dragItem && this._isInEditing && this.isDragging) {
128
+ this.dragItem.classList.remove('widget-dragging');
129
+ this.dragItem.classList.add('animate__animated', 'animate__pulse');
130
+ //
131
+ const p = this.container.nativeElement.querySelector('.widget-blank-placeholder');
132
+ if (this.newWidget) {
133
+ const w = {
134
+ uniqueName: this.newWidget.uniqueName,
135
+ component: this.newWidget.component,
136
+ title: this.newWidget.title,
137
+ options: this.newWidget.options,
138
+ sizeX: this.newWidget.sizeX,
139
+ sizeY: this.newWidget.sizeY,
140
+ col: Number(p.getAttribute(this.DATA_COL)),
141
+ row: Number(p.getAttribute(this.DATA_ROW))
142
+ };
143
+ this.widgets.push(w);
144
+ this.newWidget = null;
145
+ this.container.nativeElement.removeChild(this.dragItem);
146
+ this.zone.run(() => {
147
+ this.cdr.detectChanges();
148
+ this.calcGridSize();
149
+ setTimeout(() => {
150
+ w['__meta__'].instance.element.addEventListener('mousedown', this.dragStart.bind(this), false);
151
+ }, 1000);
152
+ });
153
+ }
154
+ else {
155
+ if (p) {
156
+ this.setPosition(this.dragItem, p.getAttribute(this.DATA_COL), p.getAttribute(this.DATA_ROW));
157
+ }
158
+ else {
159
+ this.setPosition(this.dragItem, this.dragItem.getAttribute(this.DATA_OLD_COL), this.dragItem.getAttribute(this.DATA_OLD_ROW));
160
+ }
161
+ }
162
+ //
163
+ this.removePlaceholder();
164
+ this.dragItem = null;
165
+ this.calcGridSize();
166
+ this.emitConfigChanged('config');
167
+ }
168
+ this.isDragging = false;
169
+ });
170
+ }
171
+ detectFirstEmptySlot(w) {
172
+ const xTile = Math.floor(this.ref.nativeElement.parentElement.offsetWidth / this.tileSize);
173
+ for (let j = 1; j <= 100; j++) {
174
+ for (let i = 1; i <= xTile - w.sizeX; i++) {
175
+ const rec = new AXClientRec({
176
+ left: i,
177
+ top: j,
178
+ width: w.sizeX,
179
+ height: w.sizeY
180
+ });
181
+ const el = this.widgets.filter(c => c !== w).find((c) => rec.intersect({
182
+ left: c.col,
183
+ top: c.row,
184
+ width: c.sizeX,
185
+ height: c.sizeY
186
+ }));
187
+ if (el == null) {
188
+ w.col = i;
189
+ w.row = j;
190
+ return;
191
+ }
192
+ }
193
+ }
194
+ }
195
+ detectBestPlacement() {
196
+ this.zone.runOutsideAngular(() => {
197
+ const p = this.container.nativeElement.querySelector('.widget-blank-placeholder');
198
+ let col = Math.ceil(this.dragItem.offsetLeft / this.tileSize);
199
+ if (this.rtl) {
200
+ col = Math.ceil((this.container.nativeElement.clientWidth - (this.dragItem.offsetLeft + this.dragItem.clientWidth)) / this.tileSize);
201
+ }
202
+ let row = Math.ceil(this.dragItem.offsetTop / this.tileSize);
203
+ if (col < 1) {
204
+ col = 1;
205
+ }
206
+ if (row < 1) {
207
+ row = 1;
208
+ }
209
+ const widgets = Array.from(this.ref.nativeElement.querySelectorAll('.widget-host')).map((c) => c);
210
+ p.setAttribute(this.DATA_COL, col.toString());
211
+ p.setAttribute(this.DATA_ROW, row.toString());
212
+ const collision = widgets.filter(c => c !== this.dragItem).some(c => AXHtmlUtil.collision(c, this.dragItem));
213
+ if (collision) {
214
+ this.removePlaceholder();
215
+ }
216
+ });
217
+ }
218
+ addPlaceholder() {
219
+ this.zone.runOutsideAngular(() => {
220
+ this.removePlaceholder();
221
+ if (this.dragItem) {
222
+ const p = document.createElement('div');
223
+ p.classList.add('widget-blank-placeholder');
224
+ p.setAttribute(this.DATA_COL, this.dragItem.getAttribute(this.DATA_COL));
225
+ p.setAttribute(this.DATA_ROW, this.dragItem.getAttribute(this.DATA_ROW));
226
+ p.setAttribute(this.DATA_SIZE_X, this.dragItem.getAttribute(this.DATA_SIZE_X));
227
+ p.setAttribute(this.DATA_SIZE_Y, this.dragItem.getAttribute(this.DATA_SIZE_Y));
228
+ this.container.nativeElement.appendChild(p);
229
+ }
230
+ });
231
+ }
232
+ removePlaceholder() {
233
+ const p = this.container.nativeElement.querySelector('.widget-blank-placeholder');
234
+ p?.remove();
235
+ }
236
+ startEdit() {
237
+ this._isInEditing = true;
238
+ this.calcGridSize();
239
+ this.ref.nativeElement.classList.add('grid-background');
240
+ const bg = this.ref.nativeElement;
241
+ bg.style.setProperty('background-position', `${this.rtl ? 'right' : 'left'} top`);
242
+ // tslint:disable-next-line: max-line-length
243
+ 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>')`;
244
+ bg.style.setProperty('background-image', pattern);
245
+ //
246
+ const widgets = Array.from(this.ref.nativeElement.querySelectorAll('.widget-host'));
247
+ widgets.forEach((w) => {
248
+ w.addEventListener('mousedown', this.dragStart.bind(this), false);
249
+ });
250
+ this.ref.nativeElement.addEventListener('mousemove', this.drag.bind(this), false);
251
+ this.ref.nativeElement.addEventListener('mouseup', this.dragEnd.bind(this), false);
252
+ }
253
+ finishEdit() {
254
+ this.ref.nativeElement.classList.remove('grid-background');
255
+ const bg = this.ref.nativeElement;
256
+ bg.style.removeProperty('background-image');
257
+ //
258
+ this._isInEditing = false;
259
+ const widgets = Array.from(this.ref.nativeElement.querySelectorAll('.widget-host'));
260
+ widgets.forEach((w) => {
261
+ w.removeEventListener('mousedown', this.dragStart.bind(this), false);
262
+ });
263
+ this.ref.nativeElement.removeEventListener('mousemove', this.drag.bind(this), false);
264
+ this.ref.nativeElement.removeEventListener('mouseup', this.dragEnd.bind(this), false);
265
+ this.emitConfigChanged('config');
266
+ }
267
+ addWidget(widget) {
268
+ this.zone.runOutsideAngular(() => {
269
+ this.newWidget = {
270
+ uniqueName: widget.uniqueName,
271
+ component: widget.component,
272
+ title: widget.title,
273
+ col: 1,
274
+ row: 1,
275
+ sizeX: widget.sizeX,
276
+ sizeY: widget.sizeY,
277
+ options: widget.options,
278
+ props: widget.props
279
+ };
280
+ this.detectFirstEmptySlot(this.newWidget);
281
+ const w = {
282
+ uniqueName: this.newWidget.uniqueName,
283
+ component: this.newWidget.component,
284
+ title: this.newWidget.title,
285
+ options: this.newWidget.options,
286
+ props: this.newWidget.props,
287
+ sizeX: this.newWidget.sizeX,
288
+ sizeY: this.newWidget.sizeY,
289
+ col: this.newWidget.col,
290
+ row: this.newWidget.row
291
+ };
292
+ this.widgets.push(w);
293
+ this.newWidget = null;
294
+ this.zone.run(() => {
295
+ this.cdr.detectChanges();
296
+ this.calcGridSize();
297
+ this.emitConfigChanged('add');
298
+ setTimeout(() => {
299
+ w['__meta__'].instance.element.addEventListener('mousedown', this.dragStart.bind(this), false);
300
+ }, 1000);
301
+ });
302
+ });
303
+ }
304
+ handleOnRemove(w) {
305
+ w.element.classList.add('animate__animated', 'animate__zoomOut');
306
+ w.element.addEventListener('animationend', () => {
307
+ this.widgets = this.widgets.filter((c) => c.__meta__.id !== w.config.__meta__.id);
308
+ this.cdr.detectChanges();
309
+ this.calcGridSize();
310
+ this.emitConfigChanged('remove');
311
+ });
312
+ }
313
+ handleOnSave(e) {
314
+ this.onWidgetSave.emit(e);
315
+ }
316
+ trackByFn(index, item) {
317
+ if (!item['__meta__']?.id) {
318
+ item['__meta__'] = {};
319
+ item['__meta__'].id = AXHtmlUtil.getUID();
320
+ }
321
+ return item['__meta__']?.id;
322
+ }
323
+ load(widgets) {
324
+ this.clear();
325
+ return new Promise((resolve, reject) => {
326
+ if (widgets) {
327
+ const loadedWidgets = [];
328
+ if (typeof widgets === 'string') {
329
+ try {
330
+ loadedWidgets.push(...JSON.parse(widgets));
331
+ this.emitConfigChanged('load');
332
+ }
333
+ catch (error) {
334
+ reject('Invalid widget json data!');
335
+ }
336
+ }
337
+ else {
338
+ loadedWidgets.push(...widgets);
339
+ this.emitConfigChanged('load');
340
+ }
341
+ let intervalId = -1;
342
+ const loadFunc = () => {
343
+ if (this.galleryItems && this.galleryItems.length > 0) {
344
+ loadedWidgets.forEach(w => {
345
+ const gitem = this.galleryItems.find(c => c.uniqueName === w.uniqueName);
346
+ if (gitem) {
347
+ w.component = gitem.component;
348
+ if (gitem.props) {
349
+ w.props = JSON.parse(JSON.stringify(gitem.props));
350
+ }
351
+ }
352
+ });
353
+ this.widgets.push(...loadedWidgets);
354
+ this.emitConfigChanged('load');
355
+ window.clearInterval(intervalId);
356
+ this.cdr.detectChanges();
357
+ resolve();
358
+ }
359
+ };
360
+ intervalId = window.setInterval(loadFunc, 200);
361
+ }
362
+ else {
363
+ resolve();
364
+ }
365
+ });
366
+ }
367
+ clear() {
368
+ if (this.widgets.length) {
369
+ this.widgets = [];
370
+ this.cdr.detectChanges();
371
+ this.emitConfigChanged('clear');
372
+ }
373
+ }
374
+ save() {
375
+ const obj = this.widgets.map(c => ({
376
+ uniqueName: c.uniqueName,
377
+ component: c.component,
378
+ title: c.title,
379
+ sizeX: c.sizeX,
380
+ sizeY: c.sizeY,
381
+ col: c.col,
382
+ row: c.row,
383
+ options: c.options,
384
+ props: c.props
385
+ }));
386
+ return Promise.resolve(JSON.stringify(obj));
387
+ }
388
+ refresh() {
389
+ this.widgetHosts.forEach(host => {
390
+ host.widget.refresh();
391
+ });
392
+ }
393
+ handleOnConfigChanged(e) {
394
+ this.cdr.detectChanges();
395
+ this.emitConfigChanged('config');
396
+ }
397
+ handleOnResizedChanged(e) {
398
+ this.detectFirstEmptySlot(e.config);
399
+ this.cdr.detectChanges();
400
+ this.emitConfigChanged('config');
401
+ }
402
+ //private resizeChangeObserver: any;
403
+ emitConfigChanged(mode) {
404
+ // if (!this.resizeChangeObserver) {
405
+ // this.resizeChangeObserver = new Observable();
406
+ // Observable.create(observer => {
407
+ // this.resizeChangeObserver = observer;
408
+ // })
409
+ // .pipe(debounceTime(750))
410
+ // .pipe(distinctUntilChanged())
411
+ // .subscribe(c => {
412
+ // this.onConfigChanged.emit({
413
+ // component: this
414
+ // });
415
+ // });
416
+ // }
417
+ // this.resizeChangeObserver.next(new Date());
418
+ this.onConfigChanged.emit({
419
+ component: this,
420
+ mode
421
+ });
422
+ }
423
+ }
424
+ 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 });
425
+ 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 });
426
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AXWidgetBoardComponent, decorators: [{
427
+ type: Component,
428
+ 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"] }]
429
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { container: [{
430
+ type: ViewChild,
431
+ args: ['container']
432
+ }], widgetHosts: [{
433
+ type: ViewChildren,
434
+ args: [AXWidgetHostComponent]
435
+ }], galleryItems: [{
436
+ type: Input
437
+ }], tileSize: [{
438
+ type: Input
439
+ }], gapSize: [{
440
+ type: Input
441
+ }], readonly: [{
442
+ type: Input
443
+ }], provideValue: [{
444
+ type: Input
445
+ }], onConfigChanged: [{
446
+ type: Output
447
+ }], onWidgetSave: [{
448
+ type: Output
449
+ }] } });
450
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fjb3JleC9sYXlvdXQvc3JjL2xpYi93aWRnZXQtYm9hcmQvd2lkZ2V0LWJvYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fjb3JleC9sYXlvdXQvc3JjL2xpYi93aWRnZXQtYm9hcmQvd2lkZ2V0LWJvYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsU0FBUyxFQUNULE1BQU0sRUFDTix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFDdEMsTUFBTSxlQUFlLENBQUM7QUFPdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7QUFZdkQsTUFBTSxPQUFPLHNCQUFzQjtJQW1EakMsWUFDVSxHQUErQixFQUMvQixJQUFZLEVBQ1osR0FBc0I7UUFGdEIsUUFBRyxHQUFILEdBQUcsQ0FBNEI7UUFDL0IsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBOUNoQyxZQUFPLEdBQXFCLEVBQUUsQ0FBQztRQUcvQixpQkFBWSxHQUFxQixFQUFFLENBQUM7UUFHcEMsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUd0QixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBSXBCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFbEIsY0FBUyxHQUFtQixJQUFJLENBQUM7UUFJakMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFJOUIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQU1u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cUJBQXFCLGdEQ3JDckMsMGdCQU9BOzRGRHlCYSxzQkFBc0I7a0JBUmxDLFNBQVM7K0JBQ0UsaUJBQWlCLFFBR3JCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLGlCQUNuQixpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNO3NKQUt2QyxTQUFTO3NCQURoQixTQUFTO3VCQUFDLFdBQVc7Z0JBSWQsV0FBVztzQkFEbEIsWUFBWTt1QkFBQyxxQkFBcUI7Z0JBTW5DLFlBQVk7c0JBRFgsS0FBSztnQkFJTixRQUFRO3NCQURQLEtBQUs7Z0JBSU4sT0FBTztzQkFETixLQUFLO2dCQUtOLFFBQVE7c0JBRFAsS0FBSztnQkFlTixZQUFZO3NCQURYLEtBQUs7Z0JBWU4sZUFBZTtzQkFEZCxNQUFNO2dCQUlQLFlBQVk7c0JBRFgsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBJbnB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCxcbiAgTmdab25lLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFYV2lkZ2V0Q29uZmlnLFxuICBBWFdpZGdldENvbmZpZ0NoYW5nZWQsXG4gIEFYV2lkZ2V0Qm9hcmRDb25maWdDaGFuZ2VkLFxuICBBWFdpZGdldENvbmZpZ1NhdmVkRXZlbnRcbn0gZnJvbSAnLi93aWRnZXQuY2xhc3MnO1xuaW1wb3J0IHsgQVhXaWRnZXRIb3N0Q29tcG9uZW50IH0gZnJvbSAnLi93aWRnZXQtaG9zdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQVhIdG1sVXRpbCwgQVhDbGllbnRSZWMgfSBmcm9tICdAYWNvcmV4L2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtd2lkZ2V0LWJvYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC1ib2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3dpZGdldC1ib2FyZC5jb21wb25lbnQuc2NzcyddLFxuICBob3N0OiB7IGNsYXNzOiAnYXggd2lkZ2V0LWJvYXJkJyB9LFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBBWFdpZGdldEJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBAVmlld0NoaWxkKCdjb250YWluZXInKVxuICBwcml2YXRlIGNvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZHJlbihBWFdpZGdldEhvc3RDb21wb25lbnQpXG4gIHByaXZhdGUgd2lkZ2V0SG9zdHM6IFF1ZXJ5TGlzdDxBWFdpZGdldEhvc3RDb21wb25lbnQ+O1xuXG4gIHdpZGdldHM6IEFYV2lkZ2V0Q29uZmlnW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBnYWxsZXJ5SXRlbXM6IEFYV2lkZ2V0Q29uZmlnW10gPSBbXTtcblxuICBASW5wdXQoKVxuICB0aWxlU2l6ZTogbnVtYmVyID0gODA7XG5cbiAgQElucHV0KClcbiAgZ2FwU2l6ZTogbnVtYmVyID0gNTtcblxuICBcbiAgQElucHV0KClcbiAgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIG5ld1dpZGdldDogQVhXaWRnZXRDb25maWcgPSBudWxsO1xuXG4gIHB1YmxpYyBydGw6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfaXNJbkVkaXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGlzSW5FZGl0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0luRWRpdGluZztcbiAgfVxuICBwcml2YXRlIGlzRHJhZ2dpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBkcmFnSXRlbTogSFRNTEVsZW1lbnQ7XG5cbiAgQElucHV0KClcbiAgcHJvdmlkZVZhbHVlOiAoZTogYW55KSA9PiBhbnk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBEQVRBX0NPTCA9ICdkYXRhLWNvbCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgREFUQV9ST1cgPSAnZGF0YS1yb3cnO1xuICBwcml2YXRlIHJlYWRvbmx5IERBVEFfU0laRV9YID0gJ2RhdGEtc2l6ZS14JztcbiAgcHJpdmF0ZSByZWFkb25seSBEQVRBX1NJWkVfWSA9ICdkYXRhLXNpemUteSc7XG4gIHByaXZhdGUgcmVhZG9ubHkgREFUQV9PTERfQ09MID0gJ2RhdGEtb2xkLWNvbCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgREFUQV9PTERfUk9XID0gJ2RhdGEtb2xkLXJvdyc7XG5cblxuICBAT3V0cHV0KClcbiAgb25Db25maWdDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8QVhXaWRnZXRCb2FyZENvbmZpZ0NoYW5nZWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWFdpZGdldEJvYXJkQ29uZmlnQ2hhbmdlZD4oKTtcblxuICBAT3V0cHV0KClcbiAgb25XaWRnZXRTYXZlOiBFdmVudEVtaXR0ZXI8QVhXaWRnZXRDb25maWdTYXZlZEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QVhXaWRnZXRDb25maWdTYXZlZEV2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVmOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PixcbiAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7IH1cblxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLnJ0bCA9PSBudWxsKSB7XG4gICAgICB0aGlzLnJ0bCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQsIG51bGwpLmdldFByb3BlcnR5VmFsdWUoJ2RpcmVjdGlvbicpID09PSAncnRsJztcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKChjKSA9PiB7XG4gICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICBzdHlsZS50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgIHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgICAgLy8gYWRkIGNzcyBkYXRhIGNsYXNzZXNcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDUwOyBpKyspIHtcbiAgICAgICAgc3R5bGUuaW5uZXJIVE1MICs9IGBbJHt0aGlzLkRBVEFfQ09MfT1cIiR7aX1cIl0geyAgJHt0aGlzLnJ0bCA/ICdyaWdodCcgOiAnbGVmdCd9OiAkeyhpIC0gMSkgKiAodGhpcy50aWxlU2l6ZSArIHRoaXMuZ2FwU2l6ZSl9cHg7IH1gO1xuICAgICAgICBzdHlsZS5pbm5lckhUTUwgKz0gYFske3RoaXMuREFUQV9ST1d9PVwiJHtpfVwiXSB7ICB0b3A6ICR7KGkgLSAxKSAqICh0aGlzLnRpbGVTaXplICsgdGhpcy5nYXBTaXplKX1weDsgfWA7XG4gICAgICAgIHN0eWxlLmlubmVySFRNTCArPSBgWyR7dGhpcy5EQVRBX1NJWkVfWH09XCIke2l9XCJdIHsgIHdpZHRoOiAgJHsoaSAqIHRoaXMudGlsZVNpemUpICsgKChpIC0gMSkgKiB0aGlzLmdhcFNpemUpfXB4OyB9YDtcbiAgICAgICAgc3R5bGUuaW5uZXJIVE1MICs9IGBbJHt0aGlzLkRBVEFfU0laRV9ZfT1cIiR7aX1cIl0geyAgaGVpZ2h0OiAkeyhpICogdGhpcy50aWxlU2l6ZSkgKyAoKGkgLSAxKSAqIHRoaXMuZ2FwU2l6ZSl9cHg7IH1gO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjR3JpZFNpemUoKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IHdpZHRoID1cbiAgICAgICAgKE1hdGgubWF4KC4uLnRoaXMud2lkZ2V0cy5tYXAoKGMpID0+IGMuY29sICsgYy5zaXplWCAtIDEpKSkgKiAodGhpcy50aWxlU2l6ZSArIHRoaXMuZ2FwU2l6ZSk7XG4gICAgICBjb25zdCBoZWlnaHQgPVxuICAgICAgICAoTWF0aC5tYXgoLi4udGhpcy53aWRnZXRzLm1hcCgoYykgPT4gYy5yb3cgKyBjLnNpemVZIC0gMSkpKSAqICh0aGlzLnRpbGVTaXplICsgdGhpcy5nYXBTaXplKTtcbiAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVFZGl0KCkge1xuICAgIHRoaXMuX2lzSW5FZGl0aW5nID8gdGhpcy5maW5pc2hFZGl0KCkgOiB0aGlzLnN0YXJ0RWRpdCgpO1xuICB9XG5cblxuXG4gIHByaXZhdGUgZHJhZ1N0YXJ0KGU6IE1vdXNlRXZlbnQpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lzSW5FZGl0aW5nICYmIGUud2hpY2ggPT09IDEpIHtcbiAgICAgICAgdGhpcy5kcmFnSXRlbSA9IGUuY3VycmVudFRhcmdldCBhcyBhbnk7XG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0uc2V0QXR0cmlidXRlKCdkYXRhLXgtb2Zmc2V0JywgKHRoaXMuZHJhZ0l0ZW0ub2Zmc2V0TGVmdCAtIGUuY2xpZW50WCkudG9TdHJpbmcoKSk7XG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0uc2V0QXR0cmlidXRlKCdkYXRhLXktb2Zmc2V0JywgKHRoaXMuZHJhZ0l0ZW0ub2Zmc2V0VG9wIC0gZS5jbGllbnRZKS50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy5kcmFnSXRlbS5jbGFzc0xpc3QuYWRkKCd3aWRnZXQtZHJhZ2dpbmcnKTtcbiAgICAgICAgdGhpcy5kcmFnSXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdhbmltYXRlX19hbmltYXRlZCcsICdhbmltYXRlX19wdWxzZScpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJlbW92ZVBvc2l0aW9uRGF0YSgpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZHJhZ0l0ZW0gJiYgdGhpcy5faXNJbkVkaXRpbmcgJiYgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX09MRF9DT0wpID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5kcmFnSXRlbS5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX09MRF9DT0wsIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9DT0wpKTtcbiAgICAgICAgdGhpcy5kcmFnSXRlbS5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX09MRF9ST1csIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9ST1cpKTtcbiAgICAgICAgdGhpcy5kcmFnSXRlbS5yZW1vdmVBdHRyaWJ1dGUodGhpcy5EQVRBX0NPTCk7XG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0ucmVtb3ZlQXR0cmlidXRlKHRoaXMuREFUQV9ST1cpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVzZXRQb3NpdGlvbkRhdGEoKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRyYWdJdGVtICYmIHRoaXMuX2lzSW5FZGl0aW5nKSB7XG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24odGhpcy5kcmFnSXRlbSwgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX09MRF9DT0wpLCB0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfT0xEX1JPVykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQb3NpdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCwgY29sOiBzdHJpbmcsIHJvdzogc3RyaW5nKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHRoaXMuREFUQV9DT0wsIGNvbCk7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSh0aGlzLkRBVEFfUk9XLCByb3cpO1xuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUodGhpcy5EQVRBX09MRF9DT0wpO1xuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUodGhpcy5EQVRBX09MRF9ST1cpO1xuICAgICAgZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndG9wJyk7XG4gICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdsZWZ0Jyk7XG4gICAgICBjb25zdCB3aWRnZXQgPSB0aGlzLndpZGdldHMuZmluZChjID0+IGNbJ19fbWV0YV9fJ10uaW5zdGFuY2UuZWxlbWVudCA9PT0gZWxlbWVudCk7XG4gICAgICB3aWRnZXQuY29sID0gTnVtYmVyKGNvbCk7XG4gICAgICB3aWRnZXQucm93ID0gTnVtYmVyKHJvdyk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRyYWcoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kcmFnSXRlbSAmJiB0aGlzLl9pc0luRWRpdGluZykge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmFkZFBsYWNlaG9sZGVyKCk7XG4gICAgICAgIGNvbnN0IHhPZmZzZXQgPSBOdW1iZXIodGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEteC1vZmZzZXQnKSk7XG4gICAgICAgIGNvbnN0IHlPZmZzZXQgPSBOdW1iZXIodGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEteS1vZmZzZXQnKSk7XG4gICAgICAgIHRoaXMuZHJhZ0l0ZW0uc3R5bGUubGVmdCA9IGUuY2xpZW50WCArIHhPZmZzZXQgKyAncHgnO1xuICAgICAgICB0aGlzLmRyYWdJdGVtLnN0eWxlLnRvcCA9IGUuY2xpZW50WSArIHlPZmZzZXQgKyAncHgnO1xuICAgICAgICAvL1xuICAgICAgICB0aGlzLmRldGVjdEJlc3RQbGFjZW1lbnQoKTtcbiAgICAgICAgdGhpcy5yZW1vdmVQb3NpdGlvbkRhdGEoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGRyYWdFbmQoZSkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kcmFnSXRlbSAmJiB0aGlzLl9pc0luRWRpdGluZyAmJiB0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgdGhpcy5kcmFnSXRlbS5jbGFzc0xpc3QucmVtb3ZlKCd3aWRnZXQtZHJhZ2dpbmcnKTtcbiAgICAgICAgdGhpcy5kcmFnSXRlbS5jbGFzc0xpc3QuYWRkKCdhbmltYXRlX19hbmltYXRlZCcsICdhbmltYXRlX19wdWxzZScpO1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBwID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2lkZ2V0LWJsYW5rLXBsYWNlaG9sZGVyJyk7XG4gICAgICAgIGlmICh0aGlzLm5ld1dpZGdldCkge1xuICAgICAgICAgIGNvbnN0IHcgPSB7XG4gICAgICAgICAgICB1bmlxdWVOYW1lOiB0aGlzLm5ld1dpZGdldC51bmlxdWVOYW1lLFxuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLm5ld1dpZGdldC5jb21wb25lbnQsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5uZXdXaWRnZXQudGl0bGUsXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLm5ld1dpZGdldC5vcHRpb25zLFxuICAgICAgICAgICAgc2l6ZVg6IHRoaXMubmV3V2lkZ2V0LnNpemVYLFxuICAgICAgICAgICAgc2l6ZVk6IHRoaXMubmV3V2lkZ2V0LnNpemVZLFxuICAgICAgICAgICAgY29sOiBOdW1iZXIocC5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX0NPTCkpLFxuICAgICAgICAgICAgcm93OiBOdW1iZXIocC5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1JPVykpXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRoaXMud2lkZ2V0cy5wdXNoKHcpO1xuICAgICAgICAgIHRoaXMubmV3V2lkZ2V0ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuZHJhZ0l0ZW0pO1xuICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5jYWxjR3JpZFNpemUoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB3WydfX21ldGFfXyddLmluc3RhbmNlLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5kcmFnU3RhcnQuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24odGhpcy5kcmFnSXRlbSwgcC5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX0NPTCksIHAuZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9ST1cpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMuZHJhZ0l0ZW0sIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9PTERfQ09MKSwgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX09MRF9ST1cpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5yZW1vdmVQbGFjZWhvbGRlcigpO1xuICAgICAgICB0aGlzLmRyYWdJdGVtID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYWxjR3JpZFNpemUoKTtcbiAgICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlZCgnY29uZmlnJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0Rmlyc3RFbXB0eVNsb3QodzogQVhXaWRnZXRDb25maWcpIHtcbiAgICBjb25zdCB4VGlsZSA9IE1hdGguZmxvb3IodGhpcy5yZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldFdpZHRoIC8gdGhpcy50aWxlU2l6ZSk7XG4gICAgZm9yIChsZXQgaiA9IDE7IGogPD0gMTAwOyBqKyspIHtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHhUaWxlIC0gdy5zaXplWDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJlYyA9IG5ldyBBWENsaWVudFJlYyh7XG4gICAgICAgICAgbGVmdDogaSxcbiAgICAgICAgICB0b3A6IGosXG4gICAgICAgICAgd2lkdGg6IHcuc2l6ZVgsXG4gICAgICAgICAgaGVpZ2h0OiB3LnNpemVZXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbCA9IHRoaXMud2lkZ2V0cy5maWx0ZXIoYyA9PiBjICE9PSB3KS5maW5kKChjKSA9PlxuICAgICAgICAgIHJlYy5pbnRlcnNlY3Qoe1xuICAgICAgICAgICAgbGVmdDogYy5jb2wsXG4gICAgICAgICAgICB0b3A6IGMucm93LFxuICAgICAgICAgICAgd2lkdGg6IGMuc2l6ZVgsXG4gICAgICAgICAgICBoZWlnaHQ6IGMuc2l6ZVlcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBpZiAoZWwgPT0gbnVsbCkge1xuICAgICAgICAgIHcuY29sID0gaTtcbiAgICAgICAgICB3LnJvdyA9IGo7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXRlY3RCZXN0UGxhY2VtZW50KCkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBwID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2lkZ2V0LWJsYW5rLXBsYWNlaG9sZGVyJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBsZXQgY29sID0gTWF0aC5jZWlsKHRoaXMuZHJhZ0l0ZW0ub2Zmc2V0TGVmdCAvIHRoaXMudGlsZVNpemUpO1xuICAgICAgaWYgKHRoaXMucnRsKSB7XG4gICAgICAgIGNvbCA9IE1hdGguY2VpbCgodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCAtICh0aGlzLmRyYWdJdGVtLm9mZnNldExlZnQgKyB0aGlzLmRyYWdJdGVtLmNsaWVudFdpZHRoKSkgLyB0aGlzLnRpbGVTaXplKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHJvdyA9IE1hdGguY2VpbCh0aGlzLmRyYWdJdGVtLm9mZnNldFRvcCAvIHRoaXMudGlsZVNpemUpO1xuICAgICAgaWYgKGNvbCA8IDEpIHtcbiAgICAgICAgY29sID0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChyb3cgPCAxKSB7XG4gICAgICAgIHJvdyA9IDE7XG4gICAgICB9XG4gICAgICBjb25zdCB3aWRnZXRzID0gQXJyYXkuZnJvbSh0aGlzLnJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy53aWRnZXQtaG9zdCcpKS5tYXAoKGMpID0+IGMgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgcC5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX0NPTCwgY29sLnRvU3RyaW5nKCkpO1xuICAgICAgcC5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1JPVywgcm93LnRvU3RyaW5nKCkpO1xuICAgICAgY29uc3QgY29sbGlzaW9uID0gd2lkZ2V0cy5maWx0ZXIoYyA9PiBjICE9PSB0aGlzLmRyYWdJdGVtKS5zb21lKGMgPT4gQVhIdG1sVXRpbC5jb2xsaXNpb24oYywgdGhpcy5kcmFnSXRlbSkpO1xuICAgICAgaWYgKGNvbGxpc2lvbikge1xuICAgICAgICB0aGlzLnJlbW92ZVBsYWNlaG9sZGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG5cblxuICBwcml2YXRlIGFkZFBsYWNlaG9sZGVyKCkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLnJlbW92ZVBsYWNlaG9sZGVyKCk7XG4gICAgICBpZiAodGhpcy5kcmFnSXRlbSkge1xuICAgICAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHAuY2xhc3NMaXN0LmFkZCgnd2lkZ2V0LWJsYW5rLXBsYWNlaG9sZGVyJyk7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKHRoaXMuREFUQV9DT0wsIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9DT0wpKTtcbiAgICAgICAgcC5zZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1JPVywgdGhpcy5kcmFnSXRlbS5nZXRBdHRyaWJ1dGUodGhpcy5EQVRBX1JPVykpO1xuICAgICAgICBwLnNldEF0dHJpYnV0ZSh0aGlzLkRBVEFfU0laRV9YLCB0aGlzLmRyYWdJdGVtLmdldEF0dHJpYnV0ZSh0aGlzLkRBVEFfU0laRV9YKSk7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKHRoaXMuREFUQV9TSVpFX1ksIHRoaXMuZHJhZ0l0ZW0uZ2V0QXR0cmlidXRlKHRoaXMuREFUQV9TSVpFX1kpKTtcbiAgICAgICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUGxhY2Vob2xkZXIoKSB7XG4gICAgY29uc3QgcCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLndpZGdldC1ibGFuay1wbGFjZWhvbGRlcicpO1xuICAgIHA/LnJlbW92ZSgpO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0RWRpdCgpIHtcbiAgICB0aGlzLl9pc0luRWRpdGluZyA9IHRydWU7XG4gICAgdGhpcy5jYWxjR3JpZFNpemUoKTtcbiAgICB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2dyaWQtYmFja2dyb3VuZCcpO1xuICAgIGNvbnN0IGJnID0gdGhpcy5yZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICBiZy5zdHlsZS5zZXRQcm9wZXJ0eSgnYmFja2dyb3VuZC1wb3NpdGlvbicsIGAke3RoaXMucnRsID8gJ3JpZ2h0JyA6ICdsZWZ0J30gdG9wYCk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICBjb25zdCBwYXR0ZXJuID0gYHVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgd2lkdGg9XCIke3RoaXMudGlsZVNpemUgKyB0aGlzLmdhcFNpemV9XCIgaGVpZ2h0PVwiJHt0aGlzLnRpbGVTaXplICsgdGhpcy5nYXBTaXplfVwiPiA8cmVjdCBzdHlsZT1cImZpbGw6ICUyM2RhZGFkYVwiIHg9XCIke3RoaXMucnRsID8gdGhpcy5nYXBTaXplIDogMH1cIiB3aWR0aD1cIiR7dGhpcy50aWxlU2l6ZX1cIiBoZWlnaHQ9XCIke3RoaXMudGlsZVNpemV9XCIgeT1cIjBcIj48L3JlY3Q+PC9zdmc+JylgO1xuICAgIGJnLnN0eWxlLnNldFByb3BlcnR5KCdiYWNrZ3JvdW5kLWltYWdlJywgcGF0dGVybik7XG4gICAgLy9cbiAgICBjb25zdCB3aWRnZXRzID0gQXJyYXkuZnJvbSh0aGlzLnJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy53aWRnZXQtaG9zdCcpKTtcbiAgICB3aWRnZXRzLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5kcmFnU3RhcnQuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgIH0pO1xuICAgIHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmRyYWdFbmQuYmluZCh0aGlzKSwgZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGZpbmlzaEVkaXQoKSB7XG4gICAgdGhpcy5yZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdncmlkLWJhY2tncm91bmQnKTtcbiAgICBjb25zdCBiZyA9IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgYmcuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2JhY2tncm91bmQtaW1hZ2UnKTtcbiAgICAvL1xuICAgIHRoaXMuX2lzSW5FZGl0aW5nID0gZmFsc2U7XG4gICAgY29uc3Qgd2lkZ2V0cyA9IEFycmF5LmZyb20odGhpcy5yZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcud2lkZ2V0LWhvc3QnKSk7XG4gICAgd2lkZ2V0cy5mb3JFYWNoKCh3KSA9PiB7XG4gICAgICB3LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuZHJhZ1N0YXJ0LmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZy5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gICAgdGhpcy5yZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5kcmFnRW5kLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2VkKCdjb25maWcnKTtcbiAgfVxuXG5cbiAgYWRkV2lkZ2V0KHdpZGdldDogQVhXaWRnZXRDb25maWcpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5uZXdXaWRnZXQgPSB7XG4gICAgICAgIHVuaXF1ZU5hbWU6IHdpZGdldC51bmlxdWVOYW1lLFxuICAgICAgICBjb21wb25lbnQ6IHdpZGdldC5jb21wb25lbnQsXG4gICAgICAgIHRpdGxlOiB3aWRnZXQudGl0bGUsXG4gICAgICAgIGNvbDogMSxcbiAgICAgICAgcm93OiAxLFxuICAgICAgICBzaXplWDogd2lkZ2V0LnNpemVYLFxuICAgICAgICBzaXplWTogd2lkZ2V0LnNpemVZLFxuICAgICAgICBvcHRpb25zOiB3aWRnZXQub3B0aW9ucyxcbiAgICAgICAgcHJvcHM6IHdpZGdldC5wcm9wc1xuICAgICAgfTtcbiAgICAgIHRoaXMuZGV0ZWN0Rmlyc3RFbXB0eVNsb3QodGhpcy5uZXdXaWRnZXQpO1xuICAgICAgY29uc3QgdyA9IHtcbiAgICAgICAgdW5pcXVlTmFtZTogdGhpcy5uZXdXaWRnZXQudW5pcXVlTmFtZSxcbiAgICAgICAgY29tcG9uZW50OiB0aGlzLm5ld1dpZGdldC5jb21wb25lbnQsXG4gICAgICAgIHRpdGxlOiB0aGlzLm5ld1dpZGdldC50aXRsZSxcbiAgICAgICAgb3B0aW9uczogdGhpcy5uZXdXaWRnZXQub3B0aW9ucyxcbiAgICAgICAgcHJvcHM6IHRoaXMubmV3V2lkZ2V0LnByb3BzLFxuICAgICAgICBzaXplWDogdGhpcy5uZXdXaWRnZXQuc2l6ZVgsXG4gICAgICAgIHNpemVZOiB0aGlzLm5ld1dpZGdldC5zaXplWSxcbiAgICAgICAgY29sOiB0aGlzLm5ld1dpZGdldC5jb2wsXG4gICAgICAgIHJvdzogdGhpcy5uZXdXaWRnZXQucm93XG4gICAgICB9O1xuICAgICAgdGhpcy53aWRnZXRzLnB1c2godyk7XG4gICAgICB0aGlzLm5ld1dpZGdldCA9IG51bGw7XG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLmNhbGNHcmlkU2l6ZSgpO1xuICAgICAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2VkKCdhZGQnKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgd1snX19tZXRhX18nXS5pbnN0YW5jZS5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuZHJhZ1N0YXJ0LmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgaGFuZGxlT25SZW1vdmUodzogQVhXaWRnZXRIb3N0Q29tcG9uZW50KSB7XG4gICAgdy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FuaW1hdGVfX2FuaW1hdGVkJywgJ2FuaW1hdGVfX3pvb21PdXQnKTtcbiAgICB3LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYW5pbWF0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgdGhpcy53aWRnZXRzID0gdGhpcy53aWRnZXRzLmZpbHRlcigoYykgPT4gKGMgYXMgYW55KS5fX21ldGFfXy5pZCAhPT0gKHcuY29uZmlnIGFzIGFueSkuX19tZXRhX18uaWQpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5jYWxjR3JpZFNpemUoKTtcbiAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZWQoJ3JlbW92ZScpO1xuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlT25TYXZlKGU6IEFYV2lkZ2V0Q29uZmlnU2F2ZWRFdmVudCkge1xuICAgIHRoaXMub25XaWRnZXRTYXZlLmVtaXQoZSk7XG4gIH1cblxuICB0cmFja0J5Rm4oaW5kZXgsIGl0ZW0pIHtcbiAgICBpZiAoIWl0ZW1bJ19fbWV0YV9fJ10/LmlkKSB7XG4gICAgICBpdGVtWydfX21ldGFfXyddID0ge307XG4gICAgICBpdGVtWydfX21ldGFfXyddLmlkID0gQVhIdG1sVXRpbC5nZXRVSUQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1bJ19fbWV0YV9fJ10/LmlkO1xuICB9XG5cblxuICBsb2FkKHdpZGdldHM6IHN0cmluZyB8IEFYV2lkZ2V0Q29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsZWFyKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh3aWRnZXRzKSB7XG4gICAgICAgIGNvbnN0IGxvYWRlZFdpZGdldHM6IEFYV2lkZ2V0Q29uZmlnW10gPSBbXTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aWRnZXRzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2FkZWRXaWRnZXRzLnB1c2goLi4uSlNPTi5wYXJzZSh3aWRnZXRzKSk7XG4gICAgICAgICAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2VkKCdsb2FkJyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdCgnSW52YWxpZCB3aWRnZXQganNvbiBkYXRhIScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBsb2FkZWRXaWRnZXRzLnB1c2goLi4ud2lkZ2V0cyk7XG4gICAgICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlZCgnbG9hZCcpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbnRlcnZhbElkOiBudW1iZXIgPSAtMTtcbiAgICAgICAgY29uc3QgbG9hZEZ1bmMgPSAoKSA9PiB7XG5cbiAgICAgICAgICBpZiAodGhpcy5nYWxsZXJ5SXRlbXMgJiYgdGhpcy5nYWxsZXJ5SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9hZGVkV2lkZ2V0cy5mb3JFYWNoKHcgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBnaXRlbSA9IHRoaXMuZ2FsbGVyeUl0ZW1zLmZpbmQoYyA9PiBjLnVuaXF1ZU5hbWUgPT09IHcudW5pcXVlTmFtZSk7XG4gICAgICAgICAgICAgIGlmIChnaXRlbSkge1xuICAgICAgICAgICAgICAgIHcuY29tcG9uZW50ID0gZ2l0ZW0uY29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGlmIChnaXRlbS5wcm9wcykge1xuICAgICAgICAgICAgICAgICAgdy5wcm9wcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZ2l0ZW0ucHJvcHMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy53aWRnZXRzLnB1c2goLi4ubG9hZGVkV2lkZ2V0cyk7XG4gICAgICAgICAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2VkKCdsb2FkJyk7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwobG9hZEZ1bmMsIDIwMCk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgaWYgKHRoaXMud2lkZ2V0cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMud2lkZ2V0cyA9IFtdO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlZCgnY2xlYXInKTtcbiAgICB9XG4gIH1cblxuICBzYXZlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy53aWRnZXRzLm1hcChjID0+ICh7XG4gICAgICB1bmlxdWVOYW1lOiBjLnVuaXF1ZU5hbWUsXG4gICAgICBjb21wb25lbnQ6IGMuY29tcG9uZW50LFxuICAgICAgdGl0bGU6IGMudGl0bGUsXG4gICAgICBzaXplWDogYy5zaXplWCxcbiAgICAgIHNpemVZOiBjLnNpemVZLFxuICAgICAgY29sOiBjLmNvbCxcbiAgICAgIHJvdzogYy5yb3csXG4gICAgICBvcHRpb25zOiBjLm9wdGlvbnMsXG4gICAgICBwcm9wczogYy5wcm9wc1xuICAgIH0pKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9XG5cbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLndpZGdldEhvc3RzLmZvckVhY2goaG9zdCA9PiB7XG4gICAgICBob3N0LndpZGdldC5yZWZyZXNoKCk7XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVPbkNvbmZpZ0NoYW5nZWQoZTogQVhXaWRnZXRDb25maWdDaGFuZ2VkKSB7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZWQoJ2NvbmZpZycpO1xuICB9XG5cbiAgaGFuZGxlT25SZXNpemVkQ2hhbmdlZChlOiBBWFdpZGdldENvbmZpZ0NoYW5nZWQpIHtcbiAgICB0aGlzLmRldGVjdEZpcnN0RW1wdHlTbG90KGUuY29uZmlnKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlZCgnY29uZmlnJyk7XG4gIH1cblxuICAvL3ByaXZhdGUgcmVzaXplQ2hhbmdlT2JzZXJ2ZXI6IGFueTtcbiAgcHJpdmF0ZSBlbWl0Q29uZmlnQ2hhbmdlZChtb2RlOidjbGVhcid8J2FkZCd8J3JlbW92ZSd8J2xvYWQnfCdjb25maWcnKSB7XG4gICAgLy8gaWYgKCF0aGlzLnJlc2l6ZUNoYW5nZU9ic2VydmVyKSB7XG4gICAgLy8gICB0aGlzLnJlc2l6ZUNoYW5nZU9ic2VydmVyID0gbmV3IE9ic2VydmFibGUoKTtcbiAgICAvLyAgIE9ic2VydmFibGUuY3JlYXRlKG9ic2VydmVyID0+IHtcbiAgICAvLyAgICAgdGhpcy5yZXNpemVDaGFuZ2VPYnNlcnZlciA9IG9ic2VydmVyO1xuICAgIC8vICAgfSlcbiAgICAvLyAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDc1MCkpXG4gICAgLy8gICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgLy8gICAgIC5zdWJzY3JpYmUoYyA9PiB7XG4gICAgLy8gICAgICAgdGhpcy5vbkNvbmZpZ0NoYW5nZWQuZW1pdCh7XG4gICAgLy8gICAgICAgICBjb21wb25lbnQ6IHRoaXNcbiAgICAvLyAgICAgICB9KTtcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gfVxuICAgIC8vIHRoaXMucmVzaXplQ2hhbmdlT2JzZXJ2ZXIubmV4dChuZXcgRGF0ZSgpKTtcbiAgICB0aGlzLm9uQ29uZmlnQ2hhbmdlZC5lbWl0KHtcbiAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgIG1vZGVcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIndpZGdldHMtY29udGFpbmVyXCIgW2NsYXNzLnJ0bF09XCJydGxcIiAjY29udGFpbmVyPlxuICAgIDxheC13aWRnZXQtaG9zdCAqbmdGb3I9XCJsZXQgdyBvZiB3aWRnZXRzO3RyYWNrQnk6IHRyYWNrQnlGblwiICBbY29uZmlnXT0ndycgW3NpemVYXT1cIncuc2l6ZVhcIiBbcmVhZG9ubHldPVwicmVhZG9ubHkgfHwgdy5yZWFkb25seVwiXG4gICAgICAgIFtzaXplWV09XCJ3LnNpemVZXCIgW2NvbF09XCJ3LmNvbFwiIFtyb3ddPVwidy5yb3dcIiAob25SZW1vdmUpPVwiaGFuZGxlT25SZW1vdmUoJGV2ZW50KVwiIChvblNhdmUpPVwiaGFuZGxlT25TYXZlKCRldmVudClcIlxuICAgICAgICAob25Db25maWdDaGFuZ2VkKT1cImhhbmRsZU9uQ29uZmlnQ2hhbmdlZCgkZXZlbnQpXCIgKG9uUmVzaXplZCk9XCJoYW5kbGVPblJlc2l6ZWRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICBbcHJvdmlkZVZhbHVlXT1cInByb3ZpZGVWYWx1ZVwiPlxuICAgIDwvYXgtd2lkZ2V0LWhvc3Q+XG48L2Rpdj5cbiJdfQ==