@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,277 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import { Injectable } from '@angular/core';
6
+ import { GridsterComponentInterface } from './gridster.interface';
7
+ import { GridType } from './gridsterConfig.interface';
8
+ export class GridsterRenderer {
9
+ /**
10
+ * @param {?} gridster
11
+ */
12
+ constructor(gridster) {
13
+ this.gridster = gridster;
14
+ }
15
+ /**
16
+ * @return {?}
17
+ */
18
+ destroy() {
19
+ delete this.gridster;
20
+ }
21
+ /**
22
+ * @param {?} el
23
+ * @param {?} item
24
+ * @param {?} renderer
25
+ * @return {?}
26
+ */
27
+ updateItem(el, item, renderer) {
28
+ if (this.gridster.mobile) {
29
+ this.clearCellPosition(renderer, el);
30
+ if (this.gridster.$options.keepFixedHeightInMobile) {
31
+ renderer.setStyle(el, 'height', (item.rows * this.gridster.$options.fixedRowHeight) + 'px');
32
+ }
33
+ else {
34
+ renderer.setStyle(el, 'height', (this.gridster.curWidth / 2 * item.rows) + 'px');
35
+ }
36
+ if (this.gridster.$options.keepFixedWidthInMobile) {
37
+ renderer.setStyle(el, 'width', this.gridster.$options.fixedColWidth + 'px');
38
+ }
39
+ else {
40
+ renderer.setStyle(el, 'width', '');
41
+ }
42
+ renderer.setStyle(el, 'margin-bottom', this.gridster.$options.margin + 'px');
43
+ renderer.setStyle(el, 'margin-right', '');
44
+ }
45
+ else {
46
+ /** @type {?} */
47
+ const x = Math.round(this.gridster.curColWidth * item.x);
48
+ /** @type {?} */
49
+ const y = Math.round(this.gridster.curRowHeight * item.y);
50
+ /** @type {?} */
51
+ const width = this.gridster.curColWidth * item.cols - this.gridster.$options.margin;
52
+ /** @type {?} */
53
+ const height = (this.gridster.curRowHeight * item.rows - this.gridster.$options.margin);
54
+ // set the cell style
55
+ this.setCellPosition(renderer, el, x, y);
56
+ renderer.setStyle(el, 'width', width + 'px');
57
+ renderer.setStyle(el, 'height', height + 'px');
58
+ /** @type {?} */
59
+ let marginBottom = null;
60
+ /** @type {?} */
61
+ let marginRight = null;
62
+ if (this.gridster.$options.outerMargin) {
63
+ if (this.gridster.rows === item.rows + item.y) {
64
+ if (this.gridster.$options.outerMarginBottom !== null) {
65
+ marginBottom = this.gridster.$options.outerMarginBottom + 'px';
66
+ }
67
+ else {
68
+ marginBottom = this.gridster.$options.margin + 'px';
69
+ }
70
+ }
71
+ if (this.gridster.columns === item.cols + item.x) {
72
+ if (this.gridster.$options.outerMarginBottom !== null) {
73
+ marginRight = this.gridster.$options.outerMarginRight + 'px';
74
+ }
75
+ else {
76
+ marginRight = this.gridster.$options.margin + 'px';
77
+ }
78
+ }
79
+ }
80
+ renderer.setStyle(el, 'margin-bottom', marginBottom);
81
+ renderer.setStyle(el, 'margin-right', marginRight);
82
+ }
83
+ }
84
+ /**
85
+ * @return {?}
86
+ */
87
+ updateGridster() {
88
+ /** @type {?} */
89
+ let addClass = '';
90
+ /** @type {?} */
91
+ let removeClass1 = '';
92
+ /** @type {?} */
93
+ let removeClass2 = '';
94
+ /** @type {?} */
95
+ let removeClass3 = '';
96
+ if (this.gridster.$options.gridType === GridType.Fit) {
97
+ addClass = GridType.Fit;
98
+ removeClass1 = GridType.ScrollVertical;
99
+ removeClass2 = GridType.ScrollHorizontal;
100
+ removeClass3 = GridType.Fixed;
101
+ }
102
+ else if (this.gridster.$options.gridType === GridType.ScrollVertical) {
103
+ this.gridster.curRowHeight = this.gridster.curColWidth;
104
+ addClass = GridType.ScrollVertical;
105
+ removeClass1 = GridType.Fit;
106
+ removeClass2 = GridType.ScrollHorizontal;
107
+ removeClass3 = GridType.Fixed;
108
+ }
109
+ else if (this.gridster.$options.gridType === GridType.ScrollHorizontal) {
110
+ this.gridster.curColWidth = this.gridster.curRowHeight;
111
+ addClass = GridType.ScrollHorizontal;
112
+ removeClass1 = GridType.Fit;
113
+ removeClass2 = GridType.ScrollVertical;
114
+ removeClass3 = GridType.Fixed;
115
+ }
116
+ else if (this.gridster.$options.gridType === GridType.Fixed) {
117
+ this.gridster.curColWidth = this.gridster.$options.fixedColWidth +
118
+ (this.gridster.$options.ignoreMarginInRow ? 0 : this.gridster.$options.margin);
119
+ this.gridster.curRowHeight = this.gridster.$options.fixedRowHeight +
120
+ (this.gridster.$options.ignoreMarginInRow ? 0 : this.gridster.$options.margin);
121
+ addClass = GridType.Fixed;
122
+ removeClass1 = GridType.Fit;
123
+ removeClass2 = GridType.ScrollVertical;
124
+ removeClass3 = GridType.ScrollHorizontal;
125
+ }
126
+ else if (this.gridster.$options.gridType === GridType.VerticalFixed) {
127
+ this.gridster.curRowHeight = this.gridster.$options.fixedRowHeight +
128
+ (this.gridster.$options.ignoreMarginInRow ? 0 : this.gridster.$options.margin);
129
+ addClass = GridType.ScrollVertical;
130
+ removeClass1 = GridType.Fit;
131
+ removeClass2 = GridType.ScrollHorizontal;
132
+ removeClass3 = GridType.Fixed;
133
+ }
134
+ else if (this.gridster.$options.gridType === GridType.HorizontalFixed) {
135
+ this.gridster.curColWidth = this.gridster.$options.fixedColWidth +
136
+ (this.gridster.$options.ignoreMarginInRow ? 0 : this.gridster.$options.margin);
137
+ addClass = GridType.ScrollHorizontal;
138
+ removeClass1 = GridType.Fit;
139
+ removeClass2 = GridType.ScrollVertical;
140
+ removeClass3 = GridType.Fixed;
141
+ }
142
+ if (this.gridster.mobile) {
143
+ this.gridster.renderer.removeClass(this.gridster.el, addClass);
144
+ }
145
+ else {
146
+ this.gridster.renderer.addClass(this.gridster.el, addClass);
147
+ }
148
+ this.gridster.renderer.removeClass(this.gridster.el, removeClass1);
149
+ this.gridster.renderer.removeClass(this.gridster.el, removeClass2);
150
+ this.gridster.renderer.removeClass(this.gridster.el, removeClass3);
151
+ }
152
+ /**
153
+ * @param {?} i
154
+ * @return {?}
155
+ */
156
+ getGridColumnStyle(i) {
157
+ return Object.assign({}, this.getLeftPosition(this.gridster.curColWidth * i), { width: this.gridster.curColWidth - this.gridster.$options.margin + 'px', height: this.gridster.gridRows.length * this.gridster.curRowHeight - this.gridster.$options.margin + 'px' });
158
+ }
159
+ /**
160
+ * @param {?} i
161
+ * @return {?}
162
+ */
163
+ getGridRowStyle(i) {
164
+ return Object.assign({}, this.getTopPosition(this.gridster.curRowHeight * i), { width: this.gridster.gridColumns.length * this.gridster.curColWidth - this.gridster.$options.margin + 'px', height: this.gridster.curRowHeight - this.gridster.$options.margin + 'px' });
165
+ }
166
+ /**
167
+ * @param {?} d
168
+ * @return {?}
169
+ */
170
+ getLeftPosition(d) {
171
+ if (this.gridster.$options.useTransformPositioning) {
172
+ return {
173
+ transform: 'translateX(' + d + 'px)',
174
+ };
175
+ }
176
+ else {
177
+ return {
178
+ left: (this.getLeftMargin() + d) + 'px'
179
+ };
180
+ }
181
+ }
182
+ /**
183
+ * @param {?} d
184
+ * @return {?}
185
+ */
186
+ getTopPosition(d) {
187
+ if (this.gridster.$options.useTransformPositioning) {
188
+ return {
189
+ transform: 'translateY(' + d + 'px)',
190
+ };
191
+ }
192
+ else {
193
+ return {
194
+ top: this.getTopMargin() + d + 'px'
195
+ };
196
+ }
197
+ }
198
+ /**
199
+ * @param {?} renderer
200
+ * @param {?} el
201
+ * @return {?}
202
+ */
203
+ clearCellPosition(renderer, el) {
204
+ if (this.gridster.$options.useTransformPositioning) {
205
+ renderer.setStyle(el, 'transform', '');
206
+ }
207
+ else {
208
+ renderer.setStyle(el, 'top', '');
209
+ renderer.setStyle(el, 'left', '');
210
+ }
211
+ }
212
+ /**
213
+ * @param {?} renderer
214
+ * @param {?} el
215
+ * @param {?} x
216
+ * @param {?} y
217
+ * @return {?}
218
+ */
219
+ setCellPosition(renderer, el, x, y) {
220
+ if (this.gridster.$options.useTransformPositioning) {
221
+ /** @type {?} */
222
+ const transform = 'translate3d(' + x + 'px, ' + y + 'px, 0)';
223
+ renderer.setStyle(el, 'transform', transform);
224
+ }
225
+ else {
226
+ renderer.setStyle(el, 'left', this.getLeftMargin() + x + 'px');
227
+ renderer.setStyle(el, 'top', this.getTopMargin() + y + 'px');
228
+ }
229
+ }
230
+ /**
231
+ * @return {?}
232
+ */
233
+ getLeftMargin() {
234
+ if (this.gridster.$options.outerMargin) {
235
+ if (this.gridster.$options.outerMarginLeft !== null) {
236
+ return this.gridster.$options.outerMarginLeft;
237
+ }
238
+ else {
239
+ return this.gridster.$options.margin;
240
+ }
241
+ }
242
+ else {
243
+ return 0;
244
+ }
245
+ }
246
+ /**
247
+ * @return {?}
248
+ */
249
+ getTopMargin() {
250
+ if (this.gridster.$options.outerMargin) {
251
+ if (this.gridster.$options.outerMarginTop !== null) {
252
+ return this.gridster.$options.outerMarginTop;
253
+ }
254
+ else {
255
+ return this.gridster.$options.margin;
256
+ }
257
+ }
258
+ else {
259
+ return 0;
260
+ }
261
+ }
262
+ }
263
+ GridsterRenderer.decorators = [
264
+ { type: Injectable }
265
+ ];
266
+ /** @nocollapse */
267
+ GridsterRenderer.ctorParameters = () => [
268
+ { type: GridsterComponentInterface }
269
+ ];
270
+ if (false) {
271
+ /**
272
+ * @type {?}
273
+ * @private
274
+ */
275
+ GridsterRenderer.prototype.gridster;
276
+ }
277
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJSZW5kZXJlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNjaG5laWRlcmVzcy9kYXNoYm9hcmRmcmFtZXdvcmsvIiwic291cmNlcyI6WyJncmlkc3Rlci9saWIvZ3JpZHN0ZXJSZW5kZXJlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBRXBELE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUlwRCxNQUFNLE9BQU8sZ0JBQWdCOzs7O0lBRTNCLFlBQW9CLFFBQW9DO1FBQXBDLGFBQVEsR0FBUixRQUFRLENBQTRCO0lBQ3hELENBQUM7Ozs7SUFFRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7Ozs7Ozs7SUFFRCxVQUFVLENBQUMsRUFBTyxFQUFFLElBQWtCLEVBQUUsUUFBbUI7UUFDekQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEVBQUU7Z0JBQ2xELFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7YUFDN0Y7aUJBQU07Z0JBQ0wsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMs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Q0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQzthQUN0QztTQUNGO2FBQU07WUFDTCxPQUFPLENBQUMsQ0FBQztTQUNWO0lBQ0gsQ0FBQzs7O1lBck1GLFVBQVU7Ozs7WUFKSCwwQkFBMEI7Ozs7Ozs7SUFPcEIsb0NBQTRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBSZW5kZXJlcjJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHtHcmlkc3RlckNvbXBvbmVudEludGVyZmFjZX0gZnJvbSAnLi9ncmlkc3Rlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge0dyaWRUeXBlfSBmcm9tICcuL2dyaWRzdGVyQ29uZmlnLmludGVyZmFjZSc7XHJcbmltcG9ydCB7R3JpZHN0ZXJJdGVtfSBmcm9tICcuL2dyaWRzdGVySXRlbS5pbnRlcmZhY2UnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgR3JpZHN0ZXJSZW5kZXJlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZ3JpZHN0ZXI6IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlKSB7XHJcbiAgfVxyXG5cclxuICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgZGVsZXRlIHRoaXMuZ3JpZHN0ZXI7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVJdGVtKGVsOiBhbnksIGl0ZW06IEdyaWRzdGVySXRlbSwgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIubW9iaWxlKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJDZWxsUG9zaXRpb24ocmVuZGVyZXIsIGVsKTtcclxuICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMua2VlcEZpeGVkSGVpZ2h0SW5Nb2JpbGUpIHtcclxuICAgICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ2hlaWdodCcsIChpdGVtLnJvd3MgKiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmZpeGVkUm93SGVpZ2h0KSArICdweCcpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCAnaGVpZ2h0JywgKHRoaXMuZ3JpZHN0ZXIuY3VyV2lkdGggLyAyICogaXRlbS5yb3dzKSArICdweCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmtlZXBGaXhlZFdpZHRoSW5Nb2JpbGUpIHtcclxuICAgICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ3dpZHRoJywgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5maXhlZENvbFdpZHRoICsgJ3B4Jyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICd3aWR0aCcsICcnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICdtYXJnaW4tYm90dG9tJywgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4gKyAncHgnKTtcclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICdtYXJnaW4tcmlnaHQnLCAnJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCB4ID0gTWF0aC5yb3VuZCh0aGlzLmdyaWRzdGVyLmN1ckNvbFdpZHRoICogaXRlbS54KTtcclxuICAgICAgY29uc3QgeSA9IE1hdGgucm91bmQodGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQgKiBpdGVtLnkpO1xyXG4gICAgICBjb25zdCB3aWR0aCA9IHRoaXMuZ3JpZHN0ZXIuY3VyQ29sV2lkdGggKiBpdGVtLmNvbHMgLSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbjtcclxuICAgICAgY29uc3QgaGVpZ2h0ID0gKHRoaXMuZ3JpZHN0ZXIuY3VyUm93SGVpZ2h0ICogaXRlbS5yb3dzIC0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4pO1xyXG4gICAgICAvLyBzZXQgdGhlIGNlbGwgc3R5bGVcclxuICAgICAgdGhpcy5zZXRDZWxsUG9zaXRpb24ocmVuZGVyZXIsIGVsLCB4LCB5KTtcclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICd3aWR0aCcsIHdpZHRoICsgJ3B4Jyk7XHJcbiAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCAnaGVpZ2h0JywgaGVpZ2h0ICsgJ3B4Jyk7XHJcbiAgICAgIGxldCBtYXJnaW5Cb3R0b206IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgICBsZXQgbWFyZ2luUmlnaHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpbikge1xyXG4gICAgICAgIGlmICh0aGlzLmdyaWRzdGVyLnJvd3MgPT09IGl0ZW0ucm93cyArIGl0ZW0ueSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5Cb3R0b20gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgbWFyZ2luQm90dG9tID0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpbkJvdHRvbSArICdweCc7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtYXJnaW5Cb3R0b20gPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbiArICdweCc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmdyaWRzdGVyLmNvbHVtbnMgPT09IGl0ZW0uY29scyArIGl0ZW0ueCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5Cb3R0b20gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgbWFyZ2luUmlnaHQgPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luUmlnaHQgKyAncHgnO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWFyZ2luUmlnaHQgPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbiArICdweCc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ21hcmdpbi1ib3R0b20nLCBtYXJnaW5Cb3R0b20pO1xyXG4gICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ21hcmdpbi1yaWdodCcsIG1hcmdpblJpZ2h0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUdyaWRzdGVyKCkge1xyXG4gICAgbGV0IGFkZENsYXNzID0gJyc7XHJcbiAgICBsZXQgcmVtb3ZlQ2xhc3MxID0gJyc7XHJcbiAgICBsZXQgcmVtb3ZlQ2xhc3MyID0gJyc7XHJcbiAgICBsZXQgcmVtb3ZlQ2xhc3MzID0gJyc7XHJcbiAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gR3JpZFR5cGUuRml0KSB7XHJcbiAgICAgIGFkZENsYXNzID0gR3JpZFR5cGUuRml0O1xyXG4gICAgICByZW1vdmVDbGFzczEgPSBHcmlkVHlwZS5TY3JvbGxWZXJ0aWNhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MyID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MzID0gR3JpZFR5cGUuRml4ZWQ7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZ3JpZFR5cGUgPT09IEdyaWRUeXBlLlNjcm9sbFZlcnRpY2FsKSB7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXIuY3VyUm93SGVpZ2h0ID0gdGhpcy5ncmlkc3Rlci5jdXJDb2xXaWR0aDtcclxuICAgICAgYWRkQ2xhc3MgPSBHcmlkVHlwZS5TY3JvbGxWZXJ0aWNhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MxID0gR3JpZFR5cGUuRml0O1xyXG4gICAgICByZW1vdmVDbGFzczIgPSBHcmlkVHlwZS5TY3JvbGxIb3Jpem9udGFsO1xyXG4gICAgICByZW1vdmVDbGFzczMgPSBHcmlkVHlwZS5GaXhlZDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbCkge1xyXG4gICAgICB0aGlzLmdyaWRzdGVyLmN1ckNvbFdpZHRoID0gdGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQ7XHJcbiAgICAgIGFkZENsYXNzID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MxID0gR3JpZFR5cGUuRml0O1xyXG4gICAgICByZW1vdmVDbGFzczIgPSBHcmlkVHlwZS5TY3JvbGxWZXJ0aWNhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MzID0gR3JpZFR5cGUuRml4ZWQ7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZ3JpZFR5cGUgPT09IEdyaWRUeXBlLkZpeGVkKSB7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXIuY3VyQ29sV2lkdGggPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmZpeGVkQ29sV2lkdGggK1xyXG4gICAgICAgICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmlnbm9yZU1hcmdpbkluUm93ID8gMCA6IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luKTtcclxuICAgICAgdGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQgPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmZpeGVkUm93SGVpZ2h0ICtcclxuICAgICAgICAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5pZ25vcmVNYXJnaW5JblJvdyA/IDAgOiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbik7XHJcbiAgICAgIGFkZENsYXNzID0gR3JpZFR5cGUuRml4ZWQ7XHJcbiAgICAgIHJlbW92ZUNsYXNzMSA9IEdyaWRUeXBlLkZpdDtcclxuICAgICAgcmVtb3ZlQ2xhc3MyID0gR3JpZFR5cGUuU2Nyb2xsVmVydGljYWw7XHJcbiAgICAgIHJlbW92ZUNsYXNzMyA9IEdyaWRUeXBlLlNjcm9sbEhvcml6b250YWw7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZ3JpZFR5cGUgPT09IEdyaWRUeXBlLlZlcnRpY2FsRml4ZWQpIHtcclxuICAgICAgdGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQgPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmZpeGVkUm93SGVpZ2h0ICtcclxuICAgICAgICAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5pZ25vcmVNYXJnaW5JblJvdyA/IDAgOiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbik7XHJcbiAgICAgIGFkZENsYXNzID0gR3JpZFR5cGUuU2Nyb2xsVmVydGljYWw7XHJcbiAgICAgIHJlbW92ZUNsYXNzMSA9IEdyaWRUeXBlLkZpdDtcclxuICAgICAgcmVtb3ZlQ2xhc3MyID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MzID0gR3JpZFR5cGUuRml4ZWQ7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZ3JpZFR5cGUgPT09IEdyaWRUeXBlLkhvcml6b250YWxGaXhlZCkge1xyXG4gICAgICB0aGlzLmdyaWRzdGVyLmN1ckNvbFdpZHRoID0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5maXhlZENvbFdpZHRoICtcclxuICAgICAgICAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5pZ25vcmVNYXJnaW5JblJvdyA/IDAgOiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbik7XHJcbiAgICAgIGFkZENsYXNzID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MxID0gR3JpZFR5cGUuRml0O1xyXG4gICAgICByZW1vdmVDbGFzczIgPSBHcmlkVHlwZS5TY3JvbGxWZXJ0aWNhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MzID0gR3JpZFR5cGUuRml4ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIubW9iaWxlKSB7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXIucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5ncmlkc3Rlci5lbCwgYWRkQ2xhc3MpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncmlkc3Rlci5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmdyaWRzdGVyLmVsLCBhZGRDbGFzcyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdyaWRzdGVyLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZ3JpZHN0ZXIuZWwsIHJlbW92ZUNsYXNzMSk7XHJcbiAgICB0aGlzLmdyaWRzdGVyLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZ3JpZHN0ZXIuZWwsIHJlbW92ZUNsYXNzMik7XHJcbiAgICB0aGlzLmdyaWRzdGVyLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZ3JpZHN0ZXIuZWwsIHJlbW92ZUNsYXNzMyk7XHJcbiAgfVxyXG5cclxuICBnZXRHcmlkQ29sdW1uU3R5bGUoaTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi50aGlzLmdldExlZnRQb3NpdGlvbih0aGlzLmdyaWRzdGVyLmN1ckNvbFdpZHRoICogaSksXHJcbiAgICAgIHdpZHRoOiB0aGlzLmdyaWRzdGVyLmN1ckNvbFdpZHRoIC0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4gKyAncHgnLFxyXG4gICAgICBoZWlnaHQ6IHRoaXMuZ3JpZHN0ZXIuZ3JpZFJvd3MubGVuZ3RoICogdGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQgLSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbiArICdweCdcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRHcmlkUm93U3R5bGUoaTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi50aGlzLmdldFRvcFBvc2l0aW9uKHRoaXMuZ3JpZHN0ZXIuY3VyUm93SGVpZ2h0ICogaSksXHJcbiAgICAgIHdpZHRoOiB0aGlzLmdyaWRzdGVyLmdyaWRDb2x1bW5zLmxlbmd0aCAqIHRoaXMuZ3JpZHN0ZXIuY3VyQ29sV2lkdGggLSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbiArICdweCcsXHJcbiAgICAgIGhlaWdodDogdGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQgLSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbiArICdweCdcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRMZWZ0UG9zaXRpb24oZDogbnVtYmVyKTogT2JqZWN0IHtcclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLnVzZVRyYW5zZm9ybVBvc2l0aW9uaW5nKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgnICsgZCArICdweCknLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsZWZ0OiAodGhpcy5nZXRMZWZ0TWFyZ2luKCkgKyBkKSArICdweCdcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFRvcFBvc2l0aW9uKGQ6IG51bWJlcik6IE9iamVjdCB7XHJcbiAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy51c2VUcmFuc2Zvcm1Qb3NpdGlvbmluZykge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoJyArIGQgKyAncHgpJyxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgdG9wOiB0aGlzLmdldFRvcE1hcmdpbigpICsgZCArICdweCdcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyQ2VsbFBvc2l0aW9uKHJlbmRlcmVyOiBSZW5kZXJlcjIsIGVsOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLnVzZVRyYW5zZm9ybVBvc2l0aW9uaW5nKSB7XHJcbiAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCAndHJhbnNmb3JtJywgJycpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICd0b3AnLCAnJyk7XHJcbiAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCAnbGVmdCcsICcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldENlbGxQb3NpdGlvbihyZW5kZXJlcjogUmVuZGVyZXIyLCBlbDogYW55LCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMudXNlVHJhbnNmb3JtUG9zaXRpb25pbmcpIHtcclxuICAgICAgY29uc3QgdHJhbnNmb3JtID0gJ3RyYW5zbGF0ZTNkKCcgKyB4ICsgJ3B4LCAnICsgeSArICdweCwgMCknO1xyXG4gICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ3RyYW5zZm9ybScsIHRyYW5zZm9ybSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ2xlZnQnLCB0aGlzLmdldExlZnRNYXJnaW4oKSArIHggKyAncHgnKTtcclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICd0b3AnLCB0aGlzLmdldFRvcE1hcmdpbigpICsgeSArICdweCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0TGVmdE1hcmdpbigpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW4pIHtcclxuICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5MZWZ0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5MZWZ0O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRUb3BNYXJnaW4oKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luVG9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5Ub3A7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19