tango-app-ui-store-builder 1.0.20 → 1.0.22
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/esm2022/lib/components/fixture-overview-panel/fixture-overview-panel.component.mjs +456 -0
- package/esm2022/lib/components/fixture-template/fixture-template.component.mjs +9 -23
- package/esm2022/lib/components/manage-plano/rollout-table/rollout-table.component.mjs +179 -52
- package/esm2022/lib/components/manage-plano/verification-table/verification-table.component.mjs +200 -58
- package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +71 -9
- package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +124 -13
- package/esm2022/lib/components/manage-store-plano/rollout-feedback/rollout-feedback.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/verification-feedback/editable-fixture/editable-fixture.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +7 -6
- package/esm2022/lib/components/planogram/merch-compliance/fixture-products/fixture-products.component.mjs +3 -2
- package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +2 -1
- package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +86 -32
- package/esm2022/lib/components/planogram/plano-overview/fixture-overview/fixture-overview.component.mjs +8 -6
- package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +1382 -0
- package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +91 -7
- package/esm2022/lib/components/planogram/plano-table/plano-filter/plano-filter.component.mjs +9 -2
- package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +29 -3
- package/esm2022/lib/components/popups/complete-confirmation/complete-confirmation.component.mjs +6 -3
- package/esm2022/lib/components/store-plano/store-plano.component.mjs +99 -10
- package/esm2022/lib/interfaces/planogram.interface.mjs +1 -1
- package/esm2022/lib/services/plano-data.service.mjs +6 -1
- package/esm2022/lib/services/store-builder.service.mjs +34 -1
- package/esm2022/lib/tango-store-builder.module.mjs +13 -3
- package/esm2022/lib/tango-store-plano.module.mjs +10 -4
- package/fesm2022/tango-app-ui-store-builder.mjs +3953 -1399
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/fixture-overview-panel/fixture-overview-panel.component.d.ts +68 -0
- package/lib/components/fixture-template/fixture-template.component.d.ts +0 -1
- package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +12 -10
- package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +15 -13
- package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +5 -0
- package/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.d.ts +9 -3
- package/lib/components/planogram/plano-details-parent/plano-details-parent.component.d.ts +6 -2
- package/lib/components/planogram/plano-overview/fixture-overview/fixture-overview.component.d.ts +2 -1
- package/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.d.ts +78 -0
- package/lib/components/planogram/plano-overview/plano-overview.component.d.ts +17 -2
- package/lib/components/planogram/plano-table/plano-filter/plano-filter.component.d.ts +2 -1
- package/lib/components/planogram/plano-table/plano-table.component.d.ts +1 -0
- package/lib/components/popups/complete-confirmation/complete-confirmation.component.d.ts +2 -1
- package/lib/components/store-plano/store-plano.component.d.ts +14 -2
- package/lib/interfaces/planogram.interface.d.ts +5 -0
- package/lib/services/plano-data.service.d.ts +3 -0
- package/lib/services/store-builder.service.d.ts +9 -0
- package/lib/tango-store-builder.module.d.ts +4 -2
- package/lib/tango-store-plano.module.d.ts +3 -1
- package/package.json +1 -1
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
import { Component, EventEmitter, inject, Input, Output, } from "@angular/core";
|
|
2
|
+
import { lastValueFrom, Subject, takeUntil } from "rxjs";
|
|
3
|
+
import { NgbActiveOffcanvas, NgbTooltip } from "@ng-bootstrap/ng-bootstrap";
|
|
4
|
+
import { SHELF_COLORS } from "../../data/fixture-template.data";
|
|
5
|
+
import { rgbToHex } from "../../functions/plano.function";
|
|
6
|
+
import { NgFor, NgIf, NgStyle } from "@angular/common";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../../services/store-builder.service";
|
|
9
|
+
import * as i2 from "tango-app-ui-global";
|
|
10
|
+
import * as i3 from "../../services/plano-data.service";
|
|
11
|
+
export class FixtureOverviewPanelComponent {
|
|
12
|
+
storeBuilderService;
|
|
13
|
+
gs;
|
|
14
|
+
cd;
|
|
15
|
+
dataService;
|
|
16
|
+
activeOffcanvas = inject(NgbActiveOffcanvas);
|
|
17
|
+
fixtureDetails;
|
|
18
|
+
totalFixtures = [];
|
|
19
|
+
vmList = [];
|
|
20
|
+
floorData;
|
|
21
|
+
onClose = new EventEmitter();
|
|
22
|
+
changeFixture = new EventEmitter();
|
|
23
|
+
fixtureTemplateDetails;
|
|
24
|
+
clientId;
|
|
25
|
+
imgCDN;
|
|
26
|
+
shelfColors = SHELF_COLORS;
|
|
27
|
+
fixtureImage;
|
|
28
|
+
sectionByZones = [];
|
|
29
|
+
isPageLoading = true;
|
|
30
|
+
allFixtures = [];
|
|
31
|
+
isVMInitialized = false;
|
|
32
|
+
isBCInitialized = false;
|
|
33
|
+
destroy$ = new Subject();
|
|
34
|
+
constructor(storeBuilderService, gs, cd, dataService) {
|
|
35
|
+
this.storeBuilderService = storeBuilderService;
|
|
36
|
+
this.gs = gs;
|
|
37
|
+
this.cd = cd;
|
|
38
|
+
this.dataService = dataService;
|
|
39
|
+
}
|
|
40
|
+
ngOnInit() {
|
|
41
|
+
this.gs.environment
|
|
42
|
+
.pipe(takeUntil(this.destroy$))
|
|
43
|
+
.subscribe((env) => (this.imgCDN = env.planogramCDN));
|
|
44
|
+
this.gs.dataRangeValue
|
|
45
|
+
.pipe(takeUntil(this.destroy$))
|
|
46
|
+
.subscribe(async (data) => {
|
|
47
|
+
if (data?.client) {
|
|
48
|
+
this.clientId = data?.client;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
let headerData = JSON.parse(localStorage.getItem("header-filters"));
|
|
52
|
+
this.clientId = headerData?.client;
|
|
53
|
+
}
|
|
54
|
+
await this.getFixtureShelfDetails(this.fixtureDetails);
|
|
55
|
+
setTimeout(() => {
|
|
56
|
+
this.applyShelfColors();
|
|
57
|
+
this.handleVmPositionAndSize();
|
|
58
|
+
}, 300);
|
|
59
|
+
});
|
|
60
|
+
this.floorData?.layoutPolygon.forEach((poly) => {
|
|
61
|
+
this.allFixtures.push(...poly.fixtures);
|
|
62
|
+
});
|
|
63
|
+
this.allFixtures.push(...this.floorData?.centerFixture);
|
|
64
|
+
}
|
|
65
|
+
async ngOnChanges(changes) {
|
|
66
|
+
console.log(changes["fixtureDetails"]?.currentValue, 'changes["fixtureDetails"]?.currentValue');
|
|
67
|
+
if (changes["fixtureDetails"]?.currentValue) {
|
|
68
|
+
await this.getFixtureShelfDetails(changes["fixtureDetails"].currentValue);
|
|
69
|
+
setTimeout(() => {
|
|
70
|
+
this.applyShelfColors();
|
|
71
|
+
this.handleVmPositionAndSize();
|
|
72
|
+
}, 300);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
ngAfterViewChecked() {
|
|
76
|
+
if (!this.isBCInitialized) {
|
|
77
|
+
this.isBCInitialized = this.applyShelfColors();
|
|
78
|
+
}
|
|
79
|
+
if (!this.isVMInitialized) {
|
|
80
|
+
this.isVMInitialized = this.handleVmPositionAndSize();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async getFixtureShelfDetails(data) {
|
|
84
|
+
this.isPageLoading = true;
|
|
85
|
+
let payload = {
|
|
86
|
+
...(this.floorData?.revisionId) ? { revisionId: this.floorData?.revisionId } : { floorId: data?.floorId, planoId: data?.planoId },
|
|
87
|
+
fixtureId: data?._id
|
|
88
|
+
};
|
|
89
|
+
try {
|
|
90
|
+
const res = await lastValueFrom(this.storeBuilderService.getShelfDetails(payload));
|
|
91
|
+
if (res?.status === "success" && res?.data) {
|
|
92
|
+
this.fixtureTemplateDetails = {
|
|
93
|
+
...res?.data,
|
|
94
|
+
shelfConfig: res?.data?.shelves ?? [],
|
|
95
|
+
};
|
|
96
|
+
this.fixtureTemplateDetails.shelfConfig =
|
|
97
|
+
this.fixtureTemplateDetails.shelfConfig.map((s) => {
|
|
98
|
+
if (s.shelfType !== "shelf" && s.products?.length) {
|
|
99
|
+
s.distributedRows = this.distributeRoundRobin(s.products, s.trayRows);
|
|
100
|
+
}
|
|
101
|
+
return s;
|
|
102
|
+
});
|
|
103
|
+
this.fixtureImage = `${this.imgCDN}${this.fixtureTemplateDetails.fixtureImage}`;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.log("@@ ~ getFixtureShelfDetails [ERR]:", error);
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
console.log("test");
|
|
111
|
+
this.isPageLoading = false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
getSelectedVM(vm) {
|
|
115
|
+
return this.vmList.find((v) => v.id === vm?.vmId);
|
|
116
|
+
}
|
|
117
|
+
handleVmPositionAndSize() {
|
|
118
|
+
const viewPort = document.getElementById("body-block-sum");
|
|
119
|
+
if (!viewPort)
|
|
120
|
+
return false;
|
|
121
|
+
const bodyWidth = viewPort.offsetWidth;
|
|
122
|
+
this.fixtureTemplateDetails?.vmConfig?.forEach((e, i) => {
|
|
123
|
+
let startShelf = e?.startYPosition ?? 1;
|
|
124
|
+
let endShelf = e?.endYPosition ??
|
|
125
|
+
this.fixtureTemplateDetails?.shelfConfig?.length ??
|
|
126
|
+
1;
|
|
127
|
+
const vm = viewPort.querySelector(`#vm${i}`);
|
|
128
|
+
if (!vm)
|
|
129
|
+
return;
|
|
130
|
+
let x = 0;
|
|
131
|
+
let y = 0;
|
|
132
|
+
let yStart = 0;
|
|
133
|
+
for (let k = 1; k < startShelf; k++) {
|
|
134
|
+
const s = getShelfDiv(k);
|
|
135
|
+
if (!s)
|
|
136
|
+
return;
|
|
137
|
+
yStart += s.offsetHeight;
|
|
138
|
+
}
|
|
139
|
+
let placementHeight = 0;
|
|
140
|
+
let placementWidth = bodyWidth;
|
|
141
|
+
for (let k = startShelf; k <= endShelf; k++) {
|
|
142
|
+
const s = getShelfDiv(k);
|
|
143
|
+
if (!s)
|
|
144
|
+
return;
|
|
145
|
+
placementHeight += s.offsetHeight;
|
|
146
|
+
}
|
|
147
|
+
let defaultW = placementWidth / 3;
|
|
148
|
+
let defaultH = placementHeight / 3;
|
|
149
|
+
let width = defaultW;
|
|
150
|
+
let height = defaultH;
|
|
151
|
+
switch (e?.xZone) {
|
|
152
|
+
case "left":
|
|
153
|
+
x = 0;
|
|
154
|
+
width = defaultW;
|
|
155
|
+
break;
|
|
156
|
+
case "right":
|
|
157
|
+
width = defaultW;
|
|
158
|
+
x = bodyWidth - width;
|
|
159
|
+
break;
|
|
160
|
+
case "middle":
|
|
161
|
+
width = defaultW;
|
|
162
|
+
x = (bodyWidth - width) / 2;
|
|
163
|
+
break;
|
|
164
|
+
case "stretch":
|
|
165
|
+
width = bodyWidth;
|
|
166
|
+
x = 0;
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
switch (e?.yZone) {
|
|
170
|
+
case "top":
|
|
171
|
+
height = placementHeight < defaultH ? placementHeight - 20 : defaultH;
|
|
172
|
+
y = yStart;
|
|
173
|
+
break;
|
|
174
|
+
case "middle":
|
|
175
|
+
height = placementHeight < defaultH ? placementHeight - 20 : defaultH;
|
|
176
|
+
y = (placementHeight - height) / 2 + yStart;
|
|
177
|
+
break;
|
|
178
|
+
case "bottom":
|
|
179
|
+
height = placementHeight < defaultH ? placementHeight - 20 : defaultH;
|
|
180
|
+
y = placementHeight - height + yStart;
|
|
181
|
+
break;
|
|
182
|
+
case "stretch":
|
|
183
|
+
height = placementHeight;
|
|
184
|
+
y = yStart;
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
vm.style.width = `${width}px`;
|
|
188
|
+
vm.style.height = ` ${height}px`;
|
|
189
|
+
vm.style.transform = `translate(${x}px, ${y}px)`;
|
|
190
|
+
function getShelfDiv(k) {
|
|
191
|
+
let div = viewPort.querySelector(`#shelf${k}`);
|
|
192
|
+
if (!div)
|
|
193
|
+
div = viewPort.querySelector(`#tray${k}`);
|
|
194
|
+
return div;
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
applyShelfColors() {
|
|
200
|
+
const bodies = document.getElementById("body-block-sum");
|
|
201
|
+
if (!bodies)
|
|
202
|
+
return false;
|
|
203
|
+
const bodyChildren = Array.from(bodies?.children ?? []);
|
|
204
|
+
const shelfDivs = bodyChildren
|
|
205
|
+
.map((div) => div)
|
|
206
|
+
.filter((d) => d?.id.includes("sumShelfContainer"));
|
|
207
|
+
if (!shelfDivs)
|
|
208
|
+
return false;
|
|
209
|
+
const adjust = 253;
|
|
210
|
+
switch (this.fixtureTemplateDetails?.productResolutionLevel) {
|
|
211
|
+
case "L1": //fixture
|
|
212
|
+
shelfDivs.forEach((d) => {
|
|
213
|
+
if (d) {
|
|
214
|
+
d.style.backgroundColor = this.shelfColors[0].bg;
|
|
215
|
+
d.style.border = `1.4px solid ${this.shelfColors[0].border}`;
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
break;
|
|
219
|
+
case "L3": //section
|
|
220
|
+
{
|
|
221
|
+
const shelves = shelfDivs
|
|
222
|
+
.map((div) => div.lastElementChild?.tagName.toLowerCase() === "div"
|
|
223
|
+
? div.lastElementChild
|
|
224
|
+
: null)
|
|
225
|
+
.filter(Boolean);
|
|
226
|
+
this.constructSequentialSection(shelves);
|
|
227
|
+
const sectionArray = this.groupShelvesByZone(this.fixtureTemplateDetails?.shelfConfig ?? []);
|
|
228
|
+
const allSectionShelves = [];
|
|
229
|
+
sectionArray.forEach((se, i) => {
|
|
230
|
+
const shelfIds = se.shelves?.map((sh) => sh.replace(/\s/g, "").toLowerCase()) ??
|
|
231
|
+
[];
|
|
232
|
+
allSectionShelves.push(...shelfIds);
|
|
233
|
+
const secDivs = shelves.filter((item) => shelfIds?.includes(item?.id ?? ""));
|
|
234
|
+
secDivs.forEach((d) => {
|
|
235
|
+
if (d) {
|
|
236
|
+
d.style.backgroundColor = this.shelfColors[i].bg;
|
|
237
|
+
d.style.border = `1.4px solid ${this.shelfColors[i].border}`;
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
const unassignedShelves = shelfDivs.filter((item) => !allSectionShelves.includes(item.id));
|
|
242
|
+
unassignedShelves.forEach((d) => (d.style.backgroundColor = "white"));
|
|
243
|
+
let sectionGroupHeight = 0;
|
|
244
|
+
setTimeout(() => {
|
|
245
|
+
this.sectionByZones.forEach((sz, i) => {
|
|
246
|
+
const currentSectionHeight = sz.section.shelfDivs.reduce((h, d) => h + (d?.offsetHeight ?? 0), 0);
|
|
247
|
+
const currentSectionWidth = sz.section.shelfDivs[0]?.offsetWidth ?? 345;
|
|
248
|
+
const bc = bodies.querySelector(`#brand-category${i}`);
|
|
249
|
+
if (bc) {
|
|
250
|
+
const secBg = rgbToHex(sz.section.shelfDivs[0]?.style.backgroundColor);
|
|
251
|
+
const color = this.shelfColors.find((c) => c.bg === secBg) ??
|
|
252
|
+
this.shelfColors[i];
|
|
253
|
+
bc.style.borderColor = color.border;
|
|
254
|
+
bc.style.backgroundColor = "#fff";
|
|
255
|
+
const bcX = (currentSectionWidth - bc.offsetWidth) / 2;
|
|
256
|
+
const bcY = (currentSectionHeight - bc.offsetHeight) / 2 +
|
|
257
|
+
sectionGroupHeight;
|
|
258
|
+
bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;
|
|
259
|
+
sectionGroupHeight += currentSectionHeight;
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
}, 0);
|
|
263
|
+
}
|
|
264
|
+
break;
|
|
265
|
+
case "L2": //shelf
|
|
266
|
+
{
|
|
267
|
+
shelfDivs.forEach((div, i) => {
|
|
268
|
+
div.style.backgroundColor = this.shelfColors[i].bg;
|
|
269
|
+
div.style.border = `1.4px solid ${this.shelfColors[i].border}`;
|
|
270
|
+
const bc = div.querySelector(`#brand-category${i}`);
|
|
271
|
+
if (!bc)
|
|
272
|
+
return;
|
|
273
|
+
const bcX = (div.offsetWidth - bc.offsetWidth) / 2;
|
|
274
|
+
const bcY = (div.offsetHeight - bc.offsetHeight) / 2;
|
|
275
|
+
bc.style.borderColor = this.shelfColors[i].border;
|
|
276
|
+
bc.style.backgroundColor = this.shelfColors[i].textBg;
|
|
277
|
+
bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
break;
|
|
281
|
+
case "L4": //spot
|
|
282
|
+
{
|
|
283
|
+
shelfDivs.forEach((d) => {
|
|
284
|
+
if (d) {
|
|
285
|
+
d.style.backgroundColor = this.shelfColors[0].bg;
|
|
286
|
+
d.style.border = `1.4px solid ${this.shelfColors[0].border}`;
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
break;
|
|
291
|
+
default:
|
|
292
|
+
shelfDivs.forEach((d) => {
|
|
293
|
+
if (d) {
|
|
294
|
+
d.style.backgroundColor = this.shelfColors[0].bg;
|
|
295
|
+
d.style.border = `1.4px solid ${this.shelfColors[0].border}`;
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
constructSequentialSection(shelfDivs) {
|
|
303
|
+
const newSectionByZones = [];
|
|
304
|
+
let pZone = null;
|
|
305
|
+
for (let i = 0; i < this.fixtureTemplateDetails?.shelfConfig.length; i++) {
|
|
306
|
+
const s = this.fixtureTemplateDetails?.shelfConfig[i];
|
|
307
|
+
const zone = s.zone || "";
|
|
308
|
+
const shelfId = `${s.shelfType}${s.shelfNumber}`;
|
|
309
|
+
const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);
|
|
310
|
+
if (zone === "")
|
|
311
|
+
continue;
|
|
312
|
+
// const hasImproperProduct =
|
|
313
|
+
// (s?.products?.length ?? 0) === 0 ||
|
|
314
|
+
(s?.products ?? []).some((p) => p.status !== "proper");
|
|
315
|
+
const shelfCapacity = s.shelfType === "tray"
|
|
316
|
+
? s.productPerShelf * s.trayRows
|
|
317
|
+
: s.productPerShelf;
|
|
318
|
+
if (zone !== pZone) {
|
|
319
|
+
newSectionByZones.push({
|
|
320
|
+
zone,
|
|
321
|
+
section: {
|
|
322
|
+
brands: s.productBrandName ?? [],
|
|
323
|
+
categories: s.productCategory ?? [],
|
|
324
|
+
shelves: [shelfId],
|
|
325
|
+
shelfDivs: [shelfDiv],
|
|
326
|
+
capacity: shelfCapacity,
|
|
327
|
+
color: this.shelfColors[i],
|
|
328
|
+
// products: structuredClone(s?.products) ?? [],
|
|
329
|
+
// improper: hasImproperProduct,
|
|
330
|
+
},
|
|
331
|
+
});
|
|
332
|
+
pZone = zone;
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
const section = newSectionByZones[newSectionByZones.length - 1].section;
|
|
336
|
+
section.shelves.push(shelfId);
|
|
337
|
+
section.shelfDivs.push(shelfDiv);
|
|
338
|
+
section.capacity += shelfCapacity;
|
|
339
|
+
// if (hasImproperProduct) section.improper = true;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
this.sectionByZones = [...newSectionByZones];
|
|
343
|
+
this.cd.detectChanges();
|
|
344
|
+
}
|
|
345
|
+
groupShelvesByZone(input) {
|
|
346
|
+
const zoneMap = {};
|
|
347
|
+
for (const item of input) {
|
|
348
|
+
const zone = item?.zone ?? "";
|
|
349
|
+
const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;
|
|
350
|
+
if (!zoneMap[zone]) {
|
|
351
|
+
zoneMap[zone] = {
|
|
352
|
+
shelves: [],
|
|
353
|
+
productBrandName: this.fixtureTemplateDetails?.productResolutionLevel === "L2"
|
|
354
|
+
? item.productBrandName
|
|
355
|
+
: [],
|
|
356
|
+
productCategory: this.fixtureTemplateDetails?.productResolutionLevel === "L2"
|
|
357
|
+
? item.productCategory
|
|
358
|
+
: [],
|
|
359
|
+
zone: zone,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
zoneMap[zone]?.shelves?.push(shelfLabel);
|
|
363
|
+
}
|
|
364
|
+
return Object.values(zoneMap);
|
|
365
|
+
}
|
|
366
|
+
applySectionConfigToShelves(sections) {
|
|
367
|
+
const sectionMap = new Map();
|
|
368
|
+
for (const section of sections) {
|
|
369
|
+
for (const shelfLabel of section.shelves) {
|
|
370
|
+
sectionMap.set(shelfLabel, {
|
|
371
|
+
zone: section.zone,
|
|
372
|
+
productBrandName: section.productBrandName,
|
|
373
|
+
productCategory: section.productCategory,
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
// Apply overrides to matching shelves
|
|
378
|
+
return (this.fixtureTemplateDetails?.shelfConfig?.map((shelf) => {
|
|
379
|
+
const shelfLabel = `${shelf.shelfType} ${shelf.shelfNumber}`;
|
|
380
|
+
const override = sectionMap.get(shelfLabel);
|
|
381
|
+
return {
|
|
382
|
+
...shelf,
|
|
383
|
+
zone: override?.zone || "",
|
|
384
|
+
productBrandName: override?.productBrandName ?? [],
|
|
385
|
+
productCategory: override?.productCategory ?? [],
|
|
386
|
+
};
|
|
387
|
+
}) ?? []);
|
|
388
|
+
}
|
|
389
|
+
openZoneLevelProductModal(zoneData, level) { }
|
|
390
|
+
distributeRoundRobin(products, trayRows) {
|
|
391
|
+
const result = Array.from({ length: trayRows }, () => []);
|
|
392
|
+
products.forEach((product, index) => {
|
|
393
|
+
const trayIndex = index % trayRows;
|
|
394
|
+
result[trayIndex].push(product);
|
|
395
|
+
});
|
|
396
|
+
return result;
|
|
397
|
+
}
|
|
398
|
+
onClickClose() {
|
|
399
|
+
this.onClose.emit("");
|
|
400
|
+
}
|
|
401
|
+
async onChangeFixture(change) {
|
|
402
|
+
this.fixtureDetails = null;
|
|
403
|
+
let fixtId = this.fixtureTemplateDetails._id;
|
|
404
|
+
let indexToSelect = this.totalFixtures.findIndex((f) => f === this.fixtureTemplateDetails._id);
|
|
405
|
+
if (change === "next") {
|
|
406
|
+
if (indexToSelect == this.totalFixtures.length - 1)
|
|
407
|
+
return;
|
|
408
|
+
indexToSelect++;
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
if (indexToSelect == 0)
|
|
412
|
+
return;
|
|
413
|
+
indexToSelect--;
|
|
414
|
+
}
|
|
415
|
+
let fixtureId = this.totalFixtures[indexToSelect];
|
|
416
|
+
let fixtureData = this.allFixtures.find((ele) => ele._id.toString() == fixtureId);
|
|
417
|
+
if (!fixtureData) {
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
this.fixtureDetails = fixtureData;
|
|
421
|
+
await this.getFixtureShelfDetails(this.fixtureDetails);
|
|
422
|
+
setTimeout(() => {
|
|
423
|
+
this.applyShelfColors();
|
|
424
|
+
this.handleVmPositionAndSize();
|
|
425
|
+
}, 300);
|
|
426
|
+
this.dataService.emit({
|
|
427
|
+
currentFixture: fixtId,
|
|
428
|
+
action: change,
|
|
429
|
+
revisionId: `${this.floorData.revisionId} - ${fixtureId}`,
|
|
430
|
+
});
|
|
431
|
+
this.cd.detectChanges();
|
|
432
|
+
}
|
|
433
|
+
ngOnDestroy() {
|
|
434
|
+
this.destroy$.next();
|
|
435
|
+
this.destroy$.complete();
|
|
436
|
+
}
|
|
437
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FixtureOverviewPanelComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.GlobalStateService }, { token: i0.ChangeDetectorRef }, { token: i3.PlanoDataService }], target: i0.ɵɵFactoryTarget.Component });
|
|
438
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FixtureOverviewPanelComponent, isStandalone: true, selector: "lib-fixture-overview-panel", inputs: { fixtureDetails: "fixtureDetails", totalFixtures: "totalFixtures", vmList: "vmList", floorData: "floorData" }, outputs: { onClose: "onClose", changeFixture: "changeFixture" }, usesOnChanges: true, ngImport: i0, template: "<section id=\"fixture-product-details\" *ngIf=\"!isPageLoading\">\r\n <div class=\"offcanvas-header d-flex w-100 justify-content-between p-3 align-items-center\" (click)=\"activeOffcanvas.dismiss()\">\r\n <h4 class=\"m-0\">Fixture details</h4>\r\n <svg class=\"cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <hr>\r\n <div class=\"offcanvas-body d-flex align-items-center gap-6 px-3\">\r\n\r\n <svg (click)=\"onChangeFixture('previous')\" class=\"cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15 6L9 12L15 18\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n\r\n <h3 class=\"m-0\">{{fixtureTemplateDetails?.header?.label}}</h3>\r\n\r\n <h3 class=\"m-0 ms-auto\">{{totalFixtures.indexOf(fixtureTemplateDetails?._id) + 1}}/{{totalFixtures.length}}</h3>\r\n\r\n <svg (click)=\"onChangeFixture('next')\" class=\"cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 18L15 12L9 6\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n\r\n </div>\r\n <div class=\"hero-block\">\r\n <div class=\"row g-0 m-0 w-100\">\r\n <div class=\"col px-4\">\r\n <p>Fixture name:</p>\r\n <p>Fixture type:</p>\r\n <p>Size (Width):</p>\r\n <p>Total shelves:</p>\r\n <p>Total product capacity:</p>\r\n </div>\r\n <div class=\"col px-4\">\r\n <p><b>{{fixtureTemplateDetails?.header?.label}}</b></p>\r\n <p><b>{{fixtureTemplateDetails?.fixtureCategory}}</b></p>\r\n <p><b>{{fixtureTemplateDetails?.fixtureWidth.value}}{{fixtureTemplateDetails?.fixtureWidth.unit}}</b>\r\n </p>\r\n <p><b>{{fixtureTemplateDetails?.shelfConfig?.length}}</b></p>\r\n <p><b>{{fixtureTemplateDetails?.fixtureCapacity}}</b></p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"px-4\">\r\n <h5>Planogram design </h5>\r\n <p>Fixture designed by the planogram team</p>\r\n </div>\r\n <div id=\"vm-products-sum\" class=\"wall-viewport px-4\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div id=\"body-block-sum\" class=\"body-block\">\r\n <!----------------------------------[VM BLOCK]--------------------------------------->\r\n <div *ngIf=\"fixtureTemplateDetails?.vmConfig?.length\">\r\n <ng-container *ngFor=\"let vm of fixtureTemplateDetails?.vmConfig; let i = index\">\r\n <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n <ng-container *ngIf=\"getSelectedVM(vm) as selectedVM\">\r\n <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM?.imgUrl\"\r\n alt=\"Vm Image\" />\r\n <ng-template #placeholder>\r\n <div class=\"vm-placeholder\">\r\n <h3>{{ selectedVM?.name }}</h3>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n <div id=\"brand-category\" class=\"brand-category\" *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n <span class=\"badge draft me-1\">\r\n {{ b }}\r\n </span>\r\n </ng-container>\r\n </span>\r\n <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span class=\"badge inactive mt-1\">\r\n Capacity {{fixtureTemplateDetails?.fixtureCapacity }}\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\"\r\n (click)=\"openZoneLevelProductModal(item,'section')\">\r\n <div class=\"d-flex\">\r\n <span class=\"badge me-1\"\r\n [ngStyle]=\"{'background-color':item.section.color.textBg,'color':item.section.color.text}\">\r\n {{ item.zone }}\r\n </span>\r\n <span class=\"badge inactive\">\r\n Capacity {{ item?.section?.capacity }}\r\n </span>\r\n </div>\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n <p *ngIf=\"item?.section?.categories?.length\">\r\n <b>Categories: </b>\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n }\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <div [id]=\"'sumShelfContainer' + i\" *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"item.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <span class=\"badge inactive\">\r\n Capacity {{item?.productPerShelf }}\r\n </span>\r\n\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <!-- @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n @if(item.products.length){\r\n <div *ngFor=\"let product of item.products\" class=\"product\"\r\n [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\">\r\n @if(product.status != 'missing'){\r\n <img *ngIf=\"product?.productImageUrl; else placeholder\" [src]=\"product?.productImageUrl\"\r\n alt=\"Product Image\" />\r\n <ng-template #placeholder>\r\n <div></div>\r\n </ng-template>\r\n }\r\n </div>\r\n }@else {\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n }\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n @if(item.products.length){\r\n <div *ngFor=\"let row of item.distributedRows\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of row\" class=\"product\"\r\n [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\">\r\n @if(product.status != 'missing'){\r\n <img *ngIf=\"product?.productImageUrl; else placeholder\" [src]=\"product?.productImageUrl\"\r\n alt=\"Product Image\" />\r\n <ng-template #placeholder>\r\n <div></div>\r\n </ng-template>\r\n }\r\n </div>\r\n </div>\r\n }@else{\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }\r\n </div>\r\n } -->\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n\r\n</section>\r\n\r\n<section id=\"template-summary-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}#fixture-product-details #vm-products-sum .body-block{position:relative}#fixture-product-details #vm-products-sum .body-block .block{border:none}#fixture-product-details #vm-products-sum #fixture-level .brand-category{position:absolute;width:150px;overflow:hidden;padding:4px;border-radius:8px;border:2px solid var(--Primary-200, #99daff);background:var(--White, #fff);top:50%;left:59%;transform:translate(100%,-50%);transition:all .3s ease;cursor:pointer}#fixture-product-details #vm-products-sum #fixture-level .brand,#fixture-product-details #vm-products-sum #fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#fixture-product-details #vm-products-sum #fixture-level .category{margin-top:12px}#fixture-product-details #vm-products-sum #section-level .brand-category{position:absolute;width:150px;overflow:hidden;padding:4px;border-radius:8px;border:2px solid var(--Primary-200, #99daff);transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#fixture-product-details #vm-products-sum #section-level .brand,#fixture-product-details #vm-products-sum #section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-product-details #vm-products-sum #section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-product-details #vm-products-sum #section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-product-details #vm-products-sum #section-level .separator{margin:0 4px;font-weight:600}#fixture-product-details #vm-products-sum #section-level #body-loader{height:100%;width:100%;position:absolute;display:flex;justify-content:center;align-items:center;z-index:1;background:#fff3;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(10px)}#fixture-product-details #vm-products-sum #section-level #body-loader .loader{width:30px;height:30px;border:4px solid #f3f3f3;border-top:4px solid #00a3ff;border-radius:50%;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#fixture-product-details #vm-products-sum #shelf-level .brand-category{position:absolute;width:150px;overflow:hidden;padding:8px 4px;border-radius:8px;border:2px solid var(--Primary-200, #99daff);transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#fixture-product-details #vm-products-sum #shelf-level .brand,#fixture-product-details #vm-products-sum #shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-product-details #vm-products-sum #shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-product-details #vm-products-sum #shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-product-details #vm-products-sum #shelf-level .separator{margin:0 4px;font-weight:600}#fixture-product-details #vm-products-sum .brand-category.proper{border:1.12px solid var(--Primary-200, #32d583)!important}#fixture-product-details #vm-products-sum .footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}#fixture-product-details #vm-products-sum .footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}#fixture-product-details #vm-products-sum .sub-footer{position:relative;width:48%}#fixture-product-details #vm-products-sum img{width:100%;height:100%;display:block}#fixture-product-details #vm-products-sum .vm-block{position:absolute;width:100px;height:100px;transition:all .3s ease}#fixture-product-details #vm-products-sum .vm-block h3{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;margin:0;width:100%;text-overflow:ellipsis;overflow:hidden}#fixture-product-details #vm-products-sum .vm-placeholder{border:4px solid var(--Black, #101828);background:#f9fafb;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:8px;white-space:nowrap;overflow:hidden}#fixture-product-details .hero-block{background-color:#f9fafb;display:flex;flex-direction:column;gap:6px;padding:12px;justify-content:center;align-items:center;margin:24px 12px}#fixture-product-details .hero-block h1{font-size:18px;font-weight:600;color:#101828;margin:0}#fixture-product-details .hero-block p{font-size:14px;font-weight:400;color:#475467;margin:0 0 8px}#fixture-product-details .fixture-image{margin-bottom:12px}#fixture-product-details .fixture-image img{object-fit:contain;width:100%}\n"], dependencies: [{ kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
|
|
439
|
+
}
|
|
440
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FixtureOverviewPanelComponent, decorators: [{
|
|
441
|
+
type: Component,
|
|
442
|
+
args: [{ selector: "lib-fixture-overview-panel", standalone: true, imports: [NgbTooltip, NgFor, NgIf, NgStyle], template: "<section id=\"fixture-product-details\" *ngIf=\"!isPageLoading\">\r\n <div class=\"offcanvas-header d-flex w-100 justify-content-between p-3 align-items-center\" (click)=\"activeOffcanvas.dismiss()\">\r\n <h4 class=\"m-0\">Fixture details</h4>\r\n <svg class=\"cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <hr>\r\n <div class=\"offcanvas-body d-flex align-items-center gap-6 px-3\">\r\n\r\n <svg (click)=\"onChangeFixture('previous')\" class=\"cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15 6L9 12L15 18\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n\r\n <h3 class=\"m-0\">{{fixtureTemplateDetails?.header?.label}}</h3>\r\n\r\n <h3 class=\"m-0 ms-auto\">{{totalFixtures.indexOf(fixtureTemplateDetails?._id) + 1}}/{{totalFixtures.length}}</h3>\r\n\r\n <svg (click)=\"onChangeFixture('next')\" class=\"cursor-pointer\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 18L15 12L9 6\" stroke=\"#1D2939\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n\r\n </div>\r\n <div class=\"hero-block\">\r\n <div class=\"row g-0 m-0 w-100\">\r\n <div class=\"col px-4\">\r\n <p>Fixture name:</p>\r\n <p>Fixture type:</p>\r\n <p>Size (Width):</p>\r\n <p>Total shelves:</p>\r\n <p>Total product capacity:</p>\r\n </div>\r\n <div class=\"col px-4\">\r\n <p><b>{{fixtureTemplateDetails?.header?.label}}</b></p>\r\n <p><b>{{fixtureTemplateDetails?.fixtureCategory}}</b></p>\r\n <p><b>{{fixtureTemplateDetails?.fixtureWidth.value}}{{fixtureTemplateDetails?.fixtureWidth.unit}}</b>\r\n </p>\r\n <p><b>{{fixtureTemplateDetails?.shelfConfig?.length}}</b></p>\r\n <p><b>{{fixtureTemplateDetails?.fixtureCapacity}}</b></p>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"px-4\">\r\n <h5>Planogram design </h5>\r\n <p>Fixture designed by the planogram team</p>\r\n </div>\r\n <div id=\"vm-products-sum\" class=\"wall-viewport px-4\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div id=\"body-block-sum\" class=\"body-block\">\r\n <!----------------------------------[VM BLOCK]--------------------------------------->\r\n <div *ngIf=\"fixtureTemplateDetails?.vmConfig?.length\">\r\n <ng-container *ngFor=\"let vm of fixtureTemplateDetails?.vmConfig; let i = index\">\r\n <div [id]=\"'vm' + i\" class=\"vm-block\">\r\n <ng-container *ngIf=\"getSelectedVM(vm) as selectedVM\">\r\n <img *ngIf=\"selectedVM?.imgUrl; else placeholder\" [src]=\"selectedVM?.imgUrl\"\r\n alt=\"Vm Image\" />\r\n <ng-template #placeholder>\r\n <div class=\"vm-placeholder\">\r\n <h3>{{ selectedVM?.name }}</h3>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!----------------------------------[FIXTURE LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"fixture-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L1'\">\r\n <div id=\"brand-category\" class=\"brand-category\" *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n <span class=\"badge draft me-1\">\r\n {{ b }}\r\n </span>\r\n </ng-container>\r\n </span>\r\n <span class=\"category\" *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span class=\"badge inactive mt-1\">\r\n Capacity {{fixtureTemplateDetails?.fixtureCapacity }}\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"fixtureTemplateDetails?.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of fixtureTemplateDetails?.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <!-----------------------------------[SECTION LEVEL - BRAND CATEGORY]-------------------------------------->\r\n <div id=\"section-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L3'\">\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\"\r\n (click)=\"openZoneLevelProductModal(item,'section')\">\r\n <div class=\"d-flex\">\r\n <span class=\"badge me-1\"\r\n [ngStyle]=\"{'background-color':item.section.color.textBg,'color':item.section.color.text}\">\r\n {{ item.zone }}\r\n </span>\r\n <span class=\"badge inactive\">\r\n Capacity {{ item?.section?.capacity }}\r\n </span>\r\n </div>\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n <p *ngIf=\"item?.section?.categories?.length\">\r\n <b>Categories: </b>\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n }\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <div [id]=\"'sumShelfContainer' + i\" *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!--------------------------------[SHELF LEVEL - BRAND CATEGORY]---------------------------------------->\r\n <div id=\"shelf-level\" *ngIf=\"fixtureTemplateDetails?.productResolutionLevel === 'L2'\">\r\n <div [id]=\"'brand-category' + i\" class=\"brand-category\" *ngIf=\"item.productBrandName?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\" *ngIf=\"item.productBrandName?.length\">\r\n <ng-container *ngFor=\"let b of item.productBrandName; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span *ngIf=\"item.productCategory?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item.productCategory?.length\">\r\n <ng-container *ngFor=\"let b of item.productCategory; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of item.productBrandName; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"item.productCategory?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of item.productCategory; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <span class=\"badge inactive\">\r\n Capacity {{item?.productPerShelf }}\r\n </span>\r\n\r\n </div>\r\n </ng-template>\r\n </div>\r\n <!------------------------------------------------------------------------->\r\n\r\n <!-- @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n @if(item.products.length){\r\n <div *ngFor=\"let product of item.products\" class=\"product\"\r\n [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\">\r\n @if(product.status != 'missing'){\r\n <img *ngIf=\"product?.productImageUrl; else placeholder\" [src]=\"product?.productImageUrl\"\r\n alt=\"Product Image\" />\r\n <ng-template #placeholder>\r\n <div></div>\r\n </ng-template>\r\n }\r\n </div>\r\n }@else {\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n }\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n @if(item.products.length){\r\n <div *ngFor=\"let row of item.distributedRows\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of row\" class=\"product\"\r\n [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\">\r\n @if(product.status != 'missing'){\r\n <img *ngIf=\"product?.productImageUrl; else placeholder\" [src]=\"product?.productImageUrl\"\r\n alt=\"Product Image\" />\r\n <ng-template #placeholder>\r\n <div></div>\r\n </ng-template>\r\n }\r\n </div>\r\n </div>\r\n }@else{\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }\r\n </div>\r\n } -->\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n\r\n</section>\r\n\r\n<section id=\"template-summary-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}#fixture-product-details #vm-products-sum .body-block{position:relative}#fixture-product-details #vm-products-sum .body-block .block{border:none}#fixture-product-details #vm-products-sum #fixture-level .brand-category{position:absolute;width:150px;overflow:hidden;padding:4px;border-radius:8px;border:2px solid var(--Primary-200, #99daff);background:var(--White, #fff);top:50%;left:59%;transform:translate(100%,-50%);transition:all .3s ease;cursor:pointer}#fixture-product-details #vm-products-sum #fixture-level .brand,#fixture-product-details #vm-products-sum #fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#fixture-product-details #vm-products-sum #fixture-level .category{margin-top:12px}#fixture-product-details #vm-products-sum #section-level .brand-category{position:absolute;width:150px;overflow:hidden;padding:4px;border-radius:8px;border:2px solid var(--Primary-200, #99daff);transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#fixture-product-details #vm-products-sum #section-level .brand,#fixture-product-details #vm-products-sum #section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-product-details #vm-products-sum #section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-product-details #vm-products-sum #section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-product-details #vm-products-sum #section-level .separator{margin:0 4px;font-weight:600}#fixture-product-details #vm-products-sum #section-level #body-loader{height:100%;width:100%;position:absolute;display:flex;justify-content:center;align-items:center;z-index:1;background:#fff3;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(10px)}#fixture-product-details #vm-products-sum #section-level #body-loader .loader{width:30px;height:30px;border:4px solid #f3f3f3;border-top:4px solid #00a3ff;border-radius:50%;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#fixture-product-details #vm-products-sum #shelf-level .brand-category{position:absolute;width:150px;overflow:hidden;padding:8px 4px;border-radius:8px;border:2px solid var(--Primary-200, #99daff);transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#fixture-product-details #vm-products-sum #shelf-level .brand,#fixture-product-details #vm-products-sum #shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-product-details #vm-products-sum #shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-product-details #vm-products-sum #shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-product-details #vm-products-sum #shelf-level .separator{margin:0 4px;font-weight:600}#fixture-product-details #vm-products-sum .brand-category.proper{border:1.12px solid var(--Primary-200, #32d583)!important}#fixture-product-details #vm-products-sum .footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}#fixture-product-details #vm-products-sum .footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}#fixture-product-details #vm-products-sum .sub-footer{position:relative;width:48%}#fixture-product-details #vm-products-sum img{width:100%;height:100%;display:block}#fixture-product-details #vm-products-sum .vm-block{position:absolute;width:100px;height:100px;transition:all .3s ease}#fixture-product-details #vm-products-sum .vm-block h3{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;margin:0;width:100%;text-overflow:ellipsis;overflow:hidden}#fixture-product-details #vm-products-sum .vm-placeholder{border:4px solid var(--Black, #101828);background:#f9fafb;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:8px;white-space:nowrap;overflow:hidden}#fixture-product-details .hero-block{background-color:#f9fafb;display:flex;flex-direction:column;gap:6px;padding:12px;justify-content:center;align-items:center;margin:24px 12px}#fixture-product-details .hero-block h1{font-size:18px;font-weight:600;color:#101828;margin:0}#fixture-product-details .hero-block p{font-size:14px;font-weight:400;color:#475467;margin:0 0 8px}#fixture-product-details .fixture-image{margin-bottom:12px}#fixture-product-details .fixture-image img{object-fit:contain;width:100%}\n"] }]
|
|
443
|
+
}], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.GlobalStateService }, { type: i0.ChangeDetectorRef }, { type: i3.PlanoDataService }], propDecorators: { fixtureDetails: [{
|
|
444
|
+
type: Input
|
|
445
|
+
}], totalFixtures: [{
|
|
446
|
+
type: Input
|
|
447
|
+
}], vmList: [{
|
|
448
|
+
type: Input
|
|
449
|
+
}], floorData: [{
|
|
450
|
+
type: Input
|
|
451
|
+
}], onClose: [{
|
|
452
|
+
type: Output
|
|
453
|
+
}], changeFixture: [{
|
|
454
|
+
type: Output
|
|
455
|
+
}] } });
|
|
456
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1vdmVydmlldy1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9maXh0dXJlLW92ZXJ2aWV3LXBhbmVsL2ZpeHR1cmUtb3ZlcnZpZXctcGFuZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvZml4dHVyZS1vdmVydmlldy1wYW5lbC9maXh0dXJlLW92ZXJ2aWV3LXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBSUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFLNUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7QUFTdkQsTUFBTSxPQUFPLDZCQUE2QjtJQTJDOUI7SUFDQTtJQUNBO0lBQ0E7SUEzQ1YsZUFBZSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3BDLGNBQWMsQ0FBTTtJQUNwQixhQUFhLEdBQWEsRUFBRSxDQUFDO0lBQzdCLE1BQU0sR0FBb0IsRUFBRSxDQUFDO0lBQzdCLFNBQVMsQ0FBTTtJQUVkLE9BQU8sR0FB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QUFDO0lBQzNCLENBQUM7d0dBNWhCVSw2QkFBNkI7NEZBQTdCLDZCQUE2QixvU0NsQzFDLGlraUJBMFRVLDhyZ0JEMVJFLFVBQVUsMlRBQUUsS0FBSyxtSEFBRSxJQUFJLDZGQUFFLE9BQU87OzRGQUUvQiw2QkFBNkI7a0JBUHpDLFNBQVM7K0JBQ0UsNEJBQTRCLGNBRzFCLElBQUksV0FDUCxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQzt3TEFNbEMsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBWbUxpYnJhcnlMaXN0IH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvdm0tbGlicmFyeS5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1nbG9iYWxcIjtcclxuaW1wb3J0IHsgbGFzdFZhbHVlRnJvbSwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgTmdiQWN0aXZlT2ZmY2FudmFzLCBOZ2JUb29sdGlwIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7XHJcbiAgU2hlbGZDb25maWcsXHJcbiAgU2VjdGlvbkNvbmZpZyxcclxufSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9maXh0dXJlLXRlbXBsYXRlLmludGVyZmFjZVwiO1xyXG5pbXBvcnQgeyBTSEVMRl9DT0xPUlMgfSBmcm9tIFwiLi4vLi4vZGF0YS9maXh0dXJlLXRlbXBsYXRlLmRhdGFcIjtcclxuaW1wb3J0IHsgcmdiVG9IZXggfSBmcm9tIFwiLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uXCI7XHJcbmltcG9ydCB7IFBsYW5vRGF0YVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvcGxhbm8tZGF0YS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE5nRm9yLCBOZ0lmLCBOZ1N0eWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwibGliLWZpeHR1cmUtb3ZlcnZpZXctcGFuZWxcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2ZpeHR1cmUtb3ZlcnZpZXctcGFuZWwuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL2ZpeHR1cmUtb3ZlcnZpZXctcGFuZWwuY29tcG9uZW50LnNjc3NcIixcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtOZ2JUb29sdGlwLCBOZ0ZvciwgTmdJZiwgTmdTdHlsZV0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaXh0dXJlT3ZlcnZpZXdQYW5lbENvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveVxyXG57XHJcbiAgYWN0aXZlT2ZmY2FudmFzID0gaW5qZWN0KE5nYkFjdGl2ZU9mZmNhbnZhcyk7XHJcbiAgQElucHV0KCkgZml4dHVyZURldGFpbHM6IGFueTtcclxuICBASW5wdXQoKSB0b3RhbEZpeHR1cmVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIHZtTGlzdDogVm1MaWJyYXJ5TGlzdFtdID0gW107XHJcbiAgQElucHV0KCkgZmxvb3JEYXRhOiBhbnk7XHJcblxyXG4gIEBPdXRwdXQoKSBvbkNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGNoYW5nZUZpeHR1cmUgPSBuZXcgRXZlbnRFbWl0dGVyPHtcclxuICAgIGN1cnJlbnRGaXh0dXJlOiBzdHJpbmc7XHJcbiAgICBhY3Rpb246IFwibmV4dFwiIHwgXCJwcmV2aW91c1wiO1xyXG4gIH0+KCk7XHJcblxyXG4gIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM6IGFueTtcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG5cclxuICBpbWdDRE46IHN0cmluZztcclxuXHJcbiAgc2hlbGZDb2xvcnMgPSBTSEVMRl9DT0xPUlM7XHJcbiAgZml4dHVyZUltYWdlOiBzdHJpbmc7XHJcblxyXG4gIHNlY3Rpb25CeVpvbmVzOiB7XHJcbiAgICB6b25lOiBzdHJpbmc7XHJcbiAgICBzZWN0aW9uOiB7XHJcbiAgICAgIGJyYW5kczogc3RyaW5nW107XHJcbiAgICAgIGNhdGVnb3JpZXM6IHN0cmluZ1tdO1xyXG4gICAgICBzaGVsdmVzOiBzdHJpbmdbXTtcclxuICAgICAgc2hlbGZEaXZzOiAoSFRNTEVsZW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkKVtdO1xyXG4gICAgICBjYXBhY2l0eTogbnVtYmVyO1xyXG4gICAgICBjb2xvcjogYW55O1xyXG4gICAgfTtcclxuICB9W10gPSBbXTtcclxuXHJcbiAgaXNQYWdlTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgYWxsRml4dHVyZXM6IGFueSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGlzVk1Jbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgaXNCQ0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzdG9yZUJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBQbGFub0RhdGFTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3MuZW52aXJvbm1lbnRcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChlbnYpID0+ICh0aGlzLmltZ0NETiA9IGVudi5wbGFub2dyYW1DRE4pKTtcclxuXHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZShhc3luYyAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSBhcyBzdHJpbmdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gaGVhZGVyRGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLmdldEZpeHR1cmVTaGVsZkRldGFpbHModGhpcy5maXh0dXJlRGV0YWlscyk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2hlbGZDb2xvcnMoKTtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlVm1Qb3NpdGlvbkFuZFNpemUoKTtcclxuICAgICAgICB9LCAzMDApO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMuZmxvb3JEYXRhPy5sYXlvdXRQb2x5Z29uLmZvckVhY2goKHBvbHk6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmFsbEZpeHR1cmVzLnB1c2goLi4ucG9seS5maXh0dXJlcyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFsbEZpeHR1cmVzLnB1c2goLi4udGhpcy5mbG9vckRhdGE/LmNlbnRlckZpeHR1cmUpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc29sZS5sb2coXHJcbiAgICAgIGNoYW5nZXNbXCJmaXh0dXJlRGV0YWlsc1wiXT8uY3VycmVudFZhbHVlLFxyXG4gICAgICAnY2hhbmdlc1tcImZpeHR1cmVEZXRhaWxzXCJdPy5jdXJyZW50VmFsdWUnXHJcbiAgICApO1xyXG4gICAgaWYgKGNoYW5nZXNbXCJmaXh0dXJlRGV0YWlsc1wiXT8uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Rml4dHVyZVNoZWxmRGV0YWlscyhjaGFuZ2VzW1wiZml4dHVyZURldGFpbHNcIl0uY3VycmVudFZhbHVlKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hcHBseVNoZWxmQ29sb3JzKCk7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVWbVBvc2l0aW9uQW5kU2l6ZSgpO1xyXG4gICAgICB9LCAzMDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzQkNJbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmlzQkNJbml0aWFsaXplZCA9IHRoaXMuYXBwbHlTaGVsZkNvbG9ycygpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmlzVk1Jbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmlzVk1Jbml0aWFsaXplZCA9IHRoaXMuaGFuZGxlVm1Qb3NpdGlvbkFuZFNpemUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGdldEZpeHR1cmVTaGVsZkRldGFpbHMoZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgIC4uLih0aGlzLmZsb29yRGF0YT8ucmV2aXNpb25JZCkgPyB7cmV2aXNpb25JZDp0aGlzLmZsb29yRGF0YT8ucmV2aXNpb25JZH0gOiB7Zmxvb3JJZDpkYXRhPy5mbG9vcklkLHBsYW5vSWQ6ZGF0YT8ucGxhbm9JZH0sXHJcbiAgICAgIGZpeHR1cmVJZDogZGF0YT8uX2lkXHJcbiAgICB9O1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZ2V0U2hlbGZEZXRhaWxzKHBheWxvYWQpXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIgJiYgcmVzPy5kYXRhKSB7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzID0ge1xyXG4gICAgICAgICAgLi4ucmVzPy5kYXRhLFxyXG4gICAgICAgICAgc2hlbGZDb25maWc6IHJlcz8uZGF0YT8uc2hlbHZlcyA/PyBbXSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMuc2hlbGZDb25maWcgPVxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLnNoZWxmQ29uZmlnLm1hcCgoczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzLnNoZWxmVHlwZSAhPT0gXCJzaGVsZlwiICYmIHMucHJvZHVjdHM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIHMuZGlzdHJpYnV0ZWRSb3dzID0gdGhpcy5kaXN0cmlidXRlUm91bmRSb2JpbihcclxuICAgICAgICAgICAgICAgIHMucHJvZHVjdHMsXHJcbiAgICAgICAgICAgICAgICBzLnRyYXlSb3dzXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcztcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmZpeHR1cmVJbWFnZSA9IGAke3RoaXMuaW1nQ0ROfSR7dGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLmZpeHR1cmVJbWFnZX1gO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0Rml4dHVyZVNoZWxmRGV0YWlscyBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgY29uc29sZS5sb2coXCJ0ZXN0XCIpO1xyXG4gICAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNlbGVjdGVkVk0odm06IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMudm1MaXN0LmZpbmQoKHYpID0+IHYuaWQgPT09IHZtPy52bUlkKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVZtUG9zaXRpb25BbmRTaXplKCkge1xyXG4gICAgY29uc3Qgdmlld1BvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJvZHktYmxvY2stc3VtXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKCF2aWV3UG9ydCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IGJvZHlXaWR0aCA9IHZpZXdQb3J0Lm9mZnNldFdpZHRoO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8udm1Db25maWc/LmZvckVhY2goKGU6IGFueSwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGxldCBzdGFydFNoZWxmID0gZT8uc3RhcnRZUG9zaXRpb24gPz8gMTtcclxuXHJcbiAgICAgIGxldCBlbmRTaGVsZiA9XHJcbiAgICAgICAgZT8uZW5kWVBvc2l0aW9uID8/XHJcbiAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubGVuZ3RoID8/XHJcbiAgICAgICAgMTtcclxuXHJcbiAgICAgIGNvbnN0IHZtID0gdmlld1BvcnQucXVlcnlTZWxlY3RvcihgI3ZtJHtpfWApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBpZiAoIXZtKSByZXR1cm47XHJcblxyXG4gICAgICBsZXQgeCA9IDA7XHJcbiAgICAgIGxldCB5ID0gMDtcclxuXHJcbiAgICAgIGxldCB5U3RhcnQgPSAwO1xyXG4gICAgICBmb3IgKGxldCBrID0gMTsgayA8IHN0YXJ0U2hlbGY7IGsrKykge1xyXG4gICAgICAgIGNvbnN0IHMgPSBnZXRTaGVsZkRpdihrKTtcclxuICAgICAgICBpZiAoIXMpIHJldHVybjtcclxuXHJcbiAgICAgICAgeVN0YXJ0ICs9IHMub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgcGxhY2VtZW50SGVpZ2h0ID0gMDtcclxuICAgICAgbGV0IHBsYWNlbWVudFdpZHRoID0gYm9keVdpZHRoO1xyXG5cclxuICAgICAgZm9yIChsZXQgayA9IHN0YXJ0U2hlbGY7IGsgPD0gZW5kU2hlbGY7IGsrKykge1xyXG4gICAgICAgIGNvbnN0IHMgPSBnZXRTaGVsZkRpdihrKTtcclxuICAgICAgICBpZiAoIXMpIHJldHVybjtcclxuICAgICAgICBwbGFjZW1lbnRIZWlnaHQgKz0gcy5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBkZWZhdWx0VyA9IHBsYWNlbWVudFdpZHRoIC8gMztcclxuICAgICAgbGV0IGRlZmF1bHRIID0gcGxhY2VtZW50SGVpZ2h0IC8gMztcclxuXHJcbiAgICAgIGxldCB3aWR0aCA9IGRlZmF1bHRXO1xyXG4gICAgICBsZXQgaGVpZ2h0ID0gZGVmYXVsdEg7XHJcblxyXG4gICAgICBzd2l0Y2ggKGU/Lnhab25lKSB7XHJcbiAgICAgICAgY2FzZSBcImxlZnRcIjpcclxuICAgICAgICAgIHggPSAwO1xyXG4gICAgICAgICAgd2lkdGggPSBkZWZhdWx0VztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJyaWdodFwiOlxyXG4gICAgICAgICAgd2lkdGggPSBkZWZhdWx0VztcclxuICAgICAgICAgIHggPSBib2R5V2lkdGggLSB3aWR0aDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaWRkbGVcIjpcclxuICAgICAgICAgIHdpZHRoID0gZGVmYXVsdFc7XHJcbiAgICAgICAgICB4ID0gKGJvZHlXaWR0aCAtIHdpZHRoKSAvIDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwic3RyZXRjaFwiOlxyXG4gICAgICAgICAgd2lkdGggPSBib2R5V2lkdGg7XHJcbiAgICAgICAgICB4ID0gMDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzd2l0Y2ggKGU/Lnlab25lKSB7XHJcbiAgICAgICAgY2FzZSBcInRvcFwiOlxyXG4gICAgICAgICAgaGVpZ2h0ID0gcGxhY2VtZW50SGVpZ2h0IDwgZGVmYXVsdEggPyBwbGFjZW1lbnRIZWlnaHQgLSAyMCA6IGRlZmF1bHRIO1xyXG4gICAgICAgICAgeSA9IHlTdGFydDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaWRkbGVcIjpcclxuICAgICAgICAgIGhlaWdodCA9IHBsYWNlbWVudEhlaWdodCA8IGRlZmF1bHRIID8gcGxhY2VtZW50SGVpZ2h0IC0gMjAgOiBkZWZhdWx0SDtcclxuICAgICAgICAgIHkgPSAocGxhY2VtZW50SGVpZ2h0IC0gaGVpZ2h0KSAvIDIgKyB5U3RhcnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiYm90dG9tXCI6XHJcbiAgICAgICAgICBoZWlnaHQgPSBwbGFjZW1lbnRIZWlnaHQgPCBkZWZhdWx0SCA/IHBsYWNlbWVudEhlaWdodCAtIDIwIDogZGVmYXVsdEg7XHJcbiAgICAgICAgICB5ID0gcGxhY2VtZW50SGVpZ2h0IC0gaGVpZ2h0ICsgeVN0YXJ0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcInN0cmV0Y2hcIjpcclxuICAgICAgICAgIGhlaWdodCA9IHBsYWNlbWVudEhlaWdodDtcclxuICAgICAgICAgIHkgPSB5U3RhcnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgdm0uc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgIHZtLnN0eWxlLmhlaWdodCA9IGAgJHtoZWlnaHR9cHhgO1xyXG4gICAgICB2bS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWA7XHJcblxyXG4gICAgICBmdW5jdGlvbiBnZXRTaGVsZkRpdihrOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZGl2ID0gdmlld1BvcnQucXVlcnlTZWxlY3RvcihgI3NoZWxmJHtrfWApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmICghZGl2KSBkaXYgPSB2aWV3UG9ydC5xdWVyeVNlbGVjdG9yKGAjdHJheSR7a31gKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICByZXR1cm4gZGl2IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlTaGVsZkNvbG9ycygpIHtcclxuICAgIGNvbnN0IGJvZGllcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYm9keS1ibG9jay1zdW1cIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIWJvZGllcykgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IGJvZHlDaGlsZHJlbiA9IEFycmF5LmZyb20oYm9kaWVzPy5jaGlsZHJlbiA/PyBbXSkgYXMgSFRNTEVsZW1lbnRbXTtcclxuXHJcbiAgICBjb25zdCBzaGVsZkRpdnMgPSBib2R5Q2hpbGRyZW5cclxuICAgICAgLm1hcCgoZGl2KSA9PiBkaXYgYXMgSFRNTEVsZW1lbnQpXHJcbiAgICAgIC5maWx0ZXIoKGQpID0+IGQ/LmlkLmluY2x1ZGVzKFwic3VtU2hlbGZDb250YWluZXJcIikpO1xyXG5cclxuICAgIGlmICghc2hlbGZEaXZzKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgYWRqdXN0ID0gMjUzO1xyXG4gICAgc3dpdGNoICh0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwpIHtcclxuICAgICAgY2FzZSBcIkwxXCI6IC8vZml4dHVyZVxyXG4gICAgICAgIHNoZWxmRGl2cy5mb3JFYWNoKChkKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZCkge1xyXG4gICAgICAgICAgICBkLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuc2hlbGZDb2xvcnNbMF0uYmc7XHJcbiAgICAgICAgICAgIGQuc3R5bGUuYm9yZGVyID0gYDEuNHB4IHNvbGlkICAke3RoaXMuc2hlbGZDb2xvcnNbMF0uYm9yZGVyfWA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiTDNcIjogLy9zZWN0aW9uXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29uc3Qgc2hlbHZlcyA9IHNoZWxmRGl2c1xyXG4gICAgICAgICAgICAubWFwKChkaXYpID0+XHJcbiAgICAgICAgICAgICAgZGl2Lmxhc3RFbGVtZW50Q2hpbGQ/LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJkaXZcIlxyXG4gICAgICAgICAgICAgICAgPyAoZGl2Lmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICA6IG51bGxcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xyXG5cclxuICAgICAgICAgIHRoaXMuY29uc3RydWN0U2VxdWVudGlhbFNlY3Rpb24oc2hlbHZlcyk7XHJcbiAgICAgICAgICBjb25zdCBzZWN0aW9uQXJyYXkgPSB0aGlzLmdyb3VwU2hlbHZlc0J5Wm9uZShcclxuICAgICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZyA/PyBbXVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNvbnN0IGFsbFNlY3Rpb25TaGVsdmVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgICAgICAgIHNlY3Rpb25BcnJheS5mb3JFYWNoKChzZSwgaSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzaGVsZklkcyA9XHJcbiAgICAgICAgICAgICAgc2Uuc2hlbHZlcz8ubWFwKChzaCkgPT4gc2gucmVwbGFjZSgvXFxzL2csIFwiXCIpLnRvTG93ZXJDYXNlKCkpID8/XHJcbiAgICAgICAgICAgICAgW107XHJcbiAgICAgICAgICAgIGFsbFNlY3Rpb25TaGVsdmVzLnB1c2goLi4uc2hlbGZJZHMpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWNEaXZzID0gc2hlbHZlcy5maWx0ZXIoKGl0ZW0pID0+XHJcbiAgICAgICAgICAgICAgc2hlbGZJZHM/LmluY2x1ZGVzKGl0ZW0/LmlkID8/IFwiXCIpXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBzZWNEaXZzLmZvckVhY2goKGQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoZCkge1xyXG4gICAgICAgICAgICAgICAgZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzW2ldLmJnO1xyXG4gICAgICAgICAgICAgICAgZC5zdHlsZS5ib3JkZXIgPSBgMS40cHggc29saWQgICR7dGhpcy5zaGVsZkNvbG9yc1tpXS5ib3JkZXJ9YDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgdW5hc3NpZ25lZFNoZWx2ZXMgPSBzaGVsZkRpdnMuZmlsdGVyKFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gIWFsbFNlY3Rpb25TaGVsdmVzLmluY2x1ZGVzKGl0ZW0uaWQpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdW5hc3NpZ25lZFNoZWx2ZXMuZm9yRWFjaCgoZCkgPT4gKGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCJ3aGl0ZVwiKSk7XHJcblxyXG4gICAgICAgICAgbGV0IHNlY3Rpb25Hcm91cEhlaWdodCA9IDA7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZWN0aW9uQnlab25lcy5mb3JFYWNoKChzeiwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZWN0aW9uSGVpZ2h0ID0gc3ouc2VjdGlvbi5zaGVsZkRpdnMucmVkdWNlKFxyXG4gICAgICAgICAgICAgICAgKGgsIGQpID0+IGggKyAoZD8ub2Zmc2V0SGVpZ2h0ID8/IDApLFxyXG4gICAgICAgICAgICAgICAgMFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNlY3Rpb25XaWR0aCA9XHJcbiAgICAgICAgICAgICAgICBzei5zZWN0aW9uLnNoZWxmRGl2c1swXT8ub2Zmc2V0V2lkdGggPz8gMzQ1O1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBiYyA9IGJvZGllcy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcclxuICAgICAgICAgICAgICAgIGAjYnJhbmQtY2F0ZWdvcnkke2l9YFxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChiYykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VjQmcgPSByZ2JUb0hleChcclxuICAgICAgICAgICAgICAgICAgc3ouc2VjdGlvbi5zaGVsZkRpdnNbMF0/LnN0eWxlLmJhY2tncm91bmRDb2xvclxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9yID1cclxuICAgICAgICAgICAgICAgICAgdGhpcy5zaGVsZkNvbG9ycy5maW5kKChjKSA9PiBjLmJnID09PSBzZWNCZykgPz9cclxuICAgICAgICAgICAgICAgICAgdGhpcy5zaGVsZkNvbG9yc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBiYy5zdHlsZS5ib3JkZXJDb2xvciA9IGNvbG9yLmJvcmRlcjtcclxuICAgICAgICAgICAgICAgIGJjLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiI2ZmZlwiO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGJjWCA9IChjdXJyZW50U2VjdGlvbldpZHRoIC0gYmMub2Zmc2V0V2lkdGgpIC8gMjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJjWSA9XHJcbiAgICAgICAgICAgICAgICAgIChjdXJyZW50U2VjdGlvbkhlaWdodCAtIGJjLm9mZnNldEhlaWdodCkgLyAyICtcclxuICAgICAgICAgICAgICAgICAgc2VjdGlvbkdyb3VwSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgYmMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2JjWCArIGFkanVzdH1weCwgJHtiY1l9cHgpYDtcclxuXHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uR3JvdXBIZWlnaHQgKz0gY3VycmVudFNlY3Rpb25IZWlnaHQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiTDJcIjogLy9zaGVsZlxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHNoZWxmRGl2cy5mb3JFYWNoKChkaXYsIGkpID0+IHtcclxuICAgICAgICAgICAgZGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuc2hlbGZDb2xvcnNbaV0uYmc7XHJcbiAgICAgICAgICAgIGRpdi5zdHlsZS5ib3JkZXIgPSBgMS40cHggc29saWQgJHt0aGlzLnNoZWxmQ29sb3JzW2ldLmJvcmRlcn1gO1xyXG4gICAgICAgICAgICBjb25zdCBiYyA9IGRpdi5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgI2JyYW5kLWNhdGVnb3J5JHtpfWApO1xyXG4gICAgICAgICAgICBpZiAoIWJjKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCBiY1ggPSAoZGl2Lm9mZnNldFdpZHRoIC0gYmMub2Zmc2V0V2lkdGgpIC8gMjtcclxuICAgICAgICAgICAgY29uc3QgYmNZID0gKGRpdi5vZmZzZXRIZWlnaHQgLSBiYy5vZmZzZXRIZWlnaHQpIC8gMjtcclxuXHJcbiAgICAgICAgICAgIGJjLnN0eWxlLmJvcmRlckNvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5ib3JkZXI7XHJcbiAgICAgICAgICAgIGJjLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuc2hlbGZDb2xvcnNbaV0udGV4dEJnO1xyXG4gICAgICAgICAgICBiYy5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7YmNYICsgYWRqdXN0fXB4LCAke2JjWX1weClgO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiTDRcIjogLy9zcG90XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgc2hlbGZEaXZzLmZvckVhY2goKGQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGQpIHtcclxuICAgICAgICAgICAgICBkLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuc2hlbGZDb2xvcnNbMF0uYmc7XHJcbiAgICAgICAgICAgICAgZC5zdHlsZS5ib3JkZXIgPSBgMS40cHggc29saWQgJHt0aGlzLnNoZWxmQ29sb3JzWzBdLmJvcmRlcn1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgc2hlbGZEaXZzLmZvckVhY2goKGQpID0+IHtcclxuICAgICAgICAgIGlmIChkKSB7XHJcbiAgICAgICAgICAgIGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1swXS5iZztcclxuICAgICAgICAgICAgZC5zdHlsZS5ib3JkZXIgPSBgMS40cHggc29saWQgJHt0aGlzLnNoZWxmQ29sb3JzWzBdLmJvcmRlcn1gO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0U2VxdWVudGlhbFNlY3Rpb24oc2hlbGZEaXZzOiAoSFRNTEVsZW1lbnQgfCBudWxsKVtdKSB7XHJcbiAgICBjb25zdCBuZXdTZWN0aW9uQnlab25lcyA9IFtdO1xyXG4gICAgbGV0IHBab25lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgcyA9IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWdbaV07XHJcbiAgICAgIGNvbnN0IHpvbmUgPSBzLnpvbmUgfHwgXCJcIjtcclxuICAgICAgY29uc3Qgc2hlbGZJZCA9IGAke3Muc2hlbGZUeXBlfSR7cy5zaGVsZk51bWJlcn1gO1xyXG4gICAgICBjb25zdCBzaGVsZkRpdiA9IHNoZWxmRGl2cy5maW5kKChkKSA9PiBkPy5pZCA9PT0gc2hlbGZJZCk7XHJcblxyXG4gICAgICBpZiAoem9uZSA9PT0gXCJcIikgY29udGludWU7XHJcblxyXG4gICAgICAvLyBjb25zdCBoYXNJbXByb3BlclByb2R1Y3QgPVxyXG4gICAgICAvLyAgIChzPy5wcm9kdWN0cz8ubGVuZ3RoID8/IDApID09PSAwIHx8XHJcbiAgICAgIChzPy5wcm9kdWN0cyA/PyBbXSkuc29tZSgocDogYW55KSA9PiBwLnN0YXR1cyAhPT0gXCJwcm9wZXJcIik7XHJcbiAgICAgIGNvbnN0IHNoZWxmQ2FwYWNpdHkgPVxyXG4gICAgICAgIHMuc2hlbGZUeXBlID09PSBcInRyYXlcIlxyXG4gICAgICAgICAgPyBzLnByb2R1Y3RQZXJTaGVsZiAqIHMudHJheVJvd3NcclxuICAgICAgICAgIDogcy5wcm9kdWN0UGVyU2hlbGY7XHJcbiAgICAgIGlmICh6b25lICE9PSBwWm9uZSkge1xyXG4gICAgICAgIG5ld1NlY3Rpb25CeVpvbmVzLnB1c2goe1xyXG4gICAgICAgICAgem9uZSxcclxuICAgICAgICAgIHNlY3Rpb246IHtcclxuICAgICAgICAgICAgYnJhbmRzOiBzLnByb2R1Y3RCcmFuZE5hbWUgPz8gW10sXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IHMucHJvZHVjdENhdGVnb3J5ID8/IFtdLFxyXG4gICAgICAgICAgICBzaGVsdmVzOiBbc2hlbGZJZF0sXHJcbiAgICAgICAgICAgIHNoZWxmRGl2czogW3NoZWxmRGl2XSxcclxuICAgICAgICAgICAgY2FwYWNpdHk6IHNoZWxmQ2FwYWNpdHksXHJcbiAgICAgICAgICAgIGNvbG9yOiB0aGlzLnNoZWxmQ29sb3JzW2ldLFxyXG4gICAgICAgICAgICAvLyBwcm9kdWN0czogc3RydWN0dXJlZENsb25lKHM/LnByb2R1Y3RzKSA/PyBbXSxcclxuICAgICAgICAgICAgLy8gaW1wcm9wZXI6IGhhc0ltcHJvcGVyUHJvZHVjdCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcFpvbmUgPSB6b25lO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSBuZXdTZWN0aW9uQnlab25lc1tuZXdTZWN0aW9uQnlab25lcy5sZW5ndGggLSAxXS5zZWN0aW9uO1xyXG4gICAgICAgIHNlY3Rpb24uc2hlbHZlcy5wdXNoKHNoZWxmSWQpO1xyXG4gICAgICAgIHNlY3Rpb24uc2hlbGZEaXZzLnB1c2goc2hlbGZEaXYpO1xyXG4gICAgICAgIHNlY3Rpb24uY2FwYWNpdHkgKz0gc2hlbGZDYXBhY2l0eTtcclxuICAgICAgICAvLyBpZiAoaGFzSW1wcm9wZXJQcm9kdWN0KSBzZWN0aW9uLmltcHJvcGVyID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VjdGlvbkJ5Wm9uZXMgPSBbLi4ubmV3U2VjdGlvbkJ5Wm9uZXNdO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBncm91cFNoZWx2ZXNCeVpvbmUoaW5wdXQ6IFNoZWxmQ29uZmlnW10pOiBTZWN0aW9uQ29uZmlnW10ge1xyXG4gICAgY29uc3Qgem9uZU1hcDogeyBbem9uZTogc3RyaW5nXTogU2VjdGlvbkNvbmZpZyB9ID0ge307XHJcblxyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGlucHV0KSB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSBpdGVtPy56b25lID8/IFwiXCI7XHJcbiAgICAgIGNvbnN0IHNoZWxmTGFiZWwgPSBgJHtpdGVtLnNoZWxmVHlwZX0gJHtpdGVtLnNoZWxmTnVtYmVyfWA7XHJcblxyXG4gICAgICBpZiAoIXpvbmVNYXBbem9uZV0pIHtcclxuICAgICAgICB6b25lTWFwW3pvbmVdID0ge1xyXG4gICAgICAgICAgc2hlbHZlczogW10sXHJcbiAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOlxyXG4gICAgICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09IFwiTDJcIlxyXG4gICAgICAgICAgICAgID8gaXRlbS5wcm9kdWN0QnJhbmROYW1lXHJcbiAgICAgICAgICAgICAgOiBbXSxcclxuICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTpcclxuICAgICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSBcIkwyXCJcclxuICAgICAgICAgICAgICA/IGl0ZW0ucHJvZHVjdENhdGVnb3J5XHJcbiAgICAgICAgICAgICAgOiBbXSxcclxuICAgICAgICAgIHpvbmU6IHpvbmUsXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgem9uZU1hcFt6b25lXT8uc2hlbHZlcz8ucHVzaChzaGVsZkxhYmVsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh6b25lTWFwKTtcclxuICB9XHJcblxyXG4gIGFwcGx5U2VjdGlvbkNvbmZpZ1RvU2hlbHZlcyhzZWN0aW9uczogU2VjdGlvbkNvbmZpZ1tdKTogU2hlbGZDb25maWdbXSB7XHJcbiAgICBjb25zdCBzZWN0aW9uTWFwID0gbmV3IE1hcDxcclxuICAgICAgc3RyaW5nLFxyXG4gICAgICBQaWNrPFNlY3Rpb25Db25maWcsIFwiem9uZVwiIHwgXCJwcm9kdWN0QnJhbmROYW1lXCIgfCBcInByb2R1Y3RDYXRlZ29yeVwiPlxyXG4gICAgPigpO1xyXG5cclxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xyXG4gICAgICBmb3IgKGNvbnN0IHNoZWxmTGFiZWwgb2Ygc2VjdGlvbi5zaGVsdmVzISkge1xyXG4gICAgICAgIHNlY3Rpb25NYXAuc2V0KHNoZWxmTGFiZWwsIHtcclxuICAgICAgICAgIHpvbmU6IHNlY3Rpb24uem9uZSxcclxuICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IHNlY3Rpb24ucHJvZHVjdEJyYW5kTmFtZSxcclxuICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogc2VjdGlvbi5wcm9kdWN0Q2F0ZWdvcnksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBBcHBseSBvdmVycmlkZXMgdG8gbWF0Y2hpbmcgc2hlbHZlc1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubWFwKChzaGVsZjogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc2hlbGZMYWJlbCA9IGAke3NoZWxmLnNoZWxmVHlwZX0gJHtzaGVsZi5zaGVsZk51bWJlcn1gO1xyXG4gICAgICAgIGNvbnN0IG92ZXJyaWRlID0gc2VjdGlvbk1hcC5nZXQoc2hlbGZMYWJlbCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5zaGVsZixcclxuICAgICAgICAgIHpvbmU6IG92ZXJyaWRlPy56b25lIHx8IFwiXCIsXHJcbiAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOiBvdmVycmlkZT8ucHJvZHVjdEJyYW5kTmFtZSA/PyBbXSxcclxuICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogb3ZlcnJpZGU/LnByb2R1Y3RDYXRlZ29yeSA/PyBbXSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KSA/PyBbXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG9wZW5ab25lTGV2ZWxQcm9kdWN0TW9kYWwoem9uZURhdGE6IGFueSwgbGV2ZWw6IHN0cmluZykge31cclxuXHJcbiAgZGlzdHJpYnV0ZVJvdW5kUm9iaW4ocHJvZHVjdHM6IGFueSwgdHJheVJvd3M6IG51bWJlcikge1xyXG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0cmF5Um93cyB9LCAoKSA9PiBbXSk7XHJcblxyXG4gICAgcHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRyYXlJbmRleCA9IGluZGV4ICUgdHJheVJvd3M7XHJcbiAgICAgIHJlc3VsdFt0cmF5SW5kZXhdLnB1c2gocHJvZHVjdCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgb25DbGlja0Nsb3NlKCkge1xyXG4gICAgdGhpcy5vbkNsb3NlLmVtaXQoXCJcIik7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNoYW5nZUZpeHR1cmUoY2hhbmdlOiBcIm5leHRcIiB8IFwicHJldmlvdXNcIikge1xyXG4gICAgdGhpcy5maXh0dXJlRGV0YWlscyA9IG51bGw7XHJcbiAgICBsZXQgZml4dElkID0gdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLl9pZDtcclxuICAgIGxldCBpbmRleFRvU2VsZWN0ID0gdGhpcy50b3RhbEZpeHR1cmVzLmZpbmRJbmRleChcclxuICAgICAgKGY6IGFueSkgPT4gZiA9PT0gdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLl9pZFxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoY2hhbmdlID09PSBcIm5leHRcIikge1xyXG4gICAgICBpZiAoaW5kZXhUb1NlbGVjdCA9PSB0aGlzLnRvdGFsRml4dHVyZXMubGVuZ3RoIC0gMSkgcmV0dXJuO1xyXG4gICAgICBpbmRleFRvU2VsZWN0Kys7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoaW5kZXhUb1NlbGVjdCA9PSAwKSByZXR1cm47XHJcbiAgICAgIGluZGV4VG9TZWxlY3QtLTtcclxuICAgIH1cclxuICAgIGxldCBmaXh0dXJlSWQgPSB0aGlzLnRvdGFsRml4dHVyZXNbaW5kZXhUb1NlbGVjdF07XHJcblxyXG4gICAgbGV0IGZpeHR1cmVEYXRhID0gdGhpcy5hbGxGaXh0dXJlcy5maW5kKFxyXG4gICAgICAoZWxlOiBhbnkpID0+IGVsZS5faWQudG9TdHJpbmcoKSA9PSBmaXh0dXJlSWRcclxuICAgICk7XHJcbiAgICBpZiAoIWZpeHR1cmVEYXRhKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZml4dHVyZURldGFpbHMgPSBmaXh0dXJlRGF0YTtcclxuICAgIGF3YWl0IHRoaXMuZ2V0Rml4dHVyZVNoZWxmRGV0YWlscyh0aGlzLmZpeHR1cmVEZXRhaWxzKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmFwcGx5U2hlbGZDb2xvcnMoKTtcclxuICAgICAgdGhpcy5oYW5kbGVWbVBvc2l0aW9uQW5kU2l6ZSgpO1xyXG4gICAgfSwgMzAwKTtcclxuICAgIHRoaXMuZGF0YVNlcnZpY2UuZW1pdCh7XHJcbiAgICAgIGN1cnJlbnRGaXh0dXJlOiBmaXh0SWQsXHJcbiAgICAgIGFjdGlvbjogY2hhbmdlLFxyXG4gICAgICByZXZpc2lvbklkOiBgJHt0aGlzLmZsb29yRGF0YS5yZXZpc2lvbklkfSAtICR7Zml4dHVyZUlkfWAsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gaWQ9XCJmaXh0dXJlLXByb2R1Y3QtZGV0YWlsc1wiICpuZ0lmPVwiIWlzUGFnZUxvYWRpbmdcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJvZmZjYW52YXMtaGVhZGVyIGQtZmxleCB3LTEwMCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBwLTMgYWxpZ24taXRlbXMtY2VudGVyXCIgKGNsaWNrKT1cImFjdGl2ZU9mZmNhbnZhcy5kaXNtaXNzKClcIj5cclxuICAgICAgICA8aDQgY2xhc3M9XCJtLTBcIj5GaXh0dXJlIGRldGFpbHM8L2g0PlxyXG4gICAgICAgIDxzdmcgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGhyPlxyXG4gICAgPGRpdiBjbGFzcz1cIm9mZmNhbnZhcy1ib2R5IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTYgcHgtM1wiPlxyXG5cclxuICAgICAgICA8c3ZnIChjbGljayk9XCJvbkNoYW5nZUZpeHR1cmUoJ3ByZXZpb3VzJylcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTE1IDZMOSAxMkwxNSAxOFwiIHN0cm9rZT1cIiMxRDI5MzlcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcblxyXG5cclxuICAgICAgICA8aDMgY2xhc3M9XCJtLTBcIj57e2ZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8ubGFiZWx9fTwvaDM+XHJcblxyXG4gICAgICAgIDxoMyBjbGFzcz1cIm0tMCBtcy1hdXRvXCI+e3t0b3RhbEZpeHR1cmVzLmluZGV4T2YoZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uX2lkKSArIDF9fS97e3RvdGFsRml4dHVyZXMubGVuZ3RofX08L2gzPlxyXG5cclxuICAgICAgICA8c3ZnIChjbGljayk9XCJvbkNoYW5nZUZpeHR1cmUoJ25leHQnKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAxOEwxNSAxMkw5IDZcIiBzdHJva2U9XCIjMUQyOTM5XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG5cclxuXHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJoZXJvLWJsb2NrXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTAgbS0wIHctMTAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgcHgtNFwiPlxyXG4gICAgICAgICAgICAgICAgPHA+Rml4dHVyZSBuYW1lOjwvcD5cclxuICAgICAgICAgICAgICAgIDxwPkZpeHR1cmUgdHlwZTo8L3A+XHJcbiAgICAgICAgICAgICAgICA8cD5TaXplIChXaWR0aCk6PC9wPlxyXG4gICAgICAgICAgICAgICAgPHA+VG90YWwgc2hlbHZlczo8L3A+XHJcbiAgICAgICAgICAgICAgICA8cD5Ub3RhbCBwcm9kdWN0IGNhcGFjaXR5OjwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgcHgtNFwiPlxyXG4gICAgICAgICAgICAgICAgPHA+PGI+e3tmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmxhYmVsfX08L2I+PC9wPlxyXG4gICAgICAgICAgICAgICAgPHA+PGI+e3tmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlQ2F0ZWdvcnl9fTwvYj48L3A+XHJcbiAgICAgICAgICAgICAgICA8cD48Yj57e2ZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aC52YWx1ZX19e3tmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlV2lkdGgudW5pdH19PC9iPlxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgPHA+PGI+e3tmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubGVuZ3RofX08L2I+PC9wPlxyXG4gICAgICAgICAgICAgICAgPHA+PGI+e3tmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlQ2FwYWNpdHl9fTwvYj48L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHgtNFwiPlxyXG4gICAgICAgIDxoNT5QbGFub2dyYW0gZGVzaWduIDwvaDU+XHJcbiAgICAgICAgPHA+Rml4dHVyZSBkZXNpZ25lZCBieSB0aGUgcGxhbm9ncmFtIHRlYW08L3A+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgaWQ9XCJ2bS1wcm9kdWN0cy1zdW1cIiBjbGFzcz1cIndhbGwtdmlld3BvcnQgcHgtNFwiPlxyXG4gICAgICAgIDwhLS0gSGVhZGVyIGJsb2NrIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYmxvY2tcIlxyXG4gICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIj5cclxuICAgICAgICAgICAgPHA+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uaGVhZGVyPy5sYWJlbCB9fTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBCb2R5IGJsb2NrIC0tPlxyXG4gICAgICAgIDxkaXYgaWQ9XCJib2R5LWJsb2NrLXN1bVwiIGNsYXNzPVwiYm9keS1ibG9ja1wiPlxyXG4gICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bVk0gQkxPQ0tdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8udm1Db25maWc/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdm0gb2YgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8udm1Db25maWc7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCIndm0nICsgaVwiIGNsYXNzPVwidm0tYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFNlbGVjdGVkVk0odm0pIGFzIHNlbGVjdGVkVk1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJzZWxlY3RlZFZNPy5pbWdVcmw7IGVsc2UgcGxhY2Vob2xkZXJcIiBbc3JjXT1cInNlbGVjdGVkVk0/LmltZ1VybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiVm0gSW1hZ2VcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFjZWhvbGRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm0tcGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPnt7IHNlbGVjdGVkVk0/Lm5hbWUgfX08L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bRklYVFVSRSBMRVZFTCAtIEJSQU5EIENBVEVHT1JZXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwiZml4dHVyZS1sZXZlbFwiICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gJ0wxJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cImJyYW5kLWNhdGVnb3J5XCIgY2xhc3M9XCJicmFuZC1jYXRlZ29yeVwiICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdEJyYW5kTmFtZT8ubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCJicmFuZENhdGVnb3J5VG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYiBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0QnJhbmROYW1lOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgZHJhZnQgbWUtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnlcIiAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RDYXRlZ29yeT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdENhdGVnb3J5OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGluYWN0aXZlIG10LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQ2FwYWNpdHkge3tmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlQ2FwYWNpdHkgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYnJhbmRDYXRlZ29yeVRvb2x0aXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5CcmFuZHM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdEJyYW5kTmFtZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RDYXRlZ29yeT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5DYXRlZ29yaWVzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RDYXRlZ29yeTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bU0VDVElPTiBMRVZFTCAtIEJSQU5EIENBVEVHT1JZXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwic2VjdGlvbi1sZXZlbFwiICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gJ0wzJ1wiPlxyXG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBzZWN0aW9uQnlab25lczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCInYnJhbmQtY2F0ZWdvcnknICsgJGluZGV4XCIgY2xhc3M9XCJicmFuZC1jYXRlZ29yeVwiIFtuZ2JUb29sdGlwXT1cImJyYW5kQ2F0ZWdvcnlUb29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblpvbmVMZXZlbFByb2R1Y3RNb2RhbChpdGVtLCdzZWN0aW9uJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgbWUtMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOml0ZW0uc2VjdGlvbi5jb2xvci50ZXh0QmcsJ2NvbG9yJzppdGVtLnNlY3Rpb24uY29sb3IudGV4dH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uem9uZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgaW5hY3RpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcGFjaXR5IHt7IGl0ZW0/LnNlY3Rpb24/LmNhcGFjaXR5IH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZFwiICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uYnJhbmRzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGIgb2YgaXRlbT8uc2VjdGlvbj8uYnJhbmRzO3RyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LnNlY3Rpb24/LmNhdGVnb3JpZXM/Lmxlbmd0aFwiIGNsYXNzPVwic2VwYXJhdG9yXCI+IC0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5XCIgKm5nSWY9XCJpdGVtPy5zZWN0aW9uPy5jYXRlZ29yaWVzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGMgb2YgaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllczt0cmFjayAkaW5kZXg7IGxldCBsYXN0ID0gJGxhc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYnJhbmRDYXRlZ29yeVRvb2x0aXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5CcmFuZHM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGIgb2YgaXRlbT8uc2VjdGlvbj8uYnJhbmRzO3RyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIml0ZW0/LnNlY3Rpb24/LmNhdGVnb3JpZXM/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+Q2F0ZWdvcmllczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYyBvZiBpdGVtPy5zZWN0aW9uPy5jYXRlZ29yaWVzO3RyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgW2lkXT1cIidzdW1TaGVsZkNvbnRhaW5lcicgKyBpXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bU0hFTEYgTEVWRUwgLSBCUkFORCBDQVRFR09SWV0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInNoZWxmLWxldmVsXCIgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSAnTDInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiJ2JyYW5kLWNhdGVnb3J5JyArIGlcIiBjbGFzcz1cImJyYW5kLWNhdGVnb3J5XCIgKm5nSWY9XCJpdGVtLnByb2R1Y3RCcmFuZE5hbWU/Lmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cImJyYW5kQ2F0ZWdvcnlUb29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmRcIiAqbmdJZj1cIml0ZW0ucHJvZHVjdEJyYW5kTmFtZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBiIG9mIGl0ZW0ucHJvZHVjdEJyYW5kTmFtZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0ucHJvZHVjdENhdGVnb3J5Py5sZW5ndGhcIiBjbGFzcz1cInNlcGFyYXRvclwiPiAtIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeVwiICpuZ0lmPVwiaXRlbS5wcm9kdWN0Q2F0ZWdvcnk/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYiBvZiBpdGVtLnByb2R1Y3RDYXRlZ29yeTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYnJhbmRDYXRlZ29yeVRvb2x0aXA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5CcmFuZHM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGl0ZW0ucHJvZHVjdEJyYW5kTmFtZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiaXRlbS5wcm9kdWN0Q2F0ZWdvcnk/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkNhdGVnb3JpZXM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGl0ZW0ucHJvZHVjdENhdGVnb3J5OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBpbmFjdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcGFjaXR5IHt7aXRlbT8ucHJvZHVjdFBlclNoZWxmIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBAaWYoaXRlbS5zaGVsZlR5cGUgPT09J3NoZWxmJyl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrIHNoZWxmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0ucHJvZHVjdHMubGVuZ3RoKXtcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIGl0ZW0ucHJvZHVjdHNcIiBjbGFzcz1cInByb2R1Y3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXJyb3JdPVwicHJvZHVjdC5zdGF0dXMgPT09ICdtaXNzaW5nJyB8fCBwcm9kdWN0LnN0YXR1cyA9PT0gJ21pc3BsYWNlZCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKHByb2R1Y3Quc3RhdHVzICE9ICdtaXNzaW5nJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJwcm9kdWN0Py5wcm9kdWN0SW1hZ2VVcmw7IGVsc2UgcGxhY2Vob2xkZXJcIiBbc3JjXT1cInByb2R1Y3Q/LnByb2R1Y3RJbWFnZVVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJQcm9kdWN0IEltYWdlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFjZWhvbGRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiaXRlbS5zaGVsZlR5cGUhICsgKGkgKyAxKVwiIGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoaXRlbS5wcm9kdWN0cy5sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBpdGVtLmRpc3RyaWJ1dGVkUm93c1wiIGNsYXNzPVwidHJheSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2Ygcm93XCIgY2xhc3M9XCJwcm9kdWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5lcnJvcl09XCJwcm9kdWN0LnN0YXR1cyA9PT0gJ21pc3NpbmcnIHx8IHByb2R1Y3Quc3RhdHVzID09PSAnbWlzcGxhY2VkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKHByb2R1Y3Quc3RhdHVzICE9ICdtaXNzaW5nJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwicHJvZHVjdD8ucHJvZHVjdEltYWdlVXJsOyBlbHNlIHBsYWNlaG9sZGVyXCIgW3NyY109XCJwcm9kdWN0Py5wcm9kdWN0SW1hZ2VVcmxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIlByb2R1Y3QgSW1hZ2VcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFjZWhvbGRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgfUBlbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS50cmF5Um93cylcIiBjbGFzcz1cInRyYXkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0ucHJvZHVjdFBlclNoZWxmKVwiIGNsYXNzPVwicHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfSAtLT5cclxuICAgICAgICAgICAgICAgIEBpZihpdGVtLnNoZWxmVHlwZSA9PT0nc2hlbGYnKXtcclxuICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlICsgKGkgKyAxKVwiIGNsYXNzPVwiYmxvY2sgc2hlbGZcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0ucHJvZHVjdFBlclNoZWxmKVwiIGNsYXNzPVwicHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiaXRlbS5zaGVsZlR5cGUhICsgKGkgKyAxKVwiIGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0udHJheVJvd3MpXCIgY2xhc3M9XCJ0cmF5IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnByb2R1Y3RQZXJTaGVsZilcIiBjbGFzcz1cInByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBGb290ZXIgYmxvY2sgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciBsZWZ0LWJveFwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciByaWdodC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgPHA+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5sYWJlbCB9fTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9zZWN0aW9uPlxyXG5cclxuPHNlY3Rpb24gaWQ9XCJ0ZW1wbGF0ZS1zdW1tYXJ5LXNrZWxldG9uXCIgKm5nSWY9XCJpc1BhZ2VMb2FkaW5nXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2VjdGlvbj4iXX0=
|