UNPKG

@orbit/record-cache

Version:

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

105 lines 18.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AsyncCacheIntegrityProcessor = void 0; const async_operation_processor_1 = require("../async-operation-processor"); const cache_integrity_utils_1 = require("./utils/cache-integrity-utils"); /** * An operation processor that ensures that a cache's data is consistent and * doesn't contain any dead references. * * This is achieved by maintaining a mapping of reverse relationships for each * record. When a record is removed, any references to it can also be identified * and removed. */ class AsyncCacheIntegrityProcessor extends async_operation_processor_1.AsyncOperationProcessor { async after(operation) { switch (operation.op) { case 'replaceRelatedRecord': await this.removeInverseRelationship(operation.record, operation.relationship, await this.accessor.getRelatedRecordAsync(operation.record, operation.relationship)); return []; case 'replaceRelatedRecords': await this.removeInverseRelationships(operation.record, operation.relationship, await this.accessor.getRelatedRecordsAsync(operation.record, operation.relationship)); return []; case 'removeFromRelatedRecords': await this.removeInverseRelationship(operation.record, operation.relationship, operation.relatedRecord); return []; case 'removeRecord': await this.removeAllInverseRelationships(operation.record); return []; case 'updateRecord': await this.removeAllInverseRelationships(operation.record); return []; default: return []; } } async finally(operation) { switch (operation.op) { case 'replaceRelatedRecord': await this.addInverseRelationship(operation.record, operation.relationship, operation.relatedRecord); return []; case 'replaceRelatedRecords': await this.addInverseRelationships(operation.record, operation.relationship, operation.relatedRecords); return []; case 'addToRelatedRecords': await this.addInverseRelationship(operation.record, operation.relationship, operation.relatedRecord); return []; case 'addRecord': await this.addAllInverseRelationships(operation.record); return []; case 'updateRecord': await this.addAllInverseRelationships(operation.record); return []; case 'removeRecord': return await this.clearInverseRelationshipOps(operation.record); default: return []; } } async addInverseRelationship(record, relationship, relatedRecord) { let inverseRelationship = (0, cache_integrity_utils_1.getInverseRelationship)(this.accessor.schema, record, relationship, relatedRecord); if (inverseRelationship) { await this.accessor.addInverseRelationshipsAsync([inverseRelationship]); } } async addInverseRelationships(record, relationship, relatedRecords) { let inverseRelationships = (0, cache_integrity_utils_1.getInverseRelationships)(this.accessor.schema, record, relationship, relatedRecords); if (inverseRelationships) { await this.accessor.addInverseRelationshipsAsync(inverseRelationships); } } async addAllInverseRelationships(record) { let inverseRelationships = (0, cache_integrity_utils_1.getAllInverseRelationships)(this.accessor.schema, record); if (inverseRelationships.length > 0) { await this.accessor.addInverseRelationshipsAsync(inverseRelationships); } } async removeInverseRelationship(record, relationship, relatedRecord) { let inverseRelationship = (0, cache_integrity_utils_1.getInverseRelationship)(this.accessor.schema, record, relationship, relatedRecord); if (inverseRelationship) { await this.accessor.removeInverseRelationshipsAsync([ inverseRelationship ]); } } async removeInverseRelationships(record, relationship, relatedRecords) { let inverseRelationships = (0, cache_integrity_utils_1.getInverseRelationships)(this.accessor.schema, record, relationship, relatedRecords); if (inverseRelationships.length > 0) { await this.accessor.removeInverseRelationshipsAsync(inverseRelationships); } } async removeAllInverseRelationships(record) { const currentRecord = await this.accessor.getRecordAsync(record); if (currentRecord) { const inverseRelationships = (0, cache_integrity_utils_1.getAllInverseRelationships)(this.accessor.schema, currentRecord); if (inverseRelationships.length > 0) { await this.accessor.removeInverseRelationshipsAsync(inverseRelationships); } } } async clearInverseRelationshipOps(record) { return (0, cache_integrity_utils_1.getInverseRelationshipRemovalOps)(this.accessor.schema, await this.accessor.getInverseRelationshipsAsync(record)); } } exports.AsyncCacheIntegrityProcessor = AsyncCacheIntegrityProcessor; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtY2FjaGUtaW50ZWdyaXR5LXByb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vcGVyYXRpb24tcHJvY2Vzc29ycy9hc3luYy1jYWNoZS1pbnRlZ3JpdHktcHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLDRFQUF1RTtBQUN2RSx5RUFLdUM7QUFFdkM7Ozs7Ozs7R0FPRztBQUNILE1BQWEsNEJBQTZCLFNBQVEsbURBQXVCO0lBQ3ZFLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBMEI7UUFDcEMsUUFBUSxTQUFTLENBQUMsRUFBRSxFQUFFO1lBQ3BCLEtBQUssc0JBQXNCO2dCQUN6QixNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FDbEMsU0FBUyxDQUFDLE1BQU0sRUFDaEIsU0FBUyxDQUFDLFlBQVksRUFDdEIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUN2QyxTQUFTLENBQUMsTUFBTSxFQUNoQixTQUFTLENBQUMsWUFBWSxDQUN2QixDQUNGLENBQUM7Z0JBQ0YsT0FBTyxFQUFFLENBQUM7WUFFWixLQUFLLHVCQUF1QjtnQkFDMUIsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQ25DLFNBQVMsQ0FBQyxNQUFNLEVBQ2hCLFNBQVMsQ0FBQyxZQUFZLEVBQ3RCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FDeEMsU0FBUyxDQUFDLE1BQU0sRUFDaEIsU0FBUyxDQUFDLFlBQVksQ0FDdkIsQ0FDRixDQUFDO2dCQUNGLE9BQU8sRUFBRSxDQUFDO1lBRVosS0FBSywwQkFBMEI7Z0JBQzdCLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUNsQyxTQUFTLENBQUMsTUFBTSxFQUNoQixTQUFTLENBQUMsWUFBWSxFQUN0QixTQUFTLENBQUMsYUFBYSxDQUN4QixDQUFDO2dCQUNGLE9BQU8sRUFBRSxDQUFDO1lBRVosS0FBSyxjQUFjO2dCQUNqQixNQUFNLElBQUks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QXNCO1FBRXRCLE9BQU8sSUFBQSx3REFBZ0MsRUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQ3BCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FDekQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQS9MRCxvRUErTEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbml0aWFsaXplZFJlY29yZCxcbiAgUmVjb3JkSWRlbnRpdHksXG4gIFJlY29yZE9wZXJhdGlvblxufSBmcm9tICdAb3JiaXQvcmVjb3Jkcyc7XG5pbXBvcnQgeyBBc3luY09wZXJhdGlvblByb2Nlc3NvciB9IGZyb20gJy4uL2FzeW5jLW9wZXJhdGlvbi1wcm9jZXNzb3InO1xuaW1wb3J0IHtcbiAgZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcCxcbiAgZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcHMsXG4gIGdldEFsbEludmVyc2VSZWxhdGlvbnNoaXBzLFxuICBnZXRJbnZlcnNlUmVsYXRpb25zaGlwUmVtb3ZhbE9wc1xufSBmcm9tICcuL3V0aWxzL2NhY2hlLWludGVncml0eS11dGlscyc7XG5cbi8qKlxuICogQW4gb3BlcmF0aW9uIHByb2Nlc3NvciB0aGF0IGVuc3VyZXMgdGhhdCBhIGNhY2hlJ3MgZGF0YSBpcyBjb25zaXN0ZW50IGFuZFxuICogZG9lc24ndCBjb250YWluIGFueSBkZWFkIHJlZmVyZW5jZXMuXG4gKlxuICogVGhpcyBpcyBhY2hpZXZlZCBieSBtYWludGFpbmluZyBhIG1hcHBpbmcgb2YgcmV2ZXJzZSByZWxhdGlvbnNoaXBzIGZvciBlYWNoXG4gKiByZWNvcmQuIFdoZW4gYSByZWNvcmQgaXMgcmVtb3ZlZCwgYW55IHJlZmVyZW5jZXMgdG8gaXQgY2FuIGFsc28gYmUgaWRlbnRpZmllZFxuICogYW5kIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0NhY2hlSW50ZWdyaXR5UHJvY2Vzc29yIGV4dGVuZHMgQXN5bmNPcGVyYXRpb25Qcm9jZXNzb3Ige1xuICBhc3luYyBhZnRlcihvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbik6IFByb21pc2U8UmVjb3JkT3BlcmF0aW9uW10+IHtcbiAgICBzd2l0Y2ggKG9wZXJhdGlvbi5vcCkge1xuICAgICAgY2FzZSAncmVwbGFjZVJlbGF0ZWRSZWNvcmQnOlxuICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUludmVyc2VSZWxhdGlvbnNoaXAoXG4gICAgICAgICAgb3BlcmF0aW9uLnJlY29yZCxcbiAgICAgICAgICBvcGVyYXRpb24ucmVsYXRpb25zaGlwLFxuICAgICAgICAgIGF3YWl0IHRoaXMuYWNjZXNzb3IuZ2V0UmVsYXRlZFJlY29yZEFzeW5jKFxuICAgICAgICAgICAgb3BlcmF0aW9uLnJlY29yZCxcbiAgICAgICAgICAgIG9wZXJhdGlvbi5yZWxhdGlvbnNoaXBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBbXTtcblxuICAgICAgY2FzZSAncmVwbGFjZVJlbGF0ZWRSZWNvcmRzJzpcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwcyhcbiAgICAgICAgICBvcGVyYXRpb24ucmVjb3JkLFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWxhdGlvbnNoaXAsXG4gICAgICAgICAgYXdhaXQgdGhpcy5hY2Nlc3Nvci5nZXRSZWxhdGVkUmVjb3Jkc0FzeW5jKFxuICAgICAgICAgICAgb3BlcmF0aW9uLnJlY29yZCxcbiAgICAgICAgICAgIG9wZXJhdGlvbi5yZWxhdGlvbnNoaXBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBbXTtcblxuICAgICAgY2FzZSAncmVtb3ZlRnJvbVJlbGF0ZWRSZWNvcmRzJzpcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwKFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWNvcmQsXG4gICAgICAgICAgb3BlcmF0aW9uLnJlbGF0aW9uc2hpcCxcbiAgICAgICAgICBvcGVyYXRpb24ucmVsYXRlZFJlY29yZFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW107XG5cbiAgICAgIGNhc2UgJ3JlbW92ZVJlY29yZCc6XG4gICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlQWxsSW52ZXJzZVJlbGF0aW9uc2hpcHMob3BlcmF0aW9uLnJlY29yZCk7XG4gICAgICAgIHJldHVybiBbXTtcblxuICAgICAgY2FzZSAndXBkYXRlUmVjb3JkJzpcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVBbGxJbnZlcnNlUmVsYXRpb25zaGlwcyhvcGVyYXRpb24ucmVjb3JkKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZmluYWxseShvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbik6IFByb21pc2U8UmVjb3JkT3BlcmF0aW9uW10+IHtcbiAgICBzd2l0Y2ggKG9wZXJhdGlvbi5vcCkge1xuICAgICAgY2FzZSAncmVwbGFjZVJlbGF0ZWRSZWNvcmQnOlxuICAgICAgICBhd2FpdCB0aGlzLmFkZEludmVyc2VSZWxhdGlvbnNoaXAoXG4gICAgICAgICAgb3BlcmF0aW9uLnJlY29yZCxcbiAgICAgICAgICBvcGVyYXRpb24ucmVsYXRpb25zaGlwLFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWxhdGVkUmVjb3JkXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBbXTtcblxuICAgICAgY2FzZSAncmVwbGFjZVJlbGF0ZWRSZWNvcmRzJzpcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRJbnZlcnNlUmVsYXRpb25zaGlwcyhcbiAgICAgICAgICBvcGVyYXRpb24ucmVjb3JkLFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWxhdGlvbnNoaXAsXG4gICAgICAgICAgb3BlcmF0aW9uLnJlbGF0ZWRSZWNvcmRzXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBbXTtcblxuICAgICAgY2FzZSAnYWRkVG9SZWxhdGVkUmVjb3Jkcyc6XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkSW52ZXJzZVJlbGF0aW9uc2hpcChcbiAgICAgICAgICBvcGVyYXRpb24ucmVjb3JkLFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWxhdGlvbnNoaXAsXG4gICAgICAgICAgb3BlcmF0aW9uLnJlbGF0ZWRSZWNvcmRcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgICBjYXNlICdhZGRSZWNvcmQnOlxuICAgICAgICBhd2FpdCB0aGlzLmFkZEFsbEludmVyc2VSZWxhdGlvbnNoaXBzKG9wZXJhdGlvbi5yZWNvcmQpO1xuICAgICAgICByZXR1cm4gW107XG5cbiAgICAgIGNhc2UgJ3VwZGF0ZVJlY29yZCc6XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkQWxsSW52ZXJzZVJlbGF0aW9uc2hpcHMob3BlcmF0aW9uLnJlY29yZCk7XG4gICAgICAgIHJldHVybiBbXTtcblxuICAgICAgY2FzZSAncmVtb3ZlUmVjb3JkJzpcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xlYXJJbnZlcnNlUmVsYXRpb25zaGlwT3BzKG9wZXJhdGlvbi5yZWNvcmQpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFkZEludmVyc2VSZWxhdGlvbnNoaXAoXG4gICAgcmVjb3JkOiBSZWNvcmRJZGVudGl0eSxcbiAgICByZWxhdGlvbnNoaXA6IHN0cmluZyxcbiAgICByZWxhdGVkUmVjb3JkOiBSZWNvcmRJZGVudGl0eSB8IG51bGxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGludmVyc2VSZWxhdGlvbnNoaXAgPSBnZXRJbnZlcnNlUmVsYXRpb25zaGlwKFxuICAgICAgdGhpcy5hY2Nlc3Nvci5zY2hlbWEsXG4gICAgICByZWNvcmQsXG4gICAgICByZWxhdGlvbnNoaXAsXG4gICAgICByZWxhdGVkUmVjb3JkXG4gICAgKTtcbiAgICBpZiAoaW52ZXJzZVJlbGF0aW9uc2hpcCkge1xuICAgICAgYXdhaXQgdGhpcy5hY2Nlc3Nvci5hZGRJbnZlcnNlUmVsYXRpb25zaGlwc0FzeW5jKFtpbnZlcnNlUmVsYXRpb25zaGlwXSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFkZEludmVyc2VSZWxhdGlvbnNoaXBzKFxuICAgIHJlY29yZDogUmVjb3JkSWRlbnRpdHksXG4gICAgcmVsYXRpb25zaGlwOiBzdHJpbmcsXG4gICAgcmVsYXRlZFJlY29yZHM6IFJlY29yZElkZW50aXR5W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGludmVyc2VSZWxhdGlvbnNoaXBzID0gZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcHMoXG4gICAgICB0aGlzLmFjY2Vzc29yLnNjaGVtYSxcbiAgICAgIHJlY29yZCxcbiAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgIHJlbGF0ZWRSZWNvcmRzXG4gICAgKTtcbiAgICBpZiAoaW52ZXJzZVJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWNjZXNzb3IuYWRkSW52ZXJzZVJlbGF0aW9uc2hpcHNBc3luYyhpbnZlcnNlUmVsYXRpb25zaGlwcyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFkZEFsbEludmVyc2VSZWxhdGlvbnNoaXBzKFxuICAgIHJlY29yZDogSW5pdGlhbGl6ZWRSZWNvcmRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGludmVyc2VSZWxhdGlvbnNoaXBzID0gZ2V0QWxsSW52ZXJzZVJlbGF0aW9uc2hpcHMoXG4gICAgICB0aGlzLmFjY2Vzc29yLnNjaGVtYSxcbiAgICAgIHJlY29yZFxuICAgICk7XG4gICAgaWYgKGludmVyc2VSZWxhdGlvbnNoaXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuYWNjZXNzb3IuYWRkSW52ZXJzZVJlbGF0aW9uc2hpcHNBc3luYyhpbnZlcnNlUmVsYXRpb25zaGlwcyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlbW92ZUludmVyc2VSZWxhdGlvbnNoaXAoXG4gICAgcmVjb3JkOiBSZWNvcmRJZGVudGl0eSxcbiAgICByZWxhdGlvbnNoaXA6IHN0cmluZyxcbiAgICByZWxhdGVkUmVjb3JkPzogUmVjb3JkSWRlbnRpdHkgfCBudWxsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpbnZlcnNlUmVsYXRpb25zaGlwID0gZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcChcbiAgICAgIHRoaXMuYWNjZXNzb3Iuc2NoZW1hLFxuICAgICAgcmVjb3JkLFxuICAgICAgcmVsYXRpb25zaGlwLFxuICAgICAgcmVsYXRlZFJlY29yZFxuICAgICk7XG4gICAgaWYgKGludmVyc2VSZWxhdGlvbnNoaXApIHtcbiAgICAgIGF3YWl0IHRoaXMuYWNjZXNzb3IucmVtb3ZlSW52ZXJzZVJlbGF0aW9uc2hpcHNBc3luYyhbXG4gICAgICAgIGludmVyc2VSZWxhdGlvbnNoaXBcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwcyhcbiAgICByZWNvcmQ6IFJlY29yZElkZW50aXR5LFxuICAgIHJlbGF0aW9uc2hpcDogc3RyaW5nLFxuICAgIHJlbGF0ZWRSZWNvcmRzPzogUmVjb3JkSWRlbnRpdHlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaW52ZXJzZVJlbGF0aW9uc2hpcHMgPSBnZXRJbnZlcnNlUmVsYXRpb25zaGlwcyhcbiAgICAgIHRoaXMuYWNjZXNzb3Iuc2NoZW1hLFxuICAgICAgcmVjb3JkLFxuICAgICAgcmVsYXRpb25zaGlwLFxuICAgICAgcmVsYXRlZFJlY29yZHNcbiAgICApO1xuICAgIGlmIChpbnZlcnNlUmVsYXRpb25zaGlwcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmFjY2Vzc29yLnJlbW92ZUludmVyc2VSZWxhdGlvbnNoaXBzQXN5bmMoaW52ZXJzZVJlbGF0aW9uc2hpcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZW1vdmVBbGxJbnZlcnNlUmVsYXRpb25zaGlwcyhcbiAgICByZWNvcmQ6IFJlY29yZElkZW50aXR5XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRSZWNvcmQgPSBhd2FpdCB0aGlzLmFjY2Vzc29yLmdldFJlY29yZEFzeW5jKHJlY29yZCk7XG4gICAgaWYgKGN1cnJlbnRSZWNvcmQpIHtcbiAgICAgIGNvbnN0IGludmVyc2VSZWxhdGlvbnNoaXBzID0gZ2V0QWxsSW52ZXJzZVJlbGF0aW9uc2hpcHMoXG4gICAgICAgIHRoaXMuYWNjZXNzb3Iuc2NoZW1hLFxuICAgICAgICBjdXJyZW50UmVjb3JkXG4gICAgICApO1xuICAgICAgaWYgKGludmVyc2VSZWxhdGlvbnNoaXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hY2Nlc3Nvci5yZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwc0FzeW5jKFxuICAgICAgICAgIGludmVyc2VSZWxhdGlvbnNoaXBzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNsZWFySW52ZXJzZVJlbGF0aW9uc2hpcE9wcyhcbiAgICByZWNvcmQ6IFJlY29yZElkZW50aXR5XG4gICk6IFByb21pc2U8UmVjb3JkT3BlcmF0aW9uW10+IHtcbiAgICByZXR1cm4gZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcFJlbW92YWxPcHMoXG4gICAgICB0aGlzLmFjY2Vzc29yLnNjaGVtYSxcbiAgICAgIGF3YWl0IHRoaXMuYWNjZXNzb3IuZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcHNBc3luYyhyZWNvcmQpXG4gICAgKTtcbiAgfVxufVxuIl19