babylonjs-procedural-textures 7.31.1 → 7.32.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.
@@ -1758,6 +1758,7 @@ __webpack_require__.r(__webpack_exports__);
1758
1758
  /* harmony export */ __propKey: () => (/* binding */ __propKey),
1759
1759
  /* harmony export */ __read: () => (/* binding */ __read),
1760
1760
  /* harmony export */ __rest: () => (/* binding */ __rest),
1761
+ /* harmony export */ __rewriteRelativeImportExtension: () => (/* binding */ __rewriteRelativeImportExtension),
1761
1762
  /* harmony export */ __runInitializers: () => (/* binding */ __runInitializers),
1762
1763
  /* harmony export */ __setFunctionName: () => (/* binding */ __setFunctionName),
1763
1764
  /* harmony export */ __spread: () => (/* binding */ __spread),
@@ -2115,12 +2116,25 @@ function __disposeResources(env) {
2115
2116
  return next();
2116
2117
  }
2117
2118
 
2119
+ function __rewriteRelativeImportExtension(path, preserveJsx) {
2120
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
2121
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
2122
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
2123
+ });
2124
+ }
2125
+ return path;
2126
+ }
2127
+
2118
2128
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
2119
2129
  __extends,
2120
2130
  __assign,
2121
2131
  __rest,
2122
2132
  __decorate,
2123
2133
  __param,
2134
+ __esDecorate,
2135
+ __runInitializers,
2136
+ __propKey,
2137
+ __setFunctionName,
2124
2138
  __metadata,
2125
2139
  __awaiter,
2126
2140
  __generator,
@@ -2143,6 +2157,7 @@ function __disposeResources(env) {
2143
2157
  __classPrivateFieldIn,
2144
2158
  __addDisposableResource,
2145
2159
  __disposeResources,
2160
+ __rewriteRelativeImportExtension,
2146
2161
  });
2147
2162
 
2148
2163
 
@@ -2229,6 +2244,8 @@ function __disposeResources(env) {
2229
2244
  /******/
2230
2245
  /************************************************************************/
2231
2246
  var __webpack_exports__ = {};
2247
+ // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
2248
+ (() => {
2232
2249
  /*!**********************!*\
2233
2250
  !*** ./src/index.ts ***!
2234
2251
  \**********************/
@@ -2242,9 +2259,11 @@ __webpack_require__.r(__webpack_exports__);
2242
2259
 
2243
2260
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_lts_procedural_textures_legacy_legacy__WEBPACK_IMPORTED_MODULE_0__);
2244
2261
 
2262
+ })();
2263
+
2245
2264
  __webpack_exports__ = __webpack_exports__["default"];
2246
2265
  /******/ return __webpack_exports__;
2247
2266
  /******/ })()
2248
2267
  ;
2249
2268
  });
