@firestitch/filter
Version:
730 lines • 59.9 kB
JavaScript
/**
* @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 } 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',
};
export { ItemType };
export class FsFilterConfigItem extends Model {
/**
* @param {?=} data
* @param {?=} _config
* @param {?=} _route
* @param {?=} _persists
*/
constructor(data = {}, _config, _route, _persists) {
super();
this._config = _config;
this._route = _route;
this._persists = _persists;
this.initialLoading = false;
this.valueChanged = false;
this._pendingValues = false;
this._fromJSON(data);
}
/**
* @return {?}
*/
get hasPendingValues() {
return this._pendingValues;
}
/**
* @return {?}
*/
get model() {
return this._model;
}
/**
* @param {?} val
* @return {?}
*/
set model(val) {
this._model = val;
this._tmpModel = val;
this.checkIfValueChanged();
}
/**
* @return {?}
*/
get tmpModel() {
return this._tmpModel;
}
/**
* @param {?} val
* @return {?}
*/
set tmpModel(val) {
this._tmpModel = val;
}
/**
* @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]) {
/** @type {?} */
let value = persisted[this.name];
if (value) {
if (this.type === ItemType.DateRange || this.type === ItemType.DateTimeRange) {
value.from = value.from ? toUTC(value.from) : null;
value.to = value.to ? toUTC(value.to) : null;
}
else if (this.type === ItemType.Date ||
this.type === ItemType.DateTime) {
if (!isDate(value) || !isValid(value)) {
value = parse(value, 'yyyy-MM-dd\'T\'HH:mm:ssxxxxx', new Date());
}
}
else if (this.type === ItemType.Checkbox && this.checked !== undefined) {
value = value == this.checked;
}
else if (this.type === ItemType.Select && this.multiple) {
value = clone(value);
}
}
this.model = value;
}
}
this.applyDataFromQuery();
if (isFunction(data.values) &&
this.type !== ItemType.AutoComplete &&
this.type !== ItemType.AutoCompleteChips) {
this.values = data.values();
if (isObservable(this.values)) {
this._pendingValues = true;
}
else {
/** @type {?} */
const values = Array.isArray(this.values) ? ((/** @type {?} */ (this.values))).slice() : this.values;
this.sanitizeItem(values);
}
}
else {
/** @type {?} */
const values = Array.isArray(data.values) ? data.values.slice() : data.values;
this.sanitizeItem(values);
}
}
/**
* @param {?} values
* @return {?}
*/
sanitizeItem(values) {
switch (this.type) {
case ItemType.Text:
{
//?????
}
break;
case ItemType.Select:
{
this.sanitizeSelectItem(values);
}
break;
case ItemType.Chips:
{
this.sanitizeChipsItem(values);
}
break;
case ItemType.Range:
{
this.sanitizeRange();
}
break;
case ItemType.Checkbox:
{
this.sanitizeCheckbox();
}
break;
}
if (this.model === undefined) {
if (this.type == 'checkbox') {
this.model = this.checked == this.defaultValue;
}
else {
this.model = this.defaultValue;
}
}
if (this.model === undefined) {
if (this.type == 'checkbox') {
this.model = false;
}
else if (this.type == 'select') {
if (this.multiple) {
if (!Array.isArray(this.defaultValue)) {
this.model = [];
}
}
else {
if (this.defaultValue === undefined) {
this.model = '__all';
}
}
}
else if (this.type == ItemType.AutoCompleteChips || this.type == ItemType.Chips) {
this.model = [];
}
}
}
/**
* @param {?} values
* @return {?}
*/
sanitizeSelectItem(values) {
this.values = values;
this.groups = null;
// let data = [];
// if (this.nested) {
// // generate a list of values from objects that have not been nested.
// if (!this.multiple) {
// data.push({value: '__all', name: 'All', depth: 0});
// }
//
// Array.prototype.push.apply(data, this.walkSelectNestedValues(filter, null, this.values));
// } else {
//
// data = this.walkSelectValues(filter, this.values);
// }
// this.values = data;
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;
}
}
}
}
/**
* @param {?} values
* @return {?}
*/
sanitizeChipsItem(values) {
this.values = values;
this.groups = null;
// 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;
// }
// }
// }
//
// for (const value of this.values) {
//
// if (value.group) {
//
// if (!this.groups) {
// this.groups = {};
// }
//
// if (!this.groups[value.group]) {
// this.groups[value.group] = [];
// }
//
// this.groups[value.group].push(value);
// }
// }
}
/**
* @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);
}
/**
* @return {?}
*/
applyDataFromQuery() {
if (this.query) {
/** @type {?} */
let query = this._route.snapshot.queryParams[this.query];
if (query !== undefined) {
query += '';
this.model = query;
if (!query.length) {
this.model = undefined;
}
else if (this.type == 'select' && this.multiple) {
this.model = this.model.split(',');
}
else if (this.type == 'daterange' || this.type == 'datetimerange') {
/** @type {?} */
const parts = this.model.split(',');
this.model = { from: parts[0], to: parts[1] };
}
else if (this.type == 'range') {
/** @type {?} */
const parts = this.model.split(',');
this.model = { min: parts[0], max: parts[1] };
}
}
}
}
/**
* @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;
}
}
}
/**
* @return {?}
*/
loadRemoteValues() {
if (!this.initialLoading && this._pendingValues) {
this.initialLoading = true;
this.values
.pipe(take(1), takeUntil(this._config.destroy$))
.subscribe((/**
* @param {?} values
* @return {?}
*/
(values) => {
this._pendingValues = false;
this.sanitizeItem(values);
this.initialLoading = false;
}));
}
}
/**
* @return {?}
*/
clear() {
this.valueChanged = false;
this.model = undefined;
switch (this.type) {
case ItemType.AutoComplete:
{
this.model = null;
this.tmpModel = null;
this.search = '';
}
break;
case ItemType.AutoCompleteChips:
case ItemType.Chips:
{
this.model = [];
this.tmpModel = [];
this.search = '';
}
break;
case ItemType.Checkbox:
{
this.model = false;
this.tmpModel = false;
}
break;
case ItemType.Select:
{
if (this.multiple) {
this.model = [];
this.tmpModel = [];
}
else {
this.model = Array.isArray(this.values) && this.values.some((/**
* @param {?} val
* @return {?}
*/
(val) => val.value === '__all'))
? '__all'
: null;
this.tmpModel = this.model;
}
if (this.isolate) {
this.isolate.enabled = false;
}
}
break;
case ItemType.Range:
{
this.model = {};
this.tmpModel = {};
}
break;
case ItemType.Text:
{
this.model = '';
this.tmpModel = '';
}
break;
case ItemType.Date:
case ItemType.DateTime:
{
this.model = null;
this.tmpModel = 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:
{
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;
}
}
}
/**
* @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, "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('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.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.defaultValue;
/** @type {?} */
FsFilterConfigItem.prototype.initialLoading;
/** @type {?} */
FsFilterConfigItem.prototype.valueChanged;
/**
* @type {?}
* @private
*/
FsFilterConfigItem.prototype._model;
/**
* @type {?}
* @private
*/
FsFilterConfigItem.prototype._tmpModel;
/**
* @type {?}
* @private
*/
FsFilterConfigItem.prototype._pendingValues;
/**
* @type {?}
* @private
*/
FsFilterConfigItem.prototype._config;
/**
* @type {?}
* @private
*/
FsFilterConfigItem.prototype._route;
/**
* @type {?}
* @private
*/
FsFilterConfigItem.prototype._persists;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWl0ZW0uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZmlyZXN0aXRjaC9maWx0ZXIvIiwic291cmNlcyI6WyJhcHAvbW9kZWxzL2ZpbHRlci1pdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7SUFPaEQsTUFBa0IsTUFBTTtJQUN4QixRQUFrQixRQUFRO0lBQzFCLE9BQWtCLE9BQU87SUFDekIsTUFBa0IsTUFBTTtJQUN4QixVQUFrQixVQUFVO0lBQzVCLFdBQWtCLFdBQVc7SUFDN0IsZUFBa0IsZUFBZTtJQUNqQyxjQUFrQixjQUFjO0lBQ2hDLG1CQUFvQixtQkFBbUI7SUFDdkMsVUFBa0IsVUFBVTtJQUM1QixPQUFrQixPQUFPOzs7QUFHM0IsTUFBTSxPQUFPLGtCQUFtQixTQUFRLEtBQUs7Ozs7Ozs7SUErQjNDLFlBQVksT0FBZ0MsRUFBRSxFQUMxQixPQUF1QixFQUN2QixNQUFzQixFQUN0QixTQUFjO1FBQ2hDLEtBQUssRUFBRSxDQUFDO1FBSFUsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBSztRQVYzQixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN2QixpQkFBWSxHQUFH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d0RBQTBCOzs7SUFwQjNDLGtDQUE2Qjs7SUFDN0Isa0NBQStCOztJQUMvQixtQ0FBOEI7O0lBQzlCLHVDQUFrQzs7SUFDbEMsc0NBQWlDOztJQUNqQyxzQ0FBa0M7O0lBQ2xDLG9DQUE0Qjs7SUFDNUIsa0NBQThCOztJQUM5QixtQ0FBOEI7O0lBQzlCLG9DQUE0Qjs7SUFDNUIscUNBQTZCOztJQUM3QiwyQ0FBbUM7O0lBQ25DLHFDQUE2Qjs7SUFDN0IsbUNBQTJCOztJQUMzQixxQ0FBaUM7O0lBQ2pDLG9DQUE0Qjs7SUFDNUIsdUNBQStCOztJQUMvQixxQ0FBNkI7O0lBQzdCLG1DQUEyQjs7SUFDM0IseUNBQWlDOztJQUNqQywwQ0FBMkM7O0lBRTNDLDRDQUE4Qjs7SUFDOUIsMENBQTRCOzs7OztJQUU1QixvQ0FBb0I7Ozs7O0lBQ3BCLHVDQUF1Qjs7Ozs7SUFDdkIsNENBQStCOzs7OztJQUduQixxQ0FBK0I7Ozs7O0lBQy9CLG9DQUE4Qjs7Ozs7SUFDOUIsdUNBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgdG9VVEMgfSBmcm9tICdAZmlyZXN0aXRjaC9kYXRlJztcblxuaW1wb3J0IHsgQWxpYXMsIE1vZGVsIH0gZnJvbSAndHNtb2RlbHMnO1xuXG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBpc09ic2VydmFibGUgfSBmcm9tICdyeGpzL2ludGVybmFsL3V0aWwvaXNPYnNlcnZhYmxlJztcblxuaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNPYmplY3QsIHRvU3RyaW5nLCBjbG9uZSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBpc0RhdGUsIGlzVmFsaWQsIHBhcnNlIH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBGc0ZpbHRlckNvbmZpZyB9IGZyb20gJy4vZmlsdGVyLWNvbmZpZyc7XG5pbXBvcnQgeyBJRmlsdGVyQ29uZmlnSXRlbSB9IGZyb20gJy4uL2ludGVyZmFjZXMvaXRlbS1jb25maWcuaW50ZXJmYWNlJztcblxuXG5leHBvcnQgZW51bSBJdGVtVHlwZSB7XG4gIFRleHQgICAgICAgICAgICA9ICd0ZXh0JyxcbiAgU2VsZWN0ICAgICAgICAgID0gJ3NlbGVjdCcsXG4gIFJhbmdlICAgICAgICAgICA9ICdyYW5nZScsXG4gIERhdGUgICAgICAgICAgICA9ICdkYXRlJyxcbiAgRGF0ZVRpbWUgICAgICAgID0gJ2RhdGV0aW1lJyxcbiAgRGF0ZVJhbmdlICAgICAgID0gJ2RhdGVyYW5nZScsXG4gIERhdGVUaW1lUmFuZ2UgICA9ICdkYXRldGltZXJhbmdlJyxcbiAgQXV0b0NvbXBsZXRlICAgID0gJ2F1dG9jb21wbGV0ZScsXG4gIEF1dG9Db21wbGV0ZUNoaXBzID0gJ2F1dG9jb21wbGV0ZWNoaXBzJyxcbiAgQ2hlY2tib3ggICAgICAgID0gJ2NoZWNrYm94JyxcbiAgQ2hpcHMgICAgICAgICAgID0gJ2NoaXBzJyxcbn1cblxuZXhwb3J0IGNsYXNzIEZzRmlsdGVyQ29uZmlnSXRlbSBleHRlbmRzIE1vZGVsIHtcblxuICBAQWxpYXMoKSBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICBAQWxpYXMoKSBwdWJsaWMgdHlwZTogSXRlbVR5cGU7XG4gIEBBbGlhcygpIHB1YmxpYyBsYWJlbDogc3RyaW5nO1xuICBAQWxpYXMoKSBwdWJsaWMgY2hpcExhYmVsOiBzdHJpbmc7XG4gIEBBbGlhcygpIHB1YmxpYyBjaGlsZHJlbjogc3RyaW5nO1xuICBAQWxpYXMoKSBwdWJsaWMgbXVsdGlwbGU6IGJvb2xlYW47XG4gIEBBbGlhcygpIHB1YmxpYyBncm91cHM6IGFueTtcbiAgQEFsaWFzKCkgcHVibGljIHdhaXQ6IGJvb2xlYW47XG4gIEBBbGlhcygpIHB1YmxpYyBxdWVyeTogc3RyaW5nO1xuICBAQWxpYXMoKSBwdWJsaWMgdmFsdWVzOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyB2YWx1ZXMkOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBzZWxlY3RlZFZhbHVlOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBpc29sYXRlOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBuYW1lczogYW55O1xuICBAQWxpYXMoKSBwdWJsaWMgcHJpbWFyeTogYm9vbGVhbjtcbiAgQEFsaWFzKCkgcHVibGljIHNlYXJjaDogYW55O1xuICBAQWxpYXMoKSBwdWJsaWMgdW5jaGVja2VkOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBjaGVja2VkOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBhbGlhczogYW55O1xuICBAQWxpYXMoKSBwdWJsaWMgcGxhY2Vob2xkZXI6IGFueTtcbiAgQEFsaWFzKCdkZWZhdWx0JykgcHVibGljIGRlZmF1bHRWYWx1ZTogYW55O1xuXG4gIHB1YmxpYyBpbml0aWFsTG9hZGluZyA9IGZhbHNlO1xuICBwdWJsaWMgdmFsdWVDaGFuZ2VkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfbW9kZWw6IGFueTtcbiAgcHJpdmF0ZSBfdG1wTW9kZWw6IGFueTtcbiAgcHJpdmF0ZSBfcGVuZGluZ1ZhbHVlcyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IElGaWx0ZXJDb25maWdJdGVtIHwgYW55ID0ge30sXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbmZpZzogRnNGaWx0ZXJDb25maWcsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcGVyc2lzdHM6IGFueSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9mcm9tSlNPTihkYXRhKTtcbiAgfVxuXG4gIGdldCBoYXNQZW5kaW5nVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9wZW5kaW5nVmFsdWVzO1xuICB9XG5cbiAgZ2V0IG1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLl9tb2RlbDtcbiAgfVxuXG4gIHNldCBtb2RlbCh2YWwpIHtcbiAgICB0aGlzLl9tb2RlbCA9IHZhbDtcbiAgICB0aGlzLl90bXBNb2RlbCA9IHZhbDtcbiAgICB0aGlzLmNoZWNrSWZWYWx1ZUNoYW5nZWQoKTtcbiAgfVxuXG4gIGdldCB0bXBNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdG1wTW9kZWw7XG4gIH1cblxuICBzZXQgdG1wTW9kZWwodmFsKSB7XG4gICAgdGhpcy5fdG1wTW9kZWwgPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgX2Zyb21KU09OKGRhdGEpIHtcbiAgICBzdXBlci5fZnJvbUpTT04oZGF0YSk7XG5cbiAgICBpZiAodGhpcy5uYW1lICYmIGlzT2JqZWN0KHRoaXMubmFtZSkpIHtcbiAgICAgIHRoaXMubmFtZXMgPSB0aGlzLm5hbWU7XG4gICAgICB0aGlzLm5hbWUgPSBPYmplY3Qua2V5cyh0aGlzLm5hbWVzKS5qb2luKCctJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wZXJzaXN0KSB7XG4gICAgICBjb25zdCBwZXJzaXN0ZWQgPSB0aGlzLl9wZXJzaXN0c1t0aGlzLl9jb25maWcucGVyc2lzdC5uYW1lXS5kYXRhO1xuXG4gICAgICBpZiAocGVyc2lzdGVkW3RoaXMubmFtZV0pIHtcblxuICAgICAgICBsZXQgdmFsdWUgPSBwZXJzaXN0ZWRbdGhpcy5uYW1lXTtcblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAodGhpcy50eXBlID09PSBJdGVtVHlwZS5EYXRlUmFuZ2UgfHwgdGhpcy50eXBlID09PSBJdGVtVHlwZS5EYXRlVGltZVJhbmdlKSB7XG4gICAgICAgICAgICB2YWx1ZS5mcm9tID0gdmFsdWUuZnJvbSA/IHRvVVRDKHZhbHVlLmZyb20pIDogbnVsbDtcbiAgICAgICAgICAgIHZhbHVlLnRvID0gdmFsdWUudG8gPyB0b1VUQyh2YWx1ZS50bykgOiBudWxsO1xuXG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMudHlwZSA9PT0gSXRlbVR5cGUuRGF0ZSB8fFxuICAgICAgICAgICAgdGhpcy50eXBlID09PSBJdGVtVHlwZS5EYXRlVGltZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKCFpc0RhdGUodmFsdWUpIHx8ICFpc1ZhbGlkKHZhbHVlKSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlKHZhbHVlLCAneXl5eS1NTS1kZFxcJ1RcXCdISDptbTpzc3h4eHh4JywgbmV3IERhdGUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMudHlwZSA9PT0gSXRlbVR5cGUuQ2hlY2tib3ggJiYgdGhpcy5jaGVja2VkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT0gdGhpcy5jaGVja2VkO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSBJdGVtVHlwZS5TZWxlY3QgJiYgdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdmFsdWUgPSBjbG9uZSh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb2RlbCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYXBwbHlEYXRhRnJvbVF1ZXJ5KCk7XG5cbiAgICBpZiAoaXNGdW5jdGlvbihkYXRhLnZhbHVlcykgJiZcbiAgICAgIHRoaXMudHlwZSAhPT0gSXRlbVR5cGUuQXV0b0NvbXBsZXRlICYmXG4gICAgICB0aGlzLnR5cGUgIT09IEl0ZW1UeXBlLkF1dG9Db21wbGV0ZUNoaXBzKSB7XG4gICAgICB0aGlzLnZhbHVlcyA9IGRhdGEudmFsdWVzKCk7XG5cbiAgICAgIGlmIChpc09ic2VydmFibGUodGhpcy52YWx1ZXMpKSB7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdWYWx1ZXMgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlcykgPyAodGhpcy52YWx1ZXMgYXMgYW55KS5zbGljZSgpIDogdGhpcy52YWx1ZXM7XG4gICAgICAgIHRoaXMuc2FuaXRpemVJdGVtKHZhbHVlcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmlzQXJyYXkoZGF0YS52YWx1ZXMpID8gZGF0YS52YWx1ZXMuc2xpY2UoKSA6IGRhdGEudmFsdWVzO1xuICAgICAgdGhpcy5zYW5pdGl6ZUl0ZW0odmFsdWVzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2FuaXRpemVJdGVtKHZhbHVlcykge1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIEl0ZW1UeXBlLlRleHQ6IHtcbiAgICAgICAgLy8/Pz8/P1xuICAgICAgfWJyZWFrO1xuICAgICAgY2FzZSBJdGVtVHlwZS5TZWxlY3Q6IHtcbiAgICAgICAgdGhpcy5zYW5pdGl6ZVNlbGVjdEl0ZW0odmFsdWVzKVxuICAgICAgfSBicmVhaztcbiAgICAgIGNhc2UgSXRlbVR5cGUuQ2hpcHM6IHtcbiAgICAgICAgdGhpcy5zYW5pdGl6ZUNoaXBzSXRlbSh2YWx1ZXMpXG4gICAgICB9IGJyZWFrO1xuICAgICAgY2FzZSBJdGVtVHlwZS5SYW5nZToge1xuICAgICAgICB0aGlzLnNhbml0aXplUmFuZ2UoKTtcbiAgICAgIH0gYnJlYWs7XG4gICAgICBjYXNlIEl0ZW1UeXBlLkNoZWNrYm94OiB7XG4gICAgICAgIHRoaXMuc2FuaXRpemVDaGVja2JveCgpO1xuICAgICAgfSBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbCA9PT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ2NoZWNrYm94Jykge1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy5jaGVja2VkID09IHRoaXMuZGVmYXVsdFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHRoaXMuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm1vZGVsID09PSB1bmRlZmluZWQpIHtcblxuICAgICAgaWYgKHRoaXMudHlwZSA9PSAnY2hlY2tib3gnKSB7XG4gICAgICAgIHRoaXMubW9kZWwgPSBmYWxzZTtcblxuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ3NlbGVjdCcpIHtcblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLmRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwgPSAnX19hbGwnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT0gSXRlbVR5cGUuQXV0b0NvbXBsZXRlQ2hpcHMgfHwgdGhpcy50eXBlID09IEl0ZW1UeXBlLkNoaXBzKSB7XG4gICAgICAgIHRoaXMubW9kZWwgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2FuaXRpemVTZWxlY3RJdGVtKHZhbHVlcykge1xuICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgIHRoaXMuZ3JvdXBzID0gbnVsbDtcblxuICAgIC8vIGxldCBkYXRhID0gW107XG5cbiAgICAvLyBpZiAodGhpcy5uZXN0ZWQpIHtcbiAgICAvLyAgIC8vIGdlbmVyYXRlIGEgbGlzdCBvZiB2YWx1ZXMgZnJvbSBvYmplY3RzIHRoYXQgaGF2ZSBub3QgYmVlbiBuZXN0ZWQuXG4gICAgLy8gICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAvLyAgICAgZGF0YS5wdXNoKHt2YWx1ZTogJ19fYWxsJywgbmFtZTogJ0FsbCcsIGRlcHRoOiAwfSk7XG4gICAgLy8gICB9XG4gICAgLy9cbiAgICAvLyAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGRhdGEsIHRoaXMud2Fsa1NlbGVjdE5lc3RlZFZhbHVlcyhmaWx0ZXIsIG51bGwsIHRoaXMudmFsdWVzKSk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvL1xuICAgIC8vICAgZGF0YSA9IHRoaXMud2Fsa1NlbGVjdFZhbHVlcyhmaWx0ZXIsIHRoaXMudmFsdWVzKTtcbiAgICAvLyB9XG5cbiAgICAvLyB0aGlzLnZhbHVlcyA9IGRhdGE7XG5cbiAgICBpZiAodGhpcy5pc29sYXRlKSB7XG4gICAgICBmb3IgKGNvbnN0IGluZGV4IGluIHRoaXMudmFsdWVzKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlcy5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcbiAgICAgICAgICBpZiAoIXRoaXMudmFsdWVzW2luZGV4XSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMudmFsdWVzW2luZGV4XS52YWx1ZSA9P