UNPKG

rn-circular-chart

Version:
234 lines (233 loc) 35.8 kB
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, centerLabel = _a.centerLabel, _g = _a.arcDistence, arcDistence = _g === void 0 ? 0 : _g, centerComponent = _a.centerComponent; 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 _h = useState(data[0]), displayValue = _h[0], setDisplayValue = _h[1]; // TODO: // remove WTF is this variable ? var _j = useState([]), rotationPaths = _j[0], setRotationPath = _j[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 - arcDistence, }; 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(); }, []); 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 - arcDistence, }; 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()}> {!centerComponent && (centerLabel === null || centerLabel === void 0 ? void 0 : centerLabel.label) && <Text style={{ fontSize: 10 }}> {centerLabel === null || centerLabel === void 0 ? void 0 : centerLabel.label} </Text>} {!centerComponent && (centerLabel === null || centerLabel === void 0 ? void 0 : centerLabel.labelValue) && <Text style={{ fontSize: 16, color: '#000', fontWeight: '700' }}> {centerLabel === null || centerLabel === void 0 ? void 0 : centerLabel.labelValue} </Text>} {centerComponent && centerComponent()} </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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzlFLE9BQU8sRUFFTCxJQUFJLEVBQ0osSUFBSSxFQUVKLFFBQVEsRUFDUixVQUFVLEVBRVYsTUFBTSxHQUNQLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFRLE1BQU0sa0JBQWtCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxHQUFHLEVBQWEsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBa0N0RCxJQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFNUQsTUFBTSxDQUFDLElBQU0sVUFBVSxHQUFHLFVBQUMsRUFrQmI7UUFqQlosSUFBSSxVQUFBLEVBQ0osY0FBYyxvQkFBQSxFQUNkLGVBQWUscUJBQUEsRUFDZixNQUFNLFlBQUEsRUFDTixrQkFBaUIsRUFBakIsVUFBVSxtQkFBRyxDQUFDLEdBQUcsS0FBQSxFQUNqQixnQkFBMEIsRUFBMUIsUUFBUSxtQkFBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEtBQUEsRUFDMUIsbUJBQWdCLEVBQWhCLFdBQVcsbUJBQUcsRUFBRSxLQUFBLEVBQ2hCLFlBQWMsRUFBZCxJQUFJLG1CQUFHLE9BQU8sS0FBQSxFQUNkLHFCQUF1QixFQUF2QixhQUFhLG1CQUFHLE9BQU8sS0FBQSxFQUV2QixpQkFBaUIsdUJBQUEsRUFDakIsZUFBZSxxQkFBQSxFQUNmLGVBQWUscUJBQUEsRUFDZixjQUFjLG9CQUFBLEVBQ2QsV0FBVyxpQkFBQSxFQUNYLG1CQUFlLEVBQWYsV0FBVyxtQkFBRyxDQUFDLEtBQUEsRUFDZixlQUFlLHFCQUFBO0lBRWYsSUFBSSxrQkFBa0IsR0FBUSxFQUFFLENBQUM7SUFDakMsSUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUM7UUFDMUIsS0FBSyxFQUFFLGNBQWM7UUFDckIsTUFBTSxFQUFFLGVBQWU7S0FDeEIsQ0FBQyxDQUFDO0lBQ0gsSUFBTSxjQUFjLEdBQUcsSUFBSSxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFNUQsSUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUM3RCxJQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDdEUsSUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBTSxPQUFBLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBL0IsQ0FBK0IsQ0FBQyxDQUNoRCxDQUFDLE9BQU8sQ0FBQztJQUNWLElBQU0sUUFBUSxHQUFHLE1BQU0sQ0FBd0IsRUFBRSxDQUFDLENBQUM7SUFDbkQsSUFBTSxhQUFhLEdBQUcsTUFBTSxDQUF3QixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFFMUQsSUFBQSxLQUFrQyxRQUFRLENBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQTdELFlBQVksUUFBQSxFQUFFLGVBQWUsUUFBZ0MsQ0FBQztJQUVyRSxRQUFRO0lBQ1IsZ0NBQWdDO0lBQzFCLElBQUEsS0FBbUMsUUFBUSxDQUUvQyxFQUFFLENBQUMsRUFGRSxhQUFhLFFBQUEsRUFBRSxlQUFlLFFBRWhDLENBQUM7SUFFTixJQUFNLHdCQUF3QixHQUFHLGNBRzVCLE9BQUEsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUEvRCxDQUErRCxDQUFDO0lBRXJFLElBQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUNqQztRQUNFLE9BQUEsSUFBSTthQUNELEdBQUcsQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxLQUFLLEVBQVAsQ0FBTyxDQUFDO2FBQ25CLE1BQU0sQ0FBQyxVQUFDLEtBQWEsRUFBRSxJQUFZLElBQUssT0FBQSxLQUFLLEdBQUcsSUFBSSxFQUFaLENBQVksQ0FBQztJQUZ4RCxDQUV3RCxFQUMxRCxDQUFDLElBQUksQ0FBQyxDQUNQLENBQUM7SUFFRixJQUFNLDBCQUEwQixHQUFHLE9BQU8sQ0FDeEMsY0FBTSxPQUFBLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxHQUFHLEVBQXJDLENBQXFDLENBQUMsRUFBdEQsQ0FBc0QsRUFDNUQsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FDNUIsQ0FBQztJQUVGLE9BQU8sQ0FBQztRQUNOLElBQU0sYUFBYSxHQUF3QyxFQUFFLENBQUM7UUFFOUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFDLENBQUMsRUFBRSxHQUFHO1lBQ2xCLElBQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakUsSUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbkUsYUFBYSxDQUFDLElBQUksQ0FDaEIsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUNoQixtQkFBbUIsWUFDakIsS0FBSyxFQUFFLFVBQVUsSUFDZCx3QkFBd0IsRUFBRSxFQUM3QixDQUNILENBQ0YsQ0FBQztZQUVGLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRztnQkFDbkIsSUFBSSxFQUFFLG1CQUFtQixZQUN2QixLQUFLLEVBQUUsVUFBVSxJQUNkLHdCQUF3QixFQUFFLEVBQzdCO2dCQUNGLEVBQUUsRUFBRSxtQkFBbUIsWUFDckIsS0FBSyxFQUFFLFFBQVEsSUFDWix3QkFBd0IsRUFBRSxFQUM3QjthQUNILENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNqQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRVgsU0FBUyxDQUFDO1FBQ1IsUUFBUSxhQUFhLEVBQUU7WUFDckIsS0FBSyxPQUFPO2dCQUNWLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsY0FBYyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU07WUFFUjtnQkFDRSxhQUFhLEVBQUUsQ0FBQztnQkFDaEIsTUFBTTtTQUNUO0lBQ0gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsSUFBTSxjQUFjLEdBQUc7UUFDckIsSUFBTSxVQUFVLEdBQWtDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQztZQUM5RCxJQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDNUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUM1QixRQUFRLEVBQUUsSUFBSTtnQkFDZCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQzVDLGVBQWUsRUFBRSxJQUFJO2FBQ3RCLENBQUMsQ0FBQztZQUVILE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3hDLENBQUMsQ0FBQztJQUVGLElBQU0sYUFBYSxHQUFHO1FBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLEVBQUU7WUFDdkMsT0FBTyxFQUFFLENBQUM7WUFDVixRQUFRLEVBQUUsSUFBSTtZQUNkLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM1QyxlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDYixDQUFDLENBQUM7SUFFRixTQUFTLENBQUM7UUFDUixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEIsSUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7Z0JBQ2xDLE9BQU8sU0FBQTtnQkFDUCxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDL0IsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2FBQ2xDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsU0FBUyxDQUFDO1FBQ1IsT0FBTztZQUNMLElBQUksYUFBYSxLQUFLLE9BQU8sRUFBRTtnQkFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFDLENBQUMsRUFBRSxDQUFDOztvQkFDaEIsSUFDRSxDQUFBLGtCQUFrQixhQUFsQixrQkFBa0IsdUJBQWxCLGtCQUFrQixDQUFHLENBQUMsQ0FBQzt5QkFDdkIsa0JBQWtCLGFBQWxCLGtCQUFrQix1QkFBbEIsa0JBQWtCLENBQUcsQ0FBQyxFQUFFLGtCQUFrQixDQUFBLEVBQzFDO3dCQUNBLE1BQUEsa0JBQWtCLGFBQWxCLGtCQUFrQiw2QkFBbEIsa0JBQWtCLENBQUcsQ0FBQyxHQUFFLGtCQUFrQixrREFBSSxDQUFDO3FCQUNoRDtnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsSUFBTSxXQUFXLEdBQUcsVUFBQyxFQVFwQjtZQVBDLE9BQU8sYUFBQSxFQUNQLGFBQWEsbUJBQUEsRUFDYixVQUFVLGdCQUFBO1FBTVYsYUFBYSxDQUFDLFdBQVcsQ0FBQyxVQUFDLEtBQUs7WUFDOUIsSUFBTSxTQUFTLEdBQWM7Z0JBQzNCLE1BQU0sRUFBRSxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztnQkFDbEMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLEVBQUUsTUFBTTtnQkFDZCxVQUFVLEVBQUUsVUFBVTtnQkFDdEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsV0FBVzthQUNwQyxDQUFDO1lBQ0YsSUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFbEQsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2FBQ3pDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRixTQUFTLENBQUM7UUFDUixjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFO1lBQzlCLE9BQU8sRUFBRSxDQUFDO1lBQ1YsUUFBUSxFQUFFLEdBQUc7WUFDYixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDNUMsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsSUFBTSxvQkFBb0IsR0FBRyxVQUFDLEtBQWdCLEVBQUUsS0FBYTtRQUMzRCxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzQixRQUFRLENBQUMsUUFBUSxDQUFDO1lBQ2hCLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFO2dCQUM5QixPQUFPLEVBQUUsQ0FBQztnQkFDVixRQUFRLEVBQUUsR0FBRztnQkFDYixlQUFlLEVBQUUsSUFBSTthQUN0QixDQUFDO1NBQ0gsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2IsQ0FBQyxDQUFDO0lBRUYsSUFBTSxTQUFTLEdBQUcsVUFBQyxLQUFnQixFQUFFLEtBQWE7UUFDaEQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMzQyxPQUFPLEVBQUUsV0FBVyxHQUFHLENBQUM7WUFDeEIsUUFBUSxFQUFFLEdBQUc7WUFDYixlQUFlLEVBQUUsSUFBSTtZQUNyQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDN0MsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2IsQ0FBQyxDQUFDO0lBRUYsSUFBTSxVQUFVLEdBQUcsVUFBQyxLQUFhO1FBQy9CLFFBQVEsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDM0MsT0FBTyxFQUFFLFdBQVc7WUFDcEIsUUFBUSxFQUFFLEdBQUc7WUFDYixlQUFlLEVBQUUsSUFBSTtZQUNyQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDN0MsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2IsQ0FBQyxDQUFDO0lBRUYsSUFBTSxrQkFBa0IsR0FBRyxjQUE0QixPQUFBO1FBQ3JELE1BQU0sQ0FBQyxnQkFBZ0I7UUFDdkIsY0FBYztRQUNkLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFO0tBQ25ELEVBSnNELENBSXRELENBQUM7SUFFRixJQUFNLG1CQUFtQixHQUFHLFVBQUMsS0FBYSxJQUEyQixPQUFBO1FBQ25FLE1BQU0sQ0FBQyxpQkFBaUI7UUFDeEIsRUFBRSxLQUFLLE9BQUEsRUFBRTtRQUNULGVBQWU7S0FDaEIsRUFKb0UsQ0FJcEUsQ0FBQztJQUVGLElBQU0sbUJBQW1CLEdBQUcsVUFBQyxLQUFhLElBQTJCLE9BQUE7UUFDbkUsTUFBTSxDQUFDLGlCQUFpQjtRQUN4QixFQUFFLEtBQUssT0FBQSxFQUFFO1FBQ1QsZUFBZTtLQUNoQixFQUpvRSxDQUlwRSxDQUFDO0lBRUYsSUFBTSxxQkFBcUIsR0FBRyxjQUF1QyxPQUFBO1FBQ25FLE1BQU0sQ0FBQyxtQkFBbUI7UUFDMUI7WUFDRSxLQUFLLEVBQUUsY0FBYyxDQUFDLFNBQVMsRUFBRSxHQUFHLFdBQVc7WUFDL0MsTUFBTSxFQUFFLGNBQWMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxXQUFXO1lBQ2hELE9BQU8sRUFBRSxjQUFjO1NBQ3hCO1FBQ0QsaUJBQWlCO0tBQ2xCLEVBUm9FLENBUXBFLENBQUM7SUFFRixPQUFPLENBQ0wsQ0FBQyxRQUFRLENBQ1A7TUFBQSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQ2hDO1FBQUEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FDaEQ7VUFBQSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQztZQUN0QixJQUFNLFNBQVMsR0FBYztnQkFDM0IsTUFBTSxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLEVBQUUsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sRUFBRSxNQUFNO2dCQUNkLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSTtnQkFDbEIsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsV0FBVzthQUM3QixDQUFDO1lBQ0YsSUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFbEQsT0FBTyxDQUNMLENBQUMsWUFBWSxDQUNYLEdBQUcsQ0FBQyxDQUFDLGVBQVEsQ0FBQyxDQUFFLENBQUMsQ0FDakIsR0FBRyxDQUFDLENBQUMsVUFBQyxFQUFPLElBQUssT0FBQSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQTFCLENBQTBCLENBQUMsQ0FDN0MsT0FBTyxDQUFDLENBQUMsY0FBTSxPQUFBLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBaEMsQ0FBZ0MsQ0FBQyxDQUNoRCxTQUFTLENBQUMsQ0FBQyxjQUFNLE9BQUEsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBckIsQ0FBcUIsQ0FBQyxDQUN2QyxVQUFVLENBQUMsQ0FBQyxjQUFNLE9BQUEsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFiLENBQWEsQ0FBQyxDQUNoQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FDcEIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQ1osT0FBTyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FDakMsSUFBSSxDQUFDLE1BQU0sQ0FDWCxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQ3RCLFdBQVcsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3JDLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNKO1FBQUEsRUFBRSxHQUFHLENBQ0w7UUFBQSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUM1QztVQUFBLENBQUMsQ0FBQyxlQUFlLEtBQUksV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLEtBQUssQ0FBQSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQ3ZFO1lBQUEsQ0FBQyxXQUFXLGFBQVgsV0FBVyx1QkFBWCxXQUFXLENBQUUsS0FBSyxDQUNyQjtVQUFBLEVBQUUsSUFBSSxDQUFDLENBQ1A7VUFBQSxDQUFDLENBQUMsZUFBZSxLQUFJLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxVQUFVLENBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDOUc7WUFBQSxDQUFDLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxVQUFVLENBQzFCO1VBQUEsRUFBRSxJQUFJLENBQUMsQ0FFUDs7VUFBQSxDQUFDLGVBQWUsSUFBSSxlQUFlLEVBQUUsQ0FDdkM7UUFBQSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQ2pCO01BQUEsRUFBRSxJQUFJLENBQ1I7SUFBQSxFQUFFLFFBQVEsQ0FBQyxDQUNaLENBQUM7QUFDSixDQUFDLENBQUM7QUFDRixJQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQy9CLGdCQUFnQixFQUFFO1FBQ2hCLE9BQU8sRUFBRSxNQUFNO1FBQ2YsY0FBYyxFQUFFLFFBQVE7UUFDeEIsVUFBVSxFQUFFLFFBQVE7S0FDckI7SUFFRCxtQkFBbUIsRUFBRTtRQUNuQixRQUFRLEVBQUUsVUFBVTtRQUNwQixjQUFjLEVBQUUsUUFBUTtRQUN4QixVQUFVLEVBQUUsUUFBUTtLQUNyQjtJQUVELGlCQUFpQixFQUFFO1FBQ2pCLFFBQVEsRUFBRSxFQUFFO1FBQ1osVUFBVSxFQUFFLE1BQU07S0FDbkI7SUFFRCxpQkFBaUIsRUFBRTtRQUNqQixRQUFRLEVBQUUsRUFBRTtLQUNiO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VNZW1vLCB1c2VTdGF0ZSwgRnJhZ21lbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gIFN0eWxlUHJvcCxcbiAgVGV4dCxcbiAgVmlldyxcbiAgVmlld1N0eWxlLFxuICBBbmltYXRlZCxcbiAgU3R5bGVTaGVldCxcbiAgVGV4dFN0eWxlLFxuICBFYXNpbmcsXG59IGZyb20gXCJyZWFjdC1uYXRpdmVcIjtcblxuaW1wb3J0IHsgU3ZnLCBQYXRoLCBNYXNrIH0gZnJvbSBcInJlYWN0LW5hdGl2ZS1zdmdcIjtcbmltcG9ydCB7IFNxdWFyZSB9IGZyb20gXCIuL3BhY2thZ2VzL3NoYXBlXCI7XG5pbXBvcnQgeyBBcmMsIEFyY1BhcmFtcywgVmlld0JveCB9IGZyb20gXCIuL3BhY2thZ2VzL3N2Z1wiO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSBcIi4vcGFja2FnZXMvYXJyYXlcIjtcbmltcG9ydCB7IExpbmVhckludGVycG9sYXRpb24gfSBmcm9tIFwiLi9wYWNrYWdlcy9tYXRoXCI7XG5cbmV4cG9ydCB0eXBlIERvbnV0SXRlbSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xuICBjb2xvcjogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIENlbnRlckxhYmVsID0ge1xuICBsYWJlbD86IHN0cmluZztcbiAgbGFiZWxWYWx1ZT86IG51bWJlclxufVxuXG5leHBvcnQgdHlwZSBEb251dEFuaW1hdGlvblR5cGUgPSBcImZhZGVcIiB8IFwic2xpZGVcIjtcblxuZXhwb3J0IHR5cGUgSURvbnV0UHJvcHMgPSB7XG4gIGRhdGE6IERvbnV0SXRlbVtdO1xuICBjb250YWluZXJXaWR0aDogbnVtYmVyO1xuICBjb250YWluZXJIZWlnaHQ6IG51bWJlcjtcbiAgcmFkaXVzOiBudW1iZXI7XG4gIHN0YXJ0QW5nbGU/OiBudW1iZXI7XG4gIGVuZEFuZ2xlPzogbnVtYmVyO1xuICBzdHJva2VXaWR0aD86IG51bWJlcjtcbiAgdHlwZT86IFwiYnV0dFwiIHwgXCJyb3VuZFwiO1xuICBsYWJlbFZhbHVlU3R5bGU/OiBTdHlsZVByb3A8VGV4dFN0eWxlPjtcbiAgbGFiZWxUaXRsZVN0eWxlPzogU3R5bGVQcm9wPFRleHRTdHlsZT47XG4gIGxhYmVsV3JhcHBlclN0eWxlPzogU3R5bGVQcm9wPFZpZXdTdHlsZT47XG4gIGNvbnRhaW5lclN0eWxlPzogU3R5bGVQcm9wPFZpZXdTdHlsZT47XG4gIGFuaW1hdGlvblR5cGU/OiBEb251dEFuaW1hdGlvblR5cGU7XG4gIGNlbnRlckxhYmVsPzogQ2VudGVyTGFiZWw7XG4gIGFyY0Rpc3RlbmNlPzogbnVtYmVyO1xuICBjZW50ZXJDb21wb25lbnQ6ICgpID0+IHZvaWRcblxufTtcblxuY29uc3QgQW5pbWF0ZWRQYXRoID0gQW5pbWF0ZWQuY3JlYXRlQW5pbWF0ZWRDb21wb25lbnQoUGF0aCk7XG5cbmV4cG9ydCBjb25zdCBEb251dENoYXJ0ID0gKHtcbiAgZGF0YSxcbiAgY29udGFpbmVyV2lkdGgsXG4gIGNvbnRhaW5lckhlaWdodCxcbiAgcmFkaXVzLFxuICBzdGFydEFuZ2xlID0gLTEyNSxcbiAgZW5kQW5nbGUgPSBzdGFydEFuZ2xlICogLTEsXG4gIHN0cm9rZVdpZHRoID0gMTAsXG4gIHR5cGUgPSBcInJvdW5kXCIsXG4gIGFuaW1hdGlvblR5cGUgPSBcInNsaWRlXCIsXG5cbiAgbGFiZWxXcmFwcGVyU3R5bGUsXG4gIGxhYmVsVmFsdWVTdHlsZSxcbiAgbGFiZWxUaXRsZVN0eWxlLFxuICBjb250YWluZXJTdHlsZSxcbiAgY2VudGVyTGFiZWwsXG4gIGFyY0Rpc3RlbmNlID0gMCxcbiAgY2VudGVyQ29tcG9uZW50XG59OiBJRG9udXRQcm9wcykgPT4ge1xuICBsZXQgZG9udXRJdGVtTGlzdGVuZXJzOiBhbnkgPSBbXTtcbiAgY29uc3Qgdmlld0JveCA9IG5ldyBWaWV3Qm94KHtcbiAgICB3aWR0aDogY29udGFpbmVyV2lkdGgsXG4gICAgaGVpZ2h0OiBjb250YWluZXJIZWlnaHQsXG4gIH0pO1xuICBjb25zdCBzcXVhcmVJbkNpcmNsZSA9IG5ldyBTcXVhcmUoeyBkaWFtZXRlcjogcmFkaXVzICogMiB9KTtcblxuICBjb25zdCBhbmltYXRlT3BhY2l0eSA9IHVzZVJlZihuZXcgQW5pbWF0ZWQuVmFsdWUoMCkpLmN1cnJlbnQ7XG4gIGNvbnN0IGFuaW1hdGVDb250YWluZXJPcGFjaXR5ID0gdXNlUmVmKG5ldyBBbmltYXRlZC5WYWx1ZSgwKSkuY3VycmVudDtcbiAgY29uc3QgYW5pbWF0ZWRTdHJva2VXaWR0aHMgPSB1c2VSZWYoXG4gICAgZGF0YS5tYXAoKCkgPT4gbmV3IEFuaW1hdGVkLlZhbHVlKHN0cm9rZVdpZHRoKSlcbiAgKS5jdXJyZW50O1xuICBjb25zdCBwYXRoUmVmcyA9IHVzZVJlZjx0eXBlb2YgQW5pbWF0ZWRQYXRoW10+KFtdKTtcbiAgY29uc3QgYW5pbWF0ZWRQYXRocyA9IHVzZVJlZjxBcnJheTxBbmltYXRlZC5WYWx1ZT4+KFtdKS5jdXJyZW50O1xuXG4gIGNvbnN0IFtkaXNwbGF5VmFsdWUsIHNldERpc3BsYXlWYWx1ZV0gPSB1c2VTdGF0ZTxEb251dEl0ZW0+KGRhdGFbMF0pO1xuXG4gIC8vIFRPRE86XG4gIC8vIHJlbW92ZSBXVEYgaXMgdGhpcyB2YXJpYWJsZSA/XG4gIGNvbnN0IFtyb3RhdGlvblBhdGhzLCBzZXRSb3RhdGlvblBhdGhdID0gdXNlU3RhdGU8XG4gICAgQXJyYXk8eyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfT5cbiAgPihbXSk7XG5cbiAgY29uc3QgZGVmYXVsdEludGVycG9sYXRlQ29uZmlnID0gKCk6IHtcbiAgICBpbnB1dFJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuICAgIG91dHB1dFJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuICB9ID0+ICh7IGlucHV0UmFuZ2U6IFswLCAxMDBdLCBvdXRwdXRSYW5nZTogW3N0YXJ0QW5nbGUsIGVuZEFuZ2xlXSB9KTtcblxuICBjb25zdCBzdW1PZkRvbnV0SXRlbVZhbHVlID0gdXNlTWVtbyhcbiAgICAoKTogbnVtYmVyID0+XG4gICAgICBkYXRhXG4gICAgICAgIC5tYXAoKGQpID0+IGQudmFsdWUpXG4gICAgICAgIC5yZWR1Y2UoKHRvdGFsOiBudW1iZXIsIHByZXY6IG51bWJlcikgPT4gdG90YWwgKyBwcmV2KSxcbiAgICBbZGF0YV1cbiAgKTtcblxuICBjb25zdCBkb251dEl0ZW1WYWx1ZVRvUGVyY2VudGFnZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gZGF0YS5tYXAoKGQpID0+IChkLnZhbHVlIC8gc3VtT2ZEb251dEl0ZW1WYWx1ZSkgKiAxMDApLFxuICAgIFtzdW1PZkRvbnV0SXRlbVZhbHVlLCBkYXRhXVxuICApO1xuXG4gIHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHJvdGF0aW9uUmFuZ2U6IEFycmF5PHsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0+ID0gW107XG5cbiAgICBkYXRhLmZvckVhY2goKF8sIGlkeCkgPT4ge1xuICAgICAgY29uc3QgZnJvbVZhbHVlcyA9IHN1bShkb251dEl0ZW1WYWx1ZVRvUGVyY2VudGFnZS5zbGljZSgwLCBpZHgpKTtcbiAgICAgIGNvbnN0IHRvVmFsdWVzID0gc3VtKGRvbnV0SXRlbVZhbHVlVG9QZXJjZW50YWdlLnNsaWNlKDAsIGlkeCArIDEpKTtcblxuICAgICAgYW5pbWF0ZWRQYXRocy5wdXNoKFxuICAgICAgICBuZXcgQW5pbWF0ZWQuVmFsdWUoXG4gICAgICAgICAgTGluZWFySW50ZXJwb2xhdGlvbih7XG4gICAgICAgICAgICB2YWx1ZTogZnJvbVZhbHVlcyxcbiAgICAgICAgICAgIC4uLmRlZmF1bHRJbnRlcnBvbGF0ZUNvbmZpZygpLFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIHJvdGF0aW9uUmFuZ2VbaWR4XSA9IHtcbiAgICAgICAgZnJvbTogTGluZWFySW50ZXJwb2xhdGlvbih7XG4gICAgICAgICAgdmFsdWU6IGZyb21WYWx1ZXMsXG4gICAgICAgICAgLi4uZGVmYXVsdEludGVycG9sYXRlQ29uZmlnKCksXG4gICAgICAgIH0pLFxuICAgICAgICB0bzogTGluZWFySW50ZXJwb2xhdGlvbih7XG4gICAgICAgICAgdmFsdWU6IHRvVmFsdWVzLFxuICAgICAgICAgIC4uLmRlZmF1bHRJbnRlcnBvbGF0ZUNvbmZpZygpLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBzZXRSb3RhdGlvblBhdGgocm90YXRpb25SYW5nZSk7XG4gIH0sIFtkYXRhXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzd2l0Y2ggKGFuaW1hdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgXCJzbGlkZVwiOlxuICAgICAgICBhbmltYXRlQ29udGFpbmVyT3BhY2l0eS5zZXRWYWx1ZSgxKTtcbiAgICAgICAgc2xpZGVBbmltYXRpb24oKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGZhZGVBbmltYXRpb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgY29uc3Qgc2xpZGVBbmltYXRpb24gPSAoKSA9PiB7XG4gICAgY29uc3QgYW5pbWF0aW9uczogQW5pbWF0ZWQuQ29tcG9zaXRlQW5pbWF0aW9uW10gPSBkYXRhLm1hcCgoXywgaSkgPT4ge1xuICAgICAgY29uc3QgYW5pID0gQW5pbWF0ZWQudGltaW5nKGFuaW1hdGVkUGF0aHNbaV0sIHtcbiAgICAgICAgdG9WYWx1ZTogcm90YXRpb25QYXRoc1tpXS50byxcbiAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgIGVhc2luZzogRWFzaW5nLmJlemllcigwLjA3NSwgMC44MiwgMC4xNjUsIDEpLFxuICAgICAgICB1c2VOYXRpdmVEcml2ZXI6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFuaTtcbiAgICB9KTtcbiAgICBBbmltYXRlZC5wYXJhbGxlbChhbmltYXRpb25zKS5zdGFydCgpO1xuICB9O1xuXG4gIGNvbnN0IGZhZGVBbmltYXRpb24gPSAoKSA9PiB7XG4gICAgQW5pbWF0ZWQudGltaW5nKGFuaW1hdGVDb250YWluZXJPcGFjaXR5LCB7XG4gICAgICB0b1ZhbHVlOiAxLFxuICAgICAgZHVyYXRpb246IDUwMDAsXG4gICAgICBlYXNpbmc6IEVhc2luZy5iZXppZXIoMC4wNzUsIDAuODIsIDAuMTY1LCAxKSxcbiAgICAgIHVzZU5hdGl2ZURyaXZlcjogdHJ1ZSxcbiAgICB9KS5zdGFydCgpO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZGF0YS5mb3JFYWNoKChfLCBpKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gcGF0aFJlZnMuY3VycmVudFtpXTtcbiAgICAgIGRvbnV0SXRlbUxpc3RlbmVyc1tpXSA9IGFkZExpc3RlbmVyKHtcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgYW5pbWF0ZWRWYWx1ZTogYW5pbWF0ZWRQYXRoc1tpXSxcbiAgICAgICAgc3RhcnRWYWx1ZTogcm90YXRpb25QYXRoc1tpXS5mcm9tLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoYW5pbWF0aW9uVHlwZSA9PT0gXCJzbGlkZVwiKSB7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoXywgaSkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRvbnV0SXRlbUxpc3RlbmVycz8uW2ldICYmXG4gICAgICAgICAgICBkb251dEl0ZW1MaXN0ZW5lcnM/LltpXS5yZW1vdmVBbGxMaXN0ZW5lcnNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGRvbnV0SXRlbUxpc3RlbmVycz8uW2ldLnJlbW92ZUFsbExpc3RlbmVycz8uKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgY29uc3QgYWRkTGlzdGVuZXIgPSAoe1xuICAgIGVsZW1lbnQsXG4gICAgYW5pbWF0ZWRWYWx1ZSxcbiAgICBzdGFydFZhbHVlLFxuICB9OiB7XG4gICAgZWxlbWVudDogYW55O1xuICAgIGFuaW1hdGVkVmFsdWU6IEFuaW1hdGVkLlZhbHVlO1xuICAgIHN0YXJ0VmFsdWU6IG51bWJlcjtcbiAgfSkgPT4ge1xuICAgIGFuaW1hdGVkVmFsdWUuYWRkTGlzdGVuZXIoKGFuZ2xlKSA9PiB7XG4gICAgICBjb25zdCBhcmNQYXJhbXM6IEFyY1BhcmFtcyA9IHtcbiAgICAgICAgY29vcmRYOiB2aWV3Qm94LmdldENlbnRlckNvb3JkKCkueCxcbiAgICAgICAgY29vcmRZOiB2aWV3Qm94LmdldENlbnRlckNvb3JkKCkueSxcbiAgICAgICAgcmFkaXVzOiByYWRpdXMsXG4gICAgICAgIHN0YXJ0QW5nbGU6IHN0YXJ0VmFsdWUsXG4gICAgICAgIGVuZEFuZ2xlOiBhbmdsZS52YWx1ZSAtIGFyY0Rpc3RlbmNlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGRyYXdQYXRoID0gbmV3IEFyYyhhcmNQYXJhbXMpLmdldERyYXdQYXRoKCk7XG5cbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuc2V0TmF0aXZlUHJvcHMoeyBkOiBkcmF3UGF0aCB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGFuaW1hdGVPcGFjaXR5LnNldFZhbHVlKDApO1xuICAgIEFuaW1hdGVkLnRpbWluZyhhbmltYXRlT3BhY2l0eSwge1xuICAgICAgdG9WYWx1ZTogMSxcbiAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICBlYXNpbmc6IEVhc2luZy5iZXppZXIoMC4wNzUsIDAuODIsIDAuMTY1LCAxKSxcbiAgICAgIHVzZU5hdGl2ZURyaXZlcjogdHJ1ZSxcbiAgICB9KS5zdGFydCgpO1xuICB9LCBbXSk7XG5cbiAgY29uc3Qgb25VcGRhdGVEaXNwbGF5VmFsdWUgPSAodmFsdWU6IERvbnV0SXRlbSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIHNldERpc3BsYXlWYWx1ZSh2YWx1ZSk7XG4gICAgYW5pbWF0ZU9wYWNpdHkuc2V0VmFsdWUoMCk7XG5cbiAgICBBbmltYXRlZC5wYXJhbGxlbChbXG4gICAgICBBbmltYXRlZC50aW1pbmcoYW5pbWF0ZU9wYWNpdHksIHtcbiAgICAgICAgdG9WYWx1ZTogMSxcbiAgICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgICAgdXNlTmF0aXZlRHJpdmVyOiB0cnVlLFxuICAgICAgfSksXG4gICAgXSkuc3RhcnQoKTtcbiAgfTtcblxuICBjb25zdCBvblByZXNzSW4gPSAodmFsdWU6IERvbnV0SXRlbSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIEFuaW1hdGVkLnRpbWluZyhhbmltYXRlZFN0cm9rZVdpZHRoc1tpbmRleF0sIHtcbiAgICAgIHRvVmFsdWU6IHN0cm9rZVdpZHRoICsgMixcbiAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICB1c2VOYXRpdmVEcml2ZXI6IHRydWUsXG4gICAgICBlYXNpbmc6IEVhc2luZy5iZXppZXIoMC4wNzUsIDAuODIsIDAuMTY1LCAxKSxcbiAgICB9KS5zdGFydCgpO1xuICB9O1xuXG4gIGNvbnN0IG9uUHJlc3NPdXQgPSAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIEFuaW1hdGVkLnRpbWluZyhhbmltYXRlZFN0cm9rZVdpZHRoc1tpbmRleF0sIHtcbiAgICAgIHRvVmFsdWU6IHN0cm9rZVdpZHRoLFxuICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgIHVzZU5hdGl2ZURyaXZlcjogdHJ1ZSxcbiAgICAgIGVhc2luZzogRWFzaW5nLmJlemllcigwLjA3NSwgMC44MiwgMC4xNjUsIDEpLFxuICAgIH0pLnN0YXJ0KCk7XG4gIH07XG5cbiAgY29uc3QgX2dldENvbnRhaW5lclN0eWxlID0gKCk6IFN0eWxlUHJvcDxWaWV3U3R5bGU+ID0+IFtcbiAgICBzdHlsZXMuZGVmYXVsdENvbnRhaW5lcixcbiAgICBjb250YWluZXJTdHlsZSxcbiAgICB7IHdpZHRoOiBjb250YWluZXJXaWR0aCwgaGVpZ2h0OiBjb250YWluZXJIZWlnaHQgfSxcbiAgXTtcblxuICBjb25zdCBfZ2V0TGFiZWxWYWx1ZVN0eWxlID0gKGNvbG9yOiBzdHJpbmcpOiBTdHlsZVByb3A8VGV4dFN0eWxlPiA9PiBbXG4gICAgc3R5bGVzLmRlZmF1bHRMYWJlbFZhbHVlLFxuICAgIHsgY29sb3IgfSxcbiAgICBsYWJlbFZhbHVlU3R5bGUsXG4gIF07XG5cbiAgY29uc3QgX2dldExhYmVsVGl0bGVTdHlsZSA9IChjb2xvcjogc3RyaW5nKTogU3R5bGVQcm9wPFRleHRTdHlsZT4gPT4gW1xuICAgIHN0eWxlcy5kZWZhdWx0TGFiZWxUaXRsZSxcbiAgICB7IGNvbG9yIH0sXG4gICAgbGFiZWxUaXRsZVN0eWxlLFxuICBdO1xuXG4gIGNvbnN0IF9nZXRMYWJlbFdyYXBwZXJTdHlsZSA9ICgpOiBBbmltYXRlZC5XaXRoQW5pbWF0ZWRBcnJheTxhbnk+ID0+IFtcbiAgICBzdHlsZXMuZGVmYXVsdExhYmVsV3JhcHBlcixcbiAgICB7XG4gICAgICB3aWR0aDogc3F1YXJlSW5DaXJjbGUuZ2V0Q29ybmVyKCkgLSBzdHJva2VXaWR0aCxcbiAgICAgIGhlaWdodDogc3F1YXJlSW5DaXJjbGUuZ2V0Q29ybmVyKCkgLSBzdHJva2VXaWR0aCxcbiAgICAgIG9wYWNpdHk6IGFuaW1hdGVPcGFjaXR5LFxuICAgIH0sXG4gICAgbGFiZWxXcmFwcGVyU3R5bGUsXG4gIF07XG5cbiAgcmV0dXJuIChcbiAgICA8RnJhZ21lbnQ+XG4gICAgICA8VmlldyBzdHlsZT17X2dldENvbnRhaW5lclN0eWxlKCl9PlxuICAgICAgICA8U3ZnIHdpZHRoPXt2aWV3Qm94LndpZHRofSBoZWlnaHQ9e3ZpZXdCb3guaGVpZ2h0fT5cbiAgICAgICAgICB7cm90YXRpb25QYXRocy5tYXAoKGQsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFyY1BhcmFtczogQXJjUGFyYW1zID0ge1xuICAgICAgICAgICAgICBjb29yZFg6IHZpZXdCb3guZ2V0Q2VudGVyQ29vcmQoKS54LFxuICAgICAgICAgICAgICBjb29yZFk6IHZpZXdCb3guZ2V0Q2VudGVyQ29vcmQoKS55LFxuICAgICAgICAgICAgICByYWRpdXM6IHJhZGl1cyxcbiAgICAgICAgICAgICAgc3RhcnRBbmdsZTogZC5mcm9tLFxuICAgICAgICAgICAgICBlbmRBbmdsZTogZC50byAtIGFyY0Rpc3RlbmNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGRyYXdQYXRoID0gbmV3IEFyYyhhcmNQYXJhbXMpLmdldERyYXdQYXRoKCk7XG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxBbmltYXRlZFBhdGhcbiAgICAgICAgICAgICAgICBrZXk9e2BpdGVtLSR7aX1gfVxuICAgICAgICAgICAgICAgIHJlZj17KGVsOiBhbnkpID0+IChwYXRoUmVmcy5jdXJyZW50W2ldID0gZWwpfVxuICAgICAgICAgICAgICAgIG9uUHJlc3M9eygpID0+IG9uVXBkYXRlRGlzcGxheVZhbHVlKGRhdGFbaV0sIGkpfVxuICAgICAgICAgICAgICAgIG9uUHJlc3NJbj17KCkgPT4gb25QcmVzc0luKGRhdGFbaV0sIGkpfVxuICAgICAgICAgICAgICAgIG9uUHJlc3NPdXQ9eygpID0+IG9uUHJlc3NPdXQoaSl9XG4gICAgICAgICAgICAgICAgc3Ryb2tlTGluZWNhcD17dHlwZX1cbiAgICAgICAgICAgICAgICBkPXtkcmF3UGF0aH1cbiAgICAgICAgICAgICAgICBvcGFjaXR5PXthbmltYXRlQ29udGFpbmVyT3BhY2l0eX1cbiAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPXtkYXRhW2ldLmNvbG9yfVxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoPXthbmltYXRlZFN0cm9rZVdpZHRoc1tpXX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvU3ZnPlxuICAgICAgICA8QW5pbWF0ZWQuVmlldyBzdHlsZT17X2dldExhYmVsV3JhcHBlclN0eWxlKCl9PlxuICAgICAgICAgIHshY2VudGVyQ29tcG9uZW50ICYmIGNlbnRlckxhYmVsPy5sYWJlbCAmJiA8VGV4dCBzdHlsZT17eyBmb250U2l6ZTogMTAgfX0+XG4gICAgICAgICAgICB7Y2VudGVyTGFiZWw/LmxhYmVsfVxuICAgICAgICAgIDwvVGV4dD59XG4gICAgICAgICAgeyFjZW50ZXJDb21wb25lbnQgJiYgY2VudGVyTGFiZWw/LmxhYmVsVmFsdWUgJiYgPFRleHQgc3R5bGU9e3sgZm9udFNpemU6IDE2LCBjb2xvcjogJyMwMDAnLCBmb250V2VpZ2h0OiAnNzAwJyB9fT5cbiAgICAgICAgICAgIHtjZW50ZXJMYWJlbD8ubGFiZWxWYWx1ZX1cbiAgICAgICAgICA8L1RleHQ+fVxuXG4gICAgICAgICAge2NlbnRlckNvbXBvbmVudCAmJiBjZW50ZXJDb21wb25lbnQoKX1cbiAgICAgICAgPC9BbmltYXRlZC5WaWV3PlxuICAgICAgPC9WaWV3PlxuICAgIDwvRnJhZ21lbnQ+XG4gICk7XG59O1xuY29uc3Qgc3R5bGVzID0gU3R5bGVTaGVldC5jcmVhdGUoe1xuICBkZWZhdWx0Q29udGFpbmVyOiB7XG4gICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgfSxcblxuICBkZWZhdWx0TGFiZWxXcmFwcGVyOiB7XG4gICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICBqdXN0aWZ5Q29udGVudDogXCJjZW50ZXJcIixcbiAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICB9LFxuXG4gIGRlZmF1bHRMYWJlbFZhbHVlOiB7XG4gICAgZm9udFNpemU6IDMyLFxuICAgIGZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuICB9LFxuXG4gIGRlZmF1bHRMYWJlbFRpdGxlOiB7XG4gICAgZm9udFNpemU6IDE2LFxuICB9LFxufSk7XG4iXX0=