@aztec/kv-store 0.73.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/dest/config.js +5 -7
  2. package/dest/indexeddb/array.js +44 -36
  3. package/dest/indexeddb/index.js +1 -4
  4. package/dest/indexeddb/map.js +72 -43
  5. package/dest/indexeddb/set.js +3 -4
  6. package/dest/indexeddb/singleton.js +17 -22
  7. package/dest/indexeddb/store.js +97 -93
  8. package/dest/interfaces/array.js +3 -2
  9. package/dest/interfaces/array_test_suite.js +29 -25
  10. package/dest/interfaces/common.js +3 -2
  11. package/dest/interfaces/counter.js +1 -2
  12. package/dest/interfaces/index.js +0 -1
  13. package/dest/interfaces/map.js +3 -2
  14. package/dest/interfaces/map_test_suite.js +87 -42
  15. package/dest/interfaces/set.js +1 -2
  16. package/dest/interfaces/set_test_suite.js +59 -22
  17. package/dest/interfaces/singleton.js +4 -2
  18. package/dest/interfaces/singleton_test_suite.js +7 -10
  19. package/dest/interfaces/store.js +1 -2
  20. package/dest/interfaces/store_test_suite.js +6 -9
  21. package/dest/interfaces/utils.js +12 -15
  22. package/dest/lmdb/array.js +46 -41
  23. package/dest/lmdb/counter.js +18 -24
  24. package/dest/lmdb/index.js +2 -6
  25. package/dest/lmdb/map.js +90 -68
  26. package/dest/lmdb/set.js +4 -5
  27. package/dest/lmdb/singleton.js +13 -14
  28. package/dest/lmdb/store.js +124 -134
  29. package/dest/lmdb-v2/factory.js +25 -17
  30. package/dest/lmdb-v2/index.js +0 -1
  31. package/dest/lmdb-v2/map.js +82 -85
  32. package/dest/lmdb-v2/message.js +6 -7
  33. package/dest/lmdb-v2/read_transaction.js +65 -53
  34. package/dest/lmdb-v2/singleton.js +7 -5
  35. package/dest/lmdb-v2/store.js +52 -29
  36. package/dest/lmdb-v2/utils.js +30 -30
  37. package/dest/lmdb-v2/write_transaction.js +130 -110
  38. package/dest/stores/index.js +0 -1
  39. package/dest/stores/l2_tips_store.js +26 -12
  40. package/dest/utils.js +3 -7
  41. package/package.json +6 -6
  42. package/src/interfaces/index.ts +1 -1
  43. package/src/lmdb-v2/factory.ts +10 -0
  44. package/src/lmdb-v2/store.ts +29 -3
  45. package/dest/config.d.ts +0 -17
  46. package/dest/config.d.ts.map +0 -1
  47. package/dest/indexeddb/array.d.ts +0 -21
  48. package/dest/indexeddb/array.d.ts.map +0 -1
  49. package/dest/indexeddb/index.d.ts +0 -7
  50. package/dest/indexeddb/index.d.ts.map +0 -1
  51. package/dest/indexeddb/map.d.ts +0 -26
  52. package/dest/indexeddb/map.d.ts.map +0 -1
  53. package/dest/indexeddb/set.d.ts +0 -17
  54. package/dest/indexeddb/set.d.ts.map +0 -1
  55. package/dest/indexeddb/singleton.d.ts +0 -16
  56. package/dest/indexeddb/singleton.d.ts.map +0 -1
  57. package/dest/indexeddb/store.d.ts +0 -97
  58. package/dest/indexeddb/store.d.ts.map +0 -1
  59. package/dest/interfaces/array.d.ts +0 -80
  60. package/dest/interfaces/array.d.ts.map +0 -1
  61. package/dest/interfaces/array_test_suite.d.ts +0 -3
  62. package/dest/interfaces/array_test_suite.d.ts.map +0 -1
  63. package/dest/interfaces/common.d.ts +0 -23
  64. package/dest/interfaces/common.d.ts.map +0 -1
  65. package/dest/interfaces/counter.d.ts +0 -59
  66. package/dest/interfaces/counter.d.ts.map +0 -1
  67. package/dest/interfaces/index.d.ts +0 -8
  68. package/dest/interfaces/index.d.ts.map +0 -1
  69. package/dest/interfaces/map.d.ts +0 -134
  70. package/dest/interfaces/map.d.ts.map +0 -1
  71. package/dest/interfaces/map_test_suite.d.ts +0 -3
  72. package/dest/interfaces/map_test_suite.d.ts.map +0 -1
  73. package/dest/interfaces/set.d.ts +0 -44
  74. package/dest/interfaces/set.d.ts.map +0 -1
  75. package/dest/interfaces/set_test_suite.d.ts +0 -3
  76. package/dest/interfaces/set_test_suite.d.ts.map +0 -1
  77. package/dest/interfaces/singleton.d.ts +0 -29
  78. package/dest/interfaces/singleton.d.ts.map +0 -1
  79. package/dest/interfaces/singleton_test_suite.d.ts +0 -3
  80. package/dest/interfaces/singleton_test_suite.d.ts.map +0 -1
  81. package/dest/interfaces/store.d.ts +0 -145
  82. package/dest/interfaces/store.d.ts.map +0 -1
  83. package/dest/interfaces/store_test_suite.d.ts +0 -3
  84. package/dest/interfaces/store_test_suite.d.ts.map +0 -1
  85. package/dest/interfaces/utils.d.ts +0 -16
  86. package/dest/interfaces/utils.d.ts.map +0 -1
  87. package/dest/lmdb/array.d.ts +0 -23
  88. package/dest/lmdb/array.d.ts.map +0 -1
  89. package/dest/lmdb/counter.d.ts +0 -19
  90. package/dest/lmdb/counter.d.ts.map +0 -1
  91. package/dest/lmdb/index.d.ts +0 -12
  92. package/dest/lmdb/index.d.ts.map +0 -1
  93. package/dest/lmdb/map.d.ts +0 -52
  94. package/dest/lmdb/map.d.ts.map +0 -1
  95. package/dest/lmdb/set.d.ts +0 -18
  96. package/dest/lmdb/set.d.ts.map +0 -1
  97. package/dest/lmdb/singleton.d.ts +0 -14
  98. package/dest/lmdb/singleton.d.ts.map +0 -1
  99. package/dest/lmdb/store.d.ts +0 -110
  100. package/dest/lmdb/store.d.ts.map +0 -1
  101. package/dest/lmdb-v2/factory.d.ts +0 -7
  102. package/dest/lmdb-v2/factory.d.ts.map +0 -1
  103. package/dest/lmdb-v2/index.d.ts +0 -3
  104. package/dest/lmdb-v2/index.d.ts.map +0 -1
  105. package/dest/lmdb-v2/map.d.ts +0 -86
  106. package/dest/lmdb-v2/map.d.ts.map +0 -1
  107. package/dest/lmdb-v2/message.d.ts +0 -112
  108. package/dest/lmdb-v2/message.d.ts.map +0 -1
  109. package/dest/lmdb-v2/read_transaction.d.ts +0 -14
  110. package/dest/lmdb-v2/read_transaction.d.ts.map +0 -1
  111. package/dest/lmdb-v2/singleton.d.ts +0 -12
  112. package/dest/lmdb-v2/singleton.d.ts.map +0 -1
  113. package/dest/lmdb-v2/store.d.ts +0 -41
  114. package/dest/lmdb-v2/store.d.ts.map +0 -1
  115. package/dest/lmdb-v2/utils.d.ts +0 -19
  116. package/dest/lmdb-v2/utils.d.ts.map +0 -1
  117. package/dest/lmdb-v2/write_transaction.d.ts +0 -19
  118. package/dest/lmdb-v2/write_transaction.d.ts.map +0 -1
  119. package/dest/stores/index.d.ts +0 -2
  120. package/dest/stores/index.d.ts.map +0 -1
  121. package/dest/stores/l2_tips_store.d.ts +0 -13
  122. package/dest/stores/l2_tips_store.d.ts.map +0 -1
  123. package/dest/utils.d.ts +0 -12
  124. package/dest/utils.d.ts.map +0 -1
