tango-app-ui-analyse-zone 3.7.1-beta.2 → 3.7.1-beta.21
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/customer-journey-chart/customer-journey-chart.component.mjs +193 -11
- package/esm2022/lib/components/interation-table-client459/interation-table-client459.component.mjs +3 -3
- package/esm2022/lib/components/overallcards/overallcards.component.mjs +425 -73
- package/esm2022/lib/components/segmentation/segmentation.component.mjs +46 -19
- package/esm2022/lib/components/services/zone.service.mjs +57 -1
- package/esm2022/lib/components/services/zonev2.service.mjs +7 -2
- package/esm2022/lib/components/tango-analyse-zone/tango-analyse-zone.component.mjs +7 -4
- package/esm2022/lib/components/top-performing-zones/top-performing-zones.component.mjs +14 -5
- package/esm2022/lib/components/zone-concentration/zone-concentration.component.mjs +4 -3
- package/esm2022/lib/components/zone-journey/zone-journey.component.mjs +485 -0
- package/esm2022/lib/components/zone-summary-table/zone-summary-table.component.mjs +3 -3
- package/esm2022/lib/components/zone-v2/customer-journey/customer-journey.component.mjs +42 -33
- package/esm2022/lib/components/zone-v2/store-heatmap/store-heatmap.component.mjs +91 -89
- package/esm2022/lib/components/zone-v2/summary-table/summary-table.component.mjs +4 -4
- package/esm2022/lib/components/zone-v2/zones-cards/zones-cards.component.mjs +4 -3
- package/esm2022/lib/tango-analyse-zone.module.mjs +15 -7
- package/fesm2022/tango-app-ui-analyse-zone.mjs +3343 -2222
- package/fesm2022/tango-app-ui-analyse-zone.mjs.map +1 -1
- package/lib/components/customer-journey-chart/customer-journey-chart.component.d.ts +30 -2
- package/lib/components/overallcards/overallcards.component.d.ts +50 -13
- package/lib/components/segmentation/segmentation.component.d.ts +2 -0
- package/lib/components/services/zone.service.d.ts +18 -0
- package/lib/components/services/zonev2.service.d.ts +3 -0
- package/lib/components/tango-analyse-zone/tango-analyse-zone.component.d.ts +1 -0
- package/lib/components/top-performing-zones/top-performing-zones.component.d.ts +5 -3
- package/lib/components/zone-journey/zone-journey.component.d.ts +73 -0
- package/lib/components/zone-v2/customer-journey/customer-journey.component.d.ts +3 -0
- package/lib/components/zone-v2/store-heatmap/store-heatmap.component.d.ts +1 -0
- package/lib/tango-analyse-zone.module.d.ts +8 -6
- package/package.json +1 -1
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
import { Component, Input, ViewChild, HostListener } from '@angular/core';
|
|
2
|
+
import * as am5 from '@amcharts/amcharts5';
|
|
3
|
+
import * as am5flow from '@amcharts/amcharts5/flow';
|
|
4
|
+
import am5themes_Animated from '@amcharts/amcharts5/themes/Animated';
|
|
5
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../services/zone.service";
|
|
8
|
+
import * as i2 from "../services/zonev2.service";
|
|
9
|
+
import * as i3 from "@angular/router";
|
|
10
|
+
import * as i4 from "tango-app-ui-shared";
|
|
11
|
+
import * as i5 from "@angular/common";
|
|
12
|
+
import * as i6 from "@angular/forms";
|
|
13
|
+
import * as i7 from "@ng-bootstrap/ng-bootstrap";
|
|
14
|
+
export class ZoneJourneyComponent {
|
|
15
|
+
service;
|
|
16
|
+
zoneV2Service;
|
|
17
|
+
cd;
|
|
18
|
+
router;
|
|
19
|
+
ts;
|
|
20
|
+
root;
|
|
21
|
+
headerData;
|
|
22
|
+
clientData;
|
|
23
|
+
destroy$ = new Subject();
|
|
24
|
+
constructor(service, zoneV2Service, cd, router, ts) {
|
|
25
|
+
this.service = service;
|
|
26
|
+
this.zoneV2Service = zoneV2Service;
|
|
27
|
+
this.cd = cd;
|
|
28
|
+
this.router = router;
|
|
29
|
+
this.ts = ts;
|
|
30
|
+
}
|
|
31
|
+
ngOnChanges(changes) {
|
|
32
|
+
if (changes['headerData']?.currentValue) {
|
|
33
|
+
this.headerData = changes['headerData'].currentValue;
|
|
34
|
+
}
|
|
35
|
+
if (changes['clientData']?.currentValue) {
|
|
36
|
+
this.clientData = changes['clientData'].currentValue;
|
|
37
|
+
}
|
|
38
|
+
this.getAvailableZones();
|
|
39
|
+
this.cd.detectChanges();
|
|
40
|
+
}
|
|
41
|
+
zoneShopperAnalysis;
|
|
42
|
+
bubbleChartData;
|
|
43
|
+
object;
|
|
44
|
+
object1;
|
|
45
|
+
zoneSearchText = '';
|
|
46
|
+
showDropdown = false;
|
|
47
|
+
searchText = '';
|
|
48
|
+
zoneList = [];
|
|
49
|
+
filteredZones = [];
|
|
50
|
+
zonesInitialized = false;
|
|
51
|
+
tempZoneList = [];
|
|
52
|
+
tempFilteredZones = [];
|
|
53
|
+
dropdownSearchText = '';
|
|
54
|
+
availableZones = [];
|
|
55
|
+
getAvailableZones() {
|
|
56
|
+
const requestData = {
|
|
57
|
+
fromDate: this.headerData.date.startDate,
|
|
58
|
+
toDate: this.headerData.date.endDate,
|
|
59
|
+
storeId: this.headerData.stores.filter((store) => store.checked).map((store) => store.storeId),
|
|
60
|
+
clientId: this.headerData.client,
|
|
61
|
+
};
|
|
62
|
+
this.zoneV2Service.getAvailableZoneNames(requestData).pipe(takeUntil(this.destroy$)).subscribe({
|
|
63
|
+
next: (res) => {
|
|
64
|
+
if (res && res?.code === 200) {
|
|
65
|
+
this.availableZones = (res.data.availableZoneData || []).filter((zone) => zone.zoneName?.toLowerCase() !== 'overall store');
|
|
66
|
+
this.zoneList = this.availableZones.map(z => ({
|
|
67
|
+
name: z.zoneName,
|
|
68
|
+
checked: true
|
|
69
|
+
}));
|
|
70
|
+
this.zonesInitialized = true;
|
|
71
|
+
this.getZoneJourney([]);
|
|
72
|
+
this.getBubble([]);
|
|
73
|
+
this.cd.detectChanges();
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
this.availableZones = [];
|
|
77
|
+
this.zoneChartNoData = true;
|
|
78
|
+
this.zoneChartLoading = false;
|
|
79
|
+
this.zoneCardNoData = true;
|
|
80
|
+
this.zoneCardLoading = false;
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
error: (err) => {
|
|
84
|
+
this.availableZones = [];
|
|
85
|
+
this.zoneChartNoData = true;
|
|
86
|
+
this.zoneChartLoading = false;
|
|
87
|
+
this.zoneCardNoData = true;
|
|
88
|
+
this.zoneCardLoading = false;
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// getAvailableZones() {
|
|
93
|
+
// this.zoneV2Service.zones$
|
|
94
|
+
// .pipe(takeUntil(this.destroy$))
|
|
95
|
+
// .subscribe((zones) => {
|
|
96
|
+
// this.availableZones = zones;
|
|
97
|
+
// if (!this.zonesInitialized) {
|
|
98
|
+
// this.zoneList = zones.map(z => ({
|
|
99
|
+
// name: z.zoneName,
|
|
100
|
+
// checked: true
|
|
101
|
+
// }));
|
|
102
|
+
// this.zonesInitialized = true;
|
|
103
|
+
// if(this.zoneList.length){
|
|
104
|
+
// console.log('available zones in zone journey', this.zoneList);
|
|
105
|
+
// this.getZoneJourney([]);
|
|
106
|
+
// this.getBubble([]);
|
|
107
|
+
// } else {
|
|
108
|
+
// console.log('available zones in zone journey', this.zoneList);
|
|
109
|
+
// this.zoneChartNoData = true;
|
|
110
|
+
// this.zoneChartLoading = false;
|
|
111
|
+
// this.zoneCardNoData = true;
|
|
112
|
+
// this.zoneCardLoading = false;
|
|
113
|
+
// this.getZoneJourney([]);
|
|
114
|
+
// this.getBubble([]);
|
|
115
|
+
// }
|
|
116
|
+
// }
|
|
117
|
+
// });
|
|
118
|
+
// }
|
|
119
|
+
zoneDropdown;
|
|
120
|
+
/* OPEN / TOGGLE */
|
|
121
|
+
toggleDropdown(event) {
|
|
122
|
+
event.stopPropagation();
|
|
123
|
+
this.showDropdown = !this.showDropdown;
|
|
124
|
+
if (this.showDropdown) {
|
|
125
|
+
this.tempZoneList = this.zoneList.map((z) => ({ ...z }));
|
|
126
|
+
this.tempFilteredZones = [...this.tempZoneList];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/* 🔥 OUTSIDE CLICK HANDLER */
|
|
130
|
+
onDocumentClick(event) {
|
|
131
|
+
if (!this.showDropdown)
|
|
132
|
+
return;
|
|
133
|
+
const clickedInside = this.zoneDropdown?.nativeElement.contains(event.target);
|
|
134
|
+
if (!clickedInside) {
|
|
135
|
+
this.showDropdown = false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
toggleSelectAll(event) {
|
|
139
|
+
const checked = event.target.checked;
|
|
140
|
+
// Apply to full temp list
|
|
141
|
+
this.tempZoneList = this.tempZoneList.map(z => ({
|
|
142
|
+
...z,
|
|
143
|
+
checked
|
|
144
|
+
}));
|
|
145
|
+
// Re-apply search filter so UI updates correctly
|
|
146
|
+
this.filterZones();
|
|
147
|
+
}
|
|
148
|
+
isAllSelected() {
|
|
149
|
+
return (this.tempZoneList.length > 0 &&
|
|
150
|
+
this.tempZoneList.every(z => z.checked));
|
|
151
|
+
}
|
|
152
|
+
filterZones() {
|
|
153
|
+
const text = this.dropdownSearchText.toLowerCase();
|
|
154
|
+
this.tempFilteredZones = this.tempZoneList.filter(z => z.name.toLowerCase().includes(text));
|
|
155
|
+
}
|
|
156
|
+
applyZones() {
|
|
157
|
+
this.zoneList = this.tempZoneList.map(z => ({ ...z }));
|
|
158
|
+
const hiddenZones = this.zoneList
|
|
159
|
+
.filter((z) => !z.checked)
|
|
160
|
+
.map((z) => z.name);
|
|
161
|
+
this.getZoneJourney(hiddenZones);
|
|
162
|
+
this.getBubble(hiddenZones);
|
|
163
|
+
this.cd.detectChanges();
|
|
164
|
+
this.dropdownSearchText = '';
|
|
165
|
+
this.showDropdown = false;
|
|
166
|
+
}
|
|
167
|
+
resetZones() {
|
|
168
|
+
// Reset applied state
|
|
169
|
+
this.zoneList = this.zoneList.map((z) => ({
|
|
170
|
+
...z,
|
|
171
|
+
checked: true
|
|
172
|
+
}));
|
|
173
|
+
// Sync temp state
|
|
174
|
+
this.tempZoneList = this.zoneList.map((z) => ({ ...z }));
|
|
175
|
+
this.tempFilteredZones = [...this.tempZoneList];
|
|
176
|
+
this.dropdownSearchText = '';
|
|
177
|
+
// Apply immediately
|
|
178
|
+
this.getZoneJourney([]);
|
|
179
|
+
this.getBubble([]);
|
|
180
|
+
this.showDropdown = false;
|
|
181
|
+
}
|
|
182
|
+
getZoneJourneyExport() {
|
|
183
|
+
this.object1 = {
|
|
184
|
+
clientId: this.headerData?.client,
|
|
185
|
+
storeId: this.headerData?.stores
|
|
186
|
+
.filter((store) => store.checked)
|
|
187
|
+
.map((store) => store.storeId),
|
|
188
|
+
fromDate: this.headerData?.date?.startDate,
|
|
189
|
+
toDate: this.headerData?.date?.endDate,
|
|
190
|
+
nob: this.clientData?.isNOB,
|
|
191
|
+
hideZones: this.zoneList.filter((z) => !z.checked).map((z) => z.name),
|
|
192
|
+
search: this.searchZoneText || '',
|
|
193
|
+
export: true
|
|
194
|
+
};
|
|
195
|
+
this.service.getNewZoneShopperAnalysisExportApi(this.object1).subscribe({
|
|
196
|
+
next: (res) => {
|
|
197
|
+
if (this.headerData.date.startDate == this.headerData.date.endDate) {
|
|
198
|
+
let fileName = 'Shopper Journey_Export_' + this.headerData.date.startDate;
|
|
199
|
+
this.service.saveAsExcelFile1(res, fileName);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
let fileName = 'Shopper Journey_Export_' + this.headerData.date.startDate + '_' + this.headerData.date.endDate;
|
|
203
|
+
this.service.saveAsExcelFile1(res, fileName);
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
error: ((e) => {
|
|
207
|
+
let errorMsg = 'Something went Wrong..';
|
|
208
|
+
if (e && e.error && e.error.error) {
|
|
209
|
+
errorMsg = e.error.error;
|
|
210
|
+
}
|
|
211
|
+
this.ts.getErrorToast(errorMsg);
|
|
212
|
+
})
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
zoneCardNoData = false;
|
|
216
|
+
zoneCardLoading = true;
|
|
217
|
+
getZoneJourney(hiddenZones = []) {
|
|
218
|
+
this.zoneCardLoading = true;
|
|
219
|
+
this.zoneCardNoData = false;
|
|
220
|
+
this.object1 = {
|
|
221
|
+
clientId: this.headerData?.client,
|
|
222
|
+
storeId: this.headerData?.stores
|
|
223
|
+
.filter((store) => store.checked)
|
|
224
|
+
.map((store) => store.storeId),
|
|
225
|
+
fromDate: this.headerData?.date?.startDate,
|
|
226
|
+
toDate: this.headerData?.date?.endDate,
|
|
227
|
+
nob: this.clientData?.isNOB,
|
|
228
|
+
hideZones: hiddenZones,
|
|
229
|
+
search: this.searchZoneText || '',
|
|
230
|
+
export: false
|
|
231
|
+
};
|
|
232
|
+
this.service.getNewZoneShopperAnalysisApi(this.object1).subscribe({
|
|
233
|
+
next: (res) => {
|
|
234
|
+
if (res && res.code === 200) {
|
|
235
|
+
this.zoneShopperAnalysis = res.data;
|
|
236
|
+
this.zones = this.zoneShopperAnalysis?.zoneShopperAnalysis || [];
|
|
237
|
+
this.zoneCardNoData = false;
|
|
238
|
+
this.zoneCardLoading = false;
|
|
239
|
+
this.cd.detectChanges();
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
this.zoneShopperAnalysis = null;
|
|
243
|
+
this.zoneCardNoData = true;
|
|
244
|
+
this.zoneCardLoading = false;
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
error: () => {
|
|
248
|
+
this.zoneShopperAnalysis = null;
|
|
249
|
+
this.zoneCardNoData = true;
|
|
250
|
+
this.zoneCardLoading = false;
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
zoneChartNoData = false;
|
|
255
|
+
zoneChartLoading = true;
|
|
256
|
+
getBubble(hiddenZones = []) {
|
|
257
|
+
this.zoneChartLoading = true;
|
|
258
|
+
this.zoneChartNoData = false;
|
|
259
|
+
this.object = {
|
|
260
|
+
clientId: this.headerData?.client,
|
|
261
|
+
storeId: this.headerData?.stores.filter((store) => store.checked).map((store) => store.storeId),
|
|
262
|
+
fromDate: this.headerData?.date?.startDate,
|
|
263
|
+
toDate: this.headerData?.date?.endDate,
|
|
264
|
+
nob: this.clientData?.isNOB,
|
|
265
|
+
hideZones: hiddenZones,
|
|
266
|
+
};
|
|
267
|
+
this.service.getNewZoneShopperBubbleChartApi(this.object).subscribe({
|
|
268
|
+
next: (res) => {
|
|
269
|
+
if (res && res.code === 200) {
|
|
270
|
+
this.bubbleChartData = res.data;
|
|
271
|
+
this.createChart();
|
|
272
|
+
this.zoneChartNoData = false;
|
|
273
|
+
this.zoneChartLoading = false;
|
|
274
|
+
this.cd.detectChanges();
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
this.bubbleChartData = null;
|
|
278
|
+
this.zoneChartNoData = true;
|
|
279
|
+
this.zoneChartLoading = false;
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
error: (err) => {
|
|
283
|
+
this.bubbleChartData = null;
|
|
284
|
+
this.zoneChartNoData = true;
|
|
285
|
+
this.zoneChartLoading = false;
|
|
286
|
+
// console.log('zone journey bubble chart error',err);
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
createChart() {
|
|
291
|
+
setTimeout(() => {
|
|
292
|
+
// Dispose old chart
|
|
293
|
+
if (this.root) {
|
|
294
|
+
this.root.dispose();
|
|
295
|
+
}
|
|
296
|
+
// Root
|
|
297
|
+
this.root = am5.Root.new('chartdiv');
|
|
298
|
+
this.root.setThemes([am5themes_Animated.new(this.root)]);
|
|
299
|
+
// Arc Diagram Series
|
|
300
|
+
const series = this.root.container.children.push(am5flow.ArcDiagram.new(this.root, {
|
|
301
|
+
sourceIdField: 'from',
|
|
302
|
+
targetIdField: 'to',
|
|
303
|
+
valueField: 'value',
|
|
304
|
+
orientation: 'horizontal'
|
|
305
|
+
}));
|
|
306
|
+
// --------------------------------------------------
|
|
307
|
+
// TOOLTIP (HTML)
|
|
308
|
+
// --------------------------------------------------
|
|
309
|
+
const tooltip = am5.Tooltip.new(this.root, {
|
|
310
|
+
getFillFromSprite: false,
|
|
311
|
+
getStrokeFromSprite: false,
|
|
312
|
+
autoTextColor: false,
|
|
313
|
+
keepTargetHover: true,
|
|
314
|
+
pointerOrientation: 'horizontal'
|
|
315
|
+
});
|
|
316
|
+
tooltip.get('background')?.setAll({
|
|
317
|
+
fill: am5.color(0xffffff),
|
|
318
|
+
stroke: am5.color(0xe5e7eb),
|
|
319
|
+
shadowColor: am5.color(0xf7f7f7),
|
|
320
|
+
shadowBlur: 10,
|
|
321
|
+
shadowOffsetY: 4
|
|
322
|
+
});
|
|
323
|
+
// Attach tooltip to links
|
|
324
|
+
series.links.template.set('tooltip', tooltip);
|
|
325
|
+
series.links.template.set('tooltipHTML', '');
|
|
326
|
+
series.links.template.setAll({
|
|
327
|
+
strokeWidth: 2,
|
|
328
|
+
interactive: true,
|
|
329
|
+
tooltip: tooltip
|
|
330
|
+
});
|
|
331
|
+
// Add a larger invisible hit area
|
|
332
|
+
series.links.template.states.create("hover", {
|
|
333
|
+
strokeWidth: 3
|
|
334
|
+
});
|
|
335
|
+
// Adapter for HTML content
|
|
336
|
+
series.links.template.adapters.add('tooltipHTML', (_html, target) => {
|
|
337
|
+
const dataItem = target.dataItem;
|
|
338
|
+
if (!dataItem)
|
|
339
|
+
return '';
|
|
340
|
+
const dc = dataItem.dataContext;
|
|
341
|
+
return `
|
|
342
|
+
<div class="am-tooltip">
|
|
343
|
+
<div class="am-tooltip-header">
|
|
344
|
+
${dc.from} → ${dc.to}
|
|
345
|
+
</div>
|
|
346
|
+
<table class="am-tooltip-table">
|
|
347
|
+
<tr>
|
|
348
|
+
<td>Footfall</td>
|
|
349
|
+
<td class="value">${dc.value ?? '--'}</td>
|
|
350
|
+
</tr>
|
|
351
|
+
<tr>
|
|
352
|
+
<td>NoB</td>
|
|
353
|
+
<td class="value">${dc.NoB ?? '--'}</td>
|
|
354
|
+
</tr>
|
|
355
|
+
</table>
|
|
356
|
+
</div>
|
|
357
|
+
`;
|
|
358
|
+
});
|
|
359
|
+
// --------------------------------------------------
|
|
360
|
+
// NODE LABELS
|
|
361
|
+
// --------------------------------------------------
|
|
362
|
+
series.nodes.labels.template.setAll({
|
|
363
|
+
text: '{id}\n{total}',
|
|
364
|
+
centerX: am5.percent(50),
|
|
365
|
+
centerY: am5.percent(50),
|
|
366
|
+
textAlign: 'center',
|
|
367
|
+
fontSize: 11,
|
|
368
|
+
fill: am5.color(0x000000),
|
|
369
|
+
maxWidth: 90
|
|
370
|
+
});
|
|
371
|
+
// --------------------------------------------------
|
|
372
|
+
// FLOW BULLETS
|
|
373
|
+
// --------------------------------------------------
|
|
374
|
+
series.bullets.push((_root, _series, dataItem) => {
|
|
375
|
+
const bullet = am5.Bullet.new(this.root, {
|
|
376
|
+
locationY: Math.random(),
|
|
377
|
+
sprite: am5.Circle.new(this.root, {
|
|
378
|
+
radius: 2,
|
|
379
|
+
fill: dataItem.get('source').get('fill')
|
|
380
|
+
})
|
|
381
|
+
});
|
|
382
|
+
bullet.animate({
|
|
383
|
+
key: 'locationY',
|
|
384
|
+
from: 0,
|
|
385
|
+
to: 1,
|
|
386
|
+
duration: Math.random() * 1000 + 2000
|
|
387
|
+
});
|
|
388
|
+
return bullet;
|
|
389
|
+
});
|
|
390
|
+
// --------------------------------------------------
|
|
391
|
+
// DATA + ORDERING
|
|
392
|
+
// --------------------------------------------------
|
|
393
|
+
const nodeOrder = (name) => {
|
|
394
|
+
if (name === 'Entry')
|
|
395
|
+
return 0;
|
|
396
|
+
if (name === 'Exit')
|
|
397
|
+
return 999;
|
|
398
|
+
return 1;
|
|
399
|
+
};
|
|
400
|
+
series.data.setAll(this.bubbleChartData?.zoneBubbleChartMetrics);
|
|
401
|
+
Array.from(series.nodes.children).sort((a, b) => {
|
|
402
|
+
return (nodeOrder(a.dataItem?.dataContext?.id) -
|
|
403
|
+
nodeOrder(b.dataItem?.dataContext?.id));
|
|
404
|
+
});
|
|
405
|
+
series.appear(1000, 100);
|
|
406
|
+
}, 500);
|
|
407
|
+
}
|
|
408
|
+
ngOnDestroy() {
|
|
409
|
+
if (this.root) {
|
|
410
|
+
this.root.dispose();
|
|
411
|
+
}
|
|
412
|
+
this.destroy$.next();
|
|
413
|
+
this.destroy$.complete();
|
|
414
|
+
// this.stopAutoSlide();
|
|
415
|
+
}
|
|
416
|
+
zones = [];
|
|
417
|
+
activeIndex = 0;
|
|
418
|
+
toggle(index) {
|
|
419
|
+
this.activeIndex = this.activeIndex === index ? null : index;
|
|
420
|
+
}
|
|
421
|
+
searchNewOpen = false;
|
|
422
|
+
searchOpen() {
|
|
423
|
+
this.searchNewOpen = !this.searchNewOpen;
|
|
424
|
+
if (!this.searchNewOpen) {
|
|
425
|
+
this.searchZoneText = '';
|
|
426
|
+
this.getZoneJourney([]);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
searchZoneText = '';
|
|
430
|
+
SearchZones() {
|
|
431
|
+
this.getZoneJourney([]);
|
|
432
|
+
}
|
|
433
|
+
isMinimized = false;
|
|
434
|
+
// drag support
|
|
435
|
+
dragging = false;
|
|
436
|
+
offsetX = 0;
|
|
437
|
+
offsetY = 0;
|
|
438
|
+
floatingPos = {
|
|
439
|
+
top: 120,
|
|
440
|
+
left: window.innerWidth - 380
|
|
441
|
+
};
|
|
442
|
+
expandClose() {
|
|
443
|
+
this.isMinimized = !this.isMinimized;
|
|
444
|
+
}
|
|
445
|
+
startDrag(event) {
|
|
446
|
+
if (!this.isMinimized)
|
|
447
|
+
return;
|
|
448
|
+
this.dragging = true;
|
|
449
|
+
this.offsetX = event.clientX - this.floatingPos.left;
|
|
450
|
+
this.offsetY = event.clientY - this.floatingPos.top;
|
|
451
|
+
document.addEventListener('mousemove', this.onDrag);
|
|
452
|
+
document.addEventListener('mouseup', this.stopDrag);
|
|
453
|
+
}
|
|
454
|
+
onDrag = (event) => {
|
|
455
|
+
if (!this.dragging)
|
|
456
|
+
return;
|
|
457
|
+
this.floatingPos.left = event.clientX - this.offsetX;
|
|
458
|
+
this.floatingPos.top = event.clientY - this.offsetY;
|
|
459
|
+
};
|
|
460
|
+
stopDrag = () => {
|
|
461
|
+
this.dragging = false;
|
|
462
|
+
document.removeEventListener('mousemove', this.onDrag);
|
|
463
|
+
document.removeEventListener('mouseup', this.stopDrag);
|
|
464
|
+
};
|
|
465
|
+
nobUpload() {
|
|
466
|
+
this.router.navigate(["/manage/traffic/nob"]);
|
|
467
|
+
}
|
|
468
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ZoneJourneyComponent, deps: [{ token: i1.ZoneService }, { token: i2.Zonev2Service }, { token: i0.ChangeDetectorRef }, { token: i3.Router }, { token: i4.ToastService }], target: i0.ɵɵFactoryTarget.Component });
|
|
469
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ZoneJourneyComponent, selector: "lib-zone-journey", inputs: { headerData: "headerData", clientData: "clientData" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "zoneDropdown", first: true, predicate: ["zoneDropdown"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- zone-journey.component.html -->\r\n<div class=\"card my-card mx-1 my-2\">\r\n <div class=\"card-header px-0 mx-5 border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-1\">Zone-Based Shopper Analysis </span>\r\n <span class=\"text-sub mb-1\">Understand your Shoppers journey from one zone to another\r\n </span>\r\n </h3>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n<div class=\"zone-dropdown me-2\" #zoneDropdown\r\n (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- BUTTON -->\r\n <button [disabled]=\"!zoneShopperAnalysis\"\r\n class=\"btn btn-outline w-100 me-2 d-flex justify-content-between\"\r\n (click)=\"toggleDropdown($event)\"\r\n >\r\n Show / Hide Zone\r\n <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"7\" viewBox=\"0 0 12 7\" fill=\"none\">\r\n<path d=\"M1 1L6 6L11 1\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg></span>\r\n </button>\r\n\r\n <!-- DROPDOWN -->\r\n <div *ngIf=\"showDropdown\" class=\"dropdown-panel h-300px d-flex flex-column\">\r\n\r\n <!-- HEADER (fixed) -->\r\n <div class=\"dropdown-header px-2 pb-2\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Search Zone\"\r\n [(ngModel)]=\"dropdownSearchText\"\r\n (input)=\"filterZones()\"\r\n />\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2 mb-2 px-2\">\r\n <span class=\"mx-1\"><input\r\n type=\"checkbox\"\r\n [checked]=\"isAllSelected()\"\r\n (change)=\"toggleSelectAll($event)\"\r\n /></span>\r\n <span class=\"ms-2\">Select All</span>\r\n </div>\r\n <!-- BODY (scrollable list) -->\r\n <div class=\"dropdown-body flex-grow-1 overflow-auto px-2\">\r\n <div\r\n class=\"zone-item\"\r\n *ngFor=\"let zone of tempFilteredZones\"\r\n >\r\n <span class=\"mx-1\"><input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"zone.checked\"\r\n /></span>\r\n <span class=\"ms-2\">{{ zone.name }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- FOOTER (fixed) -->\r\n <div class=\"dropdown-footer d-flex justify-content-end gap-2 p-2 border-top\">\r\n <button class=\"btn btn-sm btn-outline w-50\" (click)=\"resetZones()\">\r\n Reset\r\n </button>\r\n <button class=\"btn btn-sm btn-primary w-50\" (click)=\"applyZones()\">\r\n Apply\r\n </button>\r\n </div>\r\n\r\n</div>\r\n\r\n</div>\r\n\r\n\r\n <button type=\"button\" (click)=\"getZoneJourneyExport()\" [disabled]=\"!zoneShopperAnalysis\"\r\n class=\"btn-outline btn align-items-end text-nowrap invheader me-4\">\r\n <!-- Export Icon -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <span class=\"ms-2\"></span> Export\r\n </button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-between mt-3 mx-3\">\r\n <div class=\"bordered-box w-50 me-2 py-1\">\r\n <div class=\"group d-flex justify-content-between pt-1 px-3\">\r\n <span class=\"text-title py-2\"><svg class=\"mx-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"19\"\r\n height=\"21\" viewBox=\"0 0 19 21\" fill=\"none\">\r\n <path\r\n d=\"M0.5 16.3258H6V17.5758C6 18.3051 5.71027 19.0046 5.19454 19.5203C4.67882 20.036 3.97935 20.3258 3.25 20.3258C2.52065 20.3258 1.82118 20.036 1.30546 19.5203C0.789731 19.0046 0.5 18.3051 0.5 17.5758V16.3258ZM4.5 4.44576C6.5 4.44576 7.5 7.32576 7.5 9.32576C7.5 10.3258 7 11.3258 6.5 12.8258L6 14.3258H0.5C0.5 13.3258 0 11.8258 0 9.32576C0 6.82576 1.998 4.44576 4.5 4.44576ZM16.554 12.4238L16.337 13.6548C16.2023 14.3654 15.7931 14.9943 15.198 15.4054C14.6029 15.8165 13.8698 15.9765 13.1576 15.8509C12.4453 15.7254 11.8111 15.3242 11.3925 14.7344C10.9739 14.1446 10.8045 13.4136 10.921 12.6998L11.137 11.4698L16.554 12.4238ZM14.678 0.0307624C17.142 0.464762 18.696 3.15576 18.262 5.61776C17.828 8.07976 17.075 9.46976 16.902 10.4548L11.485 9.49976L11.253 7.93576C11.021 6.37176 10.703 5.29976 10.876 4.31576C11.223 2.34576 12.708 -0.316238 14.678 0.0307624Z\"\r\n fill=\"#1D2939\" />\r\n </svg>Overall Footfall :</span>\r\n <span><span class=\"text-val\">{{zoneShopperAnalysis?.OverallFootfall ?? '--'}}</span> <span class=\"text-perc ms-1\">({{zoneShopperAnalysis?.ConversionPercent ?? '--'}} %)</span></span>\r\n </div>\r\n </div>\r\n <div class=\"bordered-box w-50 py-1\">\r\n <div class=\"group d-flex justify-content-between pt-1 px-3\">\r\n <span *ngIf=\"this.clientData?.isNOB\" class=\"text-title py-2\"><svg class=\"mx-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\"\r\n height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M9 11H15M9 15H15M9 7H15M5 3C5 2.73478 5.10536 2.48043 5.29289 2.29289C5.48043 2.10536 5.73478 2 6 2H18C18.2652 2 18.5196 2.10536 18.7071 2.29289C18.8946 2.48043 19 2.73478 19 3V22L15.5 19.5L12 22L8.5 19.5L5 22V3Z\"\r\n stroke=\"#1D2939\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> NoB :</span>\r\n <span *ngIf=\"!this.clientData?.isNOB\" class=\"text-title py-2\"><svg class=\"mx-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\"\r\n height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M9 11H15M9 15H15M9 7H15M5 3C5 2.73478 5.10536 2.48043 5.29289 2.29289C5.48043 2.10536 5.73478 2 6 2H18C18.2652 2 18.5196 2.10536 18.7071 2.29289C18.8946 2.48043 19 2.73478 19 3V22L15.5 19.5L12 22L8.5 19.5L5 22V3Z\"\r\n stroke=\"#1D2939\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> Conversion :</span>\r\n <span class=\"text-val\">{{zoneShopperAnalysis?.Nob ?? '--'}} <span *ngIf=\"this.clientData?.isNOB\" class=\"px-0 cursor-pointer\" (click)=\"nobUpload()\"><svg placement=\"top\" ngbTooltip=\"Upload NoB\" xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\"\r\n viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_15106_106090)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"#EAF8FF\" />\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#EAF8FF\" />\r\n <path\r\n d=\"M23.3326 22.3332L19.9992 18.9999M19.9992 18.9999L16.6659 22.3332M19.9992 18.9999V26.4999M26.9909 24.3249C27.8037 23.8818 28.4458 23.1806 28.8158 22.3321C29.1858 21.4835 29.2627 20.5359 29.0344 19.6388C28.8061 18.7417 28.2855 17.9462 27.5548 17.3778C26.8241 16.8094 25.925 16.5005 24.9992 16.4999H23.9492C23.697 15.5243 23.2269 14.6185 22.5742 13.8507C21.9215 13.0829 21.1033 12.4731 20.181 12.0671C19.2587 11.661 18.2564 11.4694 17.2493 11.5065C16.2423 11.5436 15.2568 11.8085 14.3669 12.2813C13.477 12.7541 12.7058 13.4225 12.1114 14.2362C11.517 15.05 11.1148 15.9879 10.9351 16.9794C10.7553 17.9709 10.8027 18.9903 11.0736 19.961C11.3445 20.9316 11.8319 21.8281 12.4992 22.5832\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_15106_106090\" x=\"0\" y=\"0\" width=\"40\" height=\"40\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_15106_106090\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_15106_106090\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg></span></span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row gx-0 p-3\">\r\n <div [ngClass]=\"isMinimized ? 'col-12' : 'col-8'\"\r\n [style.height.px]=\"zoneChartNoData ? 300 : (isMinimized ? 650 : 550)\">\r\n <ng-container *ngIf=\"zoneChartLoading\">\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>\r\n </ng-container>\r\n <ng-container *ngIf=\"zoneChartNoData\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 my-6\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodatamaintext mt-3\">No data found</div>\r\n <div class=\"nodatasubtext\">There is no result for Zone Based Shopper Analysis Chart</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!zoneChartNoData && !zoneChartLoading\" id=\"chartdiv\" style=\"width: 100%; height: 100%;\"></div>\r\n </div>\r\n\r\n <div [ngClass]=\"isMinimized ? 'zone-floating' : 'col-4'\" [style.top.px]=\"isMinimized ? floatingPos.top : null\"\r\n [style.left.px]=\"isMinimized ? floatingPos.left : null\" (mousedown)=\"startDrag($event)\">\r\n <!-- (mousedown)=\"startDrag($event)\" -->\r\n <ng-container *ngIf=\"zoneCardLoading\">\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>\r\n </ng-container>\r\n <ng-container *ngIf=\"zoneCardNoData\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 my-6\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodatamaintext mt-3\">No data found</div>\r\n <div class=\"nodatasubtext\">There is no result for Zone Based Shopper Analysis</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-conatiner *ngIf=\"!zoneCardNoData && !zoneCardLoading\" class=\"card \">\r\n <div class=\"card-header border-0 px-4\"\r\n [ngClass]=\"isMinimized ?'bg-secondary min-h-30px': 'bg-light-primary min-h-45px mb-2'\">\r\n <div class=\"card-title align-items-start\"><span *ngIf=\"isMinimized\" class=\"me-2 mb-2\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M9 20C8.45 20 7.97917 19.8042 7.5875 19.4125C7.19583 19.0208 7 18.55 7 18C7 17.45 7.19583 16.9792 7.5875 16.5875C7.97917 16.1958 8.45 16 9 16C9.55 16 10.0208 16.1958 10.4125 16.5875C10.8042 16.9792 11 17.45 11 18C11 18.55 10.8042 19.0208 10.4125 19.4125C10.0208 19.8042 9.55 20 9 20ZM15 20C14.45 20 13.9792 19.8042 13.5875 19.4125C13.1958 19.0208 13 18.55 13 18C13 17.45 13.1958 16.9792 13.5875 16.5875C13.9792 16.1958 14.45 16 15 16C15.55 16 16.0208 16.1958 16.4125 16.5875C16.8042 16.9792 17 17.45 17 18C17 18.55 16.8042 19.0208 16.4125 19.4125C16.0208 19.8042 15.55 20 15 20ZM9 14C8.45 14 7.97917 13.8042 7.5875 13.4125C7.19583 13.0208 7 12.55 7 12C7 11.45 7.19583 10.9792 7.5875 10.5875C7.97917 10.1958 8.45 10 9 10C9.55 10 10.0208 10.1958 10.4125 10.5875C10.8042 10.9792 11 11.45 11 12C11 12.55 10.8042 13.0208 10.4125 13.4125C10.0208 13.8042 9.55 14 9 14ZM15 14C14.45 14 13.9792 13.8042 13.5875 13.4125C13.1958 13.0208 13 12.55 13 12C13 11.45 13.1958 10.9792 13.5875 10.5875C13.9792 10.1958 14.45 10 15 10C15.55 10 16.0208 10.1958 16.4125 10.5875C16.8042 10.9792 17 11.45 17 12C17 12.55 16.8042 13.0208 16.4125 13.4125C16.0208 13.8042 15.55 14 15 14ZM9 8C8.45 8 7.97917 7.80417 7.5875 7.4125C7.19583 7.02083 7 6.55 7 6C7 5.45 7.19583 4.97917 7.5875 4.5875C7.97917 4.19583 8.45 4 9 4C9.55 4 10.0208 4.19583 10.4125 4.5875C10.8042 4.97917 11 5.45 11 6C11 6.55 10.8042 7.02083 10.4125 7.4125C10.0208 7.80417 9.55 8 9 8ZM15 8C14.45 8 13.9792 7.80417 13.5875 7.4125C13.1958 7.02083 13 6.55 13 6C13 5.45 13.1958 4.97917 13.5875 4.5875C13.9792 4.19583 14.45 4 15 4C15.55 4 16.0208 4.19583 16.4125 4.5875C16.8042 4.97917 17 5.45 17 6C17 6.55 16.8042 7.02083 16.4125 7.4125C16.0208 7.80417 15.55 8 15 8Z\"\r\n fill=\"#667085\" />\r\n </svg></span> Zone Journey </div>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span *ngIf=\"!isMinimized\" (click)=\"searchOpen()\" class=\"me-3\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path\r\n d=\"M19 19L14.65 14.65M17 9C17 13.4183 13.4183 17 9 17C4.58172 17 1 13.4183 1 9C1 4.58172 4.58172 1 9 1C13.4183 1 17 4.58172 17 9Z\"\r\n stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"cursor-pointer\" *ngIf=\"!isMinimized\"\r\n (click)=\"expandClose(); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M5 12H19\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span class=\"cursor-pointer\" *ngIf=\"isMinimized\"\r\n (click)=\"expandClose(); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M15 3H21M21 3V9M21 3L14 10M9 21H3M3 21V15M3 21L10 14\" stroke=\"#667085\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!isMinimized\" class=\"card-body h-500px overflow-auto px-0 py-2\">\r\n \r\n<div *ngIf=\"searchNewOpen\" class=\"px-2 pb-2\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Search Zone\"\r\n [(ngModel)]=\"searchZoneText\"\r\n (change)=\"SearchZones()\"\r\n />\r\n </div>\r\n <div class=\"zone-card mx-3 \" *ngFor=\"let zone of zones;let i = index\">\r\n\r\n <!-- HEADER -->\r\n <div [ngClass]=\"activeIndex === i ? 'zone-header':'zone-default'\" (click)=\"toggle(i)\">\r\n <div [ngClass]=\"activeIndex === i ? 'zone-title':'zone-notitle'\">{{ zone.fromZone |\r\n titlecase}}\r\n </div>\r\n\r\n <div class=\"zone-metrics\">\r\n <span class=\"badge badge-light-primary px-2\" placement=\"top\" ngbTooltip=\"Footfall (Engagers)\">\r\n <span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\"\r\n viewBox=\"0 0 10 11\" fill=\"none\">\r\n <path\r\n d=\"M0.25 8.16288H3V8.78788C3 9.15255 2.85513 9.50229 2.59727 9.76015C2.33941 10.018 1.98967 10.1629 1.625 10.1629C1.26033 10.1629 0.910591 10.018 0.652728 9.76015C0.394866 9.50229 0.25 9.15255 0.25 8.78788V8.16288ZM2.25 2.22288C3.25 2.22288 3.75 3.66288 3.75 4.66288C3.75 5.16288 3.5 5.66288 3.25 6.41288L3 7.16288H0.25C0.25 6.66288 0 5.91288 0 4.66288C0 3.41288 0.999 2.22288 2.25 2.22288ZM8.277 6.21188L8.1685 6.82738C8.10117 7.18269 7.89656 7.49717 7.59901 7.70271C7.30146 7.90824 6.93492 7.98827 6.57878 7.92547C6.22263 7.86268 5.90557 7.6621 5.69626 7.3672C5.48695 7.07229 5.40225 6.7068 5.4605 6.34988L5.5685 5.73488L8.277 6.21188ZM7.339 0.0153812C8.571 0.232381 9.348 1.57788 9.131 2.80888C8.914 4.03988 8.5375 4.73488 8.451 5.22738L5.7425 4.74988L5.6265 3.96788C5.5105 3.18588 5.3515 2.64988 5.438 2.15788C5.6115 1.17288 6.354 -0.158119 7.339 0.0153812Z\"\r\n fill=\"#009BF3\" />\r\n </svg></span> {{ zone.fromZoneFootfallCount ?? '--' }}\r\n </span>\r\n <span class=\"badge badge-light-default px-2\" placement=\"top\"\r\n [ngbTooltip]=\"clientData?.isNOB ? 'NoB' : 'Conversion'\">\r\n <span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M4.5 5.5H7.5M4.5 7.5H7.5M4.5 3.5H7.5M2.5 1.5C2.5 1.36739 2.55268 1.24021 2.64645 1.14645C2.74021 1.05268 2.86739 1 3 1H9C9.13261 1 9.25979 1.05268 9.35355 1.14645C9.44732 1.24021 9.5 1.36739 9.5 1.5V11L7.75 9.75L6 11L4.25 9.75L2.5 11V1.5Z\"\r\n stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span> {{ zone.fromZoneNobCount ?? '--' }}\r\n </span>\r\n\r\n <span class=\"arrow cursor-pointer\"><svg *ngIf=\"activeIndex === i\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"7\" viewBox=\"0 0 12 7\"\r\n fill=\"none\">\r\n <path d=\"M0.832031 5.83301L5.83203 0.833008L10.832 5.83301\" stroke=\"#33B5FF\"\r\n stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"activeIndex !== i\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\"\r\n height=\"7\" viewBox=\"0 0 12 7\" fill=\"none\">\r\n <path d=\"M0.832031 0.833008L5.83203 5.83301L10.832 0.833008\" stroke=\"#667085\"\r\n stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- BODY -->\r\n <div class=\"zone-body max-h-200px min-h-auto overflow-auto\" *ngIf=\"activeIndex === i\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table text-nowrap bottom-border \">\r\n <thead>\r\n\r\n <tr>\r\n <th class=\"w-50\">To Zone</th>\r\n <th>Footfall (Engagers)</th>\r\n <th ><span class=\"me-2\" *ngIf=\"this.clientData?.isNOB\">NoB</span> <span class=\"me-2\" *ngIf=\"!this.clientData?.isNOB\">Conversion</span> <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_15320_82488)\">\r\n <path\r\n d=\"M7.9987 10.6663V7.99967M7.9987 5.33301H8.00536M14.6654 7.99967C14.6654 11.6816 11.6806 14.6663 7.9987 14.6663C4.3168 14.6663 1.33203 11.6816 1.33203 7.99967C1.33203 4.31778 4.3168 1.33301 7.9987 1.33301C11.6806 1.33301 14.6654 4.31778 14.6654 7.99967Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_15320_82488\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of zone.toZoneData\">\r\n <td>{{ row.toZone | titlecase}}</td>\r\n <td>{{ row.footfall ?? '--' }} ({{ row.engagerPercent }}%)</td>\r\n <td>{{ row.nob ?? '--' }} ({{ row.nobPercent }}%)</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </ng-conatiner>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n</div>", styles: [".zone-card{border:1px solid #e6f0ff;border-radius:10px;margin-bottom:12px;background:#fff}.zone-header{display:flex;justify-content:space-between;align-items:center;padding:12px 30px 12px 12px;cursor:pointer;background:#f6fcff;border-radius:10px}.zone-default{border-width:1px;display:flex;justify-content:space-between;align-items:center;opacity:1;border-radius:8px;padding:12px 30px 12px 12px;border:1px solid #D0D5DD;background:#fff}.zone-title{font-weight:600;font-size:16px;line-height:24px;letter-spacing:0%;vertical-align:middle;color:#33b5ff}.zone-metrics{display:flex;align-items:center;gap:8px}.pill{padding:4px 10px;border-radius:16px;font-size:12px}.arrow{transition:transform .3s ease}.arrow.rotate{transform:rotate(180deg)}.zone-body{padding:10px 12px}.table-head,.table-row{display:grid;grid-template-columns:1fr 1fr 1fr;padding:6px 0}.table-head{font-weight:600;font-size:12px;opacity:1;padding:11px 16px;border-bottom-width:1px;background-color:#fcfcfd;color:#667085;border-bottom:1px solid #EAECF0;display:flex;justify-content:space-between}.table-row{opacity:1;padding:11px 16px;border-bottom-width:1px;display:flex;justify-content:space-between;font-size:13px;border-bottom:1px solid #EAECF0}.zone-floating{position:sticky;width:330px;height:75px;top:0;z-index:9999;cursor:move}.ellipse1{border-radius:6px;border-bottom:2px solid var(--Gray-200, #EAECF0);background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.bordered-box{border:1px solid #EAECF0;border-radius:8px}.path-wrapper{opacity:1;padding:8px 16px;gap:16px;border-bottom-width:2px;border-radius:6px}.title{font-weight:600;margin-bottom:12px}.path-card{position:relative;border-radius:12px;background:linear-gradient(135deg,#eef7ff,#e1f3ff);padding:20px}.badge{background:#e0f2ff;color:#0b6ef6;padding:6px 12px;border-radius:20px;font-size:13px}.percent{font-size:20px;font-weight:600;margin-left:12px}.path-text{margin-top:12px;font-size:16px;display:flex;flex-wrap:wrap;gap:8px}.step{font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;color:#344054}.arrowpath{color:#98a2b3}.dots{display:flex;gap:6px;margin-top:12px}.dots span{width:8px;height:8px;background:#d0d5dd;border-radius:50%;cursor:pointer}.dots span.active{background:#344054}.my-card{position:relative}.text-perc{color:#101828;font-weight:400;font-size:20px;line-height:30px}.text-val{font-weight:600;font-size:20px;color:#101828;line-height:30px}.text-title{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.zone-dropdown{position:relative}.dropdown-panel{position:absolute;background:#fff;border-radius:8px;padding:10px;width:100%;box-shadow:0 6px 20px #0000001a;z-index:1000}input[type=checkbox]{width:16px!important;height:16px!important;margin:-2px 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}.dropdown-panel{width:260px;background:#fff;border-radius:8px;box-shadow:0 6px 20px #0000001f}.dropdown-body{max-height:220px}.zone-item{display:flex;align-items:center;gap:8px;padding:6px 0}input[type=checkbox]{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}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}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.am-tooltip{font-size:12px}.am-tooltip-header{font-weight:600;margin-bottom:6px}.am-tooltip-table{width:100%;border-collapse:collapse}.am-tooltip-table .value{text-align:right;font-weight:600}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "pipe", type: i5.TitleCasePipe, name: "titlecase" }] });
|
|
470
|
+
}
|
|
471
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ZoneJourneyComponent, decorators: [{
|
|
472
|
+
type: Component,
|
|
473
|
+
args: [{ selector: 'lib-zone-journey', template: "<!-- zone-journey.component.html -->\r\n<div class=\"card my-card mx-1 my-2\">\r\n <div class=\"card-header px-0 mx-5 border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-1\">Zone-Based Shopper Analysis </span>\r\n <span class=\"text-sub mb-1\">Understand your Shoppers journey from one zone to another\r\n </span>\r\n </h3>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n<div class=\"zone-dropdown me-2\" #zoneDropdown\r\n (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- BUTTON -->\r\n <button [disabled]=\"!zoneShopperAnalysis\"\r\n class=\"btn btn-outline w-100 me-2 d-flex justify-content-between\"\r\n (click)=\"toggleDropdown($event)\"\r\n >\r\n Show / Hide Zone\r\n <span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"7\" viewBox=\"0 0 12 7\" fill=\"none\">\r\n<path d=\"M1 1L6 6L11 1\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg></span>\r\n </button>\r\n\r\n <!-- DROPDOWN -->\r\n <div *ngIf=\"showDropdown\" class=\"dropdown-panel h-300px d-flex flex-column\">\r\n\r\n <!-- HEADER (fixed) -->\r\n <div class=\"dropdown-header px-2 pb-2\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Search Zone\"\r\n [(ngModel)]=\"dropdownSearchText\"\r\n (input)=\"filterZones()\"\r\n />\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2 mb-2 px-2\">\r\n <span class=\"mx-1\"><input\r\n type=\"checkbox\"\r\n [checked]=\"isAllSelected()\"\r\n (change)=\"toggleSelectAll($event)\"\r\n /></span>\r\n <span class=\"ms-2\">Select All</span>\r\n </div>\r\n <!-- BODY (scrollable list) -->\r\n <div class=\"dropdown-body flex-grow-1 overflow-auto px-2\">\r\n <div\r\n class=\"zone-item\"\r\n *ngFor=\"let zone of tempFilteredZones\"\r\n >\r\n <span class=\"mx-1\"><input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"zone.checked\"\r\n /></span>\r\n <span class=\"ms-2\">{{ zone.name }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- FOOTER (fixed) -->\r\n <div class=\"dropdown-footer d-flex justify-content-end gap-2 p-2 border-top\">\r\n <button class=\"btn btn-sm btn-outline w-50\" (click)=\"resetZones()\">\r\n Reset\r\n </button>\r\n <button class=\"btn btn-sm btn-primary w-50\" (click)=\"applyZones()\">\r\n Apply\r\n </button>\r\n </div>\r\n\r\n</div>\r\n\r\n</div>\r\n\r\n\r\n <button type=\"button\" (click)=\"getZoneJourneyExport()\" [disabled]=\"!zoneShopperAnalysis\"\r\n class=\"btn-outline btn align-items-end text-nowrap invheader me-4\">\r\n <!-- Export Icon -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n <span class=\"ms-2\"></span> Export\r\n </button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-between mt-3 mx-3\">\r\n <div class=\"bordered-box w-50 me-2 py-1\">\r\n <div class=\"group d-flex justify-content-between pt-1 px-3\">\r\n <span class=\"text-title py-2\"><svg class=\"mx-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"19\"\r\n height=\"21\" viewBox=\"0 0 19 21\" fill=\"none\">\r\n <path\r\n d=\"M0.5 16.3258H6V17.5758C6 18.3051 5.71027 19.0046 5.19454 19.5203C4.67882 20.036 3.97935 20.3258 3.25 20.3258C2.52065 20.3258 1.82118 20.036 1.30546 19.5203C0.789731 19.0046 0.5 18.3051 0.5 17.5758V16.3258ZM4.5 4.44576C6.5 4.44576 7.5 7.32576 7.5 9.32576C7.5 10.3258 7 11.3258 6.5 12.8258L6 14.3258H0.5C0.5 13.3258 0 11.8258 0 9.32576C0 6.82576 1.998 4.44576 4.5 4.44576ZM16.554 12.4238L16.337 13.6548C16.2023 14.3654 15.7931 14.9943 15.198 15.4054C14.6029 15.8165 13.8698 15.9765 13.1576 15.8509C12.4453 15.7254 11.8111 15.3242 11.3925 14.7344C10.9739 14.1446 10.8045 13.4136 10.921 12.6998L11.137 11.4698L16.554 12.4238ZM14.678 0.0307624C17.142 0.464762 18.696 3.15576 18.262 5.61776C17.828 8.07976 17.075 9.46976 16.902 10.4548L11.485 9.49976L11.253 7.93576C11.021 6.37176 10.703 5.29976 10.876 4.31576C11.223 2.34576 12.708 -0.316238 14.678 0.0307624Z\"\r\n fill=\"#1D2939\" />\r\n </svg>Overall Footfall :</span>\r\n <span><span class=\"text-val\">{{zoneShopperAnalysis?.OverallFootfall ?? '--'}}</span> <span class=\"text-perc ms-1\">({{zoneShopperAnalysis?.ConversionPercent ?? '--'}} %)</span></span>\r\n </div>\r\n </div>\r\n <div class=\"bordered-box w-50 py-1\">\r\n <div class=\"group d-flex justify-content-between pt-1 px-3\">\r\n <span *ngIf=\"this.clientData?.isNOB\" class=\"text-title py-2\"><svg class=\"mx-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\"\r\n height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M9 11H15M9 15H15M9 7H15M5 3C5 2.73478 5.10536 2.48043 5.29289 2.29289C5.48043 2.10536 5.73478 2 6 2H18C18.2652 2 18.5196 2.10536 18.7071 2.29289C18.8946 2.48043 19 2.73478 19 3V22L15.5 19.5L12 22L8.5 19.5L5 22V3Z\"\r\n stroke=\"#1D2939\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> NoB :</span>\r\n <span *ngIf=\"!this.clientData?.isNOB\" class=\"text-title py-2\"><svg class=\"mx-2\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\"\r\n height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M9 11H15M9 15H15M9 7H15M5 3C5 2.73478 5.10536 2.48043 5.29289 2.29289C5.48043 2.10536 5.73478 2 6 2H18C18.2652 2 18.5196 2.10536 18.7071 2.29289C18.8946 2.48043 19 2.73478 19 3V22L15.5 19.5L12 22L8.5 19.5L5 22V3Z\"\r\n stroke=\"#1D2939\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> Conversion :</span>\r\n <span class=\"text-val\">{{zoneShopperAnalysis?.Nob ?? '--'}} <span *ngIf=\"this.clientData?.isNOB\" class=\"px-0 cursor-pointer\" (click)=\"nobUpload()\"><svg placement=\"top\" ngbTooltip=\"Upload NoB\" xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\"\r\n viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_15106_106090)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"#EAF8FF\" />\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#EAF8FF\" />\r\n <path\r\n d=\"M23.3326 22.3332L19.9992 18.9999M19.9992 18.9999L16.6659 22.3332M19.9992 18.9999V26.4999M26.9909 24.3249C27.8037 23.8818 28.4458 23.1806 28.8158 22.3321C29.1858 21.4835 29.2627 20.5359 29.0344 19.6388C28.8061 18.7417 28.2855 17.9462 27.5548 17.3778C26.8241 16.8094 25.925 16.5005 24.9992 16.4999H23.9492C23.697 15.5243 23.2269 14.6185 22.5742 13.8507C21.9215 13.0829 21.1033 12.4731 20.181 12.0671C19.2587 11.661 18.2564 11.4694 17.2493 11.5065C16.2423 11.5436 15.2568 11.8085 14.3669 12.2813C13.477 12.7541 12.7058 13.4225 12.1114 14.2362C11.517 15.05 11.1148 15.9879 10.9351 16.9794C10.7553 17.9709 10.8027 18.9903 11.0736 19.961C11.3445 20.9316 11.8319 21.8281 12.4992 22.5832\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_15106_106090\" x=\"0\" y=\"0\" width=\"40\" height=\"40\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_15106_106090\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_15106_106090\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg></span></span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row gx-0 p-3\">\r\n <div [ngClass]=\"isMinimized ? 'col-12' : 'col-8'\"\r\n [style.height.px]=\"zoneChartNoData ? 300 : (isMinimized ? 650 : 550)\">\r\n <ng-container *ngIf=\"zoneChartLoading\">\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>\r\n </ng-container>\r\n <ng-container *ngIf=\"zoneChartNoData\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 my-6\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodatamaintext mt-3\">No data found</div>\r\n <div class=\"nodatasubtext\">There is no result for Zone Based Shopper Analysis Chart</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!zoneChartNoData && !zoneChartLoading\" id=\"chartdiv\" style=\"width: 100%; height: 100%;\"></div>\r\n </div>\r\n\r\n <div [ngClass]=\"isMinimized ? 'zone-floating' : 'col-4'\" [style.top.px]=\"isMinimized ? floatingPos.top : null\"\r\n [style.left.px]=\"isMinimized ? floatingPos.left : null\" (mousedown)=\"startDrag($event)\">\r\n <!-- (mousedown)=\"startDrag($event)\" -->\r\n <ng-container *ngIf=\"zoneCardLoading\">\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>\r\n </ng-container>\r\n <ng-container *ngIf=\"zoneCardNoData\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 my-6\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodatamaintext mt-3\">No data found</div>\r\n <div class=\"nodatasubtext\">There is no result for Zone Based Shopper Analysis</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-conatiner *ngIf=\"!zoneCardNoData && !zoneCardLoading\" class=\"card \">\r\n <div class=\"card-header border-0 px-4\"\r\n [ngClass]=\"isMinimized ?'bg-secondary min-h-30px': 'bg-light-primary min-h-45px mb-2'\">\r\n <div class=\"card-title align-items-start\"><span *ngIf=\"isMinimized\" class=\"me-2 mb-2\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M9 20C8.45 20 7.97917 19.8042 7.5875 19.4125C7.19583 19.0208 7 18.55 7 18C7 17.45 7.19583 16.9792 7.5875 16.5875C7.97917 16.1958 8.45 16 9 16C9.55 16 10.0208 16.1958 10.4125 16.5875C10.8042 16.9792 11 17.45 11 18C11 18.55 10.8042 19.0208 10.4125 19.4125C10.0208 19.8042 9.55 20 9 20ZM15 20C14.45 20 13.9792 19.8042 13.5875 19.4125C13.1958 19.0208 13 18.55 13 18C13 17.45 13.1958 16.9792 13.5875 16.5875C13.9792 16.1958 14.45 16 15 16C15.55 16 16.0208 16.1958 16.4125 16.5875C16.8042 16.9792 17 17.45 17 18C17 18.55 16.8042 19.0208 16.4125 19.4125C16.0208 19.8042 15.55 20 15 20ZM9 14C8.45 14 7.97917 13.8042 7.5875 13.4125C7.19583 13.0208 7 12.55 7 12C7 11.45 7.19583 10.9792 7.5875 10.5875C7.97917 10.1958 8.45 10 9 10C9.55 10 10.0208 10.1958 10.4125 10.5875C10.8042 10.9792 11 11.45 11 12C11 12.55 10.8042 13.0208 10.4125 13.4125C10.0208 13.8042 9.55 14 9 14ZM15 14C14.45 14 13.9792 13.8042 13.5875 13.4125C13.1958 13.0208 13 12.55 13 12C13 11.45 13.1958 10.9792 13.5875 10.5875C13.9792 10.1958 14.45 10 15 10C15.55 10 16.0208 10.1958 16.4125 10.5875C16.8042 10.9792 17 11.45 17 12C17 12.55 16.8042 13.0208 16.4125 13.4125C16.0208 13.8042 15.55 14 15 14ZM9 8C8.45 8 7.97917 7.80417 7.5875 7.4125C7.19583 7.02083 7 6.55 7 6C7 5.45 7.19583 4.97917 7.5875 4.5875C7.97917 4.19583 8.45 4 9 4C9.55 4 10.0208 4.19583 10.4125 4.5875C10.8042 4.97917 11 5.45 11 6C11 6.55 10.8042 7.02083 10.4125 7.4125C10.0208 7.80417 9.55 8 9 8ZM15 8C14.45 8 13.9792 7.80417 13.5875 7.4125C13.1958 7.02083 13 6.55 13 6C13 5.45 13.1958 4.97917 13.5875 4.5875C13.9792 4.19583 14.45 4 15 4C15.55 4 16.0208 4.19583 16.4125 4.5875C16.8042 4.97917 17 5.45 17 6C17 6.55 16.8042 7.02083 16.4125 7.4125C16.0208 7.80417 15.55 8 15 8Z\"\r\n fill=\"#667085\" />\r\n </svg></span> Zone Journey </div>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span *ngIf=\"!isMinimized\" (click)=\"searchOpen()\" class=\"me-3\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path\r\n d=\"M19 19L14.65 14.65M17 9C17 13.4183 13.4183 17 9 17C4.58172 17 1 13.4183 1 9C1 4.58172 4.58172 1 9 1C13.4183 1 17 4.58172 17 9Z\"\r\n stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"cursor-pointer\" *ngIf=\"!isMinimized\"\r\n (click)=\"expandClose(); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M5 12H19\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span class=\"cursor-pointer\" *ngIf=\"isMinimized\"\r\n (click)=\"expandClose(); $event.stopPropagation()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M15 3H21M21 3V9M21 3L14 10M9 21H3M3 21V15M3 21L10 14\" stroke=\"#667085\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!isMinimized\" class=\"card-body h-500px overflow-auto px-0 py-2\">\r\n \r\n<div *ngIf=\"searchNewOpen\" class=\"px-2 pb-2\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Search Zone\"\r\n [(ngModel)]=\"searchZoneText\"\r\n (change)=\"SearchZones()\"\r\n />\r\n </div>\r\n <div class=\"zone-card mx-3 \" *ngFor=\"let zone of zones;let i = index\">\r\n\r\n <!-- HEADER -->\r\n <div [ngClass]=\"activeIndex === i ? 'zone-header':'zone-default'\" (click)=\"toggle(i)\">\r\n <div [ngClass]=\"activeIndex === i ? 'zone-title':'zone-notitle'\">{{ zone.fromZone |\r\n titlecase}}\r\n </div>\r\n\r\n <div class=\"zone-metrics\">\r\n <span class=\"badge badge-light-primary px-2\" placement=\"top\" ngbTooltip=\"Footfall (Engagers)\">\r\n <span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\"\r\n viewBox=\"0 0 10 11\" fill=\"none\">\r\n <path\r\n d=\"M0.25 8.16288H3V8.78788C3 9.15255 2.85513 9.50229 2.59727 9.76015C2.33941 10.018 1.98967 10.1629 1.625 10.1629C1.26033 10.1629 0.910591 10.018 0.652728 9.76015C0.394866 9.50229 0.25 9.15255 0.25 8.78788V8.16288ZM2.25 2.22288C3.25 2.22288 3.75 3.66288 3.75 4.66288C3.75 5.16288 3.5 5.66288 3.25 6.41288L3 7.16288H0.25C0.25 6.66288 0 5.91288 0 4.66288C0 3.41288 0.999 2.22288 2.25 2.22288ZM8.277 6.21188L8.1685 6.82738C8.10117 7.18269 7.89656 7.49717 7.59901 7.70271C7.30146 7.90824 6.93492 7.98827 6.57878 7.92547C6.22263 7.86268 5.90557 7.6621 5.69626 7.3672C5.48695 7.07229 5.40225 6.7068 5.4605 6.34988L5.5685 5.73488L8.277 6.21188ZM7.339 0.0153812C8.571 0.232381 9.348 1.57788 9.131 2.80888C8.914 4.03988 8.5375 4.73488 8.451 5.22738L5.7425 4.74988L5.6265 3.96788C5.5105 3.18588 5.3515 2.64988 5.438 2.15788C5.6115 1.17288 6.354 -0.158119 7.339 0.0153812Z\"\r\n fill=\"#009BF3\" />\r\n </svg></span> {{ zone.fromZoneFootfallCount ?? '--' }}\r\n </span>\r\n <span class=\"badge badge-light-default px-2\" placement=\"top\"\r\n [ngbTooltip]=\"clientData?.isNOB ? 'NoB' : 'Conversion'\">\r\n <span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path\r\n d=\"M4.5 5.5H7.5M4.5 7.5H7.5M4.5 3.5H7.5M2.5 1.5C2.5 1.36739 2.55268 1.24021 2.64645 1.14645C2.74021 1.05268 2.86739 1 3 1H9C9.13261 1 9.25979 1.05268 9.35355 1.14645C9.44732 1.24021 9.5 1.36739 9.5 1.5V11L7.75 9.75L6 11L4.25 9.75L2.5 11V1.5Z\"\r\n stroke=\"#344054\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span> {{ zone.fromZoneNobCount ?? '--' }}\r\n </span>\r\n\r\n <span class=\"arrow cursor-pointer\"><svg *ngIf=\"activeIndex === i\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"7\" viewBox=\"0 0 12 7\"\r\n fill=\"none\">\r\n <path d=\"M0.832031 5.83301L5.83203 0.833008L10.832 5.83301\" stroke=\"#33B5FF\"\r\n stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngIf=\"activeIndex !== i\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\"\r\n height=\"7\" viewBox=\"0 0 12 7\" fill=\"none\">\r\n <path d=\"M0.832031 0.833008L5.83203 5.83301L10.832 0.833008\" stroke=\"#667085\"\r\n stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- BODY -->\r\n <div class=\"zone-body max-h-200px min-h-auto overflow-auto\" *ngIf=\"activeIndex === i\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table text-nowrap bottom-border \">\r\n <thead>\r\n\r\n <tr>\r\n <th class=\"w-50\">To Zone</th>\r\n <th>Footfall (Engagers)</th>\r\n <th ><span class=\"me-2\" *ngIf=\"this.clientData?.isNOB\">NoB</span> <span class=\"me-2\" *ngIf=\"!this.clientData?.isNOB\">Conversion</span> <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_15320_82488)\">\r\n <path\r\n d=\"M7.9987 10.6663V7.99967M7.9987 5.33301H8.00536M14.6654 7.99967C14.6654 11.6816 11.6806 14.6663 7.9987 14.6663C4.3168 14.6663 1.33203 11.6816 1.33203 7.99967C1.33203 4.31778 4.3168 1.33301 7.9987 1.33301C11.6806 1.33301 14.6654 4.31778 14.6654 7.99967Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_15320_82488\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of zone.toZoneData\">\r\n <td>{{ row.toZone | titlecase}}</td>\r\n <td>{{ row.footfall ?? '--' }} ({{ row.engagerPercent }}%)</td>\r\n <td>{{ row.nob ?? '--' }} ({{ row.nobPercent }}%)</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </ng-conatiner>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n</div>", styles: [".zone-card{border:1px solid #e6f0ff;border-radius:10px;margin-bottom:12px;background:#fff}.zone-header{display:flex;justify-content:space-between;align-items:center;padding:12px 30px 12px 12px;cursor:pointer;background:#f6fcff;border-radius:10px}.zone-default{border-width:1px;display:flex;justify-content:space-between;align-items:center;opacity:1;border-radius:8px;padding:12px 30px 12px 12px;border:1px solid #D0D5DD;background:#fff}.zone-title{font-weight:600;font-size:16px;line-height:24px;letter-spacing:0%;vertical-align:middle;color:#33b5ff}.zone-metrics{display:flex;align-items:center;gap:8px}.pill{padding:4px 10px;border-radius:16px;font-size:12px}.arrow{transition:transform .3s ease}.arrow.rotate{transform:rotate(180deg)}.zone-body{padding:10px 12px}.table-head,.table-row{display:grid;grid-template-columns:1fr 1fr 1fr;padding:6px 0}.table-head{font-weight:600;font-size:12px;opacity:1;padding:11px 16px;border-bottom-width:1px;background-color:#fcfcfd;color:#667085;border-bottom:1px solid #EAECF0;display:flex;justify-content:space-between}.table-row{opacity:1;padding:11px 16px;border-bottom-width:1px;display:flex;justify-content:space-between;font-size:13px;border-bottom:1px solid #EAECF0}.zone-floating{position:sticky;width:330px;height:75px;top:0;z-index:9999;cursor:move}.ellipse1{border-radius:6px;border-bottom:2px solid var(--Gray-200, #EAECF0);background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.bordered-box{border:1px solid #EAECF0;border-radius:8px}.path-wrapper{opacity:1;padding:8px 16px;gap:16px;border-bottom-width:2px;border-radius:6px}.title{font-weight:600;margin-bottom:12px}.path-card{position:relative;border-radius:12px;background:linear-gradient(135deg,#eef7ff,#e1f3ff);padding:20px}.badge{background:#e0f2ff;color:#0b6ef6;padding:6px 12px;border-radius:20px;font-size:13px}.percent{font-size:20px;font-weight:600;margin-left:12px}.path-text{margin-top:12px;font-size:16px;display:flex;flex-wrap:wrap;gap:8px}.step{font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;color:#344054}.arrowpath{color:#98a2b3}.dots{display:flex;gap:6px;margin-top:12px}.dots span{width:8px;height:8px;background:#d0d5dd;border-radius:50%;cursor:pointer}.dots span.active{background:#344054}.my-card{position:relative}.text-perc{color:#101828;font-weight:400;font-size:20px;line-height:30px}.text-val{font-weight:600;font-size:20px;color:#101828;line-height:30px}.text-title{font-weight:500;font-size:14px;line-height:20px;color:#1d2939}.zone-dropdown{position:relative}.dropdown-panel{position:absolute;background:#fff;border-radius:8px;padding:10px;width:100%;box-shadow:0 6px 20px #0000001a;z-index:1000}input[type=checkbox]{width:16px!important;height:16px!important;margin:-2px 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}.dropdown-panel{width:260px;background:#fff;border-radius:8px;box-shadow:0 6px 20px #0000001f}.dropdown-body{max-height:220px}.zone-item{display:flex;align-items:center;gap:8px;padding:6px 0}input[type=checkbox]{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}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}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.am-tooltip{font-size:12px}.am-tooltip-header{font-weight:600;margin-bottom:6px}.am-tooltip-table{width:100%;border-collapse:collapse}.am-tooltip-table .value{text-align:right;font-weight:600}\n"] }]
|
|
474
|
+
}], ctorParameters: () => [{ type: i1.ZoneService }, { type: i2.Zonev2Service }, { type: i0.ChangeDetectorRef }, { type: i3.Router }, { type: i4.ToastService }], propDecorators: { headerData: [{
|
|
475
|
+
type: Input
|
|
476
|
+
}], clientData: [{
|
|
477
|
+
type: Input
|
|
478
|
+
}], zoneDropdown: [{
|
|
479
|
+
type: ViewChild,
|
|
480
|
+
args: ['zoneDropdown']
|
|
481
|
+
}], onDocumentClick: [{
|
|
482
|
+
type: HostListener,
|
|
483
|
+
args: ['document:click', ['$event']]
|
|
484
|
+
}] } });
|
|
485
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9uZS1qb3VybmV5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2Utem9uZS9zcmMvbGliL2NvbXBvbmVudHMvem9uZS1qb3VybmV5L3pvbmUtam91cm5leS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXpvbmUvc3JjL2xpYi9jb21wb25lbnRzL3pvbmUtam91cm5leS96b25lLWpvdXJuZXkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBNEIsS0FBSyxFQUFvRCxTQUFTLEVBQWMsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pLLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFRLGtCQUFrQixNQUFNLHFDQUFxQyxDQUFDO0FBSXRFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7QUFPMUMsTUFBTSxPQUFPLG9CQUFvQjtJQUtSO0lBQTRCO0lBQW9DO0lBQTZCO0lBQXNCO0lBSmpJLElBQUksQ0FBWTtJQUNkLFVBQVUsQ0FBTTtJQUNmLFVBQVUsQ0FBTTtJQUNmLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBQ3pDLFlBQW9CLE9BQW1CLEVBQVMsYUFBMkIsRUFBUyxFQUFvQixFQUFTLE1BQWEsRUFBUyxFQUFlO1FBQWxJLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBUyxrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUFTLE9BQUUsR0FBRixFQUFFLENBQWtCO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBTztRQUFTLE9BQUUsR0FBRixFQUFFLENBQWE7SUFBSSxDQUFDO0lBQ2hLLFdBQVcsQ0FB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LENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsTUFBTSxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3JELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0RCxDQUFDLENBQUM7SUFFRixRQUFRLEdBQUcsR0FBRyxFQUFFO1FBQ2QsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkQsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekQsQ0FBQyxDQUFDO0lBRUEsU0FBUztRQUNQLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7d0dBOWdCVSxvQkFBb0I7NEZBQXBCLG9CQUFvQixpVUNkakMsNnMwQkFtV007OzRGRHJWTyxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0Usa0JBQWtCOzRMQU1qQixVQUFVO3NCQUFsQixLQUFLO2dCQUNJLFVBQVU7c0JBQWxCLEtBQUs7Z0JBMEdnQixZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBZ0J6QixlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uSW5pdCAsSW5wdXQsIE9uQ2hhbmdlcyxPbkRlc3Ryb3ksU2ltcGxlQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBhbTUgZnJvbSAnQGFtY2hhcnRzL2FtY2hhcnRzNSc7XHJcbmltcG9ydCAqIGFzIGFtNWZsb3cgZnJvbSAnQGFtY2hhcnRzL2FtY2hhcnRzNS9mbG93JztcclxuaW1wb3J0ICBhbTV0aGVtZXNfQW5pbWF0ZWQgZnJvbSAnQGFtY2hhcnRzL2FtY2hhcnRzNS90aGVtZXMvQW5pbWF0ZWQnO1xyXG5pbXBvcnQgeyBab25lU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3pvbmUuc2VydmljZSc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHsgWm9uZXYyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3pvbmV2Mi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi16b25lLWpvdXJuZXknLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi96b25lLWpvdXJuZXkuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi96b25lLWpvdXJuZXkuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBab25lSm91cm5leUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSxPbkNoYW5nZXMge1xyXG4gICBwcml2YXRlIHJvb3QhOiBhbTUuUm9vdDtcclxuICAgIEBJbnB1dCgpIGhlYWRlckRhdGEgOmFueTtcclxuICAgICBASW5wdXQoKSBjbGllbnREYXRhIDphbnk7XHJcbiAgICAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNlcnZpY2U6Wm9uZVNlcnZpY2UscHJpdmF0ZSB6b25lVjJTZXJ2aWNlOlpvbmV2MlNlcnZpY2UscHJpdmF0ZSBjZDpDaGFuZ2VEZXRlY3RvclJlZixwcml2YXRlIHJvdXRlcjpSb3V0ZXIscHJpdmF0ZSB0czpUb2FzdFNlcnZpY2UpIHsgfVxyXG5uZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgaWYgKGNoYW5nZXNbJ2hlYWRlckRhdGEnXT8uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgdGhpcy5oZWFkZXJEYXRhID0gY2hhbmdlc1snaGVhZGVyRGF0YSddLmN1cnJlbnRWYWx1ZTtcclxuICB9XHJcbiAgaWYgKGNoYW5nZXNbJ2NsaWVudERhdGEnXT8uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuY2xpZW50RGF0YSA9IGNoYW5nZXNbJ2NsaWVudERhdGEnXS5jdXJyZW50VmFsdWU7XHJcbiAgfVxyXG4gIHRoaXMuZ2V0QXZhaWxhYmxlWm9uZXMoKTtcclxuICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxufVxyXG5cclxuXHJcbnpvbmVTaG9wcGVyQW5hbHlzaXM6YW55O1xyXG5idWJibGVDaGFydERhdGE6YW55O1xyXG5vYmplY3Q6YW55O1xyXG5vYmplY3QxOmFueTtcclxuem9uZVNlYXJjaFRleHQ6c3RyaW5nPScnO1xyXG5cclxuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XHJcbnNlYXJjaFRleHQgPSAnJztcclxuem9uZUxpc3Q6YW55PVtdO1xyXG5maWx0ZXJlZFpvbmVzOmFueT1bXTtcclxuXHJcblxyXG56b25lc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbnRlbXBab25lTGlzdDogYW55W10gPSBbXTtcclxudGVtcEZpbHRlcmVkWm9uZXM6IGFueVtdID0gW107XHJcbmRyb3Bkb3duU2VhcmNoVGV4dCA9ICcnO1xyXG5hdmFpbGFibGVab25lczphbnlbXSA9IFtdO1xyXG4gIGdldEF2YWlsYWJsZVpvbmVzKCl7XHJcbiAgICBjb25zdCByZXF1ZXN0RGF0YSA9IHtcclxuICAgICAgZnJvbURhdGU6IHRoaXMuaGVhZGVyRGF0YS5kYXRlLnN0YXJ0RGF0ZSwgXHJcbiAgICAgIHRvRGF0ZTogdGhpcy5oZWFkZXJEYXRhLmRhdGUuZW5kRGF0ZSxcclxuICAgICAgc3RvcmVJZDogdGhpcy5oZWFkZXJEYXRhLnN0b3Jlcy5maWx0ZXIoKHN0b3JlOiBhbnkpID0+IHN0b3JlLmNoZWNrZWQpLm1hcCgoc3RvcmU6IGFueSkgPT4gc3RvcmUuc3RvcmVJZCksXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGEuY2xpZW50LFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnpvbmVWMlNlcnZpY2UuZ2V0QXZhaWxhYmxlWm9uZU5hbWVzKHJlcXVlc3REYXRhKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlWm9uZXMgPSAocmVzLmRhdGEuYXZhaWxhYmxlWm9uZURhdGEgfHwgW10pLmZpbHRlcihcclxuICAoem9uZTogYW55KSA9PiB6b25lLnpvbmVOYW1lPy50b0xvd2VyQ2FzZSgpICE9PSAnb3ZlcmFsbCBzdG9yZSdcclxuKTtcclxuICAgdGhpcy56b25lTGlzdCA9IHRoaXMuYXZhaWxhYmxlWm9uZXMubWFwKHogPT4gKHtcclxuICAgICAgICAgIG5hbWU6IHouem9uZU5hbWUsXHJcbiAgICAgICAgICBjaGVja2VkOiB0cnVlXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMuem9uZXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5nZXRab25lSm91cm5leShbXSk7XHJcbiAgICAgICAgdGhpcy5nZXRCdWJibGUoW10pO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5hdmFpbGFibGVab25lcyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnpvbmVDaGFydE5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnpvbmVDaGFydExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuem9uZUNhcmROb0RhdGEgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy56b25lQ2FyZExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZVpvbmVzID0gW107XHJcbiAgICAgICAgICB0aGlzLnpvbmVDaGFydE5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnpvbmVDaGFydExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuem9uZUNhcmROb0RhdGEgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy56b25lQ2FyZExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4vLyBnZXRBdmFpbGFibGVab25lcygpIHtcclxuLy8gICB0aGlzLnpvbmVWMlNlcnZpY2Uuem9uZXMkXHJcbi8vICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbi8vICAgICAuc3Vic2NyaWJlKCh6b25lcykgPT4ge1xyXG4gICAgICAgXHJcbi8vICAgICAgIHRoaXMuYXZhaWxhYmxlWm9uZXMgPSB6b25lcztcclxuXHJcbi8vICAgICAgIGlmICghdGhpcy56b25lc0luaXRpYWxpemVkKSB7XHJcbi8vICAgICAgICAgdGhpcy56b25lTGlzdCA9IHpvbmVzLm1hcCh6ID0+ICh7XHJcbi8vICAgICAgICAgICBuYW1lOiB6LnpvbmVOYW1lLFxyXG4vLyAgICAgICAgICAgY2hlY2tlZDogdHJ1ZVxyXG4vLyAgICAgICAgIH0pKTtcclxuXHJcbi8vICAgICAgICAgdGhpcy56b25lc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuLy8gICAgICAgICBpZih0aGlzLnpvbmVMaXN0Lmxlbmd0aCl7XHJcbi8vICAgICAgICAgICAgY29uc29sZS5sb2coJ2F2YWlsYWJsZSB6b25lcyBpbiB6b25lIGpvdXJuZXknLCAgICAgICAgdGhpcy56b25lTGlzdCk7ICAgXHJcbi8vICAgICAgICAgICB0aGlzLmdldFpvbmVKb3VybmV5KFtdKTtcclxuLy8gICAgICAgICAgIHRoaXMuZ2V0QnViYmxlKFtdKTtcclxuLy8gICAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2F2YWlsYWJsZSB6b25lcyBpbiB6b25lIGpvdXJuZXknLCAgICAgICAgdGhpcy56b25lTGlzdCk7XHJcbi8vICAgICAgICAgICB0aGlzLnpvbmVDaGFydE5vRGF0YSA9IHRydWU7XHJcbi8vICAgICAgICAgICB0aGlzLnpvbmVDaGFydExvYWRpbmcgPSBmYWxzZTtcclxuLy8gICAgICAgICAgIHRoaXMuem9uZUNhcmROb0RhdGEgPSB0cnVlO1xyXG4vLyAgICAgICAgICAgdGhpcy56b25lQ2FyZExvYWRpbmcgPSBmYWxzZTtcclxuLy8gICAgICAgICAgIHRoaXMuZ2V0Wm9uZUpvdXJuZXkoW10pO1xyXG4vLyAgICAgICAgICAgdGhpcy5nZXRCdWJibGUoW10pO1xyXG4vLyAgICAgICAgIH1cclxuICAgICAgICBcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfSk7XHJcbi8vIH1cclxuXHJcbkBWaWV3Q2hpbGQoJ3pvbmVEcm9wZG93bicpIHpvbmVEcm9wZG93biE6IEVsZW1lbnRSZWY7XHJcblxyXG5cclxuLyogT1BFTiAvIFRPR0dMRSAqL1xyXG50b2dnbGVEcm9wZG93bihldmVudDogTW91c2VFdmVudCkge1xyXG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBcclxuICB0aGlzLnNob3dEcm9wZG93biA9ICF0aGlzLnNob3dEcm9wZG93bjtcclxuXHJcbiAgaWYgKHRoaXMuc2hvd0Ryb3Bkb3duKSB7XHJcbiAgICB0aGlzLnRlbXBab25lTGlzdCA9IHRoaXMuem9uZUxpc3QubWFwKCh6OmFueSkgPT4gKHsgLi4ueiB9KSk7XHJcbiAgICB0aGlzLnRlbXBGaWx0ZXJlZFpvbmVzID0gWy4uLnRoaXMudGVtcFpvbmVMaXN0XTtcclxuICB9XHJcbn1cclxuXHJcbi8qIPCflKUgT1VUU0lERSBDTElDSyBIQU5ETEVSICovXHJcbkBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxub25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgaWYgKCF0aGlzLnNob3dEcm9wZG93bikgcmV0dXJuO1xyXG5cclxuICBjb25zdCBjbGlja2VkSW5zaWRlID1cclxuICAgIHRoaXMuem9uZURyb3Bkb3duPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7XHJcblxyXG4gIGlmICghY2xpY2tlZEluc2lkZSkge1xyXG4gICAgdGhpcy5zaG93RHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcbn1cclxudG9nZ2xlU2VsZWN0QWxsKGV2ZW50OiBhbnkpIHtcclxuICBjb25zdCBjaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XHJcblxyXG4gIC8vIEFwcGx5IHRvIGZ1bGwgdGVtcCBsaXN0XHJcbiAgdGhpcy50ZW1wWm9uZUxpc3QgPSB0aGlzLnRlbXBab25lTGlzdC5tYXAoeiA9PiAoe1xyXG4gICAgLi4ueixcclxuICAgIGNoZWNrZWRcclxuICB9KSk7XHJcblxyXG4gIC8vIFJlLWFwcGx5IHNlYXJjaCBmaWx0ZXIgc28gVUkgdXBkYXRlcyBjb3JyZWN0bHlcclxuICB0aGlzLmZpbHRlclpvbmVzKCk7XHJcbn1cclxuaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICByZXR1cm4gKFxyXG4gICAgdGhpcy50ZW1wWm9uZUxpc3QubGVuZ3RoID4gMCAmJlxyXG4gICAgdGhpcy50ZW1wWm9uZUxpc3QuZXZlcnkoeiA9PiB6LmNoZWNrZWQpXHJcbiAgKTtcclxufVxyXG5cclxuZmlsdGVyWm9uZXMoKSB7XHJcbiAgY29uc3QgdGV4dCA9IHRoaXMuZHJvcGRvd25TZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCk7XHJcbiAgdGhpcy50ZW1wRmlsdGVyZWRab25lcyA9IHRoaXMudGVtcFpvbmVMaXN0LmZpbHRlcih6ID0+XHJcbiAgICB6Lm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KVxyXG4gICk7XHJcbn1cclxuXHJcbmFwcGx5Wm9uZXMoKSB7XHJcbiAgdGhpcy56b25lTGlzdCA9IHRoaXMudGVtcFpvbmVMaXN0Lm1hcCh6ID0+ICh7IC4uLnogfSkpO1xyXG5cclxuICBjb25zdCBoaWRkZW5ab25lcyA9IHRoaXMuem9uZUxpc3RcclxuICAgIC5maWx0ZXIoKHo6IGFueSkgPT4gIXouY2hlY2tlZClcclxuICAgIC5tYXAoKHo6IGFueSkgPT4gei5uYW1lKTtcclxuXHJcbiAgdGhpcy5nZXRab25lSm91cm5leShoaWRkZW5ab25lcyk7XHJcbiAgdGhpcy5nZXRCdWJibGUoaGlkZGVuWm9uZXMpO1xyXG4gIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIHRoaXMuZHJvcGRvd25TZWFyY2hUZXh0ID0gJyc7XHJcbiAgdGhpcy5zaG93RHJvcGRvd24gPSBmYWxzZTtcclxufVxyXG5cclxucmVzZXRab25lcygpIHtcclxuICAvLyBSZXNldCBhcHBsaWVkIHN0YXRlXHJcbiAgdGhpcy56b25lTGlzdCA9IHRoaXMuem9uZUxpc3QubWFwKCh6OmFueSkgPT4gKHtcclxuICAgIC4uLnosXHJcbiAgICBjaGVja2VkOiB0cnVlXHJcbiAgfSkpO1xyXG5cclxuICAvLyBTeW5jIHRlbXAgc3RhdGVcclxuICB0aGlzLnRlbXBab25lTGlzdCA9IHRoaXMuem9uZUxpc3QubWFwKCh6OmFueSkgPT4gKHsgLi4ueiB9KSk7XHJcbiAgdGhpcy50ZW1wRmlsdGVyZWRab25lcyA9IFsuLi50aGlzLnRlbXBab25lTGlzdF07XHJcblxyXG4gIHRoaXMuZHJvcGRvd25TZWFyY2hUZXh0ID0gJyc7XHJcblxyXG4gIC8vIEFwcGx5IGltbWVkaWF0ZWx5XHJcbiAgdGhpcy5nZXRab25lSm91cm5leShbXSk7XHJcbiAgdGhpcy5nZXRCdWJibGUoW10pO1xyXG5cclxuICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xyXG59XHJcbmdldFpvbmVKb3VybmV5RXhwb3J0KCkge1xyXG4gIHRoaXMub2JqZWN0MSA9IHtcclxuICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGE/LmNsaWVudCxcclxuICAgIHN0b3JlSWQ6IHRoaXMuaGVhZGVyRGF0YT8uc3RvcmVzXHJcbiAgICAgIC5maWx0ZXIoKHN0b3JlOiBhbnkpID0+IHN0b3JlLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoKHN0b3JlOiBhbnkpID0+IHN0b3JlLnN0b3JlSWQpLFxyXG4gICAgZnJvbURhdGU6IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlLFxyXG4gICAgdG9EYXRlOiB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUsXHJcbiAgICBub2I6IHRoaXMuY2xpZW50RGF0YT8uaXNOT0IsXHJcbiAgICBoaWRlWm9uZXM6IHRoaXMuem9uZUxpc3QuZmlsdGVyKCh6OiBhbnkpID0+ICF6LmNoZWNrZWQpLm1hcCgoejogYW55KSA9PiB6Lm5hbWUpLFxyXG4gICAgc2VhcmNoOiB0aGlzLnNlYXJjaFpvbmVUZXh0IHx8ICcnLFxyXG4gICAgZXhwb3J0IDogdHJ1ZVxyXG4gIH07XHJcblxyXG4gIHRoaXMuc2VydmljZS5nZXROZXdab25lU2hvcHBlckFuYWx5c2lzRXhwb3J0QXBpKHRoaXMub2JqZWN0MSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgICBpZih0aGlzLmhlYWRlckRhdGEuZGF0ZS5zdGFydERhdGUgPT0gdGhpcy5oZWFkZXJEYXRhLmRhdGUuZW5kRGF0ZSl7XHJcbiAgICAgIGxldCBmaWxlTmFtZSA9ICdTaG9wcGVyIEpvdXJuZXlfRXhwb3J0XycrdGhpcy5oZWFkZXJEYXRhLmRhdGUuc3RhcnREYXRlO1xyXG4gICAgICB0aGlzLnNlcnZpY2Uuc2F2ZUFzRXhjZWxGaWxlMShyZXMsIGZpbGVOYW1lKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGZpbGVOYW1lID0gJ1Nob3BwZXIgSm91cm5leV9FeHBvcnRfJyt0aGlzLmhlYWRlckRhdGEuZGF0ZS5zdGFydERhdGUrJ18nK3RoaXMuaGVhZGVyRGF0YS5kYXRlLmVuZERhdGU7XHJcbiAgICAgIHRoaXMuc2VydmljZS5zYXZlQXNFeGNlbEZpbGUxKHJlcywgZmlsZU5hbWUpO1xyXG4gICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKChlOmFueSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGVycm9yTXNnID0gJ1NvbWV0aGluZyB3ZW50IFdyb25nLi4nO1xyXG4gICAgICAgICAgaWYgKGUgJiYgZS5lcnJvciAmJiBlLmVycm9yLmVycm9yKSB7XHJcbiAgICAgICAgICAgIGVycm9yTXNnID0gZS5lcnJvci5lcnJvcjtcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyb3JNc2cpXHJcbiAgICAgICAgfSlcclxuICB9KTtcclxufVxyXG56b25lQ2FyZE5vRGF0YSA9IGZhbHNlO1xyXG4gICAgICAgIHpvbmVDYXJkTG9hZGluZyA9IHRydWU7XHJcbmdldFpvbmVKb3VybmV5KGhpZGRlblpvbmVzOiBhbnlbXSA9IFtdKSB7XHJcbiAgdGhpcy56b25lQ2FyZExvYWRpbmcgPSB0cnVlO1xyXG4gIHRoaXMuem9uZUNhcmROb0RhdGEgPSBmYWxzZTtcclxuICB0aGlzLm9iamVjdDEgPSB7XHJcbiAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICBzdG9yZUlkOiB0aGlzLmhlYWRlckRhdGE/LnN0b3Jlc1xyXG4gICAgICAuZmlsdGVyKChzdG9yZTogYW55KSA9PiBzdG9yZS5jaGVja2VkKVxyXG4gICAgICAubWFwKChzdG9yZTogYW55KSA9PiBzdG9yZS5zdG9yZUlkKSxcclxuICAgIGZyb21EYXRlOiB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSxcclxuICAgIHRvRGF0ZTogdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlLFxyXG4gICAgbm9iOiB0aGlzLmNsaWVudERhdGE/LmlzTk9CLFxyXG4gICAgaGlkZVpvbmVzOiBoaWRkZW5ab25lcywgLy8g4pyFIGFsd2F5cyBjb3JyZWN0XHJcbiAgICBzZWFyY2g6IHRoaXMuc2VhcmNoWm9uZVRleHQgfHwgJycsXHJcbiAgICBleHBvcnQgOiBmYWxzZVxyXG4gIH07XHJcblxyXG4gIHRoaXMuc2VydmljZS5nZXROZXdab25lU2hvcHBlckFuYWx5c2lzQXBpKHRoaXMub2JqZWN0MSkuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICB0aGlzLnpvbmVTaG9wcGVyQW5hbHlzaXMgPSByZXMuZGF0YTtcclxuICAgICAgICB0aGlzLnpvbmVzID0gdGhpcy56b25lU2hvcHBlckFuYWx5c2lzPy56b25lU2hvcHBlckFuYWx5c2lzIHx8IFtdO1xyXG4gICAgICAgIHRoaXMuem9uZUNhcmROb0RhdGEgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnpvbmVDYXJkTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuem9uZVNob3BwZXJBbmFseXNpcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy56b25lQ2FyZE5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy56b25lQ2FyZExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgIHRoaXMuem9uZVNob3BwZXJBbmFseXNpcyA9IG51bGw7XHJcbiAgICAgIHRoaXMuem9uZUNhcmROb0RhdGEgPSB0cnVlO1xyXG4gICAgICB0aGlzLnpvbmVDYXJkTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG56b25lQ2hhcnROb0RhdGEgPSBmYWxzZTtcclxuICAgICAgICB6b25lQ2hhcnRMb2FkaW5nID0gdHJ1ZTtcclxuZ2V0QnViYmxlKGhpZGRlblpvbmVzOiBhbnlbXSA9IFtdKSB7XHJcbiAgIHRoaXMuem9uZUNoYXJ0TG9hZGluZyA9IHRydWU7XHJcbiAgIHRoaXMuem9uZUNoYXJ0Tm9EYXRhID0gZmFsc2U7XHJcbiAgdGhpcy5vYmplY3QgPSB7XHJcbiAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICBzdG9yZUlkOiB0aGlzLmhlYWRlckRhdGE/LnN0b3Jlcy5maWx0ZXIoKHN0b3JlOiBhbnkpID0+IHN0b3JlLmNoZWNrZWQpLm1hcCgoc3RvcmU6IGFueSkgPT4gc3RvcmUuc3RvcmVJZCksXHJcbiAgICAgZnJvbURhdGU6IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlLFxyXG4gICAgICB0b0RhdGU6IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSxcclxuICAgIG5vYjogdGhpcy5jbGllbnREYXRhPy5pc05PQixcclxuICAgIGhpZGVab25lczogaGlkZGVuWm9uZXMsXHJcblxyXG4gIH07XHJcbnRoaXMuc2VydmljZS5nZXROZXdab25lU2hvcHBlckJ1YmJsZUNoYXJ0QXBpKHRoaXMub2JqZWN0KS5zdWJzY3JpYmUoe1xyXG4gICAgbmV4dDogKHJlczphbnkpPT57XHJcbiAgICAgIGlmKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKXtcclxuICAgICAgICB0aGlzLmJ1YmJsZUNoYXJ0RGF0YSA9IHJlcy5kYXRhO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhcnQoKTtcclxuICAgICAgICB0aGlzLnpvbmVDaGFydE5vRGF0YSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuem9uZUNoYXJ0TG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYnViYmxlQ2hhcnREYXRhID0gbnVsbDtcclxuICAgICAgICAgdGhpcy56b25lQ2hhcnROb0RhdGEgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuem9uZUNoYXJ0TG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6IChlcnI6YW55KT0+e1xyXG4gICAgICB0aGlzLmJ1YmJsZUNoYXJ0RGF0YSA9IG51bGw7XHJcbiAgICAgIHRoaXMuem9uZUNoYXJ0Tm9EYXRhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnpvbmVDaGFydExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgLy8gY29uc29sZS5sb2coJ3pvbmUgam91cm5leSBidWJibGUgY2hhcnQgZXJyb3InLGVycik7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgXHJcbn1cclxuXHJcbmNyZWF0ZUNoYXJ0KCkge1xyXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgLy8gRGlzcG9zZSBvbGQgY2hhcnRcclxuICAgIGlmICh0aGlzLnJvb3QpIHtcclxuICAgICAgdGhpcy5yb290LmRpc3Bvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSb290XHJcbiAgICB0aGlzLnJvb3QgPSBhbTUuUm9vdC5uZXcoJ2NoYXJ0ZGl2Jyk7XHJcbiAgICB0aGlzLnJvb3Quc2V0VGhlbWVzKFthbTV0aGVtZXNfQW5pbWF0ZWQubmV3KHRoaXMucm9vdCldKTtcclxuXHJcbiAgICAvLyBBcmMgRGlhZ3JhbSBTZXJpZXNcclxuICAgIGNvbnN0IHNlcmllcyA9IHRoaXMucm9vdC5jb250YWluZXIuY2hpbGRyZW4ucHVzaChcclxuICAgICAgYW01Zmxvdy5BcmNEaWFncmFtLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgICBzb3VyY2VJZEZpZWxkOiAnZnJvbScsXHJcbiAgICAgICAgdGFyZ2V0SWRGaWVsZDogJ3RvJyxcclxuICAgICAgICB2YWx1ZUZpZWxkOiAndmFsdWUnLFxyXG4gICAgICAgIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCdcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIFRPT0xUSVAgKEhUTUwpXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgY29uc3QgdG9vbHRpcCA9IGFtNS5Ub29sdGlwLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgZ2V0RmlsbEZyb21TcHJpdGU6IGZhbHNlLFxyXG4gICAgICBnZXRTdHJva2VGcm9tU3ByaXRlOiBmYWxzZSxcclxuICAgICAgYXV0b1RleHRDb2xvcjogZmFsc2UsXHJcbiAgICAgIGtlZXBUYXJnZXRIb3ZlcjogdHJ1ZSxcclxuICAgICAgcG9pbnRlck9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCdcclxuICAgIH0pO1xyXG5cclxuICAgIHRvb2x0aXAuZ2V0KCdiYWNrZ3JvdW5kJyk/LnNldEFsbCh7XHJcbiAgICAgIGZpbGw6IGFtNS5jb2xvcigweGZmZmZmZiksXHJcbiAgICAgIHN0cm9rZTogYW01LmNvbG9yKDB4ZTVlN2ViKSxcclxuICAgICAgc2hhZG93Q29sb3I6IGFtNS5jb2xvcigweGY3ZjdmNyksXHJcbiAgICAgIHNoYWRvd0JsdXI6IDEwLFxyXG4gICAgICBzaGFkb3dPZmZzZXRZOiA0XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBBdHRhY2ggdG9vbHRpcCB0byBsaW5rc1xyXG4gICAgc2VyaWVzLmxpbmtzLnRlbXBsYXRlLnNldCgndG9vbHRpcCcsIHRvb2x0aXApO1xyXG4gICAgc2VyaWVzLmxpbmtzLnRlbXBsYXRlLnNldCgndG9vbHRpcEhUTUwnLCAnJyk7XHJcbnNlcmllcy5saW5rcy50ZW1wbGF0ZS5zZXRBbGwoe1xyXG4gIHN0cm9rZVdpZHRoOiAyLCAvLyB2aXNpYmxlIGxpbmVcclxuICBpbnRlcmFjdGl2ZTogdHJ1ZSxcclxuICB0b29sdGlwOiB0b29sdGlwXHJcbn0pO1xyXG5cclxuLy8gQWRkIGEgbGFyZ2VyIGludmlzaWJsZSBoaXQgYXJlYVxyXG5zZXJpZXMubGlua3MudGVtcGxhdGUuc3RhdGVzLmNyZWF0ZShcImhvdmVyXCIsIHtcclxuICBzdHJva2VXaWR0aDogM1xyXG59KTtcclxuXHJcbiAgICAvLyBBZGFwdGVyIGZvciBIVE1MIGNvbnRlbnRcclxuICAgIHNlcmllcy5saW5rcy50ZW1wbGF0ZS5hZGFwdGVycy5hZGQoJ3Rvb2x0aXBIVE1MJywgKF9odG1sLCB0YXJnZXQpID0+IHtcclxuICAgICAgY29uc3QgZGF0YUl0ZW0gPSB0YXJnZXQuZGF0YUl0ZW07XHJcbiAgICAgIGlmICghZGF0YUl0ZW0pIHJldHVybiAnJztcclxuXHJcbiAgICAgIGNvbnN0IGRjOiBhbnkgPSBkYXRhSXRlbS5kYXRhQ29udGV4dDtcclxuXHJcbiAgICAgIHJldHVybiBgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFtLXRvb2x0aXBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbS10b29sdGlwLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAke2RjLmZyb219IOKGkiAke2RjLnRvfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8dGFibGUgY2xhc3M9XCJhbS10b29sdGlwLXRhYmxlXCI+XHJcbiAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICA8dGQ+Rm9vdGZhbGw8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInZhbHVlXCI+JHtkYy52YWx1ZSA/PyAnLS0nfTwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICA8dGQ+Tm9CPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ2YWx1ZVwiPiR7ZGMuTm9CID8/ICctLSd9PC90ZD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIGA7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gTk9ERSBMQUJFTFNcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBzZXJpZXMubm9kZXMubGFiZWxzLnRlbXBsYXRlLnNldEFsbCh7XHJcbiAgICAgIHRleHQ6ICd7aWR9XFxue3RvdGFsfScsXHJcbiAgICAgIGNlbnRlclg6IGFtNS5wZXJjZW50KDUwKSxcclxuICAgICAgY2VudGVyWTogYW01LnBlcmNlbnQoNTApLFxyXG4gICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxyXG4gICAgICBmb250U2l6ZTogMTEsXHJcbiAgICAgIGZpbGw6IGFtNS5jb2xvcigweDAwMDAwMCksXHJcbiAgICAgIG1heFdpZHRoOiA5MFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEZMT1cgQlVMTEVUU1xyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIHNlcmllcy5idWxsZXRzLnB1c2goKF9yb290LCBfc2VyaWVzLCBkYXRhSXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCBidWxsZXQgPSBhbTUuQnVsbGV0Lm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgICBsb2NhdGlvblk6IE1hdGgucmFuZG9tKCksXHJcbiAgICAgICAgc3ByaXRlOiBhbTUuQ2lyY2xlLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgICAgIHJhZGl1czogMixcclxuICAgICAgICAgIGZpbGw6IGRhdGFJdGVtLmdldCgnc291cmNlJykuZ2V0KCdmaWxsJylcclxuICAgICAgICB9KVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGJ1bGxldC5hbmltYXRlKHtcclxuICAgICAgICBrZXk6ICdsb2NhdGlvblknLFxyXG4gICAgICAgIGZyb206IDAsXHJcbiAgICAgICAgdG86IDEsXHJcbiAgICAgICAgZHVyYXRpb246IE1hdGgucmFuZG9tKCkgKiAxMDAwICsgMjAwMFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiBidWxsZXQ7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gREFUQSArIE9SREVSSU5HXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgY29uc3Qgbm9kZU9yZGVyID0gKG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAobmFtZSA9PT0gJ0VudHJ5JykgcmV0dXJuIDA7XHJcbiAgICAgIGlmIChuYW1lID09PSAnRXhpdCcpIHJldHVybiA5OTk7XHJcbiAgICAgIHJldHVybiAxO1xyXG4gICAgfTtcclxuXHJcbiAgICBzZXJpZXMuZGF0YS5zZXRBbGwodGhpcy5idWJibGVDaGFydERhdGE/LnpvbmVCdWJibGVDaGFydE1ldHJpY3MpO1xyXG5cclxuICAgIEFycmF5LmZyb20oc2VyaWVzLm5vZGVzLmNoaWxkcmVuKS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIG5vZGVPcmRlcihhLmRhdGFJdGVtPy5kYXRhQ29udGV4dD8uaWQpIC1cclxuICAgICAgICBub2RlT3JkZXIoYi5kYXRhSXRlbT8uZGF0YUNvbnRleHQ/LmlkKVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgc2VyaWVzLmFwcGVhcigxMDAwLCAxMDApO1xyXG4gIH0sIDUwMCk7XHJcbn1cclxuXHJcblxyXG5cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5yb290KSB7XHJcbiAgICAgIHRoaXMucm9vdC5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICAvLyAgdGhpcy5zdG9wQXV0b1NsaWRlKCk7XHJcbiAgfVxyXG4gXHJcbiAgIHpvbmVzOmFueSA9IFtdO1xyXG5cclxuYWN0aXZlSW5kZXg6IG51bWJlciB8IG51bGwgPSAwO1xyXG5cclxudG9nZ2xlKGluZGV4OiBudW1iZXIpIHtcclxuICB0aGlzLmFjdGl2ZUluZGV4ID0gdGhpcy5hY3RpdmVJbmRleCA9PT0gaW5kZXggPyBudWxsIDogaW5kZXg7XHJcbn1cclxuc2VhcmNoTmV3T3BlbiA9ZmFsc2U7XHJcbnNlYXJjaE9wZW4oKXtcclxuICB0aGlzLnNlYXJjaE5ld09wZW4gPSAhdGhpcy5zZWFyY2hOZXdPcGVuO1xyXG5pZighdGhpcy5zZWFyY2hOZXdPcGVuKXtcclxuICB0aGlzLnNlYXJjaFpvbmVUZXh0ID0nJztcclxuICB0aGlzLmdldFpvbmVKb3VybmV5KFtdKTtcclxufVxyXG59XHJcblxyXG5zZWFyY2hab25lVGV4dDpzdHJpbmcgPScnO1xyXG5TZWFyY2hab25lcygpe1xyXG4gICB0aGlzLmdldFpvbmVKb3VybmV5KFtdKTtcclxufVxyXG5pc01pbmltaXplZCA9IGZhbHNlO1xyXG5cclxuLy8gZHJhZyBzdXBwb3J0XHJcbmRyYWdnaW5nID0gZmFsc2U7XHJcbm9mZnNldFggPSAwO1xyXG5vZmZzZXRZID0gMDtcclxuXHJcbmZsb2F0aW5nUG9zID0ge1xyXG4gIHRvcDogMTIwLFxyXG4gIGxlZnQ6IHdpbmRvdy5pbm5lcldpZHRoIC0gMzgwXHJcbn07XHJcblxyXG5leHBhbmRDbG9zZSgpIHtcclxuICB0aGlzLmlzTWluaW1pemVkID0gIXRoaXMuaXNNaW5pbWl6ZWQ7XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5zdGFydERyYWcoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICBpZiAoIXRoaXMuaXNNaW5pbWl6ZWQpIHJldHVybjtcclxuXHJcbiAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XHJcbiAgdGhpcy5vZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuZmxvYXRpbmdQb3MubGVmdDtcclxuICB0aGlzLm9mZnNldFkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5mbG9hdGluZ1Bvcy50b3A7XHJcblxyXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25EcmFnKTtcclxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5zdG9wRHJhZyk7XHJcbn1cclxuXHJcbm9uRHJhZyA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gIGlmICghdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xyXG5cclxuICB0aGlzLmZsb2F0aW5nUG9zLmxlZnQgPSBldmVudC5jbGllbnRYIC0gdGhpcy5vZmZzZXRYO1xyXG4gIHRoaXMuZmxvYXRpbmdQb3MudG9wID0gZXZlbnQuY2xpZW50WSAtIHRoaXMub2Zmc2V0WTtcclxufTtcclxuXHJcbnN0b3BEcmFnID0gKCkgPT4ge1xyXG4gIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcclxuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uRHJhZyk7XHJcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuc3RvcERyYWcpO1xyXG59O1xyXG5cclxuICBub2JVcGxvYWQoKXtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIi9tYW5hZ2UvdHJhZmZpYy9ub2JcIl0pOyBcclxuICB9XHJcbn1cclxuIiwiPCEtLSB6b25lLWpvdXJuZXkuY29tcG9uZW50Lmh0bWwgLS0+XHJcbjxkaXYgY2xhc3M9XCJjYXJkIG15LWNhcmQgbXgtMSBteS0yXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcHgtMCBteC01IGJvcmRlci0wIHB0LTNcIj5cclxuICAgICAgICA8aDMgY2xhc3M9XCJjYXJkLXRpdGxlIGFsaWduLWl0ZW1zLXN0YXJ0IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1sYWJlbCBtYi0xXCI+Wm9uZS1CYXNlZCBTaG9wcGVyIEFuYWx5c2lzIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXN1YiBtYi0xXCI+VW5kZXJzdGFuZCB5b3VyIFNob3BwZXJzIGpvdXJuZXkgZnJvbSBvbmUgem9uZSB0byBhbm90aGVyXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2gzPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvb2xiYXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgIHBvc2l0aW9uLXJlbGF0aXZlIG15LTFcIj5cclxuPGRpdiBjbGFzcz1cInpvbmUtZHJvcGRvd24gbWUtMlwiICAjem9uZURyb3Bkb3duXHJcbiAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG5cclxuICA8IS0tIEJVVFRPTiAtLT5cclxuICA8YnV0dG9uIFtkaXNhYmxlZF09XCIhem9uZVNob3BwZXJBbmFseXNpc1wiXHJcbiAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTEwMCBtZS0yIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXHJcbiAgICAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJGV2ZW50KVwiXHJcbiAgPlxyXG4gICAgU2hvdyAvIEhpZGUgWm9uZVxyXG4gICAgPHNwYW4+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjdcIiB2aWV3Qm94PVwiMCAwIDEyIDdcIiBmaWxsPVwibm9uZVwiPlxyXG48cGF0aCBkPVwiTTEgMUw2IDZMMTEgMVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG48L3N2Zz48L3NwYW4+XHJcbiAgPC9idXR0b24+XHJcblxyXG4gIDwhLS0gRFJPUERPV04gLS0+XHJcbiA8ZGl2ICpuZ0lmPVwic2hvd0Ryb3Bkb3duXCIgY2xhc3M9XCJkcm9wZG93bi1wYW5lbCBoLTMwMHB4IGQtZmxleCBmbGV4LWNvbHVtblwiPlxyXG5cclxuICA8IS0tIEhFQURFUiAoZml4ZWQpIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXIgcHgtMiBwYi0yXCI+XHJcbiAgICA8aW5wdXRcclxuICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFpvbmVcIlxyXG4gICAgICBbKG5nTW9kZWwpXT1cImRyb3Bkb3duU2VhcmNoVGV4dFwiXHJcbiAgICAgIChpbnB1dCk9XCJmaWx0ZXJab25lcygpXCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgbWItMiBweC0yXCI+XHJcbiAgICAgPHNwYW4gY2xhc3M9XCJteC0xXCI+PGlucHV0XHJcbiAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgIFtjaGVja2VkXT1cImlzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKCRldmVudClcIlxyXG4gICAgLz48L3NwYW4+XHJcbiAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIj5TZWxlY3QgQWxsPC9zcGFuPlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gQk9EWSAoc2Nyb2xsYWJsZSBsaXN0KSAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tYm9keSBmbGV4LWdyb3ctMSBvdmVyZmxvdy1hdXRvIHB4LTJcIj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJ6b25lLWl0ZW1cIlxyXG4gICAgICAqbmdGb3I9XCJsZXQgem9uZSBvZiB0ZW1wRmlsdGVyZWRab25lc1wiXHJcbiAgICA+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibXgtMVwiPjxpbnB1dFxyXG4gICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJ6b25lLmNoZWNrZWRcIlxyXG4gICAgICAvPjwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+e3sgem9uZS5uYW1lIH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gRk9PVEVSIChmaXhlZCkgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWZvb3RlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBnYXAtMiBwLTIgYm9yZGVyLXRvcFwiPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUgdy01MFwiIChjbGljayk9XCJyZXNldFpvbmVzKClcIj5cclxuICAgICAgUmVzZXRcclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnkgdy01MFwiIChjbGljayk9XCJhcHBseVpvbmVzKClcIj5cclxuICAgICAgQXBwbHlcclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJnZXRab25lSm91cm5leUV4cG9ydCgpXCIgW2Rpc2FibGVkXT1cIiF6b25lU2hvcHBlckFuYWx5c2lzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlciBtZS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRXhwb3J0IEljb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNMTQuMTY2NyA2LjY2NjY3TDEwIDIuNU0xMCAyLjVMNS44MzMzMyA2LjY2NjY3TTEwIDIuNVYxMi41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+PC9zcGFuPiBFeHBvcnRcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbXQtMyBteC0zXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlcmVkLWJveCB3LTUwIG1lLTIgcHktMVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHB0LTEgcHgtM1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRpdGxlIHB5LTJcIj48c3ZnIGNsYXNzPVwibXgtMlwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjFcIiB2aWV3Qm94PVwiMCAwIDE5IDIxXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMC41IDE2LjMyNThINlYxNy41NzU4QzYgMTguMzA1MSA1LjcxMDI3IDE5LjAwNDYgNS4xOTQ1NCAxOS41MjAzQzQuNjc4ODIgMjAuMDM2IDMuOTc5MzUgMjAuMzI1OCAzLjI1IDIwLjMyNThDMi41MjA2NSAyMC4zMjU4IDEuODIxMTggMjAuMDM2IDEuMzA1NDYgMTkuNTIwM0MwLjc4OTczMSAxOS4wMDQ2IDAuNSAxOC4zMDUxIDAuNSAxNy41NzU4VjE2LjMyNThaTTQuNSA0LjQ0NTc2QzYuNSA0LjQ0NTc2IDcuNSA3LjMyNTc2IDcuNSA5LjMyNTc2QzcuNSAxMC4zMjU4IDcgMTEuMzI1OCA2LjUgMTIuODI1OEw2IDE0LjMyNThIMC41QzAuNSAxMy4zMjU4IDAgMTEuODI1OCAwIDkuMzI1NzZDMCA2LjgyNTc2IDEuOTk4IDQuNDQ1NzYgNC41IDQuNDQ1NzZaTTE2LjU1NCAxMi40MjM4TDE2LjMzNyAxMy42NTQ4QzE2LjIwMjMgMTQuMzY1NCAxNS43OTMxIDE0Ljk5NDMgMTUuMTk4IDE1LjQwNTRDMTQuNjAyOSAxNS44MTY1IDEzLjg2OTggMTUuOTc2NSAxMy4xNTc2IDE1Ljg1MDlDMTIuNDQ1MyAxNS43MjU0IDExLjgxMTEgMTUuMzI0MiAxMS4zOTI1IDE0LjczNDRDMTAuOTczOSAxNC4xNDQ2IDEwLjgwNDUgMTMuNDEzNiAxMC45MjEgMTIuNjk5OEwxMS4xMzcgMTEuNDY5OEwxNi41NTQgMTIuNDIzOFpNMTQuNjc4IDAuMDMwNzYyNEMxNy4xNDIgMC40NjQ3NjIgMTguNjk2IDMuMTU1NzYgMTguMjYyIDUuNjE3NzZDMTcuODI4IDguMDc5NzYgMTcuMDc1IDkuNDY5NzYgMTYuOTAyIDEwLjQ1NDhMMTEuNDg1IDkuNDk5NzZMMTEuMjUzIDcuOTM1NzZDMTEuMDIxIDYuMzcxNzYgMTAuNzAzIDUuMjk5NzYgMTAuODc2IDQuMzE1NzZDMTEuMjIzIDIuMzQ1NzYgMTIuNzA4IC0wLjMxNjIzOCAxNC42NzggMC4wMzA3NjI0WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzFEMjkzOVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+T3ZlcmFsbCBGb290ZmFsbCA6PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+PHNwYW4gY2xhc3M9XCJ0ZXh0LXZhbFwiPnt7em9uZVNob3BwZXJBbmFseXNpcz8uT3ZlcmFsbEZvb3RmYWxsID8/ICctLSd9fTwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJ0ZXh0LXBlcmMgbXMtMVwiPih7e3pvbmVTaG9wcGVyQW5hbHlzaXM/LkNvbnZlcnNpb25QZXJjZW50ID8/ICctLSd9fSAlKTwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXJlZC1ib3ggdy01MCBweS0xXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gcHQtMSBweC0zXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRoaXMuY2xpZW50RGF0YT8uaXNOT0JcIiBjbGFzcz1cInRleHQtdGl0bGUgcHktMlwiPjxzdmcgY2xhc3M9XCJteC0yXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05IDExSDE1TTkgMTVIMTVNOSA3SDE1TTUgM0M1IDIuNzM0NzggNS4xMDUzNiAyLjQ4MDQzIDUuMjkyODkgMi4yOTI4OUM1LjQ4MDQzIDIuMTA1MzYgNS43MzQ3OCAyIDYgMkgxOEMxOC4yNjUyIDIgMTguNTE5NiAyLjEwNTM2IDE4LjcwNzEgMi4yOTI4OUMxOC44OTQ2IDIuNDgwNDMgMTkgMi43MzQ3OCAxOSAzVjIyTDE1LjUgMTkuNUwxMiAyMkw4LjUgMTkuNUw1IDIyVjNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMxRDI5MzlcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gTm9CIDo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhdGhpcy5jbGllbnREYXRhPy5pc05PQlwiIGNsYXNzPVwidGV4dC10aXRsZSBweS0yXCI+PHN2ZyBjbGFzcz1cIm14LTJcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkgMTFIMTVNOSAxNUgxNU05IDdIMTVNNSAzQzUgMi43MzQ3OCA1LjEwNTM2IDIuNDgwNDMgNS4yOTI4OSAyLjI5Mjg5QzUuNDgwNDMgMi4xMDUzNiA1LjczNDc4IDIgNiAySDE4QzE4LjI2NTIgMiAxOC41MTk2IDIuMTA1MzYgMTguNzA3MSAyLjI5Mjg5QzE4Ljg5NDYgMi40ODA0MyAxOSAyLjczNDc4IDE5IDNWMjJMMTUuNSAxOS41TDEyIDIyTDguNSAxOS41TDUgMjJWM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzFEMjkzOVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPiBDb252ZXJzaW9uIDo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdmFsXCI+e3t6b25lU2hvcHBlckFuYWx5c2lzPy5Ob2IgPz8gJy0tJ319IDxzcGFuICpuZ0lmPVwidGhpcy5jbGllbnREYXRhPy5pc05PQlwiIGNsYXNzPVwicHgtMCBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJub2JVcGxvYWQoKVwiPjxzdmcgIHBsYWNlbWVudD1cInRvcFwiIG5nYlRvb2x0aXA9XCJVcGxvYWQgTm9CXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDQwIDQwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kXzE1MTA2XzEwNjA5MClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMlwiIHk9XCIxXCIgd2lkdGg9XCIzNlwiIGhlaWdodD1cIjM2XCIgcng9XCI4XCIgZmlsbD1cIiNFQUY4RkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzNVwiIGhlaWdodD1cIjM1XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRUFGOEZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIzLjMzMjYgMjIuMzMzMkwxOS45OTkyIDE4Ljk5OTlNMTkuOTk5MiAxOC45OTk5TDE2LjY2NTkgMjIuMzMzMk0xOS45OTkyIDE4Ljk5OTlWMjYuNDk5OU0yNi45OTA5IDI0LjMyNDlDMjcuODAzNyAyMy44ODE4IDI4LjQ0NTggMjMuMTgwNiAyOC44MTU4IDIyLjMzMjFDMjkuMTg1OCAyMS40ODM1IDI5LjI2MjcgMjAuNTM1OSAyOS4wMzQ0IDE5LjYzODhDMjguODA2MSAxOC43NDE3IDI4LjI4NTUgMTcuOTQ2MiAyNy41NTQ4IDE3LjM3NzhDMjYuODI0MSAxNi44MDk0IDI1LjkyNSAxNi41MDA1IDI0Ljk5OTIgMTYuNDk5OUgyMy45NDkyQzIzLjY5NyAxNS41MjQzIDIzLjIyNjkgMTQuNjE4NSAyMi41NzQyIDEzLjg1MDdDMjEuOTIxNSAxMy4wODI5IDIxLjEwMzMgMTIuNDczMSAyMC4xODEgMTIuMDY3MUMxOS4yNTg3IDExLjY2MSAxOC4yNTY0IDExLjQ2OTQgMTcuMjQ5MyAxMS41MDY1QzE2LjI0MjMgMTEuNTQzNiAxNS4yNTY4IDExLjgwODUgMTQuMzY2OSAxMi4yODEzQzEzLjQ3NyAxMi43NTQxIDEyLjcwNTggMTMuNDIyNSAxMi4xMTE0IDE0LjIzNjJDMTEuNTE3IDE1LjA1IDExLjExNDggMTUuOTg3OSAxMC45MzUxIDE2Ljk3OTRDMTAuNzU1MyAxNy45NzA5IDEwLjgwMjcgMTguOTkwMyAxMS4wNzM2IDE5Ljk2MUMxMS4zNDQ1IDIwLjkzMTYgMTEuODMxOSAyMS44MjgxIDEyLjQ5OTIgMjIuNTgzMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMDlCRjNcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfMTUxMDZfMTA2MDkwXCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggaW49XCJTb3VyY2VBbHBoYVwiIHR5cGU9XCJtYXRyaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIiByZXN1bHQ9XCJoYXJkQWxwaGFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVPZmZzZXQgZHk9XCIxXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wNSAwXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfMTUxMDZfMTA2MDkwXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluPVwiU291cmNlR3JhcGhpY1wiIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd18xNTEwNl8xMDYwOTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwic2hhcGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBneC0wIHAtM1wiPlxyXG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaXNNaW5pbWl6ZWQgPyAnY29sLTEyJyA6ICdjb2wtOCdcIlxyXG4gIFtzdHlsZS5oZWlnaHQucHhdPVwiem9uZUNoYXJ0Tm9EYXRhID8gMzAwIDogKGlzTWluaW1pemVkID8gNjUwIDogNTUwKVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiem9uZUNoYXJ0TG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInpvbmVDaGFydE5vRGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG15LTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFtYWludGV4dCBtdC0zXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhc3VidGV4dFwiPlRoZXJlIGlzIG5vIHJlc3VsdCBmb3IgWm9uZSBCYXNlZCBTaG9wcGVyIEFuYWx5c2lzIENoYXJ0PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhem9uZUNoYXJ0Tm9EYXRhICYmICF6b25lQ2hhcnRMb2FkaW5nXCIgaWQ9XCJjaGFydGRpdlwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJpc01pbmltaXplZCA/ICd6b25lLWZsb2F0aW5nJyA6ICdjb2wtNCdcIiBbc3R5bGUudG9wLnB4XT1cImlzTWluaW1pemVkID8gZmxvYXRpbmdQb3MudG9wIDogbnVsbFwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImlzTWluaW1pemVkID8gZmxvYXRpbmdQb3MubGVmdCA6IG51bGxcIiAobW91c2Vkb3duKT1cInN0YXJ0RHJhZygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDwhLS0gKG1vdXNlZG93bik9XCJzdGFydERyYWcoJGV2ZW50KVwiIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ6b25lQ2FyZExvYWRpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ6b25lQ2FyZE5vRGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG15LTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFtYWludGV4dCBtdC0zXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhc3VidGV4dFwiPlRoZXJlIGlzIG5vIHJlc3VsdCBmb3IgWm9uZSBCYXNlZCBTaG9wcGVyIEFuYWx5c2lzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb25hdGluZXIgKm5nSWY9XCIhem9uZUNhcmROb0RhdGEgJiYgIXpvbmVDYXJkTG9hZGluZ1wiIGNsYXNzPVwiY2FyZCBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMCBweC00XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpc01pbmltaXplZCA/J2JnLXNlY29uZGFyeSBtaW4taC0zMHB4JzogJ2JnLWxpZ2h0LXByaW1hcnkgbWluLWgtNDVweCBtYi0yJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRpdGxlIGFsaWduLWl0ZW1zLXN0YXJ0XCI+PHNwYW4gKm5nSWY9XCJpc01pbmltaXplZFwiIGNsYXNzPVwibWUtMiBtYi0yXCI+PHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOSAyMEM4LjQ1IDIwIDcuOTc5MTcgMTkuODA0MiA3LjU4NzUgMTkuNDEyNUM3LjE5NTgzIDE5LjAyMDggNyAxOC41NSA3IDE4QzcgMTcuNDUgNy4xOTU4MyAxNi45NzkyIDcuNTg3NSAxNi41ODc1QzcuOTc5MTcgMTYuMTk1OCA4LjQ1IDE2IDkgMTZDOS41NSAxNiAxMC4wMjA4IDE2LjE5NTggMTAuNDEyNSAxNi41ODc1QzEwLjgwNDIgMTYuOTc5MiAxMSAxNy40NSAxMSAxOEMxMSAxOC41NSAxMC44MDQyIDE5LjAyMDggMTAuNDEyNSAxOS40MTI1QzEwLjAyMDggMTkuODA0MiA5LjU1IDIwIDkgMjBaTTE1IDIwQzE0LjQ1IDIwIDEzLjk3OTIgMTkuODA0MiAxMy41ODc1IDE5LjQxMjVDMTMuMTk1OCAxOS4wMjA4IDEzIDE4LjU1IDEzIDE4QzEzIDE3LjQ1IDEzLjE5NTggMTYuOTc5MiAxMy41ODc1IDE2LjU4NzVDMTMuOTc5MiAxNi4xOTU4IDE0LjQ1IDE2IDE1IDE2QzE1LjU1IDE2IDE2LjAyMDggMTYuMTk1OCAxNi40MTI1IDE2LjU4NzVDMTYuODA0MiAxNi45NzkyIDE3IDE3LjQ1IDE3IDE4QzE3IDE4LjU1IDE2LjgwNDIgMTkuMDIwOCAxNi40MTI1IDE5LjQxMjVDMTYuMDIwOCAxOS44MDQyIDE1LjU1IDIwIDE1IDIwWk05IDE0QzguNDUgMTQgNy45NzkxNyAxMy44MDQyIDcuNTg3NSAxMy40MTI1QzcuMTk1ODMgMTMuMDIwOCA3IDEyLjU1IDcgMTJDNyAxMS40NSA3LjE5NTgzIDEwLjk3OTIgNy41ODc1IDEwLjU4NzVDNy45NzkxNyAxMC4xOTU4IDguNDUgMTAgOSAxMEM5LjU1IDEwIDEwLjAyMDggMTAuMTk1OCAxMC40MTI1IDEwLjU4NzVDMTAuODA0MiAxMC45NzkyIDExIDExLjQ1IDExIDEyQzExIDEyLjU1IDEwLjgwNDIgMTMuMDIwOCAxMC40MTI1IDEzLjQxMjVDMTAuMDIwOCAxMy44MDQyIDkuNTUgMTQgOSAxNFpNMTUgMTRDMTQuNDUgMTQgMTMuOTc5MiAxMy44MDQyIDEzLjU4NzUgMTMuNDEyNUMxMy4xOTU4IDEzLjAyMDggMTMgMTIuNTUgMTMgMTJDMTMgMTEuNDUgMTMuMTk1OCAxMC45NzkyIDEzLjU4NzUgMTAuNTg3NUMxMy45NzkyIDEwLjE5NTggMTQuNDUgMTAgMTUgMTBDMTUuNTUgMTAgMTYuMDIwOCAxMC4xOTU4IDE2LjQxMjUgMTAuNTg3NUMxNi44MDQyIDEwLjk3OTIgMTcgMTEuNDUgMTcgMTJDMTcgMTIuNTUgMTYuODA0MiAxMy4wMjA4IDE2LjQxMjUgMTMuNDEyNUMxNi4wMjA4IDEzLjgwNDIgMTUuNTUgMTQgMTUgMTRaTTkgOEM4LjQ1IDggNy45NzkxNyA3LjgwNDE3IDcuNTg3NSA3LjQxMjVDNy4xOTU4MyA3LjAyMDgzIDcgNi41NSA3IDZDNyA1LjQ1IDcuMTk1ODMgNC45NzkxNyA3LjU4NzUgNC41ODc1QzcuOTc5MTcgNC4xOTU4MyA4LjQ1IDQgOSA0QzkuNTUgNCAxMC4wMjA4IDQuMTk1ODMgMTAuNDEyNSA0LjU4NzVDMTAuODA0MiA0Ljk3OTE3IDExIDUuNDUgMTEgNkMxMSA2LjU1IDEwLjgwNDIgNy4wMjA4MyAxMC40MTI1IDcuNDEyNUMxMC4wMjA4IDcuODA0MTcgOS41NSA4IDkgOFpNMTUgOEMxNC40NSA4IDEzLjk3OTIgNy44MDQxNyAxMy41ODc1IDcuNDEyNUMxMy4xOTU4IDcuMDIwODMgMTMgNi41NSAxMyA2QzEzIDUuNDUgMTMuMTk1OCA0Ljk3OTE3IDEzLjU4NzUgNC41ODc1QzEzLjk3OTIgNC4xOTU4MyAxNC40NSA0IDE1IDRDMTUuNTUgNCAxNi4wMjA4IDQuMTk1ODMgMTYuNDEyNSA0LjU4NzVDMTYuODA0MiA0Ljk3OTE3IDE3IDUuNDUgMTcgNkMxNyA2LjU1IDE2LjgwNDIgNy4wMjA4MyAxNi40MTI1IDcuNDEyNUMxNi4wMjA4IDcuODA0MTcgMTUuNTUgOCAxNSA4WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNjY3MDg1XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj4gWm9uZSBKb3VybmV5IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvb2xiYXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgbXktMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzTWluaW1pemVkXCIgKGNsaWNrKT1cInNlYXJjaE9wZW4oKVwiIGNsYXNzPVwibWUtM1wiPjxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTkgMTlMMTQuNjUgMTQuNjVNMTcgOUMxNyAxMy40MTgzIDEzLjQxODMgMTcgOSAxN0M0LjU4MTcyIDE3IDEgMTMuNDE4MyAxIDlDMSA0LjU4MTcyIDQuNTgxNzIgMSA5IDFDMTMuNDE4MyAxIDE3IDQuNTgxNzIgMTcgOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM5OEEyQjNcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiICpuZ0lmPVwiIWlzTWluaW1pemVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZENsb3NlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUgMTJIMTlcIiBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAqbmdJZj1cImlzTWluaW1pemVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZENsb3NlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1IDNIMjFNMjEgM1Y5TTIxIDNMMTQgMTBNOSAyMUgzTTMgMjFWMTVNMyAyMUwxMCAxNFwiIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNNaW5pbWl6ZWRcIiBjbGFzcz1cImNhcmQtYm9keSBoLTUwMHB4IG92ZXJmbG93LWF1dG8gcHgtMCBweS0yXCI+XHJcbiAgICAgICAgIFxyXG48ZGl2ICpuZ0lmPVwic2VhcmNoTmV3T3BlblwiIGNsYXNzPVwicHgtMiBwYi0yXCI+XHJcbiAgICA8aW5wdXRcclxuICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFpvbmVcIlxyXG4gICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFpvbmVUZXh0XCJcclxuICAgICAgKGNoYW5nZSk9XCJTZWFyY2hab25lcygpXCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInpvbmUtY2FyZCBteC0zIFwiICpuZ0Zvcj1cImxldCB6b25lIG9mIHpvbmVzO2xldCBpID0gaW5kZXhcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSEVBREVSIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImFjdGl2ZUluZGV4ID09PSBpID8gJ3pvbmUtaGVhZGVyJzonem9uZS1kZWZhdWx0J1wiIChjbGljayk9XCJ0b2dnbGUoaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiYWN0aXZlSW5kZXggPT09IGkgPyAnem9uZS10aXRsZSc6J3pvbmUtbm90aXRsZSdcIj57eyB6b25lLmZyb21ab25lIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZWNhc2V9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInpvbmUtbWV0cmljc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtcHJpbWFyeSBweC0yXCIgIHBsYWNlbWVudD1cInRvcFwiIG5nYlRvb2x0aXA9XCJGb290ZmFsbCAoRW5nYWdlcnMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMlwiPjxzdmcgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTAgMTFcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMC4yNSA4LjE2Mjg4SDNWOC43ODc4OEMzIDkuMTUyNTUgMi44NTUxMyA5LjUwMjI5IDIuNTk3MjcgOS43NjAxNUMyLjMzOTQxIDEwLjAxOCAxLjk4OTY3IDEwLjE2MjkgMS42MjUgMTAuMTYyOUMxLjI2MDMzIDEwLjE2MjkgMC45MTA1OTEgMTAuMDE4IDAuNjUyNzI4IDkuNzYwMTVDMC4zOTQ4NjYgOS41MDIyOSAwLjI1IDkuMTUyNTUgMC4yNSA4Ljc4Nzg4VjguMTYyODhaTTIuMjUgMi4yMjI4OEMzLjI1IDIuMjIyODggMy43NSAzLjY2Mjg4IDMuNzUgNC42NjI4OEMzLjc1IDUuMTYyODggMy41IDUuNjYyODggMy4yNSA2LjQxMjg4TDMgNy4xNjI4OEgwLjI1QzAuMjUgNi42NjI4OCAwIDUuOTEyODggMCA0LjY2Mjg4QzAgMy40MTI4OCAwLjk5OSAyLjIyMjg4IDIuMjUgMi4yMjI4OFpNOC4yNzcgNi4yMTE4OEw4LjE2ODUgNi44MjczOEM4LjEwMTE3IDcuMTgyNjkgNy44OTY1NiA3LjQ5NzE3IDcuNTk5MDEgNy43MDI3MUM3LjMwMTQ2IDcuOTA4MjQgNi45MzQ5MiA3Ljk4ODI3IDYuNTc4NzggNy45MjU0N0M2LjIyMjYzIDcuODYyNjggNS45MDU1NyA3LjY2MjEgNS42OTYyNiA3LjM2NzJDNS40ODY5NSA3LjA3MjI5IDUuNDAyMjUgNi43MDY4IDUuNDYwNSA2LjM0OTg4TDUuNTY4NSA1LjczNDg4TDguMjc3IDYuMjExODhaTTcuMzM5IDAuMDE1MzgxMkM4LjU3MSAwLjIzMjM4MSA5LjM0OCAxLjU3Nzg4IDkuMTMxIDIuODA4ODhDOC45MTQgNC4wMzk4OCA4LjUzNzUgNC43MzQ4OCA4LjQ1MSA1LjIyNzM4TDUuNzQyNSA0Ljc0OTg4TDUuNjI2NSAzLjk2Nzg4QzUuNTEwNSAzLjE4NTg4IDUuMzUxNSAyLjY0OTg4IDUuNDM4IDIuMTU3ODhDNS42MTE1IDEuMTcyODggNi4zNTQgLTAuMTU4MTE5IDcuMzM5IDAuMDE1MzgxMlpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzAwOUJGM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+IHt7IHpvbmUuZnJvbVpvbmVGb290ZmFsbENvdW50ID8/ICctLScgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1kZWZhdWx0IHB4LTJcIiAgcGxhY2VtZW50PVwidG9wXCJcclxuICBbbmdiVG9vbHRpcF09XCJjbGllbnREYXRhPy5pc05PQiA/ICdOb0InIDogJ0NvbnZlcnNpb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMlwiPjxzdmcgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTQuNSA1LjVINy41TTQuNSA3LjVINy41TTQuNSAzLjVINy41TTIuNSAxLjVDMi41IDEuMzY3MzkgMi41NTI2OCAxLjI0MDIxIDIuNjQ2NDUgMS4xNDY0NUMyLjc0MDIxIDEuMDUyNjggMi44NjczOSAxIDMgMUg5QzkuMTMyNjEgMSA5LjI1OTc5IDEuMDUyNjggOS4zNTM1NSAxLjE0NjQ1QzkuNDQ3MzIgMS4yNDAyMSA5LjUgMS4zNjczOSA5LjUgMS41VjExTDcuNzUgOS43NUw2IDExTDQuMjUgOS43NUwyLjUgMTFWMS41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPiB7eyB6b25lLmZyb21ab25lTm9iQ291bnQgPz8gJy0tJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJvdyBjdXJzb3ItcG9pbnRlclwiPjxzdmcgKm5nSWY9XCJhY3RpdmVJbmRleCA9PT0gaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjdcIiB2aWV3Qm94PVwiMCAwIDEyIDdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMC44MzIwMzEgNS44MzMwMUw1LjgzMjAzIDAuODMzMDA4TDEwLjgzMiA1LjgzMzAxXCIgc3Ryb2tlPVwiIzMzQjVGRlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiYWN0aXZlSW5kZXggIT09IGlcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCI3XCIgdmlld0JveD1cIjAgMCAxMiA3XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMC44MzIwMzEgMC44MzMwMDhMNS44MzIwMyA1LjgzMzAxTDEwLjgzMiAwLjgzMzAwOFwiIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJPRFkgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ6b25lLWJvZHkgbWF4LWgtMjAwcHggbWluLWgtYXV0byBvdmVyZmxvdy1hdXRvXCIgKm5nSWY9XCJhY3RpdmVJbmRleCA9PT0gaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0ZXh0LW5vd3JhcCBib3R0b20tYm9yZGVyIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInctNTBcIj5UbyBab25lPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+Rm9vdGZhbGwgKEVuZ2FnZXJzKTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoID48c3BhbiBjbGFzcz1cIm1lLTJcIiAqbmdJZj1cInRoaXMuY2xpZW50RGF0YT8uaXNOT0JcIj5Ob0I8L3NwYW4+IDxzcGFuIGNsYXNzPVwibWUtMlwiICpuZ0lmPVwiIXRoaXMuY2xpZW50RGF0YT8uaXNOT0JcIj5Db252ZXJzaW9uPC9zcGFuPiA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzE1MzIwXzgyNDg4KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy45OTg3IDEwLjY2NjNWNy45OTk2N003Ljk5ODcgNS4zMzMwMUg4LjAwNTM2TTE0LjY2NTQgNy45OTk2N0MxNC42NjU0IDExLjY4MTYgMTEuNjgwNiAxNC42NjYzIDcuOTk4NyAxNC42NjYzQzQuMzE2OCAxNC42NjYzIDEuMzMyMDMgMTEuNjgxNiAxLjMzMjAzIDcuOTk5NjdDMS4zMzIwMyA0LjMxNzc4IDQuMzE2OCAxLjMzMzAxIDcuOTk4NyAxLjMzMzAxQzExLjY4MDYgMS4zMzMwMSAxNC42NjU0IDQuMzE3NzggMTQuNjY1NCA3Ljk5OTY3WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE1MzIwXzgyNDg4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHpvbmUudG9ab25lRGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyByb3cudG9ab25lIHwgdGl0bGVjYXNlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyByb3cuZm9vdGZhbGwgPz8gJy0tJyB9fSAoe3sgcm93LmVuZ2FnZXJQZXJjZW50IH19JSk8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyByb3cubm9iID8/ICctLScgfX0gKHt7IHJvdy5ub2JQZXJjZW50IH19JSk8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29uYXRpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbjwvZGl2PiJdfQ==
|