UNPKG

@qogni/dygraphs

Version:

dygraphs is a fast, flexible open source JavaScript charting library.

285 lines (272 loc) 40.4 kB
/** * @license * Copyright 2012 Dan Vanderkam (danvdk@gmail.com) * MIT-licenced: https://opensource.org/licenses/MIT */ /*global Dygraph:false */ 'use strict'; /* Bits of jankiness: - Direct layout access - Direct area access - Should include calculation of ticks, not just the drawing. Options left to make axis-friendly. ('drawAxesAtZero') ('xAxisHeight') */ Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var utils = _interopRequireWildcard(require("../dygraph-utils")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } /** * Draws the axes. This includes the labels on the x- and y-axes, as well * as the tick marks on the axes. * It does _not_ draw the grid lines which span the entire chart. */ var axes = function axes() { this.xlabels_ = []; this.ylabels_ = []; }; axes.prototype.toString = function () { return 'Axes Plugin'; }; axes.prototype.activate = function (g) { return { layout: this.layout, clearChart: this.clearChart, willDrawChart: this.willDrawChart }; }; axes.prototype.layout = function (e) { var g = e.dygraph; if (g.getOptionForAxis('drawAxis', 'y')) { var w = g.getOptionForAxis('axisLabelWidth', 'y') + 2 * g.getOptionForAxis('axisTickSize', 'y'); e.reserveSpaceLeft(w); } if (g.getOptionForAxis('drawAxis', 'x')) { var h; // NOTE: I think this is probably broken now, since g.getOption() now // hits the dictionary. (That is, g.getOption('xAxisHeight') now always // has a value.) if (g.getOption('xAxisHeight')) { h = g.getOption('xAxisHeight'); } else { h = g.getOptionForAxis('axisLabelFontSize', 'x') + 2 * g.getOptionForAxis('axisTickSize', 'x'); } e.reserveSpaceBottom(h); } if (g.numAxes() == 2) { if (g.getOptionForAxis('drawAxis', 'y2')) { var w = g.getOptionForAxis('axisLabelWidth', 'y2') + 2 * g.getOptionForAxis('axisTickSize', 'y2'); e.reserveSpaceRight(w); } } else if (g.numAxes() > 2) { g.error('Only two y-axes are supported at this time. (Trying ' + 'to use ' + g.numAxes() + ')'); } }; axes.prototype.detachLabels = function () { function removeArray(ary) { for (var i = 0; i < ary.length; i++) { var el = ary[i]; if (el.parentNode) el.parentNode.removeChild(el); } } removeArray(this.xlabels_); removeArray(this.ylabels_); this.xlabels_ = []; this.ylabels_ = []; }; axes.prototype.clearChart = function (e) { this.detachLabels(); }; axes.prototype.willDrawChart = function (e) { var g = e.dygraph; if (!g.getOptionForAxis('drawAxis', 'x') && !g.getOptionForAxis('drawAxis', 'y') && !g.getOptionForAxis('drawAxis', 'y2')) { return; } // Round pixels to half-integer boundaries for crisper drawing. function halfUp(x) { return Math.round(x) + 0.5; } function halfDown(y) { return Math.round(y) - 0.5; } var context = e.drawingContext; var containerDiv = e.canvas.parentNode; var canvasWidth = g.width_; // e.canvas.width is affected by pixel ratio. var canvasHeight = g.height_; var label, x, y, tick, i; var makeLabelStyle = function makeLabelStyle(axis) { return { position: 'absolute', fontSize: g.getOptionForAxis('axisLabelFontSize', axis) + 'px', width: g.getOptionForAxis('axisLabelWidth', axis) + 'px' }; }; var labelStyles = { x: makeLabelStyle('x'), y: makeLabelStyle('y'), y2: makeLabelStyle('y2') }; var makeDiv = function makeDiv(txt, axis, prec_axis) { /* * This seems to be called with the following three sets of axis/prec_axis: * x: undefined * y: y1 * y: y2 */ var div = document.createElement('div'); var labelStyle = labelStyles[prec_axis == 'y2' ? 'y2' : axis]; utils.update(div.style, labelStyle); // TODO: combine outer & inner divs var inner_div = document.createElement('div'); inner_div.className = 'dygraph-axis-label' + ' dygraph-axis-label-' + axis + (prec_axis ? ' dygraph-axis-label-' + prec_axis : ''); inner_div.innerHTML = txt; div.appendChild(inner_div); return div; }; // axis lines context.save(); var layout = g.layout_; var area = e.dygraph.plotter_.area; // Helper for repeated axis-option accesses. var makeOptionGetter = function makeOptionGetter(axis) { return function (option) { return g.getOptionForAxis(option, axis); }; }; var that = this; if (g.getOptionForAxis('drawAxis', 'y') || g.numAxes() == 2 && g.getOptionForAxis('drawAxis', 'y2')) { if (layout.yticks && layout.yticks.length > 0) { var num_axes = g.numAxes(); var getOptions = [makeOptionGetter('y'), makeOptionGetter('y2')]; layout.yticks.forEach(function (tick) { if (tick.label === undefined) return; // this tick only has a grid line. x = area.x; var sgn = 1; var prec_axis = 'y1'; var getAxisOption = getOptions[0]; if (tick.axis == 1) { // right-side y-axis x = area.x + area.w; sgn = -1; prec_axis = 'y2'; getAxisOption = getOptions[1]; } if (!getAxisOption('drawAxis')) return; var fontSize = getAxisOption('axisLabelFontSize'); y = area.y + tick.pos * area.h; /* Tick marks are currently clipped, so don't bother drawing them. context.beginPath(); context.moveTo(halfUp(x), halfDown(y)); context.lineTo(halfUp(x - sgn * that.attr_('axisTickSize')), halfDown(y)); context.closePath(); context.stroke(); */ label = makeDiv(tick.label, 'y', num_axes == 2 ? prec_axis : null); var top = y - fontSize / 2; if (top < 0) top = 0; if (top + fontSize + 3 > canvasHeight) { label.style.bottom = '0'; } else { // The lowest tick on the y-axis often overlaps with the leftmost // tick on the x-axis. Shift the bottom tick up a little bit to // compensate if necessary. label.style.top = Math.min(top, canvasHeight - 2 * fontSize) + 'px'; } // TODO: replace these with css classes? if (tick.axis === 0) { label.style.left = area.x - getAxisOption('axisLabelWidth') - getAxisOption('axisTickSize') + 'px'; label.style.textAlign = 'right'; } else if (tick.axis == 1) { label.style.left = area.x + area.w + getAxisOption('axisTickSize') + 'px'; label.style.textAlign = 'left'; } label.style.width = getAxisOption('axisLabelWidth') + 'px'; containerDiv.appendChild(label); that.ylabels_.push(label); }); } // draw a vertical line on the left to separate the chart from the labels. var axisX; if (g.getOption('drawAxesAtZero')) { var r = g.toPercentXCoord(0); if (r > 1 || r < 0 || isNaN(r)) r = 0; axisX = halfUp(area.x + r * area.w); } else { axisX = halfUp(area.x); } context.strokeStyle = g.getOptionForAxis('axisLineColor', 'y'); context.lineWidth = g.getOptionForAxis('axisLineWidth', 'y'); context.beginPath(); context.moveTo(axisX, halfDown(area.y)); context.lineTo(axisX, halfDown(area.y + area.h)); context.closePath(); context.stroke(); // if there's a secondary y-axis, draw a vertical line for that, too. if (g.numAxes() == 2 && g.getOptionForAxis('drawAxis', 'y2')) { context.strokeStyle = g.getOptionForAxis('axisLineColor', 'y2'); context.lineWidth = g.getOptionForAxis('axisLineWidth', 'y2'); context.beginPath(); context.moveTo(halfDown(area.x + area.w), halfDown(area.y)); context.lineTo(halfDown(area.x + area.w), halfDown(area.y + area.h)); context.closePath(); context.stroke(); } } if (g.getOptionForAxis('drawAxis', 'x')) { if (layout.xticks) { var getAxisOption = makeOptionGetter('x'); layout.xticks.forEach(function (tick) { if (tick.label === undefined) return; // this tick only has a grid line. x = area.x + tick.pos * area.w; y = area.y + area.h; /* Tick marks are currently clipped, so don't bother drawing them. context.beginPath(); context.moveTo(halfUp(x), halfDown(y)); context.lineTo(halfUp(x), halfDown(y + that.attr_('axisTickSize'))); context.closePath(); context.stroke(); */ label = makeDiv(tick.label, 'x'); label.style.textAlign = 'center'; label.style.top = y + getAxisOption('axisTickSize') + 'px'; var left = x - getAxisOption('axisLabelWidth') / 2; if (left + getAxisOption('axisLabelWidth') > canvasWidth) { left = canvasWidth - getAxisOption('axisLabelWidth'); label.style.textAlign = 'right'; } if (left < 0) { left = 0; label.style.textAlign = 'left'; } label.style.left = left + 'px'; label.style.width = getAxisOption('axisLabelWidth') + 'px'; containerDiv.appendChild(label); that.xlabels_.push(label); }); } context.strokeStyle = g.getOptionForAxis('axisLineColor', 'x'); context.lineWidth = g.getOptionForAxis('axisLineWidth', 'x'); context.beginPath(); var axisY; if (g.getOption('drawAxesAtZero')) { var r = g.toPercentYCoord(0, 0); if (r > 1 || r < 0) r = 1; axisY = halfDown(area.y + r * area.h); } else { axisY = halfDown(area.y + area.h); } context.moveTo(halfUp(area.x), axisY); context.lineTo(halfUp(area.x + area.w), axisY); context.closePath(); context.stroke(); } context.restore(); }; var _default = exports["default"] = axes; module.exports = exports.default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsInV0aWxzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJyZXF1aXJlIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiYXhlcyIsInhsYWJlbHNfIiwieWxhYmVsc18iLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImFjdGl2YXRlIiwiZyIsImxheW91dCIsImNsZWFyQ2hhcnQiLCJ3aWxsRHJhd0NoYXJ0IiwiZHlncmFwaCIsImdldE9wdGlvbkZvckF4aXMiLCJ3IiwicmVzZXJ2ZVNwYWNlTGVmdCIsImgiLCJnZXRPcHRpb24iLCJyZXNlcnZlU3BhY2VCb3R0b20iLCJudW1BeGVzIiwicmVzZXJ2ZVNwYWNlUmlnaHQiLCJlcnJvciIsImRldGFjaExhYmVscyIsInJlbW92ZUFycmF5IiwiYXJ5IiwibGVuZ3RoIiwiZWwiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJoYWxmVXAiLCJ4IiwiTWF0aCIsInJvdW5kIiwiaGFsZkRvd24iLCJ5IiwiY29udGV4dCIsImRyYXdpbmdDb250ZXh0IiwiY29udGFpbmVyRGl2IiwiY2FudmFzIiwiY2FudmFzV2lkdGgiLCJ3aWR0aF8iLCJjYW52YXNIZWlnaHQiLCJoZWlnaHRfIiwibGFiZWwiLCJ0aWNrIiwibWFrZUxhYmVsU3R5bGUiLCJheGlzIiwicG9zaXRpb24iLCJmb250U2l6ZSIsIndpZHRoIiwibGFiZWxTdHlsZXMiLCJ5MiIsIm1ha2VEaXYiLCJ0eHQiLCJwcmVjX2F4aXMiLCJkaXYiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJsYWJlbFN0eWxlIiwidXBkYXRlIiwic3R5bGUiLCJpbm5lcl9kaXYiLCJjbGFzc05hbWUiLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsInNhdmUiLCJsYXlvdXRfIiwiYXJlYSIsInBsb3R0ZXJfIiwibWFrZU9wdGlvbkdldHRlciIsIm9wdGlvbiIsInRoYXQiLCJ5dGlja3MiLCJudW1fYXhlcyIsImdldE9wdGlvbnMiLCJmb3JFYWNoIiwidW5kZWZpbmVkIiwic2duIiwiZ2V0QXhpc09wdGlvbiIsInBvcyIsInRvcCIsImJvdHRvbSIsIm1pbiIsImxlZnQiLCJ0ZXh0QWxpZ24iLCJwdXNoIiwiYXhpc1giLCJ0b1BlcmNlbnRYQ29vcmQiLCJpc05hTiIsInN0cm9rZVN0eWxlIiwibGluZVdpZHRoIiwiYmVnaW5QYXRoIiwibW92ZVRvIiwibGluZVRvIiwiY2xvc2VQYXRoIiwic3Ryb2tlIiwieHRpY2tzIiwiYXhpc1kiLCJ0b1BlcmNlbnRZQ29vcmQiLCJyZXN0b3JlIiwiX2RlZmF1bHQiLCJtb2R1bGUiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbnMvYXhlcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxMiBEYW4gVmFuZGVya2FtIChkYW52ZGtAZ21haWwuY29tKVxuICogTUlULWxpY2VuY2VkOiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICovXG5cbi8qZ2xvYmFsIER5Z3JhcGg6ZmFsc2UgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKlxuQml0cyBvZiBqYW5raW5lc3M6XG4tIERpcmVjdCBsYXlvdXQgYWNjZXNzXG4tIERpcmVjdCBhcmVhIGFjY2Vzc1xuLSBTaG91bGQgaW5jbHVkZSBjYWxjdWxhdGlvbiBvZiB0aWNrcywgbm90IGp1c3QgdGhlIGRyYXdpbmcuXG5cbk9wdGlvbnMgbGVmdCB0byBtYWtlIGF4aXMtZnJpZW5kbHkuXG4gICgnZHJhd0F4ZXNBdFplcm8nKVxuICAoJ3hBeGlzSGVpZ2h0JylcbiovXG5cbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uL2R5Z3JhcGgtdXRpbHMnO1xuXG4vKipcbiAqIERyYXdzIHRoZSBheGVzLiBUaGlzIGluY2x1ZGVzIHRoZSBsYWJlbHMgb24gdGhlIHgtIGFuZCB5LWF4ZXMsIGFzIHdlbGxcbiAqIGFzIHRoZSB0aWNrIG1hcmtzIG9uIHRoZSBheGVzLlxuICogSXQgZG9lcyBfbm90XyBkcmF3IHRoZSBncmlkIGxpbmVzIHdoaWNoIHNwYW4gdGhlIGVudGlyZSBjaGFydC5cbiAqL1xudmFyIGF4ZXMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy54bGFiZWxzXyA9IFtdO1xuICB0aGlzLnlsYWJlbHNfID0gW107XG59O1xuXG5heGVzLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gJ0F4ZXMgUGx1Z2luJztcbn07XG5cbmF4ZXMucHJvdG90eXBlLmFjdGl2YXRlID0gZnVuY3Rpb24oZykge1xuICByZXR1cm4ge1xuICAgIGxheW91dDogdGhpcy5sYXlvdXQsXG4gICAgY2xlYXJDaGFydDogdGhpcy5jbGVhckNoYXJ0LFxuICAgIHdpbGxEcmF3Q2hhcnQ6IHRoaXMud2lsbERyYXdDaGFydFxuICB9O1xufTtcblxuYXhlcy5wcm90b3R5cGUubGF5b3V0ID0gZnVuY3Rpb24oZSkge1xuICB2YXIgZyA9IGUuZHlncmFwaDtcblxuICBpZiAoZy5nZXRPcHRpb25Gb3JBeGlzKCdkcmF3QXhpcycsICd5JykpIHtcbiAgICB2YXIgdyA9IGcuZ2V0T3B0aW9uRm9yQXhpcygnYXhpc0xhYmVsV2lkdGgnLCAneScpICsgMiAqIGcuZ2V0T3B0aW9uRm9yQXhpcygnYXhpc1RpY2tTaXplJywgJ3knKTtcbiAgICBlLnJlc2VydmVTcGFjZUxlZnQodyk7XG4gIH1cblxuICBpZiAoZy5nZXRPcHRpb25Gb3JBeGlzKCdkcmF3QXhpcycsICd4JykpIHtcbiAgICB2YXIgaDtcbiAgICAvLyBOT1RFOiBJIHRoaW5rIHRoaXMgaXMgcHJvYmFibHkgYnJva2VuIG5vdywgc2luY2UgZy5nZXRPcHRpb24oKSBub3dcbiAgICAvLyBoaXRzIHRoZSBkaWN0aW9uYXJ5LiAoVGhhdCBpcywgZy5nZXRPcHRpb24oJ3hBeGlzSGVpZ2h0Jykgbm93IGFsd2F5c1xuICAgIC8vIGhhcyBhIHZhbHVlLilcbiAgICBpZiAoZy5nZXRPcHRpb24oJ3hBeGlzSGVpZ2h0JykpIHtcbiAgICAgIGggPSBnLmdldE9wdGlvbigneEF4aXNIZWlnaHQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IGcuZ2V0T3B0aW9uRm9yQXhpcygnYXhpc0xhYmVsRm9udFNpemUnLCAneCcpICsgMiAqIGcuZ2V0T3B0aW9uRm9yQXhpcygnYXhpc1RpY2tTaXplJywgJ3gnKTtcbiAgICB9XG4gICAgZS5yZXNlcnZlU3BhY2VCb3R0b20oaCk7XG4gIH1cblxuICBpZiAoZy5udW1BeGVzKCkgPT0gMikge1xuICAgIGlmIChnLmdldE9wdGlvbkZvckF4aXMoJ2RyYXdBeGlzJywgJ3kyJykpIHtcbiAgICAgIHZhciB3ID0gZy5nZXRPcHRpb25Gb3JBeGlzKCdheGlzTGFiZWxXaWR0aCcsICd5MicpICsgMiAqIGcuZ2V0T3B0aW9uRm9yQXhpcygnYXhpc1RpY2tTaXplJywgJ3kyJyk7XG4gICAgICBlLnJlc2VydmVTcGFjZVJpZ2h0KHcpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChnLm51bUF4ZXMoKSA+IDIpIHtcbiAgICBnLmVycm9yKCdPbmx5IHR3byB5LWF4ZXMgYXJlIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuIChUcnlpbmcgJyArXG4gICAgICAgICAgICAndG8gdXNlICcgKyBnLm51bUF4ZXMoKSArICcpJyk7XG4gIH1cbn07XG5cbmF4ZXMucHJvdG90eXBlLmRldGFjaExhYmVscyA9IGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiByZW1vdmVBcnJheShhcnkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyeS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gYXJ5W2ldO1xuICAgICAgaWYgKGVsLnBhcmVudE5vZGUpIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUFycmF5KHRoaXMueGxhYmVsc18pO1xuICByZW1vdmVBcnJheSh0aGlzLnlsYWJlbHNfKTtcbiAgdGhpcy54bGFiZWxzXyA9IFtdO1xuICB0aGlzLnlsYWJlbHNfID0gW107XG59O1xuXG5heGVzLnByb3RvdHlwZS5jbGVhckNoYXJ0ID0gZnVuY3Rpb24oZSkge1xuICB0aGlzLmRldGFjaExhYmVscygpO1xufTtcblxuYXhlcy5wcm90b3R5cGUud2lsbERyYXdDaGFydCA9IGZ1bmN0aW9uKGUpIHtcbiAgdmFyIGcgPSBlLmR5Z3JhcGg7XG5cbiAgaWYgKCFnLmdldE9wdGlvbkZvckF4aXMoJ2RyYXdBeGlzJywgJ3gnKSAmJlxuICAgICAgIWcuZ2V0T3B0aW9uRm9yQXhpcygnZHJhd0F4aXMnLCAneScpICYmXG4gICAgICAhZy5nZXRPcHRpb25Gb3JBeGlzKCdkcmF3QXhpcycsICd5MicpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUm91bmQgcGl4ZWxzIHRvIGhhbGYtaW50ZWdlciBib3VuZGFyaWVzIGZvciBjcmlzcGVyIGRyYXdpbmcuXG4gIGZ1bmN0aW9uIGhhbGZVcCh4KSAgeyByZXR1cm4gTWF0aC5yb3VuZCh4KSArIDAuNTsgfVxuICBmdW5jdGlvbiBoYWxmRG93bih5KXsgcmV0dXJuIE1hdGgucm91bmQoeSkgLSAwLjU7IH1cblxuICB2YXIgY29udGV4dCA9IGUuZHJhd2luZ0NvbnRleHQ7XG4gIHZhciBjb250YWluZXJEaXYgPSBlLmNhbnZhcy5wYXJlbnROb2RlO1xuICB2YXIgY2FudmFzV2lkdGggPSBnLndpZHRoXzsgIC8vIGUuY2FudmFzLndpZHRoIGlzIGFmZmVjdGVkIGJ5IHBpeGVsIHJhdGlvLlxuICB2YXIgY2FudmFzSGVpZ2h0ID0gZy5oZWlnaHRfO1xuXG4gIHZhciBsYWJlbCwgeCwgeSwgdGljaywgaTtcblxuICB2YXIgbWFrZUxhYmVsU3R5bGUgPSBmdW5jdGlvbihheGlzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgZm9udFNpemU6IGcuZ2V0T3B0aW9uRm9yQXhpcygnYXhpc0xhYmVsRm9udFNpemUnLCBheGlzKSArICdweCcsXG4gICAgICB3aWR0aDogZy5nZXRPcHRpb25Gb3JBeGlzKCdheGlzTGFiZWxXaWR0aCcsIGF4aXMpICsgJ3B4JyxcbiAgICB9O1xuICB9O1xuXG4gIHZhciBsYWJlbFN0eWxlcyA9IHtcbiAgICB4OiBtYWtlTGFiZWxTdHlsZSgneCcpLFxuICAgIHk6IG1ha2VMYWJlbFN0eWxlKCd5JyksXG4gICAgeTI6IG1ha2VMYWJlbFN0eWxlKCd5MicpXG4gIH07XG5cbiAgdmFyIG1ha2VEaXYgPSBmdW5jdGlvbih0eHQsIGF4aXMsIHByZWNfYXhpcykge1xuICAgIC8qXG4gICAgICogVGhpcyBzZWVtcyB0byBiZSBjYWxsZWQgd2l0aCB0aGUgZm9sbG93aW5nIHRocmVlIHNldHMgb2YgYXhpcy9wcmVjX2F4aXM6XG4gICAgICogeDogdW5kZWZpbmVkXG4gICAgICogeTogeTFcbiAgICAgKiB5OiB5MlxuICAgICAqL1xuICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB2YXIgbGFiZWxTdHlsZSA9IGxhYmVsU3R5bGVzW3ByZWNfYXhpcyA9PSAneTInID8gJ3kyJyA6IGF4aXNdO1xuICAgIHV0aWxzLnVwZGF0ZShkaXYuc3R5bGUsIGxhYmVsU3R5bGUpO1xuICAgIC8vIFRPRE86IGNvbWJpbmUgb3V0ZXIgJiBpbm5lciBkaXZzXG4gICAgdmFyIGlubmVyX2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGlubmVyX2Rpdi5jbGFzc05hbWUgPSAnZHlncmFwaC1heGlzLWxhYmVsJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcgZHlncmFwaC1heGlzLWxhYmVsLScgKyBheGlzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZWNfYXhpcyA/ICcgZHlncmFwaC1heGlzLWxhYmVsLScgKyBwcmVjX2F4aXMgOiAnJyk7XG4gICAgaW5uZXJfZGl2LmlubmVySFRNTCA9IHR4dDtcbiAgICBkaXYuYXBwZW5kQ2hpbGQoaW5uZXJfZGl2KTtcbiAgICByZXR1cm4gZGl2O1xuICB9O1xuXG4gIC8vIGF4aXMgbGluZXNcbiAgY29udGV4dC5zYXZlKCk7XG5cbiAgdmFyIGxheW91dCA9IGcubGF5b3V0XztcbiAgdmFyIGFyZWEgPSBlLmR5Z3JhcGgucGxvdHRlcl8uYXJlYTtcblxuICAvLyBIZWxwZXIgZm9yIHJlcGVhdGVkIGF4aXMtb3B0aW9uIGFjY2Vzc2VzLlxuICB2YXIgbWFrZU9wdGlvbkdldHRlciA9IGZ1bmN0aW9uKGF4aXMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob3B0aW9uKSB7XG4gICAgICByZXR1cm4gZy5nZXRPcHRpb25Gb3JBeGlzKG9wdGlvbiwgYXhpcyk7XG4gICAgfTtcbiAgfTtcblxuICBjb25zdCB0aGF0ID0gdGhpcztcblxuICBpZiAoZy5nZXRPcHRpb25Gb3JBeGlzKCdkcmF3QXhpcycsICd5JykgfHxcbiAgICAgIChnLm51bUF4ZXMoKSA9PSAyICYmIGcuZ2V0T3B0aW9uRm9yQXhpcygnZHJhd0F4aXMnLCAneTInKSkpIHtcbiAgICBpZiAobGF5b3V0Lnl0aWNrcyAmJiBsYXlvdXQueXRpY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBudW1fYXhlcyA9IGcubnVtQXhlcygpO1xuICAgICAgdmFyIGdldE9wdGlvbnMgPSBbbWFrZU9wdGlvbkdldHRlcigneScpLCBtYWtlT3B0aW9uR2V0dGVyKCd5MicpXTtcbiAgICAgIGxheW91dC55dGlja3MuZm9yRWFjaChmdW5jdGlvbiAodGljaykge1xuICAgICAgICBpZiAodGljay5sYWJlbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47ICAvLyB0aGlzIHRpY2sgb25seSBoYXMgYSBncmlkIGxpbmUuXG4gICAgICAgIHggPSBhcmVhLng7XG4gICAgICAgIHZhciBzZ24gPSAxO1xuICAgICAgICB2YXIgcHJlY19heGlzID0gJ3kxJztcbiAgICAgICAgdmFyIGdldEF4aXNPcHRpb24gPSBnZXRPcHRpb25zWzBdO1xuICAgICAgICBpZiAodGljay5heGlzID09IDEpIHsgIC8vIHJpZ2h0LXNpZGUgeS1heGlzXG4gICAgICAgICAgeCA9IGFyZWEueCArIGFyZWEudztcbiAgICAgICAgICBzZ24gPSAtMTtcbiAgICAgICAgICBwcmVjX2F4aXMgPSAneTInO1xuICAgICAgICAgIGdldEF4aXNPcHRpb24gPSBnZXRPcHRpb25zWzFdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZ2V0QXhpc09wdGlvbignZHJhd0F4aXMnKSkgcmV0dXJuO1xuICAgICAgICB2YXIgZm9udFNpemUgPSBnZXRBeGlzT3B0aW9uKCdheGlzTGFiZWxGb250U2l6ZScpO1xuICAgICAgICB5ID0gYXJlYS55ICsgdGljay5wb3MgKiBhcmVhLmg7XG5cbiAgICAgICAgLyogVGljayBtYXJrcyBhcmUgY3VycmVudGx5IGNsaXBwZWQsIHNvIGRvbid0IGJvdGhlciBkcmF3aW5nIHRoZW0uXG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIGNvbnRleHQubW92ZVRvKGhhbGZVcCh4KSwgaGFsZkRvd24oeSkpO1xuICAgICAgICBjb250ZXh0LmxpbmVUbyhoYWxmVXAoeCAtIHNnbiAqIHRoYXQuYXR0cl8oJ2F4aXNUaWNrU2l6ZScpKSwgaGFsZkRvd24oeSkpO1xuICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICAqL1xuXG4gICAgICAgIGxhYmVsID0gbWFrZURpdih0aWNrLmxhYmVsLCAneScsIG51bV9heGVzID09IDIgPyBwcmVjX2F4aXMgOiBudWxsKTtcbiAgICAgICAgdmFyIHRvcCA9ICh5IC0gZm9udFNpemUgLyAyKTtcbiAgICAgICAgaWYgKHRvcCA8IDApIHRvcCA9IDA7XG5cbiAgICAgICAgaWYgKHRvcCArIGZvbnRTaXplICsgMyA+IGNhbnZhc0hlaWdodCkge1xuICAgICAgICAgIGxhYmVsLnN0eWxlLmJvdHRvbSA9ICcwJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGUgbG93ZXN0IHRpY2sgb24gdGhlIHktYXhpcyBvZnRlbiBvdmVybGFwcyB3aXRoIHRoZSBsZWZ0bW9zdFxuICAgICAgICAgIC8vIHRpY2sgb24gdGhlIHgtYXhpcy4gU2hpZnQgdGhlIGJvdHRvbSB0aWNrIHVwIGEgbGl0dGxlIGJpdCB0b1xuICAgICAgICAgIC8vIGNvbXBlbnNhdGUgaWYgbmVjZXNzYXJ5LlxuICAgICAgICAgIGxhYmVsLnN0eWxlLnRvcCA9IE1hdGgubWluKHRvcCwgY2FudmFzSGVpZ2h0IC0gKDIgKiBmb250U2l6ZSkpICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHRoZXNlIHdpdGggY3NzIGNsYXNzZXM/XG4gICAgICAgIGlmICh0aWNrLmF4aXMgPT09IDApIHtcbiAgICAgICAgICBsYWJlbC5zdHlsZS5sZWZ0ID0gKGFyZWEueCAtIGdldEF4aXNPcHRpb24oJ2F4aXNMYWJlbFdpZHRoJykgLSBnZXRBeGlzT3B0aW9uKCdheGlzVGlja1NpemUnKSkgKyAncHgnO1xuICAgICAgICAgIGxhYmVsLnN0eWxlLnRleHRBbGlnbiA9ICdyaWdodCc7XG4gICAgICAgIH0gZWxzZSBpZiAodGljay5heGlzID09IDEpIHtcbiAgICAgICAgICBsYWJlbC5zdHlsZS5sZWZ0ID0gKGFyZWEueCArIGFyZWEudyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBeGlzT3B0aW9uKCdheGlzVGlja1NpemUnKSkgKyAncHgnO1xuICAgICAgICAgIGxhYmVsLnN0eWxlLnRleHRBbGlnbiA9ICdsZWZ0JztcbiAgICAgICAgfVxuICAgICAgICBsYWJlbC5zdHlsZS53aWR0aCA9IGdldEF4aXNPcHRpb24oJ2F4aXNMYWJlbFdpZHRoJykgKyAncHgnO1xuICAgICAgICBjb250YWluZXJEaXYuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICAgICAgICB0aGF0LnlsYWJlbHNfLnB1c2gobGFiZWwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZHJhdyBhIHZlcnRpY2FsIGxpbmUgb24gdGhlIGxlZnQgdG8gc2VwYXJhdGUgdGhlIGNoYXJ0IGZyb20gdGhlIGxhYmVscy5cbiAgICB2YXIgYXhpc1g7XG4gICAgaWYgKGcuZ2V0T3B0aW9uKCdkcmF3QXhlc0F0WmVybycpKSB7XG4gICAgICB2YXIgciA9IGcudG9QZXJjZW50WENvb3JkKDApO1xuICAgICAgaWYgKHIgPiAxIHx8IHIgPCAwIHx8IGlzTmFOKHIpKSByID0gMDtcbiAgICAgIGF4aXNYID0gaGFsZlVwKGFyZWEueCArIHIgKiBhcmVhLncpO1xuICAgIH0gZWxzZSB7XG4gICAgICBheGlzWCA9IGhhbGZVcChhcmVhLngpO1xuICAgIH1cblxuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBnLmdldE9wdGlvbkZvckF4aXMoJ2F4aXNMaW5lQ29sb3InLCAneScpO1xuICAgIGNvbnRleHQubGluZVdpZHRoID0gZy5nZXRPcHRpb25Gb3JBeGlzKCdheGlzTGluZVdpZHRoJywgJ3knKTtcblxuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5tb3ZlVG8oYXhpc1gsIGhhbGZEb3duKGFyZWEueSkpO1xuICAgIGNvbnRleHQubGluZVRvKGF4aXNYLCBoYWxmRG93bihhcmVhLnkgKyBhcmVhLmgpKTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG5cbiAgICAvLyBpZiB0aGVyZSdzIGEgc2Vjb25kYXJ5IHktYXhpcywgZHJhdyBhIHZlcnRpY2FsIGxpbmUgZm9yIHRoYXQsIHRvby5cbiAgICBpZiAoZy5udW1BeGVzKCkgPT0gMiAmJiBnLmdldE9wdGlvbkZvckF4aXMoJ2RyYXdBeGlzJywgJ3kyJykpIHtcbiAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBnLmdldE9wdGlvbkZvckF4aXMoJ2F4aXNMaW5lQ29sb3InLCAneTInKTtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gZy5nZXRPcHRpb25Gb3JBeGlzKCdheGlzTGluZVdpZHRoJywgJ3kyJyk7XG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgY29udGV4dC5tb3ZlVG8oaGFsZkRvd24oYXJlYS54ICsgYXJlYS53KSwgaGFsZkRvd24oYXJlYS55KSk7XG4gICAgICBjb250ZXh0LmxpbmVUbyhoYWxmRG93bihhcmVhLnggKyBhcmVhLncpLCBoYWxmRG93bihhcmVhLnkgKyBhcmVhLmgpKTtcbiAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChnLmdldE9wdGlvbkZvckF4aXMoJ2RyYXdBeGlzJywgJ3gnKSkge1xuICAgIGlmIChsYXlvdXQueHRpY2tzKSB7XG4gICAgICB2YXIgZ2V0QXhpc09wdGlvbiA9IG1ha2VPcHRpb25HZXR0ZXIoJ3gnKTtcbiAgICAgIGxheW91dC54dGlja3MuZm9yRWFjaChmdW5jdGlvbiAodGljaykge1xuICAgICAgICBpZiAodGljay5sYWJlbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47ICAvLyB0aGlzIHRpY2sgb25seSBoYXMgYSBncmlkIGxpbmUuXG4gICAgICAgIHggPSBhcmVhLnggKyB0aWNrLnBvcyAqIGFyZWEudztcbiAgICAgICAgeSA9IGFyZWEueSArIGFyZWEuaDtcblxuICAgICAgICAvKiBUaWNrIG1hcmtzIGFyZSBjdXJyZW50bHkgY2xpcHBlZCwgc28gZG9uJ3QgYm90aGVyIGRyYXdpbmcgdGhlbS5cbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29udGV4dC5tb3ZlVG8oaGFsZlVwKHgpLCBoYWxmRG93bih5KSk7XG4gICAgICAgIGNvbnRleHQubGluZVRvKGhhbGZVcCh4KSwgaGFsZkRvd24oeSArIHRoYXQuYXR0cl8oJ2F4aXNUaWNrU2l6ZScpKSk7XG4gICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgICovXG5cbiAgICAgICAgbGFiZWwgPSBtYWtlRGl2KHRpY2subGFiZWwsICd4Jyk7XG4gICAgICAgIGxhYmVsLnN0eWxlLnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICBsYWJlbC5zdHlsZS50b3AgPSAoeSArIGdldEF4aXNPcHRpb24oJ2F4aXNUaWNrU2l6ZScpKSArICdweCc7XG5cbiAgICAgICAgdmFyIGxlZnQgPSAoeCAtIGdldEF4aXNPcHRpb24oJ2F4aXNMYWJlbFdpZHRoJykvMik7XG4gICAgICAgIGlmIChsZWZ0ICsgZ2V0QXhpc09wdGlvbignYXhpc0xhYmVsV2lkdGgnKSA+IGNhbnZhc1dpZHRoKSB7XG4gICAgICAgICAgbGVmdCA9IGNhbnZhc1dpZHRoIC0gZ2V0QXhpc09wdGlvbignYXhpc0xhYmVsV2lkdGgnKTtcbiAgICAgICAgICBsYWJlbC5zdHlsZS50ZXh0QWxpZ24gPSAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZWZ0IDwgMCkge1xuICAgICAgICAgIGxlZnQgPSAwO1xuICAgICAgICAgIGxhYmVsLnN0eWxlLnRleHRBbGlnbiA9ICdsZWZ0JztcbiAgICAgICAgfVxuXG4gICAgICAgIGxhYmVsLnN0eWxlLmxlZnQgPSBsZWZ0ICsgJ3B4JztcbiAgICAgICAgbGFiZWwuc3R5bGUud2lkdGggPSBnZXRBeGlzT3B0aW9uKCdheGlzTGFiZWxXaWR0aCcpICsgJ3B4JztcbiAgICAgICAgY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGxhYmVsKTtcbiAgICAgICAgdGhhdC54bGFiZWxzXy5wdXNoKGxhYmVsKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBnLmdldE9wdGlvbkZvckF4aXMoJ2F4aXNMaW5lQ29sb3InLCAneCcpO1xuICAgIGNvbnRleHQubGluZVdpZHRoID0gZy5nZXRPcHRpb25Gb3JBeGlzKCdheGlzTGluZVdpZHRoJywgJ3gnKTtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIHZhciBheGlzWTtcbiAgICBpZiAoZy5nZXRPcHRpb24oJ2RyYXdBeGVzQXRaZXJvJykpIHtcbiAgICAgIHZhciByID0gZy50b1BlcmNlbnRZQ29vcmQoMCwgMCk7XG4gICAgICBpZiAociA+IDEgfHwgciA8IDApIHIgPSAxO1xuICAgICAgYXhpc1kgPSBoYWxmRG93bihhcmVhLnkgKyByICogYXJlYS5oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXhpc1kgPSBoYWxmRG93bihhcmVhLnkgKyBhcmVhLmgpO1xuICAgIH1cbiAgICBjb250ZXh0Lm1vdmVUbyhoYWxmVXAoYXJlYS54KSwgYXhpc1kpO1xuICAgIGNvbnRleHQubGluZVRvKGhhbGZVcChhcmVhLnggKyBhcmVhLncpLCBheGlzWSk7XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuICB9XG5cbiAgY29udGV4dC5yZXN0b3JlKCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBheGVzO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLFlBQVk7O0FBRVo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFUQUEsTUFBQSxDQUFBQyxjQUFBLENBQUFDLE9BQUE7RUFBQUMsS0FBQTtBQUFBO0FBQUFELE9BQUE7QUFXQSxJQUFBRSxLQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFBMEMsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFILHdCQUFBRyxDQUFBLEVBQUFFLENB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