UNPKG

@taiga-ui/kit

Version:
317 lines • 43.5 kB
import { __decorate, __extends, __param, __read, __spread } from "tslib"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Inject, Input, Optional, Output, Self, ViewChild, } from '@angular/core'; import { NgControl } from '@angular/forms'; import { AbstractTuiNullableControl, EMPTY_ARRAY, isNativeFocused, TUI_FOCUSABLE_ITEM_ACCESSOR, TUI_IS_MOBILE, tuiDefaultProp, tuiPure, } from '@taiga-ui/cdk'; import { MODE_PROVIDER, TUI_MODE, } from '@taiga-ui/core'; import { TUI_DIGITAL_INFORMATION_UNITS, TUI_INPUT_FILE_TEXTS } from '@taiga-ui/kit/tokens'; import { formatSize } from '@taiga-ui/kit/utils/files'; import { Observable, of } from 'rxjs'; import { map } from 'rxjs/operators'; var DEFAULT_MAX_SIZE = 30 * 1000 * 1000; // 30 MB // @dynamic var TuiInputFileComponent = /** @class */ (function (_super) { __extends(TuiInputFileComponent, _super); function TuiInputFileComponent(control, changeDetectorRef, isMobile, inputFileTexts$, mode$, units$) { var _this = _super.call(this, control, changeDetectorRef) || this; _this.isMobile = isMobile; _this.inputFileTexts$ = inputFileTexts$; _this.mode$ = mode$; _this.units$ = units$; _this.link = ''; _this.label = ''; _this.accept = ''; _this.multiple = false; _this.size = 'm'; _this.showSize = true; _this.maxFileSize = DEFAULT_MAX_SIZE; _this.loadingFiles = []; _this.rejectedFiles = []; _this.rejectedFilesChange = new EventEmitter(); _this.dataTransfer = null; return _this; } TuiInputFileComponent_1 = TuiInputFileComponent; Object.defineProperty(TuiInputFileComponent.prototype, "nativeFocusableElement", { get: function () { return this.input ? this.input.nativeElement : null; }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputFileComponent.prototype, "focused", { get: function () { return isNativeFocused(this.nativeFocusableElement); }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputFileComponent.prototype, "allowDelete", { get: function () { return !this.computedDisabled && !this.readOnly; }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputFileComponent.prototype, "computedLink$", { get: function () { return this.computeLink$(this.fileDragged, this.multiple, this.link); }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputFileComponent.prototype, "computedLabel$", { get: function () { return this.computeLabel$(this.isMobile, this.fileDragged, this.multiple, this.label); }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputFileComponent.prototype, "fileDragged", { // @bad TODO: refactor after IE is dropped get: function () { return (!!this.dataTransfer && Array.prototype.indexOf.call(this.dataTransfer.types, 'Files') !== -1); }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputFileComponent.prototype, "acceptArray", { get: function () { return this.getAcceptArray(this.accept); }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputFileComponent.prototype, "arrayValue", { get: function () { return this.getValueArray(this.value); }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputFileComponent.prototype, "readyFiles", { get: function () { return this.getReadyFiles(this.arrayValue, this.loadingFiles); }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputFileComponent.prototype, "computedLoading", { get: function () { return this.getLoadingFiles(this.arrayValue, this.loadingFiles); }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputFileComponent.prototype, "hasFiles", { get: function () { return !!this.rejectedFiles.length || !!this.arrayValue.length; }, enumerable: true, configurable: true }); TuiInputFileComponent.prototype.onHovered = function (hovered) { this.updateHovered(hovered); }; TuiInputFileComponent.prototype.onFocused = function (focused) { this.updateFocused(focused); }; TuiInputFileComponent.prototype.onPressed = function (pressed) { this.updatePressed(pressed); }; // TODO: refactor i18n messages TuiInputFileComponent.prototype.onFilesSelected = function (input, texts, units) { this.processSelectedFiles(input.files, texts, units); input.value = ''; }; TuiInputFileComponent.prototype.onDropped = function (event, texts, units) { this.processSelectedFiles(event.files, texts, units); }; TuiInputFileComponent.prototype.onDragOver = function (dataTransfer) { this.dataTransfer = dataTransfer; }; TuiInputFileComponent.prototype.removeFile = function (removedFile) { this.updateValue(this.multiple ? this.arrayValue.filter(function (file) { return file !== removedFile; }) : null); }; TuiInputFileComponent.prototype.removeRejectedFile = function (removedFile) { this.updateRejectedFiles(this.rejectedFiles.filter(function (file) { return file !== removedFile; })); }; TuiInputFileComponent.prototype.getAppearance = function (mode) { return mode === null ? '' : "outline" /* Outline */; }; TuiInputFileComponent.prototype.computeLink$ = function (fileDragged, multiple, link) { if (fileDragged) { return of(''); } return this.inputFileTexts$.pipe(map(function (texts) { return multiple && link === '' ? texts.defaultLinkMultiple : link || texts.defaultLinkSingle; })); }; TuiInputFileComponent.prototype.computeLabel$ = function (isMobile, fileDragged, multiple, label) { if (isMobile) { return of(''); } if (fileDragged) { return this.inputFileTexts$.pipe(map(function (texts) { return (multiple ? texts.dropMultiple : texts.drop); })); } return this.inputFileTexts$.pipe(map(function (texts) { return multiple && label === '' ? texts.defaultLabelMultiple : label || texts.defaultLabelSingle; })); }; TuiInputFileComponent.prototype.getValueArray = function (value) { if (!value) { return EMPTY_ARRAY; } return value instanceof Array ? value : [value]; }; TuiInputFileComponent.prototype.getReadyFiles = function (value, loading) { return value.filter(function (file) { return loading.indexOf(file) === -1; }); }; TuiInputFileComponent.prototype.getLoadingFiles = function (value, loading) { return loading.filter(function (file) { return value.indexOf(file) !== -1; }); }; TuiInputFileComponent.prototype.getAcceptArray = function (accept) { return accept.toLowerCase().split(','); }; TuiInputFileComponent.prototype.processSelectedFiles = function (files, texts, units) { var _this = this; // IE11 after selecting a file through the open dialog generates a second event passing an empty FileList. if (files === null || files.length === 0) { return; } var newFiles = this.multiple ? Array.from(files) : [files[0]]; var tooBigFiles = newFiles.filter(function (file) { return file.size > _this.maxFileSize; }); var wrongFormatFiles = newFiles.filter(function (file) { return !_this.isFormatAcceptable(file) && tooBigFiles.indexOf(file) === -1; }); var acceptedFiles = newFiles.filter(function (file) { return tooBigFiles.indexOf(file) === -1 && wrongFormatFiles.indexOf(file) === -1; }); this.updateRejectedFiles(__spread(tooBigFiles.map(function (file) { return ({ name: file.name, type: file.type, size: file.size, content: texts.maxSizeRejectionReason + formatSize(units, _this.maxFileSize), }); }), wrongFormatFiles.map(function (file) { return ({ name: file.name, type: file.type, size: file.size, content: texts.formatRejectionReason, }); }))); this.updateValue(this.multiple ? __spread(this.arrayValue, acceptedFiles) : acceptedFiles[0] || null); }; TuiInputFileComponent.prototype.isFormatAcceptable = function (file) { if (!this.accept) { return true; } var extension = '.' + (file.name.split('.').pop() || '').toLowerCase(); return this.acceptArray.some(function (format) { return format === extension || format === file.type || (format.split('/')[1] === '*' && file.type.split('/')[0] === format.split('/')[0]); }); }; TuiInputFileComponent.prototype.updateRejectedFiles = function (rejectedFiles) { this.rejectedFiles = rejectedFiles; this.rejectedFilesChange.emit(rejectedFiles); }; var TuiInputFileComponent_1; TuiInputFileComponent.ctorParameters = function () { return [ { type: NgControl, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NgControl,] }] }, { type: ChangeDetectorRef, decorators: [{ type: Inject, args: [ChangeDetectorRef,] }] }, { type: Boolean, decorators: [{ type: Inject, args: [TUI_IS_MOBILE,] }] }, { type: Observable, decorators: [{ type: Inject, args: [TUI_INPUT_FILE_TEXTS,] }] }, { type: Observable, decorators: [{ type: Inject, args: [TUI_MODE,] }] }, { type: Observable, decorators: [{ type: Inject, args: [TUI_DIGITAL_INFORMATION_UNITS,] }] } ]; }; __decorate([ Input(), tuiDefaultProp() ], TuiInputFileComponent.prototype, "link", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputFileComponent.prototype, "label", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputFileComponent.prototype, "accept", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputFileComponent.prototype, "multiple", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputFileComponent.prototype, "size", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputFileComponent.prototype, "showSize", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputFileComponent.prototype, "maxFileSize", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputFileComponent.prototype, "loadingFiles", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputFileComponent.prototype, "rejectedFiles", void 0); __decorate([ Output() ], TuiInputFileComponent.prototype, "rejectedFilesChange", void 0); __decorate([ ViewChild('input') ], TuiInputFileComponent.prototype, "input", void 0); __decorate([ tuiPure ], TuiInputFileComponent.prototype, "computeLink$", null); __decorate([ tuiPure ], TuiInputFileComponent.prototype, "computeLabel$", null); __decorate([ tuiPure ], TuiInputFileComponent.prototype, "getValueArray", null); __decorate([ tuiPure ], TuiInputFileComponent.prototype, "getReadyFiles", null); __decorate([ tuiPure ], TuiInputFileComponent.prototype, "getLoadingFiles", null); __decorate([ tuiPure ], TuiInputFileComponent.prototype, "getAcceptArray", null); TuiInputFileComponent = TuiInputFileComponent_1 = __decorate([ Component({ selector: 'tui-input-file', template: "<tui-wrapper\n *ngIf=\"multiple || !value\"\n class=\"wrapper\"\n [class.wrapper_mobile]=\"isMobile\"\n [class.wrapper_has-files]=\"hasFiles\"\n [appearance]=\"getAppearance(mode$ | async)\"\n [focused]=\"computedFocused\"\n [hovered]=\"computedHovered || fileDragged\"\n [pressed]=\"computedPressed\"\n [readOnly]=\"readOnly\"\n [disabled]=\"computedDisabled\"\n>\n <label\n *ngIf=\"(units$ | async) as units\"\n automation-id=\"tui-input-file__label\"\n >\n <a tuiLink>\n <span\n polymorpheus-outlet\n class=\"inline\"\n [content]=\"computedLink$ | async\"\n ></span>\n </a>\n <ng-container *ngIf=\"computedLabel$ | async as computedLabel\">\n <span>&nbsp;</span>\n <span\n polymorpheus-outlet\n class=\"inline\"\n [content]=\"computedLabel\"\n ></span>\n </ng-container>\n <input\n *ngIf=\"!readOnly && !computedDisabled && (inputFileTexts$ | async) as texts\"\n #input\n class=\"native\"\n type=\"file\"\n tuiPreventDefault=\"mousedown\"\n [id]=\"id\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n [tuiFocusable]=\"focusable\"\n (change)=\"onFilesSelected(input, texts, units)\"\n (tuiHoveredChange)=\"onHovered($event)\"\n (tuiFocusedChange)=\"onFocused($event)\"\n (tuiPressedChange)=\"onPressed($event)\"\n (tuiDroppableDropped)=\"onDropped($event, texts, units)\"\n (tuiDroppableDragOverChange)=\"onDragOver($event)\"\n />\n </label>\n</tui-wrapper>\n\n<section\n *tuiLet=\"mode$ | async as mode\"\n tuiGroup\n class=\"files\"\n orientation=\"vertical\"\n [collapsed]=\"true\"\n>\n <tui-file\n *ngFor=\"let file of rejectedFiles\"\n automation-id=\"tui-input-file__error\"\n state=\"error\"\n [attr.data-mode]=\"mode\"\n [showSize]=\"showSize\"\n [allowDelete]=\"allowDelete\"\n [size]=\"size\"\n [file]=\"file\"\n (fileRemoved)=\"removeRejectedFile(file)\"\n ></tui-file>\n <tui-file\n *ngFor=\"let file of computedLoading\"\n automation-id=\"tui-input-file__loading\"\n state=\"loading\"\n [attr.data-mode]=\"mode\"\n [showSize]=\"showSize\"\n [allowDelete]=\"allowDelete\"\n [size]=\"size\"\n [file]=\"file\"\n (fileRemoved)=\"removeFile(file)\"\n ></tui-file>\n <tui-file\n *ngFor=\"let file of readyFiles\"\n automation-id=\"tui-input-file__file\"\n [attr.data-mode]=\"mode\"\n [showSize]=\"showSize\"\n [allowDelete]=\"allowDelete\"\n [size]=\"size\"\n [file]=\"file\"\n (fileRemoved)=\"removeFile(file)\"\n ></tui-file>\n</section>\n", changeDetection: ChangeDetectionStrategy.OnPush, providers: [ MODE_PROVIDER, { provide: TUI_FOCUSABLE_ITEM_ACCESSOR, useExisting: forwardRef(function () { return TuiInputFileComponent_1; }), }, ], styles: [":host{font:var(--tui-font-text-m);display:block;word-wrap:break-word;color:var(--tui-text-02)}.native{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer}.native::-webkit-file-upload-button{display:none}.inline{display:inline}.wrapper{display:flex;flex:1;justify-content:center;align-items:center;min-height:var(--tui-height-l);border-radius:var(--tui-radius-m);padding:16px 8px;box-sizing:border-box}.wrapper:after{border:1px dashed;color:var(--tui-link)}.wrapper_mobile:after{border-style:solid}.wrapper_has-files{margin-bottom:8px}.wrapper[data-state=hovered]{background:var(--tui-secondary)}.wrapper[data-state=hovered]:after{color:var(--tui-link-hover)}.wrapper[data-state=pressed]{background:var(--tui-secondary-hover)}.wrapper[data-state=readonly]{pointer-events:none}.wrapper[data-state=readonly]:after{color:var(--tui-text-03)}.wrapper[data-state=disabled]{opacity:var(--tui-disabled-opacity);pointer-events:none}.wrapper[data-state=disabled]:after{color:var(--tui-text-03)}.wrapper._focused:after{border-style:solid;border-width:2px;color:var(--tui-focus)}.files{display:flex}"] }), __param(0, Optional()), __param(0, Self()), __param(0, Inject(NgControl)), __param(1, Inject(ChangeDetectorRef)), __param(2, Inject(TUI_IS_MOBILE)), __param(3, Inject(TUI_INPUT_FILE_TEXTS)), __param(4, Inject(TUI_MODE)), __param(5, Inject(TUI_DIGITAL_INFORMATION_UNITS)) ], TuiInputFileComponent); return TuiInputFileComponent; }(AbstractTuiNullableControl)); export { TuiInputFileComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZmlsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdGFpZ2EtdWkva2l0L2NvbXBvbmVudHMvaW5wdXQtZmlsZS8iLCJzb3VyY2VzIjpbImlucHV0LWZpbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksRUFDSixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pDLE9BQU8sRUFDSCwwQkFBMEIsRUFDMUIsV0FBVyxFQUNYLGVBQWUsRUFDZiwyQkFBMkIsRUFDM0IsYUFBYSxFQUNiLGNBQWMsRUFHZCxPQUFPLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGFBQWEsRUFDYixRQUFRLEdBSVgsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUMsNkJBQTZCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFFckQsT0FBTyxFQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRW5DLElBQU0sZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxRQUFRO0FBRW5ELFdBQVc7QUFjWDtJQUNZLHlDQUFvRTtJQThDNUUsK0JBSUksT0FBeUIsRUFFekIsaUJBQW9DLEVBRTNCLFFBQWlCLEVBRWpCLGVBWVIsRUFDMEIsS0FBdUMsRUFFekQsTUFBNEM7UUF6QnpELFlBMkJJ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RDtRQURDLE9BQU87OERBU1A7SUFHRDtRQURDLE9BQU87OERBTVA7SUFHRDtRQURDLE9BQU87Z0VBTVA7SUFHRDtRQURDLE9BQU87K0RBR1A7SUE3UFEscUJBQXFCO1FBYmpDLFNBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsdzZGQUF5QztZQUV6QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtZQUMvQyxTQUFTLEVBQUU7Z0JBQ1AsYUFBYTtnQkFDYjtvQkFDSSxPQUFPLEVBQUUsMkJBQTJCO29CQUNwQyxXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSx1QkFBcUIsRUFBckIsQ0FBcUIsQ0FBQztpQkFDdkQ7YUFDSjs7U0FDSixDQUFDO1FBaURPLFdBQUEsUUFBUSxFQUFFLENBQUE7UUFDVixXQUFBLElBQUksRUFBRSxDQUFBO1FBQ04sV0FBQSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFakIsV0FBQSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtRQUV6QixXQUFBLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUVyQixXQUFBLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBYzVCLFdBQUEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2hCLFdBQUEsTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUE7T0F2RWpDLHFCQUFxQixDQTZUakM7SUFBRCw0QkFBQztDQUFBLEFBN1RELENBQ1ksMEJBQTBCLEdBNFRyQztTQTdUWSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgU2VsZixcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOZ0NvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RUdWlOdWxsYWJsZUNvbnRyb2wsXG4gICAgRU1QVFlfQVJSQVksXG4gICAgaXNOYXRpdmVGb2N1c2VkLFxuICAgIFRVSV9GT0NVU0FCTEVfSVRFTV9BQ0NFU1NPUixcbiAgICBUVUlfSVNfTU9CSUxFLFxuICAgIHR1aURlZmF1bHRQcm9wLFxuICAgIFR1aUZvY3VzYWJsZUVsZW1lbnRBY2Nlc3NvcixcbiAgICBUdWlOYXRpdmVGb2N1c2FibGVFbGVtZW50LFxuICAgIHR1aVB1cmUsXG59IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHtcbiAgICBNT0RFX1BST1ZJREVSLFxuICAgIFRVSV9NT0RFLFxuICAgIFR1aUFwcGVhcmFuY2UsXG4gICAgVHVpQnJpZ2h0bmVzcyxcbiAgICBUdWlTaXplTCxcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHtUdWlGaWxlTGlrZX0gZnJvbSAnQHRhaWdhLXVpL2tpdC9pbnRlcmZhY2VzJztcbmltcG9ydCB7VFVJX0RJR0lUQUxfSU5GT1JNQVRJT05fVU5JVFMsIFRVSV9JTlBVVF9GSUxFX1RFWFRTfSBmcm9tICdAdGFpZ2EtdWkva2l0L3Rva2Vucyc7XG5pbXBvcnQge2Zvcm1hdFNpemV9IGZyb20gJ0B0YWlnYS11aS9raXQvdXRpbHMvZmlsZXMnO1xuaW1wb3J0IHtQb2x5bW9ycGhldXNDb250ZW50fSBmcm9tICdAdGlua29mZi9uZy1wb2x5bW9ycGhldXMnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBvZn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5jb25zdCBERUZBVUxUX01BWF9TSVpFID0gMzAgKiAxMDAwICogMTAwMDsgLy8gMzAgTUJcblxuLy8gQGR5bmFtaWNcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndHVpLWlucHV0LWZpbGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC1maWxlLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2lucHV0LWZpbGUuc3R5bGUubGVzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBNT0RFX1BST1ZJREVSLFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBUVUlfRk9DVVNBQkxFX0lURU1fQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUdWlJbnB1dEZpbGVDb21wb25lbnQpLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aUlucHV0RmlsZUNvbXBvbmVudFxuICAgIGV4dGVuZHMgQWJzdHJhY3RUdWlOdWxsYWJsZUNvbnRyb2w8VHVpRmlsZUxpa2UgfCBSZWFkb25seUFycmF5PFR1aUZpbGVMaWtlPj5cbiAgICBpbXBsZW1lbnRzIFR1aUZvY3VzYWJsZUVsZW1lbnRBY2Nlc3NvciB7XG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIGxpbms6IFBvbHltb3JwaGV1c0NvbnRlbnQgPSAnJztcblxuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBsYWJlbDogUG9seW1vcnBoZXVzQ29udGVudCA9ICcnO1xuXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIGFjY2VwdCA9ICcnO1xuXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIG11bHRpcGxlID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgc2l6ZTogVHVpU2l6ZUwgPSAnbSc7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgc2hvd1NpemUgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIG1heEZpbGVTaXplID0gREVGQVVMVF9NQVhfU0laRTtcblxuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBsb2FkaW5nRmlsZXM6IFJlYWRvbmx5QXJyYXk8VHVpRmlsZUxpa2U+ID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgcmVqZWN0ZWRGaWxlczogUmVhZG9ubHlBcnJheTxUdWlGaWxlTGlrZT4gPSBbXTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHJlamVjdGVkRmlsZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFJlYWRvbmx5QXJyYXk8VHVpRmlsZUxpa2U+PigpO1xuXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnKVxuICAgIHJlYWRvbmx5IGlucHV0PzogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICAgIHByaXZhdGUgZGF0YVRyYW5zZmVyOiBEYXRhVHJhbnNmZXIgfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBAU2VsZigpXG4gICAgICAgIEBJbmplY3QoTmdDb250cm9sKVxuICAgICAgICBjb250cm9sOiBOZ0NvbnRyb2wgfCBudWxsLFxuICAgICAgICBASW5qZWN0KENoYW5nZURldGVjdG9yUmVmKVxuICAgICAgICBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIEBJbmplY3QoVFVJX0lTX01PQklMRSlcbiAgICAgICAgcmVhZG9ubHkgaXNNb2JpbGU6IGJvb2xlYW4sXG4gICAgICAgIEBJbmplY3QoVFVJX0lOUFVUX0ZJTEVfVEVYVFMpXG4gICAgICAgIHJlYWRvbmx5IGlucHV0RmlsZVRleHRzJDogT2JzZXJ2YWJsZTxcbiAgICAgICAgICAgIFJlY29yZDxcbiAgICAgICAgICAgICAgICB8ICdkZWZhdWx0TGFiZWxTaW5nbGUnXG4gICAgICAgICAgICAgICAgfCAnZGVmYXVsdExhYmVsTXVsdGlwbGUnXG4gICAgICAgICAgICAgICAgfCAnZGVmYXVsdExpbmtTaW5nbGUnXG4gICAgICAgICAgICAgICAgfCAnZGVmYXVsdExpbmtNdWx0aXBsZSdcbiAgICAgICAgICAgICAgICB8ICdtYXhTaXplUmVqZWN0aW9uUmVhc29uJ1xuICAgICAgICAgICAgICAgIHwgJ2Zvcm1hdFJlamVjdGlvblJlYXNvbidcbiAgICAgICAgICAgICAgICB8ICdkcm9wJ1xuICAgICAgICAgICAgICAgIHwgJ2Ryb3BNdWx0aXBsZScsXG4gICAgICAgICAgICAgICAgc3RyaW5nXG4gICAgICAgICAgICA+XG4gICAgICAgID4sXG4gICAgICAgIEBJbmplY3QoVFVJX01PREUpIHJlYWRvbmx5IG1vZGUkOiBPYnNlcnZhYmxlPFR1aUJyaWdodG5lc3MgfCBudWxsPixcbiAgICAgICAgQEluamVjdChUVUlfRElHSVRBTF9JTkZPUk1BVElPTl9VTklUUylcbiAgICAgICAgcmVhZG9ubHkgdW5pdHMkOiBPYnNlcnZhYmxlPFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXT4sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGNvbnRyb2wsIGNoYW5nZURldGVjdG9yUmVmKTtcbiAgICB9XG5cbiAgICBnZXQgbmF0aXZlRm9jdXNhYmxlRWxlbWVudCgpOiBUdWlOYXRpdmVGb2N1c2FibGVFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0ID8gdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50IDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgZm9jdXNlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzTmF0aXZlRm9jdXNlZCh0aGlzLm5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIGdldCBhbGxvd0RlbGV0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbXB1dGVkRGlzYWJsZWQgJiYgIXRoaXMucmVhZE9ubHk7XG4gICAgfVxuXG4gICAgZ2V0IGNvbXB1dGVkTGluayQoKTogT2JzZXJ2YWJsZTxQb2x5bW9ycGhldXNDb250ZW50PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVMaW5rJCh0aGlzLmZpbGVEcmFnZ2VkLCB0aGlzLm11bHRpcGxlLCB0aGlzLmxpbmspO1xuICAgIH1cblxuICAgIGdldCBjb21wdXRlZExhYmVsJCgpOiBPYnNlcnZhYmxlPFBvbHltb3JwaGV1c0NvbnRlbnQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZUxhYmVsJChcbiAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUsXG4gICAgICAgICAgICB0aGlzLmZpbGVEcmFnZ2VkLFxuICAgICAgICAgICAgdGhpcy5tdWx0aXBsZSxcbiAgICAgICAgICAgIHRoaXMubGFiZWwsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQGJhZCBUT0RPOiByZWZhY3RvciBhZnRlciBJRSBpcyBkcm9wcGVkXG4gICAgZ2V0IGZpbGVEcmFnZ2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgISF0aGlzLmRhdGFUcmFuc2ZlciAmJlxuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLmRhdGFUcmFuc2Zlci50eXBlcywgJ0ZpbGVzJykgIT09IC0xXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0IGFjY2VwdEFycmF5KCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWNjZXB0QXJyYXkodGhpcy5hY2NlcHQpO1xuICAgIH1cblxuICAgIGdldCBhcnJheVZhbHVlKCk6IFJlYWRvbmx5QXJyYXk8VHVpRmlsZUxpa2U+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVBcnJheSh0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXQgcmVhZHlGaWxlcygpOiBSZWFkb25seUFycmF5PFR1aUZpbGVMaWtlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlYWR5RmlsZXModGhpcy5hcnJheVZhbHVlLCB0aGlzLmxvYWRpbmdGaWxlcyk7XG4gICAgfVxuXG4gICAgZ2V0IGNvbXB1dGVkTG9hZGluZygpOiBSZWFkb25seUFycmF5PFR1aUZpbGVMaWtlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExvYWRpbmdGaWxlcyh0aGlzLmFycmF5VmFsdWUsIHRoaXMubG9hZGluZ0ZpbGVzKTtcbiAgICB9XG5cbiAgICBnZXQgaGFzRmlsZXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucmVqZWN0ZWRGaWxlcy5sZW5ndGggfHwgISF0aGlzLmFycmF5VmFsdWUubGVuZ3RoO1xuICAgIH1cblxuICAgIG9uSG92ZXJlZChob3ZlcmVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMudXBkYXRlSG92ZXJlZChob3ZlcmVkKTtcbiAgICB9XG5cbiAgICBvbkZvY3VzZWQoZm9jdXNlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnVwZGF0ZUZvY3VzZWQoZm9jdXNlZCk7XG4gICAgfVxuXG4gICAgb25QcmVzc2VkKHByZXNzZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy51cGRhdGVQcmVzc2VkKHByZXNzZWQpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHJlZmFjdG9yIGkxOG4gbWVzc2FnZXNcbiAgICBvbkZpbGVzU2VsZWN0ZWQoXG4gICAgICAgIGlucHV0OiBIVE1MSW5wdXRFbGVtZW50LFxuICAgICAgICB0ZXh0czogUmVjb3JkPCdtYXhTaXplUmVqZWN0aW9uUmVhc29uJyB8ICdmb3JtYXRSZWplY3Rpb25SZWFzb24nLCBzdHJpbmc+LFxuICAgICAgICB1bml0czogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddLFxuICAgICkge1xuICAgICAgICB0aGlzLnByb2Nlc3NTZWxlY3RlZEZpbGVzKGlucHV0LmZpbGVzLCB0ZXh0cywgdW5pdHMpO1xuICAgICAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIG9uRHJvcHBlZChcbiAgICAgICAgZXZlbnQ6IERhdGFUcmFuc2ZlcixcbiAgICAgICAgdGV4dHM6IFJlY29yZDwnbWF4U2l6ZVJlamVjdGlvblJlYXNvbicgfCAnZm9ybWF0UmVqZWN0aW9uUmVhc29uJywgc3RyaW5nPixcbiAgICAgICAgdW5pdHM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzU2VsZWN0ZWRGaWxlcyhldmVudC5maWxlcywgdGV4dHMsIHVuaXRzKTtcbiAgICB9XG5cbiAgICBvbkRyYWdPdmVyKGRhdGFUcmFuc2ZlcjogRGF0YVRyYW5zZmVyIHwgbnVsbCkge1xuICAgICAgICB0aGlzLmRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlcjtcbiAgICB9XG5cbiAgICByZW1vdmVGaWxlKHJlbW92ZWRGaWxlOiBUdWlGaWxlTGlrZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKFxuICAgICAgICAgICAgdGhpcy5tdWx0aXBsZSA/IHRoaXMuYXJyYXlWYWx1ZS5maWx0ZXIoZmlsZSA9PiBmaWxlICE9PSByZW1vdmVkRmlsZSkgOiBudWxsLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbW92ZVJlamVjdGVkRmlsZShyZW1vdmVkRmlsZTogVHVpRmlsZUxpa2UpIHtcbiAgICAgICAgdGhpcy51cGRhdGVSZWplY3RlZEZpbGVzKHRoaXMucmVqZWN0ZWRGaWxlcy5maWx0ZXIoZmlsZSA9PiBmaWxlICE9PSByZW1vdmVkRmlsZSkpO1xuICAgIH1cblxuICAgIGdldEFwcGVhcmFuY2UobW9kZTogbnVsbCB8IHVua25vd24pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbW9kZSA9PT0gbnVsbCA/ICcnIDogVHVpQXBwZWFyYW5jZS5PdXRsaW5lO1xuICAgIH1cblxuICAgIEB0dWlQdXJlXG4gICAgcHJpdmF0ZSBjb21wdXRlTGluayQoXG4gICAgICAgIGZpbGVEcmFnZ2VkOiBib29sZWFuLFxuICAgICAgICBtdWx0aXBsZTogYm9vbGVhbixcbiAgICAgICAgbGluazogUG9seW1vcnBoZXVzQ29udGVudCxcbiAgICApOiBPYnNlcnZhYmxlPFBvbHltb3JwaGV1c0NvbnRlbnQ+IHtcbiAgICAgICAgaWYgKGZpbGVEcmFnZ2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGaWxlVGV4dHMkLnBpcGUoXG4gICAgICAgICAgICBtYXAodGV4dHMgPT5cbiAgICAgICAgICAgICAgICBtdWx0aXBsZSAmJiBsaW5rID09PSAnJ1xuICAgICAgICAgICAgICAgICAgICA/IHRleHRzLmRlZmF1bHRMaW5rTXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgOiBsaW5rIHx8IHRleHRzLmRlZmF1bHRMaW5rU2luZ2xlLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBAdHVpUHVyZVxuICAgIHByaXZhdGUgY29tcHV0ZUxhYmVsJChcbiAgICAgICAgaXNNb2JpbGU6IGJvb2xlYW4sXG4gICAgICAgIGZpbGVEcmFnZ2VkOiBib29sZWFuLFxuICAgICAgICBtdWx0aXBsZTogYm9vbGVhbixcbiAgICAgICAgbGFiZWw6IFBvbHltb3JwaGV1c0NvbnRlbnQsXG4gICAgKTogT2JzZXJ2YWJsZTxQb2x5bW9ycGhldXNDb250ZW50PiB7XG4gICAgICAgIGlmIChpc01vYmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKCcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlRHJhZ2dlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGaWxlVGV4dHMkLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHRleHRzID0+IChtdWx0aXBsZSA/IHRleHRzLmRyb3BNdWx0aXBsZSA6IHRleHRzLmRyb3ApKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dEZpbGVUZXh0cyQucGlwZShcbiAgICAgICAgICAgIG1hcCh0ZXh0cyA9PlxuICAgICAgICAgICAgICAgIG11bHRpcGxlICYmIGxhYmVsID09PSAnJ1xuICAgICAgICAgICAgICAgICAgICA/IHRleHRzLmRlZmF1bHRMYWJlbE11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgIDogbGFiZWwgfHwgdGV4dHMuZGVmYXVsdExhYmVsU2luZ2xlLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBAdHVpUHVyZVxuICAgIHByaXZhdGUgZ2V0VmFsdWVBcnJheShcbiAgICAgICAgdmFsdWU6IFR1aUZpbGVMaWtlIHwgUmVhZG9ubHlBcnJheTxUdWlGaWxlTGlrZT4gfCBudWxsLFxuICAgICk6IFJlYWRvbmx5QXJyYXk8VHVpRmlsZUxpa2U+IHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0FSUkFZO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgQXJyYXkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgQHR1aVB1cmVcbiAgICBwcml2YXRlIGdldFJlYWR5RmlsZXMoXG4gICAgICAgIHZhbHVlOiBSZWFkb25seUFycmF5PFR1aUZpbGVMaWtlPixcbiAgICAgICAgbG9hZGluZzogUmVhZG9ubHlBcnJheTxUdWlGaWxlTGlrZT4sXG4gICAgKTogUmVhZG9ubHlBcnJheTxUdWlGaWxlTGlrZT4ge1xuICAgICAgICByZXR1cm4gdmFsdWUuZmlsdGVyKGZpbGUgPT4gbG9hZGluZy5pbmRleE9mKGZpbGUpID09PSAtMSk7XG4gICAgfVxuXG4gICAgQHR1aVB1cmVcbiAgICBwcml2YXRlIGdldExvYWRpbmdGaWxlcyhcbiAgICAgICAgdmFsdWU6IFJlYWRvbmx5QXJyYXk8VHVpRmlsZUxpa2U+LFxuICAgICAgICBsb2FkaW5nOiBSZWFkb25seUFycmF5PFR1aUZpbGVMaWtlPixcbiAgICApOiBSZWFkb25seUFycmF5PFR1aUZpbGVMaWtlPiB7XG4gICAgICAgIHJldHVybiBsb2FkaW5nLmZpbHRlcihmaWxlID0+IHZhbHVlLmluZGV4T2YoZmlsZSkgIT09IC0xKTtcbiAgICB9XG5cbiAgICBAdHVpUHVyZVxuICAgIHByaXZhdGUgZ2V0QWNjZXB0QXJyYXkoYWNjZXB0OiBzdHJpbmcpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBhY2NlcHQudG9Mb3dlckNhc2UoKS5zcGxpdCgnLCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc1NlbGVjdGVkRmlsZXMoXG4gICAgICAgIGZpbGVzOiBGaWxlTGlzdCB8IG51bGwsXG4gICAgICAgIHRleHRzOiBSZWNvcmQ8J21heFNpemVSZWplY3Rpb25SZWFzb24nIHwgJ2Zvcm1hdFJlamVjdGlvblJlYXNvbicsIHN0cmluZz4sXG4gICAgICAgIHVuaXRzOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10sXG4gICAgKSB7XG4gICAgICAgIC8vIElFMTEgYWZ0ZXIgc2VsZWN0aW5nIGEgZmlsZSB0aHJvdWdoIHRoZSBvcGVuIGRpYWxvZyBnZW5lcmF0ZXMgYSBzZWNvbmQgZXZlbnQgcGFzc2luZyBhbiBlbXB0eSBGaWxlTGlzdC5cbiAgICAgICAgaWYgKGZpbGVzID09PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3RmlsZXMgPSB0aGlzLm11bHRpcGxlID8gQXJyYXkuZnJvbShmaWxlcykgOiBbZmlsZXNbMF1dO1xuICAgICAgICBjb25zdCB0b29CaWdGaWxlcyA9IG5ld0ZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGUuc2l6ZSA+IHRoaXMubWF4RmlsZVNpemUpO1xuICAgICAgICBjb25zdCB3cm9uZ0Zvcm1hdEZpbGVzID0gbmV3RmlsZXMuZmlsdGVyKFxuICAgICAgICAgICAgZmlsZSA9PiAhdGhpcy5pc0Zvcm1hdEFjY2VwdGFibGUoZmlsZSkgJiYgdG9vQmlnRmlsZXMuaW5kZXhPZihmaWxlKSA9PT0gLTEsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGFjY2VwdGVkRmlsZXMgPSBuZXdGaWxlcy5maWx0ZXIoXG4gICAgICAgICAgICBmaWxlID0+XG4gICAgICAgICAgICAgICAgdG9vQmlnRmlsZXMuaW5kZXhPZihmaWxlKSA9PT0gLTEgJiYgd3JvbmdGb3JtYXRGaWxlcy5pbmRleE9mKGZpbGUpID09PSAtMSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVJlamVjdGVkRmlsZXMoW1xuICAgICAgICAgICAgLi4udG9vQmlnRmlsZXMubWFwKGZpbGUgPT4gKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OlxuICAgICAgICAgICAgICAgICAgICB0ZXh0cy5tYXhTaXplUmVqZWN0aW9uUmVhc29uICsgZm9ybWF0U2l6ZSh1bml0cywgdGhpcy5tYXhGaWxlU2l6ZSksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAuLi53cm9uZ0Zvcm1hdEZpbGVzLm1hcChmaWxlID0+ICh7XG4gICAgICAgICAgICAgICAgbmFtZTogZmlsZS5uYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgICAgICAgY29udGVudDogdGV4dHMuZm9ybWF0UmVqZWN0aW9uUmVhc29uLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVcbiAgICAgICAgICAgICAgICA/IFsuLi50aGlzLmFycmF5VmFsdWUsIC4uLmFjY2VwdGVkRmlsZXNdXG4gICAgICAgICAgICAgICAgOiBhY2NlcHRlZEZpbGVzWzBdIHx8IG51bGwsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0Zvcm1hdEFjY2VwdGFibGUoZmlsZTogRmlsZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuYWNjZXB0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9ICcuJyArIChmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hY2NlcHRBcnJheS5zb21lKFxuICAgICAgICAgICAgZm9ybWF0ID0+XG4gICAgICAgICAgICAgICAgZm9ybWF0ID09PSBleHRlbnNpb24gfHxcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09IGZpbGUudHlwZSB8fFxuICAgICAgICAgICAgICAgIChmb3JtYXQuc3BsaXQoJy8nKVsxXSA9PT0gJyonICYmXG4gICAgICAgICAgICAgICAgICAgIGZpbGUudHlwZS5zcGxpdCgnLycpWzBdID09PSBmb3JtYXQuc3BsaXQoJy8nKVswXSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVSZWplY3RlZEZpbGVzKHJlamVjdGVkRmlsZXM6IFJlYWRvbmx5QXJyYXk8VHVpRmlsZUxpa2U+KSB7XG4gICAgICAgIHRoaXMucmVqZWN0ZWRGaWxlcyA9IHJlamVjdGVkRmlsZXM7XG4gICAgICAgIHRoaXMucmVqZWN0ZWRGaWxlc0NoYW5nZS5lbWl0KHJlamVjdGVkRmlsZXMpO1xuICAgIH1cbn1cbiJdfQ==