@appium/support 2.55.4 → 2.57.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.
Files changed (96) hide show
  1. package/build/lib/env.d.ts +54 -0
  2. package/build/lib/env.d.ts.map +1 -0
  3. package/build/lib/env.js +102 -0
  4. package/build/lib/fs.d.ts +221 -0
  5. package/build/lib/fs.d.ts.map +1 -0
  6. package/build/lib/fs.js +74 -56
  7. package/build/lib/image-util.d.ts +56 -0
  8. package/build/lib/image-util.d.ts.map +1 -0
  9. package/build/lib/image-util.js +3 -6
  10. package/build/lib/index.d.ts +38 -0
  11. package/build/lib/index.d.ts.map +1 -0
  12. package/build/lib/index.js +36 -18
  13. package/build/lib/log-internal.d.ts +74 -0
  14. package/build/lib/log-internal.d.ts.map +1 -0
  15. package/build/lib/log-internal.js +11 -21
  16. package/build/lib/logger.d.ts +3 -0
  17. package/build/lib/logger.d.ts.map +1 -0
  18. package/build/lib/logger.js +2 -4
  19. package/build/lib/logging.d.ts +45 -0
  20. package/build/lib/logging.d.ts.map +1 -0
  21. package/build/lib/logging.js +12 -16
  22. package/build/lib/mjpeg.d.ts +65 -0
  23. package/build/lib/mjpeg.d.ts.map +1 -0
  24. package/build/lib/mjpeg.js +12 -7
  25. package/build/lib/mkdirp.d.ts +3 -0
  26. package/build/lib/mkdirp.d.ts.map +1 -0
  27. package/build/lib/mkdirp.js +7 -11
  28. package/build/lib/net.d.ts +95 -0
  29. package/build/lib/net.d.ts.map +1 -0
  30. package/build/lib/net.js +42 -26
  31. package/build/lib/node.d.ts +26 -0
  32. package/build/lib/node.d.ts.map +1 -0
  33. package/build/lib/node.js +102 -3
  34. package/build/lib/npm.d.ts +123 -0
  35. package/build/lib/npm.d.ts.map +1 -0
  36. package/build/lib/npm.js +217 -0
  37. package/build/lib/plist.d.ts +43 -0
  38. package/build/lib/plist.d.ts.map +1 -0
  39. package/build/lib/plist.js +2 -4
  40. package/build/lib/process.d.ts +3 -0
  41. package/build/lib/process.d.ts.map +1 -0
  42. package/build/lib/process.js +2 -4
  43. package/build/lib/system.d.ts +7 -0
  44. package/build/lib/system.d.ts.map +1 -0
  45. package/build/lib/system.js +2 -4
  46. package/build/lib/tempdir.d.ts +63 -0
  47. package/build/lib/tempdir.d.ts.map +1 -0
  48. package/build/lib/tempdir.js +4 -9
  49. package/build/lib/timing.d.ts +46 -0
  50. package/build/lib/timing.d.ts.map +1 -0
  51. package/build/lib/timing.js +2 -4
  52. package/build/lib/util.d.ts +183 -0
  53. package/build/lib/util.d.ts.map +1 -0
  54. package/build/lib/util.js +9 -15
  55. package/build/lib/zip.d.ts +180 -0
  56. package/build/lib/zip.d.ts.map +1 -0
  57. package/build/lib/zip.js +9 -9
  58. package/build/tsconfig.tsbuildinfo +1 -0
  59. package/lib/env.js +162 -0
  60. package/lib/fs.js +198 -69
  61. package/lib/image-util.js +23 -7
  62. package/lib/index.js +6 -6
  63. package/lib/log-internal.js +31 -38
  64. package/lib/logging.js +41 -17
  65. package/lib/mjpeg.js +14 -5
  66. package/lib/mkdirp.js +3 -6
  67. package/lib/net.js +116 -60
  68. package/lib/node.js +107 -4
  69. package/lib/npm.js +278 -0
  70. package/lib/plist.js +3 -1
  71. package/lib/tempdir.js +14 -13
  72. package/lib/util.js +36 -33
  73. package/lib/zip.js +31 -21
  74. package/package.json +31 -13
  75. package/build/test/assets/sample_binary.plist +0 -0
  76. package/build/test/assets/sample_text.plist +0 -28
  77. package/build/test/fs-specs.js +0 -264
  78. package/build/test/helpers.js +0 -35
  79. package/build/test/image-util-e2e-specs.js +0 -78
  80. package/build/test/index-specs.js +0 -49
  81. package/build/test/log-internals-specs.js +0 -97
  82. package/build/test/logger/helpers.js +0 -71
  83. package/build/test/logger/logger-force-specs.js +0 -41
  84. package/build/test/logger/logger-normal-specs.js +0 -113
  85. package/build/test/logger/logger-test-specs.js +0 -40
  86. package/build/test/mjpeg-e2e-specs.js +0 -96
  87. package/build/test/net-e2e-specs.js +0 -32
  88. package/build/test/node-e2e-specs.js +0 -22
  89. package/build/test/plist-specs.js +0 -54
  90. package/build/test/process-specs.js +0 -104
  91. package/build/test/system-specs.js +0 -136
  92. package/build/test/tempdir-specs.js +0 -86
  93. package/build/test/timing-specs.js +0 -125
  94. package/build/test/util-e2e-specs.js +0 -136
  95. package/build/test/util-specs.js +0 -537
  96. package/build/test/zip-e2e-specs.js +0 -233
