@schneideress/dashboardframework 13.0.0 → 17.0.2
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.
- package/README.md +7 -7
- package/esm2022/gridster/index.mjs +12 -0
- package/esm2022/gridster/lib/gridster.component.mjs +627 -0
- package/esm2022/gridster/lib/gridster.interface.mjs +3 -0
- package/esm2022/gridster/lib/gridster.module.mjs +17 -0
- package/esm2022/gridster/lib/gridsterCompact.service.mjs +126 -0
- package/esm2022/gridster/lib/gridsterConfig.constant.mjs +118 -0
- package/esm2022/gridster/lib/gridsterConfig.interface.mjs +37 -0
- package/esm2022/gridster/lib/gridsterConfigS.interface.mjs +2 -0
- package/esm2022/gridster/lib/gridsterDraggable.service.mjs +405 -0
- package/esm2022/gridster/lib/gridsterEmptyCell.service.mjs +255 -0
- package/esm2022/gridster/lib/gridsterItem.component.mjs +228 -0
- package/esm2022/gridster/lib/gridsterItem.interface.mjs +3 -0
- package/esm2022/gridster/lib/gridsterPreview.component.mjs +36 -0
- package/esm2022/gridster/lib/gridsterPush.service.mjs +316 -0
- package/esm2022/gridster/lib/gridsterPushResize.service.mjs +225 -0
- package/esm2022/gridster/lib/gridsterRenderer.interface.mjs +2 -0
- package/esm2022/gridster/lib/gridsterRenderer.service.mjs +274 -0
- package/esm2022/gridster/lib/gridsterResizable.service.mjs +470 -0
- package/esm2022/gridster/lib/gridsterResizeEventType.interface.mjs +2 -0
- package/esm2022/gridster/lib/gridsterScroll.service.mjs +134 -0
- package/esm2022/gridster/lib/gridsterSwap.service.mjs +87 -0
- package/esm2022/gridster/lib/gridsterUtils.service.mjs +92 -0
- package/esm2022/lib/custom.notifier.options.mjs +41 -0
- package/esm2022/lib/ra-dashboard-area/ra.dashboard.area.mjs +460 -0
- package/esm2022/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.mjs +43 -0
- package/esm2022/lib/ra-widget-container/ra.widget.container.component.mjs +767 -0
- package/esm2022/lib/ra.base.dashboard.filter.mjs +41 -0
- package/esm2022/lib/ra.base.dashboard.template.mjs +33 -0
- package/esm2022/lib/ra.dashbard.event.bus.mjs +46 -0
- package/esm2022/lib/ra.dashboard.module.mjs +55 -0
- package/esm2022/lib/ra.dashboard.responsive.service.mjs +139 -0
- package/esm2022/lib/ra.dashboard.service.mjs +77 -0
- package/esm2022/lib/ra.event.enum.mjs +60 -0
- package/esm2022/lib/ra.gridster.config.mjs +56 -0
- package/esm2022/public-api.mjs +13 -0
- package/esm2022/schneideress-dashboardframework.mjs +5 -0
- package/fesm2022/schneideress-dashboardframework.mjs +5198 -0
- package/fesm2022/schneideress-dashboardframework.mjs.map +1 -0
- package/gridster/index.d.ts +9 -0
- package/gridster/lib/gridster.component.d.ts +79 -0
- package/gridster/lib/gridster.interface.d.ts +49 -0
- package/gridster/lib/gridster.module.d.ts +8 -0
- package/gridster/lib/gridsterCompact.service.d.ts +11 -0
- package/gridster/lib/gridsterConfig.constant.d.ts +2 -0
- package/gridster/lib/gridsterConfig.interface.d.ts +155 -0
- package/gridster/lib/gridsterConfigS.interface.d.ts +107 -0
- package/gridster/lib/gridsterDraggable.service.d.ts +68 -0
- package/gridster/lib/gridsterEmptyCell.service.d.ts +31 -0
- package/gridster/lib/gridsterItem.component.d.ts +61 -0
- package/gridster/lib/gridsterItem.interface.d.ts +67 -0
- package/gridster/lib/gridsterPreview.component.d.ts +17 -0
- package/gridster/lib/gridsterPush.service.d.ts +34 -0
- package/gridster/lib/gridsterPushResize.service.d.ts +26 -0
- package/gridster/lib/gridsterRenderer.interface.d.ts +14 -0
- package/gridster/lib/gridsterRenderer.service.d.ts +37 -0
- package/gridster/lib/gridsterResizable.service.d.ts +86 -0
- package/gridster/lib/gridsterResizeEventType.interface.d.ts +6 -0
- package/gridster/lib/gridsterScroll.service.d.ts +7 -0
- package/gridster/lib/gridsterSwap.service.d.ts +13 -0
- package/gridster/lib/gridsterUtils.service.d.ts +16 -0
- package/{schneideress-dashboardframework.d.ts → index.d.ts} +5 -5
- package/lib/custom.notifier.options.d.ts +2 -2
- package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +88 -88
- package/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.d.ts +20 -20
- package/lib/ra-widget-container/ra.widget.container.component.d.ts +142 -142
- package/lib/ra.base.dashboard.filter.d.ts +17 -17
- package/lib/ra.base.dashboard.template.d.ts +18 -18
- package/lib/ra.dashbard.event.bus.d.ts +23 -23
- package/lib/ra.dashboard.module.d.ts +16 -17
- package/lib/ra.dashboard.responsive.service.d.ts +24 -24
- package/lib/ra.dashboard.service.d.ts +25 -25
- package/lib/ra.event.enum.d.ts +57 -57
- package/lib/ra.gridster.config.d.ts +2 -2
- package/package.json +11 -17
- package/public-api.d.ts +9 -9
- package/esm2020/lib/custom.notifier.options.mjs +0 -41
- package/esm2020/lib/ra-dashboard-area/ra.dashboard.area.mjs +0 -445
- package/esm2020/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.mjs +0 -43
- package/esm2020/lib/ra-widget-container/ra.widget.container.component.mjs +0 -767
- package/esm2020/lib/ra.base.dashboard.filter.mjs +0 -44
- package/esm2020/lib/ra.base.dashboard.template.mjs +0 -36
- package/esm2020/lib/ra.dashbard.event.bus.mjs +0 -46
- package/esm2020/lib/ra.dashboard.module.mjs +0 -64
- package/esm2020/lib/ra.dashboard.responsive.service.mjs +0 -136
- package/esm2020/lib/ra.dashboard.service.mjs +0 -77
- package/esm2020/lib/ra.event.enum.mjs +0 -60
- package/esm2020/lib/ra.gridster.config.mjs +0 -56
- package/esm2020/public-api.mjs +0 -15
- package/esm2020/schneideress-dashboardframework.mjs +0 -5
- package/fesm2015/schneideress-dashboardframework.mjs +0 -1800
- package/fesm2015/schneideress-dashboardframework.mjs.map +0 -1
- package/fesm2020/schneideress-dashboardframework.mjs +0 -1790
- package/fesm2020/schneideress-dashboardframework.mjs.map +0 -1
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
export class GridsterPushResize {
|
|
2
|
+
constructor(gridsterItem) {
|
|
3
|
+
this.pushedItems = [];
|
|
4
|
+
this.pushedItemsPath = [];
|
|
5
|
+
this.gridsterItem = gridsterItem;
|
|
6
|
+
this.gridster = gridsterItem.gridster;
|
|
7
|
+
this.tryPattern = {
|
|
8
|
+
fromEast: this.tryWest,
|
|
9
|
+
fromWest: this.tryEast,
|
|
10
|
+
fromNorth: this.trySouth,
|
|
11
|
+
fromSouth: this.tryNorth
|
|
12
|
+
};
|
|
13
|
+
this.fromSouth = 'fromSouth';
|
|
14
|
+
this.fromNorth = 'fromNorth';
|
|
15
|
+
this.fromEast = 'fromEast';
|
|
16
|
+
this.fromWest = 'fromWest';
|
|
17
|
+
}
|
|
18
|
+
destroy() {
|
|
19
|
+
this.gridster = this.gridsterItem = null;
|
|
20
|
+
}
|
|
21
|
+
pushItems(direction) {
|
|
22
|
+
if (this.gridster.$options.pushResizeItems) {
|
|
23
|
+
return this.push(this.gridsterItem, direction);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
restoreItems() {
|
|
30
|
+
let i = 0;
|
|
31
|
+
const l = this.pushedItems.length;
|
|
32
|
+
let pushedItem;
|
|
33
|
+
for (; i < l; i++) {
|
|
34
|
+
pushedItem = this.pushedItems[i];
|
|
35
|
+
pushedItem.$item.x = pushedItem.item.x || 0;
|
|
36
|
+
pushedItem.$item.y = pushedItem.item.y || 0;
|
|
37
|
+
pushedItem.$item.cols = pushedItem.item.cols || 1;
|
|
38
|
+
pushedItem.$item.row = pushedItem.item.row || 1;
|
|
39
|
+
pushedItem.setSize();
|
|
40
|
+
}
|
|
41
|
+
this.pushedItems = [];
|
|
42
|
+
this.pushedItemsPath = [];
|
|
43
|
+
}
|
|
44
|
+
setPushedItems() {
|
|
45
|
+
let i = 0;
|
|
46
|
+
const l = this.pushedItems.length;
|
|
47
|
+
let pushedItem;
|
|
48
|
+
for (; i < l; i++) {
|
|
49
|
+
pushedItem = this.pushedItems[i];
|
|
50
|
+
pushedItem.checkItemChanges(pushedItem.$item, pushedItem.item);
|
|
51
|
+
}
|
|
52
|
+
this.pushedItems = [];
|
|
53
|
+
this.pushedItemsPath = [];
|
|
54
|
+
}
|
|
55
|
+
checkPushBack() {
|
|
56
|
+
let i = this.pushedItems.length - 1;
|
|
57
|
+
let change = false;
|
|
58
|
+
for (; i > -1; i--) {
|
|
59
|
+
if (this.checkPushedItem(this.pushedItems[i], i)) {
|
|
60
|
+
change = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (change) {
|
|
64
|
+
this.checkPushBack();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
push(gridsterItem, direction) {
|
|
68
|
+
const gridsterItemCollision = this.gridster.checkCollision(gridsterItem.$item);
|
|
69
|
+
if (gridsterItemCollision &&
|
|
70
|
+
gridsterItemCollision !== true &&
|
|
71
|
+
gridsterItemCollision !== this.gridsterItem &&
|
|
72
|
+
gridsterItemCollision.canBeResized()) {
|
|
73
|
+
let tryPattern = this.tryPattern;
|
|
74
|
+
if (tryPattern[direction].call(this, gridsterItemCollision, gridsterItem, direction)) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else if (gridsterItemCollision === false) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
trySouth(gridsterItemCollide, gridsterItem, direction) {
|
|
84
|
+
const backUpY = gridsterItemCollide.$item.y;
|
|
85
|
+
const backUpRows = gridsterItemCollide.$item.rows;
|
|
86
|
+
gridsterItemCollide.$item.y =
|
|
87
|
+
gridsterItem.$item.y + gridsterItem.$item.rows;
|
|
88
|
+
gridsterItemCollide.$item.rows =
|
|
89
|
+
backUpRows + backUpY - gridsterItemCollide.$item.y;
|
|
90
|
+
if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&
|
|
91
|
+
!this.gridster.checkGridCollision(gridsterItemCollide.$item)) {
|
|
92
|
+
gridsterItemCollide.setSize();
|
|
93
|
+
this.addToPushed(gridsterItemCollide);
|
|
94
|
+
this.push(gridsterItem, direction);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
gridsterItemCollide.$item.y = backUpY;
|
|
99
|
+
gridsterItemCollide.$item.rows = backUpRows;
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
tryNorth(gridsterItemCollide, gridsterItem, direction) {
|
|
104
|
+
const backUpRows = gridsterItemCollide.$item.rows;
|
|
105
|
+
gridsterItemCollide.$item.rows =
|
|
106
|
+
gridsterItem.$item.y - gridsterItemCollide.$item.y;
|
|
107
|
+
if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&
|
|
108
|
+
!this.gridster.checkGridCollision(gridsterItemCollide.$item)) {
|
|
109
|
+
gridsterItemCollide.setSize();
|
|
110
|
+
this.addToPushed(gridsterItemCollide);
|
|
111
|
+
this.push(gridsterItem, direction);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
gridsterItemCollide.$item.rows = backUpRows;
|
|
116
|
+
}
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
tryEast(gridsterItemCollide, gridsterItem, direction) {
|
|
120
|
+
const backUpX = gridsterItemCollide.$item.x;
|
|
121
|
+
const backUpCols = gridsterItemCollide.$item.cols;
|
|
122
|
+
gridsterItemCollide.$item.x =
|
|
123
|
+
gridsterItem.$item.x + gridsterItem.$item.cols;
|
|
124
|
+
gridsterItemCollide.$item.cols =
|
|
125
|
+
backUpCols + backUpX - gridsterItemCollide.$item.x;
|
|
126
|
+
if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&
|
|
127
|
+
!this.gridster.checkGridCollision(gridsterItemCollide.$item)) {
|
|
128
|
+
gridsterItemCollide.setSize();
|
|
129
|
+
this.addToPushed(gridsterItemCollide);
|
|
130
|
+
this.push(gridsterItem, direction);
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
gridsterItemCollide.$item.x = backUpX;
|
|
135
|
+
gridsterItemCollide.$item.cols = backUpCols;
|
|
136
|
+
}
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
tryWest(gridsterItemCollide, gridsterItem, direction) {
|
|
140
|
+
const backUpCols = gridsterItemCollide.$item.cols;
|
|
141
|
+
gridsterItemCollide.$item.cols =
|
|
142
|
+
gridsterItem.$item.x - gridsterItemCollide.$item.x;
|
|
143
|
+
if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&
|
|
144
|
+
!this.gridster.checkGridCollision(gridsterItemCollide.$item)) {
|
|
145
|
+
gridsterItemCollide.setSize();
|
|
146
|
+
this.addToPushed(gridsterItemCollide);
|
|
147
|
+
this.push(gridsterItem, direction);
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
gridsterItemCollide.$item.cols = backUpCols;
|
|
152
|
+
}
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
addToPushed(gridsterItem) {
|
|
156
|
+
if (this.pushedItems.indexOf(gridsterItem) < 0) {
|
|
157
|
+
this.pushedItems.push(gridsterItem);
|
|
158
|
+
this.pushedItemsPath.push([
|
|
159
|
+
{
|
|
160
|
+
x: gridsterItem.item.x || 0,
|
|
161
|
+
y: gridsterItem.item.y || 0,
|
|
162
|
+
cols: gridsterItem.item.cols || 0,
|
|
163
|
+
rows: gridsterItem.item.rows || 0
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
x: gridsterItem.$item.x,
|
|
167
|
+
y: gridsterItem.$item.y,
|
|
168
|
+
cols: gridsterItem.$item.cols,
|
|
169
|
+
rows: gridsterItem.$item.rows
|
|
170
|
+
}
|
|
171
|
+
]);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
const i = this.pushedItems.indexOf(gridsterItem);
|
|
175
|
+
this.pushedItemsPath[i].push({
|
|
176
|
+
x: gridsterItem.$item.x,
|
|
177
|
+
y: gridsterItem.$item.y,
|
|
178
|
+
cols: gridsterItem.$item.cols,
|
|
179
|
+
rows: gridsterItem.$item.rows
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
removeFromPushed(i) {
|
|
184
|
+
if (i > -1) {
|
|
185
|
+
this.pushedItems.splice(i, 1);
|
|
186
|
+
this.pushedItemsPath.splice(i, 1);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
checkPushedItem(pushedItem, i) {
|
|
190
|
+
const path = this.pushedItemsPath[i];
|
|
191
|
+
let j = path.length - 2;
|
|
192
|
+
let lastPosition;
|
|
193
|
+
let x;
|
|
194
|
+
let y;
|
|
195
|
+
let cols;
|
|
196
|
+
let rows;
|
|
197
|
+
for (; j > -1; j--) {
|
|
198
|
+
lastPosition = path[j];
|
|
199
|
+
x = pushedItem.$item.x;
|
|
200
|
+
y = pushedItem.$item.y;
|
|
201
|
+
cols = pushedItem.$item.cols;
|
|
202
|
+
rows = pushedItem.$item.rows;
|
|
203
|
+
pushedItem.$item.x = lastPosition.x;
|
|
204
|
+
pushedItem.$item.y = lastPosition.y;
|
|
205
|
+
pushedItem.$item.cols = lastPosition.cols;
|
|
206
|
+
pushedItem.$item.rows = lastPosition.rows;
|
|
207
|
+
if (!this.gridster.findItemWithItem(pushedItem.$item)) {
|
|
208
|
+
pushedItem.setSize();
|
|
209
|
+
path.splice(j + 1, path.length - 1 - j);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
pushedItem.$item.x = x;
|
|
213
|
+
pushedItem.$item.y = y;
|
|
214
|
+
pushedItem.$item.cols = cols;
|
|
215
|
+
pushedItem.$item.rows = rows;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (path.length < 2) {
|
|
219
|
+
this.removeFromPushed(i);
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJQdXNoUmVzaXplLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yYS1kYXNoYm9hcmQtZnJhbWV3b3JrL3NyYy9ncmlkc3Rlci9saWIvZ3JpZHN0ZXJQdXNoUmVzaXplLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxPQUFPLGtCQUFrQjtJQWdDN0IsWUFBWSxZQUE0QztRQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDdEIsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3RCLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN4QixTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDekIsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUssQ0FBQztJQUM1QyxDQUFDO0lBRUQsU0FBUyxDQUFDLFNBQWlCO1FBQ3pCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FB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LEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQzdCLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUM3QixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDcEMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztZQUMxQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZCLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDN0IsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgR3JpZHN0ZXJJdGVtLFxyXG4gIEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZVxyXG59IGZyb20gJy4vZ3JpZHN0ZXJJdGVtLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlIH0gZnJvbSAnLi9ncmlkc3Rlci5pbnRlcmZhY2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWRzdGVyUHVzaFJlc2l6ZSB7XHJcbiAgcHVibGljIGZyb21Tb3V0aDogc3RyaW5nO1xyXG4gIHB1YmxpYyBmcm9tTm9ydGg6IHN0cmluZztcclxuICBwdWJsaWMgZnJvbUVhc3Q6IHN0cmluZztcclxuICBwdWJsaWMgZnJvbVdlc3Q6IHN0cmluZztcclxuICBwcml2YXRlIHB1c2hlZEl0ZW1zOiBBcnJheTxHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U+O1xyXG4gIHByaXZhdGUgcHVzaGVkSXRlbXNQYXRoOiBBcnJheTxBcnJheTxHcmlkc3Rlckl0ZW0+PjtcclxuICBwcml2YXRlIGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xyXG4gIHByaXZhdGUgZ3JpZHN0ZXI6IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlO1xyXG4gIHByaXZhdGUgdHJ5UGF0dGVybjoge1xyXG4gICAgZnJvbUVhc3Q6IChcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxyXG4gICAgICBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcclxuICAgICAgZGlyZWN0aW9uOiBzdHJpbmdcclxuICAgICkgPT4gYm9vbGVhbjtcclxuICAgIGZyb21XZXN0OiAoXHJcbiAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGU6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcclxuICAgICAgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXHJcbiAgICAgIGRpcmVjdGlvbjogc3RyaW5nXHJcbiAgICApID0+IGJvb2xlYW47XHJcbiAgICBmcm9tTm9ydGg6IChcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxyXG4gICAgICBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcclxuICAgICAgZGlyZWN0aW9uOiBzdHJpbmdcclxuICAgICkgPT4gYm9vbGVhbjtcclxuICAgIGZyb21Tb3V0aDogKFxyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXHJcbiAgICAgIGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxyXG4gICAgICBkaXJlY3Rpb246IHN0cmluZ1xyXG4gICAgKSA9PiBib29sZWFuO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKSB7XHJcbiAgICB0aGlzLnB1c2hlZEl0ZW1zID0gW107XHJcbiAgICB0aGlzLnB1c2hlZEl0ZW1zUGF0aCA9IFtdO1xyXG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0gPSBncmlkc3Rlckl0ZW07XHJcbiAgICB0aGlzLmdyaWRzdGVyID0gZ3JpZHN0ZXJJdGVtLmdyaWRzdGVyO1xyXG4gICAgdGhpcy50cnlQYXR0ZXJuID0ge1xyXG4gICAgICBmcm9tRWFzdDogdGhpcy50cnlXZXN0LFxyXG4gICAgICBmcm9tV2VzdDogdGhpcy50cnlFYXN0LFxyXG4gICAgICBmcm9tTm9ydGg6IHRoaXMudHJ5U291dGgsXHJcbiAgICAgIGZyb21Tb3V0aDogdGhpcy50cnlOb3J0aFxyXG4gICAgfTtcclxuICAgIHRoaXMuZnJvbVNvdXRoID0gJ2Zyb21Tb3V0aCc7XHJcbiAgICB0aGlzLmZyb21Ob3J0aCA9ICdmcm9tTm9ydGgnO1xyXG4gICAgdGhpcy5mcm9tRWFzdCA9ICdmcm9tRWFzdCc7XHJcbiAgICB0aGlzLmZyb21XZXN0ID0gJ2Zyb21XZXN0JztcclxuICB9XHJcblxyXG4gIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWRzdGVyID0gdGhpcy5ncmlkc3Rlckl0ZW0gPSBudWxsITtcclxuICB9XHJcblxyXG4gIHB1c2hJdGVtcyhkaXJlY3Rpb246IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMucHVzaFJlc2l6ZUl0ZW1zKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnB1c2godGhpcy5ncmlkc3Rlckl0ZW0sIGRpcmVjdGlvbik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXN0b3JlSXRlbXMoKTogdm9pZCB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBjb25zdCBsOiBudW1iZXIgPSB0aGlzLnB1c2hlZEl0ZW1zLmxlbmd0aDtcclxuICAgIGxldCBwdXNoZWRJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XHJcbiAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xyXG4gICAgICBwdXNoZWRJdGVtID0gdGhpcy5wdXNoZWRJdGVtc1tpXTtcclxuICAgICAgcHVzaGVkSXRlbS4kaXRlbS54ID0gcHVzaGVkSXRlbS5pdGVtLnggfHwgMDtcclxuICAgICAgcHVzaGVkSXRlbS4kaXRlbS55ID0gcHVzaGVkSXRlbS5pdGVtLnkgfHwgMDtcclxuICAgICAgcHVzaGVkSXRlbS4kaXRlbS5jb2xzID0gcHVzaGVkSXRlbS5pdGVtLmNvbHMgfHwgMTtcclxuICAgICAgcHVzaGVkSXRlbS4kaXRlbS5yb3cgPSBwdXNoZWRJdGVtLml0ZW0ucm93IHx8IDE7XHJcbiAgICAgIHB1c2hlZEl0ZW0uc2V0U2l6ZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wdXNoZWRJdGVtcyA9IFtdO1xyXG4gICAgdGhpcy5wdXNoZWRJdGVtc1BhdGggPSBbXTtcclxuICB9XHJcblxyXG4gIHNldFB1c2hlZEl0ZW1zKCk6IHZvaWQge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3QgbDogbnVtYmVyID0gdGhpcy5wdXNoZWRJdGVtcy5sZW5ndGg7XHJcbiAgICBsZXQgcHVzaGVkSXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xyXG4gICAgZm9yICg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgcHVzaGVkSXRlbSA9IHRoaXMucHVzaGVkSXRlbXNbaV07XHJcbiAgICAgIHB1c2hlZEl0ZW0uY2hlY2tJdGVtQ2hhbmdlcyhwdXNoZWRJdGVtLiRpdGVtLCBwdXNoZWRJdGVtLml0ZW0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wdXNoZWRJdGVtcyA9IFtdO1xyXG4gICAgdGhpcy5wdXNoZWRJdGVtc1BhdGggPSBbXTtcclxuICB9XHJcblxyXG4gIGNoZWNrUHVzaEJhY2soKTogdm9pZCB7XHJcbiAgICBsZXQgaTogbnVtYmVyID0gdGhpcy5wdXNoZWRJdGVtcy5sZW5ndGggLSAxO1xyXG4gICAgbGV0IGNoYW5nZSA9IGZhbHNlO1xyXG4gICAgZm9yICg7IGkgPiAtMTsgaS0tKSB7XHJcbiAgICAgIGlmICh0aGlzLmNoZWNrUHVzaGVkSXRlbSh0aGlzLnB1c2hlZEl0ZW1zW2ldLCBpKSkge1xyXG4gICAgICAgIGNoYW5nZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2UpIHtcclxuICAgICAgdGhpcy5jaGVja1B1c2hCYWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHB1c2goXHJcbiAgICBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcclxuICAgIGRpcmVjdGlvbjogc3RyaW5nXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBncmlkc3Rlckl0ZW1Db2xsaXNpb246IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSB8IGJvb2xlYW4gPVxyXG4gICAgICB0aGlzLmdyaWRzdGVyLmNoZWNrQ29sbGlzaW9uKGdyaWRzdGVySXRlbS4kaXRlbSk7XHJcbiAgICBpZiAoXHJcbiAgICAgIGdyaWRzdGVySXRlbUNvbGxpc2lvbiAmJlxyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaXNpb24gIT09IHRydWUgJiZcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlzaW9uICE9PSB0aGlzLmdyaWRzdGVySXRlbSAmJlxyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaXNpb24uY2FuQmVSZXNpemVkKClcclxuICAgICkge1xyXG4gICAgICBsZXQgdHJ5UGF0dGVybjogYW55ID0gdGhpcy50cnlQYXR0ZXJuO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdHJ5UGF0dGVybltkaXJlY3Rpb25dLmNhbGwoXHJcbiAgICAgICAgICB0aGlzLFxyXG4gICAgICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlzaW9uLFxyXG4gICAgICAgICAgZ3JpZHN0ZXJJdGVtLFxyXG4gICAgICAgICAgZGlyZWN0aW9uXHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChncmlkc3Rlckl0ZW1Db2xsaXNpb24gPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlTb3V0aChcclxuICAgIGdyaWRzdGVySXRlbUNvbGxpZGU6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcclxuICAgIGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxyXG4gICAgZGlyZWN0aW9uOiBzdHJpbmdcclxuICApOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGJhY2tVcFkgPSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnk7XHJcbiAgICBjb25zdCBiYWNrVXBSb3dzID0gZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5yb3dzO1xyXG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS55ID1cclxuICAgICAgZ3JpZHN0ZXJJdGVtLiRpdGVtLnkgKyBncmlkc3Rlckl0ZW0uJGl0ZW0ucm93cztcclxuICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0ucm93cyA9XHJcbiAgICAgIGJhY2tVcFJvd3MgKyBiYWNrVXBZIC0gZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS55O1xyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5ncmlkc3Rlci5jaGVja0NvbGxpc2lvblR3b0l0ZW1zKFxyXG4gICAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0sXHJcbiAgICAgICAgZ3JpZHN0ZXJJdGVtLiRpdGVtXHJcbiAgICAgICkgJiZcclxuICAgICAgIXRoaXMuZ3JpZHN0ZXIuY2hlY2tHcmlkQ29sbGlzaW9uKGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0pXHJcbiAgICApIHtcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS5zZXRTaXplKCk7XHJcbiAgICAgIHRoaXMuYWRkVG9QdXNoZWQoZ3JpZHN0ZXJJdGVtQ29sbGlkZSk7XHJcbiAgICAgIHRoaXMucHVzaChncmlkc3Rlckl0ZW0sIGRpcmVjdGlvbik7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS55ID0gYmFja1VwWTtcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5yb3dzID0gYmFja1VwUm93cztcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJ5Tm9ydGgoXHJcbiAgICBncmlkc3Rlckl0ZW1Db2xsaWRlOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXHJcbiAgICBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcclxuICAgIGRpcmVjdGlvbjogc3RyaW5nXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBiYWNrVXBSb3dzID0gZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5yb3dzO1xyXG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5yb3dzID1cclxuICAgICAgZ3JpZHN0ZXJJdGVtLiRpdGVtLnkgLSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnk7XHJcbiAgICBpZiAoXHJcbiAgICAgICF0aGlzLmdyaWRzdGVyLmNoZWNrQ29sbGlzaW9uVHdvSXRlbXMoXHJcbiAgICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbSxcclxuICAgICAgICBncmlkc3Rlckl0ZW0uJGl0ZW1cclxuICAgICAgKSAmJlxyXG4gICAgICAhdGhpcy5ncmlkc3Rlci5jaGVja0dyaWRDb2xsaXNpb24oZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbSlcclxuICAgICkge1xyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLnNldFNpemUoKTtcclxuICAgICAgdGhpcy5hZGRUb1B1c2hlZChncmlkc3Rlckl0ZW1Db2xsaWRlKTtcclxuICAgICAgdGhpcy5wdXNoKGdyaWRzdGVySXRlbSwgZGlyZWN0aW9uKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnJvd3MgPSBiYWNrVXBSb3dzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlFYXN0KFxyXG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxyXG4gICAgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXHJcbiAgICBkaXJlY3Rpb246IHN0cmluZ1xyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYmFja1VwWCA9IGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0ueDtcclxuICAgIGNvbnN0IGJhY2tVcENvbHMgPSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLmNvbHM7XHJcbiAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnggPVxyXG4gICAgICBncmlkc3Rlckl0ZW0uJGl0ZW0ueCArIGdyaWRzdGVySXRlbS4kaXRlbS5jb2xzO1xyXG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5jb2xzID1cclxuICAgICAgYmFja1VwQ29scyArIGJhY2tVcFggLSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLng7XHJcbiAgICBpZiAoXHJcbiAgICAgICF0aGlzLmdyaWRzdGVyLmNoZWNrQ29sbGlzaW9uVHdvSXRlbXMoXHJcbiAgICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbSxcclxuICAgICAgICBncmlkc3Rlckl0ZW0uJGl0ZW1cclxuICAgICAgKSAmJlxyXG4gICAgICAhdGhpcy5ncmlkc3Rlci5jaGVja0dyaWRDb2xsaXNpb24oZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbSlcclxuICAgICkge1xyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLnNldFNpemUoKTtcclxuICAgICAgdGhpcy5hZGRUb1B1c2hlZChncmlkc3Rlckl0ZW1Db2xsaWRlKTtcclxuICAgICAgdGhpcy5wdXNoKGdyaWRzdGVySXRlbSwgZGlyZWN0aW9uKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnggPSBiYWNrVXBYO1xyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLmNvbHMgPSBiYWNrVXBDb2xzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlXZXN0KFxyXG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxyXG4gICAgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXHJcbiAgICBkaXJlY3Rpb246IHN0cmluZ1xyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYmFja1VwQ29scyA9IGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0uY29scztcclxuICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0uY29scyA9XHJcbiAgICAgIGdyaWRzdGVySXRlbS4kaXRlbS54IC0gZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS54O1xyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5ncmlkc3Rlci5jaGVja0NvbGxpc2lvblR3b0l0ZW1zKFxyXG4gICAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0sXHJcbiAgICAgICAgZ3JpZHN0ZXJJdGVtLiRpdGVtXHJcbiAgICAgICkgJiZcclxuICAgICAgIXRoaXMuZ3JpZHN0ZXIuY2hlY2tHcmlkQ29sbGlzaW9uKGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0pXHJcbiAgICApIHtcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS5zZXRTaXplKCk7XHJcbiAgICAgIHRoaXMuYWRkVG9QdXNoZWQoZ3JpZHN0ZXJJdGVtQ29sbGlkZSk7XHJcbiAgICAgIHRoaXMucHVzaChncmlkc3Rlckl0ZW0sIGRpcmVjdGlvbik7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5jb2xzID0gYmFja1VwQ29scztcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkVG9QdXNoZWQoZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnB1c2hlZEl0ZW1zLmluZGV4T2YoZ3JpZHN0ZXJJdGVtKSA8IDApIHtcclxuICAgICAgdGhpcy5wdXNoZWRJdGVtcy5wdXNoKGdyaWRzdGVySXRlbSk7XHJcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoLnB1c2goW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHg6IGdyaWRzdGVySXRlbS5pdGVtLnggfHwgMCxcclxuICAgICAgICAgIHk6IGdyaWRzdGVySXRlbS5pdGVtLnkgfHwgMCxcclxuICAgICAgICAgIGNvbHM6IGdyaWRzdGVySXRlbS5pdGVtLmNvbHMgfHwgMCxcclxuICAgICAgICAgIHJvd3M6IGdyaWRzdGVySXRlbS5pdGVtLnJvd3MgfHwgMFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgeDogZ3JpZHN0ZXJJdGVtLiRpdGVtLngsXHJcbiAgICAgICAgICB5OiBncmlkc3Rlckl0ZW0uJGl0ZW0ueSxcclxuICAgICAgICAgIGNvbHM6IGdyaWRzdGVySXRlbS4kaXRlbS5jb2xzLFxyXG4gICAgICAgICAgcm93czogZ3JpZHN0ZXJJdGVtLiRpdGVtLnJvd3NcclxuICAgICAgICB9XHJcbiAgICAgIF0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgaSA9IHRoaXMucHVzaGVkSXRlbXMuaW5kZXhPZihncmlkc3Rlckl0ZW0pO1xyXG4gICAgICB0aGlzLnB1c2hlZEl0ZW1zUGF0aFtpXS5wdXNoKHtcclxuICAgICAgICB4OiBncmlkc3Rlckl0ZW0uJGl0ZW0ueCxcclxuICAgICAgICB5OiBncmlkc3Rlckl0ZW0uJGl0ZW0ueSxcclxuICAgICAgICBjb2xzOiBncmlkc3Rlckl0ZW0uJGl0ZW0uY29scyxcclxuICAgICAgICByb3dzOiBncmlkc3Rlckl0ZW0uJGl0ZW0ucm93c1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRnJvbVB1c2hlZChpOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpID4gLTEpIHtcclxuICAgICAgdGhpcy5wdXNoZWRJdGVtcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tQdXNoZWRJdGVtKFxyXG4gICAgcHVzaGVkSXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxyXG4gICAgaTogbnVtYmVyXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBwYXRoID0gdGhpcy5wdXNoZWRJdGVtc1BhdGhbaV07XHJcbiAgICBsZXQgaiA9IHBhdGgubGVuZ3RoIC0gMjtcclxuICAgIGxldCBsYXN0UG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IGNvbHM6IG51bWJlcjsgcm93czogbnVtYmVyIH07XHJcbiAgICBsZXQgeDtcclxuICAgIGxldCB5O1xyXG4gICAgbGV0IGNvbHM7XHJcbiAgICBsZXQgcm93cztcclxuICAgIGZvciAoOyBqID4gLTE7IGotLSkge1xyXG4gICAgICBsYXN0UG9zaXRpb24gPSBwYXRoW2pdO1xyXG4gICAgICB4ID0gcHVzaGVkSXRlbS4kaXRlbS54O1xyXG4gICAgICB5ID0gcHVzaGVkSXRlbS4kaXRlbS55O1xyXG4gICAgICBjb2xzID0gcHVzaGVkSXRlbS4kaXRlbS5jb2xzO1xyXG4gICAgICByb3dzID0gcHVzaGVkSXRlbS4kaXRlbS5yb3dzO1xyXG4gICAgICBwdXNoZWRJdGVtLiRpdGVtLnggPSBsYXN0UG9zaXRpb24ueDtcclxuICAgICAgcHVzaGVkSXRlbS4kaXRlbS55ID0gbGFzdFBvc2l0aW9uLnk7XHJcbiAgICAgIHB1c2hlZEl0ZW0uJGl0ZW0uY29scyA9IGxhc3RQb3NpdGlvbi5jb2xzO1xyXG4gICAgICBwdXNoZWRJdGVtLiRpdGVtLnJvd3MgPSBsYXN0UG9zaXRpb24ucm93cztcclxuICAgICAgaWYgKCF0aGlzLmdyaWRzdGVyLmZpbmRJdGVtV2l0aEl0ZW0ocHVzaGVkSXRlbS4kaXRlbSkpIHtcclxuICAgICAgICBwdXNoZWRJdGVtLnNldFNpemUoKTtcclxuICAgICAgICBwYXRoLnNwbGljZShqICsgMSwgcGF0aC5sZW5ndGggLSAxIC0gaik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHVzaGVkSXRlbS4kaXRlbS54ID0geDtcclxuICAgICAgICBwdXNoZWRJdGVtLiRpdGVtLnkgPSB5O1xyXG4gICAgICAgIHB1c2hlZEl0ZW0uJGl0ZW0uY29scyA9IGNvbHM7XHJcbiAgICAgICAgcHVzaGVkSXRlbS4kaXRlbS5yb3dzID0gcm93cztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHBhdGgubGVuZ3RoIDwgMikge1xyXG4gICAgICB0aGlzLnJlbW92ZUZyb21QdXNoZWQoaSk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJSZW5kZXJlci5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yYS1kYXNoYm9hcmQtZnJhbWV3b3JrL3NyYy9ncmlkc3Rlci9saWIvZ3JpZHN0ZXJSZW5kZXJlci5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uR3JpZFN0eWxlIHtcclxuICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uR3JpZENhY2hlZFN0eWxlIHtcclxuICB3aWR0aDogbnVtYmVyO1xyXG4gIGhlaWdodDogbnVtYmVyO1xyXG4gIHN0eWxlOiBDb21tb25HcmlkU3R5bGU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR3JpZENvbHVtbkNhY2hlZFN0eWxlIGV4dGVuZHMgQ29tbW9uR3JpZENhY2hlZFN0eWxlIHtcclxuICBsZWZ0OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR3JpZFJvd0NhY2hlZFN0eWxlIGV4dGVuZHMgQ29tbW9uR3JpZENhY2hlZFN0eWxlIHtcclxuICB0b3A6IG51bWJlcjtcclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { DirTypes, GridType } from './gridsterConfig.interface';
|
|
2
|
+
export class GridsterRenderer {
|
|
3
|
+
constructor(gridster) {
|
|
4
|
+
this.gridster = gridster;
|
|
5
|
+
/**
|
|
6
|
+
* Caches the last grid column styles.
|
|
7
|
+
* This improves the grid responsiveness by caching and reusing the last style object instead of creating a new one.
|
|
8
|
+
*/
|
|
9
|
+
this.lastGridColumnStyles = {};
|
|
10
|
+
/**
|
|
11
|
+
* Caches the last grid column styles.
|
|
12
|
+
* This improves the grid responsiveness by caching and reusing the last style object instead of creating a new one.
|
|
13
|
+
*/
|
|
14
|
+
this.lastGridRowStyles = {};
|
|
15
|
+
}
|
|
16
|
+
destroy() {
|
|
17
|
+
this.gridster = null;
|
|
18
|
+
}
|
|
19
|
+
updateItem(el, item, renderer) {
|
|
20
|
+
if (this.gridster.mobile) {
|
|
21
|
+
this.clearCellPosition(renderer, el);
|
|
22
|
+
if (this.gridster.$options.keepFixedHeightInMobile) {
|
|
23
|
+
renderer.setStyle(el, 'height', (item.rows - 1) * this.gridster.$options.margin +
|
|
24
|
+
item.rows * this.gridster.$options.fixedRowHeight +
|
|
25
|
+
'px');
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
renderer.setStyle(el, 'height', (item.rows * this.gridster.curWidth) / item.cols + 'px');
|
|
29
|
+
}
|
|
30
|
+
if (this.gridster.$options.keepFixedWidthInMobile) {
|
|
31
|
+
renderer.setStyle(el, 'width', this.gridster.$options.fixedColWidth + 'px');
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
renderer.setStyle(el, 'width', '');
|
|
35
|
+
}
|
|
36
|
+
renderer.setStyle(el, 'margin-bottom', this.gridster.$options.margin + 'px');
|
|
37
|
+
renderer.setStyle(el, DirTypes.LTR ? 'margin-right' : 'margin-left', '');
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const x = Math.round(this.gridster.curColWidth * item.x);
|
|
41
|
+
const y = Math.round(this.gridster.curRowHeight * item.y);
|
|
42
|
+
const width = this.gridster.curColWidth * item.cols - this.gridster.$options.margin;
|
|
43
|
+
const height = this.gridster.curRowHeight * item.rows - this.gridster.$options.margin;
|
|
44
|
+
// set the cell style
|
|
45
|
+
this.setCellPosition(renderer, el, x, y);
|
|
46
|
+
renderer.setStyle(el, 'width', width + 'px');
|
|
47
|
+
renderer.setStyle(el, 'height', height + 'px');
|
|
48
|
+
let marginBottom = null;
|
|
49
|
+
let marginRight = null;
|
|
50
|
+
if (this.gridster.$options.outerMargin) {
|
|
51
|
+
if (this.gridster.rows === item.rows + item.y) {
|
|
52
|
+
if (this.gridster.$options.outerMarginBottom !== null) {
|
|
53
|
+
marginBottom = this.gridster.$options.outerMarginBottom + 'px';
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
marginBottom = this.gridster.$options.margin + 'px';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (this.gridster.columns === item.cols + item.x) {
|
|
60
|
+
if (this.gridster.$options.outerMarginBottom !== null) {
|
|
61
|
+
marginRight = this.gridster.$options.outerMarginRight + 'px';
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
marginRight = this.gridster.$options.margin + 'px';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
renderer.setStyle(el, 'margin-bottom', marginBottom);
|
|
69
|
+
renderer.setStyle(el, DirTypes.LTR ? 'margin-right' : 'margin-left', marginRight);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
updateGridster() {
|
|
73
|
+
let addClass = '';
|
|
74
|
+
let removeClass1 = '';
|
|
75
|
+
let removeClass2 = '';
|
|
76
|
+
let removeClass3 = '';
|
|
77
|
+
if (this.gridster.$options.gridType === GridType.Fit) {
|
|
78
|
+
addClass = GridType.Fit;
|
|
79
|
+
removeClass1 = GridType.ScrollVertical;
|
|
80
|
+
removeClass2 = GridType.ScrollHorizontal;
|
|
81
|
+
removeClass3 = GridType.Fixed;
|
|
82
|
+
}
|
|
83
|
+
else if (this.gridster.$options.gridType === GridType.ScrollVertical) {
|
|
84
|
+
this.gridster.curRowHeight =
|
|
85
|
+
this.gridster.curColWidth * this.gridster.$options.rowHeightRatio;
|
|
86
|
+
addClass = GridType.ScrollVertical;
|
|
87
|
+
removeClass1 = GridType.Fit;
|
|
88
|
+
removeClass2 = GridType.ScrollHorizontal;
|
|
89
|
+
removeClass3 = GridType.Fixed;
|
|
90
|
+
}
|
|
91
|
+
else if (this.gridster.$options.gridType === GridType.ScrollHorizontal) {
|
|
92
|
+
const widthRatio = this.gridster.$options.rowHeightRatio;
|
|
93
|
+
const calWidthRatio = widthRatio >= 1 ? widthRatio : widthRatio + 1;
|
|
94
|
+
this.gridster.curColWidth = this.gridster.curRowHeight * calWidthRatio;
|
|
95
|
+
addClass = GridType.ScrollHorizontal;
|
|
96
|
+
removeClass1 = GridType.Fit;
|
|
97
|
+
removeClass2 = GridType.ScrollVertical;
|
|
98
|
+
removeClass3 = GridType.Fixed;
|
|
99
|
+
}
|
|
100
|
+
else if (this.gridster.$options.gridType === GridType.Fixed) {
|
|
101
|
+
this.gridster.curColWidth =
|
|
102
|
+
this.gridster.$options.fixedColWidth +
|
|
103
|
+
(this.gridster.$options.ignoreMarginInRow
|
|
104
|
+
? 0
|
|
105
|
+
: this.gridster.$options.margin);
|
|
106
|
+
this.gridster.curRowHeight =
|
|
107
|
+
this.gridster.$options.fixedRowHeight +
|
|
108
|
+
(this.gridster.$options.ignoreMarginInRow
|
|
109
|
+
? 0
|
|
110
|
+
: this.gridster.$options.margin);
|
|
111
|
+
addClass = GridType.Fixed;
|
|
112
|
+
removeClass1 = GridType.Fit;
|
|
113
|
+
removeClass2 = GridType.ScrollVertical;
|
|
114
|
+
removeClass3 = GridType.ScrollHorizontal;
|
|
115
|
+
}
|
|
116
|
+
else if (this.gridster.$options.gridType === GridType.VerticalFixed) {
|
|
117
|
+
this.gridster.curRowHeight =
|
|
118
|
+
this.gridster.$options.fixedRowHeight +
|
|
119
|
+
(this.gridster.$options.ignoreMarginInRow
|
|
120
|
+
? 0
|
|
121
|
+
: this.gridster.$options.margin);
|
|
122
|
+
addClass = GridType.ScrollVertical;
|
|
123
|
+
removeClass1 = GridType.Fit;
|
|
124
|
+
removeClass2 = GridType.ScrollHorizontal;
|
|
125
|
+
removeClass3 = GridType.Fixed;
|
|
126
|
+
}
|
|
127
|
+
else if (this.gridster.$options.gridType === GridType.HorizontalFixed) {
|
|
128
|
+
this.gridster.curColWidth =
|
|
129
|
+
this.gridster.$options.fixedColWidth +
|
|
130
|
+
(this.gridster.$options.ignoreMarginInRow
|
|
131
|
+
? 0
|
|
132
|
+
: this.gridster.$options.margin);
|
|
133
|
+
addClass = GridType.ScrollHorizontal;
|
|
134
|
+
removeClass1 = GridType.Fit;
|
|
135
|
+
removeClass2 = GridType.ScrollVertical;
|
|
136
|
+
removeClass3 = GridType.Fixed;
|
|
137
|
+
}
|
|
138
|
+
if (this.gridster.mobile ||
|
|
139
|
+
(this.gridster.$options.setGridSize &&
|
|
140
|
+
this.gridster.$options.gridType !== GridType.Fit)) {
|
|
141
|
+
this.gridster.renderer.removeClass(this.gridster.el, addClass);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
this.gridster.renderer.addClass(this.gridster.el, addClass);
|
|
145
|
+
}
|
|
146
|
+
this.gridster.renderer.removeClass(this.gridster.el, removeClass1);
|
|
147
|
+
this.gridster.renderer.removeClass(this.gridster.el, removeClass2);
|
|
148
|
+
this.gridster.renderer.removeClass(this.gridster.el, removeClass3);
|
|
149
|
+
}
|
|
150
|
+
getGridColumnStyle(i) {
|
|
151
|
+
// generates the new style
|
|
152
|
+
const newPos = {
|
|
153
|
+
left: this.gridster.curColWidth * i,
|
|
154
|
+
width: this.gridster.curColWidth - this.gridster.$options.margin,
|
|
155
|
+
height: this.gridster.gridRows.length * this.gridster.curRowHeight -
|
|
156
|
+
this.gridster.$options.margin,
|
|
157
|
+
style: {}
|
|
158
|
+
};
|
|
159
|
+
newPos.style = {
|
|
160
|
+
...this.getLeftPosition(newPos.left),
|
|
161
|
+
width: newPos.width + 'px',
|
|
162
|
+
height: newPos.height + 'px'
|
|
163
|
+
};
|
|
164
|
+
// use the last cached style if it has same values as the generated one
|
|
165
|
+
const last = this.lastGridColumnStyles[i];
|
|
166
|
+
if (last &&
|
|
167
|
+
last.left === newPos.left &&
|
|
168
|
+
last.width === newPos.width &&
|
|
169
|
+
last.height === newPos.height) {
|
|
170
|
+
return last.style;
|
|
171
|
+
}
|
|
172
|
+
// cache and set new style
|
|
173
|
+
this.lastGridColumnStyles[i] = newPos;
|
|
174
|
+
return newPos.style;
|
|
175
|
+
}
|
|
176
|
+
getGridRowStyle(i) {
|
|
177
|
+
// generates the new style
|
|
178
|
+
const newPos = {
|
|
179
|
+
top: this.gridster.curRowHeight * i,
|
|
180
|
+
width: this.gridster.gridColumns.length * this.gridster.curColWidth +
|
|
181
|
+
this.gridster.$options.margin,
|
|
182
|
+
height: this.gridster.curRowHeight - this.gridster.$options.margin,
|
|
183
|
+
style: {}
|
|
184
|
+
};
|
|
185
|
+
newPos.style = {
|
|
186
|
+
...this.getTopPosition(newPos.top),
|
|
187
|
+
width: newPos.width + 'px',
|
|
188
|
+
height: newPos.height + 'px'
|
|
189
|
+
};
|
|
190
|
+
// use the last cached style if it has same values as the generated one
|
|
191
|
+
const last = this.lastGridRowStyles[i];
|
|
192
|
+
if (last &&
|
|
193
|
+
last.top === newPos.top &&
|
|
194
|
+
last.width === newPos.width &&
|
|
195
|
+
last.height === newPos.height) {
|
|
196
|
+
return last.style;
|
|
197
|
+
}
|
|
198
|
+
// cache and set new style
|
|
199
|
+
this.lastGridRowStyles[i] = newPos;
|
|
200
|
+
return newPos.style;
|
|
201
|
+
}
|
|
202
|
+
getLeftPosition(d) {
|
|
203
|
+
const dPosition = this.gridster.$options.dirType === DirTypes.RTL ? -d : d;
|
|
204
|
+
if (this.gridster.$options.useTransformPositioning) {
|
|
205
|
+
return {
|
|
206
|
+
transform: 'translateX(' + dPosition + 'px)'
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
return {
|
|
211
|
+
left: this.getLeftMargin() + dPosition + 'px'
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
getTopPosition(d) {
|
|
216
|
+
if (this.gridster.$options.useTransformPositioning) {
|
|
217
|
+
return {
|
|
218
|
+
transform: 'translateY(' + d + 'px)'
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
return {
|
|
223
|
+
top: this.getTopMargin() + d + 'px'
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
clearCellPosition(renderer, el) {
|
|
228
|
+
if (this.gridster.$options.useTransformPositioning) {
|
|
229
|
+
renderer.setStyle(el, 'transform', '');
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
renderer.setStyle(el, 'top', '');
|
|
233
|
+
renderer.setStyle(el, 'left', '');
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
setCellPosition(renderer, el, x, y) {
|
|
237
|
+
const xPosition = this.gridster.$options.dirType === DirTypes.RTL ? -x : x;
|
|
238
|
+
if (this.gridster.$options.useTransformPositioning) {
|
|
239
|
+
const transform = 'translate3d(' + xPosition + 'px, ' + y + 'px, 0)';
|
|
240
|
+
renderer.setStyle(el, 'transform', transform);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
renderer.setStyle(el, 'left', this.getLeftMargin() + xPosition + 'px');
|
|
244
|
+
renderer.setStyle(el, 'top', this.getTopMargin() + y + 'px');
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
getLeftMargin() {
|
|
248
|
+
if (this.gridster.$options.outerMargin) {
|
|
249
|
+
if (this.gridster.$options.outerMarginLeft !== null) {
|
|
250
|
+
return this.gridster.$options.outerMarginLeft;
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
return this.gridster.$options.margin;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
return 0;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
getTopMargin() {
|
|
261
|
+
if (this.gridster.$options.outerMargin) {
|
|
262
|
+
if (this.gridster.$options.outerMarginTop !== null) {
|
|
263
|
+
return this.gridster.$options.outerMarginTop;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
return this.gridster.$options.margin;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
return 0;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJSZW5kZXJlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmEtZGFzaGJvYXJkLWZyYW1ld29yay9zcmMvZ3JpZHN0ZXIvbGliL2dyaWRzdGVyUmVuZGVyZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBUWhFLE1BQU0sT0FBTyxnQkFBZ0I7SUFhM0IsWUFBb0IsUUFBb0M7UUFBcEMsYUFBUSxHQUFSLFFBQVEsQ0FBNEI7UUFaeEQ7OztXQUdHO1FBQ0sseUJBQW9CLEdBQTBDLEVBQUUsQ0FBQztRQUV6RTs7O1dBR0c7UUFDSyxzQkFBaUIsR0FBdUMsRUFBRSxDQUFDO0lBRVIsQ0FBQztJQUU1RCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxFQUFXLEVBQUUsSUFBa0IsRUFBRSxRQUFtQjtRQUM3RCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNyQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Z0JBQ25ELFFBQVEsQ0FBQyxRQUFRLENBQ2YsRUFBRSxFQUNGLFFBQVEsRUFDUixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTTtvQkFDN0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjO29CQUNqRCxJQUFJLENBQ1AsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixRQUFR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LENBQUMsUUFBUSxDQUFDLGVBQWUsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDcEQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7WUFDaEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztJQUNILENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbkQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7WUFDL0MsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgR3JpZHN0ZXJDb21wb25lbnRJbnRlcmZhY2UgfSBmcm9tICcuL2dyaWRzdGVyLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IERpclR5cGVzLCBHcmlkVHlwZSB9IGZyb20gJy4vZ3JpZHN0ZXJDb25maWcuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJJdGVtIH0gZnJvbSAnLi9ncmlkc3Rlckl0ZW0uaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBDb21tb25HcmlkU3R5bGUsXHJcbiAgR3JpZENvbHVtbkNhY2hlZFN0eWxlLFxyXG4gIEdyaWRSb3dDYWNoZWRTdHlsZVxyXG59IGZyb20gJy4vZ3JpZHN0ZXJSZW5kZXJlci5pbnRlcmZhY2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWRzdGVyUmVuZGVyZXIge1xyXG4gIC8qKlxyXG4gICAqIENhY2hlcyB0aGUgbGFzdCBncmlkIGNvbHVtbiBzdHlsZXMuXHJcbiAgICogVGhpcyBpbXByb3ZlcyB0aGUgZ3JpZCByZXNwb25zaXZlbmVzcyBieSBjYWNoaW5nIGFuZCByZXVzaW5nIHRoZSBsYXN0IHN0eWxlIG9iamVjdCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS5cclxuICAgKi9cclxuICBwcml2YXRlIGxhc3RHcmlkQ29sdW1uU3R5bGVzOiBSZWNvcmQ8bnVtYmVyLCBHcmlkQ29sdW1uQ2FjaGVkU3R5bGU+ID0ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIENhY2hlcyB0aGUgbGFzdCBncmlkIGNvbHVtbiBzdHlsZXMuXHJcbiAgICogVGhpcyBpbXByb3ZlcyB0aGUgZ3JpZCByZXNwb25zaXZlbmVzcyBieSBjYWNoaW5nIGFuZCByZXVzaW5nIHRoZSBsYXN0IHN0eWxlIG9iamVjdCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS5cclxuICAgKi9cclxuICBwcml2YXRlIGxhc3RHcmlkUm93U3R5bGVzOiBSZWNvcmQ8bnVtYmVyLCBHcmlkUm93Q2FjaGVkU3R5bGU+ID0ge307XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZ3JpZHN0ZXI6IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlKSB7fVxyXG5cclxuICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkc3RlciA9IG51bGwhO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlSXRlbShlbDogRWxlbWVudCwgaXRlbTogR3JpZHN0ZXJJdGVtLCByZW5kZXJlcjogUmVuZGVyZXIyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5ncmlkc3Rlci5tb2JpbGUpIHtcclxuICAgICAgdGhpcy5jbGVhckNlbGxQb3NpdGlvbihyZW5kZXJlciwgZWwpO1xyXG4gICAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5rZWVwRml4ZWRIZWlnaHRJbk1vYmlsZSkge1xyXG4gICAgICAgIHJlbmRlcmVyLnNldFN0eWxlKFxyXG4gICAgICAgICAgZWwsXHJcbiAgICAgICAgICAnaGVpZ2h0JyxcclxuICAgICAgICAgIChpdGVtLnJvd3MgLSAxKSAqIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luICtcclxuICAgICAgICAgICAgaXRlbS5yb3dzICogdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5maXhlZFJvd0hlaWdodCArXHJcbiAgICAgICAgICAgICdweCdcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlbmRlcmVyLnNldFN0eWxlKFxyXG4gICAgICAgICAgZWwsXHJcbiAgICAgICAgICAnaGVpZ2h0JyxcclxuICAgICAgICAgIChpdGVtLnJvd3MgKiB0aGlzLmdyaWRzdGVyLmN1cldpZHRoKSAvIGl0ZW0uY29scyArICdweCdcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmtlZXBGaXhlZFdpZHRoSW5Nb2JpbGUpIHtcclxuICAgICAgICByZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgIGVsLFxyXG4gICAgICAgICAgJ3dpZHRoJyxcclxuICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZml4ZWRDb2xXaWR0aCArICdweCdcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCAnd2lkdGgnLCAnJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlbmRlcmVyLnNldFN0eWxlKFxyXG4gICAgICAgIGVsLFxyXG4gICAgICAgICdtYXJnaW4tYm90dG9tJyxcclxuICAgICAgICB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbiArICdweCdcclxuICAgICAgKTtcclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsIERpclR5cGVzLkxUUiA/ICdtYXJnaW4tcmlnaHQnIDogJ21hcmdpbi1sZWZ0JywgJycpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgeCA9IE1hdGgucm91bmQodGhpcy5ncmlkc3Rlci5jdXJDb2xXaWR0aCAqIGl0ZW0ueCk7XHJcbiAgICAgIGNvbnN0IHkgPSBNYXRoLnJvdW5kKHRoaXMuZ3JpZHN0ZXIuY3VyUm93SGVpZ2h0ICogaXRlbS55KTtcclxuICAgICAgY29uc3Qgd2lkdGggPVxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuY3VyQ29sV2lkdGggKiBpdGVtLmNvbHMgLSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbjtcclxuICAgICAgY29uc3QgaGVpZ2h0ID1cclxuICAgICAgICB0aGlzLmdyaWRzdGVyLmN1clJvd0hlaWdodCAqIGl0ZW0ucm93cyAtIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luO1xyXG4gICAgICAvLyBzZXQgdGhlIGNlbGwgc3R5bGVcclxuICAgICAgdGhpcy5zZXRDZWxsUG9zaXRpb24ocmVuZGVyZXIsIGVsLCB4LCB5KTtcclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICd3aWR0aCcsIHdpZHRoICsgJ3B4Jyk7XHJcbiAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCAnaGVpZ2h0JywgaGVpZ2h0ICsgJ3B4Jyk7XHJcbiAgICAgIGxldCBtYXJnaW5Cb3R0b206IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgICBsZXQgbWFyZ2luUmlnaHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpbikge1xyXG4gICAgICAgIGlmICh0aGlzLmdyaWRzdGVyLnJvd3MgPT09IGl0ZW0ucm93cyArIGl0ZW0ueSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5Cb3R0b20gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgbWFyZ2luQm90dG9tID0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpbkJvdHRvbSArICdweCc7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtYXJnaW5Cb3R0b20gPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbiArICdweCc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmdyaWRzdGVyLmNvbHVtbnMgPT09IGl0ZW0uY29scyArIGl0ZW0ueCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5Cb3R0b20gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgbWFyZ2luUmlnaHQgPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luUmlnaHQgKyAncHgnO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWFyZ2luUmlnaHQgPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbiArICdweCc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ21hcmdpbi1ib3R0b20nLCBtYXJnaW5Cb3R0b20pO1xyXG4gICAgICByZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICBlbCxcclxuICAgICAgICBEaXJUeXBlcy5MVFIgPyAnbWFyZ2luLXJpZ2h0JyA6ICdtYXJnaW4tbGVmdCcsXHJcbiAgICAgICAgbWFyZ2luUmlnaHRcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUdyaWRzdGVyKCk6IHZvaWQge1xyXG4gICAgbGV0IGFkZENsYXNzID0gJyc7XHJcbiAgICBsZXQgcmVtb3ZlQ2xhc3MxID0gJyc7XHJcbiAgICBsZXQgcmVtb3ZlQ2xhc3MyID0gJyc7XHJcbiAgICBsZXQgcmVtb3ZlQ2xhc3MzID0gJyc7XHJcbiAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gR3JpZFR5cGUuRml0KSB7XHJcbiAgICAgIGFkZENsYXNzID0gR3JpZFR5cGUuRml0O1xyXG4gICAgICByZW1vdmVDbGFzczEgPSBHcmlkVHlwZS5TY3JvbGxWZXJ0aWNhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MyID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MzID0gR3JpZFR5cGUuRml4ZWQ7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZ3JpZFR5cGUgPT09IEdyaWRUeXBlLlNjcm9sbFZlcnRpY2FsKSB7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXIuY3VyUm93SGVpZ2h0ID1cclxuICAgICAgICB0aGlzLmdyaWRzdGVyLmN1ckNvbFdpZHRoICogdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5yb3dIZWlnaHRSYXRpbztcclxuICAgICAgYWRkQ2xhc3MgPSBHcmlkVHlwZS5TY3JvbGxWZXJ0aWNhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MxID0gR3JpZFR5cGUuRml0O1xyXG4gICAgICByZW1vdmVDbGFzczIgPSBHcmlkVHlwZS5TY3JvbGxIb3Jpem9udGFsO1xyXG4gICAgICByZW1vdmVDbGFzczMgPSBHcmlkVHlwZS5GaXhlZDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbCkge1xyXG4gICAgICBjb25zdCB3aWR0aFJhdGlvID0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5yb3dIZWlnaHRSYXRpbztcclxuICAgICAgY29uc3QgY2FsV2lkdGhSYXRpbyA9IHdpZHRoUmF0aW8gPj0gMSA/IHdpZHRoUmF0aW8gOiB3aWR0aFJhdGlvICsgMTtcclxuICAgICAgdGhpcy5ncmlkc3Rlci5jdXJDb2xXaWR0aCA9IHRoaXMuZ3JpZHN0ZXIuY3VyUm93SGVpZ2h0ICogY2FsV2lkdGhSYXRpbztcclxuICAgICAgYWRkQ2xhc3MgPSBHcmlkVHlwZS5TY3JvbGxIb3Jpem9udGFsO1xyXG4gICAgICByZW1vdmVDbGFzczEgPSBHcmlkVHlwZS5GaXQ7XHJcbiAgICAgIHJlbW92ZUNsYXNzMiA9IEdyaWRUeXBlLlNjcm9sbFZlcnRpY2FsO1xyXG4gICAgICByZW1vdmVDbGFzczMgPSBHcmlkVHlwZS5GaXhlZDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gR3JpZFR5cGUuRml4ZWQpIHtcclxuICAgICAgdGhpcy5ncmlkc3Rlci5jdXJDb2xXaWR0aCA9XHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5maXhlZENvbFdpZHRoICtcclxuICAgICAgICAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5pZ25vcmVNYXJnaW5JblJvd1xyXG4gICAgICAgICAgPyAwXHJcbiAgICAgICAgICA6IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luKTtcclxuICAgICAgdGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQgPVxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZml4ZWRSb3dIZWlnaHQgK1xyXG4gICAgICAgICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmlnbm9yZU1hcmdpbkluUm93XHJcbiAgICAgICAgICA/IDBcclxuICAgICAgICAgIDogdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4pO1xyXG4gICAgICBhZGRDbGFzcyA9IEdyaWRUeXBlLkZpeGVkO1xyXG4gICAgICByZW1vdmVDbGFzczEgPSBHcmlkVHlwZS5GaXQ7XHJcbiAgICAgIHJlbW92ZUNsYXNzMiA9IEdyaWRUeXBlLlNjcm9sbFZlcnRpY2FsO1xyXG4gICAgICByZW1vdmVDbGFzczMgPSBHcmlkVHlwZS5TY3JvbGxIb3Jpem9udGFsO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmdyaWRUeXBlID09PSBHcmlkVHlwZS5WZXJ0aWNhbEZpeGVkKSB7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXIuY3VyUm93SGVpZ2h0ID1cclxuICAgICAgICB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmZpeGVkUm93SGVpZ2h0ICtcclxuICAgICAgICAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5pZ25vcmVNYXJnaW5JblJvd1xyXG4gICAgICAgICAgPyAwXHJcbiAgICAgICAgICA6IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luKTtcclxuICAgICAgYWRkQ2xhc3MgPSBHcmlkVHlwZS5TY3JvbGxWZXJ0aWNhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MxID0gR3JpZFR5cGUuRml0O1xyXG4gICAgICByZW1vdmVDbGFzczIgPSBHcmlkVHlwZS5TY3JvbGxIb3Jpem9udGFsO1xyXG4gICAgICByZW1vdmVDbGFzczMgPSBHcmlkVHlwZS5GaXhlZDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gR3JpZFR5cGUuSG9yaXpvbnRhbEZpeGVkKSB7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXIuY3VyQ29sV2lkdGggPVxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZml4ZWRDb2xXaWR0aCArXHJcbiAgICAgICAgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuaWdub3JlTWFyZ2luSW5Sb3dcclxuICAgICAgICAgID8gMFxyXG4gICAgICAgICAgOiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbik7XHJcbiAgICAgIGFkZENsYXNzID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MxID0gR3JpZFR5cGUuRml0O1xyXG4gICAgICByZW1vdmVDbGFzczIgPSBHcmlkVHlwZS5TY3JvbGxWZXJ0aWNhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MzID0gR3JpZFR5cGUuRml4ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmdyaWRzdGVyLm1vYmlsZSB8fFxyXG4gICAgICAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5zZXRHcmlkU2l6ZSAmJlxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZ3JpZFR5cGUgIT09IEdyaWRUeXBlLkZpdClcclxuICAgICkge1xyXG4gICAgICB0aGlzLmdyaWRzdGVyLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZ3JpZHN0ZXIuZWwsIGFkZENsYXNzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXIucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5ncmlkc3Rlci5lbCwgYWRkQ2xhc3MpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkc3Rlci5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmdyaWRzdGVyLmVsLCByZW1vdmVDbGFzczEpO1xyXG4gICAgdGhpcy5ncmlkc3Rlci5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmdyaWRzdGVyLmVsLCByZW1vdmVDbGFzczIpO1xyXG4gICAgdGhpcy5ncmlkc3Rlci5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmdyaWRzdGVyLmVsLCByZW1vdmVDbGFzczMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JpZENvbHVtblN0eWxlKGk6IG51bWJlcik6IENvbW1vbkdyaWRTdHlsZSB7XHJcbiAgICAvLyBnZW5lcmF0ZXMgdGhlIG5ldyBzdHlsZVxyXG4gICAgY29uc3QgbmV3UG9zOiBHcmlkQ29sdW1uQ2FjaGVkU3R5bGUgPSB7XHJcbiAgICAgIGxlZnQ6IHRoaXMuZ3JpZHN0ZXIuY3VyQ29sV2lkdGggKiBpLFxyXG4gICAgICB3aWR0aDogdGhpcy5ncmlkc3Rlci5jdXJDb2xXaWR0aCAtIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luLFxyXG4gICAgICBoZWlnaHQ6XHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5ncmlkUm93cy5sZW5ndGggKiB0aGlzLmdyaWRzdGVyLmN1clJvd0hlaWdodCAtXHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4sXHJcbiAgICAgIHN0eWxlOiB7fVxyXG4gICAgfTtcclxuICAgIG5ld1Bvcy5zdHlsZSA9IHtcclxuICAgICAgLi4udGhpcy5nZXRMZWZ0UG9zaXRpb24obmV3UG9zLmxlZnQpLFxyXG4gICAgICB3aWR0aDogbmV3UG9zLndpZHRoICsgJ3B4JyxcclxuICAgICAgaGVpZ2h0OiBuZXdQb3MuaGVpZ2h0ICsgJ3B4J1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyB1c2UgdGhlIGxhc3QgY2FjaGVkIHN0eWxlIGlmIGl0IGhhcyBzYW1lIHZhbHVlcyBhcyB0aGUgZ2VuZXJhdGVkIG9uZVxyXG4gICAgY29uc3QgbGFzdCA9IHRoaXMubGFzdEdyaWRDb2x1bW5TdHlsZXNbaV07XHJcbiAgICBpZiAoXHJcbiAgICAgIGxhc3QgJiZcclxuICAgICAgbGFzdC5sZWZ0ID09PSBuZXdQb3MubGVmdCAmJlxyXG4gICAgICBsYXN0LndpZHRoID09PSBuZXdQb3Mud2lkdGggJiZcclxuICAgICAgbGFzdC5oZWlnaHQgPT09IG5ld1Bvcy5oZWlnaHRcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gbGFzdC5zdHlsZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjYWNoZSBhbmQgc2V0IG5ldyBzdHlsZVxyXG4gICAgdGhpcy5sYXN0R3JpZENvbHVtblN0eWxlc1tpXSA9IG5ld1BvcztcclxuICAgIHJldHVybiBuZXdQb3Muc3R5bGU7XHJcbiAgfVxyXG5cclxuICBnZXRHcmlkUm93U3R5bGUoaTogbnVtYmVyKTogQ29tbW9uR3JpZFN0eWxlIHtcclxuICAgIC8vIGdlbmVyYXRlcyB0aGUgbmV3IHN0eWxlXHJcbiAgICBjb25zdCBuZXdQb3M6IEdyaWRSb3dDYWNoZWRTdHlsZSA9IHtcclxuICAgICAgdG9wOiB0aGlzLmdyaWRzdGVyLmN1clJvd0hlaWdodCAqIGksXHJcbiAgICAgIHdpZHRoOlxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuZ3JpZENvbHVtbnMubGVuZ3RoICogdGhpcy5ncmlkc3Rlci5jdXJDb2xXaWR0aCArXHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4sXHJcbiAgICAgIGhlaWdodDogdGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQgLSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbixcclxuICAgICAgc3R5bGU6IHt9XHJcbiAgICB9O1xyXG4gICAgbmV3UG9zLnN0eWxlID0ge1xyXG4gICAgICAuLi50aGlzLmdldFRvcFBvc2l0aW9uKG5ld1Bvcy50b3ApLFxyXG4gICAgICB3aWR0aDogbmV3UG9zLndpZHRoICsgJ3B4JyxcclxuICAgICAgaGVpZ2h0OiBuZXdQb3MuaGVpZ2h0ICsgJ3B4J1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyB1c2UgdGhlIGxhc3QgY2FjaGVkIHN0eWxlIGlmIGl0IGhhcyBzYW1lIHZhbHVlcyBhcyB0aGUgZ2VuZXJhdGVkIG9uZVxyXG4gICAgY29uc3QgbGFzdCA9IHRoaXMubGFzdEdyaWRSb3dTdHlsZXNbaV07XHJcbiAgICBpZiAoXHJcbiAgICAgIGxhc3QgJiZcclxuICAgICAgbGFzdC50b3AgPT09IG5ld1Bvcy50b3AgJiZcclxuICAgICAgbGFzdC53aWR0aCA9PT0gbmV3UG9zLndpZHRoICYmXHJcbiAgICAgIGxhc3QuaGVpZ2h0ID09PSBuZXdQb3MuaGVpZ2h0XHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIGxhc3Quc3R5bGU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2FjaGUgYW5kIHNldCBuZXcgc3R5bGVcclxuICAgIHRoaXMubGFzdEdyaWRSb3dTdHlsZXNbaV0gPSBuZXdQb3M7XHJcbiAgICByZXR1cm4gbmV3UG9zLnN0eWxlO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGVmdFBvc2l0aW9uKGQ6IG51bWJlcik6IHsgbGVmdDogc3RyaW5nIH0gfCB7IHRyYW5zZm9ybTogc3RyaW5nIH0ge1xyXG4gICAgY29uc3QgZFBvc2l0aW9uID0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5kaXJUeXBlID09PSBEaXJUeXBlcy5SVEwgPyAtZCA6IGQ7XHJcbiAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy51c2VUcmFuc2Zvcm1Qb3NpdGlvbmluZykge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoJyArIGRQb3NpdGlvbiArICdweCknXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxlZnQ6IHRoaXMuZ2V0TGVmdE1hcmdpbigpICsgZFBvc2l0aW9uICsgJ3B4J1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0VG9wUG9zaXRpb24oZDogbnVtYmVyKTogeyB0b3A6IHN0cmluZyB9IHwgeyB0cmFuc2Zvcm06IHN0cmluZyB9IHtcclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLnVzZVRyYW5zZm9ybVBvc2l0aW9uaW5nKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgnICsgZCArICdweCknXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHRvcDogdGhpcy5nZXRUb3BNYXJnaW4oKSArIGQgKyAncHgnXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhckNlbGxQb3NpdGlvbihyZW5kZXJlcjogUmVuZGVyZXIyLCBlbDogRWxlbWVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMudXNlVHJhbnNmb3JtUG9zaXRpb25pbmcpIHtcclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICd0cmFuc2Zvcm0nLCAnJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ3RvcCcsICcnKTtcclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICdsZWZ0JywgJycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Q2VsbFBvc2l0aW9uKFxyXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIGVsOiBFbGVtZW50LFxyXG4gICAgeDogbnVtYmVyLFxyXG4gICAgeTogbnVtYmVyXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCB4UG9zaXRpb24gPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmRpclR5cGUgPT09IERpclR5cGVzLlJUTCA/IC14IDogeDtcclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLnVzZVRyYW5zZm9ybVBvc2l0aW9uaW5nKSB7XHJcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9ICd0cmFuc2xhdGUzZCgnICsgeFBvc2l0aW9uICsgJ3B4LCAnICsgeSArICdweCwgMCknO1xyXG4gICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ3RyYW5zZm9ybScsIHRyYW5zZm9ybSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ2xlZnQnLCB0aGlzLmdldExlZnRNYXJnaW4oKSArIHhQb3NpdGlvbiArICdweCcpO1xyXG4gICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ3RvcCcsIHRoaXMuZ2V0VG9wTWFyZ2luKCkgKyB5ICsgJ3B4Jyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRMZWZ0TWFyZ2luKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpbikge1xyXG4gICAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpbkxlZnQgIT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpbkxlZnQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFRvcE1hcmdpbigpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW4pIHtcclxuICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5Ub3AgIT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpblRvcDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW47XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|