@sochdb/sochdb 0.4.0 → 0.4.2

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 (80) hide show
  1. package/README.md +416 -34
  2. package/_bin/aarch64-apple-darwin/libsochdb_storage.dylib +0 -0
  3. package/_bin/aarch64-apple-darwin/sochdb-bulk +0 -0
  4. package/_bin/aarch64-apple-darwin/sochdb-grpc-server +0 -0
  5. package/_bin/aarch64-apple-darwin/sochdb-server +0 -0
  6. package/_bin/x86_64-pc-windows-msvc/sochdb-bulk.exe +0 -0
  7. package/_bin/x86_64-pc-windows-msvc/sochdb-grpc-server.exe +0 -0
  8. package/_bin/x86_64-pc-windows-msvc/sochdb_storage.dll +0 -0
  9. package/_bin/x86_64-unknown-linux-gnu/libsochdb_storage.so +0 -0
  10. package/_bin/x86_64-unknown-linux-gnu/sochdb-bulk +0 -0
  11. package/_bin/x86_64-unknown-linux-gnu/sochdb-grpc-server +0 -0
  12. package/_bin/x86_64-unknown-linux-gnu/sochdb-server +0 -0
  13. package/bin/sochdb-bulk.js +1 -1
  14. package/bin/sochdb-grpc-server.js +1 -1
  15. package/bin/sochdb-server.js +1 -1
  16. package/dist/cjs/context-builder.js +280 -0
  17. package/dist/cjs/database.js +2 -2
  18. package/dist/cjs/embedded/database.js +2 -2
  19. package/dist/cjs/embedded/ffi/hnsw-bindings.js +295 -0
  20. package/dist/cjs/embedded/ffi/library-finder.js +10 -3
  21. package/dist/cjs/embedded/index.js +5 -2
  22. package/dist/cjs/errors.js +99 -7
  23. package/dist/cjs/index.js +46 -6
  24. package/dist/cjs/ipc-client.js +2 -2
  25. package/dist/cjs/memory/consolidation.js +202 -0
  26. package/dist/cjs/memory/extraction.js +181 -0
  27. package/dist/cjs/memory/index.js +26 -0
  28. package/dist/cjs/memory/retrieval.js +232 -0
  29. package/dist/cjs/memory/types.js +69 -0
  30. package/dist/cjs/namespace.js +255 -0
  31. package/dist/cjs/queue.js +289 -0
  32. package/dist/cjs/semantic-cache.js +220 -0
  33. package/dist/esm/context-builder.js +280 -0
  34. package/dist/esm/database.js +2 -2
  35. package/dist/esm/embedded/database.js +2 -2
  36. package/dist/esm/embedded/ffi/hnsw-bindings.js +316 -0
  37. package/dist/esm/embedded/ffi/library-finder.js +10 -3
  38. package/dist/esm/embedded/index.js +5 -2
  39. package/dist/esm/errors.js +107 -7
  40. package/dist/esm/index.js +46 -6
  41. package/dist/esm/ipc-client.js +2 -2
  42. package/dist/esm/memory/consolidation.js +206 -0
  43. package/dist/esm/memory/extraction.js +185 -0
  44. package/dist/esm/memory/index.js +26 -0
  45. package/dist/esm/memory/retrieval.js +243 -0
  46. package/dist/esm/memory/types.js +72 -0
  47. package/dist/esm/namespace.js +262 -0
  48. package/dist/esm/queue.js +291 -0
  49. package/dist/esm/semantic-cache.js +223 -0
  50. package/dist/types/context-builder.d.ts +97 -0
  51. package/dist/types/context-builder.d.ts.map +1 -0
  52. package/dist/types/database.d.ts +1 -1
  53. package/dist/types/embedded/database.d.ts +1 -1
  54. package/dist/types/embedded/ffi/hnsw-bindings.d.ts +90 -0
  55. package/dist/types/embedded/ffi/hnsw-bindings.d.ts.map +1 -0
  56. package/dist/types/embedded/ffi/library-finder.d.ts.map +1 -1
  57. package/dist/types/embedded/index.d.ts +1 -0
  58. package/dist/types/embedded/index.d.ts.map +1 -1
  59. package/dist/types/errors.d.ts +57 -1
  60. package/dist/types/errors.d.ts.map +1 -1
  61. package/dist/types/index.d.ts +15 -3
  62. package/dist/types/index.d.ts.map +1 -1
  63. package/dist/types/ipc-client.d.ts +1 -1
  64. package/dist/types/memory/consolidation.d.ts +66 -0
  65. package/dist/types/memory/consolidation.d.ts.map +1 -0
  66. package/dist/types/memory/extraction.d.ts +82 -0
  67. package/dist/types/memory/extraction.d.ts.map +1 -0
  68. package/dist/types/memory/index.d.ts +10 -0
  69. package/dist/types/memory/index.d.ts.map +1 -0
  70. package/dist/types/memory/retrieval.d.ts +46 -0
  71. package/dist/types/memory/retrieval.d.ts.map +1 -0
  72. package/dist/types/memory/types.d.ts +147 -0
  73. package/dist/types/memory/types.d.ts.map +1 -0
  74. package/dist/types/namespace.d.ts +129 -0
  75. package/dist/types/namespace.d.ts.map +1 -0
  76. package/dist/types/queue.d.ts +120 -0
  77. package/dist/types/queue.d.ts.map +1 -0
  78. package/dist/types/semantic-cache.d.ts +84 -0
  79. package/dist/types/semantic-cache.d.ts.map +1 -0
  80. package/package.json +1 -1
