UNPKG

ngx-pluto

Version:
303 lines 24.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewEncapsulation, Input, Output, EventEmitter, forwardRef } from "@angular/core"; import { DomSanitizer } from "@angular/platform-browser"; import { NG_VALUE_ACCESSOR, NG_VALIDATORS } from "@angular/forms"; import { Utils } from "../common/utils"; /** * 图片上传组件 - 支持NgModel和reactive forms * * <example-url>https://stackblitz.com/edit/np-img-upload-sample?embed=1&file=src/app/app.component.html</example-url> */ export class NpImgUpload { /** * @param {?} sanitizer */ constructor(sanitizer) { this.sanitizer = sanitizer; this.emitChange = (/** * @param {?} _ * @return {?} */ (_) => { }); /** * 标签 */ this.label = '选择图片'; /** * 是否忽略宽高检查,true - 忽略宽高检查,false - 检查宽高 */ this.ignoreWidthAndHeightCheck = false; /** * 上传图片按钮文字 */ this.btnText = '点击上传'; /** * 图片描述,如尺寸、格式、大小等 */ this.imgDesc = '*图片描述,如尺寸、格式、大小等*'; /** * 图片格式,默认jpg、png和jpeg */ this.imgFormat = 'jpg|png|jpeg'; /** * 图片大小,默认最大500kb */ this.maxSize = 500; /** * 当重新选择图片时触发 */ this.onImgFileChanged = new EventEmitter(); /** * 上传错误,如尺寸不对、格式不对,大小不对等 */ this.onUploadError = new EventEmitter(); /** * 点击缩略图是触发 */ this.onImgClicked = new EventEmitter(); this.currentImgFile = null; this.currentImgSrc = null; } /** * @return {?} */ ngOnInit() { } /** * @param {?} file * @return {?} */ onCurrentImgFileChanged(file) { /** @type {?} */ const filename = file.name; /** @type {?} */ const reg = new RegExp(`\.(${this.imgFormat.toLowerCase()})|.(${this.imgFormat.toUpperCase()})$`); if (!reg.test(filename)) { this.errorMessage = '图片格式不对,支持' + this.imgFormat.split('|').join('、'); this.onUploadError.next(this.errorMessage); this.emitChange({ file: null, src: null }); return; } if (file.size > +this.maxSize * 1024) { this.errorMessage = '图片大于' + this.maxSize + 'kb,请重新选择'; this.onUploadError.next(this.errorMessage); this.emitChange({ file: null, src: null }); return; } Utils.checkImgWidthAndHeight(file, +this.width, +this.height).subscribe((/** * @param {?} res * @return {?} */ res => { if (!res && !this.ignoreWidthAndHeightCheck) { this.errorMessage = '图片大小必须为' + this.width + '*' + this.height; this.onUploadError.next(this.errorMessage); this.emitChange({ file: null, src: null }); return; } this.errorMessage = ''; this.currentImgSrc = this.sanitizer.bypassSecurityTrustUrl(URL.createObjectURL(file)); this.currentImgFile = file; this.emitChange({ file: this.currentImgFile, src: this.currentImgSrc }); this.onImgFileChanged.next({ file: this.currentImgFile, src: this.currentImgSrc }); return true; })); } /** * @param {?} msg * @return {?} */ onUploadImgFormatError(msg) { this.errorMessage = '图片格式不对,支持' + this.imgFormat.split('|').join('、'); this.onUploadError.next(this.errorMessage); this.emitChange({ file: null, src: null }); } /** * @return {?} */ onCurrentImgClick() { this.onImgClicked.next({ file: this.currentImgFile, src: this.currentImgSrc }); } /** * @param {?} obj * @return {?} */ writeValue(obj) { if (obj) { this.currentImgFile = obj.file; this.currentImgSrc = obj.src; } else { this.currentImgFile = null; this.currentImgSrc = null; } } /** * @param {?} control * @return {?} */ validate(control) { if (this.isRequired) { if (control && control.value && !control.value.file && !control.value.src) { return { 'imgError': true }; } if (control && !control.value) { return { 'imgError': true }; } } return null; } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.emitChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { } /** * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { } } NpImgUpload.decorators = [ { type: Component, args: [{ selector: `np-img-upload`, template: "<div class=\"img-upload-wrapper flex-wrap col-flex\">\r\n <div class=\"flex-wrap row-flex\" style=\"align-items: baseline;\">\r\n <label class=\"img-label\">\r\n <span class=\"form-required\" *ngIf=\"isRequired\">*</span>\r\n {{ label }}\r\n </label>\r\n <np-button buttonType=\"secondary\" [funcType]=\"'upload'\" [isDisabled]=\"isDisabled\" [uploadFileType]=\"imgFormat\"\r\n (uploadErrorMessage)=\"onUploadImgFormatError($event)\" [file]=\"currentImgFile\"\r\n (fileChange)=\"onCurrentImgFileChanged($event)\">{{ btnText }}\r\n </np-button>\r\n </div>\r\n <span class=\"error-message\" *ngIf=\"errorMessage\" style=\"margin-left: 100px;\">{{ errorMessage }}</span>\r\n <div class=\"img-thumbnail-container flex-wrap col-flex middle-flex\" (click)=\"onCurrentImgClick()\">\r\n <img *ngIf=\"currentImgSrc\" [src]=\"currentImgSrc\">\r\n <div *ngIf=\"!currentImgSrc\" class=\"img-placeholder flex-wrap col-flex middle-flex\">\r\n <span>+</span>\r\n </div>\r\n </div>\r\n <span [innerHtml]=\"imgDesc | safeHtml\" class=\"img-desc\"></span>\r\n</div>\r\n", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => NpImgUpload)), multi: true, }, { provide: NG_VALIDATORS, useExisting: forwardRef((/** * @return {?} */ () => NpImgUpload)), multi: true, } ], encapsulation: ViewEncapsulation.None, styles: [".img-upload-wrapper .error-message{display:block;font-size:10px;margin:5px}.img-upload-wrapper .img-thumbnail-container{width:220px;height:160px;padding:15px;margin-top:10px;margin-left:100px;border:2.5px dashed #aaa}.img-upload-wrapper .img-thumbnail-container>.img-placeholder,.img-upload-wrapper .img-thumbnail-container>img{width:160px;height:auto;max-height:120px}.img-upload-wrapper .img-thumbnail-container>.img-placeholder{font-size:18px}.img-upload-wrapper .img-thumbnail-container>.img-placeholder span{font-size:40px;font-weight:500;color:#aaa}.img-upload-wrapper .img-label{width:80px;text-align:right;margin-right:20px;font-weight:700}.img-upload-wrapper .img-desc{font-size:12px;margin-top:10px;margin-left:100px}.img-upload-wrapper .button-secondary{margin:0!important}"] }] } ]; /** @nocollapse */ NpImgUpload.ctorParameters = () => [ { type: DomSanitizer } ]; NpImgUpload.propDecorators = { label: [{ type: Input }], isDisabled: [{ type: Input }], ignoreWidthAndHeightCheck: [{ type: Input }], isRequired: [{ type: Input }], btnText: [{ type: Input }], imgDesc: [{ type: Input }], imgFormat: [{ type: Input }], maxSize: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }], errorMessage: [{ type: Input }], onImgFileChanged: [{ type: Output }], onUploadError: [{ type: Output }], onImgClicked: [{ type: Output }] }; if (false) { /** * @type {?} * @private */ NpImgUpload.prototype.emitChange; /** * 标签 * @type {?} */ NpImgUpload.prototype.label; /** * 是否禁用 * @type {?} */ NpImgUpload.prototype.isDisabled; /** * 是否忽略宽高检查,true - 忽略宽高检查,false - 检查宽高 * @type {?} */ NpImgUpload.prototype.ignoreWidthAndHeightCheck; /** * 是否必填 - 必填则有红色*号在标签前面;否则没有 * @type {?} */ NpImgUpload.prototype.isRequired; /** * 上传图片按钮文字 * @type {?} */ NpImgUpload.prototype.btnText; /** * 图片描述,如尺寸、格式、大小等 * @type {?} */ NpImgUpload.prototype.imgDesc; /** * 图片格式,默认jpg、png和jpeg * @type {?} */ NpImgUpload.prototype.imgFormat; /** * 图片大小,默认最大500kb * @type {?} */ NpImgUpload.prototype.maxSize; /** * 图片宽度px * @type {?} */ NpImgUpload.prototype.width; /** * 图片高度px * @type {?} */ NpImgUpload.prototype.height; /** * 错误信息 - 将以红色字体显示在上传按钮下方 * @type {?} */ NpImgUpload.prototype.errorMessage; /** * 当重新选择图片时触发 * @type {?} */ NpImgUpload.prototype.onImgFileChanged; /** * 上传错误,如尺寸不对、格式不对,大小不对等 * @type {?} */ NpImgUpload.prototype.onUploadError; /** * 点击缩略图是触发 * @type {?} */ NpImgUpload.prototype.onImgClicked; /** @type {?} */ NpImgUpload.prototype.currentImgFile; /** @type {?} */ NpImgUpload.prototype.currentImgSrc; /** * @type {?} * @private */ NpImgUpload.prototype.sanitizer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1nLXVwbG9hZC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1wbHV0by8iLCJzb3VyY2VzIjpbImxpYi9pbWctdXBsb2FkL2ltZy11cGxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsS0FBSyxFQUF5QixNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNySSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixhQUFhLEVBQWdELE1BQU0sZ0JBQWdCLENBQUM7QUFDdEksT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7QUF5QnhDLE1BQU0sT0FBTyxXQUFXOzs7O0lBaUR0QixZQUFvQixTQUF1QjtRQUF2QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBaERuQyxlQUFVOzs7O1FBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBQzs7OztRQUc1QixVQUFLLEdBQVcsTUFBTSxDQUFDOzs7O1FBTXZCLDhCQUF5QixHQUFZLEtBQUssQ0FBQzs7OztRQU0zQyxZQUFPLEdBQVcsTUFBTSxDQUFDOzs7O1FBR3pCLFlBQU8sR0FBVyxtQkFBbUIsQ0FBQzs7OztRQUd0QyxjQUFTLEdBQVcsY0FBYyxDQUFDOzs7O1FBR25DLFlBQU8sR0FBVyxHQUFHLENBQUM7Ozs7UUFhckIscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7OztRQUczQyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7Ozs7UUFHM0MsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRWpELG1CQUFjLEdBQVMsSUFBSSxDQUFDO1FBQzVCLGtCQUFhLEdBQVEsSUFBSSxDQUFDO0lBRXFCLENBQUM7Ozs7SUFFaEQsUUFBUTtJQUVSLENBQUM7Ozs7O0lBRUQs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cG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIE9uSW5pdCwgSW5wdXQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlclwiO1xyXG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTElEQVRPUlMsIFZhbGlkYXRvciwgQWJzdHJhY3RDb250cm9sLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIi4uL2NvbW1vbi91dGlsc1wiO1xyXG5cclxuLyoqXHJcbiAqIOWbvueJh+S4iuS8oOe7hOS7tiAtIOaUr+aMgU5nTW9kZWzlkoxyZWFjdGl2ZSBmb3Jtc1xyXG4gKiBcclxuICogPGV4YW1wbGUtdXJsPmh0dHBzOi8vc3RhY2tibGl0ei5jb20vZWRpdC9ucC1pbWctdXBsb2FkLXNhbXBsZT9lbWJlZD0xJmZpbGU9c3JjL2FwcC9hcHAuY29tcG9uZW50Lmh0bWw8L2V4YW1wbGUtdXJsPlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IGBucC1pbWctdXBsb2FkYCxcclxuICB0ZW1wbGF0ZVVybDogJ2ltZy11cGxvYWQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ2ltZy11cGxvYWQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnBJbWdVcGxvYWQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5wSW1nVXBsb2FkKSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9XSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTnBJbWdVcGxvYWQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xyXG4gIHByaXZhdGUgZW1pdENoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcclxuXHJcbiAgLyoq5qCH562+ICovXHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICfpgInmi6nlm77niYcnO1xyXG5cclxuICAvKirmmK/lkKbnpoHnlKggKi9cclxuICBASW5wdXQoKSBpc0Rpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICAvKirmmK/lkKblv73nlaXlrr3pq5jmo4Dmn6XvvIx0cnVlIC0g5b+955Wl5a696auY5qOA5p+l77yMZmFsc2UgLSDmo4Dmn6Xlrr3pq5ggICovXHJcbiAgQElucHV0KCkgaWdub3JlV2lkdGhBbmRIZWlnaHRDaGVjazogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKirmmK/lkKblv4XloasgLSDlv4XloavliJnmnInnuqLoibIq5Y+35Zyo5qCH562+5YmN6Z2i77yb5ZCm5YiZ5rKh5pyJICovXHJcbiAgQElucHV0KCkgaXNSZXF1aXJlZDogYm9vbGVhbjtcclxuXHJcbiAgLyoq5LiK5Lyg5Zu+54mH5oyJ6ZKu5paH5a2XICovXHJcbiAgQElucHV0KCkgYnRuVGV4dDogc3RyaW5nID0gJ+eCueWHu+S4iuS8oCc7XHJcblxyXG4gIC8qKuWbvueJh+aPj+i/sO+8jOWmguWwuuWvuOOAgeagvOW8j+OAgeWkp+Wwj+etiSAqL1xyXG4gIEBJbnB1dCgpIGltZ0Rlc2M6IHN0cmluZyA9ICcq5Zu+54mH5o+P6L+w77yM5aaC5bC65a+444CB5qC85byP44CB5aSn5bCP562JKic7XHJcblxyXG4gIC8qKuWbvueJh+agvOW8j++8jOm7mOiupGpwZ+OAgXBuZ+WSjGpwZWcgKi9cclxuICBASW5wdXQoKSBpbWdGb3JtYXQ6IHN0cmluZyA9ICdqcGd8cG5nfGpwZWcnO1xyXG5cclxuICAvKirlm77niYflpKflsI/vvIzpu5jorqTmnIDlpKc1MDBrYiAqL1xyXG4gIEBJbnB1dCgpIG1heFNpemU6IG51bWJlciA9IDUwMDtcclxuXHJcbiAgLyoq5Zu+54mH5a695bqmcHggKi9cclxuICBASW5wdXQoKSB3aWR0aDogbnVtYmVyO1xyXG5cclxuICAvKirlm77niYfpq5jluqZweCAqL1xyXG4gIEBJbnB1dCgpIGhlaWdodDogbnVtYmVyO1xyXG5cclxuICAvKirplJnor6/kv6Hmga8gLSDlsIbku6XnuqLoibLlrZfkvZPmmL7npLrlnKjkuIrkvKDmjInpkq7kuIvmlrkgKi9cclxuICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuXHJcblxyXG4gIC8qKuW9k+mHjeaWsOmAieaLqeWbvueJh+aXtuinpuWPkSAqL1xyXG4gIEBPdXRwdXQoKSBvbkltZ0ZpbGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIC8qKuS4iuS8oOmUmeivr++8jOWmguWwuuWvuOS4jeWvueOAgeagvOW8j+S4jeWvue+8jOWkp+Wwj+S4jeWvueetiSAqL1xyXG4gIEBPdXRwdXQoKSBvblVwbG9hZEVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKueCueWHu+e8qeeVpeWbvuaYr+inpuWPkSAqL1xyXG4gIEBPdXRwdXQoKSBvbkltZ0NsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgY3VycmVudEltZ0ZpbGU6IEZpbGUgPSBudWxsO1xyXG4gIGN1cnJlbnRJbWdTcmM6IGFueSA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgfVxyXG5cclxuICBvbkN1cnJlbnRJbWdGaWxlQ2hhbmdlZChmaWxlOiBGaWxlKSB7XHJcbiAgICBjb25zdCBmaWxlbmFtZSA9IGZpbGUubmFtZTtcclxuICAgIGNvbnN0IHJlZyA9IG5ldyBSZWdFeHAoYFxcLigke3RoaXMuaW1nRm9ybWF0LnRvTG93ZXJDYXNlKCl9KXwuKCR7dGhpcy5pbWdGb3JtYXQudG9VcHBlckNhc2UoKX0pJGApO1xyXG4gICAgaWYgKCFyZWcudGVzdChmaWxlbmFtZSkpIHtcclxuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAn5Zu+54mH5qC85byP5LiN5a+577yM5pSv5oyBJyArIHRoaXMuaW1nRm9ybWF0LnNwbGl0KCd8Jykuam9pbign44CBJyk7XHJcbiAgICAgIHRoaXMub25VcGxvYWRFcnJvci5uZXh0KHRoaXMuZXJyb3JNZXNzYWdlKTtcclxuICAgICAgdGhpcy5lbWl0Q2hhbmdlKHsgZmlsZTogbnVsbCwgc3JjOiBudWxsIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpbGUuc2l6ZSA+ICt0aGlzLm1heFNpemUgKiAxMDI0KSB7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ+WbvueJh+Wkp+S6jicgKyB0aGlzLm1heFNpemUgKyAna2LvvIzor7fph43mlrDpgInmi6knO1xyXG4gICAgICB0aGlzLm9uVXBsb2FkRXJyb3IubmV4dCh0aGlzLmVycm9yTWVzc2FnZSk7XHJcbiAgICAgIHRoaXMuZW1pdENoYW5nZSh7IGZpbGU6IG51bGwsIHNyYzogbnVsbCB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIFV0aWxzLmNoZWNrSW1nV2lkdGhBbmRIZWlnaHQoZmlsZSwgK3RoaXMud2lkdGgsICt0aGlzLmhlaWdodCkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgIGlmICghcmVzICYmICF0aGlzLmlnbm9yZVdpZHRoQW5kSGVpZ2h0Q2hlY2spIHtcclxuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICflm77niYflpKflsI/lv4XpobvkuLonICsgdGhpcy53aWR0aCArICcqJyArIHRoaXMuaGVpZ2h0O1xyXG4gICAgICAgIHRoaXMub25VcGxvYWRFcnJvci5uZXh0KHRoaXMuZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoeyBmaWxlOiBudWxsLCBzcmM6IG51bGwgfSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xyXG4gICAgICB0aGlzLmN1cnJlbnRJbWdTcmMgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSkpO1xyXG4gICAgICB0aGlzLmN1cnJlbnRJbWdGaWxlID0gZmlsZTtcclxuXHJcbiAgICAgIHRoaXMuZW1pdENoYW5nZSh7IGZpbGU6IHRoaXMuY3VycmVudEltZ0ZpbGUsIHNyYzogdGhpcy5jdXJyZW50SW1nU3JjIH0pO1xyXG4gICAgICB0aGlzLm9uSW1nRmlsZUNoYW5nZWQubmV4dCh7IGZpbGU6IHRoaXMuY3VycmVudEltZ0ZpbGUsIHNyYzogdGhpcy5jdXJyZW50SW1nU3JjIH0pO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25VcGxvYWRJbWdGb3JtYXRFcnJvcihtc2c6IHN0cmluZykge1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAn5Zu+54mH5qC85byP5LiN5a+577yM5pSv5oyBJyArIHRoaXMuaW1nRm9ybWF0LnNwbGl0KCd8Jykuam9pbign44CBJyk7XHJcbiAgICB0aGlzLm9uVXBsb2FkRXJyb3IubmV4dCh0aGlzLmVycm9yTWVzc2FnZSk7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UoeyBmaWxlOiBudWxsLCBzcmM6IG51bGwgfSk7XHJcbiAgfVxyXG5cclxuICBvbkN1cnJlbnRJbWdDbGljaygpIHtcclxuICAgIHRoaXMub25JbWdDbGlja2VkLm5leHQoe2ZpbGU6IHRoaXMuY3VycmVudEltZ0ZpbGUsIHNyYzogdGhpcy5jdXJyZW50SW1nU3JjfSk7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICBpZiAob2JqKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEltZ0ZpbGUgPSBvYmouZmlsZTtcclxuICAgICAgdGhpcy5jdXJyZW50SW1nU3JjID0gb2JqLnNyYztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEltZ0ZpbGUgPSBudWxsO1xyXG4gICAgICB0aGlzLmN1cnJlbnRJbWdTcmMgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB7XHJcbiAgICBpZiAodGhpcy5pc1JlcXVpcmVkKSB7XHJcbiAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wudmFsdWUgJiYgIWNvbnRyb2wudmFsdWUuZmlsZSAmJiAhY29udHJvbC52YWx1ZS5zcmMpIHtcclxuICAgICAgICByZXR1cm4geyAnaW1nRXJyb3InOiB0cnVlIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb250cm9sICYmICFjb250cm9sLnZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgJ2ltZ0Vycm9yJzogdHJ1ZSB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuZW1pdENoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQgeyB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHsgfVxyXG59Il19