UNPKG

@firestitch/filter

Version:
801 lines 61 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { toUTC } from '@firestitch/date'; import { Alias, Model } from 'tsmodels'; import { take, takeUntil } from 'rxjs/operators'; import { isObservable } from 'rxjs/internal/util/isObservable'; import { isFunction, isObject, toString, clone, filter } from 'lodash-es'; import { isDate, isValid, parse } from 'date-fns'; /** @enum {string} */ const ItemType = { Text: 'text', Select: 'select', Range: 'range', Date: 'date', DateTime: 'datetime', DateRange: 'daterange', DateTimeRange: 'datetimerange', AutoComplete: 'autocomplete', AutoCompleteChips: 'autocompletechips', Checkbox: 'checkbox', Chips: 'chips', Keyword: 'keyword', }; export { ItemType }; export class FsFilterConfigItem extends Model { /** * @param {?=} _configItem * @param {?=} _config * @param {?=} _route * @param {?=} _persists */ constructor(_configItem = {}, _config, _route, _persists) { super(); this._configItem = _configItem; this._config = _config; this._route = _route; this._persists = _persists; this.initialLoading = false; this.valueChanged = false; this._pendingValues = false; this._fromJSON(_configItem); } /** * @return {?} */ get hasPendingValues() { return this._pendingValues; } /** * @return {?} */ get model() { return this._model; } /** * @param {?} val * @return {?} */ set model(val) { this._model = val; this.checkIfValueChanged(); } /** * @param {?} values * @return {?} */ set values(values) { this._values = values; this.sanitize(); } /** * @return {?} */ get values() { return this._values; } /** * @param {?} data * @return {?} */ _fromJSON(data) { super._fromJSON(data); if (this.name && isObject(this.name)) { this.names = this.name; this.name = Object.keys(this.names).join('-'); } if (this._config.persist) { /** @type {?} */ const persisted = this._persists[this._config.persist.name].data; if (persisted[this.name]) { this.parseAndSetValue(persisted[this.name]); } } this.sanitize(); } /** * @return {?} */ initValues() { if (isFunction(this._configItem.values) && !this.isTypeAutocomplete() && !this.isTypeAutocompleteChips()) { /** @type {?} */ const obj = this._configItem.values(); this.values = obj; if (isObservable(obj)) { this._pendingValues = true; } } else { this.values = this._configItem.values; } } /** * @param {?} value * @return {?} */ updateValue(value) { switch (this.type) { case ItemType.Select: { if (value === '__all' || value === null) { this.model = value; return; } /** @type {?} */ let valueExists = null; /** @type {?} */ let isolated = null; if (this.multiple) { isolated = this.isolate && Array.isArray(value) && value[0] === this.isolate.value; valueExists = Array.isArray(this.values) ? value.every((/** * @param {?} val * @return {?} */ (val) => { return this.values.find((/** * @param {?} valueItem * @return {?} */ (valueItem) => valueItem.value === val)); })) || isolated : false; } else { valueExists = Array.isArray(this.values) ? this.values.some((/** * @param {?} valueItem * @return {?} */ (valueItem) => valueItem.value === value)) : false; } if (valueExists) { this.model = value; if (this.isolate) { this.isolate.enabled = isolated; } return; } } break; case ItemType.Range: { this.model = isObject(value) ? Object.assign({}, this.model, value) : {}; } break; case ItemType.Chips: { this.model = []; } break; case ItemType.Date: case ItemType.DateTime: { this.model = value; } break; case ItemType.AutoCompleteChips: { if (Array.isArray(value)) { this.model.push(...value); } else if (isObject(value)) { this.model.push(value); } else { this.model = []; } } break; default: { this.model = value; } } } /** * @param {?=} reload * @return {?} */ loadValues(reload = true) { if (reload || (!this.initialLoading && this.hasPendingValues)) { this.initialLoading = true; if (isFunction(this._configItem.values) && !this.isTypeAutocomplete() && !this.isTypeAutocompleteChips()) { /** @type {?} */ const obj = this._configItem.values(); if (isObservable(obj)) { // Clear out values so the interfaces go into a loading state this.values = []; obj .pipe(take(1), takeUntil(this._config.destroy$)) .subscribe((/** * @param {?} values * @return {?} */ (values) => { this.values = values; this._pendingValues = false; this.initialLoading = false; this.validateModel(); })); } else { this.values = obj; } } } } /** * @return {?} */ clear() { this.valueChanged = false; this.model = undefined; this.selectedValue = ''; switch (this.type) { case ItemType.AutoComplete: { this.model = null; this.search = ''; } break; case ItemType.AutoCompleteChips: case ItemType.Chips: { this.model = []; this.search = ''; } break; case ItemType.Checkbox: { this.model = false; } break; case ItemType.Select: { if (this.multiple) { this.model = []; } else { this.model = Array.isArray(this.values) && this.values.some((/** * @param {?} val * @return {?} */ (val) => val.value === '__all')) ? '__all' : null; } if (this.isolate) { this.isolate.enabled = false; } } break; case ItemType.Range: { this.model = {}; } break; case ItemType.Text: case ItemType.Keyword: { this.model = ''; } break; case ItemType.Date: case ItemType.DateTime: { this.model = null; } break; } } /** * @return {?} */ checkIfValueChanged() { switch (this.type) { case ItemType.AutoCompleteChips: { this.valueChanged = this.model && this.model.length; } break; case ItemType.Checkbox: { this.valueChanged = this.model && this.model !== false; } break; case ItemType.Select: { if (this.multiple) { this.valueChanged = this.model && this.model.length; } else { /** @type {?} */ const hasAllOption = Array.isArray(this.values) && this.values.some((/** * @param {?} val * @return {?} */ (val) => val.value === '__all')); if (hasAllOption && this.model && this.model !== '__all') { this.valueChanged = true; } else { this.valueChanged = !!this.model; } } } break; case ItemType.Range: { if (this.model && Object.keys(this.model).length > 0) { this.valueChanged = true; } } break; case ItemType.Text: case ItemType.Keyword: { this.valueChanged = this.model && this.model !== ''; } break; case ItemType.AutoComplete: case ItemType.Date: case ItemType.DateTime: { this.valueChanged = !!this.model; } break; default: { this.valueChanged = false; } } } /** * @param {?} value * @return {?} */ parseAndSetValue(value) { if (value) { if (this.isTypeDateRange() || this.isTypeDateTimeRange()) { value.from = value.from ? toUTC(value.from) : null; value.to = value.to ? toUTC(value.to) : null; } else if (this.isTypeDate() || this.isTypeDateTime()) { if (!isDate(value) || !isValid(value)) { value = parse(value, 'yyyy-MM-dd\'T\'HH:mm:ssxxxxx', new Date()); } } else if (this.isTypeCheckbox() && this.checked !== undefined) { value = value == this.checked; } else if (this.isTypeSelect() && this.multiple) { value = clone(value); } else if (this.isTypeSelect() || this.isTypeAutocomplete()) { value = +value; } } this.model = value; } /** * @return {?} */ isTypeAutocomplete() { return this.type === ItemType.AutoComplete; } /** * @return {?} */ isTypeAutocompleteChips() { return this.type === ItemType.AutoCompleteChips; } /** * @return {?} */ isTypeChips() { return this.type === ItemType.Chips; } /** * @return {?} */ isTypeCheckbox() { return this.type === ItemType.Checkbox; } /** * @return {?} */ isTypeSelect() { return this.type === ItemType.Select; } /** * @return {?} */ isTypeDate() { return this.type === ItemType.Date; } /** * @return {?} */ isTypeDateRange() { return this.type === ItemType.DateRange; } /** * @return {?} */ isTypeDateTimeRange() { return this.type === ItemType.DateTimeRange; } /** * @return {?} */ isTypeDateTime() { return this.type === ItemType.DateTime; } /** * @return {?} */ sanitize() { switch (this.type) { case ItemType.Text: case ItemType.Keyword: { //????? } break; case ItemType.Select: { this.sanitizeSelect(); } break; case ItemType.Chips: { this.sanitizeChips(); } break; case ItemType.Range: { this.sanitizeRange(); } break; case ItemType.Checkbox: { this.sanitizeCheckbox(); } break; } if (this.model === undefined) { if (this.isTypeCheckbox()) { this.model = this.checked == this.defaultValue; } else { this.model = this.defaultValue; } } if (this.model === undefined) { if (this.isTypeCheckbox()) { this.model = false; } else if (this.isTypeSelect()) { if (this.multiple) { if (!Array.isArray(this.defaultValue)) { this.model = []; } } else { if (this.defaultValue === undefined) { this.model = '__all'; } } } else if (this.isTypeAutocompleteChips() || this.isTypeChips()) { this.model = []; } } } /** * @return {?} */ validateModel() { if (this.isTypeSelect()) { if (this.multiple) { this.model = filter(this.model || [], (/** * @param {?} item * @return {?} */ (item) => { return this.values.find((/** * @param {?} value * @return {?} */ value => { return value.value === item; })); })); } else { /** @type {?} */ const exists = this.modelValueExists(this.values); if (!exists) { this.model = '__all'; } } } } /** * @private * @param {?} values * @return {?} */ modelValueExists(values) { for (let i = 0; i < values.length; i++) { if (values[i].value === this.model) { return true; } if (values[i][this.children]) { /** @type {?} */ const model = this.modelValueExists(values[i][this.children]); if (model) { return true; } } } return false; } /** * @private * @return {?} */ sanitizeSelect() { if (!Array.isArray(this.values)) { this.values = []; } if (this.isolate) { for (const index in this.values) { if (this.values.hasOwnProperty(index)) { if (!this.values[index]) { continue; } if (this.values[index].value == this.isolate.value) { this.values.splice(index, 1); } } } if (Array.isArray(this.model)) { if (this.model.length == this.values.length) { this.model = null; this.isolate.enabled = false; } else if (this.model[0] == this.isolate.value) { this.isolate.enabled = true; } } } } /** * @private * @return {?} */ sanitizeChips() { if (!Array.isArray(this.values)) { this.values = []; } if (this.model && Array.isArray(this.model) && this.values.length) { if (Number.isInteger(this.model[0])) { this.model = this.model.map((/** * @param {?} id * @return {?} */ (id) => { return this.values.find((/** * @param {?} value * @return {?} */ (value) => value.value === id)); })); } } } /** * @private * @return {?} */ sanitizeCheckbox() { this.checked = this.checked ? toString(this.checked) : true; this.unchecked = this.unchecked ? toString(this.unchecked) : false; this.defaultValue = this.defaultValue === undefined ? this.unchecked : toString(this.defaultValue); } /** * @private * @return {?} */ sanitizeRange() { if (!this.placeholder) { this.placeholder = ['Min', 'Max']; } if (!this.model) { this.model = {}; } } } tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", String) ], FsFilterConfigItem.prototype, "name", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", String) ], FsFilterConfigItem.prototype, "type", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", String) ], FsFilterConfigItem.prototype, "label", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", String) ], FsFilterConfigItem.prototype, "chipLabel", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", String) ], FsFilterConfigItem.prototype, "children", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Boolean) ], FsFilterConfigItem.prototype, "multiple", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "groups", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Boolean) ], FsFilterConfigItem.prototype, "wait", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", String) ], FsFilterConfigItem.prototype, "query", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "values$", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "selectedValue", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "isolate", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "names", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Boolean) ], FsFilterConfigItem.prototype, "primary", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "search", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "unchecked", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "checked", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "alias", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "placeholder", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfigItem.prototype, "change", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", String) ], FsFilterConfigItem.prototype, "prefix", void 0); tslib_1.__decorate([ Alias('default'), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "defaultValue", void 0); if (false) { /** @type {?} */ FsFilterConfigItem.prototype.name; /** @type {?} */ FsFilterConfigItem.prototype.type; /** @type {?} */ FsFilterConfigItem.prototype.label; /** @type {?} */ FsFilterConfigItem.prototype.chipLabel; /** @type {?} */ FsFilterConfigItem.prototype.children; /** @type {?} */ FsFilterConfigItem.prototype.multiple; /** @type {?} */ FsFilterConfigItem.prototype.groups; /** @type {?} */ FsFilterConfigItem.prototype.wait; /** @type {?} */ FsFilterConfigItem.prototype.query; /** @type {?} */ FsFilterConfigItem.prototype.values$; /** @type {?} */ FsFilterConfigItem.prototype.selectedValue; /** @type {?} */ FsFilterConfigItem.prototype.isolate; /** @type {?} */ FsFilterConfigItem.prototype.names; /** @type {?} */ FsFilterConfigItem.prototype.primary; /** @type {?} */ FsFilterConfigItem.prototype.search; /** @type {?} */ FsFilterConfigItem.prototype.unchecked; /** @type {?} */ FsFilterConfigItem.prototype.checked; /** @type {?} */ FsFilterConfigItem.prototype.alias; /** @type {?} */ FsFilterConfigItem.prototype.placeholder; /** @type {?} */ FsFilterConfigItem.prototype.change; /** @type {?} */ FsFilterConfigItem.prototype.prefix; /** @type {?} */ FsFilterConfigItem.prototype.defaultValue; /** @type {?} */ FsFilterConfigItem.prototype.initialLoading; /** @type {?} */ FsFilterConfigItem.prototype.valueChanged; /** * @type {?} * @private */ FsFilterConfigItem.prototype._model; /** * @type {?} * @private */ FsFilterConfigItem.prototype._pendingValues; /** * @type {?} * @private */ FsFilterConfigItem.prototype._values; /** * @type {?} * @private */ FsFilterConfigItem.prototype._configItem; /** * @type {?} * @private */ FsFilterConfigItem.prototype._config; /** * @type {?} * @private */ FsFilterConfigItem.prototype._route; /** * @type {?} * @private */ FsFilterConfigItem.prototype._persists; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWl0ZW0uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZmlyZXN0aXRjaC9maWx0ZXIvIiwic291cmNlcyI6WyJhcHAvbW9kZWxzL2ZpbHRlci1pdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQzs7O0lBT2hELE1BQW9CLE1BQU07SUFDMUIsUUFBb0IsUUFBUTtJQUM1QixPQUFvQixPQUFPO0lBQzNCLE1BQW9CLE1BQU07SUFDMUIsVUFBb0IsVUFBVTtJQUM5QixXQUFvQixXQUFXO0lBQy9CLGVBQW9CLGVBQWU7SUFDbkMsY0FBb0IsY0FBYztJQUNsQyxtQkFBb0IsbUJBQW1CO0lBQ3ZDLFVBQW9CLFVBQVU7SUFDOUIsT0FBb0IsT0FBTztJQUMzQixTQUFvQixTQUFTOzs7QUFHL0IsTUFBTSxPQUFPLGtCQUFtQixTQUFRLEtBQUs7Ozs7Ozs7SUFnQzNDLFlBQW9CLGNBQXVDLEVBQUUsRUFDekMsT0FBdUIsRUFDdkIsTUFBc0IsRUFDdEIsU0FBYztRQUNoQyxLQUFLLEVBQUUsQ0FBQztRQUpVLGdCQUFXLEdBQVgsV0FBVyxDQUE4QjtRQUN6QyxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUN2QixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QixjQUFTLEdB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QUFxQjs7Ozs7SUFFVCx5Q0FBaUQ7Ozs7O0lBQ2pELHFDQUErQjs7Ozs7SUFDL0Isb0NBQThCOzs7OztJQUM5Qix1Q0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyB0b1VUQyB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGUnO1xuXG5pbXBvcnQgeyBBbGlhcywgTW9kZWwgfSBmcm9tICd0c21vZGVscyc7XG5cbmltcG9ydCB7IHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGlzT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvdXRpbC9pc09ic2VydmFibGUnO1xuXG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc09iamVjdCwgdG9TdHJpbmcsIGNsb25lLCBmaWx0ZXIgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgaXNEYXRlLCBpc1ZhbGlkLCBwYXJzZSB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgRnNGaWx0ZXJDb25maWcgfSBmcm9tICcuL2ZpbHRlci1jb25maWcnO1xuaW1wb3J0IHsgSUZpbHRlckNvbmZpZ0l0ZW0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL2l0ZW0tY29uZmlnLmludGVyZmFjZSc7XG5cblxuZXhwb3J0IGVudW0gSXRlbVR5cGUge1xuICBUZXh0ICAgICAgICAgICAgICA9ICd0ZXh0JyxcbiAgU2VsZWN0ICAgICAgICAgICAgPSAnc2VsZWN0JyxcbiAgUmFuZ2UgICAgICAgICAgICAgPSAncmFuZ2UnLFxuICBEYXRlICAgICAgICAgICAgICA9ICdkYXRlJyxcbiAgRGF0ZVRpbWUgICAgICAgICAgPSAnZGF0ZXRpbWUnLFxuICBEYXRlUmFuZ2UgICAgICAgICA9ICdkYXRlcmFuZ2UnLFxuICBEYXRlVGltZVJhbmdlICAgICA9ICdkYXRldGltZXJhbmdlJyxcbiAgQXV0b0NvbXBsZXRlICAgICAgPSAnYXV0b2NvbXBsZXRlJyxcbiAgQXV0b0NvbXBsZXRlQ2hpcHMgPSAnYXV0b2NvbXBsZXRlY2hpcHMnLFxuICBDaGVja2JveCAgICAgICAgICA9ICdjaGVja2JveCcsXG4gIENoaXBzICAgICAgICAgICAgID0gJ2NoaXBzJyxcbiAgS2V5d29yZCAgICAgICAgICAgPSAna2V5d29yZCcsXG59XG5cbmV4cG9ydCBjbGFzcyBGc0ZpbHRlckNvbmZpZ0l0ZW0gZXh0ZW5kcyBNb2RlbCB7XG5cbiAgQEFsaWFzKCkgcHVibGljIG5hbWU6IHN0cmluZztcbiAgQEFsaWFzKCkgcHVibGljIHR5cGU6IEl0ZW1UeXBlO1xuICBAQWxpYXMoKSBwdWJsaWMgbGFiZWw6IHN0cmluZztcbiAgQEFsaWFzKCkgcHVibGljIGNoaXBMYWJlbDogc3RyaW5nO1xuICBAQWxpYXMoKSBwdWJsaWMgY2hpbGRyZW46IHN0cmluZztcbiAgQEFsaWFzKCkgcHVibGljIG11bHRpcGxlOiBib29sZWFuO1xuICBAQWxpYXMoKSBwdWJsaWMgZ3JvdXBzOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyB3YWl0OiBib29sZWFuO1xuICBAQWxpYXMoKSBwdWJsaWMgcXVlcnk6IHN0cmluZztcbiAgQEFsaWFzKCkgcHVibGljIHZhbHVlcyQ6IGFueTtcbiAgQEFsaWFzKCkgcHVibGljIHNlbGVjdGVkVmFsdWU6IGFueTtcbiAgQEFsaWFzKCkgcHVibGljIGlzb2xhdGU6IGFueTtcbiAgQEFsaWFzKCkgcHVibGljIG5hbWVzOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBwcmltYXJ5OiBib29sZWFuO1xuICBAQWxpYXMoKSBwdWJsaWMgc2VhcmNoOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyB1bmNoZWNrZWQ6IGFueTtcbiAgQEFsaWFzKCkgcHVibGljIGNoZWNrZWQ6IGFueTtcbiAgQEFsaWFzKCkgcHVibGljIGFsaWFzOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBwbGFjZWhvbGRlcjogYW55O1xuICBAQWxpYXMoKSBwdWJsaWMgY2hhbmdlOiBGdW5jdGlvbjtcbiAgQEFsaWFzKCkgcHVibGljIHByZWZpeDogc3RyaW5nO1xuICBAQWxpYXMoJ2RlZmF1bHQnKSBwdWJsaWMgZGVmYXVsdFZhbHVlOiBhbnk7XG5cbiAgcHVibGljIGluaXRpYWxMb2FkaW5nID0gZmFsc2U7XG4gIHB1YmxpYyB2YWx1ZUNoYW5nZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9tb2RlbDogYW55O1xuICBwcml2YXRlIF9wZW5kaW5nVmFsdWVzID0gZmFsc2U7XG4gIHByaXZhdGUgX3ZhbHVlczogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NvbmZpZ0l0ZW06IElGaWx0ZXJDb25maWdJdGVtIHwgYW55ID0ge30sXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbmZpZzogRnNGaWx0ZXJDb25maWcsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcGVyc2lzdHM6IGFueSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZnJvbUpTT04oX2NvbmZpZ0l0ZW0pO1xuICB9XG5cbiAgZ2V0IGhhc1BlbmRpbmdWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdWYWx1ZXM7XG4gIH1cblxuICBnZXQgbW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICB9XG5cbiAgc2V0IG1vZGVsKHZhbCkge1xuICAgIHRoaXMuX21vZGVsID0gdmFsO1xuICAgIHRoaXMuY2hlY2tJZlZhbHVlQ2hhbmdlZCgpO1xuICB9XG5cbiAgc2V0IHZhbHVlcyh2YWx1ZXMpIHtcbiAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG4gICAgdGhpcy5zYW5pdGl6ZSgpO1xuICB9XG5cbiAgZ2V0IHZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzO1xuICB9XG5cbiAgcHVibGljIF9mcm9tSlNPTihkYXRhKSB7XG4gICAgc3VwZXIuX2Zyb21KU09OKGRhdGEpO1xuXG4gICAgaWYgKHRoaXMubmFtZSAmJiBpc09iamVjdCh0aGlzLm5hbWUpKSB7XG4gICAgICB0aGlzLm5hbWVzID0gdGhpcy5uYW1lO1xuICAgICAgdGhpcy5uYW1lID0gT2JqZWN0LmtleXModGhpcy5uYW1lcykuam9pbignLScpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jb25maWcucGVyc2lzdCkge1xuICAgICAgY29uc3QgcGVyc2lzdGVkID0gdGhpcy5fcGVyc2lzdHNbdGhpcy5fY29uZmlnLnBlcnNpc3QubmFtZV0uZGF0YTtcblxuICAgICAgaWYgKHBlcnNpc3RlZFt0aGlzLm5hbWVdKSB7XG4gICAgICAgIHRoaXMucGFyc2VBbmRTZXRWYWx1ZShwZXJzaXN0ZWRbdGhpcy5uYW1lXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zYW5pdGl6ZSgpO1xuICB9XG5cbiAgcHVibGljIGluaXRWYWx1ZXMoKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odGhpcy5fY29uZmlnSXRlbS52YWx1ZXMpICYmXG4gICAgICAgICF0aGlzLmlzVHlwZUF1dG9jb21wbGV0ZSgpICYmXG4gICAgICAgICF0aGlzLmlzVHlwZUF1dG9jb21wbGV0ZUNoaXBzKCkpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NvbmZpZ0l0ZW0udmFsdWVzKCk7XG5cbiAgICAgIHRoaXMudmFsdWVzID0gb2JqO1xuICAgICAgaWYgKGlzT2JzZXJ2YWJsZShvYmopKSB7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdWYWx1ZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlcyA9IHRoaXMuX2NvbmZpZ0l0ZW0udmFsdWVzO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVWYWx1ZSh2YWx1ZSkge1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIEl0ZW1UeXBlLlNlbGVjdDoge1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ19fYWxsJyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMubW9kZWwgPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWVFeGlzdHMgPSBudWxsO1xuICAgICAgICBsZXQgaXNvbGF0ZWQgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgaXNvbGF0ZWQgPSB0aGlzLmlzb2xhdGUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWVbMF0gPT09IHRoaXMuaXNvbGF0ZS52YWx1ZTtcblxuICAgICAgICAgIHZhbHVlRXhpc3RzID0gQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlcylcbiAgICAgICAgICAgID8gdmFsdWUuZXZlcnkoKHZhbCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5maW5kKCh2YWx1ZUl0ZW0pID0+IHZhbHVlSXRlbS52YWx1ZSA9PT0gdmFsKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB8fCBpc29sYXRlZFxuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZUV4aXN0cyA9IEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZXMpXG4gICAgICAgICAgICA/IHRoaXMudmFsdWVzLnNvbWUoKHZhbHVlSXRlbSkgPT4gdmFsdWVJdGVtLnZhbHVlID09PSB2YWx1ZSlcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWVFeGlzdHMpIHtcbiAgICAgICAgICB0aGlzLm1vZGVsID0gdmFsdWU7XG5cbiAgICAgICAgICBpZiAodGhpcy5pc29sYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmlzb2xhdGUuZW5hYmxlZCA9IGlzb2xhdGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gYnJlYWs7XG5cbiAgICAgIGNhc2UgSXRlbVR5cGUuUmFuZ2U6IHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IGlzT2JqZWN0KHZhbHVlKSA/IHsgLi4udGhpcy5tb2RlbCwgLi4udmFsdWUgfSA6IHt9O1xuICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBJdGVtVHlwZS5DaGlwczoge1xuICAgICAgICB0aGlzLm1vZGVsID0gW107XG4gICAgICB9IGJyZWFrO1xuXG4gICAgICBjYXNlIEl0ZW1UeXBlLkRhdGU6IGNhc2UgSXRlbVR5cGUuRGF0ZVRpbWU6IHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHZhbHVlO1xuICAgICAgfSBicmVhaztcblxuICAgICAgY2FzZSBJdGVtVHlwZS5BdXRvQ29tcGxldGVDaGlwczoge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLm1vZGVsLnB1c2goLi4udmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgIHRoaXMubW9kZWwucHVzaCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tb2RlbCA9IFtdO1xuICAgICAgICB9XG4gICAgICB9IGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRoaXMubW9kZWwgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbG9hZFZhbHVlcyhyZWxvYWQgPSB0cnVlKSB7XG4gICAgaWYgKHJlbG9hZCB8fCAoIXRoaXMuaW5pdGlhbExvYWRpbmcgJiYgdGhpcy5oYXNQZW5kaW5nVmFsdWVzKSkge1xuICAgICAgdGhpcy5pbml0aWFsTG9hZGluZyA9IHRydWU7XG5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMuX2NvbmZpZ0l0ZW0udmFs