@ruvector/ruvllm 2.5.7 → 2.6.0

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.
@@ -5,7 +5,9 @@
5
5
  * Automatically loads the correct native binary for the current platform.
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.hasSimdSupport = exports.version = exports.getNativeModule = void 0;
8
+ exports.getNativeModule = getNativeModule;
9
+ exports.version = version;
10
+ exports.hasSimdSupport = hasSimdSupport;
9
11
  const path_1 = require("path");
10
12
  // Try to load the native module
11
13
  let nativeModule = null;
@@ -64,15 +66,12 @@ function loadNativeModule() {
64
66
  function getNativeModule() {
65
67
  return loadNativeModule();
66
68
  }
67
- exports.getNativeModule = getNativeModule;
68
69
  function version() {
69
70
  const mod = loadNativeModule();
70
71
  return mod?.version() ?? '0.1.0-js';
71
72
  }
72
- exports.version = version;
73
73
  function hasSimdSupport() {
74
74
  const mod = loadNativeModule();
75
75
  return mod?.hasSimdSupport() ?? false;
76
76
  }
77
- exports.hasSimdSupport = hasSimdSupport;
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBRUgsK0JBQTRCO0FBRTVCLGdDQUFnQztBQUNoQyxJQUFJLFlBQVksR0FBd0IsSUFBSSxDQUFDO0FBOEY3QyxrQ0FBa0M7QUFDbEMsTUFBTSxpQkFBaUIsR0FBMkI7SUFDaEQsWUFBWSxFQUFFLDZCQUE2QjtJQUMzQyxjQUFjLEVBQUUsK0JBQStCO0lBQy9DLFdBQVcsRUFBRSxnQ0FBZ0M7SUFDN0MsYUFBYSxFQUFFLGtDQUFrQztJQUNqRCxXQUFXLEVBQUUsaUNBQWlDO0NBQy9DLENBQUM7QUFFRixTQUFTLGNBQWM7SUFDckIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUNsQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQzFCLE9BQU8sR0FBRyxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMsZ0JBQWdCO0lBQ3ZCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakIsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLGNBQWMsRUFBRSxDQUFDO0lBQ3JDLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRW5ELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQiwyQ0FBMkM7UUFDM0MsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLE1BQU0sUUFBUSxHQUFHO1FBQ2Ysb0NBQW9DO1FBQ3BDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDMUIsZ0RBQWdEO1FBQ2hELEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN6RCwyQ0FBMkM7UUFDM0MsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUEsV0FBSSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7S0FDcEQsQ0FBQztJQUVGLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLEdBQUcsT0FBTyxFQUFxQixDQUFDO1lBQ3pDLG9FQUFvRTtZQUNwRSxZQUFZLEdBQUc7Z0JBQ2IsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZLElBQUksR0FBRyxDQUFDLFlBQWE7Z0JBQ25ELGNBQWMsRUFBRSxHQUFHLENBQUMsY0FBYztnQkFDbEMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO2dCQUNwQixjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWM7YUFDbkMsQ0FBQztZQUNGLE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwyQkFBMkI7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsMENBQTBDO0FBQzFDLFNBQWdCLGVBQWU7SUFDN0IsT0FBTyxnQkFBZ0IsRUFBRSxDQUFDO0FBQzVCLENBQUM7QUFGRCwwQ0FFQztBQUVELFNBQWdCLE9BQU87SUFDckIsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztJQUMvQixPQUFPLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUM7QUFDdEMsQ0FBQztBQUhELDBCQUdDO0FBRUQsU0FBZ0IsY0FBYztJQUM1QixNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBQy9CLE9BQU8sR0FBRyxFQUFFLGNBQWMsRUFBRSxJQUFJLEtBQUssQ0FBQztBQUN4QyxDQUFDO0FBSEQsd0NBR0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE5hdGl2ZSBiaW5kaW5ncyBsb2FkZXIgZm9yIFJ1dkxMTVxuICpcbiAqIEF1dG9tYXRpY2FsbHkgbG9hZHMgdGhlIGNvcnJlY3QgbmF0aXZlIGJpbmFyeSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uXG4gKi9cblxuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuXG4vLyBUcnkgdG8gbG9hZCB0aGUgbmF0aXZlIG1vZHVsZVxubGV0IG5hdGl2ZU1vZHVsZTogTmF0aXZlUnV2TExNIHwgbnVsbCA9IG51bGw7XG5cbmludGVyZmFjZSBOYXRpdmVSdXZMTE0ge1xuICAvLyBOYXRpdmUgZXhwb3J0cyBSdXZMbG1FbmdpbmUgKGNhbWVsQ2FzZSksIHdlIG5vcm1hbGl6ZSB0byBSdXZMTE1FbmdpbmVcbiAgUnV2TExNRW5naW5lOiBuZXcgKGNvbmZpZz86IE5hdGl2ZUNvbmZpZykgPT4gTmF0aXZlRW5naW5lO1xuICBTaW1kT3BlcmF0aW9uczogbmV3ICgpID0+IE5hdGl2ZVNpbWRPcHM7XG4gIHZlcnNpb246ICgpID0+IHN0cmluZztcbiAgaGFzU2ltZFN1cHBvcnQ6ICgpID0+IGJvb2xlYW47XG59XG5cbi8vIFJhdyBuYXRpdmUgbW9kdWxlIGludGVyZmFjZSAoYWN0dWFsIGV4cG9ydCBuYW1lcylcbmludGVyZmFjZSBSYXdOYXRpdmVNb2R1bGUge1xuICBSdXZMbG1FbmdpbmU/OiBuZXcgKGNvbmZpZz86IE5hdGl2ZUNvbmZpZykgPT4gTmF0aXZlRW5naW5lO1xuICBSdXZMTE1FbmdpbmU/OiBuZXcgKGNvbmZpZz86IE5hdGl2ZUNvbmZpZykgPT4gTmF0aXZlRW5naW5lO1xuICBTaW1kT3BlcmF0aW9uczogbmV3ICgpID0+IE5hdGl2ZVNpbWRPcHM7XG4gIHZlcnNpb246ICgpID0+IHN0cmluZztcbiAgaGFzU2ltZFN1cHBvcnQ6ICgpID0+IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBOYXRpdmVDb25maWcge1xuICBlbWJlZGRpbmdfZGltPzogbnVtYmVyO1xuICByb3V0ZXJfaGlkZGVuX2RpbT86IG51bWJlcjtcbiAgaG5zd19tPzogbnVtYmVyO1xuICBobnN3X2VmX2NvbnN0cnVjdGlvbj86IG51bWJlcjtcbiAgaG5zd19lZl9zZWFyY2g/OiBudW1iZXI7XG4gIGxlYXJuaW5nX2VuYWJsZWQ/OiBib29sZWFuO1xuICBxdWFsaXR5X3RocmVzaG9sZD86IG51bWJlcjtcbiAgZXdjX2xhbWJkYT86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIE5hdGl2ZUVuZ2luZSB7XG4gIHF1ZXJ5KHRleHQ6IHN0cmluZywgY29uZmlnPzogTmF0aXZlR2VuQ29uZmlnKTogTmF0aXZlUXVlcnlSZXNwb25zZTtcbiAgZ2VuZXJhdGUocHJvbXB0OiBzdHJpbmcsIGNvbmZpZz86IE5hdGl2ZUdlbkNvbmZpZyk6IHN0cmluZztcbiAgcm91dGUodGV4dDogc3RyaW5nKTogTmF0aXZlUm91dGluZ0RlY2lzaW9uO1xuICBzZWFyY2hNZW1vcnkodGV4dDogc3RyaW5nLCBrPzogbnVtYmVyKTogTmF0aXZlTWVtb3J5UmVzdWx0W107XG4gIGFkZE1lbW9yeShjb250ZW50OiBzdHJpbmcsIG1ldGFkYXRhPzogc3RyaW5nKTogbnVtYmVyO1xuICBmZWVkYmFjayhyZXF1ZXN0SWQ6IHN0cmluZywgcmF0aW5nOiBudW1iZXIsIGNvcnJlY3Rpb24/OiBzdHJpbmcpOiBib29sZWFuO1xuICBzdGF0cygpOiBOYXRpdmVTdGF0cztcbiAgZm9yY2VMZWFybigpOiBzdHJpbmc7XG4gIGVtYmVkKHRleHQ6IHN0cmluZyk6IG51bWJlcltdO1xuICBzaW1pbGFyaXR5KHRleHQxOiBzdHJpbmcsIHRleHQyOiBzdHJpbmcpOiBudW1iZXI7XG4gIGhhc1NpbWQoKTogYm9vbGVhbjtcbiAgc2ltZENhcGFiaWxpdGllcygpOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIE5hdGl2ZUdlbkNvbmZpZyB7XG4gIG1heF90b2tlbnM/OiBudW1iZXI7XG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyO1xuICB0b3BfcD86IG51bWJlcjtcbiAgdG9wX2s/OiBudW1iZXI7XG4gIHJlcGV0aXRpb25fcGVuYWx0eT86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIE5hdGl2ZVF1ZXJ5UmVzcG9uc2Uge1xuICB0ZXh0OiBzdHJpbmc7XG4gIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgbW9kZWw6IHN0cmluZztcbiAgY29udGV4dF9zaXplOiBudW1iZXI7XG4gIGxhdGVuY3lfbXM6IG51bWJlcjtcbiAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTmF0aXZlUm91dGluZ0RlY2lzaW9uIHtcbiAgbW9kZWw6IHN0cmluZztcbiAgY29udGV4dF9zaXplOiBudW1iZXI7XG4gIHRlbXBlcmF0dXJlOiBudW1iZXI7XG4gIHRvcF9wOiBudW1iZXI7XG4gIGNvbmZpZGVuY2U6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIE5hdGl2ZU1lbW9yeVJlc3VsdCB7XG4gIGlkOiBudW1iZXI7XG4gIHNjb3JlOiBudW1iZXI7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgbWV0YWRhdGE6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE5hdGl2ZVN0YXRzIHtcbiAgdG90YWxfcXVlcmllczogbnVtYmVyO1xuICBtZW1vcnlfbm9kZXM6IG51bWJlcjtcbiAgcGF0dGVybnNfbGVhcm5lZDogbnVtYmVyO1xuICBhdmdfbGF0ZW5jeV9tczogbnVtYmVyO1xuICBjYWNoZV9oaXRfcmF0ZTogbnVtYmVyO1xuICByb3V0ZXJfYWNjdXJhY3k6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIE5hdGl2ZVNpbWRPcHMge1xuICBkb3RQcm9kdWN0KGE6IG51bWJlcltdLCBiOiBudW1iZXJbXSk6IG51bWJlcjtcbiAgY29zaW5lU2ltaWxhcml0eShhOiBudW1iZXJbXSwgYjogbnVtYmVyW10pOiBudW1iZXI7XG4gIGwyRGlzdGFuY2UoYTogbnVtYmVyW10sIGI6IG51bWJlcltdKTogbnVtYmVyO1xuICBtYXR2ZWMobWF0cml4OiBudW1iZXJbXVtdLCB2ZWN0b3I6IG51bWJlcltdKTogbnVtYmVyW107XG4gIHNvZnRtYXgoaW5wdXQ6IG51bWJlcltdKTogbnVtYmVyW107XG59XG5cbi8vIFBsYXRmb3JtLXNwZWNpZmljIHBhY2thZ2UgbmFtZXNcbmNvbnN0IFBMQVRGT1JNX1BBQ0tBR0VTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnZGFyd2luLXg2NCc6ICdAcnV2ZWN0b3IvcnV2bGxtLWRhcndpbi14NjQnLFxuICAnZGFyd2luLWFybTY0JzogJ0BydXZlY3Rvci9ydXZsbG0tZGFyd2luLWFybTY0JyxcbiAgJ2xpbnV4LXg2NCc6ICdAcnV2ZWN0b3IvcnV2bGxtLWxpbnV4LXg2NC1nbnUnLFxuICAnbGludXgtYXJtNjQnOiAnQHJ1dmVjdG9yL3J1dmxsbS1saW51eC1hcm02NC1nbnUnLFxuICAnd2luMzIteDY0JzogJ0BydXZlY3Rvci9ydXZsbG0td2luMzIteDY0LW1zdmMnLFxufTtcblxuZnVuY3Rpb24gZ2V0UGxhdGZvcm1LZXkoKTogc3RyaW5nIHtcbiAgY29uc3QgcGxhdGZvcm0gPSBwcm9jZXNzLnBsYXRmb3JtO1xuICBjb25zdCBhcmNoID0gcHJvY2Vzcy5hcmNoO1xuICByZXR1cm4gYCR7cGxhdGZvcm19LSR7YXJjaH1gO1xufVxuXG5mdW5jdGlvbiBsb2FkTmF0aXZlTW9kdWxlKCk6IE5hdGl2ZVJ1dkxMTSB8IG51bGwge1xuICBpZiAobmF0aXZlTW9kdWxlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZU1vZHVsZTtcbiAgfVxuXG4gIGNvbnN0IHBsYXRmb3JtS2V5ID0gZ2V0UGxhdGZvcm1LZXkoKTtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBQTEFURk9STV9QQUNLQUdFU1twbGF0Zm9ybUtleV07XG5cbiAgaWYgKCFwYWNrYWdlTmFtZSkge1xuICAgIC8vIFNpbGVudGx5IGZhaWwgLSBKUyBmYWxsYmFjayB3aWxsIGJlIHVzZWRcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFRyeSBsb2FkaW5nIGZyb20gb3B0aW9uYWwgZGVwZW5kZW5jaWVzXG4gIGNvbnN0IGF0dGVtcHRzID0gW1xuICAgIC8vIFRyeSB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgcGFja2FnZVxuICAgICgpID0+IHJlcXVpcmUocGFja2FnZU5hbWUpLFxuICAgIC8vIFRyeSBsb2FkaW5nIGZyb20gbG9jYWwgLm5vZGUgZmlsZSAoQ0pTIGJ1aWxkKVxuICAgICgpID0+IHJlcXVpcmUoam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICdydXZsbG0ubm9kZScpKSxcbiAgICAvLyBUcnkgbG9hZGluZyBmcm9tIGxvY2FsIC5ub2RlIGZpbGUgKHJvb3QpXG4gICAgKCkgPT4gcmVxdWlyZShqb2luKF9fZGlybmFtZSwgJy4uJywgJ3J1dmxsbS5ub2RlJykpLFxuICBdO1xuXG4gIGZvciAoY29uc3QgYXR0ZW1wdCBvZiBhdHRlbXB0cykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBhdHRlbXB0KCkgYXMgUmF3TmF0aXZlTW9kdWxlO1xuICAgICAgLy8gTm9ybWFsaXplOiBuYXRpdmUgZXhwb3J0cyBSdXZMbG1FbmdpbmUsIHdlIGV4cG9zZSBhcyBSdXZMTE1FbmdpbmVcbiAgICAgIG5hdGl2ZU1vZHVsZSA9IHtcbiAgICAgICAgUnV2TExNRW5naW5lOiByYXcuUnV2TExNRW5naW5lID8/IHJhdy5SdXZMbG1FbmdpbmUhLFxuICAgICAgICBTaW1kT3BlcmF0aW9uczogcmF3LlNpbWRPcGVyYXRpb25zLFxuICAgICAgICB2ZXJzaW9uOiByYXcudmVyc2lvbixcbiAgICAgICAgaGFzU2ltZFN1cHBvcnQ6IHJhdy5oYXNTaW1kU3VwcG9ydCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gbmF0aXZlTW9kdWxlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQ29udGludWUgdG8gbmV4dCBhdHRlbXB0XG4gICAgfVxuICB9XG5cbiAgLy8gU2lsZW50bHkgZmFsbCBiYWNrIHRvIEpTIGltcGxlbWVudGF0aW9uXG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBFeHBvcnQgZnVuY3Rpb25zIHRvIGdldCBuYXRpdmUgYmluZGluZ3NcbmV4cG9ydCBmdW5jdGlvbiBnZXROYXRpdmVNb2R1bGUoKTogTmF0aXZlUnV2TExNIHwgbnVsbCB7XG4gIHJldHVybiBsb2FkTmF0aXZlTW9kdWxlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gIGNvbnN0IG1vZCA9IGxvYWROYXRpdmVNb2R1bGUoKTtcbiAgcmV0dXJuIG1vZD8udmVyc2lvbigpID8/ICcwLjEuMC1qcyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNTaW1kU3VwcG9ydCgpOiBib29sZWFuIHtcbiAgY29uc3QgbW9kID0gbG9hZE5hdGl2ZU1vZHVsZSgpO1xuICByZXR1cm4gbW9kPy5oYXNTaW1kU3VwcG9ydCgpID8/IGZhbHNlO1xufVxuXG4vLyBFeHBvcnQgdHlwZXMgZm9yIGludGVybmFsIHVzZVxuZXhwb3J0IHR5cGUge1xuICBOYXRpdmVSdXZMTE0sXG4gIE5hdGl2ZUNvbmZpZyxcbiAgTmF0aXZlRW5naW5lLFxuICBOYXRpdmVHZW5Db25maWcsXG4gIE5hdGl2ZVF1ZXJ5UmVzcG9uc2UsXG4gIE5hdGl2ZVJvdXRpbmdEZWNpc2lvbixcbiAgTmF0aXZlTWVtb3J5UmVzdWx0LFxuICBOYXRpdmVTdGF0cyxcbiAgTmF0aXZlU2ltZE9wcyxcbn07XG4iXX0=
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7QUE4SkgsMENBRUM7QUFFRCwwQkFHQztBQUVELHdDQUdDO0FBeEtELCtCQUE0QjtBQUU1QixnQ0FBZ0M7QUFDaEMsSUFBSSxZQUFZLEdBQXdCLElBQUksQ0FBQztBQThGN0Msa0NBQWtDO0FBQ2xDLE1BQU0saUJBQWlCLEdBQTJCO0lBQ2hELFlBQVksRUFBRSw2QkFBNkI7SUFDM0MsY0FBYyxFQUFFLCtCQUErQjtJQUMvQyxXQUFXLEVBQUUsZ0NBQWdDO0lBQzdDLGFBQWEsRUFBRSxrQ0FBa0M7SUFDakQsV0FBVyxFQUFFLGlDQUFpQztDQUMvQyxDQUFDO0FBRUYsU0FBUyxjQUFjO0lBQ3JCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDbEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztJQUMxQixPQUFPLEdBQUcsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRCxTQUFTLGdCQUFnQjtJQUN2QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxjQUFjLEVBQUUsQ0FBQztJQUNyQyxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVuRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsMkNBQTJDO1FBQzNDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHlDQUF5QztJQUN6QyxNQUFNLFFBQVEsR0FBRztRQUNmLG9DQUFvQztRQUNwQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzFCLGdEQUFnRDtRQUNoRCxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDekQsMkNBQTJDO1FBQzNDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0tBQ3BELENBQUM7SUFFRixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFHLE9BQU8sRUFBcUIsQ0FBQztZQUN6QyxvRUFBb0U7WUFDcEUsWUFBWSxHQUFHO2dCQUNiLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxZQUFhO2dCQUNuRCxjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWM7Z0JBQ2xDLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztnQkFDcEIsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjO2FBQ25DLENBQUM7WUFDRixPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsMkJBQTJCO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELDBDQUEwQztBQUMxQyxTQUFnQixlQUFlO0lBQzdCLE9BQU8sZ0JBQWdCLEVBQUUsQ0FBQztBQUM1QixDQUFDO0FBRUQsU0FBZ0IsT0FBTztJQUNyQixNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBQy9CLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQztBQUN0QyxDQUFDO0FBRUQsU0FBZ0IsY0FBYztJQUM1QixNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBQy9CLE9BQU8sR0FBRyxFQUFFLGNBQWMsRUFBRSxJQUFJLEtBQUssQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBOYXRpdmUgYmluZGluZ3MgbG9hZGVyIGZvciBSdXZMTE1cbiAqXG4gKiBBdXRvbWF0aWNhbGx5IGxvYWRzIHRoZSBjb3JyZWN0IG5hdGl2ZSBiaW5hcnkgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLlxuICovXG5cbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcblxuLy8gVHJ5IHRvIGxvYWQgdGhlIG5hdGl2ZSBtb2R1bGVcbmxldCBuYXRpdmVNb2R1bGU6IE5hdGl2ZVJ1dkxMTSB8IG51bGwgPSBudWxsO1xuXG5pbnRlcmZhY2UgTmF0aXZlUnV2TExNIHtcbiAgLy8gTmF0aXZlIGV4cG9ydHMgUnV2TGxtRW5naW5lIChjYW1lbENhc2UpLCB3ZSBub3JtYWxpemUgdG8gUnV2TExNRW5naW5lXG4gIFJ1dkxMTUVuZ2luZTogbmV3IChjb25maWc/OiBOYXRpdmVDb25maWcpID0+IE5hdGl2ZUVuZ2luZTtcbiAgU2ltZE9wZXJhdGlvbnM6IG5ldyAoKSA9PiBOYXRpdmVTaW1kT3BzO1xuICB2ZXJzaW9uOiAoKSA9PiBzdHJpbmc7XG4gIGhhc1NpbWRTdXBwb3J0OiAoKSA9PiBib29sZWFuO1xufVxuXG4vLyBSYXcgbmF0aXZlIG1vZHVsZSBpbnRlcmZhY2UgKGFjdHVhbCBleHBvcnQgbmFtZXMpXG5pbnRlcmZhY2UgUmF3TmF0aXZlTW9kdWxlIHtcbiAgUnV2TGxtRW5naW5lPzogbmV3IChjb25maWc/OiBOYXRpdmVDb25maWcpID0+IE5hdGl2ZUVuZ2luZTtcbiAgUnV2TExNRW5naW5lPzogbmV3IChjb25maWc/OiBOYXRpdmVDb25maWcpID0+IE5hdGl2ZUVuZ2luZTtcbiAgU2ltZE9wZXJhdGlvbnM6IG5ldyAoKSA9PiBOYXRpdmVTaW1kT3BzO1xuICB2ZXJzaW9uOiAoKSA9PiBzdHJpbmc7XG4gIGhhc1NpbWRTdXBwb3J0OiAoKSA9PiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgTmF0aXZlQ29uZmlnIHtcbiAgZW1iZWRkaW5nX2RpbT86IG51bWJlcjtcbiAgcm91dGVyX2hpZGRlbl9kaW0/OiBudW1iZXI7XG4gIGhuc3dfbT86IG51bWJlcjtcbiAgaG5zd19lZl9jb25zdHJ1Y3Rpb24/OiBudW1iZXI7XG4gIGhuc3dfZWZfc2VhcmNoPzogbnVtYmVyO1xuICBsZWFybmluZ19lbmFibGVkPzogYm9vbGVhbjtcbiAgcXVhbGl0eV90aHJlc2hvbGQ/OiBudW1iZXI7XG4gIGV3Y19sYW1iZGE/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBOYXRpdmVFbmdpbmUge1xuICBxdWVyeSh0ZXh0OiBzdHJpbmcsIGNvbmZpZz86IE5hdGl2ZUdlbkNvbmZpZyk6IE5hdGl2ZVF1ZXJ5UmVzcG9uc2U7XG4gIGdlbmVyYXRlKHByb21wdDogc3RyaW5nLCBjb25maWc/OiBOYXRpdmVHZW5Db25maWcpOiBzdHJpbmc7XG4gIHJvdXRlKHRleHQ6IHN0cmluZyk6IE5hdGl2ZVJvdXRpbmdEZWNpc2lvbjtcbiAgc2VhcmNoTWVtb3J5KHRleHQ6IHN0cmluZywgaz86IG51bWJlcik6IE5hdGl2ZU1lbW9yeVJlc3VsdFtdO1xuICBhZGRNZW1vcnkoY29udGVudDogc3RyaW5nLCBtZXRhZGF0YT86IHN0cmluZyk6IG51bWJlcjtcbiAgZmVlZGJhY2socmVxdWVzdElkOiBzdHJpbmcsIHJhdGluZzogbnVtYmVyLCBjb3JyZWN0aW9uPzogc3RyaW5nKTogYm9vbGVhbjtcbiAgc3RhdHMoKTogTmF0aXZlU3RhdHM7XG4gIGZvcmNlTGVhcm4oKTogc3RyaW5nO1xuICBlbWJlZCh0ZXh0OiBzdHJpbmcpOiBudW1iZXJbXTtcbiAgc2ltaWxhcml0eSh0ZXh0MTogc3RyaW5nLCB0ZXh0Mjogc3RyaW5nKTogbnVtYmVyO1xuICBoYXNTaW1kKCk6IGJvb2xlYW47XG4gIHNpbWRDYXBhYmlsaXRpZXMoKTogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBOYXRpdmVHZW5Db25maWcge1xuICBtYXhfdG9rZW5zPzogbnVtYmVyO1xuICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcbiAgdG9wX3A/OiBudW1iZXI7XG4gIHRvcF9rPzogbnVtYmVyO1xuICByZXBldGl0aW9uX3BlbmFsdHk/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBOYXRpdmVRdWVyeVJlc3BvbnNlIHtcbiAgdGV4dDogc3RyaW5nO1xuICBjb25maWRlbmNlOiBudW1iZXI7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIGNvbnRleHRfc2l6ZTogbnVtYmVyO1xuICBsYXRlbmN5X21zOiBudW1iZXI7XG4gIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE5hdGl2ZVJvdXRpbmdEZWNpc2lvbiB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIGNvbnRleHRfc2l6ZTogbnVtYmVyO1xuICB0ZW1wZXJhdHVyZTogbnVtYmVyO1xuICB0b3BfcDogbnVtYmVyO1xuICBjb25maWRlbmNlOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBOYXRpdmVNZW1vcnlSZXN1bHQge1xuICBpZDogbnVtYmVyO1xuICBzY29yZTogbnVtYmVyO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIG1ldGFkYXRhOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBOYXRpdmVTdGF0cyB7XG4gIHRvdGFsX3F1ZXJpZXM6IG51bWJlcjtcbiAgbWVtb3J5X25vZGVzOiBudW1iZXI7XG4gIHBhdHRlcm5zX2xlYXJuZWQ6IG51bWJlcjtcbiAgYXZnX2xhdGVuY3lfbXM6IG51bWJlcjtcbiAgY2FjaGVfaGl0X3JhdGU6IG51bWJlcjtcbiAgcm91dGVyX2FjY3VyYWN5OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBOYXRpdmVTaW1kT3BzIHtcbiAgZG90UHJvZHVjdChhOiBudW1iZXJbXSwgYjogbnVtYmVyW10pOiBudW1iZXI7XG4gIGNvc2luZVNpbWlsYXJpdHkoYTogbnVtYmVyW10sIGI6IG51bWJlcltdKTogbnVtYmVyO1xuICBsMkRpc3RhbmNlKGE6IG51bWJlcltdLCBiOiBudW1iZXJbXSk6IG51bWJlcjtcbiAgbWF0dmVjKG1hdHJpeDogbnVtYmVyW11bXSwgdmVjdG9yOiBudW1iZXJbXSk6IG51bWJlcltdO1xuICBzb2Z0bWF4KGlucHV0OiBudW1iZXJbXSk6IG51bWJlcltdO1xufVxuXG4vLyBQbGF0Zm9ybS1zcGVjaWZpYyBwYWNrYWdlIG5hbWVzXG5jb25zdCBQTEFURk9STV9QQUNLQUdFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2Rhcndpbi14NjQnOiAnQHJ1dmVjdG9yL3J1dmxsbS1kYXJ3aW4teDY0JyxcbiAgJ2Rhcndpbi1hcm02NCc6ICdAcnV2ZWN0b3IvcnV2bGxtLWRhcndpbi1hcm02NCcsXG4gICdsaW51eC14NjQnOiAnQHJ1dmVjdG9yL3J1dmxsbS1saW51eC14NjQtZ251JyxcbiAgJ2xpbnV4LWFybTY0JzogJ0BydXZlY3Rvci9ydXZsbG0tbGludXgtYXJtNjQtZ251JyxcbiAgJ3dpbjMyLXg2NCc6ICdAcnV2ZWN0b3IvcnV2bGxtLXdpbjMyLXg2NC1tc3ZjJyxcbn07XG5cbmZ1bmN0aW9uIGdldFBsYXRmb3JtS2V5KCk6IHN0cmluZyB7XG4gIGNvbnN0IHBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybTtcbiAgY29uc3QgYXJjaCA9IHByb2Nlc3MuYXJjaDtcbiAgcmV0dXJuIGAke3BsYXRmb3JtfS0ke2FyY2h9YDtcbn1cblxuZnVuY3Rpb24gbG9hZE5hdGl2ZU1vZHVsZSgpOiBOYXRpdmVSdXZMTE0gfCBudWxsIHtcbiAgaWYgKG5hdGl2ZU1vZHVsZSkge1xuICAgIHJldHVybiBuYXRpdmVNb2R1bGU7XG4gIH1cblxuICBjb25zdCBwbGF0Zm9ybUtleSA9IGdldFBsYXRmb3JtS2V5KCk7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gUExBVEZPUk1fUEFDS0FHRVNbcGxhdGZvcm1LZXldO1xuXG4gIGlmICghcGFja2FnZU5hbWUpIHtcbiAgICAvLyBTaWxlbnRseSBmYWlsIC0gSlMgZmFsbGJhY2sgd2lsbCBiZSB1c2VkXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBUcnkgbG9hZGluZyBmcm9tIG9wdGlvbmFsIGRlcGVuZGVuY2llc1xuICBjb25zdCBhdHRlbXB0cyA9IFtcbiAgICAvLyBUcnkgdGhlIHBsYXRmb3JtLXNwZWNpZmljIHBhY2thZ2VcbiAgICAoKSA9PiByZXF1aXJlKHBhY2thZ2VOYW1lKSxcbiAgICAvLyBUcnkgbG9hZGluZyBmcm9tIGxvY2FsIC5ub2RlIGZpbGUgKENKUyBidWlsZClcbiAgICAoKSA9PiByZXF1aXJlKGpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAncnV2bGxtLm5vZGUnKSksXG4gICAgLy8gVHJ5IGxvYWRpbmcgZnJvbSBsb2NhbCAubm9kZSBmaWxlIChyb290KVxuICAgICgpID0+IHJlcXVpcmUoam9pbihfX2Rpcm5hbWUsICcuLicsICdydXZsbG0ubm9kZScpKSxcbiAgXTtcblxuICBmb3IgKGNvbnN0IGF0dGVtcHQgb2YgYXR0ZW1wdHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gYXR0ZW1wdCgpIGFzIFJhd05hdGl2ZU1vZHVsZTtcbiAgICAgIC8vIE5vcm1hbGl6ZTogbmF0aXZlIGV4cG9ydHMgUnV2TGxtRW5naW5lLCB3ZSBleHBvc2UgYXMgUnV2TExNRW5naW5lXG4gICAgICBuYXRpdmVNb2R1bGUgPSB7XG4gICAgICAgIFJ1dkxMTUVuZ2luZTogcmF3LlJ1dkxMTUVuZ2luZSA/PyByYXcuUnV2TGxtRW5naW5lISxcbiAgICAgICAgU2ltZE9wZXJhdGlvbnM6IHJhdy5TaW1kT3BlcmF0aW9ucyxcbiAgICAgICAgdmVyc2lvbjogcmF3LnZlcnNpb24sXG4gICAgICAgIGhhc1NpbWRTdXBwb3J0OiByYXcuaGFzU2ltZFN1cHBvcnQsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5hdGl2ZU1vZHVsZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENvbnRpbnVlIHRvIG5leHQgYXR0ZW1wdFxuICAgIH1cbiAgfVxuXG4gIC8vIFNpbGVudGx5IGZhbGwgYmFjayB0byBKUyBpbXBsZW1lbnRhdGlvblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gRXhwb3J0IGZ1bmN0aW9ucyB0byBnZXQgbmF0aXZlIGJpbmRpbmdzXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmF0aXZlTW9kdWxlKCk6IE5hdGl2ZVJ1dkxMTSB8IG51bGwge1xuICByZXR1cm4gbG9hZE5hdGl2ZU1vZHVsZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmVyc2lvbigpOiBzdHJpbmcge1xuICBjb25zdCBtb2QgPSBsb2FkTmF0aXZlTW9kdWxlKCk7XG4gIHJldHVybiBtb2Q/LnZlcnNpb24oKSA/PyAnMC4xLjAtanMnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzU2ltZFN1cHBvcnQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1vZCA9IGxvYWROYXRpdmVNb2R1bGUoKTtcbiAgcmV0dXJuIG1vZD8uaGFzU2ltZFN1cHBvcnQoKSA/PyBmYWxzZTtcbn1cblxuLy8gRXhwb3J0IHR5cGVzIGZvciBpbnRlcm5hbCB1c2VcbmV4cG9ydCB0eXBlIHtcbiAgTmF0aXZlUnV2TExNLFxuICBOYXRpdmVDb25maWcsXG4gIE5hdGl2ZUVuZ2luZSxcbiAgTmF0aXZlR2VuQ29uZmlnLFxuICBOYXRpdmVRdWVyeVJlc3BvbnNlLFxuICBOYXRpdmVSb3V0aW5nRGVjaXNpb24sXG4gIE5hdGl2ZU1lbW9yeVJlc3VsdCxcbiAgTmF0aXZlU3RhdHMsXG4gIE5hdGl2ZVNpbWRPcHMsXG59O1xuIl19
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * Streaming response support for RuvLLM
3
3
  */
4
- /// <reference types="node" />
5
4
  import { StreamChunk, StreamOptions, QueryResponse, GenerationConfig } from './types';
6
5
  /**
7
6
  * Async generator for streaming responses
@@ -1 +1 @@
1
- {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/streaming.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,OAAO,EACL,WAAW,EACX,aAAa,EACb,aAAa,EACb,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,GAAG,CAGT;gBAEU,GAAG,EAAE;QACf,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,KAAK,MAAM,CAAC;QAChE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,KAAK,aAAa,CAAC;KACnE;IAID;;;;;OAKG;IACI,MAAM,CACX,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,gBAAgB,GACxB,cAAc,CAAC,WAAW,CAAC;IA8B9B;;OAEG;IACG,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,CAAC;IAqCzB;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAQzE,OAAO,CAAC,KAAK;CAGd;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,cAAc,CAAC,WAAW,CAAC,GACrC,cAAc,CAAC,MAAM,CAAC,CAWxB"}
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/streaming.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,aAAa,EACb,aAAa,EACb,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,GAAG,CAGT;gBAEU,GAAG,EAAE;QACf,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,KAAK,MAAM,CAAC;QAChE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,KAAK,aAAa,CAAC;KACnE;IAID;;;;;OAKG;IACI,MAAM,CACX,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,gBAAgB,GACxB,cAAc,CAAC,WAAW,CAAC;IA8B9B;;OAEG;IACG,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,CAAC;IAqCzB;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAQzE,OAAO,CAAC,KAAK;CAGd;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,cAAc,CAAC,WAAW,CAAC,GACrC,cAAc,CAAC,MAAM,CAAC,CAWxB"}
@@ -3,7 +3,8 @@
3
3
  * Streaming response support for RuvLLM
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createReadableStream = exports.StreamingGenerator = void 0;
6
+ exports.StreamingGenerator = void 0;
7
+ exports.createReadableStream = createReadableStream;
7
8
  /**
8
9
  * Async generator for streaming responses
9
10
  *
@@ -127,5 +128,4 @@ function createReadableStream(generator) {
127
128
  },
128
129
  });
129
130
  }
130
- exports.createReadableStream = createReadableStream;
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbWluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7OztBQVNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFhLGtCQUFrQjtJQU03QixZQUFZLEdBR1g7UUFDQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQ1gsTUFBYyxFQUNkLE1BQXlCO1FBRXpCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUV6QixvRUFBb0U7UUFDcEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRW5ELHVDQUF1QztRQUN2QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFFbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxXQUFXLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLFVBQVUsRUFBRSxDQUFDO1lBRWIsbUNBQW1DO1lBQ25DLElBQUksVUFBVSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE1BQU07b0JBQ0osSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMs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LEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9DLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFiRCxvREFhQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RyZWFtaW5nIHJlc3BvbnNlIHN1cHBvcnQgZm9yIFJ1dkxMTVxuICovXG5cbmltcG9ydCB7XG4gIFN0cmVhbUNodW5rLFxuICBTdHJlYW1PcHRpb25zLFxuICBRdWVyeVJlc3BvbnNlLFxuICBHZW5lcmF0aW9uQ29uZmlnLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBBc3luYyBnZW5lcmF0b3IgZm9yIHN0cmVhbWluZyByZXNwb25zZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgUnV2TExNLCBTdHJlYW1pbmdHZW5lcmF0b3IgfSBmcm9tICdAcnV2ZWN0b3IvcnV2bGxtJztcbiAqXG4gKiBjb25zdCBsbG0gPSBuZXcgUnV2TExNKCk7XG4gKiBjb25zdCBzdHJlYW1lciA9IG5ldyBTdHJlYW1pbmdHZW5lcmF0b3IobGxtKTtcbiAqXG4gKiAvLyBTdHJlYW0gd2l0aCBhc3luYyBpdGVyYXRvclxuICogZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBzdHJlYW1lci5zdHJlYW0oJ1dyaXRlIGEgc3RvcnknKSkge1xuICogICBwcm9jZXNzLnN0ZG91dC53cml0ZShjaHVuay50ZXh0KTtcbiAqIH1cbiAqXG4gKiAvLyBTdHJlYW0gd2l0aCBjYWxsYmFja3NcbiAqIGF3YWl0IHN0cmVhbWVyLnN0cmVhbVdpdGhDYWxsYmFja3MoJ1dyaXRlIGEgcG9lbScsIHtcbiAqICAgb25DaHVuazogKGNodW5rKSA9PiBjb25zb2xlLmxvZyhjaHVuay50ZXh0KSxcbiAqICAgb25Db21wbGV0ZTogKHJlc3BvbnNlKSA9PiBjb25zb2xlLmxvZygnRG9uZSEnLCByZXNwb25zZS5sYXRlbmN5TXMpLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmVhbWluZ0dlbmVyYXRvciB7XG4gIHByaXZhdGUgbGxtOiB7XG4gICAgZ2VuZXJhdGU6IChwcm9tcHQ6IHN0cmluZywgY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZykgPT4gc3RyaW5nO1xuICAgIHF1ZXJ5OiAodGV4dDogc3RyaW5nLCBjb25maWc/OiBHZW5lcmF0aW9uQ29uZmlnKSA9PiBRdWVyeVJlc3BvbnNlO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGxsbToge1xuICAgIGdlbmVyYXRlOiAocHJvbXB0OiBzdHJpbmcsIGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpID0+IHN0cmluZztcbiAgICBxdWVyeTogKHRleHQ6IHN0cmluZywgY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZykgPT4gUXVlcnlSZXNwb25zZTtcbiAgfSkge1xuICAgIHRoaXMubGxtID0gbGxtO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSByZXNwb25zZSBhcyBhc3luYyBnZW5lcmF0b3JcbiAgICpcbiAgICogTm90ZTogVGhpcyBzaW11bGF0ZXMgc3RyZWFtaW5nIGJ5IGNodW5raW5nIHRoZSBmdWxsIHJlc3BvbnNlLlxuICAgKiBOYXRpdmUgc3RyZWFtaW5nIHJlcXVpcmVzIG5hdGl2ZSBtb2R1bGUgc3VwcG9ydC5cbiAgICovXG4gIGFzeW5jICpzdHJlYW0oXG4gICAgcHJvbXB0OiBzdHJpbmcsXG4gICAgY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZ1xuICApOiBBc3luY0dlbmVyYXRvcjxTdHJlYW1DaHVuaz4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIEdlbmVyYXRlIGZ1bGwgcmVzcG9uc2UgKG5hdGl2ZSBzdHJlYW1pbmcgd291bGQgeWllbGQgcmVhbCBjaHVua3MpXG4gICAgY29uc3QgZnVsbFRleHQgPSB0aGlzLmxsbS5nZW5lcmF0ZShwcm9tcHQsIGNvbmZpZyk7XG5cbiAgICAvLyBTaW11bGF0ZSBzdHJlYW1pbmcgYnkgeWllbGRpbmcgd29yZHNcbiAgICBjb25zdCB3b3JkcyA9IGZ1bGxUZXh0LnNwbGl0KC8oXFxzKykvKTtcbiAgICBsZXQgYWNjdW11bGF0ZWQgPSAnJztcbiAgICBsZXQgdG9rZW5Db3VudCA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhY2N1bXVsYXRlZCArPSB3b3Jkc1tpXTtcbiAgICAgIHRva2VuQ291bnQrKztcblxuICAgICAgLy8gWWllbGQgZXZlcnkgZmV3IHRva2VucyBvciBhdCBlbmRcbiAgICAgIGlmICh0b2tlbkNvdW50ICUgMyA9PT0gMCB8fCBpID09PSB3b3Jkcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHlpZWxkIHtcbiAgICAgICAgICB0ZXh0OiB3b3Jkcy5zbGljZShNYXRoLm1heCgwLCBpIC0gMiksIGkgKyAxKS5qb2luKCcnKSxcbiAgICAgICAgICBkb25lOiBpID09PSB3b3Jkcy5sZW5ndGggLSAxLFxuICAgICAgICAgIHRva2VuQ291bnQsXG4gICAgICAgICAgbGF0ZW5jeU1zOiBEYXRlLm5vdygpIC0gc3RhcnQsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU21hbGwgZGVsYXkgdG8gc2ltdWxhdGUgc3RyZWFtaW5nXG4gICAgICAgIGF3YWl0IHRoaXMuZGVsYXkoMTApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gd2l0aCBjYWxsYmFjayBoYW5kbGVyc1xuICAgKi9cbiAgYXN5bmMgc3RyZWFtV2l0aENhbGxiYWNrcyhcbiAgICBwcm9tcHQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBTdHJlYW1PcHRpb25zXG4gICk6IFByb21pc2U8UXVlcnlSZXNwb25zZT4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZnVsbFRleHQgPSAnJztcbiAgICBsZXQgdG9rZW5Db3VudCA9IDA7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiB0aGlzLnN0cmVhbShwcm9tcHQsIG9wdGlvbnMpKSB7XG4gICAgICAgIGZ1bGxUZXh0ICs9IGNodW5rLnRleHQ7XG4gICAgICAgIHRva2VuQ291bnQgPSBjaHVuay50b2tlbkNvdW50O1xuXG4gICAgICAgIGlmIChvcHRpb25zLm9uQ2h1bmspIHtcbiAgICAgICAgICBvcHRpb25zLm9uQ2h1bmsoY2h1bmspO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBRdWVyeVJlc3BvbnNlID0ge1xuICAgICAgICB0ZXh0OiBmdWxsVGV4dC50cmltKCksXG4gICAgICAgIGNvbmZpZGVuY2U6IDAuOCxcbiAgICAgICAgbW9kZWw6ICdzdHJlYW1pbmcnLFxuICAgICAgICBjb250ZXh0U2l6ZTogdG9rZW5Db3VudCxcbiAgICAgICAgbGF0ZW5jeU1zOiBEYXRlLm5vdygpIC0gc3RhcnQsXG4gICAgICAgIHJlcXVlc3RJZDogYHN0cmVhbS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YCxcbiAgICAgIH07XG5cbiAgICAgIGlmIChvcHRpb25zLm9uQ29tcGxldGUpIHtcbiAgICAgICAgb3B0aW9ucy5vbkNvbXBsZXRlKHJlc3BvbnNlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAob3B0aW9ucy5vbkVycm9yKSB7XG4gICAgICAgIG9wdGlvbnMub25FcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdCBzdHJlYW0gaW50byBzaW5nbGUgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGNvbGxlY3QocHJvbXB0OiBzdHJpbmcsIGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHRoaXMuc3RyZWFtKHByb21wdCwgY29uZmlnKSkge1xuICAgICAgcmVzdWx0ID0gY2h1bmsudGV4dDsgLy8gRWFjaCBjaHVuayBpcyBjdW11bGF0aXZlXG4gICAgfVxuICAgIHJldHVybiByZXN1bHQudHJpbSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVhZGFibGUgc3RyZWFtIGZyb20gcmVzcG9uc2VcbiAqIChGb3IgTm9kZS5qcyBzdHJlYW0gY29tcGF0aWJpbGl0eSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlYWRhYmxlU3RyZWFtKFxuICBnZW5lcmF0b3I6IEFzeW5jR2VuZXJhdG9yPFN0cmVhbUNodW5rPlxuKTogUmVhZGFibGVTdHJlYW08c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgZ2VuZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh2YWx1ZS50ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbWluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7OztBQWtKSCxvREFhQztBQXRKRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsTUFBYSxrQkFBa0I7SUFNN0IsWUFBWSxHQUdYO1FBQ0MsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUNYLE1BQWMsRUFDZCxNQUF5QjtRQUV6QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFekIsb0VBQW9FO1FBQ3BFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVuRCx1Q0FBdUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEMsV0FBVyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixVQUFVLEVBQUUsQ0FBQztZQUViLG1DQUFtQztZQUNuQyxJQUFJLFVBQVUsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxNQUFNO29CQUNKLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENB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QVU7WUFDbkIsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdHJlYW1pbmcgcmVzcG9uc2Ugc3VwcG9ydCBmb3IgUnV2TExNXG4gKi9cblxuaW1wb3J0IHtcbiAgU3RyZWFtQ2h1bmssXG4gIFN0cmVhbU9wdGlvbnMsXG4gIFF1ZXJ5UmVzcG9uc2UsXG4gIEdlbmVyYXRpb25Db25maWcsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEFzeW5jIGdlbmVyYXRvciBmb3Igc3RyZWFtaW5nIHJlc3BvbnNlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBSdXZMTE0sIFN0cmVhbWluZ0dlbmVyYXRvciB9IGZyb20gJ0BydXZlY3Rvci9ydXZsbG0nO1xuICpcbiAqIGNvbnN0IGxsbSA9IG5ldyBSdXZMTE0oKTtcbiAqIGNvbnN0IHN0cmVhbWVyID0gbmV3IFN0cmVhbWluZ0dlbmVyYXRvcihsbG0pO1xuICpcbiAqIC8vIFN0cmVhbSB3aXRoIGFzeW5jIGl0ZXJhdG9yXG4gKiBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHN0cmVhbWVyLnN0cmVhbSgnV3JpdGUgYSBzdG9yeScpKSB7XG4gKiAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGNodW5rLnRleHQpO1xuICogfVxuICpcbiAqIC8vIFN0cmVhbSB3aXRoIGNhbGxiYWNrc1xuICogYXdhaXQgc3RyZWFtZXIuc3RyZWFtV2l0aENhbGxiYWNrcygnV3JpdGUgYSBwb2VtJywge1xuICogICBvbkNodW5rOiAoY2h1bmspID0+IGNvbnNvbGUubG9nKGNodW5rLnRleHQpLFxuICogICBvbkNvbXBsZXRlOiAocmVzcG9uc2UpID0+IGNvbnNvbGUubG9nKCdEb25lIScsIHJlc3BvbnNlLmxhdGVuY3lNcyksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtaW5nR2VuZXJhdG9yIHtcbiAgcHJpdmF0ZSBsbG06IHtcbiAgICBnZW5lcmF0ZTogKHByb21wdDogc3RyaW5nLCBjb25maWc/OiBHZW5lcmF0aW9uQ29uZmlnKSA9PiBzdHJpbmc7XG4gICAgcXVlcnk6ICh0ZXh0OiBzdHJpbmcsIGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpID0+IFF1ZXJ5UmVzcG9uc2U7XG4gIH07XG5cbiAgY29uc3RydWN0b3IobGxtOiB7XG4gICAgZ2VuZXJhdGU6IChwcm9tcHQ6IHN0cmluZywgY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZykgPT4gc3RyaW5nO1xuICAgIHF1ZXJ5OiAodGV4dDogc3RyaW5nLCBjb25maWc/OiBHZW5lcmF0aW9uQ29uZmlnKSA9PiBRdWVyeVJlc3BvbnNlO1xuICB9KSB7XG4gICAgdGhpcy5sbG0gPSBsbG07XG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtIHJlc3BvbnNlIGFzIGFzeW5jIGdlbmVyYXRvclxuICAgKlxuICAgKiBOb3RlOiBUaGlzIHNpbXVsYXRlcyBzdHJlYW1pbmcgYnkgY2h1bmtpbmcgdGhlIGZ1bGwgcmVzcG9uc2UuXG4gICAqIE5hdGl2ZSBzdHJlYW1pbmcgcmVxdWlyZXMgbmF0aXZlIG1vZHVsZSBzdXBwb3J0LlxuICAgKi9cbiAgYXN5bmMgKnN0cmVhbShcbiAgICBwcm9tcHQ6IHN0cmluZyxcbiAgICBjb25maWc/OiBHZW5lcmF0aW9uQ29uZmlnXG4gICk6IEFzeW5jR2VuZXJhdG9yPFN0cmVhbUNodW5rPiB7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuXG4gICAgLy8gR2VuZXJhdGUgZnVsbCByZXNwb25zZSAobmF0aXZlIHN0cmVhbWluZyB3b3VsZCB5aWVsZCByZWFsIGNodW5rcylcbiAgICBjb25zdCBmdWxsVGV4dCA9IHRoaXMubGxtLmdlbmVyYXRlKHByb21wdCwgY29uZmlnKTtcblxuICAgIC8vIFNpbXVsYXRlIHN0cmVhbWluZyBieSB5aWVsZGluZyB3b3Jkc1xuICAgIGNvbnN0IHdvcmRzID0gZnVsbFRleHQuc3BsaXQoLyhcXHMrKS8pO1xuICAgIGxldCBhY2N1bXVsYXRlZCA9ICcnO1xuICAgIGxldCB0b2tlbkNvdW50ID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFjY3VtdWxhdGVkICs9IHdvcmRzW2ldO1xuICAgICAgdG9rZW5Db3VudCsrO1xuXG4gICAgICAvLyBZaWVsZCBldmVyeSBmZXcgdG9rZW5zIG9yIGF0IGVuZFxuICAgICAgaWYgKHRva2VuQ291bnQgJSAzID09PSAwIHx8IGkgPT09IHdvcmRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgeWllbGQge1xuICAgICAgICAgIHRleHQ6IHdvcmRzLnNsaWNlKE1hdGgubWF4KDAsIGkgLSAyKSwgaSArIDEpLmpvaW4oJycpLFxuICAgICAgICAgIGRvbmU6IGkgPT09IHdvcmRzLmxlbmd0aCAtIDEsXG4gICAgICAgICAgdG9rZW5Db3VudCxcbiAgICAgICAgICBsYXRlbmN5TXM6IERhdGUubm93KCkgLSBzdGFydCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTbWFsbCBkZWxheSB0byBzaW11bGF0ZSBzdHJlYW1pbmdcbiAgICAgICAgYXdhaXQgdGhpcy5kZWxheSgxMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSB3aXRoIGNhbGxiYWNrIGhhbmRsZXJzXG4gICAqL1xuICBhc3luYyBzdHJlYW1XaXRoQ2FsbGJhY2tzKFxuICAgIHByb21wdDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFN0cmVhbU9wdGlvbnNcbiAgKTogUHJvbWlzZTxRdWVyeVJlc3BvbnNlPiB7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBmdWxsVGV4dCA9ICcnO1xuICAgIGxldCB0b2tlbkNvdW50ID0gMDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHRoaXMuc3RyZWFtKHByb21wdCwgb3B0aW9ucykpIHtcbiAgICAgICAgZnVsbFRleHQgKz0gY2h1bmsudGV4dDtcbiAgICAgICAgdG9rZW5Db3VudCA9IGNodW5rLnRva2VuQ291bnQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMub25DaHVuaykge1xuICAgICAgICAgIG9wdGlvbnMub25DaHVuayhjaHVuayk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2U6IFF1ZXJ5UmVzcG9uc2UgPSB7XG4gICAgICAgIHRleHQ6IGZ1bGxUZXh0LnRyaW0oKSxcbiAgICAgICAgY29uZmlkZW5jZTogMC44LFxuICAgICAgICBtb2RlbDogJ3N0cmVhbWluZycsXG4gICAgICAgIGNvbnRleHRTaXplOiB0b2tlbkNvdW50LFxuICAgICAgICBsYXRlbmN5TXM6IERhdGUubm93KCkgLSBzdGFydCxcbiAgICAgICAgcmVxdWVzdElkOiBgc3RyZWFtLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKX1gLFxuICAgICAgfTtcblxuICAgICAgaWYgKG9wdGlvbnMub25Db21wbGV0ZSkge1xuICAgICAgICBvcHRpb25zLm9uQ29tcGxldGUocmVzcG9uc2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChvcHRpb25zLm9uRXJyb3IpIHtcbiAgICAgICAgb3B0aW9ucy5vbkVycm9yKGVycm9yIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0IHN0cmVhbSBpbnRvIHNpbmdsZSByZXNwb25zZVxuICAgKi9cbiAgYXN5bmMgY29sbGVjdChwcm9tcHQ6IHN0cmluZywgY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgdGhpcy5zdHJlYW0ocHJvbXB0LCBjb25maWcpKSB7XG4gICAgICByZXN1bHQgPSBjaHVuay50ZXh0OyAvLyBFYWNoIGNodW5rIGlzIGN1bXVsYXRpdmVcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGRlbGF5KG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSByZWFkYWJsZSBzdHJlYW0gZnJvbSByZXNwb25zZVxuICogKEZvciBOb2RlLmpzIHN0cmVhbSBjb21wYXRpYmlsaXR5KVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVhZGFibGVTdHJlYW0oXG4gIGdlbmVyYXRvcjogQXN5bmNHZW5lcmF0b3I8U3RyZWFtQ2h1bms+XG4pOiBSZWFkYWJsZVN0cmVhbTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgYXN5bmMgcHVsbChjb250cm9sbGVyKSB7XG4gICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCBnZW5lcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHZhbHVlLnRleHQpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuIl19
@@ -190,6 +190,8 @@ export declare class TrainingPipeline {
190
190
  private currentStep;
191
191
  private bestValLoss;
192
192
  private patienceCounter;
193
+ /** Set by resumeFrom(); makes the next train() continue instead of restart. */
194
+ private resumePending;
193
195
  constructor(config?: TrainingConfig, adapter?: LoraAdapter);
194
196
  /**
195
197
  * Add training batch
@@ -204,7 +206,14 @@ export declare class TrainingPipeline {
204
206
  quality: number;
205
207
  }>): void;
206
208
  /**
207
- * Run training
209
+ * Run training.
210
+ *
211
+ * When {@link resumeFrom} primed the pipeline, this continues from the
212
+ * restored epoch (running the remaining epochs of `config.epochs`) and
213
+ * advances the LR scheduler to the restored step so the schedule is
214
+ * unbroken; metrics history is preserved. Without a resume the run is
215
+ * unchanged from a fresh start — same reset, same scheduler, same result
216
+ * shape as before this method learned to resume.
208
217
  */
209
218
  train(): TrainingResult;
210
219
  /**
@@ -232,8 +241,29 @@ export declare class TrainingPipeline {
232
241
  /**
233
242
  * Load a checkpoint — by in-memory index, or from a file previously
234
243
  * written by `saveCheckpoint(path)`.
244
+ *
245
+ * For v2 files, the envelope's adapter geometry is checked against the
246
+ * current adapter first; a mismatch (different inputDim/outputDim/rank)
247
+ * returns false and leaves the adapter untouched, so mis-shaped weights
248
+ * are never silently restored. v1 files carry no geometry and load as
249
+ * before (back-compat).
235
250
  */
236
251
  loadCheckpoint(indexOrPath: number | string): boolean;
252
+ /**
253
+ * Resume training from a checkpoint file.
254
+ *
255
+ * Loads the checkpoint (with the same v2 shape validation as
256
+ * {@link loadCheckpoint}) AND primes the pipeline so the next {@link train}
257
+ * call continues from the restored epoch/step rather than restarting. This
258
+ * is the explicit, least-invasive resume path: a plain `loadCheckpoint()`
259
+ * still restores weights only (train() from scratch), while `resumeFrom()`
260
+ * additionally makes the subsequent train() pick up where the run stopped.
261
+ *
262
+ * @returns true when the checkpoint loaded and resume was primed; false if
263
+ * the file was missing, foreign, or shape-mismatched (in which case
264
+ * no resume is armed).
265
+ */
266
+ resumeFrom(path: string): boolean;
237
267
  /**
238
268
  * Get current metrics
239
269
  */
@@ -1 +1 @@
1
- {"version":3,"file":"training.d.ts","sourceRoot":"","sources":["../../src/training.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"training.d.ts","sourceRoot":"","sources":["../../src/training.ts"],"names":[],"mappings":"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"}
@@ -44,9 +44,18 @@ const DEFAULT_TRAINING_CONFIG = {
44
44
  checkpointInterval: 1,
45
45
  ewcLambda: 2000,
46
46
  validationSplit: 0.1,
47
+ keepBestCheckpoint: '',
47
48
  };
48
- /** On-disk checkpoint envelope (versioned for forward compatibility). */
49
- const CHECKPOINT_FORMAT_VERSION = 1;
49
+ /**
50
+ * On-disk checkpoint envelope version.
51
+ *
52
+ * v1 — {format, version:1, epoch, step, loss, weights, timestamp}. No adapter
53
+ * geometry, so loadCheckpoint() could not detect a shape mismatch.
54
+ * v2 — adds {config:{inputDim, outputDim, rank}, pipelineConfig:{learningRate,
55
+ * batchSize}} so loadCheckpoint() can reject weights that don't fit the
56
+ * current adapter. v1 files still load (back-compat) with no shape check.
57
+ */
58
+ const CHECKPOINT_FORMAT_VERSION = 2;
50
59
  /**
51
60
  * Learning Rate Scheduler
52
61
  */
@@ -209,6 +218,8 @@ class TrainingPipeline {
209
218
  this.currentStep = 0;
210
219
  this.bestValLoss = Infinity;
211
220
  this.patienceCounter = 0;
221
+ /** Set by resumeFrom(); makes the next train() continue instead of restart. */
222
+ this.resumePending = false;
212
223
  this.config = { ...DEFAULT_TRAINING_CONFIG, ...config };
213
224
  this.adapter = adapter || new lora_1.LoraAdapter({ rank: 8 });
214
225
  this.ewcManager = new sona_1.EwcManager(this.config.ewcLambda);
@@ -231,15 +242,34 @@ class TrainingPipeline {
231
242
  }
232
243
  }
233
244
  /**
234
- * Run training
245
+ * Run training.
246
+ *
247
+ * When {@link resumeFrom} primed the pipeline, this continues from the
248
+ * restored epoch (running the remaining epochs of `config.epochs`) and
249
+ * advances the LR scheduler to the restored step so the schedule is
250
+ * unbroken; metrics history is preserved. Without a resume the run is
251
+ * unchanged from a fresh start — same reset, same scheduler, same result
252
+ * shape as before this method learned to resume.
235
253
  */
236
254
  train() {
255
+ const resuming = this.resumePending;
256
+ this.resumePending = false;
257
+ // currentEpoch is the last COMPLETED epoch index, so resume the next one.
258
+ const startEpoch = resuming ? this.currentEpoch + 1 : 0;
237
259
  const totalSteps = this.batches.length * this.config.epochs;
238
260
  this.scheduler = new LRScheduler(this.config, totalSteps);
239
- this.metrics.reset();
261
+ if (resuming) {
262
+ // Fast-forward the fresh scheduler to the restored step.
263
+ for (let s = 0; s < this.currentStep && s < totalSteps; s++) {
264
+ this.scheduler.step();
265
+ }
266
+ }
267
+ else {
268
+ this.metrics.reset();
269
+ }
240
270
  this.adapter.startTraining(this.config.learningRate);
241
271
  let earlyStopped = false;
242
- for (let epoch = 0; epoch < this.config.epochs; epoch++) {
272
+ for (let epoch = startEpoch; epoch < this.config.epochs; epoch++) {
243
273
  this.currentEpoch = epoch;
244
274
  // Shuffle batches
245
275
  const shuffledBatches = this.shuffleBatches();
@@ -264,6 +294,10 @@ class TrainingPipeline {
264
294
  if (valLoss < this.bestValLoss) {
265
295
  this.bestValLoss = valLoss;
266
296
  this.patienceCounter = 0;
297
+ // Retain the best-validation model to a stable path when configured.
298
+ if (this.config.keepBestCheckpoint) {
299
+ this.saveCheckpoint(this.config.keepBestCheckpoint);
300
+ }
267
301
  }
268
302
  else {
269
303
  this.patienceCounter++;
@@ -376,6 +410,17 @@ class TrainingPipeline {
376
410
  const envelope = {
377
411
  format: 'ruvllm-checkpoint',
378
412
  version: CHECKPOINT_FORMAT_VERSION,
413
+ // Adapter geometry + pipeline hyperparams — lets loadCheckpoint()
414
+ // reject weights that don't fit the current adapter (v2, see below).
415
+ config: {
416
+ inputDim: this.adapter.getInputDim(),
417
+ outputDim: this.adapter.getOutputDim(),
418
+ rank: this.adapter.getConfig().rank,
419
+ },
420
+ pipelineConfig: {
421
+ learningRate: this.config.learningRate,
422
+ batchSize: this.config.batchSize,
423
+ },
379
424
  ...checkpoint,
380
425
  };
381
426
  const serialized = JSON.stringify(envelope);
@@ -389,6 +434,12 @@ class TrainingPipeline {
389
434
  /**
390
435
  * Load a checkpoint — by in-memory index, or from a file previously
391
436
  * written by `saveCheckpoint(path)`.
437
+ *
438
+ * For v2 files, the envelope's adapter geometry is checked against the
439
+ * current adapter first; a mismatch (different inputDim/outputDim/rank)
440
+ * returns false and leaves the adapter untouched, so mis-shaped weights
441
+ * are never silently restored. v1 files carry no geometry and load as
442
+ * before (back-compat).
392
443
  */
393
444
  loadCheckpoint(indexOrPath) {
394
445
  let checkpoint;
@@ -401,6 +452,14 @@ class TrainingPipeline {
401
452
  if (parsed?.format !== 'ruvllm-checkpoint' || typeof parsed.weights !== 'string') {
402
453
  return false;
403
454
  }
455
+ if (typeof parsed.version === 'number' && parsed.version >= 2 && parsed.config) {
456
+ const c = parsed.config;
457
+ if (c.inputDim !== this.adapter.getInputDim() ||
458
+ c.outputDim !== this.adapter.getOutputDim() ||
459
+ c.rank !== this.adapter.getConfig().rank) {
460
+ return false;
461
+ }
462
+ }
404
463
  checkpoint = parsed;
405
464
  }
406
465
  catch {
@@ -414,6 +473,26 @@ class TrainingPipeline {
414
473
  this.currentStep = checkpoint.step;
415
474
  return true;
416
475
  }
476
+ /**
477
+ * Resume training from a checkpoint file.
478
+ *
479
+ * Loads the checkpoint (with the same v2 shape validation as
480
+ * {@link loadCheckpoint}) AND primes the pipeline so the next {@link train}
481
+ * call continues from the restored epoch/step rather than restarting. This
482
+ * is the explicit, least-invasive resume path: a plain `loadCheckpoint()`
483
+ * still restores weights only (train() from scratch), while `resumeFrom()`
484
+ * additionally makes the subsequent train() pick up where the run stopped.
485
+ *
486
+ * @returns true when the checkpoint loaded and resume was primed; false if
487
+ * the file was missing, foreign, or shape-mismatched (in which case
488
+ * no resume is armed).
489
+ */
490
+ resumeFrom(path) {
491
+ if (!this.loadCheckpoint(path))
492
+ return false;
493
+ this.resumePending = true;
494
+ return true;
495
+ }
417
496
  /**
418
497
  * Get current metrics
419
498
  */
@@ -457,6 +536,7 @@ class TrainingPipeline {
457
536
  this.currentStep = 0;
458
537
  this.bestValLoss = Infinity;
459
538
  this.patienceCounter = 0;
539
+ this.resumePending = false;
460
540
  this.metrics.reset();
461
541
  this.adapter.reset();
462
542
  }
@@ -527,4 +607,4 @@ class TrainingFactory {
527
607
  }
528
608
  }
529
609
  exports.TrainingFactory = TrainingFactory;
530
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhaW5pbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhaW5pbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRzs7O0FBRUgsMkJBQTREO0FBQzVELCtCQUErQjtBQUUvQixpQ0FBcUM7QUFDckMsaUNBQW9DO0FBRXBDOztHQUVHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBNkI7SUFDeEQsWUFBWSxFQUFFLEtBQUs7SUFDbkIsU0FBUyxFQUFFLEVBQUU7SUFDYixNQUFNLEVBQUUsRUFBRTtJQUNWLFNBQVMsRUFBRSxRQUFRO0lBQ25CLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFlBQVksRUFBRSxHQUFHO0lBQ2pCLHFCQUFxQixFQUFFLENBQUM7SUFDeEIsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixTQUFTLEVBQUUsSUFBSTtJQUNmLGVBQWUsRUFBRSxHQUFHO0NBQ3JCLENBQUM7QUFzRUYseUVBQXlFO0FBQ3pFLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0FBRXBDOztHQUVHO0FBQ0gsTUFBYSxXQUFXO0lBTXRCLFlBQVksTUFBZ0MsRUFBRSxVQUFrQjtRQUh4RCxnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUk5QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSztRQUNILFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM5QixLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBRXhCLEtBQUssUUFBUTtnQkFDWCxPQUFPLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFD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RUFBRSxFQUFFO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxvQkFBb0I7UUFDekIsT0FBTyxJQUFJLGdCQUFnQixDQUFDO1lBQzFCLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxDQUFDO1lBQ1QsU0FBUyxFQUFFLEVBQUU7WUFDYixTQUFTLEVBQUUsUUFBUTtZQUNuQixTQUFTLEVBQUUsSUFBSTtTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFyREQsMENBcURDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUcmFpbmluZyBQaXBlbGluZSBmb3IgU09OQVxuICpcbiAqIENvbXByZWhlbnNpdmUgdHJhaW5pbmcgaW5mcmFzdHJ1Y3R1cmUgd2l0aCBtZXRyaWNzIHRyYWNraW5nLFxuICogbGVhcm5pbmcgcmF0ZSBzY2hlZHVsaW5nLCBhbmQgY2hlY2twb2ludCBtYW5hZ2VtZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBUcmFpbmluZ1BpcGVsaW5lLCBUcmFpbmluZ0NvbmZpZyB9IGZyb20gJ0BydXZlY3Rvci9ydXZsbG0nO1xuICpcbiAqIGNvbnN0IHBpcGVsaW5lID0gbmV3IFRyYWluaW5nUGlwZWxpbmUoe1xuICogICBsZWFybmluZ1JhdGU6IDAuMDAxLFxuICogICBiYXRjaFNpemU6IDMyLFxuICogICBlcG9jaHM6IDEwLFxuICogfSk7XG4gKlxuICogLy8gQWRkIHRyYWluaW5nIGRhdGFcbiAqIHBpcGVsaW5lLmFkZEJhdGNoKGlucHV0cywgdGFyZ2V0cywgcXVhbGl0aWVzKTtcbiAqXG4gKiAvLyBSdW4gdHJhaW5pbmdcbiAqIGNvbnN0IHJlc3VsdCA9IHBpcGVsaW5lLnRyYWluKCk7XG4gKiBjb25zb2xlLmxvZyhgRmluYWwgbG9zczogJHtyZXN1bHQuZmluYWxMb3NzfWApO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgd3JpdGVGaWxlU3luYywgcmVhZEZpbGVTeW5jLCBta2RpclN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFbWJlZGRpbmcsIFRyYWluaW5nQ29uZmlnLCBUcmFpbmluZ1Jlc3VsdCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgTG9yYUFkYXB0ZXIgfSBmcm9tICcuL2xvcmEnO1xuaW1wb3J0IHsgRXdjTWFuYWdlciB9IGZyb20gJy4vc29uYSc7XG5cbi8qKlxuICogRGVmYXVsdCB0cmFpbmluZyBjb25maWdcbiAqL1xuY29uc3QgREVGQVVMVF9UUkFJTklOR19DT05GSUc6IFJlcXVpcmVkPFRyYWluaW5nQ29uZmlnPiA9IHtcbiAgbGVhcm5pbmdSYXRlOiAwLjAwMSxcbiAgYmF0Y2hTaXplOiAzMixcbiAgZXBvY2hzOiAxMCxcbiAgc2NoZWR1bGVyOiAnY29zaW5lJyxcbiAgd2FybXVwU3RlcHM6IDEwMCxcbiAgd2VpZ2h0RGVjYXk6IDAuMDEsXG4gIGdyYWRpZW50Q2xpcDogMS4wLFxuICBlYXJseVN0b3BwaW5nUGF0aWVuY2U6IDMsXG4gIGNoZWNrcG9pbnRJbnRlcnZhbDogMSxcbiAgZXdjTGFtYmRhOiAyMDAwLFxuICB2YWxpZGF0aW9uU3BsaXQ6IDAuMSxcbn07XG5cbi8qKlxuICogVHJhaW5pbmcgbWV0cmljc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYWluaW5nTWV0cmljcyB7XG4gIC8qKiBDdXJyZW50IGVwb2NoICovXG4gIGVwb2NoOiBudW1iZXI7XG4gIC8qKiBDdXJyZW50IHN0ZXAgKi9cbiAgc3RlcDogbnVtYmVyO1xuICAvKiogVHJhaW5pbmcgbG9zcyAqL1xuICB0cmFpbkxvc3M6IG51bWJlcjtcbiAgLyoqIFZhbGlkYXRpb24gbG9zcyAqL1xuICB2YWxMb3NzOiBudW1iZXI7XG4gIC8qKiBMZWFybmluZyByYXRlICovXG4gIGxlYXJuaW5nUmF0ZTogbnVtYmVyO1xuICAvKiogR3JhZGllbnQgbm9ybSAqL1xuICBncmFkTm9ybTogbnVtYmVyO1xuICAvKiogU3RlcHMgcGVyIHNlY29uZCAqL1xuICBzdGVwc1BlclNlY29uZDogbnVtYmVyO1xuICAvKiogRVRBIGluIHNlY29uZHMgKi9cbiAgZXRhU2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRyYWluaW5nIGRhdGEgYmF0Y2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFpbmluZ0JhdGNoIHtcbiAgLyoqIElucHV0IGVtYmVkZGluZ3MgKi9cbiAgaW5wdXRzOiBFbWJlZGRpbmdbXTtcbiAgLyoqIFRhcmdldCBvdXRwdXRzICovXG4gIHRhcmdldHM6IEVtYmVkZGluZ1tdO1xuICAvKiogUXVhbGl0eSBzY29yZXMgKi9cbiAgcXVhbGl0aWVzOiBudW1iZXJbXTtcbn1cblxuLyoqXG4gKiBDaGVja3BvaW50IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja3BvaW50IHtcbiAgLyoqIEVwb2NoIG51bWJlciAqL1xuICBlcG9jaDogbnVtYmVyO1xuICAvKiogU3RlcCBudW1iZXIgKi9cbiAgc3RlcDogbnVtYmVyO1xuICAvKiogVHJhaW5pbmcgbG9zcyBhdCBjaGVja3BvaW50ICovXG4gIGxvc3M6IG51bWJlcjtcbiAgLyoqIE1vZGVsIHdlaWdodHMgKHNlcmlhbGl6ZWQpICovXG4gIHdlaWdodHM6IHN0cmluZztcbiAgLyoqIFRpbWVzdGFtcCAqL1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSBzYXZlQ2hlY2twb2ludCgpIGNhbGwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2twb2ludFNhdmVSZXN1bHQge1xuICAvKiogSW5kZXggb2YgdGhlIGNoZWNrcG9pbnQgaW4gdGhlIGluLW1lbW9yeSBjaGVja3BvaW50IGxpc3QgKi9cbiAgaW5kZXg6IG51bWJlcjtcbiAgLyoqIEVwb2NoIHRoZSBjaGVja3BvaW50IGNhcHR1cmVkICovXG4gIGVwb2NoOiBudW1iZXI7XG4gIC8qKiBTdGVwIHRoZSBjaGVja3BvaW50IGNhcHR1cmVkICovXG4gIHN0ZXA6IG51bWJlcjtcbiAgLyoqIFRyYWluaW5nIGxvc3MgYXQgY2hlY2twb2ludCB0aW1lICovXG4gIGxvc3M6IG51bWJlcjtcbiAgLyoqIEFic29sdXRlIG9yIGFzLWdpdmVuIGZpbGUgcGF0aCwgd2hlbiBwZXJzaXN0ZWQgdG8gZGlzayAqL1xuICBwYXRoPzogc3RyaW5nO1xuICAvKiogU2VyaWFsaXplZCBzaXplIGluIGJ5dGVzLCB3aGVuIHBlcnNpc3RlZCB0byBkaXNrICovXG4gIGJ5dGVzPzogbnVtYmVyO1xufVxuXG4vKiogT24tZGlzayBjaGVja3BvaW50IGVudmVsb3BlICh2ZXJzaW9uZWQgZm9yIGZvcndhcmQgY29tcGF0aWJpbGl0eSkuICovXG5jb25zdCBDSEVDS1BPSU5UX0ZPUk1BVF9WRVJTSU9OID0gMTtcblxuLyoqXG4gKiBMZWFybmluZyBSYXRlIFNjaGVkdWxlclxuICovXG5leHBvcnQgY2xhc3MgTFJTY2hlZHVsZXIge1xuICBwcml2YXRlIGNvbmZpZzogUmVxdWlyZWQ8VHJhaW5pbmdDb25maWc+O1xuICBwcml2YXRlIGluaXRpYWxMUjogbnVtYmVyO1xuICBwcml2YXRlIGN1cnJlbnRTdGVwOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHRvdGFsU3RlcHM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFJlcXVpcmVkPFRyYWluaW5nQ29uZmlnPiwgdG90YWxTdGVwczogbnVtYmVyKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5pbml0aWFsTFIgPSBjb25maWcubGVhcm5pbmdSYXRlO1xuICAgIHRoaXMudG90YWxTdGVwcyA9IHRvdGFsU3RlcHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxlYXJuaW5nIHJhdGUgZm9yIGN1cnJlbnQgc3RlcFxuICAgKi9cbiAgZ2V0TFIoKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKHRoaXMuY29uZmlnLnNjaGVkdWxlcikge1xuICAgICAgY2FzZSAnY29uc3RhbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsTFI7XG5cbiAgICAgIGNhc2UgJ2xpbmVhcic6XG4gICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxMUiAqICgxIC0gdGhpcy5jdXJyZW50U3RlcCAvIHRoaXMudG90YWxTdGVwcyk7XG5cbiAgICAgIGNhc2UgJ2Nvc2luZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxMUiAqIDAuNSAqICgxICsgTWF0aC5jb3MoTWF0aC5QSSAqIHRoaXMuY3VycmVudFN0ZXAgLyB0aGlzLnRvdGFsU3RlcHMpKTtcblxuICAgICAgY2FzZSAnd2FybXVwJzpcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgPCB0aGlzLmNvbmZpZy53YXJtdXBTdGVwcykge1xuICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxMUiAqICh0aGlzLmN1cnJlbnRTdGVwIC8gdGhpcy5jb25maWcud2FybXVwU3RlcHMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvc2luZSBkZWNheSBhZnRlciB3YXJtdXBcbiAgICAgICAgY29uc3QgZGVjYXlTdGVwcyA9IHRoaXMudG90YWxTdGVwcyAtIHRoaXMuY29uZmlnLndhcm11cFN0ZXBzO1xuICAgICAgICBjb25zdCBkZWNheVByb2dyZXNzID0gKHRoaXMuY3VycmVudFN0ZXAgLSB0aGlzLmNvbmZpZy53YXJtdXBTdGVwcykgLyBkZWNheVN0ZXBzO1xuICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsTFIgKiAwLjUgKiAoMSArIE1hdGguY29zKE1hdGguUEkgKiBkZWNheVByb2dyZXNzKSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxMUjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RlcCB0aGUgc2NoZWR1bGVyXG4gICAqL1xuICBzdGVwKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFN0ZXArKztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBzY2hlZHVsZXJcbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFN0ZXAgPSAwO1xuICB9XG59XG5cbi8qKlxuICogVHJhaW5pbmcgTWV0cmljcyBUcmFja2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXRyaWNzVHJhY2tlciB7XG4gIHByaXZhdGUgbG9zc0hpc3Rvcnk6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgdmFsTG9zc0hpc3Rvcnk6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgZ3JhZE5vcm1IaXN0b3J5OiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIHN0YXJ0VGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgcHJpdmF0ZSBzdGVwVGltZXM6IG51bWJlcltdID0gW107XG5cbiAgLyoqXG4gICAqIFJlY29yZCB0cmFpbmluZyBsb3NzXG4gICAqL1xuICByZWNvcmRMb3NzKGxvc3M6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubG9zc0hpc3RvcnkucHVzaChsb3NzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgdmFsaWRhdGlvbiBsb3NzXG4gICAqL1xuICByZWNvcmRWYWxMb3NzKGxvc3M6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmFsTG9zc0hpc3RvcnkucHVzaChsb3NzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgZ3JhZGllbnQgbm9ybVxuICAgKi9cbiAgcmVjb3JkR3JhZE5vcm0obm9ybTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5ncmFkTm9ybUhpc3RvcnkucHVzaChub3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgc3RlcCB0aW1lXG4gICAqL1xuICByZWNvcmRTdGVwVGltZShtczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdGVwVGltZXMucHVzaChtcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGF2ZXJhZ2UgbG9zcyBvdmVyIGxhc3QgTiBzdGVwc1xuICAgKi9cbiAgYXZnTG9zcyhuOiBudW1iZXIgPSAxMDApOiBudW1iZXIge1xuICAgIGNvbnN0IHJlY2VudCA9IHRoaXMubG9zc0hpc3Rvcnkuc2xpY2UoLW4pO1xuICAgIHJldHVybiByZWNlbnQubGVuZ3RoID4gMCA/IHJlY2VudC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIHJlY2VudC5sZW5ndGggOiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhdmVyYWdlIHZhbGlkYXRpb24gbG9zc1xuICAgKi9cbiAgYXZnVmFsTG9zcyhuOiBudW1iZXIgPSAxMCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVjZW50ID0gdGhpcy52YWxMb3NzSGlzdG9yeS5zbGljZSgtbik7XG4gICAgcmV0dXJuIHJlY2VudC5sZW5ndGggPiAwID8gcmVjZW50LnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gcmVjZW50Lmxlbmd0aCA6IDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN0ZXBzIHBlciBzZWNvbmRcbiAgICovXG4gIHN0ZXBzUGVyU2Vjb25kKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuc3RlcFRpbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgY29uc3QgYXZnU3RlcFRpbWUgPSB0aGlzLnN0ZXBUaW1lcy5zbGljZSgtMTAwKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIE1hdGgubWluKHRoaXMuc3RlcFRpbWVzLmxlbmd0aCwgMTAwKTtcbiAgICByZXR1cm4gYXZnU3RlcFRpbWUgPiAwID8gMTAwMCAvIGF2Z1N0ZXBUaW1lIDogMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgRVRBIGluIHNlY29uZHNcbiAgICovXG4gIGV0YShyZW1haW5pbmdTdGVwczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzcHMgPSB0aGlzLnN0ZXBzUGVyU2Vjb25kKCk7XG4gICAgcmV0dXJuIHNwcyA+IDAgPyByZW1haW5pbmdTdGVwcyAvIHNwcyA6IDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJlc3QgdmFsaWRhdGlvbiBsb3NzXG4gICAqL1xuICBiZXN0VmFsTG9zcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZhbExvc3NIaXN0b3J5Lmxlbmd0aCA+IDAgPyBNYXRoLm1pbiguLi50aGlzLnZhbExvc3NIaXN0b3J5KSA6IEluZmluaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0b3RhbCBkdXJhdGlvblxuICAgKi9cbiAgZHVyYXRpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgbG9zcyBoaXN0b3J5XG4gICAqL1xuICBnZXRMb3NzSGlzdG9yeSgpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmxvc3NIaXN0b3J5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHZhbGlkYXRpb24gbG9zcyBoaXN0b3J5XG4gICAqL1xuICBnZXRWYWxMb3NzSGlzdG9yeSgpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnZhbExvc3NIaXN0b3J5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0cmFja2VyXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvc3NIaXN0b3J5ID0gW107XG4gICAgdGhpcy52YWxMb3NzSGlzdG9yeSA9IFtdO1xuICAgIHRoaXMuZ3JhZE5vcm1IaXN0b3J5ID0gW107XG4gICAgdGhpcy5zdGVwVGltZXMgPSBbXTtcbiAgICB0aGlzLnN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFpbmluZyBQaXBlbGluZVxuICpcbiAqIEZ1bGwgdHJhaW5pbmcgaW5mcmFzdHJ1Y3R1cmUgZm9yIFNPTkEgbW9kZWxzLlxuICovXG5leHBvcnQgY2xhc3MgVHJhaW5pbmdQaXBlbGluZSB7XG4gIHByaXZhdGUgY29uZmlnOiBSZXF1aXJlZDxUcmFpbmluZ0NvbmZpZz47XG4gIHByaXZhdGUgYWRhcHRlcjogTG9yYUFkYXB0ZXI7XG4gIHByaXZhdGUgZXdjTWFuYWdlcjogRXdjTWFuYWdlcjtcbiAgcHJpdmF0ZSBtZXRyaWNzOiBNZXRyaWNzVHJhY2tlcjtcbiAgcHJpdmF0ZSBzY2hlZHVsZXI6IExSU2NoZWR1bGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYmF0Y2hlczogVHJhaW5pbmdCYXRjaFtdID0gW107XG4gIHByaXZhdGUgY2hlY2twb2ludHM6IENoZWNrcG9pbnRbXSA9IFtdO1xuICBwcml2YXRlIGN1cnJlbnRFcG9jaDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBjdXJyZW50U3RlcDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBiZXN0VmFsTG9zczogbnVtYmVyID0gSW5maW5pdHk7XG4gIHByaXZhdGUgcGF0aWVuY2VDb3VudGVyOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IFRyYWluaW5nQ29uZmlnLCBhZGFwdGVyPzogTG9yYUFkYXB0ZXIpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9UUkFJTklOR19DT05GSUcsIC4uLmNvbmZpZyB9O1xuICAgIHRoaXMuYWRhcHRlciA9IGFkYXB0ZXIgfHwgbmV3IExvcmFBZGFwdGVyKHsgcmFuazogOCB9KTtcbiAgICB0aGlzLmV3Y01hbmFnZXIgPSBuZXcgRXdjTWFuYWdlcih0aGlzLmNvbmZpZy5ld2NMYW1iZGEpO1xuICAgIHRoaXMubWV0cmljcyA9IG5ldyBNZXRyaWNzVHJhY2tlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0cmFpbmluZyBiYXRjaFxuICAgKi9cbiAgYWRkQmF0Y2goaW5wdXRzOiBFbWJlZGRpbmdbXSwgdGFyZ2V0czogRW1iZWRkaW5nW10sIHF1YWxpdGllczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLmJhdGNoZXMucHVzaCh7IGlucHV0cywgdGFyZ2V0cywgcXVhbGl0aWVzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0cmFpbmluZyBkYXRhXG4gICAqL1xuICBhZGREYXRhKGRhdGE6IEFycmF5PHsgaW5wdXQ6IEVtYmVkZGluZzsgdGFyZ2V0OiBFbWJlZGRpbmc7IHF1YWxpdHk6IG51bWJlciB9Pik6IHZvaWQge1xuICAgIC8vIEdyb3VwIGludG8gYmF0Y2hlc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gdGhpcy5jb25maWcuYmF0Y2hTaXplKSB7XG4gICAgICBjb25zdCBiYXRjaCA9IGRhdGEuc2xpY2UoaSwgaSArIHRoaXMuY29uZmlnLmJhdGNoU2l6ZSk7XG4gICAgICB0aGlzLmFkZEJhdGNoKFxuICAgICAgICBiYXRjaC5tYXAoZCA9PiBkLmlucHV0KSxcbiAgICAgICAgYmF0Y2gubWFwKGQgPT4gZC50YXJnZXQpLFxuICAgICAgICBiYXRjaC5tYXAoZCA9PiBkLnF1YWxpdHkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdHJhaW5pbmdcbiAgICovXG4gIHRyYWluKCk6IFRyYWluaW5nUmVzdWx0IHtcbiAgICBjb25zdCB0b3RhbFN0ZXBzID0gdGhpcy5iYXRjaGVzLmxlbmd0aCAqIHRoaXMuY29uZmlnLmVwb2NocztcbiAgICB0aGlzLnNjaGVkdWxlciA9IG5ldyBMUlNjaGVkdWxlcih0aGlzLmNvbmZpZywgdG90YWxTdGVwcyk7XG4gICAgdGhpcy5tZXRyaWNzLnJlc2V0KCk7XG4gICAgdGhpcy5hZGFwdGVyLnN0YXJ0VHJhaW5pbmcodGhpcy5jb25maWcubGVhcm5pbmdSYXRlKTtcblxuICAgIGxldCBlYXJseVN0b3BwZWQgPSBmYWxzZTtcblxuICAgIGZvciAobGV0IGVwb2NoID0gMDsgZXBvY2ggPCB0aGlzLmNvbmZpZy5lcG9jaHM7IGVwb2NoKyspIHtcbiAgICAgIHRoaXMuY3VycmVudEVwb2NoID0gZXBvY2g7XG5cbiAgICAgIC8vIFNodWZmbGUgYmF0Y2hlc1xuICAgICAgY29uc3Qgc2h1ZmZsZWRCYXRjaGVzID0gdGhpcy5zaHVmZmxlQmF0Y2hlcygpO1xuXG4gICAgICAvLyBTcGxpdCBpbnRvIHRyYWluL3ZhbFxuICAgICAgY29uc3QgdmFsU2l6ZSA9IE1hdGguZmxvb3Ioc2h1ZmZsZWRCYXRjaGVzLmxlbmd0aCAqIHRoaXMuY29uZmlnLnZhbGlkYXRpb25TcGxpdCk7XG4gICAgICBjb25zdCB0cmFpbkJhdGNoZXMgPSBzaHVmZmxlZEJhdGNoZXMuc2xpY2UodmFsU2l6ZSk7XG4gICAgICBjb25zdCB2YWxCYXRjaGVzID0gc2h1ZmZsZWRCYXRjaGVzLnNsaWNlKDAsIHZhbFNpemUpO1xuXG4gICAgICAvLyBUcmFpbmluZyBlcG9jaFxuICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiB0cmFpbkJhdGNoZXMpIHtcbiAgICAgICAgY29uc3Qgc3RlcFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgbG9zcyA9IHRoaXMudHJhaW5TdGVwKGJhdGNoKTtcbiAgICAgICAgdGhpcy5tZXRyaWNzLnJlY29yZExvc3MobG9zcyk7XG4gICAgICAgIHRoaXMubWV0cmljcy5yZWNvcmRTdGVwVGltZShEYXRlLm5vdygpIC0gc3RlcFN0YXJ0KTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIuc3RlcCgpO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwKys7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRpb25cbiAgICAgIGlmICh2YWxCYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdmFsTG9zcyA9IHRoaXMudmFsaWRhdGUodmFsQmF0Y2hlcyk7XG4gICAgICAgIHRoaXMubWV0cmljcy5yZWNvcmRWYWxMb3NzKHZhbExvc3MpO1xuXG4gICAgICAgIC8vIEVhcmx5IHN0b3BwaW5nXG4gICAgICAgIGlmICh2YWxMb3NzIDwgdGhpcy5iZXN0VmFsTG9zcykge1xuICAgICAgICAgIHRoaXMuYmVzdFZhbExvc3MgPSB2YWxMb3NzO1xuICAgICAgICAgIHRoaXMucGF0aWVuY2VDb3VudGVyID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBhdGllbmNlQ291bnRlcisrO1xuICAgICAgICAgIGlmICh0aGlzLnBhdGllbmNlQ291bnRlciA+PSB0aGlzLmNvbmZpZy5lYXJseVN0b3BwaW5nUGF0aWVuY2UpIHtcbiAgICAgICAgICAgIGVhcmx5U3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2twb2ludFxuICAgICAgaWYgKChlcG9jaCArIDEpICUgdGhpcy5jb25maWcuY2hlY2twb2ludEludGVydmFsID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2F2ZUNoZWNrcG9pbnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmFkYXB0ZXIuZW5kVHJhaW5pbmcoKTtcblxuICAgIC8vIFJlZ2lzdGVyIHdpdGggRVdDIGZvciBjb250aW51YWwgbGVhcm5pbmdcbiAgICBjb25zdCB3ZWlnaHRzID0gdGhpcy5hZGFwdGVyLm1lcmdlKCkuZmxhdCgpO1xuICAgIHRoaXMuZXdjTWFuYWdlci5yZWdpc3RlclRhc2soYHRhc2stJHtEYXRlLm5vdygpfWAsIHdlaWdodHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVwb2NoczogdGhpcy5jdXJyZW50RXBvY2ggKyAxLFxuICAgICAgc3RlcHM6IHRoaXMuY3VycmVudFN0ZXAsXG4gICAgICBmaW5hbExvc3M6IHRoaXMubWV0cmljcy5hdmdMb3NzKDEwMCksXG4gICAgICBiZXN0VmFsTG9zczogdGhpcy5iZXN0VmFsTG9zcyxcbiAgICAgIGR1cmF0aW9uTXM6IHRoaXMubWV0cmljcy5kdXJhdGlvbigpLFxuICAgICAgbG9zc0hpc3Rvcnk6IHRoaXMubWV0cmljcy5nZXRMb3NzSGlzdG9yeSgpLFxuICAgICAgdmFsTG9zc0hpc3Rvcnk6IHRoaXMubWV0cmljcy5nZXRWYWxMb3NzSGlzdG9yeSgpLFxuICAgICAgZWFybHlTdG9wcGVkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2luZ2xlIHRyYWluaW5nIHN0ZXBcbiAgICovXG4gIHByaXZhdGUgdHJhaW5TdGVwKGJhdGNoOiBUcmFpbmluZ0JhdGNoKTogbnVtYmVyIHtcbiAgICBsZXQgdG90YWxMb3NzID0gMDtcbiAgICBjb25zdCBsciA9IHRoaXMuc2NoZWR1bGVyPy5nZXRMUigpIHx8IHRoaXMuY29uZmlnLmxlYXJuaW5nUmF0ZTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2guaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbnB1dCA9IGJhdGNoLmlucHV0c1tpXTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGJhdGNoLnRhcmdldHNbaV07XG4gICAgICBjb25zdCBxdWFsaXR5ID0gYmF0Y2gucXVhbGl0aWVzW2ldO1xuXG4gICAgICAvLyBGb3J3YXJkIHBhc3NcbiAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuYWRhcHRlci5mb3J3YXJkKGlucHV0KTtcblxuICAgICAgLy8gQ29tcHV0ZSBsb3NzIChNU0Ugd2VpZ2h0ZWQgYnkgcXVhbGl0eSlcbiAgICAgIGNvbnN0IGdyYWRPdXRwdXQ6IG51bWJlcltdID0gW107XG4gICAgICBsZXQgbG9zcyA9IDA7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG91dHB1dC5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBkaWZmID0gb3V0cHV0W2pdIC0gKHRhcmdldFtqXSB8fCAwKTtcbiAgICAgICAgbG9zcyArPSBkaWZmICogZGlmZjtcbiAgICAgICAgZ3JhZE91dHB1dC5wdXNoKDIgKiBkaWZmICogcXVhbGl0eSk7IC8vIFF1YWxpdHktd2VpZ2h0ZWQgZ3JhZGllbnRcbiAgICAgIH1cbiAgICAgIGxvc3MgPSAobG9zcyAvIG91dHB1dC5sZW5ndGgpICogcXVhbGl0eTtcblxuICAgICAgLy8gQWRkIEVXQyBwZW5hbHR5XG4gICAgICBjb25zdCBld2NQZW5hbHR5ID0gdGhpcy5ld2NNYW5hZ2VyLmNvbXB1dGVQZW5hbHR5KHRoaXMuYWRhcHRlci5tZXJnZSgpLmZsYXQoKSk7XG4gICAgICBsb3NzICs9IGV3Y1BlbmFsdHkgKiAwLjAwMTtcblxuICAgICAgLy8gQmFja3dhcmQgcGFzc1xuICAgICAgdGhpcy5hZGFwdGVyLmJhY2t3YXJkKGlucHV0LCBncmFkT3V0cHV0LCBscik7XG5cbiAgICAgIHRvdGFsTG9zcyArPSBsb3NzO1xuICAgIH1cblxuICAgIHJldHVybiB0b3RhbExvc3MgLyBiYXRjaC5pbnB1dHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gcGFzc1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZShiYXRjaGVzOiBUcmFpbmluZ0JhdGNoW10pOiBudW1iZXIge1xuICAgIGxldCB0b3RhbExvc3MgPSAwO1xuICAgIGxldCBjb3VudCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIGJhdGNoZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2guaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuYWRhcHRlci5mb3J3YXJkKGJhdGNoLmlucHV0c1tpXSk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGJhdGNoLnRhcmdldHNbaV07XG5cbiAgICAgICAgbGV0IGxvc3MgPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG91dHB1dC5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGNvbnN0IGRpZmYgPSBvdXRwdXRbal0gLSAodGFyZ2V0W2pdIHx8IDApO1xuICAgICAgICAgIGxvc3MgKz0gZGlmZiAqIGRpZmY7XG4gICAgICAgIH1cbiAgICAgICAgdG90YWxMb3NzICs9IGxvc3MgLyBvdXRwdXQubGVuZ3RoO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3VudCA+IDAgPyB0b3RhbExvc3MgLyBjb3VudCA6IDA7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhIGNoZWNrcG9pbnQuXG4gICAqXG4gICAqIEFsd2F5cyByZWNvcmRzIHRoZSBjaGVja3BvaW50IGluIHRoZSBpbi1tZW1vcnkgbGlzdCAodGhlIGJlaGF2aW9yIHRoZVxuICAgKiB0cmFpbmluZyBsb29wIHJlbGllcyBvbikuIFdoZW4gYHBhdGhgIGlzIGdpdmVuLCBhZGRpdGlvbmFsbHkgcGVyc2lzdHNcbiAgICogdGhlIGNoZWNrcG9pbnQgdG8gZGlzayBhcyB2ZXJzaW9uZWQgSlNPTiDigJQgYmVmb3JlIHYyLjUuNyB0aGlzIG1ldGhvZFxuICAgKiB3YXMgcHJpdmF0ZSwgaWdub3JlZCBhbnkgYXJndW1lbnQsIGFuZCBuZXZlciB3cm90ZSBhIGZpbGUsIHNvIGNhbGxlcnNcbiAgICogcGFzc2luZyBhIHBhdGggZ290IGB1bmRlZmluZWRgIGJhY2sgYW5kIHplcm8gYnl0ZXMgb24gZGlzay5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggT3B0aW9uYWwgZmlsZSBwYXRoOyBwYXJlbnQgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQuXG4gICAqIEByZXR1cm5zIFdoZXJlIHRoZSBjaGVja3BvaW50IHdlbnQg4oCUIGluLW1lbW9yeSBpbmRleCwgYW5kIGZpbGVcbiAgICogICAgICAgICAgcGF0aCArIGJ5dGUgc2l6ZSB3aGVuIHBlcnNpc3RlZC5cbiAgICovXG4gIHNhdmVDaGVja3BvaW50KHBhdGg/OiBzdHJpbmcpOiBDaGVja3BvaW50U2F2ZVJlc3VsdCB7XG4gICAgY29uc3QgY2hlY2twb2ludDogQ2hlY2twb2ludCA9IHtcbiAgICAgIGVwb2NoOiB0aGlzLmN1cnJlbnRFcG9jaCxcbiAgICAgIHN0ZXA6IHRoaXMuY3VycmVudFN0ZXAsXG4gICAgICBsb3NzOiB0aGlzLm1ldHJpY3MuYXZnTG9zcygxMDApLFxuICAgICAgd2VpZ2h0czogdGhpcy5hZGFwdGVyLnRvSlNPTigpLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH07XG4gICAgdGhpcy5jaGVja3BvaW50cy5wdXNoKGNoZWNrcG9pbnQpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBDaGVja3BvaW50U2F2ZVJlc3VsdCA9IHtcbiAgICAgIGluZGV4OiB0aGlzLmNoZWNrcG9pbnRzLmxlbmd0aCAtIDEsXG4gICAgICBlcG9jaDogY2hlY2twb2ludC5lcG9jaCxcbiAgICAgIHN0ZXA6IGNoZWNrcG9pbnQuc3RlcCxcbiAgICAgIGxvc3M6IGNoZWNrcG9pbnQubG9zcyxcbiAgICB9O1xuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0ge1xuICAgICAgICBmb3JtYXQ6ICdydXZsbG0tY2hlY2twb2ludCcsXG4gICAgICAgIHZlcnNpb246IENIRUNLUE9JTlRfRk9STUFUX1ZFUlNJT04sXG4gICAgICAgIC4uLmNoZWNrcG9pbnQsXG4gICAgICB9O1xuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKTtcbiAgICAgIG1rZGlyU3luYyhkaXJuYW1lKHBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMocGF0aCwgc2VyaWFsaXplZCwgJ3V0Zi04Jyk7XG4gICAgICByZXN1bHQucGF0aCA9IHBhdGg7XG4gICAgICByZXN1bHQuYnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChzZXJpYWxpemVkLCAndXRmLTgnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBjaGVja3BvaW50IOKAlCBieSBpbi1tZW1vcnkgaW5kZXgsIG9yIGZyb20gYSBmaWxlIHByZXZpb3VzbHlcbiAgICogd3JpdHRlbiBieSBgc2F2ZUNoZWNrcG9pbnQocGF0aClgLlxuICAgKi9cbiAgbG9hZENoZWNrcG9pbnQoaW5kZXhPclBhdGg6IG51bWJlciB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCBjaGVja3BvaW50OiBDaGVja3BvaW50IHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiBpbmRleE9yUGF0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNoZWNrcG9pbnQgPSB0aGlzLmNoZWNrcG9pbnRzW2luZGV4T3JQYXRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoaW5kZXhPclBhdGgsICd1dGYtOCcpKTtcbiAgICAgICAgaWYgKHBhcnNlZD8uZm9ybWF0ICE9PSAncnV2bGxtLWNoZWNrcG9pbnQnIHx8IHR5cGVvZiBwYXJzZWQud2VpZ2h0cyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2twb2ludCA9IHBhcnNlZCBhcyBDaGVja3BvaW50O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFjaGVja3BvaW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICB0aGlzLmFkYXB0ZXIgPSBMb3JhQWRhcHRlci5mcm9tSlNPTihjaGVja3BvaW50LndlaWdodHMpO1xuICAgIHRoaXMuY3VycmVudEVwb2NoID0gY2hlY2twb2ludC5lcG9jaDtcbiAgICB0aGlzLmN1cnJlbnRTdGVwID0gY2hlY2twb2ludC5zdGVwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IG1ldHJpY3NcbiAgICovXG4gIGdldE1ldHJpY3MoKTogVHJhaW5pbmdNZXRyaWNzIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXBvY2g6IHRoaXMuY3VycmVudEVwb2NoLFxuICAgICAgc3RlcDogdGhpcy5jdXJyZW50U3RlcCxcbiAgICAgIHRyYWluTG9zczogdGhpcy5tZXRyaWNzLmF2Z0xvc3MoMTAwKSxcbiAgICAgIHZhbExvc3M6IHRoaXMubWV0cmljcy5hdmdWYWxMb3NzKDEwKSxcbiAgICAgIGxlYXJuaW5nUmF0ZTogdGhpcy5zY2hlZHVsZXI/LmdldExSKCkgfHwgdGhpcy5jb25maWcubGVhcm5pbmdSYXRlLFxuICAgICAgZ3JhZE5vcm06IDAsXG4gICAgICBzdGVwc1BlclNlY29uZDogdGhpcy5tZXRyaWNzLnN0ZXBzUGVyU2Vjb25kKCksXG4gICAgICBldGFTZWNvbmRzOiB0aGlzLm1ldHJpY3MuZXRhKFxuICAgICAgICAodGhpcy5jb25maWcuZXBvY2hzIC0gdGhpcy5jdXJyZW50RXBvY2gpICogdGhpcy5iYXRjaGVzLmxlbmd0aFxuICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhZGFwdGVyXG4gICAqL1xuICBnZXRBZGFwdGVyKCk6IExvcmFBZGFwdGVyIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBFV0MgbWFuYWdlclxuICAgKi9cbiAgZ2V0RXdjTWFuYWdlcigpOiBFd2NNYW5hZ2VyIHtcbiAgICByZXR1cm4gdGhpcy5ld2NNYW5hZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjaGVja3BvaW50c1xuICAgKi9cbiAgZ2V0Q2hlY2twb2ludHMoKTogQ2hlY2twb2ludFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuY2hlY2twb2ludHNdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHBpcGVsaW5lXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmJhdGNoZXMgPSBbXTtcbiAgICB0aGlzLmNoZWNrcG9pbnRzID0gW107XG4gICAgdGhpcy5jdXJyZW50RXBvY2ggPSAwO1xuICAgIHRoaXMuY3VycmVudFN0ZXAgPSAwO1xuICAgIHRoaXMuYmVzdFZhbExvc3MgPSBJbmZpbml0eTtcbiAgICB0aGlzLnBhdGllbmNlQ291bnRlciA9IDA7XG4gICAgdGhpcy5tZXRyaWNzLnJlc2V0KCk7XG4gICAgdGhpcy5hZGFwdGVyLnJlc2V0KCk7XG4gIH1cblxuICBwcml2YXRlIHNodWZmbGVCYXRjaGVzKCk6IFRyYWluaW5nQmF0Y2hbXSB7XG4gICAgY29uc3Qgc2h1ZmZsZWQgPSBbLi4udGhpcy5iYXRjaGVzXTtcbiAgICBmb3IgKGxldCBpID0gc2h1ZmZsZWQubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgW3NodWZmbGVkW2ldLCBzaHVmZmxlZFtqXV0gPSBbc2h1ZmZsZWRbal0sIHNodWZmbGVkW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIHNodWZmbGVkO1xuICB9XG59XG5cbi8qKlxuICogVHJhaW5pbmcgRmFjdG9yeVxuICpcbiAqIENyZWF0ZSBwcmUtY29uZmlndXJlZCB0cmFpbmluZyBwaXBlbGluZXMgZm9yIGNvbW1vbiBzY2VuYXJpb3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFpbmluZ0ZhY3Rvcnkge1xuICAvKipcbiAgICogQ3JlYXRlIHBpcGVsaW5lIGZvciBxdWljayBmaW5lLXR1bmluZ1xuICAgKi9cbiAgc3RhdGljIHF1aWNrRmluZXR1bmUoKTogVHJhaW5pbmdQaXBlbGluZSB7XG4gICAgcmV0dXJuIG5ldyBUcmFpbmluZ1BpcGVsaW5lKHtcbiAgICAgIGxlYXJuaW5nUmF0ZTogMC4wMSxcbiAgICAgIGVwb2NoczogMyxcbiAgICAgIGJhdGNoU2l6ZTogMTYsXG4gICAgICBzY2hlZHVsZXI6ICdjb25zdGFudCcsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHBpcGVsaW5lIGZvciBkZWVwIHRyYWluaW5nXG4gICAqL1xuICBzdGF0aWMgZGVlcFRyYWluaW5nKCk6IFRyYWluaW5nUGlwZWxpbmUge1xuICAgIHJldHVybiBuZXcgVHJhaW5pbmdQaXBlbGluZSh7XG4gICAgICBsZWFybmluZ1JhdGU6IDAuMDAxLFxuICAgICAgZXBvY2hzOiA1MCxcbiAgICAgIGJhdGNoU2l6ZTogMzIsXG4gICAgICBzY2hlZHVsZXI6ICd3YXJtdXAnLFxuICAgICAgd2FybXVwU3RlcHM6IDUwMCxcbiAgICAgIGVhcmx5U3RvcHBpbmdQYXRpZW5jZTogNSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgcGlwZWxpbmUgZm9yIGNvbnRpbnVhbCBsZWFybmluZ1xuICAgKi9cbiAgc3RhdGljIGNvbnRpbnVhbExlYXJuaW5nKGV3Y0xhbWJkYTogbnVtYmVyID0gNTAwMCk6IFRyYWluaW5nUGlwZWxpbmUge1xuICAgIHJldHVybiBuZXcgVHJhaW5pbmdQaXBlbGluZSh7XG4gICAgICBsZWFybmluZ1JhdGU6IDAuMDAwNSxcbiAgICAgIGVwb2NoczogMTAsXG4gICAgICBiYXRjaFNpemU6IDE2LFxuICAgICAgc2NoZWR1bGVyOiAnY29zaW5lJyxcbiAgICAgIGV3Y0xhbWJkYSxcbiAgICAgIGVhcmx5U3RvcHBpbmdQYXRpZW5jZTogMTAsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHBpcGVsaW5lIGZvciBmZWRlcmF0ZWQgYWdncmVnYXRpb25cbiAgICovXG4gIHN0YXRpYyBmZWRlcmF0ZWRBZ2dyZWdhdGlvbigpOiBUcmFpbmluZ1BpcGVsaW5lIHtcbiAgICByZXR1cm4gbmV3IFRyYWluaW5nUGlwZWxpbmUoe1xuICAgICAgbGVhcm5pbmdSYXRlOiAwLjAwMDEsXG4gICAgICBlcG9jaHM6IDUsXG4gICAgICBiYXRjaFNpemU6IDY0LFxuICAgICAgc2NoZWR1bGVyOiAnbGluZWFyJyxcbiAgICAgIGV3Y0xhbWJkYTogMjAwMCxcbiAgICB9KTtcbiAgfVxufVxuIl19
610
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhaW5pbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhaW5pbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRzs7O0FBRUgsMkJBQTREO0FBQzVELCtCQUErQjtBQUUvQixpQ0FBcUM7QUFDckMsaUNBQW9DO0FBRXBDOztHQUVHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBNkI7SUFDeEQsWUFBWSxFQUFFLEtBQUs7SUFDbkIsU0FBUyxFQUFFLEVBQUU7SUFDYixNQUFNLEVBQUUsRUFBRTtJQUNWLFNBQVMsRUFBRSxRQUFRO0lBQ25CLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFlBQVksRUFBRSxHQUFHO0lBQ2pCLHFCQUFxQixFQUFFLENBQUM7SUFDeEIsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixTQUFTLEVBQUUsSUFBSTtJQUNmLGVBQWUsRUFBRSxHQUFHO0lBQ3BCLGtCQUFrQixFQUFFLEVBQUU7Q0FDdkIsQ0FBQztBQXNFRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0FBRXBDOztHQUVHO0FBQ0gsTUFBYSxXQUFXO0lBTXRCLFlBQVksTUFBZ0MsRUFBRSxVQUFrQjtRQUh4RCxnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUk5QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSztRQUNILFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM5QixLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBRXhCLEtBQUssUUFBUTtnQkFDWCxPQUFPLElB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YWluaW5nIFBpcGVsaW5lIGZvciBTT05BXG4gKlxuICogQ29tcHJlaGVuc2l2ZSB0cmFpbmluZyBpbmZyYXN0cnVjdHVyZSB3aXRoIG1ldHJpY3MgdHJhY2tpbmcsXG4gKiBsZWFybmluZyByYXRlIHNjaGVkdWxpbmcsIGFuZCBjaGVja3BvaW50IG1hbmFnZW1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFRyYWluaW5nUGlwZWxpbmUsIFRyYWluaW5nQ29uZmlnIH0gZnJvbSAnQHJ1dmVjdG9yL3J1dmxsbSc7XG4gKlxuICogY29uc3QgcGlwZWxpbmUgPSBuZXcgVHJhaW5pbmdQaXBlbGluZSh7XG4gKiAgIGxlYXJuaW5nUmF0ZTogMC4wMDEsXG4gKiAgIGJhdGNoU2l6ZTogMzIsXG4gKiAgIGVwb2NoczogMTAsXG4gKiB9KTtcbiAqXG4gKiAvLyBBZGQgdHJhaW5pbmcgZGF0YVxuICogcGlwZWxpbmUuYWRkQmF0Y2goaW5wdXRzLCB0YXJnZXRzLCBxdWFsaXRpZXMpO1xuICpcbiAqIC8vIFJ1biB0cmFpbmluZ1xuICogY29uc3QgcmVzdWx0ID0gcGlwZWxpbmUudHJhaW4oKTtcbiAqIGNvbnNvbGUubG9nKGBGaW5hbCBsb3NzOiAke3Jlc3VsdC5maW5hbExvc3N9YCk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyB3cml0ZUZpbGVTeW5jLCByZWFkRmlsZVN5bmMsIG1rZGlyU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IEVtYmVkZGluZywgVHJhaW5pbmdDb25maWcsIFRyYWluaW5nUmVzdWx0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBMb3JhQWRhcHRlciB9IGZyb20gJy4vbG9yYSc7XG5pbXBvcnQgeyBFd2NNYW5hZ2VyIH0gZnJvbSAnLi9zb25hJztcblxuLyoqXG4gKiBEZWZhdWx0IHRyYWluaW5nIGNvbmZpZ1xuICovXG5jb25zdCBERUZBVUxUX1RSQUlOSU5HX0NPTkZJRzogUmVxdWlyZWQ8VHJhaW5pbmdDb25maWc+ID0ge1xuICBsZWFybmluZ1JhdGU6IDAuMDAxLFxuICBiYXRjaFNpemU6IDMyLFxuICBlcG9jaHM6IDEwLFxuICBzY2hlZHVsZXI6ICdjb3NpbmUnLFxuICB3YXJtdXBTdGVwczogMTAwLFxuICB3ZWlnaHREZWNheTogMC4wMSxcbiAgZ3JhZGllbnRDbGlwOiAxLjAsXG4gIGVhcmx5U3RvcHBpbmdQYXRpZW5jZTogMyxcbiAgY2hlY2twb2ludEludGVydmFsOiAxLFxuICBld2NMYW1iZGE6IDIwMDAsXG4gIHZhbGlkYXRpb25TcGxpdDogMC4xLFxuICBrZWVwQmVzdENoZWNrcG9pbnQ6ICcnLFxufTtcblxuLyoqXG4gKiBUcmFpbmluZyBtZXRyaWNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaW5pbmdNZXRyaWNzIHtcbiAgLyoqIEN1cnJlbnQgZXBvY2ggKi9cbiAgZXBvY2g6IG51bWJlcjtcbiAgLyoqIEN1cnJlbnQgc3RlcCAqL1xuICBzdGVwOiBudW1iZXI7XG4gIC8qKiBUcmFpbmluZyBsb3NzICovXG4gIHRyYWluTG9zczogbnVtYmVyO1xuICAvKiogVmFsaWRhdGlvbiBsb3NzICovXG4gIHZhbExvc3M6IG51bWJlcjtcbiAgLyoqIExlYXJuaW5nIHJhdGUgKi9cbiAgbGVhcm5pbmdSYXRlOiBudW1iZXI7XG4gIC8qKiBHcmFkaWVudCBub3JtICovXG4gIGdyYWROb3JtOiBudW1iZXI7XG4gIC8qKiBTdGVwcyBwZXIgc2Vjb25kICovXG4gIHN0ZXBzUGVyU2Vjb25kOiBudW1iZXI7XG4gIC8qKiBFVEEgaW4gc2Vjb25kcyAqL1xuICBldGFTZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogVHJhaW5pbmcgZGF0YSBiYXRjaFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYWluaW5nQmF0Y2gge1xuICAvKiogSW5wdXQgZW1iZWRkaW5ncyAqL1xuICBpbnB1dHM6IEVtYmVkZGluZ1tdO1xuICAvKiogVGFyZ2V0IG91dHB1dHMgKi9cbiAgdGFyZ2V0czogRW1iZWRkaW5nW107XG4gIC8qKiBRdWFsaXR5IHNjb3JlcyAqL1xuICBxdWFsaXRpZXM6IG51bWJlcltdO1xufVxuXG4vKipcbiAqIENoZWNrcG9pbnQgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrcG9pbnQge1xuICAvKiogRXBvY2ggbnVtYmVyICovXG4gIGVwb2NoOiBudW1iZXI7XG4gIC8qKiBTdGVwIG51bWJlciAqL1xuICBzdGVwOiBudW1iZXI7XG4gIC8qKiBUcmFpbmluZyBsb3NzIGF0IGNoZWNrcG9pbnQgKi9cbiAgbG9zczogbnVtYmVyO1xuICAvKiogTW9kZWwgd2VpZ2h0cyAoc2VyaWFsaXplZCkgKi9cbiAgd2VpZ2h0czogc3RyaW5nO1xuICAvKiogVGltZXN0YW1wICovXG4gIHRpbWVzdGFtcDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIHNhdmVDaGVja3BvaW50KCkgY2FsbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja3BvaW50U2F2ZVJlc3VsdCB7XG4gIC8qKiBJbmRleCBvZiB0aGUgY2hlY2twb2ludCBpbiB0aGUgaW4tbWVtb3J5IGNoZWNrcG9pbnQgbGlzdCAqL1xuICBpbmRleDogbnVtYmVyO1xuICAvKiogRXBvY2ggdGhlIGNoZWNrcG9pbnQgY2FwdHVyZWQgKi9cbiAgZXBvY2g6IG51bWJlcjtcbiAgLyoqIFN0ZXAgdGhlIGNoZWNrcG9pbnQgY2FwdHVyZWQgKi9cbiAgc3RlcDogbnVtYmVyO1xuICAvKiogVHJhaW5pbmcgbG9zcyBhdCBjaGVja3BvaW50IHRpbWUgKi9cbiAgbG9zczogbnVtYmVyO1xuICAvKiogQWJzb2x1dGUgb3IgYXMtZ2l2ZW4gZmlsZSBwYXRoLCB3aGVuIHBlcnNpc3RlZCB0byBkaXNrICovXG4gIHBhdGg/OiBzdHJpbmc7XG4gIC8qKiBTZXJpYWxpemVkIHNpemUgaW4gYnl0ZXMsIHdoZW4gcGVyc2lzdGVkIHRvIGRpc2sgKi9cbiAgYnl0ZXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogT24tZGlzayBjaGVja3BvaW50IGVudmVsb3BlIHZlcnNpb24uXG4gKlxuICogdjEg4oCUIHtmb3JtYXQsIHZlcnNpb246MSwgZXBvY2gsIHN0ZXAsIGxvc3MsIHdlaWdodHMsIHRpbWVzdGFtcH0uIE5vIGFkYXB0ZXJcbiAqICAgICAgZ2VvbWV0cnksIHNvIGxvYWRDaGVja3BvaW50KCkgY291bGQgbm90IGRldGVjdCBhIHNoYXBlIG1pc21hdGNoLlxuICogdjIg4oCUIGFkZHMge2NvbmZpZzp7aW5wdXREaW0sIG91dHB1dERpbSwgcmFua30sIHBpcGVsaW5lQ29uZmlnOntsZWFybmluZ1JhdGUsXG4gKiAgICAgIGJhdGNoU2l6ZX19IHNvIGxvYWRDaGVja3BvaW50KCkgY2FuIHJlamVjdCB3ZWlnaHRzIHRoYXQgZG9uJ3QgZml0IHRoZVxuICogICAgICBjdXJyZW50IGFkYXB0ZXIuIHYxIGZpbGVzIHN0aWxsIGxvYWQgKGJhY2stY29tcGF0KSB3aXRoIG5vIHNoYXBlIGNoZWNrLlxuICovXG5jb25zdCBDSEVDS1BPSU5UX0ZPUk1BVF9WRVJTSU9OID0gMjtcblxuLyoqXG4gKiBMZWFybmluZyBSYXRlIFNjaGVkdWxlclxuICovXG5leHBvcnQgY2xhc3MgTFJTY2hlZHVsZXIge1xuICBwcml2YXRlIGNvbmZpZzogUmVxdWlyZWQ8VHJhaW5pbmdDb25maWc+O1xuICBwcml2YXRlIGluaXRpYWxMUjogbnVtYmVyO1xuICBwcml2YXRlIGN1cnJlbnRTdGVwOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHRvdGFsU3RlcHM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFJlcXVpcmVkPFRyYWluaW5nQ29uZmlnPiwgdG90YWxTdGVwczogbnVtYmVyKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5pbml0aWFsTFIgPSBjb25maWcubGVhcm5pbmdSYXRlO1xuICAgIHRoaXMudG90YWxTdGVwcyA9IHRvdGFsU3RlcHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxlYXJuaW5nIHJhdGUgZm9yIGN1cnJlbnQgc3RlcFxuICAgKi9cbiAgZ2V0TFIoKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKHRoaXMuY29uZmlnLnNjaGVkdWxlcikge1xuICAgICAgY2FzZSAnY29uc3RhbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsTFI7XG5cbiAgICAgIGNhc2UgJ2xpbmVhcic6XG4gICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxMUiAqICgxIC0gdGhpcy5jdXJyZW50U3RlcCAvIHRoaXMudG90YWxTdGVwcyk7XG5cbiAgICAgIGNhc2UgJ2Nvc2luZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxMUiAqIDAuNSAqICgxICsgTWF0aC5jb3MoTWF0aC5QSSAqIHRoaXMuY3VycmVudFN0ZXAgLyB0aGlzLnRvdGFsU3RlcHMpKTtcblxuICAgICAgY2FzZSAnd2FybXVwJzpcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgPCB0aGlzLmNvbmZpZy53YXJtdXBTdGVwcykge1xuICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxMUiAqICh0aGlzLmN1cnJlbnRTdGVwIC8gdGhpcy5jb25maWcud2FybXVwU3RlcHMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvc2luZSBkZWNheSBhZnRlciB3YXJtdXBcbiAgICAgICAgY29uc3QgZGVjYXlTdGVwcyA9IHRoaXMudG90YWxTdGVwcyAtIHRoaXMuY29uZmlnLndhcm11cFN0ZXBzO1xuICAgICAgICBjb25zdCBkZWNheVByb2dyZXNzID0gKHRoaXMuY3VycmVudFN0ZXAgLSB0aGlzLmNvbmZpZy53YXJtdXBTdGVwcykgLyBkZWNheVN0ZXBzO1xuICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsTFIgKiAwLjUgKiAoMSArIE1hdGguY29zKE1hdGguUEkgKiBkZWNheVByb2dyZXNzKSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxMUjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RlcCB0aGUgc2NoZWR1bGVyXG4gICAqL1xuICBzdGVwKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFN0ZXArKztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBzY2hlZHVsZXJcbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFN0ZXAgPSAwO1xuICB9XG59XG5cbi8qKlxuICogVHJhaW5pbmcgTWV0cmljcyBUcmFja2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXRyaWNzVHJhY2tlciB7XG4gIHByaXZhdGUgbG9zc0hpc3Rvcnk6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgdmFsTG9zc0hpc3Rvcnk6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgZ3JhZE5vcm1IaXN0b3J5OiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIHN0YXJ0VGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgcHJpdmF0ZSBzdGVwVGltZXM6IG51bWJlcltdID0gW107XG5cbiAgLyoqXG4gICAqIFJlY29yZCB0cmFpbmluZyBsb3NzXG4gICAqL1xuICByZWNvcmRMb3NzKGxvc3M6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubG9zc0hpc3RvcnkucHVzaChsb3NzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgdmFsaWRhdGlvbiBsb3NzXG4gICAqL1xuICByZWNvcmRWYWxMb3NzKGxvc3M6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmFsTG9zc0hpc3RvcnkucHVzaChsb3NzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgZ3JhZGllbnQgbm9ybVxuICAgKi9cbiAgcmVjb3JkR3JhZE5vcm0obm9ybTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5ncmFkTm9ybUhpc3RvcnkucHVzaChub3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgc3RlcCB0aW1lXG4gICAqL1xuICByZWNvcmRTdGVwVGltZShtczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdGVwVGltZXMucHVzaChtcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGF2ZXJhZ2UgbG9zcyBvdmVyIGxhc3QgTiBzdGVwc1xuICAgKi9cbiAgYXZnTG9zcyhuOiBudW1iZXIgPSAxMDApOiBudW1iZXIge1xuICAgIGNvbnN0IHJlY2VudCA9IHRoaXMubG9zc0hpc3Rvcnkuc2xpY2UoLW4pO1xuICAgIHJldHVybiByZWNlbnQubGVuZ3RoID4gMCA/IHJlY2VudC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIHJlY2VudC5sZW5ndGggOiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhdmVyYWdlIHZhbGlkYXRpb24gbG9zc1xuICAgKi9cbiAgYXZnVmFsTG9zcyhuOiBudW1iZXIgPSAxMCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVjZW50ID0gdGhpcy52YWxMb3NzSGlzdG9yeS5zbGljZSgtbik7XG4gICAgcmV0dXJuIHJlY2VudC5sZW5ndGggPiAwID8gcmVjZW50LnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gcmVjZW50Lmxlbmd0aCA6IDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN0ZXBzIHBlciBzZWNvbmRcbiAgICovXG4gIHN0ZXBzUGVyU2Vjb25kKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuc3RlcFRpbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgY29uc3QgYXZnU3RlcFRpbWUgPSB0aGlzLnN0ZXBUaW1lcy5zbGljZSgtMTAwKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIE1hdGgubWluKHRoaXMuc3RlcFRpbWVzLmxlbmd0aCwgMTAwKTtcbiAgICByZXR1cm4gYXZnU3RlcFRpbWUgPiAwID8gMTAwMCAvIGF2Z1N0ZXBUaW1lIDogMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgRVRBIGluIHNlY29uZHNcbiAgICovXG4gIGV0YShyZW1haW5pbmdTdGVwczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzcHMgPSB0aGlzLnN0ZXBzUGVyU2Vjb25kKCk7XG4gICAgcmV0dXJuIHNwcyA+IDAgPyByZW1haW5pbmdTdGVwcyAvIHNwcyA6IDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJlc3QgdmFsaWRhdGlvbiBsb3NzXG4gICAqL1xuICBiZXN0VmFsTG9zcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZhbExvc3NIaXN0b3J5Lmxlbmd0aCA+IDAgPyBNYXRoLm1pbiguLi50aGlzLnZhbExvc3NIaXN0b3J5KSA6IEluZmluaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0b3RhbCBkdXJhdGlvblxuICAgKi9cbiAgZHVyYXRpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgbG9zcyBoaXN0b3J5XG4gICAqL1xuICBnZXRMb3NzSGlzdG9yeSgpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmxvc3NIaXN0b3J5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHZhbGlkYXRpb24gbG9zcyBoaXN0b3J5XG4gICAqL1xuICBnZXRWYWxMb3NzSGlzdG9yeSgpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnZhbExvc3NIaXN0b3J5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0cmFja2VyXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvc3NIaXN0b3J5ID0gW107XG4gICAgdGhpcy52YWxMb3NzSGlzdG9yeSA9IFtdO1xuICAgIHRoaXMuZ3JhZE5vcm1IaXN0b3J5ID0gW107XG4gICAgdGhpcy5zdGVwVGltZXMgPSBbXTtcbiAgICB0aGlzLnN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFpbmluZyBQaXBlbGluZVxuICpcbiAqIEZ1bGwgdHJhaW5pbmcgaW5mcmFzdHJ1Y3R1cmUgZm9yIFNPTkEgbW9kZWxzLlxuICovXG5leHBvcnQgY2xhc3MgVHJhaW5pbmdQaXBlbGluZSB7XG4gIHByaXZhdGUgY29uZmlnOiBSZXF1aXJlZDxUcmFpbmluZ0NvbmZpZz47XG4gIHByaXZhdGUgYWRhcHRlcjogTG9yYUFkYXB0ZXI7XG4gIHByaXZhdGUgZXdjTWFuYWdlcjogRXdjTWFuYWdlcjtcbiAgcHJpdmF0ZSBtZXRyaWNzOiBNZXRyaWNzVHJhY2tlcjtcbiAgcHJpdmF0ZSBzY2hlZHVsZXI6IExSU2NoZWR1bGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYmF0Y2hlczogVHJhaW5pbmdCYXRjaFtdID0gW107XG4gIHByaXZhdGUgY2hlY2twb2ludHM6IENoZWNrcG9pbnRbXSA9IFtdO1xuICBwcml2YXRlIGN1cnJlbnRFcG9jaDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBjdXJyZW50U3RlcDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBiZXN0VmFsTG9zczogbnVtYmVyID0gSW5maW5pdHk7XG4gIHByaXZhdGUgcGF0aWVuY2VDb3VudGVyOiBudW1iZXIgPSAwO1xuICAvKiogU2V0IGJ5IHJlc3VtZUZyb20oKTsgbWFrZXMgdGhlIG5leHQgdHJhaW4oKSBjb250aW51ZSBpbnN0ZWFkIG9mIHJlc3RhcnQuICovXG4gIHByaXZhdGUgcmVzdW1lUGVuZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IFRyYWluaW5nQ29uZmlnLCBhZGFwdGVyPzogTG9yYUFkYXB0ZXIpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9UUkFJTklOR19DT05GSUcsIC4uLmNvbmZpZyB9O1xuICAgIHRoaXMuYWRhcHRlciA9IGFkYXB0ZXIgfHwgbmV3IExvcmFBZGFwdGVyKHsgcmFuazogOCB9KTtcbiAgICB0aGlzLmV3Y01hbmFnZXIgPSBuZXcgRXdjTWFuYWdlcih0aGlzLmNvbmZpZy5ld2NMYW1iZGEpO1xuICAgIHRoaXMubWV0cmljcyA9IG5ldyBNZXRyaWNzVHJhY2tlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0cmFpbmluZyBiYXRjaFxuICAgKi9cbiAgYWRkQmF0Y2goaW5wdXRzOiBFbWJlZGRpbmdbXSwgdGFyZ2V0czogRW1iZWRkaW5nW10sIHF1YWxpdGllczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLmJhdGNoZXMucHVzaCh7IGlucHV0cywgdGFyZ2V0cywgcXVhbGl0aWVzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0cmFpbmluZyBkYXRhXG4gICAqL1xuICBhZGREYXRhKGRhdGE6IEFycmF5PHsgaW5wdXQ6IEVtYmVkZGluZzsgdGFyZ2V0OiBFbWJlZGRpbmc7IHF1YWxpdHk6IG51bWJlciB9Pik6IHZvaWQge1xuICAgIC8vIEdyb3VwIGludG8gYmF0Y2hlc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gdGhpcy5jb25maWcuYmF0Y2hTaXplKSB7XG4gICAgICBjb25zdCBiYXRjaCA9IGRhdGEuc2xpY2UoaSwgaSArIHRoaXMuY29uZmlnLmJhdGNoU2l6ZSk7XG4gICAgICB0aGlzLmFkZEJhdGNoKFxuICAgICAgICBiYXRjaC5tYXAoZCA9PiBkLmlucHV0KSxcbiAgICAgICAgYmF0Y2gubWFwKGQgPT4gZC50YXJnZXQpLFxuICAgICAgICBiYXRjaC5tYXAoZCA9PiBkLnF1YWxpdHkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdHJhaW5pbmcuXG4gICAqXG4gICAqIFdoZW4ge0BsaW5rIHJlc3VtZUZyb219IHByaW1lZCB0aGUgcGlwZWxpbmUsIHRoaXMgY29udGludWVzIGZyb20gdGhlXG4gICAqIHJlc3RvcmVkIGVwb2NoIChydW5uaW5nIHRoZSByZW1haW5pbmcgZXBvY2hzIG9mIGBjb25maWcuZXBvY2hzYCkgYW5kXG4gICAqIGFkdmFuY2VzIHRoZSBMUiBzY2hlZHVsZXIgdG8gdGhlIHJlc3RvcmVkIHN0ZXAgc28gdGhlIHNjaGVkdWxlIGlzXG4gICAqIHVuYnJva2VuOyBtZXRyaWNzIGhpc3RvcnkgaXMgcHJlc2VydmVkLiBXaXRob3V0IGEgcmVzdW1lIHRoZSBydW4gaXNcbiAgICogdW5jaGFuZ2VkIGZyb20gYSBmcmVzaCBzdGFydCDigJQgc2FtZSByZXNldCwgc2FtZSBzY2hlZHVsZXIsIHNhbWUgcmVzdWx0XG4gICAqIHNoYXBlIGFzIGJlZm9yZSB0aGlzIG1ldGhvZCBsZWFybmVkIHRvIHJlc3VtZS5cbiAgICovXG4gIHRyYWluKCk6IFRyYWluaW5nUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bWluZyA9IHRoaXMucmVzdW1lUGVuZGluZztcbiAgICB0aGlzLnJlc3VtZVBlbmRpbmcgPSBmYWxzZTtcbiAgICAvLyBjdXJyZW50RXBvY2ggaXMgdGhlIGxhc3QgQ09NUExFVEVEIGVwb2NoIGluZGV4LCBzbyByZXN1bWUgdGhlIG5leHQgb25lLlxuICAgIGNvbnN0IHN0YXJ0RXBvY2ggPSByZXN1bWluZyA/IHRoaXMuY3VycmVudEVwb2NoICsgMSA6IDA7XG5cbiAgICBjb25zdCB0b3RhbFN0ZXBzID0gdGhpcy5iYXRjaGVzLmxlbmd0aCAqIHRoaXMuY29uZmlnLmVwb2NocztcbiAgICB0aGlzLnNjaGVkdWxlciA9IG5ldyBMUlNjaGVkdWxlcih0aGlzLmNvbmZpZywgdG90YWxTdGVwcyk7XG4gICAgaWYgKHJlc3VtaW5nKSB7XG4gICAgICAvLyBGYXN0LWZvcndhcmQgdGhlIGZyZXNoIHNjaGVkdWxlciB0byB0aGUgcmVzdG9yZWQgc3RlcC5cbiAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgdGhpcy5jdXJyZW50U3RlcCAmJiBzIDwgdG90YWxTdGVwczsgcysrKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyLnN0ZXAoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRyaWNzLnJlc2V0KCk7XG4gICAgfVxuICAgIHRoaXMuYWRhcHRlci5zdGFydFRyYWluaW5nKHRoaXMuY29uZmlnLmxlYXJuaW5nUmF0ZSk7XG5cbiAgICBsZXQgZWFybHlTdG9wcGVkID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBlcG9jaCA9IHN0YXJ0RXBvY2g7IGVwb2NoIDwgdGhpcy5jb25maWcuZXBvY2hzOyBlcG9jaCsrKSB7XG4gICAgICB0aGlzLmN1cnJlbnRFcG9jaCA9IGVwb2NoO1xuXG4gICAgICAvLyBTaHVmZmxlIGJhdGNoZXNcbiAgICAgIGNvbnN0IHNodWZmbGVkQmF0Y2hlcyA9IHRoaXMuc2h1ZmZsZUJhdGNoZXMoKTtcblxuICAgICAgLy8gU3BsaXQgaW50byB0cmFpbi92YWxcbiAgICAgIGNvbnN0IHZhbFNpemUgPSBNYXRoLmZsb29yKHNodWZmbGVkQmF0Y2hlcy5sZW5ndGggKiB0aGlzLmNvbmZpZy52YWxpZGF0aW9uU3BsaXQpO1xuICAgICAgY29uc3QgdHJhaW5CYXRjaGVzID0gc2h1ZmZsZWRCYXRjaGVzLnNsaWNlKHZhbFNpemUpO1xuICAgICAgY29uc3QgdmFsQmF0Y2hlcyA9IHNodWZmbGVkQmF0Y2hlcy5zbGljZSgwLCB2YWxTaXplKTtcblxuICAgICAgLy8gVHJhaW5pbmcgZXBvY2hcbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgdHJhaW5CYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IHN0ZXBTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IGxvc3MgPSB0aGlzLnRyYWluU3RlcChiYXRjaCk7XG4gICAgICAgIHRoaXMubWV0cmljcy5yZWNvcmRMb3NzKGxvc3MpO1xuICAgICAgICB0aGlzLm1ldHJpY3MucmVjb3JkU3RlcFRpbWUoRGF0ZS5ub3coKSAtIHN0ZXBTdGFydCk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyLnN0ZXAoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcCsrO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0aW9uXG4gICAgICBpZiAodmFsQmF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHZhbExvc3MgPSB0aGlzLnZhbGlkYXRlKHZhbEJhdGNoZXMpO1xuICAgICAgICB0aGlzLm1ldHJpY3MucmVjb3JkVmFsTG9zcyh2YWxMb3NzKTtcblxuICAgICAgICAvLyBFYXJseSBzdG9wcGluZ1xuICAgICAgICBpZiAodmFsTG9zcyA8IHRoaXMuYmVzdFZhbExvc3MpIHtcbiAgICAgICAgICB0aGlzLmJlc3RWYWxMb3NzID0gdmFsTG9zcztcbiAgICAgICAgICB0aGlzLnBhdGllbmNlQ291bnRlciA9IDA7XG4gICAgICAgICAgLy8gUmV0YWluIHRoZSBiZXN0LXZhbGlkYXRpb24gbW9kZWwgdG8gYSBzdGFibGUgcGF0aCB3aGVuIGNvbmZpZ3VyZWQuXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmtlZXBCZXN0Q2hlY2twb2ludCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlQ2hlY2twb2ludCh0aGlzLmNvbmZpZy5rZWVwQmVzdENoZWNrcG9pbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBhdGllbmNlQ291bnRlcisrO1xuICAgICAgICAgIGlmICh0aGlzLnBhdGllbmNlQ291bnRlciA+PSB0aGlzLmNvbmZpZy5lYXJseVN0b3BwaW5nUGF0aWVuY2UpIHtcbiAgICAgICAgICAgIGVhcmx5U3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2twb2ludFxuICAgICAgaWYgKChlcG9jaCArIDEpICUgdGhpcy5jb25maWcuY2hlY2twb2ludEludGVydmFsID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2F2ZUNoZWNrcG9pbnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmFkYXB0ZXIuZW5kVHJhaW5pbmcoKTtcblxuICAgIC8vIFJlZ2lzdGVyIHdpdGggRVdDIGZvciBjb250aW51YWwgbGVhcm5pbmdcbiAgICBjb25zdCB3ZWlnaHRzID0gdGhpcy5hZGFwdGVyLm1lcmdlKCkuZmxhdCgpO1xuICAgIHRoaXMuZXdjTWFuYWdlci5yZWdpc3RlclRhc2soYHRhc2stJHtEYXRlLm5vdygpfWAsIHdlaWdodHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVwb2NoczogdGhpcy5jdXJyZW50RXBvY2ggKyAxLFxuICAgICAgc3RlcHM6IHRoaXMuY3VycmVudFN0ZXAsXG4gICAgICBmaW5hbExvc3M6IHRoaXMubWV0cmljcy5hdmdMb3NzKDEwMCksXG4gICAgICBiZXN0VmFsTG9zczogdGhpcy5iZXN0VmFsTG9zcyxcbiAgICAgIGR1cmF0aW9uTXM6IHRoaXMubWV0cmljcy5kdXJhdGlvbigpLFxuICAgICAgbG9zc0hpc3Rvcnk6IHRoaXMubWV0cmljcy5nZXRMb3NzSGlzdG9yeSgpLFxuICAgICAgdmFsTG9zc0hpc3Rvcnk6IHRoaXMubWV0cmljcy5nZXRWYWxMb3NzSGlzdG9yeSgpLFxuICAgICAgZWFybHlTdG9wcGVkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2luZ2xlIHRyYWluaW5nIHN0ZXBcbiAgICovXG4gIHByaXZhdGUgdHJhaW5TdGVwKGJhdGNoOiBUcmFpbmluZ0JhdGNoKTogbnVtYmVyIHtcbiAgICBsZXQgdG90YWxMb3NzID0gMDtcbiAgICBjb25zdCBsciA9IHRoaXMuc2NoZWR1bGVyPy5nZXRMUigpIHx8IHRoaXMuY29uZmlnLmxlYXJuaW5nUmF0ZTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2guaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbnB1dCA9IGJhdGNoLmlucHV0c1tpXTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGJhdGNoLnRhcmdldHNbaV07XG4gICAgICBjb25zdCBxdWFsaXR5ID0gYmF0Y2gucXVhbGl0aWVzW2ldO1xuXG4gICAgICAvLyBGb3J3YXJkIHBhc3NcbiAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuYWRhcHRlci5mb3J3YXJkKGlucHV0KTtcblxuICAgICAgLy8gQ29tcHV0ZSBsb3NzIChNU0Ugd2VpZ2h0ZWQgYnkgcXVhbGl0eSlcbiAgICAgIGNvbnN0IGdyYWRPdXRwdXQ6IG51bWJlcltdID0gW107XG4gICAgICBsZXQgbG9zcyA9IDA7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG91dHB1dC5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBkaWZmID0gb3V0cHV0W2pdIC0gKHRhcmdldFtqXSB8fCAwKTtcbiAgICAgICAgbG9zcyArPSBkaWZmICogZGlmZjtcbiAgICAgICAgZ3JhZE91dHB1dC5wdXNoKDIgKiBkaWZmICogcXVhbGl0eSk7IC8vIFF1YWxpdHktd2VpZ2h0ZWQgZ3JhZGllbnRcbiAgICAgIH1cbiAgICAgIGxvc3MgPSAobG9zcyAvIG91dHB1dC5sZW5ndGgpICogcXVhbGl0eTtcblxuICAgICAgLy8gQWRkIEVXQyBwZW5hbHR5XG4gICAgICBjb25zdCBld2NQZW5hbHR5ID0gdGhpcy5ld2NNYW5hZ2VyLmNvbXB1dGVQZW5hbHR5KHRoaXMuYWRhcHRlci5tZXJnZSgpLmZsYXQoKSk7XG4gICAgICBsb3NzICs9IGV3Y1BlbmFsdHkgKiAwLjAwMTtcblxuICAgICAgLy8gQmFja3dhcmQgcGFzc1xuICAgICAgdGhpcy5hZGFwdGVyLmJhY2t3YXJkKGlucHV0LCBncmFkT3V0cHV0LCBscik7XG5cbiAgICAgIHRvdGFsTG9zcyArPSBsb3NzO1xuICAgIH1cblxuICAgIHJldHVybiB0b3RhbExvc3MgLyBiYXRjaC5pbnB1dHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gcGFzc1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZShiYXRjaGVzOiBUcmFpbmluZ0JhdGNoW10pOiBudW1iZXIge1xuICAgIGxldCB0b3RhbExvc3MgPSAwO1xuICAgIGxldCBjb3VudCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIGJhdGNoZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2guaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuYWRhcHRlci5mb3J3YXJkKGJhdGNoLmlucHV0c1tpXSk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGJhdGNoLnRhcmdldHNbaV07XG5cbiAgICAgICAgbGV0IGxvc3MgPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG91dHB1dC5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGNvbnN0IGRpZmYgPSBvdXRwdXRbal0gLSAodGFyZ2V0W2pdIHx8IDApO1xuICAgICAgICAgIGxvc3MgKz0gZGlmZiAqIGRpZmY7XG4gICAgICAgIH1cbiAgICAgICAgdG90YWxMb3NzICs9IGxvc3MgLyBvdXRwdXQubGVuZ3RoO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3VudCA+IDAgPyB0b3RhbExvc3MgLyBjb3VudCA6IDA7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhIGNoZWNrcG9pbnQuXG4gICAqXG4gICAqIEFsd2F5cyByZWNvcmRzIHRoZSBjaGVja3BvaW50IGluIHRoZSBpbi1tZW1vcnkgbGlzdCAodGhlIGJlaGF2aW9yIHRoZVxuICAgKiB0cmFpbmluZyBsb29wIHJlbGllcyBvbikuIFdoZW4gYHBhdGhgIGlzIGdpdmVuLCBhZGRpdGlvbmFsbHkgcGVyc2lzdHNcbiAgICogdGhlIGNoZWNrcG9pbnQgdG8gZGlzayBhcyB2ZXJzaW9uZWQgSlNPTiDigJQgYmVmb3JlIHYyLjUuNyB0aGlzIG1ldGhvZFxuICAgKiB3YXMgcHJpdmF0ZSwgaWdub3JlZCBhbnkgYXJndW1lbnQsIGFuZCBuZXZlciB3cm90ZSBhIGZpbGUsIHNvIGNhbGxlcnNcbiAgICogcGFzc2luZyBhIHBhdGggZ290IGB1bmRlZmluZWRgIGJhY2sgYW5kIHplcm8gYnl0ZXMgb24gZGlzay5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggT3B0aW9uYWwgZmlsZSBwYXRoOyBwYXJlbnQgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQuXG4gICAqIEByZXR1cm5zIFdoZXJlIHRoZSBjaGVja3BvaW50IHdlbnQg4oCUIGluLW1lbW9yeSBpbmRleCwgYW5kIGZpbGVcbiAgICogICAgICAgICAgcGF0aCArIGJ5dGUgc2l6ZSB3aGVuIHBlcnNpc3RlZC5cbiAgICovXG4gIHNhdmVDaGVja3BvaW50KHBhdGg/OiBzdHJpbmcpOiBDaGVja3BvaW50U2F2ZVJlc3VsdCB7XG4gICAgY29uc3QgY2hlY2twb2ludDogQ2hlY2twb2ludCA9IHtcbiAgICAgIGVwb2NoOiB0aGlzLmN1cnJlbnRFcG9jaCxcbiAgICAgIHN0ZXA6IHRoaXMuY3VycmVudFN0ZXAsXG4gICAgICBsb3NzOiB0aGlzLm1ldHJpY3MuYXZnTG9zcygxMDApLFxuICAgICAgd2VpZ2h0czogdGhpcy5hZGFwdGVyLnRvSlNPTigpLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH07XG4gICAgdGhpcy5jaGVja3BvaW50cy5wdXNoKGNoZWNrcG9pbnQpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBDaGVja3BvaW50U2F2ZVJlc3VsdCA9IHtcbiAgICAgIGluZGV4OiB0aGlzLmNoZWNrcG9pbnRzLmxlbmd0aCAtIDEsXG4gICAgICBlcG9jaDogY2hlY2twb2ludC5lcG9jaCxcbiAgICAgIHN0ZXA6IGNoZWNrcG9pbnQuc3RlcCxcbiAgICAgIGxvc3M6IGNoZWNrcG9pbnQubG9zcyxcbiAgICB9O1xuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0ge1xuICAgICAgICBmb3JtYXQ6ICdydXZsbG0tY2hlY2twb2ludCcsXG4gICAgICAgIHZlcnNpb246IENIRUNLUE9JTlRfRk9STUFUX1ZFUlNJT04sXG4gICAgICAgIC8vIEFkYXB0ZXIgZ2VvbWV0cnkgKyBwaXBlbGluZSBoeXBlcnBhcmFtcyDigJQgbGV0cyBsb2FkQ2hlY2twb2ludCgpXG4gICAgICAgIC8vIHJlamVjdCB3ZWlnaHRzIHRoYXQgZG9uJ3QgZml0IHRoZSBjdXJyZW50IGFkYXB0ZXIgKHYyLCBzZWUgYmVsb3cpLlxuICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICBpbnB1dERpbTogdGhpcy5hZGFwdGVyLmdldElucHV0RGltKCksXG4gICAgICAgICAgb3V0cHV0RGltOiB0aGlzLmFkYXB0ZXIuZ2V0T3V0cHV0RGltKCksXG4gICAgICAgICAgcmFuazogdGhpcy5hZGFwdGVyLmdldENvbmZpZygpLnJhbmssXG4gICAgICAgIH0sXG4gICAgICAgIHBpcGVsaW5lQ29uZmlnOiB7XG4gICAgICAgICAgbGVhcm5pbmdSYXRlOiB0aGlzLmNvbmZpZy5sZWFybmluZ1JhdGUsXG4gICAgICAgICAgYmF0Y2hTaXplOiB0aGlzLmNvbmZpZy5iYXRjaFNpemUsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmNoZWNrcG9pbnQsXG4gICAgICB9O1xuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKTtcbiAgICAgIG1rZGlyU3luYyhkaXJuYW1lKHBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMocGF0aCwgc2VyaWFsaXplZCwgJ3V0Zi04Jyk7XG4gICAgICByZXN1bHQucGF0aCA9IHBhdGg7XG4gICAgICByZXN1bHQuYnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChzZXJpYWxpemVkLCAndXRmLTgnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBjaGVja3BvaW50IOKAlCBieSBpbi1tZW1vcnkgaW5kZXgsIG9yIGZyb20gYSBmaWxlIHByZXZpb3VzbHlcbiAgICogd3JpdHRlbiBieSBgc2F2ZUNoZWNrcG9pbnQocGF0aClgLlxuICAgKlxuICAgKiBGb3IgdjIgZmlsZXMsIHRoZSBlbnZlbG9wZSdzIGFkYXB0ZXIgZ2VvbWV0cnkgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZVxuICAgKiBjdXJyZW50IGFkYXB0ZXIgZmlyc3Q7IGEgbWlzbWF0Y2ggKGRpZmZlcmVudCBpbnB1dERpbS9vdXRwdXREaW0vcmFuaylcbiAgICogcmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzIHRoZSBhZGFwdGVyIHVudG91Y2hlZCwgc28gbWlzLXNoYXBlZCB3ZWlnaHRzXG4gICAqIGFyZSBuZXZlciBzaWxlbnRseSByZXN0b3JlZC4gdjEgZmlsZXMgY2Fycnkgbm8gZ2VvbWV0cnkgYW5kIGxvYWQgYXNcbiAgICogYmVmb3JlIChiYWNrLWNvbXBhdCkuXG4gICAqL1xuICBsb2FkQ2hlY2twb2ludChpbmRleE9yUGF0aDogbnVtYmVyIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgbGV0IGNoZWNrcG9pbnQ6IENoZWNrcG9pbnQgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZW9mIGluZGV4T3JQYXRoID09PSAnbnVtYmVyJykge1xuICAgICAgY2hlY2twb2ludCA9IHRoaXMuY2hlY2twb2ludHNbaW5kZXhPclBhdGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhpbmRleE9yUGF0aCwgJ3V0Zi04JykpO1xuICAgICAgICBpZiAocGFyc2VkPy5mb3JtYXQgIT09ICdydXZsbG0tY2hlY2twb2ludCcgfHwgdHlwZW9mIHBhcnNlZC53ZWlnaHRzICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhcnNlZC52ZXJzaW9uID09PSAnbnVtYmVyJyAmJiBwYXJzZWQudmVyc2lvbiA+PSAyICYmIHBhcnNlZC5jb25maWcpIHtcbiAgICAgICAgICBjb25zdCBjID0gcGFyc2VkLmNvbmZpZztcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjLmlucHV0RGltICE9PSB0aGlzLmFkYXB0ZXIuZ2V0SW5wdXREaW0oKSB8fFxuICAgICAgICAgICAgYy5vdXRwdXREaW0gIT09IHRoaXMuYWRhcHRlci5nZXRPdXRwdXREaW0oKSB8fFxuICAgICAgICAgICAgYy5yYW5rICE9PSB0aGlzLmFkYXB0ZXIuZ2V0Q29uZmlnKCkucmFua1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjaGVja3BvaW50ID0gcGFyc2VkIGFzIENoZWNrcG9pbnQ7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWNoZWNrcG9pbnQpIHJldHVybiBmYWxzZTtcblxuICAgIHRoaXMuYWRhcHRlciA9IExvcmFBZGFwdGVyLmZyb21KU09OKGNoZWNrcG9pbnQud2VpZ2h0cyk7XG4gICAgdGhpcy5jdXJyZW50RXBvY2ggPSBjaGVja3BvaW50LmVwb2NoO1xuICAgIHRoaXMuY3VycmVudFN0ZXAgPSBjaGVja3BvaW50LnN0ZXA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIHRyYWluaW5nIGZyb20gYSBjaGVja3BvaW50IGZpbGUuXG4gICAqXG4gICAqIExvYWRzIHRoZSBjaGVja3BvaW50ICh3aXRoIHRoZSBzYW1lIHYyIHNoYXBlIHZhbGlkYXRpb24gYXNcbiAgICoge0BsaW5rIGxvYWRDaGVja3BvaW50fSkgQU5EIHByaW1lcyB0aGUgcGlwZWxpbmUgc28gdGhlIG5leHQge0BsaW5rIHRyYWlufVxuICAgKiBjYWxsIGNvbnRpbnVlcyBmcm9tIHRoZSByZXN0b3JlZCBlcG9jaC9zdGVwIHJhdGhlciB0aGFuIHJlc3RhcnRpbmcuIFRoaXNcbiAgICogaXMgdGhlIGV4cGxpY2l0LCBsZWFzdC1pbnZhc2l2ZSByZXN1bWUgcGF0aDogYSBwbGFpbiBgbG9hZENoZWNrcG9pbnQoKWBcbiAgICogc3RpbGwgcmVzdG9yZXMgd2VpZ2h0cyBvbmx5ICh0cmFpbigpIGZyb20gc2NyYXRjaCksIHdoaWxlIGByZXN1bWVGcm9tKClgXG4gICAqIGFkZGl0aW9uYWxseSBtYWtlcyB0aGUgc3Vic2VxdWVudCB0cmFpbigpIHBpY2sgdXAgd2hlcmUgdGhlIHJ1biBzdG9wcGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIHdoZW4gdGhlIGNoZWNrcG9pbnQgbG9hZGVkIGFuZCByZXN1bWUgd2FzIHByaW1lZDsgZmFsc2UgaWZcbiAgICogICAgICAgICAgdGhlIGZpbGUgd2FzIG1pc3NpbmcsIGZvcmVpZ24sIG9yIHNoYXBlLW1pc21hdGNoZWQgKGluIHdoaWNoIGNhc2VcbiAgICogICAgICAgICAgbm8gcmVzdW1lIGlzIGFybWVkKS5cbiAgICovXG4gIHJlc3VtZUZyb20ocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmxvYWRDaGVja3BvaW50KHBhdGgpKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5yZXN1bWVQZW5kaW5nID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBtZXRyaWNzXG4gICAqL1xuICBnZXRNZXRyaWNzKCk6IFRyYWluaW5nTWV0cmljcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVwb2NoOiB0aGlzLmN1cnJlbnRFcG9jaCxcbiAgICAgIHN0ZXA6IHRoaXMuY3VycmVudFN0ZXAsXG4gICAgICB0cmFpbkxvc3M6IHRoaXMubWV0cmljcy5hdmdMb3NzKDEwMCksXG4gICAgICB2YWxMb3NzOiB0aGlzLm1ldHJpY3MuYXZnVmFsTG9zcygxMCksXG4gICAgICBsZWFybmluZ1JhdGU6IHRoaXMuc2NoZWR1bGVyPy5nZXRMUigpIHx8IHRoaXMuY29uZmlnLmxlYXJuaW5nUmF0ZSxcbiAgICAgIGdyYWROb3JtOiAwLFxuICAgICAgc3RlcHNQZXJTZWNvbmQ6IHRoaXMubWV0cmljcy5zdGVwc1BlclNlY29uZCgpLFxuICAgICAgZXRhU2Vjb25kczogdGhpcy5tZXRyaWNzLmV0YShcbiAgICAgICAgKHRoaXMuY29uZmlnLmVwb2NocyAtIHRoaXMuY3VycmVudEVwb2NoKSAqIHRoaXMuYmF0Y2hlcy5sZW5ndGhcbiAgICAgICksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWRhcHRlclxuICAgKi9cbiAgZ2V0QWRhcHRlcigpOiBMb3JhQWRhcHRlciB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgRVdDIG1hbmFnZXJcbiAgICovXG4gIGdldEV3Y01hbmFnZXIoKTogRXdjTWFuYWdlciB7XG4gICAgcmV0dXJuIHRoaXMuZXdjTWFuYWdlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hlY2twb2ludHNcbiAgICovXG4gIGdldENoZWNrcG9pbnRzKCk6IENoZWNrcG9pbnRbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmNoZWNrcG9pbnRzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBwaXBlbGluZVxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5iYXRjaGVzID0gW107XG4gICAgdGhpcy5jaGVja3BvaW50cyA9IFtdO1xuICAgIHRoaXMuY3VycmVudEVwb2NoID0gMDtcbiAgICB0aGlzLmN1cnJlbnRTdGVwID0gMDtcbiAgICB0aGlzLmJlc3RWYWxMb3NzID0gSW5maW5pdHk7XG4gICAgdGhpcy5wYXRpZW5jZUNvdW50ZXIgPSAwO1xuICAgIHRoaXMucmVzdW1lUGVuZGluZyA9IGZhbHNlO1xuICAgIHRoaXMubWV0cmljcy5yZXNldCgpO1xuICAgIHRoaXMuYWRhcHRlci5yZXNldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaHVmZmxlQmF0Y2hlcygpOiBUcmFpbmluZ0JhdGNoW10ge1xuICAgIGNvbnN0IHNodWZmbGVkID0gWy4uLnRoaXMuYmF0Y2hlc107XG4gICAgZm9yIChsZXQgaSA9IHNodWZmbGVkLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTtcbiAgICAgIFtzaHVmZmxlZFtpXSwgc2h1ZmZsZWRbal1dID0gW3NodWZmbGVkW2pdLCBzaHVmZmxlZFtpXV07XG4gICAgfVxuICAgIHJldHVybiBzaHVmZmxlZDtcbiAgfVxufVxuXG4vKipcbiAqIFRyYWluaW5nIEZhY3RvcnlcbiAqXG4gKiBDcmVhdGUgcHJlLWNvbmZpZ3VyZWQgdHJhaW5pbmcgcGlwZWxpbmVzIGZvciBjb21tb24gc2NlbmFyaW9zLlxuICovXG5leHBvcnQgY2xhc3MgVHJhaW5pbmdGYWN0b3J5IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBwaXBlbGluZSBmb3IgcXVpY2sgZmluZS10dW5pbmdcbiAgICovXG4gIHN0YXRpYyBxdWlja0ZpbmV0dW5lKCk6IFRyYWluaW5nUGlwZWxpbmUge1xuICAgIHJldHVybiBuZXcgVHJhaW5pbmdQaXBlbGluZSh7XG4gICAgICBsZWFybmluZ1JhdGU6IDAuMDEsXG4gICAgICBlcG9jaHM6IDMsXG4gICAgICBiYXRjaFNpemU6IDE2LFxuICAgICAgc2NoZWR1bGVyOiAnY29uc3RhbnQnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBwaXBlbGluZSBmb3IgZGVlcCB0cmFpbmluZ1xuICAgKi9cbiAgc3RhdGljIGRlZXBUcmFpbmluZygpOiBUcmFpbmluZ1BpcGVsaW5lIHtcbiAgICByZXR1cm4gbmV3IFRyYWluaW5nUGlwZWxpbmUoe1xuICAgICAgbGVhcm5pbmdSYXRlOiAwLjAwMSxcbiAgICAgIGVwb2NoczogNTAsXG4gICAgICBiYXRjaFNpemU6IDMyLFxuICAgICAgc2NoZWR1bGVyOiAnd2FybXVwJyxcbiAgICAgIHdhcm11cFN0ZXBzOiA1MDAsXG4gICAgICBlYXJseVN0b3BwaW5nUGF0aWVuY2U6IDUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHBpcGVsaW5lIGZvciBjb250aW51YWwgbGVhcm5pbmdcbiAgICovXG4gIHN0YXRpYyBjb250aW51YWxMZWFybmluZyhld2NMYW1iZGE6IG51bWJlciA9IDUwMDApOiBUcmFpbmluZ1BpcGVsaW5lIHtcbiAgICByZXR1cm4gbmV3IFRyYWluaW5nUGlwZWxpbmUoe1xuICAgICAgbGVhcm5pbmdSYXRlOiAwLjAwMDUsXG4gICAgICBlcG9jaHM6IDEwLFxuICAgICAgYmF0Y2hTaXplOiAxNixcbiAgICAgIHNjaGVkdWxlcjogJ2Nvc2luZScsXG4gICAgICBld2NMYW1iZGEsXG4gICAgICBlYXJseVN0b3BwaW5nUGF0aWVuY2U6IDEwLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBwaXBlbGluZSBmb3IgZmVkZXJhdGVkIGFnZ3JlZ2F0aW9uXG4gICAqL1xuICBzdGF0aWMgZmVkZXJhdGVkQWdncmVnYXRpb24oKTogVHJhaW5pbmdQaXBlbGluZSB7XG4gICAgcmV0dXJuIG5ldyBUcmFpbmluZ1BpcGVsaW5lKHtcbiAgICAgIGxlYXJuaW5nUmF0ZTogMC4wMDAxLFxuICAgICAgZXBvY2hzOiA1LFxuICAgICAgYmF0Y2hTaXplOiA2NCxcbiAgICAgIHNjaGVkdWxlcjogJ2xpbmVhcicsXG4gICAgICBld2NMYW1iZGE6IDIwMDAsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -515,6 +515,13 @@ export interface TrainingConfig {
515
515
  ewcLambda?: number;
516
516
  /** Validation split ratio */
517
517
  validationSplit?: number;
518
+ /**
519
+ * File path for best-checkpoint retention. When set, the pipeline writes
520
+ * the current state to this path each time validation loss improves, so the
521
+ * best-validation model survives even if later epochs degrade. Empty string
522
+ * (the default) disables it; a no-op when validation never runs.
523
+ */
524
+ keepBestCheckpoint?: string;
518
525
  }
519
526
  /**
520
527
  * Training metrics snapshot