2250
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbmpzLnByb2NlZHVyYWxUZXh0dXJlcy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUVBO0FBQ0E7QUFjQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFBQTtBQU1BO0FBQUE7QUFBQTtBQUxBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQU9BOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQWxFQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFtQ0E7QUFBQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbkdBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFFQTtBQUNBO0FBWUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkJBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFHQTtBQUVBO0FBQUE7QUFNQTtBQUFBO0FBQUE7QUFMQTtBQUNBO0FBQ0E7QUFDQTtBQUlBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFsRUE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBbUNBO0FBQUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQ25HQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBRUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFBQTtBQU9BO0FBQUE7QUFBQTtBQU5BO0FBQ0E7QUFDQTtBQUVBO0FBSUE7QUFDQTs7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7OztBQUFBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUpBO0FBTUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUF0RkE7QUFEQTtBQUdBO0FBZ0JBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQStDQTtBQUFBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4SkE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFVQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqQkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFBQTtBQUlBO0FBQUE7QUFBQTtBQUZBO0FBS0E7QUFFQTs7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFoREE7QUFEQTtBQUdBO0FBK0NBO0FBQUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQzNGQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNWQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBRUE7QUFDQTtBQWtCQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6QkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFBQTtBQU1BO0FBQUE7QUFBQTtBQUxBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQU9BOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQWxFQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFtQ0E7QUFBQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbkdBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWkE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFFQTs7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBT0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBcENBO0FBREE7QUFHQTtBQW1DQTtBQUFBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRkE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFpREE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeERBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUFBO0FBWUE7QUFBQTtBQUFBO0FBVkE7QUFHQTtBQUdBO0FBRUE7QUFJQTs7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBcEVBO0FBREE7QUFDQTtBQUdBO0FBREE7QUFDQTtBQUdBO0FBREE7QUFDQTtBQStEQTtBQUFBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRkE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFXQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsQkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUZBO0FBSUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQU9BOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQXBDQTtBQURBO0FBR0E7QUFtQ0E7QUFBQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDOURBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFFQTtBQUNBO0FBZ0JBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZCQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFBQTtBQWFBO0FBQUE7QUFBQTtBQVpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTs7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQU9BOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQXhJQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFtQ0E7QUFBQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDckxBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFFQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakJBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQUE7QUFJQTtBQUFBO0FBQUE7QUFIQTtBQUNBO0FBSUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUE5Q0E7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBbUNBO0FBQUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFFQTtBQUNBO0FBRUE7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQ2pCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDelhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9icmljay9icmlja1Byb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9icmljay9icmlja1Byb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9icmljay9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvY2xvdWQvY2xvdWRQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvY2xvdWQvY2xvdWRQcm9jZWR1cmFsVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvY2xvdWQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2ZpcmUvZmlyZVByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9maXJlL2ZpcmVQcm9jZWR1cmFsVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvZmlyZS9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvZ3Jhc3MvZ3Jhc3NQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvZ3Jhc3MvZ3Jhc3NQcm9jZWR1cmFsVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvZ3Jhc3MvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2luZGV4LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9tYXJibGUvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL21hcmJsZS9tYXJibGVQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvbWFyYmxlL21hcmJsZVByb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9ub3JtYWxNYXAvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL25vcm1hbE1hcC9ub3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvbm9ybWFsTWFwL25vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9wZXJsaW5Ob2lzZS9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvcGVybGluTm9pc2UvcGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvcGVybGluTm9pc2UvcGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvcm9hZC9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvcm9hZC9yb2FkUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnQudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL3JvYWQvcm9hZFByb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9zdGFyZmllbGQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL3N0YXJmaWVsZC9zdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvc3RhcmZpZWxkL3N0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy93b29kL2luZGV4LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy93b29kL3dvb2RQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvd29vZC93b29kUHJvY2VkdXJhbFRleHR1cmUudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2x0cy9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2xlZ2FjeS9sZWdhY3kudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTL2V4dGVybmFsIHVtZCB7XCJyb290XCI6XCJCQUJZTE9OXCIsXCJjb21tb25qc1wiOlwiYmFieWxvbmpzXCIsXCJjb21tb25qczJcIjpcImJhYnlsb25qc1wiLFwiYW1kXCI6XCJiYWJ5bG9uanNcIn0iLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiYmFieWxvbmpzXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiYmFieWxvbmpzLXByb2NlZHVyYWwtdGV4dHVyZXNcIiwgW1wiYmFieWxvbmpzXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImJhYnlsb25qcy1wcm9jZWR1cmFsLXRleHR1cmVzXCJdID0gZmFjdG9yeShyZXF1aXJlKFwiYmFieWxvbmpzXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJQUk9DRURVUkFMVEVYVFVSRVNcIl0gPSBmYWN0b3J5KHJvb3RbXCJCQUJZTE9OXCJdKTtcbn0pKCh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdGhpcyksIChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NaXNjX2RlY29yYXRvcnNfXykgPT4ge1xucmV0dXJuICIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcImJyaWNrUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHByZWNpc2lvbiBoaWdocCBmbG9hdDt2YXJ5aW5nIHZlYzIgdlBvc2l0aW9uO3ZhcnlpbmcgdmVjMiB2VVY7dW5pZm9ybSBmbG9hdCBudW1iZXJPZkJyaWNrc0hlaWdodDt1bmlmb3JtIGZsb2F0IG51bWJlck9mQnJpY2tzV2lkdGg7dW5pZm9ybSB2ZWMzIGJyaWNrQ29sb3I7dW5pZm9ybSB2ZWMzIGpvaW50Q29sb3I7ZmxvYXQgcmFuZCh2ZWMyIG4pIHtyZXR1cm4gZnJhY3QoY29zKGRvdChuLHZlYzIoMTIuOTg5OCw0LjE0MTQpKSkqNDM3NTguNTQ1Myk7fVxuZmxvYXQgbm9pc2UodmVjMiBuKSB7Y29uc3QgdmVjMiBkPXZlYzIoMC4wLDEuMCk7dmVjMiBiPWZsb29yKG4pLGY9c21vb3Roc3RlcCh2ZWMyKDAuMCksdmVjMigxLjApLGZyYWN0KG4pKTtyZXR1cm4gbWl4KG1peChyYW5kKGIpLHJhbmQoYitkLnl4KSxmLngpLG1peChyYW5kKGIrZC54eSkscmFuZChiK2QueXkpLGYueCksZi55KTt9XG5mbG9hdCBmYm0odmVjMiBuKSB7ZmxvYXQgdG90YWw9MC4wLGFtcGxpdHVkZT0xLjA7Zm9yIChpbnQgaT0wOyBpPDQ7IGkrKykge3RvdGFsKz1ub2lzZShuKSphbXBsaXR1ZGU7bis9bjthbXBsaXR1ZGUqPTAuNTt9XG5yZXR1cm4gdG90YWw7fVxuZmxvYXQgcm91bmRGKGZsb2F0IG51bWJlcil7cmV0dXJuIHNpZ24obnVtYmVyKSpmbG9vcihhYnMobnVtYmVyKSswLjUpO31cbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX0RFRklOSVRJT05TXG52b2lkIG1haW4odm9pZClcbntmbG9hdCBicmlja1c9MS4wL251bWJlck9mQnJpY2tzV2lkdGg7ZmxvYXQgYnJpY2tIPTEuMC9udW1iZXJPZkJyaWNrc0hlaWdodDtmbG9hdCBqb2ludFdQZXJjZW50YWdlPTAuMDE7ZmxvYXQgam9pbnRIUGVyY2VudGFnZT0wLjA1O3ZlYzMgY29sb3I9YnJpY2tDb2xvcjtmbG9hdCB5aT12VVYueS9icmlja0g7ZmxvYXQgbnlpPXJvdW5kRih5aSk7ZmxvYXQgeGk9dlVWLngvYnJpY2tXO2lmIChtb2QoZmxvb3IoeWkpLDIuMCk9PTAuMCl7eGk9eGktMC41O31cbmZsb2F0IG54aT1yb3VuZEYoeGkpO3ZlYzIgYnJpY2t2VVY9dmVjMigoeGktZmxvb3IoeGkpKS9icmlja0gsKHlpLWZsb29yKHlpKSkvIGJyaWNrVyk7aWYgKHlpPG55aStqb2ludEhQZXJjZW50YWdlICYmIHlpPm55aS1qb2ludEhQZXJjZW50YWdlKXtjb2xvcj1taXgoam9pbnRDb2xvcix2ZWMzKDAuMzcsMC4yNSwwLjI1KSwoeWktbnlpKS9qb2ludEhQZXJjZW50YWdlKzAuMik7fVxuZWxzZSBpZiAoeGk8bnhpK2pvaW50V1BlcmNlbnRhZ2UgJiYgeGk+bnhpLWpvaW50V1BlcmNlbnRhZ2Upe2NvbG9yPW1peChqb2ludENvbG9yLHZlYzMoMC40NCwwLjQ0LDAuNDQpLCh4aS1ueGkpL2pvaW50V1BlcmNlbnRhZ2UrMC4yKTt9XG5lbHNlIHtmbG9hdCBicmlja0NvbG9yU3dpdGNoPW1vZChmbG9vcih5aSkrZmxvb3IoeGkpLDMuMCk7aWYgKGJyaWNrQ29sb3JTd2l0Y2g9PTAuMClcbmNvbG9yPW1peChjb2xvcix2ZWMzKDAuMzMsMC4zMywwLjMzKSwwLjMpO2Vsc2UgaWYgKGJyaWNrQ29sb3JTd2l0Y2g9PTIuMClcbmNvbG9yPW1peChjb2xvcix2ZWMzKDAuMTEsMC4xMSwwLjExKSwwLjMpO31cbmdsX0ZyYWdDb2xvcj12ZWM0KGNvbG9yLDEuMCk7fWA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3QgYnJpY2tQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImltcG9ydCB7IHNlcmlhbGl6ZSwgc2VyaWFsaXplQXNDb2xvcjMgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB7IENvbG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJhbFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvUHJvY2VkdXJhbHMvcHJvY2VkdXJhbFRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuXHJcbmltcG9ydCBcIi4vYnJpY2tQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJyaWNrUHJvY2VkdXJhbFRleHR1cmUgZXh0ZW5kcyBQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICBwcml2YXRlIF9udW1iZXJPZkJyaWNrc0hlaWdodDogbnVtYmVyID0gMTU7XHJcbiAgICBwcml2YXRlIF9udW1iZXJPZkJyaWNrc1dpZHRoOiBudW1iZXIgPSA1O1xyXG4gICAgcHJpdmF0ZSBfam9pbnRDb2xvciA9IG5ldyBDb2xvcjMoMC43MiwgMC43MiwgMC43Mik7XHJcbiAgICBwcml2YXRlIF9icmlja0NvbG9yID0gbmV3IENvbG9yMygwLjc3LCAwLjQ3LCAwLjQpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBzY2VuZTogTnVsbGFibGU8U2NlbmU+ID0gbnVsbCwgZmFsbGJhY2tUZXh0dXJlPzogVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzPzogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHNpemUsIFwiYnJpY2tQcm9jZWR1cmFsVGV4dHVyZVwiLCBzY2VuZSwgZmFsbGJhY2tUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHMpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2hhZGVyVW5pZm9ybXMoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcIm51bWJlck9mQnJpY2tzSGVpZ2h0XCIsIHRoaXMuX251bWJlck9mQnJpY2tzSGVpZ2h0KTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwibnVtYmVyT2ZCcmlja3NXaWR0aFwiLCB0aGlzLl9udW1iZXJPZkJyaWNrc1dpZHRoKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImJyaWNrQ29sb3JcIiwgdGhpcy5fYnJpY2tDb2xvcik7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJqb2ludENvbG9yXCIsIHRoaXMuX2pvaW50Q29sb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBudW1iZXJPZkJyaWNrc0hlaWdodCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJPZkJyaWNrc0hlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IG51bWJlck9mQnJpY2tzSGVpZ2h0KHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9udW1iZXJPZkJyaWNrc0hlaWdodCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgbnVtYmVyT2ZCcmlja3NXaWR0aCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJPZkJyaWNrc1dpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgbnVtYmVyT2ZCcmlja3NXaWR0aCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fbnVtYmVyT2ZCcmlja3NXaWR0aCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplQXNDb2xvcjMoKVxyXG4gICAgcHVibGljIGdldCBqb2ludENvbG9yKCk6IENvbG9yMyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2pvaW50Q29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBqb2ludENvbG9yKHZhbHVlOiBDb2xvcjMpIHtcclxuICAgICAgICB0aGlzLl9qb2ludENvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemVBc0NvbG9yMygpXHJcbiAgICBwdWJsaWMgZ2V0IGJyaWNrQ29sb3IoKTogQ29sb3IzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYnJpY2tDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGJyaWNrQ29sb3IodmFsdWU6IENvbG9yMykge1xyXG4gICAgICAgIHRoaXMuX2JyaWNrQ29sb3IgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXJpYWxpemVzIHRoaXMgYnJpY2sgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgYnJpY2sgcHJvY2VkdXJhbCB0ZXh0dXJlIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk9iamVjdCA9IFNlcmlhbGl6YXRpb25IZWxwZXIuU2VyaWFsaXplKHRoaXMsIHN1cGVyLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmN1c3RvbVR5cGUgPSBcIkJBQllMT04uQnJpY2tQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5cclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbk9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBCcmljayBQcm9jZWR1cmFsIFRleHR1cmUgZnJvbSBwYXJzZWQgYnJpY2sgcHJvY2VkdXJhbCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBwYXJzZWRUZXh0dXJlIGRlZmluZXMgcGFyc2VkIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHNjZW5lIGRlZmluZXMgdGhlIGN1cnJlbnQgc2NlbmVcclxuICAgICAqIEBwYXJhbSByb290VXJsIGRlZmluZXMgdGhlIHJvb3QgVVJMIGNvbnRhaW5pbmcgYnJpY2sgcHJvY2VkdXJhbCB0ZXh0dXJlIGluZm9ybWF0aW9uXHJcbiAgICAgKiBAcmV0dXJucyBhIHBhcnNlZCBCcmljayBQcm9jZWR1cmFsIFRleHR1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBQYXJzZShwYXJzZWRUZXh0dXJlOiBhbnksIHNjZW5lOiBTY2VuZSwgcm9vdFVybDogc3RyaW5nKTogQnJpY2tQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IFNlcmlhbGl6YXRpb25IZWxwZXIuUGFyc2UoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBCcmlja1Byb2NlZHVyYWxUZXh0dXJlKHBhcnNlZFRleHR1cmUubmFtZSwgcGFyc2VkVGV4dHVyZS5fc2l6ZSwgc2NlbmUsIHVuZGVmaW5lZCwgcGFyc2VkVGV4dHVyZS5fZ2VuZXJhdGVNaXBNYXBzKSxcclxuICAgICAgICAgICAgcGFyc2VkVGV4dHVyZSxcclxuICAgICAgICAgICAgc2NlbmUsXHJcbiAgICAgICAgICAgIHJvb3RVcmxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH1cclxufVxyXG5cclxuUmVnaXN0ZXJDbGFzcyhcIkJBQllMT04uQnJpY2tQcm9jZWR1cmFsVGV4dHVyZVwiLCBCcmlja1Byb2NlZHVyYWxUZXh0dXJlKTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vYnJpY2tQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJjbG91ZFByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dmFyeWluZyB2ZWMyIHZVVjt1bmlmb3JtIHZlYzQgc2t5Q29sb3I7dW5pZm9ybSB2ZWM0IGNsb3VkQ29sb3I7dW5pZm9ybSBmbG9hdCBhbXBsaXR1ZGU7dW5pZm9ybSBpbnQgbnVtT2N0YXZlcztmbG9hdCByYW5kKHZlYzIgbikge3JldHVybiBmcmFjdChjb3MoZG90KG4sdmVjMigxMi45ODk4LDQuMTQxNCkpKSo0Mzc1OC41NDUzKTt9XG5mbG9hdCBub2lzZSh2ZWMyIG4pIHtjb25zdCB2ZWMyIGQ9dmVjMigwLjAsMS4wKTt2ZWMyIGI9Zmxvb3IobiksZj1zbW9vdGhzdGVwKHZlYzIoMC4wKSx2ZWMyKDEuMCksZnJhY3QobikpO3JldHVybiBtaXgobWl4KHJhbmQoYikscmFuZChiK2QueXgpLGYueCksbWl4KHJhbmQoYitkLnh5KSxyYW5kKGIrZC55eSksZi54KSxmLnkpO31cbmZsb2F0IGZibSh2ZWMyIG4pIHtmbG9hdCB0b3RhbD0wLjAsYW1wbD1hbXBsaXR1ZGU7XG4jaWZkZWYgV0VCR0wyXG5mb3IgKGludCBpPTA7IGk8bnVtT2N0YXZlczsgaSsrKSB7XG4jZWxzZVxuZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykge1xuI2VuZGlmXG50b3RhbCs9bm9pc2UobikqYW1wbDtuKz1uO2FtcGwqPTAuNTt9XG5yZXR1cm4gdG90YWw7fVxudm9pZCBtYWluKCkge3ZlYzIgcD12VVYqMTIuMDt2ZWM0IGM9bWl4KHNreUNvbG9yLGNsb3VkQ29sb3IsZmJtKHApKTtnbF9GcmFnQ29sb3I9Yzt9XG5gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IGNsb3VkUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgeyBzZXJpYWxpemUsIHNlcmlhbGl6ZUFzQ29sb3I0IH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzXCI7XHJcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25IZWxwZXIgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnMuc2VyaWFsaXphdGlvblwiO1xyXG5pbXBvcnQgeyBDb2xvcjQgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLmNvbG9yXCI7XHJcbmltcG9ydCB0eXBlIHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyYWxUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL1Byb2NlZHVyYWxzL3Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBSZWdpc3RlckNsYXNzIH0gZnJvbSBcImNvcmUvTWlzYy90eXBlU3RvcmVcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcblxyXG5pbXBvcnQgXCIuL2Nsb3VkUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDbG91ZFByb2NlZHVyYWxUZXh0dXJlIGV4dGVuZHMgUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgcHJpdmF0ZSBfc2t5Q29sb3IgPSBuZXcgQ29sb3I0KDAuMTUsIDAuNjgsIDEuMCwgMS4wKTtcclxuICAgIHByaXZhdGUgX2Nsb3VkQ29sb3IgPSBuZXcgQ29sb3I0KDEsIDEsIDEsIDEuMCk7XHJcbiAgICBwcml2YXRlIF9hbXBsaXR1ZGUgPSAxO1xyXG4gICAgcHJpdmF0ZSBfbnVtT2N0YXZlcyA9IDQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJjbG91ZFByb2NlZHVyYWxUZXh0dXJlXCIsIHNjZW5lLCBmYWxsYmFja1RleHR1cmUsIGdlbmVyYXRlTWlwTWFwcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTaGFkZXJVbmlmb3JtcygpIHtcclxuICAgICAgICB0aGlzLnNldENvbG9yNChcInNreUNvbG9yXCIsIHRoaXMuX3NreUNvbG9yKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yNChcImNsb3VkQ29sb3JcIiwgdGhpcy5fY2xvdWRDb2xvcik7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcImFtcGxpdHVkZVwiLCB0aGlzLl9hbXBsaXR1ZGUpO1xyXG4gICAgICAgIHRoaXMuc2V0SW50KFwibnVtT2N0YXZlc1wiLCB0aGlzLl9udW1PY3RhdmVzKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplQXNDb2xvcjQoKVxyXG4gICAgcHVibGljIGdldCBza3lDb2xvcigpOiBDb2xvcjQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9za3lDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNreUNvbG9yKHZhbHVlOiBDb2xvcjQpIHtcclxuICAgICAgICB0aGlzLl9za3lDb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplQXNDb2xvcjQoKVxyXG4gICAgcHVibGljIGdldCBjbG91ZENvbG9yKCk6IENvbG9yNCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb3VkQ29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBjbG91ZENvbG9yKHZhbHVlOiBDb2xvcjQpIHtcclxuICAgICAgICB0aGlzLl9jbG91ZENvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBhbXBsaXR1ZGUoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYW1wbGl0dWRlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYW1wbGl0dWRlKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9hbXBsaXR1ZGUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IG51bU9jdGF2ZXMoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbnVtT2N0YXZlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IG51bU9jdGF2ZXModmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX251bU9jdGF2ZXMgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXJpYWxpemVzIHRoaXMgY2xvdWQgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgY2xvdWQgcHJvY2VkdXJhbCB0ZXh0dXJlIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk9iamVjdCA9IFNlcmlhbGl6YXRpb25IZWxwZXIuU2VyaWFsaXplKHRoaXMsIHN1cGVyLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmN1c3RvbVR5cGUgPSBcIkJBQllMT04uQ2xvdWRQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5cclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbk9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBDbG91ZCBQcm9jZWR1cmFsIFRleHR1cmUgZnJvbSBwYXJzZWQgY2xvdWQgcHJvY2VkdXJhbCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBwYXJzZWRUZXh0dXJlIGRlZmluZXMgcGFyc2VkIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHNjZW5lIGRlZmluZXMgdGhlIGN1cnJlbnQgc2NlbmVcclxuICAgICAqIEBwYXJhbSByb290VXJsIGRlZmluZXMgdGhlIHJvb3QgVVJMIGNvbnRhaW5pbmcgY2xvdWQgcHJvY2VkdXJhbCB0ZXh0dXJlIGluZm9ybWF0aW9uXHJcbiAgICAgKiBAcmV0dXJucyBhIHBhcnNlZCBDbG91ZCBQcm9jZWR1cmFsIFRleHR1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBQYXJzZShwYXJzZWRUZXh0dXJlOiBhbnksIHNjZW5lOiBTY2VuZSwgcm9vdFVybDogc3RyaW5nKTogQ2xvdWRQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IFNlcmlhbGl6YXRpb25IZWxwZXIuUGFyc2UoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBDbG91ZFByb2NlZHVyYWxUZXh0dXJlKHBhcnNlZFRleHR1cmUubmFtZSwgcGFyc2VkVGV4dHVyZS5fc2l6ZSwgc2NlbmUsIHVuZGVmaW5lZCwgcGFyc2VkVGV4dHVyZS5fZ2VuZXJhdGVNaXBNYXBzKSxcclxuICAgICAgICAgICAgcGFyc2VkVGV4dHVyZSxcclxuICAgICAgICAgICAgc2NlbmUsXHJcbiAgICAgICAgICAgIHJvb3RVcmxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH1cclxufVxyXG5cclxuUmVnaXN0ZXJDbGFzcyhcIkJBQllMT04uQ2xvdWRQcm9jZWR1cmFsVGV4dHVyZVwiLCBDbG91ZFByb2NlZHVyYWxUZXh0dXJlKTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vY2xvdWRQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJmaXJlUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHByZWNpc2lvbiBoaWdocCBmbG9hdDt1bmlmb3JtIGZsb2F0IHRpbWU7dW5pZm9ybSB2ZWMzIGMxO3VuaWZvcm0gdmVjMyBjMjt1bmlmb3JtIHZlYzMgYzM7dW5pZm9ybSB2ZWMzIGM0O3VuaWZvcm0gdmVjMyBjNTt1bmlmb3JtIHZlYzMgYzY7dW5pZm9ybSB2ZWMyIHNwZWVkO3VuaWZvcm0gZmxvYXQgc2hpZnQ7dW5pZm9ybSBmbG9hdCBhbHBoYVRocmVzaG9sZDt2YXJ5aW5nIHZlYzIgdlVWO2Zsb2F0IHJhbmQodmVjMiBuKSB7cmV0dXJuIGZyYWN0KGNvcyhkb3Qobix2ZWMyKDEyLjk4OTgsNC4xNDE0KSkpKjQzNzU4LjU0NTMpO31cbmZsb2F0IG5vaXNlKHZlYzIgbikge2NvbnN0IHZlYzIgZD12ZWMyKDAuMCwxLjApO3ZlYzIgYj1mbG9vcihuKSxmPXNtb290aHN0ZXAodmVjMigwLjApLHZlYzIoMS4wKSxmcmFjdChuKSk7cmV0dXJuIG1peChtaXgocmFuZChiKSxyYW5kKGIrZC55eCksZi54KSxtaXgocmFuZChiK2QueHkpLHJhbmQoYitkLnl5KSxmLngpLGYueSk7fVxuZmxvYXQgZmJtKHZlYzIgbikge2Zsb2F0IHRvdGFsPTAuMCxhbXBsaXR1ZGU9MS4wO2ZvciAoaW50IGk9MDsgaTw0OyBpKyspIHt0b3RhbCs9bm9pc2UobikqYW1wbGl0dWRlO24rPW47YW1wbGl0dWRlKj0wLjU7fVxucmV0dXJuIHRvdGFsO31cbnZvaWQgbWFpbigpIHt2ZWMyIHA9dlVWKjguMDtmbG9hdCBxPWZibShwLXRpbWUqMC4xKTt2ZWMyIHI9dmVjMihmYm0ocCtxK3RpbWUqc3BlZWQueC1wLngtcC55KSxmYm0ocCtxLXRpbWUqc3BlZWQueSkpO3ZlYzMgYz1taXgoYzEsYzIsZmJtKHArcikpK21peChjMyxjNCxyLngpLW1peChjNSxjNixyLnkpO3ZlYzMgY29sb3I9Yypjb3Moc2hpZnQqdlVWLnkpO2Zsb2F0IGx1bWluYW5jZT1kb3QoY29sb3IucmdiLHZlYzMoMC4zLDAuNTksMC4xMSkpO2dsX0ZyYWdDb2xvcj12ZWM0KGNvbG9yLGx1bWluYW5jZSphbHBoYVRocmVzaG9sZCsoMS4wLWFscGhhVGhyZXNob2xkKSk7fWA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3QgZmlyZVByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiaW1wb3J0IHsgc2VyaWFsaXplLCBzZXJpYWxpemVBc1ZlY3RvcjIgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLnZlY3RvclwiO1xyXG5pbXBvcnQgeyBDb2xvcjMgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLmNvbG9yXCI7XHJcbmltcG9ydCB0eXBlIHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyYWxUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL1Byb2NlZHVyYWxzL3Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBSZWdpc3RlckNsYXNzIH0gZnJvbSBcImNvcmUvTWlzYy90eXBlU3RvcmVcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcblxyXG5pbXBvcnQgXCIuL2ZpcmVQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpcmVQcm9jZWR1cmFsVGV4dHVyZSBleHRlbmRzIFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgIHByaXZhdGUgX3RpbWU6IG51bWJlciA9IDAuMDtcclxuICAgIHByaXZhdGUgX3NwZWVkID0gbmV3IFZlY3RvcjIoMC41LCAwLjMpO1xyXG4gICAgcHJpdmF0ZSBfYXV0b0dlbmVyYXRlVGltZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9maXJlQ29sb3JzOiBDb2xvcjNbXTtcclxuICAgIHByaXZhdGUgX2FscGhhVGhyZXNob2xkOiBudW1iZXIgPSAwLjU7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJmaXJlUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgICAgICB0aGlzLl9maXJlQ29sb3JzID0gRmlyZVByb2NlZHVyYWxUZXh0dXJlLlJlZEZpcmVDb2xvcnM7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTaGFkZXJVbmlmb3JtcygpIHtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwidGltZVwiLCB0aGlzLl90aW1lKTtcclxuICAgICAgICB0aGlzLnNldFZlY3RvcjIoXCJzcGVlZFwiLCB0aGlzLl9zcGVlZCk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJjMVwiLCB0aGlzLl9maXJlQ29sb3JzWzBdKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImMyXCIsIHRoaXMuX2ZpcmVDb2xvcnNbMV0pO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiYzNcIiwgdGhpcy5fZmlyZUNvbG9yc1syXSk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJjNFwiLCB0aGlzLl9maXJlQ29sb3JzWzNdKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImM1XCIsIHRoaXMuX2ZpcmVDb2xvcnNbNF0pO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiYzZcIiwgdGhpcy5fZmlyZUNvbG9yc1s1XSk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcImFscGhhVGhyZXNob2xkXCIsIHRoaXMuX2FscGhhVGhyZXNob2xkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVuZGVyKHVzZUNhbWVyYVBvc3RQcm9jZXNzPzogYm9vbGVhbikge1xyXG4gICAgICAgIGNvbnN0IHNjZW5lID0gdGhpcy5nZXRTY2VuZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9hdXRvR2VuZXJhdGVUaW1lICYmIHNjZW5lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWUgKz0gc2NlbmUuZ2V0QW5pbWF0aW9uUmF0aW8oKSAqIDAuMDM7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3VwZXIucmVuZGVyKHVzZUNhbWVyYVBvc3RQcm9jZXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBQdXJwbGVGaXJlQ29sb3JzKCk6IENvbG9yM1tdIHtcclxuICAgICAgICByZXR1cm4gW25ldyBDb2xvcjMoMC41LCAwLjAsIDEuMCksIG5ldyBDb2xvcjMoMC45LCAwLjAsIDEuMCksIG5ldyBDb2xvcjMoMC4yLCAwLjAsIDEuMCksIG5ldyBDb2xvcjMoMS4wLCAwLjksIDEuMCksIG5ldyBDb2xvcjMoMC4xLCAwLjEsIDEuMCksIG5ldyBDb2xvcjMoMC45LCAwLjksIDEuMCldO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEdyZWVuRmlyZUNvbG9ycygpOiBDb2xvcjNbXSB7XHJcbiAgICAgICAgcmV0dXJuIFtuZXcgQ29sb3IzKDAuNSwgMS4wLCAwLjApLCBuZXcgQ29sb3IzKDAuNSwgMS4wLCAwLjApLCBuZXcgQ29sb3IzKDAuMywgMC40LCAwLjApLCBuZXcgQ29sb3IzKDAuNSwgMS4wLCAwLjApLCBuZXcgQ29sb3IzKDAuMiwgMC4wLCAwLjApLCBuZXcgQ29sb3IzKDAuNSwgMS4wLCAwLjApXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBSZWRGaXJlQ29sb3JzKCk6IENvbG9yM1tdIHtcclxuICAgICAgICByZXR1cm4gW25ldyBDb2xvcjMoMC41LCAwLjAsIDAuMSksIG5ldyBDb2xvcjMoMC45LCAwLjAsIDAuMCksIG5ldyBDb2xvcjMoMC4yLCAwLjAsIDAuMCksIG5ldyBDb2xvcjMoMS4wLCAwLjksIDAuMCksIG5ldyBDb2xvcjMoMC4xLCAwLjEsIDAuMSksIG5ldyBDb2xvcjMoMC45LCAwLjksIDAuOSldO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEJsdWVGaXJlQ29sb3JzKCk6IENvbG9yM1tdIHtcclxuICAgICAgICByZXR1cm4gW25ldyBDb2xvcjMoMC4xLCAwLjAsIDAuNSksIG5ldyBDb2xvcjMoMC4wLCAwLjAsIDAuNSksIG5ldyBDb2xvcjMoMC4xLCAwLjAsIDAuMiksIG5ldyBDb2xvcjMoMC4wLCAwLjAsIDEuMCksIG5ldyBDb2xvcjMoMC4xLCAwLjIsIDAuMyksIG5ldyBDb2xvcjMoMC4wLCAwLjIsIDAuOSldO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBhdXRvR2VuZXJhdGVUaW1lKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRvR2VuZXJhdGVUaW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYXV0b0dlbmVyYXRlVGltZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX2F1dG9HZW5lcmF0ZVRpbWUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGZpcmVDb2xvcnMoKTogQ29sb3IzW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9maXJlQ29sb3JzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZmlyZUNvbG9ycyh2YWx1ZTogQ29sb3IzW10pIHtcclxuICAgICAgICB0aGlzLl9maXJlQ29sb3JzID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCB0aW1lKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB0aW1lKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl90aW1lID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemVBc1ZlY3RvcjIoKVxyXG4gICAgcHVibGljIGdldCBzcGVlZCgpOiBWZWN0b3IyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3BlZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzcGVlZCh2YWx1ZTogVmVjdG9yMikge1xyXG4gICAgICAgIHRoaXMuX3NwZWVkID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBhbHBoYVRocmVzaG9sZCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hbHBoYVRocmVzaG9sZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGFscGhhVGhyZXNob2xkKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9hbHBoYVRocmVzaG9sZCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGl6ZXMgdGhpcyBmaXJlIHByb2NlZHVyYWwgdGV4dHVyZVxyXG4gICAgICogQHJldHVybnMgYSBzZXJpYWxpemVkIGZpcmUgcHJvY2VkdXJhbCB0ZXh0dXJlIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk9iamVjdCA9IFNlcmlhbGl6YXRpb25IZWxwZXIuU2VyaWFsaXplKHRoaXMsIHN1cGVyLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmN1c3RvbVR5cGUgPSBcIkJBQllMT04uRmlyZVByb2NlZHVyYWxUZXh0dXJlXCI7XHJcblxyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuZmlyZUNvbG9ycyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZmlyZUNvbG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmZpcmVDb2xvcnMucHVzaCh0aGlzLl9maXJlQ29sb3JzW2ldLmFzQXJyYXkoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbk9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBGaXJlIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCBmaXJlIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gcGFyc2VkVGV4dHVyZSBkZWZpbmVzIHBhcnNlZCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBzY2VuZSBkZWZpbmVzIHRoZSBjdXJyZW50IHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcm9vdFVybCBkZWZpbmVzIHRoZSByb290IFVSTCBjb250YWluaW5nIGZpcmUgcHJvY2VkdXJhbCB0ZXh0dXJlIGluZm9ybWF0aW9uXHJcbiAgICAgKiBAcmV0dXJucyBhIHBhcnNlZCBGaXJlIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBGaXJlUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBTZXJpYWxpemF0aW9uSGVscGVyLlBhcnNlKFxyXG4gICAgICAgICAgICAoKSA9PiBuZXcgRmlyZVByb2NlZHVyYWxUZXh0dXJlKHBhcnNlZFRleHR1cmUubmFtZSwgcGFyc2VkVGV4dHVyZS5fc2l6ZSwgc2NlbmUsIHVuZGVmaW5lZCwgcGFyc2VkVGV4dHVyZS5fZ2VuZXJhdGVNaXBNYXBzKSxcclxuICAgICAgICAgICAgcGFyc2VkVGV4dHVyZSxcclxuICAgICAgICAgICAgc2NlbmUsXHJcbiAgICAgICAgICAgIHJvb3RVcmxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCBjb2xvcnM6IENvbG9yM1tdID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJzZWRUZXh0dXJlLmZpcmVDb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29sb3JzLnB1c2goQ29sb3IzLkZyb21BcnJheShwYXJzZWRUZXh0dXJlLmZpcmVDb2xvcnNbaV0pKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRleHR1cmUuZmlyZUNvbG9ycyA9IGNvbG9ycztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLkZpcmVQcm9jZWR1cmFsVGV4dHVyZVwiLCBGaXJlUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9maXJlUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwiZ3Jhc3NQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3ZhcnlpbmcgdmVjMiB2UG9zaXRpb247dmFyeWluZyB2ZWMyIHZVVjt1bmlmb3JtIHZlYzMgaGVyYjFDb2xvcjt1bmlmb3JtIHZlYzMgaGVyYjJDb2xvcjt1bmlmb3JtIHZlYzMgaGVyYjNDb2xvcjt1bmlmb3JtIHZlYzMgZ3JvdW5kQ29sb3I7ZmxvYXQgcmFuZCh2ZWMyIG4pIHtyZXR1cm4gZnJhY3QoY29zKGRvdChuLHZlYzIoMTIuOTg5OCw0LjE0MTQpKSkqNDM3NTguNTQ1Myk7fVxuZmxvYXQgbm9pc2UodmVjMiBuKSB7Y29uc3QgdmVjMiBkPXZlYzIoMC4wLDEuMCk7dmVjMiBiPWZsb29yKG4pLGY9c21vb3Roc3RlcCh2ZWMyKDAuMCksdmVjMigxLjApLGZyYWN0KG4pKTtyZXR1cm4gbWl4KG1peChyYW5kKGIpLHJhbmQoYitkLnl4KSxmLngpLG1peChyYW5kKGIrZC54eSkscmFuZChiK2QueXkpLGYueCksZi55KTt9XG5mbG9hdCBmYm0odmVjMiBuKSB7ZmxvYXQgdG90YWw9MC4wLGFtcGxpdHVkZT0xLjA7Zm9yIChpbnQgaT0wOyBpPDQ7IGkrKykge3RvdGFsKz1ub2lzZShuKSphbXBsaXR1ZGU7bis9bjthbXBsaXR1ZGUqPTAuNTt9XG5yZXR1cm4gdG90YWw7fVxuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfREVGSU5JVElPTlNcbnZvaWQgbWFpbih2b2lkKSB7XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9NQUlOX0JFR0lOXG52ZWMzIGNvbG9yPW1peChncm91bmRDb2xvcixoZXJiMUNvbG9yLHJhbmQoZ2xfRnJhZ0Nvb3JkLnh5KjQuMCkpO2NvbG9yPW1peChjb2xvcixoZXJiMkNvbG9yLHJhbmQoZ2xfRnJhZ0Nvb3JkLnh5KjguMCkpO2NvbG9yPW1peChjb2xvcixoZXJiM0NvbG9yLHJhbmQoZ2xfRnJhZ0Nvb3JkLnh5KSk7Y29sb3I9bWl4KGNvbG9yLGhlcmIxQ29sb3IsZmJtKGdsX0ZyYWdDb29yZC54eSoxNi4wKSk7Z2xfRnJhZ0NvbG9yPXZlYzQoY29sb3IsMS4wKTtcbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fRU5EXG59YDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBncmFzc1Byb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiaW1wb3J0IHsgc2VyaWFsaXplQXNDb2xvcjMgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB7IENvbG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJhbFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvUHJvY2VkdXJhbHMvcHJvY2VkdXJhbFRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuXHJcbmltcG9ydCBcIi4vZ3Jhc3NQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyYXNzUHJvY2VkdXJhbFRleHR1cmUgZXh0ZW5kcyBQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICBwcml2YXRlIF9ncmFzc0NvbG9yczogQ29sb3IzW107XHJcbiAgICBwcml2YXRlIF9ncm91bmRDb2xvciA9IG5ldyBDb2xvcjMoMSwgMSwgMSk7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJncmFzc1Byb2NlZHVyYWxUZXh0dXJlXCIsIHNjZW5lLCBmYWxsYmFja1RleHR1cmUsIGdlbmVyYXRlTWlwTWFwcyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2dyYXNzQ29sb3JzID0gW25ldyBDb2xvcjMoMC4yOSwgMC4zOCwgMC4wMiksIG5ldyBDb2xvcjMoMC4zNiwgMC40OSwgMC4wOSksIG5ldyBDb2xvcjMoMC41MSwgMC42LCAwLjI4KV07XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2hhZGVyVW5pZm9ybXMoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJoZXJiMUNvbG9yXCIsIHRoaXMuX2dyYXNzQ29sb3JzWzBdKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImhlcmIyQ29sb3JcIiwgdGhpcy5fZ3Jhc3NDb2xvcnNbMV0pO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiaGVyYjNDb2xvclwiLCB0aGlzLl9ncmFzc0NvbG9yc1syXSk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJncm91bmRDb2xvclwiLCB0aGlzLl9ncm91bmRDb2xvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBncmFzc0NvbG9ycygpOiBDb2xvcjNbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyYXNzQ29sb3JzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZ3Jhc3NDb2xvcnModmFsdWU6IENvbG9yM1tdKSB7XHJcbiAgICAgICAgdGhpcy5fZ3Jhc3NDb2xvcnMgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzQ29sb3IzKClcclxuICAgIHB1YmxpYyBnZXQgZ3JvdW5kQ29sb3IoKTogQ29sb3IzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdW5kQ29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBncm91bmRDb2xvcih2YWx1ZTogQ29sb3IzKSB7XHJcbiAgICAgICAgdGhpcy5fZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXJpYWxpemVzIHRoaXMgZ3Jhc3MgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgZ3Jhc3MgcHJvY2VkdXJhbCB0ZXh0dXJlIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk9iamVjdCA9IFNlcmlhbGl6YXRpb25IZWxwZXIuU2VyaWFsaXplKHRoaXMsIHN1cGVyLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmN1c3RvbVR5cGUgPSBcIkJBQllMT04uR3Jhc3NQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5cclxuICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmdyYXNzQ29sb3JzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9ncmFzc0NvbG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmdyYXNzQ29sb3JzLnB1c2godGhpcy5fZ3Jhc3NDb2xvcnNbaV0uYXNBcnJheSgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEdyYXNzIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCBncmFzcyBwcm9jZWR1cmFsIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHBhcnNlZFRleHR1cmUgZGVmaW5lcyBwYXJzZWQgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgY3VycmVudCBzY2VuZVxyXG4gICAgICogQHBhcmFtIHJvb3RVcmwgZGVmaW5lcyB0aGUgcm9vdCBVUkwgY29udGFpbmluZyBncmFzcyBwcm9jZWR1cmFsIHRleHR1cmUgaW5mb3JtYXRpb25cclxuICAgICAqIEByZXR1cm5zIGEgcGFyc2VkIEdyYXNzIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBHcmFzc1Byb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IEdyYXNzUHJvY2VkdXJhbFRleHR1cmUocGFyc2VkVGV4dHVyZS5uYW1lLCBwYXJzZWRUZXh0dXJlLl9zaXplLCBzY2VuZSwgdW5kZWZpbmVkLCBwYXJzZWRUZXh0dXJlLl9nZW5lcmF0ZU1pcE1hcHMpLFxyXG4gICAgICAgICAgICBwYXJzZWRUZXh0dXJlLFxyXG4gICAgICAgICAgICBzY2VuZSxcclxuICAgICAgICAgICAgcm9vdFVybFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbG9yczogQ29sb3IzW10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlZFRleHR1cmUuZ3Jhc3NDb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29sb3JzLnB1c2goQ29sb3IzLkZyb21BcnJheShwYXJzZWRUZXh0dXJlLmdyYXNzQ29sb3JzW2ldKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0ZXh0dXJlLmdyYXNzQ29sb3JzID0gY29sb3JzO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH1cclxufVxyXG5cclxuUmVnaXN0ZXJDbGFzcyhcIkJBQllMT04uR3Jhc3NQcm9jZWR1cmFsVGV4dHVyZVwiLCBHcmFzc1Byb2NlZHVyYWxUZXh0dXJlKTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vZ3Jhc3NQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8taW50ZXJuYWwtbW9kdWxlcyAqL1xyXG5leHBvcnQgKiBmcm9tIFwiLi9icmljay9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9jbG91ZC9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9maXJlL2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL2dyYXNzL2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL21hcmJsZS9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9ub3JtYWxNYXAvaW5kZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vcGVybGluTm9pc2UvaW5kZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vcm9hZC9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9zdGFyZmllbGQvaW5kZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vd29vZC9pbmRleFwiO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9tYXJibGVQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJtYXJibGVQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3ZhcnlpbmcgdmVjMiB2UG9zaXRpb247dmFyeWluZyB2ZWMyIHZVVjt1bmlmb3JtIGZsb2F0IG51bWJlck9mVGlsZXNIZWlnaHQ7dW5pZm9ybSBmbG9hdCBudW1iZXJPZlRpbGVzV2lkdGg7dW5pZm9ybSBmbG9hdCBhbXBsaXR1ZGU7dW5pZm9ybSB2ZWMzIG1hcmJsZUNvbG9yO3VuaWZvcm0gdmVjMyBqb2ludENvbG9yO2NvbnN0IHZlYzMgdGlsZVNpemU9dmVjMygxLjEsMS4wLDEuMSk7Y29uc3QgdmVjMyB0aWxlUGN0PXZlYzMoMC45OCwxLjAsMC45OCk7ZmxvYXQgcmFuZCh2ZWMyIG4pIHtyZXR1cm4gZnJhY3QoY29zKGRvdChuLHZlYzIoMTIuOTg5OCw0LjE0MTQpKSkqNDM3NTguNTQ1Myk7fVxuZmxvYXQgbm9pc2UodmVjMiBuKSB7Y29uc3QgdmVjMiBkPXZlYzIoMC4wLDEuMCk7dmVjMiBiPWZsb29yKG4pLGY9c21vb3Roc3RlcCh2ZWMyKDAuMCksdmVjMigxLjApLGZyYWN0KG4pKTtyZXR1cm4gbWl4KG1peChyYW5kKGIpLHJhbmQoYitkLnl4KSxmLngpLG1peChyYW5kKGIrZC54eSkscmFuZChiK2QueXkpLGYueCksZi55KTt9XG5mbG9hdCB0dXJidWxlbmNlKHZlYzIgUClcbntmbG9hdCB2YWw9MC4wO2Zsb2F0IGZyZXE9MS4wO2ZvciAoaW50IGk9MDsgaTw0OyBpKyspXG57dmFsKz1hYnMobm9pc2UoUCpmcmVxKS9mcmVxKTtmcmVxKj0yLjA3O31cbnJldHVybiB2YWw7fVxuZmxvYXQgcm91bmRGKGZsb2F0IG51bWJlcil7cmV0dXJuIHNpZ24obnVtYmVyKSpmbG9vcihhYnMobnVtYmVyKSswLjUpO31cbnZlYzMgbWFyYmxlX2NvbG9yKGZsb2F0IHgpXG57dmVjMyBjb2w7eD0wLjUqKHgrMS4pO3g9c3FydCh4KTsgXG54PXNxcnQoeCk7eD1zcXJ0KHgpO2NvbD12ZWMzKC4yKy43NSp4KTsgXG5jb2wuYio9MC45NTsgXG5yZXR1cm4gY29sO31cbnZvaWQgbWFpbigpXG57ZmxvYXQgYnJpY2tXPTEuMC9udW1iZXJPZlRpbGVzV2lkdGg7ZmxvYXQgYnJpY2tIPTEuMC9udW1iZXJPZlRpbGVzSGVpZ2h0O2Zsb2F0IGpvaW50V1BlcmNlbnRhZ2U9MC4wMTtmbG9hdCBqb2ludEhQZXJjZW50YWdlPTAuMDE7dmVjMyBjb2xvcj1tYXJibGVDb2xvcjtmbG9hdCB5aT12VVYueS9icmlja0g7ZmxvYXQgbnlpPXJvdW5kRih5aSk7ZmxvYXQgeGk9dlVWLngvYnJpY2tXO2lmIChtb2QoZmxvb3IoeWkpLDIuMCk9PTAuMCl7eGk9eGktMC41O31cbmZsb2F0IG54aT1yb3VuZEYoeGkpO3ZlYzIgYnJpY2t2VVY9dmVjMigoeGktZmxvb3IoeGkpKS9icmlja0gsKHlpLWZsb29yKHlpKSkvYnJpY2tXKTtpZiAoeWk8bnlpK2pvaW50SFBlcmNlbnRhZ2UgJiYgeWk+bnlpLWpvaW50SFBlcmNlbnRhZ2Upe2NvbG9yPW1peChqb2ludENvbG9yLHZlYzMoMC4zNywwLjI1LDAuMjUpLCh5aS1ueWkpL2pvaW50SFBlcmNlbnRhZ2UrMC4yKTt9XG5lbHNlIGlmICh4aTxueGkram9pbnRXUGVyY2VudGFnZSAmJiB4aT5ueGktam9pbnRXUGVyY2VudGFnZSl7Y29sb3I9bWl4KGpvaW50Q29sb3IsdmVjMygwLjQ0LDAuNDQsMC40NCksKHhpLW54aSkvam9pbnRXUGVyY2VudGFnZSswLjIpO31cbmVsc2Uge2Zsb2F0IHQ9Ni4yOCpicmlja3ZVVi54Lyh0aWxlU2l6ZS54K25vaXNlKHZlYzIodlVWKSo2LjApKTt0Kz1hbXBsaXR1ZGUqdHVyYnVsZW5jZShicmlja3ZVVi54eSk7dD1zaW4odCk7Y29sb3I9bWFyYmxlX2NvbG9yKHQpO31cbmdsX0ZyYWdDb2xvcj12ZWM0KGNvbG9yLDAuMCk7fWA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3QgbWFyYmxlUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgeyBzZXJpYWxpemUgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB7IENvbG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJhbFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvUHJvY2VkdXJhbHMvcHJvY2VkdXJhbFRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuXHJcbmltcG9ydCBcIi4vbWFyYmxlUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNYXJibGVQcm9jZWR1cmFsVGV4dHVyZSBleHRlbmRzIFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgIHByaXZhdGUgX251bWJlck9mVGlsZXNIZWlnaHQ6IG51bWJlciA9IDM7XHJcbiAgICBwcml2YXRlIF9udW1iZXJPZlRpbGVzV2lkdGg6IG51bWJlciA9IDM7XHJcbiAgICBwcml2YXRlIF9hbXBsaXR1ZGU6IG51bWJlciA9IDkuMDtcclxuICAgIHByaXZhdGUgX2pvaW50Q29sb3IgPSBuZXcgQ29sb3IzKDAuNzIsIDAuNzIsIDAuNzIpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBzY2VuZTogTnVsbGFibGU8U2NlbmU+ID0gbnVsbCwgZmFsbGJhY2tUZXh0dXJlPzogVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzPzogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHNpemUsIFwibWFyYmxlUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJudW1iZXJPZlRpbGVzSGVpZ2h0XCIsIHRoaXMuX251bWJlck9mVGlsZXNIZWlnaHQpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJudW1iZXJPZlRpbGVzV2lkdGhcIiwgdGhpcy5fbnVtYmVyT2ZUaWxlc1dpZHRoKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiYW1wbGl0dWRlXCIsIHRoaXMuX2FtcGxpdHVkZSk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJqb2ludENvbG9yXCIsIHRoaXMuX2pvaW50Q29sb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBudW1iZXJPZlRpbGVzSGVpZ2h0KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck9mVGlsZXNIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBudW1iZXJPZlRpbGVzSGVpZ2h0KHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9udW1iZXJPZlRpbGVzSGVpZ2h0ID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBhbXBsaXR1ZGUoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYW1wbGl0dWRlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYW1wbGl0dWRlKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9hbXBsaXR1ZGUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IG51bWJlck9mVGlsZXNXaWR0aCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJPZlRpbGVzV2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBudW1iZXJPZlRpbGVzV2lkdGgodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX251bWJlck9mVGlsZXNXaWR0aCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgam9pbnRDb2xvcigpOiBDb2xvcjMge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9qb2ludENvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgam9pbnRDb2xvcih2YWx1ZTogQ29sb3IzKSB7XHJcbiAgICAgICAgdGhpcy5fam9pbnRDb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGl6ZXMgdGhpcyBtYXJibGUgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgbWFyYmxlIHByb2NlZHVyYWwgdGV4dHVyZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25PYmplY3QgPSBTZXJpYWxpemF0aW9uSGVscGVyLlNlcmlhbGl6ZSh0aGlzLCBzdXBlci5zZXJpYWxpemUoKSk7XHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5jdXN0b21UeXBlID0gXCJCQUJZTE9OLk1hcmJsZVByb2NlZHVyYWxUZXh0dXJlXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIE1hcmJsZSBQcm9jZWR1cmFsIFRleHR1cmUgZnJvbSBwYXJzZWQgbWFyYmxlIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gcGFyc2VkVGV4dHVyZSBkZWZpbmVzIHBhcnNlZCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBzY2VuZSBkZWZpbmVzIHRoZSBjdXJyZW50IHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcm9vdFVybCBkZWZpbmVzIHRoZSByb290IFVSTCBjb250YWluaW5nIG1hcmJsZSBwcm9jZWR1cmFsIHRleHR1cmUgaW5mb3JtYXRpb25cclxuICAgICAqIEByZXR1cm5zIGEgcGFyc2VkIE1hcmJsZSBQcm9jZWR1cmFsIFRleHR1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBQYXJzZShwYXJzZWRUZXh0dXJlOiBhbnksIHNjZW5lOiBTY2VuZSwgcm9vdFVybDogc3RyaW5nKTogTWFyYmxlUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBTZXJpYWxpemF0aW9uSGVscGVyLlBhcnNlKFxyXG4gICAgICAgICAgICAoKSA9PiBuZXcgTWFyYmxlUHJvY2VkdXJhbFRleHR1cmUocGFyc2VkVGV4dHVyZS5uYW1lLCBwYXJzZWRUZXh0dXJlLl9zaXplLCBzY2VuZSwgdW5kZWZpbmVkLCBwYXJzZWRUZXh0dXJlLl9nZW5lcmF0ZU1pcE1hcHMpLFxyXG4gICAgICAgICAgICBwYXJzZWRUZXh0dXJlLFxyXG4gICAgICAgICAgICBzY2VuZSxcclxuICAgICAgICAgICAgcm9vdFVybFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWdpc3RlckNsYXNzKFwiQkFCWUxPTi5NYXJibGVQcm9jZWR1cmFsVGV4dHVyZVwiLCBNYXJibGVQcm9jZWR1cmFsVGV4dHVyZSk7XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL25vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlXCI7XHJcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcIm5vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dW5pZm9ybSBzYW1wbGVyMkQgYmFzZVNhbXBsZXI7dW5pZm9ybSBmbG9hdCBzaXplO3ZhcnlpbmcgdmVjMiB2VVY7Y29uc3QgdmVjMyBMVU1BX0NPRUZGSUNJRU5UPXZlYzMoMC4yMTI2LDAuNzE1MiwwLjA3MjIpO2Zsb2F0IGx1bWFBdENvb3JkKHZlYzIgY29vcmQpXG57dmVjMyBwaXhlbD10ZXh0dXJlMkQoYmFzZVNhbXBsZXIsY29vcmQpLnJnYjtmbG9hdCBsdW1hPWRvdChwaXhlbCxMVU1BX0NPRUZGSUNJRU5UKTtyZXR1cm4gbHVtYTt9XG52b2lkIG1haW4oKVxue2Zsb2F0IGx1bWFVMD1sdW1hQXRDb29yZCh2VVYrdmVjMigtMS4wLCAwLjApL3NpemUpO2Zsb2F0IGx1bWFVMT1sdW1hQXRDb29yZCh2VVYrdmVjMiggMS4wLCAwLjApL3NpemUpO2Zsb2F0IGx1bWFWMD1sdW1hQXRDb29yZCh2VVYrdmVjMiggMC4wLC0xLjApL3NpemUpO2Zsb2F0IGx1bWFWMT1sdW1hQXRDb29yZCh2VVYrdmVjMiggMC4wLCAxLjApL3NpemUpO3ZlYzIgc2xvcGU9KHZlYzIobHVtYVUwLWx1bWFVMSxsdW1hVjAtbHVtYVYxKSsxLjApKjAuNTtnbF9GcmFnQ29sb3I9dmVjNChzbG9wZSwxLjAsMS4wKTt9XG5gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IG5vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiaW1wb3J0IHsgc2VyaWFsaXplQXNUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzXCI7XHJcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25IZWxwZXIgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnMuc2VyaWFsaXphdGlvblwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5pbXBvcnQgXCIuL25vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmUgZXh0ZW5kcyBQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICBwcml2YXRlIF9iYXNlVGV4dHVyZTogVGV4dHVyZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNpemU6IG51bWJlciwgc2NlbmU6IE51bGxhYmxlPFNjZW5lPiA9IG51bGwsIGZhbGxiYWNrVGV4dHVyZT86IFRleHR1cmUsIGdlbmVyYXRlTWlwTWFwcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzaXplLCBcIm5vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlXCIsIHNjZW5lLCBmYWxsYmFja1RleHR1cmUsIGdlbmVyYXRlTWlwTWFwcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTaGFkZXJVbmlmb3JtcygpIHtcclxuICAgICAgICB0aGlzLnNldFRleHR1cmUoXCJiYXNlU2FtcGxlclwiLCB0aGlzLl9iYXNlVGV4dHVyZSk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcInNpemVcIiwgdGhpcy5nZXRSZW5kZXJTaXplKCkgYXMgbnVtYmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVuZGVyKHVzZUNhbWVyYVBvc3RQcm9jZXNzPzogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyLnJlbmRlcih1c2VDYW1lcmFQb3N0UHJvY2Vzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIHJlc2l6ZShzaXplOiBhbnksIGdlbmVyYXRlTWlwTWFwczogYW55KTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIucmVzaXplKHNpemUsIGdlbmVyYXRlTWlwTWFwcyk7XHJcblxyXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBcInNpemVcIiB1bmlmb3JtXHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSBpc1JlYWR5KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGhpcy5fYmFzZVRleHR1cmUgfHwgIXRoaXMuX2Jhc2VUZXh0dXJlLmlzUmVhZHkoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc3VwZXIuaXNSZWFkeSgpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemVBc1RleHR1cmUoKVxyXG4gICAgcHVibGljIGdldCBiYXNlVGV4dHVyZSgpOiBUZXh0dXJlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYmFzZVRleHR1cmU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBiYXNlVGV4dHVyZSh0ZXh0dXJlOiBUZXh0dXJlKSB7XHJcbiAgICAgICAgdGhpcy5fYmFzZVRleHR1cmUgPSB0ZXh0dXJlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGl6ZXMgdGhpcyBub3JtYWwgbWFwIHByb2NlZHVyYWwgdGV4dHVyZVxyXG4gICAgICogQHJldHVybnMgYSBzZXJpYWxpemVkIG5vcm1hbCBtYXAgcHJvY2VkdXJhbCB0ZXh0dXJlIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk9iamVjdCA9IFNlcmlhbGl6YXRpb25IZWxwZXIuU2VyaWFsaXplKHRoaXMsIHN1cGVyLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmN1c3RvbVR5cGUgPSBcIkJBQllMT04uTm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgTm9ybWFsIE1hcCBQcm9jZWR1cmFsIFRleHR1cmUgZnJvbSBwYXJzZWQgbm9ybWFsIG1hcCBwcm9jZWR1cmFsIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHBhcnNlZFRleHR1cmUgZGVmaW5lcyBwYXJzZWQgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgY3VycmVudCBzY2VuZVxyXG4gICAgICogQHBhcmFtIHJvb3RVcmwgZGVmaW5lcyB0aGUgcm9vdCBVUkwgY29udGFpbmluZyBub3JtYWwgbWFwIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgTm9ybWFsIE1hcCBQcm9jZWR1cmFsIFRleHR1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBQYXJzZShwYXJzZWRUZXh0dXJlOiBhbnksIHNjZW5lOiBTY2VuZSwgcm9vdFVybDogc3RyaW5nKTogTm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBTZXJpYWxpemF0aW9uSGVscGVyLlBhcnNlKFxyXG4gICAgICAgICAgICAoKSA9PiBuZXcgTm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmUocGFyc2VkVGV4dHVyZS5uYW1lLCBwYXJzZWRUZXh0dXJlLl9zaXplLCBzY2VuZSwgdW5kZWZpbmVkLCBwYXJzZWRUZXh0dXJlLl9nZW5lcmF0ZU1pcE1hcHMpLFxyXG4gICAgICAgICAgICBwYXJzZWRUZXh0dXJlLFxyXG4gICAgICAgICAgICBzY2VuZSxcclxuICAgICAgICAgICAgcm9vdFVybFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWdpc3RlckNsYXNzKFwiQkFCWUxPTi5Ob3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZVwiLCBOb3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZSk7XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL3Blcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwicGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3VuaWZvcm0gZmxvYXQgc2l6ZTt1bmlmb3JtIGZsb2F0IHRpbWU7dW5pZm9ybSBmbG9hdCB0cmFuc2xhdGlvblNwZWVkO3ZhcnlpbmcgdmVjMiB2VVY7ZmxvYXQgcihmbG9hdCBuKVxue3JldHVybiBmcmFjdChjb3Mobio4OS40MikqMzQzLjQyKTt9XG52ZWMyIHIodmVjMiBuKVxue3JldHVybiB2ZWMyKHIobi54KjIzLjYyLTMwMC4wK24ueSozNC4zNSkscihuLngqNDUuMTMrMjU2LjArbi55KjM4Ljg5KSk7IH1cbmZsb2F0IHdvcmxleSh2ZWMyIG4sZmxvYXQgcylcbntmbG9hdCBkaXM9MS4wO2ZvcihpbnQgeD0tMTsgeDw9MTsgeCsrKVxue2ZvcihpbnQgeT0tMTsgeTw9MTsgeSsrKVxue3ZlYzIgcD1mbG9vcihuL3MpK3ZlYzIoeCx5KTtmbG9hdCBkPWxlbmd0aChyKHApK3ZlYzIoeCx5KS1mcmFjdChuL3MpKTtpZiAoZGlzPmQpXG5kaXM9ZDt9fVxucmV0dXJuIDEuMC1kaXM7fVxudmVjMyBoYXNoMzModmVjMyBwMylcbntwMz1mcmFjdChwMyp2ZWMzKDAuMTAzMSwwLjExMzY5LDAuMTM3ODcpKTtwMys9ZG90KHAzLHAzLnl4eisxOS4xOSk7cmV0dXJuIC0xLjArMi4wKmZyYWN0KHZlYzMoKHAzLngrcDMueSkqcDMueiwocDMueCtwMy56KSpwMy55LChwMy55K3AzLnopKnAzLngpKTt9XG5mbG9hdCBwZXJsaW5Ob2lzZSh2ZWMzIHApXG57dmVjMyBwaT1mbG9vcihwKTt2ZWMzIHBmPXAtcGk7dmVjMyB3PXBmKnBmKigzLjAtMi4wKnBmKTtyZXR1cm4gbWl4KFxubWl4KFxubWl4KFxuZG90KHBmLXZlYzMoMCwwLDApLGhhc2gzMyhwaSt2ZWMzKDAsMCwwKSkpLFxuZG90KHBmLXZlYzMoMSwwLDApLGhhc2gzMyhwaSt2ZWMzKDEsMCwwKSkpLFxudy54XG4pLFxubWl4KFxuZG90KHBmLXZlYzMoMCwwLDEpLGhhc2gzMyhwaSt2ZWMzKDAsMCwxKSkpLFxuZG90KHBmLXZlYzMoMSwwLDEpLGhhc2gzMyhwaSt2ZWMzKDEsMCwxKSkpLFxudy54XG4pLFxudy56XG4pLFxubWl4KFxubWl4KFxuZG90KHBmLXZlYzMoMCwxLDApLGhhc2gzMyhwaSt2ZWMzKDAsMSwwKSkpLFxuZG90KHBmLXZlYzMoMSwxLDApLGhhc2gzMyhwaSt2ZWMzKDEsMSwwKSkpLFxudy54XG4pLFxubWl4KFxuZG90KHBmLXZlYzMoMCwxLDEpLGhhc2gzMyhwaSt2ZWMzKDAsMSwxKSkpLFxuZG90KHBmLXZlYzMoMSwxLDEpLGhhc2gzMyhwaSt2ZWMzKDEsMSwxKSkpLFxudy54XG4pLFxudy56XG4pLFxudy55XG4pO31cbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX0RFRklOSVRJT05TXG52b2lkIG1haW4odm9pZClcbnt2ZWMyIHV2PWdsX0ZyYWdDb29yZC54eSt0cmFuc2xhdGlvblNwZWVkO2Zsb2F0IGRpcz0oXG4xLjArcGVybGluTm9pc2UodmVjMyh1di92ZWMyKHNpemUsc2l6ZSksdGltZSowLjA1KSo4LjApKVxuKiAoMS4wKyh3b3JsZXkodXYsMzIuMCkrIDAuNSp3b3JsZXkoMi4wKnV2LDMyLjApKzAuMjUqd29ybGV5KDQuMCp1diwzMi4wKSlcbik7Z2xfRnJhZ0NvbG9yPXZlYzQodmVjMyhkaXMvNC4wKSwxLjApO31cbmA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3QgcGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImltcG9ydCB7IHNlcmlhbGl6ZSB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJhbFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvUHJvY2VkdXJhbHMvcHJvY2VkdXJhbFRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuaW1wb3J0IFwiLi9wZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZSBleHRlbmRzIFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIHRpbWU6IG51bWJlciA9IDAuMDtcclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyB0aW1lU2NhbGU6IG51bWJlciA9IDEuMDtcclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyB0cmFuc2xhdGlvblNwZWVkOiBudW1iZXIgPSAxLjA7XHJcblxyXG4gICAgcHJpdmF0ZSBfY3VycmVudFRyYW5zbGF0aW9uOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBzY2VuZTogTnVsbGFibGU8U2NlbmU+ID0gbnVsbCwgZmFsbGJhY2tUZXh0dXJlPzogVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzPzogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHNpemUsIFwicGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZVwiLCBzY2VuZSwgZmFsbGJhY2tUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHMpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2hhZGVyVW5pZm9ybXMoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcInNpemVcIiwgdGhpcy5nZXRSZW5kZXJTaXplKCkgYXMgbnVtYmVyKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2NlbmUgPSB0aGlzLmdldFNjZW5lKCk7XHJcblxyXG4gICAgICAgIGlmICghc2NlbmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkZWx0YVRpbWUgPSBzY2VuZS5nZXRFbmdpbmUoKS5nZXREZWx0YVRpbWUoKTtcclxuXHJcbiAgICAgICAgdGhpcy50aW1lICs9IGRlbHRhVGltZTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwidGltZVwiLCAodGhpcy50aW1lICogdGhpcy50aW1lU2NhbGUpIC8gMTAwMCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbiArPSAoZGVsdGFUaW1lICogdGhpcy50cmFuc2xhdGlvblNwZWVkKSAvIDEwMDAuMDtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwidHJhbnNsYXRpb25TcGVlZFwiLCB0aGlzLl9jdXJyZW50VHJhbnNsYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSByZW5kZXIodXNlQ2FtZXJhUG9zdFByb2Nlc3M/OiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgICAgIHN1cGVyLnJlbmRlcih1c2VDYW1lcmFQb3N0UHJvY2Vzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIHJlc2l6ZShzaXplOiBhbnksIGdlbmVyYXRlTWlwTWFwczogYW55KTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIucmVzaXplKHNpemUsIGdlbmVyYXRlTWlwTWFwcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXJpYWxpemVzIHRoaXMgcGVybGluIG5vaXNlIHByb2NlZHVyYWwgdGV4dHVyZVxyXG4gICAgICogQHJldHVybnMgYSBzZXJpYWxpemVkIHBlcmxpbiBub2lzZSBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5QZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIFBlcmxpbiBOb2lzZSBQcm9jZWR1cmFsIFRleHR1cmUgZnJvbSBwYXJzZWQgcGVybGluIG5vaXNlIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gcGFyc2VkVGV4dHVyZSBkZWZpbmVzIHBhcnNlZCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBzY2VuZSBkZWZpbmVzIHRoZSBjdXJyZW50IHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcm9vdFVybCBkZWZpbmVzIHRoZSByb290IFVSTCBjb250YWluaW5nIHBlcmxpbiBub2lzZSBwcm9jZWR1cmFsIHRleHR1cmUgaW5mb3JtYXRpb25cclxuICAgICAqIEByZXR1cm5zIGEgcGFyc2VkIFBlcmxpbiBOb2lzZSBQcm9jZWR1cmFsIFRleHR1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBQYXJzZShwYXJzZWRUZXh0dXJlOiBhbnksIHNjZW5lOiBTY2VuZSwgcm9vdFVybDogc3RyaW5nKTogUGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IFNlcmlhbGl6YXRpb25IZWxwZXIuUGFyc2UoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBQZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlKHBhcnNlZFRleHR1cmUubmFtZSwgcGFyc2VkVGV4dHVyZS5fc2l6ZSwgc2NlbmUsIHVuZGVmaW5lZCwgcGFyc2VkVGV4dHVyZS5fZ2VuZXJhdGVNaXBNYXBzKSxcclxuICAgICAgICAgICAgcGFyc2VkVGV4dHVyZSxcclxuICAgICAgICAgICAgc2NlbmUsXHJcbiAgICAgICAgICAgIHJvb3RVcmxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH1cclxufVxyXG5cclxuUmVnaXN0ZXJDbGFzcyhcIkJBQllMT04uUGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZVwiLCBQZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlKTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vcm9hZFByb2NlZHVyYWxUZXh0dXJlXCI7XHJcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcInJvYWRQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3ZhcnlpbmcgdmVjMiB2VVY7IFxudW5pZm9ybSB2ZWMzIHJvYWRDb2xvcjtmbG9hdCByYW5kKHZlYzIgbikge3JldHVybiBmcmFjdChjb3MoZG90KG4sdmVjMigxMi45ODk4LDQuMTQxNCkpKSo0Mzc1OC41NDUzKTt9XG5mbG9hdCBub2lzZSh2ZWMyIG4pIHtjb25zdCB2ZWMyIGQ9dmVjMigwLjAsMS4wKTt2ZWMyIGI9Zmxvb3IobiksZj1zbW9vdGhzdGVwKHZlYzIoMC4wKSx2ZWMyKDEuMCksZnJhY3QobikpO3JldHVybiBtaXgobWl4KHJhbmQoYikscmFuZChiK2QueXgpLGYueCksbWl4KHJhbmQoYitkLnh5KSxyYW5kKGIrZC55eSksZi54KSxmLnkpO31cbmZsb2F0IGZibSh2ZWMyIG4pIHtmbG9hdCB0b3RhbD0wLjAsYW1wbGl0dWRlPTEuMDtmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7dG90YWwrPW5vaXNlKG4pKmFtcGxpdHVkZTtuKz1uO2FtcGxpdHVkZSo9MC41O31cbnJldHVybiB0b3RhbDt9XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9ERUZJTklUSU9OU1xudm9pZCBtYWluKHZvaWQpIHtcbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fQkVHSU5cbmZsb2F0IHJhdGlveT1tb2QoZ2xfRnJhZ0Nvb3JkLnkqMTAwLjAgLGZibSh2VVYqMi4wKSk7dmVjMyBjb2xvcj1yb2FkQ29sb3IqcmF0aW95O2dsX0ZyYWdDb2xvcj12ZWM0KGNvbG9yLDEuMCk7XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9NQUlOX0VORFxufWA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3Qgcm9hZFByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiaW1wb3J0IHsgc2VyaWFsaXplQXNDb2xvcjMgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB7IENvbG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJhbFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvUHJvY2VkdXJhbHMvcHJvY2VkdXJhbFRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuaW1wb3J0IFwiLi9yb2FkUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBSb2FkUHJvY2VkdXJhbFRleHR1cmUgZXh0ZW5kcyBQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICBwcml2YXRlIF9yb2FkQ29sb3IgPSBuZXcgQ29sb3IzKDAuNTMsIDAuNTMsIDAuNTMpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBzY2VuZTogTnVsbGFibGU8U2NlbmU+ID0gbnVsbCwgZmFsbGJhY2tUZXh0dXJlPzogVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzPzogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHNpemUsIFwicm9hZFByb2NlZHVyYWxUZXh0dXJlXCIsIHNjZW5lLCBmYWxsYmFja1RleHR1cmUsIGdlbmVyYXRlTWlwTWFwcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTaGFkZXJVbmlmb3JtcygpIHtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcInJvYWRDb2xvclwiLCB0aGlzLl9yb2FkQ29sb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemVBc0NvbG9yMygpXHJcbiAgICBwdWJsaWMgZ2V0IHJvYWRDb2xvcigpOiBDb2xvcjMge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yb2FkQ29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCByb2FkQ29sb3IodmFsdWU6IENvbG9yMykge1xyXG4gICAgICAgIHRoaXMuX3JvYWRDb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGl6ZXMgdGhpcyByb2FkIHByb2NlZHVyYWwgdGV4dHVyZVxyXG4gICAgICogQHJldHVybnMgYSBzZXJpYWxpemVkIHJvYWQgcHJvY2VkdXJhbCB0ZXh0dXJlIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk9iamVjdCA9IFNlcmlhbGl6YXRpb25IZWxwZXIuU2VyaWFsaXplKHRoaXMsIHN1cGVyLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmN1c3RvbVR5cGUgPSBcIkJBQllMT04uUm9hZFByb2NlZHVyYWxUZXh0dXJlXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIFJvYWQgUHJvY2VkdXJhbCBUZXh0dXJlIGZyb20gcGFyc2VkIHJvYWQgcHJvY2VkdXJhbCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBwYXJzZWRUZXh0dXJlIGRlZmluZXMgcGFyc2VkIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHNjZW5lIGRlZmluZXMgdGhlIGN1cnJlbnQgc2NlbmVcclxuICAgICAqIEBwYXJhbSByb290VXJsIGRlZmluZXMgdGhlIHJvb3QgVVJMIGNvbnRhaW5pbmcgcm9hZCBwcm9jZWR1cmFsIHRleHR1cmUgaW5mb3JtYXRpb25cclxuICAgICAqIEByZXR1cm5zIGEgcGFyc2VkIFJvYWQgUHJvY2VkdXJhbCBUZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2UocGFyc2VkVGV4dHVyZTogYW55LCBzY2VuZTogU2NlbmUsIHJvb3RVcmw6IHN0cmluZyk6IFJvYWRQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IFNlcmlhbGl6YXRpb25IZWxwZXIuUGFyc2UoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBSb2FkUHJvY2VkdXJhbFRleHR1cmUocGFyc2VkVGV4dHVyZS5uYW1lLCBwYXJzZWRUZXh0dXJlLl9zaXplLCBzY2VuZSwgdW5kZWZpbmVkLCBwYXJzZWRUZXh0dXJlLl9nZW5lcmF0ZU1pcE1hcHMpLFxyXG4gICAgICAgICAgICBwYXJzZWRUZXh0dXJlLFxyXG4gICAgICAgICAgICBzY2VuZSxcclxuICAgICAgICAgICAgcm9vdFVybFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWdpc3RlckNsYXNzKFwiQkFCWUxPTi5Sb2FkUHJvY2VkdXJhbFRleHR1cmVcIiwgUm9hZFByb2NlZHVyYWxUZXh0dXJlKTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vc3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwic3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNkZWZpbmUgdm9sc3RlcHMgMjBcbiNkZWZpbmUgaXRlcmF0aW9ucyAxNVxudmFyeWluZyB2ZWMyIHZQb3NpdGlvbjt2YXJ5aW5nIHZlYzIgdlVWO3VuaWZvcm0gZmxvYXQgdGltZTt1bmlmb3JtIGZsb2F0IGFscGhhO3VuaWZvcm0gZmxvYXQgYmV0YTt1bmlmb3JtIGZsb2F0IHpvb207dW5pZm9ybSBmbG9hdCBmb3JtdXBhcmFtO3VuaWZvcm0gZmxvYXQgc3RlcHNpemU7dW5pZm9ybSBmbG9hdCB0aWxlO3VuaWZvcm0gZmxvYXQgYnJpZ2h0bmVzczt1bmlmb3JtIGZsb2F0IGRhcmttYXR0ZXI7dW5pZm9ybSBmbG9hdCBkaXN0ZmFkaW5nO3VuaWZvcm0gZmxvYXQgc2F0dXJhdGlvbjt2b2lkIG1haW4oKVxue3ZlYzMgZGlyPXZlYzModlVWKnpvb20sMS4pO2Zsb2F0IGxvY2FsVGltZT10aW1lKjAuMDAwMTttYXQyIHJvdDE9bWF0Mihjb3MoYWxwaGEpLHNpbihhbHBoYSksLXNpbihhbHBoYSksY29zKGFscGhhKSk7bWF0MiByb3QyPW1hdDIoY29zKGJldGEpLHNpbihiZXRhKSwtc2luKGJldGEpLGNvcyhiZXRhKSk7ZGlyLnh6Kj1yb3QxO2Rpci54eSo9cm90Mjt2ZWMzIGZyb21fPXZlYzMoMS4sLjUsMC41KTtmcm9tXys9dmVjMygtMi4sbG9jYWxUaW1lKjIuLGxvY2FsVGltZSk7ZnJvbV8ueHoqPXJvdDE7ZnJvbV8ueHkqPXJvdDI7ZmxvYXQgcz0wLjEsZmFkZT0xLjt2ZWMzIHY9dmVjMygwLik7Zm9yIChpbnQgcj0wOyByPHZvbHN0ZXBzOyByKyspIHt2ZWMzIHA9ZnJvbV8rcypkaXIqLjU7cD1hYnModmVjMyh0aWxlKS1tb2QocCx2ZWMzKHRpbGUqMi4pKSk7IFxuZmxvYXQgcGEsYT1wYT0wLjtmb3IgKGludCBpPTA7IGk8aXRlcmF0aW9uczsgaSsrKSB7cD1hYnMocCkvZG90KHAscCktZm9ybXVwYXJhbTsgXG5hKz1hYnMobGVuZ3RoKHApLXBhKTsgXG5wYT1sZW5ndGgocCk7fVxuZmxvYXQgZG09bWF4KDAuLGRhcmttYXR0ZXItYSphKi4wMDEpOyBcbmEqPWEqYTsgXG5pZiAocj42KSBmYWRlKj0xLi1kbTsgXG52Kz1mYWRlO3YrPXZlYzMocyxzKnMscypzKnMqcykqYSpicmlnaHRuZXNzKmZhZGU7IFxuZmFkZSo9ZGlzdGZhZGluZzsgXG5zKz1zdGVwc2l6ZTt9XG52PW1peCh2ZWMzKGxlbmd0aCh2KSksdixzYXR1cmF0aW9uKTsgXG5nbF9GcmFnQ29sb3I9dmVjNCh2Ki4wMSwxLik7fWA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3Qgc3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgeyBzZXJpYWxpemUgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB0eXBlIHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyYWxUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL1Byb2NlZHVyYWxzL3Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBSZWdpc3RlckNsYXNzIH0gZnJvbSBcImNvcmUvTWlzYy90eXBlU3RvcmVcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcbmltcG9ydCBcIi4vc3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZSBleHRlbmRzIFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgIHByaXZhdGUgX3RpbWUgPSAxO1xyXG4gICAgcHJpdmF0ZSBfYWxwaGEgPSAwLjU7XHJcbiAgICBwcml2YXRlIF9iZXRhID0gMC44O1xyXG4gICAgcHJpdmF0ZSBfem9vbSA9IDAuODtcclxuICAgIHByaXZhdGUgX2Zvcm11cGFyYW0gPSAwLjUzO1xyXG4gICAgcHJpdmF0ZSBfc3RlcHNpemUgPSAwLjE7XHJcbiAgICBwcml2YXRlIF90aWxlID0gMC44NTtcclxuICAgIHByaXZhdGUgX2JyaWdodG5lc3MgPSAwLjAwMTU7XHJcbiAgICBwcml2YXRlIF9kYXJrbWF0dGVyID0gMC40O1xyXG4gICAgcHJpdmF0ZSBfZGlzdGZhZGluZyA9IDAuNzM7XHJcbiAgICBwcml2YXRlIF9zYXR1cmF0aW9uID0gMC44NTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNpemU6IG51bWJlciwgc2NlbmU6IE51bGxhYmxlPFNjZW5lPiA9IG51bGwsIGZhbGxiYWNrVGV4dHVyZT86IFRleHR1cmUsIGdlbmVyYXRlTWlwTWFwcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzaXplLCBcInN0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlXCIsIHNjZW5lLCBmYWxsYmFja1RleHR1cmUsIGdlbmVyYXRlTWlwTWFwcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTaGFkZXJVbmlmb3JtcygpIHtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwidGltZVwiLCB0aGlzLl90aW1lKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiYWxwaGFcIiwgdGhpcy5fYWxwaGEpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJiZXRhXCIsIHRoaXMuX2JldGEpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJ6b29tXCIsIHRoaXMuX3pvb20pO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJmb3JtdXBhcmFtXCIsIHRoaXMuX2Zvcm11cGFyYW0pO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJzdGVwc2l6ZVwiLCB0aGlzLl9zdGVwc2l6ZSk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcInRpbGVcIiwgdGhpcy5fdGlsZSk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcImJyaWdodG5lc3NcIiwgdGhpcy5fYnJpZ2h0bmVzcyk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcImRhcmttYXR0ZXJcIiwgdGhpcy5fZGFya21hdHRlcik7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcImRpc3RmYWRpbmdcIiwgdGhpcy5fZGlzdGZhZGluZyk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcInNhdHVyYXRpb25cIiwgdGhpcy5fc2F0dXJhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IHRpbWUoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdGltZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHRpbWUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX3RpbWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGFscGhhKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FscGhhO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYWxwaGEodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2FscGhhID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBiZXRhKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JldGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBiZXRhKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9iZXRhID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBmb3JtdXBhcmFtKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm11cGFyYW07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBmb3JtdXBhcmFtKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9mb3JtdXBhcmFtID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBzdGVwc2l6ZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGVwc2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHN0ZXBzaXplKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9zdGVwc2l6ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgem9vbSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl96b29tO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgem9vbSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fem9vbSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgdGlsZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90aWxlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgdGlsZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fdGlsZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgYnJpZ2h0bmVzcygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9icmlnaHRuZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYnJpZ2h0bmVzcyh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fYnJpZ2h0bmVzcyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgZGFya21hdHRlcigpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXJrbWF0dGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZGFya21hdHRlcih2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fZGFya21hdHRlciA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgZGlzdGZhZGluZygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXN0ZmFkaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZGlzdGZhZGluZyh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fZGlzdGZhZGluZyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgc2F0dXJhdGlvbigpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zYXR1cmF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2F0dXJhdGlvbih2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fc2F0dXJhdGlvbiA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGl6ZXMgdGhpcyBzdGFyZmllbGQgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgc3RhcmZpZWxkIHByb2NlZHVyYWwgdGV4dHVyZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25PYmplY3QgPSBTZXJpYWxpemF0aW9uSGVscGVyLlNlcmlhbGl6ZSh0aGlzLCBzdXBlci5zZXJpYWxpemUoKSk7XHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5jdXN0b21UeXBlID0gXCJCQUJZTE9OLlN0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIFN0YXJmaWVsZCBQcm9jZWR1cmFsIFRleHR1cmUgZnJvbSBwYXJzZWQgc3RhcnRmaWVsZCBwcm9jZWR1cmFsIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHBhcnNlZFRleHR1cmUgZGVmaW5lcyBwYXJzZWQgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgY3VycmVudCBzY2VuZVxyXG4gICAgICogQHBhcmFtIHJvb3RVcmwgZGVmaW5lcyB0aGUgcm9vdCBVUkwgY29udGFpbmluZyBzdGFydGZpZWxkIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgU3RhcmZpZWxkIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBTdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IFNlcmlhbGl6YXRpb25IZWxwZXIuUGFyc2UoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBTdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLlN0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlXCIsIFN0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlKTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vd29vZFByb2NlZHVyYWxUZXh0dXJlXCI7XHJcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcIndvb2RQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3ZhcnlpbmcgdmVjMiB2UG9zaXRpb247dmFyeWluZyB2ZWMyIHZVVjt1bmlmb3JtIGZsb2F0IGFtcFNjYWxlO3VuaWZvcm0gdmVjMyB3b29kQ29sb3I7ZmxvYXQgcmFuZCh2ZWMyIG4pIHtyZXR1cm4gZnJhY3QoY29zKGRvdChuLHZlYzIoMTIuOTg5OCw0LjE0MTQpKSkqNDM3NTguNTQ1Myk7fVxuZmxvYXQgbm9pc2UodmVjMiBuKSB7Y29uc3QgdmVjMiBkPXZlYzIoMC4wLDEuMCk7dmVjMiBiPWZsb29yKG4pLGY9c21vb3Roc3RlcCh2ZWMyKDAuMCksdmVjMigxLjApLGZyYWN0KG4pKTtyZXR1cm4gbWl4KG1peChyYW5kKGIpLHJhbmQoYitkLnl4KSxmLngpLG1peChyYW5kKGIrZC54eSkscmFuZChiK2QueXkpLGYueCksZi55KTt9XG5mbG9hdCBmYm0odmVjMiBuKSB7ZmxvYXQgdG90YWw9MC4wLGFtcGxpdHVkZT0xLjA7Zm9yIChpbnQgaT0wOyBpPDQ7IGkrKykge3RvdGFsKz1ub2lzZShuKSphbXBsaXR1ZGU7bis9bjthbXBsaXR1ZGUqPTAuNTt9XG5yZXR1cm4gdG90YWw7fVxuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfREVGSU5JVElPTlNcbnZvaWQgbWFpbih2b2lkKSB7XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9NQUlOX0JFR0lOXG5mbG9hdCByYXRpb3k9bW9kKHZVVi54KmFtcFNjYWxlLDIuMCtmYm0odlVWKjAuOCkpO3ZlYzMgd29vZD13b29kQ29sb3IqcmF0aW95O2dsX0ZyYWdDb2xvcj12ZWM0KHdvb2QsMS4wKTtcbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fRU5EXG59YDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCB3b29kUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgeyBzZXJpYWxpemUsIHNlcmlhbGl6ZUFzQ29sb3IzIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzXCI7XHJcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25IZWxwZXIgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnMuc2VyaWFsaXphdGlvblwiO1xyXG5pbXBvcnQgeyBDb2xvcjMgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLmNvbG9yXCI7XHJcbmltcG9ydCB0eXBlIHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyYWxUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL1Byb2NlZHVyYWxzL3Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBSZWdpc3RlckNsYXNzIH0gZnJvbSBcImNvcmUvTWlzYy90eXBlU3RvcmVcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcbmltcG9ydCBcIi4vd29vZFByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgV29vZFByb2NlZHVyYWxUZXh0dXJlIGV4dGVuZHMgUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgcHJpdmF0ZSBfYW1wU2NhbGU6IG51bWJlciA9IDEwMC4wO1xyXG4gICAgcHJpdmF0ZSBfd29vZENvbG9yOiBDb2xvcjMgPSBuZXcgQ29sb3IzKDAuMzIsIDAuMTcsIDAuMDkpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBzY2VuZTogTnVsbGFibGU8U2NlbmU+ID0gbnVsbCwgZmFsbGJhY2tUZXh0dXJlPzogVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzPzogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHNpemUsIFwid29vZFByb2NlZHVyYWxUZXh0dXJlXCIsIHNjZW5lLCBmYWxsYmFja1RleHR1cmUsIGdlbmVyYXRlTWlwTWFwcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTaGFkZXJVbmlmb3JtcygpIHtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiYW1wU2NhbGVcIiwgdGhpcy5fYW1wU2NhbGUpO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwid29vZENvbG9yXCIsIHRoaXMuX3dvb2RDb2xvcik7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGFtcFNjYWxlKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FtcFNjYWxlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYW1wU2NhbGUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2FtcFNjYWxlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemVBc0NvbG9yMygpXHJcbiAgICBwdWJsaWMgZ2V0IHdvb2RDb2xvcigpOiBDb2xvcjMge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl93b29kQ29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB3b29kQ29sb3IodmFsdWU6IENvbG9yMykge1xyXG4gICAgICAgIHRoaXMuX3dvb2RDb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGl6ZXMgdGhpcyB3b29kIHByb2NlZHVyYWwgdGV4dHVyZVxyXG4gICAgICogQHJldHVybnMgYSBzZXJpYWxpemVkIHdvb2QgcHJvY2VkdXJhbCB0ZXh0dXJlIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk9iamVjdCA9IFNlcmlhbGl6YXRpb25IZWxwZXIuU2VyaWFsaXplKHRoaXMsIHN1cGVyLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmN1c3RvbVR5cGUgPSBcIkJBQllMT04uV29vZFByb2NlZHVyYWxUZXh0dXJlXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIFdvb2QgUHJvY2VkdXJhbCBUZXh0dXJlIGZyb20gcGFyc2VkIHdvb2QgcHJvY2VkdXJhbCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBwYXJzZWRUZXh0dXJlIGRlZmluZXMgcGFyc2VkIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHNjZW5lIGRlZmluZXMgdGhlIGN1cnJlbnQgc2NlbmVcclxuICAgICAqIEBwYXJhbSByb290VXJsIGRlZmluZXMgdGhlIHJvb3QgVVJMIGNvbnRhaW5pbmcgd29vZCBwcm9jZWR1cmFsIHRleHR1cmUgaW5mb3JtYXRpb25cclxuICAgICAqIEByZXR1cm5zIGEgcGFyc2VkIFdvb2QgUHJvY2VkdXJhbCBUZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2UocGFyc2VkVGV4dHVyZTogYW55LCBzY2VuZTogU2NlbmUsIHJvb3RVcmw6IHN0cmluZyk6IFdvb2RQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IFNlcmlhbGl6YXRpb25IZWxwZXIuUGFyc2UoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBXb29kUHJvY2VkdXJhbFRleHR1cmUocGFyc2VkVGV4dHVyZS5uYW1lLCBwYXJzZWRUZXh0dXJlLl9zaXplLCBzY2VuZSwgdW5kZWZpbmVkLCBwYXJzZWRUZXh0dXJlLl9nZW5lcmF0ZU1pcE1hcHMpLFxyXG4gICAgICAgICAgICBwYXJzZWRUZXh0dXJlLFxyXG4gICAgICAgICAgICBzY2VuZSxcclxuICAgICAgICAgICAgcm9vdFVybFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWdpc3RlckNsYXNzKFwiQkFCWUxPTi5Xb29kUHJvY2VkdXJhbFRleHR1cmVcIiwgV29vZFByb2NlZHVyYWxUZXh0dXJlKTtcclxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgKi9cclxuaW1wb3J0ICogYXMgUHJvY2VkdXJhbFRleHR1cmVzTGliIGZyb20gXCJwcm9jZWR1cmFsLXRleHR1cmVzL2luZGV4XCI7XHJcblxyXG4vKipcclxuICogTGVnYWN5IHN1cHBvcnQsIGRlZmluaW5nIHdpbmRvdy5CQUJZTE9OLkdyaWRNYXRlcmlhbC4uLiAoZ2xvYmFsIHZhcmlhYmxlKS5cclxuICpcclxuICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBVTUQgbW9kdWxlLlxyXG4gKiBUaGUgZW50cnkgcG9pbnQgZm9yIGEgZnV0dXJlIEVTTSBwYWNrYWdlIHNob3VsZCBiZSBpbmRleC50c1xyXG4gKi9cclxuY29uc3QgZ2xvYmFsT2JqZWN0ID0gdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XHJcbmlmICh0eXBlb2YgZ2xvYmFsT2JqZWN0ICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAoPGFueT5nbG9iYWxPYmplY3QpLkJBQllMT04gPSAoPGFueT5nbG9iYWxPYmplY3QpLkJBQllMT04gfHwge307XHJcbiAgICBmb3IgKGNvbnN0IG1hdCBpbiBQcm9jZWR1cmFsVGV4dHVyZXNMaWIpIHtcclxuICAgICAgICAoPGFueT5nbG9iYWxPYmplY3QpLkJBQllMT05bbWF0XSA9ICg8YW55PlByb2NlZHVyYWxUZXh0dXJlc0xpYilbbWF0XTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0ICogZnJvbSBcInByb2NlZHVyYWwtdGV4dHVyZXMvaW5kZXhcIjtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NaXNjX2RlY29yYXRvcnNfXzsiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XG4gIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgdHJ5IHtcbiAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICB9XG4gIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcbiAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgIHJba10gPSBhW2pdO1xuICByZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcbiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XG4gIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIHZhciByLCBzID0gMDtcbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XG4gICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XG4gICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHMgfD0gMTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG59O1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0ICogYXMgcHJvY2VkdXJhbFRleHR1cmVzIGZyb20gXCJAbHRzL3Byb2NlZHVyYWwtdGV4dHVyZXMvbGVnYWN5L2xlZ2FjeVwiO1xyXG5leHBvcnQgeyBwcm9jZWR1cmFsVGV4dHVyZXMgfTtcclxuZXhwb3J0IGRlZmF1bHQgcHJvY2VkdXJhbFRleHR1cmVzO1xyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
2269
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbmpzLnByb2NlZHVyYWxUZXh0dXJlcy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUVBO0FBQ0E7QUFjQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFBQTtBQU1BO0FBQUE7QUFBQTtBQUxBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQU9BOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQWxFQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFtQ0E7QUFBQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbkdBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFFQTtBQUNBO0FBWUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkJBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFHQTtBQUVBO0FBQUE7QUFNQTtBQUFBO0FBQUE7QUFMQTtBQUNBO0FBQ0E7QUFDQTtBQUlBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFsRUE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBbUNBO0FBQUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQ25HQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBRUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFBQTtBQU9BO0FBQUE7QUFBQTtBQU5BO0FBQ0E7QUFDQTtBQUVBO0FBSUE7QUFDQTs7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7OztBQUFBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUpBO0FBTUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUF0RkE7QUFEQTtBQUdBO0FBZ0JBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQStDQTtBQUFBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4SkE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFVQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqQkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFBQTtBQUlBO0FBQUE7QUFBQTtBQUZBO0FBS0E7QUFFQTs7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFoREE7QUFEQTtBQUdBO0FBK0NBO0FBQUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQzNGQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNWQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBRUE7QUFDQTtBQWtCQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6QkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFBQTtBQU1BO0FBQUE7QUFBQTtBQUxBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQU9BOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQWxFQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFtQ0E7QUFBQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbkdBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWkE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFFQTs7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBT0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBcENBO0FBREE7QUFHQTtBQW1DQTtBQUFBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRkE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFpREE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeERBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUFBO0FBWUE7QUFBQTtBQUFBO0FBVkE7QUFHQTtBQUdBO0FBRUE7QUFJQTs7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBcEVBO0FBREE7QUFDQTtBQUdBO0FBREE7QUFDQTtBQUdBO0FBREE7QUFDQTtBQStEQTtBQUFBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRkE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFXQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsQkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUZBO0FBSUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQU9BOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQXBDQTtBQURBO0FBR0E7QUFtQ0E7QUFBQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDOURBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFFQTtBQUNBO0FBZ0JBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZCQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFBQTtBQWFBO0FBQUE7QUFBQTtBQVpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTs7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQU9BOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQXhJQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFtQ0E7QUFBQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDckxBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFFQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakJBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQUE7QUFJQTtBQUFBO0FBQUE7QUFIQTtBQUNBO0FBSUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUE5Q0E7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBbUNBO0FBQUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFFQTtBQUNBO0FBRUE7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQ2pCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUN2WUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBOzs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvYnJpY2svYnJpY2tQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvYnJpY2svYnJpY2tQcm9jZWR1cmFsVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvYnJpY2svaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2Nsb3VkL2Nsb3VkUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnQudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2Nsb3VkL2Nsb3VkUHJvY2VkdXJhbFRleHR1cmUudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2Nsb3VkL2luZGV4LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9maXJlL2ZpcmVQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvZmlyZS9maXJlUHJvY2VkdXJhbFRleHR1cmUudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2ZpcmUvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2dyYXNzL2dyYXNzUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnQudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2dyYXNzL2dyYXNzUHJvY2VkdXJhbFRleHR1cmUudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2dyYXNzL2luZGV4LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvbWFyYmxlL2luZGV4LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9tYXJibGUvbWFyYmxlUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnQudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL21hcmJsZS9tYXJibGVQcm9jZWR1cmFsVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvbm9ybWFsTWFwL2luZGV4LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9ub3JtYWxNYXAvbm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnQudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL25vcm1hbE1hcC9ub3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvcGVybGluTm9pc2UvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL3Blcmxpbk5vaXNlL3Blcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnQudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL3Blcmxpbk5vaXNlL3Blcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmUudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL3JvYWQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL3JvYWQvcm9hZFByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9yb2FkL3JvYWRQcm9jZWR1cmFsVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvc3RhcmZpZWxkL2luZGV4LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9zdGFyZmllbGQvc3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnQudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL3N0YXJmaWVsZC9zdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvd29vZC9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvd29vZC93b29kUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnQudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL3dvb2Qvd29vZFByb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9sdHMvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9sZWdhY3kvbGVnYWN5LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy9leHRlcm5hbCB1bWQge1wicm9vdFwiOlwiQkFCWUxPTlwiLFwiY29tbW9uanNcIjpcImJhYnlsb25qc1wiLFwiY29tbW9uanMyXCI6XCJiYWJ5bG9uanNcIixcImFtZFwiOlwiYmFieWxvbmpzXCJ9Iiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2Lm1qcyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImJhYnlsb25qc1wiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcImJhYnlsb25qcy1wcm9jZWR1cmFsLXRleHR1cmVzXCIsIFtcImJhYnlsb25qc1wiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJiYWJ5bG9uanMtcHJvY2VkdXJhbC10ZXh0dXJlc1wiXSA9IGZhY3RvcnkocmVxdWlyZShcImJhYnlsb25qc1wiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiUFJPQ0VEVVJBTFRFWFRVUkVTXCJdID0gZmFjdG9yeShyb290W1wiQkFCWUxPTlwiXSk7XG59KSgodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHRoaXMpLCAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9iYWJ5bG9uanNfTWlzY19kZWNvcmF0b3JzX18pID0+IHtcbnJldHVybiAiLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJicmlja1Byb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dmFyeWluZyB2ZWMyIHZQb3NpdGlvbjt2YXJ5aW5nIHZlYzIgdlVWO3VuaWZvcm0gZmxvYXQgbnVtYmVyT2ZCcmlja3NIZWlnaHQ7dW5pZm9ybSBmbG9hdCBudW1iZXJPZkJyaWNrc1dpZHRoO3VuaWZvcm0gdmVjMyBicmlja0NvbG9yO3VuaWZvcm0gdmVjMyBqb2ludENvbG9yO2Zsb2F0IHJhbmQodmVjMiBuKSB7cmV0dXJuIGZyYWN0KGNvcyhkb3Qobix2ZWMyKDEyLjk4OTgsNC4xNDE0KSkpKjQzNzU4LjU0NTMpO31cbmZsb2F0IG5vaXNlKHZlYzIgbikge2NvbnN0IHZlYzIgZD12ZWMyKDAuMCwxLjApO3ZlYzIgYj1mbG9vcihuKSxmPXNtb290aHN0ZXAodmVjMigwLjApLHZlYzIoMS4wKSxmcmFjdChuKSk7cmV0dXJuIG1peChtaXgocmFuZChiKSxyYW5kKGIrZC55eCksZi54KSxtaXgocmFuZChiK2QueHkpLHJhbmQoYitkLnl5KSxmLngpLGYueSk7fVxuZmxvYXQgZmJtKHZlYzIgbikge2Zsb2F0IHRvdGFsPTAuMCxhbXBsaXR1ZGU9MS4wO2ZvciAoaW50IGk9MDsgaTw0OyBpKyspIHt0b3RhbCs9bm9pc2UobikqYW1wbGl0dWRlO24rPW47YW1wbGl0dWRlKj0wLjU7fVxucmV0dXJuIHRvdGFsO31cbmZsb2F0IHJvdW5kRihmbG9hdCBudW1iZXIpe3JldHVybiBzaWduKG51bWJlcikqZmxvb3IoYWJzKG51bWJlcikrMC41KTt9XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9ERUZJTklUSU9OU1xudm9pZCBtYWluKHZvaWQpXG57ZmxvYXQgYnJpY2tXPTEuMC9udW1iZXJPZkJyaWNrc1dpZHRoO2Zsb2F0IGJyaWNrSD0xLjAvbnVtYmVyT2ZCcmlja3NIZWlnaHQ7ZmxvYXQgam9pbnRXUGVyY2VudGFnZT0wLjAxO2Zsb2F0IGpvaW50SFBlcmNlbnRhZ2U9MC4wNTt2ZWMzIGNvbG9yPWJyaWNrQ29sb3I7ZmxvYXQgeWk9dlVWLnkvYnJpY2tIO2Zsb2F0IG55aT1yb3VuZEYoeWkpO2Zsb2F0IHhpPXZVVi54L2JyaWNrVztpZiAobW9kKGZsb29yKHlpKSwyLjApPT0wLjApe3hpPXhpLTAuNTt9XG5mbG9hdCBueGk9cm91bmRGKHhpKTt2ZWMyIGJyaWNrdlVWPXZlYzIoKHhpLWZsb29yKHhpKSkvYnJpY2tILCh5aS1mbG9vcih5aSkpLyBicmlja1cpO2lmICh5aTxueWkram9pbnRIUGVyY2VudGFnZSAmJiB5aT5ueWktam9pbnRIUGVyY2VudGFnZSl7Y29sb3I9bWl4KGpvaW50Q29sb3IsdmVjMygwLjM3LDAuMjUsMC4yNSksKHlpLW55aSkvam9pbnRIUGVyY2VudGFnZSswLjIpO31cbmVsc2UgaWYgKHhpPG54aStqb2ludFdQZXJjZW50YWdlICYmIHhpPm54aS1qb2ludFdQZXJjZW50YWdlKXtjb2xvcj1taXgoam9pbnRDb2xvcix2ZWMzKDAuNDQsMC40NCwwLjQ0KSwoeGktbnhpKS9qb2ludFdQZXJjZW50YWdlKzAuMik7fVxuZWxzZSB7ZmxvYXQgYnJpY2tDb2xvclN3aXRjaD1tb2QoZmxvb3IoeWkpK2Zsb29yKHhpKSwzLjApO2lmIChicmlja0NvbG9yU3dpdGNoPT0wLjApXG5jb2xvcj1taXgoY29sb3IsdmVjMygwLjMzLDAuMzMsMC4zMyksMC4zKTtlbHNlIGlmIChicmlja0NvbG9yU3dpdGNoPT0yLjApXG5jb2xvcj1taXgoY29sb3IsdmVjMygwLjExLDAuMTEsMC4xMSksMC4zKTt9XG5nbF9GcmFnQ29sb3I9dmVjNChjb2xvciwxLjApO31gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IGJyaWNrUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgeyBzZXJpYWxpemUsIHNlcmlhbGl6ZUFzQ29sb3IzIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzXCI7XHJcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25IZWxwZXIgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnMuc2VyaWFsaXphdGlvblwiO1xyXG5pbXBvcnQgeyBDb2xvcjMgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLmNvbG9yXCI7XHJcbmltcG9ydCB0eXBlIHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyYWxUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL1Byb2NlZHVyYWxzL3Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBSZWdpc3RlckNsYXNzIH0gZnJvbSBcImNvcmUvTWlzYy90eXBlU3RvcmVcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcblxyXG5pbXBvcnQgXCIuL2JyaWNrUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBCcmlja1Byb2NlZHVyYWxUZXh0dXJlIGV4dGVuZHMgUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgcHJpdmF0ZSBfbnVtYmVyT2ZCcmlja3NIZWlnaHQ6IG51bWJlciA9IDE1O1xyXG4gICAgcHJpdmF0ZSBfbnVtYmVyT2ZCcmlja3NXaWR0aDogbnVtYmVyID0gNTtcclxuICAgIHByaXZhdGUgX2pvaW50Q29sb3IgPSBuZXcgQ29sb3IzKDAuNzIsIDAuNzIsIDAuNzIpO1xyXG4gICAgcHJpdmF0ZSBfYnJpY2tDb2xvciA9IG5ldyBDb2xvcjMoMC43NywgMC40NywgMC40KTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNpemU6IG51bWJlciwgc2NlbmU6IE51bGxhYmxlPFNjZW5lPiA9IG51bGwsIGZhbGxiYWNrVGV4dHVyZT86IFRleHR1cmUsIGdlbmVyYXRlTWlwTWFwcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzaXplLCBcImJyaWNrUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJudW1iZXJPZkJyaWNrc0hlaWdodFwiLCB0aGlzLl9udW1iZXJPZkJyaWNrc0hlaWdodCk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcIm51bWJlck9mQnJpY2tzV2lkdGhcIiwgdGhpcy5fbnVtYmVyT2ZCcmlja3NXaWR0aCk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJicmlja0NvbG9yXCIsIHRoaXMuX2JyaWNrQ29sb3IpO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiam9pbnRDb2xvclwiLCB0aGlzLl9qb2ludENvbG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgbnVtYmVyT2ZCcmlja3NIZWlnaHQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZCcmlja3NIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBudW1iZXJPZkJyaWNrc0hlaWdodCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fbnVtYmVyT2ZCcmlja3NIZWlnaHQgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IG51bWJlck9mQnJpY2tzV2lkdGgoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZCcmlja3NXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IG51bWJlck9mQnJpY2tzV2lkdGgodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX251bWJlck9mQnJpY2tzV2lkdGggPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzQ29sb3IzKClcclxuICAgIHB1YmxpYyBnZXQgam9pbnRDb2xvcigpOiBDb2xvcjMge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9qb2ludENvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgam9pbnRDb2xvcih2YWx1ZTogQ29sb3IzKSB7XHJcbiAgICAgICAgdGhpcy5fam9pbnRDb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplQXNDb2xvcjMoKVxyXG4gICAgcHVibGljIGdldCBicmlja0NvbG9yKCk6IENvbG9yMyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JyaWNrQ29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBicmlja0NvbG9yKHZhbHVlOiBDb2xvcjMpIHtcclxuICAgICAgICB0aGlzLl9icmlja0NvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIGJyaWNrIHByb2NlZHVyYWwgdGV4dHVyZVxyXG4gICAgICogQHJldHVybnMgYSBzZXJpYWxpemVkIGJyaWNrIHByb2NlZHVyYWwgdGV4dHVyZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25PYmplY3QgPSBTZXJpYWxpemF0aW9uSGVscGVyLlNlcmlhbGl6ZSh0aGlzLCBzdXBlci5zZXJpYWxpemUoKSk7XHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5jdXN0b21UeXBlID0gXCJCQUJZTE9OLkJyaWNrUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgQnJpY2sgUHJvY2VkdXJhbCBUZXh0dXJlIGZyb20gcGFyc2VkIGJyaWNrIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gcGFyc2VkVGV4dHVyZSBkZWZpbmVzIHBhcnNlZCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBzY2VuZSBkZWZpbmVzIHRoZSBjdXJyZW50IHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcm9vdFVybCBkZWZpbmVzIHRoZSByb290IFVSTCBjb250YWluaW5nIGJyaWNrIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgQnJpY2sgUHJvY2VkdXJhbCBUZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2UocGFyc2VkVGV4dHVyZTogYW55LCBzY2VuZTogU2NlbmUsIHJvb3RVcmw6IHN0cmluZyk6IEJyaWNrUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBTZXJpYWxpemF0aW9uSGVscGVyLlBhcnNlKFxyXG4gICAgICAgICAgICAoKSA9PiBuZXcgQnJpY2tQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLkJyaWNrUHJvY2VkdXJhbFRleHR1cmVcIiwgQnJpY2tQcm9jZWR1cmFsVGV4dHVyZSk7XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL2JyaWNrUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwiY2xvdWRQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3ZhcnlpbmcgdmVjMiB2VVY7dW5pZm9ybSB2ZWM0IHNreUNvbG9yO3VuaWZvcm0gdmVjNCBjbG91ZENvbG9yO3VuaWZvcm0gZmxvYXQgYW1wbGl0dWRlO3VuaWZvcm0gaW50IG51bU9jdGF2ZXM7ZmxvYXQgcmFuZCh2ZWMyIG4pIHtyZXR1cm4gZnJhY3QoY29zKGRvdChuLHZlYzIoMTIuOTg5OCw0LjE0MTQpKSkqNDM3NTguNTQ1Myk7fVxuZmxvYXQgbm9pc2UodmVjMiBuKSB7Y29uc3QgdmVjMiBkPXZlYzIoMC4wLDEuMCk7dmVjMiBiPWZsb29yKG4pLGY9c21vb3Roc3RlcCh2ZWMyKDAuMCksdmVjMigxLjApLGZyYWN0KG4pKTtyZXR1cm4gbWl4KG1peChyYW5kKGIpLHJhbmQoYitkLnl4KSxmLngpLG1peChyYW5kKGIrZC54eSkscmFuZChiK2QueXkpLGYueCksZi55KTt9XG5mbG9hdCBmYm0odmVjMiBuKSB7ZmxvYXQgdG90YWw9MC4wLGFtcGw9YW1wbGl0dWRlO1xuI2lmZGVmIFdFQkdMMlxuZm9yIChpbnQgaT0wOyBpPG51bU9jdGF2ZXM7IGkrKykge1xuI2Vsc2VcbmZvciAoaW50IGk9MDsgaTw0OyBpKyspIHtcbiNlbmRpZlxudG90YWwrPW5vaXNlKG4pKmFtcGw7bis9bjthbXBsKj0wLjU7fVxucmV0dXJuIHRvdGFsO31cbnZvaWQgbWFpbigpIHt2ZWMyIHA9dlVWKjEyLjA7dmVjNCBjPW1peChza3lDb2xvcixjbG91ZENvbG9yLGZibShwKSk7Z2xfRnJhZ0NvbG9yPWM7fVxuYDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBjbG91ZFByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiaW1wb3J0IHsgc2VyaWFsaXplLCBzZXJpYWxpemVBc0NvbG9yNCB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHsgQ29sb3I0IH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC5jb2xvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5cclxuaW1wb3J0IFwiLi9jbG91ZFByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2xvdWRQcm9jZWR1cmFsVGV4dHVyZSBleHRlbmRzIFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgIHByaXZhdGUgX3NreUNvbG9yID0gbmV3IENvbG9yNCgwLjE1LCAwLjY4LCAxLjAsIDEuMCk7XHJcbiAgICBwcml2YXRlIF9jbG91ZENvbG9yID0gbmV3IENvbG9yNCgxLCAxLCAxLCAxLjApO1xyXG4gICAgcHJpdmF0ZSBfYW1wbGl0dWRlID0gMTtcclxuICAgIHByaXZhdGUgX251bU9jdGF2ZXMgPSA0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBzY2VuZTogTnVsbGFibGU8U2NlbmU+ID0gbnVsbCwgZmFsbGJhY2tUZXh0dXJlPzogVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzPzogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHNpemUsIFwiY2xvdWRQcm9jZWR1cmFsVGV4dHVyZVwiLCBzY2VuZSwgZmFsbGJhY2tUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHMpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2hhZGVyVW5pZm9ybXMoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjQoXCJza3lDb2xvclwiLCB0aGlzLl9za3lDb2xvcik7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjQoXCJjbG91ZENvbG9yXCIsIHRoaXMuX2Nsb3VkQ29sb3IpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJhbXBsaXR1ZGVcIiwgdGhpcy5fYW1wbGl0dWRlKTtcclxuICAgICAgICB0aGlzLnNldEludChcIm51bU9jdGF2ZXNcIiwgdGhpcy5fbnVtT2N0YXZlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzQ29sb3I0KClcclxuICAgIHB1YmxpYyBnZXQgc2t5Q29sb3IoKTogQ29sb3I0IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2t5Q29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBza3lDb2xvcih2YWx1ZTogQ29sb3I0KSB7XHJcbiAgICAgICAgdGhpcy5fc2t5Q29sb3IgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzQ29sb3I0KClcclxuICAgIHB1YmxpYyBnZXQgY2xvdWRDb2xvcigpOiBDb2xvcjQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jbG91ZENvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgY2xvdWRDb2xvcih2YWx1ZTogQ29sb3I0KSB7XHJcbiAgICAgICAgdGhpcy5fY2xvdWRDb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgYW1wbGl0dWRlKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FtcGxpdHVkZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGFtcGxpdHVkZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fYW1wbGl0dWRlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBudW1PY3RhdmVzKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bU9jdGF2ZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBudW1PY3RhdmVzKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9udW1PY3RhdmVzID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIGNsb3VkIHByb2NlZHVyYWwgdGV4dHVyZVxyXG4gICAgICogQHJldHVybnMgYSBzZXJpYWxpemVkIGNsb3VkIHByb2NlZHVyYWwgdGV4dHVyZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25PYmplY3QgPSBTZXJpYWxpemF0aW9uSGVscGVyLlNlcmlhbGl6ZSh0aGlzLCBzdXBlci5zZXJpYWxpemUoKSk7XHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5jdXN0b21UeXBlID0gXCJCQUJZTE9OLkNsb3VkUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgQ2xvdWQgUHJvY2VkdXJhbCBUZXh0dXJlIGZyb20gcGFyc2VkIGNsb3VkIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gcGFyc2VkVGV4dHVyZSBkZWZpbmVzIHBhcnNlZCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBzY2VuZSBkZWZpbmVzIHRoZSBjdXJyZW50IHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcm9vdFVybCBkZWZpbmVzIHRoZSByb290IFVSTCBjb250YWluaW5nIGNsb3VkIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgQ2xvdWQgUHJvY2VkdXJhbCBUZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2UocGFyc2VkVGV4dHVyZTogYW55LCBzY2VuZTogU2NlbmUsIHJvb3RVcmw6IHN0cmluZyk6IENsb3VkUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBTZXJpYWxpemF0aW9uSGVscGVyLlBhcnNlKFxyXG4gICAgICAgICAgICAoKSA9PiBuZXcgQ2xvdWRQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLkNsb3VkUHJvY2VkdXJhbFRleHR1cmVcIiwgQ2xvdWRQcm9jZWR1cmFsVGV4dHVyZSk7XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL2Nsb3VkUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwiZmlyZVByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dW5pZm9ybSBmbG9hdCB0aW1lO3VuaWZvcm0gdmVjMyBjMTt1bmlmb3JtIHZlYzMgYzI7dW5pZm9ybSB2ZWMzIGMzO3VuaWZvcm0gdmVjMyBjNDt1bmlmb3JtIHZlYzMgYzU7dW5pZm9ybSB2ZWMzIGM2O3VuaWZvcm0gdmVjMiBzcGVlZDt1bmlmb3JtIGZsb2F0IHNoaWZ0O3VuaWZvcm0gZmxvYXQgYWxwaGFUaHJlc2hvbGQ7dmFyeWluZyB2ZWMyIHZVVjtmbG9hdCByYW5kKHZlYzIgbikge3JldHVybiBmcmFjdChjb3MoZG90KG4sdmVjMigxMi45ODk4LDQuMTQxNCkpKSo0Mzc1OC41NDUzKTt9XG5mbG9hdCBub2lzZSh2ZWMyIG4pIHtjb25zdCB2ZWMyIGQ9dmVjMigwLjAsMS4wKTt2ZWMyIGI9Zmxvb3IobiksZj1zbW9vdGhzdGVwKHZlYzIoMC4wKSx2ZWMyKDEuMCksZnJhY3QobikpO3JldHVybiBtaXgobWl4KHJhbmQoYikscmFuZChiK2QueXgpLGYueCksbWl4KHJhbmQoYitkLnh5KSxyYW5kKGIrZC55eSksZi54KSxmLnkpO31cbmZsb2F0IGZibSh2ZWMyIG4pIHtmbG9hdCB0b3RhbD0wLjAsYW1wbGl0dWRlPTEuMDtmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7dG90YWwrPW5vaXNlKG4pKmFtcGxpdHVkZTtuKz1uO2FtcGxpdHVkZSo9MC41O31cbnJldHVybiB0b3RhbDt9XG52b2lkIG1haW4oKSB7dmVjMiBwPXZVVio4LjA7ZmxvYXQgcT1mYm0ocC10aW1lKjAuMSk7dmVjMiByPXZlYzIoZmJtKHArcSt0aW1lKnNwZWVkLngtcC54LXAueSksZmJtKHArcS10aW1lKnNwZWVkLnkpKTt2ZWMzIGM9bWl4KGMxLGMyLGZibShwK3IpKSttaXgoYzMsYzQsci54KS1taXgoYzUsYzYsci55KTt2ZWMzIGNvbG9yPWMqY29zKHNoaWZ0KnZVVi55KTtmbG9hdCBsdW1pbmFuY2U9ZG90KGNvbG9yLnJnYix2ZWMzKDAuMywwLjU5LDAuMTEpKTtnbF9GcmFnQ29sb3I9dmVjNChjb2xvcixsdW1pbmFuY2UqYWxwaGFUaHJlc2hvbGQrKDEuMC1hbHBoYVRocmVzaG9sZCkpO31gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IGZpcmVQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImltcG9ydCB7IHNlcmlhbGl6ZSwgc2VyaWFsaXplQXNWZWN0b3IyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzXCI7XHJcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25IZWxwZXIgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnMuc2VyaWFsaXphdGlvblwiO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC52ZWN0b3JcIjtcclxuaW1wb3J0IHsgQ29sb3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC5jb2xvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5cclxuaW1wb3J0IFwiLi9maXJlUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBGaXJlUHJvY2VkdXJhbFRleHR1cmUgZXh0ZW5kcyBQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICBwcml2YXRlIF90aW1lOiBudW1iZXIgPSAwLjA7XHJcbiAgICBwcml2YXRlIF9zcGVlZCA9IG5ldyBWZWN0b3IyKDAuNSwgMC4zKTtcclxuICAgIHByaXZhdGUgX2F1dG9HZW5lcmF0ZVRpbWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfZmlyZUNvbG9yczogQ29sb3IzW107XHJcbiAgICBwcml2YXRlIF9hbHBoYVRocmVzaG9sZDogbnVtYmVyID0gMC41O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBzY2VuZTogTnVsbGFibGU8U2NlbmU+ID0gbnVsbCwgZmFsbGJhY2tUZXh0dXJlPzogVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzPzogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHNpemUsIFwiZmlyZVByb2NlZHVyYWxUZXh0dXJlXCIsIHNjZW5lLCBmYWxsYmFja1RleHR1cmUsIGdlbmVyYXRlTWlwTWFwcyk7XHJcbiAgICAgICAgdGhpcy5fZmlyZUNvbG9ycyA9IEZpcmVQcm9jZWR1cmFsVGV4dHVyZS5SZWRGaXJlQ29sb3JzO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2hhZGVyVW5pZm9ybXMoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcInRpbWVcIiwgdGhpcy5fdGltZSk7XHJcbiAgICAgICAgdGhpcy5zZXRWZWN0b3IyKFwic3BlZWRcIiwgdGhpcy5fc3BlZWQpO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiYzFcIiwgdGhpcy5fZmlyZUNvbG9yc1swXSk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJjMlwiLCB0aGlzLl9maXJlQ29sb3JzWzFdKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImMzXCIsIHRoaXMuX2ZpcmVDb2xvcnNbMl0pO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiYzRcIiwgdGhpcy5fZmlyZUNvbG9yc1szXSk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJjNVwiLCB0aGlzLl9maXJlQ29sb3JzWzRdKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImM2XCIsIHRoaXMuX2ZpcmVDb2xvcnNbNV0pO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJhbHBoYVRocmVzaG9sZFwiLCB0aGlzLl9hbHBoYVRocmVzaG9sZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIHJlbmRlcih1c2VDYW1lcmFQb3N0UHJvY2Vzcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBjb25zdCBzY2VuZSA9IHRoaXMuZ2V0U2NlbmUoKTtcclxuICAgICAgICBpZiAodGhpcy5fYXV0b0dlbmVyYXRlVGltZSAmJiBzY2VuZSkge1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lICs9IHNjZW5lLmdldEFuaW1hdGlvblJhdGlvKCkgKiAwLjAzO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN1cGVyLnJlbmRlcih1c2VDYW1lcmFQb3N0UHJvY2Vzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgUHVycGxlRmlyZUNvbG9ycygpOiBDb2xvcjNbXSB7XHJcbiAgICAgICAgcmV0dXJuIFtuZXcgQ29sb3IzKDAuNSwgMC4wLCAxLjApLCBuZXcgQ29sb3IzKDAuOSwgMC4wLCAxLjApLCBuZXcgQ29sb3IzKDAuMiwgMC4wLCAxLjApLCBuZXcgQ29sb3IzKDEuMCwgMC45LCAxLjApLCBuZXcgQ29sb3IzKDAuMSwgMC4xLCAxLjApLCBuZXcgQ29sb3IzKDAuOSwgMC45LCAxLjApXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBHcmVlbkZpcmVDb2xvcnMoKTogQ29sb3IzW10ge1xyXG4gICAgICAgIHJldHVybiBbbmV3IENvbG9yMygwLjUsIDEuMCwgMC4wKSwgbmV3IENvbG9yMygwLjUsIDEuMCwgMC4wKSwgbmV3IENvbG9yMygwLjMsIDAuNCwgMC4wKSwgbmV3IENvbG9yMygwLjUsIDEuMCwgMC4wKSwgbmV3IENvbG9yMygwLjIsIDAuMCwgMC4wKSwgbmV3IENvbG9yMygwLjUsIDEuMCwgMC4wKV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgUmVkRmlyZUNvbG9ycygpOiBDb2xvcjNbXSB7XHJcbiAgICAgICAgcmV0dXJuIFtuZXcgQ29sb3IzKDAuNSwgMC4wLCAwLjEpLCBuZXcgQ29sb3IzKDAuOSwgMC4wLCAwLjApLCBuZXcgQ29sb3IzKDAuMiwgMC4wLCAwLjApLCBuZXcgQ29sb3IzKDEuMCwgMC45LCAwLjApLCBuZXcgQ29sb3IzKDAuMSwgMC4xLCAwLjEpLCBuZXcgQ29sb3IzKDAuOSwgMC45LCAwLjkpXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBCbHVlRmlyZUNvbG9ycygpOiBDb2xvcjNbXSB7XHJcbiAgICAgICAgcmV0dXJuIFtuZXcgQ29sb3IzKDAuMSwgMC4wLCAwLjUpLCBuZXcgQ29sb3IzKDAuMCwgMC4wLCAwLjUpLCBuZXcgQ29sb3IzKDAuMSwgMC4wLCAwLjIpLCBuZXcgQ29sb3IzKDAuMCwgMC4wLCAxLjApLCBuZXcgQ29sb3IzKDAuMSwgMC4yLCAwLjMpLCBuZXcgQ29sb3IzKDAuMCwgMC4yLCAwLjkpXTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgYXV0b0dlbmVyYXRlVGltZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXV0b0dlbmVyYXRlVGltZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGF1dG9HZW5lcmF0ZVRpbWUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9hdXRvR2VuZXJhdGVUaW1lID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBmaXJlQ29sb3JzKCk6IENvbG9yM1tdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZmlyZUNvbG9ycztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGZpcmVDb2xvcnModmFsdWU6IENvbG9yM1tdKSB7XHJcbiAgICAgICAgdGhpcy5fZmlyZUNvbG9ycyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgdGltZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgdGltZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fdGltZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplQXNWZWN0b3IyKClcclxuICAgIHB1YmxpYyBnZXQgc3BlZWQoKTogVmVjdG9yMiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NwZWVkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc3BlZWQodmFsdWU6IFZlY3RvcjIpIHtcclxuICAgICAgICB0aGlzLl9zcGVlZCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgYWxwaGFUaHJlc2hvbGQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWxwaGFUaHJlc2hvbGQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBhbHBoYVRocmVzaG9sZCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fYWxwaGFUaHJlc2hvbGQgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXJpYWxpemVzIHRoaXMgZmlyZSBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCBmaXJlIHByb2NlZHVyYWwgdGV4dHVyZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25PYmplY3QgPSBTZXJpYWxpemF0aW9uSGVscGVyLlNlcmlhbGl6ZSh0aGlzLCBzdXBlci5zZXJpYWxpemUoKSk7XHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5jdXN0b21UeXBlID0gXCJCQUJZTE9OLkZpcmVQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5cclxuICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmZpcmVDb2xvcnMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2ZpcmVDb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5maXJlQ29sb3JzLnB1c2godGhpcy5fZmlyZUNvbG9yc1tpXS5hc0FycmF5KCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgRmlyZSBQcm9jZWR1cmFsIFRleHR1cmUgZnJvbSBwYXJzZWQgZmlyZSBwcm9jZWR1cmFsIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHBhcnNlZFRleHR1cmUgZGVmaW5lcyBwYXJzZWQgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgY3VycmVudCBzY2VuZVxyXG4gICAgICogQHBhcmFtIHJvb3RVcmwgZGVmaW5lcyB0aGUgcm9vdCBVUkwgY29udGFpbmluZyBmaXJlIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgRmlyZSBQcm9jZWR1cmFsIFRleHR1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBQYXJzZShwYXJzZWRUZXh0dXJlOiBhbnksIHNjZW5lOiBTY2VuZSwgcm9vdFVybDogc3RyaW5nKTogRmlyZVByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IEZpcmVQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29sb3JzOiBDb2xvcjNbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyc2VkVGV4dHVyZS5maXJlQ29sb3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbG9ycy5wdXNoKENvbG9yMy5Gcm9tQXJyYXkocGFyc2VkVGV4dHVyZS5maXJlQ29sb3JzW2ldKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0ZXh0dXJlLmZpcmVDb2xvcnMgPSBjb2xvcnM7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWdpc3RlckNsYXNzKFwiQkFCWUxPTi5GaXJlUHJvY2VkdXJhbFRleHR1cmVcIiwgRmlyZVByb2NlZHVyYWxUZXh0dXJlKTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vZmlyZVByb2NlZHVyYWxUZXh0dXJlXCI7XHJcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcImdyYXNzUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHByZWNpc2lvbiBoaWdocCBmbG9hdDt2YXJ5aW5nIHZlYzIgdlBvc2l0aW9uO3ZhcnlpbmcgdmVjMiB2VVY7dW5pZm9ybSB2ZWMzIGhlcmIxQ29sb3I7dW5pZm9ybSB2ZWMzIGhlcmIyQ29sb3I7dW5pZm9ybSB2ZWMzIGhlcmIzQ29sb3I7dW5pZm9ybSB2ZWMzIGdyb3VuZENvbG9yO2Zsb2F0IHJhbmQodmVjMiBuKSB7cmV0dXJuIGZyYWN0KGNvcyhkb3Qobix2ZWMyKDEyLjk4OTgsNC4xNDE0KSkpKjQzNzU4LjU0NTMpO31cbmZsb2F0IG5vaXNlKHZlYzIgbikge2NvbnN0IHZlYzIgZD12ZWMyKDAuMCwxLjApO3ZlYzIgYj1mbG9vcihuKSxmPXNtb290aHN0ZXAodmVjMigwLjApLHZlYzIoMS4wKSxmcmFjdChuKSk7cmV0dXJuIG1peChtaXgocmFuZChiKSxyYW5kKGIrZC55eCksZi54KSxtaXgocmFuZChiK2QueHkpLHJhbmQoYitkLnl5KSxmLngpLGYueSk7fVxuZmxvYXQgZmJtKHZlYzIgbikge2Zsb2F0IHRvdGFsPTAuMCxhbXBsaXR1ZGU9MS4wO2ZvciAoaW50IGk9MDsgaTw0OyBpKyspIHt0b3RhbCs9bm9pc2UobikqYW1wbGl0dWRlO24rPW47YW1wbGl0dWRlKj0wLjU7fVxucmV0dXJuIHRvdGFsO31cbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX0RFRklOSVRJT05TXG52b2lkIG1haW4odm9pZCkge1xuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfTUFJTl9CRUdJTlxudmVjMyBjb2xvcj1taXgoZ3JvdW5kQ29sb3IsaGVyYjFDb2xvcixyYW5kKGdsX0ZyYWdDb29yZC54eSo0LjApKTtjb2xvcj1taXgoY29sb3IsaGVyYjJDb2xvcixyYW5kKGdsX0ZyYWdDb29yZC54eSo4LjApKTtjb2xvcj1taXgoY29sb3IsaGVyYjNDb2xvcixyYW5kKGdsX0ZyYWdDb29yZC54eSkpO2NvbG9yPW1peChjb2xvcixoZXJiMUNvbG9yLGZibShnbF9GcmFnQ29vcmQueHkqMTYuMCkpO2dsX0ZyYWdDb2xvcj12ZWM0KGNvbG9yLDEuMCk7XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9NQUlOX0VORFxufWA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3QgZ3Jhc3NQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImltcG9ydCB7IHNlcmlhbGl6ZUFzQ29sb3IzIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzXCI7XHJcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25IZWxwZXIgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnMuc2VyaWFsaXphdGlvblwiO1xyXG5pbXBvcnQgeyBDb2xvcjMgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLmNvbG9yXCI7XHJcbmltcG9ydCB0eXBlIHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyYWxUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL1Byb2NlZHVyYWxzL3Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBSZWdpc3RlckNsYXNzIH0gZnJvbSBcImNvcmUvTWlzYy90eXBlU3RvcmVcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcblxyXG5pbXBvcnQgXCIuL2dyYXNzUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmFzc1Byb2NlZHVyYWxUZXh0dXJlIGV4dGVuZHMgUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgcHJpdmF0ZSBfZ3Jhc3NDb2xvcnM6IENvbG9yM1tdO1xyXG4gICAgcHJpdmF0ZSBfZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IzKDEsIDEsIDEpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBzY2VuZTogTnVsbGFibGU8U2NlbmU+ID0gbnVsbCwgZmFsbGJhY2tUZXh0dXJlPzogVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzPzogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHNpemUsIFwiZ3Jhc3NQcm9jZWR1cmFsVGV4dHVyZVwiLCBzY2VuZSwgZmFsbGJhY2tUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHMpO1xyXG5cclxuICAgICAgICB0aGlzLl9ncmFzc0NvbG9ycyA9IFtuZXcgQ29sb3IzKDAuMjksIDAuMzgsIDAuMDIpLCBuZXcgQ29sb3IzKDAuMzYsIDAuNDksIDAuMDkpLCBuZXcgQ29sb3IzKDAuNTEsIDAuNiwgMC4yOCldO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiaGVyYjFDb2xvclwiLCB0aGlzLl9ncmFzc0NvbG9yc1swXSk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJoZXJiMkNvbG9yXCIsIHRoaXMuX2dyYXNzQ29sb3JzWzFdKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImhlcmIzQ29sb3JcIiwgdGhpcy5fZ3Jhc3NDb2xvcnNbMl0pO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiZ3JvdW5kQ29sb3JcIiwgdGhpcy5fZ3JvdW5kQ29sb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgZ3Jhc3NDb2xvcnMoKTogQ29sb3IzW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ncmFzc0NvbG9ycztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGdyYXNzQ29sb3JzKHZhbHVlOiBDb2xvcjNbXSkge1xyXG4gICAgICAgIHRoaXMuX2dyYXNzQ29sb3JzID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemVBc0NvbG9yMygpXHJcbiAgICBwdWJsaWMgZ2V0IGdyb3VuZENvbG9yKCk6IENvbG9yMyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VuZENvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZ3JvdW5kQ29sb3IodmFsdWU6IENvbG9yMykge1xyXG4gICAgICAgIHRoaXMuX2dyb3VuZENvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIGdyYXNzIHByb2NlZHVyYWwgdGV4dHVyZVxyXG4gICAgICogQHJldHVybnMgYSBzZXJpYWxpemVkIGdyYXNzIHByb2NlZHVyYWwgdGV4dHVyZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25PYmplY3QgPSBTZXJpYWxpemF0aW9uSGVscGVyLlNlcmlhbGl6ZSh0aGlzLCBzdXBlci5zZXJpYWxpemUoKSk7XHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5jdXN0b21UeXBlID0gXCJCQUJZTE9OLkdyYXNzUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5ncmFzc0NvbG9ycyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZ3Jhc3NDb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5ncmFzc0NvbG9ycy5wdXNoKHRoaXMuX2dyYXNzQ29sb3JzW2ldLmFzQXJyYXkoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbk9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBHcmFzcyBQcm9jZWR1cmFsIFRleHR1cmUgZnJvbSBwYXJzZWQgZ3Jhc3MgcHJvY2VkdXJhbCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBwYXJzZWRUZXh0dXJlIGRlZmluZXMgcGFyc2VkIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHNjZW5lIGRlZmluZXMgdGhlIGN1cnJlbnQgc2NlbmVcclxuICAgICAqIEBwYXJhbSByb290VXJsIGRlZmluZXMgdGhlIHJvb3QgVVJMIGNvbnRhaW5pbmcgZ3Jhc3MgcHJvY2VkdXJhbCB0ZXh0dXJlIGluZm9ybWF0aW9uXHJcbiAgICAgKiBAcmV0dXJucyBhIHBhcnNlZCBHcmFzcyBQcm9jZWR1cmFsIFRleHR1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBQYXJzZShwYXJzZWRUZXh0dXJlOiBhbnksIHNjZW5lOiBTY2VuZSwgcm9vdFVybDogc3RyaW5nKTogR3Jhc3NQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IFNlcmlhbGl6YXRpb25IZWxwZXIuUGFyc2UoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBHcmFzc1Byb2NlZHVyYWxUZXh0dXJlKHBhcnNlZFRleHR1cmUubmFtZSwgcGFyc2VkVGV4dHVyZS5fc2l6ZSwgc2NlbmUsIHVuZGVmaW5lZCwgcGFyc2VkVGV4dHVyZS5fZ2VuZXJhdGVNaXBNYXBzKSxcclxuICAgICAgICAgICAgcGFyc2VkVGV4dHVyZSxcclxuICAgICAgICAgICAgc2NlbmUsXHJcbiAgICAgICAgICAgIHJvb3RVcmxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCBjb2xvcnM6IENvbG9yM1tdID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJzZWRUZXh0dXJlLmdyYXNzQ29sb3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbG9ycy5wdXNoKENvbG9yMy5Gcm9tQXJyYXkocGFyc2VkVGV4dHVyZS5ncmFzc0NvbG9yc1tpXSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGV4dHVyZS5ncmFzc0NvbG9ycyA9IGNvbG9ycztcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLkdyYXNzUHJvY2VkdXJhbFRleHR1cmVcIiwgR3Jhc3NQcm9jZWR1cmFsVGV4dHVyZSk7XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL2dyYXNzUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgKi9cclxuZXhwb3J0ICogZnJvbSBcIi4vYnJpY2svaW5kZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vY2xvdWQvaW5kZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vZmlyZS9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9ncmFzcy9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9tYXJibGUvaW5kZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vbm9ybWFsTWFwL2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3Blcmxpbk5vaXNlL2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3JvYWQvaW5kZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vc3RhcmZpZWxkL2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3dvb2QvaW5kZXhcIjtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vbWFyYmxlUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwibWFyYmxlUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHByZWNpc2lvbiBoaWdocCBmbG9hdDt2YXJ5aW5nIHZlYzIgdlBvc2l0aW9uO3ZhcnlpbmcgdmVjMiB2VVY7dW5pZm9ybSBmbG9hdCBudW1iZXJPZlRpbGVzSGVpZ2h0O3VuaWZvcm0gZmxvYXQgbnVtYmVyT2ZUaWxlc1dpZHRoO3VuaWZvcm0gZmxvYXQgYW1wbGl0dWRlO3VuaWZvcm0gdmVjMyBtYXJibGVDb2xvcjt1bmlmb3JtIHZlYzMgam9pbnRDb2xvcjtjb25zdCB2ZWMzIHRpbGVTaXplPXZlYzMoMS4xLDEuMCwxLjEpO2NvbnN0IHZlYzMgdGlsZVBjdD12ZWMzKDAuOTgsMS4wLDAuOTgpO2Zsb2F0IHJhbmQodmVjMiBuKSB7cmV0dXJuIGZyYWN0KGNvcyhkb3Qobix2ZWMyKDEyLjk4OTgsNC4xNDE0KSkpKjQzNzU4LjU0NTMpO31cbmZsb2F0IG5vaXNlKHZlYzIgbikge2NvbnN0IHZlYzIgZD12ZWMyKDAuMCwxLjApO3ZlYzIgYj1mbG9vcihuKSxmPXNtb290aHN0ZXAodmVjMigwLjApLHZlYzIoMS4wKSxmcmFjdChuKSk7cmV0dXJuIG1peChtaXgocmFuZChiKSxyYW5kKGIrZC55eCksZi54KSxtaXgocmFuZChiK2QueHkpLHJhbmQoYitkLnl5KSxmLngpLGYueSk7fVxuZmxvYXQgdHVyYnVsZW5jZSh2ZWMyIFApXG57ZmxvYXQgdmFsPTAuMDtmbG9hdCBmcmVxPTEuMDtmb3IgKGludCBpPTA7IGk8NDsgaSsrKVxue3ZhbCs9YWJzKG5vaXNlKFAqZnJlcSkvZnJlcSk7ZnJlcSo9Mi4wNzt9XG5yZXR1cm4gdmFsO31cbmZsb2F0IHJvdW5kRihmbG9hdCBudW1iZXIpe3JldHVybiBzaWduKG51bWJlcikqZmxvb3IoYWJzKG51bWJlcikrMC41KTt9XG52ZWMzIG1hcmJsZV9jb2xvcihmbG9hdCB4KVxue3ZlYzMgY29sO3g9MC41Kih4KzEuKTt4PXNxcnQoeCk7IFxueD1zcXJ0KHgpO3g9c3FydCh4KTtjb2w9dmVjMyguMisuNzUqeCk7IFxuY29sLmIqPTAuOTU7IFxucmV0dXJuIGNvbDt9XG52b2lkIG1haW4oKVxue2Zsb2F0IGJyaWNrVz0xLjAvbnVtYmVyT2ZUaWxlc1dpZHRoO2Zsb2F0IGJyaWNrSD0xLjAvbnVtYmVyT2ZUaWxlc0hlaWdodDtmbG9hdCBqb2ludFdQZXJjZW50YWdlPTAuMDE7ZmxvYXQgam9pbnRIUGVyY2VudGFnZT0wLjAxO3ZlYzMgY29sb3I9bWFyYmxlQ29sb3I7ZmxvYXQgeWk9dlVWLnkvYnJpY2tIO2Zsb2F0IG55aT1yb3VuZEYoeWkpO2Zsb2F0IHhpPXZVVi54L2JyaWNrVztpZiAobW9kKGZsb29yKHlpKSwyLjApPT0wLjApe3hpPXhpLTAuNTt9XG5mbG9hdCBueGk9cm91bmRGKHhpKTt2ZWMyIGJyaWNrdlVWPXZlYzIoKHhpLWZsb29yKHhpKSkvYnJpY2tILCh5aS1mbG9vcih5aSkpL2JyaWNrVyk7aWYgKHlpPG55aStqb2ludEhQZXJjZW50YWdlICYmIHlpPm55aS1qb2ludEhQZXJjZW50YWdlKXtjb2xvcj1taXgoam9pbnRDb2xvcix2ZWMzKDAuMzcsMC4yNSwwLjI1KSwoeWktbnlpKS9qb2ludEhQZXJjZW50YWdlKzAuMik7fVxuZWxzZSBpZiAoeGk8bnhpK2pvaW50V1BlcmNlbnRhZ2UgJiYgeGk+bnhpLWpvaW50V1BlcmNlbnRhZ2Upe2NvbG9yPW1peChqb2ludENvbG9yLHZlYzMoMC40NCwwLjQ0LDAuNDQpLCh4aS1ueGkpL2pvaW50V1BlcmNlbnRhZ2UrMC4yKTt9XG5lbHNlIHtmbG9hdCB0PTYuMjgqYnJpY2t2VVYueC8odGlsZVNpemUueCtub2lzZSh2ZWMyKHZVVikqNi4wKSk7dCs9YW1wbGl0dWRlKnR1cmJ1bGVuY2UoYnJpY2t2VVYueHkpO3Q9c2luKHQpO2NvbG9yPW1hcmJsZV9jb2xvcih0KTt9XG5nbF9GcmFnQ29sb3I9dmVjNChjb2xvciwwLjApO31gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IG1hcmJsZVByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiaW1wb3J0IHsgc2VyaWFsaXplIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzXCI7XHJcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25IZWxwZXIgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnMuc2VyaWFsaXphdGlvblwiO1xyXG5pbXBvcnQgeyBDb2xvcjMgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLmNvbG9yXCI7XHJcbmltcG9ydCB0eXBlIHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyYWxUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL1Byb2NlZHVyYWxzL3Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBSZWdpc3RlckNsYXNzIH0gZnJvbSBcImNvcmUvTWlzYy90eXBlU3RvcmVcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcblxyXG5pbXBvcnQgXCIuL21hcmJsZVByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWFyYmxlUHJvY2VkdXJhbFRleHR1cmUgZXh0ZW5kcyBQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICBwcml2YXRlIF9udW1iZXJPZlRpbGVzSGVpZ2h0OiBudW1iZXIgPSAzO1xyXG4gICAgcHJpdmF0ZSBfbnVtYmVyT2ZUaWxlc1dpZHRoOiBudW1iZXIgPSAzO1xyXG4gICAgcHJpdmF0ZSBfYW1wbGl0dWRlOiBudW1iZXIgPSA5LjA7XHJcbiAgICBwcml2YXRlIF9qb2ludENvbG9yID0gbmV3IENvbG9yMygwLjcyLCAwLjcyLCAwLjcyKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNpemU6IG51bWJlciwgc2NlbmU6IE51bGxhYmxlPFNjZW5lPiA9IG51bGwsIGZhbGxiYWNrVGV4dHVyZT86IFRleHR1cmUsIGdlbmVyYXRlTWlwTWFwcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzaXplLCBcIm1hcmJsZVByb2NlZHVyYWxUZXh0dXJlXCIsIHNjZW5lLCBmYWxsYmFja1RleHR1cmUsIGdlbmVyYXRlTWlwTWFwcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTaGFkZXJVbmlmb3JtcygpIHtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwibnVtYmVyT2ZUaWxlc0hlaWdodFwiLCB0aGlzLl9udW1iZXJPZlRpbGVzSGVpZ2h0KTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwibnVtYmVyT2ZUaWxlc1dpZHRoXCIsIHRoaXMuX251bWJlck9mVGlsZXNXaWR0aCk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcImFtcGxpdHVkZVwiLCB0aGlzLl9hbXBsaXR1ZGUpO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiam9pbnRDb2xvclwiLCB0aGlzLl9qb2ludENvbG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgbnVtYmVyT2ZUaWxlc0hlaWdodCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJPZlRpbGVzSGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgbnVtYmVyT2ZUaWxlc0hlaWdodCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fbnVtYmVyT2ZUaWxlc0hlaWdodCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgYW1wbGl0dWRlKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FtcGxpdHVkZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGFtcGxpdHVkZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fYW1wbGl0dWRlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBudW1iZXJPZlRpbGVzV2lkdGgoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZUaWxlc1dpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgbnVtYmVyT2ZUaWxlc1dpZHRoKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9udW1iZXJPZlRpbGVzV2lkdGggPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGpvaW50Q29sb3IoKTogQ29sb3IzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fam9pbnRDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGpvaW50Q29sb3IodmFsdWU6IENvbG9yMykge1xyXG4gICAgICAgIHRoaXMuX2pvaW50Q29sb3IgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXJpYWxpemVzIHRoaXMgbWFyYmxlIHByb2NlZHVyYWwgdGV4dHVyZVxyXG4gICAgICogQHJldHVybnMgYSBzZXJpYWxpemVkIG1hcmJsZSBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5NYXJibGVQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5cclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbk9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBNYXJibGUgUHJvY2VkdXJhbCBUZXh0dXJlIGZyb20gcGFyc2VkIG1hcmJsZSBwcm9jZWR1cmFsIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHBhcnNlZFRleHR1cmUgZGVmaW5lcyBwYXJzZWQgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgY3VycmVudCBzY2VuZVxyXG4gICAgICogQHBhcmFtIHJvb3RVcmwgZGVmaW5lcyB0aGUgcm9vdCBVUkwgY29udGFpbmluZyBtYXJibGUgcHJvY2VkdXJhbCB0ZXh0dXJlIGluZm9ybWF0aW9uXHJcbiAgICAgKiBAcmV0dXJucyBhIHBhcnNlZCBNYXJibGUgUHJvY2VkdXJhbCBUZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2UocGFyc2VkVGV4dHVyZTogYW55LCBzY2VuZTogU2NlbmUsIHJvb3RVcmw6IHN0cmluZyk6IE1hcmJsZVByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IE1hcmJsZVByb2NlZHVyYWxUZXh0dXJlKHBhcnNlZFRleHR1cmUubmFtZSwgcGFyc2VkVGV4dHVyZS5fc2l6ZSwgc2NlbmUsIHVuZGVmaW5lZCwgcGFyc2VkVGV4dHVyZS5fZ2VuZXJhdGVNaXBNYXBzKSxcclxuICAgICAgICAgICAgcGFyc2VkVGV4dHVyZSxcclxuICAgICAgICAgICAgc2NlbmUsXHJcbiAgICAgICAgICAgIHJvb3RVcmxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH1cclxufVxyXG5cclxuUmVnaXN0ZXJDbGFzcyhcIkJBQllMT04uTWFyYmxlUHJvY2VkdXJhbFRleHR1cmVcIiwgTWFyYmxlUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9ub3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJub3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3VuaWZvcm0gc2FtcGxlcjJEIGJhc2VTYW1wbGVyO3VuaWZvcm0gZmxvYXQgc2l6ZTt2YXJ5aW5nIHZlYzIgdlVWO2NvbnN0IHZlYzMgTFVNQV9DT0VGRklDSUVOVD12ZWMzKDAuMjEyNiwwLjcxNTIsMC4wNzIyKTtmbG9hdCBsdW1hQXRDb29yZCh2ZWMyIGNvb3JkKVxue3ZlYzMgcGl4ZWw9dGV4dHVyZTJEKGJhc2VTYW1wbGVyLGNvb3JkKS5yZ2I7ZmxvYXQgbHVtYT1kb3QocGl4ZWwsTFVNQV9DT0VGRklDSUVOVCk7cmV0dXJuIGx1bWE7fVxudm9pZCBtYWluKClcbntmbG9hdCBsdW1hVTA9bHVtYUF0Q29vcmQodlVWK3ZlYzIoLTEuMCwgMC4wKS9zaXplKTtmbG9hdCBsdW1hVTE9bHVtYUF0Q29vcmQodlVWK3ZlYzIoIDEuMCwgMC4wKS9zaXplKTtmbG9hdCBsdW1hVjA9bHVtYUF0Q29vcmQodlVWK3ZlYzIoIDAuMCwtMS4wKS9zaXplKTtmbG9hdCBsdW1hVjE9bHVtYUF0Q29vcmQodlVWK3ZlYzIoIDAuMCwgMS4wKS9zaXplKTt2ZWMyIHNsb3BlPSh2ZWMyKGx1bWFVMC1sdW1hVTEsbHVtYVYwLWx1bWFWMSkrMS4wKSowLjU7Z2xfRnJhZ0NvbG9yPXZlYzQoc2xvcGUsMS4wLDEuMCk7fVxuYDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBub3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImltcG9ydCB7IHNlcmlhbGl6ZUFzVGV4dHVyZSB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJhbFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvUHJvY2VkdXJhbHMvcHJvY2VkdXJhbFRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuaW1wb3J0IFwiLi9ub3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE5vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlIGV4dGVuZHMgUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgcHJpdmF0ZSBfYmFzZVRleHR1cmU6IFRleHR1cmU7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJub3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZVwiLCBzY2VuZSwgZmFsbGJhY2tUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHMpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2hhZGVyVW5pZm9ybXMoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRUZXh0dXJlKFwiYmFzZVNhbXBsZXJcIiwgdGhpcy5fYmFzZVRleHR1cmUpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJzaXplXCIsIHRoaXMuZ2V0UmVuZGVyU2l6ZSgpIGFzIG51bWJlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIHJlbmRlcih1c2VDYW1lcmFQb3N0UHJvY2Vzcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlci5yZW5kZXIodXNlQ2FtZXJhUG9zdFByb2Nlc3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSByZXNpemUoc2l6ZTogYW55LCBnZW5lcmF0ZU1pcE1hcHM6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLnJlc2l6ZShzaXplLCBnZW5lcmF0ZU1pcE1hcHMpO1xyXG5cclxuICAgICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgXCJzaXplXCIgdW5pZm9ybVxyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgaXNSZWFkeSgpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2Jhc2VUZXh0dXJlIHx8ICF0aGlzLl9iYXNlVGV4dHVyZS5pc1JlYWR5KCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmlzUmVhZHkoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplQXNUZXh0dXJlKClcclxuICAgIHB1YmxpYyBnZXQgYmFzZVRleHR1cmUoKTogVGV4dHVyZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2VUZXh0dXJlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYmFzZVRleHR1cmUodGV4dHVyZTogVGV4dHVyZSkge1xyXG4gICAgICAgIHRoaXMuX2Jhc2VUZXh0dXJlID0gdGV4dHVyZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXJpYWxpemVzIHRoaXMgbm9ybWFsIG1hcCBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCBub3JtYWwgbWFwIHByb2NlZHVyYWwgdGV4dHVyZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25PYmplY3QgPSBTZXJpYWxpemF0aW9uSGVscGVyLlNlcmlhbGl6ZSh0aGlzLCBzdXBlci5zZXJpYWxpemUoKSk7XHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5jdXN0b21UeXBlID0gXCJCQUJZTE9OLk5vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIE5vcm1hbCBNYXAgUHJvY2VkdXJhbCBUZXh0dXJlIGZyb20gcGFyc2VkIG5vcm1hbCBtYXAgcHJvY2VkdXJhbCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBwYXJzZWRUZXh0dXJlIGRlZmluZXMgcGFyc2VkIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHNjZW5lIGRlZmluZXMgdGhlIGN1cnJlbnQgc2NlbmVcclxuICAgICAqIEBwYXJhbSByb290VXJsIGRlZmluZXMgdGhlIHJvb3QgVVJMIGNvbnRhaW5pbmcgbm9ybWFsIG1hcCBwcm9jZWR1cmFsIHRleHR1cmUgaW5mb3JtYXRpb25cclxuICAgICAqIEByZXR1cm5zIGEgcGFyc2VkIE5vcm1hbCBNYXAgUHJvY2VkdXJhbCBUZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2UocGFyc2VkVGV4dHVyZTogYW55LCBzY2VuZTogU2NlbmUsIHJvb3RVcmw6IHN0cmluZyk6IE5vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IE5vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlKHBhcnNlZFRleHR1cmUubmFtZSwgcGFyc2VkVGV4dHVyZS5fc2l6ZSwgc2NlbmUsIHVuZGVmaW5lZCwgcGFyc2VkVGV4dHVyZS5fZ2VuZXJhdGVNaXBNYXBzKSxcclxuICAgICAgICAgICAgcGFyc2VkVGV4dHVyZSxcclxuICAgICAgICAgICAgc2NlbmUsXHJcbiAgICAgICAgICAgIHJvb3RVcmxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH1cclxufVxyXG5cclxuUmVnaXN0ZXJDbGFzcyhcIkJBQllMT04uTm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmVcIiwgTm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9wZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlXCI7XHJcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcInBlcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHByZWNpc2lvbiBoaWdocCBmbG9hdDt1bmlmb3JtIGZsb2F0IHNpemU7dW5pZm9ybSBmbG9hdCB0aW1lO3VuaWZvcm0gZmxvYXQgdHJhbnNsYXRpb25TcGVlZDt2YXJ5aW5nIHZlYzIgdlVWO2Zsb2F0IHIoZmxvYXQgbilcbntyZXR1cm4gZnJhY3QoY29zKG4qODkuNDIpKjM0My40Mik7fVxudmVjMiByKHZlYzIgbilcbntyZXR1cm4gdmVjMihyKG4ueCoyMy42Mi0zMDAuMCtuLnkqMzQuMzUpLHIobi54KjQ1LjEzKzI1Ni4wK24ueSozOC44OSkpOyB9XG5mbG9hdCB3b3JsZXkodmVjMiBuLGZsb2F0IHMpXG57ZmxvYXQgZGlzPTEuMDtmb3IoaW50IHg9LTE7IHg8PTE7IHgrKylcbntmb3IoaW50IHk9LTE7IHk8PTE7IHkrKylcbnt2ZWMyIHA9Zmxvb3Iobi9zKSt2ZWMyKHgseSk7ZmxvYXQgZD1sZW5ndGgocihwKSt2ZWMyKHgseSktZnJhY3Qobi9zKSk7aWYgKGRpcz5kKVxuZGlzPWQ7fX1cbnJldHVybiAxLjAtZGlzO31cbnZlYzMgaGFzaDMzKHZlYzMgcDMpXG57cDM9ZnJhY3QocDMqdmVjMygwLjEwMzEsMC4xMTM2OSwwLjEzNzg3KSk7cDMrPWRvdChwMyxwMy55eHorMTkuMTkpO3JldHVybiAtMS4wKzIuMCpmcmFjdCh2ZWMzKChwMy54K3AzLnkpKnAzLnosKHAzLngrcDMueikqcDMueSwocDMueStwMy56KSpwMy54KSk7fVxuZmxvYXQgcGVybGluTm9pc2UodmVjMyBwKVxue3ZlYzMgcGk9Zmxvb3IocCk7dmVjMyBwZj1wLXBpO3ZlYzMgdz1wZipwZiooMy4wLTIuMCpwZik7cmV0dXJuIG1peChcbm1peChcbm1peChcbmRvdChwZi12ZWMzKDAsMCwwKSxoYXNoMzMocGkrdmVjMygwLDAsMCkpKSxcbmRvdChwZi12ZWMzKDEsMCwwKSxoYXNoMzMocGkrdmVjMygxLDAsMCkpKSxcbncueFxuKSxcbm1peChcbmRvdChwZi12ZWMzKDAsMCwxKSxoYXNoMzMocGkrdmVjMygwLDAsMSkpKSxcbmRvdChwZi12ZWMzKDEsMCwxKSxoYXNoMzMocGkrdmVjMygxLDAsMSkpKSxcbncueFxuKSxcbncuelxuKSxcbm1peChcbm1peChcbmRvdChwZi12ZWMzKDAsMSwwKSxoYXNoMzMocGkrdmVjMygwLDEsMCkpKSxcbmRvdChwZi12ZWMzKDEsMSwwKSxoYXNoMzMocGkrdmVjMygxLDEsMCkpKSxcbncueFxuKSxcbm1peChcbmRvdChwZi12ZWMzKDAsMSwxKSxoYXNoMzMocGkrdmVjMygwLDEsMSkpKSxcbmRvdChwZi12ZWMzKDEsMSwxKSxoYXNoMzMocGkrdmVjMygxLDEsMSkpKSxcbncueFxuKSxcbncuelxuKSxcbncueVxuKTt9XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9ERUZJTklUSU9OU1xudm9pZCBtYWluKHZvaWQpXG57dmVjMiB1dj1nbF9GcmFnQ29vcmQueHkrdHJhbnNsYXRpb25TcGVlZDtmbG9hdCBkaXM9KFxuMS4wK3Blcmxpbk5vaXNlKHZlYzModXYvdmVjMihzaXplLHNpemUpLHRpbWUqMC4wNSkqOC4wKSlcbiogKDEuMCsod29ybGV5KHV2LDMyLjApKyAwLjUqd29ybGV5KDIuMCp1diwzMi4wKSswLjI1KndvcmxleSg0LjAqdXYsMzIuMCkpXG4pO2dsX0ZyYWdDb2xvcj12ZWM0KHZlYzMoZGlzLzQuMCksMS4wKTt9XG5gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IHBlcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgeyBzZXJpYWxpemUgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB0eXBlIHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyYWxUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL1Byb2NlZHVyYWxzL3Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBSZWdpc3RlckNsYXNzIH0gZnJvbSBcImNvcmUvTWlzYy90eXBlU3RvcmVcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcbmltcG9ydCBcIi4vcGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBlcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmUgZXh0ZW5kcyBQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyB0aW1lOiBudW1iZXIgPSAwLjA7XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgdGltZVNjYWxlOiBudW1iZXIgPSAxLjA7XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRpb25TcGVlZDogbnVtYmVyID0gMS4wO1xyXG5cclxuICAgIHByaXZhdGUgX2N1cnJlbnRUcmFuc2xhdGlvbjogbnVtYmVyID0gMDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNpemU6IG51bWJlciwgc2NlbmU6IE51bGxhYmxlPFNjZW5lPiA9IG51bGwsIGZhbGxiYWNrVGV4dHVyZT86IFRleHR1cmUsIGdlbmVyYXRlTWlwTWFwcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzaXplLCBcInBlcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJzaXplXCIsIHRoaXMuZ2V0UmVuZGVyU2l6ZSgpIGFzIG51bWJlcik7XHJcblxyXG4gICAgICAgIGNvbnN0IHNjZW5lID0gdGhpcy5nZXRTY2VuZSgpO1xyXG5cclxuICAgICAgICBpZiAoIXNjZW5lKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGVsdGFUaW1lID0gc2NlbmUuZ2V0RW5naW5lKCkuZ2V0RGVsdGFUaW1lKCk7XHJcblxyXG4gICAgICAgIHRoaXMudGltZSArPSBkZWx0YVRpbWU7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcInRpbWVcIiwgKHRoaXMudGltZSAqIHRoaXMudGltZVNjYWxlKSAvIDEwMDApO1xyXG5cclxuICAgICAgICB0aGlzLl9jdXJyZW50VHJhbnNsYXRpb24gKz0gKGRlbHRhVGltZSAqIHRoaXMudHJhbnNsYXRpb25TcGVlZCkgLyAxMDAwLjA7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcInRyYW5zbGF0aW9uU3BlZWRcIiwgdGhpcy5fY3VycmVudFRyYW5zbGF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVuZGVyKHVzZUNhbWVyYVBvc3RQcm9jZXNzPzogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgICAgICBzdXBlci5yZW5kZXIodXNlQ2FtZXJhUG9zdFByb2Nlc3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSByZXNpemUoc2l6ZTogYW55LCBnZW5lcmF0ZU1pcE1hcHM6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLnJlc2l6ZShzaXplLCBnZW5lcmF0ZU1pcE1hcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIHBlcmxpbiBub2lzZSBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCBwZXJsaW4gbm9pc2UgcHJvY2VkdXJhbCB0ZXh0dXJlIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk9iamVjdCA9IFNlcmlhbGl6YXRpb25IZWxwZXIuU2VyaWFsaXplKHRoaXMsIHN1cGVyLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmN1c3RvbVR5cGUgPSBcIkJBQllMT04uUGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5cclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbk9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBQZXJsaW4gTm9pc2UgUHJvY2VkdXJhbCBUZXh0dXJlIGZyb20gcGFyc2VkIHBlcmxpbiBub2lzZSBwcm9jZWR1cmFsIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHBhcnNlZFRleHR1cmUgZGVmaW5lcyBwYXJzZWQgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgY3VycmVudCBzY2VuZVxyXG4gICAgICogQHBhcmFtIHJvb3RVcmwgZGVmaW5lcyB0aGUgcm9vdCBVUkwgY29udGFpbmluZyBwZXJsaW4gbm9pc2UgcHJvY2VkdXJhbCB0ZXh0dXJlIGluZm9ybWF0aW9uXHJcbiAgICAgKiBAcmV0dXJucyBhIHBhcnNlZCBQZXJsaW4gTm9pc2UgUHJvY2VkdXJhbCBUZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2UocGFyc2VkVGV4dHVyZTogYW55LCBzY2VuZTogU2NlbmUsIHJvb3RVcmw6IHN0cmluZyk6IFBlcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBTZXJpYWxpemF0aW9uSGVscGVyLlBhcnNlKFxyXG4gICAgICAgICAgICAoKSA9PiBuZXcgUGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLlBlcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmVcIiwgUGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZSk7XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL3JvYWRQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJyb2FkUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHByZWNpc2lvbiBoaWdocCBmbG9hdDt2YXJ5aW5nIHZlYzIgdlVWOyBcbnVuaWZvcm0gdmVjMyByb2FkQ29sb3I7ZmxvYXQgcmFuZCh2ZWMyIG4pIHtyZXR1cm4gZnJhY3QoY29zKGRvdChuLHZlYzIoMTIuOTg5OCw0LjE0MTQpKSkqNDM3NTguNTQ1Myk7fVxuZmxvYXQgbm9pc2UodmVjMiBuKSB7Y29uc3QgdmVjMiBkPXZlYzIoMC4wLDEuMCk7dmVjMiBiPWZsb29yKG4pLGY9c21vb3Roc3RlcCh2ZWMyKDAuMCksdmVjMigxLjApLGZyYWN0KG4pKTtyZXR1cm4gbWl4KG1peChyYW5kKGIpLHJhbmQoYitkLnl4KSxmLngpLG1peChyYW5kKGIrZC54eSkscmFuZChiK2QueXkpLGYueCksZi55KTt9XG5mbG9hdCBmYm0odmVjMiBuKSB7ZmxvYXQgdG90YWw9MC4wLGFtcGxpdHVkZT0xLjA7Zm9yIChpbnQgaT0wOyBpPDQ7IGkrKykge3RvdGFsKz1ub2lzZShuKSphbXBsaXR1ZGU7bis9bjthbXBsaXR1ZGUqPTAuNTt9XG5yZXR1cm4gdG90YWw7fVxuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfREVGSU5JVElPTlNcbnZvaWQgbWFpbih2b2lkKSB7XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9NQUlOX0JFR0lOXG5mbG9hdCByYXRpb3k9bW9kKGdsX0ZyYWdDb29yZC55KjEwMC4wICxmYm0odlVWKjIuMCkpO3ZlYzMgY29sb3I9cm9hZENvbG9yKnJhdGlveTtnbF9GcmFnQ29sb3I9dmVjNChjb2xvciwxLjApO1xuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfTUFJTl9FTkRcbn1gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IHJvYWRQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImltcG9ydCB7IHNlcmlhbGl6ZUFzQ29sb3IzIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzXCI7XHJcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25IZWxwZXIgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnMuc2VyaWFsaXphdGlvblwiO1xyXG5pbXBvcnQgeyBDb2xvcjMgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLmNvbG9yXCI7XHJcbmltcG9ydCB0eXBlIHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyYWxUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL1Byb2NlZHVyYWxzL3Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBSZWdpc3RlckNsYXNzIH0gZnJvbSBcImNvcmUvTWlzYy90eXBlU3RvcmVcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcbmltcG9ydCBcIi4vcm9hZFByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUm9hZFByb2NlZHVyYWxUZXh0dXJlIGV4dGVuZHMgUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgcHJpdmF0ZSBfcm9hZENvbG9yID0gbmV3IENvbG9yMygwLjUzLCAwLjUzLCAwLjUzKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNpemU6IG51bWJlciwgc2NlbmU6IE51bGxhYmxlPFNjZW5lPiA9IG51bGwsIGZhbGxiYWNrVGV4dHVyZT86IFRleHR1cmUsIGdlbmVyYXRlTWlwTWFwcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzaXplLCBcInJvYWRQcm9jZWR1cmFsVGV4dHVyZVwiLCBzY2VuZSwgZmFsbGJhY2tUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHMpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2hhZGVyVW5pZm9ybXMoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJyb2FkQ29sb3JcIiwgdGhpcy5fcm9hZENvbG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplQXNDb2xvcjMoKVxyXG4gICAgcHVibGljIGdldCByb2FkQ29sb3IoKTogQ29sb3IzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcm9hZENvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgcm9hZENvbG9yKHZhbHVlOiBDb2xvcjMpIHtcclxuICAgICAgICB0aGlzLl9yb2FkQ29sb3IgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXJpYWxpemVzIHRoaXMgcm9hZCBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCByb2FkIHByb2NlZHVyYWwgdGV4dHVyZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25PYmplY3QgPSBTZXJpYWxpemF0aW9uSGVscGVyLlNlcmlhbGl6ZSh0aGlzLCBzdXBlci5zZXJpYWxpemUoKSk7XHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5jdXN0b21UeXBlID0gXCJCQUJZTE9OLlJvYWRQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5cclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbk9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBSb2FkIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCByb2FkIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gcGFyc2VkVGV4dHVyZSBkZWZpbmVzIHBhcnNlZCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBzY2VuZSBkZWZpbmVzIHRoZSBjdXJyZW50IHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcm9vdFVybCBkZWZpbmVzIHRoZSByb290IFVSTCBjb250YWluaW5nIHJvYWQgcHJvY2VkdXJhbCB0ZXh0dXJlIGluZm9ybWF0aW9uXHJcbiAgICAgKiBAcmV0dXJucyBhIHBhcnNlZCBSb2FkIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBSb2FkUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBTZXJpYWxpemF0aW9uSGVscGVyLlBhcnNlKFxyXG4gICAgICAgICAgICAoKSA9PiBuZXcgUm9hZFByb2NlZHVyYWxUZXh0dXJlKHBhcnNlZFRleHR1cmUubmFtZSwgcGFyc2VkVGV4dHVyZS5fc2l6ZSwgc2NlbmUsIHVuZGVmaW5lZCwgcGFyc2VkVGV4dHVyZS5fZ2VuZXJhdGVNaXBNYXBzKSxcclxuICAgICAgICAgICAgcGFyc2VkVGV4dHVyZSxcclxuICAgICAgICAgICAgc2NlbmUsXHJcbiAgICAgICAgICAgIHJvb3RVcmxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH1cclxufVxyXG5cclxuUmVnaXN0ZXJDbGFzcyhcIkJBQllMT04uUm9hZFByb2NlZHVyYWxUZXh0dXJlXCIsIFJvYWRQcm9jZWR1cmFsVGV4dHVyZSk7XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL3N0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlXCI7XHJcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcInN0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZGVmaW5lIHZvbHN0ZXBzIDIwXG4jZGVmaW5lIGl0ZXJhdGlvbnMgMTVcbnZhcnlpbmcgdmVjMiB2UG9zaXRpb247dmFyeWluZyB2ZWMyIHZVVjt1bmlmb3JtIGZsb2F0IHRpbWU7dW5pZm9ybSBmbG9hdCBhbHBoYTt1bmlmb3JtIGZsb2F0IGJldGE7dW5pZm9ybSBmbG9hdCB6b29tO3VuaWZvcm0gZmxvYXQgZm9ybXVwYXJhbTt1bmlmb3JtIGZsb2F0IHN0ZXBzaXplO3VuaWZvcm0gZmxvYXQgdGlsZTt1bmlmb3JtIGZsb2F0IGJyaWdodG5lc3M7dW5pZm9ybSBmbG9hdCBkYXJrbWF0dGVyO3VuaWZvcm0gZmxvYXQgZGlzdGZhZGluZzt1bmlmb3JtIGZsb2F0IHNhdHVyYXRpb247dm9pZCBtYWluKClcbnt2ZWMzIGRpcj12ZWMzKHZVVip6b29tLDEuKTtmbG9hdCBsb2NhbFRpbWU9dGltZSowLjAwMDE7bWF0MiByb3QxPW1hdDIoY29zKGFscGhhKSxzaW4oYWxwaGEpLC1zaW4oYWxwaGEpLGNvcyhhbHBoYSkpO21hdDIgcm90Mj1tYXQyKGNvcyhiZXRhKSxzaW4oYmV0YSksLXNpbihiZXRhKSxjb3MoYmV0YSkpO2Rpci54eio9cm90MTtkaXIueHkqPXJvdDI7dmVjMyBmcm9tXz12ZWMzKDEuLC41LDAuNSk7ZnJvbV8rPXZlYzMoLTIuLGxvY2FsVGltZSoyLixsb2NhbFRpbWUpO2Zyb21fLnh6Kj1yb3QxO2Zyb21fLnh5Kj1yb3QyO2Zsb2F0IHM9MC4xLGZhZGU9MS47dmVjMyB2PXZlYzMoMC4pO2ZvciAoaW50IHI9MDsgcjx2b2xzdGVwczsgcisrKSB7dmVjMyBwPWZyb21fK3MqZGlyKi41O3A9YWJzKHZlYzModGlsZSktbW9kKHAsdmVjMyh0aWxlKjIuKSkpOyBcbmZsb2F0IHBhLGE9cGE9MC47Zm9yIChpbnQgaT0wOyBpPGl0ZXJhdGlvbnM7IGkrKykge3A9YWJzKHApL2RvdChwLHApLWZvcm11cGFyYW07IFxuYSs9YWJzKGxlbmd0aChwKS1wYSk7IFxucGE9bGVuZ3RoKHApO31cbmZsb2F0IGRtPW1heCgwLixkYXJrbWF0dGVyLWEqYSouMDAxKTsgXG5hKj1hKmE7IFxuaWYgKHI+NikgZmFkZSo9MS4tZG07IFxudis9ZmFkZTt2Kz12ZWMzKHMscypzLHMqcypzKnMpKmEqYnJpZ2h0bmVzcypmYWRlOyBcbmZhZGUqPWRpc3RmYWRpbmc7IFxucys9c3RlcHNpemU7fVxudj1taXgodmVjMyhsZW5ndGgodikpLHYsc2F0dXJhdGlvbik7IFxuZ2xfRnJhZ0NvbG9yPXZlYzQodiouMDEsMS4pO31gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IHN0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiaW1wb3J0IHsgc2VyaWFsaXplIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzXCI7XHJcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25IZWxwZXIgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnMuc2VyaWFsaXphdGlvblwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5pbXBvcnQgXCIuL3N0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmUgZXh0ZW5kcyBQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICBwcml2YXRlIF90aW1lID0gMTtcclxuICAgIHByaXZhdGUgX2FscGhhID0gMC41O1xyXG4gICAgcHJpdmF0ZSBfYmV0YSA9IDAuODtcclxuICAgIHByaXZhdGUgX3pvb20gPSAwLjg7XHJcbiAgICBwcml2YXRlIF9mb3JtdXBhcmFtID0gMC41MztcclxuICAgIHByaXZhdGUgX3N0ZXBzaXplID0gMC4xO1xyXG4gICAgcHJpdmF0ZSBfdGlsZSA9IDAuODU7XHJcbiAgICBwcml2YXRlIF9icmlnaHRuZXNzID0gMC4wMDE1O1xyXG4gICAgcHJpdmF0ZSBfZGFya21hdHRlciA9IDAuNDtcclxuICAgIHByaXZhdGUgX2Rpc3RmYWRpbmcgPSAwLjczO1xyXG4gICAgcHJpdmF0ZSBfc2F0dXJhdGlvbiA9IDAuODU7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJzdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZVwiLCBzY2VuZSwgZmFsbGJhY2tUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHMpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2hhZGVyVW5pZm9ybXMoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcInRpbWVcIiwgdGhpcy5fdGltZSk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcImFscGhhXCIsIHRoaXMuX2FscGhhKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiYmV0YVwiLCB0aGlzLl9iZXRhKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiem9vbVwiLCB0aGlzLl96b29tKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiZm9ybXVwYXJhbVwiLCB0aGlzLl9mb3JtdXBhcmFtKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwic3RlcHNpemVcIiwgdGhpcy5fc3RlcHNpemUpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJ0aWxlXCIsIHRoaXMuX3RpbGUpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJicmlnaHRuZXNzXCIsIHRoaXMuX2JyaWdodG5lc3MpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJkYXJrbWF0dGVyXCIsIHRoaXMuX2RhcmttYXR0ZXIpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJkaXN0ZmFkaW5nXCIsIHRoaXMuX2Rpc3RmYWRpbmcpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJzYXR1cmF0aW9uXCIsIHRoaXMuX3NhdHVyYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCB0aW1lKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB0aW1lKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl90aW1lID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBhbHBoYSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hbHBoYTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGFscGhhKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9hbHBoYSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgYmV0YSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9iZXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYmV0YSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fYmV0YSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgZm9ybXVwYXJhbSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9mb3JtdXBhcmFtO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZm9ybXVwYXJhbSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fZm9ybXVwYXJhbSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgc3RlcHNpemUoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RlcHNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzdGVwc2l6ZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fc3RlcHNpemUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IHpvb20oKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fem9vbTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHpvb20odmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX3pvb20gPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IHRpbGUoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdGlsZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHRpbGUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX3RpbGUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGJyaWdodG5lc3MoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYnJpZ2h0bmVzcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGJyaWdodG5lc3ModmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2JyaWdodG5lc3MgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGRhcmttYXR0ZXIoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGFya21hdHRlcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGRhcmttYXR0ZXIodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2RhcmttYXR0ZXIgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGRpc3RmYWRpbmcoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzdGZhZGluZztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGRpc3RmYWRpbmcodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2Rpc3RmYWRpbmcgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IHNhdHVyYXRpb24oKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2F0dXJhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNhdHVyYXRpb24odmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX3NhdHVyYXRpb24gPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXJpYWxpemVzIHRoaXMgc3RhcmZpZWxkIHByb2NlZHVyYWwgdGV4dHVyZVxyXG4gICAgICogQHJldHVybnMgYSBzZXJpYWxpemVkIHN0YXJmaWVsZCBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5TdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5cclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbk9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBTdGFyZmllbGQgUHJvY2VkdXJhbCBUZXh0dXJlIGZyb20gcGFyc2VkIHN0YXJ0ZmllbGQgcHJvY2VkdXJhbCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBwYXJzZWRUZXh0dXJlIGRlZmluZXMgcGFyc2VkIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHNjZW5lIGRlZmluZXMgdGhlIGN1cnJlbnQgc2NlbmVcclxuICAgICAqIEBwYXJhbSByb290VXJsIGRlZmluZXMgdGhlIHJvb3QgVVJMIGNvbnRhaW5pbmcgc3RhcnRmaWVsZCBwcm9jZWR1cmFsIHRleHR1cmUgaW5mb3JtYXRpb25cclxuICAgICAqIEByZXR1cm5zIGEgcGFyc2VkIFN0YXJmaWVsZCBQcm9jZWR1cmFsIFRleHR1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBQYXJzZShwYXJzZWRUZXh0dXJlOiBhbnksIHNjZW5lOiBTY2VuZSwgcm9vdFVybDogc3RyaW5nKTogU3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBTZXJpYWxpemF0aW9uSGVscGVyLlBhcnNlKFxyXG4gICAgICAgICAgICAoKSA9PiBuZXcgU3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmUocGFyc2VkVGV4dHVyZS5uYW1lLCBwYXJzZWRUZXh0dXJlLl9zaXplLCBzY2VuZSwgdW5kZWZpbmVkLCBwYXJzZWRUZXh0dXJlLl9nZW5lcmF0ZU1pcE1hcHMpLFxyXG4gICAgICAgICAgICBwYXJzZWRUZXh0dXJlLFxyXG4gICAgICAgICAgICBzY2VuZSxcclxuICAgICAgICAgICAgcm9vdFVybFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWdpc3RlckNsYXNzKFwiQkFCWUxPTi5TdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZVwiLCBTdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZSk7XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL3dvb2RQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJ3b29kUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHByZWNpc2lvbiBoaWdocCBmbG9hdDt2YXJ5aW5nIHZlYzIgdlBvc2l0aW9uO3ZhcnlpbmcgdmVjMiB2VVY7dW5pZm9ybSBmbG9hdCBhbXBTY2FsZTt1bmlmb3JtIHZlYzMgd29vZENvbG9yO2Zsb2F0IHJhbmQodmVjMiBuKSB7cmV0dXJuIGZyYWN0KGNvcyhkb3Qobix2ZWMyKDEyLjk4OTgsNC4xNDE0KSkpKjQzNzU4LjU0NTMpO31cbmZsb2F0IG5vaXNlKHZlYzIgbikge2NvbnN0IHZlYzIgZD12ZWMyKDAuMCwxLjApO3ZlYzIgYj1mbG9vcihuKSxmPXNtb290aHN0ZXAodmVjMigwLjApLHZlYzIoMS4wKSxmcmFjdChuKSk7cmV0dXJuIG1peChtaXgocmFuZChiKSxyYW5kKGIrZC55eCksZi54KSxtaXgocmFuZChiK2QueHkpLHJhbmQoYitkLnl5KSxmLngpLGYueSk7fVxuZmxvYXQgZmJtKHZlYzIgbikge2Zsb2F0IHRvdGFsPTAuMCxhbXBsaXR1ZGU9MS4wO2ZvciAoaW50IGk9MDsgaTw0OyBpKyspIHt0b3RhbCs9bm9pc2UobikqYW1wbGl0dWRlO24rPW47YW1wbGl0dWRlKj0wLjU7fVxucmV0dXJuIHRvdGFsO31cbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX0RFRklOSVRJT05TXG52b2lkIG1haW4odm9pZCkge1xuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfTUFJTl9CRUdJTlxuZmxvYXQgcmF0aW95PW1vZCh2VVYueCphbXBTY2FsZSwyLjArZmJtKHZVViowLjgpKTt2ZWMzIHdvb2Q9d29vZENvbG9yKnJhdGlveTtnbF9GcmFnQ29sb3I9dmVjNCh3b29kLDEuMCk7XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9NQUlOX0VORFxufWA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3Qgd29vZFByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiaW1wb3J0IHsgc2VyaWFsaXplLCBzZXJpYWxpemVBc0NvbG9yMyB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHsgQ29sb3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC5jb2xvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5pbXBvcnQgXCIuL3dvb2RQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFdvb2RQcm9jZWR1cmFsVGV4dHVyZSBleHRlbmRzIFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgIHByaXZhdGUgX2FtcFNjYWxlOiBudW1iZXIgPSAxMDAuMDtcclxuICAgIHByaXZhdGUgX3dvb2RDb2xvcjogQ29sb3IzID0gbmV3IENvbG9yMygwLjMyLCAwLjE3LCAwLjA5KTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNpemU6IG51bWJlciwgc2NlbmU6IE51bGxhYmxlPFNjZW5lPiA9IG51bGwsIGZhbGxiYWNrVGV4dHVyZT86IFRleHR1cmUsIGdlbmVyYXRlTWlwTWFwcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzaXplLCBcIndvb2RQcm9jZWR1cmFsVGV4dHVyZVwiLCBzY2VuZSwgZmFsbGJhY2tUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHMpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2hhZGVyVW5pZm9ybXMoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcImFtcFNjYWxlXCIsIHRoaXMuX2FtcFNjYWxlKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcIndvb2RDb2xvclwiLCB0aGlzLl93b29kQ29sb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBhbXBTY2FsZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hbXBTY2FsZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGFtcFNjYWxlKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9hbXBTY2FsZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplQXNDb2xvcjMoKVxyXG4gICAgcHVibGljIGdldCB3b29kQ29sb3IoKTogQ29sb3IzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fd29vZENvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgd29vZENvbG9yKHZhbHVlOiBDb2xvcjMpIHtcclxuICAgICAgICB0aGlzLl93b29kQ29sb3IgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXJpYWxpemVzIHRoaXMgd29vZCBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCB3b29kIHByb2NlZHVyYWwgdGV4dHVyZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25PYmplY3QgPSBTZXJpYWxpemF0aW9uSGVscGVyLlNlcmlhbGl6ZSh0aGlzLCBzdXBlci5zZXJpYWxpemUoKSk7XHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5jdXN0b21UeXBlID0gXCJCQUJZTE9OLldvb2RQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5cclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbk9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBXb29kIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCB3b29kIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gcGFyc2VkVGV4dHVyZSBkZWZpbmVzIHBhcnNlZCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBzY2VuZSBkZWZpbmVzIHRoZSBjdXJyZW50IHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcm9vdFVybCBkZWZpbmVzIHRoZSByb290IFVSTCBjb250YWluaW5nIHdvb2QgcHJvY2VkdXJhbCB0ZXh0dXJlIGluZm9ybWF0aW9uXHJcbiAgICAgKiBAcmV0dXJucyBhIHBhcnNlZCBXb29kIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBXb29kUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBTZXJpYWxpemF0aW9uSGVscGVyLlBhcnNlKFxyXG4gICAgICAgICAgICAoKSA9PiBuZXcgV29vZFByb2NlZHVyYWxUZXh0dXJlKHBhcnNlZFRleHR1cmUubmFtZSwgcGFyc2VkVGV4dHVyZS5fc2l6ZSwgc2NlbmUsIHVuZGVmaW5lZCwgcGFyc2VkVGV4dHVyZS5fZ2VuZXJhdGVNaXBNYXBzKSxcclxuICAgICAgICAgICAgcGFyc2VkVGV4dHVyZSxcclxuICAgICAgICAgICAgc2NlbmUsXHJcbiAgICAgICAgICAgIHJvb3RVcmxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH1cclxufVxyXG5cclxuUmVnaXN0ZXJDbGFzcyhcIkJBQllMT04uV29vZFByb2NlZHVyYWxUZXh0dXJlXCIsIFdvb2RQcm9jZWR1cmFsVGV4dHVyZSk7XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzICovXHJcbmltcG9ydCAqIGFzIFByb2NlZHVyYWxUZXh0dXJlc0xpYiBmcm9tIFwicHJvY2VkdXJhbC10ZXh0dXJlcy9pbmRleFwiO1xyXG5cclxuLyoqXHJcbiAqIExlZ2FjeSBzdXBwb3J0LCBkZWZpbmluZyB3aW5kb3cuQkFCWUxPTi5HcmlkTWF0ZXJpYWwuLi4gKGdsb2JhbCB2YXJpYWJsZSkuXHJcbiAqXHJcbiAqIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgVU1EIG1vZHVsZS5cclxuICogVGhlIGVudHJ5IHBvaW50IGZvciBhIGZ1dHVyZSBFU00gcGFja2FnZSBzaG91bGQgYmUgaW5kZXgudHNcclxuICovXHJcbmNvbnN0IGdsb2JhbE9iamVjdCA9IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdW5kZWZpbmVkO1xyXG5pZiAodHlwZW9mIGdsb2JhbE9iamVjdCAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgKDxhbnk+Z2xvYmFsT2JqZWN0KS5CQUJZTE9OID0gKDxhbnk+Z2xvYmFsT2JqZWN0KS5CQUJZTE9OIHx8IHt9O1xyXG4gICAgZm9yIChjb25zdCBtYXQgaW4gUHJvY2VkdXJhbFRleHR1cmVzTGliKSB7XHJcbiAgICAgICAgKDxhbnk+Z2xvYmFsT2JqZWN0KS5CQUJZTE9OW21hdF0gPSAoPGFueT5Qcm9jZWR1cmFsVGV4dHVyZXNMaWIpW21hdF07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCAqIGZyb20gXCJwcm9jZWR1cmFsLXRleHR1cmVzL2luZGV4XCI7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9iYWJ5bG9uanNfTWlzY19kZWNvcmF0b3JzX187IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xuXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcbiAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xuICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHQ7XG4gIH1cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgIH1cbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICB9XG4gIH1cbiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICBkb25lID0gdHJ1ZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICB9XG4gIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcbiAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xuICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gIH1cbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICByW2tdID0gYVtqXTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxuICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgcmV0dXJuIGNvb2tlZDtcbn07XG5cbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XG4gIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xuICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XG4gICAgaWYgKGFzeW5jKSB7XG4gICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICB9XG4gICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xuICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gIH1cbiAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19kaXNwb3NlUmVzb3VyY2VzKGVudikge1xuICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgfVxuICB2YXIgciwgcyA9IDA7XG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghci5hc3luYyAmJiBzID09PSAxKSByZXR1cm4gcyA9IDAsIGVudi5zdGFjay5wdXNoKHIpLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQpO1xuICAgICAgICBpZiAoci5kaXNwb3NlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHIuZGlzcG9zZS5jYWxsKHIudmFsdWUpO1xuICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBzIHw9IDE7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG5leHQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKHBhdGgsIHByZXNlcnZlSnN4KSB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcLlxcLj9cXC8vLnRlc3QocGF0aCkpIHtcbiAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcLih0c3gpJHwoKD86XFwuZCk/KSgoPzpcXC5bXi4vXSs/KT8pXFwuKFtjbV0/KXRzJC9pLCBmdW5jdGlvbiAobSwgdHN4LCBkLCBleHQsIGNtKSB7XG4gICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcbiAgICAgIH0pO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19lc0RlY29yYXRlLFxuICBfX3J1bkluaXRpYWxpemVycyxcbiAgX19wcm9wS2V5LFxuICBfX3NldEZ1bmN0aW9uTmFtZSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG4gIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uLFxufTtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCAqIGFzIHByb2NlZHVyYWxUZXh0dXJlcyBmcm9tIFwiQGx0cy9wcm9jZWR1cmFsLXRleHR1cmVzL2xlZ2FjeS9sZWdhY3lcIjtcclxuZXhwb3J0IHsgcHJvY2VkdXJhbFRleHR1cmVzIH07XHJcbmV4cG9ydCBkZWZhdWx0IHByb2NlZHVyYWxUZXh0dXJlcztcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9