tango-app-ui-store-builder 1.0.47 → 1.0.49
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/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +39 -19
- package/esm2022/lib/components/create-fixture/create-fixture.component.mjs +233 -138
- package/esm2022/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.mjs +4 -2
- package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +4 -2
- package/esm2022/lib/components/fixture-template/template-basic-details/template-basic-details.component.mjs +40 -4
- package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +3 -3
- package/esm2022/lib/components/fixture-template/template-summary/template-summary.component.mjs +3 -3
- package/esm2022/lib/components/fixture-template/template-vms/template-vms.component.mjs +108 -79
- package/esm2022/lib/components/fixture-template-tree/fixture-template-tree.component.mjs +7 -3
- package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +4 -2
- package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +27 -4
- package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/template-vms/template-vms.component.mjs +10 -14
- 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 +3 -3
- package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +4 -2
- package/esm2022/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.mjs +11 -5
- package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +14 -9
- package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.mjs +39 -7
- package/esm2022/lib/components/planogram/merch-compliance/zone-products/zone-products.component.mjs +18 -5
- package/esm2022/lib/components/planogram/plano-analytics/analytics-popup/analytics-popup.component.mjs +68 -0
- package/esm2022/lib/components/planogram/plano-analytics/date-range-picker/date-range-picker.component.mjs +5 -5
- package/esm2022/lib/components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component.mjs +649 -0
- package/esm2022/lib/components/planogram/plano-analytics/plano-analytics.component.mjs +1197 -25
- package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +14 -7
- package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +8 -4
- package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +17 -9
- package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +3 -3
- package/esm2022/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.mjs +3 -2
- package/esm2022/lib/components/store-plano/store-plano.component.mjs +4 -2
- package/esm2022/lib/interfaces/fixture-library.interface.mjs +1 -1
- package/esm2022/lib/services/store-builder.service.mjs +4 -1
- package/esm2022/lib/tango-store-builder.module.mjs +8 -2
- package/fesm2022/tango-app-ui-store-builder.mjs +2996 -834
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/create-fixture/create-fixture.component.d.ts +15 -14
- package/lib/components/fixture-template/template-basic-details/template-basic-details.component.d.ts +2 -0
- package/lib/components/fixture-template/template-vms/template-vms.component.d.ts +12 -12
- package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +2 -2
- package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +4 -4
- package/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.d.ts +2 -0
- package/lib/components/manage-store-plano/template-vms/template-vms.component.d.ts +0 -1
- package/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.d.ts +4 -2
- package/lib/components/planogram/merch-compliance/product-locator/product-locator.component.d.ts +3 -2
- package/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.d.ts +10 -3
- package/lib/components/planogram/merch-compliance/zone-products/zone-products.component.d.ts +4 -2
- package/lib/components/planogram/plano-analytics/analytics-popup/analytics-popup.component.d.ts +25 -0
- package/lib/components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component.d.ts +94 -0
- package/lib/components/planogram/plano-analytics/plano-analytics.component.d.ts +76 -3
- package/lib/components/planogram/plano-details-parent/plano-details-parent.component.d.ts +3 -2
- package/lib/interfaces/fixture-library.interface.d.ts +1 -1
- package/lib/services/store-builder.service.d.ts +1 -0
- package/lib/tango-store-builder.module.d.ts +26 -24
- package/package.json +1 -1
|
@@ -0,0 +1,649 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, } from "@angular/core";
|
|
2
|
+
import { lastValueFrom, Subject, takeUntil } from "rxjs";
|
|
3
|
+
import { ZoneProductsComponent } from "../../merch-compliance/zone-products/zone-products.component";
|
|
4
|
+
import { AnalyticsPopupComponent } from "../analytics-popup/analytics-popup.component";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../../../services/store-builder.service";
|
|
7
|
+
import * as i2 from "tango-app-ui-global";
|
|
8
|
+
import * as i3 from "@ng-bootstrap/ng-bootstrap";
|
|
9
|
+
import * as i4 from "@angular/common";
|
|
10
|
+
import * as i5 from "@angular/forms";
|
|
11
|
+
export class FixtureAnalyticsComponent {
|
|
12
|
+
storeBuilderService;
|
|
13
|
+
gs;
|
|
14
|
+
cd;
|
|
15
|
+
ngbModal;
|
|
16
|
+
fixtureDetails;
|
|
17
|
+
vmList = [];
|
|
18
|
+
floorData;
|
|
19
|
+
startDate;
|
|
20
|
+
endDate;
|
|
21
|
+
dataType;
|
|
22
|
+
onClose = new EventEmitter();
|
|
23
|
+
changeFixture = new EventEmitter();
|
|
24
|
+
fixtureTemplateDetails;
|
|
25
|
+
clientId;
|
|
26
|
+
imgCDN;
|
|
27
|
+
zoneColor = {
|
|
28
|
+
right: {
|
|
29
|
+
bg: "#ffffff",
|
|
30
|
+
text: "#12B76A",
|
|
31
|
+
border: "#32D583",
|
|
32
|
+
productBorder: "#12B76A",
|
|
33
|
+
productBg: "#FCFCFD",
|
|
34
|
+
},
|
|
35
|
+
wrong: {
|
|
36
|
+
bg: "#ffffff",
|
|
37
|
+
text: "#F04438",
|
|
38
|
+
border: "#98a2b3",
|
|
39
|
+
productBorder: "#F04438",
|
|
40
|
+
productBg: "#FECDCA",
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
sectionByZones = [];
|
|
44
|
+
isPageLoading = true;
|
|
45
|
+
showVMs = true;
|
|
46
|
+
isVMInitialized = false;
|
|
47
|
+
isBCInitialized = false;
|
|
48
|
+
destroy$ = new Subject();
|
|
49
|
+
engagersList;
|
|
50
|
+
fixtureFootfall;
|
|
51
|
+
constructor(storeBuilderService, gs, cd, ngbModal) {
|
|
52
|
+
this.storeBuilderService = storeBuilderService;
|
|
53
|
+
this.gs = gs;
|
|
54
|
+
this.cd = cd;
|
|
55
|
+
this.ngbModal = ngbModal;
|
|
56
|
+
}
|
|
57
|
+
ngOnInit() {
|
|
58
|
+
this.isPageLoading = true;
|
|
59
|
+
this.gs.environment
|
|
60
|
+
.pipe(takeUntil(this.destroy$))
|
|
61
|
+
.subscribe((env) => (this.imgCDN = env.planogramCDN));
|
|
62
|
+
this.gs.dataRangeValue
|
|
63
|
+
.pipe(takeUntil(this.destroy$))
|
|
64
|
+
.subscribe(async (data) => {
|
|
65
|
+
if (data?.client) {
|
|
66
|
+
this.clientId = data?.client;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
let headerData = JSON.parse(localStorage.getItem("header-filters"));
|
|
70
|
+
this.clientId = headerData?.client;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
getEngagersList() {
|
|
75
|
+
this.engagersList = null;
|
|
76
|
+
let payload = {
|
|
77
|
+
from_date: this.startDate,
|
|
78
|
+
to_date: this.endDate,
|
|
79
|
+
fixtureId: this.fixtureDetails._id,
|
|
80
|
+
};
|
|
81
|
+
this.storeBuilderService
|
|
82
|
+
.getStoreFixtureEngagers(payload)
|
|
83
|
+
.pipe(takeUntil(this.destroy$))
|
|
84
|
+
.subscribe((res) => {
|
|
85
|
+
if (res && res.code == 200) {
|
|
86
|
+
this.engagersList = res?.data?.data || {};
|
|
87
|
+
console.log(this.engagersList, "this.engagersList");
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
topEngagers() {
|
|
92
|
+
return this.engagersList?.["Top Engaged"]?.slice(0, 3);
|
|
93
|
+
}
|
|
94
|
+
leastEngagers() {
|
|
95
|
+
return [
|
|
96
|
+
...this.engagersList?.["Non Engaged"],
|
|
97
|
+
...this.engagersList?.["Least Engaged"],
|
|
98
|
+
]?.slice(0, 3);
|
|
99
|
+
}
|
|
100
|
+
getFixtureFootfall() {
|
|
101
|
+
this.fixtureFootfall = null;
|
|
102
|
+
let payload = {
|
|
103
|
+
fromDate: this.startDate,
|
|
104
|
+
toDate: this.endDate,
|
|
105
|
+
storeId: [this.floorData.storeId],
|
|
106
|
+
zone: `Fixture ${this.fixtureDetails?.fixtureNumber}`,
|
|
107
|
+
dataType: this.dataType
|
|
108
|
+
};
|
|
109
|
+
this.storeBuilderService
|
|
110
|
+
.getStoreFixtureFootfall(payload)
|
|
111
|
+
.pipe(takeUntil(this.destroy$))
|
|
112
|
+
.subscribe((res) => {
|
|
113
|
+
console.log(res, 'res');
|
|
114
|
+
if (res && res.code == 200) {
|
|
115
|
+
this.fixtureFootfall = res?.data?.card || {};
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
async ngOnChanges(changes) {
|
|
120
|
+
if (changes["fixtureDetails"]?.currentValue) {
|
|
121
|
+
this.getEngagersList();
|
|
122
|
+
this.getFixtureFootfall();
|
|
123
|
+
await this.getFixtureShelfDetails(changes["fixtureDetails"].currentValue);
|
|
124
|
+
setTimeout(() => {
|
|
125
|
+
this.applyShelfColors();
|
|
126
|
+
this.handleVmPositionAndSize();
|
|
127
|
+
}, 200);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
ngAfterViewChecked() {
|
|
131
|
+
if (!this.isBCInitialized) {
|
|
132
|
+
this.isBCInitialized = this.applyShelfColors();
|
|
133
|
+
}
|
|
134
|
+
if (!this.isVMInitialized) {
|
|
135
|
+
this.isVMInitialized = this.handleVmPositionAndSize();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async getFixtureShelfDetails(data) {
|
|
139
|
+
this.isPageLoading = true;
|
|
140
|
+
let payload = {
|
|
141
|
+
fixtureId: data?._id,
|
|
142
|
+
planoId: data?.planoId,
|
|
143
|
+
floorId: data?.floorId,
|
|
144
|
+
compliance: true,
|
|
145
|
+
...(this.fixtureDetails?.revisionId && {
|
|
146
|
+
revisionId: this.fixtureDetails.revisionId,
|
|
147
|
+
}),
|
|
148
|
+
};
|
|
149
|
+
try {
|
|
150
|
+
const res = await lastValueFrom(this.storeBuilderService.getShelfDetails(payload));
|
|
151
|
+
if (res?.status === "success" && res?.data) {
|
|
152
|
+
this.fixtureTemplateDetails = {
|
|
153
|
+
...res?.data,
|
|
154
|
+
shelfConfig: res?.data?.shelves ?? [],
|
|
155
|
+
};
|
|
156
|
+
this.fixtureTemplateDetails.shelfConfig =
|
|
157
|
+
this.fixtureTemplateDetails.shelfConfig.map((s) => {
|
|
158
|
+
if (s.shelfType !== "shelf" && s.products?.length) {
|
|
159
|
+
s.distributedRows = this.distributeRoundRobin(s.products, s.trayRows);
|
|
160
|
+
}
|
|
161
|
+
return s;
|
|
162
|
+
});
|
|
163
|
+
const allProducts = (this.fixtureTemplateDetails?.shelfConfig ?? []).flatMap((s) => s.products ?? []);
|
|
164
|
+
allProducts.forEach((p, i) => {
|
|
165
|
+
if (!p?.productId) {
|
|
166
|
+
p["productId"] = i;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
console.log("@@ ~ getFixtureShelfDetails [ERR]:", error);
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
this.isPageLoading = false;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
getSelectedVM(vm) {
|
|
179
|
+
return this.vmList.find((v) => v.id === vm?.vmId);
|
|
180
|
+
}
|
|
181
|
+
handleVmPositionAndSize() {
|
|
182
|
+
const viewPort = document.getElementById("body-block-sum");
|
|
183
|
+
if (!viewPort)
|
|
184
|
+
return false;
|
|
185
|
+
const bodyWidth = viewPort.offsetWidth;
|
|
186
|
+
const header = document.getElementById("header-block");
|
|
187
|
+
const footer = document.getElementById("footer-block");
|
|
188
|
+
header.style.width = `${bodyWidth}px`;
|
|
189
|
+
footer.style.width = `${bodyWidth}px`;
|
|
190
|
+
this.fixtureTemplateDetails?.vmConfig?.forEach((e, i) => {
|
|
191
|
+
let startShelf = e?.startYPosition ?? 1;
|
|
192
|
+
let endShelf = e?.endYPosition ??
|
|
193
|
+
this.fixtureTemplateDetails?.shelfConfig?.length ??
|
|
194
|
+
1;
|
|
195
|
+
const vm = viewPort.querySelector(`#vm${i}`);
|
|
196
|
+
if (!vm)
|
|
197
|
+
return;
|
|
198
|
+
let x = 0;
|
|
199
|
+
let y = 0;
|
|
200
|
+
let yStart = 0;
|
|
201
|
+
for (let k = 1; k < startShelf; k++) {
|
|
202
|
+
const s = getShelfDiv(k);
|
|
203
|
+
if (!s)
|
|
204
|
+
return;
|
|
205
|
+
yStart += s.offsetHeight;
|
|
206
|
+
}
|
|
207
|
+
let placementHeight = 0;
|
|
208
|
+
let placementWidth = bodyWidth;
|
|
209
|
+
for (let k = startShelf; k <= endShelf; k++) {
|
|
210
|
+
const s = getShelfDiv(k);
|
|
211
|
+
if (!s)
|
|
212
|
+
return;
|
|
213
|
+
placementHeight += s.offsetHeight;
|
|
214
|
+
}
|
|
215
|
+
let defaultW = placementWidth / 3;
|
|
216
|
+
let defaultH = placementHeight / 3;
|
|
217
|
+
let width = defaultW;
|
|
218
|
+
let height = defaultH;
|
|
219
|
+
switch (e?.xZone) {
|
|
220
|
+
case "left":
|
|
221
|
+
x = 0;
|
|
222
|
+
width = defaultW;
|
|
223
|
+
break;
|
|
224
|
+
case "right":
|
|
225
|
+
width = defaultW;
|
|
226
|
+
x = bodyWidth - width;
|
|
227
|
+
break;
|
|
228
|
+
case "middle":
|
|
229
|
+
width = defaultW;
|
|
230
|
+
x = (bodyWidth - width) / 2;
|
|
231
|
+
break;
|
|
232
|
+
case "stretch":
|
|
233
|
+
width = bodyWidth;
|
|
234
|
+
x = 0;
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
switch (e?.yZone) {
|
|
238
|
+
case "top":
|
|
239
|
+
height = placementHeight < defaultH ? placementHeight - 20 : defaultH;
|
|
240
|
+
y = yStart;
|
|
241
|
+
break;
|
|
242
|
+
case "middle":
|
|
243
|
+
height = placementHeight < defaultH ? placementHeight - 20 : defaultH;
|
|
244
|
+
y = (placementHeight - height) / 2 + yStart;
|
|
245
|
+
break;
|
|
246
|
+
case "bottom":
|
|
247
|
+
height = placementHeight < defaultH ? placementHeight - 20 : defaultH;
|
|
248
|
+
y = placementHeight - height + yStart;
|
|
249
|
+
break;
|
|
250
|
+
case "stretch":
|
|
251
|
+
height = placementHeight;
|
|
252
|
+
y = yStart;
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
vm.style.width = `${width}px`;
|
|
256
|
+
vm.style.height = ` ${height}px`;
|
|
257
|
+
vm.style.transform = `translate(${x}px, ${y}px)`;
|
|
258
|
+
function getShelfDiv(k) {
|
|
259
|
+
let div = viewPort.querySelector(`#shelf${k}`);
|
|
260
|
+
if (!div)
|
|
261
|
+
div = viewPort.querySelector(`#tray${k}`);
|
|
262
|
+
return div;
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
applyShelfColors() {
|
|
268
|
+
const bodies = document.getElementById("body-block-sum");
|
|
269
|
+
if (!bodies)
|
|
270
|
+
return false;
|
|
271
|
+
const bodyWidth = bodies.offsetWidth;
|
|
272
|
+
const bodyChildren = Array.from(bodies?.children ?? []);
|
|
273
|
+
const shelfDivs = bodyChildren
|
|
274
|
+
.map((div) => div)
|
|
275
|
+
.filter((d) => d?.id.includes("sumShelfContainer"));
|
|
276
|
+
if (!shelfDivs)
|
|
277
|
+
return false;
|
|
278
|
+
const adjust = 0;
|
|
279
|
+
switch (this.fixtureTemplateDetails?.productResolutionLevel) {
|
|
280
|
+
case "L1": //fixture
|
|
281
|
+
// const allProducts = (
|
|
282
|
+
// this.fixtureTemplateDetails?.shelves ?? []
|
|
283
|
+
// ).flatMap((s: any) => s.products ?? []);
|
|
284
|
+
// const isImproper =
|
|
285
|
+
// allProducts.length == 0
|
|
286
|
+
// ? true
|
|
287
|
+
// : allProducts.some(
|
|
288
|
+
// (p: any) =>
|
|
289
|
+
// p.status === "misplaced" ||
|
|
290
|
+
// p.status === "missing" ||
|
|
291
|
+
// p.status === ""
|
|
292
|
+
// );
|
|
293
|
+
// shelfDivs.forEach((d) => {
|
|
294
|
+
// if (d) {
|
|
295
|
+
// const blockDiv = d.querySelector(".block") as HTMLElement;
|
|
296
|
+
// if (blockDiv) {
|
|
297
|
+
// blockDiv.style.borderColor = isImproper
|
|
298
|
+
// ? this.zoneColor.wrong.border
|
|
299
|
+
// : this.zoneColor.right.border;
|
|
300
|
+
// blockDiv.style.backgroundColor = isImproper
|
|
301
|
+
// ? this.zoneColor.wrong.bg
|
|
302
|
+
// : this.zoneColor.right.bg;
|
|
303
|
+
// }
|
|
304
|
+
// }
|
|
305
|
+
// });
|
|
306
|
+
// const l1 = document.getElementById("fixture-level") as HTMLElement;
|
|
307
|
+
// if (l1) {
|
|
308
|
+
// const bc = l1.querySelector(".brand-category") as HTMLElement;
|
|
309
|
+
// if (bc) {
|
|
310
|
+
// if (isImproper) {
|
|
311
|
+
// bc.classList.add("wrong");
|
|
312
|
+
// } else {
|
|
313
|
+
// bc.classList.remove("wrong");
|
|
314
|
+
// }
|
|
315
|
+
// }
|
|
316
|
+
// }
|
|
317
|
+
break;
|
|
318
|
+
case "L3": //section
|
|
319
|
+
{
|
|
320
|
+
const shelves = shelfDivs
|
|
321
|
+
.map((div) => div.lastElementChild?.tagName.toLowerCase() === "div"
|
|
322
|
+
? div.lastElementChild
|
|
323
|
+
: null)
|
|
324
|
+
.filter(Boolean);
|
|
325
|
+
this.constructSequentialSection(shelves);
|
|
326
|
+
const sectionArray = this.groupShelvesByZone(this.fixtureTemplateDetails?.shelfConfig ?? []);
|
|
327
|
+
const allSectionShelves = [];
|
|
328
|
+
sectionArray.forEach((se, i) => {
|
|
329
|
+
const shelfIds = se.shelves?.map((sh) => sh.replace(/\s/g, "").toLowerCase()) ??
|
|
330
|
+
[];
|
|
331
|
+
allSectionShelves.push(...shelfIds);
|
|
332
|
+
const secDivs = shelves.filter((item) => shelfIds?.includes(item?.id ?? ""));
|
|
333
|
+
const currentSe = this.sectionByZones.find((s) => s.zone === se.zone);
|
|
334
|
+
secDivs.forEach((d, i) => {
|
|
335
|
+
// if (d) d.style.backgroundColor = this.shelfColors[i].bg;
|
|
336
|
+
if (d) {
|
|
337
|
+
d.style.backgroundColor = currentSe?.section.improper
|
|
338
|
+
? this.zoneColor.wrong.bg
|
|
339
|
+
: this.zoneColor.right.bg;
|
|
340
|
+
d.style.borderRight = `2px solid`;
|
|
341
|
+
d.style.borderLeft = `2px solid`;
|
|
342
|
+
if (secDivs.length == 1) {
|
|
343
|
+
d.style.border = `2px solid`;
|
|
344
|
+
}
|
|
345
|
+
else if (secDivs.length > 1 && secDivs.length <= 2) {
|
|
346
|
+
if (i == 0) {
|
|
347
|
+
d.style.borderTop = `1px solid`;
|
|
348
|
+
d.style.borderBottom = `0.5px dotted`;
|
|
349
|
+
}
|
|
350
|
+
else if (i == secDivs.length - 1) {
|
|
351
|
+
d.style.borderBottom = `1px solid`;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
if (i == 0) {
|
|
356
|
+
d.style.borderTop = `1px solid`;
|
|
357
|
+
}
|
|
358
|
+
else if (i == secDivs.length - 1) {
|
|
359
|
+
d.style.borderBottom = `1px solid`;
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
d.style.borderTop = `0.5px dotted`;
|
|
363
|
+
d.style.borderBottom = `0.5px dotted`;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
d.style.borderColor = currentSe?.section.improper
|
|
367
|
+
? this.zoneColor.wrong.border
|
|
368
|
+
: this.zoneColor.right.border;
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
const unassignedShelves = shelfDivs.filter((item) => !allSectionShelves.includes(item.id));
|
|
373
|
+
unassignedShelves.forEach((d) => (d.style.backgroundColor = "white"));
|
|
374
|
+
let sectionGroupHeight = 0;
|
|
375
|
+
setTimeout(() => {
|
|
376
|
+
this.sectionByZones.forEach((sz, i) => {
|
|
377
|
+
const currentSectionHeight = sz.section.shelfDivs.reduce((h, d) => h + (d?.offsetHeight ?? 0), 0);
|
|
378
|
+
const currentSectionWidth = sz.section.shelfDivs[0]?.offsetWidth ?? 345;
|
|
379
|
+
const bc = bodies.querySelector(`#brand-category${i}`);
|
|
380
|
+
if (bc) {
|
|
381
|
+
// const secBg = rgbToHex(
|
|
382
|
+
// sz.section.shelfDivs[0]?.style.backgroundColor
|
|
383
|
+
// );
|
|
384
|
+
// const color =
|
|
385
|
+
// this.shelfColors.find((c) => c.bg === secBg) ??
|
|
386
|
+
// this.shelfColors[i];
|
|
387
|
+
// bc.style.borderColor = this.zoneColor.right.border;
|
|
388
|
+
bc.style.backgroundColor = "#fff";
|
|
389
|
+
// const bcX = (currentSectionWidth - bc.offsetWidth) / 2;
|
|
390
|
+
const bcX = bodyWidth + 16;
|
|
391
|
+
const bcY = (currentSectionHeight - bc.offsetHeight) / 2 +
|
|
392
|
+
sectionGroupHeight;
|
|
393
|
+
bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;
|
|
394
|
+
sectionGroupHeight += currentSectionHeight;
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
const storeBox = document.getElementById("storage-box-zone");
|
|
398
|
+
const align = bodyWidth + 16;
|
|
399
|
+
if (storeBox) {
|
|
400
|
+
storeBox.style.left = `${align}px`;
|
|
401
|
+
}
|
|
402
|
+
}, 0);
|
|
403
|
+
}
|
|
404
|
+
break;
|
|
405
|
+
case "L2": //shelf
|
|
406
|
+
{
|
|
407
|
+
shelfDivs.forEach((div, i) => {
|
|
408
|
+
// div.style.backgroundColor = this.zoneColor.right.bg;
|
|
409
|
+
// div.style.border = `1.4px solid ${this.zoneColor.right.border}`;
|
|
410
|
+
// if (this.showVMs) return false;
|
|
411
|
+
const bc = div.querySelector(`#brand-category${i}`);
|
|
412
|
+
if (!bc)
|
|
413
|
+
return;
|
|
414
|
+
const bcX = (div.offsetWidth - bc.offsetWidth) / 2;
|
|
415
|
+
const bcY = (div.offsetHeight - bc.offsetHeight) / 2;
|
|
416
|
+
// bc.style.borderColor = this.zoneColor.right.border;
|
|
417
|
+
// bc.style.backgroundColor = this.zoneColor.right.bg;
|
|
418
|
+
bc.style.transform = `translate(${bcX + adjust}px, ${bcY}px)`;
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
break;
|
|
422
|
+
case "L4": //spot
|
|
423
|
+
default:
|
|
424
|
+
// shelfDivs.forEach((d) => {
|
|
425
|
+
// if (d) d.style.backgroundColor = this.zoneColor.right.bg;
|
|
426
|
+
// });
|
|
427
|
+
break;
|
|
428
|
+
}
|
|
429
|
+
return true;
|
|
430
|
+
}
|
|
431
|
+
constructSequentialSection(shelfDivs) {
|
|
432
|
+
const newSectionByZones = [];
|
|
433
|
+
let pZone = null;
|
|
434
|
+
for (const s of this.fixtureTemplateDetails?.shelfConfig ?? []) {
|
|
435
|
+
const zone = s.zone || "";
|
|
436
|
+
const shelfId = `${s.shelfType}${s.shelfNumber}`;
|
|
437
|
+
const shelfDiv = shelfDivs.find((d) => d?.id === shelfId);
|
|
438
|
+
if (zone === "")
|
|
439
|
+
continue;
|
|
440
|
+
const hasImproperProduct = (s?.products?.length ?? 0) === 0 ||
|
|
441
|
+
(s?.products ?? []).some((p) => p.status !== "proper");
|
|
442
|
+
const missCount = (s?.products ?? []).filter((p) => p.status === "missing").length;
|
|
443
|
+
const misplacedCount = (s?.products ?? []).filter((p) => p.status === "misplaced").length;
|
|
444
|
+
const shelfCapacity = s.shelfType === "tray"
|
|
445
|
+
? s.productPerShelf * s.trayRows
|
|
446
|
+
: s.productPerShelf;
|
|
447
|
+
if (zone !== pZone) {
|
|
448
|
+
newSectionByZones.push({
|
|
449
|
+
zone,
|
|
450
|
+
section: {
|
|
451
|
+
brands: s.productBrandName ?? [],
|
|
452
|
+
categories: s.productCategory ?? [],
|
|
453
|
+
shelves: [shelfId],
|
|
454
|
+
shelfDivs: [shelfDiv],
|
|
455
|
+
products: structuredClone(s?.products) ?? [],
|
|
456
|
+
improper: hasImproperProduct,
|
|
457
|
+
misplaced: misplacedCount,
|
|
458
|
+
missing: missCount,
|
|
459
|
+
capacity: shelfCapacity,
|
|
460
|
+
},
|
|
461
|
+
});
|
|
462
|
+
pZone = zone;
|
|
463
|
+
}
|
|
464
|
+
else {
|
|
465
|
+
const section = newSectionByZones[newSectionByZones.length - 1].section;
|
|
466
|
+
section.shelves.push(shelfId);
|
|
467
|
+
section.shelfDivs.push(shelfDiv);
|
|
468
|
+
section.products.push(...s.products);
|
|
469
|
+
section.capacity += shelfCapacity;
|
|
470
|
+
if (hasImproperProduct)
|
|
471
|
+
section.improper = true;
|
|
472
|
+
section.missing += missCount;
|
|
473
|
+
section.misplaced += misplacedCount;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
// if (this.fixtureTemplateDetails?.storageProducts?.length) {
|
|
477
|
+
// const storageProducts = this.fixtureTemplateDetails.storageProducts;
|
|
478
|
+
// newSectionByZones.push({
|
|
479
|
+
// zone: "Storage",
|
|
480
|
+
// section: {
|
|
481
|
+
// brands: storageProducts.map((p: any) => p.brandName),
|
|
482
|
+
// categories: storageProducts.map((p: any) => p.brandName),
|
|
483
|
+
// shelves: [],
|
|
484
|
+
// shelfDivs: [],
|
|
485
|
+
// products: structuredClone(storageProducts) ?? [],
|
|
486
|
+
// improper: false,
|
|
487
|
+
// hasMisplaced: false,
|
|
488
|
+
// hasMissing: false,
|
|
489
|
+
// capacity: storageProducts.length,
|
|
490
|
+
// },
|
|
491
|
+
// });
|
|
492
|
+
// }
|
|
493
|
+
this.sectionByZones = [...newSectionByZones];
|
|
494
|
+
this.cd.detectChanges();
|
|
495
|
+
}
|
|
496
|
+
groupShelvesByZone(input) {
|
|
497
|
+
const zoneMap = {};
|
|
498
|
+
for (const item of input) {
|
|
499
|
+
const zone = item?.zone ?? "";
|
|
500
|
+
const shelfLabel = `${item.shelfType} ${item.shelfNumber}`;
|
|
501
|
+
if (!zoneMap[zone]) {
|
|
502
|
+
zoneMap[zone] = {
|
|
503
|
+
shelves: [],
|
|
504
|
+
productBrandName: this.fixtureTemplateDetails?.productResolutionLevel === "L2"
|
|
505
|
+
? item.productBrandName
|
|
506
|
+
: [],
|
|
507
|
+
productCategory: this.fixtureTemplateDetails?.productResolutionLevel === "L2"
|
|
508
|
+
? item.productCategory
|
|
509
|
+
: [],
|
|
510
|
+
zone: zone,
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
zoneMap[zone]?.shelves?.push(shelfLabel);
|
|
514
|
+
}
|
|
515
|
+
return Object.values(zoneMap);
|
|
516
|
+
}
|
|
517
|
+
applySectionConfigToShelves(sections) {
|
|
518
|
+
const sectionMap = new Map();
|
|
519
|
+
for (const section of sections) {
|
|
520
|
+
for (const shelfLabel of section.shelves) {
|
|
521
|
+
sectionMap.set(shelfLabel, {
|
|
522
|
+
zone: section.zone,
|
|
523
|
+
productBrandName: section.productBrandName,
|
|
524
|
+
productCategory: section.productCategory,
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
// Apply overrides to matching shelves
|
|
529
|
+
return (this.fixtureTemplateDetails?.shelfConfig?.map((shelf) => {
|
|
530
|
+
const shelfLabel = `${shelf.shelfType} ${shelf.shelfNumber}`;
|
|
531
|
+
const override = sectionMap.get(shelfLabel);
|
|
532
|
+
return {
|
|
533
|
+
...shelf,
|
|
534
|
+
zone: override?.zone || "",
|
|
535
|
+
productBrandName: override?.productBrandName ?? [],
|
|
536
|
+
productCategory: override?.productCategory ?? [],
|
|
537
|
+
};
|
|
538
|
+
}) ?? []);
|
|
539
|
+
}
|
|
540
|
+
openZoneLevelProductModalByProduct(p, s) {
|
|
541
|
+
const pLocator = {
|
|
542
|
+
s: s.shelfNumber,
|
|
543
|
+
pid: p?.productId,
|
|
544
|
+
};
|
|
545
|
+
const zoneData = this.sectionByZones.find((sh) => sh.zone === (s?.zone ?? "Top"));
|
|
546
|
+
this.openZoneLevelProductModal(zoneData, "section", pLocator);
|
|
547
|
+
}
|
|
548
|
+
openZoneLevelProductModal(zoneData, level, pLocator) {
|
|
549
|
+
const data = {
|
|
550
|
+
zone: zoneData.zone,
|
|
551
|
+
shelves: this.fixtureTemplateDetails.shelfConfig.filter((s) => s.zone === zoneData.zone),
|
|
552
|
+
};
|
|
553
|
+
if (data.shelves.every((s) => s.products.length > 0)) {
|
|
554
|
+
const modalRef = this.ngbModal.open(ZoneProductsComponent, {
|
|
555
|
+
centered: true,
|
|
556
|
+
windowClass: "merch-compliance-modal",
|
|
557
|
+
});
|
|
558
|
+
modalRef.componentInstance.data = data;
|
|
559
|
+
modalRef.componentInstance.level = level;
|
|
560
|
+
modalRef.componentInstance.floorData = this.floorData;
|
|
561
|
+
modalRef.componentInstance.vmList = this.vmList;
|
|
562
|
+
modalRef.componentInstance.productLocation = pLocator;
|
|
563
|
+
modalRef.result.then((result) => {
|
|
564
|
+
if (result) {
|
|
565
|
+
this.changeFixture.emit(result);
|
|
566
|
+
}
|
|
567
|
+
});
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
openStoreBoxProducts() {
|
|
571
|
+
if (this.fixtureTemplateDetails.storageProducts.length <= 0)
|
|
572
|
+
return;
|
|
573
|
+
const MAX_PRODUCTS_PER_SHELF = 6;
|
|
574
|
+
const shelves = [];
|
|
575
|
+
// Creating Imaginary shelves to display the storage box products.
|
|
576
|
+
for (let i = 0; i < this.fixtureTemplateDetails.storageProducts.length; i += MAX_PRODUCTS_PER_SHELF) {
|
|
577
|
+
shelves.push({
|
|
578
|
+
shelfType: "shelf",
|
|
579
|
+
products: this.fixtureTemplateDetails.storageProducts.slice(i, i + MAX_PRODUCTS_PER_SHELF),
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
const data = {
|
|
583
|
+
zone: "Storage Box",
|
|
584
|
+
shelves: shelves,
|
|
585
|
+
};
|
|
586
|
+
const modalRef = this.ngbModal.open(ZoneProductsComponent, {
|
|
587
|
+
centered: true,
|
|
588
|
+
windowClass: "merch-compliance-modal",
|
|
589
|
+
});
|
|
590
|
+
modalRef.componentInstance.data = data;
|
|
591
|
+
modalRef.componentInstance.level = "section";
|
|
592
|
+
}
|
|
593
|
+
distributeRoundRobin(products, trayRows) {
|
|
594
|
+
const result = Array.from({ length: trayRows }, () => []);
|
|
595
|
+
products.forEach((product, index) => {
|
|
596
|
+
const trayIndex = index % trayRows;
|
|
597
|
+
result[trayIndex].push(product);
|
|
598
|
+
});
|
|
599
|
+
return result;
|
|
600
|
+
}
|
|
601
|
+
// isErrorProduct(products?: any[]) {
|
|
602
|
+
// if (products) {
|
|
603
|
+
// return products.some(
|
|
604
|
+
// (p: any) => p.status == "missing" || p.status == "misplaced"
|
|
605
|
+
// );
|
|
606
|
+
// }
|
|
607
|
+
// return true;
|
|
608
|
+
// }
|
|
609
|
+
getShelfRowWithProducts() { }
|
|
610
|
+
onClickClose() {
|
|
611
|
+
this.onClose.emit("");
|
|
612
|
+
}
|
|
613
|
+
openPopup(type) {
|
|
614
|
+
const modalRef = this.ngbModal.open(AnalyticsPopupComponent, {
|
|
615
|
+
centered: true,
|
|
616
|
+
windowClass: "merch-compliance-modal",
|
|
617
|
+
size: 'lg'
|
|
618
|
+
});
|
|
619
|
+
modalRef.componentInstance.data = this.engagersList;
|
|
620
|
+
modalRef.componentInstance.type = type;
|
|
621
|
+
}
|
|
622
|
+
ngOnDestroy() {
|
|
623
|
+
this.destroy$.next();
|
|
624
|
+
this.destroy$.complete();
|
|
625
|
+
}
|
|
626
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FixtureAnalyticsComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.GlobalStateService }, { token: i0.ChangeDetectorRef }, { token: i3.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
|
|
627
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FixtureAnalyticsComponent, selector: "lib-fixture-analytics", inputs: { fixtureDetails: "fixtureDetails", vmList: "vmList", floorData: "floorData", startDate: "startDate", endDate: "endDate", dataType: "dataType" }, outputs: { onClose: "onClose", changeFixture: "changeFixture" }, usesOnChanges: true, ngImport: i0, template: "<section id=\"fixture-analytic-details\" *ngIf=\"!isPageLoading\">\r\n <div class=\"d-flex p-2 w-100 justify-content-end align-items-center\">\r\n <svg (click)=\"onClickClose()\" class=\"m-2 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\r\n </div>\r\n <div class=\"hero-block\">\r\n <h1 style=\"font-weight: 600;font-size: 30px;\">{{ fixtureTemplateDetails?.fixtureCompliance ?? 0 }}%</h1>\r\n <p>Compliance score</p>\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}<span>•</span>\r\n {{fixtureTemplateDetails?.fixtureCategory}} <span>•</span>\r\n {{fixtureTemplateDetails?.fixtureWidth.value}}{{fixtureTemplateDetails?.fixtureWidth.unit}}<span>•</span>\r\n {{fixtureTemplateDetails?.shelfConfig?.length}} Shelves\r\n </p>\r\n </div>\r\n <div class=\"d-flex justify-content-end mb-4 pe-5\">\r\n <div class=\"form-check form-switch \">\r\n <input [checked]=\"showVMs\" [(ngModel)]=\"showVMs\" [ngModelOptions]=\"{ standalone: true }\"\r\n style=\"cursor: pointer\" class=\"form-check-input\" type=\"checkbox\" />\r\n <label style=\"color: black; white-space: nowrap\" class=\"form-check-label sub ms-2\" for=\"showVMs\">\r\n Show VM\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"w-20\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n <div class=\"metric-header\">\r\n <span class=\"fw-semibold\">Total Footfall</span>\r\n </div>\r\n \r\n <div class=\"mt-2\">\r\n <h2 class=\"mb-1\">{{fixtureFootfall?.zoneTotal?.PreviousData}}</h2>\r\n \r\n <div class=\"d-flex align-items-center gap-1 small\" [ngClass]=\"fixtureFootfall?.zoneTotal?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" style=\"transform: rotate(180deg);\" *ngIf=\"!fixtureFootfall?.zoneTotal?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" *ngIf=\"fixtureFootfall?.zoneTotal?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span class=\"fw-semibold\">{{fixtureFootfall?.zoneTotal?.count}}%</span>\r\n <span class=\"text-muted\">vs Previous day</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"w-20\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n <div class=\"metric-header\">\r\n <span class=\"fw-semibold\">Zone Conversion</span>\r\n </div>\r\n \r\n <div class=\"mt-2\">\r\n <h2 class=\"mb-1\">{{fixtureFootfall?.conversionCount?.PreviousData}}</h2>\r\n \r\n <div class=\"d-flex align-items-center gap-1 small\" [ngClass]=\"fixtureFootfall?.conversionCount?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" style=\"transform: rotate(180deg);\" *ngIf=\"!fixtureFootfall?.conversionCount?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" *ngIf=\"fixtureFootfall?.conversionCount?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span class=\"fw-semibold\">{{fixtureFootfall?.conversionCount?.count}}%</span>\r\n <span class=\"text-muted\">vs Previous day</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"w-20\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n <div class=\"metric-header\">\r\n <span class=\"fw-semibold\">Avg Dwell Time</span>\r\n </div>\r\n \r\n <div class=\"mt-2\">\r\n <h2 class=\"mb-1\">{{fixtureFootfall?.dwellTime?.PreviousData}}</h2>\r\n \r\n <div class=\"d-flex align-items-centergap-1 small\" [ngClass]=\"fixtureFootfall?.dwellTime?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" style=\"transform: rotate(180deg);\" *ngIf=\"!fixtureFootfall?.dwellTime?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" *ngIf=\"fixtureFootfall?.dwellTime?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span class=\"fw-semibold\">{{fixtureFootfall?.dwellTime?.count}}%</span>\r\n <span class=\"text-muted\">vs Previous day</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div id=\"vm-products-sum\" class=\"wall-viewport mt-8\">\r\n <div class=\"fixture-wrapper\">\r\n <!-- Header block -->\r\n <div id=\"header-block\" class=\"header-block\">\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\" [ngClass]=\"{'d-none':!showVMs}\">\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\"\r\n *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\" [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 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\r\n *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\r\n *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 [class.proper]=\"!item?.section?.improper\">\r\n <div class=\"d-flex gap-1\">\r\n <span class=\"badge inactive\">\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\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\r\n <div class=\"d-flex gap-1 mb-1\">\r\n <span class=\"badge\" *ngIf=\"item.section.missing > 0\">\r\n Missing {{item.section.missing}}\r\n </span>\r\n <span class=\"badge\" *ngIf=\"item.section.misplaced > 0\">\r\n Misplaced {{item.section.misplaced}}\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\"\r\n *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 </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;let p = index\" class=\"product cursor-pointer\"\r\n [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\"\r\n (click)=\"openZoneLevelProductModalByProduct(product,item)\">\r\n @if(product.status != 'missing'){\r\n <img *ngIf=\"product?.productImageUrl; else placeholder\"\r\n [src]=\"product?.productImageUrl\" 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;let r = index\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of row;let p = index\" class=\"product cursor-pointer\"\r\n [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\"\r\n (click)=\"openZoneLevelProductModalByProduct(product,item)\">\r\n @if(product.status != 'missing'){\r\n <img *ngIf=\"product?.productImageUrl; else placeholder\"\r\n [src]=\"product?.productImageUrl\" 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\">\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div id=\"footer-block\" class=\"footer-block\">\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\r\n <div id=\"storage-box-zone\" *ngIf=\"fixtureTemplateDetails?.storageProducts?.length\" class=\"storage-box\"\r\n (click)=\"openStoreBoxProducts()\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n\r\n <span class=\"badge inactive\">\r\n Capacity {{ fixtureTemplateDetails?.storageProducts?.length ?? 0}}\r\n </span>\r\n\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\">\r\n @for(p of fixtureTemplateDetails?.storageProducts; track $index; let last = $last){\r\n {{p.brandName}}\r\n }\r\n </span>\r\n <span class=\"category\">\r\n @for(p of fixtureTemplateDetails?.storageProducts; track $index; let last = $last){\r\n {{p.category}}\r\n }\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <!-- Brands -->\r\n <p>\r\n <b>Brands: </b>\r\n\r\n @for (\r\n b of fixtureTemplateDetails?.storageProducts?.slice(0, 20);\r\n track $index;\r\n let last = $last\r\n ) {\r\n {{ b?.brandName }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n\r\n @if ((fixtureTemplateDetails?.storageProducts?.length ?? 0) > 20) {\r\n , +{{ (fixtureTemplateDetails?.storageProducts.length - 20) }}\r\n }\r\n </p>\r\n\r\n <!-- Categories -->\r\n <p>\r\n <b>Categories: </b>\r\n\r\n @for (\r\n b of fixtureTemplateDetails?.storageProducts?.slice(0, 20);\r\n track $index;\r\n let last = $last\r\n ) {\r\n {{ b?.category }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n\r\n @if ((fixtureTemplateDetails?.storageProducts?.length ?? 0) > 20) {\r\n , +{{ (fixtureTemplateDetails?.storageProducts.length - 20) }}\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"w-25\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"engagersList?.['Top Engaged']?.length\">\r\n <div class=\"metric-header bg-header d-flex justify-content-between\">\r\n <span>Top Engaged</span>\r\n <span>Count</span>\r\n </div>\r\n <div class=\"row align-items-center py-2 border-bottom\" *ngFor=\"let top of topEngagers()\">\r\n <div class=\"col-auto\">\r\n <img [src]=\"top?.imageUrl ? top.imageUrl : '{{imgCDN}}fixtureImage/imagenotfound.png'\" alt=\"Product\" class=\"rounded\">\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"fw-medium text-dark small\">{{top?.Brandname ?? ''}}</div>\r\n <div class=\"text-muted\" style=\"font-size: 12px;\">{{top?.productBrandName ?? ''}}</div>\r\n </div>\r\n <div class=\"col-auto\">\r\n <span class=\"fw-medium text-dark\">{{top?.count ?? 0}}</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"text-end py-1\">\r\n <a class=\"text-primary text-decoration-underline\" (click)=\"openPopup('Top Engaged')\">View all</a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"w-25\" *ngIf=\"engagersList?.['Non Engaged']?.length\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\">\r\n <div class=\"metric-header bg-header d-flex justify-content-between\">\r\n <span>Least/Non Engaged</span>\r\n <span>Count</span>\r\n </div>\r\n <div class=\"row align-items-center py-2 border-bottom\" *ngFor=\"let top of leastEngagers()\">\r\n <div class=\"col-auto\">\r\n <img [src]=\"top?.imageUrl ? top.imageUrl : '{{imgCDN}}fixtureImage/imagenotfound.png'\" alt=\"Product\" class=\"rounded\">\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"fw-medium text-dark small\">{{top.Brandname}}</div>\r\n <div class=\"text-muted\" style=\"font-size: 12px;\">{{top?.productBrandName ?? ''}}</div>\r\n </div>\r\n <div class=\"col-auto\">\r\n <span class=\"fw-medium text-dark\">{{top?.count ?? 0}}</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"text-end py-1\">\r\n <a class=\"text-primary text-decoration-underline\" (click)=\"openPopup('least_Non_Engaged')\">View all</a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\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}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.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-analytic-details ::ng-deep .wall-viewport{margin-bottom:0!important}#fixture-analytic-details #vm-products-sum .wall-viewport{align-items:self-start;margin-bottom:0!important}#fixture-analytic-details #vm-products-sum .body-block{position:relative;width:fit-content}#fixture-analytic-details #vm-products-sum .body-block .block{border:none}#fixture-analytic-details #vm-products-sum .product{height:30px;border-radius:4px;border:.52px solid #12b76a;box-shadow:0 .52px 1.04px #1018280d}#fixture-analytic-details #vm-products-sum .product img{object-fit:cover;border-radius:4px}#fixture-analytic-details #vm-products-sum .product.error{border:.52px solid #f04438;background-color:#fef3f2}#fixture-analytic-details #vm-products-sum #fixture-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:8px;border:1.12px solid var(--Primary-200, #f04438);background:var(--White, #fff);top:50%;left:59%;transform:translate(100%,-50%);transition:all .3s ease;cursor:pointer}#fixture-analytic-details #vm-products-sum #fixture-level .brand,#fixture-analytic-details #vm-products-sum #fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#fixture-analytic-details #vm-products-sum #fixture-level .category{margin-top:12px}#fixture-analytic-details #vm-products-sum #section-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:8px;border:1.12px solid var(--Primary-200, #f04438);transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#fixture-analytic-details #vm-products-sum #section-level .brand,#fixture-analytic-details #vm-products-sum #section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-analytic-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-analytic-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-analytic-details #vm-products-sum #section-level .separator{margin:0 4px;font-weight:600}#fixture-analytic-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-analytic-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-analytic-details #vm-products-sum #shelf-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:8px 4px;border-radius:8px;border:1.12px solid var(--Primary-200, #f04438);transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#fixture-analytic-details #vm-products-sum #shelf-level .brand,#fixture-analytic-details #vm-products-sum #shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-analytic-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-analytic-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-analytic-details #vm-products-sum #shelf-level .separator{margin:0 4px;font-weight:600}#fixture-analytic-details #vm-products-sum .brand-category.proper{border:1.12px solid var(--Primary-200, #32d583)!important}#fixture-analytic-details #vm-products-sum .brand-category .badge{color:#f04438;background-color:#fef3f2}#fixture-analytic-details #vm-products-sum .brand-category .badge.proper{color:#12b76a!important;background-color:#ecfdf3!important}#fixture-analytic-details #vm-products-sum .header-block{width:fit-content}#fixture-analytic-details #vm-products-sum .footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important;width:fit-content}#fixture-analytic-details #vm-products-sum .footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}#fixture-analytic-details #vm-products-sum .storage-box{position:relative;bottom:70px;width:200px;overflow:hidden;padding:4px;border-radius:8px;border:1px solid rgb(152,162,179);transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#fixture-analytic-details #vm-products-sum .storage-box .brand,#fixture-analytic-details #vm-products-sum .storage-box .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-analytic-details #vm-products-sum .storage-box .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum .storage-box .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum .storage-box .separator{margin:0 4px;font-weight:600}#fixture-analytic-details #vm-products-sum .sub-footer{position:relative;width:48%}#fixture-analytic-details #vm-products-sum img{width:100%;height:100%;display:block}#fixture-analytic-details #vm-products-sum .vm-block{position:absolute;width:100px;height:100px;transition:all .3s ease}#fixture-analytic-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-analytic-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-analytic-details .hero-block{background-color:#f9fafb;width:100%;display:flex;flex-direction:column;gap:6px;padding:12px;justify-content:center;align-items:center;margin-bottom:18px}#fixture-analytic-details .hero-block h1{font-size:18px;font-weight:600;color:#101828;margin:0}#fixture-analytic-details .hero-block p{font-weight:500;font-size:16px;line-height:24px;color:#475467;margin:0}.metric-header{background-color:#eaf8ff;padding:8px;border-radius:4px;display:flex;align-items:center;justify-content:space-between;gap:8px}.w-20{width:33%}.card-body img{width:38px;height:38px;object-fit:cover}.w-25{width:50%!important}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }] });
|
|
628
|
+
}
|
|
629
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FixtureAnalyticsComponent, decorators: [{
|
|
630
|
+
type: Component,
|
|
631
|
+
args: [{ selector: "lib-fixture-analytics", template: "<section id=\"fixture-analytic-details\" *ngIf=\"!isPageLoading\">\r\n <div class=\"d-flex p-2 w-100 justify-content-end align-items-center\">\r\n <svg (click)=\"onClickClose()\" class=\"m-2 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\r\n </div>\r\n <div class=\"hero-block\">\r\n <h1 style=\"font-weight: 600;font-size: 30px;\">{{ fixtureTemplateDetails?.fixtureCompliance ?? 0 }}%</h1>\r\n <p>Compliance score</p>\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}<span>•</span>\r\n {{fixtureTemplateDetails?.fixtureCategory}} <span>•</span>\r\n {{fixtureTemplateDetails?.fixtureWidth.value}}{{fixtureTemplateDetails?.fixtureWidth.unit}}<span>•</span>\r\n {{fixtureTemplateDetails?.shelfConfig?.length}} Shelves\r\n </p>\r\n </div>\r\n <div class=\"d-flex justify-content-end mb-4 pe-5\">\r\n <div class=\"form-check form-switch \">\r\n <input [checked]=\"showVMs\" [(ngModel)]=\"showVMs\" [ngModelOptions]=\"{ standalone: true }\"\r\n style=\"cursor: pointer\" class=\"form-check-input\" type=\"checkbox\" />\r\n <label style=\"color: black; white-space: nowrap\" class=\"form-check-label sub ms-2\" for=\"showVMs\">\r\n Show VM\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"w-20\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n <div class=\"metric-header\">\r\n <span class=\"fw-semibold\">Total Footfall</span>\r\n </div>\r\n \r\n <div class=\"mt-2\">\r\n <h2 class=\"mb-1\">{{fixtureFootfall?.zoneTotal?.PreviousData}}</h2>\r\n \r\n <div class=\"d-flex align-items-center gap-1 small\" [ngClass]=\"fixtureFootfall?.zoneTotal?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" style=\"transform: rotate(180deg);\" *ngIf=\"!fixtureFootfall?.zoneTotal?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" *ngIf=\"fixtureFootfall?.zoneTotal?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span class=\"fw-semibold\">{{fixtureFootfall?.zoneTotal?.count}}%</span>\r\n <span class=\"text-muted\">vs Previous day</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"w-20\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n <div class=\"metric-header\">\r\n <span class=\"fw-semibold\">Zone Conversion</span>\r\n </div>\r\n \r\n <div class=\"mt-2\">\r\n <h2 class=\"mb-1\">{{fixtureFootfall?.conversionCount?.PreviousData}}</h2>\r\n \r\n <div class=\"d-flex align-items-center gap-1 small\" [ngClass]=\"fixtureFootfall?.conversionCount?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" style=\"transform: rotate(180deg);\" *ngIf=\"!fixtureFootfall?.conversionCount?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" *ngIf=\"fixtureFootfall?.conversionCount?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span class=\"fw-semibold\">{{fixtureFootfall?.conversionCount?.count}}%</span>\r\n <span class=\"text-muted\">vs Previous day</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"w-20\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"fixtureFootfall?.conversionCount\">\r\n <div class=\"metric-header\">\r\n <span class=\"fw-semibold\">Avg Dwell Time</span>\r\n </div>\r\n \r\n <div class=\"mt-2\">\r\n <h2 class=\"mb-1\">{{fixtureFootfall?.dwellTime?.PreviousData}}</h2>\r\n \r\n <div class=\"d-flex align-items-centergap-1 small\" [ngClass]=\"fixtureFootfall?.dwellTime?.PreviousVariation ? 'text-success' : 'text-danger'\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" style=\"transform: rotate(180deg);\" *ngIf=\"!fixtureFootfall?.dwellTime?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#D92D20\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\" *ngIf=\"fixtureFootfall?.dwellTime?.PreviousVariation\">\r\n <path d=\"M12.3198 3.21386L7.23117 8.30246L4.55296 5.62425L0.535643 9.64157M12.3198 3.21386H9.10592M12.3198 3.21386V6.42771\" stroke=\"#039855\" stroke-width=\"1.2052\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <span class=\"fw-semibold\">{{fixtureFootfall?.dwellTime?.count}}%</span>\r\n <span class=\"text-muted\">vs Previous day</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div id=\"vm-products-sum\" class=\"wall-viewport mt-8\">\r\n <div class=\"fixture-wrapper\">\r\n <!-- Header block -->\r\n <div id=\"header-block\" class=\"header-block\">\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\" [ngClass]=\"{'d-none':!showVMs}\">\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\"\r\n *ngIf=\"fixtureTemplateDetails?.productBrandName?.length\" [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 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\r\n *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\r\n *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 [class.proper]=\"!item?.section?.improper\">\r\n <div class=\"d-flex gap-1\">\r\n <span class=\"badge inactive\">\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\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\r\n <div class=\"d-flex gap-1 mb-1\">\r\n <span class=\"badge\" *ngIf=\"item.section.missing > 0\">\r\n Missing {{item.section.missing}}\r\n </span>\r\n <span class=\"badge\" *ngIf=\"item.section.misplaced > 0\">\r\n Misplaced {{item.section.misplaced}}\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\"\r\n *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 </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;let p = index\" class=\"product cursor-pointer\"\r\n [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\"\r\n (click)=\"openZoneLevelProductModalByProduct(product,item)\">\r\n @if(product.status != 'missing'){\r\n <img *ngIf=\"product?.productImageUrl; else placeholder\"\r\n [src]=\"product?.productImageUrl\" 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;let r = index\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of row;let p = index\" class=\"product cursor-pointer\"\r\n [class.error]=\"product.status === 'missing' || product.status === 'misplaced'\"\r\n (click)=\"openZoneLevelProductModalByProduct(product,item)\">\r\n @if(product.status != 'missing'){\r\n <img *ngIf=\"product?.productImageUrl; else placeholder\"\r\n [src]=\"product?.productImageUrl\" 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\">\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div id=\"footer-block\" class=\"footer-block\">\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\r\n <div id=\"storage-box-zone\" *ngIf=\"fixtureTemplateDetails?.storageProducts?.length\" class=\"storage-box\"\r\n (click)=\"openStoreBoxProducts()\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n\r\n <span class=\"badge inactive\">\r\n Capacity {{ fixtureTemplateDetails?.storageProducts?.length ?? 0}}\r\n </span>\r\n\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\">\r\n @for(p of fixtureTemplateDetails?.storageProducts; track $index; let last = $last){\r\n {{p.brandName}}\r\n }\r\n </span>\r\n <span class=\"category\">\r\n @for(p of fixtureTemplateDetails?.storageProducts; track $index; let last = $last){\r\n {{p.category}}\r\n }\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <!-- Brands -->\r\n <p>\r\n <b>Brands: </b>\r\n\r\n @for (\r\n b of fixtureTemplateDetails?.storageProducts?.slice(0, 20);\r\n track $index;\r\n let last = $last\r\n ) {\r\n {{ b?.brandName }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n\r\n @if ((fixtureTemplateDetails?.storageProducts?.length ?? 0) > 20) {\r\n , +{{ (fixtureTemplateDetails?.storageProducts.length - 20) }}\r\n }\r\n </p>\r\n\r\n <!-- Categories -->\r\n <p>\r\n <b>Categories: </b>\r\n\r\n @for (\r\n b of fixtureTemplateDetails?.storageProducts?.slice(0, 20);\r\n track $index;\r\n let last = $last\r\n ) {\r\n {{ b?.category }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n\r\n @if ((fixtureTemplateDetails?.storageProducts?.length ?? 0) > 20) {\r\n , +{{ (fixtureTemplateDetails?.storageProducts.length - 20) }}\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"row g-3\">\r\n <div class=\"w-25\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\" *ngIf=\"engagersList?.['Top Engaged']?.length\">\r\n <div class=\"metric-header bg-header d-flex justify-content-between\">\r\n <span>Top Engaged</span>\r\n <span>Count</span>\r\n </div>\r\n <div class=\"row align-items-center py-2 border-bottom\" *ngFor=\"let top of topEngagers()\">\r\n <div class=\"col-auto\">\r\n <img [src]=\"top?.imageUrl ? top.imageUrl : '{{imgCDN}}fixtureImage/imagenotfound.png'\" alt=\"Product\" class=\"rounded\">\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"fw-medium text-dark small\">{{top?.Brandname ?? ''}}</div>\r\n <div class=\"text-muted\" style=\"font-size: 12px;\">{{top?.productBrandName ?? ''}}</div>\r\n </div>\r\n <div class=\"col-auto\">\r\n <span class=\"fw-medium text-dark\">{{top?.count ?? 0}}</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"text-end py-1\">\r\n <a class=\"text-primary text-decoration-underline\" (click)=\"openPopup('Top Engaged')\">View all</a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"w-25\" *ngIf=\"engagersList?.['Non Engaged']?.length\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-body p-2\">\r\n <div class=\"metric-header bg-header d-flex justify-content-between\">\r\n <span>Least/Non Engaged</span>\r\n <span>Count</span>\r\n </div>\r\n <div class=\"row align-items-center py-2 border-bottom\" *ngFor=\"let top of leastEngagers()\">\r\n <div class=\"col-auto\">\r\n <img [src]=\"top?.imageUrl ? top.imageUrl : '{{imgCDN}}fixtureImage/imagenotfound.png'\" alt=\"Product\" class=\"rounded\">\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"fw-medium text-dark small\">{{top.Brandname}}</div>\r\n <div class=\"text-muted\" style=\"font-size: 12px;\">{{top?.productBrandName ?? ''}}</div>\r\n </div>\r\n <div class=\"col-auto\">\r\n <span class=\"fw-medium text-dark\">{{top?.count ?? 0}}</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"text-end py-1\">\r\n <a class=\"text-primary text-decoration-underline\" (click)=\"openPopup('least_Non_Engaged')\">View all</a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\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}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.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-analytic-details ::ng-deep .wall-viewport{margin-bottom:0!important}#fixture-analytic-details #vm-products-sum .wall-viewport{align-items:self-start;margin-bottom:0!important}#fixture-analytic-details #vm-products-sum .body-block{position:relative;width:fit-content}#fixture-analytic-details #vm-products-sum .body-block .block{border:none}#fixture-analytic-details #vm-products-sum .product{height:30px;border-radius:4px;border:.52px solid #12b76a;box-shadow:0 .52px 1.04px #1018280d}#fixture-analytic-details #vm-products-sum .product img{object-fit:cover;border-radius:4px}#fixture-analytic-details #vm-products-sum .product.error{border:.52px solid #f04438;background-color:#fef3f2}#fixture-analytic-details #vm-products-sum #fixture-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:8px;border:1.12px solid var(--Primary-200, #f04438);background:var(--White, #fff);top:50%;left:59%;transform:translate(100%,-50%);transition:all .3s ease;cursor:pointer}#fixture-analytic-details #vm-products-sum #fixture-level .brand,#fixture-analytic-details #vm-products-sum #fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#fixture-analytic-details #vm-products-sum #fixture-level .category{margin-top:12px}#fixture-analytic-details #vm-products-sum #section-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:4px;border-radius:8px;border:1.12px solid var(--Primary-200, #f04438);transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#fixture-analytic-details #vm-products-sum #section-level .brand,#fixture-analytic-details #vm-products-sum #section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-analytic-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-analytic-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-analytic-details #vm-products-sum #section-level .separator{margin:0 4px;font-weight:600}#fixture-analytic-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-analytic-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-analytic-details #vm-products-sum #shelf-level .brand-category{position:absolute;width:200px;overflow:hidden;padding:8px 4px;border-radius:8px;border:1.12px solid var(--Primary-200, #f04438);transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#fixture-analytic-details #vm-products-sum #shelf-level .brand,#fixture-analytic-details #vm-products-sum #shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-analytic-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-analytic-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-analytic-details #vm-products-sum #shelf-level .separator{margin:0 4px;font-weight:600}#fixture-analytic-details #vm-products-sum .brand-category.proper{border:1.12px solid var(--Primary-200, #32d583)!important}#fixture-analytic-details #vm-products-sum .brand-category .badge{color:#f04438;background-color:#fef3f2}#fixture-analytic-details #vm-products-sum .brand-category .badge.proper{color:#12b76a!important;background-color:#ecfdf3!important}#fixture-analytic-details #vm-products-sum .header-block{width:fit-content}#fixture-analytic-details #vm-products-sum .footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important;width:fit-content}#fixture-analytic-details #vm-products-sum .footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}#fixture-analytic-details #vm-products-sum .storage-box{position:relative;bottom:70px;width:200px;overflow:hidden;padding:4px;border-radius:8px;border:1px solid rgb(152,162,179);transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#fixture-analytic-details #vm-products-sum .storage-box .brand,#fixture-analytic-details #vm-products-sum .storage-box .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#fixture-analytic-details #vm-products-sum .storage-box .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum .storage-box .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#fixture-analytic-details #vm-products-sum .storage-box .separator{margin:0 4px;font-weight:600}#fixture-analytic-details #vm-products-sum .sub-footer{position:relative;width:48%}#fixture-analytic-details #vm-products-sum img{width:100%;height:100%;display:block}#fixture-analytic-details #vm-products-sum .vm-block{position:absolute;width:100px;height:100px;transition:all .3s ease}#fixture-analytic-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-analytic-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-analytic-details .hero-block{background-color:#f9fafb;width:100%;display:flex;flex-direction:column;gap:6px;padding:12px;justify-content:center;align-items:center;margin-bottom:18px}#fixture-analytic-details .hero-block h1{font-size:18px;font-weight:600;color:#101828;margin:0}#fixture-analytic-details .hero-block p{font-weight:500;font-size:16px;line-height:24px;color:#475467;margin:0}.metric-header{background-color:#eaf8ff;padding:8px;border-radius:4px;display:flex;align-items:center;justify-content:space-between;gap:8px}.w-20{width:33%}.card-body img{width:38px;height:38px;object-fit:cover}.w-25{width:50%!important}\n"] }]
|
|
632
|
+
}], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.GlobalStateService }, { type: i0.ChangeDetectorRef }, { type: i3.NgbModal }], propDecorators: { fixtureDetails: [{
|
|
633
|
+
type: Input
|
|
634
|
+
}], vmList: [{
|
|
635
|
+
type: Input
|
|
636
|
+
}], floorData: [{
|
|
637
|
+
type: Input
|
|
638
|
+
}], startDate: [{
|
|
639
|
+
type: Input
|
|
640
|
+
}], endDate: [{
|
|
641
|
+
type: Input
|
|
642
|
+
}], dataType: [{
|
|
643
|
+
type: Input
|
|
644
|
+
}], onClose: [{
|
|
645
|
+
type: Output
|
|
646
|
+
}], changeFixture: [{
|
|
647
|
+
type: Output
|
|
648
|
+
}] } });
|
|
649
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1hbmFseXRpY3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm9ncmFtL3BsYW5vLWFuYWx5dGljcy9maXh0dXJlLWFuYWx5dGljcy9maXh0dXJlLWFuYWx5dGljcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9wbGFub2dyYW0vcGxhbm8tYW5hbHl0aWNzL2ZpeHR1cmUtYW5hbHl0aWNzL2ZpeHR1cmUtYW5hbHl0aWNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFLdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBS3pELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3JHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7O0FBT3ZGLE1BQU0sT0FBTyx5QkFBeUI7SUFpRTFCO0lBQ0E7SUFDQTtJQUNBO0lBakVELGNBQWMsQ0FBTTtJQUNwQixNQUFNLEdBQW9CLEVBQUUsQ0FBQztJQUM3QixTQUFTLENBQU07SUFDZixTQUFTLENBQU07SUFDZixPQUFPLENBQU07SUFDYixRQUFRLENBQU07SUFFYixPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUNsQyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBS3RDLENBQUM7SUFFTCxzQkFBc0IsQ0FBTTtJQUM1QixRQUFRLENBQVM7SUFFakIsTUFBTSxDQUFT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WUFBWTtRQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxTQUFTLENBQUMsSUFBUztRQUNqQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUMzRCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSx3QkFBd0I7WUFDckMsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDcEQsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDekMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQzt3R0Ezd0JVLHlCQUF5Qjs0RkFBekIseUJBQXlCLDZTQzdCdEMseWs2QkFrZVU7OzRGRHJjRyx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0UsdUJBQXVCO2dMQU94QixjQUFjO3NCQUF0QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdDaGVja2VkLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHsgVm1MaWJyYXJ5TGlzdCB9IGZyb20gXCIuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL3ZtLWxpYnJhcnkuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktZ2xvYmFsXCI7XHJcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20sIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7XHJcbiAgU2hlbGZDb25maWcsXHJcbiAgU2VjdGlvbkNvbmZpZyxcclxufSBmcm9tIFwiLi4vLi4vLi4vLi4vaW50ZXJmYWNlcy9maXh0dXJlLXRlbXBsYXRlLmludGVyZmFjZVwiO1xyXG5pbXBvcnQgeyBab25lUHJvZHVjdHNDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vbWVyY2gtY29tcGxpYW5jZS96b25lLXByb2R1Y3RzL3pvbmUtcHJvZHVjdHMuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEFuYWx5dGljc1BvcHVwQ29tcG9uZW50IH0gZnJvbSBcIi4uL2FuYWx5dGljcy1wb3B1cC9hbmFseXRpY3MtcG9wdXAuY29tcG9uZW50XCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJsaWItZml4dHVyZS1hbmFseXRpY3NcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2ZpeHR1cmUtYW5hbHl0aWNzLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9maXh0dXJlLWFuYWx5dGljcy5jb21wb25lbnQuc2Nzc1wiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRml4dHVyZUFuYWx5dGljc0NvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveVxyXG57XHJcbiAgQElucHV0KCkgZml4dHVyZURldGFpbHM6IGFueTtcclxuICBASW5wdXQoKSB2bUxpc3Q6IFZtTGlicmFyeUxpc3RbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGZsb29yRGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIHN0YXJ0RGF0ZTogYW55O1xyXG4gIEBJbnB1dCgpIGVuZERhdGU6IGFueTtcclxuICBASW5wdXQoKSBkYXRhVHlwZTogYW55O1xyXG5cclxuICBAT3V0cHV0KCkgb25DbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBjaGFuZ2VGaXh0dXJlID0gbmV3IEV2ZW50RW1pdHRlcjx7XHJcbiAgICBmaXh0dXJlSWQ6IHN0cmluZztcclxuICAgIGZpeHR1cmVOYW1lOiBzdHJpbmc7XHJcbiAgICBzaGVsZklkOiBzdHJpbmc7XHJcbiAgICB6b25lOiBzdHJpbmc7XHJcbiAgfT4oKTtcclxuXHJcbiAgZml4dHVyZVRlbXBsYXRlRGV0YWlsczogYW55O1xyXG4gIGNsaWVudElkOiBzdHJpbmc7XHJcblxyXG4gIGltZ0NETjogc3RyaW5nO1xyXG5cclxuICB6b25lQ29sb3IgPSB7XHJcbiAgICByaWdodDoge1xyXG4gICAgICBiZzogXCIjZmZmZmZmXCIsXHJcbiAgICAgIHRleHQ6IFwiIzEyQjc2QVwiLFxyXG4gICAgICBib3JkZXI6IFwiIzMyRDU4M1wiLFxyXG4gICAgICBwcm9kdWN0Qm9yZGVyOiBcIiMxMkI3NkFcIixcclxuICAgICAgcHJvZHVjdEJnOiBcIiNGQ0ZDRkRcIixcclxuICAgIH0sXHJcbiAgICB3cm9uZzoge1xyXG4gICAgICBiZzogXCIjZmZmZmZmXCIsXHJcbiAgICAgIHRleHQ6IFwiI0YwNDQzOFwiLFxyXG4gICAgICBib3JkZXI6IFwiIzk4YTJiM1wiLFxyXG4gICAgICBwcm9kdWN0Qm9yZGVyOiBcIiNGMDQ0MzhcIixcclxuICAgICAgcHJvZHVjdEJnOiBcIiNGRUNEQ0FcIixcclxuICAgIH0sXHJcbiAgfTtcclxuXHJcbiAgc2VjdGlvbkJ5Wm9uZXM6IHtcclxuICAgIHpvbmU6IHN0cmluZztcclxuICAgIHNlY3Rpb246IHtcclxuICAgICAgYnJhbmRzOiBzdHJpbmdbXTtcclxuICAgICAgY2F0ZWdvcmllczogc3RyaW5nW107XHJcbiAgICAgIHNoZWx2ZXM6IHN0cmluZ1tdO1xyXG4gICAgICBzaGVsZkRpdnM6IChIVE1MRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQpW107XHJcbiAgICAgIHByb2R1Y3RzOiBhbnk7XHJcbiAgICAgIGltcHJvcGVyOiBib29sZWFuO1xyXG4gICAgICBtaXNzaW5nOiBudW1iZXI7XHJcbiAgICAgIG1pc3BsYWNlZDogbnVtYmVyO1xyXG4gICAgICBjYXBhY2l0eTogbnVtYmVyO1xyXG4gICAgfTtcclxuICB9W10gPSBbXTtcclxuXHJcbiAgaXNQYWdlTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgc2hvd1ZNczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgaXNWTUluaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBpc0JDSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBlbmdhZ2Vyc0xpc3Q6IGFueTtcclxuICBmaXh0dXJlRm9vdGZhbGw6YW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc3RvcmVCdWlsZGVyU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBuZ2JNb2RhbDogTmdiTW9kYWwsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmdzLmVudmlyb25tZW50XHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoZW52KSA9PiAodGhpcy5pbWdDRE4gPSBlbnYucGxhbm9ncmFtQ0ROKSk7XHJcblxyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YT8uY2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgaGVhZGVyRGF0YSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEVuZ2FnZXJzTGlzdCgpIHtcclxuICAgIHRoaXMuZW5nYWdlcnNMaXN0ID0gbnVsbDtcclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICBmcm9tX2RhdGU6IHRoaXMuc3RhcnREYXRlLFxyXG4gICAgICB0b19kYXRlOiB0aGlzLmVuZERhdGUsXHJcbiAgICAgIGZpeHR1cmVJZDogdGhpcy5maXh0dXJlRGV0YWlscy5faWQsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZVxyXG4gICAgICAuZ2V0U3RvcmVGaXh0dXJlRW5nYWdlcnMocGF5bG9hZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZ2FnZXJzTGlzdCA9IHJlcz8uZGF0YT8uZGF0YSB8fCB7fTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuZW5nYWdlcnNMaXN0LCBcInRoaXMuZW5nYWdlcnNMaXN0XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b3BFbmdhZ2VycygpIHtcclxuICAgIHJldHVybiB0aGlzLmVuZ2FnZXJzTGlzdD8uW1wiVG9wIEVuZ2FnZWRcIl0/LnNsaWNlKDAsIDMpO1xyXG4gIH1cclxuXHJcbiAgbGVhc3RFbmdhZ2VycygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIC4uLnRoaXMuZW5nYWdlcnNMaXN0Py5bXCJOb24gRW5nYWdlZFwiXSxcclxuICAgICAgLi4udGhpcy5lbmdhZ2Vyc0xpc3Q/LltcIkxlYXN0IEVuZ2FnZWRcIl0sXHJcbiAgICBdPy5zbGljZSgwLCAzKTtcclxuICB9XHJcblxyXG4gIGdldEZpeHR1cmVGb290ZmFsbCgpIHtcclxuICAgIHRoaXMuZml4dHVyZUZvb3RmYWxsID0gbnVsbDtcclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICBmcm9tRGF0ZTogdGhpcy5zdGFydERhdGUsXHJcbiAgICAgIHRvRGF0ZTogdGhpcy5lbmREYXRlLFxyXG4gICAgICBzdG9yZUlkOiBbdGhpcy5mbG9vckRhdGEuc3RvcmVJZF0sXHJcbiAgICAgIHpvbmU6IGBGaXh0dXJlICR7dGhpcy5maXh0dXJlRGV0YWlscz8uZml4dHVyZU51bWJlcn1gLFxyXG4gICAgICBkYXRhVHlwZTp0aGlzLmRhdGFUeXBlXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZVxyXG4gICAgICAuZ2V0U3RvcmVGaXh0dXJlRm9vdGZhbGwocGF5bG9hZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlcywncmVzJylcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRm9vdGZhbGwgPSByZXM/LmRhdGE/LmNhcmQgfHwge307XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChjaGFuZ2VzW1wiZml4dHVyZURldGFpbHNcIl0/LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmdldEVuZ2FnZXJzTGlzdCgpO1xyXG4gICAgICB0aGlzLmdldEZpeHR1cmVGb290ZmFsbCgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmdldEZpeHR1cmVTaGVsZkRldGFpbHMoY2hhbmdlc1tcImZpeHR1cmVEZXRhaWxzXCJdLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXBwbHlTaGVsZkNvbG9ycygpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlVm1Qb3NpdGlvbkFuZFNpemUoKTtcclxuICAgICAgfSwgMjAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0JDSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy5pc0JDSW5pdGlhbGl6ZWQgPSB0aGlzLmFwcGx5U2hlbGZDb2xvcnMoKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5pc1ZNSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy5pc1ZNSW5pdGlhbGl6ZWQgPSB0aGlzLmhhbmRsZVZtUG9zaXRpb25BbmRTaXplKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRGaXh0dXJlU2hlbGZEZXRhaWxzKGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICBmaXh0dXJlSWQ6IGRhdGE/Ll9pZCxcclxuICAgICAgcGxhbm9JZDogZGF0YT8ucGxhbm9JZCxcclxuICAgICAgZmxvb3JJZDogZGF0YT8uZmxvb3JJZCxcclxuICAgICAgY29tcGxpYW5jZTogdHJ1ZSxcclxuICAgICAgLi4uKHRoaXMuZml4dHVyZURldGFpbHM/LnJldmlzaW9uSWQgJiYge1xyXG4gICAgICAgIHJldmlzaW9uSWQ6IHRoaXMuZml4dHVyZURldGFpbHMucmV2aXNpb25JZCxcclxuICAgICAgfSksXHJcbiAgICB9O1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZ2V0U2hlbGZEZXRhaWxzKHBheWxvYWQpLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAocmVzPy5zdGF0dXMgPT09IFwic3VjY2Vzc1wiICYmIHJlcz8uZGF0YSkge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyA9IHtcclxuICAgICAgICAgIC4uLnJlcz8uZGF0YSxcclxuICAgICAgICAgIHNoZWxmQ29uZmlnOiByZXM/LmRhdGE/LnNoZWx2ZXMgPz8gW10sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLnNoZWxmQ29uZmlnID1cclxuICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5zaGVsZkNvbmZpZy5tYXAoKHM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocy5zaGVsZlR5cGUgIT09IFwic2hlbGZcIiAmJiBzLnByb2R1Y3RzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICBzLmRpc3RyaWJ1dGVkUm93cyA9IHRoaXMuZGlzdHJpYnV0ZVJvdW5kUm9iaW4oXHJcbiAgICAgICAgICAgICAgICBzLnByb2R1Y3RzLFxyXG4gICAgICAgICAgICAgICAgcy50cmF5Um93cyxcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBzO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsbFByb2R1Y3RzID0gKFxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZyA/PyBbXVxyXG4gICAgICAgICkuZmxhdE1hcCgoczogYW55KSA9PiBzLnByb2R1Y3RzID8/IFtdKTtcclxuXHJcbiAgICAgICAgYWxsUHJvZHVjdHMuZm9yRWFjaCgocDogYW55LCBpOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGlmICghcD8ucHJvZHVjdElkKSB7XHJcbiAgICAgICAgICAgIHBbXCJwcm9kdWN0SWRcIl0gPSBpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0Rml4dHVyZVNoZWxmRGV0YWlscyBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZFZNKHZtOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLnZtTGlzdC5maW5kKCh2KSA9PiB2LmlkID09PSB2bT8udm1JZCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVWbVBvc2l0aW9uQW5kU2l6ZSgpIHtcclxuICAgIGNvbnN0IHZpZXdQb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJib2R5LWJsb2NrLXN1bVwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghdmlld1BvcnQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBib2R5V2lkdGggPSB2aWV3UG9ydC5vZmZzZXRXaWR0aDtcclxuXHJcbiAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhlYWRlci1ibG9ja1wiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnN0IGZvb3RlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZm9vdGVyLWJsb2NrXCIpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGhlYWRlci5zdHlsZS53aWR0aCA9IGAke2JvZHlXaWR0aH1weGA7XHJcbiAgICBmb290ZXIuc3R5bGUud2lkdGggPSBgJHtib2R5V2lkdGh9cHhgO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8udm1Db25maWc/LmZvckVhY2goKGU6IGFueSwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGxldCBzdGFydFNoZWxmID0gZT8uc3RhcnRZUG9zaXRpb24gPz8gMTtcclxuXHJcbiAgICAgIGxldCBlbmRTaGVsZiA9XHJcbiAgICAgICAgZT8uZW5kWVBvc2l0aW9uID8/XHJcbiAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubGVuZ3RoID8/XHJcbiAgICAgICAgMTtcclxuXHJcbiAgICAgIGNvbnN0IHZtID0gdmlld1BvcnQucXVlcnlTZWxlY3RvcihgI3ZtJHtpfWApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBpZiAoIXZtKSByZXR1cm47XHJcblxyXG4gICAgICBsZXQgeCA9IDA7XHJcbiAgICAgIGxldCB5ID0gMDtcclxuXHJcbiAgICAgIGxldCB5U3RhcnQgPSAwO1xyXG4gICAgICBmb3IgKGxldCBrID0gMTsgayA8IHN0YXJ0U2hlbGY7IGsrKykge1xyXG4gICAgICAgIGNvbnN0IHMgPSBnZXRTaGVsZkRpdihrKTtcclxuICAgICAgICBpZiAoIXMpIHJldHVybjtcclxuXHJcbiAgICAgICAgeVN0YXJ0ICs9IHMub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgcGxhY2VtZW50SGVpZ2h0ID0gMDtcclxuICAgICAgbGV0IHBsYWNlbWVudFdpZHRoID0gYm9keVdpZHRoO1xyXG5cclxuICAgICAgZm9yIChsZXQgayA9IHN0YXJ0U2hlbGY7IGsgPD0gZW5kU2hlbGY7IGsrKykge1xyXG4gICAgICAgIGNvbnN0IHMgPSBnZXRTaGVsZkRpdihrKTtcclxuICAgICAgICBpZiAoIXMpIHJldHVybjtcclxuICAgICAgICBwbGFjZW1lbnRIZWlnaHQgKz0gcy5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBkZWZhdWx0VyA9IHBsYWNlbWVudFdpZHRoIC8gMztcclxuICAgICAgbGV0IGRlZmF1bHRIID0gcGxhY2VtZW50SGVpZ2h0IC8gMztcclxuXHJcbiAgICAgIGxldCB3aWR0aCA9IGRlZmF1bHRXO1xyXG4gICAgICBsZXQgaGVpZ2h0ID0gZGVmYXVsdEg7XHJcblxyXG4gICAgICBzd2l0Y2ggKGU/Lnhab25lKSB7XHJcbiAgICAgICAgY2FzZSBcImxlZnRcIjpcclxuICAgICAgICAgIHggPSAwO1xyXG4gICAgICAgICAgd2lkdGggPSBkZWZhdWx0VztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJyaWdodFwiOlxyXG4gICAgICAgICAgd2lkdGggPSBkZWZhdWx0VztcclxuICAgICAgICAgIHggPSBib2R5V2lkdGggLSB3aWR0aDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaWRkbGVcIjpcclxuICAgICAgICAgIHdpZHRoID0gZGVmYXVsdFc7XHJcbiAgICAgICAgICB4ID0gKGJvZHlXaWR0aCAtIHdpZHRoKSAvIDI7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwic3RyZXRjaFwiOlxyXG4gICAgICAgICAgd2lkdGggPSBib2R5V2lkdGg7XHJcbiAgICAgICAgICB4ID0gMDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzd2l0Y2ggKGU/Lnlab25lKSB7XHJcbiAgICAgICAgY2FzZSBcInRvcFwiOlxyXG4gICAgICAgICAgaGVpZ2h0ID0gcGxhY2VtZW50SGVpZ2h0IDwgZGVmYXVsdEggPyBwbGFjZW1lbnRIZWlnaHQgLSAyMCA6IGRlZmF1bHRIO1xyXG4gICAgICAgICAgeSA9IHlTdGFydDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJtaWRkbGVcIjpcclxuICAgICAgICAgIGhlaWdodCA9IHBsYWNlbWVudEhlaWdodCA8IGRlZmF1bHRIID8gcGxhY2VtZW50SGVpZ2h0IC0gMjAgOiBkZWZhdWx0SDtcclxuICAgICAgICAgIHkgPSAocGxhY2VtZW50SGVpZ2h0IC0gaGVpZ2h0KSAvIDIgKyB5U3RhcnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiYm90dG9tXCI6XHJcbiAgICAgICAgICBoZWlnaHQgPSBwbGFjZW1lbnRIZWlnaHQgPCBkZWZhdWx0SCA/IHBsYWNlbWVudEhlaWdodCAtIDIwIDogZGVmYXVsdEg7XHJcbiAgICAgICAgICB5ID0gcGxhY2VtZW50SGVpZ2h0IC0gaGVpZ2h0ICsgeVN0YXJ0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcInN0cmV0Y2hcIjpcclxuICAgICAgICAgIGhlaWdodCA9IHBsYWNlbWVudEhlaWdodDtcclxuICAgICAgICAgIHkgPSB5U3RhcnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgdm0uc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgIHZtLnN0eWxlLmhlaWdodCA9IGAgJHtoZWlnaHR9cHhgO1xyXG4gICAgICB2bS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWA7XHJcblxyXG4gICAgICBmdW5jdGlvbiBnZXRTaGVsZkRpdihrOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZGl2ID0gdmlld1BvcnQucXVlcnlTZWxlY3RvcihgI3NoZWxmJHtrfWApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmICghZGl2KSBkaXYgPSB2aWV3UG9ydC5xdWVyeVNlbGVjdG9yKGAjdHJheSR7a31gKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICByZXR1cm4gZGl2IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlTaGVsZkNvbG9ycygpIHtcclxuICAgIGNvbnN0IGJvZGllcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYm9keS1ibG9jay1zdW1cIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIWJvZGllcykgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgYm9keVdpZHRoID0gYm9kaWVzLm9mZnNldFdpZHRoO1xyXG5cclxuICAgIGNvbnN0IGJvZHlDaGlsZHJlbiA9IEFycmF5LmZyb20oYm9kaWVzPy5jaGlsZHJlbiA/PyBbXSkgYXMgSFRNTEVsZW1lbnRbXTtcclxuXHJcbiAgICBjb25zdCBzaGVsZkRpdnMgPSBib2R5Q2hpbGRyZW5cclxuICAgICAgLm1hcCgoZGl2KSA9PiBkaXYgYXMgSFRNTEVsZW1lbnQpXHJcbiAgICAgIC5maWx0ZXIoKGQpID0+IGQ/LmlkLmluY2x1ZGVzKFwic3VtU2hlbGZDb250YWluZXJcIikpO1xyXG5cclxuICAgIGlmICghc2hlbGZEaXZzKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgYWRqdXN0ID0gMDtcclxuICAgIHN3aXRjaCAodGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsKSB7XHJcbiAgICAgIGNhc2UgXCJMMVwiOiAvL2ZpeHR1cmVcclxuICAgICAgICAvLyBjb25zdCBhbGxQcm9kdWN0cyA9IChcclxuICAgICAgICAvLyAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbHZlcyA/PyBbXVxyXG4gICAgICAgIC8vICkuZmxhdE1hcCgoczogYW55KSA9PiBzLnByb2R1Y3RzID8/IFtdKTtcclxuXHJcbiAgICAgICAgLy8gY29uc3QgaXNJbXByb3BlciA9XHJcbiAgICAgICAgLy8gICBhbGxQcm9kdWN0cy5sZW5ndGggPT0gMFxyXG4gICAgICAgIC8vICAgICA/IHRydWVcclxuICAgICAgICAvLyAgICAgOiBhbGxQcm9kdWN0cy5zb21lKFxyXG4gICAgICAgIC8vICAgICAgICAgKHA6IGFueSkgPT5cclxuICAgICAgICAvLyAgICAgICAgICAgcC5zdGF0dXMgPT09IFwibWlzcGxhY2VkXCIgfHxcclxuICAgICAgICAvLyAgICAgICAgICAgcC5zdGF0dXMgPT09IFwibWlzc2luZ1wiIHx8XHJcbiAgICAgICAgLy8gICAgICAgICAgIHAuc3RhdHVzID09PSBcIlwiXHJcbiAgICAgICAgLy8gICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gc2hlbGZEaXZzLmZvckVhY2goKGQpID0+IHtcclxuICAgICAgICAvLyAgIGlmIChkKSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGJsb2NrRGl2ID0gZC5xdWVyeVNlbGVjdG9yKFwiLmJsb2NrXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIC8vICAgICBpZiAoYmxvY2tEaXYpIHtcclxuICAgICAgICAvLyAgICAgICBibG9ja0Rpdi5zdHlsZS5ib3JkZXJDb2xvciA9IGlzSW1wcm9wZXJcclxuICAgICAgICAvLyAgICAgICAgID8gdGhpcy56b25lQ29sb3Iud3JvbmcuYm9yZGVyXHJcbiAgICAgICAgLy8gICAgICAgICA6IHRoaXMuem9uZUNvbG9yLnJpZ2h0LmJvcmRlcjtcclxuICAgICAgICAvLyAgICAgICBibG9ja0Rpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBpc0ltcHJvcGVyXHJcbiAgICAgICAgLy8gICAgICAgICA/IHRoaXMuem9uZUNvbG9yLndyb25nLmJnXHJcbiAgICAgICAgLy8gICAgICAgICA6IHRoaXMuem9uZUNvbG9yLnJpZ2h0LmJnO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgLy8gY29uc3QgbDEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImZpeHR1cmUtbGV2ZWxcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgLy8gaWYgKGwxKSB7XHJcbiAgICAgICAgLy8gICBjb25zdCBiYyA9IGwxLnF1ZXJ5U2VsZWN0b3IoXCIuYnJhbmQtY2F0ZWdvcnlcIikgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vICAgaWYgKGJjKSB7XHJcbiAgICAgICAgLy8gICAgIGlmIChpc0ltcHJvcGVyKSB7XHJcbiAgICAgICAgLy8gICAgICAgYmMuY2xhc3NMaXN0LmFkZChcIndyb25nXCIpO1xyXG4gICAgICAgIC8vICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgIGJjLmNsYXNzTGlzdC5yZW1vdmUoXCJ3cm9uZ1wiKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiTDNcIjogLy9zZWN0aW9uXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29uc3Qgc2hlbHZlcyA9IHNoZWxmRGl2c1xyXG4gICAgICAgICAgICAubWFwKChkaXYpID0+XHJcbiAgICAgICAgICAgICAgZGl2Lmxhc3RFbGVtZW50Q2hpbGQ/LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJkaXZcIlxyXG4gICAgICAgICAgICAgICAgPyAoZGl2Lmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICA6IG51bGwsXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdFNlcXVlbnRpYWxTZWN0aW9uKHNoZWx2ZXMpO1xyXG4gICAgICAgICAgY29uc3Qgc2VjdGlvbkFycmF5ID0gdGhpcy5ncm91cFNoZWx2ZXNCeVpvbmUoXHJcbiAgICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWcgPz8gW10sXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgY29uc3QgYWxsU2VjdGlvblNoZWx2ZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgICAgICAgc2VjdGlvbkFycmF5LmZvckVhY2goKHNlLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNoZWxmSWRzID1cclxuICAgICAgICAgICAgICBzZS5zaGVsdmVzPy5tYXAoKHNoKSA9PiBzaC5yZXBsYWNlKC9cXHMvZywgXCJcIikudG9Mb3dlckNhc2UoKSkgPz9cclxuICAgICAgICAgICAgICBbXTtcclxuICAgICAgICAgICAgYWxsU2VjdGlvblNoZWx2ZXMucHVzaCguLi5zaGVsZklkcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlY0RpdnMgPSBzaGVsdmVzLmZpbHRlcigoaXRlbSkgPT5cclxuICAgICAgICAgICAgICBzaGVsZklkcz8uaW5jbHVkZXMoaXRlbT8uaWQgPz8gXCJcIiksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZSA9IHRoaXMuc2VjdGlvbkJ5Wm9uZXMuZmluZChcclxuICAgICAgICAgICAgICAocykgPT4gcy56b25lID09PSBzZS56b25lLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgc2VjRGl2cy5mb3JFYWNoKChkLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgLy8gaWYgKGQpIGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5iZztcclxuICAgICAgICAgICAgICBpZiAoZCkge1xyXG4gICAgICAgICAgICAgICAgZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjdXJyZW50U2U/LnNlY3Rpb24uaW1wcm9wZXJcclxuICAgICAgICAgICAgICAgICAgPyB0aGlzLnpvbmVDb2xvci53cm9uZy5iZ1xyXG4gICAgICAgICAgICAgICAgICA6IHRoaXMuem9uZUNvbG9yLnJpZ2h0LmJnO1xyXG4gICAgICAgICAgICAgICAgZC5zdHlsZS5ib3JkZXJSaWdodCA9IGAycHggc29saWRgO1xyXG4gICAgICAgICAgICAgICAgZC5zdHlsZS5ib3JkZXJMZWZ0ID0gYDJweCBzb2xpZGA7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNlY0RpdnMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgZC5zdHlsZS5ib3JkZXIgPSBgMnB4IHNvbGlkYDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VjRGl2cy5sZW5ndGggPiAxICYmIHNlY0RpdnMubGVuZ3RoIDw9IDIpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGQuc3R5bGUuYm9yZGVyVG9wID0gYDFweCBzb2xpZGA7XHJcbiAgICAgICAgICAgICAgICAgICAgZC5zdHlsZS5ib3JkZXJCb3R0b20gPSBgMC41cHggZG90dGVkYDtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IHNlY0RpdnMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGQuc3R5bGUuYm9yZGVyQm90dG9tID0gYDFweCBzb2xpZGA7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBkLnN0eWxlLmJvcmRlclRvcCA9IGAxcHggc29saWRgO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gc2VjRGl2cy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZC5zdHlsZS5ib3JkZXJCb3R0b20gPSBgMXB4IHNvbGlkYDtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkLnN0eWxlLmJvcmRlclRvcCA9IGAwLjVweCBkb3R0ZWRgO1xyXG4gICAgICAgICAgICAgICAgICAgIGQuc3R5bGUuYm9yZGVyQm90dG9tID0gYDAuNXB4IGRvdHRlZGA7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGQuc3R5bGUuYm9yZGVyQ29sb3IgPSBjdXJyZW50U2U/LnNlY3Rpb24uaW1wcm9wZXJcclxuICAgICAgICAgICAgICAgICAgPyB0aGlzLnpvbmVDb2xvci53cm9uZy5ib3JkZXJcclxuICAgICAgICAgICAgICAgICAgOiB0aGlzLnpvbmVDb2xvci5yaWdodC5ib3JkZXI7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHVuYXNzaWduZWRTaGVsdmVzID0gc2hlbGZEaXZzLmZpbHRlcihcclxuICAgICAgICAgICAgKGl0ZW0pID0+ICFhbGxTZWN0aW9uU2hlbHZlcy5pbmNsdWRlcyhpdGVtLmlkKSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB1bmFzc2lnbmVkU2hlbHZlcy5mb3JFYWNoKChkKSA9PiAoZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIndoaXRlXCIpKTtcclxuXHJcbiAgICAgICAgICBsZXQgc2VjdGlvbkdyb3VwSGVpZ2h0ID0gMDtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlY3Rpb25CeVpvbmVzLmZvckVhY2goKHN6LCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNlY3Rpb25IZWlnaHQgPSBzei5zZWN0aW9uLnNoZWxmRGl2cy5yZWR1Y2UoXHJcbiAgICAgICAgICAgICAgICAoaCwgZCkgPT4gaCArIChkPy5vZmZzZXRIZWlnaHQgPz8gMCksXHJcbiAgICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNlY3Rpb25XaWR0aCA9XHJcbiAgICAgICAgICAgICAgICBzei5zZWN0aW9uLnNoZWxmRGl2c1swXT8ub2Zmc2V0V2lkdGggPz8gMzQ1O1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBiYyA9IGJvZGllcy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcclxuICAgICAgICAgICAgICAgIGAjYnJhbmQtY2F0ZWdvcnkke2l9YCxcclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoYmMpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IHNlY0JnID0gcmdiVG9IZXgoXHJcbiAgICAgICAgICAgICAgICAvLyAgIHN6LnNlY3Rpb24uc2hlbGZEaXZzWzBdPy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3JcclxuICAgICAgICAgICAgICAgIC8vICk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBjb2xvciA9XHJcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMuc2hlbGZDb2xvcnMuZmluZCgoYykgPT4gYy5iZyA9PT0gc2VjQmcpID8/XHJcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMuc2hlbGZDb2xvcnNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gYmMuc3R5bGUuYm9yZGVyQ29sb3IgPSB0aGlzLnpvbmVDb2xvci5yaWdodC5ib3JkZXI7XHJcbiAgICAgICAgICAgICAgICBiYy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIiNmZmZcIjtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBiY1ggPSAoY3VycmVudFNlY3Rpb25XaWR0aCAtIGJjLm9mZnNldFdpZHRoKSAvIDI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiY1ggPSBib2R5V2lkdGggKyAxNjtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJjWSA9XHJcbiAgICAgICAgICAgICAgICAgIChjdXJyZW50U2VjdGlvbkhlaWdodCAtIGJjLm9mZnNldEhlaWdodCkgLyAyICtcclxuICAgICAgICAgICAgICAgICAgc2VjdGlvbkdyb3VwSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgYmMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2JjWCArIGFkanVzdH1weCwgJHtiY1l9cHgpYDtcclxuXHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uR3JvdXBIZWlnaHQgKz0gY3VycmVudFNlY3Rpb25IZWlnaHQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlQm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXHJcbiAgICAgICAgICAgICAgXCJzdG9yYWdlLWJveC16b25lXCIsXHJcbiAgICAgICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhbGlnbiA9IGJvZHlXaWR0aCArIDE2O1xyXG5cclxuICAgICAgICAgICAgaWYgKHN0b3JlQm94KSB7XHJcbiAgICAgICAgICAgICAgc3RvcmVCb3guc3R5bGUubGVmdCA9IGAke2FsaWdufXB4YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJMMlwiOiAvL3NoZWxmXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgc2hlbGZEaXZzLmZvckVhY2goKGRpdiwgaSkgPT4ge1xyXG4gICAgICAgICAgICAvLyBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy56b25lQ29sb3IucmlnaHQuYmc7XHJcbiAgICAgICAgICAgIC8vIGRpdi5zdHlsZS5ib3JkZXIgPSBgMS40cHggc29saWQgJHt0aGlzLnpvbmVDb2xvci5yaWdodC5ib3JkZXJ9YDtcclxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuc2hvd1ZNcykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zdCBiYyA9IGRpdi5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgI2JyYW5kLWNhdGVnb3J5JHtpfWApO1xyXG4gICAgICAgICAgICBpZiAoIWJjKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCBiY1ggPSAoZGl2Lm9mZnNldFdpZHRoIC0gYmMub2Zmc2V0V2lkdGgpIC8gMjtcclxuICAgICAgICAgICAgY29uc3QgYmNZID0gKGRpdi5vZmZzZXRIZWlnaHQgLSBiYy5vZmZzZXRIZWlnaHQpIC8gMjtcclxuXHJcbiAgICAgICAgICAgIC8vIGJjLnN0eWxlLmJvcmRlckNvbG9yID0gdGhpcy56b25lQ29sb3IucmlnaHQuYm9yZGVyO1xyXG4gICAgICAgICAgICAvLyBiYy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnpvbmVDb2xvci5yaWdodC5iZztcclxuICAgICAgICAgICAgYmMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2JjWCArIGFkanVzdH1weCwgJHtiY1l9cHgpYDtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIkw0XCI6IC8vc3BvdFxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIC8vIHNoZWxmRGl2cy5mb3JFYWNoKChkKSA9PiB7XHJcbiAgICAgICAgLy8gICBpZiAoZCkgZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnpvbmVDb2xvci5yaWdodC5iZztcclxuICAgICAgICAvLyB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdFNlcXVlbnRpYWxTZWN0aW9uKHNoZWxmRGl2czogKEhUTUxFbGVtZW50IHwgbnVsbClbXSkge1xyXG4gICAgY29uc3QgbmV3U2VjdGlvbkJ5Wm9uZXMgPSBbXTtcclxuICAgIGxldCBwWm9uZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgZm9yIChjb25zdCBzIG9mIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWcgPz8gW10pIHtcclxuICAgICAgY29uc3Qgem9uZSA9IHMuem9uZSB8fCBcIlwiO1xyXG4gICAgICBjb25zdCBzaGVsZklkID0gYCR7cy5zaGVsZlR5cGV9JHtzLnNoZWxmTnVtYmVyfWA7XHJcbiAgICAgIGNvbnN0IHNoZWxmRGl2ID0gc2hlbGZEaXZzLmZpbmQoKGQpID0+IGQ/LmlkID09PSBzaGVsZklkKTtcclxuXHJcbiAgICAgIGlmICh6b25lID09PSBcIlwiKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGNvbnN0IGhhc0ltcHJvcGVyUHJvZHVjdCA9XHJcbiAgICAgICAgKHM/LnByb2R1Y3RzPy5sZW5ndGggPz8gMCkgPT09IDAgfHxcclxuICAgICAgICAocz8ucHJvZHVjdHMgPz8gW10pLnNvbWUoKHA6IGFueSkgPT4gcC5zdGF0dXMgIT09IFwicHJvcGVyXCIpO1xyXG5cclxuICAgICAgY29uc3QgbWlzc0NvdW50ID0gKHM/LnByb2R1Y3RzID8/IFtdKS5maWx0ZXIoXHJcbiAgICAgICAgKHA6IGFueSkgPT4gcC5zdGF0dXMgPT09IFwibWlzc2luZ1wiLFxyXG4gICAgICApLmxlbmd0aDtcclxuICAgICAgY29uc3QgbWlzcGxhY2VkQ291bnQgPSAocz8ucHJvZHVjdHMgPz8gW10pLmZpbHRlcihcclxuICAgICAgICAocDogYW55KSA9PiBwLnN0YXR1cyA9PT0gXCJtaXNwbGFjZWRcIixcclxuICAgICAgKS5sZW5ndGg7XHJcblxyXG4gICAgICBjb25zdCBzaGVsZkNhcGFjaXR5ID1cclxuICAgICAgICBzLnNoZWxmVHlwZSA9PT0gXCJ0cmF5XCJcclxuICAgICAgICAgID8gcy5wcm9kdWN0UGVyU2hlbGYgKiBzLnRyYXlSb3dzXHJcbiAgICAgICAgICA6IHMucHJvZHVjdFBlclNoZWxmO1xyXG5cclxuICAgICAgaWYgKHpvbmUgIT09IHBab25lKSB7XHJcbiAgICAgICAgbmV3U2VjdGlvbkJ5Wm9uZXMucHVzaCh7XHJcbiAgICAgICAgICB6b25lLFxyXG4gICAgICAgICAgc2VjdGlvbjoge1xyXG4gICAgICAgICAgICBicmFuZHM6IHMucHJvZHVjdEJyYW5kTmFtZSA/PyBbXSxcclxuICAgICAgICAgICAgY2F0ZWdvcmllczogcy5wcm9kdWN0Q2F0ZWdvcnkgPz8gW10sXHJcbiAgICAgICAgICAgIHNoZWx2ZXM6IFtzaGVsZklkXSxcclxuICAgICAgICAgICAgc2hlbGZEaXZzOiBbc2hlbGZEaXZdLFxyXG4gICAgICAgICAgICBwcm9kdWN0czogc3RydWN0dXJlZENsb25lKHM/LnByb2R1Y3RzKSA/PyBbXSxcclxuICAgICAgICAgICAgaW1wcm9wZXI6IGhhc0ltcHJvcGVyUHJvZHVjdCxcclxuICAgICAgICAgICAgbWlzcGxhY2VkOiBtaXNwbGFjZWRDb3VudCxcclxuICAgICAgICAgICAgbWlzc2luZzogbWlzc0NvdW50LFxyXG4gICAgICAgICAgICBjYXBhY2l0eTogc2hlbGZDYXBhY2l0eSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcFpvbmUgPSB6b25lO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSBuZXdTZWN0aW9uQnlab25lc1tuZXdTZWN0aW9uQnlab25lcy5sZW5ndGggLSAxXS5zZWN0aW9uO1xyXG4gICAgICAgIHNlY3Rpb24uc2hlbHZlcy5wdXNoKHNoZWxmSWQpO1xyXG4gICAgICAgIHNlY3Rpb24uc2hlbGZEaXZzLnB1c2goc2hlbGZEaXYpO1xyXG4gICAgICAgIHNlY3Rpb24ucHJvZHVjdHMucHVzaCguLi5zLnByb2R1Y3RzKTtcclxuICAgICAgICBzZWN0aW9uLmNhcGFjaXR5ICs9IHNoZWxmQ2FwYWNpdHk7XHJcbiAgICAgICAgaWYgKGhhc0ltcHJvcGVyUHJvZHVjdCkgc2VjdGlvbi5pbXByb3BlciA9IHRydWU7XHJcbiAgICAgICAgc2VjdGlvbi5taXNzaW5nICs9IG1pc3NDb3VudDtcclxuICAgICAgICBzZWN0aW9uLm1pc3BsYWNlZCArPSBtaXNwbGFjZWRDb3VudDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmICh0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnN0b3JhZ2VQcm9kdWN0cz8ubGVuZ3RoKSB7XHJcbiAgICAvLyAgIGNvbnN0IHN0b3JhZ2VQcm9kdWN0cyA9IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5zdG9yYWdlUHJvZHVjdHM7XHJcblxyXG4gICAgLy8gICBuZXdTZWN0aW9uQnlab25lcy5wdXNoKHtcclxuICAgIC8vICAgICB6b25lOiBcIlN0b3JhZ2VcIixcclxuICAgIC8vICAgICBzZWN0aW9uOiB7XHJcbiAgICAvLyAgICAgICBicmFuZHM6IHN0b3JhZ2VQcm9kdWN0cy5tYXAoKHA6IGFueSkgPT4gcC5icmFuZE5hbWUpLFxyXG4gICAgLy8gICAgICAgY2F0ZWdvcmllczogc3RvcmFnZVByb2R1Y3RzLm1hcCgocDogYW55KSA9PiBwLmJyYW5kTmFtZSksXHJcbiAgICAvLyAgICAgICBzaGVsdmVzOiBbXSxcclxuICAgIC8vICAgICAgIHNoZWxmRGl2czogW10sXHJcbiAgICAvLyAgICAgICBwcm9kdWN0czogc3RydWN0dXJlZENsb25lKHN0b3JhZ2VQcm9kdWN0cykgPz8gW10sXHJcbiAgICAvLyAgICAgICBpbXByb3BlcjogZmFsc2UsXHJcbiAgICAvLyAgICAgICBoYXNNaXNwbGFjZWQ6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgaGFzTWlzc2luZzogZmFsc2UsXHJcbiAgICAvLyAgICAgICBjYXBhY2l0eTogc3RvcmFnZVByb2R1Y3RzLmxlbmd0aCxcclxuICAgIC8vICAgICB9LFxyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICB0aGlzLnNlY3Rpb25CeVpvbmVzID0gWy4uLm5ld1NlY3Rpb25CeVpvbmVzXTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgZ3JvdXBTaGVsdmVzQnlab25lKGlucHV0OiBTaGVsZkNvbmZpZ1tdKTogU2VjdGlvbkNvbmZpZ1tdIHtcclxuICAgIGNvbnN0IHpvbmVNYXA6IHsgW3pvbmU6IHN0cmluZ106IFNlY3Rpb25Db25maWcgfSA9IHt9O1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpbnB1dCkge1xyXG4gICAgICBjb25zdCB6b25lID0gaXRlbT8uem9uZSA/PyBcIlwiO1xyXG4gICAgICBjb25zdCBzaGVsZkxhYmVsID0gYCR7aXRlbS5zaGVsZlR5cGV9ICR7aXRlbS5zaGVsZk51bWJlcn1gO1xyXG5cclxuICAgICAgaWYgKCF6b25lTWFwW3pvbmVdKSB7XHJcbiAgICAgICAgem9uZU1hcFt6b25lXSA9IHtcclxuICAgICAgICAgIHNoZWx2ZXM6IFtdLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTpcclxuICAgICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSBcIkwyXCJcclxuICAgICAgICAgICAgICA/IGl0ZW0ucHJvZHVjdEJyYW5kTmFtZVxyXG4gICAgICAgICAgICAgIDogW10sXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6XHJcbiAgICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gXCJMMlwiXHJcbiAgICAgICAgICAgICAgPyBpdGVtLnByb2R1Y3RDYXRlZ29yeVxyXG4gICAgICAgICAgICAgIDogW10sXHJcbiAgICAgICAgICB6b25lOiB6b25lLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHpvbmVNYXBbem9uZV0/LnNoZWx2ZXM/LnB1c2goc2hlbGZMYWJlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoem9uZU1hcCk7XHJcbiAgfVxyXG5cclxuICBhcHBseVNlY3Rpb25Db25maWdUb1NoZWx2ZXMoc2VjdGlvbnM6IFNlY3Rpb25Db25maWdbXSk6IFNoZWxmQ29uZmlnW10ge1xyXG4gICAgY29uc3Qgc2VjdGlvbk1hcCA9IG5ldyBNYXA8XHJcbiAgICAgIHN0cmluZyxcclxuICAgICAgUGljazxTZWN0aW9uQ29uZmlnLCBcInpvbmVcIiB8IFwicHJvZHVjdEJyYW5kTmFtZVwiIHwgXCJwcm9kdWN0Q2F0ZWdvcnlcIj5cclxuICAgID4oKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcclxuICAgICAgZm9yIChjb25zdCBzaGVsZkxhYmVsIG9mIHNlY3Rpb24uc2hlbHZlcyEpIHtcclxuICAgICAgICBzZWN0aW9uTWFwLnNldChzaGVsZkxhYmVsLCB7XHJcbiAgICAgICAgICB6b25lOiBzZWN0aW9uLnpvbmUsXHJcbiAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOiBzZWN0aW9uLnByb2R1Y3RCcmFuZE5hbWUsXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IHNlY3Rpb24ucHJvZHVjdENhdGVnb3J5LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXBwbHkgb3ZlcnJpZGVzIHRvIG1hdGNoaW5nIHNoZWx2ZXNcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc/Lm1hcCgoc2hlbGY6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNoZWxmTGFiZWwgPSBgJHtzaGVsZi5zaGVsZlR5cGV9ICR7c2hlbGYuc2hlbGZOdW1iZXJ9YDtcclxuICAgICAgICBjb25zdCBvdmVycmlkZSA9IHNlY3Rpb25NYXAuZ2V0KHNoZWxmTGFiZWwpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4uc2hlbGYsXHJcbiAgICAgICAgICB6b25lOiBvdmVycmlkZT8uem9uZSB8fCBcIlwiLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogb3ZlcnJpZGU/LnByb2R1Y3RCcmFuZE5hbWUgPz8gW10sXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IG92ZXJyaWRlPy5wcm9kdWN0Q2F0ZWdvcnkgPz8gW10sXHJcbiAgICAgICAgfTtcclxuICAgICAgfSkgPz8gW11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvcGVuWm9uZUxldmVsUHJvZHVjdE1vZGFsQnlQcm9kdWN0KHA6IGFueSwgczogYW55KSB7XHJcbiAgICBjb25zdCBwTG9jYXRvciA9IHtcclxuICAgICAgczogcy5zaGVsZk51bWJlcixcclxuICAgICAgcGlkOiBwPy5wcm9kdWN0SWQsXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHpvbmVEYXRhID0gdGhpcy5zZWN0aW9uQnlab25lcy5maW5kKFxyXG4gICAgICAoc2gpID0+IHNoLnpvbmUgPT09IChzPy56b25lID8/IFwiVG9wXCIpLFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLm9wZW5ab25lTGV2ZWxQcm9kdWN0TW9kYWwoem9uZURhdGEsIFwic2VjdGlvblwiLCBwTG9jYXRvcik7XHJcbiAgfVxyXG5cclxuICBvcGVuWm9uZUxldmVsUHJvZHVjdE1vZGFsKFxyXG4gICAgem9uZURhdGE6IGFueSxcclxuICAgIGxldmVsOiBzdHJpbmcsXHJcbiAgICBwTG9jYXRvcj86IHsgczogbnVtYmVyOyBwaWQ6IGFueSB9LFxyXG4gICkge1xyXG4gICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgem9uZTogem9uZURhdGEuem9uZSxcclxuICAgICAgc2hlbHZlczogdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLnNoZWxmQ29uZmlnLmZpbHRlcihcclxuICAgICAgICAoczogYW55KSA9PiBzLnpvbmUgPT09IHpvbmVEYXRhLnpvbmUsXHJcbiAgICAgICksXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChkYXRhLnNoZWx2ZXMuZXZlcnkoKHM6IGFueSkgPT4gcy5wcm9kdWN0cy5sZW5ndGggPiAwKSkge1xyXG4gICAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubmdiTW9kYWwub3Blbihab25lUHJvZHVjdHNDb21wb25lbnQsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgICB3aW5kb3dDbGFzczogXCJtZXJjaC1jb21wbGlhbmNlLW1vZGFsXCIsXHJcbiAgICAgIH0pO1xyXG4gICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kYXRhID0gZGF0YTtcclxuICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UubGV2ZWwgPSBsZXZlbDtcclxuICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZmxvb3JEYXRhID0gdGhpcy5mbG9vckRhdGE7XHJcbiAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnZtTGlzdCA9IHRoaXMudm1MaXN0O1xyXG4gICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5wcm9kdWN0TG9jYXRpb24gPSBwTG9jYXRvcjtcclxuXHJcbiAgICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgIHRoaXMuY2hhbmdlRml4dHVyZS5lbWl0KHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9wZW5TdG9yZUJveFByb2R1Y3RzKCkge1xyXG4gICAgaWYgKHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5zdG9yYWdlUHJvZHVjdHMubGVuZ3RoIDw9IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBNQVhfUFJPRFVDVFNfUEVSX1NIRUxGID0gNjtcclxuICAgIGNvbnN0IHNoZWx2ZXMgPSBbXTtcclxuXHJcbiAgICAvLyBDcmVhdGluZyBJbWFnaW5hcnkgc2hlbHZlcyB0byBkaXNwbGF5IHRoZSBzdG9yYWdlIGJveCBwcm9kdWN0cy5cclxuICAgIGZvciAoXHJcbiAgICAgIGxldCBpID0gMDtcclxuICAgICAgaSA8IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5zdG9yYWdlUHJvZHVjdHMubGVuZ3RoO1xyXG4gICAgICBpICs9IE1BWF9QUk9EVUNUU19QRVJfU0hFTEZcclxuICAgICkge1xyXG4gICAgICBzaGVsdmVzLnB1c2goe1xyXG4gICAgICAgIHNoZWxmVHlwZTogXCJzaGVsZlwiLFxyXG4gICAgICAgIHByb2R1Y3RzOiB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMuc3RvcmFnZVByb2R1Y3RzLnNsaWNlKFxyXG4gICAgICAgICAgaSxcclxuICAgICAgICAgIGkgKyBNQVhfUFJPRFVDVFNfUEVSX1NIRUxGLFxyXG4gICAgICAgICksXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIHpvbmU6IFwiU3RvcmFnZSBCb3hcIixcclxuICAgICAgc2hlbHZlczogc2hlbHZlcyxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oWm9uZVByb2R1Y3RzQ29tcG9uZW50LCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB3aW5kb3dDbGFzczogXCJtZXJjaC1jb21wbGlhbmNlLW1vZGFsXCIsXHJcbiAgICB9KTtcclxuXHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kYXRhID0gZGF0YTtcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmxldmVsID0gXCJzZWN0aW9uXCI7XHJcbiAgfVxyXG5cclxuICBkaXN0cmlidXRlUm91bmRSb2Jpbihwcm9kdWN0czogYW55LCB0cmF5Um93czogbnVtYmVyKSB7XHJcbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRyYXlSb3dzIH0sICgpID0+IFtdKTtcclxuXHJcbiAgICBwcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgY29uc3QgdHJheUluZGV4ID0gaW5kZXggJSB0cmF5Um93cztcclxuICAgICAgcmVzdWx0W3RyYXlJbmRleF0ucHVzaChwcm9kdWN0KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLyBpc0Vycm9yUHJvZHVjdChwcm9kdWN0cz86IGFueVtdKSB7XHJcbiAgLy8gICBpZiAocHJvZHVjdHMpIHtcclxuICAvLyAgICAgcmV0dXJuIHByb2R1Y3RzLnNvbWUoXHJcbiAgLy8gICAgICAgKHA6IGFueSkgPT4gcC5zdGF0dXMgPT0gXCJtaXNzaW5nXCIgfHwgcC5zdGF0dXMgPT0gXCJtaXNwbGFjZWRcIlxyXG4gIC8vICAgICApO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIHRydWU7XHJcbiAgLy8gfVxyXG5cclxuICBnZXRTaGVsZlJvd1dpdGhQcm9kdWN0cygpIHt9XHJcblxyXG4gIG9uQ2xpY2tDbG9zZSgpIHtcclxuICAgIHRoaXMub25DbG9zZS5lbWl0KFwiXCIpO1xyXG4gIH1cclxuXHJcbiAgb3BlblBvcHVwKHR5cGU6IGFueSkge1xyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQW5hbHl0aWNzUG9wdXBDb21wb25lbnQsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIHdpbmRvd0NsYXNzOiBcIm1lcmNoLWNvbXBsaWFuY2UtbW9kYWxcIixcclxuICAgICAgc2l6ZTogJ2xnJ1xyXG4gICAgfSk7XHJcblxyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGF0YSA9IHRoaXMuZW5nYWdlcnNMaXN0O1xyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudHlwZSA9IHR5cGU7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8c2VjdGlvbiBpZD1cImZpeHR1cmUtYW5hbHl0aWMtZGV0YWlsc1wiICpuZ0lmPVwiIWlzUGFnZUxvYWRpbmdcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggcC0yIHctMTAwIGp1c3RpZnktY29udGVudC1lbmQgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgPHN2ZyAoY2xpY2spPVwib25DbGlja0Nsb3NlKClcIiBjbGFzcz1cIm0tMiBjdXJzb3ItcG9pbnRlclwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJoZXJvLWJsb2NrXCI+XHJcbiAgICAgICAgPGgxIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDtmb250LXNpemU6IDMwcHg7XCI+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUNvbXBsaWFuY2UgPz8gMCB9fSU8L2gxPlxyXG4gICAgICAgIDxwPkNvbXBsaWFuY2Ugc2NvcmU8L3A+XHJcbiAgICAgICAgPHA+XHJcbiAgICAgICAgICAgIHt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8ubGFiZWwgfX08c3Bhbj4mIzgyMjY7PC9zcGFuPlxyXG4gICAgICAgICAgICB7e2ZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVDYXRlZ29yeX19IDxzcGFuPiYjODIyNjs8L3NwYW4+XHJcbiAgICAgICAgICAgIHt7Zml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoLnZhbHVlfX17e2ZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aC51bml0fX08c3Bhbj4mIzgyMjY7PC9zcGFuPlxyXG4gICAgICAgICAgICB7e2ZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5sZW5ndGh9fSBTaGVsdmVzXHJcbiAgICAgICAgPC9wPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgbWItNCBwZS01XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2ggXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBbY2hlY2tlZF09XCJzaG93Vk1zXCIgWyhuZ01vZGVsKV09XCJzaG93Vk1zXCIgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgLz5cclxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiY29sb3I6IGJsYWNrOyB3aGl0ZS1zcGFjZTogbm93cmFwXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIHN1YiBtcy0yXCIgZm9yPVwic2hvd1ZNc1wiPlxyXG4gICAgICAgICAgICAgICAgU2hvdyBWTVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IGctM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTIwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGgtMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMlwiICpuZ0lmPVwiZml4dHVyZUZvb3RmYWxsPy5jb252ZXJzaW9uQ291bnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+VG90YWwgRm9vdGZhbGw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWItMVwiPnt7Zml4dHVyZUZvb3RmYWxsPy56b25lVG90YWw/LlByZXZpb3VzRGF0YX19PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xIHNtYWxsXCIgW25nQ2xhc3NdPVwiZml4dHVyZUZvb3RmYWxsPy56b25lVG90YWw/LlByZXZpb3VzVmFyaWF0aW9uID8gJ3RleHQtc3VjY2VzcycgOiAndGV4dC1kYW5nZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTMgMTNcIiBmaWxsPVwibm9uZVwiIHN0eWxlPVwidHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcIiAqbmdJZj1cIiFmaXh0dXJlRm9vdGZhbGw/LnpvbmVUb3RhbD8uUHJldmlvdXNWYXJpYXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjMxOTggMy4yMTM4Nkw3LjIzMTE3IDguMzAyNDZMNC41NTI5NiA1LjYyNDI1TDAuNTM1NjQzIDkuNjQxNTdNMTIuMzE5OCAzLjIxMzg2SDkuMTA1OTJNMTIuMzE5OCAzLjIxMzg2VjYuNDI3NzFcIiBzdHJva2U9XCIjRDkyRDIwXCIgc3Ryb2tlLXdpZHRoPVwiMS4yMDUyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTMgMTNcIiBmaWxsPVwibm9uZVwiICpuZ0lmPVwiZml4dHVyZUZvb3RmYWxsPy56b25lVG90YWw/LlByZXZpb3VzVmFyaWF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMi4zMTk4IDMuMjEzODZMNy4yMzExNyA4LjMwMjQ2TDQuNTUyOTYgNS42MjQyNUwwLjUzNTY0MyA5LjY0MTU3TTEyLjMxOTggMy4yMTM4Nkg5LjEwNTkyTTEyLjMxOTggMy4yMTM4NlY2LjQyNzcxXCIgc3Ryb2tlPVwiIzAzOTg1NVwiIHN0cm9rZS13aWR0aD1cIjEuMjA1MlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPnt7Zml4dHVyZUZvb3RmYWxsPy56b25lVG90YWw/LmNvdW50fX0lPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkXCI+dnMgUHJldmlvdXMgZGF5PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidy0yMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBoLTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTJcIiAqbmdJZj1cImZpeHR1cmVGb290ZmFsbD8uY29udmVyc2lvbkNvdW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPlpvbmUgQ29udmVyc2lvbjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJtYi0xXCI+e3tmaXh0dXJlRm9vdGZhbGw/LmNvbnZlcnNpb25Db3VudD8uUHJldmlvdXNEYXRhfX08L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTEgc21hbGxcIiBbbmdDbGFzc109XCJmaXh0dXJlRm9vdGZhbGw/LmNvbnZlcnNpb25Db3VudD8uUHJldmlvdXNWYXJpYXRpb24gPyAndGV4dC1zdWNjZXNzJyA6ICd0ZXh0LWRhbmdlcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMyAxM1wiIGZpbGw9XCJub25lXCIgc3R5bGU9XCJ0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1wiICpuZ0lmPVwiIWZpeHR1cmVGb290ZmFsbD8uY29udmVyc2lvbkNvdW50Py5QcmV2aW91c1ZhcmlhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuMzE5OCAzLjIxMzg2TDcuMjMxMTcgOC4zMDI0Nkw0LjU1Mjk2IDUuNjI0MjVMMC41MzU2NDMgOS42NDE1N00xMi4zMTk4IDMuMjEzODZIOS4xMDU5Mk0xMi4zMTk4IDMuMjEzODZWNi40Mjc3MVwiIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2Utd2lkdGg9XCIxLjIwNTJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMyAxM1wiIGZpbGw9XCJub25lXCIgKm5nSWY9XCJmaXh0dXJlRm9vdGZhbGw/LmNvbnZlcnNpb25Db3VudD8uUHJldmlvdXNWYXJpYXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjMxOTggMy4yMTM4Nkw3LjIzMTE3IDguMzAyNDZMNC41NTI5NiA1LjYyNDI1TDAuNTM1NjQzIDkuNjQxNTdNMTIuMzE5OCAzLjIxMzg2SDkuMTA1OTJNMTIuMzE5OCAzLjIxMzg2VjYuNDI3NzFcIiBzdHJva2U9XCIjMDM5ODU1XCIgc3Ryb2tlLXdpZHRoPVwiMS4yMDUyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3tmaXh0dXJlRm9vdGZhbGw/LmNvbnZlcnNpb25Db3VudD8uY291bnR9fSU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj52cyBQcmV2aW91cyBkYXk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTIwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGgtMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMlwiICpuZ0lmPVwiZml4dHVyZUZvb3RmYWxsPy5jb252ZXJzaW9uQ291bnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+QXZnIER3ZWxsIFRpbWU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWItMVwiPnt7Zml4dHVyZUZvb3RmYWxsPy5kd2VsbFRpbWU/LlByZXZpb3VzRGF0YX19PC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyZ2FwLTEgc21hbGxcIiBbbmdDbGFzc109XCJmaXh0dXJlRm9vdGZhbGw/LmR3ZWxsVGltZT8uUHJldmlvdXNWYXJpYXRpb24gPyAndGV4dC1zdWNjZXNzJyA6ICd0ZXh0LWRhbmdlcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMyAxM1wiIGZpbGw9XCJub25lXCIgc3R5bGU9XCJ0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1wiICpuZ0lmPVwiIWZpeHR1cmVGb290ZmFsbD8uZHdlbGxUaW1lPy5QcmV2aW91c1ZhcmlhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuMzE5OCAzLjIxMzg2TDcuMjMxMTcgOC4zMDI0Nkw0LjU1Mjk2IDUuNjI0MjVMMC41MzU2NDMgOS42NDE1N00xMi4zMTk4IDMuMjEzODZIOS4xMDU5Mk0xMi4zMTk4IDMuMjEzODZWNi40Mjc3MVwiIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2Utd2lkdGg9XCIxLjIwNTJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMyAxM1wiIGZpbGw9XCJub25lXCIgKm5nSWY9XCJmaXh0dXJlRm9vdGZhbGw/LmR3ZWxsVGltZT8uUHJldmlvdXNWYXJpYXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjMxOTggMy4yMTM4Nkw3LjIzMTE3IDguMzAyNDZMNC41NTI5NiA1LjYyNDI1TDAuNTM1NjQzIDkuNjQxNTdNMTIuMzE5OCAzLjIxMzg2SDkuMTA1OTJNMTIuMzE5OCAzLjIxMzg2VjYuNDI3NzFcIiBzdHJva2U9XCIjMDM5ODU1XCIgc3Ryb2tlLXdpZHRoPVwiMS4yMDUyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3tmaXh0dXJlRm9vdGZhbGw/LmR3ZWxsVGltZT8uY291bnR9fSU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj52cyBQcmV2aW91cyBkYXk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGlkPVwidm0tcHJvZHVjdHMtc3VtXCIgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0IG10LThcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZml4dHVyZS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwiaGVhZGVyLWJsb2NrXCIgY2xhc3M9XCJoZWFkZXItYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxwPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8ubGFiZWwgfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBCb2R5IGJsb2NrIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwiYm9keS1ibG9jay1zdW1cIiBjbGFzcz1cImJvZHktYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVtWTSBCTE9DS10tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8udm1Db25maWc/Lmxlbmd0aFwiIFtuZ0NsYXNzXT1cInsnZC1ub25lJzohc2hvd1ZNc31cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2bSBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy52bUNvbmZpZzsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCIndm0nICsgaVwiIGNsYXNzPVwidm0tYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRTZWxlY3RlZFZNKHZtKSBhcyBzZWxlY3RlZFZNXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cInNlbGVjdGVkVk0/LmltZ1VybDsgZWxzZSBwbGFjZWhvbGRlclwiIFtzcmNdPVwic2VsZWN0ZWRWTT8uaW1nVXJsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiVm0gSW1hZ2VcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhY2Vob2xkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2bS1wbGFjZWhvbGRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPnt7IHNlbGVjdGVkVk0/Lm5hbWUgfX08L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tW0ZJWFRVUkUgTEVWRUwgLSBCUkFORCBDQVRFR09SWV0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJmaXh0dXJlLWxldmVsXCIgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSAnTDEnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImJyYW5kLWNhdGVnb3J5XCIgY2xhc3M9XCJicmFuZC1jYXRlZ29yeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdEJyYW5kTmFtZT8ubGVuZ3RoXCIgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYiBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0QnJhbmROYW1lOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGRyYWZ0IG1lLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnlcIiAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RDYXRlZ29yeT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RDYXRlZ29yeTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIG10LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcGFjaXR5IHt7Zml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUNhcGFjaXR5IH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2JyYW5kQ2F0ZWdvcnlUb29sdGlwPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+QnJhbmRzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYyBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0QnJhbmROYW1lOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0Q2F0ZWdvcnk/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkNhdGVnb3JpZXM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RDYXRlZ29yeTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bU0VDVElPTiBMRVZFTCAtIEJSQU5EIENBVEVHT1JZXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInNlY3Rpb24tbGV2ZWxcIiAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09ICdMMydcIj5cclxuICAgICAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHNlY3Rpb25CeVpvbmVzOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiJ2JyYW5kLWNhdGVnb3J5JyArICRpbmRleFwiIGNsYXNzPVwiYnJhbmQtY2F0ZWdvcnlcIiBbbmdiVG9vbHRpcF09XCJicmFuZENhdGVnb3J5VG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblpvbmVMZXZlbFByb2R1Y3RNb2RhbChpdGVtLCdzZWN0aW9uJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnByb3Blcl09XCIhaXRlbT8uc2VjdGlvbj8uaW1wcm9wZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGluYWN0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uem9uZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGluYWN0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcGFjaXR5IHt7IGl0ZW0/LnNlY3Rpb24/LmNhcGFjaXR5IH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZFwiICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uYnJhbmRzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYiBvZiBpdGVtPy5zZWN0aW9uPy5icmFuZHM7dHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCIgY2xhc3M9XCJzZXBhcmF0b3JcIj4gLSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeVwiICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGMgb2YgaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllczt0cmFjayAkaW5kZXg7IGxldCBsYXN0ID0gJGxhc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlXCIgKm5nSWY9XCJpdGVtLnNlY3Rpb24ubWlzc2luZyA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzc2luZyB7e2l0ZW0uc2VjdGlvbi5taXNzaW5nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZVwiICpuZ0lmPVwiaXRlbS5zZWN0aW9uLm1pc3BsYWNlZCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzcGxhY2VkIHt7aXRlbS5zZWN0aW9uLm1pc3BsYWNlZH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNicmFuZENhdGVnb3J5VG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkJyYW5kczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChiIG9mIGl0ZW0/LnNlY3Rpb24/LmJyYW5kczt0cmFjayAkaW5kZXg7IGxldCBsYXN0ID0gJGxhc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJpdGVtPy5zZWN0aW9uPy5jYXRlZ29yaWVzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+Q2F0ZWdvcmllczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjIG9mIGl0ZW0/LnNlY3Rpb24/LmNhdGVnb3JpZXM7dHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiJ3N1bVNoZWxmQ29udGFpbmVyJyArIGlcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVtTSEVMRiBMRVZFTCAtIEJSQU5EIENBVEVHT1JZXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInNoZWxmLWxldmVsXCIgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSAnTDInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIidicmFuZC1jYXRlZ29yeScgKyBpXCIgY2xhc3M9XCJicmFuZC1jYXRlZ29yeVwiICpuZ0lmPVwiaXRlbS5wcm9kdWN0QnJhbmROYW1lPy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmRcIiAqbmdJZj1cIml0ZW0ucHJvZHVjdEJyYW5kTmFtZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYiBvZiBpdGVtLnByb2R1Y3RCcmFuZE5hbWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0ucHJvZHVjdENhdGVnb3J5Py5sZW5ndGhcIiBjbGFzcz1cInNlcGFyYXRvclwiPiAtIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnlcIiAqbmdJZj1cIml0ZW0ucHJvZHVjdENhdGVnb3J5Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBiIG9mIGl0ZW0ucHJvZHVjdENhdGVnb3J5OyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNicmFuZENhdGVnb3J5VG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkJyYW5kczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGl0ZW0ucHJvZHVjdEJyYW5kTmFtZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJpdGVtLnByb2R1Y3RDYXRlZ29yeT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkNhdGVnb3JpZXM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBpdGVtLnByb2R1Y3RDYXRlZ29yeTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBpbmFjdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXBhY2l0eSB7e2l0ZW0/LnByb2R1Y3RQZXJTaGVsZiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0uc2hlbGZUeXBlID09PSdzaGVsZicpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrIHNoZWxmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoaXRlbS5wcm9kdWN0cy5sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgaXRlbS5wcm9kdWN0cztsZXQgcCA9IGluZGV4XCIgY2xhc3M9XCJwcm9kdWN0IGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmVycm9yXT1cInByb2R1Y3Quc3RhdHVzID09PSAnbWlzc2luZycgfHwgcHJvZHVjdC5zdGF0dXMgPT09ICdtaXNwbGFjZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5ab25lTGV2ZWxQcm9kdWN0TW9kYWxCeVByb2R1Y3QocHJvZHVjdCxpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYocHJvZHVjdC5zdGF0dXMgIT0gJ21pc3NpbmcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJwcm9kdWN0Py5wcm9kdWN0SW1hZ2VVcmw7IGVsc2UgcGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwicHJvZHVjdD8ucHJvZHVjdEltYWdlVXJsXCIgYWx0PVwiUHJvZHVjdCBJbWFnZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlISArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoaXRlbS5wcm9kdWN0cy5sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBpdGVtLmRpc3RyaWJ1dGVkUm93cztsZXQgciA9IGluZGV4XCIgY2xhc3M9XCJ0cmF5IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiByb3c7bGV0IHAgPSBpbmRleFwiIGNsYXNzPVwicHJvZHVjdCBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXJyb3JdPVwicHJvZHVjdC5zdGF0dXMgPT09ICdtaXNzaW5nJyB8fCBwcm9kdWN0LnN0YXR1cyA9PT0gJ21pc3BsYWNlZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5ab25lTGV2ZWxQcm9kdWN0TW9kYWxCeVByb2R1Y3QocHJvZHVjdCxpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKHByb2R1Y3Quc3RhdHVzICE9ICdtaXNzaW5nJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cInByb2R1Y3Q/LnByb2R1Y3RJbWFnZVVybDsgZWxzZSBwbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwicHJvZHVjdD8ucHJvZHVjdEltYWdlVXJsXCIgYWx0PVwiUHJvZHVjdCBJbWFnZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFjZWhvbGRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1AZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0udHJheVJvd3MpXCIgY2xhc3M9XCJ0cmF5IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnByb2R1Y3RQZXJTaGVsZilcIiBjbGFzcz1cInByb2R1Y3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRm9vdGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwiZm9vdGVyLWJsb2NrXCIgY2xhc3M9XCJmb290ZXItYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIGxlZnQtYm94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciByaWdodC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8ubGFiZWwgfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBpZD1cInN0b3JhZ2UtYm94LXpvbmVcIiAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnN0b3JhZ2VQcm9kdWN0cz8ubGVuZ3RoXCIgY2xhc3M9XCJzdG9yYWdlLWJveFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblN0b3JlQm94UHJvZHVjdHMoKVwiIFtuZ2JUb29sdGlwXT1cImJyYW5kQ2F0ZWdvcnlUb29sdGlwXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBpbmFjdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIENhcGFjaXR5IHt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnN0b3JhZ2VQcm9kdWN0cz8ubGVuZ3RoICA/PyAwfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IocCBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zdG9yYWdlUHJvZHVjdHM7IHRyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3AuYnJhbmROYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IocCBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zdG9yYWdlUHJvZHVjdHM7IHRyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3AuY2F0ZWdvcnl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNicmFuZENhdGVnb3J5VG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJyYW5kcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5CcmFuZHM6IDwvYj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgb2YgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc3RvcmFnZVByb2R1Y3RzPy5zbGljZSgwLCAyMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjayAkaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdCA9ICRsYXN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGI/LmJyYW5kTmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICgoZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc3RvcmFnZVByb2R1Y3RzPy5sZW5ndGggPz8gMCkgPiAyMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgK3t7IChmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zdG9yYWdlUHJvZHVjdHMubGVuZ3RoIC0gMjApIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2F0ZWdvcmllcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5DYXRlZ29yaWVzOiA8L2I+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnN0b3JhZ2VQcm9kdWN0cz8uc2xpY2UoMCwgMjApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgJGluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSAkbGFzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBiPy5jYXRlZ29yeSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICgoZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc3RvcmFnZVByb2R1Y3RzPy5sZW5ndGggPz8gMCkgPiAyMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgK3t7IChmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zdG9yYWdlUHJvZHVjdHMubGVuZ3RoIC0gMjApIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBnLTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidy0yNVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBoLTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTJcIiAqbmdJZj1cImVuZ2FnZXJzTGlzdD8uWydUb3AgRW5nYWdlZCddPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWhlYWRlciBiZy1oZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlRvcCBFbmdhZ2VkPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Db3VudDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlciBweS0yIGJvcmRlci1ib3R0b21cIiAqbmdGb3I9XCJsZXQgdG9wIG9mIHRvcEVuZ2FnZXJzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwidG9wPy5pbWFnZVVybCA/IHRvcC5pbWFnZVVybCA6ICd7e2ltZ0NETn19Zml4dHVyZUltYWdlL2ltYWdlbm90Zm91bmQucG5nJ1wiIGFsdD1cIlByb2R1Y3RcIiBjbGFzcz1cInJvdW5kZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1tZWRpdW0gdGV4dC1kYXJrIHNtYWxsXCI+e3t0b3A/LkJyYW5kbmFtZSA/PyAnJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZFwiIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4O1wiPnt7dG9wPy5wcm9kdWN0QnJhbmROYW1lID8/ICcnfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1tZWRpdW0gdGV4dC1kYXJrXCI+e3t0b3A/LmNvdW50ID8/IDB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZW5kIHB5LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ0ZXh0LXByaW1hcnkgdGV4dC1kZWNvcmF0aW9uLXVuZGVybGluZVwiIChjbGljayk9XCJvcGVuUG9wdXAoJ1RvcCBFbmdhZ2VkJylcIj5WaWV3IGFsbDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTI1XCIgKm5nSWY9XCJlbmdhZ2Vyc0xpc3Q/LlsnTm9uIEVuZ2FnZWQnXT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGgtMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1oZWFkZXIgYmctaGVhZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5MZWFzdC9Ob24gRW5nYWdlZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+Q291bnQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgcHktMiBib3JkZXItYm90dG9tXCIgKm5nRm9yPVwibGV0IHRvcCBvZiBsZWFzdEVuZ2FnZXJzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwidG9wPy5pbWFnZVVybCA/IHRvcC5pbWFnZVVybCA6ICd7e2ltZ0NETn19Zml4dHVyZUltYWdlL2ltYWdlbm90Zm91bmQucG5nJ1wiIGFsdD1cIlByb2R1Y3RcIiBjbGFzcz1cInJvdW5kZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1tZWRpdW0gdGV4dC1kYXJrIHNtYWxsXCI+e3t0b3AuQnJhbmRuYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgc3R5bGU9XCJmb250LXNpemU6IDEycHg7XCI+e3t0b3A/LnByb2R1Y3RCcmFuZE5hbWUgPz8gJyd9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LW1lZGl1bSB0ZXh0LWRhcmtcIj57e3RvcD8uY291bnQgPz8gMH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbmQgcHktMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInRleHQtcHJpbWFyeSB0ZXh0LWRlY29yYXRpb24tdW5kZXJsaW5lXCIgKGNsaWNrKT1cIm9wZW5Qb3B1cCgnbGVhc3RfTm9uX0VuZ2FnZWQnKVwiPlZpZXcgYWxsPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjxzZWN0aW9uIGlkPVwidGVtcGxhdGUtc3VtbWFyeS1za2VsZXRvblwiICpuZ0lmPVwiaXNQYWdlTG9hZGluZ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NlY3Rpb24+Il19
|