@@ -93,7 +93,5 @@ class Timer {
93
93
 
94
94
  exports.Timer = Timer;
95
95
  var _default = Timer;
96
- exports.default = _default;require('source-map-support').install();
97
-
98
-
99
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90aW1pbmcuanMiXSwibmFtZXMiOlsiTlNfUEVSX1MiLCJOU19QRVJfTVMiLCJEdXJhdGlvbiIsImNvbnN0cnVjdG9yIiwibmFub3MiLCJfbmFub3MiLCJhc05hbm9TZWNvbmRzIiwiYXNNaWxsaVNlY29uZHMiLCJhc1NlY29uZHMiLCJ0b1N0cmluZyIsInRvRml4ZWQiLCJUaW1lciIsIl9zdGFydFRpbWUiLCJzdGFydFRpbWUiLCJzdGFydCIsIl8iLCJpc051bGwiLCJFcnJvciIsImlzRnVuY3Rpb24iLCJwcm9jZXNzIiwiaHJ0aW1lIiwiYmlnaW50IiwiZ2V0RHVyYXRpb24iLCJuYW5vRHVyYXRpb24iLCJpc0FycmF5Iiwic2Vjb25kcyIsImVuZFRpbWUiLCJOdW1iZXIiLCJlcnIiLCJtZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUdBLE1BQU1BLFFBQVEsR0FBRyxHQUFqQjtBQUNBLE1BQU1DLFNBQVMsR0FBRyxHQUFsQjs7QUFNQSxNQUFNQyxRQUFOLENBQWU7QUFDYkMsRUFBQUEsV0FBVyxDQUFFQyxLQUFGLEVBQVM7QUFDbEIsU0FBS0MsTUFBTCxHQUFjRCxLQUFkO0FBQ0Q7O0FBRVEsTUFBTEEsS0FBSyxHQUFJO0FBQ1gsV0FBTyxLQUFLQyxNQUFaO0FBQ0Q7O0FBT2dCLE1BQWJDLGFBQWEsR0FBSTtBQUNuQixXQUFPLEtBQUtGLEtBQVo7QUFDRDs7QUFPaUIsTUFBZEcsY0FBYyxHQUFJO0FBQ3BCLFdBQU8sS0FBS0gsS0FBTCxHQUFhSCxTQUFwQjtBQUNEOztBQU9ZLE1BQVRPLFNBQVMsR0FBSTtBQUNmLFdBQU8sS0FBS0osS0FBTCxHQUFhSixRQUFwQjtBQUNEOztBQUVEUyxFQUFBQSxRQUFRLEdBQUk7QUFFVixXQUFPLEtBQUtGLGNBQUwsQ0FBb0JHLE9BQXBCLENBQTRCLENBQTVCLENBQVA7QUFDRDs7QUF2Q1k7Ozs7QUEwQ2YsTUFBTUMsS0FBTixDQUFZO0FBSVZSLEVBQUFBLFdBQVcsR0FBSTtBQUNiLFNBQUtTLFVBQUwsR0FBa0IsSUFBbEI7QUFDRDs7QUFFWSxNQUFUQyxTQUFTLEdBQUk7QUFDZixXQUFPLEtBQUtELFVBQVo7QUFDRDs7QUFPREUsRUFBQUEsS0FBSyxHQUFJO0FBQ1AsUUFBSSxDQUFDQyxnQkFBRUMsTUFBRixDQUFTLEtBQUtILFNBQWQsQ0FBTCxFQUErQjtBQUM3QixZQUFNLElBQUlJLEtBQUosQ0FBVSxpQ0FBVixDQUFOO0FBQ0Q7O0FBRUQsU0FBS0wsVUFBTCxHQUFrQkcsZ0JBQUVHLFVBQUYsQ0FBYUMsT0FBTyxDQUFDQyxNQUFSLENBQWVDLE1BQTVCLElBQ2RGLE9BQU8sQ0FBQ0MsTUFBUixDQUFlQyxNQUFmLEVBRGMsR0FFZEYsT0FBTyxDQUFDQyxNQUFSLEVBRko7QUFHQSxXQUFPLElBQVA7QUFDRDs7QUFPREUsRUFBQUEsV0FBVyxHQUFJO0FBQ2IsUUFBSVAsZ0JBQUVDLE1BQUYsQ0FBUyxLQUFLSCxTQUFkLENBQUosRUFBOEI7QUFDNUIsWUFBTSxJQUFJSSxLQUFKLENBQVcsK0NBQVgsQ0FBTjtBQUNEOztBQUVELFFBQUlNLFlBQUo7O0FBQ0EsUUFBSVIsZ0JBQUVTLE9BQUYsQ0FBVSxLQUFLWCxTQUFmLENBQUosRUFBK0I7QUFFN0IsWUFBTSxDQUFDWSxPQUFELEVBQVVyQixLQUFWLElBQW1CZSxPQUFPLENBQUNDLE1BQVIsQ0FBZSxLQUFLUCxTQUFwQixDQUF6QjtBQUNBVSxNQUFBQSxZQUFZLEdBQUdFLE9BQU8sR0FBR3pCLFFBQVYsR0FBcUJJLEtBQXBDO0FBQ0QsS0FKRCxNQUlPLElBQUksT0FBTyxLQUFLUyxTQUFaLEtBQTBCLFFBQTFCLElBQXNDRSxnQkFBRUcsVUFBRixDQUFhQyxPQUFPLENBQUNDLE1BQVIsQ0FBZUMsTUFBNUIsQ0FBMUMsRUFBK0U7QUFFcEYsWUFBTUssT0FBTyxHQUFHUCxPQUFPLENBQUNDLE1BQVIsQ0FBZUMsTUFBZixFQUFoQjtBQUVBRSxNQUFBQSxZQUFZLEdBQUdJLE1BQU0sQ0FBQ0QsT0FBTyxHQUFHLEtBQUtiLFNBQWhCLENBQXJCO0FBQ0QsS0FMTSxNQUtBO0FBQ0wsWUFBTSxJQUFJSSxLQUFKLENBQVcsdUNBQXNDLEtBQUtKLFNBQVUsb0JBQWhFLENBQU47QUFDRDs7QUFFRCxXQUFPLElBQUlYLFFBQUosQ0FBYXFCLFlBQWIsQ0FBUDtBQUNEOztBQUVEZCxFQUFBQSxRQUFRLEdBQUk7QUFDVixRQUFJO0FBQ0YsYUFBTyxLQUFLYSxXQUFMLEdBQW1CYixRQUFuQixFQUFQO0FBQ0QsS0FGRCxDQUVFLE9BQU9tQixHQUFQLEVBQVk7QUFDWixhQUFRLFNBQVFBLEdBQUcsQ0FBQ0MsT0FBUSxHQUE1QjtBQUNEO0FBQ0Y7O0FBN0RTOzs7ZUFrRUdsQixLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuXG5jb25zdCBOU19QRVJfUyA9IDFlOTtcbmNvbnN0IE5TX1BFUl9NUyA9IDFlNjtcblxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIGR1cmF0aW9uLCBlbmNhcHN1bGF0aW5nIHRoZSBudW1iZXIgYW5kIHVuaXRzLlxuICovXG5jbGFzcyBEdXJhdGlvbiB7XG4gIGNvbnN0cnVjdG9yIChuYW5vcykge1xuICAgIHRoaXMuX25hbm9zID0gbmFub3M7XG4gIH1cblxuICBnZXQgbmFub3MgKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW5vcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGR1cmF0aW9uIGFzIG5hbm9zZWNvbmRzXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBkdXJhdGlvbiBhcyBuYW5vc2Vjb25kc1xuICAgKi9cbiAgZ2V0IGFzTmFub1NlY29uZHMgKCkge1xuICAgIHJldHVybiB0aGlzLm5hbm9zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZHVyYXRpb24gY29udmVydGVkIGludG8gbWlsbGlzZWNvbmRzXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBkdXJhdGlvbiBhcyBtaWxsaXNlY29uZHNcbiAgICovXG4gIGdldCBhc01pbGxpU2Vjb25kcyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFub3MgLyBOU19QRVJfTVM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkdXJhdGlvbiBjb252ZXJ0ZWQgaW50byBzZWNvbmRzXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBkdXJhdGlvbiBmYXMgc2Vjb25kc1xuICAgKi9cbiAgZ2V0IGFzU2Vjb25kcyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFub3MgLyBOU19QRVJfUztcbiAgfVxuXG4gIHRvU3RyaW5nICgpIHtcbiAgICAvLyBkZWZhdWx0IHRvIG1pbGxpc2Vjb25kcywgcm91bmRlZFxuICAgIHJldHVybiB0aGlzLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCk7XG4gIH1cbn1cblxuY2xhc3MgVGltZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHRpbWVyXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gbnVsbDtcbiAgfVxuXG4gIGdldCBzdGFydFRpbWUgKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGFydFRpbWU7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdGhlIHRpbWVyXG4gICAqXG4gICAqIEByZXR1cm4ge1RpbWVyfSBUaGUgY3VycmVudCBpbnN0YW5jZSwgZm9yIGNoYWluaW5nXG4gICAqL1xuICBzdGFydCAoKSB7XG4gICAgaWYgKCFfLmlzTnVsbCh0aGlzLnN0YXJ0VGltZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGltZXIgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkLicpO1xuICAgIH1cbiAgICAvLyBvbmNlIE5vZGUgMTAgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCwgdGhpcyBjaGVjayBjYW4gYmUgcmVtb3ZlZFxuICAgIHRoaXMuX3N0YXJ0VGltZSA9IF8uaXNGdW5jdGlvbihwcm9jZXNzLmhydGltZS5iaWdpbnQpXG4gICAgICA/IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpXG4gICAgICA6IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkdXJhdGlvbiBzaW5jZSB0aGUgdGltZXIgd2FzIHN0YXJ0ZWRcbiAgICpcbiAgICogQHJldHVybiB7RHVyYXRpb259IHRoZSBkdXJhdGlvblxuICAgKi9cbiAgZ2V0RHVyYXRpb24gKCkge1xuICAgIGlmIChfLmlzTnVsbCh0aGlzLnN0YXJ0VGltZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGdldCBkdXJhdGlvbi4gVGltZXIgd2FzIG5vdCBzdGFydGVkYCk7XG4gICAgfVxuXG4gICAgbGV0IG5hbm9EdXJhdGlvbjtcbiAgICBpZiAoXy5pc0FycmF5KHRoaXMuc3RhcnRUaW1lKSkge1xuICAgICAgLy8gc3RhcnRUaW1lIHdhcyBjcmVhdGVkIHVzaW5nIHByb2Nlc3MuaHJ0aW1lKClcbiAgICAgIGNvbnN0IFtzZWNvbmRzLCBuYW5vc10gPSBwcm9jZXNzLmhydGltZSh0aGlzLnN0YXJ0VGltZSk7XG4gICAgICBuYW5vRHVyYXRpb24gPSBzZWNvbmRzICogTlNfUEVSX1MgKyBuYW5vcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnN0YXJ0VGltZSA9PT0gJ2JpZ2ludCcgJiYgXy5pc0Z1bmN0aW9uKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCkpIHtcbiAgICAgIC8vIHN0YXJ0VGltZSB3YXMgY3JlYXRlZCB1c2luZyBwcm9jZXNzLmhydGltZS5iaWdpbnQoKVxuICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpO1xuICAgICAgLy8gZ2V0IHRoZSBkaWZmZXJlbmNlLCBhbmQgY29udmVydCB0byBudW1iZXJcbiAgICAgIG5hbm9EdXJhdGlvbiA9IE51bWJlcihlbmRUaW1lIC0gdGhpcy5zdGFydFRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBnZXQgZHVyYXRpb24uIFN0YXJ0IHRpbWUgJyR7dGhpcy5zdGFydFRpbWV9JyBjYW5ub3QgYmUgcGFyc2VkYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEdXJhdGlvbihuYW5vRHVyYXRpb24pO1xuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXREdXJhdGlvbigpLnRvU3RyaW5nKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gYDxlcnI6ICR7ZXJyLm1lc3NhZ2V9PmA7XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IHsgVGltZXIsIER1cmF0aW9uIH07XG5leHBvcnQgZGVmYXVsdCBUaW1lcjtcbiJdLCJmaWxlIjoibGliL3RpbWluZy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
96
+ exports.default = _default;
97
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi90aW1pbmcuanMiXSwibmFtZXMiOlsiTlNfUEVSX1MiLCJOU19QRVJfTVMiLCJEdXJhdGlvbiIsImNvbnN0cnVjdG9yIiwibmFub3MiLCJfbmFub3MiLCJhc05hbm9TZWNvbmRzIiwiYXNNaWxsaVNlY29uZHMiLCJhc1NlY29uZHMiLCJ0b1N0cmluZyIsInRvRml4ZWQiLCJUaW1lciIsIl9zdGFydFRpbWUiLCJzdGFydFRpbWUiLCJzdGFydCIsIl8iLCJpc051bGwiLCJFcnJvciIsImlzRnVuY3Rpb24iLCJwcm9jZXNzIiwiaHJ0aW1lIiwiYmlnaW50IiwiZ2V0RHVyYXRpb24iLCJuYW5vRHVyYXRpb24iLCJpc0FycmF5Iiwic2Vjb25kcyIsImVuZFRpbWUiLCJOdW1iZXIiLCJlcnIiLCJtZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUdBLE1BQU1BLFFBQVEsR0FBRyxHQUFqQjtBQUNBLE1BQU1DLFNBQVMsR0FBRyxHQUFsQjs7QUFNQSxNQUFNQyxRQUFOLENBQWU7QUFDYkMsRUFBQUEsV0FBVyxDQUFFQyxLQUFGLEVBQVM7QUFDbEIsU0FBS0MsTUFBTCxHQUFjRCxLQUFkO0FBQ0Q7O0FBRVEsTUFBTEEsS0FBSyxHQUFJO0FBQ1gsV0FBTyxLQUFLQyxNQUFaO0FBQ0Q7O0FBT2dCLE1BQWJDLGFBQWEsR0FBSTtBQUNuQixXQUFPLEtBQUtGLEtBQVo7QUFDRDs7QUFPaUIsTUFBZEcsY0FBYyxHQUFJO0FBQ3BCLFdBQU8sS0FBS0gsS0FBTCxHQUFhSCxTQUFwQjtBQUNEOztBQU9ZLE1BQVRPLFNBQVMsR0FBSTtBQUNmLFdBQU8sS0FBS0osS0FBTCxHQUFhSixRQUFwQjtBQUNEOztBQUVEUyxFQUFBQSxRQUFRLEdBQUk7QUFFVixXQUFPLEtBQUtGLGNBQUwsQ0FBb0JHLE9BQXBCLENBQTRCLENBQTVCLENBQVA7QUFDRDs7QUF2Q1k7Ozs7QUEwQ2YsTUFBTUMsS0FBTixDQUFZO0FBSVZSLEVBQUFBLFdBQVcsR0FBSTtBQUNiLFNBQUtTLFVBQUwsR0FBa0IsSUFBbEI7QUFDRDs7QUFFWSxNQUFUQyxTQUFTLEdBQUk7QUFDZixXQUFPLEtBQUtELFVBQVo7QUFDRDs7QUFPREUsRUFBQUEsS0FBSyxHQUFJO0FBQ1AsUUFBSSxDQUFDQyxnQkFBRUMsTUFBRixDQUFTLEtBQUtILFNBQWQsQ0FBTCxFQUErQjtBQUM3QixZQUFNLElBQUlJLEtBQUosQ0FBVSxpQ0FBVixDQUFOO0FBQ0Q7O0FBRUQsU0FBS0wsVUFBTCxHQUFrQkcsZ0JBQUVHLFVBQUYsQ0FBYUMsT0FBTyxDQUFDQyxNQUFSLENBQWVDLE1BQTVCLElBQ2RGLE9BQU8sQ0FBQ0MsTUFBUixDQUFlQyxNQUFmLEVBRGMsR0FFZEYsT0FBTyxDQUFDQyxNQUFSLEVBRko7QUFHQSxXQUFPLElBQVA7QUFDRDs7QUFPREUsRUFBQUEsV0FBVyxHQUFJO0FBQ2IsUUFBSVAsZ0JBQUVDLE1BQUYsQ0FBUyxLQUFLSCxTQUFkLENBQUosRUFBOEI7QUFDNUIsWUFBTSxJQUFJSSxLQUFKLENBQVcsK0NBQVgsQ0FBTjtBQUNEOztBQUVELFFBQUlNLFlBQUo7O0FBQ0EsUUFBSVIsZ0JBQUVTLE9BQUYsQ0FBVSxLQUFLWCxTQUFmLENBQUosRUFBK0I7QUFFN0IsWUFBTSxDQUFDWSxPQUFELEVBQVVyQixLQUFWLElBQW1CZSxPQUFPLENBQUNDLE1BQVIsQ0FBZSxLQUFLUCxTQUFwQixDQUF6QjtBQUNBVSxNQUFBQSxZQUFZLEdBQUdFLE9BQU8sR0FBR3pCLFFBQVYsR0FBcUJJLEtBQXBDO0FBQ0QsS0FKRCxNQUlPLElBQUksT0FBTyxLQUFLUyxTQUFaLEtBQTBCLFFBQTFCLElBQXNDRSxnQkFBRUcsVUFBRixDQUFhQyxPQUFPLENBQUNDLE1BQVIsQ0FBZUMsTUFBNUIsQ0FBMUMsRUFBK0U7QUFFcEYsWUFBTUssT0FBTyxHQUFHUCxPQUFPLENBQUNDLE1BQVIsQ0FBZUMsTUFBZixFQUFoQjtBQUVBRSxNQUFBQSxZQUFZLEdBQUdJLE1BQU0sQ0FBQ0QsT0FBTyxHQUFHLEtBQUtiLFNBQWhCLENBQXJCO0FBQ0QsS0FMTSxNQUtBO0FBQ0wsWUFBTSxJQUFJSSxLQUFKLENBQVcsdUNBQXNDLEtBQUtKLFNBQVUsb0JBQWhFLENBQU47QUFDRDs7QUFFRCxXQUFPLElBQUlYLFFBQUosQ0FBYXFCLFlBQWIsQ0FBUDtBQUNEOztBQUVEZCxFQUFBQSxRQUFRLEdBQUk7QUFDVixRQUFJO0FBQ0YsYUFBTyxLQUFLYSxXQUFMLEdBQW1CYixRQUFuQixFQUFQO0FBQ0QsS0FGRCxDQUVFLE9BQU9tQixHQUFQLEVBQVk7QUFDWixhQUFRLFNBQVFBLEdBQUcsQ0FBQ0MsT0FBUSxHQUE1QjtBQUNEO0FBQ0Y7O0FBN0RTOzs7ZUFrRUdsQixLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuXG5jb25zdCBOU19QRVJfUyA9IDFlOTtcbmNvbnN0IE5TX1BFUl9NUyA9IDFlNjtcblxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIGR1cmF0aW9uLCBlbmNhcHN1bGF0aW5nIHRoZSBudW1iZXIgYW5kIHVuaXRzLlxuICovXG5jbGFzcyBEdXJhdGlvbiB7XG4gIGNvbnN0cnVjdG9yIChuYW5vcykge1xuICAgIHRoaXMuX25hbm9zID0gbmFub3M7XG4gIH1cblxuICBnZXQgbmFub3MgKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW5vcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGR1cmF0aW9uIGFzIG5hbm9zZWNvbmRzXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBkdXJhdGlvbiBhcyBuYW5vc2Vjb25kc1xuICAgKi9cbiAgZ2V0IGFzTmFub1NlY29uZHMgKCkge1xuICAgIHJldHVybiB0aGlzLm5hbm9zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZHVyYXRpb24gY29udmVydGVkIGludG8gbWlsbGlzZWNvbmRzXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBkdXJhdGlvbiBhcyBtaWxsaXNlY29uZHNcbiAgICovXG4gIGdldCBhc01pbGxpU2Vjb25kcyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFub3MgLyBOU19QRVJfTVM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkdXJhdGlvbiBjb252ZXJ0ZWQgaW50byBzZWNvbmRzXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBkdXJhdGlvbiBmYXMgc2Vjb25kc1xuICAgKi9cbiAgZ2V0IGFzU2Vjb25kcyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFub3MgLyBOU19QRVJfUztcbiAgfVxuXG4gIHRvU3RyaW5nICgpIHtcbiAgICAvLyBkZWZhdWx0IHRvIG1pbGxpc2Vjb25kcywgcm91bmRlZFxuICAgIHJldHVybiB0aGlzLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCk7XG4gIH1cbn1cblxuY2xhc3MgVGltZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHRpbWVyXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gbnVsbDtcbiAgfVxuXG4gIGdldCBzdGFydFRpbWUgKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGFydFRpbWU7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdGhlIHRpbWVyXG4gICAqXG4gICAqIEByZXR1cm4ge1RpbWVyfSBUaGUgY3VycmVudCBpbnN0YW5jZSwgZm9yIGNoYWluaW5nXG4gICAqL1xuICBzdGFydCAoKSB7XG4gICAgaWYgKCFfLmlzTnVsbCh0aGlzLnN0YXJ0VGltZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGltZXIgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkLicpO1xuICAgIH1cbiAgICAvLyBvbmNlIE5vZGUgMTAgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCwgdGhpcyBjaGVjayBjYW4gYmUgcmVtb3ZlZFxuICAgIHRoaXMuX3N0YXJ0VGltZSA9IF8uaXNGdW5jdGlvbihwcm9jZXNzLmhydGltZS5iaWdpbnQpXG4gICAgICA/IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpXG4gICAgICA6IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkdXJhdGlvbiBzaW5jZSB0aGUgdGltZXIgd2FzIHN0YXJ0ZWRcbiAgICpcbiAgICogQHJldHVybiB7RHVyYXRpb259IHRoZSBkdXJhdGlvblxuICAgKi9cbiAgZ2V0RHVyYXRpb24gKCkge1xuICAgIGlmIChfLmlzTnVsbCh0aGlzLnN0YXJ0VGltZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGdldCBkdXJhdGlvbi4gVGltZXIgd2FzIG5vdCBzdGFydGVkYCk7XG4gICAgfVxuXG4gICAgbGV0IG5hbm9EdXJhdGlvbjtcbiAgICBpZiAoXy5pc0FycmF5KHRoaXMuc3RhcnRUaW1lKSkge1xuICAgICAgLy8gc3RhcnRUaW1lIHdhcyBjcmVhdGVkIHVzaW5nIHByb2Nlc3MuaHJ0aW1lKClcbiAgICAgIGNvbnN0IFtzZWNvbmRzLCBuYW5vc10gPSBwcm9jZXNzLmhydGltZSh0aGlzLnN0YXJ0VGltZSk7XG4gICAgICBuYW5vRHVyYXRpb24gPSBzZWNvbmRzICogTlNfUEVSX1MgKyBuYW5vcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnN0YXJ0VGltZSA9PT0gJ2JpZ2ludCcgJiYgXy5pc0Z1bmN0aW9uKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCkpIHtcbiAgICAgIC8vIHN0YXJ0VGltZSB3YXMgY3JlYXRlZCB1c2luZyBwcm9jZXNzLmhydGltZS5iaWdpbnQoKVxuICAgICAgY29uc3QgZW5kVGltZSA9IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpO1xuICAgICAgLy8gZ2V0IHRoZSBkaWZmZXJlbmNlLCBhbmQgY29udmVydCB0byBudW1iZXJcbiAgICAgIG5hbm9EdXJhdGlvbiA9IE51bWJlcihlbmRUaW1lIC0gdGhpcy5zdGFydFRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBnZXQgZHVyYXRpb24uIFN0YXJ0IHRpbWUgJyR7dGhpcy5zdGFydFRpbWV9JyBjYW5ub3QgYmUgcGFyc2VkYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEdXJhdGlvbihuYW5vRHVyYXRpb24pO1xuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXREdXJhdGlvbigpLnRvU3RyaW5nKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gYDxlcnI6ICR7ZXJyLm1lc3NhZ2V9PmA7XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IHsgVGltZXIsIER1cmF0aW9uIH07XG5leHBvcnQgZGVmYXVsdCBUaW1lcjtcbiJdfQ==
@@ -0,0 +1,183 @@
1
+ export function hasContent(val: any): boolean;
2
+ export type PluralizeOptions = {
3
+ /**
4
+ * - Whether to prefix with the number (e.g., 3 ducks)
5
+ */
6
+ inclusive?: boolean | undefined;
7
+ };
8
+ export type EncodingOptions = {
9
+ /**
10
+ * The maximum size of
11
+ * the resulting buffer in bytes. This is set to 1GB by default, because
12
+ * Appium limits the maximum HTTP body size to 1GB. Also, the NodeJS heap
13
+ * size must be enough to keep the resulting object (usually this size is
14
+ * limited to 1.4 GB)
15
+ */
16
+ maxSize?: number | undefined;
17
+ };
18
+ export type LockFileOptions = {
19
+ /**
20
+ * The max time in seconds to wait for the lock
21
+ */
22
+ timeout?: number | undefined;
23
+ /**
24
+ * Whether to try lock recovery if
25
+ * the first attempt to acquire it timed out.
26
+ */
27
+ tryRecovery?: boolean | undefined;
28
+ };
29
+ export function hasValue(val: any): boolean;
30
+ export function escapeSpace(str: any): any;
31
+ export function escapeSpecialChars(str: any, quoteEscape: any): any;
32
+ export function localIp(): any;
33
+ export function cancellableDelay(ms: any): B<any>;
34
+ export function multiResolve(roots: any, ...args: any[]): any;
35
+ export function safeJsonParse(obj: any): any;
36
+ export function wrapElement(elementId: any): {
37
+ ELEMENT: any;
38
+ "element-6066-11e4-a52e-4f735466cecf": any;
39
+ };
40
+ export function unwrapElement(el: any): any;
41
+ export function filterObject(obj: any, predicate: any): any;
42
+ /**
43
+ * Converts number of bytes to a readable size string.
44
+ *
45
+ * @param {number|string} bytes - The actual number of bytes.
46
+ * @returns {string} The actual string representation, for example
47
+ * '1.00 KB' for '1024 B'
48
+ * @throws {Error} If bytes count cannot be converted to an integer or
49
+ * if it is less than zero.
50
+ */
51
+ export function toReadableSizeString(bytes: number | string): string;
52
+ /**
53
+ * Checks whether the given path is a subpath of the
54
+ * particular root folder. Both paths can include .. and . specifiers
55
+ *
56
+ * @param {string} originalPath The absolute file/folder path
57
+ * @param {string} root The absolute root folder path
58
+ * @param {?boolean} forcePosix Set it to true if paths must be interpreted in POSIX format
59
+ * @returns {boolean} true if the given original path is the subpath of the root folder
60
+ * @throws {Error} if any of the given paths is not absolute
61
+ */
62
+ export function isSubPath(originalPath: string, root: string, forcePosix?: boolean | null): boolean;
63
+ export const W3C_WEB_ELEMENT_IDENTIFIER: "element-6066-11e4-a52e-4f735466cecf";
64
+ /**
65
+ * Checks whether the given paths are pointing to the same file system
66
+ * destination.
67
+ *
68
+ * @param {string} path1 - Absolute or relative path to a file/folder
69
+ * @param {string} path2 - Absolute or relative path to a file/folder
70
+ * @param {...string} pathN - Zero or more absolute or relative paths to files/folders
71
+ * @returns {Promise<boolean>} true if all paths are pointing to the same file system item
72
+ */
73
+ export function isSameDestination(path1: string, path2: string, ...pathN: string[]): Promise<boolean>;
74
+ /**
75
+ * Compares two version strings
76
+ *
77
+ * @param {string} ver1 - The first version number to compare. Should be a valid
78
+ * version number supported by semver parser.
79
+ * @param {string} ver2 - The second version number to compare. Should be a valid
80
+ * version number supported by semver parser.
81
+ * @param {string} operator - One of supported version number operators:
82
+ * ==, !=, >, <, <=, >=, =
83
+ * @returns {boolean} true or false depending on the actual comparison result
84
+ * @throws {Error} if an unsupported operator is supplied or any of the supplied
85
+ * version strings cannot be coerced
86
+ */
87
+ export function compareVersions(ver1: string, operator: string, ver2: string): boolean;
88
+ /**
89
+ * Coerces the given number/string to a valid version string
90
+ *
91
+ * @template {boolean} [Strict=true]
92
+ * @param {string} ver - Version string to coerce
93
+ * @param {Strict} [strict] - If `true` then an exception will be thrown
94
+ * if `ver` cannot be coerced
95
+ * @returns {Strict extends true ? string : string|null} Coerced version number or null if the string cannot be
96
+ * coerced and strict mode is disabled
97
+ * @throws {Error} if strict mode is enabled and `ver` cannot be coerced
98
+ */
99
+ export function coerceVersion<Strict extends boolean = true>(ver: string, strict?: Strict | undefined): Strict extends true ? string : string | null;
100
+ /**
101
+ * Add appropriate quotes to command arguments. See https://github.com/substack/node-shell-quote
102
+ * for more details
103
+ *
104
+ * @param {string|string[]} args - The arguments that will be parsed
105
+ * @returns {string} - The arguments, quoted
106
+ */
107
+ export function quote(args: string | string[]): string;
108
+ /**
109
+ * This function is necessary to workaround unexpected memory leaks
110
+ * caused by NodeJS string interning
111
+ * behavior described in https://bugs.chromium.org/p/v8/issues/detail?id=2869
112
+ *
113
+ * @param {*} s - The string to unleak
114
+ * @return {string} Either the unleaked string or the original object converted to string
115
+ */
116
+ export function unleakString(s: any): string;
117
+ export function jsonStringify(obj: any, replacer: any, space?: number): string;
118
+ /**
119
+ * @typedef PluralizeOptions
120
+ * @property {boolean} [inclusive=false] - Whether to prefix with the number (e.g., 3 ducks)
121
+ */
122
+ /**
123
+ * Get the form of a word appropriate to the count
124
+ *
125
+ * @param {string} word - The word to pluralize
126
+ * @param {number} count - How many of the word exist
127
+ * @param {PluralizeOptions|boolean} options - options for word pluralization,
128
+ * or a boolean indicating the options.inclusive property
129
+ * @returns {string} The word pluralized according to the number
130
+ */
131
+ export function pluralize(word: string, count: number, options?: PluralizeOptions | boolean): string;
132
+ export const GiB: number;
133
+ export const MiB: number;
134
+ export const KiB: 1024;
135
+ /**
136
+ * @typedef EncodingOptions
137
+ * @property {number} [maxSize=1073741824] The maximum size of
138
+ * the resulting buffer in bytes. This is set to 1GB by default, because
139
+ * Appium limits the maximum HTTP body size to 1GB. Also, the NodeJS heap
140
+ * size must be enough to keep the resulting object (usually this size is
141
+ * limited to 1.4 GB)
142
+ */
143
+ /**
144
+ * Converts contents of a local file to an in-memory base-64 encoded buffer.
145
+ * The operation is memory-usage friendly and should be used while encoding
146
+ * large files to base64
147
+ *
148
+ * @param {string} srcPath The full path to the file being encoded
149
+ * @param {EncodingOptions} opts
150
+ * @returns {Promise<Buffer>} base64-encoded content of the source file as memory buffer
151
+ * @throws {Error} if there was an error while reading the source file
152
+ * or the source file is too
153
+ */
154
+ export function toInMemoryBase64(srcPath: string, opts?: EncodingOptions): Promise<Buffer>;
155
+ import { v1 as uuidV1 } from "uuid";
156
+ import { v3 as uuidV3 } from "uuid";
157
+ import { v4 as uuidV4 } from "uuid";
158
+ import { v5 as uuidV5 } from "uuid";
159
+ import { parse as shellParse } from "shell-quote";
160
+ /**
161
+ * @typedef LockFileOptions
162
+ * @property {number} [timeout=120] The max time in seconds to wait for the lock
163
+ * @property {boolean} [tryRecovery=false] Whether to try lock recovery if
164
+ * the first attempt to acquire it timed out.
165
+ */
166
+ /**
167
+ * Create an async function which, when called, will not proceed until a certain file is no
168
+ * longer present on the system. This allows for preventing concurrent behavior across processes
169
+ * using a known lockfile path.
170
+ *
171
+ * @template T
172
+ * @param {string} lockFile The full path to the file used for the lock
173
+ * @param {LockFileOptions} opts
174
+ * @returns async function that takes another async function defining the locked
175
+ * behavior
176
+ */
177
+ export function getLockFileGuard<T>(lockFile: string, opts?: LockFileOptions): {
178
+ (behavior: (...args: any[]) => T): Promise<T>;
179
+ check(): Promise<boolean>;
180
+ };
181
+ import B from "bluebird";
182
+ export { uuidV1, uuidV3, uuidV4, uuidV5, shellParse };
183
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../lib/util.js"],"names":[],"mappings":"AA6BA,8CAEC;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGD,4CAUC;AAGD,2CAEC;AAED,oEAsBC;AAED,+BAYC;AAMD,kDAoBC;AAED,8DAEC;AAKD,6CAOC;AAkDD;;;EAKC;AAdD,4CAOC;AAiBD,4DAgBC;AAED;;;;;;;;GAQG;AACH,4CANW,MAAM,GAAC,MAAM,GACX,MAAM,CAkBlB;AAED;;;;;;;;;GASG;AACH,wCANW,MAAM,QACN,MAAM,eACL,OAAO,UACN,OAAO,CAanB;AAxOD,+EAAyE;AA0OzE;;;;;;;;GAQG;AACH,yCALW,MAAM,SACN,MAAM,YACH,MAAM,KACP,QAAQ,OAAO,CAAC,CAiB5B;AAuBD;;;;;;;;;;;;GAYG;AACH,sCAVW,MAAM,YAIN,MAAM,QAFN,MAAM,GAIJ,OAAO,CAanB;AA3CD;;;;;;;;;;GAUG;AACH,kEAPW,MAAM,6EAahB;AA4BD;;;;;;GAMG;AACH,4BAHW,MAAM,GAAC,MAAM,EAAE,GACb,MAAM,CAIlB;AAED;;;;;;;GAOG;AACH,sCAFY,MAAM,CAIjB;AA/MD,+EAoBC;AA8LD;;;GAGG;AAEH;;;;;;;;GAQG;AACH,gCANW,MAAM,SACN,MAAM,YACN,gBAAgB,GAAC,OAAO,GAEtB,MAAM,CAYlB;AA9VD,yBAAuB;AADvB,yBAAuB;AADvB,uBAAiB;AAkWjB;;;;;;;GAOG;AAEH;;;;;;;;;;GAUG;AACH,0CANW,MAAM,SACN,eAAe,GACb,QAAQ,MAAM,CAAC,CA+C3B;;;;;;AAED;;;;;GAKG;AAEH;;;;;;;;;;GAUG;AACH,8CALW,MAAM,SACN,eAAe;yBAeH,GAAG,EAAE;;EAwC3B"}
package/build/lib/util.js CHANGED
@@ -229,18 +229,18 @@ function filterObject(obj, predicate) {
229
229
  }
230
230
 
231
231
  function toReadableSizeString(bytes) {
232
- const intBytes = parseInt(bytes, 10);
232
+ const intBytes = parseInt(String(bytes), 10);
233
233
 
234
234
  if (isNaN(intBytes) || intBytes < 0) {
235
235
  throw new Error(`Cannot convert '${bytes}' to a readable size format`);
236
236
  }
237
237
 
238
238
  if (intBytes >= GiB) {
239
- return `${parseFloat(intBytes / (GiB * 1.0)).toFixed(2)} GB`;
239
+ return `${(intBytes / (GiB * 1.0)).toFixed(2)} GB`;
240
240
  } else if (intBytes >= MiB) {
241
- return `${parseFloat(intBytes / (MiB * 1.0)).toFixed(2)} MB`;
241
+ return `${(intBytes / (MiB * 1.0)).toFixed(2)} MB`;
242
242
  } else if (intBytes >= KiB) {
243
- return `${parseFloat(intBytes / (KiB * 1.0)).toFixed(2)} KB`;
243
+ return `${(intBytes / (KiB * 1.0)).toFixed(2)} KB`;
244
244
  }
245
245
 
246
246
  return `${intBytes} B`;
@@ -273,13 +273,9 @@ async function isSameDestination(path1, path2, ...pathN) {
273
273
  return true;
274
274
  }
275
275
 
276
- let mapCb = async x => await _fs.default.stat(x, {
276
+ let mapCb = async x => (await _fs.default.stat(x, {
277
277
  bigint: true
278
- }).ino;
279
-
280
- if (_semver.default.lt(process.version, '10.5.0')) {
281
- mapCb = async x => await _fs.default.stat(x).ino;
282
- }
278
+ })).ino;
283
279
 
284
280
  return areAllItemsEqual(await _bluebird.default.map(allPaths, mapCb));
285
281
  }
@@ -309,7 +305,7 @@ function compareVersions(ver1, operator, ver2) {
309
305
  }
310
306
 
311
307
  function quote(args) {
312
- return (0, _shellQuote.quote)(args);
308
+ return (0, _shellQuote.quote)(_lodash.default.castArray(args));
313
309
  }
314
310
 
315
311
  function unleakString(s) {
@@ -421,7 +417,5 @@ function getLockFileGuard(lockFile, opts = {}) {
421
417
  guard.check = async () => await check(lockFile);
422
418
 
423
419
  return guard;
424
- }require('source-map-support').install();
425
-
426
-
427
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlsLmpzIl0sIm5hbWVzIjpbIlczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSIiwiS2lCIiwiTWlCIiwiR2lCIiwiaGFzQ29udGVudCIsInZhbCIsIl8iLCJpc1N0cmluZyIsImhhc1ZhbHVlIiwiaGFzVmFsIiwiaXNOdW1iZXIiLCJpc05hTiIsImlzVW5kZWZpbmVkIiwiaXNOdWxsIiwiZXNjYXBlU3BhY2UiLCJzdHIiLCJzcGxpdCIsImpvaW4iLCJlc2NhcGVTcGVjaWFsQ2hhcnMiLCJxdW90ZUVzY2FwZSIsInJlcGxhY2UiLCJyZSIsIlJlZ0V4cCIsImxvY2FsSXAiLCJpcCIsImNoYWluIiwib3MiLCJuZXR3b3JrSW50ZXJmYWNlcyIsInZhbHVlcyIsImZsYXR0ZW4iLCJmaWx0ZXIiLCJmYW1pbHkiLCJpbnRlcm5hbCIsIm1hcCIsImZpcnN0IiwidmFsdWUiLCJjYW5jZWxsYWJsZURlbGF5IiwibXMiLCJ0aW1lciIsInJlc29sdmUiLCJyZWplY3QiLCJkZWxheSIsIkIiLCJQcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0Iiwic2V0VGltZW91dCIsImNhbmNlbCIsImNsZWFyVGltZW91dCIsIkNhbmNlbGxhdGlvbkVycm9yIiwibXVsdGlSZXNvbHZlIiwicm9vdHMiLCJhcmdzIiwicm9vdCIsInBhdGgiLCJzYWZlSnNvblBhcnNlIiwib2JqIiwiSlNPTiIsInBhcnNlIiwiaWduIiwianNvblN0cmluZ2lmeSIsInJlcGxhY2VyIiwic3BhY2UiLCJpc0Z1bmN0aW9uIiwiayIsInYiLCJidWZmZXJUb0pTT04iLCJCdWZmZXIiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJzdHJpbmdpZnkiLCJrZXkiLCJ1cGRhdGVkVmFsdWUiLCJpc0J1ZmZlciIsInRvU3RyaW5nIiwidW53cmFwRWxlbWVudCIsImVsIiwicHJvcE5hbWUiLCJoYXMiLCJ3cmFwRWxlbWVudCIsImVsZW1lbnRJZCIsIkVMRU1FTlQiLCJmaWx0ZXJPYmplY3QiLCJwcmVkaWNhdGUiLCJuZXdPYmoiLCJjbG9uZSIsInZhbHVlUHJlZGljYXRlIiwiT2JqZWN0Iiwia2V5cyIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwiYnl0ZXMiLCJpbnRCeXRlcyIsInBhcnNlSW50IiwiRXJyb3IiLCJwYXJzZUZsb2F0IiwidG9GaXhlZCIsImlzU3ViUGF0aCIsIm9yaWdpbmFsUGF0aCIsImZvcmNlUG9zaXgiLCJwYXRoT2JqIiwicG9zaXgiLCJwIiwiaXNBYnNvbHV0ZSIsIm5vcm1hbGl6ZWRSb290Iiwibm9ybWFsaXplIiwibm9ybWFsaXplZFBhdGgiLCJzdGFydHNXaXRoIiwiaXNTYW1lRGVzdGluYXRpb24iLCJwYXRoMSIsInBhdGgyIiwicGF0aE4iLCJhbGxQYXRocyIsInJlZHVjZSIsImEiLCJiIiwiZnMiLCJleGlzdHMiLCJhcmVBbGxJdGVtc0VxdWFsIiwiYXJyIiwiTmFOIiwibWFwQ2IiLCJ4Iiwic3RhdCIsImJpZ2ludCIsImlubyIsInNlbXZlciIsImx0IiwicHJvY2VzcyIsInZlcnNpb24iLCJjb2VyY2VWZXJzaW9uIiwidmVyIiwic3RyaWN0IiwicmVzdWx0IiwidmFsaWQiLCJjb2VyY2UiLCJTVVBQT1JURURfT1BFUkFUT1JTIiwiY29tcGFyZVZlcnNpb25zIiwidmVyMSIsIm9wZXJhdG9yIiwidmVyMiIsImluY2x1ZGVzIiwic2VtdmVyT3BlcmF0b3IiLCJzYXRpc2ZpZXMiLCJxdW90ZSIsInVubGVha1N0cmluZyIsInMiLCJzdWJzdHIiLCJwbHVyYWxpemUiLCJ3b3JkIiwiY291bnQiLCJvcHRpb25zIiwiaW5jbHVzaXZlIiwiaXNCb29sZWFuIiwidG9Jbk1lbW9yeUJhc2U2NCIsInNyY1BhdGgiLCJvcHRzIiwiaXNEaXJlY3RvcnkiLCJtYXhTaXplIiwicmVzdWx0QnVmZmVycyIsInJlc3VsdEJ1ZmZlcnNTaXplIiwicmVzdWx0V3JpdGVTdHJlYW0iLCJzdHJlYW0iLCJXcml0YWJsZSIsIndyaXRlIiwiYnVmZmVyIiwiZW5jb2RpbmciLCJuZXh0IiwicHVzaCIsImxlbmd0aCIsImVtaXQiLCJyZWFkZXJTdHJlYW0iLCJjcmVhdGVSZWFkU3RyZWFtIiwiYmFzZTY0RW5jb2RlclN0cmVhbSIsIkJhc2U2NEVuY29kZSIsInJlc3VsdFdyaXRlU3RyZWFtUHJvbWlzZSIsIm9uY2UiLCJlIiwidW5waXBlIiwiZGVzdHJveSIsInJlYWRTdHJlYW1Qcm9taXNlIiwibWVzc2FnZSIsInBpcGUiLCJhbGwiLCJjb25jYXQiLCJnZXRMb2NrRmlsZUd1YXJkIiwibG9ja0ZpbGUiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJsb2NrIiwicHJvbWlzaWZ5IiwiX2xvY2tmaWxlIiwiY2hlY2siLCJ1bmxvY2siLCJndWFyZCIsImJlaGF2aW9yIiwidHJpZWRSZWNvdmVyeSIsImNoZWNrU3luYyIsIndhaXQiLCJsb2NrU3luYyIsInVubG9ja1N5bmMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUtBOztBQUNBOztBQUNBOztBQUNBOztBQUtBOztBQUdBLE1BQU1BLDBCQUEwQixHQUFHLHFDQUFuQzs7QUFDQSxNQUFNQyxHQUFHLEdBQUcsSUFBWjs7QUFDQSxNQUFNQyxHQUFHLEdBQUdELEdBQUcsR0FBRyxJQUFsQjs7QUFDQSxNQUFNRSxHQUFHLEdBQUdELEdBQUcsR0FBRyxJQUFsQjs7O0FBRU8sU0FBU0UsVUFBVCxDQUFxQkMsR0FBckIsRUFBMEI7QUFDL0IsU0FBT0MsZ0JBQUVDLFFBQUYsQ0FBV0YsR0FBWCxLQUFtQkEsR0FBRyxLQUFLLEVBQWxDO0FBQ0Q7O0FBR0QsU0FBU0csUUFBVCxDQUFtQkgsR0FBbkIsRUFBd0I7QUFDdEIsTUFBSUksTUFBTSxHQUFHLEtBQWI7O0FBRUEsTUFBSUgsZ0JBQUVJLFFBQUYsQ0FBV0wsR0FBWCxDQUFKLEVBQXFCO0FBQ25CSSxJQUFBQSxNQUFNLEdBQUcsQ0FBQ0gsZ0JBQUVLLEtBQUYsQ0FB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QiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJy4vZnMnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHtcbiAgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvc2hlbGwtcXVvdGVcbiAgcXVvdGUgYXMgc2hlbGxRdW90ZSxcbiAgcGFyc2UgYXMgc2hlbGxQYXJzZSxcbn0gZnJvbSAnc2hlbGwtcXVvdGUnO1xuaW1wb3J0IHBsdXJhbGl6ZUxpYiBmcm9tICdwbHVyYWxpemUnO1xuaW1wb3J0IHN0cmVhbSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgQmFzZTY0RW5jb2RlIH0gZnJvbSAnYmFzZTY0LXN0cmVhbSc7XG5pbXBvcnQge1xuICAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS91dWlkXG4gIHYxIGFzIHV1aWRWMSwgdjMgYXMgdXVpZFYzLFxuICB2NCBhcyB1dWlkVjQsIHY1IGFzIHV1aWRWNVxufSBmcm9tICd1dWlkJztcbmltcG9ydCBfbG9ja2ZpbGUgZnJvbSAnbG9ja2ZpbGUnO1xuXG5cbmNvbnN0IFczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSID0gJ2VsZW1lbnQtNjA2Ni0xMWU0LWE1MmUtNGY3MzU0NjZjZWNmJztcbmNvbnN0IEtpQiA9IDEwMjQ7XG5jb25zdCBNaUIgPSBLaUIgKiAxMDI0O1xuY29uc3QgR2lCID0gTWlCICogMTAyNDtcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0NvbnRlbnQgKHZhbCkge1xuICByZXR1cm4gXy5pc1N0cmluZyh2YWwpICYmIHZhbCAhPT0gJyc7XG59XG5cbi8vIHJldHVybiB0cnVlIGlmIHRoZSB0aGUgdmFsdWUgaXMgbm90IHVuZGVmaW5lZCwgbnVsbCwgb3IgTmFOLlxuZnVuY3Rpb24gaGFzVmFsdWUgKHZhbCkge1xuICBsZXQgaGFzVmFsID0gZmFsc2U7XG4gIC8vIGF2b2lkIGluY29ycmVjdGx5IGV2YWx1YXRpbmcgYDBgIGFzIGZhbHNlXG4gIGlmIChfLmlzTnVtYmVyKHZhbCkpIHtcbiAgICBoYXNWYWwgPSAhXy5pc05hTih2YWwpO1xuICB9IGVsc2Uge1xuICAgIGhhc1ZhbCA9ICFfLmlzVW5kZWZpbmVkKHZhbCkgJiYgIV8uaXNOdWxsKHZhbCk7XG4gIH1cblxuICByZXR1cm4gaGFzVmFsO1xufVxuXG4vLyBlc2NhcGUgc3BhY2VzIGluIHN0cmluZywgZm9yIGNvbW1hbmRsaW5lIGNhbGxzXG5mdW5jdGlvbiBlc2NhcGVTcGFjZSAoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoLyAvKS5qb2luKCdcXFxcICcpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVTcGVjaWFsQ2hhcnMgKHN0ciwgcXVvdGVFc2NhcGUpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBpZiAodHlwZW9mIHF1b3RlRXNjYXBlID09PSAndW5kZWZpbmVkJykge1xuICAgIHF1b3RlRXNjYXBlID0gZmFsc2U7XG4gIH1cbiAgc3RyID0gc3RyXG4gICAgLnJlcGxhY2UoL1tcXFxcXS9nLCAnXFxcXFxcXFwnKVxuICAgIC5yZXBsYWNlKC9bXFwvXS9nLCAnXFxcXC8nKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgLnJlcGxhY2UoL1tcXGJdL2csICdcXFxcYicpXG4gICAgLnJlcGxhY2UoL1tcXGZdL2csICdcXFxcZicpXG4gICAgLnJlcGxhY2UoL1tcXG5dL2csICdcXFxcbicpXG4gICAgLnJlcGxhY2UoL1tcXHJdL2csICdcXFxccicpXG4gICAgLnJlcGxhY2UoL1tcXHRdL2csICdcXFxcdCcpXG4gICAgLnJlcGxhY2UoL1tcXFwiXS9nLCAnXFxcXFwiJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICAgIC5yZXBsYWNlKC9cXFxcJy9nLCBcIlxcXFwnXCIpO1xuICBpZiAocXVvdGVFc2NhcGUpIHtcbiAgICBsZXQgcmUgPSBuZXcgUmVnRXhwKHF1b3RlRXNjYXBlLCAnZycpO1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKHJlLCBgXFxcXCR7cXVvdGVFc2NhcGV9YCk7XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gbG9jYWxJcCAoKSB7XG4gIGxldCBpcCA9IF8uY2hhaW4ob3MubmV0d29ya0ludGVyZmFjZXMoKSlcbiAgICAudmFsdWVzKClcbiAgICAuZmxhdHRlbigpXG4gICAgLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gKHZhbC5mYW1pbHkgPT09ICdJUHY0JyAmJiB2YWwuaW50ZXJuYWwgPT09IGZhbHNlKTtcbiAgICB9KVxuICAgIC5tYXAoJ2FkZHJlc3MnKVxuICAgIC5maXJzdCgpXG4gICAgLnZhbHVlKCk7XG4gIHJldHVybiBpcDtcbn1cblxuLypcbiAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgaXMgY2FuY2VsbGFibGUsIGFuZCB3aWxsIHRpbWVvdXRcbiAqIGFmdGVyIGBtc2AgZGVsYXlcbiAqL1xuZnVuY3Rpb24gY2FuY2VsbGFibGVEZWxheSAobXMpIHtcbiAgbGV0IHRpbWVyO1xuICBsZXQgcmVzb2x2ZTtcbiAgbGV0IHJlamVjdDtcblxuICBjb25zdCBkZWxheSA9IG5ldyBCLlByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgcmVzb2x2ZSA9IF9yZXNvbHZlO1xuICAgIHJlamVjdCA9IF9yZWplY3Q7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9LCBtcyk7XG4gIH0pO1xuXG4gIC8vIG92ZXJyaWRlIEJsdWViaXJkJ3MgYGNhbmNlbGAsIHdoaWNoIGRvZXMgbm90IHdvcmsgd2hlbiB1c2luZyBgYXdhaXRgIG9uXG4gIC8vIGEgcHJvbWlzZSwgc2luY2UgYHJlc29sdmVgL2ByZWplY3RgIGFyZSBuZXZlciBjYWxsZWRcbiAgZGVsYXkuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgcmVqZWN0KG5ldyBCLkNhbmNlbGxhdGlvbkVycm9yKCkpO1xuICB9O1xuICByZXR1cm4gZGVsYXk7XG59XG5cbmZ1bmN0aW9uIG11bHRpUmVzb2x2ZSAocm9vdHMsIC4uLmFyZ3MpIHtcbiAgcmV0dXJuIHJvb3RzLm1hcCgocm9vdCkgPT4gcGF0aC5yZXNvbHZlKHJvb3QsIC4uLmFyZ3MpKTtcbn1cblxuLypcbiAqIFBhcnNlcyBhbiBvYmplY3QgaWYgcG9zc2libGUuIE90aGVyd2lzZSByZXR1cm5zIHRoZSBvYmplY3Qgd2l0aG91dCBwYXJzaW5nLlxuICovXG5mdW5jdGlvbiBzYWZlSnNvblBhcnNlIChvYmopIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShvYmopO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICAvLyBpZ25vcmU6IHRoaXMgaXMgbm90IGpzb24gcGFyc2FibGVcbiAgICByZXR1cm4gb2JqO1xuICB9XG59XG5cbi8qXG4gKiBTdHJpbmdpZmllcyB0aGUgb2JqZWN0IHBhc3NlZCBpbiwgY29udmVydGluZyBCdWZmZXJzIGludG8gU3RyaW5ncyBmb3IgYmV0dGVyXG4gKiBkaXNwbGF5LiBUaGlzIG1pbWljcyBKU09OLnN0cmluZ2lmeSAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5KVxuICogZXhjZXB0IHRoZSBgcmVwbGFjZXJgIGFyZ3VtZW50IGNhbiBvbmx5IGJlIGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtIHs/ZnVuY3Rpb259IHJlcGxhY2VyIC0gZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBwcm9wZXJ0aWVzIGFkZGVkIHRvIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCBvYmplY3RcbiAqIEBwYXJhbSB7P251bWJlcnxzdHJpbmd9IHNwYWNlIC0gdXNlZCB0byBpbnNlcnQgd2hpdGUgc3BhY2UgaW50byB0aGUgb3V0cHV0IEpTT05cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvciByZWFkYWJpbGl0eSBwdXJwb3Nlcy4gRGVmYXVsdHMgdG8gMlxuICogcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBKU09OIG9iamVjdCBzZXJpYWxpemVkIGFzIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGpzb25TdHJpbmdpZnkgKG9iaiwgcmVwbGFjZXIsIHNwYWNlID0gMikge1xuICAvLyBpZiBubyByZXBsYWNlciBpcyBwYXNzZWQsIG9yIGl0IGlzIG5vdCBhIGZ1bmN0aW9uLCBqdXN0IHVzZSBhIHBhc3MtdGhyb3VnaFxuICBpZiAoIV8uaXNGdW5jdGlvbihyZXBsYWNlcikpIHtcbiAgICByZXBsYWNlciA9IChrLCB2KSA9PiB2O1xuICB9XG5cbiAgLy8gQnVmZmVycyBjYW5ub3QgYmUgc2VyaWFsaXplZCBpbiBhIHJlYWRhYmxlIHdheVxuICBjb25zdCBidWZmZXJUb0pTT04gPSBCdWZmZXIucHJvdG90eXBlLnRvSlNPTjtcbiAgZGVsZXRlIEJ1ZmZlci5wcm90b3R5cGUudG9KU09OO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkVmFsdWUgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpXG4gICAgICAgID8gdmFsdWUudG9TdHJpbmcoJ3V0ZjgnKVxuICAgICAgICA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHJlcGxhY2VyKGtleSwgdXBkYXRlZFZhbHVlKTtcbiAgICB9LCBzcGFjZSk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gcmVzdG9yZSB0aGUgZnVuY3Rpb24sIHNvIGFzIHRvIG5vdCBicmVhayBmdXJ0aGVyIHNlcmlhbGl6YXRpb25cbiAgICBCdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGJ1ZmZlclRvSlNPTjtcbiAgfVxufVxuXG4vKlxuICogUmVtb3ZlcyB0aGUgd3JhcHBlciBmcm9tIGVsZW1lbnQsIGlmIGl0IGV4aXN0cy5cbiAqICAgeyBFTEVNRU5UOiA0IH0gYmVjb21lcyA0XG4gKiAgIHsgZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2Y6IDUgfSBiZWNvbWVzIDVcbiAqL1xuZnVuY3Rpb24gdW53cmFwRWxlbWVudCAoZWwpIHtcbiAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVIsICdFTEVNRU5UJ10pIHtcbiAgICBpZiAoXy5oYXMoZWwsIHByb3BOYW1lKSkge1xuICAgICAgcmV0dXJuIGVsW3Byb3BOYW1lXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVsO1xufVxuXG5mdW5jdGlvbiB3cmFwRWxlbWVudCAoZWxlbWVudElkKSB7XG4gIHJldHVybiB7XG4gICAgRUxFTUVOVDogZWxlbWVudElkLFxuICAgIFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl06IGVsZW1lbnRJZCxcbiAgfTtcbn1cblxuLypcbiAqIFJldHVybnMgb2JqZWN0IGNvbnNpc3Rpbmcgb2YgYWxsIHByb3BlcnRpZXMgaW4gdGhlIG9yaWdpbmFsIGVsZW1lbnRcbiAqIHdoaWNoIHdlcmUgdHJ1dGh5IGdpdmVuIHRoZSBwcmVkaWNhdGUuXG4gKiBJZiB0aGUgcHJlZGljYXRlIGlzXG4gKiAgICogbWlzc2luZyAtIGl0IHdpbGwgcmVtb3ZlIGFsbCBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlcyBhcmUgYHVuZGVmaW5lZGBcbiAqICAgKiBhIHNjYWxhciAtIGl0IHdpbGwgdGVzdCBhbGwgcHJvcGVydGllcycgdmFsdWVzIGFnYWluc3QgdGhhdCB2YWx1ZVxuICogICAqIGEgZnVuY3Rpb24gLSBpdCB3aWxsIHBhc3MgZWFjaCB2YWx1ZSBhbmQgdGhlIG9yaWdpbmFsIG9iamVjdCBpbnRvIHRoZSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBmaWx0ZXJPYmplY3QgKG9iaiwgcHJlZGljYXRlKSB7XG4gIGxldCBuZXdPYmogPSBfLmNsb25lKG9iaik7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByZWRpY2F0ZSkpIHtcbiAgICAvLyByZW1vdmUgYW55IGVsZW1lbnQgZnJvbSB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgIHByZWRpY2F0ZSA9ICh2KSA9PiAhXy5pc1VuZGVmaW5lZCh2KTtcbiAgfSBlbHNlIGlmICghXy5pc0Z1bmN0aW9uKHByZWRpY2F0ZSkpIHtcbiAgICAvLyBtYWtlIHByZWRpY2F0ZSBpbnRvIGEgZnVuY3Rpb25cbiAgICBjb25zdCB2YWx1ZVByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICBwcmVkaWNhdGUgPSAodikgPT4gdiA9PT0gdmFsdWVQcmVkaWNhdGU7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGlmICghcHJlZGljYXRlKG9ialtrZXldLCBvYmopKSB7XG4gICAgICBkZWxldGUgbmV3T2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdPYmo7XG59XG5cbi8qKlxuICogQ29udmVydHMgbnVtYmVyIG9mIGJ5dGVzIHRvIGEgcmVhZGFibGUgc2l6ZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBieXRlcyAtIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGFjdHVhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGZvciBleGFtcGxlXG4gKiAgICAgICAgICAgICAgICAgICAnMS4wMCBLQicgZm9yICcxMDI0IEInXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYnl0ZXMgY291bnQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIG9yXG4gKiAgICAgICAgICAgICAgICAgaWYgaXQgaXMgbGVzcyB0aGFuIHplcm8uXG4gKi9cbmZ1bmN0aW9uIHRvUmVhZGFibGVTaXplU3RyaW5nIChieXRlcykge1xuICBjb25zdCBpbnRCeXRlcyA9IHBhcnNlSW50KGJ5dGVzLCAxMCk7XG4gIGlmIChpc05hTihpbnRCeXRlcykgfHwgaW50Qnl0ZXMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCAnJHtieXRlc30nIHRvIGEgcmVhZGFibGUgc2l6ZSBmb3JtYXRgKTtcbiAgfVxuICBpZiAoaW50Qnl0ZXMgPj0gR2lCKSB7XG4gICAgcmV0dXJuIGAke3BhcnNlRmxvYXQoaW50Qnl0ZXMgLyAoR2lCICogMS4wKSkudG9GaXhlZCgyKX0gR0JgO1xuICB9IGVsc2UgaWYgKGludEJ5dGVzID49IE1pQikge1xuICAgIHJldHVybiBgJHtwYXJzZUZsb2F0KGludEJ5dGVzIC8gKE1pQiAqIDEuMCkpLnRvRml4ZWQoMil9IE1CYDtcbiAgfSBlbHNlIGlmIChpbnRCeXRlcyA+PSBLaUIpIHtcbiAgICByZXR1cm4gYCR7cGFyc2VGbG9hdChpbnRCeXRlcyAvIChLaUIgKiAxLjApKS50b0ZpeGVkKDIpfSBLQmA7XG4gIH1cbiAgcmV0dXJuIGAke2ludEJ5dGVzfSBCYDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBhIHN1YnBhdGggb2YgdGhlXG4gKiBwYXJ0aWN1bGFyIHJvb3QgZm9sZGVyLiBCb3RoIHBhdGhzIGNhbiBpbmNsdWRlIC4uIGFuZCAuIHNwZWNpZmllcnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3JpZ2luYWxQYXRoIFRoZSBhYnNvbHV0ZSBmaWxlL2ZvbGRlciBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9vdCBUaGUgYWJzb2x1dGUgcm9vdCBmb2xkZXIgcGF0aFxuICogQHBhcmFtIHs/Ym9vbGVhbn0gZm9yY2VQb3NpeCBTZXQgaXQgdG8gdHJ1ZSBpZiBwYXRocyBtdXN0IGJlIGludGVycHJldGVkIGluIFBPU0lYIGZvcm1hdFxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGdpdmVuIG9yaWdpbmFsIHBhdGggaXMgdGhlIHN1YnBhdGggb2YgdGhlIHJvb3QgZm9sZGVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW55IG9mIHRoZSBnaXZlbiBwYXRocyBpcyBub3QgYWJzb2x1dGVcbiAqL1xuZnVuY3Rpb24gaXNTdWJQYXRoIChvcmlnaW5hbFBhdGgsIHJvb3QsIGZvcmNlUG9zaXggPSBudWxsKSB7XG4gIGNvbnN0IHBhdGhPYmogPSBmb3JjZVBvc2l4ID8gcGF0aC5wb3NpeCA6IHBhdGg7XG4gIGZvciAoY29uc3QgcCBvZiBbb3JpZ2luYWxQYXRoLCByb290XSkge1xuICAgIGlmICghcGF0aE9iai5pc0Fic29sdXRlKHApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3B9JyBpcyBleHBlY3RlZCB0byBiZSBhbiBhYnNvbHV0ZSBwYXRoYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWRSb290ID0gcGF0aE9iai5ub3JtYWxpemUocm9vdCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aE9iai5ub3JtYWxpemUob3JpZ2luYWxQYXRoKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgobm9ybWFsaXplZFJvb3QpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRocyBhcmUgcG9pbnRpbmcgdG8gdGhlIHNhbWUgZmlsZSBzeXN0ZW1cbiAqIGRlc3RpbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoMSAtIEFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggdG8gYSBmaWxlL2ZvbGRlclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGgyIC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byBhIGZpbGUvZm9sZGVyXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcGF0aE4gLSBaZXJvIG9yIG1vcmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aHMgdG8gZmlsZXMvZm9sZGVyc1xuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYWxsIHBhdGhzIGFyZSBwb2ludGluZyB0byB0aGUgc2FtZSBmaWxlIHN5c3RlbSBpdGVtXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzU2FtZURlc3RpbmF0aW9uIChwYXRoMSwgcGF0aDIsIC4uLnBhdGhOKSB7XG4gIGNvbnN0IGFsbFBhdGhzID0gW3BhdGgxLCBwYXRoMiwgLi4ucGF0aE5dO1xuICBpZiAoIWF3YWl0IEIucmVkdWNlKGFsbFBhdGhzLCBhc3luYyAoYSwgYikgPT4gYSAmJiBhd2FpdCBmcy5leGlzdHMoYiksIHRydWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgYXJlQWxsSXRlbXNFcXVhbCA9IChhcnIpID0+ICEhYXJyLnJlZHVjZSgoYSwgYikgPT4gYSA9PT0gYiA/IGEgOiBOYU4pO1xuICBpZiAoYXJlQWxsSXRlbXNFcXVhbChhbGxQYXRocykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE5vZGUgMTAuNS4wIGludHJvZHVjZWQgYmlnaW50IHN1cHBvcnQgaW4gc3RhdCwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIHByZWNpc2lvblxuICAvLyBob3dldmVyIGJlbG93IHRoYXQgdGhlIG9wdGlvbnMgZ2V0IGludGVycHJldGVkIGFzIHRoZSBjYWxsYmFja1xuICAvLyBUT0RPOiByZW1vdmUgd2hlbiBOb2RlIDEwIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWRcbiAgbGV0IG1hcENiID0gYXN5bmMgKHgpID0+IGF3YWl0IGZzLnN0YXQoeCwge1xuICAgIGJpZ2ludDogdHJ1ZSxcbiAgfSkuaW5vO1xuICBpZiAoc2VtdmVyLmx0KHByb2Nlc3MudmVyc2lvbiwgJzEwLjUuMCcpKSB7XG4gICAgbWFwQ2IgPSBhc3luYyAoeCkgPT4gYXdhaXQgZnMuc3RhdCh4KS5pbm87XG4gIH1cbiAgcmV0dXJuIGFyZUFsbEl0ZW1zRXF1YWwoYXdhaXQgQi5tYXAoYWxsUGF0aHMsIG1hcENiKSk7XG59XG5cbi8qKlxuICogQ29lcmNlcyB0aGUgZ2l2ZW4gbnVtYmVyL3N0cmluZyB0byBhIHZhbGlkIHZlcnNpb24gc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSB2ZXIgLSBWZXJzaW9uIHN0cmluZyB0byBjb2VyY2VcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc3RyaWN0IFt0cnVlXSAtIElmIHRydWUgdGhlbiBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd25cbiAqIGlmIGB2ZXJgIGNhbm5vdCBiZSBjb2VyY2VkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb2VyY2VkIHZlcnNpb24gbnVtYmVyIG9yIG51bGwgaWYgdGhlIHN0cmluZyBjYW5ub3QgYmVcbiAqIGNvZXJjZWQgYW5kIHN0cmljdCBtb2RlIGlzIGRpc2FibGVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgc3RyaWN0IG1vZGUgaXMgZW5hYmxlZCBhbmQgYHZlcmAgY2Fubm90IGJlIGNvZXJjZWRcbiAqL1xuZnVuY3Rpb24gY29lcmNlVmVyc2lvbiAodmVyLCBzdHJpY3QgPSB0cnVlKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHNlbXZlci52YWxpZChzZW12ZXIuY29lcmNlKGAke3Zlcn1gKSk7XG4gIGlmIChzdHJpY3QgJiYgIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7dmVyfScgY2Fubm90IGJlIGNvZXJjZWQgdG8gYSB2YWxpZCB2ZXJzaW9uIG51bWJlcmApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IFNVUFBPUlRFRF9PUEVSQVRPUlMgPSBbJz09JywgJyE9JywgJz4nLCAnPCcsICc+PScsICc8PScsICc9J107XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIHZlcnNpb24gc3RyaW5nc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdmVyMSAtIFRoZSBmaXJzdCB2ZXJzaW9uIG51bWJlciB0byBjb21wYXJlLiBTaG91bGQgYmUgYSB2YWxpZFxuICogdmVyc2lvbiBudW1iZXIgc3VwcG9ydGVkIGJ5IHNlbXZlciBwYXJzZXIuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHZlcjIgLSBUaGUgc2Vjb25kIHZlcnNpb24gbnVtYmVyIHRvIGNvbXBhcmUuIFNob3VsZCBiZSBhIHZhbGlkXG4gKiB2ZXJzaW9uIG51bWJlciBzdXBwb3J0ZWQgYnkgc2VtdmVyIHBhcnNlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIE9uZSBvZiBzdXBwb3J0ZWQgdmVyc2lvbiBudW1iZXIgb3BlcmF0b3JzOlxuICogPT0sICE9LCA+LCA8LCA8PSwgPj0sID1cbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIG9yIGZhbHNlIGRlcGVuZGluZyBvbiB0aGUgYWN0dWFsIGNvbXBhcmlzb24gcmVzdWx0XG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW4gdW5zdXBwb3J0ZWQgb3BlcmF0b3IgaXMgc3VwcGxpZWQgb3IgYW55IG9mIHRoZSBzdXBwbGllZFxuICogdmVyc2lvbiBzdHJpbmdzIGNhbm5vdCBiZSBjb2VyY2VkXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyAodmVyMSwgb3BlcmF0b3IsIHZlcjIpIHtcbiAgaWYgKCFTVVBQT1JURURfT1BFUkFUT1JTLmluY2x1ZGVzKG9wZXJhdG9yKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlICcke29wZXJhdG9yfScgY29tcGFyaXNvbiBvcGVyYXRvciBpcyBub3Qgc3VwcG9ydGVkLiBgICtcbiAgICAgIGBPbmx5ICcke0pTT04uc3RyaW5naWZ5KFNVUFBPUlRFRF9PUEVSQVRPUlMpfScgb3BlcmF0b3JzIGFyZSBzdXBwb3J0ZWRgKTtcbiAgfVxuXG4gIGNvbnN0IHNlbXZlck9wZXJhdG9yID0gWyc9PScsICchPSddLmluY2x1ZGVzKG9wZXJhdG9yKSA/ICc9JyA6IG9wZXJhdG9yO1xuICBjb25zdCByZXN1bHQgPSBzZW12ZXIuc2F0aXNmaWVzKGNvZXJjZVZlcnNpb24odmVyMSksIGAke3NlbXZlck9wZXJhdG9yfSR7Y29lcmNlVmVyc2lvbih2ZXIyKX1gKTtcbiAgcmV0dXJuIG9wZXJhdG9yID09PSAnIT0nID8gIXJlc3VsdCA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBZGQgYXBwcm9wcmlhdGUgcXVvdGVzIHRvIGNvbW1hbmQgYXJndW1lbnRzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3N1YnN0YWNrL25vZGUtc2hlbGwtcXVvdGVcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSAtIFRoZSBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhcnNlZFxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgYXJndW1lbnRzLCBxdW90ZWRcbiAqL1xuZnVuY3Rpb24gcXVvdGUgKGFyZ3MpIHtcbiAgcmV0dXJuIHNoZWxsUXVvdGUoYXJncyk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgdG8gd29ya2Fyb3VuZCB1bmV4cGVjdGVkIG1lbW9yeSBsZWFrc1xuICogY2F1c2VkIGJ5IE5vZGVKUyBzdHJpbmcgaW50ZXJuaW5nXG4gKiBiZWhhdmlvciBkZXNjcmliZWQgaW4gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Mjg2OVxuICpcbiAqIEBwYXJhbSB7Kn0gcyAtIFRoZSBzdHJpbmcgdG8gdW5sZWFrXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEVpdGhlciB0aGUgdW5sZWFrZWQgc3RyaW5nIG9yIHRoZSBvcmlnaW5hbCBvYmplY3QgY29udmVydGVkIHRvIHN0cmluZ1xuICovXG5mdW5jdGlvbiB1bmxlYWtTdHJpbmcgKHMpIHtcbiAgcmV0dXJuIGAgJHtzfWAuc3Vic3RyKDEpO1xufVxuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGx1cmFsaXplT3B0aW9uc1xuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gaW5jbHVzaXZlIFtmYWxzZV0gLSBXaGV0aGVyIHRvIHByZWZpeCB3aXRoIHRoZSBudW1iZXIgKGUuZy4sIDMgZHVja3MpXG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIGZvcm0gb2YgYSB3b3JkIGFwcHJvcHJpYXRlIHRvIHRoZSBjb3VudFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkIC0gVGhlIHdvcmQgdG8gcGx1cmFsaXplXG4gKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBIb3cgbWFueSBvZiB0aGUgd29yZCBleGlzdFxuICogQHBhcmFtIHs/UGx1cmFsaXplT3B0aW9uc3xib29sZWFufSBvcHRpb25zfGluY2x1c2l2ZSAtIG9wdGlvbnMgZm9yIHdvcmQgcGx1cmFsaXphdGlvbixcbiAqICAgb3IgYSBib29sZWFuIGluZGljYXRpbmcgdGhlIG9wdGlvbnMuaW5jbHVzaXZlIHByb3BlcnR5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgd29yZCBwbHVyYWxpemVkIGFjY29yZGluZyB0byB0aGUgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbGl6ZSAod29yZCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICBsZXQgaW5jbHVzaXZlID0gZmFsc2U7XG4gIGlmIChfLmlzQm9vbGVhbihvcHRpb25zKSkge1xuICAgIC8vIGlmIHBhc3NlZCBpbiBhcyBhIGJvb2xlYW5cbiAgICBpbmNsdXNpdmUgPSBvcHRpb25zO1xuICB9IGVsc2UgaWYgKF8uaXNCb29sZWFuKG9wdGlvbnM/LmluY2x1c2l2ZSkpIHtcbiAgICAvLyBpZiBwYXNzZWQgaW4gYXMgYW4gb3B0aW9ucyBoYXNoXG4gICAgaW5jbHVzaXZlID0gb3B0aW9ucy5pbmNsdXNpdmU7XG4gIH1cbiAgcmV0dXJuIHBsdXJhbGl6ZUxpYih3b3JkLCBjb3VudCwgaW5jbHVzaXZlKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFbmNvZGluZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhTaXplIFsxMDczNzQxODI0XSBUaGUgbWF4aW11bSBzaXplIG9mXG4gKiB0aGUgcmVzdWx0aW5nIGJ1ZmZlciBpbiBieXRlcy4gVGhpcyBpcyBzZXQgdG8gMUdCIGJ5IGRlZmF1bHQsIGJlY2F1c2VcbiAqIEFwcGl1bSBsaW1pdHMgdGhlIG1heGltdW0gSFRUUCBib2R5IHNpemUgdG8gMUdCLiBBbHNvLCB0aGUgTm9kZUpTIGhlYXBcbiAqIHNpemUgbXVzdCBiZSBlbm91Z2ggdG8ga2VlcCB0aGUgcmVzdWx0aW5nIG9iamVjdCAodXN1YWxseSB0aGlzIHNpemUgaXNcbiAqIGxpbWl0ZWQgdG8gMS40IEdCKVxuICovXG5cbi8qKlxuICogQ29udmVydHMgY29udGVudHMgb2YgYSBsb2NhbCBmaWxlIHRvIGFuIGluLW1lbW9yeSBiYXNlLTY0IGVuY29kZWQgYnVmZmVyLlxuICogVGhlIG9wZXJhdGlvbiBpcyBtZW1vcnktdXNhZ2UgZnJpZW5kbHkgYW5kIHNob3VsZCBiZSB1c2VkIHdoaWxlIGVuY29kaW5nXG4gKiBsYXJnZSBmaWxlcyB0byBiYXNlNjRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIGJlaW5nIGVuY29kZWRcbiAqIEBwYXJhbSB7RW5jb2RpbmdPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBiYXNlNjQtZW5jb2RlZCBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZSBhcyBtZW1vcnkgYnVmZmVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJlYWRpbmcgdGhlIHNvdXJjZSBmaWxlXG4gKiBvciB0aGUgc291cmNlIGZpbGUgaXMgdG9vXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRvSW5NZW1vcnlCYXNlNjQgKHNyY1BhdGgsIG9wdHMgPSB7fSkge1xuICBpZiAoIShhd2FpdCBmcy5leGlzdHMoc3JjUGF0aCkpIHx8IChhd2FpdCBmcy5zdGF0KHNyY1BhdGgpKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIGZpbGU6ICR7c3JjUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBtYXhTaXplID0gMSAqIEdpQixcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IHJlc3VsdEJ1ZmZlcnMgPSBbXTtcbiAgbGV0IHJlc3VsdEJ1ZmZlcnNTaXplID0gMDtcbiAgY29uc3QgcmVzdWx0V3JpdGVTdHJlYW0gPSBuZXcgc3RyZWFtLldyaXRhYmxlKHtcbiAgICB3cml0ZTogKGJ1ZmZlciwgZW5jb2RpbmcsIG5leHQpID0+IHtcbiAgICAgIHJlc3VsdEJ1ZmZlcnMucHVzaChidWZmZXIpO1xuICAgICAgcmVzdWx0QnVmZmVyc1NpemUgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICAgIGlmIChtYXhTaXplID4gMCAmJiByZXN1bHRCdWZmZXJzU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgcmVzdWx0V3JpdGVTdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoYFRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgYCArXG4gICAgICAgICAgYGJ1ZmZlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gJHt0b1JlYWRhYmxlU2l6ZVN0cmluZyhtYXhTaXplKX1gKSk7XG4gICAgICB9XG4gICAgICBuZXh0KCk7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgcmVhZGVyU3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShzcmNQYXRoKTtcbiAgY29uc3QgYmFzZTY0RW5jb2RlclN0cmVhbSA9IG5ldyBCYXNlNjRFbmNvZGUoKTtcbiAgY29uc3QgcmVzdWx0V3JpdGVTdHJlYW1Qcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlc3VsdFdyaXRlU3RyZWFtLm9uY2UoJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgIHJlYWRlclN0cmVhbS51bnBpcGUoYmFzZTY0RW5jb2RlclN0cmVhbSk7XG4gICAgICBiYXNlNjRFbmNvZGVyU3RyZWFtLnVucGlwZShyZXN1bHRXcml0ZVN0cmVhbSk7XG4gICAgICByZWFkZXJTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgcmVqZWN0KGUpO1xuICAgIH0pO1xuICAgIHJlc3VsdFdyaXRlU3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIHJlc29sdmUpO1xuICB9KTtcbiAgY29uc3QgcmVhZFN0cmVhbVByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmVhZGVyU3RyZWFtLm9uY2UoJ2Nsb3NlJywgcmVzb2x2ZSk7XG4gICAgcmVhZGVyU3RyZWFtLm9uY2UoJ2Vycm9yJywgKGUpID0+IHJlamVjdChcbiAgICAgIG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlYWQgJyR7c3JjUGF0aH0nOiAke2UubWVzc2FnZX1gKSkpO1xuICB9KTtcbiAgcmVhZGVyU3RyZWFtLnBpcGUoYmFzZTY0RW5jb2RlclN0cmVhbSk7XG4gIGJhc2U2NEVuY29kZXJTdHJlYW0ucGlwZShyZXN1bHRXcml0ZVN0cmVhbSk7XG5cbiAgYXdhaXQgQi5hbGwoW3JlYWRTdHJlYW1Qcm9taXNlLCByZXN1bHRXcml0ZVN0cmVhbVByb21pc2VdKTtcbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQocmVzdWx0QnVmZmVycyk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTG9ja0ZpbGVPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbMTIwXSBUaGUgbWF4IHRpbWUgaW4gc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgbG9ja1xuICogQHByb3BlcnR5IHtib29sZWFufSB0cnlSZWNvdmVyeSBbZmFsc2VdIFdoZXRoZXIgdG8gdHJ5IGxvY2sgcmVjb3ZlcnkgaWZcbiAqIHRoZSBmaXJzdCBhdHRlbXB0IHRvIGFjcXVpcmUgaXQgdGltZWQgb3V0LlxuICovXG5cbi8qKlxuICogQ3JlYXRlIGFuIGFzeW5jIGZ1bmN0aW9uIHdoaWNoLCB3aGVuIGNhbGxlZCwgd2lsbCBub3QgcHJvY2VlZCB1bnRpbCBhIGNlcnRhaW4gZmlsZSBpcyBub1xuICogbG9uZ2VyIHByZXNlbnQgb24gdGhlIHN5c3RlbS4gVGhpcyBhbGxvd3MgZm9yIHByZXZlbnRpbmcgY29uY3VycmVudCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzXG4gKiB1c2luZyBhIGtub3duIGxvY2tmaWxlIHBhdGguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2tGaWxlIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUgdXNlZCBmb3IgdGhlIGxvY2tcbiAqIEBwYXJhbSB7TG9ja0ZpbGVPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7QXN5bmNGdW5jdGlvbn0gYXN5bmMgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbm90aGVyIGFzeW5jIGZ1bmN0aW9uIGRlZmluaW5nIHRoZSBsb2NrZWRcbiAqIGJlaGF2aW9yXG4gKi9cbmZ1bmN0aW9uIGdldExvY2tGaWxlR3VhcmQgKGxvY2tGaWxlLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRpbWVvdXQgPSAxMjAsXG4gICAgdHJ5UmVjb3ZlcnkgPSBmYWxzZSxcbiAgfSA9IG9wdHM7XG5cbiAgY29uc3QgbG9jayA9IEIucHJvbWlzaWZ5KF9sb2NrZmlsZS5sb2NrKTtcbiAgY29uc3QgY2hlY2sgPSBCLnByb21pc2lmeShfbG9ja2ZpbGUuY2hlY2spO1xuICBjb25zdCB1bmxvY2sgPSBCLnByb21pc2lmeShfbG9ja2ZpbGUudW5sb2NrKTtcblxuICBjb25zdCBndWFyZCA9IGFzeW5jIChiZWhhdmlvcikgPT4ge1xuICAgIGxldCB0cmllZFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgZG8ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gaWYgdGhlIGxvY2tmaWxlIGRvZXNuJ3QgZXhpc3QsIGxvY2sgaXQgc3luY2hyb25vdXNseSB0byBtYWtlIHN1cmUgbm8gb3RoZXIgY2FsbFxuICAgICAgICAvLyBvbiB0aGUgc2FtZSBzcGluIG9mIHRoZSBldmVudCBsb29wIGNhbiBhbHNvIGluaXRpYXRlIGEgbG9jay4gSWYgdGhlIGxvY2tmaWxlIGRvZXMgZXhpc3RcbiAgICAgICAgLy8gdGhlbiBqdXN0IHVzZSB0aGUgcmVndWxhciBhc3luYyAnbG9jaycgbWV0aG9kIHdoaWNoIHdpbGwgd2FpdCBvbiB0aGUgbG9jay5cbiAgICAgICAgaWYgKF9sb2NrZmlsZS5jaGVja1N5bmMobG9ja0ZpbGUpKSB7XG4gICAgICAgICAgYXdhaXQgbG9jayhsb2NrRmlsZSwge3dhaXQ6IHRpbWVvdXQgKiAxMDAwfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX2xvY2tmaWxlLmxvY2tTeW5jKGxvY2tGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKF8uaW5jbHVkZXMoZS5tZXNzYWdlLCAnRUVYSVNUJykgJiYgdHJ5UmVjb3ZlcnkgJiYgIXRyaWVkUmVjb3ZlcnkpIHtcbiAgICAgICAgICAvLyBUaGVyZSBjb3VsZCBiZSBjYXNlcyB3aGVyZSBhIHByb2Nlc3MgaGFzIGJlZW4gZm9yY2VmdWxseSB0ZXJtaW5hdGVkXG4gICAgICAgICAgLy8gd2l0aG91dCBhIGNoYW5jZSB0byBjbGVhbiB1cCBwZW5kaW5nIGxvY2tzOiBodHRwczovL2dpdGh1Yi5jb20vbnBtL2xvY2tmaWxlL2lzc3Vlcy8yNlxuICAgICAgICAgIF9sb2NrZmlsZS51bmxvY2tTeW5jKGxvY2tGaWxlKTtcbiAgICAgICAgICB0cmllZFJlY292ZXJ5ID0gdHJ1ZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBhY3F1aXJlIGxvY2sgb24gJyR7bG9ja0ZpbGV9JyBhZnRlciAke3RpbWVvdXR9cy4gYCArXG4gICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgfSB3aGlsZSAodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBiZWhhdmlvcigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyB3aGV0aGVyIHRoZSBiZWhhdmlvciBzdWNjZWVkZWQgb3Igbm90LCBnZXQgcmlkIG9mIHRoZSBsb2NrXG4gICAgICBhd2FpdCB1bmxvY2sobG9ja0ZpbGUpO1xuICAgIH1cbiAgfTtcblxuICBndWFyZC5jaGVjayA9IGFzeW5jICgpID0+IGF3YWl0IGNoZWNrKGxvY2tGaWxlKTtcblxuICByZXR1cm4gZ3VhcmQ7XG59XG5cbmV4cG9ydCB7XG4gIGhhc1ZhbHVlLCBlc2NhcGVTcGFjZSwgZXNjYXBlU3BlY2lhbENoYXJzLCBsb2NhbElwLCBjYW5jZWxsYWJsZURlbGF5LFxuICBtdWx0aVJlc29sdmUsIHNhZmVKc29uUGFyc2UsIHdyYXBFbGVtZW50LCB1bndyYXBFbGVtZW50LCBmaWx0ZXJPYmplY3QsXG4gIHRvUmVhZGFibGVTaXplU3RyaW5nLCBpc1N1YlBhdGgsIFczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSLFxuICBpc1NhbWVEZXN0aW5hdGlvbiwgY29tcGFyZVZlcnNpb25zLCBjb2VyY2VWZXJzaW9uLCBxdW90ZSwgdW5sZWFrU3RyaW5nLFxuICBqc29uU3RyaW5naWZ5LCBwbHVyYWxpemUsIEdpQiwgTWlCLCBLaUIsIHRvSW5NZW1vcnlCYXNlNjQsXG4gIHV1aWRWMSwgdXVpZFYzLCB1dWlkVjQsIHV1aWRWNSwgc2hlbGxQYXJzZSwgZ2V0TG9ja0ZpbGVHdWFyZFxufTtcbiJdLCJmaWxlIjoibGliL3V0aWwuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
420
+ }
421
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlsLmpzIl0sIm5hbWVzIjpbIlczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSIiwiS2lCIiwiTWlCIiwiR2lCIiwiaGFzQ29udGVudCIsInZhbCIsIl8iLCJpc1N0cmluZyIsImhhc1ZhbHVlIiwiaGFzVmFsIiwiaXNOdW1iZXIiLCJpc05hTiIsImlzVW5kZWZpbmVkIiwiaXNOdWxsIiwiZXNjYXBlU3BhY2UiLCJzdHIiLCJzcGxpdCIsImpvaW4iLCJlc2NhcGVTcGVjaWFsQ2hhcnMiLCJxdW90ZUVzY2FwZSIsInJlcGxhY2UiLCJyZSIsIlJlZ0V4cCIsImxvY2FsSXAiLCJpcCIsImNoYWluIiwib3MiLCJuZXR3b3JrSW50ZXJmYWNlcyIsInZhbHVlcyIsImZsYXR0ZW4iLCJmaWx0ZXIiLCJmYW1pbHkiLCJpbnRlcm5hbCIsIm1hcCIsImZpcnN0IiwidmFsdWUiLCJjYW5jZWxsYWJsZURlbGF5IiwibXMiLCJ0aW1lciIsInJlc29sdmUiLCJyZWplY3QiLCJkZWxheSIsIkIiLCJQcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0Iiwic2V0VGltZW91dCIsImNhbmNlbCIsImNsZWFyVGltZW91dCIsIkNhbmNlbGxhdGlvbkVycm9yIiwibXVsdGlSZXNvbHZlIiwicm9vdHMiLCJhcmdzIiwicm9vdCIsInBhdGgiLCJzYWZlSnNvblBhcnNlIiwib2JqIiwiSlNPTiIsInBhcnNlIiwiaWduIiwianNvblN0cmluZ2lmeSIsInJlcGxhY2VyIiwic3BhY2UiLCJpc0Z1bmN0aW9uIiwiayIsInYiLCJidWZmZXJUb0pTT04iLCJCdWZmZXIiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJzdHJpbmdpZnkiLCJrZXkiLCJ1cGRhdGVkVmFsdWUiLCJpc0J1ZmZlciIsInRvU3RyaW5nIiwidW53cmFwRWxlbWVudCIsImVsIiwicHJvcE5hbWUiLCJoYXMiLCJ3cmFwRWxlbWVudCIsImVsZW1lbnRJZCIsIkVMRU1FTlQiLCJmaWx0ZXJPYmplY3QiLCJwcmVkaWNhdGUiLCJuZXdPYmoiLCJjbG9uZSIsInZhbHVlUHJlZGljYXRlIiwiT2JqZWN0Iiwia2V5cyIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwiYnl0ZXMiLCJpbnRCeXRlcyIsInBhcnNlSW50IiwiU3RyaW5nIiwiRXJyb3IiLCJ0b0ZpeGVkIiwiaXNTdWJQYXRoIiwib3JpZ2luYWxQYXRoIiwiZm9yY2VQb3NpeCIsInBhdGhPYmoiLCJwb3NpeCIsInAiLCJpc0Fic29sdXRlIiwibm9ybWFsaXplZFJvb3QiLCJub3JtYWxpemUiLCJub3JtYWxpemVkUGF0aCIsInN0YXJ0c1dpdGgiLCJpc1NhbWVEZXN0aW5hdGlvbiIsInBhdGgxIiwicGF0aDIiLCJwYXRoTiIsImFsbFBhdGhzIiwicmVkdWNlIiwiYSIsImIiLCJmcyIsImV4aXN0cyIsImFyZUFsbEl0ZW1zRXF1YWwiLCJhcnIiLCJOYU4iLCJtYXBDYiIsIngiLCJzdGF0IiwiYmlnaW50IiwiaW5vIiwiY29lcmNlVmVyc2lvbiIsInZlciIsInN0cmljdCIsInJlc3VsdCIsInNlbXZlciIsInZhbGlkIiwiY29lcmNlIiwiU1VQUE9SVEVEX09QRVJBVE9SUyIsImNvbXBhcmVWZXJzaW9ucyIsInZlcjEiLCJvcGVyYXRvciIsInZlcjIiLCJpbmNsdWRlcyIsInNlbXZlck9wZXJhdG9yIiwic2F0aXNmaWVzIiwicXVvdGUiLCJjYXN0QXJyYXkiLCJ1bmxlYWtTdHJpbmciLCJzIiwic3Vic3RyIiwicGx1cmFsaXplIiwid29yZCIsImNvdW50Iiwib3B0aW9ucyIsImluY2x1c2l2ZSIsImlzQm9vbGVhbiIsInRvSW5NZW1vcnlCYXNlNjQiLCJzcmNQYXRoIiwib3B0cyIsImlzRGlyZWN0b3J5IiwibWF4U2l6ZSIsInJlc3VsdEJ1ZmZlcnMiLCJyZXN1bHRCdWZmZXJzU2l6ZSIsInJlc3VsdFdyaXRlU3RyZWFtIiwic3RyZWFtIiwiV3JpdGFibGUiLCJ3cml0ZSIsImJ1ZmZlciIsImVuY29kaW5nIiwibmV4dCIsInB1c2giLCJsZW5ndGgiLCJlbWl0IiwicmVhZGVyU3RyZWFtIiwiY3JlYXRlUmVhZFN0cmVhbSIsImJhc2U2NEVuY29kZXJTdHJlYW0iLCJCYXNlNjRFbmNvZGUiLCJyZXN1bHRXcml0ZVN0cmVhbVByb21pc2UiLCJvbmNlIiwiZSIsInVucGlwZSIsImRlc3Ryb3kiLCJyZWFkU3RyZWFtUHJvbWlzZSIsIm1lc3NhZ2UiLCJwaXBlIiwiYWxsIiwiY29uY2F0IiwiZ2V0TG9ja0ZpbGVHdWFyZCIsImxvY2tGaWxlIiwidGltZW91dCIsInRyeVJlY292ZXJ5IiwibG9jayIsInByb21pc2lmeSIsIl9sb2NrZmlsZSIsImNoZWNrIiwidW5sb2NrIiwiZ3VhcmQiLCJiZWhhdmlvciIsInRyaWVkUmVjb3ZlcnkiLCJjaGVja1N5bmMiLCJ3YWl0IiwibG9ja1N5bmMiLCJ1bmxvY2tTeW5jIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFHQSxNQUFNQSwwQkFBMEIsR0FBRyxxQ0FBbkM7O0FBQ0EsTUFBTUMsR0FBRyxHQUFHLElBQVo7O0FBQ0EsTUFBTUMsR0FBRyxHQUFHRCxHQUFHLEdBQUcsSUFBbEI7O0FBQ0EsTUFBTUUsR0FBRyxHQUFHRCxHQUFHLEdBQUcsSUFBbEI7OztBQUVPLFNBQVNFLFVBQVQsQ0FBcUJDLEdBQXJCLEVBQTBCO0FBQy9CLFNBQU9DLGdCQUFFQyxRQUFGLENBQVdGLEdBQVgsS0FBbUJBLEdBQUcsS0FBSyxFQUFsQztBQUNEOztBQUdELFNBQVNHLFFBQVQsQ0FBbUJILEdBQW5CLEVBQXdCO0FBQ3RCLE1BQUlJLE1BQU0sR0FBRyxLQUFiOztBQUVBLE1BQUlILGdCQUFFSSxRQUFGLENBQVdMLEdBQVgsQ0FBSixFQUFxQjtBQUNuQkksSUFBQUEsTUFBTSxHQUFHLENBQUNILGdCQUFFSyxLQUFGLENBQVFOLEdBQVIsQ0FB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LEtBQXBCOztBQUNBLE9BQUc7QUFDRCxVQUFJO0FBSUYsWUFBSUwsbUJBQVVNLFNBQVYsQ0FBb0JYLFFBQXBCLENBQUosRUFBbUM7QUFDakMsZ0JBQU1HLElBQUksQ0FBQ0gsUUFBRCxFQUFXO0FBQUNZLFlBQUFBLElBQUksRUFBRVgsT0FBTyxHQUFHO0FBQWpCLFdBQVgsQ0FBVjtBQUNELFNBRkQsTUFFTztBQUNMSSw2QkFBVVEsUUFBVixDQUFtQmIsUUFBbkI7QUFDRDs7QUFDRDtBQUNELE9BVkQsQ0FVRSxPQUFPVCxDQUFQLEVBQVU7QUFDVixZQUFJeEssZ0JBQUVtSSxRQUFGLENBQVdxQyxDQUFDLENBQUNJLE9BQWIsRUFBc0IsUUFBdEIsS0FBbUNPLFdBQW5DLElBQWtELENBQUNRLGFBQXZELEVBQXNFO0FBR3BFTCw2QkFBVVMsVUFBVixDQUFxQmQsUUFBckI7O0FBQ0FVLFVBQUFBLGFBQWEsR0FBRyxJQUFoQjtBQUNBO0FBQ0Q7O0FBQ0QsY0FBTSxJQUFJbkcsS0FBSixDQUFXLDhCQUE2QnlGLFFBQVMsV0FBVUMsT0FBUSxLQUF6RCxHQUNiLG1CQUFrQlYsQ0FBQyxDQUFDSSxPQUFRLEVBRHpCLENBQU47QUFFRDtBQUVGLEtBdkJELFFBdUJTLElBdkJUOztBQXdCQSxRQUFJO0FBQ0YsYUFBTyxNQUFNYyxRQUFRLEVBQXJCO0FBQ0QsS0FGRCxTQUVVO0FBRVIsWUFBTUYsTUFBTSxDQUFDUCxRQUFELENBQVo7QUFDRDtBQUNGLEdBaENEOztBQWtDQVEsRUFBQUEsS0FBSyxDQUFDRixLQUFOLEdBQWMsWUFBWSxNQUFNQSxLQUFLLENBQUNOLFFBQUQsQ0FBckM7O0FBRUEsU0FBT1EsS0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnLi9mcyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQge1xuICAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9zaGVsbC1xdW90ZVxuICBxdW90ZSBhcyBzaGVsbFF1b3RlLFxuICBwYXJzZSBhcyBzaGVsbFBhcnNlLFxufSBmcm9tICdzaGVsbC1xdW90ZSc7XG5pbXBvcnQgcGx1cmFsaXplTGliIGZyb20gJ3BsdXJhbGl6ZSc7XG5pbXBvcnQgc3RyZWFtIGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBCYXNlNjRFbmNvZGUgfSBmcm9tICdiYXNlNjQtc3RyZWFtJztcbmltcG9ydCB7XG4gIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3V1aWRcbiAgdjEgYXMgdXVpZFYxLCB2MyBhcyB1dWlkVjMsXG4gIHY0IGFzIHV1aWRWNCwgdjUgYXMgdXVpZFY1XG59IGZyb20gJ3V1aWQnO1xuaW1wb3J0IF9sb2NrZmlsZSBmcm9tICdsb2NrZmlsZSc7XG5cblxuY29uc3QgVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVIgPSAnZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2YnO1xuY29uc3QgS2lCID0gMTAyNDtcbmNvbnN0IE1pQiA9IEtpQiAqIDEwMjQ7XG5jb25zdCBHaUIgPSBNaUIgKiAxMDI0O1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzQ29udGVudCAodmFsKSB7XG4gIHJldHVybiBfLmlzU3RyaW5nKHZhbCkgJiYgdmFsICE9PSAnJztcbn1cblxuLy8gcmV0dXJuIHRydWUgaWYgdGhlIHRoZSB2YWx1ZSBpcyBub3QgdW5kZWZpbmVkLCBudWxsLCBvciBOYU4uXG5mdW5jdGlvbiBoYXNWYWx1ZSAodmFsKSB7XG4gIGxldCBoYXNWYWwgPSBmYWxzZTtcbiAgLy8gYXZvaWQgaW5jb3JyZWN0bHkgZXZhbHVhdGluZyBgMGAgYXMgZmFsc2VcbiAgaWYgKF8uaXNOdW1iZXIodmFsKSkge1xuICAgIGhhc1ZhbCA9ICFfLmlzTmFOKHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgaGFzVmFsID0gIV8uaXNVbmRlZmluZWQodmFsKSAmJiAhXy5pc051bGwodmFsKTtcbiAgfVxuXG4gIHJldHVybiBoYXNWYWw7XG59XG5cbi8vIGVzY2FwZSBzcGFjZXMgaW4gc3RyaW5nLCBmb3IgY29tbWFuZGxpbmUgY2FsbHNcbmZ1bmN0aW9uIGVzY2FwZVNwYWNlIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgvIC8pLmpvaW4oJ1xcXFwgJyk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVNwZWNpYWxDaGFycyAoc3RyLCBxdW90ZUVzY2FwZSkge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIGlmICh0eXBlb2YgcXVvdGVFc2NhcGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcXVvdGVFc2NhcGUgPSBmYWxzZTtcbiAgfVxuICBzdHIgPSBzdHJcbiAgICAucmVwbGFjZSgvW1xcXFxdL2csICdcXFxcXFxcXCcpXG4gICAgLnJlcGxhY2UoL1tcXC9dL2csICdcXFxcLycpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgICAucmVwbGFjZSgvW1xcYl0vZywgJ1xcXFxiJylcbiAgICAucmVwbGFjZSgvW1xcZl0vZywgJ1xcXFxmJylcbiAgICAucmVwbGFjZSgvW1xcbl0vZywgJ1xcXFxuJylcbiAgICAucmVwbGFjZSgvW1xccl0vZywgJ1xcXFxyJylcbiAgICAucmVwbGFjZSgvW1xcdF0vZywgJ1xcXFx0JylcbiAgICAucmVwbGFjZSgvW1xcXCJdL2csICdcXFxcXCInKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgLnJlcGxhY2UoL1xcXFwnL2csIFwiXFxcXCdcIik7XG4gIGlmIChxdW90ZUVzY2FwZSkge1xuICAgIGxldCByZSA9IG5ldyBSZWdFeHAocXVvdGVFc2NhcGUsICdnJyk7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UocmUsIGBcXFxcJHtxdW90ZUVzY2FwZX1gKTtcbiAgfVxuICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBsb2NhbElwICgpIHtcbiAgbGV0IGlwID0gXy5jaGFpbihvcy5uZXR3b3JrSW50ZXJmYWNlcygpKVxuICAgIC52YWx1ZXMoKVxuICAgIC5mbGF0dGVuKClcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gKHZhbC5mYW1pbHkgPT09ICdJUHY0JyAmJiB2YWwuaW50ZXJuYWwgPT09IGZhbHNlKTtcbiAgICB9KVxuICAgIC5tYXAoJ2FkZHJlc3MnKVxuICAgIC5maXJzdCgpXG4gICAgLnZhbHVlKCk7XG4gIHJldHVybiBpcDtcbn1cblxuLypcbiAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgaXMgY2FuY2VsbGFibGUsIGFuZCB3aWxsIHRpbWVvdXRcbiAqIGFmdGVyIGBtc2AgZGVsYXlcbiAqL1xuZnVuY3Rpb24gY2FuY2VsbGFibGVEZWxheSAobXMpIHtcbiAgbGV0IHRpbWVyO1xuICBsZXQgcmVzb2x2ZTtcbiAgbGV0IHJlamVjdDtcblxuICBjb25zdCBkZWxheSA9IG5ldyBCLlByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgcmVzb2x2ZSA9IF9yZXNvbHZlO1xuICAgIHJlamVjdCA9IF9yZWplY3Q7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9LCBtcyk7XG4gIH0pO1xuXG4gIC8vIG92ZXJyaWRlIEJsdWViaXJkJ3MgYGNhbmNlbGAsIHdoaWNoIGRvZXMgbm90IHdvcmsgd2hlbiB1c2luZyBgYXdhaXRgIG9uXG4gIC8vIGEgcHJvbWlzZSwgc2luY2UgYHJlc29sdmVgL2ByZWplY3RgIGFyZSBuZXZlciBjYWxsZWRcbiAgZGVsYXkuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgcmVqZWN0KG5ldyBCLkNhbmNlbGxhdGlvbkVycm9yKCkpO1xuICB9O1xuICByZXR1cm4gZGVsYXk7XG59XG5cbmZ1bmN0aW9uIG11bHRpUmVzb2x2ZSAocm9vdHMsIC4uLmFyZ3MpIHtcbiAgcmV0dXJuIHJvb3RzLm1hcCgocm9vdCkgPT4gcGF0aC5yZXNvbHZlKHJvb3QsIC4uLmFyZ3MpKTtcbn1cblxuLypcbiAqIFBhcnNlcyBhbiBvYmplY3QgaWYgcG9zc2libGUuIE90aGVyd2lzZSByZXR1cm5zIHRoZSBvYmplY3Qgd2l0aG91dCBwYXJzaW5nLlxuICovXG5mdW5jdGlvbiBzYWZlSnNvblBhcnNlIChvYmopIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShvYmopO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICAvLyBpZ25vcmU6IHRoaXMgaXMgbm90IGpzb24gcGFyc2FibGVcbiAgICByZXR1cm4gb2JqO1xuICB9XG59XG5cbi8qXG4gKiBTdHJpbmdpZmllcyB0aGUgb2JqZWN0IHBhc3NlZCBpbiwgY29udmVydGluZyBCdWZmZXJzIGludG8gU3RyaW5ncyBmb3IgYmV0dGVyXG4gKiBkaXNwbGF5LiBUaGlzIG1pbWljcyBKU09OLnN0cmluZ2lmeSAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5KVxuICogZXhjZXB0IHRoZSBgcmVwbGFjZXJgIGFyZ3VtZW50IGNhbiBvbmx5IGJlIGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtIHs/ZnVuY3Rpb259IHJlcGxhY2VyIC0gZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBwcm9wZXJ0aWVzIGFkZGVkIHRvIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCBvYmplY3RcbiAqIEBwYXJhbSB7P251bWJlcnxzdHJpbmd9IHNwYWNlIC0gdXNlZCB0byBpbnNlcnQgd2hpdGUgc3BhY2UgaW50byB0aGUgb3V0cHV0IEpTT05cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvciByZWFkYWJpbGl0eSBwdXJwb3Nlcy4gRGVmYXVsdHMgdG8gMlxuICogcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBKU09OIG9iamVjdCBzZXJpYWxpemVkIGFzIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGpzb25TdHJpbmdpZnkgKG9iaiwgcmVwbGFjZXIsIHNwYWNlID0gMikge1xuICAvLyBpZiBubyByZXBsYWNlciBpcyBwYXNzZWQsIG9yIGl0IGlzIG5vdCBhIGZ1bmN0aW9uLCBqdXN0IHVzZSBhIHBhc3MtdGhyb3VnaFxuICBpZiAoIV8uaXNGdW5jdGlvbihyZXBsYWNlcikpIHtcbiAgICByZXBsYWNlciA9IChrLCB2KSA9PiB2O1xuICB9XG5cbiAgLy8gQnVmZmVycyBjYW5ub3QgYmUgc2VyaWFsaXplZCBpbiBhIHJlYWRhYmxlIHdheVxuICBjb25zdCBidWZmZXJUb0pTT04gPSBCdWZmZXIucHJvdG90eXBlLnRvSlNPTjtcbiAgZGVsZXRlIEJ1ZmZlci5wcm90b3R5cGUudG9KU09OO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkVmFsdWUgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpXG4gICAgICAgID8gdmFsdWUudG9TdHJpbmcoJ3V0ZjgnKVxuICAgICAgICA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHJlcGxhY2VyKGtleSwgdXBkYXRlZFZhbHVlKTtcbiAgICB9LCBzcGFjZSk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gcmVzdG9yZSB0aGUgZnVuY3Rpb24sIHNvIGFzIHRvIG5vdCBicmVhayBmdXJ0aGVyIHNlcmlhbGl6YXRpb25cbiAgICBCdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGJ1ZmZlclRvSlNPTjtcbiAgfVxufVxuXG4vKlxuICogUmVtb3ZlcyB0aGUgd3JhcHBlciBmcm9tIGVsZW1lbnQsIGlmIGl0IGV4aXN0cy5cbiAqICAgeyBFTEVNRU5UOiA0IH0gYmVjb21lcyA0XG4gKiAgIHsgZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2Y6IDUgfSBiZWNvbWVzIDVcbiAqL1xuZnVuY3Rpb24gdW53cmFwRWxlbWVudCAoZWwpIHtcbiAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVIsICdFTEVNRU5UJ10pIHtcbiAgICBpZiAoXy5oYXMoZWwsIHByb3BOYW1lKSkge1xuICAgICAgcmV0dXJuIGVsW3Byb3BOYW1lXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVsO1xufVxuXG5mdW5jdGlvbiB3cmFwRWxlbWVudCAoZWxlbWVudElkKSB7XG4gIHJldHVybiB7XG4gICAgRUxFTUVOVDogZWxlbWVudElkLFxuICAgIFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl06IGVsZW1lbnRJZCxcbiAgfTtcbn1cblxuLypcbiAqIFJldHVybnMgb2JqZWN0IGNvbnNpc3Rpbmcgb2YgYWxsIHByb3BlcnRpZXMgaW4gdGhlIG9yaWdpbmFsIGVsZW1lbnRcbiAqIHdoaWNoIHdlcmUgdHJ1dGh5IGdpdmVuIHRoZSBwcmVkaWNhdGUuXG4gKiBJZiB0aGUgcHJlZGljYXRlIGlzXG4gKiAgICogbWlzc2luZyAtIGl0IHdpbGwgcmVtb3ZlIGFsbCBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlcyBhcmUgYHVuZGVmaW5lZGBcbiAqICAgKiBhIHNjYWxhciAtIGl0IHdpbGwgdGVzdCBhbGwgcHJvcGVydGllcycgdmFsdWVzIGFnYWluc3QgdGhhdCB2YWx1ZVxuICogICAqIGEgZnVuY3Rpb24gLSBpdCB3aWxsIHBhc3MgZWFjaCB2YWx1ZSBhbmQgdGhlIG9yaWdpbmFsIG9iamVjdCBpbnRvIHRoZSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBmaWx0ZXJPYmplY3QgKG9iaiwgcHJlZGljYXRlKSB7XG4gIGxldCBuZXdPYmogPSBfLmNsb25lKG9iaik7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByZWRpY2F0ZSkpIHtcbiAgICAvLyByZW1vdmUgYW55IGVsZW1lbnQgZnJvbSB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgIHByZWRpY2F0ZSA9ICh2KSA9PiAhXy5pc1VuZGVmaW5lZCh2KTtcbiAgfSBlbHNlIGlmICghXy5pc0Z1bmN0aW9uKHByZWRpY2F0ZSkpIHtcbiAgICAvLyBtYWtlIHByZWRpY2F0ZSBpbnRvIGEgZnVuY3Rpb25cbiAgICBjb25zdCB2YWx1ZVByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICBwcmVkaWNhdGUgPSAodikgPT4gdiA9PT0gdmFsdWVQcmVkaWNhdGU7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGlmICghcHJlZGljYXRlKG9ialtrZXldLCBvYmopKSB7XG4gICAgICBkZWxldGUgbmV3T2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdPYmo7XG59XG5cbi8qKlxuICogQ29udmVydHMgbnVtYmVyIG9mIGJ5dGVzIHRvIGEgcmVhZGFibGUgc2l6ZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBieXRlcyAtIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGFjdHVhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGZvciBleGFtcGxlXG4gKiAgICAgICAgICAgICAgICAgICAnMS4wMCBLQicgZm9yICcxMDI0IEInXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYnl0ZXMgY291bnQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIG9yXG4gKiAgICAgICAgICAgICAgICAgaWYgaXQgaXMgbGVzcyB0aGFuIHplcm8uXG4gKi9cbmZ1bmN0aW9uIHRvUmVhZGFibGVTaXplU3RyaW5nIChieXRlcykge1xuICBjb25zdCBpbnRCeXRlcyA9IHBhcnNlSW50KFN0cmluZyhieXRlcyksIDEwKTtcbiAgaWYgKGlzTmFOKGludEJ5dGVzKSB8fCBpbnRCeXRlcyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0ICcke2J5dGVzfScgdG8gYSByZWFkYWJsZSBzaXplIGZvcm1hdGApO1xuICB9XG4gIGlmIChpbnRCeXRlcyA+PSBHaUIpIHtcbiAgICByZXR1cm4gYCR7KGludEJ5dGVzIC8gKEdpQiAqIDEuMCkpLnRvRml4ZWQoMil9IEdCYDtcbiAgfSBlbHNlIGlmIChpbnRCeXRlcyA+PSBNaUIpIHtcbiAgICByZXR1cm4gYCR7KGludEJ5dGVzIC8gKE1pQiAqIDEuMCkpLnRvRml4ZWQoMil9IE1CYDtcbiAgfSBlbHNlIGlmIChpbnRCeXRlcyA+PSBLaUIpIHtcbiAgICByZXR1cm4gYCR7KGludEJ5dGVzIC8gKEtpQiAqIDEuMCkpLnRvRml4ZWQoMil9IEtCYDtcbiAgfVxuICByZXR1cm4gYCR7aW50Qnl0ZXN9IEJgO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGlzIGEgc3VicGF0aCBvZiB0aGVcbiAqIHBhcnRpY3VsYXIgcm9vdCBmb2xkZXIuIEJvdGggcGF0aHMgY2FuIGluY2x1ZGUgLi4gYW5kIC4gc3BlY2lmaWVyc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcmlnaW5hbFBhdGggVGhlIGFic29sdXRlIGZpbGUvZm9sZGVyIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSByb290IFRoZSBhYnNvbHV0ZSByb290IGZvbGRlciBwYXRoXG4gKiBAcGFyYW0gez9ib29sZWFufSBmb3JjZVBvc2l4IFNldCBpdCB0byB0cnVlIGlmIHBhdGhzIG11c3QgYmUgaW50ZXJwcmV0ZWQgaW4gUE9TSVggZm9ybWF0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZ2l2ZW4gb3JpZ2luYWwgcGF0aCBpcyB0aGUgc3VicGF0aCBvZiB0aGUgcm9vdCBmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBhbnkgb2YgdGhlIGdpdmVuIHBhdGhzIGlzIG5vdCBhYnNvbHV0ZVxuICovXG5mdW5jdGlvbiBpc1N1YlBhdGggKG9yaWdpbmFsUGF0aCwgcm9vdCwgZm9yY2VQb3NpeCA9IG51bGwpIHtcbiAgY29uc3QgcGF0aE9iaiA9IGZvcmNlUG9zaXggPyBwYXRoLnBvc2l4IDogcGF0aDtcbiAgZm9yIChjb25zdCBwIG9mIFtvcmlnaW5hbFBhdGgsIHJvb3RdKSB7XG4gICAgaWYgKCFwYXRoT2JqLmlzQWJzb2x1dGUocCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7cH0nIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFic29sdXRlIHBhdGhgKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZFJvb3QgPSBwYXRoT2JqLm5vcm1hbGl6ZShyb290KTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoT2JqLm5vcm1hbGl6ZShvcmlnaW5hbFBhdGgpO1xuICByZXR1cm4gbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkUm9vdCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGhzIGFyZSBwb2ludGluZyB0byB0aGUgc2FtZSBmaWxlIHN5c3RlbVxuICogZGVzdGluYXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGgxIC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byBhIGZpbGUvZm9sZGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aDIgLSBBYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRoIHRvIGEgZmlsZS9mb2xkZXJcbiAqIEBwYXJhbSB7Li4uc3RyaW5nfSBwYXRoTiAtIFplcm8gb3IgbW9yZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRocyB0byBmaWxlcy9mb2xkZXJzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gdHJ1ZSBpZiBhbGwgcGF0aHMgYXJlIHBvaW50aW5nIHRvIHRoZSBzYW1lIGZpbGUgc3lzdGVtIGl0ZW1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNTYW1lRGVzdGluYXRpb24gKHBhdGgxLCBwYXRoMiwgLi4ucGF0aE4pIHtcbiAgY29uc3QgYWxsUGF0aHMgPSBbcGF0aDEsIHBhdGgyLCAuLi5wYXRoTl07XG4gIGlmICghYXdhaXQgQi5yZWR1Y2UoYWxsUGF0aHMsIGFzeW5jIChhLCBiKSA9PiBhICYmIGF3YWl0IGZzLmV4aXN0cyhiKSwgdHJ1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBhcmVBbGxJdGVtc0VxdWFsID0gKGFycikgPT4gISFhcnIucmVkdWNlKChhLCBiKSA9PiBhID09PSBiID8gYSA6IE5hTik7XG4gIGlmIChhcmVBbGxJdGVtc0VxdWFsKGFsbFBhdGhzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbGV0IG1hcENiID0gYXN5bmMgKHgpID0+IChhd2FpdCBmcy5zdGF0KHgsIHtcbiAgICBiaWdpbnQ6IHRydWUsXG4gIH0pKS5pbm87XG4gIHJldHVybiBhcmVBbGxJdGVtc0VxdWFsKGF3YWl0IEIubWFwKGFsbFBhdGhzLCBtYXBDYikpO1xufVxuXG4vKipcbiAqIENvZXJjZXMgdGhlIGdpdmVuIG51bWJlci9zdHJpbmcgdG8gYSB2YWxpZCB2ZXJzaW9uIHN0cmluZ1xuICpcbiAqIEB0ZW1wbGF0ZSB7Ym9vbGVhbn0gW1N0cmljdD10cnVlXVxuICogQHBhcmFtIHtzdHJpbmd9IHZlciAtIFZlcnNpb24gc3RyaW5nIHRvIGNvZXJjZVxuICogQHBhcmFtIHtTdHJpY3R9IFtzdHJpY3RdIC0gSWYgYHRydWVgIHRoZW4gYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duXG4gKiBpZiBgdmVyYCBjYW5ub3QgYmUgY29lcmNlZFxuICogQHJldHVybnMge1N0cmljdCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBzdHJpbmd8bnVsbH0gQ29lcmNlZCB2ZXJzaW9uIG51bWJlciBvciBudWxsIGlmIHRoZSBzdHJpbmcgY2Fubm90IGJlXG4gKiBjb2VyY2VkIGFuZCBzdHJpY3QgbW9kZSBpcyBkaXNhYmxlZFxuICogQHRocm93cyB7RXJyb3J9IGlmIHN0cmljdCBtb2RlIGlzIGVuYWJsZWQgYW5kIGB2ZXJgIGNhbm5vdCBiZSBjb2VyY2VkXG4gKi9cbmZ1bmN0aW9uIGNvZXJjZVZlcnNpb24gKHZlciwgc3RyaWN0ID0gLyoqIEB0eXBlIHtTdHJpY3R9ICovKHRydWUpKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHNlbXZlci52YWxpZChzZW12ZXIuY29lcmNlKGAke3Zlcn1gKSk7XG4gIGlmIChzdHJpY3QgJiYgIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7dmVyfScgY2Fubm90IGJlIGNvZXJjZWQgdG8gYSB2YWxpZCB2ZXJzaW9uIG51bWJlcmApO1xuICB9XG4gIHJldHVybiAvKiogQHR5cGUge1N0cmljdCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBzdHJpbmc/fSAqLyhyZXN1bHQpO1xufVxuXG5jb25zdCBTVVBQT1JURURfT1BFUkFUT1JTID0gWyc9PScsICchPScsICc+JywgJzwnLCAnPj0nLCAnPD0nLCAnPSddO1xuXG4vKipcbiAqIENvbXBhcmVzIHR3byB2ZXJzaW9uIHN0cmluZ3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyMSAtIFRoZSBmaXJzdCB2ZXJzaW9uIG51bWJlciB0byBjb21wYXJlLiBTaG91bGQgYmUgYSB2YWxpZFxuICogdmVyc2lvbiBudW1iZXIgc3VwcG9ydGVkIGJ5IHNlbXZlciBwYXJzZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyMiAtIFRoZSBzZWNvbmQgdmVyc2lvbiBudW1iZXIgdG8gY29tcGFyZS4gU2hvdWxkIGJlIGEgdmFsaWRcbiAqIHZlcnNpb24gbnVtYmVyIHN1cHBvcnRlZCBieSBzZW12ZXIgcGFyc2VyLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdG9yIC0gT25lIG9mIHN1cHBvcnRlZCB2ZXJzaW9uIG51bWJlciBvcGVyYXRvcnM6XG4gKiA9PSwgIT0sID4sIDwsIDw9LCA+PSwgPVxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgb3IgZmFsc2UgZGVwZW5kaW5nIG9uIHRoZSBhY3R1YWwgY29tcGFyaXNvbiByZXN1bHRcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBhbiB1bnN1cHBvcnRlZCBvcGVyYXRvciBpcyBzdXBwbGllZCBvciBhbnkgb2YgdGhlIHN1cHBsaWVkXG4gKiB2ZXJzaW9uIHN0cmluZ3MgY2Fubm90IGJlIGNvZXJjZWRcbiAqL1xuZnVuY3Rpb24gY29tcGFyZVZlcnNpb25zICh2ZXIxLCBvcGVyYXRvciwgdmVyMikge1xuICBpZiAoIVNVUFBPUlRFRF9PUEVSQVRPUlMuaW5jbHVkZXMob3BlcmF0b3IpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJyR7b3BlcmF0b3J9JyBjb21wYXJpc29uIG9wZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQuIGAgK1xuICAgICAgYE9ubHkgJyR7SlNPTi5zdHJpbmdpZnkoU1VQUE9SVEVEX09QRVJBVE9SUyl9JyBvcGVyYXRvcnMgYXJlIHN1cHBvcnRlZGApO1xuICB9XG5cbiAgY29uc3Qgc2VtdmVyT3BlcmF0b3IgPSBbJz09JywgJyE9J10uaW5jbHVkZXMob3BlcmF0b3IpID8gJz0nIDogb3BlcmF0b3I7XG4gIGNvbnN0IHJlc3VsdCA9IHNlbXZlci5zYXRpc2ZpZXMoY29lcmNlVmVyc2lvbih2ZXIxKSwgYCR7c2VtdmVyT3BlcmF0b3J9JHtjb2VyY2VWZXJzaW9uKHZlcjIpfWApO1xuICByZXR1cm4gb3BlcmF0b3IgPT09ICchPScgPyAhcmVzdWx0IDogcmVzdWx0O1xufVxuXG4vKipcbiAqIEFkZCBhcHByb3ByaWF0ZSBxdW90ZXMgdG8gY29tbWFuZCBhcmd1bWVudHMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc3Vic3RhY2svbm9kZS1zaGVsbC1xdW90ZVxuICogZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBhcmd1bWVudHMsIHF1b3RlZFxuICovXG5mdW5jdGlvbiBxdW90ZSAoYXJncykge1xuICByZXR1cm4gc2hlbGxRdW90ZShfLmNhc3RBcnJheShhcmdzKSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgdG8gd29ya2Fyb3VuZCB1bmV4cGVjdGVkIG1lbW9yeSBsZWFrc1xuICogY2F1c2VkIGJ5IE5vZGVKUyBzdHJpbmcgaW50ZXJuaW5nXG4gKiBiZWhhdmlvciBkZXNjcmliZWQgaW4gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Mjg2OVxuICpcbiAqIEBwYXJhbSB7Kn0gcyAtIFRoZSBzdHJpbmcgdG8gdW5sZWFrXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEVpdGhlciB0aGUgdW5sZWFrZWQgc3RyaW5nIG9yIHRoZSBvcmlnaW5hbCBvYmplY3QgY29udmVydGVkIHRvIHN0cmluZ1xuICovXG5mdW5jdGlvbiB1bmxlYWtTdHJpbmcgKHMpIHtcbiAgcmV0dXJuIGAgJHtzfWAuc3Vic3RyKDEpO1xufVxuXG5cbi8qKlxuICogQHR5cGVkZWYgUGx1cmFsaXplT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbaW5jbHVzaXZlPWZhbHNlXSAtIFdoZXRoZXIgdG8gcHJlZml4IHdpdGggdGhlIG51bWJlciAoZS5nLiwgMyBkdWNrcylcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgZm9ybSBvZiBhIHdvcmQgYXBwcm9wcmlhdGUgdG8gdGhlIGNvdW50XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmQgLSBUaGUgd29yZCB0byBwbHVyYWxpemVcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIEhvdyBtYW55IG9mIHRoZSB3b3JkIGV4aXN0XG4gKiBAcGFyYW0ge1BsdXJhbGl6ZU9wdGlvbnN8Ym9vbGVhbn0gb3B0aW9ucyAtIG9wdGlvbnMgZm9yIHdvcmQgcGx1cmFsaXphdGlvbixcbiAqICAgb3IgYSBib29sZWFuIGluZGljYXRpbmcgdGhlIG9wdGlvbnMuaW5jbHVzaXZlIHByb3BlcnR5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgd29yZCBwbHVyYWxpemVkIGFjY29yZGluZyB0byB0aGUgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbGl6ZSAod29yZCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICBsZXQgaW5jbHVzaXZlID0gZmFsc2U7XG4gIGlmIChfLmlzQm9vbGVhbihvcHRpb25zKSkge1xuICAgIC8vIGlmIHBhc3NlZCBpbiBhcyBhIGJvb2xlYW5cbiAgICBpbmNsdXNpdmUgPSBvcHRpb25zO1xuICB9IGVsc2UgaWYgKF8uaXNCb29sZWFuKG9wdGlvbnM/LmluY2x1c2l2ZSkpIHtcbiAgICAvLyBpZiBwYXNzZWQgaW4gYXMgYW4gb3B0aW9ucyBoYXNoXG4gICAgaW5jbHVzaXZlID0gb3B0aW9ucy5pbmNsdXNpdmU7XG4gIH1cbiAgcmV0dXJuIHBsdXJhbGl6ZUxpYih3b3JkLCBjb3VudCwgaW5jbHVzaXZlKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBFbmNvZGluZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4U2l6ZT0xMDczNzQxODI0XSBUaGUgbWF4aW11bSBzaXplIG9mXG4gKiB0aGUgcmVzdWx0aW5nIGJ1ZmZlciBpbiBieXRlcy4gVGhpcyBpcyBzZXQgdG8gMUdCIGJ5IGRlZmF1bHQsIGJlY2F1c2VcbiAqIEFwcGl1bSBsaW1pdHMgdGhlIG1heGltdW0gSFRUUCBib2R5IHNpemUgdG8gMUdCLiBBbHNvLCB0aGUgTm9kZUpTIGhlYXBcbiAqIHNpemUgbXVzdCBiZSBlbm91Z2ggdG8ga2VlcCB0aGUgcmVzdWx0aW5nIG9iamVjdCAodXN1YWxseSB0aGlzIHNpemUgaXNcbiAqIGxpbWl0ZWQgdG8gMS40IEdCKVxuICovXG5cbi8qKlxuICogQ29udmVydHMgY29udGVudHMgb2YgYSBsb2NhbCBmaWxlIHRvIGFuIGluLW1lbW9yeSBiYXNlLTY0IGVuY29kZWQgYnVmZmVyLlxuICogVGhlIG9wZXJhdGlvbiBpcyBtZW1vcnktdXNhZ2UgZnJpZW5kbHkgYW5kIHNob3VsZCBiZSB1c2VkIHdoaWxlIGVuY29kaW5nXG4gKiBsYXJnZSBmaWxlcyB0byBiYXNlNjRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIGJlaW5nIGVuY29kZWRcbiAqIEBwYXJhbSB7RW5jb2RpbmdPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCdWZmZXI+fSBiYXNlNjQtZW5jb2RlZCBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZSBhcyBtZW1vcnkgYnVmZmVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJlYWRpbmcgdGhlIHNvdXJjZSBmaWxlXG4gKiBvciB0aGUgc291cmNlIGZpbGUgaXMgdG9vXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRvSW5NZW1vcnlCYXNlNjQgKHNyY1BhdGgsIG9wdHMgPSB7fSkge1xuICBpZiAoIShhd2FpdCBmcy5leGlzdHMoc3JjUGF0aCkpIHx8IChhd2FpdCBmcy5zdGF0KHNyY1BhdGgpKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIGZpbGU6ICR7c3JjUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBtYXhTaXplID0gMSAqIEdpQixcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IHJlc3VsdEJ1ZmZlcnMgPSBbXTtcbiAgbGV0IHJlc3VsdEJ1ZmZlcnNTaXplID0gMDtcbiAgY29uc3QgcmVzdWx0V3JpdGVTdHJlYW0gPSBuZXcgc3RyZWFtLldyaXRhYmxlKHtcbiAgICB3cml0ZTogKGJ1ZmZlciwgZW5jb2RpbmcsIG5leHQpID0+IHtcbiAgICAgIHJlc3VsdEJ1ZmZlcnMucHVzaChidWZmZXIpO1xuICAgICAgcmVzdWx0QnVmZmVyc1NpemUgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICAgIGlmIChtYXhTaXplID4gMCAmJiByZXN1bHRCdWZmZXJzU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgcmVzdWx0V3JpdGVTdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoYFRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgYCArXG4gICAgICAgICAgYGJ1ZmZlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gJHt0b1JlYWRhYmxlU2l6ZVN0cmluZyhtYXhTaXplKX1gKSk7XG4gICAgICB9XG4gICAgICBuZXh0KCk7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgcmVhZGVyU3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShzcmNQYXRoKTtcbiAgY29uc3QgYmFzZTY0RW5jb2RlclN0cmVhbSA9IG5ldyBCYXNlNjRFbmNvZGUoKTtcbiAgY29uc3QgcmVzdWx0V3JpdGVTdHJlYW1Qcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlc3VsdFdyaXRlU3RyZWFtLm9uY2UoJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgIHJlYWRlclN0cmVhbS51bnBpcGUoYmFzZTY0RW5jb2RlclN0cmVhbSk7XG4gICAgICBiYXNlNjRFbmNvZGVyU3RyZWFtLnVucGlwZShyZXN1bHRXcml0ZVN0cmVhbSk7XG4gICAgICByZWFkZXJTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgcmVqZWN0KGUpO1xuICAgIH0pO1xuICAgIHJlc3VsdFdyaXRlU3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIHJlc29sdmUpO1xuICB9KTtcbiAgY29uc3QgcmVhZFN0cmVhbVByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmVhZGVyU3RyZWFtLm9uY2UoJ2Nsb3NlJywgcmVzb2x2ZSk7XG4gICAgcmVhZGVyU3RyZWFtLm9uY2UoJ2Vycm9yJywgKGUpID0+IHJlamVjdChcbiAgICAgIG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlYWQgJyR7c3JjUGF0aH0nOiAke2UubWVzc2FnZX1gKSkpO1xuICB9KTtcbiAgcmVhZGVyU3RyZWFtLnBpcGUoYmFzZTY0RW5jb2RlclN0cmVhbSk7XG4gIGJhc2U2NEVuY29kZXJTdHJlYW0ucGlwZShyZXN1bHRXcml0ZVN0cmVhbSk7XG5cbiAgYXdhaXQgQi5hbGwoW3JlYWRTdHJlYW1Qcm9taXNlLCByZXN1bHRXcml0ZVN0cmVhbVByb21pc2VdKTtcbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQocmVzdWx0QnVmZmVycyk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgTG9ja0ZpbGVPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXQ9MTIwXSBUaGUgbWF4IHRpbWUgaW4gc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgbG9ja1xuICogQHByb3BlcnR5IHtib29sZWFufSBbdHJ5UmVjb3Zlcnk9ZmFsc2VdIFdoZXRoZXIgdG8gdHJ5IGxvY2sgcmVjb3ZlcnkgaWZcbiAqIHRoZSBmaXJzdCBhdHRlbXB0IHRvIGFjcXVpcmUgaXQgdGltZWQgb3V0LlxuICovXG5cbi8qKlxuICogQ3JlYXRlIGFuIGFzeW5jIGZ1bmN0aW9uIHdoaWNoLCB3aGVuIGNhbGxlZCwgd2lsbCBub3QgcHJvY2VlZCB1bnRpbCBhIGNlcnRhaW4gZmlsZSBpcyBub1xuICogbG9uZ2VyIHByZXNlbnQgb24gdGhlIHN5c3RlbS4gVGhpcyBhbGxvd3MgZm9yIHByZXZlbnRpbmcgY29uY3VycmVudCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzXG4gKiB1c2luZyBhIGtub3duIGxvY2tmaWxlIHBhdGguXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NrRmlsZSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIHVzZWQgZm9yIHRoZSBsb2NrXG4gKiBAcGFyYW0ge0xvY2tGaWxlT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMgYXN5bmMgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbm90aGVyIGFzeW5jIGZ1bmN0aW9uIGRlZmluaW5nIHRoZSBsb2NrZWRcbiAqIGJlaGF2aW9yXG4gKi9cbmZ1bmN0aW9uIGdldExvY2tGaWxlR3VhcmQgKGxvY2tGaWxlLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRpbWVvdXQgPSAxMjAsXG4gICAgdHJ5UmVjb3ZlcnkgPSBmYWxzZSxcbiAgfSA9IG9wdHM7XG5cbiAgY29uc3QgbG9jayA9IC8qKiBAdHlwZSB7KGxvY2tmaWxlOiBzdHJpbmcsIG9wdHM6IGltcG9ydCgnbG9ja2ZpbGUnKS5PcHRpb25zKT0+Qjx2b2lkPn0gKi8oQi5wcm9taXNpZnkoX2xvY2tmaWxlLmxvY2spKTtcbiAgY29uc3QgY2hlY2sgPSBCLnByb21pc2lmeShfbG9ja2ZpbGUuY2hlY2spO1xuICBjb25zdCB1bmxvY2sgPSBCLnByb21pc2lmeShfbG9ja2ZpbGUudW5sb2NrKTtcblxuICAvKipcbiAgICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IFR9IGJlaGF2aW9yXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fVxuICAgKi9cbiAgY29uc3QgZ3VhcmQgPSBhc3luYyAoYmVoYXZpb3IpID0+IHtcbiAgICBsZXQgdHJpZWRSZWNvdmVyeSA9IGZhbHNlO1xuICAgIGRvIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGlmIHRoZSBsb2NrZmlsZSBkb2Vzbid0IGV4aXN0LCBsb2NrIGl0IHN5bmNocm9ub3VzbHkgdG8gbWFrZSBzdXJlIG5vIG90aGVyIGNhbGxcbiAgICAgICAgLy8gb24gdGhlIHNhbWUgc3BpbiBvZiB0aGUgZXZlbnQgbG9vcCBjYW4gYWxzbyBpbml0aWF0ZSBhIGxvY2suIElmIHRoZSBsb2NrZmlsZSBkb2VzIGV4aXN0XG4gICAgICAgIC8vIHRoZW4ganVzdCB1c2UgdGhlIHJlZ3VsYXIgYXN5bmMgJ2xvY2snIG1ldGhvZCB3aGljaCB3aWxsIHdhaXQgb24gdGhlIGxvY2suXG4gICAgICAgIGlmIChfbG9ja2ZpbGUuY2hlY2tTeW5jKGxvY2tGaWxlKSkge1xuICAgICAgICAgIGF3YWl0IGxvY2sobG9ja0ZpbGUsIHt3YWl0OiB0aW1lb3V0ICogMTAwMH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9sb2NrZmlsZS5sb2NrU3luYyhsb2NrRmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChfLmluY2x1ZGVzKGUubWVzc2FnZSwgJ0VFWElTVCcpICYmIHRyeVJlY292ZXJ5ICYmICF0cmllZFJlY292ZXJ5KSB7XG4gICAgICAgICAgLy8gVGhlcmUgY291bGQgYmUgY2FzZXMgd2hlcmUgYSBwcm9jZXNzIGhhcyBiZWVuIGZvcmNlZnVsbHkgdGVybWluYXRlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgYSBjaGFuY2UgdG8gY2xlYW4gdXAgcGVuZGluZyBsb2NrczogaHR0cHM6Ly9naXRodWIuY29tL25wbS9sb2NrZmlsZS9pc3N1ZXMvMjZcbiAgICAgICAgICBfbG9ja2ZpbGUudW5sb2NrU3luYyhsb2NrRmlsZSk7XG4gICAgICAgICAgdHJpZWRSZWNvdmVyeSA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgYWNxdWlyZSBsb2NrIG9uICcke2xvY2tGaWxlfScgYWZ0ZXIgJHt0aW1lb3V0fXMuIGAgK1xuICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgIH0gd2hpbGUgKHRydWUpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYmVoYXZpb3IoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gd2hldGhlciB0aGUgYmVoYXZpb3Igc3VjY2VlZGVkIG9yIG5vdCwgZ2V0IHJpZCBvZiB0aGUgbG9ja1xuICAgICAgYXdhaXQgdW5sb2NrKGxvY2tGaWxlKTtcbiAgICB9XG4gIH07XG5cbiAgZ3VhcmQuY2hlY2sgPSBhc3luYyAoKSA9PiBhd2FpdCBjaGVjayhsb2NrRmlsZSk7XG5cbiAgcmV0dXJuIGd1YXJkO1xufVxuXG5leHBvcnQge1xuICBoYXNWYWx1ZSwgZXNjYXBlU3BhY2UsIGVzY2FwZVNwZWNpYWxDaGFycywgbG9jYWxJcCwgY2FuY2VsbGFibGVEZWxheSxcbiAgbXVsdGlSZXNvbHZlLCBzYWZlSnNvblBhcnNlLCB3cmFwRWxlbWVudCwgdW53cmFwRWxlbWVudCwgZmlsdGVyT2JqZWN0LFxuICB0b1JlYWRhYmxlU2l6ZVN0cmluZywgaXNTdWJQYXRoLCBXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUixcbiAgaXNTYW1lRGVzdGluYXRpb24sIGNvbXBhcmVWZXJzaW9ucywgY29lcmNlVmVyc2lvbiwgcXVvdGUsIHVubGVha1N0cmluZyxcbiAganNvblN0cmluZ2lmeSwgcGx1cmFsaXplLCBHaUIsIE1pQiwgS2lCLCB0b0luTWVtb3J5QmFzZTY0LFxuICB1dWlkVjEsIHV1aWRWMywgdXVpZFY0LCB1dWlkVjUsIHNoZWxsUGFyc2UsIGdldExvY2tGaWxlR3VhcmRcbn07XG4iXX0=
@@ -0,0 +1,180 @@
1
+ declare namespace _default {
2
+ export { extractAllTo };
3
+ export { readEntries };
4
+ export { toInMemoryZip };
5
+ export { assertValidZip };
6
+ export { toArchive };
7
+ }
8
+ export default _default;
9
+ export type ExtractAllOptions = {
10
+ /**
11
+ * The encoding to use for extracted file names.
12
+ * For ZIP archives created on MacOS it is usually expected to be `utf8`.
13
+ * By default it is autodetected based on the entry metadata and is only needed to be set explicitly
14
+ * if the particular archive does not comply to the standards, which leads to corrupted file names
15
+ * after extraction. Only applicable if system unzip binary is NOT being used.
16
+ */
17
+ fileNamesEncoding: string | null;
18
+ /**
19
+ * [false] If true, attempt to use system unzip; if this fails,
20
+ * fallback to the JS unzip implementation.
21
+ */
22
+ useSystemUnzip: boolean | null;
23
+ };
24
+ export type ZipEntry = {
25
+ /**
26
+ * The actual entry instance
27
+ */
28
+ entry: yauzl.Entry;
29
+ /**
30
+ * An async function, which accepts one parameter.
31
+ * This parameter contains the destination folder path to which this function is going to extract the entry.
32
+ */
33
+ extractEntryTo: Function;
34
+ };
35
+ export type ZipOptions = {
36
+ /**
37
+ * [false] Whether to encode
38
+ * the resulting archive to a base64-encoded string
39
+ */
40
+ encodeToBase64: boolean;
41
+ /**
42
+ * [true] Whether to log the actual
43
+ * archiver performance
44
+ */
45
+ isMetered: boolean;
46
+ /**
47
+ * [1073741824] The maximum size of
48
+ * the resulting archive in bytes. This is set to 1GB by default, because
49
+ * Appium limits the maximum HTTP body size to 1GB. Also, the NodeJS heap
50
+ * size must be enough to keep the resulting object (usually this size is
51
+ * limited to 1.4 GB)
52
+ */
53
+ maxSize: number;
54
+ /**
55
+ * [9] The compression level. The maximum
56
+ * level is 9 (the best compression, worst performance). The minimum
57
+ * compression level is 0 (no compression).
58
+ */
59
+ level: number;
60
+ };
61
+ export type ZipCompressionOptions = {
62
+ /**
63
+ * [9] - Compression level in range 0..9
64
+ * (greater numbers mean better compression, but longer processing time)
65
+ */
66
+ level: number;
67
+ };
68
+ export type ZipSourceOptions = {
69
+ /**
70
+ * ['**\/*'] - GLOB pattern for compression
71
+ */
72
+ pattern: string;
73
+ /**
74
+ * - The source root folder (the parent folder of
75
+ * the destination file by default)
76
+ */
77
+ cwd: string;
78
+ /**
79
+ * - The list of ignored patterns
80
+ */
81
+ ignore?: string[] | undefined;
82
+ };
83
+ /**
84
+ * @typedef ExtractAllOptions
85
+ * @property {?string} fileNamesEncoding The encoding to use for extracted file names.
86
+ * For ZIP archives created on MacOS it is usually expected to be `utf8`.
87
+ * By default it is autodetected based on the entry metadata and is only needed to be set explicitly
88
+ * if the particular archive does not comply to the standards, which leads to corrupted file names
89
+ * after extraction. Only applicable if system unzip binary is NOT being used.
90
+ * @property {?boolean} useSystemUnzip [false] If true, attempt to use system unzip; if this fails,
91
+ * fallback to the JS unzip implementation.
92
+ */
93
+ /**
94
+ * Extract zipfile to a directory
95
+ *
96
+ * @param {string} zipFilePath The full path to the source ZIP file
97
+ * @param {string} destDir The full path to the destination folder
98
+ * @param {ExtractAllOptions} [opts]
99
+ */
100
+ export function extractAllTo(zipFilePath: string, destDir: string, opts?: ExtractAllOptions | undefined): Promise<void>;
101
+ /**
102
+ * @typedef ZipEntry
103
+ * @property {yauzl.Entry} entry The actual entry instance
104
+ * @property {function} extractEntryTo An async function, which accepts one parameter.
105
+ * This parameter contains the destination folder path to which this function is going to extract the entry.
106
+ */
107
+ /**
108
+ * Get entries for a zip folder
109
+ *
110
+ * @param {string} zipFilePath The full path to the source ZIP file
111
+ * @param {function} onEntry Callback when entry is read.
112
+ * The callback is expected to accept one argument of ZipEntry type.
113
+ * The iteration through the source zip file will bi terminated as soon as
114
+ * the result of this function equals to `false`.
115
+ */
116
+ export function readEntries(zipFilePath: string, onEntry: Function): Promise<any>;
117
+ /**
118
+ * @typedef ZipOptions
119
+ * @property {boolean} encodeToBase64 [false] Whether to encode
120
+ * the resulting archive to a base64-encoded string
121
+ * @property {boolean} isMetered [true] Whether to log the actual
122
+ * archiver performance
123
+ * @property {number} maxSize [1073741824] The maximum size of
124
+ * the resulting archive in bytes. This is set to 1GB by default, because
125
+ * Appium limits the maximum HTTP body size to 1GB. Also, the NodeJS heap
126
+ * size must be enough to keep the resulting object (usually this size is
127
+ * limited to 1.4 GB)
128
+ * @property {number} level [9] The compression level. The maximum
129
+ * level is 9 (the best compression, worst performance). The minimum
130
+ * compression level is 0 (no compression).
131
+ */
132
+ /**
133
+ * Converts contents of local directory to an in-memory .zip buffer
134
+ *
135
+ * @param {string} srcPath The full path to the folder or file being zipped
136
+ * @param {ZipOptions} opts Zipping options
137
+ * @returns {Promise<Buffer>} Zipped (and encoded if `encodeToBase64` is truthy)
138
+ * content of the source path as memory buffer
139
+ * @throws {Error} if there was an error while reading the source
140
+ * or the source is too big
141
+ */
142
+ export function toInMemoryZip(srcPath: string, opts?: ZipOptions): Promise<Buffer>;
143
+ /**
144
+ * Extract a single zip entry to a directory
145
+ *
146
+ * @param {yauzl.ZipFile} zipFile The source ZIP stream
147
+ * @param {yauzl.Entry} entry The entry instance
148
+ * @param {string} destDir The full path to the destination folder
149
+ */
150
+ export function _extractEntryTo(zipFile: yauzl.ZipFile, entry: yauzl.Entry, destDir: string): Promise<[any, any] | undefined>;
151
+ /**
152
+ * Verifies whether the given file is a valid ZIP archive
153
+ *
154
+ * @param {string} filePath - Full path to the file
155
+ * @throws {Error} If the file does not exist or is not a valid ZIP archive
156
+ */
157
+ export function assertValidZip(filePath: string): Promise<boolean>;
158
+ /**
159
+ * @typedef ZipCompressionOptions
160
+ * @property {number} level [9] - Compression level in range 0..9
161
+ * (greater numbers mean better compression, but longer processing time)
162
+ */
163
+ /**
164
+ * @typedef ZipSourceOptions
165
+ * @property {string} pattern ['**\/*'] - GLOB pattern for compression
166
+ * @property {string} cwd - The source root folder (the parent folder of
167
+ * the destination file by default)
168
+ * @property {string[]} [ignore] - The list of ignored patterns
169
+ */
170
+ /**
171
+ * Creates an archive based on the given glob pattern
172
+ *
173
+ * @param {string} dstPath - The resulting archive path
174
+ * @param {ZipSourceOptions} src - Source options
175
+ * @param {ZipCompressionOptions} opts - Compression options
176
+ * @throws {Error} If there was an error while creating the archive
177
+ */
178
+ export function toArchive(dstPath: string, src?: ZipSourceOptions, opts?: ZipCompressionOptions): Promise<any>;
179
+ import yauzl from "yauzl";
180
+ //# sourceMappingURL=zip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../../lib/zip.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;uBAsLe,MAAM;;;;;oBAKN,OAAO;;;;;;WAwHR,MAAM,KAAK;;;;;;;;;;;;oBAyCX,OAAO;;;;;eAEP,OAAO;;;;;;;;aAEP,MAAM;;;;;;WAKN,MAAM;;;;;;;WAmIN,MAAM;;;;;;aAMN,MAAM;;;;;SACN,MAAM;;;;;;AA3TpB;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,0CAJW,MAAM,WACN,MAAM,uDAuBhB;AAuFD;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,yCANW,MAAM,mCA6BhB;AAED;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;GASG;AACH,uCAPW,MAAM,SACN,UAAU,GACR,QAAQ,MAAM,CAAC,CAuF3B;AAlMD;;;;;;GAMG;AACH,yCAJW,MAAM,OAAO,SACb,MAAM,KAAK,WACX,MAAM,mCAsChB;AAyJD;;;;;GAKG;AACH,yCAHW,MAAM,oBAyBhB;AAED;;;;GAIG;AAEH;;;;;;GAMG;AAEH;;;;;;;GAOG;AACH,mCALW,MAAM,QACN,gBAAgB,SAChB,qBAAqB,gBAgC/B"}