UNPKG

@rx-mind/entity-component-store

Version:
170 lines 25.5 kB
/** * @license * Copyright NgRx Team. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/ngrx/platform */ import { createEntityStateOperator } from './entity-state-operator'; import { DidMutate, } from './models'; import { selectIdValue } from './select-id'; export function createUnsortedStateAdapter(selectId) { function addOneMutably(entity, state) { const id = selectIdValue(entity, selectId); if (id in state.entities) { return DidMutate.None; } state.ids.push(id); state.entities[id] = entity; return DidMutate.Both; } function addManyMutably(entities, state) { let didMutate = false; for (const entity of entities) { didMutate = addOneMutably(entity, state) !== DidMutate.None || didMutate; } return didMutate ? DidMutate.Both : DidMutate.None; } function setAllMutably(entities, state) { state.ids = []; state.entities = {}; addManyMutably(entities, state); return DidMutate.Both; } function setOneMutably(entity, state) { const id = selectIdValue(entity, selectId); if (id in state.entities) { state.entities[id] = entity; return DidMutate.EntitiesOnly; } state.ids.push(id); state.entities[id] = entity; return DidMutate.Both; } function setManyMutably(entities, state) { const didMutateSetOne = entities.map((entity) => setOneMutably(entity, state)); switch (true) { case didMutateSetOne.some((didMutate) => didMutate === DidMutate.Both): return DidMutate.Both; case didMutateSetOne.some((didMutate) => didMutate === DidMutate.EntitiesOnly): return DidMutate.EntitiesOnly; default: return DidMutate.None; } } function removeOneMutably(id, state) { return removeManyMutably([id], state); } function removeManyMutably(idsOrPredicate, state) { const ids = idsOrPredicate instanceof Array ? idsOrPredicate : state.ids.filter((id) => idsOrPredicate(state.entities[id])); const didMutate = ids.filter((id) => id in state.entities).map((id) => delete state.entities[id]).length > 0; if (didMutate) { state.ids = state.ids.filter((id) => id in state.entities); } return didMutate ? DidMutate.Both : DidMutate.None; } function removeAll(state) { return Object.assign({}, state, { ids: [], entities: {}, }); } function takeNewKey(keys, update, state) { const original = state.entities[update.id]; const updated = Object.assign({}, original, update.changes); const newKey = selectIdValue(updated, selectId); const hasNewKey = newKey !== update.id; if (hasNewKey) { keys[update.id] = newKey; delete state.entities[update.id]; } state.entities[newKey] = updated; return hasNewKey; } function updateOneMutably(update, state) { return updateManyMutably([update], state); } function updateManyMutably(updates, state) { const newKeys = {}; updates = updates.filter((update) => update.id in state.entities); const didMutateEntities = updates.length > 0; if (didMutateEntities) { const didMutateIds = updates.filter((update) => takeNewKey(newKeys, update, state)).length > 0; if (didMutateIds) { state.ids = state.ids.map((id) => newKeys[id] || id); return DidMutate.Both; } else { return DidMutate.EntitiesOnly; } } return DidMutate.None; } function mapMutably(map, state) { const changes = state.ids.reduce((changes, id) => { const change = map(state.entities[id]); if (change !== state.entities[id]) { changes.push({ id, changes: change }); } return changes; }, []); const updates = changes.filter(({ id }) => id in state.entities); return updateManyMutably(updates, state); } function mapOneMutably({ map, id }, state) { const entity = state.entities[id]; if (!entity) { return DidMutate.None; } const updatedEntity = map(entity); return updateOneMutably({ id, changes: updatedEntity, }, state); } function upsertOneMutably(entity, state) { return upsertManyMutably([entity], state); } function upsertManyMutably(entities, state) { const added = []; const updated = []; for (const entity of entities) { const id = selectIdValue(entity, selectId); if (id in state.entities) { updated.push({ id, changes: entity }); } else { added.push(entity); } } const didMutateByUpdated = updateManyMutably(updated, state); const didMutateByAdded = addManyMutably(added, state); switch (true) { case didMutateByAdded === DidMutate.None && didMutateByUpdated === DidMutate.None: return DidMutate.None; case didMutateByAdded === DidMutate.Both || didMutateByUpdated === DidMutate.Both: return DidMutate.Both; default: return DidMutate.EntitiesOnly; } } return { addOne: createEntityStateOperator(addOneMutably), addMany: createEntityStateOperator(addManyMutably), setOne: createEntityStateOperator(setOneMutably), setMany: createEntityStateOperator(setManyMutably), setAll: createEntityStateOperator(setAllMutably), updateOne: createEntityStateOperator(updateOneMutably), updateMany: createEntityStateOperator(updateManyMutably), upsertOne: createEntityStateOperator(upsertOneMutably), upsertMany: createEntityStateOperator(upsertManyMutably), removeOne: createEntityStateOperator(removeOneMutably), removeMany: createEntityStateOperator(removeManyMutably), removeAll, mapOne: createEntityStateOperator(mapOneMutably), map: createEntityStateOperator(mapMutably), }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zb3J0ZWQtc3RhdGUtYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvZW50aXR5LWNvbXBvbmVudC1zdG9yZS9zcmMvbGliL3Vuc29ydGVkLXN0YXRlLWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEUsT0FBTyxFQUNMLFNBQVMsR0FRVixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTVDLE1BQU0sVUFBVSwwQkFBMEIsQ0FHeEMsUUFBOEI7SUFHOUIsU0FBUyxhQUFhLENBQUMsTUFBYyxFQUFFLEtBQVk7UUFDakQsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUUzQyxJQUFJLEVBQUUsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ3hCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQztTQUN2QjtRQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25CLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBRTVCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUyxjQUFjLENBQUMsUUFBa0IsRUFBRSxLQUFZO1FBQ3RELElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztRQUV0QixLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsRUFBRTtZQUM3QixTQUFTLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxTQUFTLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQztTQUMxRTtRQUVELE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFB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QixDQUFDO1FBQ3hELFNBQVM7UUFDVCxNQUFNLEVBQUUseUJBQXlCLENBQUMsYUFBYSxDQUFDO1FBQ2hELEdBQUcsRUFBRSx5QkFBeUIsQ0FBQyxVQUFVLENBQUM7S0FDVCxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IE5nUnggVGVhbS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICpcclxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcclxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vbmdyeC9wbGF0Zm9ybVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IGNyZWF0ZUVudGl0eVN0YXRlT3BlcmF0b3IgfSBmcm9tICcuL2VudGl0eS1zdGF0ZS1vcGVyYXRvcic7XHJcbmltcG9ydCB7XHJcbiAgRGlkTXV0YXRlLFxyXG4gIEVudGl0eU1hcCxcclxuICBFbnRpdHlNYXBPbmUsXHJcbiAgRW50aXR5U3RhdGUsXHJcbiAgRW50aXR5U3RhdGVBZGFwdGVyLFxyXG4gIFByZWRpY2F0ZSxcclxuICBTZWxlY3RJZCxcclxuICBVcGRhdGUsXHJcbn0gZnJvbSAnLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBzZWxlY3RJZFZhbHVlIH0gZnJvbSAnLi9zZWxlY3QtaWQnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVuc29ydGVkU3RhdGVBZGFwdGVyPFxyXG4gIEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXHJcbiAgSWQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXJcclxuPihzZWxlY3RJZDogU2VsZWN0SWQ8RW50aXR5LCBJZD4pOiBFbnRpdHlTdGF0ZUFkYXB0ZXI8RW50aXR5LCBJZD4ge1xyXG4gIHR5cGUgU3RhdGUgPSBFbnRpdHlTdGF0ZTxFbnRpdHksIElkPjtcclxuXHJcbiAgZnVuY3Rpb24gYWRkT25lTXV0YWJseShlbnRpdHk6IEVudGl0eSwgc3RhdGU6IFN0YXRlKTogRGlkTXV0YXRlIHtcclxuICAgIGNvbnN0IGlkID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcclxuXHJcbiAgICBpZiAoaWQgaW4gc3RhdGUuZW50aXRpZXMpIHtcclxuICAgICAgcmV0dXJuIERpZE11dGF0ZS5Ob25lO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRlLmlkcy5wdXNoKGlkKTtcclxuICAgIHN0YXRlLmVudGl0aWVzW2lkXSA9IGVudGl0eTtcclxuXHJcbiAgICByZXR1cm4gRGlkTXV0YXRlLkJvdGg7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBhZGRNYW55TXV0YWJseShlbnRpdGllczogRW50aXR5W10sIHN0YXRlOiBTdGF0ZSk6IERpZE11dGF0ZSB7XHJcbiAgICBsZXQgZGlkTXV0YXRlID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMpIHtcclxuICAgICAgZGlkTXV0YXRlID0gYWRkT25lTXV0YWJseShlbnRpdHksIHN0YXRlKSAhPT0gRGlkTXV0YXRlLk5vbmUgfHwgZGlkTXV0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkaWRNdXRhdGUgPyBEaWRNdXRhdGUuQm90aCA6IERpZE11dGF0ZS5Ob25lO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gc2V0QWxsTXV0YWJseShlbnRpdGllczogRW50aXR5W10sIHN0YXRlOiBTdGF0ZSk6IERpZE11dGF0ZSB7XHJcbiAgICBzdGF0ZS5pZHMgPSBbXTtcclxuICAgIHN0YXRlLmVudGl0aWVzID0ge30gYXMgUmVjb3JkPElkLCBFbnRpdHk+O1xyXG5cclxuICAgIGFkZE1hbnlNdXRhYmx5KGVudGl0aWVzLCBzdGF0ZSk7XHJcblxyXG4gICAgcmV0dXJuIERpZE11dGF0ZS5Cb3RoO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gc2V0T25lTXV0YWJseShlbnRpdHk6IEVudGl0eSwgc3RhdGU6IFN0YXRlKTogRGlkTXV0YXRlIHtcclxuICAgIGNvbnN0IGlkID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcclxuXHJcbiAgICBpZiAoaWQgaW4gc3RhdGUuZW50aXRpZXMpIHtcclxuICAgICAgc3RhdGUuZW50aXRpZXNbaWRdID0gZW50aXR5O1xyXG4gICAgICByZXR1cm4gRGlkTXV0YXRlLkVudGl0aWVzT25seTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0ZS5pZHMucHVzaChpZCk7XHJcbiAgICBzdGF0ZS5lbnRpdGllc1tpZF0gPSBlbnRpdHk7XHJcblxyXG4gICAgcmV0dXJuIERpZE11dGF0ZS5Cb3RoO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gc2V0TWFueU11dGFibHkoZW50aXRpZXM6IEVudGl0eVtdLCBzdGF0ZTogU3RhdGUpOiBEaWRNdXRhdGUge1xyXG4gICAgY29uc3QgZGlkTXV0YXRlU2V0T25lID0gZW50aXRpZXMubWFwKChlbnRpdHkpID0+IHNldE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkpO1xyXG5cclxuICAgIHN3aXRjaCAodHJ1ZSkge1xyXG4gICAgICBjYXNlIGRpZE11dGF0ZVNldE9uZS5zb21lKChkaWRNdXRhdGUpID0+IGRpZE11dGF0ZSA9PT0gRGlkTXV0YXRlLkJvdGgpOlxyXG4gICAgICAgIHJldHVybiBEaWRNdXRhdGUuQm90aDtcclxuICAgICAgY2FzZSBkaWRNdXRhdGVTZXRPbmUuc29tZSgoZGlkTXV0YXRlKSA9PiBkaWRNdXRhdGUgPT09IERpZE11dGF0ZS5FbnRpdGllc09ubHkpOlxyXG4gICAgICAgIHJldHVybiBEaWRNdXRhdGUuRW50aXRpZXNPbmx5O1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBEaWRNdXRhdGUuTm9uZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHJlbW92ZU9uZU11dGFibHkoaWQ6IElkLCBzdGF0ZTogU3RhdGUpOiBEaWRNdXRhdGUge1xyXG4gICAgcmV0dXJuIHJlbW92ZU1hbnlNdXRhYmx5KFtpZF0sIHN0YXRlKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHJlbW92ZU1hbnlNdXRhYmx5KGlkczogSWRbXSwgc3RhdGU6IFN0YXRlKTogRGlkTXV0YXRlO1xyXG4gIGZ1bmN0aW9uIHJlbW92ZU1hbnlNdXRhYmx5KHByZWRpY2F0ZTogUHJlZGljYXRlPEVudGl0eT4sIHN0YXRlOiBTdGF0ZSk6IERpZE11dGF0ZTtcclxuICBmdW5jdGlvbiByZW1vdmVNYW55TXV0YWJseShpZHNPclByZWRpY2F0ZTogSWRbXSB8IFByZWRpY2F0ZTxFbnRpdHk+LCBzdGF0ZTogU3RhdGUpOiBEaWRNdXRhdGUge1xyXG4gICAgY29uc3QgaWRzID1cclxuICAgICAgaWRzT3JQcmVkaWNhdGUgaW5zdGFuY2VvZiBBcnJheVxyXG4gICAgICAgID8gaWRzT3JQcmVkaWNhdGVcclxuICAgICAgICA6IHN0YXRlLmlkcy5maWx0ZXIoKGlkKSA9PiBpZHNPclByZWRpY2F0ZShzdGF0ZS5lbnRpdGllc1tpZF0pKTtcclxuXHJcbiAgICBjb25zdCBkaWRNdXRhdGUgPVxyXG4gICAgICBpZHMuZmlsdGVyKChpZCkgPT4gaWQgaW4gc3RhdGUuZW50aXRpZXMpLm1hcCgoaWQpID0+IGRlbGV0ZSBzdGF0ZS5lbnRpdGllc1tpZF0pLmxlbmd0aCA+IDA7XHJcblxyXG4gICAgaWYgKGRpZE11dGF0ZSkge1xyXG4gICAgICBzdGF0ZS5pZHMgPSBzdGF0ZS5pZHMuZmlsdGVyKChpZCkgPT4gaWQgaW4gc3RhdGUuZW50aXRpZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkaWRNdXRhdGUgPyBEaWRNdXRhdGUuQm90aCA6IERpZE11dGF0ZS5Ob25lO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcmVtb3ZlQWxsPFMgZXh0ZW5kcyBTdGF0ZT4oc3RhdGU6IFMpOiBTIHtcclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xyXG4gICAgICBpZHM6IFtdLFxyXG4gICAgICBlbnRpdGllczoge30sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHRha2VOZXdLZXkoXHJcbiAgICBrZXlzOiB7IFtpZDogc3RyaW5nXTogSWQgfSxcclxuICAgIHVwZGF0ZTogVXBkYXRlPEVudGl0eSwgSWQ+LFxyXG4gICAgc3RhdGU6IFN0YXRlXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBvcmlnaW5hbCA9IHN0YXRlLmVudGl0aWVzW3VwZGF0ZS5pZF07XHJcbiAgICBjb25zdCB1cGRhdGVkOiBFbnRpdHkgPSBPYmplY3QuYXNzaWduKHt9LCBvcmlnaW5hbCwgdXBkYXRlLmNoYW5nZXMpO1xyXG4gICAgY29uc3QgbmV3S2V5ID0gc2VsZWN0SWRWYWx1ZSh1cGRhdGVkLCBzZWxlY3RJZCk7XHJcbiAgICBjb25zdCBoYXNOZXdLZXkgPSBuZXdLZXkgIT09IHVwZGF0ZS5pZDtcclxuXHJcbiAgICBpZiAoaGFzTmV3S2V5KSB7XHJcbiAgICAgIGtleXNbdXBkYXRlLmlkXSA9IG5ld0tleTtcclxuICAgICAgZGVsZXRlIHN0YXRlLmVudGl0aWVzW3VwZGF0ZS5pZF07XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGUuZW50aXRpZXNbbmV3S2V5XSA9IHVwZGF0ZWQ7XHJcblxyXG4gICAgcmV0dXJuIGhhc05ld0tleTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHVwZGF0ZU9uZU11dGFibHkodXBkYXRlOiBVcGRhdGU8RW50aXR5LCBJZD4sIHN0YXRlOiBTdGF0ZSk6IERpZE11dGF0ZSB7XHJcbiAgICByZXR1cm4gdXBkYXRlTWFueU11dGFibHkoW3VwZGF0ZV0sIHN0YXRlKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZXM6IFVwZGF0ZTxFbnRpdHksIElkPltdLCBzdGF0ZTogU3RhdGUpOiBEaWRNdXRhdGUge1xyXG4gICAgY29uc3QgbmV3S2V5czogeyBbaWQ6IHN0cmluZ106IElkIH0gPSB7fTtcclxuXHJcbiAgICB1cGRhdGVzID0gdXBkYXRlcy5maWx0ZXIoKHVwZGF0ZSkgPT4gdXBkYXRlLmlkIGluIHN0YXRlLmVudGl0aWVzKTtcclxuXHJcbiAgICBjb25zdCBkaWRNdXRhdGVFbnRpdGllcyA9IHVwZGF0ZXMubGVuZ3RoID4gMDtcclxuXHJcbiAgICBpZiAoZGlkTXV0YXRlRW50aXRpZXMpIHtcclxuICAgICAgY29uc3QgZGlkTXV0YXRlSWRzID1cclxuICAgICAgICB1cGRhdGVzLmZpbHRlcigodXBkYXRlKSA9PiB0YWtlTmV3S2V5KG5ld0tleXMsIHVwZGF0ZSwgc3RhdGUpKS5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgaWYgKGRpZE11dGF0ZUlkcykge1xyXG4gICAgICAgIHN0YXRlLmlkcyA9IHN0YXRlLmlkcy5tYXAoKGlkKSA9PiBuZXdLZXlzW2lkXSB8fCBpZCk7XHJcbiAgICAgICAgcmV0dXJuIERpZE11dGF0ZS5Cb3RoO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBEaWRNdXRhdGUuRW50aXRpZXNPbmx5O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIERpZE11dGF0ZS5Ob25lO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gbWFwTXV0YWJseShtYXA6IEVudGl0eU1hcDxFbnRpdHk+LCBzdGF0ZTogU3RhdGUpOiBEaWRNdXRhdGUge1xyXG4gICAgY29uc3QgY2hhbmdlcyA9IHN0YXRlLmlkcy5yZWR1Y2UoKGNoYW5nZXMsIGlkKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNoYW5nZSA9IG1hcChzdGF0ZS5lbnRpdGllc1tpZF0pO1xyXG4gICAgICBpZiAoY2hhbmdlICE9PSBzdGF0ZS5lbnRpdGllc1tpZF0pIHtcclxuICAgICAgICBjaGFuZ2VzLnB1c2goeyBpZCwgY2hhbmdlczogY2hhbmdlIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjaGFuZ2VzO1xyXG4gICAgfSwgW10gYXMgVXBkYXRlPEVudGl0eSwgSWQ+W10pO1xyXG4gICAgY29uc3QgdXBkYXRlcyA9IGNoYW5nZXMuZmlsdGVyKCh7IGlkIH0pID0+IGlkIGluIHN0YXRlLmVudGl0aWVzKTtcclxuXHJcbiAgICByZXR1cm4gdXBkYXRlTWFueU11dGFibHkodXBkYXRlcywgc3RhdGUpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gbWFwT25lTXV0YWJseSh7IG1hcCwgaWQgfTogRW50aXR5TWFwT25lPEVudGl0eSwgSWQ+LCBzdGF0ZTogU3RhdGUpOiBEaWRNdXRhdGUge1xyXG4gICAgY29uc3QgZW50aXR5ID0gc3RhdGUuZW50aXRpZXNbaWRdO1xyXG4gICAgaWYgKCFlbnRpdHkpIHtcclxuICAgICAgcmV0dXJuIERpZE11dGF0ZS5Ob25lO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRFbnRpdHkgPSBtYXAoZW50aXR5KTtcclxuICAgIHJldHVybiB1cGRhdGVPbmVNdXRhYmx5KFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQsXHJcbiAgICAgICAgY2hhbmdlczogdXBkYXRlZEVudGl0eSxcclxuICAgICAgfSxcclxuICAgICAgc3RhdGVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiB1cHNlcnRPbmVNdXRhYmx5KGVudGl0eTogRW50aXR5LCBzdGF0ZTogU3RhdGUpOiBEaWRNdXRhdGUge1xyXG4gICAgcmV0dXJuIHVwc2VydE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiB1cHNlcnRNYW55TXV0YWJseShlbnRpdGllczogRW50aXR5W10sIHN0YXRlOiBTdGF0ZSk6IERpZE11dGF0ZSB7XHJcbiAgICBjb25zdCBhZGRlZDogYW55W10gPSBbXTtcclxuICAgIGNvbnN0IHVwZGF0ZWQ6IGFueVtdID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMpIHtcclxuICAgICAgY29uc3QgaWQgPSBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpO1xyXG4gICAgICBpZiAoaWQgaW4gc3RhdGUuZW50aXRpZXMpIHtcclxuICAgICAgICB1cGRhdGVkLnB1c2goeyBpZCwgY2hhbmdlczogZW50aXR5IH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGFkZGVkLnB1c2goZW50aXR5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRpZE11dGF0ZUJ5VXBkYXRlZCA9IHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZWQsIHN0YXRlKTtcclxuICAgIGNvbnN0IGRpZE11dGF0ZUJ5QWRkZWQgPSBhZGRNYW55TXV0YWJseShhZGRlZCwgc3RhdGUpO1xyXG5cclxuICAgIHN3aXRjaCAodHJ1ZSkge1xyXG4gICAgICBjYXNlIGRpZE11dGF0ZUJ5QWRkZWQgPT09IERpZE11dGF0ZS5Ob25lICYmIGRpZE11dGF0ZUJ5VXBkYXRlZCA9PT0gRGlkTXV0YXRlLk5vbmU6XHJcbiAgICAgICAgcmV0dXJuIERpZE11dGF0ZS5Ob25lO1xyXG4gICAgICBjYXNlIGRpZE11dGF0ZUJ5QWRkZWQgPT09IERpZE11dGF0ZS5Cb3RoIHx8IGRpZE11dGF0ZUJ5VXBkYXRlZCA9PT0gRGlkTXV0YXRlLkJvdGg6XHJcbiAgICAgICAgcmV0dXJuIERpZE11dGF0ZS5Cb3RoO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBEaWRNdXRhdGUuRW50aXRpZXNPbmx5O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGFkZE9uZTogY3JlYXRlRW50aXR5U3RhdGVPcGVyYXRvcihhZGRPbmVNdXRhYmx5KSxcclxuICAgIGFkZE1hbnk6IGNyZWF0ZUVudGl0eVN0YXRlT3BlcmF0b3IoYWRkTWFueU11dGFibHkpLFxyXG4gICAgc2V0T25lOiBjcmVhdGVFbnRpdHlTdGF0ZU9wZXJhdG9yKHNldE9uZU11dGFibHkpLFxyXG4gICAgc2V0TWFueTogY3JlYXRlRW50aXR5U3RhdGVPcGVyYXRvcihzZXRNYW55TXV0YWJseSksXHJcbiAgICBzZXRBbGw6IGNyZWF0ZUVudGl0eVN0YXRlT3BlcmF0b3Ioc2V0QWxsTXV0YWJseSksXHJcbiAgICB1cGRhdGVPbmU6IGNyZWF0ZUVudGl0eVN0YXRlT3BlcmF0b3IodXBkYXRlT25lTXV0YWJseSksXHJcbiAgICB1cGRhdGVNYW55OiBjcmVhdGVFbnRpdHlTdGF0ZU9wZXJhdG9yKHVwZGF0ZU1hbnlNdXRhYmx5KSxcclxuICAgIHVwc2VydE9uZTogY3JlYXRlRW50aXR5U3RhdGVPcGVyYXRvcih1cHNlcnRPbmVNdXRhYmx5KSxcclxuICAgIHVwc2VydE1hbnk6IGNyZWF0ZUVudGl0eVN0YXRlT3BlcmF0b3IodXBzZXJ0TWFueU11dGFibHkpLFxyXG4gICAgcmVtb3ZlT25lOiBjcmVhdGVFbnRpdHlTdGF0ZU9wZXJhdG9yKHJlbW92ZU9uZU11dGFibHkpLFxyXG4gICAgcmVtb3ZlTWFueTogY3JlYXRlRW50aXR5U3RhdGVPcGVyYXRvcihyZW1vdmVNYW55TXV0YWJseSksXHJcbiAgICByZW1vdmVBbGwsXHJcbiAgICBtYXBPbmU6IGNyZWF0ZUVudGl0eVN0YXRlT3BlcmF0b3IobWFwT25lTXV0YWJseSksXHJcbiAgICBtYXA6IGNyZWF0ZUVudGl0eVN0YXRlT3BlcmF0b3IobWFwTXV0YWJseSksXHJcbiAgfSBhcyBFbnRpdHlTdGF0ZUFkYXB0ZXI8RW50aXR5LCBJZD47XHJcbn1cclxuIl19