@@ -0,0 +1,316 @@
1
+ "use strict";
2
+ /**
3
+ * HNSW Vector Index FFI Bindings
4
+ *
5
+ * Native vector search using HNSW (Hierarchical Navigable Small World) algorithm.
6
+ *
7
+ * @see sochdb-index/src/ffi.rs
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.HnswIndex = exports.HnswBindings = void 0;
44
+ const koffi = __importStar(require("koffi"));
45
+ const library_finder_1 = require("./library-finder");
46
+ // Opaque pointer type for HNSW Index
47
+ const HnswIndexPtr = koffi.pointer('HnswIndexPtr', koffi.opaque());
48
+ // Search result struct
49
+ const CSearchResult = koffi.struct('CSearchResult', {
50
+ id_lo: 'uint64',
51
+ id_hi: 'uint64',
52
+ distance: 'float'
53
+ });
54
+ class HnswBindings {
55
+ static instance;
56
+ lib;
57
+ // FFI functions
58
+ hnsw_new;
59
+ hnsw_free;
60
+ hnsw_insert;
61
+ hnsw_insert_batch;
62
+ hnsw_insert_flat;
63
+ hnsw_insert_batch_flat;
64
+ hnsw_search;
65
+ hnsw_search_fast;
66
+ hnsw_search_ultra;
67
+ hnsw_len;
68
+ hnsw_dimension;
69
+ hnsw_set_ef_search;
70
+ hnsw_get_ef_search;
71
+ hnsw_build_flat_cache;
72
+ constructor() {
73
+ const libraryPath = (0, library_finder_1.findLibrary)();
74
+ this.lib = koffi.load(libraryPath);
75
+ // Create a new HNSW index
76
+ this.hnsw_new = this.lib.func('hnsw_new', HnswIndexPtr, ['size_t', 'size_t', 'size_t']);
77
+ // Free an HNSW index
78
+ this.hnsw_free = this.lib.func('hnsw_free', 'void', [HnswIndexPtr]);
79
+ // Insert single vector
80
+ this.hnsw_insert = this.lib.func('hnsw_insert', 'int', [HnswIndexPtr, 'uint64', 'float*', 'size_t']);
81
+ // Insert batch of vectors
82
+ this.hnsw_insert_batch = this.lib.func('hnsw_insert_batch', 'int', [
83
+ HnswIndexPtr,
84
+ 'uint64*',
85
+ 'float*',
86
+ 'size_t',
87
+ 'size_t'
88
+ ]);
89
+ // Insert single flat vector (ID as u128)
90
+ this.hnsw_insert_flat = this.lib.func('hnsw_insert_flat', 'int', [
91
+ HnswIndexPtr,
92
+ 'uint64',
93
+ 'uint64',
94
+ 'float*',
95
+ 'size_t'
96
+ ]);
97
+ // Insert batch of flat vectors
98
+ this.hnsw_insert_batch_flat = this.lib.func('hnsw_insert_batch_flat', 'int', [
99
+ HnswIndexPtr,
100
+ 'uint64*',
101
+ 'uint64*',
102
+ 'float*',
103
+ 'size_t',
104
+ 'size_t'
105
+ ]);
106
+ // Search for k nearest neighbors
107
+ this.hnsw_search = this.lib.func('hnsw_search', 'size_t', [
108
+ HnswIndexPtr,
109
+ 'float*',
110
+ 'size_t',
111
+ 'size_t',
112
+ koffi.out(koffi.array(CSearchResult, 1000)),
113
+ 'size_t'
114
+ ]);
115
+ // Fast search (lower ef_search)
116
+ this.hnsw_search_fast = this.lib.func('hnsw_search_fast', 'size_t', [
117
+ HnswIndexPtr,
118
+ 'float*',
119
+ 'size_t',
120
+ 'size_t',
121
+ koffi.out(koffi.array(CSearchResult, 1000)),
122
+ 'size_t'
123
+ ]);
124
+ // Ultra fast search (minimal ef_search)
125
+ this.hnsw_search_ultra = this.lib.func('hnsw_search_ultra', 'size_t', [
126
+ HnswIndexPtr,
127
+ 'float*',
128
+ 'size_t',
129
+ 'size_t',
130
+ koffi.out(koffi.array(CSearchResult, 1000)),
131
+ 'size_t'
132
+ ]);
133
+ // Get number of vectors in index
134
+ this.hnsw_len = this.lib.func('hnsw_len', 'size_t', [HnswIndexPtr]);
135
+ // Get vector dimension
136
+ this.hnsw_dimension = this.lib.func('hnsw_dimension', 'size_t', [HnswIndexPtr]);
137
+ // Set ef_search parameter
138
+ this.hnsw_set_ef_search = this.lib.func('hnsw_set_ef_search', 'void', [HnswIndexPtr, 'size_t']);
139
+ // Get ef_search parameter
140
+ this.hnsw_get_ef_search = this.lib.func('hnsw_get_ef_search', 'size_t', [HnswIndexPtr]);
141
+ // Build flat cache for faster search
142
+ this.hnsw_build_flat_cache = this.lib.func('hnsw_build_flat_cache', 'int', [HnswIndexPtr]);
143
+ }
144
+ static getInstance() {
145
+ if (!HnswBindings.instance) {
146
+ HnswBindings.instance = new HnswBindings();
147
+ }
148
+ return HnswBindings.instance;
149
+ }
150
+ }
151
+ exports.HnswBindings = HnswBindings;
152
+ /**
153
+ * High-level HNSW Index wrapper
154
+ */
155
+ class HnswIndex {
156
+ ptr;
157
+ bindings;
158
+ _dimension;
159
+ _efSearch;
160
+ constructor(config) {
161
+ this.bindings = HnswBindings.getInstance();
162
+ this._dimension = config.dimension;
163
+ this._efSearch = config.efSearch || 100;
164
+ const maxConnections = config.maxConnections || 16;
165
+ const efConstruction = config.efConstruction || 200;
166
+ this.ptr = this.bindings.hnsw_new(config.dimension, maxConnections, efConstruction);
167
+ if (!this.ptr) {
168
+ throw new Error('Failed to create HNSW index');
169
+ }
170
+ // Set ef_search if provided
171
+ if (config.efSearch) {
172
+ this.bindings.hnsw_set_ef_search(this.ptr, config.efSearch);
173
+ }
174
+ }
175
+ /**
176
+ * Insert a single vector
177
+ */
178
+ insert(id, vector) {
179
+ if (vector.length !== this._dimension) {
180
+ throw new Error(`Vector dimension mismatch: expected ${this._dimension}, got ${vector.length}`);
181
+ }
182
+ // Convert string ID to uint64 (hash or parse)
183
+ const numericId = this.stringToId(id);
184
+ const vectorArray = new Float32Array(vector);
185
+ const result = this.bindings.hnsw_insert(this.ptr, numericId, vectorArray, vector.length);
186
+ if (result !== 0) {
187
+ throw new Error(`Failed to insert vector: error code ${result}`);
188
+ }
189
+ }
190
+ /**
191
+ * Insert multiple vectors in batch (faster)
192
+ */
193
+ insertBatch(ids, vectors) {
194
+ if (ids.length !== vectors.length) {
195
+ throw new Error('IDs and vectors length mismatch');
196
+ }
197
+ if (vectors.length === 0) {
198
+ return;
199
+ }
200
+ // Validate dimensions
201
+ for (const vector of vectors) {
202
+ if (vector.length !== this._dimension) {
203
+ throw new Error(`Vector dimension mismatch: expected ${this._dimension}, got ${vector.length}`);
204
+ }
205
+ }
206
+ // Convert IDs to numeric
207
+ const numericIds = new BigUint64Array(ids.map(id => BigInt(this.stringToId(id))));
208
+ // Flatten vectors
209
+ const flatVectors = new Float32Array(vectors.flat());
210
+ const result = this.bindings.hnsw_insert_batch(this.ptr, numericIds, flatVectors, vectors.length, this._dimension);
211
+ if (result !== 0) {
212
+ throw new Error(`Failed to insert batch: error code ${result}`);
213
+ }
214
+ }
215
+ /**
216
+ * Search for k nearest neighbors
217
+ */
218
+ search(queryVector, k, fast = false) {
219
+ if (queryVector.length !== this._dimension) {
220
+ throw new Error(`Query vector dimension mismatch: expected ${this._dimension}, got ${queryVector.length}`);
221
+ }
222
+ const query = new Float32Array(queryVector);
223
+ const resultsBuffer = new Array(k);
224
+ const searchFn = fast ? this.bindings.hnsw_search_fast : this.bindings.hnsw_search;
225
+ const numResults = searchFn(this.ptr, query, queryVector.length, k, resultsBuffer, k);
226
+ // Convert results
227
+ const results = [];
228
+ for (let i = 0; i < numResults; i++) {
229
+ const result = resultsBuffer[i];
230
+ results.push({
231
+ id: this.idToString(result.id_lo, result.id_hi),
232
+ distance: result.distance
233
+ });
234
+ }
235
+ return results;
236
+ }
237
+ /**
238
+ * Ultra-fast search with minimal ef_search
239
+ */
240
+ searchUltra(queryVector, k) {
241
+ if (queryVector.length !== this._dimension) {
242
+ throw new Error(`Query vector dimension mismatch: expected ${this._dimension}, got ${queryVector.length}`);
243
+ }
244
+ const query = new Float32Array(queryVector);
245
+ const resultsBuffer = new Array(k);
246
+ const numResults = this.bindings.hnsw_search_ultra(this.ptr, query, queryVector.length, k, resultsBuffer, k);
247
+ const results = [];
248
+ for (let i = 0; i < numResults; i++) {
249
+ const result = resultsBuffer[i];
250
+ results.push({
251
+ id: this.idToString(result.id_lo, result.id_hi),
252
+ distance: result.distance
253
+ });
254
+ }
255
+ return results;
256
+ }
257
+ /**
258
+ * Get number of vectors in index
259
+ */
260
+ get length() {
261
+ return this.bindings.hnsw_len(this.ptr);
262
+ }
263
+ /**
264
+ * Get vector dimension
265
+ */
266
+ get dimension() {
267
+ return this._dimension;
268
+ }
269
+ /**
270
+ * Set ef_search parameter (controls search quality vs speed)
271
+ */
272
+ set efSearch(value) {
273
+ this._efSearch = value;
274
+ this.bindings.hnsw_set_ef_search(this.ptr, value);
275
+ }
276
+ /**
277
+ * Get ef_search parameter
278
+ */
279
+ get efSearch() {
280
+ return this.bindings.hnsw_get_ef_search(this.ptr);
281
+ }
282
+ /**
283
+ * Build flat cache for faster searches
284
+ */
285
+ buildFlatCache() {
286
+ const result = this.bindings.hnsw_build_flat_cache(this.ptr);
287
+ if (result !== 0) {
288
+ throw new Error(`Failed to build flat cache: error code ${result}`);
289
+ }
290
+ }
291
+ /**
292
+ * Free native resources
293
+ */
294
+ close() {
295
+ if (this.ptr) {
296
+ this.bindings.hnsw_free(this.ptr);
297
+ this.ptr = null;
298
+ }
299
+ }
300
+ // Helper: Convert string ID to numeric (simple hash)
301
+ stringToId(id) {
302
+ let hash = 0;
303
+ for (let i = 0; i < id.length; i++) {
304
+ hash = ((hash << 5) - hash) + id.charCodeAt(i);
305
+ hash = hash & hash; // Convert to 32-bit integer
306
+ }
307
+ return Math.abs(hash);
308
+ }
309
+ // Helper: Convert numeric ID back to string
310
+ idToString(idLo, idHi) {
311
+ // For now, just use the low part
312
+ return idLo.toString();
313
+ }
314
+ }
315
+ exports.HnswIndex = HnswIndex;
316
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG5zdy1iaW5kaW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9lbWJlZGRlZC9mZmkvaG5zdy1iaW5kaW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCw2Q0FBK0I7QUFDL0IscURBQStDO0FBRS9DLHFDQUFxQztBQUNyQyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUVuRSx1QkFBdUI7QUFDdkIsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUU7SUFDaEQsS0FBSyxFQUFFLFFBQVE7SUFDZixLQUFLLEVBQUUsUUFBUTtJQUNmLFFBQVEsRUFBRSxPQUFPO0NBQ3BCLENBQUMsQ0FBQztBQWNILE1BQWEsWUFBWTtJQUNiLE1BQU0sQ0FBQyxRQUFRLENBQWU7SUFDOUIsR0FBRyxDQUFNO0lBRWpCLGdCQUFnQjtJQUNULFFBQVEsQ0FBTTtJQUNkLFNBQVMsQ0FBTTtJQUNmLFdBQVcsQ0FBTTtJQUNqQixpQkFBaUIsQ0FBTTtJQUN2QixnQkFBZ0IsQ0FBTTtJQUN0QixzQkFBc0IsQ0FBTTtJQUM1QixXQUFXLENBQU07SUFDakIsZ0JBQWdCLENBQU07SUFDdEIsaUJBQWlCLENBQU07SUFDdkIsUUFBUSxDQUFNO0lBQ2QsY0FBYyxDQUFNO0lBQ3BCLGtCQUFrQixDQUFNO0lBQ3hCLGtCQUFrQixDQUFNO0lBQ3hCLHFCQUFxQixDQUFNO0lBRWxDO1FBQ0ksTUFBTSxXQUFXLEdBQUcsSUFBQSw0QkFBVyxHQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRW5DLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFH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RyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsNEJBQTRCO1FBQ3BELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELDRDQUE0QztJQUNwQyxVQUFVLENBQUMsSUFBWSxFQUFFLElBQVk7UUFDekMsaUNBQWlDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDSjtBQXJORCw4QkFxTkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhOU1cgVmVjdG9yIEluZGV4IEZGSSBCaW5kaW5nc1xuICogXG4gKiBOYXRpdmUgdmVjdG9yIHNlYXJjaCB1c2luZyBITlNXIChIaWVyYXJjaGljYWwgTmF2aWdhYmxlIFNtYWxsIFdvcmxkKSBhbGdvcml0aG0uXG4gKiBcbiAqIEBzZWUgc29jaGRiLWluZGV4L3NyYy9mZmkucnNcbiAqL1xuXG5pbXBvcnQgKiBhcyBrb2ZmaSBmcm9tICdrb2ZmaSc7XG5pbXBvcnQgeyBmaW5kTGlicmFyeSB9IGZyb20gJy4vbGlicmFyeS1maW5kZXInO1xuXG4vLyBPcGFxdWUgcG9pbnRlciB0eXBlIGZvciBITlNXIEluZGV4XG5jb25zdCBIbnN3SW5kZXhQdHIgPSBrb2ZmaS5wb2ludGVyKCdIbnN3SW5kZXhQdHInLCBrb2ZmaS5vcGFxdWUoKSk7XG5cbi8vIFNlYXJjaCByZXN1bHQgc3RydWN0XG5jb25zdCBDU2VhcmNoUmVzdWx0ID0ga29mZmkuc3RydWN0KCdDU2VhcmNoUmVzdWx0Jywge1xuICAgIGlkX2xvOiAndWludDY0JyxcbiAgICBpZF9oaTogJ3VpbnQ2NCcsXG4gICAgZGlzdGFuY2U6ICdmbG9hdCdcbn0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJlc3VsdCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBkaXN0YW5jZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhuc3dDb25maWcge1xuICAgIGRpbWVuc2lvbjogbnVtYmVyO1xuICAgIG1heENvbm5lY3Rpb25zPzogbnVtYmVyO1xuICAgIGVmQ29uc3RydWN0aW9uPzogbnVtYmVyO1xuICAgIGVmU2VhcmNoPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgSG5zd0JpbmRpbmdzIHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogSG5zd0JpbmRpbmdzO1xuICAgIHByaXZhdGUgbGliOiBhbnk7XG5cbiAgICAvLyBGRkkgZnVuY3Rpb25zXG4gICAgcHVibGljIGhuc3dfbmV3OiBhbnk7XG4gICAgcHVibGljIGhuc3dfZnJlZTogYW55O1xuICAgIHB1YmxpYyBobnN3X2luc2VydDogYW55O1xuICAgIHB1YmxpYyBobnN3X2luc2VydF9iYXRjaDogYW55O1xuICAgIHB1YmxpYyBobnN3X2luc2VydF9mbGF0OiBhbnk7XG4gICAgcHVibGljIGhuc3dfaW5zZXJ0X2JhdGNoX2ZsYXQ6IGFueTtcbiAgICBwdWJsaWMgaG5zd19zZWFyY2g6IGFueTtcbiAgICBwdWJsaWMgaG5zd19zZWFyY2hfZmFzdDogYW55O1xuICAgIHB1YmxpYyBobnN3X3NlYXJjaF91bHRyYTogYW55O1xuICAgIHB1YmxpYyBobnN3X2xlbjogYW55O1xuICAgIHB1YmxpYyBobnN3X2RpbWVuc2lvbjogYW55O1xuICAgIHB1YmxpYyBobnN3X3NldF9lZl9zZWFyY2g6IGFueTtcbiAgICBwdWJsaWMgaG5zd19nZXRfZWZfc2VhcmNoOiBhbnk7XG4gICAgcHVibGljIGhuc3dfYnVpbGRfZmxhdF9jYWNoZTogYW55O1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgbGlicmFyeVBhdGggPSBmaW5kTGlicmFyeSgpO1xuICAgICAgICB0aGlzLmxpYiA9IGtvZmZpLmxvYWQobGlicmFyeVBhdGgpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBITlNXIGluZGV4XG4gICAgICAgIHRoaXMuaG5zd19uZXcgPSB0aGlzLmxpYi5mdW5jKCdobnN3X25ldycsIEhuc3dJbmRleFB0ciwgWydzaXplX3QnLCAnc2l6ZV90JywgJ3NpemVfdCddKTtcblxuICAgICAgICAvLyBGcmVlIGFuIEhOU1cgaW5kZXhcbiAgICAgICAgdGhpcy5obnN3X2ZyZWUgPSB0aGlzLmxpYi5mdW5jKCdobnN3X2ZyZWUnLCAndm9pZCcsIFtIbnN3SW5kZXhQdHJdKTtcblxuICAgICAgICAvLyBJbnNlcnQgc2luZ2xlIHZlY3RvclxuICAgICAgICB0aGlzLmhuc3dfaW5zZXJ0ID0gdGhpcy5saWIuZnVuYygnaG5zd19pbnNlcnQnLCAnaW50JywgW0huc3dJbmRleFB0ciwgJ3VpbnQ2NCcsICdmbG9hdConLCAnc2l6ZV90J10pO1xuXG4gICAgICAgIC8vIEluc2VydCBiYXRjaCBvZiB2ZWN0b3JzXG4gICAgICAgIHRoaXMuaG5zd19pbnNlcnRfYmF0Y2ggPSB0aGlzLmxpYi5mdW5jKCdobnN3X2luc2VydF9iYXRjaCcsICdpbnQnLCBbXG4gICAgICAgICAgICBIbnN3SW5kZXhQdHIsXG4gICAgICAgICAgICAndWludDY0KicsXG4gICAgICAgICAgICAnZmxvYXQqJyxcbiAgICAgICAgICAgICdzaXplX3QnLFxuICAgICAgICAgICAgJ3NpemVfdCdcbiAgICAgICAgXSk7XG5cbiAgICAgICAgLy8gSW5zZXJ0IHNpbmdsZSBmbGF0IHZlY3RvciAoSUQgYXMgdTEyOClcbiAgICAgICAgdGhpcy5obnN3X2luc2VydF9mbGF0ID0gdGhpcy5saWIuZnVuYygnaG5zd19pbnNlcnRfZmxhdCcsICdpbnQnLCBbXG4gICAgICAgICAgICBIbnN3SW5kZXhQdHIsXG4gICAgICAgICAgICAndWludDY0JyxcbiAgICAgICAgICAgICd1aW50NjQnLFxuICAgICAgICAgICAgJ2Zsb2F0KicsXG4gICAgICAgICAgICAnc2l6ZV90J1xuICAgICAgICBdKTtcblxuICAgICAgICAvLyBJbnNlcnQgYmF0Y2ggb2YgZmxhdCB2ZWN0b3JzXG4gICAgICAgIHRoaXMuaG5zd19pbnNlcnRfYmF0Y2hfZmxhdCA9IHRoaXMubGliLmZ1bmMoJ2huc3dfaW5zZXJ0X2JhdGNoX2ZsYXQnLCAnaW50JywgW1xuICAgICAgICAgICAgSG5zd0luZGV4UHRyLFxuICAgICAgICAgICAgJ3VpbnQ2NConLFxuICAgICAgICAgICAgJ3VpbnQ2NConLFxuICAgICAgICAgICAgJ2Zsb2F0KicsXG4gICAgICAgICAgICAnc2l6ZV90JyxcbiAgICAgICAgICAgICdzaXplX3QnXG4gICAgICAgIF0pO1xuXG4gICAgICAgIC8vIFNlYXJjaCBmb3IgayBuZWFyZXN0IG5laWdoYm9yc1xuICAgICAgICB0aGlzLmhuc3dfc2VhcmNoID0gdGhpcy5saWIuZnVuYygnaG5zd19zZWFyY2gnLCAnc2l6ZV90JywgW1xuICAgICAgICAgICAgSG5zd0luZGV4UHRyLFxuICAgICAgICAgICAgJ2Zsb2F0KicsXG4gICAgICAgICAgICAnc2l6ZV90JyxcbiAgICAgICAgICAgICdzaXplX3QnLFxuICAgICAgICAgICAga29mZmkub3V0KGtvZmZpLmFycmF5KENTZWFyY2hSZXN1bHQsIDEwMDApKSxcbiAgICAgICAgICAgICdzaXplX3QnXG4gICAgICAgIF0pO1xuXG4gICAgICAgIC8vIEZhc3Qgc2VhcmNoIChsb3dlciBlZl9zZWFyY2gpXG4gICAgICAgIHRoaXMuaG5zd19zZWFyY2hfZmFzdCA9IHRoaXMubGliLmZ1bmMoJ2huc3dfc2VhcmNoX2Zhc3QnLCAnc2l6ZV90JywgW1xuICAgICAgICAgICAgSG5zd0luZGV4UHRyLFxuICAgICAgICAgICAgJ2Zsb2F0KicsXG4gICAgICAgICAgICAnc2l6ZV90JyxcbiAgICAgICAgICAgICdzaXplX3QnLFxuICAgICAgICAgICAga29mZmkub3V0KGtvZmZpLmFycmF5KENTZWFyY2hSZXN1bHQsIDEwMDApKSxcbiAgICAgICAgICAgICdzaXplX3QnXG4gICAgICAgIF0pO1xuXG4gICAgICAgIC8vIFVsdHJhIGZhc3Qgc2VhcmNoIChtaW5pbWFsIGVmX3NlYXJjaClcbiAgICAgICAgdGhpcy5obnN3X3NlYXJjaF91bHRyYSA9IHRoaXMubGliLmZ1bmMoJ2huc3dfc2VhcmNoX3VsdHJhJywgJ3NpemVfdCcsIFtcbiAgICAgICAgICAgIEhuc3dJbmRleFB0cixcbiAgICAgICAgICAgICdmbG9hdConLFxuICAgICAgICAgICAgJ3NpemVfdCcsXG4gICAgICAgICAgICAnc2l6ZV90JyxcbiAgICAgICAgICAgIGtvZmZpLm91dChrb2ZmaS5hcnJheShDU2VhcmNoUmVzdWx0LCAxMDAwKSksXG4gICAgICAgICAgICAnc2l6ZV90J1xuICAgICAgICBdKTtcblxuICAgICAgICAvLyBHZXQgbnVtYmVyIG9mIHZlY3RvcnMgaW4gaW5kZXhcbiAgICAgICAgdGhpcy5obnN3X2xlbiA9IHRoaXMubGliLmZ1bmMoJ2huc3dfbGVuJywgJ3NpemVfdCcsIFtIbnN3SW5kZXhQdHJdKTtcblxuICAgICAgICAvLyBHZXQgdmVjdG9yIGRpbWVuc2lvblxuICAgICAgICB0aGlzLmhuc3dfZGltZW5zaW9uID0gdGhpcy5saWIuZnVuYygnaG5zd19kaW1lbnNpb24nLCAnc2l6ZV90JywgW0huc3dJbmRleFB0cl0pO1xuXG4gICAgICAgIC8vIFNldCBlZl9zZWFyY2ggcGFyYW1ldGVyXG4gICAgICAgIHRoaXMuaG5zd19zZXRfZWZfc2VhcmNoID0gdGhpcy5saWIuZnVuYygnaG5zd19zZXRfZWZfc2VhcmNoJywgJ3ZvaWQnLCBbSG5zd0luZGV4UHRyLCAnc2l6ZV90J10pO1xuXG4gICAgICAgIC8vIEdldCBlZl9zZWFyY2ggcGFyYW1ldGVyXG4gICAgICAgIHRoaXMuaG5zd19nZXRfZWZfc2VhcmNoID0gdGhpcy5saWIuZnVuYygnaG5zd19nZXRfZWZfc2VhcmNoJywgJ3NpemVfdCcsIFtIbnN3SW5kZXhQdHJdKTtcblxuICAgICAgICAvLyBCdWlsZCBmbGF0IGNhY2hlIGZvciBmYXN0ZXIgc2VhcmNoXG4gICAgICAgIHRoaXMuaG5zd19idWlsZF9mbGF0X2NhY2hlID0gdGhpcy5saWIuZnVuYygnaG5zd19idWlsZF9mbGF0X2NhY2hlJywgJ2ludCcsIFtIbnN3SW5kZXhQdHJdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IEhuc3dCaW5kaW5ncyB7XG4gICAgICAgIGlmICghSG5zd0JpbmRpbmdzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBIbnN3QmluZGluZ3MuaW5zdGFuY2UgPSBuZXcgSG5zd0JpbmRpbmdzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEhuc3dCaW5kaW5ncy5pbnN0YW5jZTtcbiAgICB9XG59XG5cbi8qKlxuICogSGlnaC1sZXZlbCBITlNXIEluZGV4IHdyYXBwZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEhuc3dJbmRleCB7XG4gICAgcHJpdmF0ZSBwdHI6IGFueTtcbiAgICBwcml2YXRlIGJpbmRpbmdzOiBIbnN3QmluZGluZ3M7XG4gICAgcHJpdmF0ZSBfZGltZW5zaW9uOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfZWZTZWFyY2g6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogSG5zd0NvbmZpZykge1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gSG5zd0JpbmRpbmdzLmdldEluc3RhbmNlKCk7XG4gICAgICAgIHRoaXMuX2RpbWVuc2lvbiA9IGNvbmZpZy5kaW1lbnNpb247XG4gICAgICAgIHRoaXMuX2VmU2VhcmNoID0gY29uZmlnLmVmU2VhcmNoIHx8IDEwMDtcblxuICAgICAgICBjb25zdCBtYXhDb25uZWN0aW9ucyA9IGNvbmZpZy5tYXhDb25uZWN0aW9ucyB8fCAxNjtcbiAgICAgICAgY29uc3QgZWZDb25zdHJ1Y3Rpb24gPSBjb25maWcuZWZDb25zdHJ1Y3Rpb24gfHwgMjAwO1xuXG4gICAgICAgIHRoaXMucHRyID0gdGhpcy5iaW5kaW5ncy5obnN3X25ldyhjb25maWcuZGltZW5zaW9uLCBtYXhDb25uZWN0aW9ucywgZWZDb25zdHJ1Y3Rpb24pO1xuICAgICAgICBpZiAoIXRoaXMucHRyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgSE5TVyBpbmRleCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGVmX3NlYXJjaCBpZiBwcm92aWRlZFxuICAgICAgICBpZiAoY29uZmlnLmVmU2VhcmNoKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzLmhuc3dfc2V0X2VmX3NlYXJjaCh0aGlzLnB0ciwgY29uZmlnLmVmU2VhcmNoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBhIHNpbmdsZSB2ZWN0b3JcbiAgICAgKi9cbiAgICBpbnNlcnQoaWQ6IHN0cmluZywgdmVjdG9yOiBudW1iZXJbXSk6IHZvaWQge1xuICAgICAgICBpZiAodmVjdG9yLmxlbmd0aCAhPT0gdGhpcy5fZGltZW5zaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZlY3RvciBkaW1lbnNpb24gbWlzbWF0Y2g6IGV4cGVjdGVkICR7dGhpcy5fZGltZW5zaW9ufSwgZ290ICR7dmVjdG9yLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIElEIHRvIHVpbnQ2NCAoaGFzaCBvciBwYXJzZSlcbiAgICAgICAgY29uc3QgbnVtZXJpY0lkID0gdGhpcy5zdHJpbmdUb0lkKGlkKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHZlY3RvckFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSh2ZWN0b3IpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJpbmRpbmdzLmhuc3dfaW5zZXJ0KHRoaXMucHRyLCBudW1lcmljSWQsIHZlY3RvckFycmF5LCB2ZWN0b3IubGVuZ3RoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGluc2VydCB2ZWN0b3I6IGVycm9yIGNvZGUgJHtyZXN1bHR9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgbXVsdGlwbGUgdmVjdG9ycyBpbiBiYXRjaCAoZmFzdGVyKVxuICAgICAqL1xuICAgIGluc2VydEJhdGNoKGlkczogc3RyaW5nW10sIHZlY3RvcnM6IG51bWJlcltdW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKGlkcy5sZW5ndGggIT09IHZlY3RvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lEcyBhbmQgdmVjdG9ycyBsZW5ndGggbWlzbWF0Y2gnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2ZWN0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZGltZW5zaW9uc1xuICAgICAgICBmb3IgKGNvbnN0IHZlY3RvciBvZiB2ZWN0b3JzKSB7XG4gICAgICAgICAgICBpZiAodmVjdG9yLmxlbmd0aCAhPT0gdGhpcy5fZGltZW5zaW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWZWN0b3IgZGltZW5zaW9uIG1pc21hdGNoOiBleHBlY3RlZCAke3RoaXMuX2RpbWVuc2lvbn0sIGdvdCAke3ZlY3Rvci5sZW5ndGh9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IElEcyB0byBudW1lcmljXG4gICAgICAgIGNvbnN0IG51bWVyaWNJZHMgPSBuZXcgQmlnVWludDY0QXJyYXkoaWRzLm1hcChpZCA9PiBCaWdJbnQodGhpcy5zdHJpbmdUb0lkKGlkKSkpKTtcblxuICAgICAgICAvLyBGbGF0dGVuIHZlY3RvcnNcbiAgICAgICAgY29uc3QgZmxhdFZlY3RvcnMgPSBuZXcgRmxvYXQzMkFycmF5KHZlY3RvcnMuZmxhdCgpKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJpbmRpbmdzLmhuc3dfaW5zZXJ0X2JhdGNoKFxuICAgICAgICAgICAgdGhpcy5wdHIsXG4gICAgICAgICAgICBudW1lcmljSWRzLFxuICAgICAgICAgICAgZmxhdFZlY3RvcnMsXG4gICAgICAgICAgICB2ZWN0b3JzLmxlbmd0aCxcbiAgICAgICAgICAgIHRoaXMuX2RpbWVuc2lvblxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGluc2VydCBiYXRjaDogZXJyb3IgY29kZSAke3Jlc3VsdH1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCBmb3IgayBuZWFyZXN0IG5laWdoYm9yc1xuICAgICAqL1xuICAgIHNlYXJjaChxdWVyeVZlY3RvcjogbnVtYmVyW10sIGs6IG51bWJlciwgZmFzdDogYm9vbGVhbiA9IGZhbHNlKTogU2VhcmNoUmVzdWx0W10ge1xuICAgICAgICBpZiAocXVlcnlWZWN0b3IubGVuZ3RoICE9PSB0aGlzLl9kaW1lbnNpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVlcnkgdmVjdG9yIGRpbWVuc2lvbiBtaXNtYXRjaDogZXhwZWN0ZWQgJHt0aGlzLl9kaW1lbnNpb259LCBnb3QgJHtxdWVyeVZlY3Rvci5sZW5ndGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBGbG9hdDMyQXJyYXkocXVlcnlWZWN0b3IpO1xuICAgICAgICBjb25zdCByZXN1bHRzQnVmZmVyID0gbmV3IEFycmF5KGspO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaEZuID0gZmFzdCA/IHRoaXMuYmluZGluZ3MuaG5zd19zZWFyY2hfZmFzdCA6IHRoaXMuYmluZGluZ3MuaG5zd19zZWFyY2g7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBudW1SZXN1bHRzID0gc2VhcmNoRm4oXG4gICAgICAgICAgICB0aGlzLnB0cixcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgcXVlcnlWZWN0b3IubGVuZ3RoLFxuICAgICAgICAgICAgayxcbiAgICAgICAgICAgIHJlc3VsdHNCdWZmZXIsXG4gICAgICAgICAgICBrXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQ29udmVydCByZXN1bHRzXG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IFNlYXJjaFJlc3VsdFtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUmVzdWx0czsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzQnVmZmVyW2ldO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5pZFRvU3RyaW5nKHJlc3VsdC5pZF9sbywgcmVzdWx0LmlkX2hpKSxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTogcmVzdWx0LmRpc3RhbmNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVsdHJhLWZhc3Qgc2VhcmNoIHdpdGggbWluaW1hbCBlZl9zZWFyY2hcbiAgICAgKi9cbiAgICBzZWFyY2hVbHRyYShxdWVyeVZlY3RvcjogbnVtYmVyW10sIGs6IG51bWJlcik6IFNlYXJjaFJlc3VsdFtdIHtcbiAgICAgICAgaWYgKHF1ZXJ5VmVjdG9yLmxlbmd0aCAhPT0gdGhpcy5fZGltZW5zaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1ZXJ5IHZlY3RvciBkaW1lbnNpb24gbWlzbWF0Y2g6IGV4cGVjdGVkICR7dGhpcy5fZGltZW5zaW9ufSwgZ290ICR7cXVlcnlWZWN0b3IubGVuZ3RofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnkgPSBuZXcgRmxvYXQzMkFycmF5KHF1ZXJ5VmVjdG9yKTtcbiAgICAgICAgY29uc3QgcmVzdWx0c0J1ZmZlciA9IG5ldyBBcnJheShrKTtcblxuICAgICAgICBjb25zdCBudW1SZXN1bHRzID0gdGhpcy5iaW5kaW5ncy5obnN3X3NlYXJjaF91bHRyYShcbiAgICAgICAgICAgIHRoaXMucHRyLFxuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICBxdWVyeVZlY3Rvci5sZW5ndGgsXG4gICAgICAgICAgICBrLFxuICAgICAgICAgICAgcmVzdWx0c0J1ZmZlcixcbiAgICAgICAgICAgIGtcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCByZXN1bHRzOiBTZWFyY2hSZXN1bHRbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVJlc3VsdHM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0c0J1ZmZlcltpXTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWRUb1N0cmluZyhyZXN1bHQuaWRfbG8sIHJlc3VsdC5pZF9oaSksXG4gICAgICAgICAgICAgICAgZGlzdGFuY2U6IHJlc3VsdC5kaXN0YW5jZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbnVtYmVyIG9mIHZlY3RvcnMgaW4gaW5kZXhcbiAgICAgKi9cbiAgICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdzLmhuc3dfbGVuKHRoaXMucHRyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdmVjdG9yIGRpbWVuc2lvblxuICAgICAqL1xuICAgIGdldCBkaW1lbnNpb24oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpbWVuc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZWZfc2VhcmNoIHBhcmFtZXRlciAoY29udHJvbHMgc2VhcmNoIHF1YWxpdHkgdnMgc3BlZWQpXG4gICAgICovXG4gICAgc2V0IGVmU2VhcmNoKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fZWZTZWFyY2ggPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5iaW5kaW5ncy5obnN3X3NldF9lZl9zZWFyY2godGhpcy5wdHIsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZWZfc2VhcmNoIHBhcmFtZXRlclxuICAgICAqL1xuICAgIGdldCBlZlNlYXJjaCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kaW5ncy5obnN3X2dldF9lZl9zZWFyY2godGhpcy5wdHIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGZsYXQgY2FjaGUgZm9yIGZhc3RlciBzZWFyY2hlc1xuICAgICAqL1xuICAgIGJ1aWxkRmxhdENhY2hlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJpbmRpbmdzLmhuc3dfYnVpbGRfZmxhdF9jYWNoZSh0aGlzLnB0cik7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGJ1aWxkIGZsYXQgY2FjaGU6IGVycm9yIGNvZGUgJHtyZXN1bHR9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGcmVlIG5hdGl2ZSByZXNvdXJjZXNcbiAgICAgKi9cbiAgICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucHRyKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzLmhuc3dfZnJlZSh0aGlzLnB0cik7XG4gICAgICAgICAgICB0aGlzLnB0ciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIZWxwZXI6IENvbnZlcnQgc3RyaW5nIElEIHRvIG51bWVyaWMgKHNpbXBsZSBoYXNoKVxuICAgIHByaXZhdGUgc3RyaW5nVG9JZChpZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGhhc2ggPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBpZC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaGFzaCA9IGhhc2ggJiBoYXNoOyAvLyBDb252ZXJ0IHRvIDMyLWJpdCBpbnRlZ2VyXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGhhc2gpO1xuICAgIH1cblxuICAgIC8vIEhlbHBlcjogQ29udmVydCBudW1lcmljIElEIGJhY2sgdG8gc3RyaW5nXG4gICAgcHJpdmF0ZSBpZFRvU3RyaW5nKGlkTG86IGJpZ2ludCwgaWRIaTogYmlnaW50KTogc3RyaW5nIHtcbiAgICAgICAgLy8gRm9yIG5vdywganVzdCB1c2UgdGhlIGxvdyBwYXJ0XG4gICAgICAgIHJldHVybiBpZExvLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuIl19
@@ -111,6 +111,12 @@ function findLibrary() {
111
111
  path.resolve(process.cwd(), '_bin', target, filename),
112
112
  path.resolve(process.cwd(), 'target', 'release', filename),
113
113
  path.resolve(process.cwd(), '..', 'target', 'release', filename),
114
+ // 4. System-wide installation paths (no manual setup needed)
115
+ '/usr/local/lib/' + filename,
116
+ '/usr/lib/' + filename,
117
+ '/opt/homebrew/lib/' + filename, // macOS Apple Silicon
118
+ '/opt/local/lib/' + filename, // MacPorts
119
+ path.join(os.homedir(), '.sochdb', 'lib', filename), // User install
114
120
  ];
