UNPKG

dbweb-common

Version:

用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上

360 lines 31.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ElementRef, EventEmitter, HostBinding, HostListener, Output, ViewChild } from '@angular/core'; import { distance, getInsertPointBetweenCircleAndLine, pointInCicle } from './geometric'; /** * @record */ export function MoveEvent() { } if (false) { /** @type {?} */ MoveEvent.prototype.startDragPoint; } var PortraitMaskComponent = /** @class */ (function () { function PortraitMaskComponent(elRef) { this.elRef = elRef; this.hostClass = true; this.cx = 100; this.cy = 100; this.r = 50; this.handleX = 150; this.handleY = 100; this.handleR = 6; this.cursor = 'grab'; this.startDrag = new EventEmitter(); this.dragging = new EventEmitter(); this.maskChange = new EventEmitter(); this.mouseDown = this.mouseDown.bind(this); this.mouseUp = this.mouseUp.bind(this); this.move = this.move.bind(this); } /** * @param {?} x * @param {?} y * @return {?} */ PortraitMaskComponent.prototype.toScreenPoint = /** * @param {?} x * @param {?} y * @return {?} */ function (x, y) { /** @type {?} */ var pt = this.svg.nativeElement.createSVGPoint(); pt.x = x; pt.y = y; return pt.matrixTransform(this.svg.nativeElement.getScreenCTM()); }; // 将一个距离转换成屏幕尺寸 // 将一个距离转换成屏幕尺寸 /** * @param {?} val * @return {?} */ PortraitMaskComponent.prototype.toScreenDistance = // 将一个距离转换成屏幕尺寸 /** * @param {?} val * @return {?} */ function (val) { /** @type {?} */ var p1 = this.toScreenPoint(0, 0); /** @type {?} */ var p2 = this.toScreenPoint(val, 0); return p2.x - p1.x; }; /** * @param {?} x * @param {?} y * @return {?} */ PortraitMaskComponent.prototype.toSVGPoint = /** * @param {?} x * @param {?} y * @return {?} */ function (x, y) { /** @type {?} */ var pt = this.svg.nativeElement.createSVGPoint(); pt.x = x; pt.y = y; return pt.matrixTransform(this.svg.nativeElement.getScreenCTM().inverse()); }; // 获取handle的受限的圆心坐标 svg // 获取handle的受限的圆心坐标 svg /** * @param {?} mousePoint * @return {?} */ PortraitMaskComponent.prototype.getLimitHandleCenterPostion = // 获取handle的受限的圆心坐标 svg /** * @param {?} mousePoint * @return {?} */ function (mousePoint) { // 根据mouse point拿到对应的圆心位置 /** @type {?} */ var point = { x: mousePoint.x - this.handleDistanceOffset.x, y: mousePoint.y - this.handleDistanceOffset.y }; // Create an SVGPoint for future math /** @type {?} */ var r = distance(point.x, point.y, this.cx, this.cy); if (r <= this.maxR) { return point; } r = this.maxR; /** @type {?} */ var arr = getInsertPointBetweenCircleAndLine(this.cx, this.cy, point.x, point.y, this.cx, this.cy, r); /** @type {?} */ var d1 = distance(point.x, point.y, arr[0].x, arr[0].y); /** @type {?} */ var d2 = distance(point.x, point.y, arr[1].x, arr[1].y); if (d1 < d2) { return arr[0]; } else { return arr[1]; } }; // tslint:disable-next-line: quotemark // tslint:disable-next-line: quotemark /** * @param {?} event * @return {?} */ PortraitMaskComponent.prototype.mouseDown = // tslint:disable-next-line: quotemark /** * @param {?} event * @return {?} */ function (event) { if (event.button !== 0) { return; } /** @type {?} */ var p = this.toSVGPoint(event.x, event.y); this.handleDistanceOffset = { x: p.x - this.handleX, y: p.y - this.handleY }; this.maskDistanceOffset = { x: p.x - this.cx, y: p.y - this.cy }; this.startDragPoint = { x: event.x, y: event.y }; if (pointInCicle(p.x, p.y, this.handleX, this.handleY, this.handleR)) { this.dragType = 'handle'; } else if (pointInCicle(p.x, p.y, this.cx, this.cy, this.r)) { this.dragType = 'mask'; } else { this.dragType = 'outside'; this.startDrag.emit(event); } window.addEventListener('mousemove', this.move, false); window.addEventListener('mouseup', this.mouseUp, false); event.stopPropagation(); }; /** * @return {?} */ PortraitMaskComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.calcSize(); }; /** * @return {?} */ PortraitMaskComponent.prototype.emitMaskRect = /** * @return {?} */ function () { /** @type {?} */ var p1 = this.toScreenPoint(this.cx - this.r, this.cy - this.r); /** @type {?} */ var p2 = this.toScreenPoint(this.cx + this.r, this.cy + this.r); this.maskChange.emit({ left: p1.x, top: p1.y, right: p2.x, bottom: p2.y, width: p2.x - p1.x, height: p2.y - p1.y }); }; /** * @return {?} */ PortraitMaskComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { this.emitMaskRect(); }; /** * @param {?} event * @return {?} */ PortraitMaskComponent.prototype.move = /** * @param {?} event * @return {?} */ function (event) { switch (this.dragType) { case 'handle': { /** @type {?} */ var p = this.getLimitHandleCenterPostion(this.toSVGPoint(event.x, event.y)); this.handleX = p.x; this.handleY = p.y; this.r = distance(this.handleX, this.handleY, this.cx, this.cy); this.emitMaskRect(); break; } case 'mask': { /** @type {?} */ var p = this.toSVGPoint(event.x, event.y); p.x = Math.max(0, Math.min(this.svgWidth, p.x)); p.y = Math.max(0, Math.min(this.svgHeight, p.y)); this.cx = p.x - this.maskDistanceOffset.x; this.cy = p.y - this.maskDistanceOffset.y; this.handleX = p.x - this.handleDistanceOffset.x; this.handleY = p.y - this.handleDistanceOffset.y; this.emitMaskRect(); } break; case 'outside': this.dragging.emit({ x: event.x, y: event.y }); break; default: break; } event.stopPropagation(); event.preventDefault(); }; /** * @param {?} event * @return {?} */ PortraitMaskComponent.prototype.mouseUp = /** * @param {?} event * @return {?} */ function (event) { window.removeEventListener('mousemove', this.move, false); window.removeEventListener('mouseup', this.mouseUp, false); }; // 重置到中心点,半径为最大 // 重置到中心点,半径为最大 /** * @return {?} */ PortraitMaskComponent.prototype.reset = // 重置到中心点,半径为最大 /** * @return {?} */ function () { this.calcSize(); this.emitMaskRect(); }; /** * @private * @return {?} */ PortraitMaskComponent.prototype.calcSize = /** * @private * @return {?} */ function () { /** @type {?} */ var rect = this.elRef.nativeElement.getBoundingClientRect(); /** @type {?} */ var p = this.toSVGPoint(rect.left + rect.width / 2, rect.top + rect.height / 2); /** @type {?} */ var p1 = this.toSVGPoint(rect.left, rect.top); /** @type {?} */ var p2 = this.toSVGPoint(rect.right, rect.bottom); this.cx = p.x; this.cy = p.y; this.maxR = this.r = (p2.x - p1.x) / 2; this.svgWidth = p2.x - p1.x; this.svgHeight = p2.y - p1.y; this.handleX = this.cx + this.r; this.handleY = this.cy; }; PortraitMaskComponent.decorators = [ { type: Component, args: [{ selector: 'common-portrait-mask', template: "<svg version=\"1.1\" width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\"\r\n\txmlns:xlink=\"http://www.w3.org/1999/xlink\" #svg>\r\n\t<style>\r\n\t\t.handle {\r\n\t\t\tcursor: grab;\r\n\t\t}\r\n\t</style>\r\n\t<defs>\r\n\t\t<mask id=\"Mask\">\r\n\t\t\t<rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"white\" />\r\n\t\t\t<circle [attr.cx]=\"cx\" [attr.cy]=\"cy\" [attr.r]=\"r\" />\r\n\t\t</mask>\r\n\t</defs>\r\n\r\n\t<rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" opacity=\"0.4\"\r\n\t\tmask=\"url(#Mask)\" />\r\n\t<circle [attr.cx]=\"cx\" [attr.cy]=\"cy\" [attr.r]=\"r\" stroke-width=\"2\" #maskCicle\r\n\t\tclass=\"border-cicle\"/>\r\n\t<circle [attr.cx]=\"handleX\" [attr.cy]=\"handleY\" [attr.r]=\"handleR\" class=\"handle\"/>\r\n</svg>", styles: [":host{width:100%;height:100%;display:block;position:relative}.handle{cursor:hand}"] }] } ]; /** @nocollapse */ PortraitMaskComponent.ctorParameters = function () { return [ { type: ElementRef } ]; }; PortraitMaskComponent.propDecorators = { hostClass: [{ type: HostBinding, args: ['class.portrait-mask',] }], startDrag: [{ type: Output }], dragging: [{ type: Output }], maskChange: [{ type: Output }], svg: [{ type: ViewChild, args: ['svg', { static: true },] }], handle: [{ type: ViewChild, args: ['handle', { static: true },] }], maskCicle: [{ type: ViewChild, args: ['maskCicle', { static: true },] }], mouseDown: [{ type: HostListener, args: ['mousedown', ['$event'],] }] }; return PortraitMaskComponent; }()); export { PortraitMaskComponent }; if (false) { /** @type {?} */ PortraitMaskComponent.prototype.hostClass; /** @type {?} */ PortraitMaskComponent.prototype.cx; /** @type {?} */ PortraitMaskComponent.prototype.cy; /** @type {?} */ PortraitMaskComponent.prototype.r; /** @type {?} */ PortraitMaskComponent.prototype.maxR; /** @type {?} */ PortraitMaskComponent.prototype.svgWidth; /** @type {?} */ PortraitMaskComponent.prototype.svgHeight; /** @type {?} */ PortraitMaskComponent.prototype.handleX; /** @type {?} */ PortraitMaskComponent.prototype.handleY; /** @type {?} */ PortraitMaskComponent.prototype.handleR; /** @type {?} */ PortraitMaskComponent.prototype.cursor; /** @type {?} */ PortraitMaskComponent.prototype.maskDistanceOffset; /** @type {?} */ PortraitMaskComponent.prototype.handleDistanceOffset; /** @type {?} */ PortraitMaskComponent.prototype.startDragPoint; /** @type {?} */ PortraitMaskComponent.prototype.dragType; /** @type {?} */ PortraitMaskComponent.prototype.startDrag; /** @type {?} */ PortraitMaskComponent.prototype.dragging; /** @type {?} */ PortraitMaskComponent.prototype.maskChange; /** @type {?} */ PortraitMaskComponent.prototype.svg; /** @type {?} */ PortraitMaskComponent.prototype.handle; /** @type {?} */ PortraitMaskComponent.prototype.maskCicle; /** * @type {?} * @private */ PortraitMaskComponent.prototype.elRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydHJhaXQtbWFzay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvdXNlcmluZm8vcG9ydHJhaXQtZWRpdC9wb3J0cmFpdC1tYXNrL3BvcnRyYWl0LW1hc2suY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxPQUFPLEVBRU4sU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFFWixNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsa0NBQWtDLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7O0FBR3pGLCtCQUVDOzs7SUFEQSxtQ0FBc0I7O0FBRXZCO0lBMkJDLCtCQUFvQixLQUE4QjtRQUE5QixVQUFLLEdBQUwsS0FBSyxDQUF5QjtRQXJCZCxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3JELE9BQUUsR0FBRyxHQUFHLENBQUM7UUFDVCxPQUFFLEdBQUcsR0FBRyxDQUFDO1FBQ1QsTUFBQyxHQUFHLEVBQUUsQ0FBQztRQUlQLFlBQU8sR0FBRyxHQUFHLENBQUM7UUFDZCxZQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2QsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLFdBQU0sR0FBRyxNQUFNLENBQUM7UUFLTixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUMzQyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUNyQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUtyRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxD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QUNOLE1BQU07c0JBQ04sU0FBUyxTQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7eUJBQ2pDLFNBQVMsU0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFOzRCQUNwQyxTQUFTLFNBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs0QkE4Q3ZDLFlBQVksU0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0lBZ0d0Qyw0QkFBQztDQUFBLEFBeEtELElBd0tDO1NBbktZLHFCQUFxQjs7O0lBQ2pDLDBDQUFxRDs7SUFDckQsbUNBQVM7O0lBQ1QsbUNBQVM7O0lBQ1Qsa0NBQU87O0lBQ1AscUNBQWE7O0lBQ2IseUNBQWlCOztJQUNqQiwwQ0FBa0I7O0lBQ2xCLHdDQUFjOztJQUNkLHdDQUFjOztJQUNkLHdDQUFZOztJQUNaLHVDQUFnQjs7SUFDaEIsbURBQTBCOztJQUMxQixxREFBNEI7O0lBQzVCLCtDQUFzQjs7SUFDdEIseUNBQW1COztJQUNuQiwwQ0FBcUQ7O0lBQ3JELHlDQUErQzs7SUFDL0MsMkNBQXNEOztJQUN0RCxvQ0FBb0Q7O0lBQ3BELHVDQUEwRDs7SUFDMUQsMENBQWdFOzs7OztJQUNwRCxzQ0FBc0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb2ludCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AvdHlwaW5ncy9kcmFnLXJlZic7XG5pbXBvcnQge1xuXHRBZnRlclZpZXdJbml0LFxuXHRDb21wb25lbnQsXG5cdEVsZW1lbnRSZWYsXG5cdEV2ZW50RW1pdHRlcixcblx0SG9zdEJpbmRpbmcsXG5cdEhvc3RMaXN0ZW5lcixcblx0T25Jbml0LFxuXHRPdXRwdXQsXG5cdFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGRpc3RhbmNlLCBnZXRJbnNlcnRQb2ludEJldHdlZW5DaXJjbGVBbmRMaW5lLCBwb2ludEluQ2ljbGUgfSBmcm9tICcuL2dlb21ldHJpYyc7XG5cbnR5cGUgRGFyZ1R5cGUgPSAnaGFuZGxlJyB8ICdtYXNrJyB8ICdvdXRzaWRlJztcbmV4cG9ydCBpbnRlcmZhY2UgTW92ZUV2ZW50IHtcblx0c3RhcnREcmFnUG9pbnQ6IFBvaW50O1xufVxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnY29tbW9uLXBvcnRyYWl0LW1hc2snLFxuXHR0ZW1wbGF0ZVVybDogJy4vcG9ydHJhaXQtbWFzay5jb21wb25lbnQuaHRtbCcsXG5cdHN0eWxlVXJsczogWycuL3BvcnRyYWl0LW1hc2suY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBQb3J0cmFpdE1hc2tDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuXHRASG9zdEJpbmRpbmcoJ2NsYXNzLnBvcnRyYWl0LW1hc2snKSBob3N0Q2xhc3MgPSB0cnVlO1xuXHRjeCA9IDEwMDtcblx0Y3kgPSAxMDA7XG5cdHIgPSA1MDtcblx0bWF4UjogbnVtYmVyO1xuXHRzdmdXaWR0aDogbnVtYmVyOyAvLyBzdmcg5Z2Q5qCH55qE5oC75a695bqmXG5cdHN2Z0hlaWdodDogbnVtYmVyO1xuXHRoYW5kbGVYID0gMTUwO1xuXHRoYW5kbGVZID0gMTAwO1xuXHRoYW5kbGVSID0gNjtcblx0Y3Vyc29yID0gJ2dyYWInO1xuXHRtYXNrRGlzdGFuY2VPZmZzZXQ6IFBvaW50OyAvLyDpvKDmoIfngrnlh7vkvY3nva7kuI7lnIblv4PnmoTlgY/np7tcblx0aGFuZGxlRGlzdGFuY2VPZmZzZXQ6IFBvaW50O1xuXHRzdGFydERyYWdQb2ludDogUG9pbnQ7IC8vIOW8gOWni+aLluWKqOeahOeCue+8jOWxj+W5leWdkOagh1xuXHRkcmFnVHlwZTogRGFyZ1R5cGU7XG5cdEBPdXRwdXQoKSBzdGFydERyYWcgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG5cdEBPdXRwdXQoKSBkcmFnZ2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8UG9pbnQ+KCk7XG5cdEBPdXRwdXQoKSBtYXNrQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDbGllbnRSZWN0PigpO1xuXHRAVmlld0NoaWxkKCdzdmcnLCB7IHN0YXRpYzogdHJ1ZSB9KSBzdmc6IEVsZW1lbnRSZWY7XG5cdEBWaWV3Q2hpbGQoJ2hhbmRsZScsIHsgc3RhdGljOiB0cnVlIH0pIGhhbmRsZTogRWxlbWVudFJlZjtcblx0QFZpZXdDaGlsZCgnbWFza0NpY2xlJywgeyBzdGF0aWM6IHRydWUgfSkgbWFza0NpY2xlOiBFbGVtZW50UmVmO1xuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge1xuXHRcdHRoaXMubW91c2VEb3duID0gdGhpcy5tb3VzZURvd24uYmluZCh0aGlzKTtcblx0XHR0aGlzLm1vdXNlVXAgPSB0aGlzLm1vdXNlVXAuYmluZCh0aGlzKTtcblx0XHR0aGlzLm1vdmUgPSB0aGlzLm1vdmUuYmluZCh0aGlzKTtcblx0fVxuXHR0b1NjcmVlblBvaW50KHgsIHkpOiBQb2ludCB7XG5cdFx0Y29uc3QgcHQgPSB0aGlzLnN2Zy5uYXRpdmVFbGVtZW50LmNyZWF0ZVNWR1BvaW50KCk7XG5cdFx0cHQueCA9IHg7XG5cdFx0cHQueSA9IHk7XG5cdFx0cmV0dXJuIHB0Lm1hdHJpeFRyYW5zZm9ybSh0aGlzLnN2Zy5uYXRpdmVFbGVtZW50LmdldFNjcmVlbkNUTSgpKTtcblx0fVxuXHQvLyDlsIbkuIDkuKrot53nprvovazmjaLmiJDlsY/luZXlsLrlr7hcblx0dG9TY3JlZW5EaXN0YW5jZSh2YWw6IG51bWJlcik6IG51bWJlciB7XG5cdFx0Y29uc3QgcDEgPSB0aGlzLnRvU2NyZWVuUG9pbnQoMCwgMCk7XG5cdFx0Y29uc3QgcDIgPSB0aGlzLnRvU2NyZWVuUG9pbnQodmFsLCAwKTtcblx0XHRyZXR1cm4gcDIueCAtIHAxLng7XG5cdH1cblx0dG9TVkdQb2ludCh4LCB5KTogUG9pbnQge1xuXHRcdGNvbnN0IHB0ID0gdGhpcy5zdmcubmF0aXZlRWxlbWVudC5jcmVhdGVTVkdQb2ludCgpO1xuXHRcdHB0LnggPSB4O1xuXHRcdHB0LnkgPSB5O1xuXHRcdHJldHVybiBwdC5tYXRyaXhUcmFuc2Zvcm0odGhpcy5zdmcubmF0aXZlRWxlbWVudC5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpO1xuXHR9XG5cdC8vIOiOt+WPlmhhbmRsZeeahOWPl+mZkOeahOWchuW/g+WdkOaghyBzdmdcblx0Z2V0TGltaXRIYW5kbGVDZW50ZXJQb3N0aW9uKG1vdXNlUG9pbnQ6IFBvaW50KTogUG9pbnQge1xuXHRcdC8vIOagueaNrm1vdXNlIHBvaW505ou/5Yiw5a+55bqU55qE5ZyG5b+D5L2N572uXG5cdFx0Y29uc3QgcG9pbnQgPSB7IHg6IG1vdXNlUG9pbnQueCAtIHRoaXMuaGFuZGxlRGlzdGFuY2VPZmZzZXQueCwgeTogbW91c2VQb2ludC55IC0gdGhpcy5oYW5kbGVEaXN0YW5jZU9mZnNldC55IH07XG5cdFx0Ly8gQ3JlYXRlIGFuIFNWR1BvaW50IGZvciBmdXR1cmUgbWF0aFxuXHRcdGxldCByID0gZGlzdGFuY2UocG9pbnQueCwgcG9pbnQueSwgdGhpcy5jeCwgdGhpcy5jeSk7XG5cdFx0aWYgKHIgPD0gdGhpcy5tYXhSKSB7XG5cdFx0XHRyZXR1cm4gcG9pbnQ7XG5cdFx0fVxuXHRcdHIgPSB0aGlzLm1heFI7XG5cdFx0Y29uc3QgYXJyID0gZ2V0SW5zZXJ0UG9pbnRCZXR3ZWVuQ2lyY2xlQW5kTGluZSh0aGlzLmN4LCB0aGlzLmN5LCBwb2ludC54LCBwb2ludC55LCB0aGlzLmN4LCB0aGlzLmN5LCByKTtcblxuXHRcdGNvbnN0IGQxID0gZGlzdGFuY2UocG9pbnQueCwgcG9pbnQueSwgYXJyWzBdLngsIGFyclswXS55KTtcblx0XHRjb25zdCBkMiA9IGRpc3RhbmNlKHBvaW50LngsIHBvaW50LnksIGFyclsxXS54LCBhcnJbMV0ueSk7XG5cdFx0aWYgKGQxIDwgZDIpIHtcblx0XHRcdHJldHVybiBhcnJbMF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBhcnJbMV07XG5cdFx0fVxuXHR9XG5cblx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBxdW90ZW1hcmtcblx0QEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSlcblx0bW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG5cdFx0aWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBwID0gdGhpcy50b1NWR1BvaW50KGV2ZW50LngsIGV2ZW50LnkpO1xuXHRcdHRoaXMuaGFuZGxlRGlzdGFuY2VPZmZzZXQgPSB7IHg6IHAueCAtIHRoaXMuaGFuZGxlWCwgeTogcC55IC0gdGhpcy5oYW5kbGVZIH07XG5cdFx0dGhpcy5tYXNrRGlzdGFuY2VPZmZzZXQgPSB7IHg6IHAueCAtIHRoaXMuY3gsIHk6IHAueSAtIHRoaXMuY3kgfTtcblx0XHR0aGlzLnN0YXJ0RHJhZ1BvaW50ID0geyB4OiBldmVudC54LCB5OiBldmVudC55IH07XG5cblx0XHRpZiAocG9pbnRJbkNpY2xlKHAueCwgcC55LCB0aGlzLmhhbmRsZVgsIHRoaXMuaGFuZGxlWSwgdGhpcy5oYW5kbGVSKSkge1xuXHRcdFx0dGhpcy5kcmFnVHlwZSA9ICdoYW5kbGUnO1xuXHRcdH0gZWxzZSBpZiAocG9pbnRJbkNpY2xlKHAueCwgcC55LCB0aGlzLmN4LCB0aGlzLmN5LCB0aGlzLnIpKSB7XG5cdFx0XHR0aGlzLmRyYWdUeXBlID0gJ21hc2snO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmRyYWdUeXBlID0gJ291dHNpZGUnO1xuXHRcdFx0dGhpcy5zdGFydERyYWcuZW1pdChldmVudCk7XG5cdFx0fVxuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdmUsIGZhbHNlKTtcblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcCwgZmFsc2UpO1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG5cdG5nT25Jbml0KCkge1xuXHRcdHRoaXMuY2FsY1NpemUoKTtcblx0fVxuXHRlbWl0TWFza1JlY3QoKSB7XG5cdFx0Y29uc3QgcDEgPSB0aGlzLnRvU2NyZWVuUG9pbnQodGhpcy5jeCAtIHRoaXMuciwgdGhpcy5jeSAtIHRoaXMucik7XG5cdFx0Y29uc3QgcDIgPSB0aGlzLnRvU2NyZWVuUG9pbnQodGhpcy5jeCArIHRoaXMuciwgdGhpcy5jeSArIHRoaXMucik7XG5cdFx0dGhpcy5tYXNrQ2hhbmdlLmVtaXQoe1xuXHRcdFx0bGVmdDogcDEueCxcblx0XHRcdHRvcDogcDEueSxcblx0XHRcdHJpZ2h0OiBwMi54LFxuXHRcdFx0Ym90dG9tOiBwMi55LFxuXHRcdFx0d2lkdGg6IHAyLnggLSBwMS54LFxuXHRcdFx0aGVpZ2h0OiBwMi55IC0gcDEueVxuXHRcdH0pO1xuXHR9XG5cdG5nQWZ0ZXJWaWV3SW5pdCgpIHtcblx0XHR0aGlzLmVtaXRNYXNrUmVjdCgpO1xuXHR9XG5cdG1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcblx0XHRzd2l0Y2ggKHRoaXMuZHJhZ1R5cGUpIHtcblx0XHRcdGNhc2UgJ2hhbmRsZSc6IHtcblx0XHRcdFx0Y29uc3QgcCA9IHRoaXMuZ2V0TGltaXRIYW5kbGVDZW50ZXJQb3N0aW9uKHRoaXMudG9TVkdQb2ludChldmVudC54LCBldmVudC55KSk7XG5cdFx0XHRcdHRoaXMuaGFuZGxlWCA9IHAueDtcblx0XHRcdFx0dGhpcy5oYW5kbGVZID0gcC55O1xuXHRcdFx0XHR0aGlzLnIgPSBkaXN0YW5jZSh0aGlzLmhhbmRsZVgsIHRoaXMuaGFuZGxlWSwgdGhpcy5jeCwgdGhpcy5jeSk7XG5cdFx0XHRcdHRoaXMuZW1pdE1hc2tSZWN0KCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAnbWFzayc6XG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25zdCBwID0gdGhpcy50b1NWR1BvaW50KGV2ZW50LngsIGV2ZW50LnkpO1xuXHRcdFx0XHRcdHAueCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuc3ZnV2lkdGgsIHAueCkpO1xuXHRcdFx0XHRcdHAueSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuc3ZnSGVpZ2h0LCBwLnkpKTtcblx0XHRcdFx0XHR0aGlzLmN4ID0gcC54IC0gdGhpcy5tYXNrRGlzdGFuY2VPZmZzZXQueDtcblx0XHRcdFx0XHR0aGlzLmN5ID0gcC55IC0gdGhpcy5tYXNrRGlzdGFuY2VPZmZzZXQueTtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZVggPSBwLnggLSB0aGlzLmhhbmRsZURpc3RhbmNlT2Zmc2V0Lng7XG5cdFx0XHRcdFx0dGhpcy5oYW5kbGVZID0gcC55IC0gdGhpcy5oYW5kbGVEaXN0YW5jZU9mZnNldC55O1xuXHRcdFx0XHRcdHRoaXMuZW1pdE1hc2tSZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdvdXRzaWRlJzpcblx0XHRcdFx0dGhpcy5kcmFnZ2luZy5lbWl0KHsgeDogZXZlbnQueCwgeTogZXZlbnQueSB9KTtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHR9XG5cdG1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcblx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3ZlLCBmYWxzZSk7XG5cdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm1vdXNlVXAsIGZhbHNlKTtcblx0fVxuXHQvLyDph43nva7liLDkuK3lv4PngrnvvIzljYrlvoTkuLrmnIDlpKdcblx0cmVzZXQoKSB7XG5cdFx0dGhpcy5jYWxjU2l6ZSgpO1xuXG5cdFx0dGhpcy5lbWl0TWFza1JlY3QoKTtcblx0fVxuXG5cdHByaXZhdGUgY2FsY1NpemUoKSB7XG5cdFx0Y29uc3QgcmVjdCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRjb25zdCBwID0gdGhpcy50b1NWR1BvaW50KHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyLCByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gMik7XG5cdFx0Y29uc3QgcDEgPSB0aGlzLnRvU1ZHUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCk7XG5cdFx0Y29uc3QgcDIgPSB0aGlzLnRvU1ZHUG9pbnQocmVjdC5yaWdodCwgcmVjdC5ib3R0b20pO1xuXHRcdHRoaXMuY3ggPSBwLng7XG5cdFx0dGhpcy5jeSA9IHAueTtcblx0XHR0aGlzLm1heFIgPSB0aGlzLnIgPSAocDIueCAtIHAxLngpIC8gMjtcblx0XHR0aGlzLnN2Z1dpZHRoID0gcDIueCAtIHAxLng7XG5cdFx0dGhpcy5zdmdIZWlnaHQgPSBwMi55IC0gcDEueTtcblx0XHR0aGlzLmhhbmRsZVggPSB0aGlzLmN4ICsgdGhpcy5yO1xuXHRcdHRoaXMuaGFuZGxlWSA9IHRoaXMuY3k7XG5cdH1cbn1cbiJdfQ==