@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
541 lines • 65.2 kB
JavaScript
import { __extends } from "tslib";
/**
* Provides base filtering operations
* Implementations should be Singleton
*
* @export
*/
var IgxFilteringOperand = /** @class */ (function () {
function IgxFilteringOperand() {
var _this = this;
this.operations = [{
name: 'null',
isUnary: true,
iconName: 'is_null',
logic: function (target) {
return target === null;
}
}, {
name: 'notNull',
isUnary: true,
iconName: 'is_not_null',
logic: function (target) {
return target !== null;
}
}, {
name: 'in',
isUnary: false,
iconName: 'is_in',
hidden: true,
logic: function (target, searchVal) {
return _this.findValueInSet(target, searchVal);
}
}];
}
IgxFilteringOperand.instance = function () {
return this._instance || (this._instance = new this());
};
/**
* @hidden
*/
IgxFilteringOperand.prototype.findValueInSet = function (target, searchVal) {
return searchVal.has(target);
};
/**
* Returns an array of names of the conditions which are visible in the UI
*/
IgxFilteringOperand.prototype.conditionList = function () {
return this.operations.filter(function (f) { return !f.hidden; }).map(function (element) { return element.name; });
};
/**
* Returns an instance of the condition with the specified name.
* @param name The name of the condition.
*/
IgxFilteringOperand.prototype.condition = function (name) {
return this.operations.find(function (element) { return element.name === name; });
};
/**
* Adds a new condition to the filtering operations.
* @param operation The filtering operation.
*/
IgxFilteringOperand.prototype.append = function (operation) {
this.operations.push(operation);
};
IgxFilteringOperand._instance = null;
return IgxFilteringOperand;
}());
export { IgxFilteringOperand };
/**
* Provides filtering operations for booleans
*
* @export
*/
var IgxBooleanFilteringOperand = /** @class */ (function (_super) {
__extends(IgxBooleanFilteringOperand, _super);
function IgxBooleanFilteringOperand() {
var _this = _super.call(this) || this;
_this.operations = [{
name: 'all',
isUnary: true,
iconName: 'all',
logic: function (target) {
return true;
}
}, {
name: 'true',
isUnary: true,
iconName: 'is_true',
logic: function (target) {
return !!(target && target !== null && target !== undefined);
}
}, {
name: 'false',
isUnary: true,
iconName: 'is_false',
logic: function (target) {
return !target && target !== null && target !== undefined;
}
}, {
name: 'empty',
isUnary: true,
iconName: 'empty',
logic: function (target) {
return target === null || target === undefined;
}
}, {
name: 'notEmpty',
isUnary: true,
iconName: 'not_empty',
logic: function (target) {
return target !== null && target !== undefined;
}
}].concat(_this.operations);
return _this;
}
return IgxBooleanFilteringOperand;
}(IgxFilteringOperand));
export { IgxBooleanFilteringOperand };
/**
* Provides filtering operations for Dates
*
* @export
*/
var IgxDateFilteringOperand = /** @class */ (function (_super) {
__extends(IgxDateFilteringOperand, _super);
function IgxDateFilteringOperand() {
var _this = _super.call(this) || this;
_this.operations = [{
name: 'equals',
isUnary: false,
iconName: 'equals',
logic: function (target, searchVal) {
if (!target) {
return false;
}
_this.validateInputData(target);
var targetp = IgxDateFilteringOperand.getDateParts(target, 'yMd');
var searchp = IgxDateFilteringOperand.getDateParts(searchVal, 'yMd');
return targetp.year === searchp.year &&
targetp.month === searchp.month &&
targetp.day === searchp.day;
}
}, {
name: 'doesNotEqual',
isUnary: false,
iconName: 'not_equal',
logic: function (target, searchVal) {
if (!target) {
return true;
}
_this.validateInputData(target);
var targetp = IgxDateFilteringOperand.getDateParts(target, 'yMd');
var searchp = IgxDateFilteringOperand.getDateParts(searchVal, 'yMd');
return targetp.year !== searchp.year ||
targetp.month !== searchp.month ||
targetp.day !== searchp.day;
}
}, {
name: 'before',
isUnary: false,
iconName: 'is_before',
logic: function (target, searchVal) {
if (!target) {
return false;
}
_this.validateInputData(target);
return target < searchVal;
}
}, {
name: 'after',
isUnary: false,
iconName: 'is_after',
logic: function (target, searchVal) {
if (!target) {
return false;
}
_this.validateInputData(target);
return target > searchVal;
}
}, {
name: 'today',
isUnary: true,
iconName: 'today',
logic: function (target) {
if (!target) {
return false;
}
_this.validateInputData(target);
var d = IgxDateFilteringOperand.getDateParts(target, 'yMd');
var now = IgxDateFilteringOperand.getDateParts(new Date(), 'yMd');
return d.year === now.year &&
d.month === now.month &&
d.day === now.day;
}
}, {
name: 'yesterday',
isUnary: true,
iconName: 'yesterday',
logic: function (target) {
if (!target) {
return false;
}
_this.validateInputData(target);
var td = IgxDateFilteringOperand.getDateParts(target, 'yMd');
var y = (function (d) { return new Date(d.setDate(d.getDate() - 1)); })(new Date());
var yesterday = IgxDateFilteringOperand.getDateParts(y, 'yMd');
return td.year === yesterday.year &&
td.month === yesterday.month &&
td.day === yesterday.day;
}
}, {
name: 'thisMonth',
isUnary: true,
iconName: 'this_month',
logic: function (target) {
if (!target) {
return false;
}
_this.validateInputData(target);
var d = IgxDateFilteringOperand.getDateParts(target, 'yM');
var now = IgxDateFilteringOperand.getDateParts(new Date(), 'yM');
return d.year === now.year &&
d.month === now.month;
}
}, {
name: 'lastMonth',
isUnary: true,
iconName: 'last_month',
logic: function (target) {
if (!target) {
return false;
}
_this.validateInputData(target);
var d = IgxDateFilteringOperand.getDateParts(target, 'yM');
var now = IgxDateFilteringOperand.getDateParts(new Date(), 'yM');
if (!now.month) {
now.month = 11;
now.year -= 1;
}
else {
now.month--;
}
return d.year === now.year &&
d.month === now.month;
}
}, {
name: 'nextMonth',
isUnary: true,
iconName: 'next_month',
logic: function (target) {
if (!target) {
return false;
}
_this.validateInputData(target);
var d = IgxDateFilteringOperand.getDateParts(target, 'yM');
var now = IgxDateFilteringOperand.getDateParts(new Date(), 'yM');
if (now.month === 11) {
now.month = 0;
now.year += 1;
}
else {
now.month++;
}
return d.year === now.year &&
d.month === now.month;
}
}, {
name: 'thisYear',
isUnary: true,
iconName: 'this_year',
logic: function (target) {
if (!target) {
return false;
}
_this.validateInputData(target);
var d = IgxDateFilteringOperand.getDateParts(target, 'y');
var now = IgxDateFilteringOperand.getDateParts(new Date(), 'y');
return d.year === now.year;
}
}, {
name: 'lastYear',
isUnary: true,
iconName: 'last_year',
logic: function (target) {
if (!target) {
return false;
}
_this.validateInputData(target);
var d = IgxDateFilteringOperand.getDateParts(target, 'y');
var now = IgxDateFilteringOperand.getDateParts(new Date(), 'y');
return d.year === now.year - 1;
}
}, {
name: 'nextYear',
isUnary: true,
iconName: 'next_year',
logic: function (target) {
if (!target) {
return false;
}
_this.validateInputData(target);
var d = IgxDateFilteringOperand.getDateParts(target, 'y');
var now = IgxDateFilteringOperand.getDateParts(new Date(), 'y');
return d.year === now.year + 1;
}
}, {
name: 'empty',
isUnary: true,
iconName: 'empty',
logic: function (target) {
return target === null || target === undefined;
}
}, {
name: 'notEmpty',
isUnary: true,
iconName: 'not_empty',
logic: function (target) {
return target !== null && target !== undefined;
}
}].concat(_this.operations);
return _this;
}
/**
* Splits a Date object into parts
*
* @memberof IgxDateFilteringOperand
*/
IgxDateFilteringOperand.getDateParts = function (date, dateFormat) {
var res = {
day: null,
hours: null,
milliseconds: null,
minutes: null,
month: null,
seconds: null,
year: null
};
if (!date || !dateFormat) {
return res;
}
if (dateFormat.indexOf('y') >= 0) {
res.year = date.getFullYear();
}
if (dateFormat.indexOf('M') >= 0) {
res.month = date.getMonth();
}
if (dateFormat.indexOf('d') >= 0) {
res.day = date.getDate();
}
if (dateFormat.indexOf('h') >= 0) {
res.hours = date.getHours();
}
if (dateFormat.indexOf('m') >= 0) {
res.minutes = date.getMinutes();
}
if (dateFormat.indexOf('s') >= 0) {
res.seconds = date.getSeconds();
}
if (dateFormat.indexOf('f') >= 0) {
res.milliseconds = date.getMilliseconds();
}
return res;
};
IgxDateFilteringOperand.prototype.validateInputData = function (target) {
if (!(target instanceof Date)) {
throw new Error('Could not perform filtering on \'date\' column because the datasource object type is not \'Date\'.');
}
};
IgxDateFilteringOperand.prototype.findValueInSet = function (target, searchVal) {
if (!target) {
return false;
}
return searchVal.has(new Date(target.getFullYear(), target.getMonth(), target.getDate()).toISOString());
};
return IgxDateFilteringOperand;
}(IgxFilteringOperand));
export { IgxDateFilteringOperand };
/**
* Provides filtering operations for numbers
*
* @export
*/
var IgxNumberFilteringOperand = /** @class */ (function (_super) {
__extends(IgxNumberFilteringOperand, _super);
function IgxNumberFilteringOperand() {
var _this = _super.call(this) || this;
_this.operations = [{
name: 'equals',
isUnary: false,
iconName: 'equals',
logic: function (target, searchVal) {
return target === searchVal;
}
}, {
name: 'doesNotEqual',
isUnary: false,
iconName: 'not_equal',
logic: function (target, searchVal) {
return target !== searchVal;
}
}, {
name: 'greaterThan',
isUnary: false,
iconName: 'greater_than',
logic: function (target, searchVal) {
return target > searchVal;
}
}, {
name: 'lessThan',
isUnary: false,
iconName: 'less_than',
logic: function (target, searchVal) {
return target < searchVal;
}
}, {
name: 'greaterThanOrEqualTo',
isUnary: false,
iconName: 'greater_than_or_equal',
logic: function (target, searchVal) {
return target >= searchVal;
}
}, {
name: 'lessThanOrEqualTo',
isUnary: false,
iconName: 'less_than_or_equal',
logic: function (target, searchVal) {
return target <= searchVal;
}
}, {
name: 'empty',
isUnary: true,
iconName: 'empty',
logic: function (target) {
return target === null || target === undefined || isNaN(target);
}
}, {
name: 'notEmpty',
isUnary: true,
iconName: 'not_empty',
logic: function (target) {
return target !== null && target !== undefined && !isNaN(target);
}
}].concat(_this.operations);
return _this;
}
return IgxNumberFilteringOperand;
}(IgxFilteringOperand));
export { IgxNumberFilteringOperand };
/**
* Provides filtering operations for strings
*
* @export
*/
var IgxStringFilteringOperand = /** @class */ (function (_super) {
__extends(IgxStringFilteringOperand, _super);
function IgxStringFilteringOperand() {
var _this = _super.call(this) || this;
_this.operations = [{
name: 'contains',
isUnary: false,
iconName: 'contains',
logic: function (target, searchVal, ignoreCase) {
var search = IgxStringFilteringOperand.applyIgnoreCase(searchVal, ignoreCase);
target = IgxStringFilteringOperand.applyIgnoreCase(target, ignoreCase);
return target.indexOf(search) !== -1;
}
}, {
name: 'doesNotContain',
isUnary: false,
iconName: 'does_not_contain',
logic: function (target, searchVal, ignoreCase) {
var search = IgxStringFilteringOperand.applyIgnoreCase(searchVal, ignoreCase);
target = IgxStringFilteringOperand.applyIgnoreCase(target, ignoreCase);
return target.indexOf(search) === -1;
}
}, {
name: 'startsWith',
isUnary: false,
iconName: 'starts_with',
logic: function (target, searchVal, ignoreCase) {
var search = IgxStringFilteringOperand.applyIgnoreCase(searchVal, ignoreCase);
target = IgxStringFilteringOperand.applyIgnoreCase(target, ignoreCase);
return target.startsWith(search);
}
}, {
name: 'endsWith',
isUnary: false,
iconName: 'ends_with',
logic: function (target, searchVal, ignoreCase) {
var search = IgxStringFilteringOperand.applyIgnoreCase(searchVal, ignoreCase);
target = IgxStringFilteringOperand.applyIgnoreCase(target, ignoreCase);
return target.endsWith(search);
}
}, {
name: 'equals',
isUnary: false,
iconName: 'equals',
logic: function (target, searchVal, ignoreCase) {
var search = IgxStringFilteringOperand.applyIgnoreCase(searchVal, ignoreCase);
target = IgxStringFilteringOperand.applyIgnoreCase(target, ignoreCase);
return target === search;
}
}, {
name: 'doesNotEqual',
isUnary: false,
iconName: 'not_equal',
logic: function (target, searchVal, ignoreCase) {
var search = IgxStringFilteringOperand.applyIgnoreCase(searchVal, ignoreCase);
target = IgxStringFilteringOperand.applyIgnoreCase(target, ignoreCase);
return target !== search;
}
}, {
name: 'empty',
isUnary: true,
iconName: 'empty',
logic: function (target) {
return target === null || target === undefined || target.length === 0;
}
}, {
name: 'notEmpty',
isUnary: true,
iconName: 'not_empty',
logic: function (target) {
return target !== null && target !== undefined && target.length > 0;
}
}].concat(_this.operations);
return _this;
}
/**
* Applies case sensitivity on strings if provided
*
* @memberof IgxStringFilteringOperand
*/
IgxStringFilteringOperand.applyIgnoreCase = function (a, ignoreCase) {
a = a || '';
// bulletproof
return ignoreCase ? ('' + a).toLowerCase() : a;
};
return IgxStringFilteringOperand;
}(IgxFilteringOperand));
export { IgxStringFilteringOperand };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyaW5nLWNvbmRpdGlvbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHO0FBQ0g7SUFJSTtRQUFBLGlCQXdCQztRQXZCRyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUM7Z0JBQ2YsSUFBSSxFQUFFLE1BQU07Z0JBQ1osT0FBTyxFQUFFLElBQUk7Z0JBQ2IsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLEtBQUssRUFBRSxVQUFDLE1BQVc7b0JBQ2YsT0FBTyxNQUFNLEtBQUssSUFBSSxDQUFDO2dCQUMzQixDQUFDO2FBQ0osRUFBRTtnQkFDQyxJQUFJLEVBQUUsU0FBUztnQkFDZixPQUFPLEVBQUUsSUFBSTtnQkFDYixRQUFRLEVBQUUsYUFBYTtnQkFDdkIsS0FBSyxFQUFFLFVBQUMsTUFBVztvQkFDZixPQUFPLE1BQU0sS0FBSyxJQUFJLENBQUM7Z0JBQzNCLENBQUM7YUFDSixFQUFFO2dCQUNDLElBQUksRUFBRSxJQUFJO2dCQUNWLE9BQU8sRUFBRSxLQUFLO2dCQUNkLFFBQVEsRUFBRSxPQUFPO2dCQUNqQixNQUFNLEVBQUUsSUFBSTtnQkFDWixLQUFLLEVBQUUsVUFBQyxNQUFXLEVBQUUsU0FBbUI7b0JBQ3BDLE9BQU8sS0FBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ2xELENBQUM7YUFDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRWEsNEJBQVEsR0FBdEI7UUFDSSxPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7O09BRUc7SUFDTyw0Q0FBYyxHQUF4QixVQUF5QixNQUFXLEVBQUUsU0FBbUI7UUFDckQsT0FB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ZUFBZSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDdkUsT0FBTyxNQUFNLEtBQUssTUFBTSxDQUFDO2dCQUM3QixDQUFDO2FBQ0osRUFBRTtnQkFDQyxJQUFJLEVBQUUsT0FBTztnQkFDYixPQUFPLEVBQUUsSUFBSTtnQkFDYixRQUFRLEVBQUUsT0FBTztnQkFDakIsS0FBSyxFQUFFLFVBQUMsTUFBYztvQkFDbEIsT0FBTyxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7Z0JBQzFFLENBQUM7YUFDSixFQUFFO2dCQUNDLElBQUksRUFBRSxVQUFVO2dCQUNoQixPQUFPLEVBQUUsSUFBSTtnQkFDYixRQUFRLEVBQUUsV0FBVztnQkFDckIsS0FBSyxFQUFFLFVBQUMsTUFBYztvQkFDbEIsT0FBTyxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ3hFLENBQUM7YUFDSixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzs7SUFDL0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDVyx5Q0FBZSxHQUE3QixVQUE4QixDQUFTLEVBQUUsVUFBbUI7UUFDeEQsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixjQUFjO1FBQ2QsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNMLGdDQUFDO0FBQUQsQ0FBQyxBQXBGRCxDQUErQyxtQkFBbUIsR0FvRmpFIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcm92aWRlcyBiYXNlIGZpbHRlcmluZyBvcGVyYXRpb25zXG4gKiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGJlIFNpbmdsZXRvblxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNsYXNzIElneEZpbHRlcmluZ09wZXJhbmQge1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX2luc3RhbmNlOiBJZ3hGaWx0ZXJpbmdPcGVyYW5kID0gbnVsbDtcbiAgICBwdWJsaWMgb3BlcmF0aW9uczogSUZpbHRlcmluZ09wZXJhdGlvbltdO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSBbe1xuICAgICAgICAgICAgbmFtZTogJ251bGwnLFxuICAgICAgICAgICAgaXNVbmFyeTogdHJ1ZSxcbiAgICAgICAgICAgIGljb25OYW1lOiAnaXNfbnVsbCcsXG4gICAgICAgICAgICBsb2dpYzogKHRhcmdldDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgbmFtZTogJ25vdE51bGwnLFxuICAgICAgICAgICAgaXNVbmFyeTogdHJ1ZSxcbiAgICAgICAgICAgIGljb25OYW1lOiAnaXNfbm90X251bGwnLFxuICAgICAgICAgICAgbG9naWM6ICh0YXJnZXQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgIT09IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIG5hbWU6ICdpbicsXG4gICAgICAgICAgICBpc1VuYXJ5OiBmYWxzZSxcbiAgICAgICAgICAgIGljb25OYW1lOiAnaXNfaW4nLFxuICAgICAgICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgICAgICAgbG9naWM6ICh0YXJnZXQ6IGFueSwgc2VhcmNoVmFsOiBTZXQ8YW55PikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRWYWx1ZUluU2V0KHRhcmdldCwgc2VhcmNoVmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfV07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZSgpOiBJZ3hGaWx0ZXJpbmdPcGVyYW5kIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlIHx8ICh0aGlzLl9pbnN0YW5jZSA9IG5ldyB0aGlzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZmluZFZhbHVlSW5TZXQodGFyZ2V0OiBhbnksIHNlYXJjaFZhbDogU2V0PGFueT4pIHtcbiAgICAgICAgcmV0dXJuIHNlYXJjaFZhbC5oYXModGFyZ2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5hbWVzIG9mIHRoZSBjb25kaXRpb25zIHdoaWNoIGFyZSB2aXNpYmxlIGluIHRoZSBVSVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25kaXRpb25MaXN0KCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9ucy5maWx0ZXIoZiA9PiAhZi5oaWRkZW4pLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5uYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBjb25kaXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uZGl0aW9uKG5hbWU6IHN0cmluZyk6IElGaWx0ZXJpbmdPcGVyYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25zLmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQubmFtZSA9PT0gbmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBjb25kaXRpb24gdG8gdGhlIGZpbHRlcmluZyBvcGVyYXRpb25zLlxuICAgICAqIEBwYXJhbSBvcGVyYXRpb24gVGhlIGZpbHRlcmluZyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGFwcGVuZChvcGVyYXRpb246IElGaWx0ZXJpbmdPcGVyYXRpb24pIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2gob3BlcmF0aW9uKTtcbiAgICB9XG59XG5cbi8qKlxuICogUHJvdmlkZXMgZmlsdGVyaW5nIG9wZXJhdGlvbnMgZm9yIGJvb2xlYW5zXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY2xhc3MgSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQgZXh0ZW5kcyBJZ3hGaWx0ZXJpbmdPcGVyYW5kIHtcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IFt7XG4gICAgICAgICAgICBuYW1lOiAnYWxsJyxcbiAgICAgICAgICAgIGlzVW5hcnk6IHRydWUsXG4gICAgICAgICAgICBpY29uTmFtZTogJ2FsbCcsXG4gICAgICAgICAgICBsb2dpYzogKHRhcmdldDogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBuYW1lOiAndHJ1ZScsXG4gICAgICAgICAgICBpc1VuYXJ5OiB0cnVlLFxuICAgICAgICAgICAgaWNvbk5hbWU6ICdpc190cnVlJyxcbiAgICAgICAgICAgIGxvZ2ljOiAodGFyZ2V0OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhKHRhcmdldCAmJiB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBuYW1lOiAnZmFsc2UnLFxuICAgICAgICAgICAgaXNVbmFyeTogdHJ1ZSxcbiAgICAgICAgICAgIGljb25OYW1lOiAnaXNfZmFsc2UnLFxuICAgICAgICAgICAgbG9naWM6ICh0YXJnZXQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIXRhcmdldCAmJiB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIG5hbWU6ICdlbXB0eScsXG4gICAgICAgICAgICBpc1VuYXJ5OiB0cnVlLFxuICAgICAgICAgICAgaWNvbk5hbWU6ICdlbXB0eScsXG4gICAgICAgICAgICBsb2dpYzogKHRhcmdldDogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPT09IG51bGwgfHwgdGFyZ2V0ID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIG5hbWU6ICdub3RFbXB0eScsXG4gICAgICAgICAgICBpc1VuYXJ5OiB0cnVlLFxuICAgICAgICAgICAgaWNvbk5hbWU6ICdub3RfZW1wdHknLFxuICAgICAgICAgICAgbG9naWM6ICh0YXJnZXQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XS5jb25jYXQodGhpcy5vcGVyYXRpb25zKTtcbiAgICB9XG59XG5cbi8qKlxuICogUHJvdmlkZXMgZmlsdGVyaW5nIG9wZXJhdGlvbnMgZm9yIERhdGVzXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY2xhc3MgSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQgZXh0ZW5kcyBJZ3hGaWx0ZXJpbmdPcGVyYW5kIHtcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IFt7XG4gICAgICAgICAgICBuYW1lOiAnZXF1YWxzJyxcbiAgICAgICAgICAgIGlzVW5hcnk6IGZhbHNlLFxuICAgICAgICAgICAgaWNvbk5hbWU6ICdlcXVhbHMnLFxuICAgICAgICAgICAgbG9naWM6ICh0YXJnZXQ6IERhdGUsIHNlYXJjaFZhbDogRGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlSW5wdXREYXRhKHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRwID0gSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQuZ2V0RGF0ZVBhcnRzKHRhcmdldCwgJ3lNZCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaHAgPSBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZC5nZXREYXRlUGFydHMoc2VhcmNoVmFsLCAneU1kJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldHAueWVhciA9PT0gc2VhcmNocC55ZWFyICYmXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldHAubW9udGggPT09IHNlYXJjaHAubW9udGggJiZcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cC5kYXkgPT09IHNlYXJjaHAuZGF5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBuYW1lOiAnZG9lc05vdEVxdWFsJyxcbiAgICAgICAgICAgIGlzVW5hcnk6IGZhbHNlLFxuICAgICAgICAgICAgaWNvbk5hbWU6ICdub3RfZXF1YWwnLFxuICAgICAgICAgICAgbG9naWM6ICh0YXJnZXQ6IERhdGUsIHNlYXJjaFZhbDogRGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVJbnB1dERhdGEodGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldHAgPSBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZC5nZXREYXRlUGFydHModGFyZ2V0LCAneU1kJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VhcmNocCA9IElneERhdGVGaWx0ZXJpbmdPcGVyYW5kLmdldERhdGVQYXJ0cyhzZWFyY2hWYWwsICd5TWQnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0cC55ZWFyICE9PSBzZWFyY2hwLnllYXIgfHxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cC5tb250aCAhPT0gc2VhcmNocC5tb250aCB8fFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRwLmRheSAhPT0gc2VhcmNocC5kYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIG5hbWU6ICdiZWZvcmUnLFxuICAgICAgICAgICAgaXNVbmFyeTogZmFsc2UsXG4gICAgICAgICAgICBpY29uTmFtZTogJ2lzX2JlZm9yZScsXG4gICAgICAgICAgICBsb2dpYzogKHRhcmdldDogRGF0ZSwgc2VhcmNoVmFsOiBEYXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVJbnB1dERhdGEodGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPCBzZWFyY2hWYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIG5hbWU6ICdhZnRlcicsXG4gICAgICAgICAgICBpc1VuYXJ5OiBmYWxzZSxcbiAgICAgICAgICAgIGljb25OYW1lOiAnaXNfYWZ0ZXInLFxuICAgICAgICAgICAgbG9naWM6ICh0YXJnZXQ6IERhdGUsIHNlYXJjaFZhbDogRGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlSW5wdXREYXRhKHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ID4gc2VhcmNoVmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBuYW1lOiAndG9kYXknLFxuICAgICAgICAgICAgaXNVbmFyeTogdHJ1ZSxcbiAgICAgICAgICAgIGljb25OYW1lOiAndG9kYXknLFxuICAgICAgICAgICAgbG9naWM6ICh0YXJnZXQ6IERhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZUlucHV0RGF0YSh0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IElneERhdGVGaWx0ZXJpbmdPcGVyYW5kLmdldERhdGVQYXJ0cyh0YXJnZXQsICd5TWQnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZC5nZXREYXRlUGFydHMobmV3IERhdGUoKSwgJ3lNZCcpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkLnllYXIgPT09IG5vdy55ZWFyICYmXG4gICAgICAgICAgICAgICAgICAgIGQubW9udGggPT09IG5vdy5tb250aCAmJlxuICAgICAgICAgICAgICAgICAgICBkLmRheSA9PT0gbm93LmRheTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgbmFtZTogJ3llc3RlcmRheScsXG4gICAgICAgICAgICBpc1VuYXJ5OiB0cnVlLFxuICAgICAgICAgICAgaWNvbk5hbWU6ICd5ZXN0ZXJkYXknLFxuICAgICAgICAgICAgbG9naWM6ICh0YXJnZXQ6IERhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZUlucHV0RGF0YSh0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGQgPSBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZC5nZXREYXRlUGFydHModGFyZ2V0LCAneU1kJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgeSA9ICgoZCkgPT4gbmV3IERhdGUoZC5zZXREYXRlKGQuZ2V0RGF0ZSgpIC0gMSkpKShuZXcgRGF0ZSgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCB5ZXN0ZXJkYXkgPSBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZC5nZXREYXRlUGFydHMoeSwgJ3lNZCcpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZC55ZWFyID09PSB5ZXN0ZXJkYXkueWVhciAmJlxuICAgICAgICAgICAgICAgICAgICB0ZC5tb250aCA9PT0geWVzdGVyZGF5Lm1vbnRoICYmXG4gICAgICAgICAgICAgICAgICAgIHRkLmRheSA9PT0geWVzdGVyZGF5LmRheTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgbmFtZTogJ3RoaXNNb250aCcsXG4gICAgICAgICAgICBpc1VuYXJ5OiB0cnVlLFxuICAgICAgICAgICAgaWNvbk5hbWU6ICd0aGlzX21vbnRoJyxcbiAgICAgICAgICAgIGxvZ2ljOiAodGFyZ2V0OiBEYXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVJbnB1dERhdGEodGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZC5nZXREYXRlUGFydHModGFyZ2V0LCAneU0nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZC5nZXREYXRlUGFydHMobmV3IERhdGUoKSwgJ3lNJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQueWVhciA9PT0gbm93LnllYXIgJiZcbiAgICAgICAgICAgICAgICAgICAgZC5tb250aCA9PT0gbm93Lm1vbnRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBuYW1lOiAnbGFzdE1vbnRoJyxcbiAgICAgICAgICAgIGlzVW5hcnk6IHRydWUsXG4gICAgICAgICAgICBpY29uTmFtZTogJ2xhc3RfbW9udGgnLFxuICAgICAgICAgICAgbG9naWM6ICh0YXJnZXQ6IERhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZUlucHV0RGF0YSh0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IElneERhdGVGaWx0Z