@schneideress/dashboardframework 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +24 -0
  2. package/bundles/schneideress-dashboardframework.umd.js +5666 -0
  3. package/bundles/schneideress-dashboardframework.umd.js.map +1 -0
  4. package/bundles/schneideress-dashboardframework.umd.min.js +2 -0
  5. package/bundles/schneideress-dashboardframework.umd.min.js.map +1 -0
  6. package/esm2015/gridster/index.js +18 -0
  7. package/esm2015/gridster/lib/gridster.component.js +695 -0
  8. package/esm2015/gridster/lib/gridster.interface.js +84 -0
  9. package/esm2015/gridster/lib/gridster.module.js +27 -0
  10. package/esm2015/gridster/lib/gridsterCompact.service.js +223 -0
  11. package/esm2015/gridster/lib/gridsterConfig.constant.js +179 -0
  12. package/esm2015/gridster/lib/gridsterConfig.interface.js +219 -0
  13. package/esm2015/gridster/lib/gridsterConfigS.interface.js +161 -0
  14. package/esm2015/gridster/lib/gridsterDraggable.service.js +510 -0
  15. package/esm2015/gridster/lib/gridsterEmptyCell.service.js +317 -0
  16. package/esm2015/gridster/lib/gridsterItem.component.js +213 -0
  17. package/esm2015/gridster/lib/gridsterItem.interface.js +46 -0
  18. package/esm2015/gridster/lib/gridsterItemComponent.interface.js +48 -0
  19. package/esm2015/gridster/lib/gridsterPreview.component.js +66 -0
  20. package/esm2015/gridster/lib/gridsterPush.service.js +467 -0
  21. package/esm2015/gridster/lib/gridsterPushResize.service.js +358 -0
  22. package/esm2015/gridster/lib/gridsterRenderer.service.js +277 -0
  23. package/esm2015/gridster/lib/gridsterResizable.service.js +552 -0
  24. package/esm2015/gridster/lib/gridsterResizeEventType.interface.js +19 -0
  25. package/esm2015/gridster/lib/gridsterScroll.service.js +195 -0
  26. package/esm2015/gridster/lib/gridsterSwap.service.js +134 -0
  27. package/esm2015/gridster/lib/gridsterUtils.service.js +137 -0
  28. package/esm2015/lib/ra-dashboard-area/ra.dashboard.area.js +258 -0
  29. package/esm2015/lib/ra-widget-container/ra.widget.container.component.js +216 -0
  30. package/esm2015/lib/ra.base.dashboard.filter.js +35 -0
  31. package/esm2015/lib/ra.base.dashboard.template.js +63 -0
  32. package/esm2015/lib/ra.dashbard.event.bus.js +85 -0
  33. package/esm2015/lib/ra.dashboard.module.js +31 -0
  34. package/esm2015/lib/ra.dashboard.service.js +213 -0
  35. package/esm2015/lib/ra.event.enum.js +33 -0
  36. package/esm2015/lib/ra.gridster.config.js +63 -0
  37. package/esm2015/public-api.js +16 -0
  38. package/esm2015/schneideress-dashboardframework.js +13 -0
  39. package/esm5/gridster/index.js +18 -0
  40. package/esm5/gridster/lib/gridster.component.js +798 -0
  41. package/esm5/gridster/lib/gridster.interface.js +94 -0
  42. package/esm5/gridster/lib/gridster.module.js +31 -0
  43. package/esm5/gridster/lib/gridsterCompact.service.js +253 -0
  44. package/esm5/gridster/lib/gridsterConfig.constant.js +179 -0
  45. package/esm5/gridster/lib/gridsterConfig.interface.js +219 -0
  46. package/esm5/gridster/lib/gridsterConfigS.interface.js +161 -0
  47. package/esm5/gridster/lib/gridsterDraggable.service.js +549 -0
  48. package/esm5/gridster/lib/gridsterEmptyCell.service.js +358 -0
  49. package/esm5/gridster/lib/gridsterItem.component.js +238 -0
  50. package/esm5/gridster/lib/gridsterItem.interface.js +46 -0
  51. package/esm5/gridster/lib/gridsterItemComponent.interface.js +58 -0
  52. package/esm5/gridster/lib/gridsterPreview.component.js +70 -0
  53. package/esm5/gridster/lib/gridsterPush.service.js +547 -0
  54. package/esm5/gridster/lib/gridsterPushResize.service.js +423 -0
  55. package/esm5/gridster/lib/gridsterRenderer.service.js +323 -0
  56. package/esm5/gridster/lib/gridsterResizable.service.js +629 -0
  57. package/esm5/gridster/lib/gridsterResizeEventType.interface.js +19 -0
  58. package/esm5/gridster/lib/gridsterScroll.service.js +195 -0
  59. package/esm5/gridster/lib/gridsterSwap.service.js +152 -0
  60. package/esm5/gridster/lib/gridsterUtils.service.js +177 -0
  61. package/esm5/lib/ra-dashboard-area/ra.dashboard.area.js +307 -0
  62. package/esm5/lib/ra-widget-container/ra.widget.container.component.js +277 -0
  63. package/esm5/lib/ra.base.dashboard.filter.js +38 -0
  64. package/esm5/lib/ra.base.dashboard.template.js +63 -0
  65. package/esm5/lib/ra.dashbard.event.bus.js +125 -0
  66. package/esm5/lib/ra.dashboard.module.js +35 -0
  67. package/esm5/lib/ra.dashboard.service.js +295 -0
  68. package/esm5/lib/ra.event.enum.js +33 -0
  69. package/esm5/lib/ra.gridster.config.js +63 -0
  70. package/esm5/public-api.js +16 -0
  71. package/esm5/schneideress-dashboardframework.js +13 -0
  72. package/fesm2015/schneideress-dashboardframework.js +4811 -0
  73. package/fesm2015/schneideress-dashboardframework.js.map +1 -0
  74. package/fesm5/schneideress-dashboardframework.js +5613 -0
  75. package/fesm5/schneideress-dashboardframework.js.map +1 -0
  76. package/gridster/index.d.ts +11 -0
  77. package/gridster/lib/gridster.component.d.ts +67 -0
  78. package/gridster/lib/gridster.interface.d.ts +46 -0
  79. package/gridster/lib/gridster.module.d.ts +2 -0
  80. package/gridster/lib/gridsterCompact.service.d.ts +15 -0
  81. package/gridster/lib/gridsterConfig.constant.d.ts +2 -0
  82. package/gridster/lib/gridsterConfig.interface.d.ts +133 -0
  83. package/gridster/lib/gridsterConfigS.interface.d.ts +93 -0
  84. package/gridster/lib/gridsterDraggable.service.d.ts +59 -0
  85. package/gridster/lib/gridsterEmptyCell.service.d.ts +29 -0
  86. package/gridster/lib/gridsterItem.component.d.ts +32 -0
  87. package/gridster/lib/gridsterItem.interface.d.ts +21 -0
  88. package/gridster/lib/gridsterItemComponent.interface.d.ts +25 -0
  89. package/gridster/lib/gridsterPreview.component.d.ts +10 -0
  90. package/gridster/lib/gridsterPush.service.d.ts +33 -0
  91. package/gridster/lib/gridsterPushResize.service.d.ts +26 -0
  92. package/gridster/lib/gridsterRenderer.service.d.ts +38 -0
  93. package/gridster/lib/gridsterResizable.service.d.ts +67 -0
  94. package/gridster/lib/gridsterResizeEventType.interface.d.ts +6 -0
  95. package/gridster/lib/gridsterScroll.service.d.ts +4 -0
  96. package/gridster/lib/gridsterSwap.service.d.ts +13 -0
  97. package/gridster/lib/gridsterUtils.service.d.ts +16 -0
  98. package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +37 -0
  99. package/lib/ra-widget-container/ra.widget.container.component.d.ts +37 -0
  100. package/lib/ra.base.dashboard.filter.d.ts +4 -0
  101. package/lib/ra.base.dashboard.template.d.ts +14 -0
  102. package/lib/ra.dashbard.event.bus.d.ts +20 -0
  103. package/lib/ra.dashboard.module.d.ts +2 -0
  104. package/lib/ra.dashboard.service.d.ts +73 -0
  105. package/lib/ra.event.enum.d.ts +24 -0
  106. package/lib/ra.gridster.config.d.ts +2 -0
  107. package/package.json +25 -0
  108. package/public-api.d.ts +8 -0
  109. package/schneideress-dashboardframework.d.ts +8 -0
  110. package/schneideress-dashboardframework.metadata.json +1 -0
