@sochdb/sochdb 0.4.3 → 0.4.4

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 (45) hide show
  1. package/dist/cjs/embedded/database.js +34 -7
  2. package/dist/cjs/embedded/ffi/bindings.js +36 -8
  3. package/dist/cjs/index.js +28 -6
  4. package/dist/cjs/mcp/client.js +115 -0
  5. package/dist/cjs/mcp/index.js +28 -0
  6. package/dist/cjs/mcp/server.js +242 -0
  7. package/dist/cjs/mcp/types.js +32 -0
  8. package/dist/cjs/namespace.js +147 -19
  9. package/dist/cjs/policy/index.js +26 -0
  10. package/dist/cjs/policy/service.js +394 -0
  11. package/dist/cjs/policy/types.js +8 -0
  12. package/dist/esm/embedded/database.js +34 -7
  13. package/dist/esm/embedded/ffi/bindings.js +36 -8
  14. package/dist/esm/index.js +28 -6
  15. package/dist/esm/mcp/client.js +116 -0
  16. package/dist/esm/mcp/index.js +28 -0
  17. package/dist/esm/mcp/server.js +244 -0
  18. package/dist/esm/mcp/types.js +34 -0
  19. package/dist/esm/namespace.js +150 -19
  20. package/dist/esm/policy/index.js +26 -0
  21. package/dist/esm/policy/service.js +396 -0
  22. package/dist/esm/policy/types.js +8 -0
  23. package/dist/types/embedded/database.d.ts +13 -1
  24. package/dist/types/embedded/database.d.ts.map +1 -1
  25. package/dist/types/embedded/ffi/bindings.d.ts +5 -0
  26. package/dist/types/embedded/ffi/bindings.d.ts.map +1 -1
  27. package/dist/types/index.d.ts +23 -5
  28. package/dist/types/index.d.ts.map +1 -1
  29. package/dist/types/mcp/client.d.ts +69 -0
  30. package/dist/types/mcp/client.d.ts.map +1 -0
  31. package/dist/types/mcp/index.d.ts +9 -0
  32. package/dist/types/mcp/index.d.ts.map +1 -0
  33. package/dist/types/mcp/server.d.ts +87 -0
  34. package/dist/types/mcp/server.d.ts.map +1 -0
  35. package/dist/types/mcp/types.d.ts +124 -0
  36. package/dist/types/mcp/types.d.ts.map +1 -0
  37. package/dist/types/namespace.d.ts +13 -0
  38. package/dist/types/namespace.d.ts.map +1 -1
  39. package/dist/types/policy/index.d.ts +8 -0
  40. package/dist/types/policy/index.d.ts.map +1 -0
  41. package/dist/types/policy/service.d.ts +115 -0
  42. package/dist/types/policy/service.d.ts.map +1 -0
  43. package/dist/types/policy/types.d.ts +102 -0
  44. package/dist/types/policy/types.d.ts.map +1 -0
  45. package/package.json +1 -1
