UNPKG

@ngez/core

Version:

A collection of minimalistic, easy-to-use and fully customizable Angular components, directives and services

263 lines 23 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { DOCUMENT, isPlatformBrowser } from '@angular/common'; import { Directive, ElementRef, EventEmitter, forwardRef, HostListener, Inject, Optional, Output, PLATFORM_ID, Renderer2, } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { fromEvent } from 'rxjs'; import { NgEzFileBase } from './file'; export class NgEzFileInputDirective extends NgEzFileBase { /** * @param {?} element * @param {?} platformId * @param {?} document * @param {?} renderer */ constructor(element, platformId, document, renderer) { super(); this.element = element; this.platformId = platformId; this.document = document; this.renderer = renderer; this.selected = new EventEmitter(); this.isDisabled = false; } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (!isPlatformBrowser(this.platformId)) return; const { currentValue: accept = null, previousValue: prevAccept = null } = changes.accept || {}; const { currentValue: multiple = null, previousValue: prevMultiple = null } = changes.multiple || {}; if ((multiple != prevMultiple) || (accept != prevAccept)) this.appendFileInput(); } /** * @return {?} */ ngOnInit() { if (!isPlatformBrowser(this.platformId)) return; if (!this.fileInput) this.appendFileInput(); this.subscription = fromEvent(this.element.nativeElement, this.isInputOrTextarea() ? 'focus' : 'click') .subscribe(e => this.browse()); } /** * @return {?} */ ngOnDestroy() { if (this.subscription) this.subscription.unsubscribe(); this.removeFileInput(); } /** * @private * @return {?} */ onBlur() { if (this.onTouched) this.onTouched(); } /** * @return {?} */ browse() { if (this.isDisabled) return; if (this.isInputOrTextarea()) this.element.nativeElement.blur(); this.fileInput.click(); } /** * @return {?} */ clear() { this.setValueAndUpdate(null); } /** * @param {?} value * @return {?} */ writeValue(value) { /** @type {?} */ let file = null; if (value) { if (value instanceof File || (Array.isArray(value) && value.every(value => value instanceof File))) file = value; else if (value instanceof FileList) file = Array.from(value); else return console.warn('Expected value of type File, FileList or File[], instead got: ', value); } this.setValue(file); } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { this.renderer.setProperty(this.element.nativeElement, 'disabled', isDisabled); this.isDisabled = isDisabled; } /** * @private * @param {?} value * @return {?} */ setValue(value) { /** @type {?} */ const text = value ? this.getText(value) : ''; this.renderer.setProperty(this.element.nativeElement, 'value', text); } /** * @private * @param {?} value * @return {?} */ setValueAndUpdate(value) { /** @type {?} */ const fileValue = value instanceof FileList ? Array.from(value) : value; if (this.onChange) this.onChange(fileValue); this.setValue(fileValue); this.selected.emit(fileValue); } /** * @private * @return {?} */ appendFileInput() { if (this.fileInput) this.clear(); this.removeFileInput(); this.fileInput = this.createFileInput(); this.renderer.appendChild(this.document.body, this.fileInput); this.listener = this.renderer.listen(this.fileInput, 'change', e => { /** @type {?} */ const files = e.target.files; /** @type {?} */ const value = this.multiple ? files : files.item(0); this.setValueAndUpdate(value); }); } /** * @private * @return {?} */ createFileInput() { /** @type {?} */ const input = this.renderer.createElement('input'); this.renderer.setAttribute(input, 'type', 'file'); this.renderer.setAttribute(input, 'aria-hidden', 'true'); this.renderer.setProperty(input, 'hidden', true); this.renderer.setProperty(input, 'multiple', this.multiple ? true : false); if (this.accept) this.renderer.setAttribute(input, 'accept', this.accept); return input; } /** * @private * @return {?} */ removeFileInput() { if (this.fileInput) this.renderer.removeChild(this.document.body, this.fileInput); if (this.listener) this.listener(); } /** * @private * @param {?} value * @return {?} */ getText(value) { /** @type {?} */ const files = value instanceof File ? [value] : value; return files.reduce((text, file, index) => `${text}${index > 0 ? ', ' : ''}${file.name}`, ''); } /** * @private * @return {?} */ isInputOrTextarea() { /** @type {?} */ const element = this.element.nativeElement; return element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement; } } NgEzFileInputDirective.decorators = [ { type: Directive, args: [{ selector: ':not([type="file"])[ngezFileInput]', exportAs: 'ngezFileInput', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgEzFileInputDirective), multi: true }] },] } ]; /** @nocollapse */ NgEzFileInputDirective.ctorParameters = () => [ { type: ElementRef }, { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] }, { type: Renderer2 } ]; NgEzFileInputDirective.propDecorators = { selected: [{ type: Output }], onBlur: [{ type: HostListener, args: ['blur',] }] }; if (false) { /** @type {?} */ NgEzFileInputDirective.prototype.selected; /** @type {?} */ NgEzFileInputDirective.prototype.onChange; /** @type {?} */ NgEzFileInputDirective.prototype.onTouched; /** @type {?} */ NgEzFileInputDirective.prototype.isDisabled; /** * @type {?} * @private */ NgEzFileInputDirective.prototype.subscription; /** * @type {?} * @private */ NgEzFileInputDirective.prototype.element; /** * @type {?} * @private */ NgEzFileInputDirective.prototype.platformId; /** * @type {?} * @private */ NgEzFileInputDirective.prototype.document; /** * @type {?} * @private */ NgEzFileInputDirective.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmdlei9jb3JlLyIsInNvdXJjZXMiOlsiZmlsZS9maWxlLWlucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFLTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEdBRVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBRS9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFXdEMsTUFBTSxPQUFPLHNCQUF1QixTQUFRLFlBQVk7Ozs7Ozs7SUFZcEQsWUFDWSxPQUFtQixFQUNFLFVBQWtCLEVBQ1QsUUFBYSxFQUMzQyxRQUFtQjtRQUFJLEtBQUssRUFBRSxDQUFDO1FBSC9CLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDRSxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ1QsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQUMzQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBZHJCLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQU12RCxlQUFVLEdBQUcsS0FBSyxDQUFDO0lBUXlCLENBQUM7Ozs7O0lBRTdDLFdBQVcsQ0FBQyxPQUFzQjtRQUM5QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87Y0FFMUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxHQUFHLElBQUksRUFBRSxhQUFhLEVBQUUsVUFBVSxHQUFHLElBQUksRUFB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ImltcG9ydCB7IERPQ1VNRU5ULCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgICBEaXJlY3RpdmUsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgZm9yd2FyZFJlZixcclxuICAgIEhvc3RMaXN0ZW5lcixcclxuICAgIEluamVjdCxcclxuICAgIElucHV0LFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT25Jbml0LFxyXG4gICAgT3B0aW9uYWwsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBQTEFURk9STV9JRCxcclxuICAgIFJlbmRlcmVyMixcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IE5nRXpGaWxlQmFzZSB9IGZyb20gJy4vZmlsZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnOm5vdChbdHlwZT1cImZpbGVcIl0pW25nZXpGaWxlSW5wdXRdJyxcclxuICAgIGV4cG9ydEFzOiAnbmdlekZpbGVJbnB1dCcsXHJcbiAgICBwcm92aWRlcnM6IFt7XHJcbiAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdFekZpbGVJbnB1dERpcmVjdGl2ZSksXHJcbiAgICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ0V6RmlsZUlucHV0RGlyZWN0aXZlIGV4dGVuZHMgTmdFekZpbGVCYXNlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICAgIEBPdXRwdXQoKSBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZSB8IEZpbGVbXT4oKTtcclxuICAgIFxyXG4gICAgb25DaGFuZ2U6IEZ1bmN0aW9uO1xyXG5cclxuICAgIG9uVG91Y2hlZDogRnVuY3Rpb247XHJcblxyXG4gICAgaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLFxyXG4gICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHsgc3VwZXIoKTsgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWU6IGFjY2VwdCA9IG51bGwsIHByZXZpb3VzVmFsdWU6IHByZXZBY2NlcHQgPSBudWxsIH0gPSBjaGFuZ2VzLmFjY2VwdCB8fCB7fTtcclxuICAgICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZTogbXVsdGlwbGUgPSBudWxsLCBwcmV2aW91c1ZhbHVlOiBwcmV2TXVsdGlwbGUgPSBudWxsIH0gPSBjaGFuZ2VzLm11bHRpcGxlIHx8IHt9O1xyXG5cclxuICAgICAgICBpZiAoKG11bHRpcGxlICE9IHByZXZNdWx0aXBsZSkgfHwgKGFjY2VwdCAhPSBwcmV2QWNjZXB0KSlcclxuICAgICAgICAgICAgdGhpcy5hcHBlbmRGaWxlSW5wdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmZpbGVJbnB1dClcclxuICAgICAgICAgICAgdGhpcy5hcHBlbmRGaWxlSW5wdXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBmcm9tRXZlbnQodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuaXNJbnB1dE9yVGV4dGFyZWEoKSA/ICdmb2N1cycgOiAnY2xpY2snKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGUgPT4gdGhpcy5icm93c2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRmlsZUlucHV0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignYmx1cicpXHJcbiAgICBwcml2YXRlIG9uQmx1cigpIHtcclxuICAgICAgICBpZiAodGhpcy5vblRvdWNoZWQpXHJcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYnJvd3NlKCkge1xyXG4gICAgICAgIGlmKHRoaXMuaXNEaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0lucHV0T3JUZXh0YXJlYSgpKVxyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5ibHVyKCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIHRoaXMuZmlsZUlucHV0LmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXIoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZUFuZFVwZGF0ZShudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBsZXQgZmlsZTogRmlsZSB8IEZpbGVbXSA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSh2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpKSlcclxuICAgICAgICAgICAgICAgIGZpbGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlTGlzdClcclxuICAgICAgICAgICAgICAgIGZpbGUgPSBBcnJheS5mcm9tKHZhbHVlKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignRXhwZWN0ZWQgdmFsdWUgb2YgdHlwZSBGaWxlLCBGaWxlTGlzdCBvciBGaWxlW10sIGluc3RlYWQgZ290OiAnLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldFZhbHVlKGZpbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiB7fSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4ge30pIHtcclxuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRWYWx1ZSh2YWx1ZTogRmlsZSB8IEZpbGVbXSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSB2YWx1ZSA/IHRoaXMuZ2V0VGV4dCh2YWx1ZSkgOiAnJztcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB0ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldFZhbHVlQW5kVXBkYXRlKHZhbHVlOiBGaWxlIHwgRmlsZUxpc3QpIHtcclxuICAgICAgICBjb25zdCBmaWxlVmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIEZpbGVMaXN0ID8gQXJyYXkuZnJvbSh2YWx1ZSkgOiB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5vbkNoYW5nZSlcclxuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShmaWxlVmFsdWUpO1xyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUoZmlsZVZhbHVlKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoZmlsZVZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGVuZEZpbGVJbnB1dCgpIHtcclxuICAgICAgICBpZiAodGhpcy5maWxlSW5wdXQpXHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW1vdmVGaWxlSW5wdXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5maWxlSW5wdXQgPSB0aGlzLmNyZWF0ZUZpbGVJbnB1dCgpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5kb2N1bWVudC5ib2R5LCB0aGlzLmZpbGVJbnB1dCk7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZmlsZUlucHV0LCAnY2hhbmdlJywgZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzOiBGaWxlTGlzdCA9IGUudGFyZ2V0LmZpbGVzO1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMubXVsdGlwbGUgPyBmaWxlcyA6IGZpbGVzLml0ZW0oMCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVBbmRVcGRhdGUodmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlRmlsZUlucHV0KCk6IEhUTUxJbnB1dEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGlucHV0LCAndHlwZScsICdmaWxlJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoaW5wdXQsICdhcmlhLWhpZGRlbicsICd0cnVlJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShpbnB1dCwgJ2hpZGRlbicsIHRydWUpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoaW5wdXQsICdtdWx0aXBsZScsIHRoaXMubXVsdGlwbGUgPyB0cnVlIDogZmFsc2UpO1xyXG4gICAgICAgIGlmICh0aGlzLmFjY2VwdClcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoaW5wdXQsICdhY2NlcHQnLCB0aGlzLmFjY2VwdCk7XHJcbiAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVtb3ZlRmlsZUlucHV0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmZpbGVJbnB1dClcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmRvY3VtZW50LmJvZHksIHRoaXMuZmlsZUlucHV0KTtcclxuICAgICAgICBpZiAodGhpcy5saXN0ZW5lcilcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VGV4dCh2YWx1ZTogRmlsZSB8IEZpbGVbXSk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZmlsZXMgPSB2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgPyBbdmFsdWVdIDogdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIGZpbGVzLnJlZHVjZSgodGV4dCwgZmlsZSwgaW5kZXgpID0+IGAke3RleHR9JHtpbmRleCA+IDAgPyAnLCAnIDogJyd9JHtmaWxlLm5hbWV9YCwgJycpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNJbnB1dE9yVGV4dGFyZWEoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudDtcclxuICAgIH1cclxufSJdfQ==