ng-yunzai-mobile
Version:
1. 适配yunzai_uni_app_x
360 lines • 28.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: img-cropper/yz-img-cropper/yz-img-cropper.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Inject } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog";
import { ToastService } from "ng-zorro-antd-mobile";
import imageCompression from "browser-image-compression";
var YzImgCropperComponent = /** @class */ (function () {
function YzImgCropperComponent(dialogRef, _toast, data) {
this.dialogRef = dialogRef;
this._toast = _toast;
this.data = data;
this.cropperStyle = {
height: window.innerHeight - 142 + 'px',
width: '100%',
padding: 0,
display: 'flex',
'align-items': 'center',
'justify-content': 'center',
'align-content': 'center',
'flex-wrap': 'wrap'
};
this.imageChangedEvent = null;
this.imageBase64 = null;
this.imageBlobFile = null;
this.croppedImage = null;
this.showImg = false;
this.imgInfo = {
width: 0,
height: 0
};
this.canvasRotation = 0;
this.transform = {};
this.scale = 1;
// 图片压缩进度
this.percent = 0;
}
/**
* @return {?}
*/
YzImgCropperComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.data.imgFile) {
this.fileChangeEvent(this.data.imgFile);
}
else {
this._toast.info('请选择上传图片!');
}
};
/**
* @param {?} event
* @return {?}
*/
YzImgCropperComponent.prototype.fileChangeEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.data.fileType == 'FileEvent' || !this.data.fileType) {
this.imageChangedEvent = event;
this.imageBase64 = null;
this.imageBlobFile = null;
}
else if (this.data.fileType == 'Base64') {
this.imageChangedEvent = null;
this.imageBase64 = event;
this.imageBlobFile = null;
}
else if (this.data.fileType == 'BlobFile') {
this.imageChangedEvent = null;
this.imageBase64 = null;
this.imageBlobFile = event;
}
};
// 每次裁剪图像时发出
// 每次裁剪图像时发出
/**
* @param {?} event
* @return {?}
*/
YzImgCropperComponent.prototype.imageCropped =
// 每次裁剪图像时发出
/**
* @param {?} event
* @return {?}
*/
function (event) {
this.croppedImage = event.base64;
this.imgInfo = event;
};
// 选择错误的文件类型时发出(仅允许png、gif和jpg)
// 选择错误的文件类型时发出(仅允许png、gif和jpg)
/**
* @return {?}
*/
YzImgCropperComponent.prototype.loadImageFailed =
// 选择错误的文件类型时发出(仅允许png、gif和jpg)
/**
* @return {?}
*/
function () {
this._toast.info("\u56FE\u7247\u9009\u62E9\u5931\u8D25\uFF01");
};
// 还原图片大小
// 还原图片大小
/**
* @return {?}
*/
YzImgCropperComponent.prototype.resetImage =
// 还原图片大小
/**
* @return {?}
*/
function () {
this.scale = 1;
this.canvasRotation = 0;
this.transform = {};
};
// 取消裁剪
// 取消裁剪
/**
* @return {?}
*/
YzImgCropperComponent.prototype.cancelCropper =
// 取消裁剪
/**
* @return {?}
*/
function () {
this.imageChangedEvent = null;
this.imageBase64 = null;
this.imageBlobFile = null;
this.croppedImage = null;
this.showImg = false;
this.percent = 0;
this.imgInfo = {
width: 0,
height: 0
};
this.dialogRef.close();
this.resetImage();
};
// 裁剪完毕=>压缩图片
// 裁剪完毕=>压缩图片
/**
* @return {?}
*/
YzImgCropperComponent.prototype.confirmCropper =
// 裁剪完毕=>压缩图片
/**
* @return {?}
*/
function () {
if (!this.croppedImage)
return;
this.dataURLtoFile(this.croppedImage, 'img_name');
};
/**
* @param {?} dataurl
* @param {?} filename
* @return {?}
*/
YzImgCropperComponent.prototype.dataURLtoFile = /**
* @param {?} dataurl
* @param {?} filename
* @return {?}
*/
function (dataurl, filename) {
/** @type {?} */
var arr = dataurl.split(',');
/** @type {?} */
var mime = arr[0].match(/:(.*?);/)[1];
/** @type {?} */
var bstr = atob(arr[1]);
/** @type {?} */
var n = bstr.length;
/** @type {?} */
var u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
/** @type {?} */
var file = new File([u8arr], filename, { type: mime });
this.compressImage(file);
};
// 图片压缩 https://www.npmjs.com/package/browser-image-compression
// 图片压缩 https://www.npmjs.com/package/browser-image-compression
/**
* @param {?} imageFile
* @return {?}
*/
YzImgCropperComponent.prototype.compressImage =
// 图片压缩 https://www.npmjs.com/package/browser-image-compression
/**
* @param {?} imageFile
* @return {?}
*/
function (imageFile) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var options, compressedFile, error_1;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
options = {
maxSizeMB: this.data.maxSizeMB,
maxWidthOrHeight: this.data.maxWidthOrHeight,
fileType: "image/" + this.data.format,
useWebWorker: true,
onProgress: (/**
* @param {?} res
* @return {?}
*/
function (res) {
_this.percent = res;
})
};
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, imageCompression(imageFile, options)];
case 2:
compressedFile = _a.sent();
this.blobToBase64(compressedFile, (/**
* @param {?} dataurl
* @return {?}
*/
function (dataurl) {
_this.dialogRef.close(dataurl);
}));
this.cancelCropper();
return [3 /*break*/, 4];
case 3:
error_1 = _a.sent();
console.error('图片压缩失败!');
return [3 /*break*/, 4];
case 4: return [2 /*return*/];
}
});
});
};
/**
* @param {?} blob
* @param {?} callback
* @return {?}
*/
YzImgCropperComponent.prototype.blobToBase64 = /**
* @param {?} blob
* @param {?} callback
* @return {?}
*/
function (blob, callback) {
/** @type {?} */
var fileReader = new FileReader();
fileReader.onload = (/**
* @param {?} e
* @return {?}
*/
function (e) {
callback(e.target['result']);
});
fileReader.readAsDataURL(blob);
};
YzImgCropperComponent.decorators = [
{ type: Component, args: [{
selector: 'yz-img-cropper',
template: "<yz-loading-mask *ngIf=\"percent>0 && percent<100\"></yz-loading-mask>\r\n<div class=\"yz-img-cropper\">\r\n\r\n <image-cropper\r\n *ngIf=\"!showImg\"\r\n [imageChangedEvent]=\"imageChangedEvent\"\r\n [imageBase64]=\"imageBase64\"\r\n [imageFile]=\"imageBlobFile\"\r\n [containWithinAspectRatio]=\"data.containWithinAspectRatio\"\r\n [maintainAspectRatio]=\"true\"\r\n [format]=\"data.format\"\r\n [onlyScaleDown]=\"true\"\r\n [aspectRatio]=\"data.aspectRatio\"\r\n [imageQuality]=\"data.imageQuality\"\r\n [transform]=\"transform\"\r\n [canvasRotation]=\"canvasRotation\"\r\n (imageCropped)=\"imageCropped($event)\"\r\n (loadImageFailed)=\"loadImageFailed()\"\r\n [ngStyle]=\"cropperStyle\"\r\n ></image-cropper>\r\n\r\n <!-- \u88C1\u526A\u540E\u7684\u56FE\u7247-->\r\n <div *ngIf=\"showImg\" class=\"yz-img-cropper-img\" [ngStyle]=\"cropperStyle\">\r\n <img [src]=\"croppedImage\"/>\r\n <b>\u50CF\u7D20\uFF1A{{imgInfo.width}}*{{imgInfo.height}}</b>\r\n </div>\r\n\r\n <div class=\"yz-img-cropper-btn\">\r\n <div Button [type]=\"'primary'\" *ngIf=\"!showImg\" (onClick)=\"showImg=true\">\u786E\u5B9A</div>\r\n <!--\u53D6\u6D88\u88C1\u526A-->\r\n <div Button *ngIf=\"!showImg\" (onClick)=\"cancelCropper()\">\u53D6\u6D88</div>\r\n\r\n <div Button [type]=\"'primary'\" *ngIf=\"showImg\" (onClick)=\"confirmCropper()\">\u5B8C\u6210</div>\r\n <!-- \u91CD\u65B0\u88C1\u526A-->\r\n <div Button *ngIf=\"showImg\" (onClick)=\"showImg=false\">\u53D6\u6D88</div>\r\n </div>\r\n\r\n</div>\r\n",
styles: ["::ng-deep .yz-img-cropper-panel{position:fixed!important;top:0;left:0;z-index:10;width:100%;height:100%;background:#fff;max-width:unset!important}::ng-deep .yz-img-cropper-panel .mat-dialog-container{padding:0;border-radius:0;transform:none!important}::ng-deep .yz-img-cropper-btn{margin:16px}::ng-deep .yz-img-cropper-btn .am-button{margin-bottom:16px}.yz-img-cropper-img{width:100%;background:#fff}.yz-img-cropper-img img{display:block;max-width:100%;margin:0 auto 16px}.yz-img-cropper-img b{font-size:16px;text-align:center;display:block}"]
}] }
];
/** @nocollapse */
YzImgCropperComponent.ctorParameters = function () { return [
{ type: MatDialogRef },
{ type: ToastService },
{ type: ComponentOption, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] }
]; };
return YzImgCropperComponent;
}());
export { YzImgCropperComponent };
if (false) {
/** @type {?} */
YzImgCropperComponent.prototype.cropperStyle;
/** @type {?} */
YzImgCropperComponent.prototype.imageChangedEvent;
/** @type {?} */
YzImgCropperComponent.prototype.imageBase64;
/** @type {?} */
YzImgCropperComponent.prototype.imageBlobFile;
/** @type {?} */
YzImgCropperComponent.prototype.croppedImage;
/** @type {?} */
YzImgCropperComponent.prototype.showImg;
/** @type {?} */
YzImgCropperComponent.prototype.imgInfo;
/** @type {?} */
YzImgCropperComponent.prototype.canvasRotation;
/** @type {?} */
YzImgCropperComponent.prototype.transform;
/** @type {?} */
YzImgCropperComponent.prototype.scale;
/** @type {?} */
YzImgCropperComponent.prototype.percent;
/** @type {?} */
YzImgCropperComponent.prototype.dialogRef;
/**
* @type {?}
* @private
*/
YzImgCropperComponent.prototype._toast;
/** @type {?} */
YzImgCropperComponent.prototype.data;
}
// 组件参数
var
// 组件参数
ComponentOption = /** @class */ (function () {
function ComponentOption() {
// 上传的图片文件
this.fileType = 'FileEvent'; // 上传的图片文件类型 'FileEvent' | 'Base64' | 'BlobFile'
// 上传的图片文件类型 'FileEvent' | 'Base64' | 'BlobFile'
this.containWithinAspectRatio = false; // 设置为true时,将在图像周围添加填充以使其适合纵横比,默认false
// 设置为true时,将在图像周围添加填充以使其适合纵横比,默认false
this.format = 'png'; // 输出格式(png、jpeg、webp、bmp、ico)(并非所有浏览器都支持所有类型,始终支持png,其他为可选),默认png
// 输出格式(png、jpeg、webp、bmp、ico)(并非所有浏览器都支持所有类型,始终支持png,其他为可选),默认png
this.imageQuality = 92; // 这仅适用于使用jpeg或webp作为输出格式时。输入介于0和100之间的数字将决定输出图像的质量,默认92。
// 这仅适用于使用jpeg或webp作为输出格式时。输入介于0和100之间的数字将决定输出图像的质量,默认92。
this.aspectRatio = 1 / 1; // 图片宽度/高度比(例如,正方形为1/1,4/3,16/9…),默认1/1
// 图片宽度/高度比(例如,正方形为1/1,4/3,16/9…),默认1/1
this.maxSizeMB = 1; // 裁剪压缩后的图片大小的最大值,默认1MB
// 裁剪压缩后的图片大小的最大值,默认1MB
this.maxWidthOrHeight = 100; // 裁剪压缩后的图片的最大宽度或高度,默认100
}
return ComponentOption;
}());
// 组件参数
export { ComponentOption };
if (false) {
/** @type {?} */
ComponentOption.prototype.imgFile;
/** @type {?} */
ComponentOption.prototype.fileType;
/** @type {?} */
ComponentOption.prototype.containWithinAspectRatio;
/** @type {?} */
ComponentOption.prototype.format;
/** @type {?} */
ComponentOption.prototype.imageQuality;
/** @type {?} */
ComponentOption.prototype.aspectRatio;
/** @type {?} */
ComponentOption.prototype.maxSizeMB;
/** @type {?} */
ComponentOption.prototype.maxWidthOrHeight;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXotaW1nLWNyb3BwZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcteXVuemFpLW1vYmlsZS8iLCJzb3VyY2VzIjpbImltZy1jcm9wcGVyL3l6LWltZy1jcm9wcGVyL3l6LWltZy1jcm9wcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUV4RCxPQUFPLEVBQUMsZUFBZSxFQUFFLFlBQVksRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBRXpEO0lBb0NFLCtCQUFtQixTQUE4QyxFQUM3QyxNQUFvQixFQUNJLElBQXFCO1FBRjlDLGNBQVMsR0FBVCxTQUFTLENBQXFDO1FBQzdDLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDSSxTQUFJLEdBQUosSUFBSSxDQUFpQjtRQS9CakUsaUJBQVksR0FBRztZQUNiLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxJQUFJO1lBQ3ZDLEtBQUssRUFBRSxNQUFNO1lBQ2IsT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsTUFBTTtZQUNmLGFBQWEsRUFBRSxRQUFRO1lBQ3ZCLGlCQUFpQixFQUFFLFFBQVE7WUFDM0IsZUFBZSxFQUFFLFFBQVE7WUFDekIsV0FBVyxFQUFFLE1BQU07U0FDcEIsQ0FBQztRQUVGLHNCQUFpQixHQUFRLElBQUksQ0FBQztRQUM5QixnQkFBVyxHQUFXLElBQUksQ0FBQztRQUMzQixrQkFBYSxHQUFTLElBQUksQ0FBQztRQUUzQixpQkFBWSxHQUFRLElBQUksQ0FBQztRQUN6QixZQUFPLEdBQVksS0FBSyxDQUFDO1FBQ3pCLFlBQU8sR0FBRztZQUNSLEtBQUssRUFBRSxDQUFDO1lBQ1IsTUFBTSxF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QUFxRDs7O0FBbUhuRTs7O0lBQUE7O1FBRUUsYUFBUSxHQUFZLFdBQVcsQ0FBQyxDQUFDLGdEQUFnRDs7UUFDakYsNkJBQXdCLEdBQWEsS0FBSyxDQUFDLENBQUMsc0NBQXNDOztRQUNsRixXQUFNLEdBQVksS0FBSyxDQUFDLENBQUMsa0VBQWtFOztRQUMzRixpQkFBWSxHQUFZLEVBQUUsQ0FBQyxDQUFDLHlEQUF5RDs7UUFDckYsZ0JBQVcsR0FBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsdUNBQXVDOztRQUNyRSxjQUFTLEdBQVksQ0FBQyxDQUFDLENBQUMsdUJBQXVCOztRQUMvQyxxQkFBZ0IsR0FBWSxHQUFHLENBQUMsQ0FBQyx5QkFBeUI7SUFDNUQsQ0FBQztJQUFELHNCQUFDO0FBQUQsQ0FBQyxBQVRELElBU0M7Ozs7O0lBUkMsa0NBQWE7O0lBQ2IsbUNBQWdDOztJQUNoQyxtREFBMkM7O0lBQzNDLGlDQUF3Qjs7SUFDeEIsdUNBQTJCOztJQUMzQixzQ0FBNkI7O0lBQzdCLG9DQUF1Qjs7SUFDdkIsMkNBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEluamVjdCwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtJbWFnZUNyb3BwZWRFdmVudCwgSW1hZ2VUcmFuc2Zvcm19IGZyb20gXCJuZ3gtaW1hZ2UtY3JvcHBlclwiO1xyXG5pbXBvcnQge01BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7VG9hc3RTZXJ2aWNlfSBmcm9tIFwibmctem9ycm8tYW50ZC1tb2JpbGVcIjtcclxuaW1wb3J0IGltYWdlQ29tcHJlc3Npb24gZnJvbSBcImJyb3dzZXItaW1hZ2UtY29tcHJlc3Npb25cIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAneXotaW1nLWNyb3BwZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi95ei1pbWctY3JvcHBlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4veXotaW1nLWNyb3BwZXIuY29tcG9uZW50Lmxlc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgWXpJbWdDcm9wcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgY3JvcHBlclN0eWxlID0ge1xyXG4gICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLSAxNDIgKyAncHgnLFxyXG4gICAgd2lkdGg6ICcxMDAlJyxcclxuICAgIHBhZGRpbmc6IDAsXHJcbiAgICBkaXNwbGF5OiAnZmxleCcsXHJcbiAgICAnYWxpZ24taXRlbXMnOiAnY2VudGVyJyxcclxuICAgICdqdXN0aWZ5LWNvbnRlbnQnOiAnY2VudGVyJyxcclxuICAgICdhbGlnbi1jb250ZW50JzogJ2NlbnRlcicsXHJcbiAgICAnZmxleC13cmFwJzogJ3dyYXAnXHJcbiAgfTtcclxuXHJcbiAgaW1hZ2VDaGFuZ2VkRXZlbnQ6IGFueSA9IG51bGw7XHJcbiAgaW1hZ2VCYXNlNjQ6IHN0cmluZyA9IG51bGw7XHJcbiAgaW1hZ2VCbG9iRmlsZTogQmxvYiA9IG51bGw7XHJcblxyXG4gIGNyb3BwZWRJbWFnZTogYW55ID0gbnVsbDtcclxuICBzaG93SW1nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaW1nSW5mbyA9IHtcclxuICAgIHdpZHRoOiAwLFxyXG4gICAgaGVpZ2h0OiAwXHJcbiAgfTtcclxuXHJcbiAgY2FudmFzUm90YXRpb24gPSAwO1xyXG4gIHRyYW5zZm9ybTogSW1hZ2VUcmFuc2Zvcm0gPSB7fTtcclxuICBzY2FsZSA9IDE7XHJcblxyXG4gIC8vIOWbvueJh+WOi+e8qei/m+W6plxyXG4gIHBlcmNlbnQgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8WXpJbWdDcm9wcGVyQ29tcG9uZW50PixcclxuICAgICAgICAgICAgICBwcml2YXRlIF90b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogQ29tcG9uZW50T3B0aW9uKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuaW1nRmlsZSkge1xyXG4gICAgICB0aGlzLmZpbGVDaGFuZ2VFdmVudCh0aGlzLmRhdGEuaW1nRmlsZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl90b2FzdC5pbmZvKCfor7fpgInmi6nkuIrkvKDlm77niYfvvIEnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpbGVDaGFuZ2VFdmVudChldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kYXRhLmZpbGVUeXBlID09ICdGaWxlRXZlbnQnIHx8ICF0aGlzLmRhdGEuZmlsZVR5cGUpIHtcclxuICAgICAgdGhpcy5pbWFnZUNoYW5nZWRFdmVudCA9IGV2ZW50O1xyXG4gICAgICB0aGlzLmltYWdlQmFzZTY0ID0gbnVsbDtcclxuICAgICAgdGhpcy5pbWFnZUJsb2JGaWxlID0gbnVsbDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmZpbGVUeXBlID09ICdCYXNlNjQnKSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VDaGFuZ2VkRXZlbnQgPSBudWxsO1xyXG4gICAgICB0aGlzLmltYWdlQmFzZTY0ID0gZXZlbnQ7XHJcbiAgICAgIHRoaXMuaW1hZ2VCbG9iRmlsZSA9IG51bGw7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5maWxlVHlwZSA9PSAnQmxvYkZpbGUnKSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VDaGFuZ2VkRXZlbnQgPSBudWxsO1xyXG4gICAgICB0aGlzLmltYWdlQmFzZTY0ID0gbnVsbDtcclxuICAgICAgdGhpcy5pbWFnZUJsb2JGaWxlID0gZXZlbnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDmr4/mrKHoo4Hliarlm77lg4/ml7blj5Hlh7pcclxuICBpbWFnZUNyb3BwZWQoZXZlbnQ6IEltYWdlQ3JvcHBlZEV2ZW50KSB7XHJcbiAgICB0aGlzLmNyb3BwZWRJbWFnZSA9IGV2ZW50LmJhc2U2NDtcclxuICAgIHRoaXMuaW1nSW5mbyA9IGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8g6YCJ5oup6ZSZ6K+v55qE5paH5Lu257G75Z6L5pe25Y+R5Ye677yI5LuF5YWB6K64cG5n44CBZ2lm5ZKManBn77yJXHJcbiAgbG9hZEltYWdlRmFpbGVkKCkge1xyXG4gICAgdGhpcy5fdG9hc3QuaW5mbyhg5Zu+54mH6YCJ5oup5aSx6LSl77yBYCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8g6L+Y5Y6f5Zu+54mH5aSn5bCPXHJcbiAgcmVzZXRJbWFnZSgpIHtcclxuICAgIHRoaXMuc2NhbGUgPSAxO1xyXG4gICAgdGhpcy5jYW52YXNSb3RhdGlvbiA9IDA7XHJcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHt9O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIOWPlua2iOijgeWJqlxyXG4gIGNhbmNlbENyb3BwZXIoKSB7XHJcbiAgICB0aGlzLmltYWdlQ2hhbmdlZEV2ZW50ID0gbnVsbDtcclxuICAgIHRoaXMuaW1hZ2VCYXNlNjQgPSBudWxsO1xyXG4gICAgdGhpcy5pbWFnZUJsb2JGaWxlID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLmNyb3BwZWRJbWFnZSA9IG51bGw7XHJcbiAgICB0aGlzLnNob3dJbWcgPSBmYWxzZTtcclxuICAgIHRoaXMucGVyY2VudCA9IDA7XHJcbiAgICB0aGlzLmltZ0luZm8gPSB7XHJcbiAgICAgIHdpZHRoOiAwLFxyXG4gICAgICBoZWlnaHQ6IDBcclxuICAgIH07XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gICAgdGhpcy5yZXNldEltYWdlKCk7XHJcbiAgfVxyXG5cclxuICAvLyDoo4Hliarlrozmr5U9PuWOi+e8qeWbvueJh1xyXG4gIGNvbmZpcm1Dcm9wcGVyKCkge1xyXG4gICAgaWYoIXRoaXMuY3JvcHBlZEltYWdlKSByZXR1cm47XHJcbiAgICB0aGlzLmRhdGFVUkx0b0ZpbGUodGhpcy5jcm9wcGVkSW1hZ2UsICdpbWdfbmFtZScpO1xyXG4gIH1cclxuXHJcbiAgZGF0YVVSTHRvRmlsZShkYXRhdXJsLCBmaWxlbmFtZSkge1xyXG4gICAgY29uc3QgYXJyID0gZGF0YXVybC5zcGxpdCgnLCcpO1xyXG4gICAgY29uc3QgbWltZSA9IGFyclswXS5tYXRjaCgvOiguKj8pOy8pWzFdO1xyXG4gICAgY29uc3QgYnN0ciA9IGF0b2IoYXJyWzFdKTtcclxuICAgIGxldCBuID0gYnN0ci5sZW5ndGg7XHJcbiAgICBjb25zdCB1OGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xyXG4gICAgd2hpbGUgKG4tLSkge1xyXG4gICAgICB1OGFycltuXSA9IGJzdHIuY2hhckNvZGVBdChuKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZShbdThhcnJdLCBmaWxlbmFtZSwge3R5cGU6IG1pbWV9KTtcclxuICAgIHRoaXMuY29tcHJlc3NJbWFnZShmaWxlKTtcclxuICB9XHJcblxyXG4gIC8vIOWbvueJh+WOi+e8qSBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9icm93c2VyLWltYWdlLWNvbXByZXNzaW9uXHJcbiAgYXN5bmMgY29tcHJlc3NJbWFnZShpbWFnZUZpbGUpIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgIG1heFNpemVNQjogdGhpcy5kYXRhLm1heFNpemVNQixcclxuICAgICAgbWF4V2lkdGhPckhlaWdodDogdGhpcy5kYXRhLm1heFdpZHRoT3JIZWlnaHQsXHJcbiAgICAgIGZpbGVUeXBlOiBgaW1hZ2UvJHt0aGlzLmRhdGEuZm9ybWF0fWAsXHJcbiAgICAgIHVzZVdlYldvcmtlcjogdHJ1ZSxcclxuICAgICAgb25Qcm9ncmVzczogKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMucGVyY2VudCA9IHJlcztcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNvbXByZXNzZWRGaWxlID0gYXdhaXQgaW1hZ2VDb21wcmVzc2lvbihpbWFnZUZpbGUsIG9wdGlvbnMpO1xyXG4gICAgICB0aGlzLmJsb2JUb0Jhc2U2NChjb21wcmVzc2VkRmlsZSwgKGRhdGF1cmwpID0+IHtcclxuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShkYXRhdXJsKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuY2FuY2VsQ3JvcHBlcigpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcign5Zu+54mH5Y6L57yp5aSx6LSl77yBJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBibG9iVG9CYXNlNjQoYmxvYiwgY2FsbGJhY2spIHtcclxuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgZmlsZVJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xyXG4gICAgICBjYWxsYmFjayhlLnRhcmdldFsncmVzdWx0J10pO1xyXG4gICAgfTtcclxuICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcclxuICB9XHJcbn1cclxuXHJcbi8vIOe7hOS7tuWPguaVsFxyXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50T3B0aW9uIHtcclxuICBpbWdGaWxlOiBhbnk7IC8vIOS4iuS8oOeahOWbvueJh+aWh+S7tlxyXG4gIGZpbGVUeXBlPzogc3RyaW5nID0gJ0ZpbGVFdmVudCc7IC8vIOS4iuS8oOeahOWbvueJh+aWh+S7tuexu+WeiyAnRmlsZUV2ZW50JyB8ICdCYXNlNjQnIHwgJ0Jsb2JGaWxlJ1xyXG4gIGNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbz86IGJvb2xlYW4gPSBmYWxzZTsgLy8g6K6+572u5Li6dHJ1ZeaXtu+8jOWwhuWcqOWbvuWDj+WRqOWbtOa3u+WKoOWhq+WFheS7peS9v+WFtumAguWQiOe6teaoquavlCzpu5jorqRmYWxzZVxyXG4gIGZvcm1hdD86IHN0cmluZyA9ICdwbmcnOyAvLyDovpPlh7rmoLzlvI/vvIhwbmfjgIFqcGVn44CBd2VicOOAgWJtcOOAgWljb++8ie+8iOW5tumdnuaJgOaciea1j+iniOWZqOmDveaUr+aMgeaJgOacieexu+Wei++8jOWni+e7iOaUr+aMgXBuZ++8jOWFtuS7luS4uuWPr+mAie+8ie+8jOm7mOiupHBuZ1xyXG4gIGltYWdlUXVhbGl0eT86IG51bWJlciA9IDkyOyAvLyDov5nku4XpgILnlKjkuo7kvb/nlKhqcGVn5oiWd2VicOS9nOS4uui+k+WHuuagvOW8j+aXtuOAgui+k+WFpeS7i+S6jjDlkowxMDDkuYvpl7TnmoTmlbDlrZflsIblhrPlrprovpPlh7rlm77lg4/nmoTotKjph4/vvIzpu5jorqQ5MuOAglxyXG4gIGFzcGVjdFJhdGlvPzogbnVtYmVyID0gMSAvIDE7IC8vIOWbvueJh+WuveW6pi/pq5jluqbmr5TvvIjkvovlpoLvvIzmraPmlrnlvaLkuLoxLzHvvIw0LzPvvIwxNi854oCm77yJ77yM6buY6K6kMS8xXHJcbiAgbWF4U2l6ZU1CPzogbnVtYmVyID0gMTsgLy8g6KOB5Ymq5Y6L57yp5ZCO55qE5Zu+54mH5aSn5bCP55qE5pyA5aSn5YC877yM6buY6K6kMU1CXHJcbiAgbWF4V2lkdGhPckhlaWdodD86IG51bWJlciA9IDEwMDsgLy8g6KOB5Ymq5Y6L57yp5ZCO55qE5Zu+54mH55qE5pyA5aSn5a695bqm5oiW6auY5bqm77yM6buY6K6kMTAwXHJcbn1cclxuIl19