Files
dev-chiefworks f76abffdcd first commit
2022-05-31 16:21:53 -04:00

18562 lines
1.4 MiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define("mitchTree", [], factory);
else if(typeof exports === 'object')
exports["mitchTree"] = factory();
else
root["d3"] = root["d3"] || {}, root["d3"]["mitchTree"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "./dist";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./src/index.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "./node_modules/d3-array/src/array.js":
/*!********************************************!*\
!*** ./node_modules/d3-array/src/array.js ***!
\********************************************/
/*! exports provided: slice, map */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice", function() { return slice; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "map", function() { return map; });
var array = Array.prototype;
var slice = array.slice;
var map = array.map;
/***/ }),
/***/ "./node_modules/d3-array/src/ascending.js":
/*!************************************************!*\
!*** ./node_modules/d3-array/src/ascending.js ***!
\************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
});
/***/ }),
/***/ "./node_modules/d3-array/src/bisect.js":
/*!*********************************************!*\
!*** ./node_modules/d3-array/src/bisect.js ***!
\*********************************************/
/*! exports provided: bisectRight, bisectLeft, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bisectRight", function() { return bisectRight; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bisectLeft", function() { return bisectLeft; });
/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ascending */ "./node_modules/d3-array/src/ascending.js");
/* harmony import */ var _bisector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bisector */ "./node_modules/d3-array/src/bisector.js");
var ascendingBisect = Object(_bisector__WEBPACK_IMPORTED_MODULE_1__["default"])(_ascending__WEBPACK_IMPORTED_MODULE_0__["default"]);
var bisectRight = ascendingBisect.right;
var bisectLeft = ascendingBisect.left;
/* harmony default export */ __webpack_exports__["default"] = (bisectRight);
/***/ }),
/***/ "./node_modules/d3-array/src/bisector.js":
/*!***********************************************!*\
!*** ./node_modules/d3-array/src/bisector.js ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ascending */ "./node_modules/d3-array/src/ascending.js");
/* harmony default export */ __webpack_exports__["default"] = (function(compare) {
if (compare.length === 1) compare = ascendingComparator(compare);
return {
left: function(a, x, lo, hi) {
if (lo == null) lo = 0;
if (hi == null) hi = a.length;
while (lo < hi) {
var mid = lo + hi >>> 1;
if (compare(a[mid], x) < 0) lo = mid + 1;
else hi = mid;
}
return lo;
},
right: function(a, x, lo, hi) {
if (lo == null) lo = 0;
if (hi == null) hi = a.length;
while (lo < hi) {
var mid = lo + hi >>> 1;
if (compare(a[mid], x) > 0) hi = mid;
else lo = mid + 1;
}
return lo;
}
};
});
function ascendingComparator(f) {
return function(d, x) {
return Object(_ascending__WEBPACK_IMPORTED_MODULE_0__["default"])(f(d), x);
};
}
/***/ }),
/***/ "./node_modules/d3-array/src/constant.js":
/*!***********************************************!*\
!*** ./node_modules/d3-array/src/constant.js ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(x) {
return function() {
return x;
};
});
/***/ }),
/***/ "./node_modules/d3-array/src/cross.js":
/*!********************************************!*\
!*** ./node_modules/d3-array/src/cross.js ***!
\********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _pairs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pairs */ "./node_modules/d3-array/src/pairs.js");
/* harmony default export */ __webpack_exports__["default"] = (function(values0, values1, reduce) {
var n0 = values0.length,
n1 = values1.length,
values = new Array(n0 * n1),
i0,
i1,
i,
value0;
if (reduce == null) reduce = _pairs__WEBPACK_IMPORTED_MODULE_0__["pair"];
for (i0 = i = 0; i0 < n0; ++i0) {
for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {
values[i] = reduce(value0, values1[i1]);
}
}
return values;
});
/***/ }),
/***/ "./node_modules/d3-array/src/descending.js":
/*!*************************************************!*\
!*** ./node_modules/d3-array/src/descending.js ***!
\*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
});
/***/ }),
/***/ "./node_modules/d3-array/src/deviation.js":
/*!************************************************!*\
!*** ./node_modules/d3-array/src/deviation.js ***!
\************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _variance__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./variance */ "./node_modules/d3-array/src/variance.js");
/* harmony default export */ __webpack_exports__["default"] = (function(array, f) {
var v = Object(_variance__WEBPACK_IMPORTED_MODULE_0__["default"])(array, f);
return v ? Math.sqrt(v) : v;
});
/***/ }),
/***/ "./node_modules/d3-array/src/extent.js":
/*!*********************************************!*\
!*** ./node_modules/d3-array/src/extent.js ***!
\*********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(values, valueof) {
var n = values.length,
i = -1,
value,
min,
max;
if (valueof == null) {
while (++i < n) { // Find the first comparable value.
if ((value = values[i]) != null && value >= value) {
min = max = value;
while (++i < n) { // Compare the remaining values.
if ((value = values[i]) != null) {
if (min > value) min = value;
if (max < value) max = value;
}
}
}
}
}
else {
while (++i < n) { // Find the first comparable value.
if ((value = valueof(values[i], i, values)) != null && value >= value) {
min = max = value;
while (++i < n) { // Compare the remaining values.
if ((value = valueof(values[i], i, values)) != null) {
if (min > value) min = value;
if (max < value) max = value;
}
}
}
}
}
return [min, max];
});
/***/ }),
/***/ "./node_modules/d3-array/src/histogram.js":
/*!************************************************!*\
!*** ./node_modules/d3-array/src/histogram.js ***!
\************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./array */ "./node_modules/d3-array/src/array.js");
/* harmony import */ var _bisect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bisect */ "./node_modules/d3-array/src/bisect.js");
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-array/src/constant.js");
/* harmony import */ var _extent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./extent */ "./node_modules/d3-array/src/extent.js");
/* harmony import */ var _identity__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./identity */ "./node_modules/d3-array/src/identity.js");
/* harmony import */ var _range__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./range */ "./node_modules/d3-array/src/range.js");
/* harmony import */ var _ticks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ticks */ "./node_modules/d3-array/src/ticks.js");
/* harmony import */ var _threshold_sturges__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./threshold/sturges */ "./node_modules/d3-array/src/threshold/sturges.js");
/* harmony default export */ __webpack_exports__["default"] = (function() {
var value = _identity__WEBPACK_IMPORTED_MODULE_4__["default"],
domain = _extent__WEBPACK_IMPORTED_MODULE_3__["default"],
threshold = _threshold_sturges__WEBPACK_IMPORTED_MODULE_7__["default"];
function histogram(data) {
var i,
n = data.length,
x,
values = new Array(n);
for (i = 0; i < n; ++i) {
values[i] = value(data[i], i, data);
}
var xz = domain(values),
x0 = xz[0],
x1 = xz[1],
tz = threshold(values, x0, x1);
// Convert number of thresholds into uniform thresholds.
if (!Array.isArray(tz)) {
tz = Object(_ticks__WEBPACK_IMPORTED_MODULE_6__["tickStep"])(x0, x1, tz);
tz = Object(_range__WEBPACK_IMPORTED_MODULE_5__["default"])(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive
}
// Remove any thresholds outside the domain.
var m = tz.length;
while (tz[0] <= x0) tz.shift(), --m;
while (tz[m - 1] > x1) tz.pop(), --m;
var bins = new Array(m + 1),
bin;
// Initialize bins.
for (i = 0; i <= m; ++i) {
bin = bins[i] = [];
bin.x0 = i > 0 ? tz[i - 1] : x0;
bin.x1 = i < m ? tz[i] : x1;
}
// Assign data to bins by value, ignoring any outside the domain.
for (i = 0; i < n; ++i) {
x = values[i];
if (x0 <= x && x <= x1) {
bins[Object(_bisect__WEBPACK_IMPORTED_MODULE_1__["default"])(tz, x, 0, m)].push(data[i]);
}
}
return bins;
}
histogram.value = function(_) {
return arguments.length ? (value = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_2__["default"])(_), histogram) : value;
};
histogram.domain = function(_) {
return arguments.length ? (domain = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_2__["default"])([_[0], _[1]]), histogram) : domain;
};
histogram.thresholds = function(_) {
return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? Object(_constant__WEBPACK_IMPORTED_MODULE_2__["default"])(_array__WEBPACK_IMPORTED_MODULE_0__["slice"].call(_)) : Object(_constant__WEBPACK_IMPORTED_MODULE_2__["default"])(_), histogram) : threshold;
};
return histogram;
});
/***/ }),
/***/ "./node_modules/d3-array/src/identity.js":
/*!***********************************************!*\
!*** ./node_modules/d3-array/src/identity.js ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(x) {
return x;
});
/***/ }),
/***/ "./node_modules/d3-array/src/index.js":
/*!********************************************!*\
!*** ./node_modules/d3-array/src/index.js ***!
\********************************************/
/*! exports provided: bisect, bisectRight, bisectLeft, ascending, bisector, cross, descending, deviation, extent, histogram, thresholdFreedmanDiaconis, thresholdScott, thresholdSturges, max, mean, median, merge, min, pairs, permute, quantile, range, scan, shuffle, sum, ticks, tickIncrement, tickStep, transpose, variance, zip */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _bisect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bisect */ "./node_modules/d3-array/src/bisect.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bisect", function() { return _bisect__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bisectRight", function() { return _bisect__WEBPACK_IMPORTED_MODULE_0__["bisectRight"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bisectLeft", function() { return _bisect__WEBPACK_IMPORTED_MODULE_0__["bisectLeft"]; });
/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ascending */ "./node_modules/d3-array/src/ascending.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ascending", function() { return _ascending__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/* harmony import */ var _bisector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./bisector */ "./node_modules/d3-array/src/bisector.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bisector", function() { return _bisector__WEBPACK_IMPORTED_MODULE_2__["default"]; });
/* harmony import */ var _cross__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./cross */ "./node_modules/d3-array/src/cross.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cross", function() { return _cross__WEBPACK_IMPORTED_MODULE_3__["default"]; });
/* harmony import */ var _descending__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./descending */ "./node_modules/d3-array/src/descending.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "descending", function() { return _descending__WEBPACK_IMPORTED_MODULE_4__["default"]; });
/* harmony import */ var _deviation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./deviation */ "./node_modules/d3-array/src/deviation.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "deviation", function() { return _deviation__WEBPACK_IMPORTED_MODULE_5__["default"]; });
/* harmony import */ var _extent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./extent */ "./node_modules/d3-array/src/extent.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "extent", function() { return _extent__WEBPACK_IMPORTED_MODULE_6__["default"]; });
/* harmony import */ var _histogram__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./histogram */ "./node_modules/d3-array/src/histogram.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "histogram", function() { return _histogram__WEBPACK_IMPORTED_MODULE_7__["default"]; });
/* harmony import */ var _threshold_freedmanDiaconis__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./threshold/freedmanDiaconis */ "./node_modules/d3-array/src/threshold/freedmanDiaconis.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "thresholdFreedmanDiaconis", function() { return _threshold_freedmanDiaconis__WEBPACK_IMPORTED_MODULE_8__["default"]; });
/* harmony import */ var _threshold_scott__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./threshold/scott */ "./node_modules/d3-array/src/threshold/scott.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "thresholdScott", function() { return _threshold_scott__WEBPACK_IMPORTED_MODULE_9__["default"]; });
/* harmony import */ var _threshold_sturges__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./threshold/sturges */ "./node_modules/d3-array/src/threshold/sturges.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "thresholdSturges", function() { return _threshold_sturges__WEBPACK_IMPORTED_MODULE_10__["default"]; });
/* harmony import */ var _max__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./max */ "./node_modules/d3-array/src/max.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return _max__WEBPACK_IMPORTED_MODULE_11__["default"]; });
/* harmony import */ var _mean__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./mean */ "./node_modules/d3-array/src/mean.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mean", function() { return _mean__WEBPACK_IMPORTED_MODULE_12__["default"]; });
/* harmony import */ var _median__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./median */ "./node_modules/d3-array/src/median.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "median", function() { return _median__WEBPACK_IMPORTED_MODULE_13__["default"]; });
/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./merge */ "./node_modules/d3-array/src/merge.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _merge__WEBPACK_IMPORTED_MODULE_14__["default"]; });
/* harmony import */ var _min__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./min */ "./node_modules/d3-array/src/min.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return _min__WEBPACK_IMPORTED_MODULE_15__["default"]; });
/* harmony import */ var _pairs__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./pairs */ "./node_modules/d3-array/src/pairs.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return _pairs__WEBPACK_IMPORTED_MODULE_16__["default"]; });
/* harmony import */ var _permute__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./permute */ "./node_modules/d3-array/src/permute.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "permute", function() { return _permute__WEBPACK_IMPORTED_MODULE_17__["default"]; });
/* harmony import */ var _quantile__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./quantile */ "./node_modules/d3-array/src/quantile.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "quantile", function() { return _quantile__WEBPACK_IMPORTED_MODULE_18__["default"]; });
/* harmony import */ var _range__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./range */ "./node_modules/d3-array/src/range.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "range", function() { return _range__WEBPACK_IMPORTED_MODULE_19__["default"]; });
/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./scan */ "./node_modules/d3-array/src/scan.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return _scan__WEBPACK_IMPORTED_MODULE_20__["default"]; });
/* harmony import */ var _shuffle__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./shuffle */ "./node_modules/d3-array/src/shuffle.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shuffle", function() { return _shuffle__WEBPACK_IMPORTED_MODULE_21__["default"]; });
/* harmony import */ var _sum__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./sum */ "./node_modules/d3-array/src/sum.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sum", function() { return _sum__WEBPACK_IMPORTED_MODULE_22__["default"]; });
/* harmony import */ var _ticks__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./ticks */ "./node_modules/d3-array/src/ticks.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ticks", function() { return _ticks__WEBPACK_IMPORTED_MODULE_23__["default"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tickIncrement", function() { return _ticks__WEBPACK_IMPORTED_MODULE_23__["tickIncrement"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tickStep", function() { return _ticks__WEBPACK_IMPORTED_MODULE_23__["tickStep"]; });
/* harmony import */ var _transpose__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./transpose */ "./node_modules/d3-array/src/transpose.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "transpose", function() { return _transpose__WEBPACK_IMPORTED_MODULE_24__["default"]; });
/* harmony import */ var _variance__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./variance */ "./node_modules/d3-array/src/variance.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "variance", function() { return _variance__WEBPACK_IMPORTED_MODULE_25__["default"]; });
/* harmony import */ var _zip__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./zip */ "./node_modules/d3-array/src/zip.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _zip__WEBPACK_IMPORTED_MODULE_26__["default"]; });
/***/ }),
/***/ "./node_modules/d3-array/src/max.js":
/*!******************************************!*\
!*** ./node_modules/d3-array/src/max.js ***!
\******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(values, valueof) {
var n = values.length,
i = -1,
value,
max;
if (valueof == null) {
while (++i < n) { // Find the first comparable value.
if ((value = values[i]) != null && value >= value) {
max = value;
while (++i < n) { // Compare the remaining values.
if ((value = values[i]) != null && value > max) {
max = value;
}
}
}
}
}
else {
while (++i < n) { // Find the first comparable value.
if ((value = valueof(values[i], i, values)) != null && value >= value) {
max = value;
while (++i < n) { // Compare the remaining values.
if ((value = valueof(values[i], i, values)) != null && value > max) {
max = value;
}
}
}
}
}
return max;
});
/***/ }),
/***/ "./node_modules/d3-array/src/mean.js":
/*!*******************************************!*\
!*** ./node_modules/d3-array/src/mean.js ***!
\*******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./number */ "./node_modules/d3-array/src/number.js");
/* harmony default export */ __webpack_exports__["default"] = (function(values, valueof) {
var n = values.length,
m = n,
i = -1,
value,
sum = 0;
if (valueof == null) {
while (++i < n) {
if (!isNaN(value = Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(values[i]))) sum += value;
else --m;
}
}
else {
while (++i < n) {
if (!isNaN(value = Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(valueof(values[i], i, values)))) sum += value;
else --m;
}
}
if (m) return sum / m;
});
/***/ }),
/***/ "./node_modules/d3-array/src/median.js":
/*!*********************************************!*\
!*** ./node_modules/d3-array/src/median.js ***!
\*********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ascending */ "./node_modules/d3-array/src/ascending.js");
/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./number */ "./node_modules/d3-array/src/number.js");
/* harmony import */ var _quantile__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./quantile */ "./node_modules/d3-array/src/quantile.js");
/* harmony default export */ __webpack_exports__["default"] = (function(values, valueof) {
var n = values.length,
i = -1,
value,
numbers = [];
if (valueof == null) {
while (++i < n) {
if (!isNaN(value = Object(_number__WEBPACK_IMPORTED_MODULE_1__["default"])(values[i]))) {
numbers.push(value);
}
}
}
else {
while (++i < n) {
if (!isNaN(value = Object(_number__WEBPACK_IMPORTED_MODULE_1__["default"])(valueof(values[i], i, values)))) {
numbers.push(value);
}
}
}
return Object(_quantile__WEBPACK_IMPORTED_MODULE_2__["default"])(numbers.sort(_ascending__WEBPACK_IMPORTED_MODULE_0__["default"]), 0.5);
});
/***/ }),
/***/ "./node_modules/d3-array/src/merge.js":
/*!********************************************!*\
!*** ./node_modules/d3-array/src/merge.js ***!
\********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(arrays) {
var n = arrays.length,
m,
i = -1,
j = 0,
merged,
array;
while (++i < n) j += arrays[i].length;
merged = new Array(j);
while (--n >= 0) {
array = arrays[n];
m = array.length;
while (--m >= 0) {
merged[--j] = array[m];
}
}
return merged;
});
/***/ }),
/***/ "./node_modules/d3-array/src/min.js":
/*!******************************************!*\
!*** ./node_modules/d3-array/src/min.js ***!
\******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(values, valueof) {
var n = values.length,
i = -1,
value,
min;
if (valueof == null) {
while (++i < n) { // Find the first comparable value.
if ((value = values[i]) != null && value >= value) {
min = value;
while (++i < n) { // Compare the remaining values.
if ((value = values[i]) != null && min > value) {
min = value;
}
}
}
}
}
else {
while (++i < n) { // Find the first comparable value.
if ((value = valueof(values[i], i, values)) != null && value >= value) {
min = value;
while (++i < n) { // Compare the remaining values.
if ((value = valueof(values[i], i, values)) != null && min > value) {
min = value;
}
}
}
}
}
return min;
});
/***/ }),
/***/ "./node_modules/d3-array/src/number.js":
/*!*********************************************!*\
!*** ./node_modules/d3-array/src/number.js ***!
\*********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(x) {
return x === null ? NaN : +x;
});
/***/ }),
/***/ "./node_modules/d3-array/src/pairs.js":
/*!********************************************!*\
!*** ./node_modules/d3-array/src/pairs.js ***!
\********************************************/
/*! exports provided: default, pair */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pair", function() { return pair; });
/* harmony default export */ __webpack_exports__["default"] = (function(array, f) {
if (f == null) f = pair;
var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
while (i < n) pairs[i] = f(p, p = array[++i]);
return pairs;
});
function pair(a, b) {
return [a, b];
}
/***/ }),
/***/ "./node_modules/d3-array/src/permute.js":
/*!**********************************************!*\
!*** ./node_modules/d3-array/src/permute.js ***!
\**********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(array, indexes) {
var i = indexes.length, permutes = new Array(i);
while (i--) permutes[i] = array[indexes[i]];
return permutes;
});
/***/ }),
/***/ "./node_modules/d3-array/src/quantile.js":
/*!***********************************************!*\
!*** ./node_modules/d3-array/src/quantile.js ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./number */ "./node_modules/d3-array/src/number.js");
/* harmony default export */ __webpack_exports__["default"] = (function(values, p, valueof) {
if (valueof == null) valueof = _number__WEBPACK_IMPORTED_MODULE_0__["default"];
if (!(n = values.length)) return;
if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
if (p >= 1) return +valueof(values[n - 1], n - 1, values);
var n,
i = (n - 1) * p,
i0 = Math.floor(i),
value0 = +valueof(values[i0], i0, values),
value1 = +valueof(values[i0 + 1], i0 + 1, values);
return value0 + (value1 - value0) * (i - i0);
});
/***/ }),
/***/ "./node_modules/d3-array/src/range.js":
/*!********************************************!*\
!*** ./node_modules/d3-array/src/range.js ***!
\********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(start, stop, step) {
start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
var i = -1,
n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
range = new Array(n);
while (++i < n) {
range[i] = start + i * step;
}
return range;
});
/***/ }),
/***/ "./node_modules/d3-array/src/scan.js":
/*!*******************************************!*\
!*** ./node_modules/d3-array/src/scan.js ***!
\*******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ascending */ "./node_modules/d3-array/src/ascending.js");
/* harmony default export */ __webpack_exports__["default"] = (function(values, compare) {
if (!(n = values.length)) return;
var n,
i = 0,
j = 0,
xi,
xj = values[j];
if (compare == null) compare = _ascending__WEBPACK_IMPORTED_MODULE_0__["default"];
while (++i < n) {
if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
xj = xi, j = i;
}
}
if (compare(xj, xj) === 0) return j;
});
/***/ }),
/***/ "./node_modules/d3-array/src/shuffle.js":
/*!**********************************************!*\
!*** ./node_modules/d3-array/src/shuffle.js ***!
\**********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(array, i0, i1) {
var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
t,
i;
while (m) {
i = Math.random() * m-- | 0;
t = array[m + i0];
array[m + i0] = array[i + i0];
array[i + i0] = t;
}
return array;
});
/***/ }),
/***/ "./node_modules/d3-array/src/sum.js":
/*!******************************************!*\
!*** ./node_modules/d3-array/src/sum.js ***!
\******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(values, valueof) {
var n = values.length,
i = -1,
value,
sum = 0;
if (valueof == null) {
while (++i < n) {
if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
}
}
else {
while (++i < n) {
if (value = +valueof(values[i], i, values)) sum += value;
}
}
return sum;
});
/***/ }),
/***/ "./node_modules/d3-array/src/threshold/freedmanDiaconis.js":
/*!*****************************************************************!*\
!*** ./node_modules/d3-array/src/threshold/freedmanDiaconis.js ***!
\*****************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../array */ "./node_modules/d3-array/src/array.js");
/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ascending */ "./node_modules/d3-array/src/ascending.js");
/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../number */ "./node_modules/d3-array/src/number.js");
/* harmony import */ var _quantile__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../quantile */ "./node_modules/d3-array/src/quantile.js");
/* harmony default export */ __webpack_exports__["default"] = (function(values, min, max) {
values = _array__WEBPACK_IMPORTED_MODULE_0__["map"].call(values, _number__WEBPACK_IMPORTED_MODULE_2__["default"]).sort(_ascending__WEBPACK_IMPORTED_MODULE_1__["default"]);
return Math.ceil((max - min) / (2 * (Object(_quantile__WEBPACK_IMPORTED_MODULE_3__["default"])(values, 0.75) - Object(_quantile__WEBPACK_IMPORTED_MODULE_3__["default"])(values, 0.25)) * Math.pow(values.length, -1 / 3)));
});
/***/ }),
/***/ "./node_modules/d3-array/src/threshold/scott.js":
/*!******************************************************!*\
!*** ./node_modules/d3-array/src/threshold/scott.js ***!
\******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _deviation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../deviation */ "./node_modules/d3-array/src/deviation.js");
/* harmony default export */ __webpack_exports__["default"] = (function(values, min, max) {
return Math.ceil((max - min) / (3.5 * Object(_deviation__WEBPACK_IMPORTED_MODULE_0__["default"])(values) * Math.pow(values.length, -1 / 3)));
});
/***/ }),
/***/ "./node_modules/d3-array/src/threshold/sturges.js":
/*!********************************************************!*\
!*** ./node_modules/d3-array/src/threshold/sturges.js ***!
\********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(values) {
return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
});
/***/ }),
/***/ "./node_modules/d3-array/src/ticks.js":
/*!********************************************!*\
!*** ./node_modules/d3-array/src/ticks.js ***!
\********************************************/
/*! exports provided: default, tickIncrement, tickStep */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tickIncrement", function() { return tickIncrement; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tickStep", function() { return tickStep; });
var e10 = Math.sqrt(50),
e5 = Math.sqrt(10),
e2 = Math.sqrt(2);
/* harmony default export */ __webpack_exports__["default"] = (function(start, stop, count) {
var reverse,
i = -1,
n,
ticks,
step;
stop = +stop, start = +start, count = +count;
if (start === stop && count > 0) return [start];
if (reverse = stop < start) n = start, start = stop, stop = n;
if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
if (step > 0) {
start = Math.ceil(start / step);
stop = Math.floor(stop / step);
ticks = new Array(n = Math.ceil(stop - start + 1));
while (++i < n) ticks[i] = (start + i) * step;
} else {
start = Math.floor(start * step);
stop = Math.ceil(stop * step);
ticks = new Array(n = Math.ceil(start - stop + 1));
while (++i < n) ticks[i] = (start - i) / step;
}
if (reverse) ticks.reverse();
return ticks;
});
function tickIncrement(start, stop, count) {
var step = (stop - start) / Math.max(0, count),
power = Math.floor(Math.log(step) / Math.LN10),
error = step / Math.pow(10, power);
return power >= 0
? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
: -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
}
function tickStep(start, stop, count) {
var step0 = Math.abs(stop - start) / Math.max(0, count),
step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
error = step0 / step1;
if (error >= e10) step1 *= 10;
else if (error >= e5) step1 *= 5;
else if (error >= e2) step1 *= 2;
return stop < start ? -step1 : step1;
}
/***/ }),
/***/ "./node_modules/d3-array/src/transpose.js":
/*!************************************************!*\
!*** ./node_modules/d3-array/src/transpose.js ***!
\************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _min__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./min */ "./node_modules/d3-array/src/min.js");
/* harmony default export */ __webpack_exports__["default"] = (function(matrix) {
if (!(n = matrix.length)) return [];
for (var i = -1, m = Object(_min__WEBPACK_IMPORTED_MODULE_0__["default"])(matrix, length), transpose = new Array(m); ++i < m;) {
for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
row[j] = matrix[j][i];
}
}
return transpose;
});
function length(d) {
return d.length;
}
/***/ }),
/***/ "./node_modules/d3-array/src/variance.js":
/*!***********************************************!*\
!*** ./node_modules/d3-array/src/variance.js ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./number */ "./node_modules/d3-array/src/number.js");
/* harmony default export */ __webpack_exports__["default"] = (function(values, valueof) {
var n = values.length,
m = 0,
i = -1,
mean = 0,
value,
delta,
sum = 0;
if (valueof == null) {
while (++i < n) {
if (!isNaN(value = Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(values[i]))) {
delta = value - mean;
mean += delta / ++m;
sum += delta * (value - mean);
}
}
}
else {
while (++i < n) {
if (!isNaN(value = Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(valueof(values[i], i, values)))) {
delta = value - mean;
mean += delta / ++m;
sum += delta * (value - mean);
}
}
}
if (m > 1) return sum / (m - 1);
});
/***/ }),
/***/ "./node_modules/d3-array/src/zip.js":
/*!******************************************!*\
!*** ./node_modules/d3-array/src/zip.js ***!
\******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _transpose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./transpose */ "./node_modules/d3-array/src/transpose.js");
/* harmony default export */ __webpack_exports__["default"] = (function() {
return Object(_transpose__WEBPACK_IMPORTED_MODULE_0__["default"])(arguments);
});
/***/ }),
/***/ "./node_modules/d3-collection/src/entries.js":
/*!***************************************************!*\
!*** ./node_modules/d3-collection/src/entries.js ***!
\***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(map) {
var entries = [];
for (var key in map) entries.push({key: key, value: map[key]});
return entries;
});
/***/ }),
/***/ "./node_modules/d3-collection/src/index.js":
/*!*************************************************!*\
!*** ./node_modules/d3-collection/src/index.js ***!
\*************************************************/
/*! exports provided: nest, set, map, keys, values, entries */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _nest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./nest */ "./node_modules/d3-collection/src/nest.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "nest", function() { return _nest__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/* harmony import */ var _set__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./set */ "./node_modules/d3-collection/src/set.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "set", function() { return _set__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./map */ "./node_modules/d3-collection/src/map.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "map", function() { return _map__WEBPACK_IMPORTED_MODULE_2__["default"]; });
/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./keys */ "./node_modules/d3-collection/src/keys.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "keys", function() { return _keys__WEBPACK_IMPORTED_MODULE_3__["default"]; });
/* harmony import */ var _values__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./values */ "./node_modules/d3-collection/src/values.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "values", function() { return _values__WEBPACK_IMPORTED_MODULE_4__["default"]; });
/* harmony import */ var _entries__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./entries */ "./node_modules/d3-collection/src/entries.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "entries", function() { return _entries__WEBPACK_IMPORTED_MODULE_5__["default"]; });
/***/ }),
/***/ "./node_modules/d3-collection/src/keys.js":
/*!************************************************!*\
!*** ./node_modules/d3-collection/src/keys.js ***!
\************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(map) {
var keys = [];
for (var key in map) keys.push(key);
return keys;
});
/***/ }),
/***/ "./node_modules/d3-collection/src/map.js":
/*!***********************************************!*\
!*** ./node_modules/d3-collection/src/map.js ***!
\***********************************************/
/*! exports provided: prefix, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prefix", function() { return prefix; });
var prefix = "$";
function Map() {}
Map.prototype = map.prototype = {
constructor: Map,
has: function(key) {
return (prefix + key) in this;
},
get: function(key) {
return this[prefix + key];
},
set: function(key, value) {
this[prefix + key] = value;
return this;
},
remove: function(key) {
var property = prefix + key;
return property in this && delete this[property];
},
clear: function() {
for (var property in this) if (property[0] === prefix) delete this[property];
},
keys: function() {
var keys = [];
for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
return keys;
},
values: function() {
var values = [];
for (var property in this) if (property[0] === prefix) values.push(this[property]);
return values;
},
entries: function() {
var entries = [];
for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
return entries;
},
size: function() {
var size = 0;
for (var property in this) if (property[0] === prefix) ++size;
return size;
},
empty: function() {
for (var property in this) if (property[0] === prefix) return false;
return true;
},
each: function(f) {
for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
}
};
function map(object, f) {
var map = new Map;
// Copy constructor.
if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });
// Index array by numeric index or specified key function.
else if (Array.isArray(object)) {
var i = -1,
n = object.length,
o;
if (f == null) while (++i < n) map.set(i, object[i]);
else while (++i < n) map.set(f(o = object[i], i, object), o);
}
// Convert object to map.
else if (object) for (var key in object) map.set(key, object[key]);
return map;
}
/* harmony default export */ __webpack_exports__["default"] = (map);
/***/ }),
/***/ "./node_modules/d3-collection/src/nest.js":
/*!************************************************!*\
!*** ./node_modules/d3-collection/src/nest.js ***!
\************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./map */ "./node_modules/d3-collection/src/map.js");
/* harmony default export */ __webpack_exports__["default"] = (function() {
var keys = [],
sortKeys = [],
sortValues,
rollup,
nest;
function apply(array, depth, createResult, setResult) {
if (depth >= keys.length) {
if (sortValues != null) array.sort(sortValues);
return rollup != null ? rollup(array) : array;
}
var i = -1,
n = array.length,
key = keys[depth++],
keyValue,
value,
valuesByKey = Object(_map__WEBPACK_IMPORTED_MODULE_0__["default"])(),
values,
result = createResult();
while (++i < n) {
if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
values.push(value);
} else {
valuesByKey.set(keyValue, [value]);
}
}
valuesByKey.each(function(values, key) {
setResult(result, key, apply(values, depth, createResult, setResult));
});
return result;
}
function entries(map, depth) {
if (++depth > keys.length) return map;
var array, sortKey = sortKeys[depth - 1];
if (rollup != null && depth >= keys.length) array = map.entries();
else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
}
return nest = {
object: function(array) { return apply(array, 0, createObject, setObject); },
map: function(array) { return apply(array, 0, createMap, setMap); },
entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
key: function(d) { keys.push(d); return nest; },
sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
sortValues: function(order) { sortValues = order; return nest; },
rollup: function(f) { rollup = f; return nest; }
};
});
function createObject() {
return {};
}
function setObject(object, key, value) {
object[key] = value;
}
function createMap() {
return Object(_map__WEBPACK_IMPORTED_MODULE_0__["default"])();
}
function setMap(map, key, value) {
map.set(key, value);
}
/***/ }),
/***/ "./node_modules/d3-collection/src/set.js":
/*!***********************************************!*\
!*** ./node_modules/d3-collection/src/set.js ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./map */ "./node_modules/d3-collection/src/map.js");
function Set() {}
var proto = _map__WEBPACK_IMPORTED_MODULE_0__["default"].prototype;
Set.prototype = set.prototype = {
constructor: Set,
has: proto.has,
add: function(value) {
value += "";
this[_map__WEBPACK_IMPORTED_MODULE_0__["prefix"] + value] = value;
return this;
},
remove: proto.remove,
clear: proto.clear,
values: proto.keys,
size: proto.size,
empty: proto.empty,
each: proto.each
};
function set(object, f) {
var set = new Set;
// Copy constructor.
if (object instanceof Set) object.each(function(value) { set.add(value); });
// Otherwise, assume its an array.
else if (object) {
var i = -1, n = object.length;
if (f == null) while (++i < n) set.add(object[i]);
else while (++i < n) set.add(f(object[i], i, object));
}
return set;
}
/* harmony default export */ __webpack_exports__["default"] = (set);
/***/ }),
/***/ "./node_modules/d3-collection/src/values.js":
/*!**************************************************!*\
!*** ./node_modules/d3-collection/src/values.js ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(map) {
var values = [];
for (var key in map) values.push(map[key]);
return values;
});
/***/ }),
/***/ "./node_modules/d3-color/src/color.js":
/*!********************************************!*\
!*** ./node_modules/d3-color/src/color.js ***!
\********************************************/
/*! exports provided: Color, darker, brighter, default, rgbConvert, rgb, Rgb, hslConvert, hsl */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Color", function() { return Color; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "darker", function() { return darker; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "brighter", function() { return brighter; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return color; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rgbConvert", function() { return rgbConvert; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rgb", function() { return rgb; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Rgb", function() { return Rgb; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hslConvert", function() { return hslConvert; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hsl", function() { return hsl; });
/* harmony import */ var _define__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./define */ "./node_modules/d3-color/src/define.js");
function Color() {}
var darker = 0.7;
var brighter = 1 / darker;
var reI = "\\s*([+-]?\\d+)\\s*",
reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
reHex3 = /^#([0-9a-f]{3})$/,
reHex6 = /^#([0-9a-f]{6})$/,
reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
var named = {
aliceblue: 0xf0f8ff,
antiquewhite: 0xfaebd7,
aqua: 0x00ffff,
aquamarine: 0x7fffd4,
azure: 0xf0ffff,
beige: 0xf5f5dc,
bisque: 0xffe4c4,
black: 0x000000,
blanchedalmond: 0xffebcd,
blue: 0x0000ff,
blueviolet: 0x8a2be2,
brown: 0xa52a2a,
burlywood: 0xdeb887,
cadetblue: 0x5f9ea0,
chartreuse: 0x7fff00,
chocolate: 0xd2691e,
coral: 0xff7f50,
cornflowerblue: 0x6495ed,
cornsilk: 0xfff8dc,
crimson: 0xdc143c,
cyan: 0x00ffff,
darkblue: 0x00008b,
darkcyan: 0x008b8b,
darkgoldenrod: 0xb8860b,
darkgray: 0xa9a9a9,
darkgreen: 0x006400,
darkgrey: 0xa9a9a9,
darkkhaki: 0xbdb76b,
darkmagenta: 0x8b008b,
darkolivegreen: 0x556b2f,
darkorange: 0xff8c00,
darkorchid: 0x9932cc,
darkred: 0x8b0000,
darksalmon: 0xe9967a,
darkseagreen: 0x8fbc8f,
darkslateblue: 0x483d8b,
darkslategray: 0x2f4f4f,
darkslategrey: 0x2f4f4f,
darkturquoise: 0x00ced1,
darkviolet: 0x9400d3,
deeppink: 0xff1493,
deepskyblue: 0x00bfff,
dimgray: 0x696969,
dimgrey: 0x696969,
dodgerblue: 0x1e90ff,
firebrick: 0xb22222,
floralwhite: 0xfffaf0,
forestgreen: 0x228b22,
fuchsia: 0xff00ff,
gainsboro: 0xdcdcdc,
ghostwhite: 0xf8f8ff,
gold: 0xffd700,
goldenrod: 0xdaa520,
gray: 0x808080,
green: 0x008000,
greenyellow: 0xadff2f,
grey: 0x808080,
honeydew: 0xf0fff0,
hotpink: 0xff69b4,
indianred: 0xcd5c5c,
indigo: 0x4b0082,
ivory: 0xfffff0,
khaki: 0xf0e68c,
lavender: 0xe6e6fa,
lavenderblush: 0xfff0f5,
lawngreen: 0x7cfc00,
lemonchiffon: 0xfffacd,
lightblue: 0xadd8e6,
lightcoral: 0xf08080,
lightcyan: 0xe0ffff,
lightgoldenrodyellow: 0xfafad2,
lightgray: 0xd3d3d3,
lightgreen: 0x90ee90,
lightgrey: 0xd3d3d3,
lightpink: 0xffb6c1,
lightsalmon: 0xffa07a,
lightseagreen: 0x20b2aa,
lightskyblue: 0x87cefa,
lightslategray: 0x778899,
lightslategrey: 0x778899,
lightsteelblue: 0xb0c4de,
lightyellow: 0xffffe0,
lime: 0x00ff00,
limegreen: 0x32cd32,
linen: 0xfaf0e6,
magenta: 0xff00ff,
maroon: 0x800000,
mediumaquamarine: 0x66cdaa,
mediumblue: 0x0000cd,
mediumorchid: 0xba55d3,
mediumpurple: 0x9370db,
mediumseagreen: 0x3cb371,
mediumslateblue: 0x7b68ee,
mediumspringgreen: 0x00fa9a,
mediumturquoise: 0x48d1cc,
mediumvioletred: 0xc71585,
midnightblue: 0x191970,
mintcream: 0xf5fffa,
mistyrose: 0xffe4e1,
moccasin: 0xffe4b5,
navajowhite: 0xffdead,
navy: 0x000080,
oldlace: 0xfdf5e6,
olive: 0x808000,
olivedrab: 0x6b8e23,
orange: 0xffa500,
orangered: 0xff4500,
orchid: 0xda70d6,
palegoldenrod: 0xeee8aa,
palegreen: 0x98fb98,
paleturquoise: 0xafeeee,
palevioletred: 0xdb7093,
papayawhip: 0xffefd5,
peachpuff: 0xffdab9,
peru: 0xcd853f,
pink: 0xffc0cb,
plum: 0xdda0dd,
powderblue: 0xb0e0e6,
purple: 0x800080,
rebeccapurple: 0x663399,
red: 0xff0000,
rosybrown: 0xbc8f8f,
royalblue: 0x4169e1,
saddlebrown: 0x8b4513,
salmon: 0xfa8072,
sandybrown: 0xf4a460,
seagreen: 0x2e8b57,
seashell: 0xfff5ee,
sienna: 0xa0522d,
silver: 0xc0c0c0,
skyblue: 0x87ceeb,
slateblue: 0x6a5acd,
slategray: 0x708090,
slategrey: 0x708090,
snow: 0xfffafa,
springgreen: 0x00ff7f,
steelblue: 0x4682b4,
tan: 0xd2b48c,
teal: 0x008080,
thistle: 0xd8bfd8,
tomato: 0xff6347,
turquoise: 0x40e0d0,
violet: 0xee82ee,
wheat: 0xf5deb3,
white: 0xffffff,
whitesmoke: 0xf5f5f5,
yellow: 0xffff00,
yellowgreen: 0x9acd32
};
Object(_define__WEBPACK_IMPORTED_MODULE_0__["default"])(Color, color, {
displayable: function() {
return this.rgb().displayable();
},
hex: function() {
return this.rgb().hex();
},
toString: function() {
return this.rgb() + "";
}
});
function color(format) {
var m;
format = (format + "").trim().toLowerCase();
return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00
: (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
: (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
: (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
: (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
: (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
: (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
: (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
: named.hasOwnProperty(format) ? rgbn(named[format])
: format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
: null;
}
function rgbn(n) {
return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
}
function rgba(r, g, b, a) {
if (a <= 0) r = g = b = NaN;
return new Rgb(r, g, b, a);
}
function rgbConvert(o) {
if (!(o instanceof Color)) o = color(o);
if (!o) return new Rgb;
o = o.rgb();
return new Rgb(o.r, o.g, o.b, o.opacity);
}
function rgb(r, g, b, opacity) {
return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
}
function Rgb(r, g, b, opacity) {
this.r = +r;
this.g = +g;
this.b = +b;
this.opacity = +opacity;
}
Object(_define__WEBPACK_IMPORTED_MODULE_0__["default"])(Rgb, rgb, Object(_define__WEBPACK_IMPORTED_MODULE_0__["extend"])(Color, {
brighter: function(k) {
k = k == null ? brighter : Math.pow(brighter, k);
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
},
darker: function(k) {
k = k == null ? darker : Math.pow(darker, k);
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
},
rgb: function() {
return this;
},
displayable: function() {
return (0 <= this.r && this.r <= 255)
&& (0 <= this.g && this.g <= 255)
&& (0 <= this.b && this.b <= 255)
&& (0 <= this.opacity && this.opacity <= 1);
},
hex: function() {
return "#" + hex(this.r) + hex(this.g) + hex(this.b);
},
toString: function() {
var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
return (a === 1 ? "rgb(" : "rgba(")
+ Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
+ Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
+ Math.max(0, Math.min(255, Math.round(this.b) || 0))
+ (a === 1 ? ")" : ", " + a + ")");
}
}));
function hex(value) {
value = Math.max(0, Math.min(255, Math.round(value) || 0));
return (value < 16 ? "0" : "") + value.toString(16);
}
function hsla(h, s, l, a) {
if (a <= 0) h = s = l = NaN;
else if (l <= 0 || l >= 1) h = s = NaN;
else if (s <= 0) h = NaN;
return new Hsl(h, s, l, a);
}
function hslConvert(o) {
if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
if (!(o instanceof Color)) o = color(o);
if (!o) return new Hsl;
if (o instanceof Hsl) return o;
o = o.rgb();
var r = o.r / 255,
g = o.g / 255,
b = o.b / 255,
min = Math.min(r, g, b),
max = Math.max(r, g, b),
h = NaN,
s = max - min,
l = (max + min) / 2;
if (s) {
if (r === max) h = (g - b) / s + (g < b) * 6;
else if (g === max) h = (b - r) / s + 2;
else h = (r - g) / s + 4;
s /= l < 0.5 ? max + min : 2 - max - min;
h *= 60;
} else {
s = l > 0 && l < 1 ? 0 : h;
}
return new Hsl(h, s, l, o.opacity);
}
function hsl(h, s, l, opacity) {
return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
}
function Hsl(h, s, l, opacity) {
this.h = +h;
this.s = +s;
this.l = +l;
this.opacity = +opacity;
}
Object(_define__WEBPACK_IMPORTED_MODULE_0__["default"])(Hsl, hsl, Object(_define__WEBPACK_IMPORTED_MODULE_0__["extend"])(Color, {
brighter: function(k) {
k = k == null ? brighter : Math.pow(brighter, k);
return new Hsl(this.h, this.s, this.l * k, this.opacity);
},
darker: function(k) {
k = k == null ? darker : Math.pow(darker, k);
return new Hsl(this.h, this.s, this.l * k, this.opacity);
},
rgb: function() {
var h = this.h % 360 + (this.h < 0) * 360,
s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
l = this.l,
m2 = l + (l < 0.5 ? l : 1 - l) * s,
m1 = 2 * l - m2;
return new Rgb(
hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
hsl2rgb(h, m1, m2),
hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
this.opacity
);
},
displayable: function() {
return (0 <= this.s && this.s <= 1 || isNaN(this.s))
&& (0 <= this.l && this.l <= 1)
&& (0 <= this.opacity && this.opacity <= 1);
}
}));
/* From FvD 13.37, CSS Color Module Level 3 */
function hsl2rgb(h, m1, m2) {
return (h < 60 ? m1 + (m2 - m1) * h / 60
: h < 180 ? m2
: h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
: m1) * 255;
}
/***/ }),
/***/ "./node_modules/d3-color/src/cubehelix.js":
/*!************************************************!*\
!*** ./node_modules/d3-color/src/cubehelix.js ***!
\************************************************/
/*! exports provided: default, Cubehelix */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return cubehelix; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cubehelix", function() { return Cubehelix; });
/* harmony import */ var _define__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./define */ "./node_modules/d3-color/src/define.js");
/* harmony import */ var _color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color */ "./node_modules/d3-color/src/color.js");
/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./math */ "./node_modules/d3-color/src/math.js");
var A = -0.14861,
B = +1.78277,
C = -0.29227,
D = -0.90649,
E = +1.97294,
ED = E * D,
EB = E * B,
BC_DA = B * C - D * A;
function cubehelixConvert(o) {
if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
if (!(o instanceof _color__WEBPACK_IMPORTED_MODULE_1__["Rgb"])) o = Object(_color__WEBPACK_IMPORTED_MODULE_1__["rgbConvert"])(o);
var r = o.r / 255,
g = o.g / 255,
b = o.b / 255,
l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
bl = b - l,
k = (E * (g - l) - C * bl) / D,
s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
h = s ? Math.atan2(k, bl) * _math__WEBPACK_IMPORTED_MODULE_2__["rad2deg"] - 120 : NaN;
return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
}
function cubehelix(h, s, l, opacity) {
return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
}
function Cubehelix(h, s, l, opacity) {
this.h = +h;
this.s = +s;
this.l = +l;
this.opacity = +opacity;
}
Object(_define__WEBPACK_IMPORTED_MODULE_0__["default"])(Cubehelix, cubehelix, Object(_define__WEBPACK_IMPORTED_MODULE_0__["extend"])(_color__WEBPACK_IMPORTED_MODULE_1__["Color"], {
brighter: function(k) {
k = k == null ? _color__WEBPACK_IMPORTED_MODULE_1__["brighter"] : Math.pow(_color__WEBPACK_IMPORTED_MODULE_1__["brighter"], k);
return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
},
darker: function(k) {
k = k == null ? _color__WEBPACK_IMPORTED_MODULE_1__["darker"] : Math.pow(_color__WEBPACK_IMPORTED_MODULE_1__["darker"], k);
return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
},
rgb: function() {
var h = isNaN(this.h) ? 0 : (this.h + 120) * _math__WEBPACK_IMPORTED_MODULE_2__["deg2rad"],
l = +this.l,
a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
cosh = Math.cos(h),
sinh = Math.sin(h);
return new _color__WEBPACK_IMPORTED_MODULE_1__["Rgb"](
255 * (l + a * (A * cosh + B * sinh)),
255 * (l + a * (C * cosh + D * sinh)),
255 * (l + a * (E * cosh)),
this.opacity
);
}
}));
/***/ }),
/***/ "./node_modules/d3-color/src/define.js":
/*!*********************************************!*\
!*** ./node_modules/d3-color/src/define.js ***!
\*********************************************/
/*! exports provided: default, extend */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extend", function() { return extend; });
/* harmony default export */ __webpack_exports__["default"] = (function(constructor, factory, prototype) {
constructor.prototype = factory.prototype = prototype;
prototype.constructor = constructor;
});
function extend(parent, definition) {
var prototype = Object.create(parent.prototype);
for (var key in definition) prototype[key] = definition[key];
return prototype;
}
/***/ }),
/***/ "./node_modules/d3-color/src/index.js":
/*!********************************************!*\
!*** ./node_modules/d3-color/src/index.js ***!
\********************************************/
/*! exports provided: color, rgb, hsl, lab, hcl, lch, gray, cubehelix */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./color */ "./node_modules/d3-color/src/color.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "color", function() { return _color__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "rgb", function() { return _color__WEBPACK_IMPORTED_MODULE_0__["rgb"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hsl", function() { return _color__WEBPACK_IMPORTED_MODULE_0__["hsl"]; });
/* harmony import */ var _lab__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lab */ "./node_modules/d3-color/src/lab.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lab", function() { return _lab__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hcl", function() { return _lab__WEBPACK_IMPORTED_MODULE_1__["hcl"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lch", function() { return _lab__WEBPACK_IMPORTED_MODULE_1__["lch"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "gray", function() { return _lab__WEBPACK_IMPORTED_MODULE_1__["gray"]; });
/* harmony import */ var _cubehelix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./cubehelix */ "./node_modules/d3-color/src/cubehelix.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cubehelix", function() { return _cubehelix__WEBPACK_IMPORTED_MODULE_2__["default"]; });
/***/ }),
/***/ "./node_modules/d3-color/src/lab.js":
/*!******************************************!*\
!*** ./node_modules/d3-color/src/lab.js ***!
\******************************************/
/*! exports provided: gray, default, Lab, lch, hcl, Hcl */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gray", function() { return gray; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return lab; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Lab", function() { return Lab; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lch", function() { return lch; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hcl", function() { return hcl; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Hcl", function() { return Hcl; });
/* harmony import */ var _define__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./define */ "./node_modules/d3-color/src/define.js");
/* harmony import */ var _color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color */ "./node_modules/d3-color/src/color.js");
/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./math */ "./node_modules/d3-color/src/math.js");
// https://beta.observablehq.com/@mbostock/lab-and-rgb
var K = 18,
Xn = 0.96422,
Yn = 1,
Zn = 0.82521,
t0 = 4 / 29,
t1 = 6 / 29,
t2 = 3 * t1 * t1,
t3 = t1 * t1 * t1;
function labConvert(o) {
if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
if (o instanceof Hcl) {
if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);
var h = o.h * _math__WEBPACK_IMPORTED_MODULE_2__["deg2rad"];
return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
}
if (!(o instanceof _color__WEBPACK_IMPORTED_MODULE_1__["Rgb"])) o = Object(_color__WEBPACK_IMPORTED_MODULE_1__["rgbConvert"])(o);
var r = rgb2lrgb(o.r),
g = rgb2lrgb(o.g),
b = rgb2lrgb(o.b),
y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;
if (r === g && g === b) x = z = y; else {
x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);
z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);
}
return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
}
function gray(l, opacity) {
return new Lab(l, 0, 0, opacity == null ? 1 : opacity);
}
function lab(l, a, b, opacity) {
return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
}
function Lab(l, a, b, opacity) {
this.l = +l;
this.a = +a;
this.b = +b;
this.opacity = +opacity;
}
Object(_define__WEBPACK_IMPORTED_MODULE_0__["default"])(Lab, lab, Object(_define__WEBPACK_IMPORTED_MODULE_0__["extend"])(_color__WEBPACK_IMPORTED_MODULE_1__["Color"], {
brighter: function(k) {
return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);
},
darker: function(k) {
return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);
},
rgb: function() {
var y = (this.l + 16) / 116,
x = isNaN(this.a) ? y : y + this.a / 500,
z = isNaN(this.b) ? y : y - this.b / 200;
x = Xn * lab2xyz(x);
y = Yn * lab2xyz(y);
z = Zn * lab2xyz(z);
return new _color__WEBPACK_IMPORTED_MODULE_1__["Rgb"](
lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),
lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),
lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),
this.opacity
);
}
}));
function xyz2lab(t) {
return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
}
function lab2xyz(t) {
return t > t1 ? t * t * t : t2 * (t - t0);
}
function lrgb2rgb(x) {
return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
}
function rgb2lrgb(x) {
return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
}
function hclConvert(o) {
if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
if (!(o instanceof Lab)) o = labConvert(o);
if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0, o.l, o.opacity);
var h = Math.atan2(o.b, o.a) * _math__WEBPACK_IMPORTED_MODULE_2__["rad2deg"];
return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
}
function lch(l, c, h, opacity) {
return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
}
function hcl(h, c, l, opacity) {
return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
}
function Hcl(h, c, l, opacity) {
this.h = +h;
this.c = +c;
this.l = +l;
this.opacity = +opacity;
}
Object(_define__WEBPACK_IMPORTED_MODULE_0__["default"])(Hcl, hcl, Object(_define__WEBPACK_IMPORTED_MODULE_0__["extend"])(_color__WEBPACK_IMPORTED_MODULE_1__["Color"], {
brighter: function(k) {
return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);
},
darker: function(k) {
return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);
},
rgb: function() {
return labConvert(this).rgb();
}
}));
/***/ }),
/***/ "./node_modules/d3-color/src/math.js":
/*!*******************************************!*\
!*** ./node_modules/d3-color/src/math.js ***!
\*******************************************/
/*! exports provided: deg2rad, rad2deg */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "deg2rad", function() { return deg2rad; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rad2deg", function() { return rad2deg; });
var deg2rad = Math.PI / 180;
var rad2deg = 180 / Math.PI;
/***/ }),
/***/ "./node_modules/d3-dispatch/src/dispatch.js":
/*!**************************************************!*\
!*** ./node_modules/d3-dispatch/src/dispatch.js ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
var noop = {value: function() {}};
function dispatch() {
for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
_[t] = [];
}
return new Dispatch(_);
}
function Dispatch(_) {
this._ = _;
}
function parseTypenames(typenames, types) {
return typenames.trim().split(/^|\s+/).map(function(t) {
var name = "", i = t.indexOf(".");
if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
return {type: t, name: name};
});
}
Dispatch.prototype = dispatch.prototype = {
constructor: Dispatch,
on: function(typename, callback) {
var _ = this._,
T = parseTypenames(typename + "", _),
t,
i = -1,
n = T.length;
// If no callback was specified, return the callback of the given type and name.
if (arguments.length < 2) {
while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;
return;
}
// If a type was specified, set the callback for the given type and name.
// Otherwise, if a null callback was specified, remove callbacks of the given name.
if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
while (++i < n) {
if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
}
return this;
},
copy: function() {
var copy = {}, _ = this._;
for (var t in _) copy[t] = _[t].slice();
return new Dispatch(copy);
},
call: function(type, that) {
if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
},
apply: function(type, that, args) {
if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
}
};
function get(type, name) {
for (var i = 0, n = type.length, c; i < n; ++i) {
if ((c = type[i]).name === name) {
return c.value;
}
}
}
function set(type, name, callback) {
for (var i = 0, n = type.length; i < n; ++i) {
if (type[i].name === name) {
type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));
break;
}
}
if (callback != null) type.push({name: name, value: callback});
return type;
}
/* harmony default export */ __webpack_exports__["default"] = (dispatch);
/***/ }),
/***/ "./node_modules/d3-dispatch/src/index.js":
/*!***********************************************!*\
!*** ./node_modules/d3-dispatch/src/index.js ***!
\***********************************************/
/*! exports provided: dispatch */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _dispatch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dispatch */ "./node_modules/d3-dispatch/src/dispatch.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return _dispatch__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/***/ }),
/***/ "./node_modules/d3-drag/src/constant.js":
/*!**********************************************!*\
!*** ./node_modules/d3-drag/src/constant.js ***!
\**********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(x) {
return function() {
return x;
};
});
/***/ }),
/***/ "./node_modules/d3-drag/src/drag.js":
/*!******************************************!*\
!*** ./node_modules/d3-drag/src/drag.js ***!
\******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_dispatch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-dispatch */ "./node_modules/d3-dispatch/src/index.js");
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
/* harmony import */ var _nodrag__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./nodrag */ "./node_modules/d3-drag/src/nodrag.js");
/* harmony import */ var _noevent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./noevent */ "./node_modules/d3-drag/src/noevent.js");
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-drag/src/constant.js");
/* harmony import */ var _event__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./event */ "./node_modules/d3-drag/src/event.js");
// Ignore right-click, since that should open the context menu.
function defaultFilter() {
return !d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].button;
}
function defaultContainer() {
return this.parentNode;
}
function defaultSubject(d) {
return d == null ? {x: d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].x, y: d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].y} : d;
}
function defaultTouchable() {
return "ontouchstart" in this;
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
var filter = defaultFilter,
container = defaultContainer,
subject = defaultSubject,
touchable = defaultTouchable,
gestures = {},
listeners = Object(d3_dispatch__WEBPACK_IMPORTED_MODULE_0__["dispatch"])("start", "drag", "end"),
active = 0,
mousedownx,
mousedowny,
mousemoving,
touchending,
clickDistance2 = 0;
function drag(selection) {
selection
.on("mousedown.drag", mousedowned)
.filter(touchable)
.on("touchstart.drag", touchstarted)
.on("touchmove.drag", touchmoved)
.on("touchend.drag touchcancel.drag", touchended)
.style("touch-action", "none")
.style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
}
function mousedowned() {
if (touchending || !filter.apply(this, arguments)) return;
var gesture = beforestart("mouse", container.apply(this, arguments), d3_selection__WEBPACK_IMPORTED_MODULE_1__["mouse"], this, arguments);
if (!gesture) return;
Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["select"])(d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
Object(_nodrag__WEBPACK_IMPORTED_MODULE_2__["default"])(d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].view);
Object(_noevent__WEBPACK_IMPORTED_MODULE_3__["nopropagation"])();
mousemoving = false;
mousedownx = d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].clientX;
mousedowny = d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].clientY;
gesture("start");
}
function mousemoved() {
Object(_noevent__WEBPACK_IMPORTED_MODULE_3__["default"])();
if (!mousemoving) {
var dx = d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].clientX - mousedownx, dy = d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].clientY - mousedowny;
mousemoving = dx * dx + dy * dy > clickDistance2;
}
gestures.mouse("drag");
}
function mouseupped() {
Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["select"])(d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].view).on("mousemove.drag mouseup.drag", null);
Object(_nodrag__WEBPACK_IMPORTED_MODULE_2__["yesdrag"])(d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].view, mousemoving);
Object(_noevent__WEBPACK_IMPORTED_MODULE_3__["default"])();
gestures.mouse("end");
}
function touchstarted() {
if (!filter.apply(this, arguments)) return;
var touches = d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].changedTouches,
c = container.apply(this, arguments),
n = touches.length, i, gesture;
for (i = 0; i < n; ++i) {
if (gesture = beforestart(touches[i].identifier, c, d3_selection__WEBPACK_IMPORTED_MODULE_1__["touch"], this, arguments)) {
Object(_noevent__WEBPACK_IMPORTED_MODULE_3__["nopropagation"])();
gesture("start");
}
}
}
function touchmoved() {
var touches = d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].changedTouches,
n = touches.length, i, gesture;
for (i = 0; i < n; ++i) {
if (gesture = gestures[touches[i].identifier]) {
Object(_noevent__WEBPACK_IMPORTED_MODULE_3__["default"])();
gesture("drag");
}
}
}
function touchended() {
var touches = d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].changedTouches,
n = touches.length, i, gesture;
if (touchending) clearTimeout(touchending);
touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
for (i = 0; i < n; ++i) {
if (gesture = gestures[touches[i].identifier]) {
Object(_noevent__WEBPACK_IMPORTED_MODULE_3__["nopropagation"])();
gesture("end");
}
}
}
function beforestart(id, container, point, that, args) {
var p = point(container, id), s, dx, dy,
sublisteners = listeners.copy();
if (!Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["customEvent"])(new _event__WEBPACK_IMPORTED_MODULE_5__["default"](drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
if ((d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].subject = s = subject.apply(that, args)) == null) return false;
dx = s.x - p[0] || 0;
dy = s.y - p[1] || 0;
return true;
})) return;
return function gesture(type) {
var p0 = p, n;
switch (type) {
case "start": gestures[id] = gesture, n = active++; break;
case "end": delete gestures[id], --active; // nobreak
case "drag": p = point(container, id), n = active; break;
}
Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["customEvent"])(new _event__WEBPACK_IMPORTED_MODULE_5__["default"](drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);
};
}
drag.filter = function(_) {
return arguments.length ? (filter = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_4__["default"])(!!_), drag) : filter;
};
drag.container = function(_) {
return arguments.length ? (container = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_4__["default"])(_), drag) : container;
};
drag.subject = function(_) {
return arguments.length ? (subject = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_4__["default"])(_), drag) : subject;
};
drag.touchable = function(_) {
return arguments.length ? (touchable = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_4__["default"])(!!_), drag) : touchable;
};
drag.on = function() {
var value = listeners.on.apply(listeners, arguments);
return value === listeners ? drag : value;
};
drag.clickDistance = function(_) {
return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
};
return drag;
});
/***/ }),
/***/ "./node_modules/d3-drag/src/event.js":
/*!*******************************************!*\
!*** ./node_modules/d3-drag/src/event.js ***!
\*******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DragEvent; });
function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
this.target = target;
this.type = type;
this.subject = subject;
this.identifier = id;
this.active = active;
this.x = x;
this.y = y;
this.dx = dx;
this.dy = dy;
this._ = dispatch;
}
DragEvent.prototype.on = function() {
var value = this._.on.apply(this._, arguments);
return value === this._ ? this : value;
};
/***/ }),
/***/ "./node_modules/d3-drag/src/index.js":
/*!*******************************************!*\
!*** ./node_modules/d3-drag/src/index.js ***!
\*******************************************/
/*! exports provided: drag, dragDisable, dragEnable */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _drag__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./drag */ "./node_modules/d3-drag/src/drag.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drag", function() { return _drag__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/* harmony import */ var _nodrag__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./nodrag */ "./node_modules/d3-drag/src/nodrag.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dragDisable", function() { return _nodrag__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dragEnable", function() { return _nodrag__WEBPACK_IMPORTED_MODULE_1__["yesdrag"]; });
/***/ }),
/***/ "./node_modules/d3-drag/src/nodrag.js":
/*!********************************************!*\
!*** ./node_modules/d3-drag/src/nodrag.js ***!
\********************************************/
/*! exports provided: default, yesdrag */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "yesdrag", function() { return yesdrag; });
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
/* harmony import */ var _noevent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./noevent */ "./node_modules/d3-drag/src/noevent.js");
/* harmony default export */ __webpack_exports__["default"] = (function(view) {
var root = view.document.documentElement,
selection = Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["select"])(view).on("dragstart.drag", _noevent__WEBPACK_IMPORTED_MODULE_1__["default"], true);
if ("onselectstart" in root) {
selection.on("selectstart.drag", _noevent__WEBPACK_IMPORTED_MODULE_1__["default"], true);
} else {
root.__noselect = root.style.MozUserSelect;
root.style.MozUserSelect = "none";
}
});
function yesdrag(view, noclick) {
var root = view.document.documentElement,
selection = Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["select"])(view).on("dragstart.drag", null);
if (noclick) {
selection.on("click.drag", _noevent__WEBPACK_IMPORTED_MODULE_1__["default"], true);
setTimeout(function() { selection.on("click.drag", null); }, 0);
}
if ("onselectstart" in root) {
selection.on("selectstart.drag", null);
} else {
root.style.MozUserSelect = root.__noselect;
delete root.__noselect;
}
}
/***/ }),
/***/ "./node_modules/d3-drag/src/noevent.js":
/*!*********************************************!*\
!*** ./node_modules/d3-drag/src/noevent.js ***!
\*********************************************/
/*! exports provided: nopropagation, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nopropagation", function() { return nopropagation; });
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
function nopropagation() {
d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].stopImmediatePropagation();
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].preventDefault();
d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].stopImmediatePropagation();
});
/***/ }),
/***/ "./node_modules/d3-ease/src/back.js":
/*!******************************************!*\
!*** ./node_modules/d3-ease/src/back.js ***!
\******************************************/
/*! exports provided: backIn, backOut, backInOut */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "backIn", function() { return backIn; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "backOut", function() { return backOut; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "backInOut", function() { return backInOut; });
var overshoot = 1.70158;
var backIn = (function custom(s) {
s = +s;
function backIn(t) {
return t * t * ((s + 1) * t - s);
}
backIn.overshoot = custom;
return backIn;
})(overshoot);
var backOut = (function custom(s) {
s = +s;
function backOut(t) {
return --t * t * ((s + 1) * t + s) + 1;
}
backOut.overshoot = custom;
return backOut;
})(overshoot);
var backInOut = (function custom(s) {
s = +s;
function backInOut(t) {
return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
}
backInOut.overshoot = custom;
return backInOut;
})(overshoot);
/***/ }),
/***/ "./node_modules/d3-ease/src/bounce.js":
/*!********************************************!*\
!*** ./node_modules/d3-ease/src/bounce.js ***!
\********************************************/
/*! exports provided: bounceIn, bounceOut, bounceInOut */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bounceIn", function() { return bounceIn; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bounceOut", function() { return bounceOut; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bounceInOut", function() { return bounceInOut; });
var b1 = 4 / 11,
b2 = 6 / 11,
b3 = 8 / 11,
b4 = 3 / 4,
b5 = 9 / 11,
b6 = 10 / 11,
b7 = 15 / 16,
b8 = 21 / 22,
b9 = 63 / 64,
b0 = 1 / b1 / b1;
function bounceIn(t) {
return 1 - bounceOut(1 - t);
}
function bounceOut(t) {
return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;
}
function bounceInOut(t) {
return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
}
/***/ }),
/***/ "./node_modules/d3-ease/src/circle.js":
/*!********************************************!*\
!*** ./node_modules/d3-ease/src/circle.js ***!
\********************************************/
/*! exports provided: circleIn, circleOut, circleInOut */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "circleIn", function() { return circleIn; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "circleOut", function() { return circleOut; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "circleInOut", function() { return circleInOut; });
function circleIn(t) {
return 1 - Math.sqrt(1 - t * t);
}
function circleOut(t) {
return Math.sqrt(1 - --t * t);
}
function circleInOut(t) {
return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
}
/***/ }),
/***/ "./node_modules/d3-ease/src/cubic.js":
/*!*******************************************!*\
!*** ./node_modules/d3-ease/src/cubic.js ***!
\*******************************************/
/*! exports provided: cubicIn, cubicOut, cubicInOut */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cubicIn", function() { return cubicIn; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cubicOut", function() { return cubicOut; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cubicInOut", function() { return cubicInOut; });
function cubicIn(t) {
return t * t * t;
}
function cubicOut(t) {
return --t * t * t + 1;
}
function cubicInOut(t) {
return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
}
/***/ }),
/***/ "./node_modules/d3-ease/src/elastic.js":
/*!*********************************************!*\
!*** ./node_modules/d3-ease/src/elastic.js ***!
\*********************************************/
/*! exports provided: elasticIn, elasticOut, elasticInOut */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elasticIn", function() { return elasticIn; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elasticOut", function() { return elasticOut; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elasticInOut", function() { return elasticInOut; });
var tau = 2 * Math.PI,
amplitude = 1,
period = 0.3;
var elasticIn = (function custom(a, p) {
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
function elasticIn(t) {
return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
}
elasticIn.amplitude = function(a) { return custom(a, p * tau); };
elasticIn.period = function(p) { return custom(a, p); };
return elasticIn;
})(amplitude, period);
var elasticOut = (function custom(a, p) {
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
function elasticOut(t) {
return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
}
elasticOut.amplitude = function(a) { return custom(a, p * tau); };
elasticOut.period = function(p) { return custom(a, p); };
return elasticOut;
})(amplitude, period);
var elasticInOut = (function custom(a, p) {
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
function elasticInOut(t) {
return ((t = t * 2 - 1) < 0
? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
: 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
}
elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
elasticInOut.period = function(p) { return custom(a, p); };
return elasticInOut;
})(amplitude, period);
/***/ }),
/***/ "./node_modules/d3-ease/src/exp.js":
/*!*****************************************!*\
!*** ./node_modules/d3-ease/src/exp.js ***!
\*****************************************/
/*! exports provided: expIn, expOut, expInOut */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expIn", function() { return expIn; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expOut", function() { return expOut; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expInOut", function() { return expInOut; });
function expIn(t) {
return Math.pow(2, 10 * t - 10);
}
function expOut(t) {
return 1 - Math.pow(2, -10 * t);
}
function expInOut(t) {
return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
}
/***/ }),
/***/ "./node_modules/d3-ease/src/index.js":
/*!*******************************************!*\
!*** ./node_modules/d3-ease/src/index.js ***!
\*******************************************/
/*! exports provided: easeLinear, easeQuad, easeQuadIn, easeQuadOut, easeQuadInOut, easeCubic, easeCubicIn, easeCubicOut, easeCubicInOut, easePoly, easePolyIn, easePolyOut, easePolyInOut, easeSin, easeSinIn, easeSinOut, easeSinInOut, easeExp, easeExpIn, easeExpOut, easeExpInOut, easeCircle, easeCircleIn, easeCircleOut, easeCircleInOut, easeBounce, easeBounceIn, easeBounceOut, easeBounceInOut, easeBack, easeBackIn, easeBackOut, easeBackInOut, easeElastic, easeElasticIn, easeElasticOut, easeElasticInOut */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _linear__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./linear */ "./node_modules/d3-ease/src/linear.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeLinear", function() { return _linear__WEBPACK_IMPORTED_MODULE_0__["linear"]; });
/* harmony import */ var _quad__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./quad */ "./node_modules/d3-ease/src/quad.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeQuad", function() { return _quad__WEBPACK_IMPORTED_MODULE_1__["quadInOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeQuadIn", function() { return _quad__WEBPACK_IMPORTED_MODULE_1__["quadIn"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeQuadOut", function() { return _quad__WEBPACK_IMPORTED_MODULE_1__["quadOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeQuadInOut", function() { return _quad__WEBPACK_IMPORTED_MODULE_1__["quadInOut"]; });
/* harmony import */ var _cubic__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./cubic */ "./node_modules/d3-ease/src/cubic.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCubic", function() { return _cubic__WEBPACK_IMPORTED_MODULE_2__["cubicInOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCubicIn", function() { return _cubic__WEBPACK_IMPORTED_MODULE_2__["cubicIn"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCubicOut", function() { return _cubic__WEBPACK_IMPORTED_MODULE_2__["cubicOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCubicInOut", function() { return _cubic__WEBPACK_IMPORTED_MODULE_2__["cubicInOut"]; });
/* harmony import */ var _poly__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./poly */ "./node_modules/d3-ease/src/poly.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easePoly", function() { return _poly__WEBPACK_IMPORTED_MODULE_3__["polyInOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easePolyIn", function() { return _poly__WEBPACK_IMPORTED_MODULE_3__["polyIn"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easePolyOut", function() { return _poly__WEBPACK_IMPORTED_MODULE_3__["polyOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easePolyInOut", function() { return _poly__WEBPACK_IMPORTED_MODULE_3__["polyInOut"]; });
/* harmony import */ var _sin__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sin */ "./node_modules/d3-ease/src/sin.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeSin", function() { return _sin__WEBPACK_IMPORTED_MODULE_4__["sinInOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeSinIn", function() { return _sin__WEBPACK_IMPORTED_MODULE_4__["sinIn"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeSinOut", function() { return _sin__WEBPACK_IMPORTED_MODULE_4__["sinOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeSinInOut", function() { return _sin__WEBPACK_IMPORTED_MODULE_4__["sinInOut"]; });
/* harmony import */ var _exp__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./exp */ "./node_modules/d3-ease/src/exp.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeExp", function() { return _exp__WEBPACK_IMPORTED_MODULE_5__["expInOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeExpIn", function() { return _exp__WEBPACK_IMPORTED_MODULE_5__["expIn"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeExpOut", function() { return _exp__WEBPACK_IMPORTED_MODULE_5__["expOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeExpInOut", function() { return _exp__WEBPACK_IMPORTED_MODULE_5__["expInOut"]; });
/* harmony import */ var _circle__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./circle */ "./node_modules/d3-ease/src/circle.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCircle", function() { return _circle__WEBPACK_IMPORTED_MODULE_6__["circleInOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCircleIn", function() { return _circle__WEBPACK_IMPORTED_MODULE_6__["circleIn"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCircleOut", function() { return _circle__WEBPACK_IMPORTED_MODULE_6__["circleOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCircleInOut", function() { return _circle__WEBPACK_IMPORTED_MODULE_6__["circleInOut"]; });
/* harmony import */ var _bounce__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./bounce */ "./node_modules/d3-ease/src/bounce.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBounce", function() { return _bounce__WEBPACK_IMPORTED_MODULE_7__["bounceOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBounceIn", function() { return _bounce__WEBPACK_IMPORTED_MODULE_7__["bounceIn"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBounceOut", function() { return _bounce__WEBPACK_IMPORTED_MODULE_7__["bounceOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBounceInOut", function() { return _bounce__WEBPACK_IMPORTED_MODULE_7__["bounceInOut"]; });
/* harmony import */ var _back__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./back */ "./node_modules/d3-ease/src/back.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBack", function() { return _back__WEBPACK_IMPORTED_MODULE_8__["backInOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBackIn", function() { return _back__WEBPACK_IMPORTED_MODULE_8__["backIn"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBackOut", function() { return _back__WEBPACK_IMPORTED_MODULE_8__["backOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBackInOut", function() { return _back__WEBPACK_IMPORTED_MODULE_8__["backInOut"]; });
/* harmony import */ var _elastic__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./elastic */ "./node_modules/d3-ease/src/elastic.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeElastic", function() { return _elastic__WEBPACK_IMPORTED_MODULE_9__["elasticOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeElasticIn", function() { return _elastic__WEBPACK_IMPORTED_MODULE_9__["elasticIn"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeElasticOut", function() { return _elastic__WEBPACK_IMPORTED_MODULE_9__["elasticOut"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeElasticInOut", function() { return _elastic__WEBPACK_IMPORTED_MODULE_9__["elasticInOut"]; });
/***/ }),
/***/ "./node_modules/d3-ease/src/linear.js":
/*!********************************************!*\
!*** ./node_modules/d3-ease/src/linear.js ***!
\********************************************/
/*! exports provided: linear */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linear", function() { return linear; });
function linear(t) {
return +t;
}
/***/ }),
/***/ "./node_modules/d3-ease/src/poly.js":
/*!******************************************!*\
!*** ./node_modules/d3-ease/src/poly.js ***!
\******************************************/
/*! exports provided: polyIn, polyOut, polyInOut */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "polyIn", function() { return polyIn; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "polyOut", function() { return polyOut; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "polyInOut", function() { return polyInOut; });
var exponent = 3;
var polyIn = (function custom(e) {
e = +e;
function polyIn(t) {
return Math.pow(t, e);
}
polyIn.exponent = custom;
return polyIn;
})(exponent);
var polyOut = (function custom(e) {
e = +e;
function polyOut(t) {
return 1 - Math.pow(1 - t, e);
}
polyOut.exponent = custom;
return polyOut;
})(exponent);
var polyInOut = (function custom(e) {
e = +e;
function polyInOut(t) {
return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
}
polyInOut.exponent = custom;
return polyInOut;
})(exponent);
/***/ }),
/***/ "./node_modules/d3-ease/src/quad.js":
/*!******************************************!*\
!*** ./node_modules/d3-ease/src/quad.js ***!
\******************************************/
/*! exports provided: quadIn, quadOut, quadInOut */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "quadIn", function() { return quadIn; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "quadOut", function() { return quadOut; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "quadInOut", function() { return quadInOut; });
function quadIn(t) {
return t * t;
}
function quadOut(t) {
return t * (2 - t);
}
function quadInOut(t) {
return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
}
/***/ }),
/***/ "./node_modules/d3-ease/src/sin.js":
/*!*****************************************!*\
!*** ./node_modules/d3-ease/src/sin.js ***!
\*****************************************/
/*! exports provided: sinIn, sinOut, sinInOut */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sinIn", function() { return sinIn; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sinOut", function() { return sinOut; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sinInOut", function() { return sinInOut; });
var pi = Math.PI,
halfPi = pi / 2;
function sinIn(t) {
return 1 - Math.cos(t * halfPi);
}
function sinOut(t) {
return Math.sin(t * halfPi);
}
function sinInOut(t) {
return (1 - Math.cos(pi * t)) / 2;
}
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/accessors.js":
/*!****************************************************!*\
!*** ./node_modules/d3-hierarchy/src/accessors.js ***!
\****************************************************/
/*! exports provided: optional, required */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "optional", function() { return optional; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "required", function() { return required; });
function optional(f) {
return f == null ? null : required(f);
}
function required(f) {
if (typeof f !== "function") throw new Error;
return f;
}
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/array.js":
/*!************************************************!*\
!*** ./node_modules/d3-hierarchy/src/array.js ***!
\************************************************/
/*! exports provided: slice, shuffle */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice", function() { return slice; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shuffle", function() { return shuffle; });
var slice = Array.prototype.slice;
function shuffle(array) {
var m = array.length,
t,
i;
while (m) {
i = Math.random() * m-- | 0;
t = array[m];
array[m] = array[i];
array[i] = t;
}
return array;
}
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/cluster.js":
/*!**************************************************!*\
!*** ./node_modules/d3-hierarchy/src/cluster.js ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function defaultSeparation(a, b) {
return a.parent === b.parent ? 1 : 2;
}
function meanX(children) {
return children.reduce(meanXReduce, 0) / children.length;
}
function meanXReduce(x, c) {
return x + c.x;
}
function maxY(children) {
return 1 + children.reduce(maxYReduce, 0);
}
function maxYReduce(y, c) {
return Math.max(y, c.y);
}
function leafLeft(node) {
var children;
while (children = node.children) node = children[0];
return node;
}
function leafRight(node) {
var children;
while (children = node.children) node = children[children.length - 1];
return node;
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
var separation = defaultSeparation,
dx = 1,
dy = 1,
nodeSize = false;
function cluster(root) {
var previousNode,
x = 0;
// First walk, computing the initial x & y values.
root.eachAfter(function(node) {
var children = node.children;
if (children) {
node.x = meanX(children);
node.y = maxY(children);
} else {
node.x = previousNode ? x += separation(node, previousNode) : 0;
node.y = 0;
previousNode = node;
}
});
var left = leafLeft(root),
right = leafRight(root),
x0 = left.x - separation(left, right) / 2,
x1 = right.x + separation(right, left) / 2;
// Second walk, normalizing x & y to the desired size.
return root.eachAfter(nodeSize ? function(node) {
node.x = (node.x - root.x) * dx;
node.y = (root.y - node.y) * dy;
} : function(node) {
node.x = (node.x - x0) / (x1 - x0) * dx;
node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
});
}
cluster.separation = function(x) {
return arguments.length ? (separation = x, cluster) : separation;
};
cluster.size = function(x) {
return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
};
cluster.nodeSize = function(x) {
return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
};
return cluster;
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/constant.js":
/*!***************************************************!*\
!*** ./node_modules/d3-hierarchy/src/constant.js ***!
\***************************************************/
/*! exports provided: constantZero, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "constantZero", function() { return constantZero; });
function constantZero() {
return 0;
}
/* harmony default export */ __webpack_exports__["default"] = (function(x) {
return function() {
return x;
};
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/hierarchy/ancestors.js":
/*!**************************************************************!*\
!*** ./node_modules/d3-hierarchy/src/hierarchy/ancestors.js ***!
\**************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function() {
var node = this, nodes = [node];
while (node = node.parent) {
nodes.push(node);
}
return nodes;
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/hierarchy/count.js":
/*!**********************************************************!*\
!*** ./node_modules/d3-hierarchy/src/hierarchy/count.js ***!
\**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function count(node) {
var sum = 0,
children = node.children,
i = children && children.length;
if (!i) sum = 1;
else while (--i >= 0) sum += children[i].value;
node.value = sum;
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
return this.eachAfter(count);
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/hierarchy/descendants.js":
/*!****************************************************************!*\
!*** ./node_modules/d3-hierarchy/src/hierarchy/descendants.js ***!
\****************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function() {
var nodes = [];
this.each(function(node) {
nodes.push(node);
});
return nodes;
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/hierarchy/each.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-hierarchy/src/hierarchy/each.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(callback) {
var node = this, current, next = [node], children, i, n;
do {
current = next.reverse(), next = [];
while (node = current.pop()) {
callback(node), children = node.children;
if (children) for (i = 0, n = children.length; i < n; ++i) {
next.push(children[i]);
}
}
} while (next.length);
return this;
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/hierarchy/eachAfter.js":
/*!**************************************************************!*\
!*** ./node_modules/d3-hierarchy/src/hierarchy/eachAfter.js ***!
\**************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(callback) {
var node = this, nodes = [node], next = [], children, i, n;
while (node = nodes.pop()) {
next.push(node), children = node.children;
if (children) for (i = 0, n = children.length; i < n; ++i) {
nodes.push(children[i]);
}
}
while (node = next.pop()) {
callback(node);
}
return this;
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/hierarchy/eachBefore.js":
/*!***************************************************************!*\
!*** ./node_modules/d3-hierarchy/src/hierarchy/eachBefore.js ***!
\***************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(callback) {
var node = this, nodes = [node], children, i;
while (node = nodes.pop()) {
callback(node), children = node.children;
if (children) for (i = children.length - 1; i >= 0; --i) {
nodes.push(children[i]);
}
}
return this;
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/hierarchy/index.js":
/*!**********************************************************!*\
!*** ./node_modules/d3-hierarchy/src/hierarchy/index.js ***!
\**********************************************************/
/*! exports provided: default, computeHeight, Node */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return hierarchy; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeHeight", function() { return computeHeight; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Node", function() { return Node; });
/* harmony import */ var _count__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./count */ "./node_modules/d3-hierarchy/src/hierarchy/count.js");
/* harmony import */ var _each__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./each */ "./node_modules/d3-hierarchy/src/hierarchy/each.js");
/* harmony import */ var _eachBefore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./eachBefore */ "./node_modules/d3-hierarchy/src/hierarchy/eachBefore.js");
/* harmony import */ var _eachAfter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./eachAfter */ "./node_modules/d3-hierarchy/src/hierarchy/eachAfter.js");
/* harmony import */ var _sum__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sum */ "./node_modules/d3-hierarchy/src/hierarchy/sum.js");
/* harmony import */ var _sort__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sort */ "./node_modules/d3-hierarchy/src/hierarchy/sort.js");
/* harmony import */ var _path__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./path */ "./node_modules/d3-hierarchy/src/hierarchy/path.js");
/* harmony import */ var _ancestors__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ancestors */ "./node_modules/d3-hierarchy/src/hierarchy/ancestors.js");
/* harmony import */ var _descendants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./descendants */ "./node_modules/d3-hierarchy/src/hierarchy/descendants.js");
/* harmony import */ var _leaves__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./leaves */ "./node_modules/d3-hierarchy/src/hierarchy/leaves.js");
/* harmony import */ var _links__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./links */ "./node_modules/d3-hierarchy/src/hierarchy/links.js");
function hierarchy(data, children) {
var root = new Node(data),
valued = +data.value && (root.value = data.value),
node,
nodes = [root],
child,
childs,
i,
n;
if (children == null) children = defaultChildren;
while (node = nodes.pop()) {
if (valued) node.value = +node.data.value;
if ((childs = children(node.data)) && (n = childs.length)) {
node.children = new Array(n);
for (i = n - 1; i >= 0; --i) {
nodes.push(child = node.children[i] = new Node(childs[i]));
child.parent = node;
child.depth = node.depth + 1;
}
}
}
return root.eachBefore(computeHeight);
}
function node_copy() {
return hierarchy(this).eachBefore(copyData);
}
function defaultChildren(d) {
return d.children;
}
function copyData(node) {
node.data = node.data.data;
}
function computeHeight(node) {
var height = 0;
do node.height = height;
while ((node = node.parent) && (node.height < ++height));
}
function Node(data) {
this.data = data;
this.depth =
this.height = 0;
this.parent = null;
}
Node.prototype = hierarchy.prototype = {
constructor: Node,
count: _count__WEBPACK_IMPORTED_MODULE_0__["default"],
each: _each__WEBPACK_IMPORTED_MODULE_1__["default"],
eachAfter: _eachAfter__WEBPACK_IMPORTED_MODULE_3__["default"],
eachBefore: _eachBefore__WEBPACK_IMPORTED_MODULE_2__["default"],
sum: _sum__WEBPACK_IMPORTED_MODULE_4__["default"],
sort: _sort__WEBPACK_IMPORTED_MODULE_5__["default"],
path: _path__WEBPACK_IMPORTED_MODULE_6__["default"],
ancestors: _ancestors__WEBPACK_IMPORTED_MODULE_7__["default"],
descendants: _descendants__WEBPACK_IMPORTED_MODULE_8__["default"],
leaves: _leaves__WEBPACK_IMPORTED_MODULE_9__["default"],
links: _links__WEBPACK_IMPORTED_MODULE_10__["default"],
copy: node_copy
};
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/hierarchy/leaves.js":
/*!***********************************************************!*\
!*** ./node_modules/d3-hierarchy/src/hierarchy/leaves.js ***!
\***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function() {
var leaves = [];
this.eachBefore(function(node) {
if (!node.children) {
leaves.push(node);
}
});
return leaves;
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/hierarchy/links.js":
/*!**********************************************************!*\
!*** ./node_modules/d3-hierarchy/src/hierarchy/links.js ***!
\**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function() {
var root = this, links = [];
root.each(function(node) {
if (node !== root) { // Dont include the roots parent, if any.
links.push({source: node.parent, target: node});
}
});
return links;
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/hierarchy/path.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-hierarchy/src/hierarchy/path.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(end) {
var start = this,
ancestor = leastCommonAncestor(start, end),
nodes = [start];
while (start !== ancestor) {
start = start.parent;
nodes.push(start);
}
var k = nodes.length;
while (end !== ancestor) {
nodes.splice(k, 0, end);
end = end.parent;
}
return nodes;
});
function leastCommonAncestor(a, b) {
if (a === b) return a;
var aNodes = a.ancestors(),
bNodes = b.ancestors(),
c = null;
a = aNodes.pop();
b = bNodes.pop();
while (a === b) {
c = a;
a = aNodes.pop();
b = bNodes.pop();
}
return c;
}
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/hierarchy/sort.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-hierarchy/src/hierarchy/sort.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(compare) {
return this.eachBefore(function(node) {
if (node.children) {
node.children.sort(compare);
}
});
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/hierarchy/sum.js":
/*!********************************************************!*\
!*** ./node_modules/d3-hierarchy/src/hierarchy/sum.js ***!
\********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(value) {
return this.eachAfter(function(node) {
var sum = +value(node.data) || 0,
children = node.children,
i = children && children.length;
while (--i >= 0) sum += children[i].value;
node.value = sum;
});
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/index.js":
/*!************************************************!*\
!*** ./node_modules/d3-hierarchy/src/index.js ***!
\************************************************/
/*! exports provided: cluster, hierarchy, pack, packSiblings, packEnclose, partition, stratify, tree, treemap, treemapBinary, treemapDice, treemapSlice, treemapSliceDice, treemapSquarify, treemapResquarify */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _cluster__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cluster */ "./node_modules/d3-hierarchy/src/cluster.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cluster", function() { return _cluster__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/* harmony import */ var _hierarchy_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hierarchy/index */ "./node_modules/d3-hierarchy/src/hierarchy/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hierarchy", function() { return _hierarchy_index__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/* harmony import */ var _pack_index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./pack/index */ "./node_modules/d3-hierarchy/src/pack/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pack", function() { return _pack_index__WEBPACK_IMPORTED_MODULE_2__["default"]; });
/* harmony import */ var _pack_siblings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pack/siblings */ "./node_modules/d3-hierarchy/src/pack/siblings.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "packSiblings", function() { return _pack_siblings__WEBPACK_IMPORTED_MODULE_3__["default"]; });
/* harmony import */ var _pack_enclose__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pack/enclose */ "./node_modules/d3-hierarchy/src/pack/enclose.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "packEnclose", function() { return _pack_enclose__WEBPACK_IMPORTED_MODULE_4__["default"]; });
/* harmony import */ var _partition__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./partition */ "./node_modules/d3-hierarchy/src/partition.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _partition__WEBPACK_IMPORTED_MODULE_5__["default"]; });
/* harmony import */ var _stratify__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./stratify */ "./node_modules/d3-hierarchy/src/stratify.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stratify", function() { return _stratify__WEBPACK_IMPORTED_MODULE_6__["default"]; });
/* harmony import */ var _tree__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tree */ "./node_modules/d3-hierarchy/src/tree.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tree", function() { return _tree__WEBPACK_IMPORTED_MODULE_7__["default"]; });
/* harmony import */ var _treemap_index__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./treemap/index */ "./node_modules/d3-hierarchy/src/treemap/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemap", function() { return _treemap_index__WEBPACK_IMPORTED_MODULE_8__["default"]; });
/* harmony import */ var _treemap_binary__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./treemap/binary */ "./node_modules/d3-hierarchy/src/treemap/binary.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapBinary", function() { return _treemap_binary__WEBPACK_IMPORTED_MODULE_9__["default"]; });
/* harmony import */ var _treemap_dice__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./treemap/dice */ "./node_modules/d3-hierarchy/src/treemap/dice.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapDice", function() { return _treemap_dice__WEBPACK_IMPORTED_MODULE_10__["default"]; });
/* harmony import */ var _treemap_slice__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./treemap/slice */ "./node_modules/d3-hierarchy/src/treemap/slice.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapSlice", function() { return _treemap_slice__WEBPACK_IMPORTED_MODULE_11__["default"]; });
/* harmony import */ var _treemap_sliceDice__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./treemap/sliceDice */ "./node_modules/d3-hierarchy/src/treemap/sliceDice.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapSliceDice", function() { return _treemap_sliceDice__WEBPACK_IMPORTED_MODULE_12__["default"]; });
/* harmony import */ var _treemap_squarify__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./treemap/squarify */ "./node_modules/d3-hierarchy/src/treemap/squarify.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapSquarify", function() { return _treemap_squarify__WEBPACK_IMPORTED_MODULE_13__["default"]; });
/* harmony import */ var _treemap_resquarify__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./treemap/resquarify */ "./node_modules/d3-hierarchy/src/treemap/resquarify.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapResquarify", function() { return _treemap_resquarify__WEBPACK_IMPORTED_MODULE_14__["default"]; });
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/pack/enclose.js":
/*!*******************************************************!*\
!*** ./node_modules/d3-hierarchy/src/pack/enclose.js ***!
\*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../array */ "./node_modules/d3-hierarchy/src/array.js");
/* harmony default export */ __webpack_exports__["default"] = (function(circles) {
var i = 0, n = (circles = Object(_array__WEBPACK_IMPORTED_MODULE_0__["shuffle"])(_array__WEBPACK_IMPORTED_MODULE_0__["slice"].call(circles))).length, B = [], p, e;
while (i < n) {
p = circles[i];
if (e && enclosesWeak(e, p)) ++i;
else e = encloseBasis(B = extendBasis(B, p)), i = 0;
}
return e;
});
function extendBasis(B, p) {
var i, j;
if (enclosesWeakAll(p, B)) return [p];
// If we get here then B must have at least one element.
for (i = 0; i < B.length; ++i) {
if (enclosesNot(p, B[i])
&& enclosesWeakAll(encloseBasis2(B[i], p), B)) {
return [B[i], p];
}
}
// If we get here then B must have at least two elements.
for (i = 0; i < B.length - 1; ++i) {
for (j = i + 1; j < B.length; ++j) {
if (enclosesNot(encloseBasis2(B[i], B[j]), p)
&& enclosesNot(encloseBasis2(B[i], p), B[j])
&& enclosesNot(encloseBasis2(B[j], p), B[i])
&& enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
return [B[i], B[j], p];
}
}
}
// If we get here then something is very wrong.
throw new Error;
}
function enclosesNot(a, b) {
var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
return dr < 0 || dr * dr < dx * dx + dy * dy;
}
function enclosesWeak(a, b) {
var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
return dr > 0 && dr * dr > dx * dx + dy * dy;
}
function enclosesWeakAll(a, B) {
for (var i = 0; i < B.length; ++i) {
if (!enclosesWeak(a, B[i])) {
return false;
}
}
return true;
}
function encloseBasis(B) {
switch (B.length) {
case 1: return encloseBasis1(B[0]);
case 2: return encloseBasis2(B[0], B[1]);
case 3: return encloseBasis3(B[0], B[1], B[2]);
}
}
function encloseBasis1(a) {
return {
x: a.x,
y: a.y,
r: a.r
};
}
function encloseBasis2(a, b) {
var x1 = a.x, y1 = a.y, r1 = a.r,
x2 = b.x, y2 = b.y, r2 = b.r,
x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
l = Math.sqrt(x21 * x21 + y21 * y21);
return {
x: (x1 + x2 + x21 / l * r21) / 2,
y: (y1 + y2 + y21 / l * r21) / 2,
r: (l + r1 + r2) / 2
};
}
function encloseBasis3(a, b, c) {
var x1 = a.x, y1 = a.y, r1 = a.r,
x2 = b.x, y2 = b.y, r2 = b.r,
x3 = c.x, y3 = c.y, r3 = c.r,
a2 = x1 - x2,
a3 = x1 - x3,
b2 = y1 - y2,
b3 = y1 - y3,
c2 = r2 - r1,
c3 = r3 - r1,
d1 = x1 * x1 + y1 * y1 - r1 * r1,
d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
ab = a3 * b2 - a2 * b3,
xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
xb = (b3 * c2 - b2 * c3) / ab,
ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
yb = (a2 * c3 - a3 * c2) / ab,
A = xb * xb + yb * yb - 1,
B = 2 * (r1 + xa * xb + ya * yb),
C = xa * xa + ya * ya - r1 * r1,
r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
return {
x: x1 + xa + xb * r,
y: y1 + ya + yb * r,
r: r
};
}
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/pack/index.js":
/*!*****************************************************!*\
!*** ./node_modules/d3-hierarchy/src/pack/index.js ***!
\*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _siblings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./siblings */ "./node_modules/d3-hierarchy/src/pack/siblings.js");
/* harmony import */ var _accessors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../accessors */ "./node_modules/d3-hierarchy/src/accessors.js");
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constant */ "./node_modules/d3-hierarchy/src/constant.js");
function defaultRadius(d) {
return Math.sqrt(d.value);
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
var radius = null,
dx = 1,
dy = 1,
padding = _constant__WEBPACK_IMPORTED_MODULE_2__["constantZero"];
function pack(root) {
root.x = dx / 2, root.y = dy / 2;
if (radius) {
root.eachBefore(radiusLeaf(radius))
.eachAfter(packChildren(padding, 0.5))
.eachBefore(translateChild(1));
} else {
root.eachBefore(radiusLeaf(defaultRadius))
.eachAfter(packChildren(_constant__WEBPACK_IMPORTED_MODULE_2__["constantZero"], 1))
.eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
.eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
}
return root;
}
pack.radius = function(x) {
return arguments.length ? (radius = Object(_accessors__WEBPACK_IMPORTED_MODULE_1__["optional"])(x), pack) : radius;
};
pack.size = function(x) {
return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
};
pack.padding = function(x) {
return arguments.length ? (padding = typeof x === "function" ? x : Object(_constant__WEBPACK_IMPORTED_MODULE_2__["default"])(+x), pack) : padding;
};
return pack;
});
function radiusLeaf(radius) {
return function(node) {
if (!node.children) {
node.r = Math.max(0, +radius(node) || 0);
}
};
}
function packChildren(padding, k) {
return function(node) {
if (children = node.children) {
var children,
i,
n = children.length,
r = padding(node) * k || 0,
e;
if (r) for (i = 0; i < n; ++i) children[i].r += r;
e = Object(_siblings__WEBPACK_IMPORTED_MODULE_0__["packEnclose"])(children);
if (r) for (i = 0; i < n; ++i) children[i].r -= r;
node.r = e + r;
}
};
}
function translateChild(k) {
return function(node) {
var parent = node.parent;
node.r *= k;
if (parent) {
node.x = parent.x + k * node.x;
node.y = parent.y + k * node.y;
}
};
}
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/pack/siblings.js":
/*!********************************************************!*\
!*** ./node_modules/d3-hierarchy/src/pack/siblings.js ***!
\********************************************************/
/*! exports provided: packEnclose, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "packEnclose", function() { return packEnclose; });
/* harmony import */ var _enclose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enclose */ "./node_modules/d3-hierarchy/src/pack/enclose.js");
function place(b, a, c) {
var dx = b.x - a.x, x, a2,
dy = b.y - a.y, y, b2,
d2 = dx * dx + dy * dy;
if (d2) {
a2 = a.r + c.r, a2 *= a2;
b2 = b.r + c.r, b2 *= b2;
if (a2 > b2) {
x = (d2 + b2 - a2) / (2 * d2);
y = Math.sqrt(Math.max(0, b2 / d2 - x * x));
c.x = b.x - x * dx - y * dy;
c.y = b.y - x * dy + y * dx;
} else {
x = (d2 + a2 - b2) / (2 * d2);
y = Math.sqrt(Math.max(0, a2 / d2 - x * x));
c.x = a.x + x * dx - y * dy;
c.y = a.y + x * dy + y * dx;
}
} else {
c.x = a.x + c.r;
c.y = a.y;
}
}
function intersects(a, b) {
var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y;
return dr > 0 && dr * dr > dx * dx + dy * dy;
}
function score(node) {
var a = node._,
b = node.next._,
ab = a.r + b.r,
dx = (a.x * b.r + b.x * a.r) / ab,
dy = (a.y * b.r + b.y * a.r) / ab;
return dx * dx + dy * dy;
}
function Node(circle) {
this._ = circle;
this.next = null;
this.previous = null;
}
function packEnclose(circles) {
if (!(n = circles.length)) return 0;
var a, b, c, n, aa, ca, i, j, k, sj, sk;
// Place the first circle.
a = circles[0], a.x = 0, a.y = 0;
if (!(n > 1)) return a.r;
// Place the second circle.
b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
if (!(n > 2)) return a.r + b.r;
// Place the third circle.
place(b, a, c = circles[2]);
// Initialize the front-chain using the first three circles a, b and c.
a = new Node(a), b = new Node(b), c = new Node(c);
a.next = c.previous = b;
b.next = a.previous = c;
c.next = b.previous = a;
// Attempt to place each remaining circle…
pack: for (i = 3; i < n; ++i) {
place(a._, b._, c = circles[i]), c = new Node(c);
// Find the closest intersecting circle on the front-chain, if any.
// “Closeness” is determined by linear distance along the front-chain.
// “Ahead” or “behind” is likewise determined by linear distance.
j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
do {
if (sj <= sk) {
if (intersects(j._, c._)) {
b = j, a.next = b, b.previous = a, --i;
continue pack;
}
sj += j._.r, j = j.next;
} else {
if (intersects(k._, c._)) {
a = k, a.next = b, b.previous = a, --i;
continue pack;
}
sk += k._.r, k = k.previous;
}
} while (j !== k.next);
// Success! Insert the new circle c between a and b.
c.previous = a, c.next = b, a.next = b.previous = b = c;
// Compute the new closest circle pair to the centroid.
aa = score(a);
while ((c = c.next) !== b) {
if ((ca = score(c)) < aa) {
a = c, aa = ca;
}
}
b = a.next;
}
// Compute the enclosing circle of the front chain.
a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = Object(_enclose__WEBPACK_IMPORTED_MODULE_0__["default"])(a);
// Translate the circles to put the enclosing circle around the origin.
for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
return c.r;
}
/* harmony default export */ __webpack_exports__["default"] = (function(circles) {
packEnclose(circles);
return circles;
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/partition.js":
/*!****************************************************!*\
!*** ./node_modules/d3-hierarchy/src/partition.js ***!
\****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _treemap_round__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./treemap/round */ "./node_modules/d3-hierarchy/src/treemap/round.js");
/* harmony import */ var _treemap_dice__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./treemap/dice */ "./node_modules/d3-hierarchy/src/treemap/dice.js");
/* harmony default export */ __webpack_exports__["default"] = (function() {
var dx = 1,
dy = 1,
padding = 0,
round = false;
function partition(root) {
var n = root.height + 1;
root.x0 =
root.y0 = padding;
root.x1 = dx;
root.y1 = dy / n;
root.eachBefore(positionNode(dy, n));
if (round) root.eachBefore(_treemap_round__WEBPACK_IMPORTED_MODULE_0__["default"]);
return root;
}
function positionNode(dy, n) {
return function(node) {
if (node.children) {
Object(_treemap_dice__WEBPACK_IMPORTED_MODULE_1__["default"])(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
}
var x0 = node.x0,
y0 = node.y0,
x1 = node.x1 - padding,
y1 = node.y1 - padding;
if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
node.x0 = x0;
node.y0 = y0;
node.x1 = x1;
node.y1 = y1;
};
}
partition.round = function(x) {
return arguments.length ? (round = !!x, partition) : round;
};
partition.size = function(x) {
return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
};
partition.padding = function(x) {
return arguments.length ? (padding = +x, partition) : padding;
};
return partition;
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/stratify.js":
/*!***************************************************!*\
!*** ./node_modules/d3-hierarchy/src/stratify.js ***!
\***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _accessors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./accessors */ "./node_modules/d3-hierarchy/src/accessors.js");
/* harmony import */ var _hierarchy_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hierarchy/index */ "./node_modules/d3-hierarchy/src/hierarchy/index.js");
var keyPrefix = "$", // Protect against keys like “__proto__”.
preroot = {depth: -1},
ambiguous = {};
function defaultId(d) {
return d.id;
}
function defaultParentId(d) {
return d.parentId;
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
var id = defaultId,
parentId = defaultParentId;
function stratify(data) {
var d,
i,
n = data.length,
root,
parent,
node,
nodes = new Array(n),
nodeId,
nodeKey,
nodeByKey = {};
for (i = 0; i < n; ++i) {
d = data[i], node = nodes[i] = new _hierarchy_index__WEBPACK_IMPORTED_MODULE_1__["Node"](d);
if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
nodeKey = keyPrefix + (node.id = nodeId);
nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
}
}
for (i = 0; i < n; ++i) {
node = nodes[i], nodeId = parentId(data[i], i, data);
if (nodeId == null || !(nodeId += "")) {
if (root) throw new Error("multiple roots");
root = node;
} else {
parent = nodeByKey[keyPrefix + nodeId];
if (!parent) throw new Error("missing: " + nodeId);
if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
if (parent.children) parent.children.push(node);
else parent.children = [node];
node.parent = parent;
}
}
if (!root) throw new Error("no root");
root.parent = preroot;
root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(_hierarchy_index__WEBPACK_IMPORTED_MODULE_1__["computeHeight"]);
root.parent = null;
if (n > 0) throw new Error("cycle");
return root;
}
stratify.id = function(x) {
return arguments.length ? (id = Object(_accessors__WEBPACK_IMPORTED_MODULE_0__["required"])(x), stratify) : id;
};
stratify.parentId = function(x) {
return arguments.length ? (parentId = Object(_accessors__WEBPACK_IMPORTED_MODULE_0__["required"])(x), stratify) : parentId;
};
return stratify;
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/tree.js":
/*!***********************************************!*\
!*** ./node_modules/d3-hierarchy/src/tree.js ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _hierarchy_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./hierarchy/index */ "./node_modules/d3-hierarchy/src/hierarchy/index.js");
function defaultSeparation(a, b) {
return a.parent === b.parent ? 1 : 2;
}
// function radialSeparation(a, b) {
// return (a.parent === b.parent ? 1 : 2) / a.depth;
// }
// This function is used to traverse the left contour of a subtree (or
// subforest). It returns the successor of v on this contour. This successor is
// either given by the leftmost child of v or by the thread of v. The function
// returns null if and only if v is on the highest level of its subtree.
function nextLeft(v) {
var children = v.children;
return children ? children[0] : v.t;
}
// This function works analogously to nextLeft.
function nextRight(v) {
var children = v.children;
return children ? children[children.length - 1] : v.t;
}
// Shifts the current subtree rooted at w+. This is done by increasing
// prelim(w+) and mod(w+) by shift.
function moveSubtree(wm, wp, shift) {
var change = shift / (wp.i - wm.i);
wp.c -= change;
wp.s += shift;
wm.c += change;
wp.z += shift;
wp.m += shift;
}
// All other shifts, applied to the smaller subtrees between w- and w+, are
// performed by this function. To prepare the shifts, we have to adjust
// change(w+), shift(w+), and change(w-).
function executeShifts(v) {
var shift = 0,
change = 0,
children = v.children,
i = children.length,
w;
while (--i >= 0) {
w = children[i];
w.z += shift;
w.m += shift;
shift += w.s + (change += w.c);
}
}
// If vi-s ancestor is a sibling of v, returns vi-s ancestor. Otherwise,
// returns the specified (default) ancestor.
function nextAncestor(vim, v, ancestor) {
return vim.a.parent === v.parent ? vim.a : ancestor;
}
function TreeNode(node, i) {
this._ = node;
this.parent = null;
this.children = null;
this.A = null; // default ancestor
this.a = this; // ancestor
this.z = 0; // prelim
this.m = 0; // mod
this.c = 0; // change
this.s = 0; // shift
this.t = null; // thread
this.i = i; // number
}
TreeNode.prototype = Object.create(_hierarchy_index__WEBPACK_IMPORTED_MODULE_0__["Node"].prototype);
function treeRoot(root) {
var tree = new TreeNode(root, 0),
node,
nodes = [tree],
child,
children,
i,
n;
while (node = nodes.pop()) {
if (children = node._.children) {
node.children = new Array(n = children.length);
for (i = n - 1; i >= 0; --i) {
nodes.push(child = node.children[i] = new TreeNode(children[i], i));
child.parent = node;
}
}
}
(tree.parent = new TreeNode(null, 0)).children = [tree];
return tree;
}
// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
/* harmony default export */ __webpack_exports__["default"] = (function() {
var separation = defaultSeparation,
dx = 1,
dy = 1,
nodeSize = null;
function tree(root) {
var t = treeRoot(root);
// Compute the layout using Buchheim et al.s algorithm.
t.eachAfter(firstWalk), t.parent.m = -t.z;
t.eachBefore(secondWalk);
// If a fixed node size is specified, scale x and y.
if (nodeSize) root.eachBefore(sizeNode);
// If a fixed tree size is specified, scale x and y based on the extent.
// Compute the left-most, right-most, and depth-most nodes for extents.
else {
var left = root,
right = root,
bottom = root;
root.eachBefore(function(node) {
if (node.x < left.x) left = node;
if (node.x > right.x) right = node;
if (node.depth > bottom.depth) bottom = node;
});
var s = left === right ? 1 : separation(left, right) / 2,
tx = s - left.x,
kx = dx / (right.x + s + tx),
ky = dy / (bottom.depth || 1);
root.eachBefore(function(node) {
node.x = (node.x + tx) * kx;
node.y = node.depth * ky;
});
}
return root;
}
// Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
// applied recursively to the children of v, as well as the function
// APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
// node v is placed to the midpoint of its outermost children.
function firstWalk(v) {
var children = v.children,
siblings = v.parent.children,
w = v.i ? siblings[v.i - 1] : null;
if (children) {
executeShifts(v);
var midpoint = (children[0].z + children[children.length - 1].z) / 2;
if (w) {
v.z = w.z + separation(v._, w._);
v.m = v.z - midpoint;
} else {
v.z = midpoint;
}
} else if (w) {
v.z = w.z + separation(v._, w._);
}
v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
}
// Computes all real x-coordinates by summing up the modifiers recursively.
function secondWalk(v) {
v._.x = v.z + v.parent.m;
v.m += v.parent.m;
}
// The core of the algorithm. Here, a new subtree is combined with the
// previous subtrees. Threads are used to traverse the inside and outside
// contours of the left and right subtree up to the highest common level. The
// vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
// superscript o means outside and i means inside, the subscript - means left
// subtree and + means right subtree. For summing up the modifiers along the
// contour, we use respective variables si+, si-, so-, and so+. Whenever two
// nodes of the inside contours conflict, we compute the left one of the
// greatest uncommon ancestors using the function ANCESTOR and call MOVE
// SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
// Finally, we add a new thread (if necessary).
function apportion(v, w, ancestor) {
if (w) {
var vip = v,
vop = v,
vim = w,
vom = vip.parent.children[0],
sip = vip.m,
sop = vop.m,
sim = vim.m,
som = vom.m,
shift;
while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
vom = nextLeft(vom);
vop = nextRight(vop);
vop.a = v;
shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
if (shift > 0) {
moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
sip += shift;
sop += shift;
}
sim += vim.m;
sip += vip.m;
som += vom.m;
sop += vop.m;
}
if (vim && !nextRight(vop)) {
vop.t = vim;
vop.m += sim - sop;
}
if (vip && !nextLeft(vom)) {
vom.t = vip;
vom.m += sip - som;
ancestor = v;
}
}
return ancestor;
}
function sizeNode(node) {
node.x *= dx;
node.y = node.depth * dy;
}
tree.separation = function(x) {
return arguments.length ? (separation = x, tree) : separation;
};
tree.size = function(x) {
return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
};
tree.nodeSize = function(x) {
return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
};
return tree;
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/treemap/binary.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-hierarchy/src/treemap/binary.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(parent, x0, y0, x1, y1) {
var nodes = parent.children,
i, n = nodes.length,
sum, sums = new Array(n + 1);
for (sums[0] = sum = i = 0; i < n; ++i) {
sums[i + 1] = sum += nodes[i].value;
}
partition(0, n, parent.value, x0, y0, x1, y1);
function partition(i, j, value, x0, y0, x1, y1) {
if (i >= j - 1) {
var node = nodes[i];
node.x0 = x0, node.y0 = y0;
node.x1 = x1, node.y1 = y1;
return;
}
var valueOffset = sums[i],
valueTarget = (value / 2) + valueOffset,
k = i + 1,
hi = j - 1;
while (k < hi) {
var mid = k + hi >>> 1;
if (sums[mid] < valueTarget) k = mid + 1;
else hi = mid;
}
if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
var valueLeft = sums[k] - valueOffset,
valueRight = value - valueLeft;
if ((x1 - x0) > (y1 - y0)) {
var xk = (x0 * valueRight + x1 * valueLeft) / value;
partition(i, k, valueLeft, x0, y0, xk, y1);
partition(k, j, valueRight, xk, y0, x1, y1);
} else {
var yk = (y0 * valueRight + y1 * valueLeft) / value;
partition(i, k, valueLeft, x0, y0, x1, yk);
partition(k, j, valueRight, x0, yk, x1, y1);
}
}
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/treemap/dice.js":
/*!*******************************************************!*\
!*** ./node_modules/d3-hierarchy/src/treemap/dice.js ***!
\*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(parent, x0, y0, x1, y1) {
var nodes = parent.children,
node,
i = -1,
n = nodes.length,
k = parent.value && (x1 - x0) / parent.value;
while (++i < n) {
node = nodes[i], node.y0 = y0, node.y1 = y1;
node.x0 = x0, node.x1 = x0 += node.value * k;
}
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/treemap/index.js":
/*!********************************************************!*\
!*** ./node_modules/d3-hierarchy/src/treemap/index.js ***!
\********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _round__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./round */ "./node_modules/d3-hierarchy/src/treemap/round.js");
/* harmony import */ var _squarify__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./squarify */ "./node_modules/d3-hierarchy/src/treemap/squarify.js");
/* harmony import */ var _accessors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../accessors */ "./node_modules/d3-hierarchy/src/accessors.js");
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constant */ "./node_modules/d3-hierarchy/src/constant.js");
/* harmony default export */ __webpack_exports__["default"] = (function() {
var tile = _squarify__WEBPACK_IMPORTED_MODULE_1__["default"],
round = false,
dx = 1,
dy = 1,
paddingStack = [0],
paddingInner = _constant__WEBPACK_IMPORTED_MODULE_3__["constantZero"],
paddingTop = _constant__WEBPACK_IMPORTED_MODULE_3__["constantZero"],
paddingRight = _constant__WEBPACK_IMPORTED_MODULE_3__["constantZero"],
paddingBottom = _constant__WEBPACK_IMPORTED_MODULE_3__["constantZero"],
paddingLeft = _constant__WEBPACK_IMPORTED_MODULE_3__["constantZero"];
function treemap(root) {
root.x0 =
root.y0 = 0;
root.x1 = dx;
root.y1 = dy;
root.eachBefore(positionNode);
paddingStack = [0];
if (round) root.eachBefore(_round__WEBPACK_IMPORTED_MODULE_0__["default"]);
return root;
}
function positionNode(node) {
var p = paddingStack[node.depth],
x0 = node.x0 + p,
y0 = node.y0 + p,
x1 = node.x1 - p,
y1 = node.y1 - p;
if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
node.x0 = x0;
node.y0 = y0;
node.x1 = x1;
node.y1 = y1;
if (node.children) {
p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
x0 += paddingLeft(node) - p;
y0 += paddingTop(node) - p;
x1 -= paddingRight(node) - p;
y1 -= paddingBottom(node) - p;
if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
tile(node, x0, y0, x1, y1);
}
}
treemap.round = function(x) {
return arguments.length ? (round = !!x, treemap) : round;
};
treemap.size = function(x) {
return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
};
treemap.tile = function(x) {
return arguments.length ? (tile = Object(_accessors__WEBPACK_IMPORTED_MODULE_2__["required"])(x), treemap) : tile;
};
treemap.padding = function(x) {
return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
};
treemap.paddingInner = function(x) {
return arguments.length ? (paddingInner = typeof x === "function" ? x : Object(_constant__WEBPACK_IMPORTED_MODULE_3__["default"])(+x), treemap) : paddingInner;
};
treemap.paddingOuter = function(x) {
return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
};
treemap.paddingTop = function(x) {
return arguments.length ? (paddingTop = typeof x === "function" ? x : Object(_constant__WEBPACK_IMPORTED_MODULE_3__["default"])(+x), treemap) : paddingTop;
};
treemap.paddingRight = function(x) {
return arguments.length ? (paddingRight = typeof x === "function" ? x : Object(_constant__WEBPACK_IMPORTED_MODULE_3__["default"])(+x), treemap) : paddingRight;
};
treemap.paddingBottom = function(x) {
return arguments.length ? (paddingBottom = typeof x === "function" ? x : Object(_constant__WEBPACK_IMPORTED_MODULE_3__["default"])(+x), treemap) : paddingBottom;
};
treemap.paddingLeft = function(x) {
return arguments.length ? (paddingLeft = typeof x === "function" ? x : Object(_constant__WEBPACK_IMPORTED_MODULE_3__["default"])(+x), treemap) : paddingLeft;
};
return treemap;
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/treemap/resquarify.js":
/*!*************************************************************!*\
!*** ./node_modules/d3-hierarchy/src/treemap/resquarify.js ***!
\*************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _dice__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dice */ "./node_modules/d3-hierarchy/src/treemap/dice.js");
/* harmony import */ var _slice__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./slice */ "./node_modules/d3-hierarchy/src/treemap/slice.js");
/* harmony import */ var _squarify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./squarify */ "./node_modules/d3-hierarchy/src/treemap/squarify.js");
/* harmony default export */ __webpack_exports__["default"] = ((function custom(ratio) {
function resquarify(parent, x0, y0, x1, y1) {
if ((rows = parent._squarify) && (rows.ratio === ratio)) {
var rows,
row,
nodes,
i,
j = -1,
n,
m = rows.length,
value = parent.value;
while (++j < m) {
row = rows[j], nodes = row.children;
for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
if (row.dice) Object(_dice__WEBPACK_IMPORTED_MODULE_0__["default"])(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
else Object(_slice__WEBPACK_IMPORTED_MODULE_1__["default"])(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
value -= row.value;
}
} else {
parent._squarify = rows = Object(_squarify__WEBPACK_IMPORTED_MODULE_2__["squarifyRatio"])(ratio, parent, x0, y0, x1, y1);
rows.ratio = ratio;
}
}
resquarify.ratio = function(x) {
return custom((x = +x) > 1 ? x : 1);
};
return resquarify;
})(_squarify__WEBPACK_IMPORTED_MODULE_2__["phi"]));
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/treemap/round.js":
/*!********************************************************!*\
!*** ./node_modules/d3-hierarchy/src/treemap/round.js ***!
\********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(node) {
node.x0 = Math.round(node.x0);
node.y0 = Math.round(node.y0);
node.x1 = Math.round(node.x1);
node.y1 = Math.round(node.y1);
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/treemap/slice.js":
/*!********************************************************!*\
!*** ./node_modules/d3-hierarchy/src/treemap/slice.js ***!
\********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(parent, x0, y0, x1, y1) {
var nodes = parent.children,
node,
i = -1,
n = nodes.length,
k = parent.value && (y1 - y0) / parent.value;
while (++i < n) {
node = nodes[i], node.x0 = x0, node.x1 = x1;
node.y0 = y0, node.y1 = y0 += node.value * k;
}
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/treemap/sliceDice.js":
/*!************************************************************!*\
!*** ./node_modules/d3-hierarchy/src/treemap/sliceDice.js ***!
\************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _dice__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dice */ "./node_modules/d3-hierarchy/src/treemap/dice.js");
/* harmony import */ var _slice__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./slice */ "./node_modules/d3-hierarchy/src/treemap/slice.js");
/* harmony default export */ __webpack_exports__["default"] = (function(parent, x0, y0, x1, y1) {
(parent.depth & 1 ? _slice__WEBPACK_IMPORTED_MODULE_1__["default"] : _dice__WEBPACK_IMPORTED_MODULE_0__["default"])(parent, x0, y0, x1, y1);
});
/***/ }),
/***/ "./node_modules/d3-hierarchy/src/treemap/squarify.js":
/*!***********************************************************!*\
!*** ./node_modules/d3-hierarchy/src/treemap/squarify.js ***!
\***********************************************************/
/*! exports provided: phi, squarifyRatio, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "phi", function() { return phi; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squarifyRatio", function() { return squarifyRatio; });
/* harmony import */ var _dice__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dice */ "./node_modules/d3-hierarchy/src/treemap/dice.js");
/* harmony import */ var _slice__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./slice */ "./node_modules/d3-hierarchy/src/treemap/slice.js");
var phi = (1 + Math.sqrt(5)) / 2;
function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
var rows = [],
nodes = parent.children,
row,
nodeValue,
i0 = 0,
i1 = 0,
n = nodes.length,
dx, dy,
value = parent.value,
sumValue,
minValue,
maxValue,
newRatio,
minRatio,
alpha,
beta;
while (i0 < n) {
dx = x1 - x0, dy = y1 - y0;
// Find the next non-empty node.
do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
minValue = maxValue = sumValue;
alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
beta = sumValue * sumValue * alpha;
minRatio = Math.max(maxValue / beta, beta / minValue);
// Keep adding nodes while the aspect ratio maintains or improves.
for (; i1 < n; ++i1) {
sumValue += nodeValue = nodes[i1].value;
if (nodeValue < minValue) minValue = nodeValue;
if (nodeValue > maxValue) maxValue = nodeValue;
beta = sumValue * sumValue * alpha;
newRatio = Math.max(maxValue / beta, beta / minValue);
if (newRatio > minRatio) { sumValue -= nodeValue; break; }
minRatio = newRatio;
}
// Position and record the row orientation.
rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
if (row.dice) Object(_dice__WEBPACK_IMPORTED_MODULE_0__["default"])(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
else Object(_slice__WEBPACK_IMPORTED_MODULE_1__["default"])(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
value -= sumValue, i0 = i1;
}
return rows;
}
/* harmony default export */ __webpack_exports__["default"] = ((function custom(ratio) {
function squarify(parent, x0, y0, x1, y1) {
squarifyRatio(ratio, parent, x0, y0, x1, y1);
}
squarify.ratio = function(x) {
return custom((x = +x) > 1 ? x : 1);
};
return squarify;
})(phi));
/***/ }),
/***/ "./node_modules/d3-interpolate/src/array.js":
/*!**************************************************!*\
!*** ./node_modules/d3-interpolate/src/array.js ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _value__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./value */ "./node_modules/d3-interpolate/src/value.js");
/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
var nb = b ? b.length : 0,
na = a ? Math.min(nb, a.length) : 0,
x = new Array(na),
c = new Array(nb),
i;
for (i = 0; i < na; ++i) x[i] = Object(_value__WEBPACK_IMPORTED_MODULE_0__["default"])(a[i], b[i]);
for (; i < nb; ++i) c[i] = b[i];
return function(t) {
for (i = 0; i < na; ++i) c[i] = x[i](t);
return c;
};
});
/***/ }),
/***/ "./node_modules/d3-interpolate/src/basis.js":
/*!**************************************************!*\
!*** ./node_modules/d3-interpolate/src/basis.js ***!
\**************************************************/
/*! exports provided: basis, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "basis", function() { return basis; });
function basis(t1, v0, v1, v2, v3) {
var t2 = t1 * t1, t3 = t2 * t1;
return ((1 - 3 * t1 + 3 * t2 - t3) * v0
+ (4 - 6 * t2 + 3 * t3) * v1
+ (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
+ t3 * v3) / 6;
}
/* harmony default export */ __webpack_exports__["default"] = (function(values) {
var n = values.length - 1;
return function(t) {
var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
v1 = values[i],
v2 = values[i + 1],
v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
return basis((t - i / n) * n, v0, v1, v2, v3);
};
});
/***/ }),
/***/ "./node_modules/d3-interpolate/src/basisClosed.js":
/*!********************************************************!*\
!*** ./node_modules/d3-interpolate/src/basisClosed.js ***!
\********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _basis__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./basis */ "./node_modules/d3-interpolate/src/basis.js");
/* harmony default export */ __webpack_exports__["default"] = (function(values) {
var n = values.length;
return function(t) {
var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
v0 = values[(i + n - 1) % n],
v1 = values[i % n],
v2 = values[(i + 1) % n],
v3 = values[(i + 2) % n];
return Object(_basis__WEBPACK_IMPORTED_MODULE_0__["basis"])((t - i / n) * n, v0, v1, v2, v3);
};
});
/***/ }),
/***/ "./node_modules/d3-interpolate/src/color.js":
/*!**************************************************!*\
!*** ./node_modules/d3-interpolate/src/color.js ***!
\**************************************************/
/*! exports provided: hue, gamma, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hue", function() { return hue; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gamma", function() { return gamma; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return nogamma; });
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-interpolate/src/constant.js");
function linear(a, d) {
return function(t) {
return a + t * d;
};
}
function exponential(a, b, y) {
return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
return Math.pow(a + t * b, y);
};
}
function hue(a, b) {
var d = b - a;
return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(isNaN(a) ? b : a);
}
function gamma(y) {
return (y = +y) === 1 ? nogamma : function(a, b) {
return b - a ? exponential(a, b, y) : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(isNaN(a) ? b : a);
};
}
function nogamma(a, b) {
var d = b - a;
return d ? linear(a, d) : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(isNaN(a) ? b : a);
}
/***/ }),
/***/ "./node_modules/d3-interpolate/src/constant.js":
/*!*****************************************************!*\
!*** ./node_modules/d3-interpolate/src/constant.js ***!
\*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(x) {
return function() {
return x;
};
});
/***/ }),
/***/ "./node_modules/d3-interpolate/src/cubehelix.js":
/*!******************************************************!*\
!*** ./node_modules/d3-interpolate/src/cubehelix.js ***!
\******************************************************/
/*! exports provided: default, cubehelixLong */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cubehelixLong", function() { return cubehelixLong; });
/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
/* harmony import */ var _color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color */ "./node_modules/d3-interpolate/src/color.js");
function cubehelix(hue) {
return (function cubehelixGamma(y) {
y = +y;
function cubehelix(start, end) {
var h = hue((start = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["cubehelix"])(start)).h, (end = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["cubehelix"])(end)).h),
s = Object(_color__WEBPACK_IMPORTED_MODULE_1__["default"])(start.s, end.s),
l = Object(_color__WEBPACK_IMPORTED_MODULE_1__["default"])(start.l, end.l),
opacity = Object(_color__WEBPACK_IMPORTED_MODULE_1__["default"])(start.opacity, end.opacity);
return function(t) {
start.h = h(t);
start.s = s(t);
start.l = l(Math.pow(t, y));
start.opacity = opacity(t);
return start + "";
};
}
cubehelix.gamma = cubehelixGamma;
return cubehelix;
})(1);
}
/* harmony default export */ __webpack_exports__["default"] = (cubehelix(_color__WEBPACK_IMPORTED_MODULE_1__["hue"]));
var cubehelixLong = cubehelix(_color__WEBPACK_IMPORTED_MODULE_1__["default"]);
/***/ }),
/***/ "./node_modules/d3-interpolate/src/date.js":
/*!*************************************************!*\
!*** ./node_modules/d3-interpolate/src/date.js ***!
\*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
var d = new Date;
return a = +a, b -= a, function(t) {
return d.setTime(a + b * t), d;
};
});
/***/ }),
/***/ "./node_modules/d3-interpolate/src/discrete.js":
/*!*****************************************************!*\
!*** ./node_modules/d3-interpolate/src/discrete.js ***!
\*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(range) {
var n = range.length;
return function(t) {
return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
};
});
/***/ }),
/***/ "./node_modules/d3-interpolate/src/hcl.js":
/*!************************************************!*\
!*** ./node_modules/d3-interpolate/src/hcl.js ***!
\************************************************/
/*! exports provided: default, hclLong */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hclLong", function() { return hclLong; });
/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
/* harmony import */ var _color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color */ "./node_modules/d3-interpolate/src/color.js");
function hcl(hue) {
return function(start, end) {
var h = hue((start = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["hcl"])(start)).h, (end = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["hcl"])(end)).h),
c = Object(_color__WEBPACK_IMPORTED_MODULE_1__["default"])(start.c, end.c),
l = Object(_color__WEBPACK_IMPORTED_MODULE_1__["default"])(start.l, end.l),
opacity = Object(_color__WEBPACK_IMPORTED_MODULE_1__["default"])(start.opacity, end.opacity);
return function(t) {
start.h = h(t);
start.c = c(t);
start.l = l(t);
start.opacity = opacity(t);
return start + "";
};
}
}
/* harmony default export */ __webpack_exports__["default"] = (hcl(_color__WEBPACK_IMPORTED_MODULE_1__["hue"]));
var hclLong = hcl(_color__WEBPACK_IMPORTED_MODULE_1__["default"]);
/***/ }),
/***/ "./node_modules/d3-interpolate/src/hsl.js":
/*!************************************************!*\
!*** ./node_modules/d3-interpolate/src/hsl.js ***!
\************************************************/
/*! exports provided: default, hslLong */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hslLong", function() { return hslLong; });
/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
/* harmony import */ var _color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color */ "./node_modules/d3-interpolate/src/color.js");
function hsl(hue) {
return function(start, end) {
var h = hue((start = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["hsl"])(start)).h, (end = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["hsl"])(end)).h),
s = Object(_color__WEBPACK_IMPORTED_MODULE_1__["default"])(start.s, end.s),
l = Object(_color__WEBPACK_IMPORTED_MODULE_1__["default"])(start.l, end.l),
opacity = Object(_color__WEBPACK_IMPORTED_MODULE_1__["default"])(start.opacity, end.opacity);
return function(t) {
start.h = h(t);
start.s = s(t);
start.l = l(t);
start.opacity = opacity(t);
return start + "";
};
}
}
/* harmony default export */ __webpack_exports__["default"] = (hsl(_color__WEBPACK_IMPORTED_MODULE_1__["hue"]));
var hslLong = hsl(_color__WEBPACK_IMPORTED_MODULE_1__["default"]);
/***/ }),
/***/ "./node_modules/d3-interpolate/src/hue.js":
/*!************************************************!*\
!*** ./node_modules/d3-interpolate/src/hue.js ***!
\************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./color */ "./node_modules/d3-interpolate/src/color.js");
/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
var i = Object(_color__WEBPACK_IMPORTED_MODULE_0__["hue"])(+a, +b);
return function(t) {
var x = i(t);
return x - 360 * Math.floor(x / 360);
};
});
/***/ }),
/***/ "./node_modules/d3-interpolate/src/index.js":
/*!**************************************************!*\
!*** ./node_modules/d3-interpolate/src/index.js ***!
\**************************************************/
/*! exports provided: interpolate, interpolateArray, interpolateBasis, interpolateBasisClosed, interpolateDate, interpolateDiscrete, interpolateHue, interpolateNumber, interpolateObject, interpolateRound, interpolateString, interpolateTransformCss, interpolateTransformSvg, interpolateZoom, interpolateRgb, interpolateRgbBasis, interpolateRgbBasisClosed, interpolateHsl, interpolateHslLong, interpolateLab, interpolateHcl, interpolateHclLong, interpolateCubehelix, interpolateCubehelixLong, piecewise, quantize */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _value__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./value */ "./node_modules/d3-interpolate/src/value.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolate", function() { return _value__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array */ "./node_modules/d3-interpolate/src/array.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateArray", function() { return _array__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/* harmony import */ var _basis__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./basis */ "./node_modules/d3-interpolate/src/basis.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateBasis", function() { return _basis__WEBPACK_IMPORTED_MODULE_2__["default"]; });
/* harmony import */ var _basisClosed__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./basisClosed */ "./node_modules/d3-interpolate/src/basisClosed.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateBasisClosed", function() { return _basisClosed__WEBPACK_IMPORTED_MODULE_3__["default"]; });
/* harmony import */ var _date__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./date */ "./node_modules/d3-interpolate/src/date.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateDate", function() { return _date__WEBPACK_IMPORTED_MODULE_4__["default"]; });
/* harmony import */ var _discrete__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./discrete */ "./node_modules/d3-interpolate/src/discrete.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateDiscrete", function() { return _discrete__WEBPACK_IMPORTED_MODULE_5__["default"]; });
/* harmony import */ var _hue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./hue */ "./node_modules/d3-interpolate/src/hue.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHue", function() { return _hue__WEBPACK_IMPORTED_MODULE_6__["default"]; });
/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./number */ "./node_modules/d3-interpolate/src/number.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateNumber", function() { return _number__WEBPACK_IMPORTED_MODULE_7__["default"]; });
/* harmony import */ var _object__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./object */ "./node_modules/d3-interpolate/src/object.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateObject", function() { return _object__WEBPACK_IMPORTED_MODULE_8__["default"]; });
/* harmony import */ var _round__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./round */ "./node_modules/d3-interpolate/src/round.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRound", function() { return _round__WEBPACK_IMPORTED_MODULE_9__["default"]; });
/* harmony import */ var _string__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./string */ "./node_modules/d3-interpolate/src/string.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateString", function() { return _string__WEBPACK_IMPORTED_MODULE_10__["default"]; });
/* harmony import */ var _transform_index__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./transform/index */ "./node_modules/d3-interpolate/src/transform/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateTransformCss", function() { return _transform_index__WEBPACK_IMPORTED_MODULE_11__["interpolateTransformCss"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateTransformSvg", function() { return _transform_index__WEBPACK_IMPORTED_MODULE_11__["interpolateTransformSvg"]; });
/* harmony import */ var _zoom__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./zoom */ "./node_modules/d3-interpolate/src/zoom.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateZoom", function() { return _zoom__WEBPACK_IMPORTED_MODULE_12__["default"]; });
/* harmony import */ var _rgb__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./rgb */ "./node_modules/d3-interpolate/src/rgb.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRgb", function() { return _rgb__WEBPACK_IMPORTED_MODULE_13__["default"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRgbBasis", function() { return _rgb__WEBPACK_IMPORTED_MODULE_13__["rgbBasis"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRgbBasisClosed", function() { return _rgb__WEBPACK_IMPORTED_MODULE_13__["rgbBasisClosed"]; });
/* harmony import */ var _hsl__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./hsl */ "./node_modules/d3-interpolate/src/hsl.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHsl", function() { return _hsl__WEBPACK_IMPORTED_MODULE_14__["default"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHslLong", function() { return _hsl__WEBPACK_IMPORTED_MODULE_14__["hslLong"]; });
/* harmony import */ var _lab__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./lab */ "./node_modules/d3-interpolate/src/lab.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateLab", function() { return _lab__WEBPACK_IMPORTED_MODULE_15__["default"]; });
/* harmony import */ var _hcl__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./hcl */ "./node_modules/d3-interpolate/src/hcl.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHcl", function() { return _hcl__WEBPACK_IMPORTED_MODULE_16__["default"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHclLong", function() { return _hcl__WEBPACK_IMPORTED_MODULE_16__["hclLong"]; });
/* harmony import */ var _cubehelix__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./cubehelix */ "./node_modules/d3-interpolate/src/cubehelix.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateCubehelix", function() { return _cubehelix__WEBPACK_IMPORTED_MODULE_17__["default"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateCubehelixLong", function() { return _cubehelix__WEBPACK_IMPORTED_MODULE_17__["cubehelixLong"]; });
/* harmony import */ var _piecewise__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./piecewise */ "./node_modules/d3-interpolate/src/piecewise.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "piecewise", function() { return _piecewise__WEBPACK_IMPORTED_MODULE_18__["default"]; });
/* harmony import */ var _quantize__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./quantize */ "./node_modules/d3-interpolate/src/quantize.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "quantize", function() { return _quantize__WEBPACK_IMPORTED_MODULE_19__["default"]; });
/***/ }),
/***/ "./node_modules/d3-interpolate/src/lab.js":
/*!************************************************!*\
!*** ./node_modules/d3-interpolate/src/lab.js ***!
\************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return lab; });
/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
/* harmony import */ var _color__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color */ "./node_modules/d3-interpolate/src/color.js");
function lab(start, end) {
var l = Object(_color__WEBPACK_IMPORTED_MODULE_1__["default"])((start = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["lab"])(start)).l, (end = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["lab"])(end)).l),
a = Object(_color__WEBPACK_IMPORTED_MODULE_1__["default"])(start.a, end.a),
b = Object(_color__WEBPACK_IMPORTED_MODULE_1__["default"])(start.b, end.b),
opacity = Object(_color__WEBPACK_IMPORTED_MODULE_1__["default"])(start.opacity, end.opacity);
return function(t) {
start.l = l(t);
start.a = a(t);
start.b = b(t);
start.opacity = opacity(t);
return start + "";
};
}
/***/ }),
/***/ "./node_modules/d3-interpolate/src/number.js":
/*!***************************************************!*\
!*** ./node_modules/d3-interpolate/src/number.js ***!
\***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
return a = +a, b -= a, function(t) {
return a + b * t;
};
});
/***/ }),
/***/ "./node_modules/d3-interpolate/src/object.js":
/*!***************************************************!*\
!*** ./node_modules/d3-interpolate/src/object.js ***!
\***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _value__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./value */ "./node_modules/d3-interpolate/src/value.js");
/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
var i = {},
c = {},
k;
if (a === null || typeof a !== "object") a = {};
if (b === null || typeof b !== "object") b = {};
for (k in b) {
if (k in a) {
i[k] = Object(_value__WEBPACK_IMPORTED_MODULE_0__["default"])(a[k], b[k]);
} else {
c[k] = b[k];
}
}
return function(t) {
for (k in i) c[k] = i[k](t);
return c;
};
});
/***/ }),
/***/ "./node_modules/d3-interpolate/src/piecewise.js":
/*!******************************************************!*\
!*** ./node_modules/d3-interpolate/src/piecewise.js ***!
\******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return piecewise; });
function piecewise(interpolate, values) {
var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n);
while (i < n) I[i] = interpolate(v, v = values[++i]);
return function(t) {
var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));
return I[i](t - i);
};
}
/***/ }),
/***/ "./node_modules/d3-interpolate/src/quantize.js":
/*!*****************************************************!*\
!*** ./node_modules/d3-interpolate/src/quantize.js ***!
\*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(interpolator, n) {
var samples = new Array(n);
for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
return samples;
});
/***/ }),
/***/ "./node_modules/d3-interpolate/src/rgb.js":
/*!************************************************!*\
!*** ./node_modules/d3-interpolate/src/rgb.js ***!
\************************************************/
/*! exports provided: default, rgbBasis, rgbBasisClosed */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rgbBasis", function() { return rgbBasis; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rgbBasisClosed", function() { return rgbBasisClosed; });
/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
/* harmony import */ var _basis__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./basis */ "./node_modules/d3-interpolate/src/basis.js");
/* harmony import */ var _basisClosed__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./basisClosed */ "./node_modules/d3-interpolate/src/basisClosed.js");
/* harmony import */ var _color__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./color */ "./node_modules/d3-interpolate/src/color.js");
/* harmony default export */ __webpack_exports__["default"] = ((function rgbGamma(y) {
var color = Object(_color__WEBPACK_IMPORTED_MODULE_3__["gamma"])(y);
function rgb(start, end) {
var r = color((start = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["rgb"])(start)).r, (end = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["rgb"])(end)).r),
g = color(start.g, end.g),
b = color(start.b, end.b),
opacity = Object(_color__WEBPACK_IMPORTED_MODULE_3__["default"])(start.opacity, end.opacity);
return function(t) {
start.r = r(t);
start.g = g(t);
start.b = b(t);
start.opacity = opacity(t);
return start + "";
};
}
rgb.gamma = rgbGamma;
return rgb;
})(1));
function rgbSpline(spline) {
return function(colors) {
var n = colors.length,
r = new Array(n),
g = new Array(n),
b = new Array(n),
i, color;
for (i = 0; i < n; ++i) {
color = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["rgb"])(colors[i]);
r[i] = color.r || 0;
g[i] = color.g || 0;
b[i] = color.b || 0;
}
r = spline(r);
g = spline(g);
b = spline(b);
color.opacity = 1;
return function(t) {
color.r = r(t);
color.g = g(t);
color.b = b(t);
return color + "";
};
};
}
var rgbBasis = rgbSpline(_basis__WEBPACK_IMPORTED_MODULE_1__["default"]);
var rgbBasisClosed = rgbSpline(_basisClosed__WEBPACK_IMPORTED_MODULE_2__["default"]);
/***/ }),
/***/ "./node_modules/d3-interpolate/src/round.js":
/*!**************************************************!*\
!*** ./node_modules/d3-interpolate/src/round.js ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
return a = +a, b -= a, function(t) {
return Math.round(a + b * t);
};
});
/***/ }),
/***/ "./node_modules/d3-interpolate/src/string.js":
/*!***************************************************!*\
!*** ./node_modules/d3-interpolate/src/string.js ***!
\***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./number */ "./node_modules/d3-interpolate/src/number.js");
var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
reB = new RegExp(reA.source, "g");
function zero(b) {
return function() {
return b;
};
}
function one(b) {
return function(t) {
return b(t) + "";
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
am, // current match in a
bm, // current match in b
bs, // string preceding current number in b, if any
i = -1, // index in s
s = [], // string constants and placeholders
q = []; // number interpolators
// Coerce inputs to strings.
a = a + "", b = b + "";
// Interpolate pairs of numbers in a & b.
while ((am = reA.exec(a))
&& (bm = reB.exec(b))) {
if ((bs = bm.index) > bi) { // a string precedes the next number in b
bs = b.slice(bi, bs);
if (s[i]) s[i] += bs; // coalesce with previous string
else s[++i] = bs;
}
if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
if (s[i]) s[i] += bm; // coalesce with previous string
else s[++i] = bm;
} else { // interpolate non-matching numbers
s[++i] = null;
q.push({i: i, x: Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(am, bm)});
}
bi = reB.lastIndex;
}
// Add remains of b.
if (bi < b.length) {
bs = b.slice(bi);
if (s[i]) s[i] += bs; // coalesce with previous string
else s[++i] = bs;
}
// Special optimization for only a single match.
// Otherwise, interpolate each of the numbers and rejoin the string.
return s.length < 2 ? (q[0]
? one(q[0].x)
: zero(b))
: (b = q.length, function(t) {
for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
return s.join("");
});
});
/***/ }),
/***/ "./node_modules/d3-interpolate/src/transform/decompose.js":
/*!****************************************************************!*\
!*** ./node_modules/d3-interpolate/src/transform/decompose.js ***!
\****************************************************************/
/*! exports provided: identity, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return identity; });
var degrees = 180 / Math.PI;
var identity = {
translateX: 0,
translateY: 0,
rotate: 0,
skewX: 0,
scaleX: 1,
scaleY: 1
};
/* harmony default export */ __webpack_exports__["default"] = (function(a, b, c, d, e, f) {
var scaleX, scaleY, skewX;
if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
return {
translateX: e,
translateY: f,
rotate: Math.atan2(b, a) * degrees,
skewX: Math.atan(skewX) * degrees,
scaleX: scaleX,
scaleY: scaleY
};
});
/***/ }),
/***/ "./node_modules/d3-interpolate/src/transform/index.js":
/*!************************************************************!*\
!*** ./node_modules/d3-interpolate/src/transform/index.js ***!
\************************************************************/
/*! exports provided: interpolateTransformCss, interpolateTransformSvg */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateTransformCss", function() { return interpolateTransformCss; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateTransformSvg", function() { return interpolateTransformSvg; });
/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../number */ "./node_modules/d3-interpolate/src/number.js");
/* harmony import */ var _parse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./parse */ "./node_modules/d3-interpolate/src/transform/parse.js");
function interpolateTransform(parse, pxComma, pxParen, degParen) {
function pop(s) {
return s.length ? s.pop() + " " : "";
}
function translate(xa, ya, xb, yb, s, q) {
if (xa !== xb || ya !== yb) {
var i = s.push("translate(", null, pxComma, null, pxParen);
q.push({i: i - 4, x: Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(xa, xb)}, {i: i - 2, x: Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(ya, yb)});
} else if (xb || yb) {
s.push("translate(" + xb + pxComma + yb + pxParen);
}
}
function rotate(a, b, s, q) {
if (a !== b) {
if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(a, b)});
} else if (b) {
s.push(pop(s) + "rotate(" + b + degParen);
}
}
function skewX(a, b, s, q) {
if (a !== b) {
q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(a, b)});
} else if (b) {
s.push(pop(s) + "skewX(" + b + degParen);
}
}
function scale(xa, ya, xb, yb, s, q) {
if (xa !== xb || ya !== yb) {
var i = s.push(pop(s) + "scale(", null, ",", null, ")");
q.push({i: i - 4, x: Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(xa, xb)}, {i: i - 2, x: Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(ya, yb)});
} else if (xb !== 1 || yb !== 1) {
s.push(pop(s) + "scale(" + xb + "," + yb + ")");
}
}
return function(a, b) {
var s = [], // string constants and placeholders
q = []; // number interpolators
a = parse(a), b = parse(b);
translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
rotate(a.rotate, b.rotate, s, q);
skewX(a.skewX, b.skewX, s, q);
scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
a = b = null; // gc
return function(t) {
var i = -1, n = q.length, o;
while (++i < n) s[(o = q[i]).i] = o.x(t);
return s.join("");
};
};
}
var interpolateTransformCss = interpolateTransform(_parse__WEBPACK_IMPORTED_MODULE_1__["parseCss"], "px, ", "px)", "deg)");
var interpolateTransformSvg = interpolateTransform(_parse__WEBPACK_IMPORTED_MODULE_1__["parseSvg"], ", ", ")", ")");
/***/ }),
/***/ "./node_modules/d3-interpolate/src/transform/parse.js":
/*!************************************************************!*\
!*** ./node_modules/d3-interpolate/src/transform/parse.js ***!
\************************************************************/
/*! exports provided: parseCss, parseSvg */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseCss", function() { return parseCss; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseSvg", function() { return parseSvg; });
/* harmony import */ var _decompose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./decompose */ "./node_modules/d3-interpolate/src/transform/decompose.js");
var cssNode,
cssRoot,
cssView,
svgNode;
function parseCss(value) {
if (value === "none") return _decompose__WEBPACK_IMPORTED_MODULE_0__["identity"];
if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
cssNode.style.transform = value;
value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
cssRoot.removeChild(cssNode);
value = value.slice(7, -1).split(",");
return Object(_decompose__WEBPACK_IMPORTED_MODULE_0__["default"])(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
}
function parseSvg(value) {
if (value == null) return _decompose__WEBPACK_IMPORTED_MODULE_0__["identity"];
if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
svgNode.setAttribute("transform", value);
if (!(value = svgNode.transform.baseVal.consolidate())) return _decompose__WEBPACK_IMPORTED_MODULE_0__["identity"];
value = value.matrix;
return Object(_decompose__WEBPACK_IMPORTED_MODULE_0__["default"])(value.a, value.b, value.c, value.d, value.e, value.f);
}
/***/ }),
/***/ "./node_modules/d3-interpolate/src/value.js":
/*!**************************************************!*\
!*** ./node_modules/d3-interpolate/src/value.js ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
/* harmony import */ var _rgb__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rgb */ "./node_modules/d3-interpolate/src/rgb.js");
/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./array */ "./node_modules/d3-interpolate/src/array.js");
/* harmony import */ var _date__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./date */ "./node_modules/d3-interpolate/src/date.js");
/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./number */ "./node_modules/d3-interpolate/src/number.js");
/* harmony import */ var _object__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./object */ "./node_modules/d3-interpolate/src/object.js");
/* harmony import */ var _string__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./string */ "./node_modules/d3-interpolate/src/string.js");
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-interpolate/src/constant.js");
/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
var t = typeof b, c;
return b == null || t === "boolean" ? Object(_constant__WEBPACK_IMPORTED_MODULE_7__["default"])(b)
: (t === "number" ? _number__WEBPACK_IMPORTED_MODULE_4__["default"]
: t === "string" ? ((c = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["color"])(b)) ? (b = c, _rgb__WEBPACK_IMPORTED_MODULE_1__["default"]) : _string__WEBPACK_IMPORTED_MODULE_6__["default"])
: b instanceof d3_color__WEBPACK_IMPORTED_MODULE_0__["color"] ? _rgb__WEBPACK_IMPORTED_MODULE_1__["default"]
: b instanceof Date ? _date__WEBPACK_IMPORTED_MODULE_3__["default"]
: Array.isArray(b) ? _array__WEBPACK_IMPORTED_MODULE_2__["default"]
: typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? _object__WEBPACK_IMPORTED_MODULE_5__["default"]
: _number__WEBPACK_IMPORTED_MODULE_4__["default"])(a, b);
});
/***/ }),
/***/ "./node_modules/d3-interpolate/src/zoom.js":
/*!*************************************************!*\
!*** ./node_modules/d3-interpolate/src/zoom.js ***!
\*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
var rho = Math.SQRT2,
rho2 = 2,
rho4 = 4,
epsilon2 = 1e-12;
function cosh(x) {
return ((x = Math.exp(x)) + 1 / x) / 2;
}
function sinh(x) {
return ((x = Math.exp(x)) - 1 / x) / 2;
}
function tanh(x) {
return ((x = Math.exp(2 * x)) - 1) / (x + 1);
}
// p0 = [ux0, uy0, w0]
// p1 = [ux1, uy1, w1]
/* harmony default export */ __webpack_exports__["default"] = (function(p0, p1) {
var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
dx = ux1 - ux0,
dy = uy1 - uy0,
d2 = dx * dx + dy * dy,
i,
S;
// Special case for u0 ≅ u1.
if (d2 < epsilon2) {
S = Math.log(w1 / w0) / rho;
i = function(t) {
return [
ux0 + t * dx,
uy0 + t * dy,
w0 * Math.exp(rho * t * S)
];
}
}
// General case.
else {
var d1 = Math.sqrt(d2),
b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
S = (r1 - r0) / rho;
i = function(t) {
var s = t * S,
coshr0 = cosh(r0),
u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
return [
ux0 + u * dx,
uy0 + u * dy,
w0 * coshr0 / cosh(rho * s + r0)
];
}
}
i.duration = S * 1000;
return i;
});
/***/ }),
/***/ "./node_modules/d3-path/src/index.js":
/*!*******************************************!*\
!*** ./node_modules/d3-path/src/index.js ***!
\*******************************************/
/*! exports provided: path */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./path */ "./node_modules/d3-path/src/path.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "path", function() { return _path__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/***/ }),
/***/ "./node_modules/d3-path/src/path.js":
/*!******************************************!*\
!*** ./node_modules/d3-path/src/path.js ***!
\******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
var pi = Math.PI,
tau = 2 * pi,
epsilon = 1e-6,
tauEpsilon = tau - epsilon;
function Path() {
this._x0 = this._y0 = // start of current subpath
this._x1 = this._y1 = null; // end of current subpath
this._ = "";
}
function path() {
return new Path;
}
Path.prototype = path.prototype = {
constructor: Path,
moveTo: function(x, y) {
this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
},
closePath: function() {
if (this._x1 !== null) {
this._x1 = this._x0, this._y1 = this._y0;
this._ += "Z";
}
},
lineTo: function(x, y) {
this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
},
quadraticCurveTo: function(x1, y1, x, y) {
this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
},
bezierCurveTo: function(x1, y1, x2, y2, x, y) {
this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
},
arcTo: function(x1, y1, x2, y2, r) {
x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
var x0 = this._x1,
y0 = this._y1,
x21 = x2 - x1,
y21 = y2 - y1,
x01 = x0 - x1,
y01 = y0 - y1,
l01_2 = x01 * x01 + y01 * y01;
// Is the radius negative? Error.
if (r < 0) throw new Error("negative radius: " + r);
// Is this path empty? Move to (x1,y1).
if (this._x1 === null) {
this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
}
// Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
else if (!(l01_2 > epsilon));
// Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
// Equivalently, is (x1,y1) coincident with (x2,y2)?
// Or, is the radius zero? Line to (x1,y1).
else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {
this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
}
// Otherwise, draw an arc!
else {
var x20 = x2 - x0,
y20 = y2 - y0,
l21_2 = x21 * x21 + y21 * y21,
l20_2 = x20 * x20 + y20 * y20,
l21 = Math.sqrt(l21_2),
l01 = Math.sqrt(l01_2),
l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
t01 = l / l01,
t21 = l / l21;
// If the start tangent is not coincident with (x0,y0), line to.
if (Math.abs(t01 - 1) > epsilon) {
this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
}
this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
}
},
arc: function(x, y, r, a0, a1, ccw) {
x = +x, y = +y, r = +r;
var dx = r * Math.cos(a0),
dy = r * Math.sin(a0),
x0 = x + dx,
y0 = y + dy,
cw = 1 ^ ccw,
da = ccw ? a0 - a1 : a1 - a0;
// Is the radius negative? Error.
if (r < 0) throw new Error("negative radius: " + r);
// Is this path empty? Move to (x0,y0).
if (this._x1 === null) {
this._ += "M" + x0 + "," + y0;
}
// Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {
this._ += "L" + x0 + "," + y0;
}
// Is this arc empty? Were done.
if (!r) return;
// Does the angle go the wrong way? Flip the direction.
if (da < 0) da = da % tau + tau;
// Is this a complete circle? Draw two arcs to complete the circle.
if (da > tauEpsilon) {
this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
}
// Is this arc non-empty? Draw an arc!
else if (da > epsilon) {
this._ += "A" + r + "," + r + ",0," + (+(da >= pi)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
}
},
rect: function(x, y, w, h) {
this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
},
toString: function() {
return this._;
}
};
/* harmony default export */ __webpack_exports__["default"] = (path);
/***/ }),
/***/ "./node_modules/d3-selection/src/constant.js":
/*!***************************************************!*\
!*** ./node_modules/d3-selection/src/constant.js ***!
\***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(x) {
return function() {
return x;
};
});
/***/ }),
/***/ "./node_modules/d3-selection/src/create.js":
/*!*************************************************!*\
!*** ./node_modules/d3-selection/src/create.js ***!
\*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _creator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./creator */ "./node_modules/d3-selection/src/creator.js");
/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./select */ "./node_modules/d3-selection/src/select.js");
/* harmony default export */ __webpack_exports__["default"] = (function(name) {
return Object(_select__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_creator__WEBPACK_IMPORTED_MODULE_0__["default"])(name).call(document.documentElement));
});
/***/ }),
/***/ "./node_modules/d3-selection/src/creator.js":
/*!**************************************************!*\
!*** ./node_modules/d3-selection/src/creator.js ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./namespace */ "./node_modules/d3-selection/src/namespace.js");
/* harmony import */ var _namespaces__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./namespaces */ "./node_modules/d3-selection/src/namespaces.js");
function creatorInherit(name) {
return function() {
var document = this.ownerDocument,
uri = this.namespaceURI;
return uri === _namespaces__WEBPACK_IMPORTED_MODULE_1__["xhtml"] && document.documentElement.namespaceURI === _namespaces__WEBPACK_IMPORTED_MODULE_1__["xhtml"]
? document.createElement(name)
: document.createElementNS(uri, name);
};
}
function creatorFixed(fullname) {
return function() {
return this.ownerDocument.createElementNS(fullname.space, fullname.local);
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(name) {
var fullname = Object(_namespace__WEBPACK_IMPORTED_MODULE_0__["default"])(name);
return (fullname.local
? creatorFixed
: creatorInherit)(fullname);
});
/***/ }),
/***/ "./node_modules/d3-selection/src/index.js":
/*!************************************************!*\
!*** ./node_modules/d3-selection/src/index.js ***!
\************************************************/
/*! exports provided: create, creator, local, matcher, mouse, namespace, namespaces, clientPoint, select, selectAll, selection, selector, selectorAll, style, touch, touches, window, event, customEvent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _create__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./create */ "./node_modules/d3-selection/src/create.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "create", function() { return _create__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/* harmony import */ var _creator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./creator */ "./node_modules/d3-selection/src/creator.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "creator", function() { return _creator__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/* harmony import */ var _local__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./local */ "./node_modules/d3-selection/src/local.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "local", function() { return _local__WEBPACK_IMPORTED_MODULE_2__["default"]; });
/* harmony import */ var _matcher__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./matcher */ "./node_modules/d3-selection/src/matcher.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "matcher", function() { return _matcher__WEBPACK_IMPORTED_MODULE_3__["default"]; });
/* harmony import */ var _mouse__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mouse */ "./node_modules/d3-selection/src/mouse.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouse", function() { return _mouse__WEBPACK_IMPORTED_MODULE_4__["default"]; });
/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./namespace */ "./node_modules/d3-selection/src/namespace.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "namespace", function() { return _namespace__WEBPACK_IMPORTED_MODULE_5__["default"]; });
/* harmony import */ var _namespaces__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./namespaces */ "./node_modules/d3-selection/src/namespaces.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "namespaces", function() { return _namespaces__WEBPACK_IMPORTED_MODULE_6__["default"]; });
/* harmony import */ var _point__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./point */ "./node_modules/d3-selection/src/point.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "clientPoint", function() { return _point__WEBPACK_IMPORTED_MODULE_7__["default"]; });
/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./select */ "./node_modules/d3-selection/src/select.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "select", function() { return _select__WEBPACK_IMPORTED_MODULE_8__["default"]; });
/* harmony import */ var _selectAll__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./selectAll */ "./node_modules/d3-selection/src/selectAll.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "selectAll", function() { return _selectAll__WEBPACK_IMPORTED_MODULE_9__["default"]; });
/* harmony import */ var _selection_index__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./selection/index */ "./node_modules/d3-selection/src/selection/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "selection", function() { return _selection_index__WEBPACK_IMPORTED_MODULE_10__["default"]; });
/* harmony import */ var _selector__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./selector */ "./node_modules/d3-selection/src/selector.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "selector", function() { return _selector__WEBPACK_IMPORTED_MODULE_11__["default"]; });
/* harmony import */ var _selectorAll__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./selectorAll */ "./node_modules/d3-selection/src/selectorAll.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "selectorAll", function() { return _selectorAll__WEBPACK_IMPORTED_MODULE_12__["default"]; });
/* harmony import */ var _selection_style__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./selection/style */ "./node_modules/d3-selection/src/selection/style.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "style", function() { return _selection_style__WEBPACK_IMPORTED_MODULE_13__["styleValue"]; });
/* harmony import */ var _touch__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./touch */ "./node_modules/d3-selection/src/touch.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touch", function() { return _touch__WEBPACK_IMPORTED_MODULE_14__["default"]; });
/* harmony import */ var _touches__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./touches */ "./node_modules/d3-selection/src/touches.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touches", function() { return _touches__WEBPACK_IMPORTED_MODULE_15__["default"]; });
/* harmony import */ var _window__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./window */ "./node_modules/d3-selection/src/window.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "window", function() { return _window__WEBPACK_IMPORTED_MODULE_16__["default"]; });
/* harmony import */ var _selection_on__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./selection/on */ "./node_modules/d3-selection/src/selection/on.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "event", function() { return _selection_on__WEBPACK_IMPORTED_MODULE_17__["event"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "customEvent", function() { return _selection_on__WEBPACK_IMPORTED_MODULE_17__["customEvent"]; });
/***/ }),
/***/ "./node_modules/d3-selection/src/local.js":
/*!************************************************!*\
!*** ./node_modules/d3-selection/src/local.js ***!
\************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return local; });
var nextId = 0;
function local() {
return new Local;
}
function Local() {
this._ = "@" + (++nextId).toString(36);
}
Local.prototype = local.prototype = {
constructor: Local,
get: function(node) {
var id = this._;
while (!(id in node)) if (!(node = node.parentNode)) return;
return node[id];
},
set: function(node, value) {
return node[this._] = value;
},
remove: function(node) {
return this._ in node && delete node[this._];
},
toString: function() {
return this._;
}
};
/***/ }),
/***/ "./node_modules/d3-selection/src/matcher.js":
/*!**************************************************!*\
!*** ./node_modules/d3-selection/src/matcher.js ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(selector) {
return function() {
return this.matches(selector);
};
});
/***/ }),
/***/ "./node_modules/d3-selection/src/mouse.js":
/*!************************************************!*\
!*** ./node_modules/d3-selection/src/mouse.js ***!
\************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _sourceEvent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sourceEvent */ "./node_modules/d3-selection/src/sourceEvent.js");
/* harmony import */ var _point__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./point */ "./node_modules/d3-selection/src/point.js");
/* harmony default export */ __webpack_exports__["default"] = (function(node) {
var event = Object(_sourceEvent__WEBPACK_IMPORTED_MODULE_0__["default"])();
if (event.changedTouches) event = event.changedTouches[0];
return Object(_point__WEBPACK_IMPORTED_MODULE_1__["default"])(node, event);
});
/***/ }),
/***/ "./node_modules/d3-selection/src/namespace.js":
/*!****************************************************!*\
!*** ./node_modules/d3-selection/src/namespace.js ***!
\****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _namespaces__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./namespaces */ "./node_modules/d3-selection/src/namespaces.js");
/* harmony default export */ __webpack_exports__["default"] = (function(name) {
var prefix = name += "", i = prefix.indexOf(":");
if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
return _namespaces__WEBPACK_IMPORTED_MODULE_0__["default"].hasOwnProperty(prefix) ? {space: _namespaces__WEBPACK_IMPORTED_MODULE_0__["default"][prefix], local: name} : name;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/namespaces.js":
/*!*****************************************************!*\
!*** ./node_modules/d3-selection/src/namespaces.js ***!
\*****************************************************/
/*! exports provided: xhtml, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "xhtml", function() { return xhtml; });
var xhtml = "http://www.w3.org/1999/xhtml";
/* harmony default export */ __webpack_exports__["default"] = ({
svg: "http://www.w3.org/2000/svg",
xhtml: xhtml,
xlink: "http://www.w3.org/1999/xlink",
xml: "http://www.w3.org/XML/1998/namespace",
xmlns: "http://www.w3.org/2000/xmlns/"
});
/***/ }),
/***/ "./node_modules/d3-selection/src/point.js":
/*!************************************************!*\
!*** ./node_modules/d3-selection/src/point.js ***!
\************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(node, event) {
var svg = node.ownerSVGElement || node;
if (svg.createSVGPoint) {
var point = svg.createSVGPoint();
point.x = event.clientX, point.y = event.clientY;
point = point.matrixTransform(node.getScreenCTM().inverse());
return [point.x, point.y];
}
var rect = node.getBoundingClientRect();
return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
});
/***/ }),
/***/ "./node_modules/d3-selection/src/select.js":
/*!*************************************************!*\
!*** ./node_modules/d3-selection/src/select.js ***!
\*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _selection_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./selection/index */ "./node_modules/d3-selection/src/selection/index.js");
/* harmony default export */ __webpack_exports__["default"] = (function(selector) {
return typeof selector === "string"
? new _selection_index__WEBPACK_IMPORTED_MODULE_0__["Selection"]([[document.querySelector(selector)]], [document.documentElement])
: new _selection_index__WEBPACK_IMPORTED_MODULE_0__["Selection"]([[selector]], _selection_index__WEBPACK_IMPORTED_MODULE_0__["root"]);
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selectAll.js":
/*!****************************************************!*\
!*** ./node_modules/d3-selection/src/selectAll.js ***!
\****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _selection_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./selection/index */ "./node_modules/d3-selection/src/selection/index.js");
/* harmony default export */ __webpack_exports__["default"] = (function(selector) {
return typeof selector === "string"
? new _selection_index__WEBPACK_IMPORTED_MODULE_0__["Selection"]([document.querySelectorAll(selector)], [document.documentElement])
: new _selection_index__WEBPACK_IMPORTED_MODULE_0__["Selection"]([selector == null ? [] : selector], _selection_index__WEBPACK_IMPORTED_MODULE_0__["root"]);
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/append.js":
/*!***********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/append.js ***!
\***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _creator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../creator */ "./node_modules/d3-selection/src/creator.js");
/* harmony default export */ __webpack_exports__["default"] = (function(name) {
var create = typeof name === "function" ? name : Object(_creator__WEBPACK_IMPORTED_MODULE_0__["default"])(name);
return this.select(function() {
return this.appendChild(create.apply(this, arguments));
});
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/attr.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/attr.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../namespace */ "./node_modules/d3-selection/src/namespace.js");
function attrRemove(name) {
return function() {
this.removeAttribute(name);
};
}
function attrRemoveNS(fullname) {
return function() {
this.removeAttributeNS(fullname.space, fullname.local);
};
}
function attrConstant(name, value) {
return function() {
this.setAttribute(name, value);
};
}
function attrConstantNS(fullname, value) {
return function() {
this.setAttributeNS(fullname.space, fullname.local, value);
};
}
function attrFunction(name, value) {
return function() {
var v = value.apply(this, arguments);
if (v == null) this.removeAttribute(name);
else this.setAttribute(name, v);
};
}
function attrFunctionNS(fullname, value) {
return function() {
var v = value.apply(this, arguments);
if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
else this.setAttributeNS(fullname.space, fullname.local, v);
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(name, value) {
var fullname = Object(_namespace__WEBPACK_IMPORTED_MODULE_0__["default"])(name);
if (arguments.length < 2) {
var node = this.node();
return fullname.local
? node.getAttributeNS(fullname.space, fullname.local)
: node.getAttribute(fullname);
}
return this.each((value == null
? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
? (fullname.local ? attrFunctionNS : attrFunction)
: (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/call.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/call.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function() {
var callback = arguments[0];
arguments[0] = this;
callback.apply(null, arguments);
return this;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/classed.js":
/*!************************************************************!*\
!*** ./node_modules/d3-selection/src/selection/classed.js ***!
\************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function classArray(string) {
return string.trim().split(/^|\s+/);
}
function classList(node) {
return node.classList || new ClassList(node);
}
function ClassList(node) {
this._node = node;
this._names = classArray(node.getAttribute("class") || "");
}
ClassList.prototype = {
add: function(name) {
var i = this._names.indexOf(name);
if (i < 0) {
this._names.push(name);
this._node.setAttribute("class", this._names.join(" "));
}
},
remove: function(name) {
var i = this._names.indexOf(name);
if (i >= 0) {
this._names.splice(i, 1);
this._node.setAttribute("class", this._names.join(" "));
}
},
contains: function(name) {
return this._names.indexOf(name) >= 0;
}
};
function classedAdd(node, names) {
var list = classList(node), i = -1, n = names.length;
while (++i < n) list.add(names[i]);
}
function classedRemove(node, names) {
var list = classList(node), i = -1, n = names.length;
while (++i < n) list.remove(names[i]);
}
function classedTrue(names) {
return function() {
classedAdd(this, names);
};
}
function classedFalse(names) {
return function() {
classedRemove(this, names);
};
}
function classedFunction(names, value) {
return function() {
(value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(name, value) {
var names = classArray(name + "");
if (arguments.length < 2) {
var list = classList(this.node()), i = -1, n = names.length;
while (++i < n) if (!list.contains(names[i])) return false;
return true;
}
return this.each((typeof value === "function"
? classedFunction : value
? classedTrue
: classedFalse)(names, value));
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/clone.js":
/*!**********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/clone.js ***!
\**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function selection_cloneShallow() {
return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
}
function selection_cloneDeep() {
return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
}
/* harmony default export */ __webpack_exports__["default"] = (function(deep) {
return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/data.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/data.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
/* harmony import */ var _enter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./enter */ "./node_modules/d3-selection/src/selection/enter.js");
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constant */ "./node_modules/d3-selection/src/constant.js");
var keyPrefix = "$"; // Protect against keys like “__proto__”.
function bindIndex(parent, group, enter, update, exit, data) {
var i = 0,
node,
groupLength = group.length,
dataLength = data.length;
// Put any non-null nodes that fit into update.
// Put any null nodes into enter.
// Put any remaining data into enter.
for (; i < dataLength; ++i) {
if (node = group[i]) {
node.__data__ = data[i];
update[i] = node;
} else {
enter[i] = new _enter__WEBPACK_IMPORTED_MODULE_1__["EnterNode"](parent, data[i]);
}
}
// Put any non-null nodes that dont fit into exit.
for (; i < groupLength; ++i) {
if (node = group[i]) {
exit[i] = node;
}
}
}
function bindKey(parent, group, enter, update, exit, data, key) {
var i,
node,
nodeByKeyValue = {},
groupLength = group.length,
dataLength = data.length,
keyValues = new Array(groupLength),
keyValue;
// Compute the key for each node.
// If multiple nodes have the same key, the duplicates are added to exit.
for (i = 0; i < groupLength; ++i) {
if (node = group[i]) {
keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
if (keyValue in nodeByKeyValue) {
exit[i] = node;
} else {
nodeByKeyValue[keyValue] = node;
}
}
}
// Compute the key for each datum.
// If there a node associated with this key, join and add it to update.
// If there is not (or the key is a duplicate), add it to enter.
for (i = 0; i < dataLength; ++i) {
keyValue = keyPrefix + key.call(parent, data[i], i, data);
if (node = nodeByKeyValue[keyValue]) {
update[i] = node;
node.__data__ = data[i];
nodeByKeyValue[keyValue] = null;
} else {
enter[i] = new _enter__WEBPACK_IMPORTED_MODULE_1__["EnterNode"](parent, data[i]);
}
}
// Add any remaining nodes that were not bound to data to exit.
for (i = 0; i < groupLength; ++i) {
if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
exit[i] = node;
}
}
}
/* harmony default export */ __webpack_exports__["default"] = (function(value, key) {
if (!value) {
data = new Array(this.size()), j = -1;
this.each(function(d) { data[++j] = d; });
return data;
}
var bind = key ? bindKey : bindIndex,
parents = this._parents,
groups = this._groups;
if (typeof value !== "function") value = Object(_constant__WEBPACK_IMPORTED_MODULE_2__["default"])(value);
for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
var parent = parents[j],
group = groups[j],
groupLength = group.length,
data = value.call(parent, parent && parent.__data__, j, parents),
dataLength = data.length,
enterGroup = enter[j] = new Array(dataLength),
updateGroup = update[j] = new Array(dataLength),
exitGroup = exit[j] = new Array(groupLength);
bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
// Now connect the enter nodes to their following update node, such that
// appendChild can insert the materialized enter node before this node,
// rather than at the end of the parent node.
for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
if (previous = enterGroup[i0]) {
if (i0 >= i1) i1 = i0 + 1;
while (!(next = updateGroup[i1]) && ++i1 < dataLength);
previous._next = next || null;
}
}
}
update = new _index__WEBPACK_IMPORTED_MODULE_0__["Selection"](update, parents);
update._enter = enter;
update._exit = exit;
return update;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/datum.js":
/*!**********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/datum.js ***!
\**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(value) {
return arguments.length
? this.property("__data__", value)
: this.node().__data__;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/dispatch.js":
/*!*************************************************************!*\
!*** ./node_modules/d3-selection/src/selection/dispatch.js ***!
\*************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../window */ "./node_modules/d3-selection/src/window.js");
function dispatchEvent(node, type, params) {
var window = Object(_window__WEBPACK_IMPORTED_MODULE_0__["default"])(node),
event = window.CustomEvent;
if (typeof event === "function") {
event = new event(type, params);
} else {
event = window.document.createEvent("Event");
if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
else event.initEvent(type, false, false);
}
node.dispatchEvent(event);
}
function dispatchConstant(type, params) {
return function() {
return dispatchEvent(this, type, params);
};
}
function dispatchFunction(type, params) {
return function() {
return dispatchEvent(this, type, params.apply(this, arguments));
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(type, params) {
return this.each((typeof params === "function"
? dispatchFunction
: dispatchConstant)(type, params));
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/each.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/each.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(callback) {
for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
if (node = group[i]) callback.call(node, node.__data__, i, group);
}
}
return this;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/empty.js":
/*!**********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/empty.js ***!
\**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function() {
return !this.node();
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/enter.js":
/*!**********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/enter.js ***!
\**********************************************************/
/*! exports provided: default, EnterNode */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EnterNode", function() { return EnterNode; });
/* harmony import */ var _sparse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sparse */ "./node_modules/d3-selection/src/selection/sparse.js");
/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
/* harmony default export */ __webpack_exports__["default"] = (function() {
return new _index__WEBPACK_IMPORTED_MODULE_1__["Selection"](this._enter || this._groups.map(_sparse__WEBPACK_IMPORTED_MODULE_0__["default"]), this._parents);
});
function EnterNode(parent, datum) {
this.ownerDocument = parent.ownerDocument;
this.namespaceURI = parent.namespaceURI;
this._next = null;
this._parent = parent;
this.__data__ = datum;
}
EnterNode.prototype = {
constructor: EnterNode,
appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
querySelector: function(selector) { return this._parent.querySelector(selector); },
querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
};
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/exit.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/exit.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _sparse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sparse */ "./node_modules/d3-selection/src/selection/sparse.js");
/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
/* harmony default export */ __webpack_exports__["default"] = (function() {
return new _index__WEBPACK_IMPORTED_MODULE_1__["Selection"](this._exit || this._groups.map(_sparse__WEBPACK_IMPORTED_MODULE_0__["default"]), this._parents);
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/filter.js":
/*!***********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/filter.js ***!
\***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
/* harmony import */ var _matcher__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../matcher */ "./node_modules/d3-selection/src/matcher.js");
/* harmony default export */ __webpack_exports__["default"] = (function(match) {
if (typeof match !== "function") match = Object(_matcher__WEBPACK_IMPORTED_MODULE_1__["default"])(match);
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
subgroup.push(node);
}
}
}
return new _index__WEBPACK_IMPORTED_MODULE_0__["Selection"](subgroups, this._parents);
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/html.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/html.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function htmlRemove() {
this.innerHTML = "";
}
function htmlConstant(value) {
return function() {
this.innerHTML = value;
};
}
function htmlFunction(value) {
return function() {
var v = value.apply(this, arguments);
this.innerHTML = v == null ? "" : v;
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(value) {
return arguments.length
? this.each(value == null
? htmlRemove : (typeof value === "function"
? htmlFunction
: htmlConstant)(value))
: this.node().innerHTML;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/index.js":
/*!**********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/index.js ***!
\**********************************************************/
/*! exports provided: root, Selection, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "root", function() { return root; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Selection", function() { return Selection; });
/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./select */ "./node_modules/d3-selection/src/selection/select.js");
/* harmony import */ var _selectAll__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectAll */ "./node_modules/d3-selection/src/selection/selectAll.js");
/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./filter */ "./node_modules/d3-selection/src/selection/filter.js");
/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./data */ "./node_modules/d3-selection/src/selection/data.js");
/* harmony import */ var _enter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./enter */ "./node_modules/d3-selection/src/selection/enter.js");
/* harmony import */ var _exit__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./exit */ "./node_modules/d3-selection/src/selection/exit.js");
/* harmony import */ var _join__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./join */ "./node_modules/d3-selection/src/selection/join.js");
/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./merge */ "./node_modules/d3-selection/src/selection/merge.js");
/* harmony import */ var _order__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./order */ "./node_modules/d3-selection/src/selection/order.js");
/* harmony import */ var _sort__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./sort */ "./node_modules/d3-selection/src/selection/sort.js");
/* harmony import */ var _call__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./call */ "./node_modules/d3-selection/src/selection/call.js");
/* harmony import */ var _nodes__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./nodes */ "./node_modules/d3-selection/src/selection/nodes.js");
/* harmony import */ var _node__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./node */ "./node_modules/d3-selection/src/selection/node.js");
/* harmony import */ var _size__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./size */ "./node_modules/d3-selection/src/selection/size.js");
/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./empty */ "./node_modules/d3-selection/src/selection/empty.js");
/* harmony import */ var _each__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./each */ "./node_modules/d3-selection/src/selection/each.js");
/* harmony import */ var _attr__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./attr */ "./node_modules/d3-selection/src/selection/attr.js");
/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./style */ "./node_modules/d3-selection/src/selection/style.js");
/* harmony import */ var _property__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./property */ "./node_modules/d3-selection/src/selection/property.js");
/* harmony import */ var _classed__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./classed */ "./node_modules/d3-selection/src/selection/classed.js");
/* harmony import */ var _text__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./text */ "./node_modules/d3-selection/src/selection/text.js");
/* harmony import */ var _html__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./html */ "./node_modules/d3-selection/src/selection/html.js");
/* harmony import */ var _raise__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./raise */ "./node_modules/d3-selection/src/selection/raise.js");
/* harmony import */ var _lower__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./lower */ "./node_modules/d3-selection/src/selection/lower.js");
/* harmony import */ var _append__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./append */ "./node_modules/d3-selection/src/selection/append.js");
/* harmony import */ var _insert__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./insert */ "./node_modules/d3-selection/src/selection/insert.js");
/* harmony import */ var _remove__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./remove */ "./node_modules/d3-selection/src/selection/remove.js");
/* harmony import */ var _clone__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./clone */ "./node_modules/d3-selection/src/selection/clone.js");
/* harmony import */ var _datum__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./datum */ "./node_modules/d3-selection/src/selection/datum.js");
/* harmony import */ var _on__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./on */ "./node_modules/d3-selection/src/selection/on.js");
/* harmony import */ var _dispatch__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./dispatch */ "./node_modules/d3-selection/src/selection/dispatch.js");
var root = [null];
function Selection(groups, parents) {
this._groups = groups;
this._parents = parents;
}
function selection() {
return new Selection([[document.documentElement]], root);
}
Selection.prototype = selection.prototype = {
constructor: Selection,
select: _select__WEBPACK_IMPORTED_MODULE_0__["default"],
selectAll: _selectAll__WEBPACK_IMPORTED_MODULE_1__["default"],
filter: _filter__WEBPACK_IMPORTED_MODULE_2__["default"],
data: _data__WEBPACK_IMPORTED_MODULE_3__["default"],
enter: _enter__WEBPACK_IMPORTED_MODULE_4__["default"],
exit: _exit__WEBPACK_IMPORTED_MODULE_5__["default"],
join: _join__WEBPACK_IMPORTED_MODULE_6__["default"],
merge: _merge__WEBPACK_IMPORTED_MODULE_7__["default"],
order: _order__WEBPACK_IMPORTED_MODULE_8__["default"],
sort: _sort__WEBPACK_IMPORTED_MODULE_9__["default"],
call: _call__WEBPACK_IMPORTED_MODULE_10__["default"],
nodes: _nodes__WEBPACK_IMPORTED_MODULE_11__["default"],
node: _node__WEBPACK_IMPORTED_MODULE_12__["default"],
size: _size__WEBPACK_IMPORTED_MODULE_13__["default"],
empty: _empty__WEBPACK_IMPORTED_MODULE_14__["default"],
each: _each__WEBPACK_IMPORTED_MODULE_15__["default"],
attr: _attr__WEBPACK_IMPORTED_MODULE_16__["default"],
style: _style__WEBPACK_IMPORTED_MODULE_17__["default"],
property: _property__WEBPACK_IMPORTED_MODULE_18__["default"],
classed: _classed__WEBPACK_IMPORTED_MODULE_19__["default"],
text: _text__WEBPACK_IMPORTED_MODULE_20__["default"],
html: _html__WEBPACK_IMPORTED_MODULE_21__["default"],
raise: _raise__WEBPACK_IMPORTED_MODULE_22__["default"],
lower: _lower__WEBPACK_IMPORTED_MODULE_23__["default"],
append: _append__WEBPACK_IMPORTED_MODULE_24__["default"],
insert: _insert__WEBPACK_IMPORTED_MODULE_25__["default"],
remove: _remove__WEBPACK_IMPORTED_MODULE_26__["default"],
clone: _clone__WEBPACK_IMPORTED_MODULE_27__["default"],
datum: _datum__WEBPACK_IMPORTED_MODULE_28__["default"],
on: _on__WEBPACK_IMPORTED_MODULE_29__["default"],
dispatch: _dispatch__WEBPACK_IMPORTED_MODULE_30__["default"]
};
/* harmony default export */ __webpack_exports__["default"] = (selection);
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/insert.js":
/*!***********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/insert.js ***!
\***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _creator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../creator */ "./node_modules/d3-selection/src/creator.js");
/* harmony import */ var _selector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../selector */ "./node_modules/d3-selection/src/selector.js");
function constantNull() {
return null;
}
/* harmony default export */ __webpack_exports__["default"] = (function(name, before) {
var create = typeof name === "function" ? name : Object(_creator__WEBPACK_IMPORTED_MODULE_0__["default"])(name),
select = before == null ? constantNull : typeof before === "function" ? before : Object(_selector__WEBPACK_IMPORTED_MODULE_1__["default"])(before);
return this.select(function() {
return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
});
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/join.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/join.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(onenter, onupdate, onexit) {
var enter = this.enter(), update = this, exit = this.exit();
enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + "");
if (onupdate != null) update = onupdate(update);
if (onexit == null) exit.remove(); else onexit(exit);
return enter && update ? enter.merge(update).order() : update;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/lower.js":
/*!**********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/lower.js ***!
\**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function lower() {
if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
return this.each(lower);
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/merge.js":
/*!**********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/merge.js ***!
\**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
/* harmony default export */ __webpack_exports__["default"] = (function(selection) {
for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
if (node = group0[i] || group1[i]) {
merge[i] = node;
}
}
}
for (; j < m0; ++j) {
merges[j] = groups0[j];
}
return new _index__WEBPACK_IMPORTED_MODULE_0__["Selection"](merges, this._parents);
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/node.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/node.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function() {
for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
var node = group[i];
if (node) return node;
}
}
return null;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/nodes.js":
/*!**********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/nodes.js ***!
\**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function() {
var nodes = new Array(this.size()), i = -1;
this.each(function() { nodes[++i] = this; });
return nodes;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/on.js":
/*!*******************************************************!*\
!*** ./node_modules/d3-selection/src/selection/on.js ***!
\*******************************************************/
/*! exports provided: event, default, customEvent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "event", function() { return event; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "customEvent", function() { return customEvent; });
var filterEvents = {};
var event = null;
if (typeof document !== "undefined") {
var element = document.documentElement;
if (!("onmouseenter" in element)) {
filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
}
}
function filterContextListener(listener, index, group) {
listener = contextListener(listener, index, group);
return function(event) {
var related = event.relatedTarget;
if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
listener.call(this, event);
}
};
}
function contextListener(listener, index, group) {
return function(event1) {
var event0 = event; // Events can be reentrant (e.g., focus).
event = event1;
try {
listener.call(this, this.__data__, index, group);
} finally {
event = event0;
}
};
}
function parseTypenames(typenames) {
return typenames.trim().split(/^|\s+/).map(function(t) {
var name = "", i = t.indexOf(".");
if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
return {type: t, name: name};
});
}
function onRemove(typename) {
return function() {
var on = this.__on;
if (!on) return;
for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
this.removeEventListener(o.type, o.listener, o.capture);
} else {
on[++i] = o;
}
}
if (++i) on.length = i;
else delete this.__on;
};
}
function onAdd(typename, value, capture) {
var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
return function(d, i, group) {
var on = this.__on, o, listener = wrap(value, i, group);
if (on) for (var j = 0, m = on.length; j < m; ++j) {
if ((o = on[j]).type === typename.type && o.name === typename.name) {
this.removeEventListener(o.type, o.listener, o.capture);
this.addEventListener(o.type, o.listener = listener, o.capture = capture);
o.value = value;
return;
}
}
this.addEventListener(typename.type, listener, capture);
o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
if (!on) this.__on = [o];
else on.push(o);
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(typename, value, capture) {
var typenames = parseTypenames(typename + ""), i, n = typenames.length, t;
if (arguments.length < 2) {
var on = this.node().__on;
if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
for (i = 0, o = on[j]; i < n; ++i) {
if ((t = typenames[i]).type === o.type && t.name === o.name) {
return o.value;
}
}
}
return;
}
on = value ? onAdd : onRemove;
if (capture == null) capture = false;
for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
return this;
});
function customEvent(event1, listener, that, args) {
var event0 = event;
event1.sourceEvent = event;
event = event1;
try {
return listener.apply(that, args);
} finally {
event = event0;
}
}
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/order.js":
/*!**********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/order.js ***!
\**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function() {
for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
if (node = group[i]) {
if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);
next = node;
}
}
}
return this;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/property.js":
/*!*************************************************************!*\
!*** ./node_modules/d3-selection/src/selection/property.js ***!
\*************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function propertyRemove(name) {
return function() {
delete this[name];
};
}
function propertyConstant(name, value) {
return function() {
this[name] = value;
};
}
function propertyFunction(name, value) {
return function() {
var v = value.apply(this, arguments);
if (v == null) delete this[name];
else this[name] = v;
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(name, value) {
return arguments.length > 1
? this.each((value == null
? propertyRemove : typeof value === "function"
? propertyFunction
: propertyConstant)(name, value))
: this.node()[name];
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/raise.js":
/*!**********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/raise.js ***!
\**********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function raise() {
if (this.nextSibling) this.parentNode.appendChild(this);
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
return this.each(raise);
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/remove.js":
/*!***********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/remove.js ***!
\***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function remove() {
var parent = this.parentNode;
if (parent) parent.removeChild(this);
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
return this.each(remove);
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/select.js":
/*!***********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/select.js ***!
\***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
/* harmony import */ var _selector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../selector */ "./node_modules/d3-selection/src/selector.js");
/* harmony default export */ __webpack_exports__["default"] = (function(select) {
if (typeof select !== "function") select = Object(_selector__WEBPACK_IMPORTED_MODULE_1__["default"])(select);
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
if ("__data__" in node) subnode.__data__ = node.__data__;
subgroup[i] = subnode;
}
}
}
return new _index__WEBPACK_IMPORTED_MODULE_0__["Selection"](subgroups, this._parents);
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/selectAll.js":
/*!**************************************************************!*\
!*** ./node_modules/d3-selection/src/selection/selectAll.js ***!
\**************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
/* harmony import */ var _selectorAll__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../selectorAll */ "./node_modules/d3-selection/src/selectorAll.js");
/* harmony default export */ __webpack_exports__["default"] = (function(select) {
if (typeof select !== "function") select = Object(_selectorAll__WEBPACK_IMPORTED_MODULE_1__["default"])(select);
for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
subgroups.push(select.call(node, node.__data__, i, group));
parents.push(node);
}
}
}
return new _index__WEBPACK_IMPORTED_MODULE_0__["Selection"](subgroups, parents);
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/size.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/size.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function() {
var size = 0;
this.each(function() { ++size; });
return size;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/sort.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/sort.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
/* harmony default export */ __webpack_exports__["default"] = (function(compare) {
if (!compare) compare = ascending;
function compareNode(a, b) {
return a && b ? compare(a.__data__, b.__data__) : !a - !b;
}
for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
if (node = group[i]) {
sortgroup[i] = node;
}
}
sortgroup.sort(compareNode);
}
return new _index__WEBPACK_IMPORTED_MODULE_0__["Selection"](sortgroups, this._parents).order();
});
function ascending(a, b) {
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/sparse.js":
/*!***********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/sparse.js ***!
\***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(update) {
return new Array(update.length);
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/style.js":
/*!**********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/style.js ***!
\**********************************************************/
/*! exports provided: default, styleValue */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "styleValue", function() { return styleValue; });
/* harmony import */ var _window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../window */ "./node_modules/d3-selection/src/window.js");
function styleRemove(name) {
return function() {
this.style.removeProperty(name);
};
}
function styleConstant(name, value, priority) {
return function() {
this.style.setProperty(name, value, priority);
};
}
function styleFunction(name, value, priority) {
return function() {
var v = value.apply(this, arguments);
if (v == null) this.style.removeProperty(name);
else this.style.setProperty(name, v, priority);
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(name, value, priority) {
return arguments.length > 1
? this.each((value == null
? styleRemove : typeof value === "function"
? styleFunction
: styleConstant)(name, value, priority == null ? "" : priority))
: styleValue(this.node(), name);
});
function styleValue(node, name) {
return node.style.getPropertyValue(name)
|| Object(_window__WEBPACK_IMPORTED_MODULE_0__["default"])(node).getComputedStyle(node, null).getPropertyValue(name);
}
/***/ }),
/***/ "./node_modules/d3-selection/src/selection/text.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-selection/src/selection/text.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function textRemove() {
this.textContent = "";
}
function textConstant(value) {
return function() {
this.textContent = value;
};
}
function textFunction(value) {
return function() {
var v = value.apply(this, arguments);
this.textContent = v == null ? "" : v;
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(value) {
return arguments.length
? this.each(value == null
? textRemove : (typeof value === "function"
? textFunction
: textConstant)(value))
: this.node().textContent;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selector.js":
/*!***************************************************!*\
!*** ./node_modules/d3-selection/src/selector.js ***!
\***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function none() {}
/* harmony default export */ __webpack_exports__["default"] = (function(selector) {
return selector == null ? none : function() {
return this.querySelector(selector);
};
});
/***/ }),
/***/ "./node_modules/d3-selection/src/selectorAll.js":
/*!******************************************************!*\
!*** ./node_modules/d3-selection/src/selectorAll.js ***!
\******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function empty() {
return [];
}
/* harmony default export */ __webpack_exports__["default"] = (function(selector) {
return selector == null ? empty : function() {
return this.querySelectorAll(selector);
};
});
/***/ }),
/***/ "./node_modules/d3-selection/src/sourceEvent.js":
/*!******************************************************!*\
!*** ./node_modules/d3-selection/src/sourceEvent.js ***!
\******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _selection_on__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./selection/on */ "./node_modules/d3-selection/src/selection/on.js");
/* harmony default export */ __webpack_exports__["default"] = (function() {
var current = _selection_on__WEBPACK_IMPORTED_MODULE_0__["event"], source;
while (source = current.sourceEvent) current = source;
return current;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/touch.js":
/*!************************************************!*\
!*** ./node_modules/d3-selection/src/touch.js ***!
\************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _sourceEvent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sourceEvent */ "./node_modules/d3-selection/src/sourceEvent.js");
/* harmony import */ var _point__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./point */ "./node_modules/d3-selection/src/point.js");
/* harmony default export */ __webpack_exports__["default"] = (function(node, touches, identifier) {
if (arguments.length < 3) identifier = touches, touches = Object(_sourceEvent__WEBPACK_IMPORTED_MODULE_0__["default"])().changedTouches;
for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
if ((touch = touches[i]).identifier === identifier) {
return Object(_point__WEBPACK_IMPORTED_MODULE_1__["default"])(node, touch);
}
}
return null;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/touches.js":
/*!**************************************************!*\
!*** ./node_modules/d3-selection/src/touches.js ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _sourceEvent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sourceEvent */ "./node_modules/d3-selection/src/sourceEvent.js");
/* harmony import */ var _point__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./point */ "./node_modules/d3-selection/src/point.js");
/* harmony default export */ __webpack_exports__["default"] = (function(node, touches) {
if (touches == null) touches = Object(_sourceEvent__WEBPACK_IMPORTED_MODULE_0__["default"])().touches;
for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
points[i] = Object(_point__WEBPACK_IMPORTED_MODULE_1__["default"])(node, touches[i]);
}
return points;
});
/***/ }),
/***/ "./node_modules/d3-selection/src/window.js":
/*!*************************************************!*\
!*** ./node_modules/d3-selection/src/window.js ***!
\*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(node) {
return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
|| (node.document && node) // node is a Window
|| node.defaultView; // node is a Document
});
/***/ }),
/***/ "./node_modules/d3-shape/src/arc.js":
/*!******************************************!*\
!*** ./node_modules/d3-shape/src/arc.js ***!
\******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-path */ "./node_modules/d3-path/src/index.js");
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-shape/src/constant.js");
/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./math */ "./node_modules/d3-shape/src/math.js");
function arcInnerRadius(d) {
return d.innerRadius;
}
function arcOuterRadius(d) {
return d.outerRadius;
}
function arcStartAngle(d) {
return d.startAngle;
}
function arcEndAngle(d) {
return d.endAngle;
}
function arcPadAngle(d) {
return d && d.padAngle; // Note: optional!
}
function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
var x10 = x1 - x0, y10 = y1 - y0,
x32 = x3 - x2, y32 = y3 - y2,
t = y32 * x10 - x32 * y10;
if (t * t < _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) return;
t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;
return [x0 + t * x10, y0 + t * y10];
}
// Compute perpendicular offset line of length rc.
// http://mathworld.wolfram.com/Circle-LineIntersection.html
function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
var x01 = x0 - x1,
y01 = y0 - y1,
lo = (cw ? rc : -rc) / Object(_math__WEBPACK_IMPORTED_MODULE_2__["sqrt"])(x01 * x01 + y01 * y01),
ox = lo * y01,
oy = -lo * x01,
x11 = x0 + ox,
y11 = y0 + oy,
x10 = x1 + ox,
y10 = y1 + oy,
x00 = (x11 + x10) / 2,
y00 = (y11 + y10) / 2,
dx = x10 - x11,
dy = y10 - y11,
d2 = dx * dx + dy * dy,
r = r1 - rc,
D = x11 * y10 - x10 * y11,
d = (dy < 0 ? -1 : 1) * Object(_math__WEBPACK_IMPORTED_MODULE_2__["sqrt"])(Object(_math__WEBPACK_IMPORTED_MODULE_2__["max"])(0, r * r * d2 - D * D)),
cx0 = (D * dy - dx * d) / d2,
cy0 = (-D * dx - dy * d) / d2,
cx1 = (D * dy + dx * d) / d2,
cy1 = (-D * dx + dy * d) / d2,
dx0 = cx0 - x00,
dy0 = cy0 - y00,
dx1 = cx1 - x00,
dy1 = cy1 - y00;
// Pick the closer of the two intersection points.
// TODO Is there a faster way to determine which intersection to use?
if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
return {
cx: cx0,
cy: cy0,
x01: -ox,
y01: -oy,
x11: cx0 * (r1 / r - 1),
y11: cy0 * (r1 / r - 1)
};
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
var innerRadius = arcInnerRadius,
outerRadius = arcOuterRadius,
cornerRadius = Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(0),
padRadius = null,
startAngle = arcStartAngle,
endAngle = arcEndAngle,
padAngle = arcPadAngle,
context = null;
function arc() {
var buffer,
r,
r0 = +innerRadius.apply(this, arguments),
r1 = +outerRadius.apply(this, arguments),
a0 = startAngle.apply(this, arguments) - _math__WEBPACK_IMPORTED_MODULE_2__["halfPi"],
a1 = endAngle.apply(this, arguments) - _math__WEBPACK_IMPORTED_MODULE_2__["halfPi"],
da = Object(_math__WEBPACK_IMPORTED_MODULE_2__["abs"])(a1 - a0),
cw = a1 > a0;
if (!context) context = buffer = Object(d3_path__WEBPACK_IMPORTED_MODULE_0__["path"])();
// Ensure that the outer radius is always larger than the inner radius.
if (r1 < r0) r = r1, r1 = r0, r0 = r;
// Is it a point?
if (!(r1 > _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"])) context.moveTo(0, 0);
// Or is it a circle or annulus?
else if (da > _math__WEBPACK_IMPORTED_MODULE_2__["tau"] - _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) {
context.moveTo(r1 * Object(_math__WEBPACK_IMPORTED_MODULE_2__["cos"])(a0), r1 * Object(_math__WEBPACK_IMPORTED_MODULE_2__["sin"])(a0));
context.arc(0, 0, r1, a0, a1, !cw);
if (r0 > _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) {
context.moveTo(r0 * Object(_math__WEBPACK_IMPORTED_MODULE_2__["cos"])(a1), r0 * Object(_math__WEBPACK_IMPORTED_MODULE_2__["sin"])(a1));
context.arc(0, 0, r0, a1, a0, cw);
}
}
// Or is it a circular or annular sector?
else {
var a01 = a0,
a11 = a1,
a00 = a0,
a10 = a1,
da0 = da,
da1 = da,
ap = padAngle.apply(this, arguments) / 2,
rp = (ap > _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) && (padRadius ? +padRadius.apply(this, arguments) : Object(_math__WEBPACK_IMPORTED_MODULE_2__["sqrt"])(r0 * r0 + r1 * r1)),
rc = Object(_math__WEBPACK_IMPORTED_MODULE_2__["min"])(Object(_math__WEBPACK_IMPORTED_MODULE_2__["abs"])(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
rc0 = rc,
rc1 = rc,
t0,
t1;
// Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
if (rp > _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) {
var p0 = Object(_math__WEBPACK_IMPORTED_MODULE_2__["asin"])(rp / r0 * Object(_math__WEBPACK_IMPORTED_MODULE_2__["sin"])(ap)),
p1 = Object(_math__WEBPACK_IMPORTED_MODULE_2__["asin"])(rp / r1 * Object(_math__WEBPACK_IMPORTED_MODULE_2__["sin"])(ap));
if ((da0 -= p0 * 2) > _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
else da0 = 0, a00 = a10 = (a0 + a1) / 2;
if ((da1 -= p1 * 2) > _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
else da1 = 0, a01 = a11 = (a0 + a1) / 2;
}
var x01 = r1 * Object(_math__WEBPACK_IMPORTED_MODULE_2__["cos"])(a01),
y01 = r1 * Object(_math__WEBPACK_IMPORTED_MODULE_2__["sin"])(a01),
x10 = r0 * Object(_math__WEBPACK_IMPORTED_MODULE_2__["cos"])(a10),
y10 = r0 * Object(_math__WEBPACK_IMPORTED_MODULE_2__["sin"])(a10);
// Apply rounded corners?
if (rc > _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) {
var x11 = r1 * Object(_math__WEBPACK_IMPORTED_MODULE_2__["cos"])(a11),
y11 = r1 * Object(_math__WEBPACK_IMPORTED_MODULE_2__["sin"])(a11),
x00 = r0 * Object(_math__WEBPACK_IMPORTED_MODULE_2__["cos"])(a00),
y00 = r0 * Object(_math__WEBPACK_IMPORTED_MODULE_2__["sin"])(a00),
oc;
// Restrict the corner radius according to the sector angle.
if (da <= _math__WEBPACK_IMPORTED_MODULE_2__["tau"] - _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"] && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {
var ax = x01 - oc[0],
ay = y01 - oc[1],
bx = x11 - oc[0],
by = y11 - oc[1],
kc = 1 / Object(_math__WEBPACK_IMPORTED_MODULE_2__["sin"])(Object(_math__WEBPACK_IMPORTED_MODULE_2__["acos"])((ax * bx + ay * by) / (Object(_math__WEBPACK_IMPORTED_MODULE_2__["sqrt"])(ax * ax + ay * ay) * Object(_math__WEBPACK_IMPORTED_MODULE_2__["sqrt"])(bx * bx + by * by))) / 2),
lc = Object(_math__WEBPACK_IMPORTED_MODULE_2__["sqrt"])(oc[0] * oc[0] + oc[1] * oc[1]);
rc0 = Object(_math__WEBPACK_IMPORTED_MODULE_2__["min"])(rc, (r0 - lc) / (kc - 1));
rc1 = Object(_math__WEBPACK_IMPORTED_MODULE_2__["min"])(rc, (r1 - lc) / (kc + 1));
}
}
// Is the sector collapsed to a line?
if (!(da1 > _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"])) context.moveTo(x01, y01);
// Does the sectors outer ring have rounded corners?
else if (rc1 > _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) {
t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
// Have the corners merged?
if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.y01, t0.x01), Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.y01, t1.x01), !cw);
// Otherwise, draw the two corners and the ring.
else {
context.arc(t0.cx, t0.cy, rc1, Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.y01, t0.x01), Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.y11, t0.x11), !cw);
context.arc(0, 0, r1, Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.cy + t0.y11, t0.cx + t0.x11), Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.cy + t1.y11, t1.cx + t1.x11), !cw);
context.arc(t1.cx, t1.cy, rc1, Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.y11, t1.x11), Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.y01, t1.x01), !cw);
}
}
// Or is the outer ring just a circular arc?
else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
// Is there no inner ring, and its a circular sector?
// Or perhaps its an annular sector collapsed due to padding?
if (!(r0 > _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) || !(da0 > _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"])) context.lineTo(x10, y10);
// Does the sectors inner ring (or point) have rounded corners?
else if (rc0 > _math__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) {
t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
// Have the corners merged?
if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.y01, t0.x01), Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.y01, t1.x01), !cw);
// Otherwise, draw the two corners and the ring.
else {
context.arc(t0.cx, t0.cy, rc0, Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.y01, t0.x01), Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.y11, t0.x11), !cw);
context.arc(0, 0, r0, Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.cy + t0.y11, t0.cx + t0.x11), Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.cy + t1.y11, t1.cx + t1.x11), cw);
context.arc(t1.cx, t1.cy, rc0, Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.y11, t1.x11), Object(_math__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.y01, t1.x01), !cw);
}
}
// Or is the inner ring just a circular arc?
else context.arc(0, 0, r0, a10, a00, cw);
}
context.closePath();
if (buffer) return context = null, buffer + "" || null;
}
arc.centroid = function() {
var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - _math__WEBPACK_IMPORTED_MODULE_2__["pi"] / 2;
return [Object(_math__WEBPACK_IMPORTED_MODULE_2__["cos"])(a) * r, Object(_math__WEBPACK_IMPORTED_MODULE_2__["sin"])(a) * r];
};
arc.innerRadius = function(_) {
return arguments.length ? (innerRadius = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), arc) : innerRadius;
};
arc.outerRadius = function(_) {
return arguments.length ? (outerRadius = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), arc) : outerRadius;
};
arc.cornerRadius = function(_) {
return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), arc) : cornerRadius;
};
arc.padRadius = function(_) {
return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), arc) : padRadius;
};
arc.startAngle = function(_) {
return arguments.length ? (startAngle = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), arc) : startAngle;
};
arc.endAngle = function(_) {
return arguments.length ? (endAngle = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), arc) : endAngle;
};
arc.padAngle = function(_) {
return arguments.length ? (padAngle = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), arc) : padAngle;
};
arc.context = function(_) {
return arguments.length ? ((context = _ == null ? null : _), arc) : context;
};
return arc;
});
/***/ }),
/***/ "./node_modules/d3-shape/src/area.js":
/*!*******************************************!*\
!*** ./node_modules/d3-shape/src/area.js ***!
\*******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-path */ "./node_modules/d3-path/src/index.js");
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-shape/src/constant.js");
/* harmony import */ var _curve_linear__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./curve/linear */ "./node_modules/d3-shape/src/curve/linear.js");
/* harmony import */ var _line__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./line */ "./node_modules/d3-shape/src/line.js");
/* harmony import */ var _point__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./point */ "./node_modules/d3-shape/src/point.js");
/* harmony default export */ __webpack_exports__["default"] = (function() {
var x0 = _point__WEBPACK_IMPORTED_MODULE_4__["x"],
x1 = null,
y0 = Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(0),
y1 = _point__WEBPACK_IMPORTED_MODULE_4__["y"],
defined = Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(true),
context = null,
curve = _curve_linear__WEBPACK_IMPORTED_MODULE_2__["default"],
output = null;
function area(data) {
var i,
j,
k,
n = data.length,
d,
defined0 = false,
buffer,
x0z = new Array(n),
y0z = new Array(n);
if (context == null) output = curve(buffer = Object(d3_path__WEBPACK_IMPORTED_MODULE_0__["path"])());
for (i = 0; i <= n; ++i) {
if (!(i < n && defined(d = data[i], i, data)) === defined0) {
if (defined0 = !defined0) {
j = i;
output.areaStart();
output.lineStart();
} else {
output.lineEnd();
output.lineStart();
for (k = i - 1; k >= j; --k) {
output.point(x0z[k], y0z[k]);
}
output.lineEnd();
output.areaEnd();
}
}
if (defined0) {
x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
}
}
if (buffer) return output = null, buffer + "" || null;
}
function arealine() {
return Object(_line__WEBPACK_IMPORTED_MODULE_3__["default"])().defined(defined).curve(curve).context(context);
}
area.x = function(_) {
return arguments.length ? (x0 = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), x1 = null, area) : x0;
};
area.x0 = function(_) {
return arguments.length ? (x0 = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), area) : x0;
};
area.x1 = function(_) {
return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), area) : x1;
};
area.y = function(_) {
return arguments.length ? (y0 = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), y1 = null, area) : y0;
};
area.y0 = function(_) {
return arguments.length ? (y0 = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), area) : y0;
};
area.y1 = function(_) {
return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), area) : y1;
};
area.lineX0 =
area.lineY0 = function() {
return arealine().x(x0).y(y0);
};
area.lineY1 = function() {
return arealine().x(x0).y(y1);
};
area.lineX1 = function() {
return arealine().x(x1).y(y0);
};
area.defined = function(_) {
return arguments.length ? (defined = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(!!_), area) : defined;
};
area.curve = function(_) {
return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
};
area.context = function(_) {
return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
};
return area;
});
/***/ }),
/***/ "./node_modules/d3-shape/src/areaRadial.js":
/*!*************************************************!*\
!*** ./node_modules/d3-shape/src/areaRadial.js ***!
\*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _curve_radial__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curve/radial */ "./node_modules/d3-shape/src/curve/radial.js");
/* harmony import */ var _area__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./area */ "./node_modules/d3-shape/src/area.js");
/* harmony import */ var _lineRadial__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lineRadial */ "./node_modules/d3-shape/src/lineRadial.js");
/* harmony default export */ __webpack_exports__["default"] = (function() {
var a = Object(_area__WEBPACK_IMPORTED_MODULE_1__["default"])().curve(_curve_radial__WEBPACK_IMPORTED_MODULE_0__["curveRadialLinear"]),
c = a.curve,
x0 = a.lineX0,
x1 = a.lineX1,
y0 = a.lineY0,
y1 = a.lineY1;
a.angle = a.x, delete a.x;
a.startAngle = a.x0, delete a.x0;
a.endAngle = a.x1, delete a.x1;
a.radius = a.y, delete a.y;
a.innerRadius = a.y0, delete a.y0;
a.outerRadius = a.y1, delete a.y1;
a.lineStartAngle = function() { return Object(_lineRadial__WEBPACK_IMPORTED_MODULE_2__["lineRadial"])(x0()); }, delete a.lineX0;
a.lineEndAngle = function() { return Object(_lineRadial__WEBPACK_IMPORTED_MODULE_2__["lineRadial"])(x1()); }, delete a.lineX1;
a.lineInnerRadius = function() { return Object(_lineRadial__WEBPACK_IMPORTED_MODULE_2__["lineRadial"])(y0()); }, delete a.lineY0;
a.lineOuterRadius = function() { return Object(_lineRadial__WEBPACK_IMPORTED_MODULE_2__["lineRadial"])(y1()); }, delete a.lineY1;
a.curve = function(_) {
return arguments.length ? c(Object(_curve_radial__WEBPACK_IMPORTED_MODULE_0__["default"])(_)) : c()._curve;
};
return a;
});
/***/ }),
/***/ "./node_modules/d3-shape/src/array.js":
/*!********************************************!*\
!*** ./node_modules/d3-shape/src/array.js ***!
\********************************************/
/*! exports provided: slice */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice", function() { return slice; });
var slice = Array.prototype.slice;
/***/ }),
/***/ "./node_modules/d3-shape/src/constant.js":
/*!***********************************************!*\
!*** ./node_modules/d3-shape/src/constant.js ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(x) {
return function constant() {
return x;
};
});
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/basis.js":
/*!**************************************************!*\
!*** ./node_modules/d3-shape/src/curve/basis.js ***!
\**************************************************/
/*! exports provided: point, Basis, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "point", function() { return point; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Basis", function() { return Basis; });
function point(that, x, y) {
that._context.bezierCurveTo(
(2 * that._x0 + that._x1) / 3,
(2 * that._y0 + that._y1) / 3,
(that._x0 + 2 * that._x1) / 3,
(that._y0 + 2 * that._y1) / 3,
(that._x0 + 4 * that._x1 + x) / 6,
(that._y0 + 4 * that._y1 + y) / 6
);
}
function Basis(context) {
this._context = context;
}
Basis.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 =
this._y0 = this._y1 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 3: point(this, this._x1, this._y1); // proceed
case 2: this._context.lineTo(this._x1, this._y1); break;
}
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; break;
case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
default: point(this, x, y); break;
}
this._x0 = this._x1, this._x1 = x;
this._y0 = this._y1, this._y1 = y;
}
};
/* harmony default export */ __webpack_exports__["default"] = (function(context) {
return new Basis(context);
});
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/basisClosed.js":
/*!********************************************************!*\
!*** ./node_modules/d3-shape/src/curve/basisClosed.js ***!
\********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _noop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../noop */ "./node_modules/d3-shape/src/noop.js");
/* harmony import */ var _basis__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./basis */ "./node_modules/d3-shape/src/curve/basis.js");
function BasisClosed(context) {
this._context = context;
}
BasisClosed.prototype = {
areaStart: _noop__WEBPACK_IMPORTED_MODULE_0__["default"],
areaEnd: _noop__WEBPACK_IMPORTED_MODULE_0__["default"],
lineStart: function() {
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 1: {
this._context.moveTo(this._x2, this._y2);
this._context.closePath();
break;
}
case 2: {
this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
this._context.closePath();
break;
}
case 3: {
this.point(this._x2, this._y2);
this.point(this._x3, this._y3);
this.point(this._x4, this._y4);
break;
}
}
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;
default: Object(_basis__WEBPACK_IMPORTED_MODULE_1__["point"])(this, x, y); break;
}
this._x0 = this._x1, this._x1 = x;
this._y0 = this._y1, this._y1 = y;
}
};
/* harmony default export */ __webpack_exports__["default"] = (function(context) {
return new BasisClosed(context);
});
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/basisOpen.js":
/*!******************************************************!*\
!*** ./node_modules/d3-shape/src/curve/basisOpen.js ***!
\******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _basis__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./basis */ "./node_modules/d3-shape/src/curve/basis.js");
function BasisOpen(context) {
this._context = context;
}
BasisOpen.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 =
this._y0 = this._y1 = NaN;
this._point = 0;
},
lineEnd: function() {
if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; break;
case 1: this._point = 2; break;
case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;
case 3: this._point = 4; // proceed
default: Object(_basis__WEBPACK_IMPORTED_MODULE_0__["point"])(this, x, y); break;
}
this._x0 = this._x1, this._x1 = x;
this._y0 = this._y1, this._y1 = y;
}
};
/* harmony default export */ __webpack_exports__["default"] = (function(context) {
return new BasisOpen(context);
});
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/bundle.js":
/*!***************************************************!*\
!*** ./node_modules/d3-shape/src/curve/bundle.js ***!
\***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _basis__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./basis */ "./node_modules/d3-shape/src/curve/basis.js");
function Bundle(context, beta) {
this._basis = new _basis__WEBPACK_IMPORTED_MODULE_0__["Basis"](context);
this._beta = beta;
}
Bundle.prototype = {
lineStart: function() {
this._x = [];
this._y = [];
this._basis.lineStart();
},
lineEnd: function() {
var x = this._x,
y = this._y,
j = x.length - 1;
if (j > 0) {
var x0 = x[0],
y0 = y[0],
dx = x[j] - x0,
dy = y[j] - y0,
i = -1,
t;
while (++i <= j) {
t = i / j;
this._basis.point(
this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
);
}
}
this._x = this._y = null;
this._basis.lineEnd();
},
point: function(x, y) {
this._x.push(+x);
this._y.push(+y);
}
};
/* harmony default export */ __webpack_exports__["default"] = ((function custom(beta) {
function bundle(context) {
return beta === 1 ? new _basis__WEBPACK_IMPORTED_MODULE_0__["Basis"](context) : new Bundle(context, beta);
}
bundle.beta = function(beta) {
return custom(+beta);
};
return bundle;
})(0.85));
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/cardinal.js":
/*!*****************************************************!*\
!*** ./node_modules/d3-shape/src/curve/cardinal.js ***!
\*****************************************************/
/*! exports provided: point, Cardinal, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "point", function() { return point; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cardinal", function() { return Cardinal; });
function point(that, x, y) {
that._context.bezierCurveTo(
that._x1 + that._k * (that._x2 - that._x0),
that._y1 + that._k * (that._y2 - that._y0),
that._x2 + that._k * (that._x1 - x),
that._y2 + that._k * (that._y1 - y),
that._x2,
that._y2
);
}
function Cardinal(context, tension) {
this._context = context;
this._k = (1 - tension) / 6;
}
Cardinal.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 = this._x2 =
this._y0 = this._y1 = this._y2 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 2: this._context.lineTo(this._x2, this._y2); break;
case 3: point(this, this._x1, this._y1); break;
}
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
case 2: this._point = 3; // proceed
default: point(this, x, y); break;
}
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
/* harmony default export */ __webpack_exports__["default"] = ((function custom(tension) {
function cardinal(context) {
return new Cardinal(context, tension);
}
cardinal.tension = function(tension) {
return custom(+tension);
};
return cardinal;
})(0));
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/cardinalClosed.js":
/*!***********************************************************!*\
!*** ./node_modules/d3-shape/src/curve/cardinalClosed.js ***!
\***********************************************************/
/*! exports provided: CardinalClosed, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CardinalClosed", function() { return CardinalClosed; });
/* harmony import */ var _noop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../noop */ "./node_modules/d3-shape/src/noop.js");
/* harmony import */ var _cardinal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cardinal */ "./node_modules/d3-shape/src/curve/cardinal.js");
function CardinalClosed(context, tension) {
this._context = context;
this._k = (1 - tension) / 6;
}
CardinalClosed.prototype = {
areaStart: _noop__WEBPACK_IMPORTED_MODULE_0__["default"],
areaEnd: _noop__WEBPACK_IMPORTED_MODULE_0__["default"],
lineStart: function() {
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 1: {
this._context.moveTo(this._x3, this._y3);
this._context.closePath();
break;
}
case 2: {
this._context.lineTo(this._x3, this._y3);
this._context.closePath();
break;
}
case 3: {
this.point(this._x3, this._y3);
this.point(this._x4, this._y4);
this.point(this._x5, this._y5);
break;
}
}
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
default: Object(_cardinal__WEBPACK_IMPORTED_MODULE_1__["point"])(this, x, y); break;
}
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
/* harmony default export */ __webpack_exports__["default"] = ((function custom(tension) {
function cardinal(context) {
return new CardinalClosed(context, tension);
}
cardinal.tension = function(tension) {
return custom(+tension);
};
return cardinal;
})(0));
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/cardinalOpen.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-shape/src/curve/cardinalOpen.js ***!
\*********************************************************/
/*! exports provided: CardinalOpen, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CardinalOpen", function() { return CardinalOpen; });
/* harmony import */ var _cardinal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cardinal */ "./node_modules/d3-shape/src/curve/cardinal.js");
function CardinalOpen(context, tension) {
this._context = context;
this._k = (1 - tension) / 6;
}
CardinalOpen.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 = this._x2 =
this._y0 = this._y1 = this._y2 = NaN;
this._point = 0;
},
lineEnd: function() {
if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; break;
case 1: this._point = 2; break;
case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
case 3: this._point = 4; // proceed
default: Object(_cardinal__WEBPACK_IMPORTED_MODULE_0__["point"])(this, x, y); break;
}
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
/* harmony default export */ __webpack_exports__["default"] = ((function custom(tension) {
function cardinal(context) {
return new CardinalOpen(context, tension);
}
cardinal.tension = function(tension) {
return custom(+tension);
};
return cardinal;
})(0));
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/catmullRom.js":
/*!*******************************************************!*\
!*** ./node_modules/d3-shape/src/curve/catmullRom.js ***!
\*******************************************************/
/*! exports provided: point, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "point", function() { return point; });
/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ "./node_modules/d3-shape/src/math.js");
/* harmony import */ var _cardinal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cardinal */ "./node_modules/d3-shape/src/curve/cardinal.js");
function point(that, x, y) {
var x1 = that._x1,
y1 = that._y1,
x2 = that._x2,
y2 = that._y2;
if (that._l01_a > _math__WEBPACK_IMPORTED_MODULE_0__["epsilon"]) {
var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
n = 3 * that._l01_a * (that._l01_a + that._l12_a);
x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
}
if (that._l23_a > _math__WEBPACK_IMPORTED_MODULE_0__["epsilon"]) {
var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
m = 3 * that._l23_a * (that._l23_a + that._l12_a);
x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
}
that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
}
function CatmullRom(context, alpha) {
this._context = context;
this._alpha = alpha;
}
CatmullRom.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 = this._x2 =
this._y0 = this._y1 = this._y2 = NaN;
this._l01_a = this._l12_a = this._l23_a =
this._l01_2a = this._l12_2a = this._l23_2a =
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 2: this._context.lineTo(this._x2, this._y2); break;
case 3: this.point(this._x2, this._y2); break;
}
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
if (this._point) {
var x23 = this._x2 - x,
y23 = this._y2 - y;
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
}
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; break;
case 2: this._point = 3; // proceed
default: point(this, x, y); break;
}
this._l01_a = this._l12_a, this._l12_a = this._l23_a;
this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
/* harmony default export */ __webpack_exports__["default"] = ((function custom(alpha) {
function catmullRom(context) {
return alpha ? new CatmullRom(context, alpha) : new _cardinal__WEBPACK_IMPORTED_MODULE_1__["Cardinal"](context, 0);
}
catmullRom.alpha = function(alpha) {
return custom(+alpha);
};
return catmullRom;
})(0.5));
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/catmullRomClosed.js":
/*!*************************************************************!*\
!*** ./node_modules/d3-shape/src/curve/catmullRomClosed.js ***!
\*************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _cardinalClosed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cardinalClosed */ "./node_modules/d3-shape/src/curve/cardinalClosed.js");
/* harmony import */ var _noop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../noop */ "./node_modules/d3-shape/src/noop.js");
/* harmony import */ var _catmullRom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./catmullRom */ "./node_modules/d3-shape/src/curve/catmullRom.js");
function CatmullRomClosed(context, alpha) {
this._context = context;
this._alpha = alpha;
}
CatmullRomClosed.prototype = {
areaStart: _noop__WEBPACK_IMPORTED_MODULE_1__["default"],
areaEnd: _noop__WEBPACK_IMPORTED_MODULE_1__["default"],
lineStart: function() {
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
this._l01_a = this._l12_a = this._l23_a =
this._l01_2a = this._l12_2a = this._l23_2a =
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 1: {
this._context.moveTo(this._x3, this._y3);
this._context.closePath();
break;
}
case 2: {
this._context.lineTo(this._x3, this._y3);
this._context.closePath();
break;
}
case 3: {
this.point(this._x3, this._y3);
this.point(this._x4, this._y4);
this.point(this._x5, this._y5);
break;
}
}
},
point: function(x, y) {
x = +x, y = +y;
if (this._point) {
var x23 = this._x2 - x,
y23 = this._y2 - y;
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
}
switch (this._point) {
case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
default: Object(_catmullRom__WEBPACK_IMPORTED_MODULE_2__["point"])(this, x, y); break;
}
this._l01_a = this._l12_a, this._l12_a = this._l23_a;
this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
/* harmony default export */ __webpack_exports__["default"] = ((function custom(alpha) {
function catmullRom(context) {
return alpha ? new CatmullRomClosed(context, alpha) : new _cardinalClosed__WEBPACK_IMPORTED_MODULE_0__["CardinalClosed"](context, 0);
}
catmullRom.alpha = function(alpha) {
return custom(+alpha);
};
return catmullRom;
})(0.5));
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/catmullRomOpen.js":
/*!***********************************************************!*\
!*** ./node_modules/d3-shape/src/curve/catmullRomOpen.js ***!
\***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _cardinalOpen__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cardinalOpen */ "./node_modules/d3-shape/src/curve/cardinalOpen.js");
/* harmony import */ var _catmullRom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./catmullRom */ "./node_modules/d3-shape/src/curve/catmullRom.js");
function CatmullRomOpen(context, alpha) {
this._context = context;
this._alpha = alpha;
}
CatmullRomOpen.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 = this._x2 =
this._y0 = this._y1 = this._y2 = NaN;
this._l01_a = this._l12_a = this._l23_a =
this._l01_2a = this._l12_2a = this._l23_2a =
this._point = 0;
},
lineEnd: function() {
if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
if (this._point) {
var x23 = this._x2 - x,
y23 = this._y2 - y;
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
}
switch (this._point) {
case 0: this._point = 1; break;
case 1: this._point = 2; break;
case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
case 3: this._point = 4; // proceed
default: Object(_catmullRom__WEBPACK_IMPORTED_MODULE_1__["point"])(this, x, y); break;
}
this._l01_a = this._l12_a, this._l12_a = this._l23_a;
this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
}
};
/* harmony default export */ __webpack_exports__["default"] = ((function custom(alpha) {
function catmullRom(context) {
return alpha ? new CatmullRomOpen(context, alpha) : new _cardinalOpen__WEBPACK_IMPORTED_MODULE_0__["CardinalOpen"](context, 0);
}
catmullRom.alpha = function(alpha) {
return custom(+alpha);
};
return catmullRom;
})(0.5));
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/linear.js":
/*!***************************************************!*\
!*** ./node_modules/d3-shape/src/curve/linear.js ***!
\***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function Linear(context) {
this._context = context;
}
Linear.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._point = 0;
},
lineEnd: function() {
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; // proceed
default: this._context.lineTo(x, y); break;
}
}
};
/* harmony default export */ __webpack_exports__["default"] = (function(context) {
return new Linear(context);
});
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/linearClosed.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-shape/src/curve/linearClosed.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _noop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../noop */ "./node_modules/d3-shape/src/noop.js");
function LinearClosed(context) {
this._context = context;
}
LinearClosed.prototype = {
areaStart: _noop__WEBPACK_IMPORTED_MODULE_0__["default"],
areaEnd: _noop__WEBPACK_IMPORTED_MODULE_0__["default"],
lineStart: function() {
this._point = 0;
},
lineEnd: function() {
if (this._point) this._context.closePath();
},
point: function(x, y) {
x = +x, y = +y;
if (this._point) this._context.lineTo(x, y);
else this._point = 1, this._context.moveTo(x, y);
}
};
/* harmony default export */ __webpack_exports__["default"] = (function(context) {
return new LinearClosed(context);
});
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/monotone.js":
/*!*****************************************************!*\
!*** ./node_modules/d3-shape/src/curve/monotone.js ***!
\*****************************************************/
/*! exports provided: monotoneX, monotoneY */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "monotoneX", function() { return monotoneX; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "monotoneY", function() { return monotoneY; });
function sign(x) {
return x < 0 ? -1 : 1;
}
// Calculate the slopes of the tangents (Hermite-type interpolation) based on
// the following paper: Steffen, M. 1990. A Simple Method for Monotonic
// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
// NOV(II), P. 443, 1990.
function slope3(that, x2, y2) {
var h0 = that._x1 - that._x0,
h1 = x2 - that._x1,
s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
p = (s0 * h1 + s1 * h0) / (h0 + h1);
return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
}
// Calculate a one-sided slope.
function slope2(that, t) {
var h = that._x1 - that._x0;
return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
}
// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
// "you can express cubic Hermite interpolation in terms of cubic Bézier curves
// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
function point(that, t0, t1) {
var x0 = that._x0,
y0 = that._y0,
x1 = that._x1,
y1 = that._y1,
dx = (x1 - x0) / 3;
that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
}
function MonotoneX(context) {
this._context = context;
}
MonotoneX.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x0 = this._x1 =
this._y0 = this._y1 =
this._t0 = NaN;
this._point = 0;
},
lineEnd: function() {
switch (this._point) {
case 2: this._context.lineTo(this._x1, this._y1); break;
case 3: point(this, this._t0, slope2(this, this._t0)); break;
}
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
this._line = 1 - this._line;
},
point: function(x, y) {
var t1 = NaN;
x = +x, y = +y;
if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; break;
case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
default: point(this, this._t0, t1 = slope3(this, x, y)); break;
}
this._x0 = this._x1, this._x1 = x;
this._y0 = this._y1, this._y1 = y;
this._t0 = t1;
}
}
function MonotoneY(context) {
this._context = new ReflectContext(context);
}
(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
MonotoneX.prototype.point.call(this, y, x);
};
function ReflectContext(context) {
this._context = context;
}
ReflectContext.prototype = {
moveTo: function(x, y) { this._context.moveTo(y, x); },
closePath: function() { this._context.closePath(); },
lineTo: function(x, y) { this._context.lineTo(y, x); },
bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
};
function monotoneX(context) {
return new MonotoneX(context);
}
function monotoneY(context) {
return new MonotoneY(context);
}
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/natural.js":
/*!****************************************************!*\
!*** ./node_modules/d3-shape/src/curve/natural.js ***!
\****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function Natural(context) {
this._context = context;
}
Natural.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x = [];
this._y = [];
},
lineEnd: function() {
var x = this._x,
y = this._y,
n = x.length;
if (n) {
this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
if (n === 2) {
this._context.lineTo(x[1], y[1]);
} else {
var px = controlPoints(x),
py = controlPoints(y);
for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
}
}
}
if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
this._line = 1 - this._line;
this._x = this._y = null;
},
point: function(x, y) {
this._x.push(+x);
this._y.push(+y);
}
};
// See https://www.particleincell.com/2012/bezier-splines/ for derivation.
function controlPoints(x) {
var i,
n = x.length - 1,
m,
a = new Array(n),
b = new Array(n),
r = new Array(n);
a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
a[n - 1] = r[n - 1] / b[n - 1];
for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
b[n - 1] = (x[n] + a[n - 1]) / 2;
for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
return [a, b];
}
/* harmony default export */ __webpack_exports__["default"] = (function(context) {
return new Natural(context);
});
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/radial.js":
/*!***************************************************!*\
!*** ./node_modules/d3-shape/src/curve/radial.js ***!
\***************************************************/
/*! exports provided: curveRadialLinear, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "curveRadialLinear", function() { return curveRadialLinear; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return curveRadial; });
/* harmony import */ var _linear__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./linear */ "./node_modules/d3-shape/src/curve/linear.js");
var curveRadialLinear = curveRadial(_linear__WEBPACK_IMPORTED_MODULE_0__["default"]);
function Radial(curve) {
this._curve = curve;
}
Radial.prototype = {
areaStart: function() {
this._curve.areaStart();
},
areaEnd: function() {
this._curve.areaEnd();
},
lineStart: function() {
this._curve.lineStart();
},
lineEnd: function() {
this._curve.lineEnd();
},
point: function(a, r) {
this._curve.point(r * Math.sin(a), r * -Math.cos(a));
}
};
function curveRadial(curve) {
function radial(context) {
return new Radial(curve(context));
}
radial._curve = curve;
return radial;
}
/***/ }),
/***/ "./node_modules/d3-shape/src/curve/step.js":
/*!*************************************************!*\
!*** ./node_modules/d3-shape/src/curve/step.js ***!
\*************************************************/
/*! exports provided: default, stepBefore, stepAfter */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stepBefore", function() { return stepBefore; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stepAfter", function() { return stepAfter; });
function Step(context, t) {
this._context = context;
this._t = t;
}
Step.prototype = {
areaStart: function() {
this._line = 0;
},
areaEnd: function() {
this._line = NaN;
},
lineStart: function() {
this._x = this._y = NaN;
this._point = 0;
},
lineEnd: function() {
if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
},
point: function(x, y) {
x = +x, y = +y;
switch (this._point) {
case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
case 1: this._point = 2; // proceed
default: {
if (this._t <= 0) {
this._context.lineTo(this._x, y);
this._context.lineTo(x, y);
} else {
var x1 = this._x * (1 - this._t) + x * this._t;
this._context.lineTo(x1, this._y);
this._context.lineTo(x1, y);
}
break;
}
}
this._x = x, this._y = y;
}
};
/* harmony default export */ __webpack_exports__["default"] = (function(context) {
return new Step(context, 0.5);
});
function stepBefore(context) {
return new Step(context, 0);
}
function stepAfter(context) {
return new Step(context, 1);
}
/***/ }),
/***/ "./node_modules/d3-shape/src/descending.js":
/*!*************************************************!*\
!*** ./node_modules/d3-shape/src/descending.js ***!
\*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
});
/***/ }),
/***/ "./node_modules/d3-shape/src/identity.js":
/*!***********************************************!*\
!*** ./node_modules/d3-shape/src/identity.js ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(d) {
return d;
});
/***/ }),
/***/ "./node_modules/d3-shape/src/index.js":
/*!********************************************!*\
!*** ./node_modules/d3-shape/src/index.js ***!
\********************************************/
/*! exports provided: arc, area, line, pie, areaRadial, radialArea, lineRadial, radialLine, pointRadial, linkHorizontal, linkVertical, linkRadial, symbol, symbols, symbolCircle, symbolCross, symbolDiamond, symbolSquare, symbolStar, symbolTriangle, symbolWye, curveBasisClosed, curveBasisOpen, curveBasis, curveBundle, curveCardinalClosed, curveCardinalOpen, curveCardinal, curveCatmullRomClosed, curveCatmullRomOpen, curveCatmullRom, curveLinearClosed, curveLinear, curveMonotoneX, curveMonotoneY, curveNatural, curveStep, curveStepAfter, curveStepBefore, stack, stackOffsetExpand, stackOffsetDiverging, stackOffsetNone, stackOffsetSilhouette, stackOffsetWiggle, stackOrderAppearance, stackOrderAscending, stackOrderDescending, stackOrderInsideOut, stackOrderNone, stackOrderReverse */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _arc__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arc */ "./node_modules/d3-shape/src/arc.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "arc", function() { return _arc__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/* harmony import */ var _area__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./area */ "./node_modules/d3-shape/src/area.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "area", function() { return _area__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/* harmony import */ var _line__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./line */ "./node_modules/d3-shape/src/line.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "line", function() { return _line__WEBPACK_IMPORTED_MODULE_2__["default"]; });
/* harmony import */ var _pie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pie */ "./node_modules/d3-shape/src/pie.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pie", function() { return _pie__WEBPACK_IMPORTED_MODULE_3__["default"]; });
/* harmony import */ var _areaRadial__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./areaRadial */ "./node_modules/d3-shape/src/areaRadial.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "areaRadial", function() { return _areaRadial__WEBPACK_IMPORTED_MODULE_4__["default"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "radialArea", function() { return _areaRadial__WEBPACK_IMPORTED_MODULE_4__["default"]; });
/* harmony import */ var _lineRadial__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lineRadial */ "./node_modules/d3-shape/src/lineRadial.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lineRadial", function() { return _lineRadial__WEBPACK_IMPORTED_MODULE_5__["default"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "radialLine", function() { return _lineRadial__WEBPACK_IMPORTED_MODULE_5__["default"]; });
/* harmony import */ var _pointRadial__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./pointRadial */ "./node_modules/d3-shape/src/pointRadial.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pointRadial", function() { return _pointRadial__WEBPACK_IMPORTED_MODULE_6__["default"]; });
/* harmony import */ var _link_index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./link/index */ "./node_modules/d3-shape/src/link/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "linkHorizontal", function() { return _link_index__WEBPACK_IMPORTED_MODULE_7__["linkHorizontal"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "linkVertical", function() { return _link_index__WEBPACK_IMPORTED_MODULE_7__["linkVertical"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "linkRadial", function() { return _link_index__WEBPACK_IMPORTED_MODULE_7__["linkRadial"]; });
/* harmony import */ var _symbol__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./symbol */ "./node_modules/d3-shape/src/symbol.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbol", function() { return _symbol__WEBPACK_IMPORTED_MODULE_8__["default"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbols", function() { return _symbol__WEBPACK_IMPORTED_MODULE_8__["symbols"]; });
/* harmony import */ var _symbol_circle__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./symbol/circle */ "./node_modules/d3-shape/src/symbol/circle.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolCircle", function() { return _symbol_circle__WEBPACK_IMPORTED_MODULE_9__["default"]; });
/* harmony import */ var _symbol_cross__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./symbol/cross */ "./node_modules/d3-shape/src/symbol/cross.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolCross", function() { return _symbol_cross__WEBPACK_IMPORTED_MODULE_10__["default"]; });
/* harmony import */ var _symbol_diamond__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./symbol/diamond */ "./node_modules/d3-shape/src/symbol/diamond.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolDiamond", function() { return _symbol_diamond__WEBPACK_IMPORTED_MODULE_11__["default"]; });
/* harmony import */ var _symbol_square__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./symbol/square */ "./node_modules/d3-shape/src/symbol/square.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolSquare", function() { return _symbol_square__WEBPACK_IMPORTED_MODULE_12__["default"]; });
/* harmony import */ var _symbol_star__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./symbol/star */ "./node_modules/d3-shape/src/symbol/star.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolStar", function() { return _symbol_star__WEBPACK_IMPORTED_MODULE_13__["default"]; });
/* harmony import */ var _symbol_triangle__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./symbol/triangle */ "./node_modules/d3-shape/src/symbol/triangle.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolTriangle", function() { return _symbol_triangle__WEBPACK_IMPORTED_MODULE_14__["default"]; });
/* harmony import */ var _symbol_wye__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./symbol/wye */ "./node_modules/d3-shape/src/symbol/wye.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolWye", function() { return _symbol_wye__WEBPACK_IMPORTED_MODULE_15__["default"]; });
/* harmony import */ var _curve_basisClosed__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./curve/basisClosed */ "./node_modules/d3-shape/src/curve/basisClosed.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveBasisClosed", function() { return _curve_basisClosed__WEBPACK_IMPORTED_MODULE_16__["default"]; });
/* harmony import */ var _curve_basisOpen__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./curve/basisOpen */ "./node_modules/d3-shape/src/curve/basisOpen.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveBasisOpen", function() { return _curve_basisOpen__WEBPACK_IMPORTED_MODULE_17__["default"]; });
/* harmony import */ var _curve_basis__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./curve/basis */ "./node_modules/d3-shape/src/curve/basis.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveBasis", function() { return _curve_basis__WEBPACK_IMPORTED_MODULE_18__["default"]; });
/* harmony import */ var _curve_bundle__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./curve/bundle */ "./node_modules/d3-shape/src/curve/bundle.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveBundle", function() { return _curve_bundle__WEBPACK_IMPORTED_MODULE_19__["default"]; });
/* harmony import */ var _curve_cardinalClosed__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./curve/cardinalClosed */ "./node_modules/d3-shape/src/curve/cardinalClosed.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCardinalClosed", function() { return _curve_cardinalClosed__WEBPACK_IMPORTED_MODULE_20__["default"]; });
/* harmony import */ var _curve_cardinalOpen__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./curve/cardinalOpen */ "./node_modules/d3-shape/src/curve/cardinalOpen.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCardinalOpen", function() { return _curve_cardinalOpen__WEBPACK_IMPORTED_MODULE_21__["default"]; });
/* harmony import */ var _curve_cardinal__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./curve/cardinal */ "./node_modules/d3-shape/src/curve/cardinal.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCardinal", function() { return _curve_cardinal__WEBPACK_IMPORTED_MODULE_22__["default"]; });
/* harmony import */ var _curve_catmullRomClosed__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./curve/catmullRomClosed */ "./node_modules/d3-shape/src/curve/catmullRomClosed.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCatmullRomClosed", function() { return _curve_catmullRomClosed__WEBPACK_IMPORTED_MODULE_23__["default"]; });
/* harmony import */ var _curve_catmullRomOpen__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./curve/catmullRomOpen */ "./node_modules/d3-shape/src/curve/catmullRomOpen.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCatmullRomOpen", function() { return _curve_catmullRomOpen__WEBPACK_IMPORTED_MODULE_24__["default"]; });
/* harmony import */ var _curve_catmullRom__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./curve/catmullRom */ "./node_modules/d3-shape/src/curve/catmullRom.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCatmullRom", function() { return _curve_catmullRom__WEBPACK_IMPORTED_MODULE_25__["default"]; });
/* harmony import */ var _curve_linearClosed__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./curve/linearClosed */ "./node_modules/d3-shape/src/curve/linearClosed.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveLinearClosed", function() { return _curve_linearClosed__WEBPACK_IMPORTED_MODULE_26__["default"]; });
/* harmony import */ var _curve_linear__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./curve/linear */ "./node_modules/d3-shape/src/curve/linear.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveLinear", function() { return _curve_linear__WEBPACK_IMPORTED_MODULE_27__["default"]; });
/* harmony import */ var _curve_monotone__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./curve/monotone */ "./node_modules/d3-shape/src/curve/monotone.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveMonotoneX", function() { return _curve_monotone__WEBPACK_IMPORTED_MODULE_28__["monotoneX"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveMonotoneY", function() { return _curve_monotone__WEBPACK_IMPORTED_MODULE_28__["monotoneY"]; });
/* harmony import */ var _curve_natural__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./curve/natural */ "./node_modules/d3-shape/src/curve/natural.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveNatural", function() { return _curve_natural__WEBPACK_IMPORTED_MODULE_29__["default"]; });
/* harmony import */ var _curve_step__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./curve/step */ "./node_modules/d3-shape/src/curve/step.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveStep", function() { return _curve_step__WEBPACK_IMPORTED_MODULE_30__["default"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveStepAfter", function() { return _curve_step__WEBPACK_IMPORTED_MODULE_30__["stepAfter"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveStepBefore", function() { return _curve_step__WEBPACK_IMPORTED_MODULE_30__["stepBefore"]; });
/* harmony import */ var _stack__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./stack */ "./node_modules/d3-shape/src/stack.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stack", function() { return _stack__WEBPACK_IMPORTED_MODULE_31__["default"]; });
/* harmony import */ var _offset_expand__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./offset/expand */ "./node_modules/d3-shape/src/offset/expand.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetExpand", function() { return _offset_expand__WEBPACK_IMPORTED_MODULE_32__["default"]; });
/* harmony import */ var _offset_diverging__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./offset/diverging */ "./node_modules/d3-shape/src/offset/diverging.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetDiverging", function() { return _offset_diverging__WEBPACK_IMPORTED_MODULE_33__["default"]; });
/* harmony import */ var _offset_none__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./offset/none */ "./node_modules/d3-shape/src/offset/none.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetNone", function() { return _offset_none__WEBPACK_IMPORTED_MODULE_34__["default"]; });
/* harmony import */ var _offset_silhouette__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./offset/silhouette */ "./node_modules/d3-shape/src/offset/silhouette.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetSilhouette", function() { return _offset_silhouette__WEBPACK_IMPORTED_MODULE_35__["default"]; });
/* harmony import */ var _offset_wiggle__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./offset/wiggle */ "./node_modules/d3-shape/src/offset/wiggle.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetWiggle", function() { return _offset_wiggle__WEBPACK_IMPORTED_MODULE_36__["default"]; });
/* harmony import */ var _order_appearance__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./order/appearance */ "./node_modules/d3-shape/src/order/appearance.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderAppearance", function() { return _order_appearance__WEBPACK_IMPORTED_MODULE_37__["default"]; });
/* harmony import */ var _order_ascending__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./order/ascending */ "./node_modules/d3-shape/src/order/ascending.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderAscending", function() { return _order_ascending__WEBPACK_IMPORTED_MODULE_38__["default"]; });
/* harmony import */ var _order_descending__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./order/descending */ "./node_modules/d3-shape/src/order/descending.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderDescending", function() { return _order_descending__WEBPACK_IMPORTED_MODULE_39__["default"]; });
/* harmony import */ var _order_insideOut__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./order/insideOut */ "./node_modules/d3-shape/src/order/insideOut.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderInsideOut", function() { return _order_insideOut__WEBPACK_IMPORTED_MODULE_40__["default"]; });
/* harmony import */ var _order_none__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./order/none */ "./node_modules/d3-shape/src/order/none.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderNone", function() { return _order_none__WEBPACK_IMPORTED_MODULE_41__["default"]; });
/* harmony import */ var _order_reverse__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./order/reverse */ "./node_modules/d3-shape/src/order/reverse.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderReverse", function() { return _order_reverse__WEBPACK_IMPORTED_MODULE_42__["default"]; });
// Note: radialArea is deprecated!
// Note: radialLine is deprecated!
/***/ }),
/***/ "./node_modules/d3-shape/src/line.js":
/*!*******************************************!*\
!*** ./node_modules/d3-shape/src/line.js ***!
\*******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-path */ "./node_modules/d3-path/src/index.js");
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-shape/src/constant.js");
/* harmony import */ var _curve_linear__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./curve/linear */ "./node_modules/d3-shape/src/curve/linear.js");
/* harmony import */ var _point__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./point */ "./node_modules/d3-shape/src/point.js");
/* harmony default export */ __webpack_exports__["default"] = (function() {
var x = _point__WEBPACK_IMPORTED_MODULE_3__["x"],
y = _point__WEBPACK_IMPORTED_MODULE_3__["y"],
defined = Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(true),
context = null,
curve = _curve_linear__WEBPACK_IMPORTED_MODULE_2__["default"],
output = null;
function line(data) {
var i,
n = data.length,
d,
defined0 = false,
buffer;
if (context == null) output = curve(buffer = Object(d3_path__WEBPACK_IMPORTED_MODULE_0__["path"])());
for (i = 0; i <= n; ++i) {
if (!(i < n && defined(d = data[i], i, data)) === defined0) {
if (defined0 = !defined0) output.lineStart();
else output.lineEnd();
}
if (defined0) output.point(+x(d, i, data), +y(d, i, data));
}
if (buffer) return output = null, buffer + "" || null;
}
line.x = function(_) {
return arguments.length ? (x = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), line) : x;
};
line.y = function(_) {
return arguments.length ? (y = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), line) : y;
};
line.defined = function(_) {
return arguments.length ? (defined = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(!!_), line) : defined;
};
line.curve = function(_) {
return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
};
line.context = function(_) {
return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
};
return line;
});
/***/ }),
/***/ "./node_modules/d3-shape/src/lineRadial.js":
/*!*************************************************!*\
!*** ./node_modules/d3-shape/src/lineRadial.js ***!
\*************************************************/
/*! exports provided: lineRadial, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lineRadial", function() { return lineRadial; });
/* harmony import */ var _curve_radial__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curve/radial */ "./node_modules/d3-shape/src/curve/radial.js");
/* harmony import */ var _line__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./line */ "./node_modules/d3-shape/src/line.js");
function lineRadial(l) {
var c = l.curve;
l.angle = l.x, delete l.x;
l.radius = l.y, delete l.y;
l.curve = function(_) {
return arguments.length ? c(Object(_curve_radial__WEBPACK_IMPORTED_MODULE_0__["default"])(_)) : c()._curve;
};
return l;
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
return lineRadial(Object(_line__WEBPACK_IMPORTED_MODULE_1__["default"])().curve(_curve_radial__WEBPACK_IMPORTED_MODULE_0__["curveRadialLinear"]));
});
/***/ }),
/***/ "./node_modules/d3-shape/src/link/index.js":
/*!*************************************************!*\
!*** ./node_modules/d3-shape/src/link/index.js ***!
\*************************************************/
/*! exports provided: linkHorizontal, linkVertical, linkRadial */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkHorizontal", function() { return linkHorizontal; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkVertical", function() { return linkVertical; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkRadial", function() { return linkRadial; });
/* harmony import */ var d3_path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-path */ "./node_modules/d3-path/src/index.js");
/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../array */ "./node_modules/d3-shape/src/array.js");
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constant */ "./node_modules/d3-shape/src/constant.js");
/* harmony import */ var _point__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../point */ "./node_modules/d3-shape/src/point.js");
/* harmony import */ var _pointRadial__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../pointRadial */ "./node_modules/d3-shape/src/pointRadial.js");
function linkSource(d) {
return d.source;
}
function linkTarget(d) {
return d.target;
}
function link(curve) {
var source = linkSource,
target = linkTarget,
x = _point__WEBPACK_IMPORTED_MODULE_3__["x"],
y = _point__WEBPACK_IMPORTED_MODULE_3__["y"],
context = null;
function link() {
var buffer, argv = _array__WEBPACK_IMPORTED_MODULE_1__["slice"].call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
if (!context) context = buffer = Object(d3_path__WEBPACK_IMPORTED_MODULE_0__["path"])();
curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));
if (buffer) return context = null, buffer + "" || null;
}
link.source = function(_) {
return arguments.length ? (source = _, link) : source;
};
link.target = function(_) {
return arguments.length ? (target = _, link) : target;
};
link.x = function(_) {
return arguments.length ? (x = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_2__["default"])(+_), link) : x;
};
link.y = function(_) {
return arguments.length ? (y = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_2__["default"])(+_), link) : y;
};
link.context = function(_) {
return arguments.length ? ((context = _ == null ? null : _), link) : context;
};
return link;
}
function curveHorizontal(context, x0, y0, x1, y1) {
context.moveTo(x0, y0);
context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
}
function curveVertical(context, x0, y0, x1, y1) {
context.moveTo(x0, y0);
context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
}
function curveRadial(context, x0, y0, x1, y1) {
var p0 = Object(_pointRadial__WEBPACK_IMPORTED_MODULE_4__["default"])(x0, y0),
p1 = Object(_pointRadial__WEBPACK_IMPORTED_MODULE_4__["default"])(x0, y0 = (y0 + y1) / 2),
p2 = Object(_pointRadial__WEBPACK_IMPORTED_MODULE_4__["default"])(x1, y0),
p3 = Object(_pointRadial__WEBPACK_IMPORTED_MODULE_4__["default"])(x1, y1);
context.moveTo(p0[0], p0[1]);
context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
}
function linkHorizontal() {
return link(curveHorizontal);
}
function linkVertical() {
return link(curveVertical);
}
function linkRadial() {
var l = link(curveRadial);
l.angle = l.x, delete l.x;
l.radius = l.y, delete l.y;
return l;
}
/***/ }),
/***/ "./node_modules/d3-shape/src/math.js":
/*!*******************************************!*\
!*** ./node_modules/d3-shape/src/math.js ***!
\*******************************************/
/*! exports provided: abs, atan2, cos, max, min, sin, sqrt, epsilon, pi, halfPi, tau, acos, asin */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "abs", function() { return abs; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atan2", function() { return atan2; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cos", function() { return cos; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sin", function() { return sin; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sqrt", function() { return sqrt; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "epsilon", function() { return epsilon; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pi", function() { return pi; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "halfPi", function() { return halfPi; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tau", function() { return tau; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "acos", function() { return acos; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asin", function() { return asin; });
var abs = Math.abs;
var atan2 = Math.atan2;
var cos = Math.cos;
var max = Math.max;
var min = Math.min;
var sin = Math.sin;
var sqrt = Math.sqrt;
var epsilon = 1e-12;
var pi = Math.PI;
var halfPi = pi / 2;
var tau = 2 * pi;
function acos(x) {
return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);
}
function asin(x) {
return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);
}
/***/ }),
/***/ "./node_modules/d3-shape/src/noop.js":
/*!*******************************************!*\
!*** ./node_modules/d3-shape/src/noop.js ***!
\*******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function() {});
/***/ }),
/***/ "./node_modules/d3-shape/src/offset/diverging.js":
/*!*******************************************************!*\
!*** ./node_modules/d3-shape/src/offset/diverging.js ***!
\*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(series, order) {
if (!((n = series.length) > 1)) return;
for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
for (yp = yn = 0, i = 0; i < n; ++i) {
if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
d[0] = yp, d[1] = yp += dy;
} else if (dy < 0) {
d[1] = yn, d[0] = yn += dy;
} else {
d[0] = yp;
}
}
}
});
/***/ }),
/***/ "./node_modules/d3-shape/src/offset/expand.js":
/*!****************************************************!*\
!*** ./node_modules/d3-shape/src/offset/expand.js ***!
\****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _none__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./none */ "./node_modules/d3-shape/src/offset/none.js");
/* harmony default export */ __webpack_exports__["default"] = (function(series, order) {
if (!((n = series.length) > 0)) return;
for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
}
Object(_none__WEBPACK_IMPORTED_MODULE_0__["default"])(series, order);
});
/***/ }),
/***/ "./node_modules/d3-shape/src/offset/none.js":
/*!**************************************************!*\
!*** ./node_modules/d3-shape/src/offset/none.js ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(series, order) {
if (!((n = series.length) > 1)) return;
for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
s0 = s1, s1 = series[order[i]];
for (j = 0; j < m; ++j) {
s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
}
}
});
/***/ }),
/***/ "./node_modules/d3-shape/src/offset/silhouette.js":
/*!********************************************************!*\
!*** ./node_modules/d3-shape/src/offset/silhouette.js ***!
\********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _none__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./none */ "./node_modules/d3-shape/src/offset/none.js");
/* harmony default export */ __webpack_exports__["default"] = (function(series, order) {
if (!((n = series.length) > 0)) return;
for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
s0[j][1] += s0[j][0] = -y / 2;
}
Object(_none__WEBPACK_IMPORTED_MODULE_0__["default"])(series, order);
});
/***/ }),
/***/ "./node_modules/d3-shape/src/offset/wiggle.js":
/*!****************************************************!*\
!*** ./node_modules/d3-shape/src/offset/wiggle.js ***!
\****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _none__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./none */ "./node_modules/d3-shape/src/offset/none.js");
/* harmony default export */ __webpack_exports__["default"] = (function(series, order) {
if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
var si = series[order[i]],
sij0 = si[j][1] || 0,
sij1 = si[j - 1][1] || 0,
s3 = (sij0 - sij1) / 2;
for (var k = 0; k < i; ++k) {
var sk = series[order[k]],
skj0 = sk[j][1] || 0,
skj1 = sk[j - 1][1] || 0;
s3 += skj0 - skj1;
}
s1 += sij0, s2 += s3 * sij0;
}
s0[j - 1][1] += s0[j - 1][0] = y;
if (s1) y -= s2 / s1;
}
s0[j - 1][1] += s0[j - 1][0] = y;
Object(_none__WEBPACK_IMPORTED_MODULE_0__["default"])(series, order);
});
/***/ }),
/***/ "./node_modules/d3-shape/src/order/appearance.js":
/*!*******************************************************!*\
!*** ./node_modules/d3-shape/src/order/appearance.js ***!
\*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _none__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./none */ "./node_modules/d3-shape/src/order/none.js");
/* harmony default export */ __webpack_exports__["default"] = (function(series) {
var peaks = series.map(peak);
return Object(_none__WEBPACK_IMPORTED_MODULE_0__["default"])(series).sort(function(a, b) { return peaks[a] - peaks[b]; });
});
function peak(series) {
var i = -1, j = 0, n = series.length, vi, vj = -Infinity;
while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i;
return j;
}
/***/ }),
/***/ "./node_modules/d3-shape/src/order/ascending.js":
/*!******************************************************!*\
!*** ./node_modules/d3-shape/src/order/ascending.js ***!
\******************************************************/
/*! exports provided: default, sum */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sum", function() { return sum; });
/* harmony import */ var _none__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./none */ "./node_modules/d3-shape/src/order/none.js");
/* harmony default export */ __webpack_exports__["default"] = (function(series) {
var sums = series.map(sum);
return Object(_none__WEBPACK_IMPORTED_MODULE_0__["default"])(series).sort(function(a, b) { return sums[a] - sums[b]; });
});
function sum(series) {
var s = 0, i = -1, n = series.length, v;
while (++i < n) if (v = +series[i][1]) s += v;
return s;
}
/***/ }),
/***/ "./node_modules/d3-shape/src/order/descending.js":
/*!*******************************************************!*\
!*** ./node_modules/d3-shape/src/order/descending.js ***!
\*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ascending */ "./node_modules/d3-shape/src/order/ascending.js");
/* harmony default export */ __webpack_exports__["default"] = (function(series) {
return Object(_ascending__WEBPACK_IMPORTED_MODULE_0__["default"])(series).reverse();
});
/***/ }),
/***/ "./node_modules/d3-shape/src/order/insideOut.js":
/*!******************************************************!*\
!*** ./node_modules/d3-shape/src/order/insideOut.js ***!
\******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _appearance__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./appearance */ "./node_modules/d3-shape/src/order/appearance.js");
/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ascending */ "./node_modules/d3-shape/src/order/ascending.js");
/* harmony default export */ __webpack_exports__["default"] = (function(series) {
var n = series.length,
i,
j,
sums = series.map(_ascending__WEBPACK_IMPORTED_MODULE_1__["sum"]),
order = Object(_appearance__WEBPACK_IMPORTED_MODULE_0__["default"])(series),
top = 0,
bottom = 0,
tops = [],
bottoms = [];
for (i = 0; i < n; ++i) {
j = order[i];
if (top < bottom) {
top += sums[j];
tops.push(j);
} else {
bottom += sums[j];
bottoms.push(j);
}
}
return bottoms.reverse().concat(tops);
});
/***/ }),
/***/ "./node_modules/d3-shape/src/order/none.js":
/*!*************************************************!*\
!*** ./node_modules/d3-shape/src/order/none.js ***!
\*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(series) {
var n = series.length, o = new Array(n);
while (--n >= 0) o[n] = n;
return o;
});
/***/ }),
/***/ "./node_modules/d3-shape/src/order/reverse.js":
/*!****************************************************!*\
!*** ./node_modules/d3-shape/src/order/reverse.js ***!
\****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _none__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./none */ "./node_modules/d3-shape/src/order/none.js");
/* harmony default export */ __webpack_exports__["default"] = (function(series) {
return Object(_none__WEBPACK_IMPORTED_MODULE_0__["default"])(series).reverse();
});
/***/ }),
/***/ "./node_modules/d3-shape/src/pie.js":
/*!******************************************!*\
!*** ./node_modules/d3-shape/src/pie.js ***!
\******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-shape/src/constant.js");
/* harmony import */ var _descending__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./descending */ "./node_modules/d3-shape/src/descending.js");
/* harmony import */ var _identity__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./identity */ "./node_modules/d3-shape/src/identity.js");
/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./math */ "./node_modules/d3-shape/src/math.js");
/* harmony default export */ __webpack_exports__["default"] = (function() {
var value = _identity__WEBPACK_IMPORTED_MODULE_2__["default"],
sortValues = _descending__WEBPACK_IMPORTED_MODULE_1__["default"],
sort = null,
startAngle = Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(0),
endAngle = Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(_math__WEBPACK_IMPORTED_MODULE_3__["tau"]),
padAngle = Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(0);
function pie(data) {
var i,
n = data.length,
j,
k,
sum = 0,
index = new Array(n),
arcs = new Array(n),
a0 = +startAngle.apply(this, arguments),
da = Math.min(_math__WEBPACK_IMPORTED_MODULE_3__["tau"], Math.max(-_math__WEBPACK_IMPORTED_MODULE_3__["tau"], endAngle.apply(this, arguments) - a0)),
a1,
p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
pa = p * (da < 0 ? -1 : 1),
v;
for (i = 0; i < n; ++i) {
if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
sum += v;
}
}
// Optionally sort the arcs by previously-computed values or by data.
if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
// Compute the arcs! They are stored in the original data's order.
for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
data: data[j],
index: i,
value: v,
startAngle: a0,
endAngle: a1,
padAngle: p
};
}
return arcs;
}
pie.value = function(_) {
return arguments.length ? (value = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), pie) : value;
};
pie.sortValues = function(_) {
return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
};
pie.sort = function(_) {
return arguments.length ? (sort = _, sortValues = null, pie) : sort;
};
pie.startAngle = function(_) {
return arguments.length ? (startAngle = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), pie) : startAngle;
};
pie.endAngle = function(_) {
return arguments.length ? (endAngle = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), pie) : endAngle;
};
pie.padAngle = function(_) {
return arguments.length ? (padAngle = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), pie) : padAngle;
};
return pie;
});
/***/ }),
/***/ "./node_modules/d3-shape/src/point.js":
/*!********************************************!*\
!*** ./node_modules/d3-shape/src/point.js ***!
\********************************************/
/*! exports provided: x, y */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "x", function() { return x; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "y", function() { return y; });
function x(p) {
return p[0];
}
function y(p) {
return p[1];
}
/***/ }),
/***/ "./node_modules/d3-shape/src/pointRadial.js":
/*!**************************************************!*\
!*** ./node_modules/d3-shape/src/pointRadial.js ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(x, y) {
return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
});
/***/ }),
/***/ "./node_modules/d3-shape/src/stack.js":
/*!********************************************!*\
!*** ./node_modules/d3-shape/src/stack.js ***!
\********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./array */ "./node_modules/d3-shape/src/array.js");
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-shape/src/constant.js");
/* harmony import */ var _offset_none__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./offset/none */ "./node_modules/d3-shape/src/offset/none.js");
/* harmony import */ var _order_none__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./order/none */ "./node_modules/d3-shape/src/order/none.js");
function stackValue(d, key) {
return d[key];
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
var keys = Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])([]),
order = _order_none__WEBPACK_IMPORTED_MODULE_3__["default"],
offset = _offset_none__WEBPACK_IMPORTED_MODULE_2__["default"],
value = stackValue;
function stack(data) {
var kz = keys.apply(this, arguments),
i,
m = data.length,
n = kz.length,
sz = new Array(n),
oz;
for (i = 0; i < n; ++i) {
for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
si[j] = sij = [0, +value(data[j], ki, j, data)];
sij.data = data[j];
}
si.key = ki;
}
for (i = 0, oz = order(sz); i < n; ++i) {
sz[oz[i]].index = i;
}
offset(sz, oz);
return sz;
}
stack.keys = function(_) {
return arguments.length ? (keys = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(_array__WEBPACK_IMPORTED_MODULE_0__["slice"].call(_)), stack) : keys;
};
stack.value = function(_) {
return arguments.length ? (value = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), stack) : value;
};
stack.order = function(_) {
return arguments.length ? (order = _ == null ? _order_none__WEBPACK_IMPORTED_MODULE_3__["default"] : typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(_array__WEBPACK_IMPORTED_MODULE_0__["slice"].call(_)), stack) : order;
};
stack.offset = function(_) {
return arguments.length ? (offset = _ == null ? _offset_none__WEBPACK_IMPORTED_MODULE_2__["default"] : _, stack) : offset;
};
return stack;
});
/***/ }),
/***/ "./node_modules/d3-shape/src/symbol.js":
/*!*********************************************!*\
!*** ./node_modules/d3-shape/src/symbol.js ***!
\*********************************************/
/*! exports provided: symbols, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "symbols", function() { return symbols; });
/* harmony import */ var d3_path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-path */ "./node_modules/d3-path/src/index.js");
/* harmony import */ var _symbol_circle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./symbol/circle */ "./node_modules/d3-shape/src/symbol/circle.js");
/* harmony import */ var _symbol_cross__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./symbol/cross */ "./node_modules/d3-shape/src/symbol/cross.js");
/* harmony import */ var _symbol_diamond__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./symbol/diamond */ "./node_modules/d3-shape/src/symbol/diamond.js");
/* harmony import */ var _symbol_star__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./symbol/star */ "./node_modules/d3-shape/src/symbol/star.js");
/* harmony import */ var _symbol_square__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./symbol/square */ "./node_modules/d3-shape/src/symbol/square.js");
/* harmony import */ var _symbol_triangle__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./symbol/triangle */ "./node_modules/d3-shape/src/symbol/triangle.js");
/* harmony import */ var _symbol_wye__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./symbol/wye */ "./node_modules/d3-shape/src/symbol/wye.js");
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-shape/src/constant.js");
var symbols = [
_symbol_circle__WEBPACK_IMPORTED_MODULE_1__["default"],
_symbol_cross__WEBPACK_IMPORTED_MODULE_2__["default"],
_symbol_diamond__WEBPACK_IMPORTED_MODULE_3__["default"],
_symbol_square__WEBPACK_IMPORTED_MODULE_5__["default"],
_symbol_star__WEBPACK_IMPORTED_MODULE_4__["default"],
_symbol_triangle__WEBPACK_IMPORTED_MODULE_6__["default"],
_symbol_wye__WEBPACK_IMPORTED_MODULE_7__["default"]
];
/* harmony default export */ __webpack_exports__["default"] = (function() {
var type = Object(_constant__WEBPACK_IMPORTED_MODULE_8__["default"])(_symbol_circle__WEBPACK_IMPORTED_MODULE_1__["default"]),
size = Object(_constant__WEBPACK_IMPORTED_MODULE_8__["default"])(64),
context = null;
function symbol() {
var buffer;
if (!context) context = buffer = Object(d3_path__WEBPACK_IMPORTED_MODULE_0__["path"])();
type.apply(this, arguments).draw(context, +size.apply(this, arguments));
if (buffer) return context = null, buffer + "" || null;
}
symbol.type = function(_) {
return arguments.length ? (type = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_8__["default"])(_), symbol) : type;
};
symbol.size = function(_) {
return arguments.length ? (size = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_8__["default"])(+_), symbol) : size;
};
symbol.context = function(_) {
return arguments.length ? (context = _ == null ? null : _, symbol) : context;
};
return symbol;
});
/***/ }),
/***/ "./node_modules/d3-shape/src/symbol/circle.js":
/*!****************************************************!*\
!*** ./node_modules/d3-shape/src/symbol/circle.js ***!
\****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ "./node_modules/d3-shape/src/math.js");
/* harmony default export */ __webpack_exports__["default"] = ({
draw: function(context, size) {
var r = Math.sqrt(size / _math__WEBPACK_IMPORTED_MODULE_0__["pi"]);
context.moveTo(r, 0);
context.arc(0, 0, r, 0, _math__WEBPACK_IMPORTED_MODULE_0__["tau"]);
}
});
/***/ }),
/***/ "./node_modules/d3-shape/src/symbol/cross.js":
/*!***************************************************!*\
!*** ./node_modules/d3-shape/src/symbol/cross.js ***!
\***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = ({
draw: function(context, size) {
var r = Math.sqrt(size / 5) / 2;
context.moveTo(-3 * r, -r);
context.lineTo(-r, -r);
context.lineTo(-r, -3 * r);
context.lineTo(r, -3 * r);
context.lineTo(r, -r);
context.lineTo(3 * r, -r);
context.lineTo(3 * r, r);
context.lineTo(r, r);
context.lineTo(r, 3 * r);
context.lineTo(-r, 3 * r);
context.lineTo(-r, r);
context.lineTo(-3 * r, r);
context.closePath();
}
});
/***/ }),
/***/ "./node_modules/d3-shape/src/symbol/diamond.js":
/*!*****************************************************!*\
!*** ./node_modules/d3-shape/src/symbol/diamond.js ***!
\*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
var tan30 = Math.sqrt(1 / 3),
tan30_2 = tan30 * 2;
/* harmony default export */ __webpack_exports__["default"] = ({
draw: function(context, size) {
var y = Math.sqrt(size / tan30_2),
x = y * tan30;
context.moveTo(0, -y);
context.lineTo(x, 0);
context.lineTo(0, y);
context.lineTo(-x, 0);
context.closePath();
}
});
/***/ }),
/***/ "./node_modules/d3-shape/src/symbol/square.js":
/*!****************************************************!*\
!*** ./node_modules/d3-shape/src/symbol/square.js ***!
\****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = ({
draw: function(context, size) {
var w = Math.sqrt(size),
x = -w / 2;
context.rect(x, x, w, w);
}
});
/***/ }),
/***/ "./node_modules/d3-shape/src/symbol/star.js":
/*!**************************************************!*\
!*** ./node_modules/d3-shape/src/symbol/star.js ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ "./node_modules/d3-shape/src/math.js");
var ka = 0.89081309152928522810,
kr = Math.sin(_math__WEBPACK_IMPORTED_MODULE_0__["pi"] / 10) / Math.sin(7 * _math__WEBPACK_IMPORTED_MODULE_0__["pi"] / 10),
kx = Math.sin(_math__WEBPACK_IMPORTED_MODULE_0__["tau"] / 10) * kr,
ky = -Math.cos(_math__WEBPACK_IMPORTED_MODULE_0__["tau"] / 10) * kr;
/* harmony default export */ __webpack_exports__["default"] = ({
draw: function(context, size) {
var r = Math.sqrt(size * ka),
x = kx * r,
y = ky * r;
context.moveTo(0, -r);
context.lineTo(x, y);
for (var i = 1; i < 5; ++i) {
var a = _math__WEBPACK_IMPORTED_MODULE_0__["tau"] * i / 5,
c = Math.cos(a),
s = Math.sin(a);
context.lineTo(s * r, -c * r);
context.lineTo(c * x - s * y, s * x + c * y);
}
context.closePath();
}
});
/***/ }),
/***/ "./node_modules/d3-shape/src/symbol/triangle.js":
/*!******************************************************!*\
!*** ./node_modules/d3-shape/src/symbol/triangle.js ***!
\******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
var sqrt3 = Math.sqrt(3);
/* harmony default export */ __webpack_exports__["default"] = ({
draw: function(context, size) {
var y = -Math.sqrt(size / (sqrt3 * 3));
context.moveTo(0, y * 2);
context.lineTo(-sqrt3 * y, -y);
context.lineTo(sqrt3 * y, -y);
context.closePath();
}
});
/***/ }),
/***/ "./node_modules/d3-shape/src/symbol/wye.js":
/*!*************************************************!*\
!*** ./node_modules/d3-shape/src/symbol/wye.js ***!
\*************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
var c = -0.5,
s = Math.sqrt(3) / 2,
k = 1 / Math.sqrt(12),
a = (k / 2 + 1) * 3;
/* harmony default export */ __webpack_exports__["default"] = ({
draw: function(context, size) {
var r = Math.sqrt(size / a),
x0 = r / 2,
y0 = r * k,
x1 = x0,
y1 = r * k + r,
x2 = -x1,
y2 = y1;
context.moveTo(x0, y0);
context.lineTo(x1, y1);
context.lineTo(x2, y2);
context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
context.closePath();
}
});
/***/ }),
/***/ "./node_modules/d3-timer/src/index.js":
/*!********************************************!*\
!*** ./node_modules/d3-timer/src/index.js ***!
\********************************************/
/*! exports provided: now, timer, timerFlush, timeout, interval */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _timer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./timer */ "./node_modules/d3-timer/src/timer.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "now", function() { return _timer__WEBPACK_IMPORTED_MODULE_0__["now"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return _timer__WEBPACK_IMPORTED_MODULE_0__["timer"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timerFlush", function() { return _timer__WEBPACK_IMPORTED_MODULE_0__["timerFlush"]; });
/* harmony import */ var _timeout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./timeout */ "./node_modules/d3-timer/src/timeout.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return _timeout__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/* harmony import */ var _interval__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./interval */ "./node_modules/d3-timer/src/interval.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return _interval__WEBPACK_IMPORTED_MODULE_2__["default"]; });
/***/ }),
/***/ "./node_modules/d3-timer/src/interval.js":
/*!***********************************************!*\
!*** ./node_modules/d3-timer/src/interval.js ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _timer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./timer */ "./node_modules/d3-timer/src/timer.js");
/* harmony default export */ __webpack_exports__["default"] = (function(callback, delay, time) {
var t = new _timer__WEBPACK_IMPORTED_MODULE_0__["Timer"], total = delay;
if (delay == null) return t.restart(callback, delay, time), t;
delay = +delay, time = time == null ? Object(_timer__WEBPACK_IMPORTED_MODULE_0__["now"])() : +time;
t.restart(function tick(elapsed) {
elapsed += total;
t.restart(tick, total += delay, time);
callback(elapsed);
}, delay, time);
return t;
});
/***/ }),
/***/ "./node_modules/d3-timer/src/timeout.js":
/*!**********************************************!*\
!*** ./node_modules/d3-timer/src/timeout.js ***!
\**********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _timer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./timer */ "./node_modules/d3-timer/src/timer.js");
/* harmony default export */ __webpack_exports__["default"] = (function(callback, delay, time) {
var t = new _timer__WEBPACK_IMPORTED_MODULE_0__["Timer"];
delay = delay == null ? 0 : +delay;
t.restart(function(elapsed) {
t.stop();
callback(elapsed + delay);
}, delay, time);
return t;
});
/***/ }),
/***/ "./node_modules/d3-timer/src/timer.js":
/*!********************************************!*\
!*** ./node_modules/d3-timer/src/timer.js ***!
\********************************************/
/*! exports provided: now, Timer, timer, timerFlush */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "now", function() { return now; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Timer", function() { return Timer; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return timer; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timerFlush", function() { return timerFlush; });
var frame = 0, // is an animation frame pending?
timeout = 0, // is a timeout pending?
interval = 0, // are any timers active?
pokeDelay = 1000, // how frequently we check for clock skew
taskHead,
taskTail,
clockLast = 0,
clockNow = 0,
clockSkew = 0,
clock = typeof performance === "object" && performance.now ? performance : Date,
setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
function now() {
return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
}
function clearNow() {
clockNow = 0;
}
function Timer() {
this._call =
this._time =
this._next = null;
}
Timer.prototype = timer.prototype = {
constructor: Timer,
restart: function(callback, delay, time) {
if (typeof callback !== "function") throw new TypeError("callback is not a function");
time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
if (!this._next && taskTail !== this) {
if (taskTail) taskTail._next = this;
else taskHead = this;
taskTail = this;
}
this._call = callback;
this._time = time;
sleep();
},
stop: function() {
if (this._call) {
this._call = null;
this._time = Infinity;
sleep();
}
}
};
function timer(callback, delay, time) {
var t = new Timer;
t.restart(callback, delay, time);
return t;
}
function timerFlush() {
now(); // Get the current time, if not already set.
++frame; // Pretend weve set an alarm, if we havent already.
var t = taskHead, e;
while (t) {
if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
t = t._next;
}
--frame;
}
function wake() {
clockNow = (clockLast = clock.now()) + clockSkew;
frame = timeout = 0;
try {
timerFlush();
} finally {
frame = 0;
nap();
clockNow = 0;
}
}
function poke() {
var now = clock.now(), delay = now - clockLast;
if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
}
function nap() {
var t0, t1 = taskHead, t2, time = Infinity;
while (t1) {
if (t1._call) {
if (time > t1._time) time = t1._time;
t0 = t1, t1 = t1._next;
} else {
t2 = t1._next, t1._next = null;
t1 = t0 ? t0._next = t2 : taskHead = t2;
}
}
taskTail = t0;
sleep(time);
}
function sleep(time) {
if (frame) return; // Soonest alarm already set, or will be.
if (timeout) timeout = clearTimeout(timeout);
var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
if (delay > 24) {
if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
if (interval) interval = clearInterval(interval);
} else {
if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
frame = 1, setFrame(wake);
}
}
/***/ }),
/***/ "./node_modules/d3-transition/src/active.js":
/*!**************************************************!*\
!*** ./node_modules/d3-transition/src/active.js ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _transition_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./transition/index */ "./node_modules/d3-transition/src/transition/index.js");
/* harmony import */ var _transition_schedule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./transition/schedule */ "./node_modules/d3-transition/src/transition/schedule.js");
var root = [null];
/* harmony default export */ __webpack_exports__["default"] = (function(node, name) {
var schedules = node.__transition,
schedule,
i;
if (schedules) {
name = name == null ? null : name + "";
for (i in schedules) {
if ((schedule = schedules[i]).state > _transition_schedule__WEBPACK_IMPORTED_MODULE_1__["SCHEDULED"] && schedule.name === name) {
return new _transition_index__WEBPACK_IMPORTED_MODULE_0__["Transition"]([[node]], root, name, +i);
}
}
}
return null;
});
/***/ }),
/***/ "./node_modules/d3-transition/src/index.js":
/*!*************************************************!*\
!*** ./node_modules/d3-transition/src/index.js ***!
\*************************************************/
/*! exports provided: transition, active, interrupt */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _selection_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./selection/index */ "./node_modules/d3-transition/src/selection/index.js");
/* harmony import */ var _transition_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./transition/index */ "./node_modules/d3-transition/src/transition/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "transition", function() { return _transition_index__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/* harmony import */ var _active__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./active */ "./node_modules/d3-transition/src/active.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "active", function() { return _active__WEBPACK_IMPORTED_MODULE_2__["default"]; });
/* harmony import */ var _interrupt__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./interrupt */ "./node_modules/d3-transition/src/interrupt.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interrupt", function() { return _interrupt__WEBPACK_IMPORTED_MODULE_3__["default"]; });
/***/ }),
/***/ "./node_modules/d3-transition/src/interrupt.js":
/*!*****************************************************!*\
!*** ./node_modules/d3-transition/src/interrupt.js ***!
\*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _transition_schedule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./transition/schedule */ "./node_modules/d3-transition/src/transition/schedule.js");
/* harmony default export */ __webpack_exports__["default"] = (function(node, name) {
var schedules = node.__transition,
schedule,
active,
empty = true,
i;
if (!schedules) return;
name = name == null ? null : name + "";
for (i in schedules) {
if ((schedule = schedules[i]).name !== name) { empty = false; continue; }
active = schedule.state > _transition_schedule__WEBPACK_IMPORTED_MODULE_0__["STARTING"] && schedule.state < _transition_schedule__WEBPACK_IMPORTED_MODULE_0__["ENDING"];
schedule.state = _transition_schedule__WEBPACK_IMPORTED_MODULE_0__["ENDED"];
schedule.timer.stop();
if (active) schedule.on.call("interrupt", node, node.__data__, schedule.index, schedule.group);
delete schedules[i];
}
if (empty) delete node.__transition;
});
/***/ }),
/***/ "./node_modules/d3-transition/src/selection/index.js":
/*!***********************************************************!*\
!*** ./node_modules/d3-transition/src/selection/index.js ***!
\***********************************************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
/* harmony import */ var _interrupt__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./interrupt */ "./node_modules/d3-transition/src/selection/interrupt.js");
/* harmony import */ var _transition__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./transition */ "./node_modules/d3-transition/src/selection/transition.js");
d3_selection__WEBPACK_IMPORTED_MODULE_0__["selection"].prototype.interrupt = _interrupt__WEBPACK_IMPORTED_MODULE_1__["default"];
d3_selection__WEBPACK_IMPORTED_MODULE_0__["selection"].prototype.transition = _transition__WEBPACK_IMPORTED_MODULE_2__["default"];
/***/ }),
/***/ "./node_modules/d3-transition/src/selection/interrupt.js":
/*!***************************************************************!*\
!*** ./node_modules/d3-transition/src/selection/interrupt.js ***!
\***************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _interrupt__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../interrupt */ "./node_modules/d3-transition/src/interrupt.js");
/* harmony default export */ __webpack_exports__["default"] = (function(name) {
return this.each(function() {
Object(_interrupt__WEBPACK_IMPORTED_MODULE_0__["default"])(this, name);
});
});
/***/ }),
/***/ "./node_modules/d3-transition/src/selection/transition.js":
/*!****************************************************************!*\
!*** ./node_modules/d3-transition/src/selection/transition.js ***!
\****************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _transition_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../transition/index */ "./node_modules/d3-transition/src/transition/index.js");
/* harmony import */ var _transition_schedule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../transition/schedule */ "./node_modules/d3-transition/src/transition/schedule.js");
/* harmony import */ var d3_ease__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-ease */ "./node_modules/d3-ease/src/index.js");
/* harmony import */ var d3_timer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! d3-timer */ "./node_modules/d3-timer/src/index.js");
var defaultTiming = {
time: null, // Set on use.
delay: 0,
duration: 250,
ease: d3_ease__WEBPACK_IMPORTED_MODULE_2__["easeCubicInOut"]
};
function inherit(node, id) {
var timing;
while (!(timing = node.__transition) || !(timing = timing[id])) {
if (!(node = node.parentNode)) {
return defaultTiming.time = Object(d3_timer__WEBPACK_IMPORTED_MODULE_3__["now"])(), defaultTiming;
}
}
return timing;
}
/* harmony default export */ __webpack_exports__["default"] = (function(name) {
var id,
timing;
if (name instanceof _transition_index__WEBPACK_IMPORTED_MODULE_0__["Transition"]) {
id = name._id, name = name._name;
} else {
id = Object(_transition_index__WEBPACK_IMPORTED_MODULE_0__["newId"])(), (timing = defaultTiming).time = Object(d3_timer__WEBPACK_IMPORTED_MODULE_3__["now"])(), name = name == null ? null : name + "";
}
for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
Object(_transition_schedule__WEBPACK_IMPORTED_MODULE_1__["default"])(node, name, id, i, group, timing || inherit(node, id));
}
}
}
return new _transition_index__WEBPACK_IMPORTED_MODULE_0__["Transition"](groups, this._parents, name, id);
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/attr.js":
/*!***********************************************************!*\
!*** ./node_modules/d3-transition/src/transition/attr.js ***!
\***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_interpolate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-interpolate */ "./node_modules/d3-interpolate/src/index.js");
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
/* harmony import */ var _tween__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tween */ "./node_modules/d3-transition/src/transition/tween.js");
/* harmony import */ var _interpolate__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./interpolate */ "./node_modules/d3-transition/src/transition/interpolate.js");
function attrRemove(name) {
return function() {
this.removeAttribute(name);
};
}
function attrRemoveNS(fullname) {
return function() {
this.removeAttributeNS(fullname.space, fullname.local);
};
}
function attrConstant(name, interpolate, value1) {
var value00,
interpolate0;
return function() {
var value0 = this.getAttribute(name);
return value0 === value1 ? null
: value0 === value00 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value1);
};
}
function attrConstantNS(fullname, interpolate, value1) {
var value00,
interpolate0;
return function() {
var value0 = this.getAttributeNS(fullname.space, fullname.local);
return value0 === value1 ? null
: value0 === value00 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value1);
};
}
function attrFunction(name, interpolate, value) {
var value00,
value10,
interpolate0;
return function() {
var value0, value1 = value(this);
if (value1 == null) return void this.removeAttribute(name);
value0 = this.getAttribute(name);
return value0 === value1 ? null
: value0 === value00 && value1 === value10 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value10 = value1);
};
}
function attrFunctionNS(fullname, interpolate, value) {
var value00,
value10,
interpolate0;
return function() {
var value0, value1 = value(this);
if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
value0 = this.getAttributeNS(fullname.space, fullname.local);
return value0 === value1 ? null
: value0 === value00 && value1 === value10 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value10 = value1);
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(name, value) {
var fullname = Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["namespace"])(name), i = fullname === "transform" ? d3_interpolate__WEBPACK_IMPORTED_MODULE_0__["interpolateTransformSvg"] : _interpolate__WEBPACK_IMPORTED_MODULE_3__["default"];
return this.attrTween(name, typeof value === "function"
? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, Object(_tween__WEBPACK_IMPORTED_MODULE_2__["tweenValue"])(this, "attr." + name, value))
: value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)
: (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value + ""));
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/attrTween.js":
/*!****************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/attrTween.js ***!
\****************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
function attrTweenNS(fullname, value) {
function tween() {
var node = this, i = value.apply(node, arguments);
return i && function(t) {
node.setAttributeNS(fullname.space, fullname.local, i(t));
};
}
tween._value = value;
return tween;
}
function attrTween(name, value) {
function tween() {
var node = this, i = value.apply(node, arguments);
return i && function(t) {
node.setAttribute(name, i(t));
};
}
tween._value = value;
return tween;
}
/* harmony default export */ __webpack_exports__["default"] = (function(name, value) {
var key = "attr." + name;
if (arguments.length < 2) return (key = this.tween(key)) && key._value;
if (value == null) return this.tween(key, null);
if (typeof value !== "function") throw new Error;
var fullname = Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["namespace"])(name);
return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/delay.js":
/*!************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/delay.js ***!
\************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _schedule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./schedule */ "./node_modules/d3-transition/src/transition/schedule.js");
function delayFunction(id, value) {
return function() {
Object(_schedule__WEBPACK_IMPORTED_MODULE_0__["init"])(this, id).delay = +value.apply(this, arguments);
};
}
function delayConstant(id, value) {
return value = +value, function() {
Object(_schedule__WEBPACK_IMPORTED_MODULE_0__["init"])(this, id).delay = value;
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(value) {
var id = this._id;
return arguments.length
? this.each((typeof value === "function"
? delayFunction
: delayConstant)(id, value))
: Object(_schedule__WEBPACK_IMPORTED_MODULE_0__["get"])(this.node(), id).delay;
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/duration.js":
/*!***************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/duration.js ***!
\***************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _schedule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./schedule */ "./node_modules/d3-transition/src/transition/schedule.js");
function durationFunction(id, value) {
return function() {
Object(_schedule__WEBPACK_IMPORTED_MODULE_0__["set"])(this, id).duration = +value.apply(this, arguments);
};
}
function durationConstant(id, value) {
return value = +value, function() {
Object(_schedule__WEBPACK_IMPORTED_MODULE_0__["set"])(this, id).duration = value;
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(value) {
var id = this._id;
return arguments.length
? this.each((typeof value === "function"
? durationFunction
: durationConstant)(id, value))
: Object(_schedule__WEBPACK_IMPORTED_MODULE_0__["get"])(this.node(), id).duration;
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/ease.js":
/*!***********************************************************!*\
!*** ./node_modules/d3-transition/src/transition/ease.js ***!
\***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _schedule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./schedule */ "./node_modules/d3-transition/src/transition/schedule.js");
function easeConstant(id, value) {
if (typeof value !== "function") throw new Error;
return function() {
Object(_schedule__WEBPACK_IMPORTED_MODULE_0__["set"])(this, id).ease = value;
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(value) {
var id = this._id;
return arguments.length
? this.each(easeConstant(id, value))
: Object(_schedule__WEBPACK_IMPORTED_MODULE_0__["get"])(this.node(), id).ease;
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/filter.js":
/*!*************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/filter.js ***!
\*************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index */ "./node_modules/d3-transition/src/transition/index.js");
/* harmony default export */ __webpack_exports__["default"] = (function(match) {
if (typeof match !== "function") match = Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["matcher"])(match);
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
subgroup.push(node);
}
}
}
return new _index__WEBPACK_IMPORTED_MODULE_1__["Transition"](subgroups, this._parents, this._name, this._id);
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/index.js":
/*!************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/index.js ***!
\************************************************************/
/*! exports provided: Transition, default, newId */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Transition", function() { return Transition; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return transition; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "newId", function() { return newId; });
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
/* harmony import */ var _attr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./attr */ "./node_modules/d3-transition/src/transition/attr.js");
/* harmony import */ var _attrTween__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./attrTween */ "./node_modules/d3-transition/src/transition/attrTween.js");
/* harmony import */ var _delay__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./delay */ "./node_modules/d3-transition/src/transition/delay.js");
/* harmony import */ var _duration__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./duration */ "./node_modules/d3-transition/src/transition/duration.js");
/* harmony import */ var _ease__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ease */ "./node_modules/d3-transition/src/transition/ease.js");
/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./filter */ "./node_modules/d3-transition/src/transition/filter.js");
/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./merge */ "./node_modules/d3-transition/src/transition/merge.js");
/* harmony import */ var _on__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./on */ "./node_modules/d3-transition/src/transition/on.js");
/* harmony import */ var _remove__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./remove */ "./node_modules/d3-transition/src/transition/remove.js");
/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./select */ "./node_modules/d3-transition/src/transition/select.js");
/* harmony import */ var _selectAll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./selectAll */ "./node_modules/d3-transition/src/transition/selectAll.js");
/* harmony import */ var _selection__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./selection */ "./node_modules/d3-transition/src/transition/selection.js");
/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./style */ "./node_modules/d3-transition/src/transition/style.js");
/* harmony import */ var _styleTween__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./styleTween */ "./node_modules/d3-transition/src/transition/styleTween.js");
/* harmony import */ var _text__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./text */ "./node_modules/d3-transition/src/transition/text.js");
/* harmony import */ var _transition__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./transition */ "./node_modules/d3-transition/src/transition/transition.js");
/* harmony import */ var _tween__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./tween */ "./node_modules/d3-transition/src/transition/tween.js");
var id = 0;
function Transition(groups, parents, name, id) {
this._groups = groups;
this._parents = parents;
this._name = name;
this._id = id;
}
function transition(name) {
return Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["selection"])().transition(name);
}
function newId() {
return ++id;
}
var selection_prototype = d3_selection__WEBPACK_IMPORTED_MODULE_0__["selection"].prototype;
Transition.prototype = transition.prototype = {
constructor: Transition,
select: _select__WEBPACK_IMPORTED_MODULE_10__["default"],
selectAll: _selectAll__WEBPACK_IMPORTED_MODULE_11__["default"],
filter: _filter__WEBPACK_IMPORTED_MODULE_6__["default"],
merge: _merge__WEBPACK_IMPORTED_MODULE_7__["default"],
selection: _selection__WEBPACK_IMPORTED_MODULE_12__["default"],
transition: _transition__WEBPACK_IMPORTED_MODULE_16__["default"],
call: selection_prototype.call,
nodes: selection_prototype.nodes,
node: selection_prototype.node,
size: selection_prototype.size,
empty: selection_prototype.empty,
each: selection_prototype.each,
on: _on__WEBPACK_IMPORTED_MODULE_8__["default"],
attr: _attr__WEBPACK_IMPORTED_MODULE_1__["default"],
attrTween: _attrTween__WEBPACK_IMPORTED_MODULE_2__["default"],
style: _style__WEBPACK_IMPORTED_MODULE_13__["default"],
styleTween: _styleTween__WEBPACK_IMPORTED_MODULE_14__["default"],
text: _text__WEBPACK_IMPORTED_MODULE_15__["default"],
remove: _remove__WEBPACK_IMPORTED_MODULE_9__["default"],
tween: _tween__WEBPACK_IMPORTED_MODULE_17__["default"],
delay: _delay__WEBPACK_IMPORTED_MODULE_3__["default"],
duration: _duration__WEBPACK_IMPORTED_MODULE_4__["default"],
ease: _ease__WEBPACK_IMPORTED_MODULE_5__["default"]
};
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/interpolate.js":
/*!******************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/interpolate.js ***!
\******************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
/* harmony import */ var d3_interpolate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-interpolate */ "./node_modules/d3-interpolate/src/index.js");
/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
var c;
return (typeof b === "number" ? d3_interpolate__WEBPACK_IMPORTED_MODULE_1__["interpolateNumber"]
: b instanceof d3_color__WEBPACK_IMPORTED_MODULE_0__["color"] ? d3_interpolate__WEBPACK_IMPORTED_MODULE_1__["interpolateRgb"]
: (c = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["color"])(b)) ? (b = c, d3_interpolate__WEBPACK_IMPORTED_MODULE_1__["interpolateRgb"])
: d3_interpolate__WEBPACK_IMPORTED_MODULE_1__["interpolateString"])(a, b);
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/merge.js":
/*!************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/merge.js ***!
\************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./node_modules/d3-transition/src/transition/index.js");
/* harmony default export */ __webpack_exports__["default"] = (function(transition) {
if (transition._id !== this._id) throw new Error;
for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
if (node = group0[i] || group1[i]) {
merge[i] = node;
}
}
}
for (; j < m0; ++j) {
merges[j] = groups0[j];
}
return new _index__WEBPACK_IMPORTED_MODULE_0__["Transition"](merges, this._parents, this._name, this._id);
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/on.js":
/*!*********************************************************!*\
!*** ./node_modules/d3-transition/src/transition/on.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _schedule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./schedule */ "./node_modules/d3-transition/src/transition/schedule.js");
function start(name) {
return (name + "").trim().split(/^|\s+/).every(function(t) {
var i = t.indexOf(".");
if (i >= 0) t = t.slice(0, i);
return !t || t === "start";
});
}
function onFunction(id, name, listener) {
var on0, on1, sit = start(name) ? _schedule__WEBPACK_IMPORTED_MODULE_0__["init"] : _schedule__WEBPACK_IMPORTED_MODULE_0__["set"];
return function() {
var schedule = sit(this, id),
on = schedule.on;
// If this node shared a dispatch with the previous node,
// just assign the updated shared dispatch and were done!
// Otherwise, copy-on-write.
if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
schedule.on = on1;
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(name, listener) {
var id = this._id;
return arguments.length < 2
? Object(_schedule__WEBPACK_IMPORTED_MODULE_0__["get"])(this.node(), id).on.on(name)
: this.each(onFunction(id, name, listener));
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/remove.js":
/*!*************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/remove.js ***!
\*************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function removeFunction(id) {
return function() {
var parent = this.parentNode;
for (var i in this.__transition) if (+i !== id) return;
if (parent) parent.removeChild(this);
};
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
return this.on("end.remove", removeFunction(this._id));
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/schedule.js":
/*!***************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/schedule.js ***!
\***************************************************************/
/*! exports provided: CREATED, SCHEDULED, STARTING, STARTED, RUNNING, ENDING, ENDED, default, init, set, get */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CREATED", function() { return CREATED; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SCHEDULED", function() { return SCHEDULED; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "STARTING", function() { return STARTING; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "STARTED", function() { return STARTED; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RUNNING", function() { return RUNNING; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ENDING", function() { return ENDING; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ENDED", function() { return ENDED; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "init", function() { return init; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "set", function() { return set; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "get", function() { return get; });
/* harmony import */ var d3_dispatch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-dispatch */ "./node_modules/d3-dispatch/src/index.js");
/* harmony import */ var d3_timer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-timer */ "./node_modules/d3-timer/src/index.js");
var emptyOn = Object(d3_dispatch__WEBPACK_IMPORTED_MODULE_0__["dispatch"])("start", "end", "interrupt");
var emptyTween = [];
var CREATED = 0;
var SCHEDULED = 1;
var STARTING = 2;
var STARTED = 3;
var RUNNING = 4;
var ENDING = 5;
var ENDED = 6;
/* harmony default export */ __webpack_exports__["default"] = (function(node, name, id, index, group, timing) {
var schedules = node.__transition;
if (!schedules) node.__transition = {};
else if (id in schedules) return;
create(node, id, {
name: name,
index: index, // For context during callback.
group: group, // For context during callback.
on: emptyOn,
tween: emptyTween,
time: timing.time,
delay: timing.delay,
duration: timing.duration,
ease: timing.ease,
timer: null,
state: CREATED
});
});
function init(node, id) {
var schedule = get(node, id);
if (schedule.state > CREATED) throw new Error("too late; already scheduled");
return schedule;
}
function set(node, id) {
var schedule = get(node, id);
if (schedule.state > STARTING) throw new Error("too late; already started");
return schedule;
}
function get(node, id) {
var schedule = node.__transition;
if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
return schedule;
}
function create(node, id, self) {
var schedules = node.__transition,
tween;
// Initialize the self timer when the transition is created.
// Note the actual delay is not known until the first callback!
schedules[id] = self;
self.timer = Object(d3_timer__WEBPACK_IMPORTED_MODULE_1__["timer"])(schedule, 0, self.time);
function schedule(elapsed) {
self.state = SCHEDULED;
self.timer.restart(start, self.delay, self.time);
// If the elapsed delay is less than our first sleep, start immediately.
if (self.delay <= elapsed) start(elapsed - self.delay);
}
function start(elapsed) {
var i, j, n, o;
// If the state is not SCHEDULED, then we previously errored on start.
if (self.state !== SCHEDULED) return stop();
for (i in schedules) {
o = schedules[i];
if (o.name !== self.name) continue;
// While this element already has a starting transition during this frame,
// defer starting an interrupting transition until that transition has a
// chance to tick (and possibly end); see d3/d3-transition#54!
if (o.state === STARTED) return Object(d3_timer__WEBPACK_IMPORTED_MODULE_1__["timeout"])(start);
// Interrupt the active transition, if any.
// Dispatch the interrupt event.
if (o.state === RUNNING) {
o.state = ENDED;
o.timer.stop();
o.on.call("interrupt", node, node.__data__, o.index, o.group);
delete schedules[i];
}
// Cancel any pre-empted transitions. No interrupt event is dispatched
// because the cancelled transitions never started. Note that this also
// removes this transition from the pending list!
else if (+i < id) {
o.state = ENDED;
o.timer.stop();
delete schedules[i];
}
}
// Defer the first tick to end of the current frame; see d3/d3#1576.
// Note the transition may be canceled after start and before the first tick!
// Note this must be scheduled before the start event; see d3/d3-transition#16!
// Assuming this is successful, subsequent callbacks go straight to tick.
Object(d3_timer__WEBPACK_IMPORTED_MODULE_1__["timeout"])(function() {
if (self.state === STARTED) {
self.state = RUNNING;
self.timer.restart(tick, self.delay, self.time);
tick(elapsed);
}
});
// Dispatch the start event.
// Note this must be done before the tween are initialized.
self.state = STARTING;
self.on.call("start", node, node.__data__, self.index, self.group);
if (self.state !== STARTING) return; // interrupted
self.state = STARTED;
// Initialize the tween, deleting null tween.
tween = new Array(n = self.tween.length);
for (i = 0, j = -1; i < n; ++i) {
if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
tween[++j] = o;
}
}
tween.length = j + 1;
}
function tick(elapsed) {
var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
i = -1,
n = tween.length;
while (++i < n) {
tween[i].call(null, t);
}
// Dispatch the end event.
if (self.state === ENDING) {
self.on.call("end", node, node.__data__, self.index, self.group);
stop();
}
}
function stop() {
self.state = ENDED;
self.timer.stop();
delete schedules[id];
for (var i in schedules) return; // eslint-disable-line no-unused-vars
delete node.__transition;
}
}
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/select.js":
/*!*************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/select.js ***!
\*************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index */ "./node_modules/d3-transition/src/transition/index.js");
/* harmony import */ var _schedule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./schedule */ "./node_modules/d3-transition/src/transition/schedule.js");
/* harmony default export */ __webpack_exports__["default"] = (function(select) {
var name = this._name,
id = this._id;
if (typeof select !== "function") select = Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["selector"])(select);
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
if ("__data__" in node) subnode.__data__ = node.__data__;
subgroup[i] = subnode;
Object(_schedule__WEBPACK_IMPORTED_MODULE_2__["default"])(subgroup[i], name, id, i, subgroup, Object(_schedule__WEBPACK_IMPORTED_MODULE_2__["get"])(node, id));
}
}
}
return new _index__WEBPACK_IMPORTED_MODULE_1__["Transition"](subgroups, this._parents, name, id);
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/selectAll.js":
/*!****************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/selectAll.js ***!
\****************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index */ "./node_modules/d3-transition/src/transition/index.js");
/* harmony import */ var _schedule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./schedule */ "./node_modules/d3-transition/src/transition/schedule.js");
/* harmony default export */ __webpack_exports__["default"] = (function(select) {
var name = this._name,
id = this._id;
if (typeof select !== "function") select = Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["selectorAll"])(select);
for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
for (var children = select.call(node, node.__data__, i, group), child, inherit = Object(_schedule__WEBPACK_IMPORTED_MODULE_2__["get"])(node, id), k = 0, l = children.length; k < l; ++k) {
if (child = children[k]) {
Object(_schedule__WEBPACK_IMPORTED_MODULE_2__["default"])(child, name, id, k, children, inherit);
}
}
subgroups.push(children);
parents.push(node);
}
}
}
return new _index__WEBPACK_IMPORTED_MODULE_1__["Transition"](subgroups, parents, name, id);
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/selection.js":
/*!****************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/selection.js ***!
\****************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
var Selection = d3_selection__WEBPACK_IMPORTED_MODULE_0__["selection"].prototype.constructor;
/* harmony default export */ __webpack_exports__["default"] = (function() {
return new Selection(this._groups, this._parents);
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/style.js":
/*!************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/style.js ***!
\************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_interpolate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-interpolate */ "./node_modules/d3-interpolate/src/index.js");
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
/* harmony import */ var _tween__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tween */ "./node_modules/d3-transition/src/transition/tween.js");
/* harmony import */ var _interpolate__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./interpolate */ "./node_modules/d3-transition/src/transition/interpolate.js");
function styleRemove(name, interpolate) {
var value00,
value10,
interpolate0;
return function() {
var value0 = Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["style"])(this, name),
value1 = (this.style.removeProperty(name), Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["style"])(this, name));
return value0 === value1 ? null
: value0 === value00 && value1 === value10 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value10 = value1);
};
}
function styleRemoveEnd(name) {
return function() {
this.style.removeProperty(name);
};
}
function styleConstant(name, interpolate, value1) {
var value00,
interpolate0;
return function() {
var value0 = Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["style"])(this, name);
return value0 === value1 ? null
: value0 === value00 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value1);
};
}
function styleFunction(name, interpolate, value) {
var value00,
value10,
interpolate0;
return function() {
var value0 = Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["style"])(this, name),
value1 = value(this);
if (value1 == null) value1 = (this.style.removeProperty(name), Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["style"])(this, name));
return value0 === value1 ? null
: value0 === value00 && value1 === value10 ? interpolate0
: interpolate0 = interpolate(value00 = value0, value10 = value1);
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(name, value, priority) {
var i = (name += "") === "transform" ? d3_interpolate__WEBPACK_IMPORTED_MODULE_0__["interpolateTransformCss"] : _interpolate__WEBPACK_IMPORTED_MODULE_3__["default"];
return value == null ? this
.styleTween(name, styleRemove(name, i))
.on("end.style." + name, styleRemoveEnd(name))
: this.styleTween(name, typeof value === "function"
? styleFunction(name, i, Object(_tween__WEBPACK_IMPORTED_MODULE_2__["tweenValue"])(this, "style." + name, value))
: styleConstant(name, i, value + ""), priority);
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/styleTween.js":
/*!*****************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/styleTween.js ***!
\*****************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function styleTween(name, value, priority) {
function tween() {
var node = this, i = value.apply(node, arguments);
return i && function(t) {
node.style.setProperty(name, i(t), priority);
};
}
tween._value = value;
return tween;
}
/* harmony default export */ __webpack_exports__["default"] = (function(name, value, priority) {
var key = "style." + (name += "");
if (arguments.length < 2) return (key = this.tween(key)) && key._value;
if (value == null) return this.tween(key, null);
if (typeof value !== "function") throw new Error;
return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/text.js":
/*!***********************************************************!*\
!*** ./node_modules/d3-transition/src/transition/text.js ***!
\***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _tween__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tween */ "./node_modules/d3-transition/src/transition/tween.js");
function textConstant(value) {
return function() {
this.textContent = value;
};
}
function textFunction(value) {
return function() {
var value1 = value(this);
this.textContent = value1 == null ? "" : value1;
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(value) {
return this.tween("text", typeof value === "function"
? textFunction(Object(_tween__WEBPACK_IMPORTED_MODULE_0__["tweenValue"])(this, "text", value))
: textConstant(value == null ? "" : value + ""));
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/transition.js":
/*!*****************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/transition.js ***!
\*****************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./node_modules/d3-transition/src/transition/index.js");
/* harmony import */ var _schedule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./schedule */ "./node_modules/d3-transition/src/transition/schedule.js");
/* harmony default export */ __webpack_exports__["default"] = (function() {
var name = this._name,
id0 = this._id,
id1 = Object(_index__WEBPACK_IMPORTED_MODULE_0__["newId"])();
for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
if (node = group[i]) {
var inherit = Object(_schedule__WEBPACK_IMPORTED_MODULE_1__["get"])(node, id0);
Object(_schedule__WEBPACK_IMPORTED_MODULE_1__["default"])(node, name, id1, i, group, {
time: inherit.time + inherit.delay + inherit.duration,
delay: 0,
duration: inherit.duration,
ease: inherit.ease
});
}
}
}
return new _index__WEBPACK_IMPORTED_MODULE_0__["Transition"](groups, this._parents, name, id1);
});
/***/ }),
/***/ "./node_modules/d3-transition/src/transition/tween.js":
/*!************************************************************!*\
!*** ./node_modules/d3-transition/src/transition/tween.js ***!
\************************************************************/
/*! exports provided: default, tweenValue */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tweenValue", function() { return tweenValue; });
/* harmony import */ var _schedule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./schedule */ "./node_modules/d3-transition/src/transition/schedule.js");
function tweenRemove(id, name) {
var tween0, tween1;
return function() {
var schedule = Object(_schedule__WEBPACK_IMPORTED_MODULE_0__["set"])(this, id),
tween = schedule.tween;
// If this node shared tween with the previous node,
// just assign the updated shared tween and were done!
// Otherwise, copy-on-write.
if (tween !== tween0) {
tween1 = tween0 = tween;
for (var i = 0, n = tween1.length; i < n; ++i) {
if (tween1[i].name === name) {
tween1 = tween1.slice();
tween1.splice(i, 1);
break;
}
}
}
schedule.tween = tween1;
};
}
function tweenFunction(id, name, value) {
var tween0, tween1;
if (typeof value !== "function") throw new Error;
return function() {
var schedule = Object(_schedule__WEBPACK_IMPORTED_MODULE_0__["set"])(this, id),
tween = schedule.tween;
// If this node shared tween with the previous node,
// just assign the updated shared tween and were done!
// Otherwise, copy-on-write.
if (tween !== tween0) {
tween1 = (tween0 = tween).slice();
for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
if (tween1[i].name === name) {
tween1[i] = t;
break;
}
}
if (i === n) tween1.push(t);
}
schedule.tween = tween1;
};
}
/* harmony default export */ __webpack_exports__["default"] = (function(name, value) {
var id = this._id;
name += "";
if (arguments.length < 2) {
var tween = Object(_schedule__WEBPACK_IMPORTED_MODULE_0__["get"])(this.node(), id).tween;
for (var i = 0, n = tween.length, t; i < n; ++i) {
if ((t = tween[i]).name === name) {
return t.value;
}
}
return null;
}
return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
});
function tweenValue(transition, name, value) {
var id = transition._id;
transition.each(function() {
var schedule = Object(_schedule__WEBPACK_IMPORTED_MODULE_0__["set"])(this, id);
(schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
});
return function(node) {
return Object(_schedule__WEBPACK_IMPORTED_MODULE_0__["get"])(node, id).value[name];
};
}
/***/ }),
/***/ "./node_modules/d3-zoom/src/constant.js":
/*!**********************************************!*\
!*** ./node_modules/d3-zoom/src/constant.js ***!
\**********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function(x) {
return function() {
return x;
};
});
/***/ }),
/***/ "./node_modules/d3-zoom/src/event.js":
/*!*******************************************!*\
!*** ./node_modules/d3-zoom/src/event.js ***!
\*******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ZoomEvent; });
function ZoomEvent(target, type, transform) {
this.target = target;
this.type = type;
this.transform = transform;
}
/***/ }),
/***/ "./node_modules/d3-zoom/src/index.js":
/*!*******************************************!*\
!*** ./node_modules/d3-zoom/src/index.js ***!
\*******************************************/
/*! exports provided: zoom, zoomTransform, zoomIdentity */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _zoom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./zoom */ "./node_modules/d3-zoom/src/zoom.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zoom", function() { return _zoom__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/* harmony import */ var _transform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./transform */ "./node_modules/d3-zoom/src/transform.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zoomTransform", function() { return _transform__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zoomIdentity", function() { return _transform__WEBPACK_IMPORTED_MODULE_1__["identity"]; });
/***/ }),
/***/ "./node_modules/d3-zoom/src/noevent.js":
/*!*********************************************!*\
!*** ./node_modules/d3-zoom/src/noevent.js ***!
\*********************************************/
/*! exports provided: nopropagation, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nopropagation", function() { return nopropagation; });
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
function nopropagation() {
d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].stopImmediatePropagation();
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].preventDefault();
d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].stopImmediatePropagation();
});
/***/ }),
/***/ "./node_modules/d3-zoom/src/transform.js":
/*!***********************************************!*\
!*** ./node_modules/d3-zoom/src/transform.js ***!
\***********************************************/
/*! exports provided: Transform, identity, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Transform", function() { return Transform; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return identity; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return transform; });
function Transform(k, x, y) {
this.k = k;
this.x = x;
this.y = y;
}
Transform.prototype = {
constructor: Transform,
scale: function(k) {
return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
},
translate: function(x, y) {
return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
},
apply: function(point) {
return [point[0] * this.k + this.x, point[1] * this.k + this.y];
},
applyX: function(x) {
return x * this.k + this.x;
},
applyY: function(y) {
return y * this.k + this.y;
},
invert: function(location) {
return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
},
invertX: function(x) {
return (x - this.x) / this.k;
},
invertY: function(y) {
return (y - this.y) / this.k;
},
rescaleX: function(x) {
return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
},
rescaleY: function(y) {
return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
},
toString: function() {
return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
}
};
var identity = new Transform(1, 0, 0);
transform.prototype = Transform.prototype;
function transform(node) {
return node.__zoom || identity;
}
/***/ }),
/***/ "./node_modules/d3-zoom/src/zoom.js":
/*!******************************************!*\
!*** ./node_modules/d3-zoom/src/zoom.js ***!
\******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_dispatch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-dispatch */ "./node_modules/d3-dispatch/src/index.js");
/* harmony import */ var d3_drag__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-drag */ "./node_modules/d3-drag/src/index.js");
/* harmony import */ var d3_interpolate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-interpolate */ "./node_modules/d3-interpolate/src/index.js");
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
/* harmony import */ var d3_transition__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! d3-transition */ "./node_modules/d3-transition/src/index.js");
/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-zoom/src/constant.js");
/* harmony import */ var _event__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./event */ "./node_modules/d3-zoom/src/event.js");
/* harmony import */ var _transform__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transform */ "./node_modules/d3-zoom/src/transform.js");
/* harmony import */ var _noevent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./noevent */ "./node_modules/d3-zoom/src/noevent.js");
// Ignore right-click, since that should open the context menu.
function defaultFilter() {
return !d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].button;
}
function defaultExtent() {
var e = this, w, h;
if (e instanceof SVGElement) {
e = e.ownerSVGElement || e;
w = e.width.baseVal.value;
h = e.height.baseVal.value;
} else {
w = e.clientWidth;
h = e.clientHeight;
}
return [[0, 0], [w, h]];
}
function defaultTransform() {
return this.__zoom || _transform__WEBPACK_IMPORTED_MODULE_7__["identity"];
}
function defaultWheelDelta() {
return -d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].deltaY * (d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].deltaMode ? 120 : 1) / 500;
}
function defaultTouchable() {
return "ontouchstart" in this;
}
function defaultConstrain(transform, extent, translateExtent) {
var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],
dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],
dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],
dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];
return transform.translate(
dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
);
}
/* harmony default export */ __webpack_exports__["default"] = (function() {
var filter = defaultFilter,
extent = defaultExtent,
constrain = defaultConstrain,
wheelDelta = defaultWheelDelta,
touchable = defaultTouchable,
scaleExtent = [0, Infinity],
translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
duration = 250,
interpolate = d3_interpolate__WEBPACK_IMPORTED_MODULE_2__["interpolateZoom"],
gestures = [],
listeners = Object(d3_dispatch__WEBPACK_IMPORTED_MODULE_0__["dispatch"])("start", "zoom", "end"),
touchstarting,
touchending,
touchDelay = 500,
wheelDelay = 150,
clickDistance2 = 0;
function zoom(selection) {
selection
.property("__zoom", defaultTransform)
.on("wheel.zoom", wheeled)
.on("mousedown.zoom", mousedowned)
.on("dblclick.zoom", dblclicked)
.filter(touchable)
.on("touchstart.zoom", touchstarted)
.on("touchmove.zoom", touchmoved)
.on("touchend.zoom touchcancel.zoom", touchended)
.style("touch-action", "none")
.style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
}
zoom.transform = function(collection, transform) {
var selection = collection.selection ? collection.selection() : collection;
selection.property("__zoom", defaultTransform);
if (collection !== selection) {
schedule(collection, transform);
} else {
selection.interrupt().each(function() {
gesture(this, arguments)
.start()
.zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform)
.end();
});
}
};
zoom.scaleBy = function(selection, k) {
zoom.scaleTo(selection, function() {
var k0 = this.__zoom.k,
k1 = typeof k === "function" ? k.apply(this, arguments) : k;
return k0 * k1;
});
};
zoom.scaleTo = function(selection, k) {
zoom.transform(selection, function() {
var e = extent.apply(this, arguments),
t0 = this.__zoom,
p0 = centroid(e),
p1 = t0.invert(p0),
k1 = typeof k === "function" ? k.apply(this, arguments) : k;
return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
});
};
zoom.translateBy = function(selection, x, y) {
zoom.transform(selection, function() {
return constrain(this.__zoom.translate(
typeof x === "function" ? x.apply(this, arguments) : x,
typeof y === "function" ? y.apply(this, arguments) : y
), extent.apply(this, arguments), translateExtent);
});
};
zoom.translateTo = function(selection, x, y) {
zoom.transform(selection, function() {
var e = extent.apply(this, arguments),
t = this.__zoom,
p = centroid(e);
return constrain(_transform__WEBPACK_IMPORTED_MODULE_7__["identity"].translate(p[0], p[1]).scale(t.k).translate(
typeof x === "function" ? -x.apply(this, arguments) : -x,
typeof y === "function" ? -y.apply(this, arguments) : -y
), e, translateExtent);
});
};
function scale(transform, k) {
k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
return k === transform.k ? transform : new _transform__WEBPACK_IMPORTED_MODULE_7__["Transform"](k, transform.x, transform.y);
}
function translate(transform, p0, p1) {
var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;
return x === transform.x && y === transform.y ? transform : new _transform__WEBPACK_IMPORTED_MODULE_7__["Transform"](transform.k, x, y);
}
function centroid(extent) {
return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
}
function schedule(transition, transform, center) {
transition
.on("start.zoom", function() { gesture(this, arguments).start(); })
.on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
.tween("zoom", function() {
var that = this,
args = arguments,
g = gesture(that, args),
e = extent.apply(that, args),
p = center || centroid(e),
w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
a = that.__zoom,
b = typeof transform === "function" ? transform.apply(that, args) : transform,
i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
return function(t) {
if (t === 1) t = b; // Avoid rounding error on end.
else { var l = i(t), k = w / l[2]; t = new _transform__WEBPACK_IMPORTED_MODULE_7__["Transform"](k, p[0] - l[0] * k, p[1] - l[1] * k); }
g.zoom(null, t);
};
});
}
function gesture(that, args) {
for (var i = 0, n = gestures.length, g; i < n; ++i) {
if ((g = gestures[i]).that === that) {
return g;
}
}
return new Gesture(that, args);
}
function Gesture(that, args) {
this.that = that;
this.args = args;
this.index = -1;
this.active = 0;
this.extent = extent.apply(that, args);
}
Gesture.prototype = {
start: function() {
if (++this.active === 1) {
this.index = gestures.push(this) - 1;
this.emit("start");
}
return this;
},
zoom: function(key, transform) {
if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]);
if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]);
if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]);
this.that.__zoom = transform;
this.emit("zoom");
return this;
},
end: function() {
if (--this.active === 0) {
gestures.splice(this.index, 1);
this.index = -1;
this.emit("end");
}
return this;
},
emit: function(type) {
Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["customEvent"])(new _event__WEBPACK_IMPORTED_MODULE_6__["default"](zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
}
};
function wheeled() {
if (!filter.apply(this, arguments)) return;
var g = gesture(this, arguments),
t = this.__zoom,
k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
p = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["mouse"])(this);
// If the mouse is in the same location as before, reuse it.
// If there were recent wheel events, reset the wheel idle timeout.
if (g.wheel) {
if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
g.mouse[1] = t.invert(g.mouse[0] = p);
}
clearTimeout(g.wheel);
}
// If this wheel event wont trigger a transform change, ignore it.
else if (t.k === k) return;
// Otherwise, capture the mouse point and location at the start.
else {
g.mouse = [p, t.invert(p)];
Object(d3_transition__WEBPACK_IMPORTED_MODULE_4__["interrupt"])(this);
g.start();
}
Object(_noevent__WEBPACK_IMPORTED_MODULE_8__["default"])();
g.wheel = setTimeout(wheelidled, wheelDelay);
g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
function wheelidled() {
g.wheel = null;
g.end();
}
}
function mousedowned() {
if (touchending || !filter.apply(this, arguments)) return;
var g = gesture(this, arguments),
v = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["select"])(d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
p = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["mouse"])(this),
x0 = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].clientX,
y0 = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].clientY;
Object(d3_drag__WEBPACK_IMPORTED_MODULE_1__["dragDisable"])(d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].view);
Object(_noevent__WEBPACK_IMPORTED_MODULE_8__["nopropagation"])();
g.mouse = [p, this.__zoom.invert(p)];
Object(d3_transition__WEBPACK_IMPORTED_MODULE_4__["interrupt"])(this);
g.start();
function mousemoved() {
Object(_noevent__WEBPACK_IMPORTED_MODULE_8__["default"])();
if (!g.moved) {
var dx = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].clientX - x0, dy = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].clientY - y0;
g.moved = dx * dx + dy * dy > clickDistance2;
}
g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["mouse"])(g.that), g.mouse[1]), g.extent, translateExtent));
}
function mouseupped() {
v.on("mousemove.zoom mouseup.zoom", null);
Object(d3_drag__WEBPACK_IMPORTED_MODULE_1__["dragEnable"])(d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].view, g.moved);
Object(_noevent__WEBPACK_IMPORTED_MODULE_8__["default"])();
g.end();
}
}
function dblclicked() {
if (!filter.apply(this, arguments)) return;
var t0 = this.__zoom,
p0 = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["mouse"])(this),
p1 = t0.invert(p0),
k1 = t0.k * (d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].shiftKey ? 0.5 : 2),
t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
Object(_noevent__WEBPACK_IMPORTED_MODULE_8__["default"])();
if (duration > 0) Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["select"])(this).transition().duration(duration).call(schedule, t1, p0);
else Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["select"])(this).call(zoom.transform, t1);
}
function touchstarted() {
if (!filter.apply(this, arguments)) return;
var g = gesture(this, arguments),
touches = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].changedTouches,
started,
n = touches.length, i, t, p;
Object(_noevent__WEBPACK_IMPORTED_MODULE_8__["nopropagation"])();
for (i = 0; i < n; ++i) {
t = touches[i], p = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["touch"])(this, touches, t.identifier);
p = [p, this.__zoom.invert(p), t.identifier];
if (!g.touch0) g.touch0 = p, started = true;
else if (!g.touch1) g.touch1 = p;
}
// If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
if (touchstarting) {
touchstarting = clearTimeout(touchstarting);
if (!g.touch1) {
g.end();
p = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["select"])(this).on("dblclick.zoom");
if (p) p.apply(this, arguments);
return;
}
}
if (started) {
touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
Object(d3_transition__WEBPACK_IMPORTED_MODULE_4__["interrupt"])(this);
g.start();
}
}
function touchmoved() {
var g = gesture(this, arguments),
touches = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].changedTouches,
n = touches.length, i, t, p, l;
Object(_noevent__WEBPACK_IMPORTED_MODULE_8__["default"])();
if (touchstarting) touchstarting = clearTimeout(touchstarting);
for (i = 0; i < n; ++i) {
t = touches[i], p = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["touch"])(this, touches, t.identifier);
if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
}
t = g.that.__zoom;
if (g.touch1) {
var p0 = g.touch0[0], l0 = g.touch0[1],
p1 = g.touch1[0], l1 = g.touch1[1],
dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
t = scale(t, Math.sqrt(dp / dl));
p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
}
else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
else return;
g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
}
function touchended() {
var g = gesture(this, arguments),
touches = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].changedTouches,
n = touches.length, i, t;
Object(_noevent__WEBPACK_IMPORTED_MODULE_8__["nopropagation"])();
if (touchending) clearTimeout(touchending);
touchending = setTimeout(function() { touchending = null; }, touchDelay);
for (i = 0; i < n; ++i) {
t = touches[i];
if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
}
if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
else g.end();
}
zoom.wheelDelta = function(_) {
return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_5__["default"])(+_), zoom) : wheelDelta;
};
zoom.filter = function(_) {
return arguments.length ? (filter = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_5__["default"])(!!_), zoom) : filter;
};
zoom.touchable = function(_) {
return arguments.length ? (touchable = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_5__["default"])(!!_), zoom) : touchable;
};
zoom.extent = function(_) {
return arguments.length ? (extent = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_5__["default"])([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
};
zoom.scaleExtent = function(_) {
return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
};
zoom.translateExtent = function(_) {
return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];
};
zoom.constrain = function(_) {
return arguments.length ? (constrain = _, zoom) : constrain;
};
zoom.duration = function(_) {
return arguments.length ? (duration = +_, zoom) : duration;
};
zoom.interpolate = function(_) {
return arguments.length ? (interpolate = _, zoom) : interpolate;
};
zoom.on = function() {
var value = listeners.on.apply(listeners, arguments);
return value === listeners ? zoom : value;
};
zoom.clickDistance = function(_) {
return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
};
return zoom;
});
/***/ }),
/***/ "./node_modules/d3plus-common/es/index.js":
/*!************************************************!*\
!*** ./node_modules/d3plus-common/es/index.js ***!
\************************************************/
/*! exports provided: accessor, assign, attrize, BaseClass, closest, configPrep, constant, elem, isObject, merge, parseSides, prefix, RESET, stylize, uuid */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _src_accessor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/accessor */ "./node_modules/d3plus-common/es/src/accessor.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "accessor", function() { return _src_accessor__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/* harmony import */ var _src_assign__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./src/assign */ "./node_modules/d3plus-common/es/src/assign.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "assign", function() { return _src_assign__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/* harmony import */ var _src_attrize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./src/attrize */ "./node_modules/d3plus-common/es/src/attrize.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "attrize", function() { return _src_attrize__WEBPACK_IMPORTED_MODULE_2__["default"]; });
/* harmony import */ var _src_BaseClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./src/BaseClass */ "./node_modules/d3plus-common/es/src/BaseClass.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BaseClass", function() { return _src_BaseClass__WEBPACK_IMPORTED_MODULE_3__["default"]; });
/* harmony import */ var _src_closest__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./src/closest */ "./node_modules/d3plus-common/es/src/closest.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "closest", function() { return _src_closest__WEBPACK_IMPORTED_MODULE_4__["default"]; });
/* harmony import */ var _src_configPrep__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./src/configPrep */ "./node_modules/d3plus-common/es/src/configPrep.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "configPrep", function() { return _src_configPrep__WEBPACK_IMPORTED_MODULE_5__["default"]; });
/* harmony import */ var _src_constant__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./src/constant */ "./node_modules/d3plus-common/es/src/constant.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "constant", function() { return _src_constant__WEBPACK_IMPORTED_MODULE_6__["default"]; });
/* harmony import */ var _src_elem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./src/elem */ "./node_modules/d3plus-common/es/src/elem.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "elem", function() { return _src_elem__WEBPACK_IMPORTED_MODULE_7__["default"]; });
/* harmony import */ var _src_isObject__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./src/isObject */ "./node_modules/d3plus-common/es/src/isObject.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isObject", function() { return _src_isObject__WEBPACK_IMPORTED_MODULE_8__["default"]; });
/* harmony import */ var _src_merge__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./src/merge */ "./node_modules/d3plus-common/es/src/merge.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _src_merge__WEBPACK_IMPORTED_MODULE_9__["default"]; });
/* harmony import */ var _src_parseSides__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./src/parseSides */ "./node_modules/d3plus-common/es/src/parseSides.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseSides", function() { return _src_parseSides__WEBPACK_IMPORTED_MODULE_10__["default"]; });
/* harmony import */ var _src_prefix__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./src/prefix */ "./node_modules/d3plus-common/es/src/prefix.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prefix", function() { return _src_prefix__WEBPACK_IMPORTED_MODULE_11__["default"]; });
/* harmony import */ var _src_RESET__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./src/RESET */ "./node_modules/d3plus-common/es/src/RESET.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RESET", function() { return _src_RESET__WEBPACK_IMPORTED_MODULE_12__["default"]; });
/* harmony import */ var _src_stylize__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./src/stylize */ "./node_modules/d3plus-common/es/src/stylize.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stylize", function() { return _src_stylize__WEBPACK_IMPORTED_MODULE_13__["default"]; });
/* harmony import */ var _src_uuid__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./src/uuid */ "./node_modules/d3plus-common/es/src/uuid.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "uuid", function() { return _src_uuid__WEBPACK_IMPORTED_MODULE_14__["default"]; });
//# sourceMappingURL=index.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/BaseClass.js":
/*!********************************************************!*\
!*** ./node_modules/d3plus-common/es/src/BaseClass.js ***!
\********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _assign__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./assign */ "./node_modules/d3plus-common/es/src/assign.js");
/* harmony import */ var _isObject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObject */ "./node_modules/d3plus-common/es/src/isObject.js");
/* harmony import */ var _uuid__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./uuid */ "./node_modules/d3plus-common/es/src/uuid.js");
/* harmony import */ var _RESET__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./RESET */ "./node_modules/d3plus-common/es/src/RESET.js");
/**
@desc Recursive function that resets nested Object configs.
@param {Object} obj
@param {Object} defaults
@private
*/
function nestedReset(obj, defaults) {
if (Object(_isObject__WEBPACK_IMPORTED_MODULE_1__["default"])(obj)) {
for (var nestedKey in obj) {
if ({}.hasOwnProperty.call(obj, nestedKey) && !nestedKey.startsWith("_")) {
var defaultValue = defaults && Object(_isObject__WEBPACK_IMPORTED_MODULE_1__["default"])(defaults) ? defaults[nestedKey] : undefined;
if (obj[nestedKey] === _RESET__WEBPACK_IMPORTED_MODULE_3__["default"]) {
obj[nestedKey] = defaultValue;
}
else if (Object(_isObject__WEBPACK_IMPORTED_MODULE_1__["default"])(obj[nestedKey])) {
nestedReset(obj[nestedKey], defaultValue);
}
}
}
}
}
/**
@class BaseClass
@summary An abstract class that contains some global methods and functionality.
*/
var BaseClass = function BaseClass() {
this._on = {};
this._uuid = Object(_uuid__WEBPACK_IMPORTED_MODULE_2__["default"])();
};
/**
@memberof BaseClass
@desc If *value* is specified, sets the methods that correspond to the key/value pairs and returns this class. If *value* is not specified, returns the current configuration.
@param {Object} [*value*]
@chainable
*/
BaseClass.prototype.config = function config (_) {
var this$1 = this;
if (!this._configDefault) {
var config = {};
for (var k in this$1.__proto__) {
if (k.indexOf("_") !== 0 && !["config", "constructor", "render"].includes(k)) {
var v = this$1[k]();
config[k] = Object(_isObject__WEBPACK_IMPORTED_MODULE_1__["default"])(v) ? Object(_assign__WEBPACK_IMPORTED_MODULE_0__["default"])({}, v) : v;
}
}
this._configDefault = config;
}
if (arguments.length) {
for (var k$1 in _) {
if ({}.hasOwnProperty.call(_, k$1) && k$1 in this$1) {
var v$1 = _[k$1];
if (v$1 === _RESET__WEBPACK_IMPORTED_MODULE_3__["default"]) {
if (k$1 === "on") { this$1._on = this$1._configDefault[k$1]; }
else { this$1[k$1](this$1._configDefault[k$1]); }
}
else {
nestedReset(v$1, this$1._configDefault[k$1]);
this$1[k$1](v$1);
}
}
}
return this;
}
else {
var config$1 = {};
for (var k$2 in this$1.__proto__) { if (k$2.indexOf("_") !== 0 && !["config", "constructor", "render"].includes(k$2)) { config$1[k$2] = this$1[k$2](); } }
return config$1;
}
};
/**
@memberof BaseClass
@desc Adds or removes a *listener* to each object for the specified event *typenames*. If a *listener* is not specified, returns the currently assigned listener for the specified event *typename*. Mirrors the core [d3-selection](https://github.com/d3/d3-selection#selection_on) behavior.
@param {String} [*typenames*]
@param {Function} [*listener*]
@chainable
@example <caption>By default, listeners apply globally to all objects, however, passing a namespace with the class name gives control over specific elements:</caption>
new Plot
.on("click.Shape", function(d) {
console.log("data for shape clicked:", d);
})
.on("click.Legend", function(d) {
console.log("data for legend clicked:", d);
})
*/
BaseClass.prototype.on = function on (_, f) {
return arguments.length === 2 ? (this._on[_] = f, this) : arguments.length ? typeof _ === "string" ? this._on[_] : (this._on = Object.assign({}, this._on, _), this) : this._on;
};
/* harmony default export */ __webpack_exports__["default"] = (BaseClass);
//# sourceMappingURL=BaseClass.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/RESET.js":
/*!****************************************************!*\
!*** ./node_modules/d3plus-common/es/src/RESET.js ***!
\****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/**
@constant RESET
@desc String constant used to reset an individual config property.
*/
/* harmony default export */ __webpack_exports__["default"] = ("D3PLUS-COMMON-RESET");
//# sourceMappingURL=RESET.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/accessor.js":
/*!*******************************************************!*\
!*** ./node_modules/d3plus-common/es/src/accessor.js ***!
\*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/**
@function accessor
@desc Wraps an object key in a simple accessor function.
@param {String} key The key to be returned from each Object passed to the function.
@param {*} [def] A default value to be returned if the key is not present.
@example <caption>this</caption>
accessor("id");
@example <caption>returns this</caption>
function(d) {
return d["id"];
}
*/
/* harmony default export */ __webpack_exports__["default"] = (function(key, def) {
if (def === void 0) { return function (d) { return d[key]; }; }
return function (d) { return d[key] === void 0 ? def : d[key]; };
});
//# sourceMappingURL=accessor.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/assign.js":
/*!*****************************************************!*\
!*** ./node_modules/d3plus-common/es/src/assign.js ***!
\*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _isObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isObject */ "./node_modules/d3plus-common/es/src/isObject.js");
/**
@function validObject
@desc Determines if the object passed is the document or window.
@param {Object} obj
@private
*/
function validObject(obj) {
if (typeof window === "undefined") { return true; }
else { return obj !== window && obj !== document; }
}
/**
@function assign
@desc A deeply recursive version of `Object.assign`.
@param {...Object} objects
@example <caption>this</caption>
assign({id: "foo", deep: {group: "A"}}, {id: "bar", deep: {value: 20}}));
@example <caption>returns this</caption>
{id: "bar", deep: {group: "A", value: 20}}
*/
function assign() {
var objects = [], len = arguments.length;
while ( len-- ) objects[ len ] = arguments[ len ];
var target = objects[0];
var loop = function ( i ) {
var source = objects[i];
Object.keys(source).forEach(function (prop) {
var value = source[prop];
if (Object(_isObject__WEBPACK_IMPORTED_MODULE_0__["default"])(value) && validObject(value)) {
if (target.hasOwnProperty(prop) && Object(_isObject__WEBPACK_IMPORTED_MODULE_0__["default"])(target[prop])) { target[prop] = assign({}, target[prop], value); }
else { target[prop] = assign({}, value); }
}
else if (Array.isArray(value)) { target[prop] = value.slice(); }
else { target[prop] = value; }
});
};
for (var i = 1; i < objects.length; i++) loop( i );
return target;
}
/* harmony default export */ __webpack_exports__["default"] = (assign);
//# sourceMappingURL=assign.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/attrize.js":
/*!******************************************************!*\
!*** ./node_modules/d3plus-common/es/src/attrize.js ***!
\******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/**
@function attrize
@desc Applies each key/value in an object as an attr.
@param {D3selection} elem The D3 element to apply the styles to.
@param {Object} attrs An object of key/value attr pairs.
*/
/* harmony default export */ __webpack_exports__["default"] = (function(e, a) {
if ( a === void 0 ) a = {};
for (var k in a) { if ({}.hasOwnProperty.call(a, k)) { e.attr(k, a[k]); } }
});
//# sourceMappingURL=attrize.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/closest.js":
/*!******************************************************!*\
!*** ./node_modules/d3plus-common/es/src/closest.js ***!
\******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/**
@function closest
@desc Finds the closest numeric value in an array.
@param {Number} n The number value to use when searching the array.
@param {Array} arr The array of values to test against.
*/
/* harmony default export */ __webpack_exports__["default"] = (function(n, arr) {
if ( arr === void 0 ) arr = [];
if (!arr || !(arr instanceof Array) || !arr.length) { return undefined; }
return arr.reduce(function (prev, curr) { return Math.abs(curr - n) < Math.abs(prev - n) ? curr : prev; });
});
//# sourceMappingURL=closest.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/configPrep.js":
/*!*********************************************************!*\
!*** ./node_modules/d3plus-common/es/src/configPrep.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return configPrep; });
/**
@function configPrep
@desc Preps a config object for d3plus data, and optionally bubbles up a specific nested type. When using this function, you must bind a d3plus class' `this` context.
@param {Object} [config = this._shapeConfig] The configuration object to parse.
@param {String} [type = "shape"] The event classifier to user for "on" events. For example, the default event type of "shape" will apply all events in the "on" config object with that key, like "click.shape" and "mouseleave.shape", in addition to any gloval events like "click" and "mouseleave".
@param {String} [nest] An optional nested key to bubble up to the parent config level.
*/
function configPrep(config, type, nest) {
var this$1 = this;
if ( config === void 0 ) config = this._shapeConfig;
if ( type === void 0 ) type = "shape";
if ( nest === void 0 ) nest = false;
var newConfig = {duration: this._duration, on: {}};
var wrapFunction = function (func) { return function (d, i, s) {
while (d.__d3plus__) {
i = d.i;
d = d.data || d.feature;
}
return func.bind(this$1)(d, i, s);
}; };
var parseEvents = function (newObj, on) {
for (var event in on) {
if ({}.hasOwnProperty.call(on, event) && !event.includes(".") || event.includes(("." + type))) {
newObj.on[event] = wrapFunction(on[event]);
}
}
};
var keyEval = function (newObj, obj) {
for (var key in obj) {
if ({}.hasOwnProperty.call(obj, key)) {
if (key === "on") { parseEvents(newObj, obj[key]); }
else if (typeof obj[key] === "function") {
newObj[key] = wrapFunction(obj[key]);
}
else if (typeof obj[key] === "object" && !(obj instanceof Array)) {
newObj[key] = {on: {}};
keyEval(newObj[key], obj[key]);
}
else { newObj[key] = obj[key]; }
}
}
};
keyEval(newConfig, config);
if (this._on) { parseEvents(newConfig, this._on); }
if (nest && config[nest]) {
keyEval(newConfig, config[nest]);
if (config[nest].on) { parseEvents(newConfig, config[nest].on); }
}
return newConfig;
}
//# sourceMappingURL=configPrep.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/constant.js":
/*!*******************************************************!*\
!*** ./node_modules/d3plus-common/es/src/constant.js ***!
\*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/**
@function constant
@desc Wraps non-function variables in a simple return function.
@param {Array|Number|Object|String} value The value to be returned from the function.
@example <caption>this</caption>
constant(42);
@example <caption>returns this</caption>
function() {
return 42;
}
*/
/* harmony default export */ __webpack_exports__["default"] = (function(value) {
return function constant() {
return value;
};
});
//# sourceMappingURL=constant.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/elem.js":
/*!***************************************************!*\
!*** ./node_modules/d3plus-common/es/src/elem.js ***!
\***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
/* harmony import */ var d3_transition__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-transition */ "./node_modules/d3-transition/src/index.js");
/* harmony import */ var _attrize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./attrize */ "./node_modules/d3plus-common/es/src/attrize.js");
/**
@function elem
@desc Manages the enter/update/exit pattern for a single DOM element.
@param {String} selector A D3 selector, which must include the tagname and a class and/or ID.
@param {Object} params Additional parameters.
@param {Boolean} [params.condition = true] Whether or not the element should be rendered (or removed).
@param {Object} [params.enter = {}] A collection of key/value pairs that map to attributes to be given on enter.
@param {Object} [params.exit = {}] A collection of key/value pairs that map to attributes to be given on exit.
@param {D3Selection} [params.parent = d3.select("body")] The parent element for this new element to be appended to.
@param {D3Transition} [params.transition = d3.transition().duration(0)] The transition to use when animated the different life cycle stages.
@param {Object} [params.update = {}] A collection of key/value pairs that map to attributes to be given on update.
*/
/* harmony default export */ __webpack_exports__["default"] = (function(selector, p) {
// overrides default params
p = Object.assign({}, {
condition: true,
enter: {},
exit: {},
parent: Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["select"])("body"),
transition: Object(d3_transition__WEBPACK_IMPORTED_MODULE_1__["transition"])().duration(0),
update: {}
}, p);
var className = (/\.([^#]+)/g).exec(selector),
id = (/#([^\.]+)/g).exec(selector),
tag = (/^([^.^#]+)/g).exec(selector)[1];
var elem = p.parent.selectAll(selector.includes(":") ? selector.split(":")[1] : selector)
.data(p.condition ? [null] : []);
var enter = elem.enter().append(tag).call(_attrize__WEBPACK_IMPORTED_MODULE_2__["default"], p.enter);
if (id) { enter.attr("id", id[1]); }
if (className) { enter.attr("class", className[1]); }
elem.exit().transition(p.transition).call(_attrize__WEBPACK_IMPORTED_MODULE_2__["default"], p.exit).remove();
var update = enter.merge(elem);
update.transition(p.transition).call(_attrize__WEBPACK_IMPORTED_MODULE_2__["default"], p.update);
return update;
});
//# sourceMappingURL=elem.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/isObject.js":
/*!*******************************************************!*\
!*** ./node_modules/d3plus-common/es/src/isObject.js ***!
\*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/**
@function isObject
@desc Detects if a variable is a javascript Object.
@param {*} item
*/
/* harmony default export */ __webpack_exports__["default"] = (function(item) {
return item &&
typeof item === "object" &&
(typeof window === "undefined" || item !== window && item !== window.document && !(item instanceof Element)) &&
!Array.isArray(item)
? true : false;
});
//# sourceMappingURL=isObject.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/merge.js":
/*!****************************************************!*\
!*** ./node_modules/d3plus-common/es/src/merge.js ***!
\****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
/* harmony import */ var d3_collection__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-collection */ "./node_modules/d3-collection/src/index.js");
/**
@function merge
@desc Combines an Array of Objects together and returns a new Object.
@param {Array} objects The Array of objects to be merged together.
@param {Object} aggs An object containing specific aggregation methods (functions) for each key type. By default, numbers are summed and strings are returned as an array of unique values.
@example <caption>this</caption>
merge([
{id: "foo", group: "A", value: 10, links: [1, 2]},
{id: "bar", group: "A", value: 20, links: [1, 3]}
]);
@example <caption>returns this</caption>
{id: ["bar", "foo"], group: "A", value: 30, links: [1, 2, 3]}
*/
function objectMerge(objects, aggs) {
if ( aggs === void 0 ) aggs = {};
var availableKeys = new Set(Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["merge"])(objects.map(function (o) { return Object(d3_collection__WEBPACK_IMPORTED_MODULE_1__["keys"])(o); }))),
newObject = {};
availableKeys.forEach(function (k) {
var values = objects.map(function (o) { return o[k]; });
var value;
if (aggs[k]) { value = aggs[k](values); }
else {
var types = values.map(function (v) { return v || v === false ? v.constructor : v; }).filter(function (v) { return v !== void 0; });
if (!types.length) { value = undefined; }
else if (types.indexOf(Array) >= 0) {
value = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["merge"])(values.map(function (v) { return v instanceof Array ? v : [v]; }));
value = Array.from(new Set(value));
if (value.length === 1) { value = value[0]; }
}
else if (types.indexOf(String) >= 0) {
value = Array.from(new Set(values));
if (value.length === 1) { value = value[0]; }
}
else if (types.indexOf(Number) >= 0) { value = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["sum"])(values); }
else if (types.indexOf(Object) >= 0) { value = objectMerge(values.filter(function (v) { return v; })); }
else {
value = Array.from(new Set(values.filter(function (v) { return v !== void 0; })));
if (value.length === 1) { value = value[0]; }
}
}
newObject[k] = value;
});
return newObject;
}
/* harmony default export */ __webpack_exports__["default"] = (objectMerge);
//# sourceMappingURL=merge.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/parseSides.js":
/*!*********************************************************!*\
!*** ./node_modules/d3plus-common/es/src/parseSides.js ***!
\*********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/**
@function parseSides
@desc Converts a string of directional CSS shorthand values into an object with the values expanded.
@param {String|Number} sides The CSS shorthand string to expand.
*/
/* harmony default export */ __webpack_exports__["default"] = (function(sides) {
var values;
if (typeof sides === "number") { values = [sides]; }
else { values = sides.split(/\s+/); }
if (values.length === 1) { values = [values[0], values[0], values[0], values[0]]; }
else if (values.length === 2) { values = values.concat(values); }
else if (values.length === 3) { values.push(values[1]); }
return [
"top",
"right",
"bottom",
"left"
].reduce(function (acc, direction, i) {
var value = parseFloat(values[i]);
acc[direction] = value || 0;
return acc;
}, {});
});
//# sourceMappingURL=parseSides.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/prefix.js":
/*!*****************************************************!*\
!*** ./node_modules/d3plus-common/es/src/prefix.js ***!
\*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/**
@function prefix
@desc Returns the appropriate CSS vendor prefix, given the current browser.
*/
/* harmony default export */ __webpack_exports__["default"] = (function() {
if ("-webkit-transform" in document.body.style) { return "-webkit-"; }
else if ("-moz-transform" in document.body.style) { return "-moz-"; }
else if ("-ms-transform" in document.body.style) { return "-ms-"; }
else if ("-o-transform" in document.body.style) { return "-o-"; }
else { return ""; }
});
//# sourceMappingURL=prefix.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/stylize.js":
/*!******************************************************!*\
!*** ./node_modules/d3plus-common/es/src/stylize.js ***!
\******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/**
@function stylize
@desc Applies each key/value in an object as a style.
@param {D3selection} elem The D3 element to apply the styles to.
@param {Object} styles An object of key/value style pairs.
*/
/* harmony default export */ __webpack_exports__["default"] = (function(e, s) {
if ( s === void 0 ) s = {};
for (var k in s) { if ({}.hasOwnProperty.call(s, k)) { e.style(k, s[k]); } }
});
//# sourceMappingURL=stylize.js.map
/***/ }),
/***/ "./node_modules/d3plus-common/es/src/uuid.js":
/*!***************************************************!*\
!*** ./node_modules/d3plus-common/es/src/uuid.js ***!
\***************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/**
@function s
@desc Returns 4 random characters, used for constructing unique identifiers.
@private
*/
function s() {
return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
}
/**
@function uuid
@summary Returns a unique identifier.
*/
/* harmony default export */ __webpack_exports__["default"] = (function() {
return ("" + (s()) + (s()) + "-" + (s()) + "-" + (s()) + "-" + (s()) + "-" + (s()) + (s()) + (s()));
});
//# sourceMappingURL=uuid.js.map
/***/ }),
/***/ "./node_modules/d3plus-text/es/index.js":
/*!**********************************************!*\
!*** ./node_modules/d3plus-text/es/index.js ***!
\**********************************************/
/*! exports provided: fontExists, rtl, stringify, strip, TextBox, textSplit, textWidth, textWrap, titleCase, trim, trimLeft, trimRight */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _src_fontExists__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/fontExists */ "./node_modules/d3plus-text/es/src/fontExists.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fontExists", function() { return _src_fontExists__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/* harmony import */ var _src_rtl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./src/rtl */ "./node_modules/d3plus-text/es/src/rtl.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "rtl", function() { return _src_rtl__WEBPACK_IMPORTED_MODULE_1__["default"]; });
/* harmony import */ var _src_stringify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./src/stringify */ "./node_modules/d3plus-text/es/src/stringify.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stringify", function() { return _src_stringify__WEBPACK_IMPORTED_MODULE_2__["default"]; });
/* harmony import */ var _src_strip__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./src/strip */ "./node_modules/d3plus-text/es/src/strip.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "strip", function() { return _src_strip__WEBPACK_IMPORTED_MODULE_3__["default"]; });
/* harmony import */ var _src_TextBox__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./src/TextBox */ "./node_modules/d3plus-text/es/src/TextBox.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TextBox", function() { return _src_TextBox__WEBPACK_IMPORTED_MODULE_4__["default"]; });
/* harmony import */ var _src_textSplit__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./src/textSplit */ "./node_modules/d3plus-text/es/src/textSplit.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "textSplit", function() { return _src_textSplit__WEBPACK_IMPORTED_MODULE_5__["default"]; });
/* harmony import */ var _src_textWidth__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./src/textWidth */ "./node_modules/d3plus-text/es/src/textWidth.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "textWidth", function() { return _src_textWidth__WEBPACK_IMPORTED_MODULE_6__["default"]; });
/* harmony import */ var _src_textWrap__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./src/textWrap */ "./node_modules/d3plus-text/es/src/textWrap.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "textWrap", function() { return _src_textWrap__WEBPACK_IMPORTED_MODULE_7__["default"]; });
/* harmony import */ var _src_titleCase__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./src/titleCase */ "./node_modules/d3plus-text/es/src/titleCase.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "titleCase", function() { return _src_titleCase__WEBPACK_IMPORTED_MODULE_8__["default"]; });
/* harmony import */ var _src_trim__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./src/trim */ "./node_modules/d3plus-text/es/src/trim.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "trim", function() { return _src_trim__WEBPACK_IMPORTED_MODULE_9__["trim"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "trimLeft", function() { return _src_trim__WEBPACK_IMPORTED_MODULE_9__["trimLeft"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "trimRight", function() { return _src_trim__WEBPACK_IMPORTED_MODULE_9__["trimRight"]; });
//# sourceMappingURL=index.js.map
/***/ }),
/***/ "./node_modules/d3plus-text/es/src/TextBox.js":
/*!****************************************************!*\
!*** ./node_modules/d3plus-text/es/src/TextBox.js ***!
\****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
/* harmony import */ var d3_transition__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-transition */ "./node_modules/d3-transition/src/index.js");
/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
/* harmony import */ var d3plus_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! d3plus-common */ "./node_modules/d3plus-common/es/index.js");
/* harmony import */ var _fontExists__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./fontExists */ "./node_modules/d3plus-text/es/src/fontExists.js");
/* harmony import */ var _rtl__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./rtl */ "./node_modules/d3plus-text/es/src/rtl.js");
/* harmony import */ var _strip__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./strip */ "./node_modules/d3plus-text/es/src/strip.js");
/* harmony import */ var _textSplit__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./textSplit */ "./node_modules/d3plus-text/es/src/textSplit.js");
/* harmony import */ var _textWidth__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./textWidth */ "./node_modules/d3plus-text/es/src/textWidth.js");
/* harmony import */ var _textWrap__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textWrap */ "./node_modules/d3plus-text/es/src/textWrap.js");
/* harmony import */ var _trim__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./trim */ "./node_modules/d3plus-text/es/src/trim.js");
/**
@external BaseClass
@see https://github.com/d3plus/d3plus-common#BaseClass
*/
/**
@class TextBox
@extends external:BaseClass
@desc Creates a wrapped text box for each point in an array of data. See [this example](https://d3plus.org/examples/d3plus-text/getting-started/) for help getting started using the TextBox class.
*/
var TextBox = (function (BaseClass) {
function TextBox() {
var this$1 = this;
BaseClass.call(this);
this._ariaHidden = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])("false");
this._delay = 0;
this._duration = 0;
this._ellipsis = function (text, line) { return line ? ((text.replace(/\.|,$/g, "")) + "...") : ""; };
this._fontColor = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])("black");
this._fontFamily = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(["Roboto", "Helvetica Neue", "HelveticaNeue", "Helvetica", "Arial", "sans-serif"]);
this._fontMax = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(50);
this._fontMin = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(8);
this._fontOpacity = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(1);
this._fontResize = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(false);
this._fontSize = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(10);
this._fontWeight = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(400);
this._height = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["accessor"])("height", 200);
this._id = function (d, i) { return d.id || ("" + i); };
this._lineHeight = function (d, i) { return this$1._fontSize(d, i) * 1.2; };
this._maxLines = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(null);
this._on = {};
this._overflow = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(false);
this._padding = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(0);
this._pointerEvents = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])("auto");
this._rotate = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(0);
this._rotateAnchor = function (d) { return [d.w / 2, d.h / 2]; };
this._split = _textSplit__WEBPACK_IMPORTED_MODULE_7__["default"];
this._text = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["accessor"])("text");
this._textAnchor = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])("start");
this._verticalAlign = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])("top");
this._width = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["accessor"])("width", 200);
this._x = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["accessor"])("x", 0);
this._y = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["accessor"])("y", 0);
}
if ( BaseClass ) TextBox.__proto__ = BaseClass;
TextBox.prototype = Object.create( BaseClass && BaseClass.prototype );
TextBox.prototype.constructor = TextBox;
/**
@memberof TextBox
@desc Renders the text boxes. If a *callback* is specified, it will be called once the shapes are done drawing.
@param {Function} [*callback* = undefined]
*/
TextBox.prototype.render = function render (callback) {
var this$1 = this;
if (this._select === void 0) { this.select(Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["select"])("body").append("svg").style("width", ((window.innerWidth) + "px")).style("height", ((window.innerHeight) + "px")).node()); }
var that = this;
var boxes = this._select.selectAll(".d3plus-textBox").data(this._data.reduce(function (arr, d, i) {
var t = this$1._text(d, i);
if (t === void 0) { return arr; }
var resize = this$1._fontResize(d, i);
var lHRatio = this$1._lineHeight(d, i) / this$1._fontSize(d, i);
var fS = resize ? this$1._fontMax(d, i) : this$1._fontSize(d, i),
lH = resize ? fS * lHRatio : this$1._lineHeight(d, i),
line = 1,
lineData = [],
sizes,
wrapResults;
var style = {
"font-family": Object(_fontExists__WEBPACK_IMPORTED_MODULE_4__["default"])(this$1._fontFamily(d, i)),
"font-size": fS,
"font-weight": this$1._fontWeight(d, i),
"line-height": lH
};
var padding = Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["parseSides"])(this$1._padding(d, i));
var h = this$1._height(d, i) - (padding.top + padding.bottom),
w = this$1._width(d, i) - (padding.left + padding.right);
var wrapper = Object(_textWrap__WEBPACK_IMPORTED_MODULE_9__["default"])()
.fontFamily(style["font-family"])
.fontSize(fS)
.fontWeight(style["font-weight"])
.lineHeight(lH)
.maxLines(this$1._maxLines(d, i))
.height(h)
.overflow(this$1._overflow(d, i))
.width(w);
var fMax = this$1._fontMax(d, i),
fMin = this$1._fontMin(d, i),
vA = this$1._verticalAlign(d, i),
words = this$1._split(t, i);
/**
Figures out the lineData to be used for wrapping.
@private
*/
function checkSize() {
var truncate = function () {
if (line < 1) { lineData = [that._ellipsis("", line)]; }
else { lineData[line - 1] = that._ellipsis(lineData[line - 1], line); }
};
// Constraint the font size
fS = Object(d3_array__WEBPACK_IMPORTED_MODULE_2__["max"])([fS, fMin]);
fS = Object(d3_array__WEBPACK_IMPORTED_MODULE_2__["min"])([fS, fMax]);
if (resize) {
lH = fS * lHRatio;
wrapper
.fontSize(fS)
.lineHeight(lH);
style["font-size"] = fS;
style["line-height"] = lH;
}
wrapResults = wrapper(t);
lineData = wrapResults.lines.filter(function (l) { return l !== ""; });
line = lineData.length;
if (wrapResults.truncated) {
if (resize) {
fS--;
if (fS < fMin) {
fS = fMin;
truncate();
return;
}
else { checkSize(); }
}
else { truncate(); }
}
}
if (w > fMin && (h > lH || resize && h > fMin * lHRatio)) {
if (resize) {
sizes = Object(_textWidth__WEBPACK_IMPORTED_MODULE_8__["default"])(words, style);
var areaMod = 1.165 + w / h * 0.1,
boxArea = w * h,
maxWidth = Object(d3_array__WEBPACK_IMPORTED_MODULE_2__["max"])(sizes),
textArea = Object(d3_array__WEBPACK_IMPORTED_MODULE_2__["sum"])(sizes, function (d) { return d * lH; }) * areaMod;
if (maxWidth > w || textArea > boxArea) {
var areaRatio = Math.sqrt(boxArea / textArea),
widthRatio = w / maxWidth;
var sizeRatio = Object(d3_array__WEBPACK_IMPORTED_MODULE_2__["min"])([areaRatio, widthRatio]);
fS = Math.floor(fS * sizeRatio);
}
var heightMax = Math.floor(h * 0.8);
if (fS > heightMax) { fS = heightMax; }
}
checkSize();
}
if (lineData.length) {
var tH = line * lH;
var r = this$1._rotate(d, i);
var yP = r === 0 ? vA === "top" ? 0 : vA === "middle" ? h / 2 - tH / 2 : h - tH : 0;
yP -= lH * 0.1;
arr.push({
aH: this$1._ariaHidden(d, i),
data: d,
i: i,
lines: lineData,
fC: this$1._fontColor(d, i),
fF: style["font-family"],
fO: this$1._fontOpacity(d, i),
fW: style["font-weight"],
id: this$1._id(d, i),
tA: this$1._textAnchor(d, i),
vA: this$1._verticalAlign(d, i),
widths: wrapResults.widths,
fS: fS, lH: lH, w: w, h: h, r: r,
x: this$1._x(d, i) + padding.left,
y: this$1._y(d, i) + yP + padding.top
});
}
return arr;
}, []), function (d) { return this$1._id(d.data, d.i); });
var t = Object(d3_transition__WEBPACK_IMPORTED_MODULE_1__["transition"])().duration(this._duration);
if (this._duration === 0) {
boxes.exit().remove();
}
else {
boxes.exit().transition().delay(this._duration).remove();
boxes.exit().selectAll("text").transition(t)
.attr("opacity", 0)
.style("opacity", 0);
}
function rotate(text) {
text.attr("transform", function (d, i) {
var rotateAnchor = that._rotateAnchor(d, i);
return ("translate(" + (d.x) + ", " + (d.y) + ") rotate(" + (d.r) + ", " + (rotateAnchor[0]) + ", " + (rotateAnchor[1]) + ")");
});
}
var update = boxes.enter().append("g")
.attr("class", "d3plus-textBox")
.attr("id", function (d) { return ("d3plus-textBox-" + (Object(_strip__WEBPACK_IMPORTED_MODULE_6__["default"])(d.id))); })
.call(rotate)
.merge(boxes);
var rtl = Object(_rtl__WEBPACK_IMPORTED_MODULE_5__["default"])();
update
.style("pointer-events", function (d) { return this$1._pointerEvents(d.data, d.i); })
.each(function(d) {
/**
Styles to apply to each <text> element.
@private
*/
function textStyle(text) {
text
.text(function (t) { return Object(_trim__WEBPACK_IMPORTED_MODULE_10__["trimRight"])(t); })
.attr("aria-hidden", d.aH)
.attr("dir", rtl ? "rtl" : "ltr")
.attr("fill", d.fC)
.attr("text-anchor", d.tA)
.attr("font-family", d.fF)
.style("font-family", d.fF)
.attr("font-size", ((d.fS) + "px"))
.style("font-size", ((d.fS) + "px"))
.attr("font-weight", d.fW)
.style("font-weight", d.fW)
.attr("x", ((d.tA === "middle" ? d.w / 2 : rtl ? d.tA === "start" ? d.w : 0 : d.tA === "end" ? d.w : 2 * Math.sin(Math.PI * d.r / 180)) + "px"))
.attr("y", function (t, i) { return d.r === 0 || d.vA === "top" ? (((i + 1) * d.lH - (d.lH - d.fS)) + "px") :
d.vA === "middle" ?
(((d.h + d.fS) / 2 - (d.lH - d.fS) + (i - d.lines.length / 2 + 0.5) * d.lH) + "px") :
((d.h - 2 * (d.lH - d.fS) - (d.lines.length - (i + 1)) * d.lH + 2 * Math.cos(Math.PI * d.r / 180)) + "px"); });
}
var texts = Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["select"])(this).selectAll("text").data(d.lines);
if (that._duration === 0) {
texts.call(textStyle);
texts.exit().remove();
texts.enter().append("text")
.attr("dominant-baseline", "alphabetic")
.style("baseline-shift", "0%")
.attr("unicode-bidi", "bidi-override")
.call(textStyle)
.attr("opacity", d.fO)
.style("opacity", d.fO);
}
else {
texts.transition(t).call(textStyle);
texts.exit().transition(t)
.attr("opacity", 0).remove();
texts.enter().append("text")
.attr("dominant-baseline", "alphabetic")
.style("baseline-shift", "0%")
.attr("opacity", 0)
.style("opacity", 0)
.call(textStyle)
.merge(texts).transition(t).delay(that._delay)
.call(textStyle)
.attr("opacity", d.fO)
.style("opacity", d.fO);
}
})
.transition(t).call(rotate);
var events = Object.keys(this._on),
on = events.reduce(function (obj, e) {
obj[e] = function (d, i) { return this$1._on[e](d.data, i); };
return obj;
}, {});
for (var e = 0; e < events.length; e++) { update.on(events[e], on[events[e]]); }
if (callback) { setTimeout(callback, this._duration + 100); }
return this;
};
/**
@memberof TextBox
@desc If *value* is specified, sets the aria-hidden attribute to the specified function or string and returns the current class instance.
@param {Function|String} *value*
@chainable
*/
TextBox.prototype.ariaHidden = function ariaHidden (_) {
return _ !== undefined
? (this._ariaHidden = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this)
: this._ariaHidden;
};
/**
@memberof TextBox
@desc Sets the data array to the specified array. A text box will be drawn for each object in the array.
@param {Array} [*data* = []]
@chainable
*/
TextBox.prototype.data = function data (_) {
return arguments.length ? (this._data = _, this) : this._data;
};
/**
@memberof TextBox
@desc Sets the animation delay to the specified number in milliseconds.
@param {Number} [*value* = 0]
@chainable
*/
TextBox.prototype.delay = function delay (_) {
return arguments.length ? (this._delay = _, this) : this._delay;
};
/**
@memberof TextBox
@desc Sets the animation duration to the specified number in milliseconds.
@param {Number} [*value* = 0]
@chainable
*/
TextBox.prototype.duration = function duration (_) {
return arguments.length ? (this._duration = _, this) : this._duration;
};
/**
@memberof TextBox
@desc Sets the function that handles what to do when a line is truncated. It should return the new value for the line, and is passed 2 arguments: the String of text for the line in question, and the number of the line. By default, an ellipsis is added to the end of any line except if it is the first word that cannot fit (in that case, an empty string is returned).
@param {Function|String} [*value*]
@chainable
@example <caption>default accessor</caption>
function(text, line) {
return line ? text.replace(/\.|,$/g, "") + "..." : "";
}
*/
TextBox.prototype.ellipsis = function ellipsis (_) {
return arguments.length ? (this._ellipsis = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._ellipsis;
};
/**
@memberof TextBox
@desc Sets the font color to the specified accessor function or static string, which is inferred from the [DOM selection](#textBox.select) by default.
@param {Function|String} [*value* = "black"]
@chainable
*/
TextBox.prototype.fontColor = function fontColor (_) {
return arguments.length ? (this._fontColor = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._fontColor;
};
/**
@memberof TextBox
@desc Defines the font-family to be used. The value passed can be either a *String* name of a font, a comma-separated list of font-family fallbacks, an *Array* of fallbacks, or a *Function* that returns either a *String* or an *Array*. If supplying multiple fallback fonts, the [fontExists](#fontExists) function will be used to determine the first available font on the client's machine.
@param {Array|Function|String} [*value* = ["Roboto", "Helvetica Neue", "HelveticaNeue", "Helvetica", "Arial", "sans-serif"]]
@chainable
*/
TextBox.prototype.fontFamily = function fontFamily (_) {
return arguments.length ? (this._fontFamily = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._fontFamily;
};
/**
@memberof TextBox
@desc Sets the maximum font size to the specified accessor function or static number (which corresponds to pixel units), which is used when [dynamically resizing fonts](#textBox.fontResize).
@param {Function|Number} [*value* = 50]
@chainable
*/
TextBox.prototype.fontMax = function fontMax (_) {
return arguments.length ? (this._fontMax = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._fontMax;
};
/**
@memberof TextBox
@desc Sets the minimum font size to the specified accessor function or static number (which corresponds to pixel units), which is used when [dynamically resizing fonts](#textBox.fontResize).
@param {Function|Number} [*value* = 8]
@chainable
*/
TextBox.prototype.fontMin = function fontMin (_) {
return arguments.length ? (this._fontMin = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._fontMin;
};
/**
@memberof TextBox
@desc Sets the font opacity to the specified accessor function or static number between 0 and 1.
@param {Function|Number} [*value* = 1]
@chainable
*/
TextBox.prototype.fontOpacity = function fontOpacity (_) {
return arguments.length ? (this._fontOpacity = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._fontOpacity;
};
/**
@memberof TextBox
@desc Toggles font resizing, which can either be defined as a static boolean for all data points, or an accessor function that returns a boolean. See [this example](http://d3plus.org/examples/d3plus-text/resizing-text/) for a side-by-side comparison.
@param {Function|Boolean} [*value* = false]
@chainable
*/
TextBox.prototype.fontResize = function fontResize (_) {
return arguments.length ? (this._fontResize = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._fontResize;
};
/**
@memberof TextBox
@desc Sets the font size to the specified accessor function or static number (which corresponds to pixel units), which is inferred from the [DOM selection](#textBox.select) by default.
@param {Function|Number} [*value* = 10]
@chainable
*/
TextBox.prototype.fontSize = function fontSize (_) {
return arguments.length ? (this._fontSize = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._fontSize;
};
/**
@memberof TextBox
@desc Sets the font weight to the specified accessor function or static number, which is inferred from the [DOM selection](#textBox.select) by default.
@param {Function|Number|String} [*value* = 400]
@chainable
*/
TextBox.prototype.fontWeight = function fontWeight (_) {
return arguments.length ? (this._fontWeight = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._fontWeight;
};
/**
@memberof TextBox
@desc Sets the height for each box to the specified accessor function or static number.
@param {Function|Number} [*value*]
@chainable
@example <caption>default accessor</caption>
function(d) {
return d.height || 200;
}
*/
TextBox.prototype.height = function height (_) {
return arguments.length ? (this._height = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._height;
};
/**
@memberof TextBox
@desc Defines the unique id for each box to the specified accessor function or static number.
@param {Function|Number} [*value*]
@chainable
@example <caption>default accessor</caption>
function(d, i) {
return d.id || i + "";
}
*/
TextBox.prototype.id = function id (_) {
return arguments.length ? (this._id = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._id;
};
/**
@memberof TextBox
@desc Sets the line height to the specified accessor function or static number, which is 1.2 times the [font size](#textBox.fontSize) by default.
@param {Function|Number} [*value*]
@chainable
*/
TextBox.prototype.lineHeight = function lineHeight (_) {
return arguments.length ? (this._lineHeight = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._lineHeight;
};
/**
@memberof TextBox
@desc Restricts the maximum number of lines to wrap onto, which is null (unlimited) by default.
@param {Function|Number} [*value*]
@chainable
*/
TextBox.prototype.maxLines = function maxLines (_) {
return arguments.length ? (this._maxLines = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._maxLines;
};
/**
@memberof TextBox
@desc Sets the text overflow to the specified accessor function or static boolean.
@param {Function|Boolean} [*value* = false]
@chainable
*/
TextBox.prototype.overflow = function overflow (_) {
return arguments.length ? (this._overflow = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._overflow;
};
/**
@memberof TextBox
@desc Sets the padding to the specified accessor function, CSS shorthand string, or static number, which is 0 by default.
@param {Function|Number|String} [*value*]
@chainable
*/
TextBox.prototype.padding = function padding (_) {
return arguments.length ? (this._padding = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._padding;
};
/**
@memberof TextBox
@desc Sets the pointer-events to the specified accessor function or static string.
@param {Function|String} [*value* = "auto"]
@chainable
*/
TextBox.prototype.pointerEvents = function pointerEvents (_) {
return arguments.length ? (this._pointerEvents = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._pointerEvents;
};
/**
@memberof TextBox
@desc Sets the rotate percentage for each box to the specified accessor function or static string.
@param {Function|Number} [*value* = 0]
@chainable
*/
TextBox.prototype.rotate = function rotate (_) {
return arguments.length ? (this._rotate = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._rotate;
};
/**
@memberof TextBox
@desc Sets the anchor point around which to rotate the text box.
@param {Function|Number[]}
@chainable
*/
TextBox.prototype.rotateAnchor = function rotateAnchor (_) {
return arguments.length ? (this._rotateAnchor = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._rotateAnchor;
};
/**
@memberof TextBox
@desc Sets the SVG container element to the specified d3 selector or DOM element. If not explicitly specified, an SVG element will be added to the page for use.
@param {String|HTMLElement} [*selector*]
@chainable
*/
TextBox.prototype.select = function select$1 (_) {
return arguments.length ? (this._select = Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["select"])(_), this) : this._select;
};
/**
@memberof TextBox
@desc Sets the word split behavior to the specified function, which when passed a string is expected to return that string split into an array of words.
@param {Function} [*value*]
@chainable
*/
TextBox.prototype.split = function split (_) {
return arguments.length ? (this._split = _, this) : this._split;
};
/**
@memberof TextBox
@desc Sets the text for each box to the specified accessor function or static string.
@param {Function|String} [*value*]
@chainable
@example <caption>default accessor</caption>
function(d) {
return d.text;
}
*/
TextBox.prototype.text = function text (_) {
return arguments.length ? (this._text = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._text;
};
/**
@memberof TextBox
@desc Sets the horizontal text anchor to the specified accessor function or static string, whose values are analagous to the SVG [text-anchor](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/text-anchor) property.
@param {Function|String} [*value* = "start"]
@chainable
*/
TextBox.prototype.textAnchor = function textAnchor (_) {
return arguments.length ? (this._textAnchor = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._textAnchor;
};
/**
@memberof TextBox
@desc Sets the vertical alignment to the specified accessor function or static string. Accepts `"top"`, `"middle"`, and `"bottom"`.
@param {Function|String} [*value* = "top"]
@chainable
*/
TextBox.prototype.verticalAlign = function verticalAlign (_) {
return arguments.length ? (this._verticalAlign = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._verticalAlign;
};
/**
@memberof TextBox
@desc Sets the width for each box to the specified accessor function or static number.
@param {Function|Number} [*value*]
@chainable
@example <caption>default accessor</caption>
function(d) {
return d.width || 200;
}
*/
TextBox.prototype.width = function width (_) {
return arguments.length ? (this._width = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._width;
};
/**
@memberof TextBox
@desc Sets the x position for each box to the specified accessor function or static number. The number given should correspond to the left side of the textBox.
@param {Function|Number} [*value*]
@chainable
@example <caption>default accessor</caption>
function(d) {
return d.x || 0;
}
*/
TextBox.prototype.x = function x (_) {
return arguments.length ? (this._x = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._x;
};
/**
@memberof TextBox
@desc Sets the y position for each box to the specified accessor function or static number. The number given should correspond to the top side of the textBox.
@param {Function|Number} [*value*]
@chainable
@example <caption>default accessor</caption>
function(d) {
return d.y || 0;
}
*/
TextBox.prototype.y = function y (_) {
return arguments.length ? (this._y = typeof _ === "function" ? _ : Object(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["constant"])(_), this) : this._y;
};
return TextBox;
}(d3plus_common__WEBPACK_IMPORTED_MODULE_3__["BaseClass"]));
/* harmony default export */ __webpack_exports__["default"] = (TextBox);
//# sourceMappingURL=TextBox.js.map
/***/ }),
/***/ "./node_modules/d3plus-text/es/src/combiningMarks.js":
/*!***********************************************************!*\
!*** ./node_modules/d3plus-text/es/src/combiningMarks.js ***!
\***********************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
// scraped from http://www.fileformat.info/info/unicode/category/Mc/list.htm
// and http://www.fileformat.info/info/unicode/category/Mn/list.htm
// JSON.stringify([].slice.call(document.getElementsByClassName("table-list")[0].getElementsByTagName("tr")).filter(function(d){ return d.getElementsByTagName("a").length && d.getElementsByTagName("a")[0].innerHTML.length === 6; }).map(function(d){ return d.getElementsByTagName("a")[0].innerHTML.replace("U", "u").replace("+", ""); }).sort());
// The following unicode characters combine to form new characters and should never be split from surrounding characters.
var a = ["u0903", "u093B", "u093E", "u093F", "u0940", "u0949", "u094A", "u094B", "u094C", "u094E", "u094F", "u0982", "u0983", "u09BE", "u09BF", "u09C0", "u09C7", "u09C8", "u09CB", "u09CC", "u09D7", "u0A03", "u0A3E", "u0A3F", "u0A40", "u0A83", "u0ABE", "u0ABF", "u0AC0", "u0AC9", "u0ACB", "u0ACC", "u0B02", "u0B03", "u0B3E", "u0B40", "u0B47", "u0B48", "u0B4B", "u0B4C", "u0B57", "u0BBE", "u0BBF", "u0BC1", "u0BC2", "u0BC6", "u0BC7", "u0BC8", "u0BCA", "u0BCB", "u0BCC", "u0BD7", "u0C01", "u0C02", "u0C03", "u0C41", "u0C42", "u0C43", "u0C44", "u0C82", "u0C83", "u0CBE", "u0CC0", "u0CC1", "u0CC2", "u0CC3", "u0CC4", "u0CC7", "u0CC8", "u0CCA", "u0CCB", "u0CD5", "u0CD6", "u0D02", "u0D03", "u0D3E", "u0D3F", "u0D40", "u0D46", "u0D47", "u0D48", "u0D4A", "u0D4B", "u0D4C", "u0D57", "u0D82", "u0D83", "u0DCF", "u0DD0", "u0DD1", "u0DD8", "u0DD9", "u0DDA", "u0DDB", "u0DDC", "u0DDD", "u0DDE", "u0DDF", "u0DF2", "u0DF3", "u0F3E", "u0F3F", "u0F7F", "u102B", "u102C", "u1031", "u1038", "u103B", "u103C", "u1056", "u1057", "u1062", "u1063", "u1064", "u1067", "u1068", "u1069", "u106A", "u106B", "u106C", "u106D", "u1083", "u1084", "u1087", "u1088", "u1089", "u108A", "u108B", "u108C", "u108F", "u109A", "u109B", "u109C", "u17B6", "u17BE", "u17BF", "u17C0", "u17C1", "u17C2", "u17C3", "u17C4", "u17C5", "u17C7", "u17C8", "u1923", "u1924", "u1925", "u1926", "u1929", "u192A", "u192B", "u1930", "u1931", "u1933", "u1934", "u1935", "u1936", "u1937", "u1938", "u1A19", "u1A1A", "u1A55", "u1A57", "u1A61", "u1A63", "u1A64", "u1A6D", "u1A6E", "u1A6F", "u1A70", "u1A71", "u1A72", "u1B04", "u1B35", "u1B3B", "u1B3D", "u1B3E", "u1B3F", "u1B40", "u1B41", "u1B43", "u1B44", "u1B82", "u1BA1", "u1BA6", "u1BA7", "u1BAA", "u1BE7", "u1BEA", "u1BEB", "u1BEC", "u1BEE", "u1BF2", "u1BF3", "u1C24", "u1C25", "u1C26", "u1C27", "u1C28", "u1C29", "u1C2A", "u1C2B", "u1C34", "u1C35", "u1CE1", "u1CF2", "u1CF3", "u302E", "u302F", "uA823", "uA824", "uA827", "uA880", "uA881", "uA8B4", "uA8B5", "uA8B6", "uA8B7", "uA8B8", "uA8B9", "uA8BA", "uA8BB", "uA8BC", "uA8BD", "uA8BE", "uA8BF", "uA8C0", "uA8C1", "uA8C2", "uA8C3", "uA952", "uA953", "uA983", "uA9B4", "uA9B5", "uA9BA", "uA9BB", "uA9BD", "uA9BE", "uA9BF", "uA9C0", "uAA2F", "uAA30", "uAA33", "uAA34", "uAA4D", "uAA7B", "uAA7D", "uAAEB", "uAAEE", "uAAEF", "uAAF5", "uABE3", "uABE4", "uABE6", "uABE7", "uABE9", "uABEA", "uABEC"];
var b = ["u0300", "u0301", "u0302", "u0303", "u0304", "u0305", "u0306", "u0307", "u0308", "u0309", "u030A", "u030B", "u030C", "u030D", "u030E", "u030F", "u0310", "u0311", "u0312", "u0313", "u0314", "u0315", "u0316", "u0317", "u0318", "u0319", "u031A", "u031B", "u031C", "u031D", "u031E", "u031F", "u0320", "u0321", "u0322", "u0323", "u0324", "u0325", "u0326", "u0327", "u0328", "u0329", "u032A", "u032B", "u032C", "u032D", "u032E", "u032F", "u0330", "u0331", "u0332", "u0333", "u0334", "u0335", "u0336", "u0337", "u0338", "u0339", "u033A", "u033B", "u033C", "u033D", "u033E", "u033F", "u0340", "u0341", "u0342", "u0343", "u0344", "u0345", "u0346", "u0347", "u0348", "u0349", "u034A", "u034B", "u034C", "u034D", "u034E", "u034F", "u0350", "u0351", "u0352", "u0353", "u0354", "u0355", "u0356", "u0357", "u0358", "u0359", "u035A", "u035B", "u035C", "u035D", "u035E", "u035F", "u0360", "u0361", "u0362", "u0363", "u0364", "u0365", "u0366", "u0367", "u0368", "u0369", "u036A", "u036B", "u036C", "u036D", "u036E", "u036F", "u0483", "u0484", "u0485", "u0486", "u0487", "u0591", "u0592", "u0593", "u0594", "u0595", "u0596", "u0597", "u0598", "u0599", "u059A", "u059B", "u059C", "u059D", "u059E", "u059F", "u05A0", "u05A1", "u05A2", "u05A3", "u05A4", "u05A5", "u05A6", "u05A7", "u05A8", "u05A9", "u05AA", "u05AB", "u05AC", "u05AD", "u05AE", "u05AF", "u05B0", "u05B1", "u05B2", "u05B3", "u05B4", "u05B5", "u05B6", "u05B7", "u05B8", "u05B9", "u05BA", "u05BB", "u05BC", "u05BD", "u05BF", "u05C1", "u05C2", "u05C4", "u05C5", "u05C7", "u0610", "u0611", "u0612", "u0613", "u0614", "u0615", "u0616", "u0617", "u0618", "u0619", "u061A", "u064B", "u064C", "u064D", "u064E", "u064F", "u0650", "u0651", "u0652", "u0653", "u0654", "u0655", "u0656", "u0657", "u0658", "u0659", "u065A", "u065B", "u065C", "u065D", "u065E", "u065F", "u0670", "u06D6", "u06D7", "u06D8", "u06D9", "u06DA", "u06DB", "u06DC", "u06DF", "u06E0", "u06E1", "u06E2", "u06E3", "u06E4", "u06E7", "u06E8", "u06EA", "u06EB", "u06EC", "u06ED", "u0711", "u0730", "u0731", "u0732", "u0733", "u0734", "u0735", "u0736", "u0737", "u0738", "u0739", "u073A", "u073B", "u073C", "u073D", "u073E", "u073F", "u0740", "u0741", "u0742", "u0743", "u0744", "u0745", "u0746", "u0747", "u0748", "u0749", "u074A", "u07A6", "u07A7", "u07A8", "u07A9", "u07AA", "u07AB", "u07AC", "u07AD", "u07AE", "u07AF", "u07B0", "u07EB", "u07EC", "u07ED", "u07EE", "u07EF", "u07F0", "u07F1", "u07F2", "u07F3", "u0816", "u0817", "u0818", "u0819", "u081B", "u081C", "u081D", "u081E", "u081F", "u0820", "u0821", "u0822", "u0823", "u0825", "u0826", "u0827", "u0829", "u082A", "u082B", "u082C", "u082D", "u0859", "u085A", "u085B", "u08E3", "u08E4", "u08E5", "u08E6", "u08E7", "u08E8", "u08E9", "u08EA", "u08EB", "u08EC", "u08ED", "u08EE", "u08EF", "u08F0", "u08F1", "u08F2", "u08F3", "u08F4", "u08F5", "u08F6", "u08F7", "u08F8", "u08F9", "u08FA", "u08FB", "u08FC", "u08FD", "u08FE", "u08FF", "u0900", "u0901", "u0902", "u093A", "u093C", "u0941", "u0942", "u0943", "u0944", "u0945", "u0946", "u0947", "u0948", "u094D", "u0951", "u0952", "u0953", "u0954", "u0955", "u0956", "u0957", "u0962", "u0963", "u0981", "u09BC", "u09C1", "u09C2", "u09C3", "u09C4", "u09CD", "u09E2", "u09E3", "u0A01", "u0A02", "u0A3C", "u0A41", "u0A42", "u0A47", "u0A48", "u0A4B", "u0A4C", "u0A4D", "u0A51", "u0A70", "u0A71", "u0A75", "u0A81", "u0A82", "u0ABC", "u0AC1", "u0AC2", "u0AC3", "u0AC4", "u0AC5", "u0AC7", "u0AC8", "u0ACD", "u0AE2", "u0AE3", "u0B01", "u0B3C", "u0B3F", "u0B41", "u0B42", "u0B43", "u0B44", "u0B4D", "u0B56", "u0B62", "u0B63", "u0B82", "u0BC0", "u0BCD", "u0C00", "u0C3E", "u0C3F", "u0C40", "u0C46", "u0C47", "u0C48", "u0C4A", "u0C4B", "u0C4C", "u0C4D", "u0C55", "u0C56", "u0C62", "u0C63", "u0C81", "u0CBC", "u0CBF", "u0CC6", "u0CCC", "u0CCD", "u0CE2", "u0CE3", "u0D01", "u0D41", "u0D42", "u0D43", "u0D44", "u0D4D", "u0D62", "u0D63", "u0DCA", "u0DD2", "u0DD3", "u0DD4", "u0DD6", "u0E31", "u0E34", "u0E35", "u0E36", "u0E37", "u0E38", "u0E39", "u0E3A", "u0E47", "u0E48", "u0E49", "u0E4A", "u0E4B", "u0E4C", "u0E4D", "u0E4E", "u0EB1", "u0EB4", "u0EB5", "u0EB6", "u0EB7", "u0EB8", "u0EB9", "u0EBB", "u0EBC", "u0EC8", "u0EC9", "u0ECA", "u0ECB", "u0ECC", "u0ECD", "u0F18", "u0F19", "u0F35", "u0F37", "u0F39", "u0F71", "u0F72", "u0F73", "u0F74", "u0F75", "u0F76", "u0F77", "u0F78", "u0F79", "u0F7A", "u0F7B", "u0F7C", "u0F7D", "u0F7E", "u0F80", "u0F81", "u0F82", "u0F83", "u0F84", "u0F86", "u0F87", "u0F8D", "u0F8E", "u0F8F", "u0F90", "u0F91", "u0F92", "u0F93", "u0F94", "u0F95", "u0F96", "u0F97", "u0F99", "u0F9A", "u0F9B", "u0F9C", "u0F9D", "u0F9E", "u0F9F", "u0FA0", "u0FA1", "u0FA2", "u0FA3", "u0FA4", "u0FA5", "u0FA6", "u0FA7", "u0FA8", "u0FA9", "u0FAA", "u0FAB", "u0FAC", "u0FAD", "u0FAE", "u0FAF", "u0FB0", "u0FB1", "u0FB2", "u0FB3", "u0FB4", "u0FB5", "u0FB6", "u0FB7", "u0FB8", "u0FB9", "u0FBA", "u0FBB", "u0FBC", "u0FC6", "u102D", "u102E", "u102F", "u1030", "u1032", "u1033", "u1034", "u1035", "u1036", "u1037", "u1039", "u103A", "u103D", "u103E", "u1058", "u1059", "u105E", "u105F", "u1060", "u1071", "u1072", "u1073", "u1074", "u1082", "u1085", "u1086", "u108D", "u109D", "u135D", "u135E", "u135F", "u1712", "u1713", "u1714", "u1732", "u1733", "u1734", "u1752", "u1753", "u1772", "u1773", "u17B4", "u17B5", "u17B7", "u17B8", "u17B9", "u17BA", "u17BB", "u17BC", "u17BD", "u17C6", "u17C9", "u17CA", "u17CB", "u17CC", "u17CD", "u17CE", "u17CF", "u17D0", "u17D1", "u17D2", "u17D3", "u17DD", "u180B", "u180C", "u180D", "u18A9", "u1920", "u1921", "u1922", "u1927", "u1928", "u1932", "u1939", "u193A", "u193B", "u1A17", "u1A18", "u1A1B", "u1A56", "u1A58", "u1A59", "u1A5A", "u1A5B", "u1A5C", "u1A5D", "u1A5E", "u1A60", "u1A62", "u1A65", "u1A66", "u1A67", "u1A68", "u1A69", "u1A6A", "u1A6B", "u1A6C", "u1A73", "u1A74", "u1A75", "u1A76", "u1A77", "u1A78", "u1A79", "u1A7A", "u1A7B", "u1A7C", "u1A7F", "u1AB0", "u1AB1", "u1AB2", "u1AB3", "u1AB4", "u1AB5", "u1AB6", "u1AB7", "u1AB8", "u1AB9", "u1ABA", "u1ABB", "u1ABC", "u1ABD", "u1B00", "u1B01", "u1B02", "u1B03", "u1B34", "u1B36", "u1B37", "u1B38", "u1B39", "u1B3A", "u1B3C", "u1B42", "u1B6B", "u1B6C", "u1B6D", "u1B6E", "u1B6F", "u1B70", "u1B71", "u1B72", "u1B73", "u1B80", "u1B81", "u1BA2", "u1BA3", "u1BA4", "u1BA5", "u1BA8", "u1BA9", "u1BAB", "u1BAC", "u1BAD", "u1BE6", "u1BE8", "u1BE9", "u1BED", "u1BEF", "u1BF0", "u1BF1", "u1C2C", "u1C2D", "u1C2E", "u1C2F", "u1C30", "u1C31", "u1C32", "u1C33", "u1C36", "u1C37", "u1CD0", "u1CD1", "u1CD2", "u1CD4", "u1CD5", "u1CD6", "u1CD7", "u1CD8", "u1CD9", "u1CDA", "u1CDB", "u1CDC", "u1CDD", "u1CDE", "u1CDF", "u1CE0", "u1CE2", "u1CE3", "u1CE4", "u1CE5", "u1CE6", "u1CE7", "u1CE8", "u1CED", "u1CF4", "u1CF8", "u1CF9", "u1DC0", "u1DC1", "u1DC2", "u1DC3", "u1DC4", "u1DC5", "u1DC6", "u1DC7", "u1DC8", "u1DC9", "u1DCA", "u1DCB", "u1DCC", "u1DCD", "u1DCE", "u1DCF", "u1DD0", "u1DD1", "u1DD2", "u1DD3", "u1DD4", "u1DD5", "u1DD6", "u1DD7", "u1DD8", "u1DD9", "u1DDA", "u1DDB", "u1DDC", "u1DDD", "u1DDE", "u1DDF", "u1DE0", "u1DE1", "u1DE2", "u1DE3", "u1DE4", "u1DE5", "u1DE6", "u1DE7", "u1DE8", "u1DE9", "u1DEA", "u1DEB", "u1DEC", "u1DED", "u1DEE", "u1DEF", "u1DF0", "u1DF1", "u1DF2", "u1DF3", "u1DF4", "u1DF5", "u1DFC", "u1DFD", "u1DFE", "u1DFF", "u20D0", "u20D1", "u20D2", "u20D3", "u20D4", "u20D5", "u20D6", "u20D7", "u20D8", "u20D9", "u20DA", "u20DB", "u20DC", "u20E1", "u20E5", "u20E6", "u20E7", "u20E8", "u20E9", "u20EA", "u20EB", "u20EC", "u20ED", "u20EE", "u20EF", "u20F0", "u2CEF", "u2CF0", "u2CF1", "u2D7F", "u2DE0", "u2DE1", "u2DE2", "u2DE3", "u2DE4", "u2DE5", "u2DE6", "u2DE7", "u2DE8", "u2DE9", "u2DEA", "u2DEB", "u2DEC", "u2DED", "u2DEE", "u2DEF", "u2DF0", "u2DF1", "u2DF2", "u2DF3", "u2DF4", "u2DF5", "u2DF6", "u2DF7", "u2DF8", "u2DF9", "u2DFA", "u2DFB", "u2DFC", "u2DFD", "u2DFE", "u2DFF", "u302A", "u302B", "u302C", "u302D", "u3099", "u309A", "uA66F", "uA674", "uA675", "uA676", "uA677", "uA678", "uA679", "uA67A", "uA67B", "uA67C", "uA67D", "uA69E", "uA69F", "uA6F0", "uA6F1", "uA802", "uA806", "uA80B", "uA825", "uA826", "uA8C4", "uA8E0", "uA8E1", "uA8E2", "uA8E3", "uA8E4", "uA8E5", "uA8E6", "uA8E7", "uA8E8", "uA8E9", "uA8EA", "uA8EB", "uA8EC", "uA8ED", "uA8EE", "uA8EF", "uA8F0", "uA8F1", "uA926", "uA927", "uA928", "uA929", "uA92A", "uA92B", "uA92C", "uA92D", "uA947", "uA948", "uA949", "uA94A", "uA94B", "uA94C", "uA94D", "uA94E", "uA94F", "uA950", "uA951", "uA980", "uA981", "uA982", "uA9B3", "uA9B6", "uA9B7", "uA9B8", "uA9B9", "uA9BC", "uA9E5", "uAA29", "uAA2A", "uAA2B", "uAA2C", "uAA2D", "uAA2E", "uAA31", "uAA32", "uAA35", "uAA36", "uAA43", "uAA4C", "uAA7C", "uAAB0", "uAAB2", "uAAB3", "uAAB4", "uAAB7", "uAAB8", "uAABE", "uAABF", "uAAC1", "uAAEC", "uAAED", "uAAF6", "uABE5", "uABE8", "uABED", "uFB1E", "uFE00", "uFE01", "uFE02", "uFE03", "uFE04", "uFE05", "uFE06", "uFE07", "uFE08", "uFE09", "uFE0A", "uFE0B", "uFE0C", "uFE0D", "uFE0E", "uFE0F", "uFE20", "uFE21", "uFE22", "uFE23", "uFE24", "uFE25", "uFE26", "uFE27", "uFE28", "uFE29", "uFE2A", "uFE2B", "uFE2C", "uFE2D", "uFE2E", "uFE2F"];
/* harmony default export */ __webpack_exports__["default"] = (a.concat(b));
//# sourceMappingURL=combiningMarks.js.map
/***/ }),
/***/ "./node_modules/d3plus-text/es/src/fontExists.js":
/*!*******************************************************!*\
!*** ./node_modules/d3plus-text/es/src/fontExists.js ***!
\*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _textWidth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./textWidth */ "./node_modules/d3plus-text/es/src/textWidth.js");
/* harmony import */ var _trim__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./trim */ "./node_modules/d3plus-text/es/src/trim.js");
var alpha = "abcdefghiABCDEFGHI_!@#$%^&*()_+1234567890",
checked = {},
height = 32;
var dejavu, macos, monospace, proportional;
/**
@function fontExists
@desc Given either a single font-family or a list of fonts, returns the name of the first font that can be rendered, or `false` if none are installed on the user's machine.
@param {String|Array} font Can be either a valid CSS font-family string (single or comma-separated names) or an Array of string names.
*/
var fontExists = function (font) {
if (!dejavu) {
dejavu = Object(_textWidth__WEBPACK_IMPORTED_MODULE_0__["default"])(alpha, {"font-family": "DejaVuSans", "font-size": height});
macos = Object(_textWidth__WEBPACK_IMPORTED_MODULE_0__["default"])(alpha, {"font-family": "-apple-system", "font-size": height});
monospace = Object(_textWidth__WEBPACK_IMPORTED_MODULE_0__["default"])(alpha, {"font-family": "monospace", "font-size": height});
proportional = Object(_textWidth__WEBPACK_IMPORTED_MODULE_0__["default"])(alpha, {"font-family": "sans-serif", "font-size": height});
}
if (!(font instanceof Array)) { font = font.split(","); }
font = font.map(function (f) { return Object(_trim__WEBPACK_IMPORTED_MODULE_1__["trim"])(f); });
for (var i = 0; i < font.length; i++) {
var fam = font[i];
if (checked[fam] || ["-apple-system", "monospace", "sans-serif", "DejaVuSans"].includes(fam)) { return fam; }
else if (checked[fam] === false) { continue; }
var width = Object(_textWidth__WEBPACK_IMPORTED_MODULE_0__["default"])(alpha, {"font-family": fam, "font-size": height});
checked[fam] = width !== monospace;
if (checked[fam]) { checked[fam] = width !== proportional; }
if (macos && checked[fam]) { checked[fam] = width !== macos; }
if (dejavu && checked[fam]) { checked[fam] = width !== dejavu; }
if (checked[fam]) { return fam; }
}
return false;
};
/* harmony default export */ __webpack_exports__["default"] = (fontExists);
//# sourceMappingURL=fontExists.js.map
/***/ }),
/***/ "./node_modules/d3plus-text/es/src/rtl.js":
/*!************************************************!*\
!*** ./node_modules/d3plus-text/es/src/rtl.js ***!
\************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
/**
@function rtl
@desc Returns `true` if the HTML or body element has either the "dir" HTML attribute or the "direction" CSS property set to "rtl".
*/
/* harmony default export */ __webpack_exports__["default"] = (function () { return Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["select"])("html").attr("dir") === "rtl" ||
Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["select"])("body").attr("dir") === "rtl" ||
Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["select"])("html").style("direction") === "rtl" ||
Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["select"])("body").style("direction") === "rtl"; });;
//# sourceMappingURL=rtl.js.map
/***/ }),
/***/ "./node_modules/d3plus-text/es/src/stringify.js":
/*!******************************************************!*\
!*** ./node_modules/d3plus-text/es/src/stringify.js ***!
\******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/**
@function stringify
@desc Coerces value into a String.
@param {String} value
*/
/* harmony default export */ __webpack_exports__["default"] = (function(value) {
if (value === void 0) { value = "undefined"; }
else if (!(typeof value === "string" || value instanceof String)) { value = JSON.stringify(value); }
return value;
});
//# sourceMappingURL=stringify.js.map
/***/ }),
/***/ "./node_modules/d3plus-text/es/src/strip.js":
/*!**************************************************!*\
!*** ./node_modules/d3plus-text/es/src/strip.js ***!
\**************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
// great unicode list: http://asecuritysite.com/coding/asc2
var diacritics = [
[/[\300-\305]/g, "A"], [/[\340-\345]/g, "a"],
[/[\306]/g, "AE"], [/[\346]/g, "ae"],
[/[\337]/g, "B"],
[/[\307]/g, "C"], [/[\347]/g, "c"],
[/[\320\336\376]/g, "D"], [/[\360]/g, "d"],
[/[\310-\313]/g, "E"], [/[\350-\353]/g, "e"],
[/[\314-\317]/g, "I"], [/[\354-\357]/g, "i"],
[/[\321]/g, "N"], [/[\361]/g, "n"],
[/[\322-\326\330]/g, "O"], [/[\362-\366\370]/g, "o"],
[/[\331-\334]/g, "U"], [/[\371-\374]/g, "u"],
[/[\327]/g, "x"],
[/[\335]/g, "Y"], [/[\375\377]/g, "y"]
];
/**
@function strip
@desc Removes all non ASCII characters from a string.
@param {String} value
*/
/* harmony default export */ __webpack_exports__["default"] = (function(value) {
return ("" + value).replace(/[^A-Za-z0-9\-_]/g, function (char) {
if (char === " ") { return "-"; }
var ret = false;
for (var d = 0; d < diacritics.length; d++) {
if (new RegExp(diacritics[d][0]).test(char)) {
ret = diacritics[d][1];
break;
}
}
return ret || "";
});
});
//# sourceMappingURL=strip.js.map
/***/ }),
/***/ "./node_modules/d3plus-text/es/src/textSplit.js":
/*!******************************************************!*\
!*** ./node_modules/d3plus-text/es/src/textSplit.js ***!
\******************************************************/
/*! exports provided: default, prefixChars, splitChars, splitWords, suffixChars */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prefixChars", function() { return prefixChars; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "splitChars", function() { return splitChars; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "splitWords", function() { return splitWords; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "suffixChars", function() { return suffixChars; });
/* harmony import */ var _stringify__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./stringify */ "./node_modules/d3plus-text/es/src/stringify.js");
/* harmony import */ var _combiningMarks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./combiningMarks */ "./node_modules/d3plus-text/es/src/combiningMarks.js");
/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
var splitChars = ["-", "/", ";", ":", "&",
"u0E2F", // thai character pairannoi
"u0EAF", // lao ellipsis
"u0EC6", // lao ko la (word repetition)
"u0ECC", // lao cancellation mark
"u104A", // myanmar sign little section
"u104B", // myanmar sign section
"u104C", // myanmar symbol locative
"u104D", // myanmar symbol completed
"u104E", // myanmar symbol aforementioned
"u104F", // myanmar symbol genitive
"u2013", // en dash
"u2014", // em dash
"u2027", // simplified chinese hyphenation point
"u3000", // simplified chinese ideographic space
"u3001", // simplified chinese ideographic comma
"u3002", // simplified chinese ideographic full stop
"uFF0C", // full-width comma
"uFF5E" // wave dash
];
var prefixChars = ["'", "<", "(", "{", "[",
"u00AB", // left-pointing double angle quotation mark
"u300A", // left double angle bracket
"u3008" // left angle bracket
];
var suffixChars = ["'", ">", ")", "}", "]", ".", "!", "?",
"u00BB", // right-pointing double angle quotation mark
"u300B", // right double angle bracket
"u3009" // right angle bracket
].concat(splitChars);
var burmeseRange = "\u1000-\u102A\u103F-\u1049\u1050-\u1055";
var japaneseRange = "\u3040-\u309f\u30a0-\u30ff\uff00-\uff0b\uff0d-\uff5d\uff5f-\uff9f\u3400-\u4dbf";
var chineseRange = "\u3400-\u9FBF";
var laoRange = "\u0E81-\u0EAE\u0EB0-\u0EC4\u0EC8-\u0ECB\u0ECD-\u0EDD";
var noSpaceRange = burmeseRange + chineseRange + japaneseRange + laoRange;
var splitWords = new RegExp(("(\\" + (splitChars.join("|\\")) + ")*[^\\s|\\" + (splitChars.join("|\\")) + "]*(\\" + (splitChars.join("|\\")) + ")*"), "g");
var noSpaceLanguage = new RegExp(("[" + noSpaceRange + "]"));
var splitAllChars = new RegExp(("(\\" + (prefixChars.join("|\\")) + ")*[" + noSpaceRange + "](\\" + (suffixChars.join("|\\")) + "|\\" + (_combiningMarks__WEBPACK_IMPORTED_MODULE_1__["default"].join("|\\")) + ")*|[a-z0-9]+"), "gi");
/**
@function textSplit
@desc Splits a given sentence into an array of words.
@param {String} sentence
*/
/* harmony default export */ __webpack_exports__["default"] = (function(sentence) {
if (!noSpaceLanguage.test(sentence)) { return Object(_stringify__WEBPACK_IMPORTED_MODULE_0__["default"])(sentence).match(splitWords).filter(function (w) { return w.length; }); }
return Object(d3_array__WEBPACK_IMPORTED_MODULE_2__["merge"])(Object(_stringify__WEBPACK_IMPORTED_MODULE_0__["default"])(sentence).match(splitWords).map(function (d) {
if (noSpaceLanguage.test(d)) { return d.match(splitAllChars); }
return [d];
}));
});
//# sourceMappingURL=textSplit.js.map
/***/ }),
/***/ "./node_modules/d3plus-text/es/src/textWidth.js":
/*!******************************************************!*\
!*** ./node_modules/d3plus-text/es/src/textWidth.js ***!
\******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/**
@function textWidth
@desc Given a text string, returns the predicted pixel width of the string when placed into DOM.
@param {String|Array} text Can be either a single string or an array of strings to analyze.
@param {Object} [style] An object of CSS font styles to apply. Accepts any of the valid [CSS font property](http://www.w3schools.com/cssref/pr_font_font.asp) values.
*/
/* harmony default export */ __webpack_exports__["default"] = (function(text, style) {
style = Object.assign({
"font-size": 10,
"font-family": "sans-serif",
"font-style": "normal",
"font-weight": 400,
"font-variant": "normal"
}, style);
var context = document.createElement("canvas").getContext("2d");
var font = [];
font.push(style["font-style"]);
font.push(style["font-variant"]);
font.push(style["font-weight"]);
font.push(typeof style["font-size"] === "string" ? style["font-size"] : ((style["font-size"]) + "px"));
// let s = `${style["font-size"]}px`;
// if ("line-height" in style) s += `/${style["line-height"]}px`;
// font.push(s);
font.push(style["font-family"]);
context.font = font.join(" ");
if (text instanceof Array) { return text.map(function (t) { return context.measureText(t).width; }); }
return context.measureText(text).width;
});
//# sourceMappingURL=textWidth.js.map
/***/ }),
/***/ "./node_modules/d3plus-text/es/src/textWrap.js":
/*!*****************************************************!*\
!*** ./node_modules/d3plus-text/es/src/textWrap.js ***!
\*****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _textWidth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./textWidth */ "./node_modules/d3plus-text/es/src/textWidth.js");
/* harmony import */ var _textSplit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./textSplit */ "./node_modules/d3plus-text/es/src/textSplit.js");
/* harmony import */ var _stringify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stringify */ "./node_modules/d3plus-text/es/src/stringify.js");
/* harmony import */ var _trim__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./trim */ "./node_modules/d3plus-text/es/src/trim.js");
/**
@function textWrap
@desc Based on the defined styles and dimensions, breaks a string into an array of strings for each line of text.
*/
/* harmony default export */ __webpack_exports__["default"] = (function() {
var fontFamily = "sans-serif",
fontSize = 10,
fontWeight = 400,
height = 200,
lineHeight,
maxLines = null,
overflow = false,
split = _textSplit__WEBPACK_IMPORTED_MODULE_1__["default"],
width = 200;
/**
The inner return object and wraps the text and returns the line data array.
@private
*/
function textWrap(sentence) {
sentence = Object(_stringify__WEBPACK_IMPORTED_MODULE_2__["default"])(sentence);
if (lineHeight === void 0) { lineHeight = Math.ceil(fontSize * 1.4); }
var words = split(sentence);
var style = {
"font-family": fontFamily,
"font-size": fontSize,
"font-weight": fontWeight,
"line-height": lineHeight
};
var line = 1,
textProg = "",
truncated = false,
widthProg = 0;
var lineData = [],
sizes = Object(_textWidth__WEBPACK_IMPORTED_MODULE_0__["default"])(words, style),
space = Object(_textWidth__WEBPACK_IMPORTED_MODULE_0__["default"])(" ", style);
for (var i = 0; i < words.length; i++) {
var word = words[i];
var wordWidth = sizes[words.indexOf(word)];
word += sentence.slice(textProg.length + word.length).match("^( |\n)*", "g")[0];
if (textProg.slice(-1) === "\n" || widthProg + wordWidth > width) {
if (!i && !overflow) {
truncated = true;
break;
}
lineData[line - 1] = Object(_trim__WEBPACK_IMPORTED_MODULE_3__["trimRight"])(lineData[line - 1]);
line++;
if (lineHeight * line > height || wordWidth > width && !overflow || maxLines && line > maxLines) {
truncated = true;
break;
}
widthProg = 0;
lineData.push(word);
}
else if (!i) { lineData[0] = word; }
else { lineData[line - 1] += word; }
textProg += word;
widthProg += wordWidth;
widthProg += word.match(/[\s]*$/g)[0].length * space;
}
return {
lines: lineData,
sentence: sentence, truncated: truncated,
widths: Object(_textWidth__WEBPACK_IMPORTED_MODULE_0__["default"])(lineData, style),
words: words
};
}
/**
@memberof textWrap
@desc If *value* is specified, sets the font family accessor to the specified function or string and returns this generator. If *value* is not specified, returns the current font family.
@param {Function|String} [*value* = "sans-serif"]
*/
textWrap.fontFamily = function(_) {
return arguments.length ? (fontFamily = _, textWrap) : fontFamily;
};
/**
@memberof textWrap
@desc If *value* is specified, sets the font size accessor to the specified function or number and returns this generator. If *value* is not specified, returns the current font size.
@param {Function|Number} [*value* = 10]
*/
textWrap.fontSize = function(_) {
return arguments.length ? (fontSize = _, textWrap) : fontSize;
};
/**
@memberof textWrap
@desc If *value* is specified, sets the font weight accessor to the specified function or number and returns this generator. If *value* is not specified, returns the current font weight.
@param {Function|Number|String} [*value* = 400]
*/
textWrap.fontWeight = function(_) {
return arguments.length ? (fontWeight = _, textWrap) : fontWeight;
};
/**
@memberof textWrap
@desc If *value* is specified, sets height limit to the specified value and returns this generator. If *value* is not specified, returns the current value.
@param {Number} [*value* = 200]
*/
textWrap.height = function(_) {
return arguments.length ? (height = _, textWrap) : height;
};
/**
@memberof textWrap
@desc If *value* is specified, sets the line height accessor to the specified function or number and returns this generator. If *value* is not specified, returns the current line height accessor, which is 1.1 times the [font size](#textWrap.fontSize) by default.
@param {Function|Number} [*value*]
*/
textWrap.lineHeight = function(_) {
return arguments.length ? (lineHeight = _, textWrap) : lineHeight;
};
/**
@memberof textWrap
@desc If *value* is specified, sets the maximum number of lines allowed when wrapping.
@param {Function|Number} [*value*]
*/
textWrap.maxLines = function(_) {
return arguments.length ? (maxLines = _, textWrap) : maxLines;
};
/**
@memberof textWrap
@desc If *value* is specified, sets the overflow to the specified boolean and returns this generator. If *value* is not specified, returns the current overflow value.
@param {Boolean} [*value* = false]
*/
textWrap.overflow = function(_) {
return arguments.length ? (overflow = _, textWrap) : overflow;
};
/**
@memberof textWrap
@desc If *value* is specified, sets the word split function to the specified function and returns this generator. If *value* is not specified, returns the current word split function.
@param {Function} [*value*] A function that, when passed a string, is expected to return that string split into an array of words to textWrap. The default split function splits strings on the following characters: `-`, `/`, `;`, `:`, `&`
*/
textWrap.split = function(_) {
return arguments.length ? (split = _, textWrap) : split;
};
/**
@memberof textWrap
@desc If *value* is specified, sets width limit to the specified value and returns this generator. If *value* is not specified, returns the current value.
@param {Number} [*value* = 200]
*/
textWrap.width = function(_) {
return arguments.length ? (width = _, textWrap) : width;
};
return textWrap;
});
//# sourceMappingURL=textWrap.js.map
/***/ }),
/***/ "./node_modules/d3plus-text/es/src/titleCase.js":
/*!******************************************************!*\
!*** ./node_modules/d3plus-text/es/src/titleCase.js ***!
\******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _textSplit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./textSplit */ "./node_modules/d3plus-text/es/src/textSplit.js");
var lowercase = ["a", "an", "and", "as", "at", "but", "by", "for", "from", "if", "in", "into", "near", "nor", "of", "on", "onto", "or", "per", "that", "the", "to", "with", "via", "vs", "vs."];
var uppercase = ["CEO", "CFO", "CNC", "COO", "CPU", "GDP", "HVAC", "ID", "IT", "R&D", "TV", "UI"];
/**
@function titleCase
@desc Capitalizes the first letter of each word in a phrase/sentence.
@param {String} str The string to apply the title case logic.
*/
/* harmony default export */ __webpack_exports__["default"] = (function(str) {
if (str === void 0) { return ""; }
var smalls = lowercase.map(function (s) { return s.toLowerCase(); });
var bigs = uppercase.slice();
bigs = bigs.concat(bigs.map(function (b) { return (b + "s"); }));
var biglow = bigs.map(function (b) { return b.toLowerCase(); });
var split = Object(_textSplit__WEBPACK_IMPORTED_MODULE_0__["default"])(str);
return split.map(function (s, i) {
if (s) {
var lower = s.toLowerCase();
var stripped = _textSplit__WEBPACK_IMPORTED_MODULE_0__["suffixChars"].includes(lower.charAt(lower.length - 1)) ? lower.slice(0, -1) : lower;
var bigindex = biglow.indexOf(stripped);
if (bigindex >= 0) { return bigs[bigindex]; }
else if (smalls.includes(stripped) && i !== 0 && i !== split.length - 1) { return lower; }
else { return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase(); }
}
else { return ""; }
}).reduce(function (ret, s, i) {
if (i && str.charAt(ret.length) === " ") { ret += " "; }
ret += s;
return ret;
}, "");
});
//# sourceMappingURL=titleCase.js.map
/***/ }),
/***/ "./node_modules/d3plus-text/es/src/trim.js":
/*!*************************************************!*\
!*** ./node_modules/d3plus-text/es/src/trim.js ***!
\*************************************************/
/*! exports provided: trim, trimLeft, trimRight */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "trim", function() { return trim; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "trimLeft", function() { return trimLeft; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "trimRight", function() { return trimRight; });
/**
@function trim
@desc Cross-browser implementation of [trim](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim).
@param {String} str
*/
function trim(str) {
return str.replace(/^\s+|\s+$/g, "");
}
/**
@function trimLeft
@desc Cross-browser implementation of [trimLeft](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/TrimLeft).
@param {String} str
*/
function trimLeft(str) {
return str.replace(/^\s+/, "");
}
/**
@function trimRight
@desc Cross-browser implementation of [trimRight](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/TrimRight).
@param {String} str
*/
function trimRight(str) {
return str.replace(/\s+$/, "");
}
//# sourceMappingURL=trim.js.map
/***/ }),
/***/ "./node_modules/events/events.js":
/*!***************************************!*\
!*** ./node_modules/events/events.js ***!
\***************************************/
/*! no static exports found */
/***/ (function(module, exports) {
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
function EventEmitter() {
this._events = this._events || {};
this._maxListeners = this._maxListeners || undefined;
}
module.exports = EventEmitter;
// Backwards-compat with node 0.10.x
EventEmitter.EventEmitter = EventEmitter;
EventEmitter.prototype._events = undefined;
EventEmitter.prototype._maxListeners = undefined;
// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
EventEmitter.defaultMaxListeners = 10;
// Obviously not all Emitters should be limited to 10. This function allows
// that to be increased. Set to zero for unlimited.
EventEmitter.prototype.setMaxListeners = function(n) {
if (!isNumber(n) || n < 0 || isNaN(n))
throw TypeError('n must be a positive number');
this._maxListeners = n;
return this;
};
EventEmitter.prototype.emit = function(type) {
var er, handler, len, args, i, listeners;
if (!this._events)
this._events = {};
// If there is no 'error' event listener then throw.
if (type === 'error') {
if (!this._events.error ||
(isObject(this._events.error) && !this._events.error.length)) {
er = arguments[1];
if (er instanceof Error) {
throw er; // Unhandled 'error' event
} else {
// At least give some kind of context to the user
var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
err.context = er;
throw err;
}
}
}
handler = this._events[type];
if (isUndefined(handler))
return false;
if (isFunction(handler)) {
switch (arguments.length) {
// fast cases
case 1:
handler.call(this);
break;
case 2:
handler.call(this, arguments[1]);
break;
case 3:
handler.call(this, arguments[1], arguments[2]);
break;
// slower
default:
args = Array.prototype.slice.call(arguments, 1);
handler.apply(this, args);
}
} else if (isObject(handler)) {
args = Array.prototype.slice.call(arguments, 1);
listeners = handler.slice();
len = listeners.length;
for (i = 0; i < len; i++)
listeners[i].apply(this, args);
}
return true;
};
EventEmitter.prototype.addListener = function(type, listener) {
var m;
if (!isFunction(listener))
throw TypeError('listener must be a function');
if (!this._events)
this._events = {};
// To avoid recursion in the case that type === "newListener"! Before
// adding it to the listeners, first emit "newListener".
if (this._events.newListener)
this.emit('newListener', type,
isFunction(listener.listener) ?
listener.listener : listener);
if (!this._events[type])
// Optimize the case of one listener. Don't need the extra array object.
this._events[type] = listener;
else if (isObject(this._events[type]))
// If we've already got an array, just append.
this._events[type].push(listener);
else
// Adding the second element, need to change to array.
this._events[type] = [this._events[type], listener];
// Check for listener leak
if (isObject(this._events[type]) && !this._events[type].warned) {
if (!isUndefined(this._maxListeners)) {
m = this._maxListeners;
} else {
m = EventEmitter.defaultMaxListeners;
}
if (m && m > 0 && this._events[type].length > m) {
this._events[type].warned = true;
console.error('(node) warning: possible EventEmitter memory ' +
'leak detected. %d listeners added. ' +
'Use emitter.setMaxListeners() to increase limit.',
this._events[type].length);
if (typeof console.trace === 'function') {
// not supported in IE 10
console.trace();
}
}
}
return this;
};
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
EventEmitter.prototype.once = function(type, listener) {
if (!isFunction(listener))
throw TypeError('listener must be a function');
var fired = false;
function g() {
this.removeListener(type, g);
if (!fired) {
fired = true;
listener.apply(this, arguments);
}
}
g.listener = listener;
this.on(type, g);
return this;
};
// emits a 'removeListener' event iff the listener was removed
EventEmitter.prototype.removeListener = function(type, listener) {
var list, position, length, i;
if (!isFunction(listener))
throw TypeError('listener must be a function');
if (!this._events || !this._events[type])
return this;
list = this._events[type];
length = list.length;
position = -1;
if (list === listener ||
(isFunction(list.listener) && list.listener === listener)) {
delete this._events[type];
if (this._events.removeListener)
this.emit('removeListener', type, listener);
} else if (isObject(list)) {
for (i = length; i-- > 0;) {
if (list[i] === listener ||
(list[i].listener && list[i].listener === listener)) {
position = i;
break;
}
}
if (position < 0)
return this;
if (list.length === 1) {
list.length = 0;
delete this._events[type];
} else {
list.splice(position, 1);
}
if (this._events.removeListener)
this.emit('removeListener', type, listener);
}
return this;
};
EventEmitter.prototype.removeAllListeners = function(type) {
var key, listeners;
if (!this._events)
return this;
// not listening for removeListener, no need to emit
if (!this._events.removeListener) {
if (arguments.length === 0)
this._events = {};
else if (this._events[type])
delete this._events[type];
return this;
}
// emit removeListener for all listeners on all events
if (arguments.length === 0) {
for (key in this._events) {
if (key === 'removeListener') continue;
this.removeAllListeners(key);
}
this.removeAllListeners('removeListener');
this._events = {};
return this;
}
listeners = this._events[type];
if (isFunction(listeners)) {
this.removeListener(type, listeners);
} else if (listeners) {
// LIFO order
while (listeners.length)
this.removeListener(type, listeners[listeners.length - 1]);
}
delete this._events[type];
return this;
};
EventEmitter.prototype.listeners = function(type) {
var ret;
if (!this._events || !this._events[type])
ret = [];
else if (isFunction(this._events[type]))
ret = [this._events[type]];
else
ret = this._events[type].slice();
return ret;
};
EventEmitter.prototype.listenerCount = function(type) {
if (this._events) {
var evlistener = this._events[type];
if (isFunction(evlistener))
return 1;
else if (evlistener)
return evlistener.length;
}
return 0;
};
EventEmitter.listenerCount = function(emitter, type) {
return emitter.listenerCount(type);
};
function isFunction(arg) {
return typeof arg === 'function';
}
function isNumber(arg) {
return typeof arg === 'number';
}
function isObject(arg) {
return typeof arg === 'object' && arg !== null;
}
function isUndefined(arg) {
return arg === void 0;
}
/***/ }),
/***/ "./src/index.js":
/*!**********************!*\
!*** ./src/index.js ***!
\**********************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _js_BoxedTree__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./js/BoxedTree */ "./src/js/BoxedTree.js");
/* harmony import */ var _js_CircleTree__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/CircleTree */ "./src/js/CircleTree.js");
/* harmony default export */ __webpack_exports__["default"] = ({
boxedTree: _js_BoxedTree__WEBPACK_IMPORTED_MODULE_0__["default"],
circleTree: _js_CircleTree__WEBPACK_IMPORTED_MODULE_1__["default"]
});
/***/ }),
/***/ "./src/js/BaseTree.js":
/*!****************************!*\
!*** ./src/js/BaseTree.js ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _CustomD3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CustomD3 */ "./src/js/CustomD3.js");
/* harmony import */ var _NodeSettings__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./NodeSettings */ "./src/js/NodeSettings.js");
/* harmony import */ var _LoadOnDemandSettings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./LoadOnDemandSettings */ "./src/js/LoadOnDemandSettings.js");
/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! events */ "./node_modules/events/events.js");
/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_3__);
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
/**
* Recursively find a particular object within a hierarchical dataset.
*
* @param {object} hierarchicalObject The initial hierarchical object to start the recursive find.
* @param {function} getChildren The callback function that gets the children items of the hierarchical object.
* @param {function} findCondition The callback function that defines whether the object matches the condition to be returned or not.
* @returns {object|null} The first object matching the conditions.
*/
function recursiveFind(hierarchicalObject, getChildren, findCondition) {
if (findCondition(hierarchicalObject)) return hierarchicalObject;
var children = getChildren(hierarchicalObject);
var foundNode = children.find(findCondition);
if (!foundNode) {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = children[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var child = _step.value;
foundNode = recursiveFind(child, getChildren, findCondition);
if (foundNode) break;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
return foundNode;
}
/**
* Recursively gets a set of objects within a hierarchical dataset.
*
* @param {object} hierarchicalObject The initial hierarchical object to start the recursive get.
* @param {function} getChildren The callback function that gets the children items of the hierarchical object.
*/
function recursiveGet(hierarchicalObject, getChildren) {
var allItems = [];
var children = getChildren(hierarchicalObject);
if (children) {
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = children[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var child = _step2.value;
allItems.push(child);
var descendants = recursiveGet(child, getChildren);
if (descendants) allItems = [].concat(_toConsumableArray(allItems), _toConsumableArray(descendants));
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
}
return allItems;
}
var BaseTree =
/*#__PURE__*/
function (_EventEmitter) {
_inherits(BaseTree, _EventEmitter);
/**
* @param {object} options The options object.
* @param {string} [options.theme=default] The theme of the tree.
* @param {string} [options.orientation=leftToRight] The orientation of the tree.
* @param {boolean} [options.allowPan=true] Enables/disables the mouse drag to pan feature.
* @param {boolean} [options.allowZoom=true] Enables/disables the mouse wheel to zoom feature.
* @param {boolean} [options.allowFocus=true] If true, clicking on a node would focus to the node, hiding all irrelevant nodes that's not a parent, ancestor, or sibling.
* @param {boolean} [options.allowNodeCentering=true] If true, clicking on a node would pan to the node.
* @param {number} [options.minScale=1] Minimum zoom scaling.
* @param {number} [options.maxScale=2] Maximum zoom scaling.
* @param {number} [options.nodeDepthMultiplier=300] The distance between the parent and child nodes.
* @param {boolean} [options.isFlatData=false] Indicates whether the passed data was a flat array of objects. If true, you must specify the `getParentId` option.
* @param {getIdCallBack} options.getId
* @param {getParentIdCallBack} [options.getParentId]
* @param {getChildrenCallBack} [options.getChildren]
* @param {number} [options.widthWithoutMargins=960] The width of the tree, not including the margins.
* @param {number} [options.heightWithoutMargins=800] The height of the tree, not including the margins.
* @param {object} [options.margins] Object specifying the margins of the tree diagram.
* @param {number} [options.margins.top] The top margin for the tree diagram.
* @param {number} [options.margins.right] The right margin for the tree diagram.
* @param {number} [options.margins.bottom] The bottom margin for the tree diagram.
* @param {number} [options.margins.left] The left margin for the tree diagram.
* @param {number} [options.duration] Integer in milliseconds determining the duration of the animations for the tree.
* @param {LoadOnDemandSettings} [options.loadOnDemandSettings] Object specifying the load-on-demand settings.
* @param {NodeSettings} [options.nodeSettings] Object specifying the node settings for the tree.
*/
function BaseTree(options) {
var _this;
_classCallCheck(this, BaseTree);
_this = _possibleConstructorReturn(this, _getPrototypeOf(BaseTree).call(this));
options = options || {}; // Defaults options to an empty object
var mergedOptions = _objectSpread({}, BaseTree.defaults, options); // We define our prototype properties which would be set later
_this._root = null;
_this._svg = null;
_this._panningContainer = null, _this._view = null;
_this._treeGenerator = null;
_this._linkPathGenerator = null;
_this._visibleNodes = null;
_this._links = null;
_this._zoomListener = null, // Assign/Set prototype properties, using values passed from the options object
_this.setTheme(mergedOptions.theme);
_this.setOrientation(mergedOptions.orientation);
_this.setData(mergedOptions.data);
_this.setElement(mergedOptions.element);
_this.setWidthWithoutMargins(mergedOptions.widthWithoutMargins);
_this.setHeightWithoutMargins(mergedOptions.heightWithoutMargins);
_this.setMargins(mergedOptions.margins);
_this.setDuration(mergedOptions.duration);
_this.setAllowPan(mergedOptions.allowPan);
_this.setAllowZoom(mergedOptions.allowZoom);
_this.setAllowFocus(mergedOptions.allowFocus);
_this.setAllowNodeCentering(mergedOptions.allowNodeCentering);
_this.setMinScale(mergedOptions.minScale);
_this.setMaxScale(mergedOptions.maxScale);
_this.setIsFlatData(mergedOptions.isFlatData);
_this.setNodeDepthMultiplier(mergedOptions.nodeDepthMultiplier); // We define our sub-prototype (AKA sub-class) properties
_this.loadOnDemandSettings = new _LoadOnDemandSettings__WEBPACK_IMPORTED_MODULE_2__["default"](_assertThisInitialized(_assertThisInitialized(_this)), mergedOptions.loadOnDemandSettings);
_this.nodeSettings = new _NodeSettings__WEBPACK_IMPORTED_MODULE_1__["default"](_assertThisInitialized(_assertThisInitialized(_this)), mergedOptions.nodeSettings); // We define our methods, which derives from our options
_this._getId = mergedOptions.getId;
_this._getChildren = mergedOptions.getChildren;
_this._getParentId = mergedOptions.getParentId;
return _this;
}
/**
* Defines how to create the nodes for newly
* added data objects.
*
* @param {*} nodeEnter The D3 Enter selection of nodes.
* @param {*} nodes
* @returns {object} The tree object.
*/
_createClass(BaseTree, [{
key: "_nodeEnter",
value: function _nodeEnter(nodeEnter, nodes) {
throw 'The function _nodeEnter must be implemented';
}
/**
* Defines how to update the nodes for the
* data objects.
*
* @param {*} nodeUpdate The D3 Update selection of nodes.
* @param {*} nodeUpdateTransition The D3 transition object for the D3 Update selection of nodes.
* @param {*} nodes
* @returns {object} The tree object.
*/
}, {
key: "_nodeUpdate",
value: function _nodeUpdate(nodeUpdate, nodeUpdateTransition, nodes) {
throw 'The function _nodeUpdate must be implemented';
}
/**
* Defines how to remove the nodes for the
* removed data objects.
*
* @param {*} nodeExit The D3 Exit selection of nodes.
* @param {*} nodeExitTransition The D3 transition object for the D3 Exit selection of nodes.
* @param {*} nodes
* @returns {object} The tree object.
*/
}, {
key: "_nodeExit",
value: function _nodeExit(nodeExit, nodeExitTransition, nodes) {
throw 'The function _nodeExit must be implemented';
}
/**
* Gets the path generator used to render
* the links between the nodes.
*
* @returns {function} The callback function that generates the SVG path coordinates for the links, given a coordinates object.
*/
}, {
key: "_getLinkPathGenerator",
value: function _getLinkPathGenerator() {
throw 'The function _getLinkPathGenerator must be implemented';
}
/**
* Defines how to create the links for newly
* added data objects.
*
* @param {*} source The original data object that the links are being drawn for.
* @param {*} linkEnter The D3 Enter selection of links.
* @param {*} links
* @param {*} linkPathGenerator
* @returns {object} The tree object.
*/
}, {
key: "_linkEnter",
value: function _linkEnter(source, linkEnter, links, linkPathGenerator) {
throw 'The function _linkEnter must be implemented';
}
/**
* Defines how to update the links for the
* data objects.
*
* @param {*} source The original data object that the links are being drawn for.
* @param {*} linkUpdate The D3 Update selection of links.
* @param {*} linkUpdateTransition The D3 transition object for the D3 Update selection of links.
* @param {*} links
* @param {*} linkPathGenerator The link path generator function.
* @returns {object} The tree object.
*/
}, {
key: "_linkUpdate",
value: function _linkUpdate(source, linkUpdate, linkUpdateTransition, links, linkPathGenerator) {
throw 'The function _linkUpdate must be implemented';
}
/**
* Defines how to remove the links for the
* removed data objects.
*
* @param {object} source The original data object that the links are being drawn for.
* @param {*} linkExit The D3 Exit selection of links.
* @param {*} linkExitTransition The D3 transition object for the D3 Update selection of links.
* @param {*} links
* @param {*} linkPathGenerator The link path generator function.
* @returns {object} The tree object.
*/
}, {
key: "_linkExit",
value: function _linkExit(source, linkExit, linkExitTransition, links, linkPathGenerator) {
throw 'The function _linkExit must be implemented';
}
/**
* Called when updating dimensions when
* node settings is configured to be
* 'nodesize'.
*
* @returns {number[]} An array with two values, representing the height and width of the node respectively.
*/
}, {
key: "_getNodeSize",
value: function _getNodeSize() {
throw 'The function _getNodeSize must be implemented';
}
/**
* Focuses and expands all the way through to a node.
*
* @param {*} idOrNodeDataItem The id of the node to focus, or the node data item object.
* @returns {object} The tree object.
*/
}, {
key: "focusToNode",
value: function focusToNode(idOrNodeDataItem) {
this.removeSelection(this.getRoot());
var nodeDataItem = idOrNodeDataItem;
if (_typeof(nodeDataItem) !== 'object' && nodeDataItem !== null) nodeDataItem = this.getNode(nodeDataItem);
var parentNode = null; // Expand every parent/ancestor node
parentNode = nodeDataItem.parent;
while (parentNode) {
if (parentNode._children) this.expand(parentNode);
parentNode = parentNode.parent;
}
if (this.getAllowFocus()) {
// Hide the parent/ancestor node siblings
parentNode = nodeDataItem.parent;
while (parentNode) {
this.hideSiblings(parentNode);
parentNode = parentNode.parent;
}
this.updateTreeWithFocusOnNode(nodeDataItem);
nodeDataItem.selected = true;
}
this.update(this.getRoot());
this.centerNode(nodeDataItem);
return this;
}
/**
* Returns a boolean whether the
* tree is using flat data or not.
*
* @returns {boolean} Whether the tree is using flat data or not.
*/
}, {
key: "getIsFlatData",
value: function getIsFlatData() {
return this._isFlatData;
}
/**
* Sets the is flat data flag.
* If set to true, you must specify
* the `getParentId` option.
*
* @param {boolean} newIsFlatData Whether the tree is using flat data or not.
*/
}, {
key: "setIsFlatData",
value: function setIsFlatData(newIsFlatData) {
this._isFlatData = newIsFlatData;
return this;
}
/**
* Regenerates the node data.
*
* @returns {object} The tree object.
*/
}, {
key: "regenerateNodeData",
value: function regenerateNodeData() {
var _this2 = this;
// Assigns parent, children, height, depth
if (!this.getIsFlatData()) {
if (!this._getChildren) throw "If you are providing hierarchical structured data, then you must set the getChildren accessor property."; // Specify your children property here,
// so that D3's resulting root object
// has a mapping from its "children" property
// to your specified children property
this._root = _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].hierarchy(this.getData(), function (data) {
return _this2.getChildren.call(_this2, data);
});
} else {
if (!this._getParentId) throw "If you are providing flat structured data, then you must set the getParentId accessor property."; // stratifier is a function that would convert the flat
// dataset into hierarchically structured data
// to be used with D3 trees.
// It accepts the dataset as its parameter,
// and returns the converted data.
// Note that this is used instead of the d3.hierarchy()
// method as d3.hierarchy() should only be used if the
// data is already in heirarchical structure, and
// needs to be converted to D3 hierarchical nodes
var stratifier = _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].stratify().id(function (data, index, arr) {
return _this2.getId.call(_this2, data);
}).parentId(function (data, index, arr) {
return _this2.getParentId.call(_this2, data);
});
this._root = stratifier(this.getData());
}
return this;
}
/**
* Gets the tree theme.
*
* @returns {string} The theme the tree is using.
*/
}, {
key: "getTheme",
value: function getTheme() {
return this._theme;
}
/**
* Sets the tree theme.
*
* @param {string} theme The theme to set the tree to.
* @returns {object} The tree object.
*/
}, {
key: "setTheme",
value: function setTheme(theme) {
this._theme = theme;
return this;
}
/**
* Gets the tree orientation.
*
* @returns {string} The orientation the tree is using.
*/
}, {
key: "getOrientation",
value: function getOrientation() {
return this._orientation;
}
/**
* Sets the tree orientation.
*
* @param {string} orientation The orientation to set the tree to.
* @returns {object} The tree object.
*/
}, {
key: "setOrientation",
value: function setOrientation(orientation) {
this._orientation = orientation;
return this;
}
/**
* Gets the data items used to render
* the nodes.
*
* @returns {object[]} The array of data items the tree uses.
*/
}, {
key: "getData",
value: function getData() {
return this._data;
}
/**
* Sets the data items the tree should
* use to render the nodes.
*
* @param {object[]} newData The new set of data items.
* @returns {object} The tree object.
*/
}, {
key: "setData",
value: function setData(newData) {
this._data = newData;
return this;
}
/**
* Gets the node depth multiplier that
* affects the distance between the
* parent node and the child node.
*
* @returns {number} The node depth multiplier value
*/
}, {
key: "getNodeDepthMultiplier",
value: function getNodeDepthMultiplier() {
return this._nodeDepthMultiplier;
}
/**
* Sets the node depth multiplier value.
*
* @param {number} newNodeDepthMultiplier The value that affects the distance between the parent node and the child node.
* @returns {object} The tree object.
*/
}, {
key: "setNodeDepthMultiplier",
value: function setNodeDepthMultiplier(newNodeDepthMultiplier) {
this._nodeDepthMultiplier = newNodeDepthMultiplier;
return this;
}
/**
* Gets the duration of animations
* for the tree.
*
* @returns {number} The animation duration in milliseconds.
*/
}, {
key: "getDuration",
value: function getDuration() {
return this._duration;
}
/**
* Sets the duration of animations
* for the tree.
*
* @param {*} newDuration The animation duration in milliseconds.
* @returns {object} The tree object.
*/
}, {
key: "setDuration",
value: function setDuration(newDuration) {
this._duration = newDuration;
return this;
}
/**
* Gets the boolean value indicating
* whether the drag-to-pan pan feature
* is enabled or not.
*
* @returns {boolean} Whether panning is enabled or not.
*/
}, {
key: "getAllowPan",
value: function getAllowPan() {
return this._allowPan;
}
/**
* Sets the boolean value indicating
* whether the drag-to-pan pan feature
* is enabled or not.
*
* @param {*} newAllowPan Whether panning is enabled or not.
* @returns {object} The tree object.
*/
}, {
key: "setAllowPan",
value: function setAllowPan(newAllowPan) {
this._allowPan = newAllowPan;
return this;
}
/**
* Gets the boolean value indicating
* whether the mouse wheel to zoom in/out
* feature is enabled or not.
*
* @returns {boolean} Whether zooming is enabled or not.
*/
}, {
key: "getAllowZoom",
value: function getAllowZoom() {
return this._allowZoom;
}
/**
* Sets the boolean value indicating
* whether the mouse wheel to zoom in/out
* feature is enabled or not.
*
* @param {boolean} newAllowZoom Whether zooming is enabled or not.
* @returns {object} The tree object.
*/
}, {
key: "setAllowZoom",
value: function setAllowZoom(newAllowZoom) {
this._allowZoom = newAllowZoom;
return this;
}
/**
* Gets the boolean value indicating
* whether to focus to the clicked node
* or not. Focusing on a node would hide
* all irrelevant nodes that's not a
* parent, sibling or ancestor of the
* clicked node.
*
* @returns {boolean} Whether to focus to the clicked node.
*/
}, {
key: "getAllowFocus",
value: function getAllowFocus() {
return this._allowFocus;
}
/**
* Sets the boolean value indicating
* whether to focus to the clicked node
* or not. Focusing on a node would hide
* all irrelevant nodes that's not a
* parent, sibling or ancestor of the
* clicked node.
*
* @param {boolean} newAllowFocus Whether to pan to the clicked node.
* @returns {object} The tree object.
*/
}, {
key: "setAllowFocus",
value: function setAllowFocus(newAllowFocus) {
this._allowFocus = newAllowFocus;
return this;
}
/**
* Gets the boolean value indicating
* whether to pan to a clicked node.
*
* @returns {boolean} Whether to pan to the clicked node.
*/
}, {
key: "getAllowNodeCentering",
value: function getAllowNodeCentering() {
return this._allowNodeCentering;
}
/**
* Whether to pan to a clicked node.
*
* @param {boolean} newAllowNodeCentering Whether to pan to the clicked node.
* @returns {object} The tree object.
*/
}, {
key: "setAllowNodeCentering",
value: function setAllowNodeCentering(newAllowNodeCentering) {
this._allowNodeCentering = newAllowNodeCentering;
return this;
}
/**
* Gets the minimum zoom scaling.
*
* @returns {number} The minimum zoom scale value.
*/
}, {
key: "getMinScale",
value: function getMinScale() {
return this._minScale;
}
/**
* Sets the minimum zoom scaling.
*
* @param {*} newMinScale The minimum zoom scale value.
* @returns {object} The tree object.
*/
}, {
key: "setMinScale",
value: function setMinScale(newMinScale) {
this._minScale = newMinScale;
return this;
}
/**
* Gets the maximum zoom scaling.
*
* @returns {number} Maximum zoom scale value.
*/
}, {
key: "getMaxScale",
value: function getMaxScale() {
return this._maxScale;
}
/**
* Sets the maximum zoom scaling.
*
* @param {*} newMaxScale The maximum zoom scale value.
* @returns {object} The tree object.
*/
}, {
key: "setMaxScale",
value: function setMaxScale(newMaxScale) {
this._maxScale = newMaxScale;
return this;
}
/**
* Gets the load on demand settings object.
*
* @returns {LoadOnDemandSettings} The load on demand settings.
*/
}, {
key: "getLoadOnDemandSettings",
value: function getLoadOnDemandSettings() {
return this.loadOnDemandSettings;
}
/**
* Gets the node settings object.
*
* @returns {NodeSettings} The node settings.
*/
}, {
key: "getNodeSettings",
value: function getNodeSettings() {
return this.nodeSettings;
}
/**
* Gets the container DOM element.
*
* @returns {object} The container DOM element.
*/
}, {
key: "getElement",
value: function getElement() {
return this._element;
}
/**
* Sets the container DOM element
*
* @param {object} newElement The container DOM element.
* @returns {object} The tree object.
*/
}, {
key: "setElement",
value: function setElement(newElement) {
this._element = newElement;
return this;
}
/**
* Gets the root node object.
*
* @return {object} The root D3 tree node object.
*/
}, {
key: "getRoot",
value: function getRoot() {
return this._root;
}
/**
* Gets the D3 selection object for the SVG element.
*
* @return {object} Returns the D3 selection object.
*/
}, {
key: "getSvg",
value: function getSvg() {
return this._svg;
}
/**
* Gets the D3 selection object for the view element.
*
* @returns {object} D3 selection object for the view element.
*/
}, {
key: "getView",
value: function getView() {
return this._view;
}
/**
* Gets the D3 selection object for the
* panning container element.
*
* @returns {object} D3 selection object for the panning container element.
*/
}, {
key: "getPanningContainer",
value: function getPanningContainer() {
return this._panningContainer;
}
/**
* Gets the D3 generator object used to
* generate the tree nodes coordinates.
*
* @returns {function} D3 tree generator object.
*/
}, {
key: "getTreeGenerator",
value: function getTreeGenerator() {
return this._treeGenerator;
}
/**
* Get a single node given an id or a data item.
*
* @param {*|object} idOrDataItem The ID or data item to retrieve the D3 tree node data item with.
* @returns {object} D3 tree node data item.
*/
}, {
key: "getNode",
value: function getNode(idOrDataItem) {
var _this3 = this;
var id = idOrDataItem;
if (_typeof(id) === 'object' && id !== null) id = this.getId(id);
var rootNode = this.getRoot();
var getNodeChildren = function getNodeChildren(node) {
if (node._children) return node._children;
return [];
};
var node = recursiveFind(rootNode, getNodeChildren, function (x) {
return _this3.getId(x.data) == id;
});
return node;
}
/**
* Get a single data item given an id.
*
* @param {*} id The ID to retrieve the data item with.
* @returns {object} The data item with the given ID.
*/
}, {
key: "getDataItem",
value: function getDataItem(id) {
var node = this.getNode(id);
return node.data;
}
/**
* Get the array of D3 node data items
* the D3 tree has generated.
*
* @returns {object[]} Array of D3 node data items.
*/
}, {
key: "getNodes",
value: function getNodes() {
return this._nodes;
}
/**
* Get the array of visible D3 node
* data items the D3 tree has generated.
*
* @returns {object[]} Array of D3 node data items.
*/
}, {
key: "getVisibleNodes",
value: function getVisibleNodes() {
return this._visibleNodes;
}
/**
* Get the array of D3 link data items
* the D3 tree has generated.
*
* @returns {object[]} Array of D3 link data items.
*/
}, {
key: "getLinks",
value: function getLinks() {
return this._links;
}
/**
* Gets the D3 zoom listener used for
* the panning, zooming and focus features.
*
* @returns {function} The D3 zoom listener
*/
}, {
key: "getZoomListener",
value: function getZoomListener() {
return this._zoomListener;
}
/**
* Gets the ID for a given data item.
*
* @param {object} dataItem The data item to get the ID from.
* @returns {*} The ID for the given data item.
*/
}, {
key: "getId",
value: function getId(dataItem) {
return this._getId(dataItem);
}
/**
* Gets the children data items for a given data item.
*
* @param {object} dataItem The data item to get the children data items from.
* @returns {object[]} The array of child data items.
*/
}, {
key: "getChildren",
value: function getChildren(dataItem) {
return this._getChildren(dataItem);
}
/**
* Gets the parent ID for a given data item.
*
* @param {object} dataItem The data item to get the parent ID from.
* @returns {*} The parent ID for the given data item.
*/
}, {
key: "getParentId",
value: function getParentId(dataItem) {
return this._getParentId(dataItem);
}
/**
* Sets the ID accessor callback function,
* defining how to get a unique ID from a
* given data item.
*
* @param {getIdCallBack} newIdAccessor Callback function to get the ID for a given data item.
* @returns {object} The tree object.
*/
}, {
key: "setIdAccessor",
value: function setIdAccessor(newIdAccessor) {
this._getId = newIdAccessor;
return this;
}
/**
* Sets the children accessor callback function,
* defining how to get the children data items
* from a given data item.
*
* @param {getChildrenCallBack} newChildrenAccessor Callback function to get the children for a given data item.
* @returns {object} The tree object.
*/
}, {
key: "setChildrenAccessor",
value: function setChildrenAccessor(newChildrenAccessor) {
this._getChildren = newChildrenAccessor;
return this;
}
/**
* Sets the parent ID accessor callback function,
* defining how to get the parent ID from a
* given data item.
*
* @param {getParentIdCallBack} newParentIdAccessor Callback function to get the parent id for a given data item.
* @returns {object} The tree object.
*/
}, {
key: "setParentIdAccessor",
value: function setParentIdAccessor(newParentIdAccessor) {
this._getParentId = newParentIdAccessor;
return this;
}
/**
* Gets the width of SVG, including the margins.
*
* @returns {number} The width of the SVG.
*/
}, {
key: "getWidth",
value: function getWidth() {
return this.getWidthWithoutMargins() - this.getMargins().left - this.getMargins().right;
}
/**
* Gets the height of SVG, including the margins.
*
* @returns {number} The height of the SVG.
*/
}, {
key: "getHeight",
value: function getHeight() {
return this.getHeightWithoutMargins() - this.getMargins().top - this.getMargins().bottom;
}
/**
* Sets the margins for the tree diagram.
*
* @param {object} newMargins The margin object.
* @param {number} newMargins.top The margin top for the tree diagram.
* @param {number} newMargins.right The margin right for the tree diagram.
* @param {number} newMargins.bottom The margin bottom for the tree diagram.
* @param {number} newMargins.left The margin left for the tree diagram.
* @returns {object} The tree object.
*/
}, {
key: "setMargins",
value: function setMargins(newMargins) {
this._margins = newMargins;
return this;
}
/**
* Gets the margins for the tree diagram.
*
* @returns {object} The margins object.
*/
}, {
key: "getMargins",
value: function getMargins() {
return this._margins;
}
/**
* Sets the width of the SVG for the tree diagram.
*
* @param {*} newWidthWithoutMargin The width of SVG for the tree diagram.
* @returns {object} The tree object.
*/
}, {
key: "setWidthWithoutMargins",
value: function setWidthWithoutMargins(newWidthWithoutMargin) {
this._widthWithoutMargin = newWidthWithoutMargin;
return this;
}
/**
* Gets the width of the SVG for the tree diagram.
* Does not include the margins.
*
* @returns {number} The width (not including the margins) of the SVG for the tree diagram.
*/
}, {
key: "getWidthWithoutMargins",
value: function getWidthWithoutMargins() {
return this._widthWithoutMargin;
}
/**
* Sets the height of the SVG for the tree diagram.
*
* @param {*} newHeightWithoutMargin The height of SVG for the tree diagram.
* @returns {object} The tree object.
*/
}, {
key: "setHeightWithoutMargins",
value: function setHeightWithoutMargins(newHeightWithoutMargin) {
this._heightWithoutMargin = newHeightWithoutMargin;
return this;
}
/**
* Gets the height of the SVG for the tree diagram.
* Does not include the margins.
*
* @returns {number} The height (not including the margins) of the SVG for the tree diagram.
*/
}, {
key: "getHeightWithoutMargins",
value: function getHeightWithoutMargins() {
return this._heightWithoutMargin;
}
/**
* Updates the dimensions of the SVG.
*
* @returns {object} The tree object.
*/
}, {
key: "updateDimensions",
value: function updateDimensions() {
// Update SVG with new width and height
this.getSvg() // Use viewBox to set SVG width and height
// so it is responsive, and can be resized
// based on the parent element
.attr("viewBox", "0 0 " + this.getWidthWithoutMargins() + " " + this.getHeightWithoutMargins());
var margins = this.getMargins();
var needToCenterView = false; // update the tree generator with the new width and height
var sizingMode = this.nodeSettings.getSizingMode();
if (typeof sizingMode === 'string') sizingMode = sizingMode.trim().toLowerCase();
if (sizingMode === "nodesize") {
this.getTreeGenerator().nodeSize(this._getNodeSize()); // Only perform centering if node centering is turned off,
// as that would center to the root node anyway. Node
// centering is turned on when allow focus is turned on.
if (this.getAllowFocus() === false) needToCenterView = true;
} else {
this.getTreeGenerator().size([this.getHeight(), this.getWidth()]);
}
if (needToCenterView === false) {
// Update the view with the new margins
this.getView().attr("transform", "translate(" + margins.left + "," + margins.top + ")");
} else {
// Move the view downwards as to center the root node
// This is due to when you use node-size, it sets the
// node origin at 0, 0 instead of automatically
// centering it as it does with size()
this.getView().attr("transform", "translate(" + margins.left + ", " + (this.getHeight() / 2 + margins.top) + ")");
} // If we need to center the tree by adjusting the view and the node position
var x0, y0;
if (this.getOrientation() === 'topToBottom') {
if (needToCenterView === false) {
x0 = this.getWidth() / 2;
} else {
x0 = 0;
}
y0 = this.getHeight() / 4;
} else {
if (needToCenterView === false) {
x0 = this.getHeight() / 2;
} else {
x0 = 0;
}
y0 = 0;
}
this.getRoot().x0 = x0;
this.getRoot().y0 = y0;
if (this.getZoomListener()) {
this.getZoomListener().extent([[0, 0], [this.getWidthWithoutMargins(), this.getHeightWithoutMargins()]]);
}
return this;
}
/**
* Validates the settings to ensure the
* tree diagram is ready to be generated.
*
* @returns {object} The tree object.
*/
}, {
key: "validateSettings",
value: function validateSettings() {
// Check to make sure compulsory options are provided
if (!this.getElement()) throw "Need to pass in an element as part of the options";
if (!this.getData()) throw "Need to pass in data as part of the options"; // Checks if mandatory methods to specify exists
if (!this._getId) throw "Need to define the getId function as part of the options";
this.loadOnDemandSettings.validateSettings();
return this;
}
/**
* Creates and set up the the tree diagram.
*
* @returns {object} The tree object.
*/
}, {
key: "initialize",
value: function initialize() {
var _this4 = this;
this.validateSettings();
this.regenerateNodeData();
while (this.getElement().firstChild) {
this.getElement().removeChild(this.getElement().firstChild);
}
; // Create the svg, and set its dimensions
this._svg = _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].select(this.getElement()).append("svg").classed('mitch-d3-tree', true).classed(this.getTheme(), true).attr("preserveAspectRatio", "xMidYMid meet").style("width", "100%").style("height", "100%"); // Create the view with margins
this._view = this.getSvg().append("g").classed("view", true); // Create tree generator to position the nodes
this._treeGenerator = _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].tree(); // Create the panning container which panning should act upon
this._panningContainer = this.getView().append("g").classed("panningContainer", true);
this._zoomListener = _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].zoom() // Limit zoom level
.scaleExtent([this.getMinScale(), this.getMaxScale()]) // Zoom in D3 translates to the native HTML/JS events of:
// - Double Clicking (i.e. to zoom in)
// - Dragging (i.e. panning or moving around)
// - Wheel (i.e. zoom in/out)
.on("zoom", function () {
// The "zoom" event populates d3.event with an object that has
// a "transform" property (an object with three properties
// of x, y, and k), where x and y is for translation purposes,
// and k is the scaling factor
var transform = _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].event.transform;
_this4.getPanningContainer().attr("transform", transform);
});
this.getSvg().call(this.getZoomListener());
if (this.getAllowPan() === false) {
this.getSvg().on("mousedown.zoom", null).on("touchstart.zoom", null).on("touchmove.zoom", null).on("touchend.zoom", null);
}
if (this.getAllowZoom() === false) {
this.getSvg().on("dblclick.zoom", null).on("wheel.zoom", null);
}
this.updateDimensions();
this._populateUnderlyingChildren(this.getRoot());
if (this.getRoot().children) this.getRoot().children.forEach(this.collapseRecursively);
this.removeSelection(this.getRoot()); // Call the first update, which renders
// the initial tree
this.update(this.getRoot()); // Centers the root node
this.centerNode(this.getRoot());
return this;
}
/**
* Expands the given node data item.
*
* @param {object} nodeDataItem The D3 node data item to expand.
* @returns {object} The tree object.
*/
}, {
key: "expand",
value: function expand(nodeDataItem) {
nodeDataItem.children = nodeDataItem._children;
return this;
}
/**
* Expands the given node data item,
* and its children and descendants.
*
* @param {object} nodeDataItem The D3 node data item to expand.
* @returns {object} The tree object.
*/
}, {
key: "expandRecursively",
value: function expandRecursively(nodeDataItem) {
var rec = function recursive(directNodeDataItem) {
if (directNodeDataItem.children) {
directNodeDataItem.children.forEach(recursive);
directNodeDataItem.children = directNodeDataItem._children;
}
};
rec(nodeDataItem);
return this;
}
/**
* Collapses the given node data item.
*
* @param {object} nodeDataItem The D3 node data item to collapse.
* @returns {object} The tree object.
*/
}, {
key: "collapse",
value: function collapse(nodeDataItem) {
nodeDataItem.children = null;
return this;
}
/**
* Collapses the given node data item,
* and its children and descendants.
*
* @param {object} nodeDataItem The D3 node data item to collapse.
* @returns {object} The tree object.
*/
}, {
key: "collapseRecursively",
value: function collapseRecursively(nodeDataItem) {
var rec = function recursive(directNodeDataItem) {
if (directNodeDataItem.children) {
directNodeDataItem.children.forEach(recursive);
directNodeDataItem.children = null;
}
};
rec(nodeDataItem);
return this;
}
/**
* Populates the node's children to a hidden property.
*
* @param {object} nodeDataItem The D3 node data item to collapse.
* @returns {object} The tree object.
*/
}, {
key: "_populateUnderlyingChildren",
value: function _populateUnderlyingChildren(nodeDataItem) {
var rec = function recursive(directNodeDataItem) {
if (directNodeDataItem.children) {
directNodeDataItem._children = directNodeDataItem.children;
directNodeDataItem._children.forEach(recursive);
}
};
rec(nodeDataItem);
return this;
}
/**
* Remove node selections for a given node and it's children.
*
* @param {object} nodeDataItem The D3 node data item to remove selection from.
* @returns {object} The tree object.
*/
}, {
key: "removeSelection",
value: function removeSelection(nodeDataItem) {
var rec = function recursive(directNodeDataItem) {
directNodeDataItem.selected = false;
if (directNodeDataItem.children) {
directNodeDataItem.children.forEach(recursive);
}
};
rec(nodeDataItem);
return this;
}
/**
* Center the view to a D3 tree node.
*
* @param {*} nodeDataItem The D3 node data item to focus on.
* @returns {object} The tree object.
*/
}, {
key: "centerNode",
value: function centerNode(nodeDataItem) {
var transform = _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].zoomTransform(this.getSvg().node());
var scale = transform.k;
var x, y, translateX, translateY;
if (this.getOrientation().toLowerCase() === 'toptobottom') {
x = -nodeDataItem.x0;
y = -nodeDataItem.y0;
translateX = x * scale + this.getWidth() / 2;
translateY = y * scale + this.getHeight() / 2;
} else {
x = -nodeDataItem.y0;
y = -nodeDataItem.x0;
translateX = x * scale + this.getWidth() / 4;
translateY = y * scale + this.getHeight() / 2;
}
this.getSvg().transition().duration(this.getDuration()).call(this.getZoomListener().transform, _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].zoomIdentity.translate(translateX, translateY).scale(scale));
return this;
}
/**
* Triggers the nodeClick event when a
* D3 node is clicked on, and proceeds
* to focus/expand/collapse the node.
*
* @param {object} nodeDataItem The D3 node data item that was clicked.
* @param {number} index The index of the D3 node being clicked in the array of siblings.
* @param {object[]} arr Array of siblings D3 node, inclusive of the clicked node data item itself.
* @emits {nodeClick} Emit node click event.
* @returns {boolean} True meaning it successfully focused/expanded/collapsed a node. False otherwise.
*/
}, {
key: "_onNodeClick",
value: function _onNodeClick(nodeDataItem, index, arr) {
var eventType = null;
if (this.getAllowFocus()) eventType = 'focus';else if (nodeDataItem.children) eventType = 'collapse';else eventType = 'expand';
var event = {
type: eventType,
continue: true,
nodeDataItem: nodeDataItem,
nodeDataItemIndex: index,
nodeDataItems: arr
};
this.emit('nodeClick', event);
if (event.continue === false) return false;
if (this.getAllowFocus()) this.nodeFocus.call(this, nodeDataItem);else this.nodeToggle.call(this, nodeDataItem);
return true;
}
/**
* Creates a child D3 tree node.
*
* @param {object} parentNodeDataItem The parent D3 tree node data item.
* @param {object} dataItem The data item.
* @returns {object} The newly created D3 node;
*/
}, {
key: "_createNode",
value: function _createNode(parentNodeDataItem, dataItem) {
// Create a D3 node object from resulting data items using d3.hierarchy()
var newNode = _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].hierarchy(dataItem); // Now add missing properties to Node like child, parent, depth
newNode.depth = parentNodeDataItem.depth + 1;
newNode.height = parentNodeDataItem.height - 1;
newNode.parent = parentNodeDataItem;
newNode.id = this.getId.call(this, dataItem);
return newNode;
}
/**
* Creates and adds a child D3 tree
* node to a given parent D3 tree node.
*
* @param {object} parentNodeDataItem The parent D3 tree node data item.
* @param {object} dataItem The data item.
* @returns {object} The newly created and added D3 node;
*/
}, {
key: "_addUnderlyingChildNode",
value: function _addUnderlyingChildNode(parentNodeDataItem, dataItem) {
var newNode = this._createNode(parentNodeDataItem, dataItem);
parentNodeDataItem._children.push(newNode);
return newNode;
}
/**
* Process the loaded data from AJAX
* resulting from a node expand.
*
* @param {object} nodeDataItem The D3 node data item being expanded.
* @param {object[]} result The children data items to process.
* @returns {object} The tree object.
*/
}, {
key: "_processLoadedDataForNodeFocus",
value: function _processLoadedDataForNodeFocus(nodeDataItem, result) {
var _this5 = this;
nodeDataItem._children = [];
result.forEach(function (currentItem) {
return _this5._addUnderlyingChildNode(nodeDataItem, currentItem);
});
this._populateUnderlyingChildren(nodeDataItem);
this.updateTreeWithFocusOnNode(nodeDataItem);
var wasSelected = nodeDataItem.selected;
this.removeSelection(this.getRoot());
nodeDataItem.selected = true;
this.update(nodeDataItem);
if (this.getAllowNodeCentering() === true && (wasSelected === false || typeof wasSelected === 'undefined')) this.centerNode(nodeDataItem);
return this;
}
/**
* Focuses to a node, given a node data item.
*
* @param {object} nodeDataItem The node being focused on.
* @returns {object} The tree object.
*/
}, {
key: "nodeFocus",
value: function nodeFocus(nodeDataItem) {
var _this6 = this;
if (!nodeDataItem.children && !nodeDataItem._children && this.loadOnDemandSettings.isEnabled() && this.loadOnDemandSettings.hasChildren(nodeDataItem.data)) {
var processData = function processData(result) {
return _this6._processLoadedDataForNodeFocus(nodeDataItem, result);
};
this.loadOnDemandSettings.loadChildren(nodeDataItem.data, processData);
} else {
this.updateTreeWithFocusOnNode(nodeDataItem);
var wasSelected = nodeDataItem.selected;
this.removeSelection(this.getRoot());
nodeDataItem.selected = true;
this.update(nodeDataItem);
if (this.getAllowNodeCentering() === true && (wasSelected === false || typeof wasSelected === 'undefined')) this.centerNode(nodeDataItem);
}
return this;
}
/**
* Process the loaded data from AJAX
* resulting from a node toggle.
*
* @param {object} nodeDataItem The D3 node data item.
* @param {object[]} result Array of sibling node data items, inclusive the node being toggled.
* @returns {object} The tree object.
*/
}, {
key: "_processLoadedDataForNodeToggle",
value: function _processLoadedDataForNodeToggle(nodeDataItem, result) {
var _this7 = this;
nodeDataItem._children = [];
result.forEach(function (currentItem) {
return _this7._addUnderlyingChildNode(nodeDataItem, currentItem);
});
this.expand(nodeDataItem);
this.update(nodeDataItem);
if (this.getAllowNodeCentering() === true) this.centerNode(nodeDataItem);
return this;
}
/**
* Toggles the children visibility for a given node data item.
*
* @param {*} nodeDataItem D3 Node data item.
* @returns {object} The tree object.
*/
}, {
key: "nodeToggle",
value: function nodeToggle(nodeDataItem) {
var _this8 = this;
// If it hasn't been loaded, and it's specified to have children,
// then perform load-on-demand to load new items from server
// and add them as child nodes
if (!nodeDataItem.children && !nodeDataItem._children && this.loadOnDemandSettings.isEnabled() && this.loadOnDemandSettings.hasChildren(nodeDataItem.data)) {
var processData = function processData(result) {
return _this8._processLoadedDataForNodeToggle(nodeDataItem, result);
};
this.loadOnDemandSettings.loadChildren(nodeDataItem.data, processData);
} else {
if (nodeDataItem.children) this.collapse(nodeDataItem);else this.expand(nodeDataItem);
this.update(nodeDataItem);
if (this.getAllowNodeCentering() === true) this.centerNode(nodeDataItem);
}
return this;
}
/**
* Hide the siblings nodes
* for a given node.
*
* @param {object} nodeDataItem The D3 node to hide siblings for.
* @returns {object} The tree object.
*/
}, {
key: "hideSiblings",
value: function hideSiblings(nodeDataItem) {
var _this9 = this;
var parentNode = nodeDataItem.parent;
if (parentNode) {
var nodeId = this.getId(nodeDataItem.data);
parentNode.children.filter(function (x) {
return _this9.getId(x.data) != nodeId;
}).forEach(this.collapseRecursively);
parentNode.children = [];
parentNode.children.push(nodeDataItem);
}
return this;
}
/**
* Updates the tree diagram so only the relevant
* focused node and direct parent hierarchies are
* shown.
*
* @param {object} nodeDataItem D3 Node data item.
* @returns {object} The tree object.
*/
}, {
key: "updateTreeWithFocusOnNode",
value: function updateTreeWithFocusOnNode(nodeDataItem) {
if (!nodeDataItem.children && nodeDataItem._children) {
// If there's no children nodes, but there a some children items to expand
this.hideSiblings(nodeDataItem);
this.expand(nodeDataItem); // Collapse the current focused node's children, so only direct childrens are shown
nodeDataItem.children.forEach(this.collapseRecursively);
} else if (nodeDataItem.children) {
// If there are rendered children nodes
// Checks if its children has any rendered children
var hasNestedChildren = nodeDataItem.children.some(function (currentItem, index, arr) {
return currentItem.children;
});
var isPreviouslyExpandedNode = !hasNestedChildren; // If it is a parent node with children, and
// is not the previous expanded node,
// then we'll focus on it, expanding it
// and showing all of its children
if (isPreviouslyExpandedNode === false) {
this.collapseRecursively(nodeDataItem);
this.expand(nodeDataItem);
}
}
return this;
}
/**
* Updates the tree nodes given
* a D3 tree node.
*
* @param {object} nodeDataItem The D3 node data item to update.
* @param {object[]} nodes Array of D3 node data items.
* @returns {object} The tree object.
*/
}, {
key: "_updateNodes",
value: function _updateNodes(nodeDataItem, nodes) {
var _this10 = this;
// Normalize for fixed-depth.
// You can increase the depth multiplication to get more depth,
// i.e. increasing the distance between the parent node and child node
nodes.forEach(function (data) {
return data.y = data.depth * _this10.getNodeDepthMultiplier();
}); // ****************** Nodes section ***************************
// Update the nodes...
var nodes = this.getPanningContainer().selectAll("g.node") // The second parameter of data() takes in a
// function, determining the key of the data
// items, which is useful to retrieve items,
// and databind them
.data(nodes, function (data) {
return _this10.getId.call(_this10, data.data);
}); // Enter any new nodes at the parent's previous position.
var nodeEnter = nodes.enter().append("g").classed("node", true).attr("transform", function (data, index, arr) {
if (_this10.getOrientation().toLowerCase() === 'toptobottom') return "translate(" + nodeDataItem.x0 + "," + nodeDataItem.y0 + ")";else return "translate(" + nodeDataItem.y0 + "," + nodeDataItem.x0 + ")";
}).on("click", function (data, index, arr) {
return _this10._onNodeClick.call(_this10, data, index, arr);
});
this._nodeEnter(nodeEnter, nodes); // UPDATE
var nodeUpdate = nodeEnter.merge(nodes);
var nodeUpdateTransition = nodeUpdate.transition().duration(this.getDuration());
nodeUpdate.classed("collapsed", function (data, index, arr) {
if (!data.children && data._children) return true;else if (_this10.loadOnDemandSettings.isEnabled() && _this10.loadOnDemandSettings.hasChildren(data.data) && !data.children && !data._children) // If it does have children to load via AJAX
return true;
return false;
}).classed("expanded", function (data, index, arr) {
return data.children;
}).classed("childless", function (data, index, arr) {
return !data.children && !data._children;
}).classed("selected", function (data, index, arr) {
return data.selected;
});
this._nodeUpdate(nodeUpdate, nodeUpdateTransition, nodes); // Remove any exiting nodes
var nodeExit = nodes.exit();
var nodeExitTransition = nodeExit.transition().duration(this.getDuration());
this._nodeExit(nodeExit, nodeExitTransition, nodes);
return this;
}
/**
* Updates the tree node links given
* a D3 tree node.
*
* @param {object} nodeDataItem The D3 node data item.
* @param {object[]} links Array of D3 link data items.
* @returns {object} The tree object.
*/
}, {
key: "_updateLinks",
value: function _updateLinks(nodeDataItem, links) {
var _this11 = this;
var linkPathGenerator = this._getLinkPathGenerator(); // Update the links...
var link = this.getPanningContainer().selectAll("path.link").data(links, function (data) {
return _this11.getId.call(_this11, data.data);
}); // Enter any new links at the parent's previous position.
var linkEnter = link.enter().insert("path", "g").classed("link", true);
this._linkEnter(nodeDataItem, linkEnter, link, linkPathGenerator); // UPDATE
var linkUpdate = linkEnter.merge(link);
var linkUpdateTransition = linkUpdate.transition().duration(this.getDuration()); // Transition back to the parent element position
this._linkUpdate(nodeDataItem, linkUpdate, linkUpdateTransition, link, linkPathGenerator); // Remove any exiting links
var linkExit = link.exit();
var linkExitTransition = linkExit.transition().duration(this.getDuration());
this._linkExit(nodeDataItem, linkExit, linkExitTransition, link, linkPathGenerator); // Store the old positions for transition.
this.getVisibleNodes().forEach(function (data) {
data.x0 = data.x;
data.y0 = data.y;
});
return this;
}
/**
* Updates the tree given a D3 tree node.
*
* @param {object} nodeDataItem The D3 node data item.
* @returns {object} The tree object.
*/
}, {
key: "update",
value: function update(nodeDataItem) {
var treeGenerator = this.getTreeGenerator(); // Assigns the x and y position for the nodes
var treeData = treeGenerator(this.getRoot());
this._visibleNodes = treeData.descendants();
this._nodes = [this.getRoot()].concat(_toConsumableArray(recursiveGet(this.getRoot(), function (node) {
return node._children;
})));
this._links = treeData.descendants().slice(1);
this._updateNodes(nodeDataItem, this.getVisibleNodes())._updateLinks(nodeDataItem, this.getLinks());
return this;
}
/**
* Gets the unique ID for a given data item.
* @callback getIdCallBack
* @param {object} data Represents the single data item to extract the ID from.
* @returns {*} The unique ID from the given data item.
*/
/**
* Gets the parent ID for a given data item.
* @callback getParentIdCallBack
* @param {object} data Represents the single data item to extract the parent ID from.
* @returns {*} The parent ID from the given data item.
*/
/**
* Gets the children items for a given
* data item.
* @callback getChildrenCallBack
* @param {object} data Represents the single data item to extract the children data items from.
* @returns {object[]} The array of data items representing the children of the given data item.
*/
/**
* Node click event, triggered when a
* user clicks on a tree node.
*
* @typedef {object} nodeClick
* @property {object} event Object containing various event parameters.
* @property {string} event.type The type of the operation the click will trigger, whether it's 'focus', 'expand', or 'collapse'.
* @property {boolean} event.continue Whether to continue the node focusing/expanding/collapsing.
* @property {object} event.nodeDataItem Node data item representing the clicked node.
* @property {object} event.nodeDataItem.data The data item of the clicked node.
* @property {number} event.nodeDataItemIndex Index of the clicked item in the array of siblings.
* @property {object[]} event.nodeDataItems The array of sibling rendered SVG elements, inclusive of the node itself.
*/
}]);
return BaseTree;
}(events__WEBPACK_IMPORTED_MODULE_3___default.a); // Define option defaults using a class static property
BaseTree.defaults = {
theme: 'default',
orientation: 'leftToRight',
// topToBottom, rightToLeft, bottomToTop
allowPan: true,
allowZoom: true,
allowFocus: true,
allowNodeCentering: true,
minScale: 1,
// Minimum zoom scaling
maxScale: 2,
// Maximum zoom scaling
// You can increase the depth multiplication to get more depth,
// i.e. increasing the distance between the parent node and child node
nodeDepthMultiplier: 300,
isFlatData: false,
getId: null,
getParentId: null,
getChildren: null,
widthWithoutMargins: 960,
heightWithoutMargins: 800,
margins: {
top: 40,
right: 20,
bottom: 40,
left: 100
},
duration: 750,
loadOnDemandSettings: {// Defaults are defined in the load-on-demand settings prototype
},
nodeSettings: {// Defaults are defined in the node settings prototype
}
};
/* harmony default export */ __webpack_exports__["default"] = (BaseTree);
/***/ }),
/***/ "./src/js/BoxedNodeSettings.js":
/*!*************************************!*\
!*** ./src/js/BoxedNodeSettings.js ***!
\*************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _NodeSettings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NodeSettings */ "./src/js/NodeSettings.js");
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
var BoxedNodeSettings =
/*#__PURE__*/
function (_NodeSettings) {
_inherits(BoxedNodeSettings, _NodeSettings);
/**
* @param {object} ownerObject The owner object.
* @param {object} options The options object.
* @param {number} [options.bodyBoxWidth=200] Body box width.
* @param {number} [options.bodyBoxHeight=75] Body box height.
* @param {object} [options.bodyBoxPadding] Body box padding object.
* @param {number} [options.bodyBoxPadding.top=5] Body box padding top.
* @param {number} [options.bodyBoxPadding.right=10] Body box padding right.
* @param {number} [options.bodyBoxPadding.bottom=5] Body box padding bottom.
* @param {number} [options.bodyBoxPadding.left=10] Body box padding left.
* @param {number} [options.titleBoxWidth] Title box width.
* @param {number} [options.titleBoxHeight=40] Title box height.
* @param {object} [options.titleBoxPadding] Title box padding object.
* @param {number} [options.titleBoxPadding.top=2] Title box padding top.
* @param {number} [options.titleBoxPadding.right=5] Title box padding right.
* @param {number} [options.titleBoxPadding.bottom=2] Title box padding bottom.
* @param {number} [options.titleBoxPadding.left=5] Title box padding left.
*/
function BoxedNodeSettings(ownerObject, options) {
var _this;
_classCallCheck(this, BoxedNodeSettings);
_this = _possibleConstructorReturn(this, _getPrototypeOf(BoxedNodeSettings).call(this, ownerObject, options));
var mergedOptions = _objectSpread({}, BoxedNodeSettings.defaults, options);
_this._bodyBoxWidth = mergedOptions.bodyBoxWidth;
_this._bodyBoxHeight = mergedOptions.bodyBoxHeight;
_this._bodyBoxPadding = mergedOptions.bodyBoxPadding;
_this._titleBoxWidth = mergedOptions.titleBoxWidth;
_this._titleBoxHeight = mergedOptions.titleBoxHeight;
_this._titleBoxPadding = mergedOptions.titleBoxPadding;
return _this;
}
/**
* Gets the body box width value.
*
* @returns {number} The body box width value.
*/
_createClass(BoxedNodeSettings, [{
key: "getBodyBoxWidth",
value: function getBodyBoxWidth() {
return this._bodyBoxWidth;
}
/**
* Sets the body box width value.
*
* @param {number} width The body box width value.
* @returns {object} The node settings object.
*/
}, {
key: "setBodyBoxWidth",
value: function setBodyBoxWidth(width) {
this._bodyBoxWidth = width;
return this;
}
/**
* Gets the body box height value.
*
* @returns {number} The body box height value.
*/
}, {
key: "getBodyBoxHeight",
value: function getBodyBoxHeight() {
return this._bodyBoxHeight;
}
/**
* Sets the body box height value.
*
* @param {number} height The body box height value.
* @returns {object} The node settings object.
*/
}, {
key: "setBodyBoxHeight",
value: function setBodyBoxHeight(height) {
this._bodyBoxHeight = height;
return this;
}
/**
* Sets the body box padding values.
*
* @param {object} newPadding The body box padding object value.
* @param {number} newPadding.top The body box padding top value.
* @param {number} newPadding.right The body box padding right value.
* @param {number} newPadding.bottom The body box padding bottom value.
* @param {number} newPadding.left The body box padding left value.
* @returns {object} The node settings object.
*/
}, {
key: "setBodyBoxPadding",
value: function setBodyBoxPadding(newPadding) {
this._bodyBoxPadding = newPadding;
return this;
}
/**
* Gets the body box padding values.
*
* @returns {object} The body box padding object.
*/
}, {
key: "getBodyBoxPadding",
value: function getBodyBoxPadding() {
return this._bodyBoxPadding;
}
/**
* Gets the title box width value.
*
* @returns {number} The title box width value.
*/
}, {
key: "getTitleBoxWidth",
value: function getTitleBoxWidth() {
if (this._titleBoxWidth) return this._titleBoxWidth;else return this.getBodyBoxWidth() / 2;
}
/**
* Sets the title box width value.
*
* @param {number} width The title box width value.
* @returns {object} The node settings object.
*/
}, {
key: "setTitleBoxWidth",
value: function setTitleBoxWidth(width) {
this._titleBoxWidth = width;
return this;
}
/**
* Gets the title box height value.
*
* @returns {number} The title box height value.
*/
}, {
key: "getTitleBoxHeight",
value: function getTitleBoxHeight() {
return this._titleBoxHeight;
}
/**
* Sets the title box height value.
*
* @param {number} height The title box height value.
* @returns {object} The node settings object.
*/
}, {
key: "setTitleBoxHeight",
value: function setTitleBoxHeight(height) {
this._titleBoxHeight = height;
return this;
}
/**
* Gets the title box padding values.
*
* @returns {object} The title box padding object.
*/
}, {
key: "getTitleBoxPadding",
value: function getTitleBoxPadding() {
return this._titleBoxPadding;
}
/**
* Sets the title box padding values.
*
* @param {object} newPadding The body box padding object value.
* @param {number} newPadding.top The body box padding top value.
* @param {number} newPadding.right The body box padding right value.
* @param {number} newPadding.bottom The body box padding bottom value.
* @param {number} newPadding.left The body box padding left value.
* @returns {object} The node settings object.
*/
}, {
key: "setTitleBoxPadding",
value: function setTitleBoxPadding(newPadding) {
this._titleBoxPadding = newPadding;
return this;
}
}]);
return BoxedNodeSettings;
}(_NodeSettings__WEBPACK_IMPORTED_MODULE_0__["default"]);
BoxedNodeSettings.defaults = {
bodyBoxWidth: 200,
bodyBoxHeight: 75,
bodyBoxPadding: {
top: 5,
right: 10,
bottom: 5,
left: 10
},
titleBoxWidth: null,
titleBoxHeight: 40,
titleBoxPadding: {
top: 2,
right: 5,
bottom: 2,
left: 5
}
};
/* harmony default export */ __webpack_exports__["default"] = (BoxedNodeSettings);
/***/ }),
/***/ "./src/js/BoxedTree.js":
/*!*****************************!*\
!*** ./src/js/BoxedTree.js ***!
\*****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _CustomD3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CustomD3 */ "./src/js/CustomD3.js");
/* harmony import */ var d3plus_text__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3plus-text */ "./node_modules/d3plus-text/es/index.js");
/* harmony import */ var _BaseTree__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./BaseTree */ "./src/js/BaseTree.js");
/* harmony import */ var _BoxedNodeSettings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BoxedNodeSettings */ "./src/js/BoxedNodeSettings.js");
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
var BoxedTree =
/*#__PURE__*/
function (_BaseTree) {
_inherits(BoxedTree, _BaseTree);
/**
* @param {object} options The options object.
* @param {bodyDisplayTextAccessorCallBack} options.getBodyDisplayText Determines how to obtain the body text to display for a node corresponding to a data item.
* @param {titleDisplayTextAccessorCallBack} options.getTitleDisplayText Determines how to obtain the title text to display for a node corresponding to a data item.
*/
function BoxedTree(options) {
var _this;
_classCallCheck(this, BoxedTree);
_this = _possibleConstructorReturn(this, _getPrototypeOf(BoxedTree).call(this, options));
var mergedOptions = _objectSpread({}, _BaseTree__WEBPACK_IMPORTED_MODULE_2__["default"].defaults, BoxedTree.defaults, options);
_this._getBodyDisplayText = mergedOptions.getBodyDisplayText;
_this._getTitleDisplayText = mergedOptions.getTitleDisplayText;
_this.nodeSettings = new _BoxedNodeSettings__WEBPACK_IMPORTED_MODULE_3__["default"](_assertThisInitialized(_assertThisInitialized(_this)), mergedOptions.nodeSettings);
return _this;
}
/** @inheritdoc */
_createClass(BoxedTree, [{
key: "initialize",
value: function initialize() {
_get(_getPrototypeOf(BoxedTree.prototype), "initialize", this).call(this); // Create the svg, and set its dimensions
this.getSvg().classed('boxed-tree', true);
return this;
}
/** @inheritdoc */
}, {
key: "_nodeEnter",
value: function _nodeEnter(nodeEnter, nodes) {
var self = this; // Declare box dimensions
var nodeBodyBoxWidth = self.nodeSettings.getBodyBoxWidth();
var nodeBodyBoxHeight = self.nodeSettings.getBodyBoxHeight();
var nodeBodyBoxPadding = self.nodeSettings.getBodyBoxPadding();
var nodeTitleBoxWidth = self.nodeSettings.getTitleBoxWidth();
var nodeTitleBoxHeight = self.nodeSettings.getTitleBoxHeight();
var nodeTitleBoxPadding = self.nodeSettings.getTitleBoxPadding();
/* Add Body Rectangle and Text for Node */
var bodyGroups = nodeEnter.append("g").classed("body-group", true);
bodyGroups.append("rect").classed("body-box", true).attr("width", 1e-6).attr("height", 1e-6);
bodyGroups.each(function (data, index, arr) {
var element = this;
var selection = _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].select(element);
var singledOutData = [];
singledOutData.push(data);
var recalculatedPaddingTop = nodeBodyBoxPadding.top;
if (self.getTitleDisplayText.call(self, data)) {
recalculatedPaddingTop += nodeTitleBoxHeight / 2;
} // D3Plus Textbox with resizing capability
var d3PlusBodyTextBox = new d3plus_text__WEBPACK_IMPORTED_MODULE_1__["TextBox"]().select(element) // Sets the D3Plus code to append to the specified DOM element.
.data(singledOutData).text(function (data, index, arr) {
return self.getBodyDisplayText.call(self, data);
}).textAnchor("middle").verticalAlign("middle").fontSize(13) // in pixels
.x(nodeBodyBoxPadding.left).y(recalculatedPaddingTop - nodeBodyBoxHeight / 2).width(nodeBodyBoxWidth - nodeBodyBoxPadding.left - nodeBodyBoxPadding.right).height(nodeBodyBoxHeight - recalculatedPaddingTop - nodeBodyBoxPadding.bottom).ellipsis(function (text, line) {
// If text was cut-off, add tooltip
selection.append("title").text(self.getBodyDisplayText(data));
return text.replace(/\.|,$/g, "") + "...";
}).render();
});
/* Add Title Rectangle and Text for Node */
var titleGroups = nodeEnter.append("g").classed("title-group", true).attr("transform", "translate(" + -nodeTitleBoxWidth / 3 + ", " + (-nodeTitleBoxHeight / 2 - nodeBodyBoxHeight / 2) + ")");
titleGroups.each(function (data, index, arr) {
if (!self.getTitleDisplayText.call(self, data)) return;
var element = this;
var selection = _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].select(element);
var singledOutData = [];
singledOutData.push(data);
selection.append("rect").classed("title-box", true).attr("width", nodeTitleBoxWidth).attr("height", nodeTitleBoxHeight); // D3Plus Textbox with resizing capability
var d3PlusTitleTextBox = new d3plus_text__WEBPACK_IMPORTED_MODULE_1__["TextBox"]().select(element) // Sets the D3Plus code to append to the DOM element.
.data(singledOutData).text(function (data, index, arr) {
return self.getTitleDisplayText.call(self, data);
}).textAnchor("middle").verticalAlign("middle").x(nodeTitleBoxPadding.left).y(nodeTitleBoxPadding.top).fontWeight(700).fontMin(6).fontMax(16).fontResize(true) // Resizes the text to fit the content
.width(nodeTitleBoxWidth - nodeTitleBoxPadding.left - nodeTitleBoxPadding.right).height(nodeTitleBoxHeight - nodeTitleBoxPadding.top - nodeTitleBoxPadding.bottom).render();
});
return self;
}
/** @inheritdoc */
}, {
key: "_nodeUpdate",
value: function _nodeUpdate(nodeUpdate, nodeUpdateTransition, nodes) {
// Transition to the proper position for the node
// Translating while inverting X/Y to
// make tree direction from left to right,
// instead of the typical top-to-down tree
if (this.getOrientation().toLowerCase() === 'toptobottom') {
nodeUpdateTransition.attr("transform", function (data, index, arr) {
return "translate(" + data.x + "," + data.y + ")";
});
} else {
nodeUpdateTransition.attr("transform", function (data, index, arr) {
return "translate(" + data.y + "," + data.x + ")";
});
}
var nodeBodyBoxWidth = this.nodeSettings.getBodyBoxWidth();
var nodeBodyBoxHeight = this.nodeSettings.getBodyBoxHeight(); // Update the node attributes and style
nodeUpdate.select(".node .body-group .body-box").attr("y", -(nodeBodyBoxHeight / 2)).attr("width", nodeBodyBoxWidth).attr("height", nodeBodyBoxHeight);
nodeUpdate.select(".d3plus-textBox").style("fill-opacity", 1);
return this;
}
/** @inheritdoc */
}, {
key: "_nodeExit",
value: function _nodeExit(nodeExit, nodeExitTransition, nodes) {
var _this2 = this;
var nodeBodyBoxWidth = this.nodeSettings.getBodyBoxWidth();
var nodeBodyBoxHeight = this.nodeSettings.getBodyBoxHeight();
nodeExitTransition.attr("transform", function (data, index, arr) {
var highestCollapsingParent = data.parent;
while (highestCollapsingParent.parent && !highestCollapsingParent.parent.children) {
highestCollapsingParent = highestCollapsingParent.parent;
}
if (_this2.getOrientation().toLowerCase() === 'toptobottom') {
return "translate(" + (highestCollapsingParent.x + nodeBodyBoxWidth / 2) + "," + (highestCollapsingParent.y + nodeBodyBoxHeight) + ")";
} else {
// Translating while inverting X/Y to
// make tree direction from left to right,
// instead of the typical top-to-down tree
return "translate(" + (highestCollapsingParent.y + nodeBodyBoxWidth) + "," + (highestCollapsingParent.x + nodeBodyBoxHeight / 2) + ")";
}
}).remove(); // On exit animate out
nodeExitTransition.select(".node .body-group rect").attr("width", 1e-6).attr("height", 1e-6);
nodeExitTransition.select(".node .body-group .d3plus-textBox").style("fill-opacity", 1e-6).attr("transform", function (data, index, arr) {
return "translate(0," + -nodeBodyBoxHeight / 2 + ")";
}).selectAll("text").style("font-size", 0).attr("y", 0).attr("x", 0);
nodeExitTransition.select(".node .title-group").attr("transform", "translate(0, " + -nodeBodyBoxHeight / 2 + ")");
nodeExitTransition.select(".node .title-group rect").attr("width", 1e-6).attr("height", 1e-6);
nodeExitTransition.select(".node .title-group .d3plus-textBox").style("fill-opacity", 1e-6).attr("transform", "translate(0,0)").selectAll("text").style("font-size", 0).attr("y", 0).attr("x", 0); // On exit reduce the opacity of text labels
nodeExitTransition.select(".d3plus-textBox").style("fill-opacity", 1e-6);
return this;
}
/** @inheritdoc */
}, {
key: "_getNodeSize",
value: function _getNodeSize() {
if (this.getOrientation().toLowerCase() === 'toptobottom') {
return [this.nodeSettings.getBodyBoxWidth() + this.nodeSettings.getHorizontalSpacing(), this.nodeSettings.getBodyBoxHeight() + this.nodeSettings.getVerticalSpacing()];
} else {
return [this.nodeSettings.getBodyBoxHeight() + this.nodeSettings.getVerticalSpacing(), this.nodeSettings.getBodyBoxWidth() + this.nodeSettings.getHorizontalSpacing()];
}
}
/** @inheritdoc */
}, {
key: "_linkEnter",
value: function _linkEnter(source, linkEnter, links, linkPathGenerator) {
linkEnter.attr("d", function (data, index, arr) {
var sourceCoordinate = {
x: source.x0,
y: source.y0
};
var coordinatesObject = {
source: sourceCoordinate,
target: sourceCoordinate
};
return linkPathGenerator(coordinatesObject);
});
return this;
}
/** @inheritdoc */
}, {
key: "_linkUpdate",
value: function _linkUpdate(source, linkUpdate, linkUpdateTransition, links, linkPathGenerator) {
linkUpdateTransition.attr("d", function (data, index, arr) {
var sourceCoordinate = data;
var targetCoordinate = data.parent;
var coordinatesObject = {
source: sourceCoordinate,
target: targetCoordinate
};
return linkPathGenerator(coordinatesObject);
});
return this;
}
/** @inheritdoc */
}, {
key: "_linkExit",
value: function _linkExit(source, linkExit, linkExitTransition, links, linkPathGenerator) {
var _this3 = this;
linkExitTransition.attr("d", function (data, index, arr) {
var highestCollapsingParent = data.parent;
while (highestCollapsingParent.parent && !highestCollapsingParent.parent.children) {
highestCollapsingParent = highestCollapsingParent.parent;
}
var sourceCoordinate = null;
if (_this3.getOrientation().toLowerCase() === 'toptobottom') {
var nodeBodyBoxHeight = _this3.nodeSettings.getBodyBoxHeight();
sourceCoordinate = {
x: highestCollapsingParent.x,
y: highestCollapsingParent.y + nodeBodyBoxHeight
};
} else {
var nodeBodyBoxWidth = _this3.nodeSettings.getBodyBoxWidth();
sourceCoordinate = {
x: highestCollapsingParent.x,
y: highestCollapsingParent.y + nodeBodyBoxWidth
};
}
var targetCoordinate = {
x: highestCollapsingParent.x,
y: highestCollapsingParent.y
};
var coordinatesObject = {
source: sourceCoordinate,
target: targetCoordinate
};
return linkPathGenerator(coordinatesObject);
});
return this;
}
/** @inheritdoc */
}, {
key: "_getLinkPathGenerator",
value: function _getLinkPathGenerator() {
// Declare box dimensions
var nodeBodyBoxWidth = this.nodeSettings.getBodyBoxWidth();
var nodeBodyBoxHeight = this.nodeSettings.getBodyBoxHeight(); // We specify arrow functions that returns
// an array specifying how to get the
// the x/y cordinates from the object,
// in the format of [x, y], the default
// format for the link generator to
// generate the path
if (this.getOrientation().toLowerCase() === 'toptobottom') {
return _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].linkVertical().source(function (data) {
return [data.source.x + nodeBodyBoxWidth / 2, data.source.y - nodeBodyBoxHeight / 2];
}).target(function (data) {
return [data.target.x + nodeBodyBoxWidth / 2, data.target.y + nodeBodyBoxHeight / 2];
});
} else {
return _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].linkHorizontal() // Inverts the X/Y coordinates to draw links for a
// tree starting from left to right,
// instead of the typical top-to-down tree
.source(function (data) {
return [data.source.y, data.source.x];
}).target(function (data) {
return [data.target.y + nodeBodyBoxWidth, data.target.x];
});
}
}
/** @inheritdoc */
}, {
key: "validateSettings",
value: function validateSettings() {
_get(_getPrototypeOf(BoxedTree.prototype), "validateSettings", this).call(this);
if (!this._getBodyDisplayText) throw "Need to define the getBodyDisplayText function as part of the options";
return this;
}
/**
* Sets the body display text accessor,
* used to get the body display text
* for the nodes.
*
* @param {bodyDisplayTextAccessorCallBack} newBodyDisplayTextAccessor
*/
}, {
key: "setBodyDisplayTextAccessor",
value: function setBodyDisplayTextAccessor(newBodyDisplayTextAccessor) {
this._getBodyDisplayText = newBodyDisplayTextAccessor;
return this;
}
/**
* Gets the body display text for a given data item.
*
* @param {object} nodeDataItem The data item to get the body display text from.
* @returns {string} The body display text to render for the node.
*/
}, {
key: "getBodyDisplayText",
value: function getBodyDisplayText(nodeDataItem) {
// Note that data in this context refers to D3 Tree data, not the original item data
// To Access the original item data, use the ".data" property
return this._getBodyDisplayText(nodeDataItem.data);
}
/**
* Sets the title display text accessor,
* used to get the title display text
* for the nodes.
*
* @param {titleDisplayTextAccessorCallBack} newTitleDisplayTextAccessor
*/
}, {
key: "setTitleDisplayTextAccessor",
value: function setTitleDisplayTextAccessor(newTitleDisplayTextAccessor) {
this._getTitleDisplayText = newTitleDisplayTextAccessor;
return this;
}
/**
* Gets the title display text for a given data item.
*
* @param {object} nodeDataItem The D3 node data item to get the title display text from.
* @returns {string} The title display text to render for the node.
*/
}, {
key: "getTitleDisplayText",
value: function getTitleDisplayText(nodeDataItem) {
// Note that data in this context refers to D3 Tree data, not the original item data
// To Access the original item data, use the ".data" property
return this._getTitleDisplayText(nodeDataItem.data);
}
/** @inheritdoc */
}, {
key: "centerNode",
value: function centerNode(nodeDataItem) {
var nodeBodyBoxWidth = this.nodeSettings.getBodyBoxWidth();
var nodeBodyBoxHeight = this.nodeSettings.getBodyBoxHeight();
if (this.getOrientation().toLowerCase() === 'toptobottom') {
nodeDataItem.x0 = nodeDataItem.x0;
nodeDataItem.y0 = nodeDataItem.y0 + nodeBodyBoxHeight / 2;
} else {
nodeDataItem.y0 = nodeDataItem.y0 + nodeBodyBoxWidth / 2;
nodeDataItem.x0 = nodeDataItem.x0;
}
return _get(_getPrototypeOf(BoxedTree.prototype), "centerNode", this).call(this, nodeDataItem);
}
/**
* Determines how to obtain the body text
* to display for a node corresponding
* to a data item.
*
* @callback bodyDisplayTextAccessorCallBack
* @param {object} data The data item to get the body display text from.
* @returns {string} The body display text to render for the node.
*/
/**
* Determines how to obtain the title text
* to display for a node corresponding
* to a data item.
*
* @callback titleDisplayTextAccessorCallBack
* @param {object} data The data item to get the title display text from.
* @returns {string} The title display text to render for the node.
*/
}]);
return BoxedTree;
}(_BaseTree__WEBPACK_IMPORTED_MODULE_2__["default"]);
BoxedTree.defaults = {
getBodyDisplayText: null,
getTitleDisplayText: function getTitleDisplayText(dataItem) {
return null;
}
};
/* harmony default export */ __webpack_exports__["default"] = (BoxedTree);
/***/ }),
/***/ "./src/js/CircleNodeSettings.js":
/*!**************************************!*\
!*** ./src/js/CircleNodeSettings.js ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _NodeSettings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NodeSettings */ "./src/js/NodeSettings.js");
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
var CircleNodeSettings =
/*#__PURE__*/
function (_NodeSettings) {
_inherits(CircleNodeSettings, _NodeSettings);
function CircleNodeSettings() {
_classCallCheck(this, CircleNodeSettings);
return _possibleConstructorReturn(this, _getPrototypeOf(CircleNodeSettings).apply(this, arguments));
}
return CircleNodeSettings;
}(_NodeSettings__WEBPACK_IMPORTED_MODULE_0__["default"]);
/* harmony default export */ __webpack_exports__["default"] = (CircleNodeSettings);
/***/ }),
/***/ "./src/js/CircleTree.js":
/*!******************************!*\
!*** ./src/js/CircleTree.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _CustomD3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CustomD3 */ "./src/js/CustomD3.js");
/* harmony import */ var _BaseTree__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./BaseTree */ "./src/js/BaseTree.js");
/* harmony import */ var _CircleNodeSettings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./CircleNodeSettings */ "./src/js/CircleNodeSettings.js");
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
var CircleTree =
/*#__PURE__*/
function (_BaseTree) {
_inherits(CircleTree, _BaseTree);
/**
* @param {object} [options] The options object.
* @param {displayTextAccessorCallBack} [options.getDisplayText] Determines how to obtain the text to display for a node corresponding to a data item.
*/
function CircleTree(options) {
var _this;
_classCallCheck(this, CircleTree);
_this = _possibleConstructorReturn(this, _getPrototypeOf(CircleTree).call(this, options));
var mergedOptions = _objectSpread({}, _BaseTree__WEBPACK_IMPORTED_MODULE_1__["default"].defaults, CircleTree.defaults, options);
_this._getDisplayText = mergedOptions.getDisplayText;
_this.nodeSettings = new _CircleNodeSettings__WEBPACK_IMPORTED_MODULE_2__["default"](_assertThisInitialized(_assertThisInitialized(_this)), mergedOptions.nodeSettings);
return _this;
}
/** @inheritdoc */
_createClass(CircleTree, [{
key: "initialize",
value: function initialize() {
// Create the svg, and set its dimensions
_get(_getPrototypeOf(CircleTree.prototype), "initialize", this).call(this);
this.getSvg().classed('circle-tree', true);
return this;
}
/** @inheritdoc */
}, {
key: "_nodeEnter",
value: function _nodeEnter(nodeEnter, nodes) {
var _this2 = this;
// Add Circle for the nodes
nodeEnter.append("circle").attr("r", 1e-6); // Add labels for the nodes
nodeEnter.append("text").text(function (data, index, arr) {
return _this2.getDisplayText.call(_this2, data);
});
return this;
}
/** @inheritdoc */
}, {
key: "_nodeUpdate",
value: function _nodeUpdate(nodeUpdate, nodeUpdateTransition, nodes) {
nodeUpdate.classed('middle', function (data, index, arr) {
var isMiddleChild = false;
if (data.parent && data.parent.children.length % 2 !== 0) {
var siblings = data.parent.children;
var indexOfSiblings = siblings.indexOf(data);
if (indexOfSiblings === Math.floor(siblings.length / 2)) isMiddleChild = true;
}
return isMiddleChild;
}); // Transition to the proper position for the node
// Translating while inverting X/Y to
// make tree direction from left to right,
// instead of the typical top-to-down tree
if (this.getOrientation().toLowerCase() === 'toptobottom') {
nodeUpdateTransition.attr("transform", function (data, index, arr) {
return "translate(" + data.x + "," + data.y + ")";
});
} else {
nodeUpdateTransition.attr("transform", function (data, index, arr) {
return "translate(" + data.y + "," + data.x + ")";
});
}
nodeUpdate.select("text").style("fill-opacity", 1);
return this;
}
/** @inheritdoc */
}, {
key: "_nodeExit",
value: function _nodeExit(nodeExit, nodeExitTransition, nodes) {
var _this3 = this;
// Remove any exiting nodes
nodeExitTransition.attr("transform", function (data, index, arr) {
var highestCollapsingParent = data.parent;
while (highestCollapsingParent.parent && !highestCollapsingParent.parent.children) {
highestCollapsingParent = highestCollapsingParent.parent;
} // Translating while inverting X/Y to
// make tree direction from left to right,
// instead of the typical top-to-down tree
if (_this3.getOrientation().toLowerCase() === 'toptobottom') {
return "translate(" + highestCollapsingParent.x + "," + highestCollapsingParent.y + ")";
} else {
return "translate(" + highestCollapsingParent.y + "," + highestCollapsingParent.x + ")";
}
}).remove(); // On exit reduce the node circles size to 0
nodeExitTransition.select("circle").attr("r", 1e-6); // On exit reduce the opacity of text labels
nodeExitTransition.select("text").style("fill-opacity", 1e-6);
return this;
}
/** @inheritdoc */
}, {
key: "_getNodeSize",
value: function _getNodeSize() {
return [this.nodeSettings.getVerticalSpacing(), this.nodeSettings.getHorizontalSpacing()];
}
/** @inheritdoc */
}, {
key: "_linkEnter",
value: function _linkEnter(source, linkEnter, links, linkPathGenerator) {
linkEnter.attr("d", function (data, index, arr) {
var sourceCoordinate = {
x: source.x0,
y: source.y0
};
var coordinatesObject = {
source: sourceCoordinate,
target: sourceCoordinate
};
return linkPathGenerator(coordinatesObject);
});
return this;
}
/** @inheritdoc */
}, {
key: "_linkUpdate",
value: function _linkUpdate(source, linkUpdate, linkUpdateTransition, links, linkPathGenerator) {
linkUpdateTransition.attr("d", function (data, index, arr) {
var sourceCoordinate = data;
var targetCoordinate = data.parent;
var coordinatesObject = {
source: sourceCoordinate,
target: targetCoordinate
};
return linkPathGenerator(coordinatesObject);
});
return this;
}
/** @inheritdoc */
}, {
key: "_linkExit",
value: function _linkExit(source, linkExit, linkExitTransition, links, linkPathGenerator) {
linkExitTransition.attr("d", function (data, index, arr) {
var highestCollapsingParent = data.parent;
while (highestCollapsingParent.parent && !highestCollapsingParent.parent.children) {
highestCollapsingParent = highestCollapsingParent.parent;
}
var sourceCoordinate = {
x: highestCollapsingParent.x,
y: highestCollapsingParent.y
};
var targetCoordinate = {
x: highestCollapsingParent.x,
y: highestCollapsingParent.y
};
var coordinatesObject = {
source: sourceCoordinate,
target: targetCoordinate
};
return linkPathGenerator(coordinatesObject);
});
return this;
}
/** @inheritdoc */
}, {
key: "_getLinkPathGenerator",
value: function _getLinkPathGenerator() {
// We specify arrow functions that returns
// an array specifying how to get the
// the x/y cordinates from the object,
// in the format of [x, y], the default
// format for the link generator to
// generate the path
if (this.getOrientation().toLowerCase() === 'toptobottom') {
return _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].linkVertical().source(function (data) {
return [data.source.x, data.source.y];
}).target(function (data) {
return [data.target.x, data.target.y];
});
} else {
return _CustomD3__WEBPACK_IMPORTED_MODULE_0__["default"].linkHorizontal() // Inverts the X/Y coordinates to draw links for a
// tree starting from left to right,
// instead of the typical top-to-down tree
.source(function (data) {
return [data.source.y, data.source.x];
}).target(function (data) {
return [data.target.y, data.target.x];
});
}
}
/** @inheritdoc */
}, {
key: "validateSettings",
value: function validateSettings() {
_get(_getPrototypeOf(CircleTree.prototype), "validateSettings", this).call(this);
if (!this.getDisplayText) throw "Need to define the getDisplayText function as part of the options";
return this;
}
/**
* Sets the display text accessor,
* used to get the display text
* for the nodes.
*
* @param {displayTextAccessorCallBack} newDisplayTextAccessor
*/
}, {
key: "setDisplayTextAccessor",
value: function setDisplayTextAccessor(newDisplayTextAccessor) {
this._getDisplayText = newDisplayTextAccessor;
return this;
}
/**
* Gets the display text for a given data item.
*
* @param {object} nodeDataItem The data item to get the display text from.
* @returns {string} The display text to render for the node.
*/
}, {
key: "getDisplayText",
value: function getDisplayText(nodeDataItem) {
// Note that data in this context refers to D3 Tree data, not the original item data
// To Access the original item data, use the ".data" property
return this._getDisplayText(nodeDataItem.data);
}
/**
* Determines how to obtain the text
* to display for a node corresponding
* to a data item.
*
* @callback displayTextAccessorCallBack
* @param {object} data The data item to get the display text from.
* @returns {string} The display text to render for the node.
*/
}]);
return CircleTree;
}(_BaseTree__WEBPACK_IMPORTED_MODULE_1__["default"]);
CircleTree.defaults = {
getDisplayText: function getDisplayText(nodeDataItem) {
return null;
}
};
/* harmony default export */ __webpack_exports__["default"] = (CircleTree);
/***/ }),
/***/ "./src/js/CustomD3.js":
/*!****************************!*\
!*** ./src/js/CustomD3.js ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
/* harmony import */ var d3_hierarchy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-hierarchy */ "./node_modules/d3-hierarchy/src/index.js");
/* harmony import */ var d3_zoom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-zoom */ "./node_modules/d3-zoom/src/index.js");
/* harmony import */ var d3_shape__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! d3-shape */ "./node_modules/d3-shape/src/index.js");
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
/**
* We only import the necessary modules
* from D3, to keep resulting bundded
* JS files minimal in size.
*/
// create a Object with only the subset of functions/submodules/plugins that we need
var d3 = _objectSpread({
select: d3_selection__WEBPACK_IMPORTED_MODULE_0__["select"],
selectAll: d3_selection__WEBPACK_IMPORTED_MODULE_0__["selectAll"],
// For more information on live bindings, refer to:
// https://stackoverflow.com/questions/40012016/importing-d3-event-into-a-custom-build-using-rollup
get event() {
return d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"];
},
linkHorizontal: d3_shape__WEBPACK_IMPORTED_MODULE_3__["linkHorizontal"],
linkVertical: d3_shape__WEBPACK_IMPORTED_MODULE_3__["linkVertical"]
}, d3_hierarchy__WEBPACK_IMPORTED_MODULE_1__, d3_zoom__WEBPACK_IMPORTED_MODULE_2__);
/* harmony default export */ __webpack_exports__["default"] = (d3);
/***/ }),
/***/ "./src/js/LoadOnDemandSettings.js":
/*!****************************************!*\
!*** ./src/js/LoadOnDemandSettings.js ***!
\****************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var LoadOnDemandSettings =
/*#__PURE__*/
function () {
/**
*
* @param {object} ownerObject The owner object.
* @param {object} options The options object.
* @param {hasChildrenCallBack} options.hasChildren Sets the hasChildren callback function, used to determine whether a node or data item has children or not.
* @param {loadChildrenCallBack} options.loadChildren the loadChildren callback function, used to load children data items for a node.
*/
function LoadOnDemandSettings(ownerObject, options) {
_classCallCheck(this, LoadOnDemandSettings);
// Define option defaults
var mergedOptions = _objectSpread({}, LoadOnDemandSettings.defaults, options);
this._ownerObject = ownerObject;
this._hasChildren = mergedOptions.hasChildren;
this._loadChildren = mergedOptions.loadChildren;
}
/**
* Gets the owner object.
*
* @returns {object} The owner object.
*/
_createClass(LoadOnDemandSettings, [{
key: "back",
value: function back() {
return this._ownerObject;
}
/**
* Validates whether the provided
* settings are correct or not.
*
* @returns {object} The tree object.
*/
}, {
key: "validateSettings",
value: function validateSettings() {
if (!this.hasChildren && this.loadChildren) throw "With load on demand enabled, you need to define hasChildren as part of the options";
if (!this.loadChildren && this.hasChildren) throw "With load on demand enabled, you need to define loadChildren as part of the options";
return this;
}
/**
* Load the children for a given data object.
*
* @param {*} data The data item, which should be used to load the children of the data item via AJAX.
* @param {*} processData Callback function to process the children data items.
* @returns {*}
*/
}, {
key: "loadChildren",
value: function loadChildren(data, processData) {
return this._loadChildren.call(this._ownerObject, data, processData);
}
/**
* Returns a boolean indicating whether
* the passed data item has children.
*
* @param {object} dataItem The data item to check if it has children or not.
* @returns {boolean} Whether the data item has children or not.
*/
}, {
key: "hasChildren",
value: function hasChildren(dataItem) {
return this._hasChildren.call(this._ownerObject, dataItem);
}
/**
* Sets the loadChildren callback function,
* used to load children data items for
* a node.
*
* @param {loadChildrenCallBack} newLoadChildrenMethod
* @returns {object} The tree object.
*/
}, {
key: "setLoadChildrenMethod",
value: function setLoadChildrenMethod(newLoadChildrenMethod) {
this._loadChildren = newLoadChildrenMethod;
return this;
}
/**
* Sets the hasChildren callback function,
* used to determine whether a node
* or data item has children or not.
*
* @param {hasChildrenCallBack} newHasChildrenMethod
* @returns {object} The tree object.
*/
}, {
key: "setHasChildrenMethod",
value: function setHasChildrenMethod(newHasChildrenMethod) {
this._hasChildren = newHasChildrenMethod;
return this;
}
/**
* Returns a boolean indicating whether
* load-on-demand is enabled or not.
*
* @returns {boolean} Whether load-on-demand is enabled or not.
*/
}, {
key: "isEnabled",
value: function isEnabled() {
return this._hasChildren || this._loadChildren;
}
/**
* Determines whether a node data item
* has children or not.
*
* @callback hasChildrenCallBack
* @param {object} dataItem Can be used to to load the childrens from the server via AJAX.
* @returns {boolean} True if the node or data item has children to load via AJAX, false otherwise.
*/
/**
* Load the children items for a given
* node data item.
* @callback loadChildrenCallBack
* @param {object} nodeDataItem Node data item, which can be used to to load the childrens from the server via AJAX.
* @param {object} nodeDataItem.data The data item, which can be used to to load the childrens from the server via AJAX.
* @param {childrenDataProcessorCallBack} processData Data processor callback function which you should use to call, passing in the children data that's been loaded via AJAX.
* @returns {undefined}
*/
/**
* Processes the children items.
* @callback childrenDataProcessorCallBack
* @param {object[]} childrenDataItems The array of children data for the node being processed.
* @returns {undefined}
*/
}]);
return LoadOnDemandSettings;
}();
LoadOnDemandSettings.defaults = {
// Takes in a function that accepts a parameter:
// - The node and data item which can be used
// to load the childrens from server
// Returns true or false
hasChildren: null,
// Takes in a function that accepts two parameters:
// - The node and data item which can be used
// to load the childrens from server
// - the data processor function, which
// you should call, passing in the
// children data you loaded with
// your server AJAX request
loadChildren: null
};
/* harmony default export */ __webpack_exports__["default"] = (LoadOnDemandSettings);
/***/ }),
/***/ "./src/js/NodeSettings.js":
/*!********************************!*\
!*** ./src/js/NodeSettings.js ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var NodeSettings =
/*#__PURE__*/
function () {
/**
* @param {object} ownerObject The owner object
* @param {object} options The options for the node settings.
* @param {('nodeSize'|'size')} [options.sizingMode=size] The sizing mode. Should be either 'nodeSize' to automatically size the SVG based on the nodes, or 'size' to use the configured width and height.
* @param {number} [options.horizontalSpacing=25] The horizontal spacing value.
* @param {number} [options.verticalSpacing=25] The vertical spacing value.
*/
function NodeSettings(ownerObject, options) {
_classCallCheck(this, NodeSettings);
var mergedOptions = _objectSpread({}, NodeSettings.defaults, options);
this._ownerObject = ownerObject;
this._sizingMode = mergedOptions.sizingMode;
this._horizontalSpacing = mergedOptions.horizontalSpacing;
this._verticalSpacing = mergedOptions.verticalSpacing;
}
/**
* Gets the owner object.
*
* @returns {object} The owner object.
*/
_createClass(NodeSettings, [{
key: "back",
value: function back() {
return this._ownerObject;
}
/**
* Gets the horizontal spacing value.
*
* @returns {number} The horizontal spacing value.
*/
}, {
key: "getHorizontalSpacing",
value: function getHorizontalSpacing() {
return this._horizontalSpacing;
}
/**
* Sets the horizontal spacing value.
*
* @param {number} newHorizontalSpacing The new horizontal spacing value.
* @returns {object} The node settings object.
*/
}, {
key: "setHorizontalSpacing",
value: function setHorizontalSpacing(newHorizontalSpacing) {
this._horizontalSpacing = newHorizontalSpacing;
return this;
}
/**
* Gets the vertical spacing value.
*
* @returns {number} The vertical spacing value.
*/
}, {
key: "getVerticalSpacing",
value: function getVerticalSpacing() {
return this._verticalSpacing;
}
/**
* Sets the vertical spacing value.
*
* @param {number} newVerticalSpacing The new vertical spacing value.
* @returns {object} The node settings object.
*/
}, {
key: "setVerticalSpacing",
value: function setVerticalSpacing(newVerticalSpacing) {
this._verticalSpacing = newVerticalSpacing;
return this;
}
/**
* Gets the sizing mode.
*
* @returns {string} The configured node sizing mode.
*/
}, {
key: "getSizingMode",
value: function getSizingMode() {
return this._sizingMode;
}
/**
* Sets the sizing mode.
*
* @param {('nodeSize'|'size')} newSizingMode The sizing mode. Should be either 'nodeSize' to automatically size the SVG based on the nodes, or 'size' to use the configured width and height.
* @returns {object} The node settings object.
*/
}, {
key: "setSizingMode",
value: function setSizingMode(newSizingMode) {
this._sizingMode = newSizingMode;
return this;
}
}]);
return NodeSettings;
}();
NodeSettings.defaults = {
sizingMode: "size",
// set to 'nodeSize' for the tree size to automatically be based on the node dimensions itself.
horizontalSpacing: 25,
verticalSpacing: 25
};
/* harmony default export */ __webpack_exports__["default"] = (NodeSettings);
/***/ })
/******/ })["default"];
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2FycmF5LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYXNjZW5kaW5nLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYmlzZWN0LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYmlzZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2Nyb3NzLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvZGVzY2VuZGluZy5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2RldmlhdGlvbi5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2V4dGVudC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2hpc3RvZ3JhbS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2lkZW50aXR5LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXguanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tZWFuLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWVkaWFuLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9taW4uanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9udW1iZXIuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9wYWlycy5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3Blcm11dGUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9xdWFudGlsZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3JhbmdlLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvc2Nhbi5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3NodWZmbGUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zdW0uanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy90aHJlc2hvbGQvZnJlZWRtYW5EaWFjb25pcy5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3RocmVzaG9sZC9zY290dC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3RocmVzaG9sZC9zdHVyZ2VzLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvdGlja3MuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy90cmFuc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy92YXJpYW5jZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3ppcC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtY29sbGVjdGlvbi9zcmMvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtY29sbGVjdGlvbi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWNvbGxlY3Rpb24vc3JjL2tleXMuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWNvbGxlY3Rpb24vc3JjL21hcC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtY29sbGVjdGlvbi9zcmMvbmVzdC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtY29sbGVjdGlvbi9zcmMvc2V0LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1jb2xsZWN0aW9uL3NyYy92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9jb2xvci5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2N1YmVoZWxpeC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2RlZmluZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2luZGV4LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvbGFiLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvbWF0aC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtZGlzcGF0Y2gvc3JjL2Rpc3BhdGNoLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1kaXNwYXRjaC9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9kcmFnLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9ldmVudC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL25vZHJhZy5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9ldmVudC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvYmFjay5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvYm91bmNlLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9jaXJjbGUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9lbGFzdGljLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9leHAuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2luZGV4LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9saW5lYXIuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL3BvbHkuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL3F1YWQuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL3Npbi5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9hY2Nlc3NvcnMuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvYXJyYXkuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvY2x1c3Rlci5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvYW5jZXN0b3JzLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9jb3VudC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvZGVzY2VuZGFudHMuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2VhY2guanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2VhY2hBZnRlci5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvZWFjaEJlZm9yZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2xlYXZlcy5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvbGlua3MuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L3BhdGguanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L3NvcnQuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L3N1bS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9wYWNrL2VuY2xvc2UuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvcGFjay9pbmRleC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9wYWNrL3NpYmxpbmdzLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3BhcnRpdGlvbi5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9zdHJhdGlmeS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvYmluYXJ5LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvZGljZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL2luZGV4LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvcmVzcXVhcmlmeS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL3JvdW5kLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvdHJlZW1hcC9zbGljZURpY2UuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvdHJlZW1hcC9zcXVhcmlmeS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2FycmF5LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXMuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpc0Nsb3NlZC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbG9yLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jdWJlaGVsaXguanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9kYXRlLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvZGlzY3JldGUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9oY2wuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9oc2wuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9odWUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2xhYi5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL251bWJlci5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL29iamVjdC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3BpZWNld2lzZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3F1YW50aXplLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvcmdiLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvcm91bmQuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vZGVjb21wb3NlLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2luZGV4LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL3BhcnNlLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdmFsdWUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy96b29tLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1wYXRoL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtcGF0aC9zcmMvcGF0aC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY3JlYXRvci5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9sb2NhbC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9tYXRjaGVyLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL21vdXNlLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2VzLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3BvaW50LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3RBbGwuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXR0ci5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2FsbC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xhc3NlZC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xvbmUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdGEuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdHVtLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kaXNwYXRjaC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZWFjaC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW1wdHkuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VudGVyLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9leGl0LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2h0bWwuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbnNlcnQuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2pvaW4uanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2xvd2VyLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9tZXJnZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZXMuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29uLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vcmRlci5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JhaXNlLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yZW1vdmUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0QWxsLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zaXplLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zb3J0LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zcGFyc2UuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3N0eWxlLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi90ZXh0LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NvdXJjZUV2ZW50LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3RvdWNoLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3RvdWNoZXMuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvd2luZG93LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJjLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJlYS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2FyZWFSYWRpYWwuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9hcnJheS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvYmFzaXMuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9iYXNpc0Nsb3NlZC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2Jhc2lzT3Blbi5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2J1bmRsZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2NhcmRpbmFsLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvY2FyZGluYWxDbG9zZWQuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9jYXJkaW5hbE9wZW4uanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9jYXRtdWxsUm9tLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvY2F0bXVsbFJvbUNsb3NlZC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2NhdG11bGxSb21PcGVuLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvbGluZWFyLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvbGluZWFyQ2xvc2VkLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvbW9ub3RvbmUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9uYXR1cmFsLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvcmFkaWFsLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvc3RlcC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2Rlc2NlbmRpbmcuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2luZGV4LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvbGluZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2xpbmVSYWRpYWwuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9saW5rL2luZGV4LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvbWF0aC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL25vb3AuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9vZmZzZXQvZGl2ZXJnaW5nLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvb2Zmc2V0L2V4cGFuZC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL29mZnNldC9ub25lLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvb2Zmc2V0L3NpbGhvdWV0dGUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9vZmZzZXQvd2lnZ2xlLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvb3JkZXIvYXBwZWFyYW5jZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL29yZGVyL2FzY2VuZGluZy5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL29yZGVyL2Rlc2NlbmRpbmcuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9vcmRlci9pbnNpZGVPdXQuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9vcmRlci9ub25lLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvb3JkZXIvcmV2ZXJzZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3BpZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3BvaW50LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvcG9pbnRSYWRpYWwuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9zdGFjay5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC9jaXJjbGUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9zeW1ib2wvY3Jvc3MuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9zeW1ib2wvZGlhbW9uZC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC9zcXVhcmUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9zeW1ib2wvc3Rhci5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC90cmlhbmdsZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC93eWUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL2ludGVydmFsLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZW91dC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVyLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9hY3RpdmUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2luZGV4LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbnRlcnJ1cHQuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2ludGVycnVwdC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL3RyYW5zaXRpb24uanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0ci5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyVHdlZW4uanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZGVsYXkuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZHVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZWFzZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW50ZXJwb2xhdGUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vb24uanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vcmVtb3ZlLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NjaGVkdWxlLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3RBbGwuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0aW9uLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlVHdlZW4uanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3R3ZWVuLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvZXZlbnQuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2luZGV4LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9ub2V2ZW50LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kMy16b29tL3NyYy90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3pvb20uanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzcGx1cy1jb21tb24vZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzcGx1cy1jb21tb24vZXMvc3JjL0Jhc2VDbGFzcy5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDNwbHVzLWNvbW1vbi9lcy9zcmMvUkVTRVQuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzcGx1cy1jb21tb24vZXMvc3JjL2FjY2Vzc29yLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kM3BsdXMtY29tbW9uL2VzL3NyYy9hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzcGx1cy1jb21tb24vZXMvc3JjL2F0dHJpemUuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzcGx1cy1jb21tb24vZXMvc3JjL2Nsb3Nlc3QuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzcGx1cy1jb21tb24vZXMvc3JjL2NvbmZpZ1ByZXAuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzcGx1cy1jb21tb24vZXMvc3JjL2NvbnN0YW50LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kM3BsdXMtY29tbW9uL2VzL3NyYy9lbGVtLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kM3BsdXMtY29tbW9uL2VzL3NyYy9pc09iamVjdC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDNwbHVzLWNvbW1vbi9lcy9zcmMvbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzcGx1cy1jb21tb24vZXMvc3JjL3BhcnNlU2lkZXMuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzcGx1cy1jb21tb24vZXMvc3JjL3ByZWZpeC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDNwbHVzLWNvbW1vbi9lcy9zcmMvc3R5bGl6ZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDNwbHVzLWNvbW1vbi9lcy9zcmMvdXVpZC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDNwbHVzLXRleHQvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzcGx1cy10ZXh0L2VzL3NyYy9UZXh0Qm94LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kM3BsdXMtdGV4dC9lcy9zcmMvY29tYmluaW5nTWFya3MuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzcGx1cy10ZXh0L2VzL3NyYy9mb250RXhpc3RzLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kM3BsdXMtdGV4dC9lcy9zcmMvcnRsLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kM3BsdXMtdGV4dC9lcy9zcmMvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL25vZGVfbW9kdWxlcy9kM3BsdXMtdGV4dC9lcy9zcmMvc3RyaXAuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzcGx1cy10ZXh0L2VzL3NyYy90ZXh0U3BsaXQuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzcGx1cy10ZXh0L2VzL3NyYy90ZXh0V2lkdGguanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2QzcGx1cy10ZXh0L2VzL3NyYy90ZXh0V3JhcC5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDNwbHVzLXRleHQvZXMvc3JjL3RpdGxlQ2FzZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9ub2RlX21vZHVsZXMvZDNwbHVzLXRleHQvZXMvc3JjL3RyaW0uanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vc3JjL2luZGV4LmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL3NyYy9qcy9CYXNlVHJlZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9zcmMvanMvQm94ZWROb2RlU2V0dGluZ3MuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vc3JjL2pzL0JveGVkVHJlZS5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9zcmMvanMvQ2lyY2xlTm9kZVNldHRpbmdzLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL3NyYy9qcy9DaXJjbGVUcmVlLmpzIiwid2VicGFjazovL2QzLm1pdGNoVHJlZS8uL3NyYy9qcy9DdXN0b21EMy5qcyIsIndlYnBhY2s6Ly9kMy5taXRjaFRyZWUvLi9zcmMvanMvTG9hZE9uRGVtYW5kU2V0dGluZ3MuanMiLCJ3ZWJwYWNrOi8vZDMubWl0Y2hUcmVlLy4vc3JjL2pzL05vZGVTZXR0aW5ncy5qcyJdLCJuYW1lcyI6WyJib3hlZFRyZWUiLCJCb3hlZFRyZWUiLCJjaXJjbGVUcmVlIiwiQ2lyY2xlVHJlZSIsInJlY3Vyc2l2ZUZpbmQiLCJoaWVyYXJjaGljYWxPYmplY3QiLCJnZXRDaGlsZHJlbiIsImZpbmRDb25kaXRpb24iLCJjaGlsZHJlbiIsImZvdW5kTm9kZSIsImZpbmQiLCJjaGlsZCIsInJlY3Vyc2l2ZUdldCIsImFsbEl0ZW1zIiwicHVzaCIsImRlc2NlbmRhbnRzIiwiQmFzZVRyZWUiLCJvcHRpb25zIiwibWVyZ2VkT3B0aW9ucyIsImRlZmF1bHRzIiwiX3Jvb3QiLCJfc3ZnIiwiX3Bhbm5pbmdDb250YWluZXIiLCJfdmlldyIsIl90cmVlR2VuZXJhdG9yIiwiX2xpbmtQYXRoR2VuZXJhdG9yIiwiX3Zpc2libGVOb2RlcyIsIl9saW5rcyIsIl96b29tTGlzdGVuZXIiLCJzZXRUaGVtZSIsInRoZW1lIiwic2V0T3JpZW50YXRpb24iLCJvcmllbnRhdGlvbiIsInNldERhdGEiLCJkYXRhIiwic2V0RWxlbWVudCIsImVsZW1lbnQiLCJzZXRXaWR0aFdpdGhvdXRNYXJnaW5zIiwid2lkdGhXaXRob3V0TWFyZ2lucyIsInNldEhlaWdodFdpdGhvdXRNYXJnaW5zIiwiaGVpZ2h0V2l0aG91dE1hcmdpbnMiLCJzZXRNYXJnaW5zIiwibWFyZ2lucyIsInNldER1cmF0aW9uIiwiZHVyYXRpb24iLCJzZXRBbGxvd1BhbiIsImFsbG93UGFuIiwic2V0QWxsb3dab29tIiwiYWxsb3dab29tIiwic2V0QWxsb3dGb2N1cyIsImFsbG93Rm9jdXMiLCJzZXRBbGxvd05vZGVDZW50ZXJpbmciLCJhbGxvd05vZGVDZW50ZXJpbmciLCJzZXRNaW5TY2FsZSIsIm1pblNjYWxlIiwic2V0TWF4U2NhbGUiLCJtYXhTY2FsZSIsInNldElzRmxhdERhdGEiLCJpc0ZsYXREYXRhIiwic2V0Tm9kZURlcHRoTXVsdGlwbGllciIsIm5vZGVEZXB0aE11bHRpcGxpZXIiLCJsb2FkT25EZW1hbmRTZXR0aW5ncyIsIkxvYWRPbkRlbWFuZFNldHRpbmdzIiwibm9kZVNldHRpbmdzIiwiTm9kZVNldHRpbmdzIiwiX2dldElkIiwiZ2V0SWQiLCJfZ2V0Q2hpbGRyZW4iLCJfZ2V0UGFyZW50SWQiLCJnZXRQYXJlbnRJZCIsIm5vZGVFbnRlciIsIm5vZGVzIiwibm9kZVVwZGF0ZSIsIm5vZGVVcGRhdGVUcmFuc2l0aW9uIiwibm9kZUV4aXQiLCJub2RlRXhpdFRyYW5zaXRpb24iLCJzb3VyY2UiLCJsaW5rRW50ZXIiLCJsaW5rcyIsImxpbmtQYXRoR2VuZXJhdG9yIiwibGlua1VwZGF0ZSIsImxpbmtVcGRhdGVUcmFuc2l0aW9uIiwibGlua0V4aXQiLCJsaW5rRXhpdFRyYW5zaXRpb24iLCJpZE9yTm9kZURhdGFJdGVtIiwicmVtb3ZlU2VsZWN0aW9uIiwiZ2V0Um9vdCIsIm5vZGVEYXRhSXRlbSIsImdldE5vZGUiLCJwYXJlbnROb2RlIiwicGFyZW50IiwiX2NoaWxkcmVuIiwiZXhwYW5kIiwiZ2V0QWxsb3dGb2N1cyIsImhpZGVTaWJsaW5ncyIsInVwZGF0ZVRyZWVXaXRoRm9jdXNPbk5vZGUiLCJzZWxlY3RlZCIsInVwZGF0ZSIsImNlbnRlck5vZGUiLCJfaXNGbGF0RGF0YSIsIm5ld0lzRmxhdERhdGEiLCJnZXRJc0ZsYXREYXRhIiwiZDMiLCJoaWVyYXJjaHkiLCJnZXREYXRhIiwiY2FsbCIsInN0cmF0aWZpZXIiLCJzdHJhdGlmeSIsImlkIiwiaW5kZXgiLCJhcnIiLCJwYXJlbnRJZCIsIl90aGVtZSIsIl9vcmllbnRhdGlvbiIsIl9kYXRhIiwibmV3RGF0YSIsIl9ub2RlRGVwdGhNdWx0aXBsaWVyIiwibmV3Tm9kZURlcHRoTXVsdGlwbGllciIsIl9kdXJhdGlvbiIsIm5ld0R1cmF0aW9uIiwiX2FsbG93UGFuIiwibmV3QWxsb3dQYW4iLCJfYWxsb3dab29tIiwibmV3QWxsb3dab29tIiwiX2FsbG93Rm9jdXMiLCJuZXdBbGxvd0ZvY3VzIiwiX2FsbG93Tm9kZUNlbnRlcmluZyIsIm5ld0FsbG93Tm9kZUNlbnRlcmluZyIsIl9taW5TY2FsZSIsIm5ld01pblNjYWxlIiwiX21heFNjYWxlIiwibmV3TWF4U2NhbGUiLCJfZWxlbWVudCIsIm5ld0VsZW1lbnQiLCJpZE9yRGF0YUl0ZW0iLCJyb290Tm9kZSIsImdldE5vZGVDaGlsZHJlbiIsIm5vZGUiLCJ4IiwiX25vZGVzIiwiZGF0YUl0ZW0iLCJuZXdJZEFjY2Vzc29yIiwibmV3Q2hpbGRyZW5BY2Nlc3NvciIsIm5ld1BhcmVudElkQWNjZXNzb3IiLCJnZXRXaWR0aFdpdGhvdXRNYXJnaW5zIiwiZ2V0TWFyZ2lucyIsImxlZnQiLCJyaWdodCIsImdldEhlaWdodFdpdGhvdXRNYXJnaW5zIiwidG9wIiwiYm90dG9tIiwibmV3TWFyZ2lucyIsIl9tYXJnaW5zIiwibmV3V2lkdGhXaXRob3V0TWFyZ2luIiwiX3dpZHRoV2l0aG91dE1hcmdpbiIsIm5ld0hlaWdodFdpdGhvdXRNYXJnaW4iLCJfaGVpZ2h0V2l0aG91dE1hcmdpbiIsImdldFN2ZyIsImF0dHIiLCJuZWVkVG9DZW50ZXJWaWV3Iiwic2l6aW5nTW9kZSIsImdldFNpemluZ01vZGUiLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJnZXRUcmVlR2VuZXJhdG9yIiwibm9kZVNpemUiLCJfZ2V0Tm9kZVNpemUiLCJzaXplIiwiZ2V0SGVpZ2h0IiwiZ2V0V2lkdGgiLCJnZXRWaWV3IiwieDAiLCJ5MCIsImdldE9yaWVudGF0aW9uIiwiZ2V0Wm9vbUxpc3RlbmVyIiwiZXh0ZW50IiwiZ2V0RWxlbWVudCIsInZhbGlkYXRlU2V0dGluZ3MiLCJyZWdlbmVyYXRlTm9kZURhdGEiLCJmaXJzdENoaWxkIiwicmVtb3ZlQ2hpbGQiLCJzZWxlY3QiLCJhcHBlbmQiLCJjbGFzc2VkIiwiZ2V0VGhlbWUiLCJzdHlsZSIsInRyZWUiLCJ6b29tIiwic2NhbGVFeHRlbnQiLCJnZXRNaW5TY2FsZSIsImdldE1heFNjYWxlIiwib24iLCJ0cmFuc2Zvcm0iLCJldmVudCIsImdldFBhbm5pbmdDb250YWluZXIiLCJnZXRBbGxvd1BhbiIsImdldEFsbG93Wm9vbSIsInVwZGF0ZURpbWVuc2lvbnMiLCJfcG9wdWxhdGVVbmRlcmx5aW5nQ2hpbGRyZW4iLCJmb3JFYWNoIiwiY29sbGFwc2VSZWN1cnNpdmVseSIsInJlYyIsInJlY3Vyc2l2ZSIsImRpcmVjdE5vZGVEYXRhSXRlbSIsInpvb21UcmFuc2Zvcm0iLCJzY2FsZSIsImsiLCJ5IiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJ0cmFuc2l0aW9uIiwiZ2V0RHVyYXRpb24iLCJ6b29tSWRlbnRpdHkiLCJ0cmFuc2xhdGUiLCJldmVudFR5cGUiLCJ0eXBlIiwiY29udGludWUiLCJub2RlRGF0YUl0ZW1JbmRleCIsIm5vZGVEYXRhSXRlbXMiLCJlbWl0Iiwibm9kZUZvY3VzIiwibm9kZVRvZ2dsZSIsInBhcmVudE5vZGVEYXRhSXRlbSIsIm5ld05vZGUiLCJkZXB0aCIsImhlaWdodCIsIl9jcmVhdGVOb2RlIiwicmVzdWx0IiwiY3VycmVudEl0ZW0iLCJfYWRkVW5kZXJseWluZ0NoaWxkTm9kZSIsIndhc1NlbGVjdGVkIiwiZ2V0QWxsb3dOb2RlQ2VudGVyaW5nIiwiaXNFbmFibGVkIiwiaGFzQ2hpbGRyZW4iLCJwcm9jZXNzRGF0YSIsIl9wcm9jZXNzTG9hZGVkRGF0YUZvck5vZGVGb2N1cyIsImxvYWRDaGlsZHJlbiIsIl9wcm9jZXNzTG9hZGVkRGF0YUZvck5vZGVUb2dnbGUiLCJjb2xsYXBzZSIsIm5vZGVJZCIsImZpbHRlciIsImhhc05lc3RlZENoaWxkcmVuIiwic29tZSIsImlzUHJldmlvdXNseUV4cGFuZGVkTm9kZSIsImdldE5vZGVEZXB0aE11bHRpcGxpZXIiLCJzZWxlY3RBbGwiLCJlbnRlciIsIl9vbk5vZGVDbGljayIsIl9ub2RlRW50ZXIiLCJtZXJnZSIsIl9ub2RlVXBkYXRlIiwiZXhpdCIsIl9ub2RlRXhpdCIsIl9nZXRMaW5rUGF0aEdlbmVyYXRvciIsImxpbmsiLCJpbnNlcnQiLCJfbGlua0VudGVyIiwiX2xpbmtVcGRhdGUiLCJfbGlua0V4aXQiLCJnZXRWaXNpYmxlTm9kZXMiLCJ0cmVlR2VuZXJhdG9yIiwidHJlZURhdGEiLCJzbGljZSIsIl91cGRhdGVOb2RlcyIsIl91cGRhdGVMaW5rcyIsImdldExpbmtzIiwiRXZlbnRFbWl0dGVyIiwiQm94ZWROb2RlU2V0dGluZ3MiLCJvd25lck9iamVjdCIsIl9ib2R5Qm94V2lkdGgiLCJib2R5Qm94V2lkdGgiLCJfYm9keUJveEhlaWdodCIsImJvZHlCb3hIZWlnaHQiLCJfYm9keUJveFBhZGRpbmciLCJib2R5Qm94UGFkZGluZyIsIl90aXRsZUJveFdpZHRoIiwidGl0bGVCb3hXaWR0aCIsIl90aXRsZUJveEhlaWdodCIsInRpdGxlQm94SGVpZ2h0IiwiX3RpdGxlQm94UGFkZGluZyIsInRpdGxlQm94UGFkZGluZyIsIndpZHRoIiwibmV3UGFkZGluZyIsImdldEJvZHlCb3hXaWR0aCIsIl9nZXRCb2R5RGlzcGxheVRleHQiLCJnZXRCb2R5RGlzcGxheVRleHQiLCJfZ2V0VGl0bGVEaXNwbGF5VGV4dCIsImdldFRpdGxlRGlzcGxheVRleHQiLCJzZWxmIiwibm9kZUJvZHlCb3hXaWR0aCIsIm5vZGVCb2R5Qm94SGVpZ2h0IiwiZ2V0Qm9keUJveEhlaWdodCIsIm5vZGVCb2R5Qm94UGFkZGluZyIsImdldEJvZHlCb3hQYWRkaW5nIiwibm9kZVRpdGxlQm94V2lkdGgiLCJnZXRUaXRsZUJveFdpZHRoIiwibm9kZVRpdGxlQm94SGVpZ2h0IiwiZ2V0VGl0bGVCb3hIZWlnaHQiLCJub2RlVGl0bGVCb3hQYWRkaW5nIiwiZ2V0VGl0bGVCb3hQYWRkaW5nIiwiYm9keUdyb3VwcyIsImVhY2giLCJzZWxlY3Rpb24iLCJzaW5nbGVkT3V0RGF0YSIsInJlY2FsY3VsYXRlZFBhZGRpbmdUb3AiLCJkM1BsdXNCb2R5VGV4dEJveCIsImQzUGx1c1RleHRCb3giLCJ0ZXh0IiwidGV4dEFuY2hvciIsInZlcnRpY2FsQWxpZ24iLCJmb250U2l6ZSIsImVsbGlwc2lzIiwibGluZSIsInJlcGxhY2UiLCJyZW5kZXIiLCJ0aXRsZUdyb3VwcyIsImQzUGx1c1RpdGxlVGV4dEJveCIsImZvbnRXZWlnaHQiLCJmb250TWluIiwiZm9udE1heCIsImZvbnRSZXNpemUiLCJoaWdoZXN0Q29sbGFwc2luZ1BhcmVudCIsInJlbW92ZSIsImdldEhvcml6b250YWxTcGFjaW5nIiwiZ2V0VmVydGljYWxTcGFjaW5nIiwic291cmNlQ29vcmRpbmF0ZSIsImNvb3JkaW5hdGVzT2JqZWN0IiwidGFyZ2V0IiwidGFyZ2V0Q29vcmRpbmF0ZSIsImxpbmtWZXJ0aWNhbCIsImxpbmtIb3Jpem9udGFsIiwibmV3Qm9keURpc3BsYXlUZXh0QWNjZXNzb3IiLCJuZXdUaXRsZURpc3BsYXlUZXh0QWNjZXNzb3IiLCJDaXJjbGVOb2RlU2V0dGluZ3MiLCJfZ2V0RGlzcGxheVRleHQiLCJnZXREaXNwbGF5VGV4dCIsImlzTWlkZGxlQ2hpbGQiLCJsZW5ndGgiLCJzaWJsaW5ncyIsImluZGV4T2ZTaWJsaW5ncyIsImluZGV4T2YiLCJNYXRoIiwiZmxvb3IiLCJuZXdEaXNwbGF5VGV4dEFjY2Vzc29yIiwiX293bmVyT2JqZWN0IiwiX2hhc0NoaWxkcmVuIiwiX2xvYWRDaGlsZHJlbiIsIm5ld0xvYWRDaGlsZHJlbk1ldGhvZCIsIm5ld0hhc0NoaWxkcmVuTWV0aG9kIiwiX3NpemluZ01vZGUiLCJfaG9yaXpvbnRhbFNwYWNpbmciLCJob3Jpem9udGFsU3BhY2luZyIsIl92ZXJ0aWNhbFNwYWNpbmciLCJ2ZXJ0aWNhbFNwYWNpbmciLCJuZXdIb3Jpem9udGFsU3BhY2luZyIsIm5ld1ZlcnRpY2FsU3BhY2luZyIsIm5ld1NpemluZ01vZGUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0IsQ0FBQztB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdURBQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFYztBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVEQUFNLFdBQVcsc0RBQU07QUFDdkI7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFa0I7O0FBT0Y7O0FBT0M7O0FBT0Q7O0FBT0Q7O0FBT0E7O0FBT0c7O0FBT0E7O0FBT0Y7O0FBT0c7Ozs7Ozs7Ozs7Ozs7QUNqRW5CO0FBQUE7QUFBTztBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNGQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFTTtBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLENBQUM7O0FBRU07QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxDQUFDOzs7Ozs7Ozs7Ozs7O0FDcENEO0FBQUE7QUFBQTtBQUFBO0FBQU87QUFDUDtBQUNBOztBQUVPO0FBQ1A7QUFDQTs7QUFFTztBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNWQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0FBRU87QUFDUDtBQUNBOztBQUVPO0FBQ1A7QUFDQTs7QUFFTztBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNiQTtBQUFBO0FBQUE7QUFBTztBQUNQO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNQQTtBQUFBO0FBQUE7QUFBTzs7QUFFQTtBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2ZBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ25GRDtBQUFBO0FBQU87QUFDUDtBQUNBOztBQUVlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ1JEO0FBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ05EO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ1hEO0FBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOzs7Ozs7Ozs7Ozs7O0FDTkQ7QUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsT0FBTztBQUMzRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOzs7Ozs7Ozs7Ozs7O0FDWkQ7QUFBZTtBQUNmO0FB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QTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixRQUFRO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ2U7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOzs7Ozs7Ozs7Ozs7O0FDNU9EO0FBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCLE9BQU87QUFDcEM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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LCtDQUFNO0FBQ2hHLFFBQVEsK0NBQU07QUFDZCxDQUFDOzs7Ozs7Ozs7Ozs7O0FDbkJEO0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLENBQUM7Ozs7Ozs7Ozs7Ozs7QUMvREQ7QUFBQTtBQUFBO0FBQUE7QUFBdUM7Ozs7Ozs7Ozs7Ozs7QUNBdkM7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNILG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDN1NBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFZTtBQUNYQSxXQUFTLEVBQUVDLHFEQURBO0FBRVhDLFlBQVUsRUFBRUMsc0RBQVVBO0FBRlgsQ0FBZixFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFRQSxTQUFT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bkMsV0FBS0gsZ0JBQUwsR0FBd0JHLGtCQUF4QjtBQUNBLGFBQU8sSUFBUDtBQUNIO0FBRUQ7Ozs7Ozs7O29DQUtnQjtBQUNaLGFBQU8sS0FBS04sV0FBWjtBQUNIO0FBRUQ7Ozs7Ozs7OztrQ0FNY08sYSxFQUFlO0FBQ3pCLFdBQUtQLFdBQUwsR0FBbUJPLGFBQW5CO0FBQ0EsYUFBTyxJQUFQO0FBQ0g7Ozs7OztBQUdMcFMsWUFBWSxDQUFDN0MsUUFBYixHQUF3QjtBQUNwQjZJLFlBQVUsRUFBRSxNQURRO0FBQ0E7QUFDcEIrTCxtQkFBaUIsRUFBRSxFQUZDO0FBR3BCRSxpQkFBZSxFQUFFO0FBSEcsQ0FBeEI7QUFNZWpTLDJFQUFmLEUiLCJmaWxlIjoiZDMtbWl0Y2gtdHJlZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwibWl0Y2hUcmVlXCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIm1pdGNoVHJlZVwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJkM1wiXSA9IHJvb3RbXCJkM1wiXSB8fCB7fSwgcm9vdFtcImQzXCJdW1wibWl0Y2hUcmVlXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIuL2Rpc3RcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvaW5kZXguanNcIik7XG4iLCJ2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGU7XG5cbmV4cG9ydCB2YXIgc2xpY2UgPSBhcnJheS5zbGljZTtcbmV4cG9ydCB2YXIgbWFwID0gYXJyYXkubWFwO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZ1wiO1xuaW1wb3J0IGJpc2VjdG9yIGZyb20gXCIuL2Jpc2VjdG9yXCI7XG5cbnZhciBhc2NlbmRpbmdCaXNlY3QgPSBiaXNlY3Rvcihhc2NlbmRpbmcpO1xuZXhwb3J0IHZhciBiaXNlY3RSaWdodCA9IGFzY2VuZGluZ0Jpc2VjdC5yaWdodDtcbmV4cG9ydCB2YXIgYmlzZWN0TGVmdCA9IGFzY2VuZGluZ0Jpc2VjdC5sZWZ0O1xuZXhwb3J0IGRlZmF1bHQgYmlzZWN0UmlnaHQ7XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb21wYXJlKSB7XG4gIGlmIChjb21wYXJlLmxlbmd0aCA9PT0gMSkgY29tcGFyZSA9IGFzY2VuZGluZ0NvbXBhcmF0b3IoY29tcGFyZSk7XG4gIHJldHVybiB7XG4gICAgbGVmdDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7XG4gICAgICBpZiAobG8gPT0gbnVsbCkgbG8gPSAwO1xuICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7XG4gICAgICB3aGlsZSAobG8gPCBoaSkge1xuICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTtcbiAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTtcbiAgICAgICAgZWxzZSBoaSA9IG1pZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsbztcbiAgICB9LFxuICAgIHJpZ2h0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHtcbiAgICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7XG4gICAgICBpZiAoaGkgPT0gbnVsbCkgaGkgPSBhLmxlbmd0aDtcbiAgICAgIHdoaWxlIChsbyA8IGhpKSB7XG4gICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxO1xuICAgICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpID4gMCkgaGkgPSBtaWQ7XG4gICAgICAgIGVsc2UgbG8gPSBtaWQgKyAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxvO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihmKSB7XG4gIHJldHVybiBmdW5jdGlvbihkLCB4KSB7XG4gICAgcmV0dXJuIGFzY2VuZGluZyhmKGQpLCB4KTtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwiaW1wb3J0IHtwYWlyfSBmcm9tIFwiLi9wYWlyc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMwLCB2YWx1ZXMxLCByZWR1Y2UpIHtcbiAgdmFyIG4wID0gdmFsdWVzMC5sZW5ndGgsXG4gICAgICBuMSA9IHZhbHVlczEubGVuZ3RoLFxuICAgICAgdmFsdWVzID0gbmV3IEFycmF5KG4wICogbjEpLFxuICAgICAgaTAsXG4gICAgICBpMSxcbiAgICAgIGksXG4gICAgICB2YWx1ZTA7XG5cbiAgaWYgKHJlZHVjZSA9PSBudWxsKSByZWR1Y2UgPSBwYWlyO1xuXG4gIGZvciAoaTAgPSBpID0gMDsgaTAgPCBuMDsgKytpMCkge1xuICAgIGZvciAodmFsdWUwID0gdmFsdWVzMFtpMF0sIGkxID0gMDsgaTEgPCBuMTsgKytpMSwgKytpKSB7XG4gICAgICB2YWx1ZXNbaV0gPSByZWR1Y2UodmFsdWUwLCB2YWx1ZXMxW2kxXSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGIgPCBhID8gLTEgOiBiID4gYSA/IDEgOiBiID49IGEgPyAwIDogTmFOO1xufVxuIiwiaW1wb3J0IHZhcmlhbmNlIGZyb20gXCIuL3ZhcmlhbmNlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGFycmF5LCBmKSB7XG4gIHZhciB2ID0gdmFyaWFuY2UoYXJyYXksIGYpO1xuICByZXR1cm4gdiA/IE1hdGguc3FydCh2KSA6IHY7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgaSA9IC0xLFxuICAgICAgdmFsdWUsXG4gICAgICBtaW4sXG4gICAgICBtYXg7XG5cbiAgaWYgKHZhbHVlb2YgPT0gbnVsbCkge1xuICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuXG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7XG4gICAgICAgIG1pbiA9IG1heCA9IHZhbHVlO1xuICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5pbmcgdmFsdWVzLlxuICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0gdmFsdWU7XG4gICAgICAgICAgICBpZiAobWF4IDwgdmFsdWUpIG1heCA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVsc2Uge1xuICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuXG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHtcbiAgICAgICAgbWluID0gbWF4ID0gdmFsdWU7XG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuXG4gICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobWluID4gdmFsdWUpIG1pbiA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKG1heCA8IHZhbHVlKSBtYXggPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gW21pbiwgbWF4XTtcbn1cbiIsImltcG9ydCB7c2xpY2V9IGZyb20gXCIuL2FycmF5XCI7XG5pbXBvcnQgYmlzZWN0IGZyb20gXCIuL2Jpc2VjdFwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgZXh0ZW50IGZyb20gXCIuL2V4dGVudFwiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuL2lkZW50aXR5XCI7XG5pbXBvcnQgcmFuZ2UgZnJvbSBcIi4vcmFuZ2VcIjtcbmltcG9ydCB7dGlja1N0ZXB9IGZyb20gXCIuL3RpY2tzXCI7XG5pbXBvcnQgc3R1cmdlcyBmcm9tIFwiLi90aHJlc2hvbGQvc3R1cmdlc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHZhbHVlID0gaWRlbnRpdHksXG4gICAgICBkb21haW4gPSBleHRlbnQsXG4gICAgICB0aHJlc2hvbGQgPSBzdHVyZ2VzO1xuXG4gIGZ1bmN0aW9uIGhpc3RvZ3JhbShkYXRhKSB7XG4gICAgdmFyIGksXG4gICAgICAgIG4gPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgeCxcbiAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KG4pO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdmFsdWVzW2ldID0gdmFsdWUoZGF0YVtpXSwgaSwgZGF0YSk7XG4gICAgfVxuXG4gICAgdmFyIHh6ID0gZG9tYWluKHZhbHVlcyksXG4gICAgICAgIHgwID0geHpbMF0sXG4gICAgICAgIHgxID0geHpbMV0sXG4gICAgICAgIHR6ID0gdGhyZXNob2xkKHZhbHVlcywgeDAsIHgxKTtcblxuICAgIC8vIENvbnZlcnQgbnVtYmVyIG9mIHRocmVzaG9sZHMgaW50byB1bmlmb3JtIHRocmVzaG9sZHMuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHR6KSkge1xuICAgICAgdHogPSB0aWNrU3RlcCh4MCwgeDEsIHR6KTtcbiAgICAgIHR6ID0gcmFuZ2UoTWF0aC5jZWlsKHgwIC8gdHopICogdHosIHgxLCB0eik7IC8vIGV4Y2x1c2l2ZVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgdGhyZXNob2xkcyBvdXRzaWRlIHRoZSBkb21haW4uXG4gICAgdmFyIG0gPSB0ei5sZW5ndGg7XG4gICAgd2hpbGUgKHR6WzBdIDw9IHgwKSB0ei5zaGlmdCgpLCAtLW07XG4gICAgd2hpbGUgKHR6W20gLSAxXSA+IHgxKSB0ei5wb3AoKSwgLS1tO1xuXG4gICAgdmFyIGJpbnMgPSBuZXcgQXJyYXkobSArIDEpLFxuICAgICAgICBiaW47XG5cbiAgICAvLyBJbml0aWFsaXplIGJpbnMuXG4gICAgZm9yIChpID0gMDsgaSA8PSBtOyArK2kpIHtcbiAgICAgIGJpbiA9IGJpbnNbaV0gPSBbXTtcbiAgICAgIGJpbi54MCA9IGkgPiAwID8gdHpbaSAtIDFdIDogeDA7XG4gICAgICBiaW4ueDEgPSBpIDwgbSA/IHR6W2ldIDogeDE7XG4gICAgfVxuXG4gICAgLy8gQXNzaWduIGRhdGEgdG8gYmlucyBieSB2YWx1ZSwgaWdub3JpbmcgYW55IG91dHNpZGUgdGhlIGRvbWFpbi5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB4ID0gdmFsdWVzW2ldO1xuICAgICAgaWYgKHgwIDw9IHggJiYgeCA8PSB4MSkge1xuICAgICAgICBiaW5zW2Jpc2VjdCh0eiwgeCwgMCwgbSldLnB1c2goZGF0YVtpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJpbnM7XG4gIH1cblxuICBoaXN0b2dyYW0udmFsdWUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCBoaXN0b2dyYW0pIDogdmFsdWU7XG4gIH07XG5cbiAgaGlzdG9ncmFtLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4gPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KFtfWzBdLCBfWzFdXSksIGhpc3RvZ3JhbSkgOiBkb21haW47XG4gIH07XG5cbiAgaGlzdG9ncmFtLnRocmVzaG9sZHMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhyZXNob2xkID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBBcnJheS5pc0FycmF5KF8pID8gY29uc3RhbnQoc2xpY2UuY2FsbChfKSkgOiBjb25zdGFudChfKSwgaGlzdG9ncmFtKSA6IHRocmVzaG9sZDtcbiAgfTtcblxuICByZXR1cm4gaGlzdG9ncmFtO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn1cbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyBiaXNlY3QsIGJpc2VjdFJpZ2h0LCBiaXNlY3RMZWZ0fSBmcm9tIFwiLi9iaXNlY3RcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBhc2NlbmRpbmd9IGZyb20gXCIuL2FzY2VuZGluZ1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGJpc2VjdG9yfSBmcm9tIFwiLi9iaXNlY3RvclwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGNyb3NzfSBmcm9tIFwiLi9jcm9zc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGRlc2NlbmRpbmd9IGZyb20gXCIuL2Rlc2NlbmRpbmdcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBkZXZpYXRpb259IGZyb20gXCIuL2RldmlhdGlvblwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGV4dGVudH0gZnJvbSBcIi4vZXh0ZW50XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaGlzdG9ncmFtfSBmcm9tIFwiLi9oaXN0b2dyYW1cIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzfSBmcm9tIFwiLi90aHJlc2hvbGQvZnJlZWRtYW5EaWFjb25pc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRocmVzaG9sZFNjb3R0fSBmcm9tIFwiLi90aHJlc2hvbGQvc2NvdHRcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0aHJlc2hvbGRTdHVyZ2VzfSBmcm9tIFwiLi90aHJlc2hvbGQvc3R1cmdlc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIG1heH0gZnJvbSBcIi4vbWF4XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWVhbn0gZnJvbSBcIi4vbWVhblwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIG1lZGlhbn0gZnJvbSBcIi4vbWVkaWFuXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWVyZ2V9IGZyb20gXCIuL21lcmdlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWlufSBmcm9tIFwiLi9taW5cIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwYWlyc30gZnJvbSBcIi4vcGFpcnNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwZXJtdXRlfSBmcm9tIFwiLi9wZXJtdXRlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcXVhbnRpbGV9IGZyb20gXCIuL3F1YW50aWxlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcmFuZ2V9IGZyb20gXCIuL3JhbmdlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2Nhbn0gZnJvbSBcIi4vc2NhblwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNodWZmbGV9IGZyb20gXCIuL3NodWZmbGVcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdW19IGZyb20gXCIuL3N1bVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRpY2tzLCB0aWNrSW5jcmVtZW50LCB0aWNrU3RlcH0gZnJvbSBcIi4vdGlja3NcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmFuc3Bvc2V9IGZyb20gXCIuL3RyYW5zcG9zZVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHZhcmlhbmNlfSBmcm9tIFwiLi92YXJpYW5jZVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHppcH0gZnJvbSBcIi4vemlwXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgaSA9IC0xLFxuICAgICAgdmFsdWUsXG4gICAgICBtYXg7XG5cbiAgaWYgKHZhbHVlb2YgPT0gbnVsbCkge1xuICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuXG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7XG4gICAgICAgIG1heCA9IHZhbHVlO1xuICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5pbmcgdmFsdWVzLlxuICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgdmFsdWUgPiBtYXgpIHtcbiAgICAgICAgICAgIG1heCA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVsc2Uge1xuICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuXG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuXG4gICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsICYmIHZhbHVlID4gbWF4KSB7XG4gICAgICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF4O1xufVxuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIG0gPSBuLFxuICAgICAgaSA9IC0xLFxuICAgICAgdmFsdWUsXG4gICAgICBzdW0gPSAwO1xuXG4gIGlmICh2YWx1ZW9mID09IG51bGwpIHtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKCFpc05hTih2YWx1ZSA9IG51bWJlcih2YWx1ZXNbaV0pKSkgc3VtICs9IHZhbHVlO1xuICAgICAgZWxzZSAtLW07XG4gICAgfVxuICB9XG5cbiAgZWxzZSB7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICghaXNOYU4odmFsdWUgPSBudW1iZXIodmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpKSkgc3VtICs9IHZhbHVlO1xuICAgICAgZWxzZSAtLW07XG4gICAgfVxuICB9XG5cbiAgaWYgKG0pIHJldHVybiBzdW0gLyBtO1xufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmdcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyXCI7XG5pbXBvcnQgcXVhbnRpbGUgZnJvbSBcIi4vcXVhbnRpbGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIGkgPSAtMSxcbiAgICAgIHZhbHVlLFxuICAgICAgbnVtYmVycyA9IFtdO1xuXG4gIGlmICh2YWx1ZW9mID09IG51bGwpIHtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKCFpc05hTih2YWx1ZSA9IG51bWJlcih2YWx1ZXNbaV0pKSkge1xuICAgICAgICBudW1iZXJzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVsc2Uge1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSkpIHtcbiAgICAgICAgbnVtYmVycy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcXVhbnRpbGUobnVtYmVycy5zb3J0KGFzY2VuZGluZyksIDAuNSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhcnJheXMpIHtcbiAgdmFyIG4gPSBhcnJheXMubGVuZ3RoLFxuICAgICAgbSxcbiAgICAgIGkgPSAtMSxcbiAgICAgIGogPSAwLFxuICAgICAgbWVyZ2VkLFxuICAgICAgYXJyYXk7XG5cbiAgd2hpbGUgKCsraSA8IG4pIGogKz0gYXJyYXlzW2ldLmxlbmd0aDtcbiAgbWVyZ2VkID0gbmV3IEFycmF5KGopO1xuXG4gIHdoaWxlICgtLW4gPj0gMCkge1xuICAgIGFycmF5ID0gYXJyYXlzW25dO1xuICAgIG0gPSBhcnJheS5sZW5ndGg7XG4gICAgd2hpbGUgKC0tbSA+PSAwKSB7XG4gICAgICBtZXJnZWRbLS1qXSA9IGFycmF5W21dO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWQ7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgaSA9IC0xLFxuICAgICAgdmFsdWUsXG4gICAgICBtaW47XG5cbiAgaWYgKHZhbHVlb2YgPT0gbnVsbCkge1xuICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuXG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7XG4gICAgICAgIG1pbiA9IHZhbHVlO1xuICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5pbmcgdmFsdWVzLlxuICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgbWluID4gdmFsdWUpIHtcbiAgICAgICAgICAgIG1pbiA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVsc2Uge1xuICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuXG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuXG4gICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsICYmIG1pbiA+IHZhbHVlKSB7XG4gICAgICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWluO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geCA9PT0gbnVsbCA/IE5hTiA6ICt4O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYXJyYXksIGYpIHtcbiAgaWYgKGYgPT0gbnVsbCkgZiA9IHBhaXI7XG4gIHZhciBpID0gMCwgbiA9IGFycmF5Lmxlbmd0aCAtIDEsIHAgPSBhcnJheVswXSwgcGFpcnMgPSBuZXcgQXJyYXkobiA8IDAgPyAwIDogbik7XG4gIHdoaWxlIChpIDwgbikgcGFpcnNbaV0gPSBmKHAsIHAgPSBhcnJheVsrK2ldKTtcbiAgcmV0dXJuIHBhaXJzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFpcihhLCBiKSB7XG4gIHJldHVybiBbYSwgYl07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhcnJheSwgaW5kZXhlcykge1xuICB2YXIgaSA9IGluZGV4ZXMubGVuZ3RoLCBwZXJtdXRlcyA9IG5ldyBBcnJheShpKTtcbiAgd2hpbGUgKGktLSkgcGVybXV0ZXNbaV0gPSBhcnJheVtpbmRleGVzW2ldXTtcbiAgcmV0dXJuIHBlcm11dGVzO1xufVxuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzLCBwLCB2YWx1ZW9mKSB7XG4gIGlmICh2YWx1ZW9mID09IG51bGwpIHZhbHVlb2YgPSBudW1iZXI7XG4gIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSkgcmV0dXJuO1xuICBpZiAoKHAgPSArcCkgPD0gMCB8fCBuIDwgMikgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1swXSwgMCwgdmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9ICt2YWx1ZW9mKHZhbHVlc1tpMF0sIGkwLCB2YWx1ZXMpLFxuICAgICAgdmFsdWUxID0gK3ZhbHVlb2YodmFsdWVzW2kwICsgMV0sIGkwICsgMSwgdmFsdWVzKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkge1xuICBzdGFydCA9ICtzdGFydCwgc3RvcCA9ICtzdG9wLCBzdGVwID0gKG4gPSBhcmd1bWVudHMubGVuZ3RoKSA8IDIgPyAoc3RvcCA9IHN0YXJ0LCBzdGFydCA9IDAsIDEpIDogbiA8IDMgPyAxIDogK3N0ZXA7XG5cbiAgdmFyIGkgPSAtMSxcbiAgICAgIG4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSkgfCAwLFxuICAgICAgcmFuZ2UgPSBuZXcgQXJyYXkobik7XG5cbiAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICByYW5nZVtpXSA9IHN0YXJ0ICsgaSAqIHN0ZXA7XG4gIH1cblxuICByZXR1cm4gcmFuZ2U7XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMsIGNvbXBhcmUpIHtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpKSByZXR1cm47XG4gIHZhciBuLFxuICAgICAgaSA9IDAsXG4gICAgICBqID0gMCxcbiAgICAgIHhpLFxuICAgICAgeGogPSB2YWx1ZXNbal07XG5cbiAgaWYgKGNvbXBhcmUgPT0gbnVsbCkgY29tcGFyZSA9IGFzY2VuZGluZztcblxuICB3aGlsZSAoKytpIDwgbikge1xuICAgIGlmIChjb21wYXJlKHhpID0gdmFsdWVzW2ldLCB4aikgPCAwIHx8IGNvbXBhcmUoeGosIHhqKSAhPT0gMCkge1xuICAgICAgeGogPSB4aSwgaiA9IGk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbXBhcmUoeGosIHhqKSA9PT0gMCkgcmV0dXJuIGo7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhcnJheSwgaTAsIGkxKSB7XG4gIHZhciBtID0gKGkxID09IG51bGwgPyBhcnJheS5sZW5ndGggOiBpMSkgLSAoaTAgPSBpMCA9PSBudWxsID8gMCA6ICtpMCksXG4gICAgICB0LFxuICAgICAgaTtcblxuICB3aGlsZSAobSkge1xuICAgIGkgPSBNYXRoLnJhbmRvbSgpICogbS0tIHwgMDtcbiAgICB0ID0gYXJyYXlbbSArIGkwXTtcbiAgICBhcnJheVttICsgaTBdID0gYXJyYXlbaSArIGkwXTtcbiAgICBhcnJheVtpICsgaTBdID0gdDtcbiAgfVxuXG4gIHJldHVybiBhcnJheTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcywgdmFsdWVvZikge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICBpID0gLTEsXG4gICAgICB2YWx1ZSxcbiAgICAgIHN1bSA9IDA7XG5cbiAgaWYgKHZhbHVlb2YgPT0gbnVsbCkge1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpZiAodmFsdWUgPSArdmFsdWVzW2ldKSBzdW0gKz0gdmFsdWU7IC8vIE5vdGU6IHplcm8gYW5kIG51bGwgYXJlIGVxdWl2YWxlbnQuXG4gICAgfVxuICB9XG5cbiAgZWxzZSB7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICh2YWx1ZSA9ICt2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgc3VtICs9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdW07XG59XG4iLCJpbXBvcnQge21hcH0gZnJvbSBcIi4uL2FycmF5XCI7XG5pbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuLi9hc2NlbmRpbmdcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlclwiO1xuaW1wb3J0IHF1YW50aWxlIGZyb20gXCIuLi9xdWFudGlsZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMsIG1pbiwgbWF4KSB7XG4gIHZhbHVlcyA9IG1hcC5jYWxsKHZhbHVlcywgbnVtYmVyKS5zb3J0KGFzY2VuZGluZyk7XG4gIHJldHVybiBNYXRoLmNlaWwoKG1heCAtIG1pbikgLyAoMiAqIChxdWFudGlsZSh2YWx1ZXMsIDAuNzUpIC0gcXVhbnRpbGUodmFsdWVzLCAwLjI1KSkgKiBNYXRoLnBvdyh2YWx1ZXMubGVuZ3RoLCAtMSAvIDMpKSk7XG59XG4iLCJpbXBvcnQgZGV2aWF0aW9uIGZyb20gXCIuLi9kZXZpYXRpb25cIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzLCBtaW4sIG1heCkge1xuICByZXR1cm4gTWF0aC5jZWlsKChtYXggLSBtaW4pIC8gKDMuNSAqIGRldmlhdGlvbih2YWx1ZXMpICogTWF0aC5wb3codmFsdWVzLmxlbmd0aCwgLTEgLyAzKSkpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHJldHVybiBNYXRoLmNlaWwoTWF0aC5sb2codmFsdWVzLmxlbmd0aCkgLyBNYXRoLkxOMikgKyAxO1xufVxuIiwidmFyIGUxMCA9IE1hdGguc3FydCg1MCksXG4gICAgZTUgPSBNYXRoLnNxcnQoMTApLFxuICAgIGUyID0gTWF0aC5zcXJ0KDIpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgdmFyIHJldmVyc2UsXG4gICAgICBpID0gLTEsXG4gICAgICBuLFxuICAgICAgdGlja3MsXG4gICAgICBzdGVwO1xuXG4gIHN0b3AgPSArc3RvcCwgc3RhcnQgPSArc3RhcnQsIGNvdW50ID0gK2NvdW50O1xuICBpZiAoc3RhcnQgPT09IHN0b3AgJiYgY291bnQgPiAwKSByZXR1cm4gW3N0YXJ0XTtcbiAgaWYgKHJldmVyc2UgPSBzdG9wIDwgc3RhcnQpIG4gPSBzdGFydCwgc3RhcnQgPSBzdG9wLCBzdG9wID0gbjtcbiAgaWYgKChzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpKSA9PT0gMCB8fCAhaXNGaW5pdGUoc3RlcCkpIHJldHVybiBbXTtcblxuICBpZiAoc3RlcCA+IDApIHtcbiAgICBzdGFydCA9IE1hdGguY2VpbChzdGFydCAvIHN0ZXApO1xuICAgIHN0b3AgPSBNYXRoLmZsb29yKHN0b3AgLyBzdGVwKTtcbiAgICB0aWNrcyA9IG5ldyBBcnJheShuID0gTWF0aC5jZWlsKHN0b3AgLSBzdGFydCArIDEpKTtcbiAgICB3aGlsZSAoKytpIDwgbikgdGlja3NbaV0gPSAoc3RhcnQgKyBpKSAqIHN0ZXA7XG4gIH0gZWxzZSB7XG4gICAgc3RhcnQgPSBNYXRoLmZsb29yKHN0YXJ0ICogc3RlcCk7XG4gICAgc3RvcCA9IE1hdGguY2VpbChzdG9wICogc3RlcCk7XG4gICAgdGlja3MgPSBuZXcgQXJyYXkobiA9IE1hdGguY2VpbChzdGFydCAtIHN0b3AgKyAxKSk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHRpY2tzW2ldID0gKHN0YXJ0IC0gaSkgLyBzdGVwO1xuICB9XG5cbiAgaWYgKHJldmVyc2UpIHRpY2tzLnJldmVyc2UoKTtcblxuICByZXR1cm4gdGlja3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCkge1xuICB2YXIgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLFxuICAgICAgcG93ZXIgPSBNYXRoLmZsb29yKE1hdGgubG9nKHN0ZXApIC8gTWF0aC5MTjEwKSxcbiAgICAgIGVycm9yID0gc3RlcCAvIE1hdGgucG93KDEwLCBwb3dlcik7XG4gIHJldHVybiBwb3dlciA+PSAwXG4gICAgICA/IChlcnJvciA+PSBlMTAgPyAxMCA6IGVycm9yID49IGU1ID8gNSA6IGVycm9yID49IGUyID8gMiA6IDEpICogTWF0aC5wb3coMTAsIHBvd2VyKVxuICAgICAgOiAtTWF0aC5wb3coMTAsIC1wb3dlcikgLyAoZXJyb3IgPj0gZTEwID8gMTAgOiBlcnJvciA+PSBlNSA/IDUgOiBlcnJvciA+PSBlMiA/IDIgOiAxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCkge1xuICB2YXIgc3RlcDAgPSBNYXRoLmFicyhzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLFxuICAgICAgc3RlcDEgPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZyhzdGVwMCkgLyBNYXRoLkxOMTApKSxcbiAgICAgIGVycm9yID0gc3RlcDAgLyBzdGVwMTtcbiAgaWYgKGVycm9yID49IGUxMCkgc3RlcDEgKj0gMTA7XG4gIGVsc2UgaWYgKGVycm9yID49IGU1KSBzdGVwMSAqPSA1O1xuICBlbHNlIGlmIChlcnJvciA+PSBlMikgc3RlcDEgKj0gMjtcbiAgcmV0dXJuIHN0b3AgPCBzdGFydCA/IC1zdGVwMSA6IHN0ZXAxO1xufVxuIiwiaW1wb3J0IG1pbiBmcm9tIFwiLi9taW5cIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0cml4KSB7XG4gIGlmICghKG4gPSBtYXRyaXgubGVuZ3RoKSkgcmV0dXJuIFtdO1xuICBmb3IgKHZhciBpID0gLTEsIG0gPSBtaW4obWF0cml4LCBsZW5ndGgpLCB0cmFuc3Bvc2UgPSBuZXcgQXJyYXkobSk7ICsraSA8IG07KSB7XG4gICAgZm9yICh2YXIgaiA9IC0xLCBuLCByb3cgPSB0cmFuc3Bvc2VbaV0gPSBuZXcgQXJyYXkobik7ICsraiA8IG47KSB7XG4gICAgICByb3dbal0gPSBtYXRyaXhbal1baV07XG4gICAgfVxuICB9XG4gIHJldHVybiB0cmFuc3Bvc2U7XG59XG5cbmZ1bmN0aW9uIGxlbmd0aChkKSB7XG4gIHJldHVybiBkLmxlbmd0aDtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcywgdmFsdWVvZikge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICBtID0gMCxcbiAgICAgIGkgPSAtMSxcbiAgICAgIG1lYW4gPSAwLFxuICAgICAgdmFsdWUsXG4gICAgICBkZWx0YSxcbiAgICAgIHN1bSA9IDA7XG5cbiAgaWYgKHZhbHVlb2YgPT0gbnVsbCkge1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyKHZhbHVlc1tpXSkpKSB7XG4gICAgICAgIGRlbHRhID0gdmFsdWUgLSBtZWFuO1xuICAgICAgICBtZWFuICs9IGRlbHRhIC8gKyttO1xuICAgICAgICBzdW0gKz0gZGVsdGEgKiAodmFsdWUgLSBtZWFuKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBlbHNlIHtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKCFpc05hTih2YWx1ZSA9IG51bWJlcih2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkpKSB7XG4gICAgICAgIGRlbHRhID0gdmFsdWUgLSBtZWFuO1xuICAgICAgICBtZWFuICs9IGRlbHRhIC8gKyttO1xuICAgICAgICBzdW0gKz0gZGVsdGEgKiAodmFsdWUgLSBtZWFuKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAobSA+IDEpIHJldHVybiBzdW0gLyAobSAtIDEpO1xufVxuIiwiaW1wb3J0IHRyYW5zcG9zZSBmcm9tIFwiLi90cmFuc3Bvc2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0cmFuc3Bvc2UoYXJndW1lbnRzKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hcCkge1xuICB2YXIgZW50cmllcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gbWFwKSBlbnRyaWVzLnB1c2goe2tleToga2V5LCB2YWx1ZTogbWFwW2tleV19KTtcbiAgcmV0dXJuIGVudHJpZXM7XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgbmVzdH0gZnJvbSBcIi4vbmVzdFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNldH0gZnJvbSBcIi4vc2V0XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWFwfSBmcm9tIFwiLi9tYXBcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBrZXlzfSBmcm9tIFwiLi9rZXlzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdmFsdWVzfSBmcm9tIFwiLi92YWx1ZXNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBlbnRyaWVzfSBmcm9tIFwiLi9lbnRyaWVzXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXApIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG1hcCkga2V5cy5wdXNoKGtleSk7XG4gIHJldHVybiBrZXlzO1xufVxuIiwiZXhwb3J0IHZhciBwcmVmaXggPSBcIiRcIjtcblxuZnVuY3Rpb24gTWFwKCkge31cblxuTWFwLnByb3RvdHlwZSA9IG1hcC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBNYXAsXG4gIGhhczogZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIChwcmVmaXggKyBrZXkpIGluIHRoaXM7XG4gIH0sXG4gIGdldDogZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIHRoaXNbcHJlZml4ICsga2V5XTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgdGhpc1twcmVmaXggKyBrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlbW92ZTogZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIHByb3BlcnR5ID0gcHJlZml4ICsga2V5O1xuICAgIHJldHVybiBwcm9wZXJ0eSBpbiB0aGlzICYmIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTtcbiAgfSxcbiAgY2xlYXI6IGZ1bmN0aW9uKCkge1xuICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSBkZWxldGUgdGhpc1twcm9wZXJ0eV07XG4gIH0sXG4gIGtleXM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGtleXMucHVzaChwcm9wZXJ0eS5zbGljZSgxKSk7XG4gICAgcmV0dXJuIGtleXM7XG4gIH0sXG4gIHZhbHVlczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSB2YWx1ZXMucHVzaCh0aGlzW3Byb3BlcnR5XSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfSxcbiAgZW50cmllczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGVudHJpZXMgPSBbXTtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgZW50cmllcy5wdXNoKHtrZXk6IHByb3BlcnR5LnNsaWNlKDEpLCB2YWx1ZTogdGhpc1twcm9wZXJ0eV19KTtcbiAgICByZXR1cm4gZW50cmllcztcbiAgfSxcbiAgc2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNpemUgPSAwO1xuICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSArK3NpemU7XG4gICAgcmV0dXJuIHNpemU7XG4gIH0sXG4gIGVtcHR5OiBmdW5jdGlvbigpIHtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBlYWNoOiBmdW5jdGlvbihmKSB7XG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGYodGhpc1twcm9wZXJ0eV0sIHByb3BlcnR5LnNsaWNlKDEpLCB0aGlzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gbWFwKG9iamVjdCwgZikge1xuICB2YXIgbWFwID0gbmV3IE1hcDtcblxuICAvLyBDb3B5IGNvbnN0cnVjdG9yLlxuICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWFwKSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7IG1hcC5zZXQoa2V5LCB2YWx1ZSk7IH0pO1xuXG4gIC8vIEluZGV4IGFycmF5IGJ5IG51bWVyaWMgaW5kZXggb3Igc3BlY2lmaWVkIGtleSBmdW5jdGlvbi5cbiAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgdmFyIGkgPSAtMSxcbiAgICAgICAgbiA9IG9iamVjdC5sZW5ndGgsXG4gICAgICAgIG87XG5cbiAgICBpZiAoZiA9PSBudWxsKSB3aGlsZSAoKytpIDwgbikgbWFwLnNldChpLCBvYmplY3RbaV0pO1xuICAgIGVsc2Ugd2hpbGUgKCsraSA8IG4pIG1hcC5zZXQoZihvID0gb2JqZWN0W2ldLCBpLCBvYmplY3QpLCBvKTtcbiAgfVxuXG4gIC8vIENvbnZlcnQgb2JqZWN0IHRvIG1hcC5cbiAgZWxzZSBpZiAob2JqZWN0KSBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSBtYXAuc2V0KGtleSwgb2JqZWN0W2tleV0pO1xuXG4gIHJldHVybiBtYXA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1hcDtcbiIsImltcG9ydCBtYXAgZnJvbSBcIi4vbWFwXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIga2V5cyA9IFtdLFxuICAgICAgc29ydEtleXMgPSBbXSxcbiAgICAgIHNvcnRWYWx1ZXMsXG4gICAgICByb2xsdXAsXG4gICAgICBuZXN0O1xuXG4gIGZ1bmN0aW9uIGFwcGx5KGFycmF5LCBkZXB0aCwgY3JlYXRlUmVzdWx0LCBzZXRSZXN1bHQpIHtcbiAgICBpZiAoZGVwdGggPj0ga2V5cy5sZW5ndGgpIHtcbiAgICAgIGlmIChzb3J0VmFsdWVzICE9IG51bGwpIGFycmF5LnNvcnQoc29ydFZhbHVlcyk7XG4gICAgICByZXR1cm4gcm9sbHVwICE9IG51bGwgPyByb2xsdXAoYXJyYXkpIDogYXJyYXk7XG4gICAgfVxuXG4gICAgdmFyIGkgPSAtMSxcbiAgICAgICAgbiA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAga2V5ID0ga2V5c1tkZXB0aCsrXSxcbiAgICAgICAga2V5VmFsdWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB2YWx1ZXNCeUtleSA9IG1hcCgpLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICh2YWx1ZXMgPSB2YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWUgPSBrZXkodmFsdWUgPSBhcnJheVtpXSkgKyBcIlwiKSkge1xuICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXNCeUtleS5zZXQoa2V5VmFsdWUsIFt2YWx1ZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhbHVlc0J5S2V5LmVhY2goZnVuY3Rpb24odmFsdWVzLCBrZXkpIHtcbiAgICAgIHNldFJlc3VsdChyZXN1bHQsIGtleSwgYXBwbHkodmFsdWVzLCBkZXB0aCwgY3JlYXRlUmVzdWx0LCBzZXRSZXN1bHQpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBlbnRyaWVzKG1hcCwgZGVwdGgpIHtcbiAgICBpZiAoKytkZXB0aCA+IGtleXMubGVuZ3RoKSByZXR1cm4gbWFwO1xuICAgIHZhciBhcnJheSwgc29ydEtleSA9IHNvcnRLZXlzW2RlcHRoIC0gMV07XG4gICAgaWYgKHJvbGx1cCAhPSBudWxsICYmIGRlcHRoID49IGtleXMubGVuZ3RoKSBhcnJheSA9IG1hcC5lbnRyaWVzKCk7XG4gICAgZWxzZSBhcnJheSA9IFtdLCBtYXAuZWFjaChmdW5jdGlvbih2LCBrKSB7IGFycmF5LnB1c2goe2tleTogaywgdmFsdWVzOiBlbnRyaWVzKHYsIGRlcHRoKX0pOyB9KTtcbiAgICByZXR1cm4gc29ydEtleSAhPSBudWxsID8gYXJyYXkuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBzb3J0S2V5KGEua2V5LCBiLmtleSk7IH0pIDogYXJyYXk7XG4gIH1cblxuICByZXR1cm4gbmVzdCA9IHtcbiAgICBvYmplY3Q6IGZ1bmN0aW9uKGFycmF5KSB7IHJldHVybiBhcHBseShhcnJheSwgMCwgY3JlYXRlT2JqZWN0LCBzZXRPYmplY3QpOyB9LFxuICAgIG1hcDogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGFwcGx5KGFycmF5LCAwLCBjcmVhdGVNYXAsIHNldE1hcCk7IH0sXG4gICAgZW50cmllczogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGVudHJpZXMoYXBwbHkoYXJyYXksIDAsIGNyZWF0ZU1hcCwgc2V0TWFwKSwgMCk7IH0sXG4gICAga2V5OiBmdW5jdGlvbihkKSB7IGtleXMucHVzaChkKTsgcmV0dXJuIG5lc3Q7IH0sXG4gICAgc29ydEtleXM6IGZ1bmN0aW9uKG9yZGVyKSB7IHNvcnRLZXlzW2tleXMubGVuZ3RoIC0gMV0gPSBvcmRlcjsgcmV0dXJuIG5lc3Q7IH0sXG4gICAgc29ydFZhbHVlczogZnVuY3Rpb24ob3JkZXIpIHsgc29ydFZhbHVlcyA9IG9yZGVyOyByZXR1cm4gbmVzdDsgfSxcbiAgICByb2xsdXA6IGZ1bmN0aW9uKGYpIHsgcm9sbHVwID0gZjsgcmV0dXJuIG5lc3Q7IH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlT2JqZWN0KCkge1xuICByZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIHNldE9iamVjdChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFwKCkge1xuICByZXR1cm4gbWFwKCk7XG59XG5cbmZ1bmN0aW9uIHNldE1hcChtYXAsIGtleSwgdmFsdWUpIHtcbiAgbWFwLnNldChrZXksIHZhbHVlKTtcbn1cbiIsImltcG9ydCB7ZGVmYXVsdCBhcyBtYXAsIHByZWZpeH0gZnJvbSBcIi4vbWFwXCI7XG5cbmZ1bmN0aW9uIFNldCgpIHt9XG5cbnZhciBwcm90byA9IG1hcC5wcm90b3R5cGU7XG5cblNldC5wcm90b3R5cGUgPSBzZXQucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogU2V0LFxuICBoYXM6IHByb3RvLmhhcyxcbiAgYWRkOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhbHVlICs9IFwiXCI7XG4gICAgdGhpc1twcmVmaXggKyB2YWx1ZV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVtb3ZlOiBwcm90by5yZW1vdmUsXG4gIGNsZWFyOiBwcm90by5jbGVhcixcbiAgdmFsdWVzOiBwcm90by5rZXlzLFxuICBzaXplOiBwcm90by5zaXplLFxuICBlbXB0eTogcHJvdG8uZW1wdHksXG4gIGVhY2g6IHByb3RvLmVhY2hcbn07XG5cbmZ1bmN0aW9uIHNldChvYmplY3QsIGYpIHtcbiAgdmFyIHNldCA9IG5ldyBTZXQ7XG5cbiAgLy8gQ29weSBjb25zdHJ1Y3Rvci5cbiAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNldCkgb2JqZWN0LmVhY2goZnVuY3Rpb24odmFsdWUpIHsgc2V0LmFkZCh2YWx1ZSk7IH0pO1xuXG4gIC8vIE90aGVyd2lzZSwgYXNzdW1lIGl04oCZcyBhbiBhcnJheS5cbiAgZWxzZSBpZiAob2JqZWN0KSB7XG4gICAgdmFyIGkgPSAtMSwgbiA9IG9iamVjdC5sZW5ndGg7XG4gICAgaWYgKGYgPT0gbnVsbCkgd2hpbGUgKCsraSA8IG4pIHNldC5hZGQob2JqZWN0W2ldKTtcbiAgICBlbHNlIHdoaWxlICgrK2kgPCBuKSBzZXQuYWRkKGYob2JqZWN0W2ldLCBpLCBvYmplY3QpKTtcbiAgfVxuXG4gIHJldHVybiBzZXQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldDtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hcCkge1xuICB2YXIgdmFsdWVzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBtYXApIHZhbHVlcy5wdXNoKG1hcFtrZXldKTtcbiAgcmV0dXJuIHZhbHVlcztcbn1cbiIsImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gQ29sb3IoKSB7fVxuXG5leHBvcnQgdmFyIGRhcmtlciA9IDAuNztcbmV4cG9ydCB2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyO1xuXG52YXIgcmVJID0gXCJcXFxccyooWystXT9cXFxcZCspXFxcXHMqXCIsXG4gICAgcmVOID0gXCJcXFxccyooWystXT9cXFxcZCpcXFxcLj9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPylcXFxccypcIixcbiAgICByZVAgPSBcIlxcXFxzKihbKy1dP1xcXFxkKlxcXFwuP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KSVcXFxccypcIixcbiAgICByZUhleDMgPSAvXiMoWzAtOWEtZl17M30pJC8sXG4gICAgcmVIZXg2ID0gL14jKFswLTlhLWZdezZ9KSQvLFxuICAgIHJlUmdiSW50ZWdlciA9IG5ldyBSZWdFeHAoXCJecmdiXFxcXChcIiArIFtyZUksIHJlSSwgcmVJXSArIFwiXFxcXCkkXCIpLFxuICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoXCJecmdiXFxcXChcIiArIFtyZVAsIHJlUCwgcmVQXSArIFwiXFxcXCkkXCIpLFxuICAgIHJlUmdiYUludGVnZXIgPSBuZXcgUmVnRXhwKFwiXnJnYmFcXFxcKFwiICsgW3JlSSwgcmVJLCByZUksIHJlTl0gKyBcIlxcXFwpJFwiKSxcbiAgICByZVJnYmFQZXJjZW50ID0gbmV3IFJlZ0V4cChcIl5yZ2JhXFxcXChcIiArIFtyZVAsIHJlUCwgcmVQLCByZU5dICsgXCJcXFxcKSRcIiksXG4gICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cChcIl5oc2xcXFxcKFwiICsgW3JlTiwgcmVQLCByZVBdICsgXCJcXFxcKSRcIiksXG4gICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoXCJeaHNsYVxcXFwoXCIgKyBbcmVOLCByZVAsIHJlUCwgcmVOXSArIFwiXFxcXCkkXCIpO1xuXG52YXIgbmFtZWQgPSB7XG4gIGFsaWNlYmx1ZTogMHhmMGY4ZmYsXG4gIGFudGlxdWV3aGl0ZTogMHhmYWViZDcsXG4gIGFxdWE6IDB4MDBmZmZmLFxuICBhcXVhbWFyaW5lOiAweDdmZmZkNCxcbiAgYXp1cmU6IDB4ZjBmZmZmLFxuICBiZWlnZTogMHhmNWY1ZGMsXG4gIGJpc3F1ZTogMHhmZmU0YzQsXG4gIGJsYWNrOiAweDAwMDAwMCxcbiAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkLFxuICBibHVlOiAweDAwMDBmZixcbiAgYmx1ZXZpb2xldDogMHg4YTJiZTIsXG4gIGJyb3duOiAweGE1MmEyYSxcbiAgYnVybHl3b29kOiAweGRlYjg4NyxcbiAgY2FkZXRibHVlOiAweDVmOWVhMCxcbiAgY2hhcnRyZXVzZTogMHg3ZmZmMDAsXG4gIGNob2NvbGF0ZTogMHhkMjY5MWUsXG4gIGNvcmFsOiAweGZmN2Y1MCxcbiAgY29ybmZsb3dlcmJsdWU6IDB4NjQ5NWVkLFxuICBjb3Juc2lsazogMHhmZmY4ZGMsXG4gIGNyaW1zb246IDB4ZGMxNDNjLFxuICBjeWFuOiAweDAwZmZmZixcbiAgZGFya2JsdWU6IDB4MDAwMDhiLFxuICBkYXJrY3lhbjogMHgwMDhiOGIsXG4gIGRhcmtnb2xkZW5yb2Q6IDB4Yjg4NjBiLFxuICBkYXJrZ3JheTogMHhhOWE5YTksXG4gIGRhcmtncmVlbjogMHgwMDY0MDAsXG4gIGRhcmtncmV5OiAweGE5YTlhOSxcbiAgZGFya2toYWtpOiAweGJkYjc2YixcbiAgZGFya21hZ2VudGE6IDB4OGIwMDhiLFxuICBkYXJrb2xpdmVncmVlbjogMHg1NTZiMmYsXG4gIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLFxuICBkYXJrb3JjaGlkOiAweDk5MzJjYyxcbiAgZGFya3JlZDogMHg4YjAwMDAsXG4gIGRhcmtzYWxtb246IDB4ZTk5NjdhLFxuICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmLFxuICBkYXJrc2xhdGVibHVlOiAweDQ4M2Q4YixcbiAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsXG4gIGRhcmtzbGF0ZWdyZXk6IDB4MmY0ZjRmLFxuICBkYXJrdHVycXVvaXNlOiAweDAwY2VkMSxcbiAgZGFya3Zpb2xldDogMHg5NDAwZDMsXG4gIGRlZXBwaW5rOiAweGZmMTQ5MyxcbiAgZGVlcHNreWJsdWU6IDB4MDBiZmZmLFxuICBkaW1ncmF5OiAweDY5Njk2OSxcbiAgZGltZ3JleTogMHg2OTY5NjksXG4gIGRvZGdlcmJsdWU6IDB4MWU5MGZmLFxuICBmaXJlYnJpY2s6IDB4YjIyMjIyLFxuICBmbG9yYWx3aGl0ZTogMHhmZmZhZjAsXG4gIGZvcmVzdGdyZWVuOiAweDIyOGIyMixcbiAgZnVjaHNpYTogMHhmZjAwZmYsXG4gIGdhaW5zYm9ybzogMHhkY2RjZGMsXG4gIGdob3N0d2hpdGU6IDB4ZjhmOGZmLFxuICBnb2xkOiAweGZmZDcwMCxcbiAgZ29sZGVucm9kOiAweGRhYTUyMCxcbiAgZ3JheTogMHg4MDgwODAsXG4gIGdyZWVuOiAweDAwODAwMCxcbiAgZ3JlZW55ZWxsb3c6IDB4YWRmZjJmLFxuICBncmV5OiAweDgwODA4MCxcbiAgaG9uZXlkZXc6IDB4ZjBmZmYwLFxuICBob3RwaW5rOiAweGZmNjliNCxcbiAgaW5kaWFucmVkOiAweGNkNWM1YyxcbiAgaW5kaWdvOiAweDRiMDA4MixcbiAgaXZvcnk6IDB4ZmZmZmYwLFxuICBraGFraTogMHhmMGU2OGMsXG4gIGxhdmVuZGVyOiAweGU2ZTZmYSxcbiAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjUsXG4gIGxhd25ncmVlbjogMHg3Y2ZjMDAsXG4gIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsXG4gIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTYsXG4gIGxpZ2h0Y29yYWw6IDB4ZjA4MDgwLFxuICBsaWdodGN5YW46IDB4ZTBmZmZmLFxuICBsaWdodGdvbGRlbnJvZHllbGxvdzogMHhmYWZhZDIsXG4gIGxpZ2h0Z3JheTogMHhkM2QzZDMsXG4gIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLFxuICBsaWdodGdyZXk6IDB4ZDNkM2QzLFxuICBsaWdodHBpbms6IDB4ZmZiNmMxLFxuICBsaWdodHNhbG1vbjogMHhmZmEwN2EsXG4gIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhLFxuICBsaWdodHNreWJsdWU6IDB4ODdjZWZhLFxuICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksXG4gIGxpZ2h0c2xhdGVncmV5OiAweDc3ODg5OSxcbiAgbGlnaHRzdGVlbGJsdWU6IDB4YjBjNGRlLFxuICBsaWdodHllbGxvdzogMHhmZmZmZTAsXG4gIGxpbWU6IDB4MDBmZjAwLFxuICBsaW1lZ3JlZW46IDB4MzJjZDMyLFxuICBsaW5lbjogMHhmYWYwZTYsXG4gIG1hZ2VudGE6IDB4ZmYwMGZmLFxuICBtYXJvb246IDB4ODAwMDAwLFxuICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSxcbiAgbWVkaXVtYmx1ZTogMHgwMDAwY2QsXG4gIG1lZGl1bW9yY2hpZDogMHhiYTU1ZDMsXG4gIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsXG4gIG1lZGl1bXNlYWdyZWVuOiAweDNjYjM3MSxcbiAgbWVkaXVtc2xhdGVibHVlOiAweDdiNjhlZSxcbiAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLFxuICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjLFxuICBtZWRpdW12aW9sZXRyZWQ6IDB4YzcxNTg1LFxuICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLFxuICBtaW50Y3JlYW06IDB4ZjVmZmZhLFxuICBtaXN0eXJvc2U6IDB4ZmZlNGUxLFxuICBtb2NjYXNpbjogMHhmZmU0YjUsXG4gIG5hdmFqb3doaXRlOiAweGZmZGVhZCxcbiAgbmF2eTogMHgwMDAwODAsXG4gIG9sZGxhY2U6IDB4ZmRmNWU2LFxuICBvbGl2ZTogMHg4MDgwMDAsXG4gIG9saXZlZHJhYjogMHg2YjhlMjMsXG4gIG9yYW5nZTogMHhmZmE1MDAsXG4gIG9yYW5nZXJlZDogMHhmZjQ1MDAsXG4gIG9yY2hpZDogMHhkYTcwZDYsXG4gIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLFxuICBwYWxlZ3JlZW46IDB4OThmYjk4LFxuICBwYWxldHVycXVvaXNlOiAweGFmZWVlZSxcbiAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsXG4gIHBhcGF5YXdoaXA6IDB4ZmZlZmQ1LFxuICBwZWFjaHB1ZmY6IDB4ZmZkYWI5LFxuICBwZXJ1OiAweGNkODUzZixcbiAgcGluazogMHhmZmMwY2IsXG4gIHBsdW06IDB4ZGRhMGRkLFxuICBwb3dkZXJibHVlOiAweGIwZTBlNixcbiAgcHVycGxlOiAweDgwMDA4MCxcbiAgcmViZWNjYXB1cnBsZTogMHg2NjMzOTksXG4gIHJlZDogMHhmZjAwMDAsXG4gIHJvc3licm93bjogMHhiYzhmOGYsXG4gIHJveWFsYmx1ZTogMHg0MTY5ZTEsXG4gIHNhZGRsZWJyb3duOiAweDhiNDUxMyxcbiAgc2FsbW9uOiAweGZhODA3MixcbiAgc2FuZHlicm93bjogMHhmNGE0NjAsXG4gIHNlYWdyZWVuOiAweDJlOGI1NyxcbiAgc2Vhc2hlbGw6IDB4ZmZmNWVlLFxuICBzaWVubmE6IDB4YTA1MjJkLFxuICBzaWx2ZXI6IDB4YzBjMGMwLFxuICBza3libHVlOiAweDg3Y2VlYixcbiAgc2xhdGVibHVlOiAweDZhNWFjZCxcbiAgc2xhdGVncmF5OiAweDcwODA5MCxcbiAgc2xhdGVncmV5OiAweDcwODA5MCxcbiAgc25vdzogMHhmZmZhZmEsXG4gIHNwcmluZ2dyZWVuOiAweDAwZmY3ZixcbiAgc3RlZWxibHVlOiAweDQ2ODJiNCxcbiAgdGFuOiAweGQyYjQ4YyxcbiAgdGVhbDogMHgwMDgwODAsXG4gIHRoaXN0bGU6IDB4ZDhiZmQ4LFxuICB0b21hdG86IDB4ZmY2MzQ3LFxuICB0dXJxdW9pc2U6IDB4NDBlMGQwLFxuICB2aW9sZXQ6IDB4ZWU4MmVlLFxuICB3aGVhdDogMHhmNWRlYjMsXG4gIHdoaXRlOiAweGZmZmZmZixcbiAgd2hpdGVzbW9rZTogMHhmNWY1ZjUsXG4gIHllbGxvdzogMHhmZmZmMDAsXG4gIHllbGxvd2dyZWVuOiAweDlhY2QzMlxufTtcblxuZGVmaW5lKENvbG9yLCBjb2xvciwge1xuICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKTtcbiAgfSxcbiAgaGV4OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5yZ2IoKS5oZXgoKTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpICsgXCJcIjtcbiAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbG9yKGZvcm1hdCkge1xuICB2YXIgbTtcbiAgZm9ybWF0ID0gKGZvcm1hdCArIFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gKG0gPSByZUhleDMuZXhlYyhmb3JtYXQpKSA/IChtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBuZXcgUmdiKChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4MGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSkgLy8gI2YwMFxuICAgICAgOiAobSA9IHJlSGV4Ni5leGVjKGZvcm1hdCkpID8gcmdibihwYXJzZUludChtWzFdLCAxNikpIC8vICNmZjAwMDBcbiAgICAgIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMClcbiAgICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSlcbiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKVxuICAgICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSlcbiAgICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpXG4gICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpXG4gICAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pXG4gICAgICA6IGZvcm1hdCA9PT0gXCJ0cmFuc3BhcmVudFwiID8gbmV3IFJnYihOYU4sIE5hTiwgTmFOLCAwKVxuICAgICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiByZ2JuKG4pIHtcbiAgcmV0dXJuIG5ldyBSZ2IobiA+PiAxNiAmIDB4ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTtcbn1cblxuZnVuY3Rpb24gcmdiYShyLCBnLCBiLCBhKSB7XG4gIGlmIChhIDw9IDApIHIgPSBnID0gYiA9IE5hTjtcbiAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgUmdiO1xuICBvID0gby5yZ2IoKTtcbiAgcmV0dXJuIG5ldyBSZ2Ioby5yLCBvLmcsIG8uYiwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gcmdiQ29udmVydChyKSA6IG5ldyBSZ2IociwgZywgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgdGhpcy5yID0gK3I7XG4gIHRoaXMuZyA9ICtnO1xuICB0aGlzLmIgPSArYjtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShSZ2IsIHJnYiwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKDAgPD0gdGhpcy5yICYmIHRoaXMuciA8PSAyNTUpXG4gICAgICAgICYmICgwIDw9IHRoaXMuZyAmJiB0aGlzLmcgPD0gMjU1KVxuICAgICAgICAmJiAoMCA8PSB0aGlzLmIgJiYgdGhpcy5iIDw9IDI1NSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgaGV4OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCIjXCIgKyBoZXgodGhpcy5yKSArIGhleCh0aGlzLmcpICsgaGV4KHRoaXMuYik7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTtcbiAgICByZXR1cm4gKGEgPT09IDEgPyBcInJnYihcIiA6IFwicmdiYShcIilcbiAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5yKSB8fCAwKSkgKyBcIiwgXCJcbiAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5nKSB8fCAwKSkgKyBcIiwgXCJcbiAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5iKSB8fCAwKSlcbiAgICAgICAgKyAoYSA9PT0gMSA/IFwiKVwiIDogXCIsIFwiICsgYSArIFwiKVwiKTtcbiAgfVxufSkpO1xuXG5mdW5jdGlvbiBoZXgodmFsdWUpIHtcbiAgdmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodmFsdWUpIHx8IDApKTtcbiAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gXCIwXCIgOiBcIlwiKSArIHZhbHVlLnRvU3RyaW5nKDE2KTtcbn1cblxuZnVuY3Rpb24gaHNsYShoLCBzLCBsLCBhKSB7XG4gIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjtcbiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47XG4gIGVsc2UgaWYgKHMgPD0gMCkgaCA9IE5hTjtcbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2xDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBuZXcgSHNsKG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBvO1xuICBvID0gby5yZ2IoKTtcbiAgdmFyIHIgPSBvLnIgLyAyNTUsXG4gICAgICBnID0gby5nIC8gMjU1LFxuICAgICAgYiA9IG8uYiAvIDI1NSxcbiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLFxuICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksXG4gICAgICBoID0gTmFOLFxuICAgICAgcyA9IG1heCAtIG1pbixcbiAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7XG4gIGlmIChzKSB7XG4gICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7XG4gICAgZWxzZSBpZiAoZyA9PT0gbWF4KSBoID0gKGIgLSByKSAvIHMgKyAyO1xuICAgIGVsc2UgaCA9IChyIC0gZykgLyBzICsgNDtcbiAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluO1xuICAgIGggKj0gNjA7XG4gIH0gZWxzZSB7XG4gICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7XG4gIH1cbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaHNsQ29udmVydChoKSA6IG5ldyBIc2woaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5mdW5jdGlvbiBIc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5zID0gK3M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKEhzbCwgaHNsLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLFxuICAgICAgICBzID0gaXNOYU4oaCkgfHwgaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMsXG4gICAgICAgIGwgPSB0aGlzLmwsXG4gICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsXG4gICAgICAgIG0xID0gMiAqIGwgLSBtMjtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIGhzbDJyZ2IoaCA+PSAyNDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCA8IDEyMCA/IGggKyAyNDAgOiBoIC0gMTIwLCBtMSwgbTIpLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfSxcbiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAoMCA8PSB0aGlzLnMgJiYgdGhpcy5zIDw9IDEgfHwgaXNOYU4odGhpcy5zKSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5sICYmIHRoaXMubCA8PSAxKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9XG59KSk7XG5cbi8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi9cbmZ1bmN0aW9uIGhzbDJyZ2IoaCwgbTEsIG0yKSB7XG4gIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjBcbiAgICAgIDogaCA8IDE4MCA/IG0yXG4gICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwXG4gICAgICA6IG0xKSAqIDI1NTtcbn1cbiIsImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZVwiO1xuaW1wb3J0IHtDb2xvciwgcmdiQ29udmVydCwgUmdiLCBkYXJrZXIsIGJyaWdodGVyfSBmcm9tIFwiLi9jb2xvclwiO1xuaW1wb3J0IHtkZWcycmFkLCByYWQyZGVnfSBmcm9tIFwiLi9tYXRoXCI7XG5cbnZhciBBID0gLTAuMTQ4NjEsXG4gICAgQiA9ICsxLjc4Mjc3LFxuICAgIEMgPSAtMC4yOTIyNyxcbiAgICBEID0gLTAuOTA2NDksXG4gICAgRSA9ICsxLjk3Mjk0LFxuICAgIEVEID0gRSAqIEQsXG4gICAgRUIgPSBFICogQixcbiAgICBCQ19EQSA9IEIgKiBDIC0gRCAqIEE7XG5cbmZ1bmN0aW9uIGN1YmVoZWxpeENvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIEN1YmVoZWxpeCkgcmV0dXJuIG5ldyBDdWJlaGVsaXgoby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYikpIG8gPSByZ2JDb252ZXJ0KG8pO1xuICB2YXIgciA9IG8uciAvIDI1NSxcbiAgICAgIGcgPSBvLmcgLyAyNTUsXG4gICAgICBiID0gby5iIC8gMjU1LFxuICAgICAgbCA9IChCQ19EQSAqIGIgKyBFRCAqIHIgLSBFQiAqIGcpIC8gKEJDX0RBICsgRUQgLSBFQiksXG4gICAgICBibCA9IGIgLSBsLFxuICAgICAgayA9IChFICogKGcgLSBsKSAtIEMgKiBibCkgLyBELFxuICAgICAgcyA9IE1hdGguc3FydChrICogayArIGJsICogYmwpIC8gKEUgKiBsICogKDEgLSBsKSksIC8vIE5hTiBpZiBsPTAgb3IgbD0xXG4gICAgICBoID0gcyA/IE1hdGguYXRhbjIoaywgYmwpICogcmFkMmRlZyAtIDEyMCA6IE5hTjtcbiAgcmV0dXJuIG5ldyBDdWJlaGVsaXgoaCA8IDAgPyBoICsgMzYwIDogaCwgcywgbCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBjdWJlaGVsaXhDb252ZXJ0KGgpIDogbmV3IEN1YmVoZWxpeChoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5zID0gK3M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKEN1YmVoZWxpeCwgY3ViZWhlbGl4LCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgQ3ViZWhlbGl4KHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoID0gaXNOYU4odGhpcy5oKSA/IDAgOiAodGhpcy5oICsgMTIwKSAqIGRlZzJyYWQsXG4gICAgICAgIGwgPSArdGhpcy5sLFxuICAgICAgICBhID0gaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMgKiBsICogKDEgLSBsKSxcbiAgICAgICAgY29zaCA9IE1hdGguY29zKGgpLFxuICAgICAgICBzaW5oID0gTWF0aC5zaW4oaCk7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICAyNTUgKiAobCArIGEgKiAoQSAqIGNvc2ggKyBCICogc2luaCkpLFxuICAgICAgMjU1ICogKGwgKyBhICogKEMgKiBjb3NoICsgRCAqIHNpbmgpKSxcbiAgICAgIDI1NSAqIChsICsgYSAqIChFICogY29zaCkpLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfVxufSkpO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29uc3RydWN0b3IsIGZhY3RvcnksIHByb3RvdHlwZSkge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBmYWN0b3J5LnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgcHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQocGFyZW50LCBkZWZpbml0aW9uKSB7XG4gIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpO1xuICBmb3IgKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgcHJvdG90eXBlW2tleV0gPSBkZWZpbml0aW9uW2tleV07XG4gIHJldHVybiBwcm90b3R5cGU7XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgY29sb3IsIHJnYiwgaHNsfSBmcm9tIFwiLi9jb2xvclwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGxhYiwgaGNsLCBsY2gsIGdyYXl9IGZyb20gXCIuL2xhYlwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1YmVoZWxpeH0gZnJvbSBcIi4vY3ViZWhlbGl4XCI7XG4iLCJpbXBvcnQgZGVmaW5lLCB7ZXh0ZW5kfSBmcm9tIFwiLi9kZWZpbmVcIjtcbmltcG9ydCB7Q29sb3IsIHJnYkNvbnZlcnQsIFJnYn0gZnJvbSBcIi4vY29sb3JcIjtcbmltcG9ydCB7ZGVnMnJhZCwgcmFkMmRlZ30gZnJvbSBcIi4vbWF0aFwiO1xuXG4vLyBodHRwczovL2JldGEub2JzZXJ2YWJsZWhxLmNvbS9AbWJvc3RvY2svbGFiLWFuZC1yZ2JcbnZhciBLID0gMTgsXG4gICAgWG4gPSAwLjk2NDIyLFxuICAgIFluID0gMSxcbiAgICBabiA9IDAuODI1MjEsXG4gICAgdDAgPSA0IC8gMjksXG4gICAgdDEgPSA2IC8gMjksXG4gICAgdDIgPSAzICogdDEgKiB0MSxcbiAgICB0MyA9IHQxICogdDEgKiB0MTtcblxuZnVuY3Rpb24gbGFiQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgTGFiKSByZXR1cm4gbmV3IExhYihvLmwsIG8uYSwgby5iLCBvLm9wYWNpdHkpO1xuICBpZiAobyBpbnN0YW5jZW9mIEhjbCkge1xuICAgIGlmIChpc05hTihvLmgpKSByZXR1cm4gbmV3IExhYihvLmwsIDAsIDAsIG8ub3BhY2l0eSk7XG4gICAgdmFyIGggPSBvLmggKiBkZWcycmFkO1xuICAgIHJldHVybiBuZXcgTGFiKG8ubCwgTWF0aC5jb3MoaCkgKiBvLmMsIE1hdGguc2luKGgpICogby5jLCBvLm9wYWNpdHkpO1xuICB9XG4gIGlmICghKG8gaW5zdGFuY2VvZiBSZ2IpKSBvID0gcmdiQ29udmVydChvKTtcbiAgdmFyIHIgPSByZ2IybHJnYihvLnIpLFxuICAgICAgZyA9IHJnYjJscmdiKG8uZyksXG4gICAgICBiID0gcmdiMmxyZ2Ioby5iKSxcbiAgICAgIHkgPSB4eXoybGFiKCgwLjIyMjUwNDUgKiByICsgMC43MTY4Nzg2ICogZyArIDAuMDYwNjE2OSAqIGIpIC8gWW4pLCB4LCB6O1xuICBpZiAociA9PT0gZyAmJiBnID09PSBiKSB4ID0geiA9IHk7IGVsc2Uge1xuICAgIHggPSB4eXoybGFiKCgwLjQzNjA3NDcgKiByICsgMC4zODUwNjQ5ICogZyArIDAuMTQzMDgwNCAqIGIpIC8gWG4pO1xuICAgIHogPSB4eXoybGFiKCgwLjAxMzkzMjIgKiByICsgMC4wOTcxMDQ1ICogZyArIDAuNzE0MTczMyAqIGIpIC8gWm4pO1xuICB9XG4gIHJldHVybiBuZXcgTGFiKDExNiAqIHkgLSAxNiwgNTAwICogKHggLSB5KSwgMjAwICogKHkgLSB6KSwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyYXkobCwgb3BhY2l0eSkge1xuICByZXR1cm4gbmV3IExhYihsLCAwLCAwLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxhYihsLCBhLCBiLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gbGFiQ29udmVydChsKSA6IG5ldyBMYWIobCwgYSwgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTGFiKGwsIGEsIGIsIG9wYWNpdHkpIHtcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMuYSA9ICthO1xuICB0aGlzLmIgPSArYjtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShMYWIsIGxhYiwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sICsgSyAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMuYSwgdGhpcy5iLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXI6IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gbmV3IExhYih0aGlzLmwgLSBLICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5hLCB0aGlzLmIsIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHkgPSAodGhpcy5sICsgMTYpIC8gMTE2LFxuICAgICAgICB4ID0gaXNOYU4odGhpcy5hKSA/IHkgOiB5ICsgdGhpcy5hIC8gNTAwLFxuICAgICAgICB6ID0gaXNOYU4odGhpcy5iKSA/IHkgOiB5IC0gdGhpcy5iIC8gMjAwO1xuICAgIHggPSBYbiAqIGxhYjJ4eXooeCk7XG4gICAgeSA9IFluICogbGFiMnh5eih5KTtcbiAgICB6ID0gWm4gKiBsYWIyeHl6KHopO1xuICAgIHJldHVybiBuZXcgUmdiKFxuICAgICAgbHJnYjJyZ2IoIDMuMTMzODU2MSAqIHggLSAxLjYxNjg2NjcgKiB5IC0gMC40OTA2MTQ2ICogeiksXG4gICAgICBscmdiMnJnYigtMC45Nzg3Njg0ICogeCArIDEuOTE2MTQxNSAqIHkgKyAwLjAzMzQ1NDAgKiB6KSxcbiAgICAgIGxyZ2IycmdiKCAwLjA3MTk0NTMgKiB4IC0gMC4yMjg5OTE0ICogeSArIDEuNDA1MjQyNyAqIHopLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfVxufSkpO1xuXG5mdW5jdGlvbiB4eXoybGFiKHQpIHtcbiAgcmV0dXJuIHQgPiB0MyA/IE1hdGgucG93KHQsIDEgLyAzKSA6IHQgLyB0MiArIHQwO1xufVxuXG5mdW5jdGlvbiBsYWIyeHl6KHQpIHtcbiAgcmV0dXJuIHQgPiB0MSA/IHQgKiB0ICogdCA6IHQyICogKHQgLSB0MCk7XG59XG5cbmZ1bmN0aW9uIGxyZ2IycmdiKHgpIHtcbiAgcmV0dXJuIDI1NSAqICh4IDw9IDAuMDAzMTMwOCA/IDEyLjkyICogeCA6IDEuMDU1ICogTWF0aC5wb3coeCwgMSAvIDIuNCkgLSAwLjA1NSk7XG59XG5cbmZ1bmN0aW9uIHJnYjJscmdiKHgpIHtcbiAgcmV0dXJuICh4IC89IDI1NSkgPD0gMC4wNDA0NSA/IHggLyAxMi45MiA6IE1hdGgucG93KCh4ICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG59XG5cbmZ1bmN0aW9uIGhjbENvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIEhjbCkgcmV0dXJuIG5ldyBIY2woby5oLCBvLmMsIG8ubCwgby5vcGFjaXR5KTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIExhYikpIG8gPSBsYWJDb252ZXJ0KG8pO1xuICBpZiAoby5hID09PSAwICYmIG8uYiA9PT0gMCkgcmV0dXJuIG5ldyBIY2woTmFOLCAwLCBvLmwsIG8ub3BhY2l0eSk7XG4gIHZhciBoID0gTWF0aC5hdGFuMihvLmIsIG8uYSkgKiByYWQyZGVnO1xuICByZXR1cm4gbmV3IEhjbChoIDwgMCA/IGggKyAzNjAgOiBoLCBNYXRoLnNxcnQoby5hICogby5hICsgby5iICogby5iKSwgby5sLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGNoKGwsIGMsIGgsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoY2xDb252ZXJ0KGwpIDogbmV3IEhjbChoLCBjLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoY2woaCwgYywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhjbENvbnZlcnQoaCkgOiBuZXcgSGNsKGgsIGMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhjbChoLCBjLCBsLCBvcGFjaXR5KSB7XG4gIHRoaXMuaCA9ICtoO1xuICB0aGlzLmMgPSArYztcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoSGNsLCBoY2wsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcjogZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgKyBLICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIG5ldyBIY2wodGhpcy5oLCB0aGlzLmMsIHRoaXMubCAtIEsgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBsYWJDb252ZXJ0KHRoaXMpLnJnYigpO1xuICB9XG59KSk7XG4iLCJleHBvcnQgdmFyIGRlZzJyYWQgPSBNYXRoLlBJIC8gMTgwO1xuZXhwb3J0IHZhciByYWQyZGVnID0gMTgwIC8gTWF0aC5QSTtcbiIsInZhciBub29wID0ge3ZhbHVlOiBmdW5jdGlvbigpIHt9fTtcblxuZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArIFwiXCIpIHx8ICh0IGluIF8pKSB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIHR5cGU6IFwiICsgdCk7XG4gICAgX1t0XSA9IFtdO1xuICB9XG4gIHJldHVybiBuZXcgRGlzcGF0Y2goXyk7XG59XG5cbmZ1bmN0aW9uIERpc3BhdGNoKF8pIHtcbiAgdGhpcy5fID0gXztcbn1cblxuZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXModHlwZW5hbWVzLCB0eXBlcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgaWYgKHQgJiYgIXR5cGVzLmhhc093blByb3BlcnR5KHQpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdCk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbkRpc3BhdGNoLnByb3RvdHlwZSA9IGRpc3BhdGNoLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IERpc3BhdGNoLFxuICBvbjogZnVuY3Rpb24odHlwZW5hbWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF8gPSB0aGlzLl8sXG4gICAgICAgIFQgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIsIF8pLFxuICAgICAgICB0LFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIG4gPSBULmxlbmd0aDtcblxuICAgIC8vIElmIG5vIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgY2FsbGJhY2sgb2YgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgJiYgKHQgPSBnZXQoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIHR5cGUgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS5cbiAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBjYWxsYmFjazogXCIgKyBjYWxsYmFjayk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgX1t0XSA9IHNldChfW3RdLCB0eXBlbmFtZS5uYW1lLCBjYWxsYmFjayk7XG4gICAgICBlbHNlIGlmIChjYWxsYmFjayA9PSBudWxsKSBmb3IgKHQgaW4gXykgX1t0XSA9IHNldChfW3RdLCB0eXBlbmFtZS5uYW1lLCBudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY29weTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvcHkgPSB7fSwgXyA9IHRoaXMuXztcbiAgICBmb3IgKHZhciB0IGluIF8pIGNvcHlbdF0gPSBfW3RdLnNsaWNlKCk7XG4gICAgcmV0dXJuIG5ldyBEaXNwYXRjaChjb3B5KTtcbiAgfSxcbiAgY2FsbDogZnVuY3Rpb24odHlwZSwgdGhhdCkge1xuICAgIGlmICgobiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyKSA+IDApIGZvciAodmFyIGFyZ3MgPSBuZXcgQXJyYXkobiksIGkgPSAwLCBuLCB0OyBpIDwgbjsgKytpKSBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHR5cGUpO1xuICAgIGZvciAodCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHR5cGUsIHRoYXQsIGFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHR5cGUpO1xuICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdldCh0eXBlLCBuYW1lKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGgsIGM7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICByZXR1cm4gYy52YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0KHR5cGUsIG5hbWUsIGNhbGxiYWNrKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAodHlwZVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICB0eXBlW2ldID0gbm9vcCwgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSkuY29uY2F0KHR5cGUuc2xpY2UoaSArIDEpKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogY2FsbGJhY2t9KTtcbiAgcmV0dXJuIHR5cGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRpc3BhdGNoO1xuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIGRpc3BhdGNofSBmcm9tIFwiLi9kaXNwYXRjaFwiO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7ZXZlbnQsIGN1c3RvbUV2ZW50LCBzZWxlY3QsIG1vdXNlLCB0b3VjaH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IG5vZHJhZywge3llc2RyYWd9IGZyb20gXCIuL25vZHJhZ1wiO1xuaW1wb3J0IG5vZXZlbnQsIHtub3Byb3BhZ2F0aW9ufSBmcm9tIFwiLi9ub2V2ZW50XCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCBEcmFnRXZlbnQgZnJvbSBcIi4vZXZlbnRcIjtcblxuLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuXG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVyKCkge1xuICByZXR1cm4gIWV2ZW50LmJ1dHRvbjtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbnRhaW5lcigpIHtcbiAgcmV0dXJuIHRoaXMucGFyZW50Tm9kZTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFN1YmplY3QoZCkge1xuICByZXR1cm4gZCA9PSBudWxsID8ge3g6IGV2ZW50LngsIHk6IGV2ZW50Lnl9IDogZDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIFwib250b3VjaHN0YXJ0XCIgaW4gdGhpcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyLFxuICAgICAgY29udGFpbmVyID0gZGVmYXVsdENvbnRhaW5lcixcbiAgICAgIHN1YmplY3QgPSBkZWZhdWx0U3ViamVjdCxcbiAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUsXG4gICAgICBnZXN0dXJlcyA9IHt9LFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImRyYWdcIiwgXCJlbmRcIiksXG4gICAgICBhY3RpdmUgPSAwLFxuICAgICAgbW91c2Vkb3dueCxcbiAgICAgIG1vdXNlZG93bnksXG4gICAgICBtb3VzZW1vdmluZyxcbiAgICAgIHRvdWNoZW5kaW5nLFxuICAgICAgY2xpY2tEaXN0YW5jZTIgPSAwO1xuXG4gIGZ1bmN0aW9uIGRyYWcoc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uXG4gICAgICAgIC5vbihcIm1vdXNlZG93bi5kcmFnXCIsIG1vdXNlZG93bmVkKVxuICAgICAgLmZpbHRlcih0b3VjaGFibGUpXG4gICAgICAgIC5vbihcInRvdWNoc3RhcnQuZHJhZ1wiLCB0b3VjaHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS5kcmFnXCIsIHRvdWNobW92ZWQpXG4gICAgICAgIC5vbihcInRvdWNoZW5kLmRyYWcgdG91Y2hjYW5jZWwuZHJhZ1wiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCJ0b3VjaC1hY3Rpb25cIiwgXCJub25lXCIpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZWRvd25lZCgpIHtcbiAgICBpZiAodG91Y2hlbmRpbmcgfHwgIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIGdlc3R1cmUgPSBiZWZvcmVzdGFydChcIm1vdXNlXCIsIGNvbnRhaW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBtb3VzZSwgdGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoIWdlc3R1cmUpIHJldHVybjtcbiAgICBzZWxlY3QoZXZlbnQudmlldykub24oXCJtb3VzZW1vdmUuZHJhZ1wiLCBtb3VzZW1vdmVkLCB0cnVlKS5vbihcIm1vdXNldXAuZHJhZ1wiLCBtb3VzZXVwcGVkLCB0cnVlKTtcbiAgICBub2RyYWcoZXZlbnQudmlldyk7XG4gICAgbm9wcm9wYWdhdGlvbigpO1xuICAgIG1vdXNlbW92aW5nID0gZmFsc2U7XG4gICAgbW91c2Vkb3dueCA9IGV2ZW50LmNsaWVudFg7XG4gICAgbW91c2Vkb3dueSA9IGV2ZW50LmNsaWVudFk7XG4gICAgZ2VzdHVyZShcInN0YXJ0XCIpO1xuICB9XG5cbiAgZnVuY3Rpb24gbW91c2Vtb3ZlZCgpIHtcbiAgICBub2V2ZW50KCk7XG4gICAgaWYgKCFtb3VzZW1vdmluZykge1xuICAgICAgdmFyIGR4ID0gZXZlbnQuY2xpZW50WCAtIG1vdXNlZG93bngsIGR5ID0gZXZlbnQuY2xpZW50WSAtIG1vdXNlZG93bnk7XG4gICAgICBtb3VzZW1vdmluZyA9IGR4ICogZHggKyBkeSAqIGR5ID4gY2xpY2tEaXN0YW5jZTI7XG4gICAgfVxuICAgIGdlc3R1cmVzLm1vdXNlKFwiZHJhZ1wiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNldXBwZWQoKSB7XG4gICAgc2VsZWN0KGV2ZW50LnZpZXcpLm9uKFwibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnXCIsIG51bGwpO1xuICAgIHllc2RyYWcoZXZlbnQudmlldywgbW91c2Vtb3ZpbmcpO1xuICAgIG5vZXZlbnQoKTtcbiAgICBnZXN0dXJlcy5tb3VzZShcImVuZFwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoc3RhcnRlZCgpIHtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgYyA9IGNvbnRhaW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIGdlc3R1cmU7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoZ2VzdHVyZSA9IGJlZm9yZXN0YXJ0KHRvdWNoZXNbaV0uaWRlbnRpZmllciwgYywgdG91Y2gsIHRoaXMsIGFyZ3VtZW50cykpIHtcbiAgICAgICAgbm9wcm9wYWdhdGlvbigpO1xuICAgICAgICBnZXN0dXJlKFwic3RhcnRcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2htb3ZlZCgpIHtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIGdlc3R1cmU7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoZ2VzdHVyZSA9IGdlc3R1cmVzW3RvdWNoZXNbaV0uaWRlbnRpZmllcl0pIHtcbiAgICAgICAgbm9ldmVudCgpO1xuICAgICAgICBnZXN0dXJlKFwiZHJhZ1wiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKCkge1xuICAgIHZhciB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgZ2VzdHVyZTtcblxuICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgNTAwKTsgLy8gR2hvc3QgY2xpY2tzIGFyZSBkZWxheWVkIVxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChnZXN0dXJlID0gZ2VzdHVyZXNbdG91Y2hlc1tpXS5pZGVudGlmaWVyXSkge1xuICAgICAgICBub3Byb3BhZ2F0aW9uKCk7XG4gICAgICAgIGdlc3R1cmUoXCJlbmRcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYmVmb3Jlc3RhcnQoaWQsIGNvbnRhaW5lciwgcG9pbnQsIHRoYXQsIGFyZ3MpIHtcbiAgICB2YXIgcCA9IHBvaW50KGNvbnRhaW5lciwgaWQpLCBzLCBkeCwgZHksXG4gICAgICAgIHN1Ymxpc3RlbmVycyA9IGxpc3RlbmVycy5jb3B5KCk7XG5cbiAgICBpZiAoIWN1c3RvbUV2ZW50KG5ldyBEcmFnRXZlbnQoZHJhZywgXCJiZWZvcmVzdGFydFwiLCBzLCBpZCwgYWN0aXZlLCBwWzBdLCBwWzFdLCAwLCAwLCBzdWJsaXN0ZW5lcnMpLCBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgoZXZlbnQuc3ViamVjdCA9IHMgPSBzdWJqZWN0LmFwcGx5KHRoYXQsIGFyZ3MpKSA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICBkeCA9IHMueCAtIHBbMF0gfHwgMDtcbiAgICAgIGR5ID0gcy55IC0gcFsxXSB8fCAwO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSkpIHJldHVybjtcblxuICAgIHJldHVybiBmdW5jdGlvbiBnZXN0dXJlKHR5cGUpIHtcbiAgICAgIHZhciBwMCA9IHAsIG47XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcInN0YXJ0XCI6IGdlc3R1cmVzW2lkXSA9IGdlc3R1cmUsIG4gPSBhY3RpdmUrKzsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJlbmRcIjogZGVsZXRlIGdlc3R1cmVzW2lkXSwgLS1hY3RpdmU7IC8vIG5vYnJlYWtcbiAgICAgICAgY2FzZSBcImRyYWdcIjogcCA9IHBvaW50KGNvbnRhaW5lciwgaWQpLCBuID0gYWN0aXZlOyBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1c3RvbUV2ZW50KG5ldyBEcmFnRXZlbnQoZHJhZywgdHlwZSwgcywgaWQsIG4sIHBbMF0gKyBkeCwgcFsxXSArIGR5LCBwWzBdIC0gcDBbMF0sIHBbMV0gLSBwMFsxXSwgc3VibGlzdGVuZXJzKSwgc3VibGlzdGVuZXJzLmFwcGx5LCBzdWJsaXN0ZW5lcnMsIFt0eXBlLCB0aGF0LCBhcmdzXSk7XG4gICAgfTtcbiAgfVxuXG4gIGRyYWcuZmlsdGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgZHJhZykgOiBmaWx0ZXI7XG4gIH07XG5cbiAgZHJhZy5jb250YWluZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29udGFpbmVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChfKSwgZHJhZykgOiBjb250YWluZXI7XG4gIH07XG5cbiAgZHJhZy5zdWJqZWN0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN1YmplY3QgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCBkcmFnKSA6IHN1YmplY3Q7XG4gIH07XG5cbiAgZHJhZy50b3VjaGFibGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBkcmFnKSA6IHRvdWNoYWJsZTtcbiAgfTtcblxuICBkcmFnLm9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IGRyYWcgOiB2YWx1ZTtcbiAgfTtcblxuICBkcmFnLmNsaWNrRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIGRyYWcpIDogTWF0aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTtcbiAgfTtcblxuICByZXR1cm4gZHJhZztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERyYWdFdmVudCh0YXJnZXQsIHR5cGUsIHN1YmplY3QsIGlkLCBhY3RpdmUsIHgsIHksIGR4LCBkeSwgZGlzcGF0Y2gpIHtcbiAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7XG4gIHRoaXMuaWRlbnRpZmllciA9IGlkO1xuICB0aGlzLmFjdGl2ZSA9IGFjdGl2ZTtcbiAgdGhpcy54ID0geDtcbiAgdGhpcy55ID0geTtcbiAgdGhpcy5keCA9IGR4O1xuICB0aGlzLmR5ID0gZHk7XG4gIHRoaXMuXyA9IGRpc3BhdGNoO1xufVxuXG5EcmFnRXZlbnQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciB2YWx1ZSA9IHRoaXMuXy5vbi5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7XG4gIHJldHVybiB2YWx1ZSA9PT0gdGhpcy5fID8gdGhpcyA6IHZhbHVlO1xufTtcbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyBkcmFnfSBmcm9tIFwiLi9kcmFnXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZHJhZ0Rpc2FibGUsIHllc2RyYWcgYXMgZHJhZ0VuYWJsZX0gZnJvbSBcIi4vbm9kcmFnXCI7XG4iLCJpbXBvcnQge3NlbGVjdH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IG5vZXZlbnQgZnJvbSBcIi4vbm9ldmVudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2aWV3KSB7XG4gIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Qodmlldykub24oXCJkcmFnc3RhcnQuZHJhZ1wiLCBub2V2ZW50LCB0cnVlKTtcbiAgaWYgKFwib25zZWxlY3RzdGFydFwiIGluIHJvb3QpIHtcbiAgICBzZWxlY3Rpb24ub24oXCJzZWxlY3RzdGFydC5kcmFnXCIsIG5vZXZlbnQsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QuX19ub3NlbGVjdCA9IHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdDtcbiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSBcIm5vbmVcIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24geWVzZHJhZyh2aWV3LCBub2NsaWNrKSB7XG4gIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Qodmlldykub24oXCJkcmFnc3RhcnQuZHJhZ1wiLCBudWxsKTtcbiAgaWYgKG5vY2xpY2spIHtcbiAgICBzZWxlY3Rpb24ub24oXCJjbGljay5kcmFnXCIsIG5vZXZlbnQsIHRydWUpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHNlbGVjdGlvbi5vbihcImNsaWNrLmRyYWdcIiwgbnVsbCk7IH0sIDApO1xuICB9XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSByb290Ll9fbm9zZWxlY3Q7XG4gICAgZGVsZXRlIHJvb3QuX19ub3NlbGVjdDtcbiAgfVxufVxuIiwiaW1wb3J0IHtldmVudH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbigpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsInZhciBvdmVyc2hvb3QgPSAxLjcwMTU4O1xuXG5leHBvcnQgdmFyIGJhY2tJbiA9IChmdW5jdGlvbiBjdXN0b20ocykge1xuICBzID0gK3M7XG5cbiAgZnVuY3Rpb24gYmFja0luKHQpIHtcbiAgICByZXR1cm4gdCAqIHQgKiAoKHMgKyAxKSAqIHQgLSBzKTtcbiAgfVxuXG4gIGJhY2tJbi5vdmVyc2hvb3QgPSBjdXN0b207XG5cbiAgcmV0dXJuIGJhY2tJbjtcbn0pKG92ZXJzaG9vdCk7XG5cbmV4cG9ydCB2YXIgYmFja091dCA9IChmdW5jdGlvbiBjdXN0b20ocykge1xuICBzID0gK3M7XG5cbiAgZnVuY3Rpb24gYmFja091dCh0KSB7XG4gICAgcmV0dXJuIC0tdCAqIHQgKiAoKHMgKyAxKSAqIHQgKyBzKSArIDE7XG4gIH1cblxuICBiYWNrT3V0Lm92ZXJzaG9vdCA9IGN1c3RvbTtcblxuICByZXR1cm4gYmFja091dDtcbn0pKG92ZXJzaG9vdCk7XG5cbmV4cG9ydCB2YXIgYmFja0luT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShzKSB7XG4gIHMgPSArcztcblxuICBmdW5jdGlvbiBiYWNrSW5PdXQodCkge1xuICAgIHJldHVybiAoKHQgKj0gMikgPCAxID8gdCAqIHQgKiAoKHMgKyAxKSAqIHQgLSBzKSA6ICh0IC09IDIpICogdCAqICgocyArIDEpICogdCArIHMpICsgMikgLyAyO1xuICB9XG5cbiAgYmFja0luT3V0Lm92ZXJzaG9vdCA9IGN1c3RvbTtcblxuICByZXR1cm4gYmFja0luT3V0O1xufSkob3ZlcnNob290KTtcbiIsInZhciBiMSA9IDQgLyAxMSxcbiAgICBiMiA9IDYgLyAxMSxcbiAgICBiMyA9IDggLyAxMSxcbiAgICBiNCA9IDMgLyA0LFxuICAgIGI1ID0gOSAvIDExLFxuICAgIGI2ID0gMTAgLyAxMSxcbiAgICBiNyA9IDE1IC8gMTYsXG4gICAgYjggPSAyMSAvIDIyLFxuICAgIGI5ID0gNjMgLyA2NCxcbiAgICBiMCA9IDEgLyBiMSAvIGIxO1xuXG5leHBvcnQgZnVuY3Rpb24gYm91bmNlSW4odCkge1xuICByZXR1cm4gMSAtIGJvdW5jZU91dCgxIC0gdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBib3VuY2VPdXQodCkge1xuICByZXR1cm4gKHQgPSArdCkgPCBiMSA/IGIwICogdCAqIHQgOiB0IDwgYjMgPyBiMCAqICh0IC09IGIyKSAqIHQgKyBiNCA6IHQgPCBiNiA/IGIwICogKHQgLT0gYjUpICogdCArIGI3IDogYjAgKiAodCAtPSBiOCkgKiB0ICsgYjk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBib3VuY2VJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IDEgLSBib3VuY2VPdXQoMSAtIHQpIDogYm91bmNlT3V0KHQgLSAxKSArIDEpIC8gMjtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjaXJjbGVJbih0KSB7XG4gIHJldHVybiAxIC0gTWF0aC5zcXJ0KDEgLSB0ICogdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaXJjbGVPdXQodCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KDEgLSAtLXQgKiB0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNpcmNsZUluT3V0KHQpIHtcbiAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gMSAtIE1hdGguc3FydCgxIC0gdCAqIHQpIDogTWF0aC5zcXJ0KDEgLSAodCAtPSAyKSAqIHQpICsgMSkgLyAyO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW4odCkge1xuICByZXR1cm4gdCAqIHQgKiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNPdXQodCkge1xuICByZXR1cm4gLS10ICogdCAqIHQgKyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7XG59XG4iLCJ2YXIgdGF1ID0gMiAqIE1hdGguUEksXG4gICAgYW1wbGl0dWRlID0gMSxcbiAgICBwZXJpb2QgPSAwLjM7XG5cbmV4cG9ydCB2YXIgZWxhc3RpY0luID0gKGZ1bmN0aW9uIGN1c3RvbShhLCBwKSB7XG4gIHZhciBzID0gTWF0aC5hc2luKDEgLyAoYSA9IE1hdGgubWF4KDEsIGEpKSkgKiAocCAvPSB0YXUpO1xuXG4gIGZ1bmN0aW9uIGVsYXN0aWNJbih0KSB7XG4gICAgcmV0dXJuIGEgKiBNYXRoLnBvdygyLCAxMCAqIC0tdCkgKiBNYXRoLnNpbigocyAtIHQpIC8gcCk7XG4gIH1cblxuICBlbGFzdGljSW4uYW1wbGl0dWRlID0gZnVuY3Rpb24oYSkgeyByZXR1cm4gY3VzdG9tKGEsIHAgKiB0YXUpOyB9O1xuICBlbGFzdGljSW4ucGVyaW9kID0gZnVuY3Rpb24ocCkgeyByZXR1cm4gY3VzdG9tKGEsIHApOyB9O1xuXG4gIHJldHVybiBlbGFzdGljSW47XG59KShhbXBsaXR1ZGUsIHBlcmlvZCk7XG5cbmV4cG9ydCB2YXIgZWxhc3RpY091dCA9IChmdW5jdGlvbiBjdXN0b20oYSwgcCkge1xuICB2YXIgcyA9IE1hdGguYXNpbigxIC8gKGEgPSBNYXRoLm1heCgxLCBhKSkpICogKHAgLz0gdGF1KTtcblxuICBmdW5jdGlvbiBlbGFzdGljT3V0KHQpIHtcbiAgICByZXR1cm4gMSAtIGEgKiBNYXRoLnBvdygyLCAtMTAgKiAodCA9ICt0KSkgKiBNYXRoLnNpbigodCArIHMpIC8gcCk7XG4gIH1cblxuICBlbGFzdGljT3V0LmFtcGxpdHVkZSA9IGZ1bmN0aW9uKGEpIHsgcmV0dXJuIGN1c3RvbShhLCBwICogdGF1KTsgfTtcbiAgZWxhc3RpY091dC5wZXJpb2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwgcCk7IH07XG5cbiAgcmV0dXJuIGVsYXN0aWNPdXQ7XG59KShhbXBsaXR1ZGUsIHBlcmlvZCk7XG5cbmV4cG9ydCB2YXIgZWxhc3RpY0luT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShhLCBwKSB7XG4gIHZhciBzID0gTWF0aC5hc2luKDEgLyAoYSA9IE1hdGgubWF4KDEsIGEpKSkgKiAocCAvPSB0YXUpO1xuXG4gIGZ1bmN0aW9uIGVsYXN0aWNJbk91dCh0KSB7XG4gICAgcmV0dXJuICgodCA9IHQgKiAyIC0gMSkgPCAwXG4gICAgICAgID8gYSAqIE1hdGgucG93KDIsIDEwICogdCkgKiBNYXRoLnNpbigocyAtIHQpIC8gcClcbiAgICAgICAgOiAyIC0gYSAqIE1hdGgucG93KDIsIC0xMCAqIHQpICogTWF0aC5zaW4oKHMgKyB0KSAvIHApKSAvIDI7XG4gIH1cblxuICBlbGFzdGljSW5PdXQuYW1wbGl0dWRlID0gZnVuY3Rpb24oYSkgeyByZXR1cm4gY3VzdG9tKGEsIHAgKiB0YXUpOyB9O1xuICBlbGFzdGljSW5PdXQucGVyaW9kID0gZnVuY3Rpb24ocCkgeyByZXR1cm4gY3VzdG9tKGEsIHApOyB9O1xuXG4gIHJldHVybiBlbGFzdGljSW5PdXQ7XG59KShhbXBsaXR1ZGUsIHBlcmlvZCk7XG4iLCJleHBvcnQgZnVuY3Rpb24gZXhwSW4odCkge1xuICByZXR1cm4gTWF0aC5wb3coMiwgMTAgKiB0IC0gMTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwT3V0KHQpIHtcbiAgcmV0dXJuIDEgLSBNYXRoLnBvdygyLCAtMTAgKiB0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cEluT3V0KHQpIHtcbiAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gTWF0aC5wb3coMiwgMTAgKiB0IC0gMTApIDogMiAtIE1hdGgucG93KDIsIDEwIC0gMTAgKiB0KSkgLyAyO1xufVxuIiwiZXhwb3J0IHtcbiAgbGluZWFyIGFzIGVhc2VMaW5lYXJcbn0gZnJvbSBcIi4vbGluZWFyXCI7XG5cbmV4cG9ydCB7XG4gIHF1YWRJbk91dCBhcyBlYXNlUXVhZCxcbiAgcXVhZEluIGFzIGVhc2VRdWFkSW4sXG4gIHF1YWRPdXQgYXMgZWFzZVF1YWRPdXQsXG4gIHF1YWRJbk91dCBhcyBlYXNlUXVhZEluT3V0XG59IGZyb20gXCIuL3F1YWRcIjtcblxuZXhwb3J0IHtcbiAgY3ViaWNJbk91dCBhcyBlYXNlQ3ViaWMsXG4gIGN1YmljSW4gYXMgZWFzZUN1YmljSW4sXG4gIGN1YmljT3V0IGFzIGVhc2VDdWJpY091dCxcbiAgY3ViaWNJbk91dCBhcyBlYXNlQ3ViaWNJbk91dFxufSBmcm9tIFwiLi9jdWJpY1wiO1xuXG5leHBvcnQge1xuICBwb2x5SW5PdXQgYXMgZWFzZVBvbHksXG4gIHBvbHlJbiBhcyBlYXNlUG9seUluLFxuICBwb2x5T3V0IGFzIGVhc2VQb2x5T3V0LFxuICBwb2x5SW5PdXQgYXMgZWFzZVBvbHlJbk91dFxufSBmcm9tIFwiLi9wb2x5XCI7XG5cbmV4cG9ydCB7XG4gIHNpbkluT3V0IGFzIGVhc2VTaW4sXG4gIHNpbkluIGFzIGVhc2VTaW5JbixcbiAgc2luT3V0IGFzIGVhc2VTaW5PdXQsXG4gIHNpbkluT3V0IGFzIGVhc2VTaW5Jbk91dFxufSBmcm9tIFwiLi9zaW5cIjtcblxuZXhwb3J0IHtcbiAgZXhwSW5PdXQgYXMgZWFzZUV4cCxcbiAgZXhwSW4gYXMgZWFzZUV4cEluLFxuICBleHBPdXQgYXMgZWFzZUV4cE91dCxcbiAgZXhwSW5PdXQgYXMgZWFzZUV4cEluT3V0XG59IGZyb20gXCIuL2V4cFwiO1xuXG5leHBvcnQge1xuICBjaXJjbGVJbk91dCBhcyBlYXNlQ2lyY2xlLFxuICBjaXJjbGVJbiBhcyBlYXNlQ2lyY2xlSW4sXG4gIGNpcmNsZU91dCBhcyBlYXNlQ2lyY2xlT3V0LFxuICBjaXJjbGVJbk91dCBhcyBlYXNlQ2lyY2xlSW5PdXRcbn0gZnJvbSBcIi4vY2lyY2xlXCI7XG5cbmV4cG9ydCB7XG4gIGJvdW5jZU91dCBhcyBlYXNlQm91bmNlLFxuICBib3VuY2VJbiBhcyBlYXNlQm91bmNlSW4sXG4gIGJvdW5jZU91dCBhcyBlYXNlQm91bmNlT3V0LFxuICBib3VuY2VJbk91dCBhcyBlYXNlQm91bmNlSW5PdXRcbn0gZnJvbSBcIi4vYm91bmNlXCI7XG5cbmV4cG9ydCB7XG4gIGJhY2tJbk91dCBhcyBlYXNlQmFjayxcbiAgYmFja0luIGFzIGVhc2VCYWNrSW4sXG4gIGJhY2tPdXQgYXMgZWFzZUJhY2tPdXQsXG4gIGJhY2tJbk91dCBhcyBlYXNlQmFja0luT3V0XG59IGZyb20gXCIuL2JhY2tcIjtcblxuZXhwb3J0IHtcbiAgZWxhc3RpY091dCBhcyBlYXNlRWxhc3RpYyxcbiAgZWxhc3RpY0luIGFzIGVhc2VFbGFzdGljSW4sXG4gIGVsYXN0aWNPdXQgYXMgZWFzZUVsYXN0aWNPdXQsXG4gIGVsYXN0aWNJbk91dCBhcyBlYXNlRWxhc3RpY0luT3V0XG59IGZyb20gXCIuL2VsYXN0aWNcIjtcbiIsImV4cG9ydCBmdW5jdGlvbiBsaW5lYXIodCkge1xuICByZXR1cm4gK3Q7XG59XG4iLCJ2YXIgZXhwb25lbnQgPSAzO1xuXG5leHBvcnQgdmFyIHBvbHlJbiA9IChmdW5jdGlvbiBjdXN0b20oZSkge1xuICBlID0gK2U7XG5cbiAgZnVuY3Rpb24gcG9seUluKHQpIHtcbiAgICByZXR1cm4gTWF0aC5wb3codCwgZSk7XG4gIH1cblxuICBwb2x5SW4uZXhwb25lbnQgPSBjdXN0b207XG5cbiAgcmV0dXJuIHBvbHlJbjtcbn0pKGV4cG9uZW50KTtcblxuZXhwb3J0IHZhciBwb2x5T3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShlKSB7XG4gIGUgPSArZTtcblxuICBmdW5jdGlvbiBwb2x5T3V0KHQpIHtcbiAgICByZXR1cm4gMSAtIE1hdGgucG93KDEgLSB0LCBlKTtcbiAgfVxuXG4gIHBvbHlPdXQuZXhwb25lbnQgPSBjdXN0b207XG5cbiAgcmV0dXJuIHBvbHlPdXQ7XG59KShleHBvbmVudCk7XG5cbmV4cG9ydCB2YXIgcG9seUluT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShlKSB7XG4gIGUgPSArZTtcblxuICBmdW5jdGlvbiBwb2x5SW5PdXQodCkge1xuICAgIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IE1hdGgucG93KHQsIGUpIDogMiAtIE1hdGgucG93KDIgLSB0LCBlKSkgLyAyO1xuICB9XG5cbiAgcG9seUluT3V0LmV4cG9uZW50ID0gY3VzdG9tO1xuXG4gIHJldHVybiBwb2x5SW5PdXQ7XG59KShleHBvbmVudCk7XG4iLCJleHBvcnQgZnVuY3Rpb24gcXVhZEluKHQpIHtcbiAgcmV0dXJuIHQgKiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVhZE91dCh0KSB7XG4gIHJldHVybiB0ICogKDIgLSB0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1YWRJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0IDogLS10ICogKDIgLSB0KSArIDEpIC8gMjtcbn1cbiIsInZhciBwaSA9IE1hdGguUEksXG4gICAgaGFsZlBpID0gcGkgLyAyO1xuXG5leHBvcnQgZnVuY3Rpb24gc2luSW4odCkge1xuICByZXR1cm4gMSAtIE1hdGguY29zKHQgKiBoYWxmUGkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2luT3V0KHQpIHtcbiAgcmV0dXJuIE1hdGguc2luKHQgKiBoYWxmUGkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2luSW5PdXQodCkge1xuICByZXR1cm4gKDEgLSBNYXRoLmNvcyhwaSAqIHQpKSAvIDI7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gb3B0aW9uYWwoZikge1xuICByZXR1cm4gZiA9PSBudWxsID8gbnVsbCA6IHJlcXVpcmVkKGYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWQoZikge1xuICBpZiAodHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZjtcbn1cbiIsImV4cG9ydCB2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbmV4cG9ydCBmdW5jdGlvbiBzaHVmZmxlKGFycmF5KSB7XG4gIHZhciBtID0gYXJyYXkubGVuZ3RoLFxuICAgICAgdCxcbiAgICAgIGk7XG5cbiAgd2hpbGUgKG0pIHtcbiAgICBpID0gTWF0aC5yYW5kb20oKSAqIG0tLSB8IDA7XG4gICAgdCA9IGFycmF5W21dO1xuICAgIGFycmF5W21dID0gYXJyYXlbaV07XG4gICAgYXJyYXlbaV0gPSB0O1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuIiwiZnVuY3Rpb24gZGVmYXVsdFNlcGFyYXRpb24oYSwgYikge1xuICByZXR1cm4gYS5wYXJlbnQgPT09IGIucGFyZW50ID8gMSA6IDI7XG59XG5cbmZ1bmN0aW9uIG1lYW5YKGNoaWxkcmVuKSB7XG4gIHJldHVybiBjaGlsZHJlbi5yZWR1Y2UobWVhblhSZWR1Y2UsIDApIC8gY2hpbGRyZW4ubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBtZWFuWFJlZHVjZSh4LCBjKSB7XG4gIHJldHVybiB4ICsgYy54O1xufVxuXG5mdW5jdGlvbiBtYXhZKGNoaWxkcmVuKSB7XG4gIHJldHVybiAxICsgY2hpbGRyZW4ucmVkdWNlKG1heFlSZWR1Y2UsIDApO1xufVxuXG5mdW5jdGlvbiBtYXhZUmVkdWNlKHksIGMpIHtcbiAgcmV0dXJuIE1hdGgubWF4KHksIGMueSk7XG59XG5cbmZ1bmN0aW9uIGxlYWZMZWZ0KG5vZGUpIHtcbiAgdmFyIGNoaWxkcmVuO1xuICB3aGlsZSAoY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKSBub2RlID0gY2hpbGRyZW5bMF07XG4gIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBsZWFmUmlnaHQobm9kZSkge1xuICB2YXIgY2hpbGRyZW47XG4gIHdoaWxlIChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pIG5vZGUgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgcmV0dXJuIG5vZGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VwYXJhdGlvbiA9IGRlZmF1bHRTZXBhcmF0aW9uLFxuICAgICAgZHggPSAxLFxuICAgICAgZHkgPSAxLFxuICAgICAgbm9kZVNpemUgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBjbHVzdGVyKHJvb3QpIHtcbiAgICB2YXIgcHJldmlvdXNOb2RlLFxuICAgICAgICB4ID0gMDtcblxuICAgIC8vIEZpcnN0IHdhbGssIGNvbXB1dGluZyB0aGUgaW5pdGlhbCB4ICYgeSB2YWx1ZXMuXG4gICAgcm9vdC5lYWNoQWZ0ZXIoZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICBub2RlLnggPSBtZWFuWChjaGlsZHJlbik7XG4gICAgICAgIG5vZGUueSA9IG1heFkoY2hpbGRyZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS54ID0gcHJldmlvdXNOb2RlID8geCArPSBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzTm9kZSkgOiAwO1xuICAgICAgICBub2RlLnkgPSAwO1xuICAgICAgICBwcmV2aW91c05vZGUgPSBub2RlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIGxlZnQgPSBsZWFmTGVmdChyb290KSxcbiAgICAgICAgcmlnaHQgPSBsZWFmUmlnaHQocm9vdCksXG4gICAgICAgIHgwID0gbGVmdC54IC0gc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyLFxuICAgICAgICB4MSA9IHJpZ2h0LnggKyBzZXBhcmF0aW9uKHJpZ2h0LCBsZWZ0KSAvIDI7XG5cbiAgICAvLyBTZWNvbmQgd2Fsaywgbm9ybWFsaXppbmcgeCAmIHkgdG8gdGhlIGRlc2lyZWQgc2l6ZS5cbiAgICByZXR1cm4gcm9vdC5lYWNoQWZ0ZXIobm9kZVNpemUgPyBmdW5jdGlvbihub2RlKSB7XG4gICAgICBub2RlLnggPSAobm9kZS54IC0gcm9vdC54KSAqIGR4O1xuICAgICAgbm9kZS55ID0gKHJvb3QueSAtIG5vZGUueSkgKiBkeTtcbiAgICB9IDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgbm9kZS54ID0gKG5vZGUueCAtIHgwKSAvICh4MSAtIHgwKSAqIGR4O1xuICAgICAgbm9kZS55ID0gKDEgLSAocm9vdC55ID8gbm9kZS55IC8gcm9vdC55IDogMSkpICogZHk7XG4gICAgfSk7XG4gIH1cblxuICBjbHVzdGVyLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VwYXJhdGlvbiA9IHgsIGNsdXN0ZXIpIDogc2VwYXJhdGlvbjtcbiAgfTtcblxuICBjbHVzdGVyLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSBmYWxzZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgY2x1c3RlcikgOiAobm9kZVNpemUgPyBudWxsIDogW2R4LCBkeV0pO1xuICB9O1xuXG4gIGNsdXN0ZXIubm9kZVNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSB0cnVlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBjbHVzdGVyKSA6IChub2RlU2l6ZSA/IFtkeCwgZHldIDogbnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIGNsdXN0ZXI7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gY29uc3RhbnRaZXJvKCkge1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLCBub2RlcyA9IFtub2RlXTtcbiAgd2hpbGUgKG5vZGUgPSBub2RlLnBhcmVudCkge1xuICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gIH1cbiAgcmV0dXJuIG5vZGVzO1xufVxuIiwiZnVuY3Rpb24gY291bnQobm9kZSkge1xuICB2YXIgc3VtID0gMCxcbiAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbixcbiAgICAgIGkgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGg7XG4gIGlmICghaSkgc3VtID0gMTtcbiAgZWxzZSB3aGlsZSAoLS1pID49IDApIHN1bSArPSBjaGlsZHJlbltpXS52YWx1ZTtcbiAgbm9kZS52YWx1ZSA9IHN1bTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2hBZnRlcihjb3VudCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5vZGVzID0gW107XG4gIHRoaXMuZWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgbm9kZXMucHVzaChub2RlKTtcbiAgfSk7XG4gIHJldHVybiBub2Rlcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHZhciBub2RlID0gdGhpcywgY3VycmVudCwgbmV4dCA9IFtub2RlXSwgY2hpbGRyZW4sIGksIG47XG4gIGRvIHtcbiAgICBjdXJyZW50ID0gbmV4dC5yZXZlcnNlKCksIG5leHQgPSBbXTtcbiAgICB3aGlsZSAobm9kZSA9IGN1cnJlbnQucG9wKCkpIHtcbiAgICAgIGNhbGxiYWNrKG5vZGUpLCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICBpZiAoY2hpbGRyZW4pIGZvciAoaSA9IDAsIG4gPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgbmV4dC5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gd2hpbGUgKG5leHQubGVuZ3RoKTtcbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuICB2YXIgbm9kZSA9IHRoaXMsIG5vZGVzID0gW25vZGVdLCBuZXh0ID0gW10sIGNoaWxkcmVuLCBpLCBuO1xuICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7XG4gICAgbmV4dC5wdXNoKG5vZGUpLCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgaWYgKGNoaWxkcmVuKSBmb3IgKGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICB9XG4gIH1cbiAgd2hpbGUgKG5vZGUgPSBuZXh0LnBvcCgpKSB7XG4gICAgY2FsbGJhY2sobm9kZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuICB2YXIgbm9kZSA9IHRoaXMsIG5vZGVzID0gW25vZGVdLCBjaGlsZHJlbiwgaTtcbiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkge1xuICAgIGNhbGxiYWNrKG5vZGUpLCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgaWYgKGNoaWxkcmVuKSBmb3IgKGkgPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgbm9kZXMucHVzaChjaGlsZHJlbltpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwiaW1wb3J0IG5vZGVfY291bnQgZnJvbSBcIi4vY291bnRcIjtcbmltcG9ydCBub2RlX2VhY2ggZnJvbSBcIi4vZWFjaFwiO1xuaW1wb3J0IG5vZGVfZWFjaEJlZm9yZSBmcm9tIFwiLi9lYWNoQmVmb3JlXCI7XG5pbXBvcnQgbm9kZV9lYWNoQWZ0ZXIgZnJvbSBcIi4vZWFjaEFmdGVyXCI7XG5pbXBvcnQgbm9kZV9zdW0gZnJvbSBcIi4vc3VtXCI7XG5pbXBvcnQgbm9kZV9zb3J0IGZyb20gXCIuL3NvcnRcIjtcbmltcG9ydCBub2RlX3BhdGggZnJvbSBcIi4vcGF0aFwiO1xuaW1wb3J0IG5vZGVfYW5jZXN0b3JzIGZyb20gXCIuL2FuY2VzdG9yc1wiO1xuaW1wb3J0IG5vZGVfZGVzY2VuZGFudHMgZnJvbSBcIi4vZGVzY2VuZGFudHNcIjtcbmltcG9ydCBub2RlX2xlYXZlcyBmcm9tIFwiLi9sZWF2ZXNcIjtcbmltcG9ydCBub2RlX2xpbmtzIGZyb20gXCIuL2xpbmtzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhpZXJhcmNoeShkYXRhLCBjaGlsZHJlbikge1xuICB2YXIgcm9vdCA9IG5ldyBOb2RlKGRhdGEpLFxuICAgICAgdmFsdWVkID0gK2RhdGEudmFsdWUgJiYgKHJvb3QudmFsdWUgPSBkYXRhLnZhbHVlKSxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlcyA9IFtyb290XSxcbiAgICAgIGNoaWxkLFxuICAgICAgY2hpbGRzLFxuICAgICAgaSxcbiAgICAgIG47XG5cbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIGNoaWxkcmVuID0gZGVmYXVsdENoaWxkcmVuO1xuXG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBpZiAodmFsdWVkKSBub2RlLnZhbHVlID0gK25vZGUuZGF0YS52YWx1ZTtcbiAgICBpZiAoKGNoaWxkcyA9IGNoaWxkcmVuKG5vZGUuZGF0YSkpICYmIChuID0gY2hpbGRzLmxlbmd0aCkpIHtcbiAgICAgIG5vZGUuY2hpbGRyZW4gPSBuZXcgQXJyYXkobik7XG4gICAgICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgbm9kZXMucHVzaChjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV0gPSBuZXcgTm9kZShjaGlsZHNbaV0pKTtcbiAgICAgICAgY2hpbGQucGFyZW50ID0gbm9kZTtcbiAgICAgICAgY2hpbGQuZGVwdGggPSBub2RlLmRlcHRoICsgMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcm9vdC5lYWNoQmVmb3JlKGNvbXB1dGVIZWlnaHQpO1xufVxuXG5mdW5jdGlvbiBub2RlX2NvcHkoKSB7XG4gIHJldHVybiBoaWVyYXJjaHkodGhpcykuZWFjaEJlZm9yZShjb3B5RGF0YSk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDaGlsZHJlbihkKSB7XG4gIHJldHVybiBkLmNoaWxkcmVuO1xufVxuXG5mdW5jdGlvbiBjb3B5RGF0YShub2RlKSB7XG4gIG5vZGUuZGF0YSA9IG5vZGUuZGF0YS5kYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUhlaWdodChub2RlKSB7XG4gIHZhciBoZWlnaHQgPSAwO1xuICBkbyBub2RlLmhlaWdodCA9IGhlaWdodDtcbiAgd2hpbGUgKChub2RlID0gbm9kZS5wYXJlbnQpICYmIChub2RlLmhlaWdodCA8ICsraGVpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBOb2RlKGRhdGEpIHtcbiAgdGhpcy5kYXRhID0gZGF0YTtcbiAgdGhpcy5kZXB0aCA9XG4gIHRoaXMuaGVpZ2h0ID0gMDtcbiAgdGhpcy5wYXJlbnQgPSBudWxsO1xufVxuXG5Ob2RlLnByb3RvdHlwZSA9IGhpZXJhcmNoeS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBOb2RlLFxuICBjb3VudDogbm9kZV9jb3VudCxcbiAgZWFjaDogbm9kZV9lYWNoLFxuICBlYWNoQWZ0ZXI6IG5vZGVfZWFjaEFmdGVyLFxuICBlYWNoQmVmb3JlOiBub2RlX2VhY2hCZWZvcmUsXG4gIHN1bTogbm9kZV9zdW0sXG4gIHNvcnQ6IG5vZGVfc29ydCxcbiAgcGF0aDogbm9kZV9wYXRoLFxuICBhbmNlc3RvcnM6IG5vZGVfYW5jZXN0b3JzLFxuICBkZXNjZW5kYW50czogbm9kZV9kZXNjZW5kYW50cyxcbiAgbGVhdmVzOiBub2RlX2xlYXZlcyxcbiAgbGlua3M6IG5vZGVfbGlua3MsXG4gIGNvcHk6IG5vZGVfY29weVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbGVhdmVzID0gW107XG4gIHRoaXMuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKCFub2RlLmNoaWxkcmVuKSB7XG4gICAgICBsZWF2ZXMucHVzaChub2RlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbGVhdmVzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciByb290ID0gdGhpcywgbGlua3MgPSBbXTtcbiAgcm9vdC5lYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAobm9kZSAhPT0gcm9vdCkgeyAvLyBEb27igJl0IGluY2x1ZGUgdGhlIHJvb3TigJlzIHBhcmVudCwgaWYgYW55LlxuICAgICAgbGlua3MucHVzaCh7c291cmNlOiBub2RlLnBhcmVudCwgdGFyZ2V0OiBub2RlfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxpbmtzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZW5kKSB7XG4gIHZhciBzdGFydCA9IHRoaXMsXG4gICAgICBhbmNlc3RvciA9IGxlYXN0Q29tbW9uQW5jZXN0b3Ioc3RhcnQsIGVuZCksXG4gICAgICBub2RlcyA9IFtzdGFydF07XG4gIHdoaWxlIChzdGFydCAhPT0gYW5jZXN0b3IpIHtcbiAgICBzdGFydCA9IHN0YXJ0LnBhcmVudDtcbiAgICBub2Rlcy5wdXNoKHN0YXJ0KTtcbiAgfVxuICB2YXIgayA9IG5vZGVzLmxlbmd0aDtcbiAgd2hpbGUgKGVuZCAhPT0gYW5jZXN0b3IpIHtcbiAgICBub2Rlcy5zcGxpY2UoaywgMCwgZW5kKTtcbiAgICBlbmQgPSBlbmQucGFyZW50O1xuICB9XG4gIHJldHVybiBub2Rlcztcbn1cblxuZnVuY3Rpb24gbGVhc3RDb21tb25BbmNlc3RvcihhLCBiKSB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gYTtcbiAgdmFyIGFOb2RlcyA9IGEuYW5jZXN0b3JzKCksXG4gICAgICBiTm9kZXMgPSBiLmFuY2VzdG9ycygpLFxuICAgICAgYyA9IG51bGw7XG4gIGEgPSBhTm9kZXMucG9wKCk7XG4gIGIgPSBiTm9kZXMucG9wKCk7XG4gIHdoaWxlIChhID09PSBiKSB7XG4gICAgYyA9IGE7XG4gICAgYSA9IGFOb2Rlcy5wb3AoKTtcbiAgICBiID0gYk5vZGVzLnBvcCgpO1xuICB9XG4gIHJldHVybiBjO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcGFyZSkge1xuICByZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgbm9kZS5jaGlsZHJlbi5zb3J0KGNvbXBhcmUpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obm9kZSkge1xuICAgIHZhciBzdW0gPSArdmFsdWUobm9kZS5kYXRhKSB8fCAwLFxuICAgICAgICBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sXG4gICAgICAgIGkgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGg7XG4gICAgd2hpbGUgKC0taSA+PSAwKSBzdW0gKz0gY2hpbGRyZW5baV0udmFsdWU7XG4gICAgbm9kZS52YWx1ZSA9IHN1bTtcbiAgfSk7XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgY2x1c3Rlcn0gZnJvbSBcIi4vY2x1c3RlclwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGhpZXJhcmNoeX0gZnJvbSBcIi4vaGllcmFyY2h5L2luZGV4XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcGFja30gZnJvbSBcIi4vcGFjay9pbmRleFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHBhY2tTaWJsaW5nc30gZnJvbSBcIi4vcGFjay9zaWJsaW5nc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHBhY2tFbmNsb3NlfSBmcm9tIFwiLi9wYWNrL2VuY2xvc2VcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwYXJ0aXRpb259IGZyb20gXCIuL3BhcnRpdGlvblwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0cmF0aWZ5fSBmcm9tIFwiLi9zdHJhdGlmeVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRyZWV9IGZyb20gXCIuL3RyZWVcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmVlbWFwfSBmcm9tIFwiLi90cmVlbWFwL2luZGV4XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdHJlZW1hcEJpbmFyeX0gZnJvbSBcIi4vdHJlZW1hcC9iaW5hcnlcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmVlbWFwRGljZX0gZnJvbSBcIi4vdHJlZW1hcC9kaWNlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdHJlZW1hcFNsaWNlfSBmcm9tIFwiLi90cmVlbWFwL3NsaWNlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdHJlZW1hcFNsaWNlRGljZX0gZnJvbSBcIi4vdHJlZW1hcC9zbGljZURpY2VcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmVlbWFwU3F1YXJpZnl9IGZyb20gXCIuL3RyZWVtYXAvc3F1YXJpZnlcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmVlbWFwUmVzcXVhcmlmeX0gZnJvbSBcIi4vdHJlZW1hcC9yZXNxdWFyaWZ5XCI7XG4iLCJpbXBvcnQge3NodWZmbGUsIHNsaWNlfSBmcm9tIFwiLi4vYXJyYXlcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2lyY2xlcykge1xuICB2YXIgaSA9IDAsIG4gPSAoY2lyY2xlcyA9IHNodWZmbGUoc2xpY2UuY2FsbChjaXJjbGVzKSkpLmxlbmd0aCwgQiA9IFtdLCBwLCBlO1xuXG4gIHdoaWxlIChpIDwgbikge1xuICAgIHAgPSBjaXJjbGVzW2ldO1xuICAgIGlmIChlICYmIGVuY2xvc2VzV2VhayhlLCBwKSkgKytpO1xuICAgIGVsc2UgZSA9IGVuY2xvc2VCYXNpcyhCID0gZXh0ZW5kQmFzaXMoQiwgcCkpLCBpID0gMDtcbiAgfVxuXG4gIHJldHVybiBlO1xufVxuXG5mdW5jdGlvbiBleHRlbmRCYXNpcyhCLCBwKSB7XG4gIHZhciBpLCBqO1xuXG4gIGlmIChlbmNsb3Nlc1dlYWtBbGwocCwgQikpIHJldHVybiBbcF07XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBCIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudC5cbiAgZm9yIChpID0gMDsgaSA8IEIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoZW5jbG9zZXNOb3QocCwgQltpXSlcbiAgICAgICAgJiYgZW5jbG9zZXNXZWFrQWxsKGVuY2xvc2VCYXNpczIoQltpXSwgcCksIEIpKSB7XG4gICAgICByZXR1cm4gW0JbaV0sIHBdO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHdlIGdldCBoZXJlIHRoZW4gQiBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzLlxuICBmb3IgKGkgPSAwOyBpIDwgQi5sZW5ndGggLSAxOyArK2kpIHtcbiAgICBmb3IgKGogPSBpICsgMTsgaiA8IEIubGVuZ3RoOyArK2opIHtcbiAgICAgIGlmIChlbmNsb3Nlc05vdChlbmNsb3NlQmFzaXMyKEJbaV0sIEJbal0pLCBwKVxuICAgICAgICAgICYmIGVuY2xvc2VzTm90KGVuY2xvc2VCYXNpczIoQltpXSwgcCksIEJbal0pXG4gICAgICAgICAgJiYgZW5jbG9zZXNOb3QoZW5jbG9zZUJhc2lzMihCW2pdLCBwKSwgQltpXSlcbiAgICAgICAgICAmJiBlbmNsb3Nlc1dlYWtBbGwoZW5jbG9zZUJhc2lzMyhCW2ldLCBCW2pdLCBwKSwgQikpIHtcbiAgICAgICAgcmV0dXJuIFtCW2ldLCBCW2pdLCBwXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBJZiB3ZSBnZXQgaGVyZSB0aGVuIHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLlxuICB0aHJvdyBuZXcgRXJyb3I7XG59XG5cbmZ1bmN0aW9uIGVuY2xvc2VzTm90KGEsIGIpIHtcbiAgdmFyIGRyID0gYS5yIC0gYi5yLCBkeCA9IGIueCAtIGEueCwgZHkgPSBiLnkgLSBhLnk7XG4gIHJldHVybiBkciA8IDAgfHwgZHIgKiBkciA8IGR4ICogZHggKyBkeSAqIGR5O1xufVxuXG5mdW5jdGlvbiBlbmNsb3Nlc1dlYWsoYSwgYikge1xuICB2YXIgZHIgPSBhLnIgLSBiLnIgKyAxZS02LCBkeCA9IGIueCAtIGEueCwgZHkgPSBiLnkgLSBhLnk7XG4gIHJldHVybiBkciA+IDAgJiYgZHIgKiBkciA+IGR4ICogZHggKyBkeSAqIGR5O1xufVxuXG5mdW5jdGlvbiBlbmNsb3Nlc1dlYWtBbGwoYSwgQikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IEIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoIWVuY2xvc2VzV2VhayhhLCBCW2ldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZW5jbG9zZUJhc2lzKEIpIHtcbiAgc3dpdGNoIChCLmxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGVuY2xvc2VCYXNpczEoQlswXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gZW5jbG9zZUJhc2lzMihCWzBdLCBCWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBlbmNsb3NlQmFzaXMzKEJbMF0sIEJbMV0sIEJbMl0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuY2xvc2VCYXNpczEoYSkge1xuICByZXR1cm4ge1xuICAgIHg6IGEueCxcbiAgICB5OiBhLnksXG4gICAgcjogYS5yXG4gIH07XG59XG5cbmZ1bmN0aW9uIGVuY2xvc2VCYXNpczIoYSwgYikge1xuICB2YXIgeDEgPSBhLngsIHkxID0gYS55LCByMSA9IGEucixcbiAgICAgIHgyID0gYi54LCB5MiA9IGIueSwgcjIgPSBiLnIsXG4gICAgICB4MjEgPSB4MiAtIHgxLCB5MjEgPSB5MiAtIHkxLCByMjEgPSByMiAtIHIxLFxuICAgICAgbCA9IE1hdGguc3FydCh4MjEgKiB4MjEgKyB5MjEgKiB5MjEpO1xuICByZXR1cm4ge1xuICAgIHg6ICh4MSArIHgyICsgeDIxIC8gbCAqIHIyMSkgLyAyLFxuICAgIHk6ICh5MSArIHkyICsgeTIxIC8gbCAqIHIyMSkgLyAyLFxuICAgIHI6IChsICsgcjEgKyByMikgLyAyXG4gIH07XG59XG5cbmZ1bmN0aW9uIGVuY2xvc2VCYXNpczMoYSwgYiwgYykge1xuICB2YXIgeDEgPSBhLngsIHkxID0gYS55LCByMSA9IGEucixcbiAgICAgIHgyID0gYi54LCB5MiA9IGIueSwgcjIgPSBiLnIsXG4gICAgICB4MyA9IGMueCwgeTMgPSBjLnksIHIzID0gYy5yLFxuICAgICAgYTIgPSB4MSAtIHgyLFxuICAgICAgYTMgPSB4MSAtIHgzLFxuICAgICAgYjIgPSB5MSAtIHkyLFxuICAgICAgYjMgPSB5MSAtIHkzLFxuICAgICAgYzIgPSByMiAtIHIxLFxuICAgICAgYzMgPSByMyAtIHIxLFxuICAgICAgZDEgPSB4MSAqIHgxICsgeTEgKiB5MSAtIHIxICogcjEsXG4gICAgICBkMiA9IGQxIC0geDIgKiB4MiAtIHkyICogeTIgKyByMiAqIHIyLFxuICAgICAgZDMgPSBkMSAtIHgzICogeDMgLSB5MyAqIHkzICsgcjMgKiByMyxcbiAgICAgIGFiID0gYTMgKiBiMiAtIGEyICogYjMsXG4gICAgICB4YSA9IChiMiAqIGQzIC0gYjMgKiBkMikgLyAoYWIgKiAyKSAtIHgxLFxuICAgICAgeGIgPSAoYjMgKiBjMiAtIGIyICogYzMpIC8gYWIsXG4gICAgICB5YSA9IChhMyAqIGQyIC0gYTIgKiBkMykgLyAoYWIgKiAyKSAtIHkxLFxuICAgICAgeWIgPSAoYTIgKiBjMyAtIGEzICogYzIpIC8gYWIsXG4gICAgICBBID0geGIgKiB4YiArIHliICogeWIgLSAxLFxuICAgICAgQiA9IDIgKiAocjEgKyB4YSAqIHhiICsgeWEgKiB5YiksXG4gICAgICBDID0geGEgKiB4YSArIHlhICogeWEgLSByMSAqIHIxLFxuICAgICAgciA9IC0oQSA/IChCICsgTWF0aC5zcXJ0KEIgKiBCIC0gNCAqIEEgKiBDKSkgLyAoMiAqIEEpIDogQyAvIEIpO1xuICByZXR1cm4ge1xuICAgIHg6IHgxICsgeGEgKyB4YiAqIHIsXG4gICAgeTogeTEgKyB5YSArIHliICogcixcbiAgICByOiByXG4gIH07XG59XG4iLCJpbXBvcnQge3BhY2tFbmNsb3NlfSBmcm9tIFwiLi9zaWJsaW5nc1wiO1xuaW1wb3J0IHtvcHRpb25hbH0gZnJvbSBcIi4uL2FjY2Vzc29yc1wiO1xuaW1wb3J0IGNvbnN0YW50LCB7Y29uc3RhbnRaZXJvfSBmcm9tIFwiLi4vY29uc3RhbnRcIjtcblxuZnVuY3Rpb24gZGVmYXVsdFJhZGl1cyhkKSB7XG4gIHJldHVybiBNYXRoLnNxcnQoZC52YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgcmFkaXVzID0gbnVsbCxcbiAgICAgIGR4ID0gMSxcbiAgICAgIGR5ID0gMSxcbiAgICAgIHBhZGRpbmcgPSBjb25zdGFudFplcm87XG5cbiAgZnVuY3Rpb24gcGFjayhyb290KSB7XG4gICAgcm9vdC54ID0gZHggLyAyLCByb290LnkgPSBkeSAvIDI7XG4gICAgaWYgKHJhZGl1cykge1xuICAgICAgcm9vdC5lYWNoQmVmb3JlKHJhZGl1c0xlYWYocmFkaXVzKSlcbiAgICAgICAgICAuZWFjaEFmdGVyKHBhY2tDaGlsZHJlbihwYWRkaW5nLCAwLjUpKVxuICAgICAgICAgIC5lYWNoQmVmb3JlKHRyYW5zbGF0ZUNoaWxkKDEpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdC5lYWNoQmVmb3JlKHJhZGl1c0xlYWYoZGVmYXVsdFJhZGl1cykpXG4gICAgICAgICAgLmVhY2hBZnRlcihwYWNrQ2hpbGRyZW4oY29uc3RhbnRaZXJvLCAxKSlcbiAgICAgICAgICAuZWFjaEFmdGVyKHBhY2tDaGlsZHJlbihwYWRkaW5nLCByb290LnIgLyBNYXRoLm1pbihkeCwgZHkpKSlcbiAgICAgICAgICAuZWFjaEJlZm9yZSh0cmFuc2xhdGVDaGlsZChNYXRoLm1pbihkeCwgZHkpIC8gKDIgKiByb290LnIpKSk7XG4gICAgfVxuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgcGFjay5yYWRpdXMgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gb3B0aW9uYWwoeCksIHBhY2spIDogcmFkaXVzO1xuICB9O1xuXG4gIHBhY2suc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBwYWNrKSA6IFtkeCwgZHldO1xuICB9O1xuXG4gIHBhY2sucGFkZGluZyA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBjb25zdGFudCgreCksIHBhY2spIDogcGFkZGluZztcbiAgfTtcblxuICByZXR1cm4gcGFjaztcbn1cblxuZnVuY3Rpb24gcmFkaXVzTGVhZihyYWRpdXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIG5vZGUuciA9IE1hdGgubWF4KDAsICtyYWRpdXMobm9kZSkgfHwgMCk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBwYWNrQ2hpbGRyZW4ocGFkZGluZywgaykge1xuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIGlmIChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIHZhciBjaGlsZHJlbixcbiAgICAgICAgICBpLFxuICAgICAgICAgIG4gPSBjaGlsZHJlbi5sZW5ndGgsXG4gICAgICAgICAgciA9IHBhZGRpbmcobm9kZSkgKiBrIHx8IDAsXG4gICAgICAgICAgZTtcblxuICAgICAgaWYgKHIpIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIGNoaWxkcmVuW2ldLnIgKz0gcjtcbiAgICAgIGUgPSBwYWNrRW5jbG9zZShjaGlsZHJlbik7XG4gICAgICBpZiAocikgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY2hpbGRyZW5baV0uciAtPSByO1xuICAgICAgbm9kZS5yID0gZSArIHI7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVDaGlsZChrKSB7XG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50O1xuICAgIG5vZGUuciAqPSBrO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIG5vZGUueCA9IHBhcmVudC54ICsgayAqIG5vZGUueDtcbiAgICAgIG5vZGUueSA9IHBhcmVudC55ICsgayAqIG5vZGUueTtcbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgZW5jbG9zZSBmcm9tIFwiLi9lbmNsb3NlXCI7XG5cbmZ1bmN0aW9uIHBsYWNlKGIsIGEsIGMpIHtcbiAgdmFyIGR4ID0gYi54IC0gYS54LCB4LCBhMixcbiAgICAgIGR5ID0gYi55IC0gYS55LCB5LCBiMixcbiAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHk7XG4gIGlmIChkMikge1xuICAgIGEyID0gYS5yICsgYy5yLCBhMiAqPSBhMjtcbiAgICBiMiA9IGIuciArIGMuciwgYjIgKj0gYjI7XG4gICAgaWYgKGEyID4gYjIpIHtcbiAgICAgIHggPSAoZDIgKyBiMiAtIGEyKSAvICgyICogZDIpO1xuICAgICAgeSA9IE1hdGguc3FydChNYXRoLm1heCgwLCBiMiAvIGQyIC0geCAqIHgpKTtcbiAgICAgIGMueCA9IGIueCAtIHggKiBkeCAtIHkgKiBkeTtcbiAgICAgIGMueSA9IGIueSAtIHggKiBkeSArIHkgKiBkeDtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IChkMiArIGEyIC0gYjIpIC8gKDIgKiBkMik7XG4gICAgICB5ID0gTWF0aC5zcXJ0KE1hdGgubWF4KDAsIGEyIC8gZDIgLSB4ICogeCkpO1xuICAgICAgYy54ID0gYS54ICsgeCAqIGR4IC0geSAqIGR5O1xuICAgICAgYy55ID0gYS55ICsgeCAqIGR5ICsgeSAqIGR4O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjLnggPSBhLnggKyBjLnI7XG4gICAgYy55ID0gYS55O1xuICB9XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdHMoYSwgYikge1xuICB2YXIgZHIgPSBhLnIgKyBiLnIgLSAxZS02LCBkeCA9IGIueCAtIGEueCwgZHkgPSBiLnkgLSBhLnk7XG4gIHJldHVybiBkciA+IDAgJiYgZHIgKiBkciA+IGR4ICogZHggKyBkeSAqIGR5O1xufVxuXG5mdW5jdGlvbiBzY29yZShub2RlKSB7XG4gIHZhciBhID0gbm9kZS5fLFxuICAgICAgYiA9IG5vZGUubmV4dC5fLFxuICAgICAgYWIgPSBhLnIgKyBiLnIsXG4gICAgICBkeCA9IChhLnggKiBiLnIgKyBiLnggKiBhLnIpIC8gYWIsXG4gICAgICBkeSA9IChhLnkgKiBiLnIgKyBiLnkgKiBhLnIpIC8gYWI7XG4gIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn1cblxuZnVuY3Rpb24gTm9kZShjaXJjbGUpIHtcbiAgdGhpcy5fID0gY2lyY2xlO1xuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLnByZXZpb3VzID0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhY2tFbmNsb3NlKGNpcmNsZXMpIHtcbiAgaWYgKCEobiA9IGNpcmNsZXMubGVuZ3RoKSkgcmV0dXJuIDA7XG5cbiAgdmFyIGEsIGIsIGMsIG4sIGFhLCBjYSwgaSwgaiwgaywgc2osIHNrO1xuXG4gIC8vIFBsYWNlIHRoZSBmaXJzdCBjaXJjbGUuXG4gIGEgPSBjaXJjbGVzWzBdLCBhLnggPSAwLCBhLnkgPSAwO1xuICBpZiAoIShuID4gMSkpIHJldHVybiBhLnI7XG5cbiAgLy8gUGxhY2UgdGhlIHNlY29uZCBjaXJjbGUuXG4gIGIgPSBjaXJjbGVzWzFdLCBhLnggPSAtYi5yLCBiLnggPSBhLnIsIGIueSA9IDA7XG4gIGlmICghKG4gPiAyKSkgcmV0dXJuIGEuciArIGIucjtcblxuICAvLyBQbGFjZSB0aGUgdGhpcmQgY2lyY2xlLlxuICBwbGFjZShiLCBhLCBjID0gY2lyY2xlc1syXSk7XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgZnJvbnQtY2hhaW4gdXNpbmcgdGhlIGZpcnN0IHRocmVlIGNpcmNsZXMgYSwgYiBhbmQgYy5cbiAgYSA9IG5ldyBOb2RlKGEpLCBiID0gbmV3IE5vZGUoYiksIGMgPSBuZXcgTm9kZShjKTtcbiAgYS5uZXh0ID0gYy5wcmV2aW91cyA9IGI7XG4gIGIubmV4dCA9IGEucHJldmlvdXMgPSBjO1xuICBjLm5leHQgPSBiLnByZXZpb3VzID0gYTtcblxuICAvLyBBdHRlbXB0IHRvIHBsYWNlIGVhY2ggcmVtYWluaW5nIGNpcmNsZeKAplxuICBwYWNrOiBmb3IgKGkgPSAzOyBpIDwgbjsgKytpKSB7XG4gICAgcGxhY2UoYS5fLCBiLl8sIGMgPSBjaXJjbGVzW2ldKSwgYyA9IG5ldyBOb2RlKGMpO1xuXG4gICAgLy8gRmluZCB0aGUgY2xvc2VzdCBpbnRlcnNlY3RpbmcgY2lyY2xlIG9uIHRoZSBmcm9udC1jaGFpbiwgaWYgYW55LlxuICAgIC8vIOKAnENsb3NlbmVzc+KAnSBpcyBkZXRlcm1pbmVkIGJ5IGxpbmVhciBkaXN0YW5jZSBhbG9uZyB0aGUgZnJvbnQtY2hhaW4uXG4gICAgLy8g4oCcQWhlYWTigJ0gb3Ig4oCcYmVoaW5k4oCdIGlzIGxpa2V3aXNlIGRldGVybWluZWQgYnkgbGluZWFyIGRpc3RhbmNlLlxuICAgIGogPSBiLm5leHQsIGsgPSBhLnByZXZpb3VzLCBzaiA9IGIuXy5yLCBzayA9IGEuXy5yO1xuICAgIGRvIHtcbiAgICAgIGlmIChzaiA8PSBzaykge1xuICAgICAgICBpZiAoaW50ZXJzZWN0cyhqLl8sIGMuXykpIHtcbiAgICAgICAgICBiID0gaiwgYS5uZXh0ID0gYiwgYi5wcmV2aW91cyA9IGEsIC0taTtcbiAgICAgICAgICBjb250aW51ZSBwYWNrO1xuICAgICAgICB9XG4gICAgICAgIHNqICs9IGouXy5yLCBqID0gai5uZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGludGVyc2VjdHMoay5fLCBjLl8pKSB7XG4gICAgICAgICAgYSA9IGssIGEubmV4dCA9IGIsIGIucHJldmlvdXMgPSBhLCAtLWk7XG4gICAgICAgICAgY29udGludWUgcGFjaztcbiAgICAgICAgfVxuICAgICAgICBzayArPSBrLl8uciwgayA9IGsucHJldmlvdXM7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoaiAhPT0gay5uZXh0KTtcblxuICAgIC8vIFN1Y2Nlc3MhIEluc2VydCB0aGUgbmV3IGNpcmNsZSBjIGJldHdlZW4gYSBhbmQgYi5cbiAgICBjLnByZXZpb3VzID0gYSwgYy5uZXh0ID0gYiwgYS5uZXh0ID0gYi5wcmV2aW91cyA9IGIgPSBjO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgbmV3IGNsb3Nlc3QgY2lyY2xlIHBhaXIgdG8gdGhlIGNlbnRyb2lkLlxuICAgIGFhID0gc2NvcmUoYSk7XG4gICAgd2hpbGUgKChjID0gYy5uZXh0KSAhPT0gYikge1xuICAgICAgaWYgKChjYSA9IHNjb3JlKGMpKSA8IGFhKSB7XG4gICAgICAgIGEgPSBjLCBhYSA9IGNhO1xuICAgICAgfVxuICAgIH1cbiAgICBiID0gYS5uZXh0O1xuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUgZW5jbG9zaW5nIGNpcmNsZSBvZiB0aGUgZnJvbnQgY2hhaW4uXG4gIGEgPSBbYi5fXSwgYyA9IGI7IHdoaWxlICgoYyA9IGMubmV4dCkgIT09IGIpIGEucHVzaChjLl8pOyBjID0gZW5jbG9zZShhKTtcblxuICAvLyBUcmFuc2xhdGUgdGhlIGNpcmNsZXMgdG8gcHV0IHRoZSBlbmNsb3NpbmcgY2lyY2xlIGFyb3VuZCB0aGUgb3JpZ2luLlxuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBhID0gY2lyY2xlc1tpXSwgYS54IC09IGMueCwgYS55IC09IGMueTtcblxuICByZXR1cm4gYy5yO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjaXJjbGVzKSB7XG4gIHBhY2tFbmNsb3NlKGNpcmNsZXMpO1xuICByZXR1cm4gY2lyY2xlcztcbn1cbiIsImltcG9ydCByb3VuZE5vZGUgZnJvbSBcIi4vdHJlZW1hcC9yb3VuZFwiO1xuaW1wb3J0IHRyZWVtYXBEaWNlIGZyb20gXCIuL3RyZWVtYXAvZGljZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGR4ID0gMSxcbiAgICAgIGR5ID0gMSxcbiAgICAgIHBhZGRpbmcgPSAwLFxuICAgICAgcm91bmQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBwYXJ0aXRpb24ocm9vdCkge1xuICAgIHZhciBuID0gcm9vdC5oZWlnaHQgKyAxO1xuICAgIHJvb3QueDAgPVxuICAgIHJvb3QueTAgPSBwYWRkaW5nO1xuICAgIHJvb3QueDEgPSBkeDtcbiAgICByb290LnkxID0gZHkgLyBuO1xuICAgIHJvb3QuZWFjaEJlZm9yZShwb3NpdGlvbk5vZGUoZHksIG4pKTtcbiAgICBpZiAocm91bmQpIHJvb3QuZWFjaEJlZm9yZShyb3VuZE5vZGUpO1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgZnVuY3Rpb24gcG9zaXRpb25Ob2RlKGR5LCBuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIHRyZWVtYXBEaWNlKG5vZGUsIG5vZGUueDAsIGR5ICogKG5vZGUuZGVwdGggKyAxKSAvIG4sIG5vZGUueDEsIGR5ICogKG5vZGUuZGVwdGggKyAyKSAvIG4pO1xuICAgICAgfVxuICAgICAgdmFyIHgwID0gbm9kZS54MCxcbiAgICAgICAgICB5MCA9IG5vZGUueTAsXG4gICAgICAgICAgeDEgPSBub2RlLngxIC0gcGFkZGluZyxcbiAgICAgICAgICB5MSA9IG5vZGUueTEgLSBwYWRkaW5nO1xuICAgICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyO1xuICAgICAgaWYgKHkxIDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyO1xuICAgICAgbm9kZS54MCA9IHgwO1xuICAgICAgbm9kZS55MCA9IHkwO1xuICAgICAgbm9kZS54MSA9IHgxO1xuICAgICAgbm9kZS55MSA9IHkxO1xuICAgIH07XG4gIH1cblxuICBwYXJ0aXRpb24ucm91bmQgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocm91bmQgPSAhIXgsIHBhcnRpdGlvbikgOiByb3VuZDtcbiAgfTtcblxuICBwYXJ0aXRpb24uc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBwYXJ0aXRpb24pIDogW2R4LCBkeV07XG4gIH07XG5cbiAgcGFydGl0aW9uLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZyA9ICt4LCBwYXJ0aXRpb24pIDogcGFkZGluZztcbiAgfTtcblxuICByZXR1cm4gcGFydGl0aW9uO1xufVxuIiwiaW1wb3J0IHtyZXF1aXJlZH0gZnJvbSBcIi4vYWNjZXNzb3JzXCI7XG5pbXBvcnQge05vZGUsIGNvbXB1dGVIZWlnaHR9IGZyb20gXCIuL2hpZXJhcmNoeS9pbmRleFwiO1xuXG52YXIga2V5UHJlZml4ID0gXCIkXCIsIC8vIFByb3RlY3QgYWdhaW5zdCBrZXlzIGxpa2Ug4oCcX19wcm90b19f4oCdLlxuICAgIHByZXJvb3QgPSB7ZGVwdGg6IC0xfSxcbiAgICBhbWJpZ3VvdXMgPSB7fTtcblxuZnVuY3Rpb24gZGVmYXVsdElkKGQpIHtcbiAgcmV0dXJuIGQuaWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRQYXJlbnRJZChkKSB7XG4gIHJldHVybiBkLnBhcmVudElkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGlkID0gZGVmYXVsdElkLFxuICAgICAgcGFyZW50SWQgPSBkZWZhdWx0UGFyZW50SWQ7XG5cbiAgZnVuY3Rpb24gc3RyYXRpZnkoZGF0YSkge1xuICAgIHZhciBkLFxuICAgICAgICBpLFxuICAgICAgICBuID0gZGF0YS5sZW5ndGgsXG4gICAgICAgIHJvb3QsXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgbm9kZXMgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIG5vZGVJZCxcbiAgICAgICAgbm9kZUtleSxcbiAgICAgICAgbm9kZUJ5S2V5ID0ge307XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBkID0gZGF0YVtpXSwgbm9kZSA9IG5vZGVzW2ldID0gbmV3IE5vZGUoZCk7XG4gICAgICBpZiAoKG5vZGVJZCA9IGlkKGQsIGksIGRhdGEpKSAhPSBudWxsICYmIChub2RlSWQgKz0gXCJcIikpIHtcbiAgICAgICAgbm9kZUtleSA9IGtleVByZWZpeCArIChub2RlLmlkID0gbm9kZUlkKTtcbiAgICAgICAgbm9kZUJ5S2V5W25vZGVLZXldID0gbm9kZUtleSBpbiBub2RlQnlLZXkgPyBhbWJpZ3VvdXMgOiBub2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZUlkID0gcGFyZW50SWQoZGF0YVtpXSwgaSwgZGF0YSk7XG4gICAgICBpZiAobm9kZUlkID09IG51bGwgfHwgIShub2RlSWQgKz0gXCJcIikpIHtcbiAgICAgICAgaWYgKHJvb3QpIHRocm93IG5ldyBFcnJvcihcIm11bHRpcGxlIHJvb3RzXCIpO1xuICAgICAgICByb290ID0gbm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmVudCA9IG5vZGVCeUtleVtrZXlQcmVmaXggKyBub2RlSWRdO1xuICAgICAgICBpZiAoIXBhcmVudCkgdGhyb3cgbmV3IEVycm9yKFwibWlzc2luZzogXCIgKyBub2RlSWQpO1xuICAgICAgICBpZiAocGFyZW50ID09PSBhbWJpZ3VvdXMpIHRocm93IG5ldyBFcnJvcihcImFtYmlndW91czogXCIgKyBub2RlSWQpO1xuICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuKSBwYXJlbnQuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgICAgZWxzZSBwYXJlbnQuY2hpbGRyZW4gPSBbbm9kZV07XG4gICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcm9vdCkgdGhyb3cgbmV3IEVycm9yKFwibm8gcm9vdFwiKTtcbiAgICByb290LnBhcmVudCA9IHByZXJvb3Q7XG4gICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsgbm9kZS5kZXB0aCA9IG5vZGUucGFyZW50LmRlcHRoICsgMTsgLS1uOyB9KS5lYWNoQmVmb3JlKGNvbXB1dGVIZWlnaHQpO1xuICAgIHJvb3QucGFyZW50ID0gbnVsbDtcbiAgICBpZiAobiA+IDApIHRocm93IG5ldyBFcnJvcihcImN5Y2xlXCIpO1xuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBzdHJhdGlmeS5pZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpZCA9IHJlcXVpcmVkKHgpLCBzdHJhdGlmeSkgOiBpZDtcbiAgfTtcblxuICBzdHJhdGlmeS5wYXJlbnRJZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYXJlbnRJZCA9IHJlcXVpcmVkKHgpLCBzdHJhdGlmeSkgOiBwYXJlbnRJZDtcbiAgfTtcblxuICByZXR1cm4gc3RyYXRpZnk7XG59XG4iLCJpbXBvcnQge05vZGV9IGZyb20gXCIuL2hpZXJhcmNoeS9pbmRleFwiO1xuXG5mdW5jdGlvbiBkZWZhdWx0U2VwYXJhdGlvbihhLCBiKSB7XG4gIHJldHVybiBhLnBhcmVudCA9PT0gYi5wYXJlbnQgPyAxIDogMjtcbn1cblxuLy8gZnVuY3Rpb24gcmFkaWFsU2VwYXJhdGlvbihhLCBiKSB7XG4vLyAgIHJldHVybiAoYS5wYXJlbnQgPT09IGIucGFyZW50ID8gMSA6IDIpIC8gYS5kZXB0aDtcbi8vIH1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHRyYXZlcnNlIHRoZSBsZWZ0IGNvbnRvdXIgb2YgYSBzdWJ0cmVlIChvclxuLy8gc3ViZm9yZXN0KS4gSXQgcmV0dXJucyB0aGUgc3VjY2Vzc29yIG9mIHYgb24gdGhpcyBjb250b3VyLiBUaGlzIHN1Y2Nlc3NvciBpc1xuLy8gZWl0aGVyIGdpdmVuIGJ5IHRoZSBsZWZ0bW9zdCBjaGlsZCBvZiB2IG9yIGJ5IHRoZSB0aHJlYWQgb2Ygdi4gVGhlIGZ1bmN0aW9uXG4vLyByZXR1cm5zIG51bGwgaWYgYW5kIG9ubHkgaWYgdiBpcyBvbiB0aGUgaGlnaGVzdCBsZXZlbCBvZiBpdHMgc3VidHJlZS5cbmZ1bmN0aW9uIG5leHRMZWZ0KHYpIHtcbiAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbjtcbiAgcmV0dXJuIGNoaWxkcmVuID8gY2hpbGRyZW5bMF0gOiB2LnQ7XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gd29ya3MgYW5hbG9nb3VzbHkgdG8gbmV4dExlZnQuXG5mdW5jdGlvbiBuZXh0UmlnaHQodikge1xuICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuO1xuICByZXR1cm4gY2hpbGRyZW4gPyBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSA6IHYudDtcbn1cblxuLy8gU2hpZnRzIHRoZSBjdXJyZW50IHN1YnRyZWUgcm9vdGVkIGF0IHcrLiBUaGlzIGlzIGRvbmUgYnkgaW5jcmVhc2luZ1xuLy8gcHJlbGltKHcrKSBhbmQgbW9kKHcrKSBieSBzaGlmdC5cbmZ1bmN0aW9uIG1vdmVTdWJ0cmVlKHdtLCB3cCwgc2hpZnQpIHtcbiAgdmFyIGNoYW5nZSA9IHNoaWZ0IC8gKHdwLmkgLSB3bS5pKTtcbiAgd3AuYyAtPSBjaGFuZ2U7XG4gIHdwLnMgKz0gc2hpZnQ7XG4gIHdtLmMgKz0gY2hhbmdlO1xuICB3cC56ICs9IHNoaWZ0O1xuICB3cC5tICs9IHNoaWZ0O1xufVxuXG4vLyBBbGwgb3RoZXIgc2hpZnRzLCBhcHBsaWVkIHRvIHRoZSBzbWFsbGVyIHN1YnRyZWVzIGJldHdlZW4gdy0gYW5kIHcrLCBhcmVcbi8vIHBlcmZvcm1lZCBieSB0aGlzIGZ1bmN0aW9uLiBUbyBwcmVwYXJlIHRoZSBzaGlmdHMsIHdlIGhhdmUgdG8gYWRqdXN0XG4vLyBjaGFuZ2UodyspLCBzaGlmdCh3KyksIGFuZCBjaGFuZ2Uody0pLlxuZnVuY3Rpb24gZXhlY3V0ZVNoaWZ0cyh2KSB7XG4gIHZhciBzaGlmdCA9IDAsXG4gICAgICBjaGFuZ2UgPSAwLFxuICAgICAgY2hpbGRyZW4gPSB2LmNoaWxkcmVuLFxuICAgICAgaSA9IGNoaWxkcmVuLmxlbmd0aCxcbiAgICAgIHc7XG4gIHdoaWxlICgtLWkgPj0gMCkge1xuICAgIHcgPSBjaGlsZHJlbltpXTtcbiAgICB3LnogKz0gc2hpZnQ7XG4gICAgdy5tICs9IHNoaWZ0O1xuICAgIHNoaWZ0ICs9IHcucyArIChjaGFuZ2UgKz0gdy5jKTtcbiAgfVxufVxuXG4vLyBJZiB2aS3igJlzIGFuY2VzdG9yIGlzIGEgc2libGluZyBvZiB2LCByZXR1cm5zIHZpLeKAmXMgYW5jZXN0b3IuIE90aGVyd2lzZSxcbi8vIHJldHVybnMgdGhlIHNwZWNpZmllZCAoZGVmYXVsdCkgYW5jZXN0b3IuXG5mdW5jdGlvbiBuZXh0QW5jZXN0b3IodmltLCB2LCBhbmNlc3Rvcikge1xuICByZXR1cm4gdmltLmEucGFyZW50ID09PSB2LnBhcmVudCA/IHZpbS5hIDogYW5jZXN0b3I7XG59XG5cbmZ1bmN0aW9uIFRyZWVOb2RlKG5vZGUsIGkpIHtcbiAgdGhpcy5fID0gbm9kZTtcbiAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICB0aGlzLmNoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5BID0gbnVsbDsgLy8gZGVmYXVsdCBhbmNlc3RvclxuICB0aGlzLmEgPSB0aGlzOyAvLyBhbmNlc3RvclxuICB0aGlzLnogPSAwOyAvLyBwcmVsaW1cbiAgdGhpcy5tID0gMDsgLy8gbW9kXG4gIHRoaXMuYyA9IDA7IC8vIGNoYW5nZVxuICB0aGlzLnMgPSAwOyAvLyBzaGlmdFxuICB0aGlzLnQgPSBudWxsOyAvLyB0aHJlYWRcbiAgdGhpcy5pID0gaTsgLy8gbnVtYmVyXG59XG5cblRyZWVOb2RlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTm9kZS5wcm90b3R5cGUpO1xuXG5mdW5jdGlvbiB0cmVlUm9vdChyb290KSB7XG4gIHZhciB0cmVlID0gbmV3IFRyZWVOb2RlKHJvb3QsIDApLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVzID0gW3RyZWVdLFxuICAgICAgY2hpbGQsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGksXG4gICAgICBuO1xuXG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBpZiAoY2hpbGRyZW4gPSBub2RlLl8uY2hpbGRyZW4pIHtcbiAgICAgIG5vZGUuY2hpbGRyZW4gPSBuZXcgQXJyYXkobiA9IGNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgbm9kZXMucHVzaChjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV0gPSBuZXcgVHJlZU5vZGUoY2hpbGRyZW5baV0sIGkpKTtcbiAgICAgICAgY2hpbGQucGFyZW50ID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAodHJlZS5wYXJlbnQgPSBuZXcgVHJlZU5vZGUobnVsbCwgMCkpLmNoaWxkcmVuID0gW3RyZWVdO1xuICByZXR1cm4gdHJlZTtcbn1cblxuLy8gTm9kZS1saW5rIHRyZWUgZGlhZ3JhbSB1c2luZyB0aGUgUmVpbmdvbGQtVGlsZm9yZCBcInRpZHlcIiBhbGdvcml0aG1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VwYXJhdGlvbiA9IGRlZmF1bHRTZXBhcmF0aW9uLFxuICAgICAgZHggPSAxLFxuICAgICAgZHkgPSAxLFxuICAgICAgbm9kZVNpemUgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHRyZWUocm9vdCkge1xuICAgIHZhciB0ID0gdHJlZVJvb3Qocm9vdCk7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBsYXlvdXQgdXNpbmcgQnVjaGhlaW0gZXQgYWwu4oCZcyBhbGdvcml0aG0uXG4gICAgdC5lYWNoQWZ0ZXIoZmlyc3RXYWxrKSwgdC5wYXJlbnQubSA9IC10Lno7XG4gICAgdC5lYWNoQmVmb3JlKHNlY29uZFdhbGspO1xuXG4gICAgLy8gSWYgYSBmaXhlZCBub2RlIHNpemUgaXMgc3BlY2lmaWVkLCBzY2FsZSB4IGFuZCB5LlxuICAgIGlmIChub2RlU2l6ZSkgcm9vdC5lYWNoQmVmb3JlKHNpemVOb2RlKTtcblxuICAgIC8vIElmIGEgZml4ZWQgdHJlZSBzaXplIGlzIHNwZWNpZmllZCwgc2NhbGUgeCBhbmQgeSBiYXNlZCBvbiB0aGUgZXh0ZW50LlxuICAgIC8vIENvbXB1dGUgdGhlIGxlZnQtbW9zdCwgcmlnaHQtbW9zdCwgYW5kIGRlcHRoLW1vc3Qgbm9kZXMgZm9yIGV4dGVudHMuXG4gICAgZWxzZSB7XG4gICAgICB2YXIgbGVmdCA9IHJvb3QsXG4gICAgICAgICAgcmlnaHQgPSByb290LFxuICAgICAgICAgIGJvdHRvbSA9IHJvb3Q7XG4gICAgICByb290LmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS54IDwgbGVmdC54KSBsZWZ0ID0gbm9kZTtcbiAgICAgICAgaWYgKG5vZGUueCA+IHJpZ2h0LngpIHJpZ2h0ID0gbm9kZTtcbiAgICAgICAgaWYgKG5vZGUuZGVwdGggPiBib3R0b20uZGVwdGgpIGJvdHRvbSA9IG5vZGU7XG4gICAgICB9KTtcbiAgICAgIHZhciBzID0gbGVmdCA9PT0gcmlnaHQgPyAxIDogc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyLFxuICAgICAgICAgIHR4ID0gcyAtIGxlZnQueCxcbiAgICAgICAgICBreCA9IGR4IC8gKHJpZ2h0LnggKyBzICsgdHgpLFxuICAgICAgICAgIGt5ID0gZHkgLyAoYm90dG9tLmRlcHRoIHx8IDEpO1xuICAgICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgbm9kZS54ID0gKG5vZGUueCArIHR4KSAqIGt4O1xuICAgICAgICBub2RlLnkgPSBub2RlLmRlcHRoICoga3k7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8vIENvbXB1dGVzIGEgcHJlbGltaW5hcnkgeC1jb29yZGluYXRlIGZvciB2LiBCZWZvcmUgdGhhdCwgRklSU1QgV0FMSyBpc1xuICAvLyBhcHBsaWVkIHJlY3Vyc2l2ZWx5IHRvIHRoZSBjaGlsZHJlbiBvZiB2LCBhcyB3ZWxsIGFzIHRoZSBmdW5jdGlvblxuICAvLyBBUFBPUlRJT04uIEFmdGVyIHNwYWNpbmcgb3V0IHRoZSBjaGlsZHJlbiBieSBjYWxsaW5nIEVYRUNVVEUgU0hJRlRTLCB0aGVcbiAgLy8gbm9kZSB2IGlzIHBsYWNlZCB0byB0aGUgbWlkcG9pbnQgb2YgaXRzIG91dGVybW9zdCBjaGlsZHJlbi5cbiAgZnVuY3Rpb24gZmlyc3RXYWxrKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuLFxuICAgICAgICBzaWJsaW5ncyA9IHYucGFyZW50LmNoaWxkcmVuLFxuICAgICAgICB3ID0gdi5pID8gc2libGluZ3Nbdi5pIC0gMV0gOiBudWxsO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgZXhlY3V0ZVNoaWZ0cyh2KTtcbiAgICAgIHZhciBtaWRwb2ludCA9IChjaGlsZHJlblswXS56ICsgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0ueikgLyAyO1xuICAgICAgaWYgKHcpIHtcbiAgICAgICAgdi56ID0gdy56ICsgc2VwYXJhdGlvbih2Ll8sIHcuXyk7XG4gICAgICAgIHYubSA9IHYueiAtIG1pZHBvaW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdi56ID0gbWlkcG9pbnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh3KSB7XG4gICAgICB2LnogPSB3LnogKyBzZXBhcmF0aW9uKHYuXywgdy5fKTtcbiAgICB9XG4gICAgdi5wYXJlbnQuQSA9IGFwcG9ydGlvbih2LCB3LCB2LnBhcmVudC5BIHx8IHNpYmxpbmdzWzBdKTtcbiAgfVxuXG4gIC8vIENvbXB1dGVzIGFsbCByZWFsIHgtY29vcmRpbmF0ZXMgYnkgc3VtbWluZyB1cCB0aGUgbW9kaWZpZXJzIHJlY3Vyc2l2ZWx5LlxuICBmdW5jdGlvbiBzZWNvbmRXYWxrKHYpIHtcbiAgICB2Ll8ueCA9IHYueiArIHYucGFyZW50Lm07XG4gICAgdi5tICs9IHYucGFyZW50Lm07XG4gIH1cblxuICAvLyBUaGUgY29yZSBvZiB0aGUgYWxnb3JpdGhtLiBIZXJlLCBhIG5ldyBzdWJ0cmVlIGlzIGNvbWJpbmVkIHdpdGggdGhlXG4gIC8vIHByZXZpb3VzIHN1YnRyZWVzLiBUaHJlYWRzIGFyZSB1c2VkIHRvIHRyYXZlcnNlIHRoZSBpbnNpZGUgYW5kIG91dHNpZGVcbiAgLy8gY29udG91cnMgb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IHN1YnRyZWUgdXAgdG8gdGhlIGhpZ2hlc3QgY29tbW9uIGxldmVsLiBUaGVcbiAgLy8gdmVydGljZXMgdXNlZCBmb3IgdGhlIHRyYXZlcnNhbHMgYXJlIHZpKywgdmktLCB2by0sIGFuZCB2byssIHdoZXJlIHRoZVxuICAvLyBzdXBlcnNjcmlwdCBvIG1lYW5zIG91dHNpZGUgYW5kIGkgbWVhbnMgaW5zaWRlLCB0aGUgc3Vic2NyaXB0IC0gbWVhbnMgbGVmdFxuICAvLyBzdWJ0cmVlIGFuZCArIG1lYW5zIHJpZ2h0IHN1YnRyZWUuIEZvciBzdW1taW5nIHVwIHRoZSBtb2RpZmllcnMgYWxvbmcgdGhlXG4gIC8vIGNvbnRvdXIsIHdlIHVzZSByZXNwZWN0aXZlIHZhcmlhYmxlcyBzaSssIHNpLSwgc28tLCBhbmQgc28rLiBXaGVuZXZlciB0d29cbiAgLy8gbm9kZXMgb2YgdGhlIGluc2lkZSBjb250b3VycyBjb25mbGljdCwgd2UgY29tcHV0ZSB0aGUgbGVmdCBvbmUgb2YgdGhlXG4gIC8vIGdyZWF0ZXN0IHVuY29tbW9uIGFuY2VzdG9ycyB1c2luZyB0aGUgZnVuY3Rpb24gQU5DRVNUT1IgYW5kIGNhbGwgTU9WRVxuICAvLyBTVUJUUkVFIHRvIHNoaWZ0IHRoZSBzdWJ0cmVlIGFuZCBwcmVwYXJlIHRoZSBzaGlmdHMgb2Ygc21hbGxlciBzdWJ0cmVlcy5cbiAgLy8gRmluYWxseSwgd2UgYWRkIGEgbmV3IHRocmVhZCAoaWYgbmVjZXNzYXJ5KS5cbiAgZnVuY3Rpb24gYXBwb3J0aW9uKHYsIHcsIGFuY2VzdG9yKSB7XG4gICAgaWYgKHcpIHtcbiAgICAgIHZhciB2aXAgPSB2LFxuICAgICAgICAgIHZvcCA9IHYsXG4gICAgICAgICAgdmltID0gdyxcbiAgICAgICAgICB2b20gPSB2aXAucGFyZW50LmNoaWxkcmVuWzBdLFxuICAgICAgICAgIHNpcCA9IHZpcC5tLFxuICAgICAgICAgIHNvcCA9IHZvcC5tLFxuICAgICAgICAgIHNpbSA9IHZpbS5tLFxuICAgICAgICAgIHNvbSA9IHZvbS5tLFxuICAgICAgICAgIHNoaWZ0O1xuICAgICAgd2hpbGUgKHZpbSA9IG5leHRSaWdodCh2aW0pLCB2aXAgPSBuZXh0TGVmdCh2aXApLCB2aW0gJiYgdmlwKSB7XG4gICAgICAgIHZvbSA9IG5leHRMZWZ0KHZvbSk7XG4gICAgICAgIHZvcCA9IG5leHRSaWdodCh2b3ApO1xuICAgICAgICB2b3AuYSA9IHY7XG4gICAgICAgIHNoaWZ0ID0gdmltLnogKyBzaW0gLSB2aXAueiAtIHNpcCArIHNlcGFyYXRpb24odmltLl8sIHZpcC5fKTtcbiAgICAgICAgaWYgKHNoaWZ0ID4gMCkge1xuICAgICAgICAgIG1vdmVTdWJ0cmVlKG5leHRBbmNlc3Rvcih2aW0sIHYsIGFuY2VzdG9yKSwgdiwgc2hpZnQpO1xuICAgICAgICAgIHNpcCArPSBzaGlmdDtcbiAgICAgICAgICBzb3AgKz0gc2hpZnQ7XG4gICAgICAgIH1cbiAgICAgICAgc2ltICs9IHZpbS5tO1xuICAgICAgICBzaXAgKz0gdmlwLm07XG4gICAgICAgIHNvbSArPSB2b20ubTtcbiAgICAgICAgc29wICs9IHZvcC5tO1xuICAgICAgfVxuICAgICAgaWYgKHZpbSAmJiAhbmV4dFJpZ2h0KHZvcCkpIHtcbiAgICAgICAgdm9wLnQgPSB2aW07XG4gICAgICAgIHZvcC5tICs9IHNpbSAtIHNvcDtcbiAgICAgIH1cbiAgICAgIGlmICh2aXAgJiYgIW5leHRMZWZ0KHZvbSkpIHtcbiAgICAgICAgdm9tLnQgPSB2aXA7XG4gICAgICAgIHZvbS5tICs9IHNpcCAtIHNvbTtcbiAgICAgICAgYW5jZXN0b3IgPSB2O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYW5jZXN0b3I7XG4gIH1cblxuICBmdW5jdGlvbiBzaXplTm9kZShub2RlKSB7XG4gICAgbm9kZS54ICo9IGR4O1xuICAgIG5vZGUueSA9IG5vZGUuZGVwdGggKiBkeTtcbiAgfVxuXG4gIHRyZWUuc2VwYXJhdGlvbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZXBhcmF0aW9uID0geCwgdHJlZSkgOiBzZXBhcmF0aW9uO1xuICB9O1xuXG4gIHRyZWUuc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlU2l6ZSA9IGZhbHNlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCB0cmVlKSA6IChub2RlU2l6ZSA/IG51bGwgOiBbZHgsIGR5XSk7XG4gIH07XG5cbiAgdHJlZS5ub2RlU2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlU2l6ZSA9IHRydWUsIGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIHRyZWUpIDogKG5vZGVTaXplID8gW2R4LCBkeV0gOiBudWxsKTtcbiAgfTtcblxuICByZXR1cm4gdHJlZTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLFxuICAgICAgaSwgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgIHN1bSwgc3VtcyA9IG5ldyBBcnJheShuICsgMSk7XG5cbiAgZm9yIChzdW1zWzBdID0gc3VtID0gaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBzdW1zW2kgKyAxXSA9IHN1bSArPSBub2Rlc1tpXS52YWx1ZTtcbiAgfVxuXG4gIHBhcnRpdGlvbigwLCBuLCBwYXJlbnQudmFsdWUsIHgwLCB5MCwgeDEsIHkxKTtcblxuICBmdW5jdGlvbiBwYXJ0aXRpb24oaSwgaiwgdmFsdWUsIHgwLCB5MCwgeDEsIHkxKSB7XG4gICAgaWYgKGkgPj0gaiAtIDEpIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICBub2RlLngwID0geDAsIG5vZGUueTAgPSB5MDtcbiAgICAgIG5vZGUueDEgPSB4MSwgbm9kZS55MSA9IHkxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZU9mZnNldCA9IHN1bXNbaV0sXG4gICAgICAgIHZhbHVlVGFyZ2V0ID0gKHZhbHVlIC8gMikgKyB2YWx1ZU9mZnNldCxcbiAgICAgICAgayA9IGkgKyAxLFxuICAgICAgICBoaSA9IGogLSAxO1xuXG4gICAgd2hpbGUgKGsgPCBoaSkge1xuICAgICAgdmFyIG1pZCA9IGsgKyBoaSA+Pj4gMTtcbiAgICAgIGlmIChzdW1zW21pZF0gPCB2YWx1ZVRhcmdldCkgayA9IG1pZCArIDE7XG4gICAgICBlbHNlIGhpID0gbWlkO1xuICAgIH1cblxuICAgIGlmICgodmFsdWVUYXJnZXQgLSBzdW1zW2sgLSAxXSkgPCAoc3Vtc1trXSAtIHZhbHVlVGFyZ2V0KSAmJiBpICsgMSA8IGspIC0taztcblxuICAgIHZhciB2YWx1ZUxlZnQgPSBzdW1zW2tdIC0gdmFsdWVPZmZzZXQsXG4gICAgICAgIHZhbHVlUmlnaHQgPSB2YWx1ZSAtIHZhbHVlTGVmdDtcblxuICAgIGlmICgoeDEgLSB4MCkgPiAoeTEgLSB5MCkpIHtcbiAgICAgIHZhciB4ayA9ICh4MCAqIHZhbHVlUmlnaHQgKyB4MSAqIHZhbHVlTGVmdCkgLyB2YWx1ZTtcbiAgICAgIHBhcnRpdGlvbihpLCBrLCB2YWx1ZUxlZnQsIHgwLCB5MCwgeGssIHkxKTtcbiAgICAgIHBhcnRpdGlvbihrLCBqLCB2YWx1ZVJpZ2h0LCB4aywgeTAsIHgxLCB5MSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB5ayA9ICh5MCAqIHZhbHVlUmlnaHQgKyB5MSAqIHZhbHVlTGVmdCkgLyB2YWx1ZTtcbiAgICAgIHBhcnRpdGlvbihpLCBrLCB2YWx1ZUxlZnQsIHgwLCB5MCwgeDEsIHlrKTtcbiAgICAgIHBhcnRpdGlvbihrLCBqLCB2YWx1ZVJpZ2h0LCB4MCwgeWssIHgxLCB5MSk7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7XG4gIHZhciBub2RlcyA9IHBhcmVudC5jaGlsZHJlbixcbiAgICAgIG5vZGUsXG4gICAgICBpID0gLTEsXG4gICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgayA9IHBhcmVudC52YWx1ZSAmJiAoeDEgLSB4MCkgLyBwYXJlbnQudmFsdWU7XG5cbiAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueTAgPSB5MCwgbm9kZS55MSA9IHkxO1xuICAgIG5vZGUueDAgPSB4MCwgbm9kZS54MSA9IHgwICs9IG5vZGUudmFsdWUgKiBrO1xuICB9XG59XG4iLCJpbXBvcnQgcm91bmROb2RlIGZyb20gXCIuL3JvdW5kXCI7XG5pbXBvcnQgc3F1YXJpZnkgZnJvbSBcIi4vc3F1YXJpZnlcIjtcbmltcG9ydCB7cmVxdWlyZWR9IGZyb20gXCIuLi9hY2Nlc3NvcnNcIjtcbmltcG9ydCBjb25zdGFudCwge2NvbnN0YW50WmVyb30gZnJvbSBcIi4uL2NvbnN0YW50XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgdGlsZSA9IHNxdWFyaWZ5LFxuICAgICAgcm91bmQgPSBmYWxzZSxcbiAgICAgIGR4ID0gMSxcbiAgICAgIGR5ID0gMSxcbiAgICAgIHBhZGRpbmdTdGFjayA9IFswXSxcbiAgICAgIHBhZGRpbmdJbm5lciA9IGNvbnN0YW50WmVybyxcbiAgICAgIHBhZGRpbmdUb3AgPSBjb25zdGFudFplcm8sXG4gICAgICBwYWRkaW5nUmlnaHQgPSBjb25zdGFudFplcm8sXG4gICAgICBwYWRkaW5nQm90dG9tID0gY29uc3RhbnRaZXJvLFxuICAgICAgcGFkZGluZ0xlZnQgPSBjb25zdGFudFplcm87XG5cbiAgZnVuY3Rpb24gdHJlZW1hcChyb290KSB7XG4gICAgcm9vdC54MCA9XG4gICAgcm9vdC55MCA9IDA7XG4gICAgcm9vdC54MSA9IGR4O1xuICAgIHJvb3QueTEgPSBkeTtcbiAgICByb290LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKTtcbiAgICBwYWRkaW5nU3RhY2sgPSBbMF07XG4gICAgaWYgKHJvdW5kKSByb290LmVhY2hCZWZvcmUocm91bmROb2RlKTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvc2l0aW9uTm9kZShub2RlKSB7XG4gICAgdmFyIHAgPSBwYWRkaW5nU3RhY2tbbm9kZS5kZXB0aF0sXG4gICAgICAgIHgwID0gbm9kZS54MCArIHAsXG4gICAgICAgIHkwID0gbm9kZS55MCArIHAsXG4gICAgICAgIHgxID0gbm9kZS54MSAtIHAsXG4gICAgICAgIHkxID0gbm9kZS55MSAtIHA7XG4gICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyO1xuICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkwICsgeTEpIC8gMjtcbiAgICBub2RlLngwID0geDA7XG4gICAgbm9kZS55MCA9IHkwO1xuICAgIG5vZGUueDEgPSB4MTtcbiAgICBub2RlLnkxID0geTE7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIHAgPSBwYWRkaW5nU3RhY2tbbm9kZS5kZXB0aCArIDFdID0gcGFkZGluZ0lubmVyKG5vZGUpIC8gMjtcbiAgICAgIHgwICs9IHBhZGRpbmdMZWZ0KG5vZGUpIC0gcDtcbiAgICAgIHkwICs9IHBhZGRpbmdUb3Aobm9kZSkgLSBwO1xuICAgICAgeDEgLT0gcGFkZGluZ1JpZ2h0KG5vZGUpIC0gcDtcbiAgICAgIHkxIC09IHBhZGRpbmdCb3R0b20obm9kZSkgLSBwO1xuICAgICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyO1xuICAgICAgaWYgKHkxIDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyO1xuICAgICAgdGlsZShub2RlLCB4MCwgeTAsIHgxLCB5MSk7XG4gICAgfVxuICB9XG5cbiAgdHJlZW1hcC5yb3VuZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyb3VuZCA9ICEheCwgdHJlZW1hcCkgOiByb3VuZDtcbiAgfTtcblxuICB0cmVlbWFwLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgdHJlZW1hcCkgOiBbZHgsIGR5XTtcbiAgfTtcblxuICB0cmVlbWFwLnRpbGUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlsZSA9IHJlcXVpcmVkKHgpLCB0cmVlbWFwKSA6IHRpbGU7XG4gIH07XG5cbiAgdHJlZW1hcC5wYWRkaW5nID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdHJlZW1hcC5wYWRkaW5nSW5uZXIoeCkucGFkZGluZ091dGVyKHgpIDogdHJlZW1hcC5wYWRkaW5nSW5uZXIoKTtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmdJbm5lciA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5uZXIgPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6IGNvbnN0YW50KCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nSW5uZXI7XG4gIH07XG5cbiAgdHJlZW1hcC5wYWRkaW5nT3V0ZXIgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0cmVlbWFwLnBhZGRpbmdUb3AoeCkucGFkZGluZ1JpZ2h0KHgpLnBhZGRpbmdCb3R0b20oeCkucGFkZGluZ0xlZnQoeCkgOiB0cmVlbWFwLnBhZGRpbmdUb3AoKTtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmdUb3AgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ1RvcCA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogY29uc3RhbnQoK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdUb3A7XG4gIH07XG5cbiAgdHJlZW1hcC5wYWRkaW5nUmlnaHQgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ1JpZ2h0ID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ1JpZ2h0O1xuICB9O1xuXG4gIHRyZWVtYXAucGFkZGluZ0JvdHRvbSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nQm90dG9tID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ0JvdHRvbTtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmdMZWZ0ID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdMZWZ0ID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ0xlZnQ7XG4gIH07XG5cbiAgcmV0dXJuIHRyZWVtYXA7XG59XG4iLCJpbXBvcnQgdHJlZW1hcERpY2UgZnJvbSBcIi4vZGljZVwiO1xuaW1wb3J0IHRyZWVtYXBTbGljZSBmcm9tIFwiLi9zbGljZVwiO1xuaW1wb3J0IHtwaGksIHNxdWFyaWZ5UmF0aW99IGZyb20gXCIuL3NxdWFyaWZ5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20ocmF0aW8pIHtcblxuICBmdW5jdGlvbiByZXNxdWFyaWZ5KHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgICBpZiAoKHJvd3MgPSBwYXJlbnQuX3NxdWFyaWZ5KSAmJiAocm93cy5yYXRpbyA9PT0gcmF0aW8pKSB7XG4gICAgICB2YXIgcm93cyxcbiAgICAgICAgICByb3csXG4gICAgICAgICAgbm9kZXMsXG4gICAgICAgICAgaSxcbiAgICAgICAgICBqID0gLTEsXG4gICAgICAgICAgbixcbiAgICAgICAgICBtID0gcm93cy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWUgPSBwYXJlbnQudmFsdWU7XG5cbiAgICAgIHdoaWxlICgrK2ogPCBtKSB7XG4gICAgICAgIHJvdyA9IHJvd3Nbal0sIG5vZGVzID0gcm93LmNoaWxkcmVuO1xuICAgICAgICBmb3IgKGkgPSByb3cudmFsdWUgPSAwLCBuID0gbm9kZXMubGVuZ3RoOyBpIDwgbjsgKytpKSByb3cudmFsdWUgKz0gbm9kZXNbaV0udmFsdWU7XG4gICAgICAgIGlmIChyb3cuZGljZSkgdHJlZW1hcERpY2Uocm93LCB4MCwgeTAsIHgxLCB5MCArPSAoeTEgLSB5MCkgKiByb3cudmFsdWUgLyB2YWx1ZSk7XG4gICAgICAgIGVsc2UgdHJlZW1hcFNsaWNlKHJvdywgeDAsIHkwLCB4MCArPSAoeDEgLSB4MCkgKiByb3cudmFsdWUgLyB2YWx1ZSwgeTEpO1xuICAgICAgICB2YWx1ZSAtPSByb3cudmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudC5fc3F1YXJpZnkgPSByb3dzID0gc3F1YXJpZnlSYXRpbyhyYXRpbywgcGFyZW50LCB4MCwgeTAsIHgxLCB5MSk7XG4gICAgICByb3dzLnJhdGlvID0gcmF0aW87XG4gICAgfVxuICB9XG5cbiAgcmVzcXVhcmlmeS5yYXRpbyA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gY3VzdG9tKCh4ID0gK3gpID4gMSA/IHggOiAxKTtcbiAgfTtcblxuICByZXR1cm4gcmVzcXVhcmlmeTtcbn0pKHBoaSk7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIG5vZGUueDAgPSBNYXRoLnJvdW5kKG5vZGUueDApO1xuICBub2RlLnkwID0gTWF0aC5yb3VuZChub2RlLnkwKTtcbiAgbm9kZS54MSA9IE1hdGgucm91bmQobm9kZS54MSk7XG4gIG5vZGUueTEgPSBNYXRoLnJvdW5kKG5vZGUueTEpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkge1xuICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sXG4gICAgICBub2RlLFxuICAgICAgaSA9IC0xLFxuICAgICAgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgIGsgPSBwYXJlbnQudmFsdWUgJiYgKHkxIC0geTApIC8gcGFyZW50LnZhbHVlO1xuXG4gIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLngwID0geDAsIG5vZGUueDEgPSB4MTtcbiAgICBub2RlLnkwID0geTAsIG5vZGUueTEgPSB5MCArPSBub2RlLnZhbHVlICogaztcbiAgfVxufVxuIiwiaW1wb3J0IGRpY2UgZnJvbSBcIi4vZGljZVwiO1xuaW1wb3J0IHNsaWNlIGZyb20gXCIuL3NsaWNlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgKHBhcmVudC5kZXB0aCAmIDEgPyBzbGljZSA6IGRpY2UpKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpO1xufVxuIiwiaW1wb3J0IHRyZWVtYXBEaWNlIGZyb20gXCIuL2RpY2VcIjtcbmltcG9ydCB0cmVlbWFwU2xpY2UgZnJvbSBcIi4vc2xpY2VcIjtcblxuZXhwb3J0IHZhciBwaGkgPSAoMSArIE1hdGguc3FydCg1KSkgLyAyO1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJpZnlSYXRpbyhyYXRpbywgcGFyZW50LCB4MCwgeTAsIHgxLCB5MSkge1xuICB2YXIgcm93cyA9IFtdLFxuICAgICAgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sXG4gICAgICByb3csXG4gICAgICBub2RlVmFsdWUsXG4gICAgICBpMCA9IDAsXG4gICAgICBpMSA9IDAsXG4gICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgZHgsIGR5LFxuICAgICAgdmFsdWUgPSBwYXJlbnQudmFsdWUsXG4gICAgICBzdW1WYWx1ZSxcbiAgICAgIG1pblZhbHVlLFxuICAgICAgbWF4VmFsdWUsXG4gICAgICBuZXdSYXRpbyxcbiAgICAgIG1pblJhdGlvLFxuICAgICAgYWxwaGEsXG4gICAgICBiZXRhO1xuXG4gIHdoaWxlIChpMCA8IG4pIHtcbiAgICBkeCA9IHgxIC0geDAsIGR5ID0geTEgLSB5MDtcblxuICAgIC8vIEZpbmQgdGhlIG5leHQgbm9uLWVtcHR5IG5vZGUuXG4gICAgZG8gc3VtVmFsdWUgPSBub2Rlc1tpMSsrXS52YWx1ZTsgd2hpbGUgKCFzdW1WYWx1ZSAmJiBpMSA8IG4pO1xuICAgIG1pblZhbHVlID0gbWF4VmFsdWUgPSBzdW1WYWx1ZTtcbiAgICBhbHBoYSA9IE1hdGgubWF4KGR5IC8gZHgsIGR4IC8gZHkpIC8gKHZhbHVlICogcmF0aW8pO1xuICAgIGJldGEgPSBzdW1WYWx1ZSAqIHN1bVZhbHVlICogYWxwaGE7XG4gICAgbWluUmF0aW8gPSBNYXRoLm1heChtYXhWYWx1ZSAvIGJldGEsIGJldGEgLyBtaW5WYWx1ZSk7XG5cbiAgICAvLyBLZWVwIGFkZGluZyBub2RlcyB3aGlsZSB0aGUgYXNwZWN0IHJhdGlvIG1haW50YWlucyBvciBpbXByb3Zlcy5cbiAgICBmb3IgKDsgaTEgPCBuOyArK2kxKSB7XG4gICAgICBzdW1WYWx1ZSArPSBub2RlVmFsdWUgPSBub2Rlc1tpMV0udmFsdWU7XG4gICAgICBpZiAobm9kZVZhbHVlIDwgbWluVmFsdWUpIG1pblZhbHVlID0gbm9kZVZhbHVlO1xuICAgICAgaWYgKG5vZGVWYWx1ZSA+IG1heFZhbHVlKSBtYXhWYWx1ZSA9IG5vZGVWYWx1ZTtcbiAgICAgIGJldGEgPSBzdW1WYWx1ZSAqIHN1bVZhbHVlICogYWxwaGE7XG4gICAgICBuZXdSYXRpbyA9IE1hdGgubWF4KG1heFZhbHVlIC8gYmV0YSwgYmV0YSAvIG1pblZhbHVlKTtcbiAgICAgIGlmIChuZXdSYXRpbyA+IG1pblJhdGlvKSB7IHN1bVZhbHVlIC09IG5vZGVWYWx1ZTsgYnJlYWs7IH1cbiAgICAgIG1pblJhdGlvID0gbmV3UmF0aW87XG4gICAgfVxuXG4gICAgLy8gUG9zaXRpb24gYW5kIHJlY29yZCB0aGUgcm93IG9yaWVudGF0aW9uLlxuICAgIHJvd3MucHVzaChyb3cgPSB7dmFsdWU6IHN1bVZhbHVlLCBkaWNlOiBkeCA8IGR5LCBjaGlsZHJlbjogbm9kZXMuc2xpY2UoaTAsIGkxKX0pO1xuICAgIGlmIChyb3cuZGljZSkgdHJlZW1hcERpY2Uocm93LCB4MCwgeTAsIHgxLCB2YWx1ZSA/IHkwICs9IGR5ICogc3VtVmFsdWUgLyB2YWx1ZSA6IHkxKTtcbiAgICBlbHNlIHRyZWVtYXBTbGljZShyb3csIHgwLCB5MCwgdmFsdWUgPyB4MCArPSBkeCAqIHN1bVZhbHVlIC8gdmFsdWUgOiB4MSwgeTEpO1xuICAgIHZhbHVlIC09IHN1bVZhbHVlLCBpMCA9IGkxO1xuICB9XG5cbiAgcmV0dXJuIHJvd3M7XG59XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20ocmF0aW8pIHtcblxuICBmdW5jdGlvbiBzcXVhcmlmeShwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7XG4gICAgc3F1YXJpZnlSYXRpbyhyYXRpbywgcGFyZW50LCB4MCwgeTAsIHgxLCB5MSk7XG4gIH1cblxuICBzcXVhcmlmeS5yYXRpbyA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gY3VzdG9tKCh4ID0gK3gpID4gMSA/IHggOiAxKTtcbiAgfTtcblxuICByZXR1cm4gc3F1YXJpZnk7XG59KShwaGkpO1xuIiwiaW1wb3J0IHZhbHVlIGZyb20gXCIuL3ZhbHVlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIG5iID0gYiA/IGIubGVuZ3RoIDogMCxcbiAgICAgIG5hID0gYSA/IE1hdGgubWluKG5iLCBhLmxlbmd0aCkgOiAwLFxuICAgICAgeCA9IG5ldyBBcnJheShuYSksXG4gICAgICBjID0gbmV3IEFycmF5KG5iKSxcbiAgICAgIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IG5hOyArK2kpIHhbaV0gPSB2YWx1ZShhW2ldLCBiW2ldKTtcbiAgZm9yICg7IGkgPCBuYjsgKytpKSBjW2ldID0gYltpXTtcblxuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSBjW2ldID0geFtpXSh0KTtcbiAgICByZXR1cm4gYztcbiAgfTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHtcbiAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxO1xuICByZXR1cm4gKCgxIC0gMyAqIHQxICsgMyAqIHQyIC0gdDMpICogdjBcbiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjFcbiAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjJcbiAgICAgICsgdDMgKiB2MykgLyA2O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQgPD0gMCA/ICh0ID0gMCkgOiB0ID49IDEgPyAodCA9IDEsIG4gLSAxKSA6IE1hdGguZmxvb3IodCAqIG4pLFxuICAgICAgICB2MSA9IHZhbHVlc1tpXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbaSArIDFdLFxuICAgICAgICB2MCA9IGkgPiAwID8gdmFsdWVzW2kgLSAxXSA6IDIgKiB2MSAtIHYyLFxuICAgICAgICB2MyA9IGkgPCBuIC0gMSA/IHZhbHVlc1tpICsgMl0gOiAyICogdjIgLSB2MTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCJpbXBvcnQge2Jhc2lzfSBmcm9tIFwiLi9iYXNpc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gTWF0aC5mbG9vcigoKHQgJT0gMSkgPCAwID8gKyt0IDogdCkgKiBuKSxcbiAgICAgICAgdjAgPSB2YWx1ZXNbKGkgKyBuIC0gMSkgJSBuXSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaSAlIG5dLFxuICAgICAgICB2MiA9IHZhbHVlc1soaSArIDEpICUgbl0sXG4gICAgICAgIHYzID0gdmFsdWVzWyhpICsgMikgJSBuXTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnRcIjtcblxuZnVuY3Rpb24gbGluZWFyKGEsIGQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSArIHQgKiBkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7XG4gIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHVlKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdhbW1hKHkpIHtcbiAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbChhLCBiLCB5KSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwiaW1wb3J0IHtjdWJlaGVsaXggYXMgY29sb3JDdWJlaGVsaXh9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGNvbG9yLCB7aHVlfSBmcm9tIFwiLi9jb2xvclwiO1xuXG5mdW5jdGlvbiBjdWJlaGVsaXgoaHVlKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gY3ViZWhlbGl4R2FtbWEoeSkge1xuICAgIHkgPSAreTtcblxuICAgIGZ1bmN0aW9uIGN1YmVoZWxpeChzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgaCA9IGh1ZSgoc3RhcnQgPSBjb2xvckN1YmVoZWxpeChzdGFydCkpLmgsIChlbmQgPSBjb2xvckN1YmVoZWxpeChlbmQpKS5oKSxcbiAgICAgICAgICBzID0gY29sb3Ioc3RhcnQucywgZW5kLnMpLFxuICAgICAgICAgIGwgPSBjb2xvcihzdGFydC5sLCBlbmQubCksXG4gICAgICAgICAgb3BhY2l0eSA9IGNvbG9yKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgIHN0YXJ0LmggPSBoKHQpO1xuICAgICAgICBzdGFydC5zID0gcyh0KTtcbiAgICAgICAgc3RhcnQubCA9IGwoTWF0aC5wb3codCwgeSkpO1xuICAgICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY3ViZWhlbGl4LmdhbW1hID0gY3ViZWhlbGl4R2FtbWE7XG5cbiAgICByZXR1cm4gY3ViZWhlbGl4O1xuICB9KSgxKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3ViZWhlbGl4KGh1ZSk7XG5leHBvcnQgdmFyIGN1YmVoZWxpeExvbmcgPSBjdWJlaGVsaXgoY29sb3IpO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgZCA9IG5ldyBEYXRlO1xuICByZXR1cm4gYSA9ICthLCBiIC09IGEsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gZC5zZXRUaW1lKGEgKyBiICogdCksIGQ7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihyYW5nZSkge1xuICB2YXIgbiA9IHJhbmdlLmxlbmd0aDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gcmFuZ2VbTWF0aC5tYXgoMCwgTWF0aC5taW4obiAtIDEsIE1hdGguZmxvb3IodCAqIG4pKSldO1xuICB9O1xufVxuIiwiaW1wb3J0IHtoY2wgYXMgY29sb3JIY2x9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGNvbG9yLCB7aHVlfSBmcm9tIFwiLi9jb2xvclwiO1xuXG5mdW5jdGlvbiBoY2woaHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgdmFyIGggPSBodWUoKHN0YXJ0ID0gY29sb3JIY2woc3RhcnQpKS5oLCAoZW5kID0gY29sb3JIY2woZW5kKSkuaCksXG4gICAgICAgIGMgPSBjb2xvcihzdGFydC5jLCBlbmQuYyksXG4gICAgICAgIGwgPSBjb2xvcihzdGFydC5sLCBlbmQubCksXG4gICAgICAgIG9wYWNpdHkgPSBjb2xvcihzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHN0YXJ0LmggPSBoKHQpO1xuICAgICAgc3RhcnQuYyA9IGModCk7XG4gICAgICBzdGFydC5sID0gbCh0KTtcbiAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhjbChodWUpO1xuZXhwb3J0IHZhciBoY2xMb25nID0gaGNsKGNvbG9yKTtcbiIsImltcG9ydCB7aHNsIGFzIGNvbG9ySHNsfSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBjb2xvciwge2h1ZX0gZnJvbSBcIi4vY29sb3JcIjtcblxuZnVuY3Rpb24gaHNsKGh1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICAgIHZhciBoID0gaHVlKChzdGFydCA9IGNvbG9ySHNsKHN0YXJ0KSkuaCwgKGVuZCA9IGNvbG9ySHNsKGVuZCkpLmgpLFxuICAgICAgICBzID0gY29sb3Ioc3RhcnQucywgZW5kLnMpLFxuICAgICAgICBsID0gY29sb3Ioc3RhcnQubCwgZW5kLmwpLFxuICAgICAgICBvcGFjaXR5ID0gY29sb3Ioc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBzdGFydC5oID0gaCh0KTtcbiAgICAgIHN0YXJ0LnMgPSBzKHQpO1xuICAgICAgc3RhcnQubCA9IGwodCk7XG4gICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICAgIHJldHVybiBzdGFydCArIFwiXCI7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBoc2woaHVlKTtcbmV4cG9ydCB2YXIgaHNsTG9uZyA9IGhzbChjb2xvcik7XG4iLCJpbXBvcnQge2h1ZX0gZnJvbSBcIi4vY29sb3JcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgaSA9IGh1ZSgrYSwgK2IpO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciB4ID0gaSh0KTtcbiAgICByZXR1cm4geCAtIDM2MCAqIE1hdGguZmxvb3IoeCAvIDM2MCk7XG4gIH07XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGV9IGZyb20gXCIuL3ZhbHVlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVBcnJheX0gZnJvbSBcIi4vYXJyYXlcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZUJhc2lzfSBmcm9tIFwiLi9iYXNpc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlQmFzaXNDbG9zZWR9IGZyb20gXCIuL2Jhc2lzQ2xvc2VkXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVEYXRlfSBmcm9tIFwiLi9kYXRlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVEaXNjcmV0ZX0gZnJvbSBcIi4vZGlzY3JldGVcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZUh1ZX0gZnJvbSBcIi4vaHVlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVOdW1iZXJ9IGZyb20gXCIuL251bWJlclwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlT2JqZWN0fSBmcm9tIFwiLi9vYmplY3RcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVJvdW5kfSBmcm9tIFwiLi9yb3VuZFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycG9sYXRlU3RyaW5nfSBmcm9tIFwiLi9zdHJpbmdcIjtcbmV4cG9ydCB7aW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MsIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnfSBmcm9tIFwiLi90cmFuc2Zvcm0vaW5kZXhcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVpvb219IGZyb20gXCIuL3pvb21cIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVJnYiwgcmdiQmFzaXMgYXMgaW50ZXJwb2xhdGVSZ2JCYXNpcywgcmdiQmFzaXNDbG9zZWQgYXMgaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZH0gZnJvbSBcIi4vcmdiXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVIc2wsIGhzbExvbmcgYXMgaW50ZXJwb2xhdGVIc2xMb25nfSBmcm9tIFwiLi9oc2xcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZUxhYn0gZnJvbSBcIi4vbGFiXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaW50ZXJwb2xhdGVIY2wsIGhjbExvbmcgYXMgaW50ZXJwb2xhdGVIY2xMb25nfSBmcm9tIFwiLi9oY2xcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZUN1YmVoZWxpeCwgY3ViZWhlbGl4TG9uZyBhcyBpbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmd9IGZyb20gXCIuL2N1YmVoZWxpeFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHBpZWNld2lzZX0gZnJvbSBcIi4vcGllY2V3aXNlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcXVhbnRpemV9IGZyb20gXCIuL3F1YW50aXplXCI7XG4iLCJpbXBvcnQge2xhYiBhcyBjb2xvckxhYn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgY29sb3IgZnJvbSBcIi4vY29sb3JcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGFiKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGwgPSBjb2xvcigoc3RhcnQgPSBjb2xvckxhYihzdGFydCkpLmwsIChlbmQgPSBjb2xvckxhYihlbmQpKS5sKSxcbiAgICAgIGEgPSBjb2xvcihzdGFydC5hLCBlbmQuYSksXG4gICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLFxuICAgICAgb3BhY2l0eSA9IGNvbG9yKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBzdGFydC5sID0gbCh0KTtcbiAgICBzdGFydC5hID0gYSh0KTtcbiAgICBzdGFydC5iID0gYih0KTtcbiAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiIC09IGEsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSArIGIgKiB0O1xuICB9O1xufVxuIiwiaW1wb3J0IHZhbHVlIGZyb20gXCIuL3ZhbHVlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGkgPSB7fSxcbiAgICAgIGMgPSB7fSxcbiAgICAgIGs7XG5cbiAgaWYgKGEgPT09IG51bGwgfHwgdHlwZW9mIGEgIT09IFwib2JqZWN0XCIpIGEgPSB7fTtcbiAgaWYgKGIgPT09IG51bGwgfHwgdHlwZW9mIGIgIT09IFwib2JqZWN0XCIpIGIgPSB7fTtcblxuICBmb3IgKGsgaW4gYikge1xuICAgIGlmIChrIGluIGEpIHtcbiAgICAgIGlba10gPSB2YWx1ZShhW2tdLCBiW2tdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY1trXSA9IGJba107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBmb3IgKGsgaW4gaSkgY1trXSA9IGlba10odCk7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwaWVjZXdpc2UoaW50ZXJwb2xhdGUsIHZhbHVlcykge1xuICB2YXIgaSA9IDAsIG4gPSB2YWx1ZXMubGVuZ3RoIC0gMSwgdiA9IHZhbHVlc1swXSwgSSA9IG5ldyBBcnJheShuIDwgMCA/IDAgOiBuKTtcbiAgd2hpbGUgKGkgPCBuKSBJW2ldID0gaW50ZXJwb2xhdGUodiwgdiA9IHZhbHVlc1srK2ldKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IE1hdGgubWF4KDAsIE1hdGgubWluKG4gLSAxLCBNYXRoLmZsb29yKHQgKj0gbikpKTtcbiAgICByZXR1cm4gSVtpXSh0IC0gaSk7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnRlcnBvbGF0b3IsIG4pIHtcbiAgdmFyIHNhbXBsZXMgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSBzYW1wbGVzW2ldID0gaW50ZXJwb2xhdG9yKGkgLyAobiAtIDEpKTtcbiAgcmV0dXJuIHNhbXBsZXM7XG59XG4iLCJpbXBvcnQge3JnYiBhcyBjb2xvclJnYn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgYmFzaXMgZnJvbSBcIi4vYmFzaXNcIjtcbmltcG9ydCBiYXNpc0Nsb3NlZCBmcm9tIFwiLi9iYXNpc0Nsb3NlZFwiO1xuaW1wb3J0IG5vZ2FtbWEsIHtnYW1tYX0gZnJvbSBcIi4vY29sb3JcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHtcbiAgdmFyIGNvbG9yID0gZ2FtbWEoeSk7XG5cbiAgZnVuY3Rpb24gcmdiKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IGNvbG9yUmdiKHN0YXJ0KSkuciwgKGVuZCA9IGNvbG9yUmdiKGVuZCkpLnIpLFxuICAgICAgICBnID0gY29sb3Ioc3RhcnQuZywgZW5kLmcpLFxuICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLFxuICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHN0YXJ0LnIgPSByKHQpO1xuICAgICAgc3RhcnQuZyA9IGcodCk7XG4gICAgICBzdGFydC5iID0gYih0KTtcbiAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICB9O1xuICB9XG5cbiAgcmdiLmdhbW1hID0gcmdiR2FtbWE7XG5cbiAgcmV0dXJuIHJnYjtcbn0pKDEpO1xuXG5mdW5jdGlvbiByZ2JTcGxpbmUoc3BsaW5lKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xvcnMpIHtcbiAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsXG4gICAgICAgIHIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGcgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGksIGNvbG9yO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGNvbG9yID0gY29sb3JSZ2IoY29sb3JzW2ldKTtcbiAgICAgIHJbaV0gPSBjb2xvci5yIHx8IDA7XG4gICAgICBnW2ldID0gY29sb3IuZyB8fCAwO1xuICAgICAgYltpXSA9IGNvbG9yLmIgfHwgMDtcbiAgICB9XG4gICAgciA9IHNwbGluZShyKTtcbiAgICBnID0gc3BsaW5lKGcpO1xuICAgIGIgPSBzcGxpbmUoYik7XG4gICAgY29sb3Iub3BhY2l0eSA9IDE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIGNvbG9yLnIgPSByKHQpO1xuICAgICAgY29sb3IuZyA9IGcodCk7XG4gICAgICBjb2xvci5iID0gYih0KTtcbiAgICAgIHJldHVybiBjb2xvciArIFwiXCI7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciByZ2JCYXNpcyA9IHJnYlNwbGluZShiYXNpcyk7XG5leHBvcnQgdmFyIHJnYkJhc2lzQ2xvc2VkID0gcmdiU3BsaW5lKGJhc2lzQ2xvc2VkKTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgPSArYSwgYiAtPSBhLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoYSArIGIgKiB0KTtcbiAgfTtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyXCI7XG5cbnZhciByZUEgPSAvWy0rXT8oPzpcXGQrXFwuP1xcZCp8XFwuP1xcZCspKD86W2VFXVstK10/XFxkKyk/L2csXG4gICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCBcImdcIik7XG5cbmZ1bmN0aW9uIHplcm8oYikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGI7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uZShiKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGIodCkgKyBcIlwiO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYVxuICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYlxuICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55XG4gICAgICBpID0gLTEsIC8vIGluZGV4IGluIHNcbiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG5cbiAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLlxuICBhID0gYSArIFwiXCIsIGIgPSBiICsgXCJcIjtcblxuICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLlxuICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpXG4gICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHtcbiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpO1xuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJzO1xuICAgIH1cbiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaFxuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJtO1xuICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzXG4gICAgICBzWysraV0gPSBudWxsO1xuICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pO1xuICAgIH1cbiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7XG4gIH1cblxuICAvLyBBZGQgcmVtYWlucyBvZiBiLlxuICBpZiAoYmkgPCBiLmxlbmd0aCkge1xuICAgIGJzID0gYi5zbGljZShiaSk7XG4gICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgZWxzZSBzWysraV0gPSBicztcbiAgfVxuXG4gIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLlxuICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLlxuICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF1cbiAgICAgID8gb25lKHFbMF0ueClcbiAgICAgIDogemVybyhiKSlcbiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICAgICAgfSk7XG59XG4iLCJ2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSB7XG4gIHRyYW5zbGF0ZVg6IDAsXG4gIHRyYW5zbGF0ZVk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2tld1g6IDAsXG4gIHNjYWxlWDogMSxcbiAgc2NhbGVZOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7XG4gIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDtcbiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYO1xuICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTtcbiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGVYOiBlLFxuICAgIHRyYW5zbGF0ZVk6IGYsXG4gICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcyxcbiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsXG4gICAgc2NhbGVYOiBzY2FsZVgsXG4gICAgc2NhbGVZOiBzY2FsZVlcbiAgfTtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlclwiO1xuaW1wb3J0IHtwYXJzZUNzcywgcGFyc2VTdmd9IGZyb20gXCIuL3BhcnNlXCI7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikge1xuXG4gIGZ1bmN0aW9uIHBvcChzKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArIFwiIFwiIDogXCJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChcInRyYW5zbGF0ZShcIiwgbnVsbCwgcHhDb21tYSwgbnVsbCwgcHhQYXJlbik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7XG4gICAgICBzLnB1c2goXCJ0cmFuc2xhdGUoXCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aFxuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiArIHhiICsgXCIsXCIgKyB5YiArIFwiKVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG4gICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7XG4gICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7XG4gICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7XG4gICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7XG4gICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpO1xuICAgIGEgPSBiID0gbnVsbDsgLy8gZ2NcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlQ3NzLCBcInB4LCBcIiwgXCJweClcIiwgXCJkZWcpXCIpO1xuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCBcIiwgXCIsIFwiKVwiLCBcIilcIik7XG4iLCJpbXBvcnQgZGVjb21wb3NlLCB7aWRlbnRpdHl9IGZyb20gXCIuL2RlY29tcG9zZVwiO1xuXG52YXIgY3NzTm9kZSxcbiAgICBjc3NSb290LFxuICAgIGNzc1ZpZXcsXG4gICAgc3ZnTm9kZTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ3NzKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gXCJub25lXCIpIHJldHVybiBpZGVudGl0eTtcbiAgaWYgKCFjc3NOb2RlKSBjc3NOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKSwgY3NzUm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgY3NzVmlldyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICBjc3NOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IHZhbHVlO1xuICB2YWx1ZSA9IGNzc1ZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShjc3NSb290LmFwcGVuZENoaWxkKGNzc05vZGUpLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKFwidHJhbnNmb3JtXCIpO1xuICBjc3NSb290LnJlbW92ZUNoaWxkKGNzc05vZGUpO1xuICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDcsIC0xKS5zcGxpdChcIixcIik7XG4gIHJldHVybiBkZWNvbXBvc2UoK3ZhbHVlWzBdLCArdmFsdWVbMV0sICt2YWx1ZVsyXSwgK3ZhbHVlWzNdLCArdmFsdWVbNF0sICt2YWx1ZVs1XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN2Zyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5O1xuICBpZiAoIXN2Z05vZGUpIHN2Z05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gIHN2Z05vZGUuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIHZhbHVlKTtcbiAgaWYgKCEodmFsdWUgPSBzdmdOb2RlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHZhbHVlID0gdmFsdWUubWF0cml4O1xuICByZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsIHZhbHVlLmIsIHZhbHVlLmMsIHZhbHVlLmQsIHZhbHVlLmUsIHZhbHVlLmYpO1xufVxuIiwiaW1wb3J0IHtjb2xvcn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgcmdiIGZyb20gXCIuL3JnYlwiO1xuaW1wb3J0IGFycmF5IGZyb20gXCIuL2FycmF5XCI7XG5pbXBvcnQgZGF0ZSBmcm9tIFwiLi9kYXRlXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlclwiO1xuaW1wb3J0IG9iamVjdCBmcm9tIFwiLi9vYmplY3RcIjtcbmltcG9ydCBzdHJpbmcgZnJvbSBcIi4vc3RyaW5nXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgdCA9IHR5cGVvZiBiLCBjO1xuICByZXR1cm4gYiA9PSBudWxsIHx8IHQgPT09IFwiYm9vbGVhblwiID8gY29uc3RhbnQoYilcbiAgICAgIDogKHQgPT09IFwibnVtYmVyXCIgPyBudW1iZXJcbiAgICAgIDogdCA9PT0gXCJzdHJpbmdcIiA/ICgoYyA9IGNvbG9yKGIpKSA/IChiID0gYywgcmdiKSA6IHN0cmluZylcbiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gcmdiXG4gICAgICA6IGIgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZVxuICAgICAgOiBBcnJheS5pc0FycmF5KGIpID8gYXJyYXlcbiAgICAgIDogdHlwZW9mIGIudmFsdWVPZiAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBiLnRvU3RyaW5nICE9PSBcImZ1bmN0aW9uXCIgfHwgaXNOYU4oYikgPyBvYmplY3RcbiAgICAgIDogbnVtYmVyKShhLCBiKTtcbn1cbiIsInZhciByaG8gPSBNYXRoLlNRUlQyLFxuICAgIHJobzIgPSAyLFxuICAgIHJobzQgPSA0LFxuICAgIGVwc2lsb24yID0gMWUtMTI7XG5cbmZ1bmN0aW9uIGNvc2goeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjtcbn1cblxuZnVuY3Rpb24gc2luaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgLSAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiB0YW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKDIgKiB4KSkgLSAxKSAvICh4ICsgMSk7XG59XG5cbi8vIHAwID0gW3V4MCwgdXkwLCB3MF1cbi8vIHAxID0gW3V4MSwgdXkxLCB3MV1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHAwLCBwMSkge1xuICB2YXIgdXgwID0gcDBbMF0sIHV5MCA9IHAwWzFdLCB3MCA9IHAwWzJdLFxuICAgICAgdXgxID0gcDFbMF0sIHV5MSA9IHAxWzFdLCB3MSA9IHAxWzJdLFxuICAgICAgZHggPSB1eDEgLSB1eDAsXG4gICAgICBkeSA9IHV5MSAtIHV5MCxcbiAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHksXG4gICAgICBpLFxuICAgICAgUztcblxuICAvLyBTcGVjaWFsIGNhc2UgZm9yIHUwIOKJhSB1MS5cbiAgaWYgKGQyIDwgZXBzaWxvbjIpIHtcbiAgICBTID0gTWF0aC5sb2codzEgLyB3MCkgLyByaG87XG4gICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHV4MCArIHQgKiBkeCxcbiAgICAgICAgdXkwICsgdCAqIGR5LFxuICAgICAgICB3MCAqIE1hdGguZXhwKHJobyAqIHQgKiBTKVxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICAvLyBHZW5lcmFsIGNhc2UuXG4gIGVsc2Uge1xuICAgIHZhciBkMSA9IE1hdGguc3FydChkMiksXG4gICAgICAgIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvNCAqIGQyKSAvICgyICogdzAgKiByaG8yICogZDEpLFxuICAgICAgICBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSxcbiAgICAgICAgcjAgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjAgKiBiMCArIDEpIC0gYjApLFxuICAgICAgICByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7XG4gICAgUyA9IChyMSAtIHIwKSAvIHJobztcbiAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIHMgPSB0ICogUyxcbiAgICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSxcbiAgICAgICAgICB1ID0gdzAgLyAocmhvMiAqIGQxKSAqIChjb3NocjAgKiB0YW5oKHJobyAqIHMgKyByMCkgLSBzaW5oKHIwKSk7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB1eDAgKyB1ICogZHgsXG4gICAgICAgIHV5MCArIHUgKiBkeSxcbiAgICAgICAgdzAgKiBjb3NocjAgLyBjb3NoKHJobyAqIHMgKyByMClcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaS5kdXJhdGlvbiA9IFMgKiAxMDAwO1xuXG4gIHJldHVybiBpO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIHBhdGh9IGZyb20gXCIuL3BhdGhcIjtcbiIsInZhciBwaSA9IE1hdGguUEksXG4gICAgdGF1ID0gMiAqIHBpLFxuICAgIGVwc2lsb24gPSAxZS02LFxuICAgIHRhdUVwc2lsb24gPSB0YXUgLSBlcHNpbG9uO1xuXG5mdW5jdGlvbiBQYXRoKCkge1xuICB0aGlzLl94MCA9IHRoaXMuX3kwID0gLy8gc3RhcnQgb2YgY3VycmVudCBzdWJwYXRoXG4gIHRoaXMuX3gxID0gdGhpcy5feTEgPSBudWxsOyAvLyBlbmQgb2YgY3VycmVudCBzdWJwYXRoXG4gIHRoaXMuXyA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIHBhdGgoKSB7XG4gIHJldHVybiBuZXcgUGF0aDtcbn1cblxuUGF0aC5wcm90b3R5cGUgPSBwYXRoLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFBhdGgsXG4gIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkge1xuICAgIHRoaXMuXyArPSBcIk1cIiArICh0aGlzLl94MCA9IHRoaXMuX3gxID0gK3gpICsgXCIsXCIgKyAodGhpcy5feTAgPSB0aGlzLl95MSA9ICt5KTtcbiAgfSxcbiAgY2xvc2VQYXRoOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5feDEgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3gxID0gdGhpcy5feDAsIHRoaXMuX3kxID0gdGhpcy5feTA7XG4gICAgICB0aGlzLl8gKz0gXCJaXCI7XG4gICAgfVxuICB9LFxuICBsaW5lVG86IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB0aGlzLl8gKz0gXCJMXCIgKyAodGhpcy5feDEgPSAreCkgKyBcIixcIiArICh0aGlzLl95MSA9ICt5KTtcbiAgfSxcbiAgcXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4LCB5KSB7XG4gICAgdGhpcy5fICs9IFwiUVwiICsgKCt4MSkgKyBcIixcIiArICgreTEpICsgXCIsXCIgKyAodGhpcy5feDEgPSAreCkgKyBcIixcIiArICh0aGlzLl95MSA9ICt5KTtcbiAgfSxcbiAgYmV6aWVyQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHtcbiAgICB0aGlzLl8gKz0gXCJDXCIgKyAoK3gxKSArIFwiLFwiICsgKCt5MSkgKyBcIixcIiArICgreDIpICsgXCIsXCIgKyAoK3kyKSArIFwiLFwiICsgKHRoaXMuX3gxID0gK3gpICsgXCIsXCIgKyAodGhpcy5feTEgPSAreSk7XG4gIH0sXG4gIGFyY1RvOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5Miwgcikge1xuICAgIHgxID0gK3gxLCB5MSA9ICt5MSwgeDIgPSAreDIsIHkyID0gK3kyLCByID0gK3I7XG4gICAgdmFyIHgwID0gdGhpcy5feDEsXG4gICAgICAgIHkwID0gdGhpcy5feTEsXG4gICAgICAgIHgyMSA9IHgyIC0geDEsXG4gICAgICAgIHkyMSA9IHkyIC0geTEsXG4gICAgICAgIHgwMSA9IHgwIC0geDEsXG4gICAgICAgIHkwMSA9IHkwIC0geTEsXG4gICAgICAgIGwwMV8yID0geDAxICogeDAxICsgeTAxICogeTAxO1xuXG4gICAgLy8gSXMgdGhlIHJhZGl1cyBuZWdhdGl2ZT8gRXJyb3IuXG4gICAgaWYgKHIgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJuZWdhdGl2ZSByYWRpdXM6IFwiICsgcik7XG5cbiAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgxLHkxKS5cbiAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuXyArPSBcIk1cIiArICh0aGlzLl94MSA9IHgxKSArIFwiLFwiICsgKHRoaXMuX3kxID0geTEpO1xuICAgIH1cblxuICAgIC8vIE9yLCBpcyAoeDEseTEpIGNvaW5jaWRlbnQgd2l0aCAoeDAseTApPyBEbyBub3RoaW5nLlxuICAgIGVsc2UgaWYgKCEobDAxXzIgPiBlcHNpbG9uKSk7XG5cbiAgICAvLyBPciwgYXJlICh4MCx5MCksICh4MSx5MSkgYW5kICh4Mix5MikgY29sbGluZWFyP1xuICAgIC8vIEVxdWl2YWxlbnRseSwgaXMgKHgxLHkxKSBjb2luY2lkZW50IHdpdGggKHgyLHkyKT9cbiAgICAvLyBPciwgaXMgdGhlIHJhZGl1cyB6ZXJvPyBMaW5lIHRvICh4MSx5MSkuXG4gICAgZWxzZSBpZiAoIShNYXRoLmFicyh5MDEgKiB4MjEgLSB5MjEgKiB4MDEpID4gZXBzaWxvbikgfHwgIXIpIHtcbiAgICAgIHRoaXMuXyArPSBcIkxcIiArICh0aGlzLl94MSA9IHgxKSArIFwiLFwiICsgKHRoaXMuX3kxID0geTEpO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgZHJhdyBhbiBhcmMhXG4gICAgZWxzZSB7XG4gICAgICB2YXIgeDIwID0geDIgLSB4MCxcbiAgICAgICAgICB5MjAgPSB5MiAtIHkwLFxuICAgICAgICAgIGwyMV8yID0geDIxICogeDIxICsgeTIxICogeTIxLFxuICAgICAgICAgIGwyMF8yID0geDIwICogeDIwICsgeTIwICogeTIwLFxuICAgICAgICAgIGwyMSA9IE1hdGguc3FydChsMjFfMiksXG4gICAgICAgICAgbDAxID0gTWF0aC5zcXJ0KGwwMV8yKSxcbiAgICAgICAgICBsID0gciAqIE1hdGgudGFuKChwaSAtIE1hdGguYWNvcygobDIxXzIgKyBsMDFfMiAtIGwyMF8yKSAvICgyICogbDIxICogbDAxKSkpIC8gMiksXG4gICAgICAgICAgdDAxID0gbCAvIGwwMSxcbiAgICAgICAgICB0MjEgPSBsIC8gbDIxO1xuXG4gICAgICAvLyBJZiB0aGUgc3RhcnQgdGFuZ2VudCBpcyBub3QgY29pbmNpZGVudCB3aXRoICh4MCx5MCksIGxpbmUgdG8uXG4gICAgICBpZiAoTWF0aC5hYnModDAxIC0gMSkgPiBlcHNpbG9uKSB7XG4gICAgICAgIHRoaXMuXyArPSBcIkxcIiArICh4MSArIHQwMSAqIHgwMSkgKyBcIixcIiArICh5MSArIHQwMSAqIHkwMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuXyArPSBcIkFcIiArIHIgKyBcIixcIiArIHIgKyBcIiwwLDAsXCIgKyAoKyh5MDEgKiB4MjAgPiB4MDEgKiB5MjApKSArIFwiLFwiICsgKHRoaXMuX3gxID0geDEgKyB0MjEgKiB4MjEpICsgXCIsXCIgKyAodGhpcy5feTEgPSB5MSArIHQyMSAqIHkyMSk7XG4gICAgfVxuICB9LFxuICBhcmM6IGZ1bmN0aW9uKHgsIHksIHIsIGEwLCBhMSwgY2N3KSB7XG4gICAgeCA9ICt4LCB5ID0gK3ksIHIgPSArcjtcbiAgICB2YXIgZHggPSByICogTWF0aC5jb3MoYTApLFxuICAgICAgICBkeSA9IHIgKiBNYXRoLnNpbihhMCksXG4gICAgICAgIHgwID0geCArIGR4LFxuICAgICAgICB5MCA9IHkgKyBkeSxcbiAgICAgICAgY3cgPSAxIF4gY2N3LFxuICAgICAgICBkYSA9IGNjdyA/IGEwIC0gYTEgOiBhMSAtIGEwO1xuXG4gICAgLy8gSXMgdGhlIHJhZGl1cyBuZWdhdGl2ZT8gRXJyb3IuXG4gICAgaWYgKHIgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJuZWdhdGl2ZSByYWRpdXM6IFwiICsgcik7XG5cbiAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgwLHkwKS5cbiAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuXyArPSBcIk1cIiArIHgwICsgXCIsXCIgKyB5MDtcbiAgICB9XG5cbiAgICAvLyBPciwgaXMgKHgwLHkwKSBub3QgY29pbmNpZGVudCB3aXRoIHRoZSBwcmV2aW91cyBwb2ludD8gTGluZSB0byAoeDAseTApLlxuICAgIGVsc2UgaWYgKE1hdGguYWJzKHRoaXMuX3gxIC0geDApID4gZXBzaWxvbiB8fCBNYXRoLmFicyh0aGlzLl95MSAtIHkwKSA+IGVwc2lsb24pIHtcbiAgICAgIHRoaXMuXyArPSBcIkxcIiArIHgwICsgXCIsXCIgKyB5MDtcbiAgICB9XG5cbiAgICAvLyBJcyB0aGlzIGFyYyBlbXB0eT8gV2XigJlyZSBkb25lLlxuICAgIGlmICghcikgcmV0dXJuO1xuXG4gICAgLy8gRG9lcyB0aGUgYW5nbGUgZ28gdGhlIHdyb25nIHdheT8gRmxpcCB0aGUgZGlyZWN0aW9uLlxuICAgIGlmIChkYSA8IDApIGRhID0gZGEgJSB0YXUgKyB0YXU7XG5cbiAgICAvLyBJcyB0aGlzIGEgY29tcGxldGUgY2lyY2xlPyBEcmF3IHR3byBhcmNzIHRvIGNvbXBsZXRlIHRoZSBjaXJjbGUuXG4gICAgaWYgKGRhID4gdGF1RXBzaWxvbikge1xuICAgICAgdGhpcy5fICs9IFwiQVwiICsgciArIFwiLFwiICsgciArIFwiLDAsMSxcIiArIGN3ICsgXCIsXCIgKyAoeCAtIGR4KSArIFwiLFwiICsgKHkgLSBkeSkgKyBcIkFcIiArIHIgKyBcIixcIiArIHIgKyBcIiwwLDEsXCIgKyBjdyArIFwiLFwiICsgKHRoaXMuX3gxID0geDApICsgXCIsXCIgKyAodGhpcy5feTEgPSB5MCk7XG4gICAgfVxuXG4gICAgLy8gSXMgdGhpcyBhcmMgbm9uLWVtcHR5PyBEcmF3IGFuIGFyYyFcbiAgICBlbHNlIGlmIChkYSA+IGVwc2lsb24pIHtcbiAgICAgIHRoaXMuXyArPSBcIkFcIiArIHIgKyBcIixcIiArIHIgKyBcIiwwLFwiICsgKCsoZGEgPj0gcGkpKSArIFwiLFwiICsgY3cgKyBcIixcIiArICh0aGlzLl94MSA9IHggKyByICogTWF0aC5jb3MoYTEpKSArIFwiLFwiICsgKHRoaXMuX3kxID0geSArIHIgKiBNYXRoLnNpbihhMSkpO1xuICAgIH1cbiAgfSxcbiAgcmVjdDogZnVuY3Rpb24oeCwgeSwgdywgaCkge1xuICAgIHRoaXMuXyArPSBcIk1cIiArICh0aGlzLl94MCA9IHRoaXMuX3gxID0gK3gpICsgXCIsXCIgKyAodGhpcy5feTAgPSB0aGlzLl95MSA9ICt5KSArIFwiaFwiICsgKCt3KSArIFwidlwiICsgKCtoKSArIFwiaFwiICsgKC13KSArIFwiWlwiO1xuICB9LFxuICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuXztcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgcGF0aDtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4vY3JlYXRvclwiO1xuaW1wb3J0IHNlbGVjdCBmcm9tIFwiLi9zZWxlY3RcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gc2VsZWN0KGNyZWF0b3IobmFtZSkuY2FsbChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKTtcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4vbmFtZXNwYWNlXCI7XG5pbXBvcnQge3hodG1sfSBmcm9tIFwiLi9uYW1lc3BhY2VzXCI7XG5cbmZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCxcbiAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7XG4gICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWxcbiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpXG4gICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiAoZnVsbG5hbWUubG9jYWxcbiAgICAgID8gY3JlYXRvckZpeGVkXG4gICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgY3JlYXRlfSBmcm9tIFwiLi9jcmVhdGVcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjcmVhdG9yfSBmcm9tIFwiLi9jcmVhdG9yXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbG9jYWx9IGZyb20gXCIuL2xvY2FsXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWF0Y2hlcn0gZnJvbSBcIi4vbWF0Y2hlclwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIG1vdXNlfSBmcm9tIFwiLi9tb3VzZVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIG5hbWVzcGFjZX0gZnJvbSBcIi4vbmFtZXNwYWNlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbmFtZXNwYWNlc30gZnJvbSBcIi4vbmFtZXNwYWNlc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGNsaWVudFBvaW50fSBmcm9tIFwiLi9wb2ludFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNlbGVjdH0gZnJvbSBcIi4vc2VsZWN0XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2VsZWN0QWxsfSBmcm9tIFwiLi9zZWxlY3RBbGxcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzZWxlY3Rpb259IGZyb20gXCIuL3NlbGVjdGlvbi9pbmRleFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNlbGVjdG9yfSBmcm9tIFwiLi9zZWxlY3RvclwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNlbGVjdG9yQWxsfSBmcm9tIFwiLi9zZWxlY3RvckFsbFwiO1xuZXhwb3J0IHtzdHlsZVZhbHVlIGFzIHN0eWxlfSBmcm9tIFwiLi9zZWxlY3Rpb24vc3R5bGVcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0b3VjaH0gZnJvbSBcIi4vdG91Y2hcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0b3VjaGVzfSBmcm9tIFwiLi90b3VjaGVzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgd2luZG93fSBmcm9tIFwiLi93aW5kb3dcIjtcbmV4cG9ydCB7ZXZlbnQsIGN1c3RvbUV2ZW50fSBmcm9tIFwiLi9zZWxlY3Rpb24vb25cIjtcbiIsInZhciBuZXh0SWQgPSAwO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2NhbCgpIHtcbiAgcmV0dXJuIG5ldyBMb2NhbDtcbn1cblxuZnVuY3Rpb24gTG9jYWwoKSB7XG4gIHRoaXMuXyA9IFwiQFwiICsgKCsrbmV4dElkKS50b1N0cmluZygzNik7XG59XG5cbkxvY2FsLnByb3RvdHlwZSA9IGxvY2FsLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IExvY2FsLFxuICBnZXQ6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB2YXIgaWQgPSB0aGlzLl87XG4gICAgd2hpbGUgKCEoaWQgaW4gbm9kZSkpIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm47XG4gICAgcmV0dXJuIG5vZGVbaWRdO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKG5vZGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIG5vZGVbdGhpcy5fXSA9IHZhbHVlO1xuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5fIGluIG5vZGUgJiYgZGVsZXRlIG5vZGVbdGhpcy5fXTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl87XG4gIH1cbn07XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG4iLCJpbXBvcnQgc291cmNlRXZlbnQgZnJvbSBcIi4vc291cmNlRXZlbnRcIjtcbmltcG9ydCBwb2ludCBmcm9tIFwiLi9wb2ludFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIHZhciBldmVudCA9IHNvdXJjZUV2ZW50KCk7XG4gIGlmIChldmVudC5jaGFuZ2VkVG91Y2hlcykgZXZlbnQgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTtcbiAgcmV0dXJuIHBvaW50KG5vZGUsIGV2ZW50KTtcbn1cbiIsImltcG9ydCBuYW1lc3BhY2VzIGZyb20gXCIuL25hbWVzcGFjZXNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgcHJlZml4ID0gbmFtZSArPSBcIlwiLCBpID0gcHJlZml4LmluZGV4T2YoXCI6XCIpO1xuICBpZiAoaSA+PSAwICYmIChwcmVmaXggPSBuYW1lLnNsaWNlKDAsIGkpKSAhPT0gXCJ4bWxuc1wiKSBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7XG4gIHJldHVybiBuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7c3BhY2U6IG5hbWVzcGFjZXNbcHJlZml4XSwgbG9jYWw6IG5hbWV9IDogbmFtZTtcbn1cbiIsImV4cG9ydCB2YXIgeGh0bWwgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBzdmc6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgeGh0bWw6IHhodG1sLFxuICB4bGluazogXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsXG4gIHhtbDogXCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2VcIixcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy9cIlxufTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIGV2ZW50KSB7XG4gIHZhciBzdmcgPSBub2RlLm93bmVyU1ZHRWxlbWVudCB8fCBub2RlO1xuXG4gIGlmIChzdmcuY3JlYXRlU1ZHUG9pbnQpIHtcbiAgICB2YXIgcG9pbnQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTtcbiAgICBwb2ludC54ID0gZXZlbnQuY2xpZW50WCwgcG9pbnQueSA9IGV2ZW50LmNsaWVudFk7XG4gICAgcG9pbnQgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obm9kZS5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpO1xuICAgIHJldHVybiBbcG9pbnQueCwgcG9pbnQueV07XG4gIH1cblxuICB2YXIgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiBbZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIG5vZGUuY2xpZW50TGVmdCwgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gbm9kZS5jbGllbnRUb3BdO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb24sIHJvb3R9IGZyb20gXCIuL3NlbGVjdGlvbi9pbmRleFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiXG4gICAgICA/IG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKV1dLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSlcbiAgICAgIDogbmV3IFNlbGVjdGlvbihbW3NlbGVjdG9yXV0sIHJvb3QpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb24sIHJvb3R9IGZyb20gXCIuL3NlbGVjdGlvbi9pbmRleFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiXG4gICAgICA/IG5ldyBTZWxlY3Rpb24oW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pXG4gICAgICA6IG5ldyBTZWxlY3Rpb24oW3NlbGVjdG9yID09IG51bGwgPyBbXSA6IHNlbGVjdG9yXSwgcm9vdCk7XG59XG4iLCJpbXBvcnQgY3JlYXRvciBmcm9tIFwiLi4vY3JlYXRvclwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IG5hbWVzcGFjZSBmcm9tIFwiLi4vbmFtZXNwYWNlXCI7XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHYpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdik7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpO1xuICAgIHJldHVybiBmdWxsbmFtZS5sb2NhbFxuICAgICAgICA/IG5vZGUuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKVxuICAgICAgICA6IG5vZGUuZ2V0QXR0cmlidXRlKGZ1bGxuYW1lKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pXG4gICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KSkpKGZ1bGxuYW1lLCB2YWx1ZSkpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1swXTtcbiAgYXJndW1lbnRzWzBdID0gdGhpcztcbiAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxcXHMrLyk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKSB7XG4gIHJldHVybiBub2RlLmNsYXNzTGlzdCB8fCBuZXcgQ2xhc3NMaXN0KG5vZGUpO1xufVxuXG5mdW5jdGlvbiBDbGFzc0xpc3Qobm9kZSkge1xuICB0aGlzLl9ub2RlID0gbm9kZTtcbiAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIik7XG59XG5cbkNsYXNzTGlzdC5wcm90b3R5cGUgPSB7XG4gIGFkZDogZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnB1c2gobmFtZSk7XG4gICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG4gIH0sXG4gIHJlbW92ZTogZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5zcGxpY2UoaSwgMSk7XG4gICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG4gIH0sXG4gIGNvbnRhaW5zOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSkgPj0gMDtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2xhc3NlZEFkZChub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5hZGQobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkUmVtb3ZlKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRUcnVlKG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBjbGFzc2VkQWRkKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZEZhbHNlKG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBjbGFzc2VkUmVtb3ZlKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKG5hbWVzLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgKHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgPyBjbGFzc2VkQWRkIDogY2xhc3NlZFJlbW92ZSkodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgbmFtZXMgPSBjbGFzc0FycmF5KG5hbWUgKyBcIlwiKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWVcbiAgICAgID8gY2xhc3NlZFRydWVcbiAgICAgIDogY2xhc3NlZEZhbHNlKShuYW1lcywgdmFsdWUpKTtcbn1cbiIsImZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZVNoYWxsb3coKSB7XG4gIHJldHVybiB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgdGhpcy5uZXh0U2libGluZyk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZURlZXAoKSB7XG4gIHJldHVybiB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuY2xvbmVOb2RlKHRydWUpLCB0aGlzLm5leHRTaWJsaW5nKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVlcCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZGVlcCA/IHNlbGVjdGlvbl9jbG9uZURlZXAgOiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHtFbnRlck5vZGV9IGZyb20gXCIuL2VudGVyXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4uL2NvbnN0YW50XCI7XG5cbnZhciBrZXlQcmVmaXggPSBcIiRcIjsgLy8gUHJvdGVjdCBhZ2FpbnN0IGtleXMgbGlrZSDigJxfX3Byb3RvX1/igJ0uXG5cbmZ1bmN0aW9uIGJpbmRJbmRleChwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhKSB7XG4gIHZhciBpID0gMCxcbiAgICAgIG5vZGUsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLlxuICAvLyBQdXQgYW55IG51bGwgbm9kZXMgaW50byBlbnRlci5cbiAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLlxuICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGRvbuKAmXQgZml0IGludG8gZXhpdC5cbiAgZm9yICg7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7XG4gIHZhciBpLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVCeUtleVZhbHVlID0ge30sXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksXG4gICAgICBrZXlWYWx1ZTtcblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS5cbiAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5UHJlZml4ICsga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApO1xuICAgICAgaWYgKGtleVZhbHVlIGluIG5vZGVCeUtleVZhbHVlKSB7XG4gICAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uXG4gIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuXG4gIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci5cbiAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGtleVZhbHVlID0ga2V5UHJlZml4ICsga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKTtcbiAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSkge1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGFueSByZW1haW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZXNbaV1dID09PSBub2RlKSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIGRhdGEgPSBuZXcgQXJyYXkodGhpcy5zaXplKCkpLCBqID0gLTE7XG4gICAgdGhpcy5lYWNoKGZ1bmN0aW9uKGQpIHsgZGF0YVsrK2pdID0gZDsgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsXG4gICAgICBwYXJlbnRzID0gdGhpcy5fcGFyZW50cyxcbiAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwcztcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHZhbHVlID0gY29uc3RhbnQodmFsdWUpO1xuXG4gIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJyYXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLFxuICAgICAgICBncm91cCA9IGdyb3Vwc1tqXSxcbiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICAgIGRhdGEgPSB2YWx1ZS5jYWxsKHBhcmVudCwgcGFyZW50ICYmIHBhcmVudC5fX2RhdGFfXywgaiwgcGFyZW50cyksXG4gICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICB1cGRhdGVHcm91cCA9IHVwZGF0ZVtqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7XG5cbiAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7XG5cbiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXRcbiAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLFxuICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLlxuICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7XG4gICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkge1xuICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxO1xuICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7XG4gICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTtcbiAgdXBkYXRlLl9lbnRlciA9IGVudGVyO1xuICB1cGRhdGUuX2V4aXQgPSBleGl0O1xuICByZXR1cm4gdXBkYXRlO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5wcm9wZXJ0eShcIl9fZGF0YV9fXCIsIHZhbHVlKVxuICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXztcbn1cbiIsImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93XCI7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7XG4gIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSxcbiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50O1xuXG4gIGlmICh0eXBlb2YgZXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGV2ZW50ID0gbmV3IGV2ZW50KHR5cGUsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZGlzcGF0Y2hGdW5jdGlvblxuICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiAhdGhpcy5ub2RlKCk7XG59XG4iLCJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZVwiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRW50ZXJOb2RlKHBhcmVudCwgZGF0dW0pIHtcbiAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7XG4gIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTtcbiAgdGhpcy5fbmV4dCA9IG51bGw7XG4gIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtO1xufVxuXG5FbnRlck5vZGUucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRW50ZXJOb2RlLFxuICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oY2hpbGQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHRoaXMuX25leHQpOyB9LFxuICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSxcbiAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfSxcbiAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfVxufTtcbiIsImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IG1hdGNoZXIgZnJvbSBcIi4uL21hdGNoZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJmdW5jdGlvbiBodG1sUmVtb3ZlKCkge1xuICB0aGlzLmlubmVySFRNTCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGh0bWxGdW5jdGlvblxuICAgICAgICAgIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDtcbn1cbiIsImltcG9ydCBzZWxlY3Rpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdFwiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXJcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0YSBmcm9tIFwiLi9kYXRhXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VudGVyIGZyb20gXCIuL2VudGVyXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2V4aXQgZnJvbSBcIi4vZXhpdFwiO1xuaW1wb3J0IHNlbGVjdGlvbl9qb2luIGZyb20gXCIuL2pvaW5cIjtcbmltcG9ydCBzZWxlY3Rpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2VcIjtcbmltcG9ydCBzZWxlY3Rpb25fb3JkZXIgZnJvbSBcIi4vb3JkZXJcIjtcbmltcG9ydCBzZWxlY3Rpb25fc29ydCBmcm9tIFwiLi9zb3J0XCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NhbGwgZnJvbSBcIi4vY2FsbFwiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlcyBmcm9tIFwiLi9ub2Rlc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlIGZyb20gXCIuL25vZGVcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2l6ZSBmcm9tIFwiLi9zaXplXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VtcHR5IGZyb20gXCIuL2VtcHR5XCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VhY2ggZnJvbSBcIi4vZWFjaFwiO1xuaW1wb3J0IHNlbGVjdGlvbl9hdHRyIGZyb20gXCIuL2F0dHJcIjtcbmltcG9ydCBzZWxlY3Rpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGVcIjtcbmltcG9ydCBzZWxlY3Rpb25fcHJvcGVydHkgZnJvbSBcIi4vcHJvcGVydHlcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xhc3NlZCBmcm9tIFwiLi9jbGFzc2VkXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RleHQgZnJvbSBcIi4vdGV4dFwiO1xuaW1wb3J0IHNlbGVjdGlvbl9odG1sIGZyb20gXCIuL2h0bWxcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmFpc2UgZnJvbSBcIi4vcmFpc2VcIjtcbmltcG9ydCBzZWxlY3Rpb25fbG93ZXIgZnJvbSBcIi4vbG93ZXJcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXBwZW5kIGZyb20gXCIuL2FwcGVuZFwiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnNlcnQgZnJvbSBcIi4vaW5zZXJ0XCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmVcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xvbmUgZnJvbSBcIi4vY2xvbmVcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0dW0gZnJvbSBcIi4vZGF0dW1cIjtcbmltcG9ydCBzZWxlY3Rpb25fb24gZnJvbSBcIi4vb25cIjtcbmltcG9ydCBzZWxlY3Rpb25fZGlzcGF0Y2ggZnJvbSBcIi4vZGlzcGF0Y2hcIjtcblxuZXhwb3J0IHZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0aW9uKGdyb3VwcywgcGFyZW50cykge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QpO1xufVxuXG5TZWxlY3Rpb24ucHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFNlbGVjdGlvbixcbiAgc2VsZWN0OiBzZWxlY3Rpb25fc2VsZWN0LFxuICBzZWxlY3RBbGw6IHNlbGVjdGlvbl9zZWxlY3RBbGwsXG4gIGZpbHRlcjogc2VsZWN0aW9uX2ZpbHRlcixcbiAgZGF0YTogc2VsZWN0aW9uX2RhdGEsXG4gIGVudGVyOiBzZWxlY3Rpb25fZW50ZXIsXG4gIGV4aXQ6IHNlbGVjdGlvbl9leGl0LFxuICBqb2luOiBzZWxlY3Rpb25fam9pbixcbiAgbWVyZ2U6IHNlbGVjdGlvbl9tZXJnZSxcbiAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlcixcbiAgc29ydDogc2VsZWN0aW9uX3NvcnQsXG4gIGNhbGw6IHNlbGVjdGlvbl9jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX25vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fbm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3NpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9lYWNoLFxuICBhdHRyOiBzZWxlY3Rpb25fYXR0cixcbiAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSxcbiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSxcbiAgY2xhc3NlZDogc2VsZWN0aW9uX2NsYXNzZWQsXG4gIHRleHQ6IHNlbGVjdGlvbl90ZXh0LFxuICBodG1sOiBzZWxlY3Rpb25faHRtbCxcbiAgcmFpc2U6IHNlbGVjdGlvbl9yYWlzZSxcbiAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlcixcbiAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLFxuICBpbnNlcnQ6IHNlbGVjdGlvbl9pbnNlcnQsXG4gIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSxcbiAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSxcbiAgZGF0dW06IHNlbGVjdGlvbl9kYXR1bSxcbiAgb246IHNlbGVjdGlvbl9vbixcbiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaFxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2VsZWN0aW9uO1xuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3JcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3JcIjtcblxuZnVuY3Rpb24gY29uc3RhbnROdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSksXG4gICAgICBzZWxlY3QgPSBiZWZvcmUgPT0gbnVsbCA/IGNvbnN0YW50TnVsbCA6IHR5cGVvZiBiZWZvcmUgPT09IFwiZnVuY3Rpb25cIiA/IGJlZm9yZSA6IHNlbGVjdG9yKGJlZm9yZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpO1xuICB9KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9uZW50ZXIsIG9udXBkYXRlLCBvbmV4aXQpIHtcbiAgdmFyIGVudGVyID0gdGhpcy5lbnRlcigpLCB1cGRhdGUgPSB0aGlzLCBleGl0ID0gdGhpcy5leGl0KCk7XG4gIGVudGVyID0gdHlwZW9mIG9uZW50ZXIgPT09IFwiZnVuY3Rpb25cIiA/IG9uZW50ZXIoZW50ZXIpIDogZW50ZXIuYXBwZW5kKG9uZW50ZXIgKyBcIlwiKTtcbiAgaWYgKG9udXBkYXRlICE9IG51bGwpIHVwZGF0ZSA9IG9udXBkYXRlKHVwZGF0ZSk7XG4gIGlmIChvbmV4aXQgPT0gbnVsbCkgZXhpdC5yZW1vdmUoKTsgZWxzZSBvbmV4aXQoZXhpdCk7XG4gIHJldHVybiBlbnRlciAmJiB1cGRhdGUgPyBlbnRlci5tZXJnZSh1cGRhdGUpLm9yZGVyKCkgOiB1cGRhdGU7XG59XG4iLCJmdW5jdGlvbiBsb3dlcigpIHtcbiAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gobG93ZXIpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdGlvbikge1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSBzZWxlY3Rpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldO1xuICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBub2RlcyA9IG5ldyBBcnJheSh0aGlzLnNpemUoKSksIGkgPSAtMTtcbiAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeyBub2Rlc1srK2ldID0gdGhpczsgfSk7XG4gIHJldHVybiBub2Rlcztcbn1cbiIsInZhciBmaWx0ZXJFdmVudHMgPSB7fTtcblxuZXhwb3J0IHZhciBldmVudCA9IG51bGw7XG5cbmlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIGlmICghKFwib25tb3VzZWVudGVyXCIgaW4gZWxlbWVudCkpIHtcbiAgICBmaWx0ZXJFdmVudHMgPSB7bW91c2VlbnRlcjogXCJtb3VzZW92ZXJcIiwgbW91c2VsZWF2ZTogXCJtb3VzZW91dFwifTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaWx0ZXJDb250ZXh0TGlzdGVuZXIobGlzdGVuZXIsIGluZGV4LCBncm91cCkge1xuICBsaXN0ZW5lciA9IGNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICAgIGlmICghcmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGhpcyAmJiAhKHJlbGF0ZWQuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcykgJiA4KSkpIHtcbiAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50MSkge1xuICAgIHZhciBldmVudDAgPSBldmVudDsgLy8gRXZlbnRzIGNhbiBiZSByZWVudHJhbnQgKGUuZy4sIGZvY3VzKS5cbiAgICBldmVudCA9IGV2ZW50MTtcbiAgICB0cnkge1xuICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCB0aGlzLl9fZGF0YV9fLCBpbmRleCwgZ3JvdXApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBldmVudCA9IGV2ZW50MDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uUmVtb3ZlKHR5cGVuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb247XG4gICAgaWYgKCFvbikgcmV0dXJuO1xuICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGlmIChvID0gb25bal0sICghdHlwZW5hbWUudHlwZSB8fCBvLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUpICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLmNhcHR1cmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25bKytpXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgrK2kpIG9uLmxlbmd0aCA9IGk7XG4gICAgZWxzZSBkZWxldGUgdGhpcy5fX29uO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUsIGNhcHR1cmUpIHtcbiAgdmFyIHdyYXAgPSBmaWx0ZXJFdmVudHMuaGFzT3duUHJvcGVydHkodHlwZW5hbWUudHlwZSkgPyBmaWx0ZXJDb250ZXh0TGlzdGVuZXIgOiBjb250ZXh0TGlzdGVuZXI7XG4gIHJldHVybiBmdW5jdGlvbihkLCBpLCBncm91cCkge1xuICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSB3cmFwKHZhbHVlLCBpLCBncm91cCk7XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgICAgaWYgKChvID0gb25bal0pLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8uY2FwdHVyZSk7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIgPSBsaXN0ZW5lciwgby5jYXB0dXJlID0gY2FwdHVyZSk7XG4gICAgICAgIG8udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodHlwZW5hbWUudHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpO1xuICAgIG8gPSB7dHlwZTogdHlwZW5hbWUudHlwZSwgbmFtZTogdHlwZW5hbWUubmFtZSwgdmFsdWU6IHZhbHVlLCBsaXN0ZW5lcjogbGlzdGVuZXIsIGNhcHR1cmU6IGNhcHR1cmV9O1xuICAgIGlmICghb24pIHRoaXMuX19vbiA9IFtvXTtcbiAgICBlbHNlIG9uLnB1c2gobyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGVuYW1lLCB2YWx1ZSwgY2FwdHVyZSkge1xuICB2YXIgdHlwZW5hbWVzID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyBcIlwiKSwgaSwgbiA9IHR5cGVuYW1lcy5sZW5ndGgsIHQ7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG9uID0gdGhpcy5ub2RlKCkuX19vbjtcbiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBmb3IgKGkgPSAwLCBvID0gb25bal07IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKCh0ID0gdHlwZW5hbWVzW2ldKS50eXBlID09PSBvLnR5cGUgJiYgdC5uYW1lID09PSBvLm5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gby52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBvbiA9IHZhbHVlID8gb25BZGQgOiBvblJlbW92ZTtcbiAgaWYgKGNhcHR1cmUgPT0gbnVsbCkgY2FwdHVyZSA9IGZhbHNlO1xuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgY2FwdHVyZSkpO1xuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1c3RvbUV2ZW50KGV2ZW50MSwgbGlzdGVuZXIsIHRoYXQsIGFyZ3MpIHtcbiAgdmFyIGV2ZW50MCA9IGV2ZW50O1xuICBldmVudDEuc291cmNlRXZlbnQgPSBldmVudDtcbiAgZXZlbnQgPSBldmVudDE7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9IGZpbmFsbHkge1xuICAgIGV2ZW50ID0gZXZlbnQwO1xuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAtMSwgbSA9IGdyb3Vwcy5sZW5ndGg7ICsraiA8IG07KSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSBncm91cC5sZW5ndGggLSAxLCBuZXh0ID0gZ3JvdXBbaV0sIG5vZGU7IC0taSA+PSAwOykge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBpZiAobmV4dCAmJiBub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5leHQpIF4gNCkgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTtcbiAgICAgICAgbmV4dCA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJmdW5jdGlvbiBwcm9wZXJ0eVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBkZWxldGUgdGhpc1tuYW1lXTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpc1tuYW1lXSA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgZGVsZXRlIHRoaXNbbmFtZV07XG4gICAgZWxzZSB0aGlzW25hbWVdID0gdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gcHJvcGVydHlSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gcHJvcGVydHlGdW5jdGlvblxuICAgICAgICAgIDogcHJvcGVydHlDb25zdGFudCkobmFtZSwgdmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKVtuYW1lXTtcbn1cbiIsImZ1bmN0aW9uIHJhaXNlKCkge1xuICBpZiAodGhpcy5uZXh0U2libGluZykgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSk7XG59XG4iLCJmdW5jdGlvbiByZW1vdmUoKSB7XG4gIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmVtb3ZlKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHNlbGVjdG9yIGZyb20gXCIuLi9zZWxlY3RvclwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHNlbGVjdG9yQWxsIGZyb20gXCIuLi9zZWxlY3RvckFsbFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzdWJncm91cHMucHVzaChzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCBwYXJlbnRzKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgc2l6ZSA9IDA7XG4gIHRoaXMuZWFjaChmdW5jdGlvbigpIHsgKytzaXplOyB9KTtcbiAgcmV0dXJuIHNpemU7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcGFyZSkge1xuICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7XG5cbiAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikge1xuICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHVwZGF0ZSkge1xuICByZXR1cm4gbmV3IEFycmF5KHVwZGF0ZS5sZW5ndGgpO1xufVxuIiwiaW1wb3J0IGRlZmF1bHRWaWV3IGZyb20gXCIuLi93aW5kb3dcIjtcblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2LCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICA/IHN0eWxlUmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvblxuICAgICAgICAgICAgOiBzdHlsZUNvbnN0YW50KShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/IFwiXCIgOiBwcmlvcml0eSkpXG4gICAgICA6IHN0eWxlVmFsdWUodGhpcy5ub2RlKCksIG5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3R5bGVWYWx1ZShub2RlLCBuYW1lKSB7XG4gIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSlcbiAgICAgIHx8IGRlZmF1bHRWaWV3KG5vZGUpLmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbn1cbiIsImZ1bmN0aW9uIHRleHRSZW1vdmUoKSB7XG4gIHRoaXMudGV4dENvbnRlbnQgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/IFwiXCIgOiB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gdGV4dFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdGV4dEZ1bmN0aW9uXG4gICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7XG59XG4iLCJmdW5jdGlvbiBub25lKCkge31cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lIDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH07XG59XG4iLCJmdW5jdGlvbiBlbXB0eSgpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IGVtcHR5IDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIH07XG59XG4iLCJpbXBvcnQge2V2ZW50fSBmcm9tIFwiLi9zZWxlY3Rpb24vb25cIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBjdXJyZW50ID0gZXZlbnQsIHNvdXJjZTtcbiAgd2hpbGUgKHNvdXJjZSA9IGN1cnJlbnQuc291cmNlRXZlbnQpIGN1cnJlbnQgPSBzb3VyY2U7XG4gIHJldHVybiBjdXJyZW50O1xufVxuIiwiaW1wb3J0IHNvdXJjZUV2ZW50IGZyb20gXCIuL3NvdXJjZUV2ZW50XCI7XG5pbXBvcnQgcG9pbnQgZnJvbSBcIi4vcG9pbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgdG91Y2hlcywgaWRlbnRpZmllcikge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGlkZW50aWZpZXIgPSB0b3VjaGVzLCB0b3VjaGVzID0gc291cmNlRXZlbnQoKS5jaGFuZ2VkVG91Y2hlcztcblxuICBmb3IgKHZhciBpID0gMCwgbiA9IHRvdWNoZXMgPyB0b3VjaGVzLmxlbmd0aCA6IDAsIHRvdWNoOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKCh0b3VjaCA9IHRvdWNoZXNbaV0pLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJldHVybiBwb2ludChub2RlLCB0b3VjaCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCJpbXBvcnQgc291cmNlRXZlbnQgZnJvbSBcIi4vc291cmNlRXZlbnRcIjtcbmltcG9ydCBwb2ludCBmcm9tIFwiLi9wb2ludFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCB0b3VjaGVzKSB7XG4gIGlmICh0b3VjaGVzID09IG51bGwpIHRvdWNoZXMgPSBzb3VyY2VFdmVudCgpLnRvdWNoZXM7XG5cbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0b3VjaGVzID8gdG91Y2hlcy5sZW5ndGggOiAwLCBwb2ludHMgPSBuZXcgQXJyYXkobik7IGkgPCBuOyArK2kpIHtcbiAgICBwb2ludHNbaV0gPSBwb2ludChub2RlLCB0b3VjaGVzW2ldKTtcbiAgfVxuXG4gIHJldHVybiBwb2ludHM7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIHJldHVybiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgLy8gbm9kZSBpcyBhIE5vZGVcbiAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8vIG5vZGUgaXMgYSBXaW5kb3dcbiAgICAgIHx8IG5vZGUuZGVmYXVsdFZpZXc7IC8vIG5vZGUgaXMgYSBEb2N1bWVudFxufVxuIiwiaW1wb3J0IHtwYXRofSBmcm9tIFwiZDMtcGF0aFwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQge2FicywgYWNvcywgYXNpbiwgYXRhbjIsIGNvcywgZXBzaWxvbiwgaGFsZlBpLCBtYXgsIG1pbiwgcGksIHNpbiwgc3FydCwgdGF1fSBmcm9tIFwiLi9tYXRoXCI7XG5cbmZ1bmN0aW9uIGFyY0lubmVyUmFkaXVzKGQpIHtcbiAgcmV0dXJuIGQuaW5uZXJSYWRpdXM7XG59XG5cbmZ1bmN0aW9uIGFyY091dGVyUmFkaXVzKGQpIHtcbiAgcmV0dXJuIGQub3V0ZXJSYWRpdXM7XG59XG5cbmZ1bmN0aW9uIGFyY1N0YXJ0QW5nbGUoZCkge1xuICByZXR1cm4gZC5zdGFydEFuZ2xlO1xufVxuXG5mdW5jdGlvbiBhcmNFbmRBbmdsZShkKSB7XG4gIHJldHVybiBkLmVuZEFuZ2xlO1xufVxuXG5mdW5jdGlvbiBhcmNQYWRBbmdsZShkKSB7XG4gIHJldHVybiBkICYmIGQucGFkQW5nbGU7IC8vIE5vdGU6IG9wdGlvbmFsIVxufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3QoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG4gIHZhciB4MTAgPSB4MSAtIHgwLCB5MTAgPSB5MSAtIHkwLFxuICAgICAgeDMyID0geDMgLSB4MiwgeTMyID0geTMgLSB5MixcbiAgICAgIHQgPSB5MzIgKiB4MTAgLSB4MzIgKiB5MTA7XG4gIGlmICh0ICogdCA8IGVwc2lsb24pIHJldHVybjtcbiAgdCA9ICh4MzIgKiAoeTAgLSB5MikgLSB5MzIgKiAoeDAgLSB4MikpIC8gdDtcbiAgcmV0dXJuIFt4MCArIHQgKiB4MTAsIHkwICsgdCAqIHkxMF07XG59XG5cbi8vIENvbXB1dGUgcGVycGVuZGljdWxhciBvZmZzZXQgbGluZSBvZiBsZW5ndGggcmMuXG4vLyBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL0NpcmNsZS1MaW5lSW50ZXJzZWN0aW9uLmh0bWxcbmZ1bmN0aW9uIGNvcm5lclRhbmdlbnRzKHgwLCB5MCwgeDEsIHkxLCByMSwgcmMsIGN3KSB7XG4gIHZhciB4MDEgPSB4MCAtIHgxLFxuICAgICAgeTAxID0geTAgLSB5MSxcbiAgICAgIGxvID0gKGN3ID8gcmMgOiAtcmMpIC8gc3FydCh4MDEgKiB4MDEgKyB5MDEgKiB5MDEpLFxuICAgICAgb3ggPSBsbyAqIHkwMSxcbiAgICAgIG95ID0gLWxvICogeDAxLFxuICAgICAgeDExID0geDAgKyBveCxcbiAgICAgIHkxMSA9IHkwICsgb3ksXG4gICAgICB4MTAgPSB4MSArIG94LFxuICAgICAgeTEwID0geTEgKyBveSxcbiAgICAgIHgwMCA9ICh4MTEgKyB4MTApIC8gMixcbiAgICAgIHkwMCA9ICh5MTEgKyB5MTApIC8gMixcbiAgICAgIGR4ID0geDEwIC0geDExLFxuICAgICAgZHkgPSB5MTAgLSB5MTEsXG4gICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5LFxuICAgICAgciA9IHIxIC0gcmMsXG4gICAgICBEID0geDExICogeTEwIC0geDEwICogeTExLFxuICAgICAgZCA9IChkeSA8IDAgPyAtMSA6IDEpICogc3FydChtYXgoMCwgciAqIHIgKiBkMiAtIEQgKiBEKSksXG4gICAgICBjeDAgPSAoRCAqIGR5IC0gZHggKiBkKSAvIGQyLFxuICAgICAgY3kwID0gKC1EICogZHggLSBkeSAqIGQpIC8gZDIsXG4gICAgICBjeDEgPSAoRCAqIGR5ICsgZHggKiBkKSAvIGQyLFxuICAgICAgY3kxID0gKC1EICogZHggKyBkeSAqIGQpIC8gZDIsXG4gICAgICBkeDAgPSBjeDAgLSB4MDAsXG4gICAgICBkeTAgPSBjeTAgLSB5MDAsXG4gICAgICBkeDEgPSBjeDEgLSB4MDAsXG4gICAgICBkeTEgPSBjeTEgLSB5MDA7XG5cbiAgLy8gUGljayB0aGUgY2xvc2VyIG9mIHRoZSB0d28gaW50ZXJzZWN0aW9uIHBvaW50cy5cbiAgLy8gVE9ETyBJcyB0aGVyZSBhIGZhc3RlciB3YXkgdG8gZGV0ZXJtaW5lIHdoaWNoIGludGVyc2VjdGlvbiB0byB1c2U/XG4gIGlmIChkeDAgKiBkeDAgKyBkeTAgKiBkeTAgPiBkeDEgKiBkeDEgKyBkeTEgKiBkeTEpIGN4MCA9IGN4MSwgY3kwID0gY3kxO1xuXG4gIHJldHVybiB7XG4gICAgY3g6IGN4MCxcbiAgICBjeTogY3kwLFxuICAgIHgwMTogLW94LFxuICAgIHkwMTogLW95LFxuICAgIHgxMTogY3gwICogKHIxIC8gciAtIDEpLFxuICAgIHkxMTogY3kwICogKHIxIC8gciAtIDEpXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgaW5uZXJSYWRpdXMgPSBhcmNJbm5lclJhZGl1cyxcbiAgICAgIG91dGVyUmFkaXVzID0gYXJjT3V0ZXJSYWRpdXMsXG4gICAgICBjb3JuZXJSYWRpdXMgPSBjb25zdGFudCgwKSxcbiAgICAgIHBhZFJhZGl1cyA9IG51bGwsXG4gICAgICBzdGFydEFuZ2xlID0gYXJjU3RhcnRBbmdsZSxcbiAgICAgIGVuZEFuZ2xlID0gYXJjRW5kQW5nbGUsXG4gICAgICBwYWRBbmdsZSA9IGFyY1BhZEFuZ2xlLFxuICAgICAgY29udGV4dCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gYXJjKCkge1xuICAgIHZhciBidWZmZXIsXG4gICAgICAgIHIsXG4gICAgICAgIHIwID0gK2lubmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIHIxID0gK291dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIGEwID0gc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC0gaGFsZlBpLFxuICAgICAgICBhMSA9IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmUGksXG4gICAgICAgIGRhID0gYWJzKGExIC0gYTApLFxuICAgICAgICBjdyA9IGExID4gYTA7XG5cbiAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBwYXRoKCk7XG5cbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgb3V0ZXIgcmFkaXVzIGlzIGFsd2F5cyBsYXJnZXIgdGhhbiB0aGUgaW5uZXIgcmFkaXVzLlxuICAgIGlmIChyMSA8IHIwKSByID0gcjEsIHIxID0gcjAsIHIwID0gcjtcblxuICAgIC8vIElzIGl0IGEgcG9pbnQ/XG4gICAgaWYgKCEocjEgPiBlcHNpbG9uKSkgY29udGV4dC5tb3ZlVG8oMCwgMCk7XG5cbiAgICAvLyBPciBpcyBpdCBhIGNpcmNsZSBvciBhbm51bHVzP1xuICAgIGVsc2UgaWYgKGRhID4gdGF1IC0gZXBzaWxvbikge1xuICAgICAgY29udGV4dC5tb3ZlVG8ocjEgKiBjb3MoYTApLCByMSAqIHNpbihhMCkpO1xuICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjEsIGEwLCBhMSwgIWN3KTtcbiAgICAgIGlmIChyMCA+IGVwc2lsb24pIHtcbiAgICAgICAgY29udGV4dC5tb3ZlVG8ocjAgKiBjb3MoYTEpLCByMCAqIHNpbihhMSkpO1xuICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMCwgYTEsIGEwLCBjdyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3IgaXMgaXQgYSBjaXJjdWxhciBvciBhbm51bGFyIHNlY3Rvcj9cbiAgICBlbHNlIHtcbiAgICAgIHZhciBhMDEgPSBhMCxcbiAgICAgICAgICBhMTEgPSBhMSxcbiAgICAgICAgICBhMDAgPSBhMCxcbiAgICAgICAgICBhMTAgPSBhMSxcbiAgICAgICAgICBkYTAgPSBkYSxcbiAgICAgICAgICBkYTEgPSBkYSxcbiAgICAgICAgICBhcCA9IHBhZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLyAyLFxuICAgICAgICAgIHJwID0gKGFwID4gZXBzaWxvbikgJiYgKHBhZFJhZGl1cyA/ICtwYWRSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNxcnQocjAgKiByMCArIHIxICogcjEpKSxcbiAgICAgICAgICByYyA9IG1pbihhYnMocjEgLSByMCkgLyAyLCArY29ybmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpLFxuICAgICAgICAgIHJjMCA9IHJjLFxuICAgICAgICAgIHJjMSA9IHJjLFxuICAgICAgICAgIHQwLFxuICAgICAgICAgIHQxO1xuXG4gICAgICAvLyBBcHBseSBwYWRkaW5nPyBOb3RlIHRoYXQgc2luY2UgcjEg4omlIHIwLCBkYTEg4omlIGRhMC5cbiAgICAgIGlmIChycCA+IGVwc2lsb24pIHtcbiAgICAgICAgdmFyIHAwID0gYXNpbihycCAvIHIwICogc2luKGFwKSksXG4gICAgICAgICAgICBwMSA9IGFzaW4ocnAgLyByMSAqIHNpbihhcCkpO1xuICAgICAgICBpZiAoKGRhMCAtPSBwMCAqIDIpID4gZXBzaWxvbikgcDAgKj0gKGN3ID8gMSA6IC0xKSwgYTAwICs9IHAwLCBhMTAgLT0gcDA7XG4gICAgICAgIGVsc2UgZGEwID0gMCwgYTAwID0gYTEwID0gKGEwICsgYTEpIC8gMjtcbiAgICAgICAgaWYgKChkYTEgLT0gcDEgKiAyKSA+IGVwc2lsb24pIHAxICo9IChjdyA/IDEgOiAtMSksIGEwMSArPSBwMSwgYTExIC09IHAxO1xuICAgICAgICBlbHNlIGRhMSA9IDAsIGEwMSA9IGExMSA9IChhMCArIGExKSAvIDI7XG4gICAgICB9XG5cbiAgICAgIHZhciB4MDEgPSByMSAqIGNvcyhhMDEpLFxuICAgICAgICAgIHkwMSA9IHIxICogc2luKGEwMSksXG4gICAgICAgICAgeDEwID0gcjAgKiBjb3MoYTEwKSxcbiAgICAgICAgICB5MTAgPSByMCAqIHNpbihhMTApO1xuXG4gICAgICAvLyBBcHBseSByb3VuZGVkIGNvcm5lcnM/XG4gICAgICBpZiAocmMgPiBlcHNpbG9uKSB7XG4gICAgICAgIHZhciB4MTEgPSByMSAqIGNvcyhhMTEpLFxuICAgICAgICAgICAgeTExID0gcjEgKiBzaW4oYTExKSxcbiAgICAgICAgICAgIHgwMCA9IHIwICogY29zKGEwMCksXG4gICAgICAgICAgICB5MDAgPSByMCAqIHNpbihhMDApLFxuICAgICAgICAgICAgb2M7XG5cbiAgICAgICAgLy8gUmVzdHJpY3QgdGhlIGNvcm5lciByYWRpdXMgYWNjb3JkaW5nIHRvIHRoZSBzZWN0b3IgYW5nbGUuXG4gICAgICAgIGlmIChkYSA8PSB0YXUgLSBlcHNpbG9uICYmIChvYyA9IGludGVyc2VjdCh4MDEsIHkwMSwgeDAwLCB5MDAsIHgxMSwgeTExLCB4MTAsIHkxMCkpKSB7XG4gICAgICAgICAgdmFyIGF4ID0geDAxIC0gb2NbMF0sXG4gICAgICAgICAgICAgIGF5ID0geTAxIC0gb2NbMV0sXG4gICAgICAgICAgICAgIGJ4ID0geDExIC0gb2NbMF0sXG4gICAgICAgICAgICAgIGJ5ID0geTExIC0gb2NbMV0sXG4gICAgICAgICAgICAgIGtjID0gMSAvIHNpbihhY29zKChheCAqIGJ4ICsgYXkgKiBieSkgLyAoc3FydChheCAqIGF4ICsgYXkgKiBheSkgKiBzcXJ0KGJ4ICogYnggKyBieSAqIGJ5KSkpIC8gMiksXG4gICAgICAgICAgICAgIGxjID0gc3FydChvY1swXSAqIG9jWzBdICsgb2NbMV0gKiBvY1sxXSk7XG4gICAgICAgICAgcmMwID0gbWluKHJjLCAocjAgLSBsYykgLyAoa2MgLSAxKSk7XG4gICAgICAgICAgcmMxID0gbWluKHJjLCAocjEgLSBsYykgLyAoa2MgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSXMgdGhlIHNlY3RvciBjb2xsYXBzZWQgdG8gYSBsaW5lP1xuICAgICAgaWYgKCEoZGExID4gZXBzaWxvbikpIGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKTtcblxuICAgICAgLy8gRG9lcyB0aGUgc2VjdG9y4oCZcyBvdXRlciByaW5nIGhhdmUgcm91bmRlZCBjb3JuZXJzP1xuICAgICAgZWxzZSBpZiAocmMxID4gZXBzaWxvbikge1xuICAgICAgICB0MCA9IGNvcm5lclRhbmdlbnRzKHgwMCwgeTAwLCB4MDEsIHkwMSwgcjEsIHJjMSwgY3cpO1xuICAgICAgICB0MSA9IGNvcm5lclRhbmdlbnRzKHgxMSwgeTExLCB4MTAsIHkxMCwgcjEsIHJjMSwgY3cpO1xuXG4gICAgICAgIGNvbnRleHQubW92ZVRvKHQwLmN4ICsgdDAueDAxLCB0MC5jeSArIHQwLnkwMSk7XG5cbiAgICAgICAgLy8gSGF2ZSB0aGUgY29ybmVycyBtZXJnZWQ/XG4gICAgICAgIGlmIChyYzEgPCByYykgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzEsIGF0YW4yKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpO1xuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgZHJhdyB0aGUgdHdvIGNvcm5lcnMgYW5kIHRoZSByaW5nLlxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMSwgYXRhbjIodDAueTAxLCB0MC54MDEpLCBhdGFuMih0MC55MTEsIHQwLngxMSksICFjdyk7XG4gICAgICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjEsIGF0YW4yKHQwLmN5ICsgdDAueTExLCB0MC5jeCArIHQwLngxMSksIGF0YW4yKHQxLmN5ICsgdDEueTExLCB0MS5jeCArIHQxLngxMSksICFjdyk7XG4gICAgICAgICAgY29udGV4dC5hcmModDEuY3gsIHQxLmN5LCByYzEsIGF0YW4yKHQxLnkxMSwgdDEueDExKSwgYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE9yIGlzIHRoZSBvdXRlciByaW5nIGp1c3QgYSBjaXJjdWxhciBhcmM/XG4gICAgICBlbHNlIGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKSwgY29udGV4dC5hcmMoMCwgMCwgcjEsIGEwMSwgYTExLCAhY3cpO1xuXG4gICAgICAvLyBJcyB0aGVyZSBubyBpbm5lciByaW5nLCBhbmQgaXTigJlzIGEgY2lyY3VsYXIgc2VjdG9yP1xuICAgICAgLy8gT3IgcGVyaGFwcyBpdOKAmXMgYW4gYW5udWxhciBzZWN0b3IgY29sbGFwc2VkIGR1ZSB0byBwYWRkaW5nP1xuICAgICAgaWYgKCEocjAgPiBlcHNpbG9uKSB8fCAhKGRhMCA+IGVwc2lsb24pKSBjb250ZXh0LmxpbmVUbyh4MTAsIHkxMCk7XG5cbiAgICAgIC8vIERvZXMgdGhlIHNlY3RvcuKAmXMgaW5uZXIgcmluZyAob3IgcG9pbnQpIGhhdmUgcm91bmRlZCBjb3JuZXJzP1xuICAgICAgZWxzZSBpZiAocmMwID4gZXBzaWxvbikge1xuICAgICAgICB0MCA9IGNvcm5lclRhbmdlbnRzKHgxMCwgeTEwLCB4MTEsIHkxMSwgcjAsIC1yYzAsIGN3KTtcbiAgICAgICAgdDEgPSBjb3JuZXJUYW5nZW50cyh4MDEsIHkwMSwgeDAwLCB5MDAsIHIwLCAtcmMwLCBjdyk7XG5cbiAgICAgICAgY29udGV4dC5saW5lVG8odDAuY3ggKyB0MC54MDEsIHQwLmN5ICsgdDAueTAxKTtcblxuICAgICAgICAvLyBIYXZlIHRoZSBjb3JuZXJzIG1lcmdlZD9cbiAgICAgICAgaWYgKHJjMCA8IHJjKSBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMCwgYXRhbjIodDAueTAxLCB0MC54MDEpLCBhdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IHRoZSB0d28gY29ybmVycyBhbmQgdGhlIHJpbmcuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMwLCBhdGFuMih0MC55MDEsIHQwLngwMSksIGF0YW4yKHQwLnkxMSwgdDAueDExKSwgIWN3KTtcbiAgICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMCwgYXRhbjIodDAuY3kgKyB0MC55MTEsIHQwLmN4ICsgdDAueDExKSwgYXRhbjIodDEuY3kgKyB0MS55MTEsIHQxLmN4ICsgdDEueDExKSwgY3cpO1xuICAgICAgICAgIGNvbnRleHQuYXJjKHQxLmN4LCB0MS5jeSwgcmMwLCBhdGFuMih0MS55MTEsIHQxLngxMSksIGF0YW4yKHQxLnkwMSwgdDEueDAxKSwgIWN3KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBPciBpcyB0aGUgaW5uZXIgcmluZyBqdXN0IGEgY2lyY3VsYXIgYXJjP1xuICAgICAgZWxzZSBjb250ZXh0LmFyYygwLCAwLCByMCwgYTEwLCBhMDAsIGN3KTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuXG4gICAgaWYgKGJ1ZmZlcikgcmV0dXJuIGNvbnRleHQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICBhcmMuY2VudHJvaWQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgciA9ICgraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtvdXRlclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIsXG4gICAgICAgIGEgPSAoK3N0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIgLSBwaSAvIDI7XG4gICAgcmV0dXJuIFtjb3MoYSkgKiByLCBzaW4oYSkgKiByXTtcbiAgfTtcblxuICBhcmMuaW5uZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW5uZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IGlubmVyUmFkaXVzO1xuICB9O1xuXG4gIGFyYy5vdXRlclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdXRlclJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogb3V0ZXJSYWRpdXM7XG4gIH07XG5cbiAgYXJjLmNvcm5lclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb3JuZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IGNvcm5lclJhZGl1cztcbiAgfTtcblxuICBhcmMucGFkUmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZFJhZGl1cyA9IF8gPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IHBhZFJhZGl1cztcbiAgfTtcblxuICBhcmMuc3RhcnRBbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdGFydEFuZ2xlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBzdGFydEFuZ2xlO1xuICB9O1xuXG4gIGFyYy5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChlbmRBbmdsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogZW5kQW5nbGU7XG4gIH07XG5cbiAgYXJjLnBhZEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZEFuZ2xlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBwYWRBbmdsZTtcbiAgfTtcblxuICBhcmMuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfKSwgYXJjKSA6IGNvbnRleHQ7XG4gIH07XG5cbiAgcmV0dXJuIGFyYztcbn1cbiIsImltcG9ydCB7cGF0aH0gZnJvbSBcImQzLXBhdGhcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IGN1cnZlTGluZWFyIGZyb20gXCIuL2N1cnZlL2xpbmVhclwiO1xuaW1wb3J0IGxpbmUgZnJvbSBcIi4vbGluZVwiO1xuaW1wb3J0IHt4IGFzIHBvaW50WCwgeSBhcyBwb2ludFl9IGZyb20gXCIuL3BvaW50XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgeDAgPSBwb2ludFgsXG4gICAgICB4MSA9IG51bGwsXG4gICAgICB5MCA9IGNvbnN0YW50KDApLFxuICAgICAgeTEgPSBwb2ludFksXG4gICAgICBkZWZpbmVkID0gY29uc3RhbnQodHJ1ZSksXG4gICAgICBjb250ZXh0ID0gbnVsbCxcbiAgICAgIGN1cnZlID0gY3VydmVMaW5lYXIsXG4gICAgICBvdXRwdXQgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGFyZWEoZGF0YSkge1xuICAgIHZhciBpLFxuICAgICAgICBqLFxuICAgICAgICBrLFxuICAgICAgICBuID0gZGF0YS5sZW5ndGgsXG4gICAgICAgIGQsXG4gICAgICAgIGRlZmluZWQwID0gZmFsc2UsXG4gICAgICAgIGJ1ZmZlcixcbiAgICAgICAgeDB6ID0gbmV3IEFycmF5KG4pLFxuICAgICAgICB5MHogPSBuZXcgQXJyYXkobik7XG5cbiAgICBpZiAoY29udGV4dCA9PSBudWxsKSBvdXRwdXQgPSBjdXJ2ZShidWZmZXIgPSBwYXRoKCkpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8PSBuOyArK2kpIHtcbiAgICAgIGlmICghKGkgPCBuICYmIGRlZmluZWQoZCA9IGRhdGFbaV0sIGksIGRhdGEpKSA9PT0gZGVmaW5lZDApIHtcbiAgICAgICAgaWYgKGRlZmluZWQwID0gIWRlZmluZWQwKSB7XG4gICAgICAgICAgaiA9IGk7XG4gICAgICAgICAgb3V0cHV0LmFyZWFTdGFydCgpO1xuICAgICAgICAgIG91dHB1dC5saW5lU3RhcnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXQubGluZUVuZCgpO1xuICAgICAgICAgIG91dHB1dC5saW5lU3RhcnQoKTtcbiAgICAgICAgICBmb3IgKGsgPSBpIC0gMTsgayA+PSBqOyAtLWspIHtcbiAgICAgICAgICAgIG91dHB1dC5wb2ludCh4MHpba10sIHkweltrXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dHB1dC5saW5lRW5kKCk7XG4gICAgICAgICAgb3V0cHV0LmFyZWFFbmQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRlZmluZWQwKSB7XG4gICAgICAgIHgweltpXSA9ICt4MChkLCBpLCBkYXRhKSwgeTB6W2ldID0gK3kwKGQsIGksIGRhdGEpO1xuICAgICAgICBvdXRwdXQucG9pbnQoeDEgPyAreDEoZCwgaSwgZGF0YSkgOiB4MHpbaV0sIHkxID8gK3kxKGQsIGksIGRhdGEpIDogeTB6W2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gb3V0cHV0ID0gbnVsbCwgYnVmZmVyICsgXCJcIiB8fCBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gYXJlYWxpbmUoKSB7XG4gICAgcmV0dXJuIGxpbmUoKS5kZWZpbmVkKGRlZmluZWQpLmN1cnZlKGN1cnZlKS5jb250ZXh0KGNvbnRleHQpO1xuICB9XG5cbiAgYXJlYS54ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHgxID0gbnVsbCwgYXJlYSkgOiB4MDtcbiAgfTtcblxuICBhcmVhLngwID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyZWEpIDogeDA7XG4gIH07XG5cbiAgYXJlYS54MSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MSA9IF8gPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJlYSkgOiB4MTtcbiAgfTtcblxuICBhcmVhLnkgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeTAgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgeTEgPSBudWxsLCBhcmVhKSA6IHkwO1xuICB9O1xuXG4gIGFyZWEueTAgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeTAgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJlYSkgOiB5MDtcbiAgfTtcblxuICBhcmVhLnkxID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkxID0gXyA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmVhKSA6IHkxO1xuICB9O1xuXG4gIGFyZWEubGluZVgwID1cbiAgYXJlYS5saW5lWTAgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYXJlYWxpbmUoKS54KHgwKS55KHkwKTtcbiAgfTtcblxuICBhcmVhLmxpbmVZMSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBhcmVhbGluZSgpLngoeDApLnkoeTEpO1xuICB9O1xuXG4gIGFyZWEubGluZVgxID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGFyZWFsaW5lKCkueCh4MSkueSh5MCk7XG4gIH07XG5cbiAgYXJlYS5kZWZpbmVkID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRlZmluZWQgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGFyZWEpIDogZGVmaW5lZDtcbiAgfTtcblxuICBhcmVhLmN1cnZlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGN1cnZlID0gXywgY29udGV4dCAhPSBudWxsICYmIChvdXRwdXQgPSBjdXJ2ZShjb250ZXh0KSksIGFyZWEpIDogY3VydmU7XG4gIH07XG5cbiAgYXJlYS5jb250ZXh0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKF8gPT0gbnVsbCA/IGNvbnRleHQgPSBvdXRwdXQgPSBudWxsIDogb3V0cHV0ID0gY3VydmUoY29udGV4dCA9IF8pLCBhcmVhKSA6IGNvbnRleHQ7XG4gIH07XG5cbiAgcmV0dXJuIGFyZWE7XG59XG4iLCJpbXBvcnQgY3VydmVSYWRpYWwsIHtjdXJ2ZVJhZGlhbExpbmVhcn0gZnJvbSBcIi4vY3VydmUvcmFkaWFsXCI7XG5pbXBvcnQgYXJlYSBmcm9tIFwiLi9hcmVhXCI7XG5pbXBvcnQge2xpbmVSYWRpYWx9IGZyb20gXCIuL2xpbmVSYWRpYWxcIlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGEgPSBhcmVhKCkuY3VydmUoY3VydmVSYWRpYWxMaW5lYXIpLFxuICAgICAgYyA9IGEuY3VydmUsXG4gICAgICB4MCA9IGEubGluZVgwLFxuICAgICAgeDEgPSBhLmxpbmVYMSxcbiAgICAgIHkwID0gYS5saW5lWTAsXG4gICAgICB5MSA9IGEubGluZVkxO1xuXG4gIGEuYW5nbGUgPSBhLngsIGRlbGV0ZSBhLng7XG4gIGEuc3RhcnRBbmdsZSA9IGEueDAsIGRlbGV0ZSBhLngwO1xuICBhLmVuZEFuZ2xlID0gYS54MSwgZGVsZXRlIGEueDE7XG4gIGEucmFkaXVzID0gYS55LCBkZWxldGUgYS55O1xuICBhLmlubmVyUmFkaXVzID0gYS55MCwgZGVsZXRlIGEueTA7XG4gIGEub3V0ZXJSYWRpdXMgPSBhLnkxLCBkZWxldGUgYS55MTtcbiAgYS5saW5lU3RhcnRBbmdsZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh4MCgpKTsgfSwgZGVsZXRlIGEubGluZVgwO1xuICBhLmxpbmVFbmRBbmdsZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh4MSgpKTsgfSwgZGVsZXRlIGEubGluZVgxO1xuICBhLmxpbmVJbm5lclJhZGl1cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh5MCgpKTsgfSwgZGVsZXRlIGEubGluZVkwO1xuICBhLmxpbmVPdXRlclJhZGl1cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh5MSgpKTsgfSwgZGVsZXRlIGEubGluZVkxO1xuXG4gIGEuY3VydmUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7XG4gIH07XG5cbiAgcmV0dXJuIGE7XG59XG4iLCJleHBvcnQgdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24gY29uc3RhbnQoKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcG9pbnQodGhhdCwgeCwgeSkge1xuICB0aGF0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oXG4gICAgKDIgKiB0aGF0Ll94MCArIHRoYXQuX3gxKSAvIDMsXG4gICAgKDIgKiB0aGF0Ll95MCArIHRoYXQuX3kxKSAvIDMsXG4gICAgKHRoYXQuX3gwICsgMiAqIHRoYXQuX3gxKSAvIDMsXG4gICAgKHRoYXQuX3kwICsgMiAqIHRoYXQuX3kxKSAvIDMsXG4gICAgKHRoYXQuX3gwICsgNCAqIHRoYXQuX3gxICsgeCkgLyA2LFxuICAgICh0aGF0Ll95MCArIDQgKiB0aGF0Ll95MSArIHkpIC8gNlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQmFzaXMoY29udGV4dCkge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbn1cblxuQmFzaXMucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPVxuICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSBOYU47XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDM6IHBvaW50KHRoaXMsIHRoaXMuX3gxLCB0aGlzLl95MSk7IC8vIHByb2NlZWRcbiAgICAgIGNhc2UgMjogdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsIHRoaXMuX3kxKTsgYnJlYWs7XG4gICAgfVxuICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgeCA9ICt4LCB5ID0gK3k7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhaztcbiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl9jb250ZXh0LmxpbmVUbygoNSAqIHRoaXMuX3gwICsgdGhpcy5feDEpIC8gNiwgKDUgKiB0aGlzLl95MCArIHRoaXMuX3kxKSAvIDYpOyAvLyBwcm9jZWVkXG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ldyBCYXNpcyhjb250ZXh0KTtcbn1cbiIsImltcG9ydCBub29wIGZyb20gXCIuLi9ub29wXCI7XG5pbXBvcnQge3BvaW50fSBmcm9tIFwiLi9iYXNpc1wiO1xuXG5mdW5jdGlvbiBCYXNpc0Nsb3NlZChjb250ZXh0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xufVxuXG5CYXNpc0Nsb3NlZC5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogbm9vcCxcbiAgYXJlYUVuZDogbm9vcCxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPSB0aGlzLl94MyA9IHRoaXMuX3g0ID1cbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSB0aGlzLl95MyA9IHRoaXMuX3k0ID0gTmFOO1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAxOiB7XG4gICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7XG4gICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAyOiB7XG4gICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MiArIDIgKiB0aGlzLl94MykgLyAzLCAodGhpcy5feTIgKyAyICogdGhpcy5feTMpIC8gMyk7XG4gICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKCh0aGlzLl94MyArIDIgKiB0aGlzLl94MikgLyAzLCAodGhpcy5feTMgKyAyICogdGhpcy5feTIpIC8gMyk7XG4gICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAzOiB7XG4gICAgICAgIHRoaXMucG9pbnQodGhpcy5feDIsIHRoaXMuX3kyKTtcbiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94MywgdGhpcy5feTMpO1xuICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g0LCB0aGlzLl95NCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5feDIgPSB4LCB0aGlzLl95MiA9IHk7IGJyZWFrO1xuICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IHRoaXMuX3gzID0geCwgdGhpcy5feTMgPSB5OyBicmVhaztcbiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geTsgdGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gwICsgNCAqIHRoaXMuX3gxICsgeCkgLyA2LCAodGhpcy5feTAgKyA0ICogdGhpcy5feTEgKyB5KSAvIDYpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHgsIHkpOyBicmVhaztcbiAgICB9XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB4O1xuICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICByZXR1cm4gbmV3IEJhc2lzQ2xvc2VkKGNvbnRleHQpO1xufVxuIiwiaW1wb3J0IHtwb2ludH0gZnJvbSBcIi4vYmFzaXNcIjtcblxuZnVuY3Rpb24gQmFzaXNPcGVuKGNvbnRleHQpIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG59XG5cbkJhc2lzT3Blbi5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSA9XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IE5hTjtcbiAgICB0aGlzLl9wb2ludCA9IDA7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgeCA9ICt4LCB5ID0gK3k7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJyZWFrO1xuICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrO1xuICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHZhciB4MCA9ICh0aGlzLl94MCArIDQgKiB0aGlzLl94MSArIHgpIC8gNiwgeTAgPSAodGhpcy5feTAgKyA0ICogdGhpcy5feTEgKyB5KSAvIDY7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4MCwgeTApIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeDAsIHkwKTsgYnJlYWs7XG4gICAgICBjYXNlIDM6IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZFxuICAgICAgZGVmYXVsdDogcG9pbnQodGhpcywgeCwgeSk7IGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgQmFzaXNPcGVuKGNvbnRleHQpO1xufVxuIiwiaW1wb3J0IHtCYXNpc30gZnJvbSBcIi4vYmFzaXNcIjtcblxuZnVuY3Rpb24gQnVuZGxlKGNvbnRleHQsIGJldGEpIHtcbiAgdGhpcy5fYmFzaXMgPSBuZXcgQmFzaXMoY29udGV4dCk7XG4gIHRoaXMuX2JldGEgPSBiZXRhO1xufVxuXG5CdW5kbGUucHJvdG90eXBlID0ge1xuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3ggPSBbXTtcbiAgICB0aGlzLl95ID0gW107XG4gICAgdGhpcy5fYmFzaXMubGluZVN0YXJ0KCk7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB4ID0gdGhpcy5feCxcbiAgICAgICAgeSA9IHRoaXMuX3ksXG4gICAgICAgIGogPSB4Lmxlbmd0aCAtIDE7XG5cbiAgICBpZiAoaiA+IDApIHtcbiAgICAgIHZhciB4MCA9IHhbMF0sXG4gICAgICAgICAgeTAgPSB5WzBdLFxuICAgICAgICAgIGR4ID0geFtqXSAtIHgwLFxuICAgICAgICAgIGR5ID0geVtqXSAtIHkwLFxuICAgICAgICAgIGkgPSAtMSxcbiAgICAgICAgICB0O1xuXG4gICAgICB3aGlsZSAoKytpIDw9IGopIHtcbiAgICAgICAgdCA9IGkgLyBqO1xuICAgICAgICB0aGlzLl9iYXNpcy5wb2ludChcbiAgICAgICAgICB0aGlzLl9iZXRhICogeFtpXSArICgxIC0gdGhpcy5fYmV0YSkgKiAoeDAgKyB0ICogZHgpLFxuICAgICAgICAgIHRoaXMuX2JldGEgKiB5W2ldICsgKDEgLSB0aGlzLl9iZXRhKSAqICh5MCArIHQgKiBkeSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl94ID0gdGhpcy5feSA9IG51bGw7XG4gICAgdGhpcy5fYmFzaXMubGluZUVuZCgpO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHRoaXMuX3gucHVzaCgreCk7XG4gICAgdGhpcy5feS5wdXNoKCt5KTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIGN1c3RvbShiZXRhKSB7XG5cbiAgZnVuY3Rpb24gYnVuZGxlKGNvbnRleHQpIHtcbiAgICByZXR1cm4gYmV0YSA9PT0gMSA/IG5ldyBCYXNpcyhjb250ZXh0KSA6IG5ldyBCdW5kbGUoY29udGV4dCwgYmV0YSk7XG4gIH1cblxuICBidW5kbGUuYmV0YSA9IGZ1bmN0aW9uKGJldGEpIHtcbiAgICByZXR1cm4gY3VzdG9tKCtiZXRhKTtcbiAgfTtcblxuICByZXR1cm4gYnVuZGxlO1xufSkoMC44NSk7XG4iLCJleHBvcnQgZnVuY3Rpb24gcG9pbnQodGhhdCwgeCwgeSkge1xuICB0aGF0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oXG4gICAgdGhhdC5feDEgKyB0aGF0Ll9rICogKHRoYXQuX3gyIC0gdGhhdC5feDApLFxuICAgIHRoYXQuX3kxICsgdGhhdC5fayAqICh0aGF0Ll95MiAtIHRoYXQuX3kwKSxcbiAgICB0aGF0Ll94MiArIHRoYXQuX2sgKiAodGhhdC5feDEgLSB4KSxcbiAgICB0aGF0Ll95MiArIHRoYXQuX2sgKiAodGhhdC5feTEgLSB5KSxcbiAgICB0aGF0Ll94MixcbiAgICB0aGF0Ll95MlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQ2FyZGluYWwoY29udGV4dCwgdGVuc2lvbikge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5fayA9ICgxIC0gdGVuc2lvbikgLyA2O1xufVxuXG5DYXJkaW5hbC5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID1cbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrO1xuICAgICAgY2FzZSAzOiBwb2ludCh0aGlzLCB0aGlzLl94MSwgdGhpcy5feTEpOyBicmVhaztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrO1xuICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IHRoaXMuX3gxID0geCwgdGhpcy5feTEgPSB5OyBicmVhaztcbiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyAvLyBwcm9jZWVkXG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20odGVuc2lvbikge1xuXG4gIGZ1bmN0aW9uIGNhcmRpbmFsKGNvbnRleHQpIHtcbiAgICByZXR1cm4gbmV3IENhcmRpbmFsKGNvbnRleHQsIHRlbnNpb24pO1xuICB9XG5cbiAgY2FyZGluYWwudGVuc2lvbiA9IGZ1bmN0aW9uKHRlbnNpb24pIHtcbiAgICByZXR1cm4gY3VzdG9tKCt0ZW5zaW9uKTtcbiAgfTtcblxuICByZXR1cm4gY2FyZGluYWw7XG59KSgwKTtcbiIsImltcG9ydCBub29wIGZyb20gXCIuLi9ub29wXCI7XG5pbXBvcnQge3BvaW50fSBmcm9tIFwiLi9jYXJkaW5hbFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gQ2FyZGluYWxDbG9zZWQoY29udGV4dCwgdGVuc2lvbikge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5fayA9ICgxIC0gdGVuc2lvbikgLyA2O1xufVxuXG5DYXJkaW5hbENsb3NlZC5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogbm9vcCxcbiAgYXJlYUVuZDogbm9vcCxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPSB0aGlzLl94MyA9IHRoaXMuX3g0ID0gdGhpcy5feDUgPVxuICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IHRoaXMuX3kzID0gdGhpcy5feTQgPSB0aGlzLl95NSA9IE5hTjtcbiAgICB0aGlzLl9wb2ludCA9IDA7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMToge1xuICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MywgdGhpcy5feTMpO1xuICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMjoge1xuICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MywgdGhpcy5feTMpO1xuICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMzoge1xuICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3gzLCB0aGlzLl95Myk7XG4gICAgICAgIHRoaXMucG9pbnQodGhpcy5feDQsIHRoaXMuX3k0KTtcbiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NSwgdGhpcy5feTUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgeCA9ICt4LCB5ID0gK3k7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX3gzID0geCwgdGhpcy5feTMgPSB5OyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geSk7IGJyZWFrO1xuICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHRoaXMuX3g1ID0geCwgdGhpcy5feTUgPSB5OyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHgsIHkpOyBicmVhaztcbiAgICB9XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB0aGlzLl94MiwgdGhpcy5feDIgPSB4O1xuICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKSB7XG5cbiAgZnVuY3Rpb24gY2FyZGluYWwoY29udGV4dCkge1xuICAgIHJldHVybiBuZXcgQ2FyZGluYWxDbG9zZWQoY29udGV4dCwgdGVuc2lvbik7XG4gIH1cblxuICBjYXJkaW5hbC50ZW5zaW9uID0gZnVuY3Rpb24odGVuc2lvbikge1xuICAgIHJldHVybiBjdXN0b20oK3RlbnNpb24pO1xuICB9O1xuXG4gIHJldHVybiBjYXJkaW5hbDtcbn0pKDApO1xuIiwiaW1wb3J0IHtwb2ludH0gZnJvbSBcIi4vY2FyZGluYWxcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIENhcmRpbmFsT3Blbihjb250ZXh0LCB0ZW5zaW9uKSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLl9rID0gKDEgLSB0ZW5zaW9uKSAvIDY7XG59XG5cbkNhcmRpbmFsT3Blbi5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID1cbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMykpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHggPSAreCwgeSA9ICt5O1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhaztcbiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsIHRoaXMuX3kyKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrO1xuICAgICAgY2FzZSAzOiB0aGlzLl9wb2ludCA9IDQ7IC8vIHByb2NlZWRcbiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHgsIHkpOyBicmVhaztcbiAgICB9XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB0aGlzLl94MiwgdGhpcy5feDIgPSB4O1xuICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKSB7XG5cbiAgZnVuY3Rpb24gY2FyZGluYWwoY29udGV4dCkge1xuICAgIHJldHVybiBuZXcgQ2FyZGluYWxPcGVuKGNvbnRleHQsIHRlbnNpb24pO1xuICB9XG5cbiAgY2FyZGluYWwudGVuc2lvbiA9IGZ1bmN0aW9uKHRlbnNpb24pIHtcbiAgICByZXR1cm4gY3VzdG9tKCt0ZW5zaW9uKTtcbiAgfTtcblxuICByZXR1cm4gY2FyZGluYWw7XG59KSgwKTtcbiIsImltcG9ydCB7ZXBzaWxvbn0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7Q2FyZGluYWx9IGZyb20gXCIuL2NhcmRpbmFsXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludCh0aGF0LCB4LCB5KSB7XG4gIHZhciB4MSA9IHRoYXQuX3gxLFxuICAgICAgeTEgPSB0aGF0Ll95MSxcbiAgICAgIHgyID0gdGhhdC5feDIsXG4gICAgICB5MiA9IHRoYXQuX3kyO1xuXG4gIGlmICh0aGF0Ll9sMDFfYSA+IGVwc2lsb24pIHtcbiAgICB2YXIgYSA9IDIgKiB0aGF0Ll9sMDFfMmEgKyAzICogdGhhdC5fbDAxX2EgKiB0aGF0Ll9sMTJfYSArIHRoYXQuX2wxMl8yYSxcbiAgICAgICAgbiA9IDMgKiB0aGF0Ll9sMDFfYSAqICh0aGF0Ll9sMDFfYSArIHRoYXQuX2wxMl9hKTtcbiAgICB4MSA9ICh4MSAqIGEgLSB0aGF0Ll94MCAqIHRoYXQuX2wxMl8yYSArIHRoYXQuX3gyICogdGhhdC5fbDAxXzJhKSAvIG47XG4gICAgeTEgPSAoeTEgKiBhIC0gdGhhdC5feTAgKiB0aGF0Ll9sMTJfMmEgKyB0aGF0Ll95MiAqIHRoYXQuX2wwMV8yYSkgLyBuO1xuICB9XG5cbiAgaWYgKHRoYXQuX2wyM19hID4gZXBzaWxvbikge1xuICAgIHZhciBiID0gMiAqIHRoYXQuX2wyM18yYSArIDMgKiB0aGF0Ll9sMjNfYSAqIHRoYXQuX2wxMl9hICsgdGhhdC5fbDEyXzJhLFxuICAgICAgICBtID0gMyAqIHRoYXQuX2wyM19hICogKHRoYXQuX2wyM19hICsgdGhhdC5fbDEyX2EpO1xuICAgIHgyID0gKHgyICogYiArIHRoYXQuX3gxICogdGhhdC5fbDIzXzJhIC0geCAqIHRoYXQuX2wxMl8yYSkgLyBtO1xuICAgIHkyID0gKHkyICogYiArIHRoYXQuX3kxICogdGhhdC5fbDIzXzJhIC0geSAqIHRoYXQuX2wxMl8yYSkgLyBtO1xuICB9XG5cbiAgdGhhdC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHgxLCB5MSwgeDIsIHkyLCB0aGF0Ll94MiwgdGhhdC5feTIpO1xufVxuXG5mdW5jdGlvbiBDYXRtdWxsUm9tKGNvbnRleHQsIGFscGhhKSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLl9hbHBoYSA9IGFscGhhO1xufVxuXG5DYXRtdWxsUm9tLnByb3RvdHlwZSA9IHtcbiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gMDtcbiAgfSxcbiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IE5hTjtcbiAgfSxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPVxuICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IE5hTjtcbiAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hID0gdGhpcy5fbDIzX2EgPVxuICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYSA9XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrO1xuICAgICAgY2FzZSAzOiB0aGlzLnBvaW50KHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHggPSAreCwgeSA9ICt5O1xuXG4gICAgaWYgKHRoaXMuX3BvaW50KSB7XG4gICAgICB2YXIgeDIzID0gdGhpcy5feDIgLSB4LFxuICAgICAgICAgIHkyMyA9IHRoaXMuX3kyIC0geTtcbiAgICAgIHRoaXMuX2wyM19hID0gTWF0aC5zcXJ0KHRoaXMuX2wyM18yYSA9IE1hdGgucG93KHgyMyAqIHgyMyArIHkyMyAqIHkyMywgdGhpcy5fYWxwaGEpKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrO1xuICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrO1xuICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IC8vIHByb2NlZWRcbiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHgsIHkpOyBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hLCB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hO1xuICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSwgdGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhO1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20oYWxwaGEpIHtcblxuICBmdW5jdGlvbiBjYXRtdWxsUm9tKGNvbnRleHQpIHtcbiAgICByZXR1cm4gYWxwaGEgPyBuZXcgQ2F0bXVsbFJvbShjb250ZXh0LCBhbHBoYSkgOiBuZXcgQ2FyZGluYWwoY29udGV4dCwgMCk7XG4gIH1cblxuICBjYXRtdWxsUm9tLmFscGhhID0gZnVuY3Rpb24oYWxwaGEpIHtcbiAgICByZXR1cm4gY3VzdG9tKCthbHBoYSk7XG4gIH07XG5cbiAgcmV0dXJuIGNhdG11bGxSb207XG59KSgwLjUpO1xuIiwiaW1wb3J0IHtDYXJkaW5hbENsb3NlZH0gZnJvbSBcIi4vY2FyZGluYWxDbG9zZWRcIjtcbmltcG9ydCBub29wIGZyb20gXCIuLi9ub29wXCI7XG5pbXBvcnQge3BvaW50fSBmcm9tIFwiLi9jYXRtdWxsUm9tXCI7XG5cbmZ1bmN0aW9uIENhdG11bGxSb21DbG9zZWQoY29udGV4dCwgYWxwaGEpIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuX2FscGhhID0gYWxwaGE7XG59XG5cbkNhdG11bGxSb21DbG9zZWQucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IG5vb3AsXG4gIGFyZWFFbmQ6IG5vb3AsXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0gdGhpcy5feDMgPSB0aGlzLl94NCA9IHRoaXMuX3g1ID1cbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSB0aGlzLl95MyA9IHRoaXMuX3k0ID0gdGhpcy5feTUgPSBOYU47XG4gICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hID1cbiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmEgPVxuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAxOiB7XG4gICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gzLCB0aGlzLl95Myk7XG4gICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAyOiB7XG4gICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLCB0aGlzLl95Myk7XG4gICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAzOiB7XG4gICAgICAgIHRoaXMucG9pbnQodGhpcy5feDMsIHRoaXMuX3kzKTtcbiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NCwgdGhpcy5feTQpO1xuICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g1LCB0aGlzLl95NSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcblxuICAgIGlmICh0aGlzLl9wb2ludCkge1xuICAgICAgdmFyIHgyMyA9IHRoaXMuX3gyIC0geCxcbiAgICAgICAgICB5MjMgPSB0aGlzLl95MiAtIHk7XG4gICAgICB0aGlzLl9sMjNfYSA9IE1hdGguc3FydCh0aGlzLl9sMjNfMmEgPSBNYXRoLnBvdyh4MjMgKiB4MjMgKyB5MjMgKiB5MjMsIHRoaXMuX2FscGhhKSk7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX3gzID0geCwgdGhpcy5feTMgPSB5OyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geSk7IGJyZWFrO1xuICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHRoaXMuX3g1ID0geCwgdGhpcy5feTUgPSB5OyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHgsIHkpOyBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hLCB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hO1xuICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSwgdGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhO1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20oYWxwaGEpIHtcblxuICBmdW5jdGlvbiBjYXRtdWxsUm9tKGNvbnRleHQpIHtcbiAgICByZXR1cm4gYWxwaGEgPyBuZXcgQ2F0bXVsbFJvbUNsb3NlZChjb250ZXh0LCBhbHBoYSkgOiBuZXcgQ2FyZGluYWxDbG9zZWQoY29udGV4dCwgMCk7XG4gIH1cblxuICBjYXRtdWxsUm9tLmFscGhhID0gZnVuY3Rpb24oYWxwaGEpIHtcbiAgICByZXR1cm4gY3VzdG9tKCthbHBoYSk7XG4gIH07XG5cbiAgcmV0dXJuIGNhdG11bGxSb207XG59KSgwLjUpO1xuIiwiaW1wb3J0IHtDYXJkaW5hbE9wZW59IGZyb20gXCIuL2NhcmRpbmFsT3BlblwiO1xuaW1wb3J0IHtwb2ludH0gZnJvbSBcIi4vY2F0bXVsbFJvbVwiO1xuXG5mdW5jdGlvbiBDYXRtdWxsUm9tT3Blbihjb250ZXh0LCBhbHBoYSkge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5fYWxwaGEgPSBhbHBoYTtcbn1cblxuQ2F0bXVsbFJvbU9wZW4ucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPSB0aGlzLl94MiA9XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gTmFOO1xuICAgIHRoaXMuX2wwMV9hID0gdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYSA9XG4gICAgdGhpcy5fbDAxXzJhID0gdGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhID1cbiAgICB0aGlzLl9wb2ludCA9IDA7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgeCA9ICt4LCB5ID0gK3k7XG5cbiAgICBpZiAodGhpcy5fcG9pbnQpIHtcbiAgICAgIHZhciB4MjMgPSB0aGlzLl94MiAtIHgsXG4gICAgICAgICAgeTIzID0gdGhpcy5feTIgLSB5O1xuICAgICAgdGhpcy5fbDIzX2EgPSBNYXRoLnNxcnQodGhpcy5fbDIzXzJhID0gTWF0aC5wb3coeDIzICogeDIzICsgeTIzICogeTIzLCB0aGlzLl9hbHBoYSkpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhaztcbiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsIHRoaXMuX3kyKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrO1xuICAgICAgY2FzZSAzOiB0aGlzLl9wb2ludCA9IDQ7IC8vIHByb2NlZWRcbiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHgsIHkpOyBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hLCB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hO1xuICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSwgdGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhO1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20oYWxwaGEpIHtcblxuICBmdW5jdGlvbiBjYXRtdWxsUm9tKGNvbnRleHQpIHtcbiAgICByZXR1cm4gYWxwaGEgPyBuZXcgQ2F0bXVsbFJvbU9wZW4oY29udGV4dCwgYWxwaGEpIDogbmV3IENhcmRpbmFsT3Blbihjb250ZXh0LCAwKTtcbiAgfVxuXG4gIGNhdG11bGxSb20uYWxwaGEgPSBmdW5jdGlvbihhbHBoYSkge1xuICAgIHJldHVybiBjdXN0b20oK2FscGhhKTtcbiAgfTtcblxuICByZXR1cm4gY2F0bXVsbFJvbTtcbn0pKDAuNSk7XG4iLCJmdW5jdGlvbiBMaW5lYXIoY29udGV4dCkge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbn1cblxuTGluZWFyLnByb3RvdHlwZSA9IHtcbiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gMDtcbiAgfSxcbiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IE5hTjtcbiAgfSxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9wb2ludCA9IDA7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgeCA9ICt4LCB5ID0gK3k7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyAvLyBwcm9jZWVkXG4gICAgICBkZWZhdWx0OiB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KTsgYnJlYWs7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgTGluZWFyKGNvbnRleHQpO1xufVxuIiwiaW1wb3J0IG5vb3AgZnJvbSBcIi4uL25vb3BcIjtcblxuZnVuY3Rpb24gTGluZWFyQ2xvc2VkKGNvbnRleHQpIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG59XG5cbkxpbmVhckNsb3NlZC5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogbm9vcCxcbiAgYXJlYUVuZDogbm9vcCxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9wb2ludCA9IDA7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9wb2ludCkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBpZiAodGhpcy5fcG9pbnQpIHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpO1xuICAgIGVsc2UgdGhpcy5fcG9pbnQgPSAxLCB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICByZXR1cm4gbmV3IExpbmVhckNsb3NlZChjb250ZXh0KTtcbn1cbiIsImZ1bmN0aW9uIHNpZ24oeCkge1xuICByZXR1cm4geCA8IDAgPyAtMSA6IDE7XG59XG5cbi8vIENhbGN1bGF0ZSB0aGUgc2xvcGVzIG9mIHRoZSB0YW5nZW50cyAoSGVybWl0ZS10eXBlIGludGVycG9sYXRpb24pIGJhc2VkIG9uXG4vLyB0aGUgZm9sbG93aW5nIHBhcGVyOiBTdGVmZmVuLCBNLiAxOTkwLiBBIFNpbXBsZSBNZXRob2QgZm9yIE1vbm90b25pY1xuLy8gSW50ZXJwb2xhdGlvbiBpbiBPbmUgRGltZW5zaW9uLiBBc3Ryb25vbXkgYW5kIEFzdHJvcGh5c2ljcywgVm9sLiAyMzksIE5PLlxuLy8gTk9WKElJKSwgUC4gNDQzLCAxOTkwLlxuZnVuY3Rpb24gc2xvcGUzKHRoYXQsIHgyLCB5Mikge1xuICB2YXIgaDAgPSB0aGF0Ll94MSAtIHRoYXQuX3gwLFxuICAgICAgaDEgPSB4MiAtIHRoYXQuX3gxLFxuICAgICAgczAgPSAodGhhdC5feTEgLSB0aGF0Ll95MCkgLyAoaDAgfHwgaDEgPCAwICYmIC0wKSxcbiAgICAgIHMxID0gKHkyIC0gdGhhdC5feTEpIC8gKGgxIHx8IGgwIDwgMCAmJiAtMCksXG4gICAgICBwID0gKHMwICogaDEgKyBzMSAqIGgwKSAvIChoMCArIGgxKTtcbiAgcmV0dXJuIChzaWduKHMwKSArIHNpZ24oczEpKSAqIE1hdGgubWluKE1hdGguYWJzKHMwKSwgTWF0aC5hYnMoczEpLCAwLjUgKiBNYXRoLmFicyhwKSkgfHwgMDtcbn1cblxuLy8gQ2FsY3VsYXRlIGEgb25lLXNpZGVkIHNsb3BlLlxuZnVuY3Rpb24gc2xvcGUyKHRoYXQsIHQpIHtcbiAgdmFyIGggPSB0aGF0Ll94MSAtIHRoYXQuX3gwO1xuICByZXR1cm4gaCA/ICgzICogKHRoYXQuX3kxIC0gdGhhdC5feTApIC8gaCAtIHQpIC8gMiA6IHQ7XG59XG5cbi8vIEFjY29yZGluZyB0byBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdWJpY19IZXJtaXRlX3NwbGluZSNSZXByZXNlbnRhdGlvbnNcbi8vIFwieW91IGNhbiBleHByZXNzIGN1YmljIEhlcm1pdGUgaW50ZXJwb2xhdGlvbiBpbiB0ZXJtcyBvZiBjdWJpYyBCw6l6aWVyIGN1cnZlc1xuLy8gd2l0aCByZXNwZWN0IHRvIHRoZSBmb3VyIHZhbHVlcyBwMCwgcDAgKyBtMCAvIDMsIHAxIC0gbTEgLyAzLCBwMVwiLlxuZnVuY3Rpb24gcG9pbnQodGhhdCwgdDAsIHQxKSB7XG4gIHZhciB4MCA9IHRoYXQuX3gwLFxuICAgICAgeTAgPSB0aGF0Ll95MCxcbiAgICAgIHgxID0gdGhhdC5feDEsXG4gICAgICB5MSA9IHRoYXQuX3kxLFxuICAgICAgZHggPSAoeDEgLSB4MCkgLyAzO1xuICB0aGF0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oeDAgKyBkeCwgeTAgKyBkeCAqIHQwLCB4MSAtIGR4LCB5MSAtIGR4ICogdDEsIHgxLCB5MSk7XG59XG5cbmZ1bmN0aW9uIE1vbm90b25lWChjb250ZXh0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xufVxuXG5Nb25vdG9uZVgucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPVxuICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPVxuICAgIHRoaXMuX3QwID0gTmFOO1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSwgdGhpcy5feTEpOyBicmVhaztcbiAgICAgIGNhc2UgMzogcG9pbnQodGhpcywgdGhpcy5fdDAsIHNsb3BlMih0aGlzLCB0aGlzLl90MCkpOyBicmVhaztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB2YXIgdDEgPSBOYU47XG5cbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBpZiAoeCA9PT0gdGhpcy5feDEgJiYgeSA9PT0gdGhpcy5feTEpIHJldHVybjsgLy8gSWdub3JlIGNvaW5jaWRlbnQgcG9pbnRzLlxuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7XG4gICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgcG9pbnQodGhpcywgc2xvcGUyKHRoaXMsIHQxID0gc2xvcGUzKHRoaXMsIHgsIHkpKSwgdDEpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHRoaXMuX3QwLCB0MSA9IHNsb3BlMyh0aGlzLCB4LCB5KSk7IGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHk7XG4gICAgdGhpcy5fdDAgPSB0MTtcbiAgfVxufVxuXG5mdW5jdGlvbiBNb25vdG9uZVkoY29udGV4dCkge1xuICB0aGlzLl9jb250ZXh0ID0gbmV3IFJlZmxlY3RDb250ZXh0KGNvbnRleHQpO1xufVxuXG4oTW9ub3RvbmVZLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTW9ub3RvbmVYLnByb3RvdHlwZSkpLnBvaW50ID0gZnVuY3Rpb24oeCwgeSkge1xuICBNb25vdG9uZVgucHJvdG90eXBlLnBvaW50LmNhbGwodGhpcywgeSwgeCk7XG59O1xuXG5mdW5jdGlvbiBSZWZsZWN0Q29udGV4dChjb250ZXh0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xufVxuXG5SZWZsZWN0Q29udGV4dC5wcm90b3R5cGUgPSB7XG4gIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkgeyB0aGlzLl9jb250ZXh0Lm1vdmVUbyh5LCB4KTsgfSxcbiAgY2xvc2VQYXRoOiBmdW5jdGlvbigpIHsgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsgfSxcbiAgbGluZVRvOiBmdW5jdGlvbih4LCB5KSB7IHRoaXMuX2NvbnRleHQubGluZVRvKHksIHgpOyB9LFxuICBiZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgeCwgeSkgeyB0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oeTEsIHgxLCB5MiwgeDIsIHksIHgpOyB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbW9ub3RvbmVYKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ldyBNb25vdG9uZVgoY29udGV4dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb25vdG9uZVkoY29udGV4dCkge1xuICByZXR1cm4gbmV3IE1vbm90b25lWShjb250ZXh0KTtcbn1cbiIsImZ1bmN0aW9uIE5hdHVyYWwoY29udGV4dCkge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbn1cblxuTmF0dXJhbC5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feCA9IFtdO1xuICAgIHRoaXMuX3kgPSBbXTtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHggPSB0aGlzLl94LFxuICAgICAgICB5ID0gdGhpcy5feSxcbiAgICAgICAgbiA9IHgubGVuZ3RoO1xuXG4gICAgaWYgKG4pIHtcbiAgICAgIHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4WzBdLCB5WzBdKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHhbMF0sIHlbMF0pO1xuICAgICAgaWYgKG4gPT09IDIpIHtcbiAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeFsxXSwgeVsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcHggPSBjb250cm9sUG9pbnRzKHgpLFxuICAgICAgICAgICAgcHkgPSBjb250cm9sUG9pbnRzKHkpO1xuICAgICAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMTsgaTEgPCBuOyArK2kwLCArK2kxKSB7XG4gICAgICAgICAgdGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHB4WzBdW2kwXSwgcHlbMF1baTBdLCBweFsxXVtpMF0sIHB5WzFdW2kwXSwgeFtpMV0sIHlbaTFdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIG4gPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgICB0aGlzLl94ID0gdGhpcy5feSA9IG51bGw7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgdGhpcy5feC5wdXNoKCt4KTtcbiAgICB0aGlzLl95LnB1c2goK3kpO1xuICB9XG59O1xuXG4vLyBTZWUgaHR0cHM6Ly93d3cucGFydGljbGVpbmNlbGwuY29tLzIwMTIvYmV6aWVyLXNwbGluZXMvIGZvciBkZXJpdmF0aW9uLlxuZnVuY3Rpb24gY29udHJvbFBvaW50cyh4KSB7XG4gIHZhciBpLFxuICAgICAgbiA9IHgubGVuZ3RoIC0gMSxcbiAgICAgIG0sXG4gICAgICBhID0gbmV3IEFycmF5KG4pLFxuICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgIHIgPSBuZXcgQXJyYXkobik7XG4gIGFbMF0gPSAwLCBiWzBdID0gMiwgclswXSA9IHhbMF0gKyAyICogeFsxXTtcbiAgZm9yIChpID0gMTsgaSA8IG4gLSAxOyArK2kpIGFbaV0gPSAxLCBiW2ldID0gNCwgcltpXSA9IDQgKiB4W2ldICsgMiAqIHhbaSArIDFdO1xuICBhW24gLSAxXSA9IDIsIGJbbiAtIDFdID0gNywgcltuIC0gMV0gPSA4ICogeFtuIC0gMV0gKyB4W25dO1xuICBmb3IgKGkgPSAxOyBpIDwgbjsgKytpKSBtID0gYVtpXSAvIGJbaSAtIDFdLCBiW2ldIC09IG0sIHJbaV0gLT0gbSAqIHJbaSAtIDFdO1xuICBhW24gLSAxXSA9IHJbbiAtIDFdIC8gYltuIC0gMV07XG4gIGZvciAoaSA9IG4gLSAyOyBpID49IDA7IC0taSkgYVtpXSA9IChyW2ldIC0gYVtpICsgMV0pIC8gYltpXTtcbiAgYltuIC0gMV0gPSAoeFtuXSArIGFbbiAtIDFdKSAvIDI7XG4gIGZvciAoaSA9IDA7IGkgPCBuIC0gMTsgKytpKSBiW2ldID0gMiAqIHhbaSArIDFdIC0gYVtpICsgMV07XG4gIHJldHVybiBbYSwgYl07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ldyBOYXR1cmFsKGNvbnRleHQpO1xufVxuIiwiaW1wb3J0IGN1cnZlTGluZWFyIGZyb20gXCIuL2xpbmVhclwiO1xuXG5leHBvcnQgdmFyIGN1cnZlUmFkaWFsTGluZWFyID0gY3VydmVSYWRpYWwoY3VydmVMaW5lYXIpO1xuXG5mdW5jdGlvbiBSYWRpYWwoY3VydmUpIHtcbiAgdGhpcy5fY3VydmUgPSBjdXJ2ZTtcbn1cblxuUmFkaWFsLnByb3RvdHlwZSA9IHtcbiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9jdXJ2ZS5hcmVhU3RhcnQoKTtcbiAgfSxcbiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fY3VydmUuYXJlYUVuZCgpO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2N1cnZlLmxpbmVTdGFydCgpO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9jdXJ2ZS5saW5lRW5kKCk7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbihhLCByKSB7XG4gICAgdGhpcy5fY3VydmUucG9pbnQociAqIE1hdGguc2luKGEpLCByICogLU1hdGguY29zKGEpKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3VydmVSYWRpYWwoY3VydmUpIHtcblxuICBmdW5jdGlvbiByYWRpYWwoY29udGV4dCkge1xuICAgIHJldHVybiBuZXcgUmFkaWFsKGN1cnZlKGNvbnRleHQpKTtcbiAgfVxuXG4gIHJhZGlhbC5fY3VydmUgPSBjdXJ2ZTtcblxuICByZXR1cm4gcmFkaWFsO1xufVxuIiwiZnVuY3Rpb24gU3RlcChjb250ZXh0LCB0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLl90ID0gdDtcbn1cblxuU3RlcC5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feCA9IHRoaXMuX3kgPSBOYU47XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoMCA8IHRoaXMuX3QgJiYgdGhpcy5fdCA8IDEgJiYgdGhpcy5fcG9pbnQgPT09IDIpIHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsIHRoaXMuX3kpO1xuICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBpZiAodGhpcy5fbGluZSA+PSAwKSB0aGlzLl90ID0gMSAtIHRoaXMuX3QsIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrO1xuICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IC8vIHByb2NlZWRcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKHRoaXMuX3QgPD0gMCkge1xuICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsIHkpO1xuICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB4MSA9IHRoaXMuX3ggKiAoMSAtIHRoaXMuX3QpICsgeCAqIHRoaXMuX3Q7XG4gICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeDEsIHRoaXMuX3kpO1xuICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHgxLCB5KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5feCA9IHgsIHRoaXMuX3kgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAwLjUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RlcEJlZm9yZShjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0ZXBBZnRlcihjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAxKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGIgPCBhID8gLTEgOiBiID4gYSA/IDEgOiBiID49IGEgPyAwIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZCkge1xuICByZXR1cm4gZDtcbn1cbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyBhcmN9IGZyb20gXCIuL2FyY1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGFyZWF9IGZyb20gXCIuL2FyZWFcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBsaW5lfSBmcm9tIFwiLi9saW5lXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcGllfSBmcm9tIFwiLi9waWVcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBhcmVhUmFkaWFsLCBkZWZhdWx0IGFzIHJhZGlhbEFyZWF9IGZyb20gXCIuL2FyZWFSYWRpYWxcIjsgLy8gTm90ZTogcmFkaWFsQXJlYSBpcyBkZXByZWNhdGVkIVxuZXhwb3J0IHtkZWZhdWx0IGFzIGxpbmVSYWRpYWwsIGRlZmF1bHQgYXMgcmFkaWFsTGluZX0gZnJvbSBcIi4vbGluZVJhZGlhbFwiOyAvLyBOb3RlOiByYWRpYWxMaW5lIGlzIGRlcHJlY2F0ZWQhXG5leHBvcnQge2RlZmF1bHQgYXMgcG9pbnRSYWRpYWx9IGZyb20gXCIuL3BvaW50UmFkaWFsXCI7XG5leHBvcnQge2xpbmtIb3Jpem9udGFsLCBsaW5rVmVydGljYWwsIGxpbmtSYWRpYWx9IGZyb20gXCIuL2xpbmsvaW5kZXhcIjtcblxuZXhwb3J0IHtkZWZhdWx0IGFzIHN5bWJvbCwgc3ltYm9sc30gZnJvbSBcIi4vc3ltYm9sXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3ltYm9sQ2lyY2xlfSBmcm9tIFwiLi9zeW1ib2wvY2lyY2xlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3ltYm9sQ3Jvc3N9IGZyb20gXCIuL3N5bWJvbC9jcm9zc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN5bWJvbERpYW1vbmR9IGZyb20gXCIuL3N5bWJvbC9kaWFtb25kXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3ltYm9sU3F1YXJlfSBmcm9tIFwiLi9zeW1ib2wvc3F1YXJlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3ltYm9sU3Rhcn0gZnJvbSBcIi4vc3ltYm9sL3N0YXJcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xUcmlhbmdsZX0gZnJvbSBcIi4vc3ltYm9sL3RyaWFuZ2xlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3ltYm9sV3llfSBmcm9tIFwiLi9zeW1ib2wvd3llXCI7XG5cbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZUJhc2lzQ2xvc2VkfSBmcm9tIFwiLi9jdXJ2ZS9iYXNpc0Nsb3NlZFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQmFzaXNPcGVufSBmcm9tIFwiLi9jdXJ2ZS9iYXNpc09wZW5cIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZUJhc2lzfSBmcm9tIFwiLi9jdXJ2ZS9iYXNpc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQnVuZGxlfSBmcm9tIFwiLi9jdXJ2ZS9idW5kbGVcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZUNhcmRpbmFsQ2xvc2VkfSBmcm9tIFwiLi9jdXJ2ZS9jYXJkaW5hbENsb3NlZFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQ2FyZGluYWxPcGVufSBmcm9tIFwiLi9jdXJ2ZS9jYXJkaW5hbE9wZW5cIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZUNhcmRpbmFsfSBmcm9tIFwiLi9jdXJ2ZS9jYXJkaW5hbFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQ2F0bXVsbFJvbUNsb3NlZH0gZnJvbSBcIi4vY3VydmUvY2F0bXVsbFJvbUNsb3NlZFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQ2F0bXVsbFJvbU9wZW59IGZyb20gXCIuL2N1cnZlL2NhdG11bGxSb21PcGVuXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVDYXRtdWxsUm9tfSBmcm9tIFwiLi9jdXJ2ZS9jYXRtdWxsUm9tXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVMaW5lYXJDbG9zZWR9IGZyb20gXCIuL2N1cnZlL2xpbmVhckNsb3NlZFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlTGluZWFyfSBmcm9tIFwiLi9jdXJ2ZS9saW5lYXJcIjtcbmV4cG9ydCB7bW9ub3RvbmVYIGFzIGN1cnZlTW9ub3RvbmVYLCBtb25vdG9uZVkgYXMgY3VydmVNb25vdG9uZVl9IGZyb20gXCIuL2N1cnZlL21vbm90b25lXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVOYXR1cmFsfSBmcm9tIFwiLi9jdXJ2ZS9uYXR1cmFsXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVTdGVwLCBzdGVwQWZ0ZXIgYXMgY3VydmVTdGVwQWZ0ZXIsIHN0ZXBCZWZvcmUgYXMgY3VydmVTdGVwQmVmb3JlfSBmcm9tIFwiLi9jdXJ2ZS9zdGVwXCI7XG5cbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja30gZnJvbSBcIi4vc3RhY2tcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja09mZnNldEV4cGFuZH0gZnJvbSBcIi4vb2Zmc2V0L2V4cGFuZFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT2Zmc2V0RGl2ZXJnaW5nfSBmcm9tIFwiLi9vZmZzZXQvZGl2ZXJnaW5nXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RhY2tPZmZzZXROb25lfSBmcm9tIFwiLi9vZmZzZXQvbm9uZVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT2Zmc2V0U2lsaG91ZXR0ZX0gZnJvbSBcIi4vb2Zmc2V0L3NpbGhvdWV0dGVcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja09mZnNldFdpZ2dsZX0gZnJvbSBcIi4vb2Zmc2V0L3dpZ2dsZVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT3JkZXJBcHBlYXJhbmNlfSBmcm9tIFwiLi9vcmRlci9hcHBlYXJhbmNlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RhY2tPcmRlckFzY2VuZGluZ30gZnJvbSBcIi4vb3JkZXIvYXNjZW5kaW5nXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RhY2tPcmRlckRlc2NlbmRpbmd9IGZyb20gXCIuL29yZGVyL2Rlc2NlbmRpbmdcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja09yZGVySW5zaWRlT3V0fSBmcm9tIFwiLi9vcmRlci9pbnNpZGVPdXRcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja09yZGVyTm9uZX0gZnJvbSBcIi4vb3JkZXIvbm9uZVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT3JkZXJSZXZlcnNlfSBmcm9tIFwiLi9vcmRlci9yZXZlcnNlXCI7XG4iLCJpbXBvcnQge3BhdGh9IGZyb20gXCJkMy1wYXRoXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCBjdXJ2ZUxpbmVhciBmcm9tIFwiLi9jdXJ2ZS9saW5lYXJcIjtcbmltcG9ydCB7eCBhcyBwb2ludFgsIHkgYXMgcG9pbnRZfSBmcm9tIFwiLi9wb2ludFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHggPSBwb2ludFgsXG4gICAgICB5ID0gcG9pbnRZLFxuICAgICAgZGVmaW5lZCA9IGNvbnN0YW50KHRydWUpLFxuICAgICAgY29udGV4dCA9IG51bGwsXG4gICAgICBjdXJ2ZSA9IGN1cnZlTGluZWFyLFxuICAgICAgb3V0cHV0ID0gbnVsbDtcblxuICBmdW5jdGlvbiBsaW5lKGRhdGEpIHtcbiAgICB2YXIgaSxcbiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLFxuICAgICAgICBkLFxuICAgICAgICBkZWZpbmVkMCA9IGZhbHNlLFxuICAgICAgICBidWZmZXI7XG5cbiAgICBpZiAoY29udGV4dCA9PSBudWxsKSBvdXRwdXQgPSBjdXJ2ZShidWZmZXIgPSBwYXRoKCkpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8PSBuOyArK2kpIHtcbiAgICAgIGlmICghKGkgPCBuICYmIGRlZmluZWQoZCA9IGRhdGFbaV0sIGksIGRhdGEpKSA9PT0gZGVmaW5lZDApIHtcbiAgICAgICAgaWYgKGRlZmluZWQwID0gIWRlZmluZWQwKSBvdXRwdXQubGluZVN0YXJ0KCk7XG4gICAgICAgIGVsc2Ugb3V0cHV0LmxpbmVFbmQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChkZWZpbmVkMCkgb3V0cHV0LnBvaW50KCt4KGQsIGksIGRhdGEpLCAreShkLCBpLCBkYXRhKSk7XG4gICAgfVxuXG4gICAgaWYgKGJ1ZmZlcikgcmV0dXJuIG91dHB1dCA9IG51bGwsIGJ1ZmZlciArIFwiXCIgfHwgbnVsbDtcbiAgfVxuXG4gIGxpbmUueCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGxpbmUpIDogeDtcbiAgfTtcblxuICBsaW5lLnkgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBsaW5lKSA6IHk7XG4gIH07XG5cbiAgbGluZS5kZWZpbmVkID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRlZmluZWQgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGxpbmUpIDogZGVmaW5lZDtcbiAgfTtcblxuICBsaW5lLmN1cnZlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGN1cnZlID0gXywgY29udGV4dCAhPSBudWxsICYmIChvdXRwdXQgPSBjdXJ2ZShjb250ZXh0KSksIGxpbmUpIDogY3VydmU7XG4gIH07XG5cbiAgbGluZS5jb250ZXh0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKF8gPT0gbnVsbCA/IGNvbnRleHQgPSBvdXRwdXQgPSBudWxsIDogb3V0cHV0ID0gY3VydmUoY29udGV4dCA9IF8pLCBsaW5lKSA6IGNvbnRleHQ7XG4gIH07XG5cbiAgcmV0dXJuIGxpbmU7XG59XG4iLCJpbXBvcnQgY3VydmVSYWRpYWwsIHtjdXJ2ZVJhZGlhbExpbmVhcn0gZnJvbSBcIi4vY3VydmUvcmFkaWFsXCI7XG5pbXBvcnQgbGluZSBmcm9tIFwiLi9saW5lXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5lUmFkaWFsKGwpIHtcbiAgdmFyIGMgPSBsLmN1cnZlO1xuXG4gIGwuYW5nbGUgPSBsLngsIGRlbGV0ZSBsLng7XG4gIGwucmFkaXVzID0gbC55LCBkZWxldGUgbC55O1xuXG4gIGwuY3VydmUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7XG4gIH07XG5cbiAgcmV0dXJuIGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbGluZVJhZGlhbChsaW5lKCkuY3VydmUoY3VydmVSYWRpYWxMaW5lYXIpKTtcbn1cbiIsImltcG9ydCB7cGF0aH0gZnJvbSBcImQzLXBhdGhcIjtcbmltcG9ydCB7c2xpY2V9IGZyb20gXCIuLi9hcnJheVwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuLi9jb25zdGFudFwiO1xuaW1wb3J0IHt4IGFzIHBvaW50WCwgeSBhcyBwb2ludFl9IGZyb20gXCIuLi9wb2ludFwiO1xuaW1wb3J0IHBvaW50UmFkaWFsIGZyb20gXCIuLi9wb2ludFJhZGlhbFwiO1xuXG5mdW5jdGlvbiBsaW5rU291cmNlKGQpIHtcbiAgcmV0dXJuIGQuc291cmNlO1xufVxuXG5mdW5jdGlvbiBsaW5rVGFyZ2V0KGQpIHtcbiAgcmV0dXJuIGQudGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBsaW5rKGN1cnZlKSB7XG4gIHZhciBzb3VyY2UgPSBsaW5rU291cmNlLFxuICAgICAgdGFyZ2V0ID0gbGlua1RhcmdldCxcbiAgICAgIHggPSBwb2ludFgsXG4gICAgICB5ID0gcG9pbnRZLFxuICAgICAgY29udGV4dCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gbGluaygpIHtcbiAgICB2YXIgYnVmZmVyLCBhcmd2ID0gc2xpY2UuY2FsbChhcmd1bWVudHMpLCBzID0gc291cmNlLmFwcGx5KHRoaXMsIGFyZ3YpLCB0ID0gdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3YpO1xuICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IHBhdGgoKTtcbiAgICBjdXJ2ZShjb250ZXh0LCAreC5hcHBseSh0aGlzLCAoYXJndlswXSA9IHMsIGFyZ3YpKSwgK3kuYXBwbHkodGhpcywgYXJndiksICt4LmFwcGx5KHRoaXMsIChhcmd2WzBdID0gdCwgYXJndikpLCAreS5hcHBseSh0aGlzLCBhcmd2KSk7XG4gICAgaWYgKGJ1ZmZlcikgcmV0dXJuIGNvbnRleHQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICBsaW5rLnNvdXJjZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3VyY2UgPSBfLCBsaW5rKSA6IHNvdXJjZTtcbiAgfTtcblxuICBsaW5rLnRhcmdldCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0YXJnZXQgPSBfLCBsaW5rKSA6IHRhcmdldDtcbiAgfTtcblxuICBsaW5rLnggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBsaW5rKSA6IHg7XG4gIH07XG5cbiAgbGluay55ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgbGluaykgOiB5O1xuICB9O1xuXG4gIGxpbmsuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfKSwgbGluaykgOiBjb250ZXh0O1xuICB9O1xuXG4gIHJldHVybiBsaW5rO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZUhvcml6b250YWwoY29udGV4dCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgY29udGV4dC5tb3ZlVG8oeDAsIHkwKTtcbiAgY29udGV4dC5iZXppZXJDdXJ2ZVRvKHgwID0gKHgwICsgeDEpIC8gMiwgeTAsIHgwLCB5MSwgeDEsIHkxKTtcbn1cblxuZnVuY3Rpb24gY3VydmVWZXJ0aWNhbChjb250ZXh0LCB4MCwgeTAsIHgxLCB5MSkge1xuICBjb250ZXh0Lm1vdmVUbyh4MCwgeTApO1xuICBjb250ZXh0LmJlemllckN1cnZlVG8oeDAsIHkwID0gKHkwICsgeTEpIC8gMiwgeDEsIHkwLCB4MSwgeTEpO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZVJhZGlhbChjb250ZXh0LCB4MCwgeTAsIHgxLCB5MSkge1xuICB2YXIgcDAgPSBwb2ludFJhZGlhbCh4MCwgeTApLFxuICAgICAgcDEgPSBwb2ludFJhZGlhbCh4MCwgeTAgPSAoeTAgKyB5MSkgLyAyKSxcbiAgICAgIHAyID0gcG9pbnRSYWRpYWwoeDEsIHkwKSxcbiAgICAgIHAzID0gcG9pbnRSYWRpYWwoeDEsIHkxKTtcbiAgY29udGV4dC5tb3ZlVG8ocDBbMF0sIHAwWzFdKTtcbiAgY29udGV4dC5iZXppZXJDdXJ2ZVRvKHAxWzBdLCBwMVsxXSwgcDJbMF0sIHAyWzFdLCBwM1swXSwgcDNbMV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlua0hvcml6b250YWwoKSB7XG4gIHJldHVybiBsaW5rKGN1cnZlSG9yaXpvbnRhbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5rVmVydGljYWwoKSB7XG4gIHJldHVybiBsaW5rKGN1cnZlVmVydGljYWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlua1JhZGlhbCgpIHtcbiAgdmFyIGwgPSBsaW5rKGN1cnZlUmFkaWFsKTtcbiAgbC5hbmdsZSA9IGwueCwgZGVsZXRlIGwueDtcbiAgbC5yYWRpdXMgPSBsLnksIGRlbGV0ZSBsLnk7XG4gIHJldHVybiBsO1xufVxuIiwiZXhwb3J0IHZhciBhYnMgPSBNYXRoLmFicztcbmV4cG9ydCB2YXIgYXRhbjIgPSBNYXRoLmF0YW4yO1xuZXhwb3J0IHZhciBjb3MgPSBNYXRoLmNvcztcbmV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciBzaW4gPSBNYXRoLnNpbjtcbmV4cG9ydCB2YXIgc3FydCA9IE1hdGguc3FydDtcblxuZXhwb3J0IHZhciBlcHNpbG9uID0gMWUtMTI7XG5leHBvcnQgdmFyIHBpID0gTWF0aC5QSTtcbmV4cG9ydCB2YXIgaGFsZlBpID0gcGkgLyAyO1xuZXhwb3J0IHZhciB0YXUgPSAyICogcGk7XG5cbmV4cG9ydCBmdW5jdGlvbiBhY29zKHgpIHtcbiAgcmV0dXJuIHggPiAxID8gMCA6IHggPCAtMSA/IHBpIDogTWF0aC5hY29zKHgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNpbih4KSB7XG4gIHJldHVybiB4ID49IDEgPyBoYWxmUGkgOiB4IDw9IC0xID8gLWhhbGZQaSA6IE1hdGguYXNpbih4KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge31cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHtcbiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDEpKSByZXR1cm47XG4gIGZvciAodmFyIGksIGogPSAwLCBkLCBkeSwgeXAsIHluLCBuLCBtID0gc2VyaWVzW29yZGVyWzBdXS5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHlwID0geW4gPSAwLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChkeSA9IChkID0gc2VyaWVzW29yZGVyW2ldXVtqXSlbMV0gLSBkWzBdKSA+PSAwKSB7XG4gICAgICAgIGRbMF0gPSB5cCwgZFsxXSA9IHlwICs9IGR5O1xuICAgICAgfSBlbHNlIGlmIChkeSA8IDApIHtcbiAgICAgICAgZFsxXSA9IHluLCBkWzBdID0geW4gKz0gZHk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkWzBdID0geXA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgbm9uZSBmcm9tIFwiLi9ub25lXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHtcbiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDApKSByZXR1cm47XG4gIGZvciAodmFyIGksIG4sIGogPSAwLCBtID0gc2VyaWVzWzBdLmxlbmd0aCwgeTsgaiA8IG07ICsraikge1xuICAgIGZvciAoeSA9IGkgPSAwOyBpIDwgbjsgKytpKSB5ICs9IHNlcmllc1tpXVtqXVsxXSB8fCAwO1xuICAgIGlmICh5KSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBzZXJpZXNbaV1bal1bMV0gLz0geTtcbiAgfVxuICBub25lKHNlcmllcywgb3JkZXIpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VyaWVzLCBvcmRlcikge1xuICBpZiAoISgobiA9IHNlcmllcy5sZW5ndGgpID4gMSkpIHJldHVybjtcbiAgZm9yICh2YXIgaSA9IDEsIGosIHMwLCBzMSA9IHNlcmllc1tvcmRlclswXV0sIG4sIG0gPSBzMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICBzMCA9IHMxLCBzMSA9IHNlcmllc1tvcmRlcltpXV07XG4gICAgZm9yIChqID0gMDsgaiA8IG07ICsraikge1xuICAgICAgczFbal1bMV0gKz0gczFbal1bMF0gPSBpc05hTihzMFtqXVsxXSkgPyBzMFtqXVswXSA6IHMwW2pdWzFdO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IG5vbmUgZnJvbSBcIi4vbm9uZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZXJpZXMsIG9yZGVyKSB7XG4gIGlmICghKChuID0gc2VyaWVzLmxlbmd0aCkgPiAwKSkgcmV0dXJuO1xuICBmb3IgKHZhciBqID0gMCwgczAgPSBzZXJpZXNbb3JkZXJbMF1dLCBuLCBtID0gczAubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIHkgPSAwOyBpIDwgbjsgKytpKSB5ICs9IHNlcmllc1tpXVtqXVsxXSB8fCAwO1xuICAgIHMwW2pdWzFdICs9IHMwW2pdWzBdID0gLXkgLyAyO1xuICB9XG4gIG5vbmUoc2VyaWVzLCBvcmRlcik7XG59XG4iLCJpbXBvcnQgbm9uZSBmcm9tIFwiLi9ub25lXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHtcbiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDApIHx8ICEoKG0gPSAoczAgPSBzZXJpZXNbb3JkZXJbMF1dKS5sZW5ndGgpID4gMCkpIHJldHVybjtcbiAgZm9yICh2YXIgeSA9IDAsIGogPSAxLCBzMCwgbSwgbjsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGkgPSAwLCBzMSA9IDAsIHMyID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdmFyIHNpID0gc2VyaWVzW29yZGVyW2ldXSxcbiAgICAgICAgICBzaWowID0gc2lbal1bMV0gfHwgMCxcbiAgICAgICAgICBzaWoxID0gc2lbaiAtIDFdWzFdIHx8IDAsXG4gICAgICAgICAgczMgPSAoc2lqMCAtIHNpajEpIC8gMjtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgaTsgKytrKSB7XG4gICAgICAgIHZhciBzayA9IHNlcmllc1tvcmRlcltrXV0sXG4gICAgICAgICAgICBza2owID0gc2tbal1bMV0gfHwgMCxcbiAgICAgICAgICAgIHNrajEgPSBza1tqIC0gMV1bMV0gfHwgMDtcbiAgICAgICAgczMgKz0gc2tqMCAtIHNrajE7XG4gICAgICB9XG4gICAgICBzMSArPSBzaWowLCBzMiArPSBzMyAqIHNpajA7XG4gICAgfVxuICAgIHMwW2ogLSAxXVsxXSArPSBzMFtqIC0gMV1bMF0gPSB5O1xuICAgIGlmIChzMSkgeSAtPSBzMiAvIHMxO1xuICB9XG4gIHMwW2ogLSAxXVsxXSArPSBzMFtqIC0gMV1bMF0gPSB5O1xuICBub25lKHNlcmllcywgb3JkZXIpO1xufVxuIiwiaW1wb3J0IG5vbmUgZnJvbSBcIi4vbm9uZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZXJpZXMpIHtcbiAgdmFyIHBlYWtzID0gc2VyaWVzLm1hcChwZWFrKTtcbiAgcmV0dXJuIG5vbmUoc2VyaWVzKS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHBlYWtzW2FdIC0gcGVha3NbYl07IH0pO1xufVxuXG5mdW5jdGlvbiBwZWFrKHNlcmllcykge1xuICB2YXIgaSA9IC0xLCBqID0gMCwgbiA9IHNlcmllcy5sZW5ndGgsIHZpLCB2aiA9IC1JbmZpbml0eTtcbiAgd2hpbGUgKCsraSA8IG4pIGlmICgodmkgPSArc2VyaWVzW2ldWzFdKSA+IHZqKSB2aiA9IHZpLCBqID0gaTtcbiAgcmV0dXJuIGo7XG59XG4iLCJpbXBvcnQgbm9uZSBmcm9tIFwiLi9ub25lXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcykge1xuICB2YXIgc3VtcyA9IHNlcmllcy5tYXAoc3VtKTtcbiAgcmV0dXJuIG5vbmUoc2VyaWVzKS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHN1bXNbYV0gLSBzdW1zW2JdOyB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1bShzZXJpZXMpIHtcbiAgdmFyIHMgPSAwLCBpID0gLTEsIG4gPSBzZXJpZXMubGVuZ3RoLCB2O1xuICB3aGlsZSAoKytpIDwgbikgaWYgKHYgPSArc2VyaWVzW2ldWzFdKSBzICs9IHY7XG4gIHJldHVybiBzO1xufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmdcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VyaWVzKSB7XG4gIHJldHVybiBhc2NlbmRpbmcoc2VyaWVzKS5yZXZlcnNlKCk7XG59XG4iLCJpbXBvcnQgYXBwZWFyYW5jZSBmcm9tIFwiLi9hcHBlYXJhbmNlXCI7XG5pbXBvcnQge3N1bX0gZnJvbSBcIi4vYXNjZW5kaW5nXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcykge1xuICB2YXIgbiA9IHNlcmllcy5sZW5ndGgsXG4gICAgICBpLFxuICAgICAgaixcbiAgICAgIHN1bXMgPSBzZXJpZXMubWFwKHN1bSksXG4gICAgICBvcmRlciA9IGFwcGVhcmFuY2Uoc2VyaWVzKSxcbiAgICAgIHRvcCA9IDAsXG4gICAgICBib3R0b20gPSAwLFxuICAgICAgdG9wcyA9IFtdLFxuICAgICAgYm90dG9tcyA9IFtdO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBqID0gb3JkZXJbaV07XG4gICAgaWYgKHRvcCA8IGJvdHRvbSkge1xuICAgICAgdG9wICs9IHN1bXNbal07XG4gICAgICB0b3BzLnB1c2goaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvdHRvbSArPSBzdW1zW2pdO1xuICAgICAgYm90dG9tcy5wdXNoKGopO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBib3R0b21zLnJldmVyc2UoKS5jb25jYXQodG9wcyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZXJpZXMpIHtcbiAgdmFyIG4gPSBzZXJpZXMubGVuZ3RoLCBvID0gbmV3IEFycmF5KG4pO1xuICB3aGlsZSAoLS1uID49IDApIG9bbl0gPSBuO1xuICByZXR1cm4gbztcbn1cbiIsImltcG9ydCBub25lIGZyb20gXCIuL25vbmVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VyaWVzKSB7XG4gIHJldHVybiBub25lKHNlcmllcykucmV2ZXJzZSgpO1xufVxuIiwiaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgZGVzY2VuZGluZyBmcm9tIFwiLi9kZXNjZW5kaW5nXCI7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4vaWRlbnRpdHlcIjtcbmltcG9ydCB7dGF1fSBmcm9tIFwiLi9tYXRoXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgdmFsdWUgPSBpZGVudGl0eSxcbiAgICAgIHNvcnRWYWx1ZXMgPSBkZXNjZW5kaW5nLFxuICAgICAgc29ydCA9IG51bGwsXG4gICAgICBzdGFydEFuZ2xlID0gY29uc3RhbnQoMCksXG4gICAgICBlbmRBbmdsZSA9IGNvbnN0YW50KHRhdSksXG4gICAgICBwYWRBbmdsZSA9IGNvbnN0YW50KDApO1xuXG4gIGZ1bmN0aW9uIHBpZShkYXRhKSB7XG4gICAgdmFyIGksXG4gICAgICAgIG4gPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgaixcbiAgICAgICAgayxcbiAgICAgICAgc3VtID0gMCxcbiAgICAgICAgaW5kZXggPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGFyY3MgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGEwID0gK3N0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgZGEgPSBNYXRoLm1pbih0YXUsIE1hdGgubWF4KC10YXUsIGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBhMCkpLFxuICAgICAgICBhMSxcbiAgICAgICAgcCA9IE1hdGgubWluKE1hdGguYWJzKGRhKSAvIG4sIHBhZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpLFxuICAgICAgICBwYSA9IHAgKiAoZGEgPCAwID8gLTEgOiAxKSxcbiAgICAgICAgdjtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgodiA9IGFyY3NbaW5kZXhbaV0gPSBpXSA9ICt2YWx1ZShkYXRhW2ldLCBpLCBkYXRhKSkgPiAwKSB7XG4gICAgICAgIHN1bSArPSB2O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9wdGlvbmFsbHkgc29ydCB0aGUgYXJjcyBieSBwcmV2aW91c2x5LWNvbXB1dGVkIHZhbHVlcyBvciBieSBkYXRhLlxuICAgIGlmIChzb3J0VmFsdWVzICE9IG51bGwpIGluZGV4LnNvcnQoZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gc29ydFZhbHVlcyhhcmNzW2ldLCBhcmNzW2pdKTsgfSk7XG4gICAgZWxzZSBpZiAoc29ydCAhPSBudWxsKSBpbmRleC5zb3J0KGZ1bmN0aW9uKGksIGopIHsgcmV0dXJuIHNvcnQoZGF0YVtpXSwgZGF0YVtqXSk7IH0pO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgYXJjcyEgVGhleSBhcmUgc3RvcmVkIGluIHRoZSBvcmlnaW5hbCBkYXRhJ3Mgb3JkZXIuXG4gICAgZm9yIChpID0gMCwgayA9IHN1bSA/IChkYSAtIG4gKiBwYSkgLyBzdW0gOiAwOyBpIDwgbjsgKytpLCBhMCA9IGExKSB7XG4gICAgICBqID0gaW5kZXhbaV0sIHYgPSBhcmNzW2pdLCBhMSA9IGEwICsgKHYgPiAwID8gdiAqIGsgOiAwKSArIHBhLCBhcmNzW2pdID0ge1xuICAgICAgICBkYXRhOiBkYXRhW2pdLFxuICAgICAgICBpbmRleDogaSxcbiAgICAgICAgdmFsdWU6IHYsXG4gICAgICAgIHN0YXJ0QW5nbGU6IGEwLFxuICAgICAgICBlbmRBbmdsZTogYTEsXG4gICAgICAgIHBhZEFuZ2xlOiBwXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBhcmNzO1xuICB9XG5cbiAgcGllLnZhbHVlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHBpZSkgOiB2YWx1ZTtcbiAgfTtcblxuICBwaWUuc29ydFZhbHVlcyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0VmFsdWVzID0gXywgc29ydCA9IG51bGwsIHBpZSkgOiBzb3J0VmFsdWVzO1xuICB9O1xuXG4gIHBpZS5zb3J0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvcnQgPSBfLCBzb3J0VmFsdWVzID0gbnVsbCwgcGllKSA6IHNvcnQ7XG4gIH07XG5cbiAgcGllLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RhcnRBbmdsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBwaWUpIDogc3RhcnRBbmdsZTtcbiAgfTtcblxuICBwaWUuZW5kQW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZW5kQW5nbGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgcGllKSA6IGVuZEFuZ2xlO1xuICB9O1xuXG4gIHBpZS5wYWRBbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRBbmdsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBwaWUpIDogcGFkQW5nbGU7XG4gIH07XG5cbiAgcmV0dXJuIHBpZTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiB4KHApIHtcbiAgcmV0dXJuIHBbMF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB5KHApIHtcbiAgcmV0dXJuIHBbMV07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCB5KSB7XG4gIHJldHVybiBbKHkgPSAreSkgKiBNYXRoLmNvcyh4IC09IE1hdGguUEkgLyAyKSwgeSAqIE1hdGguc2luKHgpXTtcbn1cbiIsImltcG9ydCB7c2xpY2V9IGZyb20gXCIuL2FycmF5XCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCBvZmZzZXROb25lIGZyb20gXCIuL29mZnNldC9ub25lXCI7XG5pbXBvcnQgb3JkZXJOb25lIGZyb20gXCIuL29yZGVyL25vbmVcIjtcblxuZnVuY3Rpb24gc3RhY2tWYWx1ZShkLCBrZXkpIHtcbiAgcmV0dXJuIGRba2V5XTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBrZXlzID0gY29uc3RhbnQoW10pLFxuICAgICAgb3JkZXIgPSBvcmRlck5vbmUsXG4gICAgICBvZmZzZXQgPSBvZmZzZXROb25lLFxuICAgICAgdmFsdWUgPSBzdGFja1ZhbHVlO1xuXG4gIGZ1bmN0aW9uIHN0YWNrKGRhdGEpIHtcbiAgICB2YXIga3ogPSBrZXlzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIGksXG4gICAgICAgIG0gPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgbiA9IGt6Lmxlbmd0aCxcbiAgICAgICAgc3ogPSBuZXcgQXJyYXkobiksXG4gICAgICAgIG96O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgZm9yICh2YXIga2kgPSBreltpXSwgc2kgPSBzeltpXSA9IG5ldyBBcnJheShtKSwgaiA9IDAsIHNpajsgaiA8IG07ICsraikge1xuICAgICAgICBzaVtqXSA9IHNpaiA9IFswLCArdmFsdWUoZGF0YVtqXSwga2ksIGosIGRhdGEpXTtcbiAgICAgICAgc2lqLmRhdGEgPSBkYXRhW2pdO1xuICAgICAgfVxuICAgICAgc2kua2V5ID0ga2k7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMCwgb3ogPSBvcmRlcihzeik7IGkgPCBuOyArK2kpIHtcbiAgICAgIHN6W296W2ldXS5pbmRleCA9IGk7XG4gICAgfVxuXG4gICAgb2Zmc2V0KHN6LCBveik7XG4gICAgcmV0dXJuIHN6O1xuICB9XG5cbiAgc3RhY2sua2V5cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrZXlzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChzbGljZS5jYWxsKF8pKSwgc3RhY2spIDoga2V5cztcbiAgfTtcblxuICBzdGFjay52YWx1ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBzdGFjaykgOiB2YWx1ZTtcbiAgfTtcblxuICBzdGFjay5vcmRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvcmRlciA9IF8gPT0gbnVsbCA/IG9yZGVyTm9uZSA6IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoc2xpY2UuY2FsbChfKSksIHN0YWNrKSA6IG9yZGVyO1xuICB9O1xuXG4gIHN0YWNrLm9mZnNldCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvZmZzZXQgPSBfID09IG51bGwgPyBvZmZzZXROb25lIDogXywgc3RhY2spIDogb2Zmc2V0O1xuICB9O1xuXG4gIHJldHVybiBzdGFjaztcbn1cbiIsImltcG9ydCB7cGF0aH0gZnJvbSBcImQzLXBhdGhcIjtcbmltcG9ydCBjaXJjbGUgZnJvbSBcIi4vc3ltYm9sL2NpcmNsZVwiO1xuaW1wb3J0IGNyb3NzIGZyb20gXCIuL3N5bWJvbC9jcm9zc1wiO1xuaW1wb3J0IGRpYW1vbmQgZnJvbSBcIi4vc3ltYm9sL2RpYW1vbmRcIjtcbmltcG9ydCBzdGFyIGZyb20gXCIuL3N5bWJvbC9zdGFyXCI7XG5pbXBvcnQgc3F1YXJlIGZyb20gXCIuL3N5bWJvbC9zcXVhcmVcIjtcbmltcG9ydCB0cmlhbmdsZSBmcm9tIFwiLi9zeW1ib2wvdHJpYW5nbGVcIjtcbmltcG9ydCB3eWUgZnJvbSBcIi4vc3ltYm9sL3d5ZVwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50XCI7XG5cbmV4cG9ydCB2YXIgc3ltYm9scyA9IFtcbiAgY2lyY2xlLFxuICBjcm9zcyxcbiAgZGlhbW9uZCxcbiAgc3F1YXJlLFxuICBzdGFyLFxuICB0cmlhbmdsZSxcbiAgd3llXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHR5cGUgPSBjb25zdGFudChjaXJjbGUpLFxuICAgICAgc2l6ZSA9IGNvbnN0YW50KDY0KSxcbiAgICAgIGNvbnRleHQgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHN5bWJvbCgpIHtcbiAgICB2YXIgYnVmZmVyO1xuICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IHBhdGgoKTtcbiAgICB0eXBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykuZHJhdyhjb250ZXh0LCArc2l6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gY29udGV4dCA9IG51bGwsIGJ1ZmZlciArIFwiXCIgfHwgbnVsbDtcbiAgfVxuXG4gIHN5bWJvbC50eXBlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHR5cGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCBzeW1ib2wpIDogdHlwZTtcbiAgfTtcblxuICBzeW1ib2wuc2l6ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzaXplID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHN5bWJvbCkgOiBzaXplO1xuICB9O1xuXG4gIHN5bWJvbC5jb250ZXh0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnRleHQgPSBfID09IG51bGwgPyBudWxsIDogXywgc3ltYm9sKSA6IGNvbnRleHQ7XG4gIH07XG5cbiAgcmV0dXJuIHN5bWJvbDtcbn1cbiIsImltcG9ydCB7cGksIHRhdX0gZnJvbSBcIi4uL21hdGhcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7XG4gICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIHBpKTtcbiAgICBjb250ZXh0Lm1vdmVUbyhyLCAwKTtcbiAgICBjb250ZXh0LmFyYygwLCAwLCByLCAwLCB0YXUpO1xuICB9XG59O1xuIiwiZXhwb3J0IGRlZmF1bHQge1xuICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7XG4gICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIDUpIC8gMjtcbiAgICBjb250ZXh0Lm1vdmVUbygtMyAqIHIsIC1yKTtcbiAgICBjb250ZXh0LmxpbmVUbygtciwgLXIpO1xuICAgIGNvbnRleHQubGluZVRvKC1yLCAtMyAqIHIpO1xuICAgIGNvbnRleHQubGluZVRvKHIsIC0zICogcik7XG4gICAgY29udGV4dC5saW5lVG8ociwgLXIpO1xuICAgIGNvbnRleHQubGluZVRvKDMgKiByLCAtcik7XG4gICAgY29udGV4dC5saW5lVG8oMyAqIHIsIHIpO1xuICAgIGNvbnRleHQubGluZVRvKHIsIHIpO1xuICAgIGNvbnRleHQubGluZVRvKHIsIDMgKiByKTtcbiAgICBjb250ZXh0LmxpbmVUbygtciwgMyAqIHIpO1xuICAgIGNvbnRleHQubGluZVRvKC1yLCByKTtcbiAgICBjb250ZXh0LmxpbmVUbygtMyAqIHIsIHIpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH1cbn07XG4iLCJ2YXIgdGFuMzAgPSBNYXRoLnNxcnQoMSAvIDMpLFxuICAgIHRhbjMwXzIgPSB0YW4zMCAqIDI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6ZSkge1xuICAgIHZhciB5ID0gTWF0aC5zcXJ0KHNpemUgLyB0YW4zMF8yKSxcbiAgICAgICAgeCA9IHkgKiB0YW4zMDtcbiAgICBjb250ZXh0Lm1vdmVUbygwLCAteSk7XG4gICAgY29udGV4dC5saW5lVG8oeCwgMCk7XG4gICAgY29udGV4dC5saW5lVG8oMCwgeSk7XG4gICAgY29udGV4dC5saW5lVG8oLXgsIDApO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH1cbn07XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHtcbiAgICB2YXIgdyA9IE1hdGguc3FydChzaXplKSxcbiAgICAgICAgeCA9IC13IC8gMjtcbiAgICBjb250ZXh0LnJlY3QoeCwgeCwgdywgdyk7XG4gIH1cbn07XG4iLCJpbXBvcnQge3BpLCB0YXV9IGZyb20gXCIuLi9tYXRoXCI7XG5cbnZhciBrYSA9IDAuODkwODEzMDkxNTI5Mjg1MjI4MTAsXG4gICAga3IgPSBNYXRoLnNpbihwaSAvIDEwKSAvIE1hdGguc2luKDcgKiBwaSAvIDEwKSxcbiAgICBreCA9IE1hdGguc2luKHRhdSAvIDEwKSAqIGtyLFxuICAgIGt5ID0gLU1hdGguY29zKHRhdSAvIDEwKSAqIGtyO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHtcbiAgICB2YXIgciA9IE1hdGguc3FydChzaXplICoga2EpLFxuICAgICAgICB4ID0ga3ggKiByLFxuICAgICAgICB5ID0ga3kgKiByO1xuICAgIGNvbnRleHQubW92ZVRvKDAsIC1yKTtcbiAgICBjb250ZXh0LmxpbmVUbyh4LCB5KTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IDU7ICsraSkge1xuICAgICAgdmFyIGEgPSB0YXUgKiBpIC8gNSxcbiAgICAgICAgICBjID0gTWF0aC5jb3MoYSksXG4gICAgICAgICAgcyA9IE1hdGguc2luKGEpO1xuICAgICAgY29udGV4dC5saW5lVG8ocyAqIHIsIC1jICogcik7XG4gICAgICBjb250ZXh0LmxpbmVUbyhjICogeCAtIHMgKiB5LCBzICogeCArIGMgKiB5KTtcbiAgICB9XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgfVxufTtcbiIsInZhciBzcXJ0MyA9IE1hdGguc3FydCgzKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7XG4gICAgdmFyIHkgPSAtTWF0aC5zcXJ0KHNpemUgLyAoc3FydDMgKiAzKSk7XG4gICAgY29udGV4dC5tb3ZlVG8oMCwgeSAqIDIpO1xuICAgIGNvbnRleHQubGluZVRvKC1zcXJ0MyAqIHksIC15KTtcbiAgICBjb250ZXh0LmxpbmVUbyhzcXJ0MyAqIHksIC15KTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9XG59O1xuIiwidmFyIGMgPSAtMC41LFxuICAgIHMgPSBNYXRoLnNxcnQoMykgLyAyLFxuICAgIGsgPSAxIC8gTWF0aC5zcXJ0KDEyKSxcbiAgICBhID0gKGsgLyAyICsgMSkgKiAzO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHtcbiAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gYSksXG4gICAgICAgIHgwID0gciAvIDIsXG4gICAgICAgIHkwID0gciAqIGssXG4gICAgICAgIHgxID0geDAsXG4gICAgICAgIHkxID0gciAqIGsgKyByLFxuICAgICAgICB4MiA9IC14MSxcbiAgICAgICAgeTIgPSB5MTtcbiAgICBjb250ZXh0Lm1vdmVUbyh4MCwgeTApO1xuICAgIGNvbnRleHQubGluZVRvKHgxLCB5MSk7XG4gICAgY29udGV4dC5saW5lVG8oeDIsIHkyKTtcbiAgICBjb250ZXh0LmxpbmVUbyhjICogeDAgLSBzICogeTAsIHMgKiB4MCArIGMgKiB5MCk7XG4gICAgY29udGV4dC5saW5lVG8oYyAqIHgxIC0gcyAqIHkxLCBzICogeDEgKyBjICogeTEpO1xuICAgIGNvbnRleHQubGluZVRvKGMgKiB4MiAtIHMgKiB5MiwgcyAqIHgyICsgYyAqIHkyKTtcbiAgICBjb250ZXh0LmxpbmVUbyhjICogeDAgKyBzICogeTAsIGMgKiB5MCAtIHMgKiB4MCk7XG4gICAgY29udGV4dC5saW5lVG8oYyAqIHgxICsgcyAqIHkxLCBjICogeTEgLSBzICogeDEpO1xuICAgIGNvbnRleHQubGluZVRvKGMgKiB4MiArIHMgKiB5MiwgYyAqIHkyIC0gcyAqIHgyKTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9XG59O1xuIiwiZXhwb3J0IHtcbiAgbm93LFxuICB0aW1lcixcbiAgdGltZXJGbHVzaFxufSBmcm9tIFwiLi90aW1lclwiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHRpbWVvdXRcbn0gZnJvbSBcIi4vdGltZW91dFwiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIGludGVydmFsXG59IGZyb20gXCIuL2ludGVydmFsXCI7XG4iLCJpbXBvcnQge1RpbWVyLCBub3d9IGZyb20gXCIuL3RpbWVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lciwgdG90YWwgPSBkZWxheTtcbiAgaWYgKGRlbGF5ID09IG51bGwpIHJldHVybiB0LnJlc3RhcnQoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSwgdDtcbiAgZGVsYXkgPSArZGVsYXksIHRpbWUgPSB0aW1lID09IG51bGwgPyBub3coKSA6ICt0aW1lO1xuICB0LnJlc3RhcnQoZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7XG4gICAgZWxhcHNlZCArPSB0b3RhbDtcbiAgICB0LnJlc3RhcnQodGljaywgdG90YWwgKz0gZGVsYXksIHRpbWUpO1xuICAgIGNhbGxiYWNrKGVsYXBzZWQpO1xuICB9LCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuIiwiaW1wb3J0IHtUaW1lcn0gZnJvbSBcIi4vdGltZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICBkZWxheSA9IGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5O1xuICB0LnJlc3RhcnQoZnVuY3Rpb24oZWxhcHNlZCkge1xuICAgIHQuc3RvcCgpO1xuICAgIGNhbGxiYWNrKGVsYXBzZWQgKyBkZWxheSk7XG4gIH0sIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG4iLCJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKG51bGwsIGUpO1xuICAgIHQgPSB0Ll9uZXh0O1xuICB9XG4gIC0tZnJhbWU7XG59XG5cbmZ1bmN0aW9uIHdha2UoKSB7XG4gIGNsb2NrTm93ID0gKGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpKSArIGNsb2NrU2tldztcbiAgZnJhbWUgPSB0aW1lb3V0ID0gMDtcbiAgdHJ5IHtcbiAgICB0aW1lckZsdXNoKCk7XG4gIH0gZmluYWxseSB7XG4gICAgZnJhbWUgPSAwO1xuICAgIG5hcCgpO1xuICAgIGNsb2NrTm93ID0gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb2tlKCkge1xuICB2YXIgbm93ID0gY2xvY2subm93KCksIGRlbGF5ID0gbm93IC0gY2xvY2tMYXN0O1xuICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkpIGNsb2NrU2tldyAtPSBkZWxheSwgY2xvY2tMYXN0ID0gbm93O1xufVxuXG5mdW5jdGlvbiBuYXAoKSB7XG4gIHZhciB0MCwgdDEgPSB0YXNrSGVhZCwgdDIsIHRpbWUgPSBJbmZpbml0eTtcbiAgd2hpbGUgKHQxKSB7XG4gICAgaWYgKHQxLl9jYWxsKSB7XG4gICAgICBpZiAodGltZSA+IHQxLl90aW1lKSB0aW1lID0gdDEuX3RpbWU7XG4gICAgICB0MCA9IHQxLCB0MSA9IHQxLl9uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0MiA9IHQxLl9uZXh0LCB0MS5fbmV4dCA9IG51bGw7XG4gICAgICB0MSA9IHQwID8gdDAuX25leHQgPSB0MiA6IHRhc2tIZWFkID0gdDI7XG4gICAgfVxuICB9XG4gIHRhc2tUYWlsID0gdDA7XG4gIHNsZWVwKHRpbWUpO1xufVxuXG5mdW5jdGlvbiBzbGVlcCh0aW1lKSB7XG4gIGlmIChmcmFtZSkgcmV0dXJuOyAvLyBTb29uZXN0IGFsYXJtIGFscmVhZHkgc2V0LCBvciB3aWxsIGJlLlxuICBpZiAodGltZW91dCkgdGltZW91dCA9IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93OyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy5cbiAgaWYgKGRlbGF5ID4gMjQpIHtcbiAgICBpZiAodGltZSA8IEluZmluaXR5KSB0aW1lb3V0ID0gc2V0VGltZW91dCh3YWtlLCB0aW1lIC0gY2xvY2subm93KCkgLSBjbG9ja1NrZXcpO1xuICAgIGlmIChpbnRlcnZhbCkgaW50ZXJ2YWwgPSBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWludGVydmFsKSBjbG9ja0xhc3QgPSBjbG9jay5ub3coKSwgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChwb2tlLCBwb2tlRGVsYXkpO1xuICAgIGZyYW1lID0gMSwgc2V0RnJhbWUod2FrZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vdHJhbnNpdGlvbi9pbmRleFwiO1xuaW1wb3J0IHtTQ0hFRFVMRUR9IGZyb20gXCIuL3RyYW5zaXRpb24vc2NoZWR1bGVcIjtcblxudmFyIHJvb3QgPSBbbnVsbF07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgc2NoZWR1bGUsXG4gICAgICBpO1xuXG4gIGlmIChzY2hlZHVsZXMpIHtcbiAgICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLnN0YXRlID4gU0NIRURVTEVEICYmIHNjaGVkdWxlLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKFtbbm9kZV1dLCByb290LCBuYW1lLCAraSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCJpbXBvcnQgXCIuL3NlbGVjdGlvbi9pbmRleFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRyYW5zaXRpb259IGZyb20gXCIuL3RyYW5zaXRpb24vaW5kZXhcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBhY3RpdmV9IGZyb20gXCIuL2FjdGl2ZVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGludGVycnVwdH0gZnJvbSBcIi4vaW50ZXJydXB0XCI7XG4iLCJpbXBvcnQge1NUQVJUSU5HLCBFTkRJTkcsIEVOREVEfSBmcm9tIFwiLi90cmFuc2l0aW9uL3NjaGVkdWxlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgc2NoZWR1bGUsXG4gICAgICBhY3RpdmUsXG4gICAgICBlbXB0eSA9IHRydWUsXG4gICAgICBpO1xuXG4gIGlmICghc2NoZWR1bGVzKSByZXR1cm47XG5cbiAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcblxuICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkubmFtZSAhPT0gbmFtZSkgeyBlbXB0eSA9IGZhbHNlOyBjb250aW51ZTsgfVxuICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7XG4gICAgc2NoZWR1bGUuc3RhdGUgPSBFTkRFRDtcbiAgICBzY2hlZHVsZS50aW1lci5zdG9wKCk7XG4gICAgaWYgKGFjdGl2ZSkgc2NoZWR1bGUub24uY2FsbChcImludGVycnVwdFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gIH1cblxuICBpZiAoZW1wdHkpIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbn1cbiIsImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ludGVycnVwdCBmcm9tIFwiLi9pbnRlcnJ1cHRcIjtcbmltcG9ydCBzZWxlY3Rpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uXCI7XG5cbnNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDtcbnNlbGVjdGlvbi5wcm90b3R5cGUudHJhbnNpdGlvbiA9IHNlbGVjdGlvbl90cmFuc2l0aW9uO1xuIiwiaW1wb3J0IGludGVycnVwdCBmcm9tIFwiLi4vaW50ZXJydXB0XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4uL3RyYW5zaXRpb24vaW5kZXhcIjtcbmltcG9ydCBzY2hlZHVsZSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9zY2hlZHVsZVwiO1xuaW1wb3J0IHtlYXNlQ3ViaWNJbk91dH0gZnJvbSBcImQzLWVhc2VcIjtcbmltcG9ydCB7bm93fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGRlZmF1bHRUaW1pbmcgPSB7XG4gIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuXG4gIGRlbGF5OiAwLFxuICBkdXJhdGlvbjogMjUwLFxuICBlYXNlOiBlYXNlQ3ViaWNJbk91dFxufTtcblxuZnVuY3Rpb24gaW5oZXJpdChub2RlLCBpZCkge1xuICB2YXIgdGltaW5nO1xuICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkge1xuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFRpbWluZy50aW1lID0gbm93KCksIGRlZmF1bHRUaW1pbmc7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aW1pbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGlkLFxuICAgICAgdGltaW5nO1xuXG4gIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikge1xuICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lO1xuICB9IGVsc2Uge1xuICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtU3ZnIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGVcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciB2YWx1ZTAwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGxcbiAgICAgICAgOiB2YWx1ZTAgPT09IHZhbHVlMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZSh2YWx1ZTAwID0gdmFsdWUwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgdmFsdWUwMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZTAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgcmV0dXJuIHZhbHVlMCA9PT0gdmFsdWUxID8gbnVsbFxuICAgICAgICA6IHZhbHVlMCA9PT0gdmFsdWUwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHZhbHVlMDAgPSB2YWx1ZTAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHZhbHVlMDAsXG4gICAgICB2YWx1ZTEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlMCwgdmFsdWUxID0gdmFsdWUodGhpcyk7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB2YWx1ZTAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICByZXR1cm4gdmFsdWUwID09PSB2YWx1ZTEgPyBudWxsXG4gICAgICAgIDogdmFsdWUwID09PSB2YWx1ZTAwICYmIHZhbHVlMSA9PT0gdmFsdWUxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHZhbHVlMDAgPSB2YWx1ZTAsIHZhbHVlMTAgPSB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciB2YWx1ZTAwLFxuICAgICAgdmFsdWUxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZTAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHZhbHVlMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICByZXR1cm4gdmFsdWUwID09PSB2YWx1ZTEgPyBudWxsXG4gICAgICAgIDogdmFsdWUwID09PSB2YWx1ZTAwICYmIHZhbHVlMSA9PT0gdmFsdWUxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHZhbHVlMDAgPSB2YWx1ZTAsIHZhbHVlMTAgPSB2YWx1ZTEpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSksIGkgPSBmdWxsbmFtZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJhdHRyLlwiICsgbmFtZSwgdmFsdWUpKVxuICAgICAgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkoZnVsbG5hbWUpXG4gICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KShmdWxsbmFtZSwgaSwgdmFsdWUgKyBcIlwiKSk7XG59XG4iLCJpbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG5mdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLCBpID0gdmFsdWUuYXBwbHkobm9kZSwgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gaSAmJiBmdW5jdGlvbih0KSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaSh0KSk7XG4gICAgfTtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLCBpID0gdmFsdWUuYXBwbHkobm9kZSwgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gaSAmJiBmdW5jdGlvbih0KSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShuYW1lLCBpKHQpKTtcbiAgICB9O1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBrZXkgPSBcImF0dHIuXCIgKyBuYW1lO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCAoZnVsbG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2VlbikoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge2dldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGVcIjtcblxuZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlbGF5Q29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZGVsYXlGdW5jdGlvblxuICAgICAgICAgIDogZGVsYXlDb25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZVwiO1xuXG5mdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkdXJhdGlvbkNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZHVyYXRpb25GdW5jdGlvblxuICAgICAgICAgIDogZHVyYXRpb25Db25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZVwiO1xuXG5mdW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZWFzZTtcbn1cbiIsImltcG9ydCB7bWF0Y2hlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHIgZnJvbSBcIi4vYXR0clwiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0clR3ZWVuIGZyb20gXCIuL2F0dHJUd2VlblwiO1xuaW1wb3J0IHRyYW5zaXRpb25fZGVsYXkgZnJvbSBcIi4vZGVsYXlcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2R1cmF0aW9uIGZyb20gXCIuL2R1cmF0aW9uXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlIGZyb20gXCIuL2Vhc2VcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXJcIjtcbmltcG9ydCB0cmFuc2l0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9vbiBmcm9tIFwiLi9vblwiO1xuaW1wb3J0IHRyYW5zaXRpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZVwiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdFwiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbFwiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0aW9uIGZyb20gXCIuL3NlbGVjdGlvblwiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGVcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlVHdlZW4gZnJvbSBcIi4vc3R5bGVUd2VlblwiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dCBmcm9tIFwiLi90ZXh0XCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb25cIjtcbmltcG9ydCB0cmFuc2l0aW9uX3R3ZWVuIGZyb20gXCIuL3R3ZWVuXCI7XG5cbnZhciBpZCA9IDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2l0aW9uKGdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbiAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIHRoaXMuX2lkID0gaWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb24obmFtZSkge1xuICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld0lkKCkge1xuICByZXR1cm4gKytpZDtcbn1cblxudmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlO1xuXG5UcmFuc2l0aW9uLnByb3RvdHlwZSA9IHRyYW5zaXRpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNpdGlvbixcbiAgc2VsZWN0OiB0cmFuc2l0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCxcbiAgZmlsdGVyOiB0cmFuc2l0aW9uX2ZpbHRlcixcbiAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogdHJhbnNpdGlvbl9zZWxlY3Rpb24sXG4gIHRyYW5zaXRpb246IHRyYW5zaXRpb25fdHJhbnNpdGlvbixcbiAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fcHJvdG90eXBlLmVtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fcHJvdG90eXBlLmVhY2gsXG4gIG9uOiB0cmFuc2l0aW9uX29uLFxuICBhdHRyOiB0cmFuc2l0aW9uX2F0dHIsXG4gIGF0dHJUd2VlbjogdHJhbnNpdGlvbl9hdHRyVHdlZW4sXG4gIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLFxuICBzdHlsZVR3ZWVuOiB0cmFuc2l0aW9uX3N0eWxlVHdlZW4sXG4gIHRleHQ6IHRyYW5zaXRpb25fdGV4dCxcbiAgcmVtb3ZlOiB0cmFuc2l0aW9uX3JlbW92ZSxcbiAgdHdlZW46IHRyYW5zaXRpb25fdHdlZW4sXG4gIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LFxuICBkdXJhdGlvbjogdHJhbnNpdGlvbl9kdXJhdGlvbixcbiAgZWFzZTogdHJhbnNpdGlvbl9lYXNlXG59O1xuIiwiaW1wb3J0IHtjb2xvcn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQge2ludGVycG9sYXRlTnVtYmVyLCBpbnRlcnBvbGF0ZVJnYiwgaW50ZXJwb2xhdGVTdHJpbmd9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBjO1xuICByZXR1cm4gKHR5cGVvZiBiID09PSBcIm51bWJlclwiID8gaW50ZXJwb2xhdGVOdW1iZXJcbiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gaW50ZXJwb2xhdGVSZ2JcbiAgICAgIDogKGMgPSBjb2xvcihiKSkgPyAoYiA9IGMsIGludGVycG9sYXRlUmdiKVxuICAgICAgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHtcbiAgaWYgKHRyYW5zaXRpb24uX2lkICE9PSB0aGlzLl9pZCkgdGhyb3cgbmV3IEVycm9yO1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlXCI7XG5cbmZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHtcbiAgcmV0dXJuIChuYW1lICsgXCJcIikudHJpbSgpLnNwbGl0KC9efFxccysvKS5ldmVyeShmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiAhdCB8fCB0ID09PSBcInN0YXJ0XCI7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMlxuICAgICAgPyBnZXQodGhpcy5ub2RlKCksIGlkKS5vbi5vbihuYW1lKVxuICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fX3RyYW5zaXRpb24pIGlmICgraSAhPT0gaWQpIHJldHVybjtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5vbihcImVuZC5yZW1vdmVcIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTtcbn1cbiIsImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHt0aW1lciwgdGltZW91dH0gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBlbXB0eU9uID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImVuZFwiLCBcImludGVycnVwdFwiKTtcbnZhciBlbXB0eVR3ZWVuID0gW107XG5cbmV4cG9ydCB2YXIgQ1JFQVRFRCA9IDA7XG5leHBvcnQgdmFyIFNDSEVEVUxFRCA9IDE7XG5leHBvcnQgdmFyIFNUQVJUSU5HID0gMjtcbmV4cG9ydCB2YXIgU1RBUlRFRCA9IDM7XG5leHBvcnQgdmFyIFJVTk5JTkcgPSA0O1xuZXhwb3J0IHZhciBFTkRJTkcgPSA1O1xuZXhwb3J0IHZhciBFTkRFRCA9IDY7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIGlkLCBpbmRleCwgZ3JvdXAsIHRpbWluZykge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O1xuICBlbHNlIGlmIChpZCBpbiBzY2hlZHVsZXMpIHJldHVybjtcbiAgY3JlYXRlKG5vZGUsIGlkLCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBvbjogZW1wdHlPbixcbiAgICB0d2VlbjogZW1wdHlUd2VlbixcbiAgICB0aW1lOiB0aW1pbmcudGltZSxcbiAgICBkZWxheTogdGltaW5nLmRlbGF5LFxuICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sXG4gICAgZWFzZTogdGltaW5nLmVhc2UsXG4gICAgdGltZXI6IG51bGwsXG4gICAgc3RhdGU6IENSRUFURURcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IENSRUFURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBzdGFydGVkXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcihcInRyYW5zaXRpb24gbm90IGZvdW5kXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZShub2RlLCBpZCwgc2VsZikge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICB0d2VlbjtcblxuICAvLyBJbml0aWFsaXplIHRoZSBzZWxmIHRpbWVyIHdoZW4gdGhlIHRyYW5zaXRpb24gaXMgY3JlYXRlZC5cbiAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shXG4gIHNjaGVkdWxlc1tpZF0gPSBzZWxmO1xuICBzZWxmLnRpbWVyID0gdGltZXIoc2NoZWR1bGUsIDAsIHNlbGYudGltZSk7XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGUoZWxhcHNlZCkge1xuICAgIHNlbGYuc3RhdGUgPSBTQ0hFRFVMRUQ7XG4gICAgc2VsZi50aW1lci5yZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuXG4gICAgLy8gSWYgdGhlIGVsYXBzZWQgZGVsYXkgaXMgbGVzcyB0aGFuIG91ciBmaXJzdCBzbGVlcCwgc3RhcnQgaW1tZWRpYXRlbHkuXG4gICAgaWYgKHNlbGYuZGVsYXkgPD0gZWxhcHNlZCkgc3RhcnQoZWxhcHNlZCAtIHNlbGYuZGVsYXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkge1xuICAgIHZhciBpLCBqLCBuLCBvO1xuXG4gICAgLy8gSWYgdGhlIHN0YXRlIGlzIG5vdCBTQ0hFRFVMRUQsIHRoZW4gd2UgcHJldmlvdXNseSBlcnJvcmVkIG9uIHN0YXJ0LlxuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTQ0hFRFVMRUQpIHJldHVybiBzdG9wKCk7XG5cbiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgICBvID0gc2NoZWR1bGVzW2ldO1xuICAgICAgaWYgKG8ubmFtZSAhPT0gc2VsZi5uYW1lKSBjb250aW51ZTtcblxuICAgICAgLy8gV2hpbGUgdGhpcyBlbGVtZW50IGFscmVhZHkgaGFzIGEgc3RhcnRpbmcgdHJhbnNpdGlvbiBkdXJpbmcgdGhpcyBmcmFtZSxcbiAgICAgIC8vIGRlZmVyIHN0YXJ0aW5nIGFuIGludGVycnVwdGluZyB0cmFuc2l0aW9uIHVudGlsIHRoYXQgdHJhbnNpdGlvbiBoYXMgYVxuICAgICAgLy8gY2hhbmNlIHRvIHRpY2sgKGFuZCBwb3NzaWJseSBlbmQpOyBzZWUgZDMvZDMtdHJhbnNpdGlvbiM1NCFcbiAgICAgIGlmIChvLnN0YXRlID09PSBTVEFSVEVEKSByZXR1cm4gdGltZW91dChzdGFydCk7XG5cbiAgICAgIC8vIEludGVycnVwdCB0aGUgYWN0aXZlIHRyYW5zaXRpb24sIGlmIGFueS5cbiAgICAgIC8vIERpc3BhdGNoIHRoZSBpbnRlcnJ1cHQgZXZlbnQuXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gUlVOTklORykge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJpbnRlcnJ1cHRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgcHJlLWVtcHRlZCB0cmFuc2l0aW9ucy4gTm8gaW50ZXJydXB0IGV2ZW50IGlzIGRpc3BhdGNoZWRcbiAgICAgIC8vIGJlY2F1c2UgdGhlIGNhbmNlbGxlZCB0cmFuc2l0aW9ucyBuZXZlciBzdGFydGVkLiBOb3RlIHRoYXQgdGhpcyBhbHNvXG4gICAgICAvLyByZW1vdmVzIHRoaXMgdHJhbnNpdGlvbiBmcm9tIHRoZSBwZW5kaW5nIGxpc3QhXG4gICAgICBlbHNlIGlmICgraSA8IGlkKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVmZXIgdGhlIGZpcnN0IHRpY2sgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lOyBzZWUgZDMvZDMjMTU3Ni5cbiAgICAvLyBOb3RlIHRoZSB0cmFuc2l0aW9uIG1heSBiZSBjYW5jZWxlZCBhZnRlciBzdGFydCBhbmQgYmVmb3JlIHRoZSBmaXJzdCB0aWNrIVxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUgZDMvZDMtdHJhbnNpdGlvbiMxNiFcbiAgICAvLyBBc3N1bWluZyB0aGlzIGlzIHN1Y2Nlc3NmdWwsIHN1YnNlcXVlbnQgY2FsbGJhY2tzIGdvIHN0cmFpZ2h0IHRvIHRpY2suXG4gICAgdGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChzZWxmLnN0YXRlID09PSBTVEFSVEVEKSB7XG4gICAgICAgIHNlbGYuc3RhdGUgPSBSVU5OSU5HO1xuICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcbiAgICAgICAgdGljayhlbGFwc2VkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC5cbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLlxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVElORztcbiAgICBzZWxmLm9uLmNhbGwoXCJzdGFydFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU1RBUlRJTkcpIHJldHVybjsgLy8gaW50ZXJydXB0ZWRcbiAgICBzZWxmLnN0YXRlID0gU1RBUlRFRDtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLlxuICAgIHR3ZWVuID0gbmV3IEFycmF5KG4gPSBzZWxmLnR3ZWVuLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgaiA9IC0xOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkge1xuICAgICAgICB0d2VlblsrK2pdID0gbztcbiAgICAgIH1cbiAgICB9XG4gICAgdHdlZW4ubGVuZ3RoID0gaiArIDE7XG4gIH1cblxuICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHtcbiAgICB2YXIgdCA9IGVsYXBzZWQgPCBzZWxmLmR1cmF0aW9uID8gc2VsZi5lYXNlLmNhbGwobnVsbCwgZWxhcHNlZCAvIHNlbGYuZHVyYXRpb24pIDogKHNlbGYudGltZXIucmVzdGFydChzdG9wKSwgc2VsZi5zdGF0ZSA9IEVORElORywgMSksXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICB0d2VlbltpXS5jYWxsKG51bGwsIHQpO1xuICAgIH1cblxuICAgIC8vIERpc3BhdGNoIHRoZSBlbmQgZXZlbnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgPT09IEVORElORykge1xuICAgICAgc2VsZi5vbi5jYWxsKFwiZW5kXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgICAgc3RvcCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgc2VsZi5zdGF0ZSA9IEVOREVEO1xuICAgIHNlbGYudGltZXIuc3RvcCgpO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdO1xuICAgIGZvciAodmFyIGkgaW4gc2NoZWR1bGVzKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7c2VsZWN0b3J9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBpZCwgaSwgc3ViZ3JvdXAsIGdldChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0b3JBbGx9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSwgY2hpbGQsIGluaGVyaXQgPSBnZXQobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykge1xuICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7XG4gICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxudmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9ncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3N0eWxlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGVcIjtcblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSwgaW50ZXJwb2xhdGUpIHtcbiAgdmFyIHZhbHVlMDAsXG4gICAgICB2YWx1ZTEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGxcbiAgICAgICAgOiB2YWx1ZTAgPT09IHZhbHVlMDAgJiYgdmFsdWUxID09PSB2YWx1ZTEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUodmFsdWUwMCA9IHZhbHVlMCwgdmFsdWUxMCA9IHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlRW5kKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgdmFsdWUwMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZTAgPSBzdHlsZSh0aGlzLCBuYW1lKTtcbiAgICByZXR1cm4gdmFsdWUwID09PSB2YWx1ZTEgPyBudWxsXG4gICAgICAgIDogdmFsdWUwID09PSB2YWx1ZTAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUodmFsdWUwMCA9IHZhbHVlMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHZhbHVlMDAsXG4gICAgICB2YWx1ZTEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHZhbHVlMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBzdHlsZSh0aGlzLCBuYW1lKSk7XG4gICAgcmV0dXJuIHZhbHVlMCA9PT0gdmFsdWUxID8gbnVsbFxuICAgICAgICA6IHZhbHVlMCA9PT0gdmFsdWUwMCAmJiB2YWx1ZTEgPT09IHZhbHVlMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZSh2YWx1ZTAwID0gdmFsdWUwLCB2YWx1ZTEwID0gdmFsdWUxKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBpID0gKG5hbWUgKz0gXCJcIikgPT09IFwidHJhbnNmb3JtXCIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybSA6IGludGVycG9sYXRlO1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHRoaXNcbiAgICAgICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZVJlbW92ZShuYW1lLCBpKSlcbiAgICAgICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBzdHlsZVJlbW92ZUVuZChuYW1lKSlcbiAgICAgIDogdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uKG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJzdHlsZS5cIiArIG5hbWUsIHZhbHVlKSlcbiAgICAgICAgICA6IHN0eWxlQ29uc3RhbnQobmFtZSwgaSwgdmFsdWUgKyBcIlwiKSwgcHJpb3JpdHkpO1xufVxuIiwiZnVuY3Rpb24gc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLCBpID0gdmFsdWUuYXBwbHkobm9kZSwgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gaSAmJiBmdW5jdGlvbih0KSB7XG4gICAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkodCksIHByaW9yaXR5KTtcbiAgICB9O1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIga2V5ID0gXCJzdHlsZS5cIiArIChuYW1lICs9IFwiXCIpO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/IFwiXCIgOiBwcmlvcml0eSkpO1xufVxuIiwiaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2VlblwiO1xuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUxID0gdmFsdWUodGhpcyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gXCJcIiA6IHZhbHVlMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMudHdlZW4oXCJ0ZXh0XCIsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHRleHRGdW5jdGlvbih0d2VlblZhbHVlKHRoaXMsIFwidGV4dFwiLCB2YWx1ZSkpXG4gICAgICA6IHRleHRDb25zdGFudCh2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIikpO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkMCA9IHRoaXMuX2lkLFxuICAgICAgaWQxID0gbmV3SWQoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICB2YXIgaW5oZXJpdCA9IGdldChub2RlLCBpZDApO1xuICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZDEsIGksIGdyb3VwLCB7XG4gICAgICAgICAgdGltZTogaW5oZXJpdC50aW1lICsgaW5oZXJpdC5kZWxheSArIGluaGVyaXQuZHVyYXRpb24sXG4gICAgICAgICAgZGVsYXk6IDAsXG4gICAgICAgICAgZHVyYXRpb246IGluaGVyaXQuZHVyYXRpb24sXG4gICAgICAgICAgZWFzZTogaW5oZXJpdC5lYXNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkMSk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZVwiO1xuXG5mdW5jdGlvbiB0d2VlblJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgdHdlZW4wLCB0d2VlbjE7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gdHdlZW4wID0gdHdlZW47XG4gICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xID0gdHdlZW4xLnNsaWNlKCk7XG4gICAgICAgICAgdHdlZW4xLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0d2VlbkZ1bmN0aW9uKGlkLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgdHdlZW4wLCB0d2VlbjE7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9ICh0d2VlbjAgPSB0d2Vlbikuc2xpY2UoKTtcbiAgICAgIGZvciAodmFyIHQgPSB7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfSwgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMVtpXSA9IHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpID09PSBuKSB0d2VlbjEucHVzaCh0KTtcbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgbmFtZSArPSBcIlwiO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciB0d2VlbiA9IGdldCh0aGlzLm5vZGUoKSwgaWQpLnR3ZWVuO1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4ubGVuZ3RoLCB0OyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKHQgPSB0d2VlbltpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gdC52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gdHdlZW5SZW1vdmUgOiB0d2VlbkZ1bmN0aW9uKShpZCwgbmFtZSwgdmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR3ZWVuVmFsdWUodHJhbnNpdGlvbiwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlkID0gdHJhbnNpdGlvbi5faWQ7XG5cbiAgdHJhbnNpdGlvbi5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCk7XG4gICAgKHNjaGVkdWxlLnZhbHVlIHx8IChzY2hlZHVsZS52YWx1ZSA9IHt9KSlbbmFtZV0gPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBnZXQobm9kZSwgaWQpLnZhbHVlW25hbWVdO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBab29tRXZlbnQodGFyZ2V0LCB0eXBlLCB0cmFuc2Zvcm0pIHtcbiAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIHpvb219IGZyb20gXCIuL3pvb21cIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB6b29tVHJhbnNmb3JtLCBpZGVudGl0eSBhcyB6b29tSWRlbnRpdHl9IGZyb20gXCIuL3RyYW5zZm9ybVwiO1xuIiwiaW1wb3J0IHtldmVudH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbigpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkge1xuICB0aGlzLmsgPSBrO1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLFxuICBzY2FsZTogZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBrID09PSAxID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rICogaywgdGhpcy54LCB0aGlzLnkpO1xuICB9LFxuICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICByZXR1cm4gW3BvaW50WzBdICogdGhpcy5rICsgdGhpcy54LCBwb2ludFsxXSAqIHRoaXMuayArIHRoaXMueV07XG4gIH0sXG4gIGFwcGx5WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54O1xuICB9LFxuICBhcHBseVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbihsb2NhdGlvbikge1xuICAgIHJldHVybiBbKGxvY2F0aW9uWzBdIC0gdGhpcy54KSAvIHRoaXMuaywgKGxvY2F0aW9uWzFdIC0gdGhpcy55KSAvIHRoaXMua107XG4gIH0sXG4gIGludmVydFg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rO1xuICB9LFxuICBpbnZlcnRZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuaztcbiAgfSxcbiAgcmVzY2FsZVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geC5jb3B5KCkuZG9tYWluKHgucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLCB0aGlzKS5tYXAoeC5pbnZlcnQsIHgpKTtcbiAgfSxcbiAgcmVzY2FsZVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHRoaXMueCArIFwiLFwiICsgdGhpcy55ICsgXCIpIHNjYWxlKFwiICsgdGhpcy5rICsgXCIpXCI7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSBuZXcgVHJhbnNmb3JtKDEsIDAsIDApO1xuXG50cmFuc2Zvcm0ucHJvdG90eXBlID0gVHJhbnNmb3JtLnByb3RvdHlwZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX196b29tIHx8IGlkZW50aXR5O1xufVxuIiwiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge2RyYWdEaXNhYmxlLCBkcmFnRW5hYmxlfSBmcm9tIFwiZDMtZHJhZ1wiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZVpvb219IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtldmVudCwgY3VzdG9tRXZlbnQsIHNlbGVjdCwgbW91c2UsIHRvdWNofSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge2ludGVycnVwdH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IFpvb21FdmVudCBmcm9tIFwiLi9ldmVudFwiO1xuaW1wb3J0IHtUcmFuc2Zvcm0sIGlkZW50aXR5fSBmcm9tIFwiLi90cmFuc2Zvcm1cIjtcbmltcG9ydCBub2V2ZW50LCB7bm9wcm9wYWdhdGlvbn0gZnJvbSBcIi4vbm9ldmVudFwiO1xuXG4vLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS5cbmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIoKSB7XG4gIHJldHVybiAhZXZlbnQuYnV0dG9uO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0RXh0ZW50KCkge1xuICB2YXIgZSA9IHRoaXMsIHcsIGg7XG4gIGlmIChlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkge1xuICAgIGUgPSBlLm93bmVyU1ZHRWxlbWVudCB8fCBlO1xuICAgIHcgPSBlLndpZHRoLmJhc2VWYWwudmFsdWU7XG4gICAgaCA9IGUuaGVpZ2h0LmJhc2VWYWwudmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdyA9IGUuY2xpZW50V2lkdGg7XG4gICAgaCA9IGUuY2xpZW50SGVpZ2h0O1xuICB9XG4gIHJldHVybiBbWzAsIDBdLCBbdywgaF1dO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VHJhbnNmb3JtKCkge1xuICByZXR1cm4gdGhpcy5fX3pvb20gfHwgaWRlbnRpdHk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRXaGVlbERlbHRhKCkge1xuICByZXR1cm4gLWV2ZW50LmRlbHRhWSAqIChldmVudC5kZWx0YU1vZGUgPyAxMjAgOiAxKSAvIDUwMDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIFwib250b3VjaHN0YXJ0XCIgaW4gdGhpcztcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbnN0cmFpbih0cmFuc2Zvcm0sIGV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSB7XG4gIHZhciBkeDAgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMF1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzBdLFxuICAgICAgZHgxID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzFdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVswXSxcbiAgICAgIGR5MCA9IHRyYW5zZm9ybS5pbnZlcnRZKGV4dGVudFswXVsxXSkgLSB0cmFuc2xhdGVFeHRlbnRbMF1bMV0sXG4gICAgICBkeTEgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMV1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzFdO1xuICByZXR1cm4gdHJhbnNmb3JtLnRyYW5zbGF0ZShcbiAgICBkeDEgPiBkeDAgPyAoZHgwICsgZHgxKSAvIDIgOiBNYXRoLm1pbigwLCBkeDApIHx8IE1hdGgubWF4KDAsIGR4MSksXG4gICAgZHkxID4gZHkwID8gKGR5MCArIGR5MSkgLyAyIDogTWF0aC5taW4oMCwgZHkwKSB8fCBNYXRoLm1heCgwLCBkeTEpXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsdGVyID0gZGVmYXVsdEZpbHRlcixcbiAgICAgIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQsXG4gICAgICBjb25zdHJhaW4gPSBkZWZhdWx0Q29uc3RyYWluLFxuICAgICAgd2hlZWxEZWx0YSA9IGRlZmF1bHRXaGVlbERlbHRhLFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIHNjYWxlRXh0ZW50ID0gWzAsIEluZmluaXR5XSxcbiAgICAgIHRyYW5zbGF0ZUV4dGVudCA9IFtbLUluZmluaXR5LCAtSW5maW5pdHldLCBbSW5maW5pdHksIEluZmluaXR5XV0sXG4gICAgICBkdXJhdGlvbiA9IDI1MCxcbiAgICAgIGludGVycG9sYXRlID0gaW50ZXJwb2xhdGVab29tLFxuICAgICAgZ2VzdHVyZXMgPSBbXSxcbiAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJ6b29tXCIsIFwiZW5kXCIpLFxuICAgICAgdG91Y2hzdGFydGluZyxcbiAgICAgIHRvdWNoZW5kaW5nLFxuICAgICAgdG91Y2hEZWxheSA9IDUwMCxcbiAgICAgIHdoZWVsRGVsYXkgPSAxNTAsXG4gICAgICBjbGlja0Rpc3RhbmNlMiA9IDA7XG5cbiAgZnVuY3Rpb24gem9vbShzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb25cbiAgICAgICAgLnByb3BlcnR5KFwiX196b29tXCIsIGRlZmF1bHRUcmFuc2Zvcm0pXG4gICAgICAgIC5vbihcIndoZWVsLnpvb21cIiwgd2hlZWxlZClcbiAgICAgICAgLm9uKFwibW91c2Vkb3duLnpvb21cIiwgbW91c2Vkb3duZWQpXG4gICAgICAgIC5vbihcImRibGNsaWNrLnpvb21cIiwgZGJsY2xpY2tlZClcbiAgICAgIC5maWx0ZXIodG91Y2hhYmxlKVxuICAgICAgICAub24oXCJ0b3VjaHN0YXJ0Lnpvb21cIiwgdG91Y2hzdGFydGVkKVxuICAgICAgICAub24oXCJ0b3VjaG1vdmUuem9vbVwiLCB0b3VjaG1vdmVkKVxuICAgICAgICAub24oXCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb21cIiwgdG91Y2hlbmRlZClcbiAgICAgICAgLnN0eWxlKFwidG91Y2gtYWN0aW9uXCIsIFwibm9uZVwiKVxuICAgICAgICAuc3R5bGUoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIiwgXCJyZ2JhKDAsMCwwLDApXCIpO1xuICB9XG5cbiAgem9vbS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCB0cmFuc2Zvcm0pIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gY29sbGVjdGlvbi5zZWxlY3Rpb24gPyBjb2xsZWN0aW9uLnNlbGVjdGlvbigpIDogY29sbGVjdGlvbjtcbiAgICBzZWxlY3Rpb24ucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSk7XG4gICAgaWYgKGNvbGxlY3Rpb24gIT09IHNlbGVjdGlvbikge1xuICAgICAgc2NoZWR1bGUoY29sbGVjdGlvbiwgdHJhbnNmb3JtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0aW9uLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgIGdlc3R1cmUodGhpcywgYXJndW1lbnRzKVxuICAgICAgICAgICAgLnN0YXJ0KClcbiAgICAgICAgICAgIC56b29tKG51bGwsIHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogdHJhbnNmb3JtKVxuICAgICAgICAgICAgLmVuZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHpvb20uc2NhbGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaykge1xuICAgIHpvb20uc2NhbGVUbyhzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGswID0gdGhpcy5fX3pvb20uayxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGswICogazE7XG4gICAgfSk7XG4gIH07XG5cbiAgem9vbS5zY2FsZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrKSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlID0gZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgdDAgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgICBwMCA9IGNlbnRyb2lkKGUpLFxuICAgICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9KTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCB4LCB5KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb25zdHJhaW4odGhpcy5fX3pvb20udHJhbnNsYXRlKFxuICAgICAgICB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IHkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHlcbiAgICAgICksIGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0pO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHkpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcCA9IGNlbnRyb2lkKGUpO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbihpZGVudGl0eS50cmFuc2xhdGUocFswXSwgcFsxXSkuc2NhbGUodC5rKS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyAteC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXgsXG4gICAgICAgIHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyAteS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXlcbiAgICAgICksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc2NhbGUodHJhbnNmb3JtLCBrKSB7XG4gICAgayA9IE1hdGgubWF4KHNjYWxlRXh0ZW50WzBdLCBNYXRoLm1pbihzY2FsZUV4dGVudFsxXSwgaykpO1xuICAgIHJldHVybiBrID09PSB0cmFuc2Zvcm0uayA/IHRyYW5zZm9ybSA6IG5ldyBUcmFuc2Zvcm0oaywgdHJhbnNmb3JtLngsIHRyYW5zZm9ybS55KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh0cmFuc2Zvcm0sIHAwLCBwMSkge1xuICAgIHZhciB4ID0gcDBbMF0gLSBwMVswXSAqIHRyYW5zZm9ybS5rLCB5ID0gcDBbMV0gLSBwMVsxXSAqIHRyYW5zZm9ybS5rO1xuICAgIHJldHVybiB4ID09PSB0cmFuc2Zvcm0ueCAmJiB5ID09PSB0cmFuc2Zvcm0ueSA/IHRyYW5zZm9ybSA6IG5ldyBUcmFuc2Zvcm0odHJhbnNmb3JtLmssIHgsIHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2VudHJvaWQoZXh0ZW50KSB7XG4gICAgcmV0dXJuIFsoK2V4dGVudFswXVswXSArICtleHRlbnRbMV1bMF0pIC8gMiwgKCtleHRlbnRbMF1bMV0gKyArZXh0ZW50WzFdWzFdKSAvIDJdO1xuICB9XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGUodHJhbnNpdGlvbiwgdHJhbnNmb3JtLCBjZW50ZXIpIHtcbiAgICB0cmFuc2l0aW9uXG4gICAgICAgIC5vbihcInN0YXJ0Lnpvb21cIiwgZnVuY3Rpb24oKSB7IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKS5zdGFydCgpOyB9KVxuICAgICAgICAub24oXCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbVwiLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmVuZCgpOyB9KVxuICAgICAgICAudHdlZW4oXCJ6b29tXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgZyA9IGdlc3R1cmUodGhhdCwgYXJncyksXG4gICAgICAgICAgICAgIGUgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyksXG4gICAgICAgICAgICAgIHAgPSBjZW50ZXIgfHwgY2VudHJvaWQoZSksXG4gICAgICAgICAgICAgIHcgPSBNYXRoLm1heChlWzFdWzBdIC0gZVswXVswXSwgZVsxXVsxXSAtIGVbMF1bMV0pLFxuICAgICAgICAgICAgICBhID0gdGhhdC5fX3pvb20sXG4gICAgICAgICAgICAgIGIgPSB0eXBlb2YgdHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIgPyB0cmFuc2Zvcm0uYXBwbHkodGhhdCwgYXJncykgOiB0cmFuc2Zvcm0sXG4gICAgICAgICAgICAgIGkgPSBpbnRlcnBvbGF0ZShhLmludmVydChwKS5jb25jYXQodyAvIGEuayksIGIuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYi5rKSk7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGlmICh0ID09PSAxKSB0ID0gYjsgLy8gQXZvaWQgcm91bmRpbmcgZXJyb3Igb24gZW5kLlxuICAgICAgICAgICAgZWxzZSB7IHZhciBsID0gaSh0KSwgayA9IHcgLyBsWzJdOyB0ID0gbmV3IFRyYW5zZm9ybShrLCBwWzBdIC0gbFswXSAqIGssIHBbMV0gLSBsWzFdICogayk7IH1cbiAgICAgICAgICAgIGcuem9vbShudWxsLCB0KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlc3R1cmUodGhhdCwgYXJncykge1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gZ2VzdHVyZXMubGVuZ3RoLCBnOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKGcgPSBnZXN0dXJlc1tpXSkudGhhdCA9PT0gdGhhdCkge1xuICAgICAgICByZXR1cm4gZztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBHZXN0dXJlKHRoYXQsIGFyZ3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gR2VzdHVyZSh0aGF0LCBhcmdzKSB7XG4gICAgdGhpcy50aGF0ID0gdGhhdDtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIHRoaXMuaW5kZXggPSAtMTtcbiAgICB0aGlzLmFjdGl2ZSA9IDA7XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyk7XG4gIH1cblxuICBHZXN0dXJlLnByb3RvdHlwZSA9IHtcbiAgICBzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoKyt0aGlzLmFjdGl2ZSA9PT0gMSkge1xuICAgICAgICB0aGlzLmluZGV4ID0gZ2VzdHVyZXMucHVzaCh0aGlzKSAtIDE7XG4gICAgICAgIHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB6b29tOiBmdW5jdGlvbihrZXksIHRyYW5zZm9ybSkge1xuICAgICAgaWYgKHRoaXMubW91c2UgJiYga2V5ICE9PSBcIm1vdXNlXCIpIHRoaXMubW91c2VbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMubW91c2VbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gwICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMFsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDBbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gxICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDFbMF0pO1xuICAgICAgdGhpcy50aGF0Ll9fem9vbSA9IHRyYW5zZm9ybTtcbiAgICAgIHRoaXMuZW1pdChcInpvb21cIik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkge1xuICAgICAgICBnZXN0dXJlcy5zcGxpY2UodGhpcy5pbmRleCwgMSk7XG4gICAgICAgIHRoaXMuaW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbih0eXBlKSB7XG4gICAgICBjdXN0b21FdmVudChuZXcgWm9vbUV2ZW50KHpvb20sIHR5cGUsIHRoaXMudGhhdC5fX3pvb20pLCBsaXN0ZW5lcnMuYXBwbHksIGxpc3RlbmVycywgW3R5cGUsIHRoaXMudGhhdCwgdGhpcy5hcmdzXSk7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHdoZWVsZWQoKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIHQuayAqIE1hdGgucG93KDIsIHdoZWVsRGVsdGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSkpKSxcbiAgICAgICAgcCA9IG1vdXNlKHRoaXMpO1xuXG4gICAgLy8gSWYgdGhlIG1vdXNlIGlzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGJlZm9yZSwgcmV1c2UgaXQuXG4gICAgLy8gSWYgdGhlcmUgd2VyZSByZWNlbnQgd2hlZWwgZXZlbnRzLCByZXNldCB0aGUgd2hlZWwgaWRsZSB0aW1lb3V0LlxuICAgIGlmIChnLndoZWVsKSB7XG4gICAgICBpZiAoZy5tb3VzZVswXVswXSAhPT0gcFswXSB8fCBnLm1vdXNlWzBdWzFdICE9PSBwWzFdKSB7XG4gICAgICAgIGcubW91c2VbMV0gPSB0LmludmVydChnLm1vdXNlWzBdID0gcCk7XG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQoZy53aGVlbCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyB3aGVlbCBldmVudCB3b27igJl0IHRyaWdnZXIgYSB0cmFuc2Zvcm0gY2hhbmdlLCBpZ25vcmUgaXQuXG4gICAgZWxzZSBpZiAodC5rID09PSBrKSByZXR1cm47XG5cbiAgICAvLyBPdGhlcndpc2UsIGNhcHR1cmUgdGhlIG1vdXNlIHBvaW50IGFuZCBsb2NhdGlvbiBhdCB0aGUgc3RhcnQuXG4gICAgZWxzZSB7XG4gICAgICBnLm1vdXNlID0gW3AsIHQuaW52ZXJ0KHApXTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG5cbiAgICBub2V2ZW50KCk7XG4gICAgZy53aGVlbCA9IHNldFRpbWVvdXQod2hlZWxpZGxlZCwgd2hlZWxEZWxheSk7XG4gICAgZy56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0LCBrKSwgZy5tb3VzZVswXSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcblxuICAgIGZ1bmN0aW9uIHdoZWVsaWRsZWQoKSB7XG4gICAgICBnLndoZWVsID0gbnVsbDtcbiAgICAgIGcuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbW91c2Vkb3duZWQoKSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nIHx8ICFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICB2ID0gc2VsZWN0KGV2ZW50LnZpZXcpLm9uKFwibW91c2Vtb3ZlLnpvb21cIiwgbW91c2Vtb3ZlZCwgdHJ1ZSkub24oXCJtb3VzZXVwLnpvb21cIiwgbW91c2V1cHBlZCwgdHJ1ZSksXG4gICAgICAgIHAgPSBtb3VzZSh0aGlzKSxcbiAgICAgICAgeDAgPSBldmVudC5jbGllbnRYLFxuICAgICAgICB5MCA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICBkcmFnRGlzYWJsZShldmVudC52aWV3KTtcbiAgICBub3Byb3BhZ2F0aW9uKCk7XG4gICAgZy5tb3VzZSA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCldO1xuICAgIGludGVycnVwdCh0aGlzKTtcbiAgICBnLnN0YXJ0KCk7XG5cbiAgICBmdW5jdGlvbiBtb3VzZW1vdmVkKCkge1xuICAgICAgbm9ldmVudCgpO1xuICAgICAgaWYgKCFnLm1vdmVkKSB7XG4gICAgICAgIHZhciBkeCA9IGV2ZW50LmNsaWVudFggLSB4MCwgZHkgPSBldmVudC5jbGllbnRZIC0geTA7XG4gICAgICAgIGcubW92ZWQgPSBkeCAqIGR4ICsgZHkgKiBkeSA+IGNsaWNrRGlzdGFuY2UyO1xuICAgICAgfVxuICAgICAgZy56b29tKFwibW91c2VcIiwgY29uc3RyYWluKHRyYW5zbGF0ZShnLnRoYXQuX196b29tLCBnLm1vdXNlWzBdID0gbW91c2UoZy50aGF0KSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3VzZXVwcGVkKCkge1xuICAgICAgdi5vbihcIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbVwiLCBudWxsKTtcbiAgICAgIGRyYWdFbmFibGUoZXZlbnQudmlldywgZy5tb3ZlZCk7XG4gICAgICBub2V2ZW50KCk7XG4gICAgICBnLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRibGNsaWNrZWQoKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciB0MCA9IHRoaXMuX196b29tLFxuICAgICAgICBwMCA9IG1vdXNlKHRoaXMpLFxuICAgICAgICBwMSA9IHQwLmludmVydChwMCksXG4gICAgICAgIGsxID0gdDAuayAqIChldmVudC5zaGlmdEtleSA/IDAuNSA6IDIpLFxuICAgICAgICB0MSA9IGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRyYW5zbGF0ZUV4dGVudCk7XG5cbiAgICBub2V2ZW50KCk7XG4gICAgaWYgKGR1cmF0aW9uID4gMCkgc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbikuY2FsbChzY2hlZHVsZSwgdDEsIHAwKTtcbiAgICBlbHNlIHNlbGVjdCh0aGlzKS5jYWxsKHpvb20udHJhbnNmb3JtLCB0MSk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaHN0YXJ0ZWQoKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIHN0YXJ0ZWQsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdCwgcDtcblxuICAgIG5vcHJvcGFnYXRpb24oKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHRvdWNoKHRoaXMsIHRvdWNoZXMsIHQuaWRlbnRpZmllcik7XG4gICAgICBwID0gW3AsIHRoaXMuX196b29tLmludmVydChwKSwgdC5pZGVudGlmaWVyXTtcbiAgICAgIGlmICghZy50b3VjaDApIGcudG91Y2gwID0gcCwgc3RhcnRlZCA9IHRydWU7XG4gICAgICBlbHNlIGlmICghZy50b3VjaDEpIGcudG91Y2gxID0gcDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgZGJsdGFwLCByZXJvdXRlIHRvIHRoZSAob3B0aW9uYWwpIGRibGNsaWNrLnpvb20gaGFuZGxlci5cbiAgICBpZiAodG91Y2hzdGFydGluZykge1xuICAgICAgdG91Y2hzdGFydGluZyA9IGNsZWFyVGltZW91dCh0b3VjaHN0YXJ0aW5nKTtcbiAgICAgIGlmICghZy50b3VjaDEpIHtcbiAgICAgICAgZy5lbmQoKTtcbiAgICAgICAgcCA9IHNlbGVjdCh0aGlzKS5vbihcImRibGNsaWNrLnpvb21cIik7XG4gICAgICAgIGlmIChwKSBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgdG91Y2hzdGFydGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoc3RhcnRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaG1vdmVkKCkge1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdCwgcCwgbDtcblxuICAgIG5vZXZlbnQoKTtcbiAgICBpZiAodG91Y2hzdGFydGluZykgdG91Y2hzdGFydGluZyA9IGNsZWFyVGltZW91dCh0b3VjaHN0YXJ0aW5nKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHRvdWNoKHRoaXMsIHRvdWNoZXMsIHQuaWRlbnRpZmllcik7XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDBbMF0gPSBwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDFbMF0gPSBwO1xuICAgIH1cbiAgICB0ID0gZy50aGF0Ll9fem9vbTtcbiAgICBpZiAoZy50b3VjaDEpIHtcbiAgICAgIHZhciBwMCA9IGcudG91Y2gwWzBdLCBsMCA9IGcudG91Y2gwWzFdLFxuICAgICAgICAgIHAxID0gZy50b3VjaDFbMF0sIGwxID0gZy50b3VjaDFbMV0sXG4gICAgICAgICAgZHAgPSAoZHAgPSBwMVswXSAtIHAwWzBdKSAqIGRwICsgKGRwID0gcDFbMV0gLSBwMFsxXSkgKiBkcCxcbiAgICAgICAgICBkbCA9IChkbCA9IGwxWzBdIC0gbDBbMF0pICogZGwgKyAoZGwgPSBsMVsxXSAtIGwwWzFdKSAqIGRsO1xuICAgICAgdCA9IHNjYWxlKHQsIE1hdGguc3FydChkcCAvIGRsKSk7XG4gICAgICBwID0gWyhwMFswXSArIHAxWzBdKSAvIDIsIChwMFsxXSArIHAxWzFdKSAvIDJdO1xuICAgICAgbCA9IFsobDBbMF0gKyBsMVswXSkgLyAyLCAobDBbMV0gKyBsMVsxXSkgLyAyXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZy50b3VjaDApIHAgPSBnLnRvdWNoMFswXSwgbCA9IGcudG91Y2gwWzFdO1xuICAgIGVsc2UgcmV0dXJuO1xuICAgIGcuem9vbShcInRvdWNoXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUodCwgcCwgbCksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoZW5kZWQoKSB7XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0O1xuXG4gICAgbm9wcm9wYWdhdGlvbigpO1xuICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV07XG4gICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gwO1xuICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gxO1xuICAgIH1cbiAgICBpZiAoZy50b3VjaDEgJiYgIWcudG91Y2gwKSBnLnRvdWNoMCA9IGcudG91Y2gxLCBkZWxldGUgZy50b3VjaDE7XG4gICAgaWYgKGcudG91Y2gwKSBnLnRvdWNoMFsxXSA9IHRoaXMuX196b29tLmludmVydChnLnRvdWNoMFswXSk7XG4gICAgZWxzZSBnLmVuZCgpO1xuICB9XG5cbiAgem9vbS53aGVlbERlbHRhID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoZWVsRGVsdGEgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgem9vbSkgOiB3aGVlbERlbHRhO1xuICB9O1xuXG4gIHpvb20uZmlsdGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgem9vbSkgOiBmaWx0ZXI7XG4gIH07XG5cbiAgem9vbS50b3VjaGFibGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCB6b29tKSA6IHRvdWNoYWJsZTtcbiAgfTtcblxuICB6b29tLmV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHRlbnQgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KFtbK19bMF1bMF0sICtfWzBdWzFdXSwgWytfWzFdWzBdLCArX1sxXVsxXV1dKSwgem9vbSkgOiBleHRlbnQ7XG4gIH07XG5cbiAgem9vbS5zY2FsZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZUV4dGVudFswXSA9ICtfWzBdLCBzY2FsZUV4dGVudFsxXSA9ICtfWzFdLCB6b29tKSA6IFtzY2FsZUV4dGVudFswXSwgc2NhbGVFeHRlbnRbMV1dO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zbGF0ZUV4dGVudFswXVswXSA9ICtfWzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMF0gPSArX1sxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdID0gK19bMF1bMV0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXSA9ICtfWzFdWzFdLCB6b29tKSA6IFtbdHJhbnNsYXRlRXh0ZW50WzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV1dLCBbdHJhbnNsYXRlRXh0ZW50WzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV1dXTtcbiAgfTtcblxuICB6b29tLmNvbnN0cmFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb25zdHJhaW4gPSBfLCB6b29tKSA6IGNvbnN0cmFpbjtcbiAgfTtcblxuICB6b29tLmR1cmF0aW9uID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGR1cmF0aW9uID0gK18sIHpvb20pIDogZHVyYXRpb247XG4gIH07XG5cbiAgem9vbS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0ZSA9IF8sIHpvb20pIDogaW50ZXJwb2xhdGU7XG4gIH07XG5cbiAgem9vbS5vbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSA9IGxpc3RlbmVycy5vbi5hcHBseShsaXN0ZW5lcnMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyB6b29tIDogdmFsdWU7XG4gIH07XG5cbiAgem9vbS5jbGlja0Rpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsaWNrRGlzdGFuY2UyID0gKF8gPSArXykgKiBfLCB6b29tKSA6IE1hdGguc3FydChjbGlja0Rpc3RhbmNlMik7XG4gIH07XG5cbiAgcmV0dXJuIHpvb207XG59XG4iLCJleHBvcnQge2RlZmF1bHQgYXMgYWNjZXNzb3J9IGZyb20gXCIuL3NyYy9hY2Nlc3NvclwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGFzc2lnbn0gZnJvbSBcIi4vc3JjL2Fzc2lnblwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGF0dHJpemV9IGZyb20gXCIuL3NyYy9hdHRyaXplXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgQmFzZUNsYXNzfSBmcm9tIFwiLi9zcmMvQmFzZUNsYXNzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY2xvc2VzdH0gZnJvbSBcIi4vc3JjL2Nsb3Nlc3RcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjb25maWdQcmVwfSBmcm9tIFwiLi9zcmMvY29uZmlnUHJlcFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGNvbnN0YW50fSBmcm9tIFwiLi9zcmMvY29uc3RhbnRcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBlbGVtfSBmcm9tIFwiLi9zcmMvZWxlbVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGlzT2JqZWN0fSBmcm9tIFwiLi9zcmMvaXNPYmplY3RcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBtZXJnZX0gZnJvbSBcIi4vc3JjL21lcmdlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcGFyc2VTaWRlc30gZnJvbSBcIi4vc3JjL3BhcnNlU2lkZXNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwcmVmaXh9IGZyb20gXCIuL3NyYy9wcmVmaXhcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBSRVNFVH0gZnJvbSBcIi4vc3JjL1JFU0VUXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3R5bGl6ZX0gZnJvbSBcIi4vc3JjL3N0eWxpemVcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB1dWlkfSBmcm9tIFwiLi9zcmMvdXVpZFwiO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgYXNzaWduIGZyb20gXCIuL2Fzc2lnblwiO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gXCIuL2lzT2JqZWN0XCI7XG5pbXBvcnQgdXVpZCBmcm9tIFwiLi91dWlkXCI7XG5pbXBvcnQgUkVTRVQgZnJvbSBcIi4vUkVTRVRcIjtcblxuLyoqXG4gICAgQGRlc2MgUmVjdXJzaXZlIGZ1bmN0aW9uIHRoYXQgcmVzZXRzIG5lc3RlZCBPYmplY3QgY29uZmlncy5cbiAgICBAcGFyYW0ge09iamVjdH0gb2JqXG4gICAgQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRzXG4gICAgQHByaXZhdGVcbiovXG5mdW5jdGlvbiBuZXN0ZWRSZXNldChvYmosIGRlZmF1bHRzKSB7XG4gIGlmIChpc09iamVjdChvYmopKSB7XG4gICAgZm9yICh2YXIgbmVzdGVkS2V5IGluIG9iaikge1xuICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwob2JqLCBuZXN0ZWRLZXkpICYmICFuZXN0ZWRLZXkuc3RhcnRzV2l0aChcIl9cIikpIHtcbiAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRzICYmIGlzT2JqZWN0KGRlZmF1bHRzKSA/IGRlZmF1bHRzW25lc3RlZEtleV0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChvYmpbbmVzdGVkS2V5XSA9PT0gUkVTRVQpIHtcbiAgICAgICAgICBvYmpbbmVzdGVkS2V5XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdChvYmpbbmVzdGVkS2V5XSkpIHtcbiAgICAgICAgICBuZXN0ZWRSZXNldChvYmpbbmVzdGVkS2V5XSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAgICBAY2xhc3MgQmFzZUNsYXNzXG4gICAgQHN1bW1hcnkgQW4gYWJzdHJhY3QgY2xhc3MgdGhhdCBjb250YWlucyBzb21lIGdsb2JhbCBtZXRob2RzIGFuZCBmdW5jdGlvbmFsaXR5LlxuKi9cbnZhciBCYXNlQ2xhc3MgPSBmdW5jdGlvbiBCYXNlQ2xhc3MoKSB7XG4gIHRoaXMuX29uID0ge307XG4gIHRoaXMuX3V1aWQgPSB1dWlkKCk7XG59O1xuXG4vKipcbiAgICBAbWVtYmVyb2YgQmFzZUNsYXNzXG4gICAgQGRlc2MgSWYgKnZhbHVlKiBpcyBzcGVjaWZpZWQsIHNldHMgdGhlIG1ldGhvZHMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBrZXkvdmFsdWUgcGFpcnMgYW5kIHJldHVybnMgdGhpcyBjbGFzcy4gSWYgKnZhbHVlKiBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXG4gICAgQHBhcmFtIHtPYmplY3R9IFsqdmFsdWUqXVxuICAgIEBjaGFpbmFibGVcbiovXG5CYXNlQ2xhc3MucHJvdG90eXBlLmNvbmZpZyA9IGZ1bmN0aW9uIGNvbmZpZyAoXykge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGlmICghdGhpcy5fY29uZmlnRGVmYXVsdCkge1xuICAgIHZhciBjb25maWcgPSB7fTtcbiAgICBmb3IgKHZhciBrIGluIHRoaXMkMS5fX3Byb3RvX18pIHtcbiAgICAgIGlmIChrLmluZGV4T2YoXCJfXCIpICE9PSAwICYmICFbXCJjb25maWdcIiwgXCJjb25zdHJ1Y3RvclwiLCBcInJlbmRlclwiXS5pbmNsdWRlcyhrKSkge1xuICAgICAgICB2YXIgdiA9IHRoaXMkMVtrXSgpO1xuICAgICAgICBjb25maWdba10gPSBpc09iamVjdCh2KSA/IGFzc2lnbih7fSwgdikgOiB2O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9jb25maWdEZWZhdWx0ID0gY29uZmlnO1xuICB9XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgZm9yICh2YXIgayQxIGluIF8pIHtcbiAgICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKF8sIGskMSkgJiYgayQxIGluIHRoaXMkMSkge1xuICAgICAgICB2YXIgdiQxID0gX1trJDFdO1xuICAgICAgICBpZiAodiQxID09PSBSRVNFVCkge1xuICAgICAgICAgIGlmIChrJDEgPT09IFwib25cIikgeyB0aGlzJDEuX29uID0gdGhpcyQxLl9jb25maWdEZWZhdWx0W2skMV07IH1cbiAgICAgICAgICBlbHNlIHsgdGhpcyQxW2skMV0odGhpcyQxLl9jb25maWdEZWZhdWx0W2skMV0pOyB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgbmVzdGVkUmVzZXQodiQxLCB0aGlzJDEuX2NvbmZpZ0RlZmF1bHRbayQxXSk7XG4gICAgICAgICAgdGhpcyQxW2skMV0odiQxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBlbHNlIHtcbiAgICB2YXIgY29uZmlnJDEgPSB7fTtcbiAgICBmb3IgKHZhciBrJDIgaW4gdGhpcyQxLl9fcHJvdG9fXykgeyBpZiAoayQyLmluZGV4T2YoXCJfXCIpICE9PSAwICYmICFbXCJjb25maWdcIiwgXCJjb25zdHJ1Y3RvclwiLCBcInJlbmRlclwiXS5pbmNsdWRlcyhrJDIpKSB7IGNvbmZpZyQxW2skMl0gPSB0aGlzJDFbayQyXSgpOyB9IH1cbiAgICByZXR1cm4gY29uZmlnJDE7XG4gIH1cbn07XG5cbi8qKlxuICAgIEBtZW1iZXJvZiBCYXNlQ2xhc3NcbiAgICBAZGVzYyBBZGRzIG9yIHJlbW92ZXMgYSAqbGlzdGVuZXIqIHRvIGVhY2ggb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50ICp0eXBlbmFtZXMqLiBJZiBhICpsaXN0ZW5lciogaXMgbm90IHNwZWNpZmllZCwgcmV0dXJucyB0aGUgY3VycmVudGx5IGFzc2lnbmVkIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50ICp0eXBlbmFtZSouIE1pcnJvcnMgdGhlIGNvcmUgW2QzLXNlbGVjdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLXNlbGVjdGlvbiNzZWxlY3Rpb25fb24pIGJlaGF2aW9yLlxuICAgIEBwYXJhbSB7U3RyaW5nfSBbKnR5cGVuYW1lcypdXG4gICAgQHBhcmFtIHtGdW5jdGlvbn0gWypsaXN0ZW5lcipdXG4gICAgQGNoYWluYWJsZVxuICAgIEBleGFtcGxlIDxjYXB0aW9uPkJ5IGRlZmF1bHQsIGxpc3RlbmVycyBhcHBseSBnbG9iYWxseSB0byBhbGwgb2JqZWN0cywgaG93ZXZlciwgcGFzc2luZyBhIG5hbWVzcGFjZSB3aXRoIHRoZSBjbGFzcyBuYW1lIGdpdmVzIGNvbnRyb2wgb3ZlciBzcGVjaWZpYyBlbGVtZW50czo8L2NhcHRpb24+XG5uZXcgUGxvdFxuLm9uKFwiY2xpY2suU2hhcGVcIiwgZnVuY3Rpb24oZCkge1xuICBjb25zb2xlLmxvZyhcImRhdGEgZm9yIHNoYXBlIGNsaWNrZWQ6XCIsIGQpO1xufSlcbi5vbihcImNsaWNrLkxlZ2VuZFwiLCBmdW5jdGlvbihkKSB7XG4gIGNvbnNvbGUubG9nKFwiZGF0YSBmb3IgbGVnZW5kIGNsaWNrZWQ6XCIsIGQpO1xufSlcbiovXG5CYXNlQ2xhc3MucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gb24gKF8sIGYpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDIgPyAodGhpcy5fb25bX10gPSBmLCB0aGlzKSA6IGFyZ3VtZW50cy5sZW5ndGggPyB0eXBlb2YgXyA9PT0gXCJzdHJpbmdcIiA/IHRoaXMuX29uW19dIDogKHRoaXMuX29uID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fb24sIF8pLCB0aGlzKSA6IHRoaXMuX29uO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQmFzZUNsYXNzO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXNlQ2xhc3MuanMubWFwIiwiLyoqXG4gICAgQGNvbnN0YW50IFJFU0VUXG4gICAgQGRlc2MgU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gcmVzZXQgYW4gaW5kaXZpZHVhbCBjb25maWcgcHJvcGVydHkuXG4qL1xuZXhwb3J0IGRlZmF1bHQgXCJEM1BMVVMtQ09NTU9OLVJFU0VUXCI7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJFU0VULmpzLm1hcCIsIi8qKlxuICAgIEBmdW5jdGlvbiBhY2Nlc3NvclxuICAgIEBkZXNjIFdyYXBzIGFuIG9iamVjdCBrZXkgaW4gYSBzaW1wbGUgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgQHBhcmFtIHtTdHJpbmd9IGtleSBUaGUga2V5IHRvIGJlIHJldHVybmVkIGZyb20gZWFjaCBPYmplY3QgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi5cbiAgICBAcGFyYW0geyp9IFtkZWZdIEEgZGVmYXVsdCB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50LlxuICAgIEBleGFtcGxlIDxjYXB0aW9uPnRoaXM8L2NhcHRpb24+XG5hY2Nlc3NvcihcImlkXCIpO1xuICAgIEBleGFtcGxlIDxjYXB0aW9uPnJldHVybnMgdGhpczwvY2FwdGlvbj5cbmZ1bmN0aW9uKGQpIHtcbiAgcmV0dXJuIGRbXCJpZFwiXTtcbn1cbiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihrZXksIGRlZikge1xuICBpZiAoZGVmID09PSB2b2lkIDApIHsgcmV0dXJuIGZ1bmN0aW9uIChkKSB7IHJldHVybiBkW2tleV07IH07IH1cbiAgcmV0dXJuIGZ1bmN0aW9uIChkKSB7IHJldHVybiBkW2tleV0gPT09IHZvaWQgMCA/IGRlZiA6IGRba2V5XTsgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWNjZXNzb3IuanMubWFwIiwiaW1wb3J0IHtkZWZhdWx0IGFzIGlzT2JqZWN0fSBmcm9tIFwiLi9pc09iamVjdFwiO1xuXG4vKipcbiAgICBAZnVuY3Rpb24gdmFsaWRPYmplY3RcbiAgICBAZGVzYyBEZXRlcm1pbmVzIGlmIHRoZSBvYmplY3QgcGFzc2VkIGlzIHRoZSBkb2N1bWVudCBvciB3aW5kb3cuXG4gICAgQHBhcmFtIHtPYmplY3R9IG9ialxuICAgIEBwcml2YXRlXG4qL1xuZnVuY3Rpb24gdmFsaWRPYmplY3Qob2JqKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7IHJldHVybiB0cnVlOyB9XG4gIGVsc2UgeyByZXR1cm4gb2JqICE9PSB3aW5kb3cgJiYgb2JqICE9PSBkb2N1bWVudDsgfVxufVxuXG4vKipcbiAgICBAZnVuY3Rpb24gYXNzaWduXG4gICAgQGRlc2MgQSBkZWVwbHkgcmVjdXJzaXZlIHZlcnNpb24gb2YgYE9iamVjdC5hc3NpZ25gLlxuICAgIEBwYXJhbSB7Li4uT2JqZWN0fSBvYmplY3RzXG4gICAgQGV4YW1wbGUgPGNhcHRpb24+dGhpczwvY2FwdGlvbj5cbmFzc2lnbih7aWQ6IFwiZm9vXCIsIGRlZXA6IHtncm91cDogXCJBXCJ9fSwge2lkOiBcImJhclwiLCBkZWVwOiB7dmFsdWU6IDIwfX0pKTtcbiAgICBAZXhhbXBsZSA8Y2FwdGlvbj5yZXR1cm5zIHRoaXM8L2NhcHRpb24+XG57aWQ6IFwiYmFyXCIsIGRlZXA6IHtncm91cDogXCJBXCIsIHZhbHVlOiAyMH19XG4qL1xuZnVuY3Rpb24gYXNzaWduKCkge1xuICB2YXIgb2JqZWN0cyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB3aGlsZSAoIGxlbi0tICkgb2JqZWN0c1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG5cbiAgdmFyIHRhcmdldCA9IG9iamVjdHNbMF07XG4gIHZhciBsb29wID0gZnVuY3Rpb24gKCBpICkge1xuXG4gICAgdmFyIHNvdXJjZSA9IG9iamVjdHNbaV07XG5cbiAgICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcblxuICAgICAgdmFyIHZhbHVlID0gc291cmNlW3Byb3BdO1xuXG4gICAgICBpZiAoaXNPYmplY3QodmFsdWUpICYmIHZhbGlkT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICBpZiAodGFyZ2V0Lmhhc093blByb3BlcnR5KHByb3ApICYmIGlzT2JqZWN0KHRhcmdldFtwcm9wXSkpIHsgdGFyZ2V0W3Byb3BdID0gYXNzaWduKHt9LCB0YXJnZXRbcHJvcF0sIHZhbHVlKTsgfVxuICAgICAgICBlbHNlIHsgdGFyZ2V0W3Byb3BdID0gYXNzaWduKHt9LCB2YWx1ZSk7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7IHRhcmdldFtwcm9wXSA9IHZhbHVlLnNsaWNlKCk7IH1cbiAgICAgIGVsc2UgeyB0YXJnZXRbcHJvcF0gPSB2YWx1ZTsgfVxuXG4gICAgfSk7XG4gIH07XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSBsb29wKCBpICk7XG5cbiAgcmV0dXJuIHRhcmdldDtcblxufVxuXG5leHBvcnQgZGVmYXVsdCBhc3NpZ247XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzc2lnbi5qcy5tYXAiLCIvKipcbiAgICBAZnVuY3Rpb24gYXR0cml6ZVxuICAgIEBkZXNjIEFwcGxpZXMgZWFjaCBrZXkvdmFsdWUgaW4gYW4gb2JqZWN0IGFzIGFuIGF0dHIuXG4gICAgQHBhcmFtIHtEM3NlbGVjdGlvbn0gZWxlbSBUaGUgRDMgZWxlbWVudCB0byBhcHBseSB0aGUgc3R5bGVzIHRvLlxuICAgIEBwYXJhbSB7T2JqZWN0fSBhdHRycyBBbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIGF0dHIgcGFpcnMuXG4qL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZSwgYSkge1xuICBpZiAoIGEgPT09IHZvaWQgMCApIGEgPSB7fTtcblxuICBmb3IgKHZhciBrIGluIGEpIHsgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoYSwgaykpIHsgZS5hdHRyKGssIGFba10pOyB9IH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXR0cml6ZS5qcy5tYXAiLCIvKipcbiAgICBAZnVuY3Rpb24gY2xvc2VzdFxuICAgIEBkZXNjIEZpbmRzIHRoZSBjbG9zZXN0IG51bWVyaWMgdmFsdWUgaW4gYW4gYXJyYXkuXG4gICAgQHBhcmFtIHtOdW1iZXJ9IG4gVGhlIG51bWJlciB2YWx1ZSB0byB1c2Ugd2hlbiBzZWFyY2hpbmcgdGhlIGFycmF5LlxuICAgIEBwYXJhbSB7QXJyYXl9IGFyciBUaGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRlc3QgYWdhaW5zdC5cbiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuLCBhcnIpIHtcbiAgaWYgKCBhcnIgPT09IHZvaWQgMCApIGFyciA9IFtdO1xuXG4gIGlmICghYXJyIHx8ICEoYXJyIGluc3RhbmNlb2YgQXJyYXkpIHx8ICFhcnIubGVuZ3RoKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgcmV0dXJuIGFyci5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnIpIHsgcmV0dXJuIE1hdGguYWJzKGN1cnIgLSBuKSA8IE1hdGguYWJzKHByZXYgLSBuKSA/IGN1cnIgOiBwcmV2OyB9KTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xvc2VzdC5qcy5tYXAiLCIvKipcbiAgICBAZnVuY3Rpb24gY29uZmlnUHJlcFxuICAgIEBkZXNjIFByZXBzIGEgY29uZmlnIG9iamVjdCBmb3IgZDNwbHVzIGRhdGEsIGFuZCBvcHRpb25hbGx5IGJ1YmJsZXMgdXAgYSBzcGVjaWZpYyBuZXN0ZWQgdHlwZS4gV2hlbiB1c2luZyB0aGlzIGZ1bmN0aW9uLCB5b3UgbXVzdCBiaW5kIGEgZDNwbHVzIGNsYXNzJyBgdGhpc2AgY29udGV4dC5cbiAgICBAcGFyYW0ge09iamVjdH0gW2NvbmZpZyA9IHRoaXMuX3NoYXBlQ29uZmlnXSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgdG8gcGFyc2UuXG4gICAgQHBhcmFtIHtTdHJpbmd9IFt0eXBlID0gXCJzaGFwZVwiXSBUaGUgZXZlbnQgY2xhc3NpZmllciB0byB1c2VyIGZvciBcIm9uXCIgZXZlbnRzLiBGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgZXZlbnQgdHlwZSBvZiBcInNoYXBlXCIgd2lsbCBhcHBseSBhbGwgZXZlbnRzIGluIHRoZSBcIm9uXCIgY29uZmlnIG9iamVjdCB3aXRoIHRoYXQga2V5LCBsaWtlIFwiY2xpY2suc2hhcGVcIiBhbmQgXCJtb3VzZWxlYXZlLnNoYXBlXCIsIGluIGFkZGl0aW9uIHRvIGFueSBnbG92YWwgZXZlbnRzIGxpa2UgXCJjbGlja1wiIGFuZCBcIm1vdXNlbGVhdmVcIi5cbiAgICBAcGFyYW0ge1N0cmluZ30gW25lc3RdIEFuIG9wdGlvbmFsIG5lc3RlZCBrZXkgdG8gYnViYmxlIHVwIHRvIHRoZSBwYXJlbnQgY29uZmlnIGxldmVsLlxuKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbmZpZ1ByZXAoY29uZmlnLCB0eXBlLCBuZXN0KSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuICBpZiAoIGNvbmZpZyA9PT0gdm9pZCAwICkgY29uZmlnID0gdGhpcy5fc2hhcGVDb25maWc7XG4gIGlmICggdHlwZSA9PT0gdm9pZCAwICkgdHlwZSA9IFwic2hhcGVcIjtcbiAgaWYgKCBuZXN0ID09PSB2b2lkIDAgKSBuZXN0ID0gZmFsc2U7XG5cblxuICB2YXIgbmV3Q29uZmlnID0ge2R1cmF0aW9uOiB0aGlzLl9kdXJhdGlvbiwgb246IHt9fTtcblxuICB2YXIgd3JhcEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHsgcmV0dXJuIGZ1bmN0aW9uIChkLCBpLCBzKSB7XG4gICAgd2hpbGUgKGQuX19kM3BsdXNfXykge1xuICAgICAgaSA9IGQuaTtcbiAgICAgIGQgPSBkLmRhdGEgfHwgZC5mZWF0dXJlO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYy5iaW5kKHRoaXMkMSkoZCwgaSwgcyk7XG4gIH07IH07XG5cbiAgdmFyIHBhcnNlRXZlbnRzID0gZnVuY3Rpb24gKG5ld09iaiwgb24pIHtcblxuICAgIGZvciAodmFyIGV2ZW50IGluIG9uKSB7XG5cbiAgICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9uLCBldmVudCkgJiYgIWV2ZW50LmluY2x1ZGVzKFwiLlwiKSB8fCBldmVudC5pbmNsdWRlcygoXCIuXCIgKyB0eXBlKSkpIHtcbiAgICAgICAgbmV3T2JqLm9uW2V2ZW50XSA9IHdyYXBGdW5jdGlvbihvbltldmVudF0pO1xuICAgICAgfVxuXG4gICAgfVxuXG4gIH07XG5cbiAgdmFyIGtleUV2YWwgPSBmdW5jdGlvbiAobmV3T2JqLCBvYmopIHtcblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcblxuICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gXCJvblwiKSB7IHBhcnNlRXZlbnRzKG5ld09iaiwgb2JqW2tleV0pOyB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgbmV3T2JqW2tleV0gPSB3cmFwRnVuY3Rpb24ob2JqW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gXCJvYmplY3RcIiAmJiAhKG9iaiBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICAgIG5ld09ialtrZXldID0ge29uOiB7fX07XG4gICAgICAgICAga2V5RXZhbChuZXdPYmpba2V5XSwgb2JqW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9XG5cbiAgICAgIH1cblxuICAgIH1cblxuICB9O1xuXG4gIGtleUV2YWwobmV3Q29uZmlnLCBjb25maWcpO1xuICBpZiAodGhpcy5fb24pIHsgcGFyc2VFdmVudHMobmV3Q29uZmlnLCB0aGlzLl9vbik7IH1cbiAgaWYgKG5lc3QgJiYgY29uZmlnW25lc3RdKSB7XG4gICAga2V5RXZhbChuZXdDb25maWcsIGNvbmZpZ1tuZXN0XSk7XG4gICAgaWYgKGNvbmZpZ1tuZXN0XS5vbikgeyBwYXJzZUV2ZW50cyhuZXdDb25maWcsIGNvbmZpZ1tuZXN0XS5vbik7IH1cbiAgfVxuXG4gIHJldHVybiBuZXdDb25maWc7XG5cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uZmlnUHJlcC5qcy5tYXAiLCIvKipcbiAgICBAZnVuY3Rpb24gY29uc3RhbnRcbiAgICBAZGVzYyBXcmFwcyBub24tZnVuY3Rpb24gdmFyaWFibGVzIGluIGEgc2ltcGxlIHJldHVybiBmdW5jdGlvbi5cbiAgICBAcGFyYW0ge0FycmF5fE51bWJlcnxPYmplY3R8U3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgZnJvbSB0aGUgZnVuY3Rpb24uXG4gICAgQGV4YW1wbGUgPGNhcHRpb24+dGhpczwvY2FwdGlvbj5cbmNvbnN0YW50KDQyKTtcbiAgICBAZXhhbXBsZSA8Y2FwdGlvbj5yZXR1cm5zIHRoaXM8L2NhcHRpb24+XG5mdW5jdGlvbigpIHtcbiAgcmV0dXJuIDQyO1xufVxuKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb25zdGFudCgpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0YW50LmpzLm1hcCIsImltcG9ydCB7c2VsZWN0fSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3RyYW5zaXRpb259IGZyb20gXCJkMy10cmFuc2l0aW9uXCI7XG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBhdHRyaXplfSBmcm9tIFwiLi9hdHRyaXplXCI7XG5cbi8qKlxuICAgIEBmdW5jdGlvbiBlbGVtXG4gICAgQGRlc2MgTWFuYWdlcyB0aGUgZW50ZXIvdXBkYXRlL2V4aXQgcGF0dGVybiBmb3IgYSBzaW5nbGUgRE9NIGVsZW1lbnQuXG4gICAgQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yIEEgRDMgc2VsZWN0b3IsIHdoaWNoIG11c3QgaW5jbHVkZSB0aGUgdGFnbmFtZSBhbmQgYSBjbGFzcyBhbmQvb3IgSUQuXG4gICAgQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBBZGRpdGlvbmFsIHBhcmFtZXRlcnMuXG4gICAgQHBhcmFtIHtCb29sZWFufSBbcGFyYW1zLmNvbmRpdGlvbiA9IHRydWVdIFdoZXRoZXIgb3Igbm90IHRoZSBlbGVtZW50IHNob3VsZCBiZSByZW5kZXJlZCAob3IgcmVtb3ZlZCkuXG4gICAgQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMuZW50ZXIgPSB7fV0gQSBjb2xsZWN0aW9uIG9mIGtleS92YWx1ZSBwYWlycyB0aGF0IG1hcCB0byBhdHRyaWJ1dGVzIHRvIGJlIGdpdmVuIG9uIGVudGVyLlxuICAgIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLmV4aXQgPSB7fV0gQSBjb2xsZWN0aW9uIG9mIGtleS92YWx1ZSBwYWlycyB0aGF0IG1hcCB0byBhdHRyaWJ1dGVzIHRvIGJlIGdpdmVuIG9uIGV4aXQuXG4gICAgQHBhcmFtIHtEM1NlbGVjdGlvbn0gW3BhcmFtcy5wYXJlbnQgPSBkMy5zZWxlY3QoXCJib2R5XCIpXSBUaGUgcGFyZW50IGVsZW1lbnQgZm9yIHRoaXMgbmV3IGVsZW1lbnQgdG8gYmUgYXBwZW5kZWQgdG8uXG4gICAgQHBhcmFtIHtEM1RyYW5zaXRpb259IFtwYXJhbXMudHJhbnNpdGlvbiA9IGQzLnRyYW5zaXRpb24oKS5kdXJhdGlvbigwKV0gVGhlIHRyYW5zaXRpb24gdG8gdXNlIHdoZW4gYW5pbWF0ZWQgdGhlIGRpZmZlcmVudCBsaWZlIGN5Y2xlIHN0YWdlcy5cbiAgICBAcGFyYW0ge09iamVjdH0gW3BhcmFtcy51cGRhdGUgPSB7fV0gQSBjb2xsZWN0aW9uIG9mIGtleS92YWx1ZSBwYWlycyB0aGF0IG1hcCB0byBhdHRyaWJ1dGVzIHRvIGJlIGdpdmVuIG9uIHVwZGF0ZS5cbiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3RvciwgcCkge1xuXG4gIC8vIG92ZXJyaWRlcyBkZWZhdWx0IHBhcmFtc1xuICBwID0gT2JqZWN0LmFzc2lnbih7fSwge1xuICAgIGNvbmRpdGlvbjogdHJ1ZSxcbiAgICBlbnRlcjoge30sXG4gICAgZXhpdDoge30sXG4gICAgcGFyZW50OiBzZWxlY3QoXCJib2R5XCIpLFxuICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb24oKS5kdXJhdGlvbigwKSxcbiAgICB1cGRhdGU6IHt9XG4gIH0sIHApO1xuXG4gIHZhciBjbGFzc05hbWUgPSAoL1xcLihbXiNdKykvZykuZXhlYyhzZWxlY3RvciksXG4gICAgICAgIGlkID0gKC8jKFteXFwuXSspL2cpLmV4ZWMoc2VsZWN0b3IpLFxuICAgICAgICB0YWcgPSAoL14oW14uXiNdKykvZykuZXhlYyhzZWxlY3RvcilbMV07XG5cbiAgdmFyIGVsZW0gPSBwLnBhcmVudC5zZWxlY3RBbGwoc2VsZWN0b3IuaW5jbHVkZXMoXCI6XCIpID8gc2VsZWN0b3Iuc3BsaXQoXCI6XCIpWzFdIDogc2VsZWN0b3IpXG4gICAgLmRhdGEocC5jb25kaXRpb24gPyBbbnVsbF0gOiBbXSk7XG5cbiAgdmFyIGVudGVyID0gZWxlbS5lbnRlcigpLmFwcGVuZCh0YWcpLmNhbGwoYXR0cml6ZSwgcC5lbnRlcik7XG5cbiAgaWYgKGlkKSB7IGVudGVyLmF0dHIoXCJpZFwiLCBpZFsxXSk7IH1cbiAgaWYgKGNsYXNzTmFtZSkgeyBlbnRlci5hdHRyKFwiY2xhc3NcIiwgY2xhc3NOYW1lWzFdKTsgfVxuXG4gIGVsZW0uZXhpdCgpLnRyYW5zaXRpb24ocC50cmFuc2l0aW9uKS5jYWxsKGF0dHJpemUsIHAuZXhpdCkucmVtb3ZlKCk7XG5cbiAgdmFyIHVwZGF0ZSA9IGVudGVyLm1lcmdlKGVsZW0pO1xuICB1cGRhdGUudHJhbnNpdGlvbihwLnRyYW5zaXRpb24pLmNhbGwoYXR0cml6ZSwgcC51cGRhdGUpO1xuXG4gIHJldHVybiB1cGRhdGU7XG5cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWxlbS5qcy5tYXAiLCIvKipcbiAgICBAZnVuY3Rpb24gaXNPYmplY3RcbiAgICBAZGVzYyBEZXRlY3RzIGlmIGEgdmFyaWFibGUgaXMgYSBqYXZhc2NyaXB0IE9iamVjdC5cbiAgICBAcGFyYW0geyp9IGl0ZW1cbiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpdGVtKSB7XG4gIHJldHVybiBpdGVtICYmXG4gICAgdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCBpdGVtICE9PSB3aW5kb3cgJiYgaXRlbSAhPT0gd2luZG93LmRvY3VtZW50ICYmICEoaXRlbSBpbnN0YW5jZW9mIEVsZW1lbnQpKSAmJlxuICAgICFBcnJheS5pc0FycmF5KGl0ZW0pXG4gICAgPyB0cnVlIDogZmFsc2U7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzT2JqZWN0LmpzLm1hcCIsImltcG9ydCB7bWVyZ2UsIHN1bX0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge2tleXN9IGZyb20gXCJkMy1jb2xsZWN0aW9uXCI7XG5cbi8qKlxuICAgIEBmdW5jdGlvbiBtZXJnZVxuICAgIEBkZXNjIENvbWJpbmVzIGFuIEFycmF5IG9mIE9iamVjdHMgdG9nZXRoZXIgYW5kIHJldHVybnMgYSBuZXcgT2JqZWN0LlxuICAgIEBwYXJhbSB7QXJyYXl9IG9iamVjdHMgVGhlIEFycmF5IG9mIG9iamVjdHMgdG8gYmUgbWVyZ2VkIHRvZ2V0aGVyLlxuICAgIEBwYXJhbSB7T2JqZWN0fSBhZ2dzIEFuIG9iamVjdCBjb250YWluaW5nIHNwZWNpZmljIGFnZ3JlZ2F0aW9uIG1ldGhvZHMgKGZ1bmN0aW9ucykgZm9yIGVhY2gga2V5IHR5cGUuIEJ5IGRlZmF1bHQsIG51bWJlcnMgYXJlIHN1bW1lZCBhbmQgc3RyaW5ncyBhcmUgcmV0dXJuZWQgYXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcy5cbiAgICBAZXhhbXBsZSA8Y2FwdGlvbj50aGlzPC9jYXB0aW9uPlxubWVyZ2UoW1xuICB7aWQ6IFwiZm9vXCIsIGdyb3VwOiBcIkFcIiwgdmFsdWU6IDEwLCBsaW5rczogWzEsIDJdfSxcbiAge2lkOiBcImJhclwiLCBncm91cDogXCJBXCIsIHZhbHVlOiAyMCwgbGlua3M6IFsxLCAzXX1cbl0pO1xuICAgIEBleGFtcGxlIDxjYXB0aW9uPnJldHVybnMgdGhpczwvY2FwdGlvbj5cbntpZDogW1wiYmFyXCIsIFwiZm9vXCJdLCBncm91cDogXCJBXCIsIHZhbHVlOiAzMCwgbGlua3M6IFsxLCAyLCAzXX1cbiovXG5mdW5jdGlvbiBvYmplY3RNZXJnZShvYmplY3RzLCBhZ2dzKSB7XG4gIGlmICggYWdncyA9PT0gdm9pZCAwICkgYWdncyA9IHt9O1xuXG5cbiAgdmFyIGF2YWlsYWJsZUtleXMgPSBuZXcgU2V0KG1lcmdlKG9iamVjdHMubWFwKGZ1bmN0aW9uIChvKSB7IHJldHVybiBrZXlzKG8pOyB9KSkpLFxuICAgICAgICBuZXdPYmplY3QgPSB7fTtcblxuICBhdmFpbGFibGVLZXlzLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICB2YXIgdmFsdWVzID0gb2JqZWN0cy5tYXAoZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG9ba107IH0pO1xuICAgIHZhciB2YWx1ZTtcbiAgICBpZiAoYWdnc1trXSkgeyB2YWx1ZSA9IGFnZ3Nba10odmFsdWVzKTsgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIHR5cGVzID0gdmFsdWVzLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdiB8fCB2ID09PSBmYWxzZSA/IHYuY29uc3RydWN0b3IgOiB2OyB9KS5maWx0ZXIoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgIT09IHZvaWQgMDsgfSk7XG4gICAgICBpZiAoIXR5cGVzLmxlbmd0aCkgeyB2YWx1ZSA9IHVuZGVmaW5lZDsgfVxuICAgICAgZWxzZSBpZiAodHlwZXMuaW5kZXhPZihBcnJheSkgPj0gMCkge1xuICAgICAgICB2YWx1ZSA9IG1lcmdlKHZhbHVlcy5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgaW5zdGFuY2VvZiBBcnJheSA/IHYgOiBbdl07IH0pKTtcbiAgICAgICAgdmFsdWUgPSBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWUpKTtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMSkgeyB2YWx1ZSA9IHZhbHVlWzBdOyB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlcy5pbmRleE9mKFN0cmluZykgPj0gMCkge1xuICAgICAgICB2YWx1ZSA9IEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMpKTtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMSkgeyB2YWx1ZSA9IHZhbHVlWzBdOyB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlcy5pbmRleE9mKE51bWJlcikgPj0gMCkgeyB2YWx1ZSA9IHN1bSh2YWx1ZXMpOyB9XG4gICAgICBlbHNlIGlmICh0eXBlcy5pbmRleE9mKE9iamVjdCkgPj0gMCkgeyB2YWx1ZSA9IG9iamVjdE1lcmdlKHZhbHVlcy5maWx0ZXIoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHY7IH0pKTsgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHZhbHVlID0gQXJyYXkuZnJvbShuZXcgU2V0KHZhbHVlcy5maWx0ZXIoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgIT09IHZvaWQgMDsgfSkpKTtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMSkgeyB2YWx1ZSA9IHZhbHVlWzBdOyB9XG4gICAgICB9XG4gICAgfVxuICAgIG5ld09iamVjdFtrXSA9IHZhbHVlO1xuICB9KTtcblxuICByZXR1cm4gbmV3T2JqZWN0O1xuXG59XG5cbmV4cG9ydCBkZWZhdWx0IG9iamVjdE1lcmdlO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXJnZS5qcy5tYXAiLCIvKipcbiBAZnVuY3Rpb24gcGFyc2VTaWRlc1xuIEBkZXNjIENvbnZlcnRzIGEgc3RyaW5nIG9mIGRpcmVjdGlvbmFsIENTUyBzaG9ydGhhbmQgdmFsdWVzIGludG8gYW4gb2JqZWN0IHdpdGggdGhlIHZhbHVlcyBleHBhbmRlZC5cbiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHNpZGVzIFRoZSBDU1Mgc2hvcnRoYW5kIHN0cmluZyB0byBleHBhbmQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNpZGVzKSB7XG4gIHZhciB2YWx1ZXM7XG4gIGlmICh0eXBlb2Ygc2lkZXMgPT09IFwibnVtYmVyXCIpIHsgdmFsdWVzID0gW3NpZGVzXTsgfVxuICBlbHNlIHsgdmFsdWVzID0gc2lkZXMuc3BsaXQoL1xccysvKTsgfVxuXG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxKSB7IHZhbHVlcyA9IFt2YWx1ZXNbMF0sIHZhbHVlc1swXSwgdmFsdWVzWzBdLCB2YWx1ZXNbMF1dOyB9XG4gIGVsc2UgaWYgKHZhbHVlcy5sZW5ndGggPT09IDIpIHsgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh2YWx1ZXMpOyB9XG4gIGVsc2UgaWYgKHZhbHVlcy5sZW5ndGggPT09IDMpIHsgdmFsdWVzLnB1c2godmFsdWVzWzFdKTsgfVxuXG4gIHJldHVybiBbXG4gICAgXCJ0b3BcIixcbiAgICBcInJpZ2h0XCIsXG4gICAgXCJib3R0b21cIixcbiAgICBcImxlZnRcIlxuICBdLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBkaXJlY3Rpb24sIGkpIHtcbiAgICB2YXIgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlc1tpXSk7XG4gICAgYWNjW2RpcmVjdGlvbl0gPSB2YWx1ZSB8fCAwO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2VTaWRlcy5qcy5tYXAiLCIvKipcbiAgICBAZnVuY3Rpb24gcHJlZml4XG4gICAgQGRlc2MgUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgQ1NTIHZlbmRvciBwcmVmaXgsIGdpdmVuIHRoZSBjdXJyZW50IGJyb3dzZXIuXG4qL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIGlmIChcIi13ZWJraXQtdHJhbnNmb3JtXCIgaW4gZG9jdW1lbnQuYm9keS5zdHlsZSkgeyByZXR1cm4gXCItd2Via2l0LVwiOyB9XG4gIGVsc2UgaWYgKFwiLW1vei10cmFuc2Zvcm1cIiBpbiBkb2N1bWVudC5ib2R5LnN0eWxlKSB7IHJldHVybiBcIi1tb3otXCI7IH1cbiAgZWxzZSBpZiAoXCItbXMtdHJhbnNmb3JtXCIgaW4gZG9jdW1lbnQuYm9keS5zdHlsZSkgeyByZXR1cm4gXCItbXMtXCI7IH1cbiAgZWxzZSBpZiAoXCItby10cmFuc2Zvcm1cIiBpbiBkb2N1bWVudC5ib2R5LnN0eWxlKSB7IHJldHVybiBcIi1vLVwiOyB9XG4gIGVsc2UgeyByZXR1cm4gXCJcIjsgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcmVmaXguanMubWFwIiwiLyoqXG4gICAgQGZ1bmN0aW9uIHN0eWxpemVcbiAgICBAZGVzYyBBcHBsaWVzIGVhY2gga2V5L3ZhbHVlIGluIGFuIG9iamVjdCBhcyBhIHN0eWxlLlxuICAgIEBwYXJhbSB7RDNzZWxlY3Rpb259IGVsZW0gVGhlIEQzIGVsZW1lbnQgdG8gYXBwbHkgdGhlIHN0eWxlcyB0by5cbiAgICBAcGFyYW0ge09iamVjdH0gc3R5bGVzIEFuIG9iamVjdCBvZiBrZXkvdmFsdWUgc3R5bGUgcGFpcnMuXG4qL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZSwgcykge1xuICBpZiAoIHMgPT09IHZvaWQgMCApIHMgPSB7fTtcblxuICBmb3IgKHZhciBrIGluIHMpIHsgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwocywgaykpIHsgZS5zdHlsZShrLCBzW2tdKTsgfSB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0eWxpemUuanMubWFwIiwiLyoqXG4gICAgQGZ1bmN0aW9uIHNcbiAgICBAZGVzYyBSZXR1cm5zIDQgcmFuZG9tIGNoYXJhY3RlcnMsIHVzZWQgZm9yIGNvbnN0cnVjdGluZyB1bmlxdWUgaWRlbnRpZmllcnMuXG4gICAgQHByaXZhdGVcbiovXG5mdW5jdGlvbiBzKCkge1xuICByZXR1cm4gTWF0aC5mbG9vcigoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtcbn1cblxuLyoqXG4gICAgQGZ1bmN0aW9uIHV1aWRcbiAgICBAc3VtbWFyeSBSZXR1cm5zIGEgdW5pcXVlIGlkZW50aWZpZXIuXG4qL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiAoXCJcIiArIChzKCkpICsgKHMoKSkgKyBcIi1cIiArIChzKCkpICsgXCItXCIgKyAocygpKSArIFwiLVwiICsgKHMoKSkgKyBcIi1cIiArIChzKCkpICsgKHMoKSkgKyAocygpKSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV1aWQuanMubWFwIiwiZXhwb3J0IHtkZWZhdWx0IGFzIGZvbnRFeGlzdHN9IGZyb20gXCIuL3NyYy9mb250RXhpc3RzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcnRsfSBmcm9tIFwiLi9zcmMvcnRsXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RyaW5naWZ5fSBmcm9tIFwiLi9zcmMvc3RyaW5naWZ5XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RyaXB9IGZyb20gXCIuL3NyYy9zdHJpcFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIFRleHRCb3h9IGZyb20gXCIuL3NyYy9UZXh0Qm94XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdGV4dFNwbGl0fSBmcm9tIFwiLi9zcmMvdGV4dFNwbGl0XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdGV4dFdpZHRofSBmcm9tIFwiLi9zcmMvdGV4dFdpZHRoXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgdGV4dFdyYXB9IGZyb20gXCIuL3NyYy90ZXh0V3JhcFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRpdGxlQ2FzZX0gZnJvbSBcIi4vc3JjL3RpdGxlQ2FzZVwiO1xuZXhwb3J0IHt0cmltLCB0cmltTGVmdCwgdHJpbVJpZ2h0fSBmcm9tIFwiLi9zcmMvdHJpbVwiO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvKipcbiAgICBAZXh0ZXJuYWwgQmFzZUNsYXNzXG4gICAgQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZDNwbHVzL2QzcGx1cy1jb21tb24jQmFzZUNsYXNzXG4qL1xuXG5pbXBvcnQge3NlbGVjdH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHt0cmFuc2l0aW9ufSBmcm9tIFwiZDMtdHJhbnNpdGlvblwiO1xuaW1wb3J0IHttYXgsIG1pbiwgc3VtfSBmcm9tIFwiZDMtYXJyYXlcIjtcblxuaW1wb3J0IHthY2Nlc3NvciwgQmFzZUNsYXNzLCBjb25zdGFudCwgcGFyc2VTaWRlc30gZnJvbSBcImQzcGx1cy1jb21tb25cIjtcblxuaW1wb3J0IGZvbnRFeGlzdHMgZnJvbSBcIi4vZm9udEV4aXN0c1wiO1xuaW1wb3J0IHtkZWZhdWx0IGFzIGRldGVjdFJUTH0gZnJvbSBcIi4vcnRsXCI7XG5pbXBvcnQgc3RyaXAgZnJvbSBcIi4vc3RyaXBcIjtcbmltcG9ydCB0ZXh0U3BsaXQgZnJvbSBcIi4vdGV4dFNwbGl0XCI7XG5pbXBvcnQgbWVhc3VyZSBmcm9tIFwiLi90ZXh0V2lkdGhcIjtcbmltcG9ydCB3cmFwIGZyb20gXCIuL3RleHRXcmFwXCI7XG5pbXBvcnQge3RyaW1SaWdodH0gZnJvbSBcIi4vdHJpbVwiO1xuXG4vKipcbiAgICBAY2xhc3MgVGV4dEJveFxuICAgIEBleHRlbmRzIGV4dGVybmFsOkJhc2VDbGFzc1xuICAgIEBkZXNjIENyZWF0ZXMgYSB3cmFwcGVkIHRleHQgYm94IGZvciBlYWNoIHBvaW50IGluIGFuIGFycmF5IG9mIGRhdGEuIFNlZSBbdGhpcyBleGFtcGxlXShodHRwczovL2QzcGx1cy5vcmcvZXhhbXBsZXMvZDNwbHVzLXRleHQvZ2V0dGluZy1zdGFydGVkLykgZm9yIGhlbHAgZ2V0dGluZyBzdGFydGVkIHVzaW5nIHRoZSBUZXh0Qm94IGNsYXNzLlxuKi9cbnZhciBUZXh0Qm94ID0gKGZ1bmN0aW9uIChCYXNlQ2xhc3MpIHtcbiAgZnVuY3Rpb24gVGV4dEJveCgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuXG4gICAgQmFzZUNsYXNzLmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLl9hcmlhSGlkZGVuID0gY29uc3RhbnQoXCJmYWxzZVwiKTtcbiAgICB0aGlzLl9kZWxheSA9IDA7XG4gICAgdGhpcy5fZHVyYXRpb24gPSAwO1xuICAgIHRoaXMuX2VsbGlwc2lzID0gZnVuY3Rpb24gKHRleHQsIGxpbmUpIHsgcmV0dXJuIGxpbmUgPyAoKHRleHQucmVwbGFjZSgvXFwufCwkL2csIFwiXCIpKSArIFwiLi4uXCIpIDogXCJcIjsgfTtcbiAgICB0aGlzLl9mb250Q29sb3IgPSBjb25zdGFudChcImJsYWNrXCIpO1xuICAgIHRoaXMuX2ZvbnRGYW1pbHkgPSBjb25zdGFudChbXCJSb2JvdG9cIiwgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBcIkhlbHZldGljYU5ldWVcIiwgXCJIZWx2ZXRpY2FcIiwgXCJBcmlhbFwiLCBcInNhbnMtc2VyaWZcIl0pO1xuICAgIHRoaXMuX2ZvbnRNYXggPSBjb25zdGFudCg1MCk7XG4gICAgdGhpcy5fZm9udE1pbiA9IGNvbnN0YW50KDgpO1xuICAgIHRoaXMuX2ZvbnRPcGFjaXR5ID0gY29uc3RhbnQoMSk7XG4gICAgdGhpcy5fZm9udFJlc2l6ZSA9IGNvbnN0YW50KGZhbHNlKTtcbiAgICB0aGlzLl9mb250U2l6ZSA9IGNvbnN0YW50KDEwKTtcbiAgICB0aGlzLl9mb250V2VpZ2h0ID0gY29uc3RhbnQoNDAwKTtcbiAgICB0aGlzLl9oZWlnaHQgPSBhY2Nlc3NvcihcImhlaWdodFwiLCAyMDApO1xuICAgIHRoaXMuX2lkID0gZnVuY3Rpb24gKGQsIGkpIHsgcmV0dXJuIGQuaWQgfHwgKFwiXCIgKyBpKTsgfTtcbiAgICB0aGlzLl9saW5lSGVpZ2h0ID0gZnVuY3Rpb24gKGQsIGkpIHsgcmV0dXJuIHRoaXMkMS5fZm9udFNpemUoZCwgaSkgKiAxLjI7IH07XG4gICAgdGhpcy5fbWF4TGluZXMgPSBjb25zdGFudChudWxsKTtcbiAgICB0aGlzLl9vbiA9IHt9O1xuICAgIHRoaXMuX292ZXJmbG93ID0gY29uc3RhbnQoZmFsc2UpO1xuICAgIHRoaXMuX3BhZGRpbmcgPSBjb25zdGFudCgwKTtcbiAgICB0aGlzLl9wb2ludGVyRXZlbnRzID0gY29uc3RhbnQoXCJhdXRvXCIpO1xuICAgIHRoaXMuX3JvdGF0ZSA9IGNvbnN0YW50KDApO1xuICAgIHRoaXMuX3JvdGF0ZUFuY2hvciA9IGZ1bmN0aW9uIChkKSB7IHJldHVybiBbZC53IC8gMiwgZC5oIC8gMl07IH07XG4gICAgdGhpcy5fc3BsaXQgPSB0ZXh0U3BsaXQ7XG4gICAgdGhpcy5fdGV4dCA9IGFjY2Vzc29yKFwidGV4dFwiKTtcbiAgICB0aGlzLl90ZXh0QW5jaG9yID0gY29uc3RhbnQoXCJzdGFydFwiKTtcbiAgICB0aGlzLl92ZXJ0aWNhbEFsaWduID0gY29uc3RhbnQoXCJ0b3BcIik7XG4gICAgdGhpcy5fd2lkdGggPSBhY2Nlc3NvcihcIndpZHRoXCIsIDIwMCk7XG4gICAgdGhpcy5feCA9IGFjY2Vzc29yKFwieFwiLCAwKTtcbiAgICB0aGlzLl95ID0gYWNjZXNzb3IoXCJ5XCIsIDApO1xuXG4gIH1cblxuICBpZiAoIEJhc2VDbGFzcyApIFRleHRCb3guX19wcm90b19fID0gQmFzZUNsYXNzO1xuICBUZXh0Qm94LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJhc2VDbGFzcyAmJiBCYXNlQ2xhc3MucHJvdG90eXBlICk7XG4gIFRleHRCb3gucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dEJveDtcblxuICAvKipcbiAgICAgIEBtZW1iZXJvZiBUZXh0Qm94XG4gICAgICBAZGVzYyBSZW5kZXJzIHRoZSB0ZXh0IGJveGVzLiBJZiBhICpjYWxsYmFjayogaXMgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIGNhbGxlZCBvbmNlIHRoZSBzaGFwZXMgYXJlIGRvbmUgZHJhd2luZy5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb259IFsqY2FsbGJhY2sqID0gdW5kZWZpbmVkXVxuICAqL1xuICBUZXh0Qm94LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIgKGNhbGxiYWNrKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgIGlmICh0aGlzLl9zZWxlY3QgPT09IHZvaWQgMCkgeyB0aGlzLnNlbGVjdChzZWxlY3QoXCJib2R5XCIpLmFwcGVuZChcInN2Z1wiKS5zdHlsZShcIndpZHRoXCIsICgod2luZG93LmlubmVyV2lkdGgpICsgXCJweFwiKSkuc3R5bGUoXCJoZWlnaHRcIiwgKCh3aW5kb3cuaW5uZXJIZWlnaHQpICsgXCJweFwiKSkubm9kZSgpKTsgfVxuXG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuXG4gICAgdmFyIGJveGVzID0gdGhpcy5fc2VsZWN0LnNlbGVjdEFsbChcIi5kM3BsdXMtdGV4dEJveFwiKS5kYXRhKHRoaXMuX2RhdGEucmVkdWNlKGZ1bmN0aW9uIChhcnIsIGQsIGkpIHtcblxuICAgICAgdmFyIHQgPSB0aGlzJDEuX3RleHQoZCwgaSk7XG4gICAgICBpZiAodCA9PT0gdm9pZCAwKSB7IHJldHVybiBhcnI7IH1cblxuICAgICAgdmFyIHJlc2l6ZSA9IHRoaXMkMS5fZm9udFJlc2l6ZShkLCBpKTtcbiAgICAgIHZhciBsSFJhdGlvID0gdGhpcyQxLl9saW5lSGVpZ2h0KGQsIGkpIC8gdGhpcyQxLl9mb250U2l6ZShkLCBpKTtcblxuICAgICAgdmFyIGZTID0gcmVzaXplID8gdGhpcyQxLl9mb250TWF4KGQsIGkpIDogdGhpcyQxLl9mb250U2l6ZShkLCBpKSxcbiAgICAgICAgICBsSCA9IHJlc2l6ZSA/IGZTICogbEhSYXRpbyA6IHRoaXMkMS5fbGluZUhlaWdodChkLCBpKSxcbiAgICAgICAgICBsaW5lID0gMSxcbiAgICAgICAgICBsaW5lRGF0YSA9IFtdLFxuICAgICAgICAgIHNpemVzLFxuICAgICAgICAgIHdyYXBSZXN1bHRzO1xuXG4gICAgICB2YXIgc3R5bGUgPSB7XG4gICAgICAgIFwiZm9udC1mYW1pbHlcIjogZm9udEV4aXN0cyh0aGlzJDEuX2ZvbnRGYW1pbHkoZCwgaSkpLFxuICAgICAgICBcImZvbnQtc2l6ZVwiOiBmUyxcbiAgICAgICAgXCJmb250LXdlaWdodFwiOiB0aGlzJDEuX2ZvbnRXZWlnaHQoZCwgaSksXG4gICAgICAgIFwibGluZS1oZWlnaHRcIjogbEhcbiAgICAgIH07XG5cbiAgICAgIHZhciBwYWRkaW5nID0gcGFyc2VTaWRlcyh0aGlzJDEuX3BhZGRpbmcoZCwgaSkpO1xuXG4gICAgICB2YXIgaCA9IHRoaXMkMS5faGVpZ2h0KGQsIGkpIC0gKHBhZGRpbmcudG9wICsgcGFkZGluZy5ib3R0b20pLFxuICAgICAgICAgICAgdyA9IHRoaXMkMS5fd2lkdGgoZCwgaSkgLSAocGFkZGluZy5sZWZ0ICsgcGFkZGluZy5yaWdodCk7XG5cbiAgICAgIHZhciB3cmFwcGVyID0gd3JhcCgpXG4gICAgICAgIC5mb250RmFtaWx5KHN0eWxlW1wiZm9udC1mYW1pbHlcIl0pXG4gICAgICAgIC5mb250U2l6ZShmUylcbiAgICAgICAgLmZvbnRXZWlnaHQoc3R5bGVbXCJmb250LXdlaWdodFwiXSlcbiAgICAgICAgLmxpbmVIZWlnaHQobEgpXG4gICAgICAgIC5tYXhMaW5lcyh0aGlzJDEuX21heExpbmVzKGQsIGkpKVxuICAgICAgICAuaGVpZ2h0KGgpXG4gICAgICAgIC5vdmVyZmxvdyh0aGlzJDEuX292ZXJmbG93KGQsIGkpKVxuICAgICAgICAud2lkdGgodyk7XG5cbiAgICAgIHZhciBmTWF4ID0gdGhpcyQxLl9mb250TWF4KGQsIGkpLFxuICAgICAgICAgICAgZk1pbiA9IHRoaXMkMS5fZm9udE1pbihkLCBpKSxcbiAgICAgICAgICAgIHZBID0gdGhpcyQxLl92ZXJ0aWNhbEFsaWduKGQsIGkpLFxuICAgICAgICAgICAgd29yZHMgPSB0aGlzJDEuX3NwbGl0KHQsIGkpO1xuXG4gICAgICAvKipcbiAgICAgICAgICBGaWd1cmVzIG91dCB0aGUgbGluZURhdGEgdG8gYmUgdXNlZCBmb3Igd3JhcHBpbmcuXG4gICAgICAgICAgQHByaXZhdGVcbiAgICAgICovXG4gICAgICBmdW5jdGlvbiBjaGVja1NpemUoKSB7XG4gICAgICAgIHZhciB0cnVuY2F0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobGluZSA8IDEpIHsgbGluZURhdGEgPSBbdGhhdC5fZWxsaXBzaXMoXCJcIiwgbGluZSldOyB9XG4gICAgICAgICAgZWxzZSB7IGxpbmVEYXRhW2xpbmUgLSAxXSA9IHRoYXQuX2VsbGlwc2lzKGxpbmVEYXRhW2xpbmUgLSAxXSwgbGluZSk7IH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDb25zdHJhaW50IHRoZSBmb250IHNpemVcbiAgICAgICAgZlMgPSBtYXgoW2ZTLCBmTWluXSk7XG4gICAgICAgIGZTID0gbWluKFtmUywgZk1heF0pO1xuXG4gICAgICAgIGlmIChyZXNpemUpIHtcbiAgICAgICAgICBsSCA9IGZTICogbEhSYXRpbztcbiAgICAgICAgICB3cmFwcGVyXG4gICAgICAgICAgICAuZm9udFNpemUoZlMpXG4gICAgICAgICAgICAubGluZUhlaWdodChsSCk7XG4gICAgICAgICAgc3R5bGVbXCJmb250LXNpemVcIl0gPSBmUztcbiAgICAgICAgICBzdHlsZVtcImxpbmUtaGVpZ2h0XCJdID0gbEg7XG4gICAgICAgIH1cblxuICAgICAgICB3cmFwUmVzdWx0cyA9IHdyYXBwZXIodCk7XG4gICAgICAgIGxpbmVEYXRhID0gd3JhcFJlc3VsdHMubGluZXMuZmlsdGVyKGZ1bmN0aW9uIChsKSB7IHJldHVybiBsICE9PSBcIlwiOyB9KTtcbiAgICAgICAgbGluZSA9IGxpbmVEYXRhLmxlbmd0aDtcblxuICAgICAgICBpZiAod3JhcFJlc3VsdHMudHJ1bmNhdGVkKSB7XG4gICAgICAgICAgaWYgKHJlc2l6ZSkge1xuICAgICAgICAgICAgZlMtLTtcbiAgICAgICAgICAgIGlmIChmUyA8IGZNaW4pIHtcbiAgICAgICAgICAgICAgZlMgPSBmTWluO1xuICAgICAgICAgICAgICB0cnVuY2F0ZSgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgY2hlY2tTaXplKCk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7IHRydW5jYXRlKCk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodyA+IGZNaW4gJiYgKGggPiBsSCB8fCByZXNpemUgJiYgaCA+IGZNaW4gKiBsSFJhdGlvKSkge1xuXG4gICAgICAgIGlmIChyZXNpemUpIHtcblxuICAgICAgICAgIHNpemVzID0gbWVhc3VyZSh3b3Jkcywgc3R5bGUpO1xuXG4gICAgICAgICAgdmFyIGFyZWFNb2QgPSAxLjE2NSArIHcgLyBoICogMC4xLFxuICAgICAgICAgICAgICAgIGJveEFyZWEgPSB3ICogaCxcbiAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IG1heChzaXplcyksXG4gICAgICAgICAgICAgICAgdGV4dEFyZWEgPSBzdW0oc2l6ZXMsIGZ1bmN0aW9uIChkKSB7IHJldHVybiBkICogbEg7IH0pICogYXJlYU1vZDtcblxuICAgICAgICAgIGlmIChtYXhXaWR0aCA+IHcgfHwgdGV4dEFyZWEgPiBib3hBcmVhKSB7XG4gICAgICAgICAgICB2YXIgYXJlYVJhdGlvID0gTWF0aC5zcXJ0KGJveEFyZWEgLyB0ZXh0QXJlYSksXG4gICAgICAgICAgICAgICAgICB3aWR0aFJhdGlvID0gdyAvIG1heFdpZHRoO1xuICAgICAgICAgICAgdmFyIHNpemVSYXRpbyA9IG1pbihbYXJlYVJhdGlvLCB3aWR0aFJhdGlvXSk7XG4gICAgICAgICAgICBmUyA9IE1hdGguZmxvb3IoZlMgKiBzaXplUmF0aW8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBoZWlnaHRNYXggPSBNYXRoLmZsb29yKGggKiAwLjgpO1xuICAgICAgICAgIGlmIChmUyA+IGhlaWdodE1heCkgeyBmUyA9IGhlaWdodE1heDsgfVxuXG4gICAgICAgIH1cblxuICAgICAgICBjaGVja1NpemUoKTtcblxuICAgICAgfVxuXG4gICAgICBpZiAobGluZURhdGEubGVuZ3RoKSB7XG5cbiAgICAgICAgdmFyIHRIID0gbGluZSAqIGxIO1xuICAgICAgICB2YXIgciA9IHRoaXMkMS5fcm90YXRlKGQsIGkpO1xuICAgICAgICB2YXIgeVAgPSByID09PSAwID8gdkEgPT09IFwidG9wXCIgPyAwIDogdkEgPT09IFwibWlkZGxlXCIgPyBoIC8gMiAtIHRIIC8gMiA6IGggLSB0SCA6IDA7XG4gICAgICAgIHlQIC09IGxIICogMC4xO1xuXG4gICAgICAgIGFyci5wdXNoKHtcbiAgICAgICAgICBhSDogdGhpcyQxLl9hcmlhSGlkZGVuKGQsIGkpLFxuICAgICAgICAgIGRhdGE6IGQsXG4gICAgICAgICAgaTogaSxcbiAgICAgICAgICBsaW5lczogbGluZURhdGEsXG4gICAgICAgICAgZkM6IHRoaXMkMS5fZm9udENvbG9yKGQsIGkpLFxuICAgICAgICAgIGZGOiBzdHlsZVtcImZvbnQtZmFtaWx5XCJdLFxuICAgICAgICAgIGZPOiB0aGlzJDEuX2ZvbnRPcGFjaXR5KGQsIGkpLFxuICAgICAgICAgIGZXOiBzdHlsZVtcImZvbnQtd2VpZ2h0XCJdLFxuICAgICAgICAgIGlkOiB0aGlzJDEuX2lkKGQsIGkpLFxuICAgICAgICAgIHRBOiB0aGlzJDEuX3RleHRBbmNob3IoZCwgaSksXG4gICAgICAgICAgdkE6IHRoaXMkMS5fdmVydGljYWxBbGlnbihkLCBpKSxcbiAgICAgICAgICB3aWR0aHM6IHdyYXBSZXN1bHRzLndpZHRocyxcbiAgICAgICAgICBmUzogZlMsIGxIOiBsSCwgdzogdywgaDogaCwgcjogcixcbiAgICAgICAgICB4OiB0aGlzJDEuX3goZCwgaSkgKyBwYWRkaW5nLmxlZnQsXG4gICAgICAgICAgeTogdGhpcyQxLl95KGQsIGkpICsgeVAgKyBwYWRkaW5nLnRvcFxuICAgICAgICB9KTtcblxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXJyO1xuXG4gICAgfSwgW10pLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gdGhpcyQxLl9pZChkLmRhdGEsIGQuaSk7IH0pO1xuXG4gICAgdmFyIHQgPSB0cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy5fZHVyYXRpb24pO1xuXG4gICAgaWYgKHRoaXMuX2R1cmF0aW9uID09PSAwKSB7XG5cbiAgICAgIGJveGVzLmV4aXQoKS5yZW1vdmUoKTtcblxuICAgIH1cbiAgICBlbHNlIHtcblxuICAgICAgYm94ZXMuZXhpdCgpLnRyYW5zaXRpb24oKS5kZWxheSh0aGlzLl9kdXJhdGlvbikucmVtb3ZlKCk7XG5cbiAgICAgIGJveGVzLmV4aXQoKS5zZWxlY3RBbGwoXCJ0ZXh0XCIpLnRyYW5zaXRpb24odClcbiAgICAgICAgLmF0dHIoXCJvcGFjaXR5XCIsIDApXG4gICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMCk7XG5cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByb3RhdGUodGV4dCkge1xuICAgICAgdGV4dC5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgIHZhciByb3RhdGVBbmNob3IgPSB0aGF0Ll9yb3RhdGVBbmNob3IoZCwgaSk7XG4gICAgICAgIHJldHVybiAoXCJ0cmFuc2xhdGUoXCIgKyAoZC54KSArIFwiLCBcIiArIChkLnkpICsgXCIpIHJvdGF0ZShcIiArIChkLnIpICsgXCIsIFwiICsgKHJvdGF0ZUFuY2hvclswXSkgKyBcIiwgXCIgKyAocm90YXRlQW5jaG9yWzFdKSArIFwiKVwiKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciB1cGRhdGUgPSBib3hlcy5lbnRlcigpLmFwcGVuZChcImdcIilcbiAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcImQzcGx1cy10ZXh0Qm94XCIpXG4gICAgICAgIC5hdHRyKFwiaWRcIiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIChcImQzcGx1cy10ZXh0Qm94LVwiICsgKHN0cmlwKGQuaWQpKSk7IH0pXG4gICAgICAgIC5jYWxsKHJvdGF0ZSlcbiAgICAgIC5tZXJnZShib3hlcyk7XG5cbiAgICB2YXIgcnRsID0gZGV0ZWN0UlRMKCk7XG5cbiAgICB1cGRhdGVcbiAgICAgIC5zdHlsZShcInBvaW50ZXItZXZlbnRzXCIsIGZ1bmN0aW9uIChkKSB7IHJldHVybiB0aGlzJDEuX3BvaW50ZXJFdmVudHMoZC5kYXRhLCBkLmkpOyB9KVxuICAgICAgLmVhY2goZnVuY3Rpb24oZCkge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgICAgU3R5bGVzIHRvIGFwcGx5IHRvIGVhY2ggPHRleHQ+IGVsZW1lbnQuXG4gICAgICAgICAgICBAcHJpdmF0ZVxuICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiB0ZXh0U3R5bGUodGV4dCkge1xuXG4gICAgICAgICAgdGV4dFxuICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHRyaW1SaWdodCh0KTsgfSlcbiAgICAgICAgICAgIC5hdHRyKFwiYXJpYS1oaWRkZW5cIiwgZC5hSClcbiAgICAgICAgICAgIC5hdHRyKFwiZGlyXCIsIHJ0bCA/IFwicnRsXCIgOiBcImx0clwiKVxuICAgICAgICAgICAgLmF0dHIoXCJmaWxsXCIsIGQuZkMpXG4gICAgICAgICAgICAuYXR0cihcInRleHQtYW5jaG9yXCIsIGQudEEpXG4gICAgICAgICAgICAuYXR0cihcImZvbnQtZmFtaWx5XCIsIGQuZkYpXG4gICAgICAgICAgICAuc3R5bGUoXCJmb250LWZhbWlseVwiLCBkLmZGKVxuICAgICAgICAgICAgLmF0dHIoXCJmb250LXNpemVcIiwgKChkLmZTKSArIFwicHhcIikpXG4gICAgICAgICAgICAuc3R5bGUoXCJmb250LXNpemVcIiwgKChkLmZTKSArIFwicHhcIikpXG4gICAgICAgICAgICAuYXR0cihcImZvbnQtd2VpZ2h0XCIsIGQuZlcpXG4gICAgICAgICAgICAuc3R5bGUoXCJmb250LXdlaWdodFwiLCBkLmZXKVxuICAgICAgICAgICAgLmF0dHIoXCJ4XCIsICgoZC50QSA9PT0gXCJtaWRkbGVcIiA/IGQudyAvIDIgOiBydGwgPyBkLnRBID09PSBcInN0YXJ0XCIgPyBkLncgOiAwIDogZC50QSA9PT0gXCJlbmRcIiA/IGQudyA6IDIgKiBNYXRoLnNpbihNYXRoLlBJICogZC5yIC8gMTgwKSkgKyBcInB4XCIpKVxuICAgICAgICAgICAgLmF0dHIoXCJ5XCIsIGZ1bmN0aW9uICh0LCBpKSB7IHJldHVybiBkLnIgPT09IDAgfHwgZC52QSA9PT0gXCJ0b3BcIiA/ICgoKGkgKyAxKSAqIGQubEggLSAoZC5sSCAtIGQuZlMpKSArIFwicHhcIikgOiBcbiAgICAgICAgICAgICAgZC52QSA9PT0gXCJtaWRkbGVcIiA/IFxuICAgICAgICAgICAgICAgICgoKGQuaCArIGQuZlMpIC8gMiAtIChkLmxIIC0gZC5mUykgKyAoaSAtIGQubGluZXMubGVuZ3RoIC8gMiArIDAuNSkgKiBkLmxIKSArIFwicHhcIikgOiBcbiAgICAgICAgICAgICAgICAoKGQuaCAtIDIgKiAoZC5sSCAtIGQuZlMpIC0gKGQubGluZXMubGVuZ3RoIC0gKGkgKyAxKSkgKiBkLmxIICsgMiAqIE1hdGguY29zKE1hdGguUEkgKiBkLnIgLyAxODApKSArIFwicHhcIik7IH0pO1xuXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGV4dHMgPSBzZWxlY3QodGhpcykuc2VsZWN0QWxsKFwidGV4dFwiKS5kYXRhKGQubGluZXMpO1xuXG4gICAgICAgIGlmICh0aGF0Ll9kdXJhdGlvbiA9PT0gMCkge1xuXG4gICAgICAgICAgdGV4dHMuY2FsbCh0ZXh0U3R5bGUpO1xuXG4gICAgICAgICAgdGV4dHMuZXhpdCgpLnJlbW92ZSgpO1xuXG4gICAgICAgICAgdGV4dHMuZW50ZXIoKS5hcHBlbmQoXCJ0ZXh0XCIpXG4gICAgICAgICAgICAuYXR0cihcImRvbWluYW50LWJhc2VsaW5lXCIsIFwiYWxwaGFiZXRpY1wiKVxuICAgICAgICAgICAgLnN0eWxlKFwiYmFzZWxpbmUtc2hpZnRcIiwgXCIwJVwiKVxuICAgICAgICAgICAgLmF0dHIoXCJ1bmljb2RlLWJpZGlcIiwgXCJiaWRpLW92ZXJyaWRlXCIpXG4gICAgICAgICAgICAuY2FsbCh0ZXh0U3R5bGUpXG4gICAgICAgICAgICAuYXR0cihcIm9wYWNpdHlcIiwgZC5mTylcbiAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgZC5mTyk7XG5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcblxuICAgICAgICAgIHRleHRzLnRyYW5zaXRpb24odCkuY2FsbCh0ZXh0U3R5bGUpO1xuXG4gICAgICAgICAgdGV4dHMuZXhpdCgpLnRyYW5zaXRpb24odClcbiAgICAgICAgICAgIC5hdHRyKFwib3BhY2l0eVwiLCAwKS5yZW1vdmUoKTtcblxuICAgICAgICAgIHRleHRzLmVudGVyKCkuYXBwZW5kKFwidGV4dFwiKVxuICAgICAgICAgICAgICAuYXR0cihcImRvbWluYW50LWJhc2VsaW5lXCIsIFwiYWxwaGFiZXRpY1wiKVxuICAgICAgICAgICAgICAuc3R5bGUoXCJiYXNlbGluZS1zaGlmdFwiLCBcIjAlXCIpXG4gICAgICAgICAgICAgIC5hdHRyKFwib3BhY2l0eVwiLCAwKVxuICAgICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIDApXG4gICAgICAgICAgICAgIC5jYWxsKHRleHRTdHlsZSlcbiAgICAgICAgICAgIC5tZXJnZSh0ZXh0cykudHJhbnNpdGlvbih0KS5kZWxheSh0aGF0Ll9kZWxheSlcbiAgICAgICAgICAgICAgLmNhbGwodGV4dFN0eWxlKVxuICAgICAgICAgICAgICAuYXR0cihcIm9wYWNpdHlcIiwgZC5mTylcbiAgICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCBkLmZPKTtcbiAgICAgICAgfVxuXG4gICAgICB9KVxuICAgICAgLnRyYW5zaXRpb24odCkuY2FsbChyb3RhdGUpO1xuXG4gICAgdmFyIGV2ZW50cyA9IE9iamVjdC5rZXlzKHRoaXMuX29uKSxcbiAgICAgICAgICBvbiA9IGV2ZW50cy5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgZSkge1xuICAgICAgICAgICAgb2JqW2VdID0gZnVuY3Rpb24gKGQsIGkpIHsgcmV0dXJuIHRoaXMkMS5fb25bZV0oZC5kYXRhLCBpKTsgfTtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgfSwge30pO1xuICAgIGZvciAodmFyIGUgPSAwOyBlIDwgZXZlbnRzLmxlbmd0aDsgZSsrKSB7IHVwZGF0ZS5vbihldmVudHNbZV0sIG9uW2V2ZW50c1tlXV0pOyB9XG5cbiAgICBpZiAoY2FsbGJhY2spIHsgc2V0VGltZW91dChjYWxsYmFjaywgdGhpcy5fZHVyYXRpb24gKyAxMDApOyB9XG5cbiAgICByZXR1cm4gdGhpcztcblxuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIFRleHRCb3hcbiAgICAgIEBkZXNjIElmICp2YWx1ZSogaXMgc3BlY2lmaWVkLCBzZXRzIHRoZSBhcmlhLWhpZGRlbiBhdHRyaWJ1dGUgdG8gdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBvciBzdHJpbmcgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgY2xhc3MgaW5zdGFuY2UuXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gKnZhbHVlKlxuICAgICAgQGNoYWluYWJsZVxuICAqL1xuICBUZXh0Qm94LnByb3RvdHlwZS5hcmlhSGlkZGVuID0gZnVuY3Rpb24gYXJpYUhpZGRlbiAoXykge1xuICAgIHJldHVybiBfICE9PSB1bmRlZmluZWQgXG4gICAgICA/ICh0aGlzLl9hcmlhSGlkZGVuID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChfKSwgdGhpcykgXG4gICAgICA6IHRoaXMuX2FyaWFIaWRkZW47XG4gIH07XG5cbiAgLyoqXG4gICAgICBAbWVtYmVyb2YgVGV4dEJveFxuICAgICAgQGRlc2MgU2V0cyB0aGUgZGF0YSBhcnJheSB0byB0aGUgc3BlY2lmaWVkIGFycmF5LiBBIHRleHQgYm94IHdpbGwgYmUgZHJhd24gZm9yIGVhY2ggb2JqZWN0IGluIHRoZSBhcnJheS5cbiAgICAgIEBwYXJhbSB7QXJyYXl9IFsqZGF0YSogPSBbXV1cbiAgICAgIEBjaGFpbmFibGVcbiAgKi9cbiAgVGV4dEJveC5wcm90b3R5cGUuZGF0YSA9IGZ1bmN0aW9uIGRhdGEgKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl9kYXRhID0gXywgdGhpcykgOiB0aGlzLl9kYXRhO1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIFRleHRCb3hcbiAgICAgIEBkZXNjIFNldHMgdGhlIGFuaW1hdGlvbiBkZWxheSB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBpbiBtaWxsaXNlY29uZHMuXG4gICAgICBAcGFyYW0ge051bWJlcn0gWyp2YWx1ZSogPSAwXVxuICAgICAgQGNoYWluYWJsZVxuICAqL1xuICBUZXh0Qm94LnByb3RvdHlwZS5kZWxheSA9IGZ1bmN0aW9uIGRlbGF5IChfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5fZGVsYXkgPSBfLCB0aGlzKSA6IHRoaXMuX2RlbGF5O1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIFRleHRCb3hcbiAgICAgIEBkZXNjIFNldHMgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBpbiBtaWxsaXNlY29uZHMuXG4gICAgICBAcGFyYW0ge051bWJlcn0gWyp2YWx1ZSogPSAwXVxuICAgICAgQGNoYWluYWJsZVxuICAqL1xuICBUZXh0Qm94LnByb3RvdHlwZS5kdXJhdGlvbiA9IGZ1bmN0aW9uIGR1cmF0aW9uIChfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5fZHVyYXRpb24gPSBfLCB0aGlzKSA6IHRoaXMuX2R1cmF0aW9uO1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIFRleHRCb3hcbiAgICAgIEBkZXNjIFNldHMgdGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB3aGF0IHRvIGRvIHdoZW4gYSBsaW5lIGlzIHRydW5jYXRlZC4gSXQgc2hvdWxkIHJldHVybiB0aGUgbmV3IHZhbHVlIGZvciB0aGUgbGluZSwgYW5kIGlzIHBhc3NlZCAyIGFyZ3VtZW50czogdGhlIFN0cmluZyBvZiB0ZXh0IGZvciB0aGUgbGluZSBpbiBxdWVzdGlvbiwgYW5kIHRoZSBudW1iZXIgb2YgdGhlIGxpbmUuIEJ5IGRlZmF1bHQsIGFuIGVsbGlwc2lzIGlzIGFkZGVkIHRvIHRoZSBlbmQgb2YgYW55IGxpbmUgZXhjZXB0IGlmIGl0IGlzIHRoZSBmaXJzdCB3b3JkIHRoYXQgY2Fubm90IGZpdCAoaW4gdGhhdCBjYXNlLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQpLlxuICAgICAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IFsqdmFsdWUqXVxuICAgICAgQGNoYWluYWJsZVxuICAgICAgQGV4YW1wbGUgPGNhcHRpb24+ZGVmYXVsdCBhY2Nlc3NvcjwvY2FwdGlvbj5cbmZ1bmN0aW9uKHRleHQsIGxpbmUpIHtcbiAgcmV0dXJuIGxpbmUgPyB0ZXh0LnJlcGxhY2UoL1xcLnwsJC9nLCBcIlwiKSArIFwiLi4uXCIgOiBcIlwiO1xufVxuICAqL1xuICBUZXh0Qm94LnByb3RvdHlwZS5lbGxpcHNpcyA9IGZ1bmN0aW9uIGVsbGlwc2lzIChfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5fZWxsaXBzaXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCB0aGlzKSA6IHRoaXMuX2VsbGlwc2lzO1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIFRleHRCb3hcbiAgICAgIEBkZXNjIFNldHMgdGhlIGZvbnQgY29sb3IgdG8gdGhlIHNwZWNpZmllZCBhY2Nlc3NvciBmdW5jdGlvbiBvciBzdGF0aWMgc3RyaW5nLCB3aGljaCBpcyBpbmZlcnJlZCBmcm9tIHRoZSBbRE9NIHNlbGVjdGlvbl0oI3RleHRCb3guc2VsZWN0KSBieSBkZWZhdWx0LlxuICAgICAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IFsqdmFsdWUqID0gXCJibGFja1wiXVxuICAgICAgQGNoYWluYWJsZVxuICAqL1xuICBUZXh0Qm94LnByb3RvdHlwZS5mb250Q29sb3IgPSBmdW5jdGlvbiBmb250Q29sb3IgKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl9mb250Q29sb3IgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCB0aGlzKSA6IHRoaXMuX2ZvbnRDb2xvcjtcbiAgfTtcblxuICAvKipcbiAgICAgIEBtZW1iZXJvZiBUZXh0Qm94XG4gICAgICBAZGVzYyBEZWZpbmVzIHRoZSBmb250LWZhbWlseSB0byBiZSB1c2VkLiBUaGUgdmFsdWUgcGFzc2VkIGNhbiBiZSBlaXRoZXIgYSAqU3RyaW5nKiBuYW1lIG9mIGEgZm9udCwgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBmb250LWZhbWlseSBmYWxsYmFja3MsIGFuICpBcnJheSogb2YgZmFsbGJhY2tzLCBvciBhICpGdW5jdGlvbiogdGhhdCByZXR1cm5zIGVpdGhlciBhICpTdHJpbmcqIG9yIGFuICpBcnJheSouIElmIHN1cHBseWluZyBtdWx0aXBsZSBmYWxsYmFjayBmb250cywgdGhlIFtmb250RXhpc3RzXSgjZm9udEV4aXN0cykgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgZmlyc3QgYXZhaWxhYmxlIGZvbnQgb24gdGhlIGNsaWVudCdzIG1hY2hpbmUuXG4gICAgICBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufFN0cmluZ30gWyp2YWx1ZSogPSBbXCJSb2JvdG9cIiwgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBcIkhlbHZldGljYU5ldWVcIiwgXCJIZWx2ZXRpY2FcIiwgXCJBcmlhbFwiLCBcInNhbnMtc2VyaWZcIl1dXG4gICAgICBAY2hhaW5hYmxlXG4gICovXG4gIFRleHRCb3gucHJvdG90eXBlLmZvbnRGYW1pbHkgPSBmdW5jdGlvbiBmb250RmFtaWx5IChfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5fZm9udEZhbWlseSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIHRoaXMpIDogdGhpcy5fZm9udEZhbWlseTtcbiAgfTtcblxuICAvKipcbiAgICAgIEBtZW1iZXJvZiBUZXh0Qm94XG4gICAgICBAZGVzYyBTZXRzIHRoZSBtYXhpbXVtIGZvbnQgc2l6ZSB0byB0aGUgc3BlY2lmaWVkIGFjY2Vzc29yIGZ1bmN0aW9uIG9yIHN0YXRpYyBudW1iZXIgKHdoaWNoIGNvcnJlc3BvbmRzIHRvIHBpeGVsIHVuaXRzKSwgd2hpY2ggaXMgdXNlZCB3aGVuIFtkeW5hbWljYWxseSByZXNpemluZyBmb250c10oI3RleHRCb3guZm9udFJlc2l6ZSkuXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufE51bWJlcn0gWyp2YWx1ZSogPSA1MF1cbiAgICAgIEBjaGFpbmFibGVcbiAgKi9cbiAgVGV4dEJveC5wcm90b3R5cGUuZm9udE1heCA9IGZ1bmN0aW9uIGZvbnRNYXggKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl9mb250TWF4ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChfKSwgdGhpcykgOiB0aGlzLl9mb250TWF4O1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIFRleHRCb3hcbiAgICAgIEBkZXNjIFNldHMgdGhlIG1pbmltdW0gZm9udCBzaXplIHRvIHRoZSBzcGVjaWZpZWQgYWNjZXNzb3IgZnVuY3Rpb24gb3Igc3RhdGljIG51bWJlciAod2hpY2ggY29ycmVzcG9uZHMgdG8gcGl4ZWwgdW5pdHMpLCB3aGljaCBpcyB1c2VkIHdoZW4gW2R5bmFtaWNhbGx5IHJlc2l6aW5nIGZvbnRzXSgjdGV4dEJveC5mb250UmVzaXplKS5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb258TnVtYmVyfSBbKnZhbHVlKiA9IDhdXG4gICAgICBAY2hhaW5hYmxlXG4gICovXG4gIFRleHRCb3gucHJvdG90eXBlLmZvbnRNaW4gPSBmdW5jdGlvbiBmb250TWluIChfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5fZm9udE1pbiA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIHRoaXMpIDogdGhpcy5fZm9udE1pbjtcbiAgfTtcblxuICAvKipcbiAgICAgIEBtZW1iZXJvZiBUZXh0Qm94XG4gICAgICBAZGVzYyBTZXRzIHRoZSBmb250IG9wYWNpdHkgdG8gdGhlIHNwZWNpZmllZCBhY2Nlc3NvciBmdW5jdGlvbiBvciBzdGF0aWMgbnVtYmVyIGJldHdlZW4gMCBhbmQgMS5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb258TnVtYmVyfSBbKnZhbHVlKiA9IDFdXG4gICAgICBAY2hhaW5hYmxlXG4gICAqL1xuICBUZXh0Qm94LnByb3RvdHlwZS5mb250T3BhY2l0eSA9IGZ1bmN0aW9uIGZvbnRPcGFjaXR5IChfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5fZm9udE9wYWNpdHkgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCB0aGlzKSA6IHRoaXMuX2ZvbnRPcGFjaXR5O1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIFRleHRCb3hcbiAgICAgIEBkZXNjIFRvZ2dsZXMgZm9udCByZXNpemluZywgd2hpY2ggY2FuIGVpdGhlciBiZSBkZWZpbmVkIGFzIGEgc3RhdGljIGJvb2xlYW4gZm9yIGFsbCBkYXRhIHBvaW50cywgb3IgYW4gYWNjZXNzb3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgYm9vbGVhbi4gU2VlIFt0aGlzIGV4YW1wbGVdKGh0dHA6Ly9kM3BsdXMub3JnL2V4YW1wbGVzL2QzcGx1cy10ZXh0L3Jlc2l6aW5nLXRleHQvKSBmb3IgYSBzaWRlLWJ5LXNpZGUgY29tcGFyaXNvbi5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb258Qm9vbGVhbn0gWyp2YWx1ZSogPSBmYWxzZV1cbiAgICAgIEBjaGFpbmFibGVcbiAgKi9cbiAgVGV4dEJveC5wcm90b3R5cGUuZm9udFJlc2l6ZSA9IGZ1bmN0aW9uIGZvbnRSZXNpemUgKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl9mb250UmVzaXplID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChfKSwgdGhpcykgOiB0aGlzLl9mb250UmVzaXplO1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIFRleHRCb3hcbiAgICAgIEBkZXNjIFNldHMgdGhlIGZvbnQgc2l6ZSB0byB0aGUgc3BlY2lmaWVkIGFjY2Vzc29yIGZ1bmN0aW9uIG9yIHN0YXRpYyBudW1iZXIgKHdoaWNoIGNvcnJlc3BvbmRzIHRvIHBpeGVsIHVuaXRzKSwgd2hpY2ggaXMgaW5mZXJyZWQgZnJvbSB0aGUgW0RPTSBzZWxlY3Rpb25dKCN0ZXh0Qm94LnNlbGVjdCkgYnkgZGVmYXVsdC5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb258TnVtYmVyfSBbKnZhbHVlKiA9IDEwXVxuICAgICAgQGNoYWluYWJsZVxuICAqL1xuICBUZXh0Qm94LnByb3RvdHlwZS5mb250U2l6ZSA9IGZ1bmN0aW9uIGZvbnRTaXplIChfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5fZm9udFNpemUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCB0aGlzKSA6IHRoaXMuX2ZvbnRTaXplO1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIFRleHRCb3hcbiAgICAgIEBkZXNjIFNldHMgdGhlIGZvbnQgd2VpZ2h0IHRvIHRoZSBzcGVjaWZpZWQgYWNjZXNzb3IgZnVuY3Rpb24gb3Igc3RhdGljIG51bWJlciwgd2hpY2ggaXMgaW5mZXJyZWQgZnJvbSB0aGUgW0RPTSBzZWxlY3Rpb25dKCN0ZXh0Qm94LnNlbGVjdCkgYnkgZGVmYXVsdC5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb258TnVtYmVyfFN0cmluZ30gWyp2YWx1ZSogPSA0MDBdXG4gICAgICBAY2hhaW5hYmxlXG4gICovXG4gIFRleHRCb3gucHJvdG90eXBlLmZvbnRXZWlnaHQgPSBmdW5jdGlvbiBmb250V2VpZ2h0IChfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5fZm9udFdlaWdodCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIHRoaXMpIDogdGhpcy5fZm9udFdlaWdodDtcbiAgfTtcblxuICAvKipcbiAgICAgIEBtZW1iZXJvZiBUZXh0Qm94XG4gICAgICBAZGVzYyBTZXRzIHRoZSBoZWlnaHQgZm9yIGVhY2ggYm94IHRvIHRoZSBzcGVjaWZpZWQgYWNjZXNzb3IgZnVuY3Rpb24gb3Igc3RhdGljIG51bWJlci5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb258TnVtYmVyfSBbKnZhbHVlKl1cbiAgICAgIEBjaGFpbmFibGVcbiAgICAgIEBleGFtcGxlIDxjYXB0aW9uPmRlZmF1bHQgYWNjZXNzb3I8L2NhcHRpb24+XG5mdW5jdGlvbihkKSB7XG4gIHJldHVybiBkLmhlaWdodCB8fCAyMDA7XG59XG4gICovXG4gIFRleHRCb3gucHJvdG90eXBlLmhlaWdodCA9IGZ1bmN0aW9uIGhlaWdodCAoXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX2hlaWdodCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIHRoaXMpIDogdGhpcy5faGVpZ2h0O1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIFRleHRCb3hcbiAgICAgIEBkZXNjIERlZmluZXMgdGhlIHVuaXF1ZSBpZCBmb3IgZWFjaCBib3ggdG8gdGhlIHNwZWNpZmllZCBhY2Nlc3NvciBmdW5jdGlvbiBvciBzdGF0aWMgbnVtYmVyLlxuICAgICAgQHBhcmFtIHtGdW5jdGlvbnxOdW1iZXJ9IFsqdmFsdWUqXVxuICAgICAgQGNoYWluYWJsZVxuICAgICAgQGV4YW1wbGUgPGNhcHRpb24+ZGVmYXVsdCBhY2Nlc3NvcjwvY2FwdGlvbj5cbmZ1bmN0aW9uKGQsIGkpIHtcbiAgcmV0dXJuIGQuaWQgfHwgaSArIFwiXCI7XG59XG4gICovXG4gIFRleHRCb3gucHJvdG90eXBlLmlkID0gZnVuY3Rpb24gaWQgKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl9pZCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIHRoaXMpIDogdGhpcy5faWQ7XG4gIH07XG5cbiAgLyoqXG4gICAgICBAbWVtYmVyb2YgVGV4dEJveFxuICAgICAgQGRlc2MgU2V0cyB0aGUgbGluZSBoZWlnaHQgdG8gdGhlIHNwZWNpZmllZCBhY2Nlc3NvciBmdW5jdGlvbiBvciBzdGF0aWMgbnVtYmVyLCB3aGljaCBpcyAxLjIgdGltZXMgdGhlIFtmb250IHNpemVdKCN0ZXh0Qm94LmZvbnRTaXplKSBieSBkZWZhdWx0LlxuICAgICAgQHBhcmFtIHtGdW5jdGlvbnxOdW1iZXJ9IFsqdmFsdWUqXVxuICAgICAgQGNoYWluYWJsZVxuICAqL1xuICBUZXh0Qm94LnByb3RvdHlwZS5saW5lSGVpZ2h0ID0gZnVuY3Rpb24gbGluZUhlaWdodCAoXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX2xpbmVIZWlnaHQgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCB0aGlzKSA6IHRoaXMuX2xpbmVIZWlnaHQ7XG4gIH07XG5cbiAgLyoqXG4gICAgICBAbWVtYmVyb2YgVGV4dEJveFxuICAgICAgQGRlc2MgUmVzdHJpY3RzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byB3cmFwIG9udG8sIHdoaWNoIGlzIG51bGwgKHVubGltaXRlZCkgYnkgZGVmYXVsdC5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb258TnVtYmVyfSBbKnZhbHVlKl1cbiAgICAgIEBjaGFpbmFibGVcbiAgKi9cbiAgVGV4dEJveC5wcm90b3R5cGUubWF4TGluZXMgPSBmdW5jdGlvbiBtYXhMaW5lcyAoXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX21heExpbmVzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChfKSwgdGhpcykgOiB0aGlzLl9tYXhMaW5lcztcbiAgfTtcblxuICAvKipcbiAgICAgIEBtZW1iZXJvZiBUZXh0Qm94XG4gICAgICBAZGVzYyBTZXRzIHRoZSB0ZXh0IG92ZXJmbG93IHRvIHRoZSBzcGVjaWZpZWQgYWNjZXNzb3IgZnVuY3Rpb24gb3Igc3RhdGljIGJvb2xlYW4uXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufEJvb2xlYW59IFsqdmFsdWUqID0gZmFsc2VdXG4gICAgICBAY2hhaW5hYmxlXG4gICovXG4gIFRleHRCb3gucHJvdG90eXBlLm92ZXJmbG93ID0gZnVuY3Rpb24gb3ZlcmZsb3cgKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl9vdmVyZmxvdyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIHRoaXMpIDogdGhpcy5fb3ZlcmZsb3c7XG4gIH07XG5cbiAgLyoqXG4gICAgICBAbWVtYmVyb2YgVGV4dEJveFxuICAgICAgQGRlc2MgU2V0cyB0aGUgcGFkZGluZyB0byB0aGUgc3BlY2lmaWVkIGFjY2Vzc29yIGZ1bmN0aW9uLCBDU1Mgc2hvcnRoYW5kIHN0cmluZywgb3Igc3RhdGljIG51bWJlciwgd2hpY2ggaXMgMCBieSBkZWZhdWx0LlxuICAgICAgQHBhcmFtIHtGdW5jdGlvbnxOdW1iZXJ8U3RyaW5nfSBbKnZhbHVlKl1cbiAgICAgIEBjaGFpbmFibGVcbiAgKi9cbiAgVGV4dEJveC5wcm90b3R5cGUucGFkZGluZyA9IGZ1bmN0aW9uIHBhZGRpbmcgKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl9wYWRkaW5nID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChfKSwgdGhpcykgOiB0aGlzLl9wYWRkaW5nO1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIFRleHRCb3hcbiAgICAgIEBkZXNjIFNldHMgdGhlIHBvaW50ZXItZXZlbnRzIHRvIHRoZSBzcGVjaWZpZWQgYWNjZXNzb3IgZnVuY3Rpb24gb3Igc3RhdGljIHN0cmluZy5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBbKnZhbHVlKiA9IFwiYXV0b1wiXVxuICAgICAgQGNoYWluYWJsZVxuICAqL1xuICBUZXh0Qm94LnByb3RvdHlwZS5wb2ludGVyRXZlbnRzID0gZnVuY3Rpb24gcG9pbnRlckV2ZW50cyAoXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3BvaW50ZXJFdmVudHMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCB0aGlzKSA6IHRoaXMuX3BvaW50ZXJFdmVudHM7XG4gIH07XG5cbiAgLyoqXG4gICAgICBAbWVtYmVyb2YgVGV4dEJveFxuICAgICAgQGRlc2MgU2V0cyB0aGUgcm90YXRlIHBlcmNlbnRhZ2UgZm9yIGVhY2ggYm94IHRvIHRoZSBzcGVjaWZpZWQgYWNjZXNzb3IgZnVuY3Rpb24gb3Igc3RhdGljIHN0cmluZy5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb258TnVtYmVyfSBbKnZhbHVlKiA9IDBdXG4gICAgICBAY2hhaW5hYmxlXG4gICovXG4gIFRleHRCb3gucHJvdG90eXBlLnJvdGF0ZSA9IGZ1bmN0aW9uIHJvdGF0ZSAoXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3JvdGF0ZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIHRoaXMpIDogdGhpcy5fcm90YXRlO1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIFRleHRCb3hcbiAgICAgIEBkZXNjIFNldHMgdGhlIGFuY2hvciBwb2ludCBhcm91bmQgd2hpY2ggdG8gcm90YXRlIHRoZSB0ZXh0IGJveC5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb258TnVtYmVyW119XG4gICAgICBAY2hhaW5hYmxlXG4gICAqL1xuICBUZXh0Qm94LnByb3RvdHlwZS5yb3RhdGVBbmNob3IgPSBmdW5jdGlvbiByb3RhdGVBbmNob3IgKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl9yb3RhdGVBbmNob3IgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCB0aGlzKSA6IHRoaXMuX3JvdGF0ZUFuY2hvcjtcbiAgfTtcblxuICAvKipcbiAgICAgIEBtZW1iZXJvZiBUZXh0Qm94XG4gICAgICBAZGVzYyBTZXRzIHRoZSBTVkcgY29udGFpbmVyIGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBkMyBzZWxlY3RvciBvciBET00gZWxlbWVudC4gSWYgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkLCBhbiBTVkcgZWxlbWVudCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwYWdlIGZvciB1c2UuXG4gICAgICBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gWypzZWxlY3RvcipdXG4gICAgICBAY2hhaW5hYmxlXG4gICovXG4gIFRleHRCb3gucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uIHNlbGVjdCQxIChfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5fc2VsZWN0ID0gc2VsZWN0KF8pLCB0aGlzKSA6IHRoaXMuX3NlbGVjdDtcbiAgfTtcblxuICAvKipcbiAgICAgIEBtZW1iZXJvZiBUZXh0Qm94XG4gICAgICBAZGVzYyBTZXRzIHRoZSB3b3JkIHNwbGl0IGJlaGF2aW9yIHRvIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24sIHdoaWNoIHdoZW4gcGFzc2VkIGEgc3RyaW5nIGlzIGV4cGVjdGVkIHRvIHJldHVybiB0aGF0IHN0cmluZyBzcGxpdCBpbnRvIGFuIGFycmF5IG9mIHdvcmRzLlxuICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gWyp2YWx1ZSpdXG4gICAgICBAY2hhaW5hYmxlXG4gICovXG4gIFRleHRCb3gucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24gc3BsaXQgKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl9zcGxpdCA9IF8sIHRoaXMpIDogdGhpcy5fc3BsaXQ7XG4gIH07XG5cbiAgLyoqXG4gICAgICBAbWVtYmVyb2YgVGV4dEJveFxuICAgICAgQGRlc2MgU2V0cyB0aGUgdGV4dCBmb3IgZWFjaCBib3ggdG8gdGhlIHNwZWNpZmllZCBhY2Nlc3NvciBmdW5jdGlvbiBvciBzdGF0aWMgc3RyaW5nLlxuICAgICAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IFsqdmFsdWUqXVxuICAgICAgQGNoYWluYWJsZVxuICAgICAgQGV4YW1wbGUgPGNhcHRpb24+ZGVmYXVsdCBhY2Nlc3NvcjwvY2FwdGlvbj5cbmZ1bmN0aW9uKGQpIHtcbiAgcmV0dXJuIGQudGV4dDtcbn1cbiAgKi9cbiAgVGV4dEJveC5wcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uIHRleHQgKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl90ZXh0ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChfKSwgdGhpcykgOiB0aGlzLl90ZXh0O1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIFRleHRCb3hcbiAgICAgIEBkZXNjIFNldHMgdGhlIGhvcml6b250YWwgdGV4dCBhbmNob3IgdG8gdGhlIHNwZWNpZmllZCBhY2Nlc3NvciBmdW5jdGlvbiBvciBzdGF0aWMgc3RyaW5nLCB3aG9zZSB2YWx1ZXMgYXJlIGFuYWxhZ291cyB0byB0aGUgU1ZHIFt0ZXh0LWFuY2hvcl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvU1ZHL0F0dHJpYnV0ZS90ZXh0LWFuY2hvcikgcHJvcGVydHkuXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gWyp2YWx1ZSogPSBcInN0YXJ0XCJdXG4gICAgICBAY2hhaW5hYmxlXG4gICovXG4gIFRleHRCb3gucHJvdG90eXBlLnRleHRBbmNob3IgPSBmdW5jdGlvbiB0ZXh0QW5jaG9yIChfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5fdGV4dEFuY2hvciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIHRoaXMpIDogdGhpcy5fdGV4dEFuY2hvcjtcbiAgfTtcblxuICAvKipcbiAgICAgIEBtZW1iZXJvZiBUZXh0Qm94XG4gICAgICBAZGVzYyBTZXRzIHRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgdG8gdGhlIHNwZWNpZmllZCBhY2Nlc3NvciBmdW5jdGlvbiBvciBzdGF0aWMgc3RyaW5nLiBBY2NlcHRzIGBcInRvcFwiYCwgYFwibWlkZGxlXCJgLCBhbmQgYFwiYm90dG9tXCJgLlxuICAgICAgQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IFsqdmFsdWUqID0gXCJ0b3BcIl1cbiAgICAgIEBjaGFpbmFibGVcbiAgKi9cbiAgVGV4dEJveC5wcm90b3R5cGUudmVydGljYWxBbGlnbiA9IGZ1bmN0aW9uIHZlcnRpY2FsQWxpZ24gKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl92ZXJ0aWNhbEFsaWduID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChfKSwgdGhpcykgOiB0aGlzLl92ZXJ0aWNhbEFsaWduO1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIFRleHRCb3hcbiAgICAgIEBkZXNjIFNldHMgdGhlIHdpZHRoIGZvciBlYWNoIGJveCB0byB0aGUgc3BlY2lmaWVkIGFjY2Vzc29yIGZ1bmN0aW9uIG9yIHN0YXRpYyBudW1iZXIuXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufE51bWJlcn0gWyp2YWx1ZSpdXG4gICAgICBAY2hhaW5hYmxlXG4gICAgICBAZXhhbXBsZSA8Y2FwdGlvbj5kZWZhdWx0IGFjY2Vzc29yPC9jYXB0aW9uPlxuZnVuY3Rpb24oZCkge1xuICByZXR1cm4gZC53aWR0aCB8fCAyMDA7XG59XG4gICovXG4gIFRleHRCb3gucHJvdG90eXBlLndpZHRoID0gZnVuY3Rpb24gd2lkdGggKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl93aWR0aCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIHRoaXMpIDogdGhpcy5fd2lkdGg7XG4gIH07XG5cbiAgLyoqXG4gICAgICBAbWVtYmVyb2YgVGV4dEJveFxuICAgICAgQGRlc2MgU2V0cyB0aGUgeCBwb3NpdGlvbiBmb3IgZWFjaCBib3ggdG8gdGhlIHNwZWNpZmllZCBhY2Nlc3NvciBmdW5jdGlvbiBvciBzdGF0aWMgbnVtYmVyLiBUaGUgbnVtYmVyIGdpdmVuIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHRleHRCb3guXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufE51bWJlcn0gWyp2YWx1ZSpdXG4gICAgICBAY2hhaW5hYmxlXG4gICAgICBAZXhhbXBsZSA8Y2FwdGlvbj5kZWZhdWx0IGFjY2Vzc29yPC9jYXB0aW9uPlxuZnVuY3Rpb24oZCkge1xuICByZXR1cm4gZC54IHx8IDA7XG59XG4gICovXG4gIFRleHRCb3gucHJvdG90eXBlLnggPSBmdW5jdGlvbiB4IChfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5feCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIHRoaXMpIDogdGhpcy5feDtcbiAgfTtcblxuICAvKipcbiAgICAgIEBtZW1iZXJvZiBUZXh0Qm94XG4gICAgICBAZGVzYyBTZXRzIHRoZSB5IHBvc2l0aW9uIGZvciBlYWNoIGJveCB0byB0aGUgc3BlY2lmaWVkIGFjY2Vzc29yIGZ1bmN0aW9uIG9yIHN0YXRpYyBudW1iZXIuIFRoZSBudW1iZXIgZ2l2ZW4gc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCBzaWRlIG9mIHRoZSB0ZXh0Qm94LlxuICAgICAgQHBhcmFtIHtGdW5jdGlvbnxOdW1iZXJ9IFsqdmFsdWUqXVxuICAgICAgQGNoYWluYWJsZVxuICAgICAgQGV4YW1wbGUgPGNhcHRpb24+ZGVmYXVsdCBhY2Nlc3NvcjwvY2FwdGlvbj5cbmZ1bmN0aW9uKGQpIHtcbiAgcmV0dXJuIGQueSB8fCAwO1xufVxuICAqL1xuICBUZXh0Qm94LnByb3RvdHlwZS55ID0gZnVuY3Rpb24geSAoXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3kgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCB0aGlzKSA6IHRoaXMuX3k7XG4gIH07XG5cbiAgcmV0dXJuIFRleHRCb3g7XG59KEJhc2VDbGFzcykpO1xuXG5leHBvcnQgZGVmYXVsdCBUZXh0Qm94O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1UZXh0Qm94LmpzLm1hcCIsIi8vIHNjcmFwZWQgZnJvbSBodHRwOi8vd3d3LmZpbGVmb3JtYXQuaW5mby9pbmZvL3VuaWNvZGUvY2F0ZWdvcnkvTWMvbGlzdC5odG1cbi8vIGFuZCBodHRwOi8vd3d3LmZpbGVmb3JtYXQuaW5mby9pbmZvL3VuaWNvZGUvY2F0ZWdvcnkvTW4vbGlzdC5odG1cbi8vIEpTT04uc3RyaW5naWZ5KFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcInRhYmxlLWxpc3RcIilbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0clwiKSkuZmlsdGVyKGZ1bmN0aW9uKGQpeyByZXR1cm4gZC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImFcIikubGVuZ3RoICYmIGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJhXCIpWzBdLmlubmVySFRNTC5sZW5ndGggPT09IDY7IH0pLm1hcChmdW5jdGlvbihkKXsgcmV0dXJuIGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJhXCIpWzBdLmlubmVySFRNTC5yZXBsYWNlKFwiVVwiLCBcInVcIikucmVwbGFjZShcIitcIiwgXCJcIik7IH0pLnNvcnQoKSk7XG4vLyBUaGUgZm9sbG93aW5nIHVuaWNvZGUgY2hhcmFjdGVycyBjb21iaW5lIHRvIGZvcm0gbmV3IGNoYXJhY3RlcnMgYW5kIHNob3VsZCBuZXZlciBiZSBzcGxpdCBmcm9tIHN1cnJvdW5kaW5nIGNoYXJhY3RlcnMuXG52YXIgYSA9IFtcInUwOTAzXCIsIFwidTA5M0JcIiwgXCJ1MDkzRVwiLCBcInUwOTNGXCIsIFwidTA5NDBcIiwgXCJ1MDk0OVwiLCBcInUwOTRBXCIsIFwidTA5NEJcIiwgXCJ1MDk0Q1wiLCBcInUwOTRFXCIsIFwidTA5NEZcIiwgXCJ1MDk4MlwiLCBcInUwOTgzXCIsIFwidTA5QkVcIiwgXCJ1MDlCRlwiLCBcInUwOUMwXCIsIFwidTA5QzdcIiwgXCJ1MDlDOFwiLCBcInUwOUNCXCIsIFwidTA5Q0NcIiwgXCJ1MDlEN1wiLCBcInUwQTAzXCIsIFwidTBBM0VcIiwgXCJ1MEEzRlwiLCBcInUwQTQwXCIsIFwidTBBODNcIiwgXCJ1MEFCRVwiLCBcInUwQUJGXCIsIFwidTBBQzBcIiwgXCJ1MEFDOVwiLCBcInUwQUNCXCIsIFwidTBBQ0NcIiwgXCJ1MEIwMlwiLCBcInUwQjAzXCIsIFwidTBCM0VcIiwgXCJ1MEI0MFwiLCBcInUwQjQ3XCIsIFwidTBCNDhcIiwgXCJ1MEI0QlwiLCBcInUwQjRDXCIsIFwidTBCNTdcIiwgXCJ1MEJCRVwiLCBcInUwQkJGXCIsIFwidTBCQzFcIiwgXCJ1MEJDMlwiLCBcInUwQkM2XCIsIFwidTBCQzdcIiwgXCJ1MEJDOFwiLCBcInUwQkNBXCIsIFwidTBCQ0JcIiwgXCJ1MEJDQ1wiLCBcInUwQkQ3XCIsIFwidTBDMDFcIiwgXCJ1MEMwMlwiLCBcInUwQzAzXCIsIFwidTBDNDFcIiwgXCJ1MEM0MlwiLCBcInUwQzQzXCIsIFwidTBDNDRcIiwgXCJ1MEM4MlwiLCBcInUwQzgzXCIsIFwidTBDQkVcIiwgXCJ1MENDMFwiLCBcInUwQ0MxXCIsIFwidTBDQzJcIiwgXCJ1MENDM1wiLCBcInUwQ0M0XCIsIFwidTBDQzdcIiwgXCJ1MENDOFwiLCBcInUwQ0NBXCIsIFwidTBDQ0JcIiwgXCJ1MENENVwiLCBcInUwQ0Q2XCIsIFwidTBEMDJcIiwgXCJ1MEQwM1wiLCBcInUwRDNFXCIsIFwidTBEM0ZcIiwgXCJ1MEQ0MFwiLCBcInUwRDQ2XCIsIFwidTBENDdcIiwgXCJ1MEQ0OFwiLCBcInUwRDRBXCIsIFwidTBENEJcIiwgXCJ1MEQ0Q1wiLCBcInUwRDU3XCIsIFwidTBEODJcIiwgXCJ1MEQ4M1wiLCBcInUwRENGXCIsIFwidTBERDBcIiwgXCJ1MEREMVwiLCBcInUwREQ4XCIsIFwidTBERDlcIiwgXCJ1MEREQVwiLCBcInUwRERCXCIsIFwidTBERENcIiwgXCJ1MERERFwiLCBcInUwRERFXCIsIFwidTBEREZcIiwgXCJ1MERGMlwiLCBcInUwREYzXCIsIFwidTBGM0VcIiwgXCJ1MEYzRlwiLCBcInUwRjdGXCIsIFwidTEwMkJcIiwgXCJ1MTAyQ1wiLCBcInUxMDMxXCIsIFwidTEwMzhcIiwgXCJ1MTAzQlwiLCBcInUxMDNDXCIsIFwidTEwNTZcIiwgXCJ1MTA1N1wiLCBcInUxMDYyXCIsIFwidTEwNjNcIiwgXCJ1MTA2NFwiLCBcInUxMDY3XCIsIFwidTEwNjhcIiwgXCJ1MTA2OVwiLCBcInUxMDZBXCIsIFwidTEwNkJcIiwgXCJ1MTA2Q1wiLCBcInUxMDZEXCIsIFwidTEwODNcIiwgXCJ1MTA4NFwiLCBcInUxMDg3XCIsIFwidTEwODhcIiwgXCJ1MTA4OVwiLCBcInUxMDhBXCIsIFwidTEwOEJcIiwgXCJ1MTA4Q1wiLCBcInUxMDhGXCIsIFwidTEwOUFcIiwgXCJ1MTA5QlwiLCBcInUxMDlDXCIsIFwidTE3QjZcIiwgXCJ1MTdCRVwiLCBcInUxN0JGXCIsIFwidTE3QzBcIiwgXCJ1MTdDMVwiLCBcInUxN0MyXCIsIFwidTE3QzNcIiwgXCJ1MTdDNFwiLCBcInUxN0M1XCIsIFwidTE3QzdcIiwgXCJ1MTdDOFwiLCBcInUxOTIzXCIsIFwidTE5MjRcIiwgXCJ1MTkyNVwiLCBcInUxOTI2XCIsIFwidTE5MjlcIiwgXCJ1MTkyQVwiLCBcInUxOTJCXCIsIFwidTE5MzBcIiwgXCJ1MTkzMVwiLCBcInUxOTMzXCIsIFwidTE5MzRcIiwgXCJ1MTkzNVwiLCBcInUxOTM2XCIsIFwidTE5MzdcIiwgXCJ1MTkzOFwiLCBcInUxQTE5XCIsIFwidTFBMUFcIiwgXCJ1MUE1NVwiLCBcInUxQTU3XCIsIFwidTFBNjFcIiwgXCJ1MUE2M1wiLCBcInUxQTY0XCIsIFwidTFBNkRcIiwgXCJ1MUE2RVwiLCBcInUxQTZGXCIsIFwidTFBNzBcIiwgXCJ1MUE3MVwiLCBcInUxQTcyXCIsIFwidTFCMDRcIiwgXCJ1MUIzNVwiLCBcInUxQjNCXCIsIFwidTFCM0RcIiwgXCJ1MUIzRVwiLCBcInUxQjNGXCIsIFwidTFCNDBcIiwgXCJ1MUI0MVwiLCBcInUxQjQzXCIsIFwidTFCNDRcIiwgXCJ1MUI4MlwiLCBcInUxQkExXCIsIFwidTFCQTZcIiwgXCJ1MUJBN1wiLCBcInUxQkFBXCIsIFwidTFCRTdcIiwgXCJ1MUJFQVwiLCBcInUxQkVCXCIsIFwidTFCRUNcIiwgXCJ1MUJFRVwiLCBcInUxQkYyXCIsIFwidTFCRjNcIiwgXCJ1MUMyNFwiLCBcInUxQzI1XCIsIFwidTFDMjZcIiwgXCJ1MUMyN1wiLCBcInUxQzI4XCIsIFwidTFDMjlcIiwgXCJ1MUMyQVwiLCBcInUxQzJCXCIsIFwidTFDMzRcIiwgXCJ1MUMzNVwiLCBcInUxQ0UxXCIsIFwidTFDRjJcIiwgXCJ1MUNGM1wiLCBcInUzMDJFXCIsIFwidTMwMkZcIiwgXCJ1QTgyM1wiLCBcInVBODI0XCIsIFwidUE4MjdcIiwgXCJ1QTg4MFwiLCBcInVBODgxXCIsIFwidUE4QjRcIiwgXCJ1QThCNVwiLCBcInVBOEI2XCIsIFwidUE4QjdcIiwgXCJ1QThCOFwiLCBcInVBOEI5XCIsIFwidUE4QkFcIiwgXCJ1QThCQlwiLCBcInVBOEJDXCIsIFwidUE4QkRcIiwgXCJ1QThCRVwiLCBcInVBOEJGXCIsIFwidUE4QzBcIiwgXCJ1QThDMVwiLCBcInVBOEMyXCIsIFwidUE4QzNcIiwgXCJ1QTk1MlwiLCBcInVBOTUzXCIsIFwidUE5ODNcIiwgXCJ1QTlCNFwiLCBcInVBOUI1XCIsIFwidUE5QkFcIiwgXCJ1QTlCQlwiLCBcInVBOUJEXCIsIFwidUE5QkVcIiwgXCJ1QTlCRlwiLCBcInVBOUMwXCIsIFwidUFBMkZcIiwgXCJ1QUEzMFwiLCBcInVBQTMzXCIsIFwidUFBMzRcIiwgXCJ1QUE0RFwiLCBcInVBQTdCXCIsIFwidUFBN0RcIiwgXCJ1QUFFQlwiLCBcInVBQUVFXCIsIFwidUFBRUZcIiwgXCJ1QUFGNVwiLCBcInVBQkUzXCIsIFwidUFCRTRcIiwgXCJ1QUJFNlwiLCBcInVBQkU3XCIsIFwidUFCRTlcIiwgXCJ1QUJFQVwiLCBcInVBQkVDXCJdO1xudmFyIGIgPSBbXCJ1MDMwMFwiLCBcInUwMzAxXCIsIFwidTAzMDJcIiwgXCJ1MDMwM1wiLCBcInUwMzA0XCIsIFwidTAzMDVcIiwgXCJ1MDMwNlwiLCBcInUwMzA3XCIsIFwidTAzMDhcIiwgXCJ1MDMwOVwiLCBcInUwMzBBXCIsIFwidTAzMEJcIiwgXCJ1MDMwQ1wiLCBcInUwMzBEXCIsIFwidTAzMEVcIiwgXCJ1MDMwRlwiLCBcInUwMzEwXCIsIFwidTAzMTFcIiwgXCJ1MDMxMlwiLCBcInUwMzEzXCIsIFwidTAzMTRcIiwgXCJ1MDMxNVwiLCBcInUwMzE2XCIsIFwidTAzMTdcIiwgXCJ1MDMxOFwiLCBcInUwMzE5XCIsIFwidTAzMUFcIiwgXCJ1MDMxQlwiLCBcInUwMzFDXCIsIFwidTAzMURcIiwgXCJ1MDMxRVwiLCBcInUwMzFGXCIsIFwidTAzMjBcIiwgXCJ1MDMyMVwiLCBcInUwMzIyXCIsIFwidTAzMjNcIiwgXCJ1MDMyNFwiLCBcInUwMzI1XCIsIFwidTAzMjZcIiwgXCJ1MDMyN1wiLCBcInUwMzI4XCIsIFwidTAzMjlcIiwgXCJ1MDMyQVwiLCBcInUwMzJCXCIsIFwidTAzMkNcIiwgXCJ1MDMyRFwiLCBcInUwMzJFXCIsIFwidTAzMkZcIiwgXCJ1MDMzMFwiLCBcInUwMzMxXCIsIFwidTAzMzJcIiwgXCJ1MDMzM1wiLCBcInUwMzM0XCIsIFwidTAzMzVcIiwgXCJ1MDMzNlwiLCBcInUwMzM3XCIsIFwidTAzMzhcIiwgXCJ1MDMzOVwiLCBcInUwMzNBXCIsIFwidTAzM0JcIiwgXCJ1MDMzQ1wiLCBcInUwMzNEXCIsIFwidTAzM0VcIiwgXCJ1MDMzRlwiLCBcInUwMzQwXCIsIFwidTAzNDFcIiwgXCJ1MDM0MlwiLCBcInUwMzQzXCIsIFwidTAzNDRcIiwgXCJ1MDM0NVwiLCBcInUwMzQ2XCIsIFwidTAzNDdcIiwgXCJ1MDM0OFwiLCBcInUwMzQ5XCIsIFwidTAzNEFcIiwgXCJ1MDM0QlwiLCBcInUwMzRDXCIsIFwidTAzNERcIiwgXCJ1MDM0RVwiLCBcInUwMzRGXCIsIFwidTAzNTBcIiwgXCJ1MDM1MVwiLCBcInUwMzUyXCIsIFwidTAzNTNcIiwgXCJ1MDM1NFwiLCBcInUwMzU1XCIsIFwidTAzNTZcIiwgXCJ1MDM1N1wiLCBcInUwMzU4XCIsIFwidTAzNTlcIiwgXCJ1MDM1QVwiLCBcInUwMzVCXCIsIFwidTAzNUNcIiwgXCJ1MDM1RFwiLCBcInUwMzVFXCIsIFwidTAzNUZcIiwgXCJ1MDM2MFwiLCBcInUwMzYxXCIsIFwidTAzNjJcIiwgXCJ1MDM2M1wiLCBcInUwMzY0XCIsIFwidTAzNjVcIiwgXCJ1MDM2NlwiLCBcInUwMzY3XCIsIFwidTAzNjhcIiwgXCJ1MDM2OVwiLCBcInUwMzZBXCIsIFwidTAzNkJcIiwgXCJ1MDM2Q1wiLCBcInUwMzZEXCIsIFwidTAzNkVcIiwgXCJ1MDM2RlwiLCBcInUwNDgzXCIsIFwidTA0ODRcIiwgXCJ1MDQ4NVwiLCBcInUwNDg2XCIsIFwidTA0ODdcIiwgXCJ1MDU5MVwiLCBcInUwNTkyXCIsIFwidTA1OTNcIiwgXCJ1MDU5NFwiLCBcInUwNTk1XCIsIFwidTA1OTZcIiwgXCJ1MDU5N1wiLCBcInUwNTk4XCIsIFwidTA1OTlcIiwgXCJ1MDU5QVwiLCBcInUwNTlCXCIsIFwidTA1OUNcIiwgXCJ1MDU5RFwiLCBcInUwNTlFXCIsIFwidTA1OUZcIiwgXCJ1MDVBMFwiLCBcInUwNUExXCIsIFwidTA1QTJcIiwgXCJ1MDVBM1wiLCBcInUwNUE0XCIsIFwidTA1QTVcIiwgXCJ1MDVBNlwiLCBcInUwNUE3XCIsIFwidTA1QThcIiwgXCJ1MDVBOVwiLCBcInUwNUFBXCIsIFwidTA1QUJcIiwgXCJ1MDVBQ1wiLCBcInUwNUFEXCIsIFwidTA1QUVcIiwgXCJ1MDVBRlwiLCBcInUwNUIwXCIsIFwidTA1QjFcIiwgXCJ1MDVCMlwiLCBcInUwNUIzXCIsIFwidTA1QjRcIiwgXCJ1MDVCNVwiLCBcInUwNUI2XCIsIFwidTA1QjdcIiwgXCJ1MDVCOFwiLCBcInUwNUI5XCIsIFwidTA1QkFcIiwgXCJ1MDVCQlwiLCBcInUwNUJDXCIsIFwidTA1QkRcIiwgXCJ1MDVCRlwiLCBcInUwNUMxXCIsIFwidTA1QzJcIiwgXCJ1MDVDNFwiLCBcInUwNUM1XCIsIFwidTA1QzdcIiwgXCJ1MDYxMFwiLCBcInUwNjExXCIsIFwidTA2MTJcIiwgXCJ1MDYxM1wiLCBcInUwNjE0XCIsIFwidTA2MTVcIiwgXCJ1MDYxNlwiLCBcInUwNjE3XCIsIFwidTA2MThcIiwgXCJ1MDYxOVwiLCBcInUwNjFBXCIsIFwidTA2NEJcIiwgXCJ1MDY0Q1wiLCBcInUwNjREXCIsIFwidTA2NEVcIiwgXCJ1MDY0RlwiLCBcInUwNjUwXCIsIFwidTA2NTFcIiwgXCJ1MDY1MlwiLCBcInUwNjUzXCIsIFwidTA2NTRcIiwgXCJ1MDY1NVwiLCBcInUwNjU2XCIsIFwidTA2NTdcIiwgXCJ1MDY1OFwiLCBcInUwNjU5XCIsIFwidTA2NUFcIiwgXCJ1MDY1QlwiLCBcInUwNjVDXCIsIFwidTA2NURcIiwgXCJ1MDY1RVwiLCBcInUwNjVGXCIsIFwidTA2NzBcIiwgXCJ1MDZENlwiLCBcInUwNkQ3XCIsIFwidTA2RDhcIiwgXCJ1MDZEOVwiLCBcInUwNkRBXCIsIFwidTA2REJcIiwgXCJ1MDZEQ1wiLCBcInUwNkRGXCIsIFwidTA2RTBcIiwgXCJ1MDZFMVwiLCBcInUwNkUyXCIsIFwidTA2RTNcIiwgXCJ1MDZFNFwiLCBcInUwNkU3XCIsIFwidTA2RThcIiwgXCJ1MDZFQVwiLCBcInUwNkVCXCIsIFwidTA2RUNcIiwgXCJ1MDZFRFwiLCBcInUwNzExXCIsIFwidTA3MzBcIiwgXCJ1MDczMVwiLCBcInUwNzMyXCIsIFwidTA3MzNcIiwgXCJ1MDczNFwiLCBcInUwNzM1XCIsIFwidTA3MzZcIiwgXCJ1MDczN1wiLCBcInUwNzM4XCIsIFwidTA3MzlcIiwgXCJ1MDczQVwiLCBcInUwNzNCXCIsIFwidTA3M0NcIiwgXCJ1MDczRFwiLCBcInUwNzNFXCIsIFwidTA3M0ZcIiwgXCJ1MDc0MFwiLCBcInUwNzQxXCIsIFwidTA3NDJcIiwgXCJ1MDc0M1wiLCBcInUwNzQ0XCIsIFwidTA3NDVcIiwgXCJ1MDc0NlwiLCBcInUwNzQ3XCIsIFwidTA3NDhcIiwgXCJ1MDc0OVwiLCBcInUwNzRBXCIsIFwidTA3QTZcIiwgXCJ1MDdBN1wiLCBcInUwN0E4XCIsIFwidTA3QTlcIiwgXCJ1MDdBQVwiLCBcInUwN0FCXCIsIFwidTA3QUNcIiwgXCJ1MDdBRFwiLCBcInUwN0FFXCIsIFwidTA3QUZcIiwgXCJ1MDdCMFwiLCBcInUwN0VCXCIsIFwidTA3RUNcIiwgXCJ1MDdFRFwiLCBcInUwN0VFXCIsIFwidTA3RUZcIiwgXCJ1MDdGMFwiLCBcInUwN0YxXCIsIFwidTA3RjJcIiwgXCJ1MDdGM1wiLCBcInUwODE2XCIsIFwidTA4MTdcIiwgXCJ1MDgxOFwiLCBcInUwODE5XCIsIFwidTA4MUJcIiwgXCJ1MDgxQ1wiLCBcInUwODFEXCIsIFwidTA4MUVcIiwgXCJ1MDgxRlwiLCBcInUwODIwXCIsIFwidTA4MjFcIiwgXCJ1MDgyMlwiLCBcInUwODIzXCIsIFwidTA4MjVcIiwgXCJ1MDgyNlwiLCBcInUwODI3XCIsIFwidTA4MjlcIiwgXCJ1MDgyQVwiLCBcInUwODJCXCIsIFwidTA4MkNcIiwgXCJ1MDgyRFwiLCBcInUwODU5XCIsIFwidTA4NUFcIiwgXCJ1MDg1QlwiLCBcInUwOEUzXCIsIFwidTA4RTRcIiwgXCJ1MDhFNVwiLCBcInUwOEU2XCIsIFwidTA4RTdcIiwgXCJ1MDhFOFwiLCBcInUwOEU5XCIsIFwidTA4RUFcIiwgXCJ1MDhFQlwiLCBcInUwOEVDXCIsIFwidTA4RURcIiwgXCJ1MDhFRVwiLCBcInUwOEVGXCIsIFwidTA4RjBcIiwgXCJ1MDhGMVwiLCBcInUwOEYyXCIsIFwidTA4RjNcIiwgXCJ1MDhGNFwiLCBcInUwOEY1XCIsIFwidTA4RjZcIiwgXCJ1MDhGN1wiLCBcInUwOEY4XCIsIFwidTA4RjlcIiwgXCJ1MDhGQVwiLCBcInUwOEZCXCIsIFwidTA4RkNcIiwgXCJ1MDhGRFwiLCBcInUwOEZFXCIsIFwidTA4RkZcIiwgXCJ1MDkwMFwiLCBcInUwOTAxXCIsIFwidTA5MDJcIiwgXCJ1MDkzQVwiLCBcInUwOTNDXCIsIFwidTA5NDFcIiwgXCJ1MDk0MlwiLCBcInUwOTQzXCIsIFwidTA5NDRcIiwgXCJ1MDk0NVwiLCBcInUwOTQ2XCIsIFwidTA5NDdcIiwgXCJ1MDk0OFwiLCBcInUwOTREXCIsIFwidTA5NTFcIiwgXCJ1MDk1MlwiLCBcInUwOTUzXCIsIFwidTA5NTRcIiwgXCJ1MDk1NVwiLCBcInUwOTU2XCIsIFwidTA5NTdcIiwgXCJ1MDk2MlwiLCBcInUwOTYzXCIsIFwidTA5ODFcIiwgXCJ1MDlCQ1wiLCBcInUwOUMxXCIsIFwidTA5QzJcIiwgXCJ1MDlDM1wiLCBcInUwOUM0XCIsIFwidTA5Q0RcIiwgXCJ1MDlFMlwiLCBcInUwOUUzXCIsIFwidTBBMDFcIiwgXCJ1MEEwMlwiLCBcInUwQTNDXCIsIFwidTBBNDFcIiwgXCJ1MEE0MlwiLCBcInUwQTQ3XCIsIFwidTBBNDhcIiwgXCJ1MEE0QlwiLCBcInUwQTRDXCIsIFwidTBBNERcIiwgXCJ1MEE1MVwiLCBcInUwQTcwXCIsIFwidTBBNzFcIiwgXCJ1MEE3NVwiLCBcInUwQTgxXCIsIFwidTBBODJcIiwgXCJ1MEFCQ1wiLCBcInUwQUMxXCIsIFwidTBBQzJcIiwgXCJ1MEFDM1wiLCBcInUwQUM0XCIsIFwidTBBQzVcIiwgXCJ1MEFDN1wiLCBcInUwQUM4XCIsIFwidTBBQ0RcIiwgXCJ1MEFFMlwiLCBcInUwQUUzXCIsIFwidTBCMDFcIiwgXCJ1MEIzQ1wiLCBcInUwQjNGXCIsIFwidTBCNDFcIiwgXCJ1MEI0MlwiLCBcInUwQjQzXCIsIFwidTBCNDRcIiwgXCJ1MEI0RFwiLCBcInUwQjU2XCIsIFwidTBCNjJcIiwgXCJ1MEI2M1wiLCBcInUwQjgyXCIsIFwidTBCQzBcIiwgXCJ1MEJDRFwiLCBcInUwQzAwXCIsIFwidTBDM0VcIiwgXCJ1MEMzRlwiLCBcInUwQzQwXCIsIFwidTBDNDZcIiwgXCJ1MEM0N1wiLCBcInUwQzQ4XCIsIFwidTBDNEFcIiwgXCJ1MEM0QlwiLCBcInUwQzRDXCIsIFwidTBDNERcIiwgXCJ1MEM1NVwiLCBcInUwQzU2XCIsIFwidTBDNjJcIiwgXCJ1MEM2M1wiLCBcInUwQzgxXCIsIFwidTBDQkNcIiwgXCJ1MENCRlwiLCBcInUwQ0M2XCIsIFwidTBDQ0NcIiwgXCJ1MENDRFwiLCBcInUwQ0UyXCIsIFwidTBDRTNcIiwgXCJ1MEQwMVwiLCBcInUwRDQxXCIsIFwidTBENDJcIiwgXCJ1MEQ0M1wiLCBcInUwRDQ0XCIsIFwidTBENERcIiwgXCJ1MEQ2MlwiLCBcInUwRDYzXCIsIFwidTBEQ0FcIiwgXCJ1MEREMlwiLCBcInUwREQzXCIsIFwidTBERDRcIiwgXCJ1MERENlwiLCBcInUwRTMxXCIsIFwidTBFMzRcIiwgXCJ1MEUzNVwiLCBcInUwRTM2XCIsIFwidTBFMzdcIiwgXCJ1MEUzOFwiLCBcInUwRTM5XCIsIFwidTBFM0FcIiwgXCJ1MEU0N1wiLCBcInUwRTQ4XCIsIFwidTBFNDlcIiwgXCJ1MEU0QVwiLCBcInUwRTRCXCIsIFwidTBFNENcIiwgXCJ1MEU0RFwiLCBcInUwRTRFXCIsIFwidTBFQjFcIiwgXCJ1MEVCNFwiLCBcInUwRUI1XCIsIFwidTBFQjZcIiwgXCJ1MEVCN1wiLCBcInUwRUI4XCIsIFwidTBFQjlcIiwgXCJ1MEVCQlwiLCBcInUwRUJDXCIsIFwidTBFQzhcIiwgXCJ1MEVDOVwiLCBcInUwRUNBXCIsIFwidTBFQ0JcIiwgXCJ1MEVDQ1wiLCBcInUwRUNEXCIsIFwidTBGMThcIiwgXCJ1MEYxOVwiLCBcInUwRjM1XCIsIFwidTBGMzdcIiwgXCJ1MEYzOVwiLCBcInUwRjcxXCIsIFwidTBGNzJcIiwgXCJ1MEY3M1wiLCBcInUwRjc0XCIsIFwidTBGNzVcIiwgXCJ1MEY3NlwiLCBcInUwRjc3XCIsIFwidTBGNzhcIiwgXCJ1MEY3OVwiLCBcInUwRjdBXCIsIFwidTBGN0JcIiwgXCJ1MEY3Q1wiLCBcInUwRjdEXCIsIFwidTBGN0VcIiwgXCJ1MEY4MFwiLCBcInUwRjgxXCIsIFwidTBGODJcIiwgXCJ1MEY4M1wiLCBcInUwRjg0XCIsIFwidTBGODZcIiwgXCJ1MEY4N1wiLCBcInUwRjhEXCIsIFwidTBGOEVcIiwgXCJ1MEY4RlwiLCBcInUwRjkwXCIsIFwidTBGOTFcIiwgXCJ1MEY5MlwiLCBcInUwRjkzXCIsIFwidTBGOTRcIiwgXCJ1MEY5NVwiLCBcInUwRjk2XCIsIFwidTBGOTdcIiwgXCJ1MEY5OVwiLCBcInUwRjlBXCIsIFwidTBGOUJcIiwgXCJ1MEY5Q1wiLCBcInUwRjlEXCIsIFwidTBGOUVcIiwgXCJ1MEY5RlwiLCBcInUwRkEwXCIsIFwidTBGQTFcIiwgXCJ1MEZBMlwiLCBcInUwRkEzXCIsIFwidTBGQTRcIiwgXCJ1MEZBNVwiLCBcInUwRkE2XCIsIFwidTBGQTdcIiwgXCJ1MEZBOFwiLCBcInUwRkE5XCIsIFwidTBGQUFcIiwgXCJ1MEZBQlwiLCBcInUwRkFDXCIsIFwidTBGQURcIiwgXCJ1MEZBRVwiLCBcInUwRkFGXCIsIFwidTBGQjBcIiwgXCJ1MEZCMVwiLCBcInUwRkIyXCIsIFwidTBGQjNcIiwgXCJ1MEZCNFwiLCBcInUwRkI1XCIsIFwidTBGQjZcIiwgXCJ1MEZCN1wiLCBcInUwRkI4XCIsIFwidTBGQjlcIiwgXCJ1MEZCQVwiLCBcInUwRkJCXCIsIFwidTBGQkNcIiwgXCJ1MEZDNlwiLCBcInUxMDJEXCIsIFwidTEwMkVcIiwgXCJ1MTAyRlwiLCBcInUxMDMwXCIsIFwidTEwMzJcIiwgXCJ1MTAzM1wiLCBcInUxMDM0XCIsIFwidTEwMzVcIiwgXCJ1MTAzNlwiLCBcInUxMDM3XCIsIFwidTEwMzlcIiwgXCJ1MTAzQVwiLCBcInUxMDNEXCIsIFwidTEwM0VcIiwgXCJ1MTA1OFwiLCBcInUxMDU5XCIsIFwidTEwNUVcIiwgXCJ1MTA1RlwiLCBcInUxMDYwXCIsIFwidTEwNzFcIiwgXCJ1MTA3MlwiLCBcInUxMDczXCIsIFwidTEwNzRcIiwgXCJ1MTA4MlwiLCBcInUxMDg1XCIsIFwidTEwODZcIiwgXCJ1MTA4RFwiLCBcInUxMDlEXCIsIFwidTEzNURcIiwgXCJ1MTM1RVwiLCBcInUxMzVGXCIsIFwidTE3MTJcIiwgXCJ1MTcxM1wiLCBcInUxNzE0XCIsIFwidTE3MzJcIiwgXCJ1MTczM1wiLCBcInUxNzM0XCIsIFwidTE3NTJcIiwgXCJ1MTc1M1wiLCBcInUxNzcyXCIsIFwidTE3NzNcIiwgXCJ1MTdCNFwiLCBcInUxN0I1XCIsIFwidTE3QjdcIiwgXCJ1MTdCOFwiLCBcInUxN0I5XCIsIFwidTE3QkFcIiwgXCJ1MTdCQlwiLCBcInUxN0JDXCIsIFwidTE3QkRcIiwgXCJ1MTdDNlwiLCBcInUxN0M5XCIsIFwidTE3Q0FcIiwgXCJ1MTdDQlwiLCBcInUxN0NDXCIsIFwidTE3Q0RcIiwgXCJ1MTdDRVwiLCBcInUxN0NGXCIsIFwidTE3RDBcIiwgXCJ1MTdEMVwiLCBcInUxN0QyXCIsIFwidTE3RDNcIiwgXCJ1MTdERFwiLCBcInUxODBCXCIsIFwidTE4MENcIiwgXCJ1MTgwRFwiLCBcInUxOEE5XCIsIFwidTE5MjBcIiwgXCJ1MTkyMVwiLCBcInUxOTIyXCIsIFwidTE5MjdcIiwgXCJ1MTkyOFwiLCBcInUxOTMyXCIsIFwidTE5MzlcIiwgXCJ1MTkzQVwiLCBcInUxOTNCXCIsIFwidTFBMTdcIiwgXCJ1MUExOFwiLCBcInUxQTFCXCIsIFwidTFBNTZcIiwgXCJ1MUE1OFwiLCBcInUxQTU5XCIsIFwidTFBNUFcIiwgXCJ1MUE1QlwiLCBcInUxQTVDXCIsIFwidTFBNURcIiwgXCJ1MUE1RVwiLCBcInUxQTYwXCIsIFwidTFBNjJcIiwgXCJ1MUE2NVwiLCBcInUxQTY2XCIsIFwidTFBNjdcIiwgXCJ1MUE2OFwiLCBcInUxQTY5XCIsIFwidTFBNkFcIiwgXCJ1MUE2QlwiLCBcInUxQTZDXCIsIFwidTFBNzNcIiwgXCJ1MUE3NFwiLCBcInUxQTc1XCIsIFwidTFBNzZcIiwgXCJ1MUE3N1wiLCBcInUxQTc4XCIsIFwidTFBNzlcIiwgXCJ1MUE3QVwiLCBcInUxQTdCXCIsIFwidTFBN0NcIiwgXCJ1MUE3RlwiLCBcInUxQUIwXCIsIFwidTFBQjFcIiwgXCJ1MUFCMlwiLCBcInUxQUIzXCIsIFwidTFBQjRcIiwgXCJ1MUFCNVwiLCBcInUxQUI2XCIsIFwidTFBQjdcIiwgXCJ1MUFCOFwiLCBcInUxQUI5XCIsIFwidTFBQkFcIiwgXCJ1MUFCQlwiLCBcInUxQUJDXCIsIFwidTFBQkRcIiwgXCJ1MUIwMFwiLCBcInUxQjAxXCIsIFwidTFCMDJcIiwgXCJ1MUIwM1wiLCBcInUxQjM0XCIsIFwidTFCMzZcIiwgXCJ1MUIzN1wiLCBcInUxQjM4XCIsIFwidTFCMzlcIiwgXCJ1MUIzQVwiLCBcInUxQjNDXCIsIFwidTFCNDJcIiwgXCJ1MUI2QlwiLCBcInUxQjZDXCIsIFwidTFCNkRcIiwgXCJ1MUI2RVwiLCBcInUxQjZGXCIsIFwidTFCNzBcIiwgXCJ1MUI3MVwiLCBcInUxQjcyXCIsIFwidTFCNzNcIiwgXCJ1MUI4MFwiLCBcInUxQjgxXCIsIFwidTFCQTJcIiwgXCJ1MUJBM1wiLCBcInUxQkE0XCIsIFwidTFCQTVcIiwgXCJ1MUJBOFwiLCBcInUxQkE5XCIsIFwidTFCQUJcIiwgXCJ1MUJBQ1wiLCBcInUxQkFEXCIsIFwidTFCRTZcIiwgXCJ1MUJFOFwiLCBcInUxQkU5XCIsIFwidTFCRURcIiwgXCJ1MUJFRlwiLCBcInUxQkYwXCIsIFwidTFCRjFcIiwgXCJ1MUMyQ1wiLCBcInUxQzJEXCIsIFwidTFDMkVcIiwgXCJ1MUMyRlwiLCBcInUxQzMwXCIsIFwidTFDMzFcIiwgXCJ1MUMzMlwiLCBcInUxQzMzXCIsIFwidTFDMzZcIiwgXCJ1MUMzN1wiLCBcInUxQ0QwXCIsIFwidTFDRDFcIiwgXCJ1MUNEMlwiLCBcInUxQ0Q0XCIsIFwidTFDRDVcIiwgXCJ1MUNENlwiLCBcInUxQ0Q3XCIsIFwidTFDRDhcIiwgXCJ1MUNEOVwiLCBcInUxQ0RBXCIsIFwidTFDREJcIiwgXCJ1MUNEQ1wiLCBcInUxQ0REXCIsIFwidTFDREVcIiwgXCJ1MUNERlwiLCBcInUxQ0UwXCIsIFwidTFDRTJcIiwgXCJ1MUNFM1wiLCBcInUxQ0U0XCIsIFwidTFDRTVcIiwgXCJ1MUNFNlwiLCBcInUxQ0U3XCIsIFwidTFDRThcIiwgXCJ1MUNFRFwiLCBcInUxQ0Y0XCIsIFwidTFDRjhcIiwgXCJ1MUNGOVwiLCBcInUxREMwXCIsIFwidTFEQzFcIiwgXCJ1MURDMlwiLCBcInUxREMzXCIsIFwidTFEQzRcIiwgXCJ1MURDNVwiLCBcInUxREM2XCIsIFwidTFEQzdcIiwgXCJ1MURDOFwiLCBcInUxREM5XCIsIFwidTFEQ0FcIiwgXCJ1MURDQlwiLCBcInUxRENDXCIsIFwidTFEQ0RcIiwgXCJ1MURDRVwiLCBcInUxRENGXCIsIFwidTFERDBcIiwgXCJ1MUREMVwiLCBcInUxREQyXCIsIFwidTFERDNcIiwgXCJ1MURENFwiLCBcInUxREQ1XCIsIFwidTFERDZcIiwgXCJ1MUREN1wiLCBcInUxREQ4XCIsIFwidTFERDlcIiwgXCJ1MUREQVwiLCBcInUxRERCXCIsIFwidTFERENcIiwgXCJ1MURERFwiLCBcInUxRERFXCIsIFwidTFEREZcIiwgXCJ1MURFMFwiLCBcInUxREUxXCIsIFwidTFERTJcIiwgXCJ1MURFM1wiLCBcInUxREU0XCIsIFwidTFERTVcIiwgXCJ1MURFNlwiLCBcInUxREU3XCIsIFwidTFERThcIiwgXCJ1MURFOVwiLCBcInUxREVBXCIsIFwidTFERUJcIiwgXCJ1MURFQ1wiLCBcInUxREVEXCIsIFwidTFERUVcIiwgXCJ1MURFRlwiLCBcInUxREYwXCIsIFwidTFERjFcIiwgXCJ1MURGMlwiLCBcInUxREYzXCIsIFwidTFERjRcIiwgXCJ1MURGNVwiLCBcInUxREZDXCIsIFwidTFERkRcIiwgXCJ1MURGRVwiLCBcInUxREZGXCIsIFwidTIwRDBcIiwgXCJ1MjBEMVwiLCBcInUyMEQyXCIsIFwidTIwRDNcIiwgXCJ1MjBENFwiLCBcInUyMEQ1XCIsIFwidTIwRDZcIiwgXCJ1MjBEN1wiLCBcInUyMEQ4XCIsIFwidTIwRDlcIiwgXCJ1MjBEQVwiLCBcInUyMERCXCIsIFwidTIwRENcIiwgXCJ1MjBFMVwiLCBcInUyMEU1XCIsIFwidTIwRTZcIiwgXCJ1MjBFN1wiLCBcInUyMEU4XCIsIFwidTIwRTlcIiwgXCJ1MjBFQVwiLCBcInUyMEVCXCIsIFwidTIwRUNcIiwgXCJ1MjBFRFwiLCBcInUyMEVFXCIsIFwidTIwRUZcIiwgXCJ1MjBGMFwiLCBcInUyQ0VGXCIsIFwidTJDRjBcIiwgXCJ1MkNGMVwiLCBcInUyRDdGXCIsIFwidTJERTBcIiwgXCJ1MkRFMVwiLCBcInUyREUyXCIsIFwidTJERTNcIiwgXCJ1MkRFNFwiLCBcInUyREU1XCIsIFwidTJERTZcIiwgXCJ1MkRFN1wiLCBcInUyREU4XCIsIFwidTJERTlcIiwgXCJ1MkRFQVwiLCBcInUyREVCXCIsIFwidTJERUNcIiwgXCJ1MkRFRFwiLCBcInUyREVFXCIsIFwidTJERUZcIiwgXCJ1MkRGMFwiLCBcInUyREYxXCIsIFwidTJERjJcIiwgXCJ1MkRGM1wiLCBcInUyREY0XCIsIFwidTJERjVcIiwgXCJ1MkRGNlwiLCBcInUyREY3XCIsIFwidTJERjhcIiwgXCJ1MkRGOVwiLCBcInUyREZBXCIsIFwidTJERkJcIiwgXCJ1MkRGQ1wiLCBcInUyREZEXCIsIFwidTJERkVcIiwgXCJ1MkRGRlwiLCBcInUzMDJBXCIsIFwidTMwMkJcIiwgXCJ1MzAyQ1wiLCBcInUzMDJEXCIsIFwidTMwOTlcIiwgXCJ1MzA5QVwiLCBcInVBNjZGXCIsIFwidUE2NzRcIiwgXCJ1QTY3NVwiLCBcInVBNjc2XCIsIFwidUE2NzdcIiwgXCJ1QTY3OFwiLCBcInVBNjc5XCIsIFwidUE2N0FcIiwgXCJ1QTY3QlwiLCBcInVBNjdDXCIsIFwidUE2N0RcIiwgXCJ1QTY5RVwiLCBcInVBNjlGXCIsIFwidUE2RjBcIiwgXCJ1QTZGMVwiLCBcInVBODAyXCIsIFwidUE4MDZcIiwgXCJ1QTgwQlwiLCBcInVBODI1XCIsIFwidUE4MjZcIiwgXCJ1QThDNFwiLCBcInVBOEUwXCIsIFwidUE4RTFcIiwgXCJ1QThFMlwiLCBcInVBOEUzXCIsIFwidUE4RTRcIiwgXCJ1QThFNVwiLCBcInVBOEU2XCIsIFwidUE4RTdcIiwgXCJ1QThFOFwiLCBcInVBOEU5XCIsIFwidUE4RUFcIiwgXCJ1QThFQlwiLCBcInVBOEVDXCIsIFwidUE4RURcIiwgXCJ1QThFRVwiLCBcInVBOEVGXCIsIFwidUE4RjBcIiwgXCJ1QThGMVwiLCBcInVBOTI2XCIsIFwidUE5MjdcIiwgXCJ1QTkyOFwiLCBcInVBOTI5XCIsIFwidUE5MkFcIiwgXCJ1QTkyQlwiLCBcInVBOTJDXCIsIFwidUE5MkRcIiwgXCJ1QTk0N1wiLCBcInVBOTQ4XCIsIFwidUE5NDlcIiwgXCJ1QTk0QVwiLCBcInVBOTRCXCIsIFwidUE5NENcIiwgXCJ1QTk0RFwiLCBcInVBOTRFXCIsIFwidUE5NEZcIiwgXCJ1QTk1MFwiLCBcInVBOTUxXCIsIFwidUE5ODBcIiwgXCJ1QTk4MVwiLCBcInVBOTgyXCIsIFwidUE5QjNcIiwgXCJ1QTlCNlwiLCBcInVBOUI3XCIsIFwidUE5QjhcIiwgXCJ1QTlCOVwiLCBcInVBOUJDXCIsIFwidUE5RTVcIiwgXCJ1QUEyOVwiLCBcInVBQTJBXCIsIFwidUFBMkJcIiwgXCJ1QUEyQ1wiLCBcInVBQTJEXCIsIFwidUFBMkVcIiwgXCJ1QUEzMVwiLCBcInVBQTMyXCIsIFwidUFBMzVcIiwgXCJ1QUEzNlwiLCBcInVBQTQzXCIsIFwidUFBNENcIiwgXCJ1QUE3Q1wiLCBcInVBQUIwXCIsIFwidUFBQjJcIiwgXCJ1QUFCM1wiLCBcInVBQUI0XCIsIFwidUFBQjdcIiwgXCJ1QUFCOFwiLCBcInVBQUJFXCIsIFwidUFBQkZcIiwgXCJ1QUFDMVwiLCBcInVBQUVDXCIsIFwidUFBRURcIiwgXCJ1QUFGNlwiLCBcInVBQkU1XCIsIFwidUFCRThcIiwgXCJ1QUJFRFwiLCBcInVGQjFFXCIsIFwidUZFMDBcIiwgXCJ1RkUwMVwiLCBcInVGRTAyXCIsIFwidUZFMDNcIiwgXCJ1RkUwNFwiLCBcInVGRTA1XCIsIFwidUZFMDZcIiwgXCJ1RkUwN1wiLCBcInVGRTA4XCIsIFwidUZFMDlcIiwgXCJ1RkUwQVwiLCBcInVGRTBCXCIsIFwidUZFMENcIiwgXCJ1RkUwRFwiLCBcInVGRTBFXCIsIFwidUZFMEZcIiwgXCJ1RkUyMFwiLCBcInVGRTIxXCIsIFwidUZFMjJcIiwgXCJ1RkUyM1wiLCBcInVGRTI0XCIsIFwidUZFMjVcIiwgXCJ1RkUyNlwiLCBcInVGRTI3XCIsIFwidUZFMjhcIiwgXCJ1RkUyOVwiLCBcInVGRTJBXCIsIFwidUZFMkJcIiwgXCJ1RkUyQ1wiLCBcInVGRTJEXCIsIFwidUZFMkVcIiwgXCJ1RkUyRlwiXTtcbmV4cG9ydCBkZWZhdWx0IGEuY29uY2F0KGIpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21iaW5pbmdNYXJrcy5qcy5tYXAiLCJpbXBvcnQge2RlZmF1bHQgYXMgdGV4dFdpZHRofSBmcm9tIFwiLi90ZXh0V2lkdGhcIjtcbmltcG9ydCB7dHJpbX0gZnJvbSBcIi4vdHJpbVwiO1xuXG52YXIgYWxwaGEgPSBcImFiY2RlZmdoaUFCQ0RFRkdISV8hQCMkJV4mKigpXysxMjM0NTY3ODkwXCIsXG4gICAgICBjaGVja2VkID0ge30sXG4gICAgICBoZWlnaHQgPSAzMjtcblxudmFyIGRlamF2dSwgbWFjb3MsIG1vbm9zcGFjZSwgcHJvcG9ydGlvbmFsO1xuXG4vKipcbiAgICBAZnVuY3Rpb24gZm9udEV4aXN0c1xuICAgIEBkZXNjIEdpdmVuIGVpdGhlciBhIHNpbmdsZSBmb250LWZhbWlseSBvciBhIGxpc3Qgb2YgZm9udHMsIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IGZvbnQgdGhhdCBjYW4gYmUgcmVuZGVyZWQsIG9yIGBmYWxzZWAgaWYgbm9uZSBhcmUgaW5zdGFsbGVkIG9uIHRoZSB1c2VyJ3MgbWFjaGluZS5cbiAgICBAcGFyYW0ge1N0cmluZ3xBcnJheX0gZm9udCBDYW4gYmUgZWl0aGVyIGEgdmFsaWQgQ1NTIGZvbnQtZmFtaWx5IHN0cmluZyAoc2luZ2xlIG9yIGNvbW1hLXNlcGFyYXRlZCBuYW1lcykgb3IgYW4gQXJyYXkgb2Ygc3RyaW5nIG5hbWVzLlxuKi9cbnZhciBmb250RXhpc3RzID0gZnVuY3Rpb24gKGZvbnQpIHtcblxuICBpZiAoIWRlamF2dSkge1xuICAgIGRlamF2dSA9IHRleHRXaWR0aChhbHBoYSwge1wiZm9udC1mYW1pbHlcIjogXCJEZWphVnVTYW5zXCIsIFwiZm9udC1zaXplXCI6IGhlaWdodH0pO1xuICAgIG1hY29zID0gdGV4dFdpZHRoKGFscGhhLCB7XCJmb250LWZhbWlseVwiOiBcIi1hcHBsZS1zeXN0ZW1cIiwgXCJmb250LXNpemVcIjogaGVpZ2h0fSk7XG4gICAgbW9ub3NwYWNlID0gdGV4dFdpZHRoKGFscGhhLCB7XCJmb250LWZhbWlseVwiOiBcIm1vbm9zcGFjZVwiLCBcImZvbnQtc2l6ZVwiOiBoZWlnaHR9KTtcbiAgICBwcm9wb3J0aW9uYWwgPSB0ZXh0V2lkdGgoYWxwaGEsIHtcImZvbnQtZmFtaWx5XCI6IFwic2Fucy1zZXJpZlwiLCBcImZvbnQtc2l6ZVwiOiBoZWlnaHR9KTtcbiAgfVxuXG4gIGlmICghKGZvbnQgaW5zdGFuY2VvZiBBcnJheSkpIHsgZm9udCA9IGZvbnQuc3BsaXQoXCIsXCIpOyB9XG4gIGZvbnQgPSBmb250Lm1hcChmdW5jdGlvbiAoZikgeyByZXR1cm4gdHJpbShmKTsgfSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb250Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGZhbSA9IGZvbnRbaV07XG4gICAgaWYgKGNoZWNrZWRbZmFtXSB8fCBbXCItYXBwbGUtc3lzdGVtXCIsIFwibW9ub3NwYWNlXCIsIFwic2Fucy1zZXJpZlwiLCBcIkRlamFWdVNhbnNcIl0uaW5jbHVkZXMoZmFtKSkgeyByZXR1cm4gZmFtOyB9XG4gICAgZWxzZSBpZiAoY2hlY2tlZFtmYW1dID09PSBmYWxzZSkgeyBjb250aW51ZTsgfVxuICAgIHZhciB3aWR0aCA9IHRleHRXaWR0aChhbHBoYSwge1wiZm9udC1mYW1pbHlcIjogZmFtLCBcImZvbnQtc2l6ZVwiOiBoZWlnaHR9KTtcbiAgICBjaGVja2VkW2ZhbV0gPSB3aWR0aCAhPT0gbW9ub3NwYWNlO1xuICAgIGlmIChjaGVja2VkW2ZhbV0pIHsgY2hlY2tlZFtmYW1dID0gd2lkdGggIT09IHByb3BvcnRpb25hbDsgfVxuICAgIGlmIChtYWNvcyAmJiBjaGVja2VkW2ZhbV0pIHsgY2hlY2tlZFtmYW1dID0gd2lkdGggIT09IG1hY29zOyB9XG4gICAgaWYgKGRlamF2dSAmJiBjaGVja2VkW2ZhbV0pIHsgY2hlY2tlZFtmYW1dID0gd2lkdGggIT09IGRlamF2dTsgfVxuICAgIGlmIChjaGVja2VkW2ZhbV0pIHsgcmV0dXJuIGZhbTsgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xuXG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZvbnRFeGlzdHM7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvbnRFeGlzdHMuanMubWFwIiwiaW1wb3J0IHtzZWxlY3R9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxuLyoqXG4gICAgQGZ1bmN0aW9uIHJ0bFxuICAgIEBkZXNjIFJldHVybnMgYHRydWVgIGlmIHRoZSBIVE1MIG9yIGJvZHkgZWxlbWVudCBoYXMgZWl0aGVyIHRoZSBcImRpclwiIEhUTUwgYXR0cmlidXRlIG9yIHRoZSBcImRpcmVjdGlvblwiIENTUyBwcm9wZXJ0eSBzZXQgdG8gXCJydGxcIi5cbiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7IHJldHVybiBzZWxlY3QoXCJodG1sXCIpLmF0dHIoXCJkaXJcIikgPT09IFwicnRsXCIgfHxcbiAgc2VsZWN0KFwiYm9keVwiKS5hdHRyKFwiZGlyXCIpID09PSBcInJ0bFwiIHx8XG4gIHNlbGVjdChcImh0bWxcIikuc3R5bGUoXCJkaXJlY3Rpb25cIikgPT09IFwicnRsXCIgfHxcbiAgc2VsZWN0KFwiYm9keVwiKS5zdHlsZShcImRpcmVjdGlvblwiKSA9PT0gXCJydGxcIjsgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnRsLmpzLm1hcCIsIi8qKlxuICAgIEBmdW5jdGlvbiBzdHJpbmdpZnlcbiAgICBAZGVzYyBDb2VyY2VzIHZhbHVlIGludG8gYSBTdHJpbmcuXG4gICAgQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4qL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSB2b2lkIDApIHsgdmFsdWUgPSBcInVuZGVmaW5lZFwiOyB9XG4gIGVsc2UgaWYgKCEodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgeyB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTsgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ2lmeS5qcy5tYXAiLCIvLyBncmVhdCB1bmljb2RlIGxpc3Q6IGh0dHA6Ly9hc2VjdXJpdHlzaXRlLmNvbS9jb2RpbmcvYXNjMlxuXG52YXIgZGlhY3JpdGljcyA9IFtcbiAgWy9bXFwzMDAtXFwzMDVdL2csIFwiQVwiXSwgWy9bXFwzNDAtXFwzNDVdL2csIFwiYVwiXSxcbiAgWy9bXFwzMDZdL2csIFwiQUVcIl0sIFsvW1xcMzQ2XS9nLCBcImFlXCJdLFxuICBbL1tcXDMzN10vZywgXCJCXCJdLFxuICBbL1tcXDMwN10vZywgXCJDXCJdLCBbL1tcXDM0N10vZywgXCJjXCJdLFxuICBbL1tcXDMyMFxcMzM2XFwzNzZdL2csIFwiRFwiXSwgWy9bXFwzNjBdL2csIFwiZFwiXSxcbiAgWy9bXFwzMTAtXFwzMTNdL2csIFwiRVwiXSwgWy9bXFwzNTAtXFwzNTNdL2csIFwiZVwiXSxcbiAgWy9bXFwzMTQtXFwzMTddL2csIFwiSVwiXSwgWy9bXFwzNTQtXFwzNTddL2csIFwiaVwiXSxcbiAgWy9bXFwzMjFdL2csIFwiTlwiXSwgWy9bXFwzNjFdL2csIFwiblwiXSxcbiAgWy9bXFwzMjItXFwzMjZcXDMzMF0vZywgXCJPXCJdLCBbL1tcXDM2Mi1cXDM2NlxcMzcwXS9nLCBcIm9cIl0sXG4gIFsvW1xcMzMxLVxcMzM0XS9nLCBcIlVcIl0sIFsvW1xcMzcxLVxcMzc0XS9nLCBcInVcIl0sXG4gIFsvW1xcMzI3XS9nLCBcInhcIl0sXG4gIFsvW1xcMzM1XS9nLCBcIllcIl0sIFsvW1xcMzc1XFwzNzddL2csIFwieVwiXVxuXTtcblxuLyoqXG4gICAgQGZ1bmN0aW9uIHN0cmlwXG4gICAgQGRlc2MgUmVtb3ZlcyBhbGwgbm9uIEFTQ0lJIGNoYXJhY3RlcnMgZnJvbSBhIHN0cmluZy5cbiAgICBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuXG4gIHJldHVybiAoXCJcIiArIHZhbHVlKS5yZXBsYWNlKC9bXkEtWmEtejAtOVxcLV9dL2csIGZ1bmN0aW9uIChjaGFyKSB7XG5cbiAgICBpZiAoY2hhciA9PT0gXCIgXCIpIHsgcmV0dXJuIFwiLVwiOyB9XG5cbiAgICB2YXIgcmV0ID0gZmFsc2U7XG4gICAgZm9yICh2YXIgZCA9IDA7IGQgPCBkaWFjcml0aWNzLmxlbmd0aDsgZCsrKSB7XG4gICAgICBpZiAobmV3IFJlZ0V4cChkaWFjcml0aWNzW2RdWzBdKS50ZXN0KGNoYXIpKSB7XG4gICAgICAgIHJldCA9IGRpYWNyaXRpY3NbZF1bMV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXQgfHwgXCJcIjtcblxuICB9KTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaXAuanMubWFwIiwiaW1wb3J0IHtkZWZhdWx0IGFzIHN0cmluZ2lmeX0gZnJvbSBcIi4vc3RyaW5naWZ5XCI7XG5pbXBvcnQge2RlZmF1bHQgYXMgY29tYmluaW5nTWFya3N9IGZyb20gXCIuL2NvbWJpbmluZ01hcmtzXCI7XG5pbXBvcnQge21lcmdlfSBmcm9tIFwiZDMtYXJyYXlcIjtcblxudmFyIHNwbGl0Q2hhcnMgPSBbXCItXCIsICBcIi9cIiwgIFwiO1wiLCAgXCI6XCIsICBcIiZcIixcbiAgXCJ1MEUyRlwiLCAgLy8gdGhhaSBjaGFyYWN0ZXIgcGFpcmFubm9pXG4gIFwidTBFQUZcIiwgIC8vIGxhbyBlbGxpcHNpc1xuICBcInUwRUM2XCIsICAvLyBsYW8ga28gbGEgKHdvcmQgcmVwZXRpdGlvbilcbiAgXCJ1MEVDQ1wiLCAgLy8gbGFvIGNhbmNlbGxhdGlvbiBtYXJrXG4gIFwidTEwNEFcIiwgIC8vIG15YW5tYXIgc2lnbiBsaXR0bGUgc2VjdGlvblxuICBcInUxMDRCXCIsICAvLyBteWFubWFyIHNpZ24gc2VjdGlvblxuICBcInUxMDRDXCIsICAvLyBteWFubWFyIHN5bWJvbCBsb2NhdGl2ZVxuICBcInUxMDREXCIsICAvLyBteWFubWFyIHN5bWJvbCBjb21wbGV0ZWRcbiAgXCJ1MTA0RVwiLCAgLy8gbXlhbm1hciBzeW1ib2wgYWZvcmVtZW50aW9uZWRcbiAgXCJ1MTA0RlwiLCAgLy8gbXlhbm1hciBzeW1ib2wgZ2VuaXRpdmVcbiAgXCJ1MjAxM1wiLCAgLy8gZW4gZGFzaFxuICBcInUyMDE0XCIsICAvLyBlbSBkYXNoXG4gIFwidTIwMjdcIiwgIC8vIHNpbXBsaWZpZWQgY2hpbmVzZSBoeXBoZW5hdGlvbiBwb2ludFxuICBcInUzMDAwXCIsICAvLyBzaW1wbGlmaWVkIGNoaW5lc2UgaWRlb2dyYXBoaWMgc3BhY2VcbiAgXCJ1MzAwMVwiLCAgLy8gc2ltcGxpZmllZCBjaGluZXNlIGlkZW9ncmFwaGljIGNvbW1hXG4gIFwidTMwMDJcIiwgIC8vIHNpbXBsaWZpZWQgY2hpbmVzZSBpZGVvZ3JhcGhpYyBmdWxsIHN0b3BcbiAgXCJ1RkYwQ1wiLCAgLy8gZnVsbC13aWR0aCBjb21tYVxuICBcInVGRjVFXCIgICAvLyB3YXZlIGRhc2hcbl07XG5cbnZhciBwcmVmaXhDaGFycyA9IFtcIidcIiwgIFwiPFwiLCAgXCIoXCIsICBcIntcIiwgIFwiW1wiLFxuICBcInUwMEFCXCIsICAvLyBsZWZ0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFya1xuICBcInUzMDBBXCIsICAvLyBsZWZ0IGRvdWJsZSBhbmdsZSBicmFja2V0XG4gIFwidTMwMDhcIiAgLy8gbGVmdCBhbmdsZSBicmFja2V0XG5dO1xuXG52YXIgc3VmZml4Q2hhcnMgPSBbXCInXCIsICBcIj5cIiwgIFwiKVwiLCAgXCJ9XCIsICBcIl1cIiwgIFwiLlwiLCAgXCIhXCIsICBcIj9cIixcbiAgXCJ1MDBCQlwiLCAgLy8gcmlnaHQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrXG4gIFwidTMwMEJcIiwgIC8vIHJpZ2h0IGRvdWJsZSBhbmdsZSBicmFja2V0XG4gIFwidTMwMDlcIiAgLy8gcmlnaHQgYW5nbGUgYnJhY2tldFxuXS5jb25jYXQoc3BsaXRDaGFycyk7XG5cbnZhciBidXJtZXNlUmFuZ2UgPSBcIlxcdTEwMDAtXFx1MTAyQVxcdTEwM0YtXFx1MTA0OVxcdTEwNTAtXFx1MTA1NVwiO1xudmFyIGphcGFuZXNlUmFuZ2UgPSBcIlxcdTMwNDAtXFx1MzA5ZlxcdTMwYTAtXFx1MzBmZlxcdWZmMDAtXFx1ZmYwYlxcdWZmMGQtXFx1ZmY1ZFxcdWZmNWYtXFx1ZmY5ZlxcdTM0MDAtXFx1NGRiZlwiO1xudmFyIGNoaW5lc2VSYW5nZSA9IFwiXFx1MzQwMC1cXHU5RkJGXCI7XG52YXIgbGFvUmFuZ2UgPSBcIlxcdTBFODEtXFx1MEVBRVxcdTBFQjAtXFx1MEVDNFxcdTBFQzgtXFx1MEVDQlxcdTBFQ0QtXFx1MEVERFwiO1xuXG52YXIgbm9TcGFjZVJhbmdlID0gYnVybWVzZVJhbmdlICsgY2hpbmVzZVJhbmdlICsgamFwYW5lc2VSYW5nZSArIGxhb1JhbmdlO1xuXG52YXIgc3BsaXRXb3JkcyA9IG5ldyBSZWdFeHAoKFwiKFxcXFxcIiArIChzcGxpdENoYXJzLmpvaW4oXCJ8XFxcXFwiKSkgKyBcIikqW15cXFxcc3xcXFxcXCIgKyAoc3BsaXRDaGFycy5qb2luKFwifFxcXFxcIikpICsgXCJdKihcXFxcXCIgKyAoc3BsaXRDaGFycy5qb2luKFwifFxcXFxcIikpICsgXCIpKlwiKSwgXCJnXCIpO1xudmFyIG5vU3BhY2VMYW5ndWFnZSA9IG5ldyBSZWdFeHAoKFwiW1wiICsgbm9TcGFjZVJhbmdlICsgXCJdXCIpKTtcbnZhciBzcGxpdEFsbENoYXJzID0gbmV3IFJlZ0V4cCgoXCIoXFxcXFwiICsgKHByZWZpeENoYXJzLmpvaW4oXCJ8XFxcXFwiKSkgKyBcIikqW1wiICsgbm9TcGFjZVJhbmdlICsgXCJdKFxcXFxcIiArIChzdWZmaXhDaGFycy5qb2luKFwifFxcXFxcIikpICsgXCJ8XFxcXFwiICsgKGNvbWJpbmluZ01hcmtzLmpvaW4oXCJ8XFxcXFwiKSkgKyBcIikqfFthLXowLTldK1wiKSwgXCJnaVwiKTtcblxuLyoqXG4gICAgQGZ1bmN0aW9uIHRleHRTcGxpdFxuICAgIEBkZXNjIFNwbGl0cyBhIGdpdmVuIHNlbnRlbmNlIGludG8gYW4gYXJyYXkgb2Ygd29yZHMuXG4gICAgQHBhcmFtIHtTdHJpbmd9IHNlbnRlbmNlXG4qL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VudGVuY2UpIHtcbiAgaWYgKCFub1NwYWNlTGFuZ3VhZ2UudGVzdChzZW50ZW5jZSkpIHsgcmV0dXJuIHN0cmluZ2lmeShzZW50ZW5jZSkubWF0Y2goc3BsaXRXb3JkcykuZmlsdGVyKGZ1bmN0aW9uICh3KSB7IHJldHVybiB3Lmxlbmd0aDsgfSk7IH1cbiAgcmV0dXJuIG1lcmdlKHN0cmluZ2lmeShzZW50ZW5jZSkubWF0Y2goc3BsaXRXb3JkcykubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgaWYgKG5vU3BhY2VMYW5ndWFnZS50ZXN0KGQpKSB7IHJldHVybiBkLm1hdGNoKHNwbGl0QWxsQ2hhcnMpOyB9XG4gICAgcmV0dXJuIFtkXTtcbiAgfSkpO1xufVxuXG5leHBvcnQge3ByZWZpeENoYXJzLCBzcGxpdENoYXJzLCBzcGxpdFdvcmRzLCBzdWZmaXhDaGFyc307XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRleHRTcGxpdC5qcy5tYXAiLCIvKipcbiAgICBAZnVuY3Rpb24gdGV4dFdpZHRoXG4gICAgQGRlc2MgR2l2ZW4gYSB0ZXh0IHN0cmluZywgcmV0dXJucyB0aGUgcHJlZGljdGVkIHBpeGVsIHdpZHRoIG9mIHRoZSBzdHJpbmcgd2hlbiBwbGFjZWQgaW50byBET00uXG4gICAgQHBhcmFtIHtTdHJpbmd8QXJyYXl9IHRleHQgQ2FuIGJlIGVpdGhlciBhIHNpbmdsZSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0byBhbmFseXplLlxuICAgIEBwYXJhbSB7T2JqZWN0fSBbc3R5bGVdIEFuIG9iamVjdCBvZiBDU1MgZm9udCBzdHlsZXMgdG8gYXBwbHkuIEFjY2VwdHMgYW55IG9mIHRoZSB2YWxpZCBbQ1NTIGZvbnQgcHJvcGVydHldKGh0dHA6Ly93d3cudzNzY2hvb2xzLmNvbS9jc3NyZWYvcHJfZm9udF9mb250LmFzcCkgdmFsdWVzLlxuKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHRleHQsIHN0eWxlKSB7XG5cbiAgc3R5bGUgPSBPYmplY3QuYXNzaWduKHtcbiAgICBcImZvbnQtc2l6ZVwiOiAxMCxcbiAgICBcImZvbnQtZmFtaWx5XCI6IFwic2Fucy1zZXJpZlwiLFxuICAgIFwiZm9udC1zdHlsZVwiOiBcIm5vcm1hbFwiLFxuICAgIFwiZm9udC13ZWlnaHRcIjogNDAwLFxuICAgIFwiZm9udC12YXJpYW50XCI6IFwibm9ybWFsXCJcbiAgfSwgc3R5bGUpO1xuXG4gIHZhciBjb250ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKS5nZXRDb250ZXh0KFwiMmRcIik7XG5cbiAgdmFyIGZvbnQgPSBbXTtcbiAgZm9udC5wdXNoKHN0eWxlW1wiZm9udC1zdHlsZVwiXSk7XG4gIGZvbnQucHVzaChzdHlsZVtcImZvbnQtdmFyaWFudFwiXSk7XG4gIGZvbnQucHVzaChzdHlsZVtcImZvbnQtd2VpZ2h0XCJdKTtcbiAgZm9udC5wdXNoKHR5cGVvZiBzdHlsZVtcImZvbnQtc2l6ZVwiXSA9PT0gXCJzdHJpbmdcIiA/IHN0eWxlW1wiZm9udC1zaXplXCJdIDogKChzdHlsZVtcImZvbnQtc2l6ZVwiXSkgKyBcInB4XCIpKTtcbiAgLy8gbGV0IHMgPSBgJHtzdHlsZVtcImZvbnQtc2l6ZVwiXX1weGA7XG4gIC8vIGlmIChcImxpbmUtaGVpZ2h0XCIgaW4gc3R5bGUpIHMgKz0gYC8ke3N0eWxlW1wibGluZS1oZWlnaHRcIl19cHhgO1xuICAvLyBmb250LnB1c2gocyk7XG4gIGZvbnQucHVzaChzdHlsZVtcImZvbnQtZmFtaWx5XCJdKTtcblxuICBjb250ZXh0LmZvbnQgPSBmb250LmpvaW4oXCIgXCIpO1xuXG4gIGlmICh0ZXh0IGluc3RhbmNlb2YgQXJyYXkpIHsgcmV0dXJuIHRleHQubWFwKGZ1bmN0aW9uICh0KSB7IHJldHVybiBjb250ZXh0Lm1lYXN1cmVUZXh0KHQpLndpZHRoOyB9KTsgfVxuICByZXR1cm4gY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aDtcblxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZXh0V2lkdGguanMubWFwIiwiaW1wb3J0IG1lYXN1cmUgZnJvbSBcIi4vdGV4dFdpZHRoXCI7XG5pbXBvcnQgZGVmYXVsdFNwbGl0IGZyb20gXCIuL3RleHRTcGxpdFwiO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tIFwiLi9zdHJpbmdpZnlcIjtcbmltcG9ydCB7dHJpbVJpZ2h0fSBmcm9tIFwiLi90cmltXCI7XG5cbi8qKlxuICAgIEBmdW5jdGlvbiB0ZXh0V3JhcFxuICAgIEBkZXNjIEJhc2VkIG9uIHRoZSBkZWZpbmVkIHN0eWxlcyBhbmQgZGltZW5zaW9ucywgYnJlYWtzIGEgc3RyaW5nIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncyBmb3IgZWFjaCBsaW5lIG9mIHRleHQuXG4qL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgdmFyIGZvbnRGYW1pbHkgPSBcInNhbnMtc2VyaWZcIixcbiAgICAgIGZvbnRTaXplID0gMTAsXG4gICAgICBmb250V2VpZ2h0ID0gNDAwLFxuICAgICAgaGVpZ2h0ID0gMjAwLFxuICAgICAgbGluZUhlaWdodCxcbiAgICAgIG1heExpbmVzID0gbnVsbCxcbiAgICAgIG92ZXJmbG93ID0gZmFsc2UsXG4gICAgICBzcGxpdCA9IGRlZmF1bHRTcGxpdCxcbiAgICAgIHdpZHRoID0gMjAwO1xuXG4gIC8qKlxuICAgICAgVGhlIGlubmVyIHJldHVybiBvYmplY3QgYW5kIHdyYXBzIHRoZSB0ZXh0IGFuZCByZXR1cm5zIHRoZSBsaW5lIGRhdGEgYXJyYXkuXG4gICAgICBAcHJpdmF0ZVxuICAqL1xuICBmdW5jdGlvbiB0ZXh0V3JhcChzZW50ZW5jZSkge1xuXG4gICAgc2VudGVuY2UgPSBzdHJpbmdpZnkoc2VudGVuY2UpO1xuXG4gICAgaWYgKGxpbmVIZWlnaHQgPT09IHZvaWQgMCkgeyBsaW5lSGVpZ2h0ID0gTWF0aC5jZWlsKGZvbnRTaXplICogMS40KTsgfVxuXG4gICAgdmFyIHdvcmRzID0gc3BsaXQoc2VudGVuY2UpO1xuXG4gICAgdmFyIHN0eWxlID0ge1xuICAgICAgXCJmb250LWZhbWlseVwiOiBmb250RmFtaWx5LFxuICAgICAgXCJmb250LXNpemVcIjogZm9udFNpemUsXG4gICAgICBcImZvbnQtd2VpZ2h0XCI6IGZvbnRXZWlnaHQsXG4gICAgICBcImxpbmUtaGVpZ2h0XCI6IGxpbmVIZWlnaHRcbiAgICB9O1xuXG4gICAgdmFyIGxpbmUgPSAxLFxuICAgICAgICB0ZXh0UHJvZyA9IFwiXCIsXG4gICAgICAgIHRydW5jYXRlZCA9IGZhbHNlLFxuICAgICAgICB3aWR0aFByb2cgPSAwO1xuXG4gICAgdmFyIGxpbmVEYXRhID0gW10sXG4gICAgICAgICAgc2l6ZXMgPSBtZWFzdXJlKHdvcmRzLCBzdHlsZSksXG4gICAgICAgICAgc3BhY2UgPSBtZWFzdXJlKFwiIFwiLCBzdHlsZSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgd29yZCA9IHdvcmRzW2ldO1xuICAgICAgdmFyIHdvcmRXaWR0aCA9IHNpemVzW3dvcmRzLmluZGV4T2Yod29yZCldO1xuICAgICAgd29yZCArPSBzZW50ZW5jZS5zbGljZSh0ZXh0UHJvZy5sZW5ndGggKyB3b3JkLmxlbmd0aCkubWF0Y2goXCJeKCB8XFxuKSpcIiwgXCJnXCIpWzBdO1xuICAgICAgaWYgKHRleHRQcm9nLnNsaWNlKC0xKSA9PT0gXCJcXG5cIiB8fCB3aWR0aFByb2cgKyB3b3JkV2lkdGggPiB3aWR0aCkge1xuICAgICAgICBpZiAoIWkgJiYgIW92ZXJmbG93KSB7XG4gICAgICAgICAgdHJ1bmNhdGVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBsaW5lRGF0YVtsaW5lIC0gMV0gPSB0cmltUmlnaHQobGluZURhdGFbbGluZSAtIDFdKTtcbiAgICAgICAgbGluZSsrO1xuICAgICAgICBpZiAobGluZUhlaWdodCAqIGxpbmUgPiBoZWlnaHQgfHwgd29yZFdpZHRoID4gd2lkdGggJiYgIW92ZXJmbG93IHx8IG1heExpbmVzICYmIGxpbmUgPiBtYXhMaW5lcykge1xuICAgICAgICAgIHRydW5jYXRlZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgd2lkdGhQcm9nID0gMDtcbiAgICAgICAgbGluZURhdGEucHVzaCh3b3JkKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKCFpKSB7IGxpbmVEYXRhWzBdID0gd29yZDsgfVxuICAgICAgZWxzZSB7IGxpbmVEYXRhW2xpbmUgLSAxXSArPSB3b3JkOyB9XG4gICAgICB0ZXh0UHJvZyArPSB3b3JkO1xuICAgICAgd2lkdGhQcm9nICs9IHdvcmRXaWR0aDtcbiAgICAgIHdpZHRoUHJvZyArPSB3b3JkLm1hdGNoKC9bXFxzXSokL2cpWzBdLmxlbmd0aCAqIHNwYWNlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lczogbGluZURhdGEsXG4gICAgICBzZW50ZW5jZTogc2VudGVuY2UsIHRydW5jYXRlZDogdHJ1bmNhdGVkLFxuICAgICAgd2lkdGhzOiBtZWFzdXJlKGxpbmVEYXRhLCBzdHlsZSksXG4gICAgICB3b3Jkczogd29yZHNcbiAgICB9O1xuXG4gIH1cblxuICAvKipcbiAgICAgIEBtZW1iZXJvZiB0ZXh0V3JhcFxuICAgICAgQGRlc2MgSWYgKnZhbHVlKiBpcyBzcGVjaWZpZWQsIHNldHMgdGhlIGZvbnQgZmFtaWx5IGFjY2Vzc29yIHRvIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gb3Igc3RyaW5nIGFuZCByZXR1cm5zIHRoaXMgZ2VuZXJhdG9yLiBJZiAqdmFsdWUqIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgdGhlIGN1cnJlbnQgZm9udCBmYW1pbHkuXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gWyp2YWx1ZSogPSBcInNhbnMtc2VyaWZcIl1cbiAgKi9cbiAgdGV4dFdyYXAuZm9udEZhbWlseSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmb250RmFtaWx5ID0gXywgdGV4dFdyYXApIDogZm9udEZhbWlseTtcbiAgfTtcblxuICAvKipcbiAgICAgIEBtZW1iZXJvZiB0ZXh0V3JhcFxuICAgICAgQGRlc2MgSWYgKnZhbHVlKiBpcyBzcGVjaWZpZWQsIHNldHMgdGhlIGZvbnQgc2l6ZSBhY2Nlc3NvciB0byB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIG9yIG51bWJlciBhbmQgcmV0dXJucyB0aGlzIGdlbmVyYXRvci4gSWYgKnZhbHVlKiBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBjdXJyZW50IGZvbnQgc2l6ZS5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb258TnVtYmVyfSBbKnZhbHVlKiA9IDEwXVxuICAqL1xuICB0ZXh0V3JhcC5mb250U2l6ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmb250U2l6ZSA9IF8sIHRleHRXcmFwKSA6IGZvbnRTaXplO1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIHRleHRXcmFwXG4gICAgICBAZGVzYyBJZiAqdmFsdWUqIGlzIHNwZWNpZmllZCwgc2V0cyB0aGUgZm9udCB3ZWlnaHQgYWNjZXNzb3IgdG8gdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBvciBudW1iZXIgYW5kIHJldHVybnMgdGhpcyBnZW5lcmF0b3IuIElmICp2YWx1ZSogaXMgbm90IHNwZWNpZmllZCwgcmV0dXJucyB0aGUgY3VycmVudCBmb250IHdlaWdodC5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb258TnVtYmVyfFN0cmluZ30gWyp2YWx1ZSogPSA0MDBdXG4gICovXG4gIHRleHRXcmFwLmZvbnRXZWlnaHQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZm9udFdlaWdodCA9IF8sIHRleHRXcmFwKSA6IGZvbnRXZWlnaHQ7XG4gIH07XG5cbiAgLyoqXG4gICAgICBAbWVtYmVyb2YgdGV4dFdyYXBcbiAgICAgIEBkZXNjIElmICp2YWx1ZSogaXMgc3BlY2lmaWVkLCBzZXRzIGhlaWdodCBsaW1pdCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCByZXR1cm5zIHRoaXMgZ2VuZXJhdG9yLiBJZiAqdmFsdWUqIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgICBAcGFyYW0ge051bWJlcn0gWyp2YWx1ZSogPSAyMDBdXG4gICovXG4gIHRleHRXcmFwLmhlaWdodCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChoZWlnaHQgPSBfLCB0ZXh0V3JhcCkgOiBoZWlnaHQ7XG4gIH07XG5cbiAgLyoqXG4gICAgICBAbWVtYmVyb2YgdGV4dFdyYXBcbiAgICAgIEBkZXNjIElmICp2YWx1ZSogaXMgc3BlY2lmaWVkLCBzZXRzIHRoZSBsaW5lIGhlaWdodCBhY2Nlc3NvciB0byB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIG9yIG51bWJlciBhbmQgcmV0dXJucyB0aGlzIGdlbmVyYXRvci4gSWYgKnZhbHVlKiBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBjdXJyZW50IGxpbmUgaGVpZ2h0IGFjY2Vzc29yLCB3aGljaCBpcyAxLjEgdGltZXMgdGhlIFtmb250IHNpemVdKCN0ZXh0V3JhcC5mb250U2l6ZSkgYnkgZGVmYXVsdC5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb258TnVtYmVyfSBbKnZhbHVlKl1cbiAgKi9cbiAgdGV4dFdyYXAubGluZUhlaWdodCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChsaW5lSGVpZ2h0ID0gXywgdGV4dFdyYXApIDogbGluZUhlaWdodDtcbiAgfTtcblxuICAvKipcbiAgICAgIEBtZW1iZXJvZiB0ZXh0V3JhcFxuICAgICAgQGRlc2MgSWYgKnZhbHVlKiBpcyBzcGVjaWZpZWQsIHNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIGFsbG93ZWQgd2hlbiB3cmFwcGluZy5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb258TnVtYmVyfSBbKnZhbHVlKl1cbiAgKi9cbiAgdGV4dFdyYXAubWF4TGluZXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobWF4TGluZXMgPSBfLCB0ZXh0V3JhcCkgOiBtYXhMaW5lcztcbiAgfTtcblxuICAvKipcbiAgICAgIEBtZW1iZXJvZiB0ZXh0V3JhcFxuICAgICAgQGRlc2MgSWYgKnZhbHVlKiBpcyBzcGVjaWZpZWQsIHNldHMgdGhlIG92ZXJmbG93IHRvIHRoZSBzcGVjaWZpZWQgYm9vbGVhbiBhbmQgcmV0dXJucyB0aGlzIGdlbmVyYXRvci4gSWYgKnZhbHVlKiBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBjdXJyZW50IG92ZXJmbG93IHZhbHVlLlxuICAgICAgQHBhcmFtIHtCb29sZWFufSBbKnZhbHVlKiA9IGZhbHNlXVxuICAqL1xuICB0ZXh0V3JhcC5vdmVyZmxvdyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdmVyZmxvdyA9IF8sIHRleHRXcmFwKSA6IG92ZXJmbG93O1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIHRleHRXcmFwXG4gICAgICBAZGVzYyBJZiAqdmFsdWUqIGlzIHNwZWNpZmllZCwgc2V0cyB0aGUgd29yZCBzcGxpdCBmdW5jdGlvbiB0byB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGFuZCByZXR1cm5zIHRoaXMgZ2VuZXJhdG9yLiBJZiAqdmFsdWUqIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgdGhlIGN1cnJlbnQgd29yZCBzcGxpdCBmdW5jdGlvbi5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb259IFsqdmFsdWUqXSBBIGZ1bmN0aW9uIHRoYXQsIHdoZW4gcGFzc2VkIGEgc3RyaW5nLCBpcyBleHBlY3RlZCB0byByZXR1cm4gdGhhdCBzdHJpbmcgc3BsaXQgaW50byBhbiBhcnJheSBvZiB3b3JkcyB0byB0ZXh0V3JhcC4gVGhlIGRlZmF1bHQgc3BsaXQgZnVuY3Rpb24gc3BsaXRzIHN0cmluZ3Mgb24gdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOiBgLWAsIGAvYCwgYDtgLCBgOmAsIGAmYFxuICAqL1xuICB0ZXh0V3JhcC5zcGxpdCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGxpdCA9IF8sIHRleHRXcmFwKSA6IHNwbGl0O1xuICB9O1xuXG4gIC8qKlxuICAgICAgQG1lbWJlcm9mIHRleHRXcmFwXG4gICAgICBAZGVzYyBJZiAqdmFsdWUqIGlzIHNwZWNpZmllZCwgc2V0cyB3aWR0aCBsaW1pdCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCByZXR1cm5zIHRoaXMgZ2VuZXJhdG9yLiBJZiAqdmFsdWUqIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgICBAcGFyYW0ge051bWJlcn0gWyp2YWx1ZSogPSAyMDBdXG4gICovXG4gIHRleHRXcmFwLndpZHRoID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdpZHRoID0gXywgdGV4dFdyYXApIDogd2lkdGg7XG4gIH07XG5cbiAgcmV0dXJuIHRleHRXcmFwO1xuXG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRleHRXcmFwLmpzLm1hcCIsImltcG9ydCB7c3VmZml4Q2hhcnMsIGRlZmF1bHQgYXMgdGV4dFNwbGl0fSBmcm9tIFwiLi90ZXh0U3BsaXRcIjtcblxudmFyIGxvd2VyY2FzZSA9IFtcImFcIiwgXCJhblwiLCBcImFuZFwiLCBcImFzXCIsIFwiYXRcIiwgXCJidXRcIiwgXCJieVwiLCBcImZvclwiLCBcImZyb21cIiwgXCJpZlwiLCBcImluXCIsIFwiaW50b1wiLCBcIm5lYXJcIiwgXCJub3JcIiwgXCJvZlwiLCBcIm9uXCIsIFwib250b1wiLCBcIm9yXCIsIFwicGVyXCIsIFwidGhhdFwiLCBcInRoZVwiLCBcInRvXCIsIFwid2l0aFwiLCBcInZpYVwiLCBcInZzXCIsIFwidnMuXCJdO1xudmFyIHVwcGVyY2FzZSA9IFtcIkNFT1wiLCBcIkNGT1wiLCBcIkNOQ1wiLCBcIkNPT1wiLCBcIkNQVVwiLCBcIkdEUFwiLCBcIkhWQUNcIiwgXCJJRFwiLCBcIklUXCIsIFwiUiZEXCIsIFwiVFZcIiwgXCJVSVwiXTtcblxuLyoqXG4gICAgQGZ1bmN0aW9uIHRpdGxlQ2FzZVxuICAgIEBkZXNjIENhcGl0YWxpemVzIHRoZSBmaXJzdCBsZXR0ZXIgb2YgZWFjaCB3b3JkIGluIGEgcGhyYXNlL3NlbnRlbmNlLlxuICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBhcHBseSB0aGUgdGl0bGUgY2FzZSBsb2dpYy5cbiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdHIpIHtcblxuICBpZiAoc3RyID09PSB2b2lkIDApIHsgcmV0dXJuIFwiXCI7IH1cblxuICB2YXIgc21hbGxzID0gbG93ZXJjYXNlLm1hcChmdW5jdGlvbiAocykgeyByZXR1cm4gcy50b0xvd2VyQ2FzZSgpOyB9KTtcblxuICB2YXIgYmlncyA9IHVwcGVyY2FzZS5zbGljZSgpO1xuICBiaWdzID0gYmlncy5jb25jYXQoYmlncy5tYXAoZnVuY3Rpb24gKGIpIHsgcmV0dXJuIChiICsgXCJzXCIpOyB9KSk7XG4gIHZhciBiaWdsb3cgPSBiaWdzLm1hcChmdW5jdGlvbiAoYikgeyByZXR1cm4gYi50b0xvd2VyQ2FzZSgpOyB9KTtcblxuICB2YXIgc3BsaXQgPSB0ZXh0U3BsaXQoc3RyKTtcbiAgcmV0dXJuIHNwbGl0Lm1hcChmdW5jdGlvbiAocywgaSkge1xuICAgIGlmIChzKSB7XG4gICAgICB2YXIgbG93ZXIgPSBzLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgc3RyaXBwZWQgPSBzdWZmaXhDaGFycy5pbmNsdWRlcyhsb3dlci5jaGFyQXQobG93ZXIubGVuZ3RoIC0gMSkpID8gbG93ZXIuc2xpY2UoMCwgLTEpIDogbG93ZXI7XG4gICAgICB2YXIgYmlnaW5kZXggPSBiaWdsb3cuaW5kZXhPZihzdHJpcHBlZCk7XG4gICAgICBpZiAoYmlnaW5kZXggPj0gMCkgeyByZXR1cm4gYmlnc1tiaWdpbmRleF07IH1cbiAgICAgIGVsc2UgaWYgKHNtYWxscy5pbmNsdWRlcyhzdHJpcHBlZCkgJiYgaSAhPT0gMCAmJiBpICE9PSBzcGxpdC5sZW5ndGggLSAxKSB7IHJldHVybiBsb3dlcjsgfVxuICAgICAgZWxzZSB7IHJldHVybiBzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcy5zdWJzdHIoMSkudG9Mb3dlckNhc2UoKTsgfVxuICAgIH1cbiAgICBlbHNlIHsgcmV0dXJuIFwiXCI7IH1cbiAgfSkucmVkdWNlKGZ1bmN0aW9uIChyZXQsIHMsIGkpIHtcbiAgICBpZiAoaSAmJiBzdHIuY2hhckF0KHJldC5sZW5ndGgpID09PSBcIiBcIikgeyByZXQgKz0gXCIgXCI7IH1cbiAgICByZXQgKz0gcztcbiAgICByZXR1cm4gcmV0O1xuICB9LCBcIlwiKTtcblxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD10aXRsZUNhc2UuanMubWFwIiwiLyoqXG4gICAgQGZ1bmN0aW9uIHRyaW1cbiAgICBAZGVzYyBDcm9zcy1icm93c2VyIGltcGxlbWVudGF0aW9uIG9mIFt0cmltXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvVHJpbSkuXG4gICAgQHBhcmFtIHtTdHJpbmd9IHN0clxuKi9cbmZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgXCJcIik7XG59XG5cbi8qKlxuICAgIEBmdW5jdGlvbiB0cmltTGVmdFxuICAgIEBkZXNjIENyb3NzLWJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgW3RyaW1MZWZ0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvVHJpbUxlZnQpLlxuICAgIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiovXG5mdW5jdGlvbiB0cmltTGVmdChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzKy8sIFwiXCIpO1xufVxuXG4vKipcbiAgICBAZnVuY3Rpb24gdHJpbVJpZ2h0XG4gICAgQGRlc2MgQ3Jvc3MtYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBbdHJpbVJpZ2h0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvVHJpbVJpZ2h0KS5cbiAgICBAcGFyYW0ge1N0cmluZ30gc3RyXG4qL1xuZnVuY3Rpb24gdHJpbVJpZ2h0KHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL1xccyskLywgXCJcIik7XG59XG5cbmV4cG9ydCB7dHJpbSwgdHJpbUxlZnQsIHRyaW1SaWdodH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyaW0uanMubWFwIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG5FdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbihuKSB7XG4gIGlmICghaXNOdW1iZXIobikgfHwgbiA8IDAgfHwgaXNOYU4obikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCduIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBlciwgaGFuZGxlciwgbGVuLCBhcmdzLCBpLCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAodHlwZSA9PT0gJ2Vycm9yJykge1xuICAgIGlmICghdGhpcy5fZXZlbnRzLmVycm9yIHx8XG4gICAgICAgIChpc09iamVjdCh0aGlzLl9ldmVudHMuZXJyb3IpICYmICF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSkge1xuICAgICAgZXIgPSBhcmd1bWVudHNbMV07XG4gICAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcgKyBlciArICcpJyk7XG4gICAgICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc1VuZGVmaW5lZChoYW5kbGVyKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIGZhc3QgY2FzZXNcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIHNsb3dlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGhhbmRsZXIpKSB7XG4gICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgbGlzdGVuZXJzID0gaGFuZGxlci5zbGljZSgpO1xuICAgIGxlbiA9IGxpc3RlbmVycy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG07XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgaWYgKHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lcilcbiAgICB0aGlzLmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbihsaXN0ZW5lci5saXN0ZW5lcikgP1xuICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgZWxzZSBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlXG4gICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gW3RoaXMuX2V2ZW50c1t0eXBlXSwgbGlzdGVuZXJdO1xuXG4gIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pICYmICF0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkKSB7XG4gICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9tYXhMaXN0ZW5lcnMpKSB7XG4gICAgICBtID0gdGhpcy5fbWF4TGlzdGVuZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gICAgfVxuXG4gICAgaWYgKG0gJiYgbSA+IDAgJiYgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCA+IG0pIHtcbiAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgJyArXG4gICAgICAgICAgICAgICAgICAgICdsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUudHJhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBpbiBJRSAxMFxuICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIHZhciBmaXJlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGcoKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBnKTtcblxuICAgIGlmICghZmlyZWQpIHtcbiAgICAgIGZpcmVkID0gdHJ1ZTtcbiAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgZy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB0aGlzLm9uKHR5cGUsIGcpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWRcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbGlzdCwgcG9zaXRpb24sIGxlbmd0aCwgaTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXR1cm4gdGhpcztcblxuICBsaXN0ID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuICBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgcG9zaXRpb24gPSAtMTtcblxuICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHxcbiAgICAgIChpc0Z1bmN0aW9uKGxpc3QubGlzdGVuZXIpICYmIGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG5cbiAgfSBlbHNlIGlmIChpc09iamVjdChsaXN0KSkge1xuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tID4gMDspIHtcbiAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fFxuICAgICAgICAgIChsaXN0W2ldLmxpc3RlbmVyICYmIGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgbGlzdC5sZW5ndGggPSAwO1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdC5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGtleSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgaWYgKCF0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIGVsc2UgaWYgKHRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBmb3IgKGtleSBpbiB0aGlzLl9ldmVudHMpIHtcbiAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXJzKSkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgfSBlbHNlIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAvLyBMSUZPIG9yZGVyXG4gICAgd2hpbGUgKGxpc3RlbmVycy5sZW5ndGgpXG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pO1xuICB9XG4gIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIHJldDtcbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXQgPSBbXTtcbiAgZWxzZSBpZiAoaXNGdW5jdGlvbih0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIHJldCA9IFt0aGlzLl9ldmVudHNbdHlwZV1dO1xuICBlbHNlXG4gICAgcmV0ID0gdGhpcy5fZXZlbnRzW3R5cGVdLnNsaWNlKCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIGlmICh0aGlzLl9ldmVudHMpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICAgIGlmIChpc0Z1bmN0aW9uKGV2bGlzdGVuZXIpKVxuICAgICAgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoZXZsaXN0ZW5lcilcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xufTtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuIiwiaW1wb3J0IEJveGVkVHJlZSBmcm9tICcuL2pzL0JveGVkVHJlZSc7XHJcbmltcG9ydCBDaXJjbGVUcmVlIGZyb20gJy4vanMvQ2lyY2xlVHJlZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBib3hlZFRyZWU6IEJveGVkVHJlZSxcclxuICAgIGNpcmNsZVRyZWU6IENpcmNsZVRyZWVcclxufTsiLCJpbXBvcnQgZDMgZnJvbSAnLi9DdXN0b21EMyc7XHJcbmltcG9ydCBOb2RlU2V0dGluZ3MgZnJvbSAnLi9Ob2RlU2V0dGluZ3MnO1xyXG5pbXBvcnQgTG9hZE9uRGVtYW5kU2V0dGluZ3MgZnJvbSAnLi9Mb2FkT25EZW1hbmRTZXR0aW5ncyc7XHJcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJztcclxuXHJcbi8qKlxyXG4gKiBSZWN1cnNpdmVseSBmaW5kIGEgcGFydGljdWxhciBvYmplY3Qgd2l0aGluIGEgaGllcmFyY2hpY2FsIGRhdGFzZXQuXHJcbiAqIFxyXG4gKiBAcGFyYW0ge29iamVjdH0gaGllcmFyY2hpY2FsT2JqZWN0IFRoZSBpbml0aWFsIGhpZXJhcmNoaWNhbCBvYmplY3QgdG8gc3RhcnQgdGhlIHJlY3Vyc2l2ZSBmaW5kLlxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBnZXRDaGlsZHJlbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBnZXRzIHRoZSBjaGlsZHJlbiBpdGVtcyBvZiB0aGUgaGllcmFyY2hpY2FsIG9iamVjdC5cclxuICogQHBhcmFtIHtmdW5jdGlvbn0gZmluZENvbmRpdGlvbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIHdoZXRoZXIgdGhlIG9iamVjdCBtYXRjaGVzIHRoZSBjb25kaXRpb24gdG8gYmUgcmV0dXJuZWQgb3Igbm90LlxyXG4gKiBAcmV0dXJucyB7b2JqZWN0fG51bGx9IFRoZSBmaXJzdCBvYmplY3QgbWF0Y2hpbmcgdGhlIGNvbmRpdGlvbnMuXHJcbiAqL1xyXG5mdW5jdGlvbiByZWN1cnNpdmVGaW5kKGhpZXJhcmNoaWNhbE9iamVjdCwgZ2V0Q2hpbGRyZW4sIGZpbmRDb25kaXRpb24pIHtcclxuICAgIGlmIChmaW5kQ29uZGl0aW9uKGhpZXJhcmNoaWNhbE9iamVjdCkpXHJcbiAgICAgICAgcmV0dXJuIGhpZXJhcmNoaWNhbE9iamVjdDtcclxuICAgIHZhciBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGhpZXJhcmNoaWNhbE9iamVjdCk7XHJcbiAgICB2YXIgZm91bmROb2RlID0gY2hpbGRyZW4uZmluZChmaW5kQ29uZGl0aW9uKTtcclxuICAgIGlmICghZm91bmROb2RlKVxyXG4gICAge1xyXG4gICAgICAgIGZvciAodmFyIGNoaWxkIG9mIGNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIGZvdW5kTm9kZSA9IHJlY3Vyc2l2ZUZpbmQoY2hpbGQsIGdldENoaWxkcmVuLCBmaW5kQ29uZGl0aW9uKTtcclxuICAgICAgICAgICAgaWYgKGZvdW5kTm9kZSlcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmb3VuZE5vZGU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZWN1cnNpdmVseSBnZXRzIGEgc2V0IG9mIG9iamVjdHMgd2l0aGluIGEgaGllcmFyY2hpY2FsIGRhdGFzZXQuXHJcbiAqIFxyXG4gKiBAcGFyYW0ge29iamVjdH0gaGllcmFyY2hpY2FsT2JqZWN0IFRoZSBpbml0aWFsIGhpZXJhcmNoaWNhbCBvYmplY3QgdG8gc3RhcnQgdGhlIHJlY3Vyc2l2ZSBnZXQuXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGdldENoaWxkcmVuIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGdldHMgdGhlIGNoaWxkcmVuIGl0ZW1zIG9mIHRoZSBoaWVyYXJjaGljYWwgb2JqZWN0LlxyXG4gKi9cclxuZnVuY3Rpb24gcmVjdXJzaXZlR2V0KGhpZXJhcmNoaWNhbE9iamVjdCwgZ2V0Q2hpbGRyZW4pIHtcclxuICAgIHZhciBhbGxJdGVtcyA9IFtdO1xyXG4gICAgdmFyIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oaGllcmFyY2hpY2FsT2JqZWN0KTtcclxuICAgIGlmIChjaGlsZHJlbilcclxuICAgIHtcclxuICAgICAgICBmb3IgKHZhciBjaGlsZCBvZiBjaGlsZHJlbikge1xyXG4gICAgICAgICAgICBhbGxJdGVtcy5wdXNoKGNoaWxkKTtcclxuICAgICAgICAgICAgdmFyIGRlc2NlbmRhbnRzID0gcmVjdXJzaXZlR2V0KGNoaWxkLCBnZXRDaGlsZHJlbik7XHJcbiAgICAgICAgICAgIGlmIChkZXNjZW5kYW50cylcclxuICAgICAgICAgICAgICAgIGFsbEl0ZW1zID0gWy4uLmFsbEl0ZW1zLCAuLi5kZXNjZW5kYW50c107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFsbEl0ZW1zO1xyXG59XHJcblxyXG5jbGFzcyBCYXNlVHJlZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy50aGVtZT1kZWZhdWx0XSBUaGUgdGhlbWUgb2YgdGhlIHRyZWUuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMub3JpZW50YXRpb249bGVmdFRvUmlnaHRdIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgdHJlZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYWxsb3dQYW49dHJ1ZV0gRW5hYmxlcy9kaXNhYmxlcyB0aGUgbW91c2UgZHJhZyB0byBwYW4gZmVhdHVyZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYWxsb3dab29tPXRydWVdIEVuYWJsZXMvZGlzYWJsZXMgdGhlIG1vdXNlIHdoZWVsIHRvIHpvb20gZmVhdHVyZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYWxsb3dGb2N1cz10cnVlXSBJZiB0cnVlLCBjbGlja2luZyBvbiBhIG5vZGUgd291bGQgZm9jdXMgdG8gdGhlIG5vZGUsIGhpZGluZyBhbGwgaXJyZWxldmFudCBub2RlcyB0aGF0J3Mgbm90IGEgcGFyZW50LCBhbmNlc3Rvciwgb3Igc2libGluZy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYWxsb3dOb2RlQ2VudGVyaW5nPXRydWVdIElmIHRydWUsIGNsaWNraW5nIG9uIGEgbm9kZSB3b3VsZCBwYW4gdG8gdGhlIG5vZGUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWluU2NhbGU9MV0gTWluaW11bSB6b29tIHNjYWxpbmcuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4U2NhbGU9Ml0gTWF4aW11bSB6b29tIHNjYWxpbmcuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubm9kZURlcHRoTXVsdGlwbGllcj0zMDBdIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIGNoaWxkIG5vZGVzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pc0ZsYXREYXRhPWZhbHNlXSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcGFzc2VkIGRhdGEgd2FzIGEgZmxhdCBhcnJheSBvZiBvYmplY3RzLiBJZiB0cnVlLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBgZ2V0UGFyZW50SWRgIG9wdGlvbi5cclxuICAgICAqIEBwYXJhbSB7Z2V0SWRDYWxsQmFja30gb3B0aW9ucy5nZXRJZFxyXG4gICAgICogQHBhcmFtIHtnZXRQYXJlbnRJZENhbGxCYWNrfSBbb3B0aW9ucy5nZXRQYXJlbnRJZF1cclxuICAgICAqIEBwYXJhbSB7Z2V0Q2hpbGRyZW5DYWxsQmFja30gW29wdGlvbnMuZ2V0Q2hpbGRyZW5dXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMud2lkdGhXaXRob3V0TWFyZ2lucz05NjBdIFRoZSB3aWR0aCBvZiB0aGUgdHJlZSwgbm90IGluY2x1ZGluZyB0aGUgbWFyZ2lucy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5oZWlnaHRXaXRob3V0TWFyZ2lucz04MDBdIFRoZSBoZWlnaHQgb2YgdGhlIHRyZWUsIG5vdCBpbmNsdWRpbmcgdGhlIG1hcmdpbnMuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMubWFyZ2luc10gT2JqZWN0IHNwZWNpZnlpbmcgdGhlIG1hcmdpbnMgb2YgdGhlIHRyZWUgZGlhZ3JhbS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXJnaW5zLnRvcF0gVGhlIHRvcCBtYXJnaW4gZm9yIHRoZSB0cmVlIGRpYWdyYW0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWFyZ2lucy5yaWdodF0gVGhlIHJpZ2h0IG1hcmdpbiBmb3IgdGhlIHRyZWUgZGlhZ3JhbS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXJnaW5zLmJvdHRvbV0gVGhlIGJvdHRvbSBtYXJnaW4gZm9yIHRoZSB0cmVlIGRpYWdyYW0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWFyZ2lucy5sZWZ0XSBUaGUgbGVmdCBtYXJnaW4gZm9yIHRoZSB0cmVlIGRpYWdyYW0uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZHVyYXRpb25dIEludGVnZXIgaW4gbWlsbGlzZWNvbmRzIGRldGVybWluaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9ucyBmb3IgdGhlIHRyZWUuXHJcbiAgICAgKiBAcGFyYW0ge0xvYWRPbkRlbWFuZFNldHRpbmdzfSBbb3B0aW9ucy5sb2FkT25EZW1hbmRTZXR0aW5nc10gT2JqZWN0IHNwZWNpZnlpbmcgdGhlIGxvYWQtb24tZGVtYW5kIHNldHRpbmdzLlxyXG4gICAgICogQHBhcmFtIHtOb2RlU2V0dGluZ3N9IFtvcHRpb25zLm5vZGVTZXR0aW5nc10gT2JqZWN0IHNwZWNpZnlpbmcgdGhlIG5vZGUgc2V0dGluZ3MgZm9yIHRoZSB0cmVlLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsgLy8gRGVmYXVsdHMgb3B0aW9ucyB0byBhbiBlbXB0eSBvYmplY3RcclxuXHJcbiAgICAgICAgdmFyIG1lcmdlZE9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIC4uLkJhc2VUcmVlLmRlZmF1bHRzLFxyXG4gICAgICAgICAgICAuLi5vcHRpb25zXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gV2UgZGVmaW5lIG91ciBwcm90b3R5cGUgcHJvcGVydGllcyB3aGljaCB3b3VsZCBiZSBzZXQgbGF0ZXJcclxuICAgICAgICB0aGlzLl9yb290ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zdmcgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3Bhbm5pbmdDb250YWluZXIgPSBudWxsLFxyXG4gICAgICAgIHRoaXMuX3ZpZXcgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3RyZWVHZW5lcmF0b3IgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2xpbmtQYXRoR2VuZXJhdG9yID0gbnVsbDtcclxuICAgICAgICB0aGlzLl92aXNpYmxlTm9kZXMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2xpbmtzID0gbnVsbDtcclxuICAgICAgICB0aGlzLl96b29tTGlzdGVuZXIgPSBudWxsLFxyXG5cclxuICAgICAgICAvLyBBc3NpZ24vU2V0IHByb3RvdHlwZSBwcm9wZXJ0aWVzLCB1c2luZyB2YWx1ZXMgcGFzc2VkIGZyb20gdGhlIG9wdGlvbnMgb2JqZWN0XHJcbiAgICAgICAgdGhpcy5zZXRUaGVtZShtZXJnZWRPcHRpb25zLnRoZW1lKTtcclxuICAgICAgICB0aGlzLnNldE9yaWVudGF0aW9uKG1lcmdlZE9wdGlvbnMub3JpZW50YXRpb24pO1xyXG4gICAgICAgIHRoaXMuc2V0RGF0YShtZXJnZWRPcHRpb25zLmRhdGEpO1xyXG4gICAgICAgIHRoaXMuc2V0RWxlbWVudChtZXJnZWRPcHRpb25zLmVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuc2V0V2lkdGhXaXRob3V0TWFyZ2lucyhtZXJnZWRPcHRpb25zLndpZHRoV2l0aG91dE1hcmdpbnMpO1xyXG4gICAgICAgIHRoaXMuc2V0SGVpZ2h0V2l0aG91dE1hcmdpbnMobWVyZ2VkT3B0aW9ucy5oZWlnaHRXaXRob3V0TWFyZ2lucyk7XHJcbiAgICAgICAgdGhpcy5zZXRNYXJnaW5zKG1lcmdlZE9wdGlvbnMubWFyZ2lucyk7XHJcbiAgICAgICAgdGhpcy5zZXREdXJhdGlvbihtZXJnZWRPcHRpb25zLmR1cmF0aW9uKTtcclxuICAgICAgICB0aGlzLnNldEFsbG93UGFuKG1lcmdlZE9wdGlvbnMuYWxsb3dQYW4pO1xyXG4gICAgICAgIHRoaXMuc2V0QWxsb3dab29tKG1lcmdlZE9wdGlvbnMuYWxsb3dab29tKTtcclxuICAgICAgICB0aGlzLnNldEFsbG93Rm9jdXMobWVyZ2VkT3B0aW9ucy5hbGxvd0ZvY3VzKTtcclxuICAgICAgICB0aGlzLnNldEFsbG93Tm9kZUNlbnRlcmluZyhtZXJnZWRPcHRpb25zLmFsbG93Tm9kZUNlbnRlcmluZyk7XHJcbiAgICAgICAgdGhpcy5zZXRNaW5TY2FsZShtZXJnZWRPcHRpb25zLm1pblNjYWxlKTtcclxuICAgICAgICB0aGlzLnNldE1heFNjYWxlKG1lcmdlZE9wdGlvbnMubWF4U2NhbGUpO1xyXG4gICAgICAgIHRoaXMuc2V0SXNGbGF0RGF0YShtZXJnZWRPcHRpb25zLmlzRmxhdERhdGEpO1xyXG4gICAgICAgIHRoaXMuc2V0Tm9kZURlcHRoTXVsdGlwbGllcihtZXJnZWRPcHRpb25zLm5vZGVEZXB0aE11bHRpcGxpZXIpXHJcblxyXG4gICAgICAgIC8vIFdlIGRlZmluZSBvdXIgc3ViLXByb3RvdHlwZSAoQUtBIHN1Yi1jbGFzcykgcHJvcGVydGllc1xyXG5cclxuICAgICAgICB0aGlzLmxvYWRPbkRlbWFuZFNldHRpbmdzID0gbmV3IExvYWRPbkRlbWFuZFNldHRpbmdzKHRoaXMsIG1lcmdlZE9wdGlvbnMubG9hZE9uRGVtYW5kU2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMubm9kZVNldHRpbmdzID0gbmV3IE5vZGVTZXR0aW5ncyh0aGlzLCBtZXJnZWRPcHRpb25zLm5vZGVTZXR0aW5ncyk7XHJcblxyXG4gICAgICAgIC8vIFdlIGRlZmluZSBvdXIgbWV0aG9kcywgd2hpY2ggZGVyaXZlcyBmcm9tIG91ciBvcHRpb25zXHJcbiAgICAgICAgdGhpcy5fZ2V0SWQgPSBtZXJnZWRPcHRpb25zLmdldElkO1xyXG4gICAgICAgIHRoaXMuX2dldENoaWxkcmVuID0gbWVyZ2VkT3B0aW9ucy5nZXRDaGlsZHJlbjtcclxuICAgICAgICB0aGlzLl9nZXRQYXJlbnRJZCA9IG1lcmdlZE9wdGlvbnMuZ2V0UGFyZW50SWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIGhvdyB0byBjcmVhdGUgdGhlIG5vZGVzIGZvciBuZXdseVxyXG4gICAgICogYWRkZWQgZGF0YSBvYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Kn0gbm9kZUVudGVyIFRoZSBEMyBFbnRlciBzZWxlY3Rpb24gb2Ygbm9kZXMuXHJcbiAgICAgKiBAcGFyYW0geyp9IG5vZGVzXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgdHJlZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIF9ub2RlRW50ZXIobm9kZUVudGVyLCBub2Rlcykge1xyXG4gICAgICAgIHRocm93ICdUaGUgZnVuY3Rpb24gX25vZGVFbnRlciBtdXN0IGJlIGltcGxlbWVudGVkJztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgaG93IHRvIHVwZGF0ZSB0aGUgbm9kZXMgZm9yIHRoZVxyXG4gICAgICogZGF0YSBvYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Kn0gbm9kZVVwZGF0ZSBUaGUgRDMgVXBkYXRlIHNlbGVjdGlvbiBvZiBub2Rlcy5cclxuICAgICAqIEBwYXJhbSB7Kn0gbm9kZVVwZGF0ZVRyYW5zaXRpb24gVGhlIEQzIHRyYW5zaXRpb24gb2JqZWN0IGZvciB0aGUgRDMgVXBkYXRlIHNlbGVjdGlvbiBvZiBub2Rlcy5cclxuICAgICAqIEBwYXJhbSB7Kn0gbm9kZXNcclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgX25vZGVVcGRhdGUobm9kZVVwZGF0ZSwgbm9kZVVwZGF0ZVRyYW5zaXRpb24sIG5vZGVzKSB7XHJcbiAgICAgICAgdGhyb3cgJ1RoZSBmdW5jdGlvbiBfbm9kZVVwZGF0ZSBtdXN0IGJlIGltcGxlbWVudGVkJztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgaG93IHRvIHJlbW92ZSB0aGUgbm9kZXMgZm9yIHRoZVxyXG4gICAgICogcmVtb3ZlZCBkYXRhIG9iamVjdHMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBub2RlRXhpdCBUaGUgRDMgRXhpdCBzZWxlY3Rpb24gb2Ygbm9kZXMuXHJcbiAgICAgKiBAcGFyYW0geyp9IG5vZGVFeGl0VHJhbnNpdGlvbiBUaGUgRDMgdHJhbnNpdGlvbiBvYmplY3QgZm9yIHRoZSBEMyBFeGl0IHNlbGVjdGlvbiBvZiBub2Rlcy5cclxuICAgICAqIEBwYXJhbSB7Kn0gbm9kZXNcclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgX25vZGVFeGl0KG5vZGVFeGl0LCBub2RlRXhpdFRyYW5zaXRpb24sIG5vZGVzKSB7XHJcbiAgICAgICAgdGhyb3cgJ1RoZSBmdW5jdGlvbiBfbm9kZUV4aXQgbXVzdCBiZSBpbXBsZW1lbnRlZCc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwYXRoIGdlbmVyYXRvciB1c2VkIHRvIHJlbmRlclxyXG4gICAgICogdGhlIGxpbmtzIGJldHdlZW4gdGhlIG5vZGVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbn0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIHRoZSBTVkcgcGF0aCBjb29yZGluYXRlcyBmb3IgdGhlIGxpbmtzLCBnaXZlbiBhIGNvb3JkaW5hdGVzIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgX2dldExpbmtQYXRoR2VuZXJhdG9yKCkge1xyXG4gICAgICAgIHRocm93ICdUaGUgZnVuY3Rpb24gX2dldExpbmtQYXRoR2VuZXJhdG9yIG11c3QgYmUgaW1wbGVtZW50ZWQnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyBob3cgdG8gY3JlYXRlIHRoZSBsaW5rcyBmb3IgbmV3bHlcclxuICAgICAqIGFkZGVkIGRhdGEgb2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IHNvdXJjZSBUaGUgb3JpZ2luYWwgZGF0YSBvYmplY3QgdGhhdCB0aGUgbGlua3MgYXJlIGJlaW5nIGRyYXduIGZvci5cclxuICAgICAqIEBwYXJhbSB7Kn0gbGlua0VudGVyIFRoZSBEMyBFbnRlciBzZWxlY3Rpb24gb2YgbGlua3MuXHJcbiAgICAgKiBAcGFyYW0geyp9IGxpbmtzXHJcbiAgICAgKiBAcGFyYW0geyp9IGxpbmtQYXRoR2VuZXJhdG9yXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgdHJlZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIF9saW5rRW50ZXIoc291cmNlLCBsaW5rRW50ZXIsIGxpbmtzLCBsaW5rUGF0aEdlbmVyYXRvcikge1xyXG4gICAgICAgIHRocm93ICdUaGUgZnVuY3Rpb24gX2xpbmtFbnRlciBtdXN0IGJlIGltcGxlbWVudGVkJztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgaG93IHRvIHVwZGF0ZSB0aGUgbGlua3MgZm9yIHRoZVxyXG4gICAgICogZGF0YSBvYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Kn0gc291cmNlIFRoZSBvcmlnaW5hbCBkYXRhIG9iamVjdCB0aGF0IHRoZSBsaW5rcyBhcmUgYmVpbmcgZHJhd24gZm9yLlxyXG4gICAgICogQHBhcmFtIHsqfSBsaW5rVXBkYXRlIFRoZSBEMyBVcGRhdGUgc2VsZWN0aW9uIG9mIGxpbmtzLlxyXG4gICAgICogQHBhcmFtIHsqfSBsaW5rVXBkYXRlVHJhbnNpdGlvbiBUaGUgRDMgdHJhbnNpdGlvbiBvYmplY3QgZm9yIHRoZSBEMyBVcGRhdGUgc2VsZWN0aW9uIG9mIGxpbmtzLlxyXG4gICAgICogQHBhcmFtIHsqfSBsaW5rc1xyXG4gICAgICogQHBhcmFtIHsqfSBsaW5rUGF0aEdlbmVyYXRvciBUaGUgbGluayBwYXRoIGdlbmVyYXRvciBmdW5jdGlvbi5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgX2xpbmtVcGRhdGUoc291cmNlLCBsaW5rVXBkYXRlLCBsaW5rVXBkYXRlVHJhbnNpdGlvbiwgbGlua3MsIGxpbmtQYXRoR2VuZXJhdG9yKSB7XHJcbiAgICAgICAgdGhyb3cgJ1RoZSBmdW5jdGlvbiBfbGlua1VwZGF0ZSBtdXN0IGJlIGltcGxlbWVudGVkJztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmluZXMgaG93IHRvIHJlbW92ZSB0aGUgbGlua3MgZm9yIHRoZVxyXG4gICAgICogcmVtb3ZlZCBkYXRhIG9iamVjdHMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHNvdXJjZSBUaGUgb3JpZ2luYWwgZGF0YSBvYmplY3QgdGhhdCB0aGUgbGlua3MgYXJlIGJlaW5nIGRyYXduIGZvci5cclxuICAgICAqIEBwYXJhbSB7Kn0gbGlua0V4aXQgVGhlIEQzIEV4aXQgc2VsZWN0aW9uIG9mIGxpbmtzLlxyXG4gICAgICogQHBhcmFtIHsqfSBsaW5rRXhpdFRyYW5zaXRpb24gVGhlIEQzIHRyYW5zaXRpb24gb2JqZWN0IGZvciB0aGUgRDMgVXBkYXRlIHNlbGVjdGlvbiBvZiBsaW5rcy5cclxuICAgICAqIEBwYXJhbSB7Kn0gbGlua3NcclxuICAgICAqIEBwYXJhbSB7Kn0gbGlua1BhdGhHZW5lcmF0b3IgVGhlIGxpbmsgcGF0aCBnZW5lcmF0b3IgZnVuY3Rpb24uXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgdHJlZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIF9saW5rRXhpdChzb3VyY2UsIGxpbmtFeGl0LCBsaW5rRXhpdFRyYW5zaXRpb24sIGxpbmtzLCBsaW5rUGF0aEdlbmVyYXRvcikge1xyXG4gICAgICAgIHRocm93ICdUaGUgZnVuY3Rpb24gX2xpbmtFeGl0IG11c3QgYmUgaW1wbGVtZW50ZWQnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW4gdXBkYXRpbmcgZGltZW5zaW9ucyB3aGVuXHJcbiAgICAgKiBub2RlIHNldHRpbmdzIGlzIGNvbmZpZ3VyZWQgdG8gYmVcclxuICAgICAqICdub2Rlc2l6ZScuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJbXX0gQW4gYXJyYXkgd2l0aCB0d28gdmFsdWVzLCByZXByZXNlbnRpbmcgdGhlIGhlaWdodCBhbmQgd2lkdGggb2YgdGhlIG5vZGUgcmVzcGVjdGl2ZWx5LlxyXG4gICAgICovXHJcbiAgICBfZ2V0Tm9kZVNpemUoKSB7XHJcbiAgICAgICAgdGhyb3cgJ1RoZSBmdW5jdGlvbiBfZ2V0Tm9kZVNpemUgbXVzdCBiZSBpbXBsZW1lbnRlZCc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb2N1c2VzIGFuZCBleHBhbmRzIGFsbCB0aGUgd2F5IHRocm91Z2ggdG8gYSBub2RlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geyp9IGlkT3JOb2RlRGF0YUl0ZW0gVGhlIGlkIG9mIHRoZSBub2RlIHRvIGZvY3VzLCBvciB0aGUgbm9kZSBkYXRhIGl0ZW0gb2JqZWN0LlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBmb2N1c1RvTm9kZShpZE9yTm9kZURhdGFJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVTZWxlY3Rpb24odGhpcy5nZXRSb290KCkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHZhciBub2RlRGF0YUl0ZW0gPSBpZE9yTm9kZURhdGFJdGVtO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygbm9kZURhdGFJdGVtICE9PSAnb2JqZWN0JyAmJiBub2RlRGF0YUl0ZW0gIT09IG51bGwpXHJcbiAgICAgICAgICAgIG5vZGVEYXRhSXRlbSA9IHRoaXMuZ2V0Tm9kZShub2RlRGF0YUl0ZW0pO1xyXG4gICAgICAgIHZhciBwYXJlbnROb2RlID0gbnVsbDtcclxuICAgICAgICBcclxuICAgICAgICAvLyBFeHBhbmQgZXZlcnkgcGFyZW50L2FuY2VzdG9yIG5vZGVcclxuICAgICAgICBwYXJlbnROb2RlID0gbm9kZURhdGFJdGVtLnBhcmVudDtcclxuICAgICAgICB3aGlsZShwYXJlbnROb2RlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUuX2NoaWxkcmVuKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5leHBhbmQocGFyZW50Tm9kZSk7XHJcbiAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdldEFsbG93Rm9jdXMoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIEhpZGUgdGhlIHBhcmVudC9hbmNlc3RvciBub2RlIHNpYmxpbmdzXHJcbiAgICAgICAgICAgIHBhcmVudE5vZGUgPSBub2RlRGF0YUl0ZW0ucGFyZW50O1xyXG4gICAgICAgICAgICB3aGlsZShwYXJlbnROb2RlKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVTaWJsaW5ncyhwYXJlbnROb2RlKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlV2l0aEZvY3VzT25Ob2RlKG5vZGVEYXRhSXRlbSk7XHJcbiAgICAgICAgICAgIG5vZGVEYXRhSXRlbS5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLmdldFJvb3QoKSk7XHJcbiAgICAgICAgdGhpcy5jZW50ZXJOb2RlKG5vZGVEYXRhSXRlbSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGJvb2xlYW4gd2hldGhlciB0aGVcclxuICAgICAqIHRyZWUgaXMgdXNpbmcgZmxhdCBkYXRhIG9yIG5vdC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHRyZWUgaXMgdXNpbmcgZmxhdCBkYXRhIG9yIG5vdC5cclxuICAgICAqL1xyXG4gICAgZ2V0SXNGbGF0RGF0YSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNGbGF0RGF0YTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBpcyBmbGF0IGRhdGEgZmxhZy5cclxuICAgICAqIElmIHNldCB0byB0cnVlLCB5b3UgbXVzdCBzcGVjaWZ5XHJcbiAgICAgKiB0aGUgYGdldFBhcmVudElkYCBvcHRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmV3SXNGbGF0RGF0YSBXaGV0aGVyIHRoZSB0cmVlIGlzIHVzaW5nIGZsYXQgZGF0YSBvciBub3QuXHJcbiAgICAgKi9cclxuICAgIHNldElzRmxhdERhdGEobmV3SXNGbGF0RGF0YSkge1xyXG4gICAgICAgIHRoaXMuX2lzRmxhdERhdGEgPSBuZXdJc0ZsYXREYXRhO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnZW5lcmF0ZXMgdGhlIG5vZGUgZGF0YS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICByZWdlbmVyYXRlTm9kZURhdGEoKSB7XHJcbiAgICAgICAgLy8gQXNzaWducyBwYXJlbnQsIGNoaWxkcmVuLCBoZWlnaHQsIGRlcHRoXHJcbiAgICAgICAgaWYgKCF0aGlzLmdldElzRmxhdERhdGEoKSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2dldENoaWxkcmVuKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgXCJJZiB5b3UgYXJlIHByb3ZpZGluZyBoaWVyYXJjaGljYWwgc3RydWN0dXJlZCBkYXRhLCB0aGVuIHlvdSBtdXN0IHNldCB0aGUgZ2V0Q2hpbGRyZW4gYWNjZXNzb3IgcHJvcGVydHkuXCI7XHJcblxyXG4gICAgICAgICAgICAvLyBTcGVjaWZ5IHlvdXIgY2hpbGRyZW4gcHJvcGVydHkgaGVyZSxcclxuICAgICAgICAgICAgLy8gc28gdGhhdCBEMydzIHJlc3VsdGluZyByb290IG9iamVjdFxyXG4gICAgICAgICAgICAvLyBoYXMgYSBtYXBwaW5nIGZyb20gaXRzIFwiY2hpbGRyZW5cIiBwcm9wZXJ0eVxyXG4gICAgICAgICAgICAvLyB0byB5b3VyIHNwZWNpZmllZCBjaGlsZHJlbiBwcm9wZXJ0eVxyXG4gICAgICAgICAgICB0aGlzLl9yb290ID0gZDMuaGllcmFyY2h5KHRoaXMuZ2V0RGF0YSgpLCAoZGF0YSkgPT4gdGhpcy5nZXRDaGlsZHJlbi5jYWxsKHRoaXMsIGRhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fZ2V0UGFyZW50SWQpXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBcIklmIHlvdSBhcmUgcHJvdmlkaW5nIGZsYXQgc3RydWN0dXJlZCBkYXRhLCB0aGVuIHlvdSBtdXN0IHNldCB0aGUgZ2V0UGFyZW50SWQgYWNjZXNzb3IgcHJvcGVydHkuXCI7XHJcblxyXG4gICAgICAgICAgICAvLyBzdHJhdGlmaWVyIGlzIGEgZnVuY3Rpb24gdGhhdCB3b3VsZCBjb252ZXJ0IHRoZSBmbGF0XHJcbiAgICAgICAgICAgIC8vIGRhdGFzZXQgaW50byBoaWVyYXJjaGljYWxseSBzdHJ1Y3R1cmVkIGRhdGFcclxuICAgICAgICAgICAgLy8gdG8gYmUgdXNlZCB3aXRoIEQzIHRyZWVzLlxyXG4gICAgICAgICAgICAvLyBJdCBhY2NlcHRzIHRoZSBkYXRhc2V0IGFzIGl0cyBwYXJhbWV0ZXIsXHJcbiAgICAgICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSBjb252ZXJ0ZWQgZGF0YS5cclxuXHJcbiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgZDMuaGllcmFyY2h5KClcclxuICAgICAgICAgICAgLy8gbWV0aG9kIGFzIGQzLmhpZXJhcmNoeSgpIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgdGhlXHJcbiAgICAgICAgICAgIC8vIGRhdGEgaXMgYWxyZWFkeSBpbiBoZWlyYXJjaGljYWwgc3RydWN0dXJlLCBhbmRcclxuICAgICAgICAgICAgLy8gbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIEQzIGhpZXJhcmNoaWNhbCBub2Rlc1xyXG4gICAgICAgICAgICB2YXIgc3RyYXRpZmllciA9IGQzLnN0cmF0aWZ5KClcclxuICAgICAgICAgICAgICAgIC5pZCgoZGF0YSwgaW5kZXgsIGFycikgPT4gdGhpcy5nZXRJZC5jYWxsKHRoaXMsIGRhdGEpKVxyXG4gICAgICAgICAgICAgICAgLnBhcmVudElkKChkYXRhLCBpbmRleCwgYXJyKSA9PiB0aGlzLmdldFBhcmVudElkLmNhbGwodGhpcywgZGF0YSkpO1xyXG4gICAgICAgICAgICB0aGlzLl9yb290ID0gc3RyYXRpZmllcih0aGlzLmdldERhdGEoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdHJlZSB0aGVtZS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHRoZW1lIHRoZSB0cmVlIGlzIHVzaW5nLlxyXG4gICAgICovXHJcbiAgICBnZXRUaGVtZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdGhlbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0cmVlIHRoZW1lLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGhlbWUgVGhlIHRoZW1lIHRvIHNldCB0aGUgdHJlZSB0by5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VGhlbWUodGhlbWUpIHtcclxuICAgICAgICB0aGlzLl90aGVtZSA9IHRoZW1lO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdHJlZSBvcmllbnRhdGlvbi5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIG9yaWVudGF0aW9uIHRoZSB0cmVlIGlzIHVzaW5nLlxyXG4gICAgICovXHJcbiAgICBnZXRPcmllbnRhdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0cmVlIG9yaWVudGF0aW9uLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3JpZW50YXRpb24gVGhlIG9yaWVudGF0aW9uIHRvIHNldCB0aGUgdHJlZSB0by5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0T3JpZW50YXRpb24ob3JpZW50YXRpb24pIHtcclxuICAgICAgICB0aGlzLl9vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgZGF0YSBpdGVtcyB1c2VkIHRvIHJlbmRlclxyXG4gICAgICogdGhlIG5vZGVzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0W119IFRoZSBhcnJheSBvZiBkYXRhIGl0ZW1zIHRoZSB0cmVlIHVzZXMuXHJcbiAgICAgKi9cclxuICAgIGdldERhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBkYXRhIGl0ZW1zIHRoZSB0cmVlIHNob3VsZFxyXG4gICAgICogdXNlIHRvIHJlbmRlciB0aGUgbm9kZXMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0W119IG5ld0RhdGEgVGhlIG5ldyBzZXQgb2YgZGF0YSBpdGVtcy5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0RGF0YShuZXdEYXRhKSB7XHJcbiAgICAgICAgdGhpcy5fZGF0YSA9IG5ld0RhdGE7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBub2RlIGRlcHRoIG11bHRpcGxpZXIgdGhhdFxyXG4gICAgICogYWZmZWN0cyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGVcclxuICAgICAqIHBhcmVudCBub2RlIGFuZCB0aGUgY2hpbGQgbm9kZS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIG5vZGUgZGVwdGggbXVsdGlwbGllciB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBnZXROb2RlRGVwdGhNdWx0aXBsaWVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ub2RlRGVwdGhNdWx0aXBsaWVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbm9kZSBkZXB0aCBtdWx0aXBsaWVyIHZhbHVlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbmV3Tm9kZURlcHRoTXVsdGlwbGllciBUaGUgdmFsdWUgdGhhdCBhZmZlY3RzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwYXJlbnQgbm9kZSBhbmQgdGhlIGNoaWxkIG5vZGUuXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgdHJlZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldE5vZGVEZXB0aE11bHRpcGxpZXIobmV3Tm9kZURlcHRoTXVsdGlwbGllcikge1xyXG4gICAgICAgIHRoaXMuX25vZGVEZXB0aE11bHRpcGxpZXIgPSBuZXdOb2RlRGVwdGhNdWx0aXBsaWVyO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgZHVyYXRpb24gb2YgYW5pbWF0aW9uc1xyXG4gICAgICogZm9yIHRoZSB0cmVlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgYW5pbWF0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAqL1xyXG4gICAgZ2V0RHVyYXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2R1cmF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgZHVyYXRpb24gb2YgYW5pbWF0aW9uc1xyXG4gICAgICogZm9yIHRoZSB0cmVlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geyp9IG5ld0R1cmF0aW9uIFRoZSBhbmltYXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXREdXJhdGlvbihuZXdEdXJhdGlvbikge1xyXG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gbmV3RHVyYXRpb247XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBib29sZWFuIHZhbHVlIGluZGljYXRpbmdcclxuICAgICAqIHdoZXRoZXIgdGhlIGRyYWctdG8tcGFuIHBhbiBmZWF0dXJlXHJcbiAgICAgKiBpcyBlbmFibGVkIG9yIG5vdC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgcGFubmluZyBpcyBlbmFibGVkIG9yIG5vdC5cclxuICAgICAqL1xyXG4gICAgZ2V0QWxsb3dQYW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbG93UGFuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nXHJcbiAgICAgKiB3aGV0aGVyIHRoZSBkcmFnLXRvLXBhbiBwYW4gZmVhdHVyZVxyXG4gICAgICogaXMgZW5hYmxlZCBvciBub3QuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Kn0gbmV3QWxsb3dQYW4gV2hldGhlciBwYW5uaW5nIGlzIGVuYWJsZWQgb3Igbm90LlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRBbGxvd1BhbihuZXdBbGxvd1Bhbikge1xyXG4gICAgICAgIHRoaXMuX2FsbG93UGFuID0gbmV3QWxsb3dQYW47XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBib29sZWFuIHZhbHVlIGluZGljYXRpbmdcclxuICAgICAqIHdoZXRoZXIgdGhlIG1vdXNlIHdoZWVsIHRvIHpvb20gaW4vb3V0XHJcbiAgICAgKiBmZWF0dXJlIGlzIGVuYWJsZWQgb3Igbm90LlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB6b29taW5nIGlzIGVuYWJsZWQgb3Igbm90LlxyXG4gICAgICovXHJcbiAgICBnZXRBbGxvd1pvb20oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbG93Wm9vbTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZ1xyXG4gICAgICogd2hldGhlciB0aGUgbW91c2Ugd2hlZWwgdG8gem9vbSBpbi9vdXRcclxuICAgICAqIGZlYXR1cmUgaXMgZW5hYmxlZCBvciBub3QuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmV3QWxsb3dab29tIFdoZXRoZXIgem9vbWluZyBpcyBlbmFibGVkIG9yIG5vdC5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0QWxsb3dab29tKG5ld0FsbG93Wm9vbSkge1xyXG4gICAgICAgIHRoaXMuX2FsbG93Wm9vbSA9IG5ld0FsbG93Wm9vbTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZ1xyXG4gICAgICogd2hldGhlciB0byBmb2N1cyB0byB0aGUgY2xpY2tlZCBub2RlXHJcbiAgICAgKiBvciBub3QuIEZvY3VzaW5nIG9uIGEgbm9kZSB3b3VsZCBoaWRlXHJcbiAgICAgKiBhbGwgaXJyZWxldmFudCBub2RlcyB0aGF0J3Mgbm90IGEgXHJcbiAgICAgKiBwYXJlbnQsIHNpYmxpbmcgb3IgYW5jZXN0b3Igb2YgdGhlXHJcbiAgICAgKiBjbGlja2VkIG5vZGUuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRvIGZvY3VzIHRvIHRoZSBjbGlja2VkIG5vZGUuXHJcbiAgICAgKi9cclxuICAgIGdldEFsbG93Rm9jdXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbG93Rm9jdXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBib29sZWFuIHZhbHVlIGluZGljYXRpbmdcclxuICAgICAqIHdoZXRoZXIgdG8gZm9jdXMgdG8gdGhlIGNsaWNrZWQgbm9kZVxyXG4gICAgICogb3Igbm90LiBGb2N1c2luZyBvbiBhIG5vZGUgd291bGQgaGlkZVxyXG4gICAgICogYWxsIGlycmVsZXZhbnQgbm9kZXMgdGhhdCdzIG5vdCBhIFxyXG4gICAgICogcGFyZW50LCBzaWJsaW5nIG9yIGFuY2VzdG9yIG9mIHRoZVxyXG4gICAgICogY2xpY2tlZCBub2RlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5ld0FsbG93Rm9jdXMgV2hldGhlciB0byBwYW4gdG8gdGhlIGNsaWNrZWQgbm9kZS5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0QWxsb3dGb2N1cyhuZXdBbGxvd0ZvY3VzKSB7XHJcbiAgICAgICAgdGhpcy5fYWxsb3dGb2N1cyA9IG5ld0FsbG93Rm9jdXM7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBib29sZWFuIHZhbHVlIGluZGljYXRpbmdcclxuICAgICAqIHdoZXRoZXIgdG8gcGFuIHRvIGEgY2xpY2tlZCBub2RlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0byBwYW4gdG8gdGhlIGNsaWNrZWQgbm9kZS5cclxuICAgICAqL1xyXG4gICAgZ2V0QWxsb3dOb2RlQ2VudGVyaW5nKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hbGxvd05vZGVDZW50ZXJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRvIHBhbiB0byBhIGNsaWNrZWQgbm9kZS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBuZXdBbGxvd05vZGVDZW50ZXJpbmcgV2hldGhlciB0byBwYW4gdG8gdGhlIGNsaWNrZWQgbm9kZS5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0QWxsb3dOb2RlQ2VudGVyaW5nKG5ld0FsbG93Tm9kZUNlbnRlcmluZykge1xyXG4gICAgICAgIHRoaXMuX2FsbG93Tm9kZUNlbnRlcmluZyA9IG5ld0FsbG93Tm9kZUNlbnRlcmluZztcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG1pbmltdW0gem9vbSBzY2FsaW5nLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbWluaW11bSB6b29tIHNjYWxlIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBnZXRNaW5TY2FsZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWluU2NhbGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBtaW5pbXVtIHpvb20gc2NhbGluZy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHsqfSBuZXdNaW5TY2FsZSBUaGUgbWluaW11bSB6b29tIHNjYWxlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRNaW5TY2FsZShuZXdNaW5TY2FsZSkge1xyXG4gICAgICAgIHRoaXMuX21pblNjYWxlID0gbmV3TWluU2NhbGU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHpvb20gc2NhbGluZy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gTWF4aW11bSB6b29tIHNjYWxlIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBnZXRNYXhTY2FsZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWF4U2NhbGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHpvb20gc2NhbGluZy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHsqfSBuZXdNYXhTY2FsZSBUaGUgbWF4aW11bSB6b29tIHNjYWxlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRNYXhTY2FsZShuZXdNYXhTY2FsZSkge1xyXG4gICAgICAgIHRoaXMuX21heFNjYWxlID0gbmV3TWF4U2NhbGU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBsb2FkIG9uIGRlbWFuZCBzZXR0aW5ncyBvYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtMb2FkT25EZW1hbmRTZXR0aW5nc30gVGhlIGxvYWQgb24gZGVtYW5kIHNldHRpbmdzLlxyXG4gICAgICovXHJcbiAgICBnZXRMb2FkT25EZW1hbmRTZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkT25EZW1hbmRTZXR0aW5ncztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG5vZGUgc2V0dGluZ3Mgb2JqZWN0LlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZVNldHRpbmdzfSBUaGUgbm9kZSBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgZ2V0Tm9kZVNldHRpbmdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVTZXR0aW5ncztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGNvbnRhaW5lciBET00gZWxlbWVudC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIGNvbnRhaW5lciBET00gZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgZ2V0RWxlbWVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbnRhaW5lciBET00gZWxlbWVudFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbmV3RWxlbWVudCBUaGUgY29udGFpbmVyIERPTSBlbGVtZW50LlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gbmV3RWxlbWVudDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHJvb3Qgbm9kZSBvYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm4ge29iamVjdH0gVGhlIHJvb3QgRDMgdHJlZSBub2RlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0Um9vdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIEQzIHNlbGVjdGlvbiBvYmplY3QgZm9yIHRoZSBTVkcgZWxlbWVudC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybiB7b2JqZWN0fSBSZXR1cm5zIHRoZSBEMyBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRTdmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N2ZztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIEQzIHNlbGVjdGlvbiBvYmplY3QgZm9yIHRoZSB2aWV3IGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IEQzIHNlbGVjdGlvbiBvYmplY3QgZm9yIHRoZSB2aWV3IGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIGdldFZpZXcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBEMyBzZWxlY3Rpb24gb2JqZWN0IGZvciB0aGVcclxuICAgICAqIHBhbm5pbmcgY29udGFpbmVyIGVsZW1lbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IEQzIHNlbGVjdGlvbiBvYmplY3QgZm9yIHRoZSBwYW5uaW5nIGNvbnRhaW5lciBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBnZXRQYW5uaW5nQ29udGFpbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wYW5uaW5nQ29udGFpbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgRDMgZ2VuZXJhdG9yIG9iamVjdCB1c2VkIHRvXHJcbiAgICAgKiBnZW5lcmF0ZSB0aGUgdHJlZSBub2RlcyBjb29yZGluYXRlcy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Z1bmN0aW9ufSBEMyB0cmVlIGdlbmVyYXRvciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldFRyZWVHZW5lcmF0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyZWVHZW5lcmF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYSBzaW5nbGUgbm9kZSBnaXZlbiBhbiBpZCBvciBhIGRhdGEgaXRlbS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHsqfG9iamVjdH0gaWRPckRhdGFJdGVtIFRoZSBJRCBvciBkYXRhIGl0ZW0gdG8gcmV0cmlldmUgdGhlIEQzIHRyZWUgbm9kZSBkYXRhIGl0ZW0gd2l0aC5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IEQzIHRyZWUgbm9kZSBkYXRhIGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIGdldE5vZGUoaWRPckRhdGFJdGVtKSB7XHJcbiAgICAgICAgdmFyIGlkID0gaWRPckRhdGFJdGVtO1xyXG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnICYmIGlkICE9PSBudWxsKVxyXG4gICAgICAgICAgICBpZCA9IHRoaXMuZ2V0SWQoaWQpOyAgICAgICAgXHJcbiAgICAgICAgdmFyIHJvb3ROb2RlID0gdGhpcy5nZXRSb290KCk7XHJcblxyXG4gICAgICAgIHZhciBnZXROb2RlQ2hpbGRyZW4gPSAobm9kZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAobm9kZS5fY2hpbGRyZW4pXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5fY2hpbGRyZW47XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG5vZGUgPSByZWN1cnNpdmVGaW5kKHJvb3ROb2RlLCBnZXROb2RlQ2hpbGRyZW4sIHggPT4gdGhpcy5nZXRJZCh4LmRhdGEpID09IGlkKTtcclxuICAgICAgICByZXR1cm4gbm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBhIHNpbmdsZSBkYXRhIGl0ZW0gZ2l2ZW4gYW4gaWQuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Kn0gaWQgVGhlIElEIHRvIHJldHJpZXZlIHRoZSBkYXRhIGl0ZW0gd2l0aC5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBkYXRhIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gSUQuXHJcbiAgICAgKi9cclxuICAgIGdldERhdGFJdGVtKGlkKSB7XHJcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmdldE5vZGUoaWQpO1xyXG4gICAgICAgIHJldHVybiBub2RlLmRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGFycmF5IG9mIEQzIG5vZGUgZGF0YSBpdGVtc1xyXG4gICAgICogdGhlIEQzIHRyZWUgaGFzIGdlbmVyYXRlZC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge29iamVjdFtdfSBBcnJheSBvZiBEMyBub2RlIGRhdGEgaXRlbXMuXHJcbiAgICAgKi9cclxuICAgIGdldE5vZGVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ub2RlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgYXJyYXkgb2YgdmlzaWJsZSBEMyBub2RlXHJcbiAgICAgKiBkYXRhIGl0ZW1zIHRoZSBEMyB0cmVlIGhhcyBnZW5lcmF0ZWQuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtvYmplY3RbXX0gQXJyYXkgb2YgRDMgbm9kZSBkYXRhIGl0ZW1zLlxyXG4gICAgICovXHJcbiAgICBnZXRWaXNpYmxlTm9kZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2libGVOb2RlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgYXJyYXkgb2YgRDMgbGluayBkYXRhIGl0ZW1zXHJcbiAgICAgKiB0aGUgRDMgdHJlZSBoYXMgZ2VuZXJhdGVkLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0W119IEFycmF5IG9mIEQzIGxpbmsgZGF0YSBpdGVtcy5cclxuICAgICAqL1xyXG4gICAgZ2V0TGlua3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmtzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgRDMgem9vbSBsaXN0ZW5lciB1c2VkIGZvclxyXG4gICAgICogdGhlIHBhbm5pbmcsIHpvb21pbmcgYW5kIGZvY3VzIGZlYXR1cmVzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb259IFRoZSBEMyB6b29tIGxpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIGdldFpvb21MaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fem9vbUxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgSUQgZm9yIGEgZ2l2ZW4gZGF0YSBpdGVtLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YUl0ZW0gVGhlIGRhdGEgaXRlbSB0byBnZXQgdGhlIElEIGZyb20uXHJcbiAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIElEIGZvciB0aGUgZ2l2ZW4gZGF0YSBpdGVtLlxyXG4gICAgICovXHJcbiAgICBnZXRJZChkYXRhSXRlbSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRJZChkYXRhSXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBjaGlsZHJlbiBkYXRhIGl0ZW1zIGZvciBhIGdpdmVuIGRhdGEgaXRlbS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRhdGFJdGVtIFRoZSBkYXRhIGl0ZW0gdG8gZ2V0IHRoZSBjaGlsZHJlbiBkYXRhIGl0ZW1zIGZyb20uXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0W119IFRoZSBhcnJheSBvZiBjaGlsZCBkYXRhIGl0ZW1zLlxyXG4gICAgICovXHJcbiAgICBnZXRDaGlsZHJlbihkYXRhSXRlbSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRDaGlsZHJlbihkYXRhSXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwYXJlbnQgSUQgZm9yIGEgZ2l2ZW4gZGF0YSBpdGVtLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YUl0ZW0gVGhlIGRhdGEgaXRlbSB0byBnZXQgdGhlIHBhcmVudCBJRCBmcm9tLlxyXG4gICAgICogQHJldHVybnMgeyp9IFRoZSBwYXJlbnQgSUQgZm9yIHRoZSBnaXZlbiBkYXRhIGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIGdldFBhcmVudElkKGRhdGFJdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFBhcmVudElkKGRhdGFJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIElEIGFjY2Vzc29yIGNhbGxiYWNrIGZ1bmN0aW9uLFxyXG4gICAgICogZGVmaW5pbmcgaG93IHRvIGdldCBhIHVuaXF1ZSBJRCBmcm9tIGFcclxuICAgICAqIGdpdmVuIGRhdGEgaXRlbS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtnZXRJZENhbGxCYWNrfSBuZXdJZEFjY2Vzc29yIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGdldCB0aGUgSUQgZm9yIGEgZ2l2ZW4gZGF0YSBpdGVtLlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRJZEFjY2Vzc29yKG5ld0lkQWNjZXNzb3IpIHtcclxuICAgICAgICB0aGlzLl9nZXRJZCA9IG5ld0lkQWNjZXNzb3I7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjaGlsZHJlbiBhY2Nlc3NvciBjYWxsYmFjayBmdW5jdGlvbixcclxuICAgICAqIGRlZmluaW5nIGhvdyB0byBnZXQgdGhlIGNoaWxkcmVuIGRhdGEgaXRlbXNcclxuICAgICAqIGZyb20gYSBnaXZlbiBkYXRhIGl0ZW0uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Z2V0Q2hpbGRyZW5DYWxsQmFja30gbmV3Q2hpbGRyZW5BY2Nlc3NvciBDYWxsYmFjayBmdW5jdGlvbiB0byBnZXQgdGhlIGNoaWxkcmVuIGZvciBhIGdpdmVuIGRhdGEgaXRlbS5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Q2hpbGRyZW5BY2Nlc3NvcihuZXdDaGlsZHJlbkFjY2Vzc29yKSB7XHJcbiAgICAgICAgdGhpcy5fZ2V0Q2hpbGRyZW4gPSBuZXdDaGlsZHJlbkFjY2Vzc29yO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcGFyZW50IElEIGFjY2Vzc29yIGNhbGxiYWNrIGZ1bmN0aW9uLFxyXG4gICAgICogZGVmaW5pbmcgaG93IHRvIGdldCB0aGUgcGFyZW50IElEIGZyb20gYVxyXG4gICAgICogZ2l2ZW4gZGF0YSBpdGVtLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2dldFBhcmVudElkQ2FsbEJhY2t9IG5ld1BhcmVudElkQWNjZXNzb3IgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBwYXJlbnQgaWQgZm9yIGEgZ2l2ZW4gZGF0YSBpdGVtLlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRQYXJlbnRJZEFjY2Vzc29yKG5ld1BhcmVudElkQWNjZXNzb3IpIHtcclxuICAgICAgICB0aGlzLl9nZXRQYXJlbnRJZCA9IG5ld1BhcmVudElkQWNjZXNzb3I7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB3aWR0aCBvZiBTVkcsIGluY2x1ZGluZyB0aGUgbWFyZ2lucy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHdpZHRoIG9mIHRoZSBTVkcuXHJcbiAgICAgKi9cclxuICAgIGdldFdpZHRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFdpZHRoV2l0aG91dE1hcmdpbnMoKSAtIHRoaXMuZ2V0TWFyZ2lucygpLmxlZnQgLSB0aGlzLmdldE1hcmdpbnMoKS5yaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGhlaWdodCBvZiBTVkcsIGluY2x1ZGluZyB0aGUgbWFyZ2lucy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIGhlaWdodCBvZiB0aGUgU1ZHLlxyXG4gICAgICovXHJcbiAgICBnZXRIZWlnaHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGVpZ2h0V2l0aG91dE1hcmdpbnMoKSAtIHRoaXMuZ2V0TWFyZ2lucygpLnRvcCAtIHRoaXMuZ2V0TWFyZ2lucygpLmJvdHRvbTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG1hcmdpbnMgZm9yIHRoZSB0cmVlIGRpYWdyYW0uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBuZXdNYXJnaW5zIFRoZSBtYXJnaW4gb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5ld01hcmdpbnMudG9wIFRoZSBtYXJnaW4gdG9wIGZvciB0aGUgdHJlZSBkaWFncmFtLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5ld01hcmdpbnMucmlnaHQgVGhlIG1hcmdpbiByaWdodCBmb3IgdGhlIHRyZWUgZGlhZ3JhbS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdNYXJnaW5zLmJvdHRvbSBUaGUgbWFyZ2luIGJvdHRvbSBmb3IgdGhlIHRyZWUgZGlhZ3JhbS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdNYXJnaW5zLmxlZnQgVGhlIG1hcmdpbiBsZWZ0IGZvciB0aGUgdHJlZSBkaWFncmFtLlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRNYXJnaW5zKG5ld01hcmdpbnMpIHtcclxuICAgICAgICB0aGlzLl9tYXJnaW5zID0gbmV3TWFyZ2lucztcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG1hcmdpbnMgZm9yIHRoZSB0cmVlIGRpYWdyYW0uXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBtYXJnaW5zIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0TWFyZ2lucygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWFyZ2lucztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBTVkcgZm9yIHRoZSB0cmVlIGRpYWdyYW0uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Kn0gbmV3V2lkdGhXaXRob3V0TWFyZ2luIFRoZSB3aWR0aCBvZiBTVkcgZm9yIHRoZSB0cmVlIGRpYWdyYW0uXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgdHJlZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFdpZHRoV2l0aG91dE1hcmdpbnMobmV3V2lkdGhXaXRob3V0TWFyZ2luKSB7XHJcbiAgICAgICAgdGhpcy5fd2lkdGhXaXRob3V0TWFyZ2luID0gbmV3V2lkdGhXaXRob3V0TWFyZ2luO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgd2lkdGggb2YgdGhlIFNWRyBmb3IgdGhlIHRyZWUgZGlhZ3JhbS5cclxuICAgICAqIERvZXMgbm90IGluY2x1ZGUgdGhlIG1hcmdpbnMuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB3aWR0aCAobm90IGluY2x1ZGluZyB0aGUgbWFyZ2lucykgb2YgdGhlIFNWRyBmb3IgdGhlIHRyZWUgZGlhZ3JhbS5cclxuICAgICAqL1xyXG4gICAgZ2V0V2lkdGhXaXRob3V0TWFyZ2lucygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGhXaXRob3V0TWFyZ2luO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBTVkcgZm9yIHRoZSB0cmVlIGRpYWdyYW0uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Kn0gbmV3SGVpZ2h0V2l0aG91dE1hcmdpbiBUaGUgaGVpZ2h0IG9mIFNWRyBmb3IgdGhlIHRyZWUgZGlhZ3JhbS5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0SGVpZ2h0V2l0aG91dE1hcmdpbnMobmV3SGVpZ2h0V2l0aG91dE1hcmdpbikge1xyXG4gICAgICAgIHRoaXMuX2hlaWdodFdpdGhvdXRNYXJnaW4gPSBuZXdIZWlnaHRXaXRob3V0TWFyZ2luO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBTVkcgZm9yIHRoZSB0cmVlIGRpYWdyYW0uXHJcbiAgICAgKiBEb2VzIG5vdCBpbmNsdWRlIHRoZSBtYXJnaW5zLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgaGVpZ2h0IChub3QgaW5jbHVkaW5nIHRoZSBtYXJnaW5zKSBvZiB0aGUgU1ZHIGZvciB0aGUgdHJlZSBkaWFncmFtLlxyXG4gICAgICovXHJcbiAgICBnZXRIZWlnaHRXaXRob3V0TWFyZ2lucygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0V2l0aG91dE1hcmdpbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIFNWRy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVEaW1lbnNpb25zKCkge1xyXG4gICAgICAgIC8vIFVwZGF0ZSBTVkcgd2l0aCBuZXcgd2lkdGggYW5kIGhlaWdodFxyXG4gICAgICAgIHRoaXMuZ2V0U3ZnKClcclxuICAgICAgICAgICAgLy8gVXNlIHZpZXdCb3ggdG8gc2V0IFNWRyB3aWR0aCBhbmQgaGVpZ2h0XHJcbiAgICAgICAgICAgIC8vIHNvIGl0IGlzIHJlc3BvbnNpdmUsIGFuZCBjYW4gYmUgcmVzaXplZFxyXG4gICAgICAgICAgICAvLyBiYXNlZCBvbiB0aGUgcGFyZW50IGVsZW1lbnRcclxuICAgICAgICAgICAgLmF0dHIoXCJ2aWV3Qm94XCIsIFwiMCAwIFwiICsgdGhpcy5nZXRXaWR0aFdpdGhvdXRNYXJnaW5zKCkgKyBcIiBcIiArIHRoaXMuZ2V0SGVpZ2h0V2l0aG91dE1hcmdpbnMoKSk7XHJcblxyXG4gICAgICAgIHZhciBtYXJnaW5zID0gdGhpcy5nZXRNYXJnaW5zKCk7XHJcblxyXG4gICAgICAgIHZhciBuZWVkVG9DZW50ZXJWaWV3ID0gZmFsc2U7XHJcbiAgICAgICAgLy8gdXBkYXRlIHRoZSB0cmVlIGdlbmVyYXRvciB3aXRoIHRoZSBuZXcgd2lkdGggYW5kIGhlaWdodFxyXG4gICAgICAgIHZhciBzaXppbmdNb2RlID0gdGhpcy5ub2RlU2V0dGluZ3MuZ2V0U2l6aW5nTW9kZSgpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygc2l6aW5nTW9kZSA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgICAgIHNpemluZ01vZGUgPSBzaXppbmdNb2RlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChzaXppbmdNb2RlID09PSBcIm5vZGVzaXplXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRUcmVlR2VuZXJhdG9yKClcclxuICAgICAgICAgICAgICAgIC5ub2RlU2l6ZSh0aGlzLl9nZXROb2RlU2l6ZSgpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIE9ubHkgcGVyZm9ybSBjZW50ZXJpbmcgaWYgbm9kZSBjZW50ZXJpbmcgaXMgdHVybmVkIG9mZixcclxuICAgICAgICAgICAgLy8gYXMgdGhhdCB3b3VsZCBjZW50ZXIgdG8gdGhlIHJvb3Qgbm9kZSBhbnl3YXkuIE5vZGVcclxuICAgICAgICAgICAgLy8gY2VudGVyaW5nIGlzIHR1cm5lZCBvbiB3aGVuIGFsbG93IGZvY3VzIGlzIHR1cm5lZCBvbi5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0QWxsb3dGb2N1cygpID09PSBmYWxzZSlcclxuICAgICAgICAgICAgICAgIG5lZWRUb0NlbnRlclZpZXcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRUcmVlR2VuZXJhdG9yKClcclxuICAgICAgICAgICAgICAgIC5zaXplKFt0aGlzLmdldEhlaWdodCgpLCB0aGlzLmdldFdpZHRoKCldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChuZWVkVG9DZW50ZXJWaWV3ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHZpZXcgd2l0aCB0aGUgbmV3IG1hcmdpbnNcclxuICAgICAgICAgICAgdGhpcy5nZXRWaWV3KClcclxuICAgICAgICAgICAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKFwiICsgbWFyZ2lucy5sZWZ0ICsgXCIsXCIgKyBtYXJnaW5zLnRvcCArIFwiKVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIHZpZXcgZG93bndhcmRzIGFzIHRvIGNlbnRlciB0aGUgcm9vdCBub2RlXHJcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZHVlIHRvIHdoZW4geW91IHVzZSBub2RlLXNpemUsIGl0IHNldHMgdGhlXHJcbiAgICAgICAgICAgIC8vIG5vZGUgb3JpZ2luIGF0IDAsIDAgaW5zdGVhZCBvZiBhdXRvbWF0aWNhbGx5XHJcbiAgICAgICAgICAgIC8vIGNlbnRlcmluZyBpdCBhcyBpdCBkb2VzIHdpdGggc2l6ZSgpXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VmlldygpXHJcbiAgICAgICAgICAgICAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZShcIiArIG1hcmdpbnMubGVmdCArIFwiLCBcIiArICh0aGlzLmdldEhlaWdodCgpIC8gMiArIG1hcmdpbnMudG9wKSArIFwiKVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHdlIG5lZWQgdG8gY2VudGVyIHRoZSB0cmVlIGJ5IGFkanVzdGluZyB0aGUgdmlldyBhbmQgdGhlIG5vZGUgcG9zaXRpb25cclxuICAgICAgICB2YXIgeDAsIHkwO1xyXG4gICAgICAgIGlmICh0aGlzLmdldE9yaWVudGF0aW9uKCkgPT09ICd0b3BUb0JvdHRvbScpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAobmVlZFRvQ2VudGVyVmlldyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHgwID0gdGhpcy5nZXRXaWR0aCgpIC8gMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHgwID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB5MCA9IHRoaXMuZ2V0SGVpZ2h0KCkgLyA0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAobmVlZFRvQ2VudGVyVmlldyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHgwID0gdGhpcy5nZXRIZWlnaHQoKSAvIDI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB4MCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgeTAgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5nZXRSb290KCkueDAgPSB4MDtcclxuICAgICAgICB0aGlzLmdldFJvb3QoKS55MCA9IHkwO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5nZXRab29tTGlzdGVuZXIoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldFpvb21MaXN0ZW5lcigpXHJcbiAgICAgICAgICAgICAgICAuZXh0ZW50KFtbMCwgMF0sIFt0aGlzLmdldFdpZHRoV2l0aG91dE1hcmdpbnMoKSwgdGhpcy5nZXRIZWlnaHRXaXRob3V0TWFyZ2lucygpXV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXRlcyB0aGUgc2V0dGluZ3MgdG8gZW5zdXJlIHRoZVxyXG4gICAgICogdHJlZSBkaWFncmFtIGlzIHJlYWR5IHRvIGJlIGdlbmVyYXRlZC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB2YWxpZGF0ZVNldHRpbmdzKCkge1xyXG4gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSBjb21wdWxzb3J5IG9wdGlvbnMgYXJlIHByb3ZpZGVkXHJcbiAgICAgICAgaWYgKCF0aGlzLmdldEVsZW1lbnQoKSlcclxuICAgICAgICAgICAgdGhyb3cgXCJOZWVkIHRvIHBhc3MgaW4gYW4gZWxlbWVudCBhcyBwYXJ0IG9mIHRoZSBvcHRpb25zXCI7XHJcbiAgICAgICAgaWYgKCF0aGlzLmdldERhdGEoKSlcclxuICAgICAgICAgICAgdGhyb3cgXCJOZWVkIHRvIHBhc3MgaW4gZGF0YSBhcyBwYXJ0IG9mIHRoZSBvcHRpb25zXCI7XHJcblxyXG4gICAgICAgIC8vIENoZWNrcyBpZiBtYW5kYXRvcnkgbWV0aG9kcyB0byBzcGVjaWZ5IGV4aXN0c1xyXG4gICAgICAgIGlmICghdGhpcy5fZ2V0SWQpXHJcbiAgICAgICAgICAgIHRocm93IFwiTmVlZCB0byBkZWZpbmUgdGhlIGdldElkIGZ1bmN0aW9uIGFzIHBhcnQgb2YgdGhlIG9wdGlvbnNcIjtcclxuICAgICAgICB0aGlzLmxvYWRPbkRlbWFuZFNldHRpbmdzLnZhbGlkYXRlU2V0dGluZ3MoKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW5kIHNldCB1cCB0aGUgdGhlIHRyZWUgZGlhZ3JhbS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBpbml0aWFsaXplKCkge1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGVTZXR0aW5ncygpO1xyXG4gICAgICAgIHRoaXMucmVnZW5lcmF0ZU5vZGVEYXRhKCk7XHJcblxyXG4gICAgICAgIHdoaWxlICh0aGlzLmdldEVsZW1lbnQoKS5maXJzdENoaWxkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0RWxlbWVudCgpLnJlbW92ZUNoaWxkKHRoaXMuZ2V0RWxlbWVudCgpLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgc3ZnLCBhbmQgc2V0IGl0cyBkaW1lbnNpb25zXHJcbiAgICAgICAgdGhpcy5fc3ZnID0gZDMuc2VsZWN0KHRoaXMuZ2V0RWxlbWVudCgpKVxyXG4gICAgICAgICAgICAuYXBwZW5kKFwic3ZnXCIpXHJcbiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnbWl0Y2gtZDMtdHJlZScsIHRydWUpXHJcbiAgICAgICAgICAgICAgICAuY2xhc3NlZCh0aGlzLmdldFRoZW1lKCksIHRydWUpXHJcbiAgICAgICAgICAgICAgICAuYXR0cihcInByZXNlcnZlQXNwZWN0UmF0aW9cIiwgXCJ4TWlkWU1pZCBtZWV0XCIpXHJcbiAgICAgICAgICAgICAgICAuc3R5bGUoXCJ3aWR0aFwiLCBcIjEwMCVcIilcclxuICAgICAgICAgICAgICAgIC5zdHlsZShcImhlaWdodFwiLCBcIjEwMCVcIik7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgdmlldyB3aXRoIG1hcmdpbnNcclxuICAgICAgICB0aGlzLl92aWV3ID0gdGhpcy5nZXRTdmcoKS5hcHBlbmQoXCJnXCIpXHJcbiAgICAgICAgICAgIC5jbGFzc2VkKFwidmlld1wiLCB0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIHRyZWUgZ2VuZXJhdG9yIHRvIHBvc2l0aW9uIHRoZSBub2Rlc1xyXG4gICAgICAgIHRoaXMuX3RyZWVHZW5lcmF0b3IgPSBkMy50cmVlKCk7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgcGFubmluZyBjb250YWluZXIgd2hpY2ggcGFubmluZyBzaG91bGQgYWN0IHVwb25cclxuICAgICAgICB0aGlzLl9wYW5uaW5nQ29udGFpbmVyID0gdGhpcy5nZXRWaWV3KCkuYXBwZW5kKFwiZ1wiKVxyXG4gICAgICAgICAgICAuY2xhc3NlZChcInBhbm5pbmdDb250YWluZXJcIiwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3pvb21MaXN0ZW5lciA9IGQzLnpvb20oKVxyXG4gICAgICAgICAgICAvLyBMaW1pdCB6b29tIGxldmVsXHJcbiAgICAgICAgICAgIC5zY2FsZUV4dGVudChbdGhpcy5nZXRNaW5TY2FsZSgpLCB0aGlzLmdldE1heFNjYWxlKCldKVxyXG4gICAgICAgICAgICAvLyBab29tIGluIEQzIHRyYW5zbGF0ZXMgdG8gdGhlIG5hdGl2ZSBIVE1ML0pTIGV2ZW50cyBvZjpcclxuICAgICAgICAgICAgLy8gLSBEb3VibGUgQ2xpY2tpbmcgKGkuZS4gdG8gem9vbSBpbilcclxuICAgICAgICAgICAgLy8gLSBEcmFnZ2luZyAoaS5lLiBwYW5uaW5nIG9yIG1vdmluZyBhcm91bmQpXHJcbiAgICAgICAgICAgIC8vIC0gV2hlZWwgKGkuZS4gem9vbSBpbi9vdXQpXHJcbiAgICAgICAgICAgIC5vbihcInpvb21cIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlIFwiem9vbVwiIGV2ZW50IHBvcHVsYXRlcyBkMy5ldmVudCB3aXRoIGFuIG9iamVjdCB0aGF0IGhhc1xyXG4gICAgICAgICAgICAgICAgLy8gYSBcInRyYW5zZm9ybVwiIHByb3BlcnR5IChhbiBvYmplY3Qgd2l0aCB0aHJlZSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgICAgICAvLyBvZiB4LCB5LCBhbmQgayksIHdoZXJlIHggYW5kIHkgaXMgZm9yIHRyYW5zbGF0aW9uIHB1cnBvc2VzLFxyXG4gICAgICAgICAgICAgICAgLy8gYW5kIGsgaXMgdGhlIHNjYWxpbmcgZmFjdG9yXHJcbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNmb3JtID0gZDMuZXZlbnQudHJhbnNmb3JtO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQYW5uaW5nQ29udGFpbmVyKCkuYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmdldFN2ZygpLmNhbGwodGhpcy5nZXRab29tTGlzdGVuZXIoKSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdldEFsbG93UGFuKCkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U3ZnKClcclxuICAgICAgICAgICAgICAgIC5vbihcIm1vdXNlZG93bi56b29tXCIsIG51bGwpXHJcbiAgICAgICAgICAgICAgICAub24oXCJ0b3VjaHN0YXJ0Lnpvb21cIiwgbnVsbClcclxuICAgICAgICAgICAgICAgIC5vbihcInRvdWNobW92ZS56b29tXCIsIG51bGwpXHJcbiAgICAgICAgICAgICAgICAub24oXCJ0b3VjaGVuZC56b29tXCIsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5nZXRBbGxvd1pvb20oKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRTdmcoKVxyXG4gICAgICAgICAgICAgICAgLm9uKFwiZGJsY2xpY2suem9vbVwiLCBudWxsKVxyXG4gICAgICAgICAgICAgICAgLm9uKFwid2hlZWwuem9vbVwiLCBudWxsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlRGltZW5zaW9ucygpO1xyXG5cclxuICAgICAgICB0aGlzLl9wb3B1bGF0ZVVuZGVybHlpbmdDaGlsZHJlbih0aGlzLmdldFJvb3QoKSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdldFJvb3QoKS5jaGlsZHJlbilcclxuICAgICAgICAgICAgdGhpcy5nZXRSb290KCkuY2hpbGRyZW4uZm9yRWFjaCh0aGlzLmNvbGxhcHNlUmVjdXJzaXZlbHkpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0aW9uKHRoaXMuZ2V0Um9vdCgpKTtcclxuXHJcbiAgICAgICAgLy8gQ2FsbCB0aGUgZmlyc3QgdXBkYXRlLCB3aGljaCByZW5kZXJzXHJcbiAgICAgICAgLy8gdGhlIGluaXRpYWwgdHJlZVxyXG4gICAgICAgIHRoaXMudXBkYXRlKHRoaXMuZ2V0Um9vdCgpKTtcclxuXHJcbiAgICAgICAgLy8gQ2VudGVycyB0aGUgcm9vdCBub2RlXHJcbiAgICAgICAgdGhpcy5jZW50ZXJOb2RlKHRoaXMuZ2V0Um9vdCgpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFeHBhbmRzIHRoZSBnaXZlbiBub2RlIGRhdGEgaXRlbS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG5vZGVEYXRhSXRlbSBUaGUgRDMgbm9kZSBkYXRhIGl0ZW0gdG8gZXhwYW5kLlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBleHBhbmQobm9kZURhdGFJdGVtKSB7XHJcbiAgICAgICAgbm9kZURhdGFJdGVtLmNoaWxkcmVuID0gbm9kZURhdGFJdGVtLl9jaGlsZHJlbjtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV4cGFuZHMgdGhlIGdpdmVuIG5vZGUgZGF0YSBpdGVtLFxyXG4gICAgICogYW5kIGl0cyBjaGlsZHJlbiBhbmQgZGVzY2VuZGFudHMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRGF0YUl0ZW0gVGhlIEQzIG5vZGUgZGF0YSBpdGVtIHRvIGV4cGFuZC5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZXhwYW5kUmVjdXJzaXZlbHkobm9kZURhdGFJdGVtKSB7XHJcbiAgICAgICAgdmFyIHJlYyA9IGZ1bmN0aW9uIHJlY3Vyc2l2ZShkaXJlY3ROb2RlRGF0YUl0ZW0pIHtcclxuICAgICAgICAgICAgaWYgKGRpcmVjdE5vZGVEYXRhSXRlbS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgZGlyZWN0Tm9kZURhdGFJdGVtLmNoaWxkcmVuLmZvckVhY2gocmVjdXJzaXZlKTtcclxuICAgICAgICAgICAgICAgIGRpcmVjdE5vZGVEYXRhSXRlbS5jaGlsZHJlbiA9IGRpcmVjdE5vZGVEYXRhSXRlbS5fY2hpbGRyZW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYyhub2RlRGF0YUl0ZW0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29sbGFwc2VzIHRoZSBnaXZlbiBub2RlIGRhdGEgaXRlbS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG5vZGVEYXRhSXRlbSBUaGUgRDMgbm9kZSBkYXRhIGl0ZW0gdG8gY29sbGFwc2UuXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgdHJlZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGNvbGxhcHNlKG5vZGVEYXRhSXRlbSkge1xyXG4gICAgICAgIG5vZGVEYXRhSXRlbS5jaGlsZHJlbiA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb2xsYXBzZXMgdGhlIGdpdmVuIG5vZGUgZGF0YSBpdGVtLFxyXG4gICAgICogYW5kIGl0cyBjaGlsZHJlbiBhbmQgZGVzY2VuZGFudHMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRGF0YUl0ZW0gVGhlIEQzIG5vZGUgZGF0YSBpdGVtIHRvIGNvbGxhcHNlLlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBjb2xsYXBzZVJlY3Vyc2l2ZWx5KG5vZGVEYXRhSXRlbSkge1xyXG4gICAgICAgIHZhciByZWMgPSBmdW5jdGlvbiByZWN1cnNpdmUoZGlyZWN0Tm9kZURhdGFJdGVtKSB7XHJcbiAgICAgICAgICAgIGlmIChkaXJlY3ROb2RlRGF0YUl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgIGRpcmVjdE5vZGVEYXRhSXRlbS5jaGlsZHJlbi5mb3JFYWNoKHJlY3Vyc2l2ZSk7XHJcbiAgICAgICAgICAgICAgICBkaXJlY3ROb2RlRGF0YUl0ZW0uY2hpbGRyZW4gPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZWMobm9kZURhdGFJdGVtKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBQb3B1bGF0ZXMgdGhlIG5vZGUncyBjaGlsZHJlbiB0byBhIGhpZGRlbiBwcm9wZXJ0eS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG5vZGVEYXRhSXRlbSBUaGUgRDMgbm9kZSBkYXRhIGl0ZW0gdG8gY29sbGFwc2UuXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgdHJlZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIF9wb3B1bGF0ZVVuZGVybHlpbmdDaGlsZHJlbihub2RlRGF0YUl0ZW0pIHtcclxuICAgICAgICB2YXIgcmVjID0gZnVuY3Rpb24gcmVjdXJzaXZlKGRpcmVjdE5vZGVEYXRhSXRlbSkge1xyXG4gICAgICAgICAgICBpZiAoZGlyZWN0Tm9kZURhdGFJdGVtLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICBkaXJlY3ROb2RlRGF0YUl0ZW0uX2NoaWxkcmVuID0gZGlyZWN0Tm9kZURhdGFJdGVtLmNoaWxkcmVuO1xyXG4gICAgICAgICAgICAgICAgZGlyZWN0Tm9kZURhdGFJdGVtLl9jaGlsZHJlbi5mb3JFYWNoKHJlY3Vyc2l2ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYyhub2RlRGF0YUl0ZW0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIG5vZGUgc2VsZWN0aW9ucyBmb3IgYSBnaXZlbiBub2RlIGFuZCBpdCdzIGNoaWxkcmVuLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbm9kZURhdGFJdGVtIFRoZSBEMyBub2RlIGRhdGEgaXRlbSB0byByZW1vdmUgc2VsZWN0aW9uIGZyb20uXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgdHJlZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZVNlbGVjdGlvbihub2RlRGF0YUl0ZW0pIHtcclxuICAgICAgICB2YXIgcmVjID0gZnVuY3Rpb24gcmVjdXJzaXZlKGRpcmVjdE5vZGVEYXRhSXRlbSkge1xyXG4gICAgICAgICAgICBkaXJlY3ROb2RlRGF0YUl0ZW0uc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKGRpcmVjdE5vZGVEYXRhSXRlbS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgZGlyZWN0Tm9kZURhdGFJdGVtLmNoaWxkcmVuLmZvckVhY2gocmVjdXJzaXZlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVjKG5vZGVEYXRhSXRlbSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDZW50ZXIgdGhlIHZpZXcgdG8gYSBEMyB0cmVlIG5vZGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Kn0gbm9kZURhdGFJdGVtIFRoZSBEMyBub2RlIGRhdGEgaXRlbSB0byBmb2N1cyBvbi5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgY2VudGVyTm9kZShub2RlRGF0YUl0ZW0pIHtcclxuICAgICAgICB2YXIgdHJhbnNmb3JtID0gZDMuem9vbVRyYW5zZm9ybSh0aGlzLmdldFN2ZygpLm5vZGUoKSk7XHJcbiAgICAgICAgdmFyIHNjYWxlID0gdHJhbnNmb3JtLms7XHJcblxyXG4gICAgICAgIHZhciB4LCB5LCB0cmFuc2xhdGVYLCB0cmFuc2xhdGVZO1xyXG4gICAgICAgIGlmICh0aGlzLmdldE9yaWVudGF0aW9uKCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RvcHRvYm90dG9tJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHggPSAtbm9kZURhdGFJdGVtLngwO1xyXG4gICAgICAgICAgICB5ID0gLW5vZGVEYXRhSXRlbS55MDtcclxuICAgICAgICAgICAgdHJhbnNsYXRlWCA9IHggKiBzY2FsZSArIHRoaXMuZ2V0V2lkdGgoKSAvIDI7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVkgPSB5ICogc2NhbGUgKyB0aGlzLmdldEhlaWdodCgpIC8gMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgeCA9IC1ub2RlRGF0YUl0ZW0ueTA7XHJcbiAgICAgICAgICAgIHkgPSAtbm9kZURhdGFJdGVtLngwO1xyXG4gICAgICAgICAgICB0cmFuc2xhdGVYID0geCAqIHNjYWxlICsgdGhpcy5nZXRXaWR0aCgpIC8gNDtcclxuICAgICAgICAgICAgdHJhbnNsYXRlWSA9IHkgKiBzY2FsZSArIHRoaXMuZ2V0SGVpZ2h0KCkgLyAyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5nZXRTdmcoKS50cmFuc2l0aW9uKClcclxuICAgICAgICAgICAgLmR1cmF0aW9uKHRoaXMuZ2V0RHVyYXRpb24oKSlcclxuICAgICAgICAgICAgLmNhbGwodGhpcy5nZXRab29tTGlzdGVuZXIoKS50cmFuc2Zvcm0sIGQzLnpvb21JZGVudGl0eS50cmFuc2xhdGUodHJhbnNsYXRlWCwgdHJhbnNsYXRlWSkuc2NhbGUoc2NhbGUpKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyaWdnZXJzIHRoZSBub2RlQ2xpY2sgZXZlbnQgd2hlbiBhXHJcbiAgICAgKiBEMyBub2RlIGlzIGNsaWNrZWQgb24sIGFuZCBwcm9jZWVkc1xyXG4gICAgICogdG8gZm9jdXMvZXhwYW5kL2NvbGxhcHNlIHRoZSBub2RlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbm9kZURhdGFJdGVtIFRoZSBEMyBub2RlIGRhdGEgaXRlbSB0aGF0IHdhcyBjbGlja2VkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgRDMgbm9kZSBiZWluZyBjbGlja2VkIGluIHRoZSBhcnJheSBvZiBzaWJsaW5ncy5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0W119IGFyciBBcnJheSBvZiBzaWJsaW5ncyBEMyBub2RlLCBpbmNsdXNpdmUgb2YgdGhlIGNsaWNrZWQgbm9kZSBkYXRhIGl0ZW0gaXRzZWxmLlxyXG4gICAgICogQGVtaXRzIHtub2RlQ2xpY2t9IEVtaXQgbm9kZSBjbGljayBldmVudC5cclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIG1lYW5pbmcgaXQgc3VjY2Vzc2Z1bGx5IGZvY3VzZWQvZXhwYW5kZWQvY29sbGFwc2VkIGEgbm9kZS4gRmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICovXHJcbiAgICBfb25Ob2RlQ2xpY2sobm9kZURhdGFJdGVtLCBpbmRleCwgYXJyKSB7XHJcbiAgICAgICAgdmFyIGV2ZW50VHlwZSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0QWxsb3dGb2N1cygpKVxyXG4gICAgICAgICAgICBldmVudFR5cGUgPSAnZm9jdXMnO1xyXG4gICAgICAgIGVsc2UgaWYgKG5vZGVEYXRhSXRlbS5jaGlsZHJlbilcclxuICAgICAgICAgICAgZXZlbnRUeXBlID0gJ2NvbGxhcHNlJztcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9ICdleHBhbmQnO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHZhciBldmVudCA9IHtcclxuICAgICAgICAgICAgdHlwZTogZXZlbnRUeXBlLFxyXG4gICAgICAgICAgICBjb250aW51ZTogdHJ1ZSxcclxuICAgICAgICAgICAgbm9kZURhdGFJdGVtOiBub2RlRGF0YUl0ZW0sXHJcbiAgICAgICAgICAgIG5vZGVEYXRhSXRlbUluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgbm9kZURhdGFJdGVtczogYXJyXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZW1pdCgnbm9kZUNsaWNrJywgZXZlbnQpO1xyXG4gICAgICAgIGlmIChldmVudC5jb250aW51ZSA9PT0gZmFsc2UpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5nZXRBbGxvd0ZvY3VzKCkpXHJcbiAgICAgICAgICAgIHRoaXMubm9kZUZvY3VzLmNhbGwodGhpcywgbm9kZURhdGFJdGVtKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMubm9kZVRvZ2dsZS5jYWxsKHRoaXMsIG5vZGVEYXRhSXRlbSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgY2hpbGQgRDMgdHJlZSBub2RlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gcGFyZW50Tm9kZURhdGFJdGVtIFRoZSBwYXJlbnQgRDMgdHJlZSBub2RlIGRhdGEgaXRlbS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhSXRlbSBUaGUgZGF0YSBpdGVtLlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIG5ld2x5IGNyZWF0ZWQgRDMgbm9kZTtcclxuICAgICAqL1xyXG4gICAgX2NyZWF0ZU5vZGUocGFyZW50Tm9kZURhdGFJdGVtLCBkYXRhSXRlbSkge1xyXG4gICAgICAgIC8vIENyZWF0ZSBhIEQzIG5vZGUgb2JqZWN0IGZyb20gcmVzdWx0aW5nIGRhdGEgaXRlbXMgdXNpbmcgZDMuaGllcmFyY2h5KClcclxuICAgICAgICB2YXIgbmV3Tm9kZSA9IGQzLmhpZXJhcmNoeShkYXRhSXRlbSk7XHJcblxyXG4gICAgICAgIC8vIE5vdyBhZGQgbWlzc2luZyBwcm9wZXJ0aWVzIHRvIE5vZGUgbGlrZSBjaGlsZCwgcGFyZW50LCBkZXB0aFxyXG4gICAgICAgIG5ld05vZGUuZGVwdGggPSBwYXJlbnROb2RlRGF0YUl0ZW0uZGVwdGggKyAxO1xyXG4gICAgICAgIG5ld05vZGUuaGVpZ2h0ID0gcGFyZW50Tm9kZURhdGFJdGVtLmhlaWdodCAtIDE7XHJcbiAgICAgICAgbmV3Tm9kZS5wYXJlbnQgPSBwYXJlbnROb2RlRGF0YUl0ZW07XHJcbiAgICAgICAgbmV3Tm9kZS5pZCA9IHRoaXMuZ2V0SWQuY2FsbCh0aGlzLCBkYXRhSXRlbSk7XHJcbiAgICAgICAgcmV0dXJuIG5ld05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuZCBhZGRzIGEgY2hpbGQgRDMgdHJlZVxyXG4gICAgICogbm9kZSB0byBhIGdpdmVuIHBhcmVudCBEMyB0cmVlIG5vZGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJlbnROb2RlRGF0YUl0ZW0gVGhlIHBhcmVudCBEMyB0cmVlIG5vZGUgZGF0YSBpdGVtLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRhdGFJdGVtIFRoZSBkYXRhIGl0ZW0uXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgbmV3bHkgY3JlYXRlZCBhbmQgYWRkZWQgRDMgbm9kZTtcclxuICAgICAqL1xyXG4gICAgX2FkZFVuZGVybHlpbmdDaGlsZE5vZGUocGFyZW50Tm9kZURhdGFJdGVtLCBkYXRhSXRlbSkge1xyXG4gICAgICAgIHZhciBuZXdOb2RlID0gdGhpcy5fY3JlYXRlTm9kZShwYXJlbnROb2RlRGF0YUl0ZW0sIGRhdGFJdGVtKTtcclxuICAgICAgICBwYXJlbnROb2RlRGF0YUl0ZW0uX2NoaWxkcmVuLnB1c2gobmV3Tm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIG5ld05vZGU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzcyB0aGUgbG9hZGVkIGRhdGEgZnJvbSBBSkFYXHJcbiAgICAgKiByZXN1bHRpbmcgZnJvbSBhIG5vZGUgZXhwYW5kLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbm9kZURhdGFJdGVtIFRoZSBEMyBub2RlIGRhdGEgaXRlbSBiZWluZyBleHBhbmRlZC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0W119IHJlc3VsdCBUaGUgY2hpbGRyZW4gZGF0YSBpdGVtcyB0byBwcm9jZXNzLlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBfcHJvY2Vzc0xvYWRlZERhdGFGb3JOb2RlRm9jdXMobm9kZURhdGFJdGVtLCByZXN1bHQpIHtcclxuICAgICAgICBub2RlRGF0YUl0ZW0uX2NoaWxkcmVuID0gW107XHJcbiAgICAgICAgcmVzdWx0LmZvckVhY2goKGN1cnJlbnRJdGVtKSA9PiB0aGlzLl9hZGRVbmRlcmx5aW5nQ2hpbGROb2RlKG5vZGVEYXRhSXRlbSwgY3VycmVudEl0ZW0pKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcG9wdWxhdGVVbmRlcmx5aW5nQ2hpbGRyZW4obm9kZURhdGFJdGVtKTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVUcmVlV2l0aEZvY3VzT25Ob2RlKG5vZGVEYXRhSXRlbSk7XHJcblxyXG4gICAgICAgIHZhciB3YXNTZWxlY3RlZCA9IG5vZGVEYXRhSXRlbS5zZWxlY3RlZDtcclxuICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGlvbih0aGlzLmdldFJvb3QoKSk7XHJcbiAgICAgICAgbm9kZURhdGFJdGVtLnNlbGVjdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGUobm9kZURhdGFJdGVtKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0QWxsb3dOb2RlQ2VudGVyaW5nKCkgPT09IHRydWUgJiYgXHJcbiAgICAgICAgICAgICh3YXNTZWxlY3RlZCA9PT0gZmFsc2UgfHwgdHlwZW9mIHdhc1NlbGVjdGVkID09PSAndW5kZWZpbmVkJykpXHJcbiAgICAgICAgICAgIHRoaXMuY2VudGVyTm9kZShub2RlRGF0YUl0ZW0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXNlcyB0byBhIG5vZGUsIGdpdmVuIGEgbm9kZSBkYXRhIGl0ZW0uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRGF0YUl0ZW0gVGhlIG5vZGUgYmVpbmcgZm9jdXNlZCBvbi5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgbm9kZUZvY3VzKG5vZGVEYXRhSXRlbSkge1xyXG4gICAgICAgIGlmICghbm9kZURhdGFJdGVtLmNoaWxkcmVuICYmICFub2RlRGF0YUl0ZW0uX2NoaWxkcmVuXHJcbiAgICAgICAgICAgICYmIHRoaXMubG9hZE9uRGVtYW5kU2V0dGluZ3MuaXNFbmFibGVkKClcclxuICAgICAgICAgICAgJiYgdGhpcy5sb2FkT25EZW1hbmRTZXR0aW5ncy5oYXNDaGlsZHJlbihub2RlRGF0YUl0ZW0uZGF0YSkpIHtcclxuICAgICAgICAgICAgdmFyIHByb2Nlc3NEYXRhID0gKHJlc3VsdCkgPT4gdGhpcy5fcHJvY2Vzc0xvYWRlZERhdGFGb3JOb2RlRm9jdXMobm9kZURhdGFJdGVtLCByZXN1bHQpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRPbkRlbWFuZFNldHRpbmdzLmxvYWRDaGlsZHJlbihub2RlRGF0YUl0ZW0uZGF0YSwgcHJvY2Vzc0RhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVUcmVlV2l0aEZvY3VzT25Ob2RlKG5vZGVEYXRhSXRlbSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgd2FzU2VsZWN0ZWQgPSBub2RlRGF0YUl0ZW0uc2VsZWN0ZWQ7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0aW9uKHRoaXMuZ2V0Um9vdCgpKTtcclxuICAgICAgICAgICAgbm9kZURhdGFJdGVtLnNlbGVjdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKG5vZGVEYXRhSXRlbSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRBbGxvd05vZGVDZW50ZXJpbmcoKSA9PT0gdHJ1ZSAmJiBcclxuICAgICAgICAgICAgICAgICh3YXNTZWxlY3RlZCA9PT0gZmFsc2UgfHwgdHlwZW9mIHdhc1NlbGVjdGVkID09PSAndW5kZWZpbmVkJykpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNlbnRlck5vZGUobm9kZURhdGFJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNzIHRoZSBsb2FkZWQgZGF0YSBmcm9tIEFKQVhcclxuICAgICAqIHJlc3VsdGluZyBmcm9tIGEgbm9kZSB0b2dnbGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRGF0YUl0ZW0gVGhlIEQzIG5vZGUgZGF0YSBpdGVtLlxyXG4gICAgICogQHBhcmFtIHtvYmplY3RbXX0gcmVzdWx0IEFycmF5IG9mIHNpYmxpbmcgbm9kZSBkYXRhIGl0ZW1zLCBpbmNsdXNpdmUgdGhlIG5vZGUgYmVpbmcgdG9nZ2xlZC5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgX3Byb2Nlc3NMb2FkZWREYXRhRm9yTm9kZVRvZ2dsZShub2RlRGF0YUl0ZW0sIHJlc3VsdCkge1xyXG4gICAgICAgIG5vZGVEYXRhSXRlbS5fY2hpbGRyZW4gPSBbXTtcclxuICAgICAgICByZXN1bHQuZm9yRWFjaCgoY3VycmVudEl0ZW0pID0+IHRoaXMuX2FkZFVuZGVybHlpbmdDaGlsZE5vZGUobm9kZURhdGFJdGVtLCBjdXJyZW50SXRlbSkpO1xyXG5cclxuICAgICAgICB0aGlzLmV4cGFuZChub2RlRGF0YUl0ZW0pO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZShub2RlRGF0YUl0ZW0pO1xyXG4gICAgICAgIGlmICh0aGlzLmdldEFsbG93Tm9kZUNlbnRlcmluZygpID09PSB0cnVlKVxyXG4gICAgICAgICAgICB0aGlzLmNlbnRlck5vZGUobm9kZURhdGFJdGVtKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRvZ2dsZXMgdGhlIGNoaWxkcmVuIHZpc2liaWxpdHkgZm9yIGEgZ2l2ZW4gbm9kZSBkYXRhIGl0ZW0uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Kn0gbm9kZURhdGFJdGVtIEQzIE5vZGUgZGF0YSBpdGVtLlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBub2RlVG9nZ2xlKG5vZGVEYXRhSXRlbSkge1xyXG4gICAgICAgIC8vIElmIGl0IGhhc24ndCBiZWVuIGxvYWRlZCwgYW5kIGl0J3Mgc3BlY2lmaWVkIHRvIGhhdmUgY2hpbGRyZW4sXHJcbiAgICAgICAgLy8gdGhlbiBwZXJmb3JtIGxvYWQtb24tZGVtYW5kIHRvIGxvYWQgbmV3IGl0ZW1zIGZyb20gc2VydmVyXHJcbiAgICAgICAgLy8gYW5kIGFkZCB0aGVtIGFzIGNoaWxkIG5vZGVzXHJcbiAgICAgICAgaWYgKCFub2RlRGF0YUl0ZW0uY2hpbGRyZW4gJiYgIW5vZGVEYXRhSXRlbS5fY2hpbGRyZW5cclxuICAgICAgICAgICAgJiYgdGhpcy5sb2FkT25EZW1hbmRTZXR0aW5ncy5pc0VuYWJsZWQoKVxyXG4gICAgICAgICAgICAmJiB0aGlzLmxvYWRPbkRlbWFuZFNldHRpbmdzLmhhc0NoaWxkcmVuKG5vZGVEYXRhSXRlbS5kYXRhKSkge1xyXG4gICAgICAgICAgICB2YXIgcHJvY2Vzc0RhdGEgPSAocmVzdWx0KSA9PiB0aGlzLl9wcm9jZXNzTG9hZGVkRGF0YUZvck5vZGVUb2dnbGUobm9kZURhdGFJdGVtLCByZXN1bHQpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRPbkRlbWFuZFNldHRpbmdzLmxvYWRDaGlsZHJlbihub2RlRGF0YUl0ZW0uZGF0YSwgcHJvY2Vzc0RhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG5vZGVEYXRhSXRlbS5jaGlsZHJlbilcclxuICAgICAgICAgICAgICAgIHRoaXMuY29sbGFwc2Uobm9kZURhdGFJdGVtKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5leHBhbmQobm9kZURhdGFJdGVtKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUobm9kZURhdGFJdGVtKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0QWxsb3dOb2RlQ2VudGVyaW5nKCkgPT09IHRydWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNlbnRlck5vZGUobm9kZURhdGFJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIaWRlIHRoZSBzaWJsaW5ncyBub2Rlc1xyXG4gICAgICogZm9yIGEgZ2l2ZW4gbm9kZS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG5vZGVEYXRhSXRlbSBUaGUgRDMgbm9kZSB0byBoaWRlIHNpYmxpbmdzIGZvci5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgaGlkZVNpYmxpbmdzKG5vZGVEYXRhSXRlbSkge1xyXG4gICAgICAgIHZhciBwYXJlbnROb2RlID0gbm9kZURhdGFJdGVtLnBhcmVudDtcclxuXHJcbiAgICAgICAgaWYgKHBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgdmFyIG5vZGVJZCA9IHRoaXMuZ2V0SWQobm9kZURhdGFJdGVtLmRhdGEpO1xyXG4gICAgICAgICAgICBwYXJlbnROb2RlLmNoaWxkcmVuLmZpbHRlcih4ID0+IHRoaXMuZ2V0SWQoeC5kYXRhKSAhPSBub2RlSWQpLmZvckVhY2godGhpcy5jb2xsYXBzZVJlY3Vyc2l2ZWx5KTtcclxuICAgICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZHJlbiA9IFtdO1xyXG4gICAgICAgICAgICBwYXJlbnROb2RlLmNoaWxkcmVuLnB1c2gobm9kZURhdGFJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSB0cmVlIGRpYWdyYW0gc28gb25seSB0aGUgcmVsZXZhbnRcclxuICAgICAqIGZvY3VzZWQgbm9kZSBhbmQgZGlyZWN0IHBhcmVudCBoaWVyYXJjaGllcyBhcmVcclxuICAgICAqIHNob3duLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbm9kZURhdGFJdGVtIEQzIE5vZGUgZGF0YSBpdGVtLlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRyZWUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVUcmVlV2l0aEZvY3VzT25Ob2RlKG5vZGVEYXRhSXRlbSkge1xyXG4gICAgICAgIGlmICghbm9kZURhdGFJdGVtLmNoaWxkcmVuICYmIG5vZGVEYXRhSXRlbS5fY2hpbGRyZW4pIHsgLy8gSWYgdGhlcmUncyBubyBjaGlsZHJlbiBub2RlcywgYnV0IHRoZXJlIGEgc29tZSBjaGlsZHJlbiBpdGVtcyB0byBleHBhbmRcclxuICAgICAgICAgICAgdGhpcy5oaWRlU2libGluZ3Mobm9kZURhdGFJdGVtKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kKG5vZGVEYXRhSXRlbSk7XHJcbiAgICAgICAgICAgIC8vIENvbGxhcHNlIHRoZSBjdXJyZW50IGZvY3VzZWQgbm9kZSdzIGNoaWxkcmVuLCBzbyBvbmx5IGRpcmVjdCBjaGlsZHJlbnMgYXJlIHNob3duXHJcbiAgICAgICAgICAgIG5vZGVEYXRhSXRlbS5jaGlsZHJlbi5mb3JFYWNoKHRoaXMuY29sbGFwc2VSZWN1cnNpdmVseSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5vZGVEYXRhSXRlbS5jaGlsZHJlbikgeyAvLyBJZiB0aGVyZSBhcmUgcmVuZGVyZWQgY2hpbGRyZW4gbm9kZXNcclxuICAgICAgICAgICAgLy8gQ2hlY2tzIGlmIGl0cyBjaGlsZHJlbiBoYXMgYW55IHJlbmRlcmVkIGNoaWxkcmVuXHJcbiAgICAgICAgICAgIHZhciBoYXNOZXN0ZWRDaGlsZHJlbiA9IG5vZGVEYXRhSXRlbS5jaGlsZHJlbi5zb21lKChjdXJyZW50SXRlbSwgaW5kZXgsIGFycikgPT4gY3VycmVudEl0ZW0uY2hpbGRyZW4pO1xyXG5cclxuICAgICAgICAgICAgdmFyIGlzUHJldmlvdXNseUV4cGFuZGVkTm9kZSA9ICFoYXNOZXN0ZWRDaGlsZHJlbjtcclxuICAgICAgICAgICAgLy8gSWYgaXQgaXMgYSBwYXJlbnQgbm9kZSB3aXRoIGNoaWxkcmVuLCBhbmRcclxuICAgICAgICAgICAgLy8gaXMgbm90IHRoZSBwcmV2aW91cyBleHBhbmRlZCBub2RlLFxyXG4gICAgICAgICAgICAvLyB0aGVuIHdlJ2xsIGZvY3VzIG9uIGl0LCBleHBhbmRpbmcgaXRcclxuICAgICAgICAgICAgLy8gYW5kIHNob3dpbmcgYWxsIG9mIGl0cyBjaGlsZHJlblxyXG4gICAgICAgICAgICBpZiAoaXNQcmV2aW91c2x5RXhwYW5kZWROb2RlID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb2xsYXBzZVJlY3Vyc2l2ZWx5KG5vZGVEYXRhSXRlbSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZChub2RlRGF0YUl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgdHJlZSBub2RlcyBnaXZlblxyXG4gICAgICogYSBEMyB0cmVlIG5vZGUuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRGF0YUl0ZW0gVGhlIEQzIG5vZGUgZGF0YSBpdGVtIHRvIHVwZGF0ZS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0W119IG5vZGVzIEFycmF5IG9mIEQzIG5vZGUgZGF0YSBpdGVtcy5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgX3VwZGF0ZU5vZGVzKG5vZGVEYXRhSXRlbSwgbm9kZXMpIHtcclxuICAgICAgICAvLyBOb3JtYWxpemUgZm9yIGZpeGVkLWRlcHRoLlxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFlvdSBjYW4gaW5jcmVhc2UgdGhlIGRlcHRoIG11bHRpcGxpY2F0aW9uIHRvIGdldCBtb3JlIGRlcHRoLFxyXG4gICAgICAgIC8vIGkuZS4gaW5jcmVhc2luZyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGFyZW50IG5vZGUgYW5kIGNoaWxkIG5vZGVcclxuICAgICAgICBub2Rlcy5mb3JFYWNoKChkYXRhKSA9PiBkYXRhLnkgPSBkYXRhLmRlcHRoICogdGhpcy5nZXROb2RlRGVwdGhNdWx0aXBsaWVyKCkpO1xyXG5cclxuICAgICAgICAvLyAqKioqKioqKioqKioqKioqKiogTm9kZXMgc2VjdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBub2Rlcy4uLlxyXG4gICAgICAgIHZhciBub2RlcyA9IHRoaXMuZ2V0UGFubmluZ0NvbnRhaW5lcigpLnNlbGVjdEFsbChcImcubm9kZVwiKVxyXG4gICAgICAgICAgICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBvZiBkYXRhKCkgdGFrZXMgaW4gYSBcclxuICAgICAgICAgICAgLy8gZnVuY3Rpb24sIGRldGVybWluaW5nIHRoZSBrZXkgb2YgdGhlIGRhdGFcclxuICAgICAgICAgICAgLy8gaXRlbXMsIHdoaWNoIGlzIHVzZWZ1bCB0byByZXRyaWV2ZSBpdGVtcyxcclxuICAgICAgICAgICAgLy8gYW5kIGRhdGFiaW5kIHRoZW1cclxuICAgICAgICAgICAgLmRhdGEobm9kZXMsIChkYXRhKSA9PiB0aGlzLmdldElkLmNhbGwodGhpcywgZGF0YS5kYXRhKSk7XHJcblxyXG4gICAgICAgIC8vIEVudGVyIGFueSBuZXcgbm9kZXMgYXQgdGhlIHBhcmVudCdzIHByZXZpb3VzIHBvc2l0aW9uLlxyXG4gICAgICAgIHZhciBub2RlRW50ZXIgPSBub2Rlcy5lbnRlcigpLmFwcGVuZChcImdcIilcclxuICAgICAgICAgICAgLmNsYXNzZWQoXCJub2RlXCIsIHRydWUpXHJcbiAgICAgICAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIChkYXRhLCBpbmRleCwgYXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRPcmllbnRhdGlvbigpLnRvTG93ZXJDYXNlKCkgPT09ICd0b3B0b2JvdHRvbScpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwidHJhbnNsYXRlKFwiICsgbm9kZURhdGFJdGVtLngwICsgXCIsXCIgKyBub2RlRGF0YUl0ZW0ueTAgKyBcIilcIjtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyBub2RlRGF0YUl0ZW0ueTAgKyBcIixcIiArIG5vZGVEYXRhSXRlbS54MCArIFwiKVwiO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAub24oXCJjbGlja1wiLCAoZGF0YSwgaW5kZXgsIGFycikgPT4gdGhpcy5fb25Ob2RlQ2xpY2suY2FsbCh0aGlzLCBkYXRhLCBpbmRleCwgYXJyKSk7XHJcblxyXG4gICAgICAgIHRoaXMuX25vZGVFbnRlcihub2RlRW50ZXIsIG5vZGVzKTtcclxuXHJcbiAgICAgICAgLy8gVVBEQVRFXHJcbiAgICAgICAgdmFyIG5vZGVVcGRhdGUgPSBub2RlRW50ZXIubWVyZ2Uobm9kZXMpO1xyXG4gICAgICAgIHZhciBub2RlVXBkYXRlVHJhbnNpdGlvbiA9IG5vZGVVcGRhdGUudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMuZ2V0RHVyYXRpb24oKSk7XHJcblxyXG4gICAgICAgIG5vZGVVcGRhdGVcclxuICAgICAgICAgICAgLmNsYXNzZWQoXCJjb2xsYXBzZWRcIiwgKGRhdGEsIGluZGV4LCBhcnIpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghZGF0YS5jaGlsZHJlbiAmJiBkYXRhLl9jaGlsZHJlbilcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubG9hZE9uRGVtYW5kU2V0dGluZ3MuaXNFbmFibGVkKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMubG9hZE9uRGVtYW5kU2V0dGluZ3MuaGFzQ2hpbGRyZW4oZGF0YS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWRhdGEuY2hpbGRyZW4gJiYgIWRhdGEuX2NoaWxkcmVuKSAvLyBJZiBpdCBkb2VzIGhhdmUgY2hpbGRyZW4gdG8gbG9hZCB2aWEgQUpBWFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2xhc3NlZChcImV4cGFuZGVkXCIsIChkYXRhLCBpbmRleCwgYXJyKSA9PiBkYXRhLmNoaWxkcmVuKVxyXG4gICAgICAgICAgICAuY2xhc3NlZChcImNoaWxkbGVzc1wiLCAoZGF0YSwgaW5kZXgsIGFycikgPT4gIWRhdGEuY2hpbGRyZW4gJiYgIWRhdGEuX2NoaWxkcmVuKVxyXG4gICAgICAgICAgICAuY2xhc3NlZChcInNlbGVjdGVkXCIsIChkYXRhLCBpbmRleCwgYXJyKSA9PiBkYXRhLnNlbGVjdGVkKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbm9kZVVwZGF0ZShub2RlVXBkYXRlLCBub2RlVXBkYXRlVHJhbnNpdGlvbiwgbm9kZXMpO1xyXG5cclxuICAgICAgICAvLyBSZW1vdmUgYW55IGV4aXRpbmcgbm9kZXNcclxuICAgICAgICB2YXIgbm9kZUV4aXQgPSBub2Rlcy5leGl0KCk7XHJcbiAgICAgICAgdmFyIG5vZGVFeGl0VHJhbnNpdGlvbiA9IG5vZGVFeGl0LnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLmdldER1cmF0aW9uKCkpO1xyXG5cclxuICAgICAgICB0aGlzLl9ub2RlRXhpdChub2RlRXhpdCwgbm9kZUV4aXRUcmFuc2l0aW9uLCBub2Rlcyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSB0cmVlIG5vZGUgbGlua3MgZ2l2ZW5cclxuICAgICAqIGEgRDMgdHJlZSBub2RlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbm9kZURhdGFJdGVtIFRoZSBEMyBub2RlIGRhdGEgaXRlbS4gXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdFtdfSBsaW5rcyBBcnJheSBvZiBEMyBsaW5rIGRhdGEgaXRlbXMuXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgdHJlZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIF91cGRhdGVMaW5rcyhub2RlRGF0YUl0ZW0sIGxpbmtzKSB7XHJcbiAgICAgICAgdmFyIGxpbmtQYXRoR2VuZXJhdG9yID0gdGhpcy5fZ2V0TGlua1BhdGhHZW5lcmF0b3IoKTtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBsaW5rcy4uLlxyXG4gICAgICAgIHZhciBsaW5rID0gdGhpcy5nZXRQYW5uaW5nQ29udGFpbmVyKCkuc2VsZWN0QWxsKFwicGF0aC5saW5rXCIpXHJcbiAgICAgICAgICAgIC5kYXRhKGxpbmtzLCAoZGF0YSkgPT4gdGhpcy5nZXRJZC5jYWxsKHRoaXMsIGRhdGEuZGF0YSkpO1xyXG5cclxuICAgICAgICAvLyBFbnRlciBhbnkgbmV3IGxpbmtzIGF0IHRoZSBwYXJlbnQncyBwcmV2aW91cyBwb3NpdGlvbi5cclxuICAgICAgICB2YXIgbGlua0VudGVyID0gbGluay5lbnRlcigpLmluc2VydChcInBhdGhcIiwgXCJnXCIpXHJcbiAgICAgICAgICAgIC5jbGFzc2VkKFwibGlua1wiLCB0cnVlKTtcclxuICAgICAgICB0aGlzLl9saW5rRW50ZXIobm9kZURhdGFJdGVtLCBsaW5rRW50ZXIsIGxpbmssIGxpbmtQYXRoR2VuZXJhdG9yKTtcclxuXHJcbiAgICAgICAgLy8gVVBEQVRFXHJcbiAgICAgICAgdmFyIGxpbmtVcGRhdGUgPSBsaW5rRW50ZXIubWVyZ2UobGluayk7XHJcbiAgICAgICAgdmFyIGxpbmtVcGRhdGVUcmFuc2l0aW9uID0gbGlua1VwZGF0ZS50cmFuc2l0aW9uKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmR1cmF0aW9uKHRoaXMuZ2V0RHVyYXRpb24oKSk7XHJcblxyXG4gICAgICAgIC8vIFRyYW5zaXRpb24gYmFjayB0byB0aGUgcGFyZW50IGVsZW1lbnQgcG9zaXRpb25cclxuICAgICAgICB0aGlzLl9saW5rVXBkYXRlKG5vZGVEYXRhSXRlbSwgbGlua1VwZGF0ZSwgbGlua1VwZGF0ZVRyYW5zaXRpb24sIGxpbmssIGxpbmtQYXRoR2VuZXJhdG9yKTtcclxuXHJcbiAgICAgICAgLy8gUmVtb3ZlIGFueSBleGl0aW5nIGxpbmtzXHJcbiAgICAgICAgdmFyIGxpbmtFeGl0ID0gbGluay5leGl0KCk7XHJcbiAgICAgICAgdmFyIGxpbmtFeGl0VHJhbnNpdGlvbiA9IGxpbmtFeGl0LnRyYW5zaXRpb24oKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZHVyYXRpb24odGhpcy5nZXREdXJhdGlvbigpKVxyXG5cclxuICAgICAgICB0aGlzLl9saW5rRXhpdChub2RlRGF0YUl0ZW0sIGxpbmtFeGl0LCBsaW5rRXhpdFRyYW5zaXRpb24sIGxpbmssIGxpbmtQYXRoR2VuZXJhdG9yKTtcclxuXHJcbiAgICAgICAgLy8gU3RvcmUgdGhlIG9sZCBwb3NpdGlvbnMgZm9yIHRyYW5zaXRpb24uXHJcbiAgICAgICAgdGhpcy5nZXRWaXNpYmxlTm9kZXMoKS5mb3JFYWNoKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEueDAgPSBkYXRhLng7XHJcbiAgICAgICAgICAgIGRhdGEueTAgPSBkYXRhLnk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSB0cmVlIGdpdmVuIGEgRDMgdHJlZSBub2RlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbm9kZURhdGFJdGVtIFRoZSBEMyBub2RlIGRhdGEgaXRlbS5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlKG5vZGVEYXRhSXRlbSkge1xyXG4gICAgICAgIHZhciB0cmVlR2VuZXJhdG9yID0gdGhpcy5nZXRUcmVlR2VuZXJhdG9yKCk7XHJcbiAgICAgICAgLy8gQXNzaWducyB0aGUgeCBhbmQgeSBwb3NpdGlvbiBmb3IgdGhlIG5vZGVzXHJcbiAgICAgICAgdmFyIHRyZWVEYXRhID0gdHJlZUdlbmVyYXRvcih0aGlzLmdldFJvb3QoKSk7XHJcbiAgICAgICAgdGhpcy5fdmlzaWJsZU5vZGVzID0gdHJlZURhdGEuZGVzY2VuZGFudHMoKTtcclxuICAgICAgICB0aGlzLl9ub2RlcyA9IFt0aGlzLmdldFJvb3QoKSwgLi4ucmVjdXJzaXZlR2V0KHRoaXMuZ2V0Um9vdCgpLCAobm9kZSkgPT4gbm9kZS5fY2hpbGRyZW4pXTtcclxuICAgICAgICB0aGlzLl9saW5rcyA9IHRyZWVEYXRhLmRlc2NlbmRhbnRzKCkuc2xpY2UoMSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3VwZGF0ZU5vZGVzKG5vZGVEYXRhSXRlbSwgdGhpcy5nZXRWaXNpYmxlTm9kZXMoKSlcclxuICAgICAgICAgICAgLl91cGRhdGVMaW5rcyhub2RlRGF0YUl0ZW0sIHRoaXMuZ2V0TGlua3MoKSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdW5pcXVlIElEIGZvciBhIGdpdmVuIGRhdGEgaXRlbS5cclxuICAgICAqIEBjYWxsYmFjayBnZXRJZENhbGxCYWNrXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSBSZXByZXNlbnRzIHRoZSBzaW5nbGUgZGF0YSBpdGVtIHRvIGV4dHJhY3QgdGhlIElEIGZyb20uXHJcbiAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHVuaXF1ZSBJRCBmcm9tIHRoZSBnaXZlbiBkYXRhIGl0ZW0uXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHBhcmVudCBJRCBmb3IgYSBnaXZlbiBkYXRhIGl0ZW0uXHJcbiAgICAgKiBAY2FsbGJhY2sgZ2V0UGFyZW50SWRDYWxsQmFja1xyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgUmVwcmVzZW50cyB0aGUgc2luZ2xlIGRhdGEgaXRlbSB0byBleHRyYWN0IHRoZSBwYXJlbnQgSUQgZnJvbS5cclxuICAgICAqIEByZXR1cm5zIHsqfSBUaGUgcGFyZW50IElEIGZyb20gdGhlIGdpdmVuIGRhdGEgaXRlbS5cclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgY2hpbGRyZW4gaXRlbXMgZm9yIGEgZ2l2ZW5cclxuICAgICAqIGRhdGEgaXRlbS5cclxuICAgICAqIEBjYWxsYmFjayBnZXRDaGlsZHJlbkNhbGxCYWNrXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSBSZXByZXNlbnRzIHRoZSBzaW5nbGUgZGF0YSBpdGVtIHRvIGV4dHJhY3QgdGhlIGNoaWxkcmVuIGRhdGEgaXRlbXMgZnJvbS5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3RbXX0gVGhlIGFycmF5IG9mIGRhdGEgaXRlbXMgcmVwcmVzZW50aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gZGF0YSBpdGVtLlxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb2RlIGNsaWNrIGV2ZW50LCB0cmlnZ2VyZWQgd2hlbiBhXHJcbiAgICAgKiB1c2VyIGNsaWNrcyBvbiBhIHRyZWUgbm9kZS5cclxuICAgICAqIFxyXG4gICAgICogQHR5cGVkZWYge29iamVjdH0gbm9kZUNsaWNrXHJcbiAgICAgKiBAcHJvcGVydHkge29iamVjdH0gZXZlbnQgT2JqZWN0IGNvbnRhaW5pbmcgdmFyaW91cyBldmVudCBwYXJhbWV0ZXJzLlxyXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGV2ZW50LnR5cGUgVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbiB0aGUgY2xpY2sgd2lsbCB0cmlnZ2VyLCB3aGV0aGVyIGl0J3MgJ2ZvY3VzJywgJ2V4cGFuZCcsIG9yICdjb2xsYXBzZScuXHJcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGV2ZW50LmNvbnRpbnVlIFdoZXRoZXIgdG8gY29udGludWUgdGhlIG5vZGUgZm9jdXNpbmcvZXhwYW5kaW5nL2NvbGxhcHNpbmcuXHJcbiAgICAgKiBAcHJvcGVydHkge29iamVjdH0gZXZlbnQubm9kZURhdGFJdGVtIE5vZGUgZGF0YSBpdGVtIHJlcHJlc2VudGluZyB0aGUgY2xpY2tlZCBub2RlLlxyXG4gICAgICogQHByb3BlcnR5IHtvYmplY3R9IGV2ZW50Lm5vZGVEYXRhSXRlbS5kYXRhIFRoZSBkYXRhIGl0ZW0gb2YgdGhlIGNsaWNrZWQgbm9kZS5cclxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBldmVudC5ub2RlRGF0YUl0ZW1JbmRleCBJbmRleCBvZiB0aGUgY2xpY2tlZCBpdGVtIGluIHRoZSBhcnJheSBvZiBzaWJsaW5ncy5cclxuICAgICAqIEBwcm9wZXJ0eSB7b2JqZWN0W119IGV2ZW50Lm5vZGVEYXRhSXRlbXMgVGhlIGFycmF5IG9mIHNpYmxpbmcgcmVuZGVyZWQgU1ZHIGVsZW1lbnRzLCBpbmNsdXNpdmUgb2YgdGhlIG5vZGUgaXRzZWxmLlxyXG4gICAgICovXHJcbn1cclxuXHJcbi8vIERlZmluZSBvcHRpb24gZGVmYXVsdHMgdXNpbmcgYSBjbGFzcyBzdGF0aWMgcHJvcGVydHlcclxuQmFzZVRyZWUuZGVmYXVsdHMgPSB7XHJcbiAgICB0aGVtZTogJ2RlZmF1bHQnLFxyXG4gICAgb3JpZW50YXRpb246ICdsZWZ0VG9SaWdodCcsIC8vIHRvcFRvQm90dG9tLCByaWdodFRvTGVmdCwgYm90dG9tVG9Ub3BcclxuICAgIGFsbG93UGFuOiB0cnVlLFxyXG4gICAgYWxsb3dab29tOiB0cnVlLFxyXG4gICAgYWxsb3dGb2N1czogdHJ1ZSxcclxuICAgIGFsbG93Tm9kZUNlbnRlcmluZzogdHJ1ZSxcclxuICAgIG1pblNjYWxlOiAxLCAvLyBNaW5pbXVtIHpvb20gc2NhbGluZ1xyXG4gICAgbWF4U2NhbGU6IDIsIC8vIE1heGltdW0gem9vbSBzY2FsaW5nXHJcbiAgICAvLyBZb3UgY2FuIGluY3JlYXNlIHRoZSBkZXB0aCBtdWx0aXBsaWNhdGlvbiB0byBnZXQgbW9yZSBkZXB0aCxcclxuICAgIC8vIGkuZS4gaW5jcmVhc2luZyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGFyZW50IG5vZGUgYW5kIGNoaWxkIG5vZGVcclxuICAgIG5vZGVEZXB0aE11bHRpcGxpZXI6IDMwMCxcclxuICAgIGlzRmxhdERhdGE6IGZhbHNlLFxyXG4gICAgZ2V0SWQ6IG51bGwsXHJcbiAgICBnZXRQYXJlbnRJZDogbnVsbCxcclxuICAgIGdldENoaWxkcmVuOiBudWxsLFxyXG4gICAgd2lkdGhXaXRob3V0TWFyZ2luczogOTYwLFxyXG4gICAgaGVpZ2h0V2l0aG91dE1hcmdpbnM6IDgwMCxcclxuICAgIG1hcmdpbnM6IHtcclxuICAgICAgICB0b3A6IDQwLFxyXG4gICAgICAgIHJpZ2h0OiAyMCxcclxuICAgICAgICBib3R0b206IDQwLFxyXG4gICAgICAgIGxlZnQ6IDEwMFxyXG4gICAgfSxcclxuICAgIGR1cmF0aW9uOiA3NTAsXHJcbiAgICBsb2FkT25EZW1hbmRTZXR0aW5nczoge1xyXG4gICAgICAgIC8vIERlZmF1bHRzIGFyZSBkZWZpbmVkIGluIHRoZSBsb2FkLW9uLWRlbWFuZCBzZXR0aW5ncyBwcm90b3R5cGVcclxuICAgIH0sXHJcbiAgICBub2RlU2V0dGluZ3M6IHtcclxuICAgICAgICAvLyBEZWZhdWx0cyBhcmUgZGVmaW5lZCBpbiB0aGUgbm9kZSBzZXR0aW5ncyBwcm90b3R5cGVcclxuICAgIH0sXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJhc2VUcmVlOyIsImltcG9ydCBOb2RlU2V0dGluZ3MgZnJvbSAnLi9Ob2RlU2V0dGluZ3MnO1xyXG5cclxuY2xhc3MgQm94ZWROb2RlU2V0dGluZ3MgZXh0ZW5kcyBOb2RlU2V0dGluZ3Mge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3duZXJPYmplY3QgVGhlIG93bmVyIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5ib2R5Qm94V2lkdGg9MjAwXSBCb2R5IGJveCB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5ib2R5Qm94SGVpZ2h0PTc1XSBCb2R5IGJveCBoZWlnaHQuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMuYm9keUJveFBhZGRpbmddIEJvZHkgYm94IHBhZGRpbmcgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmJvZHlCb3hQYWRkaW5nLnRvcD01XSBCb2R5IGJveCBwYWRkaW5nIHRvcC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5ib2R5Qm94UGFkZGluZy5yaWdodD0xMF0gQm9keSBib3ggcGFkZGluZyByaWdodC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5ib2R5Qm94UGFkZGluZy5ib3R0b209NV0gQm9keSBib3ggcGFkZGluZyBib3R0b20uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYm9keUJveFBhZGRpbmcubGVmdD0xMF0gQm9keSBib3ggcGFkZGluZyBsZWZ0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnRpdGxlQm94V2lkdGhdIFRpdGxlIGJveCB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50aXRsZUJveEhlaWdodD00MF0gVGl0bGUgYm94IGhlaWdodC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucy50aXRsZUJveFBhZGRpbmddIFRpdGxlIGJveCBwYWRkaW5nIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50aXRsZUJveFBhZGRpbmcudG9wPTJdIFRpdGxlIGJveCBwYWRkaW5nIHRvcC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50aXRsZUJveFBhZGRpbmcucmlnaHQ9NV0gVGl0bGUgYm94IHBhZGRpbmcgcmlnaHQuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGl0bGVCb3hQYWRkaW5nLmJvdHRvbT0yXSBUaXRsZSBib3ggcGFkZGluZyBib3R0b20uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGl0bGVCb3hQYWRkaW5nLmxlZnQ9NV0gVGl0bGUgYm94IHBhZGRpbmcgbGVmdC5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3duZXJPYmplY3QsIG9wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihvd25lck9iamVjdCwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHZhciBtZXJnZWRPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAuLi5Cb3hlZE5vZGVTZXR0aW5ncy5kZWZhdWx0cyxcclxuICAgICAgICAgICAgLi4ub3B0aW9uc1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX2JvZHlCb3hXaWR0aCA9IG1lcmdlZE9wdGlvbnMuYm9keUJveFdpZHRoO1xyXG4gICAgICAgIHRoaXMuX2JvZHlCb3hIZWlnaHQgPSBtZXJnZWRPcHRpb25zLmJvZHlCb3hIZWlnaHQ7XHJcbiAgICAgICAgdGhpcy5fYm9keUJveFBhZGRpbmcgPSBtZXJnZWRPcHRpb25zLmJvZHlCb3hQYWRkaW5nO1xyXG4gICAgICAgIHRoaXMuX3RpdGxlQm94V2lkdGggPSBtZXJnZWRPcHRpb25zLnRpdGxlQm94V2lkdGg7XHJcbiAgICAgICAgdGhpcy5fdGl0bGVCb3hIZWlnaHQgPSBtZXJnZWRPcHRpb25zLnRpdGxlQm94SGVpZ2h0O1xyXG4gICAgICAgIHRoaXMuX3RpdGxlQm94UGFkZGluZyA9IG1lcmdlZE9wdGlvbnMudGl0bGVCb3hQYWRkaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgYm9keSBib3ggd2lkdGggdmFsdWUuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBib2R5IGJveCB3aWR0aCB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgZ2V0Qm9keUJveFdpZHRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ib2R5Qm94V2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBib2R5IGJveCB3aWR0aCB2YWx1ZS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIFRoZSBib2R5IGJveCB3aWR0aCB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBub2RlIHNldHRpbmdzIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Qm9keUJveFdpZHRoKHdpZHRoKSB7XHJcbiAgICAgICAgdGhpcy5fYm9keUJveFdpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBib2R5IGJveCBoZWlnaHQgdmFsdWUuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBib2R5IGJveCBoZWlnaHQgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIGdldEJvZHlCb3hIZWlnaHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JvZHlCb3hIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBib2R5IGJveCBoZWlnaHQgdmFsdWUuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgVGhlIGJvZHkgYm94IGhlaWdodCB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBub2RlIHNldHRpbmdzIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0Qm9keUJveEhlaWdodChoZWlnaHQpIHtcclxuICAgICAgICB0aGlzLl9ib2R5Qm94SGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYm9keSBib3ggcGFkZGluZyB2YWx1ZXMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBuZXdQYWRkaW5nIFRoZSBib2R5IGJveCBwYWRkaW5nIG9iamVjdCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdQYWRkaW5nLnRvcCBUaGUgYm9keSBib3ggcGFkZGluZyB0b3AgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbmV3UGFkZGluZy5yaWdodCBUaGUgYm9keSBib3ggcGFkZGluZyByaWdodCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdQYWRkaW5nLmJvdHRvbSBUaGUgYm9keSBib3ggcGFkZGluZyBib3R0b20gdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbmV3UGFkZGluZy5sZWZ0IFRoZSBib2R5IGJveCBwYWRkaW5nIGxlZnQgdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgbm9kZSBzZXR0aW5ncyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEJvZHlCb3hQYWRkaW5nKG5ld1BhZGRpbmcpIHtcclxuICAgICAgICB0aGlzLl9ib2R5Qm94UGFkZGluZyA9IG5ld1BhZGRpbmc7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBib2R5IGJveCBwYWRkaW5nIHZhbHVlcy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIGJvZHkgYm94IHBhZGRpbmcgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRCb2R5Qm94UGFkZGluZygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYm9keUJveFBhZGRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB0aXRsZSBib3ggd2lkdGggdmFsdWUuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB0aXRsZSBib3ggd2lkdGggdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIGdldFRpdGxlQm94V2lkdGgoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RpdGxlQm94V2lkdGgpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90aXRsZUJveFdpZHRoO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qm9keUJveFdpZHRoKCkgLyAyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGl0bGUgYm94IHdpZHRoIHZhbHVlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggVGhlIHRpdGxlIGJveCB3aWR0aCB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBub2RlIHNldHRpbmdzIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0VGl0bGVCb3hXaWR0aCh3aWR0aCkge1xyXG4gICAgICAgIHRoaXMuX3RpdGxlQm94V2lkdGggPSB3aWR0aDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHRpdGxlIGJveCBoZWlnaHQgdmFsdWUuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB0aXRsZSBib3ggaGVpZ2h0IHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBnZXRUaXRsZUJveEhlaWdodCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdGl0bGVCb3hIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0aXRsZSBib3ggaGVpZ2h0IHZhbHVlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IFRoZSB0aXRsZSBib3ggaGVpZ2h0IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIG5vZGUgc2V0dGluZ3Mgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRUaXRsZUJveEhlaWdodChoZWlnaHQpIHtcclxuICAgICAgICB0aGlzLl90aXRsZUJveEhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHRpdGxlIGJveCBwYWRkaW5nIHZhbHVlcy5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIHRpdGxlIGJveCBwYWRkaW5nIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0VGl0bGVCb3hQYWRkaW5nKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90aXRsZUJveFBhZGRpbmc7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGl0bGUgYm94IHBhZGRpbmcgdmFsdWVzLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbmV3UGFkZGluZyBUaGUgYm9keSBib3ggcGFkZGluZyBvYmplY3QgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbmV3UGFkZGluZy50b3AgVGhlIGJvZHkgYm94IHBhZGRpbmcgdG9wIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1BhZGRpbmcucmlnaHQgVGhlIGJvZHkgYm94IHBhZGRpbmcgcmlnaHQgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbmV3UGFkZGluZy5ib3R0b20gVGhlIGJvZHkgYm94IHBhZGRpbmcgYm90dG9tIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1BhZGRpbmcubGVmdCBUaGUgYm9keSBib3ggcGFkZGluZyBsZWZ0IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGhlIG5vZGUgc2V0dGluZ3Mgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBzZXRUaXRsZUJveFBhZGRpbmcobmV3UGFkZGluZykge1xyXG4gICAgICAgIHRoaXMuX3RpdGxlQm94UGFkZGluZyA9IG5ld1BhZGRpbmc7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cclxuXHJcbkJveGVkTm9kZVNldHRpbmdzLmRlZmF1bHRzID0ge1xyXG4gICAgYm9keUJveFdpZHRoOiAyMDAsXHJcbiAgICBib2R5Qm94SGVpZ2h0OiA3NSxcclxuICAgIGJvZHlCb3hQYWRkaW5nOiB7XHJcbiAgICAgICAgdG9wOiA1LFxyXG4gICAgICAgIHJpZ2h0OiAxMCxcclxuICAgICAgICBib3R0b206IDUsXHJcbiAgICAgICAgbGVmdDogMTBcclxuICAgIH0sXHJcbiAgICB0aXRsZUJveFdpZHRoOiBudWxsLFxyXG4gICAgdGl0bGVCb3hIZWlnaHQ6IDQwLFxyXG4gICAgdGl0bGVCb3hQYWRkaW5nOiB7XHJcbiAgICAgICAgdG9wOiAyLFxyXG4gICAgICAgIHJpZ2h0OiA1LFxyXG4gICAgICAgIGJvdHRvbTogMixcclxuICAgICAgICBsZWZ0OiA1XHJcbiAgICB9LFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCb3hlZE5vZGVTZXR0aW5nczsiLCJpbXBvcnQgZDMgZnJvbSAnLi9DdXN0b21EMyc7XHJcbmltcG9ydCB7VGV4dEJveCBhcyBkM1BsdXNUZXh0Qm94fSBmcm9tICdkM3BsdXMtdGV4dCc7XHJcbmltcG9ydCBCYXNlVHJlZSBmcm9tICcuL0Jhc2VUcmVlJztcclxuaW1wb3J0IEJveGVkTm9kZVNldHRpbmdzIGZyb20gJy4vQm94ZWROb2RlU2V0dGluZ3MnO1xyXG5cclxuY2xhc3MgQm94ZWRUcmVlIGV4dGVuZHMgQmFzZVRyZWV7XHJcbiAgICAvKiogXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucyBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge2JvZHlEaXNwbGF5VGV4dEFjY2Vzc29yQ2FsbEJhY2t9IG9wdGlvbnMuZ2V0Qm9keURpc3BsYXlUZXh0IERldGVybWluZXMgaG93IHRvIG9idGFpbiB0aGUgYm9keSB0ZXh0IHRvIGRpc3BsYXkgZm9yIGEgbm9kZSBjb3JyZXNwb25kaW5nIHRvIGEgZGF0YSBpdGVtLlxyXG4gICAgICogQHBhcmFtIHt0aXRsZURpc3BsYXlUZXh0QWNjZXNzb3JDYWxsQmFja30gb3B0aW9ucy5nZXRUaXRsZURpc3BsYXlUZXh0IERldGVybWluZXMgaG93IHRvIG9idGFpbiB0aGUgdGl0bGUgdGV4dCB0byBkaXNwbGF5IGZvciBhIG5vZGUgY29ycmVzcG9uZGluZyB0byBhIGRhdGEgaXRlbS5cclxuICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XHJcbiAgICAgICAgdmFyIG1lcmdlZE9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIC4uLkJhc2VUcmVlLmRlZmF1bHRzLFxyXG4gICAgICAgICAgICAuLi5Cb3hlZFRyZWUuZGVmYXVsdHMsXHJcbiAgICAgICAgICAgIC4uLm9wdGlvbnNcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLl9nZXRCb2R5RGlzcGxheVRleHQgPSBtZXJnZWRPcHRpb25zLmdldEJvZHlEaXNwbGF5VGV4dDtcclxuICAgICAgICB0aGlzLl9nZXRUaXRsZURpc3BsYXlUZXh0ID0gbWVyZ2VkT3B0aW9ucy5nZXRUaXRsZURpc3BsYXlUZXh0O1xyXG4gICAgICAgIHRoaXMubm9kZVNldHRpbmdzID0gbmV3IEJveGVkTm9kZVNldHRpbmdzKHRoaXMsIG1lcmdlZE9wdGlvbnMubm9kZVNldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGluaGVyaXRkb2MgKi9cclxuICAgIGluaXRpYWxpemUoKSB7XHJcbiAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgdGhlIHN2ZywgYW5kIHNldCBpdHMgZGltZW5zaW9uc1xyXG4gICAgICAgIHRoaXMuZ2V0U3ZnKCkuY2xhc3NlZCgnYm94ZWQtdHJlZScsIHRydWUpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xyXG4gICAgX25vZGVFbnRlcihub2RlRW50ZXIsIG5vZGVzKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIC8vIERlY2xhcmUgYm94IGRpbWVuc2lvbnNcclxuICAgICAgICB2YXIgbm9kZUJvZHlCb3hXaWR0aCA9IHNlbGYubm9kZVNldHRpbmdzLmdldEJvZHlCb3hXaWR0aCgpO1xyXG4gICAgICAgIHZhciBub2RlQm9keUJveEhlaWdodCA9IHNlbGYubm9kZVNldHRpbmdzLmdldEJvZHlCb3hIZWlnaHQoKTtcclxuICAgICAgICB2YXIgbm9kZUJvZHlCb3hQYWRkaW5nID0gc2VsZi5ub2RlU2V0dGluZ3MuZ2V0Qm9keUJveFBhZGRpbmcoKTtcclxuXHJcbiAgICAgICAgdmFyIG5vZGVUaXRsZUJveFdpZHRoID0gc2VsZi5ub2RlU2V0dGluZ3MuZ2V0VGl0bGVCb3hXaWR0aCgpO1xyXG4gICAgICAgIHZhciBub2RlVGl0bGVCb3hIZWlnaHQgPSBzZWxmLm5vZGVTZXR0aW5ncy5nZXRUaXRsZUJveEhlaWdodCgpO1xyXG4gICAgICAgIHZhciBub2RlVGl0bGVCb3hQYWRkaW5nID0gc2VsZi5ub2RlU2V0dGluZ3MuZ2V0VGl0bGVCb3hQYWRkaW5nKCk7XHJcblxyXG4gICAgICAgIC8qIEFkZCBCb2R5IFJlY3RhbmdsZSBhbmQgVGV4dCBmb3IgTm9kZSAqL1xyXG4gICAgICAgIHZhciBib2R5R3JvdXBzID0gbm9kZUVudGVyLmFwcGVuZChcImdcIilcclxuICAgICAgICAgICAgLmNsYXNzZWQoXCJib2R5LWdyb3VwXCIsIHRydWUpO1xyXG5cclxuICAgICAgICBib2R5R3JvdXBzLmFwcGVuZChcInJlY3RcIilcclxuICAgICAgICAgICAgLmNsYXNzZWQoXCJib2R5LWJveFwiLCB0cnVlKVxyXG4gICAgICAgICAgICAuYXR0cihcIndpZHRoXCIsIDFlLTYpXHJcbiAgICAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIDFlLTYpO1xyXG5cclxuICAgICAgICBib2R5R3JvdXBzLmVhY2goZnVuY3Rpb24oZGF0YSwgaW5kZXgsIGFycikge1xyXG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXM7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBkMy5zZWxlY3QoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHZhciBzaW5nbGVkT3V0RGF0YSA9IFtdO1xyXG4gICAgICAgICAgICBzaW5nbGVkT3V0RGF0YS5wdXNoKGRhdGEpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHJlY2FsY3VsYXRlZFBhZGRpbmdUb3AgPSBub2RlQm9keUJveFBhZGRpbmcudG9wO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5nZXRUaXRsZURpc3BsYXlUZXh0LmNhbGwoc2VsZiwgZGF0YSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJlY2FsY3VsYXRlZFBhZGRpbmdUb3AgKz0gbm9kZVRpdGxlQm94SGVpZ2h0IC8gMjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gRDNQbHVzIFRleHRib3ggd2l0aCByZXNpemluZyBjYXBhYmlsaXR5XHJcbiAgICAgICAgICAgIHZhciBkM1BsdXNCb2R5VGV4dEJveCA9IG5ldyBkM1BsdXNUZXh0Qm94KClcclxuICAgICAgICAgICAgICAgIC5zZWxlY3QoZWxlbWVudCkgLy8gU2V0cyB0aGUgRDNQbHVzIGNvZGUgdG8gYXBwZW5kIHRvIHRoZSBzcGVjaWZpZWQgRE9NIGVsZW1lbnQuXHJcbiAgICAgICAgICAgICAgICAuZGF0YShzaW5nbGVkT3V0RGF0YSlcclxuICAgICAgICAgICAgICAgIC50ZXh0KChkYXRhLCBpbmRleCwgYXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0Qm9keURpc3BsYXlUZXh0LmNhbGwoc2VsZiwgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLnRleHRBbmNob3IoXCJtaWRkbGVcIilcclxuICAgICAgICAgICAgICAgIC52ZXJ0aWNhbEFsaWduKFwibWlkZGxlXCIpXHJcbiAgICAgICAgICAgICAgICAuZm9udFNpemUoMTMpIC8vIGluIHBpeGVsc1xyXG4gICAgICAgICAgICAgICAgLngobm9kZUJvZHlCb3hQYWRkaW5nLmxlZnQpXHJcbiAgICAgICAgICAgICAgICAueShyZWNhbGN1bGF0ZWRQYWRkaW5nVG9wIC0gbm9kZUJvZHlCb3hIZWlnaHQgLyAyKVxyXG4gICAgICAgICAgICAgICAgLndpZHRoKG5vZGVCb2R5Qm94V2lkdGggLSBub2RlQm9keUJveFBhZGRpbmcubGVmdCAtIG5vZGVCb2R5Qm94UGFkZGluZy5yaWdodClcclxuICAgICAgICAgICAgICAgIC5oZWlnaHQobm9kZUJvZHlCb3hIZWlnaHQgLSByZWNhbGN1bGF0ZWRQYWRkaW5nVG9wIC0gbm9kZUJvZHlCb3hQYWRkaW5nLmJvdHRvbSlcclxuICAgICAgICAgICAgICAgIC5lbGxpcHNpcygodGV4dCwgbGluZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRleHQgd2FzIGN1dC1vZmYsIGFkZCB0b29sdGlwXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmFwcGVuZChcInRpdGxlXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0KHNlbGYuZ2V0Qm9keURpc3BsYXlUZXh0KGRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCh0ZXh0LnJlcGxhY2UoL1xcLnwsJC9nLCBcIlwiKSkgKyBcIi4uLlwiKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAucmVuZGVyKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8qIEFkZCBUaXRsZSBSZWN0YW5nbGUgYW5kIFRleHQgZm9yIE5vZGUgKi9cclxuICAgICAgICB2YXIgdGl0bGVHcm91cHMgPSBub2RlRW50ZXIuYXBwZW5kKFwiZ1wiKVxyXG4gICAgICAgICAgICAuY2xhc3NlZChcInRpdGxlLWdyb3VwXCIsIHRydWUpXHJcbiAgICAgICAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKFwiICsgLW5vZGVUaXRsZUJveFdpZHRoIC8gMyArIFwiLCBcIiArICgtbm9kZVRpdGxlQm94SGVpZ2h0IC8gMiAtIG5vZGVCb2R5Qm94SGVpZ2h0IC8gMikgKyBcIilcIik7XHJcblxyXG4gICAgICAgIHRpdGxlR3JvdXBzLmVhY2goZnVuY3Rpb24oZGF0YSwgaW5kZXgsIGFycikge1xyXG4gICAgICAgICAgICBpZiAoIXNlbGYuZ2V0VGl0bGVEaXNwbGF5VGV4dC5jYWxsKHNlbGYsIGRhdGEpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXM7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSBkMy5zZWxlY3QoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHZhciBzaW5nbGVkT3V0RGF0YSA9IFtdO1xyXG4gICAgICAgICAgICBzaW5nbGVkT3V0RGF0YS5wdXNoKGRhdGEpO1xyXG5cclxuICAgICAgICAgICAgc2VsZWN0aW9uLmFwcGVuZChcInJlY3RcIilcclxuICAgICAgICAgICAgICAgIC5jbGFzc2VkKFwidGl0bGUtYm94XCIsIHRydWUpXHJcbiAgICAgICAgICAgICAgICAuYXR0cihcIndpZHRoXCIsIG5vZGVUaXRsZUJveFdpZHRoKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoXCJoZWlnaHRcIiwgbm9kZVRpdGxlQm94SGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEQzUGx1cyBUZXh0Ym94IHdpdGggcmVzaXppbmcgY2FwYWJpbGl0eVxyXG4gICAgICAgICAgICB2YXIgZDNQbHVzVGl0bGVUZXh0Qm94ID0gbmV3IGQzUGx1c1RleHRCb3goKVxyXG4gICAgICAgICAgICAgICAgLnNlbGVjdChlbGVtZW50KSAvLyBTZXRzIHRoZSBEM1BsdXMgY29kZSB0byBhcHBlbmQgdG8gdGhlIERPTSBlbGVtZW50LlxyXG4gICAgICAgICAgICAgICAgLmRhdGEoc2luZ2xlZE91dERhdGEpXHJcbiAgICAgICAgICAgICAgICAudGV4dCgoZGF0YSwgaW5kZXgsIGFycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmdldFRpdGxlRGlzcGxheVRleHQuY2FsbChzZWxmLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAudGV4dEFuY2hvcihcIm1pZGRsZVwiKVxyXG4gICAgICAgICAgICAgICAgLnZlcnRpY2FsQWxpZ24oXCJtaWRkbGVcIilcclxuICAgICAgICAgICAgICAgIC54KG5vZGVUaXRsZUJveFBhZGRpbmcubGVmdClcclxuICAgICAgICAgICAgICAgIC55KG5vZGVUaXRsZUJveFBhZGRpbmcudG9wKVxyXG4gICAgICAgICAgICAgICAgLmZvbnRXZWlnaHQoNzAwKVxyXG4gICAgICAgICAgICAgICAgLmZvbnRNaW4oNilcclxuICAgICAgICAgICAgICAgIC5mb250TWF4KDE2KVxyXG4gICAgICAgICAgICAgICAgLmZvbnRSZXNpemUodHJ1ZSkgLy8gUmVzaXplcyB0aGUgdGV4dCB0byBmaXQgdGhlIGNvbnRlbnRcclxuICAgICAgICAgICAgICAgIC53aWR0aChub2RlVGl0bGVCb3hXaWR0aCAtIG5vZGVUaXRsZUJveFBhZGRpbmcubGVmdCAtIG5vZGVUaXRsZUJveFBhZGRpbmcucmlnaHQpXHJcbiAgICAgICAgICAgICAgICAuaGVpZ2h0KG5vZGVUaXRsZUJveEhlaWdodCAtIG5vZGVUaXRsZUJveFBhZGRpbmcudG9wIC0gbm9kZVRpdGxlQm94UGFkZGluZy5ib3R0b20pXHJcbiAgICAgICAgICAgICAgICAucmVuZGVyKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHNlbGY7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXHJcbiAgICBfbm9kZVVwZGF0ZShub2RlVXBkYXRlLCBub2RlVXBkYXRlVHJhbnNpdGlvbiwgbm9kZXMpIHtcclxuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBwcm9wZXIgcG9zaXRpb24gZm9yIHRoZSBub2RlXHJcblxyXG4gICAgICAgIC8vIFRyYW5zbGF0aW5nIHdoaWxlIGludmVydGluZyBYL1kgdG9cclxuICAgICAgICAvLyBtYWtlIHRyZWUgZGlyZWN0aW9uIGZyb20gbGVmdCB0byByaWdodCxcclxuICAgICAgICAvLyBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIHRvcC10by1kb3duIHRyZWVcclxuICAgICAgICBpZiAodGhpcy5nZXRPcmllbnRhdGlvbigpLnRvTG93ZXJDYXNlKCkgPT09ICd0b3B0b2JvdHRvbScpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBub2RlVXBkYXRlVHJhbnNpdGlvbi5hdHRyKFwidHJhbnNmb3JtXCIsIChkYXRhLCBpbmRleCwgYXJyKSA9PiBcInRyYW5zbGF0ZShcIiArIGRhdGEueCArIFwiLFwiICsgZGF0YS55ICsgXCIpXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBub2RlVXBkYXRlVHJhbnNpdGlvbi5hdHRyKFwidHJhbnNmb3JtXCIsIChkYXRhLCBpbmRleCwgYXJyKSA9PiBcInRyYW5zbGF0ZShcIiArIGRhdGEueSArIFwiLFwiICsgZGF0YS54ICsgXCIpXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG5vZGVCb2R5Qm94V2lkdGggPSB0aGlzLm5vZGVTZXR0aW5ncy5nZXRCb2R5Qm94V2lkdGgoKTtcclxuICAgICAgICB2YXIgbm9kZUJvZHlCb3hIZWlnaHQgPSB0aGlzLm5vZGVTZXR0aW5ncy5nZXRCb2R5Qm94SGVpZ2h0KCk7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgbm9kZSBhdHRyaWJ1dGVzIGFuZCBzdHlsZVxyXG4gICAgICAgIG5vZGVVcGRhdGUuc2VsZWN0KFwiLm5vZGUgLmJvZHktZ3JvdXAgLmJvZHktYm94XCIpXHJcbiAgICAgICAgICAgIC5hdHRyKFwieVwiLCAtKG5vZGVCb2R5Qm94SGVpZ2h0IC8gMikpXHJcbiAgICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgbm9kZUJvZHlCb3hXaWR0aClcclxuICAgICAgICAgICAgLmF0dHIoXCJoZWlnaHRcIiwgbm9kZUJvZHlCb3hIZWlnaHQpO1xyXG5cclxuICAgICAgICBub2RlVXBkYXRlLnNlbGVjdChcIi5kM3BsdXMtdGV4dEJveFwiKVxyXG4gICAgICAgICAgICAuc3R5bGUoXCJmaWxsLW9wYWNpdHlcIiwgMSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXHJcbiAgICBfbm9kZUV4aXQobm9kZUV4aXQsIG5vZGVFeGl0VHJhbnNpdGlvbiwgbm9kZXMpIHtcclxuICAgICAgICB2YXIgbm9kZUJvZHlCb3hXaWR0aCA9IHRoaXMubm9kZVNldHRpbmdzLmdldEJvZHlCb3hXaWR0aCgpO1xyXG4gICAgICAgIHZhciBub2RlQm9keUJveEhlaWdodCA9IHRoaXMubm9kZVNldHRpbmdzLmdldEJvZHlCb3hIZWlnaHQoKTtcclxuXHJcbiAgICAgICAgbm9kZUV4aXRUcmFuc2l0aW9uLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgKGRhdGEsIGluZGV4LCBhcnIpID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBoaWdoZXN0Q29sbGFwc2luZ1BhcmVudCA9IGRhdGEucGFyZW50O1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGhpZ2hlc3RDb2xsYXBzaW5nUGFyZW50LnBhcmVudCAmJiAhaGlnaGVzdENvbGxhcHNpbmdQYXJlbnQucGFyZW50LmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaGlnaGVzdENvbGxhcHNpbmdQYXJlbnQgPSBoaWdoZXN0Q29sbGFwc2luZ1BhcmVudC5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0T3JpZW50YXRpb24oKS50b0xvd2VyQ2FzZSgpID09PSAndG9wdG9ib3R0b20nKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIChoaWdoZXN0Q29sbGFwc2luZ1BhcmVudC54ICsgbm9kZUJvZHlCb3hXaWR0aCAvIDIpICsgXCIsXCIgKyAoaGlnaGVzdENvbGxhcHNpbmdQYXJlbnQueSArIG5vZGVCb2R5Qm94SGVpZ2h0KSArIFwiKVwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zbGF0aW5nIHdoaWxlIGludmVydGluZyBYL1kgdG9cclxuICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHRyZWUgZGlyZWN0aW9uIGZyb20gbGVmdCB0byByaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIHRvcC10by1kb3duIHRyZWVcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyAoaGlnaGVzdENvbGxhcHNpbmdQYXJlbnQueSArIG5vZGVCb2R5Qm94V2lkdGgpICsgXCIsXCIgKyAoaGlnaGVzdENvbGxhcHNpbmdQYXJlbnQueCArIG5vZGVCb2R5Qm94SGVpZ2h0IC8gMikgKyBcIilcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnJlbW92ZSgpO1xyXG5cclxuICAgICAgICAvLyBPbiBleGl0IGFuaW1hdGUgb3V0XHJcbiAgICAgICAgbm9kZUV4aXRUcmFuc2l0aW9uLnNlbGVjdChcIi5ub2RlIC5ib2R5LWdyb3VwIHJlY3RcIilcclxuICAgICAgICAgICAgLmF0dHIoXCJ3aWR0aFwiLCAxZS02KVxyXG4gICAgICAgICAgICAuYXR0cihcImhlaWdodFwiLCAxZS02KTtcclxuXHJcbiAgICAgICAgbm9kZUV4aXRUcmFuc2l0aW9uLnNlbGVjdChcIi5ub2RlIC5ib2R5LWdyb3VwIC5kM3BsdXMtdGV4dEJveFwiKVxyXG4gICAgICAgICAgICAuc3R5bGUoXCJmaWxsLW9wYWNpdHlcIiwgMWUtNilcclxuICAgICAgICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgKGRhdGEsIGluZGV4LCBhcnIpID0+IFwidHJhbnNsYXRlKDAsXCIgKyAoLW5vZGVCb2R5Qm94SGVpZ2h0IC8gMikgKyBcIilcIilcclxuICAgICAgICAgICAgLnNlbGVjdEFsbChcInRleHRcIilcclxuICAgICAgICAgICAgICAgIC5zdHlsZShcImZvbnQtc2l6ZVwiLCAwKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoXCJ5XCIsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cihcInhcIiwgMCk7XHJcblxyXG4gICAgICAgIG5vZGVFeGl0VHJhbnNpdGlvbi5zZWxlY3QoXCIubm9kZSAudGl0bGUtZ3JvdXBcIilcclxuICAgICAgICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoMCwgXCIgKyAoLW5vZGVCb2R5Qm94SGVpZ2h0IC8gMikgKyBcIilcIik7XHJcblxyXG4gICAgICAgIG5vZGVFeGl0VHJhbnNpdGlvbi5zZWxlY3QoXCIubm9kZSAudGl0bGUtZ3JvdXAgcmVjdFwiKVxyXG4gICAgICAgICAgICAuYXR0cihcIndpZHRoXCIsIDFlLTYpXHJcbiAgICAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIDFlLTYpO1xyXG5cclxuICAgICAgICBub2RlRXhpdFRyYW5zaXRpb24uc2VsZWN0KFwiLm5vZGUgLnRpdGxlLWdyb3VwIC5kM3BsdXMtdGV4dEJveFwiKVxyXG4gICAgICAgICAgICAuc3R5bGUoXCJmaWxsLW9wYWNpdHlcIiwgMWUtNilcclxuICAgICAgICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoMCwwKVwiKVxyXG4gICAgICAgICAgICAuc2VsZWN0QWxsKFwidGV4dFwiKVxyXG4gICAgICAgICAgICAgICAgLnN0eWxlKFwiZm9udC1zaXplXCIsIDApXHJcbiAgICAgICAgICAgICAgICAuYXR0cihcInlcIiwgMClcclxuICAgICAgICAgICAgICAgIC5hdHRyKFwieFwiLCAwKTtcclxuXHJcbiAgICAgICAgLy8gT24gZXhpdCByZWR1Y2UgdGhlIG9wYWNpdHkgb2YgdGV4dCBsYWJlbHNcclxuICAgICAgICBub2RlRXhpdFRyYW5zaXRpb24uc2VsZWN0KFwiLmQzcGx1cy10ZXh0Qm94XCIpXHJcbiAgICAgICAgICAgIC5zdHlsZShcImZpbGwtb3BhY2l0eVwiLCAxZS02KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGluaGVyaXRkb2MgKi9cclxuICAgIF9nZXROb2RlU2l6ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5nZXRPcmllbnRhdGlvbigpLnRvTG93ZXJDYXNlKCkgPT09ICd0b3B0b2JvdHRvbScpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlU2V0dGluZ3MuZ2V0Qm9keUJveFdpZHRoKCkgKyB0aGlzLm5vZGVTZXR0aW5ncy5nZXRIb3Jpem9udGFsU3BhY2luZygpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlU2V0dGluZ3MuZ2V0Qm9keUJveEhlaWdodCgpICsgdGhpcy5ub2RlU2V0dGluZ3MuZ2V0VmVydGljYWxTcGFjaW5nKClcclxuICAgICAgICAgICAgXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgIHRoaXMubm9kZVNldHRpbmdzLmdldEJvZHlCb3hIZWlnaHQoKSArIHRoaXMubm9kZVNldHRpbmdzLmdldFZlcnRpY2FsU3BhY2luZygpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlU2V0dGluZ3MuZ2V0Qm9keUJveFdpZHRoKCkgKyB0aGlzLm5vZGVTZXR0aW5ncy5nZXRIb3Jpem9udGFsU3BhY2luZygpXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xyXG4gICAgX2xpbmtFbnRlcihzb3VyY2UsIGxpbmtFbnRlciwgbGlua3MsIGxpbmtQYXRoR2VuZXJhdG9yKVx0e1xyXG4gICAgICAgIGxpbmtFbnRlci5hdHRyKFwiZFwiLCAoZGF0YSwgaW5kZXgsIGFycikgPT4ge1xyXG4gICAgICAgICAgICB2YXIgc291cmNlQ29vcmRpbmF0ZSA9IHtcclxuICAgICAgICAgICAgICAgIHg6IHNvdXJjZS54MCxcclxuICAgICAgICAgICAgICAgIHk6IHNvdXJjZS55MFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdmFyIGNvb3JkaW5hdGVzT2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2VDb29yZGluYXRlLFxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBzb3VyY2VDb29yZGluYXRlXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJldHVybiBsaW5rUGF0aEdlbmVyYXRvcihjb29yZGluYXRlc09iamVjdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXHJcbiAgICBfbGlua1VwZGF0ZShzb3VyY2UsIGxpbmtVcGRhdGUsIGxpbmtVcGRhdGVUcmFuc2l0aW9uLCBsaW5rcywgbGlua1BhdGhHZW5lcmF0b3IpIHtcclxuICAgICAgICBsaW5rVXBkYXRlVHJhbnNpdGlvbi5hdHRyKFwiZFwiLCAoZGF0YSwgaW5kZXgsIGFycikgPT4ge1xyXG4gICAgICAgICAgICB2YXIgc291cmNlQ29vcmRpbmF0ZSA9IGRhdGE7XHJcbiAgICAgICAgICAgIHZhciB0YXJnZXRDb29yZGluYXRlID0gZGF0YS5wYXJlbnQ7XHJcblxyXG4gICAgICAgICAgICB2YXIgY29vcmRpbmF0ZXNPYmplY3QgPSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZUNvb3JkaW5hdGUsXHJcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldENvb3JkaW5hdGVcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBsaW5rUGF0aEdlbmVyYXRvcihjb29yZGluYXRlc09iamVjdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXHJcbiAgICBfbGlua0V4aXQoc291cmNlLCBsaW5rRXhpdCwgbGlua0V4aXRUcmFuc2l0aW9uLCBsaW5rcywgbGlua1BhdGhHZW5lcmF0b3IpIHtcclxuICAgICAgICBsaW5rRXhpdFRyYW5zaXRpb24uYXR0cihcImRcIiwgKGRhdGEsIGluZGV4LCBhcnIpID0+IHtcclxuICAgICAgICAgICAgdmFyIGhpZ2hlc3RDb2xsYXBzaW5nUGFyZW50ID0gZGF0YS5wYXJlbnQ7XHJcbiAgICAgICAgICAgIHdoaWxlIChoaWdoZXN0Q29sbGFwc2luZ1BhcmVudC5wYXJlbnQgJiYgIWhpZ2hlc3RDb2xsYXBzaW5nUGFyZW50LnBhcmVudC5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgaGlnaGVzdENvbGxhcHNpbmdQYXJlbnQgPSBoaWdoZXN0Q29sbGFwc2luZ1BhcmVudC5wYXJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZhciBzb3VyY2VDb29yZGluYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0T3JpZW50YXRpb24oKS50b0xvd2VyQ2FzZSgpID09PSAndG9wdG9ib3R0b20nKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbm9kZUJvZHlCb3hIZWlnaHQgPSB0aGlzLm5vZGVTZXR0aW5ncy5nZXRCb2R5Qm94SGVpZ2h0KCk7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2VDb29yZGluYXRlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IGhpZ2hlc3RDb2xsYXBzaW5nUGFyZW50LngsXHJcbiAgICAgICAgICAgICAgICAgICAgeTogaGlnaGVzdENvbGxhcHNpbmdQYXJlbnQueSArIG5vZGVCb2R5Qm94SGVpZ2h0XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIG5vZGVCb2R5Qm94V2lkdGggPSB0aGlzLm5vZGVTZXR0aW5ncy5nZXRCb2R5Qm94V2lkdGgoKTtcclxuICAgICAgICAgICAgICAgIHNvdXJjZUNvb3JkaW5hdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDogaGlnaGVzdENvbGxhcHNpbmdQYXJlbnQueCxcclxuICAgICAgICAgICAgICAgICAgICB5OiBoaWdoZXN0Q29sbGFwc2luZ1BhcmVudC55ICsgbm9kZUJvZHlCb3hXaWR0aFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHRhcmdldENvb3JkaW5hdGUgPSB7XHJcbiAgICAgICAgICAgICAgICB4OiBoaWdoZXN0Q29sbGFwc2luZ1BhcmVudC54LFxyXG4gICAgICAgICAgICAgICAgeTogaGlnaGVzdENvbGxhcHNpbmdQYXJlbnQueVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdmFyIGNvb3JkaW5hdGVzT2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2VDb29yZGluYXRlLFxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRDb29yZGluYXRlXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbGlua1BhdGhHZW5lcmF0b3IoY29vcmRpbmF0ZXNPYmplY3QpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xyXG4gICAgX2dldExpbmtQYXRoR2VuZXJhdG9yKCkge1xyXG4gICAgICAgIC8vIERlY2xhcmUgYm94IGRpbWVuc2lvbnNcclxuICAgICAgICB2YXIgbm9kZUJvZHlCb3hXaWR0aCA9IHRoaXMubm9kZVNldHRpbmdzLmdldEJvZHlCb3hXaWR0aCgpO1xyXG4gICAgICAgIHZhciBub2RlQm9keUJveEhlaWdodCA9IHRoaXMubm9kZVNldHRpbmdzLmdldEJvZHlCb3hIZWlnaHQoKTtcclxuXHJcbiAgICAgICAgLy8gV2Ugc3BlY2lmeSBhcnJvdyBmdW5jdGlvbnMgdGhhdCByZXR1cm5zXHJcbiAgICAgICAgLy8gYW4gYXJyYXkgc3BlY2lmeWluZyBob3cgdG8gZ2V0IHRoZVxyXG4gICAgICAgIC8vIHRoZSB4L3kgY29yZGluYXRlcyBmcm9tIHRoZSBvYmplY3QsXHJcbiAgICAgICAgLy8gaW4gdGhlIGZvcm1hdCBvZiBbeCwgeV0sIHRoZSBkZWZhdWx0XHJcbiAgICAgICAgLy8gZm9ybWF0IGZvciB0aGUgbGluayBnZW5lcmF0b3IgdG9cclxuICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgcGF0aFxyXG4gICAgICAgIGlmICh0aGlzLmdldE9yaWVudGF0aW9uKCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RvcHRvYm90dG9tJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBkMy5saW5rVmVydGljYWwoKVxyXG4gICAgICAgICAgICAgICAgLnNvdXJjZSgoZGF0YSkgPT4gW2RhdGEuc291cmNlLnggKyBub2RlQm9keUJveFdpZHRoIC8gMiwgZGF0YS5zb3VyY2UueSAtIG5vZGVCb2R5Qm94SGVpZ2h0IC8gMl0pXHJcbiAgICAgICAgICAgICAgICAudGFyZ2V0KChkYXRhKSA9PiBbZGF0YS50YXJnZXQueCArIG5vZGVCb2R5Qm94V2lkdGggLyAyLCBkYXRhLnRhcmdldC55ICsgbm9kZUJvZHlCb3hIZWlnaHQgLyAyXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBkMy5saW5rSG9yaXpvbnRhbCgpXHJcbiAgICAgICAgICAgICAgICAvLyBJbnZlcnRzIHRoZSBYL1kgY29vcmRpbmF0ZXMgdG8gZHJhdyBsaW5rcyBmb3IgYVxyXG4gICAgICAgICAgICAgICAgLy8gdHJlZSBzdGFydGluZyBmcm9tIGxlZnQgdG8gcmlnaHQsXHJcbiAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHRoZSB0eXBpY2FsIHRvcC10by1kb3duIHRyZWVcclxuICAgICAgICAgICAgICAgIC5zb3VyY2UoKGRhdGEpID0+IFtkYXRhLnNvdXJjZS55LCBkYXRhLnNvdXJjZS54XSlcclxuICAgICAgICAgICAgICAgIC50YXJnZXQoKGRhdGEpID0+IFtkYXRhLnRhcmdldC55ICsgbm9kZUJvZHlCb3hXaWR0aCwgZGF0YS50YXJnZXQueF0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGluaGVyaXRkb2MgKi9cclxuICAgIHZhbGlkYXRlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgc3VwZXIudmFsaWRhdGVTZXR0aW5ncygpO1xyXG4gICAgICAgIGlmICghdGhpcy5fZ2V0Qm9keURpc3BsYXlUZXh0KVxyXG4gICAgICAgICAgICB0aHJvdyBcIk5lZWQgdG8gZGVmaW5lIHRoZSBnZXRCb2R5RGlzcGxheVRleHQgZnVuY3Rpb24gYXMgcGFydCBvZiB0aGUgb3B0aW9uc1wiO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYm9keSBkaXNwbGF5IHRleHQgYWNjZXNzb3IsXHJcbiAgICAgKiB1c2VkIHRvIGdldCB0aGUgYm9keSBkaXNwbGF5IHRleHRcclxuICAgICAqIGZvciB0aGUgbm9kZXMuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Ym9keURpc3BsYXlUZXh0QWNjZXNzb3JDYWxsQmFja30gbmV3Qm9keURpc3BsYXlUZXh0QWNjZXNzb3IgXHJcbiAgICAgKi9cclxuICAgIHNldEJvZHlEaXNwbGF5VGV4dEFjY2Vzc29yKG5ld0JvZHlEaXNwbGF5VGV4dEFjY2Vzc29yKSB7XHJcbiAgICAgICAgdGhpcy5fZ2V0Qm9keURpc3BsYXlUZXh0ID0gbmV3Qm9keURpc3BsYXlUZXh0QWNjZXNzb3I7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBib2R5IGRpc3BsYXkgdGV4dCBmb3IgYSBnaXZlbiBkYXRhIGl0ZW0uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRGF0YUl0ZW0gVGhlIGRhdGEgaXRlbSB0byBnZXQgdGhlIGJvZHkgZGlzcGxheSB0ZXh0IGZyb20uXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYm9keSBkaXNwbGF5IHRleHQgdG8gcmVuZGVyIGZvciB0aGUgbm9kZS5cclxuICAgICAqL1xyXG4gICAgZ2V0Qm9keURpc3BsYXlUZXh0KG5vZGVEYXRhSXRlbSkge1xyXG4gICAgICAgIC8vIE5vdGUgdGhhdCBkYXRhIGluIHRoaXMgY29udGV4dCByZWZlcnMgdG8gRDMgVHJlZSBkYXRhLCBub3QgdGhlIG9yaWdpbmFsIGl0ZW0gZGF0YVxyXG4gICAgICAgIC8vIFRvIEFjY2VzcyB0aGUgb3JpZ2luYWwgaXRlbSBkYXRhLCB1c2UgdGhlIFwiLmRhdGFcIiBwcm9wZXJ0eVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRCb2R5RGlzcGxheVRleHQobm9kZURhdGFJdGVtLmRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGl0bGUgZGlzcGxheSB0ZXh0IGFjY2Vzc29yLFxyXG4gICAgICogdXNlZCB0byBnZXQgdGhlIHRpdGxlIGRpc3BsYXkgdGV4dFxyXG4gICAgICogZm9yIHRoZSBub2Rlcy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHt0aXRsZURpc3BsYXlUZXh0QWNjZXNzb3JDYWxsQmFja30gbmV3VGl0bGVEaXNwbGF5VGV4dEFjY2Vzc29yIFxyXG4gICAgICovXHJcbiAgICBzZXRUaXRsZURpc3BsYXlUZXh0QWNjZXNzb3IobmV3VGl0bGVEaXNwbGF5VGV4dEFjY2Vzc29yKSB7XHJcbiAgICAgICAgdGhpcy5fZ2V0VGl0bGVEaXNwbGF5VGV4dCA9IG5ld1RpdGxlRGlzcGxheVRleHRBY2Nlc3NvcjtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHRpdGxlIGRpc3BsYXkgdGV4dCBmb3IgYSBnaXZlbiBkYXRhIGl0ZW0uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRGF0YUl0ZW0gVGhlIEQzIG5vZGUgZGF0YSBpdGVtIHRvIGdldCB0aGUgdGl0bGUgZGlzcGxheSB0ZXh0IGZyb20uXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgdGl0bGUgZGlzcGxheSB0ZXh0IHRvIHJlbmRlciBmb3IgdGhlIG5vZGUuXHJcbiAgICAgKi9cclxuICAgIGdldFRpdGxlRGlzcGxheVRleHQobm9kZURhdGFJdGVtKSB7XHJcbiAgICAgICAgLy8gTm90ZSB0aGF0IGRhdGEgaW4gdGhpcyBjb250ZXh0IHJlZmVycyB0byBEMyBUcmVlIGRhdGEsIG5vdCB0aGUgb3JpZ2luYWwgaXRlbSBkYXRhXHJcbiAgICAgICAgLy8gVG8gQWNjZXNzIHRoZSBvcmlnaW5hbCBpdGVtIGRhdGEsIHVzZSB0aGUgXCIuZGF0YVwiIHByb3BlcnR5XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRpdGxlRGlzcGxheVRleHQobm9kZURhdGFJdGVtLmRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xyXG4gICAgY2VudGVyTm9kZShub2RlRGF0YUl0ZW0pIHtcclxuICAgICAgICB2YXIgbm9kZUJvZHlCb3hXaWR0aCA9IHRoaXMubm9kZVNldHRpbmdzLmdldEJvZHlCb3hXaWR0aCgpO1xyXG4gICAgICAgIHZhciBub2RlQm9keUJveEhlaWdodCA9IHRoaXMubm9kZVNldHRpbmdzLmdldEJvZHlCb3hIZWlnaHQoKTtcclxuICAgICAgICBpZiAodGhpcy5nZXRPcmllbnRhdGlvbigpLnRvTG93ZXJDYXNlKCkgPT09ICd0b3B0b2JvdHRvbScpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBub2RlRGF0YUl0ZW0ueDAgPSBub2RlRGF0YUl0ZW0ueDA7XHJcbiAgICAgICAgICAgIG5vZGVEYXRhSXRlbS55MCA9IG5vZGVEYXRhSXRlbS55MCArIG5vZGVCb2R5Qm94SGVpZ2h0IC8gMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbm9kZURhdGFJdGVtLnkwID0gbm9kZURhdGFJdGVtLnkwICsgbm9kZUJvZHlCb3hXaWR0aCAvIDI7XHJcbiAgICAgICAgICAgIG5vZGVEYXRhSXRlbS54MCA9IG5vZGVEYXRhSXRlbS54MDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmNlbnRlck5vZGUobm9kZURhdGFJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZXMgaG93IHRvIG9idGFpbiB0aGUgYm9keSB0ZXh0XHJcbiAgICAgKiB0byBkaXNwbGF5IGZvciBhIG5vZGUgY29ycmVzcG9uZGluZ1xyXG4gICAgICogdG8gYSBkYXRhIGl0ZW0uXHJcbiAgICAgKiBcclxuICAgICAqIEBjYWxsYmFjayBib2R5RGlzcGxheVRleHRBY2Nlc3NvckNhbGxCYWNrXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSBUaGUgZGF0YSBpdGVtIHRvIGdldCB0aGUgYm9keSBkaXNwbGF5IHRleHQgZnJvbS5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBib2R5IGRpc3BsYXkgdGV4dCB0byByZW5kZXIgZm9yIHRoZSBub2RlLlxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmVzIGhvdyB0byBvYnRhaW4gdGhlIHRpdGxlIHRleHRcclxuICAgICAqIHRvIGRpc3BsYXkgZm9yIGEgbm9kZSBjb3JyZXNwb25kaW5nXHJcbiAgICAgKiB0byBhIGRhdGEgaXRlbS5cclxuICAgICAqIFxyXG4gICAgICogQGNhbGxiYWNrIHRpdGxlRGlzcGxheVRleHRBY2Nlc3NvckNhbGxCYWNrXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSBUaGUgZGF0YSBpdGVtIHRvIGdldCB0aGUgdGl0bGUgZGlzcGxheSB0ZXh0IGZyb20uXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgdGl0bGUgZGlzcGxheSB0ZXh0IHRvIHJlbmRlciBmb3IgdGhlIG5vZGUuXHJcbiAgICAgKi9cclxufVxyXG5cclxuQm94ZWRUcmVlLmRlZmF1bHRzID0ge1xyXG4gICAgZ2V0Qm9keURpc3BsYXlUZXh0OiBudWxsLFxyXG4gICAgZ2V0VGl0bGVEaXNwbGF5VGV4dDogKGRhdGFJdGVtKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJveGVkVHJlZTsiLCJpbXBvcnQgTm9kZVNldHRpbmdzIGZyb20gJy4vTm9kZVNldHRpbmdzJztcclxuXHJcbmNsYXNzIENpcmNsZU5vZGVTZXR0aW5ncyBleHRlbmRzIE5vZGVTZXR0aW5ncyB7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENpcmNsZU5vZGVTZXR0aW5nczsiLCJpbXBvcnQgZDMgZnJvbSAnLi9DdXN0b21EMyc7XHJcbmltcG9ydCBCYXNlVHJlZSBmcm9tICcuL0Jhc2VUcmVlJztcclxuaW1wb3J0IENpcmNsZU5vZGVTZXR0aW5ncyBmcm9tICcuL0NpcmNsZU5vZGVTZXR0aW5ncyc7XHJcblxyXG5jbGFzcyBDaXJjbGVUcmVlIGV4dGVuZHMgQmFzZVRyZWV7XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtkaXNwbGF5VGV4dEFjY2Vzc29yQ2FsbEJhY2t9IFtvcHRpb25zLmdldERpc3BsYXlUZXh0XSBEZXRlcm1pbmVzIGhvdyB0byBvYnRhaW4gdGhlIHRleHQgdG8gZGlzcGxheSBmb3IgYSBub2RlIGNvcnJlc3BvbmRpbmcgdG8gYSBkYXRhIGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zKTtcclxuICAgICAgICB2YXIgbWVyZ2VkT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgLi4uQmFzZVRyZWUuZGVmYXVsdHMsXHJcbiAgICAgICAgICAgIC4uLkNpcmNsZVRyZWUuZGVmYXVsdHMsXHJcbiAgICAgICAgICAgIC4uLm9wdGlvbnNcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLl9nZXREaXNwbGF5VGV4dCA9IG1lcmdlZE9wdGlvbnMuZ2V0RGlzcGxheVRleHQ7XHJcbiAgICAgICAgdGhpcy5ub2RlU2V0dGluZ3MgPSBuZXcgQ2lyY2xlTm9kZVNldHRpbmdzKHRoaXMsIG1lcmdlZE9wdGlvbnMubm9kZVNldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGluaGVyaXRkb2MgKi9cclxuICAgIGluaXRpYWxpemUoKSB7XHJcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBzdmcsIGFuZCBzZXQgaXRzIGRpbWVuc2lvbnNcclxuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgdGhpcy5nZXRTdmcoKS5jbGFzc2VkKCdjaXJjbGUtdHJlZScsIHRydWUpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xyXG4gICAgX25vZGVFbnRlcihub2RlRW50ZXIsIG5vZGVzKSB7XHJcbiAgICAgICAgLy8gQWRkIENpcmNsZSBmb3IgdGhlIG5vZGVzXHJcbiAgICAgICAgbm9kZUVudGVyLmFwcGVuZChcImNpcmNsZVwiKVxyXG4gICAgICAgICAgICAuYXR0cihcInJcIiwgMWUtNik7XHJcblxyXG4gICAgICAgIC8vIEFkZCBsYWJlbHMgZm9yIHRoZSBub2Rlc1xyXG4gICAgICAgIG5vZGVFbnRlci5hcHBlbmQoXCJ0ZXh0XCIpXHJcbiAgICAgICAgICAgIC50ZXh0KChkYXRhLCBpbmRleCwgYXJyKSA9PiB0aGlzLmdldERpc3BsYXlUZXh0LmNhbGwodGhpcywgZGF0YSkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xyXG4gICAgX25vZGVVcGRhdGUobm9kZVVwZGF0ZSwgbm9kZVVwZGF0ZVRyYW5zaXRpb24sIG5vZGVzKSB7XHJcbiAgICAgICAgbm9kZVVwZGF0ZS5jbGFzc2VkKCdtaWRkbGUnLCAoZGF0YSwgaW5kZXgsIGFycikgPT4ge1xyXG4gICAgICAgICAgICB2YXIgaXNNaWRkbGVDaGlsZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5wYXJlbnQgJiYgZGF0YS5wYXJlbnQuY2hpbGRyZW4ubGVuZ3RoICUgMiAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHNpYmxpbmdzID0gZGF0YS5wYXJlbnQuY2hpbGRyZW47XHJcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXhPZlNpYmxpbmdzID0gc2libGluZ3MuaW5kZXhPZihkYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleE9mU2libGluZ3MgPT09IE1hdGguZmxvb3Ioc2libGluZ3MubGVuZ3RoIC8gMikpXHJcbiAgICAgICAgICAgICAgICAgICAgaXNNaWRkbGVDaGlsZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGlzTWlkZGxlQ2hpbGQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIHByb3BlciBwb3NpdGlvbiBmb3IgdGhlIG5vZGVcclxuXHJcbiAgICAgICAgLy8gVHJhbnNsYXRpbmcgd2hpbGUgaW52ZXJ0aW5nIFgvWSB0b1xyXG4gICAgICAgIC8vIG1ha2UgdHJlZSBkaXJlY3Rpb24gZnJvbSBsZWZ0IHRvIHJpZ2h0LFxyXG4gICAgICAgIC8vIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgdG9wLXRvLWRvd24gdHJlZVxyXG4gICAgICAgIGlmICh0aGlzLmdldE9yaWVudGF0aW9uKCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RvcHRvYm90dG9tJylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5vZGVVcGRhdGVUcmFuc2l0aW9uLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgKGRhdGEsIGluZGV4LCBhcnIpID0+IFwidHJhbnNsYXRlKFwiICsgZGF0YS54ICsgXCIsXCIgKyBkYXRhLnkgKyBcIilcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5vZGVVcGRhdGVUcmFuc2l0aW9uLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgKGRhdGEsIGluZGV4LCBhcnIpID0+IFwidHJhbnNsYXRlKFwiICsgZGF0YS55ICsgXCIsXCIgKyBkYXRhLnggKyBcIilcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBub2RlVXBkYXRlLnNlbGVjdChcInRleHRcIilcclxuICAgICAgICAgICAgLnN0eWxlKFwiZmlsbC1vcGFjaXR5XCIsIDEpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW5oZXJpdGRvYyAqL1xyXG4gICAgX25vZGVFeGl0KG5vZGVFeGl0LCBub2RlRXhpdFRyYW5zaXRpb24sIG5vZGVzKSB7XHJcbiAgICAgICAgLy8gUmVtb3ZlIGFueSBleGl0aW5nIG5vZGVzXHJcbiAgICAgICAgbm9kZUV4aXRUcmFuc2l0aW9uLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgKGRhdGEsIGluZGV4LCBhcnIpID0+IHtcclxuICAgICAgICAgICAgdmFyIGhpZ2hlc3RDb2xsYXBzaW5nUGFyZW50ID0gZGF0YS5wYXJlbnQ7XHJcbiAgICAgICAgICAgIHdoaWxlIChoaWdoZXN0Q29sbGFwc2luZ1BhcmVudC5wYXJlbnQgJiYgIWhpZ2hlc3RDb2xsYXBzaW5nUGFyZW50LnBhcmVudC5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgaGlnaGVzdENvbGxhcHNpbmdQYXJlbnQgPSBoaWdoZXN0Q29sbGFwc2luZ1BhcmVudC5wYXJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFRyYW5zbGF0aW5nIHdoaWxlIGludmVydGluZyBYL1kgdG9cclxuICAgICAgICAgICAgLy8gbWFrZSB0cmVlIGRpcmVjdGlvbiBmcm9tIGxlZnQgdG8gcmlnaHQsXHJcbiAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgdG9wLXRvLWRvd24gdHJlZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRPcmllbnRhdGlvbigpLnRvTG93ZXJDYXNlKCkgPT09ICd0b3B0b2JvdHRvbScpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIGhpZ2hlc3RDb2xsYXBzaW5nUGFyZW50LnggKyBcIixcIiArIGhpZ2hlc3RDb2xsYXBzaW5nUGFyZW50LnkgKyBcIilcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIGhpZ2hlc3RDb2xsYXBzaW5nUGFyZW50LnkgKyBcIixcIiArIGhpZ2hlc3RDb2xsYXBzaW5nUGFyZW50LnggKyBcIilcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnJlbW92ZSgpO1xyXG5cclxuICAgICAgICAvLyBPbiBleGl0IHJlZHVjZSB0aGUgbm9kZSBjaXJjbGVzIHNpemUgdG8gMFxyXG4gICAgICAgIG5vZGVFeGl0VHJhbnNpdGlvbi5zZWxlY3QoXCJjaXJjbGVcIilcclxuICAgICAgICAgICAgLmF0dHIoXCJyXCIsIDFlLTYpO1xyXG5cclxuICAgICAgICAvLyBPbiBleGl0IHJlZHVjZSB0aGUgb3BhY2l0eSBvZiB0ZXh0IGxhYmVsc1xyXG4gICAgICAgIG5vZGVFeGl0VHJhbnNpdGlvbi5zZWxlY3QoXCJ0ZXh0XCIpXHJcbiAgICAgICAgICAgIC5zdHlsZShcImZpbGwtb3BhY2l0eVwiLCAxZS02KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGluaGVyaXRkb2MgKi9cclxuICAgIF9nZXROb2RlU2l6ZSgpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB0aGlzLm5vZGVTZXR0aW5ncy5nZXRWZXJ0aWNhbFNwYWNpbmcoKSxcclxuICAgICAgICAgICAgdGhpcy5ub2RlU2V0dGluZ3MuZ2V0SG9yaXpvbnRhbFNwYWNpbmcoKVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXHJcbiAgICBfbGlua0VudGVyKHNvdXJjZSwgbGlua0VudGVyLCBsaW5rcywgbGlua1BhdGhHZW5lcmF0b3IpXHR7XHJcbiAgICAgICAgbGlua0VudGVyLmF0dHIoXCJkXCIsIChkYXRhLCBpbmRleCwgYXJyKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzb3VyY2VDb29yZGluYXRlID0ge1xyXG4gICAgICAgICAgICAgICAgeDogc291cmNlLngwLFxyXG4gICAgICAgICAgICAgICAgeTogc291cmNlLnkwXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB2YXIgY29vcmRpbmF0ZXNPYmplY3QgPSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZUNvb3JkaW5hdGUsXHJcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHNvdXJjZUNvb3JkaW5hdGVcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBsaW5rUGF0aEdlbmVyYXRvcihjb29yZGluYXRlc09iamVjdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXHJcbiAgICBfbGlua1VwZGF0ZShzb3VyY2UsIGxpbmtVcGRhdGUsIGxpbmtVcGRhdGVUcmFuc2l0aW9uLCBsaW5rcywgbGlua1BhdGhHZW5lcmF0b3IpIHtcclxuICAgICAgICBsaW5rVXBkYXRlVHJhbnNpdGlvbi5hdHRyKFwiZFwiLCAoZGF0YSwgaW5kZXgsIGFycikgPT4ge1xyXG4gICAgICAgICAgICB2YXIgc291cmNlQ29vcmRpbmF0ZSA9IGRhdGE7XHJcbiAgICAgICAgICAgIHZhciB0YXJnZXRDb29yZGluYXRlID0gZGF0YS5wYXJlbnQ7XHJcblxyXG4gICAgICAgICAgICB2YXIgY29vcmRpbmF0ZXNPYmplY3QgPSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZUNvb3JkaW5hdGUsXHJcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldENvb3JkaW5hdGVcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBsaW5rUGF0aEdlbmVyYXRvcihjb29yZGluYXRlc09iamVjdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbmhlcml0ZG9jICovXHJcbiAgICBfbGlua0V4aXQoc291cmNlLCBsaW5rRXhpdCwgbGlua0V4aXRUcmFuc2l0aW9uLCBsaW5rcywgbGlua1BhdGhHZW5lcmF0b3IpIHtcclxuICAgICAgICBsaW5rRXhpdFRyYW5zaXRpb24uYXR0cihcImRcIiwgKGRhdGEsIGluZGV4LCBhcnIpID0+IHtcclxuICAgICAgICAgICAgdmFyIGhpZ2hlc3RDb2xsYXBzaW5nUGFyZW50ID0gZGF0YS5wYXJlbnQ7XHJcbiAgICAgICAgICAgIHdoaWxlIChoaWdoZXN0Q29sbGFwc2luZ1BhcmVudC5wYXJlbnQgJiYgIWhpZ2hlc3RDb2xsYXBzaW5nUGFyZW50LnBhcmVudC5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgaGlnaGVzdENvbGxhcHNpbmdQYXJlbnQgPSBoaWdoZXN0Q29sbGFwc2luZ1BhcmVudC5wYXJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHNvdXJjZUNvb3JkaW5hdGUgPSB7XHJcbiAgICAgICAgICAgICAgICB4OiBoaWdoZXN0Q29sbGFwc2luZ1BhcmVudC54LFxyXG4gICAgICAgICAgICAgICAgeTogaGlnaGVzdENvbGxhcHNpbmdQYXJlbnQueVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdmFyIHRhcmdldENvb3JkaW5hdGUgPSB7XHJcbiAgICAgICAgICAgICAgICB4OiBoaWdoZXN0Q29sbGFwc2luZ1BhcmVudC54LFxyXG4gICAgICAgICAgICAgICAgeTogaGlnaGVzdENvbGxhcHNpbmdQYXJlbnQueVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdmFyIGNvb3JkaW5hdGVzT2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2VDb29yZGluYXRlLFxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRDb29yZGluYXRlXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbGlua1BhdGhHZW5lcmF0b3IoY29vcmRpbmF0ZXNPYmplY3QpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGluaGVyaXRkb2MgKi9cclxuICAgIF9nZXRMaW5rUGF0aEdlbmVyYXRvcigpIHtcclxuICAgICAgICAvLyBXZSBzcGVjaWZ5IGFycm93IGZ1bmN0aW9ucyB0aGF0IHJldHVybnNcclxuICAgICAgICAvLyBhbiBhcnJheSBzcGVjaWZ5aW5nIGhvdyB0byBnZXQgdGhlXHJcbiAgICAgICAgLy8gdGhlIHgveSBjb3JkaW5hdGVzIGZyb20gdGhlIG9iamVjdCxcclxuICAgICAgICAvLyBpbiB0aGUgZm9ybWF0IG9mIFt4LCB5XSwgdGhlIGRlZmF1bHRcclxuICAgICAgICAvLyBmb3JtYXQgZm9yIHRoZSBsaW5rIGdlbmVyYXRvciB0b1xyXG4gICAgICAgIC8vIGdlbmVyYXRlIHRoZSBwYXRoXHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0T3JpZW50YXRpb24oKS50b0xvd2VyQ2FzZSgpID09PSAndG9wdG9ib3R0b20nKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIGQzLmxpbmtWZXJ0aWNhbCgpXHJcbiAgICAgICAgICAgICAgICAuc291cmNlKChkYXRhKSA9PiBbZGF0YS5zb3VyY2UueCwgZGF0YS5zb3VyY2UueV0pXHJcbiAgICAgICAgICAgICAgICAudGFyZ2V0KChkYXRhKSA9PiBbZGF0YS50YXJnZXQueCwgZGF0YS50YXJnZXQueV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gZDMubGlua0hvcml6b250YWwoKVxyXG4gICAgICAgICAgICAgICAgLy8gSW52ZXJ0cyB0aGUgWC9ZIGNvb3JkaW5hdGVzIHRvIGRyYXcgbGlua3MgZm9yIGFcclxuICAgICAgICAgICAgICAgIC8vIHRyZWUgc3RhcnRpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0LFxyXG4gICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgdHlwaWNhbCB0b3AtdG8tZG93biB0cmVlXHJcbiAgICAgICAgICAgICAgICAuc291cmNlKChkYXRhKSA9PiBbZGF0YS5zb3VyY2UueSwgZGF0YS5zb3VyY2UueF0pXHJcbiAgICAgICAgICAgICAgICAudGFyZ2V0KChkYXRhKSA9PiBbZGF0YS50YXJnZXQueSwgZGF0YS50YXJnZXQueF0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGluaGVyaXRkb2MgKi9cclxuICAgIHZhbGlkYXRlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgc3VwZXIudmFsaWRhdGVTZXR0aW5ncygpO1xyXG4gICAgICAgIGlmICghdGhpcy5nZXREaXNwbGF5VGV4dClcclxuICAgICAgICAgICAgdGhyb3cgXCJOZWVkIHRvIGRlZmluZSB0aGUgZ2V0RGlzcGxheVRleHQgZnVuY3Rpb24gYXMgcGFydCBvZiB0aGUgb3B0aW9uc1wiO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgZGlzcGxheSB0ZXh0IGFjY2Vzc29yLFxyXG4gICAgICogdXNlZCB0byBnZXQgdGhlIGRpc3BsYXkgdGV4dFxyXG4gICAgICogZm9yIHRoZSBub2Rlcy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtkaXNwbGF5VGV4dEFjY2Vzc29yQ2FsbEJhY2t9IG5ld0Rpc3BsYXlUZXh0QWNjZXNzb3IgXHJcbiAgICAgKi9cclxuICAgIHNldERpc3BsYXlUZXh0QWNjZXNzb3IobmV3RGlzcGxheVRleHRBY2Nlc3Nvcikge1xyXG4gICAgICAgIHRoaXMuX2dldERpc3BsYXlUZXh0ID0gbmV3RGlzcGxheVRleHRBY2Nlc3NvcjtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGRpc3BsYXkgdGV4dCBmb3IgYSBnaXZlbiBkYXRhIGl0ZW0uXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRGF0YUl0ZW0gVGhlIGRhdGEgaXRlbSB0byBnZXQgdGhlIGRpc3BsYXkgdGV4dCBmcm9tLlxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGRpc3BsYXkgdGV4dCB0byByZW5kZXIgZm9yIHRoZSBub2RlLlxyXG4gICAgICovXHJcbiAgICBnZXREaXNwbGF5VGV4dChub2RlRGF0YUl0ZW0pIHtcclxuICAgICAgICAvLyBOb3RlIHRoYXQgZGF0YSBpbiB0aGlzIGNvbnRleHQgcmVmZXJzIHRvIEQzIFRyZWUgZGF0YSwgbm90IHRoZSBvcmlnaW5hbCBpdGVtIGRhdGFcclxuICAgICAgICAvLyBUbyBBY2Nlc3MgdGhlIG9yaWdpbmFsIGl0ZW0gZGF0YSwgdXNlIHRoZSBcIi5kYXRhXCIgcHJvcGVydHlcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RGlzcGxheVRleHQobm9kZURhdGFJdGVtLmRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyBob3cgdG8gb2J0YWluIHRoZSB0ZXh0XHJcbiAgICAgKiB0byBkaXNwbGF5IGZvciBhIG5vZGUgY29ycmVzcG9uZGluZ1xyXG4gICAgICogdG8gYSBkYXRhIGl0ZW0uXHJcbiAgICAgKiBcclxuICAgICAqIEBjYWxsYmFjayBkaXNwbGF5VGV4dEFjY2Vzc29yQ2FsbEJhY2tcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIFRoZSBkYXRhIGl0ZW0gdG8gZ2V0IHRoZSBkaXNwbGF5IHRleHQgZnJvbS5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBkaXNwbGF5IHRleHQgdG8gcmVuZGVyIGZvciB0aGUgbm9kZS5cclxuICAgICAqL1xyXG59XHJcblxyXG5DaXJjbGVUcmVlLmRlZmF1bHRzID0ge1xyXG4gICAgZ2V0RGlzcGxheVRleHQ6IChub2RlRGF0YUl0ZW0pID0+IG51bGxcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ2lyY2xlVHJlZTsiLCIvKipcclxuICogV2Ugb25seSBpbXBvcnQgdGhlIG5lY2Vzc2FyeSBtb2R1bGVzXHJcbiAqIGZyb20gRDMsIHRvIGtlZXAgcmVzdWx0aW5nIGJ1bmRkZWRcclxuICogSlMgZmlsZXMgbWluaW1hbCBpbiBzaXplLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IHNlbGVjdCwgc2VsZWN0QWxsLCBldmVudCB9IGZyb20gJ2QzLXNlbGVjdGlvbidcclxuaW1wb3J0ICogYXMgaGllcmFyY2h5IGZyb20gJ2QzLWhpZXJhcmNoeSdcclxuaW1wb3J0ICogYXMgem9vbSBmcm9tICdkMy16b29tJ1xyXG5pbXBvcnQgeyBsaW5rSG9yaXpvbnRhbCwgbGlua1ZlcnRpY2FsIH0gZnJvbSAnZDMtc2hhcGUnXHJcblxyXG4vLyBjcmVhdGUgYSBPYmplY3Qgd2l0aCBvbmx5IHRoZSBzdWJzZXQgb2YgZnVuY3Rpb25zL3N1Ym1vZHVsZXMvcGx1Z2lucyB0aGF0IHdlIG5lZWRcclxudmFyIGQzID0ge1xyXG4gIHNlbGVjdCxcclxuICBzZWxlY3RBbGwsXHJcbiAgLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gbGl2ZSBiaW5kaW5ncywgcmVmZXIgdG86XHJcbiAgLy8gICBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MDAxMjAxNi9pbXBvcnRpbmctZDMtZXZlbnQtaW50by1hLWN1c3RvbS1idWlsZC11c2luZy1yb2xsdXBcclxuICBnZXQgZXZlbnQoKSB7IHJldHVybiBldmVudDsgfSxcclxuICBsaW5rSG9yaXpvbnRhbCxcclxuICBsaW5rVmVydGljYWwsXHJcbiAgLi4uaGllcmFyY2h5LFxyXG4gIC4uLnpvb20sXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBkMzsiLCJjbGFzcyBMb2FkT25EZW1hbmRTZXR0aW5ncyB7XHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG93bmVyT2JqZWN0IFRoZSBvd25lciBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucyBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge2hhc0NoaWxkcmVuQ2FsbEJhY2t9IG9wdGlvbnMuaGFzQ2hpbGRyZW4gU2V0cyB0aGUgaGFzQ2hpbGRyZW4gY2FsbGJhY2sgZnVuY3Rpb24sIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBub2RlIG9yIGRhdGEgaXRlbSBoYXMgY2hpbGRyZW4gb3Igbm90LlxyXG4gICAgICogQHBhcmFtIHtsb2FkQ2hpbGRyZW5DYWxsQmFja30gb3B0aW9ucy5sb2FkQ2hpbGRyZW4gdGhlIGxvYWRDaGlsZHJlbiBjYWxsYmFjayBmdW5jdGlvbiwgdXNlZCB0byBsb2FkIGNoaWxkcmVuIGRhdGEgaXRlbXMgZm9yIGEgbm9kZS5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Iob3duZXJPYmplY3QsIG9wdGlvbnMpIHtcclxuICAgICAgICAvLyBEZWZpbmUgb3B0aW9uIGRlZmF1bHRzXHJcbiAgICAgICAgdmFyIG1lcmdlZE9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIC4uLkxvYWRPbkRlbWFuZFNldHRpbmdzLmRlZmF1bHRzLFxyXG4gICAgICAgICAgICAuLi5vcHRpb25zXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5fb3duZXJPYmplY3QgPSBvd25lck9iamVjdDtcclxuICAgICAgICB0aGlzLl9oYXNDaGlsZHJlbiA9IG1lcmdlZE9wdGlvbnMuaGFzQ2hpbGRyZW47XHJcbiAgICAgICAgdGhpcy5fbG9hZENoaWxkcmVuID0gbWVyZ2VkT3B0aW9ucy5sb2FkQ2hpbGRyZW47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBvd25lciBvYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBvd25lciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGJhY2soKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX293bmVyT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkXHJcbiAgICAgKiBzZXR0aW5ncyBhcmUgY29ycmVjdCBvciBub3QuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSB0cmVlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgdmFsaWRhdGVTZXR0aW5ncygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzQ2hpbGRyZW4gJiYgdGhpcy5sb2FkQ2hpbGRyZW4pXHJcbiAgICAgICAgICAgIHRocm93IFwiV2l0aCBsb2FkIG9uIGRlbWFuZCBlbmFibGVkLCB5b3UgbmVlZCB0byBkZWZpbmUgaGFzQ2hpbGRyZW4gYXMgcGFydCBvZiB0aGUgb3B0aW9uc1wiO1xyXG4gICAgICAgIGlmICghdGhpcy5sb2FkQ2hpbGRyZW4gJiYgdGhpcy5oYXNDaGlsZHJlbilcclxuICAgICAgICAgICAgdGhyb3cgXCJXaXRoIGxvYWQgb24gZGVtYW5kIGVuYWJsZWQsIHlvdSBuZWVkIHRvIGRlZmluZSBsb2FkQ2hpbGRyZW4gYXMgcGFydCBvZiB0aGUgb3B0aW9uc1wiO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZCB0aGUgY2hpbGRyZW4gZm9yIGEgZ2l2ZW4gZGF0YSBvYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgZGF0YSBpdGVtLCB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBsb2FkIHRoZSBjaGlsZHJlbiBvZiB0aGUgZGF0YSBpdGVtIHZpYSBBSkFYLlxyXG4gICAgICogQHBhcmFtIHsqfSBwcm9jZXNzRGF0YSBDYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBjaGlsZHJlbiBkYXRhIGl0ZW1zLlxyXG4gICAgICogQHJldHVybnMgeyp9XHJcbiAgICAgKi9cclxuICAgIGxvYWRDaGlsZHJlbihkYXRhLCBwcm9jZXNzRGF0YSl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRDaGlsZHJlbi5jYWxsKHRoaXMuX293bmVyT2JqZWN0LCBkYXRhLCBwcm9jZXNzRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXJcclxuICAgICAqIHRoZSBwYXNzZWQgZGF0YSBpdGVtIGhhcyBjaGlsZHJlbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRhdGFJdGVtIFRoZSBkYXRhIGl0ZW0gdG8gY2hlY2sgaWYgaXQgaGFzIGNoaWxkcmVuIG9yIG5vdC5cclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBkYXRhIGl0ZW0gaGFzIGNoaWxkcmVuIG9yIG5vdC5cclxuICAgICAqL1xyXG4gICAgaGFzQ2hpbGRyZW4oZGF0YUl0ZW0pe1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNDaGlsZHJlbi5jYWxsKHRoaXMuX293bmVyT2JqZWN0LCBkYXRhSXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBsb2FkQ2hpbGRyZW4gY2FsbGJhY2sgZnVuY3Rpb24sXHJcbiAgICAgKiB1c2VkIHRvIGxvYWQgY2hpbGRyZW4gZGF0YSBpdGVtcyBmb3JcclxuICAgICAqIGEgbm9kZS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtsb2FkQ2hpbGRyZW5DYWxsQmFja30gbmV3TG9hZENoaWxkcmVuTWV0aG9kXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgdHJlZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldExvYWRDaGlsZHJlbk1ldGhvZChuZXdMb2FkQ2hpbGRyZW5NZXRob2Qpe1xyXG4gICAgICAgIHRoaXMuX2xvYWRDaGlsZHJlbiA9IG5ld0xvYWRDaGlsZHJlbk1ldGhvZDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGhhc0NoaWxkcmVuIGNhbGxiYWNrIGZ1bmN0aW9uLFxyXG4gICAgICogdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIG5vZGVcclxuICAgICAqIG9yIGRhdGEgaXRlbSBoYXMgY2hpbGRyZW4gb3Igbm90LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2hhc0NoaWxkcmVuQ2FsbEJhY2t9IG5ld0hhc0NoaWxkcmVuTWV0aG9kXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgdHJlZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldEhhc0NoaWxkcmVuTWV0aG9kKG5ld0hhc0NoaWxkcmVuTWV0aG9kKXtcclxuICAgICAgICB0aGlzLl9oYXNDaGlsZHJlbiA9IG5ld0hhc0NoaWxkcmVuTWV0aG9kO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyXHJcbiAgICAgKiBsb2FkLW9uLWRlbWFuZCBpcyBlbmFibGVkIG9yIG5vdC5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgbG9hZC1vbi1kZW1hbmQgaXMgZW5hYmxlZCBvciBub3QuXHJcbiAgICAgKi9cclxuICAgIGlzRW5hYmxlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faGFzQ2hpbGRyZW4gfHwgdGhpcy5fbG9hZENoaWxkcmVuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbm9kZSBkYXRhIGl0ZW1cclxuICAgICAqIGhhcyBjaGlsZHJlbiBvciBub3QuXHJcbiAgICAgKiBcclxuICAgICAqIEBjYWxsYmFjayBoYXNDaGlsZHJlbkNhbGxCYWNrXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YUl0ZW0gQ2FuIGJlIHVzZWQgdG8gdG8gbG9hZCB0aGUgY2hpbGRyZW5zIGZyb20gdGhlIHNlcnZlciB2aWEgQUpBWC5cclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBub2RlIG9yIGRhdGEgaXRlbSBoYXMgY2hpbGRyZW4gdG8gbG9hZCB2aWEgQUpBWCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIHRoZSBjaGlsZHJlbiBpdGVtcyBmb3IgYSBnaXZlblxyXG4gICAgICogbm9kZSBkYXRhIGl0ZW0uXHJcbiAgICAgKiBAY2FsbGJhY2sgbG9hZENoaWxkcmVuQ2FsbEJhY2tcclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBub2RlRGF0YUl0ZW0gTm9kZSBkYXRhIGl0ZW0sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHRvIGxvYWQgdGhlIGNoaWxkcmVucyBmcm9tIHRoZSBzZXJ2ZXIgdmlhIEFKQVguXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbm9kZURhdGFJdGVtLmRhdGEgVGhlIGRhdGEgaXRlbSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdG8gbG9hZCB0aGUgY2hpbGRyZW5zIGZyb20gdGhlIHNlcnZlciB2aWEgQUpBWC5cclxuICAgICAqIEBwYXJhbSB7Y2hpbGRyZW5EYXRhUHJvY2Vzc29yQ2FsbEJhY2t9IHByb2Nlc3NEYXRhIERhdGEgcHJvY2Vzc29yIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHlvdSBzaG91bGQgdXNlIHRvIGNhbGwsIHBhc3NpbmcgaW4gdGhlIGNoaWxkcmVuIGRhdGEgdGhhdCdzIGJlZW4gbG9hZGVkIHZpYSBBSkFYLlxyXG4gICAgICogQHJldHVybnMge3VuZGVmaW5lZH1cclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2Vzc2VzIHRoZSBjaGlsZHJlbiBpdGVtcy5cclxuICAgICAqIEBjYWxsYmFjayBjaGlsZHJlbkRhdGFQcm9jZXNzb3JDYWxsQmFja1xyXG4gICAgICogQHBhcmFtIHtvYmplY3RbXX0gY2hpbGRyZW5EYXRhSXRlbXMgVGhlIGFycmF5IG9mIGNoaWxkcmVuIGRhdGEgZm9yIHRoZSBub2RlIGJlaW5nIHByb2Nlc3NlZC5cclxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XHJcbiAgICAgKi9cclxufVxyXG5cclxuTG9hZE9uRGVtYW5kU2V0dGluZ3MuZGVmYXVsdHMgPSB7XHJcbiAgICAvLyBUYWtlcyBpbiBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIHBhcmFtZXRlcjpcclxuICAgIC8vIC0gVGhlIG5vZGUgYW5kIGRhdGEgaXRlbSB3aGljaCBjYW4gYmUgdXNlZFxyXG4gICAgLy8gICB0byBsb2FkIHRoZSBjaGlsZHJlbnMgZnJvbSBzZXJ2ZXJcclxuICAgIC8vIFJldHVybnMgdHJ1ZSBvciBmYWxzZVxyXG4gICAgaGFzQ2hpbGRyZW46IG51bGwsXHJcbiAgICAvLyBUYWtlcyBpbiBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB0d28gcGFyYW1ldGVyczpcclxuICAgIC8vIC0gVGhlIG5vZGUgYW5kIGRhdGEgaXRlbSB3aGljaCBjYW4gYmUgdXNlZFxyXG4gICAgLy8gICB0byBsb2FkIHRoZSBjaGlsZHJlbnMgZnJvbSBzZXJ2ZXJcclxuICAgIC8vIC0gdGhlIGRhdGEgcHJvY2Vzc29yIGZ1bmN0aW9uLCB3aGljaFxyXG4gICAgLy8gICB5b3Ugc2hvdWxkIGNhbGwsIHBhc3NpbmcgaW4gdGhlXHJcbiAgICAvLyAgIGNoaWxkcmVuIGRhdGEgeW91IGxvYWRlZCB3aXRoXHJcbiAgICAvLyAgIHlvdXIgc2VydmVyIEFKQVggcmVxdWVzdFxyXG4gICAgbG9hZENoaWxkcmVuOiBudWxsLFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMb2FkT25EZW1hbmRTZXR0aW5nczsiLCJjbGFzcyBOb2RlU2V0dGluZ3Mge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3duZXJPYmplY3QgVGhlIG93bmVyIG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBub2RlIHNldHRpbmdzLlxyXG4gICAgICogQHBhcmFtIHsoJ25vZGVTaXplJ3wnc2l6ZScpfSBbb3B0aW9ucy5zaXppbmdNb2RlPXNpemVdIFRoZSBzaXppbmcgbW9kZS4gU2hvdWxkIGJlIGVpdGhlciAnbm9kZVNpemUnIHRvIGF1dG9tYXRpY2FsbHkgc2l6ZSB0aGUgU1ZHIGJhc2VkIG9uIHRoZSBub2Rlcywgb3IgJ3NpemUnIHRvIHVzZSB0aGUgY29uZmlndXJlZCB3aWR0aCBhbmQgaGVpZ2h0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmhvcml6b250YWxTcGFjaW5nPTI1XSBUaGUgaG9yaXpvbnRhbCBzcGFjaW5nIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnZlcnRpY2FsU3BhY2luZz0yNV0gVGhlIHZlcnRpY2FsIHNwYWNpbmcgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG93bmVyT2JqZWN0LCBvcHRpb25zKSB7XHJcbiAgICAgICAgdmFyIG1lcmdlZE9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIC4uLk5vZGVTZXR0aW5ncy5kZWZhdWx0cyxcclxuICAgICAgICAgICAgLi4ub3B0aW9uc1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX293bmVyT2JqZWN0ID0gb3duZXJPYmplY3Q7XHJcbiAgICAgICAgdGhpcy5fc2l6aW5nTW9kZSA9IG1lcmdlZE9wdGlvbnMuc2l6aW5nTW9kZTtcclxuICAgICAgICB0aGlzLl9ob3Jpem9udGFsU3BhY2luZyA9IG1lcmdlZE9wdGlvbnMuaG9yaXpvbnRhbFNwYWNpbmc7XHJcbiAgICAgICAgdGhpcy5fdmVydGljYWxTcGFjaW5nID0gbWVyZ2VkT3B0aW9ucy52ZXJ0aWNhbFNwYWNpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBvd25lciBvYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBvd25lciBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGJhY2soKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX293bmVyT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgaG9yaXpvbnRhbCBzcGFjaW5nIHZhbHVlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgaG9yaXpvbnRhbCBzcGFjaW5nIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBnZXRIb3Jpem9udGFsU3BhY2luZygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faG9yaXpvbnRhbFNwYWNpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBob3Jpem9udGFsIHNwYWNpbmcgdmFsdWUuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdIb3Jpem9udGFsU3BhY2luZyBUaGUgbmV3IGhvcml6b250YWwgc3BhY2luZyB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBub2RlIHNldHRpbmdzIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgc2V0SG9yaXpvbnRhbFNwYWNpbmcobmV3SG9yaXpvbnRhbFNwYWNpbmcpIHtcclxuICAgICAgICB0aGlzLl9ob3Jpem9udGFsU3BhY2luZyA9IG5ld0hvcml6b250YWxTcGFjaW5nO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgdmVydGljYWwgc3BhY2luZyB2YWx1ZS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHZlcnRpY2FsIHNwYWNpbmcgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIGdldFZlcnRpY2FsU3BhY2luZygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmVydGljYWxTcGFjaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmVydGljYWwgc3BhY2luZyB2YWx1ZS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1ZlcnRpY2FsU3BhY2luZyBUaGUgbmV3IHZlcnRpY2FsIHNwYWNpbmcgdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgbm9kZSBzZXR0aW5ncyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFZlcnRpY2FsU3BhY2luZyhuZXdWZXJ0aWNhbFNwYWNpbmcpIHtcclxuICAgICAgICB0aGlzLl92ZXJ0aWNhbFNwYWNpbmcgPSBuZXdWZXJ0aWNhbFNwYWNpbmc7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBzaXppbmcgbW9kZS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbmZpZ3VyZWQgbm9kZSBzaXppbmcgbW9kZS5cclxuICAgICAqL1xyXG4gICAgZ2V0U2l6aW5nTW9kZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2l6aW5nTW9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNpemluZyBtb2RlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geygnbm9kZVNpemUnfCdzaXplJyl9IG5ld1NpemluZ01vZGUgVGhlIHNpemluZyBtb2RlLiBTaG91bGQgYmUgZWl0aGVyICdub2RlU2l6ZScgdG8gYXV0b21hdGljYWxseSBzaXplIHRoZSBTVkcgYmFzZWQgb24gdGhlIG5vZGVzLCBvciAnc2l6ZScgdG8gdXNlIHRoZSBjb25maWd1cmVkIHdpZHRoIGFuZCBoZWlnaHQuXHJcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgbm9kZSBzZXR0aW5ncyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHNldFNpemluZ01vZGUobmV3U2l6aW5nTW9kZSkge1xyXG4gICAgICAgIHRoaXMuX3NpemluZ01vZGUgPSBuZXdTaXppbmdNb2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG59XHJcblxyXG5Ob2RlU2V0dGluZ3MuZGVmYXVsdHMgPSB7XHJcbiAgICBzaXppbmdNb2RlOiBcInNpemVcIiwgLy8gc2V0IHRvICdub2RlU2l6ZScgZm9yIHRoZSB0cmVlIHNpemUgdG8gYXV0b21hdGljYWxseSBiZSBiYXNlZCBvbiB0aGUgbm9kZSBkaW1lbnNpb25zIGl0c2VsZi5cclxuICAgIGhvcml6b250YWxTcGFjaW5nOiAyNSxcclxuICAgIHZlcnRpY2FsU3BhY2luZzogMjVcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZVNldHRpbmdzOyJdLCJzb3VyY2VSb290IjoiIn0=