babylonjs-addons 8.3.1 → 8.4.1
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.
- package/babylonjs.addons.js +32 -25
- package/babylonjs.addons.min.js +1 -1
- package/babylonjs.addons.min.js.map +1 -1
- package/package.json +2 -2
package/babylonjs.addons.js
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
exports["babylonjs-addons"] = factory(require("babylonjs"));
|
8
8
|
else
|
9
9
|
root["ADDONS"] = factory(root["BABYLON"]);
|
10
|
-
})((typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this), (
|
10
|
+
})((typeof self !== "undefined" ? self : typeof global !== "undefined" ? global : this), (__WEBPACK_EXTERNAL_MODULE_babylonjs_Meshes_mesh__) => {
|
11
11
|
return /******/ (() => { // webpackBootstrap
|
12
12
|
/******/ "use strict";
|
13
13
|
/******/ var __webpack_modules__ = ({
|
@@ -567,7 +567,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
567
567
|
/* harmony export */ HtmlMesh: () => (/* binding */ HtmlMesh)
|
568
568
|
/* harmony export */ });
|
569
569
|
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
|
570
|
-
/* harmony import */ var babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/
|
570
|
+
/* harmony import */ var babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Meshes/mesh");
|
571
571
|
/* harmony import */ var babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Meshes_mesh__WEBPACK_IMPORTED_MODULE_0__);
|
572
572
|
/* harmony import */ var _pointerEventsCaptureBehavior__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pointerEventsCaptureBehavior */ "../../../dev/addons/src/htmlMesh/pointerEventsCaptureBehavior.ts");
|
573
573
|
/* harmony import */ var _fitStrategy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fitStrategy */ "../../../dev/addons/src/htmlMesh/fitStrategy.ts");
|
@@ -926,7 +926,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
926
926
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
927
927
|
/* harmony export */ HtmlMeshRenderer: () => (/* binding */ HtmlMeshRenderer)
|
928
928
|
/* harmony export */ });
|
929
|
-
/* harmony import */ var babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/
|
929
|
+
/* harmony import */ var babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Meshes/mesh");
|
930
930
|
/* harmony import */ var babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__);
|
931
931
|
|
932
932
|
|
@@ -1142,12 +1142,13 @@ var HtmlMeshRenderer = /** @class */ (function () {
|
|
1142
1142
|
return;
|
1143
1143
|
}
|
1144
1144
|
var domElements = [this._inSceneElements.domElement, this._overlayElements.domElement, this._inSceneElements.cameraElement, this._overlayElements.cameraElement];
|
1145
|
-
domElements.
|
1145
|
+
for (var _i = 0, domElements_1 = domElements; _i < domElements_1.length; _i++) {
|
1146
|
+
var dom = domElements_1[_i];
|
1146
1147
|
if (dom) {
|
1147
1148
|
dom.style.width = "".concat(width, "px");
|
1148
1149
|
dom.style.height = "".concat(height, "px");
|
1149
1150
|
}
|
1150
|
-
}
|
1151
|
+
}
|
1151
1152
|
};
|
1152
1153
|
// prettier-ignore
|
1153
1154
|
HtmlMeshRenderer.prototype._getCameraCSSMatrix = function (matrix) {
|
@@ -1241,8 +1242,7 @@ var HtmlMeshRenderer = /** @class */ (function () {
|
|
1241
1242
|
htmlMesh._markAsUpdated();
|
1242
1243
|
};
|
1243
1244
|
HtmlMeshRenderer.prototype._render = function (scene, camera) {
|
1244
|
-
var
|
1245
|
-
var _a, _b, _c, _d, _e, _f;
|
1245
|
+
var _a, _b, _c, _d;
|
1246
1246
|
var needsUpdate = false;
|
1247
1247
|
var useRightHandedSystem = scene.useRightHandedSystem;
|
1248
1248
|
// Update the container position and size if necessary
|
@@ -1275,21 +1275,24 @@ var HtmlMeshRenderer = /** @class */ (function () {
|
|
1275
1275
|
var projectionMatrix = camera.getProjectionMatrix();
|
1276
1276
|
var fov = projectionMatrix.m[5] * this._heightHalf;
|
1277
1277
|
if (this._cache.cameraData.fov !== fov) {
|
1278
|
+
var source = [(_a = this._overlayElements) === null || _a === void 0 ? void 0 : _a.domElement, (_b = this._inSceneElements) === null || _b === void 0 ? void 0 : _b.domElement];
|
1278
1279
|
if (camera.mode == babylonjs_Maths_math__WEBPACK_IMPORTED_MODULE_0__.Camera.PERSPECTIVE_CAMERA) {
|
1279
|
-
|
1280
|
+
for (var _i = 0, source_1 = source; _i < source_1.length; _i++) {
|
1281
|
+
var el = source_1[_i];
|
1280
1282
|
if (el) {
|
1281
1283
|
el.style.webkitPerspective = fov + "px";
|
1282
1284
|
el.style.perspective = fov + "px";
|
1283
1285
|
}
|
1284
|
-
}
|
1286
|
+
}
|
1285
1287
|
}
|
1286
1288
|
else {
|
1287
|
-
|
1289
|
+
for (var _e = 0, source_2 = source; _e < source_2.length; _e++) {
|
1290
|
+
var el = source_2[_e];
|
1288
1291
|
if (el) {
|
1289
1292
|
el.style.webkitPerspective = "";
|
1290
1293
|
el.style.perspective = "";
|
1291
1294
|
}
|
1292
|
-
}
|
1295
|
+
}
|
1293
1296
|
}
|
1294
1297
|
this._cache.cameraData.fov = fov;
|
1295
1298
|
}
|
@@ -1315,18 +1318,21 @@ var HtmlMeshRenderer = /** @class */ (function () {
|
|
1315
1318
|
var cameraCSSMatrix = this._getCameraCSSMatrix(cameraMatrixWorld);
|
1316
1319
|
var style = cameraCSSMatrix;
|
1317
1320
|
if (this._cache.cameraData.style !== style) {
|
1318
|
-
[(
|
1321
|
+
var source = [(_c = this._inSceneElements) === null || _c === void 0 ? void 0 : _c.cameraElement, (_d = this._overlayElements) === null || _d === void 0 ? void 0 : _d.cameraElement];
|
1322
|
+
for (var _f = 0, source_3 = source; _f < source_3.length; _f++) {
|
1323
|
+
var el = source_3[_f];
|
1319
1324
|
if (el) {
|
1320
1325
|
el.style.webkitTransform = style;
|
1321
1326
|
el.style.transform = style;
|
1322
1327
|
}
|
1323
|
-
}
|
1328
|
+
}
|
1324
1329
|
this._cache.cameraData.style = style;
|
1325
1330
|
}
|
1326
1331
|
// _Render objects if necessary
|
1327
|
-
meshesNeedingUpdate.
|
1328
|
-
|
1329
|
-
|
1332
|
+
for (var _g = 0, meshesNeedingUpdate_1 = meshesNeedingUpdate; _g < meshesNeedingUpdate_1.length; _g++) {
|
1333
|
+
var mesh = meshesNeedingUpdate_1[_g];
|
1334
|
+
this._renderHtmlMesh(mesh, useRightHandedSystem);
|
1335
|
+
}
|
1330
1336
|
};
|
1331
1337
|
HtmlMeshRenderer.prototype._updateBaseScaleFactor = function (htmlMesh) {
|
1332
1338
|
// Get screen width and height
|
@@ -1348,7 +1354,6 @@ var HtmlMeshRenderer = /** @class */ (function () {
|
|
1348
1354
|
htmlMesh.setContentSizePx(screenWidth, screenHeight);
|
1349
1355
|
};
|
1350
1356
|
HtmlMeshRenderer.prototype._updateContainerPositionIfNeeded = function () {
|
1351
|
-
var _this = this;
|
1352
1357
|
var _a, _b;
|
1353
1358
|
// Determine if the canvas has moved on the screen
|
1354
1359
|
var canvasRect = this._engine.getRenderingCanvasClientRect();
|
@@ -1364,7 +1369,9 @@ var HtmlMeshRenderer = /** @class */ (function () {
|
|
1364
1369
|
if (this._previousCanvasDocumentPosition.top !== canvasDocumentTop || this._previousCanvasDocumentPosition.left !== canvasDocumentLeft) {
|
1365
1370
|
this._previousCanvasDocumentPosition.top = canvasDocumentTop;
|
1366
1371
|
this._previousCanvasDocumentPosition.left = canvasDocumentLeft;
|
1367
|
-
[(_a = this._inSceneElements) === null || _a === void 0 ? void 0 : _a.container, (_b = this._overlayElements) === null || _b === void 0 ? void 0 : _b.container]
|
1372
|
+
var source = [(_a = this._inSceneElements) === null || _a === void 0 ? void 0 : _a.container, (_b = this._overlayElements) === null || _b === void 0 ? void 0 : _b.container];
|
1373
|
+
for (var _i = 0, source_4 = source; _i < source_4.length; _i++) {
|
1374
|
+
var container = source_4[_i];
|
1368
1375
|
if (!container) {
|
1369
1376
|
return;
|
1370
1377
|
}
|
@@ -1373,14 +1380,14 @@ var HtmlMeshRenderer = /** @class */ (function () {
|
|
1373
1380
|
var parentRect = containerParent.getBoundingClientRect();
|
1374
1381
|
var parentDocumentTop = parentRect.top + scrollTop;
|
1375
1382
|
var parentDocumentLeft = parentRect.left + scrollLeft;
|
1376
|
-
var ancestorMarginsAndPadding =
|
1383
|
+
var ancestorMarginsAndPadding = this._getAncestorMarginsAndPadding(containerParent);
|
1377
1384
|
// Add the body margin
|
1378
1385
|
var bodyStyle = window.getComputedStyle(document.body);
|
1379
1386
|
var bodyMarginTop = parseInt(bodyStyle.marginTop, 10);
|
1380
1387
|
var bodyMarginLeft = parseInt(bodyStyle.marginLeft, 10);
|
1381
1388
|
container.style.top = "".concat(canvasDocumentTop - parentDocumentTop - ancestorMarginsAndPadding.marginTop + ancestorMarginsAndPadding.paddingTop + bodyMarginTop, "px");
|
1382
1389
|
container.style.left = "".concat(canvasDocumentLeft - parentDocumentLeft - ancestorMarginsAndPadding.marginLeft + ancestorMarginsAndPadding.paddingLeft + bodyMarginLeft, "px");
|
1383
|
-
}
|
1390
|
+
}
|
1384
1391
|
}
|
1385
1392
|
};
|
1386
1393
|
HtmlMeshRenderer.prototype._epsilon = function (value) {
|
@@ -1449,7 +1456,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
1449
1456
|
/* harmony export */ requestCapture: () => (/* binding */ requestCapture),
|
1450
1457
|
/* harmony export */ requestRelease: () => (/* binding */ requestRelease)
|
1451
1458
|
/* harmony export */ });
|
1452
|
-
/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/
|
1459
|
+
/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/tools */ "babylonjs/Meshes/mesh");
|
1453
1460
|
/* harmony import */ var babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_tools__WEBPACK_IMPORTED_MODULE_0__);
|
1454
1461
|
|
1455
1462
|
var captureRequestQueue = [];
|
@@ -1618,7 +1625,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
1618
1625
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
1619
1626
|
/* harmony export */ PointerEventsCaptureBehavior: () => (/* binding */ PointerEventsCaptureBehavior)
|
1620
1627
|
/* harmony export */ });
|
1621
|
-
/* harmony import */ var babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/
|
1628
|
+
/* harmony import */ var babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/logger */ "babylonjs/Meshes/mesh");
|
1622
1629
|
/* harmony import */ var babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_logger__WEBPACK_IMPORTED_MODULE_0__);
|
1623
1630
|
/* harmony import */ var _pointerEventsCapture__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pointerEventsCapture */ "../../../dev/addons/src/htmlMesh/pointerEventsCapture.ts");
|
1624
1631
|
|
@@ -1845,13 +1852,13 @@ __webpack_require__.r(__webpack_exports__);
|
|
1845
1852
|
|
1846
1853
|
/***/ }),
|
1847
1854
|
|
1848
|
-
/***/ "babylonjs/
|
1855
|
+
/***/ "babylonjs/Meshes/mesh":
|
1849
1856
|
/*!****************************************************************************************************!*\
|
1850
1857
|
!*** external {"root":"BABYLON","commonjs":"babylonjs","commonjs2":"babylonjs","amd":"babylonjs"} ***!
|
1851
1858
|
\****************************************************************************************************/
|
1852
1859
|
/***/ ((module) => {
|
1853
1860
|
|
1854
|
-
module.exports =
|
1861
|
+
module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Meshes_mesh__;
|
1855
1862
|
|
1856
1863
|
/***/ })
|
1857
1864
|
|
@@ -1947,4 +1954,4 @@ __webpack_exports__ = __webpack_exports__["default"];
|
|
1947
1954
|
/******/ })()
|
1948
1955
|
;
|
1949
1956
|
});
|
1950
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbmpzLmFkZG9ucy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDM1lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQUE7QUFxREE7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFwREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBO0FBTUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQWtCQTtBQVdBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQS9FQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQWdDQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUtBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBeUNBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBS0E7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFLQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQU1BO0FBSkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUtBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNVdBO0FBR0E7QUFFQTtBQUdBO0FBR0E7QUFDQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQTRDQTs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFGQTtBQTVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFvaUJBO0FBQ0E7QUFDQTtBQUNBO0FBN2dCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBaUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBaUNBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTs7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTs7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbnFCQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTkE7QUFlQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeExBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBSUE7QUFDQTtBQW1CQTtBQUdBO0FBRkE7QUFDQTtBQXBCQTtBQUNBO0FBc0JBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBcEJBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUpBO0FBdUJBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUVBOztBQUVBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbE9BOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBOzs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2Lm1qcyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaHRtbE1lc2gvZml0U3RyYXRlZ3kudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2h0bWxNZXNoL2h0bWxNZXNoLnRzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9odG1sTWVzaC9odG1sTWVzaFJlbmRlcmVyLnRzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9odG1sTWVzaC9pbmRleC50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaHRtbE1lc2gvcG9pbnRlckV2ZW50c0NhcHR1cmUudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2h0bWxNZXNoL3BvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2luZGV4LnRzIiwid2VicGFjazovL0FERE9OUy9leHRlcm5hbCB1bWQge1wicm9vdFwiOlwiQkFCWUxPTlwiLFwiY29tbW9uanNcIjpcImJhYnlsb25qc1wiLFwiY29tbW9uanMyXCI6XCJiYWJ5bG9uanNcIixcImFtZFwiOlwiYmFieWxvbmpzXCJ9Iiwid2VicGFjazovL0FERE9OUy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9BRERPTlMvLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiYmFieWxvbmpzXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiYmFieWxvbmpzLWFkZG9uc1wiLCBbXCJiYWJ5bG9uanNcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiYmFieWxvbmpzLWFkZG9uc1wiXSA9IGZhY3RvcnkocmVxdWlyZShcImJhYnlsb25qc1wiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiQURET05TXCJdID0gZmFjdG9yeShyb290W1wiQkFCWUxPTlwiXSk7XG59KSgodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHRoaXMpLCAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9iYWJ5bG9uanNfTWF0aHNfbWF0aF9fKSA9PiB7XG5yZXR1cm4gIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xuXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcbiAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xuICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHQ7XG4gIH1cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgIH1cbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICB9XG4gIH1cbiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICBkb25lID0gdHJ1ZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICB9XG4gIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcbiAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xuICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gIH1cbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICByW2tdID0gYVtqXTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxuICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgcmV0dXJuIGNvb2tlZDtcbn07XG5cbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbnZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xuICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICB2YXIgYXIgPSBbXTtcbiAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xuICAgIHJldHVybiBhcjtcbiAgfTtcbiAgcmV0dXJuIG93bktleXMobyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xuICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIHZhciByLCBzID0gMDtcbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XG4gICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XG4gICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHMgfD0gMTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aCwgcHJlc2VydmVKc3gpIHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiICYmIC9eXFwuXFwuP1xcLy8udGVzdChwYXRoKSkge1xuICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwuKHRzeCkkfCgoPzpcXC5kKT8pKCg/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcbiAgICAgICAgICByZXR1cm4gdHN4ID8gcHJlc2VydmVKc3ggPyBcIi5qc3hcIiA6IFwiLmpzXCIgOiBkICYmICghZXh0IHx8ICFjbSkgPyBtIDogKGQgKyBleHQgKyBcIi5cIiArIGNtLnRvTG93ZXJDYXNlKCkgKyBcImpzXCIpO1xuICAgICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgX19leHRlbmRzLFxuICBfX2Fzc2lnbixcbiAgX19yZXN0LFxuICBfX2RlY29yYXRlLFxuICBfX3BhcmFtLFxuICBfX2VzRGVjb3JhdGUsXG4gIF9fcnVuSW5pdGlhbGl6ZXJzLFxuICBfX3Byb3BLZXksXG4gIF9fc2V0RnVuY3Rpb25OYW1lLFxuICBfX21ldGFkYXRhLFxuICBfX2F3YWl0ZXIsXG4gIF9fZ2VuZXJhdG9yLFxuICBfX2NyZWF0ZUJpbmRpbmcsXG4gIF9fZXhwb3J0U3RhcixcbiAgX192YWx1ZXMsXG4gIF9fcmVhZCxcbiAgX19zcHJlYWQsXG4gIF9fc3ByZWFkQXJyYXlzLFxuICBfX3NwcmVhZEFycmF5LFxuICBfX2F3YWl0LFxuICBfX2FzeW5jR2VuZXJhdG9yLFxuICBfX2FzeW5jRGVsZWdhdG9yLFxuICBfX2FzeW5jVmFsdWVzLFxuICBfX21ha2VUZW1wbGF0ZU9iamVjdCxcbiAgX19pbXBvcnRTdGFyLFxuICBfX2ltcG9ydERlZmF1bHQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRJbixcbiAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXG4gIF9fZGlzcG9zZVJlc291cmNlcyxcbiAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sXG59O1xuIiwiZXhwb3J0IHR5cGUgRml0U3RyYXRlZ3lUeXBlID0ge1xyXG4gICAgd3JhcEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudDtcclxuICAgIHVwZGF0ZVNpemUoc2l6aW5nRWxlbWVudDogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZDtcclxufTtcclxuXHJcbmNvbnN0IEZpdFN0cmF0ZWd5Q29udGFpbjogRml0U3RyYXRlZ3lUeXBlID0ge1xyXG4gICAgd3JhcEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3Qgc2l6aW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5qdXN0aWZ5Q29udGVudCA9IFwiY2VudGVyXCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5hbGlnbkl0ZW1zID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5hcHBlbmRDaGlsZChzY2FsaW5nRWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHNpemluZ0VsZW1lbnQ7XHJcbiAgICB9LFxyXG4gICAgdXBkYXRlU2l6ZShzaXppbmdFbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IHNpemluZ0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQhIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG5cclxuICAgICAgICBjb25zdCBbY2hpbGRXaWR0aCwgY2hpbGRIZWlnaHRdID0gW3NjYWxpbmdFbGVtZW50IS5vZmZzZXRXaWR0aCwgc2NhbGluZ0VsZW1lbnQhLm9mZnNldEhlaWdodF07XHJcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbih3aWR0aCAvIGNoaWxkV2lkdGgsIGhlaWdodCAvIGNoaWxkSGVpZ2h0KTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHtzY2FsZX0pYDtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuY29uc3QgRml0U3RyYXRlZ3lDb3ZlcjogRml0U3RyYXRlZ3lUeXBlID0ge1xyXG4gICAgd3JhcEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3Qgc2l6aW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5qdXN0aWZ5Q29udGVudCA9IFwiY2VudGVyXCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5hbGlnbkl0ZW1zID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5hcHBlbmRDaGlsZChzY2FsaW5nRWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHNpemluZ0VsZW1lbnQ7XHJcbiAgICB9LFxyXG4gICAgdXBkYXRlU2l6ZShzaXppbmdFbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IHNpemluZ0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQhIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG5cclxuICAgICAgICBjb25zdCBbY2hpbGRXaWR0aCwgY2hpbGRIZWlnaHRdID0gW3NjYWxpbmdFbGVtZW50IS5vZmZzZXRXaWR0aCwgc2NhbGluZ0VsZW1lbnQhLm9mZnNldEhlaWdodF07XHJcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1heCh3aWR0aCAvIGNoaWxkV2lkdGgsIGhlaWdodCAvIGNoaWxkSGVpZ2h0KTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHtzY2FsZX0pYDtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuY29uc3QgRml0U3RyYXRlZ3lTdHJldGNoOiBGaXRTdHJhdGVneVR5cGUgPSB7XHJcbiAgICB3cmFwRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBzaXppbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmp1c3RpZnlDb250ZW50ID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiO1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LmFwcGVuZENoaWxkKHNjYWxpbmdFbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gc2l6aW5nRWxlbWVudDtcclxuICAgIH0sXHJcbiAgICB1cGRhdGVTaXplKHNpemluZ0VsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gc2l6aW5nRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCEgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcblxyXG4gICAgICAgIGNvbnN0IFtjaGlsZFdpZHRoLCBjaGlsZEhlaWdodF0gPSBbc2NhbGluZ0VsZW1lbnQhLm9mZnNldFdpZHRoLCBzY2FsaW5nRWxlbWVudCEub2Zmc2V0SGVpZ2h0XTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHt3aWR0aCAvIGNoaWxkV2lkdGh9LCAke2hlaWdodCAvIGNoaWxkSGVpZ2h0fSlgO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuICAgIH0sXHJcbn07XHJcblxyXG5jb25zdCBGaXRTdHJhdGVneU5vbmU6IEZpdFN0cmF0ZWd5VHlwZSA9IHtcclxuICAgIHdyYXBFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfSxcclxuICAgIHVwZGF0ZVNpemUoc2l6aW5nRWxlbWVudDogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHNpemluZ0VsZW1lbnQpIHtcclxuICAgICAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcclxuICAgICAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgRml0U3RyYXRlZ3kgPSB7XHJcbiAgICBDT05UQUlOOiBGaXRTdHJhdGVneUNvbnRhaW4sXHJcbiAgICBDT1ZFUjogRml0U3RyYXRlZ3lDb3ZlcixcclxuICAgIFNUUkVUQ0g6IEZpdFN0cmF0ZWd5U3RyZXRjaCxcclxuICAgIE5PTkU6IEZpdFN0cmF0ZWd5Tm9uZSxcclxufTtcclxuIiwiaW1wb3J0IHsgTWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9tZXNoXCI7XHJcbmltcG9ydCB7IENyZWF0ZVBsYW5lVmVydGV4RGF0YSB9IGZyb20gXCJjb3JlL01lc2hlcy9CdWlsZGVycy9wbGFuZUJ1aWxkZXJcIjtcclxuaW1wb3J0IHsgU3RhbmRhcmRNYXRlcmlhbCB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9zdGFuZGFyZE1hdGVyaWFsXCI7XHJcbmltcG9ydCB7IE1hdHJpeCB9IGZyb20gXCJjb3JlL01hdGhzL21hdGhcIjtcclxuaW1wb3J0IHsgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciB9IGZyb20gXCIuL3BvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJjb3JlL01pc2MvbG9nZ2VyXCI7XHJcbmltcG9ydCB0eXBlIHsgRml0U3RyYXRlZ3lUeXBlIH0gZnJvbSBcIi4vZml0U3RyYXRlZ3lcIjtcclxuaW1wb3J0IHsgRml0U3RyYXRlZ3kgfSBmcm9tIFwiLi9maXRTdHJhdGVneVwiO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBIVE1MIGNvbnRlbnQgdGhhdCB3ZSB3YW50IHRvIHJlbmRlciBhcyB0aG91Z2ggaXQgaXMgcGFydCBvZiB0aGUgc2NlbmUuICBUaGUgSFRNTCBjb250ZW50IGlzIGFjdHVhbGx5XHJcbiAqIHJlbmRlcmVkIGJlbG93IHRoZSBjYW52YXMsIGJ1dCBhIGRlcHRoIG1hc2sgaXMgY3JlYXRlZCBieSB0aGlzIGNsYXNzIHRoYXQgd3JpdGVzIHRvIHRoZSBkZXB0aCBidWZmZXIgYnV0IGRvZXMgbm90XHJcbiAqIHdyaXRlIHRvIHRoZSBjb2xvciBidWZmZXIsIGVmZmVjdGl2ZWx5IHB1bmNoaW5nIGEgaG9sZSBpbiB0aGUgY2FudmFzLiAgQ1NTIHRyYW5zZm9ybXMgYXJlIHVzZWQgdG8gc2NhbGUsIHRyYW5zbGF0ZSwgYW5kIHJvdGF0ZVxyXG4gKiB0aGUgSFRNTCBjb250ZW50IHNvIHRoYXQgaXQgbWF0Y2hlcyB0aGUgY2FtZXJhIGFuZCBtZXNoIG9yaWVudGF0aW9uLiAgVGhlIGNsYXNzIHN1cHBvcnRzIGludGVyYWN0aW9ucyBpbiBlZGl0YWJsZSBhbmQgbm9uLWVkaXRhYmxlIG1vZGUuXHJcbiAqIEluIG5vbi1lZGl0YWJsZSBtb2RlICh0aGUgZGVmYXVsdCksIGV2ZW50cyBhcmUgcGFzc2VkIHRvIHRoZSBIVE1MIGNvbnRlbnQgd2hlbiB0aGUgcG9pbnRlciBpcyBvdmVyIHRoZSBtYXNrIChhbmQgbm90IG9jY2x1ZGVkIGJ5IG90aGVyIG1lc2hlc1xyXG4gKiBpbiB0aGUgc2NlbmUpLlxyXG4gKiBAc2VlIGh0dHBzOi8vcGxheWdyb3VuZC5iYWJ5bG9uanMuY29tLyNIVkhZSkMjNVxyXG4gKiBAc2VlIGh0dHBzOi8vcGxheWdyb3VuZC5iYWJ5bG9uanMuY29tLyNCMTdUQzcjMTEyXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgSHRtbE1lc2ggZXh0ZW5kcyBNZXNoIHtcclxuICAgIC8qKlxyXG4gICAgICogSGVscHMgaWRlbnRpZnlpbmcgYSBodG1sIG1lc2ggZnJvbSBhIHJlZ3VsYXIgbWVzaFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGlzSHRtbE1lc2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT3ZlcnJpZGUgdGhlIHN1cGVyIGNsYXNzJ3MgX2lzRW5hYmxlZCBwcm9wZXJ0eSBzbyB3ZSBjYW4gY29udHJvbCB3aGVuIHRoZSBtZXNoXHJcbiAgICAvLyBpcyBlbmFibGVkLiAgSS5lLiwgd2UgZG9uJ3Qgd2FudCB0byByZW5kZXIgdGhlIG1lc2ggdW50aWwgdGhlcmUgaXMgY29udGVudCB0byBzaG93LlxyXG4gICAgcHJpdmF0ZSBfZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIFRoZSBtZXNoIGlzIHJlYWR5IHdoZW4gY29udGVudCBoYXMgYmVlbiBzZXQgYW5kIHRoZSBjb250ZW50IHNpemUgaGFzIGJlZW4gc2V0XHJcbiAgICAvLyBUaGUgZm9ybWVyIGlzIGRvbmUgYnkgdGhlIHVzZXIsIHRoZSBsYXR0ZXIgaXMgZG9uZSBieSB0aGUgcmVuZGVyZXIuXHJcbiAgICBwcml2YXRlIF9yZWFkeSA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBfaXNDYW52YXNPdmVybGF5ID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVxdWlyZXNVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgIHByaXZhdGUgX2VsZW1lbnQ/OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX3dpZHRoPzogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfaGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICAgIHByaXZhdGUgX2ludmVyc2VTY2FsZU1hdHJpeDogTWF0cml4IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSBfY2FwdHVyZU9uUG9pbnRlckVudGVyOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvcjogUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHByaXZhdGUgX3NvdXJjZVdpZHRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX3NvdXJjZUhlaWdodDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIHNvdXJjZSB3aWR0aCBvZiB0aGUgY29udGVudCBpbiBwaXhlbHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzb3VyY2VXaWR0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlV2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIHNvdXJjZSBoZWlnaHQgb2YgdGhlIGNvbnRlbnQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc291cmNlSGVpZ2h0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfd29ybGRNYXRyaXhVcGRhdGVPYnNlcnZlcjogYW55O1xyXG5cclxuICAgIHByaXZhdGUgX2ZpdFN0cmF0ZWd5OiBGaXRTdHJhdGVneVR5cGUgPSBGaXRTdHJhdGVneS5OT05FO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgSHRtbE1lc2hcclxuICAgICAqIEBwYXJhbSBzY2VuZVxyXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgbWVzaC4gIFdpbGwgYmUgdXNlZCBhcyB0aGUgaWQgb2YgdGhlIEhUTUwgZWxlbWVudCBhcyB3ZWxsLlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgb2JqZWN0IHdpdGggb3B0aW9uYWwgcGFyYW1ldGVyc1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihzY2VuZTogU2NlbmUsIGlkOiBzdHJpbmcsIHsgY2FwdHVyZU9uUG9pbnRlckVudGVyID0gdHJ1ZSwgaXNDYW52YXNPdmVybGF5ID0gZmFsc2UsIGZpdFN0cmF0ZWd5ID0gRml0U3RyYXRlZ3kuTk9ORSB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihpZCwgc2NlbmUpO1xyXG5cclxuICAgICAgICAvLyBSZXF1aXJlcyBhIGJyb3dzZXIgdG8gd29yay4gIEJhaWwgaWYgd2UgYXJlbid0IHJ1bm5pbmcgaW4gYSBicm93c2VyXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICBMb2dnZXIuV2FybihgQ3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgYW4gSHRtbE1lc2ggd2l0aCBpZCAke2lkfSBvdXRzaWRlIG9mIGEgYnJvd3Nlci4gIFRoZSBtZXNoIHdpbGwgbm90IGJlIHZpc2libGUuYCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2ZpdFN0cmF0ZWd5ID0gZml0U3RyYXRlZ3k7XHJcbiAgICAgICAgdGhpcy5faXNDYW52YXNPdmVybGF5ID0gaXNDYW52YXNPdmVybGF5O1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZU1hc2soKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gdGhpcy5fY3JlYXRlRWxlbWVudCgpO1xyXG5cclxuICAgICAgICAvLyBTZXQgZW5hYmxlZCBieSBkZWZhdWx0LCBzbyB0aGlzIHdpbGwgc2hvdyBhcyBzb29uIGFzIGl0J3MgcmVhZHlcclxuICAgICAgICB0aGlzLnNldEVuYWJsZWQodHJ1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlciA9IGNhcHR1cmVPblBvaW50ZXJFbnRlcjtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgYmVoYXZpb3IgdG8gY2FwdHVyZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgICAgIHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvciA9IG5ldyBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yKHRoaXMuY2FwdHVyZVBvaW50ZXJFdmVudHMuYmluZCh0aGlzKSwgdGhpcy5yZWxlYXNlUG9pbnRlckV2ZW50cy5iaW5kKHRoaXMpLCB7XHJcbiAgICAgICAgICAgIGNhcHR1cmVPblBvaW50ZXJFbnRlcjogdGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuYWRkQmVoYXZpb3IodGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgY29udGVudCBpbiBwaXhlbHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB3aWR0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBjb250ZW50IGluIHBpeGVsc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEhUTUwgZWxlbWVudCB0aGF0IGlzIGJlaW5nIHJlbmRlcmVkIGFzIGEgbWVzaFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcnVlIGlmIHRoZSBtZXNoIGhhcyBiZWVuIG1vdmVkLCByb3RhdGVkLCBvciBzY2FsZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzXHJcbiAgICAgKiBwcm9wZXJ0eSB3YXMgcmVhZC4gIFRoaXMgcHJvcGVydHkgaXMgcmVzZXQgdG8gZmFsc2UgYWZ0ZXIgcmVhZGluZy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCByZXF1aXJlc1VwZGF0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWlyZXNVcGRhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGUgY2FwdHVyZSBmb3IgdGhlIHBvaW50ZXIgd2hlbiBlbnRlcmluZyB0aGUgbWVzaCBhcmVhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgY2FwdHVyZU9uUG9pbnRlckVudGVyKGNhcHR1cmVPblBvaW50ZXJFbnRlcjogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlciA9IGNhcHR1cmVPblBvaW50ZXJFbnRlcjtcclxuICAgICAgICBpZiAodGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvci5jYXB0dXJlT25Qb2ludGVyRW50ZXIgPSBjYXB0dXJlT25Qb2ludGVyRW50ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzcG9zZXMgb2YgdGhlIG1lc2ggYW5kIHRoZSBIVE1MIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIGRpc3Bvc2UoKSB7XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQ/LnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvcikge1xyXG4gICAgICAgICAgICB0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgX21hcmtBc1VwZGF0ZWQoKSB7XHJcbiAgICAgICAgdGhpcy5fcmVxdWlyZXNVcGRhdGUgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBjb250ZW50IGFkanVzdGluZyB0aGUgbWVzaCBzY2FsZSB0byBtYXRjaCBhbmQgbWFraW5nIGl0IHZpc2libGUuXHJcbiAgICAgKiBJZiB0aGUgdGhlIHNwZWNpZmllZCBjb250ZW50IGlzIHVuZGVmaW5lZCwgdGhlbiBpdCB3aWxsIG1ha2UgdGhlIG1lc2ggaW52aXNpYmxlLiAgSW4gZWl0aGVyIGNhc2UgaXQgd2lsbCBjbGVhciB0aGVcclxuICAgICAqIGVsZW1lbnQgY29udGVudCBmaXJzdC5cclxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHJlbmRlciBhcyBhIG1lc2hcclxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIG1lc2ggaW4gQmFieWxvbiB1bml0c1xyXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBtZXNoIGluIEJhYnlsb24gdW5pdHNcclxuICAgICAqL1xyXG4gICAgc2V0Q29udGVudChlbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICAvLyBJZiBjb250ZW50IGlzIGNoYW5nZWQsIHdlIGFyZSBubyBsb25nZXIgcmVhZHlcclxuICAgICAgICB0aGlzLl9zZXRBc1JlYWR5KGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy8gQWxzbyBpbnZhbGlkYXRlIHRoZSBzb3VyY2Ugd2lkdGggYW5kIGhlaWdodFxyXG4gICAgICAgIHRoaXMuX3NvdXJjZVdpZHRoID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zb3VyY2VIZWlnaHQgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgdGhpcy5fcmVxdWlyZXNVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLnNjYWxpbmcuc2V0QWxsKDEpO1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50IS5hcHBlbmRDaGlsZCh0aGlzLl9maXRTdHJhdGVneS53cmFwRWxlbWVudChlbGVtZW50KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVTY2FsZUlmTmVjZXNzYXJ5KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zb3VyY2VXaWR0aCAmJiB0aGlzLnNvdXJjZUhlaWdodCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRBc1JlYWR5KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBPdmVyaWRlcyBCQUJZTE9OLk1lc2guc2V0RW5hYmxlZFxyXG4gICAgcHVibGljIG92ZXJyaWRlIHNldEVuYWJsZWQoZW5hYmxlZDogYm9vbGVhbikge1xyXG4gICAgICAgIC8vIENhcHR1cmUgcmVxdWVzdGVkIGVuYWJsZWQgc3RhdGVcclxuICAgICAgICB0aGlzLl9lbmFibGVkID0gZW5hYmxlZDtcclxuXHJcbiAgICAgICAgLy8gSWYgZGlzYWJsaW5nIG9yIGVuYWJsaW5nIGFuZCB3ZSBhcmUgcmVhZHlcclxuICAgICAgICBpZiAoIWVuYWJsZWQgfHwgdGhpcy5fcmVhZHkpIHtcclxuICAgICAgICAgICAgdGhpcy5fZG9TZXRFbmFibGVkKGVuYWJsZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbnRlbnQgc2l6ZSBpbiBwaXhlbHNcclxuICAgICAqIEBwYXJhbSB3aWR0aCB3aWR0aCBvZiB0aGUgc291cmNlXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IGhlaWdodCBvZiB0aGUgc291cmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRDb250ZW50U2l6ZVB4KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fc291cmNlV2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9zb3VyY2VIZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudCB8fCAhdGhpcy5fZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9maXRTdHJhdGVneS51cGRhdGVTaXplKHRoaXMuX2VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQhIGFzIEhUTUxFbGVtZW50LCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgdGhpcy5fdXBkYXRlU2NhbGVJZk5lY2Vzc2FyeSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy53aWR0aCAmJiB0aGlzLmhlaWdodCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRBc1JlYWR5KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NldEFzUmVhZHkocmVhZHk6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9yZWFkeSA9IHJlYWR5O1xyXG4gICAgICAgIGlmIChyZWFkeSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kb1NldEVuYWJsZWQodGhpcy5fZW5hYmxlZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZG9TZXRFbmFibGVkKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kb1NldEVuYWJsZWQoZW5hYmxlZDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2lmIGVuYWJsZWQsIHRoZW4gc3RhcnQgbGlzdGVuaW5nIGZvciBjaGFuZ2VzIHRvIHRoZVxyXG4gICAgICAgIC8vIHNjYWxpbmcsIHJvdGF0aW9uLCBhbmQgcG9zaXRpb24uICBvdGhlcndpc2Ugc3RvcCBsaXN0ZW5pbmdcclxuICAgICAgICBpZiAoZW5hYmxlZCAmJiAhdGhpcy5fd29ybGRNYXRyaXhVcGRhdGVPYnNlcnZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZE1hdHJpeFVwZGF0ZU9ic2VydmVyID0gdGhpcy5vbkFmdGVyV29ybGRNYXRyaXhVcGRhdGVPYnNlcnZhYmxlLmFkZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXF1aXJlc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ybGRNYXRyaXhVcGRhdGVPYnNlcnZlcj8ucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkTWF0cml4VXBkYXRlT2JzZXJ2ZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgZW5hYmxlZCwgdGhlbiByZXZlcnQgdGhlIGNvbnRlbnQgZWxlbWVudCBkaXNwbGF5XHJcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGhpZGUgaXRcclxuICAgICAgICB0aGlzLl9lbGVtZW50IS5zdHlsZS5kaXNwbGF5ID0gZW5hYmxlZCA/IFwiXCIgOiBcIm5vbmVcIjtcclxuICAgICAgICAvLyBDYXB0dXJlIHRoZSBjb250ZW50IHogaW5kZXhcclxuICAgICAgICB0aGlzLl9zZXRFbGVtZW50WkluZGV4KHRoaXMucG9zaXRpb24ueiAqIC0xMDAwMCk7XHJcbiAgICAgICAgc3VwZXIuc2V0RW5hYmxlZChlbmFibGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3VwZGF0ZVNjYWxlSWZOZWNlc3NhcnkoKSB7XHJcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBzZXRDb250ZW50IGJlZm9yZSwgdGhlIGNvbnRlbnQgc2NhbGUgaXMgYmFrZWQgaW50byB0aGUgbWVzaC4gIElmIHdlIGRvbid0IHJlc2V0IHRoZSB2ZXJ0aWNlcyB0b1xyXG4gICAgICAgIC8vIHRoZSBvcmlnaW5hbCBzaXplLCB0aGVuIHdlIHdpbGwgbXVsdGlwbHkgdGhlIHNjYWxlIHdoZW4gd2UgYmFrZSB0aGUgc2NhbGUgYmVsb3cuICBCeSBhcHBseWluZyB0aGUgaW52ZXJzZSwgd2UgYmFjayBvdXRcclxuICAgICAgICAvLyB0aGUgc2NhbGluZyB0aGF0IGhhcyBiZWVuIGRvbmUgc28gd2UgYXJlIHN0YXJ0aW5nIGZyb20gdGhlIHNhbWUgcG9pbnQuXHJcbiAgICAgICAgLy8gRmlyc3QgcmVzZXQgdGhlIHNjYWxlIHRvIDFcclxuICAgICAgICB0aGlzLnNjYWxpbmcuc2V0QWxsKDEpO1xyXG4gICAgICAgIC8vIFRoZW4gYmFjayBvdXQgdGhlIG9yaWdpbmFsIHZlcnRpY2VzIGNoYW5nZXMgdG8gbWF0Y2ggdGhlIGNvbnRlbnQgc2NhbGVcclxuICAgICAgICBpZiAodGhpcy5faW52ZXJzZVNjYWxlTWF0cml4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFrZVRyYW5zZm9ybUludG9WZXJ0aWNlcyh0aGlzLl9pbnZlcnNlU2NhbGVNYXRyaXgpO1xyXG4gICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIG1hdHJpeCBzbyBpdCBkb2Vzbid0IGdldCBhcHBsaWVkIGFnYWluIHVubGVzcyB3ZSBzY2FsZVxyXG4gICAgICAgICAgICB0aGlzLl9pbnZlcnNlU2NhbGVNYXRyaXggPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2V0IHNjYWxlIHRvIG1hdGNoIGNvbnRlbnQuICBOb3RlIHdlIGNhbid0IGp1c3Qgc2NhbGUgdGhlIG1lc2gsIGJlY2F1c2UgdGhhdCB3aWxsIHNjYWxlIHRoZSBjb250ZW50IGFzIHdlbGxcclxuICAgICAgICAvLyBXaGF0IHdlIG5lZWQgdG8gZG8gaXMgY29tcHV0ZSBhIHNjYWxlIG1hdHJpeCBhbmQgdGhlbiBiYWtlIHRoYXQgaW50byB0aGUgbWVzaCB2ZXJ0aWNlcy4gIFRoaXMgd2lsbCBsZWF2ZSB0aGVcclxuICAgICAgICAvLyBtZXNoIHNjYWxlIGF0IDEsIHNvIG91ciBjb250ZW50IHdpbGwgc3RheSBpdCdzIG9yaWdpbmFsIHdpZHRoIGFuZCBoZWlnaHQgdW50aWwgd2Ugc2NhbGUgdGhlIG1lc2guXHJcbiAgICAgICAgY29uc3Qgc2NhbGVYID0gdGhpcy5fd2lkdGggfHwgMTtcclxuICAgICAgICBjb25zdCBzY2FsZVkgPSB0aGlzLl9oZWlnaHQgfHwgMTtcclxuICAgICAgICBjb25zdCBzY2FsZU1hdHJpeCA9IE1hdHJpeC5TY2FsaW5nKHNjYWxlWCwgc2NhbGVZLCAxKTtcclxuICAgICAgICB0aGlzLmJha2VUcmFuc2Zvcm1JbnRvVmVydGljZXMoc2NhbGVNYXRyaXgpO1xyXG5cclxuICAgICAgICAvLyBHZXQgYW4gaW52ZXJzZSBvZiB0aGUgc2NhbGUgbWF0cml4IHRoYXQgd2UgY2FuIHVzZSB0byBiYWNrIG91dCB0aGUgc2NhbGUgY2hhbmdlcyB3ZSBoYXZlIG1hZGUgc29cclxuICAgICAgICAvLyB3ZSBkb24ndCBtdWx0aXBseSB0aGUgc2NhbGUuXHJcbiAgICAgICAgdGhpcy5faW52ZXJzZVNjYWxlTWF0cml4ID0gbmV3IE1hdHJpeCgpO1xyXG4gICAgICAgIHNjYWxlTWF0cml4LmludmVydFRvUmVmKHRoaXMuX2ludmVyc2VTY2FsZU1hdHJpeCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9jcmVhdGVNYXNrKCkge1xyXG4gICAgICAgIGNvbnN0IHZlcnRleERhdGEgPSBDcmVhdGVQbGFuZVZlcnRleERhdGEoeyB3aWR0aDogMSwgaGVpZ2h0OiAxIH0pO1xyXG4gICAgICAgIHZlcnRleERhdGEuYXBwbHlUb01lc2godGhpcyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNjZW5lID0gdGhpcy5nZXRTY2VuZSgpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tDb2xsaXNpb25zID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgZGVwdGhNYXNrID0gbmV3IFN0YW5kYXJkTWF0ZXJpYWwoYCR7dGhpcy5pZH0tbWF0YCwgc2NlbmUpO1xyXG4gICAgICAgIGlmICghdGhpcy5faXNDYW52YXNPdmVybGF5KSB7XHJcbiAgICAgICAgICAgIGRlcHRoTWFzay5iYWNrRmFjZUN1bGxpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgZGVwdGhNYXNrLmRpc2FibGVDb2xvcldyaXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgZGVwdGhNYXNrLmRpc2FibGVMaWdodGluZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1hdGVyaWFsID0gZGVwdGhNYXNrO1xyXG5cclxuICAgICAgICAvLyBPcHRpbWl6YXRpb24gLSBGcmVlemUgbWF0ZXJpYWwgc2luY2UgaXQgbmV2ZXIgbmVlZHMgdG8gY2hhbmdlXHJcbiAgICAgICAgdGhpcy5tYXRlcmlhbC5mcmVlemUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NldEVsZW1lbnRaSW5kZXgoekluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50IS5zdHlsZS56SW5kZXggPSBgJHt6SW5kZXh9YDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB1c2VkIGJ5IHRoZSBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIHRvIGNhcHR1cmUgcG9pbnRlciBldmVudHNcclxuICAgICAqL1xyXG4gICAgY2FwdHVyZVBvaW50ZXJFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEVuYWJsZSBkb20gY29udGVudCB0byBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJhdXRvXCI7XHJcblxyXG4gICAgICAgIC8vIFN1cHJlc3MgZXZlbnRzIG91dHNpZGUgb2YgdGhlIGRvbSBjb250ZW50XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIHVzZWQgYnkgdGhlIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgdG8gcmVsZWFzZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgICovXHJcbiAgICByZWxlYXNlUG9pbnRlckV2ZW50cygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRW5hYmxlIHBvaW50ZXIgZXZlbnRzIG9uIGNhbnZhc1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXS5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJhdXRvXCI7XHJcblxyXG4gICAgICAgIC8vIERpc2FibGUgcG9pbnRlciBldmVudHMgb24gZG9tIGNvbnRlbnRcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2NyZWF0ZUVsZW1lbnQoKSB7XHJcbiAgICAgICAgLy8gUmVxdWlyZXMgYSBicm93c2VyIHRvIHdvcmsuICBCYWlsIGlmIHdlIGFyZW4ndCBydW5uaW5nIGluIGEgYnJvd3NlclxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGRpdi5pZCA9IHRoaXMuaWQ7XHJcbiAgICAgICAgZGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuX2lzQ2FudmFzT3ZlcmxheSA/IFwidHJhbnNwYXJlbnRcIiA6IFwiIzAwMFwiO1xyXG4gICAgICAgIGRpdi5zdHlsZS56SW5kZXggPSBcIjFcIjtcclxuICAgICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgZGl2LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgICAgICBkaXYuc3R5bGUuYmFja2ZhY2VWaXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRpdjtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgTWF0cml4LCBRdWF0ZXJuaW9uLCBWZWN0b3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aFwiO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBIdG1sTWVzaCB9IGZyb20gXCIuL2h0bWxNZXNoXCI7XHJcbmltcG9ydCB7IENhbWVyYSB9IGZyb20gXCJjb3JlL0NhbWVyYXMvY2FtZXJhXCI7XHJcbmltcG9ydCB0eXBlIHsgU3ViTWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9zdWJNZXNoXCI7XHJcbmltcG9ydCB7IFJlbmRlcmluZ0dyb3VwIH0gZnJvbSBcImNvcmUvUmVuZGVyaW5nL3JlbmRlcmluZ0dyb3VwXCI7XHJcblxyXG5pbXBvcnQgdHlwZSB7IE9ic2VydmVyIH0gZnJvbSBcImNvcmUvTWlzYy9vYnNlcnZhYmxlXCI7XHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJjb3JlL01pc2MvbG9nZ2VyXCI7XHJcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RFbmdpbmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzXCI7XHJcblxyXG5jb25zdCBfcG9zaXRpb25VcGRhdGVGYWlsTWVzc2FnZSA9IFwiRmFpbGVkIHRvIHVwZGF0ZSBodG1sIG1lc2ggcmVuZGVyZXIgcG9zaXRpb24gZHVlIHRvIGZhaWx1cmUgdG8gZ2V0IGNhbnZhcyByZWN0LiAgSHRtbE1lc2ggaW5zdGFuY2VzIG1heSBub3QgcmVuZGVyIGNvcnJlY3RseVwiO1xyXG5jb25zdCBiYWJ5bG9uVW5pdHNUb1BpeGVscyA9IDEwMDtcclxuXHJcbi8qKlxyXG4gKiBBIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgdHdvIHN1Ym1lc2hlcyBhbmQgcmV0dXJucyBhIG51bWJlciBpbmRpY2F0aW5nIHdoaWNoXHJcbiAqIHNob3VsZCBiZSByZW5kZXJlZCBmaXJzdC5cclxuICovXHJcbnR5cGUgUmVuZGVyT3JkZXJGdW5jdGlvbiA9IChzdWJNZXNoQTogU3ViTWVzaCwgc3ViTWVzaEI6IFN1Yk1lc2gpID0+IG51bWJlcjtcclxuXHJcbnR5cGUgUmVuZGVyTGF5ZXJFbGVtZW50cyA9IHtcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgICBkb21FbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIGNhbWVyYUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG59O1xyXG5cclxuLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZW5zdXJlcyB0aGF0IEh0bWxNZXNoZXMgYXJlIHJlbmRlcmVkIGJlZm9yZSBhbGwgb3RoZXIgbWVzaGVzLlxyXG4vLyBOb3RlIHRoaXMgd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gZ3JvdXAgMC5cclxuLy8gSWYgbmVpdGhlciBtZXNoIGlzIGFuIEh0bWxNZXNoLCB0aGVuIHRoZSBkZWZhdWx0IHJlbmRlciBvcmRlciBpcyB1c2VkXHJcbi8vIFRoaXMgcHJldmVudHMgSHRtbE1lc2hlcyBmcm9tIGFwcGVhcmluZyBpbiBmcm9udCBvZiBvdGhlciBtZXNoZXMgd2hlbiB0aGV5IGFyZSBiZWhpbmQgdGhlbVxyXG5jb25zdCByZW5kZXJPcmRlckZ1bmMgPSAoZGVmYXVsdFJlbmRlck9yZGVyOiBSZW5kZXJPcmRlckZ1bmN0aW9uKTogUmVuZGVyT3JkZXJGdW5jdGlvbiA9PiB7XHJcbiAgICByZXR1cm4gKHN1Yk1lc2hBOiBTdWJNZXNoLCBzdWJNZXNoQjogU3ViTWVzaCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1lc2hBID0gc3ViTWVzaEEuZ2V0TWVzaCgpO1xyXG4gICAgICAgIGNvbnN0IG1lc2hCID0gc3ViTWVzaEIuZ2V0TWVzaCgpO1xyXG5cclxuICAgICAgICAvLyBVc2UgcHJvcGVydHkgY2hlY2sgaW5zdGVhZCBvZiBpbnN0YW5jZW9mIHNpbmNlIGl0IGlzIGxlc3MgZXhwZW5zaXZlIGFuZFxyXG4gICAgICAgIC8vIHRoaXMgd2lsbCBiZSBjYWxsZWQgbWFueSB0aW1lcyBwZXIgZnJhbWVcclxuICAgICAgICBjb25zdCBtZXNoQUlzSHRtbE1lc2ggPSAobWVzaEEgYXMgYW55KVtcImlzSHRtbE1lc2hcIl07XHJcbiAgICAgICAgY29uc3QgbWVzaEJJc0h0bWxNZXNoID0gKG1lc2hCIGFzIGFueSlbXCJpc0h0bWxNZXNoXCJdO1xyXG4gICAgICAgIGlmIChtZXNoQUlzSHRtbE1lc2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1lc2hCSXNIdG1sTWVzaCA/IChtZXNoQS5hYnNvbHV0ZVBvc2l0aW9uLnogPD0gbWVzaEIuYWJzb2x1dGVQb3NpdGlvbi56ID8gMSA6IC0xKSA6IC0xO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtZXNoQklzSHRtbE1lc2ggPyAxIDogZGVmYXVsdFJlbmRlck9yZGVyKHN1Yk1lc2hBLCBzdWJNZXNoQik7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGlzIHJlcXVpcmVkIHRvIHJlbmRlciBIdG1sTWVzaGVzIGluIHRoZSBzY2VuZS5cclxuICogaWYgdXNpbmcgSHRtbE1lc2hlcywgeW91IG11c3Qgbm90IHNldCByZW5kZXIgb3JkZXIgZm9yIGdyb3VwIDAgdXNpbmdcclxuICogc2NlbmUuc2V0UmVuZGVyaW5nT3JkZXIuICBZb3UgbXVzdCBpbnN0ZWFkIHBhc3MgdGhlIGNvbXBhcmUgZnVuY3Rpb25zXHJcbiAqIHRvIHRoZSBIdG1sTWVzaFJlbmRlcmVyIGNvbnN0cnVjdG9yLiAgSWYgeW91IGRvIG5vdCwgdGhlbiB5b3VyIHJlbmRlclxyXG4gKiBvcmRlciB3aWxsIGJlIG92ZXJ3cml0dGVuIGlmIHRoZSBIdG1sTWVzaFJlbmRlcmVyIGlzIGNyZWF0ZWQgYWZ0ZXIgYW5kXHJcbiAqIHRoZSBIdG1sTWVzaGVzIHdpbGwgbm90IHJlbmRlciBjb3JyZWN0bHkgKHRoZXkgd2lsbCBhcHBlYXIgaW4gZnJvbnQgb2ZcclxuICogbWVzaGVzIHRoYXQgYXJlIGFjdHVhbGx5IGluIGZyb250IG9mIHRoZW0pIGlmIHRoZSBIdG1sTWVzaFJlbmRlcmVyIGlzXHJcbiAqIGNyZWF0ZWQgYmVmb3JlLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEh0bWxNZXNoUmVuZGVyZXIge1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVySWQ/OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9pblNjZW5lRWxlbWVudHM/OiBSZW5kZXJMYXllckVsZW1lbnRzIHwgbnVsbDtcclxuICAgIHByaXZhdGUgX292ZXJsYXlFbGVtZW50cz86IFJlbmRlckxheWVyRWxlbWVudHMgfCBudWxsO1xyXG4gICAgcHJpdmF0ZSBfZW5naW5lOiBBYnN0cmFjdEVuZ2luZTtcclxuXHJcbiAgICBwcml2YXRlIF9jYWNoZSA9IHtcclxuICAgICAgICBjYW1lcmFEYXRhOiB7IGZvdjogMCwgcG9zaXRpb246IG5ldyBWZWN0b3IzKCksIHN0eWxlOiBcIlwiIH0sXHJcbiAgICAgICAgaHRtbE1lc2hEYXRhOiBuZXcgV2Vha01hcDxvYmplY3QsIHsgc3R5bGU6IHN0cmluZyB9PigpLFxyXG4gICAgfTtcclxuICAgIHByaXZhdGUgX3dpZHRoID0gMDtcclxuICAgIHByaXZhdGUgX2hlaWdodCA9IDA7XHJcbiAgICBwcml2YXRlIF9oZWlnaHRIYWxmID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9jYW1lcmFXb3JsZE1hdHJpeD86IE1hdHJpeDtcclxuXHJcbiAgICAvLyBDcmVhdGUgc29tZSByZWZzIHRvIGF2b2lkIGNyZWF0aW5nIG5ldyBvYmplY3RzIGV2ZXJ5IGZyYW1lXHJcbiAgICBwcml2YXRlIF90ZW1wID0ge1xyXG4gICAgICAgIHNjYWxlVHJhbnNmb3JtOiBuZXcgVmVjdG9yMygpLFxyXG4gICAgICAgIHJvdGF0aW9uVHJhbnNmb3JtOiBuZXcgUXVhdGVybmlvbigpLFxyXG4gICAgICAgIHBvc2l0aW9uVHJhbnNmb3JtOiBuZXcgVmVjdG9yMygpLFxyXG4gICAgICAgIG9iamVjdE1hdHJpeDogTWF0cml4LklkZW50aXR5KCksXHJcbiAgICAgICAgY2FtZXJhV29ybGRNYXRyaXg6IE1hdHJpeC5JZGVudGl0eSgpLFxyXG4gICAgICAgIGNhbWVyYVJvdGF0aW9uTWF0cml4OiBNYXRyaXguSWRlbnRpdHkoKSxcclxuICAgICAgICBjYW1lcmFXb3JsZE1hdHJpeEFzQXJyYXk6IG5ldyBBcnJheSgxNiksXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEtlZXAgdHJhY2sgb2YgRFBSIHNvIHdlIGNhbiByZXNpemUgaWYgRFBSIGNoYW5nZXNcclxuICAgIC8vIE90aGVyd2lzZSB0aGUgRE9NIGNvbnRlbnQgd2lsbCBzY2FsZSwgYnV0IHRoZSBtZXNoIHdvbid0XHJcbiAgICBwcml2YXRlIF9sYXN0RGV2aWNlUGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xyXG5cclxuICAgIC8vIEtlZXAgdHJhY2sgb2YgY2FtZXJhIG1hdHJpeCBjaGFuZ2VzIHNvIHdlIG9ubHkgdXBkYXRlIHRoZVxyXG4gICAgLy8gRE9NIGVsZW1lbnQgc3R5bGVzIHdoZW4gbmVjZXNzYXJ5XHJcbiAgICBwcml2YXRlIF9jYW1lcmFNYXRyaXhVcGRhdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBLZWVwIHRyYWNrIG9mIHBvc2l0aW9uIGNoYW5nZXMgc28gd2Ugb25seSB1cGRhdGUgdGhlIERPTSBlbGVtZW50XHJcbiAgICAvLyBzdHlsZXMgd2hlbiBuZWNlc3NhcnlcclxuICAgIHByaXZhdGUgX3ByZXZpb3VzQ2FudmFzRG9jdW1lbnRQb3NpdGlvbiA9IHtcclxuICAgICAgICB0b3A6IDAsXHJcbiAgICAgICAgbGVmdDogMCxcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVuZGVyT2JzZXJ2ZXI6IE9ic2VydmVyPFNjZW5lPiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgSHRtbE1lc2hSZW5kZXJlclxyXG4gICAgICogQHBhcmFtIHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHByb3BlcnRpZXM6XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBzY2VuZTogU2NlbmUsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXJJZCA9IG51bGwsXHJcbiAgICAgICAgICAgIF9jb250YWluZXJJZCA9IFwiY3NzLWNvbnRhaW5lclwiLFxyXG4gICAgICAgICAgICBlbmFibGVPdmVybGF5UmVuZGVyID0gdHJ1ZSxcclxuICAgICAgICAgICAgZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyID0gUmVuZGVyaW5nR3JvdXAuUGFpbnRlclNvcnRDb21wYXJlLFxyXG4gICAgICAgICAgICBkZWZhdWx0QWxwaGFUZXN0UmVuZGVyT3JkZXIgPSBSZW5kZXJpbmdHcm91cC5QYWludGVyU29ydENvbXBhcmUsXHJcbiAgICAgICAgICAgIGRlZmF1bHRUcmFuc3BhcmVudFJlbmRlck9yZGVyID0gUmVuZGVyaW5nR3JvdXAuZGVmYXVsdFRyYW5zcGFyZW50U29ydENvbXBhcmUsXHJcbiAgICAgICAgfToge1xyXG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXJJZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICAgICAgICAgIF9jb250YWluZXJJZD86IHN0cmluZztcclxuICAgICAgICAgICAgZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyPzogUmVuZGVyT3JkZXJGdW5jdGlvbjtcclxuICAgICAgICAgICAgZGVmYXVsdEFscGhhVGVzdFJlbmRlck9yZGVyPzogUmVuZGVyT3JkZXJGdW5jdGlvbjtcclxuICAgICAgICAgICAgZGVmYXVsdFRyYW5zcGFyZW50UmVuZGVyT3JkZXI/OiBSZW5kZXJPcmRlckZ1bmN0aW9uO1xyXG4gICAgICAgICAgICBlbmFibGVPdmVybGF5UmVuZGVyPzogYm9vbGVhbjtcclxuICAgICAgICB9ID0ge31cclxuICAgICkge1xyXG4gICAgICAgIC8vIFJlcXVpcmVzIGEgYnJvd3NlciB0byB3b3JrLiAgT25seSBpbml0IGlmIHdlIGFyZSBpbiBhIGJyb3dzZXJcclxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVySWQgPSBfY29udGFpbmVySWQ7XHJcbiAgICAgICAgdGhpcy5faW5pdChzY2VuZSwgcGFyZW50Q29udGFpbmVySWQsIGVuYWJsZU92ZXJsYXlSZW5kZXIsIGRlZmF1bHRPcGFxdWVSZW5kZXJPcmRlciwgZGVmYXVsdEFscGhhVGVzdFJlbmRlck9yZGVyLCBkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwb3NlIG9mIHRoZSBIdG1sTWVzaFJlbmRlcmVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJPYnNlcnZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJPYnNlcnZlci5yZW1vdmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyT2JzZXJ2ZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb3ZlcmxheUVsZW1lbnRzPy5jb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5fb3ZlcmxheUVsZW1lbnRzID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5jb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5faW5TY2VuZUVsZW1lbnRzID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2luaXQoXHJcbiAgICAgICAgc2NlbmU6IFNjZW5lLFxyXG4gICAgICAgIHBhcmVudENvbnRhaW5lcklkOiBzdHJpbmcgfCBudWxsLFxyXG4gICAgICAgIGVuYWJsZU92ZXJsYXlSZW5kZXI6IGJvb2xlYW4sXHJcbiAgICAgICAgZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyOiBSZW5kZXJPcmRlckZ1bmN0aW9uLFxyXG4gICAgICAgIGRlZmF1bHRBbHBoYVRlc3RSZW5kZXJPcmRlcjogUmVuZGVyT3JkZXJGdW5jdGlvbixcclxuICAgICAgICBkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlcjogUmVuZGVyT3JkZXJGdW5jdGlvblxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVxdWlyZXMgYSBicm93c2VyIHRvIHdvcmsuICBPbmx5IGluaXQgaWYgd2UgYXJlIGluIGEgYnJvd3NlclxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBET00gY29udGFpbmVyc1xyXG4gICAgICAgIGxldCBwYXJlbnRDb250YWluZXIgPSBwYXJlbnRDb250YWluZXJJZCA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmVudENvbnRhaW5lcklkKSA6IGRvY3VtZW50LmJvZHk7XHJcblxyXG4gICAgICAgIGlmICghcGFyZW50Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHBhcmVudENvbnRhaW5lciA9IGRvY3VtZW50LmJvZHk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGFscmVhZHkgZXhpc3RzLCB0aGVuIHJlbW92ZSBpdFxyXG4gICAgICAgIGNvbnN0IGluU2NlbmVDb250YWluZXJJZCA9IGAke3RoaXMuX2NvbnRhaW5lcklkfV9pbl9zY2VuZWA7XHJcbiAgICAgICAgdGhpcy5faW5TY2VuZUVsZW1lbnRzID0gdGhpcy5fY3JlYXRlUmVuZGVyTGF5ZXJFbGVtZW50cyhpblNjZW5lQ29udGFpbmVySWQpO1xyXG5cclxuICAgICAgICBwYXJlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuX2luU2NlbmVFbGVtZW50cy5jb250YWluZXIsIHBhcmVudENvbnRhaW5lci5maXJzdENoaWxkKTtcclxuXHJcbiAgICAgICAgaWYgKGVuYWJsZU92ZXJsYXlSZW5kZXIpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUNvbnRhaW5lcklkID0gYCR7dGhpcy5fY29udGFpbmVySWR9X292ZXJsYXlgO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHMgPSB0aGlzLl9jcmVhdGVSZW5kZXJMYXllckVsZW1lbnRzKG92ZXJsYXlDb250YWluZXJJZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHpJbmRleCA9ICsoc2NlbmUuZ2V0RW5naW5lKCkuZ2V0UmVuZGVyaW5nQ2FudmFzKCkhLnN0eWxlLnpJbmRleCA/PyBcIjBcIikgKyAxO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHMuY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IGAke3pJbmRleH1gO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHMuY29udGFpbmVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLl9vdmVybGF5RWxlbWVudHMuY29udGFpbmVyLCBwYXJlbnRDb250YWluZXIuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2VuZ2luZSA9IHNjZW5lLmdldEVuZ2luZSgpO1xyXG4gICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSB0aGlzLl9lbmdpbmUuZ2V0UmVuZGVyaW5nQ2FudmFzQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGlmICghY2xpZW50UmVjdCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZ2V0IGNsaWVudCByZWN0IGZvciByZW5kZXJpbmcgY2FudmFzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSBzaXplIGFuZCByZXNpemUgYmVoYXZpb3JcclxuICAgICAgICB0aGlzLl9zZXRTaXplKGNsaWVudFJlY3Qud2lkdGgsIGNsaWVudFJlY3QuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZW5naW5lLm9uUmVzaXplT2JzZXJ2YWJsZS5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjbGllbnRSZWN0ID0gdGhpcy5fZW5naW5lLmdldFJlbmRlcmluZ0NhbnZhc0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgaWYgKGNsaWVudFJlY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldFNpemUoY2xpZW50UmVjdC53aWR0aCwgY2xpZW50UmVjdC5oZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBwcm9qZWN0aW9uT2JzOiBPYnNlcnZlcjxDYW1lcmE+O1xyXG4gICAgICAgIGxldCBtYXRyaXhPYnM6IE9ic2VydmVyPENhbWVyYT47XHJcblxyXG4gICAgICAgIGNvbnN0IG9ic2VydmVDYW1lcmEgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbWVyYSA9IHNjZW5lLmFjdGl2ZUNhbWVyYTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYSkge1xyXG4gICAgICAgICAgICAgICAgcHJvamVjdGlvbk9icyA9IGNhbWVyYS5vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkT2JzZXJ2YWJsZS5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2FtZXJhTWF0cml4Q2hhbmdlZChjYW1lcmEpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBtYXRyaXhPYnMgPSBjYW1lcmEub25WaWV3TWF0cml4Q2hhbmdlZE9ic2VydmFibGUuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNhbWVyYU1hdHJpeENoYW5nZWQoY2FtZXJhKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgb2JzZXJ2ZUNhbWVyYSgpO1xyXG5cclxuICAgICAgICBzY2VuZS5vbkFjdGl2ZUNhbWVyYUNoYW5nZWQuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHByb2plY3Rpb25PYnMpIHtcclxuICAgICAgICAgICAgICAgIHNjZW5lLmFjdGl2ZUNhbWVyYT8ub25Qcm9qZWN0aW9uTWF0cml4Q2hhbmdlZE9ic2VydmFibGUucmVtb3ZlKHByb2plY3Rpb25PYnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChtYXRyaXhPYnMpIHtcclxuICAgICAgICAgICAgICAgIHNjZW5lLmFjdGl2ZUNhbWVyYT8ub25WaWV3TWF0cml4Q2hhbmdlZE9ic2VydmFibGUucmVtb3ZlKG1hdHJpeE9icyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb2JzZXJ2ZUNhbWVyYSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IEh0bWxNZXNoZXMgYXJlIHJlbmRlcmVkIGJlZm9yZSBhbGwgb3RoZXIgbWVzaGVzXHJcbiAgICAgICAgLy8gc28gdGhhdCB0aGV5IGRvbid0IGFwcGVhciBpbiBmcm9udCBvZiBtZXNoZXMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gZnJvbnQgb2YgdGhlbVxyXG4gICAgICAgIC8vIFVwZGF0aW5nIHRoZSByZW5kZXIgb3JkZXIgaXNuJ3QgaWRlYWwsIGJ1dCBpdCBpcyB0aGUgb25seSB3YXkgdG8gYWNoZWl2ZSB0aGlzXHJcbiAgICAgICAgLy8gVGhlIGltcGxpY2F0aW9uIGlzIHRoYXQgYW4gYXBwIHVzaW5nIHRoZSBIdG1sTWVzaFJlbmRlcmVkIG11c3Qgc2V0IHRoZSBzY2VuZSByZW5kZXIgb3JkZXJcclxuICAgICAgICAvLyB2aWEgdGhlIEh0bWxNZXNoUmVuZGVyZWQgY29uc3RydWN0b3JcclxuICAgICAgICBjb25zdCBvcGFxdWVSZW5kZXJPcmRlciA9IHJlbmRlck9yZGVyRnVuYyhkZWZhdWx0T3BhcXVlUmVuZGVyT3JkZXIpO1xyXG4gICAgICAgIGNvbnN0IGFscGhhVGVzdFJlbmRlck9yZGVyID0gcmVuZGVyT3JkZXJGdW5jKGRlZmF1bHRBbHBoYVRlc3RSZW5kZXJPcmRlcik7XHJcbiAgICAgICAgY29uc3QgdHJhbnNwYXJlbnRSZW5kZXJPcmRlciA9IHJlbmRlck9yZGVyRnVuYyhkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlcik7XHJcbiAgICAgICAgc2NlbmUuc2V0UmVuZGVyaW5nT3JkZXIoMCwgb3BhcXVlUmVuZGVyT3JkZXIsIGFscGhhVGVzdFJlbmRlck9yZGVyLCB0cmFuc3BhcmVudFJlbmRlck9yZGVyKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVuZGVyT2JzZXJ2ZXIgPSBzY2VuZS5vbkJlZm9yZVJlbmRlck9ic2VydmFibGUuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyKHNjZW5lLCBzY2VuZS5hY3RpdmVDYW1lcmEgYXMgQ2FtZXJhKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jcmVhdGVSZW5kZXJMYXllckVsZW1lbnRzKGNvbnRhaW5lcklkOiBzdHJpbmcpOiBSZW5kZXJMYXllckVsZW1lbnRzIHtcclxuICAgICAgICBjb25zdCBleGlzdGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRhaW5lcklkKTtcclxuICAgICAgICBpZiAoZXhpc3RpbmdDb250YWluZXIpIHtcclxuICAgICAgICAgICAgZXhpc3RpbmdDb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgY29udGFpbmVyLmlkID0gY29udGFpbmVySWQ7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBcIjEwMCVcIjtcclxuICAgICAgICBjb250YWluZXIuc3R5bGUuekluZGV4ID0gXCItMVwiO1xyXG5cclxuICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBkb21FbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcclxuXHJcbiAgICAgICAgY29uc3QgY2FtZXJhRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGNhbWVyYUVsZW1lbnQuc3R5bGUud2Via2l0VHJhbnNmb3JtU3R5bGUgPSBcInByZXNlcnZlLTNkXCI7XHJcbiAgICAgICAgY2FtZXJhRWxlbWVudC5zdHlsZS50cmFuc2Zvcm1TdHlsZSA9IFwicHJlc2VydmUtM2RcIjtcclxuXHJcbiAgICAgICAgY2FtZXJhRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XHJcblxyXG4gICAgICAgIGRvbUVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FtZXJhRWxlbWVudCk7XHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRvbUVsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcixcclxuICAgICAgICAgICAgZG9tRWxlbWVudCxcclxuICAgICAgICAgICAgY2FtZXJhRWxlbWVudCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZ2V0U2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLl93aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9oZWlnaHQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcclxuICAgICAgICB0aGlzLl9oZWlnaHRIYWxmID0gdGhpcy5faGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pblNjZW5lRWxlbWVudHMgfHwgIXRoaXMuX292ZXJsYXlFbGVtZW50cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkb21FbGVtZW50cyA9IFt0aGlzLl9pblNjZW5lRWxlbWVudHMhLmRvbUVsZW1lbnQsIHRoaXMuX292ZXJsYXlFbGVtZW50cyEuZG9tRWxlbWVudCwgdGhpcy5faW5TY2VuZUVsZW1lbnRzIS5jYW1lcmFFbGVtZW50LCB0aGlzLl9vdmVybGF5RWxlbWVudHMhLmNhbWVyYUVsZW1lbnRdO1xyXG4gICAgICAgIGRvbUVsZW1lbnRzLmZvckVhY2goKGRvbSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZG9tKSB7XHJcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxyXG4gICAgcHJvdGVjdGVkIF9nZXRDYW1lcmFDU1NNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gbWF0cml4Lm07XHJcbiAgICAgICAgcmV0dXJuIGBtYXRyaXgzZCgke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1swXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzFdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzJdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzNdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzRdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbNV0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbNl0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbN10gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbOF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1s5XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxMF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTFdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzEyXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzEzXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxNF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTVdIClcclxuICAgICAgICB9KWA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udmVydCBhIEJhYnlsb24gd29ybGQgbWF0cml4IHRvIGEgQ1NTIG1hdHJpeFxyXG4gICAgLy8gVGhpcyBhbHNvIGhhbmRsZXMgY29udmVyc2lvbiBmcm9tIEJKUyBsZWZ0IGhhbmRlZCBjb29yZHNcclxuICAgIC8vIHRvIENTUyByaWdodCBoYW5kZWQgY29vcmRzXHJcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcclxuICAgIHByb3RlY3RlZCBfZ2V0SHRtbENvbnRlbnRDU1NNYXRyaXgobWF0cml4OiBNYXRyaXgsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IG1hdHJpeC5tO1xyXG4gICAgICAgIC8vIEluIGEgcmlnaHQgaGFuZGVkIGNvb3JkaW5hdGUgc3lzdGVtLCB0aGUgZWxlbWVudHMgMTEgdG8gMTQgaGF2ZSB0byBjaGFuZ2UgdGhlaXIgZGlyZWN0aW9uXHJcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdXNlUmlnaHRIYW5kZWRTeXN0ZW0gPyAtMSA6IDE7XHJcbiAgICAgICAgY29uc3QgbWF0cml4M2QgPSBgbWF0cml4M2QoJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMV0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMl0gKiAtZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzNdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbNF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1s1XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s2XSAgKiBkaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1s3XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s4XSAqIC1kaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbOV0gKiAtZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzEwXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxMV0gKiBkaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTJdICogZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzEzXSAqIGRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxNF0gKiBkaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTVdIClcclxuICAgICAgICB9KWA7XHJcbiAgICAgICAgcmV0dXJuIG1hdHJpeDNkO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZ2V0VHJhbnNmb3JtYXRpb25NYXRyaXgoaHRtbE1lc2g6IEh0bWxNZXNoLCB1c2VSaWdodEhhbmRlZFN5c3RlbTogYm9vbGVhbik6IE1hdHJpeCB7XHJcbiAgICAgICAgLy8gR2V0IHRoZSBjYW1lcmEgd29ybGQgbWF0cml4XHJcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjYW1lcmEgd29ybGQgbWF0cml4IGlzIHVwIHRvIGRhdGVcclxuICAgICAgICBpZiAoIXRoaXMuX2NhbWVyYVdvcmxkTWF0cml4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhbWVyYVdvcmxkTWF0cml4ID0gaHRtbE1lc2guZ2V0U2NlbmUoKS5hY3RpdmVDYW1lcmE/LmdldFdvcmxkTWF0cml4KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5fY2FtZXJhV29ybGRNYXRyaXgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdHJpeC5JZGVudGl0eSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgb2JqZWN0V29ybGRNYXRyaXggPSBodG1sTWVzaC5nZXRXb3JsZE1hdHJpeCgpO1xyXG5cclxuICAgICAgICAvLyBTY2FsZSB0aGUgb2JqZWN0IG1hdHJpeCBieSB0aGUgYmFzZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSBtZXNoXHJcbiAgICAgICAgLy8gd2hpY2ggaXMgdGhlIHJhdGlvIG9mIHRoZSBtZXNoIHdpZHRoL2hlaWdodCB0byB0aGUgcmVuZGVyZXJcclxuICAgICAgICAvLyB3aWR0aC9oZWlnaHQgZGl2aWRlZCBieSB0aGUgYmFieWxvbiB1bml0cyB0byBwaXhlbHMgcmF0aW9cclxuICAgICAgICBsZXQgd2lkdGhTY2FsZUZhY3RvciA9IDE7XHJcbiAgICAgICAgbGV0IGhlaWdodFNjYWxlRmFjdG9yID0gMTtcclxuICAgICAgICBpZiAoaHRtbE1lc2guc291cmNlV2lkdGggJiYgaHRtbE1lc2guc291cmNlSGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHdpZHRoU2NhbGVGYWN0b3IgPSBodG1sTWVzaC53aWR0aCEgLyAoaHRtbE1lc2guc291cmNlV2lkdGggLyBiYWJ5bG9uVW5pdHNUb1BpeGVscyk7XHJcbiAgICAgICAgICAgIGhlaWdodFNjYWxlRmFjdG9yID0gaHRtbE1lc2guaGVpZ2h0ISAvIChodG1sTWVzaC5zb3VyY2VIZWlnaHQgLyBiYWJ5bG9uVW5pdHNUb1BpeGVscyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBcHBseSB0aGUgc2NhbGUgdG8gdGhlIG9iamVjdCdzIHdvcmxkIG1hdHJpeC4gIE5vdGUgd2UgYXJlbid0IHNjYWxpbmdcclxuICAgICAgICAvLyB0aGUgb2JqZWN0LCBqdXN0IGdldHRpbmcgYSBtYXRyaXggYXMgdGhvdWdoIGl0IHdlcmUgc2NhbGVkLCBzbyB3ZSBjYW5cclxuICAgICAgICAvLyBzY2FsZSB0aGUgY29udGVudFxyXG4gICAgICAgIGNvbnN0IHNjYWxlVHJhbnNmb3JtID0gdGhpcy5fdGVtcC5zY2FsZVRyYW5zZm9ybTtcclxuICAgICAgICBjb25zdCByb3RhdGlvblRyYW5zZm9ybSA9IHRoaXMuX3RlbXAucm90YXRpb25UcmFuc2Zvcm07XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25UcmFuc2Zvcm0gPSB0aGlzLl90ZW1wLnBvc2l0aW9uVHJhbnNmb3JtO1xyXG4gICAgICAgIGNvbnN0IHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXggPSB0aGlzLl90ZW1wLm9iamVjdE1hdHJpeDtcclxuXHJcbiAgICAgICAgb2JqZWN0V29ybGRNYXRyaXguZGVjb21wb3NlKHNjYWxlVHJhbnNmb3JtLCByb3RhdGlvblRyYW5zZm9ybSwgcG9zaXRpb25UcmFuc2Zvcm0pO1xyXG4gICAgICAgIHNjYWxlVHJhbnNmb3JtLnggKj0gd2lkdGhTY2FsZUZhY3RvcjtcclxuICAgICAgICBzY2FsZVRyYW5zZm9ybS55ICo9IGhlaWdodFNjYWxlRmFjdG9yO1xyXG5cclxuICAgICAgICBNYXRyaXguQ29tcG9zZVRvUmVmKHNjYWxlVHJhbnNmb3JtLCByb3RhdGlvblRyYW5zZm9ybSwgcG9zaXRpb25UcmFuc2Zvcm0sIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXgpO1xyXG5cclxuICAgICAgICAvLyBBZGp1c3QgZGlyZWN0aW9uIG9mIDEyIGFuZCAxMyBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGJhc2VkIG9uIHRoZSBoYW5kZWRuZXNzIG9mIHRoZSBzeXN0ZW1cclxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB1c2VSaWdodEhhbmRlZFN5c3RlbSA/IC0xIDogMTtcclxuICAgICAgICAvLyBBZGp1c3QgdHJhbnNsYXRpb24gdmFsdWVzIHRvIGJlIGZyb20gY2FtZXJhIHZzIHdvcmxkIG9yaWdpblxyXG4gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBhcmUgYWxzbyBhZGp1c3RpbmcgdGhlc2UgdmFsdWVzIHRvIGJlIHBpeGVscyB2cyBCYWJ5bG9uIHVuaXRzXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBodG1sTWVzaC5nZXRBYnNvbHV0ZVBvc2l0aW9uKCk7XHJcbiAgICAgICAgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeC5zZXRSb3dGcm9tRmxvYXRzKFxyXG4gICAgICAgICAgICAzLFxyXG4gICAgICAgICAgICAoLXRoaXMuX2NhbWVyYVdvcmxkTWF0cml4Lm1bMTJdICsgcG9zaXRpb24ueCkgKiBiYWJ5bG9uVW5pdHNUb1BpeGVscyAqIGRpcmVjdGlvbixcclxuICAgICAgICAgICAgKC10aGlzLl9jYW1lcmFXb3JsZE1hdHJpeC5tWzEzXSArIHBvc2l0aW9uLnkpICogYmFieWxvblVuaXRzVG9QaXhlbHMgKiBkaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICh0aGlzLl9jYW1lcmFXb3JsZE1hdHJpeC5tWzE0XSAtIHBvc2l0aW9uLnopICogYmFieWxvblVuaXRzVG9QaXhlbHMsXHJcbiAgICAgICAgICAgIHRoaXMuX2NhbWVyYVdvcmxkTWF0cml4Lm1bMTVdICogMC4wMDAwMSAqIGJhYnlsb25Vbml0c1RvUGl4ZWxzXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gQWRqdXN0IG90aGVyIHZhbHVlcyB0byBiZSBwaXhlbHMgdnMgQmFieWxvbiB1bml0c1xyXG4gICAgICAgIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXgubXVsdGlwbHlBdEluZGV4KDMsIGJhYnlsb25Vbml0c1RvUGl4ZWxzKTtcclxuICAgICAgICBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4Lm11bHRpcGx5QXRJbmRleCg3LCBiYWJ5bG9uVW5pdHNUb1BpeGVscyk7XHJcbiAgICAgICAgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeC5tdWx0aXBseUF0SW5kZXgoMTEsIGJhYnlsb25Vbml0c1RvUGl4ZWxzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9yZW5kZXJIdG1sTWVzaChodG1sTWVzaDogSHRtbE1lc2gsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCFodG1sTWVzaC5lbGVtZW50IHx8ICFodG1sTWVzaC5lbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKSB7XHJcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gcmVuZGVyLCBzbyBiYWlsXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZW5zdXJlIGh0bWwgbWVzaCBkYXRhIGlzIGluaXRpYWxpemVkIGJlZm9yZVxyXG4gICAgICAgIC8vIGNvbXB1dGluZyB0aGUgYmFzZSBzY2FsZSBmYWN0b3JcclxuICAgICAgICBsZXQgaHRtbE1lc2hEYXRhID0gdGhpcy5fY2FjaGUuaHRtbE1lc2hEYXRhLmdldChodG1sTWVzaCk7XHJcbiAgICAgICAgaWYgKCFodG1sTWVzaERhdGEpIHtcclxuICAgICAgICAgICAgaHRtbE1lc2hEYXRhID0geyBzdHlsZTogXCJcIiB9O1xyXG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5odG1sTWVzaERhdGEuc2V0KGh0bWxNZXNoLCBodG1sTWVzaERhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2FtZXJhRWxlbWVudCA9IGh0bWxNZXNoLl9pc0NhbnZhc092ZXJsYXkgPyB0aGlzLl9vdmVybGF5RWxlbWVudHM/LmNhbWVyYUVsZW1lbnQgOiB0aGlzLl9pblNjZW5lRWxlbWVudHM/LmNhbWVyYUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChodG1sTWVzaC5lbGVtZW50LnBhcmVudE5vZGUgIT09IGNhbWVyYUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY2FtZXJhRWxlbWVudCEuYXBwZW5kQ2hpbGQoaHRtbE1lc2guZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB0aGUgaHRtbE1lc2ggY29udGVudCBoYXMgY2hhbmdlZCwgdXBkYXRlIHRoZSBiYXNlIHNjYWxlIGZhY3RvclxyXG4gICAgICAgIGlmIChodG1sTWVzaC5yZXF1aXJlc1VwZGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVCYXNlU2NhbGVGYWN0b3IoaHRtbE1lc2gpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggZm9yIHRoZSBodG1sIG1lc2hcclxuICAgICAgICBjb25zdCBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4ID0gdGhpcy5fZ2V0VHJhbnNmb3JtYXRpb25NYXRyaXgoaHRtbE1lc2gsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtKTtcclxuXHJcbiAgICAgICAgbGV0IHN0eWxlID0gYHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSAke3RoaXMuX2dldEh0bWxDb250ZW50Q1NTTWF0cml4KHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXgsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtKX1gO1xyXG4gICAgICAgIC8vIEluIGEgcmlnaHQgaGFuZGVkIHN5c3RlbSwgc2NyZWVucyBhcmUgb24gdGhlIHdyb25nIHNpZGUgb2YgdGhlIG1lc2gsIHNvIHdlIGhhdmUgdG8gcm90YXRlIGJ5IE1hdGguUEkgd2hpY2ggcmVzdWx0cyBpbiB0aGUgbWF0cml4M2Qgc2VlbiBiZWxvd1xyXG4gICAgICAgIHN0eWxlICs9IGAke3VzZVJpZ2h0SGFuZGVkU3lzdGVtID8gXCJtYXRyaXgzZCgtMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgLTEsIDAsIDAsIDAsIDAsIDEpXCIgOiBcIlwifWA7XHJcblxyXG4gICAgICAgIGlmIChodG1sTWVzaERhdGEuc3R5bGUgIT09IHN0eWxlKSB7XHJcbiAgICAgICAgICAgIGh0bWxNZXNoLmVsZW1lbnQuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gc3R5bGU7XHJcbiAgICAgICAgICAgIGh0bWxNZXNoLmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gc3R5bGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBodG1sTWVzaC5fbWFya0FzVXBkYXRlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfcmVuZGVyKHNjZW5lOiBTY2VuZSwgY2FtZXJhOiBDYW1lcmEpIHtcclxuICAgICAgICBsZXQgbmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgdXNlUmlnaHRIYW5kZWRTeXN0ZW0gPSBzY2VuZS51c2VSaWdodEhhbmRlZFN5c3RlbTtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBjb250YWluZXIgcG9zaXRpb24gYW5kIHNpemUgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29udGFpbmVyUG9zaXRpb25JZk5lZWRlZCgpO1xyXG5cclxuICAgICAgICAvLyBDaGVjayBmb3IgYSBjYW1lcmEgY2hhbmdlXHJcbiAgICAgICAgaWYgKHRoaXMuX2NhbWVyYU1hdHJpeFVwZGF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fY2FtZXJhTWF0cml4VXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB0aGUgY2FtZXJhIHBvc2l0aW9uIGhhcyBjaGFuZ2VkLCB0aGVuIHdlIGFsc28gbmVlZCB0byB1cGRhdGVcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi54ICE9PSB0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLnBvc2l0aW9uLnggfHxcclxuICAgICAgICAgICAgY2FtZXJhLnBvc2l0aW9uLnkgIT09IHRoaXMuX2NhY2hlLmNhbWVyYURhdGEucG9zaXRpb24ueSB8fFxyXG4gICAgICAgICAgICBjYW1lcmEucG9zaXRpb24ueiAhPT0gdGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5wb3NpdGlvbi56XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmNhbWVyYURhdGEucG9zaXRpb24uY29weUZyb20oY2FtZXJhLnBvc2l0aW9uKTtcclxuICAgICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGEgZHByIGNoYW5nZVxyXG4gICAgICAgIGlmICh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAhPT0gdGhpcy5fbGFzdERldmljZVBpeGVsUmF0aW8pIHtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdERldmljZVBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcclxuICAgICAgICAgICAgTG9nZ2VyLkxvZyhcIkluIHJlbmRlciAtIGRwciBjaGFuZ2VkOiBcIiwgdGhpcy5fbGFzdERldmljZVBpeGVsUmF0aW8pO1xyXG4gICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiBhbnkgbWVzaGVzIG5lZWQgdG8gYmUgdXBkYXRlZFxyXG4gICAgICAgIGNvbnN0IG1lc2hlc05lZWRpbmdVcGRhdGUgPSBzY2VuZS5tZXNoZXMuZmlsdGVyKChtZXNoKSA9PiAobWVzaCBhcyBhbnkpW1wiaXNIdG1sTWVzaFwiXSAmJiAobmVlZHNVcGRhdGUgfHwgKG1lc2ggYXMgSHRtbE1lc2gpLnJlcXVpcmVzVXBkYXRlKSk7XHJcbiAgICAgICAgbmVlZHNVcGRhdGUgPSBuZWVkc1VwZGF0ZSB8fCBtZXNoZXNOZWVkaW5nVXBkYXRlLmxlbmd0aCA+IDA7XHJcblxyXG4gICAgICAgIGlmICghbmVlZHNVcGRhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IGEgcHJvamVjdGlvbiBtYXRyaXggZm9yIHRoZSBjYW1lcmFcclxuICAgICAgICBjb25zdCBwcm9qZWN0aW9uTWF0cml4ID0gY2FtZXJhLmdldFByb2plY3Rpb25NYXRyaXgoKTtcclxuICAgICAgICBjb25zdCBmb3YgPSBwcm9qZWN0aW9uTWF0cml4Lm1bNV0gKiB0aGlzLl9oZWlnaHRIYWxmO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5mb3YgIT09IGZvdikge1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLm1vZGUgPT0gQ2FtZXJhLlBFUlNQRUNUSVZFX0NBTUVSQSkge1xyXG4gICAgICAgICAgICAgICAgW3RoaXMuX292ZXJsYXlFbGVtZW50cz8uZG9tRWxlbWVudCwgdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5kb21FbGVtZW50XS5mb3JFYWNoKChlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS53ZWJraXRQZXJzcGVjdGl2ZSA9IGZvdiArIFwicHhcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUucGVyc3BlY3RpdmUgPSBmb3YgKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBbdGhpcy5fb3ZlcmxheUVsZW1lbnRzPy5kb21FbGVtZW50LCB0aGlzLl9pblNjZW5lRWxlbWVudHM/LmRvbUVsZW1lbnRdLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLndlYmtpdFBlcnNwZWN0aXZlID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUucGVyc3BlY3RpdmUgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmNhbWVyYURhdGEuZm92ID0gZm92O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSBDU1MgbWF0cml4IGZvciB0aGUgY2FtZXJhICh3aGljaCB3aWxsIGluY2x1ZGUgYW55IGNhbWVyYSByb3RhdGlvbilcclxuICAgICAgICBpZiAoY2FtZXJhLnBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjYW1lcmEuY29tcHV0ZVdvcmxkTWF0cml4KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjYW1lcmFNYXRyaXhXb3JsZCA9IHRoaXMuX3RlbXAuY2FtZXJhV29ybGRNYXRyaXg7XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGQuY29weUZyb20oY2FtZXJhLmdldFdvcmxkTWF0cml4KCkpO1xyXG4gICAgICAgIGNvbnN0IGNhbWVyYVJvdGF0aW9uTWF0cml4ID0gdGhpcy5fdGVtcC5jYW1lcmFSb3RhdGlvbk1hdHJpeDtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZC5nZXRSb3RhdGlvbk1hdHJpeCgpLnRyYW5zcG9zZVRvUmVmKGNhbWVyYVJvdGF0aW9uTWF0cml4KTtcclxuXHJcbiAgICAgICAgY29uc3QgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5ID0gdGhpcy5fdGVtcC5jYW1lcmFXb3JsZE1hdHJpeEFzQXJyYXk7XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGQuY29weVRvQXJyYXkoY2FtZXJhTWF0cml4V29ybGRBc0FycmF5KTtcclxuXHJcbiAgICAgICAgLy8gRm9yIGEgZmV3IHZhbHVlcywgd2UgaGF2ZSB0byBhZGp1c3QgdGhlIGRpcmVjdGlvbiBiYXNlZCBvbiB0aGUgaGFuZGVkbmVzcyBvZiB0aGUgc3lzdGVtXHJcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdXNlUmlnaHRIYW5kZWRTeXN0ZW0gPyAxIDogLTE7XHJcblxyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheVsxXSA9IGNhbWVyYVJvdGF0aW9uTWF0cml4Lm1bMV07XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5WzJdID0gY2FtZXJhUm90YXRpb25NYXRyaXgubVsyXSAqIGRpcmVjdGlvbjtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXlbNF0gPSBjYW1lcmFSb3RhdGlvbk1hdHJpeC5tWzRdICogZGlyZWN0aW9uO1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheVs2XSA9IGNhbWVyYVJvdGF0aW9uTWF0cml4Lm1bNl0gKiBkaXJlY3Rpb247XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5WzhdID0gY2FtZXJhUm90YXRpb25NYXRyaXgubVs4XSAqIGRpcmVjdGlvbjtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXlbOV0gPSBjYW1lcmFSb3RhdGlvbk1hdHJpeC5tWzldICogZGlyZWN0aW9uO1xyXG5cclxuICAgICAgICBNYXRyaXguRnJvbUFycmF5VG9SZWYoY2FtZXJhTWF0cml4V29ybGRBc0FycmF5LCAwLCBjYW1lcmFNYXRyaXhXb3JsZCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbWVyYUNTU01hdHJpeCA9IHRoaXMuX2dldENhbWVyYUNTU01hdHJpeChjYW1lcmFNYXRyaXhXb3JsZCk7XHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBjYW1lcmFDU1NNYXRyaXg7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLnN0eWxlICE9PSBzdHlsZSkge1xyXG4gICAgICAgICAgICBbdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5jYW1lcmFFbGVtZW50LCB0aGlzLl9vdmVybGF5RWxlbWVudHM/LmNhbWVyYUVsZW1lbnRdLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBzdHlsZTtcclxuICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS50cmFuc2Zvcm0gPSBzdHlsZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmNhbWVyYURhdGEuc3R5bGUgPSBzdHlsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIF9SZW5kZXIgb2JqZWN0cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICBtZXNoZXNOZWVkaW5nVXBkYXRlLmZvckVhY2goKG1lc2gpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVySHRtbE1lc2gobWVzaCBhcyBIdG1sTWVzaCwgdXNlUmlnaHRIYW5kZWRTeXN0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdXBkYXRlQmFzZVNjYWxlRmFjdG9yKGh0bWxNZXNoOiBIdG1sTWVzaCkge1xyXG4gICAgICAgIC8vIEdldCBzY3JlZW4gd2lkdGggYW5kIGhlaWdodFxyXG4gICAgICAgIGxldCBzY3JlZW5XaWR0aCA9IHRoaXMuX3dpZHRoO1xyXG4gICAgICAgIGxldCBzY3JlZW5IZWlnaHQgPSB0aGlzLl9oZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIENhbGN1bGF0ZSBhc3BlY3QgcmF0aW9zXHJcbiAgICAgICAgY29uc3QgaHRtbE1lc2hBc3BlY3RSYXRpbyA9IChodG1sTWVzaC53aWR0aCB8fCAxKSAvIChodG1sTWVzaC5oZWlnaHQgfHwgMSk7XHJcbiAgICAgICAgY29uc3Qgc2NyZWVuQXNwZWN0UmF0aW8gPSBzY3JlZW5XaWR0aCAvIHNjcmVlbkhlaWdodDtcclxuXHJcbiAgICAgICAgLy8gQWRqdXN0IHNjcmVlbiBkaW1lbnNpb25zIGJhc2VkIG9uIGFzcGVjdCByYXRpb3NcclxuICAgICAgICBpZiAoaHRtbE1lc2hBc3BlY3RSYXRpbyA+IHNjcmVlbkFzcGVjdFJhdGlvKSB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBIVE1MIG1lc2ggaXMgd2lkZXIgcmVsYXRpdmUgdG8gaXRzIGhlaWdodCB0aGFuIHRoZSBzY3JlZW4sIGFkanVzdCB0aGUgc2NyZWVuIHdpZHRoXHJcbiAgICAgICAgICAgIHNjcmVlbldpZHRoID0gc2NyZWVuSGVpZ2h0ICogaHRtbE1lc2hBc3BlY3RSYXRpbztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgSFRNTCBtZXNoIGlzIHRhbGxlciByZWxhdGl2ZSB0byBpdHMgd2lkdGggdGhhbiB0aGUgc2NyZWVuLCBhZGp1c3QgdGhlIHNjcmVlbiBoZWlnaHRcclxuICAgICAgICAgICAgc2NyZWVuSGVpZ2h0ID0gc2NyZWVuV2lkdGggLyBodG1sTWVzaEFzcGVjdFJhdGlvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2V0IGNvbnRlbnQgdG8gZmlsbCBzY3JlZW4gc28gd2UgZ2V0IG1heCByZXNvbHV0aW9uIHdoZW4gaXQgaXMgc2hydW5rIHRvIGZpdCB0aGUgbWVzaFxyXG4gICAgICAgIGh0bWxNZXNoLnNldENvbnRlbnRTaXplUHgoc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF91cGRhdGVDb250YWluZXJQb3NpdGlvbklmTmVlZGVkKCkge1xyXG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgY2FudmFzIGhhcyBtb3ZlZCBvbiB0aGUgc2NyZWVuXHJcbiAgICAgICAgY29uc3QgY2FudmFzUmVjdCA9IHRoaXMuX2VuZ2luZS5nZXRSZW5kZXJpbmdDYW52YXNDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIC8vIGNhbnZhcyByZWN0IG1heSBiZSBudWxsIGlmIGxheW91dCBub3QgY29tcGxldGVcclxuICAgICAgICBpZiAoIWNhbnZhc1JlY3QpIHtcclxuICAgICAgICAgICAgTG9nZ2VyLldhcm4oX3Bvc2l0aW9uVXBkYXRlRmFpbE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IHdpbmRvdy5zY3JvbGxZO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSB3aW5kb3cuc2Nyb2xsWDtcclxuICAgICAgICBjb25zdCBjYW52YXNEb2N1bWVudFRvcCA9IGNhbnZhc1JlY3QudG9wICsgc2Nyb2xsVG9wO1xyXG4gICAgICAgIGNvbnN0IGNhbnZhc0RvY3VtZW50TGVmdCA9IGNhbnZhc1JlY3QubGVmdCArIHNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9wcmV2aW91c0NhbnZhc0RvY3VtZW50UG9zaXRpb24udG9wICE9PSBjYW52YXNEb2N1bWVudFRvcCB8fCB0aGlzLl9wcmV2aW91c0NhbnZhc0RvY3VtZW50UG9zaXRpb24ubGVmdCAhPT0gY2FudmFzRG9jdW1lbnRMZWZ0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzQ2FudmFzRG9jdW1lbnRQb3NpdGlvbi50b3AgPSBjYW52YXNEb2N1bWVudFRvcDtcclxuICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNDYW52YXNEb2N1bWVudFBvc2l0aW9uLmxlZnQgPSBjYW52YXNEb2N1bWVudExlZnQ7XHJcblxyXG4gICAgICAgICAgICBbdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5jb250YWluZXIsIHRoaXMuX292ZXJsYXlFbGVtZW50cz8uY29udGFpbmVyXS5mb3JFYWNoKChjb250YWluZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSB0b3AgYW5kIGxlZnQgb2YgdGhlIGNzcyBjb250YWluZXIgdG8gbWF0Y2ggdGhlIGNhbnZhc1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUGFyZW50ID0gY29udGFpbmVyLm9mZnNldFBhcmVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFJlY3QgPSBjb250YWluZXJQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnREb2N1bWVudFRvcCA9IHBhcmVudFJlY3QudG9wICsgc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50RG9jdW1lbnRMZWZ0ID0gcGFyZW50UmVjdC5sZWZ0ICsgc2Nyb2xsTGVmdDtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nID0gdGhpcy5fZ2V0QW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZyhjb250YWluZXJQYXJlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgYm9keSBtYXJnaW5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHlTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keU1hcmdpblRvcCA9IHBhcnNlSW50KGJvZHlTdHlsZS5tYXJnaW5Ub3AsIDEwKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHlNYXJnaW5MZWZ0ID0gcGFyc2VJbnQoYm9keVN0eWxlLm1hcmdpbkxlZnQsIDEwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUudG9wID0gYCR7Y2FudmFzRG9jdW1lbnRUb3AgLSBwYXJlbnREb2N1bWVudFRvcCAtIGFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcubWFyZ2luVG9wICsgYW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZy5wYWRkaW5nVG9wICsgYm9keU1hcmdpblRvcH1weGA7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubGVmdCA9IGAke1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnZhc0RvY3VtZW50TGVmdCAtIHBhcmVudERvY3VtZW50TGVmdCAtIGFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcubWFyZ2luTGVmdCArIGFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcucGFkZGluZ0xlZnQgKyBib2R5TWFyZ2luTGVmdFxyXG4gICAgICAgICAgICAgICAgfXB4YDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfb25DYW1lcmFNYXRyaXhDaGFuZ2VkID0gKGNhbWVyYTogQ2FtZXJhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fY2FtZXJhV29ybGRNYXRyaXggPSBjYW1lcmEuZ2V0V29ybGRNYXRyaXgoKTtcclxuICAgICAgICB0aGlzLl9jYW1lcmFNYXRyaXhVcGRhdGVkID0gdHJ1ZTtcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBfZXBzaWxvbih2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHZhbHVlKSA8IDFlLTEwID8gMCA6IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldCB0b3RhbCBtYXJnaW5zIGFuZCBwYWRkaW5nIGZvciBhbiBlbGVtZW50LCBleGNsdWRpbmcgdGhlIGJvZHkgYW5kIGRvY3VtZW50IG1hcmdpbnNcclxuICAgIHByaXZhdGUgX2dldEFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBsZXQgbWFyZ2luVG9wID0gMDtcclxuICAgICAgICBsZXQgbWFyZ2luTGVmdCA9IDA7XHJcbiAgICAgICAgbGV0IHBhZGRpbmdUb3AgPSAwO1xyXG4gICAgICAgIGxldCBwYWRkaW5nTGVmdCA9IDA7XHJcblxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkgJiYgZWxlbWVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIG1hcmdpblRvcCArPSBwYXJzZUludChzdHlsZS5tYXJnaW5Ub3AsIDEwKTtcclxuICAgICAgICAgICAgbWFyZ2luTGVmdCArPSBwYXJzZUludChzdHlsZS5tYXJnaW5MZWZ0LCAxMCk7XHJcbiAgICAgICAgICAgIHBhZGRpbmdUb3AgKz0gcGFyc2VJbnQoc3R5bGUucGFkZGluZ1RvcCwgMTApO1xyXG4gICAgICAgICAgICBwYWRkaW5nTGVmdCArPSBwYXJzZUludChzdHlsZS5wYWRkaW5nTGVmdCwgMTApO1xyXG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geyBtYXJnaW5Ub3AsIG1hcmdpbkxlZnQsIHBhZGRpbmdUb3AsIHBhZGRpbmdMZWZ0IH07XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSHRtbE1lc2hSZW5kZXJlciB9IGZyb20gXCIuL2h0bWxNZXNoUmVuZGVyZXJcIjtcclxuaW1wb3J0IHsgSHRtbE1lc2ggfSBmcm9tIFwiLi9odG1sTWVzaFwiO1xyXG5pbXBvcnQgeyBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIH0gZnJvbSBcIi4vcG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvclwiO1xyXG5pbXBvcnQgeyBGaXRTdHJhdGVneSB9IGZyb20gXCIuL2ZpdFN0cmF0ZWd5XCI7XHJcblxyXG4vLyBFeHBvcnQgcHVibGljIGNsYXNzZXMgYW5kIGZ1bmN0aW9uc1xyXG5leHBvcnQgeyBIdG1sTWVzaFJlbmRlcmVyLCBIdG1sTWVzaCwgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciwgRml0U3RyYXRlZ3kgfTtcclxuIiwiaW1wb3J0IHsgVG9vbHMgfSBmcm9tIFwiY29yZS9NaXNjL3Rvb2xzXCI7XHJcblxyXG4vLyBBIGNhcHR1cmUgbWFuYWdlbWVudCBzeXN0ZW0gdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3Qgb2JqZWN0IGhhcyB0aGUgcG9pbnRlclxyXG4vLyBldmVudHMgYnkgZWxpbWluYXRpbmcgcmFjZSBjb25kaXRpb25zIHRoYXQgY2FuIGNhdXNlIHRoZSBwb2ludGVyIGV2ZW50cyB0byBiZVxyXG4vLyByZWxlYXNlZCBieSBhIGRpZmZlcmVudCBvYmplY3QgYWZ0ZXIgdGhleSBhcmUgY2FwdHVyZWQgbGVhdmluZyBubyBvYmplY3RcclxuLy8gYXMgdGhlIG93bmVyLiAgSXQgZG9lcyB0aGlzIGJ5IHF1ZXVlaW5nIHJlcXVlc3RzIGFuZCBvbmx5IGFsbG93aW5nXHJcbi8vIGNhcHR1cmUgd2hlbiB0aGUgY3VycmVudCBjYXB0dXJlIG93bmVyIHJlbGVhc2VzIHBvaW50ZXIgZXZlbnRzLlxyXG5cclxudHlwZSBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrID0gKCkgPT4gdm9pZDtcclxuXHJcbnR5cGUgQ2FwdHVyZVJlbGVhc2VDYWxsYmFja3MgPSB7XHJcbiAgICBjYXB0dXJlOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrO1xyXG4gICAgcmVsZWFzZTogQ2FwdHVyZVJlbGVhc2VDYWxsYmFjaztcclxufTtcclxuXHJcbmxldCBjYXB0dXJlUmVxdWVzdFF1ZXVlOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuLy8gS2V5IGlzIHJlcXVlc3QgaWQsIHZhbHVlIGlzIG9iamVjdCB3aXRoIGNhcHR1cmUgYW5kIHJlbGVhc2UgY2FsbGJhY2tzXHJcbmNvbnN0IHBlbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzOiBNYXA8c3RyaW5nLCBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrcz4gPSBuZXcgTWFwKCk7XHJcblxyXG4vLyBLZWVwIHRyYWNrIG9mIHJlbGVhc2UgcmVxdWVzdHMgd2l0aCBubyBtYXRjaGluZyBjYXB0dXJlIHJlcXVlc3RcclxuLy8gaW4gY2FzZSB0aGUgcmVsZWFzZSByZXF1ZXN0IGFycml2ZWQgYmVmb3JlIHRoZSBjYXB0dXJlIHRvIGF2b2lkXHJcbi8vIHRoZSBjYXB0dXJlIHJlcXVlc3QgbmV2ZXIgZ2V0dGluZyByZWxlYXNlZC5cclxubGV0IHVubWF0Y2hlZFJlbGVhc2VSZXF1ZXN0czogc3RyaW5nW10gPSBbXTtcclxuXHJcbmxldCBjdXJyZW50T3duZXI6IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyBDYWxsZWQgb24gZmlyc3QgY2FwdHVyZSBvciByZWxlYXNlIHJlcXVlc3RcclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIGlkIG9mIHRoZSBvYmplY3QgY3VycmVudGx5IGNhcHR1cmluZyBwb2ludGVyIGV2ZW50c1xyXG4gKiBAcmV0dXJucyBUaGUgaWQgb2YgdGhlIG9iamVjdCBjdXJyZW50bHkgY2FwdHVyaW5nIHBvaW50ZXIgZXZlbnRzXHJcbiAqIG9yIG51bGwgaWYgbm8gb2JqZWN0IGlzIGNhcHR1cmluZyBwb2ludGVyIGV2ZW50c1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldENhcHR1cmluZ0lkID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIGN1cnJlbnRPd25lcjtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXF1ZXN0IHRoYXQgdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZCBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzLiAgSWYgdGhlcmUgaXMgbm8gY3VycmVudFxyXG4gKiBvd25lciwgdGhlbiB0aGUgcmVxdWVzdCBpcyBncmFudGVkIGltbWVkaWF0ZWx5LiAgSWYgdGhlcmUgaXMgYSBjdXJyZW50IG93bmVyLCB0aGVuIHRoZSByZXF1ZXN0XHJcbiAqIGlzIHF1ZXVlZCB1bnRpbCB0aGUgY3VycmVudCBvd25lciByZWxlYXNlcyBwb2ludGVyIGV2ZW50cy5cclxuICogQHBhcmFtIHJlcXVlc3RJZCBBbiBpZCB0byBpZGVudGlmeSB0aGUgcmVxdWVzdC4gIFRoaXMgaWQgd2lsbCBiZSB1c2VkIHRvIG1hdGNoIHRoZSBjYXB0dXJlXHJcbiAqIHJlcXVlc3Qgd2l0aCB0aGUgcmVsZWFzZSByZXF1ZXN0LlxyXG4gKiBAcGFyYW0gY2FwdHVyZUNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHJlcXVlc3QgaXMgZ3JhbnRlZCBhbmQgdGhlIG9iamVjdCBpcyBjYXB0dXJpbmdcclxuICogQHBhcmFtIHJlbGVhc2VDYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIGNhcHR1cmluZyBwb2ludGVyIGV2ZW50c1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RDYXB0dXJlID0gKHJlcXVlc3RJZDogc3RyaW5nLCBjYXB0dXJlQ2FsbGJhY2s6IENhcHR1cmVSZWxlYXNlQ2FsbGJhY2ssIHJlbGVhc2VDYWxsYmFjazogQ2FwdHVyZVJlbGVhc2VDYWxsYmFjaykgPT4ge1xyXG4gICAgZGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLnJlcXVlc3RDYXB0dXJlIC0gUG9pbnRlciBldmVudHMgY2FwdHVyZSByZXF1ZXN0ZWQgZm9yICR7cmVxdWVzdElkfWApO1xyXG5cclxuICAgIC8vIElmIHRoZXJlIGlzIGEgcmVsZWFzZSBmb3IgdGhpcyByZXF1ZXN0LCB0aGVuIGlnbm9yZSB0aGUgcmVxdWVzdFxyXG4gICAgaWYgKHJlbW92ZVVubWF0Y2hlZFJlcXVlc3QocmVxdWVzdElkKSkge1xyXG4gICAgICAgIGRlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5yZXF1ZXN0Q2FwdHVyZSAtIENhcHR1cmUgcmVxdWVzdCBtYXRjaGVkIHByZXZpb3VzIHJlbGVhc2UgcmVxdWVzdCAke3JlcXVlc3RJZH0uICBDYW5jZWxsaW5nIGNhcHR1cmUgcmVxdWVzdGApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAocmVxdWVzdElkICE9PSBjdXJyZW50T3duZXIpIHtcclxuICAgICAgICAvLyBpZiB0aGUgcmVxdWVzdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUgcXVldWUsIGFkZCBpdCB0byB0aGUgcXVldWVcclxuICAgICAgICBlbnF1ZXVlQ2FwdHVyZVJlcXVlc3QocmVxdWVzdElkLCBjYXB0dXJlQ2FsbGJhY2ssIHJlbGVhc2VDYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFjdXJyZW50T3duZXIpIHtcclxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBjdXJyZW50IG93bmVyLCBnbyBhaGVhZCBhbmQgZ3JhbnQgdGhlIHJlcXVlc3RcclxuICAgICAgICB0cmFuc2ZlclBvaW50ZXJFdmVudHNPd25lcnNoaXAoKTtcclxuICAgIH1cclxuICAgIC8vIElmIHRoZSByZXF1ZXN0IGlkIGlzIHRoZSBjdXJyZW50IG93bmVyLCBkbyBub3RoaW5nXHJcbn07XHJcblxyXG4vKipcclxuICogUmVsZWFzZSBwb2ludGVyIGV2ZW50cyBmcm9tIHRoZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gaWQuICBJZiB0aGUgb2JqZWN0IGlzIHRoZSBjdXJyZW50IG93bmVyXHJcbiAqIHRoZW4gcG9pbnRlciBldmVudHMgYXJlIHJlbGVhc2VkIGltbWVkaWF0ZWx5LiAgSWYgdGhlIG9iamVjdCBpcyBub3QgdGhlIGN1cnJlbnQgb3duZXIsIHRoZW4gdGhlXHJcbiAqIGFzc29jaWF0ZWQgY2FwdHVyZSByZXF1ZXN0IGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUuICBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBjYXB0dXJlIHJlcXVlc3RcclxuICogaW4gdGhlIHF1ZXVlLCB0aGVuIHRoZSByZWxlYXNlIHJlcXVlc3QgaXMgYWRkZWQgdG8gYSBsaXN0IG9mIHVubWF0Y2hlZCByZWxlYXNlIHJlcXVlc3RzIGFuZCB3aWxsXHJcbiAqIG5lZ2F0ZSB0aGUgbmV4dCBjYXB0dXJlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZC4gIFRoaXMgaXMgdG8gZ3VhcmQgYWdhaW5zdCB0aGUgcG9zc2liaWxpdHkgdGhhdFxyXG4gKiB0aGUgcmVsZWFzZSByZXF1ZXN0IGFycml2ZWQgYmVmb3JlIHRoZSBjYXB0dXJlIHJlcXVlc3QuXHJcbiAqIEBwYXJhbSByZXF1ZXN0SWQgVGhlIGlkIHdoaWNoIHNob3VsZCBtYXRjaCB0aGUgaWQgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlcXVlc3RSZWxlYXNlID0gKHJlcXVlc3RJZDogc3RyaW5nIHwgbnVsbCkgPT4ge1xyXG4gICAgZGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLnJlcXVlc3RSZWxlYXNlIC0gUG9pbnRlciBldmVudHMgcmVsZWFzZSByZXF1ZXN0ZWQgZm9yICR7cmVxdWVzdElkfWApO1xyXG5cclxuICAgIC8vIGlmIHRoZSByZXF1ZXN0SWQgaXMgdGhlIGN1cnJlbnQgY2FwdHVyZSBob2xkZXIgcmVsZWFzZSBpdFxyXG4gICAgaWYgKCFyZXF1ZXN0SWQgfHwgcmVxdWVzdElkID09PSBjdXJyZW50T3duZXIpIHtcclxuICAgICAgICB0cmFuc2ZlclBvaW50ZXJFdmVudHNPd25lcnNoaXAoKTtcclxuICAgIH0gZWxzZSBpZiAoY2FuY2VsUmVxdWVzdChyZXF1ZXN0SWQpKSB7XHJcbiAgICAgICAgLy8gaWYgdGhlIHJlcXVlc3QgaXMgaW4gdGhlIHF1ZXVlLCBidXQgbm90IHRoZSBjdXJyZW50IGNhcHR1cmUgaG9sZGVyLCByZW1vdmUgaXQgYW5kIGl0J3MgY2FsbGJhY2tzXHJcbiAgICAgICAgcGVuZGluZ1JlcXVlc3RDYWxsYmFja3MuZGVsZXRlKHJlcXVlc3RJZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5yZXF1ZXN0UmVsZWFzZSAtIFJlY2VpdmVkIHJlbGVhc2UgcmVxdWVzdCAke3JlcXVlc3RJZH0gYnV0IG5vIG1hdGNoaW5nIGNhcHR1cmUgcmVxdWVzdCB3YXMgcmVjZWl2ZWRgKTtcclxuICAgICAgICAvLyByZXF1ZXN0IHdhcyBub3QgY3VycmVudCBhbmQgbm90IGluIHF1ZXVlLCBsaWtlbHkgYmVjYXVzZSB3ZSByZWNlaXZlZCBhIHJlbGVhc2VcclxuICAgICAgICAvLyByZXF1ZXN0IGJlZm9yZSB0aGUgY2FwdHVyZS4gIEFkZCBpdCB0byB0aGUgdW5tYXRjaGVkIGxpc3QgdG8gZ3VhcmQgYWdhaW5zdCB0aGlzIHBvc3NpYmlsaXR5XHJcbiAgICAgICAgaWYgKCF1bm1hdGNoZWRSZWxlYXNlUmVxdWVzdHMuaW5jbHVkZXMocmVxdWVzdElkKSkge1xyXG4gICAgICAgICAgICB1bm1hdGNoZWRSZWxlYXNlUmVxdWVzdHMucHVzaChyZXF1ZXN0SWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZWxhc2UgcG9pbnRlciBldmVudHMgZnJvbSB0aGUgY3VycmVudCBvd25lclxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbGVhc2VDdXJyZW50ID0gKCkgPT4ge1xyXG4gICAgcmVxdWVzdFJlbGVhc2UoY3VycmVudE93bmVyKTtcclxufTtcclxuXHJcbmNvbnN0IGVucXVldWVDYXB0dXJlUmVxdWVzdCA9IChyZXF1ZXN0SWQ6IHN0cmluZywgY2FwdHVyZTogQ2FwdHVyZVJlbGVhc2VDYWxsYmFjaywgcmVsZWFzZTogQ2FwdHVyZVJlbGVhc2VDYWxsYmFjaykgPT4ge1xyXG4gICAgZGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLmVucXVldWVDYXB0dXJlUmVxdWVzdCAtIEVucXVldWVpbmcgY2FwdHVyZSByZXF1ZXN0IGZvciAgJHtyZXF1ZXN0SWR9YCk7XHJcbiAgICBpZiAoIWNhcHR1cmVSZXF1ZXN0UXVldWUuaW5jbHVkZXMocmVxdWVzdElkKSkge1xyXG4gICAgICAgIGNhcHR1cmVSZXF1ZXN0UXVldWUucHVzaChyZXF1ZXN0SWQpO1xyXG4gICAgICAgIHBlbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzLnNldChyZXF1ZXN0SWQsIHsgY2FwdHVyZSwgcmVsZWFzZSB9KTtcclxuICAgIH1cclxufTtcclxuXHJcbi8vIFJlbW92ZXMgdGhlIHJlcXVlc3QgZnJvbSB0aGUgcXVldWUgaWYgaXQgZXhpc3RzLiAgUmV0dXJucyB0cnVlXHJcbi8vIGlmIHRoZSByZXF1ZXN0IHdhcyBmb3VuZCBhbmQgcmVtb3ZlZCwgb3RoZXJ3aXNlIGZhbHNlXHJcbmNvbnN0IGNhbmNlbFJlcXVlc3QgPSAocmVxdWVzdElkOiBzdHJpbmcgfCBudWxsKSA9PiB7XHJcbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xyXG4gICAgY2FwdHVyZVJlcXVlc3RRdWV1ZSA9IGNhcHR1cmVSZXF1ZXN0UXVldWUuZmlsdGVyKChpZCkgPT4ge1xyXG4gICAgICAgIGlmIChpZCAhPT0gcmVxdWVzdElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBkZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUuY2FuY2VsUmVxdWVzdCAtIENhbmNlbGluZyBwb2ludGVyIGV2ZW50cyBjYXB0dXJlIHJlcXVlc3QgJHtyZXF1ZXN0SWR9YCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZW1vdmVkO1xyXG59O1xyXG5cclxuY29uc3QgcmVtb3ZlVW5tYXRjaGVkUmVxdWVzdCA9IChyZXF1ZXN0SWQ6IHN0cmluZykgPT4ge1xyXG4gICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcclxuICAgIHVubWF0Y2hlZFJlbGVhc2VSZXF1ZXN0cyA9IHVubWF0Y2hlZFJlbGVhc2VSZXF1ZXN0cy5maWx0ZXIoKGlkKSA9PiB7XHJcbiAgICAgICAgaWYgKGlkICE9PSByZXF1ZXN0SWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZW1vdmVkO1xyXG59O1xyXG5cclxuY29uc3QgdHJhbnNmZXJQb2ludGVyRXZlbnRzT3duZXJzaGlwID0gKCkgPT4ge1xyXG4gICAgY29uc3QgbmV3T3duZXJJZCA9IG5leHRDYXB0dXJlUmVxdWVzdCgpO1xyXG4gICAgZGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLnRyYW5zZmVyUG9pbnRlckV2ZW50c093bmVyc2hpcCAtIFRyYW5zZmVycnJpbmcgcG9pbnRlciBldmVudHMgZnJvbSAke2N1cnJlbnRPd25lcn0gdG8gJHtuZXdPd25lcklkfWApO1xyXG4gICAgLy8gUmVsZWFzZSB0aGUgY3VycmVudCBvd25lclxyXG4gICAgZG9SZWxlYXNlKCk7XHJcbiAgICBpZiAobmV3T3duZXJJZCkge1xyXG4gICAgICAgIGRvQ2FwdHVyZShuZXdPd25lcklkKTtcclxuICAgIH1cclxufTtcclxuXHJcbmNvbnN0IGRvUmVsZWFzZSA9ICgpID0+IHtcclxuICAgIGRlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5kb1JlbGVhc2UgLSBSZWxlYXNpbmcgcG9pbnRlciBldmVudHMgZnJvbSAke2N1cnJlbnRPd25lcn1gKTtcclxuICAgIGlmIChjdXJyZW50T3duZXIpIHtcclxuICAgICAgICAvLyBjYWxsIHRoZSByZWxlYXNlIGNhbGxiYWNrXHJcbiAgICAgICAgcGVuZGluZ1JlcXVlc3RDYWxsYmFja3MuZ2V0KGN1cnJlbnRPd25lcik/LnJlbGVhc2UoKTtcclxuICAgICAgICAvLyBBbmQgcmVtb3ZlIHRoZSBjYWxsYmFja3NcclxuICAgICAgICBwZW5kaW5nUmVxdWVzdENhbGxiYWNrcy5kZWxldGUoY3VycmVudE93bmVyKTtcclxuICAgICAgICBjdXJyZW50T3duZXIgPSBudWxsO1xyXG4gICAgfVxyXG59O1xyXG5cclxuY29uc3QgZG9DYXB0dXJlID0gKG5ld093bmVySWQ6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKG5ld093bmVySWQpIHtcclxuICAgICAgICAvLyBjYWxsIHRoZSBjYXB0dXJlIGNhbGxiYWNrXHJcbiAgICAgICAgcGVuZGluZ1JlcXVlc3RDYWxsYmFja3MuZ2V0KG5ld093bmVySWQpPy5jYXB0dXJlKCk7XHJcbiAgICB9XHJcbiAgICBjdXJyZW50T3duZXIgPSBuZXdPd25lcklkO1xyXG4gICAgZGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLmRvQ2FwdHVyZSAtIFBvaW50ZXIgZXZlbnRzIG5vdyBjYXB0dXJlZCBieSAke25ld093bmVySWR9YCk7XHJcbn07XHJcblxyXG5jb25zdCBuZXh0Q2FwdHVyZVJlcXVlc3QgPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gY2FwdHVyZVJlcXVlc3RRdWV1ZS5sZW5ndGggPiAwID8gY2FwdHVyZVJlcXVlc3RRdWV1ZS5zaGlmdCgpIDogbnVsbDtcclxufTtcclxuXHJcbi8vICNyZWdpb24gRGVidWdnaW5nIHN1cHBvcnRcclxuZGVjbGFyZSBnbG9iYWwge1xyXG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxyXG4gICAgICAgIFwicG9pbnRlci1ldmVudHMtY2FwdHVyZS1kZWJ1Z1wiOiBib29sZWFuIHwgbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3QgZGVidWdMb2cgPSAobWVzc2FnZTogc3RyaW5nKSA9PiB7XHJcbiAgICAvLyBJZiB3ZSBhcmUgcnVubm5pbmcgaW4gYSB0ZXN0IHJ1bm5lciAoaW4gbm9kZSwgc28gd2luZG93IGlzIG5vdCBkZWZpbmVkKVxyXG4gICAgLy8gb3IgaWYgdGhlIGRlYnVnIGZsYWcgaXMgc2V0LCB0aGVuIGxvZyB0aGUgbWVzc2FnZVxyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHwgd2luZG93W1wicG9pbnRlci1ldmVudHMtY2FwdHVyZS1kZWJ1Z1wiXSkge1xyXG4gICAgICAgIFRvb2xzLkxvZyhcclxuICAgICAgICAgICAgYCR7cGVyZm9ybWFuY2Uubm93KCl9IC0gZ2FtZS5zY2VuZS5wb2ludGVyRXZlbnRzIC0gJHttZXNzYWdlfVxcbmN1cnJlbnRPd25lcjogJHtjdXJyZW50T3duZXJ9XFxucXVldWU6ICR7Y2FwdHVyZVJlcXVlc3RRdWV1ZX1cXG51bm1hdGNoZWQ6ICR7dW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzfWBcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59O1xyXG4vLyAjZW5kcmVnaW9uIERlYnVnZ2luZyBzdXBwb3J0XHJcbiIsImltcG9ydCB0eXBlIHsgQWJzdHJhY3RNZXNoIH0gZnJvbSBcImNvcmUvTWVzaGVzL2Fic3RyYWN0TWVzaFwiO1xyXG5pbXBvcnQgdHlwZSB7IEJlaGF2aW9yIH0gZnJvbSBcImNvcmUvQmVoYXZpb3JzL2JlaGF2aW9yXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiY29yZS9NaXNjL2xvZ2dlclwiO1xyXG5pbXBvcnQgeyByZXF1ZXN0Q2FwdHVyZSwgcmVxdWVzdFJlbGVhc2UsIHJlbGVhc2VDdXJyZW50LCBnZXRDYXB0dXJpbmdJZCB9IGZyb20gXCIuL3BvaW50ZXJFdmVudHNDYXB0dXJlXCI7XHJcblxyXG4vLyBNb2R1bGUgbGV2ZWwgdmFyaWFibGUgZm9yIGhvbGRpbmcgdGhlIGN1cnJlbnQgc2NlbmVcclxubGV0IF9zY2VuZTogU2NlbmUgfCBudWxsID0gbnVsbDtcclxuXHJcbi8vIE1vZHVsZSBsZXZlbCB2YXJpYWJsZSB0byBob2xkIHRoZSBjb3VudCBvZiBiZWhhdmlvciBpbnN0YW5jZXMgdGhhdCBhcmUgY3VycmVudGx5IGNhcHR1cmluZyBwb2ludGVyIGV2ZW50c1xyXG4vLyBvbiBlbnRyeS4gIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBzdGFydCBvciBzdG9wIG9ic2VydmluZyBwb2ludGVyIG1vdmVtZW50LlxyXG5sZXQgY2FwdHVyZU9uRW50ZXJDb3VudCA9IDA7XHJcblxyXG4vLyBNYXAgdXNlZCB0byBzdG9yZSBpbnN0YW5jZSBvZiB0aGUgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciBmb3IgYSBtZXNoXHJcbi8vIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGlzIGdldHMgY2hlY2tlZCBvbiBwb2ludGVyIG1vdmUgYW5kIHdlIGRvbid0IHdhbnQgdG9cclxuLy8gdXNlIGdldEJlaGF2aW9yQnlOYW1lKCkgYmVjYXVzZSB0aGF0IGlzIGEgbGluZWFyIHNlYXJjaFxyXG5jb25zdCBtZXNoVG9CZWhhdmlvck1hcCA9IG5ldyBXZWFrTWFwPEFic3RyYWN0TWVzaCwgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvcj4oKTtcclxuXHJcbmNvbnN0IHN0YXJ0Q2FwdHVyZU9uRW50ZXIgPSAoc2NlbmU6IFNjZW5lKSA9PiB7XHJcbiAgICAvLyBJZiB3ZSBhcmUgbm90IGluIGEgYnJvd3NlciwgZG8gbm90aGluZ1xyXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChjYXB0dXJlT25FbnRlckNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIG9uUG9pbnRlck1vdmUpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIG9uUG9pbnRlck1vdmUpO1xyXG4gICAgICAgIF9zY2VuZSA9IF9zY2VuZSA/PyBzY2VuZTtcclxuICAgICAgICBMb2dnZXIuTG9nKFwiUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvcjogU3RhcnRpbmcgb2JzZXJ2YXRpb24gb2YgcG9pbnRlciBtb3ZlIGV2ZW50cy5cIik7XHJcbiAgICAgICAgX3NjZW5lLm9uRGlzcG9zZU9ic2VydmFibGUuYWRkKGRvU3RvcENhcHR1cmVPbkVudGVyKTtcclxuICAgIH1cclxuICAgIGNhcHR1cmVPbkVudGVyQ291bnQrKztcclxufTtcclxuXHJcbmNvbnN0IGRvU3RvcENhcHR1cmVPbkVudGVyID0gKCkgPT4ge1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIG9uUG9pbnRlck1vdmUpO1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgb25Qb2ludGVyTW92ZSk7XHJcbiAgICBfc2NlbmUgPSBudWxsO1xyXG4gICAgTG9nZ2VyLkxvZyhcIlBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3I6IFN0b3BwaW5nIG9ic2VydmF0aW9uIG9mIHBvaW50ZXIgbW92ZSBldmVudHMuXCIpO1xyXG4gICAgY2FwdHVyZU9uRW50ZXJDb3VudCA9IDA7XHJcbn07XHJcblxyXG5jb25zdCBzdG9wQ2FwdHVyZU9uRW50ZXIgPSAoKSA9PiB7XHJcbiAgICAvLyBJZiB3ZSBhcmUgbm90IGluIGEgYnJvd3NlciwgZG8gbm90aGluZ1xyXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB3ZSBhcmUgbm90IG9ic2VydmluZyBwb2ludGVyIG1vdmVtZW50LCBkbyBub3RoaW5nXHJcbiAgICBpZiAoIV9zY2VuZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjYXB0dXJlT25FbnRlckNvdW50LS07XHJcbiAgICBpZiAoY2FwdHVyZU9uRW50ZXJDb3VudCA8PSAwKSB7XHJcbiAgICAgICAgZG9TdG9wQ2FwdHVyZU9uRW50ZXIoKTtcclxuICAgIH1cclxufTtcclxuXHJcbi8vIE1vZHVsZSBsZXZlbCBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBpZiBhbiBlbnRlcmVkIG1lc2ggc2hvdWxkIGNhcHR1cmUgcG9pbnRlciBldmVudHNcclxuY29uc3Qgb25Qb2ludGVyTW92ZSA9IChldnQ6IFBvaW50ZXJFdmVudCB8IFRvdWNoRXZlbnQpID0+IHtcclxuICAgIGlmICghX3NjZW5lKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNhbnZhc1JlY3QgPSBfc2NlbmUuZ2V0RW5naW5lKCkuZ2V0UmVuZGVyaW5nQ2FudmFzQ2xpZW50UmVjdCgpO1xyXG4gICAgaWYgKCFjYW52YXNSZWN0KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldCB0aGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGNsaWVudCBYIGFuZCBZIGZyb20gZWl0aGVyIHRoZSBwb2ludGVyIGV2ZW50IG9yIGZyb20gdGhlXHJcbiAgICAvLyBUb3VjaEV2ZW50IHRvdWNoXHJcbiAgICBjb25zdCB7IGNsaWVudFgsIGNsaWVudFkgfSA9IFwidG91Y2hlc1wiIGluIGV2dCA/IGV2dC50b3VjaGVzWzBdIDogZXZ0O1xyXG5cclxuICAgIC8vIGdldCB0aGUgcGlja2VkIG1lc2gsIGlmIGFueVxyXG4gICAgY29uc3QgcG9pbnRlclNjcmVlblggPSBjbGllbnRYIC0gY2FudmFzUmVjdC5sZWZ0O1xyXG4gICAgY29uc3QgcG9pbnRlclNjcmVlblkgPSBjbGllbnRZIC0gY2FudmFzUmVjdC50b3A7XHJcblxyXG4gICAgbGV0IHBvaW50ZXJDYXB0dXJlQmVoYXZpb3I6IFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgfCB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBwaWNrUmVzdWx0ID0gX3NjZW5lLnBpY2socG9pbnRlclNjcmVlblgsIHBvaW50ZXJTY3JlZW5ZLCAobWVzaCkgPT4ge1xyXG4gICAgICAgIC8vIElmIHRoZSBtZXNoIGhhcyBhbiBpbnN0YW5jZSBvZiBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIGF0dGFjaGVkIHRvIGl0LFxyXG4gICAgICAgIC8vIGFuZCBjYXB0dXJlIG9uIHBvaW50ZXIgZW50ZXIgaXMgdHJ1ZSwgdGhlbiB3ZSB3YW50IHRvIHBpY2sgaXRcclxuICAgICAgICBjb25zdCBwb2ludGVyQ2FwdHVyZUJlaGF2aW9yID0gbWVzaFRvQmVoYXZpb3JNYXAuZ2V0KG1lc2gpO1xyXG4gICAgICAgIHJldHVybiBtZXNoLmlzRW5hYmxlZCgpICYmIHR5cGVvZiBwb2ludGVyQ2FwdHVyZUJlaGF2aW9yICE9PSBcInVuZGVmaW5lZFwiICYmIHBvaW50ZXJDYXB0dXJlQmVoYXZpb3IuX2NhcHR1cmVPblBvaW50ZXJFbnRlcjtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBwaWNrZWRNZXNoOiBBYnN0cmFjdE1lc2ggfCBudWxsO1xyXG4gICAgaWYgKHBpY2tSZXN1bHQuaGl0KSB7XHJcbiAgICAgICAgcGlja2VkTWVzaCA9IHBpY2tSZXN1bHQucGlja2VkTWVzaDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGlja2VkTWVzaCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2FwdHVyaW5nSWRBc0ludCA9IHBhcnNlSW50KGdldENhcHR1cmluZ0lkKCkgfHwgXCJcIik7XHJcblxyXG4gICAgLy8gaWYgdGhlIHBpY2tlZCBtZXNoIGlzIHRoZSBjdXJyZW50IGNhcHR1cmluZyBtZXNoLCBkbyBub3RoaW5nXHJcbiAgICBpZiAocGlja2VkTWVzaCAmJiBwaWNrZWRNZXNoLnVuaXF1ZUlkID09PSBjYXB0dXJpbmdJZEFzSW50KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZXJlIGlzIGEgY2FwdHVyaW5nIG1lc2ggYW5kIGl0IGlzIG5vdCB0aGUgY3VycmVudCBwaWNrZWQgbWVzaCwgb3Igbm9cclxuICAgIC8vIG1lc2ggaXMgcGlja2VkLCByZWxlYXNlIHRoZSBjYXB0dXJpbmcgbWVzaFxyXG4gICAgaWYgKGNhcHR1cmluZ0lkQXNJbnQgJiYgKCFwaWNrZWRNZXNoIHx8IHBpY2tlZE1lc2gudW5pcXVlSWQgIT09IGNhcHR1cmluZ0lkQXNJbnQpKSB7XHJcbiAgICAgICAgcmVsZWFzZUN1cnJlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB0aGVyZSBpcyBhIHBpY2tlZCBtZXNoIGFuZCBpdCBpcyBub3QgdGhlIGN1cnJlbnQgY2FwdHVyaW5nIG1lc2gsIGNhcHR1cmVcclxuICAgIC8vIHRoZSBwb2ludGVyIGV2ZW50cy4gIE5vdGUgdGhhdCB0aGUgY3VycmVudCBjYXB0dXJpbmcgbWVzaCBoYXMgYWxyZWFkeSBiZWVuXHJcbiAgICAvLyByZWxlYXNlZCBhYm92ZVxyXG4gICAgaWYgKHBpY2tlZE1lc2gpIHtcclxuICAgICAgICBwb2ludGVyQ2FwdHVyZUJlaGF2aW9yID0gbWVzaFRvQmVoYXZpb3JNYXAuZ2V0KHBpY2tlZE1lc2gpO1xyXG4gICAgICAgIHBvaW50ZXJDYXB0dXJlQmVoYXZpb3IhLmNhcHR1cmVQb2ludGVyRXZlbnRzKCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG4vKipcclxuICogQmVoYXZpb3IgZm9yIGFueSBjb250ZW50IHRoYXQgY2FuIGNhcHR1cmUgcG9pbnRlciBldmVudHMsIGkuZS4gYnlwYXNzIHRoZSBCYWJ5bG9uIHBvaW50ZXIgZXZlbnQgaGFuZGxpbmdcclxuICogYW5kIHJlY2VpdmUgcG9pbnRlciBldmVudHMgZGlyZWN0bHkuICBJdCB3aWxsIHJlZ2lzdGVyIHRoZSBjYXB0dXJlIHRyaWdnZXJzIGFuZCBuZWdvdGlhdGUgdGhlIGNhcHR1cmUgYW5kXHJcbiAqIHJlbGVhc2Ugb2YgcG9pbnRlciBldmVudHMuICBDdXJlcm50bHkgdGhpcyBhcHBsaWVzIG9ubHkgdG8gSHRtbE1lc2hcclxuICovXHJcbmV4cG9ydCBjbGFzcyBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIGltcGxlbWVudHMgQmVoYXZpb3I8QWJzdHJhY3RNZXNoPiB7XHJcbiAgICAvKiogZ2V0cyBvciBzZXRzIGJlaGF2aW9yJ3MgbmFtZSAqL1xyXG4gICAgcHVibGljIG5hbWUgPSBcIlBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3JcIjtcclxuXHJcbiAgICBwcml2YXRlIF9hdHRhY2hlZE1lc2g6IEFic3RyYWN0TWVzaCB8IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwdWJsaWMgX2NhcHR1cmVPblBvaW50ZXJFbnRlcjogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgbWVzaCB0aGF0IHRoZSBiZWhhdmlvciBpcyBhdHRhY2hlZCB0b1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGF0dGFjaGVkTWVzaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoZWRNZXNoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYXR0YWNoZWRNZXNoKHZhbHVlOiBBYnN0cmFjdE1lc2ggfCBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fYXR0YWNoZWRNZXNoID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBfY2FwdHVyZUNhbGxiYWNrOiAoKSA9PiB2b2lkLFxyXG4gICAgICAgIHByaXZhdGUgX3JlbGVhc2VDYWxsYmFjazogKCkgPT4gdm9pZCxcclxuICAgICAgICB7IGNhcHR1cmVPblBvaW50ZXJFbnRlciA9IHRydWUgfSA9IHt9XHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLl9hdHRhY2hlZE1lc2ggPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlciA9IGNhcHR1cmVPblBvaW50ZXJFbnRlcjtcclxuXHJcbiAgICAgICAgLy8gV2FybiBpZiB3ZSBhcmUgbm90IGluIGEgYnJvd3NlclxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgTG9nZ2VyLldhcm4oYENyZWF0aW5nIGFuIGluc3RhbmNlIG9mIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3Igb3V0c2lkZSBvZiBhIGJyb3dzZXIuICBUaGUgYmVoYXZpb3Igd2lsbCBub3Qgd29yay5gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgaWYgdGhlIGJlaGF2aW9yIHNob3VsZCBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzIHdoZW4gdGhlIHBvaW50ZXIgZW50ZXJzIHRoZSBtZXNoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgY2FwdHVyZU9uUG9pbnRlckVudGVyKGNhcHR1cmVPblBvaW50ZXJFbnRlcjogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIgPT09IGNhcHR1cmVPblBvaW50ZXJFbnRlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlciA9IGNhcHR1cmVPblBvaW50ZXJFbnRlcjtcclxuICAgICAgICBpZiAodGhpcy5fYXR0YWNoZWRNZXNoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIpIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0Q2FwdHVyZU9uRW50ZXIodGhpcy5fYXR0YWNoZWRNZXNoLmdldFNjZW5lKCkhKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0b3BDYXB0dXJlT25FbnRlcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGJlaGF2aW9yIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIChiZWZvcmUgYXR0YWNoaW5nIGl0IHRvIGEgdGFyZ2V0KVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdCgpIHt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYmVoYXZpb3IgaXMgYXR0YWNoZWQgdG8gYSB0YXJnZXRcclxuICAgICAqIEBwYXJhbSBtZXNoIGRlZmluZXMgdGhlIHRhcmdldCB3aGVyZSB0aGUgYmVoYXZpb3IgaXMgYXR0YWNoZWQgdG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGF0dGFjaChtZXNoOiBBYnN0cmFjdE1lc2gpIHtcclxuICAgICAgICAvLyBBZGQgYSByZWZlcmVuY2UgdG8gdGhpcyBiZWhhdmlvciBvbiB0aGUgbWVzaC4gIFdlIGRvIHRoaXMgc28gd2UgY2FuIGdldCBhXHJcbiAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSBiZWhhdmlvciBpbiB0aGUgb25Qb2ludGVyTW92ZSBmdW5jdGlvbiB3aXRob3V0IHJlbHlpbmcgb25cclxuICAgICAgICAvLyBnZXRCZWhhdmlvckJ5TmFtZSgpLCB3aGljaCBkb2VzIGEgbGluZWFyIHNlYXJjaCBvZiB0aGUgYmVoYXZpb3JzIGFycmF5LlxyXG4gICAgICAgIHRoaXMuYXR0YWNoZWRNZXNoID0gbWVzaDtcclxuICAgICAgICBtZXNoVG9CZWhhdmlvck1hcC5zZXQobWVzaCwgdGhpcyk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlcikge1xyXG4gICAgICAgICAgICBzdGFydENhcHR1cmVPbkVudGVyKG1lc2guZ2V0U2NlbmUoKSEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBiZWhhdmlvciBpcyBkZXRhY2hlZCBmcm9tIGl0cyB0YXJnZXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRldGFjaCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuYXR0YWNoZWRNZXNoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhpcyBiZWhhdmlvciBmcm9tIHRoZSBtZXNoXHJcbiAgICAgICAgbWVzaFRvQmVoYXZpb3JNYXAuZGVsZXRlKHRoaXMuYXR0YWNoZWRNZXNoKTtcclxuICAgICAgICBpZiAodGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyKSB7XHJcbiAgICAgICAgICAgIHN0b3BDYXB0dXJlT25FbnRlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmF0dGFjaGVkTWVzaCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwb3NlIHRoZSBiZWhhdmlvclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgICAgICB0aGlzLmRldGFjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlbGVhc2UgcG9pbnRlciBldmVudHNcclxuICAgIHB1YmxpYyByZWxlYXNlUG9pbnRlckV2ZW50cygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuYXR0YWNoZWRNZXNoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVxdWVzdFJlbGVhc2UodGhpcy5hdHRhY2hlZE1lc2gudW5pcXVlSWQudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FwdHVyZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgcHVibGljIGNhcHR1cmVQb2ludGVyRXZlbnRzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5hdHRhY2hlZE1lc2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXF1ZXN0Q2FwdHVyZSh0aGlzLmF0dGFjaGVkTWVzaC51bmlxdWVJZC50b1N0cmluZygpLCB0aGlzLl9jYXB0dXJlQ2FsbGJhY2ssIHRoaXMuX3JlbGVhc2VDYWxsYmFjayk7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vaHRtbE1lc2hcIjtcbiIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9iYWJ5bG9uanNfTWF0aHNfbWF0aF9fOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXNcclxuaW1wb3J0ICogYXMgYWRkb25zIGZyb20gXCJhZGRvbnMvaW5kZXhcIjtcclxuXHJcbmV4cG9ydCB7IGFkZG9ucyB9O1xyXG5leHBvcnQgZGVmYXVsdCBhZGRvbnM7XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
1957
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbmpzLmFkZG9ucy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDM1lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7Ozs7QUFTQTtBQUNBO0FBQUE7QUFxREE7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFwREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBO0FBTUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQWtCQTtBQVdBO0FBQ0E7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQS9FQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQWdDQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUtBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBeUNBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBS0E7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQUE7QUFLQTtBQUhBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQU1BO0FBSkE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFBQTtBQUtBO0FBSEE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7O0FBRUE7QUFDQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNVdBO0FBR0E7QUFFQTtBQUdBO0FBR0E7QUFDQTtBQWNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQTRDQTs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFGQTtBQTVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUF1aUJBO0FBQ0E7QUFDQTtBQUNBO0FBaGhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFpQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFpQ0E7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0cUJBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQWVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4TEE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBbUJBO0FBR0E7QUFGQTtBQUNBO0FBcEJBO0FBQ0E7QUFzQkE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFwQkE7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBSkE7QUF1QkE7QUFIQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUFBO0FBRUE7O0FBRUE7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsT0E7Ozs7Ozs7Ozs7O0FDQUE7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9odG1sTWVzaC9maXRTdHJhdGVneS50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaHRtbE1lc2gvaHRtbE1lc2gudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2h0bWxNZXNoL2h0bWxNZXNoUmVuZGVyZXIudHMiLCJ3ZWJwYWNrOi8vQURET05TLy4uLy4uLy4uL2Rldi9hZGRvbnMvc3JjL2h0bWxNZXNoL2luZGV4LnRzIiwid2VicGFjazovL0FERE9OUy8uLi8uLi8uLi9kZXYvYWRkb25zL3NyYy9odG1sTWVzaC9wb2ludGVyRXZlbnRzQ2FwdHVyZS50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaHRtbE1lc2gvcG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvci50cyIsIndlYnBhY2s6Ly9BRERPTlMvLi4vLi4vLi4vZGV2L2FkZG9ucy9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vQURET05TL2V4dGVybmFsIHVtZCB7XCJyb290XCI6XCJCQUJZTE9OXCIsXCJjb21tb25qc1wiOlwiYmFieWxvbmpzXCIsXCJjb21tb25qczJcIjpcImJhYnlsb25qc1wiLFwiYW1kXCI6XCJiYWJ5bG9uanNcIn0iLCJ3ZWJwYWNrOi8vQURET05TL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9BRERPTlMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL0FERE9OUy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0FERE9OUy8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJiYWJ5bG9uanNcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJiYWJ5bG9uanMtYWRkb25zXCIsIFtcImJhYnlsb25qc1wiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJiYWJ5bG9uanMtYWRkb25zXCJdID0gZmFjdG9yeShyZXF1aXJlKFwiYmFieWxvbmpzXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJBRERPTlNcIl0gPSBmYWN0b3J5KHJvb3RbXCJCQUJZTE9OXCJdKTtcbn0pKCh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdGhpcyksIChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NZXNoZXNfbWVzaF9fKSA9PiB7XG5yZXR1cm4gIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xuXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcbiAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xuICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHQ7XG4gIH1cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgIH1cbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICB9XG4gIH1cbiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICBkb25lID0gdHJ1ZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICB9XG4gIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcbiAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xuICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gIH1cbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICByW2tdID0gYVtqXTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxuICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgcmV0dXJuIGNvb2tlZDtcbn07XG5cbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbnZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xuICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICB2YXIgYXIgPSBbXTtcbiAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xuICAgIHJldHVybiBhcjtcbiAgfTtcbiAgcmV0dXJuIG93bktleXMobyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xuICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIHZhciByLCBzID0gMDtcbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XG4gICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XG4gICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHMgfD0gMTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aCwgcHJlc2VydmVKc3gpIHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiICYmIC9eXFwuXFwuP1xcLy8udGVzdChwYXRoKSkge1xuICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwuKHRzeCkkfCgoPzpcXC5kKT8pKCg/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcbiAgICAgICAgICByZXR1cm4gdHN4ID8gcHJlc2VydmVKc3ggPyBcIi5qc3hcIiA6IFwiLmpzXCIgOiBkICYmICghZXh0IHx8ICFjbSkgPyBtIDogKGQgKyBleHQgKyBcIi5cIiArIGNtLnRvTG93ZXJDYXNlKCkgKyBcImpzXCIpO1xuICAgICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgX19leHRlbmRzLFxuICBfX2Fzc2lnbixcbiAgX19yZXN0LFxuICBfX2RlY29yYXRlLFxuICBfX3BhcmFtLFxuICBfX2VzRGVjb3JhdGUsXG4gIF9fcnVuSW5pdGlhbGl6ZXJzLFxuICBfX3Byb3BLZXksXG4gIF9fc2V0RnVuY3Rpb25OYW1lLFxuICBfX21ldGFkYXRhLFxuICBfX2F3YWl0ZXIsXG4gIF9fZ2VuZXJhdG9yLFxuICBfX2NyZWF0ZUJpbmRpbmcsXG4gIF9fZXhwb3J0U3RhcixcbiAgX192YWx1ZXMsXG4gIF9fcmVhZCxcbiAgX19zcHJlYWQsXG4gIF9fc3ByZWFkQXJyYXlzLFxuICBfX3NwcmVhZEFycmF5LFxuICBfX2F3YWl0LFxuICBfX2FzeW5jR2VuZXJhdG9yLFxuICBfX2FzeW5jRGVsZWdhdG9yLFxuICBfX2FzeW5jVmFsdWVzLFxuICBfX21ha2VUZW1wbGF0ZU9iamVjdCxcbiAgX19pbXBvcnRTdGFyLFxuICBfX2ltcG9ydERlZmF1bHQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRJbixcbiAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXG4gIF9fZGlzcG9zZVJlc291cmNlcyxcbiAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sXG59O1xuIiwiZXhwb3J0IHR5cGUgRml0U3RyYXRlZ3lUeXBlID0ge1xyXG4gICAgd3JhcEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudDtcclxuICAgIHVwZGF0ZVNpemUoc2l6aW5nRWxlbWVudDogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZDtcclxufTtcclxuXHJcbmNvbnN0IEZpdFN0cmF0ZWd5Q29udGFpbjogRml0U3RyYXRlZ3lUeXBlID0ge1xyXG4gICAgd3JhcEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3Qgc2l6aW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5qdXN0aWZ5Q29udGVudCA9IFwiY2VudGVyXCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5hbGlnbkl0ZW1zID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5hcHBlbmRDaGlsZChzY2FsaW5nRWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHNpemluZ0VsZW1lbnQ7XHJcbiAgICB9LFxyXG4gICAgdXBkYXRlU2l6ZShzaXppbmdFbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IHNpemluZ0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQhIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG5cclxuICAgICAgICBjb25zdCBbY2hpbGRXaWR0aCwgY2hpbGRIZWlnaHRdID0gW3NjYWxpbmdFbGVtZW50IS5vZmZzZXRXaWR0aCwgc2NhbGluZ0VsZW1lbnQhLm9mZnNldEhlaWdodF07XHJcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbih3aWR0aCAvIGNoaWxkV2lkdGgsIGhlaWdodCAvIGNoaWxkSGVpZ2h0KTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHtzY2FsZX0pYDtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuY29uc3QgRml0U3RyYXRlZ3lDb3ZlcjogRml0U3RyYXRlZ3lUeXBlID0ge1xyXG4gICAgd3JhcEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3Qgc2l6aW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5qdXN0aWZ5Q29udGVudCA9IFwiY2VudGVyXCI7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5hbGlnbkl0ZW1zID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICAgICAgc2NhbGluZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5hcHBlbmRDaGlsZChzY2FsaW5nRWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHNpemluZ0VsZW1lbnQ7XHJcbiAgICB9LFxyXG4gICAgdXBkYXRlU2l6ZShzaXppbmdFbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBzY2FsaW5nRWxlbWVudCA9IHNpemluZ0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQhIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIHNpemluZ0VsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG5cclxuICAgICAgICBjb25zdCBbY2hpbGRXaWR0aCwgY2hpbGRIZWlnaHRdID0gW3NjYWxpbmdFbGVtZW50IS5vZmZzZXRXaWR0aCwgc2NhbGluZ0VsZW1lbnQhLm9mZnNldEhlaWdodF07XHJcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1heCh3aWR0aCAvIGNoaWxkV2lkdGgsIGhlaWdodCAvIGNoaWxkSGVpZ2h0KTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHtzY2FsZX0pYDtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICB9LFxyXG59O1xyXG5cclxuY29uc3QgRml0U3RyYXRlZ3lTdHJldGNoOiBGaXRTdHJhdGVneVR5cGUgPSB7XHJcbiAgICB3cmFwRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBzaXppbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmp1c3RpZnlDb250ZW50ID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiO1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgICBzaXppbmdFbGVtZW50LmFwcGVuZENoaWxkKHNjYWxpbmdFbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gc2l6aW5nRWxlbWVudDtcclxuICAgIH0sXHJcbiAgICB1cGRhdGVTaXplKHNpemluZ0VsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHNjYWxpbmdFbGVtZW50ID0gc2l6aW5nRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCEgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcclxuICAgICAgICBzaXppbmdFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XHJcblxyXG4gICAgICAgIGNvbnN0IFtjaGlsZFdpZHRoLCBjaGlsZEhlaWdodF0gPSBbc2NhbGluZ0VsZW1lbnQhLm9mZnNldFdpZHRoLCBzY2FsaW5nRWxlbWVudCEub2Zmc2V0SGVpZ2h0XTtcclxuICAgICAgICBzY2FsaW5nRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHt3aWR0aCAvIGNoaWxkV2lkdGh9LCAke2hlaWdodCAvIGNoaWxkSGVpZ2h0fSlgO1xyXG4gICAgICAgIHNjYWxpbmdFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuICAgIH0sXHJcbn07XHJcblxyXG5jb25zdCBGaXRTdHJhdGVneU5vbmU6IEZpdFN0cmF0ZWd5VHlwZSA9IHtcclxuICAgIHdyYXBFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfSxcclxuICAgIHVwZGF0ZVNpemUoc2l6aW5nRWxlbWVudDogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHNpemluZ0VsZW1lbnQpIHtcclxuICAgICAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcclxuICAgICAgICAgICAgc2l6aW5nRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgRml0U3RyYXRlZ3kgPSB7XHJcbiAgICBDT05UQUlOOiBGaXRTdHJhdGVneUNvbnRhaW4sXHJcbiAgICBDT1ZFUjogRml0U3RyYXRlZ3lDb3ZlcixcclxuICAgIFNUUkVUQ0g6IEZpdFN0cmF0ZWd5U3RyZXRjaCxcclxuICAgIE5PTkU6IEZpdFN0cmF0ZWd5Tm9uZSxcclxufTtcclxuIiwiaW1wb3J0IHsgTWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9tZXNoXCI7XHJcbmltcG9ydCB7IENyZWF0ZVBsYW5lVmVydGV4RGF0YSB9IGZyb20gXCJjb3JlL01lc2hlcy9CdWlsZGVycy9wbGFuZUJ1aWxkZXJcIjtcclxuaW1wb3J0IHsgU3RhbmRhcmRNYXRlcmlhbCB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9zdGFuZGFyZE1hdGVyaWFsXCI7XHJcbmltcG9ydCB7IE1hdHJpeCB9IGZyb20gXCJjb3JlL01hdGhzL21hdGhcIjtcclxuaW1wb3J0IHsgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciB9IGZyb20gXCIuL3BvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJjb3JlL01pc2MvbG9nZ2VyXCI7XHJcbmltcG9ydCB0eXBlIHsgRml0U3RyYXRlZ3lUeXBlIH0gZnJvbSBcIi4vZml0U3RyYXRlZ3lcIjtcclxuaW1wb3J0IHsgRml0U3RyYXRlZ3kgfSBmcm9tIFwiLi9maXRTdHJhdGVneVwiO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBIVE1MIGNvbnRlbnQgdGhhdCB3ZSB3YW50IHRvIHJlbmRlciBhcyB0aG91Z2ggaXQgaXMgcGFydCBvZiB0aGUgc2NlbmUuICBUaGUgSFRNTCBjb250ZW50IGlzIGFjdHVhbGx5XHJcbiAqIHJlbmRlcmVkIGJlbG93IHRoZSBjYW52YXMsIGJ1dCBhIGRlcHRoIG1hc2sgaXMgY3JlYXRlZCBieSB0aGlzIGNsYXNzIHRoYXQgd3JpdGVzIHRvIHRoZSBkZXB0aCBidWZmZXIgYnV0IGRvZXMgbm90XHJcbiAqIHdyaXRlIHRvIHRoZSBjb2xvciBidWZmZXIsIGVmZmVjdGl2ZWx5IHB1bmNoaW5nIGEgaG9sZSBpbiB0aGUgY2FudmFzLiAgQ1NTIHRyYW5zZm9ybXMgYXJlIHVzZWQgdG8gc2NhbGUsIHRyYW5zbGF0ZSwgYW5kIHJvdGF0ZVxyXG4gKiB0aGUgSFRNTCBjb250ZW50IHNvIHRoYXQgaXQgbWF0Y2hlcyB0aGUgY2FtZXJhIGFuZCBtZXNoIG9yaWVudGF0aW9uLiAgVGhlIGNsYXNzIHN1cHBvcnRzIGludGVyYWN0aW9ucyBpbiBlZGl0YWJsZSBhbmQgbm9uLWVkaXRhYmxlIG1vZGUuXHJcbiAqIEluIG5vbi1lZGl0YWJsZSBtb2RlICh0aGUgZGVmYXVsdCksIGV2ZW50cyBhcmUgcGFzc2VkIHRvIHRoZSBIVE1MIGNvbnRlbnQgd2hlbiB0aGUgcG9pbnRlciBpcyBvdmVyIHRoZSBtYXNrIChhbmQgbm90IG9jY2x1ZGVkIGJ5IG90aGVyIG1lc2hlc1xyXG4gKiBpbiB0aGUgc2NlbmUpLlxyXG4gKiBAc2VlIGh0dHBzOi8vcGxheWdyb3VuZC5iYWJ5bG9uanMuY29tLyNIVkhZSkMjNVxyXG4gKiBAc2VlIGh0dHBzOi8vcGxheWdyb3VuZC5iYWJ5bG9uanMuY29tLyNCMTdUQzcjMTEyXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgSHRtbE1lc2ggZXh0ZW5kcyBNZXNoIHtcclxuICAgIC8qKlxyXG4gICAgICogSGVscHMgaWRlbnRpZnlpbmcgYSBodG1sIG1lc2ggZnJvbSBhIHJlZ3VsYXIgbWVzaFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGlzSHRtbE1lc2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT3ZlcnJpZGUgdGhlIHN1cGVyIGNsYXNzJ3MgX2lzRW5hYmxlZCBwcm9wZXJ0eSBzbyB3ZSBjYW4gY29udHJvbCB3aGVuIHRoZSBtZXNoXHJcbiAgICAvLyBpcyBlbmFibGVkLiAgSS5lLiwgd2UgZG9uJ3Qgd2FudCB0byByZW5kZXIgdGhlIG1lc2ggdW50aWwgdGhlcmUgaXMgY29udGVudCB0byBzaG93LlxyXG4gICAgcHJpdmF0ZSBfZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIFRoZSBtZXNoIGlzIHJlYWR5IHdoZW4gY29udGVudCBoYXMgYmVlbiBzZXQgYW5kIHRoZSBjb250ZW50IHNpemUgaGFzIGJlZW4gc2V0XHJcbiAgICAvLyBUaGUgZm9ybWVyIGlzIGRvbmUgYnkgdGhlIHVzZXIsIHRoZSBsYXR0ZXIgaXMgZG9uZSBieSB0aGUgcmVuZGVyZXIuXHJcbiAgICBwcml2YXRlIF9yZWFkeSA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBfaXNDYW52YXNPdmVybGF5ID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVxdWlyZXNVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgIHByaXZhdGUgX2VsZW1lbnQ/OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX3dpZHRoPzogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfaGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICAgIHByaXZhdGUgX2ludmVyc2VTY2FsZU1hdHJpeDogTWF0cml4IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSBfY2FwdHVyZU9uUG9pbnRlckVudGVyOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvcjogUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHByaXZhdGUgX3NvdXJjZVdpZHRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX3NvdXJjZUhlaWdodDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIHNvdXJjZSB3aWR0aCBvZiB0aGUgY29udGVudCBpbiBwaXhlbHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBzb3VyY2VXaWR0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlV2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gdGhlIHNvdXJjZSBoZWlnaHQgb2YgdGhlIGNvbnRlbnQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc291cmNlSGVpZ2h0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfd29ybGRNYXRyaXhVcGRhdGVPYnNlcnZlcjogYW55O1xyXG5cclxuICAgIHByaXZhdGUgX2ZpdFN0cmF0ZWd5OiBGaXRTdHJhdGVneVR5cGUgPSBGaXRTdHJhdGVneS5OT05FO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgSHRtbE1lc2hcclxuICAgICAqIEBwYXJhbSBzY2VuZVxyXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgbWVzaC4gIFdpbGwgYmUgdXNlZCBhcyB0aGUgaWQgb2YgdGhlIEhUTUwgZWxlbWVudCBhcyB3ZWxsLlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgb2JqZWN0IHdpdGggb3B0aW9uYWwgcGFyYW1ldGVyc1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihzY2VuZTogU2NlbmUsIGlkOiBzdHJpbmcsIHsgY2FwdHVyZU9uUG9pbnRlckVudGVyID0gdHJ1ZSwgaXNDYW52YXNPdmVybGF5ID0gZmFsc2UsIGZpdFN0cmF0ZWd5ID0gRml0U3RyYXRlZ3kuTk9ORSB9ID0ge30pIHtcclxuICAgICAgICBzdXBlcihpZCwgc2NlbmUpO1xyXG5cclxuICAgICAgICAvLyBSZXF1aXJlcyBhIGJyb3dzZXIgdG8gd29yay4gIEJhaWwgaWYgd2UgYXJlbid0IHJ1bm5pbmcgaW4gYSBicm93c2VyXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICBMb2dnZXIuV2FybihgQ3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgYW4gSHRtbE1lc2ggd2l0aCBpZCAke2lkfSBvdXRzaWRlIG9mIGEgYnJvd3Nlci4gIFRoZSBtZXNoIHdpbGwgbm90IGJlIHZpc2libGUuYCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2ZpdFN0cmF0ZWd5ID0gZml0U3RyYXRlZ3k7XHJcbiAgICAgICAgdGhpcy5faXNDYW52YXNPdmVybGF5ID0gaXNDYW52YXNPdmVybGF5O1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZU1hc2soKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gdGhpcy5fY3JlYXRlRWxlbWVudCgpO1xyXG5cclxuICAgICAgICAvLyBTZXQgZW5hYmxlZCBieSBkZWZhdWx0LCBzbyB0aGlzIHdpbGwgc2hvdyBhcyBzb29uIGFzIGl0J3MgcmVhZHlcclxuICAgICAgICB0aGlzLnNldEVuYWJsZWQodHJ1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlciA9IGNhcHR1cmVPblBvaW50ZXJFbnRlcjtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgYmVoYXZpb3IgdG8gY2FwdHVyZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgICAgIHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvciA9IG5ldyBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yKHRoaXMuY2FwdHVyZVBvaW50ZXJFdmVudHMuYmluZCh0aGlzKSwgdGhpcy5yZWxlYXNlUG9pbnRlckV2ZW50cy5iaW5kKHRoaXMpLCB7XHJcbiAgICAgICAgICAgIGNhcHR1cmVPblBvaW50ZXJFbnRlcjogdGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuYWRkQmVoYXZpb3IodGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgY29udGVudCBpbiBwaXhlbHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCB3aWR0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBjb250ZW50IGluIHBpeGVsc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIEhUTUwgZWxlbWVudCB0aGF0IGlzIGJlaW5nIHJlbmRlcmVkIGFzIGEgbWVzaFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcnVlIGlmIHRoZSBtZXNoIGhhcyBiZWVuIG1vdmVkLCByb3RhdGVkLCBvciBzY2FsZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzXHJcbiAgICAgKiBwcm9wZXJ0eSB3YXMgcmVhZC4gIFRoaXMgcHJvcGVydHkgaXMgcmVzZXQgdG8gZmFsc2UgYWZ0ZXIgcmVhZGluZy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCByZXF1aXJlc1VwZGF0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWlyZXNVcGRhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGUgY2FwdHVyZSBmb3IgdGhlIHBvaW50ZXIgd2hlbiBlbnRlcmluZyB0aGUgbWVzaCBhcmVhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXQgY2FwdHVyZU9uUG9pbnRlckVudGVyKGNhcHR1cmVPblBvaW50ZXJFbnRlcjogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlciA9IGNhcHR1cmVPblBvaW50ZXJFbnRlcjtcclxuICAgICAgICBpZiAodGhpcy5fcG9pbnRlckV2ZW50Q2FwdHVyZUJlaGF2aW9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvci5jYXB0dXJlT25Qb2ludGVyRW50ZXIgPSBjYXB0dXJlT25Qb2ludGVyRW50ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzcG9zZXMgb2YgdGhlIG1lc2ggYW5kIHRoZSBIVE1MIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIGRpc3Bvc2UoKSB7XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQ/LnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvaW50ZXJFdmVudENhcHR1cmVCZWhhdmlvcikge1xyXG4gICAgICAgICAgICB0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb2ludGVyRXZlbnRDYXB0dXJlQmVoYXZpb3IgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgX21hcmtBc1VwZGF0ZWQoKSB7XHJcbiAgICAgICAgdGhpcy5fcmVxdWlyZXNVcGRhdGUgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBjb250ZW50IGFkanVzdGluZyB0aGUgbWVzaCBzY2FsZSB0byBtYXRjaCBhbmQgbWFraW5nIGl0IHZpc2libGUuXHJcbiAgICAgKiBJZiB0aGUgdGhlIHNwZWNpZmllZCBjb250ZW50IGlzIHVuZGVmaW5lZCwgdGhlbiBpdCB3aWxsIG1ha2UgdGhlIG1lc2ggaW52aXNpYmxlLiAgSW4gZWl0aGVyIGNhc2UgaXQgd2lsbCBjbGVhciB0aGVcclxuICAgICAqIGVsZW1lbnQgY29udGVudCBmaXJzdC5cclxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHJlbmRlciBhcyBhIG1lc2hcclxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIG1lc2ggaW4gQmFieWxvbiB1bml0c1xyXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBtZXNoIGluIEJhYnlsb24gdW5pdHNcclxuICAgICAqL1xyXG4gICAgc2V0Q29udGVudChlbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICAvLyBJZiBjb250ZW50IGlzIGNoYW5nZWQsIHdlIGFyZSBubyBsb25nZXIgcmVhZHlcclxuICAgICAgICB0aGlzLl9zZXRBc1JlYWR5KGZhbHNlKTtcclxuXHJcbiAgICAgICAgLy8gQWxzbyBpbnZhbGlkYXRlIHRoZSBzb3VyY2Ugd2lkdGggYW5kIGhlaWdodFxyXG4gICAgICAgIHRoaXMuX3NvdXJjZVdpZHRoID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zb3VyY2VIZWlnaHQgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgdGhpcy5fcmVxdWlyZXNVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLnNjYWxpbmcuc2V0QWxsKDEpO1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50IS5hcHBlbmRDaGlsZCh0aGlzLl9maXRTdHJhdGVneS53cmFwRWxlbWVudChlbGVtZW50KSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVTY2FsZUlmTmVjZXNzYXJ5KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zb3VyY2VXaWR0aCAmJiB0aGlzLnNvdXJjZUhlaWdodCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRBc1JlYWR5KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBPdmVyaWRlcyBCQUJZTE9OLk1lc2guc2V0RW5hYmxlZFxyXG4gICAgcHVibGljIG92ZXJyaWRlIHNldEVuYWJsZWQoZW5hYmxlZDogYm9vbGVhbikge1xyXG4gICAgICAgIC8vIENhcHR1cmUgcmVxdWVzdGVkIGVuYWJsZWQgc3RhdGVcclxuICAgICAgICB0aGlzLl9lbmFibGVkID0gZW5hYmxlZDtcclxuXHJcbiAgICAgICAgLy8gSWYgZGlzYWJsaW5nIG9yIGVuYWJsaW5nIGFuZCB3ZSBhcmUgcmVhZHlcclxuICAgICAgICBpZiAoIWVuYWJsZWQgfHwgdGhpcy5fcmVhZHkpIHtcclxuICAgICAgICAgICAgdGhpcy5fZG9TZXRFbmFibGVkKGVuYWJsZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbnRlbnQgc2l6ZSBpbiBwaXhlbHNcclxuICAgICAqIEBwYXJhbSB3aWR0aCB3aWR0aCBvZiB0aGUgc291cmNlXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IGhlaWdodCBvZiB0aGUgc291cmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRDb250ZW50U2l6ZVB4KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fc291cmNlV2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9zb3VyY2VIZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudCB8fCAhdGhpcy5fZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9maXRTdHJhdGVneS51cGRhdGVTaXplKHRoaXMuX2VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQhIGFzIEhUTUxFbGVtZW50LCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgdGhpcy5fdXBkYXRlU2NhbGVJZk5lY2Vzc2FyeSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy53aWR0aCAmJiB0aGlzLmhlaWdodCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRBc1JlYWR5KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NldEFzUmVhZHkocmVhZHk6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9yZWFkeSA9IHJlYWR5O1xyXG4gICAgICAgIGlmIChyZWFkeSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kb1NldEVuYWJsZWQodGhpcy5fZW5hYmxlZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZG9TZXRFbmFibGVkKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kb1NldEVuYWJsZWQoZW5hYmxlZDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICghdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2lmIGVuYWJsZWQsIHRoZW4gc3RhcnQgbGlzdGVuaW5nIGZvciBjaGFuZ2VzIHRvIHRoZVxyXG4gICAgICAgIC8vIHNjYWxpbmcsIHJvdGF0aW9uLCBhbmQgcG9zaXRpb24uICBvdGhlcndpc2Ugc3RvcCBsaXN0ZW5pbmdcclxuICAgICAgICBpZiAoZW5hYmxlZCAmJiAhdGhpcy5fd29ybGRNYXRyaXhVcGRhdGVPYnNlcnZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl93b3JsZE1hdHJpeFVwZGF0ZU9ic2VydmVyID0gdGhpcy5vbkFmdGVyV29ybGRNYXRyaXhVcGRhdGVPYnNlcnZhYmxlLmFkZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXF1aXJlc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ybGRNYXRyaXhVcGRhdGVPYnNlcnZlcj8ucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmxkTWF0cml4VXBkYXRlT2JzZXJ2ZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgZW5hYmxlZCwgdGhlbiByZXZlcnQgdGhlIGNvbnRlbnQgZWxlbWVudCBkaXNwbGF5XHJcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGhpZGUgaXRcclxuICAgICAgICB0aGlzLl9lbGVtZW50IS5zdHlsZS5kaXNwbGF5ID0gZW5hYmxlZCA/IFwiXCIgOiBcIm5vbmVcIjtcclxuICAgICAgICAvLyBDYXB0dXJlIHRoZSBjb250ZW50IHogaW5kZXhcclxuICAgICAgICB0aGlzLl9zZXRFbGVtZW50WkluZGV4KHRoaXMucG9zaXRpb24ueiAqIC0xMDAwMCk7XHJcbiAgICAgICAgc3VwZXIuc2V0RW5hYmxlZChlbmFibGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3VwZGF0ZVNjYWxlSWZOZWNlc3NhcnkoKSB7XHJcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBzZXRDb250ZW50IGJlZm9yZSwgdGhlIGNvbnRlbnQgc2NhbGUgaXMgYmFrZWQgaW50byB0aGUgbWVzaC4gIElmIHdlIGRvbid0IHJlc2V0IHRoZSB2ZXJ0aWNlcyB0b1xyXG4gICAgICAgIC8vIHRoZSBvcmlnaW5hbCBzaXplLCB0aGVuIHdlIHdpbGwgbXVsdGlwbHkgdGhlIHNjYWxlIHdoZW4gd2UgYmFrZSB0aGUgc2NhbGUgYmVsb3cuICBCeSBhcHBseWluZyB0aGUgaW52ZXJzZSwgd2UgYmFjayBvdXRcclxuICAgICAgICAvLyB0aGUgc2NhbGluZyB0aGF0IGhhcyBiZWVuIGRvbmUgc28gd2UgYXJlIHN0YXJ0aW5nIGZyb20gdGhlIHNhbWUgcG9pbnQuXHJcbiAgICAgICAgLy8gRmlyc3QgcmVzZXQgdGhlIHNjYWxlIHRvIDFcclxuICAgICAgICB0aGlzLnNjYWxpbmcuc2V0QWxsKDEpO1xyXG4gICAgICAgIC8vIFRoZW4gYmFjayBvdXQgdGhlIG9yaWdpbmFsIHZlcnRpY2VzIGNoYW5nZXMgdG8gbWF0Y2ggdGhlIGNvbnRlbnQgc2NhbGVcclxuICAgICAgICBpZiAodGhpcy5faW52ZXJzZVNjYWxlTWF0cml4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFrZVRyYW5zZm9ybUludG9WZXJ0aWNlcyh0aGlzLl9pbnZlcnNlU2NhbGVNYXRyaXgpO1xyXG4gICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIG1hdHJpeCBzbyBpdCBkb2Vzbid0IGdldCBhcHBsaWVkIGFnYWluIHVubGVzcyB3ZSBzY2FsZVxyXG4gICAgICAgICAgICB0aGlzLl9pbnZlcnNlU2NhbGVNYXRyaXggPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2V0IHNjYWxlIHRvIG1hdGNoIGNvbnRlbnQuICBOb3RlIHdlIGNhbid0IGp1c3Qgc2NhbGUgdGhlIG1lc2gsIGJlY2F1c2UgdGhhdCB3aWxsIHNjYWxlIHRoZSBjb250ZW50IGFzIHdlbGxcclxuICAgICAgICAvLyBXaGF0IHdlIG5lZWQgdG8gZG8gaXMgY29tcHV0ZSBhIHNjYWxlIG1hdHJpeCBhbmQgdGhlbiBiYWtlIHRoYXQgaW50byB0aGUgbWVzaCB2ZXJ0aWNlcy4gIFRoaXMgd2lsbCBsZWF2ZSB0aGVcclxuICAgICAgICAvLyBtZXNoIHNjYWxlIGF0IDEsIHNvIG91ciBjb250ZW50IHdpbGwgc3RheSBpdCdzIG9yaWdpbmFsIHdpZHRoIGFuZCBoZWlnaHQgdW50aWwgd2Ugc2NhbGUgdGhlIG1lc2guXHJcbiAgICAgICAgY29uc3Qgc2NhbGVYID0gdGhpcy5fd2lkdGggfHwgMTtcclxuICAgICAgICBjb25zdCBzY2FsZVkgPSB0aGlzLl9oZWlnaHQgfHwgMTtcclxuICAgICAgICBjb25zdCBzY2FsZU1hdHJpeCA9IE1hdHJpeC5TY2FsaW5nKHNjYWxlWCwgc2NhbGVZLCAxKTtcclxuICAgICAgICB0aGlzLmJha2VUcmFuc2Zvcm1JbnRvVmVydGljZXMoc2NhbGVNYXRyaXgpO1xyXG5cclxuICAgICAgICAvLyBHZXQgYW4gaW52ZXJzZSBvZiB0aGUgc2NhbGUgbWF0cml4IHRoYXQgd2UgY2FuIHVzZSB0byBiYWNrIG91dCB0aGUgc2NhbGUgY2hhbmdlcyB3ZSBoYXZlIG1hZGUgc29cclxuICAgICAgICAvLyB3ZSBkb24ndCBtdWx0aXBseSB0aGUgc2NhbGUuXHJcbiAgICAgICAgdGhpcy5faW52ZXJzZVNjYWxlTWF0cml4ID0gbmV3IE1hdHJpeCgpO1xyXG4gICAgICAgIHNjYWxlTWF0cml4LmludmVydFRvUmVmKHRoaXMuX2ludmVyc2VTY2FsZU1hdHJpeCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9jcmVhdGVNYXNrKCkge1xyXG4gICAgICAgIGNvbnN0IHZlcnRleERhdGEgPSBDcmVhdGVQbGFuZVZlcnRleERhdGEoeyB3aWR0aDogMSwgaGVpZ2h0OiAxIH0pO1xyXG4gICAgICAgIHZlcnRleERhdGEuYXBwbHlUb01lc2godGhpcyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNjZW5lID0gdGhpcy5nZXRTY2VuZSgpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tDb2xsaXNpb25zID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgZGVwdGhNYXNrID0gbmV3IFN0YW5kYXJkTWF0ZXJpYWwoYCR7dGhpcy5pZH0tbWF0YCwgc2NlbmUpO1xyXG4gICAgICAgIGlmICghdGhpcy5faXNDYW52YXNPdmVybGF5KSB7XHJcbiAgICAgICAgICAgIGRlcHRoTWFzay5iYWNrRmFjZUN1bGxpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgZGVwdGhNYXNrLmRpc2FibGVDb2xvcldyaXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgZGVwdGhNYXNrLmRpc2FibGVMaWdodGluZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1hdGVyaWFsID0gZGVwdGhNYXNrO1xyXG5cclxuICAgICAgICAvLyBPcHRpbWl6YXRpb24gLSBGcmVlemUgbWF0ZXJpYWwgc2luY2UgaXQgbmV2ZXIgbmVlZHMgdG8gY2hhbmdlXHJcbiAgICAgICAgdGhpcy5tYXRlcmlhbC5mcmVlemUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NldEVsZW1lbnRaSW5kZXgoekluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50IS5zdHlsZS56SW5kZXggPSBgJHt6SW5kZXh9YDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB1c2VkIGJ5IHRoZSBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIHRvIGNhcHR1cmUgcG9pbnRlciBldmVudHNcclxuICAgICAqL1xyXG4gICAgY2FwdHVyZVBvaW50ZXJFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEVuYWJsZSBkb20gY29udGVudCB0byBjYXB0dXJlIHBvaW50ZXIgZXZlbnRzXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJhdXRvXCI7XHJcblxyXG4gICAgICAgIC8vIFN1cHJlc3MgZXZlbnRzIG91dHNpZGUgb2YgdGhlIGRvbSBjb250ZW50XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpWzBdLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIHVzZWQgYnkgdGhlIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgdG8gcmVsZWFzZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgICovXHJcbiAgICByZWxlYXNlUG9pbnRlckV2ZW50cygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRW5hYmxlIHBvaW50ZXIgZXZlbnRzIG9uIGNhbnZhc1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXS5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJhdXRvXCI7XHJcblxyXG4gICAgICAgIC8vIERpc2FibGUgcG9pbnRlciBldmVudHMgb24gZG9tIGNvbnRlbnRcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2NyZWF0ZUVsZW1lbnQoKSB7XHJcbiAgICAgICAgLy8gUmVxdWlyZXMgYSBicm93c2VyIHRvIHdvcmsuICBCYWlsIGlmIHdlIGFyZW4ndCBydW5uaW5nIGluIGEgYnJvd3NlclxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGRpdi5pZCA9IHRoaXMuaWQ7XHJcbiAgICAgICAgZGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuX2lzQ2FudmFzT3ZlcmxheSA/IFwidHJhbnNwYXJlbnRcIiA6IFwiIzAwMFwiO1xyXG4gICAgICAgIGRpdi5zdHlsZS56SW5kZXggPSBcIjFcIjtcclxuICAgICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgZGl2LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgICAgICBkaXYuc3R5bGUuYmFja2ZhY2VWaXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRpdjtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgTWF0cml4LCBRdWF0ZXJuaW9uLCBWZWN0b3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aFwiO1xyXG5cclxuaW1wb3J0IHR5cGUgeyBIdG1sTWVzaCB9IGZyb20gXCIuL2h0bWxNZXNoXCI7XHJcbmltcG9ydCB7IENhbWVyYSB9IGZyb20gXCJjb3JlL0NhbWVyYXMvY2FtZXJhXCI7XHJcbmltcG9ydCB0eXBlIHsgU3ViTWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9zdWJNZXNoXCI7XHJcbmltcG9ydCB7IFJlbmRlcmluZ0dyb3VwIH0gZnJvbSBcImNvcmUvUmVuZGVyaW5nL3JlbmRlcmluZ0dyb3VwXCI7XHJcblxyXG5pbXBvcnQgdHlwZSB7IE9ic2VydmVyIH0gZnJvbSBcImNvcmUvTWlzYy9vYnNlcnZhYmxlXCI7XHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJjb3JlL01pc2MvbG9nZ2VyXCI7XHJcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RFbmdpbmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzXCI7XHJcblxyXG5jb25zdCBfcG9zaXRpb25VcGRhdGVGYWlsTWVzc2FnZSA9IFwiRmFpbGVkIHRvIHVwZGF0ZSBodG1sIG1lc2ggcmVuZGVyZXIgcG9zaXRpb24gZHVlIHRvIGZhaWx1cmUgdG8gZ2V0IGNhbnZhcyByZWN0LiAgSHRtbE1lc2ggaW5zdGFuY2VzIG1heSBub3QgcmVuZGVyIGNvcnJlY3RseVwiO1xyXG5jb25zdCBiYWJ5bG9uVW5pdHNUb1BpeGVscyA9IDEwMDtcclxuXHJcbi8qKlxyXG4gKiBBIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgdHdvIHN1Ym1lc2hlcyBhbmQgcmV0dXJucyBhIG51bWJlciBpbmRpY2F0aW5nIHdoaWNoXHJcbiAqIHNob3VsZCBiZSByZW5kZXJlZCBmaXJzdC5cclxuICovXHJcbnR5cGUgUmVuZGVyT3JkZXJGdW5jdGlvbiA9IChzdWJNZXNoQTogU3ViTWVzaCwgc3ViTWVzaEI6IFN1Yk1lc2gpID0+IG51bWJlcjtcclxuXHJcbnR5cGUgUmVuZGVyTGF5ZXJFbGVtZW50cyA9IHtcclxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgICBkb21FbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIGNhbWVyYUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG59O1xyXG5cclxuLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZW5zdXJlcyB0aGF0IEh0bWxNZXNoZXMgYXJlIHJlbmRlcmVkIGJlZm9yZSBhbGwgb3RoZXIgbWVzaGVzLlxyXG4vLyBOb3RlIHRoaXMgd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gZ3JvdXAgMC5cclxuLy8gSWYgbmVpdGhlciBtZXNoIGlzIGFuIEh0bWxNZXNoLCB0aGVuIHRoZSBkZWZhdWx0IHJlbmRlciBvcmRlciBpcyB1c2VkXHJcbi8vIFRoaXMgcHJldmVudHMgSHRtbE1lc2hlcyBmcm9tIGFwcGVhcmluZyBpbiBmcm9udCBvZiBvdGhlciBtZXNoZXMgd2hlbiB0aGV5IGFyZSBiZWhpbmQgdGhlbVxyXG5jb25zdCByZW5kZXJPcmRlckZ1bmMgPSAoZGVmYXVsdFJlbmRlck9yZGVyOiBSZW5kZXJPcmRlckZ1bmN0aW9uKTogUmVuZGVyT3JkZXJGdW5jdGlvbiA9PiB7XHJcbiAgICByZXR1cm4gKHN1Yk1lc2hBOiBTdWJNZXNoLCBzdWJNZXNoQjogU3ViTWVzaCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1lc2hBID0gc3ViTWVzaEEuZ2V0TWVzaCgpO1xyXG4gICAgICAgIGNvbnN0IG1lc2hCID0gc3ViTWVzaEIuZ2V0TWVzaCgpO1xyXG5cclxuICAgICAgICAvLyBVc2UgcHJvcGVydHkgY2hlY2sgaW5zdGVhZCBvZiBpbnN0YW5jZW9mIHNpbmNlIGl0IGlzIGxlc3MgZXhwZW5zaXZlIGFuZFxyXG4gICAgICAgIC8vIHRoaXMgd2lsbCBiZSBjYWxsZWQgbWFueSB0aW1lcyBwZXIgZnJhbWVcclxuICAgICAgICBjb25zdCBtZXNoQUlzSHRtbE1lc2ggPSAobWVzaEEgYXMgYW55KVtcImlzSHRtbE1lc2hcIl07XHJcbiAgICAgICAgY29uc3QgbWVzaEJJc0h0bWxNZXNoID0gKG1lc2hCIGFzIGFueSlbXCJpc0h0bWxNZXNoXCJdO1xyXG4gICAgICAgIGlmIChtZXNoQUlzSHRtbE1lc2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1lc2hCSXNIdG1sTWVzaCA/IChtZXNoQS5hYnNvbHV0ZVBvc2l0aW9uLnogPD0gbWVzaEIuYWJzb2x1dGVQb3NpdGlvbi56ID8gMSA6IC0xKSA6IC0xO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtZXNoQklzSHRtbE1lc2ggPyAxIDogZGVmYXVsdFJlbmRlck9yZGVyKHN1Yk1lc2hBLCBzdWJNZXNoQik7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGlzIHJlcXVpcmVkIHRvIHJlbmRlciBIdG1sTWVzaGVzIGluIHRoZSBzY2VuZS5cclxuICogaWYgdXNpbmcgSHRtbE1lc2hlcywgeW91IG11c3Qgbm90IHNldCByZW5kZXIgb3JkZXIgZm9yIGdyb3VwIDAgdXNpbmdcclxuICogc2NlbmUuc2V0UmVuZGVyaW5nT3JkZXIuICBZb3UgbXVzdCBpbnN0ZWFkIHBhc3MgdGhlIGNvbXBhcmUgZnVuY3Rpb25zXHJcbiAqIHRvIHRoZSBIdG1sTWVzaFJlbmRlcmVyIGNvbnN0cnVjdG9yLiAgSWYgeW91IGRvIG5vdCwgdGhlbiB5b3VyIHJlbmRlclxyXG4gKiBvcmRlciB3aWxsIGJlIG92ZXJ3cml0dGVuIGlmIHRoZSBIdG1sTWVzaFJlbmRlcmVyIGlzIGNyZWF0ZWQgYWZ0ZXIgYW5kXHJcbiAqIHRoZSBIdG1sTWVzaGVzIHdpbGwgbm90IHJlbmRlciBjb3JyZWN0bHkgKHRoZXkgd2lsbCBhcHBlYXIgaW4gZnJvbnQgb2ZcclxuICogbWVzaGVzIHRoYXQgYXJlIGFjdHVhbGx5IGluIGZyb250IG9mIHRoZW0pIGlmIHRoZSBIdG1sTWVzaFJlbmRlcmVyIGlzXHJcbiAqIGNyZWF0ZWQgYmVmb3JlLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEh0bWxNZXNoUmVuZGVyZXIge1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVySWQ/OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9pblNjZW5lRWxlbWVudHM/OiBSZW5kZXJMYXllckVsZW1lbnRzIHwgbnVsbDtcclxuICAgIHByaXZhdGUgX292ZXJsYXlFbGVtZW50cz86IFJlbmRlckxheWVyRWxlbWVudHMgfCBudWxsO1xyXG4gICAgcHJpdmF0ZSBfZW5naW5lOiBBYnN0cmFjdEVuZ2luZTtcclxuXHJcbiAgICBwcml2YXRlIF9jYWNoZSA9IHtcclxuICAgICAgICBjYW1lcmFEYXRhOiB7IGZvdjogMCwgcG9zaXRpb246IG5ldyBWZWN0b3IzKCksIHN0eWxlOiBcIlwiIH0sXHJcbiAgICAgICAgaHRtbE1lc2hEYXRhOiBuZXcgV2Vha01hcDxvYmplY3QsIHsgc3R5bGU6IHN0cmluZyB9PigpLFxyXG4gICAgfTtcclxuICAgIHByaXZhdGUgX3dpZHRoID0gMDtcclxuICAgIHByaXZhdGUgX2hlaWdodCA9IDA7XHJcbiAgICBwcml2YXRlIF9oZWlnaHRIYWxmID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9jYW1lcmFXb3JsZE1hdHJpeD86IE1hdHJpeDtcclxuXHJcbiAgICAvLyBDcmVhdGUgc29tZSByZWZzIHRvIGF2b2lkIGNyZWF0aW5nIG5ldyBvYmplY3RzIGV2ZXJ5IGZyYW1lXHJcbiAgICBwcml2YXRlIF90ZW1wID0ge1xyXG4gICAgICAgIHNjYWxlVHJhbnNmb3JtOiBuZXcgVmVjdG9yMygpLFxyXG4gICAgICAgIHJvdGF0aW9uVHJhbnNmb3JtOiBuZXcgUXVhdGVybmlvbigpLFxyXG4gICAgICAgIHBvc2l0aW9uVHJhbnNmb3JtOiBuZXcgVmVjdG9yMygpLFxyXG4gICAgICAgIG9iamVjdE1hdHJpeDogTWF0cml4LklkZW50aXR5KCksXHJcbiAgICAgICAgY2FtZXJhV29ybGRNYXRyaXg6IE1hdHJpeC5JZGVudGl0eSgpLFxyXG4gICAgICAgIGNhbWVyYVJvdGF0aW9uTWF0cml4OiBNYXRyaXguSWRlbnRpdHkoKSxcclxuICAgICAgICBjYW1lcmFXb3JsZE1hdHJpeEFzQXJyYXk6IG5ldyBBcnJheSgxNiksXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEtlZXAgdHJhY2sgb2YgRFBSIHNvIHdlIGNhbiByZXNpemUgaWYgRFBSIGNoYW5nZXNcclxuICAgIC8vIE90aGVyd2lzZSB0aGUgRE9NIGNvbnRlbnQgd2lsbCBzY2FsZSwgYnV0IHRoZSBtZXNoIHdvbid0XHJcbiAgICBwcml2YXRlIF9sYXN0RGV2aWNlUGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xyXG5cclxuICAgIC8vIEtlZXAgdHJhY2sgb2YgY2FtZXJhIG1hdHJpeCBjaGFuZ2VzIHNvIHdlIG9ubHkgdXBkYXRlIHRoZVxyXG4gICAgLy8gRE9NIGVsZW1lbnQgc3R5bGVzIHdoZW4gbmVjZXNzYXJ5XHJcbiAgICBwcml2YXRlIF9jYW1lcmFNYXRyaXhVcGRhdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBLZWVwIHRyYWNrIG9mIHBvc2l0aW9uIGNoYW5nZXMgc28gd2Ugb25seSB1cGRhdGUgdGhlIERPTSBlbGVtZW50XHJcbiAgICAvLyBzdHlsZXMgd2hlbiBuZWNlc3NhcnlcclxuICAgIHByaXZhdGUgX3ByZXZpb3VzQ2FudmFzRG9jdW1lbnRQb3NpdGlvbiA9IHtcclxuICAgICAgICB0b3A6IDAsXHJcbiAgICAgICAgbGVmdDogMCxcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVuZGVyT2JzZXJ2ZXI6IE9ic2VydmVyPFNjZW5lPiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgSHRtbE1lc2hSZW5kZXJlclxyXG4gICAgICogQHBhcmFtIHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHByb3BlcnRpZXM6XHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBzY2VuZTogU2NlbmUsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXJJZCA9IG51bGwsXHJcbiAgICAgICAgICAgIF9jb250YWluZXJJZCA9IFwiY3NzLWNvbnRhaW5lclwiLFxyXG4gICAgICAgICAgICBlbmFibGVPdmVybGF5UmVuZGVyID0gdHJ1ZSxcclxuICAgICAgICAgICAgZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyID0gUmVuZGVyaW5nR3JvdXAuUGFpbnRlclNvcnRDb21wYXJlLFxyXG4gICAgICAgICAgICBkZWZhdWx0QWxwaGFUZXN0UmVuZGVyT3JkZXIgPSBSZW5kZXJpbmdHcm91cC5QYWludGVyU29ydENvbXBhcmUsXHJcbiAgICAgICAgICAgIGRlZmF1bHRUcmFuc3BhcmVudFJlbmRlck9yZGVyID0gUmVuZGVyaW5nR3JvdXAuZGVmYXVsdFRyYW5zcGFyZW50U29ydENvbXBhcmUsXHJcbiAgICAgICAgfToge1xyXG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXJJZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICAgICAgICAgIF9jb250YWluZXJJZD86IHN0cmluZztcclxuICAgICAgICAgICAgZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyPzogUmVuZGVyT3JkZXJGdW5jdGlvbjtcclxuICAgICAgICAgICAgZGVmYXVsdEFscGhhVGVzdFJlbmRlck9yZGVyPzogUmVuZGVyT3JkZXJGdW5jdGlvbjtcclxuICAgICAgICAgICAgZGVmYXVsdFRyYW5zcGFyZW50UmVuZGVyT3JkZXI/OiBSZW5kZXJPcmRlckZ1bmN0aW9uO1xyXG4gICAgICAgICAgICBlbmFibGVPdmVybGF5UmVuZGVyPzogYm9vbGVhbjtcclxuICAgICAgICB9ID0ge31cclxuICAgICkge1xyXG4gICAgICAgIC8vIFJlcXVpcmVzIGEgYnJvd3NlciB0byB3b3JrLiAgT25seSBpbml0IGlmIHdlIGFyZSBpbiBhIGJyb3dzZXJcclxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVySWQgPSBfY29udGFpbmVySWQ7XHJcbiAgICAgICAgdGhpcy5faW5pdChzY2VuZSwgcGFyZW50Q29udGFpbmVySWQsIGVuYWJsZU92ZXJsYXlSZW5kZXIsIGRlZmF1bHRPcGFxdWVSZW5kZXJPcmRlciwgZGVmYXVsdEFscGhhVGVzdFJlbmRlck9yZGVyLCBkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNwb3NlIG9mIHRoZSBIdG1sTWVzaFJlbmRlcmVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJPYnNlcnZlcikge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJPYnNlcnZlci5yZW1vdmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyT2JzZXJ2ZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb3ZlcmxheUVsZW1lbnRzPy5jb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5fb3ZlcmxheUVsZW1lbnRzID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5jb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5faW5TY2VuZUVsZW1lbnRzID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2luaXQoXHJcbiAgICAgICAgc2NlbmU6IFNjZW5lLFxyXG4gICAgICAgIHBhcmVudENvbnRhaW5lcklkOiBzdHJpbmcgfCBudWxsLFxyXG4gICAgICAgIGVuYWJsZU92ZXJsYXlSZW5kZXI6IGJvb2xlYW4sXHJcbiAgICAgICAgZGVmYXVsdE9wYXF1ZVJlbmRlck9yZGVyOiBSZW5kZXJPcmRlckZ1bmN0aW9uLFxyXG4gICAgICAgIGRlZmF1bHRBbHBoYVRlc3RSZW5kZXJPcmRlcjogUmVuZGVyT3JkZXJGdW5jdGlvbixcclxuICAgICAgICBkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlcjogUmVuZGVyT3JkZXJGdW5jdGlvblxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVxdWlyZXMgYSBicm93c2VyIHRvIHdvcmsuICBPbmx5IGluaXQgaWYgd2UgYXJlIGluIGEgYnJvd3NlclxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBET00gY29udGFpbmVyc1xyXG4gICAgICAgIGxldCBwYXJlbnRDb250YWluZXIgPSBwYXJlbnRDb250YWluZXJJZCA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmVudENvbnRhaW5lcklkKSA6IGRvY3VtZW50LmJvZHk7XHJcblxyXG4gICAgICAgIGlmICghcGFyZW50Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHBhcmVudENvbnRhaW5lciA9IGRvY3VtZW50LmJvZHk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiB0aGUgY29udGFpbmVyIGFscmVhZHkgZXhpc3RzLCB0aGVuIHJlbW92ZSBpdFxyXG4gICAgICAgIGNvbnN0IGluU2NlbmVDb250YWluZXJJZCA9IGAke3RoaXMuX2NvbnRhaW5lcklkfV9pbl9zY2VuZWA7XHJcbiAgICAgICAgdGhpcy5faW5TY2VuZUVsZW1lbnRzID0gdGhpcy5fY3JlYXRlUmVuZGVyTGF5ZXJFbGVtZW50cyhpblNjZW5lQ29udGFpbmVySWQpO1xyXG5cclxuICAgICAgICBwYXJlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuX2luU2NlbmVFbGVtZW50cy5jb250YWluZXIsIHBhcmVudENvbnRhaW5lci5maXJzdENoaWxkKTtcclxuXHJcbiAgICAgICAgaWYgKGVuYWJsZU92ZXJsYXlSZW5kZXIpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUNvbnRhaW5lcklkID0gYCR7dGhpcy5fY29udGFpbmVySWR9X292ZXJsYXlgO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHMgPSB0aGlzLl9jcmVhdGVSZW5kZXJMYXllckVsZW1lbnRzKG92ZXJsYXlDb250YWluZXJJZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHpJbmRleCA9ICsoc2NlbmUuZ2V0RW5naW5lKCkuZ2V0UmVuZGVyaW5nQ2FudmFzKCkhLnN0eWxlLnpJbmRleCA/PyBcIjBcIikgKyAxO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHMuY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IGAke3pJbmRleH1gO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5RWxlbWVudHMuY29udGFpbmVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyLmluc2VydEJlZm9yZSh0aGlzLl9vdmVybGF5RWxlbWVudHMuY29udGFpbmVyLCBwYXJlbnRDb250YWluZXIuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2VuZ2luZSA9IHNjZW5lLmdldEVuZ2luZSgpO1xyXG4gICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSB0aGlzLl9lbmdpbmUuZ2V0UmVuZGVyaW5nQ2FudmFzQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGlmICghY2xpZW50UmVjdCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZ2V0IGNsaWVudCByZWN0IGZvciByZW5kZXJpbmcgY2FudmFzXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSBzaXplIGFuZCByZXNpemUgYmVoYXZpb3JcclxuICAgICAgICB0aGlzLl9zZXRTaXplKGNsaWVudFJlY3Qud2lkdGgsIGNsaWVudFJlY3QuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZW5naW5lLm9uUmVzaXplT2JzZXJ2YWJsZS5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjbGllbnRSZWN0ID0gdGhpcy5fZW5naW5lLmdldFJlbmRlcmluZ0NhbnZhc0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgaWYgKGNsaWVudFJlY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldFNpemUoY2xpZW50UmVjdC53aWR0aCwgY2xpZW50UmVjdC5oZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBwcm9qZWN0aW9uT2JzOiBPYnNlcnZlcjxDYW1lcmE+O1xyXG4gICAgICAgIGxldCBtYXRyaXhPYnM6IE9ic2VydmVyPENhbWVyYT47XHJcblxyXG4gICAgICAgIGNvbnN0IG9ic2VydmVDYW1lcmEgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbWVyYSA9IHNjZW5lLmFjdGl2ZUNhbWVyYTtcclxuICAgICAgICAgICAgaWYgKGNhbWVyYSkge1xyXG4gICAgICAgICAgICAgICAgcHJvamVjdGlvbk9icyA9IGNhbWVyYS5vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkT2JzZXJ2YWJsZS5hZGQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2FtZXJhTWF0cml4Q2hhbmdlZChjYW1lcmEpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBtYXRyaXhPYnMgPSBjYW1lcmEub25WaWV3TWF0cml4Q2hhbmdlZE9ic2VydmFibGUuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNhbWVyYU1hdHJpeENoYW5nZWQoY2FtZXJhKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgb2JzZXJ2ZUNhbWVyYSgpO1xyXG5cclxuICAgICAgICBzY2VuZS5vbkFjdGl2ZUNhbWVyYUNoYW5nZWQuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHByb2plY3Rpb25PYnMpIHtcclxuICAgICAgICAgICAgICAgIHNjZW5lLmFjdGl2ZUNhbWVyYT8ub25Qcm9qZWN0aW9uTWF0cml4Q2hhbmdlZE9ic2VydmFibGUucmVtb3ZlKHByb2plY3Rpb25PYnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChtYXRyaXhPYnMpIHtcclxuICAgICAgICAgICAgICAgIHNjZW5lLmFjdGl2ZUNhbWVyYT8ub25WaWV3TWF0cml4Q2hhbmdlZE9ic2VydmFibGUucmVtb3ZlKG1hdHJpeE9icyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb2JzZXJ2ZUNhbWVyYSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IEh0bWxNZXNoZXMgYXJlIHJlbmRlcmVkIGJlZm9yZSBhbGwgb3RoZXIgbWVzaGVzXHJcbiAgICAgICAgLy8gc28gdGhhdCB0aGV5IGRvbid0IGFwcGVhciBpbiBmcm9udCBvZiBtZXNoZXMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gZnJvbnQgb2YgdGhlbVxyXG4gICAgICAgIC8vIFVwZGF0aW5nIHRoZSByZW5kZXIgb3JkZXIgaXNuJ3QgaWRlYWwsIGJ1dCBpdCBpcyB0aGUgb25seSB3YXkgdG8gYWNoZWl2ZSB0aGlzXHJcbiAgICAgICAgLy8gVGhlIGltcGxpY2F0aW9uIGlzIHRoYXQgYW4gYXBwIHVzaW5nIHRoZSBIdG1sTWVzaFJlbmRlcmVkIG11c3Qgc2V0IHRoZSBzY2VuZSByZW5kZXIgb3JkZXJcclxuICAgICAgICAvLyB2aWEgdGhlIEh0bWxNZXNoUmVuZGVyZWQgY29uc3RydWN0b3JcclxuICAgICAgICBjb25zdCBvcGFxdWVSZW5kZXJPcmRlciA9IHJlbmRlck9yZGVyRnVuYyhkZWZhdWx0T3BhcXVlUmVuZGVyT3JkZXIpO1xyXG4gICAgICAgIGNvbnN0IGFscGhhVGVzdFJlbmRlck9yZGVyID0gcmVuZGVyT3JkZXJGdW5jKGRlZmF1bHRBbHBoYVRlc3RSZW5kZXJPcmRlcik7XHJcbiAgICAgICAgY29uc3QgdHJhbnNwYXJlbnRSZW5kZXJPcmRlciA9IHJlbmRlck9yZGVyRnVuYyhkZWZhdWx0VHJhbnNwYXJlbnRSZW5kZXJPcmRlcik7XHJcbiAgICAgICAgc2NlbmUuc2V0UmVuZGVyaW5nT3JkZXIoMCwgb3BhcXVlUmVuZGVyT3JkZXIsIGFscGhhVGVzdFJlbmRlck9yZGVyLCB0cmFuc3BhcmVudFJlbmRlck9yZGVyKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVuZGVyT2JzZXJ2ZXIgPSBzY2VuZS5vbkJlZm9yZVJlbmRlck9ic2VydmFibGUuYWRkKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyKHNjZW5lLCBzY2VuZS5hY3RpdmVDYW1lcmEgYXMgQ2FtZXJhKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jcmVhdGVSZW5kZXJMYXllckVsZW1lbnRzKGNvbnRhaW5lcklkOiBzdHJpbmcpOiBSZW5kZXJMYXllckVsZW1lbnRzIHtcclxuICAgICAgICBjb25zdCBleGlzdGluZ0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRhaW5lcklkKTtcclxuICAgICAgICBpZiAoZXhpc3RpbmdDb250YWluZXIpIHtcclxuICAgICAgICAgICAgZXhpc3RpbmdDb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgY29udGFpbmVyLmlkID0gY29udGFpbmVySWQ7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBcIjEwMCVcIjtcclxuICAgICAgICBjb250YWluZXIuc3R5bGUuekluZGV4ID0gXCItMVwiO1xyXG5cclxuICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBkb21FbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcclxuXHJcbiAgICAgICAgY29uc3QgY2FtZXJhRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGNhbWVyYUVsZW1lbnQuc3R5bGUud2Via2l0VHJhbnNmb3JtU3R5bGUgPSBcInByZXNlcnZlLTNkXCI7XHJcbiAgICAgICAgY2FtZXJhRWxlbWVudC5zdHlsZS50cmFuc2Zvcm1TdHlsZSA9IFwicHJlc2VydmUtM2RcIjtcclxuXHJcbiAgICAgICAgY2FtZXJhRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XHJcblxyXG4gICAgICAgIGRvbUVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FtZXJhRWxlbWVudCk7XHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRvbUVsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcixcclxuICAgICAgICAgICAgZG9tRWxlbWVudCxcclxuICAgICAgICAgICAgY2FtZXJhRWxlbWVudCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZ2V0U2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLl93aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9oZWlnaHQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcclxuICAgICAgICB0aGlzLl9oZWlnaHRIYWxmID0gdGhpcy5faGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pblNjZW5lRWxlbWVudHMgfHwgIXRoaXMuX292ZXJsYXlFbGVtZW50cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkb21FbGVtZW50cyA9IFt0aGlzLl9pblNjZW5lRWxlbWVudHMhLmRvbUVsZW1lbnQsIHRoaXMuX292ZXJsYXlFbGVtZW50cyEuZG9tRWxlbWVudCwgdGhpcy5faW5TY2VuZUVsZW1lbnRzIS5jYW1lcmFFbGVtZW50LCB0aGlzLl9vdmVybGF5RWxlbWVudHMhLmNhbWVyYUVsZW1lbnRdO1xyXG4gICAgICAgIGZvciAoY29uc3QgZG9tIG9mIGRvbUVsZW1lbnRzKSB7XHJcbiAgICAgICAgICAgIGlmIChkb20pIHtcclxuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcclxuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxyXG4gICAgcHJvdGVjdGVkIF9nZXRDYW1lcmFDU1NNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gbWF0cml4Lm07XHJcbiAgICAgICAgcmV0dXJuIGBtYXRyaXgzZCgke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1swXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzFdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzJdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzNdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzRdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbNV0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbNl0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbN10gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbOF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1s5XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxMF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTFdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzEyXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCAtIGVsZW1lbnRzWzEzXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxNF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTVdIClcclxuICAgICAgICB9KWA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29udmVydCBhIEJhYnlsb24gd29ybGQgbWF0cml4IHRvIGEgQ1NTIG1hdHJpeFxyXG4gICAgLy8gVGhpcyBhbHNvIGhhbmRsZXMgY29udmVyc2lvbiBmcm9tIEJKUyBsZWZ0IGhhbmRlZCBjb29yZHNcclxuICAgIC8vIHRvIENTUyByaWdodCBoYW5kZWQgY29vcmRzXHJcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcclxuICAgIHByb3RlY3RlZCBfZ2V0SHRtbENvbnRlbnRDU1NNYXRyaXgobWF0cml4OiBNYXRyaXgsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IG1hdHJpeC5tO1xyXG4gICAgICAgIC8vIEluIGEgcmlnaHQgaGFuZGVkIGNvb3JkaW5hdGUgc3lzdGVtLCB0aGUgZWxlbWVudHMgMTEgdG8gMTQgaGF2ZSB0byBjaGFuZ2UgdGhlaXIgZGlyZWN0aW9uXHJcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdXNlUmlnaHRIYW5kZWRTeXN0ZW0gPyAtMSA6IDE7XHJcbiAgICAgICAgY29uc3QgbWF0cml4M2QgPSBgbWF0cml4M2QoJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMV0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMl0gKiAtZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzNdIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIC0gZWxlbWVudHNbNF0gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1s1XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s2XSAgKiBkaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggLSBlbGVtZW50c1s3XSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1s4XSAqIC1kaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbOV0gKiAtZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzEwXSApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxMV0gKiBkaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTJdICogZGlyZWN0aW9uIClcclxuICAgICAgICB9LCR7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vwc2lsb24oIGVsZW1lbnRzWzEzXSAqIGRpcmVjdGlvbiApXHJcbiAgICAgICAgfSwke1xyXG4gICAgICAgICAgICB0aGlzLl9lcHNpbG9uKCBlbGVtZW50c1sxNF0gKiBkaXJlY3Rpb24gKVxyXG4gICAgICAgIH0sJHtcclxuICAgICAgICAgICAgdGhpcy5fZXBzaWxvbiggZWxlbWVudHNbMTVdIClcclxuICAgICAgICB9KWA7XHJcbiAgICAgICAgcmV0dXJuIG1hdHJpeDNkO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZ2V0VHJhbnNmb3JtYXRpb25NYXRyaXgoaHRtbE1lc2g6IEh0bWxNZXNoLCB1c2VSaWdodEhhbmRlZFN5c3RlbTogYm9vbGVhbik6IE1hdHJpeCB7XHJcbiAgICAgICAgLy8gR2V0IHRoZSBjYW1lcmEgd29ybGQgbWF0cml4XHJcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjYW1lcmEgd29ybGQgbWF0cml4IGlzIHVwIHRvIGRhdGVcclxuICAgICAgICBpZiAoIXRoaXMuX2NhbWVyYVdvcmxkTWF0cml4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhbWVyYVdvcmxkTWF0cml4ID0gaHRtbE1lc2guZ2V0U2NlbmUoKS5hY3RpdmVDYW1lcmE/LmdldFdvcmxkTWF0cml4KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5fY2FtZXJhV29ybGRNYXRyaXgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdHJpeC5JZGVudGl0eSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgb2JqZWN0V29ybGRNYXRyaXggPSBodG1sTWVzaC5nZXRXb3JsZE1hdHJpeCgpO1xyXG5cclxuICAgICAgICAvLyBTY2FsZSB0aGUgb2JqZWN0IG1hdHJpeCBieSB0aGUgYmFzZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSBtZXNoXHJcbiAgICAgICAgLy8gd2hpY2ggaXMgdGhlIHJhdGlvIG9mIHRoZSBtZXNoIHdpZHRoL2hlaWdodCB0byB0aGUgcmVuZGVyZXJcclxuICAgICAgICAvLyB3aWR0aC9oZWlnaHQgZGl2aWRlZCBieSB0aGUgYmFieWxvbiB1bml0cyB0byBwaXhlbHMgcmF0aW9cclxuICAgICAgICBsZXQgd2lkdGhTY2FsZUZhY3RvciA9IDE7XHJcbiAgICAgICAgbGV0IGhlaWdodFNjYWxlRmFjdG9yID0gMTtcclxuICAgICAgICBpZiAoaHRtbE1lc2guc291cmNlV2lkdGggJiYgaHRtbE1lc2guc291cmNlSGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHdpZHRoU2NhbGVGYWN0b3IgPSBodG1sTWVzaC53aWR0aCEgLyAoaHRtbE1lc2guc291cmNlV2lkdGggLyBiYWJ5bG9uVW5pdHNUb1BpeGVscyk7XHJcbiAgICAgICAgICAgIGhlaWdodFNjYWxlRmFjdG9yID0gaHRtbE1lc2guaGVpZ2h0ISAvIChodG1sTWVzaC5zb3VyY2VIZWlnaHQgLyBiYWJ5bG9uVW5pdHNUb1BpeGVscyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBcHBseSB0aGUgc2NhbGUgdG8gdGhlIG9iamVjdCdzIHdvcmxkIG1hdHJpeC4gIE5vdGUgd2UgYXJlbid0IHNjYWxpbmdcclxuICAgICAgICAvLyB0aGUgb2JqZWN0LCBqdXN0IGdldHRpbmcgYSBtYXRyaXggYXMgdGhvdWdoIGl0IHdlcmUgc2NhbGVkLCBzbyB3ZSBjYW5cclxuICAgICAgICAvLyBzY2FsZSB0aGUgY29udGVudFxyXG4gICAgICAgIGNvbnN0IHNjYWxlVHJhbnNmb3JtID0gdGhpcy5fdGVtcC5zY2FsZVRyYW5zZm9ybTtcclxuICAgICAgICBjb25zdCByb3RhdGlvblRyYW5zZm9ybSA9IHRoaXMuX3RlbXAucm90YXRpb25UcmFuc2Zvcm07XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25UcmFuc2Zvcm0gPSB0aGlzLl90ZW1wLnBvc2l0aW9uVHJhbnNmb3JtO1xyXG4gICAgICAgIGNvbnN0IHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXggPSB0aGlzLl90ZW1wLm9iamVjdE1hdHJpeDtcclxuXHJcbiAgICAgICAgb2JqZWN0V29ybGRNYXRyaXguZGVjb21wb3NlKHNjYWxlVHJhbnNmb3JtLCByb3RhdGlvblRyYW5zZm9ybSwgcG9zaXRpb25UcmFuc2Zvcm0pO1xyXG4gICAgICAgIHNjYWxlVHJhbnNmb3JtLnggKj0gd2lkdGhTY2FsZUZhY3RvcjtcclxuICAgICAgICBzY2FsZVRyYW5zZm9ybS55ICo9IGhlaWdodFNjYWxlRmFjdG9yO1xyXG5cclxuICAgICAgICBNYXRyaXguQ29tcG9zZVRvUmVmKHNjYWxlVHJhbnNmb3JtLCByb3RhdGlvblRyYW5zZm9ybSwgcG9zaXRpb25UcmFuc2Zvcm0sIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXgpO1xyXG5cclxuICAgICAgICAvLyBBZGp1c3QgZGlyZWN0aW9uIG9mIDEyIGFuZCAxMyBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGJhc2VkIG9uIHRoZSBoYW5kZWRuZXNzIG9mIHRoZSBzeXN0ZW1cclxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB1c2VSaWdodEhhbmRlZFN5c3RlbSA/IC0xIDogMTtcclxuICAgICAgICAvLyBBZGp1c3QgdHJhbnNsYXRpb24gdmFsdWVzIHRvIGJlIGZyb20gY2FtZXJhIHZzIHdvcmxkIG9yaWdpblxyXG4gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBhcmUgYWxzbyBhZGp1c3RpbmcgdGhlc2UgdmFsdWVzIHRvIGJlIHBpeGVscyB2cyBCYWJ5bG9uIHVuaXRzXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBodG1sTWVzaC5nZXRBYnNvbHV0ZVBvc2l0aW9uKCk7XHJcbiAgICAgICAgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeC5zZXRSb3dGcm9tRmxvYXRzKFxyXG4gICAgICAgICAgICAzLFxyXG4gICAgICAgICAgICAoLXRoaXMuX2NhbWVyYVdvcmxkTWF0cml4Lm1bMTJdICsgcG9zaXRpb24ueCkgKiBiYWJ5bG9uVW5pdHNUb1BpeGVscyAqIGRpcmVjdGlvbixcclxuICAgICAgICAgICAgKC10aGlzLl9jYW1lcmFXb3JsZE1hdHJpeC5tWzEzXSArIHBvc2l0aW9uLnkpICogYmFieWxvblVuaXRzVG9QaXhlbHMgKiBkaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICh0aGlzLl9jYW1lcmFXb3JsZE1hdHJpeC5tWzE0XSAtIHBvc2l0aW9uLnopICogYmFieWxvblVuaXRzVG9QaXhlbHMsXHJcbiAgICAgICAgICAgIHRoaXMuX2NhbWVyYVdvcmxkTWF0cml4Lm1bMTVdICogMC4wMDAwMSAqIGJhYnlsb25Vbml0c1RvUGl4ZWxzXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gQWRqdXN0IG90aGVyIHZhbHVlcyB0byBiZSBwaXhlbHMgdnMgQmFieWxvbiB1bml0c1xyXG4gICAgICAgIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXgubXVsdGlwbHlBdEluZGV4KDMsIGJhYnlsb25Vbml0c1RvUGl4ZWxzKTtcclxuICAgICAgICBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4Lm11bHRpcGx5QXRJbmRleCg3LCBiYWJ5bG9uVW5pdHNUb1BpeGVscyk7XHJcbiAgICAgICAgc2NhbGVkQW5kVHJhbnNsYXRlZE9iamVjdE1hdHJpeC5tdWx0aXBseUF0SW5kZXgoMTEsIGJhYnlsb25Vbml0c1RvUGl4ZWxzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9yZW5kZXJIdG1sTWVzaChodG1sTWVzaDogSHRtbE1lc2gsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCFodG1sTWVzaC5lbGVtZW50IHx8ICFodG1sTWVzaC5lbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKSB7XHJcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gcmVuZGVyLCBzbyBiYWlsXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZW5zdXJlIGh0bWwgbWVzaCBkYXRhIGlzIGluaXRpYWxpemVkIGJlZm9yZVxyXG4gICAgICAgIC8vIGNvbXB1dGluZyB0aGUgYmFzZSBzY2FsZSBmYWN0b3JcclxuICAgICAgICBsZXQgaHRtbE1lc2hEYXRhID0gdGhpcy5fY2FjaGUuaHRtbE1lc2hEYXRhLmdldChodG1sTWVzaCk7XHJcbiAgICAgICAgaWYgKCFodG1sTWVzaERhdGEpIHtcclxuICAgICAgICAgICAgaHRtbE1lc2hEYXRhID0geyBzdHlsZTogXCJcIiB9O1xyXG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5odG1sTWVzaERhdGEuc2V0KGh0bWxNZXNoLCBodG1sTWVzaERhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2FtZXJhRWxlbWVudCA9IGh0bWxNZXNoLl9pc0NhbnZhc092ZXJsYXkgPyB0aGlzLl9vdmVybGF5RWxlbWVudHM/LmNhbWVyYUVsZW1lbnQgOiB0aGlzLl9pblNjZW5lRWxlbWVudHM/LmNhbWVyYUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChodG1sTWVzaC5lbGVtZW50LnBhcmVudE5vZGUgIT09IGNhbWVyYUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY2FtZXJhRWxlbWVudCEuYXBwZW5kQ2hpbGQoaHRtbE1lc2guZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB0aGUgaHRtbE1lc2ggY29udGVudCBoYXMgY2hhbmdlZCwgdXBkYXRlIHRoZSBiYXNlIHNjYWxlIGZhY3RvclxyXG4gICAgICAgIGlmIChodG1sTWVzaC5yZXF1aXJlc1VwZGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVCYXNlU2NhbGVGYWN0b3IoaHRtbE1lc2gpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggZm9yIHRoZSBodG1sIG1lc2hcclxuICAgICAgICBjb25zdCBzY2FsZWRBbmRUcmFuc2xhdGVkT2JqZWN0TWF0cml4ID0gdGhpcy5fZ2V0VHJhbnNmb3JtYXRpb25NYXRyaXgoaHRtbE1lc2gsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtKTtcclxuXHJcbiAgICAgICAgbGV0IHN0eWxlID0gYHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSAke3RoaXMuX2dldEh0bWxDb250ZW50Q1NTTWF0cml4KHNjYWxlZEFuZFRyYW5zbGF0ZWRPYmplY3RNYXRyaXgsIHVzZVJpZ2h0SGFuZGVkU3lzdGVtKX1gO1xyXG4gICAgICAgIC8vIEluIGEgcmlnaHQgaGFuZGVkIHN5c3RlbSwgc2NyZWVucyBhcmUgb24gdGhlIHdyb25nIHNpZGUgb2YgdGhlIG1lc2gsIHNvIHdlIGhhdmUgdG8gcm90YXRlIGJ5IE1hdGguUEkgd2hpY2ggcmVzdWx0cyBpbiB0aGUgbWF0cml4M2Qgc2VlbiBiZWxvd1xyXG4gICAgICAgIHN0eWxlICs9IGAke3VzZVJpZ2h0SGFuZGVkU3lzdGVtID8gXCJtYXRyaXgzZCgtMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgLTEsIDAsIDAsIDAsIDAsIDEpXCIgOiBcIlwifWA7XHJcblxyXG4gICAgICAgIGlmIChodG1sTWVzaERhdGEuc3R5bGUgIT09IHN0eWxlKSB7XHJcbiAgICAgICAgICAgIGh0bWxNZXNoLmVsZW1lbnQuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gc3R5bGU7XHJcbiAgICAgICAgICAgIGh0bWxNZXNoLmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gc3R5bGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBodG1sTWVzaC5fbWFya0FzVXBkYXRlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfcmVuZGVyKHNjZW5lOiBTY2VuZSwgY2FtZXJhOiBDYW1lcmEpIHtcclxuICAgICAgICBsZXQgbmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgdXNlUmlnaHRIYW5kZWRTeXN0ZW0gPSBzY2VuZS51c2VSaWdodEhhbmRlZFN5c3RlbTtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBjb250YWluZXIgcG9zaXRpb24gYW5kIHNpemUgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29udGFpbmVyUG9zaXRpb25JZk5lZWRlZCgpO1xyXG5cclxuICAgICAgICAvLyBDaGVjayBmb3IgYSBjYW1lcmEgY2hhbmdlXHJcbiAgICAgICAgaWYgKHRoaXMuX2NhbWVyYU1hdHJpeFVwZGF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fY2FtZXJhTWF0cml4VXBkYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB0aGUgY2FtZXJhIHBvc2l0aW9uIGhhcyBjaGFuZ2VkLCB0aGVuIHdlIGFsc28gbmVlZCB0byB1cGRhdGVcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi54ICE9PSB0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLnBvc2l0aW9uLnggfHxcclxuICAgICAgICAgICAgY2FtZXJhLnBvc2l0aW9uLnkgIT09IHRoaXMuX2NhY2hlLmNhbWVyYURhdGEucG9zaXRpb24ueSB8fFxyXG4gICAgICAgICAgICBjYW1lcmEucG9zaXRpb24ueiAhPT0gdGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5wb3NpdGlvbi56XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmNhbWVyYURhdGEucG9zaXRpb24uY29weUZyb20oY2FtZXJhLnBvc2l0aW9uKTtcclxuICAgICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGEgZHByIGNoYW5nZVxyXG4gICAgICAgIGlmICh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAhPT0gdGhpcy5fbGFzdERldmljZVBpeGVsUmF0aW8pIHtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdERldmljZVBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcclxuICAgICAgICAgICAgTG9nZ2VyLkxvZyhcIkluIHJlbmRlciAtIGRwciBjaGFuZ2VkOiBcIiwgdGhpcy5fbGFzdERldmljZVBpeGVsUmF0aW8pO1xyXG4gICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiBhbnkgbWVzaGVzIG5lZWQgdG8gYmUgdXBkYXRlZFxyXG4gICAgICAgIGNvbnN0IG1lc2hlc05lZWRpbmdVcGRhdGUgPSBzY2VuZS5tZXNoZXMuZmlsdGVyKChtZXNoKSA9PiAobWVzaCBhcyBhbnkpW1wiaXNIdG1sTWVzaFwiXSAmJiAobmVlZHNVcGRhdGUgfHwgKG1lc2ggYXMgSHRtbE1lc2gpLnJlcXVpcmVzVXBkYXRlKSk7XHJcbiAgICAgICAgbmVlZHNVcGRhdGUgPSBuZWVkc1VwZGF0ZSB8fCBtZXNoZXNOZWVkaW5nVXBkYXRlLmxlbmd0aCA+IDA7XHJcblxyXG4gICAgICAgIGlmICghbmVlZHNVcGRhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IGEgcHJvamVjdGlvbiBtYXRyaXggZm9yIHRoZSBjYW1lcmFcclxuICAgICAgICBjb25zdCBwcm9qZWN0aW9uTWF0cml4ID0gY2FtZXJhLmdldFByb2plY3Rpb25NYXRyaXgoKTtcclxuICAgICAgICBjb25zdCBmb3YgPSBwcm9qZWN0aW9uTWF0cml4Lm1bNV0gKiB0aGlzLl9oZWlnaHRIYWxmO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5mb3YgIT09IGZvdikge1xyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBbdGhpcy5fb3ZlcmxheUVsZW1lbnRzPy5kb21FbGVtZW50LCB0aGlzLl9pblNjZW5lRWxlbWVudHM/LmRvbUVsZW1lbnRdO1xyXG4gICAgICAgICAgICBpZiAoY2FtZXJhLm1vZGUgPT0gQ2FtZXJhLlBFUlNQRUNUSVZFX0NBTUVSQSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBzb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUud2Via2l0UGVyc3BlY3RpdmUgPSBmb3YgKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLnBlcnNwZWN0aXZlID0gZm92ICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2Ygc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLndlYmtpdFBlcnNwZWN0aXZlID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUucGVyc3BlY3RpdmUgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5jYW1lcmFEYXRhLmZvdiA9IGZvdjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCB0aGUgQ1NTIG1hdHJpeCBmb3IgdGhlIGNhbWVyYSAod2hpY2ggd2lsbCBpbmNsdWRlIGFueSBjYW1lcmEgcm90YXRpb24pXHJcbiAgICAgICAgaWYgKGNhbWVyYS5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgY2FtZXJhLmNvbXB1dGVXb3JsZE1hdHJpeCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2FtZXJhTWF0cml4V29ybGQgPSB0aGlzLl90ZW1wLmNhbWVyYVdvcmxkTWF0cml4O1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkLmNvcHlGcm9tKGNhbWVyYS5nZXRXb3JsZE1hdHJpeCgpKTtcclxuICAgICAgICBjb25zdCBjYW1lcmFSb3RhdGlvbk1hdHJpeCA9IHRoaXMuX3RlbXAuY2FtZXJhUm90YXRpb25NYXRyaXg7XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGQuZ2V0Um90YXRpb25NYXRyaXgoKS50cmFuc3Bvc2VUb1JlZihjYW1lcmFSb3RhdGlvbk1hdHJpeCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheSA9IHRoaXMuX3RlbXAuY2FtZXJhV29ybGRNYXRyaXhBc0FycmF5O1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkLmNvcHlUb0FycmF5KGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheSk7XHJcblxyXG4gICAgICAgIC8vIEZvciBhIGZldyB2YWx1ZXMsIHdlIGhhdmUgdG8gYWRqdXN0IHRoZSBkaXJlY3Rpb24gYmFzZWQgb24gdGhlIGhhbmRlZG5lc3Mgb2YgdGhlIHN5c3RlbVxyXG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHVzZVJpZ2h0SGFuZGVkU3lzdGVtID8gMSA6IC0xO1xyXG5cclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXlbMV0gPSBjYW1lcmFSb3RhdGlvbk1hdHJpeC5tWzFdO1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheVsyXSA9IGNhbWVyYVJvdGF0aW9uTWF0cml4Lm1bMl0gKiBkaXJlY3Rpb247XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5WzRdID0gY2FtZXJhUm90YXRpb25NYXRyaXgubVs0XSAqIGRpcmVjdGlvbjtcclxuICAgICAgICBjYW1lcmFNYXRyaXhXb3JsZEFzQXJyYXlbNl0gPSBjYW1lcmFSb3RhdGlvbk1hdHJpeC5tWzZdICogZGlyZWN0aW9uO1xyXG4gICAgICAgIGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheVs4XSA9IGNhbWVyYVJvdGF0aW9uTWF0cml4Lm1bOF0gKiBkaXJlY3Rpb247XHJcbiAgICAgICAgY2FtZXJhTWF0cml4V29ybGRBc0FycmF5WzldID0gY2FtZXJhUm90YXRpb25NYXRyaXgubVs5XSAqIGRpcmVjdGlvbjtcclxuXHJcbiAgICAgICAgTWF0cml4LkZyb21BcnJheVRvUmVmKGNhbWVyYU1hdHJpeFdvcmxkQXNBcnJheSwgMCwgY2FtZXJhTWF0cml4V29ybGQpO1xyXG5cclxuICAgICAgICBjb25zdCBjYW1lcmFDU1NNYXRyaXggPSB0aGlzLl9nZXRDYW1lcmFDU1NNYXRyaXgoY2FtZXJhTWF0cml4V29ybGQpO1xyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gY2FtZXJhQ1NTTWF0cml4O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY2FjaGUuY2FtZXJhRGF0YS5zdHlsZSAhPT0gc3R5bGUpIHtcclxuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gW3RoaXMuX2luU2NlbmVFbGVtZW50cz8uY2FtZXJhRWxlbWVudCwgdGhpcy5fb3ZlcmxheUVsZW1lbnRzPy5jYW1lcmFFbGVtZW50XTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBzb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHN0eWxlO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmNhbWVyYURhdGEuc3R5bGUgPSBzdHlsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIF9SZW5kZXIgb2JqZWN0cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICBmb3IgKGNvbnN0IG1lc2ggb2YgbWVzaGVzTmVlZGluZ1VwZGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJIdG1sTWVzaChtZXNoIGFzIEh0bWxNZXNoLCB1c2VSaWdodEhhbmRlZFN5c3RlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdXBkYXRlQmFzZVNjYWxlRmFjdG9yKGh0bWxNZXNoOiBIdG1sTWVzaCkge1xyXG4gICAgICAgIC8vIEdldCBzY3JlZW4gd2lkdGggYW5kIGhlaWdodFxyXG4gICAgICAgIGxldCBzY3JlZW5XaWR0aCA9IHRoaXMuX3dpZHRoO1xyXG4gICAgICAgIGxldCBzY3JlZW5IZWlnaHQgPSB0aGlzLl9oZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIENhbGN1bGF0ZSBhc3BlY3QgcmF0aW9zXHJcbiAgICAgICAgY29uc3QgaHRtbE1lc2hBc3BlY3RSYXRpbyA9IChodG1sTWVzaC53aWR0aCB8fCAxKSAvIChodG1sTWVzaC5oZWlnaHQgfHwgMSk7XHJcbiAgICAgICAgY29uc3Qgc2NyZWVuQXNwZWN0UmF0aW8gPSBzY3JlZW5XaWR0aCAvIHNjcmVlbkhlaWdodDtcclxuXHJcbiAgICAgICAgLy8gQWRqdXN0IHNjcmVlbiBkaW1lbnNpb25zIGJhc2VkIG9uIGFzcGVjdCByYXRpb3NcclxuICAgICAgICBpZiAoaHRtbE1lc2hBc3BlY3RSYXRpbyA+IHNjcmVlbkFzcGVjdFJhdGlvKSB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBIVE1MIG1lc2ggaXMgd2lkZXIgcmVsYXRpdmUgdG8gaXRzIGhlaWdodCB0aGFuIHRoZSBzY3JlZW4sIGFkanVzdCB0aGUgc2NyZWVuIHdpZHRoXHJcbiAgICAgICAgICAgIHNjcmVlbldpZHRoID0gc2NyZWVuSGVpZ2h0ICogaHRtbE1lc2hBc3BlY3RSYXRpbztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgSFRNTCBtZXNoIGlzIHRhbGxlciByZWxhdGl2ZSB0byBpdHMgd2lkdGggdGhhbiB0aGUgc2NyZWVuLCBhZGp1c3QgdGhlIHNjcmVlbiBoZWlnaHRcclxuICAgICAgICAgICAgc2NyZWVuSGVpZ2h0ID0gc2NyZWVuV2lkdGggLyBodG1sTWVzaEFzcGVjdFJhdGlvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2V0IGNvbnRlbnQgdG8gZmlsbCBzY3JlZW4gc28gd2UgZ2V0IG1heCByZXNvbHV0aW9uIHdoZW4gaXQgaXMgc2hydW5rIHRvIGZpdCB0aGUgbWVzaFxyXG4gICAgICAgIGh0bWxNZXNoLnNldENvbnRlbnRTaXplUHgoc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF91cGRhdGVDb250YWluZXJQb3NpdGlvbklmTmVlZGVkKCkge1xyXG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgY2FudmFzIGhhcyBtb3ZlZCBvbiB0aGUgc2NyZWVuXHJcbiAgICAgICAgY29uc3QgY2FudmFzUmVjdCA9IHRoaXMuX2VuZ2luZS5nZXRSZW5kZXJpbmdDYW52YXNDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIC8vIGNhbnZhcyByZWN0IG1heSBiZSBudWxsIGlmIGxheW91dCBub3QgY29tcGxldGVcclxuICAgICAgICBpZiAoIWNhbnZhc1JlY3QpIHtcclxuICAgICAgICAgICAgTG9nZ2VyLldhcm4oX3Bvc2l0aW9uVXBkYXRlRmFpbE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IHdpbmRvdy5zY3JvbGxZO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSB3aW5kb3cuc2Nyb2xsWDtcclxuICAgICAgICBjb25zdCBjYW52YXNEb2N1bWVudFRvcCA9IGNhbnZhc1JlY3QudG9wICsgc2Nyb2xsVG9wO1xyXG4gICAgICAgIGNvbnN0IGNhbnZhc0RvY3VtZW50TGVmdCA9IGNhbnZhc1JlY3QubGVmdCArIHNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9wcmV2aW91c0NhbnZhc0RvY3VtZW50UG9zaXRpb24udG9wICE9PSBjYW52YXNEb2N1bWVudFRvcCB8fCB0aGlzLl9wcmV2aW91c0NhbnZhc0RvY3VtZW50UG9zaXRpb24ubGVmdCAhPT0gY2FudmFzRG9jdW1lbnRMZWZ0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzQ2FudmFzRG9jdW1lbnRQb3NpdGlvbi50b3AgPSBjYW52YXNEb2N1bWVudFRvcDtcclxuICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNDYW52YXNEb2N1bWVudFBvc2l0aW9uLmxlZnQgPSBjYW52YXNEb2N1bWVudExlZnQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBbdGhpcy5faW5TY2VuZUVsZW1lbnRzPy5jb250YWluZXIsIHRoaXMuX292ZXJsYXlFbGVtZW50cz8uY29udGFpbmVyXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjb250YWluZXIgb2Ygc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgdG9wIGFuZCBsZWZ0IG9mIHRoZSBjc3MgY29udGFpbmVyIHRvIG1hdGNoIHRoZSBjYW52YXNcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclBhcmVudCA9IGNvbnRhaW5lci5vZmZzZXRQYXJlbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRSZWN0ID0gY29udGFpbmVyUGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50RG9jdW1lbnRUb3AgPSBwYXJlbnRSZWN0LnRvcCArIHNjcm9sbFRvcDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudERvY3VtZW50TGVmdCA9IHBhcmVudFJlY3QubGVmdCArIHNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZyA9IHRoaXMuX2dldEFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcoY29udGFpbmVyUGFyZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGJvZHkgbWFyZ2luXHJcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHlNYXJnaW5Ub3AgPSBwYXJzZUludChib2R5U3R5bGUubWFyZ2luVG9wLCAxMCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5TWFyZ2luTGVmdCA9IHBhcnNlSW50KGJvZHlTdHlsZS5tYXJnaW5MZWZ0LCAxMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRvcCA9IGAke2NhbnZhc0RvY3VtZW50VG9wIC0gcGFyZW50RG9jdW1lbnRUb3AgLSBhbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nLm1hcmdpblRvcCArIGFuY2VzdG9yTWFyZ2luc0FuZFBhZGRpbmcucGFkZGluZ1RvcCArIGJvZHlNYXJnaW5Ub3B9cHhgO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmxlZnQgPSBgJHtcclxuICAgICAgICAgICAgICAgICAgICBjYW52YXNEb2N1bWVudExlZnQgLSBwYXJlbnREb2N1bWVudExlZnQgLSBhbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nLm1hcmdpbkxlZnQgKyBhbmNlc3Rvck1hcmdpbnNBbmRQYWRkaW5nLnBhZGRpbmdMZWZ0ICsgYm9keU1hcmdpbkxlZnRcclxuICAgICAgICAgICAgICAgIH1weGA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9vbkNhbWVyYU1hdHJpeENoYW5nZWQgPSAoY2FtZXJhOiBDYW1lcmEpID0+IHtcclxuICAgICAgICB0aGlzLl9jYW1lcmFXb3JsZE1hdHJpeCA9IGNhbWVyYS5nZXRXb3JsZE1hdHJpeCgpO1xyXG4gICAgICAgIHRoaXMuX2NhbWVyYU1hdHJpeFVwZGF0ZWQgPSB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIF9lcHNpbG9uKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5hYnModmFsdWUpIDwgMWUtMTAgPyAwIDogdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR2V0IHRvdGFsIG1hcmdpbnMgYW5kIHBhZGRpbmcgZm9yIGFuIGVsZW1lbnQsIGV4Y2x1ZGluZyB0aGUgYm9keSBhbmQgZG9jdW1lbnQgbWFyZ2luc1xyXG4gICAgcHJpdmF0ZSBfZ2V0QW5jZXN0b3JNYXJnaW5zQW5kUGFkZGluZyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGxldCBtYXJnaW5Ub3AgPSAwO1xyXG4gICAgICAgIGxldCBtYXJnaW5MZWZ0ID0gMDtcclxuICAgICAgICBsZXQgcGFkZGluZ1RvcCA9IDA7XHJcbiAgICAgICAgbGV0IHBhZGRpbmdMZWZ0ID0gMDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgZWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSAmJiBlbGVtZW50ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcclxuICAgICAgICAgICAgbWFyZ2luVG9wICs9IHBhcnNlSW50KHN0eWxlLm1hcmdpblRvcCwgMTApO1xyXG4gICAgICAgICAgICBtYXJnaW5MZWZ0ICs9IHBhcnNlSW50KHN0eWxlLm1hcmdpbkxlZnQsIDEwKTtcclxuICAgICAgICAgICAgcGFkZGluZ1RvcCArPSBwYXJzZUludChzdHlsZS5wYWRkaW5nVG9wLCAxMCk7XHJcbiAgICAgICAgICAgIHBhZGRpbmdMZWZ0ICs9IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdMZWZ0LCAxMCk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7IG1hcmdpblRvcCwgbWFyZ2luTGVmdCwgcGFkZGluZ1RvcCwgcGFkZGluZ0xlZnQgfTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBIdG1sTWVzaFJlbmRlcmVyIH0gZnJvbSBcIi4vaHRtbE1lc2hSZW5kZXJlclwiO1xyXG5pbXBvcnQgeyBIdG1sTWVzaCB9IGZyb20gXCIuL2h0bWxNZXNoXCI7XHJcbmltcG9ydCB7IFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgfSBmcm9tIFwiLi9wb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yXCI7XHJcbmltcG9ydCB7IEZpdFN0cmF0ZWd5IH0gZnJvbSBcIi4vZml0U3RyYXRlZ3lcIjtcclxuXHJcbi8vIEV4cG9ydCBwdWJsaWMgY2xhc3NlcyBhbmQgZnVuY3Rpb25zXHJcbmV4cG9ydCB7IEh0bWxNZXNoUmVuZGVyZXIsIEh0bWxNZXNoLCBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yLCBGaXRTdHJhdGVneSB9O1xyXG4iLCJpbXBvcnQgeyBUb29scyB9IGZyb20gXCJjb3JlL01pc2MvdG9vbHNcIjtcclxuXHJcbi8vIEEgY2FwdHVyZSBtYW5hZ2VtZW50IHN5c3RlbSB0byBlbnN1cmUgdGhhdCB0aGUgY29ycmVjdCBvYmplY3QgaGFzIHRoZSBwb2ludGVyXHJcbi8vIGV2ZW50cyBieSBlbGltaW5hdGluZyByYWNlIGNvbmRpdGlvbnMgdGhhdCBjYW4gY2F1c2UgdGhlIHBvaW50ZXIgZXZlbnRzIHRvIGJlXHJcbi8vIHJlbGVhc2VkIGJ5IGEgZGlmZmVyZW50IG9iamVjdCBhZnRlciB0aGV5IGFyZSBjYXB0dXJlZCBsZWF2aW5nIG5vIG9iamVjdFxyXG4vLyBhcyB0aGUgb3duZXIuICBJdCBkb2VzIHRoaXMgYnkgcXVldWVpbmcgcmVxdWVzdHMgYW5kIG9ubHkgYWxsb3dpbmdcclxuLy8gY2FwdHVyZSB3aGVuIHRoZSBjdXJyZW50IGNhcHR1cmUgb3duZXIgcmVsZWFzZXMgcG9pbnRlciBldmVudHMuXHJcblxyXG50eXBlIENhcHR1cmVSZWxlYXNlQ2FsbGJhY2sgPSAoKSA9PiB2b2lkO1xyXG5cclxudHlwZSBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrcyA9IHtcclxuICAgIGNhcHR1cmU6IENhcHR1cmVSZWxlYXNlQ2FsbGJhY2s7XHJcbiAgICByZWxlYXNlOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrO1xyXG59O1xyXG5cclxubGV0IGNhcHR1cmVSZXF1ZXN0UXVldWU6IHN0cmluZ1tdID0gW107XHJcblxyXG4vLyBLZXkgaXMgcmVxdWVzdCBpZCwgdmFsdWUgaXMgb2JqZWN0IHdpdGggY2FwdHVyZSBhbmQgcmVsZWFzZSBjYWxsYmFja3NcclxuY29uc3QgcGVuZGluZ1JlcXVlc3RDYWxsYmFja3M6IE1hcDxzdHJpbmcsIENhcHR1cmVSZWxlYXNlQ2FsbGJhY2tzPiA9IG5ldyBNYXAoKTtcclxuXHJcbi8vIEtlZXAgdHJhY2sgb2YgcmVsZWFzZSByZXF1ZXN0cyB3aXRoIG5vIG1hdGNoaW5nIGNhcHR1cmUgcmVxdWVzdFxyXG4vLyBpbiBjYXNlIHRoZSByZWxlYXNlIHJlcXVlc3QgYXJyaXZlZCBiZWZvcmUgdGhlIGNhcHR1cmUgdG8gYXZvaWRcclxuLy8gdGhlIGNhcHR1cmUgcmVxdWVzdCBuZXZlciBnZXR0aW5nIHJlbGVhc2VkLlxyXG5sZXQgdW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxubGV0IGN1cnJlbnRPd25lcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIENhbGxlZCBvbiBmaXJzdCBjYXB0dXJlIG9yIHJlbGVhc2UgcmVxdWVzdFxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgaWQgb2YgdGhlIG9iamVjdCBjdXJyZW50bHkgY2FwdHVyaW5nIHBvaW50ZXIgZXZlbnRzXHJcbiAqIEByZXR1cm5zIFRoZSBpZCBvZiB0aGUgb2JqZWN0IGN1cnJlbnRseSBjYXB0dXJpbmcgcG9pbnRlciBldmVudHNcclxuICogb3IgbnVsbCBpZiBubyBvYmplY3QgaXMgY2FwdHVyaW5nIHBvaW50ZXIgZXZlbnRzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0Q2FwdHVyaW5nSWQgPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gY3VycmVudE93bmVyO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJlcXVlc3QgdGhhdCB0aGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGlkIGNhcHR1cmUgcG9pbnRlciBldmVudHMuICBJZiB0aGVyZSBpcyBubyBjdXJyZW50XHJcbiAqIG93bmVyLCB0aGVuIHRoZSByZXF1ZXN0IGlzIGdyYW50ZWQgaW1tZWRpYXRlbHkuICBJZiB0aGVyZSBpcyBhIGN1cnJlbnQgb3duZXIsIHRoZW4gdGhlIHJlcXVlc3RcclxuICogaXMgcXVldWVkIHVudGlsIHRoZSBjdXJyZW50IG93bmVyIHJlbGVhc2VzIHBvaW50ZXIgZXZlbnRzLlxyXG4gKiBAcGFyYW0gcmVxdWVzdElkIEFuIGlkIHRvIGlkZW50aWZ5IHRoZSByZXF1ZXN0LiAgVGhpcyBpZCB3aWxsIGJlIHVzZWQgdG8gbWF0Y2ggdGhlIGNhcHR1cmVcclxuICogcmVxdWVzdCB3aXRoIHRoZSByZWxlYXNlIHJlcXVlc3QuXHJcbiAqIEBwYXJhbSBjYXB0dXJlQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgcmVxdWVzdCBpcyBncmFudGVkIGFuZCB0aGUgb2JqZWN0IGlzIGNhcHR1cmluZ1xyXG4gKiBAcGFyYW0gcmVsZWFzZUNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIG9iamVjdCBpcyBubyBsb25nZXIgY2FwdHVyaW5nIHBvaW50ZXIgZXZlbnRzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVxdWVzdENhcHR1cmUgPSAocmVxdWVzdElkOiBzdHJpbmcsIGNhcHR1cmVDYWxsYmFjazogQ2FwdHVyZVJlbGVhc2VDYWxsYmFjaywgcmVsZWFzZUNhbGxiYWNrOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrKSA9PiB7XHJcbiAgICBkZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUucmVxdWVzdENhcHR1cmUgLSBQb2ludGVyIGV2ZW50cyBjYXB0dXJlIHJlcXVlc3RlZCBmb3IgJHtyZXF1ZXN0SWR9YCk7XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgaXMgYSByZWxlYXNlIGZvciB0aGlzIHJlcXVlc3QsIHRoZW4gaWdub3JlIHRoZSByZXF1ZXN0XHJcbiAgICBpZiAocmVtb3ZlVW5tYXRjaGVkUmVxdWVzdChyZXF1ZXN0SWQpKSB7XHJcbiAgICAgICAgZGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLnJlcXVlc3RDYXB0dXJlIC0gQ2FwdHVyZSByZXF1ZXN0IG1hdGNoZWQgcHJldmlvdXMgcmVsZWFzZSByZXF1ZXN0ICR7cmVxdWVzdElkfS4gIENhbmNlbGxpbmcgY2FwdHVyZSByZXF1ZXN0YCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0SWQgIT09IGN1cnJlbnRPd25lcikge1xyXG4gICAgICAgIC8vIGlmIHRoZSByZXF1ZXN0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBxdWV1ZSwgYWRkIGl0IHRvIHRoZSBxdWV1ZVxyXG4gICAgICAgIGVucXVldWVDYXB0dXJlUmVxdWVzdChyZXF1ZXN0SWQsIGNhcHR1cmVDYWxsYmFjaywgcmVsZWFzZUNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWN1cnJlbnRPd25lcikge1xyXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgb3duZXIsIGdvIGFoZWFkIGFuZCBncmFudCB0aGUgcmVxdWVzdFxyXG4gICAgICAgIHRyYW5zZmVyUG9pbnRlckV2ZW50c093bmVyc2hpcCgpO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgdGhlIHJlcXVlc3QgaWQgaXMgdGhlIGN1cnJlbnQgb3duZXIsIGRvIG5vdGhpbmdcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZWxlYXNlIHBvaW50ZXIgZXZlbnRzIGZyb20gdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZC4gIElmIHRoZSBvYmplY3QgaXMgdGhlIGN1cnJlbnQgb3duZXJcclxuICogdGhlbiBwb2ludGVyIGV2ZW50cyBhcmUgcmVsZWFzZWQgaW1tZWRpYXRlbHkuICBJZiB0aGUgb2JqZWN0IGlzIG5vdCB0aGUgY3VycmVudCBvd25lciwgdGhlbiB0aGVcclxuICogYXNzb2NpYXRlZCBjYXB0dXJlIHJlcXVlc3QgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS4gIElmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIGNhcHR1cmUgcmVxdWVzdFxyXG4gKiBpbiB0aGUgcXVldWUsIHRoZW4gdGhlIHJlbGVhc2UgcmVxdWVzdCBpcyBhZGRlZCB0byBhIGxpc3Qgb2YgdW5tYXRjaGVkIHJlbGVhc2UgcmVxdWVzdHMgYW5kIHdpbGxcclxuICogbmVnYXRlIHRoZSBuZXh0IGNhcHR1cmUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkLiAgVGhpcyBpcyB0byBndWFyZCBhZ2FpbnN0IHRoZSBwb3NzaWJpbGl0eSB0aGF0XHJcbiAqIHRoZSByZWxlYXNlIHJlcXVlc3QgYXJyaXZlZCBiZWZvcmUgdGhlIGNhcHR1cmUgcmVxdWVzdC5cclxuICogQHBhcmFtIHJlcXVlc3RJZCBUaGUgaWQgd2hpY2ggc2hvdWxkIG1hdGNoIHRoZSBpZCBvZiB0aGUgY2FwdHVyZSByZXF1ZXN0XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVxdWVzdFJlbGVhc2UgPSAocmVxdWVzdElkOiBzdHJpbmcgfCBudWxsKSA9PiB7XHJcbiAgICBkZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUucmVxdWVzdFJlbGVhc2UgLSBQb2ludGVyIGV2ZW50cyByZWxlYXNlIHJlcXVlc3RlZCBmb3IgJHtyZXF1ZXN0SWR9YCk7XHJcblxyXG4gICAgLy8gaWYgdGhlIHJlcXVlc3RJZCBpcyB0aGUgY3VycmVudCBjYXB0dXJlIGhvbGRlciByZWxlYXNlIGl0XHJcbiAgICBpZiAoIXJlcXVlc3RJZCB8fCByZXF1ZXN0SWQgPT09IGN1cnJlbnRPd25lcikge1xyXG4gICAgICAgIHRyYW5zZmVyUG9pbnRlckV2ZW50c093bmVyc2hpcCgpO1xyXG4gICAgfSBlbHNlIGlmIChjYW5jZWxSZXF1ZXN0KHJlcXVlc3RJZCkpIHtcclxuICAgICAgICAvLyBpZiB0aGUgcmVxdWVzdCBpcyBpbiB0aGUgcXVldWUsIGJ1dCBub3QgdGhlIGN1cnJlbnQgY2FwdHVyZSBob2xkZXIsIHJlbW92ZSBpdCBhbmQgaXQncyBjYWxsYmFja3NcclxuICAgICAgICBwZW5kaW5nUmVxdWVzdENhbGxiYWNrcy5kZWxldGUocmVxdWVzdElkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLnJlcXVlc3RSZWxlYXNlIC0gUmVjZWl2ZWQgcmVsZWFzZSByZXF1ZXN0ICR7cmVxdWVzdElkfSBidXQgbm8gbWF0Y2hpbmcgY2FwdHVyZSByZXF1ZXN0IHdhcyByZWNlaXZlZGApO1xyXG4gICAgICAgIC8vIHJlcXVlc3Qgd2FzIG5vdCBjdXJyZW50IGFuZCBub3QgaW4gcXVldWUsIGxpa2VseSBiZWNhdXNlIHdlIHJlY2VpdmVkIGEgcmVsZWFzZVxyXG4gICAgICAgIC8vIHJlcXVlc3QgYmVmb3JlIHRoZSBjYXB0dXJlLiAgQWRkIGl0IHRvIHRoZSB1bm1hdGNoZWQgbGlzdCB0byBndWFyZCBhZ2FpbnN0IHRoaXMgcG9zc2liaWxpdHlcclxuICAgICAgICBpZiAoIXVubWF0Y2hlZFJlbGVhc2VSZXF1ZXN0cy5pbmNsdWRlcyhyZXF1ZXN0SWQpKSB7XHJcbiAgICAgICAgICAgIHVubWF0Y2hlZFJlbGVhc2VSZXF1ZXN0cy5wdXNoKHJlcXVlc3RJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJlbGFzZSBwb2ludGVyIGV2ZW50cyBmcm9tIHRoZSBjdXJyZW50IG93bmVyXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVsZWFzZUN1cnJlbnQgPSAoKSA9PiB7XHJcbiAgICByZXF1ZXN0UmVsZWFzZShjdXJyZW50T3duZXIpO1xyXG59O1xyXG5cclxuY29uc3QgZW5xdWV1ZUNhcHR1cmVSZXF1ZXN0ID0gKHJlcXVlc3RJZDogc3RyaW5nLCBjYXB0dXJlOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrLCByZWxlYXNlOiBDYXB0dXJlUmVsZWFzZUNhbGxiYWNrKSA9PiB7XHJcbiAgICBkZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUuZW5xdWV1ZUNhcHR1cmVSZXF1ZXN0IC0gRW5xdWV1ZWluZyBjYXB0dXJlIHJlcXVlc3QgZm9yICAke3JlcXVlc3RJZH1gKTtcclxuICAgIGlmICghY2FwdHVyZVJlcXVlc3RRdWV1ZS5pbmNsdWRlcyhyZXF1ZXN0SWQpKSB7XHJcbiAgICAgICAgY2FwdHVyZVJlcXVlc3RRdWV1ZS5wdXNoKHJlcXVlc3RJZCk7XHJcbiAgICAgICAgcGVuZGluZ1JlcXVlc3RDYWxsYmFja3Muc2V0KHJlcXVlc3RJZCwgeyBjYXB0dXJlLCByZWxlYXNlIH0pO1xyXG4gICAgfVxyXG59O1xyXG5cclxuLy8gUmVtb3ZlcyB0aGUgcmVxdWVzdCBmcm9tIHRoZSBxdWV1ZSBpZiBpdCBleGlzdHMuICBSZXR1cm5zIHRydWVcclxuLy8gaWYgdGhlIHJlcXVlc3Qgd2FzIGZvdW5kIGFuZCByZW1vdmVkLCBvdGhlcndpc2UgZmFsc2VcclxuY29uc3QgY2FuY2VsUmVxdWVzdCA9IChyZXF1ZXN0SWQ6IHN0cmluZyB8IG51bGwpID0+IHtcclxuICAgIGxldCByZW1vdmVkID0gZmFsc2U7XHJcbiAgICBjYXB0dXJlUmVxdWVzdFF1ZXVlID0gY2FwdHVyZVJlcXVlc3RRdWV1ZS5maWx0ZXIoKGlkKSA9PiB7XHJcbiAgICAgICAgaWYgKGlkICE9PSByZXF1ZXN0SWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGRlYnVnTG9nKGBJbiBwb2ludGVyRXZlbnRzQ2FwdHVyZS5jYW5jZWxSZXF1ZXN0IC0gQ2FuY2VsaW5nIHBvaW50ZXIgZXZlbnRzIGNhcHR1cmUgcmVxdWVzdCAke3JlcXVlc3RJZH1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlbW92ZWQ7XHJcbn07XHJcblxyXG5jb25zdCByZW1vdmVVbm1hdGNoZWRSZXF1ZXN0ID0gKHJlcXVlc3RJZDogc3RyaW5nKSA9PiB7XHJcbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xyXG4gICAgdW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzID0gdW5tYXRjaGVkUmVsZWFzZVJlcXVlc3RzLmZpbHRlcigoaWQpID0+IHtcclxuICAgICAgICBpZiAoaWQgIT09IHJlcXVlc3RJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlbW92ZWQ7XHJcbn07XHJcblxyXG5jb25zdCB0cmFuc2ZlclBvaW50ZXJFdmVudHNPd25lcnNoaXAgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBuZXdPd25lcklkID0gbmV4dENhcHR1cmVSZXF1ZXN0KCk7XHJcbiAgICBkZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUudHJhbnNmZXJQb2ludGVyRXZlbnRzT3duZXJzaGlwIC0gVHJhbnNmZXJycmluZyBwb2ludGVyIGV2ZW50cyBmcm9tICR7Y3VycmVudE93bmVyfSB0byAke25ld093bmVySWR9YCk7XHJcbiAgICAvLyBSZWxlYXNlIHRoZSBjdXJyZW50IG93bmVyXHJcbiAgICBkb1JlbGVhc2UoKTtcclxuICAgIGlmIChuZXdPd25lcklkKSB7XHJcbiAgICAgICAgZG9DYXB0dXJlKG5ld093bmVySWQpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuY29uc3QgZG9SZWxlYXNlID0gKCkgPT4ge1xyXG4gICAgZGVidWdMb2coYEluIHBvaW50ZXJFdmVudHNDYXB0dXJlLmRvUmVsZWFzZSAtIFJlbGVhc2luZyBwb2ludGVyIGV2ZW50cyBmcm9tICR7Y3VycmVudE93bmVyfWApO1xyXG4gICAgaWYgKGN1cnJlbnRPd25lcikge1xyXG4gICAgICAgIC8vIGNhbGwgdGhlIHJlbGVhc2UgY2FsbGJhY2tcclxuICAgICAgICBwZW5kaW5nUmVxdWVzdENhbGxiYWNrcy5nZXQoY3VycmVudE93bmVyKT8ucmVsZWFzZSgpO1xyXG4gICAgICAgIC8vIEFuZCByZW1vdmUgdGhlIGNhbGxiYWNrc1xyXG4gICAgICAgIHBlbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzLmRlbGV0ZShjdXJyZW50T3duZXIpO1xyXG4gICAgICAgIGN1cnJlbnRPd25lciA9IG51bGw7XHJcbiAgICB9XHJcbn07XHJcblxyXG5jb25zdCBkb0NhcHR1cmUgPSAobmV3T3duZXJJZDogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAobmV3T3duZXJJZCkge1xyXG4gICAgICAgIC8vIGNhbGwgdGhlIGNhcHR1cmUgY2FsbGJhY2tcclxuICAgICAgICBwZW5kaW5nUmVxdWVzdENhbGxiYWNrcy5nZXQobmV3T3duZXJJZCk/LmNhcHR1cmUoKTtcclxuICAgIH1cclxuICAgIGN1cnJlbnRPd25lciA9IG5ld093bmVySWQ7XHJcbiAgICBkZWJ1Z0xvZyhgSW4gcG9pbnRlckV2ZW50c0NhcHR1cmUuZG9DYXB0dXJlIC0gUG9pbnRlciBldmVudHMgbm93IGNhcHR1cmVkIGJ5ICR7bmV3T3duZXJJZH1gKTtcclxufTtcclxuXHJcbmNvbnN0IG5leHRDYXB0dXJlUmVxdWVzdCA9ICgpID0+IHtcclxuICAgIHJldHVybiBjYXB0dXJlUmVxdWVzdFF1ZXVlLmxlbmd0aCA+IDAgPyBjYXB0dXJlUmVxdWVzdFF1ZXVlLnNoaWZ0KCkgOiBudWxsO1xyXG59O1xyXG5cclxuLy8gI3JlZ2lvbiBEZWJ1Z2dpbmcgc3VwcG9ydFxyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXHJcbiAgICAgICAgXCJwb2ludGVyLWV2ZW50cy1jYXB0dXJlLWRlYnVnXCI6IGJvb2xlYW4gfCBudWxsO1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBkZWJ1Z0xvZyA9IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcclxuICAgIC8vIElmIHdlIGFyZSBydW5ubmluZyBpbiBhIHRlc3QgcnVubmVyIChpbiBub2RlLCBzbyB3aW5kb3cgaXMgbm90IGRlZmluZWQpXHJcbiAgICAvLyBvciBpZiB0aGUgZGVidWcgZmxhZyBpcyBzZXQsIHRoZW4gbG9nIHRoZSBtZXNzYWdlXHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCB3aW5kb3dbXCJwb2ludGVyLWV2ZW50cy1jYXB0dXJlLWRlYnVnXCJdKSB7XHJcbiAgICAgICAgVG9vbHMuTG9nKFxyXG4gICAgICAgICAgICBgJHtwZXJmb3JtYW5jZS5ub3coKX0gLSBnYW1lLnNjZW5lLnBvaW50ZXJFdmVudHMgLSAke21lc3NhZ2V9XFxuY3VycmVudE93bmVyOiAke2N1cnJlbnRPd25lcn1cXG5xdWV1ZTogJHtjYXB0dXJlUmVxdWVzdFF1ZXVlfVxcbnVubWF0Y2hlZDogJHt1bm1hdGNoZWRSZWxlYXNlUmVxdWVzdHN9YFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn07XHJcbi8vICNlbmRyZWdpb24gRGVidWdnaW5nIHN1cHBvcnRcclxuIiwiaW1wb3J0IHR5cGUgeyBBYnN0cmFjdE1lc2ggfSBmcm9tIFwiY29yZS9NZXNoZXMvYWJzdHJhY3RNZXNoXCI7XHJcbmltcG9ydCB0eXBlIHsgQmVoYXZpb3IgfSBmcm9tIFwiY29yZS9CZWhhdmlvcnMvYmVoYXZpb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJjb3JlL01pc2MvbG9nZ2VyXCI7XHJcbmltcG9ydCB7IHJlcXVlc3RDYXB0dXJlLCByZXF1ZXN0UmVsZWFzZSwgcmVsZWFzZUN1cnJlbnQsIGdldENhcHR1cmluZ0lkIH0gZnJvbSBcIi4vcG9pbnRlckV2ZW50c0NhcHR1cmVcIjtcclxuXHJcbi8vIE1vZHVsZSBsZXZlbCB2YXJpYWJsZSBmb3IgaG9sZGluZyB0aGUgY3VycmVudCBzY2VuZVxyXG5sZXQgX3NjZW5lOiBTY2VuZSB8IG51bGwgPSBudWxsO1xyXG5cclxuLy8gTW9kdWxlIGxldmVsIHZhcmlhYmxlIHRvIGhvbGQgdGhlIGNvdW50IG9mIGJlaGF2aW9yIGluc3RhbmNlcyB0aGF0IGFyZSBjdXJyZW50bHkgY2FwdHVyaW5nIHBvaW50ZXIgZXZlbnRzXHJcbi8vIG9uIGVudHJ5LiAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IG9yIHN0b3Agb2JzZXJ2aW5nIHBvaW50ZXIgbW92ZW1lbnQuXHJcbmxldCBjYXB0dXJlT25FbnRlckNvdW50ID0gMDtcclxuXHJcbi8vIE1hcCB1c2VkIHRvIHN0b3JlIGluc3RhbmNlIG9mIHRoZSBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yIGZvciBhIG1lc2hcclxuLy8gV2UgZG8gdGhpcyBiZWNhdXNlIHRoaXMgZ2V0cyBjaGVja2VkIG9uIHBvaW50ZXIgbW92ZSBhbmQgd2UgZG9uJ3Qgd2FudCB0b1xyXG4vLyB1c2UgZ2V0QmVoYXZpb3JCeU5hbWUoKSBiZWNhdXNlIHRoYXQgaXMgYSBsaW5lYXIgc2VhcmNoXHJcbmNvbnN0IG1lc2hUb0JlaGF2aW9yTWFwID0gbmV3IFdlYWtNYXA8QWJzdHJhY3RNZXNoLCBQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yPigpO1xyXG5cclxuY29uc3Qgc3RhcnRDYXB0dXJlT25FbnRlciA9IChzY2VuZTogU2NlbmUpID0+IHtcclxuICAgIC8vIElmIHdlIGFyZSBub3QgaW4gYSBicm93c2VyLCBkbyBub3RoaW5nXHJcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGNhcHR1cmVPbkVudGVyQ291bnQgPT09IDApIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgb25Qb2ludGVyTW92ZSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgb25Qb2ludGVyTW92ZSk7XHJcbiAgICAgICAgX3NjZW5lID0gX3NjZW5lID8/IHNjZW5lO1xyXG4gICAgICAgIExvZ2dlci5Mb2coXCJQb2ludGVyRXZlbnRzQ2FwdHVyZUJlaGF2aW9yOiBTdGFydGluZyBvYnNlcnZhdGlvbiBvZiBwb2ludGVyIG1vdmUgZXZlbnRzLlwiKTtcclxuICAgICAgICBfc2NlbmUub25EaXNwb3NlT2JzZXJ2YWJsZS5hZGQoZG9TdG9wQ2FwdHVyZU9uRW50ZXIpO1xyXG4gICAgfVxyXG4gICAgY2FwdHVyZU9uRW50ZXJDb3VudCsrO1xyXG59O1xyXG5cclxuY29uc3QgZG9TdG9wQ2FwdHVyZU9uRW50ZXIgPSAoKSA9PiB7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgb25Qb2ludGVyTW92ZSk7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCBvblBvaW50ZXJNb3ZlKTtcclxuICAgIF9zY2VuZSA9IG51bGw7XHJcbiAgICBMb2dnZXIuTG9nKFwiUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvcjogU3RvcHBpbmcgb2JzZXJ2YXRpb24gb2YgcG9pbnRlciBtb3ZlIGV2ZW50cy5cIik7XHJcbiAgICBjYXB0dXJlT25FbnRlckNvdW50ID0gMDtcclxufTtcclxuXHJcbmNvbnN0IHN0b3BDYXB0dXJlT25FbnRlciA9ICgpID0+IHtcclxuICAgIC8vIElmIHdlIGFyZSBub3QgaW4gYSBicm93c2VyLCBkbyBub3RoaW5nXHJcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHdlIGFyZSBub3Qgb2JzZXJ2aW5nIHBvaW50ZXIgbW92ZW1lbnQsIGRvIG5vdGhpbmdcclxuICAgIGlmICghX3NjZW5lKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNhcHR1cmVPbkVudGVyQ291bnQtLTtcclxuICAgIGlmIChjYXB0dXJlT25FbnRlckNvdW50IDw9IDApIHtcclxuICAgICAgICBkb1N0b3BDYXB0dXJlT25FbnRlcigpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuLy8gTW9kdWxlIGxldmVsIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGVudGVyZWQgbWVzaCBzaG91bGQgY2FwdHVyZSBwb2ludGVyIGV2ZW50c1xyXG5jb25zdCBvblBvaW50ZXJNb3ZlID0gKGV2dDogUG9pbnRlckV2ZW50IHwgVG91Y2hFdmVudCkgPT4ge1xyXG4gICAgaWYgKCFfc2NlbmUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2FudmFzUmVjdCA9IF9zY2VuZS5nZXRFbmdpbmUoKS5nZXRSZW5kZXJpbmdDYW52YXNDbGllbnRSZWN0KCk7XHJcbiAgICBpZiAoIWNhbnZhc1JlY3QpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR2V0IHRoZSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgY2xpZW50IFggYW5kIFkgZnJvbSBlaXRoZXIgdGhlIHBvaW50ZXIgZXZlbnQgb3IgZnJvbSB0aGVcclxuICAgIC8vIFRvdWNoRXZlbnQgdG91Y2hcclxuICAgIGNvbnN0IHsgY2xpZW50WCwgY2xpZW50WSB9ID0gXCJ0b3VjaGVzXCIgaW4gZXZ0ID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQ7XHJcblxyXG4gICAgLy8gZ2V0IHRoZSBwaWNrZWQgbWVzaCwgaWYgYW55XHJcbiAgICBjb25zdCBwb2ludGVyU2NyZWVuWCA9IGNsaWVudFggLSBjYW52YXNSZWN0LmxlZnQ7XHJcbiAgICBjb25zdCBwb2ludGVyU2NyZWVuWSA9IGNsaWVudFkgLSBjYW52YXNSZWN0LnRvcDtcclxuXHJcbiAgICBsZXQgcG9pbnRlckNhcHR1cmVCZWhhdmlvcjogUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciB8IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHBpY2tSZXN1bHQgPSBfc2NlbmUucGljayhwb2ludGVyU2NyZWVuWCwgcG9pbnRlclNjcmVlblksIChtZXNoKSA9PiB7XHJcbiAgICAgICAgLy8gSWYgdGhlIG1lc2ggaGFzIGFuIGluc3RhbmNlIG9mIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgYXR0YWNoZWQgdG8gaXQsXHJcbiAgICAgICAgLy8gYW5kIGNhcHR1cmUgb24gcG9pbnRlciBlbnRlciBpcyB0cnVlLCB0aGVuIHdlIHdhbnQgdG8gcGljayBpdFxyXG4gICAgICAgIGNvbnN0IHBvaW50ZXJDYXB0dXJlQmVoYXZpb3IgPSBtZXNoVG9CZWhhdmlvck1hcC5nZXQobWVzaCk7XHJcbiAgICAgICAgcmV0dXJuIG1lc2guaXNFbmFibGVkKCkgJiYgdHlwZW9mIHBvaW50ZXJDYXB0dXJlQmVoYXZpb3IgIT09IFwidW5kZWZpbmVkXCIgJiYgcG9pbnRlckNhcHR1cmVCZWhhdmlvci5fY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IHBpY2tlZE1lc2g6IEFic3RyYWN0TWVzaCB8IG51bGw7XHJcbiAgICBpZiAocGlja1Jlc3VsdC5oaXQpIHtcclxuICAgICAgICBwaWNrZWRNZXNoID0gcGlja1Jlc3VsdC5waWNrZWRNZXNoO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBwaWNrZWRNZXNoID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjYXB0dXJpbmdJZEFzSW50ID0gcGFyc2VJbnQoZ2V0Q2FwdHVyaW5nSWQoKSB8fCBcIlwiKTtcclxuXHJcbiAgICAvLyBpZiB0aGUgcGlja2VkIG1lc2ggaXMgdGhlIGN1cnJlbnQgY2FwdHVyaW5nIG1lc2gsIGRvIG5vdGhpbmdcclxuICAgIGlmIChwaWNrZWRNZXNoICYmIHBpY2tlZE1lc2gudW5pcXVlSWQgPT09IGNhcHR1cmluZ0lkQXNJbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBjYXB0dXJpbmcgbWVzaCBhbmQgaXQgaXMgbm90IHRoZSBjdXJyZW50IHBpY2tlZCBtZXNoLCBvciBub1xyXG4gICAgLy8gbWVzaCBpcyBwaWNrZWQsIHJlbGVhc2UgdGhlIGNhcHR1cmluZyBtZXNoXHJcbiAgICBpZiAoY2FwdHVyaW5nSWRBc0ludCAmJiAoIXBpY2tlZE1lc2ggfHwgcGlja2VkTWVzaC51bmlxdWVJZCAhPT0gY2FwdHVyaW5nSWRBc0ludCkpIHtcclxuICAgICAgICByZWxlYXNlQ3VycmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZXJlIGlzIGEgcGlja2VkIG1lc2ggYW5kIGl0IGlzIG5vdCB0aGUgY3VycmVudCBjYXB0dXJpbmcgbWVzaCwgY2FwdHVyZVxyXG4gICAgLy8gdGhlIHBvaW50ZXIgZXZlbnRzLiAgTm90ZSB0aGF0IHRoZSBjdXJyZW50IGNhcHR1cmluZyBtZXNoIGhhcyBhbHJlYWR5IGJlZW5cclxuICAgIC8vIHJlbGVhc2VkIGFib3ZlXHJcbiAgICBpZiAocGlja2VkTWVzaCkge1xyXG4gICAgICAgIHBvaW50ZXJDYXB0dXJlQmVoYXZpb3IgPSBtZXNoVG9CZWhhdmlvck1hcC5nZXQocGlja2VkTWVzaCk7XHJcbiAgICAgICAgcG9pbnRlckNhcHR1cmVCZWhhdmlvciEuY2FwdHVyZVBvaW50ZXJFdmVudHMoKTtcclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBCZWhhdmlvciBmb3IgYW55IGNvbnRlbnQgdGhhdCBjYW4gY2FwdHVyZSBwb2ludGVyIGV2ZW50cywgaS5lLiBieXBhc3MgdGhlIEJhYnlsb24gcG9pbnRlciBldmVudCBoYW5kbGluZ1xyXG4gKiBhbmQgcmVjZWl2ZSBwb2ludGVyIGV2ZW50cyBkaXJlY3RseS4gIEl0IHdpbGwgcmVnaXN0ZXIgdGhlIGNhcHR1cmUgdHJpZ2dlcnMgYW5kIG5lZ290aWF0ZSB0aGUgY2FwdHVyZSBhbmRcclxuICogcmVsZWFzZSBvZiBwb2ludGVyIGV2ZW50cy4gIEN1cmVybnRseSB0aGlzIGFwcGxpZXMgb25seSB0byBIdG1sTWVzaFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFBvaW50ZXJFdmVudHNDYXB0dXJlQmVoYXZpb3IgaW1wbGVtZW50cyBCZWhhdmlvcjxBYnN0cmFjdE1lc2g+IHtcclxuICAgIC8qKiBnZXRzIG9yIHNldHMgYmVoYXZpb3IncyBuYW1lICovXHJcbiAgICBwdWJsaWMgbmFtZSA9IFwiUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvclwiO1xyXG5cclxuICAgIHByaXZhdGUgX2F0dGFjaGVkTWVzaDogQWJzdHJhY3RNZXNoIHwgbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHB1YmxpYyBfY2FwdHVyZU9uUG9pbnRlckVudGVyOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSBtZXNoIHRoYXQgdGhlIGJlaGF2aW9yIGlzIGF0dGFjaGVkIHRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYXR0YWNoZWRNZXNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2hlZE1lc2g7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBhdHRhY2hlZE1lc2godmFsdWU6IEFic3RyYWN0TWVzaCB8IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9hdHRhY2hlZE1lc2ggPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIF9jYXB0dXJlQ2FsbGJhY2s6ICgpID0+IHZvaWQsXHJcbiAgICAgICAgcHJpdmF0ZSBfcmVsZWFzZUNhbGxiYWNrOiAoKSA9PiB2b2lkLFxyXG4gICAgICAgIHsgY2FwdHVyZU9uUG9pbnRlckVudGVyID0gdHJ1ZSB9ID0ge31cclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuX2F0dGFjaGVkTWVzaCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyID0gY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG5cclxuICAgICAgICAvLyBXYXJuIGlmIHdlIGFyZSBub3QgaW4gYSBicm93c2VyXHJcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICBMb2dnZXIuV2FybihgQ3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgUG9pbnRlckV2ZW50c0NhcHR1cmVCZWhhdmlvciBvdXRzaWRlIG9mIGEgYnJvd3Nlci4gIFRoZSBiZWhhdmlvciB3aWxsIG5vdCB3b3JrLmApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCBpZiB0aGUgYmVoYXZpb3Igc2hvdWxkIGNhcHR1cmUgcG9pbnRlciBldmVudHMgd2hlbiB0aGUgcG9pbnRlciBlbnRlcnMgdGhlIG1lc2hcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBjYXB0dXJlT25Qb2ludGVyRW50ZXIoY2FwdHVyZU9uUG9pbnRlckVudGVyOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlciA9PT0gY2FwdHVyZU9uUG9pbnRlckVudGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyID0gY2FwdHVyZU9uUG9pbnRlckVudGVyO1xyXG4gICAgICAgIGlmICh0aGlzLl9hdHRhY2hlZE1lc2gpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NhcHR1cmVPblBvaW50ZXJFbnRlcikge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRDYXB0dXJlT25FbnRlcih0aGlzLl9hdHRhY2hlZE1lc2guZ2V0U2NlbmUoKSEpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RvcENhcHR1cmVPbkVudGVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgYmVoYXZpb3IgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgKGJlZm9yZSBhdHRhY2hpbmcgaXQgdG8gYSB0YXJnZXQpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbml0KCkge31cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBiZWhhdmlvciBpcyBhdHRhY2hlZCB0byBhIHRhcmdldFxyXG4gICAgICogQHBhcmFtIG1lc2ggZGVmaW5lcyB0aGUgdGFyZ2V0IHdoZXJlIHRoZSBiZWhhdmlvciBpcyBhdHRhY2hlZCB0b1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXR0YWNoKG1lc2g6IEFic3RyYWN0TWVzaCkge1xyXG4gICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSB0byB0aGlzIGJlaGF2aW9yIG9uIHRoZSBtZXNoLiAgV2UgZG8gdGhpcyBzbyB3ZSBjYW4gZ2V0IGFcclxuICAgICAgICAvLyByZWZlcmVuY2UgdG8gdGhlIGJlaGF2aW9yIGluIHRoZSBvblBvaW50ZXJNb3ZlIGZ1bmN0aW9uIHdpdGhvdXQgcmVseWluZyBvblxyXG4gICAgICAgIC8vIGdldEJlaGF2aW9yQnlOYW1lKCksIHdoaWNoIGRvZXMgYSBsaW5lYXIgc2VhcmNoIG9mIHRoZSBiZWhhdmlvcnMgYXJyYXkuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hlZE1lc2ggPSBtZXNoO1xyXG4gICAgICAgIG1lc2hUb0JlaGF2aW9yTWFwLnNldChtZXNoLCB0aGlzKTtcclxuICAgICAgICBpZiAodGhpcy5fY2FwdHVyZU9uUG9pbnRlckVudGVyKSB7XHJcbiAgICAgICAgICAgIHN0YXJ0Q2FwdHVyZU9uRW50ZXIobWVzaC5nZXRTY2VuZSgpISk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIGJlaGF2aW9yIGlzIGRldGFjaGVkIGZyb20gaXRzIHRhcmdldFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGV0YWNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5hdHRhY2hlZE1lc2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBSZW1vdmUgdGhlIHJlZmVyZW5jZSB0byB0aGlzIGJlaGF2aW9yIGZyb20gdGhlIG1lc2hcclxuICAgICAgICBtZXNoVG9CZWhhdmlvck1hcC5kZWxldGUodGhpcy5hdHRhY2hlZE1lc2gpO1xyXG4gICAgICAgIGlmICh0aGlzLl9jYXB0dXJlT25Qb2ludGVyRW50ZXIpIHtcclxuICAgICAgICAgICAgc3RvcENhcHR1cmVPbkVudGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXR0YWNoZWRNZXNoID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3Bvc2UgdGhlIGJlaGF2aW9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwb3NlKCkge1xyXG4gICAgICAgIHRoaXMuZGV0YWNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVsZWFzZSBwb2ludGVyIGV2ZW50c1xyXG4gICAgcHVibGljIHJlbGVhc2VQb2ludGVyRXZlbnRzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5hdHRhY2hlZE1lc2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXF1ZXN0UmVsZWFzZSh0aGlzLmF0dGFjaGVkTWVzaC51bmlxdWVJZC50b1N0cmluZygpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYXB0dXJlIHBvaW50ZXIgZXZlbnRzXHJcbiAgICBwdWJsaWMgY2FwdHVyZVBvaW50ZXJFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmF0dGFjaGVkTWVzaCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcXVlc3RDYXB0dXJlKHRoaXMuYXR0YWNoZWRNZXNoLnVuaXF1ZUlkLnRvU3RyaW5nKCksIHRoaXMuX2NhcHR1cmVDYWxsYmFjaywgdGhpcy5fcmVsZWFzZUNhbGxiYWNrKTtcclxuICAgIH1cclxufVxyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9odG1sTWVzaFwiO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NZXNoZXNfbWVzaF9fOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXNcclxuaW1wb3J0ICogYXMgYWRkb25zIGZyb20gXCJhZGRvbnMvaW5kZXhcIjtcclxuXHJcbmV4cG9ydCB7IGFkZG9ucyB9O1xyXG5leHBvcnQgZGVmYXVsdCBhZGRvbnM7XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|