UNPKG

react-native-chart-kit

Version:

If you're looking to **build a website or a cross-platform mobile app** – we will be happy to help you! Send a note to clients@ui1.io and we will be in touch with you shortly.

296 lines 41.4 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; import _ from "lodash"; import React from "react"; import { View } from "react-native"; import { G, Rect, Svg, Text } from "react-native-svg"; import AbstractChart from "../AbstractChart"; import { mapValue } from "../Utils"; import { convertToDate, getBeginningTimeForDate, shiftDate } from "./DateHelpers"; import { DAYS_IN_WEEK, MILLISECONDS_IN_ONE_DAY, MONTH_LABELS } from "./constants"; var SQUARE_SIZE = 20; var MONTH_LABEL_GUTTER_SIZE = 8; var paddingLeft = 32; var ContributionGraph = /** @class */ (function (_super) { __extends(ContributionGraph, _super); function ContributionGraph(props) { var _this = _super.call(this, props) || this; var _a = _this.getValueCache(props.values), maxValue = _a.maxValue, minValue = _a.minValue, valueCache = _a.valueCache; _this.state = { maxValue: maxValue, minValue: minValue, valueCache: valueCache }; return _this; } ContributionGraph.prototype.UNSAFE_componentWillReceiveProps = function (nextProps) { var _a = this.getValueCache(nextProps.values), maxValue = _a.maxValue, minValue = _a.minValue, valueCache = _a.valueCache; this.setState({ maxValue: maxValue, minValue: minValue, valueCache: valueCache }); }; ContributionGraph.prototype.getSquareSizeWithGutter = function () { return (this.props.squareSize || SQUARE_SIZE) + this.props.gutterSize; }; ContributionGraph.prototype.getMonthLabelSize = function () { var _a = this.props.squareSize, squareSize = _a === void 0 ? SQUARE_SIZE : _a; if (!this.props.showMonthLabels) { return 0; } if (this.props.horizontal) { return squareSize + MONTH_LABEL_GUTTER_SIZE; } return 2 * (squareSize + MONTH_LABEL_GUTTER_SIZE); }; ContributionGraph.prototype.getStartDate = function () { return shiftDate(this.getEndDate(), -this.props.numDays + 1); // +1 because endDate is inclusive }; ContributionGraph.prototype.getEndDate = function () { return getBeginningTimeForDate(convertToDate(this.props.endDate)); }; ContributionGraph.prototype.getStartDateWithEmptyDays = function () { return shiftDate(this.getStartDate(), -this.getNumEmptyDaysAtStart()); }; ContributionGraph.prototype.getNumEmptyDaysAtStart = function () { return this.getStartDate().getDay(); }; ContributionGraph.prototype.getNumEmptyDaysAtEnd = function () { return DAYS_IN_WEEK - 1 - this.getEndDate().getDay(); }; ContributionGraph.prototype.getWeekCount = function () { var numDaysRoundedToWeek = this.props.numDays + this.getNumEmptyDaysAtStart() + this.getNumEmptyDaysAtEnd(); return Math.ceil(numDaysRoundedToWeek / DAYS_IN_WEEK); }; ContributionGraph.prototype.getWeekWidth = function () { return DAYS_IN_WEEK * this.getSquareSizeWithGutter(); }; ContributionGraph.prototype.getWidth = function () { return (this.getWeekCount() * this.getSquareSizeWithGutter() - this.props.gutterSize); }; ContributionGraph.prototype.getHeight = function () { return (this.getWeekWidth() + (this.getMonthLabelSize() - this.props.gutterSize)); }; ContributionGraph.prototype.getValueCache = function (values) { var _this = this; var minValue = Infinity, maxValue = -Infinity; return { valueCache: values.reduce(function (memo, value) { var date = convertToDate(value.date); var index = Math.floor((date.valueOf() - _this.getStartDateWithEmptyDays().valueOf()) / MILLISECONDS_IN_ONE_DAY); minValue = Math.min(value[_this.props.accessor], minValue); maxValue = Math.max(value[_this.props.accessor], maxValue); memo[index] = { value: value, title: _this.props.titleForValue ? _this.props.titleForValue(value) : null, tooltipDataAttrs: _this.getTooltipDataAttrsForValue(value) }; return memo; }, {}), minValue: minValue, maxValue: maxValue }; }; ContributionGraph.prototype.getValueForIndex = function (index) { if (this.state.valueCache[index]) { return this.state.valueCache[index].value; } return null; }; ContributionGraph.prototype.getClassNameForIndex = function (index) { if (this.state.valueCache[index]) { if (this.state.valueCache[index].value) { var count = this.state.valueCache[index].value[this.props.accessor]; if (count) { var opacity = mapValue(count, this.state.maxValue === this.state.minValue ? 0 : this.state.minValue, isNaN(this.state.maxValue) ? 1 : this.state.maxValue, 0.15 + 0.05, // + 0.05 to make smaller values a bit more visible 1); return this.props.chartConfig.color(opacity); } } } return this.props.chartConfig.color(0.15); }; ContributionGraph.prototype.getTitleForIndex = function (index) { if (this.state.valueCache[index]) { return this.state.valueCache[index].title; } return this.props.titleForValue ? this.props.titleForValue(null) : null; }; ContributionGraph.prototype.getTooltipDataAttrsForIndex = function (index) { var _a; if (this.state.valueCache[index]) { return this.state.valueCache[index].tooltipDataAttrs; } return this.getTooltipDataAttrsForValue((_a = { date: null }, _a[this.props.accessor] = null, _a)); }; ContributionGraph.prototype.getTooltipDataAttrsForValue = function (value) { var tooltipDataAttrs = this.props.tooltipDataAttrs; if (typeof tooltipDataAttrs === "function") { return tooltipDataAttrs(value); } return tooltipDataAttrs; }; ContributionGraph.prototype.getTransformForWeek = function (weekIndex) { if (this.props.horizontal) { return [weekIndex * this.getSquareSizeWithGutter(), 50]; } return [10, weekIndex * this.getSquareSizeWithGutter()]; }; ContributionGraph.prototype.getTransformForMonthLabels = function () { if (this.props.horizontal) { return null; } return this.getWeekWidth() + MONTH_LABEL_GUTTER_SIZE + ", 0"; }; ContributionGraph.prototype.getTransformForAllWeeks = function () { if (this.props.horizontal) { return "0, " + (this.getMonthLabelSize() - 100); } return null; }; ContributionGraph.prototype.getViewBox = function () { if (this.props.horizontal) { return this.getWidth() + " " + this.getHeight(); } return this.getHeight() + " " + this.getWidth(); }; ContributionGraph.prototype.getSquareCoordinates = function (dayIndex) { if (this.props.horizontal) { return [0, dayIndex * this.getSquareSizeWithGutter()]; } return [dayIndex * this.getSquareSizeWithGutter(), 0]; }; ContributionGraph.prototype.getMonthLabelCoordinates = function (weekIndex) { if (this.props.horizontal) { return [ weekIndex * this.getSquareSizeWithGutter(), this.getMonthLabelSize() - MONTH_LABEL_GUTTER_SIZE ]; } var verticalOffset = -2; return [ 0, (weekIndex + 1) * this.getSquareSizeWithGutter() + verticalOffset ]; }; ContributionGraph.prototype.renderSquare = function (dayIndex, index) { var _this = this; var indexOutOfRange = index < this.getNumEmptyDaysAtStart() || index >= this.getNumEmptyDaysAtStart() + this.props.numDays; if (indexOutOfRange && !this.props.showOutOfRangeDays) { return null; } var _a = this.getSquareCoordinates(dayIndex), x = _a[0], y = _a[1]; var _b = this.props.squareSize, squareSize = _b === void 0 ? SQUARE_SIZE : _b; return (<Rect key={index} width={squareSize} height={squareSize} x={x + paddingLeft} y={y} title={this.getTitleForIndex(index)} fill={this.getClassNameForIndex(index)} onPress={function () { _this.handleDayPress(index); }} {...this.getTooltipDataAttrsForIndex(index)}/>); }; ContributionGraph.prototype.handleDayPress = function (index) { var _a; if (!this.props.onDayPress) { return; } this.props.onDayPress(this.state.valueCache[index] && this.state.valueCache[index].value ? this.state.valueCache[index].value : (_a = {}, _a[this.props.accessor] = 0, _a.date = new Date(this.getStartDate().valueOf() + index * MILLISECONDS_IN_ONE_DAY), _a)); }; ContributionGraph.prototype.renderWeek = function (weekIndex) { var _this = this; var _a = this.getTransformForWeek(weekIndex), x = _a[0], y = _a[1]; return (<G key={weekIndex} x={x} y={y}> {_.range(DAYS_IN_WEEK).map(function (dayIndex) { return _this.renderSquare(dayIndex, weekIndex * DAYS_IN_WEEK + dayIndex); })} </G>); }; ContributionGraph.prototype.renderAllWeeks = function () { var _this = this; return _.range(this.getWeekCount()).map(function (weekIndex) { return _this.renderWeek(weekIndex); }); }; ContributionGraph.prototype.renderMonthLabels = function () { var _this = this; if (!this.props.showMonthLabels) { return null; } var weekRange = _.range(this.getWeekCount() - 1); // don't render for last week, because label will be cut off return weekRange.map(function (weekIndex) { var endOfWeek = shiftDate(_this.getStartDateWithEmptyDays(), (weekIndex + 1) * DAYS_IN_WEEK); var _a = _this.getMonthLabelCoordinates(weekIndex), x = _a[0], y = _a[1]; return endOfWeek.getDate() >= 1 && endOfWeek.getDate() <= DAYS_IN_WEEK ? (<Text key={weekIndex} x={x + paddingLeft} y={y + 8} {..._this.getPropsForLabels()}> {_this.props.getMonthLabel ? _this.props.getMonthLabel(endOfWeek.getMonth()) : MONTH_LABELS[endOfWeek.getMonth()]} </Text>) : null; }); }; ContributionGraph.prototype.render = function () { var style = this.props.style; var _a = style.borderRadius, borderRadius = _a === void 0 ? 0 : _a; if (!borderRadius && this.props.chartConfig.style) { var stupidXo = this.props.chartConfig.style.borderRadius; borderRadius = stupidXo; } return (<View style={style}> <Svg height={this.props.height} width={this.props.width}> {this.renderDefs(__assign({ width: this.props.width, height: this.props.height }, this.props.chartConfig))} <Rect width="100%" height={this.props.height} rx={borderRadius} ry={borderRadius} fill="url(#backgroundGradient)"/> <G>{this.renderMonthLabels()}</G> <G>{this.renderAllWeeks()}</G> </Svg> </View>); }; ContributionGraph.defaultProps = { numDays: 200, endDate: new Date(), gutterSize: 1, squareSize: SQUARE_SIZE, horizontal: true, showMonthLabels: true, showOutOfRangeDays: false, accessor: "count", classForValue: function (value) { return (value ? "black" : "#8cc665"); }, style: {} }; return ContributionGraph; }(AbstractChart)); export default ContributionGraph; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJpYnV0aW9uR3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJpYnV0aW9uLWdyYXBoL0NvbnRyaWJ1dGlvbkdyYXBoLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDdkIsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQWEsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWpFLE9BQU8sYUFBYSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEMsT0FBTyxFQUNMLGFBQWEsRUFDYix1QkFBdUIsRUFDdkIsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLFlBQVksRUFDYixNQUFNLGFBQWEsQ0FBQztBQUdyQixJQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDdkIsSUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUM7QUFDbEMsSUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBYXZCO0lBQWdDLHFDQUcvQjtJQUNDLDJCQUFZLEtBQTZCO1FBQXpDLFlBQ0Usa0JBQU0sS0FBSyxDQUFDLFNBU2I7UUFQSyxJQUFBLEtBQXFDLEtBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFuRSxRQUFRLGNBQUEsRUFBRSxRQUFRLGNBQUEsRUFBRSxVQUFVLGdCQUFxQyxDQUFDO1FBRTFFLEtBQUksQ0FBQyxLQUFLLEdBQUc7WUFDWCxRQUFRLFVBQUE7WUFDUixRQUFRLFVBQUE7WUFDUixVQUFVLFlBQUE7U0FDWCxDQUFD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c2hcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFZpZXcgfSBmcm9tIFwicmVhY3QtbmF0aXZlXCI7XG5pbXBvcnQgeyBHLCBSZWN0LCBSZWN0UHJvcHMsIFN2ZywgVGV4dCB9IGZyb20gXCJyZWFjdC1uYXRpdmUtc3ZnXCI7XG5cbmltcG9ydCBBYnN0cmFjdENoYXJ0IGZyb20gXCIuLi9BYnN0cmFjdENoYXJ0XCI7XG5pbXBvcnQgeyBtYXBWYWx1ZSB9IGZyb20gXCIuLi9VdGlsc1wiO1xuaW1wb3J0IHtcbiAgY29udmVydFRvRGF0ZSxcbiAgZ2V0QmVnaW5uaW5nVGltZUZvckRhdGUsXG4gIHNoaWZ0RGF0ZVxufSBmcm9tIFwiLi9EYXRlSGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgREFZU19JTl9XRUVLLFxuICBNSUxMSVNFQ09ORFNfSU5fT05FX0RBWSxcbiAgTU9OVEhfTEFCRUxTXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29udHJpYnV0aW9uR3JhcGhQcm9wcywgQ29udHJpYnV0aW9uR3JhcGhTdGF0ZSB9IGZyb20gXCIuXCI7XG5cbmNvbnN0IFNRVUFSRV9TSVpFID0gMjA7XG5jb25zdCBNT05USF9MQUJFTF9HVVRURVJfU0laRSA9IDg7XG5jb25zdCBwYWRkaW5nTGVmdCA9IDMyO1xuXG5leHBvcnQgdHlwZSBDb250cmlidXRpb25DaGFydFZhbHVlID0ge1xuICB2YWx1ZTogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICB0b29sdGlwRGF0YUF0dHJzOiBUb29sdGlwRGF0YUF0dHJzO1xuICBkYXRlOiBEYXRlO1xufTtcblxuZXhwb3J0IHR5cGUgVG9vbHRpcERhdGFBdHRycyA9IChcbiAgdmFsdWU6IENvbnRyaWJ1dGlvbkNoYXJ0VmFsdWVcbikgPT4gUGFydGlhbDxSZWN0UHJvcHM+IHwgUGFydGlhbDxSZWN0UHJvcHM+O1xuXG5jbGFzcyBDb250cmlidXRpb25HcmFwaCBleHRlbmRzIEFic3RyYWN0Q2hhcnQ8XG4gIENvbnRyaWJ1dGlvbkdyYXBoUHJvcHMsXG4gIENvbnRyaWJ1dGlvbkdyYXBoU3RhdGVcbj4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogQ29udHJpYnV0aW9uR3JhcGhQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIGxldCB7IG1heFZhbHVlLCBtaW5WYWx1ZSwgdmFsdWVDYWNoZSB9ID0gdGhpcy5nZXRWYWx1ZUNhY2hlKHByb3BzLnZhbHVlcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbWF4VmFsdWUsXG4gICAgICBtaW5WYWx1ZSxcbiAgICAgIHZhbHVlQ2FjaGVcbiAgICB9O1xuICB9XG5cbiAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBDb250cmlidXRpb25HcmFwaFByb3BzKSB7XG4gICAgbGV0IHsgbWF4VmFsdWUsIG1pblZhbHVlLCB2YWx1ZUNhY2hlIH0gPSB0aGlzLmdldFZhbHVlQ2FjaGUoXG4gICAgICBuZXh0UHJvcHMudmFsdWVzXG4gICAgKTtcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbWF4VmFsdWUsXG4gICAgICBtaW5WYWx1ZSxcbiAgICAgIHZhbHVlQ2FjaGVcbiAgICB9KTtcbiAgfVxuXG4gIGdldFNxdWFyZVNpemVXaXRoR3V0dGVyKCkge1xuICAgIHJldHVybiAodGhpcy5wcm9wcy5zcXVhcmVTaXplIHx8IFNRVUFSRV9TSVpFKSArIHRoaXMucHJvcHMuZ3V0dGVyU2l6ZTtcbiAgfVxuXG4gIGdldE1vbnRoTGFiZWxTaXplKCkge1xuICAgIGxldCB7IHNxdWFyZVNpemUgPSBTUVVBUkVfU0laRSB9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoIXRoaXMucHJvcHMuc2hvd01vbnRoTGFiZWxzKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvcHMuaG9yaXpvbnRhbCkge1xuICAgICAgcmV0dXJuIHNxdWFyZVNpemUgKyBNT05USF9MQUJFTF9HVVRURVJfU0laRTtcbiAgICB9XG4gICAgcmV0dXJuIDIgKiAoc3F1YXJlU2l6ZSArIE1PTlRIX0xBQkVMX0dVVFRFUl9TSVpFKTtcbiAgfVxuXG4gIGdldFN0YXJ0RGF0ZSgpIHtcbiAgICByZXR1cm4gc2hpZnREYXRlKHRoaXMuZ2V0RW5kRGF0ZSgpLCAtdGhpcy5wcm9wcy5udW1EYXlzICsgMSk7IC8vICsxIGJlY2F1c2UgZW5kRGF0ZSBpcyBpbmNsdXNpdmVcbiAgfVxuXG4gIGdldEVuZERhdGUoKSB7XG4gICAgcmV0dXJuIGdldEJlZ2lubmluZ1RpbWVGb3JEYXRlKGNvbnZlcnRUb0RhdGUodGhpcy5wcm9wcy5lbmREYXRlKSk7XG4gIH1cblxuICBnZXRTdGFydERhdGVXaXRoRW1wdHlEYXlzKCkge1xuICAgIHJldHVybiBzaGlmdERhdGUodGhpcy5nZXRTdGFydERhdGUoKSwgLXRoaXMuZ2V0TnVtRW1wdHlEYXlzQXRTdGFydCgpKTtcbiAgfVxuXG4gIGdldE51bUVtcHR5RGF5c0F0U3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhcnREYXRlKCkuZ2V0RGF5KCk7XG4gIH1cblxuICBnZXROdW1FbXB0eURheXNBdEVuZCgpIHtcbiAgICByZXR1cm4gREFZU19JTl9XRUVLIC0gMSAtIHRoaXMuZ2V0RW5kRGF0ZSgpLmdldERheSgpO1xuICB9XG5cbiAgZ2V0V2Vla0NvdW50KCkge1xuICAgIGNvbnN0IG51bURheXNSb3VuZGVkVG9XZWVrID1cbiAgICAgIHRoaXMucHJvcHMubnVtRGF5cyArXG4gICAgICB0aGlzLmdldE51bUVtcHR5RGF5c0F0U3RhcnQoKSArXG4gICAgICB0aGlzLmdldE51bUVtcHR5RGF5c0F0RW5kKCk7XG4gICAgcmV0dXJuIE1hdGguY2VpbChudW1EYXlzUm91bmRlZFRvV2VlayAvIERBWVNfSU5fV0VFSyk7XG4gIH1cblxuICBnZXRXZWVrV2lkdGgoKSB7XG4gICAgcmV0dXJuIERBWVNfSU5fV0VFSyAqIHRoaXMuZ2V0U3F1YXJlU2l6ZVdpdGhHdXR0ZXIoKTtcbiAgfVxuXG4gIGdldFdpZHRoKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmdldFdlZWtDb3VudCgpICogdGhpcy5nZXRTcXVhcmVTaXplV2l0aEd1dHRlcigpIC1cbiAgICAgIHRoaXMucHJvcHMuZ3V0dGVyU2l6ZVxuICAgICk7XG4gIH1cblxuICBnZXRIZWlnaHQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZ2V0V2Vla1dpZHRoKCkgKyAodGhpcy5nZXRNb250aExhYmVsU2l6ZSgpIC0gdGhpcy5wcm9wcy5ndXR0ZXJTaXplKVxuICAgICk7XG4gIH1cblxuICBnZXRWYWx1ZUNhY2hlKHZhbHVlczogQ29udHJpYnV0aW9uQ2hhcnRWYWx1ZVtdKSB7XG4gICAgbGV0IG1pblZhbHVlID0gSW5maW5pdHksXG4gICAgICBtYXhWYWx1ZSA9IC1JbmZpbml0eTtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZUNhY2hlOiB2YWx1ZXMucmVkdWNlKChtZW1vLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBkYXRlID0gY29udmVydFRvRGF0ZSh2YWx1ZS5kYXRlKTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgKGRhdGUudmFsdWVPZigpIC0gdGhpcy5nZXRTdGFydERhdGVXaXRoRW1wdHlEYXlzKCkudmFsdWVPZigpKSAvXG4gICAgICAgICAgICBNSUxMSVNFQ09ORFNfSU5fT05FX0RBWVxuICAgICAgICApO1xuXG4gICAgICAgIG1pblZhbHVlID0gTWF0aC5taW4odmFsdWVbdGhpcy5wcm9wcy5hY2Nlc3Nvcl0sIG1pblZhbHVlKTtcbiAgICAgICAgbWF4VmFsdWUgPSBNYXRoLm1heCh2YWx1ZVt0aGlzLnByb3BzLmFjY2Vzc29yXSwgbWF4VmFsdWUpO1xuXG4gICAgICAgIG1lbW9baW5kZXhdID0ge1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIHRpdGxlOiB0aGlzLnByb3BzLnRpdGxlRm9yVmFsdWVcbiAgICAgICAgICAgID8gdGhpcy5wcm9wcy50aXRsZUZvclZhbHVlKHZhbHVlKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHRvb2x0aXBEYXRhQXR0cnM6IHRoaXMuZ2V0VG9vbHRpcERhdGFBdHRyc0ZvclZhbHVlKHZhbHVlKVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgfSwge30pLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZVxuICAgIH07XG4gIH1cblxuICBnZXRWYWx1ZUZvckluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS52YWx1ZUNhY2hlW2luZGV4XSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUudmFsdWVDYWNoZVtpbmRleF0udmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lRm9ySW5kZXgoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnN0YXRlLnZhbHVlQ2FjaGVbaW5kZXhdKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS52YWx1ZUNhY2hlW2luZGV4XS52YWx1ZSkge1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuc3RhdGUudmFsdWVDYWNoZVtpbmRleF0udmFsdWVbdGhpcy5wcm9wcy5hY2Nlc3Nvcl07XG5cbiAgICAgICAgaWYgKGNvdW50KSB7XG4gICAgICAgICAgY29uc3Qgb3BhY2l0eSA9IG1hcFZhbHVlKFxuICAgICAgICAgICAgY291bnQsXG4gICAgICAgICAgICB0aGlzLnN0YXRlLm1heFZhbHVlID09PSB0aGlzLnN0YXRlLm1pblZhbHVlID8gMDogdGhpcy5zdGF0ZS5taW5WYWx1ZSxcbiAgICAgICAgICAgIGlzTmFOKHRoaXMuc3RhdGUubWF4VmFsdWUpID8gMSA6IHRoaXMuc3RhdGUubWF4VmFsdWUsXG4gICAgICAgICAgICAwLjE1ICsgMC4wNSwgLy8gKyAwLjA1IHRvIG1ha2Ugc21hbGxlciB2YWx1ZXMgYSBiaXQgbW9yZSB2aXNpYmxlXG4gICAgICAgICAgICAxXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoYXJ0Q29uZmlnLmNvbG9yKG9wYWNpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hhcnRDb25maWcuY29sb3IoMC4xNSk7XG4gIH1cblxuICBnZXRUaXRsZUZvckluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS52YWx1ZUNhY2hlW2luZGV4XSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUudmFsdWVDYWNoZVtpbmRleF0udGl0bGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMudGl0bGVGb3JWYWx1ZSA/IHRoaXMucHJvcHMudGl0bGVGb3JWYWx1ZShudWxsKSA6IG51bGw7XG4gIH1cblxuICBnZXRUb29sdGlwRGF0YUF0dHJzRm9ySW5kZXgoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnN0YXRlLnZhbHVlQ2FjaGVbaW5kZXhdKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZS52YWx1ZUNhY2hlW2luZGV4XS50b29sdGlwRGF0YUF0dHJzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFRvb2x0aXBEYXRhQXR0cnNGb3JWYWx1ZSh7XG4gICAgICBkYXRlOiBudWxsLFxuICAgICAgW3RoaXMucHJvcHMuYWNjZXNzb3JdOiBudWxsXG4gICAgfSBhcyBDb250cmlidXRpb25DaGFydFZhbHVlKTtcbiAgfVxuXG4gIGdldFRvb2x0aXBEYXRhQXR0cnNGb3JWYWx1ZSh2YWx1ZTogQ29udHJpYnV0aW9uQ2hhcnRWYWx1ZSkge1xuICAgIGNvbnN0IHsgdG9vbHRpcERhdGFBdHRycyB9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmICh0eXBlb2YgdG9vbHRpcERhdGFBdHRycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gdG9vbHRpcERhdGFBdHRycyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvb2x0aXBEYXRhQXR0cnM7XG4gIH1cblxuICBnZXRUcmFuc2Zvcm1Gb3JXZWVrKHdlZWtJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuaG9yaXpvbnRhbCkge1xuICAgICAgcmV0dXJuIFt3ZWVrSW5kZXggKiB0aGlzLmdldFNxdWFyZVNpemVXaXRoR3V0dGVyKCksIDUwXTtcbiAgICB9XG4gICAgcmV0dXJuIFsxMCwgd2Vla0luZGV4ICogdGhpcy5nZXRTcXVhcmVTaXplV2l0aEd1dHRlcigpXTtcbiAgfVxuXG4gIGdldFRyYW5zZm9ybUZvck1vbnRoTGFiZWxzKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmhvcml6b250YWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5nZXRXZWVrV2lkdGgoKSArIE1PTlRIX0xBQkVMX0dVVFRFUl9TSVpFfSwgMGA7XG4gIH1cblxuICBnZXRUcmFuc2Zvcm1Gb3JBbGxXZWVrcygpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5ob3Jpem9udGFsKSB7XG4gICAgICByZXR1cm4gYDAsICR7dGhpcy5nZXRNb250aExhYmVsU2l6ZSgpIC0gMTAwfWA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0Vmlld0JveCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5ob3Jpem9udGFsKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5nZXRXaWR0aCgpfSAke3RoaXMuZ2V0SGVpZ2h0KCl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0SGVpZ2h0KCl9ICR7dGhpcy5nZXRXaWR0aCgpfWA7XG4gIH1cblxuICBnZXRTcXVhcmVDb29yZGluYXRlcyhkYXlJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuaG9yaXpvbnRhbCkge1xuICAgICAgcmV0dXJuIFswLCBkYXlJbmRleCAqIHRoaXMuZ2V0U3F1YXJlU2l6ZVdpdGhHdXR0ZXIoKV07XG4gICAgfVxuICAgIHJldHVybiBbZGF5SW5kZXggKiB0aGlzLmdldFNxdWFyZVNpemVXaXRoR3V0dGVyKCksIDBdO1xuICB9XG5cbiAgZ2V0TW9udGhMYWJlbENvb3JkaW5hdGVzKHdlZWtJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuaG9yaXpvbnRhbCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgd2Vla0luZGV4ICogdGhpcy5nZXRTcXVhcmVTaXplV2l0aEd1dHRlcigpLFxuICAgICAgICB0aGlzLmdldE1vbnRoTGFiZWxTaXplKCkgLSBNT05USF9MQUJFTF9HVVRURVJfU0laRVxuICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgdmVydGljYWxPZmZzZXQgPSAtMjtcbiAgICByZXR1cm4gW1xuICAgICAgMCxcbiAgICAgICh3ZWVrSW5kZXggKyAxKSAqIHRoaXMuZ2V0U3F1YXJlU2l6ZVdpdGhHdXR0ZXIoKSArIHZlcnRpY2FsT2Zmc2V0XG4gICAgXTtcbiAgfVxuXG4gIHJlbmRlclNxdWFyZShkYXlJbmRleDogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgaW5kZXhPdXRPZlJhbmdlID1cbiAgICAgIGluZGV4IDwgdGhpcy5nZXROdW1FbXB0eURheXNBdFN0YXJ0KCkgfHxcbiAgICAgIGluZGV4ID49IHRoaXMuZ2V0TnVtRW1wdHlEYXlzQXRTdGFydCgpICsgdGhpcy5wcm9wcy5udW1EYXlzO1xuXG4gICAgaWYgKGluZGV4T3V0T2ZSYW5nZSAmJiAhdGhpcy5wcm9wcy5zaG93T3V0T2ZSYW5nZURheXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMuZ2V0U3F1YXJlQ29vcmRpbmF0ZXMoZGF5SW5kZXgpO1xuICAgIGNvbnN0IHsgc3F1YXJlU2l6ZSA9IFNRVUFSRV9TSVpFIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxSZWN0XG4gICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgIHdpZHRoPXtzcXVhcmVTaXplfVxuICAgICAgICBoZWlnaHQ9e3NxdWFyZVNpemV9XG4gICAgICAgIHg9e3ggKyBwYWRkaW5nTGVmdH1cbiAgICAgICAgeT17eX1cbiAgICAgICAgdGl0bGU9e3RoaXMuZ2V0VGl0bGVGb3JJbmRleChpbmRleCl9XG4gICAgICAgIGZpbGw9e3RoaXMuZ2V0Q2xhc3NOYW1lRm9ySW5kZXgoaW5kZXgpfVxuICAgICAgICBvblByZXNzPXsoKSA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVEYXlQcmVzcyhpbmRleCk7XG4gICAgICAgIH19XG4gICAgICAgIHsuLi50aGlzLmdldFRvb2x0aXBEYXRhQXR0cnNGb3JJbmRleChpbmRleCl9XG4gICAgICAvPlxuICAgICk7XG4gIH1cblxuICBoYW5kbGVEYXlQcmVzcyhpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLnByb3BzLm9uRGF5UHJlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByb3BzLm9uRGF5UHJlc3MoXG4gICAgICB0aGlzLnN0YXRlLnZhbHVlQ2FjaGVbaW5kZXhdICYmIHRoaXMuc3RhdGUudmFsdWVDYWNoZVtpbmRleF0udmFsdWVcbiAgICAgICAgPyB0aGlzLnN0YXRlLnZhbHVlQ2FjaGVbaW5kZXhdLnZhbHVlXG4gICAgICAgIDoge1xuICAgICAgICAgICAgW3RoaXMucHJvcHMuYWNjZXNzb3JdOiAwLFxuICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUoXG4gICAgICAgICAgICAgIHRoaXMuZ2V0U3RhcnREYXRlKCkudmFsdWVPZigpICsgaW5kZXggKiBNSUxMSVNFQ09ORFNfSU5fT05FX0RBWVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcmVuZGVyV2Vlayh3ZWVrSW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMuZ2V0VHJhbnNmb3JtRm9yV2Vlayh3ZWVrSW5kZXgpO1xuICAgIHJldHVybiAoXG4gICAgICA8RyBrZXk9e3dlZWtJbmRleH0geD17eH0geT17eX0+XG4gICAgICAgIHtfLnJhbmdlKERBWVNfSU5fV0VFSykubWFwKGRheUluZGV4ID0+XG4gICAgICAgICAgdGhpcy5yZW5kZXJTcXVhcmUoZGF5SW5kZXgsIHdlZWtJbmRleCAqIERBWVNfSU5fV0VFSyArIGRheUluZGV4KVxuICAgICAgICApfVxuICAgICAgPC9HPlxuICAgICk7XG4gIH1cblxuICByZW5kZXJBbGxXZWVrcygpIHtcbiAgICByZXR1cm4gXy5yYW5nZSh0aGlzLmdldFdlZWtDb3VudCgpKS5tYXAod2Vla0luZGV4ID0+XG4gICAgICB0aGlzLnJlbmRlcldlZWsod2Vla0luZGV4KVxuICAgICk7XG4gIH1cblxuICByZW5kZXJNb250aExhYmVscygpIHtcbiAgICBpZiAoIXRoaXMucHJvcHMuc2hvd01vbnRoTGFiZWxzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWVrUmFuZ2UgPSBfLnJhbmdlKHRoaXMuZ2V0V2Vla0NvdW50KCkgLSAxKTsgLy8gZG9uJ3QgcmVuZGVyIGZvciBsYXN0IHdlZWssIGJlY2F1c2UgbGFiZWwgd2lsbCBiZSBjdXQgb2ZmXG5cbiAgICByZXR1cm4gd2Vla1JhbmdlLm1hcCh3ZWVrSW5kZXggPT4ge1xuICAgICAgY29uc3QgZW5kT2ZXZWVrID0gc2hpZnREYXRlKFxuICAgICAgICB0aGlzLmdldFN0YXJ0RGF0ZVdpdGhFbXB0eURheXMoKSxcbiAgICAgICAgKHdlZWtJbmRleCArIDEpICogREFZU19JTl9XRUVLXG4gICAgICApO1xuXG4gICAgICBjb25zdCBbeCwgeV0gPSB0aGlzLmdldE1vbnRoTGFiZWxDb29yZGluYXRlcyh3ZWVrSW5kZXgpO1xuXG4gICAgICByZXR1cm4gZW5kT2ZXZWVrLmdldERhdGUoKSA+PSAxICYmIGVuZE9mV2Vlay5nZXREYXRlKCkgPD0gREFZU19JTl9XRUVLID8gKFxuICAgICAgICA8VGV4dFxuICAgICAgICAgIGtleT17d2Vla0luZGV4fVxuICAgICAgICAgIHg9e3ggKyBwYWRkaW5nTGVmdH1cbiAgICAgICAgICB5PXt5ICsgOH1cbiAgICAgICAgICB7Li4udGhpcy5nZXRQcm9wc0ZvckxhYmVscygpfVxuICAgICAgICA+XG4gICAgICAgICAge3RoaXMucHJvcHMuZ2V0TW9udGhMYWJlbFxuICAgICAgICAgICAgPyB0aGlzLnByb3BzLmdldE1vbnRoTGFiZWwoZW5kT2ZXZWVrLmdldE1vbnRoKCkpXG4gICAgICAgICAgICA6IE1PTlRIX0xBQkVMU1tlbmRPZldlZWsuZ2V0TW9udGgoKV19XG4gICAgICAgIDwvVGV4dD5cbiAgICAgICkgOiBudWxsO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgbnVtRGF5czogMjAwLFxuICAgIGVuZERhdGU6IG5ldyBEYXRlKCksXG4gICAgZ3V0dGVyU2l6ZTogMSxcbiAgICBzcXVhcmVTaXplOiBTUVVBUkVfU0laRSxcbiAgICBob3Jpem9udGFsOiB0cnVlLFxuICAgIHNob3dNb250aExhYmVsczogdHJ1ZSxcbiAgICBzaG93T3V0T2ZSYW5nZURheXM6IGZhbHNlLFxuICAgIGFjY2Vzc29yOiBcImNvdW50XCIsXG4gICAgY2xhc3NGb3JWYWx1ZTogdmFsdWUgPT4gKHZhbHVlID8gXCJibGFja1wiIDogXCIjOGNjNjY1XCIpLFxuICAgIHN0eWxlOiB7fVxuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IHN0eWxlIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgbGV0IHsgYm9yZGVyUmFkaXVzID0gMCB9ID0gc3R5bGU7XG5cbiAgICBpZiAoIWJvcmRlclJhZGl1cyAmJiB0aGlzLnByb3BzLmNoYXJ0Q29uZmlnLnN0eWxlKSB7XG4gICAgICBjb25zdCBzdHVwaWRYbyA9IHRoaXMucHJvcHMuY2hhcnRDb25maWcuc3R5bGUuYm9yZGVyUmFkaXVzO1xuICAgICAgYm9yZGVyUmFkaXVzID0gc3R1cGlkWG87XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3IHN0eWxlPXtzdHlsZX0+XG4gICAgICAgIDxTdmcgaGVpZ2h0PXt0aGlzLnByb3BzLmhlaWdodH0gd2lkdGg9e3RoaXMucHJvcHMud2lkdGh9PlxuICAgICAgICAgIHt0aGlzLnJlbmRlckRlZnMoe1xuICAgICAgICAgICAgd2lkdGg6IHRoaXMucHJvcHMud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMucHJvcHMuaGVpZ2h0LFxuICAgICAgICAgICAgLi4udGhpcy5wcm9wcy5jaGFydENvbmZpZ1xuICAgICAgICAgIH0pfVxuICAgICAgICAgIDxSZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgaGVpZ2h0PXt0aGlzLnByb3BzLmhlaWdodH1cbiAgICAgICAgICAgIHJ4PXtib3JkZXJSYWRpdXN9XG4gICAgICAgICAgICByeT17Ym9yZGVyUmFkaXVzfVxuICAgICAgICAgICAgZmlsbD1cInVybCgjYmFja2dyb3VuZEdyYWRpZW50KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8Rz57dGhpcy5yZW5kZXJNb250aExhYmVscygpfTwvRz5cbiAgICAgICAgICA8Rz57dGhpcy5yZW5kZXJBbGxXZWVrcygpfTwvRz5cbiAgICAgICAgPC9Tdmc+XG4gICAgICA8L1ZpZXc+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb250cmlidXRpb25HcmFwaDtcbiJdfQ==