UNPKG

dbweb-common

Version:

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

442 lines 53.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ElementRef, HostBinding, Inject, ViewChild } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; import { DomSanitizer } from '@angular/platform-browser'; import { CurrentService } from 'dbweb-core'; import { PortraitMaskComponent } from './portrait-mask/portrait-mask.component'; import { portraitDefault } from '../../const'; /** * @record */ export function PortraitEditComponentData() { } if (false) { /** @type {?} */ PortraitEditComponentData.prototype.img; /** @type {?} */ PortraitEditComponentData.prototype.default; } /** * @record */ export function PortraitEditComponentResultData() { } if (false) { /** @type {?} */ PortraitEditComponentResultData.prototype.ok; /** @type {?} */ PortraitEditComponentResultData.prototype.data; } /** @type {?} */ const ImageMaxWidth = 224; /** @type {?} */ const ImageMaxHeight = 224; /** @type {?} */ const PortraitSize = 224; // 112; export class PortraitEditComponent { // 是否是缺省的图片,缺省图片不需要保存 /** * @param {?} dialogRef * @param {?} data * @param {?} _sanitizer * @param {?} curr */ constructor(dialogRef, data, _sanitizer, curr) { this.dialogRef = dialogRef; this.data = data; this._sanitizer = _sanitizer; this.curr = curr; this.hostClass = true; this.translateX = 0; this.translateY = 0; this.rotateScope = 0; this.modified = false; this.afterInit = false; this.default = false; // 是否是缺省的图片,缺省图片不需要保存 } /** * @return {?} */ ngAfterViewInit() { this.srcImage.nativeElement.onload = (/** * @return {?} */ () => { this.realImageWidth = this.srcImage.nativeElement.width; this.realImageHeight = this.srcImage.nativeElement.height; /** @type {?} */ let w = this.srcImage.nativeElement.width; /** @type {?} */ let h = this.srcImage.nativeElement.height; this.minZoomFactor = this.zoomFactor = 1; if (w < h && h > ImageMaxHeight) { this.minZoomFactor = this.zoomFactor = ImageMaxHeight / h; w = w * this.zoomFactor; h = ImageMaxHeight; } else if (w > h && w > ImageMaxHeight) { this.minZoomFactor = this.zoomFactor = ImageMaxWidth / w; h = h * this.zoomFactor; w = ImageMaxWidth; } this.portraitImage.nativeElement.width = w; this.portraitImage.nativeElement.height = h; this.translateX = Math.round((ImageMaxWidth - w) / 2); this.translateY = Math.round((ImageMaxHeight - h) / 2); this.rebuildImage(); }); this.srcImage.nativeElement.src = this.data.img.src; this.default = this.data.default; this.afterInit = true; } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ rebuildImage() { /** @type {?} */ const c = document.createElement('canvas'); if (this.rotateScope === 0 || this.rotateScope === 0.5) { c.width = this.srcImage.nativeElement.width; c.height = this.srcImage.nativeElement.height; } else { c.width = this.srcImage.nativeElement.height; c.height = this.srcImage.nativeElement.width; } /** @type {?} */ const ctx = c.getContext('2d'); ctx.clearRect(0, 0, c.width, c.height); // move to the center of the canvas ctx.translate(c.width / 2, c.height / 2); // rotate the canvas to the specified degrees ctx.rotate(this.rotateScope * 2 * Math.PI); // draw the image // since the context is rotated, the image will be rotated also ctx.drawImage(this.srcImage.nativeElement, -this.srcImage.nativeElement.width / 2, -this.srcImage.nativeElement.height / 2); this.portraitImage.nativeElement.src = c.toDataURL(); setTimeout((/** * @return {?} */ () => { this.drawPreview(); }), 150); } /** * @return {?} */ pimgLoad() { /** @type {?} */ const offset = this.correctionOffset((this.portraitImage.nativeElement.width - this.realImageWidth * this.zoomFactor) / 2, (this.portraitImage.nativeElement.height - this.realImageHeight * this.zoomFactor) / 2, this.portraitImage.nativeElement.getBoundingClientRect()); this.translateX += offset.x; this.translateY += offset.y; } /** * @param {?} event * @return {?} */ startDragImage(event) { this.dragStartPoint = { x: event.x, y: event.y }; this.dragStartTransformPosition = { x: this.translateX, y: this.translateY }; this.dragStartImageRound = this.portraitImage.nativeElement.getBoundingClientRect(); } // 给定一个偏移,返回校正的结果 /** * @param {?} dx * @param {?} dy * @param {?} imageRect * @return {?} */ correctionOffset(dx, dy, imageRect) { /** @type {?} */ const containerRect = this.dragContainer.nativeElement.getBoundingClientRect(); /** @type {?} */ let lx; /** @type {?} */ let hx; /** @type {?} */ let ly; /** @type {?} */ let hy; // 如果图片宽度小于容器,则是左边框左移不能过容器左边框 if (containerRect.width > imageRect.width) { lx = containerRect.left - imageRect.left; hx = containerRect.right - imageRect.right; } else { // 否则是右边框左移不能离开容器右边框 lx = containerRect.right - imageRect.right; hx = containerRect.left - imageRect.left; } if (containerRect.height > imageRect.height) { ly = containerRect.top - imageRect.top; hy = containerRect.bottom - imageRect.bottom; } else { ly = containerRect.bottom - imageRect.bottom; hy = containerRect.top - imageRect.top; } return { x: Math.max(lx, Math.min(hx, dx)), y: Math.max(ly, Math.min(hy, dy)) }; } /** * @param {?} event * @return {?} */ draggingImage(event) { /** @type {?} */ const offset = this.correctionOffset(event.x - this.dragStartPoint.x, event.y - this.dragStartPoint.y, this.dragStartImageRound); this.translateX = this.dragStartTransformPosition.x + offset.x; this.translateY = this.dragStartTransformPosition.y + offset.y; this.drawPreview(); this.modified = true; this.default = false; } /** * @param {?} event * @return {?} */ zoomIn(event) { // 放大10% this.zoomFactor = Math.min(1, this.zoomFactor * 1.1); if (this.rotateScope === 0 || this.rotateScope === 0.5) { this.portraitImage.nativeElement.width = this.realImageWidth * this.zoomFactor; this.portraitImage.nativeElement.height = this.realImageHeight * this.zoomFactor; } else { this.portraitImage.nativeElement.width = this.realImageHeight * this.zoomFactor; this.portraitImage.nativeElement.height = this.realImageWidth * this.zoomFactor; } /** @type {?} */ const offset = this.correctionOffset(-(this.realImageWidth * this.zoomFactor - this.portraitImage.nativeElement.width) / 2, -(this.realImageHeight * this.zoomFactor - this.portraitImage.nativeElement.height) / 2, this.portraitImage.nativeElement.getBoundingClientRect()); this.translateX += offset.x; this.translateY += offset.y; this.modified = true; this.default = false; this.drawPreview(); } /** * @param {?} event * @return {?} */ zoomOut(event) { // 缩小10% this.zoomFactor = Math.max(this.minZoomFactor, this.zoomFactor * 0.9); if (this.rotateScope === 0 || this.rotateScope === 0.5) { this.portraitImage.nativeElement.width = this.realImageWidth * this.zoomFactor; this.portraitImage.nativeElement.height = this.realImageHeight * this.zoomFactor; } else { this.portraitImage.nativeElement.width = this.realImageHeight * this.zoomFactor; this.portraitImage.nativeElement.height = this.realImageWidth * this.zoomFactor; } /** @type {?} */ const offset = this.correctionOffset((this.portraitImage.nativeElement.width - this.realImageWidth * this.zoomFactor) / 2, (this.portraitImage.nativeElement.height - this.realImageHeight * this.zoomFactor) / 2, this.portraitImage.nativeElement.getBoundingClientRect()); this.translateX += offset.x; this.translateY += offset.y; this.modified = true; this.default = false; this.drawPreview(); } /** * @return {?} */ drawPreview() { /** @type {?} */ const imageRect = this.portraitImage.nativeElement.getBoundingClientRect(); // 交集 /** @type {?} */ const r = { left: Math.max(imageRect.left, this.maskRect.left), top: Math.max(imageRect.top, this.maskRect.top), right: Math.min(imageRect.right, this.maskRect.right), bottom: Math.min(imageRect.bottom, this.maskRect.bottom) }; // 相对图片左上角的偏移 r.left = r.left - imageRect.left; r.top = r.top - imageRect.top; r.right = r.right - imageRect.left; r.bottom = r.bottom - imageRect.top; /** @type {?} */ const drawX = this.maskRect.left < imageRect.left ? (imageRect.left - this.maskRect.left) / this.zoomFactor : 0; /** @type {?} */ const drawY = this.maskRect.top < imageRect.top ? (imageRect.top - this.maskRect.top) / this.zoomFactor : 0; /** @type {?} */ const realWidth = ((r.right - r.left) / this.maskRect.width) * PortraitSize; /** @type {?} */ const realHeight = ((r.bottom - r.top) / this.maskRect.height) * PortraitSize; // 再缩放到实际图片中 r.left /= this.zoomFactor; r.top /= this.zoomFactor; r.right /= this.zoomFactor; r.bottom /= this.zoomFactor; /** @type {?} */ const ctx = this.preview.nativeElement.getContext('2d'); if (realWidth < PortraitSize || realHeight < PortraitSize) { ctx.fillStyle = 'white'; ctx.fillRect(0, 0, this.preview.nativeElement.width, this.preview.nativeElement.height); } ctx.save(); /** @type {?} */ const sc = PortraitSize / (this.maskRect.width / this.zoomFactor); ctx.scale(sc, sc); ctx.drawImage(this.portraitImage.nativeElement, r.left, r.top, r.right - r.left, r.bottom - r.top, drawX, drawY, r.right - r.left, r.bottom - r.top); ctx.restore(); } /** * @param {?} rect * @return {?} */ maskChange(rect) { this.maskRect = rect; // 因为最开始就会触发一次,需要初始化过后才翻转状态 if (this.afterInit) { this.default = false; this.modified = true; } this.drawPreview(); } /** * @param {?} event * @return {?} */ rotate(event) { if (this.rotateScope === 0) { this.rotateScope = 0.75; } else { this.rotateScope -= 0.25; } /** @type {?} */ const tmp = this.portraitImage.nativeElement.width; this.portraitImage.nativeElement.width = this.portraitImage.nativeElement.height; this.portraitImage.nativeElement.height = tmp; this.modified = true; this.default = false; this.rebuildImage(); } /** * @return {?} */ get imageStyle() { return this._sanitizer.bypassSecurityTrustStyle('translate(' + this.translateX + 'px, ' + this.translateY + 'px)'); } /** * @param {?} event * @return {?} */ fileChange(event) { /** @type {?} */ const reader = new FileReader(); /** @type {?} */ const self = this; reader.onload = (/** * @param {?} oFREvent * @return {?} */ function (oFREvent) { self.srcImage.nativeElement.src = (/** @type {?} */ (oFREvent.target.result)); }); this.modified = true; this.default = false; reader.readAsDataURL(event[0]); } /** * @return {?} */ ok() { this.dialogRef.close((/** @type {?} */ ({ ok: true, data: this.default ? null : this.preview.nativeElement.toDataURL('image/jpeg') }))); } /** * @return {?} */ restoreDefault() { this.modified = true; this.mask.reset(); this.srcImage.nativeElement.src = portraitDefault; this.default = true; } } PortraitEditComponent.decorators = [ { type: Component, args: [{ selector: 'common-portrait-edit', template: "<div class=\"main\">\r\n\t<div class=\"left\">\r\n\t\t<div class=\"picture-select\" #dragContainer>\r\n\t\t\t<img #srcImage class=\"hide\" crossOrigin=\"Anonymous\" />\r\n\t\t\t<img #portraitImage class=\"image\" [style.transform]=\"imageStyle\" (load)=\"pimgLoad()\" />\r\n\t\t\t<common-portrait-mask #mask\r\n\t\t\t\tclass=\"mask\"\r\n\t\t\t\t(startDrag)=\"startDragImage($event)\"\r\n\t\t\t\t(maskChange)=\"maskChange($event)\"\r\n\t\t\t\t(dragging)=\"draggingImage($event)\"\r\n\t\t\t></common-portrait-mask>\r\n\t\t</div>\r\n\t\t<div class=\"small-button\">\r\n\t\t\t<button mat-icon-button (click)=\"rotate($event)\">\r\n\t\t\t\t<mat-icon svgIcon=\"rotate_90_degrees_ccw\"></mat-icon>\r\n\t\t\t</button>\r\n\t\t\t<span>\r\n\t\t\t\t<button mat-icon-button (click)=\"zoomIn($event)\" [disabled]=\"zoomFactor >= 1\">\r\n\t\t\t\t\t<mat-icon svgIcon=\"add_circle\"></mat-icon>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button mat-icon-button (click)=\"zoomOut($event)\" [disabled]=\"zoomFactor <= minZoomFactor\">\r\n\t\t\t\t\t<mat-icon svgIcon=\"remove_circle\"></mat-icon>\r\n\t\t\t\t</button>\r\n\t\t\t</span>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"right\">\r\n\t\t<div>\r\n\t\t\t<div class=\"\u9884\u89C8\u6807\u9898\">\u9884\u89C8</div>\r\n\t\t\t<div class=\"\u9884\u89C8\u56FE\u7247\">\r\n\t\t\t\t<canvas class=\"preview\" width=\"224\" height=\"224\" #preview></canvas>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"\u6062\u590D\u9ED8\u8BA4\u56FE\u50CF\" (click)=\"restoreDefault()\">\u6062\u590D\u9ED8\u8BA4\u56FE\u50CF</div>\r\n\t\t</div>\r\n\t\t<div class=\"button-bottom\">\r\n\t\t\t<div class=\"upload-file\">\r\n\t\t\t\t<input type=\"file\" id=\"file\" name=\"file\" (change)=\"fileChange($event.target.files)\" />\r\n\t\t\t\t<span>\u9009\u62E9\u56FE\u7247</span>\r\n\t\t\t</div>\r\n\t\t\t<button\r\n\t\t\t\tclass=\"\u786E\u8BA4\u56FE\u7247\"\r\n\t\t\t\tmat-raised-button\r\n\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t(click)=\"ok()\"\r\n\t\t\t\t[disabled]=\"!modified\"\t\t\t\t\r\n\t\t\t>\r\n\t\t\t\t\u786E\u5B9A\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t</div>\r\n\t<mat-icon (click)=\"dialogRef.close()\" class=\"\u5173\u95ED\" svgIcon=\"close\"></mat-icon>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.main{display:flex;height:100%;position:relative}.main .left{display:flex;flex-direction:column}.main .left .picture-select{width:224px;height:224px;background:url(/front/assets/userinfo/bg_picselect.png) 0 0/100% 100% no-repeat;overflow:hidden;position:relative}.main .left .picture-select .mask{width:100%;height:100%;position:absolute;left:0;top:0}.main .left .small-button{margin-top:8px;display:flex;justify-content:space-between}.main .right{flex-grow:1;height:247px;display:flex;flex-direction:column;justify-content:space-between}.main .right .\u9884\u89C8\u6807\u9898{margin-left:56px;font-size:12px}.main .right .\u9884\u89C8\u56FE\u7247{text-align:center;margin:8px 0 16px}.main .right .preview{width:112px;height:112px;border-radius:56px}.main .right .\u6062\u590D\u9ED8\u8BA4\u56FE\u50CF{font-size:12px;margin-top:16px;text-align:center;cursor:pointer}.main .right .button-bottom{margin-left:24px;height:32px}.main .right .button-bottom .upload-file{display:inline-block;width:80px;height:32px;position:relative;margin-right:8px;font-size:16px;text-align:center;line-height:32px;border-radius:4px;overflow:hidden;vertical-align:bottom}.main .right .button-bottom .upload-file #file{opacity:0;height:100%;position:absolute;left:0;top:0}.main .right .button-bottom .\u786E\u8BA4\u56FE\u7247{width:80px;height:32px;font-size:16px;line-height:32px}.hide{display:none}.\u5173\u95ED{position:absolute;right:-16px;top:-16px;cursor:pointer}"] }] } ]; /** @nocollapse */ PortraitEditComponent.ctorParameters = () => [ { type: MatDialogRef }, { type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] }, { type: DomSanitizer }, { type: CurrentService } ]; PortraitEditComponent.propDecorators = { hostClass: [{ type: HostBinding, args: ['class.portrait-edit',] }], portraitImage: [{ type: ViewChild, args: ['portraitImage', { static: true },] }], srcImage: [{ type: ViewChild, args: ['srcImage', { static: true },] }], dragContainer: [{ type: ViewChild, args: ['dragContainer', { static: true },] }], preview: [{ type: ViewChild, args: ['preview', { static: true },] }], mask: [{ type: ViewChild, args: ['mask', { static: true },] }] }; if (false) { /** @type {?} */ PortraitEditComponent.prototype.hostClass; /** @type {?} */ PortraitEditComponent.prototype.portraitImage; /** @type {?} */ PortraitEditComponent.prototype.srcImage; /** @type {?} */ PortraitEditComponent.prototype.dragContainer; /** @type {?} */ PortraitEditComponent.prototype.preview; /** @type {?} */ PortraitEditComponent.prototype.mask; /** @type {?} */ PortraitEditComponent.prototype.dragStartPoint; /** @type {?} */ PortraitEditComponent.prototype.dragStartTransformPosition; /** @type {?} */ PortraitEditComponent.prototype.dragStartImageRound; /** @type {?} */ PortraitEditComponent.prototype.realImageWidth; /** @type {?} */ PortraitEditComponent.prototype.realImageHeight; /** @type {?} */ PortraitEditComponent.prototype.zoomFactor; /** @type {?} */ PortraitEditComponent.prototype.minZoomFactor; /** @type {?} */ PortraitEditComponent.prototype.maskRect; /** @type {?} */ PortraitEditComponent.prototype.translateX; /** @type {?} */ PortraitEditComponent.prototype.translateY; /** @type {?} */ PortraitEditComponent.prototype.rotateScope; /** @type {?} */ PortraitEditComponent.prototype.modified; /** @type {?} */ PortraitEditComponent.prototype.afterInit; /** @type {?} */ PortraitEditComponent.prototype.default; /** @type {?} */ PortraitEditComponent.prototype.dialogRef; /** @type {?} */ PortraitEditComponent.prototype.data; /** * @type {?} * @private */ PortraitEditComponent.prototype._sanitizer; /** @type {?} */ PortraitEditComponent.prototype.curr; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydHJhaXQtZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvdXNlcmluZm8vcG9ydHJhaXQtZWRpdC9wb3J0cmFpdC1lZGl0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFpQixTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdHLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7OztBQUU5QywrQ0FHQzs7O0lBRkEsd0NBQXNCOztJQUN0Qiw0Q0FBaUI7Ozs7O0FBRWxCLHFEQUdDOzs7SUFGQSw2Q0FBWTs7SUFDWiwrQ0FBYTs7O01BRVIsYUFBYSxHQUFHLEdBQUc7O01BQ25CLGNBQWMsR0FBRyxHQUFHOztNQUNwQixZQUFZLEdBQUcsR0FBRzs7QUFNeEIsTUFBTSxPQUFPLHFCQUFxQjs7Ozs7Ozs7SUFxQmpDLFlBQ1EsU0FBOEMsRUFDckIsSUFBK0IsRUFDdkQsVUFBd0IsRUFDekIsSUFBb0I7UUFIcEIsY0FBUyxHQUFULFNBQVMsQ0FBcUM7UUFDckIsU0FBSSxHQUFKLElBQUksQ0FBMkI7UUFDdkQsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQUN6QixTQUFJLEdBQUosSUFBSSxDQUFnQjtRQXhCUSxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBY3JELGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixlQUFVLEdBQUcsQ0FBQyxDQUFD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QWM7Ozt3QkFxQnJCLFdBQVcsU0FBQyxxQkFBcUI7NEJBQ2pDLFNBQVMsU0FBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO3VCQUMzQyxTQUFTLFNBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs0QkFDdEMsU0FBUyxTQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7c0JBQzNDLFNBQVMsU0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO21CQUNyQyxTQUFTLFNBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs7OztJQUxuQywwQ0FBcUQ7O0lBQ3JELDhDQUEwRjs7SUFDMUYseUNBQWdGOztJQUNoRiw4Q0FBcUY7O0lBQ3JGLHdDQUErRTs7SUFDL0UscUNBQWlFOztJQUNqRSwrQ0FBc0I7O0lBQ3RCLDJEQUFrQzs7SUFDbEMsb0RBQWdDOztJQUNoQywrQ0FBdUI7O0lBQ3ZCLGdEQUF3Qjs7SUFDeEIsMkNBQW1COztJQUNuQiw4Q0FBc0I7O0lBQ3RCLHlDQUFxQjs7SUFDckIsMkNBQWU7O0lBQ2YsMkNBQWU7O0lBQ2YsNENBQWdCOztJQUNoQix5Q0FBaUI7O0lBQ2pCLDBDQUFrQjs7SUFDbEIsd0NBQWdCOztJQUVmLDBDQUFxRDs7SUFDckQscUNBQStEOzs7OztJQUMvRCwyQ0FBZ0M7O0lBQ2hDLHFDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvaW50IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcC90eXBpbmdzL2RyYWctcmVmJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlU3R5bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgQ3VycmVudFNlcnZpY2UgfSBmcm9tICdkYndlYi1jb3JlJztcclxuaW1wb3J0IHsgUG9ydHJhaXRNYXNrQ29tcG9uZW50IH0gZnJvbSAnLi9wb3J0cmFpdC1tYXNrL3BvcnRyYWl0LW1hc2suY29tcG9uZW50JztcclxuaW1wb3J0IHsgcG9ydHJhaXREZWZhdWx0IH0gZnJvbSAnLi4vLi4vY29uc3QnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQb3J0cmFpdEVkaXRDb21wb25lbnREYXRhIHtcclxuXHRpbWc6IEhUTUxJbWFnZUVsZW1lbnQ7XHJcblx0ZGVmYXVsdDogYm9vbGVhbjtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIFBvcnRyYWl0RWRpdENvbXBvbmVudFJlc3VsdERhdGEge1xyXG5cdG9rOiBib29sZWFuO1xyXG5cdGRhdGE6IHN0cmluZztcclxufVxyXG5jb25zdCBJbWFnZU1heFdpZHRoID0gMjI0O1xyXG5jb25zdCBJbWFnZU1heEhlaWdodCA9IDIyNDtcclxuY29uc3QgUG9ydHJhaXRTaXplID0gMjI0OyAvLyAxMTI7XHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnY29tbW9uLXBvcnRyYWl0LWVkaXQnLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi9wb3J0cmFpdC1lZGl0LmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi9wb3J0cmFpdC1lZGl0LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFBvcnRyYWl0RWRpdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcblx0QEhvc3RCaW5kaW5nKCdjbGFzcy5wb3J0cmFpdC1lZGl0JykgaG9zdENsYXNzID0gdHJ1ZTtcclxuXHRAVmlld0NoaWxkKCdwb3J0cmFpdEltYWdlJywgeyBzdGF0aWM6IHRydWUgfSkgcG9ydHJhaXRJbWFnZTogRWxlbWVudFJlZjxIVE1MSW1hZ2VFbGVtZW50PjtcclxuXHRAVmlld0NoaWxkKCdzcmNJbWFnZScsIHsgc3RhdGljOiB0cnVlIH0pIHNyY0ltYWdlOiBFbGVtZW50UmVmPEhUTUxJbWFnZUVsZW1lbnQ+O1xyXG5cdEBWaWV3Q2hpbGQoJ2RyYWdDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBkcmFnQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHRAVmlld0NoaWxkKCdwcmV2aWV3JywgeyBzdGF0aWM6IHRydWUgfSkgcHJldmlldzogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD47XHJcblx0QFZpZXdDaGlsZCgnbWFzaycsIHsgc3RhdGljOiB0cnVlIH0pIG1hc2s6IFBvcnRyYWl0TWFza0NvbXBvbmVudDtcclxuXHRkcmFnU3RhcnRQb2ludDogUG9pbnQ7XHJcblx0ZHJhZ1N0YXJ0VHJhbnNmb3JtUG9zaXRpb246IFBvaW50O1xyXG5cdGRyYWdTdGFydEltYWdlUm91bmQ6IENsaWVudFJlY3Q7XHJcblx0cmVhbEltYWdlV2lkdGg6IG51bWJlcjtcclxuXHRyZWFsSW1hZ2VIZWlnaHQ6IG51bWJlcjtcclxuXHR6b29tRmFjdG9yOiBudW1iZXI7XHJcblx0bWluWm9vbUZhY3RvcjogbnVtYmVyO1xyXG5cdG1hc2tSZWN0OiBDbGllbnRSZWN0O1xyXG5cdHRyYW5zbGF0ZVggPSAwO1xyXG5cdHRyYW5zbGF0ZVkgPSAwO1xyXG5cdHJvdGF0ZVNjb3BlID0gMDtcclxuXHRtb2RpZmllZCA9IGZhbHNlO1xyXG5cdGFmdGVySW5pdCA9IGZhbHNlO1xyXG5cdGRlZmF1bHQgPSBmYWxzZTsgLy8g5piv5ZCm5piv57y655yB55qE5Zu+54mH77yM57y655yB5Zu+54mH5LiN6ZyA6KaB5L+d5a2YXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8UG9ydHJhaXRFZGl0Q29tcG9uZW50PixcclxuXHRcdEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogUG9ydHJhaXRFZGl0Q29tcG9uZW50RGF0YSxcclxuXHRcdHByaXZhdGUgX3Nhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG5cdFx0cHVibGljIGN1cnI6IEN1cnJlbnRTZXJ2aWNlXHJcblx0KSB7fVxyXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHRcdHRoaXMuc3JjSW1hZ2UubmF0aXZlRWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVhbEltYWdlV2lkdGggPSB0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGg7XHJcblx0XHRcdHRoaXMucmVhbEltYWdlSGVpZ2h0ID0gdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodDtcclxuXHRcdFx0bGV0IHcgPSB0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGg7XHJcblx0XHRcdGxldCBoID0gdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodDtcclxuXHRcdFx0dGhpcy5taW5ab29tRmFjdG9yID0gdGhpcy56b29tRmFjdG9yID0gMTtcclxuXHRcdFx0aWYgKHcgPCBoICYmIGggPiBJbWFnZU1heEhlaWdodCkge1xyXG5cdFx0XHRcdHRoaXMubWluWm9vbUZhY3RvciA9IHRoaXMuem9vbUZhY3RvciA9IEltYWdlTWF4SGVpZ2h0IC8gaDtcclxuXHRcdFx0XHR3ID0gdyAqIHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdFx0XHRoID0gSW1hZ2VNYXhIZWlnaHQ7XHJcblx0XHRcdH0gZWxzZSBpZiAodyA+IGggJiYgdyA+IEltYWdlTWF4SGVpZ2h0KSB7XHJcblx0XHRcdFx0dGhpcy5taW5ab29tRmFjdG9yID0gdGhpcy56b29tRmFjdG9yID0gSW1hZ2VNYXhXaWR0aCAvIHc7XHJcblx0XHRcdFx0aCA9IGggKiB0aGlzLnpvb21GYWN0b3I7XHJcblx0XHRcdFx0dyA9IEltYWdlTWF4V2lkdGg7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggPSB3O1xyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5oZWlnaHQgPSBoO1xyXG5cdFx0XHR0aGlzLnRyYW5zbGF0ZVggPSBNYXRoLnJvdW5kKChJbWFnZU1heFdpZHRoIC0gdykgLyAyKTtcclxuXHRcdFx0dGhpcy50cmFuc2xhdGVZID0gTWF0aC5yb3VuZCgoSW1hZ2VNYXhIZWlnaHQgLSBoKSAvIDIpO1xyXG5cclxuXHRcdFx0dGhpcy5yZWJ1aWxkSW1hZ2UoKTtcclxuXHRcdH07XHJcblx0XHR0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQuc3JjID0gdGhpcy5kYXRhLmltZy5zcmM7XHJcblx0XHR0aGlzLmRlZmF1bHQgPSB0aGlzLmRhdGEuZGVmYXVsdDtcclxuXHRcdHRoaXMuYWZ0ZXJJbml0ID0gdHJ1ZTtcclxuXHR9XHJcblx0bmdPbkluaXQoKSB7fVxyXG5cdHJlYnVpbGRJbWFnZSgpIHtcclxuXHRcdGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuXHRcdGlmICh0aGlzLnJvdGF0ZVNjb3BlID09PSAwIHx8IHRoaXMucm90YXRlU2NvcGUgPT09IDAuNSkge1xyXG5cdFx0XHRjLndpZHRoID0gdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LndpZHRoO1xyXG5cdFx0XHRjLmhlaWdodCA9IHRoaXMuc3JjSW1hZ2UubmF0aXZlRWxlbWVudC5oZWlnaHQ7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjLndpZHRoID0gdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodDtcclxuXHRcdFx0Yy5oZWlnaHQgPSB0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGg7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cdFx0Y3R4LmNsZWFyUmVjdCgwLCAwLCBjLndpZHRoLCBjLmhlaWdodCk7XHJcblx0XHQvLyBtb3ZlIHRvIHRoZSBjZW50ZXIgb2YgdGhlIGNhbnZhc1xyXG5cdFx0Y3R4LnRyYW5zbGF0ZShjLndpZHRoIC8gMiwgYy5oZWlnaHQgLyAyKTtcclxuXHJcblx0XHQvLyByb3RhdGUgdGhlIGNhbnZhcyB0byB0aGUgc3BlY2lmaWVkIGRlZ3JlZXNcclxuXHRcdGN0eC5yb3RhdGUodGhpcy5yb3RhdGVTY29wZSAqIDIgKiBNYXRoLlBJKTtcclxuXHJcblx0XHQvLyBkcmF3IHRoZSBpbWFnZVxyXG5cdFx0Ly8gc2luY2UgdGhlIGNvbnRleHQgaXMgcm90YXRlZCwgdGhlIGltYWdlIHdpbGwgYmUgcm90YXRlZCBhbHNvXHJcblx0XHRjdHguZHJhd0ltYWdlKFxyXG5cdFx0XHR0aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQsXHJcblx0XHRcdC10aGlzLnNyY0ltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggLyAyLFxyXG5cdFx0XHQtdGhpcy5zcmNJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCAvIDJcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQuc3JjID0gYy50b0RhdGFVUkwoKTtcclxuXHJcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0dGhpcy5kcmF3UHJldmlldygpO1xyXG5cdFx0fSwgMTUwKTtcclxuXHR9XHJcblx0cGltZ0xvYWQoKSB7XHJcblx0XHRjb25zdCBvZmZzZXQgPSB0aGlzLmNvcnJlY3Rpb25PZmZzZXQoXHJcblx0XHRcdCh0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC53aWR0aCAtIHRoaXMucmVhbEltYWdlV2lkdGggKiB0aGlzLnpvb21GYWN0b3IpIC8gMixcclxuXHRcdFx0KHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCAtIHRoaXMucmVhbEltYWdlSGVpZ2h0ICogdGhpcy56b29tRmFjdG9yKSAvIDIsXHJcblx0XHRcdHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXHJcblx0XHQpO1xyXG5cdFx0dGhpcy50cmFuc2xhdGVYICs9IG9mZnNldC54O1xyXG5cdFx0dGhpcy50cmFuc2xhdGVZICs9IG9mZnNldC55O1xyXG5cdH1cclxuXHJcblx0c3RhcnREcmFnSW1hZ2UoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHRcdHRoaXMuZHJhZ1N0YXJ0UG9pbnQgPSB7IHg6IGV2ZW50LngsIHk6IGV2ZW50LnkgfTtcclxuXHRcdHRoaXMuZHJhZ1N0YXJ0VHJhbnNmb3JtUG9zaXRpb24gPSB7IHg6IHRoaXMudHJhbnNsYXRlWCwgeTogdGhpcy50cmFuc2xhdGVZIH07XHJcblxyXG5cdFx0dGhpcy5kcmFnU3RhcnRJbWFnZVJvdW5kID0gdGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0fVxyXG5cdC8vIOe7meWumuS4gOS4quWBj+enu++8jOi/lOWbnuagoeato+eahOe7k+aenFxyXG5cdGNvcnJlY3Rpb25PZmZzZXQoZHg6IG51bWJlciwgZHk6IG51bWJlciwgaW1hZ2VSZWN0OiBDbGllbnRSZWN0KTogUG9pbnQge1xyXG5cdFx0Y29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuZHJhZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdFx0bGV0IGx4OiBudW1iZXIsIGh4OiBudW1iZXIsIGx5OiBudW1iZXIsIGh5OiBudW1iZXI7XHJcblx0XHQvLyDlpoLmnpzlm77niYflrr3luqblsI/kuo7lrrnlmajvvIzliJnmmK/lt6bovrnmoYblt6bnp7vkuI3og73ov4flrrnlmajlt6bovrnmoYZcclxuXHRcdGlmIChjb250YWluZXJSZWN0LndpZHRoID4gaW1hZ2VSZWN0LndpZHRoKSB7XHJcblx0XHRcdGx4ID0gY29udGFpbmVyUmVjdC5sZWZ0IC0gaW1hZ2VSZWN0LmxlZnQ7XHJcblx0XHRcdGh4ID0gY29udGFpbmVyUmVjdC5yaWdodCAtIGltYWdlUmVjdC5yaWdodDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIOWQpuWImeaYr+WPs+i+ueahhuW3puenu+S4jeiDveemu+W8gOWuueWZqOWPs+i+ueahhlxyXG5cdFx0XHRseCA9IGNvbnRhaW5lclJlY3QucmlnaHQgLSBpbWFnZVJlY3QucmlnaHQ7XHJcblx0XHRcdGh4ID0gY29udGFpbmVyUmVjdC5sZWZ0IC0gaW1hZ2VSZWN0LmxlZnQ7XHJcblx0XHR9XHJcblx0XHRpZiAoY29udGFpbmVyUmVjdC5oZWlnaHQgPiBpbWFnZVJlY3QuaGVpZ2h0KSB7XHJcblx0XHRcdGx5ID0gY29udGFpbmVyUmVjdC50b3AgLSBpbWFnZVJlY3QudG9wO1xyXG5cdFx0XHRoeSA9IGNvbnRhaW5lclJlY3QuYm90dG9tIC0gaW1hZ2VSZWN0LmJvdHRvbTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGx5ID0gY29udGFpbmVyUmVjdC5ib3R0b20gLSBpbWFnZVJlY3QuYm90dG9tO1xyXG5cdFx0XHRoeSA9IGNvbnRhaW5lclJlY3QudG9wIC0gaW1hZ2VSZWN0LnRvcDtcclxuXHRcdH1cclxuXHRcdHJldHVybiB7IHg6IE1hdGgubWF4KGx4LCBNYXRoLm1pbihoeCwgZHgpKSwgeTogTWF0aC5tYXgobHksIE1hdGgubWluKGh5LCBkeSkpIH07XHJcblx0fVxyXG5cdGRyYWdnaW5nSW1hZ2UoZXZlbnQ6IFBvaW50KSB7XHJcblx0XHRjb25zdCBvZmZzZXQgPSB0aGlzLmNvcnJlY3Rpb25PZmZzZXQoXHJcblx0XHRcdGV2ZW50LnggLSB0aGlzLmRyYWdTdGFydFBvaW50LngsXHJcblx0XHRcdGV2ZW50LnkgLSB0aGlzLmRyYWdTdGFydFBvaW50LnksXHJcblx0XHRcdHRoaXMuZHJhZ1N0YXJ0SW1hZ2VSb3VuZFxyXG5cdFx0KTtcclxuXHRcdHRoaXMudHJhbnNsYXRlWCA9IHRoaXMuZHJhZ1N0YXJ0VHJhbnNmb3JtUG9zaXRpb24ueCArIG9mZnNldC54O1xyXG5cdFx0dGhpcy50cmFuc2xhdGVZID0gdGhpcy5kcmFnU3RhcnRUcmFuc2Zvcm1Qb3NpdGlvbi55ICsgb2Zmc2V0Lnk7XHJcblx0XHR0aGlzLmRyYXdQcmV2aWV3KCk7XHJcblx0XHR0aGlzLm1vZGlmaWVkID0gdHJ1ZTtcclxuXHRcdHRoaXMuZGVmYXVsdCA9IGZhbHNlO1xyXG5cdH1cclxuXHR6b29tSW4oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHRcdC8vIOaUvuWkpzEwJVxyXG5cdFx0dGhpcy56b29tRmFjdG9yID0gTWF0aC5taW4oMSwgdGhpcy56b29tRmFjdG9yICogMS4xKTtcclxuXHRcdGlmICh0aGlzLnJvdGF0ZVNjb3BlID09PSAwIHx8IHRoaXMucm90YXRlU2NvcGUgPT09IDAuNSkge1xyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC53aWR0aCA9IHRoaXMucmVhbEltYWdlV2lkdGggKiB0aGlzLnpvb21GYWN0b3I7XHJcblx0XHRcdHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCA9IHRoaXMucmVhbEltYWdlSGVpZ2h0ICogdGhpcy56b29tRmFjdG9yO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggPSB0aGlzLnJlYWxJbWFnZUhlaWdodCAqIHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQuaGVpZ2h0ID0gdGhpcy5yZWFsSW1hZ2VXaWR0aCAqIHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdH1cclxuXHRcdGNvbnN0IG9mZnNldCA9IHRoaXMuY29ycmVjdGlvbk9mZnNldChcclxuXHRcdFx0LSh0aGlzLnJlYWxJbWFnZVdpZHRoICogdGhpcy56b29tRmFjdG9yIC0gdGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGgpIC8gMixcclxuXHRcdFx0LSh0aGlzLnJlYWxJbWFnZUhlaWdodCAqIHRoaXMuem9vbUZhY3RvciAtIHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCkgLyAyLFxyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxyXG5cdFx0KTtcclxuXHRcdHRoaXMudHJhbnNsYXRlWCArPSBvZmZzZXQueDtcclxuXHRcdHRoaXMudHJhbnNsYXRlWSArPSBvZmZzZXQueTtcclxuXHRcdHRoaXMubW9kaWZpZWQgPSB0cnVlO1xyXG5cdFx0dGhpcy5kZWZhdWx0ID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5kcmF3UHJldmlldygpO1xyXG5cdH1cclxuXHR6b29tT3V0KGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblx0XHQvLyDnvKnlsI8xMCVcclxuXHRcdHRoaXMuem9vbUZhY3RvciA9IE1hdGgubWF4KHRoaXMubWluWm9vbUZhY3RvciwgdGhpcy56b29tRmFjdG9yICogMC45KTtcclxuXHJcblx0XHRpZiAodGhpcy5yb3RhdGVTY29wZSA9PT0gMCB8fCB0aGlzLnJvdGF0ZVNjb3BlID09PSAwLjUpIHtcclxuXHRcdFx0dGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggPSB0aGlzLnJlYWxJbWFnZVdpZHRoICogdGhpcy56b29tRmFjdG9yO1xyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5oZWlnaHQgPSB0aGlzLnJlYWxJbWFnZUhlaWdodCAqIHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LndpZHRoID0gdGhpcy5yZWFsSW1hZ2VIZWlnaHQgKiB0aGlzLnpvb21GYWN0b3I7XHJcblx0XHRcdHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LmhlaWdodCA9IHRoaXMucmVhbEltYWdlV2lkdGggKiB0aGlzLnpvb21GYWN0b3I7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgb2Zmc2V0ID0gdGhpcy5jb3JyZWN0aW9uT2Zmc2V0KFxyXG5cdFx0XHQodGhpcy5wb3J0cmFpdEltYWdlLm5hdGl2ZUVsZW1lbnQud2lkdGggLSB0aGlzLnJlYWxJbWFnZVdpZHRoICogdGhpcy56b29tRmFjdG9yKSAvIDIsXHJcblx0XHRcdCh0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5oZWlnaHQgLSB0aGlzLnJlYWxJbWFnZUhlaWdodCAqIHRoaXMuem9vbUZhY3RvcikgLyAyLFxyXG5cdFx0XHR0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxyXG5cdFx0KTtcclxuXHRcdHRoaXMudHJhbnNsYXRlWCArPSBvZmZzZXQueDtcclxuXHRcdHRoaXMudHJhbnNsYXRlWSArPSBvZmZzZXQueTtcclxuXHRcdHRoaXMubW9kaWZpZWQgPSB0cnVlO1xyXG5cdFx0dGhpcy5kZWZhdWx0ID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5kcmF3UHJldmlldygpO1xyXG5cdH1cclxuXHJcblx0ZHJhd1ByZXZpZXcoKSB7XHJcblx0XHRjb25zdCBpbWFnZVJlY3QgPSB0aGlzLnBvcnRyYWl0SW1hZ2UubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHRcdC8vIOS6pOmbhlxyXG5cdFx0Y29uc3QgciA9IHtcclxuXHRcdFx0bGVmdDogTWF0aC5tYXgoaW1hZ2VSZWN0LmxlZnQsIHRoaXMubWFza1JlY3QubGVmdCksXHJcblx0XHRcdHRvcDogTWF0aC5tYXgoaW1hZ2VSZWN0LnRvcCwgdGhpcy5tYXNrUmVjdC50b3ApLFxyXG5cdFx0XHRyaWdodDogTWF0aC5taW4oaW1hZ2VSZWN0LnJpZ2h0LCB0aGlzLm1hc2tSZWN0LnJpZ2h0KSxcclxuXHRcdFx0Ym90dG9tOiBNYXRoLm1pbihpbWFnZVJlY3QuYm90dG9tLCB0aGlzLm1hc2tSZWN0LmJvdHRvbSlcclxuXHRcdH07XHJcblx0XHQvLyDnm7jlr7nlm77niYflt6bkuIrop5LnmoTlgY/np7tcclxuXHRcdHIubGVmdCA9IHIubGVmdCAtIGltYWdlUmVjdC5sZWZ0O1xyXG5cdFx0ci50b3AgPSByLnRvcCAtIGltYWdlUmVjdC50b3A7XHJcblx0XHRyLnJpZ2h0ID0gci5yaWdodCAtIGltYWdlUmVjdC5sZWZ0O1xyXG5cdFx0ci5ib3R0b20gPSByLmJvdHRvbSAtIGltYWdlUmVjdC50b3A7XHJcblx0XHRjb25zdCBkcmF3WCA9IHRoaXMubWFza1JlY3QubGVmdCA8IGltYWdlUmVjdC5sZWZ0ID8gKGltYWdlUmVjdC5sZWZ0IC0gdGhpcy5tYXNrUmVjdC5sZWZ0KSAvIHRoaXMuem9vbUZhY3RvciA6IDA7XHJcblx0XHRjb25zdCBkcmF3WSA9IHRoaXMubWFza1JlY3QudG9wIDwgaW1hZ2VSZWN0LnRvcCA/IChpbWFnZVJlY3QudG9wIC0gdGhpcy5tYXNrUmVjdC50b3ApIC8gdGhpcy56b29tRmFjdG9yIDogMDtcclxuXHJcblx0XHRjb25zdCByZWFsV2lkdGggPSAoKHIucmlnaHQgLSByLmxlZnQpIC8gdGhpcy5tYXNrUmVjdC53aWR0aCkgKiBQb3J0cmFpdFNpemU7XHJcblx0XHRjb25zdCByZWFsSGVpZ2h0ID0gKChyLmJvdHRvbSAtIHIudG9wKSAvIHRoaXMubWFza1JlY3QuaGVpZ2h0KSAqIFBvcnRyYWl0U2l6ZTtcclxuXHRcdC8vIOWGjee8qeaUvuWIsOWunumZheWbvueJh+S4rVxyXG5cdFx0ci5sZWZ0IC89IHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdHIudG9wIC89IHRoaXMuem9vbUZhY3RvcjtcclxuXHRcdHIucmlnaHQgLz0gdGhpcy56b29tRmFjdG9yO1xyXG5cdFx0ci5ib3R0b20gLz0gdGhpcy56b29tRmFjdG9yO1xyXG5cdFx0Y29uc3QgY3R4ID0gdGhpcy5wcmV2aWV3Lm5hdGl2ZUVsZW1lbnQuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcblx0XHRpZiAocmVhbFdpZHRoIDwgUG9ydHJhaXRTaXplIHx8IHJlYWxIZWlnaHQgPCBQb3J0cmFpdFNpemUpIHtcclxuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9ICd3aGl0ZSc7XHJcblx0XHRcdGN0eC5maWxsUmVjdCgwLCAwLCB0aGlzLnByZXZpZXcubmF0aXZlRWxlbWVudC53aWR0aCwgd