UNPKG

15.2 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4const node_storage_common_1 = require("@neo-one/node-storage-common");
5const utils_1 = require("@neo-one/utils");
6const lru_cache_1 = tslib_1.__importDefault(require("lru-cache"));
7const convertChange_1 = require("./convertChange");
8const read = tslib_1.__importStar(require("./read"));
9exports.cacheStorage = ({ environment, storage, }) => {
10 // tslint:disable-next-line no-any
11 const cache = new lru_cache_1.default({
12 max: environment.maxSizeBytes,
13 });
14 const serializeHeaderKey = ({ hashOrIndex }) => typeof hashOrIndex === 'number'
15 ? `header:${hashOrIndex}`
16 : node_storage_common_1.keys.typeKeyToSerializeKey.header({ hash: hashOrIndex });
17 const headerBase = read.createReadStorage({
18 cache,
19 storage: storage.header,
20 serializeKeyString: serializeHeaderKey,
21 });
22 const header = {
23 get: headerBase.get,
24 tryGet: headerBase.tryGet,
25 tryGetLatest: storage.header.tryGetLatest,
26 };
27 const serializeBlockKey = ({ hashOrIndex }) => typeof hashOrIndex === 'number' ? `block:${hashOrIndex}` : node_storage_common_1.keys.typeKeyToSerializeKey.block({ hash: hashOrIndex });
28 const blockBase = read.createReadStorage({
29 cache,
30 storage: storage.block,
31 serializeKeyString: serializeBlockKey,
32 });
33 const block = {
34 get: blockBase.get,
35 tryGet: blockBase.tryGet,
36 tryGetLatest: storage.block.tryGetLatest,
37 };
38 return {
39 header,
40 block,
41 blockData: read.createReadStorage({
42 cache,
43 storage: storage.blockData,
44 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKey.blockData,
45 }),
46 account: read.createReadAllStorage({
47 cache,
48 storage: storage.account,
49 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKey.account,
50 }),
51 accountUnspent: storage.accountUnspent,
52 accountUnclaimed: storage.accountUnclaimed,
53 action: storage.action,
54 asset: read.createReadStorage({
55 cache,
56 storage: storage.asset,
57 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKey.asset,
58 }),
59 transaction: read.createReadStorage({
60 cache,
61 storage: storage.transaction,
62 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKey.transaction,
63 }),
64 transactionData: read.createReadStorage({
65 cache,
66 storage: storage.transactionData,
67 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKey.transactionData,
68 }),
69 output: read.createReadStorage({
70 cache,
71 storage: storage.output,
72 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKey.output,
73 }),
74 contract: read.createReadStorage({
75 cache,
76 storage: storage.contract,
77 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKey.contract,
78 }),
79 storageItem: read.createReadGetAllStorage({
80 cache,
81 storage: storage.storageItem,
82 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKey.storageItem,
83 }),
84 validator: read.createReadAllStorage({
85 cache,
86 storage: storage.validator,
87 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKey.validator,
88 }),
89 invocationData: storage.invocationData,
90 validatorsCount: storage.validatorsCount,
91 async close() {
92 await storage.close();
93 },
94 async commit(changeSet) {
95 const changesList = changeSet.map(convertChange_1.convertChange);
96 // tslint:disable-next-line no-loop-statement
97 for (const changes of changesList) {
98 // tslint:disable-next-line no-loop-statement
99 for (const change of changes) {
100 switch (change.type) {
101 case 'add':
102 cache.set(change.key, change.value);
103 break;
104 case 'delete':
105 cache.del(change.key);
106 break;
107 default:
108 utils_1.utils.assertNever(change);
109 throw new Error('For TS');
110 }
111 }
112 }
113 await storage.commit(changeSet);
114 },
115 async reset() {
116 cache.reset();
117 await storage.reset();
118 },
119 };
120};
121
122//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNhY2hlU3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxzRUFBb0Q7QUFDcEQsMENBQXVDO0FBQ3ZDLGtFQUFpQztBQUNqQyxtREFBZ0Q7QUFDaEQscURBQStCO0FBS2xCLFFBQUEsWUFBWSxHQUFHLENBQUMsRUFDM0IsV0FBVyxFQUNYLE9BQU8sR0FJUixFQUFXLEVBQUU7SUFDWixrQ0FBa0M7SUFDbEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBUSxDQUFjO1FBQ3RDLEdBQUcsRUFBRSxXQUFXLENBQUMsWUFBWTtLQUU5QixDQUFDLENBQUM7SUFFSCxNQUFNLGtCQUFrQixHQUFHLENBQUMsRUFBRSxXQUFXLEVBQXFDLEVBQUUsRUFBRSxDQUNoRixPQUFPLFdBQVcsS0FBSyxRQUFRO1FBQzdCLENBQUMsQ0FBQyxVQUFVLFdBQVcsRUFBRTtRQUN6QixDQUFDLENBQUMsMEJBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUUvRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDeEMsS0FBSztRQUNMLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN2QixrQkFBa0IsRUFBRSxrQkFBa0I7S0FDdkMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxNQUFNLEdBQUc7UUFDYixHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUc7UUFDbkIsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO1FBQ3pCLFlBQVksRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVk7S0FDMUMsQ0FBQztJQUVGLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxFQUFFLFdBQVcsRUFBcUMsRUFBRSxFQUFFLENBQy9FLE9BQU8sV0FBVyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsMEJBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUVySCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDdkMsS0FBSztRQUNMLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSztRQUN0QixrQkFBa0IsRUFBRSxpQkFBaUI7S0FDdEMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxLQUFLLEdBQUc7UUFDWixHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUc7UUFDbEIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNO1FBQ3hCLFlBQVksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVk7S0FDekMsQ0FBQztJQUVGLE9BQU87UUFDTCxNQUFNO1FBQ04sS0FBSztRQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDaEMsS0FBSztZQUNMLE9BQU8sRUFBRSxPQUFPLENBQUMsU0FBUztZQUMxQixrQkFBa0IsRUFBRSwwQkFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVM7U0FDekQsQ0FBQztRQUVGLE9BQU8sRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFDakMsS0FBSztZQUNMLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixrQkFBa0IsRUFBRSwwQkFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU87U0FDdkQsQ0FBQztRQUVGLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztRQUN0QyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1FBQzFDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQzVCLEtBQUs7WUFDTCxPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUs7WUFDdEIsa0JBQWtCLEVBQUUsMEJBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLO1NBQ3JELENBQUM7UUFFRixXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ2xDLEtBQUs7WUFDTCxPQUFPLEVBQUUsT0FBTyxDQUFDLFdBQVc7WUFDNUIsa0JBQWtCLEVBQUUsMEJBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXO1NBQzNELENBQUM7UUFFRixlQUFlLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ3RDLEtBQUs7WUFDTCxPQUFPLEVBQUUsT0FBTyxDQUFDLGVBQWU7WUFDaEMsa0JBQWtCLEVBQUUsMEJBQUksQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlO1NBQy9ELENBQUM7UUFFRixNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQzdCLEtBQUs7WUFDTCxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdkIsa0JBQWtCLEVBQUUsMEJBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNO1NBQ3RELENBQUM7UUFFRixRQUFRLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQy9CLEtBQUs7WUFDTCxPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDekIsa0JBQWtCLEVBQUUsMEJBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRO1NBQ3hELENBQUM7UUFFRixXQUFXLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBQ3hDLEtBQUs7WUFDTCxPQUFPLEVBQUUsT0FBTyxDQUFDLFdBQVc7WUFDNUIsa0JBQWtCLEVBQUUsMEJBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXO1NBQzNELENBQUM7UUFFRixTQUFTLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQ25DLEtBQUs7WUFDTCxPQUFPLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDMUIsa0JBQWtCLEVBQUUsMEJBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTO1NBQ3pELENBQUM7UUFFRixjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7UUFDdEMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlO1FBQ3hDLEtBQUssQ0FBQyxLQUFLO1lBQ1QsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsQ0FBQztRQUNELEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUztZQUNwQixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLDZCQUFhLENBQUMsQ0FBQztZQUNqRCw2Q0FBNkM7WUFDN0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxXQUFXLEVBQUU7Z0JBQ2pDLDZDQUE2QztnQkFDN0MsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7b0JBQzVCLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRTt3QkFDbkIsS0FBSyxLQUFLOzRCQUNSLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ3BDLE1BQU07d0JBQ1IsS0FBSyxRQUFROzRCQUNYLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUN0QixNQUFNO3dCQUNSOzRCQUNFLGFBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQzdCO2lCQUNGO2FBQ0Y7WUFDRCxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUNELEtBQUssQ0FBQyxLQUFLO1lBQ1QsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2QsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDLENBQUMiLCJmaWxlIjoibmVvLW9uZS1ub2RlLXN0b3JhZ2UtY2FjaGUvc3JjL2NhY2hlU3RvcmFnZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVJbnQyNTYgfSBmcm9tICdAbmVvLW9uZS9jbGllbnQtY29tbW9uJztcbmltcG9ydCB7IFN0b3JhZ2UgfSBmcm9tICdAbmVvLW9uZS9ub2RlLWNvcmUnO1xuaW1wb3J0IHsga2V5cyB9IGZyb20gJ0BuZW8tb25lL25vZGUtc3RvcmFnZS1jb21tb24nO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAbmVvLW9uZS91dGlscyc7XG5pbXBvcnQgTFJVQ2FjaGUgZnJvbSAnbHJ1LWNhY2hlJztcbmltcG9ydCB7IGNvbnZlcnRDaGFuZ2UgfSBmcm9tICcuL2NvbnZlcnRDaGFuZ2UnO1xuaW1wb3J0ICogYXMgcmVhZCBmcm9tICcuL3JlYWQnO1xuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudCB7XG4gIHJlYWRvbmx5IG1heFNpemVCeXRlczogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgY2FjaGVTdG9yYWdlID0gKHtcbiAgZW52aXJvbm1lbnQsXG4gIHN0b3JhZ2UsXG59OiB7XG4gIHJlYWRvbmx5IGVudmlyb25tZW50OiBFbnZpcm9ubWVudDtcbiAgcmVhZG9ubHkgc3RvcmFnZTogU3RvcmFnZTtcbn0pOiBTdG9yYWdlID0+IHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICBjb25zdCBjYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIGFueT4oe1xuICAgIG1heDogZW52aXJvbm1lbnQubWF4U2l6ZUJ5dGVzLFxuICAgIC8vIGxlbmd0aDogKHZhbHVlLCBrZXkpID0+IHZhbHVlLnNpemUgKyBCdWZmZXIuYnl0ZUxlbmd0aChrZXksICd1dGY4JyksXG4gIH0pO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZUhlYWRlcktleSA9ICh7IGhhc2hPckluZGV4IH06IHsgaGFzaE9ySW5kZXg6IG51bWJlciB8IFVJbnQyNTYgfSkgPT5cbiAgICB0eXBlb2YgaGFzaE9ySW5kZXggPT09ICdudW1iZXInXG4gICAgICA/IGBoZWFkZXI6JHtoYXNoT3JJbmRleH1gXG4gICAgICA6IGtleXMudHlwZUtleVRvU2VyaWFsaXplS2V5LmhlYWRlcih7IGhhc2g6IGhhc2hPckluZGV4IH0pO1xuXG4gIGNvbnN0IGhlYWRlckJhc2UgPSByZWFkLmNyZWF0ZVJlYWRTdG9yYWdlKHtcbiAgICBjYWNoZSxcbiAgICBzdG9yYWdlOiBzdG9yYWdlLmhlYWRlcixcbiAgICBzZXJpYWxpemVLZXlTdHJpbmc6IHNlcmlhbGl6ZUhlYWRlcktleSxcbiAgfSk7XG5cbiAgY29uc3QgaGVhZGVyID0ge1xuICAgIGdldDogaGVhZGVyQmFzZS5nZXQsXG4gICAgdHJ5R2V0OiBoZWFkZXJCYXNlLnRyeUdldCxcbiAgICB0cnlHZXRMYXRlc3Q6IHN0b3JhZ2UuaGVhZGVyLnRyeUdldExhdGVzdCxcbiAgfTtcblxuICBjb25zdCBzZXJpYWxpemVCbG9ja0tleSA9ICh7IGhhc2hPckluZGV4IH06IHsgaGFzaE9ySW5kZXg6IG51bWJlciB8IFVJbnQyNTYgfSkgPT5cbiAgICB0eXBlb2YgaGFzaE9ySW5kZXggPT09ICdudW1iZXInID8gYGJsb2NrOiR7aGFzaE9ySW5kZXh9YCA6IGtleXMudHlwZUtleVRvU2VyaWFsaXplS2V5LmJsb2NrKHsgaGFzaDogaGFzaE9ySW5kZXggfSk7XG5cbiAgY29uc3QgYmxvY2tCYXNlID0gcmVhZC5jcmVhdGVSZWFkU3RvcmFnZSh7XG4gICAgY2FjaGUsXG4gICAgc3RvcmFnZTogc3RvcmFnZS5ibG9jayxcbiAgICBzZXJpYWxpemVLZXlTdHJpbmc6IHNlcmlhbGl6ZUJsb2NrS2V5LFxuICB9KTtcblxuICBjb25zdCBibG9jayA9IHtcbiAgICBnZXQ6IGJsb2NrQmFzZS5nZXQsXG4gICAgdHJ5R2V0OiBibG9ja0Jhc2UudHJ5R2V0LFxuICAgIHRyeUdldExhdGVzdDogc3RvcmFnZS5ibG9jay50cnlHZXRMYXRlc3QsXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBoZWFkZXIsXG4gICAgYmxvY2ssXG4gICAgYmxvY2tEYXRhOiByZWFkLmNyZWF0ZVJlYWRTdG9yYWdlKHtcbiAgICAgIGNhY2hlLFxuICAgICAgc3RvcmFnZTogc3RvcmFnZS5ibG9ja0RhdGEsXG4gICAgICBzZXJpYWxpemVLZXlTdHJpbmc6IGtleXMudHlwZUtleVRvU2VyaWFsaXplS2V5LmJsb2NrRGF0YSxcbiAgICB9KSxcblxuICAgIGFjY291bnQ6IHJlYWQuY3JlYXRlUmVhZEFsbFN0b3JhZ2Uoe1xuICAgICAgY2FjaGUsXG4gICAgICBzdG9yYWdlOiBzdG9yYWdlLmFjY291bnQsXG4gICAgICBzZXJpYWxpemVLZXlTdHJpbmc6IGtleXMudHlwZUtleVRvU2VyaWFsaXplS2V5LmFjY291bnQsXG4gICAgfSksXG5cbiAgICBhY2NvdW50VW5zcGVudDogc3RvcmFnZS5hY2NvdW50VW5zcGVudCxcbiAgICBhY2NvdW50VW5jbGFpbWVkOiBzdG9yYWdlLmFjY291bnRVbmNsYWltZWQsXG4gICAgYWN0aW9uOiBzdG9yYWdlLmFjdGlvbixcbiAgICBhc3NldDogcmVhZC5jcmVhdGVSZWFkU3RvcmFnZSh7XG4gICAgICBjYWNoZSxcbiAgICAgIHN0b3JhZ2U6IHN0b3JhZ2UuYXNzZXQsXG4gICAgICBzZXJpYWxpemVLZXlTdHJpbmc6IGtleXMudHlwZUtleVRvU2VyaWFsaXplS2V5LmFzc2V0LFxuICAgIH0pLFxuXG4gICAgdHJhbnNhY3Rpb246IHJlYWQuY3JlYXRlUmVhZFN0b3JhZ2Uoe1xuICAgICAgY2FjaGUsXG4gICAgICBzdG9yYWdlOiBzdG9yYWdlLnRyYW5zYWN0aW9uLFxuICAgICAgc2VyaWFsaXplS2V5U3RyaW5nOiBrZXlzLnR5cGVLZXlUb1NlcmlhbGl6ZUtleS50cmFuc2FjdGlvbixcbiAgICB9KSxcblxuICAgIHRyYW5zYWN0aW9uRGF0YTogcmVhZC5jcmVhdGVSZWFkU3RvcmFnZSh7XG4gICAgICBjYWNoZSxcbiAgICAgIHN0b3JhZ2U6IHN0b3JhZ2UudHJhbnNhY3Rpb25EYXRhLFxuICAgICAgc2VyaWFsaXplS2V5U3RyaW5nOiBrZXlzLnR5cGVLZXlUb1NlcmlhbGl6ZUtleS50cmFuc2FjdGlvbkRhdGEsXG4gICAgfSksXG5cbiAgICBvdXRwdXQ6IHJlYWQuY3JlYXRlUmVhZFN0b3JhZ2Uoe1xuICAgICAgY2FjaGUsXG4gICAgICBzdG9yYWdlOiBzdG9yYWdlLm91dHB1dCxcbiAgICAgIHNlcmlhbGl6ZUtleVN0cmluZzoga2V5cy50eXBlS2V5VG9TZXJpYWxpemVLZXkub3V0cHV0LFxuICAgIH0pLFxuXG4gICAgY29udHJhY3Q6IHJlYWQuY3JlYXRlUmVhZFN0b3JhZ2Uoe1xuICAgICAgY2FjaGUsXG4gICAgICBzdG9yYWdlOiBzdG9yYWdlLmNvbnRyYWN0LFxuICAgICAgc2VyaWFsaXplS2V5U3RyaW5nOiBrZXlzLnR5cGVLZXlUb1NlcmlhbGl6ZUtleS5jb250cmFjdCxcbiAgICB9KSxcblxuICAgIHN0b3JhZ2VJdGVtOiByZWFkLmNyZWF0ZVJlYWRHZXRBbGxTdG9yYWdlKHtcbiAgICAgIGNhY2hlLFxuICAgICAgc3RvcmFnZTogc3RvcmFnZS5zdG9yYWdlSXRlbSxcbiAgICAgIHNlcmlhbGl6ZUtleVN0cmluZzoga2V5cy50eXBlS2V5VG9TZXJpYWxpemVLZXkuc3RvcmFnZUl0ZW0sXG4gICAgfSksXG5cbiAgICB2YWxpZGF0b3I6IHJlYWQuY3JlYXRlUmVhZEFsbFN0b3JhZ2Uoe1xuICAgICAgY2FjaGUsXG4gICAgICBzdG9yYWdlOiBzdG9yYWdlLnZhbGlkYXRvcixcbiAgICAgIHNlcmlhbGl6ZUtleVN0cmluZzoga2V5cy50eXBlS2V5VG9TZXJpYWxpemVLZXkudmFsaWRhdG9yLFxuICAgIH0pLFxuXG4gICAgaW52b2NhdGlvbkRhdGE6IHN0b3JhZ2UuaW52b2NhdGlvbkRhdGEsXG4gICAgdmFsaWRhdG9yc0NvdW50OiBzdG9yYWdlLnZhbGlkYXRvcnNDb3VudCxcbiAgICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHN0b3JhZ2UuY2xvc2UoKTtcbiAgICB9LFxuICAgIGFzeW5jIGNvbW1pdChjaGFuZ2VTZXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IGNoYW5nZXNMaXN0ID0gY2hhbmdlU2V0Lm1hcChjb252ZXJ0Q2hhbmdlKTtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1sb29wLXN0YXRlbWVudFxuICAgICAgZm9yIChjb25zdCBjaGFuZ2VzIG9mIGNoYW5nZXNMaXN0KSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1sb29wLXN0YXRlbWVudFxuICAgICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBjaGFuZ2VzKSB7XG4gICAgICAgICAgc3dpdGNoIChjaGFuZ2UudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnYWRkJzpcbiAgICAgICAgICAgICAgY2FjaGUuc2V0KGNoYW5nZS5rZXksIGNoYW5nZS52YWx1ZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgICAgICAgY2FjaGUuZGVsKGNoYW5nZS5rZXkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHV0aWxzLmFzc2VydE5ldmVyKGNoYW5nZSk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm9yIFRTJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBzdG9yYWdlLmNvbW1pdChjaGFuZ2VTZXQpO1xuICAgIH0sXG4gICAgYXN5bmMgcmVzZXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjYWNoZS5yZXNldCgpO1xuICAgICAgYXdhaXQgc3RvcmFnZS5yZXNldCgpO1xuICAgIH0sXG4gIH07XG59O1xuIl19