UNPKG

@orbit/record-cache

Version:

Orbit base classes used to access and maintain a set of records.

208 lines 29.1 kB
import { QueryExpressionParseError } from '@orbit/data'; import { RecordNotFoundException } from '@orbit/records'; import { deepGet, isNone } from '@orbit/utils'; export const AsyncQueryOperators = { async findRecord(cache, expression, options) { const { record } = expression; const currentRecord = await cache.getRecordAsync(record); if (!currentRecord) { if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) { throw new RecordNotFoundException(record.type, record.id); } } return currentRecord; }, async findRecords(cache, expression, // eslint-disable-next-line @typescript-eslint/no-unused-vars options) { const exp = expression; let results = await cache.getRecordsAsync(exp.records || exp.type); if (exp.filter) { results = filterRecords(results, exp.filter); } if (exp.sort) { results = sortRecords(results, exp.sort); } if (exp.page) { results = paginateRecords(results, exp.page); } return results; }, async findRelatedRecords(cache, expression, options) { const exp = expression; const { record, relationship } = exp; const relatedIds = await cache.getRelatedRecordsAsync(record, relationship); if (!relatedIds || relatedIds.length === 0) { if (!(await cache.getRecordAsync(record))) { if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) { throw new RecordNotFoundException(record.type, record.id); } else { return undefined; } } return []; } let results = await cache.getRecordsAsync(relatedIds); if (exp.filter) { results = filterRecords(results, exp.filter); } if (exp.sort) { results = sortRecords(results, exp.sort); } if (exp.page) { results = paginateRecords(results, exp.page); } return results; }, async findRelatedRecord(cache, expression, options) { const exp = expression; const { record, relationship } = exp; const relatedId = await cache.getRelatedRecordAsync(record, relationship); if (relatedId) { return (await cache.getRecordAsync(relatedId)) || null; } else { if (!(await cache.getRecordAsync(record))) { if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) { throw new RecordNotFoundException(record.type, record.id); } else { return undefined; } } return null; } } }; function filterRecords(records, filters) { return records.filter((record) => { for (let i = 0, l = filters.length; i < l; i++) { if (!applyFilter(record, filters[i])) { return false; } } return true; }); } function applyFilter(record, filter) { if (filter.kind === 'attribute') { let actual = deepGet(record, ['attributes', filter.attribute]); if (actual === undefined) { return false; } let expected = filter.value; switch (filter.op) { case 'equal': return actual === expected; case 'gt': return actual > expected; case 'gte': return actual >= expected; case 'lt': return actual < expected; case 'lte': return actual <= expected; default: throw new QueryExpressionParseError('Filter operation ${filter.op} not recognized for Store.'); } } else if (filter.kind === 'relatedRecords') { let actual = deepGet(record, [ 'relationships', filter.relation, 'data' ]); if (actual === undefined) { return false; } let expected = filter.records; switch (filter.op) { case 'equal': return (actual.length === expected.length && expected.every((e) => actual.some((a) => a.id === e.id && a.type === e.type))); case 'all': return expected.every((e) => actual.some((a) => a.id === e.id && a.type === e.type)); case 'some': return expected.some((e) => actual.some((a) => a.id === e.id && a.type === e.type)); case 'none': return !expected.some((e) => actual.some((a) => a.id === e.id && a.type === e.type)); default: throw new QueryExpressionParseError('Filter operation ${filter.op} not recognized for Store.'); } } else if (filter.kind === 'relatedRecord') { let actual = deepGet(record, ['relationships', filter.relation, 'data']); if (actual === undefined) { return false; } let expected = filter.record; switch (filter.op) { case 'equal': if (actual === null) { return expected === null; } else { if (Array.isArray(expected)) { return expected.some((e) => actual.type === e.type && actual.id === e.id); } else if (expected) { return actual.type === expected.type && actual.id === expected.id; } else { return false; } } default: throw new QueryExpressionParseError('Filter operation ${filter.op} not recognized for Store.'); } } return false; } function sortRecords(records, sortSpecifiers) { const comparisonValues = new Map(); records.forEach((record) => { comparisonValues.set(record, sortSpecifiers.map((sortSpecifier) => { if (sortSpecifier.kind === 'attribute') { return deepGet(record, [ 'attributes', sortSpecifier.attribute ]); } else { throw new QueryExpressionParseError('Sort specifier ${sortSpecifier.kind} not recognized for Store.'); } })); }); const comparisonOrders = sortSpecifiers.map((sortExpression) => sortExpression.order === 'descending' ? -1 : 1); return records.sort((record1, record2) => { const values1 = comparisonValues.get(record1); const values2 = comparisonValues.get(record2); for (let i = 0; i < sortSpecifiers.length; i++) { if (values1[i] < values2[i]) { return -comparisonOrders[i]; } else if (values1[i] > values2[i]) { return comparisonOrders[i]; } else if (isNone(values1[i]) && !isNone(values2[i])) { return comparisonOrders[i]; } else if (isNone(values2[i]) && !isNone(values1[i])) { return -comparisonOrders[i]; } } return 0; }); } function paginateRecords(records, paginationOptions) { if (paginationOptions.limit !== undefined) { let offset = paginationOptions.offset === undefined ? 0 : paginationOptions.offset; let limit = paginationOptions.limit; return records.slice(offset, offset + limit); } else { throw new QueryExpressionParseError('Pagination options not recognized for Store. Please specify `offset` and `limit`.'); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtcXVlcnktb3BlcmF0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29wZXJhdG9ycy9hc3luYy1xdWVyeS1vcGVyYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHlCQUF5QixFQUFrQixNQUFNLGFBQWEsQ0FBQztBQUN4RSxPQUFPLEVBUUwsdUJBQXVCLEVBSXhCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLE9BQU8sRUFBUSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFXckQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQTZCO0lBQzNELEtBQUssQ0FBQyxVQUFVLENBQ2QsS0FBMEIsRUFDMUIsVUFBaUMsRUFDakMsT0FBd0I7UUFFeEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQXdCLENBQUM7UUFDNUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbEIsSUFBSSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsdUJBQXVCLEVBQUU7Z0JBQ3BDLE1BQU0sSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMzRDtTQUNGO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQ2YsS0FBMEIsRUFDMUIsVUFBaUM7SUFDakMsNkRBQTZEO0lBQzdELE9BQXdCO1FBRXhCLE1BQU0sR0FBRyxHQUFHLFVBQXlCLENBQUM7UUFDdEMsSUFBSSxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25FLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRTtZ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QUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDeEUsSUFBSSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1FBRXBDLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDO0tBQzlDO1NBQU07UUFDTCxNQUFNLElBQUkseUJBQXlCLENBQ2pDLG1GQUFtRixDQUNwRixDQUFDO0tBQ0g7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUXVlcnlFeHByZXNzaW9uUGFyc2VFcnJvciwgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICdAb3JiaXQvZGF0YSc7XG5pbXBvcnQge1xuICBBdHRyaWJ1dGVTb3J0U3BlY2lmaWVyLFxuICBGaW5kUmVjb3JkLFxuICBGaW5kUmVjb3JkcyxcbiAgRmluZFJlbGF0ZWRSZWNvcmQsXG4gIEZpbmRSZWxhdGVkUmVjb3JkcyxcbiAgSW5pdGlhbGl6ZWRSZWNvcmQsXG4gIFJlY29yZElkZW50aXR5LFxuICBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbixcbiAgUmVjb3JkUXVlcnlFeHByZXNzaW9uLFxuICBSZWNvcmRRdWVyeUV4cHJlc3Npb25SZXN1bHQsXG4gIFNvcnRTcGVjaWZpZXJcbn0gZnJvbSAnQG9yYml0L3JlY29yZHMnO1xuaW1wb3J0IHsgZGVlcEdldCwgRGljdCwgaXNOb25lIH0gZnJvbSAnQG9yYml0L3V0aWxzJztcbmltcG9ydCB7IEFzeW5jUmVjb3JkQWNjZXNzb3IgfSBmcm9tICcuLi9yZWNvcmQtYWNjZXNzb3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jUXVlcnlPcGVyYXRvciB7XG4gIChcbiAgICBjYWNoZTogQXN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBleHByZXNzaW9uOiBSZWNvcmRRdWVyeUV4cHJlc3Npb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8UmVjb3JkUXVlcnlFeHByZXNzaW9uUmVzdWx0Pjtcbn1cblxuZXhwb3J0IGNvbnN0IEFzeW5jUXVlcnlPcGVyYXRvcnM6IERpY3Q8QXN5bmNRdWVyeU9wZXJhdG9yPiA9IHtcbiAgYXN5bmMgZmluZFJlY29yZChcbiAgICBjYWNoZTogQXN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBleHByZXNzaW9uOiBSZWNvcmRRdWVyeUV4cHJlc3Npb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8UmVjb3JkUXVlcnlFeHByZXNzaW9uUmVzdWx0PiB7XG4gICAgY29uc3QgeyByZWNvcmQgfSA9IGV4cHJlc3Npb24gYXMgRmluZFJlY29yZDtcbiAgICBjb25zdCBjdXJyZW50UmVjb3JkID0gYXdhaXQgY2FjaGUuZ2V0UmVjb3JkQXN5bmMocmVjb3JkKTtcblxuICAgIGlmICghY3VycmVudFJlY29yZCkge1xuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFJlY29yZDtcbiAgfSxcblxuICBhc3luYyBmaW5kUmVjb3JkcyhcbiAgICBjYWNoZTogQXN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBleHByZXNzaW9uOiBSZWNvcmRRdWVyeUV4cHJlc3Npb24sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPEluaXRpYWxpemVkUmVjb3JkW10+IHtcbiAgICBjb25zdCBleHAgPSBleHByZXNzaW9uIGFzIEZpbmRSZWNvcmRzO1xuICAgIGxldCByZXN1bHRzID0gYXdhaXQgY2FjaGUuZ2V0UmVjb3Jkc0FzeW5jKGV4cC5yZWNvcmRzIHx8IGV4cC50eXBlKTtcbiAgICBpZiAoZXhwLmZpbHRlcikge1xuICAgICAgcmVzdWx0cyA9IGZpbHRlclJlY29yZHMocmVzdWx0cywgZXhwLmZpbHRlcik7XG4gICAgfVxuICAgIGlmIChleHAuc29ydCkge1xuICAgICAgcmVzdWx0cyA9IHNvcnRSZWNvcmRzKHJlc3VsdHMsIGV4cC5zb3J0KTtcbiAgICB9XG4gICAgaWYgKGV4cC5wYWdlKSB7XG4gICAgICByZXN1bHRzID0gcGFnaW5hdGVSZWNvcmRzKHJlc3VsdHMsIGV4cC5wYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH0sXG5cbiAgYXN5bmMgZmluZFJlbGF0ZWRSZWNvcmRzKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIGV4cHJlc3Npb246IFJlY29yZFF1ZXJ5RXhwcmVzc2lvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUHJvbWlzZTxJbml0aWFsaXplZFJlY29yZFtdIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgZXhwID0gZXhwcmVzc2lvbiBhcyBGaW5kUmVsYXRlZFJlY29yZHM7XG4gICAgY29uc3QgeyByZWNvcmQsIHJlbGF0aW9uc2hpcCB9ID0gZXhwO1xuICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBjYWNoZS5nZXRSZWxhdGVkUmVjb3Jkc0FzeW5jKHJlY29yZCwgcmVsYXRpb25zaGlwKTtcbiAgICBpZiAoIXJlbGF0ZWRJZHMgfHwgcmVsYXRlZElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmICghKGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKHJlY29yZCkpKSB7XG4gICAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBjYWNoZS5nZXRSZWNvcmRzQXN5bmMocmVsYXRlZElkcyk7XG5cbiAgICBpZiAoZXhwLmZpbHRlcikge1xuICAgICAgcmVzdWx0cyA9IGZpbHRlclJlY29yZHMocmVzdWx0cywgZXhwLmZpbHRlcik7XG4gICAgfVxuICAgIGlmIChleHAuc29ydCkge1xuICAgICAgcmVzdWx0cyA9IHNvcnRSZWNvcmRzKHJlc3VsdHMsIGV4cC5zb3J0KTtcbiAgICB9XG4gICAgaWYgKGV4cC5wYWdlKSB7XG4gICAgICByZXN1bHRzID0gcGFnaW5hdGVSZWNvcmRzKHJlc3VsdHMsIGV4cC5wYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH0sXG5cbiAgYXN5bmMgZmluZFJlbGF0ZWRSZWNvcmQoXG4gICAgY2FjaGU6IEFzeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgZXhwcmVzc2lvbjogUmVjb3JkUXVlcnlFeHByZXNzaW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPEluaXRpYWxpemVkUmVjb3JkIHwgbnVsbCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGV4cCA9IGV4cHJlc3Npb24gYXMgRmluZFJlbGF0ZWRSZWNvcmQ7XG4gICAgY29uc3QgeyByZWNvcmQsIHJlbGF0aW9uc2hpcCB9ID0gZXhwO1xuICAgIGNvbnN0IHJlbGF0ZWRJZCA9IGF3YWl0IGNhY2hlLmdldFJlbGF0ZWRSZWNvcmRBc3luYyhyZWNvcmQsIHJlbGF0aW9uc2hpcCk7XG5cbiAgICBpZiAocmVsYXRlZElkKSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKHJlbGF0ZWRJZCkpIHx8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghKGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKHJlY29yZCkpKSB7XG4gICAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gZmlsdGVyUmVjb3JkcyhyZWNvcmRzOiBJbml0aWFsaXplZFJlY29yZFtdLCBmaWx0ZXJzOiBhbnlbXSkge1xuICByZXR1cm4gcmVjb3Jkcy5maWx0ZXIoKHJlY29yZCkgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICghYXBwbHlGaWx0ZXIocmVjb3JkLCBmaWx0ZXJzW2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwbHlGaWx0ZXIocmVjb3JkOiBJbml0aWFsaXplZFJlY29yZCwgZmlsdGVyOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKGZpbHRlci5raW5kID09PSAnYXR0cmlidXRlJykge1xuICAgIGxldCBhY3R1YWwgPSBkZWVwR2V0KHJlY29yZCwgWydhdHRyaWJ1dGVzJywgZmlsdGVyLmF0dHJpYnV0ZV0pO1xuICAgIGlmIChhY3R1YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgZXhwZWN0ZWQgPSBmaWx0ZXIudmFsdWU7XG4gICAgc3dpdGNoIChmaWx0ZXIub3ApIHtcbiAgICAgIGNhc2UgJ2VxdWFsJzpcbiAgICAgICAgcmV0dXJuIGFjdHVhbCA9PT0gZXhwZWN0ZWQ7XG4gICAgICBjYXNlICdndCc6XG4gICAgICAgIHJldHVybiBhY3R1YWwgPiBleHBlY3RlZDtcbiAgICAgIGNhc2UgJ2d0ZSc6XG4gICAgICAgIHJldHVybiBhY3R1YWwgPj0gZXhwZWN0ZWQ7XG4gICAgICBjYXNlICdsdCc6XG4gICAgICAgIHJldHVybiBhY3R1YWwgPCBleHBlY3RlZDtcbiAgICAgIGNhc2UgJ2x0ZSc6XG4gICAgICAgIHJldHVybiBhY3R1YWwgPD0gZXhwZWN0ZWQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFeHByZXNzaW9uUGFyc2VFcnJvcihcbiAgICAgICAgICAnRmlsdGVyIG9wZXJhdGlvbiAke2ZpbHRlci5vcH0gbm90IHJlY29nbml6ZWQgZm9yIFN0b3JlLidcbiAgICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZmlsdGVyLmtpbmQgPT09ICdyZWxhdGVkUmVjb3JkcycpIHtcbiAgICBsZXQgYWN0dWFsOiBSZWNvcmRJZGVudGl0eVtdID0gZGVlcEdldChyZWNvcmQsIFtcbiAgICAgICdyZWxhdGlvbnNoaXBzJyxcbiAgICAgIGZpbHRlci5yZWxhdGlvbixcbiAgICAgICdkYXRhJ1xuICAgIF0pO1xuICAgIGlmIChhY3R1YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgZXhwZWN0ZWQ6IFJlY29yZElkZW50aXR5W10gPSBmaWx0ZXIucmVjb3JkcztcbiAgICBzd2l0Y2ggKGZpbHRlci5vcCkge1xuICAgICAgY2FzZSAnZXF1YWwnOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGFjdHVhbC5sZW5ndGggPT09IGV4cGVjdGVkLmxlbmd0aCAmJlxuICAgICAgICAgIGV4cGVjdGVkLmV2ZXJ5KChlKSA9PlxuICAgICAgICAgICAgYWN0dWFsLnNvbWUoKGEpID0+IGEuaWQgPT09IGUuaWQgJiYgYS50eXBlID09PSBlLnR5cGUpXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgY2FzZSAnYWxsJzpcbiAgICAgICAgcmV0dXJuIGV4cGVjdGVkLmV2ZXJ5KChlKSA9PlxuICAgICAgICAgIGFjdHVhbC5zb21lKChhKSA9PiBhLmlkID09PSBlLmlkICYmIGEudHlwZSA9PT0gZS50eXBlKVxuICAgICAgICApO1xuICAgICAgY2FzZSAnc29tZSc6XG4gICAgICAgIHJldHVybiBleHBlY3RlZC5zb21lKChlKSA9PlxuICAgICAgICAgIGFjdHVhbC5zb21lKChhKSA9PiBhLmlkID09PSBlLmlkICYmIGEudHlwZSA9PT0gZS50eXBlKVxuICAgICAgICApO1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVybiAhZXhwZWN0ZWQuc29tZSgoZSkgPT5cbiAgICAgICAgICBhY3R1YWwuc29tZSgoYSkgPT4gYS5pZCA9PT0gZS5pZCAmJiBhLnR5cGUgPT09IGUudHlwZSlcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBRdWVyeUV4cHJlc3Npb25QYXJzZUVycm9yKFxuICAgICAgICAgICdGaWx0ZXIgb3BlcmF0aW9uICR7ZmlsdGVyLm9wfSBub3QgcmVjb2duaXplZCBmb3IgU3RvcmUuJ1xuICAgICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChmaWx0ZXIua2luZCA9PT0gJ3JlbGF0ZWRSZWNvcmQnKSB7XG4gICAgbGV0IGFjdHVhbCA9IGRlZXBHZXQocmVjb3JkLCBbJ3JlbGF0aW9uc2hpcHMnLCBmaWx0ZXIucmVsYXRpb24sICdkYXRhJ10pO1xuICAgIGlmIChhY3R1YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgZXhwZWN0ZWQgPSBmaWx0ZXIucmVjb3JkO1xuICAgIHN3aXRjaCAoZmlsdGVyLm9wKSB7XG4gICAgICBjYXNlICdlcXVhbCc6XG4gICAgICAgIGlmIChhY3R1YWwgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQgPT09IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQuc29tZShcbiAgICAgICAgICAgICAgKGUpID0+IGFjdHVhbC50eXBlID09PSBlLnR5cGUgJiYgYWN0dWFsLmlkID09PSBlLmlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhY3R1YWwudHlwZSA9PT0gZXhwZWN0ZWQudHlwZSAmJiBhY3R1YWwuaWQgPT09IGV4cGVjdGVkLmlkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgUXVlcnlFeHByZXNzaW9uUGFyc2VFcnJvcihcbiAgICAgICAgICAnRmlsdGVyIG9wZXJhdGlvbiAke2ZpbHRlci5vcH0gbm90IHJlY29nbml6ZWQgZm9yIFN0b3JlLidcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzb3J0UmVjb3JkcyhcbiAgcmVjb3JkczogSW5pdGlhbGl6ZWRSZWNvcmRbXSxcbiAgc29ydFNwZWNpZmllcnM6IFNvcnRTcGVjaWZpZXJbXVxuKTogSW5pdGlhbGl6ZWRSZWNvcmRbXSB7XG4gIGNvbnN0IGNvbXBhcmlzb25WYWx1ZXMgPSBuZXcgTWFwKCk7XG5cbiAgcmVjb3Jkcy5mb3JFYWNoKChyZWNvcmQpID0+IHtcbiAgICBjb21wYXJpc29uVmFsdWVzLnNldChcbiAgICAgIHJlY29yZCxcbiAgICAgIHNvcnRTcGVjaWZpZXJzLm1hcCgoc29ydFNwZWNpZmllcikgPT4ge1xuICAgICAgICBpZiAoc29ydFNwZWNpZmllci5raW5kID09PSAnYXR0cmlidXRlJykge1xuICAgICAgICAgIHJldHVybiBkZWVwR2V0KHJlY29yZCwgW1xuICAgICAgICAgICAgJ2F0dHJpYnV0ZXMnLFxuICAgICAgICAgICAgKHNvcnRTcGVjaWZpZXIgYXMgQXR0cmlidXRlU29ydFNwZWNpZmllcikuYXR0cmlidXRlXG4gICAgICAgICAgXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXhwcmVzc2lvblBhcnNlRXJyb3IoXG4gICAgICAgICAgICAnU29ydCBzcGVjaWZpZXIgJHtzb3J0U3BlY2lmaWVyLmtpbmR9IG5vdCByZWNvZ25pemVkIGZvciBTdG9yZS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9KTtcblxuICBjb25zdCBjb21wYXJpc29uT3JkZXJzID0gc29ydFNwZWNpZmllcnMubWFwKChzb3J0RXhwcmVzc2lvbikgPT5cbiAgICBzb3J0RXhwcmVzc2lvbi5vcmRlciA9PT0gJ2Rlc2NlbmRpbmcnID8gLTEgOiAxXG4gICk7XG5cbiAgcmV0dXJuIHJlY29yZHMuc29ydCgocmVjb3JkMSwgcmVjb3JkMikgPT4ge1xuICAgIGNvbnN0IHZhbHVlczEgPSBjb21wYXJpc29uVmFsdWVzLmdldChyZWNvcmQxKTtcbiAgICBjb25zdCB2YWx1ZXMyID0gY29tcGFyaXNvblZhbHVlcy5nZXQocmVjb3JkMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0U3BlY2lmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlczFbaV0gPCB2YWx1ZXMyW2ldKSB7XG4gICAgICAgIHJldHVybiAtY29tcGFyaXNvbk9yZGVyc1tpXTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWVzMVtpXSA+IHZhbHVlczJbaV0pIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmlzb25PcmRlcnNbaV07XG4gICAgICB9IGVsc2UgaWYgKGlzTm9uZSh2YWx1ZXMxW2ldKSAmJiAhaXNOb25lKHZhbHVlczJbaV0pKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJpc29uT3JkZXJzW2ldO1xuICAgICAgfSBlbHNlIGlmIChpc05vbmUodmFsdWVzMltpXSkgJiYgIWlzTm9uZSh2YWx1ZXMxW2ldKSkge1xuICAgICAgICByZXR1cm4gLWNvbXBhcmlzb25PcmRlcnNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFnaW5hdGVSZWNvcmRzKFxuICByZWNvcmRzOiBJbml0aWFsaXplZFJlY29yZFtdLFxuICBwYWdpbmF0aW9uT3B0aW9uczogYW55XG4pOiBJbml0aWFsaXplZFJlY29yZFtdIHtcbiAgaWYgKHBhZ2luYXRpb25PcHRpb25zLmxpbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgb2Zmc2V0ID1cbiAgICAgIHBhZ2luYXRpb25PcHRpb25zLm9mZnNldCA9PT0gdW5kZWZpbmVkID8gMCA6IHBhZ2luYXRpb25PcHRpb25zLm9mZnNldDtcbiAgICBsZXQgbGltaXQgPSBwYWdpbmF0aW9uT3B0aW9ucy5saW1pdDtcblxuICAgIHJldHVybiByZWNvcmRzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbGltaXQpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBRdWVyeUV4cHJlc3Npb25QYXJzZUVycm9yKFxuICAgICAgJ1BhZ2luYXRpb24gb3B0aW9ucyBub3QgcmVjb2duaXplZCBmb3IgU3RvcmUuIFBsZWFzZSBzcGVjaWZ5IGBvZmZzZXRgIGFuZCBgbGltaXRgLidcbiAgICApO1xuICB9XG59XG4iXX0=