@@ -4,15 +4,24 @@ import { MsgpackChannel, NativeLMDBStore } from '@aztec/native';
4
4
  import { AsyncLocalStorage } from 'async_hooks';
5
5
  import { rm } from 'fs/promises';
6
6
  import { LMDBMap, LMDBMultiMap } from './map.js';
7
- import { Database, LMDBMessageType, } from './message.js';
7
+ import { Database, LMDBMessageType } from './message.js';
8
8
  import { ReadTransaction } from './read_transaction.js';
9
9
  import { LMDBSingleValue } from './singleton.js';
10
10
  import { WriteTransaction } from './write_transaction.js';
11
11
  export class AztecLMDBStoreV2 {
12
- constructor(dataDir, mapSize, maxReaders, log, cleanup) {
12
+ dataDir;
13
+ log;
14
+ cleanup;
15
+ open;
16
+ channel;
17
+ writerCtx;
18
+ writerQueue;
19
+ availableCursors;
20
+ constructor(dataDir, mapSize, maxReaders, log, cleanup){
13
21
  this.dataDir = dataDir;
14
22
  this.log = log;
15
23
  this.cleanup = cleanup;
24
+ this.open = false;
16
25
  this.writerCtx = new AsyncLocalStorage();
17
26
  this.writerQueue = new SerialQueue();
18
27
  this.log.info(`Starting data store with maxReaders ${maxReaders}`);
@@ -20,16 +29,20 @@ export class AztecLMDBStoreV2 {
20
29
  // leave one reader to always be available for regular, atomic, reads
21
30
  this.availableCursors = new Semaphore(maxReaders - 1);
22
31
  }
32
+ get dataDirectory() {
33
+ return this.dataDir;
34
+ }
23
35
  async start() {
24
36
  this.writerQueue.start();
25
- await this.sendMessage(LMDBMessageType.OPEN_DATABASE, {
37
+ await this.channel.sendMessage(LMDBMessageType.OPEN_DATABASE, {
26
38
  db: Database.DATA,
27
- uniqueKeys: true,
39
+ uniqueKeys: true
28
40
  });
29
- await this.sendMessage(LMDBMessageType.OPEN_DATABASE, {
41
+ await this.channel.sendMessage(LMDBMessageType.OPEN_DATABASE, {
30
42
  db: Database.INDEX,
31
- uniqueKeys: false,
43
+ uniqueKeys: false
32
44
  });
45
+ this.open = true;
33
46
  }
34
47
  static async new(dataDir, dbMapSizeKb = 10 * 1024 * 1024, maxReaders = 16, cleanup, log = createLogger('kv-store:lmdb-v2')) {
35
48
  const db = new AztecLMDBStoreV2(dataDir, dbMapSizeKb, maxReaders, log, cleanup);
@@ -37,9 +50,15 @@ export class AztecLMDBStoreV2 {
37
50
  return db;
38
51
  }
39
52
  getReadTx() {
53
+ if (!this.open) {
54
+ throw new Error('Store is closed');
55
+ }
40
56
  return new ReadTransaction(this);
41
57
  }
42
58
  getCurrentWriteTx() {
59
+ if (!this.open) {
60
+ throw new Error('Store is closed');
61
+ }
43
62
  const currentWrite = this.writerCtx.getStore();
44
63
  return currentWrite;
45
64
  }
@@ -62,6 +81,9 @@ export class AztecLMDBStoreV2 {
62
81
  throw new Error('Not implemented');
63
82
  }
64
83
  async transactionAsync(callback) {
84
+ if (!this.open) {
85
+ throw new Error('Store is closed');
86
+ }
65
87
  // transactionAsync might be called recursively
66
88
  // send any writes to the parent tx, but don't close it
67
89
  // if the callback throws then the parent tx will rollback automatically
@@ -69,18 +91,16 @@ export class AztecLMDBStoreV2 {
69
91
  if (currentTx) {
70
92
  return await callback(currentTx);
71
93
  }
72
- return this.writerQueue.put(async () => {
94
+ return this.writerQueue.put(async ()=>{
73
95
  const tx = new WriteTransaction(this);
74
96
  try {
75
97
  const res = await this.writerCtx.run(tx, callback, tx);
76
98
  await tx.commit();
77
99
  return res;
78
- }
79
- catch (err) {
100
+ } catch (err) {
80
101
  this.log.error(`Failed to commit transaction`, err);
81
102
  throw err;
82
- }
83
- finally {
103
+ } finally{
84
104
  tx.close();
85
105
  }
86
106
  });
@@ -93,15 +113,26 @@ export class AztecLMDBStoreV2 {
93
113
  }
94
114
  async delete() {
95
115
  await this.close();
96
- await rm(this.dataDir, { recursive: true, force: true });
116
+ await rm(this.dataDir, {
117
+ recursive: true,
118
+ force: true
119
+ });
97
120
  this.log.verbose(`Deleted database files at ${this.dataDir}`);
98
121
  await this.cleanup?.();
99
122
  }
100
123
  async close() {
124
+ if (!this.open) {
125
+ // already closed
126
+ return;
127
+ }
128
+ this.open = false;
101
129
  await this.writerQueue.cancel();
102
- await this.sendMessage(LMDBMessageType.CLOSE, undefined);
130
+ await this.channel.sendMessage(LMDBMessageType.CLOSE, undefined);
103
131
  }
104
132
  async sendMessage(msgType, body) {
133
+ if (!this.open) {
134
+ throw new Error('Store is closed');
135
+ }
105
136
  if (msgType === LMDBMessageType.START_CURSOR) {
106
137
  await this.availableCursors.acquire();
107
138
  }
@@ -109,13 +140,9 @@ export class AztecLMDBStoreV2 {
109
140
  try {
110
141
  ({ response } = await this.channel.sendMessage(msgType, body));
111
142
  return response;
112
- }
113
- finally {
114
- if ((msgType === LMDBMessageType.START_CURSOR && response === undefined) ||
115
- msgType === LMDBMessageType.CLOSE_CURSOR ||
116
- // it's possible for a START_CURSOR command to not return a cursor (e.g. db is empty)
117
- (msgType === LMDBMessageType.START_CURSOR &&
118
- typeof response.cursor !== 'number')) {
143
+ } finally{
144
+ if (msgType === LMDBMessageType.START_CURSOR && response === undefined || msgType === LMDBMessageType.CLOSE_CURSOR || // it's possible for a START_CURSOR command to not return a cursor (e.g. db is empty)
145
+ msgType === LMDBMessageType.START_CURSOR && typeof response.cursor !== 'number') {
119
146
  this.availableCursors.release();
120
147
  }
121
148
  }
@@ -124,8 +151,8 @@ export class AztecLMDBStoreV2 {
124
151
  const resp = await this.sendMessage(LMDBMessageType.STATS, undefined);
125
152
  return {
126
153
  mappingSize: Number(resp.dbMapSizeBytes),
127
- actualSize: resp.stats.reduce((s, db) => Number(db.totalUsedSize) + s, 0),
128
- numItems: resp.stats.reduce((s, db) => Number(db.numDataItems) + s, 0),
154
+ actualSize: resp.stats.reduce((s, db)=>Number(db.totalUsedSize) + s, 0),
155
+ numItems: resp.stats.reduce((s, db)=>Number(db.numDataItems) + s, 0)
129
156
  };
130
157
  }
131
158
  }
@@ -133,8 +160,7 @@ export function execInWriteTx(store, fn) {
133
160
  const currentWrite = store.getCurrentWriteTx();
134
161
  if (currentWrite) {
135
162
  return fn(currentWrite);
136
- }
137
- else {
163
+ } else {
138
164
  return store.transactionAsync(fn);
139
165
  }
140
166
  }
@@ -142,15 +168,12 @@ export async function execInReadTx(store, fn) {
142
168
  const currentWrite = store.getCurrentWriteTx();
143
169
  if (currentWrite) {
144
170
  return await fn(currentWrite);
145
- }
146
- else {
171
+ } else {
147
172
  const tx = store.getReadTx();
148
173
  try {
149
174
  return await fn(tx);
150
- }
151
- finally {
175
+ } finally{
152
176
  tx.close();
153
177
  }
154
178
  }
155
179
  }
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG1kYi12Mi9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVNqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsUUFBUSxFQUVSLGVBQWUsR0FHaEIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxNQUFNLE9BQU8sZ0JBQWdCO0lBTTNCLFlBQ1UsT0FBZSxFQUN2QixPQUFlLEVBQ2YsVUFBa0IsRUFDVixHQUFXLEVBQ1gsT0FBNkI7UUFKN0IsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUdmLFFBQUcsR0FBSCxHQUFHLENBQVE7UUFDWCxZQUFPLEdBQVAsT0FBTyxDQUFzQjtRQVQvQixjQUFTLEdBQUcsSUFBSSxpQkFBaUIsRUFBb0IsQ0FBQztRQUN0RCxnQkFBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFVdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUNBQXVDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJ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
@@ -1,16 +1,14 @@
1
1
  import { MAXIMUM_KEY, fromBufferKey, toBufferKey } from 'ordered-binary';
2
2
  export function dedupeSortedArray(arr, cmp) {
3
- for (let i = 0; i < arr.length; i++) {
3
+ for(let i = 0; i < arr.length; i++){
4
4
  let j = i + 1;
5
- for (; j < arr.length; j++) {
5
+ for(; j < arr.length; j++){
6
6
  const res = cmp(arr[i], arr[j]);
7
7
  if (res === 0) {
8
8
  continue;
9
- }
10
- else if (res < 0) {
9
+ } else if (res < 0) {
11
10
  break;
12
- }
13
- else {
11
+ } else {
14
12
  throw new Error('Array not sorted');
15
13
  }
16
14
  }
@@ -22,13 +20,12 @@ export function dedupeSortedArray(arr, cmp) {
22
20
  export function insertIntoSortedArray(arr, item, cmp) {
23
21
  let left = 0;
24
22
  let right = arr.length;
25
- while (left < right) {
26
- const mid = (left + right) >> 1;
23
+ while(left < right){
24
+ const mid = left + right >> 1;
27
25
  const comparison = cmp(arr[mid], item);
28
26
  if (comparison < 0) {
29
27
  left = mid + 1;
30
- }
31
- else {
28
+ } else {
32
29
  right = mid;
33
30
  }
34
31
  }
@@ -37,16 +34,14 @@ export function insertIntoSortedArray(arr, item, cmp) {
37
34
  export function findIndexInSortedArray(values, needle, cmp) {
38
35
  let start = 0;
39
36
  let end = values.length - 1;
40
- while (start <= end) {
41
- const mid = start + (((end - start) / 2) | 0);
37
+ while(start <= end){
38
+ const mid = start + ((end - start) / 2 | 0);
42
39
  const res = cmp(values[mid], needle);
43
40
  if (res === 0) {
44
41
  return mid;
45
- }
46
- else if (res > 0) {
42
+ } else if (res > 0) {
47
43
  end = mid - 1;
48
- }
49
- else {
44
+ } else {
50
45
  start = mid + 1;
51
46
  }
52
47
  }
@@ -60,19 +55,17 @@ export function removeAnyOf(arr, vals, cmp) {
60
55
  let writeIdx = 0;
61
56
  let readIdx = 0;
62
57
  let valIdx = 0;
63
- while (readIdx < arr.length && valIdx < vals.length) {
58
+ while(readIdx < arr.length && valIdx < vals.length){
64
59
  const comparison = cmp(arr[readIdx], vals[valIdx]);
65
60
  if (comparison < 0) {
66
61
  arr[writeIdx++] = arr[readIdx++];
67
- }
68
- else if (comparison > 0) {
62
+ } else if (comparison > 0) {
69
63
  valIdx++;
70
- }
71
- else {
64
+ } else {
72
65
  readIdx++;
73
66
  }
74
67
  }
75
- while (readIdx < arr.length) {
68
+ while(readIdx < arr.length){
76
69
  arr[writeIdx++] = arr[readIdx++];
77
70
  }
78
71
  arr.length = writeIdx;
@@ -86,16 +79,16 @@ export function removeFromSortedArray(arr, val, cmp) {
86
79
  export function merge(arr, toInsert, cmp) {
87
80
  const result = new Array(arr.length + toInsert.length);
88
81
  let i = 0, j = 0, k = 0;
89
- while (i < arr.length && j < toInsert.length) {
82
+ while(i < arr.length && j < toInsert.length){
90
83
  result[k++] = cmp(arr[i], toInsert[j]) <= 0 ? arr[i++] : toInsert[j++];
91
84
  }
92
- while (i < arr.length) {
85
+ while(i < arr.length){
93
86
  result[k++] = arr[i++];
94
87
  }
95
- while (j < toInsert.length) {
88
+ while(j < toInsert.length){
96
89
  result[k++] = toInsert[j++];
97
90
  }
98
- for (i = 0; i < result.length; i++) {
91
+ for(i = 0; i < result.length; i++){
99
92
  arr[i] = result[i];
100
93
  }
101
94
  arr.length = result.length;
@@ -107,13 +100,21 @@ export function singleKeyCmp(a, b) {
107
100
  return Buffer.compare(a[0], b);
108
101
  }
109
102
  export function minKey(prefix) {
110
- return toBufferKey([prefix]);
103
+ return toBufferKey([
104
+ prefix
105
+ ]);
111
106
  }
112
107
  export function maxKey(prefix) {
113
- return toBufferKey([prefix, MAXIMUM_KEY]);
108
+ return toBufferKey([
109
+ prefix,
110
+ MAXIMUM_KEY
111
+ ]);
114
112
  }
115
113
  export function serializeKey(prefix, key) {
116
- return toBufferKey([prefix, key]);
114
+ return toBufferKey([
115
+ prefix,
116
+ key
117
+ ]);
117
118
  }
118
119
  export function deserializeKey(prefix, key) {
119
120
  const buf = Buffer.from(key);
@@ -123,4 +124,3 @@ export function deserializeKey(prefix, key) {
123
124
  }
124
125
  return parsed[1];
125
126
  }
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG1kYi12Mi91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU16RSxNQUFNLFVBQVUsaUJBQWlCLENBQUksR0FBUSxFQUFFLEdBQVc7SUFDeEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2QsU0FBUztZQUNYLENBQUM7aUJBQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25CLE1BQU07WUFDUixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFJLEdBQVEsRUFBRSxJQUFPLEVBQUUsR0FBMkI7SUFDckYsSUFBSSxJ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