@litigiovirtual/ius-design-components 1.0.75 → 1.0.76
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/charts-bar-grouped/charts-bar-grouped.component.mjs +60 -56
- package/fesm2022/litigiovirtual-ius-design-components.mjs +59 -55
- package/fesm2022/litigiovirtual-ius-design-components.mjs.map +1 -1
- package/lib/charts-bar-grouped/charts-bar-grouped.component.d.ts +10 -6
- package/package.json +1 -1
|
@@ -3,98 +3,107 @@ import { Component, Input, Output, EventEmitter, computed, signal, ViewChild } f
|
|
|
3
3
|
import { PopoverDirective } from '../directives/popover.directive';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export class IusChartsBarGroupedComponent {
|
|
6
|
-
constructor(zone) {
|
|
6
|
+
constructor(zone, hostEl) {
|
|
7
7
|
this.zone = zone;
|
|
8
|
+
this.hostEl = hostEl;
|
|
8
9
|
this.data = [];
|
|
9
10
|
this.legendPosition = 'bottom';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
this.ticks = 5;
|
|
12
|
+
// Fallbacks si no hay tamaño CSS externo
|
|
13
|
+
this.width = 640;
|
|
14
|
+
this.size = 320; // alto por defecto cuando el host no fija height
|
|
15
|
+
// Márgenes y layout X
|
|
16
|
+
this.margin = { top: 24, right: 16, bottom: 55, left: 40 };
|
|
13
17
|
this.barWidth = 11;
|
|
14
18
|
this.barGap = 2;
|
|
15
19
|
this.groupGap = 40;
|
|
16
20
|
this.outerGap = 18;
|
|
17
21
|
// Estilo barra
|
|
18
22
|
this.barRadius = 5;
|
|
19
|
-
this.ticks = 5;
|
|
20
|
-
// Fallbacks si no hay tamaño CSS externo
|
|
21
|
-
this.width = 640;
|
|
22
|
-
this.size = 320;
|
|
23
23
|
this.maxLabelChars = 10;
|
|
24
24
|
this.barClick = new EventEmitter();
|
|
25
|
+
this.rafId = null;
|
|
25
26
|
// Estado
|
|
26
27
|
this._bars = signal([]);
|
|
27
28
|
this._groups = signal([]);
|
|
28
29
|
this._series = signal([]);
|
|
29
30
|
this._colors = signal({});
|
|
30
31
|
this._yMax = signal(0);
|
|
31
|
-
this._paneH = signal(0); // alto real del
|
|
32
|
-
this._plotW = signal(0); // ancho visible del
|
|
32
|
+
this._paneH = signal(0); // alto real del host (o fallback size)
|
|
33
|
+
this._plotW = signal(0); // ancho visible del contenedor scrolleable
|
|
33
34
|
this._plotWidth = signal(0); // ancho virtual del SVG derecho
|
|
34
35
|
this._groupCenters = signal([]);
|
|
35
36
|
this._barStripes = signal([]);
|
|
37
|
+
// Derivados
|
|
36
38
|
this.bars = computed(() => this._bars());
|
|
37
39
|
this.groups = computed(() => this._groups());
|
|
38
40
|
this.series = computed(() => this._series());
|
|
39
41
|
this.colors = computed(() => this._colors());
|
|
40
42
|
this.yScaleMax = computed(() => this._yMax());
|
|
41
|
-
this.chartHeight = computed(() => this._paneH() || this.size);
|
|
43
|
+
this.chartHeight = computed(() => this._paneH() || this.size);
|
|
42
44
|
this.plotWidth = computed(() => this._plotWidth());
|
|
43
45
|
this.groupCenters = computed(() => this._groupCenters());
|
|
44
46
|
this.barStripes = computed(() => this._barStripes());
|
|
45
47
|
this.innerHeight = computed(() => Math.max(this.chartHeight() - this.margin.top - this.margin.bottom, 0));
|
|
46
|
-
// viewBox por SVG
|
|
47
48
|
this.axisViewBox = computed(() => `0 0 ${this.margin.left} ${this.chartHeight()}`);
|
|
48
49
|
this.plotViewBox = computed(() => `0 0 ${this.plotWidth()} ${this.chartHeight()}`);
|
|
49
50
|
this.Math = Math;
|
|
50
51
|
}
|
|
51
52
|
ngAfterViewInit() {
|
|
52
|
-
// Medición inicial
|
|
53
|
-
this.
|
|
54
|
-
|
|
53
|
+
// Medición inicial en el próximo frame para evitar ExpressionChanged y loops
|
|
54
|
+
this.raf(() => {
|
|
55
|
+
this.measureNow();
|
|
56
|
+
this.recalc();
|
|
57
|
+
});
|
|
58
|
+
// Observa alto del HOST y ancho visible del plot, throttled por rAF
|
|
55
59
|
this.ro = new ResizeObserver(() => {
|
|
56
|
-
this.
|
|
60
|
+
this.raf(() => {
|
|
57
61
|
const changed = this.measureNow();
|
|
58
62
|
if (changed)
|
|
59
63
|
this.recalc();
|
|
60
64
|
});
|
|
61
65
|
});
|
|
62
|
-
this.ro.observe(this.
|
|
66
|
+
this.ro.observe(this.hostEl.nativeElement);
|
|
63
67
|
this.ro.observe(this.plotCtn.nativeElement);
|
|
64
|
-
|
|
68
|
+
}
|
|
69
|
+
ngOnDestroy() {
|
|
70
|
+
this.ro?.disconnect();
|
|
71
|
+
if (this.rafId !== null)
|
|
72
|
+
cancelAnimationFrame(this.rafId);
|
|
73
|
+
}
|
|
74
|
+
ngOnChanges() {
|
|
75
|
+
// Cambios de @Input disparan recálculo
|
|
65
76
|
this.recalc();
|
|
66
77
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
78
|
+
// ========= Medición =========
|
|
79
|
+
/** Ejecuta una tarea en el próximo frame dentro de Angular */
|
|
80
|
+
raf(fn) {
|
|
81
|
+
if (this.rafId !== null)
|
|
82
|
+
cancelAnimationFrame(this.rafId);
|
|
83
|
+
this.rafId = requestAnimationFrame(() => this.zone.run(fn));
|
|
84
|
+
}
|
|
85
|
+
/** Mide alto del host y ancho visible del plot. Devuelve true si cambió algo. */
|
|
70
86
|
measureNow() {
|
|
71
|
-
const
|
|
72
|
-
const
|
|
87
|
+
const hostH = Math.floor(this.hostEl.nativeElement.clientHeight || 0);
|
|
88
|
+
const paneH = hostH > 0 ? hostH : this.size;
|
|
89
|
+
const plotW = Math.floor(this.plotCtn?.nativeElement?.clientWidth || 0)
|
|
90
|
+
|| (this.width - this.margin.left);
|
|
73
91
|
let changed = false;
|
|
74
|
-
if (paneH
|
|
92
|
+
if (paneH !== this._paneH()) {
|
|
75
93
|
this._paneH.set(paneH);
|
|
76
94
|
changed = true;
|
|
77
95
|
}
|
|
78
|
-
if (plotW
|
|
96
|
+
if (plotW !== this._plotW()) {
|
|
79
97
|
this._plotW.set(plotW);
|
|
80
98
|
changed = true;
|
|
81
99
|
}
|
|
82
|
-
// Si no hay valores aún (por render temprano), usa fallbacks para no quedarte en 0
|
|
83
|
-
if (!this._paneH()) {
|
|
84
|
-
this._paneH.set(this.size);
|
|
85
|
-
changed = true;
|
|
86
|
-
}
|
|
87
|
-
if (!this._plotW()) {
|
|
88
|
-
this._plotW.set(this.width - this.margin.left);
|
|
89
|
-
changed = true;
|
|
90
|
-
}
|
|
91
100
|
return changed;
|
|
92
101
|
}
|
|
102
|
+
// ========= Layout & data =========
|
|
93
103
|
recalc() {
|
|
94
|
-
const cleaned = (this.data ?? [])
|
|
95
|
-
label: g.label,
|
|
96
|
-
|
|
97
|
-
})).filter(x => x.items.length > 0);
|
|
104
|
+
const cleaned = (this.data ?? [])
|
|
105
|
+
.map(g => ({ label: g.label, items: (g.items ?? []).filter(i => Number(i?.value) >= 0) }))
|
|
106
|
+
.filter(x => x.items.length > 0);
|
|
98
107
|
const groups = cleaned.map(g => g.label);
|
|
99
108
|
// series + orden
|
|
100
109
|
const seriesSet = new Set();
|
|
@@ -116,7 +125,7 @@ export class IusChartsBarGroupedComponent {
|
|
|
116
125
|
'#C4DFFF', // Info-200
|
|
117
126
|
];
|
|
118
127
|
const colorMap = {};
|
|
119
|
-
series.forEach((s, i) => colorMap[s] = palette[i % palette.length]);
|
|
128
|
+
series.forEach((s, i) => (colorMap[s] = palette[i % palette.length]));
|
|
120
129
|
// normalizar
|
|
121
130
|
const normalized = cleaned.map(g => {
|
|
122
131
|
const map = new Map(g.items.map(i => [i.label, i]));
|
|
@@ -130,7 +139,7 @@ export class IusChartsBarGroupedComponent {
|
|
|
130
139
|
const maxValue = Math.max(0, ...normalized.flatMap(g => g.items.map(i => i.value)));
|
|
131
140
|
const yMax = this.yMax && this.yMax > 0 ? this.yMax : this.niceMax(maxValue);
|
|
132
141
|
this._yMax.set(yMax);
|
|
133
|
-
//
|
|
142
|
+
// Dimensiones visibles del panel derecho
|
|
134
143
|
const visibleW = this._plotW() || (this.width - this.margin.left);
|
|
135
144
|
// ===== Layout X con outerGap =====
|
|
136
145
|
const G = normalized.length;
|
|
@@ -139,9 +148,9 @@ export class IusChartsBarGroupedComponent {
|
|
|
139
148
|
const innerNaturalWidth = Math.max(0, (this.outerGap * 2) + G * groupInnerWidth + Math.max(0, G - 1) * this.groupGap);
|
|
140
149
|
const innerVisibleWidth = Math.max(visibleW - this.margin.right, 0);
|
|
141
150
|
const innerVirtualWidth = Math.max(innerVisibleWidth, innerNaturalWidth);
|
|
142
|
-
const plotWidth = innerVirtualWidth + this.margin.right;
|
|
151
|
+
const plotWidth = innerVirtualWidth + this.margin.right;
|
|
143
152
|
this._plotWidth.set(plotWidth);
|
|
144
|
-
//
|
|
153
|
+
// Construcción de barras + franjas
|
|
145
154
|
const ih = this.innerHeight();
|
|
146
155
|
const bars = [];
|
|
147
156
|
const centers = [];
|
|
@@ -153,17 +162,14 @@ export class IusChartsBarGroupedComponent {
|
|
|
153
162
|
centers.push(center);
|
|
154
163
|
g.items.forEach((it, si) => {
|
|
155
164
|
const x = startX + si * (this.barWidth + this.barGap);
|
|
156
|
-
// franja por barra
|
|
157
|
-
stripes.push({ x, width: this.barWidth });
|
|
165
|
+
stripes.push({ x, width: this.barWidth }); // franja por barra
|
|
158
166
|
const h = it.value <= 0 ? 0 : (it.value / yMax) * ih;
|
|
159
167
|
const y = this.margin.top + ih - h;
|
|
160
168
|
bars.push({
|
|
161
169
|
groupLabel: g.label,
|
|
162
170
|
seriesLabel: it.label,
|
|
163
171
|
value: it.value,
|
|
164
|
-
x, y,
|
|
165
|
-
width: this.barWidth,
|
|
166
|
-
height: h,
|
|
172
|
+
x, y, width: this.barWidth, height: h,
|
|
167
173
|
color: it.color ?? colorMap[it.label]
|
|
168
174
|
});
|
|
169
175
|
});
|
|
@@ -176,6 +182,7 @@ export class IusChartsBarGroupedComponent {
|
|
|
176
182
|
this._groupCenters.set(centers);
|
|
177
183
|
this._barStripes.set(stripes);
|
|
178
184
|
}
|
|
185
|
+
// ========= Helpers =========
|
|
179
186
|
niceMax(maxVal) {
|
|
180
187
|
if (maxVal <= 0)
|
|
181
188
|
return 1;
|
|
@@ -203,18 +210,18 @@ export class IusChartsBarGroupedComponent {
|
|
|
203
210
|
return lbl.length > this.maxLabelChars ? (lbl.slice(0, this.maxLabelChars - 1) + '…') : lbl;
|
|
204
211
|
}
|
|
205
212
|
formatTooltip(b) {
|
|
206
|
-
return `${b.
|
|
213
|
+
return `${b.seriesLabel}: ${b.value}`;
|
|
207
214
|
}
|
|
208
215
|
onBarClick(b) {
|
|
209
216
|
this.barClick.emit({ group: b.groupLabel, series: b.seriesLabel, value: b.value });
|
|
210
217
|
}
|
|
211
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IusChartsBarGroupedComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
212
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: IusChartsBarGroupedComponent, isStandalone: true, selector: "ius-charts-bar-grouped", inputs: { data: "data", legendPosition: "legendPosition", seriesOrder: "seriesOrder", maxLabelChars: "maxLabelChars" }, outputs: { barClick: "barClick" }, viewQueries: [{ propertyName: "
|
|
218
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IusChartsBarGroupedComponent, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
219
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: IusChartsBarGroupedComponent, isStandalone: true, selector: "ius-charts-bar-grouped", inputs: { data: "data", legendPosition: "legendPosition", seriesOrder: "seriesOrder", maxLabelChars: "maxLabelChars" }, outputs: { barClick: "barClick" }, viewQueries: [{ propertyName: "plotCtn", first: true, predicate: ["plotCtn"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"chart-wrapper\" [class.bottom]=\"legendPosition === 'bottom'\">\r\n <div class=\"panes\" #panes>\r\n <div class=\"axis-ctn\">\r\n <svg class=\"chart-axis\"\r\n [attr.viewBox]=\"axisViewBox()\"\r\n preserveAspectRatio=\"xMinYMin meet\"\r\n [style.width.px]=\"margin.left\"\r\n [style.height.px]=\"chartHeight()\">\r\n @for (t of yTicksArr; track t) {\r\n <text class=\"y-tick body-sm\"\r\n [attr.x]=\"margin.left - 6\"\r\n [attr.y]=\"getY(t)\"\r\n text-anchor=\"end\"\r\n dominant-baseline=\"middle\">\r\n {{ t }}\r\n </text>\r\n }\r\n </svg>\r\n </div>\r\n\r\n <div class=\"plot-ctn scrollable-small\" #plotCtn>\r\n <svg class=\"chart\"\r\n [attr.viewBox]=\"plotViewBox()\"\r\n preserveAspectRatio=\"xMinYMin meet\"\r\n [style.width.px]=\"plotWidth()\"\r\n [style.height.px]=\"chartHeight()\">\r\n\r\n @for (s of barStripes(); track s.x) {\r\n <rect class=\"bar-stripe\"\r\n [attr.x]=\"s.x\"\r\n [attr.y]=\"margin.top\"\r\n [attr.width]=\"s.width\"\r\n [attr.height]=\"innerHeight()\"></rect>\r\n }\r\n\r\n @for (t of yTicksArr; track t) {\r\n <line class=\"grid-line\"\r\n [attr.x1]=\"0\"\r\n [attr.x2]=\"plotWidth() - margin.right\"\r\n [attr.y1]=\"getY(t)\" [attr.y2]=\"getY(t)\"/>\r\n }\r\n\r\n @for (g of groups(); track g; let i = $index) {\r\n <text class=\"x-label body-sm\"\r\n [attr.x]=\"groupCenters()[i]\"\r\n [attr.y]=\"chartHeight() - margin.bottom + 6\"\r\n text-anchor=\"middle\"\r\n dominant-baseline=\"hanging\"\r\n [iusPopoverContent]=\"g\">\r\n {{ shortLabel(g) }}\r\n </text>\r\n }\r\n\r\n @for (b of bars(); track b.groupLabel + ' - ' + b.seriesLabel) {\r\n <rect class=\"bar\"\r\n [attr.x]=\"b.x\"\r\n [attr.y]=\"b.y\"\r\n [attr.width]=\"b.width\"\r\n [attr.height]=\"Math.max(b.height, 0)\"\r\n [attr.fill]=\"b.color\"\r\n [attr.rx]=\"barRadius\"\r\n [attr.ry]=\"barRadius\"\r\n [iusPopoverContent]=\"formatTooltip(b)\"\r\n (click)=\"onBarClick(b)\"/>\r\n }\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-- Leyenda -->\r\n <div class=\"legend\" [class.bottom]=\"legendPosition === 'bottom'\">\r\n @for (s of series(); track s) {\r\n <div class=\"legend-item\">\r\n <span class=\"dot\" [style.background]=\"colors()[s]\"></span>\r\n <span class=\"label caption-sm\" [iusPopoverContent]=\"s\">{{ s }}</span>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n", styles: [".h1{font-family:Roboto,sans-serif;font-size:2.375rem;font-weight:500;line-height:46px}.h2{font-family:Roboto,sans-serif;font-size:1.875rem;font-weight:700;line-height:38px}.h3{font-family:Roboto,sans-serif;font-size:1.5rem;font-weight:500;line-height:32px}.h4{font-family:Roboto,sans-serif;font-size:1.25rem;font-weight:700;line-height:26px}.h5{font-family:Roboto,sans-serif;font-size:1.125rem;font-weight:500;line-height:24px;letter-spacing:.18px}.label-large{font-family:Roboto,sans-serif;font-size:1rem;font-weight:500;line-height:22px}.body-large{font-family:Rubik,sans-serif;font-size:1rem;font-weight:400;line-height:22px}.label-base{font-family:Rubik,sans-serif;font-size:.875rem;font-weight:500;line-height:20px;letter-spacing:.28px}.body-base{font-family:Rubik,sans-serif;font-size:.875rem;font-weight:400;line-height:20px;font-style:italic;letter-spacing:.28px}.body-sm{font-family:Rubik,sans-serif;font-size:.75rem;font-weight:400;line-height:16px;letter-spacing:.28px}.body-sm-italic{font-family:Rubik,sans-serif;font-size:.75rem;font-weight:400;line-height:16px;font-style:italic;letter-spacing:.28px}.caption-sm{font-family:Rubik,sans-serif;font-size:.75rem;font-weight:500;line-height:16px;letter-spacing:.28px}.caption-sm-italic{font-family:Rubik,sans-serif;font-size:.75rem;font-weight:500;line-height:16px;font-style:italic;letter-spacing:.28px}:host{display:block;max-width:100%;min-height:0}.chart-wrapper{display:grid;grid-template-columns:1fr auto;column-gap:16px;height:100%;min-height:0;align-items:start}.chart-wrapper.bottom{grid-template-columns:1fr;grid-template-rows:1fr auto;row-gap:12px}.panes{display:grid;grid-template-columns:auto 1fr;height:100%;min-height:0}.axis-ctn{height:100%;min-height:0;overflow:hidden}.plot-ctn{width:100%;height:100%;min-height:0;overflow-x:auto;overflow-y:hidden}.chart-wrapper,.panes,.axis-ctn,.plot-ctn{min-height:0}.chart,.chart-axis{display:block}.grid-line{stroke:#1f293729;stroke-width:1;stroke-dasharray:3 3}.y-tick,.x-label{fill:#000000b3}.bar-stripe{fill:#d6dbed66;pointer-events:none}.bar{cursor:pointer;transition:opacity .15s ease,transform .15s ease;pointer-events:all}.bar:hover{opacity:.9}.bar:focus{outline:none;filter:drop-shadow(0 0 2px rgba(0,0,0,.2))}.legend{display:flex;justify-content:center;flex-direction:column;gap:8px;min-width:0}.legend.bottom{flex-direction:row;flex-wrap:wrap}.legend .legend-item{display:flex;align-items:center;gap:8px;min-width:0;white-space:nowrap}.legend .dot{width:8px;height:8px;border-radius:8px;flex:0 0 8px}.legend .label{color:#595959;min-width:0;overflow:hidden;text-overflow:ellipsis}.plot-ctn.scrollable-small::-webkit-scrollbar{-webkit-appearance:none}.plot-ctn.scrollable-small::-webkit-scrollbar:vertical{width:4px;height:32px;padding-top:2px;padding-bottom:2px}.plot-ctn.scrollable-small::-webkit-scrollbar:horizontal{height:5px;padding-top:2px;padding-bottom:2px}.plot-ctn.scrollable-small::-webkit-scrollbar-thumb{background-color:#bfbfbf;border-radius:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: PopoverDirective, selector: "[iusPopover], [iusPopoverTitle], [iusPopoverContent]", inputs: ["iusPopover", "iusPopoverTitle", "iusPopoverContent", "iusPopoverPosition", "iusPopoverOpenDelay", "iusPopoverCloseDelay"] }] }); }
|
|
213
220
|
}
|
|
214
221
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IusChartsBarGroupedComponent, decorators: [{
|
|
215
222
|
type: Component,
|
|
216
|
-
args: [{ selector: 'ius-charts-bar-grouped', standalone: true, imports: [CommonModule, PopoverDirective], template: "<div class=\"chart-wrapper\" [class.bottom]=\"legendPosition === 'bottom'\">\r\n <div class=\"panes\" #panes>\r\n <div class=\"axis-ctn\">\r\n <svg class=\"chart-axis\"\r\n [attr.viewBox]=\"axisViewBox()\"\r\n preserveAspectRatio=\"xMinYMin meet\"\r\n [style.width.px]=\"margin.left\"\r\n [style.height.px]=\"chartHeight()\">\r\n @for (t of yTicksArr; track t) {\r\n <text class=\"y-tick body-sm\"\r\n [attr.x]=\"margin.left - 6\"\r\n [attr.y]=\"getY(t)\"\r\n text-anchor=\"end\"\r\n dominant-baseline=\"middle\">\r\n {{ t }}\r\n </text>\r\n }\r\n </svg>\r\n </div>\r\n\r\n <div class=\"plot-ctn scrollable-small\" #plotCtn>\r\n <svg class=\"chart\"\r\n [attr.viewBox]=\"plotViewBox()\"\r\n preserveAspectRatio=\"xMinYMin meet\"\r\n [style.width.px]=\"plotWidth()\"\r\n [style.height.px]=\"chartHeight()\">\r\n\r\n @for (s of barStripes(); track s.x) {\r\n <rect class=\"bar-stripe\"\r\n [attr.x]=\"s.x\"\r\n [attr.y]=\"margin.top\"\r\n [attr.width]=\"s.width\"\r\n [attr.height]=\"innerHeight()\"></rect>\r\n }\r\n\r\n @for (t of yTicksArr; track t) {\r\n <line class=\"grid-line\"\r\n [attr.x1]=\"0\"\r\n [attr.x2]=\"plotWidth() - margin.right\"\r\n [attr.y1]=\"getY(t)\" [attr.y2]=\"getY(t)\"/>\r\n }\r\n\r\n @for (g of groups(); track g; let i = $index) {\r\n <text class=\"x-label body-sm\"\r\n
|
|
217
|
-
}], ctorParameters: () => [{ type: i0.NgZone }], propDecorators: { data: [{
|
|
223
|
+
args: [{ selector: 'ius-charts-bar-grouped', standalone: true, imports: [CommonModule, PopoverDirective], template: "<div class=\"chart-wrapper\" [class.bottom]=\"legendPosition === 'bottom'\">\r\n <div class=\"panes\" #panes>\r\n <div class=\"axis-ctn\">\r\n <svg class=\"chart-axis\"\r\n [attr.viewBox]=\"axisViewBox()\"\r\n preserveAspectRatio=\"xMinYMin meet\"\r\n [style.width.px]=\"margin.left\"\r\n [style.height.px]=\"chartHeight()\">\r\n @for (t of yTicksArr; track t) {\r\n <text class=\"y-tick body-sm\"\r\n [attr.x]=\"margin.left - 6\"\r\n [attr.y]=\"getY(t)\"\r\n text-anchor=\"end\"\r\n dominant-baseline=\"middle\">\r\n {{ t }}\r\n </text>\r\n }\r\n </svg>\r\n </div>\r\n\r\n <div class=\"plot-ctn scrollable-small\" #plotCtn>\r\n <svg class=\"chart\"\r\n [attr.viewBox]=\"plotViewBox()\"\r\n preserveAspectRatio=\"xMinYMin meet\"\r\n [style.width.px]=\"plotWidth()\"\r\n [style.height.px]=\"chartHeight()\">\r\n\r\n @for (s of barStripes(); track s.x) {\r\n <rect class=\"bar-stripe\"\r\n [attr.x]=\"s.x\"\r\n [attr.y]=\"margin.top\"\r\n [attr.width]=\"s.width\"\r\n [attr.height]=\"innerHeight()\"></rect>\r\n }\r\n\r\n @for (t of yTicksArr; track t) {\r\n <line class=\"grid-line\"\r\n [attr.x1]=\"0\"\r\n [attr.x2]=\"plotWidth() - margin.right\"\r\n [attr.y1]=\"getY(t)\" [attr.y2]=\"getY(t)\"/>\r\n }\r\n\r\n @for (g of groups(); track g; let i = $index) {\r\n <text class=\"x-label body-sm\"\r\n [attr.x]=\"groupCenters()[i]\"\r\n [attr.y]=\"chartHeight() - margin.bottom + 6\"\r\n text-anchor=\"middle\"\r\n dominant-baseline=\"hanging\"\r\n [iusPopoverContent]=\"g\">\r\n {{ shortLabel(g) }}\r\n </text>\r\n }\r\n\r\n @for (b of bars(); track b.groupLabel + ' - ' + b.seriesLabel) {\r\n <rect class=\"bar\"\r\n [attr.x]=\"b.x\"\r\n [attr.y]=\"b.y\"\r\n [attr.width]=\"b.width\"\r\n [attr.height]=\"Math.max(b.height, 0)\"\r\n [attr.fill]=\"b.color\"\r\n [attr.rx]=\"barRadius\"\r\n [attr.ry]=\"barRadius\"\r\n [iusPopoverContent]=\"formatTooltip(b)\"\r\n (click)=\"onBarClick(b)\"/>\r\n }\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-- Leyenda -->\r\n <div class=\"legend\" [class.bottom]=\"legendPosition === 'bottom'\">\r\n @for (s of series(); track s) {\r\n <div class=\"legend-item\">\r\n <span class=\"dot\" [style.background]=\"colors()[s]\"></span>\r\n <span class=\"label caption-sm\" [iusPopoverContent]=\"s\">{{ s }}</span>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n", styles: [".h1{font-family:Roboto,sans-serif;font-size:2.375rem;font-weight:500;line-height:46px}.h2{font-family:Roboto,sans-serif;font-size:1.875rem;font-weight:700;line-height:38px}.h3{font-family:Roboto,sans-serif;font-size:1.5rem;font-weight:500;line-height:32px}.h4{font-family:Roboto,sans-serif;font-size:1.25rem;font-weight:700;line-height:26px}.h5{font-family:Roboto,sans-serif;font-size:1.125rem;font-weight:500;line-height:24px;letter-spacing:.18px}.label-large{font-family:Roboto,sans-serif;font-size:1rem;font-weight:500;line-height:22px}.body-large{font-family:Rubik,sans-serif;font-size:1rem;font-weight:400;line-height:22px}.label-base{font-family:Rubik,sans-serif;font-size:.875rem;font-weight:500;line-height:20px;letter-spacing:.28px}.body-base{font-family:Rubik,sans-serif;font-size:.875rem;font-weight:400;line-height:20px;font-style:italic;letter-spacing:.28px}.body-sm{font-family:Rubik,sans-serif;font-size:.75rem;font-weight:400;line-height:16px;letter-spacing:.28px}.body-sm-italic{font-family:Rubik,sans-serif;font-size:.75rem;font-weight:400;line-height:16px;font-style:italic;letter-spacing:.28px}.caption-sm{font-family:Rubik,sans-serif;font-size:.75rem;font-weight:500;line-height:16px;letter-spacing:.28px}.caption-sm-italic{font-family:Rubik,sans-serif;font-size:.75rem;font-weight:500;line-height:16px;font-style:italic;letter-spacing:.28px}:host{display:block;max-width:100%;min-height:0}.chart-wrapper{display:grid;grid-template-columns:1fr auto;column-gap:16px;height:100%;min-height:0;align-items:start}.chart-wrapper.bottom{grid-template-columns:1fr;grid-template-rows:1fr auto;row-gap:12px}.panes{display:grid;grid-template-columns:auto 1fr;height:100%;min-height:0}.axis-ctn{height:100%;min-height:0;overflow:hidden}.plot-ctn{width:100%;height:100%;min-height:0;overflow-x:auto;overflow-y:hidden}.chart-wrapper,.panes,.axis-ctn,.plot-ctn{min-height:0}.chart,.chart-axis{display:block}.grid-line{stroke:#1f293729;stroke-width:1;stroke-dasharray:3 3}.y-tick,.x-label{fill:#000000b3}.bar-stripe{fill:#d6dbed66;pointer-events:none}.bar{cursor:pointer;transition:opacity .15s ease,transform .15s ease;pointer-events:all}.bar:hover{opacity:.9}.bar:focus{outline:none;filter:drop-shadow(0 0 2px rgba(0,0,0,.2))}.legend{display:flex;justify-content:center;flex-direction:column;gap:8px;min-width:0}.legend.bottom{flex-direction:row;flex-wrap:wrap}.legend .legend-item{display:flex;align-items:center;gap:8px;min-width:0;white-space:nowrap}.legend .dot{width:8px;height:8px;border-radius:8px;flex:0 0 8px}.legend .label{color:#595959;min-width:0;overflow:hidden;text-overflow:ellipsis}.plot-ctn.scrollable-small::-webkit-scrollbar{-webkit-appearance:none}.plot-ctn.scrollable-small::-webkit-scrollbar:vertical{width:4px;height:32px;padding-top:2px;padding-bottom:2px}.plot-ctn.scrollable-small::-webkit-scrollbar:horizontal{height:5px;padding-top:2px;padding-bottom:2px}.plot-ctn.scrollable-small::-webkit-scrollbar-thumb{background-color:#bfbfbf;border-radius:4px}\n"] }]
|
|
224
|
+
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i0.ElementRef }], propDecorators: { data: [{
|
|
218
225
|
type: Input
|
|
219
226
|
}], legendPosition: [{
|
|
220
227
|
type: Input
|
|
@@ -224,11 +231,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
224
231
|
type: Input
|
|
225
232
|
}], barClick: [{
|
|
226
233
|
type: Output
|
|
227
|
-
}], panesRef: [{
|
|
228
|
-
type: ViewChild,
|
|
229
|
-
args: ['panes', { static: true }]
|
|
230
234
|
}], plotCtn: [{
|
|
231
235
|
type: ViewChild,
|
|
232
236
|
args: ['plotCtn', { static: true }]
|
|
233
237
|
}] } });
|
|
234
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnRzLWJhci1ncm91cGVkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2l1cy1kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL2NoYXJ0cy1iYXItZ3JvdXBlZC9jaGFydHMtYmFyLWdyb3VwZWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaXVzLWRlc2lnbi1jb21wb25lbnRzL3NyYy9saWIvY2hhcnRzLWJhci1ncm91cGVkL2NoYXJ0cy1iYXItZ3JvdXBlZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFDM0IsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQ3ZDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOztBQTJCbkUsTUFBTSxPQUFPLDRCQUE0QjtJQW9FdkMsWUFBb0IsSUFBWTtRQUFaLFNBQUksR0FBSixJQUFJLENBQVE7UUFuRXZCLFNBQUksR0FBZSxFQUFFLENBQUM7UUFDdEIsbUJBQWMsR0FBdUIsUUFBUSxDQUFDO1FBR3ZELHNDQUFzQztRQUN0QyxXQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFFdEQsZ0JBQWdCO1FBQ2hCLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFFZCxlQUFlO1FBQ2YsY0FBUyxHQUFHLENBQUMsQ0FB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Y29tbW9uJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlcixcclxuICBPbkNoYW5nZXMsIGNvbXB1dGVkLCBzaWduYWwsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBOZ1pvbmVcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUG9wb3ZlckRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcG9wb3Zlci5kaXJlY3RpdmUnO1xyXG5cclxuZXhwb3J0IHR5cGUgQmFyU2VyaWVzSXRlbSA9IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IG51bWJlcjsgY29sb3I/OiBzdHJpbmcgfTtcclxuZXhwb3J0IHR5cGUgQmFyR3JvdXAgPSB7IGxhYmVsOiBzdHJpbmc7IGl0ZW1zOiBCYXJTZXJpZXNJdGVtW10gfTtcclxuXHJcbnR5cGUgU2VyaWVzQ29sb3JNYXAgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG5cclxudHlwZSBCYXJSZWN0ID0ge1xyXG4gIGdyb3VwTGFiZWw6IHN0cmluZztcclxuICBzZXJpZXNMYWJlbDogc3RyaW5nO1xyXG4gIHZhbHVlOiBudW1iZXI7XHJcbiAgeDogbnVtYmVyO1xyXG4gIHk6IG51bWJlcjtcclxuICB3aWR0aDogbnVtYmVyO1xyXG4gIGhlaWdodDogbnVtYmVyO1xyXG4gIGNvbG9yOiBzdHJpbmc7XHJcbn07XHJcblxyXG50eXBlIEJhclN0cmlwZSA9IHsgeDogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2l1cy1jaGFydHMtYmFyLWdyb3VwZWQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUG9wb3ZlckRpcmVjdGl2ZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXJ0cy1iYXItZ3JvdXBlZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY2hhcnRzLWJhci1ncm91cGVkLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJdXNDaGFydHNCYXJHcm91cGVkQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGRhdGE6IEJhckdyb3VwW10gPSBbXTtcclxuICBASW5wdXQoKSBsZWdlbmRQb3NpdGlvbjogJ3JpZ2h0JyB8ICdib3R0b20nID0gJ2JvdHRvbSc7XHJcbiAgQElucHV0KCkgc2VyaWVzT3JkZXI/OiBzdHJpbmdbXTtcclxuXHJcbiAgLy8gTcOhcmdlbmVzIChsZWZ0ID0gYW5jaG8gcGFuZWwgZWplIFkpXHJcbiAgbWFyZ2luID0geyB0b3A6IDI0LCByaWdodDogMTYsIGJvdHRvbTogMzQsIGxlZnQ6IDQwIH07XHJcblxyXG4gIC8vIExheW91dCBYIGZpam9cclxuICBiYXJXaWR0aCA9IDExO1xyXG4gIGJhckdhcCA9IDI7XHJcbiAgZ3JvdXBHYXAgPSA0MDtcclxuICBvdXRlckdhcCA9IDE4O1xyXG5cclxuICAvLyBFc3RpbG8gYmFycmFcclxuICBiYXJSYWRpdXMgPSA1O1xyXG5cclxuICAvLyBFc2NhbGEgWVxyXG4gIHlNYXg/OiBudW1iZXI7XHJcbiAgdGlja3MgPSA1O1xyXG5cclxuICAvLyBGYWxsYmFja3Mgc2kgbm8gaGF5IHRhbWHDsW8gQ1NTIGV4dGVybm9cclxuICB3aWR0aCA9IDY0MDtcclxuICBzaXplID0gMzIwO1xyXG5cclxuICBASW5wdXQoKSBtYXhMYWJlbENoYXJzID0gMTA7XHJcblxyXG4gIEBPdXRwdXQoKSBiYXJDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBncm91cDogc3RyaW5nOyBzZXJpZXM6IHN0cmluZzsgdmFsdWU6IG51bWJlciB9PigpO1xyXG5cclxuICAvLyBSZWZzXHJcbiAgQFZpZXdDaGlsZCgncGFuZXMnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwYW5lc1JlZiE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+OyAgIC8vIOKGkCBhbHRvIHJlYWwgKGVqZVkrcGxvdClcclxuICBAVmlld0NoaWxkKCdwbG90Q3RuJywgeyBzdGF0aWM6IHRydWUgfSkgcGxvdEN0biE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+OyAgICAgLy8g4oaQIGFuY2hvIHZpc2libGUgKHNjcm9sbClcclxuICBwcml2YXRlIHJvPzogUmVzaXplT2JzZXJ2ZXI7XHJcblxyXG4gIC8vIEVzdGFkb1xyXG4gIHByaXZhdGUgX2JhcnMgPSBzaWduYWw8QmFyUmVjdFtdPihbXSk7XHJcbiAgcHJpdmF0ZSBfZ3JvdXBzID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XHJcbiAgcHJpdmF0ZSBfc2VyaWVzID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XHJcbiAgcHJpdmF0ZSBfY29sb3JzID0gc2lnbmFsPFNlcmllc0NvbG9yTWFwPih7fSk7XHJcbiAgcHJpdmF0ZSBfeU1heCA9IHNpZ25hbCgwKTtcclxuXHJcbiAgcHJpdmF0ZSBfcGFuZUggPSBzaWduYWwoMCk7ICAgICAvLyBhbHRvIHJlYWwgZGVsIHBhbmVsIHN1cGVyaW9yXHJcbiAgcHJpdmF0ZSBfcGxvdFcgPSBzaWduYWwoMCk7ICAgICAvLyBhbmNobyB2aXNpYmxlIGRlbCBwbG90XHJcbiAgcHJpdmF0ZSBfcGxvdFdpZHRoID0gc2lnbmFsKDApOyAvLyBhbmNobyB2aXJ0dWFsIGRlbCBTVkcgZGVyZWNob1xyXG4gIHByaXZhdGUgX2dyb3VwQ2VudGVycyA9IHNpZ25hbDxudW1iZXJbXT4oW10pO1xyXG4gIHByaXZhdGUgX2JhclN0cmlwZXMgPSBzaWduYWw8QmFyU3RyaXBlW10+KFtdKTtcclxuXHJcbiAgcmVhZG9ubHkgYmFycyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2JhcnMoKSk7XHJcbiAgcmVhZG9ubHkgZ3JvdXBzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fZ3JvdXBzKCkpO1xyXG4gIHJlYWRvbmx5IHNlcmllcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3NlcmllcygpKTtcclxuICByZWFkb25seSBjb2xvcnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9jb2xvcnMoKSk7XHJcbiAgcmVhZG9ubHkgeVNjYWxlTWF4ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5feU1heCgpKTtcclxuXHJcbiAgcmVhZG9ubHkgY2hhcnRIZWlnaHQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9wYW5lSCgpIHx8IHRoaXMuc2l6ZSk7IC8vIOKGkCBhbHR1cmEgcGFyYSBhbWJvcyBTVkdcclxuICByZWFkb25seSBwbG90V2lkdGggPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9wbG90V2lkdGgoKSk7XHJcbiAgcmVhZG9ubHkgZ3JvdXBDZW50ZXJzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fZ3JvdXBDZW50ZXJzKCkpO1xyXG4gIHJlYWRvbmx5IGJhclN0cmlwZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9iYXJTdHJpcGVzKCkpO1xyXG5cclxuICByZWFkb25seSBpbm5lckhlaWdodCA9IGNvbXB1dGVkKCgpID0+XHJcbiAgICBNYXRoLm1heCh0aGlzLmNoYXJ0SGVpZ2h0KCkgLSB0aGlzLm1hcmdpbi50b3AgLSB0aGlzLm1hcmdpbi5ib3R0b20sIDApXHJcbiAgKTtcclxuXHJcbiAgLy8gdmlld0JveCBwb3IgU1ZHXHJcbiAgcmVhZG9ubHkgYXhpc1ZpZXdCb3ggPSBjb21wdXRlZCgoKSA9PiBgMCAwICR7dGhpcy5tYXJnaW4ubGVmdH0gJHt0aGlzLmNoYXJ0SGVpZ2h0KCl9YCk7XHJcbiAgcmVhZG9ubHkgcGxvdFZpZXdCb3ggPSBjb21wdXRlZCgoKSA9PiBgMCAwICR7dGhpcy5wbG90V2lkdGgoKX0gJHt0aGlzLmNoYXJ0SGVpZ2h0KCl9YCk7XHJcblxyXG4gIHJlYWRvbmx5IE1hdGggPSBNYXRoO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSkgeyB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIE1lZGljacOzbiBpbmljaWFsIFNJTiBlc3BlcmFyIGFsIHByaW1lciB0aWNrIGRlbCBST1xyXG4gICAgdGhpcy5tZWFzdXJlTm93KCk7XHJcblxyXG4gICAgLy8gT2JzZXJ2YSBhbHRvIChwYW5lcykgeSBhbmNobyB2aXNpYmxlIChwbG90Q3RuKVxyXG4gICAgdGhpcy5ybyA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLm1lYXN1cmVOb3coKTtcclxuICAgICAgICBpZiAoY2hhbmdlZCkgdGhpcy5yZWNhbGMoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMucm8ub2JzZXJ2ZSh0aGlzLnBhbmVzUmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdGhpcy5yby5vYnNlcnZlKHRoaXMucGxvdEN0bi5uYXRpdmVFbGVtZW50KTtcclxuXHJcbiAgICAvLyBQcmltZXIgY8OhbGN1bG9cclxuICAgIHRoaXMucmVjYWxjKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHsgdGhpcy5ybz8uZGlzY29ubmVjdCgpOyB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQgeyB0aGlzLnJlY2FsYygpOyB9XHJcblxyXG4gIC8vIERldnVlbHZlIHRydWUgc2kgY2FtYmnDsyBhbGdvLlxyXG4gIHByaXZhdGUgbWVhc3VyZU5vdygpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHBhbmVIID0gTWF0aC5mbG9vcih0aGlzLnBhbmVzUmVmPy5uYXRpdmVFbGVtZW50Py5jbGllbnRIZWlnaHQgfHwgMCk7XHJcbiAgICBjb25zdCBwbG90VyA9IE1hdGguZmxvb3IodGhpcy5wbG90Q3RuPy5uYXRpdmVFbGVtZW50Py5jbGllbnRXaWR0aCB8fCAwKTtcclxuXHJcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgaWYgKHBhbmVIICYmIHBhbmVIICE9PSB0aGlzLl9wYW5lSCgpKSB7IHRoaXMuX3BhbmVILnNldChwYW5lSCk7IGNoYW5nZWQgPSB0cnVlOyB9XHJcbiAgICBpZiAocGxvdFcgJiYgcGxvdFcgIT09IHRoaXMuX3Bsb3RXKCkpIHsgdGhpcy5fcGxvdFcuc2V0KHBsb3RXKTsgY2hhbmdlZCA9IHRydWU7IH1cclxuXHJcbiAgICAvLyBTaSBubyBoYXkgdmFsb3JlcyBhw7puIChwb3IgcmVuZGVyIHRlbXByYW5vKSwgdXNhIGZhbGxiYWNrcyBwYXJhIG5vIHF1ZWRhcnRlIGVuIDBcclxuICAgIGlmICghdGhpcy5fcGFuZUgoKSkgeyB0aGlzLl9wYW5lSC5zZXQodGhpcy5zaXplKTsgY2hhbmdlZCA9IHRydWU7IH1cclxuICAgIGlmICghdGhpcy5fcGxvdFcoKSkgeyB0aGlzLl9wbG90Vy5zZXQodGhpcy53aWR0aCAtIHRoaXMubWFyZ2luLmxlZnQpOyBjaGFuZ2VkID0gdHJ1ZTsgfVxyXG5cclxuICAgIHJldHVybiBjaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWNhbGMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjbGVhbmVkID0gKHRoaXMuZGF0YSA/PyBbXSkubWFwKGcgPT4gKHtcclxuICAgICAgbGFiZWw6IGcubGFiZWwsXHJcbiAgICAgIGl0ZW1zOiAoZy5pdGVtcyA/PyBbXSkuZmlsdGVyKGkgPT4gTnVtYmVyKGk/LnZhbHVlKSA+PSAwKVxyXG4gICAgfSkpLmZpbHRlcih4ID0+IHguaXRlbXMubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgY29uc3QgZ3JvdXBzID0gY2xlYW5lZC5tYXAoZyA9PiBnLmxhYmVsKTtcclxuXHJcbiAgICAvLyBzZXJpZXMgKyBvcmRlblxyXG4gICAgY29uc3Qgc2VyaWVzU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICBmb3IgKGNvbnN0IGcgb2YgY2xlYW5lZCkgZm9yIChjb25zdCBpdCBvZiBnLml0ZW1zKSBzZXJpZXNTZXQuYWRkKGl0LmxhYmVsKTtcclxuICAgIGxldCBzZXJpZXMgPSBBcnJheS5mcm9tKHNlcmllc1NldCk7XHJcbiAgICBpZiAodGhpcy5zZXJpZXNPcmRlcj8ubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IG9yZGVyID0gbmV3IE1hcCh0aGlzLnNlcmllc09yZGVyLm1hcCgoaywgaWR4KSA9PiBbaywgaWR4XSkpO1xyXG4gICAgICBzZXJpZXMuc29ydCgoYSwgYikgPT4gKG9yZGVyLmdldChhKSA/PyAxZTkpIC0gKG9yZGVyLmdldChiKSA/PyAxZTkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb2xvcmVzIHBvciBzZXJpZVxyXG4gICAgY29uc3QgcGFsZXR0ZSA9IFtcclxuICAgICAgJyMyMTY3RkYnLCAvLyBJbmZvLTUwMFxyXG4gICAgICAnIzBBMjg5MycsIC8vIEluZm8tODAwXHJcbiAgICAgICcjNDBDQUU5JywgLy8gUHJpbWFyeS00MDBcclxuICAgICAgJyM1ODkyRkYnLCAvLyBJbmZvLTQwMFxyXG4gICAgICAnIzA4QTZEQicsIC8vIFByaW1hcnktNTAwXHJcbiAgICAgICcjQzRERkZGJywgLy8gSW5mby0yMDBcclxuICAgIF07XHJcbiAgICBjb25zdCBjb2xvck1hcDogU2VyaWVzQ29sb3JNYXAgPSB7fTtcclxuICAgIHNlcmllcy5mb3JFYWNoKChzLCBpKSA9PiBjb2xvck1hcFtzXSA9IHBhbGV0dGVbaSAlIHBhbGV0dGUubGVuZ3RoXSk7XHJcblxyXG4gICAgLy8gbm9ybWFsaXphclxyXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IGNsZWFuZWQubWFwKGcgPT4ge1xyXG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGcuaXRlbXMubWFwKGkgPT4gW2kubGFiZWwsIGldKSk7XHJcbiAgICAgIGNvbnN0IGl0ZW1zID0gc2VyaWVzLm1hcChzID0+IHtcclxuICAgICAgICBjb25zdCBpID0gbWFwLmdldChzKTtcclxuICAgICAgICByZXR1cm4geyBsYWJlbDogcywgdmFsdWU6IGk/LnZhbHVlID8/IDAsIGNvbG9yOiBpPy5jb2xvciA/PyBjb2xvck1hcFtzXSB9O1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIHsgbGFiZWw6IGcubGFiZWwsIGl0ZW1zIH07XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBZIG3DoXhcclxuICAgIGNvbnN0IG1heFZhbHVlID0gTWF0aC5tYXgoMCwgLi4ubm9ybWFsaXplZC5mbGF0TWFwKGcgPT4gZy5pdGVtcy5tYXAoaSA9PiBpLnZhbHVlKSkpO1xyXG4gICAgY29uc3QgeU1heCA9IHRoaXMueU1heCAmJiB0aGlzLnlNYXggPiAwID8gdGhpcy55TWF4IDogdGhpcy5uaWNlTWF4KG1heFZhbHVlKTtcclxuICAgIHRoaXMuX3lNYXguc2V0KHlNYXgpO1xyXG5cclxuICAgIC8vIGRpbWVuc2lvbmVzIHZpc2libGVzIGRlbCBwYW5lbCBkZXJlY2hvXHJcbiAgICBjb25zdCB2aXNpYmxlVyA9IHRoaXMuX3Bsb3RXKCkgfHwgKHRoaXMud2lkdGggLSB0aGlzLm1hcmdpbi5sZWZ0KTtcclxuXHJcbiAgICAvLyA9PT09PSBMYXlvdXQgWCBjb24gb3V0ZXJHYXAgPT09PT1cclxuICAgIGNvbnN0IEcgPSBub3JtYWxpemVkLmxlbmd0aDtcclxuICAgIGNvbnN0IFMgPSBzZXJpZXMubGVuZ3RoO1xyXG4gICAgY29uc3QgZ3JvdXBJbm5lcldpZHRoID0gUyAqIHRoaXMuYmFyV2lkdGggKyBNYXRoLm1heCgwLCBTIC0gMSkgKiB0aGlzLmJhckdhcDtcclxuICAgIGNvbnN0IGlubmVyTmF0dXJhbFdpZHRoID1cclxuICAgICAgTWF0aC5tYXgoMCwgKHRoaXMub3V0ZXJHYXAgKiAyKSArIEcgKiBncm91cElubmVyV2lkdGggKyBNYXRoLm1heCgwLCBHIC0gMSkgKiB0aGlzLmdyb3VwR2FwKTtcclxuXHJcbiAgICBjb25zdCBpbm5lclZpc2libGVXaWR0aCA9IE1hdGgubWF4KHZpc2libGVXIC0gdGhpcy5tYXJnaW4ucmlnaHQsIDApO1xyXG4gICAgY29uc3QgaW5uZXJWaXJ0dWFsV2lkdGggPSBNYXRoLm1heChpbm5lclZpc2libGVXaWR0aCwgaW5uZXJOYXR1cmFsV2lkdGgpO1xyXG4gICAgY29uc3QgcGxvdFdpZHRoID0gaW5uZXJWaXJ0dWFsV2lkdGggKyB0aGlzLm1hcmdpbi5yaWdodDsgLy8gc29sbyBtYXJnZW4gZGVyZWNobyBlbiBlbCBTVkcgZGVyZWNob1xyXG4gICAgdGhpcy5fcGxvdFdpZHRoLnNldChwbG90V2lkdGgpO1xyXG5cclxuICAgIC8vIHJlY3RzICsgZnJhbmphc1xyXG4gICAgY29uc3QgaWggPSB0aGlzLmlubmVySGVpZ2h0KCk7XHJcbiAgICBjb25zdCBiYXJzOiBCYXJSZWN0W10gPSBbXTtcclxuICAgIGNvbnN0IGNlbnRlcnM6IG51bWJlcltdID0gW107XHJcbiAgICBjb25zdCBzdHJpcGVzOiBCYXJTdHJpcGVbXSA9IFtdO1xyXG5cclxuICAgIGxldCBjdXJzb3IgPSB0aGlzLm91dGVyR2FwO1xyXG4gICAgbm9ybWFsaXplZC5mb3JFYWNoKGcgPT4ge1xyXG4gICAgICBjb25zdCBzdGFydFggPSBjdXJzb3I7XHJcbiAgICAgIGNvbnN0IGNlbnRlciA9IHN0YXJ0WCArIGdyb3VwSW5uZXJXaWR0aCAvIDI7XHJcbiAgICAgIGNlbnRlcnMucHVzaChjZW50ZXIpO1xyXG5cclxuICAgICAgZy5pdGVtcy5mb3JFYWNoKChpdCwgc2kpID0+IHtcclxuICAgICAgICBjb25zdCB4ID0gc3RhcnRYICsgc2kgKiAodGhpcy5iYXJXaWR0aCArIHRoaXMuYmFyR2FwKTtcclxuXHJcbiAgICAgICAgLy8gZnJhbmphIHBvciBiYXJyYVxyXG4gICAgICAgIHN0cmlwZXMucHVzaCh7IHgsIHdpZHRoOiB0aGlzLmJhcldpZHRoIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBoID0gaXQudmFsdWUgPD0gMCA/IDAgOiAoaXQudmFsdWUgLyB5TWF4KSAqIGloO1xyXG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLm1hcmdpbi50b3AgKyBpaCAtIGg7XHJcbiAgICAgICAgYmFycy5wdXNoKHtcclxuICAgICAgICAgIGdyb3VwTGFiZWw6IGcubGFiZWwsXHJcbiAgICAgICAgICBzZXJpZXNMYWJlbDogaXQubGFiZWwsXHJcbiAgICAgICAgICB2YWx1ZTogaXQudmFsdWUsXHJcbiAgICAgICAgICB4LCB5LFxyXG4gICAgICAgICAgd2lkdGg6IHRoaXMuYmFyV2lkdGgsXHJcbiAgICAgICAgICBoZWlnaHQ6IGgsXHJcbiAgICAgICAgICBjb2xvcjogaXQuY29sb3IgPz8gY29sb3JNYXBbaXQubGFiZWxdXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY3Vyc29yICs9IGdyb3VwSW5uZXJXaWR0aCArIHRoaXMuZ3JvdXBHYXA7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9iYXJzLnNldChiYXJzKTtcclxuICAgIHRoaXMuX2dyb3Vwcy5zZXQoZ3JvdXBzKTtcclxuICAgIHRoaXMuX3Nlcmllcy5zZXQoc2VyaWVzKTtcclxuICAgIHRoaXMuX2NvbG9ycy5zZXQoY29sb3JNYXApO1xyXG4gICAgdGhpcy5fZ3JvdXBDZW50ZXJzLnNldChjZW50ZXJzKTtcclxuICAgIHRoaXMuX2JhclN0cmlwZXMuc2V0KHN0cmlwZXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuaWNlTWF4KG1heFZhbDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGlmIChtYXhWYWwgPD0gMCkgcmV0dXJuIDE7XHJcbiAgICBjb25zdCBleHAgPSBNYXRoLmZsb29yKE1hdGgubG9nMTAobWF4VmFsKSk7XHJcbiAgICBjb25zdCBiYXNlID0gTWF0aC5wb3coMTAsIGV4cCk7XHJcbiAgICBjb25zdCBuID0gTWF0aC5jZWlsKG1heFZhbCAvIGJhc2UpO1xyXG4gICAgY29uc3QgbmljZSA9IG4gPD0gMiA/IDIgOiBuIDw9IDUgPyA1IDogMTA7XHJcbiAgICByZXR1cm4gbmljZSAqIGJhc2U7XHJcbiAgfVxyXG5cclxuICBnZXRZKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgY29uc3QgaWggPSB0aGlzLmlubmVySGVpZ2h0KCk7XHJcbiAgICBjb25zdCBtYXggPSB0aGlzLnlTY2FsZU1heCgpO1xyXG4gICAgcmV0dXJuIHRoaXMubWFyZ2luLnRvcCArIGloIC0gKHZhbHVlIC8gbWF4KSAqIGloO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHlUaWNrc0FycigpOiBudW1iZXJbXSB7XHJcbiAgICBjb25zdCBtYXggPSB0aGlzLnlTY2FsZU1heCgpO1xyXG4gICAgY29uc3QgbiA9IE1hdGgubWF4KDIsIHRoaXMudGlja3MgfCAwKTtcclxuICAgIGNvbnN0IHN0ZXAgPSBtYXggLyBuO1xyXG4gICAgY29uc3QgYXJyOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbjsgaSsrKSBhcnIucHVzaCgrKChpICogc3RlcCkpLnRvRml4ZWQoMikpO1xyXG4gICAgcmV0dXJuIGFycjtcclxuICB9XHJcblxyXG4gIHNob3J0TGFiZWwobGJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGxibC5sZW5ndGggPiB0aGlzLm1heExhYmVsQ2hhcnMgPyAobGJsLnNsaWNlKDAsIHRoaXMubWF4TGFiZWxDaGFycyAtIDEpICsgJ+KApicpIDogbGJsO1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0VG9vbHRpcChiOiBCYXJSZWN0KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHtiLmdyb3VwTGFiZWx9IOKAlCAke2Iuc2VyaWVzTGFiZWx9OiAke2IudmFsdWV9YDtcclxuICB9XHJcblxyXG4gIG9uQmFyQ2xpY2soYjogQmFyUmVjdCkge1xyXG4gICAgdGhpcy5iYXJDbGljay5lbWl0KHsgZ3JvdXA6IGIuZ3JvdXBMYWJlbCwgc2VyaWVzOiBiLnNlcmllc0xhYmVsLCB2YWx1ZTogYi52YWx1ZSB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNoYXJ0LXdyYXBwZXJcIiBbY2xhc3MuYm90dG9tXT1cImxlZ2VuZFBvc2l0aW9uID09PSAnYm90dG9tJ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBhbmVzXCIgI3BhbmVzPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJheGlzLWN0blwiPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY2hhcnQtYXhpc1wiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci52aWV3Qm94XT1cImF4aXNWaWV3Qm94KClcIlxyXG4gICAgICAgICAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz1cInhNaW5ZTWluIG1lZXRcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIm1hcmdpbi5sZWZ0XCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiY2hhcnRIZWlnaHQoKVwiPlxyXG4gICAgICAgICAgICAgICAgQGZvciAodCBvZiB5VGlja3NBcnI7IHRyYWNrIHQpIHtcclxuICAgICAgICAgICAgICAgIDx0ZXh0IGNsYXNzPVwieS10aWNrIGJvZHktc21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci54XT1cIm1hcmdpbi5sZWZ0IC0gNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnldPVwiZ2V0WSh0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYW5jaG9yPVwiZW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9taW5hbnQtYmFzZWxpbmU9XCJtaWRkbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyB0IH19XHJcbiAgICAgICAgICAgICAgICA8L3RleHQ+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGxvdC1jdG4gc2Nyb2xsYWJsZS1zbWFsbFwiICNwbG90Q3RuPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY2hhcnRcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIudmlld0JveF09XCJwbG90Vmlld0JveCgpXCJcclxuICAgICAgICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89XCJ4TWluWU1pbiBtZWV0XCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJwbG90V2lkdGgoKVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNoYXJ0SGVpZ2h0KClcIj5cclxuXHJcbiAgICAgICAgICAgICAgICBAZm9yIChzIG9mIGJhclN0cmlwZXMoKTsgdHJhY2sgcy54KSB7XHJcbiAgICAgICAgICAgICAgICA8cmVjdCBjbGFzcz1cImJhci1zdHJpcGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci54XT1cInMueFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnldPVwibWFyZ2luLnRvcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLndpZHRoXT1cInMud2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5oZWlnaHRdPVwiaW5uZXJIZWlnaHQoKVwiPjwvcmVjdD5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBAZm9yICh0IG9mIHlUaWNrc0FycjsgdHJhY2sgdCkge1xyXG4gICAgICAgICAgICAgICAgPGxpbmUgY2xhc3M9XCJncmlkLWxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci54MV09XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIueDJdPVwicGxvdFdpZHRoKCkgLSBtYXJnaW4ucmlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci55MV09XCJnZXRZKHQpXCIgW2F0dHIueTJdPVwiZ2V0WSh0KVwiLz5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBAZm9yIChnIG9mIGdyb3VwcygpOyB0cmFjayBnOyBsZXQgaSA9ICRpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgPHRleHQgY2xhc3M9XCJ4LWxhYmVsIGJvZHktc21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci54XT1cImdyb3VwQ2VudGVycygpW2ldXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIueV09XCJjaGFydEhlaWdodCgpIC0gbWFyZ2luLmJvdHRvbSArIDIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBzaG9ydExhYmVsKGcpIH19IDx0aXRsZT57eyBnIH19PC90aXRsZT5cclxuICAgICAgICAgICAgICAgIDwvdGV4dD5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBAZm9yIChiIG9mIGJhcnMoKTsgdHJhY2sgYi5ncm91cExhYmVsICsgJ18nICsgYi5zZXJpZXNMYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgPHJlY3QgY2xhc3M9XCJiYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci54XT1cImIueFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnldPVwiYi55XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIud2lkdGhdPVwiYi53aWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmhlaWdodF09XCJNYXRoLm1heChiLmhlaWdodCwgMClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5maWxsXT1cImIuY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5yeF09XCJiYXJSYWRpdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5yeV09XCJiYXJSYWRpdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXVzUG9wb3ZlckNvbnRlbnRdPVwiZm9ybWF0VG9vbHRpcChiKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkJhckNsaWNrKGIpXCIvPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8IS0tIExleWVuZGEgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGVnZW5kXCIgW2NsYXNzLmJvdHRvbV09XCJsZWdlbmRQb3NpdGlvbiA9PT0gJ2JvdHRvbSdcIj5cclxuICAgICAgICBAZm9yIChzIG9mIHNlcmllcygpOyB0cmFjayBzKSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG90XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiY29sb3JzKClbc11cIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwgY2FwdGlvbi1zbVwiPnt7IHMgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
238
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnRzLWJhci1ncm91cGVkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2l1cy1kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL2NoYXJ0cy1iYXItZ3JvdXBlZC9jaGFydHMtYmFyLWdyb3VwZWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaXVzLWRlc2lnbi1jb21wb25lbnRzL3NyYy9saWIvY2hhcnRzLWJhci1ncm91cGVkL2NoYXJ0cy1iYXItZ3JvdXBlZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFDM0IsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBRXZDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOztBQTJCbkUsTUFBTSxPQUFPLDRCQUE0QjtJQWlFdkMsWUFBb0IsSUFBWSxFQUFVLE1BQStCO1FBQXJELFNBQUksR0FBSixJQUFJLENBQVE7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUF5QjtRQWhFaEUsU0FBSSxHQUFlLEVBQUUsQ0FBQztRQUN0QixtQkFBYyxHQUF1QixRQUFRLENBQUM7UUFLdkQsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUVWLHlDQUF5QztRQUN6QyxVQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ1osU0FBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLGlEQUFpRDtRQUU3RCxzQkFBc0I7UUFDdEIsV0FBTSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3RELGFB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ckIsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQUdpQyxPQUFPO3NCQUE5QyxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLFxyXG4gIE9uQ2hhbmdlcywgY29tcHV0ZWQsIHNpZ25hbCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLFxyXG4gIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgTmdab25lXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFBvcG92ZXJEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3BvcG92ZXIuZGlyZWN0aXZlJztcclxuXHJcbmV4cG9ydCB0eXBlIEJhclNlcmllc0l0ZW0gPSB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBudW1iZXI7IGNvbG9yPzogc3RyaW5nIH07XHJcbmV4cG9ydCB0eXBlIEJhckdyb3VwID0geyBsYWJlbDogc3RyaW5nOyBpdGVtczogQmFyU2VyaWVzSXRlbVtdIH07XHJcblxyXG50eXBlIFNlcmllc0NvbG9yTWFwID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuXHJcbnR5cGUgQmFyUmVjdCA9IHtcclxuICBncm91cExhYmVsOiBzdHJpbmc7XHJcbiAgc2VyaWVzTGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogbnVtYmVyO1xyXG4gIHg6IG51bWJlcjtcclxuICB5OiBudW1iZXI7XHJcbiAgd2lkdGg6IG51bWJlcjtcclxuICBoZWlnaHQ6IG51bWJlcjtcclxuICBjb2xvcjogc3RyaW5nO1xyXG59O1xyXG5cclxudHlwZSBCYXJTdHJpcGUgPSB7IHg6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpdXMtY2hhcnRzLWJhci1ncm91cGVkJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFBvcG92ZXJEaXJlY3RpdmVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGFydHMtYmFyLWdyb3VwZWQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NoYXJ0cy1iYXItZ3JvdXBlZC5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSXVzQ2hhcnRzQmFyR3JvdXBlZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBkYXRhOiBCYXJHcm91cFtdID0gW107XHJcbiAgQElucHV0KCkgbGVnZW5kUG9zaXRpb246ICdyaWdodCcgfCAnYm90dG9tJyA9ICdib3R0b20nO1xyXG4gIEBJbnB1dCgpIHNlcmllc09yZGVyPzogc3RyaW5nW107XHJcblxyXG4gIC8vIEVzY2FsYSBZIChzZSBwdWVkZW4gZXhwb25lciBjb21vIEBJbnB1dCBzaSBxdWllcmVzKVxyXG4gIHlNYXg/OiBudW1iZXI7XHJcbiAgdGlja3MgPSA1O1xyXG5cclxuICAvLyBGYWxsYmFja3Mgc2kgbm8gaGF5IHRhbWHDsW8gQ1NTIGV4dGVybm9cclxuICB3aWR0aCA9IDY0MDtcclxuICBzaXplID0gMzIwOyAvLyBhbHRvIHBvciBkZWZlY3RvIGN1YW5kbyBlbCBob3N0IG5vIGZpamEgaGVpZ2h0XHJcblxyXG4gIC8vIE3DoXJnZW5lcyB5IGxheW91dCBYXHJcbiAgbWFyZ2luID0geyB0b3A6IDI0LCByaWdodDogMTYsIGJvdHRvbTogNTUsIGxlZnQ6IDQwIH07XHJcbiAgYmFyV2lkdGggPSAxMTtcclxuICBiYXJHYXAgPSAyO1xyXG4gIGdyb3VwR2FwID0gNDA7XHJcbiAgb3V0ZXJHYXAgPSAxODtcclxuXHJcbiAgLy8gRXN0aWxvIGJhcnJhXHJcbiAgYmFyUmFkaXVzID0gNTtcclxuXHJcbiAgQElucHV0KCkgbWF4TGFiZWxDaGFycyA9IDEwO1xyXG4gIEBPdXRwdXQoKSBiYXJDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBncm91cDogc3RyaW5nOyBzZXJpZXM6IHN0cmluZzsgdmFsdWU6IG51bWJlciB9PigpO1xyXG5cclxuICAvLyBTb2xvIG5lY2VzaXRhbW9zIG1lZGlyIEFOQ0hPIHZpc2libGUgZGVsIHBsb3RcclxuICBAVmlld0NoaWxkKCdwbG90Q3RuJywgeyBzdGF0aWM6IHRydWUgfSkgcGxvdEN0biE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG4gIHByaXZhdGUgcm8/OiBSZXNpemVPYnNlcnZlcjtcclxuICBwcml2YXRlIHJhZklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLy8gRXN0YWRvXHJcbiAgcHJpdmF0ZSBfYmFycyA9IHNpZ25hbDxCYXJSZWN0W10+KFtdKTtcclxuICBwcml2YXRlIF9ncm91cHMgPSBzaWduYWw8c3RyaW5nW10+KFtdKTtcclxuICBwcml2YXRlIF9zZXJpZXMgPSBzaWduYWw8c3RyaW5nW10+KFtdKTtcclxuICBwcml2YXRlIF9jb2xvcnMgPSBzaWduYWw8U2VyaWVzQ29sb3JNYXA+KHt9KTtcclxuICBwcml2YXRlIF95TWF4ID0gc2lnbmFsKDApO1xyXG5cclxuICBwcml2YXRlIF9wYW5lSCA9IHNpZ25hbCgwKTsgICAgIC8vIGFsdG8gcmVhbCBkZWwgaG9zdCAobyBmYWxsYmFjayBzaXplKVxyXG4gIHByaXZhdGUgX3Bsb3RXID0gc2lnbmFsKDApOyAgICAgLy8gYW5jaG8gdmlzaWJsZSBkZWwgY29udGVuZWRvciBzY3JvbGxlYWJsZVxyXG4gIHByaXZhdGUgX3Bsb3RXaWR0aCA9IHNpZ25hbCgwKTsgLy8gYW5jaG8gdmlydHVhbCBkZWwgU1ZHIGRlcmVjaG9cclxuICBwcml2YXRlIF9ncm91cENlbnRlcnMgPSBzaWduYWw8bnVtYmVyW10+KFtdKTtcclxuICBwcml2YXRlIF9iYXJTdHJpcGVzID0gc2lnbmFsPEJhclN0cmlwZVtdPihbXSk7XHJcblxyXG4gIC8vIERlcml2YWRvc1xyXG4gIHJlYWRvbmx5IGJhcnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9iYXJzKCkpO1xyXG4gIHJlYWRvbmx5IGdyb3VwcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2dyb3VwcygpKTtcclxuICByZWFkb25seSBzZXJpZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9zZXJpZXMoKSk7XHJcbiAgcmVhZG9ubHkgY29sb3JzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fY29sb3JzKCkpO1xyXG4gIHJlYWRvbmx5IHlTY2FsZU1heCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3lNYXgoKSk7XHJcblxyXG4gIHJlYWRvbmx5IGNoYXJ0SGVpZ2h0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fcGFuZUgoKSB8fCB0aGlzLnNpemUpO1xyXG4gIHJlYWRvbmx5IHBsb3RXaWR0aCAgID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fcGxvdFdpZHRoKCkpO1xyXG4gIHJlYWRvbmx5IGdyb3VwQ2VudGVycyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2dyb3VwQ2VudGVycygpKTtcclxuICByZWFkb25seSBiYXJTdHJpcGVzICAgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9iYXJTdHJpcGVzKCkpO1xyXG5cclxuICByZWFkb25seSBpbm5lckhlaWdodCA9IGNvbXB1dGVkKCgpID0+XHJcbiAgICBNYXRoLm1heCh0aGlzLmNoYXJ0SGVpZ2h0KCkgLSB0aGlzLm1hcmdpbi50b3AgLSB0aGlzLm1hcmdpbi5ib3R0b20sIDApXHJcbiAgKTtcclxuXHJcbiAgcmVhZG9ubHkgYXhpc1ZpZXdCb3ggPSBjb21wdXRlZCgoKSA9PiBgMCAwICR7dGhpcy5tYXJnaW4ubGVmdH0gJHt0aGlzLmNoYXJ0SGVpZ2h0KCl9YCk7XHJcbiAgcmVhZG9ubHkgcGxvdFZpZXdCb3ggPSBjb21wdXRlZCgoKSA9PiBgMCAwICR7dGhpcy5wbG90V2lkdGgoKX0gJHt0aGlzLmNoYXJ0SGVpZ2h0KCl9YCk7XHJcblxyXG4gIHJlYWRvbmx5IE1hdGggPSBNYXRoO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSwgcHJpdmF0ZSBob3N0RWw6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7fVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAvLyBNZWRpY2nDs24gaW5pY2lhbCBlbiBlbCBwcsOzeGltbyBmcmFtZSBwYXJhIGV2aXRhciBFeHByZXNzaW9uQ2hhbmdlZCB5IGxvb3BzXHJcbiAgICB0aGlzLnJhZigoKSA9PiB7XHJcbiAgICAgIHRoaXMubWVhc3VyZU5vdygpO1xyXG4gICAgICB0aGlzLnJlY2FsYygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gT2JzZXJ2YSBhbHRvIGRlbCBIT1NUIHkgYW5jaG8gdmlzaWJsZSBkZWwgcGxvdCwgdGhyb3R0bGVkIHBvciByQUZcclxuICAgIHRoaXMucm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJhZigoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hhbmdlZCA9IHRoaXMubWVhc3VyZU5vdygpO1xyXG4gICAgICAgIGlmIChjaGFuZ2VkKSB0aGlzLnJlY2FsYygpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5yby5vYnNlcnZlKHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdGhpcy5yby5vYnNlcnZlKHRoaXMucGxvdEN0bi5uYXRpdmVFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5ybz8uZGlzY29ubmVjdCgpO1xyXG4gICAgaWYgKHRoaXMucmFmSWQgIT09IG51bGwpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMucmFmSWQpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICAvLyBDYW1iaW9zIGRlIEBJbnB1dCBkaXNwYXJhbiByZWPDoWxjdWxvXHJcbiAgICB0aGlzLnJlY2FsYygpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09IE1lZGljacOzbiA9PT09PT09PT1cclxuICAvKiogRWplY3V0YSB1bmEgdGFyZWEgZW4gZWwgcHLDs3hpbW8gZnJhbWUgZGVudHJvIGRlIEFuZ3VsYXIgKi9cclxuICBwcml2YXRlIHJhZihmbjogKCkgPT4gdm9pZCkge1xyXG4gICAgaWYgKHRoaXMucmFmSWQgIT09IG51bGwpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMucmFmSWQpO1xyXG4gICAgdGhpcy5yYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnpvbmUucnVuKGZuKSk7XHJcbiAgfVxyXG5cclxuICAvKiogTWlkZSBhbHRvIGRlbCBob3N0IHkgYW5jaG8gdmlzaWJsZSBkZWwgcGxvdC4gRGV2dWVsdmUgdHJ1ZSBzaSBjYW1iacOzIGFsZ28uICovXHJcbiAgcHJpdmF0ZSBtZWFzdXJlTm93KCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaG9zdEggPSBNYXRoLmZsb29yKHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IDApO1xyXG4gICAgY29uc3QgcGFuZUggPSBob3N0SCA+IDAgPyBob3N0SCA6IHRoaXMuc2l6ZTtcclxuXHJcbiAgICBjb25zdCBwbG90VyA9IE1hdGguZmxvb3IodGhpcy5wbG90Q3RuPy5uYXRpdmVFbGVtZW50Py5jbGllbnRXaWR0aCB8fCAwKVxyXG4gICAgICAgICAgICAgICB8fCAodGhpcy53aWR0aCAtIHRoaXMubWFyZ2luLmxlZnQpO1xyXG5cclxuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XHJcbiAgICBpZiAocGFuZUggIT09IHRoaXMuX3BhbmVIKCkpIHsgdGhpcy5fcGFuZUguc2V0KHBhbmVIKTsgY2hhbmdlZCA9IHRydWU7IH1cclxuICAgIGlmIChwbG90VyAhPT0gdGhpcy5fcGxvdFcoKSkgeyB0aGlzLl9wbG90Vy5zZXQocGxvdFcpOyBjaGFuZ2VkID0gdHJ1ZTsgfVxyXG4gICAgcmV0dXJuIGNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT0gTGF5b3V0ICYgZGF0YSA9PT09PT09PT1cclxuICBwcml2YXRlIHJlY2FsYygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNsZWFuZWQgPSAodGhpcy5kYXRhID8/IFtdKVxyXG4gICAgICAubWFwKGcgPT4gKHsgbGFiZWw6IGcubGFiZWwsIGl0ZW1zOiAoZy5pdGVtcyA/PyBbXSkuZmlsdGVyKGkgPT4gTnVtYmVyKGk/LnZhbHVlKSA+PSAwKSB9KSlcclxuICAgICAgLmZpbHRlcih4ID0+IHguaXRlbXMubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgY29uc3QgZ3JvdXBzID0gY2xlYW5lZC5tYXAoZyA9PiBnLmxhYmVsKTtcclxuXHJcbiAgICAvLyBzZXJpZXMgKyBvcmRlblxyXG4gICAgY29uc3Qgc2VyaWVzU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICBmb3IgKGNvbnN0IGcgb2YgY2xlYW5lZCkgZm9yIChjb25zdCBpdCBvZiBnLml0ZW1zKSBzZXJpZXNTZXQuYWRkKGl0LmxhYmVsKTtcclxuICAgIGxldCBzZXJpZXMgPSBBcnJheS5mcm9tKHNlcmllc1NldCk7XHJcbiAgICBpZiAodGhpcy5zZXJpZXNPcmRlcj8ubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IG9yZGVyID0gbmV3IE1hcCh0aGlzLnNlcmllc09yZGVyLm1hcCgoaywgaWR4KSA9PiBbaywgaWR4XSkpO1xyXG4gICAgICBzZXJpZXMuc29ydCgoYSwgYikgPT4gKG9yZGVyLmdldChhKSA/PyAxZTkpIC0gKG9yZGVyLmdldChiKSA/PyAxZTkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb2xvcmVzIHBvciBzZXJpZVxyXG4gICAgY29uc3QgcGFsZXR0ZSA9IFtcclxuICAgICAgJyMyMTY3RkYnLCAvLyBJbmZvLTUwMFxyXG4gICAgICAnIzBBMjg5MycsIC8vIEluZm8tODAwXHJcbiAgICAgICcjNDBDQUU5JywgLy8gUHJpbWFyeS00MDBcclxuICAgICAgJyM1ODkyRkYnLCAvLyBJbmZvLTQwMFxyXG4gICAgICAnIzA4QTZEQicsIC8vIFByaW1hcnktNTAwXHJcbiAgICAgICcjQzRERkZGJywgLy8gSW5mby0yMDBcclxuICAgIF07XHJcbiAgICBjb25zdCBjb2xvck1hcDogU2VyaWVzQ29sb3JNYXAgPSB7fTtcclxuICAgIHNlcmllcy5mb3JFYWNoKChzLCBpKSA9PiAoY29sb3JNYXBbc10gPSBwYWxldHRlW2kgJSBwYWxldHRlLmxlbmd0aF0pKTtcclxuXHJcbiAgICAvLyBub3JtYWxpemFyXHJcbiAgICBjb25zdCBub3JtYWxpemVkID0gY2xlYW5lZC5tYXAoZyA9PiB7XHJcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZy5pdGVtcy5tYXAoaSA9PiBbaS5sYWJlbCwgaV0pKTtcclxuICAgICAgY29uc3QgaXRlbXMgPSBzZXJpZXMubWFwKHMgPT4ge1xyXG4gICAgICAgIGNvbnN0IGkgPSBtYXAuZ2V0KHMpO1xyXG4gICAgICAgIHJldHVybiB7IGxhYmVsOiBzLCB2YWx1ZTogaT8udmFsdWUgPz8gMCwgY29sb3I6IGk/LmNvbG9yID8/IGNvbG9yTWFwW3NdIH07XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4geyBsYWJlbDogZy5sYWJlbCwgaXRlbXMgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFkgbcOheFxyXG4gICAgY29uc3QgbWF4VmFsdWUgPSBNYXRoLm1heCgwLCAuLi5ub3JtYWxpemVkLmZsYXRNYXAoZyA9PiBnLml0ZW1zLm1hcChpID0+IGkudmFsdWUpKSk7XHJcbiAgICBjb25zdCB5TWF4ID0gdGhpcy55TWF4ICYmIHRoaXMueU1heCA+IDAgPyB0aGlzLnlNYXggOiB0aGlzLm5pY2VNYXgobWF4VmFsdWUpO1xyXG4gICAgdGhpcy5feU1heC5zZXQoeU1heCk7XHJcblxyXG4gICAgLy8gRGltZW5zaW9uZXMgdmlzaWJsZXMgZGVsIHBhbmVsIGRlcmVjaG9cclxuICAgIGNvbnN0IHZpc2libGVXID0gdGhpcy5fcGxvdFcoKSB8fCAodGhpcy53aWR0aCAtIHRoaXMubWFyZ2luLmxlZnQpO1xyXG5cclxuICAgIC8vID09PT09IExheW91dCBYIGNvbiBvdXRlckdhcCA9PT09PVxyXG4gICAgY29uc3QgRyA9IG5vcm1hbGl6ZWQubGVuZ3RoO1xyXG4gICAgY29uc3QgUyA9IHNlcmllcy5sZW5ndGg7XHJcbiAgICBjb25zdCBncm91cElubmVyV2lkdGggPSBTICogdGhpcy5iYXJXaWR0aCArIE1hdGgubWF4KDAsIFMgLSAxKSAqIHRoaXMuYmFyR2FwO1xyXG4gICAgY29uc3QgaW5uZXJOYXR1cmFsV2lkdGggPVxyXG4gICAgICBNYXRoLm1heCgwLCAodGhpcy5vdXRlckdhcCAqIDIpICsgRyAqIGdyb3VwSW5uZXJXaWR0aCArIE1hdGgubWF4KDAsIEcgLSAxKSAqIHRoaXMuZ3JvdXBHYXApO1xyXG5cclxuICAgIGNvbnN0IGlubmVyVmlzaWJsZVdpZHRoID0gTWF0aC5tYXgodmlzaWJsZVcgLSB0aGlzLm1hcmdpbi5yaWdodCwgMCk7XHJcbiAgICBjb25zdCBpbm5lclZpcnR1YWxXaWR0aCA9IE1hdGgubWF4KGlubmVyVmlzaWJsZVdpZHRoLCBpbm5lck5hdHVyYWxXaWR0aCk7XHJcbiAgICBjb25zdCBwbG90V2lkdGggPSBpbm5lclZpcnR1YWxXaWR0aCArIHRoaXMubWFyZ2luLnJpZ2h0O1xyXG4gICAgdGhpcy5fcGxvdFdpZHRoLnNldChwbG90V2lkdGgpO1xyXG5cclxuICAgIC8vIENvbnN0cnVjY2nDs24gZGUgYmFycmFzICsgZnJhbmphc1xyXG4gICAgY29uc3QgaWggPSB0aGlzLmlubmVySGVpZ2h0KCk7XHJcbiAgICBjb25zdCBiYXJzOiBCYXJSZWN0W10gPSBbXTtcclxuICAgIGNvbnN0IGNlbnRlcnM6IG51bWJlcltdID0gW107XHJcbiAgICBjb25zdCBzdHJpcGVzOiBCYXJTdHJpcGVbXSA9IFtdO1xyXG5cclxuICAgIGxldCBjdXJzb3IgPSB0aGlzLm91dGVyR2FwO1xyXG4gICAgbm9ybWFsaXplZC5mb3JFYWNoKGcgPT4ge1xyXG4gICAgICBjb25zdCBzdGFydFggPSBjdXJzb3I7XHJcbiAgICAgIGNvbnN0IGNlbnRlciA9IHN0YXJ0WCArIGdyb3VwSW5uZXJXaWR0aCAvIDI7XHJcbiAgICAgIGNlbnRlcnMucHVzaChjZW50ZXIpO1xyXG5cclxuICAgICAgZy5pdGVtcy5mb3JFYWNoKChpdCwgc2kpID0+IHtcclxuICAgICAgICBjb25zdCB4ID0gc3RhcnRYICsgc2kgKiAodGhpcy5iYXJXaWR0aCArIHRoaXMuYmFyR2FwKTtcclxuXHJcbiAgICAgICAgc3RyaXBlcy5wdXNoKHsgeCwgd2lkdGg6IHRoaXMuYmFyV2lkdGggfSk7IC8vIGZyYW5qYSBwb3IgYmFycmFcclxuXHJcbiAgICAgICAgY29uc3QgaCA9IGl0LnZhbHVlIDw9IDAgPyAwIDogKGl0LnZhbHVlIC8geU1heCkgKiBpaDtcclxuICAgICAgICBjb25zdCB5ID0gdGhpcy5tYXJnaW4udG9wICsgaWggLSBoO1xyXG4gICAgICAgIGJhcnMucHVzaCh7XHJcbiAgICAgICAgICBncm91cExhYmVsOiBnLmxhYmVsLFxyXG4gICAgICAgICAgc2VyaWVzTGFiZWw6IGl0LmxhYmVsLFxyXG4gICAgICAgICAgdmFsdWU6IGl0LnZhbHVlLFxyXG4gICAgICAgICAgeCwgeSwgd2lkdGg6IHRoaXMuYmFyV2lkdGgsIGhlaWdodDogaCxcclxuICAgICAgICAgIGNvbG9yOiBpdC5jb2xvciA/PyBjb2xvck1hcFtpdC5sYWJlbF1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjdXJzb3IgKz0gZ3JvdXBJbm5lcldpZHRoICsgdGhpcy5ncm91cEdhcDtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX2JhcnMuc2V0KGJhcnMpO1xyXG4gICAgdGhpcy5fZ3JvdXBzLnNldChncm91cHMpO1xyXG4gICAgdGhpcy5fc2VyaWVzLnNldChzZXJpZXMpO1xyXG4gICAgdGhpcy5fY29sb3JzLnNldChjb2xvck1hcCk7XHJcbiAgICB0aGlzLl9ncm91cENlbnRlcnMuc2V0KGNlbnRlcnMpO1xyXG4gICAgdGhpcy5fYmFyU3RyaXBlcy5zZXQoc3RyaXBlcyk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT0gSGVscGVycyA9PT09PT09PT1cclxuICBwcml2YXRlIG5pY2VNYXgobWF4VmFsOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgaWYgKG1heFZhbCA8PSAwKSByZXR1cm4gMTtcclxuICAgIGNvbnN0IGV4cCA9IE1hdGguZmxvb3IoTWF0aC5sb2cxMChtYXhWYWwpKTtcclxuICAgIGNvbnN0IGJhc2UgPSBNYXRoLnBvdygxMCwgZXhwKTtcclxuICAgIGNvbnN0IG4gPSBNYXRoLmNlaWwobWF4VmFsIC8gYmFzZSk7XHJcbiAgICBjb25zdCBuaWNlID0gbiA8PSAyID8gMiA6IG4gPD0gNSA/IDUgOiAxMDtcclxuICAgIHJldHVybiBuaWNlICogYmFzZTtcclxuICB9XHJcblxyXG4gIGdldFkodmFsdWU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCBpaCA9IHRoaXMuaW5uZXJIZWlnaHQoKTtcclxuICAgIGNvbnN0IG1heCA9IHRoaXMueVNjYWxlTWF4KCk7XHJcbiAgICByZXR1cm4gdGhpcy5tYXJnaW4udG9wICsgaWggLSAodmFsdWUgLyBtYXgpICogaWg7XHJcbiAgfVxyXG5cclxuICBnZXQgeVRpY2tzQXJyKCk6IG51bWJlcltdIHtcclxuICAgIGNvbnN0IG1heCA9IHRoaXMueVNjYWxlTWF4KCk7XHJcbiAgICBjb25zdCBuID0gTWF0aC5tYXgoMiwgdGhpcy50aWNrcyB8IDApO1xyXG4gICAgY29uc3Qgc3RlcCA9IG1heCAvIG47XHJcbiAgICBjb25zdCBhcnI6IG51bWJlcltdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBuOyBpKyspIGFyci5wdXNoKCsoKGkgKiBzdGVwKSkudG9GaXhlZCgyKSk7XHJcbiAgICByZXR1cm4gYXJyO1xyXG4gIH1cclxuXHJcbiAgc2hvcnRMYWJlbChsYmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbGJsLmxlbmd0aCA+IHRoaXMubWF4TGFiZWxDaGFycyA/IChsYmwuc2xpY2UoMCwgdGhpcy5tYXhMYWJlbENoYXJzIC0gMSkgKyAn4oCmJykgOiBsYmw7XHJcbiAgfVxyXG5cclxuICBmb3JtYXRUb29sdGlwKGI6IEJhclJlY3QpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke2Iuc2VyaWVzTGFiZWx9OiAke2IudmFsdWV9YDtcclxuICB9XHJcblxyXG4gIG9uQmFyQ2xpY2soYjogQmFyUmVjdCkge1xyXG4gICAgdGhpcy5iYXJDbGljay5lbWl0KHsgZ3JvdXA6IGIuZ3JvdXBMYWJlbCwgc2VyaWVzOiBiLnNlcmllc0xhYmVsLCB2YWx1ZTogYi52YWx1ZSB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNoYXJ0LXdyYXBwZXJcIiBbY2xhc3MuYm90dG9tXT1cImxlZ2VuZFBvc2l0aW9uID09PSAnYm90dG9tJ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBhbmVzXCIgI3BhbmVzPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJheGlzLWN0blwiPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY2hhcnQtYXhpc1wiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci52aWV3Qm94XT1cImF4aXNWaWV3Qm94KClcIlxyXG4gICAgICAgICAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz1cInhNaW5ZTWluIG1lZXRcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIm1hcmdpbi5sZWZ0XCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiY2hhcnRIZWlnaHQoKVwiPlxyXG4gICAgICAgICAgICAgICAgQGZvciAodCBvZiB5VGlja3NBcnI7IHRyYWNrIHQpIHtcclxuICAgICAgICAgICAgICAgIDx0ZXh0IGNsYXNzPVwieS10aWNrIGJvZHktc21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci54XT1cIm1hcmdpbi5sZWZ0IC0gNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnldPVwiZ2V0WSh0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYW5jaG9yPVwiZW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9taW5hbnQtYmFzZWxpbmU9XCJtaWRkbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyB0IH19XHJcbiAgICAgICAgICAgICAgICA8L3RleHQ+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGxvdC1jdG4gc2Nyb2xsYWJsZS1zbWFsbFwiICNwbG90Q3RuPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY2hhcnRcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIudmlld0JveF09XCJwbG90Vmlld0JveCgpXCJcclxuICAgICAgICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89XCJ4TWluWU1pbiBtZWV0XCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJwbG90V2lkdGgoKVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNoYXJ0SGVpZ2h0KClcIj5cclxuXHJcbiAgICAgICAgICAgICAgICBAZm9yIChzIG9mIGJhclN0cmlwZXMoKTsgdHJhY2sgcy54KSB7XHJcbiAgICAgICAgICAgICAgICA8cmVjdCBjbGFzcz1cImJhci1zdHJpcGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci54XT1cInMueFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnldPVwibWFyZ2luLnRvcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLndpZHRoXT1cInMud2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5oZWlnaHRdPVwiaW5uZXJIZWlnaHQoKVwiPjwvcmVjdD5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBAZm9yICh0IG9mIHlUaWNrc0FycjsgdHJhY2sgdCkge1xyXG4gICAgICAgICAgICAgICAgPGxpbmUgY2xhc3M9XCJncmlkLWxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci54MV09XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIueDJdPVwicGxvdFdpZHRoKCkgLSBtYXJnaW4ucmlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci55MV09XCJnZXRZKHQpXCIgW2F0dHIueTJdPVwiZ2V0WSh0KVwiLz5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBAZm9yIChnIG9mIGdyb3VwcygpOyB0cmFjayBnOyBsZXQgaSA9ICRpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgPHRleHQgY2xhc3M9XCJ4LWxhYmVsIGJvZHktc21cIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnhdPVwiZ3JvdXBDZW50ZXJzKClbaV1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnldPVwiY2hhcnRIZWlnaHQoKSAtIG1hcmdpbi5ib3R0b20gKyA2XCJcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZG9taW5hbnQtYmFzZWxpbmU9XCJoYW5naW5nXCJcclxuICAgICAgICAgICAgICAgICAgICBbaXVzUG9wb3ZlckNvbnRlbnRdPVwiZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHNob3J0TGFiZWwoZykgfX1cclxuICAgICAgICAgICAgICAgIDwvdGV4dD5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBAZm9yIChiIG9mIGJhcnMoKTsgdHJhY2sgYi5ncm91cExhYmVsICsgJyAtICcgKyBiLnNlcmllc0xhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICA8cmVjdCBjbGFzcz1cImJhclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnhdPVwiYi54XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIueV09XCJiLnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci53aWR0aF09XCJiLndpZHRoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cIk1hdGgubWF4KGIuaGVpZ2h0LCAwKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmZpbGxdPVwiYi5jb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJ4XT1cImJhclJhZGl1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJ5XT1cImJhclJhZGl1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpdXNQb3BvdmVyQ29udGVudF09XCJmb3JtYXRUb29sdGlwKGIpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQmFyQ2xpY2soYilcIi8+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwhLS0gTGV5ZW5kYSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJsZWdlbmRcIiBbY2xhc3MuYm90dG9tXT1cImxlZ2VuZFBvc2l0aW9uID09PSAnYm90dG9tJ1wiPlxyXG4gICAgICAgIEBmb3IgKHMgb2Ygc2VyaWVzKCk7IHRyYWNrIHMpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWl0ZW1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3RcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJjb2xvcnMoKVtzXVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbCBjYXB0aW9uLXNtXCIgW2l1c1BvcG92ZXJDb250ZW50XT1cInNcIj57eyBzIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|