115
121
  // Search for library
116
122
  for (const searchPath of searchPaths) {
@@ -129,7 +135,8 @@ function findLibrary() {
129
135
  }
130
136
  }
131
137
  throw new Error(`Could not find SochDB native library (${filename}). ` +
132
- `Searched in: ${searchPaths.join(', ')}. ` +
133
- `Set SOCHDB_LIB_PATH environment variable or build the library.`);
138
+ `Searched in package paths, development builds, and system locations. ` +
139
+ `Install with: brew install sochdb (macOS) or download from https://github.com/sochdb/sochdb/releases ` +
140
+ `Alternatively, set SOCHDB_LIB_PATH environment variable to library path.`);
134
141
  }
135
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicmFyeS1maW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW1iZWRkZWQvZmZpL2xpYnJhcnktZmluZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrREgsa0NBeURDO0FBekdELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBRXpCOztHQUVHO0FBQ0gsU0FBUyxlQUFlO0lBQ3BCLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFdkIsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDeEIsT0FBTyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUM7SUFDN0UsQ0FBQztTQUFNLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDO0lBQ3ZGLENBQUM7U0FBTSxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUM5QixPQUFPLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQztJQUM5RSxDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxrQkFBa0I7SUFDdkIsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRS9CLElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3hCLE9BQU8seUJBQXlCLENBQUM7SUFDckMsQ0FBQztTQUFNLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQzlCLE9BQU8sc0JBQXNCLENBQUM7SUFDbEMsQ0FBQztTQUFNLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQzlCLE9BQU8sb0JBQW9CLENBQUM7SUFDaEMsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsV0FBVztJQUN2QixNQUFNLE1BQU0sR0FBRyxlQUFlLEVBQUUsQ0FBQztJQUNqQyxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsRUFBRSxDQUFDO0lBRXRDLG1DQUFtQztJQUNuQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDOUIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFDNUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxPQUFPLENBQUM7UUFDbkIsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBYTtRQUMxQixvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUM7UUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQztRQUMxRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUM7UUFFcEQsMkNBQTJDO1FBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDO1FBQ25FLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUM7UUFDL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQztRQUU3RCxxREFBcUQ7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQztRQUVyRixpQkFBaUI7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUM7UUFDckQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUM7UUFDMUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDO0tBQ25FLENBQUM7SUFFRixxQkFBcUI7SUFDckIsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM1QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNMLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWU7UUFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7UUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUVsRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQ1gseUNBQXlDLFFBQVEsS0FBSztRQUN0RCxnQkFBZ0IsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtRQUMxQyxnRUFBZ0UsQ0FDbkUsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZGSSBMaWJyYXJ5IEZpbmRlclxuICogXG4gKiBMb2NhdGVzIHRoZSBTb2NoREIgbmF0aXZlIGxpYnJhcnkgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLlxuICogU2VhcmNoIG9yZGVyIG1hdGNoZXMgUHl0aG9uIFNESyBmb3IgY29uc2lzdGVuY3kuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcblxuLyoqXG4gKiBHZXQgdGhlIFJ1c3QgdGFyZ2V0IHRyaXBsZSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm1cbiAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0VHJpcGxlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBvcy5wbGF0Zm9ybSgpO1xuICAgIGNvbnN0IGFyY2ggPSBvcy5hcmNoKCk7XG5cbiAgICBpZiAocGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIHJldHVybiBhcmNoID09PSAnYXJtNjQnID8gJ2FhcmNoNjQtYXBwbGUtZGFyd2luJyA6ICd4ODZfNjQtYXBwbGUtZGFyd2luJztcbiAgICB9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnbGludXgnKSB7XG4gICAgICAgIHJldHVybiBhcmNoID09PSAnYXJtNjQnID8gJ2FhcmNoNjQtdW5rbm93bi1saW51eC1nbnUnIDogJ3g4Nl82NC11bmtub3duLWxpbnV4LWdudSc7XG4gICAgfSBlbHNlIGlmIChwbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgICByZXR1cm4gYXJjaCA9PT0gJ3g2NCcgPyAneDg2XzY0LXBjLXdpbmRvd3MtbXN2YycgOiAnaTY4Ni1wYy13aW5kb3dzLW1zdmMnO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcGxhdGZvcm06ICR7cGxhdGZvcm19LyR7YXJjaH1gKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGxpYnJhcnkgZmlsZW5hbWUgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtXG4gKi9cbmZ1bmN0aW9uIGdldExpYnJhcnlGaWxlbmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gb3MucGxhdGZvcm0oKTtcblxuICAgIGlmIChwbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgcmV0dXJuICdsaWJzb2NoZGJfc3RvcmFnZS5keWxpYic7XG4gICAgfSBlbHNlIGlmIChwbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xuICAgICAgICByZXR1cm4gJ2xpYnNvY2hkYl9zdG9yYWdlLnNvJztcbiAgICB9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICAgIHJldHVybiAnc29jaGRiX3N0b3JhZ2UuZGxsJztcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHBsYXRmb3JtOiAke3BsYXRmb3JtfWApO1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIFNvY2hEQiBuYXRpdmUgbGlicmFyeVxuICogXG4gKiBTZWFyY2ggb3JkZXI6XG4gKiAxLiBTT0NIREJfTElCX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGVcbiAqIDIuIEJ1bmRsZWQgbGlicmFyeSBpbiBwYWNrYWdlIChfYmluL3t0YXJnZXR9LylcbiAqIDMuIERldmVsb3BtZW50IGJ1aWxkICguLi90YXJnZXQvcmVsZWFzZSwgLi4vdGFyZ2V0L2RlYnVnKVxuICogNC4gU3lzdGVtIHBhdGhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGlicmFyeSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldFRyaXBsZSgpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZ2V0TGlicmFyeUZpbGVuYW1lKCk7XG5cbiAgICAvLyAxLiBFbnZpcm9ubWVudCB2YXJpYWJsZSBvdmVycmlkZVxuICAgIGlmIChwcm9jZXNzLmVudi5TT0NIREJfTElCX1BBVEgpIHtcbiAgICAgICAgY29uc3QgZW52UGF0aCA9IHByb2Nlc3MuZW52LlNPQ0hEQl9MSUJfUEFUSDtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnZQYXRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoUGF0aHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAvLyAyLiBCdW5kbGVkIGluIHBhY2thZ2UgKGZyb20gZGlzdC9janMgb3IgZGlzdC9lc20pXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICdfYmluJywgdGFyZ2V0LCBmaWxlbmFtZSksXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICdfYmluJywgdGFyZ2V0LCBmaWxlbmFtZSksXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdfYmluJywgdGFyZ2V0LCBmaWxlbmFtZSksXG5cbiAgICAgICAgLy8gMy4gRGV2ZWxvcG1lbnQgcGF0aHMgLSBmcm9tIHByb2plY3Qgcm9vdFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAndGFyZ2V0JywgJ3JlbGVhc2UnLCBmaWxlbmFtZSksXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICd0YXJnZXQnLCAnZGVidWcnLCBmaWxlbmFtZSksXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICd0YXJnZXQnLCAncmVsZWFzZScsIGZpbGVuYW1lKSxcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ3RhcmdldCcsICdkZWJ1ZycsIGZpbGVuYW1lKSxcblxuICAgICAgICAvLyBGcm9tIHNvY2hkYiBtb25vcmVwbyAoLi4vLi4vc29jaGRiL3RhcmdldC9yZWxlYXNlKVxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAnLi4nLCAnc29jaGRiJywgJ3RhcmdldCcsICdyZWxlYXNlJywgZmlsZW5hbWUpLFxuXG4gICAgICAgIC8vIEFic29sdXRlIHBhdGhzXG4gICAgICAgIHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnX2JpbicsIHRhcmdldCwgZmlsZW5hbWUpLFxuICAgICAgICBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3RhcmdldCcsICdyZWxlYXNlJywgZmlsZW5hbWUpLFxuICAgICAgICBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy4uJywgJ3RhcmdldCcsICdyZWxlYXNlJywgZmlsZW5hbWUpLFxuICAgIF07XG5cbiAgICAvLyBTZWFyY2ggZm9yIGxpYnJhcnlcbiAgICBmb3IgKGNvbnN0IHNlYXJjaFBhdGggb2Ygc2VhcmNoUGF0aHMpIHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoc2VhcmNoUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUoc2VhcmNoUGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LiBUcnkgc3lzdGVtIHBhdGhzIChMRF9MSUJSQVJZX1BBVEgsIERZTERfTElCUkFSWV9QQVRILCBQQVRIKVxuICAgIGNvbnN0IHN5c3RlbVBhdGhzID0gKHByb2Nlc3MuZW52LkxEX0xJQlJBUllfUEFUSCB8fFxuICAgICAgICBwcm9jZXNzLmVudi5EWUxEX0xJQlJBUllfUEFUSCB8fFxuICAgICAgICBwcm9jZXNzLmVudi5QQVRIIHx8ICcnKS5zcGxpdChwYXRoLmRlbGltaXRlcik7XG5cbiAgICBmb3IgKGNvbnN0IGRpciBvZiBzeXN0ZW1QYXRocykge1xuICAgICAgICBjb25zdCBsaWJQYXRoID0gcGF0aC5qb2luKGRpciwgZmlsZW5hbWUpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhsaWJQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZShsaWJQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIFNvY2hEQiBuYXRpdmUgbGlicmFyeSAoJHtmaWxlbmFtZX0pLiBgICtcbiAgICAgICAgYFNlYXJjaGVkIGluOiAke3NlYXJjaFBhdGhzLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgYFNldCBTT0NIREJfTElCX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnVpbGQgdGhlIGxpYnJhcnkuYFxuICAgICk7XG59XG4iXX0=
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicmFyeS1maW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW1iZWRkZWQvZmZpL2xpYnJhcnktZmluZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrREgsa0NBaUVDO0FBakhELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBRXpCOztHQUVHO0FBQ0gsU0FBUyxlQUFlO0lBQ3BCLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFdkIsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDeEIsT0FBTyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUM7SUFDN0UsQ0FBQztTQUFNLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDO0lBQ3ZGLENBQUM7U0FBTSxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUM5QixPQUFPLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQztJQUM5RSxDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxrQkFBa0I7SUFDdkIsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRS9CLElBQUksUUFBUSxLQUFLLFFBQVEsRUFB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LEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRyxlQUFlO0tBQ3hFLENBQUM7SUFFRixxQkFBcUI7SUFDckIsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM1QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNMLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWU7UUFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7UUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUVsRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQ1gseUNBQXlDLFFBQVEsS0FBSztRQUN0RCx1RUFBdUU7UUFDdkUsdUdBQXVHO1FBQ3ZHLDBFQUEwRSxDQUM3RSxDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRkZJIExpYnJhcnkgRmluZGVyXG4gKiBcbiAqIExvY2F0ZXMgdGhlIFNvY2hEQiBuYXRpdmUgbGlicmFyeSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uXG4gKiBTZWFyY2ggb3JkZXIgbWF0Y2hlcyBQeXRob24gU0RLIGZvciBjb25zaXN0ZW5jeS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuXG4vKipcbiAqIEdldCB0aGUgUnVzdCB0YXJnZXQgdHJpcGxlIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybVxuICovXG5mdW5jdGlvbiBnZXRUYXJnZXRUcmlwbGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IG9zLnBsYXRmb3JtKCk7XG4gICAgY29uc3QgYXJjaCA9IG9zLmFyY2goKTtcblxuICAgIGlmIChwbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgcmV0dXJuIGFyY2ggPT09ICdhcm02NCcgPyAnYWFyY2g2NC1hcHBsZS1kYXJ3aW4nIDogJ3g4Nl82NC1hcHBsZS1kYXJ3aW4nO1xuICAgIH0gZWxzZSBpZiAocGxhdGZvcm0gPT09ICdsaW51eCcpIHtcbiAgICAgICAgcmV0dXJuIGFyY2ggPT09ICdhcm02NCcgPyAnYWFyY2g2NC11bmtub3duLWxpbnV4LWdudScgOiAneDg2XzY0LXVua25vd24tbGludXgtZ251JztcbiAgICB9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICAgIHJldHVybiBhcmNoID09PSAneDY0JyA/ICd4ODZfNjQtcGMtd2luZG93cy1tc3ZjJyA6ICdpNjg2LXBjLXdpbmRvd3MtbXN2Yyc7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBwbGF0Zm9ybTogJHtwbGF0Zm9ybX0vJHthcmNofWApO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbGlicmFyeSBmaWxlbmFtZSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm1cbiAqL1xuZnVuY3Rpb24gZ2V0TGlicmFyeUZpbGVuYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBvcy5wbGF0Zm9ybSgpO1xuXG4gICAgaWYgKHBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgICAgICByZXR1cm4gJ2xpYnNvY2hkYl9zdG9yYWdlLmR5bGliJztcbiAgICB9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnbGludXgnKSB7XG4gICAgICAgIHJldHVybiAnbGlic29jaGRiX3N0b3JhZ2Uuc28nO1xuICAgIH0gZWxzZSBpZiAocGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgcmV0dXJuICdzb2NoZGJfc3RvcmFnZS5kbGwnO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcGxhdGZvcm06ICR7cGxhdGZvcm19YCk7XG59XG5cbi8qKlxuICogRmluZCB0aGUgU29jaERCIG5hdGl2ZSBsaWJyYXJ5XG4gKiBcbiAqIFNlYXJjaCBvcmRlcjpcbiAqIDEuIFNPQ0hEQl9MSUJfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICogMi4gQnVuZGxlZCBsaWJyYXJ5IGluIHBhY2thZ2UgKF9iaW4ve3RhcmdldH0vKVxuICogMy4gRGV2ZWxvcG1lbnQgYnVpbGQgKC4uL3RhcmdldC9yZWxlYXNlLCAuLi90YXJnZXQvZGVidWcpXG4gKiA0LiBTeXN0ZW0gcGF0aHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMaWJyYXJ5KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0VHJpcGxlKCk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBnZXRMaWJyYXJ5RmlsZW5hbWUoKTtcblxuICAgIC8vIDEuIEVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJyaWRlXG4gICAgaWYgKHByb2Nlc3MuZW52LlNPQ0hEQl9MSUJfUEFUSCkge1xuICAgICAgICBjb25zdCBlbnZQYXRoID0gcHJvY2Vzcy5lbnYuU09DSERCX0xJQl9QQVRIO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVudlBhdGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hQYXRoczogc3RyaW5nW10gPSBbXG4gICAgICAgIC8vIDIuIEJ1bmRsZWQgaW4gcGFja2FnZSAoZnJvbSBkaXN0L2NqcyBvciBkaXN0L2VzbSlcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJ19iaW4nLCB0YXJnZXQsIGZpbGVuYW1lKSxcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ19iaW4nLCB0YXJnZXQsIGZpbGVuYW1lKSxcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ19iaW4nLCB0YXJnZXQsIGZpbGVuYW1lKSxcblxuICAgICAgICAvLyAzLiBEZXZlbG9wbWVudCBwYXRocyAtIGZyb20gcHJvamVjdCByb290XG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICd0YXJnZXQnLCAncmVsZWFzZScsIGZpbGVuYW1lKSxcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJ3RhcmdldCcsICdkZWJ1ZycsIGZpbGVuYW1lKSxcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ3RhcmdldCcsICdyZWxlYXNlJywgZmlsZW5hbWUpLFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAndGFyZ2V0JywgJ2RlYnVnJywgZmlsZW5hbWUpLFxuXG4gICAgICAgIC8vIEZyb20gc29jaGRiIG1vbm9yZXBvICguLi8uLi9zb2NoZGIvdGFyZ2V0L3JlbGVhc2UpXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICcuLicsICdzb2NoZGInLCAndGFyZ2V0JywgJ3JlbGVhc2UnLCBmaWxlbmFtZSksXG5cbiAgICAgICAgLy8gQWJzb2x1dGUgcGF0aHNcbiAgICAgICAgcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICdfYmluJywgdGFyZ2V0LCBmaWxlbmFtZSksXG4gICAgICAgIHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAndGFyZ2V0JywgJ3JlbGVhc2UnLCBmaWxlbmFtZSksXG4gICAgICAgIHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLi4nLCAndGFyZ2V0JywgJ3JlbGVhc2UnLCBmaWxlbmFtZSksXG5cbiAgICAgICAgLy8gNC4gU3lzdGVtLXdpZGUgaW5zdGFsbGF0aW9uIHBhdGhzIChubyBtYW51YWwgc2V0dXAgbmVlZGVkKVxuICAgICAgICAnL3Vzci9sb2NhbC9saWIvJyArIGZpbGVuYW1lLFxuICAgICAgICAnL3Vzci9saWIvJyArIGZpbGVuYW1lLFxuICAgICAgICAnL29wdC9ob21lYnJldy9saWIvJyArIGZpbGVuYW1lLCAgLy8gbWFjT1MgQXBwbGUgU2lsaWNvblxuICAgICAgICAnL29wdC9sb2NhbC9saWIvJyArIGZpbGVuYW1lLCAgICAgIC8vIE1hY1BvcnRzXG4gICAgICAgIHBhdGguam9pbihvcy5ob21lZGlyKCksICcuc29jaGRiJywgJ2xpYicsIGZpbGVuYW1lKSwgIC8vIFVzZXIgaW5zdGFsbFxuICAgIF07XG5cbiAgICAvLyBTZWFyY2ggZm9yIGxpYnJhcnlcbiAgICBmb3IgKGNvbnN0IHNlYXJjaFBhdGggb2Ygc2VhcmNoUGF0aHMpIHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoc2VhcmNoUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoLnJlc29sdmUoc2VhcmNoUGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LiBUcnkgc3lzdGVtIHBhdGhzIChMRF9MSUJSQVJZX1BBVEgsIERZTERfTElCUkFSWV9QQVRILCBQQVRIKVxuICAgIGNvbnN0IHN5c3RlbVBhdGhzID0gKHByb2Nlc3MuZW52LkxEX0xJQlJBUllfUEFUSCB8fFxuICAgICAgICBwcm9jZXNzLmVudi5EWUxEX0xJQlJBUllfUEFUSCB8fFxuICAgICAgICBwcm9jZXNzLmVudi5QQVRIIHx8ICcnKS5zcGxpdChwYXRoLmRlbGltaXRlcik7XG5cbiAgICBmb3IgKGNvbnN0IGRpciBvZiBzeXN0ZW1QYXRocykge1xuICAgICAgICBjb25zdCBsaWJQYXRoID0gcGF0aC5qb2luKGRpciwgZmlsZW5hbWUpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhsaWJQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZShsaWJQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIFNvY2hEQiBuYXRpdmUgbGlicmFyeSAoJHtmaWxlbmFtZX0pLiBgICtcbiAgICAgICAgYFNlYXJjaGVkIGluIHBhY2thZ2UgcGF0aHMsIGRldmVsb3BtZW50IGJ1aWxkcywgYW5kIHN5c3RlbSBsb2NhdGlvbnMuIGAgK1xuICAgICAgICBgSW5zdGFsbCB3aXRoOiBicmV3IGluc3RhbGwgc29jaGRiIChtYWNPUykgb3IgZG93bmxvYWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc29jaGRiL3NvY2hkYi9yZWxlYXNlcyBgICtcbiAgICAgICAgYEFsdGVybmF0aXZlbHksIHNldCBTT0NIREJfTElCX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gbGlicmFyeSBwYXRoLmBcbiAgICApO1xufVxuIl19
@@ -6,9 +6,12 @@
6
6
  * No server required.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.EmbeddedTransaction = exports.EmbeddedDatabase = void 0;
