UNPKG

@kushki/ng-suka

Version:

<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>

305 lines 20.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, Output, ViewChild, EventEmitter, HostBinding } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; /** @type {?} */ var noop = (/** * @return {?} */ function () { }); var ɵ0 = noop; var FileUploader = /** @class */ (function () { function FileUploader() { /** * Accessible text for the button that opens the upload window. * * Defaults to the `FILE_UPLOADER.OPEN` value from the i18n service */ this.buttonText = 'Agregar archivo(s)'; /** * Type set for button */ this.buttonType = 'basic'; /** * Specify the types of files that the input should be able to receive */ this.accept = []; /** * Set to `false` to tell the component to only accept a single file on upload. * * Defaults to `true`. Accepts multiple files. */ this.multiple = true; /** * Set to `true` for a loading file uploader. */ this.skeleton = false; /** * Provides a unique id for the underlying <input> node */ this.fileUploaderId = "file-uploader-" + FileUploader.fileUploaderCount; /** * The list of files that have been submitted to be uploaded */ this.files = new Set(); this.filesChange = new EventEmitter(); this.baseClass = true; this.onTouchedCallback = noop; this.onChangeCallback = noop; FileUploader.fileUploaderCount++; } Object.defineProperty(FileUploader.prototype, "value", { /** * Specifies the property to be used as the return value to `ngModel` */ get: /** * Specifies the property to be used as the return value to `ngModel` * @return {?} */ function () { return this.files; }, set: /** * @param {?} v * @return {?} */ function (v) { if (v !== this.files) { this.files = v; this.onChangeCallback(v); } }, enumerable: true, configurable: true }); /** * @return {?} */ FileUploader.prototype.onBlur = /** * @return {?} */ function () { this.onTouchedCallback(); }; /** * Propagates the injected `value`. */ /** * Propagates the injected `value`. * @param {?} value * @return {?} */ FileUploader.prototype.writeValue = /** * Propagates the injected `value`. * @param {?} value * @return {?} */ function (value) { if (value !== this.value) { this.files = value; } }; /** * @return {?} */ FileUploader.prototype.onFilesAdded = /** * @return {?} */ function () { var e_1, _a; /** @type {?} */ var files = this.fileInput.nativeElement.files; if (!this.multiple) { this.files.clear(); } try { for (var files_1 = tslib_1.__values(files), files_1_1 = files_1.next(); !files_1_1.done; files_1_1 = files_1.next()) { var file = files_1_1.value; /** @type {?} */ var fileItem = { file: file, uploaded: false, state: 'edit', invalid: false, invalidText: '', }; this.files.add(fileItem); this.filesChange.emit(this.files); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (files_1_1 && !files_1_1.done && (_a = files_1.return)) _a.call(files_1); } finally { if (e_1) throw e_1.error; } } this.value = this.files; }; /** * @param {?} fileItem * @return {?} */ FileUploader.prototype.removeFile = /** * @param {?} fileItem * @return {?} */ function (fileItem) { this.files.delete(fileItem); this.fileInput.nativeElement.value = ''; this.filesChange.emit(this.files); }; /** * Registers the injected function to control the touch use of the `FileUploader`. */ /** * Registers the injected function to control the touch use of the `FileUploader`. * @param {?} fn * @return {?} */ FileUploader.prototype.registerOnTouched = /** * Registers the injected function to control the touch use of the `FileUploader`. * @param {?} fn * @return {?} */ function (fn) { this.onTouchedCallback = fn; }; /** * Sets a method in order to propagate changes back to the form. */ /** * Sets a method in order to propagate changes back to the form. * @param {?} fn * @return {?} */ FileUploader.prototype.registerOnChange = /** * Sets a method in order to propagate changes back to the form. * @param {?} fn * @return {?} */ function (fn) { this.onChangeCallback = fn; }; /** * Counter used to create unique ids for file-uploader components */ FileUploader.fileUploaderCount = 0; FileUploader.decorators = [ { type: Component, args: [{ selector: 'suka-file-uploader', template: "\n <ng-container *ngIf=\"!skeleton; else skeletonTemplate\">\n <label class=\"label\">{{title}}</label>\n <div *ngIf=\"description\" class=\"form__helper-text\">{{description}}</div>\n <div class=\"file\">\n <button\n type=\"button\"\n [sukaButton]=\"buttonType\"\n (click)=\"fileInput.click()\"\n [attr.for]=\"fileUploaderId\"\n [size]=\"size\">\n {{buttonText}}\n </button>\n <input\n #fileInput\n type=\"file\"\n class=\"file-input\"\n [accept]=\"accept\"\n [id]=\"fileUploaderId\"\n [multiple]=\"multiple\"\n tabindex=\"-1\"\n (change)=\"onFilesAdded()\"/>\n <div class=\"file-container\">\n <div *ngFor=\"let fileItem of files\">\n <suka-file [fileItem]=\"fileItem\" (remove)=\"removeFile(fileItem)\"></suka-file>\n <div *ngIf=\"fileItem.invalid\" class=\"form-requirement\">\n {{fileItem.invalidText}}\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #skeletonTemplate>\n <div class=\"skeleton__text\" style=\"width: 100px\"></div>\n <div class=\"skeleton__text\" style=\"width: 225px\"></div>\n <button sukaButton skeleton=\"true\"></button>\n </ng-template>\n ", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: FileUploader, multi: true } ] }] } ]; /** @nocollapse */ FileUploader.ctorParameters = function () { return []; }; FileUploader.propDecorators = { buttonText: [{ type: Input }], buttonType: [{ type: Input }], title: [{ type: Input }], description: [{ type: Input }], accept: [{ type: Input }], multiple: [{ type: Input }], skeleton: [{ type: Input }], size: [{ type: Input }], fileUploaderId: [{ type: Input }], fileInput: [{ type: ViewChild, args: ['fileInput', { static: false },] }], files: [{ type: Input }], filesChange: [{ type: Output }], baseClass: [{ type: HostBinding, args: ['class.file-uploader',] }] }; return FileUploader; }()); export { FileUploader }; if (false) { /** * Counter used to create unique ids for file-uploader components * @type {?} */ FileUploader.fileUploaderCount; /** * Accessible text for the button that opens the upload window. * * Defaults to the `FILE_UPLOADER.OPEN` value from the i18n service * @type {?} */ FileUploader.prototype.buttonText; /** * Type set for button * @type {?} */ FileUploader.prototype.buttonType; /** * Text set to the title * @type {?} */ FileUploader.prototype.title; /** * Text set to the description * @type {?} */ FileUploader.prototype.description; /** * Specify the types of files that the input should be able to receive * @type {?} */ FileUploader.prototype.accept; /** * Set to `false` to tell the component to only accept a single file on upload. * * Defaults to `true`. Accepts multiple files. * @type {?} */ FileUploader.prototype.multiple; /** * Set to `true` for a loading file uploader. * @type {?} */ FileUploader.prototype.skeleton; /** * Sets the size of the button. * @type {?} */ FileUploader.prototype.size; /** * Provides a unique id for the underlying <input> node * @type {?} */ FileUploader.prototype.fileUploaderId; /** * Maintains a reference to the view DOM element of the underlying <input> node * @type {?} */ FileUploader.prototype.fileInput; /** * The list of files that have been submitted to be uploaded * @type {?} */ FileUploader.prototype.files; /** @type {?} */ FileUploader.prototype.filesChange; /** @type {?} */ FileUploader.prototype.baseClass; /** * @type {?} * @protected */ FileUploader.prototype.onTouchedCallback; /** * @type {?} * @protected */ FileUploader.prototype.onChangeCallback; } export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3VzaGtpL25nLXN1a2EvIiwic291cmNlcyI6WyJsaWIvZmlsZS11cGxvYWRlci9maWxlLXVwbG9hZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7SUFJN0MsSUFBSTs7O0FBQUcsY0FBTyxDQUFDLENBQUE7O0FBRXJCO0lBNkdFOzs7Ozs7UUFuRFMsZUFBVSxHQUFHLG9CQUFvQixDQUFDOzs7O1FBSWxDLGVBQVUsR0FBb0UsT0FBTyxDQUFDOzs7O1FBWXRGLFdBQU0sR0FBRyxFQUFFLENBQUM7Ozs7OztRQU1aLGFBQVEsR0FBRyxJQUFJLENBQUM7Ozs7UUFJaEIsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQVFqQixtQkFBYyxHQUFHLG1CQUFpQixZQUFZLENBQUMsaUJBQW1CLENBQUM7Ozs7UUFRbkUsVUFBSyxHQUFHLElBQUksR0FBRyxFQUFZLENBQUM7UUFFM0IsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRVosY0FBUyxHQUFHLElBQUksQ0FBQztRQUUzQyxzQkFBaUIsR0FBZSxJQUFJLENBQUM7UUFDckMscUJBQWdCLEdBQStCLElBQUksQ0FBQztRQUc1RCxZQUFZLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBS0Qsc0JBQUksK0JBQUs7UUFIVDs7V0FFRzs7Ozs7UUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDOzs7OztRQUNELFVBQVUsQ0FBZ0I7WUFDeEIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFD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Ozs7Ozs7SUFNckIsZ0NBQXlCOzs7OztJQUl6QixnQ0FBMEI7Ozs7O0lBSTFCLDRCQUErQjs7Ozs7SUFJL0Isc0NBQTRFOzs7OztJQUk1RSxpQ0FBbUQ7Ozs7O0lBSW5ELDZCQUFxQzs7SUFFckMsbUNBQWdEOztJQUVoRCxpQ0FBcUQ7Ozs7O0lBRXJELHlDQUErQzs7Ozs7SUFDL0Msd0NBQThEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmdcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgRmlsZUl0ZW0gfSBmcm9tICcuL2ZpbGUtaXRlbS5pbnRlcmZhY2UnO1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtZmlsZS11cGxvYWRlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbjsgZWxzZSBza2VsZXRvblRlbXBsYXRlXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiPnt7dGl0bGV9fTwvbGFiZWw+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBjbGFzcz1cImZvcm1fX2hlbHBlci10ZXh0XCI+e3tkZXNjcmlwdGlvbn19PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW3N1a2FCdXR0b25dPVwiYnV0dG9uVHlwZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCJcbiAgICAgICAgICBbYXR0ci5mb3JdPVwiZmlsZVVwbG9hZGVySWRcIlxuICAgICAgICAgIFtzaXplXT1cInNpemVcIj5cbiAgICAgICAgICB7e2J1dHRvblRleHR9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI2ZpbGVJbnB1dFxuICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICBjbGFzcz1cImZpbGUtaW5wdXRcIlxuICAgICAgICAgIFthY2NlcHRdPVwiYWNjZXB0XCJcbiAgICAgICAgICBbaWRdPVwiZmlsZVVwbG9hZGVySWRcIlxuICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVzQWRkZWQoKVwiLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmlsZUl0ZW0gb2YgZmlsZXNcIj5cbiAgICAgICAgICAgIDxzdWthLWZpbGUgW2ZpbGVJdGVtXT1cImZpbGVJdGVtXCIgKHJlbW92ZSk9XCJyZW1vdmVGaWxlKGZpbGVJdGVtKVwiPjwvc3VrYS1maWxlPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbGVJdGVtLmludmFsaWRcIiBjbGFzcz1cImZvcm0tcmVxdWlyZW1lbnRcIj5cbiAgICAgICAgICAgICAge3tmaWxlSXRlbS5pbnZhbGlkVGV4dH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3NrZWxldG9uVGVtcGxhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b25fX3RleHRcIiBzdHlsZT1cIndpZHRoOiAxMDBweFwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uX190ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMjI1cHhcIj48L2Rpdj5cbiAgICAgIDxidXR0b24gc3VrYUJ1dHRvbiBza2VsZXRvbj1cInRydWVcIj48L2J1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBGaWxlVXBsb2FkZXIsXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBGaWxlVXBsb2FkZXIge1xuICAvKipcbiAgICogQ291bnRlciB1c2VkIHRvIGNyZWF0ZSB1bmlxdWUgaWRzIGZvciBmaWxlLXVwbG9hZGVyIGNvbXBvbmVudHNcbiAgICovXG4gIHN0YXRpYyBmaWxlVXBsb2FkZXJDb3VudCA9IDA7XG4gIC8qKlxuICAgKiBBY2Nlc3NpYmxlIHRleHQgZm9yIHRoZSBidXR0b24gdGhhdCBvcGVucyB0aGUgdXBsb2FkIHdpbmRvdy5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIGBGSUxFX1VQTE9BREVSLk9QRU5gIHZhbHVlIGZyb20gdGhlIGkxOG4gc2VydmljZVxuICAgKi9cbiAgQElucHV0KCkgYnV0dG9uVGV4dCA9ICdBZ3JlZ2FyIGFyY2hpdm8ocyknO1xuICAvKipcbiAgICogVHlwZSBzZXQgZm9yIGJ1dHRvblxuICAgKi9cbiAgQElucHV0KCkgYnV0dG9uVHlwZTogJ3ByaW1hcnknIHwgJ2Jhc2ljJyB8ICdwbGFpbicgfCAnZGVzdHJ1Y3RpdmUnIHwgJ291dGxpbmVfd2hpdGUnID0gJ2Jhc2ljJztcbiAgLyoqXG4gICAqIFRleHQgc2V0IHRvIHRoZSB0aXRsZVxuICAgKi9cbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRleHQgc2V0IHRvIHRoZSBkZXNjcmlwdGlvblxuICAgKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHR5cGVzIG9mIGZpbGVzIHRoYXQgdGhlIGlucHV0IHNob3VsZCBiZSBhYmxlIHRvIHJlY2VpdmVcbiAgICovXG4gIEBJbnB1dCgpIGFjY2VwdCA9IFtdO1xuICAvKipcbiAgICogU2V0IHRvIGBmYWxzZWAgdG8gdGVsbCB0aGUgY29tcG9uZW50IHRvIG9ubHkgYWNjZXB0IGEgc2luZ2xlIGZpbGUgb24gdXBsb2FkLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAuIEFjY2VwdHMgbXVsdGlwbGUgZmlsZXMuXG4gICAqL1xuICBASW5wdXQoKSBtdWx0aXBsZSA9IHRydWU7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIGxvYWRpbmcgZmlsZSB1cGxvYWRlci5cbiAgICovXG4gIEBJbnB1dCgpIHNrZWxldG9uID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBidXR0b24uXG4gICAqL1xuICBASW5wdXQoKSBzaXplOiAnc20nIHwgJ25vcm1hbCc7XG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIHVuaXF1ZSBpZCBmb3IgdGhlIHVuZGVybHlpbmcgPGlucHV0PiBub2RlXG4gICAqL1xuICBASW5wdXQoKSBmaWxlVXBsb2FkZXJJZCA9IGBmaWxlLXVwbG9hZGVyLSR7RmlsZVVwbG9hZGVyLmZpbGVVcGxvYWRlckNvdW50fWA7XG4gIC8qKlxuICAgKiBNYWludGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZpZXcgRE9NIGVsZW1lbnQgb2YgdGhlIHVuZGVybHlpbmcgPGlucHV0PiBub2RlXG4gICAqL1xuICBAVmlld0NoaWxkKCdmaWxlSW5wdXQnLCB7c3RhdGljOiBmYWxzZX0pIGZpbGVJbnB1dDtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHN1Ym1pdHRlZCB0byBiZSB1cGxvYWRlZFxuICAgKi9cbiAgQElucHV0KCkgZmlsZXMgPSBuZXcgU2V0PEZpbGVJdGVtPigpO1xuXG4gIEBPdXRwdXQoKSBmaWxlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmlsZS11cGxvYWRlcicpIGJhc2VDbGFzcyA9IHRydWU7XG5cbiAgcHJvdGVjdGVkIG9uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJvdGVjdGVkIG9uQ2hhbmdlQ2FsbGJhY2s6IChfOiBTZXQ8RmlsZUl0ZW0+KSA9PiB2b2lkID0gbm9vcDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBGaWxlVXBsb2FkZXIuZmlsZVVwbG9hZGVyQ291bnQrKztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHByb3BlcnR5IHRvIGJlIHVzZWQgYXMgdGhlIHJldHVybiB2YWx1ZSB0byBgbmdNb2RlbGBcbiAgICovXG4gIGdldCB2YWx1ZSgpOiBTZXQ8RmlsZUl0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5maWxlcztcbiAgfVxuICBzZXQgdmFsdWUodjogU2V0PEZpbGVJdGVtPikge1xuICAgIGlmICh2ICE9PSB0aGlzLmZpbGVzKSB7XG4gICAgICB0aGlzLmZpbGVzID0gdjtcbiAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh2KTtcbiAgICB9XG4gIH1cblxuICBvbkJsdXIoKSB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZXMgdGhlIGluamVjdGVkIGB2YWx1ZWAuXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBTZXQ8RmlsZUl0ZW0+KSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLmZpbGVzID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgb25GaWxlc0FkZGVkKCkge1xuICAgIGNvbnN0IGZpbGVzID0gdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC5maWxlcztcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuZmlsZXMuY2xlYXIoKTtcbiAgICB9XG4gICAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgICAgY29uc3QgZmlsZUl0ZW06IEZpbGVJdGVtID0ge1xuICAgICAgICBmaWxlLFxuICAgICAgICB1cGxvYWRlZDogZmFsc2UsXG4gICAgICAgIHN0YXRlOiAnZWRpdCcsXG4gICAgICAgIGludmFsaWQ6IGZhbHNlLFxuICAgICAgICBpbnZhbGlkVGV4dDogJycsXG4gICAgICB9O1xuICAgICAgdGhpcy5maWxlcy5hZGQoZmlsZUl0ZW0pO1xuICAgICAgdGhpcy5maWxlc0NoYW5nZS5lbWl0KHRoaXMuZmlsZXMpO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWUgPSB0aGlzLmZpbGVzO1xuICB9XG5cbiAgcmVtb3ZlRmlsZShmaWxlSXRlbSkge1xuICAgIHRoaXMuZmlsZXMuZGVsZXRlKGZpbGVJdGVtKTtcbiAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgdGhpcy5maWxlc0NoYW5nZS5lbWl0KHRoaXMuZmlsZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgaW5qZWN0ZWQgZnVuY3Rpb24gdG8gY29udHJvbCB0aGUgdG91Y2ggdXNlIG9mIHRoZSBgRmlsZVVwbG9hZGVyYC5cbiAgICovXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgYSBtZXRob2QgaW4gb3JkZXIgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG59XG4iXX0=