@@ -0,0 +1,798 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import { ChangeDetectorRef, Component, ElementRef, Input, NgZone, Renderer2, ViewEncapsulation } from '@angular/core';
6
+ import { GridsterConfigService } from './gridsterConfig.constant';
7
+ import { GridsterUtils } from './gridsterUtils.service';
8
+ import { GridsterEmptyCell } from './gridsterEmptyCell.service';
9
+ import { GridsterCompact } from './gridsterCompact.service';
10
+ import { GridsterRenderer } from './gridsterRenderer.service';
11
+ var GridsterComponent = /** @class */ (function () {
12
+ function GridsterComponent(el, renderer, cdRef, zone) {
13
+ this.renderer = renderer;
14
+ this.cdRef = cdRef;
15
+ this.zone = zone;
16
+ this.gridColumns = [];
17
+ this.gridRows = [];
18
+ this.el = el.nativeElement;
19
+ this.$options = JSON.parse(JSON.stringify(GridsterConfigService));
20
+ this.calculateLayoutDebounce = GridsterUtils.debounce(this.calculateLayout.bind(this), 0);
21
+ this.mobile = false;
22
+ this.curWidth = 0;
23
+ this.curHeight = 0;
24
+ this.grid = [];
25
+ this.curColWidth = 0;
26
+ this.curRowHeight = 0;
27
+ this.dragInProgress = false;
28
+ this.emptyCell = new GridsterEmptyCell(this);
29
+ this.compact = new GridsterCompact(this);
30
+ this.gridRenderer = new GridsterRenderer(this);
31
+ }
32
+ /**
33
+ * @param {?} item
34
+ * @param {?} item2
35
+ * @return {?}
36
+ */
37
+ GridsterComponent.checkCollisionTwoItems = /**
38
+ * @param {?} item
39
+ * @param {?} item2
40
+ * @return {?}
41
+ */
42
+ function (item, item2) {
43
+ return item.x < item2.x + item2.cols
44
+ && item.x + item.cols > item2.x
45
+ && item.y < item2.y + item2.rows
46
+ && item.y + item.rows > item2.y;
47
+ };
48
+ /**
49
+ * @return {?}
50
+ */
51
+ GridsterComponent.prototype.ngOnInit = /**
52
+ * @return {?}
53
+ */
54
+ function () {
55
+ if (this.options.initCallback) {
56
+ this.options.initCallback(this);
57
+ }
58
+ };
59
+ /**
60
+ * @param {?} changes
61
+ * @return {?}
62
+ */
63
+ GridsterComponent.prototype.ngOnChanges = /**
64
+ * @param {?} changes
65
+ * @return {?}
66
+ */
67
+ function (changes) {
68
+ if (changes.options) {
69
+ this.setOptions();
70
+ this.options.api = {
71
+ optionsChanged: this.optionsChanged.bind(this),
72
+ resize: this.onResize.bind(this),
73
+ getNextPossiblePosition: this.getNextPossiblePosition.bind(this),
74
+ getFirstPossiblePosition: this.getFirstPossiblePosition.bind(this),
75
+ getLastPossiblePosition: this.getLastPossiblePosition.bind(this),
76
+ getCurrentRowHeight: this.getCurrentRowHeight.bind(this)
77
+ };
78
+ this.columns = this.$options.minCols;
79
+ this.rows = this.$options.minRows;
80
+ this.setGridSize();
81
+ this.calculateLayout();
82
+ }
83
+ };
84
+ /**
85
+ * @return {?}
86
+ */
87
+ GridsterComponent.prototype.getCurrentRowHeight = /**
88
+ * @return {?}
89
+ */
90
+ function () {
91
+ return this.curRowHeight;
92
+ };
93
+ /**
94
+ * @return {?}
95
+ */
96
+ GridsterComponent.prototype.resize = /**
97
+ * @return {?}
98
+ */
99
+ function () {
100
+ /** @type {?} */
101
+ var height;
102
+ /** @type {?} */
103
+ var width;
104
+ if (this.$options.gridType === 'fit' && !this.mobile) {
105
+ width = this.el.offsetWidth;
106
+ height = this.el.offsetHeight;
107
+ }
108
+ else {
109
+ width = this.el.clientWidth;
110
+ height = this.el.clientHeight;
111
+ }
112
+ if ((width !== this.curWidth || height !== this.curHeight) && this.checkIfToResize()) {
113
+ this.onResize();
114
+ }
115
+ };
116
+ /**
117
+ * @return {?}
118
+ */
119
+ GridsterComponent.prototype.setOptions = /**
120
+ * @return {?}
121
+ */
122
+ function () {
123
+ this.$options = GridsterUtils.merge(this.$options, this.options, this.$options);
124
+ if (!this.$options.disableWindowResize && !this.windowResize) {
125
+ this.windowResize = this.renderer.listen('window', 'resize', this.onResize.bind(this));
126
+ }
127
+ else if (this.$options.disableWindowResize && this.windowResize) {
128
+ this.windowResize();
129
+ this.windowResize = null;
130
+ }
131
+ this.emptyCell.updateOptions();
132
+ };
133
+ /**
134
+ * @return {?}
135
+ */
136
+ GridsterComponent.prototype.optionsChanged = /**
137
+ * @return {?}
138
+ */
139
+ function () {
140
+ this.setOptions();
141
+ /** @type {?} */
142
+ var widgetsIndex = this.grid.length - 1;
143
+ /** @type {?} */
144
+ var widget;
145
+ for (; widgetsIndex >= 0; widgetsIndex--) {
146
+ widget = this.grid[widgetsIndex];
147
+ widget.updateOptions();
148
+ }
149
+ this.calculateLayout();
150
+ };
151
+ /**
152
+ * @return {?}
153
+ */
154
+ GridsterComponent.prototype.ngOnDestroy = /**
155
+ * @return {?}
156
+ */
157
+ function () {
158
+ if (this.windowResize) {
159
+ this.windowResize();
160
+ }
161
+ if (this.options.destroyCallback) {
162
+ this.options.destroyCallback(this);
163
+ }
164
+ if (this.options.api) {
165
+ this.options.api.resize = undefined;
166
+ this.options.api.optionsChanged = undefined;
167
+ this.options.api.getNextPossiblePosition = undefined;
168
+ this.options.api = undefined;
169
+ }
170
+ this.emptyCell.destroy();
171
+ delete this.emptyCell;
172
+ this.compact.destroy();
173
+ delete this.compact;
174
+ };
175
+ /**
176
+ * @return {?}
177
+ */
178
+ GridsterComponent.prototype.onResize = /**
179
+ * @return {?}
180
+ */
181
+ function () {
182
+ this.setGridSize();
183
+ this.calculateLayout();
184
+ };
185
+ /**
186
+ * @return {?}
187
+ */
188
+ GridsterComponent.prototype.checkIfToResize = /**
189
+ * @return {?}
190
+ */
191
+ function () {
192
+ /** @type {?} */
193
+ var clientWidth = this.el.clientWidth;
194
+ /** @type {?} */
195
+ var offsetWidth = this.el.offsetWidth;
196
+ /** @type {?} */
197
+ var scrollWidth = this.el.scrollWidth;
198
+ /** @type {?} */
199
+ var clientHeight = this.el.clientHeight;
200
+ /** @type {?} */
201
+ var offsetHeight = this.el.offsetHeight;
202
+ /** @type {?} */
203
+ var scrollHeight = this.el.scrollHeight;
204
+ /** @type {?} */
205
+ var verticalScrollPresent = clientWidth < offsetWidth && scrollHeight > offsetHeight
206
+ && scrollHeight - offsetHeight < offsetWidth - clientWidth;
207
+ /** @type {?} */
208
+ var horizontalScrollPresent = clientHeight < offsetHeight
209
+ && scrollWidth > offsetWidth && scrollWidth - offsetWidth < offsetHeight - clientHeight;
210
+ if (verticalScrollPresent) {
211
+ return false;
212
+ }
213
+ return !horizontalScrollPresent;
214
+ };
215
+ /**
216
+ * @return {?}
217
+ */
218
+ GridsterComponent.prototype.setGridSize = /**
219
+ * @return {?}
220
+ */
221
+ function () {
222
+ /** @type {?} */
223
+ var el = this.el;
224
+ /** @type {?} */
225
+ var width = el.clientWidth;
226
+ /** @type {?} */
227
+ var height = el.clientHeight;
228
+ if (this.$options.setGridSize || this.$options.gridType === 'fit' && !this.mobile) {
229
+ width = el.offsetWidth;
230
+ height = el.offsetHeight;
231
+ }
232
+ else {
233
+ width = el.clientWidth;
234
+ height = el.clientHeight;
235
+ }
236
+ this.curWidth = width;
237
+ this.curHeight = height;
238
+ };
239
+ /**
240
+ * @return {?}
241
+ */
242
+ GridsterComponent.prototype.setGridDimensions = /**
243
+ * @return {?}
244
+ */
245
+ function () {
246
+ this.setGridSize();
247
+ if (!this.mobile && this.$options.mobileBreakpoint > this.curWidth) {
248
+ this.mobile = !this.mobile;
249
+ this.renderer.addClass(this.el, 'mobile');
250
+ }
251
+ else if (this.mobile && this.$options.mobileBreakpoint < this.curWidth) {
252
+ this.mobile = !this.mobile;
253
+ this.renderer.removeClass(this.el, 'mobile');
254
+ }
255
+ /** @type {?} */
256
+ var rows = this.$options.minRows;
257
+ /** @type {?} */
258
+ var columns = this.$options.minCols;
259
+ /** @type {?} */
260
+ var widgetsIndex = this.grid.length - 1;
261
+ /** @type {?} */
262
+ var widget;
263
+ for (; widgetsIndex >= 0; widgetsIndex--) {
264
+ widget = this.grid[widgetsIndex];
265
+ if (!widget.notPlaced) {
266
+ rows = Math.max(rows, widget.$item.y + widget.$item.rows);
267
+ columns = Math.max(columns, widget.$item.x + widget.$item.cols);
268
+ }
269
+ }
270
+ if (this.columns !== columns || this.rows !== rows) {
271
+ this.columns = columns;
272
+ this.rows = rows;
273
+ if (this.options.gridSizeChangedCallback) {
274
+ this.options.gridSizeChangedCallback(this);
275
+ }
276
+ }
277
+ };
278
+ /**
279
+ * @return {?}
280
+ */
281
+ GridsterComponent.prototype.calculateLayout = /**
282
+ * @return {?}
283
+ */
284
+ function () {
285
+ if (this.compact) {
286
+ this.compact.checkCompact();
287
+ }
288
+ this.setGridDimensions();
289
+ if (this.$options.outerMargin) {
290
+ /** @type {?} */
291
+ var marginWidth = -this.$options.margin;
292
+ if (this.$options.outerMarginLeft !== null) {
293
+ marginWidth += this.$options.outerMarginLeft;
294
+ this.renderer.setStyle(this.el, 'padding-left', this.$options.outerMarginLeft + 'px');
295
+ }
296
+ else {
297
+ marginWidth += this.$options.margin;
298
+ this.renderer.setStyle(this.el, 'padding-left', this.$options.margin + 'px');
299
+ }
300
+ if (this.$options.outerMarginRight !== null) {
301
+ marginWidth += this.$options.outerMarginRight;
302
+ this.renderer.setStyle(this.el, 'padding-right', this.$options.outerMarginRight + 'px');
303
+ }
304
+ else {
305
+ marginWidth += this.$options.margin;
306
+ this.renderer.setStyle(this.el, 'padding-right', this.$options.margin + 'px');
307
+ }
308
+ this.curColWidth = (this.curWidth - marginWidth) / this.columns;
309
+ /** @type {?} */
310
+ var marginHeight = -this.$options.margin;
311
+ if (this.$options.outerMarginTop !== null) {
312
+ marginHeight += this.$options.outerMarginTop;
313
+ this.renderer.setStyle(this.el, 'padding-top', this.$options.outerMarginTop + 'px');
314
+ }
315
+ else {
316
+ marginHeight += this.$options.margin;
317
+ this.renderer.setStyle(this.el, 'padding-top', this.$options.margin + 'px');
318
+ }
319
+ if (this.$options.outerMarginBottom !== null) {
320
+ marginHeight += this.$options.outerMarginBottom;
321
+ this.renderer.setStyle(this.el, 'padding-bottom', this.$options.outerMarginBottom + 'px');
322
+ }
323
+ else {
324
+ marginHeight += this.$options.margin;
325
+ this.renderer.setStyle(this.el, 'padding-bottom', this.$options.margin + 'px');
326
+ }
327
+ this.curRowHeight = (this.curHeight - marginHeight) / this.rows;
328
+ }
329
+ else {
330
+ this.curColWidth = (this.curWidth + this.$options.margin) / this.columns;
331
+ this.curRowHeight = (this.curHeight + this.$options.margin) / this.rows;
332
+ this.renderer.setStyle(this.el, 'padding-left', 0 + 'px');
333
+ this.renderer.setStyle(this.el, 'padding-right', 0 + 'px');
334
+ this.renderer.setStyle(this.el, 'padding-top', 0 + 'px');
335
+ this.renderer.setStyle(this.el, 'padding-bottom', 0 + 'px');
336
+ }
337
+ this.gridRenderer.updateGridster();
338
+ this.updateGrid();
339
+ if (this.$options.setGridSize) {
340
+ this.renderer.setStyle(this.el, 'width', (this.columns * this.curColWidth + this.$options.margin) + 'px');
341
+ this.renderer.setStyle(this.el, 'height', (this.rows * this.curRowHeight + this.$options.margin) + 'px');
342
+ }
343
+ else {
344
+ this.renderer.setStyle(this.el, 'width', '');
345
+ this.renderer.setStyle(this.el, 'height', '');
346
+ }
347
+ /** @type {?} */
348
+ var widgetsIndex = this.grid.length - 1;
349
+ /** @type {?} */
350
+ var widget;
351
+ for (; widgetsIndex >= 0; widgetsIndex--) {
352
+ widget = this.grid[widgetsIndex];
353
+ widget.setSize();
354
+ widget.drag.toggle();
355
+ widget.resize.toggle();
356
+ }
357
+ setTimeout(this.resize.bind(this), 100);
358
+ };
359
+ /**
360
+ * @return {?}
361
+ */
362
+ GridsterComponent.prototype.updateGrid = /**
363
+ * @return {?}
364
+ */
365
+ function () {
366
+ if (this.$options.displayGrid === 'always' && !this.mobile) {
367
+ this.renderer.addClass(this.el, 'display-grid');
368
+ }
369
+ else if (this.$options.displayGrid === 'onDrag&Resize' && this.dragInProgress) {
370
+ this.renderer.addClass(this.el, 'display-grid');
371
+ }
372
+ else if (this.$options.displayGrid === 'none' || !this.dragInProgress || this.mobile) {
373
+ this.renderer.removeClass(this.el, 'display-grid');
374
+ }
375
+ this.setGridDimensions();
376
+ this.gridColumns.length = Math.max(this.columns, Math.floor(this.curWidth / this.curColWidth)) || 0;
377
+ this.gridRows.length = Math.max(this.rows, Math.floor(this.curHeight / this.curRowHeight)) || 0;
378
+ this.cdRef.markForCheck();
379
+ };
380
+ /**
381
+ * @param {?} itemComponent
382
+ * @return {?}
383
+ */
384
+ GridsterComponent.prototype.addItem = /**
385
+ * @param {?} itemComponent
386
+ * @return {?}
387
+ */
388
+ function (itemComponent) {
389
+ if (itemComponent.$item.cols === undefined) {
390
+ itemComponent.$item.cols = this.$options.defaultItemCols;
391
+ itemComponent.item.cols = itemComponent.$item.cols;
392
+ itemComponent.itemChanged();
393
+ }
394
+ if (itemComponent.$item.rows === undefined) {
395
+ itemComponent.$item.rows = this.$options.defaultItemRows;
396
+ itemComponent.item.rows = itemComponent.$item.rows;
397
+ itemComponent.itemChanged();
398
+ }
399
+ if (itemComponent.$item.x === -1 || itemComponent.$item.y === -1) {
400
+ this.autoPositionItem(itemComponent);
401
+ }
402
+ else if (this.checkCollision(itemComponent.$item)) {
403
+ if (!this.$options.disableWarnings) {
404
+ itemComponent.notPlaced = true;
405
+ console.warn('Can\'t be placed in the bounds of the dashboard, trying to auto position!/n' +
406
+ JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));
407
+ }
408
+ if (!this.$options.disableAutoPositionOnConflict) {
409
+ this.autoPositionItem(itemComponent);
410
+ }
411
+ else {
412
+ itemComponent.notPlaced = true;
413
+ }
414
+ }
415
+ this.grid.push(itemComponent);
416
+ this.calculateLayoutDebounce();
417
+ };
418
+ /**
419
+ * @param {?} itemComponent
420
+ * @return {?}
421
+ */
422
+ GridsterComponent.prototype.removeItem = /**
423
+ * @param {?} itemComponent
424
+ * @return {?}
425
+ */
426
+ function (itemComponent) {
427
+ this.grid.splice(this.grid.indexOf(itemComponent), 1);
428
+ this.calculateLayoutDebounce();
429
+ if (this.options.itemRemovedCallback) {
430
+ this.options.itemRemovedCallback(itemComponent.item, itemComponent);
431
+ }
432
+ };
433
+ /**
434
+ * @param {?} item
435
+ * @return {?}
436
+ */
437
+ GridsterComponent.prototype.checkCollision = /**
438
+ * @param {?} item
439
+ * @return {?}
440
+ */
441
+ function (item) {
442
+ /** @type {?} */
443
+ var collision = false;
444
+ if (this.options.itemValidateCallback) {
445
+ collision = !this.options.itemValidateCallback(item);
446
+ }
447
+ if (!collision && this.checkGridCollision(item)) {
448
+ collision = true;
449
+ }
450
+ if (!collision) {
451
+ /** @type {?} */
452
+ var c = this.findItemWithItem(item);
453
+ if (c) {
454
+ collision = c;
455
+ }
456
+ }
457
+ return collision;
458
+ };
459
+ /**
460
+ * @param {?} item
461
+ * @return {?}
462
+ */
463
+ GridsterComponent.prototype.checkGridCollision = /**
464
+ * @param {?} item
465
+ * @return {?}
466
+ */
467
+ function (item) {
468
+ /** @type {?} */
469
+ var noNegativePosition = item.y > -1 && item.x > -1;
470
+ /** @type {?} */
471
+ var maxGridCols = item.cols + item.x <= this.$options.maxCols;
472
+ /** @type {?} */
473
+ var maxGridRows = item.rows + item.y <= this.$options.maxRows;
474
+ /** @type {?} */
475
+ var maxItemCols = item.maxItemCols === undefined ? this.$options.maxItemCols : item.maxItemCols;
476
+ /** @type {?} */
477
+ var minItemCols = item.minItemCols === undefined ? this.$options.minItemCols : item.minItemCols;
478
+ /** @type {?} */
479
+ var maxItemRows = item.maxItemRows === undefined ? this.$options.maxItemRows : item.maxItemRows;
480
+ /** @type {?} */
481
+ var minItemRows = item.minItemRows === undefined ? this.$options.minItemRows : item.minItemRows;
482
+ /** @type {?} */
483
+ var inColsLimits = item.cols <= maxItemCols && item.cols >= minItemCols;
484
+ /** @type {?} */
485
+ var inRowsLimits = item.rows <= maxItemRows && item.rows >= minItemRows;
486
+ /** @type {?} */
487
+ var minAreaLimit = item.minItemArea === undefined ? this.$options.minItemArea : item.minItemArea;
488
+ /** @type {?} */
489
+ var maxAreaLimit = item.maxItemArea === undefined ? this.$options.maxItemArea : item.maxItemArea;
490
+ /** @type {?} */
491
+ var area = item.cols * item.rows;
492
+ /** @type {?} */
493
+ var inMinArea = minAreaLimit <= area;
494
+ /** @type {?} */
495
+ var inMaxArea = maxAreaLimit >= area;
496
+ return !(noNegativePosition && maxGridCols && maxGridRows && inColsLimits && inRowsLimits && inMinArea && inMaxArea);
497
+ };
498
+ /**
499
+ * @param {?} item
500
+ * @return {?}
501
+ */
502
+ GridsterComponent.prototype.findItemWithItem = /**
503
+ * @param {?} item
504
+ * @return {?}
505
+ */
506
+ function (item) {
507
+ /** @type {?} */
508
+ var widgetsIndex = this.grid.length - 1;
509
+ /** @type {?} */
510
+ var widget;
511
+ for (; widgetsIndex > -1; widgetsIndex--) {
512
+ widget = this.grid[widgetsIndex];
513
+ if (widget.$item !== item && GridsterComponent.checkCollisionTwoItems(widget.$item, item)) {
514
+ return widget;
515
+ }
516
+ }
517
+ return false;
518
+ };
519
+ /**
520
+ * @param {?} item
521
+ * @return {?}
522
+ */
523
+ GridsterComponent.prototype.findItemsWithItem = /**
524
+ * @param {?} item
525
+ * @return {?}
526
+ */
527
+ function (item) {
528
+ /** @type {?} */
529
+ var a = [];
530
+ /** @type {?} */
531
+ var widgetsIndex = this.grid.length - 1;
532
+ /** @type {?} */
533
+ var widget;
534
+ for (; widgetsIndex > -1; widgetsIndex--) {
535
+ widget = this.grid[widgetsIndex];
536
+ if (widget.$item !== item && GridsterComponent.checkCollisionTwoItems(widget.$item, item)) {
537
+ a.push(widget);
538
+ }
539
+ }
540
+ return a;
541
+ };
542
+ /**
543
+ * @param {?} itemComponent
544
+ * @return {?}
545
+ */
546
+ GridsterComponent.prototype.autoPositionItem = /**
547
+ * @param {?} itemComponent
548
+ * @return {?}
549
+ */
550
+ function (itemComponent) {
551
+ if (this.getNextPossiblePosition(itemComponent.$item)) {
552
+ itemComponent.notPlaced = false;
553
+ itemComponent.item.x = itemComponent.$item.x;
554
+ itemComponent.item.y = itemComponent.$item.y;
555
+ itemComponent.itemChanged();
556
+ }
557
+ else {
558
+ itemComponent.notPlaced = true;
559
+ if (!this.$options.disableWarnings) {
560
+ console.warn('Can\'t be placed in the bounds of the dashboard!/n' +
561
+ JSON.stringify(itemComponent.item, ['cols', 'rows', 'x', 'y']));
562
+ }
563
+ }
564
+ };
565
+ /**
566
+ * @param {?} newItem
567
+ * @param {?=} startingFrom
568
+ * @return {?}
569
+ */
570
+ GridsterComponent.prototype.getNextPossiblePosition = /**
571
+ * @param {?} newItem
572
+ * @param {?=} startingFrom
573
+ * @return {?}
574
+ */
575
+ function (newItem, startingFrom) {
576
+ if (startingFrom === void 0) { startingFrom = {}; }
577
+ if (newItem.cols === -1) {
578
+ newItem.cols = this.$options.defaultItemCols;
579
+ }
580
+ if (newItem.rows === -1) {
581
+ newItem.rows = this.$options.defaultItemRows;
582
+ }
583
+ this.setGridDimensions();
584
+ /** @type {?} */
585
+ var rowsIndex = startingFrom.y || 0;
586
+ /** @type {?} */
587
+ var colsIndex;
588
+ for (; rowsIndex < this.rows; rowsIndex++) {
589
+ newItem.y = rowsIndex;
590
+ colsIndex = startingFrom.x || 0;
591
+ for (; colsIndex < this.columns; colsIndex++) {
592
+ newItem.x = colsIndex;
593
+ if (!this.checkCollision(newItem)) {
594
+ return true;
595
+ }
596
+ }
597
+ }
598
+ /** @type {?} */
599
+ var canAddToRows = this.$options.maxRows >= this.rows + newItem.rows;
600
+ /** @type {?} */
601
+ var canAddToColumns = this.$options.maxCols >= this.columns + newItem.cols;
602
+ /** @type {?} */
603
+ var addToRows = this.rows <= this.columns && canAddToRows;
604
+ if (!addToRows && canAddToColumns) {
605
+ newItem.x = this.columns;
606
+ newItem.y = 0;
607
+ return true;
608
+ }
609
+ else if (canAddToRows) {
610
+ newItem.y = this.rows;
611
+ newItem.x = 0;
612
+ return true;
613
+ }
614
+ return false;
615
+ };
616
+ /**
617
+ * @param {?} item
618
+ * @return {?}
619
+ */
620
+ GridsterComponent.prototype.getFirstPossiblePosition = /**
621
+ * @param {?} item
622
+ * @return {?}
623
+ */
624
+ function (item) {
625
+ /** @type {?} */
626
+ var tmpItem = Object.assign({}, item);
627
+ this.getNextPossiblePosition(tmpItem);
628
+ return tmpItem;
629
+ };
630
+ /**
631
+ * @param {?} item
632
+ * @return {?}
633
+ */
634
+ GridsterComponent.prototype.getLastPossiblePosition = /**
635
+ * @param {?} item
636
+ * @return {?}
637
+ */
638
+ function (item) {
639
+ /** @type {?} */
640
+ var farthestItem = { y: 0, x: 0 };
641
+ farthestItem = this.grid.reduce((/**
642
+ * @param {?} prev
643
+ * @param {?} curr
644
+ * @return {?}
645
+ */
646
+ function (prev, curr) {
647
+ /** @type {?} */
648
+ var currCoords = { y: curr.$item.y + curr.$item.rows - 1, x: curr.$item.x + curr.$item.cols - 1 };
649
+ if (GridsterUtils.compareItems(prev, currCoords) === 1) {
650
+ return currCoords;
651
+ }
652
+ else {
653
+ return prev;
654
+ }
655
+ }), farthestItem);
656
+ /** @type {?} */
657
+ var tmpItem = Object.assign({}, item);
658
+ this.getNextPossiblePosition(tmpItem, farthestItem);
659
+ return tmpItem;
660
+ };
661
+ /**
662
+ * @param {?} x
663
+ * @param {?} roundingMethod
664
+ * @param {?=} noLimit
665
+ * @return {?}
666
+ */
667
+ GridsterComponent.prototype.pixelsToPositionX = /**
668
+ * @param {?} x
669
+ * @param {?} roundingMethod
670
+ * @param {?=} noLimit
671
+ * @return {?}
672
+ */
673
+ function (x, roundingMethod, noLimit) {
674
+ /** @type {?} */
675
+ var position = roundingMethod(x / this.curColWidth);
676
+ if (noLimit) {
677
+ return position;
678
+ }
679
+ else {
680
+ return Math.max(position, 0);
681
+ }
682
+ };
683
+ /**
684
+ * @param {?} y
685
+ * @param {?} roundingMethod
686
+ * @param {?=} noLimit
687
+ * @return {?}
688
+ */
689
+ GridsterComponent.prototype.pixelsToPositionY = /**
690
+ * @param {?} y
691
+ * @param {?} roundingMethod
692
+ * @param {?=} noLimit
693
+ * @return {?}
694
+ */
695
+ function (y, roundingMethod, noLimit) {
696
+ /** @type {?} */
697
+ var position = roundingMethod(y / this.curRowHeight);
698
+ if (noLimit) {
699
+ return position;
700
+ }
701
+ else {
702
+ return Math.max(position, 0);
703
+ }
704
+ };
705
+ /**
706
+ * @param {?} x
707
+ * @return {?}
708
+ */
709
+ GridsterComponent.prototype.positionXToPixels = /**
710
+ * @param {?} x
711
+ * @return {?}
712
+ */
713
+ function (x) {
714
+ return x * this.curColWidth;
715
+ };
716
+ /**
717
+ * @param {?} y
718
+ * @return {?}
719
+ */
720
+ GridsterComponent.prototype.positionYToPixels = /**
721
+ * @param {?} y
722
+ * @return {?}
723
+ */
724
+ function (y) {
725
+ return y * this.curRowHeight;
726
+ };
727
+ GridsterComponent.decorators = [
728
+ { type: Component, args: [{
729
+ selector: 'gridster',
730
+ template: "<div class=\"gridster-column\" *ngFor=\"let column of gridColumns; let i = index;\"\r\n [ngStyle]=\"gridRenderer.getGridColumnStyle(i)\"></div>\r\n<div class=\"gridster-row\" *ngFor=\"let row of gridRows; let i = index;\"\r\n [ngStyle]=\"gridRenderer.getGridRowStyle(i)\"></div>\r\n<ng-content></ng-content>\r\n<gridster-preview class=\"gridster-preview\"></gridster-preview>\r\n",
731
+ encapsulation: ViewEncapsulation.None,
732
+ styles: ["gridster{clear:both;position:relative;box-sizing:border-box;background:grey;width:100%;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;overflow:auto}gridster.fit{overflow-x:hidden;overflow-y:hidden}gridster.scrollVertical{overflow-x:hidden;overflow-y:auto}gridster.scrollHorizontal{overflow-x:auto;overflow-y:hidden}gridster.fixed{overflow:auto}gridster.mobile{overflow-x:hidden;overflow-y:auto}gridster.mobile gridster-item{position:relative}gridster .gridster-column,gridster .gridster-row{position:absolute;display:none;transition:.3s;box-sizing:border-box}gridster.display-grid .gridster-column,gridster.display-grid .gridster-row{display:block}gridster .gridster-column{border-left:1px solid #ccc;border-right:1px solid #ccc}gridster .gridster-row{border-top:1px solid #ccc;border-bottom:1px solid #ccc}"]
733
+ }] }
734
+ ];
735
+ /** @nocollapse */
736
+ GridsterComponent.ctorParameters = function () { return [
737
+ { type: ElementRef },
738
+ { type: Renderer2 },
739
+ { type: ChangeDetectorRef },
740
+ { type: NgZone }
741
+ ]; };
742
+ GridsterComponent.propDecorators = {
743
+ options: [{ type: Input }]
744
+ };
745
+ return GridsterComponent;
746
+ }());
747
+ export { GridsterComponent };
748
+ if (false) {
749
+ /** @type {?} */
750
+ GridsterComponent.prototype.options;
751
+ /** @type {?} */
752
+ GridsterComponent.prototype.calculateLayoutDebounce;
753
+ /** @type {?} */
754
+ GridsterComponent.prototype.movingItem;
755
+ /** @type {?} */
756
+ GridsterComponent.prototype.previewStyle;
757
+ /** @type {?} */
758
+ GridsterComponent.prototype.el;
759
+ /** @type {?} */
760
+ GridsterComponent.prototype.$options;
761
+ /** @type {?} */
762
+ GridsterComponent.prototype.mobile;
763
+ /** @type {?} */
764
+ GridsterComponent.prototype.curWidth;
765
+ /** @type {?} */
766
+ GridsterComponent.prototype.curHeight;
767
+ /** @type {?} */
768
+ GridsterComponent.prototype.grid;
769
+ /** @type {?} */
770
+ GridsterComponent.prototype.columns;
771
+ /** @type {?} */
772
+ GridsterComponent.prototype.rows;
773
+ /** @type {?} */
774
+ GridsterComponent.prototype.curColWidth;
775
+ /** @type {?} */
776
+ GridsterComponent.prototype.curRowHeight;
777
+ /** @type {?} */
778
+ GridsterComponent.prototype.gridColumns;
779
+ /** @type {?} */
780
+ GridsterComponent.prototype.gridRows;
781
+ /** @type {?} */
782
+ GridsterComponent.prototype.windowResize;
783
+ /** @type {?} */
784
+ GridsterComponent.prototype.dragInProgress;
785
+ /** @type {?} */
786
+ GridsterComponent.prototype.emptyCell;
787
+ /** @type {?} */
788
+ GridsterComponent.prototype.compact;
789
+ /** @type {?} */
790
+ GridsterComponent.prototype.gridRenderer;
791
+ /** @type {?} */
792
+ GridsterComponent.prototype.renderer;
793
+ /** @type {?} */
794
+ GridsterComponent.prototype.cdRef;
795
+ /** @type {?} */
796
+ GridsterComponent.prototype.zone;
797
+ }
798
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNjaG5laWRlcmVzcy9kYXNoYm9hcmRmcmFtZXdvcmsvIiwic291cmNlcyI6WyJncmlkc3Rlci9saWIvZ3JpZHN0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFJTixTQUFTLEVBRVQsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBRWhFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFJMUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFHNUQ7SUE2QkUsMkJBQVksRUFBYyxFQUFTLFFBQW1CLEVBQVMsS0FBd0IsRUFBUyxJQUFZO1FBQXpFLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUFTLFNBQUksR0FBSixJQUFJLENBQVE7UUFSNUcsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQVFaLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLHVCQUF1QixHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFB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QUNkLHlDQUFrQzs7SUFDbEMsMkNBQXdCOztJQUN4QixzQ0FBNkI7O0lBQzdCLG9DQUF5Qjs7SUFDekIseUNBQStCOztJQUVILHFDQUEwQjs7SUFBRSxrQ0FBK0I7O0lBQUUsaUNBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbnB1dCxcclxuICBOZ1pvbmUsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb25cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7R3JpZHN0ZXJDb25maWdTZXJ2aWNlfSBmcm9tICcuL2dyaWRzdGVyQ29uZmlnLmNvbnN0YW50JztcclxuaW1wb3J0IHtHcmlkc3RlckNvbmZpZ30gZnJvbSAnLi9ncmlkc3RlckNvbmZpZy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge0dyaWRzdGVyVXRpbHN9IGZyb20gJy4vZ3JpZHN0ZXJVdGlscy5zZXJ2aWNlJztcclxuaW1wb3J0IHtHcmlkc3RlckVtcHR5Q2VsbH0gZnJvbSAnLi9ncmlkc3RlckVtcHR5Q2VsbC5zZXJ2aWNlJztcclxuaW1wb3J0IHtHcmlkc3RlckNvbXBhY3R9IGZyb20gJy4vZ3JpZHN0ZXJDb21wYWN0LnNlcnZpY2UnO1xyXG5pbXBvcnQge0dyaWRzdGVyQ29uZmlnU30gZnJvbSAnLi9ncmlkc3RlckNvbmZpZ1MuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtHcmlkc3RlckNvbXBvbmVudEludGVyZmFjZX0gZnJvbSAnLi9ncmlkc3Rlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge0dyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZX0gZnJvbSAnLi9ncmlkc3Rlckl0ZW1Db21wb25lbnQuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtHcmlkc3RlclJlbmRlcmVyfSBmcm9tICcuL2dyaWRzdGVyUmVuZGVyZXIuc2VydmljZSc7XHJcbmltcG9ydCB7R3JpZHN0ZXJJdGVtfSBmcm9tICcuL2dyaWRzdGVySXRlbS5pbnRlcmZhY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdncmlkc3RlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2dyaWRzdGVyLmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2dyaWRzdGVyLmNzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcclxufSlcclxuZXhwb3J0IGNsYXNzIEdyaWRzdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgR3JpZHN0ZXJDb21wb25lbnRJbnRlcmZhY2Uge1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IEdyaWRzdGVyQ29uZmlnO1xyXG4gIGNhbGN1bGF0ZUxheW91dERlYm91bmNlOiAoKSA9PiB2b2lkO1xyXG4gIG1vdmluZ0l0ZW06IEdyaWRzdGVySXRlbSB8IG51bGw7XHJcbiAgcHJldmlld1N0eWxlOiAoKSA9PiB2b2lkO1xyXG4gIGVsOiBhbnk7XHJcbiAgJG9wdGlvbnM6IEdyaWRzdGVyQ29uZmlnUztcclxuICBtb2JpbGU6IGJvb2xlYW47XHJcbiAgY3VyV2lkdGg6IG51bWJlcjtcclxuICBjdXJIZWlnaHQ6IG51bWJlcjtcclxuICBncmlkOiBBcnJheTxHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U+O1xyXG4gIGNvbHVtbnM6IG51bWJlcjtcclxuICByb3dzOiBudW1iZXI7XHJcbiAgY3VyQ29sV2lkdGg6IG51bWJlcjtcclxuICBjdXJSb3dIZWlnaHQ6IG51bWJlcjtcclxuICBncmlkQ29sdW1ucyA9IFtdO1xyXG4gIGdyaWRSb3dzID0gW107XHJcbiAgd2luZG93UmVzaXplOiAoKCkgPT4gdm9pZCkgfCBudWxsO1xyXG4gIGRyYWdJblByb2dyZXNzOiBib29sZWFuO1xyXG4gIGVtcHR5Q2VsbDogR3JpZHN0ZXJFbXB0eUNlbGw7XHJcbiAgY29tcGFjdDogR3JpZHN0ZXJDb21wYWN0O1xyXG4gIGdyaWRSZW5kZXJlcjogR3JpZHN0ZXJSZW5kZXJlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoZWw6IEVsZW1lbnRSZWYsIHB1YmxpYyByZW5kZXJlcjogUmVuZGVyZXIyLCBwdWJsaWMgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLCBwdWJsaWMgem9uZTogTmdab25lKSB7XHJcbiAgICB0aGlzLmVsID0gZWwubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuJG9wdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEdyaWRzdGVyQ29uZmlnU2VydmljZSkpO1xyXG4gICAgdGhpcy5jYWxjdWxhdGVMYXlvdXREZWJvdW5jZSA9IEdyaWRzdGVyVXRpbHMuZGVib3VuY2UodGhpcy5jYWxjdWxhdGVMYXlvdXQuYmluZCh0aGlzKSwgMCk7XHJcbiAgICB0aGlzLm1vYmlsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5jdXJXaWR0aCA9IDA7XHJcbiAgICB0aGlzLmN1ckhlaWdodCA9IDA7XHJcbiAgICB0aGlzLmdyaWQgPSBbXTtcclxuICAgIHRoaXMuY3VyQ29sV2lkdGggPSAwO1xyXG4gICAgdGhpcy5jdXJSb3dIZWlnaHQgPSAwO1xyXG4gICAgdGhpcy5kcmFnSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgdGhpcy5lbXB0eUNlbGwgPSBuZXcgR3JpZHN0ZXJFbXB0eUNlbGwodGhpcyk7XHJcbiAgICB0aGlzLmNvbXBhY3QgPSBuZXcgR3JpZHN0ZXJDb21wYWN0KHRoaXMpO1xyXG4gICAgdGhpcy5ncmlkUmVuZGVyZXIgPSBuZXcgR3JpZHN0ZXJSZW5kZXJlcih0aGlzKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjaGVja0NvbGxpc2lvblR3b0l0ZW1zKGl0ZW06IEdyaWRzdGVySXRlbSwgaXRlbTI6IEdyaWRzdGVySXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGl0ZW0ueCA8IGl0ZW0yLnggKyBpdGVtMi5jb2xzXHJcbiAgICAgICYmIGl0ZW0ueCArIGl0ZW0uY29scyA+IGl0ZW0yLnhcclxuICAgICAgJiYgaXRlbS55IDwgaXRlbTIueSArIGl0ZW0yLnJvd3NcclxuICAgICAgJiYgaXRlbS55ICsgaXRlbS5yb3dzID4gaXRlbTIueTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQgeyAgIFxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pbml0Q2FsbGJhY2spIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmluaXRDYWxsYmFjayh0aGlzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLm9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5zZXRPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hcGkgPSB7XHJcbiAgICAgICAgb3B0aW9uc0NoYW5nZWQ6IHRoaXMub3B0aW9uc0NoYW5nZWQuYmluZCh0aGlzKSxcclxuICAgICAgICByZXNpemU6IHRoaXMub25SZXNpemUuYmluZCh0aGlzKSxcclxuICAgICAgICBnZXROZXh0UG9zc2libGVQb3NpdGlvbjogdGhpcy5nZXROZXh0UG9zc2libGVQb3NpdGlvbi5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGdldEZpcnN0UG9zc2libGVQb3NpdGlvbjogdGhpcy5nZXRGaXJzdFBvc3NpYmxlUG9zaXRpb24uYmluZCh0aGlzKSxcclxuICAgICAgICBnZXRMYXN0UG9zc2libGVQb3NpdGlvbjogdGhpcy5nZXRMYXN0UG9zc2libGVQb3NpdGlvbi5iaW5kKHRoaXMpLFxyXG4gICAgICAgIGdldEN1cnJlbnRSb3dIZWlnaHQ6dGhpcy5nZXRDdXJyZW50Um93SGVpZ2h0LmJpbmQodGhpcylcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy4kb3B0aW9ucy5taW5Db2xzO1xyXG4gICAgICB0aGlzLnJvd3MgPSB0aGlzLiRvcHRpb25zLm1pblJvd3M7XHJcbiAgICAgIHRoaXMuc2V0R3JpZFNpemUoKTtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVMYXlvdXQoKTtcclxuICAgIH1cclxuICB9XHJcbiBcclxuICBnZXRDdXJyZW50Um93SGVpZ2h0KCk6bnVtYmVye1xyXG4gICAgcmV0dXJuIHRoaXMuY3VyUm93SGVpZ2h0O1xyXG4gIH1cclxuXHJcbiAgcmVzaXplKCk6IHZvaWQgeyAgICAgXHJcbiAgICBsZXQgaGVpZ2h0O1xyXG4gICAgbGV0IHdpZHRoO1xyXG4gICAgaWYgKHRoaXMuJG9wdGlvbnMuZ3JpZFR5cGUgPT09ICdmaXQnICYmICF0aGlzLm1vYmlsZSkge1xyXG4gICAgICB3aWR0aCA9IHRoaXMuZWwub2Zmc2V0V2lkdGg7XHJcbiAgICAgIGhlaWdodCA9IHRoaXMuZWwub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgd2lkdGggPSB0aGlzLmVsLmNsaWVudFdpZHRoO1xyXG4gICAgICBoZWlnaHQgPSB0aGlzLmVsLmNsaWVudEhlaWdodDtcclxuICAgIH1cclxuICAgIGlmICgod2lkdGggIT09IHRoaXMuY3VyV2lkdGggfHwgaGVpZ2h0ICE9PSB0aGlzLmN1ckhlaWdodCkgJiYgdGhpcy5jaGVja0lmVG9SZXNpemUoKSkge1xyXG4gICAgICB0aGlzLm9uUmVzaXplKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRPcHRpb25zKCk6IHZvaWQge1xyXG4gICAgdGhpcy4kb3B0aW9ucyA9IEdyaWRzdGVyVXRpbHMubWVyZ2UodGhpcy4kb3B0aW9ucywgdGhpcy5vcHRpb25zLCB0aGlzLiRvcHRpb25zKTtcclxuICAgIGlmICghdGhpcy4kb3B0aW9ucy5kaXNhYmxlV2luZG93UmVzaXplICYmICF0aGlzLndpbmRvd1Jlc2l6ZSkge1xyXG4gICAgICB0aGlzLndpbmRvd1Jlc2l6ZSA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCd3aW5kb3cnLCAncmVzaXplJywgdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMpKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy4kb3B0aW9ucy5kaXNhYmxlV2luZG93UmVzaXplICYmIHRoaXMud2luZG93UmVzaXplKSB7XHJcbiAgICAgIHRoaXMud2luZG93UmVzaXplKCk7XHJcbiAgICAgIHRoaXMud2luZG93UmVzaXplID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuZW1wdHlDZWxsLnVwZGF0ZU9wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIG9wdGlvbnNDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRPcHRpb25zKCk7XHJcbiAgICBsZXQgd2lkZ2V0c0luZGV4OiBudW1iZXIgPSB0aGlzLmdyaWQubGVuZ3RoIC0gMSwgd2lkZ2V0OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XHJcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4ID49IDA7IHdpZGdldHNJbmRleC0tKSB7XHJcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xyXG4gICAgICB3aWRnZXQudXBkYXRlT3B0aW9ucygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYWxjdWxhdGVMYXlvdXQoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMud2luZG93UmVzaXplKSB7XHJcbiAgICAgIHRoaXMud2luZG93UmVzaXplKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmRlc3Ryb3lDYWxsYmFjaykge1xyXG4gICAgICB0aGlzLm9wdGlvbnMuZGVzdHJveUNhbGxiYWNrKHRoaXMpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hcGkpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmFwaS5yZXNpemUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hcGkub3B0aW9uc0NoYW5nZWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hcGkuZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5hcGkgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmVtcHR5Q2VsbC5kZXN0cm95KCk7XHJcbiAgICBkZWxldGUgdGhpcy5lbXB0eUNlbGw7XHJcbiAgICB0aGlzLmNvbXBhY3QuZGVzdHJveSgpO1xyXG4gICAgZGVsZXRlIHRoaXMuY29tcGFjdDtcclxuICB9XHJcblxyXG4gIG9uUmVzaXplKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRHcmlkU2l6ZSgpO1xyXG4gICAgdGhpcy5jYWxjdWxhdGVMYXlvdXQoKTtcclxuICB9XHJcblxyXG4gIGNoZWNrSWZUb1Jlc2l6ZSgpOiBib29sZWFuIHsgICBcclxuICAgIGNvbnN0IGNsaWVudFdpZHRoID0gdGhpcy5lbC5jbGllbnRXaWR0aDtcclxuICAgIGNvbnN0IG9mZnNldFdpZHRoID0gdGhpcy5lbC5vZmZzZXRXaWR0aDtcclxuICAgIGNvbnN0IHNjcm9sbFdpZHRoID0gdGhpcy5lbC5zY3JvbGxXaWR0aDtcclxuICAgIGNvbnN0IGNsaWVudEhlaWdodCA9IHRoaXMuZWwuY2xpZW50SGVpZ2h0O1xyXG4gICAgY29uc3Qgb2Zmc2V0SGVpZ2h0ID0gdGhpcy5lbC5vZmZzZXRIZWlnaHQ7XHJcbiAgICBjb25zdCBzY3JvbGxIZWlnaHQgPSB0aGlzLmVsLnNjcm9sbEhlaWdodDtcclxuICAgIGNvbnN0IHZlcnRpY2FsU2Nyb2xsUHJlc2VudCA9IGNsaWVudFdpZHRoIDwgb2Zmc2V0V2lkdGggJiYgc2Nyb2xsSGVpZ2h0ID4gb2Zmc2V0SGVpZ2h0XHJcbiAgICAgICYmIHNjcm9sbEhlaWdodCAtIG9mZnNldEhlaWdodCA8IG9mZnNldFdpZHRoIC0gY2xpZW50V2lkdGg7XHJcbiAgICBjb25zdCBob3Jpem9udGFsU2Nyb2xsUHJlc2VudCA9IGNsaWVudEhlaWdodCA8IG9mZnNldEhlaWdodFxyXG4gICAgICAmJiBzY3JvbGxXaWR0aCA+IG9mZnNldFdpZHRoICYmIHNjcm9sbFdpZHRoIC0gb2Zmc2V0V2lkdGggPCBvZmZzZXRIZWlnaHQgLSBjbGllbnRIZWlnaHQ7XHJcbiAgICBpZiAodmVydGljYWxTY3JvbGxQcmVzZW50KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiAhaG9yaXpvbnRhbFNjcm9sbFByZXNlbnQ7XHJcbiAgfVxyXG5cclxuICBzZXRHcmlkU2l6ZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVsID0gdGhpcy5lbDtcclxuICAgIGxldCB3aWR0aCA9IGVsLmNsaWVudFdpZHRoO1xyXG4gICAgbGV0IGhlaWdodCA9IGVsLmNsaWVudEhlaWdodDtcclxuICAgIGlmICh0aGlzLiRvcHRpb25zLnNldEdyaWRTaXplIHx8IHRoaXMuJG9wdGlvbnMuZ3JpZFR5cGUgPT09ICdmaXQnICYmICF0aGlzLm1vYmlsZSkge1xyXG4gICAgICB3aWR0aCA9IGVsLm9mZnNldFdpZHRoO1xyXG4gICAgICBoZWlnaHQgPSBlbC5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB3aWR0aCA9IGVsLmNsaWVudFdpZHRoO1xyXG4gICAgICBoZWlnaHQgPSBlbC5jbGllbnRIZWlnaHQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmN1cldpZHRoID0gd2lkdGg7ICAgIFxyXG4gICAgdGhpcy5jdXJIZWlnaHQgPSBoZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBzZXRHcmlkRGltZW5zaW9ucygpOiB2b2lkIHsgICBcclxuICAgIHRoaXMuc2V0R3JpZFNpemUoKTtcclxuICAgIGlmICghdGhpcy5tb2JpbGUgJiYgdGhpcy4kb3B0aW9ucy5tb2JpbGVCcmVha3BvaW50ID4gdGhpcy5jdXJXaWR0aCkge1xyXG4gICAgICB0aGlzLm1vYmlsZSA9ICF0aGlzLm1vYmlsZTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLCAnbW9iaWxlJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9iaWxlICYmIHRoaXMuJG9wdGlvbnMubW9iaWxlQnJlYWtwb2ludCA8IHRoaXMuY3VyV2lkdGgpIHtcclxuICAgICAgdGhpcy5tb2JpbGUgPSAhdGhpcy5tb2JpbGU7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbCwgJ21vYmlsZScpO1xyXG4gICAgfVxyXG4gICAgbGV0IHJvd3MgPSB0aGlzLiRvcHRpb25zLm1pblJvd3MsIGNvbHVtbnMgPSB0aGlzLiRvcHRpb25zLm1pbkNvbHM7XHJcblxyXG4gICAgbGV0IHdpZGdldHNJbmRleCA9IHRoaXMuZ3JpZC5sZW5ndGggLSAxLCB3aWRnZXQ7XHJcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4ID49IDA7IHdpZGdldHNJbmRleC0tKSB7XHJcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xyXG4gICAgICBpZiAoIXdpZGdldC5ub3RQbGFjZWQpIHtcclxuICAgICAgICByb3dzID0gTWF0aC5tYXgocm93cywgd2lkZ2V0LiRpdGVtLnkgKyB3aWRnZXQuJGl0ZW0ucm93cyk7XHJcbiAgICAgICAgY29sdW1ucyA9IE1hdGgubWF4KGNvbHVtbnMsIHdpZGdldC4kaXRlbS54ICsgd2lkZ2V0LiRpdGVtLmNvbHMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29sdW1ucyAhPT0gY29sdW1ucyB8fCB0aGlzLnJvd3MgIT09IHJvd3MpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcclxuICAgICAgdGhpcy5yb3dzID0gcm93cztcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ncmlkU2l6ZUNoYW5nZWRDYWxsYmFjaykge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5ncmlkU2l6ZUNoYW5nZWRDYWxsYmFjayh0aGlzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlTGF5b3V0KCk6IHZvaWQgeyAgIFxyXG4gICAgaWYgKHRoaXMuY29tcGFjdCkge1xyXG4gICAgICB0aGlzLmNvbXBhY3QuY2hlY2tDb21wYWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRHcmlkRGltZW5zaW9ucygpO1xyXG4gICAgaWYgKHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW4pIHtcclxuICAgICAgbGV0IG1hcmdpbldpZHRoID0gLXRoaXMuJG9wdGlvbnMubWFyZ2luO1xyXG4gICAgICBpZiAodGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpbkxlZnQgIT09IG51bGwpIHtcclxuICAgICAgICBtYXJnaW5XaWR0aCArPSB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luTGVmdDtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLWxlZnQnLCB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luTGVmdCArICdweCcpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1hcmdpbldpZHRoICs9IHRoaXMuJG9wdGlvbnMubWFyZ2luO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctbGVmdCcsIHRoaXMuJG9wdGlvbnMubWFyZ2luICsgJ3B4Jyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5SaWdodCAhPT0gbnVsbCkge1xyXG4gICAgICAgIG1hcmdpbldpZHRoICs9IHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5SaWdodDtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLXJpZ2h0JywgdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpblJpZ2h0ICsgJ3B4Jyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbWFyZ2luV2lkdGggKz0gdGhpcy4kb3B0aW9ucy5tYXJnaW47XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1yaWdodCcsIHRoaXMuJG9wdGlvbnMubWFyZ2luICsgJ3B4Jyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jdXJDb2xXaWR0aCA9ICh0aGlzLmN1cldpZHRoIC0gbWFyZ2luV2lkdGgpIC8gdGhpcy5jb2x1bW5zO1xyXG4gICAgICBsZXQgbWFyZ2luSGVpZ2h0ID0gLXRoaXMuJG9wdGlvbnMubWFyZ2luO1xyXG4gICAgICBpZiAodGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpblRvcCAhPT0gbnVsbCkge1xyXG4gICAgICAgIG1hcmdpbkhlaWdodCArPSB0aGlzLiRvcHRpb25zLm91dGVyTWFyZ2luVG9wO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctdG9wJywgdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpblRvcCArICdweCcpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1hcmdpbkhlaWdodCArPSB0aGlzLiRvcHRpb25zLm1hcmdpbjtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLXRvcCcsIHRoaXMuJG9wdGlvbnMubWFyZ2luICsgJ3B4Jyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5Cb3R0b20gIT09IG51bGwpIHtcclxuICAgICAgICBtYXJnaW5IZWlnaHQgKz0gdGhpcy4kb3B0aW9ucy5vdXRlck1hcmdpbkJvdHRvbTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwYWRkaW5nLWJvdHRvbScsIHRoaXMuJG9wdGlvbnMub3V0ZXJNYXJnaW5Cb3R0b20gKyAncHgnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtYXJnaW5IZWlnaHQgKz0gdGhpcy4kb3B0aW9ucy5tYXJnaW47XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1ib3R0b20nLCB0aGlzLiRvcHRpb25zLm1hcmdpbiArICdweCcpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY3VyUm93SGVpZ2h0ID0gKHRoaXMuY3VySGVpZ2h0IC0gbWFyZ2luSGVpZ2h0KSAvIHRoaXMucm93cztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VyQ29sV2lkdGggPSAodGhpcy5jdXJXaWR0aCArIHRoaXMuJG9wdGlvbnMubWFyZ2luKSAvIHRoaXMuY29sdW1ucztcclxuICAgICAgdGhpcy5jdXJSb3dIZWlnaHQgPSAodGhpcy5jdXJIZWlnaHQgKyB0aGlzLiRvcHRpb25zLm1hcmdpbikgLyB0aGlzLnJvd3M7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctbGVmdCcsIDAgKyAncHgnKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy1yaWdodCcsIDAgKyAncHgnKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAncGFkZGluZy10b3AnLCAwICsgJ3B4Jyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ3BhZGRpbmctYm90dG9tJywgMCArICdweCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkUmVuZGVyZXIudXBkYXRlR3JpZHN0ZXIoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcclxuXHJcbiAgICBpZiAodGhpcy4kb3B0aW9ucy5zZXRHcmlkU2l6ZSkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICd3aWR0aCcsICh0aGlzLmNvbHVtbnMgKiB0aGlzLmN1ckNvbFdpZHRoICsgdGhpcy4kb3B0aW9ucy5tYXJnaW4pICsgJ3B4Jyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ2hlaWdodCcsICh0aGlzLnJvd3MgKiB0aGlzLmN1clJvd0hlaWdodCArIHRoaXMuJG9wdGlvbnMubWFyZ2luKSArICdweCcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLCAnd2lkdGgnLCAnJyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbCwgJ2hlaWdodCcsICcnKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgd2lkZ2V0c0luZGV4OiBudW1iZXIgPSB0aGlzLmdyaWQubGVuZ3RoIC0gMSwgd2lkZ2V0OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XHJcbiAgICBmb3IgKDsgd2lkZ2V0c0luZGV4ID49IDA7IHdpZGdldHNJbmRleC0tKSB7XHJcbiAgICAgIHdpZGdldCA9IHRoaXMuZ3JpZFt3aWRnZXRzSW5kZXhdO1xyXG4gICAgICB3aWRnZXQuc2V0U2l6ZSgpO1xyXG4gICAgICB3aWRnZXQuZHJhZy50b2dnbGUoKTtcclxuICAgICAgd2lkZ2V0LnJlc2l6ZS50b2dnbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KHRoaXMucmVzaXplLmJpbmQodGhpcyksIDEwMCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVHcmlkKCk6IHZvaWQgeyAgXHJcbiAgICBpZiAodGhpcy4kb3B0aW9ucy5kaXNwbGF5R3JpZCA9PT0gJ2Fsd2F5cycgJiYgIXRoaXMubW9iaWxlKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbCwgJ2Rpc3BsYXktZ3JpZCcpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLiRvcHRpb25zLmRpc3BsYXlHcmlkID09PSAnb25EcmFnJlJlc2l6ZScgJiYgdGhpcy5kcmFnSW5Qcm9ncmVzcykge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwsICdkaXNwbGF5LWdyaWQnKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy4kb3B0aW9ucy5kaXNwbGF5R3JpZCA9PT0gJ25vbmUnIHx8ICF0aGlzLmRyYWdJblByb2dyZXNzIHx8IHRoaXMubW9iaWxlKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbCwgJ2Rpc3BsYXktZ3JpZCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRHcmlkRGltZW5zaW9ucygpO1xyXG4gICAgdGhpcy5ncmlkQ29sdW1ucy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmNvbHVtbnMsIE1hdGguZmxvb3IodGhpcy5jdXJXaWR0aCAvIHRoaXMuY3VyQ29sV2lkdGgpKSB8fCAwO1xyXG4gICAgdGhpcy5ncmlkUm93cy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLnJvd3MsIE1hdGguZmxvb3IodGhpcy5jdXJIZWlnaHQgLyB0aGlzLmN1clJvd0hlaWdodCkpIHx8IDA7XHJcbiAgICB0aGlzLmNkUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgYWRkSXRlbShpdGVtQ29tcG9uZW50OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpOiB2b2lkIHsgICBcclxuICAgIGlmIChpdGVtQ29tcG9uZW50LiRpdGVtLmNvbHMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpdGVtQ29tcG9uZW50LiRpdGVtLmNvbHMgPSB0aGlzLiRvcHRpb25zLmRlZmF1bHRJdGVtQ29scztcclxuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtLmNvbHMgPSBpdGVtQ29tcG9uZW50LiRpdGVtLmNvbHM7XHJcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbUNoYW5nZWQoKTtcclxuICAgIH1cclxuICAgIGlmIChpdGVtQ29tcG9uZW50LiRpdGVtLnJvd3MgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpdGVtQ29tcG9uZW50LiRpdGVtLnJvd3MgPSB0aGlzLiRvcHRpb25zLmRlZmF1bHRJdGVtUm93cztcclxuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtLnJvd3MgPSBpdGVtQ29tcG9uZW50LiRpdGVtLnJvd3M7XHJcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbUNoYW5nZWQoKTtcclxuICAgIH1cclxuICAgIGlmIChpdGVtQ29tcG9uZW50LiRpdGVtLnggPT09IC0xIHx8IGl0ZW1Db21wb25lbnQuJGl0ZW0ueSA9PT0gLTEpIHtcclxuICAgICAgdGhpcy5hdXRvUG9zaXRpb25JdGVtKGl0ZW1Db21wb25lbnQpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrQ29sbGlzaW9uKGl0ZW1Db21wb25lbnQuJGl0ZW0pKSB7XHJcbiAgICAgIGlmICghdGhpcy4kb3B0aW9ucy5kaXNhYmxlV2FybmluZ3MpIHtcclxuICAgICAgICBpdGVtQ29tcG9uZW50Lm5vdFBsYWNlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdDYW5cXCd0IGJlIHBsYWNlZCBpbiB0aGUgYm91bmRzIG9mIHRoZSBkYXNoYm9hcmQsIHRyeWluZyB0byBhdXRvIHBvc2l0aW9uIS9uJyArXHJcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShpdGVtQ29tcG9uZW50Lml0ZW0sIFsnY29scycsICdyb3dzJywgJ3gnLCAneSddKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLiRvcHRpb25zLmRpc2FibGVBdXRvUG9zaXRpb25PbkNvbmZsaWN0KSB7XHJcbiAgICAgICAgdGhpcy5hdXRvUG9zaXRpb25JdGVtKGl0ZW1Db21wb25lbnQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGl0ZW1Db21wb25lbnQubm90UGxhY2VkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkLnB1c2goaXRlbUNvbXBvbmVudCk7XHJcbiAgICB0aGlzLmNhbGN1bGF0ZUxheW91dERlYm91bmNlKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVJdGVtKGl0ZW1Db21wb25lbnQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkLnNwbGljZSh0aGlzLmdyaWQuaW5kZXhPZihpdGVtQ29tcG9uZW50KSwgMSk7XHJcbiAgICB0aGlzLmNhbGN1bGF0ZUxheW91dERlYm91bmNlKCk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLml0ZW1SZW1vdmVkQ2FsbGJhY2spIHtcclxuICAgICAgdGhpcy5vcHRpb25zLml0ZW1SZW1vdmVkQ2FsbGJhY2soaXRlbUNvbXBvbmVudC5pdGVtLCBpdGVtQ29tcG9uZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoZWNrQ29sbGlzaW9uKGl0ZW06IEdyaWRzdGVySXRlbSk6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSB8IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNvbGxpc2lvbjogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pdGVtVmFsaWRhdGVDYWxsYmFjaykge1xyXG4gICAgICBjb2xsaXNpb24gPSAhdGhpcy5vcHRpb25zLml0ZW1WYWxpZGF0ZUNhbGxiYWNrKGl0ZW0pO1xyXG4gICAgfVxyXG4gICAgaWYgKCFjb2xsaXNpb24gJiYgdGhpcy5jaGVja0dyaWRDb2xsaXNpb24oaXRlbSkpIHtcclxuICAgICAgY29sbGlzaW9uID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICghY29sbGlzaW9uKSB7XHJcbiAgICAgIGNvbnN0IGMgPSB0aGlzLmZpbmRJdGVtV2l0aEl0ZW0oaXRlbSk7XHJcbiAgICAgIGlmIChjKSB7XHJcbiAgICAgICAgY29sbGlzaW9uID0gYztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbGxpc2lvbjtcclxuICB9XHJcblxyXG4gIGNoZWNrR3JpZENvbGxpc2lvbihpdGVtOiBHcmlkc3Rlckl0ZW0pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG5vTmVnYXRpdmVQb3NpdGlvbiA9IGl0ZW0ueSA+IC0xICYmIGl0ZW0ueCA+IC0xO1xyXG4gICAgY29uc3QgbWF4R3JpZENvbHMgPSBpdGVtLmNvbHMgKyBpdGVtLnggPD0gdGhpcy4kb3B0aW9ucy5tYXhDb2xzO1xyXG4gICAgY29uc3QgbWF4R3JpZFJvd3MgPSBpdGVtLnJvd3MgKyBpdGVtLnkgPD0gdGhpcy4kb3B0aW9ucy5tYXhSb3dzO1xyXG4gICAgY29uc3QgbWF4SXRlbUNvbHMgPSBpdGVtLm1heEl0ZW1Db2xzID09PSB1bmRlZmluZWQgPyB0aGlzLiRvcHRpb25zLm1heEl0ZW1Db2xzIDogaXRlbS5tYXhJdGVtQ29scztcclxuICAgIGNvbnN0IG1pbkl0ZW1Db2xzID0gaXRlbS5taW5JdGVtQ29scyA9PT0gdW5kZWZpbmVkID8gdGhpcy4kb3B0aW9ucy5taW5JdGVtQ29scyA6IGl0ZW0ubWluSXRlbUNvbHM7XHJcbiAgICBjb25zdCBtYXhJdGVtUm93cyA9IGl0ZW0ubWF4SXRlbVJvd3MgPT09IHVuZGVmaW5lZCA/IHRoaXMuJG9wdGlvbnMubWF4SXRlbVJvd3MgOiBpdGVtLm1heEl0ZW1Sb3dzO1xyXG4gICAgY29uc3QgbWluSXRlbVJvd3MgPSBpdGVtLm1pbkl0ZW1Sb3dzID09PSB1bmRlZmluZWQgPyB0aGlzLiRvcHRpb25zLm1pbkl0ZW1Sb3dzIDogaXRlbS5taW5JdGVtUm93cztcclxuICAgIGNvbnN0IGluQ29sc0xpbWl0cyA9IGl0ZW0uY29scyA8PSBtYXhJdGVtQ29scyAmJiBpdGVtLmNvbHMgPj0gbWluSXRlbUNvbHM7XHJcbiAgICBjb25zdCBpblJvd3NMaW1pdHMgPSBpdGVtLnJvd3MgPD0gbWF4SXRlbVJvd3MgJiYgaXRlbS5yb3dzID49IG1pbkl0ZW1Sb3dzO1xyXG4gICAgY29uc3QgbWluQXJlYUxpbWl0ID0gaXRlbS5taW5JdGVtQXJlYSA9PT0gdW5kZWZpbmVkID8gdGhpcy4kb3B0aW9ucy5taW5JdGVtQXJlYSA6IGl0ZW0ubWluSXRlbUFyZWE7XHJcbiAgICBjb25zdCBtYXhBcmVhTGltaXQgPSBpdGVtLm1heEl0ZW1BcmVhID09PSB1bmRlZmluZWQgPyB0aGlzLiRvcHRpb25zLm1heEl0ZW1BcmVhIDogaXRlbS5tYXhJdGVtQXJlYTtcclxuICAgIGNvbnN0IGFyZWEgPSBpdGVtLmNvbHMgKiBpdGVtLnJvd3M7XHJcbiAgICBjb25zdCBpbk1pbkFyZWEgPSBtaW5BcmVhTGltaXQgPD0gYXJlYTtcclxuICAgIGNvbnN0IGluTWF4QXJlYSA9IG1heEFyZWFMaW1pdCA+PSBhcmVhO1xyXG4gICAgcmV0dXJuICEobm9OZWdhdGl2ZVBvc2l0aW9uICYmIG1heEdyaWRDb2xzICYmIG1heEdyaWRSb3dzICYmIGluQ29sc0xpbWl0cyAmJiBpblJvd3NMaW1pdHMgJiYgaW5NaW5BcmVhICYmIGluTWF4QXJlYSk7XHJcbiAgfVxyXG5cclxuICBmaW5kSXRlbVdpdGhJdGVtKGl0ZW06IEdyaWRzdGVySXRlbSk6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSB8IGJvb2xlYW4ge1xyXG4gICAgbGV0IHdpZGdldHNJbmRleDogbnVtYmVyID0gdGhpcy5ncmlkLmxlbmd0aCAtIDEsIHdpZGdldDogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xyXG4gICAgZm9yICg7IHdpZGdldHNJbmRleCA+IC0xOyB3aWRnZXRzSW5kZXgtLSkge1xyXG4gICAgICB3aWRnZXQgPSB0aGlzLmdyaWRbd2lkZ2V0c0luZGV4XTtcclxuICAgICAgaWYgKHdpZGdldC4kaXRlbSAhPT0gaXRlbSAmJiBHcmlkc3RlckNvbXBvbmVudC5jaGVja0NvbGxpc2lvblR3b0l0ZW1zKHdpZGdldC4kaXRlbSwgaXRlbSkpIHtcclxuICAgICAgICByZXR1cm4gd2lkZ2V0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBmaW5kSXRlbXNXaXRoSXRlbShpdGVtOiBHcmlkc3Rlckl0ZW0pOiBBcnJheTxHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U+IHtcclxuICAgIGNvbnN0IGE6IEFycmF5PEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZT4gPSBbXTtcclxuICAgIGxldCB3aWRnZXRzSW5kZXg6IG51bWJlciA9IHRoaXMuZ3JpZC5sZW5ndGggLSAxLCB3aWRnZXQ6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZTtcclxuICAgIGZvciAoOyB3aWRnZXRzSW5kZXggPiAtMTsgd2lkZ2V0c0luZGV4LS0pIHtcclxuICAgICAgd2lkZ2V0ID0gdGhpcy5ncmlkW3dpZGdldHNJbmRleF07XHJcbiAgICAgIGlmICh3aWRnZXQuJGl0ZW0gIT09IGl0ZW0gJiYgR3JpZHN0ZXJDb21wb25lbnQuY2hlY2tDb2xsaXNpb25Ud29JdGVtcyh3aWRnZXQuJGl0ZW0sIGl0ZW0pKSB7XHJcbiAgICAgICAgYS5wdXNoKHdpZGdldCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBhO1xyXG4gIH1cclxuXHJcbiAgYXV0b1Bvc2l0aW9uSXRlbShpdGVtQ29tcG9uZW50OiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdldE5leHRQb3NzaWJsZVBvc2l0aW9uKGl0ZW1Db21wb25lbnQuJGl0ZW0pKSB7XHJcbiAgICAgIGl0ZW1Db21wb25lbnQubm90UGxhY2VkID0gZmFsc2U7XHJcbiAgICAgIGl0ZW1Db21wb25lbnQuaXRlbS54ID0gaXRlbUNvbXBvbmVudC4kaXRlbS54O1xyXG4gICAgICBpdGVtQ29tcG9uZW50Lml0ZW0ueSA9IGl0ZW1Db21wb25lbnQuJGl0ZW0ueTtcclxuICAgICAgaXRlbUNvbXBvbmVudC5pdGVtQ2hhbmdlZCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaXRlbUNvbXBvbmVudC5ub3RQbGFjZWQgPSB0cnVlO1xyXG4gICAgICBpZiAoIXRoaXMuJG9wdGlvbnMuZGlzYWJsZVdhcm5pbmdzKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdDYW5cXCd0IGJlIHBsYWNlZCBpbiB0aGUgYm91bmRzIG9mIHRoZSBkYXNoYm9hcmQhL24nICtcclxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGl0ZW1Db21wb25lbnQuaXRlbSwgWydjb2xzJywgJ3Jvd3MnLCAneCcsICd5J10pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24obmV3SXRlbTogR3JpZHN0ZXJJdGVtLCBzdGFydGluZ0Zyb206IHsgeT86IG51bWJlciwgeD86IG51bWJlciB9ID0ge30pOiBib29sZWFuIHtcclxuICAgIGlmIChuZXdJdGVtLmNvbHMgPT09IC0xKSB7XHJcbiAgICAgIG5ld0l0ZW0uY29scyA9IHRoaXMuJG9wdGlvbnMuZGVmYXVsdEl0ZW1Db2xzO1xyXG4gICAgfVxyXG4gICAgaWYgKG5ld0l0ZW0ucm93cyA9PT0gLTEpIHtcclxuICAgICAgbmV3SXRlbS5yb3dzID0gdGhpcy4kb3B0aW9ucy5kZWZhdWx0SXRlbVJvd3M7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEdyaWREaW1lbnNpb25zKCk7XHJcbiAgICBsZXQgcm93c0luZGV4ID0gc3RhcnRpbmdGcm9tLnkgfHwgMCwgY29sc0luZGV4O1xyXG4gICAgZm9yICg7IHJvd3NJbmRleCA8IHRoaXMucm93czsgcm93c0luZGV4KyspIHtcclxuICAgICAgbmV3SXRlbS55ID0gcm93c0luZGV4O1xyXG4gICAgICBjb2xzSW5kZXggPSBzdGFydGluZ0Zyb20ueCB8fCAwO1xyXG4gICAgICBmb3IgKDsgY29sc0luZGV4IDwgdGhpcy5jb2x1bW5zOyBjb2xzSW5kZXgrKykge1xyXG4gICAgICAgIG5ld0l0ZW0ueCA9IGNvbHNJbmRleDtcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tDb2xsaXNpb24obmV3SXRlbSkpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgY2FuQWRkVG9Sb3dzID0gdGhpcy4kb3B0aW9ucy5tYXhSb3dzID49IHRoaXMucm93cyArIG5ld0l0ZW0ucm93cztcclxuICAgIGNvbnN0IGNhbkFkZFRvQ29sdW1ucyA9IHRoaXMuJG9wdGlvbnMubWF4Q29scyA+PSB0aGlzLmNvbHVtbnMgKyBuZXdJdGVtLmNvbHM7XHJcbiAgICBjb25zdCBhZGRUb1Jvd3MgPSB0aGlzLnJvd3MgPD0gdGhpcy5jb2x1bW5zICYmIGNhbkFkZFRvUm93cztcclxuICAgIGlmICghYWRkVG9Sb3dzICYmIGNhbkFkZFRvQ29sdW1ucykge1xyXG4gICAgICBuZXdJdGVtLnggPSB0aGlzLmNvbHVtbnM7XHJcbiAgICAgIG5ld0l0ZW0ueSA9IDA7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChjYW5BZGRUb1Jvd3MpIHtcclxuICAgICAgbmV3SXRlbS55ID0gdGhpcy5yb3dzO1xyXG4gICAgICBuZXdJdGVtLnggPSAwO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldEZpcnN0UG9zc2libGVQb3NpdGlvbihpdGVtOiBHcmlkc3Rlckl0ZW0pOiBHcmlkc3Rlckl0ZW0ge1xyXG4gICAgY29uc3QgdG1wSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0pO1xyXG4gICAgdGhpcy5nZXROZXh0UG9zc2libGVQb3NpdGlvbih0bXBJdGVtKTtcclxuICAgIHJldHVybiB0bXBJdGVtO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGFzdFBvc3NpYmxlUG9zaXRpb24oaXRlbTogR3JpZHN0ZXJJdGVtKTogR3JpZHN0ZXJJdGVtIHtcclxuICAgIGxldCBmYXJ0aGVzdEl0ZW06IHsgeTogbnVtYmVyLCB4OiBudW1iZXIgfSA9IHt5OiAwLCB4OiAwfTtcclxuICAgIGZhcnRoZXN0SXRlbSA9IHRoaXMuZ3JpZC5yZWR1Y2UoKHByZXY6IGFueSwgY3VycjogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGN1cnJDb29yZHMgPSB7eTogY3Vyci4kaXRlbS55ICsgY3Vyci4kaXRlbS5yb3dzIC0gMSwgeDogY3Vyci4kaXRlbS54ICsgY3Vyci4kaXRlbS5jb2xzIC0gMX07XHJcbiAgICAgIGlmIChHcmlkc3RlclV0aWxzLmNvbXBhcmVJdGVtcyhwcmV2LCBjdXJyQ29vcmRzKSA9PT0gMSkge1xyXG4gICAgICAgIHJldHVybiBjdXJyQ29vcmRzO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBwcmV2O1xyXG4gICAgICB9XHJcbiAgICB9LCBmYXJ0aGVzdEl0ZW0pO1xyXG5cclxuICAgIGNvbnN0IHRtcEl0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCBpdGVtKTtcclxuICAgIHRoaXMuZ2V0TmV4dFBvc3NpYmxlUG9zaXRpb24odG1wSXRlbSwgZmFydGhlc3RJdGVtKTtcclxuICAgIHJldHVybiB0bXBJdGVtO1xyXG4gIH1cclxuXHJcbiAgcGl4ZWxzVG9Qb3NpdGlvblgoeDogbnVtYmVyLCByb3VuZGluZ01ldGhvZDogRnVuY3Rpb24sIG5vTGltaXQ/OiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gcm91bmRpbmdNZXRob2QoeCAvIHRoaXMuY3VyQ29sV2lkdGgpO1xyXG4gICAgaWYgKG5vTGltaXQpIHtcclxuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIE1hdGgubWF4KHBvc2l0aW9uLCAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBpeGVsc1RvUG9zaXRpb25ZKHk6IG51bWJlciwgcm91bmRpbmdNZXRob2Q6IEZ1bmN0aW9uLCBub0xpbWl0PzogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBjb25zdCBwb3NpdGlvbiA9IHJvdW5kaW5nTWV0aG9kKHkgLyB0aGlzLmN1clJvd0hlaWdodCk7XHJcbiAgICBpZiAobm9MaW1pdCkge1xyXG4gICAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gTWF0aC5tYXgocG9zaXRpb24sIDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcG9zaXRpb25YVG9QaXhlbHMoeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB4ICogdGhpcy5jdXJDb2xXaWR0aDtcclxuICB9XHJcblxyXG4gIHBvc2l0aW9uWVRvUGl4ZWxzKHk6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4geSAqIHRoaXMuY3VyUm93SGVpZ2h0O1xyXG4gIH1cclxufVxyXG4iXX0=