UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

333 lines (332 loc) 22.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { DefaultControlValueAccessor } from './../common/default-control-value-accessor'; import { Component, Input, EventEmitter, Output, forwardRef, ViewChild, ElementRef, Renderer2 } from '@angular/core'; import { AsiFileService } from './../../services/asi-file.service'; import * as nh from '../../native-helper'; var AsiFileChooserComponent = /** @class */ (function (_super) { tslib_1.__extends(AsiFileChooserComponent, _super); function AsiFileChooserComponent(fileService, renderer, elementRef) { var _this = _super.call(this) || this; _this.fileService = fileService; _this.renderer = renderer; _this.elementRef = elementRef; /** * Label position */ _this.labelPosition = 'top'; /** * Preload filechooser with an url */ _this.fileSrc = null; /** * Allow you to force the name of the file */ _this.fileName = null; /** * By default we dont block the file is the user select a wrong type */ _this.blockImport = false; /** * Icon to display */ _this.icon = 'fa fa-paperclip'; /** * Event emitted when an error occured with the selected file */ _this.onError = new EventEmitter(); _this.acceptAttribute = ''; _this.dragging = false; _this.loaded = false; _this.fileLoaded = false; return _this; } /** * @return {?} */ AsiFileChooserComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.renderer.addClass(this.elementRef.nativeElement, 'label-' + this.labelPosition); if (this.fileSrc != null) { this.fileService.getFileAsBlob(this.fileSrc).subscribe(function (blob) { /** @type {?} */ var fileName = _this.fileName || _this.fileSrc.split('/').pop(); /** @type {?} */ var file = new Blob([blob], { type: blob.type }); file.name = fileName; _this.value = file; }); } }; /** * @return {?} */ AsiFileChooserComponent.prototype.ngOnChanges = /** * @return {?} */ function () { var _this = this; if (nh.isArray(this.accept)) { (/** @type {?} */ (this.accept)).forEach(function (accept) { _this.acceptAttribute += accept.extension + ', ' + accept.mimeType + ','; }); } else if (this.accept != null) { /** @type {?} */ var aAccept = (/** @type {?} */ (this.accept)); this.acceptAttribute = aAccept.extension + ', ' + aAccept.mimeType; } }; /** * @return {?} */ AsiFileChooserComponent.prototype.openFileInput = /** * @return {?} */ function () { this.fileInput.nativeElement.value = null; this.fileInput.nativeElement.click(); }; /** * @return {?} */ AsiFileChooserComponent.prototype.getFileUrl = /** * @return {?} */ function () { return this.fileService.getFileUrl(this.value); }; /** * @return {?} */ AsiFileChooserComponent.prototype.clean = /** * @return {?} */ function () { this.value = null; }; /** * @return {?} */ AsiFileChooserComponent.prototype.handleDragEnter = /** * @return {?} */ function () { this.dragging = true; }; /** * @return {?} */ AsiFileChooserComponent.prototype.handleDragLeave = /** * @return {?} */ function () { this.dragging = false; }; /** * @param {?} e * @return {?} */ AsiFileChooserComponent.prototype.handleDrop = /** * @param {?} e * @return {?} */ function (e) { e.preventDefault(); this.dragging = false; this.handleInputChange(e); }; /** * @return {?} */ AsiFileChooserComponent.prototype.handleFileLoad = /** * @return {?} */ function () { this.fileLoaded = true; }; /** * @param {?} event * @return {?} */ AsiFileChooserComponent.prototype.handleInputChange = /** * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var file = event.dataTransfer ? event.dataTransfer.files[0] : event.target.files[0]; if (this.blockImport && !this.isValideMimeType(file.type)) { this.onError.emit({ error: 'FORMAT', file: file }); return; } this.loaded = false; this.value = file; }; /** * @return {?} */ AsiFileChooserComponent.prototype.downloadForIE = /** * @return {?} */ function () { if (navigator.msSaveBlob) { navigator.msSaveBlob(this.value, this.value.name); } }; /** * @param {?} mimeType * @return {?} */ AsiFileChooserComponent.prototype.isValideMimeType = /** * @param {?} mimeType * @return {?} */ function (mimeType) { if (!this.accept) { return true; } if (nh.isArray(this.accept)) { /** @type {?} */ var accepts = /** @type {?} */ (this.accept); try { for (var accepts_1 = tslib_1.__values(accepts), accepts_1_1 = accepts_1.next(); !accepts_1_1.done; accepts_1_1 = accepts_1.next()) { var accept = accepts_1_1.value; if (accept.mimeType === mimeType) { return true; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (accepts_1_1 && !accepts_1_1.done && (_a = accepts_1.return)) _a.call(accepts_1); } finally { if (e_1) throw e_1.error; } } } else { /** @type {?} */ var aAccept = (/** @type {?} */ (this.accept)); return aAccept.mimeType === mimeType; } return false; var e_1, _a; }; AsiFileChooserComponent.decorators = [ { type: Component, args: [{ selector: 'asi-file-chooser', host: { 'class': 'asi-component asi-file-chooser' }, template: "<label class=\"input-label\" *ngIf=\"label != null\">{{label | translate}}</label>\n<div class=\"asi-file-chooser-container\">\n <label ondragover=\"return false;\" [class.loaded]=\"loaded\" (dragenter)=\"handleDragEnter()\" (dragleave)=\"handleDragLeave()\"\n (drop)=\"handleDrop($event)\">\n <asi-button size=\"small\" class=\"asi-focus-error\" (click)=\"openFileInput()\">\n <asi-fa-icon [icon]=\"icon\" size=\"2x\"></asi-fa-icon>\n </asi-button>\n <input #fileInput type=\"file\" [attr.id]=\"id\" [attr.name]=\"name\" [disabled]=\"disabled\" name=\"file\" [accept]=\"acceptAttribute\" (change)=\"handleInputChange($event)\" />\n </label>\n <div class=\"file-link\" *ngIf=\"value != null\">\n <a [title]=\"value.name\" (click)=\"downloadForIE()\" [innerHTML]=\"value.name\" [download]=\"value.name\" [href]=\"getFileUrl()\" target=\"_empty\"></a>\n <asi-fa-icon (onClick)=\"clean()\" icon=\"fas fa-trash-alt\" size=\"lg\"></asi-fa-icon>\n </div>\n</div>\n", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return AsiFileChooserComponent; }), multi: true } ] }] } ]; /** @nocollapse */ AsiFileChooserComponent.ctorParameters = function () { return [ { type: AsiFileService }, { type: Renderer2 }, { type: ElementRef } ]; }; AsiFileChooserComponent.propDecorators = { id: [{ type: Input }], name: [{ type: Input }], label: [{ type: Input }], labelPosition: [{ type: Input }], fileSrc: [{ type: Input }], fileName: [{ type: Input }], accept: [{ type: Input }], blockImport: [{ type: Input }], icon: [{ type: Input }], onError: [{ type: Output }], fileInput: [{ type: ViewChild, args: ['fileInput',] }] }; return AsiFileChooserComponent; }(DefaultControlValueAccessor)); export { AsiFileChooserComponent }; if (false) { /** * html id * @type {?} */ AsiFileChooserComponent.prototype.id; /** * html name * @type {?} */ AsiFileChooserComponent.prototype.name; /** * Label to display (is translated) * @type {?} */ AsiFileChooserComponent.prototype.label; /** * Label position * @type {?} */ AsiFileChooserComponent.prototype.labelPosition; /** * Preload filechooser with an url * @type {?} */ AsiFileChooserComponent.prototype.fileSrc; /** * Allow you to force the name of the file * @type {?} */ AsiFileChooserComponent.prototype.fileName; /** * Liste of mimetype : "application/pdf" used to display a correct selection view * @type {?} */ AsiFileChooserComponent.prototype.accept; /** * By default we dont block the file is the user select a wrong type * @type {?} */ AsiFileChooserComponent.prototype.blockImport; /** * Icon to display * @type {?} */ AsiFileChooserComponent.prototype.icon; /** * Event emitted when an error occured with the selected file * @type {?} */ AsiFileChooserComponent.prototype.onError; /** @type {?} */ AsiFileChooserComponent.prototype.acceptAttribute; /** @type {?} */ AsiFileChooserComponent.prototype.fileInput; /** @type {?} */ AsiFileChooserComponent.prototype.dragging; /** @type {?} */ AsiFileChooserComponent.prototype.loaded; /** @type {?} */ AsiFileChooserComponent.prototype.fileLoaded; /** @type {?} */ AsiFileChooserComponent.prototype.file; /** @type {?} */ AsiFileChooserComponent.prototype.fileService; /** @type {?} */ AsiFileChooserComponent.prototype.renderer; /** @type {?} */ AsiFileChooserComponent.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWZpbGUtY2hvb3Nlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLWZpbGUtY2hvb3Nlci9hc2ktZmlsZS1jaG9vc2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3pGLE9BQU8sRUFDTCxTQUFTLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUN2QyxTQUFTLEVBQVUsVUFBVSxFQUFFLFNBQVMsRUFDcEQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FLE9BQU8sS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0lBY0csbURBQTJCO0lBa0N0RSxpQ0FBb0IsV0FBMkIsRUFDckMsVUFDQTtRQUZWLFlBR0UsaUJBQU8sU0FDUjtRQUptQixpQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFDckMsY0FBUSxHQUFSLFFBQVE7UUFDUixnQkFBVSxHQUFWLFVBQVU7Ozs7OEJBM0IyRSxLQUFLOzs7O3dCQUV6RSxJQUFJOzs7O3lCQUVILElBQUk7Ozs7NEJBSVQsS0FBSzs7OztxQkFFWixpQkFBaUI7Ozs7d0JBR2IsSUFBSSxZQUFZLEVBQU87Z0NBRXpCLEVBQUU7eUJBSVQsS0FBSzt1QkFDUCxLQUFLOzJCQUNELEtBQUs7O0tBUWpCOzs7O0lBRUQsMENBQVE7OztJQUFSO1FBQUEsaUJBVUM7UUFUQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JG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QUN4RCxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUE7U0FDckM7UUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDOzs7O2dCQTdJaEIsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRTtvQkFDbkQscStCQUFnRDtvQkFDaEQsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsY0FBTSxPQUFBLHVCQUF1QixFQUF2QixDQUF1QixDQUFDOzRCQUN0RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjs7OztnQkFmUSxjQUFjO2dCQUZxQixTQUFTO2dCQUFyQixVQUFVOzs7cUJBcUJ2QyxLQUFLO3VCQUVMLEtBQUs7d0JBRUwsS0FBSztnQ0FFTCxLQUFLOzBCQUVMLEtBQUs7MkJBRUwsS0FBSzt5QkFFTCxLQUFLOzhCQUVMLEtBQUs7dUJBRUwsS0FBSzswQkFHTCxNQUFNOzRCQUlOLFNBQVMsU0FBQyxXQUFXOztrQ0FsRHhCO0VBd0I2QywyQkFBMkI7U0FBM0QsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXNpTWltZVR5cGUgfSBmcm9tICcuL2FzaS1maWxlLWNob29zZXItY29uc3RhbnRzJztcbmltcG9ydCB7IFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLy4uL2NvbW1vbi9kZWZhdWx0LWNvbnRyb2wtdmFsdWUtYWNjZXNzb3InO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBJbnB1dCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIGZvcndhcmRSZWYsXG4gIE9uQ2hhbmdlcywgVmlld0NoaWxkLCBPbkluaXQsIEVsZW1lbnRSZWYsIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFzaUZpbGVTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9hc2ktZmlsZS5zZXJ2aWNlJztcblxuaW1wb3J0ICogYXMgbmggZnJvbSAnLi4vLi4vbmF0aXZlLWhlbHBlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FzaS1maWxlLWNob29zZXInLFxuICBob3N0OiB7ICdjbGFzcyc6ICdhc2ktY29tcG9uZW50IGFzaS1maWxlLWNob29zZXInIH0sXG4gIHRlbXBsYXRlVXJsOiAnLi9hc2ktZmlsZS1jaG9vc2VyLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBc2lGaWxlQ2hvb3NlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBBc2lGaWxlQ2hvb3NlckNvbXBvbmVudCBleHRlbmRzIERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0IHtcblxuICAvKiogaHRtbCBpZCAqL1xuICBASW5wdXQoKSBpZDogc3RyaW5nO1xuICAvKiogaHRtbCBuYW1lICovXG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcbiAgIC8qKiBMYWJlbCB0byBkaXNwbGF5IChpcyB0cmFuc2xhdGVkKSAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xuICAvKiogTGFiZWwgcG9zaXRpb24gKi9cbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogJ3RvcCcgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnYm90dG9tLWNlbnRlcicgfCAndG9wLWNlbnRlcicgPSAndG9wJztcbiAgLyoqIFByZWxvYWQgZmlsZWNob29zZXIgd2l0aCBhbiB1cmwgKi9cbiAgQElucHV0KCkgZmlsZVNyYzogc3RyaW5nID0gbnVsbDtcbiAgLyoqIEFsbG93IHlvdSB0byBmb3JjZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSAqL1xuICBASW5wdXQoKSBmaWxlTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgLyoqIExpc3RlIG9mIG1pbWV0eXBlIDogXCJhcHBsaWNhdGlvbi9wZGZcIiB1c2VkIHRvIGRpc3BsYXkgYSBjb3JyZWN0IHNlbGVjdGlvbiB2aWV3ICovXG4gIEBJbnB1dCgpIGFjY2VwdDogQXJyYXk8QXNpTWltZVR5cGU+IHwgQXNpTWltZVR5cGU7XG4gIC8qKiBCeSBkZWZhdWx0IHdlIGRvbnQgYmxvY2sgdGhlIGZpbGUgaXMgdGhlIHVzZXIgc2VsZWN0IGEgd3JvbmcgdHlwZSAqL1xuICBASW5wdXQoKSBibG9ja0ltcG9ydCA9IGZhbHNlO1xuICAvKiogSWNvbiB0byBkaXNwbGF5ICovXG4gIEBJbnB1dCgpIGljb24gPSAnZmEgZmEtcGFwZXJjbGlwJztcblxuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIGFuIGVycm9yIG9jY3VyZWQgd2l0aCB0aGUgc2VsZWN0ZWQgZmlsZSAqL1xuICBAT3V0cHV0KCkgb25FcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGFjY2VwdEF0dHJpYnV0ZSA9ICcnO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpIGZpbGVJbnB1dDogYW55O1xuXG4gIGRyYWdnaW5nID0gZmFsc2U7XG4gIGxvYWRlZCA9IGZhbHNlO1xuICBmaWxlTG9hZGVkID0gZmFsc2U7XG5cbiAgZmlsZTogRmlsZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZpbGVTZXJ2aWNlOiBBc2lGaWxlU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdsYWJlbC0nICsgdGhpcy5sYWJlbFBvc2l0aW9uKTtcbiAgICBpZiAodGhpcy5maWxlU3JjICE9IG51bGwpIHtcbiAgICAgIHRoaXMuZmlsZVNlcnZpY2UuZ2V0RmlsZUFzQmxvYih0aGlzLmZpbGVTcmMpLnN1YnNjcmliZShibG9iID0+IHtcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSB0aGlzLmZpbGVOYW1lIHx8IHRoaXMuZmlsZVNyYy5zcGxpdCgnLycpLnBvcCgpO1xuICAgICAgICBjb25zdCBmaWxlOiBhbnkgPSBuZXcgQmxvYihbYmxvYl0sIHsgdHlwZTogYmxvYi50eXBlIH0pO1xuICAgICAgICBmaWxlLm5hbWUgPSBmaWxlTmFtZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGZpbGU7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAobmguaXNBcnJheSh0aGlzLmFjY2VwdCkpIHtcbiAgICAgICg8QXJyYXk8QXNpTWltZVR5cGU+PnRoaXMuYWNjZXB0KS5mb3JFYWNoKChhY2NlcHQpID0+IHtcbiAgICAgICAgdGhpcy5hY2NlcHRBdHRyaWJ1dGUgKz0gYWNjZXB0LmV4dGVuc2lvbiArICcsICcgKyBhY2NlcHQubWltZVR5cGUgKyAnLCc7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGFBY2NlcHQ6IEFzaU1pbWVUeXBlID0gKDxBc2lNaW1lVHlwZT50aGlzLmFjY2VwdCk7XG4gICAgICB0aGlzLmFjY2VwdEF0dHJpYnV0ZSA9IGFBY2NlcHQuZXh0ZW5zaW9uICsgJywgJyArIGFBY2NlcHQubWltZVR5cGU7XG4gICAgfVxuICB9XG5cbiAgb3BlbkZpbGVJbnB1dCgpIHtcbiAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gbnVsbDtcbiAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gIH1cblxuICBnZXRGaWxlVXJsKCk6IFNhZmVSZXNvdXJjZVVybCB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZVNlcnZpY2UuZ2V0RmlsZVVybCh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIGNsZWFuKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICB9XG5cbiAgaGFuZGxlRHJhZ0VudGVyKCkge1xuICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICB9XG5cbiAgaGFuZGxlRHJhZ0xlYXZlKCkge1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGhhbmRsZURyb3AoZTogRXZlbnQpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMuaGFuZGxlSW5wdXRDaGFuZ2UoZSk7XG4gIH1cblxuICBoYW5kbGVGaWxlTG9hZCgpIHtcbiAgICB0aGlzLmZpbGVMb2FkZWQgPSB0cnVlO1xuICB9XG5cbiAgaGFuZGxlSW5wdXRDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXIgPyBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXNbMF0gOiBldmVudC50YXJnZXQuZmlsZXNbMF07XG5cbiAgICBpZiAodGhpcy5ibG9ja0ltcG9ydCAmJiAhdGhpcy5pc1ZhbGlkZU1pbWVUeXBlKGZpbGUudHlwZSkpIHtcbiAgICAgIHRoaXMub25FcnJvci5lbWl0KHtcbiAgICAgICAgZXJyb3I6ICdGT1JNQVQnLFxuICAgICAgICBmaWxlOiBmaWxlXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLnZhbHVlID0gZmlsZTtcbiAgfVxuXG4gIGRvd25sb2FkRm9ySUUoKSB7XG4gICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7XG4gICAgICBuYXZpZ2F0b3IubXNTYXZlQmxvYih0aGlzLnZhbHVlLCB0aGlzLnZhbHVlLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZGVNaW1lVHlwZShtaW1lVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmFjY2VwdCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChuaC5pc0FycmF5KHRoaXMuYWNjZXB0KSkge1xuICAgICAgY29uc3QgYWNjZXB0cyA9IDxBcnJheTxBc2lNaW1lVHlwZT4+dGhpcy5hY2NlcHQ7XG4gICAgICBmb3IgKGxldCBhY2NlcHQgb2YgYWNjZXB0cykge1xuICAgICAgICBpZiAoYWNjZXB0Lm1pbWVUeXBlID09PSBtaW1lVHlwZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFBY2NlcHQ6IEFzaU1pbWVUeXBlID0gKDxBc2lNaW1lVHlwZT50aGlzLmFjY2VwdCk7XG4gICAgICByZXR1cm4gYUFjY2VwdC5taW1lVHlwZSA9PT0gbWltZVR5cGVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=