@@ -29,10 +29,12 @@ class EmbeddedDatabase {
29
29
  closed = false;
30
30
  path;
31
31
  concurrent = false;
32
- constructor(path, handle, concurrent = false) {
32
+ _concurrentModeFallback = false;
33
+ constructor(path, handle, concurrent = false, fallback = false) {
33
34
  this.path = path;
34
35
  this.handle = handle;
35
36
  this.concurrent = concurrent;
37
+ this._concurrentModeFallback = fallback;
36
38
  this.bindings = bindings_1.NativeBindings.getInstance();
37
39
  }
38
40
  /**
@@ -112,19 +114,32 @@ class EmbeddedDatabase {
112
114
  * ```
113
115
  *
114
116
  * @param path - Path to database directory
117
+ * @param options - Optional configuration for concurrent mode
115
118
  * @returns EmbeddedDatabase instance in concurrent mode
116
119
  */
117
- static openConcurrent(path) {
120
+ static openConcurrent(path, options) {
118
121
  const bindings = bindings_1.NativeBindings.getInstance();
119
- if (!bindings.sochdb_open_concurrent) {
120
- throw new errors_1.DatabaseError('Concurrent mode not supported. Please upgrade the SochDB native library to v0.4.4+');
122
+ const fallbackToStandard = options?.fallbackToStandard ?? false;
123
+ if (!bindings.isConcurrentModeAvailable()) {
124
+ if (fallbackToStandard) {
125
+ console.warn('[SochDB] Concurrent mode not available in native library (requires v0.4.8+). ' +
126
+ 'Falling back to standard mode. For production multi-process deployments, ' +
127
+ 'please upgrade the SochDB native library.');
128
+ const handle = bindings.sochdb_open(path);
129
+ if (!handle) {
130
+ throw new errors_1.DatabaseError(`Failed to open database at ${path}`);
131
+ }
132
+ return new EmbeddedDatabase(path, handle, false, true);
133
+ }
134
+ throw new errors_1.DatabaseError('Concurrent mode not supported. Please upgrade the SochDB native library to v0.4.8+ ' +
135
+ 'or use openConcurrent(path, { fallbackToStandard: true }) to fall back to standard mode.');
121
136
  }
122
137
  const handle = bindings.sochdb_open_concurrent(path);
123
138
  if (!handle) {
124
139
  throw new errors_1.DatabaseError(`Failed to open database in concurrent mode at ${path}`);
125
140
  }
126
- const isConcurrent = bindings.sochdb_is_concurrent(handle) === 1;
127
- return new EmbeddedDatabase(path, handle, isConcurrent);
141
+ const isConcurrent = bindings.sochdb_is_concurrent?.(handle) === 1;
142
+ return new EmbeddedDatabase(path, handle, isConcurrent, false);
128
143
  }
129
144
  /**
130
145
  * Check if database is opened in concurrent mode
@@ -132,6 +147,18 @@ class EmbeddedDatabase {
132
147
  get isConcurrent() {
133
148
  return this.concurrent;
134
149
  }
150
+ /**
151
+ * Check if concurrent mode fell back to standard mode
152
+ */
153
+ get isConcurrentFallback() {
154
+ return this._concurrentModeFallback;
155
+ }
156
+ /**
157
+ * Check if concurrent mode is available in the native library
158
+ */
159
+ static isConcurrentModeAvailable() {
160
+ return bindings_1.NativeBindings.getInstance().isConcurrentModeAvailable();
161
+ }
135
162
  /**
136
163
  * Put a key-value pair (auto-transaction)
137
164
  */
@@ -303,4 +330,4 @@ class EmbeddedDatabase {
303
330
  }
304
331
  }
305
332
  exports.EmbeddedDatabase = EmbeddedDatabase;
306
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCxzQ0FBMEM7QUFDMUMsNkNBQWdEO0FBQ2hELCtDQUFvRDtBQVdwRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLGdCQUFnQjtJQUNqQixNQUFNLENBQU07SUFDWixRQUFRLENBQWlCO0lBQ3pCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDZixJQUFJLENBQVM7SUFDYixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBRTNCLFlBQW9CLElBQVksRUFBRSxNQUFXLEVBQUUsVUFBVSxHQUFHLEtBQUs7UUFDN0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBWSxFQUFFLE1BQStCO1FBQ3JELE1BQU0sUUFBUSxHQUFHLHlCQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUMsSUFBSSxNQUFNLENBQUM7UUFFWCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1QsTUFBTSxPQUFPLEdBQUc7Z0JBQ1osV0FBVyxFQUFFLE1BQU0sQ0FBQyxVQUFVLElBQUksS0FBSztnQkFDdkMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUztnQkFDaEQsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsRixhQUFhLEVBQUUsTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTO2dCQUM1QyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQztnQkFDMUQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxXQUFXLElBQUksS0FBSztnQkFDekMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLFdBQVcsS0FBSyxTQUFTO2dCQUNsRCxvQkFBb0IsRUFBRSxDQUFDLEVBQUUsc0JBQXNCO2dCQUMvQyx3QkFBd0IsRUFBRSxLQUFLO2FBQ2xDLENBQUM7WUFDRixNQUFNLEdBQUcsUUFBUSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3RCxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksc0JBQWEsQ0FBQyw4QkFBOEIsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTRDRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBWTtRQUM5QixNQUFNLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTlDLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksc0JBQWEsQ0FBQyxvRkFBb0YsQ0FBQyxDQUFDO1FBQ2xILENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLHNCQUFhLENBQUMsaURBQWlELElBQUksRUFBRSxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakUsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxZQUFZO1FBQ1osT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDaEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUM7WUFDRCxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFCLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVztRQUNqQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNiLE1BQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLE1BQU0sS0FBSyxDQUFDO1FBQ2hCLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQVc7UUFDcEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUM7WUFDRCxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEIsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUNyQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQztZQUNELE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0IsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFZO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDO1lBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFjO1FBQzVCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDO1lBQ0QsSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLEtBQUssQ0FBQztZQUNoQixDQUFDO1lBQ0QsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNQLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RCxPQUFPLElBQUksaUNBQW1CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBSSxFQUE0QztRQUNqRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0IsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVU7UUFDWixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFPUCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsa0RBQWtEO1FBQ2xELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0RCxNQUFNLE1BQU0sR0FBRztZQUNYLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7WUFDcEQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1lBQzFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7WUFDN0MsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztZQUNwRCxpQkFBaUIsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1NBQ3ZELENBQUM7UUFFRixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDO0lBQ0wsQ0FBQztJQUVPLFVBQVU7UUFDZCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxzQkFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7Q0FDSjtBQXRURCw0Q0FzVEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVtYmVkZGVkIERhdGFiYXNlIC0gRkZJIE1vZGVcbiAqIFxuICogRGlyZWN0IEZGSSBhY2Nlc3MgdG8gU29jaERCIG5hdGl2ZSBsaWJyYXJ5LlxuICogTm8gc2VydmVyIHJlcXVpcmVkIC0gc2ltaWxhciB0byBQeXRob24gU0RLJ3MgRGF0YWJhc2UgY2xhc3MuXG4gKi9cblxuaW1wb3J0IHsgRGF0YWJhc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBOYXRpdmVCaW5kaW5ncyB9IGZyb20gJy4vZmZpL2JpbmRpbmdzJztcbmltcG9ydCB7IEVtYmVkZGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCAqIGFzIGtvZmZpIGZyb20gJ2tvZmZpJztcblxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIHtcbiAgICB3YWxFbmFibGVkPzogYm9vbGVhbjtcbiAgICBzeW5jTW9kZT86ICdmdWxsJyB8ICdub3JtYWwnIHwgJ29mZic7XG4gICAgbWVtdGFibGVTaXplQnl0ZXM/OiBudW1iZXI7XG4gICAgZ3JvdXBDb21taXQ/OiBib29sZWFuO1xuICAgIGluZGV4UG9saWN5PzogJ3dyaXRlX29wdGltaXplZCcgfCAnYmFsYW5jZWQnIHwgJ3NjYW5fb3B0aW1pemVkJyB8ICdhcHBlbmRfb25seSc7XG59XG5cbi8qKlxuICogRW1iZWRkZWQgRGF0YWJhc2UgdXNpbmcgZGlyZWN0IEZGSVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogY29uc3QgZGIgPSBhd2FpdCBFbWJlZGRlZERhdGFiYXNlLm9wZW4oJy4vbXlkYicpO1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogY29uc3QgdmFsdWUgPSBhd2FpdCBkYi5nZXQoQnVmZmVyLmZyb20oJ2tleScpKTtcbiAqIGF3YWl0IGRiLmNsb3NlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkZGVkRGF0YWJhc2Uge1xuICAgIHByaXZhdGUgaGFuZGxlOiBhbnk7XG4gICAgcHJpdmF0ZSBiaW5kaW5nczogTmF0aXZlQmluZGluZ3M7XG4gICAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHBhdGg6IHN0cmluZztcbiAgICBwcml2YXRlIGNvbmN1cnJlbnQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IocGF0aDogc3RyaW5nLCBoYW5kbGU6IGFueSwgY29uY3VycmVudCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuaGFuZGxlID0gaGFuZGxlO1xuICAgICAgICB0aGlzLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50O1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIGEgZGF0YWJhc2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGluIHN0YW5kYXJkIG1vZGVcbiAgICAgKiBcbiAgICAgKiBGb3Igd2ViIGFwcGxpY2F0aW9ucyB3aXRoIG11bHRpcGxlIHByb2Nlc3NlcywgdXNlIGBvcGVuQ29uY3VycmVudCgpYCBpbnN0ZWFkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byBkYXRhYmFzZSBkaXJlY3RvcnlcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvblxuICAgICAqIEByZXR1cm5zIEVtYmVkZGVkRGF0YWJhc2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgb3BlbihwYXRoOiBzdHJpbmcsIGNvbmZpZz86IEVtYmVkZGVkRGF0YWJhc2VDb25maWcpOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBOYXRpdmVCaW5kaW5ncy5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBsZXQgaGFuZGxlO1xuXG4gICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgd2FsX2VuYWJsZWQ6IGNvbmZpZy53YWxFbmFibGVkID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIHdhbF9lbmFibGVkX3NldDogY29uZmlnLndhbEVuYWJsZWQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzeW5jX21vZGU6IGNvbmZpZy5zeW5jTW9kZSA9PT0gJ2Z1bGwnID8gMiA6IChjb25maWcuc3luY01vZGUgPT09ICdub3JtYWwnID8gMSA6IDApLFxuICAgICAgICAgICAgICAgIHN5bmNfbW9kZV9zZXQ6IGNvbmZpZy5zeW5jTW9kZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1lbXRhYmxlX3NpemVfYnl0ZXM6IEJpZ0ludChjb25maWcubWVtdGFibGVTaXplQnl0ZXMgPz8gMCksXG4gICAgICAgICAgICAgICAgZ3JvdXBfY29tbWl0OiBjb25maWcuZ3JvdXBDb21taXQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgZ3JvdXBfY29tbWl0X3NldDogY29uZmlnLmdyb3VwQ29tbWl0ICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGVmYXVsdF9pbmRleF9wb2xpY3k6IDEsIC8vIERlZmF1bHQgdG8gQmFsYW5jZWRcbiAgICAgICAgICAgICAgICBkZWZhdWx0X2luZGV4X3BvbGljeV9zZXQ6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaGFuZGxlID0gYmluZGluZ3Muc29jaGRiX29wZW5fd2l0aF9jb25maWcocGF0aCwgY0NvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3BlbihwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcihgRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgYXQgJHtwYXRofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZERhdGFiYXNlKHBhdGgsIGhhbmRsZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW4gYSBkYXRhYmFzZSBpbiBjb25jdXJyZW50IG1vZGUgZm9yIG11bHRpLXByb2Nlc3Mgd2ViIGFwcGxpY2F0aW9uc1xuICAgICAqIFxuICAgICAqIFRoaXMgbW9kZSBhbGxvd3MgbXVsdGlwbGUgTm9kZS5qcyBwcm9jZXNzZXMgKGUuZy4sIFBNMiBjbHVzdGVyIHdvcmtlcnMsXG4gICAgICogbXVsdGlwbGUgRXhwcmVzcyBpbnN0YW5jZXMpIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2Ugc2ltdWx0YW5lb3VzbHkuXG4gICAgICogXG4gICAgICogRmVhdHVyZXM6XG4gICAgICogLSBMb2NrLWZyZWUgcmVhZHMgd2l0aCB+MTAwbnMgbGF0ZW5jeVxuICAgICAqIC0gTXVsdGktcmVhZGVyLCBzaW5nbGUtd3JpdGVyIGNvb3JkaW5hdGlvblxuICAgICAqIC0gQXV0b21hdGljIHdyaXRlIHNlcmlhbGl6YXRpb25cbiAgICAgKiBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBpbXBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICAgICAqIGltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuICAgICAqIFxuICAgICAqIC8vIE9wZW4gaW4gY29uY3VycmVudCBtb2RlIC0gbXVsdGlwbGUgd29ya2VycyBjYW4gYWNjZXNzXG4gICAgICogY29uc3QgZGIgPSBFbWJlZGRlZERhdGFiYXNlLm9wZW5Db25jdXJyZW50KCcuL3dlYl9kYicpO1xuICAgICAqIFxuICAgICAqIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcbiAgICAgKiBcbiAgICAgKiBhcHAuZ2V0KCcvdXNlci86aWQnLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgKiAgIC8vIE11bHRpcGxlIGNvbmN1cnJlbnQgcmVxdWVzdHMgY2FuIHJlYWQgc2ltdWx0YW5lb3VzbHlcbiAgICAgKiAgIGNvbnN0IGRhdGEgPSBhd2FpdCBkYi5nZXQoQnVmZmVyLmZyb20oYHVzZXI6JHtyZXEucGFyYW1zLmlkfWApKTtcbiAgICAgKiAgIGlmICghZGF0YSkge1xuICAgICAqICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiAnbm90IGZvdW5kJyB9KTtcbiAgICAgKiAgICAgcmV0dXJuO1xuICAgICAqICAgfVxuICAgICAqICAgcmVzLnNlbmQoZGF0YSk7XG4gICAgICogfSk7XG4gICAgICogXG4gICAgICogYXBwLnBvc3QoJy91c2VyLzppZCcsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAqICAgLy8gV3JpdGVzIGFyZSBzZXJpYWxpemVkIGF1dG9tYXRpY2FsbHlcbiAgICAgKiAgIGF3YWl0IGRiLnB1dChCdWZmZXIuZnJvbShgdXNlcjoke3JlcS5wYXJhbXMuaWR9YCksIHJlcS5ib2R5KTtcbiAgICAgKiAgIHJlcy5qc29uKHsgc3RhdHVzOiAnb2snIH0pO1xuICAgICAqIH0pO1xuICAgICAqIFxuICAgICAqIC8vIFN0YXJ0IHdpdGggUE0yIGNsdXN0ZXIgbW9kZTpcbiAgICAgKiAvLyBwbTIgc3RhcnQgYXBwLmpzIC1pIG1heFxuICAgICAqIGFwcC5saXN0ZW4oMzAwMCk7XG4gICAgICogYGBgXG4gICAgICogXG4gICAgICogQHBhcmFtIHBhdGggLSBQYXRoIHRvIGRhdGFiYXNlIGRpcmVjdG9yeVxuICAgICAqIEByZXR1cm5zIEVtYmVkZGVkRGF0YWJhc2UgaW5zdGFuY2UgaW4gY29uY3VycmVudCBtb2RlXG4gICAgICovXG4gICAgc3RhdGljIG9wZW5Db25jdXJyZW50KHBhdGg6IHN0cmluZyk6IEVtYmVkZGVkRGF0YWJhc2Uge1xuICAgICAgICBjb25zdCBiaW5kaW5ncyA9IE5hdGl2ZUJpbmRpbmdzLmdldEluc3RhbmNlKCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWJpbmRpbmdzLnNvY2hkYl9vcGVuX2NvbmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKCdDb25jdXJyZW50IG1vZGUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVwZ3JhZGUgdGhlIFNvY2hEQiBuYXRpdmUgbGlicmFyeSB0byB2MC40LjQrJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3Blbl9jb25jdXJyZW50KHBhdGgpO1xuICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoYEZhaWxlZCB0byBvcGVuIGRhdGFiYXNlIGluIGNvbmN1cnJlbnQgbW9kZSBhdCAke3BhdGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbmN1cnJlbnQgPSBiaW5kaW5ncy5zb2NoZGJfaXNfY29uY3VycmVudChoYW5kbGUpID09PSAxO1xuICAgICAgICByZXR1cm4gbmV3IEVtYmVkZGVkRGF0YWJhc2UocGF0aCwgaGFuZGxlLCBpc0NvbmN1cnJlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGRhdGFiYXNlIGlzIG9wZW5lZCBpbiBjb25jdXJyZW50IG1vZGVcbiAgICAgKi9cbiAgICBnZXQgaXNDb25jdXJyZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25jdXJyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1dCBhIGtleS12YWx1ZSBwYWlyIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIHB1dChrZXk6IEJ1ZmZlciwgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4ucHV0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHZhbHVlIGJ5IGtleSAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBnZXQoa2V5OiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0eG4uZ2V0KGtleSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGEga2V5IChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZShrZXk6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHV0IHZhbHVlIGF0IHBhdGggKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgcHV0UGF0aChwYXRoOiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLnB1dFBhdGgocGF0aCwgdmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB2YWx1ZSBhdCBwYXRoIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIGdldFBhdGgocGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdHhuLmdldFBhdGgocGF0aCk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2NhbiBrZXlzIHdpdGggcHJlZml4XG4gICAgICovXG4gICAgYXN5bmMgKnNjYW5QcmVmaXgocHJlZml4OiBCdWZmZXIpOiBBc3luY0dlbmVyYXRvcjxbQnVmZmVyLCBCdWZmZXJdPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgZW50cnkgb2YgdHhuLnNjYW5QcmVmaXgocHJlZml4KSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJlZ2luIGEgdHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbigpOiBFbWJlZGRlZFRyYW5zYWN0aW9uIHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuSGFuZGxlID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfYmVnaW5fdHhuKHRoaXMuaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZFRyYW5zYWN0aW9uKHRoaXMsIHRoaXMuaGFuZGxlLCB0eG5IYW5kbGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgb3BlcmF0aW9ucyB3aXRoaW4gYSB0cmFuc2FjdGlvbiAod2l0aCBhdXRvLWNvbW1pdC9hYm9ydClcbiAgICAgKi9cbiAgICBhc3luYyB3aXRoVHJhbnNhY3Rpb248VD4oZm46ICh0eG46IEVtYmVkZGVkVHJhbnNhY3Rpb24pID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4odHhuKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UgYSBjaGVja3BvaW50XG4gICAgICovXG4gICAgYXN5bmMgY2hlY2twb2ludCgpOiBQcm9taXNlPGJpZ2ludD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICAgICAgY29uc3QgbHNuID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfY2hlY2twb2ludCh0aGlzLmhhbmRsZSk7XG4gICAgICAgIHJldHVybiBCaWdJbnQobHNuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc3RvcmFnZSBzdGF0aXN0aWNzXG4gICAgICovXG4gICAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTx7XG4gICAgICAgIG1lbXRhYmxlU2l6ZUJ5dGVzOiBiaWdpbnQ7XG4gICAgICAgIHdhbFNpemVCeXRlczogYmlnaW50O1xuICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAgICAgbWluQWN0aXZlU25hcHNob3Q6IGJpZ2ludDtcbiAgICAgICAgbGFzdENoZWNrcG9pbnRMc246IGJpZ2ludDtcbiAgICB9PiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIC8vIFJldHVybnMgc3RydWN0IGJ5IHZhbHVlIChhdXRvbWF0aWNhbGx5IGRlY29kZWQpXG4gICAgICAgIGNvbnN0IHN0YXRzID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfc3RhdHModGhpcy5oYW5kbGUpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG1lbXRhYmxlU2l6ZUJ5dGVzOiBCaWdJbnQoc3RhdHMubWVtdGFibGVfc2l6ZV9ieXRlcyksXG4gICAgICAgICAgICB3YWxTaXplQnl0ZXM6IEJpZ0ludChzdGF0cy53YWxfc2l6ZV9ieXRlcyksXG4gICAgICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IHN0YXRzLmFjdGl2ZV90cmFuc2FjdGlvbnMsXG4gICAgICAgICAgICBtaW5BY3RpdmVTbmFwc2hvdDogQmlnSW50KHN0YXRzLm1pbl9hY3RpdmVfc25hcHNob3QpLFxuICAgICAgICAgICAgbGFzdENoZWNrcG9pbnRMc246IEJpZ0ludChzdGF0cy5sYXN0X2NoZWNrcG9pbnRfbHNuKSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBkYXRhYmFzZVxuICAgICAqL1xuICAgIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzLnNvY2hkYl9jbG9zZSh0aGlzLmhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGVuc3VyZU9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoJ0RhdGFiYXNlIGlzIGNsb3NlZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGludGVybmFsIGhhbmRsZSAoZm9yIHRyYW5zYWN0aW9ucylcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRIYW5kbGUoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBiaW5kaW5ncyBpbnN0YW5jZSAoZm9yIHRyYW5zYWN0aW9ucylcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRCaW5kaW5ncygpOiBOYXRpdmVCaW5kaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdzO1xuICAgIH1cbn1cbiJdfQ==
333
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCxzQ0FBMEM7QUFDMUMsNkNBQWdEO0FBQ2hELCtDQUFvRDtBQVdwRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLGdCQUFnQjtJQUNqQixNQUFNLENBQU07SUFDWixRQUFRLENBQWlCO0lBQ3pCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDZixJQUFJLENBQVM7SUFDYixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ25CLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUV4QyxZQUFvQixJQUFZLEVBQUUsTUFBVyxFQUFFLFVBQVUsR0FBRyxLQUFLLEVBQUUsUUFBUSxHQUFHLEtBQUs7UUFDL0UsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFFBQVEsQ0FBQztRQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLHlCQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFZLEVBQUUsTUFBK0I7UUFDckQsTUFBTSxRQUFRLEdBQUcseUJBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5QyxJQUFJLE1BQU0sQ0FBQztRQUVYLElBQUksTUFBTSxFQUFFLENBQUM7WUFDVCxNQUFNLE9BQU8sR0FBRztnQkFDWixXQUFXLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxLQUFLO2dCQUN2QyxlQUFlLEVBQUUsTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTO2dCQUNoRCxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xGLGFBQWEsRUFBRSxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVM7Z0JBQzVDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxZQUFZLEVBQUUsTUFBTSxDQUFDLFdBQVcsSUFBSSxLQUFLO2dCQUN6QyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsV0FBVyxLQUFLLFNBQVM7Z0JBQ2xELG9CQUFvQixFQUFFLENBQUMsRUFBRSxzQkFBc0I7Z0JBQy9DLHdCQUF3QixFQUFFLEtBQUs7YUFDbEMsQ0FBQztZQUNGLE1BQU0sR0FBRyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdELENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSxzQkFBYSxDQUFDLDhCQUE4QixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFFRCxPQUFPLElBQUksZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTZDRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBWSxFQUFFLE9BQTBDO1FBQzFFLE1BQU0sUUFBUSxHQUFHLHlCQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUMsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLEVBQUUsa0JBQWtCLElBQUksS0FBSyxDQUFDO1FBRWhFLElBQUksQ0FBQyxRQUFRLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxDQUFDLElBQUksQ0FDUiwrRUFBK0U7b0JBQy9FLDJFQUEyRTtvQkFDM0UsMkNBQTJDLENBQzlDLENBQUM7Z0JBQ0YsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNWLE1BQU0sSUFBSSxzQkFBYSxDQUFDLDhCQUE4QixJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRSxDQUFDO2dCQUNELE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLHNCQUFhLENBQ25CLHFGQUFxRjtnQkFDckYsMEZBQTBGLENBQzdGLENBQUM7UUFDTixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSxzQkFBYSxDQUFDLGlEQUFpRCxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkUsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLG9CQUFvQjtRQUNwQixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMseUJBQXlCO1FBQzVCLE9BQU8seUJBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDaEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUM7WUFDRCxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFCLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVztRQUNqQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNiLE1BQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLE1BQU0sS0FBSyxDQUFDO1FBQ2hCLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQVc7UUFDcEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUM7WUFDRCxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEIsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUNyQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQztZQUNELE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0IsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFZO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDO1lBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsTUFBTSxLQUFLLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFjO1FBQzVCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDO1lBQ0QsSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxNQUFNLEtBQUssQ0FBQztZQUNoQixDQUFDO1lBQ0QsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNQLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RCxPQUFPLElBQUksaUNBQW1CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBSSxFQUE0QztRQUNqRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0IsTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixNQUFNLEtBQUssQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVU7UUFDWixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFPUCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsa0RBQWtEO1FBQ2xELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0RCxNQUFNLE1BQU0sR0FBRztZQUNYLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7WUFDcEQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1lBQzFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7WUFDN0MsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztZQUNwRCxpQkFBaUIsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1NBQ3ZELENBQUM7UUFFRixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDO0lBQ0wsQ0FBQztJQUVPLFVBQVU7UUFDZCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxzQkFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7Q0FDSjtBQXZWRCw0Q0F1VkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVtYmVkZGVkIERhdGFiYXNlIC0gRkZJIE1vZGVcbiAqIFxuICogRGlyZWN0IEZGSSBhY2Nlc3MgdG8gU29jaERCIG5hdGl2ZSBsaWJyYXJ5LlxuICogTm8gc2VydmVyIHJlcXVpcmVkIC0gc2ltaWxhciB0byBQeXRob24gU0RLJ3MgRGF0YWJhc2UgY2xhc3MuXG4gKi9cblxuaW1wb3J0IHsgRGF0YWJhc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBOYXRpdmVCaW5kaW5ncyB9IGZyb20gJy4vZmZpL2JpbmRpbmdzJztcbmltcG9ydCB7IEVtYmVkZGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCAqIGFzIGtvZmZpIGZyb20gJ2tvZmZpJztcblxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIHtcbiAgICB3YWxFbmFibGVkPzogYm9vbGVhbjtcbiAgICBzeW5jTW9kZT86ICdmdWxsJyB8ICdub3JtYWwnIHwgJ29mZic7XG4gICAgbWVtdGFibGVTaXplQnl0ZXM/OiBudW1iZXI7XG4gICAgZ3JvdXBDb21taXQ/OiBib29sZWFuO1xuICAgIGluZGV4UG9saWN5PzogJ3dyaXRlX29wdGltaXplZCcgfCAnYmFsYW5jZWQnIHwgJ3NjYW5fb3B0aW1pemVkJyB8ICdhcHBlbmRfb25seSc7XG59XG5cbi8qKlxuICogRW1iZWRkZWQgRGF0YWJhc2UgdXNpbmcgZGlyZWN0IEZGSVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogY29uc3QgZGIgPSBhd2FpdCBFbWJlZGRlZERhdGFiYXNlLm9wZW4oJy4vbXlkYicpO1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogY29uc3QgdmFsdWUgPSBhd2FpdCBkYi5nZXQoQnVmZmVyLmZyb20oJ2tleScpKTtcbiAqIGF3YWl0IGRiLmNsb3NlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkZGVkRGF0YWJhc2Uge1xuICAgIHByaXZhdGUgaGFuZGxlOiBhbnk7XG4gICAgcHJpdmF0ZSBiaW5kaW5nczogTmF0aXZlQmluZGluZ3M7XG4gICAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHBhdGg6IHN0cmluZztcbiAgICBwcml2YXRlIGNvbmN1cnJlbnQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jb25jdXJyZW50TW9kZUZhbGxiYWNrID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZywgaGFuZGxlOiBhbnksIGNvbmN1cnJlbnQgPSBmYWxzZSwgZmFsbGJhY2sgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLmhhbmRsZSA9IGhhbmRsZTtcbiAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDtcbiAgICAgICAgdGhpcy5fY29uY3VycmVudE1vZGVGYWxsYmFjayA9IGZhbGxiYWNrO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIGEgZGF0YWJhc2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGluIHN0YW5kYXJkIG1vZGVcbiAgICAgKiBcbiAgICAgKiBGb3Igd2ViIGFwcGxpY2F0aW9ucyB3aXRoIG11bHRpcGxlIHByb2Nlc3NlcywgdXNlIGBvcGVuQ29uY3VycmVudCgpYCBpbnN0ZWFkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byBkYXRhYmFzZSBkaXJlY3RvcnlcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvblxuICAgICAqIEByZXR1cm5zIEVtYmVkZGVkRGF0YWJhc2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgb3BlbihwYXRoOiBzdHJpbmcsIGNvbmZpZz86IEVtYmVkZGVkRGF0YWJhc2VDb25maWcpOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBOYXRpdmVCaW5kaW5ncy5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBsZXQgaGFuZGxlO1xuXG4gICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgd2FsX2VuYWJsZWQ6IGNvbmZpZy53YWxFbmFibGVkID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIHdhbF9lbmFibGVkX3NldDogY29uZmlnLndhbEVuYWJsZWQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzeW5jX21vZGU6IGNvbmZpZy5zeW5jTW9kZSA9PT0gJ2Z1bGwnID8gMiA6IChjb25maWcuc3luY01vZGUgPT09ICdub3JtYWwnID8gMSA6IDApLFxuICAgICAgICAgICAgICAgIHN5bmNfbW9kZV9zZXQ6IGNvbmZpZy5zeW5jTW9kZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1lbXRhYmxlX3NpemVfYnl0ZXM6IEJpZ0ludChjb25maWcubWVtdGFibGVTaXplQnl0ZXMgPz8gMCksXG4gICAgICAgICAgICAgICAgZ3JvdXBfY29tbWl0OiBjb25maWcuZ3JvdXBDb21taXQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgZ3JvdXBfY29tbWl0X3NldDogY29uZmlnLmdyb3VwQ29tbWl0ICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGVmYXVsdF9pbmRleF9wb2xpY3k6IDEsIC8vIERlZmF1bHQgdG8gQmFsYW5jZWRcbiAgICAgICAgICAgICAgICBkZWZhdWx0X2luZGV4X3BvbGljeV9zZXQ6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaGFuZGxlID0gYmluZGluZ3Muc29jaGRiX29wZW5fd2l0aF9jb25maWcocGF0aCwgY0NvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3BlbihwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcihgRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgYXQgJHtwYXRofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZERhdGFiYXNlKHBhdGgsIGhhbmRsZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW4gYSBkYXRhYmFzZSBpbiBjb25jdXJyZW50IG1vZGUgZm9yIG11bHRpLXByb2Nlc3Mgd2ViIGFwcGxpY2F0aW9uc1xuICAgICAqIFxuICAgICAqIFRoaXMgbW9kZSBhbGxvd3MgbXVsdGlwbGUgTm9kZS5qcyBwcm9jZXNzZXMgKGUuZy4sIFBNMiBjbHVzdGVyIHdvcmtlcnMsXG4gICAgICogbXVsdGlwbGUgRXhwcmVzcyBpbnN0YW5jZXMpIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2Ugc2ltdWx0YW5lb3VzbHkuXG4gICAgICogXG4gICAgICogRmVhdHVyZXM6XG4gICAgICogLSBMb2NrLWZyZWUgcmVhZHMgd2l0aCB+MTAwbnMgbGF0ZW5jeVxuICAgICAqIC0gTXVsdGktcmVhZGVyLCBzaW5nbGUtd3JpdGVyIGNvb3JkaW5hdGlvblxuICAgICAqIC0gQXV0b21hdGljIHdyaXRlIHNlcmlhbGl6YXRpb25cbiAgICAgKiBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBpbXBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICAgICAqIGltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuICAgICAqIFxuICAgICAqIC8vIE9wZW4gaW4gY29uY3VycmVudCBtb2RlIC0gbXVsdGlwbGUgd29ya2VycyBjYW4gYWNjZXNzXG4gICAgICogY29uc3QgZGIgPSBFbWJlZGRlZERhdGFiYXNlLm9wZW5Db25jdXJyZW50KCcuL3dlYl9kYicpO1xuICAgICAqIFxuICAgICAqIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcbiAgICAgKiBcbiAgICAgKiBhcHAuZ2V0KCcvdXNlci86aWQnLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgKiAgIC8vIE11bHRpcGxlIGNvbmN1cnJlbnQgcmVxdWVzdHMgY2FuIHJlYWQgc2ltdWx0YW5lb3VzbHlcbiAgICAgKiAgIGNvbnN0IGRhdGEgPSBhd2FpdCBkYi5nZXQoQnVmZmVyLmZyb20oYHVzZXI6JHtyZXEucGFyYW1zLmlkfWApKTtcbiAgICAgKiAgIGlmICghZGF0YSkge1xuICAgICAqICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiAnbm90IGZvdW5kJyB9KTtcbiAgICAgKiAgICAgcmV0dXJuO1xuICAgICAqICAgfVxuICAgICAqICAgcmVzLnNlbmQoZGF0YSk7XG4gICAgICogfSk7XG4gICAgICogXG4gICAgICogYXBwLnBvc3QoJy91c2VyLzppZCcsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAqICAgLy8gV3JpdGVzIGFyZSBzZXJpYWxpemVkIGF1dG9tYXRpY2FsbHlcbiAgICAgKiAgIGF3YWl0IGRiLnB1dChCdWZmZXIuZnJvbShgdXNlcjoke3JlcS5wYXJhbXMuaWR9YCksIHJlcS5ib2R5KTtcbiAgICAgKiAgIHJlcy5qc29uKHsgc3RhdHVzOiAnb2snIH0pO1xuICAgICAqIH0pO1xuICAgICAqIFxuICAgICAqIC8vIFN0YXJ0IHdpdGggUE0yIGNsdXN0ZXIgbW9kZTpcbiAgICAgKiAvLyBwbTIgc3RhcnQgYXBwLmpzIC1pIG1heFxuICAgICAqIGFwcC5saXN0ZW4oMzAwMCk7XG4gICAgICogYGBgXG4gICAgICogXG4gICAgICogQHBhcmFtIHBhdGggLSBQYXRoIHRvIGRhdGFiYXNlIGRpcmVjdG9yeVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgY29uY3VycmVudCBtb2RlXG4gICAgICogQHJldHVybnMgRW1iZWRkZWREYXRhYmFzZSBpbnN0YW5jZSBpbiBjb25jdXJyZW50IG1vZGVcbiAgICAgKi9cbiAgICBzdGF0aWMgb3BlbkNvbmN1cnJlbnQocGF0aDogc3RyaW5nLCBvcHRpb25zPzogeyBmYWxsYmFja1RvU3RhbmRhcmQ/OiBib29sZWFuIH0pOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBOYXRpdmVCaW5kaW5ncy5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBjb25zdCBmYWxsYmFja1RvU3RhbmRhcmQgPSBvcHRpb25zPy5mYWxsYmFja1RvU3RhbmRhcmQgPz8gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWJpbmRpbmdzLmlzQ29uY3VycmVudE1vZGVBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgaWYgKGZhbGxiYWNrVG9TdGFuZGFyZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgJ1tTb2NoREJdIENvbmN1cnJlbnQgbW9kZSBub3QgYXZhaWxhYmxlIGluIG5hdGl2ZSBsaWJyYXJ5IChyZXF1aXJlcyB2MC40LjgrKS4gJyArXG4gICAgICAgICAgICAgICAgICAgICdGYWxsaW5nIGJhY2sgdG8gc3RhbmRhcmQgbW9kZS4gRm9yIHByb2R1Y3Rpb24gbXVsdGktcHJvY2VzcyBkZXBsb3ltZW50cywgJyArXG4gICAgICAgICAgICAgICAgICAgICdwbGVhc2UgdXBncmFkZSB0aGUgU29jaERCIG5hdGl2ZSBsaWJyYXJ5LidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IGJpbmRpbmdzLnNvY2hkYl9vcGVuKHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKGBGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZSBhdCAke3BhdGh9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWREYXRhYmFzZShwYXRoLCBoYW5kbGUsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKFxuICAgICAgICAgICAgICAgICdDb25jdXJyZW50IG1vZGUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVwZ3JhZGUgdGhlIFNvY2hEQiBuYXRpdmUgbGlicmFyeSB0byB2MC40LjgrICcgK1xuICAgICAgICAgICAgICAgICdvciB1c2Ugb3BlbkNvbmN1cnJlbnQocGF0aCwgeyBmYWxsYmFja1RvU3RhbmRhcmQ6IHRydWUgfSkgdG8gZmFsbCBiYWNrIHRvIHN0YW5kYXJkIG1vZGUuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IGJpbmRpbmdzLnNvY2hkYl9vcGVuX2NvbmN1cnJlbnQocGF0aCk7XG4gICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcihgRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgaW4gY29uY3VycmVudCBtb2RlIGF0ICR7cGF0aH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzQ29uY3VycmVudCA9IGJpbmRpbmdzLnNvY2hkYl9pc19jb25jdXJyZW50Py4oaGFuZGxlKSA9PT0gMTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZERhdGFiYXNlKHBhdGgsIGhhbmRsZSwgaXNDb25jdXJyZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgZGF0YWJhc2UgaXMgb3BlbmVkIGluIGNvbmN1cnJlbnQgbW9kZVxuICAgICAqL1xuICAgIGdldCBpc0NvbmN1cnJlbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgY29uY3VycmVudCBtb2RlIGZlbGwgYmFjayB0byBzdGFuZGFyZCBtb2RlXG4gICAgICovXG4gICAgZ2V0IGlzQ29uY3VycmVudEZhbGxiYWNrKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uY3VycmVudE1vZGVGYWxsYmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBjb25jdXJyZW50IG1vZGUgaXMgYXZhaWxhYmxlIGluIHRoZSBuYXRpdmUgbGlicmFyeVxuICAgICAqL1xuICAgIHN0YXRpYyBpc0NvbmN1cnJlbnRNb2RlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKS5pc0NvbmN1cnJlbnRNb2RlQXZhaWxhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHV0IGEga2V5LXZhbHVlIHBhaXIgKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgcHV0KGtleTogQnVmZmVyLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5wdXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgdmFsdWUgYnkga2V5IChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIGdldChrZXk6IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHR4bi5nZXQoa2V5KTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYSBrZXkgKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlKGtleTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQdXQgdmFsdWUgYXQgcGF0aCAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBwdXRQYXRoKHBhdGg6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4ucHV0UGF0aChwYXRoLCB2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHZhbHVlIGF0IHBhdGggKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UGF0aChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0eG4uZ2V0UGF0aChwYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTY2FuIGtleXMgd2l0aCBwcmVmaXhcbiAgICAgKi9cbiAgICBhc3luYyAqc2NhblByZWZpeChwcmVmaXg6IEJ1ZmZlcik6IEFzeW5jR2VuZXJhdG9yPFtCdWZmZXIsIEJ1ZmZlcl0+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBlbnRyeSBvZiB0eG4uc2NhblByZWZpeChwcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgZW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmVnaW4gYSB0cmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uKCk6IEVtYmVkZGVkVHJhbnNhY3Rpb24ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG5IYW5kbGUgPSB0aGlzLmJpbmRpbmdzLnNvY2hkYl9iZWdpbl90eG4odGhpcy5oYW5kbGUpO1xuICAgICAgICByZXR1cm4gbmV3IEVtYmVkZGVkVHJhbnNhY3Rpb24odGhpcywgdGhpcy5oYW5kbGUsIHR4bkhhbmRsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBvcGVyYXRpb25zIHdpdGhpbiBhIHRyYW5zYWN0aW9uICh3aXRoIGF1dG8tY29tbWl0L2Fib3J0KVxuICAgICAqL1xuICAgIGFzeW5jIHdpdGhUcmFuc2FjdGlvbjxUPihmbjogKHR4bjogRW1iZWRkZWRUcmFuc2FjdGlvbikgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbih0eG4pO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZSBhIGNoZWNrcG9pbnRcbiAgICAgKi9cbiAgICBhc3luYyBjaGVja3BvaW50KCk6IFByb21pc2U8YmlnaW50PiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgICAgICBjb25zdCBsc24gPSB0aGlzLmJpbmRpbmdzLnNvY2hkYl9jaGVja3BvaW50KHRoaXMuaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIEJpZ0ludChsc24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzdG9yYWdlIHN0YXRpc3RpY3NcbiAgICAgKi9cbiAgICBhc3luYyBzdGF0cygpOiBQcm9taXNlPHtcbiAgICAgICAgbWVtdGFibGVTaXplQnl0ZXM6IGJpZ2ludDtcbiAgICAgICAgd2FsU2l6ZUJ5dGVzOiBiaWdpbnQ7XG4gICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgICAgICBtaW5BY3RpdmVTbmFwc2hvdDogYmlnaW50O1xuICAgICAgICBsYXN0Q2hlY2twb2ludExzbjogYmlnaW50O1xuICAgIH0+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgLy8gUmV0dXJucyBzdHJ1Y3QgYnkgdmFsdWUgKGF1dG9tYXRpY2FsbHkgZGVjb2RlZClcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLmJpbmRpbmdzLnNvY2hkYl9zdGF0cyh0aGlzLmhhbmRsZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbWVtdGFibGVTaXplQnl0ZXM6IEJpZ0ludChzdGF0cy5tZW10YWJsZV9zaXplX2J5dGVzKSxcbiAgICAgICAgICAgIHdhbFNpemVCeXRlczogQmlnSW50KHN0YXRzLndhbF9zaXplX2J5dGVzKSxcbiAgICAgICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uczogc3RhdHMuYWN0aXZlX3RyYW5zYWN0aW9ucyxcbiAgICAgICAgICAgIG1pbkFjdGl2ZVNuYXBzaG90OiBCaWdJbnQoc3RhdHMubWluX2FjdGl2ZV9zbmFwc2hvdCksXG4gICAgICAgICAgICBsYXN0Q2hlY2twb2ludExzbjogQmlnSW50KHN0YXRzLmxhc3RfY2hlY2twb2ludF9sc24pLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIGRhdGFiYXNlXG4gICAgICovXG4gICAgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3Muc29jaGRiX2Nsb3NlKHRoaXMuaGFuZGxlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZW5zdXJlT3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcignRGF0YWJhc2UgaXMgY2xvc2VkJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW50ZXJuYWwgaGFuZGxlIChmb3IgdHJhbnNhY3Rpb25zKVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldEhhbmRsZSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJpbmRpbmdzIGluc3RhbmNlIChmb3IgdHJhbnNhY3Rpb25zKVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldEJpbmRpbmdzKCk6IE5hdGl2ZUJpbmRpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmluZGluZ3M7XG4gICAgfVxufVxuIl19
@@ -36,18 +36,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.NativeBindings = void 0;
37
37
  const koffi = __importStar(require("koffi"));
38
38
  const library_finder_1 = require("./library-finder");
39
- // Opaque pointer types
40
- const DatabaseHandle = koffi.pointer('DatabaseHandle', koffi.opaque());
41
- const IteratorHandle = koffi.pointer('IteratorHandle', koffi.opaque());
39
+ // Opaque pointer types - wrap in function to handle duplicates
40
+ function definePointerType(name) {
41
+ try {
42
+ return koffi.pointer(name, koffi.opaque());
43
+ }
44
+ catch (e) {
45
+ // Type already defined in test environment, return undefined
46
+ // koffi will still recognize the type name in function signatures
47
+ return undefined;
48
+ }
49
+ }
50
+ function defineStructType(name, fields) {
51
+ try {
52
+ return koffi.struct(name, fields);
53
+ }
54
+ catch (e) {
55
+ // Type already defined in test environment, return undefined
56
+ return undefined;
57
+ }
58
+ }
59
+ const DatabaseHandle = definePointerType('DatabaseHandle');
60
+ const IteratorHandle = definePointerType('IteratorHandle');
42
61
  // Structs
43
- const Stats = koffi.struct('Stats', {
62
+ const Stats = defineStructType('Stats', {
44
63
  memtable_size_bytes: 'size_t',
45
64
  wal_size_bytes: 'size_t',
46
65
  active_transactions: 'uint32',
47
66
  min_active_snapshot: 'uint64',
48
67
  last_checkpoint_lsn: 'uint64'
49
68
  });
50
- const DatabaseConfig = koffi.struct('DatabaseConfig', {
69
+ const DatabaseConfig = defineStructType('DatabaseConfig', {
51
70
  wal_enabled: 'bool',
52
71
  wal_enabled_set: 'bool',
53
72
  sync_mode: 'uint8',
@@ -58,17 +77,18 @@ const DatabaseConfig = koffi.struct('DatabaseConfig', {
58
77
  default_index_policy: 'uint8',
59
78
  default_index_policy_set: 'bool'
60
79
  });
61
- const TxnHandle = koffi.struct('TxnHandle', {
80
+ const TxnHandle = defineStructType('TxnHandle', {
62
81
  txn_id: 'uint64',
63
82
  snapshot_ts: 'uint64'
64
83
  });
65
- const CommitResult = koffi.struct('CommitResult', {
84
+ const CommitResult = defineStructType('CommitResult', {
66
85
  commit_ts: 'uint64',
67
86
  error_code: 'int32'
68
87
  });
69
88
  class NativeBindings {
70
89
  static instance;
71
90
  lib;
91
+ _concurrentModeAvailable = false;
72
92
  // FFIs
73
93
  sochdb_open;
74
94
  sochdb_open_with_config;
@@ -115,11 +135,13 @@ class NativeBindings {
115
135
  try {
116
136
  this.sochdb_open_concurrent = this.lib.func('sochdb_open_concurrent', DatabaseHandle, ['string']);
117
137
  this.sochdb_is_concurrent = this.lib.func('sochdb_is_concurrent', 'int', [DatabaseHandle]);
138
+ this._concurrentModeAvailable = true;
118
139
  }
119
140
  catch (error) {
120
141
  // Older library versions don't have concurrent mode
121
142
  this.sochdb_open_concurrent = null;
122
143
  this.sochdb_is_concurrent = null;
144
+ this._concurrentModeAvailable = false;
123
145
  }
124
146
  this.sochdb_close = this.lib.func('sochdb_close', 'void', [DatabaseHandle]);
125
147
  // Transactions
@@ -149,6 +171,12 @@ class NativeBindings {
149
171
  }
150
172
  return NativeBindings.instance;
151
173
  }
174
+ /**
175
+ * Check if concurrent mode is available in the native library
176
+ */
177
+ isConcurrentModeAvailable() {
178
+ return this._concurrentModeAvailable;
179
+ }
152
180
  }
153
181
  exports.NativeBindings = NativeBindings;
154
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluZGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW1iZWRkZWQvZmZpL2JpbmRpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixxREFBK0M7QUFFL0MsdUJBQXVCO0FBQ3ZCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDdkUsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUV2RSxVQUFVO0FBQ1YsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7SUFDaEMsbUJBQW1CLEVBQUUsUUFBUTtJQUM3QixjQUFjLEVBQUUsUUFBUTtJQUN4QixtQkFBbUIsRUFBRSxRQUFRO0lBQzdCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsbUJBQW1CLEVBQUUsUUFBUTtDQUNoQyxDQUFDLENBQUM7QUFFSCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO0lBQ2xELFdBQVcsRUFBRSxNQUFNO0lBQ25CLGVBQWUsRUFBRSxNQUFNO0lBQ3ZCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLGFBQWEsRUFBRSxNQUFNO0lBQ3JCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsWUFBWSxFQUFFLE1BQU07SUFDcEIsZ0JBQWdCLEVBQUUsTUFBTTtJQUN4QixvQkFBb0IsRUFBRSxPQUFPO0lBQzdCLHdCQUF3QixFQUFFLE1BQU07Q0FDbkMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUU7SUFDeEMsTUFBTSxFQUFFLFFBQVE7SUFDaEIsV0FBVyxFQUFFLFFBQVE7Q0FDeEIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUU7SUFDOUMsU0FBUyxFQUFFLFFBQVE7SUFDbkIsVUFBVSxFQUFFLE9BQU87Q0FDdEIsQ0FBQyxDQUFDO0FBRUgsTUFBYSxjQUFjO0lBQ2YsTUFBTSxDQUFDLFFBQVEsQ0FBaUI7SUFDaEMsR0FBRyxDQUFNO0lBRWpCLE9BQU87SUFDQSxXQUFXLENBQU07SUFDakIsdUJBQXVCLENBQU07SUFDN0Isc0JBQXNCLENBQU07SUFDNUIsb0JBQW9CLENBQU07SUFDMUIsWUFBWSxDQUFNO0lBRXpCLHNEQUFzRDtJQUMvQyxnQkFBZ0IsQ0FBTTtJQUN0QixhQUFhLENBQU07SUFDbkIsWUFBWSxDQUFNO0lBRXpCLHdEQUF3RDtJQUN4RCw4Q0FBOEM7SUFDdkMsVUFBVSxDQUFNO0lBQ3ZCLHVEQUF1RDtJQUNoRCxVQUFVLENBQU07SUFDdkIsc0NBQXNDO0lBQy9CLGFBQWEsQ0FBTTtJQUUxQixrQkFBa0I7SUFDWCxlQUFlLENBQU07SUFDckIsZUFBZSxDQUFNO0lBRTVCLFdBQVc7SUFDSixrQkFBa0IsQ0FBTTtJQUN4QixvQkFBb0IsQ0FBTTtJQUMxQixxQkFBcUIsQ0FBTTtJQUVsQyxRQUFRO0lBQ0QsWUFBWSxDQUFNO0lBQ2xCLGlCQUFpQixDQUFNO0lBRTlCLFNBQVM7SUFDRixpQkFBaUIsQ0FBTTtJQUU5QjtRQUNJLE1BQU0sT0FBTyxHQUFHLElBQUEsNEJBQVcsR0FBRSxDQUFDO1FBQzlCLElBQUksQ0FBQztZQUNELElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxPQUFPLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RSxNQUFNLEtBQUssQ0FBQztRQUNoQixDQUFDO1FBRUQsc0JBQXNCO1FBRXRCLGdCQUFnQjtRQUNoQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxjQUFjLEVBQUUsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUVwSCw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDO1lBQ0QsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbEcsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEtBQUssRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixvREFBb0Q7WUFDcEQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztZQUNuQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQ3JDLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBRTVFLGVBQWU7UUFDZixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUV0RixnQkFBZ0I7UUFDaEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzFILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUssSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUU1RyxrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxjQUFjLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUMxSCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5SyxXQUFXO1FBQ1gsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLGNBQWMsRUFBRSxDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDL0gsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdk8sSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFekYscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEtBQUssRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFckYsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRU0sTUFBTSxDQUFDLFdBQVc7UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzQixjQUFjLENBQUMsUUFBUSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkQsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDLFFBQVEsQ0FBQztJQUNuQyxDQUFDO0NBQ0o7QUFwR0Qsd0NBb0dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMga29mZmkgZnJvbSAna29mZmknO1xuaW1wb3J0IHsgZmluZExpYnJhcnkgfSBmcm9tICcuL2xpYnJhcnktZmluZGVyJztcblxuLy8gT3BhcXVlIHBvaW50ZXIgdHlwZXNcbmNvbnN0IERhdGFiYXNlSGFuZGxlID0ga29mZmkucG9pbnRlcignRGF0YWJhc2VIYW5kbGUnLCBrb2ZmaS5vcGFxdWUoKSk7XG5jb25zdCBJdGVyYXRvckhhbmRsZSA9IGtvZmZpLnBvaW50ZXIoJ0l0ZXJhdG9ySGFuZGxlJywga29mZmkub3BhcXVlKCkpO1xuXG4vLyBTdHJ1Y3RzXG5jb25zdCBTdGF0cyA9IGtvZmZpLnN0cnVjdCgnU3RhdHMnLCB7XG4gICAgbWVtdGFibGVfc2l6ZV9ieXRlczogJ3NpemVfdCcsXG4gICAgd2FsX3NpemVfYnl0ZXM6ICdzaXplX3QnLFxuICAgIGFjdGl2ZV90cmFuc2FjdGlvbnM6ICd1aW50MzInLFxuICAgIG1pbl9hY3RpdmVfc25hcHNob3Q6ICd1aW50NjQnLFxuICAgIGxhc3RfY2hlY2twb2ludF9sc246ICd1aW50NjQnXG59KTtcblxuY29uc3QgRGF0YWJhc2VDb25maWcgPSBrb2ZmaS5zdHJ1Y3QoJ0RhdGFiYXNlQ29uZmlnJywge1xuICAgIHdhbF9lbmFibGVkOiAnYm9vbCcsXG4gICAgd2FsX2VuYWJsZWRfc2V0OiAnYm9vbCcsXG4gICAgc3luY19tb2RlOiAndWludDgnLFxuICAgIHN5bmNfbW9kZV9zZXQ6ICdib29sJyxcbiAgICBtZW10YWJsZV9zaXplX2J5dGVzOiAndWludDY0JyxcbiAgICBncm91cF9jb21taXQ6ICdib29sJyxcbiAgICBncm91cF9jb21taXRfc2V0OiAnYm9vbCcsXG4gICAgZGVmYXVsdF9pbmRleF9wb2xpY3k6ICd1aW50OCcsXG4gICAgZGVmYXVsdF9pbmRleF9wb2xpY3lfc2V0OiAnYm9vbCdcbn0pO1xuXG5jb25zdCBUeG5IYW5kbGUgPSBrb2ZmaS5zdHJ1Y3QoJ1R4bkhhbmRsZScsIHtcbiAgICB0eG5faWQ6ICd1aW50NjQnLFxuICAgIHNuYXBzaG90X3RzOiAndWludDY0J1xufSk7XG5cbmNvbnN0IENvbW1pdFJlc3VsdCA9IGtvZmZpLnN0cnVjdCgnQ29tbWl0UmVzdWx0Jywge1xuICAgIGNvbW1pdF90czogJ3VpbnQ2NCcsXG4gICAgZXJyb3JfY29kZTogJ2ludDMyJ1xufSk7XG5cbmV4cG9ydCBjbGFzcyBOYXRpdmVCaW5kaW5ncyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE5hdGl2ZUJpbmRpbmdzO1xuICAgIHByaXZhdGUgbGliOiBhbnk7XG5cbiAgICAvLyBGRklzXG4gICAgcHVibGljIHNvY2hkYl9vcGVuOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9vcGVuX3dpdGhfY29uZmlnOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9vcGVuX2NvbmN1cnJlbnQ6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2lzX2NvbmN1cnJlbnQ6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2Nsb3NlOiBhbnk7XG5cbiAgICAvLyBUcmFuc2FjdGlvbmFsIE9wZXJhdGlvbnMgKG1hcHBlZCB0byBiYXNlIGZ1bmN0aW9ucylcbiAgICBwdWJsaWMgc29jaGRiX2JlZ2luX3R4bjogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfY29tbWl0OiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9hYm9ydDogYW55O1xuXG4gICAgLy8gS1YgT3BlcmF0aW9ucyAoQWxsIHRha2UgRGF0YWJhc2VIYW5kbGUgQU5EIFR4bkhhbmRsZSlcbiAgICAvLyBwdXQ6IChkYiwgdHhuLCBrZXksIGtsZW4sIHZhbCwgdmxlbikgLT4gaW50XG4gICAgcHVibGljIHNvY2hkYl9wdXQ6IGFueTtcbiAgICAvLyBnZXQ6IChkYiwgdHhuLCBrZXksIGtsZW4sIHZhbF9vdXQqLCBsZW5fb3V0KikgLT4gaW50XG4gICAgcHVibGljIHNvY2hkYl9nZXQ6IGFueTtcbiAgICAvLyBkZWxldGU6IChkYiwgdHhuLCBrZXksIGtsZW4pIC0+IGludFxuICAgIHB1YmxpYyBzb2NoZGJfZGVsZXRlOiBhbnk7XG5cbiAgICAvLyBQYXRoIE9wZXJhdGlvbnNcbiAgICBwdWJsaWMgc29jaGRiX3B1dF9wYXRoOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9nZXRfcGF0aDogYW55O1xuXG4gICAgLy8gU2Nhbm5pbmdcbiAgICBwdWJsaWMgc29jaGRiX3NjYW5fcHJlZml4OiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9pdGVyYXRvcl9uZXh0OiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9pdGVyYXRvcl9jbG9zZTogYW55O1xuXG4gICAgLy8gU3RhdHNcbiAgICBwdWJsaWMgc29jaGRiX3N0YXRzOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9jaGVja3BvaW50OiBhbnk7XG5cbiAgICAvLyBNZW1vcnlcbiAgICBwdWJsaWMgc29jaGRiX2ZyZWVfYnl0ZXM6IGFueTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGNvbnN0IGxpYlBhdGggPSBmaW5kTGlicmFyeSgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5saWIgPSBrb2ZmaS5sb2FkKGxpYlBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBTb2NoREIgbGlicmFyeSBmcm9tICR7bGliUGF0aH06YCwgZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsaXplIGJpbmRpbmdzXG5cbiAgICAgICAgLy8gREIgTWFuYWdlbWVudFxuICAgICAgICB0aGlzLnNvY2hkYl9vcGVuID0gdGhpcy5saWIuZnVuYygnc29jaGRiX29wZW4nLCBEYXRhYmFzZUhhbmRsZSwgWydzdHJpbmcnXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX29wZW5fd2l0aF9jb25maWcgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfb3Blbl93aXRoX2NvbmZpZycsIERhdGFiYXNlSGFuZGxlLCBbJ3N0cmluZycsIERhdGFiYXNlQ29uZmlnXSk7XG4gICAgICAgIFxuICAgICAgICAvLyBDb25jdXJyZW50IG1vZGUgKHYwLjQuOCspXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnNvY2hkYl9vcGVuX2NvbmN1cnJlbnQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfb3Blbl9jb25jdXJyZW50JywgRGF0YWJhc2VIYW5kbGUsIFsnc3RyaW5nJ10pO1xuICAgICAgICAgICAgdGhpcy5zb2NoZGJfaXNfY29uY3VycmVudCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9pc19jb25jdXJyZW50JywgJ2ludCcsIFtEYXRhYmFzZUhhbmRsZV0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gT2xkZXIgbGlicmFyeSB2ZXJzaW9ucyBkb24ndCBoYXZlIGNvbmN1cnJlbnQgbW9kZVxuICAgICAgICAgICAgdGhpcy5zb2NoZGJfb3Blbl9jb25jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc29jaGRiX2lzX2NvbmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLnNvY2hkYl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jbG9zZScsICd2b2lkJywgW0RhdGFiYXNlSGFuZGxlXSk7XG5cbiAgICAgICAgLy8gVHJhbnNhY3Rpb25zXG4gICAgICAgIHRoaXMuc29jaGRiX2JlZ2luX3R4biA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9iZWdpbl90eG4nLCBUeG5IYW5kbGUsIFtEYXRhYmFzZUhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9jb21taXQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfY29tbWl0JywgQ29tbWl0UmVzdWx0LCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9hYm9ydCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9hYm9ydCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuXG4gICAgICAgIC8vIEtWIE9wZXJhdGlvbnNcbiAgICAgICAgdGhpcy5zb2NoZGJfcHV0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX3B1dCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCAndWludDgqJywgJ3NpemVfdCddKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfZ2V0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX2dldCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcigndWludDgqJykpLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcignc2l6ZV90JykpXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2RlbGV0ZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9kZWxldGUnLCAnaW50JywgW0RhdGFiYXNlSGFuZGxlLCBUeG5IYW5kbGUsICd1aW50OConLCAnc2l6ZV90J10pO1xuXG4gICAgICAgIC8vIFBhdGggT3BlcmF0aW9uc1xuICAgICAgICB0aGlzLnNvY2hkYl9wdXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9wdXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsICd1aW50OConLCAnc2l6ZV90J10pO1xuICAgICAgICB0aGlzLnNvY2hkYl9nZXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9nZXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCd1aW50OConKSksIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCdzaXplX3QnKSldKTtcblxuICAgICAgICAvLyBTY2FubmluZ1xuICAgICAgICB0aGlzLnNvY2hkYl9zY2FuX3ByZWZpeCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX3ByZWZpeCcsIEl0ZXJhdG9ySGFuZGxlLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2l0ZXJhdG9yX25leHQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfc2Nhbl9uZXh0JywgJ2ludCcsIFtJdGVyYXRvckhhbmRsZSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9pdGVyYXRvcl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX2ZyZWUnLCAndm9pZCcsIFtJdGVyYXRvckhhbmRsZV0pO1xuXG4gICAgICAgIC8vIFN0YXRzICYgQ2hlY2twb2ludFxuICAgICAgICB0aGlzLnNvY2hkYl9zdGF0cyA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zdGF0cycsIFN0YXRzLCBbRGF0YWJhc2VIYW5kbGVdKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfY2hlY2twb2ludCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jaGVja3BvaW50JywgJ2ludCcsIFtEYXRhYmFzZUhhbmRsZV0pO1xuXG4gICAgICAgIC8vIE1lbW9yeSBNYW5hZ2VtZW50XG4gICAgICAgIHRoaXMuc29jaGRiX2ZyZWVfYnl0ZXMgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfZnJlZV9ieXRlcycsICd2b2lkJywgWyd1aW50OConLCAnc2l6ZV90J10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogTmF0aXZlQmluZGluZ3Mge1xuICAgICAgICBpZiAoIU5hdGl2ZUJpbmRpbmdzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZSA9IG5ldyBOYXRpdmVCaW5kaW5ncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZTtcbiAgICB9XG59XG4iXX0=
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluZGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZW1iZWRkZWQvZmZpL2JpbmRpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixxREFBK0M7QUFFL0MsK0RBQStEO0FBQy9ELFNBQVMsaUJBQWlCLENBQUMsSUFBWTtJQUNyQyxJQUFJLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsNkRBQTZEO1FBQzdELGtFQUFrRTtRQUNsRSxPQUFPLFNBQWdCLENBQUM7SUFDMUIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLElBQVksRUFBRSxNQUFXO0lBQ2pELElBQUksQ0FBQztRQUNILE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCw2REFBNkQ7UUFDN0QsT0FBTyxTQUFnQixDQUFDO0lBQzFCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUMzRCxNQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTNELFVBQVU7QUFDVixNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7SUFDcEMsbUJBQW1CLEVBQUUsUUFBUTtJQUM3QixjQUFjLEVBQUUsUUFBUTtJQUN4QixtQkFBbUIsRUFBRSxRQUFRO0lBQzdCLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsbUJBQW1CLEVBQUUsUUFBUTtDQUNoQyxDQUFDLENBQUM7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R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBrb2ZmaSBmcm9tICdrb2ZmaSc7XG5pbXBvcnQgeyBmaW5kTGlicmFyeSB9IGZyb20gJy4vbGlicmFyeS1maW5kZXInO1xuXG4vLyBPcGFxdWUgcG9pbnRlciB0eXBlcyAtIHdyYXAgaW4gZnVuY3Rpb24gdG8gaGFuZGxlIGR1cGxpY2F0ZXNcbmZ1bmN0aW9uIGRlZmluZVBvaW50ZXJUeXBlKG5hbWU6IHN0cmluZykge1xuICB0cnkge1xuICAgIHJldHVybiBrb2ZmaS5wb2ludGVyKG5hbWUsIGtvZmZpLm9wYXF1ZSgpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFR5cGUgYWxyZWFkeSBkZWZpbmVkIGluIHRlc3QgZW52aXJvbm1lbnQsIHJldHVybiB1bmRlZmluZWRcbiAgICAvLyBrb2ZmaSB3aWxsIHN0aWxsIHJlY29nbml6ZSB0aGUgdHlwZSBuYW1lIGluIGZ1bmN0aW9uIHNpZ25hdHVyZXNcbiAgICByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZpbmVTdHJ1Y3RUeXBlKG5hbWU6IHN0cmluZywgZmllbGRzOiBhbnkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4ga29mZmkuc3RydWN0KG5hbWUsIGZpZWxkcyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUeXBlIGFscmVhZHkgZGVmaW5lZCBpbiB0ZXN0IGVudmlyb25tZW50LCByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gIH1cbn1cblxuY29uc3QgRGF0YWJhc2VIYW5kbGUgPSBkZWZpbmVQb2ludGVyVHlwZSgnRGF0YWJhc2VIYW5kbGUnKTtcbmNvbnN0IEl0ZXJhdG9ySGFuZGxlID0gZGVmaW5lUG9pbnRlclR5cGUoJ0l0ZXJhdG9ySGFuZGxlJyk7XG5cbi8vIFN0cnVjdHNcbmNvbnN0IFN0YXRzID0gZGVmaW5lU3RydWN0VHlwZSgnU3RhdHMnLCB7XG4gICAgbWVtdGFibGVfc2l6ZV9ieXRlczogJ3NpemVfdCcsXG4gICAgd2FsX3NpemVfYnl0ZXM6ICdzaXplX3QnLFxuICAgIGFjdGl2ZV90cmFuc2FjdGlvbnM6ICd1aW50MzInLFxuICAgIG1pbl9hY3RpdmVfc25hcHNob3Q6ICd1aW50NjQnLFxuICAgIGxhc3RfY2hlY2twb2ludF9sc246ICd1aW50NjQnXG59KTtcblxuY29uc3QgRGF0YWJhc2VDb25maWcgPSBkZWZpbmVTdHJ1Y3RUeXBlKCdEYXRhYmFzZUNvbmZpZycsIHtcbiAgICB3YWxfZW5hYmxlZDogJ2Jvb2wnLFxuICAgIHdhbF9lbmFibGVkX3NldDogJ2Jvb2wnLFxuICAgIHN5bmNfbW9kZTogJ3VpbnQ4JyxcbiAgICBzeW5jX21vZGVfc2V0OiAnYm9vbCcsXG4gICAgbWVtdGFibGVfc2l6ZV9ieXRlczogJ3VpbnQ2NCcsXG4gICAgZ3JvdXBfY29tbWl0OiAnYm9vbCcsXG4gICAgZ3JvdXBfY29tbWl0X3NldDogJ2Jvb2wnLFxuICAgIGRlZmF1bHRfaW5kZXhfcG9saWN5OiAndWludDgnLFxuICAgIGRlZmF1bHRfaW5kZXhfcG9saWN5X3NldDogJ2Jvb2wnXG59KTtcblxuY29uc3QgVHhuSGFuZGxlID0gZGVmaW5lU3RydWN0VHlwZSgnVHhuSGFuZGxlJywge1xuICAgIHR4bl9pZDogJ3VpbnQ2NCcsXG4gICAgc25hcHNob3RfdHM6ICd1aW50NjQnXG59KTtcblxuY29uc3QgQ29tbWl0UmVzdWx0ID0gZGVmaW5lU3RydWN0VHlwZSgnQ29tbWl0UmVzdWx0Jywge1xuICAgIGNvbW1pdF90czogJ3VpbnQ2NCcsXG4gICAgZXJyb3JfY29kZTogJ2ludDMyJ1xufSk7XG5cbmV4cG9ydCBjbGFzcyBOYXRpdmVCaW5kaW5ncyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE5hdGl2ZUJpbmRpbmdzO1xuICAgIHByaXZhdGUgbGliOiBhbnk7XG4gICAgcHJpdmF0ZSBfY29uY3VycmVudE1vZGVBdmFpbGFibGUgPSBmYWxzZTtcblxuICAgIC8vIEZGSXNcbiAgICBwdWJsaWMgc29jaGRiX29wZW46IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX29wZW5fd2l0aF9jb25maWc6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX29wZW5fY29uY3VycmVudDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfaXNfY29uY3VycmVudDogYW55O1xuICAgIHB1YmxpYyBzb2NoZGJfY2xvc2U6IGFueTtcblxuICAgIC8vIFRyYW5zYWN0aW9uYWwgT3BlcmF0aW9ucyAobWFwcGVkIHRvIGJhc2UgZnVuY3Rpb25zKVxuICAgIHB1YmxpYyBzb2NoZGJfYmVnaW5fdHhuOiBhbnk7XG4gICAgcHVibGljIHNvY2hkYl9jb21taXQ6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2Fib3J0OiBhbnk7XG5cbiAgICAvLyBLViBPcGVyYXRpb25zIChBbGwgdGFrZSBEYXRhYmFzZUhhbmRsZSBBTkQgVHhuSGFuZGxlKVxuICAgIC8vIHB1dDogKGRiLCB0eG4sIGtleSwga2xlbiwgdmFsLCB2bGVuKSAtPiBpbnRcbiAgICBwdWJsaWMgc29jaGRiX3B1dDogYW55O1xuICAgIC8vIGdldDogKGRiLCB0eG4sIGtleSwga2xlbiwgdmFsX291dCosIGxlbl9vdXQqKSAtPiBpbnRcbiAgICBwdWJsaWMgc29jaGRiX2dldDogYW55O1xuICAgIC8vIGRlbGV0ZTogKGRiLCB0eG4sIGtleSwga2xlbikgLT4gaW50XG4gICAgcHVibGljIHNvY2hkYl9kZWxldGU6IGFueTtcblxuICAgIC8vIFBhdGggT3BlcmF0aW9uc1xuICAgIHB1YmxpYyBzb2NoZGJfcHV0X3BhdGg6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2dldF9wYXRoOiBhbnk7XG5cbiAgICAvLyBTY2FubmluZ1xuICAgIHB1YmxpYyBzb2NoZGJfc2Nhbl9wcmVmaXg6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2l0ZXJhdG9yX25leHQ6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2l0ZXJhdG9yX2Nsb3NlOiBhbnk7XG5cbiAgICAvLyBTdGF0c1xuICAgIHB1YmxpYyBzb2NoZGJfc3RhdHM6IGFueTtcbiAgICBwdWJsaWMgc29jaGRiX2NoZWNrcG9pbnQ6IGFueTtcblxuICAgIC8vIE1lbW9yeVxuICAgIHB1YmxpYyBzb2NoZGJfZnJlZV9ieXRlczogYW55O1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgbGliUGF0aCA9IGZpbmRMaWJyYXJ5KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmxpYiA9IGtvZmZpLmxvYWQobGliUGF0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBsb2FkIFNvY2hEQiBsaWJyYXJ5IGZyb20gJHtsaWJQYXRofTpgLCBlcnJvcik7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXRpYWxpemUgYmluZGluZ3NcblxuICAgICAgICAvLyBEQiBNYW5hZ2VtZW50XG4gICAgICAgIHRoaXMuc29jaGRiX29wZW4gPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfb3BlbicsIERhdGFiYXNlSGFuZGxlLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfb3Blbl93aXRoX2NvbmZpZyA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9vcGVuX3dpdGhfY29uZmlnJywgRGF0YWJhc2VIYW5kbGUsIFsnc3RyaW5nJywgRGF0YWJhc2VDb25maWddKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENvbmN1cnJlbnQgbW9kZSAodjAuNC44KylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc29jaGRiX29wZW5fY29uY3VycmVudCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9vcGVuX2NvbmN1cnJlbnQnLCBEYXRhYmFzZUhhbmRsZSwgWydzdHJpbmcnXSk7XG4gICAgICAgICAgICB0aGlzLnNvY2hkYl9pc19jb25jdXJyZW50ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX2lzX2NvbmN1cnJlbnQnLCAnaW50JywgW0RhdGFiYXNlSGFuZGxlXSk7XG4gICAgICAgICAgICB0aGlzLl9jb25jdXJyZW50TW9kZUF2YWlsYWJsZSA9IHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBPbGRlciBsaWJyYXJ5IHZlcnNpb25zIGRvbid0IGhhdmUgY29uY3VycmVudCBtb2RlXG4gICAgICAgICAgICB0aGlzLnNvY2hkYl9vcGVuX2NvbmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zb2NoZGJfaXNfY29uY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jb25jdXJyZW50TW9kZUF2YWlsYWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLnNvY2hkYl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jbG9zZScsICd2b2lkJywgW0RhdGFiYXNlSGFuZGxlXSk7XG5cbiAgICAgICAgLy8gVHJhbnNhY3Rpb25zXG4gICAgICAgIHRoaXMuc29jaGRiX2JlZ2luX3R4biA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9iZWdpbl90eG4nLCBUeG5IYW5kbGUsIFtEYXRhYmFzZUhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9jb21taXQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfY29tbWl0JywgQ29tbWl0UmVzdWx0LCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9hYm9ydCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9hYm9ydCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZV0pO1xuXG4gICAgICAgIC8vIEtWIE9wZXJhdGlvbnNcbiAgICAgICAgdGhpcy5zb2NoZGJfcHV0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX3B1dCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCAndWludDgqJywgJ3NpemVfdCddKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfZ2V0ID0gdGhpcy5saWIuZnVuYygnc29jaGRiX2dldCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcigndWludDgqJykpLCBrb2ZmaS5vdXQoa29mZmkucG9pbnRlcignc2l6ZV90JykpXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2RlbGV0ZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9kZWxldGUnLCAnaW50JywgW0RhdGFiYXNlSGFuZGxlLCBUeG5IYW5kbGUsICd1aW50OConLCAnc2l6ZV90J10pO1xuXG4gICAgICAgIC8vIFBhdGggT3BlcmF0aW9uc1xuICAgICAgICB0aGlzLnNvY2hkYl9wdXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9wdXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsICd1aW50OConLCAnc2l6ZV90J10pO1xuICAgICAgICB0aGlzLnNvY2hkYl9nZXRfcGF0aCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9nZXRfcGF0aCcsICdpbnQnLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3N0cmluZycsIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCd1aW50OConKSksIGtvZmZpLm91dChrb2ZmaS5wb2ludGVyKCdzaXplX3QnKSldKTtcblxuICAgICAgICAvLyBTY2FubmluZ1xuICAgICAgICB0aGlzLnNvY2hkYl9zY2FuX3ByZWZpeCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX3ByZWZpeCcsIEl0ZXJhdG9ySGFuZGxlLCBbRGF0YWJhc2VIYW5kbGUsIFR4bkhhbmRsZSwgJ3VpbnQ4KicsICdzaXplX3QnXSk7XG4gICAgICAgIHRoaXMuc29jaGRiX2l0ZXJhdG9yX25leHQgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfc2Nhbl9uZXh0JywgJ2ludCcsIFtJdGVyYXRvckhhbmRsZSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3VpbnQ4KicpKSwga29mZmkub3V0KGtvZmZpLnBvaW50ZXIoJ3NpemVfdCcpKV0pO1xuICAgICAgICB0aGlzLnNvY2hkYl9pdGVyYXRvcl9jbG9zZSA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zY2FuX2ZyZWUnLCAndm9pZCcsIFtJdGVyYXRvckhhbmRsZV0pO1xuXG4gICAgICAgIC8vIFN0YXRzICYgQ2hlY2twb2ludFxuICAgICAgICB0aGlzLnNvY2hkYl9zdGF0cyA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9zdGF0cycsIFN0YXRzLCBbRGF0YWJhc2VIYW5kbGVdKTtcbiAgICAgICAgdGhpcy5zb2NoZGJfY2hlY2twb2ludCA9IHRoaXMubGliLmZ1bmMoJ3NvY2hkYl9jaGVja3BvaW50JywgJ2ludCcsIFtEYXRhYmFzZUhhbmRsZV0pO1xuXG4gICAgICAgIC8vIE1lbW9yeSBNYW5hZ2VtZW50XG4gICAgICAgIHRoaXMuc29jaGRiX2ZyZWVfYnl0ZXMgPSB0aGlzLmxpYi5mdW5jKCdzb2NoZGJfZnJlZV9ieXRlcycsICd2b2lkJywgWyd1aW50OConLCAnc2l6ZV90J10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogTmF0aXZlQmluZGluZ3Mge1xuICAgICAgICBpZiAoIU5hdGl2ZUJpbmRpbmdzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZSA9IG5ldyBOYXRpdmVCaW5kaW5ncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOYXRpdmVCaW5kaW5ncy5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBjb25jdXJyZW50IG1vZGUgaXMgYXZhaWxhYmxlIGluIHRoZSBuYXRpdmUgbGlicmFyeVxuICAgICAqL1xuICAgIHB1YmxpYyBpc0NvbmN1cnJlbnRNb2RlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uY3VycmVudE1vZGVBdmFpbGFibGU7XG4gICAgfVxufVxuIl19
package/dist/esm/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * SochDB Node.js SDK v0.4.2
3
+ * SochDB Node.js SDK v0.4.4
4
4
  *
5
5
  * Dual-mode architecture: Embedded (FFI) + Server (gRPC/IPC)
6
6
  *
@@ -13,7 +13,12 @@
13
13
  * - No server required - just npm install and run
14
14
  * - Best for: Local development, simple apps
15
15
  *
16
- * 2. Server Mode (gRPC/IPC) - For distributed systems:
16
+ * 2. Concurrent Mode (FFI) - For multi-process apps:
17
+ * - Same FFI bindings with MVCC for concurrent access
18
+ * - Multiple Node.js processes can access same database
19
+ * - Best for: PM2 cluster, Express workers
20
+ *
21
+ * 3. Server Mode (gRPC/IPC) - For distributed systems:
17
22
  * - Thin client connecting to sochdb-grpc server
18
23
  * - Best for: Production, multi-language, scalability
19
24
  *
@@ -27,6 +32,15 @@
27
32
  * await db.close();
28
33
  * ```
29
34
  *
35
+ * @example Concurrent Mode
36
+ * ```typescript
37
+ * import { Database } from '@sochdb/sochdb';
38
+ *
39
+ * // Multiple processes can access simultaneously
40
+ * const db = Database.openConcurrent('./mydb');
41
+ * console.log(`Concurrent: ${db.isConcurrent}`);
42
+ * ```
43
+ *
30
44
  * @example Server Mode
31
45
  * ```typescript
32
46
  * import { SochDBClient } from '@sochdb/sochdb';
@@ -37,9 +51,9 @@
37
51
  * ```
38
52
  */
39
53
  Object.defineProperty(exports, "__esModule", { value: true });
40
- exports.GrpcClient = exports.SplitBrainError = exports.EpochMismatchError = exports.LockTimeoutError = exports.DatabaseLockedError = exports.LockError = exports.ErrorCode = exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = exports.Query = exports.FormatConversionError = exports.FormatCapabilities = exports.CanonicalFormat = exports.ContextFormat = exports.WireFormat = exports.IpcClient = exports.SochDBClient = exports.NamespacePolicy = exports.AllowedSet = exports.HybridRetriever = exports.Consolidator = exports.ExtractionPipeline = exports.createContextBuilder = exports.TruncationStrategy = exports.ContextOutputFormat = exports.ContextQueryBuilder = exports.SemanticCache = exports.createQueue = exports.TaskState = exports.PriorityQueue = exports.CollectionExistsError = exports.CollectionNotFoundError = exports.NamespaceExistsError = exports.NamespaceNotFoundError = exports.DistanceMetric = exports.Collection = exports.Namespace = exports.Database = exports.HnswBindings = exports.HnswIndex = exports.EmbeddedTransaction = exports.EmbeddedDatabase = exports.VERSION = void 0;
54
+ exports.GrpcClient = exports.SplitBrainError = exports.EpochMismatchError = exports.LockTimeoutError = exports.DatabaseLockedError = exports.LockError = exports.ErrorCode = exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = exports.Query = exports.FormatConversionError = exports.FormatCapabilities = exports.CanonicalFormat = exports.ContextFormat = exports.WireFormat = exports.IpcClient = exports.SochDBClient = exports.PolicyService = exports.MCP_ERROR_CODES = exports.McpError = exports.McpClient = exports.McpServer = exports.AllowedSet = exports.HybridRetriever = exports.Consolidator = exports.ExtractionPipeline = exports.createContextBuilder = exports.TruncationStrategy = exports.ContextOutputFormat = exports.ContextQueryBuilder = exports.SemanticCache = exports.createQueue = exports.TaskState = exports.PriorityQueue = exports.CollectionExistsError = exports.CollectionNotFoundError = exports.NamespaceExistsError = exports.NamespaceNotFoundError = exports.DistanceMetric = exports.Collection = exports.Namespace = exports.Database = exports.HnswBindings = exports.HnswIndex = exports.EmbeddedTransaction = exports.EmbeddedDatabase = exports.VERSION = void 0;
41
55
  // Version
42
- exports.VERSION = '0.4.2';
56
+ exports.VERSION = '0.4.4';
43
57
  // Embedded mode (FFI) - NEW
44
58
  var embedded_1 = require("./embedded");
45
59
  Object.defineProperty(exports, "EmbeddedDatabase", { enumerable: true, get: function () { return embedded_1.EmbeddedDatabase; } });
@@ -80,7 +94,15 @@ Object.defineProperty(exports, "ExtractionPipeline", { enumerable: true, get: fu
80
94
  Object.defineProperty(exports, "Consolidator", { enumerable: true, get: function () { return memory_1.Consolidator; } });
81
95
  Object.defineProperty(exports, "HybridRetriever", { enumerable: true, get: function () { return memory_1.HybridRetriever; } });
82
96
  Object.defineProperty(exports, "AllowedSet", { enumerable: true, get: function () { return memory_1.AllowedSet; } });
83
- Object.defineProperty(exports, "NamespacePolicy", { enumerable: true, get: function () { return memory_1.NamespacePolicy; } });
97
+ // MCP - Model Context Protocol (v0.4.3)
98
+ var mcp_1 = require("./mcp");
99
+ Object.defineProperty(exports, "McpServer", { enumerable: true, get: function () { return mcp_1.McpServer; } });
100
+ Object.defineProperty(exports, "McpClient", { enumerable: true, get: function () { return mcp_1.McpClient; } });
101
+ Object.defineProperty(exports, "McpError", { enumerable: true, get: function () { return mcp_1.McpError; } });
102
+ Object.defineProperty(exports, "MCP_ERROR_CODES", { enumerable: true, get: function () { return mcp_1.MCP_ERROR_CODES; } });
103
+ // Policy Service (v0.4.3)
104
+ var policy_1 = require("./policy");
105
+ Object.defineProperty(exports, "PolicyService", { enumerable: true, get: function () { return policy_1.PolicyService; } });
84
106
  // Server mode (gRPC/IPC)
85
107
  var grpc_client_1 = require("./grpc-client");
86
108
  Object.defineProperty(exports, "SochDBClient", { enumerable: true, get: function () { return grpc_client_1.SochDBClient; } });
@@ -112,4 +134,4 @@ Object.defineProperty(exports, "SplitBrainError", { enumerable: true, get: funct
112
134
  // Convenience alias
113
135
  var grpc_client_2 = require("./grpc-client");
114
136
  Object.defineProperty(exports, "GrpcClient", { enumerable: true, get: function () { return grpc_client_2.SochDBClient; } });
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ0c7OztBQUVILFVBQVU7QUFDRyxRQUFBLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFFL0IsNEJBQTRCO0FBQzVCLHVDQUFzRTtBQUE3RCw0R0FBQSxnQkFBZ0IsT0FBQTtBQUN6Qix1Q0FBaUQ7QUFBeEMsK0dBQUEsbUJBQW1CLE9BQUE7QUFDNUIsdUNBQWlFO0FBQXhELHFHQUFBLFNBQVMsT0FBQTtBQUFjLHdHQUFBLFlBQVksT0FBQTtBQUc1QywwQ0FBMEM7QUFDMUMsdUNBQTBEO0FBQWpELG9HQUFBLGdCQUFnQixPQUFZO0FBRXJDLHlCQUF5QjtBQUN6Qix5Q0FRcUI7QUFQbkIsc0dBQUEsU0FBUyxPQUFBO0FBQ1QsdUdBQUEsVUFBVSxPQUFBO0FBQ1YsMkdBQUEsY0FBYyxPQUFBO0FBQ2QsbUhBQUEsc0JBQXNCLE9BQUE7QUFDdEIsaUhBQUEsb0JBQW9CLE9BQUE7QUFDcEIsb0hBQUEsdUJBQXVCLE9BQUE7QUFDdkIsa0hBQUEscUJBQXFCLE9BQUE7QUFTdkIscUJBQXFCO0FBQ3JCLGlDQUlpQjtBQUhmLHNHQUFBLGFBQWEsT0FBQTtBQUNiLGtHQUFBLFNBQVMsT0FBQTtBQUNULG9HQUFBLFdBQVcsT0FBQTtBQVNiLDBCQUEwQjtBQUMxQixtREFFMEI7QUFEeEIsK0dBQUEsYUFBYSxPQUFBO0FBUWYsMkJBQTJCO0FBQzNCLHFEQUsyQjtBQUp6QixzSEFBQSxtQkFBbUIsT0FBQTtBQUNuQixzSEFBQSxtQkFBbUIsT0FBQTtBQUNuQixxSEFBQSxrQkFBa0IsT0FBQTtBQUNsQix1SEFBQSxvQkFBb0IsT0FBQTtBQU10Qix5QkFBeUI7QUFDekIsbUNBTWtCO0FBTGhCLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHNHQUFBLFlBQVksT0FBQTtBQUNaLHlHQUFBLGVBQWUsT0FBQTtBQUNmLG9HQUFBLFVBQVUsT0FBQTtBQUNWLHlHQUFBLGVBQWUsT0FBQTtBQWlCakIseUJBQXlCO0FBQ3pCLDZDQUE2QztBQUFwQywyR0FBQSxZQUFZLE9BQUE7QUFRckIsMkNBQXlDO0FBQWhDLHVHQUFBLFNBQVMsT0FBQTtBQUVsQixtQkFBbUI7QUFDbkIsbUNBTWtCO0FBTGhCLG9HQUFBLFVBQVUsT0FBQTtBQUNWLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHlHQUFBLGVBQWUsT0FBQTtBQUNmLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLCtHQUFBLHFCQUFxQixPQUFBO0FBR3ZCLG1CQUFtQjtBQUNuQixpQ0FBZ0M7QUFBdkIsOEZBQUEsS0FBSyxPQUFBO0FBR2QsbUNBYWtCO0FBWmhCLHFHQUFBLFdBQVcsT0FBQTtBQUNYLHlHQUFBLGVBQWUsT0FBQTtBQUNmLDBHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHVCQUF1QjtBQUN2QixtR0FBQSxTQUFTLE9BQUE7QUFDVCxtR0FBQSxTQUFTLE9BQUE7QUFDVCw2R0FBQSxtQkFBbUIsT0FBQTtBQUNuQiwwR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQix5R0FBQSxlQUFlLE9BQUE7QUFHakIsb0JBQW9CO0FBQ3BCLDZDQUEyRDtBQUFsRCx5R0FBQSxZQUFZLE9BQWMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvY2hEQiBOb2RlLmpzIFNESyB2MC40LjJcbiAqIFxuICogRHVhbC1tb2RlIGFyY2hpdGVjdHVyZTogRW1iZWRkZWQgKEZGSSkgKyBTZXJ2ZXIgKGdSUEMvSVBDKVxuICogXG4gKiBBcmNoaXRlY3R1cmU6IEZsZXhpYmxlIERlcGxveW1lbnRcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFRoaXMgU0RLIHN1cHBvcnRzIEJPVEggbW9kZXM6XG4gKiBcbiAqIDEuIEVtYmVkZGVkIE1vZGUgKEZGSSkgLSBGb3Igc2luZ2xlLXByb2Nlc3MgYXBwczpcbiAqICAgIC0gRGlyZWN0IEZGSSBiaW5kaW5ncyB0byBSdXN0IGxpYnJhcmllc1xuICogICAgLSBObyBzZXJ2ZXIgcmVxdWlyZWQgLSBqdXN0IG5wbSBpbnN0YWxsIGFuZCBydW5cbiAqICAgIC0gQmVzdCBmb3I6IExvY2FsIGRldmVsb3BtZW50LCBzaW1wbGUgYXBwc1xuICogXG4gKiAyLiBTZXJ2ZXIgTW9kZSAoZ1JQQy9JUEMpIC0gRm9yIGRpc3RyaWJ1dGVkIHN5c3RlbXM6XG4gKiAgICAtIFRoaW4gY2xpZW50IGNvbm5lY3RpbmcgdG8gc29jaGRiLWdycGMgc2VydmVyXG4gKiAgICAtIEJlc3QgZm9yOiBQcm9kdWN0aW9uLCBtdWx0aS1sYW5ndWFnZSwgc2NhbGFiaWxpdHlcbiAqIFxuICogQGV4YW1wbGUgRW1iZWRkZWQgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tICdAc29jaGRiL3NvY2hkYic7XG4gKiBcbiAqIC8vIERpcmVjdCBGRkkgLSBubyBzZXJ2ZXIgbmVlZGVkXG4gKiBjb25zdCBkYiA9IGF3YWl0IERhdGFiYXNlLm9wZW4oJy4vbXlkYicpO1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogYXdhaXQgZGIuY2xvc2UoKTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZSBTZXJ2ZXIgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgU29jaERCQ2xpZW50IH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiAvLyBDb25uZWN0IHRvIHNlcnZlclxuICogY29uc3QgY2xpZW50ID0gbmV3IFNvY2hEQkNsaWVudCh7IGFkZHJlc3M6ICdsb2NhbGhvc3Q6NTAwNTEnIH0pO1xuICogYXdhaXQgY2xpZW50LnB1dEt2KCdrZXknLCBCdWZmZXIuZnJvbSgndmFsdWUnKSk7XG4gKiBgYGBcbiAqL1xuXG4vLyBWZXJzaW9uXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9ICcwLjQuMic7XG5cbi8vIEVtYmVkZGVkIG1vZGUgKEZGSSkgLSBORVdcbmV4cG9ydCB7IEVtYmVkZGVkRGF0YWJhc2UsIEVtYmVkZGVkRGF0YWJhc2VDb25maWcgfSBmcm9tICcuL2VtYmVkZGVkJztcbmV4cG9ydCB7IEVtYmVkZGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuL2VtYmVkZGVkJztcbmV4cG9ydCB7IEhuc3dJbmRleCwgSG5zd0NvbmZpZywgSG5zd0JpbmRpbmdzIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5leHBvcnQgeyBTZWFyY2hSZXN1bHQgYXMgSG5zd1NlYXJjaFJlc3VsdCB9IGZyb20gJy4vZW1iZWRkZWQnO1xuXG4vLyBFbWJlZGRlZCBtb2RlIChGRkkpIC0gQ29udmVuaWVuY2UgYWxpYXNcbmV4cG9ydCB7IEVtYmVkZGVkRGF0YWJhc2UgYXMgRGF0YWJhc2UgfSBmcm9tICcuL2VtYmVkZGVkJztcblxuLy8gTmFtZXNwYWNlIEFQSSAodjAuNC4xKVxuZXhwb3J0IHtcbiAgTmFtZXNwYWNlLFxuICBDb2xsZWN0aW9uLFxuICBEaXN0YW5jZU1ldHJpYyxcbiAgTmFtZXNwYWNlTm90Rm91bmRFcnJvcixcbiAgTmFtZXNwYWNlRXhpc3RzRXJyb3IsXG4gIENvbGxlY3Rpb25Ob3RGb3VuZEVycm9yLFxuICBDb2xsZWN0aW9uRXhpc3RzRXJyb3IsXG59IGZyb20gJy4vbmFtZXNwYWNlJztcbmV4cG9ydCB0eXBlIHtcbiAgTmFtZXNwYWNlQ29uZmlnLFxuICBDb2xsZWN0aW9uQ29uZmlnLFxuICBTZWFyY2hSZXF1ZXN0LFxuICBTZWFyY2hSZXN1bHQgYXMgTmFtZXNwYWNlU2VhcmNoUmVzdWx0LFxufSBmcm9tICcuL25hbWVzcGFjZSc7XG5cbi8vIFF1ZXVlIEFQSSAodjAuNC4xKVxuZXhwb3J0IHtcbiAgUHJpb3JpdHlRdWV1ZSxcbiAgVGFza1N0YXRlLFxuICBjcmVhdGVRdWV1ZSxcbn0gZnJvbSAnLi9xdWV1ZSc7XG5leHBvcnQgdHlwZSB7XG4gIFF1ZXVlQ29uZmlnLFxuICBRdWV1ZUtleSxcbiAgVGFzayxcbiAgUXVldWVTdGF0cyxcbn0gZnJvbSAnLi9xdWV1ZSc7XG5cbi8vIFNlbWFudGljIENhY2hlICh2MC40LjEpXG5leHBvcnQge1xuICBTZW1hbnRpY0NhY2hlLFxufSBmcm9tICcuL3NlbWFudGljLWNhY2hlJztcbmV4cG9ydCB0eXBlIHtcbiAgQ2FjaGVFbnRyeSxcbiAgQ2FjaGVIaXQsXG4gIENhY2hlU3RhdHMsXG59IGZyb20gJy4vc2VtYW50aWMtY2FjaGUnO1xuXG4vLyBDb250ZXh0IEJ1aWxkZXIgKHYwLjQuMSlcbmV4cG9ydCB7XG4gIENvbnRleHRRdWVyeUJ1aWxkZXIsXG4gIENvbnRleHRPdXRwdXRGb3JtYXQsXG4gIFRydW5jYXRpb25TdHJhdGVneSxcbiAgY3JlYXRlQ29udGV4dEJ1aWxkZXIsXG59IGZyb20gJy4vY29udGV4dC1idWlsZGVyJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29udGV4dFJlc3VsdCxcbn0gZnJvbSAnLi9jb250ZXh0LWJ1aWxkZXInO1xuXG4vLyBNZW1vcnkgU3lzdGVtICh2MC40LjIpXG5leHBvcnQge1xuICBFeHRyYWN0aW9uUGlwZWxpbmUsXG4gIENvbnNvbGlkYXRvcixcbiAgSHlicmlkUmV0cmlldmVyLFxuICBBbGxvd2VkU2V0LFxuICBOYW1lc3BhY2VQb2xpY3ksXG59IGZyb20gJy4vbWVtb3J5JztcbmV4cG9ydCB0eXBlIHtcbiAgRW50aXR5LFxuICBSZWxhdGlvbixcbiAgQXNzZXJ0aW9uLFxuICBSYXdBc3NlcnRpb24sXG4gIENhbm9uaWNhbEZhY3QsXG4gIEV4dHJhY3Rpb25SZXN1bHQsXG4gIEV4dHJhY3Rpb25TY2hlbWEsXG4gIENvbnNvbGlkYXRpb25Db25maWcsXG4gIFJldHJpZXZhbENvbmZpZyxcbiAgUmV0cmlldmFsUmVzdWx0LFxuICBSZXRyaWV2YWxSZXNwb25zZSxcbiAgTmFtZXNwYWNlR3JhbnQsXG59IGZyb20gJy4vbWVtb3J5JztcblxuLy8gU2VydmVyIG1vZGUgKGdSUEMvSVBDKVxuZXhwb3J0IHsgU29jaERCQ2xpZW50IH0gZnJvbSAnLi9ncnBjLWNsaWVudCc7XG5leHBvcnQgdHlwZSB7XG4gIFNlYXJjaFJlc3VsdCxcbiAgRG9jdW1lbnQsXG4gIEdyYXBoTm9kZSxcbiAgR3JhcGhFZGdlLFxufSBmcm9tICcuL2dycGMtY2xpZW50JztcblxuZXhwb3J0IHsgSXBjQ2xpZW50IH0gZnJvbSAnLi9pcGMtY2xpZW50JztcblxuLy8gRm9ybWF0IHV0aWxpdGllc1xuZXhwb3J0IHtcbiAgV2lyZUZvcm1hdCxcbiAgQ29udGV4dEZvcm1hdCxcbiAgQ2Fub25pY2FsRm9ybWF0LFxuICBGb3JtYXRDYXBhYmlsaXRpZXMsXG4gIEZvcm1hdENvbnZlcnNpb25FcnJvcixcbn0gZnJvbSAnLi9mb3JtYXQnO1xuXG4vLyBUeXBlIGRlZmluaXRpb25zXG5leHBvcnQgeyBRdWVyeSB9IGZyb20gJy4vcXVlcnknO1xuZXhwb3J0IHR5cGUgeyBRdWVyeVJlc3VsdCB9IGZyb20gJy4vcXVlcnknO1xuXG5leHBvcnQge1xuICBTb2NoREJFcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBUcmFuc2FjdGlvbkVycm9yLFxuICBQcm90b2NvbEVycm9yLFxuICBEYXRhYmFzZUVycm9yLFxuICAvLyBMb2NrIGVycm9ycyAodjAuNC4xKVxuICBFcnJvckNvZGUsXG4gIExvY2tFcnJvcixcbiAgRGF0YWJhc2VMb2NrZWRFcnJvcixcbiAgTG9ja1RpbWVvdXRFcnJvcixcbiAgRXBvY2hNaXNtYXRjaEVycm9yLFxuICBTcGxpdEJyYWluRXJyb3IsXG59IGZyb20gJy4vZXJyb3JzJztcblxuLy8gQ29udmVuaWVuY2UgYWxpYXNcbmV4cG9ydCB7IFNvY2hEQkNsaWVudCBhcyBHcnBjQ2xpZW50IH0gZnJvbSAnLi9ncnBjLWNsaWVudCc7XG4iXX0=
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERzs7O0FBRUgsVUFBVTtBQUNHLFFBQUEsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUUvQiw0QkFBNEI7QUFDNUIsdUNBQXNFO0FBQTdELDRHQUFBLGdCQUFnQixPQUFBO0FBQ3pCLHVDQUFpRDtBQUF4QywrR0FBQSxtQkFBbUIsT0FBQTtBQUM1Qix1Q0FBaUU7QUFBeEQscUdBQUEsU0FBUyxPQUFBO0FBQWMsd0dBQUEsWUFBWSxPQUFBO0FBRzVDLDBDQUEwQztBQUMxQyx1Q0FBMEQ7QUFBakQsb0dBQUEsZ0JBQWdCLE9BQVk7QUFFckMseUJBQXlCO0FBQ3pCLHlDQVFxQjtBQVBuQixzR0FBQSxTQUFTLE9BQUE7QUFDVCx1R0FBQSxVQUFVLE9BQUE7QUFDViwyR0FBQSxjQUFjLE9BQUE7QUFDZCxtSEFBQSxzQkFBc0IsT0FBQTtBQUN0QixpSEFBQSxvQkFBb0IsT0FBQTtBQUNwQixvSEFBQSx1QkFBdUIsT0FBQTtBQUN2QixrSEFBQSxxQkFBcUIsT0FBQTtBQVN2QixxQkFBcUI7QUFDckIsaUNBSWlCO0FBSGYsc0dBQUEsYUFBYSxPQUFBO0FBQ2Isa0dBQUEsU0FBUyxPQUFBO0FBQ1Qsb0dBQUEsV0FBVyxPQUFBO0FBU2IsMEJBQTBCO0FBQzFCLG1EQUUwQjtBQUR4QiwrR0FBQSxhQUFhLE9BQUE7QUFRZiwyQkFBMkI7QUFDM0IscURBSzJCO0FBSnpCLHNIQUFBLG1CQUFtQixPQUFBO0FBQ25CLHNIQUFBLG1CQUFtQixPQUFBO0FBQ25CLHFIQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHVIQUFBLG9CQUFvQixPQUFBO0FBTXRCLHlCQUF5QjtBQUN6QixtQ0FLa0I7QUFKaEIsNEdBQUEsa0JBQWtCLE9BQUE7QUFDbEIsc0dBQUEsWUFBWSxPQUFBO0FBQ1oseUdBQUEsZUFBZSxPQUFBO0FBQ2Ysb0dBQUEsVUFBVSxPQUFBO0FBZ0JaLHdDQUF3QztBQUN4Qyw2QkFLZTtBQUpiLGdHQUFBLFNBQVMsT0FBQTtBQUNULGdHQUFBLFNBQVMsT0FBQTtBQUNULCtGQUFBLFFBQVEsT0FBQTtBQUNSLHNHQUFBLGVBQWUsT0FBQTtBQWlCakIsMEJBQTBCO0FBQzFCLG1DQUVrQjtBQURoQix1R0FBQSxhQUFhLE9BQUE7QUFlZix5QkFBeUI7QUFDekIsNkNBQTZDO0FBQXBDLDJHQUFBLFlBQVksT0FBQTtBQVFyQiwyQ0FBeUM7QUFBaEMsdUdBQUEsU0FBUyxPQUFBO0FBRWxCLG1CQUFtQjtBQUNuQixtQ0FNa0I7QUFMaEIsb0dBQUEsVUFBVSxPQUFBO0FBQ1YsdUdBQUEsYUFBYSxPQUFBO0FBQ2IseUdBQUEsZUFBZSxPQUFBO0FBQ2YsNEdBQUEsa0JBQWtCLE9BQUE7QUFDbEIsK0dBQUEscUJBQXFCLE9BQUE7QUFHdkIsbUJBQW1CO0FBQ25CLGlDQUFnQztBQUF2Qiw4RkFBQSxLQUFLLE9BQUE7QUFHZCxtQ0Fha0I7QUFaaEIscUdBQUEsV0FBVyxPQUFBO0FBQ1gseUdBQUEsZUFBZSxPQUFBO0FBQ2YsMEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsdUdBQUEsYUFBYSxPQUFBO0FBQ2IsdUdBQUEsYUFBYSxPQUFBO0FBQ2IsdUJBQXVCO0FBQ3ZCLG1HQUFBLFNBQVMsT0FBQTtBQUNULG1HQUFBLFNBQVMsT0FBQTtBQUNULDZHQUFBLG1CQUFtQixPQUFBO0FBQ25CLDBHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHlHQUFBLGVBQWUsT0FBQTtBQUdqQixvQkFBb0I7QUFDcEIsNkNBQTJEO0FBQWxELHlHQUFBLFlBQVksT0FBYyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU29jaERCIE5vZGUuanMgU0RLIHYwLjQuNFxuICogXG4gKiBEdWFsLW1vZGUgYXJjaGl0ZWN0dXJlOiBFbWJlZGRlZCAoRkZJKSArIFNlcnZlciAoZ1JQQy9JUEMpXG4gKiBcbiAqIEFyY2hpdGVjdHVyZTogRmxleGlibGUgRGVwbG95bWVudFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogVGhpcyBTREsgc3VwcG9ydHMgQk9USCBtb2RlczpcbiAqIFxuICogMS4gRW1iZWRkZWQgTW9kZSAoRkZJKSAtIEZvciBzaW5nbGUtcHJvY2VzcyBhcHBzOlxuICogICAgLSBEaXJlY3QgRkZJIGJpbmRpbmdzIHRvIFJ1c3QgbGlicmFyaWVzXG4gKiAgICAtIE5vIHNlcnZlciByZXF1aXJlZCAtIGp1c3QgbnBtIGluc3RhbGwgYW5kIHJ1blxuICogICAgLSBCZXN0IGZvcjogTG9jYWwgZGV2ZWxvcG1lbnQsIHNpbXBsZSBhcHBzXG4gKiBcbiAqIDIuIENvbmN1cnJlbnQgTW9kZSAoRkZJKSAtIEZvciBtdWx0aS1wcm9jZXNzIGFwcHM6XG4gKiAgICAtIFNhbWUgRkZJIGJpbmRpbmdzIHdpdGggTVZDQyBmb3IgY29uY3VycmVudCBhY2Nlc3NcbiAqICAgIC0gTXVsdGlwbGUgTm9kZS5qcyBwcm9jZXNzZXMgY2FuIGFjY2VzcyBzYW1lIGRhdGFiYXNlXG4gKiAgICAtIEJlc3QgZm9yOiBQTTIgY2x1c3RlciwgRXhwcmVzcyB3b3JrZXJzXG4gKiBcbiAqIDMuIFNlcnZlciBNb2RlIChnUlBDL0lQQykgLSBGb3IgZGlzdHJpYnV0ZWQgc3lzdGVtczpcbiAqICAgIC0gVGhpbiBjbGllbnQgY29ubmVjdGluZyB0byBzb2NoZGItZ3JwYyBzZXJ2ZXJcbiAqICAgIC0gQmVzdCBmb3I6IFByb2R1Y3Rpb24sIG11bHRpLWxhbmd1YWdlLCBzY2FsYWJpbGl0eVxuICogXG4gKiBAZXhhbXBsZSBFbWJlZGRlZCBNb2RlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBEYXRhYmFzZSB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogLy8gRGlyZWN0IEZGSSAtIG5vIHNlcnZlciBuZWVkZWRcbiAqIGNvbnN0IGRiID0gYXdhaXQgRGF0YWJhc2Uub3BlbignLi9teWRiJyk7XG4gKiBhd2FpdCBkYi5wdXQoQnVmZmVyLmZyb20oJ2tleScpLCBCdWZmZXIuZnJvbSgndmFsdWUnKSk7XG4gKiBhd2FpdCBkYi5jbG9zZSgpO1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlIENvbmN1cnJlbnQgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tICdAc29jaGRiL3NvY2hkYic7XG4gKiBcbiAqIC8vIE11bHRpcGxlIHByb2Nlc3NlcyBjYW4gYWNjZXNzIHNpbXVsdGFuZW91c2x5XG4gKiBjb25zdCBkYiA9IERhdGFiYXNlLm9wZW5Db25jdXJyZW50KCcuL215ZGInKTtcbiAqIGNvbnNvbGUubG9nKGBDb25jdXJyZW50OiAke2RiLmlzQ29uY3VycmVudH1gKTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZSBTZXJ2ZXIgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgU29jaERCQ2xpZW50IH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiAvLyBDb25uZWN0IHRvIHNlcnZlclxuICogY29uc3QgY2xpZW50ID0gbmV3IFNvY2hEQkNsaWVudCh7IGFkZHJlc3M6ICdsb2NhbGhvc3Q6NTAwNTEnIH0pO1xuICogYXdhaXQgY2xpZW50LnB1dEt2KCdrZXknLCBCdWZmZXIuZnJvbSgndmFsdWUnKSk7XG4gKiBgYGBcbiAqL1xuXG4vLyBWZXJzaW9uXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9ICcwLjQuNCc7XG5cbi8vIEVtYmVkZGVkIG1vZGUgKEZGSSkgLSBORVdcbmV4cG9ydCB7IEVtYmVkZGVkRGF0YWJhc2UsIEVtYmVkZGVkRGF0YWJhc2VDb25maWcgfSBmcm9tICcuL2VtYmVkZGVkJztcbmV4cG9ydCB7IEVtYmVkZGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuL2VtYmVkZGVkJztcbmV4cG9ydCB7IEhuc3dJbmRleCwgSG5zd0NvbmZpZywgSG5zd0JpbmRpbmdzIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5leHBvcnQgeyBTZWFyY2hSZXN1bHQgYXMgSG5zd1NlYXJjaFJlc3VsdCB9IGZyb20gJy4vZW1iZWRkZWQnO1xuXG4vLyBFbWJlZGRlZCBtb2RlIChGRkkpIC0gQ29udmVuaWVuY2UgYWxpYXNcbmV4cG9ydCB7IEVtYmVkZGVkRGF0YWJhc2UgYXMgRGF0YWJhc2UgfSBmcm9tICcuL2VtYmVkZGVkJztcblxuLy8gTmFtZXNwYWNlIEFQSSAodjAuNC4xKVxuZXhwb3J0IHtcbiAgTmFtZXNwYWNlLFxuICBDb2xsZWN0aW9uLFxuICBEaXN0YW5jZU1ldHJpYyxcbiAgTmFtZXNwYWNlTm90Rm91bmRFcnJvcixcbiAgTmFtZXNwYWNlRXhpc3RzRXJyb3IsXG4gIENvbGxlY3Rpb25Ob3RGb3VuZEVycm9yLFxuICBDb2xsZWN0aW9uRXhpc3RzRXJyb3IsXG59IGZyb20gJy4vbmFtZXNwYWNlJztcbmV4cG9ydCB0eXBlIHtcbiAgTmFtZXNwYWNlQ29uZmlnLFxuICBDb2xsZWN0aW9uQ29uZmlnLFxuICBTZWFyY2hSZXF1ZXN0LFxuICBTZWFyY2hSZXN1bHQgYXMgTmFtZXNwYWNlU2VhcmNoUmVzdWx0LFxufSBmcm9tICcuL25hbWVzcGFjZSc7XG5cbi8vIFF1ZXVlIEFQSSAodjAuNC4xKVxuZXhwb3J0IHtcbiAgUHJpb3JpdHlRdWV1ZSxcbiAgVGFza1N0YXRlLFxuICBjcmVhdGVRdWV1ZSxcbn0gZnJvbSAnLi9xdWV1ZSc7XG5leHBvcnQgdHlwZSB7XG4gIFF1ZXVlQ29uZmlnLFxuICBRdWV1ZUtleSxcbiAgVGFzayxcbiAgUXVldWVTdGF0cyxcbn0gZnJvbSAnLi9xdWV1ZSc7XG5cbi8vIFNlbWFudGljIENhY2hlICh2MC40LjEpXG5leHBvcnQge1xuICBTZW1hbnRpY0NhY2hlLFxufSBmcm9tICcuL3NlbWFudGljLWNhY2hlJztcbmV4cG9ydCB0eXBlIHtcbiAgQ2FjaGVFbnRyeSxcbiAgQ2FjaGVIaXQsXG4gIENhY2hlU3RhdHMsXG59IGZyb20gJy4vc2VtYW50aWMtY2FjaGUnO1xuXG4vLyBDb250ZXh0IEJ1aWxkZXIgKHYwLjQuMSlcbmV4cG9ydCB7XG4gIENvbnRleHRRdWVyeUJ1aWxkZXIsXG4gIENvbnRleHRPdXRwdXRGb3JtYXQsXG4gIFRydW5jYXRpb25TdHJhdGVneSxcbiAgY3JlYXRlQ29udGV4dEJ1aWxkZXIsXG59IGZyb20gJy4vY29udGV4dC1idWlsZGVyJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29udGV4dFJlc3VsdCxcbn0gZnJvbSAnLi9jb250ZXh0LWJ1aWxkZXInO1xuXG4vLyBNZW1vcnkgU3lzdGVtICh2MC40LjIpXG5leHBvcnQge1xuICBFeHRyYWN0aW9uUGlwZWxpbmUsXG4gIENvbnNvbGlkYXRvcixcbiAgSHlicmlkUmV0cmlldmVyLFxuICBBbGxvd2VkU2V0LFxufSBmcm9tICcuL21lbW9yeSc7XG5leHBvcnQgdHlwZSB7XG4gIEVudGl0eSxcbiAgUmVsYXRpb24sXG4gIEFzc2VydGlvbixcbiAgUmF3QXNzZXJ0aW9uLFxuICBDYW5vbmljYWxGYWN0LFxuICBFeHRyYWN0aW9uUmVzdWx0LFxuICBFeHRyYWN0aW9uU2NoZW1hLFxuICBDb25zb2xpZGF0aW9uQ29uZmlnLFxuICBSZXRyaWV2YWxDb25maWcsXG4gIFJldHJpZXZhbFJlc3VsdCxcbiAgUmV0cmlldmFsUmVzcG9uc2UsXG59IGZyb20gJy4vbWVtb3J5JztcblxuLy8gTUNQIC0gTW9kZWwgQ29udGV4dCBQcm90b2NvbCAodjAuNC4zKVxuZXhwb3J0IHtcbiAgTWNwU2VydmVyLFxuICBNY3BDbGllbnQsXG4gIE1jcEVycm9yLFxuICBNQ1BfRVJST1JfQ09ERVMsXG59IGZyb20gJy4vbWNwJztcbmV4cG9ydCB0eXBlIHtcbiAgTWNwVG9vbCxcbiAgTWNwVG9vbENhbGwsXG4gIE1jcFRvb2xSZXN1bHQsXG4gIE1jcFJlc291cmNlLFxuICBNY3BSZXNvdXJjZUNvbnRlbnQsXG4gIE1jcFByb21wdCxcbiAgTWNwUHJvbXB0QXJndW1lbnQsXG4gIE1jcFByb21wdE1lc3NhZ2UsXG4gIE1jcFNlcnZlckNhcGFiaWxpdGllcyxcbiAgTWNwU2VydmVyQ29uZmlnLFxuICBNY3BDbGllbnRDb25maWcsXG4gIE1jcFRyYW5zcG9ydCxcbn0gZnJvbSAnLi9tY3AnO1xuXG4vLyBQb2xpY3kgU2VydmljZSAodjAuNC4zKVxuZXhwb3J0IHtcbiAgUG9saWN5U2VydmljZSxcbn0gZnJvbSAnLi9wb2xpY3knO1xuZXhwb3J0IHR5cGUge1xuICBQb2xpY3lSdWxlLFxuICBQb2xpY3lDb25kaXRpb24sXG4gIFBvbGljeUV2YWx1YXRpb24sXG4gIE5hbWVzcGFjZVBvbGljeSxcbiAgTmFtZXNwYWNlR3JhbnQsXG4gIE5hbWVzcGFjZVBlcm1pc3Npb24sXG4gIFBvbGljeUFjdGlvbixcbiAgUG9saWN5UmVxdWVzdCxcbiAgUG9saWN5U2V0LFxuICBQb2xpY3lBdWRpdEVudHJ5LFxufSBmcm9tICcuL3BvbGljeSc7XG5cbi8vIFNlcnZlciBtb2RlIChnUlBDL0lQQylcbmV4cG9ydCB7IFNvY2hEQkNsaWVudCB9IGZyb20gJy4vZ3JwYy1jbGllbnQnO1xuZXhwb3J0IHR5cGUge1xuICBTZWFyY2hSZXN1bHQsXG4gIERvY3VtZW50LFxuICBHcmFwaE5vZGUsXG4gIEdyYXBoRWRnZSxcbn0gZnJvbSAnLi9ncnBjLWNsaWVudCc7XG5cbmV4cG9ydCB7IElwY0NsaWVudCB9IGZyb20gJy4vaXBjLWNsaWVudCc7XG5cbi8vIEZvcm1hdCB1dGlsaXRpZXNcbmV4cG9ydCB7XG4gIFdpcmVGb3JtYXQsXG4gIENvbnRleHRGb3JtYXQsXG4gIENhbm9uaWNhbEZvcm1hdCxcbiAgRm9ybWF0Q2FwYWJpbGl0aWVzLFxuICBGb3JtYXRDb252ZXJzaW9uRXJyb3IsXG59IGZyb20gJy4vZm9ybWF0JztcblxuLy8gVHlwZSBkZWZpbml0aW9uc1xuZXhwb3J0IHsgUXVlcnkgfSBmcm9tICcuL3F1ZXJ5JztcbmV4cG9ydCB0eXBlIHsgUXVlcnlSZXN1bHQgfSBmcm9tICcuL3F1ZXJ5JztcblxuZXhwb3J0IHtcbiAgU29jaERCRXJyb3IsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgVHJhbnNhY3Rpb25FcnJvcixcbiAgUHJvdG9jb2xFcnJvcixcbiAgRGF0YWJhc2VFcnJvcixcbiAgLy8gTG9jayBlcnJvcnMgKHYwLjQuMSlcbiAgRXJyb3JDb2RlLFxuICBMb2NrRXJyb3IsXG4gIERhdGFiYXNlTG9ja2VkRXJyb3IsXG4gIExvY2tUaW1lb3V0RXJyb3IsXG4gIEVwb2NoTWlzbWF0Y2hFcnJvcixcbiAgU3BsaXRCcmFpbkVycm9yLFxufSBmcm9tICcuL2Vycm9ycyc7XG5cbi8vIENvbnZlbmllbmNlIGFsaWFzXG5leHBvcnQgeyBTb2NoREJDbGllbnQgYXMgR3JwY0NsaWVudCB9IGZyb20gJy4vZ3JwYy1jbGllbnQnO1xuIl19
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ /**
3
+ * MCP Client Implementation
4
+ *
5
+ * Client for connecting to MCP servers.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.McpClient = void 0;
9
+ const types_1 = require("./types");
10
+ /**
11
+ * MCP Client for connecting to MCP servers
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { McpClient } from '@sochdb/sochdb';
16
+ *
17
+ * const client = new McpClient({
18
+ * serverUri: 'stdio://./mcp-server',
19
+ * transport: 'stdio'
20
+ * });
21
+ *
22
+ * // List available tools
23
+ * const tools = await client.listTools();
24
+ *
25
+ * // Call a tool
26
+ * const result = await client.callTool('db_get', { key: 'user:123' });
27
+ * ```
28
+ */
29
+ class McpClient {
30
+ config;
31
+ connected = false;
32
+ requestId = 0;
33
+ constructor(config) {
34
+ this.config = {
35
+ transport: 'stdio',
36
+ timeout: 30000,
37
+ ...config,
38
+ };
39
+ }
40
+ /**
41
+ * Connect to the MCP server
42
+ */
43
+ async connect() {
44
+ // In a full implementation, this would establish the transport connection
45
+ this.connected = true;
46
+ }
47
+ /**
48
+ * Disconnect from the MCP server
49
+ */
50
+ async disconnect() {
51
+ this.connected = false;
52
+ }
53
+ /**
54
+ * Check if connected
55
+ */
56
+ isConnected() {
57
+ return this.connected;
58
+ }
59
+ /**
60
+ * List available tools
61
+ */
62
+ async listTools() {
63
+ this.ensureConnected();
64
+ // In a full implementation, this would send a tools/list request
65
+ return [];
66
+ }
67
+ /**
68
+ * Call a tool
69
+ */
70
+ async callTool(name, args) {
71
+ this.ensureConnected();
72
+ const callId = `call_${++this.requestId}`;
73
+ // In a full implementation, this would send a tools/call request
74
+ return {
75
+ id: callId,
76
+ content: null,
77
+ isError: true,
78
+ errorMessage: 'Not implemented - use McpServer directly for embedded mode',
79
+ };
80
+ }
81
+ /**
82
+ * List available resources
83
+ */
84
+ async listResources() {
85
+ this.ensureConnected();
86
+ return [];
87
+ }
88
+ /**
89
+ * Read a resource
90
+ */
91
+ async readResource(uri) {
92
+ this.ensureConnected();
93
+ return null;
94
+ }
95
+ /**
96
+ * List available prompts
97
+ */
98
+ async listPrompts() {
99
+ this.ensureConnected();
100
+ return [];
101
+ }
102
+ /**
103
+ * Get prompt messages
104
+ */
105
+ async getPrompt(name, args) {
106
+ this.ensureConnected();
107
+ return null;
108
+ }
109
+ ensureConnected() {
110
+ if (!this.connected) {
111
+ throw new types_1.McpError('Not connected to MCP server', types_1.MCP_ERROR_CODES.INTERNAL_ERROR);
112
+ }
113
+ }
114
+ }
115
+ exports.McpClient = McpClient;
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21jcC9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVILG1DQVdpQjtBQUVqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBYSxTQUFTO0lBQ1osTUFBTSxDQUFrQjtJQUN4QixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFdEIsWUFBWSxNQUF1QjtRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osU0FBUyxFQUFFLE9BQU87WUFDbEIsT0FBTyxFQUFFLEtBQUs7WUFDZCxHQUFHLE1BQU07U0FDVixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE9BQU87UUFDWCwwRUFBMEU7UUFDMUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxTQUFTO1FBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLGlFQUFpRTtRQUNqRSxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBWSxFQUFFLElBQXlCO1FBQ3BELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2QixNQUFNLE1BQU0sR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRTFDLGlFQUFpRTtRQUNqRSxPQUFPO1lBQ0wsRUFBRSxFQUFFLE1BQU07WUFDVixPQUFPLEVBQUUsSUFBSTtZQUNiLE9BQU8sRUFBRSxJQUFJO1lBQ2IsWUFBWSxFQUFFLDREQUE0RDtTQUMzRSxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGFBQWE7UUFDakIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFXO1FBQzVCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXO1FBQ2YsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFZLEVBQUUsSUFBMEI7UUFDdEQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksZ0JBQVEsQ0FBQyw2QkFBNkIsRUFBRSx1QkFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFsR0QsOEJBa0dDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNQ1AgQ2xpZW50IEltcGxlbWVudGF0aW9uXG4gKiBcbiAqIENsaWVudCBmb3IgY29ubmVjdGluZyB0byBNQ1Agc2VydmVycy5cbiAqL1xuXG5pbXBvcnQge1xuICBNY3BUb29sLFxuICBNY3BUb29sQ2FsbCxcbiAgTWNwVG9vbFJlc3VsdCxcbiAgTWNwUmVzb3VyY2UsXG4gIE1jcFJlc291cmNlQ29udGVudCxcbiAgTWNwUHJvbXB0LFxuICBNY3BQcm9tcHRNZXNzYWdlLFxuICBNY3BDbGllbnRDb25maWcsXG4gIE1jcEVycm9yLFxuICBNQ1BfRVJST1JfQ09ERVMsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIE1DUCBDbGllbnQgZm9yIGNvbm5lY3RpbmcgdG8gTUNQIHNlcnZlcnNcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IE1jcENsaWVudCB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogY29uc3QgY2xpZW50ID0gbmV3IE1jcENsaWVudCh7XG4gKiAgIHNlcnZlclVyaTogJ3N0ZGlvOi8vLi9tY3Atc2VydmVyJyxcbiAqICAgdHJhbnNwb3J0OiAnc3RkaW8nXG4gKiB9KTtcbiAqIFxuICogLy8gTGlzdCBhdmFpbGFibGUgdG9vbHNcbiAqIGNvbnN0IHRvb2xzID0gYXdhaXQgY2xpZW50Lmxpc3RUb29scygpO1xuICogXG4gKiAvLyBDYWxsIGEgdG9vbFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmNhbGxUb29sKCdkYl9nZXQnLCB7IGtleTogJ3VzZXI6MTIzJyB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTWNwQ2xpZW50IHtcbiAgcHJpdmF0ZSBjb25maWc6IE1jcENsaWVudENvbmZpZztcbiAgcHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXF1ZXN0SWQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogTWNwQ2xpZW50Q29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICB0cmFuc3BvcnQ6ICdzdGRpbycsXG4gICAgICB0aW1lb3V0OiAzMDAwMCxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3QgdG8gdGhlIE1DUCBzZXJ2ZXJcbiAgICovXG4gIGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gSW4gYSBmdWxsIGltcGxlbWVudGF0aW9uLCB0aGlzIHdvdWxkIGVzdGFibGlzaCB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb25cbiAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdCBmcm9tIHRoZSBNQ1Agc2VydmVyXG4gICAqL1xuICBhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY29ubmVjdGVkXG4gICAqL1xuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhdmFpbGFibGUgdG9vbHNcbiAgICovXG4gIGFzeW5jIGxpc3RUb29scygpOiBQcm9taXNlPE1jcFRvb2xbXT4ge1xuICAgIHRoaXMuZW5zdXJlQ29ubmVjdGVkKCk7XG4gICAgLy8gSW4gYSBmdWxsIGltcGxlbWVudGF0aW9uLCB0aGlzIHdvdWxkIHNlbmQgYSB0b29scy9saXN0IHJlcXVlc3RcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBhIHRvb2xcbiAgICovXG4gIGFzeW5jIGNhbGxUb29sKG5hbWU6IHN0cmluZywgYXJnczogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb21pc2U8TWNwVG9vbFJlc3VsdD4ge1xuICAgIHRoaXMuZW5zdXJlQ29ubmVjdGVkKCk7XG4gICAgXG4gICAgY29uc3QgY2FsbElkID0gYGNhbGxfJHsrK3RoaXMucmVxdWVzdElkfWA7XG4gICAgXG4gICAgLy8gSW4gYSBmdWxsIGltcGxlbWVudGF0aW9uLCB0aGlzIHdvdWxkIHNlbmQgYSB0b29scy9jYWxsIHJlcXVlc3RcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGNhbGxJZCxcbiAgICAgIGNvbnRlbnQ6IG51bGwsXG4gICAgICBpc0Vycm9yOiB0cnVlLFxuICAgICAgZXJyb3JNZXNzYWdlOiAnTm90IGltcGxlbWVudGVkIC0gdXNlIE1jcFNlcnZlciBkaXJlY3RseSBmb3IgZW1iZWRkZWQgbW9kZScsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGF2YWlsYWJsZSByZXNvdXJjZXNcbiAgICovXG4gIGFzeW5jIGxpc3RSZXNvdXJjZXMoKTogUHJvbWlzZTxNY3BSZXNvdXJjZVtdPiB7XG4gICAgdGhpcy5lbnN1cmVDb25uZWN0ZWQoKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhIHJlc291cmNlXG4gICAqL1xuICBhc3luYyByZWFkUmVzb3VyY2UodXJpOiBzdHJpbmcpOiBQcm9taXNlPE1jcFJlc291cmNlQ29udGVudCB8IG51bGw+IHtcbiAgICB0aGlzLmVuc3VyZUNvbm5lY3RlZCgpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYXZhaWxhYmxlIHByb21wdHNcbiAgICovXG4gIGFzeW5jIGxpc3RQcm9tcHRzKCk6IFByb21pc2U8TWNwUHJvbXB0W10+IHtcbiAgICB0aGlzLmVuc3VyZUNvbm5lY3RlZCgpO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcHJvbXB0IG1lc3NhZ2VzXG4gICAqL1xuICBhc3luYyBnZXRQcm9tcHQobmFtZTogc3RyaW5nLCBhcmdzPzogUmVjb3JkPHN0cmluZywgYW55Pik6IFByb21pc2U8TWNwUHJvbXB0TWVzc2FnZVtdIHwgbnVsbD4ge1xuICAgIHRoaXMuZW5zdXJlQ29ubmVjdGVkKCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUNvbm5lY3RlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgTWNwRXJyb3IoJ05vdCBjb25uZWN0ZWQgdG8gTUNQIHNlcnZlcicsIE1DUF9FUlJPUl9DT0RFUy5JTlRFUk5BTF9FUlJPUik7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * MCP (Model Context Protocol) Module
4
+ *
5
+ * Provides MCP server and client implementations for LLM agent integration.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.McpClient = exports.McpServer = void 0;
23
+ __exportStar(require("./types"), exports);
24
+ var server_1 = require("./server");
25
+ Object.defineProperty(exports, "McpServer", { enumerable: true, get: function () { return server_1.McpServer; } });
26
+ var client_1 = require("./client");
27
+ Object.defineProperty(exports, "McpClient", { enumerable: true, get: function () { return client_1.McpClient; } });
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWNwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDBDQUF3QjtBQUN4QixtQ0FBcUM7QUFBNUIsbUdBQUEsU0FBUyxPQUFBO0FBQ2xCLG1DQUFxQztBQUE1QixtR0FBQSxTQUFTLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1DUCAoTW9kZWwgQ29udGV4dCBQcm90b2NvbCkgTW9kdWxlXG4gKiBcbiAqIFByb3ZpZGVzIE1DUCBzZXJ2ZXIgYW5kIGNsaWVudCBpbXBsZW1lbnRhdGlvbnMgZm9yIExMTSBhZ2VudCBpbnRlZ3JhdGlvbi5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCB7IE1jcFNlcnZlciB9IGZyb20gJy4vc2VydmVyJztcbmV4cG9ydCB7IE1jcENsaWVudCB9IGZyb20gJy4vY2xpZW50JztcbiJdfQ==