9
+ exports.HnswBindings = exports.HnswIndex = exports.EmbeddedTransaction = exports.EmbeddedDatabase = void 0;
10
10
  var database_1 = require("./database");
11
11
  Object.defineProperty(exports, "EmbeddedDatabase", { enumerable: true, get: function () { return database_1.EmbeddedDatabase; } });
12
12
  var transaction_1 = require("./transaction");
13
13
  Object.defineProperty(exports, "EmbeddedTransaction", { enumerable: true, get: function () { return transaction_1.EmbeddedTransaction; } });
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCx1Q0FBc0U7QUFBN0QsNEdBQUEsZ0JBQWdCLE9BQUE7QUFDekIsNkNBQW9EO0FBQTNDLGtIQUFBLG1CQUFtQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbWJlZGRlZCBNb2RlIC0gRkZJIFN1cHBvcnRcbiAqIFxuICogRGlyZWN0IEZGSSBiaW5kaW5ncyB0byBTb2NoREIgbmF0aXZlIGxpYnJhcnkuXG4gKiBObyBzZXJ2ZXIgcmVxdWlyZWQuXG4gKi9cblxuZXhwb3J0IHsgRW1iZWRkZWREYXRhYmFzZSwgRW1iZWRkZWREYXRhYmFzZUNvbmZpZyB9IGZyb20gJy4vZGF0YWJhc2UnO1xuZXhwb3J0IHsgRW1iZWRkZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuIl19
14
+ var hnsw_bindings_1 = require("./ffi/hnsw-bindings");
15
+ Object.defineProperty(exports, "HnswIndex", { enumerable: true, get: function () { return hnsw_bindings_1.HnswIndex; } });
16
+ Object.defineProperty(exports, "HnswBindings", { enumerable: true, get: function () { return hnsw_bindings_1.HnswBindings; } });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCx1Q0FBc0U7QUFBN0QsNEdBQUEsZ0JBQWdCLE9BQUE7QUFDekIsNkNBQW9EO0FBQTNDLGtIQUFBLG1CQUFtQixPQUFBO0FBQzVCLHFEQUF3RjtBQUEvRSwwR0FBQSxTQUFTLE9BQUE7QUFBYyw2R0FBQSxZQUFZLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVtYmVkZGVkIE1vZGUgLSBGRkkgU3VwcG9ydFxuICogXG4gKiBEaXJlY3QgRkZJIGJpbmRpbmdzIHRvIFNvY2hEQiBuYXRpdmUgbGlicmFyeS5cbiAqIE5vIHNlcnZlciByZXF1aXJlZC5cbiAqL1xuXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlLCBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIH0gZnJvbSAnLi9kYXRhYmFzZSc7XG5leHBvcnQgeyBFbWJlZGRlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5leHBvcnQgeyBIbnN3SW5kZXgsIEhuc3dDb25maWcsIEhuc3dCaW5kaW5ncywgU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi9mZmkvaG5zdy1iaW5kaW5ncyc7XG4iXX0=
@@ -5,7 +5,7 @@
5
5
  * @packageDocumentation
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = void 0;
8
+ exports.SplitBrainError = exports.EpochMismatchError = exports.LockTimeoutError = exports.DatabaseLockedError = exports.LockError = exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = exports.ErrorCode = void 0;
9
9
  // Copyright 2025 Sushanth (https://github.com/sushanthpy)
