UNPKG

@firestitch/filter

Version:
553 lines 45.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { isEmpty, list as arrayList } from '@firestitch/common'; import { simpleFormat } from '@firestitch/date'; import { Alias, Model } from 'tsmodels'; import { Subject } from 'rxjs'; import { format, isDate, isValid } from 'date-fns'; import { clone, isObject } from 'lodash-es'; import { FsFilterConfigItem, ItemType } from './filter-item'; /** @type {?} */ export var SORT_BY_FIELD = 'system_sort_by'; /** @type {?} */ export var SORT_DIRECTION_FIELD = 'system_sort_direction'; var FsFilterConfig = /** @class */ (function (_super) { tslib_1.__extends(FsFilterConfig, _super); function FsFilterConfig(data) { if (data === void 0) { data = {}; } var _this = _super.call(this) || this; _this.load = true; _this.persist = false; _this.inline = false; _this.autofocus = false; _this.chips = false; _this.sortValues = null; _this.sort = null; _this.sortDirection = null; _this.queryParam = false; _this.namespace = 'filter'; _this.items = []; _this.sortByItem = null; _this.sortDirectionItem = null; _this.searchInput = null; _this.singleTextFilter = false; _this._filtersNames = []; _this._destroy$ = new Subject(); _this._fromJSON(data); return _this; } Object.defineProperty(FsFilterConfig.prototype, "destroy$", { get: /** * @return {?} */ function () { return this._destroy$.asObservable(); }, enumerable: true, configurable: true }); /** * @param {?} items * @param {?} route * @param {?} persists * @return {?} */ FsFilterConfig.prototype.initItems = /** * @param {?} items * @param {?} route * @param {?} persists * @return {?} */ function (items, route, persists) { var _this = this; if (items && Array.isArray(items)) { this.items = items.map((/** * @param {?} item * @return {?} */ function (item) { if (item && item.name && _this._filtersNames.indexOf(item.name) === -1) { _this._filtersNames.push(item.name); return new FsFilterConfigItem(item, _this, route, persists); } else { throw Error('Filter init error. Items name must be uniq.'); } })); } this.initSorting(route, persists); this.searchInput = this.items.find((/** * @param {?} item * @return {?} */ function (item) { return item.type === ItemType.Text; })); if (this.items.length === 1 && this.items[0].type === ItemType.Text) { this.singleTextFilter = true; } }; /** * @param {?} route * @param {?} persists * @return {?} */ FsFilterConfig.prototype.initSorting = /** * @param {?} route * @param {?} persists * @return {?} */ function (route, persists) { if (this.sortValues) { /** @type {?} */ var sortByItem = { name: SORT_BY_FIELD, type: ItemType.Select, label: 'Sort By', values: this.sortValues }; if (this.sort && this.sort.value) { sortByItem['default'] = this.sort.value; } this.sortByItem = new FsFilterConfigItem(sortByItem, this, route, persists); /** @type {?} */ var sortDirectionItem = { name: SORT_DIRECTION_FIELD, type: ItemType.Select, label: 'Sort Direction', values: [ { name: 'Ascending', value: 'asc' }, { name: 'Descending', value: 'desc' } ] }; if (this.sort && this.sort.direction) { sortDirectionItem['default'] = this.sort.direction; } this.sortDirectionItem = new FsFilterConfigItem(sortDirectionItem, this, route, persists); } }; /** * @return {?} */ FsFilterConfig.prototype.updateModelValues = /** * @return {?} */ function () { this.items.forEach((/** * @param {?} filter * @return {?} */ function (filter) { filter.model = clone(filter.tmpModel); })); if (this.sortByItem) { this.sortByItem.model = clone(this.sortByItem.tmpModel); } if (this.sortDirectionItem) { this.sortDirectionItem.model = clone(this.sortDirectionItem.tmpModel); } }; /** * @param {?=} opts * @return {?} */ FsFilterConfig.prototype.gets = /** * @param {?=} opts * @return {?} */ function (opts) { if (opts === void 0) { opts = {}; } var e_1, _a; /** @type {?} */ var query = {}; try { for (var _b = tslib_1.__values(this.items), _c = _b.next(); !_c.done; _c = _b.next()) { var filter = _c.value; /** @type {?} */ var value = clone(filter.model); if (filter.type == ItemType.Select) { if (filter.multiple) { if (filter.isolate) { if (!Array.isArray(filter.model) || !filter.model.length) { value = arrayList(filter.values, 'value'); } } if (filter.model && filter.model.indexOf('__all') > -1) { value = null; } } else { if (filter.isolate) { if (filter.model == '__all') { value = arrayList(filter.values, 'value'); } } else { if (filter.model == '__all') { value = null; } } } } else if (filter.type == ItemType.AutoCompleteChips || filter.type === ItemType.Chips) { if (Array.isArray(filter.model) && filter.model.length && !opts.expand) { value = arrayList(filter.model, 'value'); } } else if (filter.type == ItemType.Checkbox) { value = filter.model ? filter.checked : filter.unchecked; } // @TODO if (isEmpty(value, { zero: true })) { continue; } if (filter.type == ItemType.Date || filter.type == ItemType.DateTime) { if (value && isValid(value) && isDate(value)) { value = simpleFormat(value); } } else if (filter.type == ItemType.DateRange || filter.type == ItemType.DateTimeRange) { /** @type {?} */ var from = value.from; /** @type {?} */ var to = value.to; value = {}; if (from) { value.from = format(from, 'yyyy-MM-dd\THH:mm:ssxxxxx'); } if (to) { value.to = format(to, 'yyyy-MM-dd\THH:mm:ssxxxxx'); } } else if (filter.type == ItemType.AutoComplete) { if (isEmpty(filter.model.value, { zero: true })) { continue; } value = opts.expand ? filter.model : filter.model.value; } if (isObject(filter.names) && opts.names !== false) { for (var key in filter.names) { if (value[filter.names[key]]) { query[key] = value[filter.names[key]]; } } } else { query[filter.name] = value; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } if (opts.flatten) { for (var name_1 in query) { if (Array.isArray(query[name_1])) { query[name_1] = query[name_1].join(','); } } } return query; }; /** * @return {?} */ FsFilterConfig.prototype.getSort = /** * @return {?} */ function () { /** @type {?} */ var sortBy = this.getSortByValue(); sortBy = sortBy === '__all' ? null : sortBy; /** @type {?} */ var sortDirection = this.getSortDirectionValue(); sortDirection = sortDirection === '__all' ? null : sortDirection; return { value: sortBy, direction: sortDirection, }; }; /** * @return {?} */ FsFilterConfig.prototype.getSortByValue = /** * @return {?} */ function () { return this.sortByItem ? this.sortByItem.model : null; }; /** * @return {?} */ FsFilterConfig.prototype.getSortDirectionValue = /** * @return {?} */ function () { return this.sortDirectionItem ? this.sortDirectionItem.model : null; }; /** * @param {?} sort * @return {?} */ FsFilterConfig.prototype.updateSort = /** * @param {?} sort * @return {?} */ function (sort) { if (sort.sortBy) { this.sortByItem.model = sort.sortBy; } if (sort.sortDirection) { this.sortDirectionItem.model = sort.sortDirection; } }; /** * @return {?} */ FsFilterConfig.prototype.getFilledItems = /** * @return {?} */ function () { var _this = this; return this.items.reduce((/** * @param {?} acc * @param {?} filter * @return {?} */ function (acc, filter) { switch (filter.type) { case ItemType.Select: { /** @type {?} */ var multipleIsoldated = filter.multiple && filter.isolate && Array.isArray(filter.model) && !!filter.model.length && filter.model.indexOf('__all') === -1; /** @type {?} */ var multipleHasSelectedValues = filter.multiple && Array.isArray(filter.model) && filter.model.length && filter.model.indexOf('__all') === -1; /** @type {?} */ var selectedValues = !filter.multiple && filter.model && filter.model !== '__all'; if (multipleIsoldated || multipleHasSelectedValues || selectedValues) { acc.push(filter); } } break; case ItemType.AutoCompleteChips: { if (Array.isArray(filter.model) && filter.model.length) { acc.push(filter); } } break; case ItemType.Checkbox: { if (filter.model) { acc.push(filter); } } break; case ItemType.DateRange: case ItemType.DateTimeRange: { if (filter.model.from || filter.model.to) { acc.push(filter); } } break; default: { if (filter.model && filter !== _this.searchInput && (!isEmpty(filter.model, { zero: true }) || !isEmpty(filter.model.value, { zero: true }))) { acc.push(filter); } } } return acc; }), []); }; /** * @return {?} */ FsFilterConfig.prototype.filtersClear = /** * @return {?} */ function () { var e_2, _a; try { for (var _b = tslib_1.__values(this.items), _c = _b.next(); !_c.done; _c = _b.next()) { var filter = _c.value; filter.clear(); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_2) throw e_2.error; } } if (this.sortByItem) { if (this.sort) { this.sortByItem.model = this.sort.value; } else { this.sortByItem.clear(); } } if (this.sortDirectionItem) { if (this.sort) { this.sortDirectionItem.model = this.sort.direction; } else { this.sortDirectionItem.clear(); } } }; /** * @return {?} */ FsFilterConfig.prototype.loadValuesForPendingItems = /** * @return {?} */ function () { this.items .filter((/** * @param {?} item * @return {?} */ function (item) { return item.hasPendingValues; })) .forEach((/** * @param {?} item * @return {?} */ function (item) { return item.loadRemoteValues(); })); }; /** * @return {?} */ FsFilterConfig.prototype.destroy = /** * @return {?} */ function () { this._destroy$.next(); this._destroy$.complete(); }; tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "load", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "persist", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "inline", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "autofocus", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "chips", void 0); tslib_1.__decorate([ Alias('sorts'), tslib_1.__metadata("design:type", Array) ], FsFilterConfig.prototype, "sortValues", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "sort", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "sortDirection", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "queryParam", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "namespace", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "init", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "change", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "reload", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "sortChange", void 0); return FsFilterConfig; }(Model)); export { FsFilterConfig }; if (false) { /** @type {?} */ FsFilterConfig.prototype.load; /** @type {?} */ FsFilterConfig.prototype.persist; /** @type {?} */ FsFilterConfig.prototype.inline; /** @type {?} */ FsFilterConfig.prototype.autofocus; /** @type {?} */ FsFilterConfig.prototype.chips; /** @type {?} */ FsFilterConfig.prototype.sortValues; /** @type {?} */ FsFilterConfig.prototype.sort; /** @type {?} */ FsFilterConfig.prototype.sortDirection; /** @type {?} */ FsFilterConfig.prototype.queryParam; /** @type {?} */ FsFilterConfig.prototype.namespace; /** @type {?} */ FsFilterConfig.prototype.init; /** @type {?} */ FsFilterConfig.prototype.change; /** @type {?} */ FsFilterConfig.prototype.reload; /** @type {?} */ FsFilterConfig.prototype.sortChange; /** @type {?} */ FsFilterConfig.prototype.items; /** @type {?} */ FsFilterConfig.prototype.sortByItem; /** @type {?} */ FsFilterConfig.prototype.sortDirectionItem; /** @type {?} */ FsFilterConfig.prototype.searchInput; /** @type {?} */ FsFilterConfig.prototype.singleTextFilter; /** * @type {?} * @private */ FsFilterConfig.prototype._filtersNames; /** * @type {?} * @private */ FsFilterConfig.prototype._destroy$; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BmaXJlc3RpdGNoL2ZpbHRlci8iLCJzb3VyY2VzIjpbImFwcC9tb2RlbHMvZmlsdGVyLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV4QyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUU1QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUc3RCxNQUFNLEtBQU8sYUFBYSxHQUFHLGdCQUFnQjs7QUFDN0MsTUFBTSxLQUFPLG9CQUFvQixHQUFHLHVCQUF1QjtBQUUzRDtJQUFvQywwQ0FBSztJQTBCdkMsd0JBQVksSUFBYztRQUFkLHFCQUFBLEVBQUEsU0FBYztRQUExQixZQUNFLGlCQUFPLFNBR1I7UUE1QmUsVUFBSSxHQUFHLElBQUksQ0FBQztRQUNaLGFBQU8sR0FBUSxLQUFLLENBQUM7UUFDckIsWUFBTSxHQUFHLEtBQUssQ0FBQztRQUNmLGVBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsV0FBSyxHQUFHLEtBQUssQ0FBQztRQUNQLGdCQUFVLEdBQVUsSUFBSSxDQUFDO1FBQ2hDLFVBQUksR0FBUyxJQUFJLENBQUM7UUFDbEIsbUJBQWEsR0FBRyxJQUFJLENBQUM7UUFDckIsZ0JBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIs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S0FBSyxFQUFFOztxREFBNkI7SUFDNUI7UUFBUixLQUFLLEVBQUU7O2dEQUF1QjtJQUN0QjtRQUFSLEtBQUssRUFBRTs7a0RBQXlCO0lBQ3hCO1FBQVIsS0FBSyxFQUFFOztrREFBeUI7SUFDeEI7UUFBUixLQUFLLEVBQUU7O3NEQUE2QjtJQXNUdkMscUJBQUM7Q0FBQSxBQXJVRCxDQUFvQyxLQUFLLEdBcVV4QztTQXJVWSxjQUFjOzs7SUFFekIsOEJBQTRCOztJQUM1QixpQ0FBcUM7O0lBQ3JDLGdDQUErQjs7SUFDL0IsbUNBQWtDOztJQUNsQywrQkFBOEI7O0lBQzlCLG9DQUFnRDs7SUFDaEQsOEJBQWtDOztJQUNsQyx1Q0FBcUM7O0lBQ3JDLG9DQUFtQzs7SUFDbkMsbUNBQXFDOztJQUNyQyw4QkFBK0I7O0lBQy9CLGdDQUFpQzs7SUFDakMsZ0NBQWlDOztJQUNqQyxvQ0FBcUM7O0lBRXJDLCtCQUF3Qzs7SUFDeEMsb0NBQTZDOztJQUM3QywyQ0FBb0Q7O0lBQ3BELHFDQUEwQjs7SUFDMUIsMENBQWdDOzs7OztJQUVoQyx1Q0FBMkI7Ozs7O0lBQzNCLG1DQUF3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRW1wdHksIGxpc3QgYXMgYXJyYXlMaXN0IH0gZnJvbSAnQGZpcmVzdGl0Y2gvY29tbW9uJztcbmltcG9ydCB7IHNpbXBsZUZvcm1hdCB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGUnO1xuaW1wb3J0IHsgQWxpYXMsIE1vZGVsIH0gZnJvbSAndHNtb2RlbHMnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGZvcm1hdCwgaXNEYXRlLCBpc1ZhbGlkIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgY2xvbmUsIGlzT2JqZWN0IH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgRnNGaWx0ZXJDb25maWdJdGVtLCBJdGVtVHlwZSB9IGZyb20gJy4vZmlsdGVyLWl0ZW0nO1xuaW1wb3J0IHsgQ2hhbmdlRm4sIEZpbHRlclNvcnQsIFNvcnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZy5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY29uc3QgU09SVF9CWV9GSUVMRCA9ICdzeXN0ZW1fc29ydF9ieSc7XG5leHBvcnQgY29uc3QgU09SVF9ESVJFQ1RJT05fRklFTEQgPSAnc3lzdGVtX3NvcnRfZGlyZWN0aW9uJztcblxuZXhwb3J0IGNsYXNzIEZzRmlsdGVyQ29uZmlnIGV4dGVuZHMgTW9kZWwge1xuXG4gIEBBbGlhcygpIHB1YmxpYyBsb2FkID0gdHJ1ZTtcbiAgQEFsaWFzKCkgcHVibGljIHBlcnNpc3Q6IGFueSA9IGZhbHNlO1xuICBAQWxpYXMoKSBwdWJsaWMgaW5saW5lID0gZmFsc2U7XG4gIEBBbGlhcygpIHB1YmxpYyBhdXRvZm9jdXMgPSBmYWxzZTtcbiAgQEFsaWFzKCkgcHVibGljIGNoaXBzID0gZmFsc2U7XG4gIEBBbGlhcygnc29ydHMnKSBwdWJsaWMgc29ydFZhbHVlczogYW55W10gPSBudWxsO1xuICBAQWxpYXMoKSBwdWJsaWMgc29ydDogU29ydCA9IG51bGw7XG4gIEBBbGlhcygpIHB1YmxpYyBzb3J0RGlyZWN0aW9uID0gbnVsbDtcbiAgQEFsaWFzKCkgcHVibGljIHF1ZXJ5UGFyYW0gPSBmYWxzZTtcbiAgQEFsaWFzKCkgcHVibGljIG5hbWVzcGFjZSA9ICdmaWx0ZXInO1xuICBAQWxpYXMoKSBwdWJsaWMgaW5pdDogQ2hhbmdlRm47XG4gIEBBbGlhcygpIHB1YmxpYyBjaGFuZ2U6IENoYW5nZUZuO1xuICBAQWxpYXMoKSBwdWJsaWMgcmVsb2FkOiBDaGFuZ2VGbjtcbiAgQEFsaWFzKCkgcHVibGljIHNvcnRDaGFuZ2U6IENoYW5nZUZuO1xuXG4gIHB1YmxpYyBpdGVtczogRnNGaWx0ZXJDb25maWdJdGVtW10gPSBbXTtcbiAgcHVibGljIHNvcnRCeUl0ZW06IEZzRmlsdGVyQ29uZmlnSXRlbSA9IG51bGw7XG4gIHB1YmxpYyBzb3J0RGlyZWN0aW9uSXRlbTogRnNGaWx0ZXJDb25maWdJdGVtID0gbnVsbDtcbiAgcHVibGljIHNlYXJjaElucHV0ID0gbnVsbDtcbiAgcHVibGljIHNpbmdsZVRleHRGaWx0ZXIgPSBmYWxzZTtcblxuICBwcml2YXRlIF9maWx0ZXJzTmFtZXMgPSBbXTtcbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IGFueSA9IHt9KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2Zyb21KU09OKGRhdGEpO1xuICB9XG5cbiAgZ2V0IGRlc3Ryb3kkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kZXN0cm95JC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0SXRlbXMoaXRlbXMsIHJvdXRlLCBwZXJzaXN0cykge1xuICAgIGlmIChpdGVtcyAmJiBBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuXG4gICAgICB0aGlzLml0ZW1zID0gaXRlbXMubWFwKChpdGVtKSA9PiB7XG5cbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5uYW1lICYmIHRoaXMuX2ZpbHRlcnNOYW1lcy5pbmRleE9mKGl0ZW0ubmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyc05hbWVzLnB1c2goaXRlbS5uYW1lKTtcblxuICAgICAgICAgIHJldHVybiBuZXcgRnNGaWx0ZXJDb25maWdJdGVtKGl0ZW0sIHRoaXMsIHJvdXRlLCBwZXJzaXN0cylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignRmlsdGVyIGluaXQgZXJyb3IuIEl0ZW1zIG5hbWUgbXVzdCBiZSB1bmlxLicpXG4gICAgICAgIH1cblxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0U29ydGluZyhyb3V0ZSwgcGVyc2lzdHMpO1xuXG4gICAgdGhpcy5zZWFyY2hJbnB1dCA9IHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS50eXBlID09PSBJdGVtVHlwZS5UZXh0KTtcblxuICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMSAmJiB0aGlzLml0ZW1zWzBdLnR5cGUgPT09IEl0ZW1UeXBlLlRleHQpIHtcbiAgICAgIHRoaXMuc2luZ2xlVGV4dEZpbHRlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluaXRTb3J0aW5nKHJvdXRlLCBwZXJzaXN0cykge1xuICAgIGlmICh0aGlzLnNvcnRWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IHNvcnRCeUl0ZW0gPSB7XG4gICAgICAgIG5hbWU6IFNPUlRfQllfRklFTEQsXG4gICAgICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICAgICAgbGFiZWw6ICdTb3J0IEJ5JyxcbiAgICAgICAgdmFsdWVzOiB0aGlzLnNvcnRWYWx1ZXNcbiAgICAgIH07XG5cblxuICAgICAgaWYgKHRoaXMuc29ydCAmJiB0aGlzLnNvcnQudmFsdWUpIHtcbiAgICAgICAgc29ydEJ5SXRlbVsnZGVmYXVsdCddID0gdGhpcy5zb3J0LnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNvcnRCeUl0ZW0gPSBuZXcgRnNGaWx0ZXJDb25maWdJdGVtKHNvcnRCeUl0ZW0sIHRoaXMsIHJvdXRlLCBwZXJzaXN0cyk7XG5cbiAgICAgIGNvbnN0IHNvcnREaXJlY3Rpb25JdGVtID0ge1xuICAgICAgICBuYW1lOiBTT1JUX0RJUkVDVElPTl9GSUVMRCxcbiAgICAgICAgdHlwZTogSXRlbVR5cGUuU2VsZWN0LFxuICAgICAgICBsYWJlbDogJ1NvcnQgRGlyZWN0aW9uJyxcbiAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgeyBuYW1lOiAnQXNjZW5kaW5nJywgdmFsdWU6ICdhc2MnIH0sXG4gICAgICAgICAgeyBuYW1lOiAnRGVzY2VuZGluZycsIHZhbHVlOiAnZGVzYycgfVxuICAgICAgICBdXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5zb3J0ICYmIHRoaXMuc29ydC5kaXJlY3Rpb24pIHtcbiAgICAgICAgc29ydERpcmVjdGlvbkl0ZW1bJ2RlZmF1bHQnXSA9IHRoaXMuc29ydC5kaXJlY3Rpb247XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0gPSBuZXcgRnNGaWx0ZXJDb25maWdJdGVtKHNvcnREaXJlY3Rpb25JdGVtLCB0aGlzLCByb3V0ZSwgcGVyc2lzdHMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVNb2RlbFZhbHVlcygpIHtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goKGZpbHRlcikgPT4ge1xuICAgICAgZmlsdGVyLm1vZGVsID0gY2xvbmUoZmlsdGVyLnRtcE1vZGVsKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnNvcnRCeUl0ZW0pIHtcbiAgICAgIHRoaXMuc29ydEJ5SXRlbS5tb2RlbCA9IGNsb25lKHRoaXMuc29ydEJ5SXRlbS50bXBNb2RlbCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydERpcmVjdGlvbkl0ZW0pIHtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwgPSBjbG9uZSh0aGlzLnNvcnREaXJlY3Rpb25JdGVtLnRtcE1vZGVsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0cyhvcHRzOiBhbnkgPSB7fSkge1xuXG4gICAgY29uc3QgcXVlcnkgPSB7fTtcblxuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgIGxldCB2YWx1ZSA9IGNsb25lKGZpbHRlci5tb2RlbCk7XG5cbiAgICAgIGlmIChmaWx0ZXIudHlwZSA9PSBJdGVtVHlwZS5TZWxlY3QpIHtcblxuICAgICAgICBpZiAoZmlsdGVyLm11bHRpcGxlKSB7XG5cbiAgICAgICAgICBpZiAoZmlsdGVyLmlzb2xhdGUpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIubW9kZWwpIHx8ICFmaWx0ZXIubW9kZWwubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gYXJyYXlMaXN0KGZpbHRlci52YWx1ZXMsICd2YWx1ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmaWx0ZXIubW9kZWwgJiYgZmlsdGVyLm1vZGVsLmluZGV4T2YoJ19fYWxsJykgPiAtMSkge1xuICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgaWYgKGZpbHRlci5pc29sYXRlKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyLm1vZGVsID09ICdfX2FsbCcpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBhcnJheUxpc3QoZmlsdGVyLnZhbHVlcywgJ3ZhbHVlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIubW9kZWwgPT0gJ19fYWxsJykge1xuICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZpbHRlci50eXBlID09IEl0ZW1UeXBlLkF1dG9Db21wbGV0ZUNoaXBzIHx8IGZpbHRlci50eXBlID09PSBJdGVtVHlwZS5DaGlwcykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXIubW9kZWwpICYmIGZpbHRlci5tb2RlbC5sZW5ndGggJiYgIW9wdHMuZXhwYW5kKSB7XG4gICAgICAgICAgdmFsdWUgPSBhcnJheUxpc3QoZmlsdGVyLm1vZGVsLCAndmFsdWUnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmaWx0ZXIudHlwZSA9PSBJdGVtVHlwZS5DaGVja2JveCkge1xuICAgICAgICB2YWx1ZSA9IGZpbHRlci5tb2RlbCA/IGZpbHRlci5jaGVja2VkIDogZmlsdGVyLnVuY2hlY2tlZDtcbiAgICAgIH1cblxuICAgICAgLy8gQFRPRE9cbiAgICAgIGlmIChpc0VtcHR5KHZhbHVlLCB7IHplcm86IHRydWUgfSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWx0ZXIudHlwZSA9PSBJdGVtVHlwZS5EYXRlIHx8IGZpbHRlci50eXBlID09IEl0ZW1UeXBlLkRhdGVUaW1lKSB7XG5cbiAgICAgICAgaWYgKHZhbHVlICYmIGlzVmFsaWQodmFsdWUpICYmIGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHNpbXBsZUZvcm1hdCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmIChmaWx0ZXIudHlwZSA9PSBJdGVtVHlwZS5EYXRlUmFuZ2UgfHwgZmlsdGVyLnR5cGUgPT0gSXRlbVR5cGUuRGF0ZVRpbWVSYW5nZSkge1xuXG4gICAgICAgIGNvbnN0IGZyb20gPSB2YWx1ZS5mcm9tO1xuICAgICAgICBjb25zdCB0byA9IHZhbHVlLnRvO1xuXG4gICAgICAgIHZhbHVlID0ge307XG4gICAgICAgIGlmIChmcm9tKSB7XG4gICAgICAgICAgdmFsdWUuZnJvbSA9IGZvcm1hdChmcm9tLCAneXl5eS1NTS1kZFxcVEhIOm1tOnNzeHh4eHgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0bykge1xuICAgICAgICAgIHZhbHVlLnRvID0gZm9ybWF0KHRvLCAneXl5eS1NTS1kZFxcVEhIOm1tOnNzeHh4eHgnKTtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKGZpbHRlci50eXBlID09IEl0ZW1UeXBlLkF1dG9Db21wbGV0ZSkge1xuXG4gICAgICAgIGlmIChpc0VtcHR5KGZpbHRlci5tb2RlbC52YWx1ZSwge3plcm86IHRydWV9KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgPSBvcHRzLmV4cGFuZCA/IGZpbHRlci5tb2RlbCA6IGZpbHRlci5tb2RlbC52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzT2JqZWN0KGZpbHRlci5uYW1lcykgJiYgb3B0cy5uYW1lcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmlsdGVyLm5hbWVzKSB7XG4gICAgICAgICAgaWYgKHZhbHVlW2ZpbHRlci5uYW1lc1trZXldXSkge1xuICAgICAgICAgICAgcXVlcnlba2V5XSA9IHZhbHVlW2ZpbHRlci5uYW1lc1trZXldXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5W2ZpbHRlci5uYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRzLmZsYXR0ZW4pIHtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBxdWVyeSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShxdWVyeVtuYW1lXSkpIHtcbiAgICAgICAgICBxdWVyeVtuYW1lXSA9IHF1ZXJ5W25hbWVdLmpvaW4oJywnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTb3J0KCk6IEZpbHRlclNvcnQgfCBudWxsIHtcbiAgICBsZXQgc29ydEJ5ID0gdGhpcy5nZXRTb3J0QnlWYWx1ZSgpO1xuICAgIHNvcnRCeSA9IHNvcnRCeSA9PT0gJ19fYWxsJyA/IG51bGwgOiBzb3J0Qnk7XG5cbiAgICBsZXQgc29ydERpcmVjdGlvbiA9IHRoaXMuZ2V0U29ydERpcmVjdGlvblZhbHVlKCk7XG4gICAgc29ydERpcmVjdGlvbiA9IHNvcnREaXJlY3Rpb24gPT09ICdfX2FsbCcgPyBudWxsIDogc29ydERpcmVjdGlvbjtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogc29ydEJ5LFxuICAgICAgZGlyZWN0aW9uOiBzb3J0RGlyZWN0aW9uLFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRTb3J0QnlWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0QnlJdGVtID8gdGhpcy5zb3J0QnlJdGVtLm1vZGVsIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTb3J0RGlyZWN0aW9uVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0gPyB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm1vZGVsIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVTb3J0KHNvcnQpIHtcbiAgICBpZiAoc29ydC5zb3J0QnkpIHtcbiAgICAgIHRoaXMuc29ydEJ5SXRlbS5tb2RlbCA9IHNvcnQuc29ydEJ5O1xuICAgIH1cblxuICAgIGlmIChzb3J0LnNvcnREaXJlY3Rpb24pIHtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwgPSBzb3J0LnNvcnREaXJlY3Rpb247XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEZpbGxlZEl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1zLnJlZHVjZSgoYWNjLCBmaWx0ZXIpID0+IHtcblxuICAgICAgc3dpdGNoIChmaWx0ZXIudHlwZSkge1xuICAgICAgICBjYXNlIEl0ZW1UeXBlLlNlbGVjdDoge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxlSXNvbGRhdGVkID0gZmlsdGVyLm11bHRpcGxlXG4gICAgICAgICAgICAmJiBmaWx0ZXIuaXNvbGF0ZVxuICAgICAgICAgICAgJiYgQXJyYXkuaXNBcnJheShmaWx0ZXIubW9kZWwpXG4gICAgICAgICAgICAmJiAhIWZpbHRlci5tb2RlbC5sZW5ndGhcbiAgICAgICAgICAgICYmIGZpbHRlci5tb2RlbC5pbmRleE9mKCdfX2FsbCcpID09PSAtMTtcblxuICAgICAgICAgIGNvbnN0IG11bHRpcGxlSGFzU2VsZWN0ZWRWYWx1ZXMgPSBmaWx0ZXIubXVsdGlwbGVcbiAgICAgICAgICAgICYmIEFycmF5LmlzQXJyYXkoZmlsdGVyLm1vZGVsKVxuICAgICAgICAgICAgJiYgZmlsdGVyLm1vZGVsLmxlbmd0aFxuICAgICAgICAgICAgJiYgZmlsdGVyLm1vZGVsLmluZGV4T2YoJ19fYWxsJykgPT09IC0xO1xuXG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXMgPSAhZmlsdGVyLm11bHRpcGxlICYmIGZpbHRlci5tb2RlbCAmJiBmaWx0ZXIubW9kZWwgIT09ICdfX2FsbCc7XG5cbiAgICAgICAgICBpZiAobXVsdGlwbGVJc29sZGF0ZWQgfHwgbXVsdGlwbGVIYXNTZWxlY3RlZFZhbHVlcyB8fCBzZWxlY3RlZFZhbHVlcykge1xuICAgICAgICAgICAgYWNjLnB1c2goZmlsdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBJdGVtVHlwZS5BdXRvQ29tcGxldGVDaGlwczoge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlci5tb2RlbCkgJiYgZmlsdGVyLm1vZGVsLmxlbmd0aCkge1xuICAgICAgICAgICAgYWNjLnB1c2goZmlsdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBJdGVtVHlwZS5DaGVja2JveDoge1xuICAgICAgICAgIGlmIChmaWx0ZXIubW9kZWwpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGZpbHRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgSXRlbVR5cGUuRGF0ZVJhbmdlOiBjYXNlIEl0ZW1UeXBlLkRhdGVUaW1lUmFuZ2U6IHtcbiAgICAgICAgICBpZiAoZmlsdGVyLm1vZGVsLmZyb20gfHwgZmlsdGVyLm1vZGVsLnRvKSB7XG4gICAgICAgICAgICBhY2MucHVzaChmaWx0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBicmVhaztcblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgaWYgKGZpbHRlci5tb2RlbCAmJlxuICAgICAgICAgICAgZmlsdGVyICE9PSB0aGlzLnNlYXJjaElucHV0ICYmXG4gICAgICAgICAgICAoIWlzRW1wdHkoZmlsdGVyLm1vZGVsLCB7emVybzogdHJ1ZX0pIHx8ICFpc0VtcHR5KGZpbHRlci5tb2RlbC52YWx1ZSwge3plcm86IHRydWV9KSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGZpbHRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG4gIH1cblxuICBwdWJsaWMgZmlsdGVyc0NsZWFyKCkge1xuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgIGZpbHRlci5jbGVhcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnRCeUl0ZW0pIHtcbiAgICAgIGlmICh0aGlzLnNvcnQpIHtcbiAgICAgICAgdGhpcy5zb3J0QnlJdGVtLm1vZGVsID0gdGhpcy5zb3J0LnZhbHVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnRCeUl0ZW0uY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0RGlyZWN0aW9uSXRlbSkge1xuICAgICAgaWYgKHRoaXMuc29ydCkge1xuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm1vZGVsID0gdGhpcy5zb3J0LmRpcmVjdGlvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsb2FkVmFsdWVzRm9yUGVuZGluZ0l0ZW1zKCkge1xuICAgIHRoaXMuaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaGFzUGVuZGluZ1ZhbHVlcylcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiBpdGVtLmxvYWRSZW1vdGVWYWx1ZXMoKSk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIl19