ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
202 lines • 26.1 kB
JavaScript
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { DOCUMENT } from '@angular/common';
import { Component, EventEmitter, Inject, Input, Output, ViewChild } from '@angular/core';
import { calculateColor, calculateOffset } from '../util/util';
import { HandlerComponent } from './handler.component';
import { PaletteComponent } from './palette.component';
import * as i0 from "@angular/core";
function getPosition(e) {
const obj = 'touches' in e ? e.touches[0] : e;
const scrollXOffset = document.documentElement.scrollLeft || document.body.scrollLeft || window.pageXOffset;
const scrollYOffset = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset;
return { pageX: obj.pageX - scrollXOffset, pageY: obj.pageY - scrollYOffset };
}
export class PickerComponent {
toRgbString() {
return this.color?.toRgbString();
}
toHsb() {
return `hsl(${this.color?.toHsb().h},100%, 50%)`;
}
constructor(cdr, document) {
this.cdr = cdr;
this.document = document;
this.color = null;
this.nzOnChange = new EventEmitter();
this.nzOnChangeComplete = new EventEmitter();
this.disabled = false;
this.offsetValue = { x: 0, y: 0 };
this.dragRef = false;
this.mouseMoveRef = () => null;
this.mouseUpRef = () => null;
this.updateOffset = (e, direction = 'y') => {
const { pageX, pageY } = getPosition(e);
const { x: rectX, y: rectY, width, height } = this.containerRef?.nativeElement?.getBoundingClientRect() || { x: 0, y: 0, width: 0, height: 0 };
const { width: targetWidth, height: targetHeight } = this.transformRef?.nativeElement?.getBoundingClientRect() || {
width: 0,
height: 0
};
const centerOffsetX = targetWidth / 2;
const centerOffsetY = targetHeight / 2;
const offsetX = Math.max(0, Math.min(pageX - rectX, width)) - centerOffsetX;
const offsetY = Math.max(0, Math.min(pageY - rectY, height)) - centerOffsetY;
const calcOffset = {
x: offsetX,
y: direction === 'x' ? this.offsetValue.y : offsetY
};
// Exclusion of boundary cases
if ((targetWidth === 0 && targetHeight === 0) || targetWidth !== targetHeight) {
return;
}
this.offsetValue = calcOffset;
this.nzOnChange.emit(calculateColor(calcOffset, this.containerRef.nativeElement, this.transformRef.nativeElement, this.color));
this.cdr.detectChanges();
};
this.onDragMove = (e) => {
e.preventDefault();
this.updateOffset(e);
};
this.onDragStop = (e) => {
e.preventDefault();
this.dragRef = false;
this.document.removeEventListener('mousemove', this.onDragMove);
this.document.removeEventListener('mouseup', this.mouseUpRef);
this.document.removeEventListener('touchmove', this.mouseMoveRef);
this.document.removeEventListener('touchend', this.mouseUpRef);
this.mouseMoveRef = () => null;
this.mouseUpRef = () => null;
this.nzOnChangeComplete?.emit();
};
this.onDragStart = (e) => {
if (this.disabled) {
return;
}
this.updateOffset(e);
this.dragRef = true;
this.document.addEventListener('mousemove', this.onDragMove);
this.document.addEventListener('mouseup', this.onDragStop);
this.document.addEventListener('touchmove', this.onDragMove);
this.document.addEventListener('touchend', this.onDragStop);
this.mouseMoveRef = this.onDragMove;
this.mouseUpRef = this.onDragStop;
this.cdr.markForCheck();
};
}
ngOnInit() {
this.document.removeEventListener('mousemove', this.mouseMoveRef);
this.document.removeEventListener('mouseup', this.mouseUpRef);
this.document.removeEventListener('touchmove', this.mouseMoveRef);
this.document.removeEventListener('touchend', this.mouseUpRef);
this.mouseMoveRef = () => null;
this.mouseUpRef = () => null;
}
ngOnChanges(changes) {
const { color } = changes;
if (color) {
if (!this.dragRef && this.containerRef && this.transformRef) {
const calcOffset = calculateOffset(this.containerRef.nativeElement, this.transformRef.nativeElement, this.color);
if (calcOffset) {
this.offsetValue = calcOffset;
this.cdr.detectChanges();
}
}
}
}
ngAfterViewInit() {
if (!this.dragRef && this.containerRef && this.transformRef) {
const calcOffset = calculateOffset(this.containerRef.nativeElement, this.transformRef.nativeElement, this.color);
if (calcOffset) {
this.offsetValue = calcOffset;
this.cdr.detectChanges();
}
}
}
dragStartHandle(e) {
this.onDragStart(e);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: PickerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.4", type: PickerComponent, isStandalone: true, selector: "color-picker", inputs: { color: "color", disabled: "disabled" }, outputs: { nzOnChange: "nzOnChange", nzOnChangeComplete: "nzOnChangeComplete" }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["slider"], descendants: true }, { propertyName: "transformRef", first: true, predicate: ["transform"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
<div
#slider
class="ant-color-picker-select"
(mousedown)="dragStartHandle($event)"
(touchstart)="dragStartHandle($event)"
>
<color-palette>
<div
#transform
style="position: absolute; z-index: 1;"
[style.left]="offsetValue.x + 'px'"
[style.top]="offsetValue.y + 'px'"
>
<color-handler [color]="toRgbString()" />
</div>
<div
class="ant-color-picker-saturation"
style="
background-image: linear-gradient(0deg, #000, transparent),
linear-gradient(90deg, #fff, hsla(0, 0%, 100%, 0));
"
[style.background-color]="toHsb()"
></div>
</color-palette>
</div>
`, isInline: true, dependencies: [{ kind: "component", type: HandlerComponent, selector: "color-handler", inputs: ["color", "size"] }, { kind: "component", type: PaletteComponent, selector: "color-palette" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: PickerComponent, decorators: [{
type: Component,
args: [{
// eslint-disable-next-line @angular-eslint/component-selector
selector: 'color-picker',
standalone: true,
imports: [HandlerComponent, PaletteComponent],
template: `
<div
#slider
class="ant-color-picker-select"
(mousedown)="dragStartHandle($event)"
(touchstart)="dragStartHandle($event)"
>
<color-palette>
<div
#transform
style="position: absolute; z-index: 1;"
[style.left]="offsetValue.x + 'px'"
[style.top]="offsetValue.y + 'px'"
>
<color-handler [color]="toRgbString()" />
</div>
<div
class="ant-color-picker-saturation"
style="
background-image: linear-gradient(0deg, #000, transparent),
linear-gradient(90deg, #fff, hsla(0, 0%, 100%, 0));
"
[style.background-color]="toHsb()"
></div>
</color-palette>
</div>
`
}]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }], propDecorators: { containerRef: [{
type: ViewChild,
args: ['slider', { static: false }]
}], transformRef: [{
type: ViewChild,
args: ['transform', { static: false }]
}], color: [{
type: Input
}], nzOnChange: [{
type: Output
}], nzOnChangeComplete: [{
type: Output
}], disabled: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudHMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3BpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFHTCxTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUl2QixPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFNdkQsU0FBUyxXQUFXLENBQUMsQ0FBWTtJQUMvQixNQUFNLEdBQUcsR0FBRyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUM1RyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQzFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssR0FBRyxhQUFhLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsYUFBYSxFQUFFLENBQUM7QUFDaEYsQ0FB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJULDREQTNCUyxnQkFBZ0IscUZBQUUsZ0JBQWdCOzsyRkE2QmpDLGVBQWU7a0JBakMzQixTQUFTO21CQUFDO29CQUNULDhEQUE4RDtvQkFDOUQsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQztvQkFDN0MsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCVDtpQkFDRjs7MEJBeUJJLE1BQU07MkJBQUMsUUFBUTt5Q0F2QnNCLFlBQVk7c0JBQW5ELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDSyxZQUFZO3NCQUF0RCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRWhDLEtBQUs7c0JBQWIsS0FBSztnQkFDYSxVQUFVO3NCQUE1QixNQUFNO2dCQUNZLGtCQUFrQjtzQkFBcEMsTUFBTTtnQkFDRSxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb2xvcic7XG5pbXBvcnQgeyBIc2JhQ29sb3JUeXBlLCBUcmFuc2Zvcm1PZmZzZXQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3R5cGUnO1xuaW1wb3J0IHsgY2FsY3VsYXRlQ29sb3IsIGNhbGN1bGF0ZU9mZnNldCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBIYW5kbGVyQ29tcG9uZW50IH0gZnJvbSAnLi9oYW5kbGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYWxldHRlQ29tcG9uZW50IH0gZnJvbSAnLi9wYWxldHRlLmNvbXBvbmVudCc7XG5cbnR5cGUgRXZlbnRUeXBlID0gTW91c2VFdmVudCB8IFRvdWNoRXZlbnQ7XG5cbnR5cGUgRXZlbnRIYW5kbGUgPSAoZTogRXZlbnRUeXBlKSA9PiB2b2lkO1xuXG5mdW5jdGlvbiBnZXRQb3NpdGlvbihlOiBFdmVudFR5cGUpOiB7IHBhZ2VYOiBudW1iZXI7IHBhZ2VZOiBudW1iZXIgfSB7XG4gIGNvbnN0IG9iaiA9ICd0b3VjaGVzJyBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcbiAgY29uc3Qgc2Nyb2xsWE9mZnNldCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCB8fCB3aW5kb3cucGFnZVhPZmZzZXQ7XG4gIGNvbnN0IHNjcm9sbFlPZmZzZXQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIHx8IHdpbmRvdy5wYWdlWU9mZnNldDtcbiAgcmV0dXJuIHsgcGFnZVg6IG9iai5wYWdlWCAtIHNjcm9sbFhPZmZzZXQsIHBhZ2VZOiBvYmoucGFnZVkgLSBzY3JvbGxZT2Zmc2V0IH07XG59XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2NvbG9yLXBpY2tlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtIYW5kbGVyQ29tcG9uZW50LCBQYWxldHRlQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICAjc2xpZGVyXG4gICAgICBjbGFzcz1cImFudC1jb2xvci1waWNrZXItc2VsZWN0XCJcbiAgICAgIChtb3VzZWRvd24pPVwiZHJhZ1N0YXJ0SGFuZGxlKCRldmVudClcIlxuICAgICAgKHRvdWNoc3RhcnQpPVwiZHJhZ1N0YXJ0SGFuZGxlKCRldmVudClcIlxuICAgID5cbiAgICAgIDxjb2xvci1wYWxldHRlPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgI3RyYW5zZm9ybVxuICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB6LWluZGV4OiAxO1wiXG4gICAgICAgICAgW3N0eWxlLmxlZnRdPVwib2Zmc2V0VmFsdWUueCArICdweCdcIlxuICAgICAgICAgIFtzdHlsZS50b3BdPVwib2Zmc2V0VmFsdWUueSArICdweCdcIlxuICAgICAgICA+XG4gICAgICAgICAgPGNvbG9yLWhhbmRsZXIgW2NvbG9yXT1cInRvUmdiU3RyaW5nKClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiYW50LWNvbG9yLXBpY2tlci1zYXR1cmF0aW9uXCJcbiAgICAgICAgICBzdHlsZT1cIlxuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoMGRlZywgIzAwMCwgdHJhbnNwYXJlbnQpLFxuICAgICAgICAgIGxpbmVhci1ncmFkaWVudCg5MGRlZywgI2ZmZiwgaHNsYSgwLCAwJSwgMTAwJSwgMCkpO1xuICAgICAgXCJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJ0b0hzYigpXCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgPC9jb2xvci1wYWxldHRlPlxuICAgIDwvZGl2PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIFBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgQFZpZXdDaGlsZCgnc2xpZGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGNvbnRhaW5lclJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd0cmFuc2Zvcm0nLCB7IHN0YXRpYzogZmFsc2UgfSkgdHJhbnNmb3JtUmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQElucHV0KCkgY29sb3I6IENvbG9yIHwgbnVsbCA9IG51bGw7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDb2xvcj4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25DaGFuZ2VDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8SHNiYUNvbG9yVHlwZT4oKTtcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBvZmZzZXRWYWx1ZTogVHJhbnNmb3JtT2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07XG4gIGRyYWdSZWY6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbW91c2VNb3ZlUmVmOiAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpID0+IHZvaWQgPSAoKSA9PiBudWxsO1xuICBtb3VzZVVwUmVmOiAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpID0+IHZvaWQgPSAoKSA9PiBudWxsO1xuXG4gIHRvUmdiU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29sb3I/LnRvUmdiU3RyaW5nKCkgYXMgc3RyaW5nO1xuICB9XG5cbiAgdG9Ic2IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGhzbCgke3RoaXMuY29sb3I/LnRvSHNiKCkuaH0sMTAwJSwgNTAlKWA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnRcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3VzZU1vdmVSZWYpO1xuICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcFJlZik7XG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm1vdXNlTW92ZVJlZik7XG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMubW91c2VVcFJlZik7XG4gICAgdGhpcy5tb3VzZU1vdmVSZWYgPSAoKSA9PiBudWxsO1xuICAgIHRoaXMubW91c2VVcFJlZiA9ICgpID0+IG51bGw7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb2xvciB9ID0gY2hhbmdlcztcblxuICAgIGlmIChjb2xvcikge1xuICAgICAgaWYgKCF0aGlzLmRyYWdSZWYgJiYgdGhpcy5jb250YWluZXJSZWYgJiYgdGhpcy50cmFuc2Zvcm1SZWYpIHtcbiAgICAgICAgY29uc3QgY2FsY09mZnNldCA9IGNhbGN1bGF0ZU9mZnNldChcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgIHRoaXMudHJhbnNmb3JtUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgdGhpcy5jb2xvclxuICAgICAgICApO1xuICAgICAgICBpZiAoY2FsY09mZnNldCkge1xuICAgICAgICAgIHRoaXMub2Zmc2V0VmFsdWUgPSBjYWxjT2Zmc2V0O1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1JlZiAmJiB0aGlzLmNvbnRhaW5lclJlZiAmJiB0aGlzLnRyYW5zZm9ybVJlZikge1xuICAgICAgY29uc3QgY2FsY09mZnNldCA9IGNhbGN1bGF0ZU9mZnNldCh0aGlzLmNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLnRyYW5zZm9ybVJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbG9yKTtcbiAgICAgIGlmIChjYWxjT2Zmc2V0KSB7XG4gICAgICAgIHRoaXMub2Zmc2V0VmFsdWUgPSBjYWxjT2Zmc2V0O1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZHJhZ1N0YXJ0SGFuZGxlKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vbkRyYWdTdGFydChlKTtcbiAgfVxuXG4gIHVwZGF0ZU9mZnNldDogRXZlbnRIYW5kbGUgPSAoZTogRXZlbnRUeXBlLCBkaXJlY3Rpb246ICd4JyB8ICd5JyA9ICd5JykgPT4ge1xuICAgIGNvbnN0IHsgcGFnZVgsIHBhZ2VZIH0gPSBnZXRQb3NpdGlvbihlKTtcbiAgICBjb25zdCB7XG4gICAgICB4OiByZWN0WCxcbiAgICAgIHk6IHJlY3RZLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gdGhpcy5jb250YWluZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHx8IHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgIGNvbnN0IHsgd2lkdGg6IHRhcmdldFdpZHRoLCBoZWlnaHQ6IHRhcmdldEhlaWdodCB9ID0gdGhpcy50cmFuc2Zvcm1SZWY/Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHx8IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcblxuICAgIGNvbnN0IGNlbnRlck9mZnNldFggPSB0YXJnZXRXaWR0aCAvIDI7XG4gICAgY29uc3QgY2VudGVyT2Zmc2V0WSA9IHRhcmdldEhlaWdodCAvIDI7XG5cbiAgICBjb25zdCBvZmZzZXRYID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFnZVggLSByZWN0WCwgd2lkdGgpKSAtIGNlbnRlck9mZnNldFg7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VZIC0gcmVjdFksIGhlaWdodCkpIC0gY2VudGVyT2Zmc2V0WTtcblxuICAgIGNvbnN0IGNhbGNPZmZzZXQgPSB7XG4gICAgICB4OiBvZmZzZXRYLFxuICAgICAgeTogZGlyZWN0aW9uID09PSAneCcgPyB0aGlzLm9mZnNldFZhbHVlLnkgOiBvZmZzZXRZXG4gICAgfTtcbiAgICAvLyBFeGNsdXNpb24gb2YgYm91bmRhcnkgY2FzZXNcbiAgICBpZiAoKHRhcmdldFdpZHRoID09PSAwICYmIHRhcmdldEhlaWdodCA9PT0gMCkgfHwgdGFyZ2V0V2lkdGggIT09IHRhcmdldEhlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9mZnNldFZhbHVlID0gY2FsY09mZnNldDtcbiAgICB0aGlzLm56T25DaGFuZ2UuZW1pdChcbiAgICAgIGNhbGN1bGF0ZUNvbG9yKGNhbGNPZmZzZXQsIHRoaXMuY29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMudHJhbnNmb3JtUmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuY29sb3IpXG4gICAgKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH07XG5cbiAgb25EcmFnTW92ZTogRXZlbnRIYW5kbGUgPSAoZTogRXZlbnRUeXBlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMudXBkYXRlT2Zmc2V0KGUpO1xuICB9O1xuXG4gIG9uRHJhZ1N0b3A6IEV2ZW50SGFuZGxlID0gKGU6IEV2ZW50VHlwZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmRyYWdSZWYgPSBmYWxzZTtcbiAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25EcmFnTW92ZSk7XG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5tb3VzZVVwUmVmKTtcbiAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMubW91c2VNb3ZlUmVmKTtcbiAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5tb3VzZVVwUmVmKTtcbiAgICB0aGlzLm1vdXNlTW92ZVJlZiA9ICgpID0+IG51bGw7XG4gICAgdGhpcy5tb3VzZVVwUmVmID0gKCkgPT4gbnVsbDtcbiAgICB0aGlzLm56T25DaGFuZ2VDb21wbGV0ZT8uZW1pdCgpO1xuICB9O1xuXG4gIG9uRHJhZ1N0YXJ0OiBFdmVudEhhbmRsZSA9IChlOiBFdmVudFR5cGUpID0+IHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZU9mZnNldChlKTtcbiAgICB0aGlzLmRyYWdSZWYgPSB0cnVlO1xuICAgIHRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbkRyYWdNb3ZlKTtcbiAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uRHJhZ1N0b3ApO1xuICAgIHRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vbkRyYWdNb3ZlKTtcbiAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vbkRyYWdTdG9wKTtcbiAgICB0aGlzLm1vdXNlTW92ZVJlZiA9IHRoaXMub25EcmFnTW92ZTtcbiAgICB0aGlzLm1vdXNlVXBSZWYgPSB0aGlzLm9uRHJhZ1N0b3A7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH07XG59XG4iXX0=