10
10
  //
11
11
  // Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,13 +13,40 @@ exports.DatabaseError = exports.ProtocolError = exports.TransactionError = expor
13
13
  // You may obtain a copy of the License at
14
14
  //
15
15
  // http://www.apache.org/licenses/LICENSE-2.0
16
+ /**
17
+ * Error codes matching Rust error codes.
18
+ */
19
+ var ErrorCode;
20
+ (function (ErrorCode) {
21
+ // Connection errors (1xxx)
22
+ ErrorCode[ErrorCode["CONNECTION_FAILED"] = 1001] = "CONNECTION_FAILED";
23
+ ErrorCode[ErrorCode["CONNECTION_TIMEOUT"] = 1002] = "CONNECTION_TIMEOUT";
24
+ ErrorCode[ErrorCode["CONNECTION_CLOSED"] = 1003] = "CONNECTION_CLOSED";
25
+ ErrorCode[ErrorCode["PROTOCOL_ERROR"] = 1004] = "PROTOCOL_ERROR";
26
+ // Transaction errors (2xxx)
27
+ ErrorCode[ErrorCode["TRANSACTION_ABORTED"] = 2001] = "TRANSACTION_ABORTED";
28
+ ErrorCode[ErrorCode["TRANSACTION_CONFLICT"] = 2002] = "TRANSACTION_CONFLICT";
29
+ // Internal errors (9xxx)
30
+ ErrorCode[ErrorCode["INTERNAL_ERROR"] = 9001] = "INTERNAL_ERROR";
31
+ ErrorCode[ErrorCode["STORAGE_ERROR"] = 9003] = "STORAGE_ERROR";
32
+ // Lock/Concurrency errors (10xxx) - v0.4.1
33
+ ErrorCode[ErrorCode["DATABASE_LOCKED"] = 10001] = "DATABASE_LOCKED";
34
+ ErrorCode[ErrorCode["LOCK_TIMEOUT"] = 10002] = "LOCK_TIMEOUT";
35
+ ErrorCode[ErrorCode["EPOCH_MISMATCH"] = 10003] = "EPOCH_MISMATCH";
36
+ ErrorCode[ErrorCode["SPLIT_BRAIN"] = 10004] = "SPLIT_BRAIN";
37
+ ErrorCode[ErrorCode["STALE_LOCK"] = 10005] = "STALE_LOCK";
38
+ })(ErrorCode || (exports.ErrorCode = ErrorCode = {}));
16
39
  /**
17
40
  * Base error class for all SochDB errors.
18
41
  */
