{"version":3,"file":"ej2-data.min.js","sources":["../../src/query.js","../../src/util.js","../../src/adaptors.js","../../src/manager.js"],"sourcesContent":["import { DataUtil } from './util';\nimport { isNullOrUndefined } from '@syncfusion/ej2-base';\n/**\n * Query class is used to build query which is used by the DataManager to communicate with datasource.\n */\nvar Query = /** @class */ (function () {\n /**\n * Constructor for Query class.\n * @param {string|string[]} from?\n * @hidden\n */\n function Query(from) {\n /** @hidden */\n this.subQuery = null;\n /** @hidden */\n this.isChild = false;\n /** @hidden */\n this.distincts = [];\n this.queries = [];\n this.key = '';\n this.fKey = '';\n if (typeof from === 'string') {\n this.fromTable = from;\n }\n else if (from && from instanceof Array) {\n this.lookups = from;\n }\n this.expands = [];\n this.sortedColumns = [];\n this.groupedColumns = [];\n this.subQuery = null;\n this.isChild = false;\n this.params = [];\n this.lazyLoad = [];\n return this;\n }\n /**\n * Sets the primary key.\n * @param {string} field - Defines the column field.\n */\n Query.prototype.setKey = function (field) {\n this.key = field;\n return this;\n };\n /**\n * Sets default DataManager to execute query.\n * @param {DataManager} dataManager - Defines the DataManager.\n */\n Query.prototype.using = function (dataManager) {\n this.dataManager = dataManager;\n return this;\n };\n /**\n * Executes query with the given DataManager.\n * @param {DataManager} dataManager - Defines the DataManager.\n * @param {Function} done - Defines the success callback.\n * @param {Function} fail - Defines the failure callback.\n * @param {Function} always - Defines the callback which will be invoked on either success or failure.\n *\n *
\n * let dataManager: DataManager = new DataManager([{ ID: '10' }, { ID: '2' }, { ID: '1' }, { ID: '20' }]);\n * let query: Query = new Query();\n * query.sortBy('ID', (x: string, y: string): number => { return parseInt(x, 10) - parseInt(y, 10) });\n * let promise: Promise< Object > = query.execute(dataManager);\n * promise.then((e: { result: Object }) => { });\n *\n */\n Query.prototype.execute = function (dataManager, done, fail, always) {\n dataManager = dataManager || this.dataManager;\n if (dataManager) {\n return dataManager.executeQuery(this, done, fail, always);\n }\n return DataUtil.throwError('Query - execute() : dataManager needs to be is set using \"using\" function or should be passed as argument');\n };\n /**\n * Executes query with the local datasource.\n * @param {DataManager} dataManager - Defines the DataManager.\n */\n Query.prototype.executeLocal = function (dataManager) {\n dataManager = dataManager || this.dataManager;\n if (dataManager) {\n return dataManager.executeLocal(this);\n }\n return DataUtil.throwError('Query - executeLocal() : dataManager needs to be is set using \"using\" function or should be passed as argument');\n };\n /**\n * Creates deep copy of the Query object.\n */\n Query.prototype.clone = function () {\n var cloned = new Query();\n cloned.queries = this.queries.slice(0);\n cloned.key = this.key;\n cloned.isChild = this.isChild;\n cloned.dataManager = this.dataManager;\n cloned.fromTable = this.fromTable;\n cloned.params = this.params.slice(0);\n cloned.expands = this.expands.slice(0);\n cloned.sortedColumns = this.sortedColumns.slice(0);\n cloned.groupedColumns = this.groupedColumns.slice(0);\n cloned.subQuerySelector = this.subQuerySelector;\n cloned.subQuery = this.subQuery;\n cloned.fKey = this.fKey;\n cloned.isCountRequired = this.isCountRequired;\n cloned.distincts = this.distincts.slice(0);\n cloned.lazyLoad = this.lazyLoad.slice(0);\n return cloned;\n };\n /**\n * Specifies the name of table to retrieve data in query execution.\n * @param {string} tableName - Defines the table name.\n */\n Query.prototype.from = function (tableName) {\n this.fromTable = tableName;\n return this;\n };\n /**\n * Adds additional parameter which will be sent along with the request which will be generated while DataManager execute.\n * @param {string} key - Defines the key of additional parameter.\n * @param {Function|string} value - Defines the value for the key.\n */\n Query.prototype.addParams = function (key, value) {\n if (typeof value === 'function') {\n this.params.push({ key: key, fn: value });\n }\n else {\n this.params.push({ key: key, value: value });\n }\n return this;\n };\n /**\n * @hidden\n */\n Query.prototype.distinct = function (fields) {\n if (typeof fields === 'string') {\n this.distincts = [].slice.call([fields], 0);\n }\n else {\n this.distincts = fields.slice(0);\n }\n return this;\n };\n /**\n * Expands the related table.\n * @param {string|Object[]} tables\n */\n Query.prototype.expand = function (tables) {\n if (typeof tables === 'string') {\n this.expands = [].slice.call([tables], 0);\n }\n else {\n this.expands = tables.slice(0);\n }\n return this;\n };\n /**\n * Filter data with given filter criteria.\n * @param {string|Predicate} fieldName - Defines the column field or Predicate.\n * @param {string} operator - Defines the operator how to filter data.\n * @param {string|number|boolean} value - Defines the values to match with data.\n * @param {boolean} ignoreCase - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n */\n Query.prototype.where = function (fieldName, operator, value, ignoreCase, ignoreAccent, matchCase) {\n operator = operator ? (operator).toLowerCase() : null;\n var predicate = null;\n if (typeof fieldName === 'string') {\n predicate = new Predicate(fieldName, operator, value, ignoreCase, ignoreAccent, matchCase);\n }\n else if (fieldName instanceof Predicate) {\n predicate = fieldName;\n }\n this.queries.push({\n fn: 'onWhere',\n e: predicate\n });\n return this;\n };\n /**\n * Search data with given search criteria.\n * @param {string|number|boolean} searchKey - Defines the search key.\n * @param {string|string[]} fieldNames - Defines the collection of column fields.\n * @param {string} operator - Defines the operator how to search data.\n * @param {boolean} ignoreCase - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n */\n Query.prototype.search = function (searchKey, fieldNames, operator, ignoreCase, ignoreAccent) {\n if (typeof fieldNames === 'string') {\n fieldNames = [fieldNames];\n }\n if (!operator || operator === 'none') {\n operator = 'contains';\n }\n var comparer = DataUtil.fnOperators[operator];\n this.queries.push({\n fn: 'onSearch',\n e: {\n fieldNames: fieldNames,\n operator: operator,\n searchKey: searchKey,\n ignoreCase: ignoreCase,\n ignoreAccent: ignoreAccent,\n comparer: comparer\n }\n });\n return this;\n };\n /**\n * Sort the data with given sort criteria.\n * By default, sort direction is ascending.\n * @param {string|string[]} fieldName - Defines the single or collection of column fields.\n * @param {string|Function} comparer - Defines the sort direction or custom sort comparer function.\n */\n Query.prototype.sortBy = function (fieldName, comparer, isFromGroup) {\n return this.sortByForeignKey(fieldName, comparer, isFromGroup);\n };\n /**\n * Sort the data with given sort criteria.\n * By default, sort direction is ascending.\n * @param {string|string[]} fieldName - Defines the single or collection of column fields.\n * @param {string|Function} comparer - Defines the sort direction or custom sort comparer function.\n * @param {string} direction - Defines the sort direction .\n */\n Query.prototype.sortByForeignKey = function (fieldName, comparer, isFromGroup, direction) {\n var order = !isNullOrUndefined(direction) ? direction : 'ascending';\n var sorts;\n var temp;\n if (typeof fieldName === 'string' && DataUtil.endsWith(fieldName.toLowerCase(), ' desc')) {\n fieldName = fieldName.replace(/ desc$/i, '');\n comparer = 'descending';\n }\n if (!comparer || typeof comparer === 'string') {\n order = comparer ? comparer.toLowerCase() : 'ascending';\n comparer = DataUtil.fnSort(comparer);\n }\n if (isFromGroup) {\n sorts = Query.filterQueries(this.queries, 'onSortBy');\n for (var i = 0; i < sorts.length; i++) {\n temp = sorts[i].e.fieldName;\n if (typeof temp === 'string') {\n if (temp === fieldName) {\n return this;\n }\n }\n else if (temp instanceof Array) {\n for (var j = 0; j < temp.length; j++) {\n if (temp[j] === fieldName || fieldName.toLowerCase() === temp[j] + ' desc') {\n return this;\n }\n }\n }\n }\n }\n this.queries.push({\n fn: 'onSortBy',\n e: {\n fieldName: fieldName,\n comparer: comparer,\n direction: order\n }\n });\n return this;\n };\n /**\n * Sorts data in descending order.\n * @param {string} fieldName - Defines the column field.\n */\n Query.prototype.sortByDesc = function (fieldName) {\n return this.sortBy(fieldName, 'descending');\n };\n /**\n * Groups data with the given field name.\n * @param {string} fieldName - Defines the column field.\n */\n Query.prototype.group = function (fieldName, fn, format) {\n this.sortBy(fieldName, null, true);\n this.queries.push({\n fn: 'onGroup',\n e: {\n fieldName: fieldName,\n comparer: fn ? fn : null,\n format: format ? format : null\n }\n });\n return this;\n };\n /**\n * Gets data based on the given page index and size.\n * @param {number} pageIndex - Defines the current page index.\n * @param {number} pageSize - Defines the no of records per page.\n */\n Query.prototype.page = function (pageIndex, pageSize) {\n this.queries.push({\n fn: 'onPage',\n e: {\n pageIndex: pageIndex,\n pageSize: pageSize\n }\n });\n return this;\n };\n /**\n * Gets data based on the given start and end index.\n * @param {number} start - Defines the start index of the datasource.\n * @param {number} end - Defines the end index of the datasource.\n */\n Query.prototype.range = function (start, end) {\n this.queries.push({\n fn: 'onRange',\n e: {\n start: start,\n end: end\n }\n });\n return this;\n };\n /**\n * Gets data from the top of the data source based on given number of records count.\n * @param {number} nos - Defines the no of records to retrieve from datasource.\n */\n Query.prototype.take = function (nos) {\n this.queries.push({\n fn: 'onTake',\n e: {\n nos: nos\n }\n });\n return this;\n };\n /**\n * Skips data with given number of records count from the top of the data source.\n * @param {number} nos - Defines the no of records skip in the datasource.\n */\n Query.prototype.skip = function (nos) {\n this.queries.push({\n fn: 'onSkip',\n e: { nos: nos }\n });\n return this;\n };\n /**\n * Selects specified columns from the data source.\n * @param {string|string[]} fieldNames - Defines the collection of column fields.\n */\n Query.prototype.select = function (fieldNames) {\n if (typeof fieldNames === 'string') {\n fieldNames = [].slice.call([fieldNames], 0);\n }\n this.queries.push({\n fn: 'onSelect',\n e: { fieldNames: fieldNames }\n });\n return this;\n };\n /**\n * Gets the records in hierarchical relationship from two tables. It requires the foreign key to relate two tables.\n * @param {Query} query - Defines the query to relate two tables.\n * @param {Function} selectorFn - Defines the custom function to select records.\n */\n Query.prototype.hierarchy = function (query, selectorFn) {\n this.subQuerySelector = selectorFn;\n this.subQuery = query;\n return this;\n };\n /**\n * Sets the foreign key which is used to get data from the related table.\n * @param {string} key - Defines the foreign key.\n */\n Query.prototype.foreignKey = function (key) {\n this.fKey = key;\n return this;\n };\n /**\n * It is used to get total number of records in the DataManager execution result.\n */\n Query.prototype.requiresCount = function () {\n this.isCountRequired = true;\n return this;\n };\n //type - sum, avg, min, max\n /**\n * Aggregate the data with given type and field name.\n * @param {string} type - Defines the aggregate type.\n * @param {string} field - Defines the column field to aggregate.\n */\n Query.prototype.aggregate = function (type, field) {\n this.queries.push({\n fn: 'onAggregates',\n e: { field: field, type: type }\n });\n return this;\n };\n /**\n * Pass array of filterColumn query for performing filter operation.\n * @param {QueryOptions[]} queries\n * @param {string} name\n * @hidden\n */\n Query.filterQueries = function (queries, name) {\n return queries.filter(function (q) {\n return q.fn === name;\n });\n };\n /**\n * To get the list of queries which is already filtered in current data source.\n * @param {Object[]} queries\n * @param {string[]} singles\n * @hidden\n */\n Query.filterQueryLists = function (queries, singles) {\n var filtered = queries.filter(function (q) {\n return singles.indexOf(q.fn) !== -1;\n });\n var res = {};\n for (var i = 0; i < filtered.length; i++) {\n if (!res[filtered[i].fn]) {\n res[filtered[i].fn] = filtered[i].e;\n }\n }\n return res;\n };\n return Query;\n}());\nexport { Query };\n/**\n * Predicate class is used to generate complex filter criteria.\n * This will be used by DataManager to perform multiple filtering operation.\n */\nvar Predicate = /** @class */ (function () {\n /**\n * Constructor for Predicate class.\n * @param {string|Predicate} field\n * @param {string} operator\n * @param {string|number|boolean|Predicate|Predicate[]} value\n * @param {boolean=false} ignoreCase\n * @param {boolean} matchCase\n * @hidden\n */\n function Predicate(field, operator, value, ignoreCase, ignoreAccent, matchCase) {\n if (ignoreCase === void 0) { ignoreCase = false; }\n /** @hidden */\n this.ignoreAccent = false;\n /** @hidden */\n this.isComplex = false;\n if (typeof field === 'string') {\n this.field = field;\n this.operator = operator.toLowerCase();\n this.value = value;\n this.matchCase = matchCase;\n this.ignoreCase = ignoreCase;\n this.ignoreAccent = ignoreAccent;\n this.isComplex = false;\n this.comparer = DataUtil.fnOperators.processOperator(this.operator);\n }\n else if (field instanceof Predicate && value instanceof Predicate || value instanceof Array) {\n this.isComplex = true;\n this.condition = operator.toLowerCase();\n this.predicates = [field];\n this.matchCase = field.matchCase;\n this.ignoreCase = field.ignoreCase;\n this.ignoreAccent = field.ignoreAccent;\n if (value instanceof Array) {\n [].push.apply(this.predicates, value);\n }\n else {\n this.predicates.push(value);\n }\n }\n return this;\n }\n /**\n * Adds n-number of new predicates on existing predicate with “and” condition.\n * @param {Object[]} args - Defines the collection of predicates.\n */\n Predicate.and = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return Predicate.combinePredicates([].slice.call(args, 0), 'and');\n };\n /**\n * Adds new predicate on existing predicate with “and” condition.\n * @param {string} field - Defines the column field.\n * @param {string} operator - Defines the operator how to filter data.\n * @param {string} value - Defines the values to match with data.\n * @param {boolean} ignoreCase? - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n */\n Predicate.prototype.and = function (field, operator, value, ignoreCase, ignoreAccent) {\n return Predicate.combine(this, field, operator, value, 'and', ignoreCase, ignoreAccent);\n };\n /**\n * Adds n-number of new predicates on existing predicate with “or” condition.\n * @param {Object[]} args - Defines the collection of predicates.\n */\n Predicate.or = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return Predicate.combinePredicates([].slice.call(args, 0), 'or');\n };\n /**\n * Adds new predicate on existing predicate with “or” condition.\n * @param {string} field - Defines the column field.\n * @param {string} operator - Defines the operator how to filter data.\n * @param {string} value - Defines the values to match with data.\n * @param {boolean} ignoreCase? - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n */\n Predicate.prototype.or = function (field, operator, value, ignoreCase, ignoreAccent) {\n return Predicate.combine(this, field, operator, value, 'or', ignoreCase, ignoreAccent);\n };\n /**\n * Converts plain JavaScript object to Predicate object.\n * @param {Predicate[]|Predicate} json - Defines single or collection of Predicate.\n */\n Predicate.fromJson = function (json) {\n if (json instanceof Array) {\n var res = [];\n for (var i = 0, len = json.length; i < len; i++) {\n res.push(this.fromJSONData(json[i]));\n }\n return res;\n }\n var pred = json;\n return this.fromJSONData(pred);\n };\n /**\n * Validate the record based on the predicates.\n * @param {Object} record - Defines the datasource record.\n */\n Predicate.prototype.validate = function (record) {\n var predicate = this.predicates ? this.predicates : [];\n var isAnd;\n var ret;\n if (!this.isComplex && this.comparer) {\n return this.comparer.call(this, DataUtil.getObject(this.field, record), this.value, this.ignoreCase, this.ignoreAccent);\n }\n isAnd = this.condition === 'and';\n for (var i = 0; i < predicate.length; i++) {\n ret = predicate[i].validate(record);\n if (isAnd) {\n if (!ret) {\n return false;\n }\n }\n else {\n if (ret) {\n return true;\n }\n }\n }\n return isAnd;\n };\n /**\n * Converts predicates to plain JavaScript.\n * This method is uses Json stringify when serializing Predicate object.\n */\n Predicate.prototype.toJson = function () {\n var predicates;\n var p;\n if (this.isComplex) {\n predicates = [];\n p = this.predicates;\n for (var i = 0; i < p.length; i++) {\n predicates.push(p[i].toJson());\n }\n }\n return {\n isComplex: this.isComplex,\n field: this.field,\n operator: this.operator,\n value: this.value,\n ignoreCase: this.ignoreCase,\n ignoreAccent: this.ignoreAccent,\n condition: this.condition,\n predicates: predicates,\n matchCase: this.matchCase\n };\n };\n Predicate.combinePredicates = function (predicates, operator) {\n if (predicates.length === 1) {\n if (!(predicates[0] instanceof Array)) {\n return predicates[0];\n }\n predicates = predicates[0];\n }\n return new Predicate(predicates[0], operator, predicates.slice(1));\n };\n Predicate.combine = function (pred, field, operator, value, condition, ignoreCase, ignoreAccent) {\n if (field instanceof Predicate) {\n return Predicate[condition](pred, field);\n }\n if (typeof field === 'string') {\n return Predicate[condition](pred, new Predicate(field, operator, value, ignoreCase, ignoreAccent));\n }\n return DataUtil.throwError('Predicate - ' + condition + ' : invalid arguments');\n };\n Predicate.fromJSONData = function (json) {\n var preds = json.predicates || [];\n var len = preds.length;\n var predicates = [];\n var result;\n for (var i = 0; i < len; i++) {\n predicates.push(this.fromJSONData(preds[i]));\n }\n if (!json.isComplex) {\n result = new Predicate(json.field, json.operator, json.value, json.ignoreCase, json.ignoreAccent);\n }\n else {\n result = new Predicate(predicates[0], json.condition, predicates.slice(1));\n }\n return result;\n };\n return Predicate;\n}());\nexport { Predicate };\n","import { isNullOrUndefined } from '@syncfusion/ej2-base';\nimport { DataManager } from './manager';\nimport { Query, Predicate } from './query';\nvar consts = { GroupGuid: '{271bbba0-1ee7}' };\n/**\n * Data manager common utility methods.\n * @hidden\n */\nvar DataUtil = /** @class */ (function () {\n function DataUtil() {\n }\n /**\n * Returns the value by invoking the provided parameter function.\n * If the paramater is not of type function then it will be returned as it is.\n * @param {Function|string|string[]|number} value\n * @param {Object} inst?\n * @hidden\n */\n DataUtil.getValue = function (value, inst) {\n if (typeof value === 'function') {\n return value.call(inst || {});\n }\n return value;\n };\n /**\n * Returns true if the input string ends with given string.\n * @param {string} input\n * @param {string} substr\n */\n DataUtil.endsWith = function (input, substr) {\n return input.slice && input.slice(-substr.length) === substr;\n };\n /**\n * Returns true if the input string starts with given string.\n * @param {string} str\n * @param {string} startstr\n */\n DataUtil.startsWith = function (input, start) {\n return input.slice(0, start.length) === start;\n };\n /**\n * To return the sorting function based on the string.\n * @param {string} order\n * @hidden\n */\n DataUtil.fnSort = function (order) {\n order = order ? DataUtil.toLowerCase(order) : 'ascending';\n if (order === 'ascending') {\n return this.fnAscending;\n }\n return this.fnDescending;\n };\n /**\n * Comparer function which is used to sort the data in ascending order.\n * @param {string|number} x\n * @param {string|number} y\n * @returns number\n */\n DataUtil.fnAscending = function (x, y) {\n if (isNullOrUndefined(x) && isNullOrUndefined(y)) {\n return -1;\n }\n if (y === null || y === undefined) {\n return -1;\n }\n if (typeof x === 'string') {\n return x.localeCompare(y);\n }\n if (x === null || x === undefined) {\n return 1;\n }\n return x - y;\n };\n /**\n * Comparer function which is used to sort the data in descending order.\n * @param {string|number} x\n * @param {string|number} y\n * @returns number\n */\n DataUtil.fnDescending = function (x, y) {\n if (isNullOrUndefined(x) && isNullOrUndefined(y)) {\n return -1;\n }\n if (y === null || y === undefined) {\n return 1;\n }\n if (typeof x === 'string') {\n return x.localeCompare(y) * -1;\n }\n if (x === null || x === undefined) {\n return -1;\n }\n return y - x;\n };\n DataUtil.extractFields = function (obj, fields) {\n var newObj = {};\n for (var i = 0; i < fields.length; i++) {\n newObj = this.setValue(fields[i], this.getObject(fields[i], obj), newObj);\n }\n return newObj;\n };\n /**\n * Select objects by given fields from jsonArray.\n * @param {Object[]} jsonArray\n * @param {string[]} fields\n */\n DataUtil.select = function (jsonArray, fields) {\n var newData = [];\n for (var i = 0; i < jsonArray.length; i++) {\n newData.push(this.extractFields(jsonArray[i], fields));\n }\n return newData;\n };\n /**\n * Group the input data based on the field name.\n * It also performs aggregation of the grouped records based on the aggregates paramater.\n * @param {Object[]} jsonArray\n * @param {string} field?\n * @param {Object[]} agg?\n * @param {number} level?\n * @param {Object[]} groupDs?\n */\n DataUtil.group = function (jsonArray, field, aggregates, level, groupDs, format, isLazyLoad) {\n level = level || 1;\n var jsonData = jsonArray;\n var guid = 'GroupGuid';\n if (jsonData.GroupGuid === consts[guid]) {\n var _loop_1 = function (j) {\n if (!isNullOrUndefined(groupDs)) {\n var indx = -1;\n var temp = groupDs.filter(function (e) { return e.key === jsonData[j].key; });\n indx = groupDs.indexOf(temp[0]);\n jsonData[j].items = this_1.group(jsonData[j].items, field, aggregates, jsonData.level + 1, groupDs[indx].items, format, isLazyLoad);\n jsonData[j].count = groupDs[indx].count;\n }\n else {\n jsonData[j].items = this_1.group(jsonData[j].items, field, aggregates, jsonData.level + 1, null, format, isLazyLoad);\n jsonData[j].count = jsonData[j].items.length;\n }\n };\n var this_1 = this;\n for (var j = 0; j < jsonData.length; j++) {\n _loop_1(j);\n }\n jsonData.childLevels += 1;\n return jsonData;\n }\n var grouped = {};\n var groupedArray = [];\n groupedArray.GroupGuid = consts[guid];\n groupedArray.level = level;\n groupedArray.childLevels = 0;\n groupedArray.records = jsonData;\n var _loop_2 = function (i) {\n var val = this_2.getVal(jsonData, i, field);\n if (!isNullOrUndefined(format)) {\n val = format(val, field);\n }\n if (!grouped[val]) {\n grouped[val] = {\n key: val,\n count: 0,\n items: [],\n aggregates: {},\n field: field\n };\n groupedArray.push(grouped[val]);\n if (!isNullOrUndefined(groupDs)) {\n var tempObj = groupDs.filter(function (e) { return e.key === grouped[val].key; });\n grouped[val].count = tempObj[0].count;\n }\n }\n grouped[val].count = !isNullOrUndefined(groupDs) ? grouped[val].count : grouped[val].count += 1;\n if (!isLazyLoad || (isLazyLoad && aggregates.length)) {\n grouped[val].items.push(jsonData[i]);\n }\n };\n var this_2 = this;\n for (var i = 0; i < jsonData.length; i++) {\n _loop_2(i);\n }\n if (aggregates && aggregates.length) {\n var _loop_3 = function (i) {\n var res = {};\n var fn = void 0;\n var aggs = aggregates;\n for (var j = 0; j < aggregates.length; j++) {\n fn = DataUtil.aggregates[aggregates[j].type];\n if (!isNullOrUndefined(groupDs)) {\n var temp = groupDs.filter(function (e) { return e.key === groupedArray[i].key; });\n if (fn) {\n res[aggs[j].field + ' - ' + aggs[j].type] = fn(temp[0].items, aggs[j].field);\n }\n }\n else {\n if (fn) {\n res[aggs[j].field + ' - ' + aggs[j].type] = fn(groupedArray[i].items, aggs[j].field);\n }\n }\n }\n groupedArray[i].aggregates = res;\n };\n for (var i = 0; i < groupedArray.length; i++) {\n _loop_3(i);\n }\n }\n if (isLazyLoad && groupedArray.length && aggregates.length) {\n for (var i = 0; i < groupedArray.length; i++) {\n groupedArray[i].items = [];\n }\n }\n return jsonData.length && groupedArray || jsonData;\n };\n /**\n * It is used to categorize the multiple items based on a specific field in jsonArray.\n * The hierarchical queries are commonly required when you use foreign key binding.\n * @param {string} fKey\n * @param {string} from\n * @param {Object[]} source\n * @param {Group} lookup?\n * @param {string} pKey?\n * @hidden\n */\n DataUtil.buildHierarchy = function (fKey, from, source, lookup, pKey) {\n var i;\n var grp = {};\n var temp;\n if (lookup.result) {\n lookup = lookup.result;\n }\n if (lookup.GroupGuid) {\n this.throwError('DataManager: Do not have support Grouping in hierarchy');\n }\n for (i = 0; i < lookup.length; i++) {\n var fKeyData = this.getObject(fKey, lookup[i]);\n temp = grp[fKeyData] || (grp[fKeyData] = []);\n temp.push(lookup[i]);\n }\n for (i = 0; i < source.length; i++) {\n var fKeyData = this.getObject(pKey || fKey, source[i]);\n source[i][from] = grp[fKeyData];\n }\n };\n /**\n * The method used to get the field names which started with specified characters.\n * @param {Object} obj\n * @param {string[]} fields?\n * @param {string} prefix?\n * @hidden\n */\n DataUtil.getFieldList = function (obj, fields, prefix) {\n if (prefix === undefined) {\n prefix = '';\n }\n if (fields === undefined || fields === null) {\n return this.getFieldList(obj, [], prefix);\n }\n var copyObj = obj;\n var keys = Object.keys(obj);\n for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\n var prop = keys_1[_i];\n if (typeof copyObj[prop] === 'object' && !(copyObj[prop] instanceof Array)) {\n this.getFieldList(copyObj[prop], fields, prefix + prop + '.');\n }\n else {\n fields.push(prefix + prop);\n }\n }\n return fields;\n };\n /**\n * Gets the value of the property in the given object.\n * The complex object can be accessed by providing the field names concatenated with dot(.).\n * @param {string} nameSpace - The name of the property to be accessed.\n * @param {Object} from - Defines the source object.\n */\n DataUtil.getObject = function (nameSpace, from) {\n if (!nameSpace) {\n return from;\n }\n if (!from) {\n return undefined;\n }\n if (nameSpace.indexOf('.') === -1) {\n return from[nameSpace];\n }\n var value = from;\n var splits = nameSpace.split('.');\n for (var i = 0; i < splits.length; i++) {\n if (value == null) {\n break;\n }\n value = value[splits[i]];\n }\n return value;\n };\n /**\n * To set value for the nameSpace in desired object.\n * @param {string} nameSpace - String value to the get the inner object.\n * @param {Object} value - Value that you need to set.\n * @param {Object} obj - Object to get the inner object value.\n * @return { [key: string]: Object; } | Object\n * @hidden\n */\n DataUtil.setValue = function (nameSpace, value, obj) {\n var keys = nameSpace.toString().split('.');\n var start = obj || {};\n var fromObj = start;\n var i;\n var length = keys.length;\n var key;\n for (i = 0; i < length; i++) {\n key = keys[i];\n if (i + 1 === length) {\n fromObj[key] = value === undefined ? undefined : value;\n }\n else if (isNullOrUndefined(fromObj[key])) {\n fromObj[key] = {};\n }\n fromObj = fromObj[key];\n }\n return start;\n };\n /**\n * Sort the given data based on the field and comparer.\n * @param {Object[]} ds - Defines the input data.\n * @param {string} field - Defines the field to be sorted.\n * @param {Function} comparer - Defines the comparer function used to sort the records.\n */\n DataUtil.sort = function (ds, field, comparer) {\n if (ds.length <= 1) {\n return ds;\n }\n var middle = parseInt((ds.length / 2).toString(), 10);\n var left = ds.slice(0, middle);\n var right = ds.slice(middle);\n left = this.sort(left, field, comparer);\n right = this.sort(right, field, comparer);\n return this.merge(left, right, field, comparer);\n };\n DataUtil.ignoreDiacritics = function (value) {\n if (typeof value !== 'string') {\n return value;\n }\n var result = value.split('');\n var newValue = result.map(function (temp) { return temp in DataUtil.diacritics ? DataUtil.diacritics[temp] : temp; });\n return newValue.join('');\n };\n DataUtil.merge = function (left, right, fieldName, comparer) {\n var result = [];\n var current;\n while (left.length > 0 || right.length > 0) {\n if (left.length > 0 && right.length > 0) {\n if (comparer) {\n current = comparer(this.getVal(left, 0, fieldName), this.getVal(right, 0, fieldName), left[0], right[0]) <= 0 ? left : right;\n }\n else {\n current = left[0][fieldName] < left[0][fieldName] ? left : right;\n }\n }\n else {\n current = left.length > 0 ? left : right;\n }\n result.push(current.shift());\n }\n return result;\n };\n DataUtil.getVal = function (array, index, field) {\n return field ? this.getObject(field, array[index]) : array[index];\n };\n DataUtil.toLowerCase = function (val) {\n return val ? typeof val === 'string' ? val.toLowerCase() : val.toString() : (val === 0 || val === false) ? val.toString() : '';\n };\n /**\n * To perform the filter operation with specified adaptor and returns the result.\n * @param {Object} adaptor\n * @param {string} fnName\n * @param {Object} param1?\n * @param {Object} param2?\n * @hidden\n */\n DataUtil.callAdaptorFunction = function (adaptor, fnName, param1, param2) {\n if (fnName in adaptor) {\n var res = adaptor[fnName](param1, param2);\n if (!isNullOrUndefined(res)) {\n param1 = res;\n }\n }\n return param1;\n };\n DataUtil.getAddParams = function (adp, dm, query) {\n var req = {};\n DataUtil.callAdaptorFunction(adp, 'addParams', {\n dm: dm,\n query: query,\n params: query.params,\n reqParams: req\n });\n return req;\n };\n /**\n * Checks wheather the given input is a plain object or not.\n * @param {Object|Object[]} obj\n */\n DataUtil.isPlainObject = function (obj) {\n return (!!obj) && (obj.constructor === Object);\n };\n /**\n * Returns true when the browser cross origin request.\n */\n DataUtil.isCors = function () {\n var xhr = null;\n var request = 'XMLHttpRequest';\n try {\n xhr = new window[request]();\n }\n catch (e) {\n // No exception handling\n }\n return !!xhr && ('withCredentials' in xhr);\n };\n /**\n * Generate random GUID value which will be prefixed with the given value.\n * @param {string} prefix\n */\n DataUtil.getGuid = function (prefix) {\n var hexs = '0123456789abcdef';\n var rand;\n return (prefix || '') + '00000000-0000-4000-0000-000000000000'.replace(/0/g, function (val, i) {\n if ('crypto' in window && 'getRandomValues' in crypto) {\n var arr = new Uint8Array(1);\n window.crypto.getRandomValues(arr);\n rand = arr[0] % 16 | 0;\n }\n else {\n rand = Math.random() * 16 | 0;\n }\n return hexs[i === 19 ? rand & 0x3 | 0x8 : rand];\n });\n };\n /**\n * Checks wheather the given value is null or not.\n * @param {string|Object} val\n * @returns boolean\n */\n DataUtil.isNull = function (val) {\n return val === undefined || val === null;\n };\n /**\n * To get the required items from collection of objects.\n * @param {Object[]} array\n * @param {string} field\n * @param {Function} comparer\n * @returns Object\n * @hidden\n */\n DataUtil.getItemFromComparer = function (array, field, comparer) {\n var keyVal;\n var current;\n var key;\n var i = 0;\n var castRequired = typeof DataUtil.getVal(array, 0, field) === 'string';\n if (array.length) {\n while (isNullOrUndefined(keyVal) && i < array.length) {\n keyVal = DataUtil.getVal(array, i, field);\n key = array[i++];\n }\n }\n for (; i < array.length; i++) {\n current = DataUtil.getVal(array, i, field);\n if (isNullOrUndefined(current)) {\n continue;\n }\n if (castRequired) {\n keyVal = +keyVal;\n current = +current;\n }\n if (comparer(keyVal, current) > 0) {\n keyVal = current;\n key = array[i];\n }\n }\n return key;\n };\n /**\n * To get distinct values of Array or Array of Objects.\n * @param {Object[]} json\n * @param {string} field\n * @param {boolean} requiresCompleteRecord\n * @returns Object[]\n * * distinct array of objects is return when requiresCompleteRecord set as true.\n * @hidden\n */\n DataUtil.distinct = function (json, fieldName, requiresCompleteRecord) {\n requiresCompleteRecord = isNullOrUndefined(requiresCompleteRecord) ? false : requiresCompleteRecord;\n var result = [];\n var val;\n var tmp = {};\n json.forEach(function (data, index) {\n val = typeof (json[index]) === 'object' ? DataUtil.getVal(json, index, fieldName) : json[index];\n if (!(val in tmp)) {\n result.push(!requiresCompleteRecord ? val : json[index]);\n tmp[val] = 1;\n }\n });\n return result;\n };\n /**\n * Process the given records based on the datamanager string.\n * @param {string} datamanager\n * @param {Object[]} records\n */\n DataUtil.processData = function (dm, records) {\n var query = this.prepareQuery(dm);\n var sampledata = new DataManager(records);\n if (dm.requiresCounts) {\n query.requiresCount();\n }\n var result = sampledata.executeLocal(query);\n var returnValue = {\n result: dm.requiresCounts ? result.result : result,\n count: result.count,\n aggregates: JSON.stringify(result.aggregates)\n };\n return dm.requiresCounts ? returnValue : result;\n };\n DataUtil.prepareQuery = function (dm) {\n var _this = this;\n var query = new Query();\n if (dm.select) {\n query.select(dm.select);\n }\n if (dm.where) {\n var where = DataUtil.parse.parseJson(dm.where);\n where.filter(function (pred) {\n if (isNullOrUndefined(pred.condition)) {\n query.where(pred.field, pred.operator, pred.value, pred.ignoreCase, pred.ignoreAccent);\n }\n else {\n var predicateList = [];\n if (pred.field) {\n predicateList.push(new Predicate(pred.field, pred.operator, pred.value, pred.ignoreCase, pred.ignoreAccent));\n }\n else {\n predicateList = predicateList.concat(_this.getPredicate(pred.predicates));\n }\n if (pred.condition == 'or') {\n query.where(Predicate.or(predicateList));\n }\n else if (pred.condition == 'and') {\n query.where(Predicate.and(predicateList));\n }\n }\n });\n }\n if (dm.search) {\n var search = DataUtil.parse.parseJson(dm.search);\n search.filter(function (e) { return query.search(e.key, e.fields, e['operator'], e['ignoreCase'], e['ignoreAccent']); });\n }\n if (dm.aggregates) {\n dm.aggregates.filter(function (e) { return query.aggregate(e.type, e.field); });\n }\n if (dm.sorted) {\n dm.sorted.filter(function (e) { return query.sortBy(e.name, e.direction); });\n }\n if (dm.skip) {\n query.skip(dm.skip);\n }\n if (dm.take) {\n query.take(dm.take);\n }\n if (dm.group) {\n dm.group.filter(function (grp) { return query.group(grp); });\n }\n return query;\n };\n DataUtil.getPredicate = function (pred) {\n var mainPred = [];\n for (var i = 0; i < pred.length; i++) {\n var e = pred[i];\n if (e.field) {\n mainPred.push(new Predicate(e.field, e.operator, e.value, e.ignoreCase, e.ignoreAccent));\n }\n else {\n var childPred = [];\n var cpre = this.getPredicate(e.predicates);\n for (var _i = 0, _a = Object.keys(cpre); _i < _a.length; _i++) {\n var prop = _a[_i];\n childPred.push(cpre[prop]);\n }\n mainPred.push(e.condition == 'or' ? Predicate.or(childPred) : Predicate.and(childPred));\n }\n }\n return mainPred;\n };\n /**\n * Specifies the value which will be used to adjust the date value to server timezone.\n * @default null\n */\n DataUtil.serverTimezoneOffset = null;\n /**\n * Species whether are not to be parsed with serverTimezoneOffset value.\n * @hidden\n */\n DataUtil.timeZoneHandling = true;\n /**\n * Throw error with the given string as message.\n * @param {string} er\n */\n DataUtil.throwError = function (error) {\n try {\n throw new Error(error);\n }\n catch (e) {\n throw e.message + '\\n' + e.stack;\n }\n };\n DataUtil.aggregates = {\n /**\n * Calculate sum of the given field in the data.\n * @param {Object[]} ds\n * @param {string} field\n */\n sum: function (ds, field) {\n var result = 0;\n var val;\n var castRequired = typeof DataUtil.getVal(ds, 0, field) !== 'number';\n for (var i = 0; i < ds.length; i++) {\n val = DataUtil.getVal(ds, i, field);\n if (!isNaN(val) && val !== null) {\n if (castRequired) {\n val = +val;\n }\n result += val;\n }\n }\n return result;\n },\n /**\n * Calculate average value of the given field in the data.\n * @param {Object[]} ds\n * @param {string} field\n */\n average: function (ds, field) {\n return DataUtil.aggregates.sum(ds, field) / ds.length;\n },\n /**\n * Returns the min value of the data based on the field.\n * @param {Object[]} ds\n * @param {string|Function} field\n */\n min: function (ds, field) {\n var comparer;\n if (typeof field === 'function') {\n comparer = field;\n field = null;\n }\n return DataUtil.getObject(field, DataUtil.getItemFromComparer(ds, field, comparer || DataUtil.fnAscending));\n },\n /**\n * Returns the max value of the data based on the field.\n * @param {Object[]} ds\n * @param {string} field\n * @returns number\n */\n max: function (ds, field) {\n var comparer;\n if (typeof field === 'function') {\n comparer = field;\n field = null;\n }\n return DataUtil.getObject(field, DataUtil.getItemFromComparer(ds, field, comparer || DataUtil.fnDescending));\n },\n /**\n * Returns the total number of true value present in the data based on the given boolean field name.\n * @param {Object[]} ds\n * @param {string} field\n */\n truecount: function (ds, field) {\n return new DataManager(ds).executeLocal(new Query().where(field, 'equal', true, true)).length;\n },\n /**\n * Returns the total number of false value present in the data based on the given boolean field name.\n * @param {Object[]} ds\n * @param {string} field\n */\n falsecount: function (ds, field) {\n return new DataManager(ds).executeLocal(new Query().where(field, 'equal', false, true)).length;\n },\n /**\n * Returns the length of the given data.\n * @param {Object[]} ds\n * @param {string} field?\n * @returns number\n */\n count: function (ds, field) {\n return ds.length;\n }\n };\n /**\n * Specifies the Object with filter operators.\n */\n DataUtil.operatorSymbols = {\n '<': 'lessthan',\n '>': 'greaterthan',\n '<=': 'lessthanorequal',\n '>=': 'greaterthanorequal',\n '==': 'equal',\n '!=': 'notequal',\n '*=': 'contains',\n '$=': 'endswith',\n '^=': 'startswith'\n };\n /**\n * Specifies the Object with filter operators which will be used for OData filter query generation.\n * * It will be used for date/number type filter query.\n */\n DataUtil.odBiOperator = {\n '<': ' lt ',\n '>': ' gt ',\n '<=': ' le ',\n '>=': ' ge ',\n '==': ' eq ',\n '!=': ' ne ',\n 'lessthan': ' lt ',\n 'lessthanorequal': ' le ',\n 'greaterthan': ' gt ',\n 'greaterthanorequal': ' ge ',\n 'equal': ' eq ',\n 'notequal': ' ne '\n };\n /**\n * Specifies the Object with filter operators which will be used for OData filter query generation.\n * It will be used for string type filter query.\n */\n DataUtil.odUniOperator = {\n '$=': 'endswith',\n '^=': 'startswith',\n '*=': 'substringof',\n 'endswith': 'endswith',\n 'startswith': 'startswith',\n 'contains': 'substringof'\n };\n /**\n * Specifies the Object with filter operators which will be used for ODataV4 filter query generation.\n * It will be used for string type filter query.\n */\n DataUtil.odv4UniOperator = {\n '$=': 'endswith',\n '^=': 'startswith',\n '*=': 'contains',\n 'endswith': 'endswith',\n 'startswith': 'startswith',\n 'contains': 'contains'\n };\n DataUtil.diacritics = {\n '\\u24B6': 'A',\n '\\uFF21': 'A',\n '\\u00C0': 'A',\n '\\u00C1': 'A',\n '\\u00C2': 'A',\n '\\u1EA6': 'A',\n '\\u1EA4': 'A',\n '\\u1EAA': 'A',\n '\\u1EA8': 'A',\n '\\u00C3': 'A',\n '\\u0100': 'A',\n '\\u0102': 'A',\n '\\u1EB0': 'A',\n '\\u1EAE': 'A',\n '\\u1EB4': 'A',\n '\\u1EB2': 'A',\n '\\u0226': 'A',\n '\\u01E0': 'A',\n '\\u00C4': 'A',\n '\\u01DE': 'A',\n '\\u1EA2': 'A',\n '\\u00C5': 'A',\n '\\u01FA': 'A',\n '\\u01CD': 'A',\n '\\u0200': 'A',\n '\\u0202': 'A',\n '\\u1EA0': 'A',\n '\\u1EAC': 'A',\n '\\u1EB6': 'A',\n '\\u1E00': 'A',\n '\\u0104': 'A',\n '\\u023A': 'A',\n '\\u2C6F': 'A',\n '\\uA732': 'AA',\n '\\u00C6': 'AE',\n '\\u01FC': 'AE',\n '\\u01E2': 'AE',\n '\\uA734': 'AO',\n '\\uA736': 'AU',\n '\\uA738': 'AV',\n '\\uA73A': 'AV',\n '\\uA73C': 'AY',\n '\\u24B7': 'B',\n '\\uFF22': 'B',\n '\\u1E02': 'B',\n '\\u1E04': 'B',\n '\\u1E06': 'B',\n '\\u0243': 'B',\n '\\u0182': 'B',\n '\\u0181': 'B',\n '\\u24B8': 'C',\n '\\uFF23': 'C',\n '\\u0106': 'C',\n '\\u0108': 'C',\n '\\u010A': 'C',\n '\\u010C': 'C',\n '\\u00C7': 'C',\n '\\u1E08': 'C',\n '\\u0187': 'C',\n '\\u023B': 'C',\n '\\uA73E': 'C',\n '\\u24B9': 'D',\n '\\uFF24': 'D',\n '\\u1E0A': 'D',\n '\\u010E': 'D',\n '\\u1E0C': 'D',\n '\\u1E10': 'D',\n '\\u1E12': 'D',\n '\\u1E0E': 'D',\n '\\u0110': 'D',\n '\\u018B': 'D',\n '\\u018A': 'D',\n '\\u0189': 'D',\n '\\uA779': 'D',\n '\\u01F1': 'DZ',\n '\\u01C4': 'DZ',\n '\\u01F2': 'Dz',\n '\\u01C5': 'Dz',\n '\\u24BA': 'E',\n '\\uFF25': 'E',\n '\\u00C8': 'E',\n '\\u00C9': 'E',\n '\\u00CA': 'E',\n '\\u1EC0': 'E',\n '\\u1EBE': 'E',\n '\\u1EC4': 'E',\n '\\u1EC2': 'E',\n '\\u1EBC': 'E',\n '\\u0112': 'E',\n '\\u1E14': 'E',\n '\\u1E16': 'E',\n '\\u0114': 'E',\n '\\u0116': 'E',\n '\\u00CB': 'E',\n '\\u1EBA': 'E',\n '\\u011A': 'E',\n '\\u0204': 'E',\n '\\u0206': 'E',\n '\\u1EB8': 'E',\n '\\u1EC6': 'E',\n '\\u0228': 'E',\n '\\u1E1C': 'E',\n '\\u0118': 'E',\n '\\u1E18': 'E',\n '\\u1E1A': 'E',\n '\\u0190': 'E',\n '\\u018E': 'E',\n '\\u24BB': 'F',\n '\\uFF26': 'F',\n '\\u1E1E': 'F',\n '\\u0191': 'F',\n '\\uA77B': 'F',\n '\\u24BC': 'G',\n '\\uFF27': 'G',\n '\\u01F4': 'G',\n '\\u011C': 'G',\n '\\u1E20': 'G',\n '\\u011E': 'G',\n '\\u0120': 'G',\n '\\u01E6': 'G',\n '\\u0122': 'G',\n '\\u01E4': 'G',\n '\\u0193': 'G',\n '\\uA7A0': 'G',\n '\\uA77D': 'G',\n '\\uA77E': 'G',\n '\\u24BD': 'H',\n '\\uFF28': 'H',\n '\\u0124': 'H',\n '\\u1E22': 'H',\n '\\u1E26': 'H',\n '\\u021E': 'H',\n '\\u1E24': 'H',\n '\\u1E28': 'H',\n '\\u1E2A': 'H',\n '\\u0126': 'H',\n '\\u2C67': 'H',\n '\\u2C75': 'H',\n '\\uA78D': 'H',\n '\\u24BE': 'I',\n '\\uFF29': 'I',\n '\\u00CC': 'I',\n '\\u00CD': 'I',\n '\\u00CE': 'I',\n '\\u0128': 'I',\n '\\u012A': 'I',\n '\\u012C': 'I',\n '\\u0130': 'I',\n '\\u00CF': 'I',\n '\\u1E2E': 'I',\n '\\u1EC8': 'I',\n '\\u01CF': 'I',\n '\\u0208': 'I',\n '\\u020A': 'I',\n '\\u1ECA': 'I',\n '\\u012E': 'I',\n '\\u1E2C': 'I',\n '\\u0197': 'I',\n '\\u24BF': 'J',\n '\\uFF2A': 'J',\n '\\u0134': 'J',\n '\\u0248': 'J',\n '\\u24C0': 'K',\n '\\uFF2B': 'K',\n '\\u1E30': 'K',\n '\\u01E8': 'K',\n '\\u1E32': 'K',\n '\\u0136': 'K',\n '\\u1E34': 'K',\n '\\u0198': 'K',\n '\\u2C69': 'K',\n '\\uA740': 'K',\n '\\uA742': 'K',\n '\\uA744': 'K',\n '\\uA7A2': 'K',\n '\\u24C1': 'L',\n '\\uFF2C': 'L',\n '\\u013F': 'L',\n '\\u0139': 'L',\n '\\u013D': 'L',\n '\\u1E36': 'L',\n '\\u1E38': 'L',\n '\\u013B': 'L',\n '\\u1E3C': 'L',\n '\\u1E3A': 'L',\n '\\u0141': 'L',\n '\\u023D': 'L',\n '\\u2C62': 'L',\n '\\u2C60': 'L',\n '\\uA748': 'L',\n '\\uA746': 'L',\n '\\uA780': 'L',\n '\\u01C7': 'LJ',\n '\\u01C8': 'Lj',\n '\\u24C2': 'M',\n '\\uFF2D': 'M',\n '\\u1E3E': 'M',\n '\\u1E40': 'M',\n '\\u1E42': 'M',\n '\\u2C6E': 'M',\n '\\u019C': 'M',\n '\\u24C3': 'N',\n '\\uFF2E': 'N',\n '\\u01F8': 'N',\n '\\u0143': 'N',\n '\\u00D1': 'N',\n '\\u1E44': 'N',\n '\\u0147': 'N',\n '\\u1E46': 'N',\n '\\u0145': 'N',\n '\\u1E4A': 'N',\n '\\u1E48': 'N',\n '\\u0220': 'N',\n '\\u019D': 'N',\n '\\uA790': 'N',\n '\\uA7A4': 'N',\n '\\u01CA': 'NJ',\n '\\u01CB': 'Nj',\n '\\u24C4': 'O',\n '\\uFF2F': 'O',\n '\\u00D2': 'O',\n '\\u00D3': 'O',\n '\\u00D4': 'O',\n '\\u1ED2': 'O',\n '\\u1ED0': 'O',\n '\\u1ED6': 'O',\n '\\u1ED4': 'O',\n '\\u00D5': 'O',\n '\\u1E4C': 'O',\n '\\u022C': 'O',\n '\\u1E4E': 'O',\n '\\u014C': 'O',\n '\\u1E50': 'O',\n '\\u1E52': 'O',\n '\\u014E': 'O',\n '\\u022E': 'O',\n '\\u0230': 'O',\n '\\u00D6': 'O',\n '\\u022A': 'O',\n '\\u1ECE': 'O',\n '\\u0150': 'O',\n '\\u01D1': 'O',\n '\\u020C': 'O',\n '\\u020E': 'O',\n '\\u01A0': 'O',\n '\\u1EDC': 'O',\n '\\u1EDA': 'O',\n '\\u1EE0': 'O',\n '\\u1EDE': 'O',\n '\\u1EE2': 'O',\n '\\u1ECC': 'O',\n '\\u1ED8': 'O',\n '\\u01EA': 'O',\n '\\u01EC': 'O',\n '\\u00D8': 'O',\n '\\u01FE': 'O',\n '\\u0186': 'O',\n '\\u019F': 'O',\n '\\uA74A': 'O',\n '\\uA74C': 'O',\n '\\u01A2': 'OI',\n '\\uA74E': 'OO',\n '\\u0222': 'OU',\n '\\u24C5': 'P',\n '\\uFF30': 'P',\n '\\u1E54': 'P',\n '\\u1E56': 'P',\n '\\u01A4': 'P',\n '\\u2C63': 'P',\n '\\uA750': 'P',\n '\\uA752': 'P',\n '\\uA754': 'P',\n '\\u24C6': 'Q',\n '\\uFF31': 'Q',\n '\\uA756': 'Q',\n '\\uA758': 'Q',\n '\\u024A': 'Q',\n '\\u24C7': 'R',\n '\\uFF32': 'R',\n '\\u0154': 'R',\n '\\u1E58': 'R',\n '\\u0158': 'R',\n '\\u0210': 'R',\n '\\u0212': 'R',\n '\\u1E5A': 'R',\n '\\u1E5C': 'R',\n '\\u0156': 'R',\n '\\u1E5E': 'R',\n '\\u024C': 'R',\n '\\u2C64': 'R',\n '\\uA75A': 'R',\n '\\uA7A6': 'R',\n '\\uA782': 'R',\n '\\u24C8': 'S',\n '\\uFF33': 'S',\n '\\u1E9E': 'S',\n '\\u015A': 'S',\n '\\u1E64': 'S',\n '\\u015C': 'S',\n '\\u1E60': 'S',\n '\\u0160': 'S',\n '\\u1E66': 'S',\n '\\u1E62': 'S',\n '\\u1E68': 'S',\n '\\u0218': 'S',\n '\\u015E': 'S',\n '\\u2C7E': 'S',\n '\\uA7A8': 'S',\n '\\uA784': 'S',\n '\\u24C9': 'T',\n '\\uFF34': 'T',\n '\\u1E6A': 'T',\n '\\u0164': 'T',\n '\\u1E6C': 'T',\n '\\u021A': 'T',\n '\\u0162': 'T',\n '\\u1E70': 'T',\n '\\u1E6E': 'T',\n '\\u0166': 'T',\n '\\u01AC': 'T',\n '\\u01AE': 'T',\n '\\u023E': 'T',\n '\\uA786': 'T',\n '\\uA728': 'TZ',\n '\\u24CA': 'U',\n '\\uFF35': 'U',\n '\\u00D9': 'U',\n '\\u00DA': 'U',\n '\\u00DB': 'U',\n '\\u0168': 'U',\n '\\u1E78': 'U',\n '\\u016A': 'U',\n '\\u1E7A': 'U',\n '\\u016C': 'U',\n '\\u00DC': 'U',\n '\\u01DB': 'U',\n '\\u01D7': 'U',\n '\\u01D5': 'U',\n '\\u01D9': 'U',\n '\\u1EE6': 'U',\n '\\u016E': 'U',\n '\\u0170': 'U',\n '\\u01D3': 'U',\n '\\u0214': 'U',\n '\\u0216': 'U',\n '\\u01AF': 'U',\n '\\u1EEA': 'U',\n '\\u1EE8': 'U',\n '\\u1EEE': 'U',\n '\\u1EEC': 'U',\n '\\u1EF0': 'U',\n '\\u1EE4': 'U',\n '\\u1E72': 'U',\n '\\u0172': 'U',\n '\\u1E76': 'U',\n '\\u1E74': 'U',\n '\\u0244': 'U',\n '\\u24CB': 'V',\n '\\uFF36': 'V',\n '\\u1E7C': 'V',\n '\\u1E7E': 'V',\n '\\u01B2': 'V',\n '\\uA75E': 'V',\n '\\u0245': 'V',\n '\\uA760': 'VY',\n '\\u24CC': 'W',\n '\\uFF37': 'W',\n '\\u1E80': 'W',\n '\\u1E82': 'W',\n '\\u0174': 'W',\n '\\u1E86': 'W',\n '\\u1E84': 'W',\n '\\u1E88': 'W',\n '\\u2C72': 'W',\n '\\u24CD': 'X',\n '\\uFF38': 'X',\n '\\u1E8A': 'X',\n '\\u1E8C': 'X',\n '\\u24CE': 'Y',\n '\\uFF39': 'Y',\n '\\u1EF2': 'Y',\n '\\u00DD': 'Y',\n '\\u0176': 'Y',\n '\\u1EF8': 'Y',\n '\\u0232': 'Y',\n '\\u1E8E': 'Y',\n '\\u0178': 'Y',\n '\\u1EF6': 'Y',\n '\\u1EF4': 'Y',\n '\\u01B3': 'Y',\n '\\u024E': 'Y',\n '\\u1EFE': 'Y',\n '\\u24CF': 'Z',\n '\\uFF3A': 'Z',\n '\\u0179': 'Z',\n '\\u1E90': 'Z',\n '\\u017B': 'Z',\n '\\u017D': 'Z',\n '\\u1E92': 'Z',\n '\\u1E94': 'Z',\n '\\u01B5': 'Z',\n '\\u0224': 'Z',\n '\\u2C7F': 'Z',\n '\\u2C6B': 'Z',\n '\\uA762': 'Z',\n '\\u24D0': 'a',\n '\\uFF41': 'a',\n '\\u1E9A': 'a',\n '\\u00E0': 'a',\n '\\u00E1': 'a',\n '\\u00E2': 'a',\n '\\u1EA7': 'a',\n '\\u1EA5': 'a',\n '\\u1EAB': 'a',\n '\\u1EA9': 'a',\n '\\u00E3': 'a',\n '\\u0101': 'a',\n '\\u0103': 'a',\n '\\u1EB1': 'a',\n '\\u1EAF': 'a',\n '\\u1EB5': 'a',\n '\\u1EB3': 'a',\n '\\u0227': 'a',\n '\\u01E1': 'a',\n '\\u00E4': 'a',\n '\\u01DF': 'a',\n '\\u1EA3': 'a',\n '\\u00E5': 'a',\n '\\u01FB': 'a',\n '\\u01CE': 'a',\n '\\u0201': 'a',\n '\\u0203': 'a',\n '\\u1EA1': 'a',\n '\\u1EAD': 'a',\n '\\u1EB7': 'a',\n '\\u1E01': 'a',\n '\\u0105': 'a',\n '\\u2C65': 'a',\n '\\u0250': 'a',\n '\\uA733': 'aa',\n '\\u00E6': 'ae',\n '\\u01FD': 'ae',\n '\\u01E3': 'ae',\n '\\uA735': 'ao',\n '\\uA737': 'au',\n '\\uA739': 'av',\n '\\uA73B': 'av',\n '\\uA73D': 'ay',\n '\\u24D1': 'b',\n '\\uFF42': 'b',\n '\\u1E03': 'b',\n '\\u1E05': 'b',\n '\\u1E07': 'b',\n '\\u0180': 'b',\n '\\u0183': 'b',\n '\\u0253': 'b',\n '\\u24D2': 'c',\n '\\uFF43': 'c',\n '\\u0107': 'c',\n '\\u0109': 'c',\n '\\u010B': 'c',\n '\\u010D': 'c',\n '\\u00E7': 'c',\n '\\u1E09': 'c',\n '\\u0188': 'c',\n '\\u023C': 'c',\n '\\uA73F': 'c',\n '\\u2184': 'c',\n '\\u24D3': 'd',\n '\\uFF44': 'd',\n '\\u1E0B': 'd',\n '\\u010F': 'd',\n '\\u1E0D': 'd',\n '\\u1E11': 'd',\n '\\u1E13': 'd',\n '\\u1E0F': 'd',\n '\\u0111': 'd',\n '\\u018C': 'd',\n '\\u0256': 'd',\n '\\u0257': 'd',\n '\\uA77A': 'd',\n '\\u01F3': 'dz',\n '\\u01C6': 'dz',\n '\\u24D4': 'e',\n '\\uFF45': 'e',\n '\\u00E8': 'e',\n '\\u00E9': 'e',\n '\\u00EA': 'e',\n '\\u1EC1': 'e',\n '\\u1EBF': 'e',\n '\\u1EC5': 'e',\n '\\u1EC3': 'e',\n '\\u1EBD': 'e',\n '\\u0113': 'e',\n '\\u1E15': 'e',\n '\\u1E17': 'e',\n '\\u0115': 'e',\n '\\u0117': 'e',\n '\\u00EB': 'e',\n '\\u1EBB': 'e',\n '\\u011B': 'e',\n '\\u0205': 'e',\n '\\u0207': 'e',\n '\\u1EB9': 'e',\n '\\u1EC7': 'e',\n '\\u0229': 'e',\n '\\u1E1D': 'e',\n '\\u0119': 'e',\n '\\u1E19': 'e',\n '\\u1E1B': 'e',\n '\\u0247': 'e',\n '\\u025B': 'e',\n '\\u01DD': 'e',\n '\\u24D5': 'f',\n '\\uFF46': 'f',\n '\\u1E1F': 'f',\n '\\u0192': 'f',\n '\\uA77C': 'f',\n '\\u24D6': 'g',\n '\\uFF47': 'g',\n '\\u01F5': 'g',\n '\\u011D': 'g',\n '\\u1E21': 'g',\n '\\u011F': 'g',\n '\\u0121': 'g',\n '\\u01E7': 'g',\n '\\u0123': 'g',\n '\\u01E5': 'g',\n '\\u0260': 'g',\n '\\uA7A1': 'g',\n '\\u1D79': 'g',\n '\\uA77F': 'g',\n '\\u24D7': 'h',\n '\\uFF48': 'h',\n '\\u0125': 'h',\n '\\u1E23': 'h',\n '\\u1E27': 'h',\n '\\u021F': 'h',\n '\\u1E25': 'h',\n '\\u1E29': 'h',\n '\\u1E2B': 'h',\n '\\u1E96': 'h',\n '\\u0127': 'h',\n '\\u2C68': 'h',\n '\\u2C76': 'h',\n '\\u0265': 'h',\n '\\u0195': 'hv',\n '\\u24D8': 'i',\n '\\uFF49': 'i',\n '\\u00EC': 'i',\n '\\u00ED': 'i',\n '\\u00EE': 'i',\n '\\u0129': 'i',\n '\\u012B': 'i',\n '\\u012D': 'i',\n '\\u00EF': 'i',\n '\\u1E2F': 'i',\n '\\u1EC9': 'i',\n '\\u01D0': 'i',\n '\\u0209': 'i',\n '\\u020B': 'i',\n '\\u1ECB': 'i',\n '\\u012F': 'i',\n '\\u1E2D': 'i',\n '\\u0268': 'i',\n '\\u0131': 'i',\n '\\u24D9': 'j',\n '\\uFF4A': 'j',\n '\\u0135': 'j',\n '\\u01F0': 'j',\n '\\u0249': 'j',\n '\\u24DA': 'k',\n '\\uFF4B': 'k',\n '\\u1E31': 'k',\n '\\u01E9': 'k',\n '\\u1E33': 'k',\n '\\u0137': 'k',\n '\\u1E35': 'k',\n '\\u0199': 'k',\n '\\u2C6A': 'k',\n '\\uA741': 'k',\n '\\uA743': 'k',\n '\\uA745': 'k',\n '\\uA7A3': 'k',\n '\\u24DB': 'l',\n '\\uFF4C': 'l',\n '\\u0140': 'l',\n '\\u013A': 'l',\n '\\u013E': 'l',\n '\\u1E37': 'l',\n '\\u1E39': 'l',\n '\\u013C': 'l',\n '\\u1E3D': 'l',\n '\\u1E3B': 'l',\n '\\u017F': 'l',\n '\\u0142': 'l',\n '\\u019A': 'l',\n '\\u026B': 'l',\n '\\u2C61': 'l',\n '\\uA749': 'l',\n '\\uA781': 'l',\n '\\uA747': 'l',\n '\\u01C9': 'lj',\n '\\u24DC': 'm',\n '\\uFF4D': 'm',\n '\\u1E3F': 'm',\n '\\u1E41': 'm',\n '\\u1E43': 'm',\n '\\u0271': 'm',\n '\\u026F': 'm',\n '\\u24DD': 'n',\n '\\uFF4E': 'n',\n '\\u01F9': 'n',\n '\\u0144': 'n',\n '\\u00F1': 'n',\n '\\u1E45': 'n',\n '\\u0148': 'n',\n '\\u1E47': 'n',\n '\\u0146': 'n',\n '\\u1E4B': 'n',\n '\\u1E49': 'n',\n '\\u019E': 'n',\n '\\u0272': 'n',\n '\\u0149': 'n',\n '\\uA791': 'n',\n '\\uA7A5': 'n',\n '\\u01CC': 'nj',\n '\\u24DE': 'o',\n '\\uFF4F': 'o',\n '\\u00F2': 'o',\n '\\u00F3': 'o',\n '\\u00F4': 'o',\n '\\u1ED3': 'o',\n '\\u1ED1': 'o',\n '\\u1ED7': 'o',\n '\\u1ED5': 'o',\n '\\u00F5': 'o',\n '\\u1E4D': 'o',\n '\\u022D': 'o',\n '\\u1E4F': 'o',\n '\\u014D': 'o',\n '\\u1E51': 'o',\n '\\u1E53': 'o',\n '\\u014F': 'o',\n '\\u022F': 'o',\n '\\u0231': 'o',\n '\\u00F6': 'o',\n '\\u022B': 'o',\n '\\u1ECF': 'o',\n '\\u0151': 'o',\n '\\u01D2': 'o',\n '\\u020D': 'o',\n '\\u020F': 'o',\n '\\u01A1': 'o',\n '\\u1EDD': 'o',\n '\\u1EDB': 'o',\n '\\u1EE1': 'o',\n '\\u1EDF': 'o',\n '\\u1EE3': 'o',\n '\\u1ECD': 'o',\n '\\u1ED9': 'o',\n '\\u01EB': 'o',\n '\\u01ED': 'o',\n '\\u00F8': 'o',\n '\\u01FF': 'o',\n '\\u0254': 'o',\n '\\uA74B': 'o',\n '\\uA74D': 'o',\n '\\u0275': 'o',\n '\\u01A3': 'oi',\n '\\u0223': 'ou',\n '\\uA74F': 'oo',\n '\\u24DF': 'p',\n '\\uFF50': 'p',\n '\\u1E55': 'p',\n '\\u1E57': 'p',\n '\\u01A5': 'p',\n '\\u1D7D': 'p',\n '\\uA751': 'p',\n '\\uA753': 'p',\n '\\uA755': 'p',\n '\\u24E0': 'q',\n '\\uFF51': 'q',\n '\\u024B': 'q',\n '\\uA757': 'q',\n '\\uA759': 'q',\n '\\u24E1': 'r',\n '\\uFF52': 'r',\n '\\u0155': 'r',\n '\\u1E59': 'r',\n '\\u0159': 'r',\n '\\u0211': 'r',\n '\\u0213': 'r',\n '\\u1E5B': 'r',\n '\\u1E5D': 'r',\n '\\u0157': 'r',\n '\\u1E5F': 'r',\n '\\u024D': 'r',\n '\\u027D': 'r',\n '\\uA75B': 'r',\n '\\uA7A7': 'r',\n '\\uA783': 'r',\n '\\u24E2': 's',\n '\\uFF53': 's',\n '\\u00DF': 's',\n '\\u015B': 's',\n '\\u1E65': 's',\n '\\u015D': 's',\n '\\u1E61': 's',\n '\\u0161': 's',\n '\\u1E67': 's',\n '\\u1E63': 's',\n '\\u1E69': 's',\n '\\u0219': 's',\n '\\u015F': 's',\n '\\u023F': 's',\n '\\uA7A9': 's',\n '\\uA785': 's',\n '\\u1E9B': 's',\n '\\u24E3': 't',\n '\\uFF54': 't',\n '\\u1E6B': 't',\n '\\u1E97': 't',\n '\\u0165': 't',\n '\\u1E6D': 't',\n '\\u021B': 't',\n '\\u0163': 't',\n '\\u1E71': 't',\n '\\u1E6F': 't',\n '\\u0167': 't',\n '\\u01AD': 't',\n '\\u0288': 't',\n '\\u2C66': 't',\n '\\uA787': 't',\n '\\uA729': 'tz',\n '\\u24E4': 'u',\n '\\uFF55': 'u',\n '\\u00F9': 'u',\n '\\u00FA': 'u',\n '\\u00FB': 'u',\n '\\u0169': 'u',\n '\\u1E79': 'u',\n '\\u016B': 'u',\n '\\u1E7B': 'u',\n '\\u016D': 'u',\n '\\u00FC': 'u',\n '\\u01DC': 'u',\n '\\u01D8': 'u',\n '\\u01D6': 'u',\n '\\u01DA': 'u',\n '\\u1EE7': 'u',\n '\\u016F': 'u',\n '\\u0171': 'u',\n '\\u01D4': 'u',\n '\\u0215': 'u',\n '\\u0217': 'u',\n '\\u01B0': 'u',\n '\\u1EEB': 'u',\n '\\u1EE9': 'u',\n '\\u1EEF': 'u',\n '\\u1EED': 'u',\n '\\u1EF1': 'u',\n '\\u1EE5': 'u',\n '\\u1E73': 'u',\n '\\u0173': 'u',\n '\\u1E77': 'u',\n '\\u1E75': 'u',\n '\\u0289': 'u',\n '\\u24E5': 'v',\n '\\uFF56': 'v',\n '\\u1E7D': 'v',\n '\\u1E7F': 'v',\n '\\u028B': 'v',\n '\\uA75F': 'v',\n '\\u028C': 'v',\n '\\uA761': 'vy',\n '\\u24E6': 'w',\n '\\uFF57': 'w',\n '\\u1E81': 'w',\n '\\u1E83': 'w',\n '\\u0175': 'w',\n '\\u1E87': 'w',\n '\\u1E85': 'w',\n '\\u1E98': 'w',\n '\\u1E89': 'w',\n '\\u2C73': 'w',\n '\\u24E7': 'x',\n '\\uFF58': 'x',\n '\\u1E8B': 'x',\n '\\u1E8D': 'x',\n '\\u24E8': 'y',\n '\\uFF59': 'y',\n '\\u1EF3': 'y',\n '\\u00FD': 'y',\n '\\u0177': 'y',\n '\\u1EF9': 'y',\n '\\u0233': 'y',\n '\\u1E8F': 'y',\n '\\u00FF': 'y',\n '\\u1EF7': 'y',\n '\\u1E99': 'y',\n '\\u1EF5': 'y',\n '\\u01B4': 'y',\n '\\u024F': 'y',\n '\\u1EFF': 'y',\n '\\u24E9': 'z',\n '\\uFF5A': 'z',\n '\\u017A': 'z',\n '\\u1E91': 'z',\n '\\u017C': 'z',\n '\\u017E': 'z',\n '\\u1E93': 'z',\n '\\u1E95': 'z',\n '\\u01B6': 'z',\n '\\u0225': 'z',\n '\\u0240': 'z',\n '\\u2C6C': 'z',\n '\\uA763': 'z',\n '\\u0386': '\\u0391',\n '\\u0388': '\\u0395',\n '\\u0389': '\\u0397',\n '\\u038A': '\\u0399',\n '\\u03AA': '\\u0399',\n '\\u038C': '\\u039F',\n '\\u038E': '\\u03A5',\n '\\u03AB': '\\u03A5',\n '\\u038F': '\\u03A9',\n '\\u03AC': '\\u03B1',\n '\\u03AD': '\\u03B5',\n '\\u03AE': '\\u03B7',\n '\\u03AF': '\\u03B9',\n '\\u03CA': '\\u03B9',\n '\\u0390': '\\u03B9',\n '\\u03CC': '\\u03BF',\n '\\u03CD': '\\u03C5',\n '\\u03CB': '\\u03C5',\n '\\u03B0': '\\u03C5',\n '\\u03C9': '\\u03C9',\n '\\u03C2': '\\u03C3'\n };\n DataUtil.fnOperators = {\n /**\n * Returns true when the actual input is equal to the given input.\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n * @param {boolean} ignoreAccent?\n */\n equal: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) === DataUtil.toLowerCase(expected);\n }\n return actual === expected;\n },\n /**\n * Returns true when the actual input is not equal to the given input.\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n */\n notequal: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n return !DataUtil.fnOperators.equal(actual, expected, ignoreCase);\n },\n /**\n * Returns true when the actual input is less than to the given input.\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n */\n lessthan: function (actual, expected, ignoreCase) {\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) < DataUtil.toLowerCase(expected);\n }\n if (isNullOrUndefined(actual)) {\n actual = undefined;\n }\n return actual < expected;\n },\n /**\n * Returns true when the actual input is greater than to the given input.\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n */\n greaterthan: function (actual, expected, ignoreCase) {\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) > DataUtil.toLowerCase(expected);\n }\n return actual > expected;\n },\n /**\n * Returns true when the actual input is less than or equal to the given input.\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n */\n lessthanorequal: function (actual, expected, ignoreCase) {\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) <= DataUtil.toLowerCase(expected);\n }\n if (isNullOrUndefined(actual)) {\n actual = undefined;\n }\n return actual <= expected;\n },\n /**\n * Returns true when the actual input is greater than or equal to the given input.\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n */\n greaterthanorequal: function (actual, expected, ignoreCase) {\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) >= DataUtil.toLowerCase(expected);\n }\n return actual >= expected;\n },\n /**\n * Returns true when the actual input contains the given string.\n * @param {string|number} actual\n * @param {string|number} expected\n * @param {boolean} ignoreCase?\n */\n contains: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return !isNullOrUndefined(actual) && !isNullOrUndefined(expected) &&\n DataUtil.toLowerCase(actual).indexOf(DataUtil.toLowerCase(expected)) !== -1;\n }\n return !isNullOrUndefined(actual) && !isNullOrUndefined(expected) &&\n actual.toString().indexOf(expected) !== -1;\n },\n /**\n * Returns true when the given input value is not null.\n * @param {string|number} actual\n * @returns boolean\n */\n notnull: function (actual) {\n return actual !== null;\n },\n /**\n * Returns true when the given input value is null.\n * @param {string|number} actual\n * @returns boolean\n */\n isnull: function (actual) {\n return actual === null;\n },\n /**\n * Returns true when the actual input starts with the given string\n * @param {string} actual\n * @param {string} expected\n * @param {boolean} ignoreCase?\n */\n startswith: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return actual && expected && DataUtil.startsWith(DataUtil.toLowerCase(actual), DataUtil.toLowerCase(expected));\n }\n return actual && expected && DataUtil.startsWith(actual, expected);\n },\n /**\n * Returns true when the actual input ends with the given string.\n * @param {string} actual\n * @param {string} expected\n * @param {boolean} ignoreCase?\n */\n endswith: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return actual && expected && DataUtil.endsWith(DataUtil.toLowerCase(actual), DataUtil.toLowerCase(expected));\n }\n return actual && expected && DataUtil.endsWith(actual, expected);\n },\n /**\n * It will return the filter operator based on the filter symbol.\n * @param {string} operator\n * @hidden\n */\n processSymbols: function (operator) {\n var fnName = DataUtil.operatorSymbols[operator];\n if (fnName) {\n var fn = DataUtil.fnOperators[fnName];\n return fn;\n }\n return DataUtil.throwError('Query - Process Operator : Invalid operator');\n },\n /**\n * It will return the valid filter operator based on the specified operators.\n * @param {string} operator\n * @hidden\n */\n processOperator: function (operator) {\n var fn = DataUtil.fnOperators[operator];\n if (fn) {\n return fn;\n }\n return DataUtil.fnOperators.processSymbols(operator);\n }\n };\n /**\n * To perform the parse operation on JSON data, like convert to string from JSON or convert to JSON from string.\n */\n DataUtil.parse = {\n /**\n * Parse the given string to the plain JavaScript object.\n * @param {string|Object|Object[]} jsonText\n */\n parseJson: function (jsonText) {\n if (typeof jsonText === 'string') {\n jsonText = JSON.parse(jsonText, DataUtil.parse.jsonReviver);\n }\n else if (jsonText instanceof Array) {\n DataUtil.parse.iterateAndReviveArray(jsonText);\n }\n else if (typeof jsonText === 'object' && jsonText !== null) {\n DataUtil.parse.iterateAndReviveJson(jsonText);\n }\n return jsonText;\n },\n /**\n * It will perform on array of values.\n * @param {string[]|Object[]} array\n * @hidden\n */\n iterateAndReviveArray: function (array) {\n for (var i = 0; i < array.length; i++) {\n if (typeof array[i] === 'object' && array[i] !== null) {\n DataUtil.parse.iterateAndReviveJson(array[i]);\n }\n else if (typeof array[i] === 'string' && !/^[\\s]*\\[|^[\\s]*\\{(.)+:|\\\"/g.test(array[i])) {\n array[i] = DataUtil.parse.jsonReviver('', array[i]);\n }\n else {\n array[i] = DataUtil.parse.parseJson(array[i]);\n }\n }\n },\n /**\n * It will perform on JSON values\n * @param {JSON} json\n * @hidden\n */\n iterateAndReviveJson: function (json) {\n var value;\n var keys = Object.keys(json);\n for (var _i = 0, keys_2 = keys; _i < keys_2.length; _i++) {\n var prop = keys_2[_i];\n if (DataUtil.startsWith(prop, '__')) {\n continue;\n }\n value = json[prop];\n if (typeof value === 'object') {\n if (value instanceof Array) {\n DataUtil.parse.iterateAndReviveArray(value);\n }\n else if (value) {\n DataUtil.parse.iterateAndReviveJson(value);\n }\n }\n else {\n json[prop] = DataUtil.parse.jsonReviver(json[prop], value);\n }\n }\n },\n /**\n * It will perform on JSON values\n * @param {string} field\n * @param {string|Date} value\n * @hidden\n */\n jsonReviver: function (field, value) {\n if (typeof value === 'string') {\n var ms = /^\\/Date\\(([+-]?[0-9]+)([+-][0-9]{4})?\\)\\/$/.exec(value);\n var offSet = DataUtil.timeZoneHandling ? DataUtil.serverTimezoneOffset : null;\n if (ms) {\n return DataUtil.dateParse.toTimeZone(new Date(parseInt(ms[1], 10)), offSet, true);\n }\n else if (/^(\\d{4}\\-\\d\\d\\-\\d\\d([tT][\\d:\\.]*){1})([zZ]|([+\\-])(\\d\\d):?(\\d\\d))?$/.test(value)) {\n var isUTC = value.indexOf('Z') > -1 || value.indexOf('z') > -1;\n var arr = value.split(/[^0-9.]/);\n if (isUTC) {\n if (arr[5].indexOf('.') > -1) {\n var secondsMs = arr[5].split('.');\n arr[5] = secondsMs[0];\n arr[6] = secondsMs[1];\n }\n else {\n arr[6] = '00';\n }\n value = DataUtil.dateParse\n .toTimeZone(new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, parseInt(arr[2], 10), parseInt(arr[3], 10), parseInt(arr[4], 10), parseInt(arr[5], 10), parseInt(arr[6], 10)), DataUtil.serverTimezoneOffset, false);\n }\n else {\n var utcFormat = new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, parseInt(arr[2], 10), parseInt(arr[3], 10), parseInt(arr[4], 10), parseInt(arr[5], 10));\n var hrs = parseInt(arr[6], 10);\n var mins = parseInt(arr[7], 10);\n if (isNaN(hrs) && isNaN(mins)) {\n return utcFormat;\n }\n if (value.indexOf('+') > -1) {\n utcFormat.setHours(utcFormat.getHours() - hrs, utcFormat.getMinutes() - mins);\n }\n else {\n utcFormat.setHours(utcFormat.getHours() + hrs, utcFormat.getMinutes() + mins);\n }\n value = DataUtil.dateParse\n .toTimeZone(utcFormat, DataUtil.serverTimezoneOffset, false);\n }\n if (DataUtil.serverTimezoneOffset == null) {\n value = DataUtil.dateParse.addSelfOffset(value);\n }\n }\n }\n return value;\n },\n /**\n * Check wheather the given value is JSON or not.\n * @param {Object[]} jsonData\n */\n isJson: function (jsonData) {\n if (typeof jsonData[0] === 'string') {\n return jsonData;\n }\n return DataUtil.parse.parseJson(jsonData);\n },\n /**\n * Checks wheather the given value is GUID or not.\n * @param {string} value\n */\n isGuid: function (value) {\n var regex = /[A-Fa-f0-9]{8}(?:-[A-Fa-f0-9]{4}){3}-[A-Fa-f0-9]{12}/i;\n var match = regex.exec(value);\n return match != null;\n },\n /**\n * The method used to replace the value based on the type.\n * @param {Object} value\n * @param {boolean} stringify\n * @hidden\n */\n replacer: function (value, stringify) {\n if (DataUtil.isPlainObject(value)) {\n return DataUtil.parse.jsonReplacer(value, stringify);\n }\n if (value instanceof Array) {\n return DataUtil.parse.arrayReplacer(value);\n }\n if (value instanceof Date) {\n return DataUtil.parse.jsonReplacer({ val: value }, stringify).val;\n }\n return value;\n },\n /**\n * It will replace the JSON value.\n * @param {string} key\n * @param {Object} val\n * @hidden\n */\n jsonReplacer: function (val, stringify) {\n var value;\n var keys = Object.keys(val);\n for (var _i = 0, keys_3 = keys; _i < keys_3.length; _i++) {\n var prop = keys_3[_i];\n value = val[prop];\n if (!(value instanceof Date)) {\n continue;\n }\n var d = value;\n if (DataUtil.serverTimezoneOffset == null) {\n val[prop] = DataUtil.dateParse.toTimeZone(d, null).toJSON();\n }\n else {\n d = new Date(+d + DataUtil.serverTimezoneOffset * 3600000);\n val[prop] = DataUtil.dateParse.toTimeZone(DataUtil.dateParse.addSelfOffset(d), null).toJSON();\n }\n }\n return val;\n },\n /**\n * It will replace the Array of value.\n * @param {string} key\n * @param {Object[]} val\n * @hidden\n */\n arrayReplacer: function (val) {\n for (var i = 0; i < val.length; i++) {\n if (DataUtil.isPlainObject(val[i])) {\n val[i] = DataUtil.parse.jsonReplacer(val[i]);\n }\n else if (val[i] instanceof Date) {\n val[i] = DataUtil.parse.jsonReplacer({ date: val[i] }).date;\n }\n }\n return val;\n },\n /**\n * It will replace the Date object with respective to UTC format value.\n * @param {string} key\n * @param {any} value\n * @hidden\n */\n /* tslint:disable-next-line:no-any */\n jsonDateReplacer: function (key, value) {\n if (key === 'value' && value) {\n if (typeof value === 'string') {\n var ms = /^\\/Date\\(([+-]?[0-9]+)([+-][0-9]{4})?\\)\\/$/.exec(value);\n if (ms) {\n value = DataUtil.dateParse.toTimeZone(new Date(parseInt(ms[1], 10)), null, true);\n }\n else if (/^(\\d{4}\\-\\d\\d\\-\\d\\d([tT][\\d:\\.]*){1})([zZ]|([+\\-])(\\d\\d):?(\\d\\d))?$/.test(value)) {\n var arr = value.split(/[^0-9]/);\n value = DataUtil.dateParse\n .toTimeZone(new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, parseInt(arr[2], 10), parseInt(arr[3], 10), parseInt(arr[4], 10), parseInt(arr[5], 10)), null, true);\n }\n }\n if (value instanceof Date) {\n value = DataUtil.dateParse.addSelfOffset(value);\n if (DataUtil.serverTimezoneOffset === null) {\n return DataUtil.dateParse.toTimeZone(DataUtil.dateParse.addSelfOffset(value), null).toJSON();\n }\n else {\n value = DataUtil.dateParse.toTimeZone(value, (((value.getTimezoneOffset() / 60) * 2)\n - DataUtil.serverTimezoneOffset), false);\n return value.toJSON();\n }\n }\n }\n return value;\n }\n };\n /**\n * @hidden\n */\n DataUtil.dateParse = {\n addSelfOffset: function (input) {\n return new Date(+input - (input.getTimezoneOffset() * 60000));\n },\n toUTC: function (input) {\n return new Date(+input + (input.getTimezoneOffset() * 60000));\n },\n toTimeZone: function (input, offset, utc) {\n if (offset === null) {\n return input;\n }\n var unix = utc ? DataUtil.dateParse.toUTC(input) : input;\n return new Date(+unix - (offset * 3600000));\n },\n toLocalTime: function (input) {\n var datefn = input;\n var timeZone = -datefn.getTimezoneOffset();\n var differenceString = timeZone >= 0 ? '+' : '-';\n var localtimefn = function (num) {\n var norm = Math.floor(Math.abs(num));\n return (norm < 10 ? '0' : '') + norm;\n };\n var val = datefn.getFullYear() + '-' + localtimefn(datefn.getMonth() + 1) + '-' + localtimefn(datefn.getDate()) +\n 'T' + localtimefn(datefn.getHours()) +\n ':' + localtimefn(datefn.getMinutes()) +\n ':' + localtimefn(datefn.getSeconds()) +\n differenceString + localtimefn(timeZone / 60) +\n ':' + localtimefn(timeZone % 60);\n return val;\n }\n };\n return DataUtil;\n}());\nexport { DataUtil };\n","var __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nimport { merge, extend, isNullOrUndefined, setValue, getValue } from '@syncfusion/ej2-base';\nimport { DataUtil } from './util';\nimport { Query, Predicate } from './query';\nvar consts = { GroupGuid: '{271bbba0-1ee7}' };\n/**\n * Adaptors are specific data source type aware interfaces that are used by DataManager to communicate with DataSource.\n * This is the base adaptor class that other adaptors can extend.\n * @hidden\n */\nvar Adaptor = /** @class */ (function () {\n /**\n * Constructor for Adaptor class\n * @param {DataOptions} ds?\n * @hidden\n * @returns aggregates\n */\n function Adaptor(ds) {\n // common options for all the adaptors \n this.options = {\n from: 'table',\n requestType: 'json',\n sortBy: 'sorted',\n select: 'select',\n skip: 'skip',\n group: 'group',\n take: 'take',\n search: 'search',\n count: 'requiresCounts',\n where: 'where',\n aggregates: 'aggregates',\n expand: 'expand'\n };\n /**\n * Specifies the type of adaptor.\n * @default Adaptor\n */\n this.type = Adaptor;\n this.dataSource = ds;\n this.pvt = {};\n }\n /**\n * Returns the data from the query processing.\n * @param {Object} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {XMLHttpRequest} xhr?\n * @returns Object\n */\n Adaptor.prototype.processResponse = function (data, ds, query, xhr) {\n return data;\n };\n return Adaptor;\n}());\nexport { Adaptor };\n/**\n * JsonAdaptor is used to process JSON data. It contains methods to process the given JSON data based on the queries.\n * @hidden\n */\nvar JsonAdaptor = /** @class */ (function (_super) {\n __extends(JsonAdaptor, _super);\n function JsonAdaptor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * Process the JSON data based on the provided queries.\n * @param {DataManager} dataManager\n * @param {Query} query\n * @returns Object\n */\n JsonAdaptor.prototype.processQuery = function (dataManager, query) {\n var result = dataManager.dataSource.json.slice(0);\n var count = result.length;\n var countFlg = true;\n var ret;\n var key;\n var lazyLoad = {};\n var keyCount = 0;\n var group = [];\n var page;\n for (var i = 0; i < query.lazyLoad.length; i++) {\n keyCount++;\n lazyLoad[query.lazyLoad[i].key] = query.lazyLoad[i].value;\n }\n var agg = {};\n for (var i = 0; i < query.queries.length; i++) {\n key = query.queries[i];\n if ((key.fn === 'onPage' || key.fn === 'onGroup') && query.lazyLoad.length) {\n if (key.fn === 'onGroup') {\n group.push(key.e);\n }\n if (key.fn === 'onPage') {\n page = key.e;\n }\n continue;\n }\n ret = this[key.fn].call(this, result, key.e, query);\n if (key.fn === 'onAggregates') {\n agg[key.e.field + ' - ' + key.e.type] = ret;\n }\n else {\n result = ret !== undefined ? ret : result;\n }\n if (key.fn === 'onPage' || key.fn === 'onSkip' || key.fn === 'onTake' || key.fn === 'onRange') {\n countFlg = false;\n }\n if (countFlg) {\n count = result.length;\n }\n }\n if (keyCount) {\n var args = {\n query: query, lazyLoad: lazyLoad, result: result, group: group, page: page\n };\n var lazyLoadData = this.lazyLoadGroup(args);\n result = lazyLoadData.result;\n count = lazyLoadData.count;\n }\n if (query.isCountRequired) {\n result = {\n result: result,\n count: count,\n aggregates: agg\n };\n }\n return result;\n };\n /**\n * Perform lazy load grouping in JSON array based on the given query and lazy load details.\n * @param {LazyLoadGroupArgs} args\n */\n JsonAdaptor.prototype.lazyLoadGroup = function (args) {\n var count = 0;\n var agg = this.getAggregate(args.query);\n var result = args.result;\n if (!isNullOrUndefined(args.lazyLoad.onDemandGroupInfo)) {\n var req = args.lazyLoad.onDemandGroupInfo;\n for (var i = req.where.length - 1; i >= 0; i--) {\n result = this.onWhere(result, req.where[i]);\n }\n if (args.group.length !== req.level) {\n var field = args.group[req.level].fieldName;\n result = DataUtil.group(result, field, agg, null, null, args.group[0].comparer, true);\n }\n count = result.length;\n var data = result;\n result = result.slice(req.skip);\n result = result.slice(0, req.take);\n if (args.group.length !== req.level) {\n this.formGroupResult(result, data);\n }\n }\n else {\n var field = args.group[0].fieldName;\n result = DataUtil.group(result, field, agg, null, null, args.group[0].comparer, true);\n count = result.length;\n var data = result;\n if (args.page) {\n result = this.onPage(result, args.page, args.query);\n }\n this.formGroupResult(result, data);\n }\n return { result: result, count: count };\n };\n JsonAdaptor.prototype.formGroupResult = function (result, data) {\n if (result.length && data.length) {\n var uid = 'GroupGuid';\n var childLevel = 'childLevels';\n var level = 'level';\n var records = 'records';\n result[uid] = data[uid];\n result[childLevel] = data[childLevel];\n result[level] = data[level];\n result[records] = data[records];\n }\n return result;\n };\n /**\n * Separate the aggregate query from the given queries\n * @param {Query} query\n */\n JsonAdaptor.prototype.getAggregate = function (query) {\n var aggQuery = Query.filterQueries(query.queries, 'onAggregates');\n var agg = [];\n if (aggQuery.length) {\n var tmp = void 0;\n for (var i = 0; i < aggQuery.length; i++) {\n tmp = aggQuery[i].e;\n agg.push({ type: tmp.type, field: DataUtil.getValue(tmp.field, query) });\n }\n }\n return agg;\n };\n /**\n * Performs batch update in the JSON array which add, remove and update records.\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {RemoteArgs} e\n */\n JsonAdaptor.prototype.batchRequest = function (dm, changes, e) {\n var i;\n var deletedRecordsLen = changes.deletedRecords.length;\n for (i = 0; i < changes.addedRecords.length; i++) {\n this.insert(dm, changes.addedRecords[i]);\n }\n for (i = 0; i < changes.changedRecords.length; i++) {\n this.update(dm, e.key, changes.changedRecords[i]);\n }\n for (i = 0; i < deletedRecordsLen; i++) {\n this.remove(dm, e.key, changes.deletedRecords[i]);\n }\n return changes;\n };\n /**\n * Performs filter operation with the given data and where query.\n * @param {Object[]} ds\n * @param {{validate:Function}} e\n */\n JsonAdaptor.prototype.onWhere = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.filter(function (obj) {\n if (e) {\n return e.validate(obj);\n }\n });\n };\n /**\n * Returns aggregate function based on the aggregate type.\n * @param {Object[]} ds\n * @param {{field:string} e\n * @param {string}} type\n */\n JsonAdaptor.prototype.onAggregates = function (ds, e) {\n var fn = DataUtil.aggregates[e.type];\n if (!ds || !fn || ds.length === 0) {\n return null;\n }\n return fn(ds, e.field);\n };\n /**\n * Performs search operation based on the given query.\n * @param {Object[]} ds\n * @param {QueryOptions} e\n */\n JsonAdaptor.prototype.onSearch = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n if (e.fieldNames.length === 0) {\n DataUtil.getFieldList(ds[0], e.fieldNames);\n }\n return ds.filter(function (obj) {\n for (var j = 0; j < e.fieldNames.length; j++) {\n if (e.comparer.call(obj, DataUtil.getObject(e.fieldNames[j], obj), e.searchKey, e.ignoreCase, e.ignoreAccent)) {\n return true;\n }\n }\n return false;\n });\n };\n /**\n * Sort the data with given direction and field.\n * @param {Object[]} ds\n * @param {{comparer:(a:Object} e\n * @param {Object} b\n */\n JsonAdaptor.prototype.onSortBy = function (ds, e, query) {\n if (!ds || !ds.length) {\n return ds;\n }\n var fnCompare;\n var field = DataUtil.getValue(e.fieldName, query);\n if (!field) {\n return ds.sort(e.comparer);\n }\n if (field instanceof Array) {\n field = field.slice(0);\n for (var i = field.length - 1; i >= 0; i--) {\n if (!field[i]) {\n continue;\n }\n fnCompare = e.comparer;\n if (DataUtil.endsWith(field[i], ' desc')) {\n fnCompare = DataUtil.fnSort('descending');\n field[i] = field[i].replace(' desc', '');\n }\n ds = DataUtil.sort(ds, field[i], fnCompare);\n }\n return ds;\n }\n return DataUtil.sort(ds, field, e.comparer);\n };\n /**\n * Group the data based on the given query.\n * @param {Object[]} ds\n * @param {QueryOptions} e\n * @param {Query} query\n */\n JsonAdaptor.prototype.onGroup = function (ds, e, query) {\n if (!ds || !ds.length) {\n return ds;\n }\n var agg = this.getAggregate(query);\n return DataUtil.group(ds, DataUtil.getValue(e.fieldName, query), agg, null, null, e.comparer);\n };\n /**\n * Retrieves records based on the given page index and size.\n * @param {Object[]} ds\n * @param {{pageSize:number} e\n * @param {number}} pageIndex\n * @param {Query} query\n */\n JsonAdaptor.prototype.onPage = function (ds, e, query) {\n var size = DataUtil.getValue(e.pageSize, query);\n var start = (DataUtil.getValue(e.pageIndex, query) - 1) * size;\n var end = start + size;\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.slice(start, end);\n };\n /**\n * Retrieves records based on the given start and end index from query.\n * @param {Object[]} ds\n * @param {{start:number} e\n * @param {number}} end\n */\n JsonAdaptor.prototype.onRange = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.slice(DataUtil.getValue(e.start), DataUtil.getValue(e.end));\n };\n /**\n * Picks the given count of records from the top of the datasource.\n * @param {Object[]} ds\n * @param {{nos:number}} e\n */\n JsonAdaptor.prototype.onTake = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.slice(0, DataUtil.getValue(e.nos));\n };\n /**\n * Skips the given count of records from the data source.\n * @param {Object[]} ds\n * @param {{nos:number}} e\n */\n JsonAdaptor.prototype.onSkip = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.slice(DataUtil.getValue(e.nos));\n };\n /**\n * Selects specified columns from the data source.\n * @param {Object[]} ds\n * @param {{fieldNames:string}} e\n */\n JsonAdaptor.prototype.onSelect = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return DataUtil.select(ds, DataUtil.getValue(e.fieldNames));\n };\n /**\n * Inserts new record in the table.\n * @param {DataManager} dm\n * @param {Object} data\n * @param {number} position\n */\n JsonAdaptor.prototype.insert = function (dm, data, tableName, query, position) {\n if (isNullOrUndefined(position)) {\n return dm.dataSource.json.push(data);\n }\n else {\n return dm.dataSource.json.splice(position, 0, data);\n }\n };\n /**\n * Remove the data from the dataSource based on the key field value.\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n * @returns null\n */\n JsonAdaptor.prototype.remove = function (dm, keyField, value, tableName) {\n var ds = dm.dataSource.json;\n var i;\n if (typeof value === 'object' && !(value instanceof Date)) {\n value = DataUtil.getObject(keyField, value);\n }\n for (i = 0; i < ds.length; i++) {\n if (DataUtil.getObject(keyField, ds[i]) === value) {\n break;\n }\n }\n return i !== ds.length ? ds.splice(i, 1) : null;\n };\n /**\n * Updates existing record and saves the changes to the table.\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n * @returns null\n */\n JsonAdaptor.prototype.update = function (dm, keyField, value, tableName) {\n var ds = dm.dataSource.json;\n var i;\n var key;\n if (!isNullOrUndefined(keyField)) {\n key = getValue(keyField, value);\n }\n for (i = 0; i < ds.length; i++) {\n if (!isNullOrUndefined(keyField) && (getValue(keyField, ds[i])) === key) {\n break;\n }\n }\n return i < ds.length ? merge(ds[i], value) : null;\n };\n return JsonAdaptor;\n}(Adaptor));\nexport { JsonAdaptor };\n/**\n * URL Adaptor of DataManager can be used when you are required to use remote service to retrieve data.\n * It interacts with server-side for all DataManager Queries and CRUD operations.\n * @hidden\n */\nvar UrlAdaptor = /** @class */ (function (_super) {\n __extends(UrlAdaptor, _super);\n function UrlAdaptor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * Process the query to generate request body.\n * @param {DataManager} dm\n * @param {Query} query\n * @param {Object[]} hierarchyFilters?\n * @returns p\n */\n // tslint:disable-next-line:max-func-body-length\n UrlAdaptor.prototype.processQuery = function (dm, query, hierarchyFilters) {\n var queries = this.getQueryRequest(query);\n var singles = Query.filterQueryLists(query.queries, ['onSelect', 'onPage', 'onSkip', 'onTake', 'onRange']);\n var params = query.params;\n var url = dm.dataSource.url;\n var temp;\n var skip;\n var take = null;\n var options = this.options;\n var request = { sorts: [], groups: [], filters: [], searches: [], aggregates: [] };\n // calc Paging & Range\n if ('onPage' in singles) {\n temp = singles.onPage;\n skip = DataUtil.getValue(temp.pageIndex, query);\n take = DataUtil.getValue(temp.pageSize, query);\n skip = (skip - 1) * take;\n }\n else if ('onRange' in singles) {\n temp = singles.onRange;\n skip = temp.start;\n take = temp.end - temp.start;\n }\n // Sorting\n for (var i = 0; i < queries.sorts.length; i++) {\n temp = DataUtil.getValue(queries.sorts[i].e.fieldName, query);\n request.sorts.push(DataUtil.callAdaptorFunction(this, 'onEachSort', { name: temp, direction: queries.sorts[i].e.direction }, query));\n }\n // hierarchy\n if (hierarchyFilters) {\n temp = this.getFiltersFrom(hierarchyFilters, query);\n if (temp) {\n request.filters.push(DataUtil.callAdaptorFunction(this, 'onEachWhere', temp.toJson(), query));\n }\n }\n // Filters\n for (var i = 0; i < queries.filters.length; i++) {\n var res = DataUtil.callAdaptorFunction(this, 'onEachWhere', queries.filters[i].e.toJson(), query);\n if ((this.getModuleName &&\n this.getModuleName() === 'ODataV4Adaptor') &&\n !isNullOrUndefined(queries.filters[i].e.key) && queries.filters.length > 1) {\n res = \"(\" + res + \")\";\n }\n request.filters.push(res);\n var keys_3 = typeof request.filters[i] === 'object' ? Object.keys(request.filters[i]) : [];\n for (var _i = 0, keys_1 = keys_3; _i < keys_1.length; _i++) {\n var prop = keys_1[_i];\n if (DataUtil.isNull((request)[prop])) {\n delete request[prop];\n }\n }\n }\n // Searches\n for (var i = 0; i < queries.searches.length; i++) {\n temp = queries.searches[i].e;\n request.searches.push(DataUtil.callAdaptorFunction(this, 'onEachSearch', {\n fields: temp.fieldNames,\n operator: temp.operator,\n key: temp.searchKey,\n ignoreCase: temp.ignoreCase\n }, query));\n }\n // Grouping\n for (var i = 0; i < queries.groups.length; i++) {\n request.groups.push(DataUtil.getValue(queries.groups[i].e.fieldName, query));\n }\n // aggregates\n for (var i = 0; i < queries.aggregates.length; i++) {\n temp = queries.aggregates[i].e;\n request.aggregates.push({ type: temp.type, field: DataUtil.getValue(temp.field, query) });\n }\n var req = {};\n this.getRequestQuery(options, query, singles, request, req);\n // Params\n DataUtil.callAdaptorFunction(this, 'addParams', { dm: dm, query: query, params: params, reqParams: req });\n if (query.lazyLoad.length) {\n for (var i = 0; i < query.lazyLoad.length; i++) {\n req[query.lazyLoad[i].key] = query.lazyLoad[i].value;\n }\n }\n // cleanup\n var keys = Object.keys(req);\n for (var _a = 0, keys_2 = keys; _a < keys_2.length; _a++) {\n var prop = keys_2[_a];\n if (DataUtil.isNull(req[prop]) || req[prop] === '' || req[prop].length === 0) {\n delete req[prop];\n }\n }\n if (!(options.skip in req && options.take in req) && take !== null) {\n req[options.skip] = DataUtil.callAdaptorFunction(this, 'onSkip', skip, query);\n req[options.take] = DataUtil.callAdaptorFunction(this, 'onTake', take, query);\n }\n var p = this.pvt;\n this.pvt = {};\n if (this.options.requestType === 'json') {\n return {\n data: JSON.stringify(req, DataUtil.parse.jsonDateReplacer),\n url: url,\n pvtData: p,\n type: 'POST',\n contentType: 'application/json; charset=utf-8'\n };\n }\n temp = this.convertToQueryString(req, query, dm);\n temp = (dm.dataSource.url.indexOf('?') !== -1 ? '&' : '/') + temp;\n return {\n type: 'GET', url: temp.length ? url.replace(/\\/*$/, temp) : url, pvtData: p\n };\n };\n UrlAdaptor.prototype.getRequestQuery = function (options, query, singles, request, request1) {\n var param = 'param';\n var req = request1;\n req[options.from] = query.fromTable;\n if (options.apply && query.distincts.length) {\n req[options.apply] = 'onDistinct' in this ? DataUtil.callAdaptorFunction(this, 'onDistinct', query.distincts) : '';\n }\n if (!query.distincts.length && options.expand) {\n req[options.expand] = 'onExpand' in this && 'onSelect' in singles ?\n DataUtil.callAdaptorFunction(this, 'onExpand', { selects: DataUtil.getValue(singles.onSelect.fieldNames, query), expands: query.expands }, query) : query.expands;\n }\n req[options.select] = 'onSelect' in singles && !query.distincts.length ?\n DataUtil.callAdaptorFunction(this, 'onSelect', DataUtil.getValue(singles.onSelect.fieldNames, query), query) : '';\n req[options.count] = query.isCountRequired ? DataUtil.callAdaptorFunction(this, 'onCount', query.isCountRequired, query) : '';\n req[options.search] = request.searches.length ? DataUtil.callAdaptorFunction(this, 'onSearch', request.searches, query) : '';\n req[options.skip] = 'onSkip' in singles ?\n DataUtil.callAdaptorFunction(this, 'onSkip', DataUtil.getValue(singles.onSkip.nos, query), query) : '';\n req[options.take] = 'onTake' in singles ?\n DataUtil.callAdaptorFunction(this, 'onTake', DataUtil.getValue(singles.onTake.nos, query), query) : '';\n req[options.where] = request.filters.length || request.searches.length ?\n DataUtil.callAdaptorFunction(this, 'onWhere', request.filters, query) : '';\n req[options.sortBy] = request.sorts.length ? DataUtil.callAdaptorFunction(this, 'onSortBy', request.sorts, query) : '';\n req[options.group] = request.groups.length ? DataUtil.callAdaptorFunction(this, 'onGroup', request.groups, query) : '';\n req[options.aggregates] = request.aggregates.length ?\n DataUtil.callAdaptorFunction(this, 'onAggregates', request.aggregates, query) : '';\n req[param] = [];\n };\n /**\n * Convert the object from processQuery to string which can be added query string.\n * @param {Object} req\n * @param {Query} query\n * @param {DataManager} dm\n */\n UrlAdaptor.prototype.convertToQueryString = function (request, query, dm) {\n return '';\n // this needs to be overridden\n };\n /**\n * Return the data from the data manager processing.\n * @param {DataResult} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {XMLHttpRequest} xhr?\n * @param {Object} request?\n * @param {CrudOptions} changes?\n */\n UrlAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n if (xhr && xhr.getResponseHeader('Content-Type') &&\n xhr.getResponseHeader('Content-Type').indexOf('application/json') !== -1) {\n var handleTimeZone = DataUtil.timeZoneHandling;\n if (ds && !ds.timeZoneHandling) {\n DataUtil.timeZoneHandling = false;\n }\n data = DataUtil.parse.parseJson(data);\n DataUtil.timeZoneHandling = handleTimeZone;\n }\n var requests = request;\n var pvt = requests.pvtData || {};\n var groupDs = data ? data.groupDs : [];\n if (xhr && xhr.getResponseHeader('Content-Type') &&\n xhr.getResponseHeader('Content-Type').indexOf('xml') !== -1) {\n return (query.isCountRequired ? { result: [], count: 0 } : []);\n }\n var d = JSON.parse(requests.data);\n if (d && d.action === 'batch' && data && data.addedRecords) {\n changes.addedRecords = data.addedRecords;\n return changes;\n }\n if (data && data.d) {\n data = data.d;\n }\n var args = {};\n if (data && 'count' in data) {\n args.count = data.count;\n }\n args.result = data && data.result ? data.result : data;\n var isExpand = false;\n if (Array.isArray(data.result) && data.result.length) {\n var key = 'key';\n var val = 'value';\n var level = 'level';\n if (!isNullOrUndefined(data.result[0][key])) {\n args.result = this.formRemoteGroupedData(args.result, 1, pvt.groups.length - 1);\n }\n if (query && query.lazyLoad.length && pvt.groups.length) {\n for (var i = 0; i < query.lazyLoad.length; i++) {\n if (query.lazyLoad[i][key] === 'onDemandGroupInfo') {\n var value = query.lazyLoad[i][val][level];\n if (pvt.groups.length === value) {\n isExpand = true;\n }\n }\n }\n }\n }\n if (!isExpand) {\n this.getAggregateResult(pvt, data, args, groupDs, query);\n }\n return DataUtil.isNull(args.count) ? args.result : { result: args.result, count: args.count, aggregates: args.aggregates };\n };\n UrlAdaptor.prototype.formRemoteGroupedData = function (data, level, childLevel) {\n for (var i = 0; i < data.length; i++) {\n if (data[i].items.length && Object.keys(data[i].items[0]).indexOf('key') > -1) {\n this.formRemoteGroupedData(data[i].items, level + 1, childLevel - 1);\n }\n }\n var uid = 'GroupGuid';\n var childLvl = 'childLevels';\n var lvl = 'level';\n var records = 'records';\n data[uid] = consts[uid];\n data[lvl] = level;\n data[childLvl] = childLevel;\n data[records] = data[0].items.length ? this.getGroupedRecords(data, !isNullOrUndefined(data[0].items[records])) : [];\n return data;\n };\n UrlAdaptor.prototype.getGroupedRecords = function (data, hasRecords) {\n var childGroupedRecords = [];\n var records = 'records';\n for (var i = 0; i < data.length; i++) {\n if (!hasRecords) {\n for (var j = 0; j < data[i].items.length; j++) {\n childGroupedRecords.push(data[i].items[j]);\n }\n }\n else {\n childGroupedRecords = childGroupedRecords.concat(data[i].items[records]);\n }\n }\n return childGroupedRecords;\n };\n /**\n * Add the group query to the adaptor`s option.\n * @param {Object[]} e\n * @returns void\n */\n UrlAdaptor.prototype.onGroup = function (e) {\n this.pvt.groups = e;\n return e;\n };\n /**\n * Add the aggregate query to the adaptor`s option.\n * @param {Aggregates[]} e\n * @returns void\n */\n UrlAdaptor.prototype.onAggregates = function (e) {\n this.pvt.aggregates = e;\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * The result is used by the batch request.\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {Object} e\n */\n UrlAdaptor.prototype.batchRequest = function (dm, changes, e, query, original) {\n var url;\n var key;\n return {\n type: 'POST',\n url: dm.dataSource.batchUrl || dm.dataSource.crudUrl || dm.dataSource.removeUrl || dm.dataSource.url,\n contentType: 'application/json; charset=utf-8',\n dataType: 'json',\n data: JSON.stringify(extend({}, {\n changed: changes.changedRecords,\n added: changes.addedRecords,\n deleted: changes.deletedRecords,\n action: 'batch',\n table: e[url],\n key: e[key]\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n /**\n * Method will trigger before send the request to server side.\n * Used to set the custom header or modify the request options.\n * @param {DataManager} dm\n * @param {XMLHttpRequest} request\n * @returns void\n */\n UrlAdaptor.prototype.beforeSend = function (dm, request) {\n // need to extend this method\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n * @param {DataManager} dm\n * @param {Object} data\n * @param {string} tableName\n */\n UrlAdaptor.prototype.insert = function (dm, data, tableName, query) {\n return {\n url: dm.dataSource.insertUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n value: data,\n table: tableName,\n action: 'insert'\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n /**\n * Prepare and return request body which is used to remove record from the table.\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {number|string} value\n * @param {string} tableName\n */\n UrlAdaptor.prototype.remove = function (dm, keyField, value, tableName, query) {\n return {\n type: 'POST',\n url: dm.dataSource.removeUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n key: value,\n keyColumn: keyField,\n table: tableName,\n action: 'remove'\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n /**\n * Prepare and return request body which is used to update record.\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName\n */\n UrlAdaptor.prototype.update = function (dm, keyField, value, tableName, query) {\n return {\n type: 'POST',\n url: dm.dataSource.updateUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n value: value,\n action: 'update',\n keyColumn: keyField,\n key: DataUtil.getObject(keyField, value),\n table: tableName\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n /**\n * To generate the predicate based on the filtered query.\n * @param {Object[]|string[]|number[]} data\n * @param {Query} query\n * @hidden\n */\n UrlAdaptor.prototype.getFiltersFrom = function (data, query) {\n var key = query.fKey;\n var value;\n var prop = key;\n var pKey = query.key;\n var predicats = [];\n if (typeof data[0] !== 'object') {\n prop = null;\n }\n for (var i = 0; i < data.length; i++) {\n if (typeof data[0] === 'object') {\n value = DataUtil.getObject(pKey || prop, data[i]);\n }\n else {\n value = data[i];\n }\n predicats.push(new Predicate(key, 'equal', value));\n }\n return Predicate.or(predicats);\n };\n UrlAdaptor.prototype.getAggregateResult = function (pvt, data, args, groupDs, query) {\n var pData = data;\n if (data && data.result) {\n pData = data.result;\n }\n if (pvt && pvt.aggregates && pvt.aggregates.length) {\n var agg = pvt.aggregates;\n var fn = void 0;\n var aggregateData = pData;\n var res = {};\n if (data.aggregate) {\n aggregateData = data.aggregate;\n }\n for (var i = 0; i < agg.length; i++) {\n fn = DataUtil.aggregates[agg[i].type];\n if (fn) {\n res[agg[i].field + ' - ' + agg[i].type] = fn(aggregateData, agg[i].field);\n }\n }\n args.aggregates = res;\n }\n var key = 'key';\n var isServerGrouping = Array.isArray(data.result) && data.result.length && !isNullOrUndefined(data.result[0][key]);\n if (pvt && pvt.groups && pvt.groups.length && !isServerGrouping) {\n var groups = pvt.groups;\n for (var i = 0; i < groups.length; i++) {\n var level = null;\n if (!isNullOrUndefined(groupDs)) {\n groupDs = DataUtil.group(groupDs, groups[i]);\n }\n var groupQuery = Query.filterQueries(query.queries, 'onGroup')[i].e;\n pData = DataUtil.group(pData, groups[i], pvt.aggregates, level, groupDs, groupQuery.comparer);\n }\n args.result = pData;\n }\n return args;\n };\n UrlAdaptor.prototype.getQueryRequest = function (query) {\n var req = { sorts: [], groups: [], filters: [], searches: [], aggregates: [] };\n req.sorts = Query.filterQueries(query.queries, 'onSortBy');\n req.groups = Query.filterQueries(query.queries, 'onGroup');\n req.filters = Query.filterQueries(query.queries, 'onWhere');\n req.searches = Query.filterQueries(query.queries, 'onSearch');\n req.aggregates = Query.filterQueries(query.queries, 'onAggregates');\n return req;\n };\n UrlAdaptor.prototype.addParams = function (options) {\n var req = options.reqParams;\n if (options.params.length) {\n req.params = {};\n }\n for (var _i = 0, _a = options.params; _i < _a.length; _i++) {\n var tmp = _a[_i];\n if (req[tmp.key]) {\n throw new Error('Query() - addParams: Custom Param is conflicting other request arguments');\n }\n req[tmp.key] = tmp.value;\n if (tmp.fn) {\n req[tmp.key] = tmp.fn.call(options.query, tmp.key, options.query, options.dm);\n }\n req.params[tmp.key] = req[tmp.key];\n }\n };\n return UrlAdaptor;\n}(Adaptor));\nexport { UrlAdaptor };\n/**\n * OData Adaptor that is extended from URL Adaptor, is used for consuming data through OData Service.\n * @hidden\n */\nvar ODataAdaptor = /** @class */ (function (_super) {\n __extends(ODataAdaptor, _super);\n function ODataAdaptor(props) {\n var _this = _super.call(this) || this;\n // options replaced the default adaptor options\n _this.options = extend({}, _this.options, {\n requestType: 'get',\n accept: 'application/json;odata=light;q=1,application/json;odata=verbose;q=0.5',\n multipartAccept: 'multipart/mixed',\n sortBy: '$orderby',\n select: '$select',\n skip: '$skip',\n take: '$top',\n count: '$inlinecount',\n where: '$filter',\n expand: '$expand',\n batch: '$batch',\n changeSet: '--changeset_',\n batchPre: 'batch_',\n contentId: 'Content-Id: ',\n batchContent: 'Content-Type: multipart/mixed; boundary=',\n changeSetContent: 'Content-Type: application/http\\nContent-Transfer-Encoding: binary ',\n batchChangeSetContentType: 'Content-Type: application/json; charset=utf-8 ',\n updateType: 'PUT'\n });\n extend(_this.options, props || {});\n return _this;\n }\n ODataAdaptor.prototype.getModuleName = function () {\n return 'ODataAdaptor';\n };\n /**\n * Generate request string based on the filter criteria from query.\n * @param {Predicate} pred\n * @param {boolean} requiresCast?\n */\n ODataAdaptor.prototype.onPredicate = function (predicate, query, requiresCast) {\n var returnValue = '';\n var operator;\n var guid;\n var val = predicate.value;\n var type = typeof val;\n var field = predicate.field ? ODataAdaptor.getField(predicate.field) : null;\n if (val instanceof Date) {\n val = 'datetime\\'' + DataUtil.parse.replacer(val) + '\\'';\n }\n if (type === 'string') {\n val = val.replace(/'/g, \"''\");\n if (predicate.ignoreCase) {\n val = val.toLowerCase();\n }\n val = encodeURIComponent(val);\n val = '\\'' + val + '\\'';\n if (requiresCast) {\n field = 'cast(' + field + ', \\'Edm.String\\')';\n }\n if (DataUtil.parse.isGuid(val)) {\n guid = 'guid';\n }\n if (predicate.ignoreCase) {\n if (!guid) {\n field = 'tolower(' + field + ')';\n }\n val = val.toLowerCase();\n }\n }\n operator = DataUtil.odBiOperator[predicate.operator];\n if (operator) {\n returnValue += field;\n returnValue += operator;\n if (guid) {\n returnValue += guid;\n }\n return returnValue + val;\n }\n if (!isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor') {\n operator = DataUtil.odv4UniOperator[predicate.operator];\n }\n else {\n operator = DataUtil.odUniOperator[predicate.operator];\n }\n if (operator === 'substringof') {\n var temp = val;\n val = field;\n field = temp;\n }\n returnValue += operator + '(';\n returnValue += field + ',';\n if (guid) {\n returnValue += guid;\n }\n returnValue += val + ')';\n return returnValue;\n };\n ODataAdaptor.prototype.addParams = function (options) {\n _super.prototype.addParams.call(this, options);\n delete options.reqParams.params;\n };\n /**\n * Generate request string based on the multiple filter criteria from query.\n * @param {Predicate} pred\n * @param {boolean} requiresCast?\n */\n ODataAdaptor.prototype.onComplexPredicate = function (predicate, query, requiresCast) {\n var res = [];\n for (var i = 0; i < predicate.predicates.length; i++) {\n res.push('(' + this.onEachWhere(predicate.predicates[i], query, requiresCast) + ')');\n }\n return res.join(' ' + predicate.condition + ' ');\n };\n /**\n * Generate query string based on the multiple filter criteria from query.\n * @param {Predicate} filter\n * @param {boolean} requiresCast?\n */\n ODataAdaptor.prototype.onEachWhere = function (filter, query, requiresCast) {\n return filter.isComplex ? this.onComplexPredicate(filter, query, requiresCast) : this.onPredicate(filter, query, requiresCast);\n };\n /**\n * Generate query string based on the multiple filter criteria from query.\n * @param {string[]} filters\n */\n ODataAdaptor.prototype.onWhere = function (filters) {\n if (this.pvt.search) {\n filters.push(this.onEachWhere(this.pvt.search, null, true));\n }\n return filters.join(' and ');\n };\n /**\n * Generate query string based on the multiple search criteria from query.\n * @param {{fields:string[]} e\n * @param {string} operator\n * @param {string} key\n * @param {boolean}} ignoreCase\n */\n ODataAdaptor.prototype.onEachSearch = function (e) {\n if (e.fields && e.fields.length === 0) {\n DataUtil.throwError('Query() - Search : oData search requires list of field names to search');\n }\n var filter = this.pvt.search || [];\n for (var i = 0; i < e.fields.length; i++) {\n filter.push(new Predicate(e.fields[i], e.operator, e.key, e.ignoreCase));\n }\n this.pvt.search = filter;\n };\n /**\n * Generate query string based on the search criteria from query.\n * @param {Object} e\n */\n ODataAdaptor.prototype.onSearch = function (e) {\n this.pvt.search = Predicate.or(this.pvt.search);\n return '';\n };\n /**\n * Generate query string based on multiple sort criteria from query.\n * @param {QueryOptions} e\n */\n ODataAdaptor.prototype.onEachSort = function (e) {\n var res = [];\n if (e.name instanceof Array) {\n for (var i = 0; i < e.name.length; i++) {\n res.push(ODataAdaptor.getField(e.name[i]) + (e.direction === 'descending' ? ' desc' : ''));\n }\n }\n else {\n res.push(ODataAdaptor.getField(e.name) + (e.direction === 'descending' ? ' desc' : ''));\n }\n return res.join(',');\n };\n /**\n * Returns sort query string.\n * @param {string[]} e\n */\n ODataAdaptor.prototype.onSortBy = function (e) {\n return e.reverse().join(',');\n };\n /**\n * Adds the group query to the adaptor option.\n * @param {Object[]} e\n * @returns string\n */\n ODataAdaptor.prototype.onGroup = function (e) {\n this.pvt.groups = e;\n return [];\n };\n /**\n * Returns the select query string.\n * @param {string[]} e\n */\n ODataAdaptor.prototype.onSelect = function (e) {\n for (var i = 0; i < e.length; i++) {\n e[i] = ODataAdaptor.getField(e[i]);\n }\n return e.join(',');\n };\n /**\n * Add the aggregate query to the adaptor option.\n * @param {Object[]} e\n * @returns string\n */\n ODataAdaptor.prototype.onAggregates = function (e) {\n this.pvt.aggregates = e;\n return '';\n };\n /**\n * Returns the query string which requests total count from the data source.\n * @param {boolean} e\n * @returns string\n */\n ODataAdaptor.prototype.onCount = function (e) {\n return e === true ? 'allpages' : '';\n };\n /**\n * Method will trigger before send the request to server side.\n * Used to set the custom header or modify the request options.\n * @param {DataManager} dm\n * @param {XMLHttpRequest} request\n * @param {Ajax} settings?\n */\n ODataAdaptor.prototype.beforeSend = function (dm, request, settings) {\n if (DataUtil.endsWith(settings.url, this.options.batch) && settings.type.toLowerCase() === 'post') {\n request.setRequestHeader('Accept', this.options.multipartAccept);\n request.setRequestHeader('DataServiceVersion', '2.0');\n request.overrideMimeType('text/plain; charset=x-user-defined');\n }\n else {\n request.setRequestHeader('Accept', this.options.accept);\n }\n request.setRequestHeader('DataServiceVersion', '2.0');\n request.setRequestHeader('MaxDataServiceVersion', '2.0');\n };\n /**\n * Returns the data from the query processing.\n * @param {DataResult} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {XMLHttpRequest} xhr?\n * @param {Ajax} request?\n * @param {CrudOptions} changes?\n * @returns aggregateResult\n */\n ODataAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n var metaCheck = 'odata.metadata';\n if ((request && request.type === 'GET') && !this.rootUrl && data[metaCheck]) {\n var dataUrls = data[metaCheck].split('/$metadata#');\n this.rootUrl = dataUrls[0];\n this.resourceTableName = dataUrls[1];\n }\n var pvtData = 'pvtData';\n if (!isNullOrUndefined(data.d)) {\n var dataCopy = ((query && query.isCountRequired) ? data.d.results : data.d);\n var metaData = '__metadata';\n if (!isNullOrUndefined(dataCopy)) {\n for (var i = 0; i < dataCopy.length; i++) {\n if (!isNullOrUndefined(dataCopy[i][metaData])) {\n delete dataCopy[i][metaData];\n }\n }\n }\n }\n var pvt = request && request[pvtData];\n var emptyAndBatch = this.processBatchResponse(data, query, xhr, request, changes);\n if (emptyAndBatch) {\n return emptyAndBatch;\n }\n var versionCheck = xhr && request.getResponseHeader('DataServiceVersion');\n var count = null;\n var version = (versionCheck && parseInt(versionCheck, 10)) || 2;\n if (query && query.isCountRequired) {\n var oDataCount = '__count';\n if (data[oDataCount] || data['odata.count']) {\n count = data[oDataCount] || data['odata.count'];\n }\n if (data.d) {\n data = data.d;\n }\n if (data[oDataCount] || data['odata.count']) {\n count = data[oDataCount] || data['odata.count'];\n }\n }\n if (version === 3 && data.value) {\n data = data.value;\n }\n if (data.d) {\n data = data.d;\n }\n if (version < 3 && data.results) {\n data = data.results;\n }\n var args = {};\n args.count = count;\n args.result = data;\n this.getAggregateResult(pvt, data, args, null, query);\n return DataUtil.isNull(count) ? args.result : { result: args.result, count: args.count, aggregates: args.aggregates };\n };\n /**\n * Converts the request object to query string.\n * @param {Object} req\n * @param {Query} query\n * @param {DataManager} dm\n * @returns tableName\n */\n ODataAdaptor.prototype.convertToQueryString = function (request, query, dm) {\n var res = [];\n var table = 'table';\n var tableName = request[table] || '';\n var format = '$format';\n delete request[table];\n if (dm.dataSource.requiresFormat) {\n request[format] = 'json';\n }\n var keys = Object.keys(request);\n for (var _i = 0, keys_4 = keys; _i < keys_4.length; _i++) {\n var prop = keys_4[_i];\n res.push(prop + '=' + request[prop]);\n }\n res = res.join('&');\n if (dm.dataSource.url && dm.dataSource.url.indexOf('?') !== -1 && !tableName) {\n return res;\n }\n return res.length ? tableName + '?' + res : tableName || '';\n };\n ODataAdaptor.prototype.localTimeReplacer = function (key, convertObj) {\n for (var _i = 0, _a = !isNullOrUndefined(convertObj) ? Object.keys(convertObj) : []; _i < _a.length; _i++) {\n var prop = _a[_i];\n if ((convertObj[prop] instanceof Date)) {\n convertObj[prop] = DataUtil.dateParse.toLocalTime(convertObj[prop]);\n }\n }\n return convertObj;\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n * @param {DataManager} dm\n * @param {Object} data\n * @param {string} tableName?\n */\n ODataAdaptor.prototype.insert = function (dm, data, tableName) {\n return {\n url: (dm.dataSource.insertUrl || dm.dataSource.url).replace(/\\/*$/, tableName ? '/' + tableName : ''),\n data: JSON.stringify(data, this.options.localTime ? this.localTimeReplacer : null)\n };\n };\n /**\n * Prepare and return request body which is used to remove record from the table.\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {number} value\n * @param {string} tableName?\n */\n ODataAdaptor.prototype.remove = function (dm, keyField, value, tableName) {\n var url;\n if (typeof value === 'string' && !DataUtil.parse.isGuid(value)) {\n url = \"('\" + value + \"')\";\n }\n else {\n url = \"(\" + value + \")\";\n }\n return {\n type: 'DELETE',\n url: (dm.dataSource.removeUrl || dm.dataSource.url).replace(/\\/*$/, tableName ? '/' + tableName : '') + url\n };\n };\n /**\n * Updates existing record and saves the changes to the table.\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n * @returns this\n */\n ODataAdaptor.prototype.update = function (dm, keyField, value, tableName, query, original) {\n if (this.options.updateType === 'PATCH' && !isNullOrUndefined(original)) {\n value = this.compareAndRemove(value, original, keyField);\n }\n var url;\n if (typeof value[keyField] === 'string' && !DataUtil.parse.isGuid(value[keyField])) {\n url = \"('\" + value[keyField] + \"')\";\n }\n else {\n url = \"(\" + value[keyField] + \")\";\n }\n return {\n type: this.options.updateType,\n url: (dm.dataSource.updateUrl || dm.dataSource.url).replace(/\\/*$/, tableName ? '/' + tableName : '') + url,\n data: JSON.stringify(value, this.options.localTime ? this.localTimeReplacer : null),\n accept: this.options.accept\n };\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * The result is used by the batch request.\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {RemoteArgs} e\n * @returns {Object}\n */\n ODataAdaptor.prototype.batchRequest = function (dm, changes, e, query, original) {\n var initialGuid = e.guid = DataUtil.getGuid(this.options.batchPre);\n var url = this.rootUrl ? this.rootUrl + '/' + this.options.batch :\n dm.dataSource.url.replace(/\\/*$/, '/' + this.options.batch);\n e.url = this.resourceTableName ? this.resourceTableName : e.url;\n var args = {\n url: e.url,\n key: e.key,\n cid: 1,\n cSet: DataUtil.getGuid(this.options.changeSet)\n };\n var req = '--' + initialGuid + '\\n';\n req += 'Content-Type: multipart/mixed; boundary=' + args.cSet.replace('--', '') + '\\n';\n this.pvt.changeSet = 0;\n req += this.generateInsertRequest(changes.addedRecords, args, dm);\n req += this.generateUpdateRequest(changes.changedRecords, args, dm, original ? original.changedRecords : []);\n req += this.generateDeleteRequest(changes.deletedRecords, args, dm);\n req += args.cSet + '--\\n';\n req += '--' + initialGuid + '--';\n return {\n type: 'POST',\n url: url,\n dataType: 'json',\n contentType: 'multipart/mixed; charset=UTF-8;boundary=' + initialGuid,\n data: req\n };\n };\n /**\n * Generate the string content from the removed records.\n * The result will be send during batch update.\n * @param {Object[]} arr\n * @param {RemoteArgs} e\n * @returns this\n */\n ODataAdaptor.prototype.generateDeleteRequest = function (arr, e, dm) {\n if (!arr) {\n return '';\n }\n var req = '';\n var stat = {\n 'method': 'DELETE ',\n 'url': function (data, i, key) {\n var url = DataUtil.getObject(key, data[i]);\n if (typeof url === 'number' || DataUtil.parse.isGuid(url)) {\n return '(' + url + ')';\n }\n else if (url instanceof Date) {\n var dateTime = data[i][key];\n return '(' + dateTime.toJSON() + ')';\n }\n else {\n return \"('\" + url + \"')\";\n }\n },\n 'data': function (data, i) { return ''; }\n };\n req = this.generateBodyContent(arr, e, stat, dm);\n return req + '\\n';\n };\n /**\n * Generate the string content from the inserted records.\n * The result will be send during batch update.\n * @param {Object[]} arr\n * @param {RemoteArgs} e\n */\n ODataAdaptor.prototype.generateInsertRequest = function (arr, e, dm) {\n if (!arr) {\n return '';\n }\n var req = '';\n var stat = {\n 'method': 'POST ',\n 'url': function (data, i, key) { return ''; },\n 'data': function (data, i) { return JSON.stringify(data[i]) + '\\n\\n'; }\n };\n req = this.generateBodyContent(arr, e, stat, dm);\n return req;\n };\n /**\n * Generate the string content from the updated records.\n * The result will be send during batch update.\n * @param {Object[]} arr\n * @param {RemoteArgs} e\n */\n ODataAdaptor.prototype.generateUpdateRequest = function (arr, e, dm, org) {\n var _this = this;\n if (!arr) {\n return '';\n }\n var req = '';\n arr.forEach(function (change) { return change = _this.compareAndRemove(change, org.filter(function (o) { return DataUtil.getObject(e.key, o) === DataUtil.getObject(e.key, change); })[0], e.key); });\n var stat = {\n 'method': this.options.updateType + ' ',\n 'url': function (data, i, key) {\n if (typeof data[i][key] === 'number' || DataUtil.parse.isGuid(data[i][key])) {\n return '(' + data[i][key] + ')';\n }\n else if (data[i][key] instanceof Date) {\n var date = data[i][key];\n return '(' + date.toJSON() + ')';\n }\n else {\n return \"('\" + data[i][key] + \"')\";\n }\n },\n 'data': function (data, i) { return JSON.stringify(data[i]) + '\\n\\n'; }\n };\n req = this.generateBodyContent(arr, e, stat, dm);\n return req;\n };\n ODataAdaptor.getField = function (prop) {\n return prop.replace(/\\./g, '/');\n };\n ODataAdaptor.prototype.generateBodyContent = function (arr, e, stat, dm) {\n var req = '';\n for (var i = 0; i < arr.length; i++) {\n req += '\\n' + e.cSet + '\\n';\n req += this.options.changeSetContent + '\\n\\n';\n req += stat.method;\n if (stat.method === 'POST ') {\n req += (dm.dataSource.insertUrl || dm.dataSource.crudUrl || e.url) + stat.url(arr, i, e.key) + ' HTTP/1.1\\n';\n }\n else if (stat.method === 'PUT ' || stat.method === 'PATCH ') {\n req += (dm.dataSource.updateUrl || dm.dataSource.crudUrl || e.url) + stat.url(arr, i, e.key) + ' HTTP/1.1\\n';\n }\n else if (stat.method === 'DELETE ') {\n req += (dm.dataSource.removeUrl || dm.dataSource.crudUrl || e.url) + stat.url(arr, i, e.key) + ' HTTP/1.1\\n';\n }\n req += 'Accept: ' + this.options.accept + '\\n';\n req += 'Content-Id: ' + this.pvt.changeSet++ + '\\n';\n req += this.options.batchChangeSetContentType + '\\n';\n if (!isNullOrUndefined(arr[i]['@odata.etag'])) {\n req += 'If-Match: ' + arr[i]['@odata.etag'] + '\\n\\n';\n delete arr[i]['@odata.etag'];\n }\n else {\n req += '\\n';\n }\n req += stat.data(arr, i);\n }\n return req;\n };\n ODataAdaptor.prototype.processBatchResponse = function (data, query, xhr, request, changes) {\n if (xhr && xhr.getResponseHeader('Content-Type') && xhr.getResponseHeader('Content-Type').indexOf('xml') !== -1) {\n return (query.isCountRequired ? { result: [], count: 0 } : []);\n }\n if (request && this.options.batch && DataUtil.endsWith(request.url, this.options.batch) && request.type.toLowerCase() === 'post') {\n var guid = xhr.getResponseHeader('Content-Type');\n var cIdx = void 0;\n var jsonObj = void 0;\n var d = data + '';\n guid = guid.substring(guid.indexOf('=batchresponse') + 1);\n d = d.split(guid);\n if (d.length < 2) {\n return {};\n }\n d = d[1];\n var exVal = /(?:\\bContent-Type.+boundary=)(changesetresponse.+)/i.exec(d);\n if (exVal) {\n d.replace(exVal[0], '');\n }\n var changeGuid = exVal ? exVal[1] : '';\n d = d.split(changeGuid);\n for (var i = d.length; i > -1; i--) {\n if (!/\\bContent-ID:/i.test(d[i]) || !/\\bHTTP.+201/.test(d[i])) {\n continue;\n }\n cIdx = parseInt(/\\bContent-ID: (\\d+)/i.exec(d[i])[1], 10);\n if (changes.addedRecords[cIdx]) {\n jsonObj = DataUtil.parse.parseJson(/^\\{.+\\}/m.exec(d[i])[0]);\n extend({}, changes.addedRecords[cIdx], this.processResponse(jsonObj));\n }\n }\n return changes;\n }\n return null;\n };\n ODataAdaptor.prototype.compareAndRemove = function (data, original, key) {\n var _this = this;\n if (isNullOrUndefined(original)) {\n return data;\n }\n Object.keys(data).forEach(function (prop) {\n if (prop !== key && prop !== '@odata.etag') {\n if (DataUtil.isPlainObject(data[prop])) {\n _this.compareAndRemove(data[prop], original[prop]);\n var final = Object.keys(data[prop]).filter(function (data) { return data !== '@odata.etag'; });\n if (final.length === 0) {\n delete data[prop];\n }\n }\n else if (data[prop] === original[prop]) {\n delete data[prop];\n }\n else if (data[prop] && original[prop] && data[prop].valueOf() === original[prop].valueOf()) {\n delete data[prop];\n }\n }\n });\n return data;\n };\n return ODataAdaptor;\n}(UrlAdaptor));\nexport { ODataAdaptor };\n/**\n * The OData v4 is an improved version of OData protocols.\n * The DataManager uses the ODataV4Adaptor to consume OData v4 services.\n * @hidden\n */\nvar ODataV4Adaptor = /** @class */ (function (_super) {\n __extends(ODataV4Adaptor, _super);\n function ODataV4Adaptor(props) {\n var _this = _super.call(this, props) || this;\n // options replaced the default adaptor options\n _this.options = extend({}, _this.options, {\n requestType: 'get',\n accept: 'application/json, text/javascript, */*; q=0.01',\n multipartAccept: 'multipart/mixed',\n sortBy: '$orderby',\n select: '$select',\n skip: '$skip',\n take: '$top',\n count: '$count',\n search: '$search',\n where: '$filter',\n expand: '$expand',\n batch: '$batch',\n changeSet: '--changeset_',\n batchPre: 'batch_',\n contentId: 'Content-Id: ',\n batchContent: 'Content-Type: multipart/mixed; boundary=',\n changeSetContent: 'Content-Type: application/http\\nContent-Transfer-Encoding: binary ',\n batchChangeSetContentType: 'Content-Type: application/json; charset=utf-8 ',\n updateType: 'PATCH',\n localTime: false,\n apply: '$apply'\n });\n extend(_this.options, props || {});\n return _this;\n }\n /**\n * @hidden\n */\n ODataV4Adaptor.prototype.getModuleName = function () {\n return 'ODataV4Adaptor';\n };\n /**\n * Returns the query string which requests total count from the data source.\n * @param {boolean} e\n * @returns string\n */\n ODataV4Adaptor.prototype.onCount = function (e) {\n return e === true ? 'true' : '';\n };\n /**\n * Generate request string based on the filter criteria from query.\n * @param {Predicate} pred\n * @param {boolean} requiresCast?\n */\n ODataV4Adaptor.prototype.onPredicate = function (predicate, query, requiresCast) {\n var returnValue = '';\n var val = predicate.value;\n var isDate = val instanceof Date;\n if (query instanceof Query) {\n var queries = this.getQueryRequest(query);\n for (var i = 0; i < queries.filters.length; i++) {\n if (queries.filters[i].e.key === predicate.value) {\n requiresCast = true;\n }\n }\n }\n returnValue = _super.prototype.onPredicate.call(this, predicate, query, requiresCast);\n if (isDate) {\n returnValue = returnValue.replace(/datetime'(.*)'$/, '$1');\n }\n if (DataUtil.parse.isGuid(val)) {\n returnValue = returnValue.replace('guid', '').replace(/'/g, '');\n }\n return returnValue;\n };\n /**\n * Generate query string based on the multiple search criteria from query.\n * @param {{fields:string[]} e\n * @param {string} operator\n * @param {string} key\n * @param {boolean}} ignoreCase\n */\n ODataV4Adaptor.prototype.onEachSearch = function (e) {\n var search = this.pvt.searches || [];\n search.push(e.key);\n this.pvt.searches = search;\n };\n /**\n * Generate query string based on the search criteria from query.\n * @param {Object} e\n */\n ODataV4Adaptor.prototype.onSearch = function (e) {\n return this.pvt.searches.join(' OR ');\n };\n /**\n * Returns the expand query string.\n * @param {string} e\n */\n ODataV4Adaptor.prototype.onExpand = function (e) {\n var _this = this;\n var selected = {};\n var expanded = {};\n var expands = e.expands.slice();\n var exArr = [];\n var selects = e.selects.filter(function (item) { return item.indexOf('.') > -1; });\n selects.forEach(function (select) {\n var splits = select.split('.');\n if (!(splits[0] in selected)) {\n selected[splits[0]] = [];\n }\n if (splits.length == 2) {\n if (selected[splits[0]].length && Object.keys(selected).indexOf(splits[0]) !== -1) {\n if (selected[splits[0]][0].indexOf('$expand') !== -1 && selected[splits[0]][0].indexOf(';$select=') === -1) {\n selected[splits[0]][0] = selected[splits[0]][0] + ';' + '$select=' + splits[1];\n }\n else {\n selected[splits[0]][0] = selected[splits[0]][0] + ',' + splits[1];\n }\n }\n else {\n selected[splits[0]].push('$select=' + splits[1]);\n }\n }\n else {\n var sel = '$select=' + splits[splits.length - 1];\n var exp = '';\n var close_1 = '';\n for (var i = 1; i < splits.length - 1; i++) {\n exp = exp + '$expand=' + splits[i] + '(';\n close_1 = close_1 + ')';\n }\n var combineVal = exp + sel + close_1;\n if (selected[splits[0]].length && Object.keys(selected).indexOf(splits[0]) !== -1 &&\n _this.expandQueryIndex(selected[splits[0]], true)) {\n var idx = _this.expandQueryIndex(selected[splits[0]]);\n selected[splits[0]][idx] = selected[splits[0]][idx] + combineVal.replace('$expand=', ',');\n }\n else {\n selected[splits[0]].push(combineVal);\n }\n }\n });\n //Auto expand from select query\n Object.keys(selected).forEach(function (expand) {\n if ((expands.indexOf(expand) === -1)) {\n expands.push(expand);\n }\n });\n expands.forEach(function (expand) {\n expanded[expand] = expand in selected ? expand + \"(\" + selected[expand].join(';') + \")\" : expand;\n });\n Object.keys(expanded).forEach(function (ex) { return exArr.push(expanded[ex]); });\n return exArr.join(',');\n };\n ODataV4Adaptor.prototype.expandQueryIndex = function (query, isExpand) {\n for (var i = 0; i < query.length; i++) {\n if (query[i].indexOf('$expand') !== -1) {\n return isExpand ? true : i;\n }\n }\n return isExpand ? false : 0;\n };\n /**\n * Returns the groupby query string.\n * @param {string} e\n */\n ODataV4Adaptor.prototype.onDistinct = function (distinctFields) {\n var fields = distinctFields.map(function (field) { return ODataAdaptor.getField(field); }).join(',');\n return \"groupby((\" + fields + \"))\";\n };\n /**\n * Returns the select query string.\n * @param {string[]} e\n */\n ODataV4Adaptor.prototype.onSelect = function (e) {\n return _super.prototype.onSelect.call(this, e.filter(function (item) { return item.indexOf('.') === -1; }));\n };\n /**\n * Method will trigger before send the request to server side.\n * Used to set the custom header or modify the request options.\n * @param {DataManager} dm\n * @param {XMLHttpRequest} request\n * @param {Ajax} settings\n * @returns void\n */\n ODataV4Adaptor.prototype.beforeSend = function (dm, request, settings) {\n if (settings.type === 'POST' || settings.type === 'PUT' || settings.type === 'PATCH') {\n request.setRequestHeader('Prefer', 'return=representation');\n }\n request.setRequestHeader('Accept', this.options.accept);\n };\n /**\n * Returns the data from the query processing.\n * @param {DataResult} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {XMLHttpRequest} xhr?\n * @param {Ajax} request?\n * @param {CrudOptions} changes?\n * @returns aggregateResult\n */\n ODataV4Adaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n var metaName = '@odata.context';\n if ((request && request.type === 'GET') && !this.rootUrl && data[metaName]) {\n var dataUrl = data[metaName].split('/$metadata#');\n this.rootUrl = dataUrl[0];\n this.resourceTableName = dataUrl[1];\n }\n var pvtData = 'pvtData';\n var pvt = request && request[pvtData];\n var emptyAndBatch = _super.prototype.processBatchResponse.call(this, data, query, xhr, request, changes);\n if (emptyAndBatch) {\n return emptyAndBatch;\n }\n var count = null;\n var dataCount = '@odata.count';\n if (query && query.isCountRequired) {\n if (dataCount in data) {\n count = data[dataCount];\n }\n }\n data = !isNullOrUndefined(data.value) ? data.value : data;\n var args = {};\n args.count = count;\n args.result = data;\n this.getAggregateResult(pvt, data, args, null, query);\n return DataUtil.isNull(count) ? args.result : { result: args.result, count: count, aggregates: args.aggregates };\n };\n return ODataV4Adaptor;\n}(ODataAdaptor));\nexport { ODataV4Adaptor };\n/**\n * The Web API is a programmatic interface to define the request and response messages system that is mostly exposed in JSON or XML.\n * The DataManager uses the WebApiAdaptor to consume Web API.\n * Since this adaptor is targeted to interact with Web API created using OData endpoint, it is extended from ODataAdaptor\n * @hidden\n */\nvar WebApiAdaptor = /** @class */ (function (_super) {\n __extends(WebApiAdaptor, _super);\n function WebApiAdaptor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n WebApiAdaptor.prototype.getModuleName = function () {\n return 'WebApiAdaptor';\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n * @param {DataManager} dm\n * @param {Object} data\n * @param {string} tableName?\n */\n WebApiAdaptor.prototype.insert = function (dm, data, tableName) {\n return {\n type: 'POST',\n url: dm.dataSource.url,\n data: JSON.stringify(data)\n };\n };\n /**\n * Prepare and return request body which is used to remove record from the table.\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {number} value\n * @param {string} tableName?\n */\n WebApiAdaptor.prototype.remove = function (dm, keyField, value, tableName) {\n return {\n type: 'DELETE',\n url: dm.dataSource.url + '/' + value,\n data: JSON.stringify(value)\n };\n };\n /**\n * Prepare and return request body which is used to update record.\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n */\n WebApiAdaptor.prototype.update = function (dm, keyField, value, tableName) {\n return {\n type: 'PUT',\n url: dm.dataSource.url,\n data: JSON.stringify(value)\n };\n };\n WebApiAdaptor.prototype.batchRequest = function (dm, changes, e) {\n var _this = this;\n var initialGuid = e.guid = DataUtil.getGuid(this.options.batchPre);\n var url = dm.dataSource.url.replace(/\\/*$/, '/' + this.options.batch);\n e.url = this.resourceTableName ? this.resourceTableName : e.url;\n var req = [];\n var _loop_1 = function (i, x) {\n changes.addedRecords.forEach(function (j, d) {\n var stat = {\n 'method': 'POST ',\n 'url': function (data, i, key) { return ''; },\n 'data': function (data, i) { return JSON.stringify(data[i]) + '\\n\\n'; }\n };\n req.push('--' + initialGuid);\n req.push('Content-Type: application/http; msgtype=request', '');\n req.push('POST ' + '/api/' + (dm.dataSource.insertUrl || dm.dataSource.crudUrl || e.url)\n + stat.url(changes.addedRecords, i, e.key) + ' HTTP/1.1');\n req.push('Content-Type: ' + 'application/json; charset=utf-8');\n req.push('Host: ' + location.host);\n req.push('', j ? JSON.stringify(j) : '');\n });\n };\n //insertion\n for (var i = 0, x = changes.addedRecords.length; i < x; i++) {\n _loop_1(i, x);\n }\n var _loop_2 = function (i, x) {\n changes.changedRecords.forEach(function (j, d) {\n var stat = {\n 'method': _this.options.updateType + ' ',\n 'url': function (data, i, key) { return ''; },\n 'data': function (data, i) { return JSON.stringify(data[i]) + '\\n\\n'; }\n };\n req.push('--' + initialGuid);\n req.push('Content-Type: application/http; msgtype=request', '');\n req.push('PUT ' + '/api/' + (dm.dataSource.updateUrl || dm.dataSource.crudUrl || e.url)\n + stat.url(changes.changedRecords, i, e.key) + ' HTTP/1.1');\n req.push('Content-Type: ' + 'application/json; charset=utf-8');\n req.push('Host: ' + location.host);\n req.push('', j ? JSON.stringify(j) : '');\n });\n };\n //updation \n for (var i = 0, x = changes.changedRecords.length; i < x; i++) {\n _loop_2(i, x);\n }\n var _loop_3 = function (i, x) {\n changes.deletedRecords.forEach(function (j, d) {\n var state = {\n 'mtd': 'DELETE ',\n 'url': function (data, i, key) {\n var url = DataUtil.getObject(key, data[i]);\n if (typeof url === 'number' || DataUtil.parse.isGuid(url)) {\n return '/' + url;\n }\n else if (url instanceof Date) {\n var datTime = data[i][key];\n return '/' + datTime.toJSON();\n }\n else {\n return \"/'\" + url + \"'\";\n }\n },\n 'data': function (data, i) { return ''; }\n };\n req.push('--' + initialGuid);\n req.push('Content-Type: application/http; msgtype=request', '');\n req.push('DELETE ' + '/api/' + (dm.dataSource.removeUrl || dm.dataSource.crudUrl || e.url)\n + state.url(changes.deletedRecords, i, e.key) + ' HTTP/1.1');\n req.push('Content-Type: ' + 'application/json; charset=utf-8');\n req.push('Host: ' + location.host);\n req.push('', j ? JSON.stringify(j) : '');\n });\n };\n //deletion\n for (var i = 0, x = changes.deletedRecords.length; i < x; i++) {\n _loop_3(i, x);\n }\n req.push('--' + initialGuid + '--', '');\n return {\n type: 'POST',\n url: url,\n contentType: 'multipart/mixed; boundary=' + initialGuid,\n data: req.join('\\r\\n')\n };\n };\n /**\n * Method will trigger before send the request to server side.\n * Used to set the custom header or modify the request options.\n * @param {DataManager} dm\n * @param {XMLHttpRequest} request\n * @param {Ajax} settings\n * @returns void\n */\n WebApiAdaptor.prototype.beforeSend = function (dm, request, settings) {\n request.setRequestHeader('Accept', 'application/json, text/javascript, */*; q=0.01');\n };\n /**\n * Returns the data from the query processing.\n * @param {DataResult} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {XMLHttpRequest} xhr?\n * @param {Ajax} request?\n * @param {CrudOptions} changes?\n * @returns aggregateResult\n */\n WebApiAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n var pvtData = 'pvtData';\n var pvt = request && request[pvtData];\n var count = null;\n var args = {};\n if (request && request.type.toLowerCase() !== 'post') {\n var versionCheck = xhr && request.getResponseHeader('DataServiceVersion');\n var version = (versionCheck && parseInt(versionCheck, 10)) || 2;\n if (query && query.isCountRequired) {\n if (!DataUtil.isNull(data.Count)) {\n count = data.Count;\n }\n }\n if (version < 3 && data.Items) {\n data = data.Items;\n }\n args.count = count;\n args.result = data;\n this.getAggregateResult(pvt, data, args, null, query);\n }\n args.result = args.result || data;\n return DataUtil.isNull(count) ? args.result : { result: args.result, count: args.count, aggregates: args.aggregates };\n };\n return WebApiAdaptor;\n}(ODataAdaptor));\nexport { WebApiAdaptor };\n/**\n * WebMethodAdaptor can be used by DataManager to interact with web method.\n * @hidden\n */\nvar WebMethodAdaptor = /** @class */ (function (_super) {\n __extends(WebMethodAdaptor, _super);\n function WebMethodAdaptor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * Prepare the request body based on the query.\n * The query information can be accessed at the WebMethod using variable named `value`.\n * @param {DataManager} dm\n * @param {Query} query\n * @param {Object[]} hierarchyFilters?\n * @returns application\n */\n WebMethodAdaptor.prototype.processQuery = function (dm, query, hierarchyFilters) {\n var obj = new UrlAdaptor().processQuery(dm, query, hierarchyFilters);\n var getData = 'data';\n var data = DataUtil.parse.parseJson(obj[getData]);\n var result = {};\n var value = 'value';\n if (data.param) {\n for (var i = 0; i < data.param.length; i++) {\n var param = data.param[i];\n var key = Object.keys(param)[0];\n result[key] = param[key];\n }\n }\n result[value] = data;\n var pvtData = 'pvtData';\n var url = 'url';\n return {\n data: JSON.stringify(result),\n url: obj[url],\n pvtData: obj[pvtData],\n type: 'POST',\n contentType: 'application/json; charset=utf-8'\n };\n };\n return WebMethodAdaptor;\n}(UrlAdaptor));\nexport { WebMethodAdaptor };\n/**\n * RemoteSaveAdaptor, extended from JsonAdaptor and it is used for binding local data and performs all DataManager queries in client-side.\n * It interacts with server-side only for CRUD operations.\n * @hidden\n */\nvar RemoteSaveAdaptor = /** @class */ (function (_super) {\n __extends(RemoteSaveAdaptor, _super);\n /**\n * @hidden\n */\n function RemoteSaveAdaptor() {\n var _this = _super.call(this) || this;\n setValue('beforeSend', UrlAdaptor.prototype.beforeSend, _this);\n return _this;\n }\n RemoteSaveAdaptor.prototype.insert = function (dm, data, tableName, query, position) {\n this.pvt.position = position;\n this.updateType = 'add';\n return {\n url: dm.dataSource.insertUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n value: data,\n table: tableName,\n action: 'insert'\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n RemoteSaveAdaptor.prototype.remove = function (dm, keyField, val, tableName, query) {\n _super.prototype.remove.call(this, dm, keyField, val);\n return {\n type: 'POST',\n url: dm.dataSource.removeUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n key: val,\n keyColumn: keyField,\n table: tableName,\n action: 'remove'\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n RemoteSaveAdaptor.prototype.update = function (dm, keyField, val, tableName, query) {\n this.updateType = 'update';\n this.updateKey = keyField;\n return {\n type: 'POST',\n url: dm.dataSource.updateUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n value: val,\n action: 'update',\n keyColumn: keyField,\n key: val[keyField],\n table: tableName\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n RemoteSaveAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes, e) {\n var i;\n var newData = request ? JSON.parse(request.data) : data;\n data = newData.action === 'batch' ? DataUtil.parse.parseJson(data) : data;\n if (this.updateType === 'add') {\n _super.prototype.insert.call(this, ds, data, null, null, this.pvt.position);\n }\n if (this.updateType === 'update') {\n _super.prototype.update.call(this, ds, this.updateKey, data);\n }\n this.updateType = undefined;\n if (data.added) {\n for (i = 0; i < data.added.length; i++) {\n _super.prototype.insert.call(this, ds, data.added[i]);\n }\n }\n if (data.changed) {\n for (i = 0; i < data.changed.length; i++) {\n _super.prototype.update.call(this, ds, e.key, data.changed[i]);\n }\n }\n if (data.deleted) {\n for (i = 0; i < data.deleted.length; i++) {\n _super.prototype.remove.call(this, ds, e.key, data.deleted[i]);\n }\n }\n return data;\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * Also perform the changes in the locally cached data to sync with the remote data.\n * The result is used by the batch request.\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {RemoteArgs} e\n */\n RemoteSaveAdaptor.prototype.batchRequest = function (dm, changes, e, query, original) {\n return {\n type: 'POST',\n url: dm.dataSource.batchUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n contentType: 'application/json; charset=utf-8',\n dataType: 'json',\n data: JSON.stringify(extend({}, {\n changed: changes.changedRecords,\n added: changes.addedRecords,\n deleted: changes.deletedRecords,\n action: 'batch',\n table: e.url,\n key: e.key\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n RemoteSaveAdaptor.prototype.addParams = function (options) {\n var urlParams = new UrlAdaptor();\n urlParams.addParams(options);\n };\n return RemoteSaveAdaptor;\n}(JsonAdaptor));\nexport { RemoteSaveAdaptor };\n/**\n * Ajax Adaptor that is extended from URL Adaptor, is used for handle data operations with user defined functions.\n * @hidden\n */\nvar CustomDataAdaptor = /** @class */ (function (_super) {\n __extends(CustomDataAdaptor, _super);\n function CustomDataAdaptor(props) {\n var _this = _super.call(this) || this;\n // options replaced the default adaptor options\n _this.options = extend({}, _this.options, {\n getData: new Function(),\n addRecord: new Function(),\n updateRecord: new Function(),\n deleteRecord: new Function(),\n batchUpdate: new Function()\n });\n extend(_this.options, props || {});\n return _this;\n }\n CustomDataAdaptor.prototype.getModuleName = function () {\n return 'CustomDataAdaptor';\n };\n return CustomDataAdaptor;\n}(UrlAdaptor));\nexport { CustomDataAdaptor };\n/**\n * The GraphqlAdaptor that is extended from URL Adaptor, is used for retrieving data from the Graphql server.\n * It interacts with the Graphql server with all the DataManager Queries and performs CRUD operations.\n * @hidden\n */\nvar GraphQLAdaptor = /** @class */ (function (_super) {\n __extends(GraphQLAdaptor, _super);\n function GraphQLAdaptor(options) {\n var _this = _super.call(this) || this;\n _this.opt = options;\n _this.schema = _this.opt.response;\n _this.query = _this.opt.query;\n _this.getVariables = _this.opt.getVariables ? _this.opt.getVariables : function () { };\n _this.getQuery = function () { return _this.query; };\n return _this;\n }\n GraphQLAdaptor.prototype.getModuleName = function () {\n return 'GraphQLAdaptor';\n };\n /**\n * Process the JSON data based on the provided queries.\n * @param {DataManager} dm\n * @param {Query} query?\n */\n GraphQLAdaptor.prototype.processQuery = function (datamanager, query) {\n var urlQuery = _super.prototype.processQuery.apply(this, arguments);\n var dm = JSON.parse(urlQuery.data);\n // constructing GraphQL parameters\n var keys = ['skip', 'take', 'sorted', 'table', 'select', 'where',\n 'search', 'requiresCounts', 'aggregates', 'params'];\n var temp = {};\n var str = 'searchwhereparams';\n keys.filter(function (e) {\n temp[e] = str.indexOf(e) > -1 ? JSON.stringify(dm[e]) : dm[e];\n });\n var vars = this.getVariables() || {};\n vars['datamanager'] = temp;\n var data = JSON.stringify({\n query: this.getQuery(),\n variables: vars\n });\n urlQuery.data = data;\n return urlQuery;\n };\n /**\n * Returns the data from the query processing.\n * It will also cache the data for later usage.\n * @param {DataResult} data\n * @param {DataManager} ds?\n * @param {Query} query?\n * @param {XMLHttpRequest} xhr?\n * @param {Object} request?\n * @returns DataResult\n */\n GraphQLAdaptor.prototype.processResponse = function (resData, ds, query, xhr, request) {\n var res = resData;\n var count;\n var aggregates;\n var result = getValue(this.schema.result, res.data);\n if (this.schema.count) {\n count = getValue(this.schema.count, res.data);\n }\n if (this.schema.aggregates) {\n aggregates = getValue(this.schema.aggregates, res.data);\n aggregates = !isNullOrUndefined(aggregates) ? DataUtil.parse.parseJson(aggregates) : aggregates;\n }\n var pvt = request.pvtData || {};\n var args = { result: result, aggregates: aggregates };\n var data = args;\n if (pvt && pvt.groups && pvt.groups.length) {\n this.getAggregateResult(pvt, data, args, null, query);\n }\n return !isNullOrUndefined(count) ? { result: args.result, count: count, aggregates: aggregates } : args.result;\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n */\n GraphQLAdaptor.prototype.insert = function () {\n var inserted = _super.prototype.insert.apply(this, arguments);\n return this.generateCrudData(inserted, 'insert');\n };\n /**\n * Prepare and returns request body which is used to update a new record in the table.\n */\n GraphQLAdaptor.prototype.update = function () {\n var inserted = _super.prototype.update.apply(this, arguments);\n return this.generateCrudData(inserted, 'update');\n };\n /**\n * Prepare and returns request body which is used to remove a new record in the table.\n */\n GraphQLAdaptor.prototype.remove = function () {\n var inserted = _super.prototype.remove.apply(this, arguments);\n return this.generateCrudData(inserted, 'remove');\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * The result is used by the batch request.\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {Object} e\n * @param {Query} query\n * @param {Object} original\n */\n GraphQLAdaptor.prototype.batchRequest = function (dm, changes, e, query, original) {\n var batch = _super.prototype.batchRequest.apply(this, arguments);\n var bData = JSON.parse(batch.data);\n bData.key = e.key;\n batch.data = JSON.stringify(bData);\n return this.generateCrudData(batch, 'batch');\n };\n GraphQLAdaptor.prototype.generateCrudData = function (crudData, action) {\n var parsed = JSON.parse(crudData.data);\n crudData.data = JSON.stringify({\n query: this.opt.getMutation(action),\n variables: parsed\n });\n return crudData;\n };\n return GraphQLAdaptor;\n}(UrlAdaptor));\nexport { GraphQLAdaptor };\n/**\n * Cache Adaptor is used to cache the data of the visited pages. It prevents new requests for the previously visited pages.\n * You can configure cache page size and duration of caching by using cachingPageSize and timeTillExpiration properties of the DataManager\n * @hidden\n */\nvar CacheAdaptor = /** @class */ (function (_super) {\n __extends(CacheAdaptor, _super);\n /**\n * Constructor for CacheAdaptor class.\n * @param {CacheAdaptor} adaptor?\n * @param {number} timeStamp?\n * @param {number} pageSize?\n * @hidden\n */\n function CacheAdaptor(adaptor, timeStamp, pageSize) {\n var _this = _super.call(this) || this;\n _this.isCrudAction = false;\n _this.isInsertAction = false;\n if (!isNullOrUndefined(adaptor)) {\n _this.cacheAdaptor = adaptor;\n }\n _this.pageSize = pageSize;\n _this.guidId = DataUtil.getGuid('cacheAdaptor');\n var obj = { keys: [], results: [] };\n window.localStorage.setItem(_this.guidId, JSON.stringify(obj));\n var guid = _this.guidId;\n if (!isNullOrUndefined(timeStamp)) {\n setInterval(function () {\n var data;\n data = DataUtil.parse.parseJson(window.localStorage.getItem(guid));\n var forDel = [];\n for (var i = 0; i < data.results.length; i++) {\n var currentTime = +new Date();\n var requestTime = +new Date(data.results[i].timeStamp);\n data.results[i].timeStamp = currentTime - requestTime;\n if (currentTime - requestTime > timeStamp) {\n forDel.push(i);\n }\n }\n for (var i = 0; i < forDel.length; i++) {\n data.results.splice(forDel[i], 1);\n data.keys.splice(forDel[i], 1);\n }\n window.localStorage.removeItem(guid);\n window.localStorage.setItem(guid, JSON.stringify(data));\n }, timeStamp);\n }\n return _this;\n }\n /**\n * It will generate the key based on the URL when we send a request to server.\n * @param {string} url\n * @param {Query} query?\n * @hidden\n */\n CacheAdaptor.prototype.generateKey = function (url, query) {\n var queries = this.getQueryRequest(query);\n var singles = Query.filterQueryLists(query.queries, ['onSelect', 'onPage', 'onSkip', 'onTake', 'onRange']);\n var key = url;\n var page = 'onPage';\n if (page in singles) {\n key += singles[page].pageIndex;\n }\n queries.sorts.forEach(function (obj) {\n key += obj.e.direction + obj.e.fieldName;\n });\n queries.groups.forEach(function (obj) {\n key += obj.e.fieldName;\n });\n queries.searches.forEach(function (obj) {\n key += obj.e.searchKey;\n });\n for (var filter = 0; filter < queries.filters.length; filter++) {\n var currentFilter = queries.filters[filter];\n if (currentFilter.e.isComplex) {\n var newQuery = query.clone();\n newQuery.queries = [];\n for (var i = 0; i < currentFilter.e.predicates.length; i++) {\n newQuery.queries.push({ fn: 'onWhere', e: currentFilter.e.predicates[i], filter: query.queries.filter });\n }\n key += currentFilter.e.condition + this.generateKey(url, newQuery);\n }\n else {\n key += currentFilter.e.field + currentFilter.e.operator + currentFilter.e.value;\n }\n }\n return key;\n };\n /**\n * Process the query to generate request body.\n * If the data is already cached, it will return the cached data.\n * @param {DataManager} dm\n * @param {Query} query?\n * @param {Object[]} hierarchyFilters?\n */\n CacheAdaptor.prototype.processQuery = function (dm, query, hierarchyFilters) {\n var key = this.generateKey(dm.dataSource.url, query);\n var cachedItems;\n cachedItems = DataUtil.parse.parseJson(window.localStorage.getItem(this.guidId));\n var data = cachedItems ? cachedItems.results[cachedItems.keys.indexOf(key)] : null;\n if (data != null && !this.isCrudAction && !this.isInsertAction) {\n return data;\n }\n this.isCrudAction = null;\n this.isInsertAction = null;\n return this.cacheAdaptor.processQuery.apply(this.cacheAdaptor, [].slice.call(arguments, 0));\n };\n /**\n * Returns the data from the query processing.\n * It will also cache the data for later usage.\n * @param {DataResult} data\n * @param {DataManager} ds?\n * @param {Query} query?\n * @param {XMLHttpRequest} xhr?\n * @param {Ajax} request?\n * @param {CrudOptions} changes?\n */\n CacheAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n if (this.isInsertAction || (request && this.cacheAdaptor.options.batch &&\n DataUtil.endsWith(request.url, this.cacheAdaptor.options.batch) && request.type.toLowerCase() === 'post')) {\n return this.cacheAdaptor.processResponse(data, ds, query, xhr, request, changes);\n }\n data = this.cacheAdaptor.processResponse.apply(this.cacheAdaptor, [].slice.call(arguments, 0));\n var key = query ? this.generateKey(ds.dataSource.url, query) : ds.dataSource.url;\n var obj = {};\n obj = DataUtil.parse.parseJson(window.localStorage.getItem(this.guidId));\n var index = obj.keys.indexOf(key);\n if (index !== -1) {\n obj.results.splice(index, 1);\n obj.keys.splice(index, 1);\n }\n obj.results[obj.keys.push(key) - 1] = { keys: key, result: data.result, timeStamp: new Date(), count: data.count };\n while (obj.results.length > this.pageSize) {\n obj.results.splice(0, 1);\n obj.keys.splice(0, 1);\n }\n window.localStorage.setItem(this.guidId, JSON.stringify(obj));\n return data;\n };\n /**\n * Method will trigger before send the request to server side. Used to set the custom header or modify the request options.\n * @param {DataManager} dm\n * @param {XMLHttpRequest} request\n * @param {Ajax} settings?\n */\n CacheAdaptor.prototype.beforeSend = function (dm, request, settings) {\n if (!isNullOrUndefined(this.cacheAdaptor.options.batch) && DataUtil.endsWith(settings.url, this.cacheAdaptor.options.batch)\n && settings.type.toLowerCase() === 'post') {\n request.setRequestHeader('Accept', this.cacheAdaptor.options.multipartAccept);\n }\n if (!dm.dataSource.crossDomain) {\n request.setRequestHeader('Accept', this.cacheAdaptor.options.accept);\n }\n };\n /**\n * Updates existing record and saves the changes to the table.\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName\n */\n CacheAdaptor.prototype.update = function (dm, keyField, value, tableName) {\n this.isCrudAction = true;\n return this.cacheAdaptor.update(dm, keyField, value, tableName);\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n * @param {DataManager} dm\n * @param {Object} data\n * @param {string} tableName?\n */\n CacheAdaptor.prototype.insert = function (dm, data, tableName) {\n this.isInsertAction = true;\n return this.cacheAdaptor.insert(dm, data, tableName);\n };\n /**\n * Prepare and return request body which is used to remove record from the table.\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n */\n CacheAdaptor.prototype.remove = function (dm, keyField, value, tableName) {\n this.isCrudAction = true;\n return this.cacheAdaptor.remove(dm, keyField, value, tableName);\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * The result is used by the batch request.\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {RemoteArgs} e\n */\n CacheAdaptor.prototype.batchRequest = function (dm, changes, e) {\n return this.cacheAdaptor.batchRequest(dm, changes, e);\n };\n return CacheAdaptor;\n}(UrlAdaptor));\nexport { CacheAdaptor };\n","import { Ajax } from '@syncfusion/ej2-base';\nimport { extend, isNullOrUndefined } from '@syncfusion/ej2-base';\nimport { DataUtil } from './util';\nimport { Query } from './query';\nimport { ODataAdaptor, JsonAdaptor, CacheAdaptor, RemoteSaveAdaptor, CustomDataAdaptor } from './adaptors';\n/**\n * DataManager is used to manage and manipulate relational data.\n */\nvar DataManager = /** @class */ (function () {\n /**\n * Constructor for DataManager class\n * @param {DataOptions|JSON[]} dataSource?\n * @param {Query} query?\n * @param {AdaptorOptions|string} adaptor?\n * @hidden\n */\n function DataManager(dataSource, query, adaptor) {\n var _this = this;\n /** @hidden */\n this.dateParse = true;\n /** @hidden */\n this.timeZoneHandling = true;\n this.requests = [];\n if (!dataSource && !this.dataSource) {\n dataSource = [];\n }\n adaptor = adaptor || dataSource.adaptor;\n if (dataSource && dataSource.timeZoneHandling === false) {\n this.timeZoneHandling = dataSource.timeZoneHandling;\n }\n var data;\n if (dataSource instanceof Array) {\n data = {\n json: dataSource,\n offline: true\n };\n }\n else if (typeof dataSource === 'object') {\n if (!dataSource.json) {\n dataSource.json = [];\n }\n data = {\n url: dataSource.url,\n insertUrl: dataSource.insertUrl,\n removeUrl: dataSource.removeUrl,\n updateUrl: dataSource.updateUrl,\n crudUrl: dataSource.crudUrl,\n batchUrl: dataSource.batchUrl,\n json: dataSource.json,\n headers: dataSource.headers,\n accept: dataSource.accept,\n data: dataSource.data,\n timeTillExpiration: dataSource.timeTillExpiration,\n cachingPageSize: dataSource.cachingPageSize,\n enableCaching: dataSource.enableCaching,\n requestType: dataSource.requestType,\n key: dataSource.key,\n crossDomain: dataSource.crossDomain,\n jsonp: dataSource.jsonp,\n dataType: dataSource.dataType,\n offline: dataSource.offline !== undefined ? dataSource.offline\n : dataSource.adaptor instanceof RemoteSaveAdaptor || dataSource.adaptor instanceof CustomDataAdaptor ?\n false : dataSource.url ? false : true,\n requiresFormat: dataSource.requiresFormat\n };\n }\n else {\n DataUtil.throwError('DataManager: Invalid arguments');\n }\n if (data.requiresFormat === undefined && !DataUtil.isCors()) {\n data.requiresFormat = isNullOrUndefined(data.crossDomain) ? true : data.crossDomain;\n }\n if (data.dataType === undefined) {\n data.dataType = 'json';\n }\n this.dataSource = data;\n this.defaultQuery = query;\n if (data.url && data.offline && !data.json.length) {\n this.isDataAvailable = false;\n this.adaptor = adaptor || new ODataAdaptor();\n this.dataSource.offline = false;\n this.ready = this.executeQuery(query || new Query());\n this.ready.then(function (e) {\n _this.dataSource.offline = true;\n _this.isDataAvailable = true;\n data.json = e.result;\n _this.adaptor = new JsonAdaptor();\n });\n }\n else {\n this.adaptor = data.offline ? new JsonAdaptor() : new ODataAdaptor();\n }\n if (!data.jsonp && this.adaptor instanceof ODataAdaptor) {\n data.jsonp = 'callback';\n }\n this.adaptor = adaptor || this.adaptor;\n if (data.enableCaching) {\n this.adaptor = new CacheAdaptor(this.adaptor, data.timeTillExpiration, data.cachingPageSize);\n }\n return this;\n }\n /**\n * Overrides DataManager's default query with given query.\n * @param {Query} query - Defines the new default query.\n */\n DataManager.prototype.setDefaultQuery = function (query) {\n this.defaultQuery = query;\n return this;\n };\n /**\n * Executes the given query with local data source.\n * @param {Query} query - Defines the query to retrieve data.\n */\n DataManager.prototype.executeLocal = function (query) {\n if (!this.defaultQuery && !(query instanceof Query)) {\n DataUtil.throwError('DataManager - executeLocal() : A query is required to execute');\n }\n if (!this.dataSource.json) {\n DataUtil.throwError('DataManager - executeLocal() : Json data is required to execute');\n }\n query = query || this.defaultQuery;\n var result = this.adaptor.processQuery(this, query);\n if (query.subQuery) {\n var from = query.subQuery.fromTable;\n var lookup = query.subQuery.lookups;\n var res = query.isCountRequired ? result.result :\n result;\n if (lookup && lookup instanceof Array) {\n DataUtil.buildHierarchy(query.subQuery.fKey, from, res, lookup, query.subQuery.key);\n }\n for (var j = 0; j < res.length; j++) {\n if (res[j][from] instanceof Array) {\n res[j] = extend({}, {}, res[j]);\n res[j][from] = this.adaptor.processResponse(query.subQuery.using(new DataManager(res[j][from].slice(0))).executeLocal(), this, query);\n }\n }\n }\n return this.adaptor.processResponse(result, this, query);\n };\n /**\n * Executes the given query with either local or remote data source.\n * It will be executed as asynchronously and returns Promise object which will be resolved or rejected after action completed.\n * @param {Query|Function} query - Defines the query to retrieve data.\n * @param {Function} done - Defines the callback function and triggers when the Promise is resolved.\n * @param {Function} fail - Defines the callback function and triggers when the Promise is rejected.\n * @param {Function} always - Defines the callback function and triggers when the Promise is resolved or rejected.\n */\n DataManager.prototype.executeQuery = function (query, done, fail, always) {\n var _this = this;\n var makeRequest = 'makeRequest';\n if (typeof query === 'function') {\n always = fail;\n fail = done;\n done = query;\n query = null;\n }\n if (!query) {\n query = this.defaultQuery;\n }\n if (!(query instanceof Query)) {\n DataUtil.throwError('DataManager - executeQuery() : A query is required to execute');\n }\n var deffered = new Deferred();\n var args = { query: query };\n if (!this.dataSource.offline && (this.dataSource.url !== undefined && this.dataSource.url !== '')\n || (!isNullOrUndefined(this.adaptor[makeRequest])) || this.isCustomDataAdaptor(this.adaptor)) {\n var result = this.adaptor.processQuery(this, query);\n if (!isNullOrUndefined(this.adaptor[makeRequest])) {\n this.adaptor[makeRequest](result, deffered, args, query);\n }\n else if (!isNullOrUndefined(result.url) || this.isCustomDataAdaptor(this.adaptor)) {\n this.requests = [];\n this.makeRequest(result, deffered, args, query);\n }\n else {\n args = DataManager.getDeferedArgs(query, result, args);\n deffered.resolve(args);\n }\n }\n else {\n DataManager.nextTick(function () {\n var res = _this.executeLocal(query);\n args = DataManager.getDeferedArgs(query, res, args);\n deffered.resolve(args);\n });\n }\n if (done || fail) {\n deffered.promise.then(done, fail);\n }\n if (always) {\n deffered.promise.then(always, always);\n }\n return deffered.promise;\n };\n DataManager.getDeferedArgs = function (query, result, args) {\n if (query.isCountRequired) {\n args.result = result.result;\n args.count = result.count;\n args.aggregates = result.aggregates;\n }\n else {\n args.result = result;\n }\n return args;\n };\n DataManager.nextTick = function (fn) {\n (window.setImmediate || window.setTimeout)(fn, 0);\n };\n DataManager.prototype.extendRequest = function (url, fnSuccess, fnFail) {\n return extend({}, {\n type: 'GET',\n dataType: this.dataSource.dataType,\n crossDomain: this.dataSource.crossDomain,\n jsonp: this.dataSource.jsonp,\n cache: true,\n processData: false,\n onSuccess: fnSuccess,\n onFailure: fnFail\n }, url);\n };\n // tslint:disable-next-line:max-func-body-length\n DataManager.prototype.makeRequest = function (url, deffered, args, query) {\n var _this = this;\n var isSelector = !!query.subQuerySelector;\n var fnFail = function (e) {\n args.error = e;\n deffered.reject(args);\n };\n var process = function (data, count, xhr, request, actual, aggregates, virtualSelectRecords) {\n args.xhr = xhr;\n args.count = count ? parseInt(count.toString(), 10) : 0;\n args.result = data;\n args.request = request;\n args.aggregates = aggregates;\n args.actual = actual;\n args.virtualSelectRecords = virtualSelectRecords;\n deffered.resolve(args);\n };\n var fnQueryChild = function (data, selector) {\n var subDeffer = new Deferred();\n var childArgs = { parent: args };\n query.subQuery.isChild = true;\n var subUrl = _this.adaptor.processQuery(_this, query.subQuery, data ? _this.adaptor.processResponse(data) : selector);\n var childReq = _this.makeRequest(subUrl, subDeffer, childArgs, query.subQuery);\n if (!isSelector) {\n subDeffer.then(function (subData) {\n if (data) {\n DataUtil.buildHierarchy(query.subQuery.fKey, query.subQuery.fromTable, data, subData, query.subQuery.key);\n process(data, subData.count, subData.xhr);\n }\n }, fnFail);\n }\n return childReq;\n };\n var fnSuccess = function (data, request) {\n if (_this.isGraphQLAdaptor(_this.adaptor)) {\n if (!isNullOrUndefined(data['errors'])) {\n return fnFail(data['errors'], request);\n }\n }\n if (_this.isCustomDataAdaptor(_this.adaptor)) {\n request = extend({}, _this.ajaxReqOption, request);\n }\n if (request.httpRequest.getResponseHeader('Content-Type').indexOf('xml') === -1 && _this.dateParse) {\n data = DataUtil.parse.parseJson(data);\n }\n var result = _this.adaptor.processResponse(data, _this, query, request.httpRequest, request);\n var count = 0;\n var aggregates = null;\n var virtualSelectRecords = 'virtualSelectRecords';\n var virtualRecords = data[virtualSelectRecords];\n if (query.isCountRequired) {\n count = result.count;\n aggregates = result.aggregates;\n result = result.result;\n }\n if (!query.subQuery) {\n process(result, count, request.httpRequest, request.type, data, aggregates, virtualRecords);\n return;\n }\n if (!isSelector) {\n fnQueryChild(result, request);\n }\n };\n var req = this.extendRequest(url, fnSuccess, fnFail);\n if (!this.isCustomDataAdaptor(this.adaptor)) {\n var ajax_1 = new Ajax(req);\n ajax_1.beforeSend = function () {\n _this.beforeSend(ajax_1.httpRequest, ajax_1);\n };\n req = ajax_1.send();\n req.catch(function (e) { return true; }); // to handle failure remote requests. \n this.requests.push(ajax_1);\n }\n else {\n this.ajaxReqOption = req;\n var request = req;\n this.adaptor.options.getData({\n data: request.data,\n onSuccess: request.onSuccess, onFailure: request.onFailure\n });\n }\n if (isSelector) {\n var promise = void 0;\n var res = query.subQuerySelector.call(this, { query: query.subQuery, parent: query });\n if (res && res.length) {\n promise = Promise.all([req, fnQueryChild(null, res)]);\n promise.then(function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var result = args[0];\n var pResult = _this.adaptor.processResponse(result[0], _this, query, _this.requests[0].httpRequest, _this.requests[0]);\n var count = 0;\n if (query.isCountRequired) {\n count = pResult.count;\n pResult = pResult.result;\n }\n var cResult = _this.adaptor.processResponse(result[1], _this, query.subQuery, _this.requests[1].httpRequest, _this.requests[1]);\n count = 0;\n if (query.subQuery.isCountRequired) {\n count = cResult.count;\n cResult = cResult.result;\n }\n DataUtil.buildHierarchy(query.subQuery.fKey, query.subQuery.fromTable, pResult, cResult, query.subQuery.key);\n isSelector = false;\n process(pResult, count, _this.requests[0].httpRequest);\n });\n }\n else {\n isSelector = false;\n }\n }\n return req;\n };\n DataManager.prototype.beforeSend = function (request, settings) {\n this.adaptor.beforeSend(this, request, settings);\n var headers = this.dataSource.headers;\n var props;\n for (var i = 0; headers && i < headers.length; i++) {\n props = [];\n var keys = Object.keys(headers[i]);\n for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\n var prop = keys_1[_i];\n props.push(prop);\n request.setRequestHeader(prop, headers[i][prop]);\n }\n }\n };\n /**\n * Save bulk changes to the given table name.\n * User can add a new record, edit an existing record, and delete a record at the same time.\n * If the datasource from remote, then updated in a single post.\n * @param {Object} changes - Defines the CrudOptions.\n * @param {string} key - Defines the column field.\n * @param {string|Query} tableName - Defines the table name.\n * @param {Query} query - Sets default query for the DataManager.\n */\n DataManager.prototype.saveChanges = function (changes, key, tableName, query, original) {\n var _this = this;\n if (tableName instanceof Query) {\n query = tableName;\n tableName = null;\n }\n var args = {\n url: tableName,\n key: key || this.dataSource.key\n };\n var req = this.adaptor.batchRequest(this, changes, args, query || new Query(), original);\n var doAjaxRequest = 'doAjaxRequest';\n if (this.dataSource.offline) {\n return req;\n }\n if (!isNullOrUndefined(this.adaptor[doAjaxRequest])) {\n return this.adaptor[doAjaxRequest](req);\n }\n else if (!this.isCustomDataAdaptor(this.adaptor)) {\n var deff_1 = new Deferred();\n var ajax_2 = new Ajax(req);\n ajax_2.beforeSend = function () {\n _this.beforeSend(ajax_2.httpRequest, ajax_2);\n };\n ajax_2.onSuccess = function (data, request) {\n if (_this.isGraphQLAdaptor(_this.adaptor)) {\n if (!isNullOrUndefined(data['errors'])) {\n ajax_2.onFailure(JSON.stringify(data['errors']));\n }\n }\n deff_1.resolve(_this.adaptor.processResponse(data, _this, null, request.httpRequest, request, changes, args));\n };\n ajax_2.onFailure = function (e) {\n deff_1.reject([{ error: e }]);\n };\n ajax_2.send().catch(function (e) { return true; }); // to handle the failure requests. \n return deff_1.promise;\n }\n else {\n return this.doAjaxRequest(req, this.adaptor.options.batchUpdate);\n }\n };\n /**\n * Inserts new record in the given table.\n * @param {Object} data - Defines the data to insert.\n * @param {string|Query} tableName - Defines the table name.\n * @param {Query} query - Sets default query for the DataManager.\n */\n DataManager.prototype.insert = function (data, tableName, query, position) {\n if (tableName instanceof Query) {\n query = tableName;\n tableName = null;\n }\n var req = this.adaptor.insert(this, data, tableName, query, position);\n var doAjaxRequest = 'doAjaxRequest';\n if (this.dataSource.offline) {\n return req;\n }\n if (!isNullOrUndefined(this.adaptor[doAjaxRequest])) {\n return this.adaptor[doAjaxRequest](req);\n }\n else {\n return this.doAjaxRequest(req, this.adaptor.options.addRecord);\n }\n };\n /**\n * Removes data from the table with the given key.\n * @param {string} keyField - Defines the column field.\n * @param {Object} value - Defines the value to find the data in the specified column.\n * @param {string|Query} tableName - Defines the table name\n * @param {Query} query - Sets default query for the DataManager.\n */\n DataManager.prototype.remove = function (keyField, value, tableName, query) {\n if (typeof value === 'object') {\n value = DataUtil.getObject(keyField, value);\n }\n if (tableName instanceof Query) {\n query = tableName;\n tableName = null;\n }\n var res = this.adaptor.remove(this, keyField, value, tableName, query);\n var doAjaxRequest = 'doAjaxRequest';\n if (this.dataSource.offline) {\n return res;\n }\n if (!isNullOrUndefined(this.adaptor[doAjaxRequest])) {\n return this.adaptor[doAjaxRequest](res);\n }\n else {\n var remove = this.adaptor.options.deleteRecord;\n return this.doAjaxRequest(res, remove);\n }\n };\n /**\n * Updates existing record in the given table.\n * @param {string} keyField - Defines the column field.\n * @param {Object} value - Defines the value to find the data in the specified column.\n * @param {string|Query} tableName - Defines the table name\n * @param {Query} query - Sets default query for the DataManager.\n */\n DataManager.prototype.update = function (keyField, value, tableName, query, original) {\n if (tableName instanceof Query) {\n query = tableName;\n tableName = null;\n }\n var res = this.adaptor.update(this, keyField, value, tableName, query, original);\n var doAjaxRequest = 'doAjaxRequest';\n if (this.dataSource.offline) {\n return res;\n }\n if (!isNullOrUndefined(this.adaptor[doAjaxRequest])) {\n return this.adaptor[doAjaxRequest](res);\n }\n else {\n var update = this.adaptor.options.updateRecord;\n return this.doAjaxRequest(res, update);\n }\n };\n DataManager.prototype.isCustomDataAdaptor = function (dataSource) {\n return this.adaptor.getModuleName &&\n this.adaptor.getModuleName() === 'CustomDataAdaptor';\n };\n DataManager.prototype.isGraphQLAdaptor = function (dataSource) {\n return this.adaptor.getModuleName &&\n this.adaptor.getModuleName() === 'GraphQLAdaptor';\n };\n DataManager.prototype.successFunc = function (record, request) {\n if (this.isGraphQLAdaptor(this.adaptor)) {\n var data = JSON.parse(record);\n if (!isNullOrUndefined(data['errors'])) {\n this.failureFunc(JSON.stringify(data['errors']));\n }\n }\n if (this.isCustomDataAdaptor(this.adaptor)) {\n request = extend({}, this.ajaxReqOption, request);\n }\n try {\n DataUtil.parse.parseJson(record);\n }\n catch (e) {\n record = [];\n }\n record = this.adaptor.processResponse(DataUtil.parse.parseJson(record), this, null, request.httpRequest, request);\n this.ajaxDeffered.resolve(record);\n };\n ;\n DataManager.prototype.failureFunc = function (e) {\n this.ajaxDeffered.reject([{ error: e }]);\n };\n ;\n DataManager.prototype.doAjaxRequest = function (res, ajaxFunc) {\n var _this = this;\n res = extend({}, {\n type: 'POST',\n contentType: 'application/json; charset=utf-8',\n processData: false\n }, res);\n this.ajaxDeffered = new Deferred();\n if (!this.isCustomDataAdaptor(this.adaptor)) {\n var ajax_3 = new Ajax(res);\n ajax_3.beforeSend = function () {\n _this.beforeSend(ajax_3.httpRequest, ajax_3);\n };\n ajax_3.onSuccess = this.successFunc.bind(this);\n ajax_3.onFailure = this.failureFunc.bind(this);\n ajax_3.send().catch(function (e) { return true; }); // to handle the failure requests.\n }\n else {\n this.ajaxReqOption = res;\n ajaxFunc.call(this, {\n data: res.data, onSuccess: this.successFunc.bind(this),\n onFailure: this.failureFunc.bind(this)\n });\n }\n return this.ajaxDeffered.promise;\n };\n return DataManager;\n}());\nexport { DataManager };\n/**\n * Deferred is used to handle asynchronous operation.\n */\nvar Deferred = /** @class */ (function () {\n function Deferred() {\n var _this = this;\n /**\n * Promise is an object that represents a value that may not be available yet, but will be resolved at some point in the future.\n */\n this.promise = new Promise(function (resolve, reject) {\n _this.resolve = resolve;\n _this.reject = reject;\n });\n /**\n * Defines the callback function triggers when the Deferred object is resolved.\n */\n this.then = this.promise.then.bind(this.promise);\n /**\n * Defines the callback function triggers when the Deferred object is rejected.\n */\n this.catch = this.promise.catch.bind(this.promise);\n }\n return Deferred;\n}());\nexport { Deferred };\n"],"names":["Query","from","this","subQuery","isChild","distincts","queries","key","fKey","fromTable","Array","lookups","expands","sortedColumns","groupedColumns","params","lazyLoad","prototype","setKey","field","using","dataManager","execute","done","fail","always","executeQuery","DataUtil","throwError","executeLocal","clone","cloned","slice","subQuerySelector","isCountRequired","tableName","addParams","value","push","fn","distinct","fields","call","expand","tables","where","fieldName","operator","ignoreCase","ignoreAccent","matchCase","toLowerCase","predicate","Predicate","e","search","searchKey","fieldNames","comparer","fnOperators","sortBy","isFromGroup","sortByForeignKey","direction","sorts","temp","order","isNullOrUndefined","endsWith","replace","fnSort","filterQueries","i","length","j","sortByDesc","group","format","page","pageIndex","pageSize","range","start","end","take","nos","skip","select","hierarchy","query","selectorFn","foreignKey","requiresCount","aggregate","type","name","filter","q","filterQueryLists","singles","filtered","indexOf","res","isComplex","processOperator","condition","predicates","apply","and","args","_i","arguments","combinePredicates","combine","or","fromJson","json","len","fromJSONData","pred","validate","record","isAnd","ret","getObject","toJson","p","preds","consts","GroupGuid","getValue","inst","input","substr","startsWith","fnAscending","fnDescending","x","y","undefined","localeCompare","extractFields","obj","newObj","setValue","jsonArray","newData","aggregates","level","groupDs","isLazyLoad","jsonData","this_1","items","count","indx","childLevels","grouped","groupedArray","records","this_2","val","getVal","tempObj","aggs","buildHierarchy","source","lookup","pKey","grp","result","fKeyData","getFieldList","prefix","copyObj","keys_1","Object","keys","prop","nameSpace","splits","split","toString","fromObj","sort","ds","middle","parseInt","left","right","merge","ignoreDiacritics","map","diacritics","join","current","shift","array","index","callAdaptorFunction","adaptor","fnName","param1","param2","getAddParams","adp","dm","req","reqParams","isPlainObject","constructor","isCors","xhr","window","getGuid","rand","crypto","arr","Uint8Array","getRandomValues","Math","random","isNull","getItemFromComparer","keyVal","castRequired","requiresCompleteRecord","tmp","forEach","data","processData","prepareQuery","sampledata","DataManager","requiresCounts","returnValue","JSON","stringify","_this","parse","parseJson","predicateList","concat","getPredicate","sorted","mainPred","childPred","cpre","_a","serverTimezoneOffset","timeZoneHandling","error","Error","message","stack","sum","isNaN","average","min","max","truecount","falsecount","operatorSymbols","<",">","<=",">=","==","!=","*=","$=","^=","odBiOperator","lessthan","lessthanorequal","greaterthan","greaterthanorequal","equal","notequal","odUniOperator","endswith","startswith","contains","odv4UniOperator","Ⓐ","A","À","Á","Â","Ầ","Ấ","Ẫ","Ẩ","Ã","Ā","Ă","Ằ","Ắ","Ẵ","Ẳ","Ȧ","Ǡ","Ä","Ǟ","Ả","Å","Ǻ","Ǎ","Ȁ","Ȃ","Ạ","Ậ","Ặ","Ḁ","Ą","Ⱥ","Ɐ","Ꜳ","Æ","Ǽ","Ǣ","Ꜵ","Ꜷ","Ꜹ","Ꜻ","Ꜽ","Ⓑ","B","Ḃ","Ḅ","Ḇ","Ƀ","Ƃ","Ɓ","Ⓒ","C","Ć","Ĉ","Ċ","Č","Ç","Ḉ","Ƈ","Ȼ","Ꜿ","Ⓓ","D","Ḋ","Ď","Ḍ","Ḑ","Ḓ","Ḏ","Đ","Ƌ","Ɗ","Ɖ","Ꝺ","DZ","DŽ","Dz","Dž","Ⓔ","E","È","É","Ê","Ề","Ế","Ễ","Ể","Ẽ","Ē","Ḕ","Ḗ","Ĕ","Ė","Ë","Ẻ","Ě","Ȅ","Ȇ","Ẹ","Ệ","Ȩ","Ḝ","Ę","Ḙ","Ḛ","Ɛ","Ǝ","Ⓕ","F","Ḟ","Ƒ","Ꝼ","Ⓖ","G","Ǵ","Ĝ","Ḡ","Ğ","Ġ","Ǧ","Ģ","Ǥ","Ɠ","Ꞡ","Ᵹ","Ꝿ","Ⓗ","H","Ĥ","Ḣ","Ḧ","Ȟ","Ḥ","Ḩ","Ḫ","Ħ","Ⱨ","Ⱶ","Ɥ","Ⓘ","I","Ì","Í","Î","Ĩ","Ī","Ĭ","İ","Ï","Ḯ","Ỉ","Ǐ","Ȉ","Ȋ","Ị","Į","Ḭ","Ɨ","Ⓙ","J","Ĵ","Ɉ","Ⓚ","K","Ḱ","Ǩ","Ḳ","Ķ","Ḵ","Ƙ","Ⱪ","Ꝁ","Ꝃ","Ꝅ","Ꞣ","Ⓛ","L","Ŀ","Ĺ","Ľ","Ḷ","Ḹ","Ļ","Ḽ","Ḻ","Ł","Ƚ","Ɫ","Ⱡ","Ꝉ","Ꝇ","Ꞁ","LJ","Lj","Ⓜ","M","Ḿ","Ṁ","Ṃ","Ɱ","Ɯ","Ⓝ","N","Ǹ","Ń","Ñ","Ṅ","Ň","Ṇ","Ņ","Ṋ","Ṉ","Ƞ","Ɲ","Ꞑ","Ꞥ","NJ","Nj","Ⓞ","O","Ò","Ó","Ô","Ồ","Ố","Ỗ","Ổ","Õ","Ṍ","Ȭ","Ṏ","Ō","Ṑ","Ṓ","Ŏ","Ȯ","Ȱ","Ö","Ȫ","Ỏ","Ő","Ǒ","Ȍ","Ȏ","Ơ","Ờ","Ớ","Ỡ","Ở","Ợ","Ọ","Ộ","Ǫ","Ǭ","Ø","Ǿ","Ɔ","Ɵ","Ꝋ","Ꝍ","Ƣ","Ꝏ","Ȣ","Ⓟ","P","Ṕ","Ṗ","Ƥ","Ᵽ","Ꝑ","Ꝓ","Ꝕ","Ⓠ","Q","Ꝗ","Ꝙ","Ɋ","Ⓡ","R","Ŕ","Ṙ","Ř","Ȑ","Ȓ","Ṛ","Ṝ","Ŗ","Ṟ","Ɍ","Ɽ","Ꝛ","Ꞧ","Ꞃ","Ⓢ","S","ẞ","Ś","Ṥ","Ŝ","Ṡ","Š","Ṧ","Ṣ","Ṩ","Ș","Ş","Ȿ","Ꞩ","Ꞅ","Ⓣ","T","Ṫ","Ť","Ṭ","Ț","Ţ","Ṱ","Ṯ","Ŧ","Ƭ","Ʈ","Ⱦ","Ꞇ","Ꜩ","Ⓤ","U","Ù","Ú","Û","Ũ","Ṹ","Ū","Ṻ","Ŭ","Ü","Ǜ","Ǘ","Ǖ","Ǚ","Ủ","Ů","Ű","Ǔ","Ȕ","Ȗ","Ư","Ừ","Ứ","Ữ","Ử","Ự","Ụ","Ṳ","Ų","Ṷ","Ṵ","Ʉ","Ⓥ","V","Ṽ","Ṿ","Ʋ","Ꝟ","Ʌ","Ꝡ","Ⓦ","W","Ẁ","Ẃ","Ŵ","Ẇ","Ẅ","Ẉ","Ⱳ","Ⓧ","X","Ẋ","Ẍ","Ⓨ","Y","Ỳ","Ý","Ŷ","Ỹ","Ȳ","Ẏ","Ÿ","Ỷ","Ỵ","Ƴ","Ɏ","Ỿ","Ⓩ","Z","Ź","Ẑ","Ż","Ž","Ẓ","Ẕ","Ƶ","Ȥ","Ɀ","Ⱬ","Ꝣ","ⓐ","a","ẚ","à","á","â","ầ","ấ","ẫ","ẩ","ã","ā","ă","ằ","ắ","ẵ","ẳ","ȧ","ǡ","ä","ǟ","ả","å","ǻ","ǎ","ȁ","ȃ","ạ","ậ","ặ","ḁ","ą","ⱥ","ɐ","ꜳ","æ","ǽ","ǣ","ꜵ","ꜷ","ꜹ","ꜻ","ꜽ","ⓑ","b","ḃ","ḅ","ḇ","ƀ","ƃ","ɓ","ⓒ","c","ć","ĉ","ċ","č","ç","ḉ","ƈ","ȼ","ꜿ","ↄ","ⓓ","d","ḋ","ď","ḍ","ḑ","ḓ","ḏ","đ","ƌ","ɖ","ɗ","ꝺ","dz","dž","ⓔ","e","è","é","ê","ề","ế","ễ","ể","ẽ","ē","ḕ","ḗ","ĕ","ė","ë","ẻ","ě","ȅ","ȇ","ẹ","ệ","ȩ","ḝ","ę","ḙ","ḛ","ɇ","ɛ","ǝ","ⓕ","f","ḟ","ƒ","ꝼ","ⓖ","g","ǵ","ĝ","ḡ","ğ","ġ","ǧ","ģ","ǥ","ɠ","ꞡ","ᵹ","ꝿ","ⓗ","h","ĥ","ḣ","ḧ","ȟ","ḥ","ḩ","ḫ","ẖ","ħ","ⱨ","ⱶ","ɥ","ƕ","ⓘ","i","ì","í","î","ĩ","ī","ĭ","ï","ḯ","ỉ","ǐ","ȉ","ȋ","ị","į","ḭ","ɨ","ı","ⓙ","j","ĵ","ǰ","ɉ","ⓚ","k","ḱ","ǩ","ḳ","ķ","ḵ","ƙ","ⱪ","ꝁ","ꝃ","ꝅ","ꞣ","ⓛ","l","ŀ","ĺ","ľ","ḷ","ḹ","ļ","ḽ","ḻ","ſ","ł","ƚ","ɫ","ⱡ","ꝉ","ꞁ","ꝇ","lj","ⓜ","m","ḿ","ṁ","ṃ","ɱ","ɯ","ⓝ","n","ǹ","ń","ñ","ṅ","ň","ṇ","ņ","ṋ","ṉ","ƞ","ɲ","ʼn","ꞑ","ꞥ","nj","ⓞ","o","ò","ó","ô","ồ","ố","ỗ","ổ","õ","ṍ","ȭ","ṏ","ō","ṑ","ṓ","ŏ","ȯ","ȱ","ö","ȫ","ỏ","ő","ǒ","ȍ","ȏ","ơ","ờ","ớ","ỡ","ở","ợ","ọ","ộ","ǫ","ǭ","ø","ǿ","ɔ","ꝋ","ꝍ","ɵ","ƣ","ȣ","ꝏ","ⓟ","p","ṕ","ṗ","ƥ","ᵽ","ꝑ","ꝓ","ꝕ","ⓠ","q","ɋ","ꝗ","ꝙ","ⓡ","r","ŕ","ṙ","ř","ȑ","ȓ","ṛ","ṝ","ŗ","ṟ","ɍ","ɽ","ꝛ","ꞧ","ꞃ","ⓢ","s","ß","ś","ṥ","ŝ","ṡ","š","ṧ","ṣ","ṩ","ș","ş","ȿ","ꞩ","ꞅ","ẛ","ⓣ","t","ṫ","ẗ","ť","ṭ","ț","ţ","ṱ","ṯ","ŧ","ƭ","ʈ","ⱦ","ꞇ","ꜩ","ⓤ","u","ù","ú","û","ũ","ṹ","ū","ṻ","ŭ","ü","ǜ","ǘ","ǖ","ǚ","ủ","ů","ű","ǔ","ȕ","ȗ","ư","ừ","ứ","ữ","ử","ự","ụ","ṳ","ų","ṷ","ṵ","ʉ","ⓥ","v","ṽ","ṿ","ʋ","ꝟ","ʌ","ꝡ","ⓦ","w","ẁ","ẃ","ŵ","ẇ","ẅ","ẘ","ẉ","ⱳ","ⓧ","x","ẋ","ẍ","ⓨ","y","ỳ","ý","ŷ","ỹ","ȳ","ẏ","ÿ","ỷ","ẙ","ỵ","ƴ","ɏ","ỿ","ⓩ","z","ź","ẑ","ż","ž","ẓ","ẕ","ƶ","ȥ","ɀ","ⱬ","ꝣ","Ά","Έ","Ή","Ί","Ϊ","Ό","Ύ","Ϋ","Ώ","ά","έ","ή","ί","ϊ","ΐ","ό","ύ","ϋ","ΰ","ω","ς","actual","expected","notnull","isnull","processSymbols","jsonText","jsonReviver","iterateAndReviveArray","iterateAndReviveJson","test","keys_2","ms","exec","offSet","dateParse","toTimeZone","Date","isUTC","secondsMs","utcFormat","hrs","mins","setHours","getHours","getMinutes","addSelfOffset","isJson","isGuid","replacer","jsonReplacer","arrayReplacer","keys_3","d","toJSON","date","jsonDateReplacer","getTimezoneOffset","toUTC","offset","utc","unix","toLocalTime","datefn","timeZone","differenceString","localtimefn","num","norm","floor","abs","getFullYear","getMonth","getDate","getSeconds","__extends","extendStatics","b","setPrototypeOf","__proto__","hasOwnProperty","__","create","Adaptor","options","requestType","dataSource","pvt","processResponse","JsonAdaptor","_super","processQuery","countFlg","keyCount","agg","lazyLoadData","lazyLoadGroup","getAggregate","onDemandGroupInfo","onPage","formGroupResult","onWhere","aggQuery","batchRequest","changes","deletedRecordsLen","deletedRecords","addedRecords","insert","changedRecords","update","remove","onAggregates","onSearch","onSortBy","fnCompare","onGroup","size","onRange","onTake","onSkip","onSelect","position","splice","keyField","UrlAdaptor","hierarchyFilters","getQueryRequest","url","request","groups","filters","searches","getFiltersFrom","getModuleName","getRequestQuery","pvtData","contentType","convertToQueryString","request1","selects","getResponseHeader","handleTimeZone","requests","action","isExpand","isArray","formRemoteGroupedData","getAggregateResult","childLevel","getGroupedRecords","hasRecords","childGroupedRecords","original","batchUrl","crudUrl","removeUrl","dataType","extend","changed","added","deleted","table","beforeSend","insertUrl","keyColumn","updateUrl","predicats","pData","aggregateData","isServerGrouping","groupQuery","ODataAdaptor","props","accept","multipartAccept","batch","changeSet","batchPre","contentId","batchContent","changeSetContent","batchChangeSetContentType","updateType","onPredicate","requiresCast","guid","getField","encodeURIComponent","onComplexPredicate","onEachWhere","onEachSearch","onEachSort","reverse","onCount","settings","setRequestHeader","overrideMimeType","rootUrl","dataUrls","resourceTableName","dataCopy","results","emptyAndBatch","processBatchResponse","versionCheck","version","requiresFormat","keys_4","localTimeReplacer","convertObj","localTime","compareAndRemove","initialGuid","cid","cSet","generateInsertRequest","generateUpdateRequest","generateDeleteRequest","stat","method","generateBodyContent","org","change","o","cIdx","jsonObj","substring","exVal","changeGuid","valueOf","ODataV4Adaptor","isDate","onExpand","selected","expanded","exArr","item","sel","exp","close_1","combineVal","expandQueryIndex","idx","ex","onDistinct","distinctFields","dataUrl","WebApiAdaptor","location","host","state","mtd","Count","Items","WebMethodAdaptor","param","RemoteSaveAdaptor","updateKey","CustomDataAdaptor","getData","Function","addRecord","updateRecord","deleteRecord","batchUpdate","GraphQLAdaptor","opt","schema","response","getVariables","getQuery","datamanager","urlQuery","vars","variables","resData","inserted","generateCrudData","bData","crudData","parsed","getMutation","CacheAdaptor","timeStamp","isCrudAction","isInsertAction","cacheAdaptor","guidId","localStorage","setItem","setInterval","getItem","forDel","currentTime","requestTime","removeItem","generateKey","currentFilter","newQuery","cachedItems","crossDomain","offline","headers","timeTillExpiration","cachingPageSize","enableCaching","jsonp","defaultQuery","isDataAvailable","ready","then","setDefaultQuery","deffered","Deferred","isCustomDataAdaptor","makeRequest","getDeferedArgs","resolve","nextTick","promise","setImmediate","setTimeout","extendRequest","fnSuccess","fnFail","cache","onSuccess","onFailure","isSelector","reject","process","virtualSelectRecords","fnQueryChild","selector","subDeffer","childArgs","parent","subUrl","childReq","subData","isGraphQLAdaptor","ajaxReqOption","httpRequest","virtualRecords","ajax_1","Ajax","send","catch","Promise","all","pResult","cResult","saveChanges","doAjaxRequest","deff_1","ajax_2","successFunc","failureFunc","ajaxDeffered","ajaxFunc","bind","ajax_3"],"mappings":"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C,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,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"}