UNPKG

@orbit/record-cache

Version:

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

186 lines 25.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SimpleRecordTransformBuffer = void 0; const utils_1 = require("@orbit/utils"); const records_1 = require("@orbit/records"); const sync_record_cache_1 = require("./sync-record-cache"); function serializeRecordRelationshipIdentity(rri) { return `${(0, records_1.serializeRecordIdentity)(rri.record)}::${rri.relationship}`; } function deserializeRecordRelationshipIdentity(rri) { const [record, relationship] = rri.split('::'); return { record: (0, records_1.deserializeRecordIdentity)(record), relationship }; } class SimpleRecordTransformBuffer extends sync_record_cache_1.SyncRecordCache { constructor(settings) { super(settings); this.resetState(); } resetState() { this._state = { records: {}, inverseRelationships: {} }; } startTrackingChanges() { this._delta = { records: {}, inverseRelationships: {} }; } stopTrackingChanges() { var _a, _b, _c, _d; if (this._delta === undefined) { throw new Error(`Changes are not being tracked. Call 'startTrackingChanges' before 'stopTrackingChanges'`); } let { records, inverseRelationships } = this._delta; let changeset = {}; for (let rid of Object.keys(records)) { let rv = records[rid]; if (rv === null) { changeset.removeRecords = (_a = changeset.removeRecords) !== null && _a !== void 0 ? _a : []; changeset.removeRecords.push((0, records_1.deserializeRecordIdentity)(rid)); } else { changeset.setRecords = (_b = changeset.setRecords) !== null && _b !== void 0 ? _b : []; changeset.setRecords.push(rv); } } for (let rid of Object.keys(inverseRelationships)) { let relatedRecord = (0, records_1.deserializeRecordIdentity)(rid); let rels = inverseRelationships[rid]; for (let rel of Object.keys(rels)) { let rv = rels[rel]; let { record, relationship } = deserializeRecordRelationshipIdentity(rel); let rri = { relatedRecord, record, relationship }; if (rv === null) { changeset.removeInverseRelationships = (_c = changeset.removeInverseRelationships) !== null && _c !== void 0 ? _c : []; changeset.removeInverseRelationships.push(rri); } else { changeset.addInverseRelationships = (_d = changeset.addInverseRelationships) !== null && _d !== void 0 ? _d : []; changeset.addInverseRelationships.push(rri); } } } this._delta = undefined; return changeset; } getRecordSync(identity) { var _a; return (_a = this._state.records[(0, records_1.serializeRecordIdentity)(identity)]) !== null && _a !== void 0 ? _a : undefined; } getRecordsSync(typeOrIdentities) { if (typeof typeOrIdentities === 'string') { return (0, utils_1.objectValues)(this._state.records[typeOrIdentities]); } else if (Array.isArray(typeOrIdentities)) { const records = []; const identities = typeOrIdentities; for (let i of identities) { let record = this.getRecordSync(i); if (record) { records.push(record); } } return records; } else { throw new Error('typeOrIdentities must be specified in getRecordsSync'); } } setRecordSync(record) { this._state.records[(0, records_1.serializeRecordIdentity)(record)] = record; if (this._delta) { this._delta.records[(0, records_1.serializeRecordIdentity)(record)] = record; } } setRecordsSync(records) { records.forEach((record) => this.setRecordSync(record)); } removeRecordSync(recordIdentity) { const record = this.getRecordSync(recordIdentity); if (record) { delete this._state.records[(0, records_1.serializeRecordIdentity)(record)]; if (this._delta) { this._delta.records[(0, records_1.serializeRecordIdentity)(record)] = null; } return record; } else { return undefined; } } removeRecordsSync(recordIdentities) { const records = []; for (let recordIdentity of recordIdentities) { let record = this.getRecordSync(recordIdentity); if (record) { records.push(record); delete this._state.records[(0, records_1.serializeRecordIdentity)(record)]; if (this._delta) { this._delta.records[(0, records_1.serializeRecordIdentity)(record)] = null; } } } return records; } getInverseRelationshipsSync(recordIdentityOrIdentities) { if (Array.isArray(recordIdentityOrIdentities)) { let relationships = []; recordIdentityOrIdentities.forEach((record) => { Array.prototype.push(relationships, this._getInverseRelationshipsSync(record)); }); return relationships; } else { return this._getInverseRelationshipsSync(recordIdentityOrIdentities); } } addInverseRelationshipsSync(relationships) { var _a, _b; for (let relationship of relationships) { const ri = (0, records_1.serializeRecordIdentity)(relationship.relatedRecord); const rri = serializeRecordRelationshipIdentity(relationship); const rels = (_a = this._state.inverseRelationships[ri]) !== null && _a !== void 0 ? _a : {}; rels[rri] = relationship; this._state.inverseRelationships[ri] = rels; if (this._delta) { const rels = (_b = this._delta.inverseRelationships[ri]) !== null && _b !== void 0 ? _b : {}; rels[rri] = relationship; this._delta.inverseRelationships[ri] = rels; } } } removeInverseRelationshipsSync(relationships) { var _a; for (let relationship of relationships) { const ri = (0, records_1.serializeRecordIdentity)(relationship.relatedRecord); const rri = serializeRecordRelationshipIdentity(relationship); const rels = this._state.inverseRelationships[ri]; if (rels) { rels[rri] = null; if (this._delta) { const rels = (_a = this._delta.inverseRelationships[ri]) !== null && _a !== void 0 ? _a : {}; rels[rri] = null; } } } } ///////////////////////////////////////////////////////////////////////////// // Protected methods ///////////////////////////////////////////////////////////////////////////// _getInverseRelationshipsSync(recordIdentity) { let relationships = this._state.inverseRelationships[(0, records_1.serializeRecordIdentity)(recordIdentity)]; if (relationships) { return (0, utils_1.objectValues)(relationships).filter((r) => r !== null); } else { return []; } } } exports.SimpleRecordTransformBuffer = SimpleRecordTransformBuffer; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXJlY29yZC10cmFuc2Zvcm0tYnVmZmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NpbXBsZS1yZWNvcmQtdHJhbnNmb3JtLWJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx3Q0FBa0Q7QUFDbEQsNENBS3dCO0FBRXhCLDJEQUErRTtBQUcvRSxTQUFTLG1DQUFtQyxDQUMxQyxHQUErQjtJQUUvQixPQUFPLEdBQUcsSUFBQSxpQ0FBdUIsRUFBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxTQUFTLHFDQUFxQyxDQUM1QyxHQUFXO0lBRVgsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBQSxtQ0FBeUIsRUFBQyxNQUFNLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQztBQUNyRSxDQUFDO0FBT0QsTUFBYSwyQkFDWCxTQUFRLG1DQUFlO0lBS3ZCLFlBQVksUUFBaUM7UUFDM0MsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixPQUFPLEVBQUUsRUFBRTtZQUNYLG9CQUFvQixFQUFFLEVBQUU7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLE9BQU8sRUFBRSxFQUFFO1lBQ1gsb0JBQW9CLEVBQUUsRUFBRTtTQUN6QixDQUFDO0lBQ0osQ0FBQztJQUVELG1CQUFtQjs7UUFDakIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUM3QixNQUFNLElBQUksS0FBSyxDQUNi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QUN4RCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO2lCQUNsQjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLG9CQUFvQjtJQUNwQiw2RUFBNkU7SUFFbkUsNEJBQTRCLENBQ3BDLGNBQThCO1FBRTlCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQ2xELElBQUEsaUNBQXVCLEVBQUMsY0FBYyxDQUFDLENBQ3hDLENBQUM7UUFDRixJQUFJLGFBQWEsRUFBRTtZQUNqQixPQUFPLElBQUEsb0JBQVksRUFBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUM5RDthQUFNO1lBQ0wsT0FBTyxFQUFFLENBQUM7U0FDWDtJQUNILENBQUM7Q0FDRjtBQTdNRCxrRUE2TUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaWN0LCBvYmplY3RWYWx1ZXMgfSBmcm9tICdAb3JiaXQvdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGVzZXJpYWxpemVSZWNvcmRJZGVudGl0eSxcbiAgSW5pdGlhbGl6ZWRSZWNvcmQsXG4gIFJlY29yZElkZW50aXR5LFxuICBzZXJpYWxpemVSZWNvcmRJZGVudGl0eVxufSBmcm9tICdAb3JiaXQvcmVjb3Jkcyc7XG5pbXBvcnQgeyBSZWNvcmRDaGFuZ2VzZXQsIFJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5IH0gZnJvbSAnLi9yZWNvcmQtYWNjZXNzb3InO1xuaW1wb3J0IHsgU3luY1JlY29yZENhY2hlLCBTeW5jUmVjb3JkQ2FjaGVTZXR0aW5ncyB9IGZyb20gJy4vc3luYy1yZWNvcmQtY2FjaGUnO1xuaW1wb3J0IHsgUmVjb3JkVHJhbnNmb3JtQnVmZmVyIH0gZnJvbSAnLi9yZWNvcmQtdHJhbnNmb3JtLWJ1ZmZlcic7XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5KFxuICBycmk6IFJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5XG4pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c2VyaWFsaXplUmVjb3JkSWRlbnRpdHkocnJpLnJlY29yZCl9Ojoke3JyaS5yZWxhdGlvbnNoaXB9YDtcbn1cblxuZnVuY3Rpb24gZGVzZXJpYWxpemVSZWNvcmRSZWxhdGlvbnNoaXBJZGVudGl0eShcbiAgcnJpOiBzdHJpbmdcbik6IHsgcmVjb3JkOiBSZWNvcmRJZGVudGl0eTsgcmVsYXRpb25zaGlwOiBzdHJpbmcgfSB7XG4gIGNvbnN0IFtyZWNvcmQsIHJlbGF0aW9uc2hpcF0gPSBycmkuc3BsaXQoJzo6Jyk7XG4gIHJldHVybiB7IHJlY29yZDogZGVzZXJpYWxpemVSZWNvcmRJZGVudGl0eShyZWNvcmQpLCByZWxhdGlvbnNoaXAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVSZWNvcmRUcmFuc2Zvcm1CdWZmZXJTdGF0ZSB7XG4gIHJlY29yZHM6IERpY3Q8SW5pdGlhbGl6ZWRSZWNvcmQgfCBudWxsPjtcbiAgaW52ZXJzZVJlbGF0aW9uc2hpcHM6IERpY3Q8RGljdDxSZWNvcmRSZWxhdGlvbnNoaXBJZGVudGl0eSB8IG51bGw+Pjtcbn1cblxuZXhwb3J0IGNsYXNzIFNpbXBsZVJlY29yZFRyYW5zZm9ybUJ1ZmZlclxuICBleHRlbmRzIFN5bmNSZWNvcmRDYWNoZVxuICBpbXBsZW1lbnRzIFJlY29yZFRyYW5zZm9ybUJ1ZmZlciB7XG4gIHByb3RlY3RlZCBfc3RhdGUhOiBTaW1wbGVSZWNvcmRUcmFuc2Zvcm1CdWZmZXJTdGF0ZTtcbiAgcHJvdGVjdGVkIF9kZWx0YT86IFNpbXBsZVJlY29yZFRyYW5zZm9ybUJ1ZmZlclN0YXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNldHRpbmdzOiBTeW5jUmVjb3JkQ2FjaGVTZXR0aW5ncykge1xuICAgIHN1cGVyKHNldHRpbmdzKTtcbiAgICB0aGlzLnJlc2V0U3RhdGUoKTtcbiAgfVxuXG4gIHJlc2V0U3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGUgPSB7XG4gICAgICByZWNvcmRzOiB7fSxcbiAgICAgIGludmVyc2VSZWxhdGlvbnNoaXBzOiB7fVxuICAgIH07XG4gIH1cblxuICBzdGFydFRyYWNraW5nQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9kZWx0YSA9IHtcbiAgICAgIHJlY29yZHM6IHt9LFxuICAgICAgaW52ZXJzZVJlbGF0aW9uc2hpcHM6IHt9XG4gICAgfTtcbiAgfVxuXG4gIHN0b3BUcmFja2luZ0NoYW5nZXMoKTogUmVjb3JkQ2hhbmdlc2V0IHtcbiAgICBpZiAodGhpcy5fZGVsdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2hhbmdlcyBhcmUgbm90IGJlaW5nIHRyYWNrZWQuIENhbGwgJ3N0YXJ0VHJhY2tpbmdDaGFuZ2VzJyBiZWZvcmUgJ3N0b3BUcmFja2luZ0NoYW5nZXMnYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgeyByZWNvcmRzLCBpbnZlcnNlUmVsYXRpb25zaGlwcyB9ID0gdGhpcy5fZGVsdGE7XG4gICAgbGV0IGNoYW5nZXNldDogUmVjb3JkQ2hhbmdlc2V0ID0ge307XG5cbiAgICBmb3IgKGxldCByaWQgb2YgT2JqZWN0LmtleXMocmVjb3JkcykpIHtcbiAgICAgIGxldCBydiA9IHJlY29yZHNbcmlkXTtcbiAgICAgIGlmIChydiA9PT0gbnVsbCkge1xuICAgICAgICBjaGFuZ2VzZXQucmVtb3ZlUmVjb3JkcyA9IGNoYW5nZXNldC5yZW1vdmVSZWNvcmRzID8/IFtdO1xuICAgICAgICBjaGFuZ2VzZXQucmVtb3ZlUmVjb3Jkcy5wdXNoKGRlc2VyaWFsaXplUmVjb3JkSWRlbnRpdHkocmlkKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFuZ2VzZXQuc2V0UmVjb3JkcyA9IGNoYW5nZXNldC5zZXRSZWNvcmRzID8/IFtdO1xuICAgICAgICBjaGFuZ2VzZXQuc2V0UmVjb3Jkcy5wdXNoKHJ2KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCByaWQgb2YgT2JqZWN0LmtleXMoaW52ZXJzZVJlbGF0aW9uc2hpcHMpKSB7XG4gICAgICBsZXQgcmVsYXRlZFJlY29yZCA9IGRlc2VyaWFsaXplUmVjb3JkSWRlbnRpdHkocmlkKTtcbiAgICAgIGxldCByZWxzID0gaW52ZXJzZVJlbGF0aW9uc2hpcHNbcmlkXTtcbiAgICAgIGZvciAobGV0IHJlbCBvZiBPYmplY3Qua2V5cyhyZWxzKSkge1xuICAgICAgICBsZXQgcnYgPSByZWxzW3JlbF07XG4gICAgICAgIGxldCB7IHJlY29yZCwgcmVsYXRpb25zaGlwIH0gPSBkZXNlcmlhbGl6ZVJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5KFxuICAgICAgICAgIHJlbFxuICAgICAgICApO1xuICAgICAgICBsZXQgcnJpID0geyByZWxhdGVkUmVjb3JkLCByZWNvcmQsIHJlbGF0aW9uc2hpcCB9O1xuICAgICAgICBpZiAocnYgPT09IG51bGwpIHtcbiAgICAgICAgICBjaGFuZ2VzZXQucmVtb3ZlSW52ZXJzZVJlbGF0aW9uc2hpcHMgPVxuICAgICAgICAgICAgY2hhbmdlc2V0LnJlbW92ZUludmVyc2VSZWxhdGlvbnNoaXBzID8/IFtdO1xuICAgICAgICAgIGNoYW5nZXNldC5yZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwcy5wdXNoKHJyaSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhbmdlc2V0LmFkZEludmVyc2VSZWxhdGlvbnNoaXBzID1cbiAgICAgICAgICAgIGNoYW5nZXNldC5hZGRJbnZlcnNlUmVsYXRpb25zaGlwcyA/PyBbXTtcbiAgICAgICAgICBjaGFuZ2VzZXQuYWRkSW52ZXJzZVJlbGF0aW9uc2hpcHMucHVzaChycmkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZGVsdGEgPSB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gY2hhbmdlc2V0O1xuICB9XG5cbiAgZ2V0UmVjb3JkU3luYyhpZGVudGl0eTogUmVjb3JkSWRlbnRpdHkpOiBJbml0aWFsaXplZFJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLnJlY29yZHNbc2VyaWFsaXplUmVjb3JkSWRlbnRpdHkoaWRlbnRpdHkpXSA/PyB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRSZWNvcmRzU3luYyhcbiAgICB0eXBlT3JJZGVudGl0aWVzPzogc3RyaW5nIHwgUmVjb3JkSWRlbnRpdHlbXVxuICApOiBJbml0aWFsaXplZFJlY29yZFtdIHtcbiAgICBpZiAodHlwZW9mIHR5cGVPcklkZW50aXRpZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2JqZWN0VmFsdWVzKHRoaXMuX3N0YXRlLnJlY29yZHNbdHlwZU9ySWRlbnRpdGllc10pO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0eXBlT3JJZGVudGl0aWVzKSkge1xuICAgICAgY29uc3QgcmVjb3JkczogSW5pdGlhbGl6ZWRSZWNvcmRbXSA9IFtdO1xuICAgICAgY29uc3QgaWRlbnRpdGllczogUmVjb3JkSWRlbnRpdHlbXSA9IHR5cGVPcklkZW50aXRpZXM7XG4gICAgICBmb3IgKGxldCBpIG9mIGlkZW50aXRpZXMpIHtcbiAgICAgICAgbGV0IHJlY29yZCA9IHRoaXMuZ2V0UmVjb3JkU3luYyhpKTtcbiAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgIHJlY29yZHMucHVzaChyZWNvcmQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVjb3JkcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eXBlT3JJZGVudGl0aWVzIG11c3QgYmUgc3BlY2lmaWVkIGluIGdldFJlY29yZHNTeW5jJyk7XG4gICAgfVxuICB9XG5cbiAgc2V0UmVjb3JkU3luYyhyZWNvcmQ6IEluaXRpYWxpemVkUmVjb3JkKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGUucmVjb3Jkc1tzZXJpYWxpemVSZWNvcmRJZGVudGl0eShyZWNvcmQpXSA9IHJlY29yZDtcbiAgICBpZiAodGhpcy5fZGVsdGEpIHtcbiAgICAgIHRoaXMuX2RlbHRhLnJlY29yZHNbc2VyaWFsaXplUmVjb3JkSWRlbnRpdHkocmVjb3JkKV0gPSByZWNvcmQ7XG4gICAgfVxuICB9XG5cbiAgc2V0UmVjb3Jkc1N5bmMocmVjb3JkczogSW5pdGlhbGl6ZWRSZWNvcmRbXSk6IHZvaWQge1xuICAgIHJlY29yZHMuZm9yRWFjaCgocmVjb3JkKSA9PiB0aGlzLnNldFJlY29yZFN5bmMocmVjb3JkKSk7XG4gIH1cblxuICByZW1vdmVSZWNvcmRTeW5jKFxuICAgIHJlY29yZElkZW50aXR5OiBSZWNvcmRJZGVudGl0eVxuICApOiBJbml0aWFsaXplZFJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5nZXRSZWNvcmRTeW5jKHJlY29yZElkZW50aXR5KTtcbiAgICBpZiAocmVjb3JkKSB7XG4gICAgICBkZWxldGUgdGhpcy5fc3RhdGUucmVjb3Jkc1tzZXJpYWxpemVSZWNvcmRJZGVudGl0eShyZWNvcmQpXTtcbiAgICAgIGlmICh0aGlzLl9kZWx0YSkge1xuICAgICAgICB0aGlzLl9kZWx0YS5yZWNvcmRzW3NlcmlhbGl6ZVJlY29yZElkZW50aXR5KHJlY29yZCldID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlUmVjb3Jkc1N5bmMocmVjb3JkSWRlbnRpdGllczogUmVjb3JkSWRlbnRpdHlbXSk6IEluaXRpYWxpemVkUmVjb3JkW10ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBbXTtcbiAgICBmb3IgKGxldCByZWNvcmRJZGVudGl0eSBvZiByZWNvcmRJZGVudGl0aWVzKSB7XG4gICAgICBsZXQgcmVjb3JkID0gdGhpcy5nZXRSZWNvcmRTeW5jKHJlY29yZElkZW50aXR5KTtcbiAgICAgIGlmIChyZWNvcmQpIHtcbiAgICAgICAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdGF0ZS5yZWNvcmRzW3NlcmlhbGl6ZVJlY29yZElkZW50aXR5KHJlY29yZCldO1xuICAgICAgICBpZiAodGhpcy5fZGVsdGEpIHtcbiAgICAgICAgICB0aGlzLl9kZWx0YS5yZWNvcmRzW3NlcmlhbGl6ZVJlY29yZElkZW50aXR5KHJlY29yZCldID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVjb3JkcztcbiAgfVxuXG4gIGdldEludmVyc2VSZWxhdGlvbnNoaXBzU3luYyhcbiAgICByZWNvcmRJZGVudGl0eU9ySWRlbnRpdGllczogUmVjb3JkSWRlbnRpdHkgfCBSZWNvcmRJZGVudGl0eVtdXG4gICk6IFJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5W10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlY29yZElkZW50aXR5T3JJZGVudGl0aWVzKSkge1xuICAgICAgbGV0IHJlbGF0aW9uc2hpcHM6IFJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5W10gPSBbXTtcbiAgICAgIHJlY29yZElkZW50aXR5T3JJZGVudGl0aWVzLmZvckVhY2goKHJlY29yZCkgPT4ge1xuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaChcbiAgICAgICAgICByZWxhdGlvbnNoaXBzLFxuICAgICAgICAgIHRoaXMuX2dldEludmVyc2VSZWxhdGlvbnNoaXBzU3luYyhyZWNvcmQpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZWxhdGlvbnNoaXBzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcHNTeW5jKHJlY29yZElkZW50aXR5T3JJZGVudGl0aWVzKTtcbiAgICB9XG4gIH1cblxuICBhZGRJbnZlcnNlUmVsYXRpb25zaGlwc1N5bmMoXG4gICAgcmVsYXRpb25zaGlwczogUmVjb3JkUmVsYXRpb25zaGlwSWRlbnRpdHlbXVxuICApOiB2b2lkIHtcbiAgICBmb3IgKGxldCByZWxhdGlvbnNoaXAgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmkgPSBzZXJpYWxpemVSZWNvcmRJZGVudGl0eShyZWxhdGlvbnNoaXAucmVsYXRlZFJlY29yZCk7XG4gICAgICBjb25zdCBycmkgPSBzZXJpYWxpemVSZWNvcmRSZWxhdGlvbnNoaXBJZGVudGl0eShyZWxhdGlvbnNoaXApO1xuICAgICAgY29uc3QgcmVscyA9IHRoaXMuX3N0YXRlLmludmVyc2VSZWxhdGlvbnNoaXBzW3JpXSA/PyB7fTtcbiAgICAgIHJlbHNbcnJpXSA9IHJlbGF0aW9uc2hpcDtcbiAgICAgIHRoaXMuX3N0YXRlLmludmVyc2VSZWxhdGlvbnNoaXBzW3JpXSA9IHJlbHM7XG4gICAgICBpZiAodGhpcy5fZGVsdGEpIHtcbiAgICAgICAgY29uc3QgcmVscyA9IHRoaXMuX2RlbHRhLmludmVyc2VSZWxhdGlvbnNoaXBzW3JpXSA/PyB7fTtcbiAgICAgICAgcmVsc1tycmldID0gcmVsYXRpb25zaGlwO1xuICAgICAgICB0aGlzLl9kZWx0YS5pbnZlcnNlUmVsYXRpb25zaGlwc1tyaV0gPSByZWxzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUludmVyc2VSZWxhdGlvbnNoaXBzU3luYyhcbiAgICByZWxhdGlvbnNoaXBzOiBSZWNvcmRSZWxhdGlvbnNoaXBJZGVudGl0eVtdXG4gICk6IHZvaWQge1xuICAgIGZvciAobGV0IHJlbGF0aW9uc2hpcCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByaSA9IHNlcmlhbGl6ZVJlY29yZElkZW50aXR5KHJlbGF0aW9uc2hpcC5yZWxhdGVkUmVjb3JkKTtcbiAgICAgIGNvbnN0IHJyaSA9IHNlcmlhbGl6ZVJlY29yZFJlbGF0aW9uc2hpcElkZW50aXR5KHJlbGF0aW9uc2hpcCk7XG4gICAgICBjb25zdCByZWxzID0gdGhpcy5fc3RhdGUuaW52ZXJzZVJlbGF0aW9uc2hpcHNbcmldO1xuXG4gICAgICBpZiAocmVscykge1xuICAgICAgICByZWxzW3JyaV0gPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5fZGVsdGEpIHtcbiAgICAgICAgICBjb25zdCByZWxzID0gdGhpcy5fZGVsdGEuaW52ZXJzZVJlbGF0aW9uc2hpcHNbcmldID8/IHt9O1xuICAgICAgICAgIHJlbHNbcnJpXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyBQcm90ZWN0ZWQgbWV0aG9kc1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIHByb3RlY3RlZCBfZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcHNTeW5jKFxuICAgIHJlY29yZElkZW50aXR5OiBSZWNvcmRJZGVudGl0eVxuICApOiBSZWNvcmRSZWxhdGlvbnNoaXBJZGVudGl0eVtdIHtcbiAgICBsZXQgcmVsYXRpb25zaGlwcyA9IHRoaXMuX3N0YXRlLmludmVyc2VSZWxhdGlvbnNoaXBzW1xuICAgICAgc2VyaWFsaXplUmVjb3JkSWRlbnRpdHkocmVjb3JkSWRlbnRpdHkpXG4gICAgXTtcbiAgICBpZiAocmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIG9iamVjdFZhbHVlcyhyZWxhdGlvbnNoaXBzKS5maWx0ZXIoKHIpID0+IHIgIT09IG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG59XG4iXX0=