19
42
  class SochDBError extends Error {
20
- constructor(message) {
43
+ code;
44
+ remediation;
45
+ constructor(message, code = ErrorCode.INTERNAL_ERROR, remediation) {
21
46
  super(message);
22
47
  this.name = 'SochDBError';
48
+ this.code = code;
49
+ this.remediation = remediation;
23
50
  Object.setPrototypeOf(this, SochDBError.prototype);
24
51
  }
25
52
  }
@@ -29,7 +56,7 @@ exports.SochDBError = SochDBError;
29
56
  */
30
57
  class ConnectionError extends SochDBError {
31
58
  constructor(message) {
32
- super(message);
59
+ super(message, ErrorCode.CONNECTION_FAILED);
33
60
  this.name = 'ConnectionError';
34
61
  Object.setPrototypeOf(this, ConnectionError.prototype);
35
62
  }
@@ -40,7 +67,7 @@ exports.ConnectionError = ConnectionError;
40
67
  */
41
68
  class TransactionError extends SochDBError {
42
69
  constructor(message) {
43
- super(message);
70
+ super(message, ErrorCode.TRANSACTION_ABORTED);
44
71
  this.name = 'TransactionError';
45
72
  Object.setPrototypeOf(this, TransactionError.prototype);
46
73
  }
@@ -51,7 +78,7 @@ exports.TransactionError = TransactionError;
51
78
  */
52
79
  class ProtocolError extends SochDBError {
53
80
  constructor(message) {
54
- super(message);
81
+ super(message, ErrorCode.PROTOCOL_ERROR);
55
82
  this.name = 'ProtocolError';
56
83
  Object.setPrototypeOf(this, ProtocolError.prototype);
57
84
  }
@@ -62,10 +89,83 @@ exports.ProtocolError = ProtocolError;
62
89
  */
63
90
  class DatabaseError extends SochDBError {
64
91
  constructor(message) {
65
- super(message);
92
+ super(message, ErrorCode.STORAGE_ERROR);
66
93
  this.name = 'DatabaseError';
67
94
  Object.setPrototypeOf(this, DatabaseError.prototype);
68
95
  }
69
96
  }
70
97
  exports.DatabaseError = DatabaseError;
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBRUgsMERBQTBEO0FBQzFELEVBQUU7QUFDRixrRUFBa0U7QUFDbEUsbUVBQW1FO0FBQ25FLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0YsaURBQWlEO0FBRWpEOztHQUVHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsS0FBSztJQUNwQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7UUFDMUIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7Q0FDRjtBQU5ELGtDQU1DO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLGVBQWdCLFNBQVEsV0FBVztJQUM5QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztRQUM5QixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekQsQ0FBQztDQUNGO0FBTkQsMENBTUM7QUFFRDs7R0FFRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsV0FBVztJQUMvQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQztRQUMvQixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxRCxDQUFDO0NBQ0Y7QUFORCw0Q0FNQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxhQUFjLFNBQVEsV0FBVztJQUM1QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7UUFDNUIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7Q0FDRjtBQU5ELHNDQU1DO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLGFBQWMsU0FBUSxXQUFXO0lBQzVDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQztRQUM1QixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNGO0FBTkQsc0NBTUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvY2hEQiBFcnJvciBDbGFzc2VzXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cblxuLy8gQ29weXJpZ2h0IDIwMjUgU3VzaGFudGggKGh0dHBzOi8vZ2l0aHViLmNvbS9zdXNoYW50aHB5KVxuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbi8qKlxuICogQmFzZSBlcnJvciBjbGFzcyBmb3IgYWxsIFNvY2hEQiBlcnJvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb2NoREJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1NvY2hEQkVycm9yJztcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgU29jaERCRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlIGZhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgU29jaERCRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29ubmVjdGlvbkVycm9yJztcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgQ29ubmVjdGlvbkVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhIHRyYW5zYWN0aW9uIG9wZXJhdGlvbiBmYWlscy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uRXJyb3IgZXh0ZW5kcyBTb2NoREJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdUcmFuc2FjdGlvbkVycm9yJztcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgVHJhbnNhY3Rpb25FcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlcmUncyBhIHByb3RvY29sIGVycm9yIGluIElQQyBjb21tdW5pY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUHJvdG9jb2xFcnJvciBleHRlbmRzIFNvY2hEQkVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1Byb3RvY29sRXJyb3InO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBQcm90b2NvbEVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhIGRhdGFiYXNlIG9wZXJhdGlvbiBmYWlscy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFiYXNlRXJyb3IgZXh0ZW5kcyBTb2NoREJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdEYXRhYmFzZUVycm9yJztcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgRGF0YWJhc2VFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG4iXX0=
98
+ // ============================================================================
99
+ // Lock/Concurrency Errors (v0.4.1)
100
+ // ============================================================================
101
+ /**
102
+ * Base class for lock-related errors.
103
+ */
104
+ class LockError extends SochDBError {
105
+ constructor(message, code = ErrorCode.DATABASE_LOCKED, remediation) {
106
+ super(message, code, remediation);
107
+ this.name = 'LockError';
108
+ Object.setPrototypeOf(this, LockError.prototype);
109
+ }
110
+ }
111
+ exports.LockError = LockError;
112
+ /**
113
+ * Error thrown when database is locked by another process.
114
+ */
115
+ class DatabaseLockedError extends LockError {
116
+ path;
117
+ holderPid;
118
+ constructor(path, holderPid) {
119
+ const msg = holderPid
120
+ ? `Database at '${path}' is locked by process ${holderPid}`
121
+ : `Database at '${path}' is locked`;
122
+ super(msg, ErrorCode.DATABASE_LOCKED, 'Close the other process or wait for the lock to be released');
123
+ this.name = 'DatabaseLockedError';
124
+ this.path = path;
125
+ this.holderPid = holderPid;
126
+ Object.setPrototypeOf(this, DatabaseLockedError.prototype);
127
+ }
128
+ }
129
+ exports.DatabaseLockedError = DatabaseLockedError;
130
+ /**
131
+ * Error thrown when timed out waiting for database lock.
132
+ */
133
+ class LockTimeoutError extends LockError {
134
+ path;
135
+ timeoutSecs;
136
+ constructor(path, timeoutSecs) {
137
+ super(`Timed out after ${timeoutSecs}s waiting for lock on '${path}'`, ErrorCode.LOCK_TIMEOUT, 'Increase timeout or check for deadlocks');
138
+ this.name = 'LockTimeoutError';
139
+ this.path = path;
140
+ this.timeoutSecs = timeoutSecs;
141
+ Object.setPrototypeOf(this, LockTimeoutError.prototype);
142
+ }
143
+ }
144
+ exports.LockTimeoutError = LockTimeoutError;
145
+ /**
146
+ * Error thrown when WAL epoch mismatch detected (stale writer).
147
+ */
148
+ class EpochMismatchError extends LockError {
149
+ expected;
150
+ actual;
151
+ constructor(expected, actual) {
152
+ super(`Epoch mismatch: expected ${expected}, found ${actual}`, ErrorCode.EPOCH_MISMATCH, 'Another writer has taken over. Re-open the database.');
153
+ this.name = 'EpochMismatchError';
154
+ this.expected = expected;
155
+ this.actual = actual;
156
+ Object.setPrototypeOf(this, EpochMismatchError.prototype);
157
+ }
158
+ }
159
+ exports.EpochMismatchError = EpochMismatchError;
160
+ /**
161
+ * Error thrown when split-brain condition detected (multiple writers).
162
+ */
163
+ class SplitBrainError extends LockError {
164
+ constructor(message = 'Split-brain detected: multiple active writers') {
165
+ super(message, ErrorCode.SPLIT_BRAIN, 'Stop all writers, verify data integrity, then restart with single writer');
166
+ this.name = 'SplitBrainError';
167
+ Object.setPrototypeOf(this, SplitBrainError.prototype);
168
+ }
169
+ }
170
+ exports.SplitBrainError = SplitBrainError;
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBRUgsMERBQTBEO0FBQzFELEVBQUU7QUFDRixrRUFBa0U7QUFDbEUsbUVBQW1FO0FBQ25FLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0YsaURBQWlEO0FBRWpEOztHQUVHO0FBQ0gsSUFBWSxTQXFCWDtBQXJCRCxXQUFZLFNBQVM7SUFDbkIsMkJBQTJCO0lBQzNCLHNFQUF3QixDQUFBO0lBQ3hCLHdFQUF5QixDQUFBO0lBQ3pCLHNFQUF3QixDQUFBO0lBQ3hCLGdFQUFxQixDQUFBO0lBRXJCLDRCQUE0QjtJQUM1QiwwRUFBMEIsQ0FBQTtJQUMxQiw0RUFBMkIsQ0FBQTtJQUUzQix5QkFBeUI7SUFDekIsZ0VBQXFCLENBQUE7SUFDckIsOERBQW9CLENBQUE7SUFFcEIsMkNBQTJDO0lBQzNDLG1FQUF1QixDQUFBO0lBQ3ZCLDZEQUFvQixDQUFBO0lBQ3BCLGlFQUFzQixDQUFBO0lBQ3RCLDJEQUFtQixDQUFBO0lBQ25CLHlEQUFrQixDQUFBO0FBQ3BCLENBQUMsRUFyQlcsU0FBUyx5QkFBVCxTQUFTLFFBcUJwQjtBQUVEOztHQUVHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsS0FBSztJQUNwQixJQUFJLENBQVk7SUFDaEIsV0FBVyxDQUFVO0lBRXJDLFlBQVksT0FBZSxFQUFFLE9BQWtCLFNBQVMsQ0FBQyxjQUFjLEVBQUUsV0FBb0I7UUFDM0YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JE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QyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQVZELDBDQVVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTb2NoREIgRXJyb3IgQ2xhc3Nlc1xuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8vIENvcHlyaWdodCAyMDI1IFN1c2hhbnRoIChodHRwczovL2dpdGh1Yi5jb20vc3VzaGFudGhweSlcbi8vXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4vL1xuLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4vKipcbiAqIEVycm9yIGNvZGVzIG1hdGNoaW5nIFJ1c3QgZXJyb3IgY29kZXMuXG4gKi9cbmV4cG9ydCBlbnVtIEVycm9yQ29kZSB7XG4gIC8vIENvbm5lY3Rpb24gZXJyb3JzICgxeHh4KVxuICBDT05ORUNUSU9OX0ZBSUxFRCA9IDEwMDEsXG4gIENPTk5FQ1RJT05fVElNRU9VVCA9IDEwMDIsXG4gIENPTk5FQ1RJT05fQ0xPU0VEID0gMTAwMyxcbiAgUFJPVE9DT0xfRVJST1IgPSAxMDA0LFxuICBcbiAgLy8gVHJhbnNhY3Rpb24gZXJyb3JzICgyeHh4KVxuICBUUkFOU0FDVElPTl9BQk9SVEVEID0gMjAwMSxcbiAgVFJBTlNBQ1RJT05fQ09ORkxJQ1QgPSAyMDAyLFxuICBcbiAgLy8gSW50ZXJuYWwgZXJyb3JzICg5eHh4KVxuICBJTlRFUk5BTF9FUlJPUiA9IDkwMDEsXG4gIFNUT1JBR0VfRVJST1IgPSA5MDAzLFxuICBcbiAgLy8gTG9jay9Db25jdXJyZW5jeSBlcnJvcnMgKDEweHh4KSAtIHYwLjQuMVxuICBEQVRBQkFTRV9MT0NLRUQgPSAxMDAwMSxcbiAgTE9DS19USU1FT1VUID0gMTAwMDIsXG4gIEVQT0NIX01JU01BVENIID0gMTAwMDMsXG4gIFNQTElUX0JSQUlOID0gMTAwMDQsXG4gIFNUQUxFX0xPQ0sgPSAxMDAwNSxcbn1cblxuLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciBhbGwgU29jaERCIGVycm9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNvY2hEQkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29kZTogRXJyb3JDb2RlO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVtZWRpYXRpb24/OiBzdHJpbmc7XG4gIFxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGNvZGU6IEVycm9yQ29kZSA9IEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiwgcmVtZWRpYXRpb24/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnU29jaERCRXJyb3InO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgdGhpcy5yZW1lZGlhdGlvbiA9IHJlbWVkaWF0aW9uO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBTb2NoREJFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBTb2NoREJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIEVycm9yQ29kZS5DT05ORUNUSU9OX0ZBSUxFRCk7XG4gICAgdGhpcy5uYW1lID0gJ0Nvbm5lY3Rpb25FcnJvcic7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIENvbm5lY3Rpb25FcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSB0cmFuc2FjdGlvbiBvcGVyYXRpb24gZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkVycm9yIGV4dGVuZHMgU29jaERCRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFcnJvckNvZGUuVFJBTlNBQ1RJT05fQUJPUlRFRCk7XG4gICAgdGhpcy5uYW1lID0gJ1RyYW5zYWN0aW9uRXJyb3InO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBUcmFuc2FjdGlvbkVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGVyZSdzIGEgcHJvdG9jb2wgZXJyb3IgaW4gSVBDIGNvbW11bmljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm90b2NvbEVycm9yIGV4dGVuZHMgU29jaERCRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFcnJvckNvZGUuUFJPVE9DT0xfRVJST1IpO1xuICAgIHRoaXMubmFtZSA9ICdQcm90b2NvbEVycm9yJztcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgUHJvdG9jb2xFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSBkYXRhYmFzZSBvcGVyYXRpb24gZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZUVycm9yIGV4dGVuZHMgU29jaERCRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBFcnJvckNvZGUuU1RPUkFHRV9FUlJPUik7XG4gICAgdGhpcy5uYW1lID0gJ0RhdGFiYXNlRXJyb3InO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBEYXRhYmFzZUVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTG9jay9Db25jdXJyZW5jeSBFcnJvcnMgKHYwLjQuMSlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBsb2NrLXJlbGF0ZWQgZXJyb3JzLlxuICovXG5leHBvcnQgY2xhc3MgTG9ja0Vycm9yIGV4dGVuZHMgU29jaERCRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGNvZGU6IEVycm9yQ29kZSA9IEVycm9yQ29kZS5EQVRBQkFTRV9MT0NLRUQsIHJlbWVkaWF0aW9uPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY29kZSwgcmVtZWRpYXRpb24pO1xuICAgIHRoaXMubmFtZSA9ICdMb2NrRXJyb3InO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBMb2NrRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGRhdGFiYXNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZUxvY2tlZEVycm9yIGV4dGVuZHMgTG9ja0Vycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGhvbGRlclBpZD86IG51bWJlcjtcbiAgXG4gIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZywgaG9sZGVyUGlkPzogbnVtYmVyKSB7XG4gICAgY29uc3QgbXNnID0gaG9sZGVyUGlkIFxuICAgICAgPyBgRGF0YWJhc2UgYXQgJyR7cGF0aH0nIGlzIGxvY2tlZCBieSBwcm9jZXNzICR7aG9sZGVyUGlkfWBcbiAgICAgIDogYERhdGFiYXNlIGF0ICcke3BhdGh9JyBpcyBsb2NrZWRgO1xuICAgIHN1cGVyKG1zZywgRXJyb3JDb2RlLkRBVEFCQVNFX0xPQ0tFRCwgJ0Nsb3NlIHRoZSBvdGhlciBwcm9jZXNzIG9yIHdhaXQgZm9yIHRoZSBsb2NrIHRvIGJlIHJlbGVhc2VkJyk7XG4gICAgdGhpcy5uYW1lID0gJ0RhdGFiYXNlTG9ja2VkRXJyb3InO1xuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5ob2xkZXJQaWQgPSBob2xkZXJQaWQ7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIERhdGFiYXNlTG9ja2VkRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRpbWVkIG91dCB3YWl0aW5nIGZvciBkYXRhYmFzZSBsb2NrLlxuICovXG5leHBvcnQgY2xhc3MgTG9ja1RpbWVvdXRFcnJvciBleHRlbmRzIExvY2tFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0aW1lb3V0U2VjczogbnVtYmVyO1xuICBcbiAgY29uc3RydWN0b3IocGF0aDogc3RyaW5nLCB0aW1lb3V0U2VjczogbnVtYmVyKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVGltZWQgb3V0IGFmdGVyICR7dGltZW91dFNlY3N9cyB3YWl0aW5nIGZvciBsb2NrIG9uICcke3BhdGh9J2AsXG4gICAgICBFcnJvckNvZGUuTE9DS19USU1FT1VULFxuICAgICAgJ0luY3JlYXNlIHRpbWVvdXQgb3IgY2hlY2sgZm9yIGRlYWRsb2NrcydcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdMb2NrVGltZW91dEVycm9yJztcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMudGltZW91dFNlY3MgPSB0aW1lb3V0U2VjcztcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTG9ja1RpbWVvdXRFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gV0FMIGVwb2NoIG1pc21hdGNoIGRldGVjdGVkIChzdGFsZSB3cml0ZXIpLlxuICovXG5leHBvcnQgY2xhc3MgRXBvY2hNaXNtYXRjaEVycm9yIGV4dGVuZHMgTG9ja0Vycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGV4cGVjdGVkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBhY3R1YWw6IG51bWJlcjtcbiAgXG4gIGNvbnN0cnVjdG9yKGV4cGVjdGVkOiBudW1iZXIsIGFjdHVhbDogbnVtYmVyKSB7XG4gICAgc3VwZXIoXG4gICAgICBgRXBvY2ggbWlzbWF0Y2g6IGV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBmb3VuZCAke2FjdHVhbH1gLFxuICAgICAgRXJyb3JDb2RlLkVQT0NIX01JU01BVENILFxuICAgICAgJ0Fub3RoZXIgd3JpdGVyIGhhcyB0YWtlbiBvdmVyLiBSZS1vcGVuIHRoZSBkYXRhYmFzZS4nXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnRXBvY2hNaXNtYXRjaEVycm9yJztcbiAgICB0aGlzLmV4cGVjdGVkID0gZXhwZWN0ZWQ7XG4gICAgdGhpcy5hY3R1YWwgPSBhY3R1YWw7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEVwb2NoTWlzbWF0Y2hFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gc3BsaXQtYnJhaW4gY29uZGl0aW9uIGRldGVjdGVkIChtdWx0aXBsZSB3cml0ZXJzKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNwbGl0QnJhaW5FcnJvciBleHRlbmRzIExvY2tFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9ICdTcGxpdC1icmFpbiBkZXRlY3RlZDogbXVsdGlwbGUgYWN0aXZlIHdyaXRlcnMnKSB7XG4gICAgc3VwZXIoXG4gICAgICBtZXNzYWdlLFxuICAgICAgRXJyb3JDb2RlLlNQTElUX0JSQUlOLFxuICAgICAgJ1N0b3AgYWxsIHdyaXRlcnMsIHZlcmlmeSBkYXRhIGludGVncml0eSwgdGhlbiByZXN0YXJ0IHdpdGggc2luZ2xlIHdyaXRlcidcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdTcGxpdEJyYWluRXJyb3InO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBTcGxpdEJyYWluRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuIl19