gentics-ui-core
Version:
This is the common core framework for the Gentics CMS and Mesh UI, and other Angular applications.
191 lines • 23.3 kB
JavaScript
import { ChangeDetectorRef, Component, EventEmitter, Input, Optional, Output, Self } from '@angular/core';
import { merge as observableMerge } from 'rxjs';
import { FileDropArea } from '../file-drop-area/file-drop-area.directive';
import { matchesMimeType } from '../file-drop-area/matches-mime-type';
import * as i0 from "@angular/core";
import * as i1 from "../file-drop-area/file-drop-area.directive";
import * as i2 from "../button/button.component";
/**
* A file picker component.
*
* ```html
* <gtx-file-picker (fileSelect)="uploadFiles($event)"></gtx-file-picker>
* ```
*/
export class FilePicker {
constructor(dropArea, cd) {
this.dropArea = dropArea;
this.cd = cd;
/**
* Sets the file picker button to be auto-focused. Handled by `AutofocusDirective`.
*/
this.autofocus = false;
/**
* Sets the type of the button. Forwarded to the Button component.
*/
this.type = 'primary';
/**
* Triggered when a file / files are selected via the file picker.
*/
this.fileSelect = new EventEmitter();
/**
* Triggered when a file / files are selected but do not fit the "accept" option.
*/
this.fileSelectReject = new EventEmitter();
this.inputAccept = '*';
this._icon = false;
this._size = 'regular';
this._flat = false;
this._accept = '*';
this._disabled = false;
this._multiple = true;
this._subscriptions = [];
}
/**
* Set to a non-false value to disable the file picker. Defaults to `false` if absent.
*/
get disabled() {
return this._disabled;
}
set disabled(value) {
let newValue = value !== false && value !== 'false';
if (newValue != this._disabled) {
this._disabled = newValue;
this.setDropAreaOptions();
}
}
/**
* Set to a falsy value to disable picking multiple files at once. Defaults to `true` if absent.
*/
get multiple() {
return this._multiple;
}
set multiple(value) {
let newValue = value !== false && value !== 'false';
if (newValue != this._multiple) {
this._multiple = newValue;
this.setDropAreaOptions();
}
}
/**
* Provides feedback for accepted file types, if supported by the browser. Defaults to `"*"`.
*/
get accept() {
return this._accept;
}
set accept(value) {
let usedValue = value == undefined ? '*' : value;
if (usedValue !== this._accept) {
this._accept = usedValue;
this.inputAccept = usedValue.replace(/,/g, ';');
this.setDropAreaOptions();
}
}
/**
* Button size - "small", "regular" or "large". Forwarded to the Button component.
*/
get size() {
return this._size;
}
set size(val) {
this._size = val == undefined ? 'regular' : val;
}
/**
* Display the button as a flat button or not. Forwarded to the Button component.
*/
get flat() {
return this._flat;
}
set flat(val) {
this._flat = val != undefined && val !== false;
}
/**
* Icon button without text. Forwarded to the Button component.
*/
get icon() {
return this._icon;
}
set icon(val) {
this._icon = val !== false && val !== 'false';
}
ngOnInit() {
if (this.dropArea) {
this.setDropAreaOptions();
this._subscriptions = [
observableMerge(this.dropArea.pageDragEnter, this.dropArea.pageDragLeave, this.dropArea.fileDragEnter, this.dropArea.fileDragLeave).subscribe(() => this.cd.markForCheck()),
this.dropArea.fileDrop.subscribe((files) => {
this.fileSelect.emit(files);
}),
this.dropArea.fileDropReject.subscribe((files) => {
this.fileSelectReject.emit(files);
})
];
}
}
ngOnDestroy() {
this._subscriptions.forEach(s => s.unsubscribe());
}
onChange(event, input) {
let files = input && input.files;
if (files && files.length) {
let accepted = [];
let rejected = [];
Array.from(files).forEach(file => {
if (matchesMimeType(file.type, this._accept)) {
accepted.push(file);
}
else {
rejected.push(file);
}
});
// Remove the Files from the input
input.value = '';
if (accepted.length > 0) {
this.fileSelect.emit(accepted);
}
if (rejected.length > 0) {
this.fileSelectReject.emit(rejected);
}
}
}
setDropAreaOptions() {
if (this.dropArea) {
let options = Object.assign({}, this.dropArea.options || {});
options.accept = this._accept;
options.disabled = this._disabled;
options.multiple = this._multiple;
this.dropArea.options = options;
}
}
}
/** @nocollapse */ FilePicker.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: FilePicker, deps: [{ token: i1.FileDropArea, optional: true, self: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ FilePicker.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: FilePicker, selector: "gtx-file-picker", inputs: { autofocus: "autofocus", disabled: "disabled", multiple: "multiple", accept: "accept", size: "size", flat: "flat", type: "type", icon: "icon" }, outputs: { fileSelect: "fileSelect", fileSelectReject: "fileSelectReject" }, ngImport: i0, template: "<div class=\"hidden-file-wrapper\">\n <input type=\"file\" class=\"hidden-file-input\"\n tabindex=\"-1\"\n [accept]=\"inputAccept\"\n [disabled]=\"disabled\"\n [multiple]=\"multiple\"\n (change)=\"onChange($event, fileInput)\"\n #fileInput\n />\n</div>\n<gtx-button (click)=\"!disabled && fileInput.click()\" [disabled]=\"disabled\"\n [size]=\"size\" [icon]=\"icon\"\n [type]=\"dropArea?.pageDragHovered ? 'success' : type\"\n [flat]=\"flat || dropArea?.dragHovered\">\n <ng-content></ng-content>\n</gtx-button>\n", components: [{ type: i2.Button, selector: "gtx-button", inputs: ["autofocus", "size", "type", "flat", "icon", "disabled", "submit"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: FilePicker, decorators: [{
type: Component,
args: [{ selector: 'gtx-file-picker', template: "<div class=\"hidden-file-wrapper\">\n <input type=\"file\" class=\"hidden-file-input\"\n tabindex=\"-1\"\n [accept]=\"inputAccept\"\n [disabled]=\"disabled\"\n [multiple]=\"multiple\"\n (change)=\"onChange($event, fileInput)\"\n #fileInput\n />\n</div>\n<gtx-button (click)=\"!disabled && fileInput.click()\" [disabled]=\"disabled\"\n [size]=\"size\" [icon]=\"icon\"\n [type]=\"dropArea?.pageDragHovered ? 'success' : type\"\n [flat]=\"flat || dropArea?.dragHovered\">\n <ng-content></ng-content>\n</gtx-button>\n" }]
}], ctorParameters: function () { return [{ type: i1.FileDropArea, decorators: [{
type: Optional
}, {
type: Self
}] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { autofocus: [{
type: Input
}], disabled: [{
type: Input
}], multiple: [{
type: Input
}], accept: [{
type: Input
}], size: [{
type: Input
}], flat: [{
type: Input
}], type: [{
type: Input
}], icon: [{
type: Input
}], fileSelect: [{
type: Output
}], fileSelectReject: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvZmlsZS1waWNrZXIvZmlsZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvZmlsZS1waWNrZXIvZmlsZS1waWNrZXIudHBsLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsS0FBSyxJQUFJLGVBQWUsRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUU1RCxPQUFPLEVBQUMsWUFBWSxFQUF1QixNQUFNLDRDQUE0QyxDQUFDO0FBQzlGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQzs7OztBQUVwRTs7Ozs7O0dBTUc7QUFLSCxNQUFNLE9BQU8sVUFBVTtJQXlHbkIsWUFBdUMsUUFBc0IsRUFDekMsRUFBcUI7UUFERixhQUFRLEdBQVIsUUFBUSxDQUFjO1FBQ3pDLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBekd6Qzs7V0FFRztRQUNNLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFpRXBDOztXQUVHO1FBQ00sU0FBSSxHQUE4RCxTQUFTLENBQUM7UUFZckY7O1dBRUc7UUFDTyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVsRDs7V0FFRztRQUNPLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFHeEQsZ0JBQVcsR0FBVyxHQUFHLENBQUM7UUFDbEIsVUFBSyxHQUFZLEtBQUssQ0FBQztRQUN2QixVQUFLLEdBQWtDLFNBQVMsQ0FBQztRQUNqRCxVQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2QsWUFBTyxHQUFXLEdBQUcsQ0FBQztR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QW5CLE1BQU07Z0JBS0csZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFNlbGZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge21lcmdlIGFzIG9ic2VydmFibGVNZXJnZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtGaWxlRHJvcEFyZWEsIElGaWxlRHJvcEFyZWFPcHRpb25zfSBmcm9tICcuLi9maWxlLWRyb3AtYXJlYS9maWxlLWRyb3AtYXJlYS5kaXJlY3RpdmUnO1xuaW1wb3J0IHttYXRjaGVzTWltZVR5cGV9IGZyb20gJy4uL2ZpbGUtZHJvcC1hcmVhL21hdGNoZXMtbWltZS10eXBlJztcblxuLyoqXG4gKiBBIGZpbGUgcGlja2VyIGNvbXBvbmVudC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8Z3R4LWZpbGUtcGlja2VyIChmaWxlU2VsZWN0KT1cInVwbG9hZEZpbGVzKCRldmVudClcIj48L2d0eC1maWxlLXBpY2tlcj5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2d0eC1maWxlLXBpY2tlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtcGlja2VyLnRwbC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBGaWxlUGlja2VyIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZpbGUgcGlja2VyIGJ1dHRvbiB0byBiZSBhdXRvLWZvY3VzZWQuIEhhbmRsZWQgYnkgYEF1dG9mb2N1c0RpcmVjdGl2ZWAuXG4gICAgICovXG4gICAgQElucHV0KCkgYXV0b2ZvY3VzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYSBub24tZmFsc2UgdmFsdWUgdG8gZGlzYWJsZSB0aGUgZmlsZSBwaWNrZXIuIERlZmF1bHRzIHRvIGBmYWxzZWAgaWYgYWJzZW50LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cbiAgICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IG5ld1ZhbHVlID0gdmFsdWUgIT09IGZhbHNlICYmIDxhbnk+IHZhbHVlICE9PSAnZmFsc2UnO1xuICAgICAgICBpZiAobmV3VmFsdWUgIT0gdGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVkID0gbmV3VmFsdWU7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BBcmVhT3B0aW9ucygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGEgZmFsc3kgdmFsdWUgdG8gZGlzYWJsZSBwaWNraW5nIG11bHRpcGxlIGZpbGVzIGF0IG9uY2UuIERlZmF1bHRzIHRvIGB0cnVlYCBpZiBhYnNlbnQuXG4gICAgICovXG4gICAgQElucHV0KCkgZ2V0IG11bHRpcGxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGU7XG4gICAgfVxuICAgIHNldCBtdWx0aXBsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBsZXQgbmV3VmFsdWUgPSB2YWx1ZSAhPT0gZmFsc2UgJiYgPGFueT4gdmFsdWUgIT09ICdmYWxzZSc7XG4gICAgICAgIGlmIChuZXdWYWx1ZSAhPSB0aGlzLl9tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0RHJvcEFyZWFPcHRpb25zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBmZWVkYmFjayBmb3IgYWNjZXB0ZWQgZmlsZSB0eXBlcywgaWYgc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyLiBEZWZhdWx0cyB0byBgXCIqXCJgLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGdldCBhY2NlcHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjY2VwdDtcbiAgICB9XG4gICAgc2V0IGFjY2VwdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCB1c2VkVmFsdWUgPSB2YWx1ZSA9PSB1bmRlZmluZWQgPyAnKicgOiB2YWx1ZTtcbiAgICAgICAgaWYgKHVzZWRWYWx1ZSAhPT0gdGhpcy5fYWNjZXB0KSB7XG4gICAgICAgICAgICB0aGlzLl9hY2NlcHQgPSB1c2VkVmFsdWU7XG4gICAgICAgICAgICB0aGlzLmlucHV0QWNjZXB0ID0gdXNlZFZhbHVlLnJlcGxhY2UoLywvZywgJzsnKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RHJvcEFyZWFPcHRpb25zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdXR0b24gc2l6ZSAtIFwic21hbGxcIiwgXCJyZWd1bGFyXCIgb3IgXCJsYXJnZVwiLiBGb3J3YXJkZWQgdG8gdGhlIEJ1dHRvbiBjb21wb25lbnQuXG4gICAgICovXG4gICAgQElucHV0KCkgZ2V0IHNpemUoKTogJ3NtYWxsJyB8ICdyZWd1bGFyJyB8ICdsYXJnZScge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG4gICAgc2V0IHNpemUodmFsOiAnc21hbGwnIHwgJ3JlZ3VsYXInIHwgJ2xhcmdlJykge1xuICAgICAgICB0aGlzLl9zaXplID0gdmFsID09IHVuZGVmaW5lZCA/ICdyZWd1bGFyJyA6IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5IHRoZSBidXR0b24gYXMgYSBmbGF0IGJ1dHRvbiBvciBub3QuIEZvcndhcmRlZCB0byB0aGUgQnV0dG9uIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBnZXQgZmxhdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZsYXQ7XG4gICAgfVxuICAgIHNldCBmbGF0KHZhbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9mbGF0ID0gdmFsICE9IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHR5cGUgb2YgdGhlIGJ1dHRvbi4gRm9yd2FyZGVkIHRvIHRoZSBCdXR0b24gY29tcG9uZW50LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHR5cGU6ICdwcmltYXJ5JyB8ICdzZWNvbmRhcnknIHwgJ3N1Y2Nlc3MnIHwgJ3dhcm5pbmcnIHwgJ2FsZXJ0JyA9ICdwcmltYXJ5JztcblxuICAgIC8qKlxuICAgICAqIEljb24gYnV0dG9uIHdpdGhvdXQgdGV4dC4gRm9yd2FyZGVkIHRvIHRoZSBCdXR0b24gY29tcG9uZW50LlxuICAgICAqL1xuICAgIEBJbnB1dCgpICBnZXQgaWNvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ljb247XG4gICAgfVxuICAgIHNldCBpY29uKHZhbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9pY29uID0gdmFsICE9PSBmYWxzZSAmJiA8YW55PiB2YWwgIT09ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBmaWxlIC8gZmlsZXMgYXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBwaWNrZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIGZpbGVTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVbXT4oKTtcblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgZmlsZSAvIGZpbGVzIGFyZSBzZWxlY3RlZCBidXQgZG8gbm90IGZpdCB0aGUgXCJhY2NlcHRcIiBvcHRpb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpIGZpbGVTZWxlY3RSZWplY3QgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVbXT4oKTtcblxuXG4gICAgaW5wdXRBY2NlcHQ6IHN0cmluZyA9ICcqJztcbiAgICBwcml2YXRlIF9pY29uOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfc2l6ZTogJ3NtYWxsJyB8ICdyZWd1bGFyJyB8ICdsYXJnZScgPSAncmVndWxhcic7XG4gICAgcHJpdmF0ZSBfZmxhdCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2FjY2VwdDogc3RyaW5nID0gJyonO1xuICAgIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbXVsdGlwbGUgPSB0cnVlO1xuICAgIHByaXZhdGUgX3N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cblxuICAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIGRyb3BBcmVhOiBGaWxlRHJvcEFyZWEsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRyb3BBcmVhKSB7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BBcmVhT3B0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICBvYnNlcnZhYmxlTWVyZ2UoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcEFyZWEucGFnZURyYWdFbnRlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wQXJlYS5wYWdlRHJhZ0xlYXZlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3BBcmVhLmZpbGVEcmFnRW50ZXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcEFyZWEuZmlsZURyYWdMZWF2ZVxuICAgICAgICAgICAgICAgICkuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2QubWFya0ZvckNoZWNrKCkpLFxuXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wQXJlYS5maWxlRHJvcC5zdWJzY3JpYmUoKGZpbGVzOiBGaWxlW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlU2VsZWN0LmVtaXQoZmlsZXMpO1xuICAgICAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wQXJlYS5maWxlRHJvcFJlamVjdC5zdWJzY3JpYmUoKGZpbGVzOiBGaWxlW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlU2VsZWN0UmVqZWN0LmVtaXQoZmlsZXMpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgfVxuXG4gICAgb25DaGFuZ2UoZXZlbnQ6IEV2ZW50LCBpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICBsZXQgZmlsZXMgPSBpbnB1dCAmJiBpbnB1dC5maWxlcztcbiAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGFjY2VwdGVkOiBGaWxlW10gPSBbXTtcbiAgICAgICAgICAgIGxldCByZWplY3RlZDogRmlsZVtdID0gW107XG4gICAgICAgICAgICBBcnJheS5mcm9tKGZpbGVzKS5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzTWltZVR5cGUoZmlsZS50eXBlLCB0aGlzLl9hY2NlcHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkLnB1c2goZmlsZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0ZWQucHVzaChmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBGaWxlcyBmcm9tIHRoZSBpbnB1dFxuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAnJztcblxuICAgICAgICAgICAgaWYgKGFjY2VwdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVTZWxlY3QuZW1pdChhY2NlcHRlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVqZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZVNlbGVjdFJlamVjdC5lbWl0KHJlamVjdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RHJvcEFyZWFPcHRpb25zKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kcm9wQXJlYSkge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnM6IElGaWxlRHJvcEFyZWFPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5kcm9wQXJlYS5vcHRpb25zIHx8IHt9KTtcbiAgICAgICAgICAgIG9wdGlvbnMuYWNjZXB0ID0gdGhpcy5fYWNjZXB0O1xuICAgICAgICAgICAgb3B0aW9ucy5kaXNhYmxlZCA9IHRoaXMuX2Rpc2FibGVkO1xuICAgICAgICAgICAgb3B0aW9ucy5tdWx0aXBsZSA9IHRoaXMuX211bHRpcGxlO1xuICAgICAgICAgICAgdGhpcy5kcm9wQXJlYS5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJoaWRkZW4tZmlsZS13cmFwcGVyXCI+XG4gICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgY2xhc3M9XCJoaWRkZW4tZmlsZS1pbnB1dFwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICBbYWNjZXB0XT1cImlucHV0QWNjZXB0XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQsIGZpbGVJbnB1dClcIlxuICAgICAgICAjZmlsZUlucHV0XG4gICAgLz5cbjwvZGl2PlxuPGd0eC1idXR0b24gKGNsaWNrKT1cIiFkaXNhYmxlZCAmJiBmaWxlSW5wdXQuY2xpY2soKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbc2l6ZV09XCJzaXplXCIgW2ljb25dPVwiaWNvblwiXG4gICAgICAgICAgICBbdHlwZV09XCJkcm9wQXJlYT8ucGFnZURyYWdIb3ZlcmVkID8gJ3N1Y2Nlc3MnIDogdHlwZVwiXG4gICAgICAgICAgICBbZmxhdF09XCJmbGF0IHx8IGRyb3BBcmVhPy5kcmFnSG92ZXJlZFwiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZ3R4LWJ1dHRvbj5cbiJdfQ==