UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

295 lines 23.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { AkitaPlugin } from '../plugin'; import { debounceTime } from 'rxjs/operators'; import { getValue } from '../../getValueByString'; import { toBoolean } from '../../toBoolean'; import { isString } from '../../isString'; import { setValue } from '../../setValueByString'; import { logAction } from '../../actions'; // Todo: Return AbstractControl interface /** * @template T */ var // Todo: Return AbstractControl interface /** * @template T */ PersistNgFormPlugin = /** @class */ (function (_super) { tslib_1.__extends(PersistNgFormPlugin, _super); function PersistNgFormPlugin(query, factoryFnOrPath, params) { if (params === void 0) { params = {}; } var _this = _super.call(this, query) || this; _this.query = query; _this.factoryFnOrPath = factoryFnOrPath; _this.params = params; _this.params = tslib_1.__assign({ debounceTime: 300, formKey: 'akitaForm', emitEvent: false, arrControlFactory: (/** * @param {?} v * @return {?} */ function (v) { return _this.builder.control(v); }) }, params); _this.isRootKeys = toBoolean(factoryFnOrPath) === false; _this.isKeyBased = isString(factoryFnOrPath) || _this.isRootKeys; return _this; } /** * @template THIS * @this {THIS} * @param {?} form * @param {?=} builder * @return {THIS} */ PersistNgFormPlugin.prototype.setForm = /** * @template THIS * @this {THIS} * @param {?} form * @param {?=} builder * @return {THIS} */ function (form, builder) { (/** @type {?} */ (this)).form = form; (/** @type {?} */ (this)).builder = builder; (/** @type {?} */ (this)).activate(); return (/** @type {?} */ (this)); }; /** * @param {?=} initialState * @return {?} */ PersistNgFormPlugin.prototype.reset = /** * @param {?=} initialState * @return {?} */ function (initialState) { var _this = this; var _a; /** @type {?} */ var value; if (initialState) { value = initialState; } else { value = this.isKeyBased ? this.initialValue : ((/** @type {?} */ (this))).factoryFnOrPath(); } if (this.isKeyBased) { Object.keys(this.initialValue).forEach((/** * @param {?} stateKey * @return {?} */ function (stateKey) { /** @type {?} */ var value = _this.initialValue[stateKey]; if (Array.isArray(value) && _this.builder) { /** @type {?} */ var formArray = _this.form.controls[stateKey]; _this.cleanArray(formArray); value.forEach((/** * @param {?} v * @param {?} i * @return {?} */ function (v, i) { _this.form.get(stateKey).insert(i, ((/** @type {?} */ (_this.params.arrControlFactory)))(v)); })); } })); } this.form.patchValue(value, { emitEvent: this.params.emitEvent }); /** @type {?} */ var storeValue = this.isKeyBased ? setValue(this.getQuery().getValue(), this.getStore().storeName + "." + this.factoryFnOrPath, value) : (_a = {}, _a[this.params.formKey] = value, _a); this.updateStore(storeValue); }; /** * @private * @param {?} control * @return {?} */ PersistNgFormPlugin.prototype.cleanArray = /** * @private * @param {?} control * @return {?} */ function (control) { while (control.length !== 0) { control.removeAt(0); } }; /** * @private * @param {?} formValue * @param {?} root * @return {?} */ PersistNgFormPlugin.prototype.resolveInitialValue = /** * @private * @param {?} formValue * @param {?} root * @return {?} */ function (formValue, root) { var _this = this; if (!formValue) return; return Object.keys(formValue).reduce((/** * @param {?} acc * @param {?} stateKey * @return {?} */ function (acc, stateKey) { /** @type {?} */ var value = root[stateKey]; if (Array.isArray(value) && _this.builder) { /** @type {?} */ var factory_1 = _this.params.arrControlFactory; _this.cleanArray(_this.form.get(stateKey)); value.forEach((/** * @param {?} v * @param {?} i * @return {?} */ function (v, i) { _this.form.get(stateKey).insert(i, ((/** @type {?} */ (factory_1)))(v)); })); } acc[stateKey] = root[stateKey]; return acc; }), {}); }; /** * @private * @return {?} */ PersistNgFormPlugin.prototype.activate = /** * @private * @return {?} */ function () { var _this = this; var _a; /** @type {?} */ var path; if (this.isKeyBased) { if (this.isRootKeys) { this.initialValue = this.resolveInitialValue(this.form.value, this.getQuery().getValue()); this.form.patchValue(this.initialValue, { emitEvent: this.params.emitEvent }); } else { path = this.getStore().storeName + "." + this.factoryFnOrPath; /** @type {?} */ var root = getValue(this.getQuery().getValue(), path); this.initialValue = this.resolveInitialValue(root, root); this.form.patchValue(this.initialValue, { emitEvent: this.params.emitEvent }); } } else { if (!((/** @type {?} */ (this.getQuery().getValue())))[this.params.formKey]) { logAction('@PersistNgFormPlugin activate'); this.updateStore((_a = {}, _a[this.params.formKey] = ((/** @type {?} */ (this))).factoryFnOrPath(), _a)); } /** @type {?} */ var value = this.getQuery().getValue()[this.params.formKey]; this.form.patchValue(value); } this.formChanges = this.form.valueChanges.pipe(debounceTime(this.params.debounceTime)).subscribe((/** * @param {?} value * @return {?} */ function (value) { logAction('@PersistForm - Update'); /** @type {?} */ var newState; if (_this.isKeyBased) { if (_this.isRootKeys) { newState = (/** * @param {?} state * @return {?} */ function (state) { return (tslib_1.__assign({}, state, value)); }); } else { newState = (/** * @param {?} state * @return {?} */ function (state) { return setValue(state, path, value); }); } } else { newState = (/** * @return {?} */ function () { var _a; return (_a = {}, _a[_this.params.formKey] = value, _a); }); } _this.updateStore(newState(_this.getQuery().getValue())); })); }; /** * @return {?} */ PersistNgFormPlugin.prototype.destroy = /** * @return {?} */ function () { this.formChanges && this.formChanges.unsubscribe(); this.form = null; this.builder = null; }; return PersistNgFormPlugin; }(AkitaPlugin)); // Todo: Return AbstractControl interface /** * @template T */ export { PersistNgFormPlugin }; if (false) { /** @type {?} */ PersistNgFormPlugin.prototype.formChanges; /** * @type {?} * @private */ PersistNgFormPlugin.prototype.isRootKeys; /** * @type {?} * @private */ PersistNgFormPlugin.prototype.form; /** * @type {?} * @private */ PersistNgFormPlugin.prototype.isKeyBased; /** * @type {?} * @private */ PersistNgFormPlugin.prototype.initialValue; /** * @type {?} * @private */ PersistNgFormPlugin.prototype.builder; /** * @type {?} * @protected */ PersistNgFormPlugin.prototype.query; /** * @type {?} * @private */ PersistNgFormPlugin.prototype.factoryFnOrPath; /** * @type {?} * @private */ PersistNgFormPlugin.prototype.params; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdE5nRm9ybVBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BkYXRvcmFtYS9ha2l0YS8iLCJzb3VyY2VzIjpbInNyYy9wbHVnaW5zL3BlcnNpc3RGb3JtL3BlcnNpc3ROZ0Zvcm1QbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUF3QjFDOzs7Ozs7SUFBa0QsK0NBQVc7SUFRM0QsNkJBQXNCLEtBQWlCLEVBQVUsZUFBbUMsRUFBVSxNQUE4QjtRQUE5Qix1QkFBQSxFQUFBLFdBQThCO1FBQTVILFlBQ0Usa0JBQU0sS0FBSyxDQUFDLFNBSWI7UUFMcUIsV0FBSyxHQUFMLEtBQUssQ0FBWTtRQUFVLHFCQUFlLEdBQWYsZUFBZSxDQUFvQjtRQUFVLFlBQU0sR0FBTixNQUFNLENBQXdCO1FBRTFILEtBQUksQ0FBQyxNQUFNLG9CQUFRLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCOzs7O1lBQUUsVUFBQSxDQUFDLElBQUksT0FBQSxLQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBdkIsQ0FBdUIsQ0FBQSxFQUFFLEVBQUssTUFBTSxDQUFFLENBQUM7UUFDL0ksS0FBSSxDQUFDLFVBQVUs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Ozs7O0lBQ3JCLHNDQUFnQjs7Ozs7SUFFSixvQ0FBMkI7Ozs7O0lBQUUsOENBQTJDOzs7OztJQUFFLHFDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFraXRhUGx1Z2luIH0gZnJvbSAnLi4vcGx1Z2luJztcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi4vLi4vcXVlcnknO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBnZXRWYWx1ZSB9IGZyb20gJy4uLy4uL2dldFZhbHVlQnlTdHJpbmcnO1xuaW1wb3J0IHsgdG9Cb29sZWFuIH0gZnJvbSAnLi4vLi4vdG9Cb29sZWFuJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi4vLi4vaXNTdHJpbmcnO1xuaW1wb3J0IHsgc2V0VmFsdWUgfSBmcm9tICcuLi8uLi9zZXRWYWx1ZUJ5U3RyaW5nJztcbmltcG9ydCB7IGxvZ0FjdGlvbiB9IGZyb20gJy4uLy4uL2FjdGlvbnMnO1xuXG5leHBvcnQgdHlwZSBGb3JtR3JvdXBMaWtlID0ge1xuICBwYXRjaFZhbHVlOiBGdW5jdGlvbjtcbiAgc2V0VmFsdWU6IEZ1bmN0aW9uO1xuICB2YWx1ZTogYW55O1xuICBnZXQ6IEZ1bmN0aW9uO1xuICB2YWx1ZUNoYW5nZXM6IE9ic2VydmFibGU8YW55PjtcbiAgY29udHJvbHM6IGFueTtcbn07XG5cbmV4cG9ydCB0eXBlIEFraXRhRm9ybVByb3A8VD4gPSB7XG4gIFtrZXk6IHN0cmluZ106IFQ7XG59O1xuXG5leHBvcnQgdHlwZSBQZXJzaXN0Rm9ybVBhcmFtcyA9IHtcbiAgZGVib3VuY2VUaW1lPzogbnVtYmVyO1xuICBmb3JtS2V5Pzogc3RyaW5nO1xuICBlbWl0RXZlbnQ/OiBib29sZWFuO1xuICBhcnJDb250cm9sRmFjdG9yeT86IEFycmF5Q29udHJvbEZhY3Rvcnk7XG59O1xuXG5leHBvcnQgdHlwZSBBcnJheUNvbnRyb2xGYWN0b3J5ID0gKHZhbHVlOiBhbnkpID0+IGFueTsgLy8gVG9kbzogUmV0dXJuICBBYnN0cmFjdENvbnRyb2wgaW50ZXJmYWNlXG5cbmV4cG9ydCBjbGFzcyBQZXJzaXN0TmdGb3JtUGx1Z2luPFQgPSBhbnk+IGV4dGVuZHMgQWtpdGFQbHVnaW4ge1xuICBmb3JtQ2hhbmdlczogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGlzUm9vdEtleXM6IGJvb2xlYW47XG4gIHByaXZhdGUgZm9ybTogRm9ybUdyb3VwTGlrZTtcbiAgcHJpdmF0ZSBpc0tleUJhc2VkOiBib29sZWFuO1xuICBwcml2YXRlIGluaXRpYWxWYWx1ZTtcbiAgcHJpdmF0ZSBidWlsZGVyO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBxdWVyeTogUXVlcnk8YW55PiwgcHJpdmF0ZSBmYWN0b3J5Rm5PclBhdGg/OiBGdW5jdGlvbiB8IHN0cmluZywgcHJpdmF0ZSBwYXJhbXM6IFBlcnNpc3RGb3JtUGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihxdWVyeSk7XG4gICAgdGhpcy5wYXJhbXMgPSB7IC4uLnsgZGVib3VuY2VUaW1lOiAzMDAsIGZvcm1LZXk6ICdha2l0YUZvcm0nLCBlbWl0RXZlbnQ6IGZhbHNlLCBhcnJDb250cm9sRmFjdG9yeTogdiA9PiB0aGlzLmJ1aWxkZXIuY29udHJvbCh2KSB9LCAuLi5wYXJhbXMgfTtcbiAgICB0aGlzLmlzUm9vdEtleXMgPSB0b0Jvb2xlYW4oZmFjdG9yeUZuT3JQYXRoKSA9PT0gZmFsc2U7XG4gICAgdGhpcy5pc0tleUJhc2VkID0gaXNTdHJpbmcoZmFjdG9yeUZuT3JQYXRoKSB8fCB0aGlzLmlzUm9vdEtleXM7XG4gIH1cblxuICBzZXRGb3JtKGZvcm06IEZvcm1Hcm91cExpa2UsIGJ1aWxkZXI/KSB7XG4gICAgdGhpcy5mb3JtID0gZm9ybTtcbiAgICB0aGlzLmJ1aWxkZXIgPSBidWlsZGVyO1xuICAgIHRoaXMuYWN0aXZhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHJlc2V0KGluaXRpYWxTdGF0ZT86IFQpIHtcbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKGluaXRpYWxTdGF0ZSkge1xuICAgICAgdmFsdWUgPSBpbml0aWFsU3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdGhpcy5pc0tleUJhc2VkID8gdGhpcy5pbml0aWFsVmFsdWUgOiAodGhpcyBhcyBhbnkpLmZhY3RvcnlGbk9yUGF0aCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzS2V5QmFzZWQpIHtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuaW5pdGlhbFZhbHVlKS5mb3JFYWNoKHN0YXRlS2V5ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmluaXRpYWxWYWx1ZVtzdGF0ZUtleV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB0aGlzLmJ1aWxkZXIpIHtcbiAgICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZvcm0uY29udHJvbHNbc3RhdGVLZXldO1xuICAgICAgICAgIHRoaXMuY2xlYW5BcnJheShmb3JtQXJyYXkpO1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goKHYsIGkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoc3RhdGVLZXkpLmluc2VydChpLCAodGhpcy5wYXJhbXMuYXJyQ29udHJvbEZhY3RvcnkgYXMgRnVuY3Rpb24pKHYpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogdGhpcy5wYXJhbXMuZW1pdEV2ZW50IH0pO1xuXG4gICAgY29uc3Qgc3RvcmVWYWx1ZSA9IHRoaXMuaXNLZXlCYXNlZCA/IHNldFZhbHVlKHRoaXMuZ2V0UXVlcnkoKS5nZXRWYWx1ZSgpLCBgJHt0aGlzLmdldFN0b3JlKCkuc3RvcmVOYW1lfS4ke3RoaXMuZmFjdG9yeUZuT3JQYXRofWAsIHZhbHVlKSA6IHsgW3RoaXMucGFyYW1zLmZvcm1LZXldOiB2YWx1ZSB9O1xuICAgIHRoaXMudXBkYXRlU3RvcmUoc3RvcmVWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFuQXJyYXkoY29udHJvbCkge1xuICAgIHdoaWxlIChjb250cm9sLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29udHJvbC5yZW1vdmVBdCgwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVJbml0aWFsVmFsdWUoZm9ybVZhbHVlLCByb290KSB7XG4gICAgaWYgKCFmb3JtVmFsdWUpIHJldHVybjtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZm9ybVZhbHVlKS5yZWR1Y2UoKGFjYywgc3RhdGVLZXkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcm9vdFtzdGF0ZUtleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdGhpcy5idWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLnBhcmFtcy5hcnJDb250cm9sRmFjdG9yeTtcbiAgICAgICAgdGhpcy5jbGVhbkFycmF5KHRoaXMuZm9ybS5nZXQoc3RhdGVLZXkpKTtcbiAgICAgICAgdmFsdWUuZm9yRWFjaCgodiwgaSkgPT4ge1xuICAgICAgICAgIHRoaXMuZm9ybS5nZXQoc3RhdGVLZXkpLmluc2VydChpLCAoZmFjdG9yeSBhcyBGdW5jdGlvbikodikpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGFjY1tzdGF0ZUtleV0gPSByb290W3N0YXRlS2V5XTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuICB9XG5cbiAgcHJpdmF0ZSBhY3RpdmF0ZSgpIHtcbiAgICBsZXQgcGF0aDtcblxuICAgIGlmICh0aGlzLmlzS2V5QmFzZWQpIHtcbiAgICAgIGlmICh0aGlzLmlzUm9vdEtleXMpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWUgPSB0aGlzLnJlc29sdmVJbml0aWFsVmFsdWUodGhpcy5mb3JtLnZhbHVlLCB0aGlzLmdldFF1ZXJ5KCkuZ2V0VmFsdWUoKSk7XG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMuaW5pdGlhbFZhbHVlLCB7IGVtaXRFdmVudDogdGhpcy5wYXJhbXMuZW1pdEV2ZW50IH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0aCA9IGAke3RoaXMuZ2V0U3RvcmUoKS5zdG9yZU5hbWV9LiR7dGhpcy5mYWN0b3J5Rm5PclBhdGh9YDtcbiAgICAgICAgY29uc3Qgcm9vdCA9IGdldFZhbHVlKHRoaXMuZ2V0UXVlcnkoKS5nZXRWYWx1ZSgpLCBwYXRoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWUgPSB0aGlzLnJlc29sdmVJbml0aWFsVmFsdWUocm9vdCwgcm9vdCk7XG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMuaW5pdGlhbFZhbHVlLCB7IGVtaXRFdmVudDogdGhpcy5wYXJhbXMuZW1pdEV2ZW50IH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoISh0aGlzLmdldFF1ZXJ5KCkuZ2V0VmFsdWUoKSBhcyBBa2l0YUZvcm1Qcm9wPFQ+KVt0aGlzLnBhcmFtcy5mb3JtS2V5XSkge1xuICAgICAgICBsb2dBY3Rpb24oJ0BQZXJzaXN0TmdGb3JtUGx1Z2luIGFjdGl2YXRlJyk7XG4gICAgICAgIHRoaXMudXBkYXRlU3RvcmUoeyBbdGhpcy5wYXJhbXMuZm9ybUtleV06ICh0aGlzIGFzIGFueSkuZmFjdG9yeUZuT3JQYXRoKCkgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRRdWVyeSgpLmdldFZhbHVlKClbdGhpcy5wYXJhbXMuZm9ybUtleV07XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtQ2hhbmdlcyA9IHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUodGhpcy5wYXJhbXMuZGVib3VuY2VUaW1lKSkuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgIGxvZ0FjdGlvbignQFBlcnNpc3RGb3JtIC0gVXBkYXRlJyk7XG4gICAgICBsZXQgbmV3U3RhdGU7XG4gICAgICBpZiAodGhpcy5pc0tleUJhc2VkKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUm9vdEtleXMpIHtcbiAgICAgICAgICBuZXdTdGF0ZSA9IHN0YXRlID0+ICh7IC4uLnN0YXRlLCAuLi52YWx1ZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdTdGF0ZSA9IHN0YXRlID0+IHNldFZhbHVlKHN0YXRlLCBwYXRoLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1N0YXRlID0gKCkgPT4gKHsgW3RoaXMucGFyYW1zLmZvcm1LZXldOiB2YWx1ZSB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlU3RvcmUobmV3U3RhdGUodGhpcy5nZXRRdWVyeSgpLmdldFZhbHVlKCkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5mb3JtQ2hhbmdlcyAmJiB0aGlzLmZvcm1DaGFuZ2VzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5mb3JtID0gbnVsbDtcbiAgICB0aGlzLmJ1aWxkZXIgPSBudWxsO1xuICB9XG59XG4iXX0=