@qogni/dygraphs
Version:
dygraphs is a fast, flexible open source JavaScript charting library.
112 lines (107 loc) • 15.7 kB
JavaScript
/**
* @license
* Copyright 2013 David Eberlein (david.eberlein@ch.sauter-bc.com)
* MIT-licenced: https://opensource.org/licenses/MIT
*/
/**
* @fileoverview DataHandler implementation for the combination
* of error bars and fractions options.
* @author David Eberlein (david.eberlein@ch.sauter-bc.com)
*/
/*global Dygraph:false */
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _bars = _interopRequireDefault(require("./bars"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
/**
* @constructor
* @extends Dygraph.DataHandlers.BarsHandler
*/
var FractionsBarsHandler = function FractionsBarsHandler() {};
FractionsBarsHandler.prototype = new _bars["default"]();
/** @inheritDoc */
FractionsBarsHandler.prototype.extractSeries = function (rawData, i, options) {
// TODO(danvk): pre-allocate series here.
var series = [];
var x, y, point, num, den, value, stddev, variance;
var mult = 100.0;
var seriesLabel = options.get("labels")[i];
var logScale = options.getForSeries("logscale", seriesLabel);
var sigma = options.getForSeries("sigma", seriesLabel);
for (var j = 0; j < rawData.length; j++) {
x = rawData[j][0];
point = rawData[j][i];
if (logScale && point !== null) {
// On the log scale, points less than zero do not exist.
// This will create a gap in the chart.
if (point[0] <= 0 || point[1] <= 0) {
point = null;
}
}
// Extract to the unified data format.
if (point !== null) {
num = point[0];
den = point[1];
if (num !== null && !isNaN(num)) {
value = den ? num / den : 0.0;
stddev = den ? sigma * Math.sqrt(value * (1 - value) / den) : 1.0;
variance = mult * stddev;
y = mult * value;
// preserve original values in extras for further filtering
series.push([x, y, [y - variance, y + variance, num, den]]);
} else {
series.push([x, num, [num, num, num, den]]);
}
} else {
series.push([x, null, [null, null, null, null]]);
}
}
return series;
};
/** @inheritDoc */
FractionsBarsHandler.prototype.rollingAverage = function (originalData, rollPeriod, options, i) {
rollPeriod = Math.min(rollPeriod, originalData.length);
var rollingData = [];
var seriesLabel = options.get("labels")[i];
var sigma = options.getForSeries("sigma", seriesLabel);
var wilsonInterval = options.getForSeries("wilsonInterval", seriesLabel);
var low, high, i, stddev;
var num = 0;
var den = 0; // numerator/denominator
var mult = 100.0;
for (i = 0; i < originalData.length; i++) {
num += originalData[i][2][2];
den += originalData[i][2][3];
if (i - rollPeriod >= 0) {
num -= originalData[i - rollPeriod][2][2];
den -= originalData[i - rollPeriod][2][3];
}
var date = originalData[i][0];
var value = den ? num / den : 0.0;
if (wilsonInterval) {
// For more details on this confidence interval, see:
// https://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval
if (den) {
var p = value < 0 ? 0 : value,
n = den;
var pm = sigma * Math.sqrt(p * (1 - p) / n + sigma * sigma / (4 * n * n));
var denom = 1 + sigma * sigma / den;
low = (p + sigma * sigma / (2 * den) - pm) / denom;
high = (p + sigma * sigma / (2 * den) + pm) / denom;
rollingData[i] = [date, p * mult, [low * mult, high * mult]];
} else {
rollingData[i] = [date, 0, [0, 0]];
}
} else {
stddev = den ? sigma * Math.sqrt(value * (1 - value) / den) : 1.0;
rollingData[i] = [date, mult * value, [mult * (value - stddev), mult * (value + stddev)]];
}
}
return rollingData;
};
var _default = exports["default"] = FractionsBarsHandler;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsIl9iYXJzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJlIiwiX19lc01vZHVsZSIsIkZyYWN0aW9uc0JhcnNIYW5kbGVyIiwicHJvdG90eXBlIiwiQmFyc0hhbmRsZXIiLCJleHRyYWN0U2VyaWVzIiwicmF3RGF0YSIsImkiLCJvcHRpb25zIiwic2VyaWVzIiwieCIsInkiLCJwb2ludCIsIm51bSIsImRlbiIsInN0ZGRldiIsInZhcmlhbmNlIiwibXVsdCIsInNlcmllc0xhYmVsIiwiZ2V0IiwibG9nU2NhbGUiLCJnZXRGb3JTZXJpZXMiLCJzaWdtYSIsImoiLCJsZW5ndGgiLCJpc05hTiIsIk1hdGgiLCJzcXJ0IiwicHVzaCIsInJvbGxpbmdBdmVyYWdlIiwib3JpZ2luYWxEYXRhIiwicm9sbFBlcmlvZCIsIm1pbiIsInJvbGxpbmdEYXRhIiwid2lsc29uSW50ZXJ2YWwiLCJsb3ciLCJoaWdoIiwiZGF0ZSIsInAiLCJuIiwicG0iLCJkZW5vbSIsIl9kZWZhdWx0IiwibW9kdWxlIiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhaGFuZGxlci9iYXJzLWZyYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxMyBEYXZpZCBFYmVybGVpbiAoZGF2aWQuZWJlcmxlaW5AY2guc2F1dGVyLWJjLmNvbSlcbiAqIE1JVC1saWNlbmNlZDogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqL1xuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgRGF0YUhhbmRsZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBjb21iaW5hdGlvblxuICogb2YgZXJyb3IgYmFycyBhbmQgZnJhY3Rpb25zIG9wdGlvbnMuXG4gKiBAYXV0aG9yIERhdmlkIEViZXJsZWluIChkYXZpZC5lYmVybGVpbkBjaC5zYXV0ZXItYmMuY29tKVxuICovXG5cbi8qZ2xvYmFsIER5Z3JhcGg6ZmFsc2UgKi9cblwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgQmFyc0hhbmRsZXIgZnJvbSAnLi9iYXJzJztcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIER5Z3JhcGguRGF0YUhhbmRsZXJzLkJhcnNIYW5kbGVyXG4gKi9cbnZhciBGcmFjdGlvbnNCYXJzSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xufTtcblxuRnJhY3Rpb25zQmFyc0hhbmRsZXIucHJvdG90eXBlID0gbmV3IEJhcnNIYW5kbGVyKCk7XG5cbi8qKiBAaW5oZXJpdERvYyAqL1xuRnJhY3Rpb25zQmFyc0hhbmRsZXIucHJvdG90eXBlLmV4dHJhY3RTZXJpZXMgPSBmdW5jdGlvbihyYXdEYXRhLCBpLCBvcHRpb25zKSB7XG4gIC8vIFRPRE8oZGFudmspOiBwcmUtYWxsb2NhdGUgc2VyaWVzIGhlcmUuXG4gIHZhciBzZXJpZXMgPSBbXTtcbiAgdmFyIHgsIHksIHBvaW50LCBudW0sIGRlbiwgdmFsdWUsIHN0ZGRldiwgdmFyaWFuY2U7XG4gIHZhciBtdWx0ID0gMTAwLjA7XG4gIGNvbnN0IHNlcmllc0xhYmVsID0gb3B0aW9ucy5nZXQoXCJsYWJlbHNcIilbaV07XG4gIGNvbnN0IGxvZ1NjYWxlID0gb3B0aW9ucy5nZXRGb3JTZXJpZXMoXCJsb2dzY2FsZVwiLCBzZXJpZXNMYWJlbCk7XG4gIGNvbnN0IHNpZ21hID0gb3B0aW9ucy5nZXRGb3JTZXJpZXMoXCJzaWdtYVwiLCBzZXJpZXNMYWJlbCk7XG4gIGZvciAoIHZhciBqID0gMDsgaiA8IHJhd0RhdGEubGVuZ3RoOyBqKyspIHtcbiAgICB4ID0gcmF3RGF0YVtqXVswXTtcbiAgICBwb2ludCA9IHJhd0RhdGFbal1baV07XG4gICAgaWYgKGxvZ1NjYWxlICYmIHBvaW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBPbiB0aGUgbG9nIHNjYWxlLCBwb2ludHMgbGVzcyB0aGFuIHplcm8gZG8gbm90IGV4aXN0LlxuICAgICAgLy8gVGhpcyB3aWxsIGNyZWF0ZSBhIGdhcCBpbiB0aGUgY2hhcnQuXG4gICAgICBpZiAocG9pbnRbMF0gPD0gMCB8fCBwb2ludFsxXSA8PSAwKSB7XG4gICAgICAgIHBvaW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRXh0cmFjdCB0byB0aGUgdW5pZmllZCBkYXRhIGZvcm1hdC5cbiAgICBpZiAocG9pbnQgIT09IG51bGwpIHtcbiAgICAgIG51bSA9IHBvaW50WzBdO1xuICAgICAgZGVuID0gcG9pbnRbMV07XG4gICAgICBpZiAobnVtICE9PSBudWxsICYmICFpc05hTihudW0pKSB7XG4gICAgICAgIHZhbHVlID0gZGVuID8gbnVtIC8gZGVuIDogMC4wO1xuICAgICAgICBzdGRkZXYgPSBkZW4gPyBzaWdtYSAqIE1hdGguc3FydCh2YWx1ZSAqICgxIC0gdmFsdWUpIC8gZGVuKSA6IDEuMDtcbiAgICAgICAgdmFyaWFuY2UgPSBtdWx0ICogc3RkZGV2O1xuICAgICAgICB5ID0gbXVsdCAqIHZhbHVlO1xuICAgICAgICAvLyBwcmVzZXJ2ZSBvcmlnaW5hbCB2YWx1ZXMgaW4gZXh0cmFzIGZvciBmdXJ0aGVyIGZpbHRlcmluZ1xuICAgICAgICBzZXJpZXMucHVzaChbIHgsIHksIFsgeSAtIHZhcmlhbmNlLCB5ICsgdmFyaWFuY2UsIG51bSwgZGVuIF0gXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJpZXMucHVzaChbIHgsIG51bSwgWyBudW0sIG51bSwgbnVtLCBkZW4gXSBdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VyaWVzLnB1c2goWyB4LCBudWxsLCBbIG51bGwsIG51bGwsIG51bGwsIG51bGwgXSBdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlcmllcztcbn07XG5cbi8qKiBAaW5oZXJpdERvYyAqL1xuRnJhY3Rpb25zQmFyc0hhbmRsZXIucHJvdG90eXBlLnJvbGxpbmdBdmVyYWdlID1cbiAgICBmdW5jdGlvbihvcmlnaW5hbERhdGEsIHJvbGxQZXJpb2QsIG9wdGlvbnMsIGkpIHtcbiAgcm9sbFBlcmlvZCA9IE1hdGgubWluKHJvbGxQZXJpb2QsIG9yaWdpbmFsRGF0YS5sZW5ndGgpO1xuICB2YXIgcm9sbGluZ0RhdGEgPSBbXTtcbiAgY29uc3Qgc2VyaWVzTGFiZWwgPSBvcHRpb25zLmdldChcImxhYmVsc1wiKVtpXTtcbiAgY29uc3Qgc2lnbWEgPSBvcHRpb25zLmdldEZvclNlcmllcyhcInNpZ21hXCIsIHNlcmllc0xhYmVsKTtcbiAgY29uc3Qgd2lsc29uSW50ZXJ2YWwgPSBvcHRpb25zLmdldEZvclNlcmllcyhcIndpbHNvbkludGVydmFsXCIsIHNlcmllc0xhYmVsKTtcblxuICB2YXIgbG93LCBoaWdoLCBpLCBzdGRkZXY7XG4gIHZhciBudW0gPSAwO1xuICB2YXIgZGVuID0gMDsgLy8gbnVtZXJhdG9yL2Rlbm9taW5hdG9yXG4gIHZhciBtdWx0ID0gMTAwLjA7XG4gIGZvciAoaSA9IDA7IGkgPCBvcmlnaW5hbERhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBudW0gKz0gb3JpZ2luYWxEYXRhW2ldWzJdWzJdO1xuICAgIGRlbiArPSBvcmlnaW5hbERhdGFbaV1bMl1bM107XG4gICAgaWYgKGkgLSByb2xsUGVyaW9kID49IDApIHtcbiAgICAgIG51bSAtPSBvcmlnaW5hbERhdGFbaSAtIHJvbGxQZXJpb2RdWzJdWzJdO1xuICAgICAgZGVuIC09IG9yaWdpbmFsRGF0YVtpIC0gcm9sbFBlcmlvZF1bMl1bM107XG4gICAgfVxuXG4gICAgdmFyIGRhdGUgPSBvcmlnaW5hbERhdGFbaV1bMF07XG4gICAgdmFyIHZhbHVlID0gZGVuID8gbnVtIC8gZGVuIDogMC4wO1xuICAgIGlmICh3aWxzb25JbnRlcnZhbCkge1xuICAgICAgLy8gRm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIGNvbmZpZGVuY2UgaW50ZXJ2YWwsIHNlZTpcbiAgICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jpbm9taWFsX3Byb3BvcnRpb25fY29uZmlkZW5jZV9pbnRlcnZhbFxuICAgICAgaWYgKGRlbikge1xuICAgICAgICB2YXIgcCA9IHZhbHVlIDwgMCA/IDAgOiB2YWx1ZSwgbiA9IGRlbjtcbiAgICAgICAgdmFyIHBtID0gc2lnbWEgKiBNYXRoLnNxcnQocCAqICgxIC0gcCkgLyBuICsgc2lnbWEgKiBzaWdtYSAvICg0ICogbiAqIG4pKTtcbiAgICAgICAgdmFyIGRlbm9tID0gMSArIHNpZ21hICogc2lnbWEgLyBkZW47XG4gICAgICAgIGxvdyA9IChwICsgc2lnbWEgKiBzaWdtYSAvICgyICogZGVuKSAtIHBtKSAvIGRlbm9tO1xuICAgICAgICBoaWdoID0gKHAgKyBzaWdtYSAqIHNpZ21hIC8gKDIgKiBkZW4pICsgcG0pIC8gZGVub207XG4gICAgICAgIHJvbGxpbmdEYXRhW2ldID0gWyBkYXRlLCBwICogbXVsdCxcbiAgICAgICAgICAgIFsgbG93ICogbXVsdCwgaGlnaCAqIG11bHQgXSBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9sbGluZ0RhdGFbaV0gPSBbIGRhdGUsIDAsIFsgMCwgMCBdIF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ZGRldiA9IGRlbiA/IHNpZ21hICogTWF0aC5zcXJ0KHZhbHVlICogKDEgLSB2YWx1ZSkgLyBkZW4pIDogMS4wO1xuICAgICAgcm9sbGluZ0RhdGFbaV0gPSBbIGRhdGUsIG11bHQgKiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBbIG11bHQgKiAodmFsdWUgLSBzdGRkZXYpLCBtdWx0ICogKHZhbHVlICsgc3RkZGV2KSBdIF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJvbGxpbmdEYXRhO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRnJhY3Rpb25zQmFyc0hhbmRsZXI7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7O0FBQUNBLE1BQUEsQ0FBQUMsY0FBQSxDQUFBQyxPQUFBO0VBQUFDLEtBQUE7QUFBQTtBQUFBRCxPQUFBO0FBRWIsSUFBQUUsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQWlDLFNBQUFELHVCQUFBRSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsZ0JBQUFBLENBQUE7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJRSxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUFBLEVBQWMsQ0FDdEMsQ0FBQztBQUVEQSxvQkFBb0IsQ0FBQ0MsU0FBUyxHQUFHLElBQUlDLGdCQUFXLENBQUMsQ0FBQzs7QUFFbEQ7QUFDQUYsb0JBQW9CLENBQUNDLFNBQVMsQ0FBQ0UsYUFBYSxHQUFHLFVBQVNDLE9BQU8sRUFBRUMsQ0FBQyxFQUFFQyxPQUFPLEVBQUU7RUFDM0U7RUFDQSxJQUFJQyxNQUFNLEdBQUcsRUFBRTtFQUNmLElBQUlDLENBQUMsRUFBRUMsQ0FBQyxFQUFFQyxLQUFLLEVBQUVDLEdBQUcsRUFBRUMsR0FBRyxFQUFFbEIsS0FBSyxFQUFFbUIsTUFBTSxFQUFFQyxRQUFRO0VBQ2xELElBQUlDLElBQUksR0FBRyxLQUFLO0VBQ2hCLElBQU1DLFdBQVcsR0FBR1YsT0FBTyxDQUFDVyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUNaLENBQUMsQ0FBQztFQUM1QyxJQUFNYSxRQUFRLEdBQUdaLE9BQU8sQ0FBQ2EsWUFBWSxDQUFDLFVBQVUsRUFBRUgsV0FBVyxDQUFDO0VBQzlELElBQU1JLEtBQUssR0FBR2QsT0FBTyxDQUFDYSxZQUFZLENBQUMsT0FBTyxFQUFFSCxXQUFXLENBQUM7RUFDeEQsS0FBTSxJQUFJSyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdqQixPQUFPLENBQUNrQixNQUFNLEVBQUVELENBQUMsRUFBRSxFQUFFO0lBQ3hDYixDQUFDLEdBQUdKLE9BQU8sQ0FBQ2lCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQlgsS0FBSyxHQUFHTixPQUFPLENBQUNpQixDQUFDLENBQUMsQ0FBQ2hCLENBQUMsQ0FBQztJQUNyQixJQUFJYSxRQUFRLElBQUlSLEtBQUssS0FBSyxJQUFJLEVBQUU7TUFDOUI7TUFDQTtNQUNBLElBQUlBLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUlBLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDbENBLEtBQUssR0FBRyxJQUFJO01BQ2Q7SUFDRjtJQUNBO0lBQ0EsSUFBSUEsS0FBSyxLQUFLLElBQUksRUFBRTtNQUNsQkMsR0FBRyxHQUFHRCxLQUFLLENBQUMsQ0FBQyxDQUFDO01BQ2RFLEdBQUcsR0FBR0YsS0FBSyxDQUFDLENBQUMsQ0FBQztNQUNkLElBQUlDLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQ1ksS0FBSyxDQUFDWixHQUFHLENBQUMsRUFBRTtRQUMvQmpCLEtBQUssR0FBR2tCLEdBQUcsR0FBR0QsR0FBRyxHQUFHQyxHQUFHLEdBQUcsR0FBRztRQUM3QkMsTUFBTSxHQUFHRCxHQUFHLEdBQUdRLEtBQUssR0FBR0ksSUFBSSxDQUFDQyxJQUFJLENBQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHQSxLQUFLLENBQUMsR0FBR2tCLEdBQUcsQ0FBQyxHQUFHLEdBQUc7UUFDakVFLFFBQVEsR0FBR0MsSUFBSSxHQUFHRixNQUFNO1FBQ3hCSixDQUFDLEdBQUdNLElBQUksR0FBR3JCLEtBQUs7UUFDaEI7UUFDQWEsTUFBTSxDQUFDbUIsSUFBSSxDQUFDLENBQUVsQixDQUFDLEVBQUVDLENBQUMsRUFBRSxDQUFFQSxDQUFDLEdBQUdLLFFBQVEsRUFBRUwsQ0FBQyxHQUFHSyxRQUFRLEVBQUVILEdBQUcsRUFBRUMsR0FBRyxDQUFFLENBQUUsQ0FBQztNQUNqRSxDQUFDLE1BQU07UUFDTEwsTUFBTSxDQUFDbUIsSUFBSSxDQUFDLENBQUVsQixDQUFDLEVBQUVHLEdBQUcsRUFBRSxDQUFFQSxHQUFHLEVBQUVBLEdBQUcsRUFBRUEsR0FBRyxFQUFFQyxHQUFHLENBQUUsQ0FBRSxDQUFDO01BQ2pEO0lBQ0YsQ0FBQyxNQUFNO01BQ0xMLE1BQU0sQ0FBQ21CLElBQUksQ0FBQyxDQUFFbEIsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBRSxDQUFFLENBQUM7SUFDdEQ7RUFDRjtFQUNBLE9BQU9ELE1BQU07QUFDZixDQUFDOztBQUVEO0FBQ0FQLG9CQUFvQixDQUFDQyxTQUFTLENBQUMwQixjQUFjLEdBQ3pDLFVBQVNDLFlBQVksRUFBRUMsVUFBVSxFQUFFdkIsT0FBTyxFQUFFRCxDQUFDLEVBQUU7RUFDakR3QixVQUFVLEdBQUdMLElBQUksQ0FBQ00sR0FBRyxDQUFDRCxVQUFVLEVBQUVELFlBQVksQ0FBQ04sTUFBTSxDQUFDO0VBQ3RELElBQUlTLFdBQVcsR0FBRyxFQUFFO0VBQ3BCLElBQU1mLFdBQVcsR0FBR1YsT0FBTyxDQUFDVyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUNaLENBQUMsQ0FBQztFQUM1QyxJQUFNZSxLQUFLLEdBQUdkLE9BQU8sQ0FBQ2EsWUFBWSxDQUFDLE9BQU8sRUFBRUgsV0FBVyxDQUFDO0VBQ3hELElBQU1nQixjQUFjLEdBQUcxQixPQUFPLENBQUNhLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRUgsV0FBVyxDQUFDO0VBRTFFLElBQUlpQixHQUFHLEVBQUVDLElBQUksRUFBRTdCLENBQUMsRUFBRVEsTUFBTTtFQUN4QixJQUFJRixHQUFHLEdBQUcsQ0FBQztFQUNYLElBQUlDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNiLElBQUlHLElBQUksR0FBRyxLQUFLO0VBQ2hCLEtBQUtWLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3VCLFlBQVksQ0FBQ04sTUFBTSxFQUFFakIsQ0FBQyxFQUFFLEVBQUU7SUFDeENNLEdBQUcsSUFBSWlCLFlBQVksQ0FBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1Qk8sR0FBRyxJQUFJZ0IsWUFBWSxDQUFDdkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLElBQUlBLENBQUMsR0FBR3dCLFVBQVUsSUFBSSxDQUFDLEVBQUU7TUFDdkJsQixHQUFHLElBQUlpQixZQUFZLENBQUN2QixDQUFDLEdBQUd3QixVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDekNqQixHQUFHLElBQUlnQixZQUFZLENBQUN2QixDQUFDLEdBQUd3QixVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0M7SUFFQSxJQUFJTSxJQUFJLEdBQUdQLFlBQVksQ0FBQ3ZCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixJQUFJWCxLQUFLLEdBQUdrQixHQUFHLEdBQUdELEdBQUcsR0FBR0MsR0FBRyxHQUFHLEdBQUc7SUFDakMsSUFBSW9CLGNBQWMsRUFBRTtNQUNsQjtNQUNBO01BQ0EsSUFBSXBCLEdBQUcsRUFBRTtRQUNQLElBQUl3QixDQUFDLEdBQUcxQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBR0EsS0FBSztVQUFFMkMsQ0FBQyxHQUFHekIsR0FBRztRQUN0QyxJQUFJMEIsRUFBRSxHQUFHbEIsS0FBSyxHQUFHSSxJQUFJLENBQUNDLElBQUksQ0FBQ1csQ0FBQyxJQUFJLENBQUMsR0FBR0EsQ0FBQyxDQUFDLEdBQUdDLENBQUMsR0FBR2pCLEtBQUssR0FBR0EsS0FBSyxJQUFJLENBQUMsR0FBR2lCLENBQUMsR0FBR0EsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSUUsS0FBSyxHQUFHLENBQUMsR0FBR25CLEtBQUssR0FBR0EsS0FBSyxHQUFHUixHQUFHO1FBQ25DcUIsR0FBRyxHQUFHLENBQUNHLENBQUMsR0FBR2hCLEtBQUssR0FBR0EsS0FBSyxJQUFJLENBQUMsR0FBR1IsR0FBRyxDQUFDLEdBQUcwQixFQUFFLElBQUlDLEtBQUs7UUFDbERMLElBQUksR0FBRyxDQUFDRSxDQUFDLEdBQUdoQixLQUFLLEdBQUdBLEtBQUssSUFBSSxDQUFDLEdBQUdSLEdBQUcsQ0FBQyxHQUFHMEIsRUFBRSxJQUFJQyxLQUFLO1FBQ25EUixXQUFXLENBQUMxQixDQUFDLENBQUMsR0FBRyxDQUFFOEIsSUFBSSxFQUFFQyxDQUFDLEdBQUdyQixJQUFJLEVBQzdCLENBQUVrQixHQUFHLEdBQUdsQixJQUFJLEVBQUVtQixJQUFJLEdBQUduQixJQUFJLENBQUUsQ0FBRTtNQUNuQyxDQUFDLE1BQU07UUFDTGdCLFdBQVcsQ0FBQzFCLENBQUMsQ0FBQyxHQUFHLENBQUU4QixJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBRSxDQUFFO01BQ3hDO0lBQ0YsQ0FBQyxNQUFNO01BQ0x0QixNQUFNLEdBQUdELEdBQUcsR0FBR1EsS0FBSyxHQUFHSSxJQUFJLENBQUNDLElBQUksQ0FBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUdBLEtBQUssQ0FBQyxHQUFHa0IsR0FBRyxDQUFDLEdBQUcsR0FBRztNQUNqRW1CLFdBQVcsQ0FBQzFCLENBQUMsQ0FBQyxHQUFHLENBQUU4QixJQUFJLEVBQUVwQixJQUFJLEdBQUdyQixLQUFLLEVBQ2xCLENBQUVxQixJQUFJLElBQUlyQixLQUFLLEdBQUdtQixNQUFNLENBQUMsRUFBRUUsSUFBSSxJQUFJckIsS0FBSyxHQUFHbUIsTUFBTSxDQUFDLENBQUUsQ0FBRTtJQUMzRTtFQUNGO0VBRUEsT0FBT2tCLFdBQVc7QUFDcEIsQ0FBQztBQUFDLElBQUFTLFFBQUEsR0FBQS9DLE9BQUEsY0FFYU8sb0JBQW9CO0FBQUF5QyxNQUFBLENBQUFoRCxPQUFBLEdBQUFBLE9BQUEsQ0FBQWlELE9BQUEiLCJpZ25vcmVMaXN0IjpbXX0=