react-native-circular-chart-current
Version:
circular chart for react-native.
235 lines • 35 kB
JavaScript
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 React, { useEffect, useRef, useMemo, useState, Fragment } from "react";
import { Text, View, Animated, StyleSheet, Easing, } from "react-native";
import { Svg, Path } from "react-native-svg";
import { Square } from "./packages/shape";
import { Arc, ViewBox } from "./packages/svg";
import { sum } from "./packages/array";
import { LinearInterpolation } from "./packages/math";
var AnimatedPath = Animated.createAnimatedComponent(Path);
export var DonutChart = function (_a) {
var data = _a.data, containerWidth = _a.containerWidth, containerHeight = _a.containerHeight, radius = _a.radius, _b = _a.startAngle, startAngle = _b === void 0 ? -125 : _b, _c = _a.endAngle, endAngle = _c === void 0 ? startAngle * -1 : _c, _d = _a.strokeWidth, strokeWidth = _d === void 0 ? 10 : _d, _e = _a.type, type = _e === void 0 ? "round" : _e, _f = _a.animationType, animationType = _f === void 0 ? "slide" : _f, labelWrapperStyle = _a.labelWrapperStyle, labelValueStyle = _a.labelValueStyle, labelTitleStyle = _a.labelTitleStyle, containerStyle = _a.containerStyle;
var donutItemListeners = [];
var viewBox = new ViewBox({
width: containerWidth,
height: containerHeight,
});
var squareInCircle = new Square({ diameter: radius * 2 });
var animateOpacity = useRef(new Animated.Value(0)).current;
var animateContainerOpacity = useRef(new Animated.Value(0)).current;
var animatedStrokeWidths = useRef(data.map(function () { return new Animated.Value(strokeWidth); })).current;
var pathRefs = useRef([]);
var animatedPaths = useRef([]).current;
var _g = useState(data[0]), displayValue = _g[0], setDisplayValue = _g[1];
// TODO:
// remove WTF is this variable ?
var _h = useState([]), rotationPaths = _h[0], setRotationPath = _h[1];
var defaultInterpolateConfig = function () { return ({ inputRange: [0, 100], outputRange: [startAngle, endAngle] }); };
var sumOfDonutItemValue = useMemo(function () {
return data
.map(function (d) { return d.value; })
.reduce(function (total, prev) { return total + prev; });
}, [data]);
var donutItemValueToPercentage = useMemo(function () { return data.map(function (d) { return (d.value / sumOfDonutItemValue) * 100; }); }, [sumOfDonutItemValue, data]);
useMemo(function () {
var rotationRange = [];
data.forEach(function (_, idx) {
var fromValues = sum(donutItemValueToPercentage.slice(0, idx));
var toValues = sum(donutItemValueToPercentage.slice(0, idx + 1));
animatedPaths.push(new Animated.Value(LinearInterpolation(__assign({ value: fromValues }, defaultInterpolateConfig()))));
rotationRange[idx] = {
from: LinearInterpolation(__assign({ value: fromValues }, defaultInterpolateConfig())),
to: LinearInterpolation(__assign({ value: toValues }, defaultInterpolateConfig())),
};
});
setRotationPath(rotationRange);
}, [data]);
useEffect(function () {
switch (animationType) {
case "slide":
animateContainerOpacity.setValue(1);
slideAnimation();
break;
default:
fadeAnimation();
break;
}
}, []);
var slideAnimation = function () {
var animations = data.map(function (_, i) {
var ani = Animated.timing(animatedPaths[i], {
toValue: rotationPaths[i].to,
duration: 3000,
easing: Easing.bezier(0.075, 0.82, 0.165, 1),
useNativeDriver: true,
});
return ani;
});
Animated.parallel(animations).start();
};
var fadeAnimation = function () {
Animated.timing(animateContainerOpacity, {
toValue: 1,
duration: 5000,
easing: Easing.bezier(0.075, 0.82, 0.165, 1),
useNativeDriver: true,
}).start();
};
useEffect(function () {
data.forEach(function (_, i) {
var element = pathRefs.current[i];
donutItemListeners[i] = addListener({
element: element,
animatedValue: animatedPaths[i],
startValue: rotationPaths[i].from,
});
});
}, []);
useEffect(function () {
return function () {
if (animationType === "slide") {
data.forEach(function (_, i) {
var _a, _b;
if ((donutItemListeners === null || donutItemListeners === void 0 ? void 0 : donutItemListeners[i]) &&
(donutItemListeners === null || donutItemListeners === void 0 ? void 0 : donutItemListeners[i].removeAllListeners)) {
(_b = donutItemListeners === null || donutItemListeners === void 0 ? void 0 : (_a = donutItemListeners[i]).removeAllListeners) === null || _b === void 0 ? void 0 : _b.call(_a);
}
});
}
};
}, []);
var addListener = function (_a) {
var element = _a.element, animatedValue = _a.animatedValue, startValue = _a.startValue;
animatedValue.addListener(function (angle) {
var arcParams = {
coordX: viewBox.getCenterCoord().x,
coordY: viewBox.getCenterCoord().y,
radius: radius,
startAngle: startValue,
endAngle: angle.value,
};
var drawPath = new Arc(arcParams).getDrawPath();
if (element) {
element.setNativeProps({ d: drawPath });
}
});
};
useEffect(function () {
animateOpacity.setValue(0);
Animated.timing(animateOpacity, {
toValue: 1,
duration: 500,
easing: Easing.bezier(0.075, 0.82, 0.165, 1),
useNativeDriver: true,
}).start();
}, []);
useEffect(function () {
setDisplayValue(data[0]);
}, [data]);
var onUpdateDisplayValue = function (value, index) {
setDisplayValue(value);
animateOpacity.setValue(0);
Animated.parallel([
Animated.timing(animateOpacity, {
toValue: 1,
duration: 500,
useNativeDriver: true,
}),
]).start();
};
var onPressIn = function (value, index) {
Animated.timing(animatedStrokeWidths[index], {
toValue: strokeWidth + 2,
duration: 500,
useNativeDriver: true,
easing: Easing.bezier(0.075, 0.82, 0.165, 1),
}).start();
};
var onPressOut = function (index) {
Animated.timing(animatedStrokeWidths[index], {
toValue: strokeWidth,
duration: 500,
useNativeDriver: true,
easing: Easing.bezier(0.075, 0.82, 0.165, 1),
}).start();
};
var _getContainerStyle = function () { return [
styles.defaultContainer,
containerStyle,
{ width: containerWidth, height: containerHeight },
]; };
var _getLabelValueStyle = function (color) { return [
styles.defaultLabelValue,
{ color: color },
labelValueStyle,
]; };
var _getLabelTitleStyle = function (color) { return [
styles.defaultLabelTitle,
{ color: color },
labelTitleStyle,
]; };
var _getLabelWrapperStyle = function () { return [
styles.defaultLabelWrapper,
{
width: squareInCircle.getCorner() - strokeWidth,
height: squareInCircle.getCorner() - strokeWidth,
opacity: animateOpacity,
},
labelWrapperStyle,
]; };
return (<Fragment>
<View style={_getContainerStyle()}>
<Svg width={viewBox.width} height={viewBox.height}>
{rotationPaths.map(function (d, i) {
var arcParams = {
coordX: viewBox.getCenterCoord().x,
coordY: viewBox.getCenterCoord().y,
radius: radius,
startAngle: d.from,
endAngle: d.to,
};
var drawPath = new Arc(arcParams).getDrawPath();
return (<AnimatedPath key={"item-".concat(i)} ref={function (el) { return (pathRefs.current[i] = el); }} onPress={function () { return onUpdateDisplayValue(data[i], i); }} onPressIn={function () { return onPressIn(data[i], i); }} onPressOut={function () { return onPressOut(i); }} strokeLinecap={type} d={drawPath} opacity={animateContainerOpacity} fill="none" stroke={data[i].color} strokeWidth={animatedStrokeWidths[i]}/>);
})}
</Svg>
<Animated.View style={_getLabelWrapperStyle()}>
<Text style={_getLabelValueStyle(displayValue === null || displayValue === void 0 ? void 0 : displayValue.color)}>
{displayValue === null || displayValue === void 0 ? void 0 : displayValue.value}
</Text>
<Text style={_getLabelTitleStyle(displayValue === null || displayValue === void 0 ? void 0 : displayValue.color)}>
{displayValue === null || displayValue === void 0 ? void 0 : displayValue.name}
</Text>
</Animated.View>
</View>
</Fragment>);
};
var styles = StyleSheet.create({
defaultContainer: {
display: "flex",
justifyContent: "center",
alignItems: "center",
},
defaultLabelWrapper: {
position: "absolute",
justifyContent: "center",
alignItems: "center",
},
defaultLabelValue: {
fontSize: 32,
fontWeight: "bold",
},
defaultLabelTitle: {
fontSize: 16,
},
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzlFLE9BQU8sRUFFTCxJQUFJLEVBQ0osSUFBSSxFQUVKLFFBQVEsRUFDUixVQUFVLEVBRVYsTUFBTSxHQUNQLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxHQUFHLEVBQWEsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBMkJ0RCxJQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFNUQsTUFBTSxDQUFDLElBQU0sVUFBVSxHQUFHLFVBQUMsRUFlYjtRQWRaLElBQUksVUFBQSxFQUNKLGNBQWMsb0JBQUEsRUFDZCxlQUFlLHFCQUFBLEVBQ2YsTUFBTSxZQUFBLEVBQ04sa0JBQWlCLEVBQWpCLFVBQVUsbUJBQUcsQ0FBQyxHQUFHLEtBQUEsRUFDakIsZ0JBQTBCLEVBQTFCLFFBQVEsbUJBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxLQUFBLEVBQzFCLG1CQUFnQixFQUFoQixXQUFXLG1CQUFHLEVBQUUsS0FBQSxFQUNoQixZQUFjLEVBQWQsSUFBSSxtQkFBRyxPQUFPLEtBQUEsRUFDZCxxQkFBdUIsRUFBdkIsYUFBYSxtQkFBRyxPQUFPLEtBQUEsRUFF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Q2I7Q0FDRixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZU1lbW8sIHVzZVN0YXRlLCBGcmFnbWVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgU3R5bGVQcm9wLFxuICBUZXh0LFxuICBWaWV3LFxuICBWaWV3U3R5bGUsXG4gIEFuaW1hdGVkLFxuICBTdHlsZVNoZWV0LFxuICBUZXh0U3R5bGUsXG4gIEVhc2luZyxcbn0gZnJvbSBcInJlYWN0LW5hdGl2ZVwiO1xuXG5pbXBvcnQgeyBTdmcsIFBhdGggfSBmcm9tIFwicmVhY3QtbmF0aXZlLXN2Z1wiO1xuaW1wb3J0IHsgU3F1YXJlIH0gZnJvbSBcIi4vcGFja2FnZXMvc2hhcGVcIjtcbmltcG9ydCB7IEFyYywgQXJjUGFyYW1zLCBWaWV3Qm94IH0gZnJvbSBcIi4vcGFja2FnZXMvc3ZnXCI7XG5pbXBvcnQgeyBzdW0gfSBmcm9tIFwiLi9wYWNrYWdlcy9hcnJheVwiO1xuaW1wb3J0IHsgTGluZWFySW50ZXJwb2xhdGlvbiB9IGZyb20gXCIuL3BhY2thZ2VzL21hdGhcIjtcblxuZXhwb3J0IHR5cGUgRG9udXRJdGVtID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZhbHVlOiBudW1iZXI7XG4gIGNvbG9yOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEb251dEFuaW1hdGlvblR5cGUgPSBcImZhZGVcIiB8IFwic2xpZGVcIjtcblxuZXhwb3J0IHR5cGUgSURvbnV0UHJvcHMgPSB7XG4gIGRhdGE6IERvbnV0SXRlbVtdO1xuICBjb250YWluZXJXaWR0aDogbnVtYmVyO1xuICBjb250YWluZXJIZWlnaHQ6IG51bWJlcjtcbiAgcmFkaXVzOiBudW1iZXI7XG4gIHN0YXJ0QW5nbGU/OiBudW1iZXI7XG4gIGVuZEFuZ2xlPzogbnVtYmVyO1xuICBzdHJva2VXaWR0aD86IG51bWJlcjtcbiAgdHlwZT86IFwiYnV0dFwiIHwgXCJyb3VuZFwiO1xuICBsYWJlbFZhbHVlU3R5bGU/OiBTdHlsZVByb3A8VGV4dFN0eWxlPjtcbiAgbGFiZWxUaXRsZVN0eWxlPzogU3R5bGVQcm9wPFRleHRTdHlsZT47XG4gIGxhYmVsV3JhcHBlclN0eWxlPzogU3R5bGVQcm9wPFZpZXdTdHlsZT47XG4gIGNvbnRhaW5lclN0eWxlPzogU3R5bGVQcm9wPFZpZXdTdHlsZT47XG5cbiAgYW5pbWF0aW9uVHlwZT86IERvbnV0QW5pbWF0aW9uVHlwZTtcbn07XG5cbmNvbnN0IEFuaW1hdGVkUGF0aCA9IEFuaW1hdGVkLmNyZWF0ZUFuaW1hdGVkQ29tcG9uZW50KFBhdGgpO1xuXG5leHBvcnQgY29uc3QgRG9udXRDaGFydCA9ICh7XG4gIGRhdGEsXG4gIGNvbnRhaW5lcldpZHRoLFxuICBjb250YWluZXJIZWlnaHQsXG4gIHJhZGl1cyxcbiAgc3RhcnRBbmdsZSA9IC0xMjUsXG4gIGVuZEFuZ2xlID0gc3RhcnRBbmdsZSAqIC0xLFxuICBzdHJva2VXaWR0aCA9IDEwLFxuICB0eXBlID0gXCJyb3VuZFwiLFxuICBhbmltYXRpb25UeXBlID0gXCJzbGlkZVwiLFxuXG4gIGxhYmVsV3JhcHBlclN0eWxlLFxuICBsYWJlbFZhbHVlU3R5bGUsXG4gIGxhYmVsVGl0bGVTdHlsZSxcbiAgY29udGFpbmVyU3R5bGUsXG59OiBJRG9udXRQcm9wcykgPT4ge1xuICBsZXQgZG9udXRJdGVtTGlzdGVuZXJzOiBhbnkgPSBbXTtcbiAgY29uc3Qgdmlld0JveCA9IG5ldyBWaWV3Qm94KHtcbiAgICB3aWR0aDogY29udGFpbmVyV2lkdGgsXG4gICAgaGVpZ2h0OiBjb250YWluZXJIZWlnaHQsXG4gIH0pO1xuICBjb25zdCBzcXVhcmVJbkNpcmNsZSA9IG5ldyBTcXVhcmUoeyBkaWFtZXRlcjogcmFkaXVzICogMiB9KTtcblxuICBjb25zdCBhbmltYXRlT3BhY2l0eSA9IHVzZVJlZihuZXcgQW5pbWF0ZWQuVmFsdWUoMCkpLmN1cnJlbnQ7XG4gIGNvbnN0IGFuaW1hdGVDb250YWluZXJPcGFjaXR5ID0gdXNlUmVmKG5ldyBBbmltYXRlZC5WYWx1ZSgwKSkuY3VycmVudDtcbiAgY29uc3QgYW5pbWF0ZWRTdHJva2VXaWR0aHMgPSB1c2VSZWYoXG4gICAgZGF0YS5tYXAoKCkgPT4gbmV3IEFuaW1hdGVkLlZhbHVlKHN0cm9rZVdpZHRoKSlcbiAgKS5jdXJyZW50O1xuICBjb25zdCBwYXRoUmVmcyA9IHVzZVJlZjx0eXBlb2YgQW5pbWF0ZWRQYXRoW10+KFtdKTtcbiAgY29uc3QgYW5pbWF0ZWRQYXRocyA9IHVzZVJlZjxBcnJheTxBbmltYXRlZC5WYWx1ZT4+KFtdKS5jdXJyZW50O1xuXG4gIGNvbnN0IFtkaXNwbGF5VmFsdWUsIHNldERpc3BsYXlWYWx1ZV0gPSB1c2VTdGF0ZTxEb251dEl0ZW0+KGRhdGFbMF0pO1xuXG4gIC8vIFRPRE86XG4gIC8vIHJlbW92ZSBXVEYgaXMgdGhpcyB2YXJpYWJsZSA/XG4gIGNvbnN0IFtyb3RhdGlvblBhdGhzLCBzZXRSb3RhdGlvblBhdGhdID0gdXNlU3RhdGU8XG4gICAgQXJyYXk8eyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfT5cbiAgPihbXSk7XG5cbiAgY29uc3QgZGVmYXVsdEludGVycG9sYXRlQ29uZmlnID0gKCk6IHtcbiAgICBpbnB1dFJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuICAgIG91dHB1dFJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuICB9ID0+ICh7IGlucHV0UmFuZ2U6IFswLCAxMDBdLCBvdXRwdXRSYW5nZTogW3N0YXJ0QW5nbGUsIGVuZEFuZ2xlXSB9KTtcblxuICBjb25zdCBzdW1PZkRvbnV0SXRlbVZhbHVlID0gdXNlTWVtbyhcbiAgICAoKTogbnVtYmVyID0+XG4gICAgICBkYXRhXG4gICAgICAgIC5tYXAoKGQpID0+IGQudmFsdWUpXG4gICAgICAgIC5yZWR1Y2UoKHRvdGFsOiBudW1iZXIsIHByZXY6IG51bWJlcikgPT4gdG90YWwgKyBwcmV2KSxcbiAgICBbZGF0YV1cbiAgKTtcblxuICBjb25zdCBkb251dEl0ZW1WYWx1ZVRvUGVyY2VudGFnZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gZGF0YS5tYXAoKGQpID0+IChkLnZhbHVlIC8gc3VtT2ZEb251dEl0ZW1WYWx1ZSkgKiAxMDApLFxuICAgIFtzdW1PZkRvbnV0SXRlbVZhbHVlLCBkYXRhXVxuICApO1xuXG4gIHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHJvdGF0aW9uUmFuZ2U6IEFycmF5PHsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0+ID0gW107XG5cbiAgICBkYXRhLmZvckVhY2goKF8sIGlkeCkgPT4ge1xuICAgICAgY29uc3QgZnJvbVZhbHVlcyA9IHN1bShkb251dEl0ZW1WYWx1ZVRvUGVyY2VudGFnZS5zbGljZSgwLCBpZHgpKTtcbiAgICAgIGNvbnN0IHRvVmFsdWVzID0gc3VtKGRvbnV0SXRlbVZhbHVlVG9QZXJjZW50YWdlLnNsaWNlKDAsIGlkeCArIDEpKTtcblxuICAgICAgYW5pbWF0ZWRQYXRocy5wdXNoKFxuICAgICAgICBuZXcgQW5pbWF0ZWQuVmFsdWUoXG4gICAgICAgICAgTGluZWFySW50ZXJwb2xhdGlvbih7XG4gICAgICAgICAgICB2YWx1ZTogZnJvbVZhbHVlcyxcbiAgICAgICAgICAgIC4uLmRlZmF1bHRJbnRlcnBvbGF0ZUNvbmZpZygpLFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIHJvdGF0aW9uUmFuZ2VbaWR4XSA9IHtcbiAgICAgICAgZnJvbTogTGluZWFySW50ZXJwb2xhdGlvbih7XG4gICAgICAgICAgdmFsdWU6IGZyb21WYWx1ZXMsXG4gICAgICAgICAgLi4uZGVmYXVsdEludGVycG9sYXRlQ29uZmlnKCksXG4gICAgICAgIH0pLFxuICAgICAgICB0bzogTGluZWFySW50ZXJwb2xhdGlvbih7XG4gICAgICAgICAgdmFsdWU6IHRvVmFsdWVzLFxuICAgICAgICAgIC4uLmRlZmF1bHRJbnRlcnBvbGF0ZUNvbmZpZygpLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBzZXRSb3RhdGlvblBhdGgocm90YXRpb25SYW5nZSk7XG4gIH0sIFtkYXRhXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzd2l0Y2ggKGFuaW1hdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgXCJzbGlkZVwiOlxuICAgICAgICBhbmltYXRlQ29udGFpbmVyT3BhY2l0eS5zZXRWYWx1ZSgxKTtcbiAgICAgICAgc2xpZGVBbmltYXRpb24oKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGZhZGVBbmltYXRpb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgY29uc3Qgc2xpZGVBbmltYXRpb24gPSAoKSA9PiB7XG4gICAgY29uc3QgYW5pbWF0aW9uczogQW5pbWF0ZWQuQ29tcG9zaXRlQW5pbWF0aW9uW10gPSBkYXRhLm1hcCgoXywgaSkgPT4ge1xuICAgICAgY29uc3QgYW5pID0gQW5pbWF0ZWQudGltaW5nKGFuaW1hdGVkUGF0aHNbaV0sIHtcbiAgICAgICAgdG9WYWx1ZTogcm90YXRpb25QYXRoc1tpXS50byxcbiAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgIGVhc2luZzogRWFzaW5nLmJlemllcigwLjA3NSwgMC44MiwgMC4xNjUsIDEpLFxuICAgICAgICB1c2VOYXRpdmVEcml2ZXI6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFuaTtcbiAgICB9KTtcbiAgICBBbmltYXRlZC5wYXJhbGxlbChhbmltYXRpb25zKS5zdGFydCgpO1xuICB9O1xuXG4gIGNvbnN0IGZhZGVBbmltYXRpb24gPSAoKSA9PiB7XG4gICAgQW5pbWF0ZWQudGltaW5nKGFuaW1hdGVDb250YWluZXJPcGFjaXR5LCB7XG4gICAgICB0b1ZhbHVlOiAxLFxuICAgICAgZHVyYXRpb246IDUwMDAsXG4gICAgICBlYXNpbmc6IEVhc2luZy5iZXppZXIoMC4wNzUsIDAuODIsIDAuMTY1LCAxKSxcbiAgICAgIHVzZU5hdGl2ZURyaXZlcjogdHJ1ZSxcbiAgICB9KS5zdGFydCgpO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZGF0YS5mb3JFYWNoKChfLCBpKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gcGF0aFJlZnMuY3VycmVudFtpXTtcbiAgICAgIGRvbnV0SXRlbUxpc3RlbmVyc1tpXSA9IGFkZExpc3RlbmVyKHtcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgYW5pbWF0ZWRWYWx1ZTogYW5pbWF0ZWRQYXRoc1tpXSxcbiAgICAgICAgc3RhcnRWYWx1ZTogcm90YXRpb25QYXRoc1tpXS5mcm9tLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoYW5pbWF0aW9uVHlwZSA9PT0gXCJzbGlkZVwiKSB7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoXywgaSkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRvbnV0SXRlbUxpc3RlbmVycz8uW2ldICYmXG4gICAgICAgICAgICBkb251dEl0ZW1MaXN0ZW5lcnM/LltpXS5yZW1vdmVBbGxMaXN0ZW5lcnNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGRvbnV0SXRlbUxpc3RlbmVycz8uW2ldLnJlbW92ZUFsbExpc3RlbmVycz8uKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgY29uc3QgYWRkTGlzdGVuZXIgPSAoe1xuICAgIGVsZW1lbnQsXG4gICAgYW5pbWF0ZWRWYWx1ZSxcbiAgICBzdGFydFZhbHVlLFxuICB9OiB7XG4gICAgZWxlbWVudDogYW55O1xuICAgIGFuaW1hdGVkVmFsdWU6IEFuaW1hdGVkLlZhbHVlO1xuICAgIHN0YXJ0VmFsdWU6IG51bWJlcjtcbiAgfSkgPT4ge1xuICAgIGFuaW1hdGVkVmFsdWUuYWRkTGlzdGVuZXIoKGFuZ2xlKSA9PiB7XG4gICAgICBjb25zdCBhcmNQYXJhbXM6IEFyY1BhcmFtcyA9IHtcbiAgICAgICAgY29vcmRYOiB2aWV3Qm94LmdldENlbnRlckNvb3JkKCkueCxcbiAgICAgICAgY29vcmRZOiB2aWV3Qm94LmdldENlbnRlckNvb3JkKCkueSxcbiAgICAgICAgcmFkaXVzOiByYWRpdXMsXG4gICAgICAgIHN0YXJ0QW5nbGU6IHN0YXJ0VmFsdWUsXG4gICAgICAgIGVuZEFuZ2xlOiBhbmdsZS52YWx1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCBkcmF3UGF0aCA9IG5ldyBBcmMoYXJjUGFyYW1zKS5nZXREcmF3UGF0aCgpO1xuXG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LnNldE5hdGl2ZVByb3BzKHsgZDogZHJhd1BhdGggfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhbmltYXRlT3BhY2l0eS5zZXRWYWx1ZSgwKTtcbiAgICBBbmltYXRlZC50aW1pbmcoYW5pbWF0ZU9wYWNpdHksIHtcbiAgICAgIHRvVmFsdWU6IDEsXG4gICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgZWFzaW5nOiBFYXNpbmcuYmV6aWVyKDAuMDc1LCAwLjgyLCAwLjE2NSwgMSksXG4gICAgICB1c2VOYXRpdmVEcml2ZXI6IHRydWUsXG4gICAgfSkuc3RhcnQoKTtcbiAgfSwgW10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0RGlzcGxheVZhbHVlKGRhdGFbMF0pO1xuICB9LCBbZGF0YV0pO1xuXG4gIGNvbnN0IG9uVXBkYXRlRGlzcGxheVZhbHVlID0gKHZhbHVlOiBEb251dEl0ZW0sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBzZXREaXNwbGF5VmFsdWUodmFsdWUpO1xuICAgIGFuaW1hdGVPcGFjaXR5LnNldFZhbHVlKDApO1xuXG4gICAgQW5pbWF0ZWQucGFyYWxsZWwoW1xuICAgICAgQW5pbWF0ZWQudGltaW5nKGFuaW1hdGVPcGFjaXR5LCB7XG4gICAgICAgIHRvVmFsdWU6IDEsXG4gICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgIHVzZU5hdGl2ZURyaXZlcjogdHJ1ZSxcbiAgICAgIH0pLFxuICAgIF0pLnN0YXJ0KCk7XG4gIH07XG5cbiAgY29uc3Qgb25QcmVzc0luID0gKHZhbHVlOiBEb251dEl0ZW0sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBBbmltYXRlZC50aW1pbmcoYW5pbWF0ZWRTdHJva2VXaWR0aHNbaW5kZXhdLCB7XG4gICAgICB0b1ZhbHVlOiBzdHJva2VXaWR0aCArIDIsXG4gICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgdXNlTmF0aXZlRHJpdmVyOiB0cnVlLFxuICAgICAgZWFzaW5nOiBFYXNpbmcuYmV6aWVyKDAuMDc1LCAwLjgyLCAwLjE2NSwgMSksXG4gICAgfSkuc3RhcnQoKTtcbiAgfTtcblxuICBjb25zdCBvblByZXNzT3V0ID0gKGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBBbmltYXRlZC50aW1pbmcoYW5pbWF0ZWRTdHJva2VXaWR0aHNbaW5kZXhdLCB7XG4gICAgICB0b1ZhbHVlOiBzdHJva2VXaWR0aCxcbiAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICB1c2VOYXRpdmVEcml2ZXI6IHRydWUsXG4gICAgICBlYXNpbmc6IEVhc2luZy5iZXppZXIoMC4wNzUsIDAuODIsIDAuMTY1LCAxKSxcbiAgICB9KS5zdGFydCgpO1xuICB9O1xuXG4gIGNvbnN0IF9nZXRDb250YWluZXJTdHlsZSA9ICgpOiBTdHlsZVByb3A8Vmlld1N0eWxlPiA9PiBbXG4gICAgc3R5bGVzLmRlZmF1bHRDb250YWluZXIsXG4gICAgY29udGFpbmVyU3R5bGUsXG4gICAgeyB3aWR0aDogY29udGFpbmVyV2lkdGgsIGhlaWdodDogY29udGFpbmVySGVpZ2h0IH0sXG4gIF07XG5cbiAgY29uc3QgX2dldExhYmVsVmFsdWVTdHlsZSA9IChjb2xvcjogc3RyaW5nKTogU3R5bGVQcm9wPFRleHRTdHlsZT4gPT4gW1xuICAgIHN0eWxlcy5kZWZhdWx0TGFiZWxWYWx1ZSxcbiAgICB7IGNvbG9yIH0sXG4gICAgbGFiZWxWYWx1ZVN0eWxlLFxuICBdO1xuXG4gIGNvbnN0IF9nZXRMYWJlbFRpdGxlU3R5bGUgPSAoY29sb3I6IHN0cmluZyk6IFN0eWxlUHJvcDxUZXh0U3R5bGU+ID0+IFtcbiAgICBzdHlsZXMuZGVmYXVsdExhYmVsVGl0bGUsXG4gICAgeyBjb2xvciB9LFxuICAgIGxhYmVsVGl0bGVTdHlsZSxcbiAgXTtcblxuICBjb25zdCBfZ2V0TGFiZWxXcmFwcGVyU3R5bGUgPSAoKTogQW5pbWF0ZWQuV2l0aEFuaW1hdGVkQXJyYXk8YW55PiA9PiBbXG4gICAgc3R5bGVzLmRlZmF1bHRMYWJlbFdyYXBwZXIsXG4gICAge1xuICAgICAgd2lkdGg6IHNxdWFyZUluQ2lyY2xlLmdldENvcm5lcigpIC0gc3Ryb2tlV2lkdGgsXG4gICAgICBoZWlnaHQ6IHNxdWFyZUluQ2lyY2xlLmdldENvcm5lcigpIC0gc3Ryb2tlV2lkdGgsXG4gICAgICBvcGFjaXR5OiBhbmltYXRlT3BhY2l0eSxcbiAgICB9LFxuICAgIGxhYmVsV3JhcHBlclN0eWxlLFxuICBdO1xuXG4gIHJldHVybiAoXG4gICAgPEZyYWdtZW50PlxuICAgICAgPFZpZXcgc3R5bGU9e19nZXRDb250YWluZXJTdHlsZSgpfT5cbiAgICAgICAgPFN2ZyB3aWR0aD17dmlld0JveC53aWR0aH0gaGVpZ2h0PXt2aWV3Qm94LmhlaWdodH0+XG4gICAgICAgICAge3JvdGF0aW9uUGF0aHMubWFwKChkLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhcmNQYXJhbXM6IEFyY1BhcmFtcyA9IHtcbiAgICAgICAgICAgICAgY29vcmRYOiB2aWV3Qm94LmdldENlbnRlckNvb3JkKCkueCxcbiAgICAgICAgICAgICAgY29vcmRZOiB2aWV3Qm94LmdldENlbnRlckNvb3JkKCkueSxcbiAgICAgICAgICAgICAgcmFkaXVzOiByYWRpdXMsXG4gICAgICAgICAgICAgIHN0YXJ0QW5nbGU6IGQuZnJvbSxcbiAgICAgICAgICAgICAgZW5kQW5nbGU6IGQudG8sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZHJhd1BhdGggPSBuZXcgQXJjKGFyY1BhcmFtcykuZ2V0RHJhd1BhdGgoKTtcblxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPEFuaW1hdGVkUGF0aFxuICAgICAgICAgICAgICAgIGtleT17YGl0ZW0tJHtpfWB9XG4gICAgICAgICAgICAgICAgcmVmPXsoZWw6IGFueSkgPT4gKHBhdGhSZWZzLmN1cnJlbnRbaV0gPSBlbCl9XG4gICAgICAgICAgICAgICAgb25QcmVzcz17KCkgPT4gb25VcGRhdGVEaXNwbGF5VmFsdWUoZGF0YVtpXSwgaSl9XG4gICAgICAgICAgICAgICAgb25QcmVzc0luPXsoKSA9PiBvblByZXNzSW4oZGF0YVtpXSwgaSl9XG4gICAgICAgICAgICAgICAgb25QcmVzc091dD17KCkgPT4gb25QcmVzc091dChpKX1cbiAgICAgICAgICAgICAgICBzdHJva2VMaW5lY2FwPXt0eXBlfVxuICAgICAgICAgICAgICAgIGQ9e2RyYXdQYXRofVxuICAgICAgICAgICAgICAgIG9wYWNpdHk9e2FuaW1hdGVDb250YWluZXJPcGFjaXR5fVxuICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9e2RhdGFbaV0uY29sb3J9XG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg9e2FuaW1hdGVkU3Ryb2tlV2lkdGhzW2ldfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9Tdmc+XG4gICAgICAgIDxBbmltYXRlZC5WaWV3IHN0eWxlPXtfZ2V0TGFiZWxXcmFwcGVyU3R5bGUoKX0+XG4gICAgICAgICAgPFRleHQgc3R5bGU9e19nZXRMYWJlbFZhbHVlU3R5bGUoZGlzcGxheVZhbHVlPy5jb2xvcil9PlxuICAgICAgICAgICAge2Rpc3BsYXlWYWx1ZT8udmFsdWV9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDxUZXh0IHN0eWxlPXtfZ2V0TGFiZWxUaXRsZVN0eWxlKGRpc3BsYXlWYWx1ZT8uY29sb3IpfT5cbiAgICAgICAgICAgIHtkaXNwbGF5VmFsdWU/Lm5hbWV9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L0FuaW1hdGVkLlZpZXc+XG4gICAgICA8L1ZpZXc+XG4gICAgPC9GcmFnbWVudD5cbiAgKTtcbn07XG5jb25zdCBzdHlsZXMgPSBTdHlsZVNoZWV0LmNyZWF0ZSh7XG4gIGRlZmF1bHRDb250YWluZXI6IHtcbiAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICB9LFxuXG4gIGRlZmF1bHRMYWJlbFdyYXBwZXI6IHtcbiAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gIH0sXG5cbiAgZGVmYXVsdExhYmVsVmFsdWU6IHtcbiAgICBmb250U2l6ZTogMzIsXG4gICAgZm9udFdlaWdodDogXCJib2xkXCIsXG4gIH0sXG5cbiAgZGVmYXVsdExhYmVsVGl0bGU6IHtcbiAgICBmb250U2l6ZTogMTYsXG4gIH0sXG59KTtcbiJdfQ==