@alauda-fe/common
Version:
Alauda frontend team common codes.
235 lines (234 loc) • 19.4 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, } from '@angular/core';
import { Subject, merge, map, takeUntil } from 'rxjs';
import { ContextChartService } from '../../chart.service';
import { Orientation } from '../../types';
import * as i0 from "@angular/core";
import * as i1 from "../../chart.service";
import * as i2 from "@angular/common";
import * as i3 from "../../../core/pipes/pure.pipe";
const _c0 = ["aclYAxisTicks", ""];
function YAxisTicksComponent_ng_container_0__svg_g_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(0, "g")(1, "text", 4);
i0.ɵɵtext(2);
i0.ɵɵpipe(3, "pure");
i0.ɵɵelementEnd();
i0.ɵɵelement(4, "line", 5)(5, "line", 6);
i0.ɵɵelementEnd();
} if (rf & 2) {
const tick_r1 = ctx.$implicit;
const ctx_r1 = i0.ɵɵnextContext(2);
i0.ɵɵadvance();
i0.ɵɵattribute("y", tick_r1.y);
i0.ɵɵadvance();
i0.ɵɵtextInterpolate2(" ", i0.ɵɵpipeBind2(3, 8, tick_r1.value, ctx_r1.conversionMaximum), "", ctx_r1.suffix, " ");
i0.ɵɵadvance(2);
i0.ɵɵattribute("y1", tick_r1.y)("y2", tick_r1.y);
i0.ɵɵadvance();
i0.ɵɵattribute("x2", ctx_r1.context == null ? null : ctx_r1.context.chartView == null ? null : ctx_r1.context.chartView.width)("y1", tick_r1.y)("y2", tick_r1.y);
} }
function YAxisTicksComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵtemplate(1, YAxisTicksComponent_ng_container_0__svg_g_1_Template, 6, 11, "g", 2);
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(2, "g");
i0.ɵɵelement(3, "path", 3);
i0.ɵɵelementEnd();
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵadvance();
i0.ɵɵproperty("ngForOf", ctx_r1.ticks);
i0.ɵɵadvance(2);
i0.ɵɵattribute("d", ctx_r1.yAxisLine);
} }
function YAxisTicksComponent_ng_template_1__svg_g_0__svg_line_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵnamespaceSVG();
i0.ɵɵelement(0, "line", 9);
} if (rf & 2) {
const tick_r3 = i0.ɵɵnextContext().$implicit;
const ctx_r1 = i0.ɵɵnextContext(2);
i0.ɵɵattribute("x1", tick_r3.x)("x2", tick_r3.x)("y1", 0)("y2", -(ctx_r1.context == null ? null : ctx_r1.context.chartView == null ? null : ctx_r1.context.chartView.height));
} }
function YAxisTicksComponent_ng_template_1__svg_g_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(0, "g")(1, "text", 7);
i0.ɵɵtext(2);
i0.ɵɵpipe(3, "pure");
i0.ɵɵelementEnd();
i0.ɵɵtemplate(4, YAxisTicksComponent_ng_template_1__svg_g_0__svg_line_4_Template, 1, 4, "line", 8);
i0.ɵɵelementEnd();
} if (rf & 2) {
const tick_r3 = ctx.$implicit;
const i_r4 = ctx.index;
const ctx_r1 = i0.ɵɵnextContext(2);
i0.ɵɵadvance();
i0.ɵɵattribute("x", i_r4 === 0 && ctx_r1.suffix ? tick_r3.x - 5 : tick_r3.x)("y", tick_r3.y + 16)("text-anchor", ctx_r1.textAnchor);
i0.ɵɵadvance();
i0.ɵɵtextInterpolate2(" ", i0.ɵɵpipeBind2(3, 6, tick_r3.value, ctx_r1.conversionMaximum), "", ctx_r1.suffix, " ");
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", i_r4 !== ctx_r1.ticks.length - 1);
} }
function YAxisTicksComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, YAxisTicksComponent_ng_template_1__svg_g_0_Template, 5, 9, "g", 2);
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(1, "g");
i0.ɵɵelement(2, "path", 3);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵproperty("ngForOf", ctx_r1.ticks);
i0.ɵɵadvance(2);
i0.ɵɵattribute("d", ctx_r1.xAxisLine);
} }
export class YAxisTicksComponent {
get yAxisLine() {
return `M${0} ${0}L${0} ${this.context.chartView.height}Z`;
}
get xAxisLine() {
const { width } = this.context.chartView;
return `M0 0L${width} 0Z`;
}
getTicks() {
const ticks = this.context.y.ticks(this.getMaxTicks(this.intervalWidth));
return ticks.map(value => {
const res = this.context.y(value);
return {
value,
y: this.context.horizontal ? 0 : res,
x: res,
};
});
}
getMaxTicks(tickHeight) {
const height = this.context.horizontal
? this.context.chartView.width
: this.context.chartView.height;
return Math.floor(height / tickHeight);
}
constructor(context, cd) {
this.context = context;
this.cd = cd;
this.intervalWidth = 40;
this.orientation = Orientation;
this.textAnchor = 'middle';
this.destroy$$ = new Subject();
}
ngOnInit() {
this.ticks = this.getTicks();
this.cd.detectChanges();
merge(this.context.seriesData$, this.context.legendChange$$)
.pipe(takeUntil(this.destroy$$), map(() => this.getTicks()))
.subscribe(res => {
this.ticks = res;
this.cd.detectChanges();
});
}
conversionMaximum(value) {
const unit = 'k';
if (value >= 1000) {
const num = +(value / 1000).toFixed(2);
return `${num}${unit}`;
}
return value;
}
ngOnDestroy() {
this.destroy$$.next();
}
static { this.ɵfac = function YAxisTicksComponent_Factory(t) { return new (t || YAxisTicksComponent)(i0.ɵɵdirectiveInject(i1.ContextChartService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: YAxisTicksComponent, selectors: [["g", "aclYAxisTicks", ""]], inputs: { intervalWidth: "intervalWidth", suffix: "suffix" }, attrs: _c0, decls: 3, vars: 2, consts: [["elseTemplate", ""], [4, "ngIf", "ngIfElse"], [4, "ngFor", "ngForOf"], ["stroke", "#ccd6eb", "fill", "none"], ["x", "-8", "fill", "#666", "text-anchor", "end", "font-size", "11", "alignment-baseline", "middle"], ["x1", "-4", "x2", "0", "stroke-width", "1", "stroke", "#ccd6eb"], ["x1", "0", "stroke-width", "1", "stroke-dasharray", "4 1", "stroke", "#e8e8e8"], ["fill", "#666", "font-size", "11"], ["stroke-width", "1", "stroke-dasharray", "4 1", "stroke", "#e8e8e8", 4, "ngIf"], ["stroke-width", "1", "stroke-dasharray", "4 1", "stroke", "#e8e8e8"]], template: function YAxisTicksComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, YAxisTicksComponent_ng_container_0_Template, 4, 2, "ng-container", 1)(1, YAxisTicksComponent_ng_template_1_Template, 3, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
} if (rf & 2) {
const elseTemplate_r5 = i0.ɵɵreference(2);
i0.ɵɵproperty("ngIf", ctx.context.barOptions.orientation === ctx.orientation.VERTICAL)("ngIfElse", elseTemplate_r5);
} }, dependencies: [i2.NgForOf, i2.NgIf, i3.PurePipe], encapsulation: 2, changeDetection: 0 }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(YAxisTicksComponent, [{
type: Component,
args: [{
// eslint-disable-next-line @angular-eslint/component-selector
selector: 'g[aclYAxisTicks]',
template: `
<ng-container
*ngIf="
context.barOptions.orientation === orientation.VERTICAL;
else elseTemplate
"
>
<svg:g *ngFor="let tick of ticks">
<text
x="-8"
[attr.y]="tick.y"
fill="#666"
text-anchor="end"
font-size="11"
alignment-baseline="middle"
>
{{ tick.value | pure: conversionMaximum }}{{ suffix }}
</text>
<line
x1="-4"
x2="0"
[attr.y1]="tick.y"
[attr.y2]="tick.y"
stroke-width="1"
stroke="#ccd6eb"
></line>
<line
x1="0"
[attr.x2]="context?.chartView?.width"
[attr.y1]="tick.y"
[attr.y2]="tick.y"
stroke-width="1"
stroke-dasharray="4 1"
stroke="#e8e8e8"
></line>
</svg:g>
<svg:g>
<path
[attr.d]="yAxisLine"
stroke="#ccd6eb"
fill="none"
/>
</svg:g>
</ng-container>
<ng-template #elseTemplate>
<svg:g *ngFor="let tick of ticks; let i = index">
<text
[attr.x]="i === 0 && suffix ? tick.x - 5 : tick.x"
[attr.y]="tick.y + 16"
fill="#666"
[attr.text-anchor]="textAnchor"
font-size="11"
>
{{ tick.value | pure: conversionMaximum }}{{ suffix }}
</text>
<line
*ngIf="i !== ticks.length - 1"
[attr.x1]="tick.x"
[attr.x2]="tick.x"
[attr.y1]="0"
[attr.y2]="-context?.chartView?.height"
stroke-width="1"
stroke-dasharray="4 1"
stroke="#e8e8e8"
></line>
</svg:g>
<svg:g>
<path
[attr.d]="xAxisLine"
stroke="#ccd6eb"
fill="none"
/>
</svg:g>
</ng-template>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
}]
}], () => [{ type: i1.ContextChartService }, { type: i0.ChangeDetectorRef }], { intervalWidth: [{
type: Input
}], suffix: [{
type: Input
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(YAxisTicksComponent, { className: "YAxisTicksComponent" }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieS1heGlzLXRpY2tzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9jaGFydC9jb21tb24vYXhpcy95LWF4aXMtdGlja3MuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEdBR04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7Ozs7OztJQWFsQyxBQURGLHlCQUFrQyxjQVEvQjtJQUNDLFlBQ0Y7O0lBQUEsaUJBQU87SUFTUCxBQVJBLDBCQU9RLGNBU0E7SUFDVixpQkFBUTs7OztJQXpCSixjQUFpQjs7SUFNakIsY0FDRjtJQURFLGlIQUNGO0lBSUUsZUFBa0I7O0lBT2xCLGNBQXFDOzs7O0lBM0IzQyw2QkFLQztJQUNDLHFGQUFrQzs7SUE2QmxDLHlCQUFPO0lBQ0wsMEJBSUU7SUFDSixpQkFBUTs7OztJQW5DZ0IsY0FBUTtJQUFSLHNDQUFRO0lBK0I1QixlQUFvQjs7Ozs7SUFrQnRCLDBCQVNROzs7Ozs7OztJQWxCUixBQURGLHlCQUFpRCxjQU85QztJQUNDLFlBQ0Y7O0lBQUEsaUJBQU87SUFDUCxrR0FTQztJQUNILGlCQUFROzs7OztJQWxCSixjQUFrRDs7SUFNbEQsY0FDRjtJQURFLGlIQUNGO0lBRUcsZUFBNEI7SUFBNUIsdURBQTRCOzs7SUFYakMsbUZBQWlEOztJQXFCakQseUJBQU87SUFDTCwwQkFJRTtJQUNKLGlCQUFROzs7SUEzQmdCLHNDQUFVO0lBdUI5QixlQUFvQjs7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SSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO29GQXJFVSxtQkFBbUI7b0VBQW5CLG1CQUFtQjtZQWpDNUIsQUE1Q0Esc0ZBS0Msd0dBdUMwQjs7O1lBekNkLEFBRlYsc0ZBRVUsNkJBRWpCOzs7aUZBd0VhLG1CQUFtQjtjQWpGL0IsU0FBUztlQUFDO2dCQUNULDhEQUE4RDtnQkFDOUQsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyRVQ7Z0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07YUFDaEQ7b0ZBRVUsYUFBYTtrQkFBckIsS0FBSztZQUVHLE1BQU07a0JBQWQsS0FBSzs7a0ZBSEssbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBtZXJnZSwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ29udGV4dENoYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uL2NoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgT3JpZW50YXRpb24gfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2dbYWNsWUF4aXNUaWNrc10nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGNvbnRleHQuYmFyT3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gb3JpZW50YXRpb24uVkVSVElDQUw7XG4gICAgICAgIGVsc2UgZWxzZVRlbXBsYXRlXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxzdmc6ZyAqbmdGb3I9XCJsZXQgdGljayBvZiB0aWNrc1wiPlxuICAgICAgICA8dGV4dFxuICAgICAgICAgIHg9XCItOFwiXG4gICAgICAgICAgW2F0dHIueV09XCJ0aWNrLnlcIlxuICAgICAgICAgIGZpbGw9XCIjNjY2XCJcbiAgICAgICAgICB0ZXh0LWFuY2hvcj1cImVuZFwiXG4gICAgICAgICAgZm9udC1zaXplPVwiMTFcIlxuICAgICAgICAgIGFsaWdubWVudC1iYXNlbGluZT1cIm1pZGRsZVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyB0aWNrLnZhbHVlIHwgcHVyZTogY29udmVyc2lvbk1heGltdW0gfX17eyBzdWZmaXggfX1cbiAgICAgICAgPC90ZXh0PlxuICAgICAgICA8bGluZVxuICAgICAgICAgIHgxPVwiLTRcIlxuICAgICAgICAgIHgyPVwiMFwiXG4gICAgICAgICAgW2F0dHIueTFdPVwidGljay55XCJcbiAgICAgICAgICBbYXR0ci55Ml09XCJ0aWNrLnlcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICAgIHN0cm9rZT1cIiNjY2Q2ZWJcIlxuICAgICAgICA+PC9saW5lPlxuICAgICAgICA8bGluZVxuICAgICAgICAgIHgxPVwiMFwiXG4gICAgICAgICAgW2F0dHIueDJdPVwiY29udGV4dD8uY2hhcnRWaWV3Py53aWR0aFwiXG4gICAgICAgICAgW2F0dHIueTFdPVwidGljay55XCJcbiAgICAgICAgICBbYXR0ci55Ml09XCJ0aWNrLnlcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI0IDFcIlxuICAgICAgICAgIHN0cm9rZT1cIiNlOGU4ZThcIlxuICAgICAgICA+PC9saW5lPlxuICAgICAgPC9zdmc6Zz5cbiAgICAgIDxzdmc6Zz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBbYXR0ci5kXT1cInlBeGlzTGluZVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI2NjZDZlYlwiXG4gICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAvPlxuICAgICAgPC9zdmc6Zz5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjZWxzZVRlbXBsYXRlPlxuICAgICAgPHN2ZzpnICpuZ0Zvcj1cImxldCB0aWNrIG9mIHRpY2tzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgW2F0dHIueF09XCJpID09PSAwICYmIHN1ZmZpeCA/IHRpY2sueCAtIDUgOiB0aWNrLnhcIlxuICAgICAgICAgIFthdHRyLnldPVwidGljay55ICsgMTZcIlxuICAgICAgICAgIGZpbGw9XCIjNjY2XCJcbiAgICAgICAgICBbYXR0ci50ZXh0LWFuY2hvcl09XCJ0ZXh0QW5jaG9yXCJcbiAgICAgICAgICBmb250LXNpemU9XCIxMVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyB0aWNrLnZhbHVlIHwgcHVyZTogY29udmVyc2lvbk1heGltdW0gfX17eyBzdWZmaXggfX1cbiAgICAgICAgPC90ZXh0PlxuICAgICAgICA8bGluZVxuICAgICAgICAgICpuZ0lmPVwiaSAhPT0gdGlja3MubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgW2F0dHIueDFdPVwidGljay54XCJcbiAgICAgICAgICBbYXR0ci54Ml09XCJ0aWNrLnhcIlxuICAgICAgICAgIFthdHRyLnkxXT1cIjBcIlxuICAgICAgICAgIFthdHRyLnkyXT1cIi1jb250ZXh0Py5jaGFydFZpZXc/LmhlaWdodFwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheT1cIjQgMVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI2U4ZThlOFwiXG4gICAgICAgID48L2xpbmU+XG4gICAgICA8L3N2ZzpnPlxuICAgICAgPHN2ZzpnPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIFthdHRyLmRdPVwieEF4aXNMaW5lXCJcbiAgICAgICAgICBzdHJva2U9XCIjY2NkNmViXCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgIC8+XG4gICAgICA8L3N2ZzpnPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBZQXhpc1RpY2tzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBpbnRlcnZhbFdpZHRoID0gNDA7XG5cbiAgQElucHV0KCkgc3VmZml4OiBzdHJpbmc7XG5cbiAgdGlja3M6IEFycmF5PHsgdmFsdWU6IG51bWJlcjsgeTogbnVtYmVyOyB4OiBudW1iZXIgfT47XG4gIG9yaWVudGF0aW9uID0gT3JpZW50YXRpb247XG4gIHRleHRBbmNob3IgPSAnbWlkZGxlJztcblxuICBkZXN0cm95JCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGdldCB5QXhpc0xpbmUoKSB7XG4gICAgcmV0dXJuIGBNJHswfSAkezB9TCR7MH0gJHt0aGlzLmNvbnRleHQuY2hhcnRWaWV3LmhlaWdodH1aYDtcbiAgfVxuXG4gIGdldCB4QXhpc0xpbmUoKSB7XG4gICAgY29uc3QgeyB3aWR0aCB9ID0gdGhpcy5jb250ZXh0LmNoYXJ0VmlldztcbiAgICByZXR1cm4gYE0wIDBMJHt3aWR0aH0gMFpgO1xuICB9XG5cbiAgZ2V0VGlja3MoKSB7XG4gICAgY29uc3QgdGlja3MgPSB0aGlzLmNvbnRleHQueS50aWNrcyh0aGlzLmdldE1heFRpY2tzKHRoaXMuaW50ZXJ2YWxXaWR0aCkpO1xuICAgIHJldHVybiB0aWNrcy5tYXAodmFsdWUgPT4ge1xuICAgICAgY29uc3QgcmVzID0gdGhpcy5jb250ZXh0LnkodmFsdWUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHk6IHRoaXMuY29udGV4dC5ob3Jpem9udGFsID8gMCA6IHJlcyxcbiAgICAgICAgeDogcmVzLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldE1heFRpY2tzKHRpY2tIZWlnaHQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5jb250ZXh0Lmhvcml6b250YWxcbiAgICAgID8gdGhpcy5jb250ZXh0LmNoYXJ0Vmlldy53aWR0aFxuICAgICAgOiB0aGlzLmNvbnRleHQuY2hhcnRWaWV3LmhlaWdodDtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihoZWlnaHQgLyB0aWNrSGVpZ2h0KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBjb250ZXh0OiBDb250ZXh0Q2hhcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy50aWNrcyA9IHRoaXMuZ2V0VGlja3MoKTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICBtZXJnZSh0aGlzLmNvbnRleHQuc2VyaWVzRGF0YSQsIHRoaXMuY29udGV4dC5sZWdlbmRDaGFuZ2UkJClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCQpLFxuICAgICAgICBtYXAoKCkgPT4gdGhpcy5nZXRUaWNrcygpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgdGhpcy50aWNrcyA9IHJlcztcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNvbnZlcnNpb25NYXhpbXVtKHZhbHVlOiBudW1iZXIpIHtcbiAgICBjb25zdCB1bml0ID0gJ2snO1xuICAgIGlmICh2YWx1ZSA+PSAxMDAwKSB7XG4gICAgICBjb25zdCBudW0gPSArKHZhbHVlIC8gMTAwMCkudG9GaXhlZCgyKTtcbiAgICAgIHJldHVybiBgJHtudW19JHt1bml0fWA7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveSQkLm5leHQoKTtcbiAgfVxufVxuIl19