UNPKG

ng-fancy-gui

Version:

This package contains components, for creating userinterfaces in a Angular app.

159 lines 24.2 kB
import { __decorate } from "tslib"; import { Component, EventEmitter, Output, ViewChild, Input, HostListener } from '@angular/core'; import { HorizontalLine } from './classes/horizontalLine'; import { Mouse } from './classes/mouse'; let RotationSliderComponent = class RotationSliderComponent { constructor() { this.iconPath = null; this.additive = ""; this.max = 25; this.min = -25; this.change = new EventEmitter(); this.renderingValue = '0.00'; this.horizontalLines = []; this.value = 0; this.spaceing = 30; this.lineThikness = 3; this.lineColor = 'gray'; this.horizontalLinesMarginTop = 25; this.horizontalLineMove = 0; } ngAfterViewInit() { this.canvas = this.canvasVc.nativeElement; this.ctx = this.canvas.getContext('2d'); this.init(); } ngOnDestroy() { window.cancelAnimationFrame(this.animationFrameHandler); } clear() { this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); } init() { this.mouse = new Mouse(this); this.resize(); this.addHorizontalLines(); this.initRenderingLoop(); this.initMouseEvents(); } initRenderingLoop() { const step = () => { this.render(); window.requestAnimationFrame(step); }; this.animationFrameHandler = window.requestAnimationFrame(step); } initMouseEvents() { this.canvas.onmousemove = (evt) => { if (this.mouse.isDown) { if ((this.horizontalLineMove + (this.mouse.lastX - this.mouse.x)) / this.spaceing <= this.max && (this.horizontalLineMove + (this.mouse.lastX - this.mouse.x)) / this.spaceing >= this.min) { this.horizontalLineMove += (this.mouse.lastX - this.mouse.x); this.value = (Math.round((this.horizontalLineMove / this.spaceing) * 100) / 100); this.renderingValue = (Math.round((this.horizontalLineMove / this.spaceing) * 100) / 100).toFixed(2); } else { if (((this.horizontalLineMove + (this.mouse.lastX - this.mouse.x)) / this.spaceing) > 0) { this.value = this.max; this.horizontalLineMove = this.max * this.spaceing; this.renderingValue = this.max.toFixed(2).toString(); } else { this.value = this.min; this.horizontalLineMove = this.min * this.spaceing; this.renderingValue = this.min.toFixed(2).toString(); } } this.change.emit(this.value); } this.mouse.syncPosition(evt); }; this.canvas.ontouchmove = (evt) => { evt.preventDefault(); if (this.mouse.isDown) { if ((this.horizontalLineMove + (this.mouse.lastX - this.mouse.x)) / this.spaceing <= this.max && (this.horizontalLineMove + (this.mouse.lastX - this.mouse.x)) / this.spaceing >= this.min) { this.horizontalLineMove += (this.mouse.lastX - this.mouse.x); this.value = (Math.round((this.horizontalLineMove / this.spaceing) * 100) / 100); this.renderingValue = (Math.round((this.horizontalLineMove / this.spaceing) * 100) / 100).toFixed(2); } else { if (((this.horizontalLineMove + (this.mouse.lastX - this.mouse.x)) / this.spaceing) > 0) { this.value = this.max; this.horizontalLineMove = this.max * this.spaceing; this.renderingValue = this.max.toFixed(2).toString(); } else { this.value = this.min; this.horizontalLineMove = this.min * this.spaceing; this.renderingValue = this.min.toFixed(2).toString(); } } this.change.emit(this.value); } this.mouse.syncTouchPosition(evt); }; } resize() { const parent = this.canvas.parentElement; this.canvas.width = parent.clientWidth; // this.canvas.height = parent.clientHeight; this.horizontalLines = []; this.addHorizontalLines(); } render() { this.clear(); this.ctx.beginPath(); this.ctx.arc(this.canvas.width / 2, 10, 5, 0, 2 * Math.PI); this.ctx.fillStyle = this.lineColor; this.ctx.fill(); this.ctx.closePath(); this.horizontalLines.forEach(x => { x.render(); }); } addHorizontalLines() { for (let i = 0; i <= this.max + 5; i++) { this.horizontalLines.push(new HorizontalLine(this.lineThikness, 100, (this.canvas.width / 2) + (i * this.spaceing), this.horizontalLinesMarginTop, i, this)); } for (let i = 0; i >= this.min - 5; i--) { this.horizontalLines.push(new HorizontalLine(this.lineThikness, 100, (this.canvas.width / 2) - ((i * (-1)) * this.spaceing), this.horizontalLinesMarginTop, i, this)); } } resetValue() { this.value = 0; this.horizontalLineMove = 0; this.renderingValue = '0.00'; this.change.emit(this.value); } }; __decorate([ Input() ], RotationSliderComponent.prototype, "iconPath", void 0); __decorate([ Input() ], RotationSliderComponent.prototype, "additive", void 0); __decorate([ Input() ], RotationSliderComponent.prototype, "max", void 0); __decorate([ Input() ], RotationSliderComponent.prototype, "min", void 0); __decorate([ Output() ], RotationSliderComponent.prototype, "change", void 0); __decorate([ ViewChild('canvas') ], RotationSliderComponent.prototype, "canvasVc", void 0); __decorate([ HostListener('window:resize') ], RotationSliderComponent.prototype, "resize", null); RotationSliderComponent = __decorate([ Component({ selector: 'fg-slider', template: "<div class=\"valueOuterWrapper\">\n <div [class.visible]=\"value!==0\" class=\"valueWrapper\">\n \n <img *ngIf=\"iconPath\" src=\"{{iconPath}}\" />\n <!--<div class=\"valueWrapper visible\">-->\n <span class=\"value\">{{renderingValue}}{{additive}}</span>\n <button (click)=\"resetValue()\" class=\"resetButton\" type=\"button\">x</button>\n </div>\n</div>\n<div class=\"rotationSliderCanvasWrap\">\n <canvas #canvas></canvas>\n</div>\n", styles: [":host{display:block;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;padding-top:35px}.valueOuterWrapper{position:absolute;top:0;left:50%;transform:translate(-50%,0)}.valueOuterWrapper .valueWrapper{border-radius:7px;padding:5px 15px 5px 18px;position:relative;width:25px;height:25px;margin:0 auto;transition:width .5s,background-color .5s}.valueOuterWrapper .valueWrapper img{width:25px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.valueOuterWrapper .valueWrapper .value{margin-top:5px;text-align:center;display:none;font-size:13px;font-weight:700}.valueOuterWrapper .valueWrapper .resetButton{position:absolute;display:none;color:#fff;background-color:#000;width:15px;height:15px;border-radius:20px;border:none;outline:0;right:8px;font-size:9px;top:50%;transform:translate(0,-50%)}.valueOuterWrapper .valueWrapper.visible{background-color:#aaa9a9;width:100px}.valueOuterWrapper .valueWrapper.visible img{position:absolute;left:17px;width:20px;display:block}.valueOuterWrapper .valueWrapper.visible .resetButton,.valueOuterWrapper .valueWrapper.visible .value{display:block}"] }) ], RotationSliderComponent); export { RotationSliderComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRpb24tc2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWZhbmN5LWd1aS8iLCJzb3VyY2VzIjpbImxpYi9yb3RhdGlvbi1zbGlkZXIvcm90YXRpb24tc2xpZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFvQixTQUFTLEVBQUUsWUFBWSxFQUFVLE1BQU0sRUFBaUIsU0FBUyxFQUFhLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEosT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU94QyxJQUFhLHVCQUF1QixHQUFwQyxNQUFhLHVCQUF1QjtJQTJCbEM7UUF6QlMsYUFBUSxHQUFFLElBQUksQ0FBQztRQUNmLGFBQVEsR0FBRyxFQUFFLENBQUE7UUFDYixRQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ1QsUUFBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBRVQsV0FBTSxHQUF5QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRTVELG1CQUFjLEdBQVcsTUFBTSxDQUFDO1FBTXhCLG9CQUFlLEdBQXFCLEVBQUUsQ0FBQztRQUd4QyxVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLGNBQVMsR0FBRyxNQUFNLENBQUM7UUFDbEIsNkJBQXdCLEdBQUcsRUFBRSxDQUFDO1FBQy9CLHVCQUFrQixHQUFHLENBQUMsQ0FBQztJQU05QixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDMUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4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RUFBRTtvREFBVTtBQUNUO0lBQVIsS0FBSyxFQUFFO29EQUFXO0FBRVQ7SUFBVCxNQUFNLEVBQUU7dURBQW1EO0FBSXZDO0lBQXBCLFNBQVMsQ0FBQyxRQUFRLENBQUM7eURBQVU7QUF3RzlCO0lBREMsWUFBWSxDQUFDLGVBQWUsQ0FBQztxREFPN0I7QUF6SFUsdUJBQXVCO0lBTG5DLFNBQVMsQ0FBQztRQUNULFFBQVEsRUFBRSxXQUFXO1FBQ3JCLCtjQUErQzs7S0FFaEQsQ0FBQztHQUNXLHVCQUF1QixDQXNLbkM7U0F0S1ksdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT3V0cHV0LCBBZnRlclZpZXdJbml0LCBWaWV3Q2hpbGQsIE9uRGVzdHJveSwgSW5wdXQsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSG9yaXpvbnRhbExpbmUgfSBmcm9tICcuL2NsYXNzZXMvaG9yaXpvbnRhbExpbmUnO1xuaW1wb3J0IHsgTW91c2UgfSBmcm9tICcuL2NsYXNzZXMvbW91c2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmZy1zbGlkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcm90YXRpb24tc2xpZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcm90YXRpb24tc2xpZGVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUm90YXRpb25TbGlkZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIGljb25QYXRoPSBudWxsO1xuICBASW5wdXQoKSBhZGRpdGl2ZSA9IFwiXCJcbiAgQElucHV0KCkgbWF4ID0gMjU7XG4gIEBJbnB1dCgpIG1pbiA9IC0yNTtcblxuICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICByZW5kZXJpbmdWYWx1ZTogc3RyaW5nID0gJzAuMDAnO1xuXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycpIGNhbnZhc1ZjO1xuICBwdWJsaWMgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIHB1YmxpYyAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIHByaXZhdGUgbW91c2U6IE1vdXNlO1xuICBwcml2YXRlIGhvcml6b250YWxMaW5lczogSG9yaXpvbnRhbExpbmVbXSA9IFtdO1xuXG5cbiAgcHVibGljIHZhbHVlID0gMDtcbiAgcHJpdmF0ZSBzcGFjZWluZyA9IDMwO1xuICBwcml2YXRlIGxpbmVUaGlrbmVzcyA9IDM7XG4gIHB1YmxpYyBsaW5lQ29sb3IgPSAnZ3JheSc7XG4gIHByaXZhdGUgaG9yaXpvbnRhbExpbmVzTWFyZ2luVG9wID0gMjU7XG4gIHB1YmxpYyBob3Jpem9udGFsTGluZU1vdmUgPSAwO1xuXG4gIHByaXZhdGUgYW5pbWF0aW9uRnJhbWVIYW5kbGVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5jYW52YXMgPSB0aGlzLmNhbnZhc1ZjLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRnJhbWVIYW5kbGVyKTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcbiAgfVxuXG4gIGluaXQoKSB7XG5cbiAgICB0aGlzLm1vdXNlID0gbmV3IE1vdXNlKHRoaXMpO1xuXG4gICAgdGhpcy5yZXNpemUoKTtcblxuICAgIHRoaXMuYWRkSG9yaXpvbnRhbExpbmVzKCk7XG4gICAgdGhpcy5pbml0UmVuZGVyaW5nTG9vcCgpO1xuICAgIHRoaXMuaW5pdE1vdXNlRXZlbnRzKCk7XG4gIH1cblxuICBpbml0UmVuZGVyaW5nTG9vcCgpIHtcbiAgICBjb25zdCBzdGVwID0gKCkgPT4ge1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7XG4gICAgfVxuXG4gICAgdGhpcy5hbmltYXRpb25GcmFtZUhhbmRsZXIgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApO1xuICB9XG5cbiAgaW5pdE1vdXNlRXZlbnRzKCkge1xuICAgIHRoaXMuY2FudmFzLm9ubW91c2Vtb3ZlID0gKGV2dCkgPT4ge1xuICAgICAgaWYgKHRoaXMubW91c2UuaXNEb3duKSB7XG4gICAgICAgIGlmICgodGhpcy5ob3Jpem9udGFsTGluZU1vdmUgKyAodGhpcy5tb3VzZS5sYXN0WCAtIHRoaXMubW91c2UueCkpIC8gdGhpcy5zcGFjZWluZyA8PSB0aGlzLm1heCAmJlxuICAgICAgICAgICh0aGlzLmhvcml6b250YWxMaW5lTW92ZSArICh0aGlzLm1vdXNlLmxhc3RYIC0gdGhpcy5tb3VzZS54KSkgLyB0aGlzLnNwYWNlaW5nID49IHRoaXMubWluKSB7XG4gICAgICAgICAgdGhpcy5ob3Jpem9udGFsTGluZU1vdmUgKz0gKHRoaXMubW91c2UubGFzdFggLSB0aGlzLm1vdXNlLngpO1xuICAgICAgICAgIHRoaXMudmFsdWUgPSAoTWF0aC5yb3VuZCgodGhpcy5ob3Jpem9udGFsTGluZU1vdmUgLyB0aGlzLnNwYWNlaW5nKSAqIDEwMCkgLyAxMDApO1xuICAgICAgICAgIHRoaXMucmVuZGVyaW5nVmFsdWUgPSAoTWF0aC5yb3VuZCgodGhpcy5ob3Jpem9udGFsTGluZU1vdmUgLyB0aGlzLnNwYWNlaW5nKSAqIDEwMCkgLyAxMDApLnRvRml4ZWQoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCgodGhpcy5ob3Jpem9udGFsTGluZU1vdmUgKyAodGhpcy5tb3VzZS5sYXN0WCAtIHRoaXMubW91c2UueCkpIC8gdGhpcy5zcGFjZWluZykgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5tYXg7XG4gICAgICAgICAgICB0aGlzLmhvcml6b250YWxMaW5lTW92ZSA9IHRoaXMubWF4ICogdGhpcy5zcGFjZWluZztcbiAgICAgICAgICAgIHRoaXMucmVuZGVyaW5nVmFsdWUgPSB0aGlzLm1heC50b0ZpeGVkKDIpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1pbjtcbiAgICAgICAgICAgIHRoaXMuaG9yaXpvbnRhbExpbmVNb3ZlID0gdGhpcy5taW4gKiB0aGlzLnNwYWNlaW5nO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJpbmdWYWx1ZSA9IHRoaXMubWluLnRvRml4ZWQoMikudG9TdHJpbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubW91c2Uuc3luY1Bvc2l0aW9uKGV2dCk7XG4gICAgfTtcblxuICAgIHRoaXMuY2FudmFzLm9udG91Y2htb3ZlID0gKGV2dCkgPT4ge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAodGhpcy5tb3VzZS5pc0Rvd24pIHtcbiAgICAgICAgaWYgKCh0aGlzLmhvcml6b250YWxMaW5lTW92ZSArICh0aGlzLm1vdXNlLmxhc3RYIC0gdGhpcy5tb3VzZS54KSkgLyB0aGlzLnNwYWNlaW5nIDw9IHRoaXMubWF4ICYmXG4gICAgICAgICAgKHRoaXMuaG9yaXpvbnRhbExpbmVNb3ZlICsgKHRoaXMubW91c2UubGFzdFggLSB0aGlzLm1vdXNlLngpKSAvIHRoaXMuc3BhY2VpbmcgPj0gdGhpcy5taW4pIHtcbiAgICAgICAgICB0aGlzLmhvcml6b250YWxMaW5lTW92ZSArPSAodGhpcy5tb3VzZS5sYXN0WCAtIHRoaXMubW91c2UueCk7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IChNYXRoLnJvdW5kKCh0aGlzLmhvcml6b250YWxMaW5lTW92ZSAvIHRoaXMuc3BhY2VpbmcpICogMTAwKSAvIDEwMCk7XG4gICAgICAgICAgdGhpcy5yZW5kZXJpbmdWYWx1ZSA9IChNYXRoLnJvdW5kKCh0aGlzLmhvcml6b250YWxMaW5lTW92ZSAvIHRoaXMuc3BhY2VpbmcpICogMTAwKSAvIDEwMCkudG9GaXhlZCgyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoKCh0aGlzLmhvcml6b250YWxMaW5lTW92ZSArICh0aGlzLm1vdXNlLmxhc3RYIC0gdGhpcy5tb3VzZS54KSkgLyB0aGlzLnNwYWNlaW5nKSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1heDtcbiAgICAgICAgICAgIHRoaXMuaG9yaXpvbnRhbExpbmVNb3ZlID0gdGhpcy5tYXggKiB0aGlzLnNwYWNlaW5nO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJpbmdWYWx1ZSA9IHRoaXMubWF4LnRvRml4ZWQoMikudG9TdHJpbmcoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWluO1xuICAgICAgICAgICAgdGhpcy5ob3Jpem9udGFsTGluZU1vdmUgPSB0aGlzLm1pbiAqIHRoaXMuc3BhY2Vpbmc7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmluZ1ZhbHVlID0gdGhpcy5taW4udG9GaXhlZCgyKS50b1N0cmluZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5tb3VzZS5zeW5jVG91Y2hQb3NpdGlvbihldnQpO1xuICAgIH07XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgcmVzaXplKCkge1xuICAgIGNvbnN0IHBhcmVudDogSFRNTEVsZW1lbnQgPSB0aGlzLmNhbnZhcy5wYXJlbnRFbGVtZW50O1xuICAgIHRoaXMuY2FudmFzLndpZHRoID0gcGFyZW50LmNsaWVudFdpZHRoO1xuICAgIC8vIHRoaXMuY2FudmFzLmhlaWdodCA9IHBhcmVudC5jbGllbnRIZWlnaHQ7XG4gICAgdGhpcy5ob3Jpem9udGFsTGluZXMgPSBbXTtcbiAgICB0aGlzLmFkZEhvcml6b250YWxMaW5lcygpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICB0aGlzLmN0eC5hcmModGhpcy5jYW52YXMud2lkdGggLyAyLCAxMCwgNSwgMCwgMiAqIE1hdGguUEkpO1xuICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IHRoaXMubGluZUNvbG9yO1xuICAgIHRoaXMuY3R4LmZpbGwoKTtcbiAgICB0aGlzLmN0eC5jbG9zZVBhdGgoKTtcblxuICAgIHRoaXMuaG9yaXpvbnRhbExpbmVzLmZvckVhY2goeCA9PiB7XG4gICAgICB4LnJlbmRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkSG9yaXpvbnRhbExpbmVzKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHRoaXMubWF4ICsgNTsgaSsrKSB7XG4gICAgICB0aGlzLmhvcml6b250YWxMaW5lcy5wdXNoKFxuICAgICAgICBuZXcgSG9yaXpvbnRhbExpbmUodGhpcy5saW5lVGhpa25lc3MsXG4gICAgICAgICAgMTAwLFxuICAgICAgICAgICh0aGlzLmNhbnZhcy53aWR0aCAvIDIpICsgKGkgKiB0aGlzLnNwYWNlaW5nKSxcbiAgICAgICAgICB0aGlzLmhvcml6b250YWxMaW5lc01hcmdpblRvcCxcbiAgICAgICAgICBpLFxuICAgICAgICAgIHRoaXMpXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpID49IHRoaXMubWluIC0gNTsgaS0tKSB7XG4gICAgICB0aGlzLmhvcml6b250YWxMaW5lcy5wdXNoKFxuICAgICAgICBuZXcgSG9yaXpvbnRhbExpbmUoXG4gICAgICAgICAgdGhpcy5saW5lVGhpa25lc3MsXG4gICAgICAgICAgMTAwLFxuICAgICAgICAgICh0aGlzLmNhbnZhcy53aWR0aCAvIDIpIC0gKChpICogKC0xKSkgKiB0aGlzLnNwYWNlaW5nKSxcbiAgICAgICAgICB0aGlzLmhvcml6b250YWxMaW5lc01hcmdpblRvcCwgaSxcbiAgICAgICAgICB0aGlzKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXNldFZhbHVlKCkge1xuICAgIHRoaXMudmFsdWUgPSAwO1xuICAgIHRoaXMuaG9yaXpvbnRhbExpbmVNb3ZlID0gMDtcbiAgICB0aGlzLnJlbmRlcmluZ1ZhbHVlID0gJzAuMDAnO1xuICAgIHRoaXMuY2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG4gIH1cbn1cbiJdfQ==