@firestitch/filter
Version:
439 lines • 34.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { isEmpty } from '@firestitch/common';
import { Alias, Model } from 'tsmodels';
import { Subject } from 'rxjs';
import { clone } from 'lodash-es';
import { FsFilterConfigItem } from './filter-item';
import { ItemType } from '../enums/item-type.enum';
/** @type {?} */
export const SORT_BY_FIELD = 'system_sort_by';
/** @type {?} */
export const SORT_DIRECTION_FIELD = 'system_sort_direction';
export class FsFilterConfig extends Model {
/**
* @param {?=} data
*/
constructor(data = {}) {
super();
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.keywordFilter = false;
this.nonKeywordFilters = false;
this._filtersNames = [];
this._destroy$ = new Subject();
this._fromJSON(data);
}
/**
* @return {?}
*/
get destroy$() {
return this._destroy$.asObservable();
}
/**
* @param {?} items
* @param {?} route
* @param {?} persists
* @return {?}
*/
initItems(items, route, persists) {
if (items && Array.isArray(items)) {
this.items = items.map((/**
* @param {?} item
* @param {?} index
* @return {?}
*/
(item, index) => {
if (index === 0 && item.type === ItemType.Text) {
item.type = ItemType.Keyword;
}
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 unique.');
}
}));
// After all the items have been created and added to this.items initalize the values
// This is important if some item default values are dependent on others
this.items.map((/**
* @param {?} item
* @return {?}
*/
(item) => {
item.initValues();
return item;
}));
}
this.initSorting(route, persists);
this.keywordFilter = !!this.items.find((/**
* @param {?} e
* @return {?}
*/
e => ItemType.Keyword === e.type));
this.nonKeywordFilters = !!this.items.find((/**
* @param {?} e
* @return {?}
*/
e => ItemType.Keyword !== e.type));
}
/**
* @param {?} name
* @return {?}
*/
getItem(name) {
return this.items.find((/**
* @param {?} item
* @return {?}
*/
(item) => item.name === name));
}
/**
* @param {?} route
* @param {?} persists
* @return {?}
*/
initSorting(route, persists) {
if (this.sortValues) {
/** @type {?} */
const 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 {?} */
const 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 {?}
*/
updateModelValues() {
this.items.forEach((/**
* @param {?} filter
* @return {?}
*/
(filter) => {
filter.model = clone(filter.model);
}));
if (this.sortByItem) {
this.sortByItem.model = clone(this.sortByItem.model);
}
if (this.sortDirectionItem) {
this.sortDirectionItem.model = clone(this.sortDirectionItem.model);
}
}
/**
* @param {?=} opts
* @return {?}
*/
sgets(opts = {}) {
console.info('FilterConfig.gets() is deprecated');
return [];
}
/**
* @return {?}
*/
getSort() {
/** @type {?} */
let sortBy = this.getSortByValue();
sortBy = sortBy === '__all' ? null : sortBy;
/** @type {?} */
let sortDirection = this.getSortDirectionValue();
sortDirection = sortDirection === '__all' ? null : sortDirection;
return {
value: sortBy,
direction: sortDirection,
};
}
/**
* @return {?}
*/
getSortByValue() {
return this.sortByItem ? this.sortByItem.model : null;
}
/**
* @return {?}
*/
getSortDirectionValue() {
return this.sortDirectionItem ? this.sortDirectionItem.model : null;
}
/**
* @param {?} sort
* @return {?}
*/
updateSort(sort) {
if (sort.sortBy) {
this.sortByItem.model = sort.sortBy;
}
if (sort.sortDirection) {
this.sortDirectionItem.model = sort.sortDirection;
}
}
/**
* @return {?}
*/
getFilledItems() {
return this.items.reduce((/**
* @param {?} acc
* @param {?} filter
* @return {?}
*/
(acc, filter) => {
switch (filter.type) {
case ItemType.Select:
{
/** @type {?} */
const multipleIsoldated = filter.multiple
&& filter.isolate
&& Array.isArray(filter.model)
&& filter.model.length
&& filter.model.indexOf('__all') === -1;
/** @type {?} */
const multipleHasSelectedValues = filter.multiple
&& Array.isArray(filter.model)
&& filter.model.length
&& filter.model.indexOf('__all') === -1;
/** @type {?} */
const selectedValues = !filter.multiple && filter.model && filter.model !== '__all';
if (multipleIsoldated || multipleHasSelectedValues || selectedValues) {
acc.push(filter);
}
}
break;
case ItemType.AutoCompleteChips:
case ItemType.Chips:
{
if (Array.isArray(filter.model) && filter.model.length) {
acc.push(filter);
}
}
break;
case ItemType.Checkbox:
{
if (filter.model) {
acc.push(filter);
}
}
break;
case ItemType.Range:
{
if (filter.model && (filter.model.min || filter.model.max)) {
acc.push(filter);
}
}
break;
case ItemType.DateRange:
case ItemType.DateTimeRange:
{
if (filter.model && (filter.model.from || filter.model.to)) {
acc.push(filter);
}
}
break;
case ItemType.Keyword:
{ }
break;
default: {
if (filter.model &&
(!isEmpty(filter.model, { zero: true }) || !isEmpty(filter.model.value, { zero: true }))) {
acc.push(filter);
}
}
}
return acc;
}), []);
}
/**
* @return {?}
*/
filtersClear() {
for (const filter of this.items) {
filter.clear();
}
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 {?}
*/
loadValuesForPendingItems() {
this.items
.filter((/**
* @param {?} item
* @return {?}
*/
(item) => item.hasPendingValues))
.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => item.loadValues(false)));
}
/**
* @return {?}
*/
destroy() {
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);
tslib_1.__decorate([
Alias(),
tslib_1.__metadata("design:type", Boolean)
], FsFilterConfig.prototype, "reloadWhenConfigChanged", void 0);
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.reloadWhenConfigChanged;
/** @type {?} */
FsFilterConfig.prototype.items;
/** @type {?} */
FsFilterConfig.prototype.sortByItem;
/** @type {?} */
FsFilterConfig.prototype.sortDirectionItem;
/** @type {?} */
FsFilterConfig.prototype.keywordFilter;
/** @type {?} */
FsFilterConfig.prototype.nonKeywordFilters;
/**
* @type {?}
* @private
*/
FsFilterConfig.prototype._filtersNames;
/**
* @type {?}
* @private
*/
FsFilterConfig.prototype._destroy$;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BmaXJlc3RpdGNoL2ZpbHRlci8iLCJzb3VyY2VzIjpbImFwcC9tb2RlbHMvZmlsdGVyLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQXFCLE1BQU0sb0JBQW9CLENBQUM7QUFFaEUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFeEMsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBRW5ELE1BQU0sT0FBTyxhQUFhLEdBQUcsZ0JBQWdCOztBQUM3QyxNQUFNLE9BQU8sb0JBQW9CLEdBQUcsdUJBQXVCO0FBRTNELE1BQU0sT0FBTyxjQUFlLFNBQVEsS0FBSzs7OztJQTJCdkMsWUFBWSxPQUFZLEVBQUU7UUFDeEIsS0FBSyxFQUFFLENBQUM7UUExQk0sU0FBSSxHQUFHLElBQUksQ0FBQztRQUNaLFlBQU8sR0FBUSxLQUFLLENBQUM7UUFDckIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUNQLGVBQVUsR0FBVSxJQUFJLENBQUM7UUFDaEMsU0FBSSxHQUFTLElBQUksQ0FBQztRQUNsQixrQkFBYSxHQUFHLElBQUksQ0FBQztRQUNyQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGNBQVMsR0FBRyxRQUFRLENBQUM7UUFPOUIsVUFBSyxHQUF5QixFQUFFLENBQUM7UUFDakMsZUFBVSxHQUF1QixJQUFJLENBQUM7UUFDdEMsc0JBQWlCLEdBQXVCLElBQUksQ0FBQztR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QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7Q0FDRjtBQTVQVTtJQUFSLEtBQUssRUFBRTs7NENBQW9CO0FBQ25CO0lBQVIsS0FBSyxFQUFFOzsrQ0FBNkI7QUFDNUI7SUFBUixLQUFLLEVBQUU7OzhDQUF1QjtBQUN0QjtJQUFSLEtBQUssRUFBRTs7aURBQTBCO0FBQ3pCO0lBQVIsS0FBSyxFQUFFOzs2Q0FBc0I7QUFDZDtJQUFmLEtBQUssQ0FBQyxPQUFPLENBQUM7O2tEQUFpQztBQUN2QztJQUFSLEtBQUssRUFBRTs7NENBQTBCO0FBQ3pCO0lBQVIsS0FBSyxFQUFFOztxREFBNkI7QUFDNUI7SUFBUixLQUFLLEVBQUU7O2tEQUEyQjtBQUMxQjtJQUFSLEtBQUssRUFBRTs7aURBQTZCO0FBQzVCO0lBQVIsS0FBSyxFQUFFOzs0Q0FBdUI7QUFDdEI7SUFBUixLQUFLLEVBQUU7OzhDQUF5QjtBQUN4QjtJQUFSLEtBQUssRUFBRTs7OENBQXlCO0FBQ3hCO0lBQVIsS0FBSyxFQUFFOztrREFBNkI7QUFDNUI7SUFBUixLQUFLLEVBQUU7OytEQUF5Qzs7O0lBZGpELDhCQUE0Qjs7SUFDNUIsaUNBQXFDOztJQUNyQyxnQ0FBK0I7O0lBQy9CLG1DQUFrQzs7SUFDbEMsK0JBQThCOztJQUM5QixvQ0FBZ0Q7O0lBQ2hELDhCQUFrQzs7SUFDbEMsdUNBQXFDOztJQUNyQyxvQ0FBbUM7O0lBQ25DLG1DQUFxQzs7SUFDckMsOEJBQStCOztJQUMvQixnQ0FBaUM7O0lBQ2pDLGdDQUFpQzs7SUFDakMsb0NBQXFDOztJQUNyQyxpREFBaUQ7O0lBRWpELCtCQUF3Qzs7SUFDeEMsb0NBQTZDOztJQUM3QywyQ0FBb0Q7O0lBQ3BELHVDQUE2Qjs7SUFDN0IsMkNBQWlDOzs7OztJQUVqQyx1Q0FBMkI7Ozs7O0lBQzNCLG1DQUF3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRW1wdHksIGxpc3QgYXMgYXJyYXlMaXN0IH0gZnJvbSAnQGZpcmVzdGl0Y2gvY29tbW9uJztcbmltcG9ydCB7IHNpbXBsZUZvcm1hdCB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGUnO1xuaW1wb3J0IHsgQWxpYXMsIE1vZGVsIH0gZnJvbSAndHNtb2RlbHMnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGNsb25lIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgRnNGaWx0ZXJDb25maWdJdGVtIH0gZnJvbSAnLi9maWx0ZXItaXRlbSc7XG5pbXBvcnQgeyBDaGFuZ2VGbiwgRmlsdGVyU29ydCwgU29ydCB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL2VudW1zL2l0ZW0tdHlwZS5lbnVtJztcblxuZXhwb3J0IGNvbnN0IFNPUlRfQllfRklFTEQgPSAnc3lzdGVtX3NvcnRfYnknO1xuZXhwb3J0IGNvbnN0IFNPUlRfRElSRUNUSU9OX0ZJRUxEID0gJ3N5c3RlbV9zb3J0X2RpcmVjdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBGc0ZpbHRlckNvbmZpZyBleHRlbmRzIE1vZGVsIHtcblxuICBAQWxpYXMoKSBwdWJsaWMgbG9hZCA9IHRydWU7XG4gIEBBbGlhcygpIHB1YmxpYyBwZXJzaXN0OiBhbnkgPSBmYWxzZTtcbiAgQEFsaWFzKCkgcHVibGljIGlubGluZSA9IGZhbHNlO1xuICBAQWxpYXMoKSBwdWJsaWMgYXV0b2ZvY3VzID0gZmFsc2U7XG4gIEBBbGlhcygpIHB1YmxpYyBjaGlwcyA9IGZhbHNlO1xuICBAQWxpYXMoJ3NvcnRzJykgcHVibGljIHNvcnRWYWx1ZXM6IGFueVtdID0gbnVsbDtcbiAgQEFsaWFzKCkgcHVibGljIHNvcnQ6IFNvcnQgPSBudWxsO1xuICBAQWxpYXMoKSBwdWJsaWMgc29ydERpcmVjdGlvbiA9IG51bGw7XG4gIEBBbGlhcygpIHB1YmxpYyBxdWVyeVBhcmFtID0gZmFsc2U7XG4gIEBBbGlhcygpIHB1YmxpYyBuYW1lc3BhY2UgPSAnZmlsdGVyJztcbiAgQEFsaWFzKCkgcHVibGljIGluaXQ6IENoYW5nZUZuO1xuICBAQWxpYXMoKSBwdWJsaWMgY2hhbmdlOiBDaGFuZ2VGbjtcbiAgQEFsaWFzKCkgcHVibGljIHJlbG9hZDogQ2hhbmdlRm47XG4gIEBBbGlhcygpIHB1YmxpYyBzb3J0Q2hhbmdlOiBDaGFuZ2VGbjtcbiAgQEFsaWFzKCkgcHVibGljIHJlbG9hZFdoZW5Db25maWdDaGFuZ2VkOiBib29sZWFuO1xuXG4gIHB1YmxpYyBpdGVtczogRnNGaWx0ZXJDb25maWdJdGVtW10gPSBbXTtcbiAgcHVibGljIHNvcnRCeUl0ZW06IEZzRmlsdGVyQ29uZmlnSXRlbSA9IG51bGw7XG4gIHB1YmxpYyBzb3J0RGlyZWN0aW9uSXRlbTogRnNGaWx0ZXJDb25maWdJdGVtID0gbnVsbDtcbiAgcHVibGljIGtleXdvcmRGaWx0ZXIgPSBmYWxzZTtcbiAgcHVibGljIG5vbktleXdvcmRGaWx0ZXJzID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfZmlsdGVyc05hbWVzID0gW107XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBhbnkgPSB7fSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9mcm9tSlNPTihkYXRhKTtcbiAgfVxuXG4gIGdldCBkZXN0cm95JCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJveSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdEl0ZW1zKGl0ZW1zLCByb3V0ZSwgcGVyc2lzdHMpIHtcblxuICAgIGlmIChpdGVtcyAmJiBBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuXG4gICAgICB0aGlzLml0ZW1zID0gaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gMCAmJiBpdGVtLnR5cGUgPT09IEl0ZW1UeXBlLlRleHQpIHtcbiAgICAgICAgICBpdGVtLnR5cGUgPSBJdGVtVHlwZS5LZXl3b3JkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5uYW1lICYmIHRoaXMuX2ZpbHRlcnNOYW1lcy5pbmRleE9mKGl0ZW0ubmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyc05hbWVzLnB1c2goaXRlbS5uYW1lKTtcblxuICAgICAgICAgIHJldHVybiBuZXcgRnNGaWx0ZXJDb25maWdJdGVtKGl0ZW0sIHRoaXMsIHJvdXRlLCBwZXJzaXN0cylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignRmlsdGVyIGluaXQgZXJyb3IuIEl0ZW1zIG5hbWUgbXVzdCBiZSB1bmlxdWUuJylcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFmdGVyIGFsbCB0aGUgaXRlbXMgaGF2ZSBiZWVuIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoaXMuaXRlbXMgaW5pdGFsaXplIHRoZSB2YWx1ZXNcbiAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGlmIHNvbWUgaXRlbSBkZWZhdWx0IHZhbHVlcyBhcmUgZGVwZW5kZW50IG9uIG90aGVyc1xuICAgICAgdGhpcy5pdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgaXRlbS5pbml0VmFsdWVzKCk7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0U29ydGluZyhyb3V0ZSwgcGVyc2lzdHMpO1xuXG4gICAgdGhpcy5rZXl3b3JkRmlsdGVyID0gISF0aGlzLml0ZW1zLmZpbmQoZSA9PiBJdGVtVHlwZS5LZXl3b3JkID09PSBlLnR5cGUpO1xuICAgIHRoaXMubm9uS2V5d29yZEZpbHRlcnMgPSAhIXRoaXMuaXRlbXMuZmluZChlID0+IEl0ZW1UeXBlLktleXdvcmQgIT09IGUudHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBuYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0U29ydGluZyhyb3V0ZSwgcGVyc2lzdHMpIHtcbiAgICBpZiAodGhpcy5zb3J0VmFsdWVzKSB7XG4gICAgICBjb25zdCBzb3J0QnlJdGVtID0ge1xuICAgICAgICBuYW1lOiBTT1JUX0JZX0ZJRUxELFxuICAgICAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgICAgIGxhYmVsOiAnU29ydCBCeScsXG4gICAgICAgIHZhbHVlczogdGhpcy5zb3J0VmFsdWVzXG4gICAgICB9O1xuXG5cbiAgICAgIGlmICh0aGlzLnNvcnQgJiYgdGhpcy5zb3J0LnZhbHVlKSB7XG4gICAgICAgIHNvcnRCeUl0ZW1bJ2RlZmF1bHQnXSA9IHRoaXMuc29ydC52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb3J0QnlJdGVtID0gbmV3IEZzRmlsdGVyQ29uZmlnSXRlbShzb3J0QnlJdGVtLCB0aGlzLCByb3V0ZSwgcGVyc2lzdHMpO1xuXG4gICAgICBjb25zdCBzb3J0RGlyZWN0aW9uSXRlbSA9IHtcbiAgICAgICAgbmFtZTogU09SVF9ESVJFQ1RJT05fRklFTEQsXG4gICAgICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICAgICAgbGFiZWw6ICdTb3J0IERpcmVjdGlvbicsXG4gICAgICAgIHZhbHVlczogW1xuICAgICAgICAgIHsgbmFtZTogJ0FzY2VuZGluZycsIHZhbHVlOiAnYXNjJyB9LFxuICAgICAgICAgIHsgbmFtZTogJ0Rlc2NlbmRpbmcnLCB2YWx1ZTogJ2Rlc2MnIH1cbiAgICAgICAgXVxuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuc29ydCAmJiB0aGlzLnNvcnQuZGlyZWN0aW9uKSB7XG4gICAgICAgIHNvcnREaXJlY3Rpb25JdGVtWydkZWZhdWx0J10gPSB0aGlzLnNvcnQuZGlyZWN0aW9uO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtID0gbmV3IEZzRmlsdGVyQ29uZmlnSXRlbShzb3J0RGlyZWN0aW9uSXRlbSwgdGhpcywgcm91dGUsIHBlcnNpc3RzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlTW9kZWxWYWx1ZXMoKSB7XG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChmaWx0ZXIpID0+IHtcbiAgICAgIGZpbHRlci5tb2RlbCA9IGNsb25lKGZpbHRlci5tb2RlbCk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5zb3J0QnlJdGVtKSB7XG4gICAgICB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgPSBjbG9uZSh0aGlzLnNvcnRCeUl0ZW0ubW9kZWwpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnREaXJlY3Rpb25JdGVtKSB7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm1vZGVsID0gY2xvbmUodGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5tb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNnZXRzKG9wdHM6IGFueSA9IHt9KSB7XG4gICAgY29uc29sZS5pbmZvKCdGaWx0ZXJDb25maWcuZ2V0cygpIGlzIGRlcHJlY2F0ZWQnKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBwdWJsaWMgZ2V0U29ydCgpOiBGaWx0ZXJTb3J0IHwgbnVsbCB7XG4gICAgbGV0IHNvcnRCeSA9IHRoaXMuZ2V0U29ydEJ5VmFsdWUoKTtcbiAgICBzb3J0QnkgPSBzb3J0QnkgPT09ICdfX2FsbCcgPyBudWxsIDogc29ydEJ5O1xuXG4gICAgbGV0IHNvcnREaXJlY3Rpb24gPSB0aGlzLmdldFNvcnREaXJlY3Rpb25WYWx1ZSgpO1xuICAgIHNvcnREaXJlY3Rpb24gPSBzb3J0RGlyZWN0aW9uID09PSAnX19hbGwnID8gbnVsbCA6IHNvcnREaXJlY3Rpb247XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHNvcnRCeSxcbiAgICAgIGRpcmVjdGlvbjogc29ydERpcmVjdGlvbixcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U29ydEJ5VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydEJ5SXRlbSA/IHRoaXMuc29ydEJ5SXRlbS5tb2RlbCA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0U29ydERpcmVjdGlvblZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnNvcnREaXJlY3Rpb25JdGVtID8gdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5tb2RlbCA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU29ydChzb3J0KSB7XG4gICAgaWYgKHNvcnQuc29ydEJ5KSB7XG4gICAgICB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgPSBzb3J0LnNvcnRCeTtcbiAgICB9XG5cbiAgICBpZiAoc29ydC5zb3J0RGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm1vZGVsID0gc29ydC5zb3J0RGlyZWN0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWxsZWRJdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5yZWR1Y2UoKGFjYywgZmlsdGVyKSA9PiB7XG5cbiAgICAgIHN3aXRjaCAoZmlsdGVyLnR5cGUpIHtcbiAgICAgICAgY2FzZSBJdGVtVHlwZS5TZWxlY3Q6IHtcbiAgICAgICAgICBjb25zdCBtdWx0aXBsZUlzb2xkYXRlZCA9IGZpbHRlci5tdWx0aXBsZVxuICAgICAgICAgICAgJiYgZmlsdGVyLmlzb2xhdGVcbiAgICAgICAgICAgICYmIEFycmF5LmlzQXJyYXkoZmlsdGVyLm1vZGVsKVxuICAgICAgICAgICAgJiYgZmlsdGVyLm1vZGVsLmxlbmd0aFxuICAgICAgICAgICAgJiYgZmlsdGVyLm1vZGVsLmluZGV4T2YoJ19fYWxsJykgPT09IC0xO1xuXG4gICAgICAgICAgY29uc3QgbXVsdGlwbGVIYXNTZWxlY3RlZFZhbHVlcyA9IGZpbHRlci5tdWx0aXBsZVxuICAgICAgICAgICAgJiYgQXJyYXkuaXNBcnJheShmaWx0ZXIubW9kZWwpXG4gICAgICAgICAgICAmJiBmaWx0ZXIubW9kZWwubGVuZ3RoXG4gICAgICAgICAgICAmJiBmaWx0ZXIubW9kZWwuaW5kZXhPZignX19hbGwnKSA9PT0gLTE7XG5cbiAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlcyA9ICFmaWx0ZXIubXVsdGlwbGUgJiYgZmlsdGVyLm1vZGVsICYmIGZpbHRlci5tb2RlbCAhPT0gJ19fYWxsJztcblxuICAgICAgICAgIGlmIChtdWx0aXBsZUlzb2xkYXRlZCB8fCBtdWx0aXBsZUhhc1NlbGVjdGVkVmFsdWVzIHx8IHNlbGVjdGVkVmFsdWVzKSB7XG4gICAgICAgICAgICBhY2MucHVzaChmaWx0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBicmVhaztcblxuICAgICAgICBjYXNlIEl0ZW1UeXBlLkF1dG9Db21wbGV0ZUNoaXBzOlxuICAgICAgICBjYXNlIEl0ZW1UeXBlLkNoaXBzOiB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyLm1vZGVsKSAmJiBmaWx0ZXIubW9kZWwubGVuZ3RoKSB7XG4gICAgICAgICAgICBhY2MucHVzaChmaWx0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBicmVhaztcblxuICAgICAgICBjYXNlIEl0ZW1UeXBlLkNoZWNrYm94OiB7XG4gICAgICAgICAgaWYgKGZpbHRlci5tb2RlbCkge1xuICAgICAgICAgICAgYWNjLnB1c2goZmlsdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBJdGVtVHlwZS5SYW5nZToge1xuICAgICAgICAgIGlmIChmaWx0ZXIubW9kZWwgJiYgKGZpbHRlci5tb2RlbC5taW4gfHwgZmlsdGVyLm1vZGVsLm1heCkpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGZpbHRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgSXRlbVR5cGUuRGF0ZVJhbmdlOiBjYXNlIEl0ZW1UeXBlLkRhdGVUaW1lUmFuZ2U6IHtcbiAgICAgICAgICBpZiAoZmlsdGVyLm1vZGVsICYmIChmaWx0ZXIubW9kZWwuZnJvbSB8fCBmaWx0ZXIubW9kZWwudG8pKSB7XG4gICAgICAgICAgICBhY2MucHVzaChmaWx0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBicmVhaztcblxuICAgICAgICBjYXNlIEl0ZW1UeXBlLktleXdvcmQ6IHt9IGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBpZiAoZmlsdGVyLm1vZGVsICYmXG4gICAgICAgICAgICAoIWlzRW1wdHkoZmlsdGVyLm1vZGVsLCB7IHplcm86IHRydWUgfSkgfHwgIWlzRW1wdHkoZmlsdGVyLm1vZGVsLnZhbHVlLCB7emVybzogdHJ1ZX0pKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYWNjLnB1c2goZmlsdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJzQ2xlYXIoKSB7XG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgdGhpcy5pdGVtcykge1xuICAgICAgZmlsdGVyLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydEJ5SXRlbSkge1xuICAgICAgaWYgKHRoaXMuc29ydCkge1xuICAgICAgICB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgPSB0aGlzLnNvcnQudmFsdWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ydEJ5SXRlbS5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnREaXJlY3Rpb25JdGVtKSB7XG4gICAgICBpZiAodGhpcy5zb3J0KSB7XG4gICAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwgPSB0aGlzLnNvcnQuZGlyZWN0aW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGxvYWRWYWx1ZXNGb3JQZW5kaW5nSXRlbXMoKSB7XG4gICAgdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5oYXNQZW5kaW5nVmFsdWVzKVxuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0ubG9hZFZhbHVlcyhmYWxzZSkpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==