UNPKG

pretur.clay

Version:
182 lines 26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var Set_1 = require("./Set"); var clay_1 = require("./clay"); function buildApplyMutations(requester) { return function (mutations) { return applyMutations(requester, mutations); }; } exports.buildApplyMutations = buildApplyMutations; function applyMutations(requester, mutations) { return tslib_1.__awaiter(this, void 0, void 0, function () { var promises, _i, mutations_1, mutation, results, applied, _a, results_1, result; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: if (mutations.length === 0) { return [2 /*return*/, { results: [], applied: false }]; } requester.batchMutateStart(); promises = []; for (_i = 0, mutations_1 = mutations; _i < mutations_1.length; _i++) { mutation = mutations_1[_i]; if (mutation.type !== 'mutate') { continue; } switch (mutation.action) { case 'insert': promises.push(requester.insert(mutation)); break; case 'update': promises.push(requester.update(mutation)); break; case 'remove': promises.push(requester.remove(mutation)); break; } } requester.batchMutateEnd(); return [4 /*yield*/, Promise.all(promises)]; case 1: results = _b.sent(); applied = true; for (_a = 0, results_1 = results; _a < results_1.length; _a++) { result = results_1[_a]; if (result.errors.length > 0) { applied = false; break; } } return [2 /*return*/, { results: results, applied: applied }]; } }); }); } exports.applyMutations = applyMutations; function buildMutationsExtractor(specPool) { function extractInsertData(clay, scope, model) { if (clay instanceof Set_1.Set) { var items = []; for (var _i = 0, _a = clay.items; _i < _a.length; _i++) { var item = _a[_i]; items.push(extractInsertData(item, scope, model)); } return items; } var data = {}; var spec = specPool[scope][model]; var nonAutoIncrementedAttributes = spec.attributes .filter(function (attrib) { return !attrib.autoIncrement; }) .map(function (attrib) { return attrib.name; }); for (var _b = 0, nonAutoIncrementedAttributes_1 = nonAutoIncrementedAttributes; _b < nonAutoIncrementedAttributes_1.length; _b++) { var attribute = nonAutoIncrementedAttributes_1[_b]; var value = clay.fields[attribute]; if (value) { data[attribute] = clay_1.toPlain(value); } } var targetRelations = spec.relations .filter(function (_a) { var type = _a.type; return type === 'SUBCLASS' || type === 'MASTER' || type === 'DETAIL' || type === 'MANY_TO_MANY' || type === 'INJECTIVE'; }); for (var _c = 0, targetRelations_1 = targetRelations; _c < targetRelations_1.length; _c++) { var relation = targetRelations_1[_c]; if (clay.fields[relation.alias]) { data[relation.alias] = extractInsertData(clay.fields[relation.alias], relation.target.scope, relation.target.model); } } return data; } function extractUpdateData(record, scope, model) { var spec = specPool[scope][model]; var primaries = spec.attributes.filter(function (attrib) { return attrib.primary; }).map(function (attrib) { return attrib.name; }); var data = {}; for (var _i = 0, primaries_1 = primaries; _i < primaries_1.length; _i++) { var primary = primaries_1[_i]; data[primary] = clay_1.toPlain(record.fields[primary]); } var mutables = spec.attributes .filter(function (attrib) { return attrib.mutable; }) .map(function (attrib) { return attrib.name; }); for (var _a = 0, mutables_1 = mutables; _a < mutables_1.length; _a++) { var mutable = mutables_1[_a]; var attribute = record.fields[mutable]; if (attribute && attribute.modified) { data[mutable] = clay_1.toPlain(attribute); } } return data; } function extractRemoveIdentifiers(record, scope, model) { var spec = specPool[scope][model]; var primaries = spec.attributes.filter(function (attrib) { return attrib.primary; }).map(function (attrib) { return attrib.name; }); var identifiers = {}; for (var _i = 0, primaries_2 = primaries; _i < primaries_2.length; _i++) { var primary = primaries_2[_i]; identifiers[primary] = clay_1.toPlain(record.fields[primary]); } return identifiers; } function getMutations(clay, scope, model) { var requests = []; var spec = specPool[scope][model]; if (clay instanceof Set_1.Set) { for (var _i = 0, _a = clay.items; _i < _a.length; _i++) { var item = _a[_i]; requests.push.apply(requests, getMutations(item, scope, model)); } } else { if (clay.state === 'removed') { requests.push({ action: 'remove', identifiers: extractRemoveIdentifiers(clay, scope, model), scope: scope, model: model, type: 'mutate', }); } else if (clay.state === 'new') { requests.push({ action: 'insert', data: extractInsertData(clay, scope, model), scope: scope, model: model, type: 'mutate', }); } else { var updates = extractUpdateData(clay, scope, model); if (Object.keys(updates).length > 1) { requests.push({ scope: scope, model: model, data: updates, action: 'update', type: 'mutate', }); } for (var _b = 0, _c = spec.relations; _b < _c.length; _b++) { var relation = _c[_b]; if (clay.fields[relation.alias]) { requests.push.apply(requests, getMutations(clay.fields[relation.alias], relation.target.scope, relation.target.model)); } } } } return requests; } return { extractInsertData: extractInsertData, extractRemoveIdentifiers: extractRemoveIdentifiers, extractUpdateData: extractUpdateData, getMutations: getMutations, }; } exports.buildMutationsExtractor = buildMutationsExtractor; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXV0YXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL211dGF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSw2QkFBNEI7QUFFNUIsK0JBQWlDO0FBT2pDLDZCQUNFLFNBQW9CO0lBRXBCLE1BQU0sQ0FBQyxVQUFBLFNBQVMsSUFBSSxPQUFBLGNBQWMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQXBDLENBQW9DLENBQUM7QUFDM0QsQ0FBQztBQUpELGtEQUlDO0FBRUQsd0JBQ0UsU0FBb0IsRUFDcEIsU0FBK0I7Ozs7OztvQkFFL0IsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUMzQixNQUFNLGdCQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUM7b0JBQ3pDLENBQUM7b0JBRUQsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7b0JBRXZCLFFBQVEsR0FBaUMsRUFBRSxDQUFDO29CQUVsRCxHQUFHLENBQUMsT0FBNEIsRUFBVCx1QkFBUyxFQUFULHVCQUFTLEVBQVQsSUFBUzt3QkFBckIsUUFBUTt3QkFDakIsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDOzRCQUMvQixRQUFRLENBQUM7d0JBQ1gsQ0FBQzt3QkFFRCxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzs0QkFDeEIsS0FBSyxRQUFRO2dDQUNYLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBTSxRQUFRLENBQUMsQ0FBQyxDQUFDO2dDQUMvQyxLQUFLLENBQUM7NEJBQ1IsS0FBSyxRQUFRO2dDQUNYLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBTSxRQUFRLENBQUMsQ0FBQyxDQUFDO2dDQUMvQyxLQUFLLENB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QyxDQUFDLENBQUMsQ0FBQztvQkFDcEMsUUFBUSxDQUFDLElBQUksQ0FBbUI7d0JBQzlCLEtBQUssT0FBQTt3QkFDTCxLQUFLLE9BQUE7d0JBQ0wsSUFBSSxFQUFFLE9BQU87d0JBQ2IsTUFBTSxFQUFFLFFBQVE7d0JBQ2hCLElBQUksRUFBRSxRQUFRO3FCQUNmLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUVELEdBQUcsQ0FBQyxDQUFtQixVQUFjLEVBQWQsS0FBQSxJQUFJLENBQUMsU0FBUyxFQUFkLGNBQWMsRUFBZCxJQUFjO29CQUFoQyxJQUFNLFFBQVEsU0FBQTtvQkFDakIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNoQyxRQUFRLENBQUMsSUFBSSxPQUFiLFFBQVEsRUFBUyxZQUFZLENBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUMzQixRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFDckIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ3RCLEVBQUU7b0JBQ0wsQ0FBQztpQkFDRjtZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxDQUFDO1FBQ0wsaUJBQWlCLG1CQUFBO1FBQ2pCLHdCQUF3QiwwQkFBQTtRQUN4QixpQkFBaUIsbUJBQUE7UUFDakIsWUFBWSxjQUFBO0tBQ2IsQ0FBQztBQUNKLENBQUM7QUE3S0QsMERBNktDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3BlY1R5cGUsIE1vZGVsLCBTcGVjUG9vbCB9IGZyb20gJ3ByZXR1ci5zcGVjJztcclxuaW1wb3J0IHsgTXV0YXRlUmVxdWVzdCwgUmVxdWVzdGVyLCBNdXRhdGVSZXN1bHQgfSBmcm9tICdwcmV0dXIuc3luYyc7XHJcbmltcG9ydCB7IFNldCB9IGZyb20gJy4vU2V0JztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi9SZWNvcmQnO1xyXG5pbXBvcnQgeyB0b1BsYWluIH0gZnJvbSAnLi9jbGF5JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXBwbHlNdXRhdGlvbnNSZXN1bHQge1xyXG4gIHJlc3VsdHM6IE11dGF0ZVJlc3VsdDxhbnk+W107XHJcbiAgYXBwbGllZDogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXBwbHlNdXRhdGlvbnMoXHJcbiAgcmVxdWVzdGVyOiBSZXF1ZXN0ZXIsXHJcbik6IChtdXRhdGlvbnM6IE11dGF0ZVJlcXVlc3Q8YW55PltdKSA9PiBQcm9taXNlPEFwcGx5TXV0YXRpb25zUmVzdWx0PiB7XHJcbiAgcmV0dXJuIG11dGF0aW9ucyA9PiBhcHBseU11dGF0aW9ucyhyZXF1ZXN0ZXIsIG11dGF0aW9ucyk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseU11dGF0aW9ucyhcclxuICByZXF1ZXN0ZXI6IFJlcXVlc3RlcixcclxuICBtdXRhdGlvbnM6IE11dGF0ZVJlcXVlc3Q8YW55PltdLFxyXG4pOiBQcm9taXNlPEFwcGx5TXV0YXRpb25zUmVzdWx0PiB7XHJcbiAgaWYgKG11dGF0aW9ucy5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybiB7IHJlc3VsdHM6IFtdLCBhcHBsaWVkOiBmYWxzZSB9O1xyXG4gIH1cclxuXHJcbiAgcmVxdWVzdGVyLmJhdGNoTXV0YXRlU3RhcnQoKTtcclxuXHJcbiAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8TXV0YXRlUmVzdWx0PGFueT4+W10gPSBbXTtcclxuXHJcbiAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnMpIHtcclxuICAgIGlmIChtdXRhdGlvbi50eXBlICE9PSAnbXV0YXRlJykge1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKG11dGF0aW9uLmFjdGlvbikge1xyXG4gICAgICBjYXNlICdpbnNlcnQnOlxyXG4gICAgICAgIHByb21pc2VzLnB1c2gocmVxdWVzdGVyLmluc2VydDxhbnk+KG11dGF0aW9uKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3VwZGF0ZSc6XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaChyZXF1ZXN0ZXIudXBkYXRlPGFueT4obXV0YXRpb24pKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncmVtb3ZlJzpcclxuICAgICAgICBwcm9taXNlcy5wdXNoKHJlcXVlc3Rlci5yZW1vdmU8YW55PihtdXRhdGlvbikpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVxdWVzdGVyLmJhdGNoTXV0YXRlRW5kKCk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XHJcbiAgbGV0IGFwcGxpZWQgPSB0cnVlO1xyXG5cclxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XHJcbiAgICBpZiAocmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGFwcGxpZWQgPSBmYWxzZTtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyByZXN1bHRzLCBhcHBsaWVkIH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTXV0YXRpb25zRXh0cmFjdG9yIHtcclxuICBleHRyYWN0SW5zZXJ0RGF0YTxUIGV4dGVuZHMgU3BlY1R5cGU+KFxyXG4gICAgY2xheTogUmVjb3JkPFQ+LFxyXG4gICAgc2NvcGU6IHN0cmluZyxcclxuICAgIG1vZGVsOiBUWyduYW1lJ10sXHJcbiAgKTogUGFydGlhbDxNb2RlbDxUPj47XHJcbiAgZXh0cmFjdEluc2VydERhdGE8VCBleHRlbmRzIFNwZWNUeXBlPihcclxuICAgIGNsYXk6IFNldDxUPixcclxuICAgIHNjb3BlOiBzdHJpbmcsXHJcbiAgICBtb2RlbDogVFsnbmFtZSddLFxyXG4gICk6IFBhcnRpYWw8TW9kZWw8VD4+W107XHJcblxyXG4gIGV4dHJhY3RVcGRhdGVEYXRhPFQgZXh0ZW5kcyBTcGVjVHlwZT4oXHJcbiAgICByZWNvcmQ6IFJlY29yZDxUPixcclxuICAgIHNjb3BlOiBzdHJpbmcsXHJcbiAgICBtb2RlbDogVFsnbmFtZSddLFxyXG4gICk6IFBhcnRpYWw8VFsnZmllbGRzJ10+O1xyXG5cclxuICBleHRyYWN0UmVtb3ZlSWRlbnRpZmllcnM8VCBleHRlbmRzIFNwZWNUeXBlPihcclxuICAgIHJlY29yZDogUmVjb3JkPFQ+LFxyXG4gICAgc2NvcGU6IHN0cmluZyxcclxuICAgIG1vZGVsOiBUWyduYW1lJ10sXHJcbiAgKTogUGFydGlhbDxUWydmaWVsZHMnXT47XHJcblxyXG4gIGdldE11dGF0aW9uczxUIGV4dGVuZHMgU3BlY1R5cGU+KFxyXG4gICAgY2xheTogU2V0PFQ+IHwgUmVjb3JkPFQ+LFxyXG4gICAgc2NvcGU6IHN0cmluZyxcclxuICAgIG1vZGVsOiBUWyduYW1lJ10sXHJcbiAgKTogTXV0YXRlUmVxdWVzdDxhbnk+W107XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZE11dGF0aW9uc0V4dHJhY3RvcihcclxuICBzcGVjUG9vbDogU3BlY1Bvb2wsXHJcbik6IE11dGF0aW9uc0V4dHJhY3RvciB7XHJcbiAgZnVuY3Rpb24gZXh0cmFjdEluc2VydERhdGE8VCBleHRlbmRzIFNwZWNUeXBlPihcclxuICAgIGNsYXk6IFJlY29yZDxUPixcclxuICAgIHNjb3BlOiBzdHJpbmcsXHJcbiAgICBtb2RlbDogVFsnbmFtZSddLFxyXG4gICk6IFBhcnRpYWw8TW9kZWw8VD4+O1xyXG4gIGZ1bmN0aW9uIGV4dHJhY3RJbnNlcnREYXRhPFQgZXh0ZW5kcyBTcGVjVHlwZT4oXHJcbiAgICBjbGF5OiBTZXQ8VD4sXHJcbiAgICBzY29wZTogc3RyaW5nLFxyXG4gICAgbW9kZWw6IFRbJ25hbWUnXSxcclxuICApOiBQYXJ0aWFsPE1vZGVsPFQ+PltdO1xyXG4gIGZ1bmN0aW9uIGV4dHJhY3RJbnNlcnREYXRhPFQgZXh0ZW5kcyBTcGVjVHlwZT4oXHJcbiAgICBjbGF5OiBSZWNvcmQ8VD4gfCBTZXQ8VD4sXHJcbiAgICBzY29wZTogc3RyaW5nLFxyXG4gICAgbW9kZWw6IFRbJ25hbWUnXSxcclxuICApOiBQYXJ0aWFsPE1vZGVsPFQ+PiB8IFBhcnRpYWw8TW9kZWw8VD4+W10ge1xyXG4gICAgaWYgKGNsYXkgaW5zdGFuY2VvZiBTZXQpIHtcclxuICAgICAgY29uc3QgaXRlbXM6IFBhcnRpYWw8TW9kZWw8VD4+W10gPSBbXTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjbGF5Lml0ZW1zKSB7XHJcbiAgICAgICAgaXRlbXMucHVzaChleHRyYWN0SW5zZXJ0RGF0YShpdGVtLCBzY29wZSwgbW9kZWwpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9O1xyXG4gICAgY29uc3Qgc3BlYyA9IHNwZWNQb29sW3Njb3BlXVttb2RlbF07XHJcblxyXG4gICAgY29uc3Qgbm9uQXV0b0luY3JlbWVudGVkQXR0cmlidXRlcyA9IDwoa2V5b2YgVFsnZmllbGRzJ10pW10+c3BlYy5hdHRyaWJ1dGVzXHJcbiAgICAgIC5maWx0ZXIoYXR0cmliID0+ICFhdHRyaWIuYXV0b0luY3JlbWVudClcclxuICAgICAgLm1hcChhdHRyaWIgPT4gYXR0cmliLm5hbWUpO1xyXG5cclxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIG5vbkF1dG9JbmNyZW1lbnRlZEF0dHJpYnV0ZXMpIHtcclxuICAgICAgY29uc3QgdmFsdWUgPSBjbGF5LmZpZWxkc1thdHRyaWJ1dGVdO1xyXG4gICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICBkYXRhW2F0dHJpYnV0ZV0gPSA8YW55PnRvUGxhaW4odmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0UmVsYXRpb25zID0gc3BlYy5yZWxhdGlvbnNcclxuICAgICAgLmZpbHRlcigoeyB0eXBlIH0pID0+XHJcbiAgICAgICAgdHlwZSA9PT0gJ1NVQkNMQVNTJyB8fFxyXG4gICAgICAgIHR5cGUgPT09ICdNQVNURVInIHx8XHJcbiAgICAgICAgdHlwZSA9PT0gJ0RFVEFJTCcgfHxcclxuICAgICAgICB0eXBlID09PSAnTUFOWV9UT19NQU5ZJyB8fFxyXG4gICAgICAgIHR5cGUgPT09ICdJTkpFQ1RJVkUnLFxyXG4gICAgKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uIG9mIHRhcmdldFJlbGF0aW9ucykge1xyXG4gICAgICBpZiAoY2xheS5maWVsZHNbcmVsYXRpb24uYWxpYXNdKSB7XHJcbiAgICAgICAgZGF0YVtyZWxhdGlvbi5hbGlhc10gPSA8YW55PmV4dHJhY3RJbnNlcnREYXRhKFxyXG4gICAgICAgICAgY2xheS5maWVsZHNbcmVsYXRpb24uYWxpYXNdLFxyXG4gICAgICAgICAgcmVsYXRpb24udGFyZ2V0LnNjb3BlLFxyXG4gICAgICAgICAgcmVsYXRpb24udGFyZ2V0Lm1vZGVsLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGV4dHJhY3RVcGRhdGVEYXRhPFQgZXh0ZW5kcyBTcGVjVHlwZT4oXHJcbiAgICByZWNvcmQ6IFJlY29yZDxUPixcclxuICAgIHNjb3BlOiBzdHJpbmcsXHJcbiAgICBtb2RlbDogVFsnbmFtZSddLFxyXG4gICk6IFBhcnRpYWw8VFsnZmllbGRzJ10+IHtcclxuICAgIGNvbnN0IHNwZWMgPSBzcGVjUG9vbFtzY29wZV1bbW9kZWxdO1xyXG5cclxuICAgIGNvbnN0IHByaW1hcmllcyA9IHNwZWMuYXR0cmlidXRlcy5maWx0ZXIoYXR0cmliID0+IGF0dHJpYi5wcmltYXJ5KS5tYXAoYXR0cmliID0+IGF0dHJpYi5uYW1lKTtcclxuXHJcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHByaW1hcnkgb2YgcHJpbWFyaWVzKSB7XHJcbiAgICAgIGRhdGFbcHJpbWFyeV0gPSB0b1BsYWluKHJlY29yZC5maWVsZHNbcHJpbWFyeV0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG11dGFibGVzID0gc3BlYy5hdHRyaWJ1dGVzXHJcbiAgICAgIC5maWx0ZXIoYXR0cmliID0+IGF0dHJpYi5tdXRhYmxlKVxyXG4gICAgICAubWFwKGF0dHJpYiA9PiBhdHRyaWIubmFtZSk7XHJcblxyXG4gICAgZm9yIChjb25zdCBtdXRhYmxlIG9mIG11dGFibGVzKSB7XHJcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IHJlY29yZC5maWVsZHNbbXV0YWJsZV07XHJcbiAgICAgIGlmIChhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLm1vZGlmaWVkKSB7XHJcbiAgICAgICAgZGF0YVttdXRhYmxlXSA9IHRvUGxhaW4oYXR0cmlidXRlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZXh0cmFjdFJlbW92ZUlkZW50aWZpZXJzPFQgZXh0ZW5kcyBTcGVjVHlwZT4oXHJcbiAgICByZWNvcmQ6IFJlY29yZDxUPixcclxuICAgIHNjb3BlOiBzdHJpbmcsXHJcbiAgICBtb2RlbDogVFsnbmFtZSddLFxyXG4gICk6IFBhcnRpYWw8VFsnZmllbGRzJ10+IHtcclxuICAgIGNvbnN0IHNwZWMgPSBzcGVjUG9vbFtzY29wZV1bbW9kZWxdO1xyXG5cclxuICAgIGNvbnN0IHByaW1hcmllcyA9IHNwZWMuYXR0cmlidXRlcy5maWx0ZXIoYXR0cmliID0+IGF0dHJpYi5wcmltYXJ5KS5tYXAoYXR0cmliID0+IGF0dHJpYi5uYW1lKTtcclxuXHJcbiAgICBjb25zdCBpZGVudGlmaWVyczogYW55ID0ge307XHJcblxyXG4gICAgZm9yIChjb25zdCBwcmltYXJ5IG9mIHByaW1hcmllcykge1xyXG4gICAgICBpZGVudGlmaWVyc1twcmltYXJ5XSA9IHRvUGxhaW4ocmVjb3JkLmZpZWxkc1twcmltYXJ5XSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGlkZW50aWZpZXJzO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0TXV0YXRpb25zPFQgZXh0ZW5kcyBTcGVjVHlwZT4oXHJcbiAgICBjbGF5OiBTZXQ8VD4gfCBSZWNvcmQ8VD4sXHJcbiAgICBzY29wZTogc3RyaW5nLFxyXG4gICAgbW9kZWw6IFRbJ25hbWUnXSxcclxuICApOiBNdXRhdGVSZXF1ZXN0PFQ+W10ge1xyXG4gICAgY29uc3QgcmVxdWVzdHM6IE11dGF0ZVJlcXVlc3Q8VD5bXSA9IFtdO1xyXG4gICAgY29uc3Qgc3BlYyA9IHNwZWNQb29sW3Njb3BlXVttb2RlbF07XHJcblxyXG4gICAgaWYgKGNsYXkgaW5zdGFuY2VvZiBTZXQpIHtcclxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNsYXkuaXRlbXMpIHtcclxuICAgICAgICByZXF1ZXN0cy5wdXNoKC4uLmdldE11dGF0aW9ucyhpdGVtLCBzY29wZSwgbW9kZWwpKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGNsYXkuc3RhdGUgPT09ICdyZW1vdmVkJykge1xyXG4gICAgICAgIHJlcXVlc3RzLnB1c2goPE11dGF0ZVJlcXVlc3Q8VD4+e1xyXG4gICAgICAgICAgYWN0aW9uOiAncmVtb3ZlJyxcclxuICAgICAgICAgIGlkZW50aWZpZXJzOiBleHRyYWN0UmVtb3ZlSWRlbnRpZmllcnMoY2xheSwgc2NvcGUsIG1vZGVsKSxcclxuICAgICAgICAgIHNjb3BlLFxyXG4gICAgICAgICAgbW9kZWwsXHJcbiAgICAgICAgICB0eXBlOiAnbXV0YXRlJyxcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmIChjbGF5LnN0YXRlID09PSAnbmV3Jykge1xyXG4gICAgICAgIHJlcXVlc3RzLnB1c2goPE11dGF0ZVJlcXVlc3Q8VD4+e1xyXG4gICAgICAgICAgYWN0aW9uOiAnaW5zZXJ0JyxcclxuICAgICAgICAgIGRhdGE6IGV4dHJhY3RJbnNlcnREYXRhKGNsYXksIHNjb3BlLCBtb2RlbCksXHJcbiAgICAgICAgICBzY29wZSxcclxuICAgICAgICAgIG1vZGVsLFxyXG4gICAgICAgICAgdHlwZTogJ211dGF0ZScsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgdXBkYXRlcyA9IGV4dHJhY3RVcGRhdGVEYXRhKGNsYXksIHNjb3BlLCBtb2RlbCk7XHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHVwZGF0ZXMpLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgIHJlcXVlc3RzLnB1c2goPE11dGF0ZVJlcXVlc3Q8VD4+e1xyXG4gICAgICAgICAgICBzY29wZSxcclxuICAgICAgICAgICAgbW9kZWwsXHJcbiAgICAgICAgICAgIGRhdGE6IHVwZGF0ZXMsXHJcbiAgICAgICAgICAgIGFjdGlvbjogJ3VwZGF0ZScsXHJcbiAgICAgICAgICAgIHR5cGU6ICdtdXRhdGUnLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uIG9mIHNwZWMucmVsYXRpb25zKSB7XHJcbiAgICAgICAgICBpZiAoY2xheS5maWVsZHNbcmVsYXRpb24uYWxpYXNdKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RzLnB1c2goLi4uZ2V0TXV0YXRpb25zKFxyXG4gICAgICAgICAgICAgIGNsYXkuZmllbGRzW3JlbGF0aW9uLmFsaWFzXSxcclxuICAgICAgICAgICAgICByZWxhdGlvbi50YXJnZXQuc2NvcGUsXHJcbiAgICAgICAgICAgICAgcmVsYXRpb24udGFyZ2V0Lm1vZGVsLFxyXG4gICAgICAgICAgICApKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVxdWVzdHM7XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgZXh0cmFjdEluc2VydERhdGEsXHJcbiAgICBleHRyYWN0UmVtb3ZlSWRlbnRpZmllcnMsXHJcbiAgICBleHRyYWN0VXBkYXRlRGF0YSxcclxuICAgIGdldE11dGF0aW9ucyxcclxuICB9O1xyXG59XHJcbiJdfQ==