From db283561611f58376757a5a490a70815de28d101 Mon Sep 17 00:00:00 2001 From: Joachim Schuler Date: Fri, 3 Jun 2022 16:21:10 -0400 Subject: [PATCH] clickable URL --- lib/reporter.js | 2 ++ lib/testUrls.js | 1 + package.json | 2 +- report/dist/bundle.js | 2 +- report/src/app/DataListItem.tsx | 26 ++++++++++++-------------- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/lib/reporter.js b/lib/reporter.js index 985dcf3..a391bc0 100644 --- a/lib/reporter.js +++ b/lib/reporter.js @@ -164,6 +164,7 @@ const addAnyField = (error) => }); function recordPage( + prefix, url, label, startTime, @@ -191,6 +192,7 @@ function recordPage( violations: axeResults.violations, time: elapsed[0] + elapsed[1] / 1000000000, screenshotFile, + prefix, url, label, order: index, diff --git a/lib/testUrls.js b/lib/testUrls.js index f8b317d..949e530 100644 --- a/lib/testUrls.js +++ b/lib/testUrls.js @@ -80,6 +80,7 @@ async function testPage({ page, data, worker }) { ); recordPage( + prefix, url, label, startTime, diff --git a/package.json b/package.json index 2f8e4d3..e539243 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@patternfly/patternfly-a11y", - "version": "4.3.0", + "version": "4.3.1", "description": "Accessibility utilities for PatternFly.", "scripts": { "test": "node cli.js --prefix http://localhost:9000 --file ~/src/gatsby-theme-patternfly-org/patternfly-org-demo/.cache/fullscreenPages.json", diff --git a/report/dist/bundle.js b/report/dist/bundle.js index 593c3af..de74abc 100644 --- a/report/dist/bundle.js +++ b/report/dist/bundle.js @@ -1 +1 @@ -(()=>{var __webpack_modules__={5685:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "Chart": () => (/* reexport */ Chart),\n "ChartArea": () => (/* reexport */ ChartArea),\n "ChartAreaSortOrder": () => (/* reexport */ ChartAreaSortOrder),\n "ChartAxis": () => (/* reexport */ ChartAxis),\n "ChartAxisTheme": () => (/* reexport */ ChartAxisTheme),\n "ChartBar": () => (/* reexport */ ChartBar),\n "ChartBaseTheme": () => (/* reexport */ ChartBaseTheme),\n "ChartBullet": () => (/* reexport */ ChartBullet),\n "ChartBulletComparativeErrorMeasure": () => (/* reexport */ ChartBulletComparativeErrorMeasure),\n "ChartBulletComparativeErrorMeasureTheme": () => (/* reexport */ ChartBulletComparativeErrorMeasureTheme),\n "ChartBulletComparativeMeasure": () => (/* reexport */ ChartBulletComparativeMeasure),\n "ChartBulletComparativeMeasureTheme": () => (/* reexport */ ChartBulletComparativeMeasureTheme),\n "ChartBulletComparativeWarningMeasure": () => (/* reexport */ ChartBulletComparativeWarningMeasure),\n "ChartBulletComparativeWarningMeasureTheme": () => (/* reexport */ ChartBulletComparativeWarningMeasureTheme),\n "ChartBulletGroupTitleTheme": () => (/* reexport */ ChartBulletGroupTitleTheme),\n "ChartBulletPrimaryDotMeasure": () => (/* reexport */ ChartBulletPrimaryDotMeasure),\n "ChartBulletPrimaryDotMeasureTheme": () => (/* reexport */ ChartBulletPrimaryDotMeasureTheme),\n "ChartBulletPrimaryNegativeMeasureTheme": () => (/* reexport */ ChartBulletPrimaryNegativeMeasureTheme),\n "ChartBulletPrimarySegmentedMeasure": () => (/* reexport */ ChartBulletPrimarySegmentedMeasure),\n "ChartBulletPrimarySegmentedMeasureTheme": () => (/* reexport */ ChartBulletPrimarySegmentedMeasureTheme),\n "ChartBulletQualitativeRange": () => (/* reexport */ ChartBulletQualitativeRange),\n "ChartBulletQualitativeRangeTheme": () => (/* reexport */ ChartBulletQualitativeRangeTheme),\n "ChartBulletStyles": () => (/* reexport */ ChartBulletStyles),\n "ChartBulletTheme": () => (/* reexport */ ChartBulletTheme),\n "ChartCommonStyles": () => (/* reexport */ ChartCommonStyles),\n "ChartContainer": () => (/* reexport */ ChartContainer),\n "ChartCursorContainer": () => (/* reexport */ ChartCursorContainer),\n "ChartCursorFlyout": () => (/* reexport */ ChartCursorFlyout),\n "ChartCursorTooltip": () => (/* reexport */ ChartCursorTooltip),\n "ChartDonut": () => (/* reexport */ ChartDonut),\n "ChartDonutLabelPosition": () => (/* reexport */ ChartDonutLabelPosition),\n "ChartDonutSortOrder": () => (/* reexport */ ChartDonutSortOrder),\n "ChartDonutStyles": () => (/* reexport */ ChartDonutStyles),\n "ChartDonutSubTitlePosition": () => (/* reexport */ ChartDonutSubTitlePosition),\n "ChartDonutTheme": () => (/* reexport */ ChartDonutTheme),\n "ChartDonutThreshold": () => (/* reexport */ ChartDonutThreshold),\n "ChartDonutThresholdDonutOrientation": () => (/* reexport */ ChartDonutThresholdDonutOrientation),\n "ChartDonutThresholdDynamicTheme": () => (/* reexport */ ChartDonutThresholdDynamicTheme),\n "ChartDonutThresholdLabelOrientation": () => (/* reexport */ ChartDonutThresholdLabelOrientation),\n "ChartDonutThresholdLabelPosition": () => (/* reexport */ ChartDonutThresholdLabelPosition),\n "ChartDonutThresholdSortOrder": () => (/* reexport */ ChartDonutThresholdSortOrder),\n "ChartDonutThresholdStaticTheme": () => (/* reexport */ ChartDonutThresholdStaticTheme),\n "ChartDonutThresholdSubTitlePosition": () => (/* reexport */ ChartDonutThresholdSubTitlePosition),\n "ChartDonutUtilization": () => (/* reexport */ ChartDonutUtilization),\n "ChartDonutUtilizationDynamicTheme": () => (/* reexport */ ChartDonutUtilizationDynamicTheme),\n "ChartDonutUtilizationLabelPosition": () => (/* reexport */ ChartDonutUtilizationLabelPosition),\n "ChartDonutUtilizationLegendOrientation": () => (/* reexport */ ChartDonutUtilizationLegendOrientation),\n "ChartDonutUtilizationLegendPosition": () => (/* reexport */ ChartDonutUtilizationLegendPosition),\n "ChartDonutUtilizationSortOrder": () => (/* reexport */ ChartDonutUtilizationSortOrder),\n "ChartDonutUtilizationStaticTheme": () => (/* reexport */ ChartDonutUtilizationStaticTheme),\n "ChartDonutUtilizationStyles": () => (/* reexport */ ChartDonutUtilizationStyles),\n "ChartDonutUtilizationSubTitlePosition": () => (/* reexport */ ChartDonutUtilizationSubTitlePosition),\n "ChartGroup": () => (/* reexport */ ChartGroup),\n "ChartGroupSortOrder": () => (/* reexport */ ChartGroupSortOrder),\n "ChartLabel": () => (/* reexport */ ChartLabel),\n "ChartLabelDirection": () => (/* reexport */ ChartLabelDirection),\n "ChartLabelPlacement": () => (/* reexport */ ChartLabelPlacement),\n "ChartLegend": () => (/* reexport */ ChartLegend),\n "ChartLegendOrientation": () => (/* reexport */ ChartLegendOrientation),\n "ChartLegendPosition": () => (/* reexport */ ChartLegendPosition),\n "ChartLegendRowGutter": () => (/* reexport */ ChartLegendRowGutter),\n "ChartLegendTooltip": () => (/* reexport */ ChartLegendTooltip),\n "ChartLegendTooltipContent": () => (/* reexport */ ChartLegendTooltipContent),\n "ChartLegendTooltipLabel": () => (/* reexport */ ChartLegendTooltipLabel),\n "ChartLegendTooltipStyles": () => (/* reexport */ ChartLegendTooltipStyles),\n "ChartLine": () => (/* reexport */ ChartLine),\n "ChartLineSortOrder": () => (/* reexport */ ChartLineSortOrder),\n "ChartPie": () => (/* reexport */ ChartPie),\n "ChartPieLabelPosition": () => (/* reexport */ ChartPieLabelPosition),\n "ChartPieLegendPosition": () => (/* reexport */ ChartPieLegendPosition),\n "ChartPieSortOrder": () => (/* reexport */ ChartPieSortOrder),\n "ChartPoint": () => (/* reexport */ ChartPoint),\n "ChartScatter": () => (/* reexport */ ChartScatter),\n "ChartScatterSortOrder": () => (/* reexport */ ChartScatterSortOrder),\n "ChartScatterStyles": () => (/* reexport */ ChartScatterStyles),\n "ChartStack": () => (/* reexport */ ChartStack),\n "ChartThemeColor": () => (/* reexport */ ChartThemeColor),\n "ChartThemeVariant": () => (/* reexport */ ChartThemeVariant),\n "ChartThreshold": () => (/* reexport */ ChartThreshold),\n "ChartThresholdTheme": () => (/* reexport */ ChartThresholdTheme),\n "ChartTooltip": () => (/* reexport */ ChartTooltip),\n "ChartVoronoiContainer": () => (/* reexport */ ChartVoronoiContainer),\n "ChartVoronoiDimension": () => (/* reexport */ ChartVoronoiDimension),\n "canUseDOM": () => (/* reexport */ canUseDOM),\n "createContainer": () => (/* reexport */ chart_container_createContainer),\n "doesLegendFit": () => (/* reexport */ doesLegendFit),\n "getAxisTheme": () => (/* reexport */ getAxisTheme),\n "getBulletComparativeErrorMeasureTheme": () => (/* reexport */ getBulletComparativeErrorMeasureTheme),\n "getBulletComparativeMeasureTheme": () => (/* reexport */ getBulletComparativeMeasureTheme),\n "getBulletComparativeWarningMeasureTheme": () => (/* reexport */ getBulletComparativeWarningMeasureTheme),\n "getBulletGroupTitleTheme": () => (/* reexport */ getBulletGroupTitleTheme),\n "getBulletLabelX": () => (/* reexport */ getBulletLabelX),\n "getBulletLabelY": () => (/* reexport */ getBulletLabelY),\n "getBulletLegendY": () => (/* reexport */ getBulletLegendY),\n "getBulletPrimaryDotMeasureTheme": () => (/* reexport */ getBulletPrimaryDotMeasureTheme),\n "getBulletPrimaryNegativeMeasureTheme": () => (/* reexport */ getBulletPrimaryNegativeMeasureTheme),\n "getBulletPrimarySegmentedMeasureTheme": () => (/* reexport */ getBulletPrimarySegmentedMeasureTheme),\n "getBulletQualitativeRangeTheme": () => (/* reexport */ getBulletQualitativeRangeTheme),\n "getBulletTheme": () => (/* reexport */ getBulletTheme),\n "getChartLegendX": () => (/* reexport */ getChartLegendX),\n "getChartLegendY": () => (/* reexport */ getChartLegendY),\n "getChartTheme": () => (/* reexport */ getChartTheme),\n "getClassName": () => (/* reexport */ getClassName),\n "getComputedLegend": () => (/* reexport */ getComputedLegend),\n "getCursorTooltipCenterOffset": () => (/* reexport */ getCursorTooltipCenterOffset),\n "getCursorTooltipPoniterOrientation": () => (/* reexport */ getCursorTooltipPoniterOrientation),\n "getCustomTheme": () => (/* reexport */ getCustomTheme),\n "getDarkThemeColors": () => (/* reexport */ getDarkThemeColors),\n "getDomain": () => (/* reexport */ chart_domain_getDomain),\n "getDomains": () => (/* reexport */ getDomains),\n "getDonutTheme": () => (/* reexport */ getDonutTheme),\n "getDonutThresholdDynamicTheme": () => (/* reexport */ getDonutThresholdDynamicTheme),\n "getDonutThresholdStaticTheme": () => (/* reexport */ getDonutThresholdStaticTheme),\n "getDonutUtilizationTheme": () => (/* reexport */ getDonutUtilizationTheme),\n "getInteractiveLegendEvents": () => (/* reexport */ getInteractiveLegendEvents),\n "getInteractiveLegendItemStyles": () => (/* reexport */ getInteractiveLegendItemStyles),\n "getLabelTextSize": () => (/* reexport */ getLabelTextSize),\n "getLegendDimensions": () => (/* reexport */ getLegendDimensions),\n "getLegendItemsPerRow": () => (/* reexport */ getLegendItemsPerRow),\n "getLegendTooltipDataProps": () => (/* reexport */ getLegendTooltipDataProps),\n "getLegendTooltipSize": () => (/* reexport */ getLegendTooltipSize),\n "getLegendTooltipVisibleData": () => (/* reexport */ getLegendTooltipVisibleData),\n "getLegendTooltipVisibleText": () => (/* reexport */ getLegendTooltipVisibleText),\n "getLegendX": () => (/* reexport */ getLegendX),\n "getLegendY": () => (/* reexport */ getLegendY),\n "getLightThemeColors": () => (/* reexport */ getLightThemeColors),\n "getMaxLegendTextSize": () => (/* reexport */ getMaxLegendTextSize),\n "getPaddingForSide": () => (/* reexport */ getPaddingForSide),\n "getPieLabelX": () => (/* reexport */ getPieLabelX),\n "getPieLabelY": () => (/* reexport */ getPieLabelY),\n "getPieLegendX": () => (/* reexport */ getPieLegendX),\n "getPieLegendY": () => (/* reexport */ getPieLegendY),\n "getPieOrigin": () => (/* reexport */ getPieOrigin),\n "getResizeObserver": () => (/* reexport */ getResizeObserver),\n "getTheme": () => (/* reexport */ getTheme),\n "getThresholdTheme": () => (/* reexport */ getThresholdTheme)\n});\n\n// NAMESPACE OBJECT: ./node_modules/d3-scale/index.js\nvar d3_scale_namespaceObject = {};\n__webpack_require__.r(d3_scale_namespaceObject);\n__webpack_require__.d(d3_scale_namespaceObject, {\n "interpolateCool": () => (cool),\n "interpolateCubehelixDefault": () => (d3_scale_src_cubehelix),\n "interpolateInferno": () => (inferno),\n "interpolateMagma": () => (magma),\n "interpolatePlasma": () => (plasma),\n "interpolateRainbow": () => (src_rainbow),\n "interpolateViridis": () => (viridis),\n "interpolateWarm": () => (warm),\n "scaleBand": () => (band),\n "scaleIdentity": () => (identity_identity),\n "scaleImplicit": () => (implicit),\n "scaleLinear": () => (linear_linear),\n "scaleLog": () => (log),\n "scaleOrdinal": () => (ordinal),\n "scalePoint": () => (point),\n "scalePow": () => (pow),\n "scaleQuantile": () => (quantile_quantile),\n "scaleQuantize": () => (quantize),\n "scaleSequential": () => (sequential),\n "scaleSqrt": () => (sqrt),\n "scaleThreshold": () => (threshold),\n "scaleTime": () => (time),\n "scaleUtc": () => (utcTime),\n "schemeCategory10": () => (category10),\n "schemeCategory20": () => (category20),\n "schemeCategory20b": () => (category20b),\n "schemeCategory20c": () => (category20c)\n});\n\n// NAMESPACE OBJECT: ./node_modules/d3-ease/src/index.js\nvar d3_ease_src_namespaceObject = {};\n__webpack_require__.r(d3_ease_src_namespaceObject);\n__webpack_require__.d(d3_ease_src_namespaceObject, {\n "easeBack": () => (backInOut),\n "easeBackIn": () => (backIn),\n "easeBackInOut": () => (backInOut),\n "easeBackOut": () => (backOut),\n "easeBounce": () => (bounceOut),\n "easeBounceIn": () => (bounceIn),\n "easeBounceInOut": () => (bounceInOut),\n "easeBounceOut": () => (bounceOut),\n "easeCircle": () => (circleInOut),\n "easeCircleIn": () => (circleIn),\n "easeCircleInOut": () => (circleInOut),\n "easeCircleOut": () => (circleOut),\n "easeCubic": () => (cubicInOut),\n "easeCubicIn": () => (cubicIn),\n "easeCubicInOut": () => (cubicInOut),\n "easeCubicOut": () => (cubicOut),\n "easeElastic": () => (elasticOut),\n "easeElasticIn": () => (elasticIn),\n "easeElasticInOut": () => (elasticInOut),\n "easeElasticOut": () => (elasticOut),\n "easeExp": () => (expInOut),\n "easeExpIn": () => (expIn),\n "easeExpInOut": () => (expInOut),\n "easeExpOut": () => (expOut),\n "easeLinear": () => (src_linear_linear),\n "easePoly": () => (polyInOut),\n "easePolyIn": () => (polyIn),\n "easePolyInOut": () => (polyInOut),\n "easePolyOut": () => (polyOut),\n "easeQuad": () => (quadInOut),\n "easeQuadIn": () => (quadIn),\n "easeQuadInOut": () => (quadInOut),\n "easeQuadOut": () => (quadOut),\n "easeSin": () => (sinInOut),\n "easeSinIn": () => (sinIn),\n "easeSinInOut": () => (sinInOut),\n "easeSinOut": () => (sinOut)\n});\n\n// NAMESPACE OBJECT: ./node_modules/d3-shape/src/index.js\nvar d3_shape_src_namespaceObject = {};\n__webpack_require__.r(d3_shape_src_namespaceObject);\n__webpack_require__.d(d3_shape_src_namespaceObject, {\n "arc": () => (src_arc),\n "area": () => (src_area),\n "areaRadial": () => (areaRadial),\n "curveBasis": () => (curve_basis),\n "curveBasisClosed": () => (curve_basisClosed),\n "curveBasisOpen": () => (basisOpen),\n "curveBundle": () => (bundle),\n "curveCardinal": () => (cardinal),\n "curveCardinalClosed": () => (cardinalClosed),\n "curveCardinalOpen": () => (cardinalOpen),\n "curveCatmullRom": () => (catmullRom),\n "curveCatmullRomClosed": () => (catmullRomClosed),\n "curveCatmullRomOpen": () => (catmullRomOpen),\n "curveLinear": () => (curve_linear),\n "curveLinearClosed": () => (linearClosed),\n "curveMonotoneX": () => (monotoneX),\n "curveMonotoneY": () => (monotoneY),\n "curveNatural": () => (natural),\n "curveStep": () => (step),\n "curveStepAfter": () => (stepAfter),\n "curveStepBefore": () => (stepBefore),\n "line": () => (src_line),\n "lineRadial": () => (src_lineRadial),\n "linkHorizontal": () => (linkHorizontal),\n "linkRadial": () => (linkRadial),\n "linkVertical": () => (linkVertical),\n "pie": () => (pie),\n "pointRadial": () => (pointRadial),\n "radialArea": () => (areaRadial),\n "radialLine": () => (src_lineRadial),\n "stack": () => (stack),\n "stackOffsetDiverging": () => (diverging),\n "stackOffsetExpand": () => (expand),\n "stackOffsetNone": () => (none),\n "stackOffsetSilhouette": () => (silhouette),\n "stackOffsetWiggle": () => (wiggle),\n "stackOrderAppearance": () => (appearance),\n "stackOrderAscending": () => (order_ascending),\n "stackOrderDescending": () => (order_descending),\n "stackOrderInsideOut": () => (insideOut),\n "stackOrderNone": () => (order_none),\n "stackOrderReverse": () => (reverse),\n "symbol": () => (symbol),\n "symbolCircle": () => (symbol_circle),\n "symbolCross": () => (cross),\n "symbolDiamond": () => (diamond),\n "symbolSquare": () => (square),\n "symbolStar": () => (star),\n "symbolTriangle": () => (triangle),\n "symbolWye": () => (wye),\n "symbols": () => (symbols)\n});\n\n// EXTERNAL MODULE: ./node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(655);\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js\nvar hoist_non_react_statics_cjs = __webpack_require__(8679);\nvar hoist_non_react_statics_cjs_default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics_cjs);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_legend_Margin.js\nconst chart_legend_Margin = {\n "name": "--pf-chart-legend--Margin",\n "value": 16,\n "var": "var(--pf-chart-legend--Margin)"\n};\n/* harmony default export */ const esm_chart_legend_Margin = (chart_legend_Margin);\n// EXTERNAL MODULE: ./node_modules/lodash/isEmpty.js\nvar isEmpty = __webpack_require__(1609);\nvar isEmpty_default = /*#__PURE__*/__webpack_require__.n(isEmpty);\n// EXTERNAL MODULE: ./node_modules/lodash/assign.js\nvar lodash_assign = __webpack_require__(8583);\nvar assign_default = /*#__PURE__*/__webpack_require__.n(lodash_assign);\n// EXTERNAL MODULE: ./node_modules/lodash/defaults.js\nvar defaults = __webpack_require__(1747);\nvar defaults_default = /*#__PURE__*/__webpack_require__.n(defaults);\n// EXTERNAL MODULE: ./node_modules/prop-types/index.js\nvar prop_types = __webpack_require__(5697);\nvar prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);\n// EXTERNAL MODULE: ./node_modules/lodash/keys.js\nvar keys = __webpack_require__(3674);\nvar keys_default = /*#__PURE__*/__webpack_require__.n(keys);\n// EXTERNAL MODULE: ./node_modules/lodash/pick.js\nvar pick = __webpack_require__(8718);\nvar pick_default = /*#__PURE__*/__webpack_require__.n(pick);\n// EXTERNAL MODULE: ./node_modules/lodash/property.js\nvar property = __webpack_require__(9601);\nvar property_default = /*#__PURE__*/__webpack_require__.n(property);\n// EXTERNAL MODULE: ./node_modules/lodash/isFunction.js\nvar isFunction = __webpack_require__(3560);\nvar isFunction_default = /*#__PURE__*/__webpack_require__.n(isFunction);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/helpers.js\n\n\n\n\n\n\n\n/* eslint-disable func-style */\n\n/* eslint-disable no-use-before-define */\n\n\n// Private Functions\nfunction getCartesianRange(props, axis) {\n // determine how to lay the axis and what direction positive and negative are\n var vertical = axis !== "x";\n var padding = helpers_getPadding(props);\n\n if (vertical) {\n return [props.height - padding.bottom, padding.top];\n }\n\n return [padding.left, props.width - padding.right];\n}\n\nfunction getPolarRange(props, axis) {\n if (axis === "x") {\n var startAngle = degreesToRadians(props.startAngle || 0);\n var endAngle = degreesToRadians(props.endAngle || 360);\n return [startAngle, endAngle];\n }\n\n return [props.innerRadius || 0, getRadius(props)];\n} // Exported Functions\n\n/**\n * creates an object with some keys excluded\n * replacement for lodash.omit for performance. does not mimick the entire lodash.omit api\n * @param {Object} originalObject: created object will be based on this object\n * @param {Array} ks: an array of keys to omit from the new object\n * @returns {Object} new object with same properties as originalObject\n */\n\n\nfunction omit(originalObject) {\n var ks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n // code based on babel\'s _objectWithoutProperties\n var newObject = {};\n\n for (var key in originalObject) {\n if (ks.indexOf(key) >= 0) {\n continue;\n }\n\n if (!Object.prototype.hasOwnProperty.call(originalObject, key)) {\n continue;\n }\n\n newObject[key] = originalObject[key];\n }\n\n return newObject;\n}\nfunction getPoint(datum) {\n var exists = function (val) {\n return val !== undefined;\n };\n\n var _x = datum._x,\n _x1 = datum._x1,\n _x0 = datum._x0,\n _voronoiX = datum._voronoiX,\n _y = datum._y,\n _y1 = datum._y1,\n _y0 = datum._y0,\n _voronoiY = datum._voronoiY;\n var defaultX = exists(_x1) ? _x1 : _x;\n var defaultY = exists(_y1) ? _y1 : _y;\n var point = {\n x: exists(_voronoiX) ? _voronoiX : defaultX,\n x0: exists(_x0) ? _x0 : _x,\n y: exists(_voronoiY) ? _voronoiY : defaultY,\n y0: exists(_y0) ? _y0 : _y\n };\n return defaults_default()({}, point, datum);\n}\nfunction scalePoint(props, datum) {\n var scale = props.scale,\n polar = props.polar,\n horizontal = props.horizontal;\n var d = getPoint(datum);\n var origin = props.origin || {\n x: 0,\n y: 0\n };\n var x = horizontal ? scale.y(d.y) : scale.x(d.x);\n var x0 = horizontal ? scale.y(d.y0) : scale.x(d.x0);\n var y = horizontal ? scale.x(d.x) : scale.y(d.y);\n var y0 = horizontal ? scale.x(d.x0) : scale.y(d.y0);\n return {\n x: polar ? y * Math.cos(x) + origin.x : x,\n x0: polar ? y0 * Math.cos(x0) + origin.x : x0,\n y: polar ? -y * Math.sin(x) + origin.y : y,\n y0: polar ? -y0 * Math.sin(x0) + origin.x : y0\n };\n}\nfunction helpers_getPadding(props) {\n var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "padding";\n var padding = props[name];\n var paddingVal = typeof padding === "number" ? padding : 0;\n var paddingObj = typeof padding === "object" ? padding : {};\n return {\n top: paddingObj.top || paddingVal,\n bottom: paddingObj.bottom || paddingVal,\n left: paddingObj.left || paddingVal,\n right: paddingObj.right || paddingVal\n };\n}\nfunction isTooltip(component) {\n var labelRole = component && component.type && component.type.role;\n return labelRole === "tooltip";\n}\nfunction getDefaultStyles(props, role) {\n var _props$theme = props.theme,\n theme = _props$theme === void 0 ? {} : _props$theme,\n labelComponent = props.labelComponent;\n var defaultStyles = theme[role] && theme[role].style || {};\n\n if (!isTooltip(labelComponent)) {\n return defaultStyles;\n }\n\n var tooltipStyle = theme.tooltip && theme.tooltip.style || {};\n\n var labelStyle = defaults_default()({}, tooltipStyle, defaultStyles.labels);\n\n return defaults_default()({}, {\n labels: labelStyle\n }, defaultStyles);\n}\nfunction getStyles(style, defaultStyles) {\n var width = "100%";\n var height = "100%";\n\n if (!style) {\n return defaults_default()({\n parent: {\n height: height,\n width: width\n }\n }, defaultStyles);\n }\n\n var data = style.data,\n labels = style.labels,\n parent = style.parent;\n var defaultParent = defaultStyles && defaultStyles.parent || {};\n var defaultLabels = defaultStyles && defaultStyles.labels || {};\n var defaultData = defaultStyles && defaultStyles.data || {};\n return {\n parent: defaults_default()({}, parent, defaultParent, {\n width: width,\n height: height\n }),\n labels: defaults_default()({}, labels, defaultLabels),\n data: defaults_default()({}, data, defaultData)\n };\n}\nfunction evaluateProp(prop, props) {\n return isFunction_default()(prop) ? prop(props) : prop;\n}\nfunction evaluateStyle(style, props) {\n if (props.disableInlineStyles) {\n return {};\n }\n\n if (!style || !keys_default()(style).some(function (value) {\n return isFunction_default()(style[value]);\n })) {\n return style;\n }\n\n return keys_default()(style).reduce(function (prev, curr) {\n prev[curr] = evaluateProp(style[curr], props);\n return prev;\n }, {});\n}\nfunction degreesToRadians(degrees) {\n return typeof degrees === "number" ? degrees * (Math.PI / 180) : degrees;\n}\nfunction radiansToDegrees(radians) {\n return typeof radians === "number" ? radians / (Math.PI / 180) : radians;\n}\nfunction getRadius(props) {\n var _getPadding = helpers_getPadding(props),\n left = _getPadding.left,\n right = _getPadding.right,\n top = _getPadding.top,\n bottom = _getPadding.bottom;\n\n var width = props.width,\n height = props.height;\n return Math.min(width - left - right, height - top - bottom) / 2;\n}\nfunction getPolarOrigin(props) {\n var width = props.width,\n height = props.height;\n\n var _getPadding2 = helpers_getPadding(props),\n top = _getPadding2.top,\n bottom = _getPadding2.bottom,\n left = _getPadding2.left,\n right = _getPadding2.right;\n\n var radius = Math.min(width - left - right, height - top - bottom) / 2;\n var offsetWidth = width / 2 + left - right;\n var offsetHeight = height / 2 + top - bottom;\n return {\n x: offsetWidth + radius > width ? radius + left - right : offsetWidth,\n y: offsetHeight + radius > height ? radius + top - bottom : offsetHeight\n };\n}\nfunction getRange(props, axis) {\n if (props.range && props.range[axis]) {\n return props.range[axis];\n } else if (props.range && Array.isArray(props.range)) {\n return props.range;\n }\n\n return props.polar ? getPolarRange(props, axis) : getCartesianRange(props, axis);\n}\nfunction helpers_createAccessor(key) {\n // creates a data accessor function\n // given a property key, path, array index, or null for identity.\n if (isFunction_default()(key)) {\n return key;\n } else if (key === null || key === undefined) {\n // null/undefined means "return the data item itself"\n return function (x) {\n return x;\n };\n } // otherwise, assume it is an array index, property key or path (_.property handles all three)\n\n\n return property_default()(key);\n}\nfunction modifyProps(props, fallbackProps, role) {\n var theme = props.theme && props.theme[role] ? props.theme[role] : {};\n var themeProps = omit(theme, ["style"]);\n var horizontal = isHorizontal(props);\n var defaultObject = horizontal === undefined ? {} : {\n horizontal: horizontal\n };\n return defaults_default()(defaultObject, props, themeProps, fallbackProps);\n}\n/**\n * Returns the given axis or the opposite axis when horizontal\n * @param {string} axis: the given axis, either "x" pr "y"\n * @param {Boolean} horizontal: true when the chart is flipped to the horizontal orientation\n * @returns {String} the dimension appropriate for the axis given its props "x" or "y"\n */\n\nfunction getCurrentAxis(axis, horizontal) {\n var otherAxis = axis === "x" ? "y" : "x";\n return horizontal ? otherAxis : axis;\n}\n/**\n * @param {Array} children: an array of child components\n * @param {Function} iteratee: a function with arguments "child", "childName", and "parent"\n * @param {Object} parentProps: props from the parent that are applied to children\n * @param {any} initialMemo: The object in which the iteration results are combined.\n * @param {Function} combine: Combines the result of the iteratee with the current memo\n * to the memo for the next iteration step\n * @returns {Array} returns an array of results from calling the iteratee on all nested children\n */\n\n/* eslint-disable max-params */\n\nfunction reduceChildren(children, iteratee) {\n var parentProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var initialMemo = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n var combine = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function (memo, item) {\n return memo.concat(item);\n };\n var sharedProps = ["data", "domain", "categories", "polar", "startAngle", "endAngle", "minDomain", "maxDomain", "horizontal"];\n\n var traverseChildren = function (childArray, names, parent) {\n return childArray.reduce(function (memo, child, index) {\n var childRole = child.type && child.type.role;\n var childName = child.props.name || "".concat(childRole, "-").concat(names[index]);\n\n if (child.props && child.props.children) {\n var childProps = assign_default()({}, child.props, pick_default()(parentProps, sharedProps));\n\n var nestedChildren = child.type && child.type.role === "stack" && isFunction_default()(child.type.getChildren) ? child.type.getChildren(childProps) : react.Children.toArray(child.props.children).map(function (c) {\n var nestedChildProps = assign_default()({}, c.props, pick_default()(childProps, sharedProps));\n\n return react.cloneElement(c, nestedChildProps);\n });\n\n var _childNames = nestedChildren.map(function (c, i) {\n return "".concat(childName, "-").concat(i);\n });\n\n var nestedResults = traverseChildren(nestedChildren, _childNames, child);\n memo = combine(memo, nestedResults);\n } else {\n var result = iteratee(child, childName, parent);\n\n if (result) {\n memo = combine(memo, result);\n }\n }\n\n return memo;\n }, initialMemo);\n };\n\n var childNames = children.map(function (c, i) {\n return i;\n });\n return traverseChildren(children, childNames);\n}\n/**\n * @param {Object} props: the props object\n * @returns {Boolean} returns true if the props object contains `horizontal: true` of if any\n * children or nested children are hoizontal\n */\n\nfunction isHorizontal(props) {\n if (props.horizontal !== undefined || !props.children) {\n return props.horizontal;\n }\n\n var traverseChildren = function (childArray) {\n return childArray.reduce(function (memo, child) {\n var childProps = child.props || {};\n\n if (memo || childProps.horizontal || !childProps.children) {\n memo = memo || childProps.horizontal;\n return memo;\n }\n\n return traverseChildren(react.Children.toArray(childProps.children));\n }, false);\n };\n\n return traverseChildren(react.Children.toArray(props.children));\n}\n// EXTERNAL MODULE: ./node_modules/lodash/isPlainObject.js\nvar isPlainObject = __webpack_require__(8630);\nvar isPlainObject_default = /*#__PURE__*/__webpack_require__.n(isPlainObject);\n// EXTERNAL MODULE: ./node_modules/lodash/values.js\nvar values = __webpack_require__(2628);\nvar values_default = /*#__PURE__*/__webpack_require__.n(values);\n// EXTERNAL MODULE: ./node_modules/lodash/uniqBy.js\nvar uniqBy = __webpack_require__(5578);\nvar uniqBy_default = /*#__PURE__*/__webpack_require__.n(uniqBy);\n// EXTERNAL MODULE: ./node_modules/lodash/groupBy.js\nvar groupBy = __webpack_require__(7739);\nvar groupBy_default = /*#__PURE__*/__webpack_require__.n(groupBy);\n// EXTERNAL MODULE: ./node_modules/lodash/uniq.js\nvar uniq = __webpack_require__(4908);\nvar uniq_default = /*#__PURE__*/__webpack_require__.n(uniq);\n// EXTERNAL MODULE: ./node_modules/lodash/flatten.js\nvar flatten = __webpack_require__(5564);\nvar flatten_default = /*#__PURE__*/__webpack_require__.n(flatten);\n// EXTERNAL MODULE: ./node_modules/lodash/without.js\nvar without = __webpack_require__(2569);\nvar without_default = /*#__PURE__*/__webpack_require__.n(without);\n// EXTERNAL MODULE: ./node_modules/lodash/includes.js\nvar includes = __webpack_require__(4721);\nvar includes_default = /*#__PURE__*/__webpack_require__.n(includes);\n// EXTERNAL MODULE: ./node_modules/lodash/orderBy.js\nvar orderBy = __webpack_require__(5472);\nvar orderBy_default = /*#__PURE__*/__webpack_require__.n(orderBy);\n// EXTERNAL MODULE: ./node_modules/lodash/range.js\nvar lodash_range = __webpack_require__(6026);\nvar range_default = /*#__PURE__*/__webpack_require__.n(lodash_range);\n// EXTERNAL MODULE: ./node_modules/lodash/invert.js\nvar invert = __webpack_require__(3137);\nvar invert_default = /*#__PURE__*/__webpack_require__.n(invert);\n// EXTERNAL MODULE: ./node_modules/lodash/isObject.js\nvar isObject = __webpack_require__(3218);\nvar isObject_default = /*#__PURE__*/__webpack_require__.n(isObject);\n// EXTERNAL MODULE: ./node_modules/lodash/identity.js\nvar lodash_identity = __webpack_require__(6557);\nvar identity_default = /*#__PURE__*/__webpack_require__.n(lodash_identity);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/collection.js\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\n/* eslint-disable func-style */\n\n/* eslint-disable no-use-before-define */\nfunction isNonEmptyArray(collection) {\n return Array.isArray(collection) && collection.length > 0;\n}\n\nfunction containsStrings(collection) {\n return Array.isArray(collection) && collection.some(function (value) {\n return typeof value === "string";\n });\n}\nfunction containsDates(collection) {\n return Array.isArray(collection) && collection.some(function (value) {\n return value instanceof Date;\n });\n}\nfunction containsNumbers(collection) {\n return Array.isArray(collection) && collection.some(function (value) {\n return typeof value === "number";\n });\n}\nfunction containsOnlyStrings(collection) {\n return isNonEmptyArray(collection) && collection.every(function (value) {\n return typeof value === "string";\n });\n}\nfunction isArrayOfArrays(collection) {\n return isNonEmptyArray(collection) && collection.every(Array.isArray);\n}\nfunction removeUndefined(arr) {\n return arr.filter(function (el) {\n return el !== undefined;\n });\n}\nfunction getMaxValue(arr) {\n for (var _len = arguments.length, values = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n values[_key - 1] = arguments[_key];\n }\n\n var array = arr.concat(values);\n return containsDates(array) ? new Date(Math.max.apply(Math, _toConsumableArray(array))) : Math.max.apply(Math, _toConsumableArray(array));\n}\nfunction getMinValue(arr) {\n for (var _len2 = arguments.length, values = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n values[_key2 - 1] = arguments[_key2];\n }\n\n var array = arr.concat(values);\n return containsDates(array) ? new Date(Math.min.apply(Math, _toConsumableArray(array))) : Math.min.apply(Math, _toConsumableArray(array));\n}\n// EXTERNAL MODULE: ./node_modules/lodash/isDate.js\nvar isDate = __webpack_require__(7960);\nvar isDate_default = /*#__PURE__*/__webpack_require__.n(isDate);\n// EXTERNAL MODULE: ./node_modules/lodash/sortedUniq.js\nvar sortedUniq = __webpack_require__(7520);\nvar sortedUniq_default = /*#__PURE__*/__webpack_require__.n(sortedUniq);\n// EXTERNAL MODULE: ./node_modules/lodash/omitBy.js\nvar omitBy = __webpack_require__(4176);\nvar omitBy_default = /*#__PURE__*/__webpack_require__.n(omitBy);\n// EXTERNAL MODULE: ./node_modules/lodash/isUndefined.js\nvar isUndefined = __webpack_require__(2353);\nvar isUndefined_default = /*#__PURE__*/__webpack_require__.n(isUndefined);\n// EXTERNAL MODULE: ./node_modules/lodash/isEqual.js\nvar isEqual = __webpack_require__(8446);\nvar isEqual_default = /*#__PURE__*/__webpack_require__.n(isEqual);\n// EXTERNAL MODULE: ./node_modules/lodash/last.js\nvar last = __webpack_require__(928);\nvar last_default = /*#__PURE__*/__webpack_require__.n(last);\n;// CONCATENATED MODULE: ./node_modules/d3-array/src/ascending.js\n/* harmony default export */ function src_ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-array/src/bisector.js\n\n\n/* harmony default export */ function bisector(compare) {\n if (compare.length === 1) compare = ascendingComparator(compare);\n return {\n left: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n };\n}\n\nfunction ascendingComparator(f) {\n return function(d, x) {\n return src_ascending(f(d), x);\n };\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-array/src/bisect.js\n\n\n\nvar ascendingBisect = bisector(src_ascending);\nvar bisectRight = ascendingBisect.right;\nvar bisectLeft = ascendingBisect.left;\n/* harmony default export */ const src_bisect = (bisectRight);\n\n;// CONCATENATED MODULE: ./node_modules/d3-array/src/array.js\nvar array = Array.prototype;\n\nvar array_slice = array.slice;\nvar array_map = array.map;\n\n;// CONCATENATED MODULE: ./node_modules/d3-array/src/ticks.js\nvar e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\n/* harmony default export */ function ticks(start, stop, count) {\n var reverse,\n i = -1,\n n,\n ticks,\n step;\n\n stop = +stop, start = +start, count = +count;\n if (start === stop && count > 0) return [start];\n if (reverse = stop < start) n = start, start = stop, stop = n;\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n if (step > 0) {\n start = Math.ceil(start / step);\n stop = Math.floor(stop / step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) * step;\n } else {\n start = Math.floor(start * step);\n stop = Math.ceil(stop * step);\n ticks = new Array(n = Math.ceil(start - stop + 1));\n while (++i < n) ticks[i] = (start - i) / step;\n }\n\n if (reverse) ticks.reverse();\n\n return ticks;\n}\n\nfunction tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log(step) / Math.LN10),\n error = step / Math.pow(10, power);\n return power >= 0\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nfunction ticks_tickStep(start, stop, count) {\n var step0 = Math.abs(stop - start) / Math.max(0, count),\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n error = step0 / step1;\n if (error >= e10) step1 *= 10;\n else if (error >= e5) step1 *= 5;\n else if (error >= e2) step1 *= 2;\n return stop < start ? -step1 : step1;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-array/src/histogram.js\n\n\n\n\n\n\n\n\n\n/* harmony default export */ function histogram() {\n var value = identity,\n domain = extent,\n threshold = sturges;\n\n function histogram(data) {\n var i,\n n = data.length,\n x,\n values = new Array(n);\n\n for (i = 0; i < n; ++i) {\n values[i] = value(data[i], i, data);\n }\n\n var xz = domain(values),\n x0 = xz[0],\n x1 = xz[1],\n tz = threshold(values, x0, x1);\n\n // Convert number of thresholds into uniform thresholds.\n if (!Array.isArray(tz)) {\n tz = tickStep(x0, x1, tz);\n tz = range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive\n }\n\n // Remove any thresholds outside the domain.\n var m = tz.length;\n while (tz[0] <= x0) tz.shift(), --m;\n while (tz[m - 1] > x1) tz.pop(), --m;\n\n var bins = new Array(m + 1),\n bin;\n\n // Initialize bins.\n for (i = 0; i <= m; ++i) {\n bin = bins[i] = [];\n bin.x0 = i > 0 ? tz[i - 1] : x0;\n bin.x1 = i < m ? tz[i] : x1;\n }\n\n // Assign data to bins by value, ignoring any outside the domain.\n for (i = 0; i < n; ++i) {\n x = values[i];\n if (x0 <= x && x <= x1) {\n bins[bisect(tz, x, 0, m)].push(data[i]);\n }\n }\n\n return bins;\n }\n\n histogram.value = function(_) {\n return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;\n };\n\n histogram.domain = function(_) {\n return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;\n };\n\n histogram.thresholds = function(_) {\n return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;\n };\n\n return histogram;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-array/src/threshold/freedmanDiaconis.js\n\n\n\n\n\n/* harmony default export */ function freedmanDiaconis(values, min, max) {\n values = map.call(values, number).sort(ascending);\n return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3)));\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-array/src/number.js\n/* harmony default export */ function src_number(x) {\n return x === null ? NaN : +x;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-array/src/quantile.js\n\n\n/* harmony default export */ function src_quantile(values, p, valueof) {\n if (valueof == null) valueof = src_number;\n if (!(n = values.length)) return;\n if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\n if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n var n,\n i = (n - 1) * p,\n i0 = Math.floor(i),\n value0 = +valueof(values[i0], i0, values),\n value1 = +valueof(values[i0 + 1], i0 + 1, values);\n return value0 + (value1 - value0) * (i - i0);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-array/src/range.js\n/* harmony default export */ function src_range(start, stop, step) {\n start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n var i = -1,\n n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n range = new Array(n);\n\n while (++i < n) {\n range[i] = start + i * step;\n }\n\n return range;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-array/src/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./node_modules/d3-collection/src/map.js\nvar prefix = "$";\n\nfunction Map() {}\n\nMap.prototype = map_map.prototype = {\n constructor: Map,\n has: function(key) {\n return (prefix + key) in this;\n },\n get: function(key) {\n return this[prefix + key];\n },\n set: function(key, value) {\n this[prefix + key] = value;\n return this;\n },\n remove: function(key) {\n var property = prefix + key;\n return property in this && delete this[property];\n },\n clear: function() {\n for (var property in this) if (property[0] === prefix) delete this[property];\n },\n keys: function() {\n var keys = [];\n for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));\n return keys;\n },\n values: function() {\n var values = [];\n for (var property in this) if (property[0] === prefix) values.push(this[property]);\n return values;\n },\n entries: function() {\n var entries = [];\n for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});\n return entries;\n },\n size: function() {\n var size = 0;\n for (var property in this) if (property[0] === prefix) ++size;\n return size;\n },\n empty: function() {\n for (var property in this) if (property[0] === prefix) return false;\n return true;\n },\n each: function(f) {\n for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);\n }\n};\n\nfunction map_map(object, f) {\n var map = new Map;\n\n // Copy constructor.\n if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });\n\n // Index array by numeric index or specified key function.\n else if (Array.isArray(object)) {\n var i = -1,\n n = object.length,\n o;\n\n if (f == null) while (++i < n) map.set(i, object[i]);\n else while (++i < n) map.set(f(o = object[i], i, object), o);\n }\n\n // Convert object to map.\n else if (object) for (var key in object) map.set(key, object[key]);\n\n return map;\n}\n\n/* harmony default export */ const src_map = (map_map);\n\n;// CONCATENATED MODULE: ./node_modules/d3-collection/src/nest.js\n\n\n/* harmony default export */ function nest() {\n var keys = [],\n sortKeys = [],\n sortValues,\n rollup,\n nest;\n\n function apply(array, depth, createResult, setResult) {\n if (depth >= keys.length) {\n if (sortValues != null) array.sort(sortValues);\n return rollup != null ? rollup(array) : array;\n }\n\n var i = -1,\n n = array.length,\n key = keys[depth++],\n keyValue,\n value,\n valuesByKey = map(),\n values,\n result = createResult();\n\n while (++i < n) {\n if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {\n values.push(value);\n } else {\n valuesByKey.set(keyValue, [value]);\n }\n }\n\n valuesByKey.each(function(values, key) {\n setResult(result, key, apply(values, depth, createResult, setResult));\n });\n\n return result;\n }\n\n function entries(map, depth) {\n if (++depth > keys.length) return map;\n var array, sortKey = sortKeys[depth - 1];\n if (rollup != null && depth >= keys.length) array = map.entries();\n else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });\n return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;\n }\n\n return nest = {\n object: function(array) { return apply(array, 0, createObject, setObject); },\n map: function(array) { return apply(array, 0, createMap, setMap); },\n entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },\n key: function(d) { keys.push(d); return nest; },\n sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },\n sortValues: function(order) { sortValues = order; return nest; },\n rollup: function(f) { rollup = f; return nest; }\n };\n}\n\nfunction createObject() {\n return {};\n}\n\nfunction setObject(object, key, value) {\n object[key] = value;\n}\n\nfunction createMap() {\n return map();\n}\n\nfunction setMap(map, key, value) {\n map.set(key, value);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-collection/src/set.js\n\n\nfunction Set() {}\n\nvar proto = src_map.prototype;\n\nSet.prototype = set.prototype = {\n constructor: Set,\n has: proto.has,\n add: function(value) {\n value += "";\n this[prefix + value] = value;\n return this;\n },\n remove: proto.remove,\n clear: proto.clear,\n values: proto.keys,\n size: proto.size,\n empty: proto.empty,\n each: proto.each\n};\n\nfunction set(object, f) {\n var set = new Set;\n\n // Copy constructor.\n if (object instanceof Set) object.each(function(value) { set.add(value); });\n\n // Otherwise, assume it’s an array.\n else if (object) {\n var i = -1, n = object.length;\n if (f == null) while (++i < n) set.add(object[i]);\n else while (++i < n) set.add(f(object[i], i, object));\n }\n\n return set;\n}\n\n/* harmony default export */ const src_set = ((/* unused pure expression or super */ null && (set)));\n\n;// CONCATENATED MODULE: ./node_modules/d3-collection/src/index.js\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/array.js\nvar array_array = Array.prototype;\n\nvar src_array_map = array_array.map;\nvar src_array_slice = array_array.slice;\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/ordinal.js\n\n\n\nvar implicit = {name: "implicit"};\n\nfunction ordinal(range) {\n var index = src_map(),\n domain = [],\n unknown = implicit;\n\n range = range == null ? [] : src_array_slice.call(range);\n\n function scale(d) {\n var key = d + "", i = index.get(key);\n if (!i) {\n if (unknown !== implicit) return unknown;\n index.set(key, i = domain.push(d));\n }\n return range[(i - 1) % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = src_map();\n var i = -1, n = _.length, d, key;\n while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = src_array_slice.call(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal()\n .domain(domain)\n .range(range)\n .unknown(unknown);\n };\n\n return scale;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/band.js\n\n\n\nfunction band() {\n var scale = ordinal().unknown(undefined),\n domain = scale.domain,\n ordinalRange = scale.range,\n range = [0, 1],\n step,\n bandwidth,\n round = false,\n paddingInner = 0,\n paddingOuter = 0,\n align = 0.5;\n\n delete scale.unknown;\n\n function rescale() {\n var n = domain().length,\n reverse = range[1] < range[0],\n start = range[reverse - 0],\n stop = range[1 - reverse];\n step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n if (round) step = Math.floor(step);\n start += (stop - start - step * (n - paddingInner)) * align;\n bandwidth = step * (1 - paddingInner);\n if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n var values = src_range(n).map(function(i) { return start + step * i; });\n return ordinalRange(reverse ? values.reverse() : values);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = [+_[0], +_[1]], round = true, rescale();\n };\n\n scale.bandwidth = function() {\n return bandwidth;\n };\n\n scale.step = function() {\n return step;\n };\n\n scale.round = function(_) {\n return arguments.length ? (round = !!_, rescale()) : round;\n };\n\n scale.padding = function(_) {\n return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;\n };\n\n scale.paddingInner = function(_) {\n return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;\n };\n\n scale.paddingOuter = function(_) {\n return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;\n };\n\n scale.align = function(_) {\n return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n };\n\n scale.copy = function() {\n return band()\n .domain(domain())\n .range(range)\n .round(round)\n .paddingInner(paddingInner)\n .paddingOuter(paddingOuter)\n .align(align);\n };\n\n return rescale();\n}\n\nfunction pointish(scale) {\n var copy = scale.copy;\n\n scale.padding = scale.paddingOuter;\n delete scale.paddingInner;\n delete scale.paddingOuter;\n\n scale.copy = function() {\n return pointish(copy());\n };\n\n return scale;\n}\n\nfunction point() {\n return pointish(band().paddingInner(1));\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/number.js\n/* harmony default export */ function d3_interpolate_src_number(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-color/src/define.js\n/* harmony default export */ function src_define(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nfunction extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-color/src/color.js\n\n\nfunction Color() {}\n\nvar darker = 0.7;\nvar brighter = 1 / darker;\n\nvar reI = "\\\\s*([+-]?\\\\d+)\\\\s*",\n reN = "\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*",\n reP = "\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp("^rgb\\\\(" + [reI, reI, reI] + "\\\\)$"),\n reRgbPercent = new RegExp("^rgb\\\\(" + [reP, reP, reP] + "\\\\)$"),\n reRgbaInteger = new RegExp("^rgba\\\\(" + [reI, reI, reI, reN] + "\\\\)$"),\n reRgbaPercent = new RegExp("^rgba\\\\(" + [reP, reP, reP, reN] + "\\\\)$"),\n reHslPercent = new RegExp("^hsl\\\\(" + [reN, reP, reP] + "\\\\)$"),\n reHslaPercent = new RegExp("^hsla\\\\(" + [reN, reP, reP, reN] + "\\\\)$");\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\nsrc_define(Color, color, {\n copy: function(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable: function() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nfunction color(format) {\n var m, l;\n format = (format + "").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nfunction rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nfunction color_rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nfunction Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\nsrc_define(Rgb, color_rgb, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb: function() {\n return this;\n },\n displayable: function() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return "#" + hex(this.r) + hex(this.g) + hex(this.b);\n}\n\nfunction rgb_formatRgb() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? "rgb(" : "rgba(")\n + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "\n + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "\n + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n + (a === 1 ? ")" : ", " + a + ")");\n}\n\nfunction hex(value) {\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\n return (value < 16 ? "0" : "") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nfunction hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nfunction hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\nsrc_define(Hsl, hsl, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n displayable: function() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl: function() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? "hsl(" : "hsla(")\n + (this.h || 0) + ", "\n + (this.s || 0) * 100 + "%, "\n + (this.l || 0) * 100 + "%"\n + (a === 1 ? ")" : ", " + a + ")");\n }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/basis.js\nfunction basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\n/* harmony default export */ function src_basis(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/basisClosed.js\n\n\n/* harmony default export */ function basisClosed(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/constant.js\n/* harmony default export */ function src_constant(x) {\n return function() {\n return x;\n };\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/color.js\n\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nfunction hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : src_constant(isNaN(a) ? b : a);\n}\n\nfunction gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : src_constant(isNaN(a) ? b : a);\n };\n}\n\nfunction nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : src_constant(isNaN(a) ? b : a);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/rgb.js\n\n\n\n\n\n/* harmony default export */ const rgb = ((function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = color_rgb(start)).r, (end = color_rgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + "";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1));\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = color_rgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + "";\n };\n };\n}\n\nvar rgbBasis = rgbSpline(src_basis);\nvar rgbBasisClosed = rgbSpline(basisClosed);\n\n;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/array.js\n\n\n\n/* harmony default export */ function src_array(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nfunction genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/date.js\n/* harmony default export */ function date(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/object.js\n\n\n/* harmony default export */ function object(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== "object") a = {};\n if (b === null || typeof b !== "object") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/string.js\n\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, "g");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + "";\n };\n}\n\n/* harmony default export */ function string(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + "", b = b + "";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: d3_interpolate_src_number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join("");\n });\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/numberArray.js\n/* harmony default export */ function src_numberArray(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nfunction numberArray_isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/value.js\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ function value(a, b) {\n var t = typeof b, c;\n return b == null || t === "boolean" ? src_constant(b)\n : (t === "number" ? d3_interpolate_src_number\n : t === "string" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : numberArray_isNumberArray(b) ? src_numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object\n : d3_interpolate_src_number)(a, b);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/round.js\n/* harmony default export */ function round(a, b) {\n return a = +a, b = +b, function(t) {\n return Math.round(a * (1 - t) + b * t);\n };\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/constant.js\n/* harmony default export */ function d3_scale_src_constant(x) {\n return function() {\n return x;\n };\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/number.js\n/* harmony default export */ function d3_scale_src_number(x) {\n return +x;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/continuous.js\n\n\n\n\n\n\nvar unit = [0, 1];\n\nfunction deinterpolateLinear(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : d3_scale_src_constant(b);\n}\n\nfunction deinterpolateClamp(deinterpolate) {\n return function(a, b) {\n var d = deinterpolate(a = +a, b = +b);\n return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };\n };\n}\n\nfunction reinterpolateClamp(reinterpolate) {\n return function(a, b) {\n var r = reinterpolate(a = +a, b = +b);\n return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };\n };\n}\n\nfunction bimap(domain, range, deinterpolate, reinterpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);\n else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, deinterpolate, reinterpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = deinterpolate(domain[i], domain[i + 1]);\n r[i] = reinterpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = src_bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nfunction copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp());\n}\n\n// deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].\nfunction continuous(deinterpolate, reinterpolate) {\n var domain = unit,\n range = unit,\n interpolate = value,\n clamp = false,\n piecewise,\n output,\n input;\n\n function rescale() {\n piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate)))(+x);\n }\n\n scale.invert = function(y) {\n return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = src_array_map.call(_, d3_scale_src_number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = src_array_slice.call(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = src_array_slice.call(_), interpolate = round, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, rescale()) : clamp;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n return rescale();\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/formatSpecifier.js\n// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nfunction formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nfunction FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? " " : specifier.fill + "";\n this.align = specifier.align === undefined ? ">" : specifier.align + "";\n this.sign = specifier.sign === undefined ? "-" : specifier.sign + "";\n this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + "";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? "" : specifier.type + "";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? "0" : "")\n + (this.width === undefined ? "" : Math.max(1, this.width | 0))\n + (this.comma ? "," : "")\n + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0))\n + (this.trim ? "~" : "")\n + this.type;\n};\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/formatDecimal.js\n/* harmony default export */ function formatDecimal(x) {\n return Math.abs(x = Math.round(x)) >= 1e21\n ? x.toLocaleString("en").replace(/,/g, "")\n : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns ["123", 0].\nfunction formatDecimalParts(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/exponent.js\n\n\n/* harmony default export */ function exponent(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/precisionPrefix.js\n\n\n/* harmony default export */ function precisionPrefix(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/formatGroup.js\n/* harmony default export */ function formatGroup(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/formatNumerals.js\n/* harmony default export */ function formatNumerals(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/formatTrim.js\n// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\n/* harmony default export */ function formatTrim(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case ".": i0 = i1 = i; break;\n case "0": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/formatPrefixAuto.js\n\n\nvar prefixExponent;\n\n/* harmony default export */ function formatPrefixAuto(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + "";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join("0")\n : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)\n : "0." + new Array(1 - i).join("0") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/formatRounded.js\n\n\n/* harmony default export */ function formatRounded(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + "";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join("0");\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/formatTypes.js\n\n\n\n\n/* harmony default export */ const formatTypes = ({\n "%": function(x, p) { return (x * 100).toFixed(p); },\n "b": function(x) { return Math.round(x).toString(2); },\n "c": function(x) { return x + ""; },\n "d": formatDecimal,\n "e": function(x, p) { return x.toExponential(p); },\n "f": function(x, p) { return x.toFixed(p); },\n "g": function(x, p) { return x.toPrecision(p); },\n "o": function(x) { return Math.round(x).toString(8); },\n "p": function(x, p) { return formatRounded(x * 100, p); },\n "r": formatRounded,\n "s": formatPrefixAuto,\n "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },\n "x": function(x) { return Math.round(x).toString(16); }\n});\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/identity.js\n/* harmony default export */ function src_identity(x) {\n return x;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/locale.js\n\n\n\n\n\n\n\n\n\nvar locale_map = Array.prototype.map,\n prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];\n\n/* harmony default export */ function locale(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? src_identity : formatGroup(locale_map.call(locale.grouping, Number), locale.thousands + ""),\n currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "",\n currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "",\n decimal = locale.decimal === undefined ? "." : locale.decimal + "",\n numerals = locale.numerals === undefined ? src_identity : formatNumerals(locale_map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? "%" : locale.percent + "",\n minus = locale.minus === undefined ? "-" : locale.minus + "",\n nan = locale.nan === undefined ? "NaN" : locale.nan + "";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The "n" type is an alias for ",g".\n if (type === "n") comma = true, type = "g";\n\n // The "" type, and any invalid type, is an alias for ".12~g".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",\n suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : "";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === "c") {\n valueSuffix = formatType(value) + valueSuffix;\n value = "";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== "+") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;\n valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not "0", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : "";\n\n // If the fill character is "0", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case "<": value = valuePrefix + value + valueSuffix + padding; break;\n case "=": value = valuePrefix + padding + value + valueSuffix; break;\n case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + "";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/defaultLocale.js\n\n\nvar defaultLocale_locale;\nvar format;\nvar formatPrefix;\n\ndefaultLocale({\n decimal: ".",\n thousands: ",",\n grouping: [3],\n currency: ["$", ""],\n minus: "-"\n});\n\nfunction defaultLocale(definition) {\n defaultLocale_locale = locale(definition);\n format = defaultLocale_locale.format;\n formatPrefix = defaultLocale_locale.formatPrefix;\n return defaultLocale_locale;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/precisionRound.js\n\n\n/* harmony default export */ function precisionRound(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-format/src/precisionFixed.js\n\n\n/* harmony default export */ function precisionFixed(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/tickFormat.js\n\n\n\n/* harmony default export */ function tickFormat(domain, count, specifier) {\n var start = domain[0],\n stop = domain[domain.length - 1],\n step = ticks_tickStep(start, stop, count == null ? 10 : count),\n precision;\n specifier = formatSpecifier(specifier == null ? ",f" : specifier);\n switch (specifier.type) {\n case "s": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case "":\n case "e":\n case "g":\n case "p":\n case "r": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");\n break;\n }\n case "f":\n case "%": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;\n break;\n }\n }\n return format(specifier);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/linear.js\n\n\n\n\n\nfunction linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n return tickFormat(domain(), count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain(),\n i0 = 0,\n i1 = d.length - 1,\n start = d[i0],\n stop = d[i1],\n step;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n\n step = tickIncrement(start, stop, count);\n\n if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n step = tickIncrement(start, stop, count);\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n step = tickIncrement(start, stop, count);\n }\n\n if (step > 0) {\n d[i0] = Math.floor(start / step) * step;\n d[i1] = Math.ceil(stop / step) * step;\n domain(d);\n } else if (step < 0) {\n d[i0] = Math.ceil(start * step) / step;\n d[i1] = Math.floor(stop * step) / step;\n domain(d);\n }\n\n return scale;\n };\n\n return scale;\n}\n\nfunction linear_linear() {\n var scale = continuous(deinterpolateLinear, d3_interpolate_src_number);\n\n scale.copy = function() {\n return copy(scale, linear_linear());\n };\n\n return linearish(scale);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/identity.js\n\n\n\n\nfunction identity_identity() {\n var domain = [0, 1];\n\n function scale(x) {\n return +x;\n }\n\n scale.invert = scale;\n\n scale.domain = scale.range = function(_) {\n return arguments.length ? (domain = src_array_map.call(_, d3_scale_src_number), scale) : domain.slice();\n };\n\n scale.copy = function() {\n return identity_identity().domain(domain);\n };\n\n return linearish(scale);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/nice.js\n/* harmony default export */ function nice(domain, interval) {\n domain = domain.slice();\n\n var i0 = 0,\n i1 = domain.length - 1,\n x0 = domain[i0],\n x1 = domain[i1],\n t;\n\n if (x1 < x0) {\n t = i0, i0 = i1, i1 = t;\n t = x0, x0 = x1, x1 = t;\n }\n\n domain[i0] = interval.floor(x0);\n domain[i1] = interval.ceil(x1);\n return domain;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/log.js\n\n\n\n\n\n\nfunction deinterpolate(a, b) {\n return (b = Math.log(b / a))\n ? function(x) { return Math.log(x / a) / b; }\n : d3_scale_src_constant(b);\n}\n\nfunction reinterpolate(a, b) {\n return a < 0\n ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }\n : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };\n}\n\nfunction pow10(x) {\n return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;\n}\n\nfunction powp(base) {\n return base === 10 ? pow10\n : base === Math.E ? Math.exp\n : function(x) { return Math.pow(base, x); };\n}\n\nfunction logp(base) {\n return base === Math.E ? Math.log\n : base === 10 && Math.log10\n || base === 2 && Math.log2\n || (base = Math.log(base), function(x) { return Math.log(x) / base; });\n}\n\nfunction reflect(f) {\n return function(x) {\n return -f(-x);\n };\n}\n\nfunction log() {\n var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),\n domain = scale.domain,\n base = 10,\n logs = logp(10),\n pows = powp(10);\n\n function rescale() {\n logs = logp(base), pows = powp(base);\n if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);\n return scale;\n }\n\n scale.base = function(_) {\n return arguments.length ? (base = +_, rescale()) : base;\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain(_), rescale()) : domain();\n };\n\n scale.ticks = function(count) {\n var d = domain(),\n u = d[0],\n v = d[d.length - 1],\n r;\n\n if (r = v < u) i = u, u = v, v = i;\n\n var i = logs(u),\n j = logs(v),\n p,\n k,\n t,\n n = count == null ? 10 : +count,\n z = [];\n\n if (!(base % 1) && j - i < n) {\n i = Math.round(i) - 1, j = Math.round(j) + 1;\n if (u > 0) for (; i < j; ++i) {\n for (k = 1, p = pows(i); k < base; ++k) {\n t = p * k;\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n } else for (; i < j; ++i) {\n for (k = base - 1, p = pows(i); k >= 1; --k) {\n t = p * k;\n if (t < u) continue;\n if (t > v) break;\n z.push(t);\n }\n }\n } else {\n z = ticks(i, j, Math.min(j - i, n)).map(pows);\n }\n\n return r ? z.reverse() : z;\n };\n\n scale.tickFormat = function(count, specifier) {\n if (specifier == null) specifier = base === 10 ? ".0e" : ",";\n if (typeof specifier !== "function") specifier = format(specifier);\n if (count === Infinity) return specifier;\n if (count == null) count = 10;\n var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\n return function(d) {\n var i = d / pows(Math.round(logs(d)));\n if (i * base < base - 0.5) i *= base;\n return i <= k ? specifier(d) : "";\n };\n };\n\n scale.nice = function() {\n return domain(nice(domain(), {\n floor: function(x) { return pows(Math.floor(logs(x))); },\n ceil: function(x) { return pows(Math.ceil(logs(x))); }\n }));\n };\n\n scale.copy = function() {\n return copy(scale, log().base(base));\n };\n\n return scale;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/pow.js\n\n\n\n\nfunction raise(x, exponent) {\n return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n}\n\nfunction pow() {\n var exponent = 1,\n scale = continuous(deinterpolate, reinterpolate),\n domain = scale.domain;\n\n function deinterpolate(a, b) {\n return (b = raise(b, exponent) - (a = raise(a, exponent)))\n ? function(x) { return (raise(x, exponent) - a) / b; }\n : d3_scale_src_constant(b);\n }\n\n function reinterpolate(a, b) {\n b = raise(b, exponent) - (a = raise(a, exponent));\n return function(t) { return raise(a + b * t, 1 / exponent); };\n }\n\n scale.exponent = function(_) {\n return arguments.length ? (exponent = +_, domain(domain())) : exponent;\n };\n\n scale.copy = function() {\n return copy(scale, pow().exponent(exponent));\n };\n\n return linearish(scale);\n}\n\nfunction sqrt() {\n return pow().exponent(0.5);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/quantile.js\n\n\n\nfunction quantile_quantile() {\n var domain = [],\n range = [],\n thresholds = [];\n\n function rescale() {\n var i = 0, n = Math.max(1, range.length);\n thresholds = new Array(n - 1);\n while (++i < n) thresholds[i - 1] = src_quantile(domain, i / n);\n return scale;\n }\n\n function scale(x) {\n if (!isNaN(x = +x)) return range[src_bisect(thresholds, x)];\n }\n\n scale.invertExtent = function(y) {\n var i = range.indexOf(y);\n return i < 0 ? [NaN, NaN] : [\n i > 0 ? thresholds[i - 1] : domain[0],\n i < thresholds.length ? thresholds[i] : domain[domain.length - 1]\n ];\n };\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [];\n for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);\n domain.sort(src_ascending);\n return rescale();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = src_array_slice.call(_), rescale()) : range.slice();\n };\n\n scale.quantiles = function() {\n return thresholds.slice();\n };\n\n scale.copy = function() {\n return quantile_quantile()\n .domain(domain)\n .range(range);\n };\n\n return scale;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/quantize.js\n\n\n\n\nfunction quantize() {\n var x0 = 0,\n x1 = 1,\n n = 1,\n domain = [0.5],\n range = [0, 1];\n\n function scale(x) {\n if (x <= x) return range[src_bisect(domain, x, 0, n)];\n }\n\n function rescale() {\n var i = -1;\n domain = new Array(n);\n while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\n return scale;\n }\n\n scale.domain = function(_) {\n return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];\n };\n\n scale.range = function(_) {\n return arguments.length ? (n = (range = src_array_slice.call(_)).length - 1, rescale()) : range.slice();\n };\n\n scale.invertExtent = function(y) {\n var i = range.indexOf(y);\n return i < 0 ? [NaN, NaN]\n : i < 1 ? [x0, domain[0]]\n : i >= n ? [domain[n - 1], x1]\n : [domain[i - 1], domain[i]];\n };\n\n scale.copy = function() {\n return quantize()\n .domain([x0, x1])\n .range(range);\n };\n\n return linearish(scale);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/threshold.js\n\n\n\nfunction threshold() {\n var domain = [0.5],\n range = [0, 1],\n n = 1;\n\n function scale(x) {\n if (x <= x) return range[src_bisect(domain, x, 0, n)];\n }\n\n scale.domain = function(_) {\n return arguments.length ? (domain = src_array_slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = src_array_slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();\n };\n\n scale.invertExtent = function(y) {\n var i = range.indexOf(y);\n return [domain[i - 1], domain[i]];\n };\n\n scale.copy = function() {\n return threshold()\n .domain(domain)\n .range(range);\n };\n\n return scale;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/interval.js\nvar t0 = new Date,\n t1 = new Date;\n\nfunction newInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n }\n\n interval.floor = function(date) {\n return floori(date = new Date(+date)), date;\n };\n\n interval.ceil = function(date) {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = function(date) {\n var d0 = interval(date),\n d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = function(date, step) {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = function(start, stop, step) {\n var range = [], previous;\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = function(test) {\n return newInterval(function(date) {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, function(date, step) {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = function(start, end) {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = function(step) {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? function(d) { return field(d) % step === 0; }\n : function(d) { return interval.count(0, d) % step === 0; });\n };\n }\n\n return interval;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/year.js\n\n\nvar year = newInterval(function(date) {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setFullYear(date.getFullYear() + step);\n}, function(start, end) {\n return end.getFullYear() - start.getFullYear();\n}, function(date) {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\nyear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\n/* harmony default export */ const src_year = (year);\nvar years = year.range;\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/month.js\n\n\nvar month = newInterval(function(date) {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setMonth(date.getMonth() + step);\n}, function(start, end) {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function(date) {\n return date.getMonth();\n});\n\n/* harmony default export */ const src_month = (month);\nvar months = month.range;\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/duration.js\nvar durationSecond = 1e3;\nvar durationMinute = 6e4;\nvar durationHour = 36e5;\nvar durationDay = 864e5;\nvar durationWeek = 6048e5;\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/week.js\n\n\n\nfunction weekday(i) {\n return newInterval(function(date) {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setDate(date.getDate() + step * 7);\n }, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nvar sunday = weekday(0);\nvar monday = weekday(1);\nvar tuesday = weekday(2);\nvar wednesday = weekday(3);\nvar thursday = weekday(4);\nvar friday = weekday(5);\nvar saturday = weekday(6);\n\nvar sundays = sunday.range;\nvar mondays = monday.range;\nvar tuesdays = tuesday.range;\nvar wednesdays = wednesday.range;\nvar thursdays = thursday.range;\nvar fridays = friday.range;\nvar saturdays = saturday.range;\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/day.js\n\n\n\nvar day = newInterval(function(date) {\n date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setDate(date.getDate() + step);\n}, function(start, end) {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n}, function(date) {\n return date.getDate() - 1;\n});\n\n/* harmony default export */ const src_day = (day);\nvar days = day.range;\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/hour.js\n\n\n\nvar hour = newInterval(function(date) {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getHours();\n});\n\n/* harmony default export */ const src_hour = (hour);\nvar hours = hour.range;\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/minute.js\n\n\n\nvar minute = newInterval(function(date) {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getMinutes();\n});\n\n/* harmony default export */ const src_minute = (minute);\nvar minutes = minute.range;\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/second.js\n\n\n\nvar second = newInterval(function(date) {\n date.setTime(date - date.getMilliseconds());\n}, function(date, step) {\n date.setTime(+date + step * durationSecond);\n}, function(start, end) {\n return (end - start) / durationSecond;\n}, function(date) {\n return date.getUTCSeconds();\n});\n\n/* harmony default export */ const src_second = (second);\nvar seconds = second.range;\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/millisecond.js\n\n\nvar millisecond = newInterval(function() {\n // noop\n}, function(date, step) {\n date.setTime(+date + step);\n}, function(start, end) {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = function(k) {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return newInterval(function(date) {\n date.setTime(Math.floor(date / k) * k);\n }, function(date, step) {\n date.setTime(+date + step * k);\n }, function(start, end) {\n return (end - start) / k;\n });\n};\n\n/* harmony default export */ const src_millisecond = (millisecond);\nvar milliseconds = millisecond.range;\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/utcWeek.js\n\n\n\nfunction utcWeekday(i) {\n return newInterval(function(date) {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, function(start, end) {\n return (end - start) / durationWeek;\n });\n}\n\nvar utcSunday = utcWeekday(0);\nvar utcMonday = utcWeekday(1);\nvar utcTuesday = utcWeekday(2);\nvar utcWednesday = utcWeekday(3);\nvar utcThursday = utcWeekday(4);\nvar utcFriday = utcWeekday(5);\nvar utcSaturday = utcWeekday(6);\n\nvar utcSundays = utcSunday.range;\nvar utcMondays = utcMonday.range;\nvar utcTuesdays = utcTuesday.range;\nvar utcWednesdays = utcWednesday.range;\nvar utcThursdays = utcThursday.range;\nvar utcFridays = utcFriday.range;\nvar utcSaturdays = utcSaturday.range;\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/utcDay.js\n\n\n\nvar utcDay = newInterval(function(date) {\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCDate(date.getUTCDate() + step);\n}, function(start, end) {\n return (end - start) / durationDay;\n}, function(date) {\n return date.getUTCDate() - 1;\n});\n\n/* harmony default export */ const src_utcDay = (utcDay);\nvar utcDays = utcDay.range;\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/utcYear.js\n\n\nvar utcYear = newInterval(function(date) {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function(start, end) {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, function(date) {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = function(k) {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, function(date, step) {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\n/* harmony default export */ const src_utcYear = (utcYear);\nvar utcYears = utcYear.range;\n\n;// CONCATENATED MODULE: ./node_modules/d3-time-format/src/locale.js\n\n\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newDate(y, m, d) {\n return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};\n}\n\nfunction formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n\n var formats = {\n "a": formatShortWeekday,\n "A": formatWeekday,\n "b": formatShortMonth,\n "B": formatMonth,\n "c": null,\n "d": formatDayOfMonth,\n "e": formatDayOfMonth,\n "f": formatMicroseconds,\n "g": formatYearISO,\n "G": formatFullYearISO,\n "H": formatHour24,\n "I": formatHour12,\n "j": formatDayOfYear,\n "L": formatMilliseconds,\n "m": formatMonthNumber,\n "M": formatMinutes,\n "p": formatPeriod,\n "q": formatQuarter,\n "Q": formatUnixTimestamp,\n "s": formatUnixTimestampSeconds,\n "S": formatSeconds,\n "u": formatWeekdayNumberMonday,\n "U": formatWeekNumberSunday,\n "V": formatWeekNumberISO,\n "w": formatWeekdayNumberSunday,\n "W": formatWeekNumberMonday,\n "x": null,\n "X": null,\n "y": formatYear,\n "Y": formatFullYear,\n "Z": formatZone,\n "%": formatLiteralPercent\n };\n\n var utcFormats = {\n "a": formatUTCShortWeekday,\n "A": formatUTCWeekday,\n "b": formatUTCShortMonth,\n "B": formatUTCMonth,\n "c": null,\n "d": formatUTCDayOfMonth,\n "e": formatUTCDayOfMonth,\n "f": formatUTCMicroseconds,\n "g": formatUTCYearISO,\n "G": formatUTCFullYearISO,\n "H": formatUTCHour24,\n "I": formatUTCHour12,\n "j": formatUTCDayOfYear,\n "L": formatUTCMilliseconds,\n "m": formatUTCMonthNumber,\n "M": formatUTCMinutes,\n "p": formatUTCPeriod,\n "q": formatUTCQuarter,\n "Q": formatUnixTimestamp,\n "s": formatUnixTimestampSeconds,\n "S": formatUTCSeconds,\n "u": formatUTCWeekdayNumberMonday,\n "U": formatUTCWeekNumberSunday,\n "V": formatUTCWeekNumberISO,\n "w": formatUTCWeekdayNumberSunday,\n "W": formatUTCWeekNumberMonday,\n "x": null,\n "X": null,\n "y": formatUTCYear,\n "Y": formatUTCFullYear,\n "Z": formatUTCZone,\n "%": formatLiteralPercent\n };\n\n var parses = {\n "a": parseShortWeekday,\n "A": parseWeekday,\n "b": parseShortMonth,\n "B": parseMonth,\n "c": parseLocaleDateTime,\n "d": parseDayOfMonth,\n "e": parseDayOfMonth,\n "f": parseMicroseconds,\n "g": parseYear,\n "G": parseFullYear,\n "H": parseHour24,\n "I": parseHour24,\n "j": parseDayOfYear,\n "L": parseMilliseconds,\n "m": parseMonthNumber,\n "M": parseMinutes,\n "p": parsePeriod,\n "q": parseQuarter,\n "Q": parseUnixTimestamp,\n "s": parseUnixTimestampSeconds,\n "S": parseSeconds,\n "u": parseWeekdayNumberMonday,\n "U": parseWeekNumberSunday,\n "V": parseWeekNumberISO,\n "w": parseWeekdayNumberSunday,\n "W": parseWeekNumberMonday,\n "x": parseLocaleDate,\n "X": parseLocaleTime,\n "y": parseYear,\n "Y": parseFullYear,\n "Z": parseZone,\n "%": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n function newFormat(specifier, formats) {\n return function(date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n\n if (!(date instanceof Date)) date = new Date(+date);\n\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n else pad = c === "e" ? " " : "0";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n\n string.push(specifier.slice(j, i));\n return string.join("");\n };\n }\n\n function newParse(specifier, Z) {\n return function(string) {\n var d = newDate(1900, undefined, 1),\n i = parseSpecifier(d, specifier, string += "", 0),\n week, day;\n if (i != string.length) return null;\n\n // If a UNIX timestamp is specified, return it.\n if ("Q" in d) return new Date(d.Q);\n if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0));\n\n // If this is utcParse, never use the local timezone.\n if (Z && !("Z" in d)) d.Z = 0;\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if ("p" in d) d.H = d.H % 12 + d.p * 12;\n\n // If the month was not specified, inherit from the quarter.\n if (d.m === undefined) d.m = "q" in d ? d.q : 0;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if ("V" in d) {\n if (d.V < 1 || d.V > 53) return null;\n if (!("w" in d)) d.w = 1;\n if ("Z" in d) {\n week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n week = src_utcDay.offset(week, (d.V - 1) * 7);\n d.y = week.getUTCFullYear();\n d.m = week.getUTCMonth();\n d.d = week.getUTCDate() + (d.w + 6) % 7;\n } else {\n week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n week = day > 4 || day === 0 ? monday.ceil(week) : monday(week);\n week = src_day.offset(week, (d.V - 1) * 7);\n d.y = week.getFullYear();\n d.m = week.getMonth();\n d.d = week.getDate() + (d.w + 6) % 7;\n }\n } else if ("W" in d || "U" in d) {\n if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;\n day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n d.m = 0;\n d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if ("Z" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return localDate(d);\n };\n }\n\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n\n return j;\n }\n\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n }\n\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n\n function formatQuarter(d) {\n return 1 + ~~(d.getMonth() / 3);\n }\n\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n\n function formatUTCQuarter(d) {\n return 1 + ~~(d.getUTCMonth() / 3);\n }\n\n return {\n format: function(specifier) {\n var f = newFormat(specifier += "", formats);\n f.toString = function() { return specifier; };\n return f;\n },\n parse: function(specifier) {\n var p = newParse(specifier += "", false);\n p.toString = function() { return specifier; };\n return p;\n },\n utcFormat: function(specifier) {\n var f = newFormat(specifier += "", utcFormats);\n f.toString = function() { return specifier; };\n return f;\n },\n utcParse: function(specifier) {\n var p = newParse(specifier += "", true);\n p.toString = function() { return specifier; };\n return p;\n }\n };\n}\n\nvar pads = {"-": "", "_": " ", "0": "0"},\n numberRe = /^\\s*\\d+/, // note: ignores next directive\n percentRe = /^%/,\n requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n var sign = value < 0 ? "-" : "",\n string = (sign ? -value : value) + "",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n return s.replace(requoteRe, "\\\\$&");\n}\n\nfunction formatRe(names) {\n return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");\n}\n\nfunction formatLookup(names) {\n var map = {}, i = -1, n = names.length;\n while (++i < n) map[names[i].toLowerCase()] = i;\n return map;\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;\n}\n\nfunction parseQuarter(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 6));\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n return pad(1 + src_day.count(src_year(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n return formatMilliseconds(d, p) + "000";\n}\n\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n var day = d.getDay();\n return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n return pad(sunday.count(src_year(d) - 1, d), p, 2);\n}\n\nfunction dISO(d) {\n var day = d.getDay();\n return (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d);\n}\n\nfunction formatWeekNumberISO(d, p) {\n d = dISO(d);\n return pad(thursday.count(src_year(d), d) + (src_year(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n return pad(monday.count(src_year(d) - 1, d), p, 2);\n}\n\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatYearISO(d, p) {\n d = dISO(d);\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatFullYearISO(d, p) {\n var day = d.getDay();\n d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d);\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? "-" : (z *= -1, "+"))\n + pad(z / 60 | 0, "0", 2)\n + pad(z % 60, "0", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + src_utcDay.count(src_utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n return formatUTCMilliseconds(d, p) + "000";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n var dow = d.getUTCDay();\n return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(utcSunday.count(src_utcYear(d) - 1, d), p, 2);\n}\n\nfunction UTCdISO(d) {\n var day = d.getUTCDay();\n return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n d = UTCdISO(d);\n return pad(utcThursday.count(src_utcYear(d), d) + (src_utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(utcMonday.count(src_utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCYearISO(d, p) {\n d = UTCdISO(d);\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCFullYearISO(d, p) {\n var day = d.getUTCDay();\n d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n return "+0000";\n}\n\nfunction formatLiteralPercent() {\n return "%";\n}\n\nfunction formatUnixTimestamp(d) {\n return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n return Math.floor(+d / 1000);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-time-format/src/defaultLocale.js\n\n\nvar src_defaultLocale_locale;\nvar timeFormat;\nvar timeParse;\nvar utcFormat;\nvar utcParse;\n\ndefaultLocale_defaultLocale({\n dateTime: "%x, %X",\n date: "%-m/%-d/%Y",\n time: "%-I:%M:%S %p",\n periods: ["AM", "PM"],\n days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],\n shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],\n months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],\n shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]\n});\n\nfunction defaultLocale_defaultLocale(definition) {\n src_defaultLocale_locale = formatLocale(definition);\n timeFormat = src_defaultLocale_locale.format;\n timeParse = src_defaultLocale_locale.parse;\n utcFormat = src_defaultLocale_locale.utcFormat;\n utcParse = src_defaultLocale_locale.utcParse;\n return src_defaultLocale_locale;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/time.js\n\n\n\n\n\n\n\n\nvar time_durationSecond = 1000,\n time_durationMinute = time_durationSecond * 60,\n time_durationHour = time_durationMinute * 60,\n time_durationDay = time_durationHour * 24,\n time_durationWeek = time_durationDay * 7,\n durationMonth = time_durationDay * 30,\n durationYear = time_durationDay * 365;\n\nfunction time_date(t) {\n return new Date(t);\n}\n\nfunction time_number(t) {\n return t instanceof Date ? +t : +new Date(+t);\n}\n\nfunction calendar(year, month, week, day, hour, minute, second, millisecond, format) {\n var scale = continuous(deinterpolateLinear, d3_interpolate_src_number),\n invert = scale.invert,\n domain = scale.domain;\n\n var formatMillisecond = format(".%L"),\n formatSecond = format(":%S"),\n formatMinute = format("%I:%M"),\n formatHour = format("%I %p"),\n formatDay = format("%a %d"),\n formatWeek = format("%b %d"),\n formatMonth = format("%B"),\n formatYear = format("%Y");\n\n var tickIntervals = [\n [second, 1, time_durationSecond],\n [second, 5, 5 * time_durationSecond],\n [second, 15, 15 * time_durationSecond],\n [second, 30, 30 * time_durationSecond],\n [minute, 1, time_durationMinute],\n [minute, 5, 5 * time_durationMinute],\n [minute, 15, 15 * time_durationMinute],\n [minute, 30, 30 * time_durationMinute],\n [ hour, 1, time_durationHour ],\n [ hour, 3, 3 * time_durationHour ],\n [ hour, 6, 6 * time_durationHour ],\n [ hour, 12, 12 * time_durationHour ],\n [ day, 1, time_durationDay ],\n [ day, 2, 2 * time_durationDay ],\n [ week, 1, time_durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function tickFormat(date) {\n return (second(date) < date ? formatMillisecond\n : minute(date) < date ? formatSecond\n : hour(date) < date ? formatMinute\n : day(date) < date ? formatHour\n : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n : year(date) < date ? formatMonth\n : formatYear)(date);\n }\n\n function tickInterval(interval, start, stop, step) {\n if (interval == null) interval = 10;\n\n // If a desired tick count is specified, pick a reasonable tick interval\n // based on the extent of the domain and a rough estimate of tick size.\n // Otherwise, assume interval is already a time interval and use it.\n if (typeof interval === "number") {\n var target = Math.abs(stop - start) / interval,\n i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);\n if (i === tickIntervals.length) {\n step = ticks_tickStep(start / durationYear, stop / durationYear, interval);\n interval = year;\n } else if (i) {\n i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n step = i[1];\n interval = i[0];\n } else {\n step = Math.max(ticks_tickStep(start, stop, interval), 1);\n interval = millisecond;\n }\n }\n\n return step == null ? interval : interval.every(step);\n }\n\n scale.invert = function(y) {\n return new Date(invert(y));\n };\n\n scale.domain = function(_) {\n return arguments.length ? domain(src_array_map.call(_, time_number)) : domain().map(time_date);\n };\n\n scale.ticks = function(interval, step) {\n var d = domain(),\n t0 = d[0],\n t1 = d[d.length - 1],\n r = t1 < t0,\n t;\n if (r) t = t0, t0 = t1, t1 = t;\n t = tickInterval(interval, t0, t1, step);\n t = t ? t.range(t0, t1 + 1) : []; // inclusive stop\n return r ? t.reverse() : t;\n };\n\n scale.tickFormat = function(count, specifier) {\n return specifier == null ? tickFormat : format(specifier);\n };\n\n scale.nice = function(interval, step) {\n var d = domain();\n return (interval = tickInterval(interval, d[0], d[d.length - 1], step))\n ? domain(nice(d, interval))\n : scale;\n };\n\n scale.copy = function() {\n return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));\n };\n\n return scale;\n}\n\n/* harmony default export */ function time() {\n return calendar(src_year, src_month, sunday, src_day, src_hour, src_minute, src_second, src_millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/utcMonth.js\n\n\nvar utcMonth = newInterval(function(date) {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, function(start, end) {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, function(date) {\n return date.getUTCMonth();\n});\n\n/* harmony default export */ const src_utcMonth = (utcMonth);\nvar utcMonths = utcMonth.range;\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/utcHour.js\n\n\n\nvar utcHour = newInterval(function(date) {\n date.setUTCMinutes(0, 0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationHour);\n}, function(start, end) {\n return (end - start) / durationHour;\n}, function(date) {\n return date.getUTCHours();\n});\n\n/* harmony default export */ const src_utcHour = (utcHour);\nvar utcHours = utcHour.range;\n\n;// CONCATENATED MODULE: ./node_modules/d3-time/src/utcMinute.js\n\n\n\nvar utcMinute = newInterval(function(date) {\n date.setUTCSeconds(0, 0);\n}, function(date, step) {\n date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n return (end - start) / durationMinute;\n}, function(date) {\n return date.getUTCMinutes();\n});\n\n/* harmony default export */ const src_utcMinute = (utcMinute);\nvar utcMinutes = utcMinute.range;\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/utcTime.js\n\n\n\n\n/* harmony default export */ function utcTime() {\n return calendar(src_utcYear, src_utcMonth, utcSunday, src_utcDay, src_utcHour, src_utcMinute, src_second, src_millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/colors.js\n/* harmony default export */ function colors(s) {\n return s.match(/.{6}/g).map(function(x) {\n return "#" + x;\n });\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/category10.js\n\n\n/* harmony default export */ const category10 = (colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"));\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/category20b.js\n\n\n/* harmony default export */ const category20b = (colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6"));\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/category20c.js\n\n\n/* harmony default export */ const category20c = (colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9"));\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/category20.js\n\n\n/* harmony default export */ const category20 = (colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5"));\n\n;// CONCATENATED MODULE: ./node_modules/d3-color/src/math.js\nvar deg2rad = Math.PI / 180;\nvar rad2deg = 180 / Math.PI;\n\n;// CONCATENATED MODULE: ./node_modules/d3-color/src/cubehelix.js\n\n\n\n\nvar A = -0.14861,\n B = +1.78277,\n C = -0.29227,\n D = -0.90649,\n E = +1.97294,\n ED = E * D,\n EB = E * B,\n BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n bl = b - l,\n k = (E * (g - l) - C * bl) / D,\n s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;\n return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nfunction cubehelix_cubehelix(h, s, l, opacity) {\n return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Cubehelix(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\nsrc_define(Cubehelix, cubehelix_cubehelix, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,\n l = +this.l,\n a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n cosh = Math.cos(h),\n sinh = Math.sin(h);\n return new Rgb(\n 255 * (l + a * (A * cosh + B * sinh)),\n 255 * (l + a * (C * cosh + D * sinh)),\n 255 * (l + a * (E * cosh)),\n this.opacity\n );\n }\n}));\n\n;// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/cubehelix.js\n\n\n\nfunction cubehelix(hue) {\n return (function cubehelixGamma(y) {\n y = +y;\n\n function cubehelix(start, end) {\n var h = hue((start = cubehelix_cubehelix(start)).h, (end = cubehelix_cubehelix(end)).h),\n s = nogamma(start.s, end.s),\n l = nogamma(start.l, end.l),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(Math.pow(t, y));\n start.opacity = opacity(t);\n return start + "";\n };\n }\n\n cubehelix.gamma = cubehelixGamma;\n\n return cubehelix;\n })(1);\n}\n\n/* harmony default export */ const src_cubehelix = (cubehelix(hue));\nvar cubehelixLong = cubehelix(nogamma);\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/cubehelix.js\n\n\n\n/* harmony default export */ const d3_scale_src_cubehelix = (cubehelixLong(cubehelix_cubehelix(300, 0.5, 0.0), cubehelix_cubehelix(-240, 0.5, 1.0)));\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/rainbow.js\n\n\n\nvar warm = cubehelixLong(cubehelix_cubehelix(-100, 0.75, 0.35), cubehelix_cubehelix(80, 1.50, 0.8));\n\nvar cool = cubehelixLong(cubehelix_cubehelix(260, 0.75, 0.35), cubehelix_cubehelix(80, 1.50, 0.8));\n\nvar rainbow = cubehelix_cubehelix();\n\n/* harmony default export */ function src_rainbow(t) {\n if (t < 0 || t > 1) t -= Math.floor(t);\n var ts = Math.abs(t - 0.5);\n rainbow.h = 360 * t - 100;\n rainbow.s = 1.5 - 1.5 * ts;\n rainbow.l = 0.8 - 0.9 * ts;\n return rainbow + "";\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/viridis.js\n\n\nfunction ramp(range) {\n var n = range.length;\n return function(t) {\n return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n };\n}\n\n/* harmony default export */ const viridis = (ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")));\n\nvar magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));\n\nvar inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));\n\nvar plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/src/sequential.js\n\n\nfunction sequential(interpolator) {\n var x0 = 0,\n x1 = 1,\n clamp = false;\n\n function scale(x) {\n var t = (x - x0) / (x1 - x0);\n return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);\n }\n\n scale.domain = function(_) {\n return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = !!_, scale) : clamp;\n };\n\n scale.interpolator = function(_) {\n return arguments.length ? (interpolator = _, scale) : interpolator;\n };\n\n scale.copy = function() {\n return sequential(interpolator).domain([x0, x1]).clamp(clamp);\n };\n\n return linearish(scale);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-scale/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/scale.js\n\n\n\n\n\n\nvar supportedScaleStrings = ["linear", "time", "log", "sqrt"]; // Private Functions\n\nfunction toNewName(scale) {\n // d3 scale changed the naming scheme for scale from "linear" -> "scaleLinear" etc.\n var capitalize = function (s) {\n return s && s[0].toUpperCase() + s.slice(1);\n };\n\n return "scale".concat(capitalize(scale));\n}\n\nfunction validScale(scale) {\n if (typeof scale === "function") {\n return isFunction_default()(scale.copy) && isFunction_default()(scale.domain) && isFunction_default()(scale.range);\n } else if (typeof scale === "string") {\n return includes_default()(supportedScaleStrings, scale);\n }\n\n return false;\n}\n\nfunction isScaleDefined(props, axis) {\n if (!props.scale) {\n return false;\n } else if (props.scale.x || props.scale.y) {\n return props.scale[axis] ? true : false;\n }\n\n return true;\n}\n\nfunction getScaleTypeFromProps(props, axis) {\n if (!isScaleDefined(props, axis)) {\n return undefined;\n }\n\n var scale = props.scale[axis] || props.scale;\n return typeof scale === "string" ? scale : getType(scale);\n}\n\nfunction getScaleFromDomain(props, axis) {\n var domain;\n\n if (props.domain && props.domain[axis]) {\n domain = props.domain[axis];\n } else if (props.domain && Array.isArray(props.domain)) {\n domain = props.domain;\n }\n\n if (!domain) {\n return undefined;\n }\n\n return containsDates(domain) ? "time" : "linear";\n}\n\nfunction getScaleTypeFromData(props, axis) {\n if (!props.data) {\n return "linear";\n }\n\n var accessor = helpers_createAccessor(props[axis]);\n var axisData = props.data.map(function (datum) {\n var processedData = isPlainObject_default()(accessor(datum)) ? accessor(datum)[axis] : accessor(datum);\n return processedData !== undefined ? processedData : datum[axis];\n });\n return containsDates(axisData) ? "time" : "linear";\n} // Exported Functions\n\n\nfunction getScaleFromName(name) {\n return validScale(name) ? d3_scale_namespaceObject[toNewName(name)]() : linear_linear();\n}\nfunction getBaseScale(props, axis) {\n var scale = getScaleFromProps(props, axis);\n\n if (scale) {\n return typeof scale === "string" ? getScaleFromName(scale) : scale;\n }\n\n var defaultScale = getScaleFromDomain(props, axis) || getScaleTypeFromData(props, axis);\n return d3_scale_namespaceObject[toNewName(defaultScale)]();\n}\nfunction getDefaultScale() {\n return d3Scale.scaleLinear();\n}\nfunction getScaleFromProps(props, axis) {\n if (!isScaleDefined(props, axis)) {\n return undefined;\n }\n\n var scale = props.scale[axis] || props.scale;\n\n if (validScale(scale)) {\n return isFunction_default()(scale) ? scale : d3_scale_namespaceObject[toNewName(scale)]();\n }\n\n return undefined;\n}\nfunction getScaleType(props, axis) {\n // if the scale was not given in props, it will be set to linear or time depending on data\n return getScaleTypeFromProps(props, axis) || getScaleTypeFromData(props, axis);\n}\nfunction getType(scale) {\n if (typeof scale === "string") {\n return scale;\n }\n\n var duckTypes = [{\n name: "log",\n method: "base"\n }, {\n name: "ordinal",\n method: "unknown"\n }, {\n name: "pow-sqrt",\n method: "exponent"\n }, {\n name: "quantile",\n method: "quantiles"\n }, {\n name: "quantize-threshold",\n method: "invertExtent"\n }];\n var scaleType = duckTypes.filter(function (type) {\n return scale[type.method] !== undefined;\n })[0];\n return scaleType ? scaleType.name : undefined;\n}\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/immutable.js\n/* eslint-disable func-style */\nvar IMMUTABLE_ITERABLE = "@@__IMMUTABLE_ITERABLE__@@";\nvar IMMUTABLE_RECORD = "@@__IMMUTABLE_RECORD__@@";\nvar IMMUTABLE_LIST = "@@__IMMUTABLE_LIST__@@";\nvar IMMUTABLE_MAP = "@@__IMMUTABLE_MAP__@@";\nfunction isIterable(x) {\n return !!(x && x[IMMUTABLE_ITERABLE]);\n}\nfunction isRecord(x) {\n return !!(x && x[IMMUTABLE_RECORD]);\n}\nfunction isImmutable(x) {\n return isIterable(x) || isRecord(x);\n}\nfunction isList(x) {\n return !!(x && x[IMMUTABLE_LIST]);\n}\nfunction isMap(x) {\n return !!(x && x[IMMUTABLE_MAP]);\n}\nfunction shallowToJS(x, whitelist) {\n return isIterable(x) ? x.reduce(function (prev, curr, key) {\n if (whitelist && whitelist[key]) {\n curr = shallowToJS(curr);\n }\n\n prev[key] = curr;\n return prev;\n }, isList(x) ? [] : {}) : x;\n}\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/data.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction data_toConsumableArray(arr) { return data_arrayWithoutHoles(arr) || data_iterableToArray(arr) || data_nonIterableSpread(); }\n\nfunction data_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction data_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction data_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\n/* eslint-disable func-style */\n\n/* eslint-disable no-use-before-define */\n\n\n\n\n // Private Functions\n\nfunction parseDatum(datum) {\n var immutableDatumWhitelist = {\n errorX: true,\n errorY: true\n };\n return isImmutable(datum) ? shallowToJS(datum, immutableDatumWhitelist) : datum;\n}\n\nfunction getLength(data) {\n return isIterable(data) ? data.size : data.length;\n} // Returns generated data for a given axis based on domain and sample from props\n\n\nfunction generateDataArray(props, axis) {\n var propsDomain = isPlainObject_default()(props.domain) ? props.domain[axis] : props.domain;\n var domain = propsDomain || getBaseScale(props, axis).domain();\n var samples = props.samples || 1;\n var domainMax = Math.max.apply(Math, data_toConsumableArray(domain));\n var domainMin = Math.min.apply(Math, data_toConsumableArray(domain));\n var step = (domainMax - domainMin) / samples;\n\n var values = range_default()(domainMin, domainMax, step);\n\n return last_default()(values) === domainMax ? values : values.concat(domainMax);\n} // Returns sorted data. If no sort keys are provided, data is returned unaltered.\n\n\nfunction sortData(dataset, sortKey) {\n var sortOrder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "ascending";\n\n if (!sortKey) {\n return dataset;\n } // Ensures previous VictoryLine api for sortKey prop stays consistent\n\n\n if (sortKey === "x" || sortKey === "y") {\n sortKey = "_".concat(sortKey);\n }\n\n var order = sortOrder === "ascending" ? "asc" : "desc";\n return orderBy_default()(dataset, sortKey, order);\n} // This method will remove data points that break certain scales. (log scale only)\n\n\nfunction cleanData(dataset, props) {\n var smallNumber = 1 / Number.MAX_SAFE_INTEGER;\n var scaleType = {\n x: getScaleType(props, "x"),\n y: getScaleType(props, "y")\n };\n\n if (scaleType.x !== "log" && scaleType.y !== "log") {\n return dataset;\n }\n\n var rules = function (datum, axis) {\n return scaleType[axis] === "log" ? datum["_".concat(axis)] !== 0 : true;\n };\n\n var sanitize = function (datum) {\n var _x = rules(datum, "x") ? datum._x : smallNumber;\n\n var _y = rules(datum, "y") ? datum._y : smallNumber;\n\n var _y0 = rules(datum, "y0") ? datum._y0 : smallNumber;\n\n return assign_default()({}, datum, {\n _x: _x,\n _y: _y,\n _y0: _y0\n });\n };\n\n return dataset.map(function (datum) {\n if (rules(datum, "x") && rules(datum, "y") && rules(datum, "y0")) {\n return datum;\n }\n\n return sanitize(datum);\n });\n} // Returns a data accessor given an eventKey prop\n\n\nfunction getEventKey(key) {\n // creates a data accessor function\n // given a property key, path, array index, or null for identity.\n if (isFunction_default()(key)) {\n return key;\n } else if (key === null || key === undefined) {\n return function () {\n return undefined;\n };\n } // otherwise, assume it is an array index, property key or path (_.property handles all three)\n\n\n return property_default()(key);\n} // Returns data with an eventKey prop added to each datum\n\n\nfunction addEventKeys(props, data) {\n var hasEventKeyAccessor = !!props.eventKey;\n var eventKeyAccessor = getEventKey(props.eventKey);\n return data.map(function (datum, index) {\n if (datum.eventKey !== undefined) {\n return datum;\n } else if (hasEventKeyAccessor) {\n var eventKey = eventKeyAccessor(datum, index);\n return eventKey !== undefined ? assign_default()({\n eventKey: eventKey\n }, datum) : datum;\n } else {\n return datum;\n }\n });\n} // Exported Functions\n// This method will remove data points that fall outside of the desired domain (non-continuous charts only)\n\n\nfunction formatDataFromDomain(dataset, domain, defaultBaseline) {\n var exists = function (val) {\n return val !== undefined;\n };\n\n var minDomainX = getMinValue(domain.x);\n var maxDomainX = getMaxValue(domain.x);\n var minDomainY = getMinValue(domain.y);\n var maxDomainY = getMaxValue(domain.y);\n\n var underMin = function (min) {\n return function (val) {\n return exists(val) && val < min;\n };\n };\n\n var overMax = function (max) {\n return function (val) {\n return exists(val) && val > max;\n };\n };\n\n var isUnderMinX = underMin(minDomainX);\n var isUnderMinY = underMin(minDomainY);\n var isOverMaxX = overMax(maxDomainX);\n var isOverMaxY = overMax(maxDomainY); // eslint-disable-next-line complexity\n\n return dataset.map(function (datum) {\n var _x = datum._x,\n _y = datum._y,\n _y0 = datum._y0,\n _y1 = datum._y1; // single x point less than min domain\n\n if (isUnderMinX(_x) || isOverMaxX(_x)) _x = null;\n var baseline = exists(_y0) ? _y0 : defaultBaseline;\n var value = exists(_y1) ? _y1 : _y;\n if (!exists(value)) return datum; // value only and less than min domain or greater than max domain\n\n if (!exists(baseline) && (isUnderMinY(value) || isOverMaxY(value))) _y = null; // baseline and value are both less than min domain or both greater than max domain\n\n if (isUnderMinY(baseline) && isUnderMinY(value) || isOverMaxY(baseline) && isOverMaxY(value)) _y = _y0 = _y1 = null; // baseline and value with only baseline below min, set baseline to minDomainY\n\n if (isUnderMinY(baseline) && !isUnderMinY(value)) _y0 = minDomainY; // baseline and value with only baseline above max, set baseline to maxDomainY\n\n if (isOverMaxY(baseline) && !isOverMaxY(value)) _y0 = maxDomainY;\n return assign_default()({}, datum, omitBy_default()({\n _x: _x,\n _y: _y,\n _y0: _y0,\n _y1: _y1\n }, (isUndefined_default())));\n });\n}\n/**\n * Returns an object mapping string data to numeric data\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Object} an object mapping string data to numeric data\n */\n\nfunction createStringMap(props, axis) {\n var stringsFromAxes = getStringsFromAxes(props, axis);\n var stringsFromCategories = getStringsFromCategories(props, axis);\n var stringsFromData = getStringsFromData(props, axis);\n\n var allStrings = uniq_default()(data_toConsumableArray(stringsFromAxes).concat(data_toConsumableArray(stringsFromCategories), data_toConsumableArray(stringsFromData)));\n\n return allStrings.length === 0 ? null : allStrings.reduce(function (memo, string, index) {\n memo[string] = index + 1;\n return memo;\n }, {});\n}\n/**\n * Reduces the size of a data array, such that it is <= maxPoints.\n * @param {Array} data: an array of data; must be sorted\n * @param {Number} maxPoints: maximum number of data points to return\n * @param {Number} startingIndex: the index of the data[0] *in the entire dataset*; this function\n assumes `data` param is a subset of larger dataset that has been zoommed\n * @returns {Array} an array of data, a subset of data param\n */\n\nfunction data_downsample(data, maxPoints) {\n var startingIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n // ensures that the downampling of data while zooming looks good.\n var dataLength = getLength(data);\n\n if (dataLength > maxPoints) {\n // limit k to powers of 2, e.g. 64, 128, 256\n // so that the same points will be chosen reliably, reducing flicker on zoom\n var k = Math.pow(2, Math.ceil(Math.log2(dataLength / maxPoints)));\n return data.filter( // ensure modulo is always calculated from same reference: i + startingIndex\n function (d, i) {\n return (i + startingIndex) % k === 0;\n });\n }\n\n return data;\n}\n/**\n * Returns formatted data. Data accessors are applied, and string values are replaced.\n * @param {Array} dataset: the original domain\n * @param {Object} props: the props object\n * @param {Array} expectedKeys: an array of expected data keys\n * @returns {Array} the formatted data\n */\n\nfunction formatData(dataset, props, expectedKeys) {\n var isArrayOrIterable = Array.isArray(dataset) || isIterable(dataset);\n\n if (!isArrayOrIterable || getLength(dataset) < 1) {\n return [];\n }\n\n var defaultKeys = ["x", "y", "y0"];\n expectedKeys = Array.isArray(expectedKeys) ? expectedKeys : defaultKeys;\n\n var createAccessor = function (name) {\n return helpers_createAccessor(props[name] !== undefined ? props[name] : name);\n };\n\n var accessor = expectedKeys.reduce(function (memo, type) {\n memo[type] = createAccessor(type);\n return memo;\n }, {});\n var preformattedData = isEqual_default()(expectedKeys, defaultKeys) && props.x === "_x" && props.y === "_y" && props.y0 === "_y0";\n var stringMap;\n\n if (preformattedData === false) {\n // stringMap is not required if the data is preformatted\n stringMap = {\n x: expectedKeys.indexOf("x") !== -1 ? createStringMap(props, "x") : undefined,\n y: expectedKeys.indexOf("y") !== -1 ? createStringMap(props, "y") : undefined,\n y0: expectedKeys.indexOf("y0") !== -1 ? createStringMap(props, "y") : undefined\n };\n }\n\n var data = preformattedData ? dataset : dataset.reduce(function (dataArr, datum, index) {\n // eslint-disable-line complexity\n datum = parseDatum(datum);\n var fallbackValues = {\n x: index,\n y: datum\n };\n var processedValues = expectedKeys.reduce(function (memo, type) {\n var processedValue = accessor[type](datum);\n var value = processedValue !== undefined ? processedValue : fallbackValues[type];\n\n if (value !== undefined) {\n if (typeof value === "string" && stringMap[type]) {\n memo["".concat(type, "Name")] = value;\n memo["_".concat(type)] = stringMap[type][value];\n } else {\n memo["_".concat(type)] = value;\n }\n }\n\n return memo;\n }, {});\n\n var formattedDatum = assign_default()({}, processedValues, datum);\n\n if (!isEmpty_default()(formattedDatum)) {\n dataArr.push(formattedDatum);\n }\n\n return dataArr;\n }, []);\n var sortedData = sortData(data, props.sortKey, props.sortOrder);\n var cleanedData = cleanData(sortedData, props);\n return addEventKeys(props, cleanedData);\n}\n/**\n * Returns generated x and y data based on domain and sample from props\n * @param {Object} props: the props object\n * @returns {Array} an array of data\n */\n\nfunction generateData(props) {\n var xValues = generateDataArray(props, "x");\n var yValues = generateDataArray(props, "y");\n var values = xValues.map(function (x, i) {\n return {\n x: x,\n y: yValues[i]\n };\n });\n return values;\n}\n/**\n * Returns an array of categories for a given axis\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array} an array of categories\n */\n\nfunction getCategories(props, axis) {\n return props.categories && !Array.isArray(props.categories) ? props.categories[axis] : props.categories;\n}\n/**\n * Returns an array of formatted data\n * @param {Object} props: the props object\n * @returns {Array} an array of data\n */\n\nfunction data_getData(props) {\n return props.data ? formatData(props.data, props) : formatData(generateData(props), props);\n}\n/**\n * Returns an array of strings from axis tickValues for a given axis\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array} an array of strings\n */\n\nfunction getStringsFromAxes(props, axis) {\n var tickValues = props.tickValues,\n tickFormat = props.tickFormat;\n var tickValueArray;\n\n if (!tickValues || !Array.isArray(tickValues) && !tickValues[axis]) {\n tickValueArray = tickFormat && Array.isArray(tickFormat) ? tickFormat : [];\n } else {\n tickValueArray = tickValues[axis] || tickValues;\n }\n\n return tickValueArray.filter(function (val) {\n return typeof val === "string";\n });\n}\n/**\n * Returns an array of strings from categories for a given axis\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array} an array of strings\n */\n\nfunction getStringsFromCategories(props, axis) {\n if (!props.categories) {\n return [];\n }\n\n var categories = getCategories(props, axis);\n var categoryStrings = categories && categories.filter(function (val) {\n return typeof val === "string";\n });\n return categoryStrings ? removeUndefined(categoryStrings) : [];\n}\n/**\n * Returns an array of strings from data\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array} an array of strings\n */\n\nfunction getStringsFromData(props, axis) {\n var isArrayOrIterable = Array.isArray(props.data) || isIterable(props.data);\n\n if (!isArrayOrIterable) {\n return [];\n }\n\n var key = props[axis] === undefined ? axis : props[axis];\n var accessor = helpers_createAccessor(key); // support immutable data\n\n var data = props.data.reduce(function (memo, d) {\n memo.push(parseDatum(d));\n return memo;\n }, []);\n var sortedData = sortData(data, props.sortKey, props.sortOrder);\n var dataStrings = sortedData.reduce(function (dataArr, datum) {\n datum = parseDatum(datum);\n dataArr.push(accessor(datum));\n return dataArr;\n }, []).filter(function (datum) {\n return typeof datum === "string";\n }); // return a unique set of strings\n\n return dataStrings.reduce(function (prev, curr) {\n if (curr !== undefined && curr !== null && prev.indexOf(curr) === -1) {\n prev.push(curr);\n }\n\n return prev;\n }, []);\n}\n/**\n * Checks whether a given component can be used to calculate data\n * @param {Component} component: a React component instance\n * @returns {Boolean} Returns true if the given component has a role included in the whitelist\n */\n\nfunction data_isDataComponent(component) {\n var getRole = function (child) {\n return child && child.type ? child.type.role : "";\n };\n\n var role = getRole(component);\n\n if (role === "portal") {\n var children = react.Children.toArray(component.props.children);\n role = children.length ? getRole(children[0]) : "";\n }\n\n var whitelist = ["area", "bar", "boxplot", "candlestick", "errorbar", "group", "histogram", "line", "pie", "scatter", "stack", "voronoi"];\n return includes_default()(whitelist, role);\n}\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/domain.js\n\n\n\n\n\n\n\nfunction domain_toConsumableArray(arr) { return domain_arrayWithoutHoles(arr) || domain_iterableToArray(arr) || domain_nonIterableSpread(); }\n\nfunction domain_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction domain_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction domain_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\n/* eslint-disable func-style */\n\n/* eslint-disable no-use-before-define */\n\n\n\n\n // Private Methods\n\nfunction cleanDomain(domain, props, axis) {\n var scaleType = getScaleType(props, axis);\n\n if (scaleType !== "log") {\n return domain;\n }\n\n var rules = function (dom) {\n var almostZero = dom[0] < 0 || dom[1] < 0 ? -1 / Number.MAX_SAFE_INTEGER : 1 / Number.MAX_SAFE_INTEGER;\n var domainOne = dom[0] === 0 ? almostZero : dom[0];\n var domainTwo = dom[1] === 0 ? almostZero : dom[1];\n return [domainOne, domainTwo];\n };\n\n return rules(domain);\n}\n\nfunction getDomainPadding(props, axis) {\n var formatPadding = function (padding) {\n return Array.isArray(padding) ? {\n left: padding[0],\n right: padding[1]\n } : {\n left: padding,\n right: padding\n };\n };\n\n return isPlainObject_default()(props.domainPadding) ? formatPadding(props.domainPadding[axis]) : formatPadding(props.domainPadding);\n}\n\nfunction getFlatData(dataset, axis) {\n return flatten_default()(dataset).map(function (datum) {\n return datum["_".concat(axis)] && datum["_".concat(axis)][1] !== undefined ? datum["_".concat(axis)][1] : datum["_".concat(axis)];\n });\n}\n\nfunction getExtremeFromData(dataset, axis) {\n var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "min";\n\n var getExtreme = function (arr) {\n return type === "max" ? Math.max.apply(Math, domain_toConsumableArray(arr)) : Math.min.apply(Math, domain_toConsumableArray(arr));\n };\n\n var initialValue = type === "max" ? -Infinity : Infinity;\n var containsDate = false;\n\n var result = flatten_default()(dataset).reduce(function (memo, datum) {\n var current0 = datum["_".concat(axis, "0")] !== undefined ? datum["_".concat(axis, "0")] : datum["_".concat(axis)];\n var current1 = datum["_".concat(axis, "1")] !== undefined ? datum["_".concat(axis, "1")] : datum["_".concat(axis)];\n var current = getExtreme([current0, current1]);\n containsDate = containsDate || current0 instanceof Date || current1 instanceof Date;\n return getExtreme([memo, current]);\n }, initialValue);\n\n return containsDate ? new Date(result) : result;\n} //eslint-disable-next-line max-statements\n\n\nfunction padDomain(domain, props, axis) {\n if (!props.domainPadding) {\n return domain;\n }\n\n var minDomain = getMinFromProps(props, axis);\n var maxDomain = getMaxFromProps(props, axis);\n var padding = getDomainPadding(props, axis);\n\n if (!padding.left && !padding.right) {\n return domain;\n }\n\n var min = getMinValue(domain);\n var max = getMaxValue(domain);\n var currentAxis = getCurrentAxis(axis, props.horizontal);\n var range = getRange(props, currentAxis);\n var rangeExtent = Math.abs(range[0] - range[1]);\n var paddedRangeExtent = Math.max(rangeExtent - padding.left - padding.right, 1);\n var paddedDomainExtent = Math.abs(max.valueOf() - min.valueOf()) / paddedRangeExtent * rangeExtent;\n var simplePadding = {\n left: paddedDomainExtent * padding.left / rangeExtent,\n right: paddedDomainExtent * padding.right / rangeExtent\n };\n var paddedDomain = {\n min: min.valueOf() - simplePadding.left,\n max: max.valueOf() + simplePadding.right\n };\n var singleQuadrantDomainPadding = isPlainObject_default()(props.singleQuadrantDomainPadding) ? props.singleQuadrantDomainPadding[axis] : props.singleQuadrantDomainPadding;\n var addsQuadrants = min >= 0 && paddedDomain.min <= 0 || max <= 0 && paddedDomain.max >= 0;\n\n var adjust = function (val, type) {\n var coerce = type === "min" && min >= 0 && val <= 0 || type === "max" && max <= 0 && val >= 0;\n return coerce ? 0 : val;\n };\n\n if (addsQuadrants && singleQuadrantDomainPadding !== false) {\n // Naive initial padding calculation\n var initialPadding = {\n left: Math.abs(max - min) * padding.left / rangeExtent,\n right: Math.abs(max - min) * padding.right / rangeExtent\n }; // Adjust the domain by the initial padding\n\n var adjustedDomain = {\n min: adjust(min.valueOf() - initialPadding.left, "min"),\n max: adjust(max.valueOf() + initialPadding.right, "max")\n }; // re-calculate padding, taking the adjusted domain into account\n\n var finalPadding = {\n left: Math.abs(adjustedDomain.max - adjustedDomain.min) * padding.left / rangeExtent,\n right: Math.abs(adjustedDomain.max - adjustedDomain.min) * padding.right / rangeExtent\n }; // Adjust the domain by the final padding\n\n paddedDomain = {\n min: adjust(min.valueOf() - finalPadding.left, "min"),\n max: adjust(max.valueOf() + finalPadding.right, "max")\n };\n } // default to minDomain / maxDomain if they exist\n\n\n var finalDomain = {\n min: minDomain !== undefined ? minDomain : paddedDomain.min,\n max: maxDomain !== undefined ? maxDomain : paddedDomain.max\n };\n return min instanceof Date || max instanceof Date ? getDomainFromMinMax(new Date(finalDomain.min), new Date(finalDomain.max)) : getDomainFromMinMax(finalDomain.min, finalDomain.max);\n} // Public Methods\n\n/**\n * Returns a getDomain function\n * @param {Function} getDomainFromDataFunction: a function that takes props and axis and\n * returns a domain based on data\n * @param {Function} formatDomainFunction: a function that takes domain, props, and axis and\n * returns a formatted domain\n * @returns {Function} a function that takes props and axis and returns a formatted domain\n */\n\n\nfunction createDomainFunction(getDomainFromDataFunction, formatDomainFunction) {\n getDomainFromDataFunction = isFunction_default()(getDomainFromDataFunction) ? getDomainFromDataFunction : getDomainFromData;\n formatDomainFunction = isFunction_default()(formatDomainFunction) ? formatDomainFunction : formatDomain;\n return function (props, axis) {\n var propsDomain = getDomainFromProps(props, axis);\n\n if (propsDomain) {\n return formatDomainFunction(propsDomain, props, axis);\n }\n\n var categories = getCategories(props, axis);\n var domain = categories ? getDomainFromCategories(props, axis, categories) : getDomainFromDataFunction(props, axis);\n return domain ? formatDomainFunction(domain, props, axis) : undefined;\n };\n}\n/**\n * Returns a formatted domain.\n * @param {Array} domain: a domain in the form of a two element array\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array} a domain in the form of a two element array\n */\n\nfunction formatDomain(domain, props, axis) {\n return cleanDomain(padDomain(domain, props, axis), props, axis);\n}\n/**\n * Returns a domain for a given axis based on props, category, or data\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array} the domain for the given axis\n */\n\nfunction getDomain(props, axis) {\n return createDomainFunction()(props, axis);\n}\n/**\n * Returns a domain based on categories if they exist\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @param {Array} categories: an array of categories corresponding to a given axis\n * @returns {Array|undefined} returns a domain from categories or undefined\n */\n\nfunction getDomainFromCategories(props, axis, categories) {\n categories = categories || getCategories(props, axis);\n var polar = props.polar,\n _props$startAngle = props.startAngle,\n startAngle = _props$startAngle === void 0 ? 0 : _props$startAngle,\n _props$endAngle = props.endAngle,\n endAngle = _props$endAngle === void 0 ? 360 : _props$endAngle;\n\n if (!categories) {\n return undefined;\n }\n\n var minDomain = getMinFromProps(props, axis);\n var maxDomain = getMaxFromProps(props, axis);\n var stringArray = containsStrings(categories) ? getStringsFromCategories(props, axis) : [];\n var stringMap = stringArray.length === 0 ? null : stringArray.reduce(function (memo, string, index) {\n memo[string] = index + 1;\n return memo;\n }, {});\n var categoryValues = stringMap ? categories.map(function (value) {\n return stringMap[value];\n }) : categories;\n var min = minDomain !== undefined ? minDomain : getMinValue(categoryValues);\n var max = maxDomain !== undefined ? maxDomain : getMaxValue(categoryValues);\n var categoryDomain = getDomainFromMinMax(min, max);\n return polar && axis === "x" && Math.abs(startAngle - endAngle) === 360 ? getSymmetricDomain(categoryDomain, categoryValues) : categoryDomain;\n}\n/**\n * Returns a domain from a dataset for a given axis\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @param {Array} dataset: an array of data\n * @returns {Array} the domain based on data\n */\n\nfunction getDomainFromData(props, axis, dataset) {\n dataset = dataset || data_getData(props);\n var polar = props.polar,\n _props$startAngle2 = props.startAngle,\n startAngle = _props$startAngle2 === void 0 ? 0 : _props$startAngle2,\n _props$endAngle2 = props.endAngle,\n endAngle = _props$endAngle2 === void 0 ? 360 : _props$endAngle2;\n var minDomain = getMinFromProps(props, axis);\n var maxDomain = getMaxFromProps(props, axis);\n\n if (dataset.length < 1) {\n return minDomain !== undefined && maxDomain !== undefined ? getDomainFromMinMax(minDomain, maxDomain) : undefined;\n }\n\n var min = minDomain !== undefined ? minDomain : getExtremeFromData(dataset, axis, "min");\n var max = maxDomain !== undefined ? maxDomain : getExtremeFromData(dataset, axis, "max");\n var domain = getDomainFromMinMax(min, max);\n return polar && axis === "x" && Math.abs(startAngle - endAngle) === 360 ? getSymmetricDomain(domain, getFlatData(dataset, axis)) : domain;\n}\n/**\n * Returns a domain in the form of a two element array given a min and max value.\n * @param {Number|Date} min: the props object\n * @param {Number|Date} max: the current axis\n * @returns {Array} the minDomain based on props\n */\n\nfunction getDomainFromMinMax(min, max) {\n var getSinglePointDomain = function (val) {\n // d3-scale does not properly resolve very small differences.\n var verySmallNumber = // eslint-disable-next-line no-magic-numbers\n val === 0 ? 2 * Math.pow(10, -10) : Math.pow(10, -10);\n var verySmallDate = 1;\n var minVal = val instanceof Date ? new Date(+val - verySmallDate) : +val - verySmallNumber;\n var maxVal = val instanceof Date ? new Date(+val + verySmallDate) : +val + verySmallNumber;\n return val === 0 ? [0, maxVal] : [minVal, maxVal];\n };\n\n return +min === +max ? getSinglePointDomain(max) : [min, max];\n}\n/**\n * Returns a the domain for a given axis if domain is given in props\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array|undefined} the domain based on props\n */\n\nfunction getDomainFromProps(props, axis) {\n var minDomain = getMinFromProps(props, axis);\n var maxDomain = getMaxFromProps(props, axis);\n\n if (isPlainObject_default()(props.domain) && props.domain[axis]) {\n return props.domain[axis];\n } else if (Array.isArray(props.domain)) {\n return props.domain;\n } else if (minDomain !== undefined && maxDomain !== undefined) {\n return getDomainFromMinMax(minDomain, maxDomain);\n }\n\n return undefined;\n}\n/**\n * Returns a domain for a given axis. This method forces the domain to include\n * zero unless the domain is explicitly specified in props.\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array} the domain for the given axis\n */\n\nfunction getDomainWithZero(props, axis) {\n var propsDomain = getDomainFromProps(props, axis);\n\n if (propsDomain) {\n return propsDomain;\n }\n\n var dataset = data_getData(props);\n var y0Min = dataset.reduce(function (min, datum) {\n return datum._y0 < min ? datum._y0 : min;\n }, Infinity);\n\n var ensureZero = function (domain) {\n if (axis === "x") {\n return domain;\n }\n\n var defaultMin = y0Min !== Infinity ? y0Min : 0;\n var maxDomainProp = getMaxFromProps(props, axis);\n var minDomainProp = getMinFromProps(props, axis);\n var max = maxDomainProp !== undefined ? maxDomainProp : getMaxValue(domain, defaultMin);\n var min = minDomainProp !== undefined ? minDomainProp : getMinValue(domain, defaultMin);\n return getDomainFromMinMax(min, max);\n };\n\n var getDomainFunction = function () {\n return getDomainFromData(props, axis, dataset);\n };\n\n var formatDomainFunction = function (domain) {\n return formatDomain(ensureZero(domain), props, axis);\n };\n\n return createDomainFunction(getDomainFunction, formatDomainFunction)(props, axis);\n}\n/**\n * Returns the maxDomain from props if it exists\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Number|Date|undefined} the maxDomain based on props\n */\n\nfunction getMaxFromProps(props, axis) {\n if (isPlainObject_default()(props.maxDomain) && props.maxDomain[axis] !== undefined) {\n return props.maxDomain[axis];\n }\n\n return typeof props.maxDomain === "number" || isDate_default()(props.maxDomain) ? props.maxDomain : undefined;\n}\n/**\n * Returns the minDomain from props if it exists\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Number|Date|undefined} the minDomain based on props\n */\n\nfunction getMinFromProps(props, axis) {\n if (isPlainObject_default()(props.minDomain) && props.minDomain[axis] !== undefined) {\n return props.minDomain[axis];\n }\n\n return typeof props.minDomain === "number" || isDate_default()(props.minDomain) ? props.minDomain : undefined;\n}\n/**\n * Returns a symmetrically padded domain for polar charts\n * @param {Array} domain: the original domain\n * @param {Array} values: a flat array of values corresponding to either tickValues, or data values\n * for a given dimension i.e. only x values.\n * @returns {Array} the symmetric domain\n */\n\nfunction getSymmetricDomain(domain, values) {\n var processedData = sortedUniq_default()(values.sort(function (a, b) {\n return a - b;\n }));\n\n var step = processedData[1] - processedData[0];\n return [domain[0], domain[1] + step];\n}\n/**\n * Checks whether a given component can be used to calculate domain\n * @param {Component} component: a React component instance\n * @returns {Boolean} Returns true if the given component has a role included in the whitelist\n */\n\nfunction isDomainComponent(component) {\n var getRole = function (child) {\n return child && child.type ? child.type.role : "";\n };\n\n var role = getRole(component);\n\n if (role === "portal") {\n var children = react.Children.toArray(component.props.children);\n role = children.length ? getRole(children[0]) : "";\n }\n\n var whitelist = ["area", "axis", "bar", "boxplot", "candlestick", "errorbar", "group", "histogram", "line", "pie", "scatter", "stack", "voronoi"];\n return includes_default()(whitelist, role);\n}\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/axis.js\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction axis_toConsumableArray(arr) { return axis_arrayWithoutHoles(arr) || axis_iterableToArray(arr) || axis_nonIterableSpread(); }\n\nfunction axis_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction axis_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction axis_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\n/* eslint-disable func-style */\n\n\n\n\n/**\n * Returns the axis (x or y) of a particular axis component\n * @param {Object} props: the props object.\n * @param {Boolean} horizontal: true for horizontal charts\n * @returns {String} the dimension appropriate for the axis given its props\n */\n\nfunction getAxis(props) {\n var dependentAxis = props.dependentAxis;\n return dependentAxis ? "y" : "x";\n}\n/**\n * Returns all axis components that pass a given predicate\n * @param {Array} childComponents: an array of children\n * @param {Function} predicate: a predicate function that will be called with each\n * @returns {Array} all axis components that pass the given predicate or []\n */\n\nfunction findAxisComponents(childComponents, predicate) {\n predicate = predicate || (identity_default());\n\n var findAxes = function (children) {\n return children.reduce(function (memo, child) {\n if (child.type && child.type.role === "axis" && predicate(child)) {\n return memo.concat(child);\n } else if (child.props && child.props.children) {\n return memo.concat(findAxes(react.Children.toArray(child.props.children)));\n }\n\n return memo;\n }, []);\n };\n\n return findAxes(childComponents);\n}\n/**\n * Returns a single axis component of the desired axis type (x or y)\n * @param {Array} childComponents: an array of children\n * @param {String} axis: desired axis either "x" or "y".\n * @returns {ReactComponent} an axis component of the desired axis or undefined\n */\n\nfunction getAxisComponent(childComponents, axis) {\n var matchesAxis = function (component) {\n var type = component.type.getAxis(component.props);\n return type === axis;\n };\n\n return findAxisComponents(childComponents, matchesAxis)[0];\n}\n/**\n * Returns all axis components of the desired axis type (x or y) along with any\n * parent components excluding VictoryChart\n * @param {Array} childComponents: an optional array of children.\n * @param {String} type: desired axis either "dependent" or "independent".\n * @returns {ReactComponent} an axis component of the desired type or undefined\n */\n\nfunction getAxisComponentsWithParent(childComponents, type) {\n var matchesType = function (child) {\n return type === "dependent" ? child.props.dependentAxis : !child.props.dependentAxis;\n };\n\n var findComponents = function (children) {\n return children.reduce(function (memo, child) {\n if (child.type && child.type.role === "axis" && matchesType(child)) {\n return memo.concat(child);\n } else if (child.props && child.props.children) {\n var childAxis = findComponents(react.Children.toArray(child.props.children));\n return childAxis.length > 0 ? memo.concat(child) : memo;\n }\n\n return memo;\n }, []);\n };\n\n return findComponents(childComponents);\n}\nfunction getOrigin(domain) {\n var getSingleOrigin = function (d) {\n var domainMin = Math.min.apply(Math, axis_toConsumableArray(d));\n var domainMax = Math.max.apply(Math, axis_toConsumableArray(d));\n return domainMax < 0 ? domainMax : Math.max(0, domainMin);\n };\n\n return {\n x: containsDates(domain.x) ? new Date(Math.min.apply(Math, axis_toConsumableArray(domain.x))) : getSingleOrigin(domain.x),\n y: containsDates(domain.y) ? new Date(Math.min.apply(Math, axis_toConsumableArray(domain.y))) : getSingleOrigin(domain.y)\n };\n}\nfunction getOriginSign(origin, domain) {\n var getSign = function () {\n return origin <= 0 && Math.max.apply(Math, axis_toConsumableArray(domain)) <= 0 ? "negative" : "positive";\n };\n\n return containsDates(domain) ? "positive" : getSign();\n}\n/**\n * @param {Object} props: axis component props\n * @returns {Boolean} true when the axis is vertical\n */\n\nfunction axis_isVertical(props) {\n var orientation = props.orientation || (props.dependentAxis ? "left" : "bottom");\n var vertical = {\n top: false,\n bottom: false,\n left: true,\n right: true\n };\n return vertical[orientation];\n}\n/**\n * @param {Object} props: axis component props\n * @returns {Boolean} true when tickValues contain strings\n */\n\nfunction axis_stringTicks(props) {\n return props.tickValues !== undefined && containsStrings(props.tickValues);\n}\n\nfunction getDefaultTickFormat(props) {\n var tickValues = props.tickValues;\n var axis = getAxis(props);\n var stringMap = props.stringMap && props.stringMap[axis];\n var fallbackFormat = tickValues && !containsDates(tickValues) ? function (x) {\n return x;\n } : undefined;\n\n if (!stringMap) {\n return axis_stringTicks(props) ? function (x, index) {\n return tickValues[index];\n } : fallbackFormat;\n } else {\n var invertedStringMap = stringMap && invert_default()(stringMap);\n\n var tickValueArray = orderBy_default()(values_default()(stringMap), function (n) {\n return n;\n });\n\n var dataNames = tickValueArray.map(function (tick) {\n return invertedStringMap[tick];\n }); // string ticks should have one tick of padding at the beginning\n\n var dataTicks = [""].concat(axis_toConsumableArray(dataNames), [""]);\n return function (x) {\n return dataTicks[x];\n };\n }\n}\n\nfunction getStringTicks(props) {\n var axis = getAxis(props);\n var stringMap = props.stringMap && props.stringMap[axis];\n var categories = Array.isArray(props.categories) ? props.categories : props.categories && props.categories[axis];\n var ticksFromCategories = categories && containsOnlyStrings(categories) ? categories.map(function (tick) {\n return stringMap[tick];\n }) : undefined;\n\n var ticksFromStringMap = stringMap && values_default()(stringMap);\n\n return ticksFromCategories && ticksFromCategories.length !== 0 ? ticksFromCategories : ticksFromStringMap;\n}\n\nfunction getTickArray(props) {\n var tickValues = props.tickValues,\n tickFormat = props.tickFormat;\n var axis = getAxis(props);\n var stringMap = props.stringMap && props.stringMap[axis];\n\n var getTicksFromFormat = function () {\n if (!tickFormat || !Array.isArray(tickFormat)) {\n return undefined;\n }\n\n return containsStrings(tickFormat) ? tickFormat.map(function (t, i) {\n return i;\n }) : tickFormat;\n };\n\n var ticks = tickValues;\n\n if (stringMap) {\n ticks = getStringTicks(props);\n }\n\n if (tickValues && containsStrings(tickValues)) {\n ticks = stringMap ? tickValues.map(function (tick) {\n return stringMap[tick];\n }) : range_default()(1, tickValues.length + 1);\n }\n\n var tickArray = ticks ? uniq_default()(ticks) : getTicksFromFormat(props);\n\n var buildTickArray = function (arr) {\n var newTickArray = [];\n var domain = props.domain && props.domain[axis] || props.domain;\n\n if (arr) {\n arr.forEach(function (t, index) {\n if (Array.isArray(domain)) {\n if (t >= getMinValue(domain) && t <= getMaxValue(domain)) {\n newTickArray.push({\n value: t,\n index: index\n });\n }\n } else {\n newTickArray.push({\n value: t,\n index: index\n });\n }\n });\n return newTickArray;\n } else return undefined;\n };\n\n return Array.isArray(tickArray) && tickArray.length ? buildTickArray(tickArray) : undefined;\n}\n\nfunction getTickFormat(props, scale) {\n var tickFormat = props.tickFormat;\n var axis = getAxis(props);\n var stringMap = props.stringMap && props.stringMap[axis];\n\n if (!tickFormat) {\n var defaultTickFormat = getDefaultTickFormat(props);\n var scaleTickFormat = scale.tickFormat && isFunction_default()(scale.tickFormat) ? scale.tickFormat() : function (x) {\n return x;\n };\n return defaultTickFormat || scaleTickFormat;\n } else if (tickFormat && Array.isArray(tickFormat)) {\n var tickArray = getTickArray(props);\n var tickArrayIndices = tickArray ? tickArray.map(function (v) {\n return v.index;\n }) : undefined;\n var filteredTickFormat = tickFormat.filter(function (t, index) {\n return tickArrayIndices.includes(index);\n });\n return function (x, index) {\n return filteredTickFormat[index];\n };\n } else if (tickFormat && isFunction_default()(tickFormat)) {\n var applyStringTicks = function (tick, index, ticks) {\n var invertedStringMap = invert_default()(stringMap);\n\n var stringTickArray = ticks.map(function (t) {\n return invertedStringMap[t];\n });\n return props.tickFormat(invertedStringMap[tick], index, stringTickArray);\n };\n\n return stringMap ? applyStringTicks : tickFormat;\n } else {\n return function (x) {\n return x;\n };\n }\n}\n\nfunction downsampleTicks(ticks, tickCount) {\n if (!tickCount || !Array.isArray(ticks) || ticks.length <= tickCount) {\n return ticks;\n }\n\n var k = Math.floor(ticks.length / tickCount);\n return ticks.filter(function (d, i) {\n return i % k === 0;\n });\n}\n\nfunction getTicks(props, scale, filterZero) {\n var tickCount = props.tickCount;\n var tickArray = getTickArray(props);\n var tickValues = tickArray ? tickArray.map(function (v) {\n return v.value;\n }) : undefined;\n\n if (tickValues) {\n return downsampleTicks(tickValues, tickCount);\n } else if (scale.ticks && isFunction_default()(scale.ticks)) {\n // eslint-disable-next-line no-magic-numbers\n var defaultTickCount = tickCount || 5;\n var scaleTicks = scale.ticks(defaultTickCount);\n var scaledTickArray = Array.isArray(scaleTicks) && scaleTicks.length ? scaleTicks : scale.domain();\n var ticks = downsampleTicks(scaledTickArray, tickCount);\n\n if (filterZero) {\n var filteredTicks = includes_default()(ticks, 0) ? without_default()(ticks, 0) : ticks;\n return filteredTicks.length ? filteredTicks : ticks;\n }\n\n return ticks;\n }\n\n return scale.domain();\n}\n/**\n * Returns a domain based tickValues\n * @param {Object} props: the props object\n * @param {String} axis: either x or y\n * @returns {Array} returns a domain from tickValues\n */\n//eslint-disable-next-line max-statements\n\nfunction axis_getDomainFromData(props, axis) {\n var polar = props.polar,\n _props$startAngle = props.startAngle,\n startAngle = _props$startAngle === void 0 ? 0 : _props$startAngle,\n _props$endAngle = props.endAngle,\n endAngle = _props$endAngle === void 0 ? 360 : _props$endAngle;\n var tickArray = getTickArray(props);\n var tickValues = tickArray ? tickArray.map(function (v) {\n return v.value;\n }) : undefined;\n\n if (!Array.isArray(tickValues)) {\n return undefined;\n }\n\n var minDomain = getMinFromProps(props, axis);\n var maxDomain = getMaxFromProps(props, axis);\n var tickStrings = axis_stringTicks(props);\n var ticks = tickValues.map(function (value) {\n return +value;\n });\n var defaultMin = tickStrings ? 1 : getMinValue(ticks);\n var defaultMax = tickStrings ? tickValues.length : getMaxValue(ticks);\n var min = minDomain !== undefined ? minDomain : defaultMin;\n var max = maxDomain !== undefined ? maxDomain : defaultMax;\n var initialDomain = getDomainFromMinMax(min, max);\n var domain = polar && axis === "x" && Math.abs(startAngle - endAngle) === 360 ? getSymmetricDomain(initialDomain, ticks) : initialDomain;\n\n if (axis_isVertical(props) && !polar) {\n domain.reverse();\n }\n\n return domain;\n} // exposed for use by VictoryChart\n\n\nfunction axis_getDomain(props, axis) {\n var inherentAxis = getAxis(props);\n\n if (axis && axis !== inherentAxis) {\n return undefined;\n }\n\n return createDomainFunction(axis_getDomainFromData)(props, inherentAxis);\n}\nfunction getAxisValue(props, axis) {\n if (!props.axisValue) {\n return undefined;\n }\n\n var scaleAxis = axis === "x" ? "y" : "x";\n var scale = isObject_default()(props.scale) && isFunction_default()(props.scale[scaleAxis]) ? props.scale[scaleAxis] : undefined;\n\n if (!scale) {\n return undefined;\n }\n\n var stringMapAxis = axis === "x" ? "y" : "x";\n var stringMap = isObject_default()(props.stringMap) && props.stringMap[stringMapAxis];\n var axisValue = stringMap && typeof props.axisValue === "string" ? stringMap[props.axisValue] : props.axisValue;\n return scale(axisValue);\n}\nfunction axis_modifyProps(props, fallbackProps) {\n if (!isObject_default()(props.theme)) {\n return modifyProps(props, fallbackProps, "axis");\n }\n\n var role = "axis";\n\n if (props.dependentAxis && props.theme.dependentAxis) {\n role = "dependentAxis";\n } else if (!props.dependentAxis && props.theme.independentAxis) {\n role = "independentAxis";\n }\n\n if (role === "axis") {\n return modifyProps(props, fallbackProps, "axis");\n }\n\n var axisTheme = defaults_default()({}, props.theme[role], props.theme.axis);\n\n var theme = assign_default()({}, props.theme, {\n axis: axisTheme\n });\n\n return modifyProps(assign_default()({}, props, {\n theme: theme\n }), fallbackProps, "axis");\n}\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/style.js\n/* eslint-disable func-style */\n\n/**\n * Given an object with CSS/SVG transform definitions, return the string value\n * for use with the `transform` CSS property or SVG attribute. Note that we\n * can\'t always guarantee the order will match the author\'s intended order, so\n * authors should only use the object notation if they know that their transform\n * is commutative or that there is only one.\n * @param {Object} obj An object of transform definitions.\n * @returns {String} The generated transform string.\n */\nvar toTransformString = function (obj) {\n for (var _len = arguments.length, more = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n more[_key - 1] = arguments[_key];\n }\n\n if (more.length > 0) {\n return more.reduce(function (memo, currentObj) {\n return [memo, toTransformString(currentObj)].join(" ");\n }, toTransformString(obj)).trim();\n } else {\n if (obj === undefined || obj === null || typeof obj === "string") {\n return obj;\n }\n\n var transforms = [];\n\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n var value = obj[key];\n transforms.push("".concat(key, "(").concat(value, ")"));\n }\n }\n\n return transforms.join(" ").trim();\n }\n};\n/**\n * Given the name of a color scale, getColorScale will return an array\n * of 5 hex string values in that color scale. If no \'name\' parameter\n * is given, it will return the Victory default grayscale.\n * @param {String} name The name of the color scale to return (optional).\n * @returns {Array} An array of 5 hex string values composing a color scale.\n */\n\nfunction getColorScale(name) {\n var scales = {\n grayscale: ["#cccccc", "#969696", "#636363", "#252525"],\n qualitative: ["#334D5C", "#45B29D", "#EFC94C", "#E27A3F", "#DF5A49", "#4F7DA1", "#55DBC1", "#EFDA97", "#E2A37F", "#DF948A"],\n heatmap: ["#428517", "#77D200", "#D6D305", "#EC8E19", "#C92B05"],\n warm: ["#940031", "#C43343", "#DC5429", "#FF821D", "#FFAF55"],\n cool: ["#2746B9", "#0B69D4", "#2794DB", "#31BB76", "#60E83B"],\n red: ["#FCAE91", "#FB6A4A", "#DE2D26", "#A50F15", "#750B0E"],\n blue: ["#002C61", "#004B8F", "#006BC9", "#3795E5", "#65B4F4"],\n green: ["#354722", "#466631", "#649146", "#8AB25C", "#A9C97E"]\n };\n return name ? scales[name] : scales.grayscale;\n}\n// EXTERNAL MODULE: ./node_modules/lodash/pickBy.js\nvar pickBy = __webpack_require__(5937);\nvar pickBy_default = /*#__PURE__*/__webpack_require__.n(pickBy);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/events.js\n\n\n\n\n\n\n\n\n\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction events_toConsumableArray(arr) { return events_arrayWithoutHoles(arr) || events_iterableToArray(arr) || events_nonIterableSpread(); }\n\nfunction events_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction events_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction events_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nvar GLOBAL_EVENT_REGEX = /^onGlobal(.*)$/;\n/* Returns all own and shared events that should be attached to a single target element,\n * i.e. an individual bar specified by target: "data", eventKey: [index].\n * Returned events are scoped to the appropriate state. Either that of the component itself\n * (i.e. VictoryBar) in the case of own events, or that of the parent component\n * (i.e. VictoryChart) in the case of shared events\n */\n// eslint-disable-next-line max-params,no-shadow\n\nfunction getEvents(props, target, eventKey, getScopedEvents) {\n var _this = this;\n\n // Returns all events that apply to a particular target element\n var getEventsByTarget = function (events) {\n var getSelectedEvents = function () {\n var targetEvents = events.reduce(function (memo, event) {\n if (event.target !== undefined) {\n var matchesTarget = Array.isArray(event.target) ? includes_default()(event.target, target) : "".concat(event.target) === "".concat(target);\n return matchesTarget ? memo.concat(event) : memo;\n }\n\n return memo.concat(event);\n }, []);\n\n if (eventKey !== undefined && target !== "parent") {\n return targetEvents.filter(function (obj) {\n var targetKeys = obj.eventKey;\n\n var useKey = function (key) {\n return key ? "".concat(key) === "".concat(eventKey) : true;\n };\n\n return Array.isArray(targetKeys) ? targetKeys.some(function (k) {\n return useKey(k);\n }) : useKey(targetKeys);\n });\n }\n\n return targetEvents;\n };\n\n var selectedEvents = getSelectedEvents();\n return Array.isArray(selectedEvents) && selectedEvents.reduce(function (memo, event) {\n return event ? assign_default()(memo, event.eventHandlers) : memo;\n }, {});\n };\n /* Returns all events from props and defaultEvents from components. Events handlers\n * specified in props will override handlers for the same event if they are also\n * specified in defaultEvents of a sub-component\n */\n\n\n var getAllEvents = function () {\n // Mandatory usage: `getEvents.bind(this)`\n\n /* eslint-disable no-invalid-this */\n if (Array.isArray(_this.componentEvents)) {\n var _this$componentEvents;\n\n return Array.isArray(props.events) ? (_this$componentEvents = _this.componentEvents).concat.apply(_this$componentEvents, events_toConsumableArray(props.events)) : _this.componentEvents;\n }\n /* eslint-enable no-invalid-this */\n\n\n return props.events;\n };\n\n var allEvents = getAllEvents();\n var ownEvents = allEvents && isFunction_default()(getScopedEvents) ? getScopedEvents(getEventsByTarget(allEvents), target) : undefined;\n\n if (!props.sharedEvents) {\n return ownEvents;\n }\n\n var getSharedEvents = props.sharedEvents.getEvents;\n var sharedEvents = props.sharedEvents.events && getSharedEvents(getEventsByTarget(props.sharedEvents.events), target);\n return assign_default()({}, sharedEvents, ownEvents);\n}\n/* Returns a modified events object where each event handler is replaced by a new\n * function that calls the original handler and then calls setState with the return\n * of the original event handler assigned to state property that maps to the target\n * element.\n */\n// eslint-disable-next-line max-params\n\nfunction events_getScopedEvents(events, namespace, childType, baseProps) {\n var _this2 = this;\n\n if (isEmpty_default()(events)) {\n return {};\n } // Mandatory usage: `getScopedEvents.bind(this)`\n // eslint-disable-next-line no-invalid-this\n\n\n baseProps = baseProps || this.baseProps; // returns the original base props or base state of a given target element\n\n var getTargetProps = function (identifier, type) {\n var childName = identifier.childName,\n target = identifier.target,\n key = identifier.key; // eslint-disable-next-line no-invalid-this\n\n var baseType = type === "props" ? baseProps : _this2.state || {};\n var base = childName === undefined || childName === null || !baseType[childName] ? baseType : baseType[childName];\n return key === "parent" ? base.parent : base[key] && base[key][target];\n }; // Returns the state object with the mutation caused by a given eventReturn\n // applied to the appropriate property on the state object\n\n\n var parseEvent = function (eventReturn, eventKey) {\n var childNames = namespace === "parent" ? eventReturn.childName : eventReturn.childName || childType;\n var target = eventReturn.target || namespace; // returns all eventKeys to modify for a targeted childName\n\n var getKeys = function (childName) {\n if (target === "parent") {\n return "parent";\n }\n\n if (eventReturn.eventKey === "all") {\n return baseProps[childName] ? without_default()(keys_default()(baseProps[childName]), "parent") : without_default()(keys_default()(baseProps), "parent");\n } else if (eventReturn.eventKey === undefined && eventKey === "parent") {\n return baseProps[childName] ? keys_default()(baseProps[childName]) : keys_default()(baseProps);\n }\n\n return eventReturn.eventKey !== undefined ? eventReturn.eventKey : eventKey;\n }; // returns the state object with mutated props applied for a single key\n\n\n var getMutationObject = function (key, childName) {\n // eslint-disable-next-line no-invalid-this\n var baseState = _this2.state || {};\n\n if (!isFunction_default()(eventReturn.mutation)) {\n return baseState;\n }\n\n var mutationTargetProps = getTargetProps({\n childName: childName,\n key: key,\n target: target\n }, "props");\n var mutationTargetState = getTargetProps({\n childName: childName,\n key: key,\n target: target\n }, "state");\n var mutatedProps = eventReturn.mutation(assign_default()({}, mutationTargetProps, mutationTargetState), baseProps);\n var childState = baseState[childName] || {};\n\n var filterState = function (state) {\n if (state[key] && state[key][target]) {\n delete state[key][target];\n }\n\n if (state[key] && !keys_default()(state[key]).length) {\n delete state[key];\n }\n\n return state;\n };\n\n var extendState = function (state) {\n return target === "parent" ? assign_default()(state, _defineProperty({}, key, assign_default()(state[key], mutatedProps))) : assign_default()(state, _defineProperty({}, key, assign_default()(state[key], _defineProperty({}, target, mutatedProps))));\n };\n\n var updateState = function (state) {\n return mutatedProps ? extendState(state) : filterState(state);\n };\n\n return childName !== undefined && childName !== null ? assign_default()(baseState, _defineProperty({}, childName, updateState(childState))) : updateState(baseState);\n }; // returns entire mutated state for a given childName\n\n\n var getReturnByChild = function (childName) {\n var mutationKeys = getKeys(childName);\n return Array.isArray(mutationKeys) ? mutationKeys.reduce(function (memo, key) {\n return assign_default()(memo, getMutationObject(key, childName));\n }, {}) : getMutationObject(mutationKeys, childName);\n }; // returns an entire mutated state for all children\n\n\n var allChildNames = childNames === "all" ? without_default()(keys_default()(baseProps), "parent") : childNames;\n return Array.isArray(allChildNames) ? allChildNames.reduce(function (memo, childName) {\n return assign_default()(memo, getReturnByChild(childName));\n }, {}) : getReturnByChild(allChildNames);\n }; // Parses an array of event returns into a single state mutation\n\n\n var parseEventReturn = function (eventReturn, eventKey) {\n return Array.isArray(eventReturn) ? eventReturn.reduce(function (memo, props) {\n memo = assign_default()({}, memo, parseEvent(props, eventKey));\n return memo;\n }, {}) : parseEvent(eventReturn, eventKey);\n };\n\n var compileCallbacks = function (eventReturn) {\n var getCallback = function (obj) {\n return isFunction_default()(obj.callback) && obj.callback;\n };\n\n var callbacks = Array.isArray(eventReturn) ? eventReturn.map(function (evtObj) {\n return getCallback(evtObj);\n }) : [getCallback(eventReturn)];\n var callbackArray = callbacks.filter(function (callback) {\n return callback !== false;\n });\n return callbackArray.length ? function () {\n return callbackArray.forEach(function (callback) {\n return callback();\n });\n } : undefined;\n }; // A function that calls a particular event handler, parses its return\n // into a state mutation, and calls setState\n // eslint-disable-next-line max-params\n\n\n var onEvent = function (evt, childProps, eventKey, eventName) {\n // eslint-disable-next-line no-invalid-this\n var eventReturn = events[eventName](evt, childProps, eventKey, _this2);\n\n if (!isEmpty_default()(eventReturn)) {\n var callbacks = compileCallbacks(eventReturn); // eslint-disable-next-line no-invalid-this\n\n _this2.setState(parseEventReturn(eventReturn, eventKey), callbacks);\n }\n }; // returns a new events object with enhanced event handlers\n\n\n return keys_default()(events).reduce(function (memo, event) {\n memo[event] = onEvent;\n return memo;\n }, {});\n}\n/* Returns a partially applied event handler for a specific target element\n * This allows event handlers to have access to props controlling each element\n */\n\nfunction getPartialEvents(events, eventKey, childProps) {\n return events ? keys_default()(events).reduce(function (memo, eventName) {\n var appliedEvent = function (evt) {\n return events[eventName](evt, childProps, eventKey, eventName);\n };\n\n memo[eventName] = appliedEvent;\n return memo;\n }, {}) : {};\n}\n/* Returns the property of the state object corresponding to event changes for\n * a particular element\n */\n\nfunction getEventState(eventKey, namespace, childType) {\n // Mandatory usage: `getEventState.bind(this)`\n // eslint-disable-next-line no-invalid-this\n var state = this.state || {};\n\n if (!childType) {\n return eventKey === "parent" ? state[eventKey] && state[eventKey][namespace] || state[eventKey] : state[eventKey] && state[eventKey][namespace];\n }\n\n return state[childType] && state[childType][eventKey] && state[childType][eventKey][namespace];\n}\n/**\n * Returns a set of all mutations for shared events\n *\n * @param {Array} mutations an array of mutations objects\n * @param {Object} baseProps an object that describes all props for children of VictorySharedEvents\n * @param {Object} baseState an object that describes state for children of VictorySharedEvents\n * @param {Array} childNames an array of childNames\n *\n * @return {Object} a object describing all mutations for VictorySharedEvents\n */\n// eslint-disable-next-line max-params\n\nfunction getExternalMutationsWithChildren(mutations, baseProps, baseState, childNames) {\n baseProps = baseProps || {};\n baseState = baseState || {};\n return childNames.reduce(function (memo, childName) {\n var childState = baseState[childName];\n var mutation = events_getExternalMutations(mutations, baseProps[childName], baseState[childName], childName);\n memo[childName] = mutation ? mutation : childState;\n return pickBy_default()(memo, function (v) {\n return !isEmpty_default()(v);\n });\n }, {});\n}\n/**\n * Returns a set of all mutations for a component\n *\n * @param {Array} mutations an array of mutations objects\n * @param {Object} baseProps a props object (scoped to a childName when used by shared events)\n * @param {Object} baseState a state object (scoped to a childName when used by shared events)\n * @param {String} childName an optional childName\n *\n * @return {Object} a object describing mutations for a given component\n */\n// eslint-disable-next-line max-params\n\nfunction events_getExternalMutations(mutations, baseProps, baseState, childName) {\n baseProps = baseProps || {};\n baseState = baseState || {};\n\n var eventKeys = keys_default()(baseProps);\n\n return eventKeys.reduce(function (memo, eventKey) {\n var keyState = baseState[eventKey] || {};\n var keyProps = baseProps[eventKey] || {};\n\n if (eventKey === "parent") {\n var identifier = {\n eventKey: eventKey,\n target: "parent"\n };\n var mutation = getExternalMutation(mutations, keyProps, keyState, identifier);\n memo[eventKey] = mutation !== undefined ? assign_default()({}, keyState, mutation) : keyState;\n } else {\n // use keys from both state and props so that elements not intially included in baseProps\n // will be used. (i.e. labels)\n var targets = uniq_default()(keys_default()(keyProps).concat(keys_default()(keyState)));\n\n memo[eventKey] = targets.reduce(function (m, target) {\n var identifier = {\n eventKey: eventKey,\n target: target,\n childName: childName\n };\n var mutation = getExternalMutation(mutations, keyProps[target], keyState[target], identifier);\n m[target] = mutation !== undefined ? assign_default()({}, keyState[target], mutation) : keyState[target];\n return pickBy_default()(m, function (v) {\n return !isEmpty_default()(v);\n });\n }, {});\n }\n\n return pickBy_default()(memo, function (v) {\n return !isEmpty_default()(v);\n });\n }, {});\n}\n/**\n * Returns a set of mutations for a particular element given scoped baseProps and baseState\n *\n * @param {Array} mutations an array of mutations objects\n * @param {Object} baseProps a props object (scoped the element specified by the identifier)\n * @param {Object} baseState a state object (scoped the element specified by the identifier)\n * @param {Object} identifier { eventKey, target, childName }\n *\n * @return {Object | undefined} a object describing mutations for a given element, or undefined\n */\n// eslint-disable-next-line max-params\n\nfunction getExternalMutation(mutations, baseProps, baseState, identifier) {\n var filterMutations = function (mutation, type) {\n if (typeof mutation[type] === "string") {\n return mutation[type] === "all" || mutation[type] === identifier[type];\n } else if (Array.isArray(mutation[type])) {\n // coerce arrays to strings before matching\n var stringArray = mutation[type].map(function (m) {\n return "".concat(m);\n });\n return includes_default()(stringArray, identifier[type]);\n } else {\n return false;\n }\n };\n\n mutations = Array.isArray(mutations) ? mutations : [mutations];\n var scopedMutations = mutations;\n\n if (identifier.childName) {\n scopedMutations = mutations.filter(function (m) {\n return filterMutations(m, "childName");\n });\n } // find any mutation objects that match the target\n\n\n var targetMutations = scopedMutations.filter(function (m) {\n return filterMutations(m, "target");\n });\n\n if (isEmpty_default()(targetMutations)) {\n return undefined;\n }\n\n var keyMutations = targetMutations.filter(function (m) {\n return filterMutations(m, "eventKey");\n });\n\n if (isEmpty_default()(keyMutations)) {\n return undefined;\n }\n\n return keyMutations.reduce(function (memo, curr) {\n var mutationFunction = curr && isFunction_default()(curr.mutation) ? curr.mutation : function () {\n return undefined;\n };\n var currentMutation = mutationFunction(assign_default()({}, baseProps, baseState));\n return assign_default()({}, memo, currentMutation);\n }, {});\n}\n/* Returns an array of defaultEvents from sub-components of a given component.\n * i.e. any static `defaultEvents` on `labelComponent` will be returned\n */\n\nfunction getComponentEvents(props, components) {\n var events = Array.isArray(components) && components.reduce(function (memo, componentName) {\n var _memo;\n\n var component = props[componentName];\n var defaultEvents = component && component.type && component.type.defaultEvents;\n var componentEvents = isFunction_default()(defaultEvents) ? defaultEvents(component.props) : defaultEvents;\n memo = Array.isArray(componentEvents) ? (_memo = memo).concat.apply(_memo, events_toConsumableArray(componentEvents)) : memo;\n return memo;\n }, []);\n return events && events.length ? events : undefined;\n}\nfunction getGlobalEventNameFromKey(key) {\n var match = key.match(GLOBAL_EVENT_REGEX);\n return match && match[1] && match[1].toLowerCase();\n}\nvar getGlobalEvents = function (events) {\n return pickBy_default()(events, function (_, key) {\n return GLOBAL_EVENT_REGEX.test(key);\n });\n};\nvar omitGlobalEvents = function (events) {\n return omitBy_default()(events, function (_, key) {\n return GLOBAL_EVENT_REGEX.test(key);\n });\n};\nvar emulateReactEvent = function (event) {\n return assign_default()(event, {\n nativeEvent: event\n });\n};\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/log.js\n/* global console */\n\n/* eslint-disable no-console */\n// TODO: Use "warning" npm module like React is switching to.\n// eslint-disable-next-line func-style\nfunction warn(message) {\n if (false) {}\n}\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/wrapper.js\n\n\n\n\n\n\n\n\n\n\nfunction wrapper_toConsumableArray(arr) { return wrapper_arrayWithoutHoles(arr) || wrapper_iterableToArray(arr) || wrapper_nonIterableSpread(); }\n\nfunction wrapper_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction wrapper_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction wrapper_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { wrapper_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction wrapper_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\n\nfunction addBinsToParentPropsIfHistogram(_ref) {\n var children = _ref.children,\n props = _ref.props,\n childComponents = _ref.childComponents,\n parentProps = _ref.parentProps;\n var someChildrenAreHistograms = children.some(function (child) {\n return child.type && child.type.role === "histogram";\n });\n var allChildrenAreHistograms = someChildrenAreHistograms && children.length && children.every(function (child) {\n return child.type && child.type.role === "histogram";\n });\n\n if (someChildrenAreHistograms && !allChildrenAreHistograms) {\n warn("VictoryHistogram only supports being stacked with other VictoryHistogram components. Check to make sure that you are only passing VictoryHistogram components to VictoryStack");\n } // if we are stacking histograms, we need to generate explicit bins\n // or else each histogram may end up having different bins\n\n\n if (!allChildrenAreHistograms) {\n return parentProps;\n }\n\n var childBins = props.bins || childComponents[0].props.bins; // if we have explicit bins then we don\'t need to calculate them\n\n if (!Array.isArray(childBins)) {\n var combinedData = children.reduce(function (memo, child) {\n var xAccessor = helpers_createAccessor(child.props.x || "x");\n return memo.concat(child.props.data.map(function (datum) {\n return {\n x: xAccessor(datum)\n };\n }));\n }, []); // use the same function to generate bins as VictoryHistogram but with\n // the combined data from above, then get explicit bins from that\n\n var getFormattedHistogramData = children[0].type.getFormattedData;\n childBins = getFormattedHistogramData({\n data: combinedData,\n bins: childBins\n }).reduce(function (memo, _ref2, index) {\n var x0 = _ref2.x0,\n x1 = _ref2.x1;\n return index === 0 ? memo.concat([x0, x1]) : memo.concat(x1);\n }, []);\n }\n\n return _objectSpread({}, parentProps, {\n bins: childBins\n });\n}\nfunction getDataFromChildren(props, childComponents) {\n var polar = props.polar,\n startAngle = props.startAngle,\n endAngle = props.endAngle,\n categories = props.categories,\n minDomain = props.minDomain,\n maxDomain = props.maxDomain;\n var parentProps = {\n polar: polar,\n startAngle: startAngle,\n endAngle: endAngle,\n categories: categories,\n minDomain: minDomain,\n maxDomain: maxDomain\n };\n var stack = 0;\n var children = childComponents ? childComponents.slice(0) : react.Children.toArray(props.children);\n parentProps = addBinsToParentPropsIfHistogram({\n children: children,\n props: props,\n childComponents: childComponents,\n parentProps: parentProps\n });\n\n var iteratee = function (child, childName, parent) {\n var childProps = assign_default()({}, child.props, parentProps);\n\n var childData;\n\n if (!data_isDataComponent(child)) {\n return null;\n } else if (child.type && isFunction_default()(child.type.getData)) {\n child = parent ? react.cloneElement(child, parent.props) : child;\n childData = child.type.getData(childProps);\n } else {\n childData = data_getData(childProps);\n }\n\n stack += 1;\n return childData.map(function (datum, index) {\n return assign_default()({\n _stack: stack,\n _group: index\n }, datum);\n });\n };\n\n var stacked = children.filter(function (c) {\n return c.type && c.type.role === "stack";\n }).length;\n\n var combine = function (memo, val) {\n return memo.concat(uniqBy_default()(val, "_group"));\n };\n\n var datasets = reduceChildren(children, iteratee, props, [], combine);\n var group = stacked ? "_group" : "_stack";\n return values_default()(groupBy_default()(datasets, group));\n}\nfunction getData(props, childComponents) {\n if (props.data) {\n return Data.getData(props);\n }\n\n childComponents = childComponents || React.Children.toArray(props.children);\n return getDataFromChildren(childComponents);\n}\nfunction getWidth(props, groupLength, seriesLength) {\n var datasets = props.datasets,\n horizontal = props.horizontal;\n var range = horizontal ? getRange(props, "y") : getRange(props, "x");\n var extent = Math.abs(range[1] - range[0]);\n seriesLength = seriesLength !== undefined ? seriesLength : Array.isArray(datasets[0]) && datasets[0].length || 1;\n groupLength = groupLength || datasets.length;\n var bars = groupLength * seriesLength;\n var barRatio = 0.5;\n return Math.round(barRatio * extent / bars);\n}\nfunction getDefaultDomainPadding(props, axis, childComponents) {\n if (props.polar || axis !== "x") {\n return undefined;\n }\n\n var groupComponent = childComponents.filter(function (child) {\n return child.type && child.type.role && child.type.role === "group";\n });\n\n if (groupComponent.length < 1) {\n return undefined;\n }\n\n var _groupComponent$0$pro = groupComponent[0].props,\n offset = _groupComponent$0$pro.offset,\n children = _groupComponent$0$pro.children;\n\n if (!offset) {\n return undefined;\n }\n\n var firstChild = Array.isArray(children) && children[0];\n\n if (!firstChild) {\n return undefined;\n }\n\n var barWidth = firstChild.props.barWidth;\n var dataLength = firstChild.props.data && firstChild.props.data.length || 1;\n\n if (firstChild && firstChild.type.role === "stack") {\n var nestedChild = firstChild.props.children && firstChild.props.children[0];\n\n if (!nestedChild) {\n return undefined;\n }\n\n barWidth = nestedChild.props.barWidth;\n dataLength = firstChild.props.children.length;\n }\n\n var width = barWidth || getWidth(props, children.length, dataLength);\n return {\n x: width * children.length / 2 + (offset - width * ((children.length - 1) / 2))\n };\n}\nfunction getDomainFromChildren(props, axis, childComponents) {\n // eslint-disable-line max-statements, complexity, max-len\n var children = childComponents ? childComponents.slice(0) : react.Children.toArray(props.children);\n var parentData = props.data ? data_getData(props, axis) : undefined;\n var polar = props.polar,\n startAngle = props.startAngle,\n endAngle = props.endAngle,\n categories = props.categories,\n minDomain = props.minDomain,\n maxDomain = props.maxDomain,\n horizontal = props.horizontal;\n var baseParentProps = {\n horizontal: horizontal,\n polar: polar,\n startAngle: startAngle,\n endAngle: endAngle,\n minDomain: minDomain,\n maxDomain: maxDomain,\n categories: categories\n };\n var parentProps = parentData ? assign_default()(baseParentProps, {\n data: parentData\n }) : baseParentProps;\n\n var iteratee = function (child) {\n var sharedProps = assign_default()({}, child.props, parentProps);\n\n if (!isDomainComponent(child)) {\n return null;\n } else if (child.type && isFunction_default()(child.type.getDomain)) {\n return child.props && child.type.getDomain(sharedProps, axis);\n } else {\n return getDomain(sharedProps, axis);\n }\n };\n\n var childDomains = reduceChildren(children, iteratee, props);\n var min = childDomains.length === 0 ? 0 : getMinValue(childDomains);\n var max = childDomains.length === 0 ? 1 : getMaxValue(childDomains);\n return [min, max];\n}\nfunction wrapper_getDomain(props, axis, childComponents) {\n childComponents = childComponents || react.Children.toArray(props.children);\n var propsDomain = getDomainFromProps(props, axis);\n var domainPadding = getDefaultDomainPadding(props, axis, childComponents);\n var domain;\n\n if (propsDomain) {\n domain = propsDomain;\n } else {\n var minDomain = getMinFromProps(props, axis);\n var maxDomain = getMaxFromProps(props, axis);\n var dataset = (props.data || props.y) && data_getData(props);\n var dataDomain = dataset ? getDomainFromData(props, axis, dataset) : [];\n var childDomain = getDomainFromChildren(props, axis, childComponents);\n var min = minDomain || getMinValue(wrapper_toConsumableArray(dataDomain).concat(wrapper_toConsumableArray(childDomain)));\n var max = maxDomain || getMaxValue(wrapper_toConsumableArray(dataDomain).concat(wrapper_toConsumableArray(childDomain)));\n domain = getDomainFromMinMax(min, max);\n }\n\n return formatDomain(domain, assign_default()({\n domainPadding: domainPadding\n }, props), axis);\n}\nfunction getScale(props, axis, childComponents) {\n if (props.data) {\n return getBaseScale(props, axis);\n }\n\n var children = childComponents ? childComponents.slice(0) : react.Children.toArray(props.children);\n\n var iteratee = function (child) {\n var sharedProps = assign_default()({}, child.props, {\n horizontal: props.horizontal\n });\n\n return getScaleType(sharedProps, axis);\n };\n\n var childScale = uniq_default()(reduceChildren(children, iteratee, props)); // default to linear scale if more than one uniq scale type is given by children\n\n\n return childScale.length > 1 ? getScaleFromName("linear") : getScaleFromName(childScale[0]);\n}\nfunction getAllEvents(props) {\n var components = ["groupComponent", "containerComponent", "labelComponent"];\n var componentEvents = getComponentEvents(props, components);\n var events = props.events;\n\n if (Array.isArray(componentEvents)) {\n events = Array.isArray(props.events) ? componentEvents.concat.apply(componentEvents, wrapper_toConsumableArray(props.events)) : componentEvents;\n }\n\n return events || [];\n}\nfunction getColor(calculatedProps, child, index) {\n // check for styles first\n var style = calculatedProps.style;\n var colorScale = calculatedProps.colorScale,\n color = calculatedProps.color;\n\n if (style && style.data && style.data.fill) {\n return style.data.fill;\n }\n\n colorScale = child.props && child.props.colorScale ? child.props.colorScale : colorScale;\n color = child.props && child.props.color ? child.props.color : color;\n\n if (!colorScale && !color) {\n return undefined;\n }\n\n var colors = Array.isArray(colorScale) ? colorScale : getColorScale(colorScale);\n return color || colors[index % colors.length];\n}\nfunction getStyle(theme, style, role) {\n var defaultStyle = theme && theme[role] && theme[role].style ? theme[role].style : {};\n return getStyles(style, defaultStyle);\n}\nfunction getChildStyle(child, index, calculatedProps) {\n var style = calculatedProps.style,\n role = calculatedProps.role;\n var childStyle = child.props.style || {};\n\n if (Array.isArray(childStyle)) {\n return childStyle;\n }\n\n var childRole = child.type && child.type.role;\n var defaultFill = childRole === "stack" ? undefined : getColor(calculatedProps, child, index);\n var defaultColor = childRole === "line" ? {\n fill: "none",\n stroke: defaultFill\n } : {\n fill: defaultFill\n };\n var dataWidth = role === "stack" ? {} : {\n width: getWidth(calculatedProps)\n };\n\n var dataStyle = defaults_default()({}, childStyle.data, assign_default()({}, dataWidth, style.data, defaultColor));\n\n var labelsStyle = defaults_default()({}, childStyle.labels, style.labels);\n\n return {\n parent: style.parent,\n data: dataStyle,\n labels: labelsStyle\n };\n}\nfunction wrapper_getStringsFromCategories(childComponents, axis) {\n var iteratee = function (child) {\n var childProps = child.props || {};\n\n if (!isDomainComponent(child) || !childProps.categories) {\n return null;\n } else {\n var categories = childProps.categories && !Array.isArray(childProps.categories) ? childProps.categories[axis] : childProps.props.categories;\n var categoryStrings = categories && categories.filter(function (val) {\n return typeof val === "string";\n });\n return categoryStrings ? removeUndefined(categoryStrings) : [];\n }\n };\n\n return reduceChildren(childComponents.slice(0), iteratee);\n}\nfunction wrapper_getStringsFromData(childComponents) {\n var iteratee = function (child) {\n var childProps = child.props || {};\n var data;\n\n if (!data_isDataComponent(child)) {\n return null;\n } else if (child.type && isFunction_default()(child.type.getData)) {\n data = child.type.getData(childProps);\n } else {\n data = data_getData(childProps);\n }\n\n return data.map(function (d) {\n return {\n x: d.xName,\n y: d.yName\n };\n });\n };\n\n var initialMemo = {\n x: [],\n y: []\n };\n\n var combine = function (memo, datum) {\n var x = Array.isArray(datum) ? datum.map(function (d) {\n return d.x;\n }).filter(Boolean) : datum.x;\n var y = Array.isArray(datum) ? datum.map(function (d) {\n return d.y;\n }).filter(Boolean) : datum.y;\n return {\n x: x !== undefined ? memo.x.concat(x) : memo.x,\n y: y !== undefined ? memo.y.concat(y) : memo.y\n };\n };\n\n return reduceChildren(childComponents.slice(0), iteratee, {}, initialMemo, combine);\n}\nfunction getCategoryAndAxisStringsFromChildren(props, axis, childComponents) {\n var categories = isPlainObject_default()(props.categories) ? props.categories[axis] : props.categories;\n var axisComponent = getAxisComponent(childComponents, axis);\n var axisStrings = axisComponent ? getStringsFromAxes(axisComponent.props, axis) : [];\n var categoryStrings = categories || wrapper_getStringsFromCategories(childComponents, axis);\n return uniq_default()(flatten_default()(wrapper_toConsumableArray(categoryStrings).concat(wrapper_toConsumableArray(axisStrings))));\n}\nfunction getStringsFromChildren(props, childComponents) {\n childComponents = childComponents || react.Children.toArray(props.children);\n var xStrings = getCategoryAndAxisStringsFromChildren(props, "x", childComponents);\n var yStrings = getCategoryAndAxisStringsFromChildren(props, "y", childComponents);\n var dataStrings = wrapper_getStringsFromData(childComponents);\n return {\n x: uniq_default()(flatten_default()(wrapper_toConsumableArray(xStrings).concat(wrapper_toConsumableArray(dataStrings.x)))),\n y: uniq_default()(flatten_default()(wrapper_toConsumableArray(yStrings).concat(wrapper_toConsumableArray(dataStrings.y))))\n };\n}\nfunction wrapper_getCategories(props, childComponents, allStrings) {\n var xPropCategories = props.categories && !Array.isArray(props.categories) ? props.categories.x : props.categories;\n var yPropCategories = props.categories && !Array.isArray(props.categories) ? props.categories.y : props.categories;\n var fallbackRequired = !xPropCategories || !yPropCategories;\n var fallbackProps = fallbackRequired ? allStrings || getStringsFromChildren(props, childComponents) : {};\n var xCategories = xPropCategories || fallbackProps.x;\n var yCategories = yPropCategories || fallbackProps.y;\n return {\n x: xCategories.length > 0 ? xCategories : undefined,\n y: yCategories.length > 0 ? yCategories : undefined\n };\n}\n// EXTERNAL MODULE: ./node_modules/lodash/isRegExp.js\nvar isRegExp = __webpack_require__(6347);\nvar isRegExp_default = /*#__PURE__*/__webpack_require__.n(isRegExp);\n// EXTERNAL MODULE: ./node_modules/lodash/find.js\nvar find = __webpack_require__(3311);\nvar find_default = /*#__PURE__*/__webpack_require__.n(find);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/prop-types.js\n\n\n\n\nfunction prop_types_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n/**\n * Return a new validator based on `validator` but with the option to chain\n * `isRequired` onto the validation. This is nearly identical to how React\n * does it internally, but they don\'t expose their helper for us to use.\n * @param {Function} validator Validation function.\n * @returns {Function} Validator with `isRequired` option.\n */\n\nvar makeChainable = function (validator) {\n /* eslint-disable max-params */\n var _chainable = function (isRequired, props, propName, componentName) {\n var value = props[propName];\n\n if (value === undefined || value === null) {\n if (isRequired) {\n return new Error("Required `".concat(propName, "` was not specified in `").concat(componentName, "`."));\n }\n\n return null;\n }\n\n for (var _len = arguments.length, rest = new Array(_len > 4 ? _len - 4 : 0), _key = 4; _key < _len; _key++) {\n rest[_key - 4] = arguments[_key];\n }\n\n return validator.apply(void 0, [props, propName, componentName].concat(rest));\n };\n\n var chainable = _chainable.bind(null, false);\n\n chainable.isRequired = _chainable.bind(null, true);\n return chainable;\n};\n\nvar nullConstructor = function () {\n return null;\n};\n\nvar undefinedConstructor = function () {\n return undefined;\n};\n/**\n * Get the constructor of `value`. If `value` is null or undefined, return the\n * special singletons `nullConstructor` or `undefinedConstructor`, respectively.\n * @param {*} value Instance to return the constructor of.\n * @returns {Function} Constructor of `value`.\n */\n\n\nvar getConstructor = function (value) {\n if (value === undefined) {\n return undefinedConstructor;\n } else if (value === null) {\n return nullConstructor;\n } else {\n return value.constructor;\n }\n};\n/**\n * Get the name of the constructor used to create `value`, using\n * `Object.protoype.toString`. If the value is null or undefined, return\n * "null" or "undefined", respectively.\n * @param {*} value Instance to return the constructor name of.\n * @returns {String} Name of the constructor.\n */\n\n\nvar getConstructorName = function (value) {\n if (value === undefined) {\n return "undefined";\n } else if (value === null) {\n return "null";\n }\n\n return Object.prototype.toString.call(value).slice(8, -1); // eslint-disable-line no-magic-numbers\n};\n/**\n * Return a new validator based on `propType` but which logs a `console.error`\n * with `explanation` if used.\n * @param {Function} propType The old, deprecated propType.\n * @param {String} explanation The message to provide the user of the deprecated propType.\n * @returns {Function} Validator which logs usage of this propType\n */\n\n\nfunction deprecated(propType, explanation) {\n return function (props, propName, componentName) {\n var value = props[propName];\n\n if (value !== null && value !== undefined) {\n warn("\\"".concat(propName, "\\" property of \\"").concat(componentName, "\\" has been deprecated ").concat(explanation));\n }\n\n return prop_types_default().checkPropTypes(prop_types_defineProperty({}, propName, propType), props, propName, componentName);\n };\n}\n/**\n * Return a new validator which returns true\n * if and only if all validators passed as arguments return true.\n * Like React.propTypes.oneOfType, except "all" instead of "any"\n * @param {Array} validators Validation functions.\n * @returns {Function} Combined validator function\n */\n\nfunction allOfType(validators) {\n return makeChainable(function (props, propName, componentName) {\n for (var _len2 = arguments.length, rest = new Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) {\n rest[_key2 - 3] = arguments[_key2];\n }\n\n return validators.reduce(function (result, validator) {\n return result || validator.apply(void 0, [props, propName, componentName].concat(rest));\n }, undefined);\n });\n}\n/**\n * Check that the value is a non-negative number.\n */\n\nvar nonNegative = makeChainable(function (props, propName, componentName) {\n var value = props[propName];\n\n if (typeof value !== "number" || value < 0) {\n return new Error("`".concat(propName, "` in `").concat(componentName, "` must be a non-negative number."));\n }\n\n return undefined;\n});\n/**\n * Check that the value is an integer.\n */\n\nvar integer = makeChainable(function (props, propName, componentName) {\n var value = props[propName];\n\n if (typeof value !== "number" || value % 1 !== 0) {\n return new Error("`".concat(propName, "` in `").concat(componentName, "` must be an integer."));\n }\n\n return undefined;\n});\n/**\n * Check that the value is greater than zero.\n */\n\nvar greaterThanZero = makeChainable(function (props, propName, componentName) {\n var value = props[propName];\n\n if (typeof value !== "number" || value <= 0) {\n return new Error("`".concat(propName, "` in `").concat(componentName, "` must be a number greater than zero."));\n }\n\n return undefined;\n});\n/**\n * Check that the value is an Array of two unique values.\n */\n\nvar domain = makeChainable(function (props, propName, componentName) {\n var value = props[propName];\n\n if (!Array.isArray(value) || value.length !== 2 || value[1] === value[0]) {\n return new Error("`".concat(propName, "` in `").concat(componentName, "` must be an array of two unique numeric values."));\n }\n\n return undefined;\n});\n/**\n * Check that the value looks like a d3 `scale` function.\n */\n\nvar scale = makeChainable(function (props, propName, componentName) {\n var supportedScaleStrings = ["linear", "time", "log", "sqrt"];\n\n var validScale = function (scl) {\n if (isFunction_default()(scl)) {\n return isFunction_default()(scl.copy) && isFunction_default()(scl.domain) && isFunction_default()(scl.range);\n } else if (typeof scl === "string") {\n return supportedScaleStrings.indexOf(scl) !== -1;\n }\n\n return false;\n };\n\n var value = props[propName];\n\n if (!validScale(value)) {\n return new Error("`".concat(propName, "` in `").concat(componentName, "` must be a d3 scale."));\n }\n\n return undefined;\n});\n/**\n * Check that an array contains items of the same type.\n */\n\nvar homogeneousArray = makeChainable(function (props, propName, componentName) {\n var values = props[propName];\n\n if (!Array.isArray(values)) {\n return new Error("`".concat(propName, "` in `").concat(componentName, "` must be an array."));\n }\n\n if (values.length < 2) {\n return undefined;\n }\n\n var comparisonConstructor = getConstructor(values[0]);\n\n var typeMismatchedValue = find_default()(values, function (value) {\n return comparisonConstructor !== getConstructor(value);\n });\n\n if (typeMismatchedValue) {\n var constructorName = getConstructorName(values[0]);\n var otherConstructorName = getConstructorName(typeMismatchedValue);\n return new Error("Expected `".concat(propName, "` in `").concat(componentName, "` to be a ") + "homogeneous array, but found types `".concat(constructorName, "` and ") + "`".concat(otherConstructorName, "`."));\n }\n\n return undefined;\n});\n/**\n * Check that array prop length matches props.data.length\n */\n\nvar matchDataLength = makeChainable(function (props, propName) {\n if (props[propName] && Array.isArray(props[propName]) && props[propName].length !== props.data.length) {\n return new Error("Length of data and ".concat(propName, " arrays must match."));\n }\n\n return undefined;\n});\n/**\n * Check that the value is a regular expression\n */\n\nvar regExp = makeChainable(function (props, propName, componentName) {\n if (props[propName] && !isRegExp_default()(props[propName])) {\n return new Error("`".concat(propName, "` in `").concat(componentName, "` must be a regular expression."));\n }\n\n return undefined;\n});\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/common-props.js\n\n\nvar dataProps = {\n categories: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).string), prop_types_default().shape({\n x: prop_types_default().arrayOf((prop_types_default()).string),\n y: prop_types_default().arrayOf((prop_types_default()).string)\n })]),\n data: prop_types_default().oneOfType([(prop_types_default()).array, (prop_types_default()).object]),\n dataComponent: (prop_types_default()).element,\n disableInlineStyles: (prop_types_default()).bool,\n labelComponent: (prop_types_default()).element,\n labels: prop_types_default().oneOfType([(prop_types_default()).func, (prop_types_default()).array]),\n samples: nonNegative,\n sortKey: prop_types_default().oneOfType([(prop_types_default()).func, allOfType([integer, nonNegative]), (prop_types_default()).string, prop_types_default().arrayOf((prop_types_default()).string)]),\n sortOrder: prop_types_default().oneOf(["ascending", "descending"]),\n style: prop_types_default().shape({\n parent: (prop_types_default()).object,\n data: (prop_types_default()).object,\n labels: (prop_types_default()).object\n }),\n x: prop_types_default().oneOfType([(prop_types_default()).func, allOfType([integer, nonNegative]), (prop_types_default()).string, prop_types_default().arrayOf((prop_types_default()).string)]),\n y: prop_types_default().oneOfType([(prop_types_default()).func, allOfType([integer, nonNegative]), (prop_types_default()).string, prop_types_default().arrayOf((prop_types_default()).string)]),\n y0: prop_types_default().oneOfType([(prop_types_default()).func, allOfType([integer, nonNegative]), (prop_types_default()).string, prop_types_default().arrayOf((prop_types_default()).string)])\n};\nvar baseProps = {\n animate: prop_types_default().oneOfType([(prop_types_default()).bool, (prop_types_default()).object]),\n containerComponent: (prop_types_default()).element,\n domain: prop_types_default().oneOfType([domain, prop_types_default().shape({\n x: domain,\n y: domain\n })]),\n maxDomain: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().instanceOf(Date), prop_types_default().shape({\n x: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().instanceOf(Date)]),\n y: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().instanceOf(Date)])\n })]),\n minDomain: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().instanceOf(Date), prop_types_default().shape({\n x: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().instanceOf(Date)]),\n y: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().instanceOf(Date)])\n })]),\n domainPadding: prop_types_default().oneOfType([prop_types_default().shape({\n x: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().arrayOf((prop_types_default()).number)]),\n y: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().arrayOf((prop_types_default()).number)])\n }), (prop_types_default()).number, prop_types_default().arrayOf((prop_types_default()).number)]),\n eventKey: prop_types_default().oneOfType([(prop_types_default()).func, allOfType([integer, nonNegative]), (prop_types_default()).string]),\n events: prop_types_default().arrayOf(prop_types_default().shape({\n target: prop_types_default().oneOf(["data", "labels", "parent"]),\n eventKey: prop_types_default().oneOfType([(prop_types_default()).array, allOfType([integer, nonNegative]), (prop_types_default()).string]),\n eventHandlers: (prop_types_default()).object\n })),\n externalEventMutations: prop_types_default().arrayOf(prop_types_default().shape({\n callback: (prop_types_default())["function"],\n childName: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).array]),\n eventKey: prop_types_default().oneOfType([(prop_types_default()).array, allOfType([integer, nonNegative]), (prop_types_default()).string]),\n mutation: (prop_types_default())["function"],\n target: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).array])\n })),\n groupComponent: (prop_types_default()).element,\n height: nonNegative,\n name: (prop_types_default()).string,\n origin: prop_types_default().shape({\n x: (prop_types_default()).number,\n y: (prop_types_default()).number\n }),\n padding: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().shape({\n top: (prop_types_default()).number,\n bottom: (prop_types_default()).number,\n left: (prop_types_default()).number,\n right: (prop_types_default()).number\n })]),\n polar: (prop_types_default()).bool,\n range: prop_types_default().oneOfType([domain, prop_types_default().shape({\n x: domain,\n y: domain\n })]),\n scale: prop_types_default().oneOfType([scale, prop_types_default().shape({\n x: scale,\n y: scale\n })]),\n sharedEvents: prop_types_default().shape({\n events: (prop_types_default()).array,\n getEventState: (prop_types_default()).func\n }),\n singleQuadrantDomainPadding: prop_types_default().oneOfType([(prop_types_default()).bool, prop_types_default().shape({\n x: prop_types_default().oneOfType([(prop_types_default()).bool]),\n y: prop_types_default().oneOfType([(prop_types_default()).bool])\n })]),\n standalone: (prop_types_default()).bool,\n theme: (prop_types_default()).object,\n width: nonNegative\n};\nvar primitiveProps = {\n active: (prop_types_default()).bool,\n ariaLabel: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).func]),\n className: (prop_types_default()).string,\n clipPath: (prop_types_default()).string,\n data: prop_types_default().oneOfType([(prop_types_default()).array, (prop_types_default()).object]),\n desc: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).func]),\n disableInlineStyles: (prop_types_default()).bool,\n events: (prop_types_default()).object,\n id: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string, (prop_types_default()).func]),\n index: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string]),\n origin: prop_types_default().shape({\n x: (prop_types_default()).number,\n y: (prop_types_default()).number\n }),\n polar: (prop_types_default()).bool,\n role: (prop_types_default()).string,\n scale: prop_types_default().oneOfType([scale, prop_types_default().shape({\n x: scale,\n y: scale\n })]),\n shapeRendering: (prop_types_default()).string,\n style: (prop_types_default()).object,\n tabIndex: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n transform: (prop_types_default()).string\n};\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-primitives/rect.js\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\n\n\nvar Rect = function (props) {\n // eslint-disable-next-line react/prop-types\n var desc = props.desc,\n rest = _objectWithoutProperties(props, ["desc"]);\n\n return desc ? react.createElement("rect", _extends({\n vectorEffect: "non-scaling-stroke"\n }, rest), react.createElement("desc", null, desc)) : react.createElement("rect", _extends({\n vectorEffect: "non-scaling-stroke"\n }, rest));\n};\n\n/* harmony default export */ const rect = (Rect);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-primitives/circle.js\nfunction circle_extends() { circle_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return circle_extends.apply(this, arguments); }\n\nfunction circle_objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\n\n\nvar Circle = function (props) {\n // eslint-disable-next-line react/prop-types\n var desc = props.desc,\n rest = circle_objectWithoutProperties(props, ["desc"]);\n\n return desc ? react.createElement("circle", circle_extends({\n vectorEffect: "non-scaling-stroke"\n }, rest), react.createElement("desc", null, desc)) : react.createElement("circle", circle_extends({\n vectorEffect: "non-scaling-stroke"\n }, rest));\n};\n\n/* harmony default export */ const circle = (Circle);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-primitives/background.js\n\n\nfunction background_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { background_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction background_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\nvar evaluateProps = function (props) {\n /**\n * Potential evaluated prop is:\n * `id`\n */\n var id = evaluateProp(props.id, props);\n return assign_default()({}, props, {\n id: id\n });\n};\n\nvar Background = function (props) {\n props = evaluateProps(props);\n return props.polar ? react.cloneElement(props.circleComponent, background_objectSpread({}, props.events, {\n style: props.style,\n role: props.role,\n shapeRendering: props.shapeRendering,\n cx: props.x,\n cy: props.y,\n r: props.height,\n className: props.className\n })) : react.cloneElement(props.rectComponent, background_objectSpread({}, props.events, {\n style: props.style,\n role: props.role,\n shapeRendering: props.shapeRendering,\n x: props.x,\n y: props.y,\n rx: props.rx,\n ry: props.ry,\n width: props.width,\n height: props.height,\n className: props.className\n }));\n};\n\nBackground.propTypes = background_objectSpread({}, primitiveProps, {\n circleComponent: (prop_types_default()).element,\n height: (prop_types_default()).number,\n rectComponent: (prop_types_default()).element,\n rx: (prop_types_default()).number,\n ry: (prop_types_default()).number,\n width: (prop_types_default()).number,\n x: (prop_types_default()).number,\n y: (prop_types_default()).number\n});\nBackground.defaultProps = {\n circleComponent: react.createElement(circle, null),\n rectComponent: react.createElement(rect, null),\n role: "presentation",\n shapeRendering: "auto"\n};\n/* harmony default export */ const background = (Background);\n// EXTERNAL MODULE: ./node_modules/lodash/uniqueId.js\nvar uniqueId = __webpack_require__(835);\nvar uniqueId_default = /*#__PURE__*/__webpack_require__.n(uniqueId);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-portal/portal.js\n\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\n\n\n\n\nvar Portal =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inherits(Portal, _React$Component);\n\n function Portal(props) {\n var _this;\n\n _classCallCheck(this, Portal);\n\n _this = _possibleConstructorReturn(this, (Portal.__proto__ || Object.getPrototypeOf(Portal)).call(this, props));\n _this.map = {};\n _this.index = 1;\n _this.portalUpdate = _this.portalUpdate.bind(_assertThisInitialized(_this));\n _this.portalRegister = _this.portalRegister.bind(_assertThisInitialized(_this));\n _this.portalDeregister = _this.portalDeregister.bind(_assertThisInitialized(_this));\n return _this;\n }\n\n _createClass(Portal, [{\n key: "portalRegister",\n value: function portalRegister() {\n return ++this.index;\n }\n }, {\n key: "portalUpdate",\n value: function portalUpdate(key, element) {\n this.map[key] = element;\n this.forceUpdate();\n }\n }, {\n key: "portalDeregister",\n value: function portalDeregister(key) {\n delete this.map[key];\n this.forceUpdate();\n }\n }, {\n key: "getChildren",\n value: function getChildren() {\n var _this2 = this;\n\n return keys_default()(this.map).map(function (key) {\n var el = _this2.map[key];\n return el ? react.cloneElement(el, {\n key: key\n }) : el;\n });\n } // Overridden in victory-core-native\n\n }, {\n key: "render",\n value: function render() {\n return react.createElement("svg", this.props, this.getChildren());\n }\n }]);\n\n return Portal;\n}(react.Component);\n\nObject.defineProperty(Portal, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "Portal"\n});\nObject.defineProperty(Portal, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n className: (prop_types_default()).string,\n height: nonNegative,\n style: (prop_types_default()).object,\n viewBox: (prop_types_default()).string,\n width: nonNegative\n }\n});\n\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-portal/portal-context.js\n\n/**\n * The React context object consumers may use to access the context of the\n * portal.\n */\n\nvar PortalContext = react.createContext({});\nPortalContext.displayName = "PortalContext";\n/* harmony default export */ const portal_context = (PortalContext);\n;// CONCATENATED MODULE: ./node_modules/d3-timer/src/timer.js\nvar timer_frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === "object" && performance.now ? performance : Date,\n setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nfunction now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nfunction Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== "function") throw new TypeError("callback is not a function");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nfunction timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nfunction timerFlush() {\n now(); // Get the current time, if not already set.\n ++timer_frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n t = t._next;\n }\n --timer_frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n timer_frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n timer_frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (timer_frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n timer_frame = 1, setFrame(wake);\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/timer.js\nfunction timer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction timer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction timer_createClass(Constructor, protoProps, staticProps) { if (protoProps) timer_defineProperties(Constructor.prototype, protoProps); if (staticProps) timer_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar timer_Timer =\n/*#__PURE__*/\nfunction () {\n function Timer() {\n timer_classCallCheck(this, Timer);\n\n this.shouldAnimate = true;\n this.subscribers = [];\n this.loop = this.loop.bind(this);\n this.timer = null;\n this.activeSubscriptions = 0;\n }\n\n timer_createClass(Timer, [{\n key: "bypassAnimation",\n value: function bypassAnimation() {\n this.shouldAnimate = false;\n }\n }, {\n key: "resumeAnimation",\n value: function resumeAnimation() {\n this.shouldAnimate = true;\n }\n }, {\n key: "loop",\n value: function loop() {\n this.subscribers.forEach(function (s) {\n s.callback(now() - s.startTime, s.duration);\n });\n }\n }, {\n key: "start",\n value: function start() {\n if (!this.timer) {\n this.timer = timer(this.loop);\n }\n }\n }, {\n key: "stop",\n value: function stop() {\n if (this.timer) {\n this.timer.stop();\n this.timer = null;\n }\n }\n }, {\n key: "subscribe",\n value: function subscribe(callback, duration) {\n duration = this.shouldAnimate ? duration : 0;\n var subscriptionID = this.subscribers.push({\n startTime: now(),\n callback: callback,\n duration: duration\n });\n this.activeSubscriptions++;\n this.start();\n return subscriptionID;\n }\n }, {\n key: "unsubscribe",\n value: function unsubscribe(id) {\n if (id !== null && this.subscribers[id - 1]) {\n delete this.subscribers[id - 1];\n this.activeSubscriptions--;\n }\n\n if (this.activeSubscriptions === 0) {\n this.stop();\n }\n }\n }]);\n\n return Timer;\n}();\n\n\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/timer-context.js\n\n\n/**\n * The React context object consumers may use to access or override the global\n * timer.\n */\n\nvar TimerContext = react.createContext({\n transitionTimer: new timer_Timer(),\n animationTimer: new timer_Timer()\n});\nTimerContext.displayName = "TimerContext";\n/* harmony default export */ const timer_context = (TimerContext);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-container/victory-container.js\n\n\n\n\n\n\nfunction victory_container_extends() { victory_container_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return victory_container_extends.apply(this, arguments); }\n\nfunction victory_container_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_container_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_container_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction victory_container_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_container_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_container_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_container_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_container_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_container_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_container_assertThisInitialized(self); }\n\nfunction victory_container_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_container_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\n\n\n\n\nvar VictoryContainer =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_container_inherits(VictoryContainer, _React$Component);\n\n function VictoryContainer(props) {\n var _this;\n\n victory_container_classCallCheck(this, VictoryContainer);\n\n _this = victory_container_possibleConstructorReturn(this, (VictoryContainer.__proto__ || Object.getPrototypeOf(VictoryContainer)).call(this, props));\n _this.containerId = !isObject_default()(props) || props.containerId === undefined ? uniqueId_default()("victory-container-") : props.containerId;\n\n _this.savePortalRef = function (portal) {\n _this.portalRef = portal;\n return portal;\n };\n\n _this.portalUpdate = function (key, el) {\n return _this.portalRef.portalUpdate(key, el);\n };\n\n _this.portalRegister = function () {\n return _this.portalRef.portalRegister();\n };\n\n _this.portalDeregister = function (key) {\n return _this.portalRef.portalDeregister(key);\n };\n\n _this.saveContainerRef = props && isFunction_default()(props.containerRef) ? props.containerRef : function (container) {\n _this.containerRef = container;\n return container;\n };\n _this.shouldHandleWheel = props && props.events && props.events.onWheel;\n\n if (_this.shouldHandleWheel) {\n _this.handleWheel = function (e) {\n return e.preventDefault();\n };\n }\n\n return _this;\n }\n\n victory_container_createClass(VictoryContainer, [{\n key: "componentDidMount",\n value: function componentDidMount() {\n if (this.shouldHandleWheel && this.containerRef) {\n this.containerRef.addEventListener("wheel", this.handleWheel);\n }\n }\n }, {\n key: "componentWillUnmount",\n value: function componentWillUnmount() {\n if (this.shouldHandleWheel && this.containerRef) {\n this.containerRef.removeEventListener("wheel", this.handleWheel);\n }\n }\n }, {\n key: "getIdForElement",\n value: function getIdForElement(elementName) {\n return "".concat(this.containerId, "-").concat(elementName);\n } // overridden in custom containers\n\n }, {\n key: "getChildren",\n value: function getChildren(props) {\n return props.children;\n } // Get props defined by the Open UI Automation (OUIA) 1.0-RC spec\n // See https://ouia.readthedocs.io/en/latest/README.html#ouia-component\n\n }, {\n key: "getOUIAProps",\n value: function getOUIAProps(props) {\n var ouiaId = props.ouiaId,\n ouiaSafe = props.ouiaSafe,\n ouiaType = props.ouiaType;\n return victory_container_objectSpread({}, ouiaId && {\n "data-ouia-component-id": ouiaId\n }, ouiaType && {\n "data-ouia-component-type": ouiaType\n }, ouiaSafe !== undefined && {\n "data-ouia-safe": ouiaSafe\n });\n }\n }, {\n key: "renderContainer",\n value: function renderContainer(props, svgProps, style) {\n var title = props.title,\n desc = props.desc,\n portalComponent = props.portalComponent,\n className = props.className,\n width = props.width,\n height = props.height,\n portalZIndex = props.portalZIndex,\n responsive = props.responsive;\n var children = this.getChildren(props);\n var dimensions = responsive ? {\n width: "100%",\n height: "100%"\n } : {\n width: width,\n height: height\n };\n\n var divStyle = assign_default()({\n pointerEvents: "none",\n touchAction: "none",\n position: "relative"\n }, dimensions);\n\n var portalDivStyle = assign_default()({\n zIndex: portalZIndex,\n position: "absolute",\n top: 0,\n left: 0\n }, dimensions);\n\n var svgStyle = assign_default()({\n pointerEvents: "all"\n }, dimensions);\n\n var portalSvgStyle = assign_default()({\n overflow: "visible"\n }, dimensions);\n\n var portalProps = {\n width: width,\n height: height,\n viewBox: svgProps.viewBox,\n preserveAspectRatio: svgProps.preserveAspectRatio,\n style: portalSvgStyle\n };\n return react.createElement(portal_context.Provider, {\n value: {\n portalUpdate: this.portalUpdate,\n portalRegister: this.portalRegister,\n portalDeregister: this.portalDeregister\n }\n }, react.createElement("div", victory_container_extends({\n style: defaults_default()({}, style, divStyle),\n className: className,\n ref: this.saveContainerRef\n }, this.getOUIAProps(props)), react.createElement("svg", victory_container_extends({}, svgProps, {\n style: svgStyle\n }), title ? react.createElement("title", {\n id: this.getIdForElement("title")\n }, title) : null, desc ? react.createElement("desc", {\n id: this.getIdForElement("desc")\n }, desc) : null, children), react.createElement("div", {\n style: portalDivStyle\n }, react.cloneElement(portalComponent, victory_container_objectSpread({}, portalProps, {\n ref: this.savePortalRef\n })))));\n }\n }, {\n key: "render",\n value: function render() {\n var _props = this.props,\n width = _props.width,\n height = _props.height,\n responsive = _props.responsive,\n events = _props.events,\n title = _props.title,\n desc = _props.desc,\n tabIndex = _props.tabIndex,\n preserveAspectRatio = _props.preserveAspectRatio,\n role = _props.role;\n var style = responsive ? this.props.style : omit(this.props.style, ["height", "width"]);\n\n var svgProps = assign_default()({\n width: width,\n height: height,\n tabIndex: tabIndex,\n role: role,\n "aria-labelledby": [title && this.getIdForElement("title"), this.props["aria-labelledby"]].filter(Boolean).join(" ") || undefined,\n "aria-describedby": [desc && this.getIdForElement("desc"), this.props["aria-describedby"]].filter(Boolean).join(" ") || undefined,\n viewBox: responsive ? "0 0 ".concat(width, " ").concat(height) : undefined,\n preserveAspectRatio: responsive ? preserveAspectRatio : undefined\n }, events);\n\n return this.renderContainer(this.props, svgProps, style);\n }\n }]);\n\n return VictoryContainer;\n}(react.Component);\n\nObject.defineProperty(VictoryContainer, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryContainer"\n});\nObject.defineProperty(VictoryContainer, "role", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "container"\n});\nObject.defineProperty(VictoryContainer, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n "aria-describedby": (prop_types_default()).string,\n "aria-labelledby": (prop_types_default()).string,\n children: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).node), (prop_types_default()).node]),\n className: (prop_types_default()).string,\n containerId: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string]),\n containerRef: (prop_types_default()).func,\n desc: (prop_types_default()).string,\n events: (prop_types_default()).object,\n height: nonNegative,\n name: (prop_types_default()).string,\n origin: prop_types_default().shape({\n x: nonNegative,\n y: nonNegative\n }),\n ouiaId: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string]),\n ouiaSafe: (prop_types_default()).bool,\n ouiaType: (prop_types_default()).string,\n polar: (prop_types_default()).bool,\n portalComponent: (prop_types_default()).element,\n portalZIndex: integer,\n preserveAspectRatio: (prop_types_default()).string,\n responsive: (prop_types_default()).bool,\n role: (prop_types_default()).string,\n style: (prop_types_default()).object,\n tabIndex: (prop_types_default()).number,\n theme: (prop_types_default()).object,\n title: (prop_types_default()).string,\n width: nonNegative\n }\n});\nObject.defineProperty(VictoryContainer, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n className: "VictoryContainer",\n portalComponent: react.createElement(Portal, null),\n portalZIndex: 99,\n responsive: true,\n role: "img"\n }\n});\nObject.defineProperty(VictoryContainer, "contextType", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: timer_context\n});\n\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-theme/material.js\n\n// *\n// * Colors\n// *\nvar yellow200 = "#FFF59D";\nvar deepOrange600 = "#F4511E";\nvar lime300 = "#DCE775";\nvar lightGreen500 = "#8BC34A";\nvar teal700 = "#00796B";\nvar cyan900 = "#006064";\nvar material_colors = [deepOrange600, yellow200, lime300, lightGreen500, teal700, cyan900];\nvar blueGrey50 = "#ECEFF1";\nvar blueGrey300 = "#90A4AE";\nvar blueGrey700 = "#455A64";\nvar grey900 = "#212121"; // *\n// * Typography\n// *\n\nvar sansSerif = "\'Helvetica Neue\', \'Helvetica\', sans-serif";\nvar letterSpacing = "normal";\nvar fontSize = 12; // *\n// * Layout\n// *\n\nvar padding = 8;\nvar material_baseProps = {\n width: 350,\n height: 350,\n padding: 50\n}; // *\n// * Labels\n// *\n\nvar baseLabelStyles = {\n fontFamily: sansSerif,\n fontSize: fontSize,\n letterSpacing: letterSpacing,\n padding: padding,\n fill: blueGrey700,\n stroke: "transparent",\n strokeWidth: 0\n};\n\nvar centeredLabelStyles = assign_default()({\n textAnchor: "middle"\n}, baseLabelStyles); // *\n// * Strokes\n// *\n\n\nvar strokeDasharray = "10, 5";\nvar strokeLinecap = "round";\nvar strokeLinejoin = "round";\n/* harmony default export */ const material = ({\n area: assign_default()({\n style: {\n data: {\n fill: grey900\n },\n labels: baseLabelStyles\n }\n }, material_baseProps),\n axis: assign_default()({\n style: {\n axis: {\n fill: "transparent",\n stroke: blueGrey300,\n strokeWidth: 2,\n strokeLinecap: strokeLinecap,\n strokeLinejoin: strokeLinejoin\n },\n axisLabel: assign_default()({}, centeredLabelStyles, {\n padding: padding,\n stroke: "transparent"\n }),\n grid: {\n fill: "none",\n stroke: blueGrey50,\n strokeDasharray: strokeDasharray,\n strokeLinecap: strokeLinecap,\n strokeLinejoin: strokeLinejoin,\n pointerEvents: "painted"\n },\n ticks: {\n fill: "transparent",\n size: 5,\n stroke: blueGrey300,\n strokeWidth: 1,\n strokeLinecap: strokeLinecap,\n strokeLinejoin: strokeLinejoin\n },\n tickLabels: assign_default()({}, baseLabelStyles, {\n fill: blueGrey700\n })\n }\n }, material_baseProps),\n polarDependentAxis: assign_default()({\n style: {\n ticks: {\n fill: "transparent",\n size: 1,\n stroke: "transparent"\n }\n }\n }),\n bar: assign_default()({\n style: {\n data: {\n fill: blueGrey700,\n padding: padding,\n strokeWidth: 0\n },\n labels: baseLabelStyles\n }\n }, material_baseProps),\n boxplot: assign_default()({\n style: {\n max: {\n padding: padding,\n stroke: blueGrey700,\n strokeWidth: 1\n },\n maxLabels: assign_default()({}, baseLabelStyles, {\n padding: 3\n }),\n median: {\n padding: padding,\n stroke: blueGrey700,\n strokeWidth: 1\n },\n medianLabels: assign_default()({}, baseLabelStyles, {\n padding: 3\n }),\n min: {\n padding: padding,\n stroke: blueGrey700,\n strokeWidth: 1\n },\n minLabels: assign_default()({}, baseLabelStyles, {\n padding: 3\n }),\n q1: {\n padding: padding,\n fill: blueGrey700\n },\n q1Labels: assign_default()({}, baseLabelStyles, {\n padding: 3\n }),\n q3: {\n padding: padding,\n fill: blueGrey700\n },\n q3Labels: assign_default()({}, baseLabelStyles, {\n padding: 3\n })\n },\n boxWidth: 20\n }, material_baseProps),\n candlestick: assign_default()({\n style: {\n data: {\n stroke: blueGrey700\n },\n labels: assign_default()({}, baseLabelStyles, {\n padding: 5\n })\n },\n candleColors: {\n positive: "#ffffff",\n negative: blueGrey700\n }\n }, material_baseProps),\n chart: material_baseProps,\n errorbar: assign_default()({\n borderWidth: 8,\n style: {\n data: {\n fill: "transparent",\n opacity: 1,\n stroke: blueGrey700,\n strokeWidth: 2\n },\n labels: baseLabelStyles\n }\n }, material_baseProps),\n group: assign_default()({\n colorScale: material_colors\n }, material_baseProps),\n histogram: assign_default()({\n style: {\n data: {\n fill: blueGrey700,\n stroke: grey900,\n strokeWidth: 2\n },\n labels: baseLabelStyles\n }\n }, material_baseProps),\n legend: {\n colorScale: material_colors,\n gutter: 10,\n orientation: "vertical",\n titleOrientation: "top",\n style: {\n data: {\n type: "circle"\n },\n labels: baseLabelStyles,\n title: assign_default()({}, baseLabelStyles, {\n padding: 5\n })\n }\n },\n line: assign_default()({\n style: {\n data: {\n fill: "transparent",\n opacity: 1,\n stroke: blueGrey700,\n strokeWidth: 2\n },\n labels: baseLabelStyles\n }\n }, material_baseProps),\n pie: assign_default()({\n colorScale: material_colors,\n style: {\n data: {\n padding: padding,\n stroke: blueGrey50,\n strokeWidth: 1\n },\n labels: assign_default()({}, baseLabelStyles, {\n padding: 20\n })\n }\n }, material_baseProps),\n scatter: assign_default()({\n style: {\n data: {\n fill: blueGrey700,\n opacity: 1,\n stroke: "transparent",\n strokeWidth: 0\n },\n labels: baseLabelStyles\n }\n }, material_baseProps),\n stack: assign_default()({\n colorScale: material_colors\n }, material_baseProps),\n tooltip: {\n style: assign_default()({}, baseLabelStyles, {\n padding: 0,\n pointerEvents: "none"\n }),\n flyoutStyle: {\n stroke: grey900,\n strokeWidth: 1,\n fill: "#f0f0f0",\n pointerEvents: "none"\n },\n flyoutPadding: 5,\n cornerRadius: 5,\n pointerLength: 10\n },\n voronoi: assign_default()({\n style: {\n data: {\n fill: "transparent",\n stroke: "transparent",\n strokeWidth: 0\n },\n labels: assign_default()({}, baseLabelStyles, {\n padding: 5,\n pointerEvents: "none"\n }),\n flyout: {\n stroke: grey900,\n strokeWidth: 1,\n fill: "#f0f0f0",\n pointerEvents: "none"\n }\n }\n }, material_baseProps)\n});\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-theme/grayscale.js\n\n// *\n// * Colors\n// *\nvar grayscale_colors = ["#252525", "#525252", "#737373", "#969696", "#bdbdbd", "#d9d9d9", "#f0f0f0"];\nvar charcoal = "#252525";\nvar grey = "#969696"; // *\n// * Typography\n// *\n\nvar grayscale_sansSerif = "\'Gill Sans\', \'Seravek\', \'Trebuchet MS\', sans-serif";\nvar grayscale_letterSpacing = "normal";\nvar grayscale_fontSize = 14; // *\n// * Layout\n// *\n\nvar grayscale_baseProps = {\n width: 450,\n height: 300,\n padding: 50,\n colorScale: grayscale_colors\n}; // *\n// * Labels\n// *\n\nvar grayscale_baseLabelStyles = {\n fontFamily: grayscale_sansSerif,\n fontSize: grayscale_fontSize,\n letterSpacing: grayscale_letterSpacing,\n padding: 10,\n fill: charcoal,\n stroke: "transparent"\n};\n\nvar grayscale_centeredLabelStyles = assign_default()({\n textAnchor: "middle"\n}, grayscale_baseLabelStyles); // *\n// * Strokes\n// *\n\n\nvar grayscale_strokeLinecap = "round";\nvar grayscale_strokeLinejoin = "round";\n/* harmony default export */ const grayscale = ({\n area: assign_default()({\n style: {\n data: {\n fill: charcoal\n },\n labels: grayscale_baseLabelStyles\n }\n }, grayscale_baseProps),\n axis: assign_default()({\n style: {\n axis: {\n fill: "transparent",\n stroke: charcoal,\n strokeWidth: 1,\n strokeLinecap: grayscale_strokeLinecap,\n strokeLinejoin: grayscale_strokeLinejoin\n },\n axisLabel: assign_default()({}, grayscale_centeredLabelStyles, {\n padding: 25\n }),\n grid: {\n fill: "none",\n stroke: "none",\n pointerEvents: "painted"\n },\n ticks: {\n fill: "transparent",\n size: 1,\n stroke: "transparent"\n },\n tickLabels: grayscale_baseLabelStyles\n }\n }, grayscale_baseProps),\n bar: assign_default()({\n style: {\n data: {\n fill: charcoal,\n padding: 8,\n strokeWidth: 0\n },\n labels: grayscale_baseLabelStyles\n }\n }, grayscale_baseProps),\n boxplot: assign_default()({\n style: {\n max: {\n padding: 8,\n stroke: charcoal,\n strokeWidth: 1\n },\n maxLabels: assign_default()({}, grayscale_baseLabelStyles, {\n padding: 3\n }),\n median: {\n padding: 8,\n stroke: charcoal,\n strokeWidth: 1\n },\n medianLabels: assign_default()({}, grayscale_baseLabelStyles, {\n padding: 3\n }),\n min: {\n padding: 8,\n stroke: charcoal,\n strokeWidth: 1\n },\n minLabels: assign_default()({}, grayscale_baseLabelStyles, {\n padding: 3\n }),\n q1: {\n padding: 8,\n fill: grey\n },\n q1Labels: assign_default()({}, grayscale_baseLabelStyles, {\n padding: 3\n }),\n q3: {\n padding: 8,\n fill: grey\n },\n q3Labels: assign_default()({}, grayscale_baseLabelStyles, {\n padding: 3\n })\n },\n boxWidth: 20\n }, grayscale_baseProps),\n candlestick: assign_default()({\n style: {\n data: {\n stroke: charcoal,\n strokeWidth: 1\n },\n labels: assign_default()({}, grayscale_baseLabelStyles, {\n padding: 5\n })\n },\n candleColors: {\n positive: "#ffffff",\n negative: charcoal\n }\n }, grayscale_baseProps),\n chart: grayscale_baseProps,\n errorbar: assign_default()({\n borderWidth: 8,\n style: {\n data: {\n fill: "transparent",\n stroke: charcoal,\n strokeWidth: 2\n },\n labels: grayscale_baseLabelStyles\n }\n }, grayscale_baseProps),\n group: assign_default()({\n colorScale: grayscale_colors\n }, grayscale_baseProps),\n histogram: assign_default()({\n style: {\n data: {\n fill: grey,\n stroke: charcoal,\n strokeWidth: 2\n },\n labels: grayscale_baseLabelStyles\n }\n }, grayscale_baseProps),\n legend: {\n colorScale: grayscale_colors,\n gutter: 10,\n orientation: "vertical",\n titleOrientation: "top",\n style: {\n data: {\n type: "circle"\n },\n labels: grayscale_baseLabelStyles,\n title: assign_default()({}, grayscale_baseLabelStyles, {\n padding: 5\n })\n }\n },\n line: assign_default()({\n style: {\n data: {\n fill: "transparent",\n stroke: charcoal,\n strokeWidth: 2\n },\n labels: grayscale_baseLabelStyles\n }\n }, grayscale_baseProps),\n pie: {\n style: {\n data: {\n padding: 10,\n stroke: "transparent",\n strokeWidth: 1\n },\n labels: assign_default()({}, grayscale_baseLabelStyles, {\n padding: 20\n })\n },\n colorScale: grayscale_colors,\n width: 400,\n height: 400,\n padding: 50\n },\n scatter: assign_default()({\n style: {\n data: {\n fill: charcoal,\n stroke: "transparent",\n strokeWidth: 0\n },\n labels: grayscale_baseLabelStyles\n }\n }, grayscale_baseProps),\n stack: assign_default()({\n colorScale: grayscale_colors\n }, grayscale_baseProps),\n tooltip: {\n style: assign_default()({}, grayscale_baseLabelStyles, {\n padding: 0,\n pointerEvents: "none"\n }),\n flyoutStyle: {\n stroke: charcoal,\n strokeWidth: 1,\n fill: "#f0f0f0",\n pointerEvents: "none"\n },\n flyoutPadding: 5,\n cornerRadius: 5,\n pointerLength: 10\n },\n voronoi: assign_default()({\n style: {\n data: {\n fill: "transparent",\n stroke: "transparent",\n strokeWidth: 0\n },\n labels: assign_default()({}, grayscale_baseLabelStyles, {\n padding: 5,\n pointerEvents: "none"\n }),\n flyout: {\n stroke: charcoal,\n strokeWidth: 1,\n fill: "#f0f0f0",\n pointerEvents: "none"\n }\n }\n }, grayscale_baseProps)\n});\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-theme/victory-theme.js\n\n\n/* harmony default export */ const victory_theme = ({\n material: material,\n grayscale: grayscale\n});\n// EXTERNAL MODULE: ./node_modules/lodash/some.js\nvar some = __webpack_require__(9704);\nvar some_default = /*#__PURE__*/__webpack_require__.n(some);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/transitions.js\n\n\n\n\n\n\nfunction getDatumKey(datum, idx) {\n return (datum.key || idx).toString();\n}\n\nfunction getKeyedData(data) {\n return data.reduce(function (keyedData, datum, idx) {\n var key = getDatumKey(datum, idx);\n keyedData[key] = datum;\n return keyedData;\n }, {});\n}\n\nfunction getKeyedDataDifference(a, b) {\n var hasDifference = false;\n\n var difference = keys_default()(a).reduce(function (_difference, key) {\n if (!(key in b)) {\n hasDifference = true;\n _difference[key] = true;\n }\n\n return _difference;\n }, {});\n\n return hasDifference && difference;\n}\n/**\n * Calculate which data-points exist in oldData and not nextData -\n * these are the `exiting` data-points. Also calculate which\n * data-points exist in nextData and not oldData - these are the\n * `entering` data-points.\n *\n * @param {Array} oldData this.props.data Array\n * @param {Array} nextData this.props.data Array\n *\n * @return {Object} Object with `entering` and `exiting` properties.\n * entering[datum.key] will be true if the data is\n * entering, and similarly for `exiting`.\n */\n\n\nfunction getNodeTransitions(oldData, nextData) {\n var oldDataKeyed = oldData && getKeyedData(oldData);\n var nextDataKeyed = nextData && getKeyedData(nextData);\n return {\n entering: oldDataKeyed && getKeyedDataDifference(nextDataKeyed, oldDataKeyed),\n exiting: nextDataKeyed && getKeyedDataDifference(oldDataKeyed, nextDataKeyed)\n };\n}\n\nfunction getChildData(child) {\n if (child.type && child.type.getData) {\n return child.type.getData(child.props);\n }\n\n return child.props && child.props.data || false;\n}\n/**\n * If a parent component has animation enabled, calculate the transitions\n * for any data of any child component that supports data transitions\n * Data transitions are defined as any two datasets where data nodes exist\n * in the first set and not the second, in the second and not the first,\n * or both.\n *\n * @param {Children} oldChildren this.props.children from old props\n * @param {Children} nextChildren this.props.children from next props\n *\n * @return {Object} Object with the following properties:\n * - nodesWillExit\n * - nodesWillEnter\n * - childrenTransitions\n * - nodesShouldEnter\n */\n\n\nfunction getInitialTransitionState(oldChildren, nextChildren) {\n var nodesWillExit = false;\n var nodesWillEnter = false;\n\n var getTransition = function (oldChild, newChild) {\n if (!newChild || oldChild.type !== newChild.type) {\n return {};\n }\n\n var _ref = getNodeTransitions(getChildData(oldChild), getChildData(newChild)) || {},\n entering = _ref.entering,\n exiting = _ref.exiting;\n\n nodesWillExit = nodesWillExit || !!exiting;\n nodesWillEnter = nodesWillEnter || !!entering;\n return {\n entering: entering || false,\n exiting: exiting || false\n };\n };\n\n var getTransitionsFromChildren = function (old, next) {\n return old.map(function (child, idx) {\n if (child && child.props && child.props.children && next[idx]) {\n return getTransitionsFromChildren(react.Children.toArray(old[idx].props.children), react.Children.toArray(next[idx].props.children));\n } // get Transition entering and exiting nodes\n\n\n return getTransition(child, next[idx]);\n });\n };\n\n var childrenTransitions = getTransitionsFromChildren(react.Children.toArray(oldChildren), react.Children.toArray(nextChildren));\n return {\n nodesWillExit: nodesWillExit,\n nodesWillEnter: nodesWillEnter,\n childrenTransitions: childrenTransitions,\n // TODO: This may need to be refactored for the following situation.\n // The component receives new props, and the data provided\n // is a perfect match for the previous data and domain except\n // for new nodes. In this case, we wouldn\'t want a delay before\n // the new nodes appear.\n nodesShouldEnter: false\n };\n}\n\nfunction getInitialChildProps(animate, data) {\n var after = animate.onEnter && animate.onEnter.after ? animate.onEnter.after : (identity_default());\n return {\n data: data.map(function (datum, idx) {\n return assign_default()({}, datum, after(datum, idx, data));\n })\n };\n} // eslint-disable-next-line max-params\n\n\nfunction getChildBeforeLoad(animate, child, data, cb) {\n animate = assign_default()({}, animate, {\n onEnd: cb\n });\n\n if (animate && animate.onLoad && !animate.onLoad.duration) {\n return {\n animate: animate,\n data: data\n };\n }\n\n var before = animate.onLoad && animate.onLoad.before ? animate.onLoad.before : (identity_default()); // If nodes need to exit, transform them with the provided onLoad.before function.\n\n data = data.map(function (datum, idx) {\n return assign_default()({}, datum, before(datum, idx, data));\n });\n return {\n animate: animate,\n data: data,\n clipWidth: 0\n };\n} // eslint-disable-next-line max-params\n\n\nfunction getChildOnLoad(animate, data, cb) {\n animate = assign_default()({}, animate, {\n onEnd: cb\n });\n\n if (animate && animate.onLoad && !animate.onLoad.duration) {\n return {\n animate: animate,\n data: data\n };\n }\n\n var after = animate.onLoad && animate.onLoad.after ? animate.onLoad.after : (identity_default()); // If nodes need to exit, transform them with the provided onLoad.after function.\n\n data = data.map(function (datum, idx) {\n return assign_default()({}, datum, after(datum, idx, data));\n });\n return {\n animate: animate,\n data: data\n };\n} // eslint-disable-next-line max-params, max-len\n\n\nfunction getChildPropsOnExit(animate, child, data, exitingNodes, cb) {\n // Whether or not _this_ child has exiting nodes, we want the exit-\n // transition for all children to have the same duration, delay, etc.\n var onExit = animate && animate.onExit;\n animate = assign_default()({}, animate, onExit);\n\n if (exitingNodes) {\n // After the exit transition occurs, trigger the animations for\n // nodes that are neither exiting or entering.\n animate.onEnd = cb;\n var before = animate.onExit && animate.onExit.before ? animate.onExit.before : (identity_default()); // If nodes need to exit, transform them with the provided onExit.before function.\n\n data = data.map(function (datum, idx) {\n var key = (datum.key || idx).toString();\n return exitingNodes[key] ? assign_default()({}, datum, before(datum, idx, data)) : datum;\n });\n }\n\n return {\n animate: animate,\n data: data\n };\n} // eslint-disable-next-line max-params,max-len\n\n\nfunction getChildPropsBeforeEnter(animate, child, data, enteringNodes, cb) {\n if (enteringNodes) {\n // Perform a normal animation here, except - when it finishes - trigger\n // the transition for entering nodes.\n animate = assign_default()({}, animate, {\n onEnd: cb\n });\n var before = animate.onEnter && animate.onEnter.before ? animate.onEnter.before : (identity_default()); // We want the entering nodes to be included in the transition target\n // domain. However, we may not want these nodes to be displayed initially,\n // so perform the `onEnter.before` transformation on each node.\n\n data = data.map(function (datum, idx) {\n var key = (datum.key || idx).toString();\n return enteringNodes[key] ? assign_default()({}, datum, before(datum, idx, data)) : datum;\n });\n }\n\n return {\n animate: animate,\n data: data\n };\n} // eslint-disable-next-line max-params, max-len\n\n\nfunction getChildPropsOnEnter(animate, data, enteringNodes, cb) {\n // Whether or not _this_ child has entering nodes, we want the entering-\n // transition for all children to have the same duration, delay, etc.\n var onEnter = animate && animate.onEnter;\n animate = assign_default()({}, animate, onEnter);\n\n if (enteringNodes) {\n // Old nodes have been transitioned to their new values, and the\n // domain should encompass the nodes that will now enter. So perform\n // the `onEnter.after` transformation on each node.\n animate.onEnd = cb;\n var after = animate.onEnter && animate.onEnter.after ? animate.onEnter.after : (identity_default());\n data = data.map(function (datum, idx) {\n var key = getDatumKey(datum, idx);\n return enteringNodes[key] ? assign_default()({}, datum, after(datum, idx, data)) : datum;\n });\n }\n\n return {\n animate: animate,\n data: data\n };\n}\n/**\n * getTransitionPropsFactory - putting the Java in JavaScript. This will return a\n * function that returns prop transformations for a child, given that child\'s props\n * and its index in the parent\'s children array.\n *\n * In particular, this will include an `animate` object that is set appropriately\n * so that each child will be synchoronized for each stage of a transition\n * animation. It will also include a transformed `data` object, where each datum\n * is transformed by `animate.onExit` and `animate.onEnter` `before` and `after`\n * functions.\n *\n * @param {Object} props `this.props` for the parent component.\n * @param {Object} state `this.state` for the parent component.\n * @param {Function} setState Function that, when called, will `this.setState` on\n * the parent component with the provided object.\n *\n * @return {Function} Child-prop transformation function.\n */\n\n\nfunction getTransitionPropsFactory(props, state, setState) {\n var nodesWillExit = state && state.nodesWillExit;\n var nodesWillEnter = state && state.nodesWillEnter;\n var nodesShouldEnter = state && state.nodesShouldEnter;\n var nodesShouldLoad = state && state.nodesShouldLoad;\n var nodesDoneLoad = state && state.nodesDoneLoad;\n var childrenTransitions = state && state.childrenTransitions || [];\n var transitionDurations = {\n enter: props.animate && props.animate.onEnter && props.animate.onEnter.duration,\n exit: props.animate && props.animate.onExit && props.animate.onExit.duration,\n load: props.animate && props.animate.onLoad && props.animate.onLoad.duration,\n move: props.animate && props.animate.duration\n };\n\n var onLoad = function (child, data, animate) {\n if (nodesShouldLoad) {\n return getChildOnLoad(animate, data, function () {\n setState({\n nodesShouldLoad: false,\n nodesDoneLoad: true\n });\n });\n }\n\n return getChildBeforeLoad(animate, child, data, function () {\n setState({\n nodesDoneLoad: true\n });\n });\n }; // eslint-disable-next-line max-params\n\n\n var onExit = function (nodes, child, data, animate) {\n return getChildPropsOnExit(animate, child, data, nodes, function () {\n setState({\n nodesWillExit: false\n });\n });\n }; // eslint-disable-next-line max-params\n\n\n var onEnter = function (nodes, child, data, animate) {\n if (nodesShouldEnter) {\n return getChildPropsOnEnter(animate, data, nodes, function () {\n setState({\n nodesWillEnter: false\n });\n });\n }\n\n return getChildPropsBeforeEnter(animate, child, data, nodes, function () {\n setState({\n nodesShouldEnter: true\n });\n });\n };\n\n var getChildTransitionDuration = function (child, type) {\n var animate = child.props.animate;\n\n if (!child.type) {\n return {};\n }\n\n var defaultTransitions = child.props && child.props.polar ? child.type.defaultPolarTransitions || child.type.defaultTransitions : child.type.defaultTransitions;\n\n if (defaultTransitions) {\n var animationDuration = animate[type] && animate[type].duration;\n return animationDuration !== undefined ? animationDuration : defaultTransitions[type] && defaultTransitions[type].duration;\n } else {\n return {};\n }\n }; // eslint-disable-next-line max-statements, complexity, max-len\n\n\n return function getTransitionProps(child, index) {\n var data = getChildData(child) || [];\n\n var animate = defaults_default()({}, props.animate, child.props.animate);\n\n var defaultTransitions = child.props.polar ? child.type.defaultPolarTransitions || child.type.defaultTransitions : child.type.defaultTransitions;\n animate.onExit = defaults_default()({}, animate.onExit, defaultTransitions && defaultTransitions.onExit);\n animate.onEnter = defaults_default()({}, animate.onEnter, defaultTransitions && defaultTransitions.onEnter);\n animate.onLoad = defaults_default()({}, animate.onLoad, defaultTransitions && defaultTransitions.onLoad);\n var childTransitions = childrenTransitions[index] || childrenTransitions[0];\n\n if (!nodesDoneLoad) {\n // should do onLoad animation\n var load = transitionDurations.load !== undefined ? transitionDurations.load : getChildTransitionDuration(child, "onLoad");\n var animation = {\n duration: load\n };\n return onLoad(child, data, assign_default()({}, animate, animation));\n } else if (nodesWillExit) {\n var exitingNodes = childTransitions && childTransitions.exiting;\n var exit = transitionDurations.exit !== undefined ? transitionDurations.exit : getChildTransitionDuration(child, "onExit"); // if nodesWillExit, but this child has no exiting nodes, set a delay instead of a duration\n\n var _animation = exitingNodes ? {\n duration: exit\n } : {\n delay: exit\n };\n\n return onExit(exitingNodes, child, data, assign_default()({}, animate, _animation));\n } else if (nodesWillEnter) {\n var enteringNodes = childTransitions && childTransitions.entering;\n var enter = transitionDurations.enter !== undefined ? transitionDurations.enter : getChildTransitionDuration(child, "onEnter");\n var move = transitionDurations.move !== undefined ? transitionDurations.move : child.props.animate && child.props.animate.duration;\n var _animation2 = {\n duration: nodesShouldEnter && enteringNodes ? enter : move\n };\n return onEnter(enteringNodes, child, data, assign_default()({}, animate, _animation2));\n } else if (!state && animate && animate.onExit) {\n // This is the initial render, and nodes may enter when props change. Because\n // animation interpolation is determined by old- and next- props, data may need\n // to be augmented with certain properties.\n //\n // For example, it may be desired that exiting nodes go from `opacity: 1` to\n // `opacity: 0`. Without setting this on a per-datum basis, the interpolation\n // might go from `opacity: undefined` to `opacity: 0`, which would result in\n // interpolated `opacity: NaN` values.\n //\n return getInitialChildProps(animate, data);\n }\n\n return {\n animate: animate,\n data: data\n };\n };\n}\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/hooks/use-animation-state.js\n\n\n\nfunction use_animation_state_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { use_animation_state_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction use_animation_state_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\n\n\n\nvar INITIAL_STATE = {\n nodesShouldLoad: false,\n nodesDoneLoad: false,\n animating: true\n};\nvar useAnimationState = function () {\n var initialState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : INITIAL_STATE;\n\n var _React$useState = react.useState(initialState),\n _React$useState2 = _slicedToArray(_React$useState, 2),\n state = _React$useState2[0],\n _setState = _React$useState2[1]; // This allows us to use a state object and maintain the same API as this.setState\n\n\n var setState = react.useCallback(function (newState) {\n _setState(function (oldState) {\n return use_animation_state_objectSpread({}, oldState, newState);\n });\n }, [_setState]); // This is a copy of Wrapper.getAnimationProps\n\n var getAnimationProps = react.useCallback(function (props, child, index) {\n if (!props.animate) {\n return child.props.animate;\n }\n\n var getFilteredState = function () {\n var childrenTransitions = state && state.childrenTransitions;\n childrenTransitions = isArrayOfArrays(childrenTransitions) ? childrenTransitions[index] : childrenTransitions;\n return defaults_default()({\n childrenTransitions: childrenTransitions\n }, state);\n };\n\n var getTransitions = props.animate && props.animate.getTransitions;\n var filteredState = getFilteredState();\n var parentState = props.animate && props.animate.parentState || filteredState;\n\n if (!getTransitions) {\n var getTransitionProps = getTransitionPropsFactory(props, filteredState, function (newState) {\n return setState(newState);\n });\n\n getTransitions = function (childComponent) {\n return getTransitionProps(childComponent, index);\n };\n }\n\n return defaults_default()({\n getTransitions: getTransitions,\n parentState: parentState\n }, props.animate, child.props.animate);\n }, [state, setState]); // This is a copy of Wrapper.setAnimationState\n\n var setAnimationState = react.useCallback(function (props, nextProps) {\n if (!props.animate) {\n return;\n }\n\n if (props.animate.parentState) {\n var nodesWillExit = props.animate.parentState.nodesWillExit;\n var oldProps = nodesWillExit ? props : null;\n\n var newState = defaults_default()({\n oldProps: oldProps,\n nextProps: nextProps\n }, props.animate.parentState);\n\n setState(newState);\n } else {\n var oldChildren = react.Children.toArray(props.children);\n var nextChildren = react.Children.toArray(nextProps.children);\n\n var isContinuous = function (child) {\n var check = function (c) {\n return c.type && c.type.continuous;\n };\n\n return Array.isArray(child) ? some_default()(child, check) : check(child);\n };\n\n var continuous = !props.polar && some_default()(oldChildren, function (child) {\n return isContinuous(child) || child.props.children && isContinuous(child.props.children);\n });\n\n var _Transitions$getIniti = getInitialTransitionState(oldChildren, nextChildren),\n _nodesWillExit = _Transitions$getIniti.nodesWillExit,\n nodesWillEnter = _Transitions$getIniti.nodesWillEnter,\n childrenTransitions = _Transitions$getIniti.childrenTransitions,\n nodesShouldEnter = _Transitions$getIniti.nodesShouldEnter;\n\n setState({\n nodesWillExit: _nodesWillExit,\n nodesWillEnter: nodesWillEnter,\n nodesShouldEnter: nodesShouldEnter,\n childrenTransitions: isArrayOfArrays(childrenTransitions) ? childrenTransitions[0] : childrenTransitions,\n oldProps: _nodesWillExit ? props : null,\n nextProps: nextProps,\n continuous: continuous\n });\n }\n }, [setState]);\n var getProps = react.useCallback(function (initialProps) {\n return state && state.nodesWillExit ? state.oldProps || initialProps : initialProps;\n }, [state]);\n return {\n state: state,\n setState: setState,\n getAnimationProps: getAnimationProps,\n setAnimationState: setAnimationState,\n getProps: getProps\n };\n};\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/hooks/use-previous-props.js\n\nvar usePreviousProps = function (props) {\n var ref = react.useRef();\n react.useEffect(function () {\n ref.current = props;\n });\n return ref.current || {};\n};\n// EXTERNAL MODULE: ./node_modules/lodash/difference.js\nvar difference = __webpack_require__(1966);\nvar difference_default = /*#__PURE__*/__webpack_require__.n(difference);\n// EXTERNAL MODULE: ./node_modules/lodash/fromPairs.js\nvar fromPairs = __webpack_require__(7204);\nvar fromPairs_default = /*#__PURE__*/__webpack_require__.n(fromPairs);\n// EXTERNAL MODULE: ./node_modules/react-fast-compare/index.js\nvar react_fast_compare = __webpack_require__(9590);\nvar react_fast_compare_default = /*#__PURE__*/__webpack_require__.n(react_fast_compare);\n// EXTERNAL MODULE: ./node_modules/json-stringify-safe/stringify.js\nvar stringify = __webpack_require__(4530);\nvar stringify_default = /*#__PURE__*/__webpack_require__.n(stringify);\n;// CONCATENATED MODULE: ./node_modules/victory-shared-events/es/victory-shared-events.js\n\n\n\n\n\n\n\n\nfunction victory_shared_events_slicedToArray(arr, i) { return victory_shared_events_arrayWithHoles(arr) || victory_shared_events_iterableToArrayLimit(arr, i) || victory_shared_events_nonIterableRest(); }\n\nfunction victory_shared_events_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }\n\nfunction victory_shared_events_iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction victory_shared_events_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction victory_shared_events_toConsumableArray(arr) { return victory_shared_events_arrayWithoutHoles(arr) || victory_shared_events_iterableToArray(arr) || victory_shared_events_nonIterableSpread(); }\n\nfunction victory_shared_events_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_shared_events_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_shared_events_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction victory_shared_events_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_shared_events_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_shared_events_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_shared_events_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_shared_events_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_shared_events_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_shared_events_assertThisInitialized(self); }\n\nfunction victory_shared_events_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction victory_shared_events_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\n\n\n\n\n\n\nvar VictorySharedEvents =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_shared_events_inherits(VictorySharedEvents, _React$Component);\n\n function VictorySharedEvents(props) {\n var _this;\n\n victory_shared_events_classCallCheck(this, VictorySharedEvents);\n\n _this = victory_shared_events_possibleConstructorReturn(this, (VictorySharedEvents.__proto__ || Object.getPrototypeOf(VictorySharedEvents)).call(this, props));\n _this.state = _this.state || {};\n _this.getScopedEvents = events_getScopedEvents.bind(victory_shared_events_assertThisInitialized(_this));\n _this.getEventState = getEventState.bind(victory_shared_events_assertThisInitialized(_this));\n _this.baseProps = _this.getBaseProps(props);\n _this.sharedEventsCache = {};\n _this.globalEvents = {};\n _this.prevGlobalEventKeys = [];\n _this.boundGlobalEvents = {};\n return _this;\n }\n\n victory_shared_events_createClass(VictorySharedEvents, [{\n key: "shouldComponentUpdate",\n value: function shouldComponentUpdate(nextProps) {\n if (!react_fast_compare_default()(this.props, nextProps)) {\n this.baseProps = this.getBaseProps(nextProps);\n var externalMutations = this.getExternalMutations(nextProps, this.baseProps);\n this.applyExternalMutations(nextProps, externalMutations);\n }\n\n return true;\n }\n }, {\n key: "componentDidMount",\n value: function componentDidMount() {\n var _this2 = this;\n\n var globalEventKeys = keys_default()(this.globalEvents);\n\n globalEventKeys.forEach(function (key) {\n return _this2.addGlobalListener(key);\n });\n this.prevGlobalEventKeys = globalEventKeys;\n }\n }, {\n key: "componentDidUpdate",\n value: function componentDidUpdate() {\n var _this3 = this;\n\n var globalEventKeys = keys_default()(this.globalEvents);\n\n var removedGlobalEventKeys = difference_default()(this.prevGlobalEventKeys, globalEventKeys);\n\n removedGlobalEventKeys.forEach(function (key) {\n return _this3.removeGlobalListener(key);\n });\n\n var addedGlobalEventKeys = difference_default()(globalEventKeys, this.prevGlobalEventKeys);\n\n addedGlobalEventKeys.forEach(function (key) {\n return _this3.addGlobalListener(key);\n });\n this.prevGlobalEventKeys = globalEventKeys;\n }\n }, {\n key: "componentWillUnmount",\n value: function componentWillUnmount() {\n var _this4 = this;\n\n this.prevGlobalEventKeys.forEach(function (key) {\n return _this4.removeGlobalListener(key);\n });\n }\n }, {\n key: "addGlobalListener",\n value: function addGlobalListener(key) {\n var _this5 = this;\n\n var boundListener = function (event) {\n var listener = _this5.globalEvents[key];\n return listener && listener(emulateReactEvent(event));\n };\n\n this.boundGlobalEvents[key] = boundListener;\n window.addEventListener(getGlobalEventNameFromKey(key), boundListener);\n }\n }, {\n key: "removeGlobalListener",\n value: function removeGlobalListener(key) {\n window.removeEventListener(getGlobalEventNameFromKey(key), this.boundGlobalEvents[key]);\n }\n }, {\n key: "getAllEvents",\n value: function getAllEvents(props) {\n var components = ["container", "groupComponent"];\n var componentEvents = getComponentEvents(props, components);\n\n if (Array.isArray(componentEvents)) {\n return Array.isArray(props.events) ? componentEvents.concat.apply(componentEvents, victory_shared_events_toConsumableArray(props.events)) : componentEvents;\n }\n\n return props.events;\n }\n }, {\n key: "applyExternalMutations",\n value: function applyExternalMutations(props, externalMutations) {\n if (!isEmpty_default()(externalMutations)) {\n var callbacks = props.externalEventMutations.reduce(function (memo, mutation) {\n memo = isFunction_default()(mutation.callback) ? memo.concat(mutation.callback) : memo;\n return memo;\n }, []);\n var compiledCallbacks = callbacks.length ? function () {\n callbacks.forEach(function (c) {\n return c();\n });\n } : undefined;\n this.setState(externalMutations, compiledCallbacks);\n }\n }\n }, {\n key: "getExternalMutations",\n value: function getExternalMutations(props, baseProps) {\n return !isEmpty_default()(props.externalEventMutations) ? getExternalMutationsWithChildren(props.externalEventMutations, baseProps, this.state, keys_default()(baseProps)) : undefined;\n }\n }, {\n key: "cacheSharedEvents",\n value: function cacheSharedEvents(name, sharedEvents, cacheValues) {\n this.sharedEventsCache[name] = [sharedEvents, cacheValues];\n }\n }, {\n key: "getCachedSharedEvents",\n value: function getCachedSharedEvents(name, cacheValues) {\n var _ref = this.sharedEventsCache[name] || [],\n _ref2 = victory_shared_events_slicedToArray(_ref, 2),\n sharedEvents = _ref2[0],\n prevCacheValues = _ref2[1];\n\n if (sharedEvents && react_fast_compare_default()(cacheValues, prevCacheValues)) {\n return sharedEvents;\n }\n\n return undefined;\n }\n }, {\n key: "getBaseProps",\n value: function getBaseProps(props) {\n var container = props.container;\n var children = react.Children.toArray(this.props.children);\n var childBaseProps = this.getBasePropsFromChildren(children);\n var parentBaseProps = container ? container.props : {};\n return assign_default()({}, childBaseProps, {\n parent: parentBaseProps\n });\n }\n }, {\n key: "getBasePropsFromChildren",\n value: function getBasePropsFromChildren(childComponents) {\n var iteratee = function (child, childName) {\n if (child.type && isFunction_default()(child.type.getBaseProps)) {\n var _baseProps = child.props && child.type.getBaseProps(child.props);\n\n return _baseProps ? [[childName, _baseProps]] : null;\n } else {\n return null;\n }\n };\n\n var baseProps = reduceChildren(childComponents, iteratee);\n return fromPairs_default()(baseProps);\n }\n }, {\n key: "getNewChildren",\n value: function getNewChildren(props, baseProps) {\n var _this6 = this;\n\n var events = props.events,\n eventKey = props.eventKey;\n\n var alterChildren = function (children, childNames) {\n return children.reduce(function (memo, child, index) {\n if (child.props.children) {\n var newChildren = react.Children.toArray(child.props.children);\n var names = childNames.slice(index, index + newChildren.length);\n var results = react.cloneElement(child, child.props, alterChildren(newChildren, names));\n return memo.concat(results);\n } else if (childNames[index] !== "parent" && child.type && isFunction_default()(child.type.getBaseProps)) {\n var name = child.props.name || childNames[index];\n var childEvents = Array.isArray(events) && events.filter(function (event) {\n if (event.target === "parent") {\n return false;\n }\n\n return Array.isArray(event.childName) ? event.childName.indexOf(name) > -1 : event.childName === name || event.childName === "all";\n });\n var sharedEventsCacheValues = [name, baseProps, childEvents, stringify_default()(_this6.state[name])];\n var sharedEvents = _this6.getCachedSharedEvents(name, sharedEventsCacheValues) || {\n events: childEvents,\n // partially apply child name and baseProps,\n getEvents: function (evts, target) {\n return _this6.getScopedEvents(evts, target, name, baseProps);\n },\n // partially apply child name\n getEventState: function (key, target) {\n return _this6.getEventState(key, target, name);\n }\n };\n\n _this6.cacheSharedEvents(name, sharedEvents, sharedEventsCacheValues);\n\n return memo.concat(react.cloneElement(child, assign_default()({\n key: "events-".concat(name),\n sharedEvents: sharedEvents,\n eventKey: eventKey,\n name: name\n }, child.props)));\n } else {\n return memo.concat(child);\n }\n }, []);\n };\n\n var childNames = keys_default()(baseProps);\n\n var childComponents = react.Children.toArray(props.children);\n return alterChildren(childComponents, childNames);\n }\n }, {\n key: "getContainer",\n value: function getContainer(props, baseProps, events) {\n var _this7 = this;\n\n var children = this.getNewChildren(props, baseProps);\n var parents = Array.isArray(events) && events.filter(function (event) {\n return event.target === "parent";\n });\n var sharedEvents = parents.length > 0 ? {\n events: parents,\n // partially apply childName (null) and baseProps,\n getEvents: function (evts, target) {\n return _this7.getScopedEvents(evts, target, null, baseProps);\n },\n getEventState: this.getEventState\n } : null;\n var container = props.container || props.groupComponent;\n var role = container.type && container.type.role;\n var containerProps = container.props || {};\n var boundGetEvents = getEvents.bind(this);\n var parentEvents = sharedEvents && boundGetEvents({\n sharedEvents: sharedEvents\n }, "parent");\n\n var parentProps = defaults_default()({}, this.getEventState("parent", "parent"), containerProps, baseProps.parent, {\n children: children\n });\n\n var containerEvents = defaults_default()({}, getPartialEvents(parentEvents, "parent", parentProps), containerProps.events);\n\n this.globalEvents = getGlobalEvents(containerEvents);\n var localEvents = omitGlobalEvents(containerEvents);\n return role === "container" ? react.cloneElement(container, assign_default()({}, parentProps, {\n events: localEvents\n })) : react.cloneElement(container, localEvents, children);\n }\n }, {\n key: "render",\n value: function render() {\n var events = this.getAllEvents(this.props);\n\n if (events) {\n return this.getContainer(this.props, this.baseProps, events);\n }\n\n return react.cloneElement(this.props.container, {\n children: this.props.children\n });\n }\n }]);\n\n return VictorySharedEvents;\n}(react.Component);\n\nObject.defineProperty(VictorySharedEvents, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictorySharedEvents"\n});\nObject.defineProperty(VictorySharedEvents, "role", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "shared-event-wrapper"\n});\nObject.defineProperty(VictorySharedEvents, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n children: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).node), (prop_types_default()).node]),\n container: (prop_types_default()).node,\n eventKey: prop_types_default().oneOfType([(prop_types_default()).array, (prop_types_default()).func, allOfType([integer, nonNegative]), (prop_types_default()).string]),\n events: prop_types_default().arrayOf(prop_types_default().shape({\n childName: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).array]),\n eventHandlers: (prop_types_default()).object,\n eventKey: prop_types_default().oneOfType([(prop_types_default()).array, (prop_types_default()).func, allOfType([integer, nonNegative]), (prop_types_default()).string]),\n target: (prop_types_default()).string\n })),\n externalEventMutations: prop_types_default().arrayOf(prop_types_default().shape({\n callback: (prop_types_default())["function"],\n childName: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).array]),\n eventKey: prop_types_default().oneOfType([(prop_types_default()).array, allOfType([integer, nonNegative]), (prop_types_default()).string]),\n mutation: (prop_types_default())["function"],\n target: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).array])\n })),\n groupComponent: (prop_types_default()).node\n }\n});\nObject.defineProperty(VictorySharedEvents, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n groupComponent: react.createElement("g", null)\n }\n});\nObject.defineProperty(VictorySharedEvents, "contextType", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: timer_context\n});\n\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/textsize.js\n\n\n\nfunction textsize_toConsumableArray(arr) { return textsize_arrayWithoutHoles(arr) || textsize_iterableToArray(arr) || textsize_nonIterableSpread(); }\n\nfunction textsize_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction textsize_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction textsize_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\n// Based on measuring specific character widths\n// as in the following example https://bl.ocks.org/tophtucker/62f93a4658387bb61e4510c37e2e97cf\n//prettier-ignore\nvar fonts = {\n "American Typewriter": {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.4203125, 0.3296875, 0.6, 0.6375, 0.8015625, 0.8203125, 0.1875, 0.45625, 0.45625, 0.6375, 0.5, 0.2734375, 0.309375, 0.2734375, 0.4390625, 0.6375, 0.6375, 0.6375, 0.6375, 0.6375, 0.6375, 0.6375, 0.6375, 0.6375, 0.6375, 0.2734375, 0.2734375, 0.5, 0.5, 0.5, 0.6, 0.6921875, 0.7640625, 0.6921875, 0.6375, 0.728125, 0.6734375, 0.6203125, 0.7109375, 0.784375, 0.3828125, 0.6421875, 0.7859375, 0.6375, 0.9484375, 0.7640625, 0.65625, 0.6375, 0.65625, 0.7296875, 0.6203125, 0.6375, 0.7109375, 0.740625, 0.940625, 0.784375, 0.7578125, 0.6203125, 0.4375, 0.5, 0.4375, 0.5, 0.5, 0.4921875, 0.5734375, 0.5890625, 0.5109375, 0.6, 0.528125, 0.43125, 0.5578125, 0.6375, 0.3109375, 0.40625, 0.6234375, 0.309375, 0.928125, 0.6375, 0.546875, 0.6, 0.58125, 0.4921875, 0.4921875, 0.4, 0.6203125, 0.625, 0.825, 0.6375, 0.640625, 0.528125, 0.5, 0.5, 0.5, 0.6671875],\n avg: 0.5793421052631578\n },\n Arial: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.278125, 0.278125, 0.35625, 0.55625, 0.55625, 0.890625, 0.6671875, 0.1921875, 0.334375, 0.334375, 0.390625, 0.584375, 0.278125, 0.334375, 0.278125, 0.278125, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.278125, 0.278125, 0.584375, 0.584375, 0.584375, 0.55625, 1.015625, 0.6703125, 0.6671875, 0.7234375, 0.7234375, 0.6671875, 0.6109375, 0.778125, 0.7234375, 0.278125, 0.5, 0.6671875, 0.55625, 0.834375, 0.7234375, 0.778125, 0.6671875, 0.778125, 0.7234375, 0.6671875, 0.6109375, 0.7234375, 0.6671875, 0.9453125, 0.6671875, 0.6671875, 0.6109375, 0.278125, 0.278125, 0.278125, 0.4703125, 0.584375, 0.334375, 0.55625, 0.55625, 0.5, 0.55625, 0.55625, 0.3125, 0.55625, 0.55625, 0.2234375, 0.2703125, 0.5, 0.2234375, 0.834375, 0.55625, 0.55625, 0.55625, 0.55625, 0.346875, 0.5, 0.278125, 0.55625, 0.5, 0.7234375, 0.5, 0.5, 0.5, 0.334375, 0.2609375, 0.334375, 0.584375],\n avg: 0.528733552631579\n },\n "Arial Black": {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.33125, 0.334375, 0.5, 0.6609375, 0.6671875, 1, 0.890625, 0.278125, 0.390625, 0.390625, 0.55625, 0.6609375, 0.334375, 0.334375, 0.334375, 0.28125, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.334375, 0.334375, 0.6609375, 0.6609375, 0.6609375, 0.6109375, 0.7453125, 0.78125, 0.778125, 0.778125, 0.778125, 0.7234375, 0.6671875, 0.834375, 0.834375, 0.390625, 0.6671875, 0.834375, 0.6671875, 0.9453125, 0.834375, 0.834375, 0.7234375, 0.834375, 0.78125, 0.7234375, 0.7234375, 0.834375, 0.7796875, 1.003125, 0.78125, 0.78125, 0.7234375, 0.390625, 0.28125, 0.390625, 0.6609375, 0.5125, 0.334375, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.41875, 0.6671875, 0.6671875, 0.334375, 0.384375, 0.6671875, 0.334375, 1, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.4703125, 0.6109375, 0.4453125, 0.6671875, 0.6140625, 0.946875, 0.6671875, 0.615625, 0.55625, 0.390625, 0.278125, 0.390625, 0.6609375],\n avg: 0.6213157894736842\n },\n Baskerville: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.25, 0.40625, 0.6671875, 0.490625, 0.875, 0.7015625, 0.178125, 0.2453125, 0.246875, 0.4171875, 0.6671875, 0.25, 0.3125, 0.25, 0.521875, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.25, 0.25, 0.6671875, 0.6671875, 0.6671875, 0.396875, 0.9171875, 0.684375, 0.615625, 0.71875, 0.7609375, 0.625, 0.553125, 0.771875, 0.803125, 0.3546875, 0.515625, 0.78125, 0.6046875, 0.928125, 0.75, 0.8234375, 0.5625, 0.96875, 0.7296875, 0.5421875, 0.6984375, 0.771875, 0.7296875, 0.9484375, 0.771875, 0.678125, 0.6359375, 0.3640625, 0.521875, 0.3640625, 0.46875, 0.5125, 0.334375, 0.46875, 0.521875, 0.428125, 0.521875, 0.4375, 0.3890625, 0.4765625, 0.53125, 0.25, 0.359375, 0.4640625, 0.240625, 0.803125, 0.53125, 0.5, 0.521875, 0.521875, 0.365625, 0.334375, 0.2921875, 0.521875, 0.4640625, 0.678125, 0.4796875, 0.465625, 0.428125, 0.4796875, 0.5109375, 0.4796875, 0.6671875],\n avg: 0.5323519736842108\n },\n Courier: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5984375, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6078125, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.61875, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.615625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6140625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625],\n avg: 0.6020559210526316\n },\n "Courier New": {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5984375, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625],\n avg: 0.6015296052631579\n },\n cursive: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1921875, 0.24375, 0.40625, 0.5671875, 0.3984375, 0.721875, 0.909375, 0.2328125, 0.434375, 0.365625, 0.4734375, 0.5578125, 0.19375, 0.3484375, 0.19375, 0.7734375, 0.503125, 0.4171875, 0.5453125, 0.45, 0.6046875, 0.4703125, 0.5984375, 0.55625, 0.503125, 0.5546875, 0.20625, 0.2, 0.5625, 0.5546875, 0.546875, 0.403125, 0.70625, 0.734375, 0.7078125, 0.64375, 0.85, 0.753125, 0.75, 0.6484375, 1.0765625, 0.44375, 0.5359375, 0.8359375, 0.653125, 1.0109375, 1.1515625, 0.6796875, 0.6984375, 1.0625, 0.8234375, 0.5125, 0.9234375, 0.8546875, 0.70625, 0.9109375, 0.7421875, 0.715625, 0.6015625, 0.4640625, 0.3359375, 0.4109375, 0.5421875, 0.5421875, 0.4328125, 0.5125, 0.5, 0.3859375, 0.7375, 0.359375, 0.75625, 0.540625, 0.5328125, 0.3203125, 0.5296875, 0.5015625, 0.484375, 0.7890625, 0.5640625, 0.4203125, 0.703125, 0.471875, 0.4734375, 0.35, 0.4125, 0.5640625, 0.471875, 0.6484375, 0.5296875, 0.575, 0.4140625, 0.415625, 0.20625, 0.3796875, 0.5421875],\n avg: 0.5604440789473684\n },\n fantasy: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.215625, 0.2625, 0.3265625, 0.6109375, 0.534375, 0.7625, 0.7828125, 0.2, 0.4359375, 0.4359375, 0.3765625, 0.5109375, 0.2796875, 0.4609375, 0.2796875, 0.5296875, 0.6640625, 0.253125, 0.521875, 0.4765625, 0.6640625, 0.490625, 0.528125, 0.5546875, 0.496875, 0.5421875, 0.2796875, 0.2796875, 0.5625, 0.4609375, 0.5625, 0.4828125, 0.609375, 0.740625, 0.7234375, 0.740625, 0.8265625, 0.7234375, 0.6171875, 0.7359375, 0.765625, 0.240625, 0.5453125, 0.715625, 0.6078125, 0.8640625, 0.653125, 0.9125, 0.6484375, 0.946875, 0.6921875, 0.653125, 0.6953125, 0.8015625, 0.58125, 0.784375, 0.671875, 0.6265625, 0.690625, 0.4359375, 0.5296875, 0.4359375, 0.53125, 0.5, 0.2875, 0.5375, 0.603125, 0.4984375, 0.60625, 0.53125, 0.434375, 0.6421875, 0.56875, 0.209375, 0.4671875, 0.5484375, 0.2203125, 0.709375, 0.55, 0.5984375, 0.6140625, 0.5765625, 0.40625, 0.4734375, 0.3734375, 0.559375, 0.4421875, 0.6421875, 0.4890625, 0.578125, 0.4484375, 0.2546875, 0.2203125, 0.2546875, 0.55],\n avg: 0.536496710526316\n },\n Geneva: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.3328125, 0.3046875, 0.5, 0.6671875, 0.6671875, 0.90625, 0.728125, 0.3046875, 0.446875, 0.446875, 0.5078125, 0.6671875, 0.3046875, 0.3796875, 0.3046875, 0.5390625, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.6671875, 0.3046875, 0.3046875, 0.6671875, 0.6671875, 0.6671875, 0.56875, 0.871875, 0.728125, 0.6375, 0.6515625, 0.7015625, 0.5765625, 0.5546875, 0.675, 0.690625, 0.2421875, 0.4921875, 0.6640625, 0.584375, 0.7890625, 0.709375, 0.7359375, 0.584375, 0.78125, 0.60625, 0.60625, 0.640625, 0.6671875, 0.728125, 0.946875, 0.6109375, 0.6109375, 0.5765625, 0.446875, 0.5390625, 0.446875, 0.6671875, 0.6671875, 0.5921875, 0.5546875, 0.6109375, 0.546875, 0.603125, 0.5765625, 0.390625, 0.6109375, 0.584375, 0.2359375, 0.334375, 0.5390625, 0.2359375, 0.8953125, 0.584375, 0.60625, 0.603125, 0.603125, 0.3875, 0.509375, 0.44375, 0.584375, 0.565625, 0.78125, 0.53125, 0.571875, 0.5546875, 0.4515625, 0.246875, 0.4515625, 0.6671875],\n avg: 0.5762664473684211\n },\n Georgia: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2421875, 0.33125, 0.4125, 0.64375, 0.6109375, 0.81875, 0.7109375, 0.215625, 0.375, 0.375, 0.4734375, 0.64375, 0.2703125, 0.375, 0.2703125, 0.46875, 0.6140625, 0.4296875, 0.559375, 0.553125, 0.565625, 0.5296875, 0.5671875, 0.503125, 0.596875, 0.5671875, 0.3125, 0.3125, 0.64375, 0.64375, 0.64375, 0.4796875, 0.9296875, 0.715625, 0.6546875, 0.6421875, 0.75, 0.6546875, 0.6, 0.7265625, 0.815625, 0.390625, 0.51875, 0.7203125, 0.6046875, 0.928125, 0.7671875, 0.7453125, 0.6109375, 0.7453125, 0.7234375, 0.5625, 0.61875, 0.7578125, 0.70625, 0.99375, 0.7125, 0.6640625, 0.6015625, 0.375, 0.46875, 0.375, 0.64375, 0.65, 0.5, 0.5046875, 0.56875, 0.4546875, 0.575, 0.484375, 0.39375, 0.509375, 0.5828125, 0.29375, 0.3671875, 0.546875, 0.2875, 0.88125, 0.5921875, 0.5390625, 0.571875, 0.5640625, 0.4109375, 0.4328125, 0.3453125, 0.5765625, 0.5203125, 0.75625, 0.50625, 0.5171875, 0.4453125, 0.43125, 0.375, 0.43125, 0.64375],\n avg: 0.5551809210526316\n },\n "Gill Sans": {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2765625, 0.271875, 0.3546875, 0.584375, 0.5421875, 0.6765625, 0.625, 0.1890625, 0.3234375, 0.3234375, 0.4171875, 0.584375, 0.2203125, 0.3234375, 0.2203125, 0.28125, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.2203125, 0.2296875, 0.584375, 0.584375, 0.584375, 0.334375, 1.0109375, 0.6671875, 0.5640625, 0.709375, 0.75, 0.5, 0.4703125, 0.740625, 0.7296875, 0.25, 0.3125, 0.65625, 0.490625, 0.78125, 0.78125, 0.8234375, 0.5109375, 0.8234375, 0.6046875, 0.459375, 0.6046875, 0.709375, 0.6046875, 1.0421875, 0.709375, 0.6046875, 0.646875, 0.334375, 0.28125, 0.334375, 0.4703125, 0.5828125, 0.334375, 0.428125, 0.5, 0.4390625, 0.5109375, 0.4796875, 0.296875, 0.428125, 0.5, 0.2203125, 0.2265625, 0.5, 0.2203125, 0.771875, 0.5, 0.553125, 0.5, 0.5, 0.3984375, 0.3859375, 0.334375, 0.5, 0.4390625, 0.7203125, 0.5, 0.4390625, 0.4171875, 0.334375, 0.2609375, 0.334375, 0.584375],\n avg: 0.4933717105263159\n },\n Helvetica: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2796875, 0.2765625, 0.3546875, 0.5546875, 0.5546875, 0.8890625, 0.665625, 0.190625, 0.3328125, 0.3328125, 0.3890625, 0.5828125, 0.2765625, 0.3328125, 0.2765625, 0.3015625, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.2765625, 0.2765625, 0.584375, 0.5828125, 0.584375, 0.5546875, 1.0140625, 0.665625, 0.665625, 0.721875, 0.721875, 0.665625, 0.609375, 0.7765625, 0.721875, 0.2765625, 0.5, 0.665625, 0.5546875, 0.8328125, 0.721875, 0.7765625, 0.665625, 0.7765625, 0.721875, 0.665625, 0.609375, 0.721875, 0.665625, 0.94375, 0.665625, 0.665625, 0.609375, 0.2765625, 0.3546875, 0.2765625, 0.4765625, 0.5546875, 0.3328125, 0.5546875, 0.5546875, 0.5, 0.5546875, 0.5546875, 0.2765625, 0.5546875, 0.5546875, 0.221875, 0.240625, 0.5, 0.221875, 0.8328125, 0.5546875, 0.5546875, 0.5546875, 0.5546875, 0.3328125, 0.5, 0.2765625, 0.5546875, 0.5, 0.721875, 0.5, 0.5, 0.5, 0.3546875, 0.259375, 0.353125, 0.5890625],\n avg: 0.5279276315789471\n },\n "Helvetica Neue": {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.278125, 0.259375, 0.4265625, 0.55625, 0.55625, 1, 0.6453125, 0.278125, 0.2703125, 0.26875, 0.353125, 0.6, 0.278125, 0.3890625, 0.278125, 0.36875, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.278125, 0.278125, 0.6, 0.6, 0.6, 0.55625, 0.8, 0.6625, 0.6859375, 0.7234375, 0.7046875, 0.6125, 0.575, 0.759375, 0.7234375, 0.259375, 0.5203125, 0.6703125, 0.55625, 0.871875, 0.7234375, 0.7609375, 0.6484375, 0.7609375, 0.6859375, 0.6484375, 0.575, 0.7234375, 0.6140625, 0.9265625, 0.6125, 0.6484375, 0.6125, 0.259375, 0.36875, 0.259375, 0.6, 0.5, 0.25625, 0.5375, 0.59375, 0.5375, 0.59375, 0.5375, 0.2984375, 0.575, 0.55625, 0.2234375, 0.2375, 0.5203125, 0.2234375, 0.853125, 0.55625, 0.575, 0.59375, 0.59375, 0.334375, 0.5, 0.315625, 0.55625, 0.5, 0.759375, 0.51875, 0.5, 0.48125, 0.334375, 0.2234375, 0.334375, 0.6],\n avg: 0.5279440789473684\n },\n "Hoefler Text": {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2359375, 0.2234375, 0.3921875, 0.7125, 0.49375, 0.8859375, 0.771875, 0.2125, 0.3078125, 0.309375, 0.375, 0.4234375, 0.234375, 0.3125, 0.234375, 0.3, 0.5828125, 0.365625, 0.434375, 0.3921875, 0.5234375, 0.3984375, 0.5125, 0.4328125, 0.46875, 0.5125, 0.234375, 0.234375, 0.515625, 0.4234375, 0.515625, 0.340625, 0.7609375, 0.7359375, 0.6359375, 0.721875, 0.8125, 0.6375, 0.5875, 0.8078125, 0.853125, 0.4296875, 0.503125, 0.78125, 0.609375, 0.9609375, 0.8515625, 0.8140625, 0.6125, 0.8140625, 0.71875, 0.49375, 0.7125, 0.76875, 0.771875, 1.125, 0.7765625, 0.7734375, 0.65625, 0.321875, 0.3078125, 0.321875, 0.3546875, 0.5, 0.3375, 0.446875, 0.5359375, 0.45, 0.5296875, 0.4546875, 0.425, 0.4921875, 0.54375, 0.2671875, 0.240625, 0.5390625, 0.25, 0.815625, 0.5375, 0.5234375, 0.5390625, 0.5421875, 0.365625, 0.36875, 0.35625, 0.5171875, 0.5015625, 0.75, 0.5, 0.509375, 0.44375, 0.2421875, 0.14375, 0.2421875, 0.35],\n avg: 0.5116447368421051\n },\n "Montserrat": {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2625, 0.2609375, 0.3734375, 0.696875, 0.615625, 0.8296875, 0.6703125, 0.203125, 0.3296875, 0.3296875, 0.3875, 0.575, 0.2125, 0.3828125, 0.2125, 0.3953125, 0.6625, 0.3625, 0.56875, 0.5640625, 0.6625, 0.5671875, 0.609375, 0.5890625, 0.6390625, 0.609375, 0.2125, 0.2125, 0.575, 0.575, 0.575, 0.5671875, 1.034375, 0.7171875, 0.7546875, 0.7203125, 0.8265625, 0.6703125, 0.634375, 0.7734375, 0.8140625, 0.303125, 0.5078125, 0.7125, 0.5890625, 0.95625, 0.8140625, 0.8390625, 0.71875, 0.8390625, 0.7234375, 0.615625, 0.575, 0.7921875, 0.6984375, 1.1125, 0.65625, 0.6359375, 0.6515625, 0.31875, 0.396875, 0.31875, 0.5765625, 0.5, 0.6, 0.590625, 0.678125, 0.5640625, 0.678125, 0.6046875, 0.375, 0.6875, 0.678125, 0.2703125, 0.365625, 0.6015625, 0.2703125, 1.0625, 0.678125, 0.628125, 0.678125, 0.678125, 0.4015625, 0.4890625, 0.40625, 0.6734375, 0.5421875, 0.8796875, 0.534375, 0.5671875, 0.5125, 0.334375, 0.2953125, 0.334375, 0.575],\n avg: 0.571792763157895\n },\n monospace: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5984375, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6078125, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.61875, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.615625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6140625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625, 0.6015625],\n avg: 0.6020559210526316\n },\n Overpass: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2296875, 0.2765625, 0.4203125, 0.68125, 0.584375, 0.8515625, 0.7015625, 0.2203125, 0.3453125, 0.3453125, 0.53125, 0.63125, 0.2234375, 0.3953125, 0.2234375, 0.509375, 0.65, 0.4046875, 0.6171875, 0.60625, 0.6484375, 0.60625, 0.6015625, 0.5375, 0.615625, 0.6015625, 0.2234375, 0.2234375, 0.63125, 0.63125, 0.63125, 0.5015625, 0.8203125, 0.696875, 0.6671875, 0.65, 0.6859375, 0.6015625, 0.559375, 0.690625, 0.7078125, 0.2953125, 0.565625, 0.678125, 0.58125, 0.8046875, 0.7109375, 0.740625, 0.6421875, 0.740625, 0.6765625, 0.6046875, 0.590625, 0.696875, 0.6640625, 0.853125, 0.65, 0.6671875, 0.6625, 0.3734375, 0.509375, 0.3734375, 0.63125, 0.5125, 0.4, 0.5328125, 0.5625, 0.51875, 0.5625, 0.546875, 0.3359375, 0.5625, 0.565625, 0.25625, 0.3203125, 0.55, 0.265625, 0.85, 0.565625, 0.5671875, 0.5625, 0.5625, 0.4046875, 0.4765625, 0.3796875, 0.565625, 0.521875, 0.7265625, 0.53125, 0.5390625, 0.5125, 0.3671875, 0.275, 0.3671875, 0.63125],\n avg: 0.5430756578947369\n },\n Palatino: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.278125, 0.371875, 0.60625, 0.5, 0.840625, 0.778125, 0.209375, 0.334375, 0.334375, 0.390625, 0.60625, 0.2578125, 0.334375, 0.25, 0.60625, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.25, 0.25, 0.60625, 0.60625, 0.60625, 0.4453125, 0.7484375, 0.778125, 0.6109375, 0.709375, 0.775, 0.6109375, 0.55625, 0.7640625, 0.8328125, 0.3375, 0.346875, 0.7265625, 0.6109375, 0.946875, 0.83125, 0.7875, 0.6046875, 0.7875, 0.66875, 0.525, 0.6140625, 0.778125, 0.7234375, 1, 0.6671875, 0.6671875, 0.6671875, 0.334375, 0.60625, 0.334375, 0.60625, 0.5, 0.334375, 0.5, 0.565625, 0.4453125, 0.6109375, 0.4796875, 0.340625, 0.55625, 0.5828125, 0.2921875, 0.2671875, 0.5640625, 0.2921875, 0.8828125, 0.5828125, 0.546875, 0.6015625, 0.5609375, 0.3953125, 0.425, 0.3265625, 0.603125, 0.565625, 0.834375, 0.5171875, 0.55625, 0.5, 0.334375, 0.60625, 0.334375, 0.60625],\n avg: 0.5408552631578947\n },\n "RedHatText": {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2328125, 0.2203125, 0.35625, 0.6890625, 0.55, 0.7390625, 0.6703125, 0.2140625, 0.4015625, 0.4015625, 0.4546875, 0.53125, 0.2203125, 0.45625, 0.2203125, 0.515625, 0.6609375, 0.3078125, 0.5484375, 0.5875, 0.61875, 0.5703125, 0.6203125, 0.559375, 0.6140625, 0.6203125, 0.2203125, 0.2234375, 0.465625, 0.534375, 0.465625, 0.5125, 0.7671875, 0.6609375, 0.6703125, 0.7265625, 0.728125, 0.6203125, 0.6109375, 0.8, 0.73125, 0.253125, 0.6, 0.6125, 0.6078125, 0.8625, 0.7390625, 0.8109375, 0.6546875, 0.809375, 0.6484375, 0.6234375, 0.6171875, 0.7125, 0.6609375, 0.8984375, 0.6546875, 0.646875, 0.60625, 0.3625, 0.5203125, 0.3625, 0.540625, 0.4609375, 0.5234375, 0.5265625, 0.584375, 0.509375, 0.5828125, 0.5578125, 0.3703125, 0.5828125, 0.553125, 0.2234375, 0.24375, 0.4890625, 0.2234375, 0.8453125, 0.553125, 0.58125, 0.584375, 0.5828125, 0.353125, 0.453125, 0.378125, 0.553125, 0.5015625, 0.6984375, 0.4875, 0.4984375, 0.459375, 0.3953125, 0.2921875, 0.3953125, 0.58125],\n avg: 0.5341940789473685\n },\n "sans-serif": {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.278125, 0.278125, 0.35625, 0.55625, 0.55625, 0.890625, 0.6671875, 0.1921875, 0.334375, 0.334375, 0.390625, 0.584375, 0.278125, 0.334375, 0.278125, 0.303125, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.55625, 0.278125, 0.278125, 0.5859375, 0.584375, 0.5859375, 0.55625, 1.015625, 0.6671875, 0.6671875, 0.7234375, 0.7234375, 0.6671875, 0.6109375, 0.778125, 0.7234375, 0.278125, 0.5, 0.6671875, 0.55625, 0.834375, 0.7234375, 0.778125, 0.6671875, 0.778125, 0.7234375, 0.6671875, 0.6109375, 0.7234375, 0.6671875, 0.9453125, 0.6671875, 0.6671875, 0.6109375, 0.278125, 0.35625, 0.278125, 0.478125, 0.55625, 0.334375, 0.55625, 0.55625, 0.5, 0.55625, 0.55625, 0.278125, 0.55625, 0.55625, 0.2234375, 0.2421875, 0.5, 0.2234375, 0.834375, 0.55625, 0.55625, 0.55625, 0.55625, 0.334375, 0.5, 0.278125, 0.55625, 0.5, 0.7234375, 0.5, 0.5, 0.5, 0.35625, 0.2609375, 0.3546875, 0.590625],\n avg: 0.5293256578947368\n },\n Seravek: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.215625, 0.296875, 0.4171875, 0.6734375, 0.4953125, 0.9125, 0.740625, 0.2421875, 0.3375, 0.3375, 0.409375, 0.60625, 0.2609375, 0.35625, 0.25625, 0.41875, 0.5921875, 0.3515625, 0.475, 0.4875, 0.5375, 0.509375, 0.5484375, 0.4546875, 0.5421875, 0.5484375, 0.25625, 0.2546875, 0.5875, 0.6171875, 0.5875, 0.4578125, 0.8140625, 0.6765625, 0.5703125, 0.6109375, 0.684375, 0.5109375, 0.4953125, 0.678125, 0.6859375, 0.2625, 0.2625, 0.5859375, 0.4734375, 0.846875, 0.709375, 0.740625, 0.509375, 0.740625, 0.584375, 0.5015625, 0.528125, 0.675, 0.5953125, 0.9453125, 0.596875, 0.540625, 0.540625, 0.359375, 0.4203125, 0.359375, 0.5109375, 0.421875, 0.4046875, 0.5015625, 0.5421875, 0.446875, 0.5453125, 0.484375, 0.38125, 0.5140625, 0.5546875, 0.240625, 0.2640625, 0.490625, 0.2765625, 0.8625, 0.5546875, 0.546875, 0.5453125, 0.5453125, 0.3625, 0.41875, 0.3890625, 0.5453125, 0.4703125, 0.7546875, 0.4921875, 0.4609375, 0.453125, 0.4015625, 0.2640625, 0.4015625, 0.58125],\n avg: 0.5044078947368421\n },\n serif: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2484375, 0.334375, 0.409375, 0.5, 0.5, 0.834375, 0.778125, 0.18125, 0.334375, 0.334375, 0.5, 0.5640625, 0.25, 0.334375, 0.25, 0.278125, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.278125, 0.278125, 0.5640625, 0.5640625, 0.5640625, 0.4453125, 0.921875, 0.7234375, 0.6671875, 0.6671875, 0.7234375, 0.6109375, 0.55625, 0.7234375, 0.7234375, 0.334375, 0.390625, 0.7234375, 0.6109375, 0.890625, 0.7234375, 0.7234375, 0.55625, 0.7234375, 0.6671875, 0.55625, 0.6109375, 0.7234375, 0.7234375, 0.9453125, 0.7234375, 0.7234375, 0.6109375, 0.334375, 0.340625, 0.334375, 0.4703125, 0.5, 0.3453125, 0.4453125, 0.5, 0.4453125, 0.5, 0.4453125, 0.3828125, 0.5, 0.5, 0.278125, 0.3359375, 0.5, 0.278125, 0.778125, 0.5, 0.5, 0.5, 0.5, 0.3375, 0.390625, 0.2796875, 0.5, 0.5, 0.7234375, 0.5, 0.5, 0.4453125, 0.48125, 0.2015625, 0.48125, 0.5421875],\n avg: 0.5126315789473684\n },\n Tahoma: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.3109375, 0.3328125, 0.4015625, 0.728125, 0.546875, 0.9765625, 0.70625, 0.2109375, 0.3828125, 0.3828125, 0.546875, 0.728125, 0.303125, 0.3640625, 0.303125, 0.3953125, 0.546875, 0.546875, 0.546875, 0.546875, 0.546875, 0.546875, 0.546875, 0.546875, 0.546875, 0.546875, 0.3546875, 0.3546875, 0.728125, 0.728125, 0.728125, 0.475, 0.909375, 0.6109375, 0.590625, 0.6015625, 0.6796875, 0.5625, 0.521875, 0.66875, 0.6765625, 0.3734375, 0.4171875, 0.6046875, 0.4984375, 0.771875, 0.66875, 0.7078125, 0.5515625, 0.7078125, 0.6375, 0.5578125, 0.5875, 0.65625, 0.60625, 0.903125, 0.58125, 0.5890625, 0.559375, 0.3828125, 0.39375, 0.3828125, 0.728125, 0.5625, 0.546875, 0.525, 0.553125, 0.4625, 0.553125, 0.5265625, 0.3546875, 0.553125, 0.5578125, 0.2296875, 0.328125, 0.51875, 0.2296875, 0.840625, 0.5578125, 0.54375, 0.553125, 0.553125, 0.3609375, 0.446875, 0.3359375, 0.5578125, 0.4984375, 0.7421875, 0.4953125, 0.4984375, 0.4453125, 0.48125, 0.3828125, 0.48125, 0.728125],\n avg: 0.5384374999999998\n },\n "Times New Roman": {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2484375, 0.334375, 0.409375, 0.5, 0.5, 0.834375, 0.778125, 0.18125, 0.334375, 0.334375, 0.5, 0.5640625, 0.25, 0.334375, 0.25, 0.28125, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.278125, 0.278125, 0.5640625, 0.5640625, 0.5640625, 0.4453125, 0.921875, 0.7234375, 0.6671875, 0.6671875, 0.7234375, 0.6109375, 0.55625, 0.7234375, 0.7234375, 0.334375, 0.390625, 0.73125, 0.6109375, 0.890625, 0.7375, 0.7234375, 0.55625, 0.7234375, 0.6765625, 0.55625, 0.6109375, 0.7234375, 0.7234375, 0.9453125, 0.7234375, 0.7234375, 0.6109375, 0.334375, 0.28125, 0.334375, 0.4703125, 0.51875, 0.334375, 0.4453125, 0.503125, 0.4453125, 0.503125, 0.4453125, 0.4359375, 0.5, 0.5, 0.278125, 0.35625, 0.50625, 0.278125, 0.778125, 0.5, 0.5, 0.5046875, 0.5, 0.340625, 0.390625, 0.2796875, 0.5, 0.5, 0.7234375, 0.5, 0.5, 0.4453125, 0.48125, 0.2015625, 0.48125, 0.5421875],\n avg: 0.5134375\n },\n "Trebuchet MS": {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.3015625, 0.3671875, 0.325, 0.53125, 0.525, 0.6015625, 0.70625, 0.1609375, 0.3671875, 0.3671875, 0.3671875, 0.525, 0.3671875, 0.3671875, 0.3671875, 0.525, 0.525, 0.525, 0.525, 0.525, 0.525, 0.525, 0.525, 0.525, 0.525, 0.525, 0.3671875, 0.3671875, 0.525, 0.525, 0.525, 0.3671875, 0.771875, 0.590625, 0.5671875, 0.5984375, 0.6140625, 0.5359375, 0.525, 0.6765625, 0.6546875, 0.2796875, 0.4765625, 0.5765625, 0.5078125, 0.7109375, 0.6390625, 0.675, 0.5578125, 0.7421875, 0.5828125, 0.48125, 0.58125, 0.6484375, 0.5875, 0.853125, 0.5578125, 0.5703125, 0.5515625, 0.3671875, 0.3578125, 0.3671875, 0.525, 0.53125, 0.525, 0.5265625, 0.5578125, 0.4953125, 0.5578125, 0.546875, 0.375, 0.503125, 0.546875, 0.2859375, 0.3671875, 0.5046875, 0.2953125, 0.83125, 0.546875, 0.5375, 0.5578125, 0.5578125, 0.3890625, 0.40625, 0.396875, 0.546875, 0.490625, 0.7453125, 0.5015625, 0.49375, 0.475, 0.3671875, 0.525, 0.3671875, 0.525],\n avg: 0.5085197368421052\n },\n Verdana: {\n widths: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.35, 0.39375, 0.459375, 0.81875, 0.6359375, 1.0765625, 0.759375, 0.26875, 0.4546875, 0.4546875, 0.6359375, 0.81875, 0.3640625, 0.4546875, 0.3640625, 0.4703125, 0.6359375, 0.6359375, 0.6359375, 0.6359375, 0.6359375, 0.6359375, 0.6359375, 0.6359375, 0.6359375, 0.6359375, 0.4546875, 0.4546875, 0.81875, 0.81875, 0.81875, 0.546875, 1, 0.684375, 0.6859375, 0.6984375, 0.771875, 0.6328125, 0.575, 0.7765625, 0.7515625, 0.421875, 0.4546875, 0.69375, 0.5578125, 0.84375, 0.7484375, 0.7875, 0.603125, 0.7875, 0.7, 0.684375, 0.6171875, 0.7328125, 0.684375, 0.9890625, 0.6859375, 0.615625, 0.6859375, 0.4546875, 0.46875, 0.4546875, 0.81875, 0.6421875, 0.6359375, 0.6015625, 0.6234375, 0.521875, 0.6234375, 0.596875, 0.384375, 0.6234375, 0.6328125, 0.275, 0.3765625, 0.5921875, 0.275, 0.9734375, 0.6328125, 0.6078125, 0.6234375, 0.6234375, 0.43125, 0.521875, 0.3953125, 0.6328125, 0.5921875, 0.81875, 0.5921875, 0.5921875, 0.5265625, 0.6359375, 0.4546875, 0.6359375, 0.81875],\n avg: 0.6171875000000003\n } //https://developer.mozilla.org/en/docs/Web/CSS/length\n // Absolute sizes in pixels for obsolete measurement units.\n\n};\nvar absoluteMeasurementUnitsToPixels = {\n mm: 3.8,\n sm: 38,\n pt: 1.33,\n pc: 16,\n in: 96,\n px: 1\n};\nvar relativeMeasurementUnitsCoef = {\n em: 1,\n ex: 0.5\n};\nvar coefficients = {\n heightOverlapCoef: 1.05,\n // Coefficient for height value to prevent overlap.\n lineCapitalCoef: 1.15 // Coefficient for height value. Reserve space for capital chars.\n\n};\nvar defaultStyle = {\n lineHeight: 1,\n letterSpacing: "0px",\n fontSize: 0,\n angle: 0,\n fontFamily: ""\n};\n\nvar _degreeToRadian = function (angle) {\n return angle * Math.PI / 180;\n};\n\nvar _getFontData = function (fontFamily) {\n var possibleFonts = fontFamily.split(",").map(function (f) {\n return f.replace(/\'|"/g, "");\n });\n var fontMatch = possibleFonts.find(function (f) {\n return fonts[f];\n }) || "Helvetica";\n return fonts[fontMatch];\n};\n\nvar _splitToLines = function (text) {\n return Array.isArray(text) ? text : text.toString().split(/\\r\\n|\\r|\\n/g);\n};\n\nvar _getSizeWithRotate = function (axisSize, dependentSize, angle) {\n var angleInRadian = _degreeToRadian(angle);\n\n return Math.abs(Math.cos(angleInRadian) * axisSize) + Math.abs(Math.sin(angleInRadian) * dependentSize);\n};\n/**\n * Convert length-type parameters from specific measurement units to pixels\n * @param {string} length Css length string value.\n * @param {number} fontSize Current text font-size.\n * @returns {number} Approximate Css length in pixels.\n */\n\n\nvar convertLengthToPixels = function (length, fontSize) {\n var attribute = length.match(/[a-zA-Z%]+/) && length.match(/[a-zA-Z%]+/)[0];\n var value = length.match(/[0-9.,]+/);\n var result;\n\n if (!attribute) {\n result = value || 0;\n } else if (absoluteMeasurementUnitsToPixels.hasOwnProperty(attribute)) {\n result = value * absoluteMeasurementUnitsToPixels[attribute];\n } else if (relativeMeasurementUnitsCoef.hasOwnProperty(attribute)) {\n result = (fontSize ? value * fontSize : value * defaultStyle.fontSize) * relativeMeasurementUnitsCoef[attribute];\n } else {\n result = value;\n }\n\n return result;\n};\n\nvar _prepareParams = function (inputStyle, index) {\n var lineStyle = Array.isArray(inputStyle) ? inputStyle[index] : inputStyle;\n\n var style = defaults_default()({}, lineStyle, defaultStyle);\n\n return assign_default()({}, style, {\n fontFamily: style.fontFamily,\n letterSpacing: typeof style.letterSpacing === "number" ? style.letterSpacing : convertLengthToPixels(String(style.letterSpacing), style.fontSize),\n fontSize: typeof style.fontSize === "number" ? style.fontSize : convertLengthToPixels(String(style.fontSize))\n });\n};\n\nvar _approximateTextWidthInternal = function (text, style) {\n if (text === undefined || text === "" || text === null) {\n return 0;\n }\n\n var widths = _splitToLines(text).map(function (line, index) {\n var len = line.toString().length;\n\n var _prepareParams2 = _prepareParams(style, index),\n fontSize = _prepareParams2.fontSize,\n letterSpacing = _prepareParams2.letterSpacing,\n fontFamily = _prepareParams2.fontFamily;\n\n var fontData = _getFontData(fontFamily);\n\n var width = line.toString().split("").map(function (c) {\n return c.charCodeAt(0) < fontData.widths.length ? fontData.widths[c.charCodeAt(0)] : fontData.avg;\n }).reduce(function (cur, acc) {\n return acc + cur;\n }, 0) * fontSize;\n return width + letterSpacing * Math.max(len - 1, 0);\n });\n\n return Math.max.apply(Math, textsize_toConsumableArray(widths));\n};\n\nvar _approximateTextHeightInternal = function (text, style) {\n if (text === undefined || text === "" || text === null) {\n return 0;\n }\n\n return _splitToLines(text).reduce(function (total, line, index) {\n var lineStyle = _prepareParams(style, index);\n\n var containsCaps = line.toString().match(/[(A-Z)(0-9)]/);\n var height = containsCaps ? lineStyle.fontSize * coefficients.lineCapitalCoef : lineStyle.fontSize;\n return total + lineStyle.lineHeight * height;\n }, 0);\n}; // Stubbable implementation.\n\n\nvar _approximateTextSizeInternal = {\n impl: function (text, style) {\n var angle = Array.isArray(style) ? style[0] && style[0].angle : style && style.angle;\n\n var height = _approximateTextHeightInternal(text, style);\n\n var width = _approximateTextWidthInternal(text, style);\n\n var widthWithRotate = angle ? _getSizeWithRotate(width, height, angle) : width;\n var heightWithRotate = angle ? _getSizeWithRotate(height, width, angle) : height;\n return {\n width: widthWithRotate,\n height: heightWithRotate * coefficients.heightOverlapCoef\n };\n }\n};\n/**\n * Predict text size by font params.\n * @param {string} text Content for width calculation.\n * @param {Object} style Text styles, ,fontFamily, fontSize, etc.\n * @param {string} style.fontFamily Text fontFamily.\n * @param {(number|string)} style.fontSize Text fontSize.\n * @param {number} style.angle Text rotate angle.\n * @param {string} style.letterSpacing Text letterSpacing(space between letters).\n * @param {number} style.lineHeight Line height coefficient.\n * @returns {number} Approximate text label height.\n */\n\nvar approximateTextSize = function (text, style) {\n return _approximateTextSizeInternal.impl(text, style);\n};\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-primitives/line.js\nfunction line_extends() { line_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return line_extends.apply(this, arguments); }\n\nfunction line_objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\n\n\nvar Line = function (props) {\n // eslint-disable-next-line react/prop-types\n var desc = props.desc,\n rest = line_objectWithoutProperties(props, ["desc"]);\n\n return desc ? react.createElement("line", line_extends({\n vectorEffect: "non-scaling-stroke"\n }, rest), react.createElement("desc", null, desc)) : react.createElement("line", line_extends({\n vectorEffect: "non-scaling-stroke"\n }, rest));\n};\n\n/* harmony default export */ const line = (Line);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-primitives/line-segment.js\n\n\nfunction line_segment_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { line_segment_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction line_segment_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nvar line_segment_evaluateProps = function (props) {\n /**\n * Potential evaluated props are:\n * `ariaLabel`\n * `desc`\n * `id`\n * `style`\n * `tabIndex`\n */\n var ariaLabel = evaluateProp(props.ariaLabel, props);\n var desc = evaluateProp(props.desc, props);\n var id = evaluateProp(props.id, props);\n var style = evaluateStyle(assign_default()({\n stroke: "black"\n }, props.style), props);\n var tabIndex = evaluateProp(props.tabIndex, props);\n return assign_default()({}, props, {\n ariaLabel: ariaLabel,\n desc: desc,\n id: id,\n style: style,\n tabIndex: tabIndex\n });\n};\n\nvar LineSegment = function (props) {\n props = line_segment_evaluateProps(props);\n return react.cloneElement(props.lineComponent, line_segment_objectSpread({}, props.events, {\n "aria-label": props.ariaLabel,\n style: props.style,\n desc: props.desc,\n tabIndex: props.tabIndex,\n className: props.className,\n role: props.role,\n shapeRendering: props.shapeRendering,\n x1: props.x1,\n x2: props.x2,\n y1: props.y1,\n y2: props.y2,\n transform: props.transform,\n clipPath: props.clipPath\n }));\n};\n\nLineSegment.propTypes = line_segment_objectSpread({}, primitiveProps, {\n datum: (prop_types_default()).any,\n lineComponent: (prop_types_default()).element,\n x1: (prop_types_default()).number,\n x2: (prop_types_default()).number,\n y1: (prop_types_default()).number,\n y2: (prop_types_default()).number\n});\nLineSegment.defaultProps = {\n lineComponent: react.createElement(line, null),\n role: "presentation",\n shapeRendering: "auto"\n};\n/* harmony default export */ const line_segment = (LineSegment);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-portal/victory-portal.js\n\n\nfunction victory_portal_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_portal_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_portal_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_portal_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_portal_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_portal_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_portal_assertThisInitialized(self); }\n\nfunction victory_portal_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_portal_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\n\n\nvar VictoryPortal =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_portal_inherits(VictoryPortal, _React$Component);\n\n function VictoryPortal() {\n victory_portal_classCallCheck(this, VictoryPortal);\n\n return victory_portal_possibleConstructorReturn(this, (VictoryPortal.__proto__ || Object.getPrototypeOf(VictoryPortal)).apply(this, arguments));\n }\n\n victory_portal_createClass(VictoryPortal, [{\n key: "componentDidMount",\n value: function componentDidMount() {\n if (!this.checkedContext) {\n if (typeof this.context.portalUpdate !== "function") {\n var msg = "`renderInPortal` is not supported outside of `VictoryContainer`. " + "Component will be rendered in place";\n warn(msg);\n this.renderInPlace = true;\n }\n\n this.checkedContext = true;\n }\n\n this.forceUpdate();\n }\n }, {\n key: "componentDidUpdate",\n value: function componentDidUpdate() {\n if (!this.renderInPlace) {\n this.portalKey = this.portalKey || this.context.portalRegister();\n this.context.portalUpdate(this.portalKey, this.element);\n }\n }\n }, {\n key: "componentWillUnmount",\n value: function componentWillUnmount() {\n if (this.context && this.context.portalDeregister) {\n this.context.portalDeregister(this.portalKey);\n }\n } // Overridden in victory-core-native\n\n }, {\n key: "renderPortal",\n value: function renderPortal(child) {\n if (this.renderInPlace) {\n return child;\n }\n\n this.element = child;\n return null;\n }\n }, {\n key: "render",\n value: function render() {\n var children = Array.isArray(this.props.children) ? this.props.children[0] : this.props.children;\n var groupComponent = this.props.groupComponent;\n var childProps = children && children.props || {};\n var standardProps = childProps.groupComponent ? {\n groupComponent: groupComponent,\n standalone: false\n } : {};\n\n var newProps = defaults_default()(standardProps, childProps, omit(this.props, ["children", "groupComponent"]));\n\n var child = children && react.cloneElement(children, newProps);\n return this.renderPortal(child);\n }\n }]);\n\n return VictoryPortal;\n}(react.Component);\n\nObject.defineProperty(VictoryPortal, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryPortal"\n});\nObject.defineProperty(VictoryPortal, "role", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "portal"\n});\nObject.defineProperty(VictoryPortal, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n children: (prop_types_default()).node,\n groupComponent: (prop_types_default()).element\n }\n});\nObject.defineProperty(VictoryPortal, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n groupComponent: react.createElement("g", null)\n }\n});\nObject.defineProperty(VictoryPortal, "contextType", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: portal_context\n});\n\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/label-helpers.js\n\n\n/* eslint-disable func-style */\n\n/* eslint-disable no-use-before-define */\n\n\n// Private Functions\nfunction getVerticalAnchor(props, datum) {\n datum = datum || {};\n var sign = datum._y >= 0 ? 1 : -1;\n var labelStyle = props.style && props.style.labels || {};\n\n if (datum.verticalAnchor || labelStyle.verticalAnchor) {\n return datum.verticalAnchor || labelStyle.verticalAnchor;\n } else if (!props.horizontal) {\n return sign >= 0 ? "end" : "start";\n } else {\n return "middle";\n }\n}\n\nfunction getTextAnchor(props, datum) {\n datum = datum || {};\n var style = props.style,\n horizontal = props.horizontal;\n var sign = datum._y >= 0 ? 1 : -1;\n var labelStyle = style && style.labels || {};\n\n if (datum.verticalAnchor || labelStyle.verticalAnchor) {\n return datum.verticalAnchor || labelStyle.verticalAnchor;\n } else if (!horizontal) {\n return "middle";\n } else {\n return sign >= 0 ? "start" : "end";\n }\n}\n\nfunction getAngle(props, datum) {\n datum = datum || {};\n var labelStyle = props.style && props.style.labels || {};\n return datum.angle === undefined ? labelStyle.angle : datum.angle;\n}\n\nfunction getPadding(props, datum) {\n datum = datum || {};\n var horizontal = props.horizontal,\n style = props.style;\n var labelStyle = style.labels || {};\n var defaultPadding = evaluateProp(labelStyle.padding, props) || 0;\n var sign = datum._y < 0 ? -1 : 1;\n return {\n x: horizontal ? sign * defaultPadding : 0,\n y: horizontal ? 0 : -1 * sign * defaultPadding\n };\n}\n\nfunction getOffset(props, datum) {\n if (props.polar) {\n return {};\n }\n\n var padding = getPadding(props, datum);\n return {\n dx: padding.x,\n dy: padding.y\n };\n}\n\nfunction getPosition(props, datum) {\n var polar = props.polar;\n\n var _Helpers$scalePoint = scalePoint(props, datum),\n x = _Helpers$scalePoint.x,\n y = _Helpers$scalePoint.y;\n\n if (!polar) {\n return {\n x: x,\n y: y\n };\n } else {\n var polarPadding = getPolarPadding(props, datum);\n return {\n x: x + polarPadding.x,\n y: y + polarPadding.y\n };\n }\n}\n\nfunction getPolarPadding(props, datum) {\n var style = props.style;\n var degrees = getDegrees(props, datum);\n var labelStyle = style.labels || {};\n var padding = evaluateProp(labelStyle.padding, props) || 0;\n var angle = degreesToRadians(degrees);\n return {\n x: padding * Math.cos(angle),\n y: -padding * Math.sin(angle)\n };\n}\n\nfunction getLabelPlacement(props) {\n var labelComponent = props.labelComponent,\n labelPlacement = props.labelPlacement,\n polar = props.polar;\n var defaultLabelPlacement = polar ? "perpendicular" : "vertical";\n return labelPlacement ? labelPlacement : labelComponent.props && labelComponent.props.labelPlacement || defaultLabelPlacement;\n}\n\nfunction getPolarOrientation(degrees) {\n // eslint-disable-next-line no-magic-numbers\n if (degrees < 45 || degrees > 315) {\n return "right"; // eslint-disable-next-line no-magic-numbers\n } else if (degrees >= 45 && degrees <= 135) {\n return "top"; // eslint-disable-next-line no-magic-numbers\n } else if (degrees > 135 && degrees < 225) {\n return "left";\n } else {\n return "bottom";\n }\n} // Exported Functions\n\n\nfunction getText(props, datum, index) {\n datum = datum || {};\n\n if (datum.label !== undefined) {\n return datum.label;\n }\n\n return Array.isArray(props.labels) ? props.labels[index] : props.labels;\n}\nfunction getPolarTextAnchor(props, degrees) {\n var labelPlacement = getLabelPlacement(props);\n\n if (labelPlacement === "perpendicular" || labelPlacement === "vertical" && (degrees === 90 || degrees === 270)) {\n return "middle";\n }\n\n return degrees <= 90 || degrees > 270 ? "start" : "end";\n}\nfunction getPolarVerticalAnchor(props, degrees) {\n var labelPlacement = getLabelPlacement(props);\n var orientation = getPolarOrientation(degrees);\n\n if (labelPlacement === "parallel" || orientation === "left" || orientation === "right") {\n return "middle";\n }\n\n return orientation === "top" ? "end" : "start";\n}\nfunction getPolarAngle(props, baseAngle) {\n var labelPlacement = props.labelPlacement,\n datum = props.datum;\n\n if (!labelPlacement || labelPlacement === "vertical") {\n return 0;\n }\n\n var degrees = baseAngle !== undefined ? baseAngle % 360 : getDegrees(props, datum);\n var sign = degrees > 90 && degrees < 180 || degrees > 270 ? 1 : -1;\n var angle = 0;\n\n if (degrees === 0 || degrees === 180) {\n angle = 90;\n } else if (degrees > 0 && degrees < 180) {\n angle = 90 - degrees;\n } else if (degrees > 180 && degrees < 360) {\n angle = 270 - degrees;\n }\n\n var labelRotation = labelPlacement === "perpendicular" ? 0 : 90;\n return angle + sign * labelRotation;\n}\nfunction getDegrees(props, datum) {\n var _Helpers$getPoint = getPoint(datum),\n x = _Helpers$getPoint.x;\n\n return radiansToDegrees(props.scale.x(x)) % 360;\n}\nfunction getProps(props, index) {\n var scale = props.scale,\n data = props.data,\n style = props.style,\n horizontal = props.horizontal,\n polar = props.polar,\n width = props.width,\n height = props.height,\n theme = props.theme,\n labelComponent = props.labelComponent,\n disableInlineStyles = props.disableInlineStyles;\n var datum = data[index];\n var degrees = getDegrees(props, datum);\n var textAnchor = polar ? getPolarTextAnchor(props, degrees) : getTextAnchor(props, datum);\n var verticalAnchor = polar ? getPolarVerticalAnchor(props, degrees) : getVerticalAnchor(props, datum);\n var angle = getAngle(props, datum);\n var text = getText(props, datum, index);\n var labelPlacement = getLabelPlacement(props);\n\n var _getPosition = getPosition(props, datum),\n x = _getPosition.x,\n y = _getPosition.y;\n\n var _getOffset = getOffset(props, datum),\n dx = _getOffset.dx,\n dy = _getOffset.dy;\n\n var labelProps = {\n angle: angle,\n data: data,\n datum: datum,\n disableInlineStyles: disableInlineStyles,\n horizontal: horizontal,\n index: index,\n polar: polar,\n scale: scale,\n labelPlacement: labelPlacement,\n text: text,\n textAnchor: textAnchor,\n verticalAnchor: verticalAnchor,\n x: x,\n y: y,\n dx: dx,\n dy: dy,\n width: width,\n height: height,\n style: style.labels\n };\n\n if (!isTooltip(labelComponent)) {\n return labelProps;\n }\n\n var tooltipTheme = theme && theme.tooltip || {};\n return defaults_default()({}, labelProps, omit(tooltipTheme, ["style"]));\n}\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-primitives/tspan.js\n\n\nvar TSpan = function (props) {\n return react.createElement("tspan", props);\n};\n\n/* harmony default export */ const tspan = (TSpan);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-primitives/text.js\nfunction text_objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\n\n\n\nvar Text = function (props) {\n var children = props.children,\n title = props.title,\n desc = props.desc,\n rest = text_objectWithoutProperties(props, ["children", "title", "desc"]);\n\n return react.createElement("text", rest, title && react.createElement("title", null, title), desc && react.createElement("desc", null, desc), children);\n};\n\nText.propTypes = {\n children: (prop_types_default()).node,\n desc: (prop_types_default()).string,\n title: (prop_types_default()).string\n};\n/* harmony default export */ const victory_primitives_text = (Text);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-label/victory-label.js\n\n\n\n\nfunction victory_label_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_label_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_label_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction victory_label_toConsumableArray(arr) { return victory_label_arrayWithoutHoles(arr) || victory_label_iterableToArray(arr) || victory_label_nonIterableSpread(); }\n\nfunction victory_label_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_label_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_label_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\n/*eslint no-magic-numbers: ["error", { "ignore": [-0.5, 0.5, 0, 1, 2] }]*/\n\n\n\n\n\n\n\n\n\n\n\n\nvar defaultStyles = {\n fill: "#252525",\n fontSize: 14,\n fontFamily: "\'Gill Sans\', \'Gill Sans MT\', \'Ser­avek\', \'Trebuchet MS\', sans-serif",\n stroke: "transparent"\n};\n\nvar victory_label_getPosition = function (props, dimension) {\n if (!props.datum) {\n return 0;\n }\n\n var scaledPoint = scalePoint(props, props.datum);\n return scaledPoint[dimension];\n};\n\nvar getFontSize = function (style) {\n var baseSize = style && style.fontSize;\n\n if (typeof baseSize === "number") {\n return baseSize;\n } else if (baseSize === undefined || baseSize === null) {\n return defaultStyles.fontSize;\n } else if (typeof baseSize === "string") {\n var fontSize = +baseSize.replace("px", "");\n\n if (!isNaN(fontSize)) {\n return fontSize;\n } else {\n warn("fontSize should be expressed as a number of pixels");\n return defaultStyles.fontSize;\n }\n }\n\n return defaultStyles.fontSize;\n};\n\nvar getSingleValue = function (prop) {\n var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n return Array.isArray(prop) ? prop[index] || prop[0] : prop;\n};\n\nvar shouldUseMultilineBackgrounds = function (props) {\n var backgroundStyle = props.backgroundStyle,\n backgroundPadding = props.backgroundPadding;\n return Array.isArray(backgroundStyle) && !isEmpty_default()(backgroundStyle) || Array.isArray(backgroundPadding) && !isEmpty_default()(backgroundPadding);\n};\n\nvar victory_label_getStyles = function (style, props) {\n if (props.disableInlineStyles) {\n var baseStyles = evaluateStyle(style, props);\n return {\n // Font size is necessary to calculate the y position of the label\n fontSize: getFontSize(baseStyles)\n };\n }\n\n var getSingleStyle = function (s) {\n s = s ? defaults_default()({}, s, defaultStyles) : defaultStyles;\n var baseStyles = evaluateStyle(s, props);\n return assign_default()({}, baseStyles, {\n fontSize: getFontSize(baseStyles)\n });\n };\n\n return Array.isArray(style) && !isEmpty_default()(style) ? style.map(function (s) {\n return getSingleStyle(s);\n }) : getSingleStyle(style);\n};\n\nvar getBackgroundStyles = function (style, props) {\n if (!style) {\n return undefined;\n }\n\n return Array.isArray(style) && !isEmpty_default()(style) ? style.map(function (s) {\n return evaluateStyle(s, props);\n }) : evaluateStyle(style, props);\n};\n\nvar getBackgroundPadding = function (props) {\n if (props.backgroundPadding && Array.isArray(props.backgroundPadding)) {\n return props.backgroundPadding.map(function (backgroundPadding) {\n var padding = evaluateProp(backgroundPadding, props);\n return helpers_getPadding({\n padding: padding\n });\n });\n } else {\n var padding = evaluateProp(props.backgroundPadding, props);\n return helpers_getPadding({\n padding: padding\n });\n }\n};\n\nvar getLineHeight = function (props) {\n var lineHeight = evaluateProp(props.lineHeight, props);\n\n if (Array.isArray(lineHeight)) {\n return isEmpty_default()(lineHeight) ? [1] : lineHeight;\n } else {\n return lineHeight;\n }\n};\n\nvar getContent = function (text, props) {\n if (text === undefined || text === null) {\n return undefined;\n }\n\n if (Array.isArray(text)) {\n return text.map(function (line) {\n return evaluateProp(line, props);\n });\n }\n\n var child = evaluateProp(text, props);\n\n if (child === undefined || child === null) {\n return undefined;\n }\n\n return Array.isArray(child) ? child : "".concat(child).split("\\n");\n};\n\nvar getDy = function (props, verticalAnchor, lineHeight) {\n var dy = props.dy ? evaluateProp(props.dy, props) : 0;\n var length = props.inline ? 1 : props.text.length;\n var capHeight = evaluateProp(props.capHeight, props);\n var anchor = verticalAnchor ? evaluateProp(verticalAnchor, props) : "middle";\n\n var fontSizes = victory_label_toConsumableArray(Array(length).keys()).map(function (i) {\n return getSingleValue(props.style, i).fontSize;\n });\n\n var lineHeights = victory_label_toConsumableArray(Array(length).keys()).map(function (i) {\n return getSingleValue(lineHeight, i);\n });\n\n if (anchor === "start") {\n return dy + (capHeight / 2 + lineHeights[0] / 2) * fontSizes[0];\n } else if (props.inline) {\n return anchor === "end" ? dy + (capHeight / 2 - lineHeights[0] / 2) * fontSizes[0] : dy + capHeight / 2 * fontSizes[0];\n } else if (length === 1) {\n return anchor === "end" ? dy + (capHeight / 2 + (0.5 - length) * lineHeights[0]) * fontSizes[0] : dy + (capHeight / 2 + (0.5 - length / 2) * lineHeights[0]) * fontSizes[0];\n } else {\n var allHeights = victory_label_toConsumableArray(Array(length).keys()).reduce(function (memo, i) {\n return memo + (capHeight / 2 + (0.5 - length) * lineHeights[i]) * fontSizes[i] / length;\n }, 0);\n\n return anchor === "end" ? dy + allHeights : dy + allHeights / 2 + capHeight / 2 * lineHeights[length - 1] * fontSizes[length - 1];\n }\n};\n\nvar getTransform = function (props, x, y) {\n var polar = props.polar;\n var style = getSingleValue(props.style);\n var defaultAngle = polar ? getPolarAngle(props) : 0;\n var baseAngle = style.angle === undefined ? evaluateProp(props.angle, props) : style.angle;\n var angle = baseAngle === undefined ? defaultAngle : baseAngle;\n var transform = props.transform || style.transform;\n var transformPart = transform && evaluateProp(transform, props);\n var rotatePart = angle && {\n rotate: [angle, x, y]\n };\n return transformPart || angle ? toTransformString(transformPart, rotatePart) : undefined;\n};\n\nvar getXCoordinate = function (calculatedProps, labelSizeWidth) {\n var direction = calculatedProps.direction,\n textAnchor = calculatedProps.textAnchor,\n x = calculatedProps.x,\n dx = calculatedProps.dx;\n\n if (direction === "rtl") {\n return x - labelSizeWidth;\n }\n\n switch (textAnchor) {\n case "middle":\n return Math.round(x - labelSizeWidth / 2);\n\n case "end":\n return Math.round(x - labelSizeWidth);\n\n default:\n // start\n return x + (dx || 0);\n }\n};\n\nvar getYCoordinate = function (calculatedProps, textHeight) {\n var verticalAnchor = calculatedProps.verticalAnchor,\n y = calculatedProps.y,\n _calculatedProps$orig = calculatedProps.originalDy,\n originalDy = _calculatedProps$orig === void 0 ? 0 : _calculatedProps$orig;\n var offset = y + originalDy;\n\n switch (verticalAnchor) {\n case "start":\n return Math.floor(offset);\n\n case "end":\n return Math.ceil(offset - textHeight);\n\n default:\n // middle\n return Math.floor(offset - textHeight / 2);\n }\n};\n\nvar getFullBackground = function (calculatedProps, tspanValues) {\n var _calculatedProps$dx = calculatedProps.dx,\n dx = _calculatedProps$dx === void 0 ? 0 : _calculatedProps$dx,\n transform = calculatedProps.transform,\n backgroundComponent = calculatedProps.backgroundComponent,\n backgroundStyle = calculatedProps.backgroundStyle,\n inline = calculatedProps.inline,\n backgroundPadding = calculatedProps.backgroundPadding,\n capHeight = calculatedProps.capHeight;\n var textSizes = tspanValues.map(function (tspan) {\n return tspan.textSize;\n });\n var height = inline ? Math.max.apply(Math, victory_label_toConsumableArray(textSizes.map(function (size) {\n return size.height;\n }))) : textSizes.reduce(function (memo, size, i) {\n var capHeightAdjustment = i ? 0 : capHeight / 2;\n return memo + size.height * (tspanValues[i].lineHeight - capHeightAdjustment);\n }, 0);\n var width = inline ? textSizes.reduce(function (memo, size, index) {\n var offset = index ? dx : 0;\n return memo + size.width + offset;\n }, 0) : Math.max.apply(Math, victory_label_toConsumableArray(textSizes.map(function (size) {\n return size.width;\n })));\n var xCoordinate = getXCoordinate(calculatedProps, width);\n var yCoordinate = getYCoordinate(calculatedProps, height);\n var backgroundProps = {\n key: "background",\n height: height + backgroundPadding.top + backgroundPadding.bottom,\n style: backgroundStyle,\n transform: transform,\n width: width + backgroundPadding.left + backgroundPadding.right,\n x: inline ? xCoordinate - backgroundPadding.left : xCoordinate + dx - backgroundPadding.left,\n y: yCoordinate\n };\n return react.cloneElement(backgroundComponent, defaults_default()({}, backgroundComponent.props, backgroundProps));\n};\n\nvar getInlineXOffset = function (calculatedProps, textElements, index) {\n var textAnchor = calculatedProps.textAnchor;\n var widths = textElements.map(function (t) {\n return t.widthWithPadding;\n });\n var totalWidth = widths.reduce(function (memo, width) {\n return memo + width;\n }, 0);\n var centerOffset = -totalWidth / 2;\n\n switch (textAnchor) {\n case "start":\n return widths.reduce(function (memo, width, i) {\n memo = i < index ? memo + width : memo;\n return memo;\n }, 0);\n\n case "end":\n return widths.reduce(function (memo, width, i) {\n memo = i > index ? memo - width : memo;\n return memo;\n }, 0);\n\n default:\n // middle\n return widths.reduce(function (memo, width, i) {\n var offsetWidth = i < index ? width : 0;\n memo = i === index ? memo + width / 2 : memo + offsetWidth;\n return memo;\n }, centerOffset);\n }\n};\n\nvar getChildBackgrounds = function (calculatedProps, tspanValues) {\n var dy = calculatedProps.dy,\n dx = calculatedProps.dx,\n transform = calculatedProps.transform,\n backgroundStyle = calculatedProps.backgroundStyle,\n backgroundPadding = calculatedProps.backgroundPadding,\n backgroundComponent = calculatedProps.backgroundComponent,\n inline = calculatedProps.inline,\n y = calculatedProps.y;\n var textElements = tspanValues.map(function (current, i) {\n var previous = getSingleValue(tspanValues, i - 1);\n var labelSize = current.textSize;\n var totalLineHeight = current.fontSize * current.lineHeight;\n var textHeight = Math.ceil(totalLineHeight);\n var padding = getSingleValue(backgroundPadding, i);\n var prevPadding = getSingleValue(backgroundPadding, i - 1);\n var xOffset = inline ? dx || 0 : 0;\n var childDy = i && !inline ? previous.fontSize * previous.lineHeight + prevPadding.top + prevPadding.bottom : dy - totalLineHeight * 0.5 - (current.fontSize - current.capHeight);\n return {\n textHeight: textHeight,\n labelSize: labelSize,\n heightWithPadding: textHeight + padding.top + padding.bottom,\n widthWithPadding: labelSize.width + padding.left + padding.right + xOffset,\n y: y,\n fontSize: current.fontSize,\n dy: childDy\n };\n });\n return textElements.map(function (textElement, i) {\n var xCoordinate = getXCoordinate(calculatedProps, textElement.labelSize.width);\n var yCoordinate = textElements.slice(0, i + 1).reduce(function (prev, curr) {\n return prev + curr.dy;\n }, y);\n var padding = getSingleValue(backgroundPadding, i);\n var height = textElement.heightWithPadding;\n var xCoord = inline ? getInlineXOffset(calculatedProps, textElements, i) + xCoordinate - padding.left : xCoordinate;\n var yCoord = inline ? getYCoordinate(calculatedProps, height) - padding.top : yCoordinate;\n var backgroundProps = {\n key: "tspan-background-".concat(i),\n height: height,\n style: getSingleValue(backgroundStyle, i),\n width: textElement.widthWithPadding,\n transform: transform,\n x: xCoord - padding.left,\n y: yCoord\n };\n return react.cloneElement(backgroundComponent, defaults_default()({}, backgroundComponent.props, backgroundProps));\n });\n};\n\nvar getBackgroundElement = function (calculatedProps, tspanValues) {\n return shouldUseMultilineBackgrounds(calculatedProps) ? getChildBackgrounds(calculatedProps, tspanValues) : getFullBackground(calculatedProps, tspanValues);\n};\n\nvar calculateSpanDy = function (tspanValues, i, calculatedProps) {\n var current = getSingleValue(tspanValues, i);\n var previous = getSingleValue(tspanValues, i - 1);\n var previousHeight = previous.fontSize * previous.lineHeight;\n var currentHeight = current.fontSize * current.lineHeight;\n var previousCaps = previous.fontSize - previous.capHeight;\n var currentCaps = current.fontSize - current.capHeight;\n var textHeight = previousHeight - previous.fontSize / 2 + current.fontSize / 2 - previousHeight / 2 + currentHeight / 2 - currentCaps / 2 + previousCaps / 2;\n return shouldUseMultilineBackgrounds(calculatedProps) ? textHeight + current.backgroundPadding.top + previous.backgroundPadding.bottom : textHeight;\n};\n\nvar getTSpanDy = function (tspanValues, calculatedProps, i) {\n var inline = calculatedProps.inline;\n var current = getSingleValue(tspanValues, i);\n\n if (i && !inline) {\n return calculateSpanDy(tspanValues, i, calculatedProps);\n } else if (inline) {\n return i === 0 ? current.backgroundPadding.top : undefined;\n } else {\n return current.backgroundPadding.top;\n }\n};\n\nvar victory_label_evaluateProps = function (props) {\n /* Potential evaluated props are\n 1) text\n 2) style\n 3) everything else\n */\n var text = getContent(props.text, props);\n var style = victory_label_getStyles(props.style, assign_default()({}, props, {\n text: text\n }));\n var backgroundStyle = getBackgroundStyles(props.backgroundStyle, assign_default()({}, props, {\n text: text,\n style: style\n }));\n var backgroundPadding = getBackgroundPadding(assign_default()({}, props, {\n text: text,\n style: style,\n backgroundStyle: backgroundStyle\n }));\n var id = evaluateProp(props.id, props);\n return assign_default()({}, props, {\n backgroundStyle: backgroundStyle,\n backgroundPadding: backgroundPadding,\n style: style,\n text: text,\n id: id\n });\n};\n\nvar getCalculatedProps = function (props) {\n var ariaLabel = evaluateProp(props.ariaLabel, props);\n var style = getSingleValue(props.style);\n var lineHeight = getLineHeight(props);\n var direction = props.direction ? evaluateProp(props.direction, props) : "inherit";\n var textAnchor = props.textAnchor ? evaluateProp(props.textAnchor, props) : style.textAnchor || "start";\n var verticalAnchor = props.verticalAnchor ? evaluateProp(props.verticalAnchor, props) : style.verticalAnchor || "middle";\n var dx = props.dx ? evaluateProp(props.dx, props) : 0;\n var dy = getDy(props, verticalAnchor, lineHeight);\n var x = props.x !== undefined ? props.x : victory_label_getPosition(props, "x");\n var y = props.y !== undefined ? props.y : victory_label_getPosition(props, "y");\n var transform = getTransform(props, x, y);\n return assign_default()({}, props, {\n ariaLabel: ariaLabel,\n lineHeight: lineHeight,\n direction: direction,\n textAnchor: textAnchor,\n verticalAnchor: verticalAnchor,\n dx: dx,\n dy: dy,\n originalDy: props.dy,\n transform: transform,\n x: x,\n y: y\n });\n};\n\nvar renderLabel = function (calculatedProps, tspanValues) {\n var ariaLabel = calculatedProps.ariaLabel,\n inline = calculatedProps.inline,\n className = calculatedProps.className,\n title = calculatedProps.title,\n events = calculatedProps.events,\n direction = calculatedProps.direction,\n text = calculatedProps.text,\n textAnchor = calculatedProps.textAnchor,\n dx = calculatedProps.dx,\n dy = calculatedProps.dy,\n transform = calculatedProps.transform,\n x = calculatedProps.x,\n y = calculatedProps.y,\n desc = calculatedProps.desc,\n id = calculatedProps.id,\n tabIndex = calculatedProps.tabIndex,\n tspanComponent = calculatedProps.tspanComponent,\n textComponent = calculatedProps.textComponent;\n\n var textProps = victory_label_objectSpread({\n "aria-label": ariaLabel,\n key: "text"\n }, events, {\n direction: direction,\n dx: dx,\n x: x,\n y: y + dy,\n transform: transform,\n className: className,\n title: title,\n desc: evaluateProp(desc, calculatedProps),\n tabIndex: evaluateProp(tabIndex, calculatedProps),\n id: id\n });\n\n var tspans = text.map(function (line, i) {\n var currentStyle = tspanValues[i].style;\n var tspanProps = {\n key: "".concat(id, "-key-").concat(i),\n x: !inline ? x : undefined,\n dx: inline ? dx + tspanValues[i].backgroundPadding.left : dx,\n dy: getTSpanDy(tspanValues, calculatedProps, i),\n textAnchor: currentStyle.textAnchor || textAnchor,\n style: currentStyle,\n children: line\n };\n return react.cloneElement(tspanComponent, tspanProps);\n });\n return react.cloneElement(textComponent, textProps, tspans);\n};\n\nvar VictoryLabel = function (props) {\n props = victory_label_evaluateProps(props);\n\n if (props.text === null || props.text === undefined) {\n return null;\n }\n\n var calculatedProps = getCalculatedProps(props);\n var text = calculatedProps.text,\n style = calculatedProps.style,\n capHeight = calculatedProps.capHeight,\n backgroundPadding = calculatedProps.backgroundPadding,\n lineHeight = calculatedProps.lineHeight;\n var tspanValues = text.map(function (line, i) {\n var currentStyle = getSingleValue(style, i);\n var capHeightPx = convertLengthToPixels("".concat(capHeight, "em"), currentStyle.fontSize);\n var currentLineHeight = getSingleValue(lineHeight, i);\n return {\n style: currentStyle,\n fontSize: currentStyle.fontSize || defaultStyles.fontSize,\n capHeight: capHeightPx,\n text: line,\n textSize: approximateTextSize(line, currentStyle),\n lineHeight: currentLineHeight,\n backgroundPadding: getSingleValue(backgroundPadding, i)\n };\n });\n var label = renderLabel(calculatedProps, tspanValues);\n\n if (props.backgroundStyle) {\n var backgroundElement = getBackgroundElement(calculatedProps, tspanValues);\n var children = [backgroundElement, label];\n var backgroundWithLabel = react.cloneElement(props.groupComponent, {}, children);\n return props.renderInPortal ? react.createElement(VictoryPortal, null, backgroundWithLabel) : backgroundWithLabel;\n }\n\n return props.renderInPortal ? react.createElement(VictoryPortal, null, label) : label;\n};\n\nVictoryLabel.displayName = "VictoryLabel";\nVictoryLabel.role = "label";\nVictoryLabel.defaultStyles = defaultStyles;\nVictoryLabel.propTypes = {\n active: (prop_types_default()).bool,\n angle: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).number, (prop_types_default()).func]),\n ariaLabel: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).func]),\n backgroundComponent: (prop_types_default()).element,\n backgroundPadding: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).object, (prop_types_default()).array]),\n backgroundStyle: prop_types_default().oneOfType([(prop_types_default()).object, (prop_types_default()).array]),\n capHeight: prop_types_default().oneOfType([(prop_types_default()).string, nonNegative, (prop_types_default()).func]),\n className: (prop_types_default()).string,\n data: (prop_types_default()).array,\n datum: (prop_types_default()).any,\n desc: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).func]),\n direction: prop_types_default().oneOf(["rtl", "ltr", "inherit"]),\n dx: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string, (prop_types_default()).func]),\n dy: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string, (prop_types_default()).func]),\n events: (prop_types_default()).object,\n groupComponent: (prop_types_default()).element,\n id: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string, (prop_types_default()).func]),\n index: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string]),\n inline: (prop_types_default()).bool,\n labelPlacement: prop_types_default().oneOf(["parallel", "perpendicular", "vertical"]),\n lineHeight: prop_types_default().oneOfType([(prop_types_default()).string, nonNegative, (prop_types_default()).func, (prop_types_default()).array]),\n origin: prop_types_default().shape({\n x: nonNegative,\n y: nonNegative\n }),\n polar: (prop_types_default()).bool,\n renderInPortal: (prop_types_default()).bool,\n scale: prop_types_default().shape({\n x: scale,\n y: scale\n }),\n style: prop_types_default().oneOfType([(prop_types_default()).object, (prop_types_default()).array]),\n tabIndex: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n text: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).number, (prop_types_default()).func, (prop_types_default()).array]),\n textAnchor: prop_types_default().oneOfType([prop_types_default().oneOf(["start", "middle", "end", "inherit"]), (prop_types_default()).func]),\n textComponent: (prop_types_default()).element,\n title: (prop_types_default()).string,\n transform: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).object, (prop_types_default()).func]),\n tspanComponent: (prop_types_default()).element,\n verticalAnchor: prop_types_default().oneOfType([prop_types_default().oneOf(["start", "middle", "end"]), (prop_types_default()).func]),\n x: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string]),\n y: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string])\n};\nVictoryLabel.defaultProps = {\n backgroundComponent: react.createElement(rect, null),\n groupComponent: react.createElement("g", null),\n direction: "inherit",\n textComponent: react.createElement(victory_primitives_text, null),\n tspanComponent: react.createElement(tspan, null),\n capHeight: 0.71,\n // Magic number from d3.\n lineHeight: 1\n};\n/* harmony default export */ const victory_label = (VictoryLabel);\n// EXTERNAL MODULE: ./node_modules/lodash/isNil.js\nvar isNil = __webpack_require__(4293);\nvar isNil_default = /*#__PURE__*/__webpack_require__.n(isNil);\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/linear.js\nfunction src_linear_linear(t) {\n return +t;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/quad.js\nfunction quadIn(t) {\n return t * t;\n}\n\nfunction quadOut(t) {\n return t * (2 - t);\n}\n\nfunction quadInOut(t) {\n return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/cubic.js\nfunction cubicIn(t) {\n return t * t * t;\n}\n\nfunction cubicOut(t) {\n return --t * t * t + 1;\n}\n\nfunction cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/poly.js\nvar poly_exponent = 3;\n\nvar polyIn = (function custom(e) {\n e = +e;\n\n function polyIn(t) {\n return Math.pow(t, e);\n }\n\n polyIn.exponent = custom;\n\n return polyIn;\n})(poly_exponent);\n\nvar polyOut = (function custom(e) {\n e = +e;\n\n function polyOut(t) {\n return 1 - Math.pow(1 - t, e);\n }\n\n polyOut.exponent = custom;\n\n return polyOut;\n})(poly_exponent);\n\nvar polyInOut = (function custom(e) {\n e = +e;\n\n function polyInOut(t) {\n return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\n }\n\n polyInOut.exponent = custom;\n\n return polyInOut;\n})(poly_exponent);\n\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/sin.js\nvar pi = Math.PI,\n halfPi = pi / 2;\n\nfunction sinIn(t) {\n return (+t === 1) ? 1 : 1 - Math.cos(t * halfPi);\n}\n\nfunction sinOut(t) {\n return Math.sin(t * halfPi);\n}\n\nfunction sinInOut(t) {\n return (1 - Math.cos(pi * t)) / 2;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/math.js\n// tpmt is two power minus ten times t scaled to [0,1]\nfunction tpmt(x) {\n return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/exp.js\n\n\nfunction expIn(t) {\n return tpmt(1 - +t);\n}\n\nfunction expOut(t) {\n return 1 - tpmt(t);\n}\n\nfunction expInOut(t) {\n return ((t *= 2) <= 1 ? tpmt(1 - t) : 2 - tpmt(t - 1)) / 2;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/circle.js\nfunction circleIn(t) {\n return 1 - Math.sqrt(1 - t * t);\n}\n\nfunction circleOut(t) {\n return Math.sqrt(1 - --t * t);\n}\n\nfunction circleInOut(t) {\n return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/bounce.js\nvar b1 = 4 / 11,\n b2 = 6 / 11,\n b3 = 8 / 11,\n b4 = 3 / 4,\n b5 = 9 / 11,\n b6 = 10 / 11,\n b7 = 15 / 16,\n b8 = 21 / 22,\n b9 = 63 / 64,\n b0 = 1 / b1 / b1;\n\nfunction bounceIn(t) {\n return 1 - bounceOut(1 - t);\n}\n\nfunction bounceOut(t) {\n return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;\n}\n\nfunction bounceInOut(t) {\n return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/back.js\nvar overshoot = 1.70158;\n\nvar backIn = (function custom(s) {\n s = +s;\n\n function backIn(t) {\n return (t = +t) * t * (s * (t - 1) + t);\n }\n\n backIn.overshoot = custom;\n\n return backIn;\n})(overshoot);\n\nvar backOut = (function custom(s) {\n s = +s;\n\n function backOut(t) {\n return --t * t * ((t + 1) * s + t) + 1;\n }\n\n backOut.overshoot = custom;\n\n return backOut;\n})(overshoot);\n\nvar backInOut = (function custom(s) {\n s = +s;\n\n function backInOut(t) {\n return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\n }\n\n backInOut.overshoot = custom;\n\n return backInOut;\n})(overshoot);\n\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/elastic.js\n\n\nvar tau = 2 * Math.PI,\n amplitude = 1,\n period = 0.3;\n\nvar elasticIn = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticIn(t) {\n return a * tpmt(-(--t)) * Math.sin((s - t) / p);\n }\n\n elasticIn.amplitude = function(a) { return custom(a, p * tau); };\n elasticIn.period = function(p) { return custom(a, p); };\n\n return elasticIn;\n})(amplitude, period);\n\nvar elasticOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticOut(t) {\n return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p);\n }\n\n elasticOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticOut.period = function(p) { return custom(a, p); };\n\n return elasticOut;\n})(amplitude, period);\n\nvar elasticInOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticInOut(t) {\n return ((t = t * 2 - 1) < 0\n ? a * tpmt(-t) * Math.sin((s - t) / p)\n : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2;\n }\n\n elasticInOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticInOut.period = function(p) { return custom(a, p); };\n\n return elasticInOut;\n})(amplitude, period);\n\n;// CONCATENATED MODULE: ./node_modules/d3-ease/src/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-animation/util.js\n\n\n\nvar isInterpolatable = function (obj) {\n // d3 turns null into 0 and undefined into NaN, which we don\'t want.\n if (obj !== null) {\n switch (typeof obj) {\n case "undefined":\n return false;\n\n case "number":\n // The standard `isNaN` is fine in this case since we already know the\n // type is number.\n return !isNaN(obj) && obj !== Number.POSITIVE_INFINITY && obj !== Number.NEGATIVE_INFINITY;\n\n case "string":\n // d3 might not *actually* be able to interpolate the string, but it\n // won\'t cause any issues to let it try.\n return true;\n\n case "boolean":\n // d3 turns Booleans into integers, which we don\'t want. Sure, we could\n // interpolate from 0 -> 1, but we\'d be sending a non-Boolean to\n // something expecting a Boolean.\n return false;\n\n case "object":\n // Don\'t try to interpolate class instances (except Date or Array).\n return obj instanceof Date || Array.isArray(obj) || isPlainObject_default()(obj);\n\n case "function":\n // Careful! There may be extra properties on function objects that the\n // component expects to access - for instance, it may be a `d3.scale()`\n // function, which has its own methods attached. We don\'t know if the\n // component is only going to call the function (in which case it\'s\n // safely interpolatable) or if it\'s going to access special properties\n // (in which case our function generated from `interpolateFunction` will\n // most likely cause an error. We could check for enumerable properties\n // on the function object here to see if it\'s a "plain" function, but\n // let\'s just require that components prevent such function props from\n // being animated in the first place.\n return true;\n }\n }\n\n return false;\n};\n/**\n * Interpolate immediately to the end value at the given step `when`.\n * Some nicer default behavior might be to jump at the halfway point or return\n * `a` if `t` is 0 (instead of always returning `b`). But d3\'s default\n * interpolator does not do these things:\n *\n * d3.interpolate(\'aaa\', \'bbb\')(0) === \'bbb\'\n *\n * ...and things might get wonky if we don\'t replicate that behavior.\n *\n * @param {any} a - Start value.\n * @param {any} b - End value.\n * @param {Number} when - Step value (0 to 1) at which to jump to `b`.\n * @returns {Function} An interpolation function.\n */\n\nvar interpolateImmediate = function (a, b) {\n var when = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n return function (t) {\n return t < when ? a : b;\n };\n};\n/**\n * Interpolate to or from a function. The interpolated value will be a function\n * that calls `a` (if it\'s a function) and `b` (if it\'s a function) and calls\n * `d3.interpolate` on the resulting values. Note that our function won\'t\n * necessarily be called (that\'s up to the component this eventually gets\n * passed to) - but if it does get called, it will return an appropriately\n * interpolated value.\n *\n * @param {any} a - Start value.\n * @param {any} b - End value.\n * @returns {Function} An interpolation function.\n */\n\nvar interpolateFunction = function (a, b) {\n return function (t) {\n if (t >= 1) {\n return b;\n }\n\n return function () {\n /* eslint-disable no-invalid-this */\n var aval = typeof a === "function" ? a.apply(this, arguments) : a;\n var bval = typeof b === "function" ? b.apply(this, arguments) : b;\n return value(aval, bval)(t);\n };\n };\n};\n/**\n * Interpolate to or from an object. This method is a modification of the object interpolator in\n * d3-interpolate https://github.com/d3/d3-interpolate/blob/master/src/object.js. This interpolator\n * differs in that it uses our custom interpolators when interpolating the value of each property in\n * an object. This allows the correct interpolation of nested objects, including styles\n *\n * @param {any} a - Start value.\n * @param {any} b - End value.\n * @returns {Function} An interpolation function.\n */\n\nvar interpolateObject = function (a, b) {\n var interpolateTypes = function (x, y) {\n if (x === y || !isInterpolatable(x) || !isInterpolatable(y)) {\n return interpolateImmediate(x, y);\n }\n\n if (typeof x === "function" || typeof y === "function") {\n return interpolateFunction(x, y);\n }\n\n if (typeof x === "object" && isPlainObject_default()(x) || typeof y === "object" && isPlainObject_default()(y)) {\n return interpolateObject(x, y);\n }\n\n return value(x, y);\n }; // When the value is an array, attempt to sort by "key" so that animating nodes may be identified\n // based on "key" instead of index\n\n\n var keyData = function (val) {\n return Array.isArray(val) ? orderBy_default()(val, "key") : val;\n };\n\n var i = {};\n var c = {};\n var k;\n\n if (a === null || typeof a !== "object") {\n a = {};\n }\n\n if (b === null || typeof b !== "object") {\n b = {};\n }\n\n for (k in b) {\n if (k in a) {\n i[k] = interpolateTypes(keyData(a[k]), keyData(b[k]));\n } else {\n c[k] = b[k];\n }\n }\n\n return function (t) {\n for (k in i) {\n c[k] = i[k](t);\n }\n\n return c;\n };\n};\nvar interpolateString = function (a, b) {\n var format = function (val) {\n return typeof val === "string" ? val.replace(/,/g, "") : val;\n };\n\n return value(format(a), format(b));\n};\n/**\n * By default, the list of interpolators used by `d3.interpolate` has a few\n * downsides:\n *\n * - `null` values get turned into 0.\n * - `undefined`, `function`, and some other value types get turned into NaN.\n * - Boolean types get turned into numbers, which probably will be meaningless\n * to whatever is consuming them.\n * - It tries to interpolate between identical start and end values, doing\n * unnecessary calculations that sometimes result in floating point rounding\n * errors.\n *\n * If only the default interpolators are used, `VictoryAnimation` will happily\n * pass down NaN (and other bad) values as props to the wrapped component.\n * The component will then either use the incorrect values or complain that it\n * was passed props of the incorrect type. This custom interpolator is added\n * using the `d3.interpolators` API, and prevents such cases from happening\n * for most values.\n *\n * @param {any} a - Start value.\n * @param {any} b - End value.\n * @returns {Function|undefined} An interpolation function, if necessary.\n */\n\nvar victoryInterpolator = function (a, b) {\n // If the values are strictly equal, or either value is not interpolatable,\n // just use either the start value `a` or end value `b` at every step, as\n // there is no reasonable in-between value.\n if (a === b || !isInterpolatable(a) || !isInterpolatable(b)) {\n return interpolateImmediate(a, b);\n }\n\n if (typeof a === "function" || typeof b === "function") {\n return interpolateFunction(a, b);\n }\n\n if (isPlainObject_default()(a) || isPlainObject_default()(b)) {\n return interpolateObject(a, b);\n }\n\n if (typeof a === "string" || typeof b === "string") {\n return interpolateString(a, b);\n }\n\n return value(a, b);\n};\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-animation/victory-animation.js\nfunction victory_animation_toConsumableArray(arr) { return victory_animation_arrayWithoutHoles(arr) || victory_animation_iterableToArray(arr) || victory_animation_nonIterableSpread(); }\n\nfunction victory_animation_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_animation_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_animation_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction victory_animation_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_animation_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_animation_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_animation_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_animation_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_animation_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_animation_assertThisInitialized(self); }\n\nfunction victory_animation_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction victory_animation_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\n/*global setTimeout:false */\n\n\n\n\n\n\n\nvar VictoryAnimation =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_animation_inherits(VictoryAnimation, _React$Component);\n\n function VictoryAnimation(props, context) {\n var _this;\n\n victory_animation_classCallCheck(this, VictoryAnimation);\n\n _this = victory_animation_possibleConstructorReturn(this, (VictoryAnimation.__proto__ || Object.getPrototypeOf(VictoryAnimation)).call(this, props, context));\n /* defaults */\n\n _this.state = {\n data: Array.isArray(_this.props.data) ? _this.props.data[0] : _this.props.data,\n animationInfo: {\n progress: 0,\n animating: false\n }\n };\n _this.interpolator = null;\n _this.queue = Array.isArray(_this.props.data) ? _this.props.data.slice(1) : [];\n /* build easing function */\n\n _this.ease = d3_ease_src_namespaceObject[_this.toNewName(_this.props.easing)];\n /*\n There is no autobinding of this in ES6 classes\n so we bind functionToBeRunEachFrame to current instance of victory animation class\n */\n\n _this.functionToBeRunEachFrame = _this.functionToBeRunEachFrame.bind(victory_animation_assertThisInitialized(_this));\n _this.timer = _this.context.animationTimer;\n return _this;\n }\n\n victory_animation_createClass(VictoryAnimation, [{\n key: "componentDidMount",\n value: function componentDidMount() {\n // Length check prevents us from triggering `onEnd` in `traverseQueue`.\n if (this.queue.length) {\n this.traverseQueue();\n }\n }\n }, {\n key: "componentDidUpdate",\n value: function componentDidUpdate(prevProps) {\n var equalProps = react_fast_compare_default()(this.props, prevProps);\n\n if (!equalProps) {\n /* If the previous animation didn\'t finish, force it to complete before starting a new one */\n if (this.interpolator && this.state.animationInfo && this.state.animationInfo.progress < 1) {\n // eslint-disable-next-line react/no-did-update-set-state\n this.setState({\n data: this.interpolator(1),\n animationInfo: {\n progress: 1,\n animating: false,\n terminating: true\n }\n });\n } else {\n /* cancel existing loop if it exists */\n this.timer.unsubscribe(this.loopID);\n /* If an object was supplied */\n\n if (!Array.isArray(this.props.data)) {\n // Replace the tween queue. Could set `this.queue = [nextProps.data]`,\n // but let\'s reuse the same array.\n this.queue.length = 0;\n this.queue.push(this.props.data);\n /* If an array was supplied */\n } else {\n var _queue;\n\n /* Extend the tween queue */\n (_queue = this.queue).push.apply(_queue, victory_animation_toConsumableArray(this.props.data));\n }\n /* Start traversing the tween queue */\n\n\n this.traverseQueue();\n }\n }\n }\n }, {\n key: "componentWillUnmount",\n value: function componentWillUnmount() {\n if (this.loopID) {\n this.timer.unsubscribe(this.loopID);\n } else {\n this.timer.stop();\n }\n }\n }, {\n key: "toNewName",\n value: function toNewName(ease) {\n // d3-ease changed the naming scheme for ease from "linear" -> "easeLinear" etc.\n var capitalize = function (s) {\n return s && s[0].toUpperCase() + s.slice(1);\n };\n\n return "ease".concat(capitalize(ease));\n }\n /* Traverse the tween queue */\n\n }, {\n key: "traverseQueue",\n value: function traverseQueue() {\n var _this2 = this;\n\n if (this.queue.length) {\n /* Get the next index */\n var data = this.queue[0];\n /* compare cached version to next props */\n\n this.interpolator = victoryInterpolator(this.state.data, data);\n /* reset step to zero */\n\n if (this.props.delay) {\n setTimeout(function () {\n _this2.loopID = _this2.timer.subscribe(_this2.functionToBeRunEachFrame, _this2.props.duration);\n }, this.props.delay);\n } else {\n this.loopID = this.timer.subscribe(this.functionToBeRunEachFrame, this.props.duration);\n }\n } else if (this.props.onEnd) {\n this.props.onEnd();\n }\n }\n /* every frame we... */\n\n }, {\n key: "functionToBeRunEachFrame",\n value: function functionToBeRunEachFrame(elapsed, duration) {\n /*\n step can generate imprecise values, sometimes greater than 1\n if this happens set the state to 1 and return, cancelling the timer\n */\n duration = duration !== undefined ? duration : this.props.duration;\n var step = duration ? elapsed / duration : 1;\n\n if (step >= 1) {\n this.setState({\n data: this.interpolator(1),\n animationInfo: {\n progress: 1,\n animating: false,\n terminating: true\n }\n });\n\n if (this.loopID) {\n this.timer.unsubscribe(this.loopID);\n }\n\n this.queue.shift();\n this.traverseQueue();\n return;\n }\n /*\n if we\'re not at the end of the timer, set the state by passing\n current step value that\'s transformed by the ease function to the\n interpolator, which is cached for performance whenever props are received\n */\n\n\n this.setState({\n data: this.interpolator(this.ease(step)),\n animationInfo: {\n progress: step,\n animating: step < 1\n }\n });\n }\n }, {\n key: "render",\n value: function render() {\n return this.props.children(this.state.data, this.state.animationInfo);\n }\n }]);\n\n return VictoryAnimation;\n}(react.Component);\n\nObject.defineProperty(VictoryAnimation, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryAnimation"\n});\nObject.defineProperty(VictoryAnimation, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n children: (prop_types_default()).func,\n data: prop_types_default().oneOfType([(prop_types_default()).object, (prop_types_default()).array]),\n delay: (prop_types_default()).number,\n duration: (prop_types_default()).number,\n easing: prop_types_default().oneOf(["back", "backIn", "backOut", "backInOut", "bounce", "bounceIn", "bounceOut", "bounceInOut", "circle", "circleIn", "circleOut", "circleInOut", "linear", "linearIn", "linearOut", "linearInOut", "cubic", "cubicIn", "cubicOut", "cubicInOut", "elastic", "elasticIn", "elasticOut", "elasticInOut", "exp", "expIn", "expOut", "expInOut", "poly", "polyIn", "polyOut", "polyInOut", "quad", "quadIn", "quadOut", "quadInOut", "sin", "sinIn", "sinOut", "sinInOut"]),\n onEnd: (prop_types_default()).func\n }\n});\nObject.defineProperty(VictoryAnimation, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n data: {},\n delay: 0,\n duration: 1000,\n easing: "quadInOut"\n }\n});\nObject.defineProperty(VictoryAnimation, "contextType", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: timer_context\n});\n\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-transition/victory-transition.js\n\n\n\n\n\nfunction victory_transition_extends() { victory_transition_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return victory_transition_extends.apply(this, arguments); }\n\nfunction victory_transition_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_transition_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_transition_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_transition_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_transition_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_transition_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_transition_assertThisInitialized(self); }\n\nfunction victory_transition_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction victory_transition_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\n\n\n\n\n\n\n\n\n\nvar VictoryTransition =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_transition_inherits(VictoryTransition, _React$Component);\n\n function VictoryTransition(props, context) {\n var _this;\n\n victory_transition_classCallCheck(this, VictoryTransition);\n\n _this = victory_transition_possibleConstructorReturn(this, (VictoryTransition.__proto__ || Object.getPrototypeOf(VictoryTransition)).call(this, props, context));\n _this.state = {\n nodesShouldLoad: false,\n nodesDoneLoad: false\n };\n var child = _this.props.children;\n var polar = child.props.polar;\n _this.continuous = !polar && child.type && child.type.continuous === true;\n _this.getTransitionState = _this.getTransitionState.bind(victory_transition_assertThisInitialized(_this));\n _this.timer = _this.context.transitionTimer;\n return _this;\n }\n\n victory_transition_createClass(VictoryTransition, [{\n key: "componentDidMount",\n value: function componentDidMount() {\n this.setState({\n nodesShouldLoad: true\n }); //eslint-disable-line react/no-did-mount-set-state\n }\n }, {\n key: "shouldComponentUpdate",\n value: function shouldComponentUpdate(nextProps) {\n var _this2 = this;\n\n if (!react_fast_compare_default()(this.props, nextProps)) {\n this.timer.bypassAnimation();\n this.setState(this.getTransitionState(this.props, nextProps), function () {\n return _this2.timer.resumeAnimation();\n });\n }\n\n return true;\n }\n }, {\n key: "componentWillUnmount",\n value: function componentWillUnmount() {\n this.timer.stop();\n }\n }, {\n key: "getTransitionState",\n value: function getTransitionState(props, nextProps) {\n var animate = props.animate;\n\n if (!animate) {\n return {};\n } else if (animate.parentState) {\n var state = animate.parentState;\n var oldProps = state.nodesWillExit ? props : null;\n return {\n oldProps: oldProps,\n nextProps: nextProps\n };\n } else {\n var oldChildren = react.Children.toArray(props.children);\n var nextChildren = react.Children.toArray(nextProps.children);\n\n var _Transitions$getIniti = getInitialTransitionState(oldChildren, nextChildren),\n nodesWillExit = _Transitions$getIniti.nodesWillExit,\n nodesWillEnter = _Transitions$getIniti.nodesWillEnter,\n childrenTransitions = _Transitions$getIniti.childrenTransitions,\n nodesShouldEnter = _Transitions$getIniti.nodesShouldEnter;\n\n return {\n nodesWillExit: nodesWillExit,\n nodesWillEnter: nodesWillEnter,\n childrenTransitions: childrenTransitions,\n nodesShouldEnter: nodesShouldEnter,\n oldProps: nodesWillExit ? props : null,\n nextProps: nextProps\n };\n }\n }\n }, {\n key: "getDomainFromChildren",\n value: function getDomainFromChildren(props, axis) {\n var getChildDomains = function (children) {\n return children.reduce(function (memo, child) {\n if (child.type && isFunction_default()(child.type.getDomain)) {\n var childDomain = child.props && child.type.getDomain(child.props, axis);\n return childDomain ? memo.concat(childDomain) : memo;\n } else if (child.props && child.props.children) {\n return memo.concat(getChildDomains(react.Children.toArray(child.props.children)));\n }\n\n return memo;\n }, []);\n };\n\n var child = react.Children.toArray(props.children)[0];\n var childProps = child.props || {};\n var domain = Array.isArray(childProps.domain) ? childProps.domain : childProps.domain && childProps.domain[axis];\n\n if (!childProps.children && domain) {\n return domain;\n } else {\n var childDomains = getChildDomains([child]);\n return childDomains.length === 0 ? [0, 1] : [getMinValue(childDomains), getMaxValue(childDomains)];\n }\n }\n }, {\n key: "pickProps",\n value: function pickProps() {\n if (!this.state) {\n return this.props;\n }\n\n return this.state.nodesWillExit ? this.state.oldProps || this.props : this.props;\n }\n }, {\n key: "pickDomainProps",\n value: function pickDomainProps(props) {\n var parentState = isObject_default()(props.animate) && props.animate.parentState;\n\n if (parentState && parentState.nodesWillExit) {\n return this.continous || parentState.continuous ? parentState.nextProps || this.state.nextProps || props : props;\n }\n\n return this.continuous && this.state.nodesWillExit ? this.state.nextProps || props : props;\n }\n }, {\n key: "getClipWidth",\n value: function getClipWidth(props, child) {\n var getDefaultClipWidth = function () {\n var range = getRange(child.props, "x");\n return range ? Math.abs(range[1] - range[0]) : props.width;\n };\n\n var clipWidth = this.transitionProps ? this.transitionProps.clipWidth : undefined;\n return clipWidth !== undefined ? clipWidth : getDefaultClipWidth();\n }\n }, {\n key: "render",\n value: function render() {\n var _this3 = this;\n\n var props = this.pickProps();\n var getTransitionProps = isObject_default()(this.props.animate) && this.props.animate.getTransitions ? this.props.animate.getTransitions : getTransitionPropsFactory(props, this.state, function (newState) {\n return _this3.setState(newState);\n });\n var child = react.Children.toArray(props.children)[0];\n var transitionProps = getTransitionProps(child);\n this.transitionProps = transitionProps;\n var domain = {\n x: this.getDomainFromChildren(this.pickDomainProps(props), "x"),\n y: this.getDomainFromChildren(props, "y")\n };\n var clipWidth = this.getClipWidth(props, child);\n\n var combinedProps = defaults_default()({\n domain: domain,\n clipWidth: clipWidth\n }, transitionProps, child.props);\n\n var animationWhitelist = props.animationWhitelist || [];\n var whitelist = animationWhitelist.concat(["clipWidth"]);\n var propsToAnimate = whitelist.length ? pick_default()(combinedProps, whitelist) : combinedProps;\n return react.createElement(VictoryAnimation, victory_transition_extends({}, combinedProps.animate, {\n data: propsToAnimate\n }), function (newProps) {\n if (child.props.groupComponent) {\n var groupComponent = _this3.continuous ? react.cloneElement(child.props.groupComponent, {\n clipWidth: newProps.clipWidth || 0\n }) : child.props.groupComponent;\n return react.cloneElement(child, defaults_default()({\n animate: null,\n animating: true,\n groupComponent: groupComponent\n }, newProps, combinedProps));\n }\n\n return react.cloneElement(child, defaults_default()({\n animate: null,\n animating: true\n }, newProps, combinedProps));\n });\n }\n }]);\n\n return VictoryTransition;\n}(react.Component);\n\nObject.defineProperty(VictoryTransition, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryTransition"\n});\nObject.defineProperty(VictoryTransition, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n animate: prop_types_default().oneOfType([(prop_types_default()).bool, (prop_types_default()).object]),\n animationWhitelist: (prop_types_default()).array,\n children: (prop_types_default()).node\n }\n});\nObject.defineProperty(VictoryTransition, "contextType", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: timer_context\n});\n\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/add-events.js\n\n\n\n\n\n\n\n\n\n\nfunction add_events_toConsumableArray(arr) { return add_events_arrayWithoutHoles(arr) || add_events_iterableToArray(arr) || add_events_nonIterableSpread(); }\n\nfunction add_events_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction add_events_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction add_events_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction add_events_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction add_events_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction add_events_createClass(Constructor, protoProps, staticProps) { if (protoProps) add_events_defineProperties(Constructor.prototype, protoProps); if (staticProps) add_events_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction add_events_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return add_events_assertThisInitialized(self); }\n\nfunction add_events_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction add_events_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\n/*global window:false */\n\n\n\n\n\nvar datumHasXandY = function (datum) {\n return !isNil_default()(datum._x) && !isNil_default()(datum._y);\n}; // used for checking state changes. Expected components can be passed in via options\n\n\nvar defaultComponents = [{\n name: "parent",\n index: "parent"\n}, {\n name: "data"\n}, {\n name: "labels"\n}];\n/* harmony default export */ const add_events = (function (WrappedComponent, options) {\n return (\n /*#__PURE__*/\n function (_WrappedComponent) {\n add_events_inherits(addEvents, _WrappedComponent);\n\n function addEvents(props) {\n var _this;\n\n add_events_classCallCheck(this, addEvents);\n\n _this = add_events_possibleConstructorReturn(this, (addEvents.__proto__ || Object.getPrototypeOf(addEvents)).call(this, props));\n var getScopedEvents = events_getScopedEvents.bind(add_events_assertThisInitialized(_this));\n var boundGetEvents = getEvents.bind(add_events_assertThisInitialized(_this));\n _this.state = {};\n\n _this.getEvents = function (p, target, eventKey) {\n return boundGetEvents(p, target, eventKey, getScopedEvents);\n };\n\n _this.getEventState = getEventState.bind(add_events_assertThisInitialized(_this));\n\n var calculatedValues = _this.getCalculatedValues(props);\n\n _this.cacheValues(calculatedValues);\n\n _this.externalMutations = _this.getExternalMutations(props);\n _this.calculatedState = _this.getStateChanges(props);\n _this.globalEvents = {};\n _this.prevGlobalEventKeys = [];\n _this.boundGlobalEvents = {};\n return _this;\n }\n\n add_events_createClass(addEvents, [{\n key: "shouldComponentUpdate",\n value: function shouldComponentUpdate(nextProps) {\n var externalMutations = this.getExternalMutations(nextProps);\n var animating = this.props.animating || this.props.animate;\n var newMutation = !react_fast_compare_default()(externalMutations, this.externalMutations);\n\n if (animating || newMutation) {\n this.cacheValues(this.getCalculatedValues(nextProps));\n this.externalMutations = externalMutations;\n this.applyExternalMutations(nextProps, externalMutations);\n return true;\n }\n\n var calculatedState = this.getStateChanges(nextProps);\n\n if (!react_fast_compare_default()(this.calculatedState, calculatedState)) {\n this.cacheValues(this.getCalculatedValues(nextProps));\n return true;\n }\n\n if (!react_fast_compare_default()(this.props, nextProps)) {\n this.cacheValues(this.getCalculatedValues(nextProps));\n return true;\n }\n\n return false;\n }\n }, {\n key: "componentDidMount",\n value: function componentDidMount() {\n var _this2 = this;\n\n var globalEventKeys = keys_default()(this.globalEvents);\n\n globalEventKeys.forEach(function (key) {\n return _this2.addGlobalListener(key);\n });\n this.prevGlobalEventKeys = globalEventKeys;\n }\n }, {\n key: "componentDidUpdate",\n value: function componentDidUpdate(prevProps) {\n var _this3 = this;\n\n var calculatedState = this.getStateChanges(prevProps);\n this.calculatedState = calculatedState;\n\n var globalEventKeys = keys_default()(this.globalEvents);\n\n var removedGlobalEventKeys = difference_default()(this.prevGlobalEventKeys, globalEventKeys);\n\n removedGlobalEventKeys.forEach(function (key) {\n return _this3.removeGlobalListener(key);\n });\n\n var addedGlobalEventKeys = difference_default()(globalEventKeys, this.prevGlobalEventKeys);\n\n addedGlobalEventKeys.forEach(function (key) {\n return _this3.addGlobalListener(key);\n });\n this.prevGlobalEventKeys = globalEventKeys;\n }\n }, {\n key: "componentWillUnmount",\n value: function componentWillUnmount() {\n var _this4 = this;\n\n this.prevGlobalEventKeys.forEach(function (key) {\n return _this4.removeGlobalListener(key);\n });\n }\n }, {\n key: "addGlobalListener",\n value: function addGlobalListener(key) {\n var _this5 = this;\n\n var boundListener = function (event) {\n var listener = _this5.globalEvents[key];\n return listener && listener(emulateReactEvent(event));\n };\n\n this.boundGlobalEvents[key] = boundListener;\n window.addEventListener(getGlobalEventNameFromKey(key), boundListener);\n }\n }, {\n key: "removeGlobalListener",\n value: function removeGlobalListener(key) {\n window.removeEventListener(getGlobalEventNameFromKey(key), this.boundGlobalEvents[key]);\n } // compile all state changes from own and parent state. Order doesn\'t matter, as any state\n // state change should trigger a re-render\n\n }, {\n key: "getStateChanges",\n value: function getStateChanges(props) {\n var _this6 = this;\n\n if (!this.hasEvents) {\n return {};\n }\n\n var getState = function (key, type) {\n var result = defaults_default()({}, _this6.getEventState(key, type), _this6.getSharedEventState(key, type));\n\n return isEmpty_default()(result) ? undefined : result;\n };\n\n options = options || {};\n var components = options.components || defaultComponents;\n var stateChanges = components.map(function (component) {\n if (!props.standalone && component.name === "parent") {\n // don\'t check for changes on parent props for non-standalone components\n return undefined;\n } else {\n return component.index !== undefined ? getState(component.index, component.name) : _this6.dataKeys.map(function (key) {\n return getState(key, component.name);\n }).filter(Boolean);\n }\n }).filter(Boolean);\n return stateChanges;\n }\n }, {\n key: "applyExternalMutations",\n value: function applyExternalMutations(props, externalMutations) {\n if (!isEmpty_default()(externalMutations)) {\n var callbacks = props.externalEventMutations.reduce(function (memo, mutation) {\n memo = isFunction_default()(mutation.callback) ? memo.concat(mutation.callback) : memo;\n return memo;\n }, []);\n var compiledCallbacks = callbacks.length ? function () {\n callbacks.forEach(function (c) {\n return c();\n });\n } : undefined;\n this.setState(externalMutations, compiledCallbacks);\n }\n }\n }, {\n key: "getCalculatedValues",\n value: function getCalculatedValues(props) {\n var sharedEvents = props.sharedEvents;\n var components = WrappedComponent.expectedComponents;\n var componentEvents = getComponentEvents(props, components);\n var getSharedEventState = sharedEvents && isFunction_default()(sharedEvents.getEventState) ? sharedEvents.getEventState : function () {\n return undefined;\n };\n var baseProps = this.getBaseProps(props, getSharedEventState);\n\n var dataKeys = keys_default()(baseProps).filter(function (key) {\n return key !== "parent";\n });\n\n var hasEvents = props.events || props.sharedEvents || componentEvents;\n var events = this.getAllEvents(props);\n return {\n componentEvents: componentEvents,\n getSharedEventState: getSharedEventState,\n baseProps: baseProps,\n dataKeys: dataKeys,\n hasEvents: hasEvents,\n events: events\n };\n }\n }, {\n key: "getExternalMutations",\n value: function getExternalMutations(props) {\n var sharedEvents = props.sharedEvents,\n externalEventMutations = props.externalEventMutations;\n return isEmpty_default()(externalEventMutations) || sharedEvents ? undefined : events_getExternalMutations(externalEventMutations, this.baseProps, this.state);\n }\n }, {\n key: "cacheValues",\n value: function cacheValues(obj) {\n var _this7 = this;\n\n keys_default()(obj).forEach(function (key) {\n _this7[key] = obj[key];\n });\n }\n }, {\n key: "getBaseProps",\n value: function getBaseProps(props, getSharedEventState) {\n getSharedEventState = getSharedEventState || this.getSharedEventState;\n var sharedParentState = getSharedEventState("parent", "parent");\n var parentState = this.getEventState("parent", "parent");\n\n var baseParentProps = defaults_default()({}, parentState, sharedParentState);\n\n var parentPropsList = baseParentProps.parentControlledProps;\n var parentProps = parentPropsList ? pick_default()(baseParentProps, parentPropsList) : {};\n\n var modifiedProps = defaults_default()({}, parentProps, props);\n\n return isFunction_default()(WrappedComponent.getBaseProps) ? WrappedComponent.getBaseProps(modifiedProps) : {};\n }\n }, {\n key: "getAllEvents",\n value: function getAllEvents(props) {\n if (Array.isArray(this.componentEvents)) {\n var _componentEvents;\n\n return Array.isArray(props.events) ? (_componentEvents = this.componentEvents).concat.apply(_componentEvents, add_events_toConsumableArray(props.events)) : this.componentEvents;\n }\n\n return props.events;\n }\n }, {\n key: "getComponentProps",\n value: function getComponentProps(component, type, index) {\n var name = this.props.name || WrappedComponent.role;\n var key = this.dataKeys && this.dataKeys[index] || index;\n var id = "".concat(name, "-").concat(type, "-").concat(key);\n var baseProps = this.baseProps[key] && this.baseProps[key][type] || this.baseProps[key];\n\n if (!baseProps && !this.hasEvents) {\n return undefined;\n }\n\n if (this.hasEvents) {\n var baseEvents = this.getEvents(this.props, type, key);\n\n var componentProps = defaults_default()({\n index: index,\n key: id\n }, this.getEventState(key, type), this.getSharedEventState(key, type), component.props, baseProps, {\n id: id\n });\n\n var events = defaults_default()({}, getPartialEvents(baseEvents, key, componentProps), componentProps.events);\n\n return assign_default()({}, componentProps, {\n events: events\n });\n }\n\n return defaults_default()({\n index: index,\n key: id\n }, component.props, baseProps, {\n id: id\n });\n }\n }, {\n key: "renderContainer",\n value: function renderContainer(component, children) {\n var isContainer = component.type && component.type.role === "container";\n var parentProps = isContainer ? this.getComponentProps(component, "parent", "parent") : {};\n\n if (parentProps.events) {\n this.globalEvents = getGlobalEvents(parentProps.events);\n parentProps.events = omitGlobalEvents(parentProps.events);\n }\n\n return react.cloneElement(component, parentProps, children);\n }\n }, {\n key: "animateComponent",\n value: function animateComponent(props, defaultAnimationWhitelist) {\n var animationWhitelist = props.animate && props.animate.animationWhitelist ? props.animate.animationWhitelist : defaultAnimationWhitelist;\n return react.createElement(VictoryTransition, {\n animate: props.animate,\n animationWhitelist: animationWhitelist\n }, react.createElement(this.constructor, props));\n } // Used by `VictoryLine` and `VictoryArea`\n\n }, {\n key: "renderContinuousData",\n value: function renderContinuousData(props) {\n var _this8 = this;\n\n var dataComponent = props.dataComponent,\n labelComponent = props.labelComponent,\n groupComponent = props.groupComponent;\n\n var dataKeys = without_default()(this.dataKeys, "all");\n\n var labelComponents = dataKeys.reduce(function (memo, key) {\n var labelProps = _this8.getComponentProps(labelComponent, "labels", key);\n\n if (labelProps && labelProps.text !== undefined && labelProps.text !== null) {\n memo = memo.concat(react.cloneElement(labelComponent, labelProps));\n }\n\n return memo;\n }, []);\n var dataProps = this.getComponentProps(dataComponent, "data", "all");\n var children = [react.cloneElement(dataComponent, dataProps)].concat(add_events_toConsumableArray(labelComponents));\n return this.renderContainer(groupComponent, children);\n }\n }, {\n key: "renderData",\n value: function renderData(props) {\n var _this9 = this;\n\n var shouldRenderDatum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : datumHasXandY;\n var dataComponent = props.dataComponent,\n labelComponent = props.labelComponent,\n groupComponent = props.groupComponent;\n var dataComponents = this.dataKeys.reduce(function (validDataComponents, _dataKey, index) {\n var dataProps = _this9.getComponentProps(dataComponent, "data", index);\n\n if (shouldRenderDatum(dataProps.datum)) {\n validDataComponents.push(react.cloneElement(dataComponent, dataProps));\n }\n\n return validDataComponents;\n }, []);\n var labelComponents = this.dataKeys.map(function (_dataKey, index) {\n var labelProps = _this9.getComponentProps(labelComponent, "labels", index);\n\n if (labelProps.text !== undefined && labelProps.text !== null) {\n return react.cloneElement(labelComponent, labelProps);\n }\n\n return undefined;\n }).filter(Boolean);\n\n var children = add_events_toConsumableArray(dataComponents).concat(add_events_toConsumableArray(labelComponents));\n\n return this.renderContainer(groupComponent, children);\n }\n }]);\n\n return addEvents;\n }(WrappedComponent)\n );\n});\n;// CONCATENATED MODULE: ./node_modules/victory-axis/es/helper-methods.js\n\n\n\nfunction helper_methods_toConsumableArray(arr) { return helper_methods_arrayWithoutHoles(arr) || helper_methods_iterableToArray(arr) || helper_methods_nonIterableSpread(); }\n\nfunction helper_methods_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction helper_methods_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction helper_methods_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction helper_methods_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\nvar orientationSign = {\n top: -1,\n left: -1,\n right: 1,\n bottom: 1\n};\n\nvar exists = function (val) {\n return val !== null && val !== undefined;\n};\n\nvar helper_methods_getCurrentAxis = function (props, axis) {\n var orientation = props.orientation,\n horizontal = props.horizontal;\n\n if (orientation) {\n var dimensions = {\n top: "x",\n bottom: "x",\n left: "y",\n right: "y"\n };\n return dimensions[orientation];\n }\n\n var otherAxis = axis === "x" ? "y" : "x";\n return horizontal ? otherAxis : axis;\n};\n\nvar helper_methods_getScale = function (props) {\n var axis = getAxis(props);\n var currentAxis = helper_methods_getCurrentAxis(props, axis);\n var scale = getBaseScale(props, axis);\n var propsDomain = props.domain && props.domain[axis];\n var domain = propsDomain || axis_getDomain(props) || scale.domain();\n scale.range(getRange(props, currentAxis));\n scale.domain(domain);\n return scale;\n};\n\nvar getStyleObject = function (props) {\n var theme = props.theme,\n dependentAxis = props.dependentAxis;\n var generalAxisStyle = theme && theme.axis && theme.axis.style;\n var axisType = dependentAxis ? "dependentAxis" : "independentAxis";\n var specificAxisStyle = theme && theme[axisType] && theme[axisType].style;\n\n var mergeStyles = function () {\n var styleNamespaces = ["axis", "axisLabel", "grid", "parent", "tickLabels", "ticks"];\n return styleNamespaces.reduce(function (memo, curr) {\n memo[curr] = defaults_default()({}, specificAxisStyle[curr], generalAxisStyle[curr]);\n return memo;\n }, {});\n };\n\n return generalAxisStyle && specificAxisStyle ? mergeStyles() : specificAxisStyle || generalAxisStyle;\n};\n\nvar helper_methods_getStyles = function (props, styleObject) {\n var style = props.style || {};\n styleObject = styleObject || {};\n var parentStyleProps = {\n height: "100%",\n width: "100%"\n };\n return {\n parent: defaults_default()(style.parent, styleObject.parent, parentStyleProps),\n axis: defaults_default()({}, style.axis, styleObject.axis),\n axisLabel: defaults_default()({}, style.axisLabel, styleObject.axisLabel),\n grid: defaults_default()({}, style.grid, styleObject.grid),\n ticks: defaults_default()({}, style.ticks, styleObject.ticks),\n tickLabels: defaults_default()({}, style.tickLabels, styleObject.tickLabels)\n };\n};\n\nvar getTickProps = function (layout, style, datum) {\n var position = layout.position,\n transform = layout.transform;\n return {\n x1: transform.x,\n y1: transform.y,\n x2: transform.x + position.x2,\n y2: transform.y + position.y2,\n style: style,\n datum: datum\n };\n}; // eslint-disable-next-line max-params\n\n\nvar getTickLabelProps = function (layout, style, anchors, datum, text) {\n var position = layout.position,\n transform = layout.transform;\n return {\n style: style,\n x: transform.x + position.x,\n y: transform.y + position.y,\n verticalAnchor: anchors.verticalAnchor,\n textAnchor: anchors.textAnchor,\n angle: style.angle,\n text: text,\n datum: datum\n };\n};\n\nvar getGridProps = function (layout, style, datum) {\n var edge = layout.edge,\n transform = layout.transform;\n return {\n x1: transform.x,\n y1: transform.y,\n x2: edge.x + transform.x,\n y2: edge.y + transform.y,\n style: style,\n datum: datum\n };\n};\n\nvar getAxisProps = function (modifiedProps, calculatedValues, globalTransform) {\n var style = calculatedValues.style,\n padding = calculatedValues.padding,\n isVertical = calculatedValues.isVertical;\n var width = modifiedProps.width,\n height = modifiedProps.height;\n return {\n style: style.axis,\n x1: isVertical ? globalTransform.x : padding.left + globalTransform.x,\n x2: isVertical ? globalTransform.x : width - padding.right + globalTransform.x,\n y1: isVertical ? padding.top + globalTransform.y : globalTransform.y,\n y2: isVertical ? height - padding.bottom + globalTransform.y : globalTransform.y\n };\n};\n\nvar getEvaluatedStyles = function (style, props) {\n return {\n tickStyle: evaluateStyle(style.ticks, props),\n labelStyle: evaluateStyle(style.tickLabels, props),\n gridStyle: evaluateStyle(style.grid, props)\n };\n};\n\nvar getAxisLabelProps = function (props, calculatedValues, globalTransform) {\n var style = calculatedValues.style,\n orientation = calculatedValues.orientation,\n padding = calculatedValues.padding,\n labelPadding = calculatedValues.labelPadding,\n isVertical = calculatedValues.isVertical;\n var sign = orientationSign[orientation];\n var hPadding = padding.left + padding.right;\n var vPadding = padding.top + padding.bottom;\n var verticalAnchor = sign < 0 ? "end" : "start";\n var labelStyle = style.axisLabel;\n var angle = isVertical ? -90 : 0; // eslint-disable-line no-magic-numbers\n\n var x = isVertical ? globalTransform.x + sign * labelPadding : (props.width - hPadding) / 2 + padding.left + globalTransform.x;\n var y = isVertical ? (props.height - vPadding) / 2 + padding.top + globalTransform.y : sign * labelPadding + globalTransform.y;\n return {\n x: x,\n y: y,\n verticalAnchor: labelStyle.verticalAnchor || verticalAnchor,\n textAnchor: labelStyle.textAnchor || "middle",\n angle: labelStyle.angle === undefined ? angle : labelStyle.angle,\n style: labelStyle,\n text: props.label\n };\n};\n\nvar getAnchors = function (orientation, isVertical) {\n var anchorOrientation = {\n top: "end",\n left: "end",\n right: "start",\n bottom: "start"\n };\n var anchor = anchorOrientation[orientation];\n return {\n textAnchor: isVertical ? anchor : "middle",\n verticalAnchor: isVertical ? "middle" : anchor\n };\n};\n\nvar getLabelPadding = function (props, style) {\n var labelStyle = style.axisLabel || {};\n\n if (labelStyle.padding !== undefined && labelStyle.padding !== null) {\n return labelStyle.padding;\n }\n\n var isVertical = axis_isVertical(props); // TODO: magic numbers\n\n /*eslint-disable no-magic-numbers*/\n\n var fontSize = labelStyle.fontSize || 14;\n return props.label ? fontSize * (isVertical ? 2.3 : 1.6) : 0;\n /*eslint-enable no-magic-numbers*/\n};\n\nvar getDefaultOrientations = function (axis, originSign, horizontal) {\n var sign = originSign || "positive";\n var orientations = {\n positive: {\n x: "bottom",\n y: "left"\n },\n negative: {\n x: "top",\n y: "right"\n }\n };\n var horizontalOrientations = {\n positive: {\n x: "left",\n y: "bottom"\n },\n negative: {\n x: "right",\n y: "top"\n }\n };\n return horizontal ? horizontalOrientations[sign][axis] : orientations[sign][axis];\n};\n\nvar getStandaloneOffset = function (props, calculatedValues) {\n var style = calculatedValues.style,\n scale = calculatedValues.scale,\n orientation = calculatedValues.orientation,\n padding = calculatedValues.padding,\n axis = calculatedValues.axis,\n ticks = calculatedValues.ticks,\n stringTicks = calculatedValues.stringTicks,\n isVertical = calculatedValues.isVertical,\n labelPadding = calculatedValues.labelPadding;\n var polar = props.polar,\n horizontal = props.horizontal;\n var sharedProps = {\n scale: helper_methods_defineProperty({}, axis, scale),\n polar: polar,\n horizontal: horizontal,\n ticks: ticks,\n stringTicks: stringTicks\n };\n var xPadding = orientation === "right" ? padding.right : padding.left;\n var yPadding = orientation === "top" ? padding.top : padding.bottom;\n var offsetX = props.offsetX !== null && props.offsetX !== undefined ? props.offsetX : xPadding;\n var offsetY = props.offsetY !== null && props.offsetY !== undefined ? props.offsetY : yPadding;\n var fontSize = style.axisLabel.fontSize || 14; // eslint-disable-line no-magic-numbers\n\n var tickSizes = ticks.map(function (data, index) {\n var tick = stringTicks ? props.tickValues[data - 1] : data;\n var tickStyle = evaluateStyle(style.ticks, assign_default()({}, sharedProps, {\n tick: tick,\n index: index\n }));\n return tickStyle.size || 0;\n });\n var totalPadding = fontSize + 2 * Math.max.apply(Math, helper_methods_toConsumableArray(tickSizes)) + labelPadding;\n var minimumPadding = 1.2 * fontSize; // eslint-disable-line no-magic-numbers\n\n var x = isVertical ? totalPadding : minimumPadding;\n var y = isVertical ? minimumPadding : totalPadding;\n return {\n x: offsetX !== null && offsetX !== undefined ? offsetX : x,\n y: offsetY !== null && offsetY !== undefined ? offsetY : y\n };\n}; // eslint-disable-next-line complexity\n\n\nvar helper_methods_getOffset = function (props, calculatedValues) {\n var scale = calculatedValues.scale,\n origin = calculatedValues.origin,\n orientation = calculatedValues.orientation,\n orientations = calculatedValues.orientations,\n domain = calculatedValues.domain,\n padding = calculatedValues.padding;\n var top = padding.top,\n bottom = padding.bottom,\n left = padding.left,\n right = padding.right;\n var calculatedOrientation = {\n x: orientation === "bottom" || orientation === "top" ? orientation : orientations.x,\n y: orientation === "left" || orientation === "right" ? orientation : orientations.y\n }; // make the axes line up, and cross when appropriate\n\n var orientationOffset = {\n x: calculatedOrientation.y === "left" ? left : right,\n y: calculatedOrientation.x === "bottom" ? bottom : top\n };\n var originOffset = {\n x: calculatedOrientation.y === "left" ? 0 : props.width,\n y: calculatedOrientation.x === "bottom" ? props.height : 0\n };\n var originPosition = {\n x: origin.x === domain.x[0] || origin.x === domain.x[1] ? 0 : scale.x(origin.x),\n y: origin.y === domain.y[0] || origin.y === domain.y[1] ? 0 : scale.y(origin.y)\n };\n var x = originPosition.x ? Math.abs(originOffset.x - originPosition.x) : orientationOffset.x;\n var y = originPosition.y ? Math.abs(originOffset.y - originPosition.y) : orientationOffset.y;\n var offsetX = exists(props.offsetX) ? props.offsetX : x;\n var offsetY = exists(props.offsetY) ? props.offsetY : y;\n return {\n x: offsetX,\n y: offsetY\n };\n}; // eslint-disable-next-line complexity\n\n\nvar getHorizontalOffset = function (props, calculatedValues) {\n var scale = calculatedValues.scale,\n origin = calculatedValues.origin,\n orientation = calculatedValues.orientation,\n orientations = calculatedValues.orientations,\n domain = calculatedValues.domain,\n padding = calculatedValues.padding;\n var top = padding.top,\n bottom = padding.bottom,\n left = padding.left,\n right = padding.right;\n var calculatedOrientation = {\n y: orientation === "bottom" || orientation === "top" ? orientation : orientations.x,\n x: orientation === "left" || orientation === "right" ? orientation : orientations.y\n }; // make the axes line up, and cross when appropriate\n\n var orientationOffset = {\n x: calculatedOrientation.y === "bottom" ? bottom : top,\n y: calculatedOrientation.x === "left" ? left : right\n };\n var originOffset = {\n y: calculatedOrientation.x === "left" ? 0 : props.width,\n x: calculatedOrientation.y === "bottom" ? props.height : 0\n };\n var originPosition = {\n x: origin.x === domain.x[0] || origin.x === domain.x[1] ? 0 : scale.x(origin.x),\n y: origin.y === domain.y[0] || origin.y === domain.y[1] ? 0 : scale.y(origin.y)\n };\n var y = originPosition.x ? Math.abs(originOffset.x - originPosition.x) : orientationOffset.x;\n var x = originPosition.y ? Math.abs(originOffset.y - originPosition.y) : orientationOffset.y;\n var offsetX = exists(props.offsetX) ? props.offsetX : x;\n var offsetY = exists(props.offsetY) ? props.offsetY : y;\n return {\n x: offsetX,\n y: offsetY\n };\n};\n\nvar helper_methods_getTransform = function (props, calculatedValues, offset) {\n var orientation = calculatedValues.orientation,\n axis = calculatedValues.axis;\n var axisValue = getAxisValue(props, axis);\n return {\n top: {\n x: 0,\n y: axisValue !== undefined ? axisValue : offset.y\n },\n bottom: {\n x: 0,\n y: axisValue !== undefined ? axisValue : props.height - offset.y\n },\n left: {\n x: axisValue !== undefined ? axisValue : offset.x,\n y: 0\n },\n right: {\n x: axisValue !== undefined ? axisValue : props.width - offset.x,\n y: 0\n }\n }[orientation];\n};\n\nvar getTickPosition = function (style, orientation, isVertical) {\n var tickStyle = style.tickStyle,\n labelStyle = style.labelStyle;\n var size = tickStyle.size || 0;\n var tickPadding = tickStyle.padding || 0;\n var labelPadding = labelStyle.padding || 0;\n var tickSpacing = size + tickPadding + labelPadding;\n var sign = orientationSign[orientation];\n return {\n x: isVertical ? sign * tickSpacing : 0,\n x2: isVertical ? sign * size : 0,\n y: isVertical ? 0 : sign * tickSpacing,\n y2: isVertical ? 0 : sign * size\n };\n};\n\nvar getTickTransform = function (tick, globalTransform, isVertical) {\n return {\n x: isVertical ? globalTransform.x : tick + globalTransform.x,\n y: isVertical ? tick + globalTransform.y : globalTransform.y\n };\n};\n\nvar getGridEdge = function (props, calculatedValues) {\n var orientation = calculatedValues.orientation,\n padding = calculatedValues.padding,\n isVertical = calculatedValues.isVertical;\n var sign = -orientationSign[orientation];\n var x = isVertical ? sign * (props.width - (padding.left + padding.right)) : 0;\n var y = isVertical ? 0 : sign * (props.height - (padding.top + padding.bottom));\n return {\n x: x,\n y: y\n };\n};\n\nvar getGridOffset = function (calculatedValues, offset) {\n var padding = calculatedValues.padding,\n orientation = calculatedValues.orientation,\n crossAxis = calculatedValues.crossAxis;\n var xPadding = orientation === "right" ? padding.right : padding.left;\n var yPadding = orientation === "top" ? padding.top : padding.bottom;\n return {\n x: crossAxis ? offset.x - xPadding : 0,\n y: crossAxis ? offset.y - yPadding : 0\n };\n};\n\nvar getLayoutProps = function (modifiedProps, calculatedValues) {\n var offset;\n\n if (calculatedValues.domain.x && calculatedValues.domain.y) {\n offset = modifiedProps.horizontal ? getHorizontalOffset(modifiedProps, calculatedValues) : helper_methods_getOffset(modifiedProps, calculatedValues);\n } else {\n offset = getStandaloneOffset(modifiedProps, calculatedValues);\n }\n\n return {\n globalTransform: helper_methods_getTransform(modifiedProps, calculatedValues, offset),\n gridOffset: getGridOffset(calculatedValues, offset),\n gridEdge: getGridEdge(modifiedProps, calculatedValues)\n };\n};\n\nvar getOrientation = function (props) {\n if (props.orientation) {\n return props.orientation;\n }\n\n var defaultOrientations = {\n dependent: props.horizontal ? "bottom" : "left",\n independent: props.horizontal ? "left" : "bottom"\n };\n return props.dependentAxis ? defaultOrientations.dependent : defaultOrientations.independent;\n}; // eslint-disable-next-line complexity\n\n\nvar getCalculatedValues = function (props) {\n var defaultStyles = getStyleObject(props);\n var style = helper_methods_getStyles(props, defaultStyles);\n var padding = helpers_getPadding(props);\n var labelPadding = getLabelPadding(props, style);\n var stringTicks = axis_stringTicks(props) ? props.tickValues : undefined;\n var axis = getAxis(props);\n var axisDomain = axis_getDomain(props);\n var axisScale = helper_methods_getScale(props);\n var xAxisDomain = axis === "x" ? axisDomain : undefined;\n var yAxisDomain = axis === "y" ? axisDomain : undefined;\n var xAxisScale = axis === "x" ? axisScale : undefined;\n var yAxisScale = axis === "y" ? axisScale : undefined;\n var crossAxis = props.crossAxis === false || props.standalone === true ? false : true;\n var ticks = getTicks(props, axisScale, crossAxis);\n var tickFormat = getTickFormat(props, axisScale);\n var range = {\n x: getRange(props, "x"),\n y: getRange(props, "y")\n }; // use full domain if passed in from parent,\n // otherwise use the just the one axis available\n\n var domain = {\n x: props.domain && props.domain.x ? props.domain.x : xAxisDomain,\n y: props.domain && props.domain.y ? props.domain.y : yAxisDomain\n }; // use full scale if passed in from parent,\n // otherwise use the just the one axis available\n\n var scale = {\n x: props.domain && props.domain.x ? getBaseScale(props, "x").domain(props.domain.x).range(props.horizontal ? range.y : range.x) : xAxisScale,\n y: props.domain && props.domain.y ? getBaseScale(props, "y").domain(props.domain.y).range(props.horizontal ? range.x : range.y) : yAxisScale\n };\n var origin = domain.x && domain.y ? getOrigin(domain) : undefined;\n var originSign = origin ? {\n x: getOriginSign(origin.x, domain.x),\n y: getOriginSign(origin.y, domain.y)\n } : undefined;\n var orientations = originSign ? {\n x: getDefaultOrientations("x", originSign.y, props.horizontal),\n y: getDefaultOrientations("y", originSign.x, props.horizontal)\n } : undefined;\n var orientation = orientations ? props.orientation || orientations[axis] : getOrientation(props);\n var isVertical = axis_isVertical(Object.assign({}, props, {\n orientation: orientation\n }));\n var anchors = getAnchors(orientation, isVertical);\n return {\n anchors: anchors,\n axis: axis,\n crossAxis: crossAxis,\n domain: domain,\n isVertical: isVertical,\n labelPadding: labelPadding,\n orientation: orientation,\n orientations: orientations,\n origin: origin,\n padding: padding,\n scale: scale,\n stringTicks: stringTicks,\n style: style,\n tickFormat: tickFormat,\n ticks: ticks\n };\n};\n\nvar getBaseProps = function (props, fallbackProps) {\n props = axis_modifyProps(props, fallbackProps);\n var calculatedValues = getCalculatedValues(props);\n var axis = calculatedValues.axis,\n style = calculatedValues.style,\n orientation = calculatedValues.orientation,\n isVertical = calculatedValues.isVertical,\n scale = calculatedValues.scale,\n ticks = calculatedValues.ticks,\n tickFormat = calculatedValues.tickFormat,\n anchors = calculatedValues.anchors,\n domain = calculatedValues.domain,\n stringTicks = calculatedValues.stringTicks,\n name = calculatedValues.name;\n var otherAxis = axis === "x" ? "y" : "x";\n var _props = props,\n width = _props.width,\n height = _props.height,\n standalone = _props.standalone,\n theme = _props.theme,\n polar = _props.polar,\n padding = _props.padding,\n horizontal = _props.horizontal;\n\n var _getLayoutProps = getLayoutProps(props, calculatedValues),\n globalTransform = _getLayoutProps.globalTransform,\n gridOffset = _getLayoutProps.gridOffset,\n gridEdge = _getLayoutProps.gridEdge;\n\n var sharedProps = {\n scale: helper_methods_defineProperty({}, axis, scale[axis]),\n polar: polar,\n horizontal: horizontal,\n ticks: ticks,\n stringTicks: stringTicks\n };\n var axisProps = getAxisProps(props, calculatedValues, globalTransform);\n var axisLabelProps = getAxisLabelProps(props, calculatedValues, globalTransform);\n var initialChildProps = {\n parent: assign_default()({\n style: style.parent,\n ticks: ticks,\n standalone: standalone,\n theme: theme,\n width: width,\n height: height,\n padding: padding,\n domain: domain,\n name: name\n }, sharedProps)\n };\n var gridProps = {\n dimension: otherAxis,\n range: helper_methods_defineProperty({}, otherAxis, getRange(props, otherAxis)),\n scale: props.scale && props.scale[otherAxis] ? helper_methods_defineProperty({}, otherAxis, props.scale[otherAxis]) : undefined\n };\n return ticks.reduce(function (childProps, tickValue, index) {\n var tick = stringTicks ? stringTicks[index] : tickValue;\n var text = tickFormat(tickValue, index, ticks);\n var styles = getEvaluatedStyles(style, assign_default()({}, sharedProps, {\n tick: tick,\n tickValue: tickValue,\n index: index,\n text: text\n }));\n var tickLayout = {\n position: getTickPosition(styles, orientation, isVertical),\n transform: getTickTransform(scale[axis](tickValue), globalTransform, isVertical)\n };\n var gridLayout = {\n edge: gridEdge,\n transform: {\n x: isVertical ? -gridOffset.x + globalTransform.x : scale[axis](tickValue) + globalTransform.x,\n y: isVertical ? scale[axis](tickValue) + globalTransform.y : gridOffset.y + globalTransform.y\n }\n };\n childProps[index] = {\n axis: assign_default()({\n dimension: axis\n }, sharedProps, axisProps),\n axisLabel: assign_default()({}, sharedProps, axisLabelProps),\n ticks: assign_default()({}, sharedProps, getTickProps(tickLayout, styles.tickStyle, tickValue)),\n tickLabels: assign_default()({}, sharedProps, getTickLabelProps(tickLayout, styles.labelStyle, anchors, tickValue, text)),\n grid: assign_default()({}, sharedProps, gridProps, getGridProps(gridLayout, styles.gridStyle, tickValue))\n };\n return childProps;\n }, initialChildProps);\n};\n;// CONCATENATED MODULE: ./node_modules/victory-axis/es/victory-axis.js\n\n\n\nfunction victory_axis_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_axis_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_axis_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction victory_axis_toConsumableArray(arr) { return victory_axis_arrayWithoutHoles(arr) || victory_axis_iterableToArray(arr) || victory_axis_nonIterableSpread(); }\n\nfunction victory_axis_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_axis_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_axis_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction victory_axis_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_axis_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_axis_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_axis_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_axis_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_axis_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_axis_assertThisInitialized(self); }\n\nfunction victory_axis_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_axis_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\nvar fallbackProps = {\n width: 450,\n height: 300,\n padding: 50\n};\nvar options = {\n components: [{\n name: "axis",\n index: 0\n }, {\n name: "axisLabel",\n index: 0\n }, {\n name: "grid"\n }, {\n name: "parent",\n index: "parent"\n }, {\n name: "ticks"\n }, {\n name: "tickLabels"\n }]\n};\n\nvar VictoryAxis =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_axis_inherits(VictoryAxis, _React$Component);\n\n function VictoryAxis() {\n victory_axis_classCallCheck(this, VictoryAxis);\n\n return victory_axis_possibleConstructorReturn(this, (VictoryAxis.__proto__ || Object.getPrototypeOf(VictoryAxis)).apply(this, arguments));\n }\n\n victory_axis_createClass(VictoryAxis, [{\n key: "renderLine",\n value: function renderLine(props) {\n var axisComponent = props.axisComponent;\n var axisProps = this.getComponentProps(axisComponent, "axis", 0);\n return react.cloneElement(axisComponent, axisProps);\n }\n }, {\n key: "renderLabel",\n value: function renderLabel(props) {\n var axisLabelComponent = props.axisLabelComponent,\n label = props.label;\n\n if (!label) {\n return null;\n }\n\n var axisLabelProps = this.getComponentProps(axisLabelComponent, "axisLabel", 0);\n return react.cloneElement(axisLabelComponent, axisLabelProps);\n }\n }, {\n key: "renderGridAndTicks",\n value: function renderGridAndTicks(props) {\n var _this = this;\n\n var tickComponent = props.tickComponent,\n tickLabelComponent = props.tickLabelComponent,\n gridComponent = props.gridComponent,\n name = props.name;\n\n var shouldRender = function (componentProps) {\n var _componentProps$style = componentProps.style,\n style = _componentProps$style === void 0 ? {} : _componentProps$style,\n _componentProps$event = componentProps.events,\n events = _componentProps$event === void 0 ? {} : _componentProps$event;\n var visible = style.stroke !== "transparent" && style.stroke !== "none" && style.strokeWidth !== 0;\n return visible || !isEmpty_default()(events);\n };\n\n return this.dataKeys.map(function (key, index) {\n var tickProps = _this.getComponentProps(tickComponent, "ticks", index);\n\n var BaseTickComponent = react.cloneElement(tickComponent, tickProps);\n var TickComponent = shouldRender(BaseTickComponent.props) ? BaseTickComponent : undefined;\n\n var gridProps = _this.getComponentProps(gridComponent, "grid", index);\n\n var BaseGridComponent = react.cloneElement(gridComponent, gridProps);\n var GridComponent = shouldRender(BaseGridComponent.props) ? BaseGridComponent : undefined;\n\n var tickLabelProps = _this.getComponentProps(tickLabelComponent, "tickLabels", index);\n\n var TickLabel = react.cloneElement(tickLabelComponent, tickLabelProps);\n var children = [GridComponent, TickComponent, TickLabel].filter(Boolean);\n return react.cloneElement(props.groupComponent, {\n key: "".concat(name, "-tick-group-").concat(key)\n }, children);\n });\n }\n }, {\n key: "fixLabelOverlap",\n value: function fixLabelOverlap(gridAndTicks, props) {\n var isVertical = axis_isVertical(props);\n var size = isVertical ? props.height : props.width;\n\n var isVictoryLabel = function (child) {\n return child.type && child.type.role === "label";\n };\n\n var labels = gridAndTicks.map(function (gridAndTick) {\n return gridAndTick.props.children;\n }).reduce(function (accumulator, childArr) {\n return accumulator.concat(childArr);\n }, []).filter(isVictoryLabel).map(function (child) {\n return child.props;\n });\n\n var paddingToObject = function (padding) {\n return typeof padding === "object" ? assign_default()({}, {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }, padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n };\n\n var labelsSumSize = labels.reduce(function (sum, label) {\n var padding = paddingToObject(label.style.padding);\n var labelSize = approximateTextSize(label.text, {\n angle: label.angle,\n fontSize: label.style.fontSize,\n letterSpacing: label.style.letterSpacing,\n fontFamily: label.style.fontFamily\n });\n return sum + (isVertical ? labelSize.height + padding.top + padding.bottom : labelSize.width + padding.right + padding.left);\n }, 0);\n var availiableLabelCount = Math.floor(size * gridAndTicks.length / labelsSumSize);\n var divider = Math.ceil(gridAndTicks.length / availiableLabelCount) || 1;\n\n var getLabelCoord = function (gridAndTick) {\n return gridAndTick.props.children.filter(isVictoryLabel).reduce(function (prev, child) {\n return (isVertical ? child.props.y : child.props.x) || 0;\n }, 0);\n };\n\n var sorted = gridAndTicks.sort(function (a, b) {\n return isVertical ? getLabelCoord(b) - getLabelCoord(a) //ordinary axis has top-bottom orientation\n : getLabelCoord(a) - getLabelCoord(b);\n } //ordinary axis has left-right orientation\n );\n return sorted.filter(function (gridAndTick, index) {\n return index % divider === 0;\n });\n } // Overridden in native versions\n\n }, {\n key: "shouldAnimate",\n value: function shouldAnimate() {\n return !!this.props.animate;\n }\n }, {\n key: "render",\n value: function render() {\n var animationWhitelist = VictoryAxis.animationWhitelist;\n var props = axis_modifyProps(this.props, fallbackProps);\n\n if (this.shouldAnimate()) {\n return this.animateComponent(props, animationWhitelist);\n }\n\n var gridAndTicks = this.renderGridAndTicks(props);\n var modifiedGridAndTicks = props.fixLabelOverlap ? this.fixLabelOverlap(gridAndTicks, props) : gridAndTicks;\n var children = [this.renderLine(props), this.renderLabel(props)].concat(victory_axis_toConsumableArray(modifiedGridAndTicks));\n return props.standalone ? this.renderContainer(props.containerComponent, children) : react.cloneElement(props.groupComponent, {}, children);\n }\n }]);\n\n return VictoryAxis;\n}(react.Component);\n\nObject.defineProperty(VictoryAxis, "animationWhitelist", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["style", "domain", "range", "tickCount", "tickValues", "offsetX", "offsetY", "padding", "width", "height"]\n});\nObject.defineProperty(VictoryAxis, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryAxis"\n});\nObject.defineProperty(VictoryAxis, "role", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "axis"\n});\nObject.defineProperty(VictoryAxis, "defaultTransitions", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n onExit: {\n duration: 500\n },\n onEnter: {\n duration: 500\n }\n }\n});\nObject.defineProperty(VictoryAxis, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_axis_objectSpread({}, baseProps, {\n axisComponent: (prop_types_default()).element,\n axisLabelComponent: (prop_types_default()).element,\n axisValue: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string, (prop_types_default()).object]),\n categories: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).string), prop_types_default().shape({\n x: prop_types_default().arrayOf((prop_types_default()).string),\n y: prop_types_default().arrayOf((prop_types_default()).string)\n })]),\n crossAxis: (prop_types_default()).bool,\n dependentAxis: (prop_types_default()).bool,\n events: prop_types_default().arrayOf(prop_types_default().shape({\n target: prop_types_default().oneOf(["axis", "axisLabel", "grid", "ticks", "tickLabels"]),\n eventKey: prop_types_default().oneOfType([(prop_types_default()).array, allOfType([integer, nonNegative]), (prop_types_default()).string]),\n eventHandlers: (prop_types_default()).object\n })),\n fixLabelOverlap: (prop_types_default()).bool,\n gridComponent: (prop_types_default()).element,\n groupComponent: (prop_types_default()).element,\n invertAxis: (prop_types_default()).bool,\n label: (prop_types_default()).any,\n offsetX: (prop_types_default()).number,\n offsetY: (prop_types_default()).number,\n orientation: prop_types_default().oneOf(["top", "bottom", "left", "right"]),\n origin: prop_types_default().shape({\n x: (prop_types_default()).number,\n y: (prop_types_default()).number\n }),\n stringMap: (prop_types_default()).object,\n style: prop_types_default().shape({\n parent: (prop_types_default()).object,\n axis: (prop_types_default()).object,\n axisLabel: (prop_types_default()).object,\n grid: (prop_types_default()).object,\n ticks: (prop_types_default()).object,\n tickLabels: (prop_types_default()).object\n }),\n tickComponent: (prop_types_default()).element,\n tickCount: allOfType([integer, greaterThanZero]),\n tickFormat: prop_types_default().oneOfType([(prop_types_default()).func, homogeneousArray]),\n tickLabelComponent: (prop_types_default()).element,\n tickValues: homogeneousArray\n })\n});\nObject.defineProperty(VictoryAxis, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n axisComponent: react.createElement(line_segment, null),\n axisLabelComponent: react.createElement(victory_label, null),\n tickLabelComponent: react.createElement(victory_label, null),\n tickComponent: react.createElement(line_segment, null),\n gridComponent: react.createElement(line_segment, null),\n standalone: true,\n theme: victory_theme.grayscale,\n containerComponent: react.createElement(VictoryContainer, null),\n groupComponent: react.createElement("g", {\n role: "presentation"\n }),\n fixLabelOverlap: false\n }\n});\nObject.defineProperty(VictoryAxis, "getDomain", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: axis_getDomain\n});\nObject.defineProperty(VictoryAxis, "getAxis", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: getAxis\n});\nObject.defineProperty(VictoryAxis, "getStyles", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return helper_methods_getStyles(props, fallbackProps.style);\n }\n});\nObject.defineProperty(VictoryAxis, "getBaseProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return getBaseProps(props, fallbackProps);\n }\n});\nObject.defineProperty(VictoryAxis, "expectedComponents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["axisComponent", "axisLabelComponent", "groupComponent", "containerComponent", "tickComponent", "tickLabelComponent", "gridComponent"]\n});\n/* harmony default export */ const victory_axis = (add_events(VictoryAxis, options));\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-primitives/path.js\nfunction path_objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\n\n\nvar Path = function (props) {\n // eslint-disable-next-line react/prop-types\n var desc = props.desc,\n rest = path_objectWithoutProperties(props, ["desc"]);\n\n return desc ? react.createElement("path", rest, react.createElement("desc", null, desc)) : react.createElement("path", rest);\n};\n\n/* harmony default export */ const path = (Path);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-primitives/arc.js\n\n\nfunction arc_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { arc_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction arc_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/*eslint no-magic-numbers: ["error", { "ignore": [0, 1, 2, 180] }]*/\n\n\n\n\n\n\nvar getArcPath = function (props) {\n var cx = props.cx,\n cy = props.cy,\n r = props.r,\n startAngle = props.startAngle,\n endAngle = props.endAngle,\n closedPath = props.closedPath; // Always draw the path as two arcs so that complete circles may be rendered.\n\n var halfAngle = Math.abs(endAngle - startAngle) / 2 + startAngle;\n var x1 = cx + r * Math.cos(degreesToRadians(startAngle));\n var y1 = cy - r * Math.sin(degreesToRadians(startAngle));\n var x2 = cx + r * Math.cos(degreesToRadians(halfAngle));\n var y2 = cy - r * Math.sin(degreesToRadians(halfAngle));\n var x3 = cx + r * Math.cos(degreesToRadians(endAngle));\n var y3 = cy - r * Math.sin(degreesToRadians(endAngle));\n var largerArcFlag1 = halfAngle - startAngle <= 180 ? 0 : 1;\n var largerArcFlag2 = endAngle - halfAngle <= 180 ? 0 : 1;\n var arcStart = closedPath ? " M ".concat(cx, ", ").concat(cy, " L ").concat(x1, ", ").concat(y1) : "M ".concat(x1, ", ").concat(y1);\n var arc1 = "A ".concat(r, ", ").concat(r, ", 0, ").concat(largerArcFlag1, ", 0, ").concat(x2, ", ").concat(y2);\n var arc2 = "A ".concat(r, ", ").concat(r, ", 0, ").concat(largerArcFlag2, ", 0, ").concat(x3, ", ").concat(y3);\n var arcEnd = closedPath ? "Z" : "";\n return "".concat(arcStart, " ").concat(arc1, " ").concat(arc2, " ").concat(arcEnd);\n};\n\nvar arc_evaluateProps = function (props) {\n /**\n * Potential evaluated props are:\n * `ariaLabel`\n * `desc`\n * `id`\n * `style`\n * `tabIndex`\n */\n var ariaLabel = evaluateProp(props.ariaLabel, props);\n var desc = evaluateProp(props.desc, props);\n var id = evaluateProp(props.id, props);\n var style = evaluateStyle(assign_default()({\n stroke: "black",\n fill: "none"\n }, props.style), props);\n var tabIndex = evaluateProp(props.tabIndex, props);\n return assign_default()({}, props, {\n ariaLabel: ariaLabel,\n desc: desc,\n id: id,\n style: style,\n tabIndex: tabIndex\n });\n};\n\nvar Arc = function (props) {\n props = arc_evaluateProps(props);\n return react.cloneElement(props.pathComponent, arc_objectSpread({}, props.events, {\n "aria-label": props.ariaLabel,\n d: getArcPath(props),\n style: props.style,\n desc: props.desc,\n tabIndex: props.tabIndex,\n className: props.className,\n role: props.role,\n shapeRendering: props.shapeRendering,\n transform: props.transform,\n clipPath: props.clipPath\n }));\n};\n\nArc.propTypes = arc_objectSpread({}, primitiveProps, {\n closedPath: (prop_types_default()).bool,\n cx: (prop_types_default()).number,\n cy: (prop_types_default()).number,\n datum: (prop_types_default()).any,\n endAngle: (prop_types_default()).number,\n pathComponent: (prop_types_default()).element,\n r: (prop_types_default()).number,\n startAngle: (prop_types_default()).number\n});\nArc.defaultProps = {\n pathComponent: react.createElement(path, null),\n role: "presentation",\n shapeRendering: "auto"\n};\n/* harmony default export */ const arc = (Arc);\n;// CONCATENATED MODULE: ./node_modules/victory-polar-axis/es/helper-methods.js\n\n\n\n\n\nvar helper_methods_getPosition = function (r, angle, axis) {\n return axis === "x" ? r * Math.cos(angle) : -r * Math.sin(angle);\n};\n\nvar getAxisType = function (props) {\n var typicalType = props.dependentAxis ? "radial" : "angular";\n var invertedType = typicalType === "angular" ? "radial" : "angular";\n return props.horizontal ? invertedType : typicalType;\n};\n\nvar filterTicks = function (ticks, scale) {\n var compareTicks = function (t) {\n return scale(t) % (2 * Math.PI);\n };\n\n return uniqBy_default()(ticks, compareTicks);\n};\n\nvar helper_methods_getEvaluatedStyles = function (style, props) {\n return {\n tickStyle: evaluateStyle(style.ticks, props),\n labelStyle: evaluateStyle(style.tickLabels, props),\n gridStyle: evaluateStyle(style.grid, props)\n };\n};\n\nvar helper_methods_getStyleObject = function (props) {\n var _props$theme = props.theme,\n theme = _props$theme === void 0 ? {} : _props$theme,\n dependentAxis = props.dependentAxis;\n var generalAxisStyle = theme.polarAxis && theme.polarAxis.style || theme.axis && theme.axis.style;\n var polarAxisType = dependentAxis ? "polarDependentAxis" : "polarIndependentAxis";\n var standardAxisType = dependentAxis ? "dependentAxis" : "independentAxis";\n var specificAxisStyle = theme[polarAxisType] && theme[polarAxisType].style || theme[standardAxisType] && theme[standardAxisType].style;\n\n var mergeStyles = function () {\n var styleNamespaces = ["axis", "axisLabel", "grid", "parent", "tickLabels", "ticks"];\n return styleNamespaces.reduce(function (memo, curr) {\n memo[curr] = defaults_default()({}, specificAxisStyle[curr], generalAxisStyle[curr]);\n return memo;\n }, {});\n };\n\n return generalAxisStyle && specificAxisStyle ? mergeStyles() : specificAxisStyle || generalAxisStyle;\n};\n\nvar helper_methods_getRadius = function (props) {\n var _Helpers$getPadding = helpers_getPadding(props),\n left = _Helpers$getPadding.left,\n right = _Helpers$getPadding.right,\n top = _Helpers$getPadding.top,\n bottom = _Helpers$getPadding.bottom;\n\n var width = props.width,\n height = props.height;\n return Math.min(width - left - right, height - top - bottom) / 2;\n};\n\nvar helper_methods_getRange = function (props, axis) {\n // Return the range from props if one is given.\n if (props.range && props.range[axis]) {\n return props.range[axis];\n } else if (props.range && Array.isArray(props.range)) {\n return props.range;\n }\n\n var axisType = getAxisType(props);\n\n if (axisType === "angular") {\n var startAngle = degreesToRadians(props.startAngle);\n var endAngle = degreesToRadians(props.endAngle);\n return [startAngle, endAngle];\n }\n\n var radius = helper_methods_getRadius(props);\n return [props.innerRadius || 0, radius];\n}; // exposed for use by VictoryChart (necessary?)\n\n\nvar es_helper_methods_getScale = function (props) {\n var axis = getAxis(props);\n var scale = getBaseScale(props, axis);\n var domain = axis_getDomain(props, axis) || scale.domain();\n var range = helper_methods_getRange(props, axis);\n scale.range(range);\n scale.domain(domain);\n return scale;\n};\nvar es_helper_methods_getStyles = function (props, styleObject) {\n if (props.disableInlineStyles) {\n return {};\n }\n\n var style = props.style || {};\n styleObject = styleObject || {};\n var parentStyleProps = {\n height: "auto",\n width: "100%"\n };\n return {\n parent: defaults_default()(parentStyleProps, style.parent, styleObject.parent),\n axis: defaults_default()({}, style.axis, styleObject.axis),\n axisLabel: defaults_default()({}, style.axisLabel, styleObject.axisLabel),\n grid: defaults_default()({}, style.grid, styleObject.grid),\n ticks: defaults_default()({}, style.ticks, styleObject.ticks),\n tickLabels: defaults_default()({}, style.tickLabels, styleObject.tickLabels)\n };\n};\n\nvar getAxisAngle = function (props) {\n var axisAngle = props.axisAngle,\n startAngle = props.startAngle,\n dependentAxis = props.dependentAxis;\n var axis = getAxis(props);\n var axisValue = getAxisValue(props, axis);\n\n if (axisValue === undefined || !dependentAxis) {\n return axisAngle === undefined ? startAngle : axisAngle;\n }\n\n return radiansToDegrees(axisValue);\n}; //eslint-disable-next-line max-params\n\n\nvar helper_methods_getTickProps = function (props, calculatedValues, tickValue, index) {\n var axisType = calculatedValues.axisType,\n radius = calculatedValues.radius,\n scale = calculatedValues.scale,\n style = calculatedValues.style,\n stringTicks = calculatedValues.stringTicks,\n ticks = calculatedValues.ticks,\n tickFormat = calculatedValues.tickFormat,\n origin = calculatedValues.origin;\n var text = tickFormat(tickValue, index, ticks);\n var tick = stringTicks ? stringTicks[index] : tickValue;\n\n var _getEvaluatedStyles = helper_methods_getEvaluatedStyles(style, {\n tick: tick,\n tickValue: tickValue,\n index: index,\n ticks: ticks,\n stringTicks: stringTicks,\n radius: radius,\n scale: scale,\n axisType: axisType,\n text: text\n }),\n tickStyle = _getEvaluatedStyles.tickStyle;\n\n var axisAngle = axisType === "radial" ? getAxisAngle(props, scale) : undefined;\n var tickPadding = tickStyle.padding || tickStyle.size || 0;\n var padAngle = degreesToRadians(90 - axisAngle);\n var tickAngle = axisType === "angular" ? scale(tickValue) : degreesToRadians(-1 * axisAngle);\n var tickRadius = axisType === "angular" ? radius : scale(tickValue);\n return axisType === "angular" ? {\n index: index,\n datum: tick,\n style: tickStyle,\n x1: helper_methods_getPosition(tickRadius, tickAngle, "x") + origin.x,\n y1: helper_methods_getPosition(tickRadius, tickAngle, "y") + origin.y,\n x2: helper_methods_getPosition(tickRadius + tickPadding, tickAngle, "x") + origin.x,\n y2: helper_methods_getPosition(tickRadius + tickPadding, tickAngle, "y") + origin.y\n } : {\n index: index,\n datum: tick,\n style: tickStyle,\n x1: tickRadius * Math.cos(tickAngle) + Math.cos(padAngle) * tickPadding + origin.x,\n x2: tickRadius * Math.cos(tickAngle) - Math.cos(padAngle) * tickPadding + origin.x,\n y1: tickRadius * Math.sin(tickAngle) + Math.sin(padAngle) * tickPadding + origin.y,\n y2: tickRadius * Math.sin(tickAngle) - Math.sin(padAngle) * tickPadding + origin.y\n };\n}; //eslint-disable-next-line max-params\n\n\nvar helper_methods_getTickLabelProps = function (props, calculatedValues, tickValue, index) {\n var axisType = calculatedValues.axisType,\n radius = calculatedValues.radius,\n tickFormat = calculatedValues.tickFormat,\n style = calculatedValues.style,\n scale = calculatedValues.scale,\n ticks = calculatedValues.ticks,\n stringTicks = calculatedValues.stringTicks,\n origin = calculatedValues.origin;\n var text = tickFormat(tickValue, index, ticks);\n var tick = stringTicks ? stringTicks[index] : tickValue;\n\n var _getEvaluatedStyles2 = helper_methods_getEvaluatedStyles(style, {\n text: text,\n tick: tick,\n tickValue: tickValue,\n index: index,\n ticks: ticks,\n stringTicks: stringTicks,\n radius: radius,\n scale: scale,\n axisType: axisType\n }),\n labelStyle = _getEvaluatedStyles2.labelStyle;\n\n var tickLabelComponent = props.tickLabelComponent;\n var labelPlacement = tickLabelComponent.props && tickLabelComponent.props.labelPlacement ? tickLabelComponent.props.labelPlacement : props.labelPlacement;\n var tickPadding = labelStyle.padding || 0;\n var angularPadding = 0; // TODO: do some geometry\n\n var axisAngle = axisType === "radial" ? getAxisAngle(props, scale) : undefined;\n var labelAngle = axisType === "angular" ? radiansToDegrees(scale(tickValue)) : axisAngle + angularPadding;\n var textAngle = labelStyle.angle === undefined ? getPolarAngle(assign_default()({}, props, {\n labelPlacement: labelPlacement\n }), labelAngle) : labelStyle.angle;\n var labelRadius = axisType === "angular" ? radius + tickPadding : scale(tickValue);\n var textAnchor = labelStyle.textAnchor || getPolarTextAnchor(assign_default()({}, props, {\n labelPlacement: labelPlacement\n }), labelAngle);\n return {\n index: index,\n datum: tick,\n style: labelStyle,\n angle: textAngle,\n textAnchor: textAnchor,\n text: text,\n x: labelRadius * Math.cos(degreesToRadians(labelAngle)) + origin.x,\n y: -labelRadius * Math.sin(degreesToRadians(labelAngle)) + origin.y\n };\n}; //eslint-disable-next-line max-params\n\n\nvar helper_methods_getGridProps = function (props, calculatedValues, tickValue, index) {\n var axisType = calculatedValues.axisType,\n radius = calculatedValues.radius,\n style = calculatedValues.style,\n scale = calculatedValues.scale,\n stringTicks = calculatedValues.stringTicks,\n ticks = calculatedValues.ticks,\n tickFormat = calculatedValues.tickFormat,\n origin = calculatedValues.origin;\n var text = tickFormat(tickValue, index, ticks);\n var startAngle = props.startAngle,\n endAngle = props.endAngle,\n _props$innerRadius = props.innerRadius,\n innerRadius = _props$innerRadius === void 0 ? 0 : _props$innerRadius;\n var tick = stringTicks ? stringTicks[index] : tickValue;\n\n var _getEvaluatedStyles3 = helper_methods_getEvaluatedStyles(style, {\n tick: tick,\n tickValue: tickValue,\n index: index,\n ticks: ticks,\n stringTicks: stringTicks,\n radius: radius,\n scale: scale,\n axisType: axisType,\n text: text\n }),\n gridStyle = _getEvaluatedStyles3.gridStyle;\n\n var angle = scale(tickValue);\n return axisType === "angular" ? {\n index: index,\n datum: tick,\n style: gridStyle,\n x1: helper_methods_getPosition(radius, angle, "x") + origin.x,\n y1: helper_methods_getPosition(radius, angle, "y") + origin.y,\n x2: helper_methods_getPosition(innerRadius, angle, "x") + origin.x,\n y2: helper_methods_getPosition(innerRadius, angle, "y") + origin.y\n } : {\n style: gridStyle,\n index: index,\n datum: tick,\n cx: origin.x,\n cy: origin.y,\n r: scale(tickValue),\n startAngle: startAngle,\n endAngle: endAngle\n };\n};\n\nvar helper_methods_getAxisLabelProps = function (props, calculatedValues) {\n var axisType = calculatedValues.axisType,\n radius = calculatedValues.radius,\n style = calculatedValues.style,\n scale = calculatedValues.scale,\n origin = calculatedValues.origin;\n var axisLabelComponent = props.axisLabelComponent;\n\n if (axisType !== "radial") {\n return {};\n }\n\n var labelPlacement = axisLabelComponent.props && axisLabelComponent.props.labelPlacement ? axisLabelComponent.props.labelPlacement : props.labelPlacement;\n var labelStyle = style && style.axisLabel || {};\n var axisAngle = axisType === "radial" ? getAxisAngle(props, scale) : undefined;\n var textAngle = labelStyle.angle === undefined ? getPolarAngle(assign_default()({}, props, {\n labelPlacement: labelPlacement\n }), axisAngle) : labelStyle.angle;\n var labelRadius = radius + (labelStyle.padding || 0);\n var textAnchor = labelStyle.textAnchor || getPolarTextAnchor(assign_default()({}, props, {\n labelPlacement: labelPlacement\n }), axisAngle);\n var verticalAnchor = labelStyle.verticalAnchor || getPolarVerticalAnchor(assign_default()({}, props, {\n labelPlacement: labelPlacement\n }), axisAngle);\n return {\n style: labelStyle,\n angle: textAngle,\n textAnchor: textAnchor,\n verticalAnchor: verticalAnchor,\n text: props.label,\n x: helper_methods_getPosition(labelRadius, degreesToRadians(axisAngle), "x") + origin.x,\n y: helper_methods_getPosition(labelRadius, degreesToRadians(axisAngle), "y") + origin.y\n };\n};\n\nvar helper_methods_getAxisProps = function (modifiedProps, calculatedValues) {\n var style = calculatedValues.style,\n axisType = calculatedValues.axisType,\n radius = calculatedValues.radius,\n scale = calculatedValues.scale,\n origin = calculatedValues.origin;\n var startAngle = modifiedProps.startAngle,\n endAngle = modifiedProps.endAngle,\n _modifiedProps$innerR = modifiedProps.innerRadius,\n innerRadius = _modifiedProps$innerR === void 0 ? 0 : _modifiedProps$innerR;\n var axisAngle = axisType === "radial" ? degreesToRadians(getAxisAngle(modifiedProps, scale)) : undefined;\n return axisType === "radial" ? {\n style: style.axis,\n x1: helper_methods_getPosition(innerRadius, axisAngle, "x") + origin.x,\n x2: helper_methods_getPosition(radius, axisAngle, "x") + origin.x,\n y1: helper_methods_getPosition(innerRadius, axisAngle, "y") + origin.y,\n y2: helper_methods_getPosition(radius, axisAngle, "y") + origin.y\n } : {\n style: style.axis,\n cx: origin.x,\n cy: origin.y,\n r: radius,\n startAngle: startAngle,\n endAngle: endAngle\n };\n};\n\nvar helper_methods_getCalculatedValues = function (props) {\n props = assign_default()({\n polar: true\n }, props);\n var defaultStyles = helper_methods_getStyleObject(props);\n var style = es_helper_methods_getStyles(props, defaultStyles);\n var padding = helpers_getPadding(props);\n var axis = getAxis(props);\n var axisType = getAxisType(props);\n var stringTicks = axis_stringTicks(props) ? props.tickValues : undefined;\n var domain = axis_getDomain(props, axis);\n var range = helper_methods_getRange(props, axis);\n var scale = es_helper_methods_getScale(props);\n var initialTicks = getTicks(props, scale);\n var ticks = axisType === "angular" ? filterTicks(initialTicks, scale) : initialTicks;\n var tickFormat = getTickFormat(props, scale);\n var radius = helper_methods_getRadius(props);\n var origin = getPolarOrigin(props);\n return {\n axis: axis,\n style: style,\n padding: padding,\n stringTicks: stringTicks,\n axisType: axisType,\n scale: scale,\n ticks: ticks,\n tickFormat: tickFormat,\n domain: domain,\n range: range,\n radius: radius,\n origin: origin\n };\n};\n\nvar helper_methods_getBaseProps = function (props, fallbackProps) {\n props = axis_modifyProps(props, fallbackProps);\n var calculatedValues = helper_methods_getCalculatedValues(props);\n var style = calculatedValues.style,\n scale = calculatedValues.scale,\n ticks = calculatedValues.ticks,\n domain = calculatedValues.domain;\n var _props = props,\n width = _props.width,\n height = _props.height,\n standalone = _props.standalone,\n theme = _props.theme,\n name = _props.name;\n var axisProps = helper_methods_getAxisProps(props, calculatedValues);\n var axisLabelProps = helper_methods_getAxisLabelProps(props, calculatedValues);\n var initialChildProps = {\n parent: {\n style: style.parent,\n ticks: ticks,\n scale: scale,\n width: width,\n height: height,\n domain: domain,\n standalone: standalone,\n theme: theme,\n name: name\n }\n };\n return ticks.reduce(function (childProps, tick, index) {\n childProps[index] = {\n axis: axisProps,\n axisLabel: axisLabelProps,\n ticks: helper_methods_getTickProps(props, calculatedValues, tick, index),\n tickLabels: helper_methods_getTickLabelProps(props, calculatedValues, tick, index),\n grid: helper_methods_getGridProps(props, calculatedValues, tick, index)\n };\n return childProps;\n }, initialChildProps);\n};\n;// CONCATENATED MODULE: ./node_modules/victory-polar-axis/es/victory-polar-axis.js\n\n\n\nfunction victory_polar_axis_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_polar_axis_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_polar_axis_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction victory_polar_axis_toConsumableArray(arr) { return victory_polar_axis_arrayWithoutHoles(arr) || victory_polar_axis_iterableToArray(arr) || victory_polar_axis_nonIterableSpread(); }\n\nfunction victory_polar_axis_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_polar_axis_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_polar_axis_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction victory_polar_axis_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_polar_axis_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_polar_axis_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_polar_axis_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_polar_axis_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_polar_axis_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_polar_axis_assertThisInitialized(self); }\n\nfunction victory_polar_axis_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_polar_axis_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\nvar victory_polar_axis_fallbackProps = {\n width: 450,\n height: 300,\n padding: 50\n};\nvar victory_polar_axis_options = {\n components: [{\n name: "axis",\n index: 0\n }, {\n name: "axisLabel",\n index: 0\n }, {\n name: "grid"\n }, {\n name: "parent",\n index: "parent"\n }, {\n name: "ticks"\n }, {\n name: "tickLabels"\n }]\n};\n\nvar VictoryPolarAxis =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_polar_axis_inherits(VictoryPolarAxis, _React$Component);\n\n function VictoryPolarAxis() {\n victory_polar_axis_classCallCheck(this, VictoryPolarAxis);\n\n return victory_polar_axis_possibleConstructorReturn(this, (VictoryPolarAxis.__proto__ || Object.getPrototypeOf(VictoryPolarAxis)).apply(this, arguments));\n }\n\n victory_polar_axis_createClass(VictoryPolarAxis, [{\n key: "renderAxisLine",\n value: function renderAxisLine(props) {\n var dependentAxis = props.dependentAxis;\n var axisComponent = dependentAxis ? props.axisComponent : props.circularAxisComponent;\n var axisProps = this.getComponentProps(axisComponent, "axis", 0);\n return react.cloneElement(axisComponent, axisProps);\n }\n }, {\n key: "renderLabel",\n value: function renderLabel(props) {\n var axisLabelComponent = props.axisLabelComponent,\n dependentAxis = props.dependentAxis,\n label = props.label;\n\n if (!label || !dependentAxis) {\n return null;\n }\n\n var axisLabelProps = this.getComponentProps(axisLabelComponent, "axisLabel", 0);\n return react.cloneElement(axisLabelComponent, axisLabelProps);\n }\n }, {\n key: "renderAxis",\n value: function renderAxis(props) {\n var _this = this;\n\n var tickComponent = props.tickComponent,\n tickLabelComponent = props.tickLabelComponent,\n name = props.name;\n\n var shouldRender = function (componentProps) {\n var _componentProps$style = componentProps.style,\n style = _componentProps$style === void 0 ? {} : _componentProps$style,\n _componentProps$event = componentProps.events,\n events = _componentProps$event === void 0 ? {} : _componentProps$event;\n var visible = style.stroke !== "transparent" && style.stroke !== "none" && style.strokeWidth !== 0;\n return visible || !isEmpty_default()(events);\n };\n\n var axisType = props.dependentAxis ? "radial" : "angular";\n var gridComponent = axisType === "radial" ? props.circularGridComponent : props.gridComponent;\n var tickComponents = this.dataKeys.map(function (key, index) {\n var tickProps = assign_default()({\n key: "".concat(name, "-tick-").concat(key)\n }, _this.getComponentProps(tickComponent, "ticks", index));\n\n var TickComponent = react.cloneElement(tickComponent, tickProps);\n return shouldRender(TickComponent.props) ? TickComponent : undefined;\n }).filter(Boolean);\n var gridComponents = this.dataKeys.map(function (key, index) {\n var gridProps = assign_default()({\n key: "".concat(name, "-grid-").concat(key)\n }, _this.getComponentProps(gridComponent, "grid", index));\n\n var GridComponent = react.cloneElement(gridComponent, gridProps);\n return shouldRender(GridComponent.props) ? GridComponent : undefined;\n }).filter(Boolean);\n var tickLabelComponents = this.dataKeys.map(function (key, index) {\n var tickLabelProps = assign_default()({\n key: "".concat(name, "-tick-").concat(key)\n }, _this.getComponentProps(tickLabelComponent, "tickLabels", index));\n\n return react.cloneElement(tickLabelComponent, tickLabelProps);\n });\n var axis = this.renderAxisLine(props);\n var axisLabel = this.renderLabel(props);\n var children = [axis, axisLabel].concat(victory_polar_axis_toConsumableArray(tickComponents), victory_polar_axis_toConsumableArray(gridComponents), victory_polar_axis_toConsumableArray(tickLabelComponents));\n return this.renderGroup(props, children);\n } // Overridden in victory-native\n\n }, {\n key: "renderGroup",\n value: function renderGroup(props, children) {\n var groupComponent = props.groupComponent;\n return react.cloneElement(groupComponent, {}, children);\n }\n }, {\n key: "shouldAnimate",\n value: function shouldAnimate() {\n return !!this.props.animate;\n }\n }, {\n key: "render",\n value: function render() {\n var animationWhitelist = VictoryPolarAxis.animationWhitelist;\n var props = axis_modifyProps(this.props, victory_polar_axis_fallbackProps);\n\n if (this.shouldAnimate()) {\n return this.animateComponent(props, animationWhitelist);\n }\n\n var children = this.renderAxis(props);\n return props.standalone ? this.renderContainer(props.containerComponent, children) : children;\n }\n }]);\n\n return VictoryPolarAxis;\n}(react.Component);\n\nObject.defineProperty(VictoryPolarAxis, "animationWhitelist", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["style", "domain", "range", "tickCount", "tickValues", "padding", "width", "height"]\n});\nObject.defineProperty(VictoryPolarAxis, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryAxis"\n});\nObject.defineProperty(VictoryPolarAxis, "role", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "axis"\n});\nObject.defineProperty(VictoryPolarAxis, "defaultTransitions", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n onExit: {\n duration: 500\n },\n onEnter: {\n duration: 500\n }\n }\n});\nObject.defineProperty(VictoryPolarAxis, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_polar_axis_objectSpread({}, baseProps, {\n axisAngle: (prop_types_default()).number,\n axisComponent: (prop_types_default()).element,\n axisLabelComponent: (prop_types_default()).element,\n axisValue: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string, (prop_types_default()).object]),\n categories: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).string), prop_types_default().shape({\n x: prop_types_default().arrayOf((prop_types_default()).string),\n y: prop_types_default().arrayOf((prop_types_default()).string)\n })]),\n circularAxisComponent: (prop_types_default()).element,\n circularGridComponent: (prop_types_default()).element,\n containerComponent: (prop_types_default()).element,\n dependentAxis: (prop_types_default()).bool,\n disableInlineStyles: (prop_types_default()).bool,\n endAngle: (prop_types_default()).number,\n events: prop_types_default().arrayOf(prop_types_default().shape({\n target: prop_types_default().oneOf(["axis", "axisLabel", "grid", "ticks", "tickLabels"]),\n eventKey: prop_types_default().oneOfType([(prop_types_default()).array, allOfType([integer, nonNegative]), (prop_types_default()).string]),\n eventHandlers: (prop_types_default()).object\n })),\n gridComponent: (prop_types_default()).element,\n innerRadius: nonNegative,\n labelPlacement: prop_types_default().oneOf(["parallel", "perpendicular", "vertical"]),\n startAngle: (prop_types_default()).number,\n stringMap: (prop_types_default()).object,\n style: prop_types_default().shape({\n parent: (prop_types_default()).object,\n axis: (prop_types_default()).object,\n axisLabel: (prop_types_default()).object,\n grid: (prop_types_default()).object,\n ticks: (prop_types_default()).object,\n tickLabels: (prop_types_default()).object\n }),\n tickComponent: (prop_types_default()).element,\n tickCount: allOfType([integer, greaterThanZero]),\n tickFormat: prop_types_default().oneOfType([(prop_types_default()).func, homogeneousArray]),\n tickLabelComponent: (prop_types_default()).element,\n tickValues: homogeneousArray\n })\n});\nObject.defineProperty(VictoryPolarAxis, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n axisComponent: react.createElement(line_segment, null),\n axisLabelComponent: react.createElement(victory_label, null),\n circularAxisComponent: react.createElement(arc, null),\n circularGridComponent: react.createElement(arc, null),\n containerComponent: react.createElement(VictoryContainer, null),\n endAngle: 360,\n gridComponent: react.createElement(line_segment, null),\n groupComponent: react.createElement("g", {\n role: "presentation"\n }),\n labelPlacement: "parallel",\n startAngle: 0,\n standalone: true,\n theme: victory_theme.grayscale,\n tickComponent: react.createElement(line_segment, null),\n tickLabelComponent: react.createElement(victory_label, null)\n }\n});\nObject.defineProperty(VictoryPolarAxis, "getDomain", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: axis_getDomain\n});\nObject.defineProperty(VictoryPolarAxis, "getAxis", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: getAxis\n});\nObject.defineProperty(VictoryPolarAxis, "getScale", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: es_helper_methods_getScale\n});\nObject.defineProperty(VictoryPolarAxis, "getStyles", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return es_helper_methods_getStyles(props, victory_polar_axis_fallbackProps.style);\n }\n});\nObject.defineProperty(VictoryPolarAxis, "getBaseProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return helper_methods_getBaseProps(props, victory_polar_axis_fallbackProps);\n }\n});\nObject.defineProperty(VictoryPolarAxis, "expectedComponents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["axisComponent", "circularAxisComponent", "groupComponent", "containerComponent", "tickComponent", "tickLabelComponent", "gridComponent", "circularGridComponent"]\n});\n/* harmony default export */ const victory_polar_axis = (add_events(VictoryPolarAxis, victory_polar_axis_options));\n;// CONCATENATED MODULE: ./node_modules/victory-chart/es/helper-methods.js\n\n\n\nfunction es_helper_methods_toConsumableArray(arr) { return es_helper_methods_arrayWithoutHoles(arr) || es_helper_methods_iterableToArray(arr) || es_helper_methods_nonIterableSpread(); }\n\nfunction es_helper_methods_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction es_helper_methods_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction es_helper_methods_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\n/* eslint-disable func-style */\n\n/* eslint-disable no-use-before-define */\n\n\nvar helper_methods_fallbackProps = {\n width: 450,\n height: 300,\n padding: 50\n};\n\nfunction es_helper_methods_getAxisProps(child, props, calculatedProps) {\n var domain = calculatedProps.domain,\n scale = calculatedProps.scale,\n stringMap = calculatedProps.stringMap,\n categories = calculatedProps.categories,\n horizontal = calculatedProps.horizontal;\n return {\n stringMap: stringMap,\n horizontal: horizontal,\n categories: categories,\n startAngle: props.startAngle,\n endAngle: props.endAngle,\n innerRadius: props.innerRadius,\n domain: domain,\n scale: scale\n };\n}\n\nfunction getBackgroundWithProps(props, calculatedProps) {\n var backgroundElement = props.backgroundComponent;\n var height = props.polar ? calculatedProps.range.y[1] : calculatedProps.range.y[0] - calculatedProps.range.y[1];\n var width = calculatedProps.range.x[1] - calculatedProps.range.x[0];\n var xScale = props.horizontal ? calculatedProps.scale.y.range()[0] : calculatedProps.scale.x.range()[0];\n var yScale = props.horizontal ? calculatedProps.scale.x.range()[1] : calculatedProps.scale.y.range()[1];\n var xCoordinate = props.polar ? calculatedProps.origin.x : xScale;\n var yCoordinate = props.polar ? calculatedProps.origin.y : yScale;\n var parentName = props.name || "chart";\n var backgroundProps = {\n height: height,\n polar: props.polar,\n scale: calculatedProps.scale,\n style: props.style.background,\n x: xCoordinate,\n y: yCoordinate,\n key: "".concat(parentName, "-background"),\n width: width\n };\n return react.cloneElement(backgroundElement, defaults_default()({}, backgroundElement.props, backgroundProps));\n}\n\nfunction getChildProps(child, props, calculatedProps) {\n var axisChild = findAxisComponents([child]);\n\n if (axisChild.length > 0) {\n return es_helper_methods_getAxisProps(axisChild[0], props, calculatedProps);\n }\n\n var categories = calculatedProps.categories,\n domain = calculatedProps.domain,\n range = calculatedProps.range,\n scale = calculatedProps.scale,\n stringMap = calculatedProps.stringMap,\n horizontal = calculatedProps.horizontal;\n return {\n categories: categories,\n domain: domain,\n range: range,\n scale: scale,\n stringMap: stringMap,\n horizontal: horizontal\n };\n}\n\nfunction victory_chart_es_helper_methods_getStyles(props) {\n var styleProps = props.style && props.style.parent;\n return {\n parent: defaults_default()({}, styleProps, {\n height: "100%",\n width: "100%",\n userSelect: "none"\n })\n };\n}\n\nfunction helper_methods_getCalculatedProps(props, childComponents) {\n var style = victory_chart_es_helper_methods_getStyles(props);\n props = modifyProps(props, helper_methods_fallbackProps, "chart");\n var _props = props,\n horizontal = _props.horizontal,\n polar = _props.polar;\n var allStrings = getStringsFromChildren(props, childComponents);\n var categories = wrapper_getCategories(props, childComponents, allStrings);\n var stringMap = helper_methods_createStringMap(props, childComponents, allStrings);\n var domain = {\n x: helper_methods_getDomain(assign_default()({}, props, {\n categories: categories\n }), "x", childComponents),\n y: helper_methods_getDomain(assign_default()({}, props, {\n categories: categories\n }), "y", childComponents)\n };\n var range = {\n x: getRange(props, "x"),\n y: getRange(props, "y")\n };\n var baseScale = {\n x: getScaleFromProps(props, "x") || getScale(props, "x"),\n y: getScaleFromProps(props, "y") || getScale(props, "y")\n };\n var scale = {\n x: baseScale.x.domain(domain.x).range(horizontal ? range.y : range.x),\n y: baseScale.y.domain(domain.y).range(horizontal ? range.x : range.y)\n };\n var origin = polar ? getPolarOrigin(props) : getOrigin(domain);\n var padding = helpers_getPadding(props);\n return {\n categories: categories,\n domain: domain,\n range: range,\n horizontal: horizontal,\n scale: scale,\n stringMap: stringMap,\n style: style,\n origin: origin,\n padding: padding\n };\n}\nfunction getChildren(props, childComponents, calculatedProps) {\n childComponents = childComponents || getChildComponents(props);\n calculatedProps = calculatedProps || helper_methods_getCalculatedProps(props, childComponents);\n var baseStyle = calculatedProps.style.parent;\n var height = props.height,\n polar = props.polar,\n theme = props.theme,\n width = props.width;\n var _calculatedProps = calculatedProps,\n origin = _calculatedProps.origin,\n horizontal = _calculatedProps.horizontal;\n var parentName = props.name || "chart";\n return childComponents.map(function (child, index) {\n var role = child.type && child.type.role;\n var style = Array.isArray(child.props.style) ? child.props.style : defaults_default()({}, child.props.style, {\n parent: baseStyle\n });\n var childProps = getChildProps(child, props, calculatedProps);\n var name = child.props.name || "".concat(parentName, "-").concat(role, "-").concat(index);\n\n var newProps = defaults_default()({\n horizontal: horizontal,\n height: height,\n polar: polar,\n theme: theme,\n width: width,\n style: style,\n name: name,\n origin: polar ? origin : undefined,\n padding: calculatedProps.padding,\n key: "".concat(name, "-key-").concat(index),\n standalone: false\n }, childProps);\n\n return react.cloneElement(child, newProps);\n });\n}\nvar getChildComponents = function (props, defaultAxes) {\n var childComponents = react.Children.toArray(props.children);\n\n var newChildComponents = es_helper_methods_toConsumableArray(childComponents);\n\n if (childComponents.length === 0) {\n newChildComponents.push(defaultAxes.independent, defaultAxes.dependent);\n } else {\n var axisComponents = {\n dependent: getAxisComponentsWithParent(childComponents, "dependent"),\n independent: getAxisComponentsWithParent(childComponents, "independent")\n };\n\n if (axisComponents.dependent.length === 0 && axisComponents.independent.length === 0) {\n newChildComponents = props.prependDefaultAxes ? [defaultAxes.independent, defaultAxes.dependent].concat(newChildComponents) : newChildComponents.concat([defaultAxes.independent, defaultAxes.dependent]);\n }\n }\n\n return newChildComponents;\n};\n\nvar helper_methods_getDomain = function (props, axis, childComponents) {\n childComponents = childComponents || react.Children.toArray(props.children);\n var domain = wrapper_getDomain(props, axis, childComponents);\n var axisComponent = getAxisComponent(childComponents, axis);\n var invertDomain = axisComponent && axisComponent.props && axisComponent.props.invertAxis;\n return invertDomain ? domain.concat().reverse() : domain;\n};\n\nvar helper_methods_createStringMap = function (props, childComponents, allStrings) {\n var x = !allStrings.x || allStrings.x.length === 0 ? null : allStrings.x.reduce(function (memo, string, index) {\n memo[string] = index + 1;\n return memo;\n }, {});\n var y = !allStrings.y || allStrings.y.length === 0 ? null : allStrings.y.reduce(function (memo, string, index) {\n memo[string] = index + 1;\n return memo;\n }, {});\n return {\n x: x,\n y: y\n };\n};\n;// CONCATENATED MODULE: ./node_modules/victory-chart/es/victory-chart.js\n\n\n\n\nfunction victory_chart_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_chart_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_chart_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\nvar victory_chart_fallbackProps = {\n width: 450,\n height: 300,\n padding: 50\n};\n\nvar VictoryChart = function (initialProps) {\n var role = "chart";\n\n var _Hooks$useAnimationSt = useAnimationState(),\n getAnimationProps = _Hooks$useAnimationSt.getAnimationProps,\n setAnimationState = _Hooks$useAnimationSt.setAnimationState,\n getProps = _Hooks$useAnimationSt.getProps;\n\n var props = getProps(initialProps);\n var modifiedProps = modifyProps(props, victory_chart_fallbackProps, role);\n var eventKey = modifiedProps.eventKey,\n containerComponent = modifiedProps.containerComponent,\n standalone = modifiedProps.standalone,\n groupComponent = modifiedProps.groupComponent,\n externalEventMutations = modifiedProps.externalEventMutations,\n width = modifiedProps.width,\n height = modifiedProps.height,\n theme = modifiedProps.theme,\n polar = modifiedProps.polar,\n name = modifiedProps.name;\n var axes = props.polar ? modifiedProps.defaultPolarAxes : modifiedProps.defaultAxes;\n var childComponents = react.useMemo(function () {\n return getChildComponents(modifiedProps, axes);\n }, [modifiedProps, axes]);\n var calculatedProps = react.useMemo(function () {\n return helper_methods_getCalculatedProps(modifiedProps, childComponents);\n }, [modifiedProps, childComponents]);\n var domain = calculatedProps.domain,\n scale = calculatedProps.scale,\n style = calculatedProps.style,\n origin = calculatedProps.origin,\n radius = calculatedProps.radius,\n horizontal = calculatedProps.horizontal;\n var newChildren = react.useMemo(function () {\n var children = getChildren(props, childComponents, calculatedProps);\n var mappedChildren = children.map(function (child, index) {\n var childProps = assign_default()({\n animate: getAnimationProps(props, child, index, "victory chart")\n }, child.props);\n\n return react.cloneElement(child, childProps);\n });\n\n if (props.style && props.style.background) {\n var backgroundComponent = getBackgroundWithProps(props, calculatedProps);\n mappedChildren.unshift(backgroundComponent);\n }\n\n return mappedChildren;\n }, [getAnimationProps, childComponents, props, calculatedProps]);\n var containerProps = react.useMemo(function () {\n if (standalone) {\n return {\n domain: domain,\n scale: scale,\n width: width,\n height: height,\n standalone: standalone,\n theme: theme,\n style: style.parent,\n horizontal: horizontal,\n name: name,\n polar: polar,\n radius: radius,\n origin: polar ? origin : undefined\n };\n }\n\n return {};\n }, [domain, scale, width, height, standalone, theme, style, horizontal, name, polar, radius, origin]);\n var container = react.useMemo(function () {\n if (standalone) {\n var defaultContainerProps = defaults_default()({}, containerComponent.props, containerProps);\n\n return react.cloneElement(containerComponent, defaultContainerProps);\n }\n\n return groupComponent;\n }, [groupComponent, standalone, containerComponent, containerProps]);\n var events = react.useMemo(function () {\n return getAllEvents(props);\n }, [props]);\n var previousProps = usePreviousProps(initialProps);\n react.useEffect(function () {\n // This is called before dismount to keep state in sync\n return function () {\n if (initialProps.animate) {\n setAnimationState(previousProps, initialProps);\n }\n };\n }, [setAnimationState, previousProps, initialProps]);\n\n if (!isEmpty_default()(events)) {\n return react.createElement(VictorySharedEvents, {\n container: container,\n eventKey: eventKey,\n events: events,\n externalEventMutations: externalEventMutations\n }, newChildren);\n }\n\n return react.cloneElement(container, container.props, newChildren);\n};\n\nVictoryChart.propTypes = victory_chart_objectSpread({}, baseProps, {\n backgroundComponent: (prop_types_default()).element,\n children: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).node), (prop_types_default()).node]),\n defaultAxes: prop_types_default().shape({\n independent: (prop_types_default()).element,\n dependent: (prop_types_default()).element\n }),\n defaultPolarAxes: prop_types_default().shape({\n independent: (prop_types_default()).element,\n dependent: (prop_types_default()).element\n }),\n endAngle: (prop_types_default()).number,\n innerRadius: nonNegative,\n prependDefaultAxes: (prop_types_default()).bool,\n startAngle: (prop_types_default()).number\n});\nVictoryChart.defaultProps = {\n backgroundComponent: react.createElement(background, null),\n containerComponent: react.createElement(VictoryContainer, null),\n defaultAxes: {\n independent: react.createElement(victory_axis, null),\n dependent: react.createElement(victory_axis, {\n dependentAxis: true\n })\n },\n defaultPolarAxes: {\n independent: react.createElement(victory_polar_axis, null),\n dependent: react.createElement(victory_polar_axis, {\n dependentAxis: true\n })\n },\n groupComponent: react.createElement("g", null),\n standalone: true,\n theme: victory_theme.grayscale\n};\nvar VictoryChartMemo = react.memo(VictoryChart, (react_fast_compare_default()));\nVictoryChartMemo.displayName = "VictoryChart";\nVictoryChartMemo.expectedComponents = ["groupComponent", "containerComponent"];\n/* harmony default export */ const victory_chart = (VictoryChartMemo);\n// EXTERNAL MODULE: ./node_modules/lodash/cloneDeep.js\nvar cloneDeep = __webpack_require__(361);\nvar cloneDeep_default = /*#__PURE__*/__webpack_require__.n(cloneDeep);\n// EXTERNAL MODULE: ./node_modules/lodash/merge.js\nvar merge = __webpack_require__(2492);\nvar merge_default = /*#__PURE__*/__webpack_require__.n(merge);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_blue_100.js\nconst chart_color_blue_100 = {\n "name": "--pf-chart-color-blue-100",\n "value": "#8bc1f7",\n "var": "var(--pf-chart-color-blue-100)"\n};\n/* harmony default export */ const esm_chart_color_blue_100 = (chart_color_blue_100);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_blue_200.js\nconst chart_color_blue_200 = {\n "name": "--pf-chart-color-blue-200",\n "value": "#519de9",\n "var": "var(--pf-chart-color-blue-200)"\n};\n/* harmony default export */ const esm_chart_color_blue_200 = (chart_color_blue_200);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_blue_300.js\nconst chart_color_blue_300 = {\n "name": "--pf-chart-color-blue-300",\n "value": "#06c",\n "var": "var(--pf-chart-color-blue-300)"\n};\n/* harmony default export */ const esm_chart_color_blue_300 = (chart_color_blue_300);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_blue_400.js\nconst chart_color_blue_400 = {\n "name": "--pf-chart-color-blue-400",\n "value": "#004b95",\n "var": "var(--pf-chart-color-blue-400)"\n};\n/* harmony default export */ const esm_chart_color_blue_400 = (chart_color_blue_400);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_blue_500.js\nconst chart_color_blue_500 = {\n "name": "--pf-chart-color-blue-500",\n "value": "#002f5d",\n "var": "var(--pf-chart-color-blue-500)"\n};\n/* harmony default export */ const esm_chart_color_blue_500 = (chart_color_blue_500);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/color-theme.js\n// Victory theme properties only\nconst ColorTheme = (props) => {\n const { COLOR_SCALE } = props;\n return {\n area: {\n colorScale: COLOR_SCALE,\n style: {\n data: {\n fill: COLOR_SCALE[0]\n }\n }\n },\n axis: {\n colorScale: COLOR_SCALE\n },\n bar: {\n colorScale: COLOR_SCALE,\n style: {\n data: {\n fill: COLOR_SCALE[0]\n }\n }\n },\n boxplot: {\n colorScale: COLOR_SCALE\n },\n candlestick: {\n colorScale: COLOR_SCALE\n },\n chart: {\n colorScale: COLOR_SCALE\n },\n errorbar: {\n colorScale: COLOR_SCALE\n },\n group: {\n colorScale: COLOR_SCALE\n },\n legend: {\n colorScale: COLOR_SCALE\n },\n line: {\n colorScale: COLOR_SCALE,\n style: {\n data: {\n stroke: COLOR_SCALE[0]\n }\n }\n },\n pie: {\n colorScale: COLOR_SCALE\n },\n scatter: {\n colorScale: COLOR_SCALE\n },\n stack: {\n colorScale: COLOR_SCALE\n },\n voronoi: {\n colorScale: COLOR_SCALE\n }\n };\n};\n//# sourceMappingURL=color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/dark/blue-color-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Color scale\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst COLOR_SCALE = [\n esm_chart_color_blue_300.value,\n esm_chart_color_blue_100.value,\n esm_chart_color_blue_500.value,\n esm_chart_color_blue_200.value,\n esm_chart_color_blue_400.value\n];\nconst DarkBlueColorTheme = ColorTheme({\n COLOR_SCALE\n});\n//# sourceMappingURL=blue-color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_cyan_100.js\nconst chart_color_cyan_100 = {\n "name": "--pf-chart-color-cyan-100",\n "value": "#a2d9d9",\n "var": "var(--pf-chart-color-cyan-100)"\n};\n/* harmony default export */ const esm_chart_color_cyan_100 = (chart_color_cyan_100);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_cyan_200.js\nconst chart_color_cyan_200 = {\n "name": "--pf-chart-color-cyan-200",\n "value": "#73c5c5",\n "var": "var(--pf-chart-color-cyan-200)"\n};\n/* harmony default export */ const esm_chart_color_cyan_200 = (chart_color_cyan_200);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_cyan_300.js\nconst chart_color_cyan_300 = {\n "name": "--pf-chart-color-cyan-300",\n "value": "#009596",\n "var": "var(--pf-chart-color-cyan-300)"\n};\n/* harmony default export */ const esm_chart_color_cyan_300 = (chart_color_cyan_300);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_cyan_400.js\nconst chart_color_cyan_400 = {\n "name": "--pf-chart-color-cyan-400",\n "value": "#005f60",\n "var": "var(--pf-chart-color-cyan-400)"\n};\n/* harmony default export */ const esm_chart_color_cyan_400 = (chart_color_cyan_400);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_cyan_500.js\nconst chart_color_cyan_500 = {\n "name": "--pf-chart-color-cyan-500",\n "value": "#003737",\n "var": "var(--pf-chart-color-cyan-500)"\n};\n/* harmony default export */ const esm_chart_color_cyan_500 = (chart_color_cyan_500);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/dark/cyan-color-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Color scale\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst cyan_color_theme_COLOR_SCALE = [\n esm_chart_color_cyan_300.value,\n esm_chart_color_cyan_100.value,\n esm_chart_color_cyan_500.value,\n esm_chart_color_cyan_200.value,\n esm_chart_color_cyan_400.value\n];\nconst DarkCyanColorTheme = ColorTheme({\n COLOR_SCALE: cyan_color_theme_COLOR_SCALE\n});\n//# sourceMappingURL=cyan-color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_gold_100.js\nconst chart_color_gold_100 = {\n "name": "--pf-chart-color-gold-100",\n "value": "#f9e0a2",\n "var": "var(--pf-chart-color-gold-100)"\n};\n/* harmony default export */ const esm_chart_color_gold_100 = (chart_color_gold_100);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_gold_200.js\nconst chart_color_gold_200 = {\n "name": "--pf-chart-color-gold-200",\n "value": "#f6d173",\n "var": "var(--pf-chart-color-gold-200)"\n};\n/* harmony default export */ const esm_chart_color_gold_200 = (chart_color_gold_200);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_gold_300.js\nconst chart_color_gold_300 = {\n "name": "--pf-chart-color-gold-300",\n "value": "#f4c145",\n "var": "var(--pf-chart-color-gold-300)"\n};\n/* harmony default export */ const esm_chart_color_gold_300 = (chart_color_gold_300);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_gold_400.js\nconst chart_color_gold_400 = {\n "name": "--pf-chart-color-gold-400",\n "value": "#f0ab00",\n "var": "var(--pf-chart-color-gold-400)"\n};\n/* harmony default export */ const esm_chart_color_gold_400 = (chart_color_gold_400);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_gold_500.js\nconst chart_color_gold_500 = {\n "name": "--pf-chart-color-gold-500",\n "value": "#c58c00",\n "var": "var(--pf-chart-color-gold-500)"\n};\n/* harmony default export */ const esm_chart_color_gold_500 = (chart_color_gold_500);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/dark/gold-color-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Color scale\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst gold_color_theme_COLOR_SCALE = [\n esm_chart_color_gold_300.value,\n esm_chart_color_gold_100.value,\n esm_chart_color_gold_500.value,\n esm_chart_color_gold_200.value,\n esm_chart_color_gold_400.value\n];\nconst DarkGoldColorTheme = ColorTheme({\n COLOR_SCALE: gold_color_theme_COLOR_SCALE\n});\n//# sourceMappingURL=gold-color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_black_100.js\nconst chart_color_black_100 = {\n "name": "--pf-chart-color-black-100",\n "value": "#f0f0f0",\n "var": "var(--pf-chart-color-black-100)"\n};\n/* harmony default export */ const esm_chart_color_black_100 = (chart_color_black_100);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_black_200.js\nconst chart_color_black_200 = {\n "name": "--pf-chart-color-black-200",\n "value": "#d2d2d2",\n "var": "var(--pf-chart-color-black-200)"\n};\n/* harmony default export */ const esm_chart_color_black_200 = (chart_color_black_200);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_black_300.js\nconst chart_color_black_300 = {\n "name": "--pf-chart-color-black-300",\n "value": "#b8bbbe",\n "var": "var(--pf-chart-color-black-300)"\n};\n/* harmony default export */ const esm_chart_color_black_300 = (chart_color_black_300);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_black_400.js\nconst chart_color_black_400 = {\n "name": "--pf-chart-color-black-400",\n "value": "#8a8d90",\n "var": "var(--pf-chart-color-black-400)"\n};\n/* harmony default export */ const esm_chart_color_black_400 = (chart_color_black_400);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_black_500.js\nconst chart_color_black_500 = {\n "name": "--pf-chart-color-black-500",\n "value": "#6a6e73",\n "var": "var(--pf-chart-color-black-500)"\n};\n/* harmony default export */ const esm_chart_color_black_500 = (chart_color_black_500);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/dark/gray-color-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Color scale\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst gray_color_theme_COLOR_SCALE = [\n esm_chart_color_black_300.value,\n esm_chart_color_black_100.value,\n esm_chart_color_black_500.value,\n esm_chart_color_black_200.value,\n esm_chart_color_black_400.value\n];\nconst DarkGrayColorTheme = ColorTheme({\n COLOR_SCALE: gray_color_theme_COLOR_SCALE\n});\n//# sourceMappingURL=gray-color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_green_100.js\nconst chart_color_green_100 = {\n "name": "--pf-chart-color-green-100",\n "value": "#bde2b9",\n "var": "var(--pf-chart-color-green-100)"\n};\n/* harmony default export */ const esm_chart_color_green_100 = (chart_color_green_100);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_green_200.js\nconst chart_color_green_200 = {\n "name": "--pf-chart-color-green-200",\n "value": "#7cc674",\n "var": "var(--pf-chart-color-green-200)"\n};\n/* harmony default export */ const esm_chart_color_green_200 = (chart_color_green_200);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_green_300.js\nconst chart_color_green_300 = {\n "name": "--pf-chart-color-green-300",\n "value": "#4cb140",\n "var": "var(--pf-chart-color-green-300)"\n};\n/* harmony default export */ const esm_chart_color_green_300 = (chart_color_green_300);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_green_400.js\nconst chart_color_green_400 = {\n "name": "--pf-chart-color-green-400",\n "value": "#38812f",\n "var": "var(--pf-chart-color-green-400)"\n};\n/* harmony default export */ const esm_chart_color_green_400 = (chart_color_green_400);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_green_500.js\nconst chart_color_green_500 = {\n "name": "--pf-chart-color-green-500",\n "value": "#23511e",\n "var": "var(--pf-chart-color-green-500)"\n};\n/* harmony default export */ const esm_chart_color_green_500 = (chart_color_green_500);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/dark/green-color-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Color scale\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst green_color_theme_COLOR_SCALE = [\n esm_chart_color_green_300.value,\n esm_chart_color_green_100.value,\n esm_chart_color_green_500.value,\n esm_chart_color_green_200.value,\n esm_chart_color_green_400.value\n];\nconst DarkGreenColorTheme = ColorTheme({\n COLOR_SCALE: green_color_theme_COLOR_SCALE\n});\n//# sourceMappingURL=green-color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_orange_100.js\nconst chart_color_orange_100 = {\n "name": "--pf-chart-color-orange-100",\n "value": "#f4b678",\n "var": "var(--pf-chart-color-orange-100)"\n};\n/* harmony default export */ const esm_chart_color_orange_100 = (chart_color_orange_100);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_orange_200.js\nconst chart_color_orange_200 = {\n "name": "--pf-chart-color-orange-200",\n "value": "#ef9234",\n "var": "var(--pf-chart-color-orange-200)"\n};\n/* harmony default export */ const esm_chart_color_orange_200 = (chart_color_orange_200);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_orange_300.js\nconst chart_color_orange_300 = {\n "name": "--pf-chart-color-orange-300",\n "value": "#ec7a08",\n "var": "var(--pf-chart-color-orange-300)"\n};\n/* harmony default export */ const esm_chart_color_orange_300 = (chart_color_orange_300);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_orange_400.js\nconst chart_color_orange_400 = {\n "name": "--pf-chart-color-orange-400",\n "value": "#c46100",\n "var": "var(--pf-chart-color-orange-400)"\n};\n/* harmony default export */ const esm_chart_color_orange_400 = (chart_color_orange_400);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_orange_500.js\nconst chart_color_orange_500 = {\n "name": "--pf-chart-color-orange-500",\n "value": "#8f4700",\n "var": "var(--pf-chart-color-orange-500)"\n};\n/* harmony default export */ const esm_chart_color_orange_500 = (chart_color_orange_500);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/dark/multi-color-ordered-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// The color order below (minus the purple color family) improves the color contrast in ordered charts; donut, pie, bar, & stack\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst multi_color_ordered_theme_COLOR_SCALE = [\n esm_chart_color_blue_300.value,\n esm_chart_color_green_300.value,\n esm_chart_color_cyan_300.value,\n esm_chart_color_gold_300.value,\n esm_chart_color_orange_300.value,\n esm_chart_color_blue_100.value,\n esm_chart_color_green_500.value,\n esm_chart_color_cyan_100.value,\n esm_chart_color_gold_100.value,\n esm_chart_color_orange_500.value,\n esm_chart_color_blue_500.value,\n esm_chart_color_green_100.value,\n esm_chart_color_cyan_500.value,\n esm_chart_color_gold_500.value,\n esm_chart_color_orange_100.value,\n esm_chart_color_blue_200.value,\n esm_chart_color_green_400.value,\n esm_chart_color_cyan_200.value,\n esm_chart_color_gold_200.value,\n esm_chart_color_orange_400.value,\n esm_chart_color_blue_400.value,\n esm_chart_color_green_200.value,\n esm_chart_color_cyan_400.value,\n esm_chart_color_gold_400.value,\n esm_chart_color_orange_200.value\n];\nconst DarkMultiColorOrderedTheme = ColorTheme({\n COLOR_SCALE: multi_color_ordered_theme_COLOR_SCALE\n});\n//# sourceMappingURL=multi-color-ordered-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_purple_100.js\nconst chart_color_purple_100 = {\n "name": "--pf-chart-color-purple-100",\n "value": "#b2b0ea",\n "var": "var(--pf-chart-color-purple-100)"\n};\n/* harmony default export */ const esm_chart_color_purple_100 = (chart_color_purple_100);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_purple_200.js\nconst chart_color_purple_200 = {\n "name": "--pf-chart-color-purple-200",\n "value": "#8481dd",\n "var": "var(--pf-chart-color-purple-200)"\n};\n/* harmony default export */ const esm_chart_color_purple_200 = (chart_color_purple_200);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_purple_300.js\nconst chart_color_purple_300 = {\n "name": "--pf-chart-color-purple-300",\n "value": "#5752d1",\n "var": "var(--pf-chart-color-purple-300)"\n};\n/* harmony default export */ const esm_chart_color_purple_300 = (chart_color_purple_300);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_purple_400.js\nconst chart_color_purple_400 = {\n "name": "--pf-chart-color-purple-400",\n "value": "#3c3d99",\n "var": "var(--pf-chart-color-purple-400)"\n};\n/* harmony default export */ const esm_chart_color_purple_400 = (chart_color_purple_400);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_purple_500.js\nconst chart_color_purple_500 = {\n "name": "--pf-chart-color-purple-500",\n "value": "#2a265f",\n "var": "var(--pf-chart-color-purple-500)"\n};\n/* harmony default export */ const esm_chart_color_purple_500 = (chart_color_purple_500);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/dark/multi-color-unordered-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// The color order below improves the color contrast in unordered charts; area & line\n// See https://github.com/patternfly/patternfly-next/issues/1551\nconst multi_color_unordered_theme_COLOR_SCALE = [\n esm_chart_color_blue_300.value,\n esm_chart_color_gold_300.value,\n esm_chart_color_green_300.value,\n esm_chart_color_purple_300.value,\n esm_chart_color_orange_300.value,\n esm_chart_color_cyan_300.value,\n esm_chart_color_black_300.value,\n esm_chart_color_blue_100.value,\n esm_chart_color_gold_500.value,\n esm_chart_color_green_100.value,\n esm_chart_color_purple_500.value,\n esm_chart_color_orange_100.value,\n esm_chart_color_cyan_500.value,\n esm_chart_color_black_100.value,\n esm_chart_color_blue_500.value,\n esm_chart_color_gold_100.value,\n esm_chart_color_green_500.value,\n esm_chart_color_purple_100.value,\n esm_chart_color_orange_500.value,\n esm_chart_color_cyan_100.value,\n esm_chart_color_black_500.value,\n esm_chart_color_blue_200.value,\n esm_chart_color_gold_400.value,\n esm_chart_color_green_200.value,\n esm_chart_color_purple_400.value,\n esm_chart_color_orange_200.value,\n esm_chart_color_cyan_400.value,\n esm_chart_color_black_200.value,\n esm_chart_color_blue_400.value,\n esm_chart_color_gold_200.value,\n esm_chart_color_green_400.value,\n esm_chart_color_purple_200.value,\n esm_chart_color_orange_400.value,\n esm_chart_color_cyan_200.value,\n esm_chart_color_black_400.value\n];\nconst DarkMultiColorUnorderedTheme = ColorTheme({\n COLOR_SCALE: multi_color_unordered_theme_COLOR_SCALE\n});\n//# sourceMappingURL=multi-color-unordered-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/dark/orange-color-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Color scale\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst orange_color_theme_COLOR_SCALE = [\n esm_chart_color_orange_300.value,\n esm_chart_color_orange_100.value,\n esm_chart_color_orange_500.value,\n esm_chart_color_orange_200.value,\n esm_chart_color_orange_400.value\n];\nconst DarkOrangeColorTheme = ColorTheme({\n COLOR_SCALE: orange_color_theme_COLOR_SCALE\n});\n//# sourceMappingURL=orange-color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/dark/purple-color-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Color scale\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst purple_color_theme_COLOR_SCALE = [\n esm_chart_color_purple_300.value,\n esm_chart_color_purple_100.value,\n esm_chart_color_purple_500.value,\n esm_chart_color_purple_200.value,\n esm_chart_color_purple_400.value\n];\nconst DarkPurpleColorTheme = ColorTheme({\n COLOR_SCALE: purple_color_theme_COLOR_SCALE\n});\n//# sourceMappingURL=purple-color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/light/blue-color-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Color scale\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst blue_color_theme_COLOR_SCALE = [\n esm_chart_color_blue_300.value,\n esm_chart_color_blue_100.value,\n esm_chart_color_blue_500.value,\n esm_chart_color_blue_200.value,\n esm_chart_color_blue_400.value\n];\nconst LightBlueColorTheme = ColorTheme({\n COLOR_SCALE: blue_color_theme_COLOR_SCALE\n});\n//# sourceMappingURL=blue-color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/light/cyan-color-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Color scale\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst light_cyan_color_theme_COLOR_SCALE = [\n esm_chart_color_cyan_300.value,\n esm_chart_color_cyan_100.value,\n esm_chart_color_cyan_500.value,\n esm_chart_color_cyan_200.value,\n esm_chart_color_cyan_400.value\n];\nconst LightCyanColorTheme = ColorTheme({\n COLOR_SCALE: light_cyan_color_theme_COLOR_SCALE\n});\n//# sourceMappingURL=cyan-color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/light/gold-color-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Color scale\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst light_gold_color_theme_COLOR_SCALE = [\n esm_chart_color_gold_300.value,\n esm_chart_color_gold_100.value,\n esm_chart_color_gold_500.value,\n esm_chart_color_gold_200.value,\n esm_chart_color_gold_400.value\n];\nconst LightGoldColorTheme = ColorTheme({\n COLOR_SCALE: light_gold_color_theme_COLOR_SCALE\n});\n//# sourceMappingURL=gold-color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/light/gray-color-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Color scale\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst light_gray_color_theme_COLOR_SCALE = [\n esm_chart_color_black_300.value,\n esm_chart_color_black_100.value,\n esm_chart_color_black_500.value,\n esm_chart_color_black_200.value,\n esm_chart_color_black_400.value\n];\nconst LightGrayColorTheme = ColorTheme({\n COLOR_SCALE: light_gray_color_theme_COLOR_SCALE\n});\n//# sourceMappingURL=gray-color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/light/green-color-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Color scale\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst light_green_color_theme_COLOR_SCALE = [\n esm_chart_color_green_300.value,\n esm_chart_color_green_100.value,\n esm_chart_color_green_500.value,\n esm_chart_color_green_200.value,\n esm_chart_color_green_400.value\n];\nconst LightGreenColorTheme = ColorTheme({\n COLOR_SCALE: light_green_color_theme_COLOR_SCALE\n});\n//# sourceMappingURL=green-color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/light/multi-color-ordered-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// The color order below (minus the purple color family) improves the color contrast in ordered charts; donut, pie, bar, & stack\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst light_multi_color_ordered_theme_COLOR_SCALE = [\n esm_chart_color_blue_300.value,\n esm_chart_color_green_300.value,\n esm_chart_color_cyan_300.value,\n esm_chart_color_gold_300.value,\n esm_chart_color_orange_300.value,\n esm_chart_color_blue_100.value,\n esm_chart_color_green_500.value,\n esm_chart_color_cyan_100.value,\n esm_chart_color_gold_100.value,\n esm_chart_color_orange_500.value,\n esm_chart_color_blue_500.value,\n esm_chart_color_green_100.value,\n esm_chart_color_cyan_500.value,\n esm_chart_color_gold_500.value,\n esm_chart_color_orange_100.value,\n esm_chart_color_blue_200.value,\n esm_chart_color_green_400.value,\n esm_chart_color_cyan_200.value,\n esm_chart_color_gold_200.value,\n esm_chart_color_orange_400.value,\n esm_chart_color_blue_400.value,\n esm_chart_color_green_200.value,\n esm_chart_color_cyan_400.value,\n esm_chart_color_gold_400.value,\n esm_chart_color_orange_200.value\n];\nconst LightMultiColorOrderedTheme = ColorTheme({\n COLOR_SCALE: light_multi_color_ordered_theme_COLOR_SCALE\n});\n//# sourceMappingURL=multi-color-ordered-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/light/multi-color-unordered-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// The color order below improves the color contrast in unordered charts; area & line\n// See https://github.com/patternfly/patternfly-next/issues/1551\nconst light_multi_color_unordered_theme_COLOR_SCALE = [\n esm_chart_color_blue_300.value,\n esm_chart_color_gold_300.value,\n esm_chart_color_green_300.value,\n esm_chart_color_purple_300.value,\n esm_chart_color_orange_300.value,\n esm_chart_color_cyan_300.value,\n esm_chart_color_black_300.value,\n esm_chart_color_blue_100.value,\n esm_chart_color_gold_500.value,\n esm_chart_color_green_100.value,\n esm_chart_color_purple_500.value,\n esm_chart_color_orange_100.value,\n esm_chart_color_cyan_500.value,\n esm_chart_color_black_100.value,\n esm_chart_color_blue_500.value,\n esm_chart_color_gold_100.value,\n esm_chart_color_green_500.value,\n esm_chart_color_purple_100.value,\n esm_chart_color_orange_500.value,\n esm_chart_color_cyan_100.value,\n esm_chart_color_black_500.value,\n esm_chart_color_blue_200.value,\n esm_chart_color_gold_400.value,\n esm_chart_color_green_200.value,\n esm_chart_color_purple_400.value,\n esm_chart_color_orange_200.value,\n esm_chart_color_cyan_400.value,\n esm_chart_color_black_200.value,\n esm_chart_color_blue_400.value,\n esm_chart_color_gold_200.value,\n esm_chart_color_green_400.value,\n esm_chart_color_purple_200.value,\n esm_chart_color_orange_400.value,\n esm_chart_color_cyan_200.value,\n esm_chart_color_black_400.value\n];\nconst LightMultiColorUnorderedTheme = ColorTheme({\n COLOR_SCALE: light_multi_color_unordered_theme_COLOR_SCALE\n});\n//# sourceMappingURL=multi-color-unordered-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/light/orange-color-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Color scale\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst light_orange_color_theme_COLOR_SCALE = [\n esm_chart_color_orange_300.value,\n esm_chart_color_orange_100.value,\n esm_chart_color_orange_500.value,\n esm_chart_color_orange_200.value,\n esm_chart_color_orange_400.value\n];\nconst LightOrangeColorTheme = ColorTheme({\n COLOR_SCALE: light_orange_color_theme_COLOR_SCALE\n});\n//# sourceMappingURL=orange-color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/light/purple-color-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Color scale\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit\nconst light_purple_color_theme_COLOR_SCALE = [\n esm_chart_color_purple_300.value,\n esm_chart_color_purple_100.value,\n esm_chart_color_purple_500.value,\n esm_chart_color_purple_200.value,\n esm_chart_color_purple_400.value\n];\nconst LightPurpleColorTheme = ColorTheme({\n COLOR_SCALE: light_purple_color_theme_COLOR_SCALE\n});\n//# sourceMappingURL=purple-color-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_axis_grid_stroke_Color.js\nconst chart_axis_grid_stroke_Color = {\n "name": "--pf-chart-axis--grid--stroke--Color",\n "value": "#d2d2d2",\n "var": "var(--pf-chart-axis--grid--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_axis_grid_stroke_Color = (chart_axis_grid_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_axis_tick_stroke_Color.js\nconst chart_axis_tick_stroke_Color = {\n "name": "--pf-chart-axis--tick--stroke--Color",\n "value": "#d2d2d2",\n "var": "var(--pf-chart-axis--tick--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_axis_tick_stroke_Color = (chart_axis_tick_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/axis-theme.js\n/* eslint-disable camelcase */\n\n\n// Axis theme\nconst AxisTheme = {\n axis: {\n style: {\n grid: {\n stroke: esm_chart_axis_grid_stroke_Color.value\n },\n ticks: {\n stroke: esm_chart_axis_tick_stroke_Color.value\n }\n }\n }\n};\n//# sourceMappingURL=axis-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_global_FontFamily.js\nconst chart_global_FontFamily = {\n "name": "--pf-chart-global--FontFamily",\n "value": "\\"RedHatText\\", \\"Overpass\\", overpass, helvetica, arial, sans-serif",\n "var": "var(--pf-chart-global--FontFamily)"\n};\n/* harmony default export */ const esm_chart_global_FontFamily = (chart_global_FontFamily);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_global_letter_spacing.js\nconst chart_global_letter_spacing = {\n "name": "--pf-chart-global--letter-spacing",\n "value": "normal",\n "var": "var(--pf-chart-global--letter-spacing)"\n};\n/* harmony default export */ const esm_chart_global_letter_spacing = (chart_global_letter_spacing);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_global_FontSize_sm.js\nconst chart_global_FontSize_sm = {\n "name": "--pf-chart-global--FontSize--sm",\n "value": 14,\n "var": "var(--pf-chart-global--FontSize--sm)"\n};\n/* harmony default export */ const esm_chart_global_FontSize_sm = (chart_global_FontSize_sm);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_global_label_Padding.js\nconst chart_global_label_Padding = {\n "name": "--pf-chart-global--label--Padding",\n "value": 10,\n "var": "var(--pf-chart-global--label--Padding)"\n};\n/* harmony default export */ const esm_chart_global_label_Padding = (chart_global_label_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_global_label_stroke.js\nconst chart_global_label_stroke = {\n "name": "--pf-chart-global--label--stroke",\n "value": "transparent",\n "var": "var(--pf-chart-global--label--stroke)"\n};\n/* harmony default export */ const esm_chart_global_label_stroke = (chart_global_label_stroke);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_global_label_text_anchor.js\nconst chart_global_label_text_anchor = {\n "name": "--pf-chart-global--label--text-anchor",\n "value": "middle",\n "var": "var(--pf-chart-global--label--text-anchor)"\n};\n/* harmony default export */ const esm_chart_global_label_text_anchor = (chart_global_label_text_anchor);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_global_layout_Padding.js\nconst chart_global_layout_Padding = {\n "name": "--pf-chart-global--layout--Padding",\n "value": 50,\n "var": "var(--pf-chart-global--layout--Padding)"\n};\n/* harmony default export */ const esm_chart_global_layout_Padding = (chart_global_layout_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_global_layout_Height.js\nconst chart_global_layout_Height = {\n "name": "--pf-chart-global--layout--Height",\n "value": 300,\n "var": "var(--pf-chart-global--layout--Height)"\n};\n/* harmony default export */ const esm_chart_global_layout_Height = (chart_global_layout_Height);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_global_layout_Width.js\nconst chart_global_layout_Width = {\n "name": "--pf-chart-global--layout--Width",\n "value": 450,\n "var": "var(--pf-chart-global--layout--Width)"\n};\n/* harmony default export */ const esm_chart_global_layout_Width = (chart_global_layout_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_global_stroke_line_cap.js\nconst chart_global_stroke_line_cap = {\n "name": "--pf-chart-global--stroke-line-cap",\n "value": "round",\n "var": "var(--pf-chart-global--stroke-line-cap)"\n};\n/* harmony default export */ const esm_chart_global_stroke_line_cap = (chart_global_stroke_line_cap);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_global_stroke_line_join.js\nconst chart_global_stroke_line_join = {\n "name": "--pf-chart-global--stroke-line-join",\n "value": "round",\n "var": "var(--pf-chart-global--stroke-line-join)"\n};\n/* harmony default export */ const esm_chart_global_stroke_line_join = (chart_global_stroke_line_join);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_area_data_Fill.js\nconst chart_area_data_Fill = {\n "name": "--pf-chart-area--data--Fill",\n "value": "#151515",\n "var": "var(--pf-chart-area--data--Fill)"\n};\n/* harmony default export */ const esm_chart_area_data_Fill = (chart_area_data_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_area_Opacity.js\nconst chart_area_Opacity = {\n "name": "--pf-chart-area--Opacity",\n "value": 0.3,\n "var": "var(--pf-chart-area--Opacity)"\n};\n/* harmony default export */ const esm_chart_area_Opacity = (chart_area_Opacity);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_area_stroke_Width.js\nconst chart_area_stroke_Width = {\n "name": "--pf-chart-area--stroke--Width",\n "value": 2,\n "var": "var(--pf-chart-area--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_area_stroke_Width = (chart_area_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_axis_axis_stroke_Width.js\nconst chart_axis_axis_stroke_Width = {\n "name": "--pf-chart-axis--axis--stroke--Width",\n "value": 1,\n "var": "var(--pf-chart-axis--axis--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_axis_axis_stroke_Width = (chart_axis_axis_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_axis_axis_stroke_Color.js\nconst chart_axis_axis_stroke_Color = {\n "name": "--pf-chart-axis--axis--stroke--Color",\n "value": "#d2d2d2",\n "var": "var(--pf-chart-axis--axis--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_axis_axis_stroke_Color = (chart_axis_axis_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_axis_axis_Fill.js\nconst chart_axis_axis_Fill = {\n "name": "--pf-chart-axis--axis--Fill",\n "value": "transparent",\n "var": "var(--pf-chart-axis--axis--Fill)"\n};\n/* harmony default export */ const esm_chart_axis_axis_Fill = (chart_axis_axis_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_axis_axis_label_Padding.js\nconst chart_axis_axis_label_Padding = {\n "name": "--pf-chart-axis--axis-label--Padding",\n "value": 40,\n "var": "var(--pf-chart-axis--axis-label--Padding)"\n};\n/* harmony default export */ const esm_chart_axis_axis_label_Padding = (chart_axis_axis_label_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_axis_axis_label_stroke_Color.js\nconst chart_axis_axis_label_stroke_Color = {\n "name": "--pf-chart-axis--axis-label--stroke--Color",\n "value": "transparent",\n "var": "var(--pf-chart-axis--axis-label--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_axis_axis_label_stroke_Color = (chart_axis_axis_label_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_axis_grid_Fill.js\nconst chart_axis_grid_Fill = {\n "name": "--pf-chart-axis--grid--Fill",\n "value": "none",\n "var": "var(--pf-chart-axis--grid--Fill)"\n};\n/* harmony default export */ const esm_chart_axis_grid_Fill = (chart_axis_grid_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_axis_grid_PointerEvents.js\nconst chart_axis_grid_PointerEvents = {\n "name": "--pf-chart-axis--grid--PointerEvents",\n "value": "painted",\n "var": "var(--pf-chart-axis--grid--PointerEvents)"\n};\n/* harmony default export */ const esm_chart_axis_grid_PointerEvents = (chart_axis_grid_PointerEvents);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_axis_tick_Fill.js\nconst chart_axis_tick_Fill = {\n "name": "--pf-chart-axis--tick--Fill",\n "value": "transparent",\n "var": "var(--pf-chart-axis--tick--Fill)"\n};\n/* harmony default export */ const esm_chart_axis_tick_Fill = (chart_axis_tick_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_axis_tick_Size.js\nconst chart_axis_tick_Size = {\n "name": "--pf-chart-axis--tick--Size",\n "value": 5,\n "var": "var(--pf-chart-axis--tick--Size)"\n};\n/* harmony default export */ const esm_chart_axis_tick_Size = (chart_axis_tick_Size);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_axis_tick_Width.js\nconst chart_axis_tick_Width = {\n "name": "--pf-chart-axis--tick--Width",\n "value": 1,\n "var": "var(--pf-chart-axis--tick--Width)"\n};\n/* harmony default export */ const esm_chart_axis_tick_Width = (chart_axis_tick_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_axis_tick_label_Fill.js\nconst chart_axis_tick_label_Fill = {\n "name": "--pf-chart-axis--tick-label--Fill",\n "value": "#4f5255",\n "var": "var(--pf-chart-axis--tick-label--Fill)"\n};\n/* harmony default export */ const esm_chart_axis_tick_label_Fill = (chart_axis_tick_label_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bar_Width.js\nconst chart_bar_Width = {\n "name": "--pf-chart-bar--Width",\n "value": 10,\n "var": "var(--pf-chart-bar--Width)"\n};\n/* harmony default export */ const esm_chart_bar_Width = (chart_bar_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bar_data_stroke.js\nconst chart_bar_data_stroke = {\n "name": "--pf-chart-bar--data--stroke",\n "value": "none",\n "var": "var(--pf-chart-bar--data--stroke)"\n};\n/* harmony default export */ const esm_chart_bar_data_stroke = (chart_bar_data_stroke);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bar_data_Fill.js\nconst chart_bar_data_Fill = {\n "name": "--pf-chart-bar--data--Fill",\n "value": "#151515",\n "var": "var(--pf-chart-bar--data--Fill)"\n};\n/* harmony default export */ const esm_chart_bar_data_Fill = (chart_bar_data_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bar_data_Padding.js\nconst chart_bar_data_Padding = {\n "name": "--pf-chart-bar--data--Padding",\n "value": 8,\n "var": "var(--pf-chart-bar--data--Padding)"\n};\n/* harmony default export */ const esm_chart_bar_data_Padding = (chart_bar_data_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bar_data_stroke_Width.js\nconst chart_bar_data_stroke_Width = {\n "name": "--pf-chart-bar--data-stroke--Width",\n "value": 0,\n "var": "var(--pf-chart-bar--data-stroke--Width)"\n};\n/* harmony default export */ const esm_chart_bar_data_stroke_Width = (chart_bar_data_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_boxplot_max_Padding.js\nconst chart_boxplot_max_Padding = {\n "name": "--pf-chart-boxplot--max--Padding",\n "value": 8,\n "var": "var(--pf-chart-boxplot--max--Padding)"\n};\n/* harmony default export */ const esm_chart_boxplot_max_Padding = (chart_boxplot_max_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_boxplot_max_stroke_Color.js\nconst chart_boxplot_max_stroke_Color = {\n "name": "--pf-chart-boxplot--max--stroke--Color",\n "value": "#151515",\n "var": "var(--pf-chart-boxplot--max--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_boxplot_max_stroke_Color = (chart_boxplot_max_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_boxplot_max_stroke_Width.js\nconst chart_boxplot_max_stroke_Width = {\n "name": "--pf-chart-boxplot--max--stroke--Width",\n "value": 1,\n "var": "var(--pf-chart-boxplot--max--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_boxplot_max_stroke_Width = (chart_boxplot_max_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_boxplot_median_Padding.js\nconst chart_boxplot_median_Padding = {\n "name": "--pf-chart-boxplot--median--Padding",\n "value": 8,\n "var": "var(--pf-chart-boxplot--median--Padding)"\n};\n/* harmony default export */ const esm_chart_boxplot_median_Padding = (chart_boxplot_median_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_boxplot_median_stroke_Color.js\nconst chart_boxplot_median_stroke_Color = {\n "name": "--pf-chart-boxplot--median--stroke--Color",\n "value": "#151515",\n "var": "var(--pf-chart-boxplot--median--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_boxplot_median_stroke_Color = (chart_boxplot_median_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_boxplot_median_stroke_Width.js\nconst chart_boxplot_median_stroke_Width = {\n "name": "--pf-chart-boxplot--median--stroke--Width",\n "value": 1,\n "var": "var(--pf-chart-boxplot--median--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_boxplot_median_stroke_Width = (chart_boxplot_median_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_boxplot_min_Padding.js\nconst chart_boxplot_min_Padding = {\n "name": "--pf-chart-boxplot--min--Padding",\n "value": 8,\n "var": "var(--pf-chart-boxplot--min--Padding)"\n};\n/* harmony default export */ const esm_chart_boxplot_min_Padding = (chart_boxplot_min_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_boxplot_min_stroke_Width.js\nconst chart_boxplot_min_stroke_Width = {\n "name": "--pf-chart-boxplot--min--stroke--Width",\n "value": 1,\n "var": "var(--pf-chart-boxplot--min--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_boxplot_min_stroke_Width = (chart_boxplot_min_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_boxplot_min_stroke_Color.js\nconst chart_boxplot_min_stroke_Color = {\n "name": "--pf-chart-boxplot--min--stroke--Color",\n "value": "#151515",\n "var": "var(--pf-chart-boxplot--min--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_boxplot_min_stroke_Color = (chart_boxplot_min_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_boxplot_lower_quartile_Padding.js\nconst chart_boxplot_lower_quartile_Padding = {\n "name": "--pf-chart-boxplot--lower-quartile--Padding",\n "value": 8,\n "var": "var(--pf-chart-boxplot--lower-quartile--Padding)"\n};\n/* harmony default export */ const esm_chart_boxplot_lower_quartile_Padding = (chart_boxplot_lower_quartile_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_boxplot_lower_quartile_Fill.js\nconst chart_boxplot_lower_quartile_Fill = {\n "name": "--pf-chart-boxplot--lower-quartile--Fill",\n "value": "#8a8d90",\n "var": "var(--pf-chart-boxplot--lower-quartile--Fill)"\n};\n/* harmony default export */ const esm_chart_boxplot_lower_quartile_Fill = (chart_boxplot_lower_quartile_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_boxplot_upper_quartile_Padding.js\nconst chart_boxplot_upper_quartile_Padding = {\n "name": "--pf-chart-boxplot--upper-quartile--Padding",\n "value": 8,\n "var": "var(--pf-chart-boxplot--upper-quartile--Padding)"\n};\n/* harmony default export */ const esm_chart_boxplot_upper_quartile_Padding = (chart_boxplot_upper_quartile_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_boxplot_upper_quartile_Fill.js\nconst chart_boxplot_upper_quartile_Fill = {\n "name": "--pf-chart-boxplot--upper-quartile--Fill",\n "value": "#8a8d90",\n "var": "var(--pf-chart-boxplot--upper-quartile--Fill)"\n};\n/* harmony default export */ const esm_chart_boxplot_upper_quartile_Fill = (chart_boxplot_upper_quartile_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_boxplot_box_Width.js\nconst chart_boxplot_box_Width = {\n "name": "--pf-chart-boxplot--box--Width",\n "value": 20,\n "var": "var(--pf-chart-boxplot--box--Width)"\n};\n/* harmony default export */ const esm_chart_boxplot_box_Width = (chart_boxplot_box_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_candelstick_data_stroke_Width.js\nconst chart_candelstick_data_stroke_Width = {\n "name": "--pf-chart-candelstick--data--stroke--Width",\n "value": 1,\n "var": "var(--pf-chart-candelstick--data--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_candelstick_data_stroke_Width = (chart_candelstick_data_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_candelstick_data_stroke_Color.js\nconst chart_candelstick_data_stroke_Color = {\n "name": "--pf-chart-candelstick--data--stroke--Color",\n "value": "#151515",\n "var": "var(--pf-chart-candelstick--data--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_candelstick_data_stroke_Color = (chart_candelstick_data_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_candelstick_candle_positive_Color.js\nconst chart_candelstick_candle_positive_Color = {\n "name": "--pf-chart-candelstick--candle--positive--Color",\n "value": "#fff",\n "var": "var(--pf-chart-candelstick--candle--positive--Color)"\n};\n/* harmony default export */ const esm_chart_candelstick_candle_positive_Color = (chart_candelstick_candle_positive_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_candelstick_candle_negative_Color.js\nconst chart_candelstick_candle_negative_Color = {\n "name": "--pf-chart-candelstick--candle--negative--Color",\n "value": "#151515",\n "var": "var(--pf-chart-candelstick--candle--negative--Color)"\n};\n/* harmony default export */ const esm_chart_candelstick_candle_negative_Color = (chart_candelstick_candle_negative_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_errorbar_BorderWidth.js\nconst chart_errorbar_BorderWidth = {\n "name": "--pf-chart-errorbar--BorderWidth",\n "value": 8,\n "var": "var(--pf-chart-errorbar--BorderWidth)"\n};\n/* harmony default export */ const esm_chart_errorbar_BorderWidth = (chart_errorbar_BorderWidth);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_errorbar_data_Fill.js\nconst chart_errorbar_data_Fill = {\n "name": "--pf-chart-errorbar--data--Fill",\n "value": "transparent",\n "var": "var(--pf-chart-errorbar--data--Fill)"\n};\n/* harmony default export */ const esm_chart_errorbar_data_Fill = (chart_errorbar_data_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_errorbar_data_Opacity.js\nconst chart_errorbar_data_Opacity = {\n "name": "--pf-chart-errorbar--data--Opacity",\n "value": 1,\n "var": "var(--pf-chart-errorbar--data--Opacity)"\n};\n/* harmony default export */ const esm_chart_errorbar_data_Opacity = (chart_errorbar_data_Opacity);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_errorbar_data_stroke_Width.js\nconst chart_errorbar_data_stroke_Width = {\n "name": "--pf-chart-errorbar--data-stroke--Width",\n "value": 2,\n "var": "var(--pf-chart-errorbar--data-stroke--Width)"\n};\n/* harmony default export */ const esm_chart_errorbar_data_stroke_Width = (chart_errorbar_data_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_errorbar_data_stroke_Color.js\nconst chart_errorbar_data_stroke_Color = {\n "name": "--pf-chart-errorbar--data-stroke--Color",\n "value": "#151515",\n "var": "var(--pf-chart-errorbar--data-stroke--Color)"\n};\n/* harmony default export */ const esm_chart_errorbar_data_stroke_Color = (chart_errorbar_data_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_legend_gutter_Width.js\nconst chart_legend_gutter_Width = {\n "name": "--pf-chart-legend--gutter--Width",\n "value": 20,\n "var": "var(--pf-chart-legend--gutter--Width)"\n};\n/* harmony default export */ const esm_chart_legend_gutter_Width = (chart_legend_gutter_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_legend_orientation.js\nconst chart_legend_orientation = {\n "name": "--pf-chart-legend--orientation",\n "value": "horizontal",\n "var": "var(--pf-chart-legend--orientation)"\n};\n/* harmony default export */ const esm_chart_legend_orientation = (chart_legend_orientation);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_legend_title_orientation.js\nconst chart_legend_title_orientation = {\n "name": "--pf-chart-legend--title--orientation",\n "value": "top",\n "var": "var(--pf-chart-legend--title--orientation)"\n};\n/* harmony default export */ const esm_chart_legend_title_orientation = (chart_legend_title_orientation);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_legend_data_type.js\nconst chart_legend_data_type = {\n "name": "--pf-chart-legend--data--type",\n "value": "square",\n "var": "var(--pf-chart-legend--data--type)"\n};\n/* harmony default export */ const esm_chart_legend_data_type = (chart_legend_data_type);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_legend_title_Padding.js\nconst chart_legend_title_Padding = {\n "name": "--pf-chart-legend--title--Padding",\n "value": 2,\n "var": "var(--pf-chart-legend--title--Padding)"\n};\n/* harmony default export */ const esm_chart_legend_title_Padding = (chart_legend_title_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_line_data_Fill.js\nconst chart_line_data_Fill = {\n "name": "--pf-chart-line--data--Fill",\n "value": "transparent",\n "var": "var(--pf-chart-line--data--Fill)"\n};\n/* harmony default export */ const esm_chart_line_data_Fill = (chart_line_data_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_line_data_Opacity.js\nconst chart_line_data_Opacity = {\n "name": "--pf-chart-line--data--Opacity",\n "value": 1,\n "var": "var(--pf-chart-line--data--Opacity)"\n};\n/* harmony default export */ const esm_chart_line_data_Opacity = (chart_line_data_Opacity);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_line_data_stroke_Width.js\nconst chart_line_data_stroke_Width = {\n "name": "--pf-chart-line--data--stroke--Width",\n "value": 2,\n "var": "var(--pf-chart-line--data--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_line_data_stroke_Width = (chart_line_data_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_line_data_stroke_Color.js\nconst chart_line_data_stroke_Color = {\n "name": "--pf-chart-line--data--stroke--Color",\n "value": "#151515",\n "var": "var(--pf-chart-line--data--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_line_data_stroke_Color = (chart_line_data_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_pie_Padding.js\nconst chart_pie_Padding = {\n "name": "--pf-chart-pie--Padding",\n "value": 20,\n "var": "var(--pf-chart-pie--Padding)"\n};\n/* harmony default export */ const esm_chart_pie_Padding = (chart_pie_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_pie_data_Padding.js\nconst chart_pie_data_Padding = {\n "name": "--pf-chart-pie--data--Padding",\n "value": 8,\n "var": "var(--pf-chart-pie--data--Padding)"\n};\n/* harmony default export */ const esm_chart_pie_data_Padding = (chart_pie_data_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_pie_data_stroke_Width.js\nconst chart_pie_data_stroke_Width = {\n "name": "--pf-chart-pie--data--stroke--Width",\n "value": 1,\n "var": "var(--pf-chart-pie--data--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_pie_data_stroke_Width = (chart_pie_data_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_pie_data_stroke_Color.js\nconst chart_pie_data_stroke_Color = {\n "name": "--pf-chart-pie--data--stroke--Color",\n "value": "transparent",\n "var": "var(--pf-chart-pie--data--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_pie_data_stroke_Color = (chart_pie_data_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_pie_labels_Padding.js\nconst chart_pie_labels_Padding = {\n "name": "--pf-chart-pie--labels--Padding",\n "value": 8,\n "var": "var(--pf-chart-pie--labels--Padding)"\n};\n/* harmony default export */ const esm_chart_pie_labels_Padding = (chart_pie_labels_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_pie_Height.js\nconst chart_pie_Height = {\n "name": "--pf-chart-pie--Height",\n "value": 230,\n "var": "var(--pf-chart-pie--Height)"\n};\n/* harmony default export */ const esm_chart_pie_Height = (chart_pie_Height);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_pie_Width.js\nconst chart_pie_Width = {\n "name": "--pf-chart-pie--Width",\n "value": 230,\n "var": "var(--pf-chart-pie--Width)"\n};\n/* harmony default export */ const esm_chart_pie_Width = (chart_pie_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_scatter_data_stroke_Color.js\nconst chart_scatter_data_stroke_Color = {\n "name": "--pf-chart-scatter--data--stroke--Color",\n "value": "transparent",\n "var": "var(--pf-chart-scatter--data--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_scatter_data_stroke_Color = (chart_scatter_data_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_scatter_data_stroke_Width.js\nconst chart_scatter_data_stroke_Width = {\n "name": "--pf-chart-scatter--data--stroke--Width",\n "value": 0,\n "var": "var(--pf-chart-scatter--data--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_scatter_data_stroke_Width = (chart_scatter_data_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_scatter_data_Opacity.js\nconst chart_scatter_data_Opacity = {\n "name": "--pf-chart-scatter--data--Opacity",\n "value": 1,\n "var": "var(--pf-chart-scatter--data--Opacity)"\n};\n/* harmony default export */ const esm_chart_scatter_data_Opacity = (chart_scatter_data_Opacity);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_scatter_data_Fill.js\nconst chart_scatter_data_Fill = {\n "name": "--pf-chart-scatter--data--Fill",\n "value": "#151515",\n "var": "var(--pf-chart-scatter--data--Fill)"\n};\n/* harmony default export */ const esm_chart_scatter_data_Fill = (chart_scatter_data_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_stack_data_stroke_Width.js\nconst chart_stack_data_stroke_Width = {\n "name": "--pf-chart-stack--data--stroke--Width",\n "value": 1,\n "var": "var(--pf-chart-stack--data--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_stack_data_stroke_Width = (chart_stack_data_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_tooltip_corner_radius.js\nconst chart_tooltip_corner_radius = {\n "name": "--pf-chart-tooltip--corner-radius",\n "value": 0,\n "var": "var(--pf-chart-tooltip--corner-radius)"\n};\n/* harmony default export */ const esm_chart_tooltip_corner_radius = (chart_tooltip_corner_radius);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_tooltip_pointer_length.js\nconst chart_tooltip_pointer_length = {\n "name": "--pf-chart-tooltip--pointer-length",\n "value": 10,\n "var": "var(--pf-chart-tooltip--pointer-length)"\n};\n/* harmony default export */ const esm_chart_tooltip_pointer_length = (chart_tooltip_pointer_length);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_tooltip_Fill.js\nconst chart_tooltip_Fill = {\n "name": "--pf-chart-tooltip--Fill",\n "value": "#f0f0f0",\n "var": "var(--pf-chart-tooltip--Fill)"\n};\n/* harmony default export */ const esm_chart_tooltip_Fill = (chart_tooltip_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_tooltip_flyoutStyle_corner_radius.js\nconst chart_tooltip_flyoutStyle_corner_radius = {\n "name": "--pf-chart-tooltip--flyoutStyle--corner-radius",\n "value": 0,\n "var": "var(--pf-chart-tooltip--flyoutStyle--corner-radius)"\n};\n/* harmony default export */ const esm_chart_tooltip_flyoutStyle_corner_radius = (chart_tooltip_flyoutStyle_corner_radius);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_tooltip_flyoutStyle_stroke_Width.js\nconst chart_tooltip_flyoutStyle_stroke_Width = {\n "name": "--pf-chart-tooltip--flyoutStyle--stroke--Width",\n "value": 0,\n "var": "var(--pf-chart-tooltip--flyoutStyle--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_tooltip_flyoutStyle_stroke_Width = (chart_tooltip_flyoutStyle_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_tooltip_flyoutStyle_PointerEvents.js\nconst chart_tooltip_flyoutStyle_PointerEvents = {\n "name": "--pf-chart-tooltip--flyoutStyle--PointerEvents",\n "value": "none",\n "var": "var(--pf-chart-tooltip--flyoutStyle--PointerEvents)"\n};\n/* harmony default export */ const esm_chart_tooltip_flyoutStyle_PointerEvents = (chart_tooltip_flyoutStyle_PointerEvents);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_tooltip_flyoutStyle_stroke_Color.js\nconst chart_tooltip_flyoutStyle_stroke_Color = {\n "name": "--pf-chart-tooltip--flyoutStyle--stroke--Color",\n "value": "#151515",\n "var": "var(--pf-chart-tooltip--flyoutStyle--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_tooltip_flyoutStyle_stroke_Color = (chart_tooltip_flyoutStyle_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_tooltip_flyoutStyle_Fill.js\nconst chart_tooltip_flyoutStyle_Fill = {\n "name": "--pf-chart-tooltip--flyoutStyle--Fill",\n "value": "#151515",\n "var": "var(--pf-chart-tooltip--flyoutStyle--Fill)"\n};\n/* harmony default export */ const esm_chart_tooltip_flyoutStyle_Fill = (chart_tooltip_flyoutStyle_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_tooltip_pointer_Width.js\nconst chart_tooltip_pointer_Width = {\n "name": "--pf-chart-tooltip--pointer--Width",\n "value": 20,\n "var": "var(--pf-chart-tooltip--pointer--Width)"\n};\n/* harmony default export */ const esm_chart_tooltip_pointer_Width = (chart_tooltip_pointer_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_tooltip_Padding.js\nconst chart_tooltip_Padding = {\n "name": "--pf-chart-tooltip--Padding",\n "value": 8,\n "var": "var(--pf-chart-tooltip--Padding)"\n};\n/* harmony default export */ const esm_chart_tooltip_Padding = (chart_tooltip_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_tooltip_PointerEvents.js\nconst chart_tooltip_PointerEvents = {\n "name": "--pf-chart-tooltip--PointerEvents",\n "value": "none",\n "var": "var(--pf-chart-tooltip--PointerEvents)"\n};\n/* harmony default export */ const esm_chart_tooltip_PointerEvents = (chart_tooltip_PointerEvents);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_voronoi_data_Fill.js\nconst chart_voronoi_data_Fill = {\n "name": "--pf-chart-voronoi--data--Fill",\n "value": "transparent",\n "var": "var(--pf-chart-voronoi--data--Fill)"\n};\n/* harmony default export */ const esm_chart_voronoi_data_Fill = (chart_voronoi_data_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_voronoi_data_stroke_Color.js\nconst chart_voronoi_data_stroke_Color = {\n "name": "--pf-chart-voronoi--data--stroke--Color",\n "value": "transparent",\n "var": "var(--pf-chart-voronoi--data--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_voronoi_data_stroke_Color = (chart_voronoi_data_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_voronoi_data_stroke_Width.js\nconst chart_voronoi_data_stroke_Width = {\n "name": "--pf-chart-voronoi--data--stroke--Width",\n "value": 0,\n "var": "var(--pf-chart-voronoi--data--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_voronoi_data_stroke_Width = (chart_voronoi_data_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_voronoi_labels_Fill.js\nconst chart_voronoi_labels_Fill = {\n "name": "--pf-chart-voronoi--labels--Fill",\n "value": "#f0f0f0",\n "var": "var(--pf-chart-voronoi--labels--Fill)"\n};\n/* harmony default export */ const esm_chart_voronoi_labels_Fill = (chart_voronoi_labels_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_voronoi_labels_Padding.js\nconst chart_voronoi_labels_Padding = {\n "name": "--pf-chart-voronoi--labels--Padding",\n "value": 8,\n "var": "var(--pf-chart-voronoi--labels--Padding)"\n};\n/* harmony default export */ const esm_chart_voronoi_labels_Padding = (chart_voronoi_labels_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_voronoi_labels_PointerEvents.js\nconst chart_voronoi_labels_PointerEvents = {\n "name": "--pf-chart-voronoi--labels--PointerEvents",\n "value": "none",\n "var": "var(--pf-chart-voronoi--labels--PointerEvents)"\n};\n/* harmony default export */ const esm_chart_voronoi_labels_PointerEvents = (chart_voronoi_labels_PointerEvents);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_voronoi_flyout_stroke_Width.js\nconst chart_voronoi_flyout_stroke_Width = {\n "name": "--pf-chart-voronoi--flyout--stroke--Width",\n "value": 1,\n "var": "var(--pf-chart-voronoi--flyout--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_voronoi_flyout_stroke_Width = (chart_voronoi_flyout_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_voronoi_flyout_PointerEvents.js\nconst chart_voronoi_flyout_PointerEvents = {\n "name": "--pf-chart-voronoi--flyout--PointerEvents",\n "value": "none",\n "var": "var(--pf-chart-voronoi--flyout--PointerEvents)"\n};\n/* harmony default export */ const esm_chart_voronoi_flyout_PointerEvents = (chart_voronoi_flyout_PointerEvents);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_voronoi_flyout_stroke_Color.js\nconst chart_voronoi_flyout_stroke_Color = {\n "name": "--pf-chart-voronoi--flyout--stroke--Color",\n "value": "#151515",\n "var": "var(--pf-chart-voronoi--flyout--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_voronoi_flyout_stroke_Color = (chart_voronoi_flyout_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_voronoi_flyout_stroke_Fill.js\nconst chart_voronoi_flyout_stroke_Fill = {\n "name": "--pf-chart-voronoi--flyout--stroke--Fill",\n "value": "#151515",\n "var": "var(--pf-chart-voronoi--flyout--stroke--Fill)"\n};\n/* harmony default export */ const esm_chart_voronoi_flyout_stroke_Fill = (chart_voronoi_flyout_stroke_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/base-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Note: Values must be in pixles\n// Typography\n//\n// Note: Victory\'s approximateTextSize function uses specific character widths and does not work with font variables\n// See https://github.com/patternfly/patternfly-react/issues/5300\nconst TYPOGRAPHY_FONT_FAMILY = esm_chart_global_FontFamily.value.replace(/ /g, \'\');\nconst TYPOGRAPHY_LETTER_SPACING = esm_chart_global_letter_spacing.value;\nconst TYPOGRAPHY_FONT_SIZE = esm_chart_global_FontSize_sm.value;\n// Labels\nconst LABEL_PROPS = {\n fontFamily: TYPOGRAPHY_FONT_FAMILY,\n fontSize: TYPOGRAPHY_FONT_SIZE,\n letterSpacing: TYPOGRAPHY_LETTER_SPACING,\n padding: esm_chart_global_label_Padding.value,\n stroke: esm_chart_global_label_stroke.value\n};\nconst LABEL_CENTERED_PROPS = Object.assign(Object.assign({}, LABEL_PROPS), { textAnchor: esm_chart_global_label_text_anchor.value });\n// Layout\nconst LAYOUT_PROPS = {\n padding: esm_chart_global_layout_Padding.value,\n height: esm_chart_global_layout_Height.value,\n width: esm_chart_global_layout_Width.value\n};\n// Strokes\nconst STROKE_LINE_CAP = esm_chart_global_stroke_line_cap.value;\nconst STROKE_LINE_JOIN = esm_chart_global_stroke_line_join.value;\n// Victory theme properties only\nconst BaseTheme = {\n area: Object.assign(Object.assign({}, LAYOUT_PROPS), { style: {\n data: {\n fill: esm_chart_area_data_Fill.value,\n fillOpacity: esm_chart_area_Opacity.value,\n // Omit stroke to add a line border from color scale\n // stroke: chart_global_label_stroke.value,\n strokeWidth: esm_chart_area_stroke_Width.value\n },\n labels: LABEL_CENTERED_PROPS\n } }),\n axis: Object.assign(Object.assign({}, LAYOUT_PROPS), { style: {\n axis: {\n fill: esm_chart_axis_axis_Fill.value,\n strokeWidth: esm_chart_axis_axis_stroke_Width.value,\n stroke: esm_chart_axis_axis_stroke_Color.value,\n strokeLinecap: STROKE_LINE_CAP,\n strokeLinejoin: STROKE_LINE_JOIN\n },\n axisLabel: Object.assign(Object.assign({}, LABEL_CENTERED_PROPS), { padding: esm_chart_axis_axis_label_Padding.value, stroke: esm_chart_axis_axis_label_stroke_Color.value }),\n grid: {\n fill: esm_chart_axis_grid_Fill.value,\n stroke: \'none\',\n pointerEvents: esm_chart_axis_grid_PointerEvents.value,\n strokeLinecap: STROKE_LINE_CAP,\n strokeLinejoin: STROKE_LINE_JOIN\n },\n ticks: {\n fill: esm_chart_axis_tick_Fill.value,\n size: esm_chart_axis_tick_Size.value,\n stroke: esm_chart_axis_tick_stroke_Color.value,\n strokeLinecap: STROKE_LINE_CAP,\n strokeLinejoin: STROKE_LINE_JOIN,\n strokeWidth: esm_chart_axis_tick_Width.value\n },\n tickLabels: Object.assign(Object.assign({}, LABEL_PROPS), { fill: esm_chart_axis_tick_label_Fill.value })\n } }),\n bar: Object.assign(Object.assign({}, LAYOUT_PROPS), { barWidth: esm_chart_bar_Width.value, style: {\n data: {\n fill: esm_chart_bar_data_Fill.value,\n padding: esm_chart_bar_data_Padding.value,\n stroke: esm_chart_bar_data_stroke.value,\n strokeWidth: esm_chart_bar_data_stroke_Width.value\n },\n labels: LABEL_PROPS\n } }),\n boxplot: Object.assign(Object.assign({}, LAYOUT_PROPS), { style: {\n max: {\n padding: esm_chart_boxplot_max_Padding.value,\n stroke: esm_chart_boxplot_max_stroke_Color.value,\n strokeWidth: esm_chart_boxplot_max_stroke_Width.value\n },\n maxLabels: LABEL_PROPS,\n median: {\n padding: esm_chart_boxplot_median_Padding.value,\n stroke: esm_chart_boxplot_median_stroke_Color.value,\n strokeWidth: esm_chart_boxplot_median_stroke_Width.value\n },\n medianLabels: LABEL_PROPS,\n min: {\n padding: esm_chart_boxplot_min_Padding.value,\n stroke: esm_chart_boxplot_min_stroke_Color.value,\n strokeWidth: esm_chart_boxplot_min_stroke_Width.value\n },\n minLabels: LABEL_PROPS,\n q1: {\n fill: esm_chart_boxplot_lower_quartile_Fill.value,\n padding: esm_chart_boxplot_lower_quartile_Padding.value\n },\n q1Labels: LABEL_PROPS,\n q3: {\n fill: esm_chart_boxplot_upper_quartile_Fill.value,\n padding: esm_chart_boxplot_upper_quartile_Padding.value\n },\n q3Labels: LABEL_PROPS\n }, boxWidth: esm_chart_boxplot_box_Width.value }),\n candlestick: Object.assign(Object.assign({}, LAYOUT_PROPS), { candleColors: {\n positive: esm_chart_candelstick_candle_positive_Color.value,\n negative: esm_chart_candelstick_candle_negative_Color.value\n }, style: {\n data: {\n stroke: esm_chart_candelstick_data_stroke_Color.value,\n strokeWidth: esm_chart_candelstick_data_stroke_Width.value\n },\n labels: LABEL_CENTERED_PROPS\n } }),\n chart: Object.assign({}, LAYOUT_PROPS),\n errorbar: Object.assign(Object.assign({}, LAYOUT_PROPS), { borderWidth: esm_chart_errorbar_BorderWidth.value, style: {\n data: {\n fill: esm_chart_errorbar_data_Fill.value,\n opacity: esm_chart_errorbar_data_Opacity.value,\n stroke: esm_chart_errorbar_data_stroke_Color.value,\n strokeWidth: esm_chart_errorbar_data_stroke_Width.value\n },\n labels: LABEL_CENTERED_PROPS\n } }),\n group: Object.assign({}, LAYOUT_PROPS),\n legend: {\n gutter: esm_chart_legend_gutter_Width.value,\n orientation: esm_chart_legend_orientation.value,\n titleOrientation: esm_chart_legend_title_orientation.value,\n style: {\n data: {\n type: esm_chart_legend_data_type.value\n },\n labels: LABEL_PROPS,\n title: Object.assign(Object.assign({}, LABEL_PROPS), { fontSize: TYPOGRAPHY_FONT_SIZE, padding: esm_chart_legend_title_Padding.value })\n }\n },\n line: Object.assign(Object.assign({}, LAYOUT_PROPS), { style: {\n data: {\n fill: esm_chart_line_data_Fill.value,\n opacity: esm_chart_line_data_Opacity.value,\n stroke: esm_chart_line_data_stroke_Color.value,\n strokeWidth: esm_chart_line_data_stroke_Width.value\n },\n labels: LABEL_CENTERED_PROPS\n } }),\n pie: {\n padding: esm_chart_pie_Padding.value,\n style: {\n data: {\n padding: esm_chart_pie_data_Padding.value,\n stroke: esm_chart_pie_data_stroke_Color.value,\n strokeWidth: esm_chart_pie_data_stroke_Width.value\n },\n labels: Object.assign(Object.assign({}, LABEL_PROPS), { padding: esm_chart_pie_labels_Padding.value })\n },\n height: esm_chart_pie_Height.value,\n width: esm_chart_pie_Width.value\n },\n scatter: Object.assign(Object.assign({}, LAYOUT_PROPS), { style: {\n data: {\n fill: esm_chart_scatter_data_Fill.value,\n opacity: esm_chart_scatter_data_Opacity.value,\n stroke: esm_chart_scatter_data_stroke_Color.value,\n strokeWidth: esm_chart_scatter_data_stroke_Width.value\n },\n labels: LABEL_CENTERED_PROPS\n } }),\n stack: Object.assign(Object.assign({}, LAYOUT_PROPS), { style: {\n data: {\n strokeWidth: esm_chart_stack_data_stroke_Width.value\n }\n } }),\n tooltip: {\n cornerRadius: esm_chart_tooltip_corner_radius.value,\n flyoutPadding: esm_chart_tooltip_Padding.value,\n flyoutStyle: {\n cornerRadius: esm_chart_tooltip_flyoutStyle_corner_radius.value,\n fill: esm_chart_tooltip_flyoutStyle_Fill.value,\n pointerEvents: esm_chart_tooltip_flyoutStyle_PointerEvents.value,\n stroke: esm_chart_tooltip_flyoutStyle_stroke_Color.value,\n strokeWidth: esm_chart_tooltip_flyoutStyle_stroke_Width.value\n },\n pointerLength: esm_chart_tooltip_pointer_length.value,\n pointerWidth: esm_chart_tooltip_pointer_Width.value,\n style: {\n fill: esm_chart_tooltip_Fill.value,\n pointerEvents: esm_chart_tooltip_PointerEvents.value\n }\n },\n voronoi: Object.assign(Object.assign({}, LAYOUT_PROPS), { style: {\n data: {\n fill: esm_chart_voronoi_data_Fill.value,\n stroke: esm_chart_voronoi_data_stroke_Color.value,\n strokeWidth: esm_chart_voronoi_data_stroke_Width.value\n },\n labels: Object.assign(Object.assign({}, LABEL_CENTERED_PROPS), { fill: esm_chart_voronoi_labels_Fill.value, padding: esm_chart_voronoi_labels_Padding.value, pointerEvents: esm_chart_voronoi_labels_PointerEvents.value }),\n // Note: These properties override tooltip\n flyout: {\n fill: esm_chart_voronoi_flyout_stroke_Fill.value,\n pointerEvents: esm_chart_voronoi_flyout_PointerEvents.value,\n stroke: esm_chart_voronoi_flyout_stroke_Color.value,\n strokeWidth: esm_chart_voronoi_flyout_stroke_Width.value\n }\n } })\n};\n//# sourceMappingURL=base-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_Height.js\nconst chart_bullet_Height = {\n "name": "--pf-chart-bullet--Height",\n "value": 140,\n "var": "var(--pf-chart-bullet--Height)"\n};\n/* harmony default export */ const esm_chart_bullet_Height = (chart_bullet_Height);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_comparative_measure_Fill_Color.js\nconst chart_bullet_comparative_measure_Fill_Color = {\n "name": "--pf-chart-bullet--comparative-measure--Fill--Color",\n "value": "#4f5255",\n "var": "var(--pf-chart-bullet--comparative-measure--Fill--Color)"\n};\n/* harmony default export */ const esm_chart_bullet_comparative_measure_Fill_Color = (chart_bullet_comparative_measure_Fill_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_comparative_measure_stroke_Color.js\nconst chart_bullet_comparative_measure_stroke_Color = {\n "name": "--pf-chart-bullet--comparative-measure--stroke--Color",\n "value": "#4f5255",\n "var": "var(--pf-chart-bullet--comparative-measure--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_bullet_comparative_measure_stroke_Color = (chart_bullet_comparative_measure_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_comparative_measure_stroke_Width.js\nconst chart_bullet_comparative_measure_stroke_Width = {\n "name": "--pf-chart-bullet--comparative-measure--stroke--Width",\n "value": 1,\n "var": "var(--pf-chart-bullet--comparative-measure--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_bullet_comparative_measure_stroke_Width = (chart_bullet_comparative_measure_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_comparative_measure_error_Fill_Color.js\nconst chart_bullet_comparative_measure_error_Fill_Color = {\n "name": "--pf-chart-bullet--comparative-measure--error--Fill--Color",\n "value": "#c9190b",\n "var": "var(--pf-chart-bullet--comparative-measure--error--Fill--Color)"\n};\n/* harmony default export */ const esm_chart_bullet_comparative_measure_error_Fill_Color = (chart_bullet_comparative_measure_error_Fill_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_comparative_measure_error_stroke_Color.js\nconst chart_bullet_comparative_measure_error_stroke_Color = {\n "name": "--pf-chart-bullet--comparative-measure--error--stroke--Color",\n "value": "#c9190b",\n "var": "var(--pf-chart-bullet--comparative-measure--error--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_bullet_comparative_measure_error_stroke_Color = (chart_bullet_comparative_measure_error_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_comparative_measure_error_stroke_Width.js\nconst chart_bullet_comparative_measure_error_stroke_Width = {\n "name": "--pf-chart-bullet--comparative-measure--error--stroke--Width",\n "value": 2,\n "var": "var(--pf-chart-bullet--comparative-measure--error--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_bullet_comparative_measure_error_stroke_Width = (chart_bullet_comparative_measure_error_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_comparative_measure_warning_Fill_Color.js\nconst chart_bullet_comparative_measure_warning_Fill_Color = {\n "name": "--pf-chart-bullet--comparative-measure--warning--Fill--Color",\n "value": "#ec7a08",\n "var": "var(--pf-chart-bullet--comparative-measure--warning--Fill--Color)"\n};\n/* harmony default export */ const esm_chart_bullet_comparative_measure_warning_Fill_Color = (chart_bullet_comparative_measure_warning_Fill_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_comparative_measure_warning_stroke_Color.js\nconst chart_bullet_comparative_measure_warning_stroke_Color = {\n "name": "--pf-chart-bullet--comparative-measure--warning--stroke--Color",\n "value": "#ec7a08",\n "var": "var(--pf-chart-bullet--comparative-measure--warning--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_bullet_comparative_measure_warning_stroke_Color = (chart_bullet_comparative_measure_warning_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_comparative_measure_warning_stroke_Width.js\nconst chart_bullet_comparative_measure_warning_stroke_Width = {\n "name": "--pf-chart-bullet--comparative-measure--warning--stroke--Width",\n "value": 2,\n "var": "var(--pf-chart-bullet--comparative-measure--warning--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_bullet_comparative_measure_warning_stroke_Width = (chart_bullet_comparative_measure_warning_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_group_title_divider_Fill_Color.js\nconst chart_bullet_group_title_divider_Fill_Color = {\n "name": "--pf-chart-bullet--group-title--divider--Fill--Color",\n "value": "#f0f0f0",\n "var": "var(--pf-chart-bullet--group-title--divider--Fill--Color)"\n};\n/* harmony default export */ const esm_chart_bullet_group_title_divider_Fill_Color = (chart_bullet_group_title_divider_Fill_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_group_title_divider_stroke_Color.js\nconst chart_bullet_group_title_divider_stroke_Color = {\n "name": "--pf-chart-bullet--group-title--divider--stroke--Color",\n "value": "#f0f0f0",\n "var": "var(--pf-chart-bullet--group-title--divider--stroke--Color)"\n};\n/* harmony default export */ const esm_chart_bullet_group_title_divider_stroke_Color = (chart_bullet_group_title_divider_stroke_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_group_title_divider_stroke_Width.js\nconst chart_bullet_group_title_divider_stroke_Width = {\n "name": "--pf-chart-bullet--group-title--divider--stroke--Width",\n "value": 2,\n "var": "var(--pf-chart-bullet--group-title--divider--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_bullet_group_title_divider_stroke_Width = (chart_bullet_group_title_divider_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_red_100.js\nconst chart_color_red_100 = {\n "name": "--pf-chart-color-red-100",\n "value": "#c9190b",\n "var": "var(--pf-chart-color-red-100)"\n};\n/* harmony default export */ const esm_chart_color_red_100 = (chart_color_red_100);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_red_200.js\nconst chart_color_red_200 = {\n "name": "--pf-chart-color-red-200",\n "value": "#a30000",\n "var": "var(--pf-chart-color-red-200)"\n};\n/* harmony default export */ const esm_chart_color_red_200 = (chart_color_red_200);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_red_300.js\nconst chart_color_red_300 = {\n "name": "--pf-chart-color-red-300",\n "value": "#7d1007",\n "var": "var(--pf-chart-color-red-300)"\n};\n/* harmony default export */ const esm_chart_color_red_300 = (chart_color_red_300);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_red_400.js\nconst chart_color_red_400 = {\n "name": "--pf-chart-color-red-400",\n "value": "#470000",\n "var": "var(--pf-chart-color-red-400)"\n};\n/* harmony default export */ const esm_chart_color_red_400 = (chart_color_red_400);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_color_red_500.js\nconst chart_color_red_500 = {\n "name": "--pf-chart-color-red-500",\n "value": "#2c0000",\n "var": "var(--pf-chart-color-red-500)"\n};\n/* harmony default export */ const esm_chart_color_red_500 = (chart_color_red_500);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/bullet-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// See https://docs.google.com/document/d/1cw10pJFXWruB1SA8TQwituxn5Ss6KpxYPCOYGrH8qAY/edit#\n// See https://www.patternfly.org/v3/pattern-library/data-visualization/bullet-chart/#design\n// Bullet theme\nconst BulletTheme = {\n chart: {\n height: esm_chart_bullet_Height.value\n }\n};\n// Bullet comparative measure error theme\nconst BulletComparativeErrorMeasureTheme = {\n bar: {\n height: esm_chart_bullet_Height.value,\n style: {\n data: {\n fill: esm_chart_bullet_comparative_measure_error_Fill_Color.value,\n stroke: esm_chart_bullet_comparative_measure_error_stroke_Color.value,\n strokeWidth: esm_chart_bullet_comparative_measure_error_stroke_Width.value\n }\n }\n }\n};\n// Bullet comparative measure theme\nconst BulletComparativeMeasureTheme = {\n bar: {\n height: esm_chart_bullet_Height.value,\n style: {\n data: {\n fill: esm_chart_bullet_comparative_measure_Fill_Color.value,\n stroke: esm_chart_bullet_comparative_measure_stroke_Color.value,\n strokeWidth: esm_chart_bullet_comparative_measure_stroke_Width.value\n }\n }\n }\n};\n// Bullet comparative measure warning theme\nconst BulletComparativeWarningMeasureTheme = {\n bar: {\n height: esm_chart_bullet_Height.value,\n style: {\n data: {\n fill: esm_chart_bullet_comparative_measure_warning_Fill_Color.value,\n stroke: esm_chart_bullet_comparative_measure_warning_stroke_Color.value,\n strokeWidth: esm_chart_bullet_comparative_measure_warning_stroke_Width.value\n }\n }\n }\n};\n// Bullet group title theme\nconst BulletGroupTitleTheme = {\n chart: {\n padding: {\n bottom: 0,\n left: 0,\n right: 0,\n top: esm_chart_global_layout_Padding.value\n } // Victory incorrectly typed ThemeBaseProps.padding as number instead of PaddingProps\n },\n line: {\n style: {\n data: {\n fill: esm_chart_bullet_group_title_divider_Fill_Color.value,\n stroke: esm_chart_bullet_group_title_divider_stroke_Color.value,\n strokeWidth: esm_chart_bullet_group_title_divider_stroke_Width.value\n }\n }\n }\n};\n// Bullet primary dot measure theme\nconst BulletPrimaryDotMeasureTheme = {\n group: {\n height: esm_chart_bullet_Height.value\n }\n};\n// Bullet primary negative measure theme\nconst BulletPrimaryNegativeMeasureTheme = {\n group: {\n colorScale: [\n esm_chart_color_red_100.value,\n esm_chart_color_red_200.value,\n esm_chart_color_red_300.value,\n esm_chart_color_red_400.value,\n esm_chart_color_red_500.value\n ],\n height: esm_chart_bullet_Height.value\n }\n};\n// Bullet primary segmented measure theme\nconst BulletPrimarySegmentedMeasureTheme = {\n group: {\n height: esm_chart_bullet_Height.value\n }\n};\n// Bullet qualitative range theme\nconst BulletQualitativeRangeTheme = {\n group: {\n colorScale: [\n esm_chart_color_black_100.value,\n esm_chart_color_black_200.value,\n esm_chart_color_black_300.value,\n esm_chart_color_black_400.value,\n esm_chart_color_black_500.value\n ],\n height: esm_chart_bullet_Height.value\n }\n};\n//# sourceMappingURL=bullet-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_pie_Height.js\nconst chart_donut_pie_Height = {\n "name": "--pf-chart-donut--pie--Height",\n "value": 230,\n "var": "var(--pf-chart-donut--pie--Height)"\n};\n/* harmony default export */ const esm_chart_donut_pie_Height = (chart_donut_pie_Height);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_pie_angle_Padding.js\nconst chart_donut_pie_angle_Padding = {\n "name": "--pf-chart-donut--pie--angle--Padding",\n "value": 1,\n "var": "var(--pf-chart-donut--pie--angle--Padding)"\n};\n/* harmony default export */ const esm_chart_donut_pie_angle_Padding = (chart_donut_pie_angle_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_pie_Padding.js\nconst chart_donut_pie_Padding = {\n "name": "--pf-chart-donut--pie--Padding",\n "value": 20,\n "var": "var(--pf-chart-donut--pie--Padding)"\n};\n/* harmony default export */ const esm_chart_donut_pie_Padding = (chart_donut_pie_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_pie_Width.js\nconst chart_donut_pie_Width = {\n "name": "--pf-chart-donut--pie--Width",\n "value": 230,\n "var": "var(--pf-chart-donut--pie--Width)"\n};\n/* harmony default export */ const esm_chart_donut_pie_Width = (chart_donut_pie_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/donut-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n// Donut theme\nconst DonutTheme = {\n pie: {\n height: esm_chart_donut_pie_Height.value,\n padding: esm_chart_donut_pie_Padding.value,\n padAngle: esm_chart_donut_pie_angle_Padding.value,\n width: esm_chart_donut_pie_Width.value\n }\n};\n//# sourceMappingURL=donut-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_threshold_stroke_dash_array.js\nconst chart_threshold_stroke_dash_array = {\n "name": "--pf-chart-threshold--stroke-dash-array",\n "value": "4,2",\n "var": "var(--pf-chart-threshold--stroke-dash-array)"\n};\n/* harmony default export */ const esm_chart_threshold_stroke_dash_array = (chart_threshold_stroke_dash_array);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_threshold_stroke_Width.js\nconst chart_threshold_stroke_Width = {\n "name": "--pf-chart-threshold--stroke--Width",\n "value": 1.5,\n "var": "var(--pf-chart-threshold--stroke--Width)"\n};\n/* harmony default export */ const esm_chart_threshold_stroke_Width = (chart_threshold_stroke_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/threshold-theme.js\n/* eslint-disable camelcase */\n\n\n// Threshold theme\nconst ThresholdTheme = {\n line: {\n style: {\n data: {\n strokeDasharray: esm_chart_threshold_stroke_dash_array.value,\n strokeWidth: esm_chart_threshold_stroke_Width.value\n }\n }\n }\n};\n//# sourceMappingURL=threshold-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_threshold_first_Color.js\nconst chart_donut_threshold_first_Color = {\n "name": "--pf-chart-donut--threshold--first--Color",\n "value": "#f0f0f0",\n "var": "var(--pf-chart-donut--threshold--first--Color)"\n};\n/* harmony default export */ const esm_chart_donut_threshold_first_Color = (chart_donut_threshold_first_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_threshold_second_Color.js\nconst chart_donut_threshold_second_Color = {\n "name": "--pf-chart-donut--threshold--second--Color",\n "value": "#d2d2d2",\n "var": "var(--pf-chart-donut--threshold--second--Color)"\n};\n/* harmony default export */ const esm_chart_donut_threshold_second_Color = (chart_donut_threshold_second_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_threshold_third_Color.js\nconst chart_donut_threshold_third_Color = {\n "name": "--pf-chart-donut--threshold--third--Color",\n "value": "#b8bbbe",\n "var": "var(--pf-chart-donut--threshold--third--Color)"\n};\n/* harmony default export */ const esm_chart_donut_threshold_third_Color = (chart_donut_threshold_third_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_threshold_dynamic_pie_Height.js\nconst chart_donut_threshold_dynamic_pie_Height = {\n "name": "--pf-chart-donut--threshold--dynamic--pie--Height",\n "value": 202,\n "var": "var(--pf-chart-donut--threshold--dynamic--pie--Height)"\n};\n/* harmony default export */ const esm_chart_donut_threshold_dynamic_pie_Height = (chart_donut_threshold_dynamic_pie_Height);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_threshold_dynamic_pie_Padding.js\nconst chart_donut_threshold_dynamic_pie_Padding = {\n "name": "--pf-chart-donut--threshold--dynamic--pie--Padding",\n "value": 20,\n "var": "var(--pf-chart-donut--threshold--dynamic--pie--Padding)"\n};\n/* harmony default export */ const esm_chart_donut_threshold_dynamic_pie_Padding = (chart_donut_threshold_dynamic_pie_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_threshold_dynamic_pie_Width.js\nconst chart_donut_threshold_dynamic_pie_Width = {\n "name": "--pf-chart-donut--threshold--dynamic--pie--Width",\n "value": 202,\n "var": "var(--pf-chart-donut--threshold--dynamic--pie--Width)"\n};\n/* harmony default export */ const esm_chart_donut_threshold_dynamic_pie_Width = (chart_donut_threshold_dynamic_pie_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_threshold_static_pie_Height.js\nconst chart_donut_threshold_static_pie_Height = {\n "name": "--pf-chart-donut--threshold--static--pie--Height",\n "value": 230,\n "var": "var(--pf-chart-donut--threshold--static--pie--Height)"\n};\n/* harmony default export */ const esm_chart_donut_threshold_static_pie_Height = (chart_donut_threshold_static_pie_Height);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_threshold_static_pie_angle_Padding.js\nconst chart_donut_threshold_static_pie_angle_Padding = {\n "name": "--pf-chart-donut--threshold--static--pie--angle--Padding",\n "value": 1,\n "var": "var(--pf-chart-donut--threshold--static--pie--angle--Padding)"\n};\n/* harmony default export */ const esm_chart_donut_threshold_static_pie_angle_Padding = (chart_donut_threshold_static_pie_angle_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_threshold_static_pie_Padding.js\nconst chart_donut_threshold_static_pie_Padding = {\n "name": "--pf-chart-donut--threshold--static--pie--Padding",\n "value": 20,\n "var": "var(--pf-chart-donut--threshold--static--pie--Padding)"\n};\n/* harmony default export */ const esm_chart_donut_threshold_static_pie_Padding = (chart_donut_threshold_static_pie_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_threshold_static_pie_Width.js\nconst chart_donut_threshold_static_pie_Width = {\n "name": "--pf-chart-donut--threshold--static--pie--Width",\n "value": 230,\n "var": "var(--pf-chart-donut--threshold--static--pie--Width)"\n};\n/* harmony default export */ const esm_chart_donut_threshold_static_pie_Width = (chart_donut_threshold_static_pie_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/donut-threshold-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n\n\n\n\n// Donut threshold dynamic theme\nconst DonutThresholdDynamicTheme = {\n legend: {\n colorScale: [esm_chart_donut_threshold_second_Color.value, esm_chart_donut_threshold_third_Color.value]\n },\n pie: {\n height: esm_chart_donut_threshold_dynamic_pie_Height.value,\n padding: esm_chart_donut_threshold_dynamic_pie_Padding.value,\n width: esm_chart_donut_threshold_dynamic_pie_Width.value\n }\n};\n// Donut threshold static theme\nconst DonutThresholdStaticTheme = {\n pie: {\n colorScale: [\n esm_chart_donut_threshold_first_Color.value,\n esm_chart_donut_threshold_second_Color.value,\n esm_chart_donut_threshold_third_Color.value\n ],\n height: esm_chart_donut_threshold_static_pie_Height.value,\n padAngle: esm_chart_donut_threshold_static_pie_angle_Padding.value,\n padding: esm_chart_donut_threshold_static_pie_Padding.value,\n width: esm_chart_donut_threshold_static_pie_Width.value\n }\n};\n//# sourceMappingURL=donut-threshold-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_utilization_dynamic_pie_Height.js\nconst chart_donut_utilization_dynamic_pie_Height = {\n "name": "--pf-chart-donut--utilization--dynamic--pie--Height",\n "value": 230,\n "var": "var(--pf-chart-donut--utilization--dynamic--pie--Height)"\n};\n/* harmony default export */ const esm_chart_donut_utilization_dynamic_pie_Height = (chart_donut_utilization_dynamic_pie_Height);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_utilization_dynamic_pie_angle_Padding.js\nconst chart_donut_utilization_dynamic_pie_angle_Padding = {\n "name": "--pf-chart-donut--utilization--dynamic--pie--angle--Padding",\n "value": 1,\n "var": "var(--pf-chart-donut--utilization--dynamic--pie--angle--Padding)"\n};\n/* harmony default export */ const esm_chart_donut_utilization_dynamic_pie_angle_Padding = (chart_donut_utilization_dynamic_pie_angle_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_utilization_dynamic_pie_Padding.js\nconst chart_donut_utilization_dynamic_pie_Padding = {\n "name": "--pf-chart-donut--utilization--dynamic--pie--Padding",\n "value": 20,\n "var": "var(--pf-chart-donut--utilization--dynamic--pie--Padding)"\n};\n/* harmony default export */ const esm_chart_donut_utilization_dynamic_pie_Padding = (chart_donut_utilization_dynamic_pie_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_utilization_dynamic_pie_Width.js\nconst chart_donut_utilization_dynamic_pie_Width = {\n "name": "--pf-chart-donut--utilization--dynamic--pie--Width",\n "value": 230,\n "var": "var(--pf-chart-donut--utilization--dynamic--pie--Width)"\n};\n/* harmony default export */ const esm_chart_donut_utilization_dynamic_pie_Width = (chart_donut_utilization_dynamic_pie_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_utilization_static_pie_Padding.js\nconst chart_donut_utilization_static_pie_Padding = {\n "name": "--pf-chart-donut--utilization--static--pie--Padding",\n "value": 20,\n "var": "var(--pf-chart-donut--utilization--static--pie--Padding)"\n};\n/* harmony default export */ const esm_chart_donut_utilization_static_pie_Padding = (chart_donut_utilization_static_pie_Padding);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/themes/donut-utilization-theme.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n\n\n// Donut utilization dynamic theme\nconst DonutUtilizationDynamicTheme = {\n pie: {\n height: esm_chart_donut_utilization_dynamic_pie_Height.value,\n padding: esm_chart_donut_utilization_dynamic_pie_Padding.value,\n padAngle: esm_chart_donut_utilization_dynamic_pie_angle_Padding.value,\n width: esm_chart_donut_utilization_dynamic_pie_Width.value\n }\n};\n// Donut utilization static theme\nconst DonutUtilizationStaticTheme = {\n legend: {\n colorScale: [\n esm_chart_donut_threshold_first_Color.value,\n esm_chart_donut_threshold_second_Color.value,\n esm_chart_donut_threshold_third_Color.value\n ]\n },\n pie: {\n colorScale: [esm_chart_donut_threshold_first_Color.value],\n padding: esm_chart_donut_utilization_static_pie_Padding.value\n }\n};\n//# sourceMappingURL=donut-utilization-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/ChartTheme.js\n\n\n\n\n\n\n\n/**\n * The color family to be applied to a theme. For example, \'blue\' represents an ordered list of colors\n * (i.e., a color scale) composed from the blue color family defined by PatternFly core.\n *\n * For example, the \'blue\' color scale looks like:\n *\n * chart_color_blue_100\n * chart_color_blue_200\n * chart_color_blue_300\n * chart_color_blue_400\n * chart_color_blue_500\n *\n * In this case, the chart_color_blue_100 value would be applied to the first data point in a chart.\n * The chart_color_blue_200 value would be applied to the second data point in a chart. And so on...\n *\n * If legend data is provided to a chart, those colors would be synced with the legend as well.\n *\n * The \'multiOrdered\' color family is intended for ordered charts; donut, pie, bar, & stack\n * The \'multiUnordered\' color family is intended for unordered charts; area & line\n * The \'multi\' defaults to the \'multiOrdered\' color family\n *\n * Note: These values are not intended to be applied directly as a component\'s fill style. For example, "multi" would\n * not be a valid fill color. Please use chart variables from PatternFly core (e.g., via the react-charts package)\n */\nconst ChartThemeColor = {\n blue: \'blue\',\n cyan: \'cyan\',\n default: \'blue\',\n gold: \'gold\',\n gray: \'gray\',\n green: \'green\',\n multi: \'multi\',\n multiOrdered: \'multi-ordered\',\n multiUnordered: \'multi-unordered\',\n orange: \'orange\',\n purple: \'purple\'\n};\n/**\n * The variant to be applied to a theme.\n *\n * Note: Only the light variant is currently supported\n */\nconst ChartThemeVariant = {\n dark: \'dark\',\n default: \'light\',\n light: \'light\'\n};\nconst ChartAxisTheme = AxisTheme;\nconst ChartBaseTheme = BaseTheme;\nconst ChartBulletComparativeErrorMeasureTheme = BulletComparativeErrorMeasureTheme;\nconst ChartBulletComparativeMeasureTheme = BulletComparativeMeasureTheme;\nconst ChartBulletComparativeWarningMeasureTheme = BulletComparativeWarningMeasureTheme;\nconst ChartBulletGroupTitleTheme = BulletGroupTitleTheme;\nconst ChartBulletPrimaryDotMeasureTheme = BulletPrimaryDotMeasureTheme;\nconst ChartBulletPrimaryNegativeMeasureTheme = BulletPrimaryNegativeMeasureTheme;\nconst ChartBulletPrimarySegmentedMeasureTheme = BulletPrimarySegmentedMeasureTheme;\nconst ChartBulletTheme = BulletTheme;\nconst ChartBulletQualitativeRangeTheme = BulletQualitativeRangeTheme;\nconst ChartDonutUtilizationDynamicTheme = DonutUtilizationDynamicTheme;\nconst ChartDonutUtilizationStaticTheme = DonutUtilizationStaticTheme;\nconst ChartDonutTheme = DonutTheme;\nconst ChartDonutThresholdDynamicTheme = DonutThresholdDynamicTheme;\nconst ChartDonutThresholdStaticTheme = DonutThresholdStaticTheme;\nconst ChartThresholdTheme = ThresholdTheme;\n//# sourceMappingURL=ChartTheme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartUtils/chart-theme.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Apply custom properties to base and color themes\nconst getCustomTheme = (themeColor, themeVariant, customTheme) => merge_default()(getTheme(themeColor, themeVariant), customTheme);\n// Returns axis theme\nconst getAxisTheme = (themeColor, themeVariant) => getCustomTheme(themeColor, themeVariant, ChartAxisTheme);\n// Returns bullet chart theme\nconst getBulletTheme = (themeColor, themeVariant) => getCustomTheme(themeColor, themeVariant, ChartBulletTheme);\n// Returns comparative error measure theme for bullet chart\nconst getBulletComparativeErrorMeasureTheme = (themeColor, themeVariant) => getCustomTheme(themeColor, themeVariant, ChartBulletComparativeErrorMeasureTheme);\n// Returns comparative measure theme for bullet chart\nconst getBulletComparativeMeasureTheme = (themeColor, themeVariant) => getCustomTheme(themeColor, themeVariant, ChartBulletComparativeMeasureTheme);\n// Returns comparative warning measure theme for bullet chart\nconst getBulletComparativeWarningMeasureTheme = (themeColor, themeVariant) => getCustomTheme(themeColor, themeVariant, ChartBulletComparativeWarningMeasureTheme);\n// Returns group title theme for bullet chart\nconst getBulletGroupTitleTheme = (themeColor, themeVariant) => getCustomTheme(themeColor, themeVariant, ChartBulletGroupTitleTheme);\n// Returns primary dot measure theme for bullet chart\nconst getBulletPrimaryDotMeasureTheme = (themeColor, themeVariant) => getCustomTheme(themeColor, themeVariant, ChartBulletPrimaryDotMeasureTheme);\n// Returns primary negative measure theme for bullet chart\nconst getBulletPrimaryNegativeMeasureTheme = (themeColor, themeVariant) => getCustomTheme(themeColor, themeVariant, ChartBulletPrimaryNegativeMeasureTheme);\n// Returns primary segmented measure theme for bullet chart\nconst getBulletPrimarySegmentedMeasureTheme = (themeColor, themeVariant) => getCustomTheme(themeColor, themeVariant, ChartBulletPrimarySegmentedMeasureTheme);\n// Returns qualitative range theme for bullet chart\nconst getBulletQualitativeRangeTheme = (themeColor, themeVariant) => getCustomTheme(themeColor, themeVariant, ChartBulletQualitativeRangeTheme);\n// Returns theme for Chart component\nconst getChartTheme = (themeColor, themeVariant, showAxis) => {\n const theme = getTheme(themeColor, themeVariant);\n if (!showAxis) {\n theme.axis.padding = 0;\n theme.axis.style.axis.fill = \'none\';\n theme.axis.style.axis.stroke = \'none\';\n theme.axis.style.grid.fill = \'none\';\n theme.axis.style.grid.stroke = \'none\';\n theme.axis.style.ticks.fill = \'none\';\n theme.axis.style.ticks.stroke = \'none\';\n theme.axis.style.tickLabels.fill = \'none\';\n }\n return theme;\n};\n// Returns donut theme\nconst getDonutTheme = (themeColor, themeVariant) => getCustomTheme(themeColor, themeVariant, ChartDonutTheme);\n// Returns dynamic donut threshold theme\nconst getDonutThresholdDynamicTheme = (themeColor, themeVariant) => {\n const theme = getCustomTheme(themeColor, themeVariant, ChartDonutThresholdDynamicTheme);\n // Merge just the first color of dynamic (blue, green, etc.) with static (grey) for expected colorScale\n theme.legend.colorScale = [theme.pie.colorScale[0], ...ChartDonutThresholdDynamicTheme.legend.colorScale];\n // Merge the threshold colors in case users want to show the unused data\n theme.pie.colorScale = [theme.pie.colorScale[0], ...ChartDonutThresholdStaticTheme.pie.colorScale];\n return theme;\n};\n// Returns static donut threshold theme\nconst getDonutThresholdStaticTheme = (themeColor, themeVariant, invert) => {\n const staticTheme = cloneDeep_default()(ChartDonutThresholdStaticTheme);\n if (invert && staticTheme.pie.colorScale instanceof Array) {\n staticTheme.pie.colorScale = staticTheme.pie.colorScale.reverse();\n }\n return getCustomTheme(themeColor, themeVariant, staticTheme);\n};\n// Returns donut utilization theme\nconst getDonutUtilizationTheme = (themeColor, themeVariant) => {\n const theme = getCustomTheme(themeColor, themeVariant, ChartDonutUtilizationDynamicTheme);\n // Merge just the first color of dynamic (blue, green, etc.) with static (grey) for expected colorScale\n theme.pie.colorScale = [theme.pie.colorScale[0], ...ChartDonutUtilizationStaticTheme.pie.colorScale];\n theme.legend.colorScale = [theme.legend.colorScale[0], ...ChartDonutUtilizationStaticTheme.legend.colorScale];\n return theme;\n};\n// Returns dark theme colors\nconst getDarkThemeColors = (themeColor) => {\n switch (themeColor) {\n case ChartThemeColor.blue:\n return DarkBlueColorTheme;\n case ChartThemeColor.cyan:\n return DarkCyanColorTheme;\n case ChartThemeColor.gold:\n return DarkGoldColorTheme;\n case ChartThemeColor.gray:\n return DarkGrayColorTheme;\n case ChartThemeColor.green:\n return DarkGreenColorTheme;\n case ChartThemeColor.multi:\n case ChartThemeColor.multiOrdered:\n return DarkMultiColorOrderedTheme;\n case ChartThemeColor.multiUnordered:\n return DarkMultiColorUnorderedTheme;\n case ChartThemeColor.orange:\n return DarkOrangeColorTheme;\n case ChartThemeColor.purple:\n return DarkPurpleColorTheme;\n default:\n return DarkBlueColorTheme;\n }\n};\n// Returns light theme colors\nconst getLightThemeColors = (themeColor) => {\n switch (themeColor) {\n case ChartThemeColor.blue:\n return LightBlueColorTheme;\n case ChartThemeColor.cyan:\n return LightCyanColorTheme;\n case ChartThemeColor.gold:\n return LightGoldColorTheme;\n case ChartThemeColor.gray:\n return LightGrayColorTheme;\n case ChartThemeColor.green:\n return LightGreenColorTheme;\n case ChartThemeColor.multi:\n case ChartThemeColor.multiOrdered:\n return LightMultiColorOrderedTheme;\n case ChartThemeColor.multiUnordered:\n return LightMultiColorUnorderedTheme;\n case ChartThemeColor.orange:\n return LightOrangeColorTheme;\n case ChartThemeColor.purple:\n return LightPurpleColorTheme;\n default:\n return LightBlueColorTheme;\n }\n};\n// Applies theme color and variant to base theme\nconst getTheme = (themeColor, themeVariant) => {\n // Deep clone\n const baseTheme = Object.assign({}, JSON.parse(JSON.stringify(ChartBaseTheme)));\n switch (themeVariant) {\n case ChartThemeVariant.dark:\n return merge_default()(baseTheme, getDarkThemeColors(themeColor));\n case ChartThemeVariant.light:\n return merge_default()(baseTheme, getLightThemeColors(themeColor));\n default:\n return merge_default()(baseTheme, getLightThemeColors(themeColor));\n }\n};\n// Returns threshold theme\nconst getThresholdTheme = (themeColor, themeVariant) => getCustomTheme(themeColor, themeVariant, ChartThresholdTheme);\n//# sourceMappingURL=chart-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartUtils/chart-helpers.js\n// Misc util functions\n// Copied from exenv\nconst canUseDOM = !!(typeof window !== \'undefined\' && window.document && window.document.createElement);\n// Returns the class name that will be applied to the outer-most div rendered by the chart\'s container\nconst getClassName = ({ className }) => {\n let cleanClassName;\n // Workaround for VictoryContainer class name\n if (className) {\n cleanClassName = className\n .replace(/VictoryContainer/g, \'\')\n .replace(/pf-c-chart/g, \'\')\n .replace(/\\s+/g, \' \')\n .trim();\n }\n return cleanClassName && cleanClassName.length ? `pf-c-chart ${cleanClassName}` : \'pf-c-chart\';\n};\n//# sourceMappingURL=chart-helpers.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartContainer/ChartContainer.js\n\n\n\n\n\nconst ChartContainer = (_a) => {\n var { className, themeColor, themeVariant, \n // destructure last\n theme = getTheme(themeColor, themeVariant) } = _a, rest = (0,tslib_es6.__rest)(_a, ["className", "themeColor", "themeVariant", "theme"]);\n const chartClassName = getClassName({ className });\n // Note: className is valid, but Victory is missing a type\n return react.createElement(VictoryContainer, Object.assign({ className: chartClassName, theme: theme }, rest));\n};\nChartContainer.displayName = \'ChartContainer\';\n// Note: VictoryContainer.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartContainer, VictoryContainer);\n//# sourceMappingURL=ChartContainer.js.map\n// EXTERNAL MODULE: ./node_modules/lodash/sum.js\nvar sum = __webpack_require__(2297);\nvar sum_default = /*#__PURE__*/__webpack_require__.n(sum);\n;// CONCATENATED MODULE: ./node_modules/victory-legend/es/helper-methods.js\n\n\n\n\n\n\n\n\nfunction victory_legend_es_helper_methods_toConsumableArray(arr) { return victory_legend_es_helper_methods_arrayWithoutHoles(arr) || victory_legend_es_helper_methods_iterableToArray(arr) || victory_legend_es_helper_methods_nonIterableSpread(); }\n\nfunction victory_legend_es_helper_methods_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_legend_es_helper_methods_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_legend_es_helper_methods_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction helper_methods_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { es_helper_methods_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction es_helper_methods_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\nvar helper_methods_getColorScale = function (props) {\n var colorScale = props.colorScale;\n return typeof colorScale === "string" ? getColorScale(colorScale) : colorScale || [];\n};\n\nvar getLabelStyles = function (props) {\n var data = props.data,\n style = props.style;\n return data.map(function (datum, index) {\n var baseLabelStyles = defaults_default()({}, datum.labels, style.labels);\n\n return evaluateStyle(baseLabelStyles, {\n datum: datum,\n index: index,\n data: data\n });\n });\n};\n\nvar victory_legend_es_helper_methods_getStyles = function (props, styleObject) {\n var style = props.style || {};\n styleObject = styleObject || {};\n var parentStyleProps = {\n height: "100%",\n width: "100%"\n };\n return {\n parent: defaults_default()(style.parent, styleObject.parent, parentStyleProps),\n data: defaults_default()({}, style.data, styleObject.data),\n labels: defaults_default()({}, style.labels, styleObject.labels),\n border: defaults_default()({}, style.border, styleObject.border),\n title: defaults_default()({}, style.title, styleObject.title)\n };\n};\n\nvar es_helper_methods_getCalculatedValues = function (props) {\n var orientation = props.orientation,\n theme = props.theme;\n var defaultStyles = theme && theme.legend && theme.legend.style ? theme.legend.style : {};\n var style = victory_legend_es_helper_methods_getStyles(props, defaultStyles);\n var colorScale = helper_methods_getColorScale(props);\n var isHorizontal = orientation === "horizontal";\n var borderPadding = helpers_getPadding({\n padding: props.borderPadding\n });\n return assign_default()({}, props, {\n style: style,\n isHorizontal: isHorizontal,\n colorScale: colorScale,\n borderPadding: borderPadding\n });\n};\n\nvar getColumn = function (props, index) {\n var itemsPerRow = props.itemsPerRow,\n isHorizontal = props.isHorizontal;\n\n if (!itemsPerRow) {\n return isHorizontal ? index : 0;\n }\n\n return isHorizontal ? index % itemsPerRow : Math.floor(index / itemsPerRow);\n};\n\nvar getRow = function (props, index) {\n var itemsPerRow = props.itemsPerRow,\n isHorizontal = props.isHorizontal;\n\n if (!itemsPerRow) {\n return isHorizontal ? 0 : index;\n }\n\n return isHorizontal ? Math.floor(index / itemsPerRow) : index % itemsPerRow;\n};\n\nvar groupData = function (props) {\n var data = props.data;\n var style = props.style && props.style.data || {};\n var labelStyles = getLabelStyles(props);\n return data.map(function (datum, index) {\n var symbol = datum.symbol || {};\n var fontSize = labelStyles[index].fontSize; // eslint-disable-next-line no-magic-numbers\n\n var size = symbol.size || style.size || fontSize / 2.5;\n var symbolSpacer = props.symbolSpacer || Math.max(size, fontSize);\n return helper_methods_objectSpread({}, datum, {\n size: size,\n symbolSpacer: symbolSpacer,\n fontSize: fontSize,\n textSize: approximateTextSize(datum.name, labelStyles[index]),\n column: getColumn(props, index),\n row: getRow(props, index)\n });\n });\n};\n\nvar getColumnWidths = function (props, data) {\n var gutter = props.gutter || {};\n var gutterWidth = typeof gutter === "object" ? (gutter.left || 0) + (gutter.right || 0) : gutter || 0;\n\n var dataByColumn = groupBy_default()(data, "column");\n\n var columns = keys_default()(dataByColumn);\n\n return columns.reduce(function (memo, curr, index) {\n var lengths = dataByColumn[curr].map(function (d) {\n return d.textSize.width + d.size + d.symbolSpacer + gutterWidth;\n });\n memo[index] = Math.max.apply(Math, victory_legend_es_helper_methods_toConsumableArray(lengths));\n return memo;\n }, []);\n};\n\nvar getRowHeights = function (props, data) {\n var gutter = props.rowGutter || {};\n var gutterHeight = typeof gutter === "object" ? (gutter.top || 0) + (gutter.bottom || 0) : gutter || 0;\n\n var dataByRow = groupBy_default()(data, "row");\n\n return keys_default()(dataByRow).reduce(function (memo, curr, index) {\n var rows = dataByRow[curr];\n var lengths = rows.map(function (d) {\n return d.textSize.height + d.symbolSpacer + gutterHeight;\n });\n memo[index] = Math.max.apply(Math, victory_legend_es_helper_methods_toConsumableArray(lengths));\n return memo;\n }, []);\n};\n\nvar getTitleDimensions = function (props) {\n var style = props.style && props.style.title || {};\n var textSize = approximateTextSize(props.title, style);\n var padding = style.padding || 0;\n return {\n height: textSize.height + 2 * padding || 0,\n width: textSize.width + 2 * padding || 0\n };\n};\n\nvar es_helper_methods_getOffset = function (datum, rowHeights, columnWidths) {\n var column = datum.column,\n row = datum.row;\n return {\n x: range_default()(column).reduce(function (memo, curr) {\n memo += columnWidths[curr];\n return memo;\n }, 0),\n y: range_default()(row).reduce(function (memo, curr) {\n memo += rowHeights[curr];\n return memo;\n }, 0)\n };\n};\n\nvar helper_methods_getAnchors = function (titleOrientation, centerTitle) {\n var standardAnchors = {\n textAnchor: titleOrientation === "right" ? "end" : "start",\n verticalAnchor: titleOrientation === "bottom" ? "end" : "start"\n };\n\n if (centerTitle) {\n var horizontal = titleOrientation === "top" || titleOrientation === "bottom";\n return {\n textAnchor: horizontal ? "middle" : standardAnchors.textAnchor,\n verticalAnchor: horizontal ? standardAnchors.verticalAnchor : "middle"\n };\n } else {\n return standardAnchors;\n }\n};\n\nvar getTitleStyle = function (props) {\n var titleOrientation = props.titleOrientation,\n centerTitle = props.centerTitle,\n titleComponent = props.titleComponent;\n var baseStyle = props.style && props.style.title || {};\n var componentStyle = titleComponent.props && titleComponent.props.style || {};\n var anchors = helper_methods_getAnchors(titleOrientation, centerTitle);\n return Array.isArray(componentStyle) ? componentStyle.map(function (obj) {\n return defaults_default()({}, obj, baseStyle, anchors);\n }) : defaults_default()({}, componentStyle, baseStyle, anchors);\n}; // eslint-disable-next-line complexity\n\n\nvar getTitleProps = function (props, borderProps) {\n var title = props.title,\n titleOrientation = props.titleOrientation,\n centerTitle = props.centerTitle,\n borderPadding = props.borderPadding;\n var height = borderProps.height,\n width = borderProps.width;\n var style = getTitleStyle(props);\n var padding = Array.isArray(style) ? style[0].padding : style.padding;\n var horizontal = titleOrientation === "top" || titleOrientation === "bottom";\n var xOrientation = titleOrientation === "bottom" ? "bottom" : "top";\n var yOrientation = titleOrientation === "right" ? "right" : "left";\n var standardPadding = {\n x: centerTitle ? width / 2 : borderPadding[xOrientation] + (padding || 0),\n y: centerTitle ? height / 2 : borderPadding[yOrientation] + (padding || 0)\n };\n\n var getPadding = function () {\n return borderPadding[titleOrientation] + (padding || 0);\n };\n\n var xOffset = horizontal ? standardPadding.x : getPadding();\n var yOffset = horizontal ? getPadding() : standardPadding.y;\n return {\n x: titleOrientation === "right" ? props.x + width - xOffset : props.x + xOffset,\n y: titleOrientation === "bottom" ? props.y + height - yOffset : props.y + yOffset,\n style: style,\n text: title\n };\n};\n\nvar getBorderProps = function (props, contentHeight, contentWidth) {\n var x = props.x,\n y = props.y,\n borderPadding = props.borderPadding,\n style = props.style;\n var height = (contentHeight || 0) + borderPadding.top + borderPadding.bottom;\n var width = (contentWidth || 0) + borderPadding.left + borderPadding.right;\n return {\n x: x,\n y: y,\n height: height,\n width: width,\n style: assign_default()({\n fill: "none"\n }, style.border)\n };\n};\n\nvar getDimensions = function (props, fallbackProps) {\n var modifiedProps = modifyProps(props, fallbackProps, "legend");\n props = assign_default()({}, modifiedProps, es_helper_methods_getCalculatedValues(modifiedProps));\n var _props = props,\n title = _props.title,\n titleOrientation = _props.titleOrientation;\n var groupedData = groupData(props);\n var columnWidths = getColumnWidths(props, groupedData);\n var rowHeights = getRowHeights(props, groupedData);\n var titleDimensions = title ? getTitleDimensions(props) : {\n height: 0,\n width: 0\n };\n return {\n height: titleOrientation === "left" || titleOrientation === "right" ? Math.max(sum_default()(rowHeights), titleDimensions.height) : sum_default()(rowHeights) + titleDimensions.height,\n width: titleOrientation === "left" || titleOrientation === "right" ? sum_default()(columnWidths) + titleDimensions.width : Math.max(sum_default()(columnWidths), titleDimensions.width)\n };\n};\nvar es_helper_methods_getBaseProps = function (props, fallbackProps) {\n var modifiedProps = modifyProps(props, fallbackProps, "legend");\n props = assign_default()({}, modifiedProps, es_helper_methods_getCalculatedValues(modifiedProps));\n var _props2 = props,\n data = _props2.data,\n standalone = _props2.standalone,\n theme = _props2.theme,\n padding = _props2.padding,\n style = _props2.style,\n colorScale = _props2.colorScale,\n gutter = _props2.gutter,\n rowGutter = _props2.rowGutter,\n borderPadding = _props2.borderPadding,\n title = _props2.title,\n titleOrientation = _props2.titleOrientation,\n name = _props2.name,\n _props2$x = _props2.x,\n x = _props2$x === void 0 ? 0 : _props2$x,\n _props2$y = _props2.y,\n y = _props2$y === void 0 ? 0 : _props2$y;\n var groupedData = groupData(props);\n var columnWidths = getColumnWidths(props, groupedData);\n var rowHeights = getRowHeights(props, groupedData);\n var labelStyles = getLabelStyles(props);\n var titleDimensions = title ? getTitleDimensions(props) : {\n height: 0,\n width: 0\n };\n var titleOffset = {\n x: titleOrientation === "left" ? titleDimensions.width : 0,\n y: titleOrientation === "top" ? titleDimensions.height : 0\n };\n var gutterOffset = {\n x: gutter && typeof gutter === "object" ? gutter.left || 0 : 0,\n y: rowGutter && typeof rowGutter === "object" ? rowGutter.top || 0 : 0\n };\n\n var _getDimensions = getDimensions(props, fallbackProps),\n height = _getDimensions.height,\n width = _getDimensions.width;\n\n var borderProps = getBorderProps(props, height, width);\n var titleProps = getTitleProps(props, borderProps);\n var initialProps = {\n parent: {\n data: data,\n standalone: standalone,\n theme: theme,\n padding: padding,\n name: name,\n height: props.height,\n width: props.width,\n style: style.parent\n },\n all: {\n border: borderProps,\n title: titleProps\n }\n };\n return groupedData.reduce(function (childProps, datum, i) {\n var color = colorScale[i % colorScale.length];\n\n var dataStyle = defaults_default()({}, datum.symbol, style.data, {\n fill: color\n });\n\n var eventKey = !isNil_default()(datum.eventKey) ? datum.eventKey : i;\n var offset = es_helper_methods_getOffset(datum, rowHeights, columnWidths);\n var originY = y + borderPadding.top + datum.symbolSpacer;\n var originX = x + borderPadding.left + datum.symbolSpacer;\n var dataProps = {\n index: i,\n data: data,\n datum: datum,\n symbol: dataStyle.type || dataStyle.symbol || "circle",\n size: datum.size,\n style: dataStyle,\n y: originY + offset.y + titleOffset.y + gutterOffset.y,\n x: originX + offset.x + titleOffset.x + gutterOffset.x\n };\n var labelProps = {\n datum: datum,\n data: data,\n text: datum.name,\n style: labelStyles[i],\n y: dataProps.y,\n x: dataProps.x + datum.symbolSpacer + datum.size / 2\n };\n childProps[eventKey] = {\n data: dataProps,\n labels: labelProps\n };\n return childProps;\n }, initialProps);\n};\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-primitives/border.js\n\n\nfunction border_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { border_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction border_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nvar border_evaluateProps = function (props) {\n /**\n * Potential evaluated props are:\n * `ariaLabel`\n * `desc`\n * `id`\n * `style`\n * `tabIndex`\n */\n var ariaLabel = evaluateProp(props.ariaLabel, props);\n var desc = evaluateProp(props.desc, props);\n var id = evaluateProp(props.id, props);\n var style = evaluateStyle(assign_default()({\n fill: "none"\n }, props.style), props);\n var tabIndex = evaluateProp(props.tabIndex, props);\n return assign_default()({}, props, {\n ariaLabel: ariaLabel,\n desc: desc,\n id: id,\n style: style,\n tabIndex: tabIndex\n });\n};\n\nvar Border = function (props) {\n props = border_evaluateProps(props);\n return react.cloneElement(props.rectComponent, border_objectSpread({}, props.events, {\n "aria-label": props.ariaLabel,\n style: props.style,\n desc: props.desc,\n tabIndex: props.tabIndex,\n transform: props.transform,\n className: props.className,\n role: props.role,\n shapeRendering: props.shapeRendering,\n x: props.x,\n y: props.y,\n width: props.width,\n height: props.height,\n clipPath: props.clipPath\n }));\n};\n\nBorder.propTypes = border_objectSpread({}, primitiveProps, {\n height: (prop_types_default()).number,\n rectComponent: (prop_types_default()).element,\n width: (prop_types_default()).number,\n x: (prop_types_default()).number,\n y: (prop_types_default()).number\n});\nBorder.defaultProps = {\n rectComponent: react.createElement(rect, null),\n role: "presentation",\n shapeRendering: "auto"\n};\n/* harmony default export */ const border = (Border);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/point-path-helpers.js\n\n/* harmony default export */ const point_path_helpers = ({\n circle: function (x, y, size) {\n return "M ".concat(x, ", ").concat(y, "\\n m ").concat(-size, ", 0\\n a ").concat(size, ", ").concat(size, " 0 1,0 ").concat(size * 2, ",0\\n a ").concat(size, ", ").concat(size, " 0 1,0 ").concat(-size * 2, ",0");\n },\n square: function (x, y, size) {\n var baseSize = 0.87 * size; // eslint-disable-line no-magic-numbers\n\n var x0 = x - baseSize;\n var y1 = y + baseSize;\n var distance = x + baseSize - x0;\n return "M ".concat(x0, ", ").concat(y1, "\\n h").concat(distance, "\\n v-").concat(distance, "\\n h-").concat(distance, "\\n z");\n },\n diamond: function (x, y, size) {\n var baseSize = 0.87 * size; // eslint-disable-line no-magic-numbers\n\n var length = Math.sqrt(2 * (baseSize * baseSize));\n return "M ".concat(x, ", ").concat(y + length, "\\n l ").concat(length, ", -").concat(length, "\\n l -").concat(length, ", -").concat(length, "\\n l -").concat(length, ", ").concat(length, "\\n l ").concat(length, ", ").concat(length, "\\n z");\n },\n triangleDown: function (x, y, size) {\n var height = size / 2 * Math.sqrt(3);\n var x0 = x - size;\n var x1 = x + size;\n var y0 = y - size;\n var y1 = y + height;\n return "M ".concat(x0, ", ").concat(y0, "\\n L ").concat(x1, ", ").concat(y0, "\\n L ").concat(x, ", ").concat(y1, "\\n z");\n },\n triangleUp: function (x, y, size) {\n var height = size / 2 * Math.sqrt(3);\n var x0 = x - size;\n var x1 = x + size;\n var y0 = y - height;\n var y1 = y + size;\n return "M ".concat(x0, ", ").concat(y1, "\\n L ").concat(x1, ", ").concat(y1, "\\n L ").concat(x, ", ").concat(y0, "\\n z");\n },\n plus: function (x, y, size) {\n var baseSize = 1.1 * size; // eslint-disable-line no-magic-numbers\n\n var distance = baseSize / 1.5; // eslint-disable-line no-magic-numbers\n\n return "\\n M ".concat(x - distance / 2, ", ").concat(y + baseSize, "\\n v-").concat(distance, "\\n h-").concat(distance, "\\n v-").concat(distance, "\\n h").concat(distance, "\\n v-").concat(distance, "\\n h").concat(distance, "\\n v").concat(distance, "\\n h").concat(distance, "\\n v").concat(distance, "\\n h-").concat(distance, "\\n v").concat(distance, "\\n z");\n },\n cross: function (x, y, size) {\n var baseSize = 0.8 * size; // eslint-disable-line no-magic-numbers\n\n var distance = baseSize / 1.5; // eslint-disable-line no-magic-numbers\n\n return "\\n M ".concat(x - distance / 2, ", ").concat(y + baseSize + distance, "\\n v-").concat(distance * 2, "\\n h-").concat(distance, "\\n v-").concat(distance, "\\n h").concat(distance, "\\n v-").concat(distance, "\\n h").concat(distance, "\\n v").concat(distance, "\\n h").concat(distance, "\\n v").concat(distance, "\\n h-").concat(distance, "\\n v").concat(distance * 2, "\\n z");\n },\n minus: function (x, y, size) {\n var baseSize = 1.1 * size; // eslint-disable-line no-magic-numbers\n\n var lineHeight = baseSize - baseSize * 0.3; // eslint-disable-line no-magic-numbers\n\n var x0 = x - baseSize;\n var y1 = y + lineHeight / 2;\n var distance = x + baseSize - x0;\n return "M ".concat(x0, ", ").concat(y1, "\\n h").concat(distance, "\\n v-").concat(lineHeight, "\\n h-").concat(distance, "\\n z");\n },\n star: function (x, y, size) {\n var baseSize = 1.35 * size; // eslint-disable-line no-magic-numbers\n\n var angle = Math.PI / 5; // eslint-disable-line no-magic-numbers\n // eslint-disable-next-line no-magic-numbers\n\n var starCoords = range_default()(10).map(function (index) {\n var length = index % 2 === 0 ? baseSize : baseSize / 2;\n return "".concat(length * Math.sin(angle * (index + 1)) + x, ",\\n ").concat(length * Math.cos(angle * (index + 1)) + y);\n });\n\n return "M ".concat(starCoords.join("L"), " z");\n }\n});\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-primitives/point.js\n\n\nfunction point_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { point_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction point_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\nvar getPath = function (props) {\n var x = props.x,\n y = props.y,\n size = props.size,\n symbol = props.symbol;\n\n if (props.getPath) {\n return props.getPath(x, y, size);\n }\n\n var pathFunctions = {\n circle: point_path_helpers.circle,\n square: point_path_helpers.square,\n diamond: point_path_helpers.diamond,\n triangleDown: point_path_helpers.triangleDown,\n triangleUp: point_path_helpers.triangleUp,\n plus: point_path_helpers.plus,\n minus: point_path_helpers.minus,\n star: point_path_helpers.star,\n cross: point_path_helpers.cross\n };\n var symbolFunction = typeof pathFunctions[symbol] === "function" ? pathFunctions[symbol] : pathFunctions.circle;\n return symbolFunction(x, y, size);\n};\n\nvar point_evaluateProps = function (props) {\n /**\n * Potential evaluated props are:\n * `ariaLabel`\n * `desc`\n * `id`\n * `size`\n * `style`\n * `symbol`\n * `tabIndex`\n */\n var ariaLabel = evaluateProp(props.ariaLabel, props);\n var desc = evaluateProp(props.desc, props);\n var id = evaluateProp(props.id, props);\n var size = evaluateProp(props.size, props);\n var style = evaluateStyle(props.style, props);\n var symbol = evaluateProp(props.symbol, props);\n var tabIndex = evaluateProp(props.tabIndex, props);\n return assign_default()({}, props, {\n ariaLabel: ariaLabel,\n desc: desc,\n id: id,\n size: size,\n style: style,\n symbol: symbol,\n tabIndex: tabIndex\n });\n};\n\nvar Point = function (props) {\n props = point_evaluateProps(props);\n return react.cloneElement(props.pathComponent, point_objectSpread({}, props.events, {\n "aria-label": props.ariaLabel,\n d: getPath(props),\n style: props.style,\n desc: props.desc,\n tabIndex: props.tabIndex,\n role: props.role,\n shapeRendering: props.shapeRendering,\n className: props.className,\n transform: props.transform,\n clipPath: props.clipPath\n }));\n};\n\nPoint.propTypes = point_objectSpread({}, primitiveProps, {\n datum: (prop_types_default()).object,\n getPath: (prop_types_default()).func,\n pathComponent: (prop_types_default()).element,\n size: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n symbol: prop_types_default().oneOfType([prop_types_default().oneOf(["circle", "cross", "diamond", "plus", "minus", "square", "star", "triangleDown", "triangleUp"]), (prop_types_default()).func]),\n x: (prop_types_default()).number,\n y: (prop_types_default()).number\n});\nPoint.defaultProps = {\n pathComponent: react.createElement(path, null),\n role: "presentation",\n shapeRendering: "auto"\n};\n/* harmony default export */ const victory_primitives_point = (Point);\n;// CONCATENATED MODULE: ./node_modules/victory-legend/es/victory-legend.js\nfunction victory_legend_toConsumableArray(arr) { return victory_legend_arrayWithoutHoles(arr) || victory_legend_iterableToArray(arr) || victory_legend_nonIterableSpread(); }\n\nfunction victory_legend_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_legend_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_legend_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction victory_legend_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_legend_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_legend_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_legend_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_legend_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_legend_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_legend_assertThisInitialized(self); }\n\nfunction victory_legend_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_legend_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\nvar victory_legend_fallbackProps = {\n orientation: "vertical",\n titleOrientation: "top",\n width: 450,\n height: 300,\n x: 0,\n y: 0\n};\nvar defaultLegendData = [{\n name: "Series 1"\n}, {\n name: "Series 2"\n}];\n\nvar VictoryLegend =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_legend_inherits(VictoryLegend, _React$Component);\n\n function VictoryLegend() {\n victory_legend_classCallCheck(this, VictoryLegend);\n\n return victory_legend_possibleConstructorReturn(this, (VictoryLegend.__proto__ || Object.getPrototypeOf(VictoryLegend)).apply(this, arguments));\n }\n\n victory_legend_createClass(VictoryLegend, [{\n key: "renderChildren",\n value: function renderChildren(props) {\n var _this = this;\n\n var dataComponent = props.dataComponent,\n labelComponent = props.labelComponent,\n title = props.title;\n var dataComponents = this.dataKeys.map(function (_dataKey, index) {\n if (_dataKey === "all") {\n return undefined;\n }\n\n var dataProps = _this.getComponentProps(dataComponent, "data", index);\n\n return react.cloneElement(dataComponent, dataProps);\n }).filter(Boolean);\n var labelComponents = this.dataKeys.map(function (_dataKey, index) {\n if (_dataKey === "all") {\n return undefined;\n }\n\n var labelProps = _this.getComponentProps(labelComponent, "labels", index);\n\n if (labelProps.text !== undefined && labelProps.text !== null) {\n return react.cloneElement(labelComponent, labelProps);\n }\n\n return undefined;\n }).filter(Boolean);\n var borderProps = this.getComponentProps(props.borderComponent, "border", "all");\n var borderComponent = react.cloneElement(props.borderComponent, borderProps);\n\n if (title) {\n var titleProps = this.getComponentProps(props.title, "title", "all");\n var titleComponent = react.cloneElement(props.titleComponent, titleProps);\n return [borderComponent].concat(victory_legend_toConsumableArray(dataComponents), [titleComponent], victory_legend_toConsumableArray(labelComponents));\n }\n\n return [borderComponent].concat(victory_legend_toConsumableArray(dataComponents), victory_legend_toConsumableArray(labelComponents));\n }\n }, {\n key: "render",\n value: function render() {\n var role = this.constructor.role;\n var props = modifyProps(this.props, victory_legend_fallbackProps, role);\n var children = [this.renderChildren(props)];\n return props.standalone ? this.renderContainer(props.containerComponent, children) : react.cloneElement(props.groupComponent, {}, children);\n }\n }]);\n\n return VictoryLegend;\n}(react.Component);\n\nObject.defineProperty(VictoryLegend, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryLegend"\n});\nObject.defineProperty(VictoryLegend, "role", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "legend"\n});\nObject.defineProperty(VictoryLegend, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n borderComponent: (prop_types_default()).element,\n borderPadding: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().shape({\n top: (prop_types_default()).number,\n bottom: (prop_types_default()).number,\n left: (prop_types_default()).number,\n right: (prop_types_default()).number\n })]),\n centerTitle: (prop_types_default()).bool,\n colorScale: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).string), prop_types_default().oneOf(["grayscale", "qualitative", "heatmap", "warm", "cool", "red", "green", "blue"])]),\n containerComponent: (prop_types_default()).element,\n data: prop_types_default().arrayOf(prop_types_default().shape({\n name: (prop_types_default()).string.isRequired,\n label: (prop_types_default()).object,\n symbol: (prop_types_default()).object\n })),\n dataComponent: (prop_types_default()).element,\n eventKey: prop_types_default().oneOfType([(prop_types_default()).func, allOfType([integer, nonNegative]), (prop_types_default()).string]),\n events: prop_types_default().arrayOf(prop_types_default().shape({\n target: prop_types_default().oneOf(["data", "labels", "parent"]),\n eventKey: prop_types_default().oneOfType([(prop_types_default()).array, allOfType([integer, nonNegative]), (prop_types_default()).string]),\n eventHandlers: (prop_types_default()).object\n })),\n externalEventMutations: prop_types_default().arrayOf(prop_types_default().shape({\n callback: (prop_types_default())["function"],\n childName: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).array]),\n eventKey: prop_types_default().oneOfType([(prop_types_default()).array, allOfType([integer, nonNegative]), (prop_types_default()).string]),\n mutation: (prop_types_default())["function"],\n target: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).array])\n })),\n groupComponent: (prop_types_default()).element,\n gutter: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().shape({\n left: (prop_types_default()).number,\n right: (prop_types_default()).number\n })]),\n height: nonNegative,\n itemsPerRow: nonNegative,\n labelComponent: (prop_types_default()).element,\n name: (prop_types_default()).string,\n orientation: prop_types_default().oneOf(["horizontal", "vertical"]),\n padding: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().shape({\n top: (prop_types_default()).number,\n bottom: (prop_types_default()).number,\n left: (prop_types_default()).number,\n right: (prop_types_default()).number\n })]),\n rowGutter: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().shape({\n top: (prop_types_default()).number,\n bottom: (prop_types_default()).number\n })]),\n sharedEvents: prop_types_default().shape({\n events: (prop_types_default()).array,\n getEventState: (prop_types_default()).func\n }),\n standalone: (prop_types_default()).bool,\n style: prop_types_default().shape({\n border: (prop_types_default()).object,\n data: (prop_types_default()).object,\n labels: (prop_types_default()).object,\n parent: (prop_types_default()).object,\n title: (prop_types_default()).object\n }),\n symbolSpacer: (prop_types_default()).number,\n theme: (prop_types_default()).object,\n title: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).array]),\n titleComponent: (prop_types_default()).element,\n titleOrientation: prop_types_default().oneOf(["top", "bottom", "left", "right"]),\n width: nonNegative,\n x: nonNegative,\n y: nonNegative\n }\n});\nObject.defineProperty(VictoryLegend, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n borderComponent: react.createElement(border, null),\n data: defaultLegendData,\n containerComponent: react.createElement(VictoryContainer, null),\n dataComponent: react.createElement(victory_primitives_point, null),\n groupComponent: react.createElement("g", null),\n labelComponent: react.createElement(victory_label, null),\n standalone: true,\n theme: victory_theme.grayscale,\n titleComponent: react.createElement(victory_label, null)\n }\n});\nObject.defineProperty(VictoryLegend, "getBaseProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return es_helper_methods_getBaseProps(props, victory_legend_fallbackProps);\n }\n});\nObject.defineProperty(VictoryLegend, "getDimensions", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return getDimensions(props, victory_legend_fallbackProps);\n }\n});\nObject.defineProperty(VictoryLegend, "expectedComponents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["borderComponent", "containerComponent", "dataComponent", "groupComponent", "labelComponent", "titleComponent"]\n});\n/* harmony default export */ const victory_legend = (add_events(VictoryLegend));\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_global_label_Margin.js\nconst chart_global_label_Margin = {\n "name": "--pf-chart-global--label--Margin",\n "value": 8,\n "var": "var(--pf-chart-global--label--Margin)"\n};\n/* harmony default export */ const esm_chart_global_label_Margin = (chart_global_label_Margin);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_legend_position.js\nconst chart_legend_position = {\n "name": "--pf-chart-legend--position",\n "value": "right",\n "var": "var(--pf-chart-legend--position)"\n};\n/* harmony default export */ const esm_chart_legend_position = (chart_legend_position);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/styles/common-styles.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n// Typography\nconst common_styles_TYPOGRAPHY_FONT_FAMILY = esm_chart_global_FontFamily["var"];\nconst common_styles_TYPOGRAPHY_LETTER_SPACING = esm_chart_global_letter_spacing["var"];\nconst common_styles_TYPOGRAPHY_FONT_SIZE = esm_chart_global_FontSize_sm.value;\nconst CommonStyles = {\n label: {\n fontFamily: common_styles_TYPOGRAPHY_FONT_FAMILY,\n fontSize: common_styles_TYPOGRAPHY_FONT_SIZE,\n letterSpacing: common_styles_TYPOGRAPHY_LETTER_SPACING,\n margin: esm_chart_global_label_Margin.value\n },\n legend: {\n margin: esm_chart_legend_Margin.value,\n position: esm_chart_legend_position.value\n }\n};\n//# sourceMappingURL=common-styles.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_axis_tick_count.js\nconst chart_bullet_axis_tick_count = {\n "name": "--pf-chart-bullet--axis--tick--count",\n "value": 5,\n "var": "var(--pf-chart-bullet--axis--tick--count)"\n};\n/* harmony default export */ const esm_chart_bullet_axis_tick_count = (chart_bullet_axis_tick_count);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_comparative_measure_Width.js\nconst chart_bullet_comparative_measure_Width = {\n "name": "--pf-chart-bullet--comparative-measure--Width",\n "value": 30,\n "var": "var(--pf-chart-bullet--comparative-measure--Width)"\n};\n/* harmony default export */ const esm_chart_bullet_comparative_measure_Width = (chart_bullet_comparative_measure_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_comparative_measure_error_Width.js\nconst chart_bullet_comparative_measure_error_Width = {\n "name": "--pf-chart-bullet--comparative-measure--error--Width",\n "value": 30,\n "var": "var(--pf-chart-bullet--comparative-measure--error--Width)"\n};\n/* harmony default export */ const esm_chart_bullet_comparative_measure_error_Width = (chart_bullet_comparative_measure_error_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_comparative_measure_warning_Width.js\nconst chart_bullet_comparative_measure_warning_Width = {\n "name": "--pf-chart-bullet--comparative-measure--warning--Width",\n "value": 30,\n "var": "var(--pf-chart-bullet--comparative-measure--warning--Width)"\n};\n/* harmony default export */ const esm_chart_bullet_comparative_measure_warning_Width = (chart_bullet_comparative_measure_warning_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_label_subtitle_Fill.js\nconst chart_bullet_label_subtitle_Fill = {\n "name": "--pf-chart-bullet--label--subtitle--Fill",\n "value": "#b8bbbe",\n "var": "var(--pf-chart-bullet--label--subtitle--Fill)"\n};\n/* harmony default export */ const esm_chart_bullet_label_subtitle_Fill = (chart_bullet_label_subtitle_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_primary_measure_dot_size.js\nconst chart_bullet_primary_measure_dot_size = {\n "name": "--pf-chart-bullet--primary-measure--dot--size",\n "value": 6,\n "var": "var(--pf-chart-bullet--primary-measure--dot--size)"\n};\n/* harmony default export */ const esm_chart_bullet_primary_measure_dot_size = (chart_bullet_primary_measure_dot_size);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_primary_measure_segmented_Width.js\nconst chart_bullet_primary_measure_segmented_Width = {\n "name": "--pf-chart-bullet--primary-measure--segmented--Width",\n "value": 9,\n "var": "var(--pf-chart-bullet--primary-measure--segmented--Width)"\n};\n/* harmony default export */ const esm_chart_bullet_primary_measure_segmented_Width = (chart_bullet_primary_measure_segmented_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_bullet_qualitative_range_Width.js\nconst chart_bullet_qualitative_range_Width = {\n "name": "--pf-chart-bullet--qualitative-range--Width",\n "value": 30,\n "var": "var(--pf-chart-bullet--qualitative-range--Width)"\n};\n/* harmony default export */ const esm_chart_bullet_qualitative_range_Width = (chart_bullet_qualitative_range_Width);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_global_FontSize_2xl.js\nconst chart_global_FontSize_2xl = {\n "name": "--pf-chart-global--FontSize--2xl",\n "value": 24,\n "var": "var(--pf-chart-global--FontSize--2xl)"\n};\n/* harmony default export */ const esm_chart_global_FontSize_2xl = (chart_global_FontSize_2xl);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_global_FontSize_lg.js\nconst chart_global_FontSize_lg = {\n "name": "--pf-chart-global--FontSize--lg",\n "value": 18,\n "var": "var(--pf-chart-global--FontSize--lg)"\n};\n/* harmony default export */ const esm_chart_global_FontSize_lg = (chart_global_FontSize_lg);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/styles/bullet-styles.js\n/* eslint-disable camelcase */\n\n\n\n\n\n\n\n\n\n\n\n// Bullet styles\nconst BulletStyles = {\n axisTickCount: esm_chart_bullet_axis_tick_count.value,\n comparativeMeasureErrorWidth: esm_chart_bullet_comparative_measure_error_Width.value,\n comparativeMeasureWarningWidth: esm_chart_bullet_comparative_measure_warning_Width.value,\n comparativeMeasureWidth: esm_chart_bullet_comparative_measure_Width.value,\n label: {\n groupTitle: {\n // Victory props only\n fontSize: esm_chart_global_FontSize_2xl.value\n },\n subTitle: {\n // Victory props only\n fill: esm_chart_bullet_label_subtitle_Fill.value,\n fontSize: esm_chart_global_FontSize_sm.value\n },\n title: {\n // Victory props only\n fontSize: esm_chart_global_FontSize_lg.value\n }\n },\n primaryDotMeasureSize: esm_chart_bullet_primary_measure_dot_size.value,\n primarySegmentedMeasureWidth: esm_chart_bullet_primary_measure_segmented_Width.value,\n qualitativeRangeWidth: esm_chart_bullet_qualitative_range_Width.value\n};\n//# sourceMappingURL=bullet-styles.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_label_subtitle_Fill.js\nconst chart_donut_label_subtitle_Fill = {\n "name": "--pf-chart-donut--label--subtitle--Fill",\n "value": "#b8bbbe",\n "var": "var(--pf-chart-donut--label--subtitle--Fill)"\n};\n/* harmony default export */ const esm_chart_donut_label_subtitle_Fill = (chart_donut_label_subtitle_Fill);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_label_subtitle_position.js\nconst chart_donut_label_subtitle_position = {\n "name": "--pf-chart-donut--label--subtitle--position",\n "value": "center",\n "var": "var(--pf-chart-donut--label--subtitle--position)"\n};\n/* harmony default export */ const esm_chart_donut_label_subtitle_position = (chart_donut_label_subtitle_position);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/styles/donut-styles.js\n/* eslint-disable camelcase */\n\n\n\n\n// Donut styles\nconst DonutStyles = {\n label: {\n subTitle: {\n // Victory props only\n fill: esm_chart_donut_label_subtitle_Fill.value,\n fontSize: esm_chart_global_FontSize_sm.value\n },\n subTitlePosition: esm_chart_donut_label_subtitle_position.value,\n title: {\n // Victory props only\n fontSize: esm_chart_global_FontSize_2xl.value\n }\n }\n};\n//# sourceMappingURL=donut-styles.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_threshold_warning_Color.js\nconst chart_donut_threshold_warning_Color = {\n "name": "--pf-chart-donut--threshold--warning--Color",\n "value": "#f0ab00",\n "var": "var(--pf-chart-donut--threshold--warning--Color)"\n};\n/* harmony default export */ const esm_chart_donut_threshold_warning_Color = (chart_donut_threshold_warning_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_donut_threshold_danger_Color.js\nconst chart_donut_threshold_danger_Color = {\n "name": "--pf-chart-donut--threshold--danger--Color",\n "value": "#c9190b",\n "var": "var(--pf-chart-donut--threshold--danger--Color)"\n};\n/* harmony default export */ const esm_chart_donut_threshold_danger_Color = (chart_donut_threshold_danger_Color);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/styles/donut-utilization-styles.js\n/* eslint-disable camelcase */\n\n\n// Donut utilization styles\nconst DonutUtilizationStyles = {\n thresholds: {\n colorScale: [esm_chart_donut_threshold_warning_Color.value, esm_chart_donut_threshold_danger_Color.value]\n }\n};\n//# sourceMappingURL=donut-utilization-styles.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/global_FontWeight_bold.js\nconst global_FontWeight_bold = {\n "name": "--pf-global--FontWeight--bold",\n "value": "600",\n "var": "var(--pf-global--FontWeight--bold)"\n};\n/* harmony default export */ const esm_global_FontWeight_bold = (global_FontWeight_bold);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/styles/legend-tooltip-styles.js\n/* eslint-disable camelcase */\n\n\n// Legend tooltip styles\nconst LegendTooltipStyles = {\n flyout: {\n padding: 40\n },\n label: {\n fill: esm_chart_voronoi_labels_Fill.value,\n fontWeight: esm_global_FontWeight_bold.value\n }\n};\n//# sourceMappingURL=legend-tooltip-styles.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_scatter_active_size.js\nconst chart_scatter_active_size = {\n "name": "--pf-chart-scatter--active--size",\n "value": 5,\n "var": "var(--pf-chart-scatter--active--size)"\n};\n/* harmony default export */ const esm_chart_scatter_active_size = (chart_scatter_active_size);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-tokens/dist/esm/chart_scatter_size.js\nconst chart_scatter_size = {\n "name": "--pf-chart-scatter--size",\n "value": 3,\n "var": "var(--pf-chart-scatter--size)"\n};\n/* harmony default export */ const esm_chart_scatter_size = (chart_scatter_size);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/styles/scatter-styles.js\n/* eslint-disable camelcase */\n\n\n// Donut styles\nconst ScatterStyles = {\n activeSize: esm_chart_scatter_active_size.value,\n size: esm_chart_scatter_size.value\n};\n//# sourceMappingURL=scatter-styles.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/ChartStyles.js\n\n\n\n\n\n\nconst ChartCommonStyles = CommonStyles;\nconst ChartBulletStyles = BulletStyles;\nconst ChartDonutStyles = DonutStyles;\nconst ChartDonutUtilizationStyles = DonutUtilizationStyles;\nconst ChartLegendTooltipStyles = LegendTooltipStyles;\nconst ChartScatterStyles = ScatterStyles;\n//# sourceMappingURL=ChartStyles.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartLabel/ChartLabel.js\n\n\n\n\n\n\nvar ChartLabelDirection;\n(function (ChartLabelDirection) {\n ChartLabelDirection["rtl"] = "rtl";\n ChartLabelDirection["ltr"] = "ltr";\n ChartLabelDirection["inherit"] = "inherit";\n})(ChartLabelDirection || (ChartLabelDirection = {}));\nvar ChartLabelPlacement;\n(function (ChartLabelPlacement) {\n ChartLabelPlacement["parallel"] = "parallel";\n ChartLabelPlacement["perpendicular"] = "perpendicular";\n ChartLabelPlacement["vertical"] = "vertical";\n})(ChartLabelPlacement || (ChartLabelPlacement = {}));\nconst ChartLabel = (_a) => {\n var { style, textAnchor } = _a, rest = (0,tslib_es6.__rest)(_a, ["style", "textAnchor"]);\n const applyDefaultStyle = (customStyle) => defaults_default()(Object.assign(Object.assign({}, customStyle), { textAnchor // textAnchor prop must override given theme styles\n }), {\n fontFamily: ChartCommonStyles.label.fontFamily,\n fontSize: ChartCommonStyles.label.fontSize,\n letterSpacing: ChartCommonStyles.label.letterSpacing\n });\n const newStyle = Array.isArray(style) ? style.map(applyDefaultStyle) : applyDefaultStyle(style);\n return react.createElement(victory_label, Object.assign({ style: newStyle, textAnchor: textAnchor }, rest));\n};\nChartLabel.displayName = \'ChartLabel\';\n// Note: VictoryLabel.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartLabel, victory_label);\n//# sourceMappingURL=ChartLabel.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartPoint/path-helpers.js\nconst PathHelpers = {\n circle: (x, y, size) => `M ${x}, ${y}\n m ${-size}, 0\n a ${size}, ${size} 0 1,0 ${size * 2},0\n a ${size}, ${size} 0 1,0 ${-size * 2},0`,\n dash: (x, y, size) => {\n const baseSize = 1.1 * size;\n const lineHeight = baseSize - baseSize * 0.3;\n const x0 = x - baseSize;\n const y1 = y + lineHeight / 2;\n const distance = (x + baseSize - x0) * 0.3;\n const padding = distance / 3;\n return `M ${x0}, ${y1}\n h${distance}\n v-${lineHeight}\n h-${distance}\n z\n M ${x0 + distance + padding}, ${y1}\n h${distance}\n v-${lineHeight}\n h-${distance}\n z\n M ${x0 + distance * 2 + padding * 2}, ${y1}\n h${distance}\n v-${lineHeight}\n h-${distance}\n z`;\n },\n diamond: (x, y, size) => {\n const baseSize = 0.87 * size;\n const length = Math.sqrt(2 * (baseSize * baseSize));\n return `M ${x}, ${y + length}\n l ${length}, -${length}\n l -${length}, -${length}\n l -${length}, ${length}\n l ${length}, ${length}\n z`;\n },\n // The eye slash symbol is used to hide / show each data series individually\n // See https://github.com/patternfly/patternfly-next/issues/2352\n eyeSlash: (x, y, size) => {\n const baseSize = 0.87 * size;\n const x0 = x - baseSize;\n const y1 = y - size * 1.25;\n // For converting to relative paths, see https://aydos.com/svgedit/\n // Data taken from path of assets/Eyecon.svg, minus first two x and y values\n const data = \'.013 .013 0 0 2.179 2.219c.7-.204 1.418-.307 2.152-.307 2.859 0 5.464 1.551 7.814 4.654.243 .321.268 .753.073 1.097l-.073.111-.236.305c-.632.801-1.282 1.491-1.951 2.071l1.773 1.806c.382.389 .382 1.012 0 1.401l-.058.059c-.387.394-1.02.4-1.414.013l-.013-.013-11.732-11.956c-.382-.389-.382-1.012 0-1.401l.058-.059c.387-.394 1.02-.4 1.414-.013zm-.674 3.71 1.407 1.436c-.329.604-.516 1.298-.516 2.038 0 2.323 1.848 4.206 4.127 4.206.726 0 1.408-.191 2-.526l.966.984c-.956.396-1.945.593-2.966.593-2.859 0-5.464-1.551-7.814-4.654-.243-.321-.268-.753-.073-1.097l.073-.111.236-.305c.823-1.042 1.676-1.897 2.56-2.565zm2.177 2.22 4.072 4.149c-.377.167-.793.259-1.23.259-1.71 0-3.096-1.412-3.096-3.155 0-.445.091-.869.254-1.253zm2.842-2.953c-.43 0-.845.067-1.234.191l.865.882c.121-.015.244-.022.369-.022 1.71 0 3.096 1.412 3.096 3.155 0 .127-.007.252-.022.375l.866.882c.122-.397.187-.819.187-1.257 0-2.323-1.848-4.206-4.127-4.206z\';\n return `m${x0}, ${y1} ${data}`;\n },\n minus: (x, y, size) => {\n const baseSize = 1.1 * size;\n const lineHeight = baseSize - baseSize * 0.3;\n const x0 = x - baseSize;\n const y1 = y + lineHeight / 2;\n const distance = x + baseSize - x0;\n return `M ${x0}, ${y1}\n h${distance}\n v-${lineHeight}\n h-${distance}\n z`;\n },\n plus: (x, y, size) => {\n const baseSize = 1.1 * size;\n const distance = baseSize / 1.5;\n return `\n M ${x - distance / 2}, ${y + baseSize}\n v-${distance}\n h-${distance}\n v-${distance}\n h${distance}\n v-${distance}\n h${distance}\n v${distance}\n h${distance}\n v${distance}\n h-${distance}\n v${distance}\n z`;\n },\n star: (x, y, size) => {\n const baseSize = 1.35 * size;\n const angle = Math.PI / 5;\n const starCoords = [...Array(10).keys()].map(index => {\n const length = index % 2 === 0 ? baseSize : baseSize / 2;\n return `${length * Math.sin(angle * (index + 1)) + x},\n ${length * Math.cos(angle * (index + 1)) + y}`;\n });\n return `M ${starCoords.join(\'L\')} z`;\n },\n square: (x, y, size) => {\n const baseSize = 0.87 * size;\n const x0 = x - baseSize;\n const y1 = y + baseSize;\n const distance = x + baseSize - x0;\n return `M ${x0}, ${y1}\n h${distance}\n v-${distance}\n h-${distance}\n z`;\n },\n threshold: (x, y, size) => {\n const baseSize = 1.1 * size;\n const lineHeight = baseSize - baseSize * 0.3;\n const x0 = x - baseSize;\n const y1 = y + lineHeight / 2;\n const distance = (x + baseSize - x0) * 0.5;\n const padding = distance / 3;\n return `M ${x0}, ${y1}\n h${distance}\n v-${lineHeight}\n h-${distance}\n z\n M ${x0 + distance + padding}, ${y1}\n h${distance}\n v-${lineHeight}\n h-${distance}\n z`;\n },\n triangleDown: (x, y, size) => {\n const height = (size / 2) * Math.sqrt(3);\n const x0 = x - size;\n const x1 = x + size;\n const y0 = y - size;\n const y1 = y + height;\n return `M ${x0}, ${y0}\n L ${x1}, ${y0}\n L ${x}, ${y1}\n z`;\n },\n triangleLeft: (x, y, size) => {\n const height = (size / 2) * Math.sqrt(3);\n const x0 = x - height;\n const x1 = x + size;\n const y0 = y - size;\n const y1 = y + size;\n return `M ${x1}, ${y0}\n L ${x1}, ${y1}\n L ${x0}, ${y}\n z`;\n },\n triangleRight: (x, y, size) => {\n const height = (size / 2) * Math.sqrt(3);\n const x0 = x - size;\n const x1 = x + height;\n const y0 = y - size;\n const y1 = y + size;\n return `M ${x0}, ${y0}\n L ${x0}, ${y1}\n L ${x1}, ${y}\n z`;\n },\n triangleUp: (x, y, size) => {\n const height = (size / 2) * Math.sqrt(3);\n const x0 = x - size;\n const x1 = x + size;\n const y0 = y - height;\n const y1 = y + size;\n return `M ${x0}, ${y1}\n L ${x1}, ${y1}\n L ${x}, ${y0}\n z`;\n }\n};\n//# sourceMappingURL=path-helpers.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartPoint/ChartPoint.js\n\n\n\n\nconst ChartPoint_getPath = (props) => {\n const { x, y } = props;\n const size = evaluateProp(props.size, props);\n if (props.getPath) {\n return props.getPath(x, y, size);\n }\n const pathFunctions = {\n circle: PathHelpers.circle,\n square: PathHelpers.square,\n diamond: PathHelpers.diamond,\n eyeSlash: PathHelpers.eyeSlash,\n triangleDown: PathHelpers.triangleDown,\n triangleLeft: PathHelpers.triangleLeft,\n triangleRight: PathHelpers.triangleRight,\n triangleUp: PathHelpers.triangleUp,\n plus: PathHelpers.plus,\n minus: PathHelpers.minus,\n star: PathHelpers.star,\n dash: PathHelpers.dash,\n threshold: PathHelpers.threshold\n };\n const symbol = evaluateProp(props.symbol, props);\n const key = symbol;\n const symbolFunction = typeof pathFunctions[key] === \'function\' ? pathFunctions[key] : pathFunctions.square;\n return symbolFunction(x, y, size);\n};\nconst ChartPoint = (_a) => {\n var { active, className, clipPath, datum, desc, events, pathComponent = react.createElement(path, null), role = \'presentation\', shapeRendering = \'auto\', tabIndex, transform } = _a, rest = (0,tslib_es6.__rest)(_a, ["active", "className", "clipPath", "datum", "desc", "events", "pathComponent", "role", "shapeRendering", "tabIndex", "transform"]);\n const props = Object.assign({ active,\n className,\n clipPath,\n datum,\n desc,\n events,\n role,\n shapeRendering,\n tabIndex,\n transform }, rest);\n return react.cloneElement(pathComponent, Object.assign(Object.assign({ className,\n clipPath, d: ChartPoint_getPath(props), desc: evaluateProp(desc, props) }, events), { role,\n shapeRendering, style: evaluateStyle(rest.style, props), tabIndex: evaluateProp(tabIndex, props), transform }));\n};\nChartPoint.displayName = \'ChartPoint\';\n//# sourceMappingURL=ChartPoint.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartLegend/ChartLegend.js\n\n\n\n\n\n\n\n\nvar ChartLegendOrientation;\n(function (ChartLegendOrientation) {\n ChartLegendOrientation["horizontal"] = "horizontal";\n ChartLegendOrientation["vertical"] = "vertical";\n})(ChartLegendOrientation || (ChartLegendOrientation = {}));\nvar ChartLegendPosition;\n(function (ChartLegendPosition) {\n ChartLegendPosition["bottom"] = "bottom";\n ChartLegendPosition["bottomLeft"] = "bottom-left";\n ChartLegendPosition["right"] = "right";\n})(ChartLegendPosition || (ChartLegendPosition = {}));\nvar ChartLegendRowGutter;\n(function (ChartLegendRowGutter) {\n ChartLegendRowGutter["bottom"] = "bottom";\n ChartLegendRowGutter["top"] = "top";\n})(ChartLegendRowGutter || (ChartLegendRowGutter = {}));\nconst ChartLegend = (_a) => {\n var { containerComponent = react.createElement(ChartContainer, null), dataComponent = react.createElement(ChartPoint, null), labelComponent = react.createElement(ChartLabel, null), responsive = true, themeColor, themeVariant, titleComponent = react.createElement(ChartLabel, null), \n // destructure last\n theme = getTheme(themeColor, themeVariant) } = _a, rest = (0,tslib_es6.__rest)(_a, ["containerComponent", "dataComponent", "labelComponent", "responsive", "themeColor", "themeVariant", "titleComponent", "theme"]);\n // Clone so users can override container props\n const container = react.cloneElement(containerComponent, Object.assign({ responsive,\n theme }, containerComponent.props));\n // Note: containerComponent is required for theme\n return (react.createElement(victory_legend, Object.assign({ containerComponent: container, dataComponent: dataComponent, labelComponent: labelComponent, theme: theme, titleComponent: titleComponent }, rest)));\n};\nChartLegend.displayName = \'ChartLegend\';\n// Note: VictoryLegend.role must be hoisted, but getBaseProps causes error with ChartVoronoiContainer\nhoist_non_react_statics_cjs_default()(ChartLegend, victory_legend, { getBaseProps: true });\nChartLegend.getBaseProps = (props) => {\n const theme = getTheme(null, null);\n return victory_legend.getBaseProps(Object.assign({ titleComponent: react.createElement(ChartLabel, null) }, props), {\n height: theme.chart.height,\n orientation: theme.legend.orientation,\n titleOrientation: theme.legend.titleOrientation,\n x: 0,\n y: 0,\n width: theme.chart.width\n });\n};\n//# sourceMappingURL=ChartLegend.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartUtils/chart-padding.js\nconst getPaddingForSide = (side, padding, fallback) => {\n if (typeof padding == \'number\') {\n return padding;\n }\n else if (typeof padding == \'object\' && Object.keys(padding).length > 0) {\n return padding[side] || 0;\n }\n return getPaddingForSide(side, fallback, 0);\n};\n//# sourceMappingURL=chart-padding.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartUtils/chart-origin.js\n\n// Returns the origin for pie based charts. For example, something with a radius such as pie, donut, donut utilization,\n// and donut threshold.\nconst getPieOrigin = ({ height, padding, width }) => {\n const { top, bottom, left, right } = helpers_getPadding({ padding });\n const radius = getRadius({ height, width, padding });\n const offsetX = (width - radius * 2 - left - right) / 2;\n const offsetY = (height - radius * 2 - top - bottom) / 2;\n return {\n x: radius + left + offsetX,\n y: radius + top + offsetY\n };\n};\n//# sourceMappingURL=chart-origin.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartUtils/chart-label.js\n\n\n\n// Returns x coordinate for bullet labels\nconst getBulletLabelX = ({ chartWidth, dx = 0, labelPosition }) => labelPosition === \'top\' && chartWidth ? Math.round(chartWidth / 2) : dx;\n// Returns y coordinate for bullet labels\nconst getBulletLabelY = ({ chartHeight, dy = 0, labelPosition }) => {\n switch (labelPosition) {\n case \'bottom\':\n return chartHeight + ChartCommonStyles.label.margin + dy;\n case \'left\':\n return chartHeight ? Math.round(chartHeight / 2) + dy : dy;\n default:\n return dy;\n }\n};\n// Returns x coordinate for pie labels\nconst getPieLabelX = ({ dx = 0, height, labelPosition, legendPosition, padding, width }) => {\n const origin = getPieOrigin({ height, padding, width });\n const radius = getRadius({ height, width, padding });\n switch (labelPosition) {\n case \'bottom\':\n case \'center\':\n return origin.x + dx;\n case \'right\':\n switch (legendPosition) {\n case \'bottom\':\n return origin.x + ChartCommonStyles.label.margin + dx + radius;\n case \'right\':\n return origin.x + ChartCommonStyles.label.margin + dx;\n default:\n return dx;\n }\n default:\n return dx;\n }\n};\n// Returns x coordinate for pie labels\nconst getPieLabelY = ({ dy = 0, height, labelPosition, padding, width }) => {\n const origin = getPieOrigin({ height, padding, width });\n const radius = getRadius({ height, width, padding });\n switch (labelPosition) {\n case \'center\':\n case \'right\':\n return origin.y + dy;\n case \'bottom\':\n return origin.y + radius + ChartCommonStyles.label.margin * 2 + dy;\n default:\n return dy;\n }\n};\n// Returns an approximate size for the give text\nconst getLabelTextSize = ({ text, theme }) => {\n const style = theme.legend.style.labels;\n // The approximateTextSize function returns height and width, but Victory incorrectly typed it as number\n return approximateTextSize(text, Object.assign({}, style));\n};\n//# sourceMappingURL=chart-label.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartUtils/chart-legend.js\n\n\n\n\n\n\n\n// Returns a legend which has been positioned per the given chart properties\nconst getComputedLegend = ({ allowWrap = true, chartType = \'chart\', dx = 0, dy = 0, height, legendComponent, padding, position = ChartCommonStyles.legend.position, theme, width, \n// destructure last\norientation = theme.legend.orientation }) => {\n // Get the number of legend items per row\n const legendItemsProps = legendComponent.props ? legendComponent.props : {};\n const legendItemsPerRow = allowWrap\n ? getLegendItemsPerRow({\n chartType,\n dx,\n height,\n legendData: legendItemsProps.data,\n legendOrientation: legendItemsProps.legendOrientation ? legendItemsProps.legendOrientation : orientation,\n legendPosition: position,\n legendProps: legendItemsProps,\n padding,\n theme,\n width\n })\n : undefined;\n // Include new itemsPerRow prop when determining x and y position\n const legendPositionProps = defaults_default()({}, legendComponent.props, {\n itemsPerRow: legendItemsPerRow\n });\n const legendX = getLegendX({\n chartType,\n dx,\n height,\n legendData: legendPositionProps.data,\n legendOrientation: legendPositionProps.legendOrientation ? legendPositionProps.legendOrientation : orientation,\n legendPosition: position,\n legendProps: legendPositionProps,\n padding,\n theme,\n width\n });\n const legendY = getLegendY({\n chartType,\n dy,\n height,\n legendData: legendPositionProps.data,\n legendOrientation: legendPositionProps.legendOrientation ? legendPositionProps.legendOrientation : orientation,\n legendProps: legendPositionProps,\n legendPosition: position,\n padding,\n theme,\n width\n });\n // Clone legend with updated props\n const legendProps = defaults_default()({}, legendComponent.props, {\n itemsPerRow: legendItemsPerRow,\n orientation,\n standalone: false,\n theme,\n x: legendX > 0 ? legendX : 0,\n y: legendY > 0 ? legendY : 0\n });\n return react.cloneElement(legendComponent, legendProps);\n};\n// Returns legend dimensions\nconst getLegendDimensions = ({ legendData, legendOrientation, legendProps, theme }) => {\n if (legendData || legendProps.data) {\n return victory_legend.getDimensions(Object.assign({ data: legendData, orientation: legendOrientation, theme }, legendProps // override above\n ));\n }\n return {};\n};\n// Returns true if the legend is smaller than its container\nconst doesLegendFit = ({ dx = 0, height, legendPosition, legendData, legendOrientation, legendProps, padding, theme, width }) => {\n const { left, right } = helpers_getPadding({ padding });\n const chartSize = {\n height,\n width: width - left - right\n };\n const legendDimensions = getLegendDimensions({\n legendData,\n legendOrientation,\n legendProps,\n theme\n });\n let occupiedWidth = 0;\n switch (legendPosition) {\n case \'bottom-left\':\n occupiedWidth = left + dx;\n break;\n case \'right\':\n occupiedWidth = chartSize.width + ChartCommonStyles.legend.margin + left + dx;\n break;\n default:\n occupiedWidth = dx;\n break;\n }\n return width - occupiedWidth > legendDimensions.width;\n};\n// Returns the number of legend items per row\nconst getLegendItemsPerRow = ({ dx, height, legendPosition, legendData, legendOrientation, legendProps, padding, theme, width }) => {\n let itemsPerRow = legendData ? legendData.length : 0;\n for (let i = itemsPerRow; i > 0; i--) {\n const fits = doesLegendFit({\n dx,\n height,\n legendPosition,\n legendData,\n legendOrientation,\n legendProps: Object.assign(Object.assign({}, legendProps), { itemsPerRow: i }),\n padding,\n theme,\n width\n });\n if (fits) {\n itemsPerRow = i;\n break;\n }\n }\n return itemsPerRow;\n};\n// Returns x coordinate for legend\nconst getLegendX = (_a) => {\n var { chartType } = _a, rest = (0,tslib_es6.__rest)(_a, ["chartType"]);\n return chartType === \'pie\' ? getPieLegendX(rest) : getChartLegendX(rest);\n};\n// Returns y coordinate for legend\nconst getLegendY = (_a) => {\n var { chartType } = _a, rest = (0,tslib_es6.__rest)(_a, ["chartType"]);\n switch (chartType) {\n case \'pie\':\n return getPieLegendY(rest);\n case \'bullet\':\n return getBulletLegendY(rest);\n default:\n return getChartLegendY(rest);\n }\n};\n// Returns y coordinate for bullet legends\nconst getBulletLegendY = ({ dy = 0, height, legendPosition, legendData, legendOrientation, legendProps, padding, theme, width }) => {\n const { left, right } = helpers_getPadding({ padding });\n const chartSize = {\n height,\n width: width - left - right\n };\n switch (legendPosition) {\n case \'bottom\':\n case \'bottom-left\':\n return chartSize.height + ChartCommonStyles.legend.margin + dy;\n case \'right\': {\n // Legend height with padding\n const legendDimensions = getLegendDimensions({\n legendData,\n legendOrientation,\n legendProps,\n theme\n });\n const legendPadding = (legendDataArr) => (legendDataArr && legendDataArr.length > 0 ? 17 : 0);\n return (chartSize.height - legendDimensions.height) / 2 + legendPadding(legendData);\n }\n default:\n return dy;\n }\n};\n// Returns x coordinate for chart legends\nconst getChartLegendX = ({ dx = 0, height, legendData, legendOrientation, legendPosition, legendProps, padding, theme, width }) => {\n const { top, bottom, left, right } = helpers_getPadding({ padding });\n const chartSize = {\n height: Math.abs(height - (bottom + top)),\n width: Math.abs(width - (left + right))\n };\n const legendDimensions = getLegendDimensions({\n legendData,\n legendOrientation,\n legendProps,\n theme\n });\n switch (legendPosition) {\n case \'bottom\':\n return width > legendDimensions.width ? Math.round((width - legendDimensions.width) / 2) + dx : dx;\n case \'bottom-left\':\n return left + dx;\n case \'right\':\n return chartSize.width + ChartCommonStyles.legend.margin + left + dx;\n default:\n return dx;\n }\n};\n// Returns y coordinate for chart legends\nconst getChartLegendY = ({ dy = 0, height, legendPosition, legendData, legendOrientation, legendProps, padding, theme, width }) => {\n const { top, bottom, left, right } = helpers_getPadding({ padding });\n const chartSize = {\n height: Math.abs(height - (bottom + top)),\n width: Math.abs(width - (left + right))\n };\n switch (legendPosition) {\n case \'bottom\':\n case \'bottom-left\':\n return chartSize.height + ChartCommonStyles.legend.margin * 2 + top + dy;\n case \'right\': {\n // Legend height with padding\n const legendDimensions = getLegendDimensions({\n legendData,\n legendOrientation,\n legendProps,\n theme\n });\n const originX = chartSize.height / 2 + top;\n const legendPadding = (legendDataArr) => (legendDataArr && legendDataArr.length > 0 ? 2 : 0);\n return originX - legendDimensions.height / 2 + legendPadding(legendData);\n }\n default:\n return dy;\n }\n};\n// Returns x coordinate for pie legends\nconst getPieLegendX = ({ dx = 0, height, legendData, legendOrientation, legendPosition, legendProps, padding, theme, width }) => {\n const origin = getPieOrigin({ height, padding, width });\n const radius = getRadius({ height, width, padding });\n const legendDimensions = getLegendDimensions({\n legendData,\n legendOrientation,\n legendProps,\n theme\n });\n switch (legendPosition) {\n case \'bottom\':\n return width > legendDimensions.width ? Math.round((width - legendDimensions.width) / 2) + dx : dx;\n case \'right\':\n return origin.x + ChartCommonStyles.label.margin + dx + radius;\n default:\n return dx;\n }\n};\n// Returns y coordinate for pie legends\nconst getPieLegendY = ({ dy = 0, height, legendPosition, legendData, legendOrientation, legendProps, padding, theme, width }) => {\n const origin = getPieOrigin({ height, padding, width });\n const radius = getRadius({ height, width, padding });\n switch (legendPosition) {\n case \'bottom\':\n return origin.y + ChartCommonStyles.legend.margin + radius + dy;\n case \'right\': {\n // Legend height with padding\n const legendDimensions = getLegendDimensions({\n legendData,\n legendOrientation,\n legendProps,\n theme\n });\n const legendPadding = (legendDataArr) => (legendDataArr && legendDataArr.length > 0 ? 2 : 0);\n return origin.y - legendDimensions.height / 2 + legendPadding(legendData);\n }\n default:\n return dy;\n }\n};\n// Returns an approximation of longest text width based on legend styles\nconst getMaxLegendTextSize = ({ legendData, theme }) => {\n const style = theme && theme.legend && theme.legend.style ? theme.legend.style.labels : undefined;\n if (!(legendData && legendData.length)) {\n return 0;\n }\n let result = \'\';\n legendData.forEach(data => {\n if (data.name && data.name.length > result.length) {\n result = data.name;\n }\n });\n // The approximateTextSize function returns height and width, but Victory incorrectly typed it as number\n const adjustedTextSize = approximateTextSize(result, Object.assign({}, style));\n return adjustedTextSize.width;\n};\n//# sourceMappingURL=chart-legend.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/Chart/Chart.js\n\n\n\n/* eslint-disable camelcase */\n\n\n\n\n\n\nconst Chart = (_a) => {\n var { ariaDesc, ariaTitle, children, legendAllowWrap = false, legendComponent = react.createElement(ChartLegend, null), legendData, legendPosition = ChartCommonStyles.legend.position, padding, showAxis = true, themeColor, themeVariant, \n // destructure last\n theme = getChartTheme(themeColor, themeVariant, showAxis), containerComponent = react.createElement(ChartContainer, null), legendOrientation = theme.legend.orientation, height = theme.chart.height, width = theme.chart.width } = _a, rest = (0,tslib_es6.__rest)(_a, ["ariaDesc", "ariaTitle", "children", "legendAllowWrap", "legendComponent", "legendData", "legendPosition", "padding", "showAxis", "themeColor", "themeVariant", "theme", "containerComponent", "legendOrientation", "height", "width"]);\n const defaultPadding = {\n bottom: getPaddingForSide(\'bottom\', padding, theme.chart.padding),\n left: getPaddingForSide(\'left\', padding, theme.chart.padding),\n right: getPaddingForSide(\'right\', padding, theme.chart.padding),\n top: getPaddingForSide(\'top\', padding, theme.chart.padding)\n };\n // Clone so users can override container props\n const container = react.cloneElement(containerComponent, Object.assign(Object.assign({ desc: ariaDesc, title: ariaTitle, theme }, containerComponent.props), { className: getClassName({ className: containerComponent.props.className }) // Override VictoryContainer class name\n }));\n const legend = react.cloneElement(legendComponent, Object.assign({ data: legendData, orientation: legendOrientation, theme }, legendComponent.props));\n // Returns a computed legend\n const getLegend = () => {\n if (!legend.props.data) {\n return null;\n }\n let dx = 0;\n let dy = 0;\n let xAxisLabelHeight = 0;\n let legendTitleHeight = legend.props.title ? 10 : 0;\n // Adjust for axis label\n react.Children.toArray(children).map((child) => {\n if (child.type.role === \'axis\' && child.props.label && !child.props.dependentAxis) {\n xAxisLabelHeight = getLabelTextSize({ text: child.props.label, theme }).height + 10;\n legendTitleHeight = 0;\n }\n });\n if (legendPosition === ChartLegendPosition.bottom) {\n dy += xAxisLabelHeight + legendTitleHeight;\n }\n else if (legendPosition === ChartLegendPosition.bottomLeft) {\n dy += xAxisLabelHeight + legendTitleHeight;\n dx = -10;\n }\n // Adjust legend position when axis is hidden\n if (!showAxis) {\n dy -= esm_chart_legend_Margin.value;\n }\n return getComputedLegend({\n allowWrap: legendAllowWrap,\n chartType: \'chart\',\n dx,\n dy,\n height,\n legendComponent: legend,\n padding: defaultPadding,\n position: legendPosition,\n theme,\n width\n });\n };\n // Note: containerComponent is required for theme\n return (react.createElement(victory_chart, Object.assign({ containerComponent: container, height: height, padding: defaultPadding, theme: theme, width: width }, rest),\n children,\n getLegend()));\n};\nChart.displayName = \'Chart\';\nhoist_non_react_statics_cjs_default()(Chart, victory_chart);\n//# sourceMappingURL=Chart.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/Chart/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/victory-area/es/helper-methods.js\n\n\n\nvar getDataWithBaseline = function (props, scale) {\n var data = data_getData(props);\n\n if (data.length < 2) {\n data = [];\n }\n\n var getDefaultMin = function (axis) {\n var defaultZero = getType(scale[axis]) === "log" ? 1 / Number.MAX_SAFE_INTEGER : 0;\n var domain = scale[axis].domain();\n var minY = getMinValue(domain);\n var maxY = getMaxValue(domain);\n var defaultMin = defaultZero;\n\n if (minY < 0 && maxY <= 0) {\n defaultMin = maxY;\n } else if (minY >= 0 && maxY > 0) {\n defaultMin = minY;\n }\n\n return containsDates(domain) ? new Date(defaultMin) : defaultMin;\n };\n\n return data.map(function (datum) {\n var _y1 = datum._y1 !== undefined ? datum._y1 : datum._y;\n\n var _y0 = datum._y0 !== undefined ? datum._y0 : getDefaultMin("y");\n\n var _x1 = datum._x1 !== undefined ? datum._x1 : datum._x;\n\n var _x0 = datum._x0 !== undefined ? datum._x0 : getDefaultMin("x");\n\n return assign_default()({}, datum, {\n _y0: _y0,\n _y1: _y1,\n _x0: _x0,\n _x1: _x1\n });\n });\n};\n\nvar victory_area_es_helper_methods_getCalculatedValues = function (props) {\n var polar = props.polar;\n var defaultStyles = getDefaultStyles(props, "area");\n var style = getStyles(props.style, defaultStyles);\n var range = {\n x: getRange(props, "x"),\n y: getRange(props, "y")\n };\n var domain = {\n x: getDomainWithZero(props, "x"),\n y: getDomainWithZero(props, "y")\n };\n var scale = {\n x: getBaseScale(props, "x").domain(domain.x).range(props.horizontal ? range.y : range.x),\n y: getBaseScale(props, "y").domain(domain.y).range(props.horizontal ? range.x : range.y)\n };\n var origin = polar ? props.origin || getPolarOrigin(props) : undefined;\n var data = getDataWithBaseline(props, scale);\n return {\n style: style,\n data: data,\n scale: scale,\n domain: domain,\n origin: origin\n };\n};\n\nvar victory_area_es_helper_methods_getBaseProps = function (props, fallbackProps) {\n var modifiedProps = modifyProps(props, fallbackProps, "area");\n props = assign_default()({}, modifiedProps, victory_area_es_helper_methods_getCalculatedValues(modifiedProps));\n var _props = props,\n data = _props.data,\n domain = _props.domain,\n events = _props.events,\n groupComponent = _props.groupComponent,\n height = _props.height,\n horizontal = _props.horizontal,\n interpolation = _props.interpolation,\n origin = _props.origin,\n padding = _props.padding,\n polar = _props.polar,\n scale = _props.scale,\n sharedEvents = _props.sharedEvents,\n standalone = _props.standalone,\n style = _props.style,\n theme = _props.theme,\n width = _props.width,\n labels = _props.labels,\n name = _props.name,\n disableInlineStyles = _props.disableInlineStyles;\n var initialChildProps = {\n parent: {\n style: style.parent,\n width: width,\n height: height,\n scale: scale,\n data: data,\n domain: domain,\n standalone: standalone,\n theme: theme,\n polar: polar,\n origin: origin,\n padding: padding,\n name: name,\n horizontal: horizontal\n },\n all: {\n data: {\n horizontal: horizontal,\n polar: polar,\n origin: origin,\n scale: scale,\n data: data,\n interpolation: interpolation,\n groupComponent: groupComponent,\n style: disableInlineStyles ? {} : style.data,\n disableInlineStyles: disableInlineStyles\n }\n }\n };\n return data.reduce(function (childProps, datum, index) {\n var text = getText(props, datum, index);\n\n if (text !== undefined && text !== null || labels && (events || sharedEvents)) {\n var eventKey = !isNil_default()(datum.eventKey) ? datum.eventKey : index;\n childProps[eventKey] = {\n labels: getProps(props, index)\n };\n }\n\n return childProps;\n }, initialChildProps);\n};\n;// CONCATENATED MODULE: ./node_modules/d3-path/src/path.js\nvar path_pi = Math.PI,\n path_tau = 2 * path_pi,\n epsilon = 1e-6,\n tauEpsilon = path_tau - epsilon;\n\nfunction path_Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = "";\n}\n\nfunction path_path() {\n return new path_Path;\n}\n\npath_Path.prototype = path_path.prototype = {\n constructor: path_Path,\n moveTo: function(x, y) {\n this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += "Z";\n }\n },\n lineTo: function(x, y) {\n this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error("negative radius: " + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((path_pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);\n }\n\n this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error("negative radius: " + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += "M" + x0 + "," + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += "L" + x0 + "," + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % path_tau + path_tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += "A" + r + "," + r + ",0," + (+(da >= path_pi)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function(x, y, w, h) {\n this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";\n },\n toString: function() {\n return this._;\n }\n};\n\n/* harmony default export */ const src_path = (path_path);\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/constant.js\n/* harmony default export */ function d3_shape_src_constant(x) {\n return function constant() {\n return x;\n };\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/math.js\nvar abs = Math.abs;\nvar atan2 = Math.atan2;\nvar cos = Math.cos;\nvar max = Math.max;\nvar min = Math.min;\nvar sin = Math.sin;\nvar math_sqrt = Math.sqrt;\n\nvar math_epsilon = 1e-12;\nvar math_pi = Math.PI;\nvar math_halfPi = math_pi / 2;\nvar math_tau = 2 * math_pi;\n\nfunction acos(x) {\n return x > 1 ? 0 : x < -1 ? math_pi : Math.acos(x);\n}\n\nfunction asin(x) {\n return x >= 1 ? math_halfPi : x <= -1 ? -math_halfPi : Math.asin(x);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/arc.js\n\n\n\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < math_epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / math_sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * math_sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\n/* harmony default export */ function src_arc() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = d3_shape_src_constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null;\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - math_halfPi,\n a1 = endAngle.apply(this, arguments) - math_halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = src_path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > math_epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > math_tau - math_epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > math_epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > math_epsilon) && (padRadius ? +padRadius.apply(this, arguments) : math_sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > math_epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > math_epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > math_epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > math_epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle.\n if (da < math_pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (math_sqrt(ax * ax + ay * ay) * math_sqrt(bx * bx + by * by))) / 2),\n lc = math_sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > math_epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > math_epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > math_epsilon) || !(da0 > math_epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > math_epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + "" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - math_pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === "function" ? _ : d3_shape_src_constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === "function" ? _ : d3_shape_src_constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : d3_shape_src_constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : d3_shape_src_constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === "function" ? _ : d3_shape_src_constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === "function" ? _ : d3_shape_src_constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === "function" ? _ : d3_shape_src_constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/linear.js\nfunction Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\n/* harmony default export */ function curve_linear(context) {\n return new Linear(context);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/point.js\nfunction point_x(p) {\n return p[0];\n}\n\nfunction point_y(p) {\n return p[1];\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/line.js\n\n\n\n\n\n/* harmony default export */ function src_line() {\n var x = point_x,\n y = point_y,\n defined = d3_shape_src_constant(true),\n context = null,\n curve = curve_linear,\n output = null;\n\n function line(data) {\n var i,\n n = data.length,\n d,\n defined0 = false,\n buffer;\n\n if (context == null) output = curve(buffer = src_path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) output.lineStart();\n else output.lineEnd();\n }\n if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n }\n\n if (buffer) return output = null, buffer + "" || null;\n }\n\n line.x = function(_) {\n return arguments.length ? (x = typeof _ === "function" ? _ : d3_shape_src_constant(+_), line) : x;\n };\n\n line.y = function(_) {\n return arguments.length ? (y = typeof _ === "function" ? _ : d3_shape_src_constant(+_), line) : y;\n };\n\n line.defined = function(_) {\n return arguments.length ? (defined = typeof _ === "function" ? _ : d3_shape_src_constant(!!_), line) : defined;\n };\n\n line.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n };\n\n line.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n };\n\n return line;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/area.js\n\n\n\n\n\n\n/* harmony default export */ function src_area() {\n var x0 = point_x,\n x1 = null,\n y0 = d3_shape_src_constant(0),\n y1 = point_y,\n defined = d3_shape_src_constant(true),\n context = null,\n curve = curve_linear,\n output = null;\n\n function area(data) {\n var i,\n j,\n k,\n n = data.length,\n d,\n defined0 = false,\n buffer,\n x0z = new Array(n),\n y0z = new Array(n);\n\n if (context == null) output = curve(buffer = src_path());\n\n for (i = 0; i <= n; ++i) {\n if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n if (defined0 = !defined0) {\n j = i;\n output.areaStart();\n output.lineStart();\n } else {\n output.lineEnd();\n output.lineStart();\n for (k = i - 1; k >= j; --k) {\n output.point(x0z[k], y0z[k]);\n }\n output.lineEnd();\n output.areaEnd();\n }\n }\n if (defined0) {\n x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n }\n }\n\n if (buffer) return output = null, buffer + "" || null;\n }\n\n function arealine() {\n return src_line().defined(defined).curve(curve).context(context);\n }\n\n area.x = function(_) {\n return arguments.length ? (x0 = typeof _ === "function" ? _ : d3_shape_src_constant(+_), x1 = null, area) : x0;\n };\n\n area.x0 = function(_) {\n return arguments.length ? (x0 = typeof _ === "function" ? _ : d3_shape_src_constant(+_), area) : x0;\n };\n\n area.x1 = function(_) {\n return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : d3_shape_src_constant(+_), area) : x1;\n };\n\n area.y = function(_) {\n return arguments.length ? (y0 = typeof _ === "function" ? _ : d3_shape_src_constant(+_), y1 = null, area) : y0;\n };\n\n area.y0 = function(_) {\n return arguments.length ? (y0 = typeof _ === "function" ? _ : d3_shape_src_constant(+_), area) : y0;\n };\n\n area.y1 = function(_) {\n return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : d3_shape_src_constant(+_), area) : y1;\n };\n\n area.lineX0 =\n area.lineY0 = function() {\n return arealine().x(x0).y(y0);\n };\n\n area.lineY1 = function() {\n return arealine().x(x0).y(y1);\n };\n\n area.lineX1 = function() {\n return arealine().x(x1).y(y0);\n };\n\n area.defined = function(_) {\n return arguments.length ? (defined = typeof _ === "function" ? _ : d3_shape_src_constant(!!_), area) : defined;\n };\n\n area.curve = function(_) {\n return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n };\n\n area.context = function(_) {\n return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n };\n\n return area;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/descending.js\n/* harmony default export */ function descending(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/identity.js\n/* harmony default export */ function d3_shape_src_identity(d) {\n return d;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/pie.js\n\n\n\n\n\n/* harmony default export */ function pie() {\n var value = d3_shape_src_identity,\n sortValues = descending,\n sort = null,\n startAngle = d3_shape_src_constant(0),\n endAngle = d3_shape_src_constant(math_tau),\n padAngle = d3_shape_src_constant(0);\n\n function pie(data) {\n var i,\n n = data.length,\n j,\n k,\n sum = 0,\n index = new Array(n),\n arcs = new Array(n),\n a0 = +startAngle.apply(this, arguments),\n da = Math.min(math_tau, Math.max(-math_tau, endAngle.apply(this, arguments) - a0)),\n a1,\n p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\n pa = p * (da < 0 ? -1 : 1),\n v;\n\n for (i = 0; i < n; ++i) {\n if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\n sum += v;\n }\n }\n\n // Optionally sort the arcs by previously-computed values or by data.\n if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });\n else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });\n\n // Compute the arcs! They are stored in the original data\'s order.\n for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\n j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\n data: data[j],\n index: i,\n value: v,\n startAngle: a0,\n endAngle: a1,\n padAngle: p\n };\n }\n\n return arcs;\n }\n\n pie.value = function(_) {\n return arguments.length ? (value = typeof _ === "function" ? _ : d3_shape_src_constant(+_), pie) : value;\n };\n\n pie.sortValues = function(_) {\n return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\n };\n\n pie.sort = function(_) {\n return arguments.length ? (sort = _, sortValues = null, pie) : sort;\n };\n\n pie.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === "function" ? _ : d3_shape_src_constant(+_), pie) : startAngle;\n };\n\n pie.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === "function" ? _ : d3_shape_src_constant(+_), pie) : endAngle;\n };\n\n pie.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === "function" ? _ : d3_shape_src_constant(+_), pie) : padAngle;\n };\n\n return pie;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/radial.js\n\n\nvar curveRadialLinear = curveRadial(curve_linear);\n\nfunction Radial(curve) {\n this._curve = curve;\n}\n\nRadial.prototype = {\n areaStart: function() {\n this._curve.areaStart();\n },\n areaEnd: function() {\n this._curve.areaEnd();\n },\n lineStart: function() {\n this._curve.lineStart();\n },\n lineEnd: function() {\n this._curve.lineEnd();\n },\n point: function(a, r) {\n this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n }\n};\n\nfunction curveRadial(curve) {\n\n function radial(context) {\n return new Radial(curve(context));\n }\n\n radial._curve = curve;\n\n return radial;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/lineRadial.js\n\n\n\nfunction lineRadial(l) {\n var c = l.curve;\n\n l.angle = l.x, delete l.x;\n l.radius = l.y, delete l.y;\n\n l.curve = function(_) {\n return arguments.length ? c(curveRadial(_)) : c()._curve;\n };\n\n return l;\n}\n\n/* harmony default export */ function src_lineRadial() {\n return lineRadial(src_line().curve(curveRadialLinear));\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/areaRadial.js\n\n\n\n\n/* harmony default export */ function areaRadial() {\n var a = src_area().curve(curveRadialLinear),\n c = a.curve,\n x0 = a.lineX0,\n x1 = a.lineX1,\n y0 = a.lineY0,\n y1 = a.lineY1;\n\n a.angle = a.x, delete a.x;\n a.startAngle = a.x0, delete a.x0;\n a.endAngle = a.x1, delete a.x1;\n a.radius = a.y, delete a.y;\n a.innerRadius = a.y0, delete a.y0;\n a.outerRadius = a.y1, delete a.y1;\n a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;\n a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;\n a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;\n a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;\n\n a.curve = function(_) {\n return arguments.length ? c(curveRadial(_)) : c()._curve;\n };\n\n return a;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/pointRadial.js\n/* harmony default export */ function pointRadial(x, y) {\n return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/array.js\nvar d3_shape_src_array_slice = Array.prototype.slice;\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/link/index.js\n\n\n\n\n\n\nfunction linkSource(d) {\n return d.source;\n}\n\nfunction linkTarget(d) {\n return d.target;\n}\n\nfunction link_link(curve) {\n var source = linkSource,\n target = linkTarget,\n x = point_x,\n y = point_y,\n context = null;\n\n function link() {\n var buffer, argv = d3_shape_src_array_slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);\n if (!context) context = buffer = src_path();\n curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));\n if (buffer) return context = null, buffer + "" || null;\n }\n\n link.source = function(_) {\n return arguments.length ? (source = _, link) : source;\n };\n\n link.target = function(_) {\n return arguments.length ? (target = _, link) : target;\n };\n\n link.x = function(_) {\n return arguments.length ? (x = typeof _ === "function" ? _ : d3_shape_src_constant(+_), link) : x;\n };\n\n link.y = function(_) {\n return arguments.length ? (y = typeof _ === "function" ? _ : d3_shape_src_constant(+_), link) : y;\n };\n\n link.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), link) : context;\n };\n\n return link;\n}\n\nfunction curveHorizontal(context, x0, y0, x1, y1) {\n context.moveTo(x0, y0);\n context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);\n}\n\nfunction curveVertical(context, x0, y0, x1, y1) {\n context.moveTo(x0, y0);\n context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);\n}\n\nfunction link_curveRadial(context, x0, y0, x1, y1) {\n var p0 = pointRadial(x0, y0),\n p1 = pointRadial(x0, y0 = (y0 + y1) / 2),\n p2 = pointRadial(x1, y0),\n p3 = pointRadial(x1, y1);\n context.moveTo(p0[0], p0[1]);\n context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);\n}\n\nfunction linkHorizontal() {\n return link_link(curveHorizontal);\n}\n\nfunction linkVertical() {\n return link_link(curveVertical);\n}\n\nfunction linkRadial() {\n var l = link_link(link_curveRadial);\n l.angle = l.x, delete l.x;\n l.radius = l.y, delete l.y;\n return l;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol/circle.js\n\n\n/* harmony default export */ const symbol_circle = ({\n draw: function(context, size) {\n var r = Math.sqrt(size / math_pi);\n context.moveTo(r, 0);\n context.arc(0, 0, r, 0, math_tau);\n }\n});\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol/cross.js\n/* harmony default export */ const cross = ({\n draw: function(context, size) {\n var r = Math.sqrt(size / 5) / 2;\n context.moveTo(-3 * r, -r);\n context.lineTo(-r, -r);\n context.lineTo(-r, -3 * r);\n context.lineTo(r, -3 * r);\n context.lineTo(r, -r);\n context.lineTo(3 * r, -r);\n context.lineTo(3 * r, r);\n context.lineTo(r, r);\n context.lineTo(r, 3 * r);\n context.lineTo(-r, 3 * r);\n context.lineTo(-r, r);\n context.lineTo(-3 * r, r);\n context.closePath();\n }\n});\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol/diamond.js\nvar tan30 = Math.sqrt(1 / 3),\n tan30_2 = tan30 * 2;\n\n/* harmony default export */ const diamond = ({\n draw: function(context, size) {\n var y = Math.sqrt(size / tan30_2),\n x = y * tan30;\n context.moveTo(0, -y);\n context.lineTo(x, 0);\n context.lineTo(0, y);\n context.lineTo(-x, 0);\n context.closePath();\n }\n});\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol/star.js\n\n\nvar ka = 0.89081309152928522810,\n kr = Math.sin(math_pi / 10) / Math.sin(7 * math_pi / 10),\n kx = Math.sin(math_tau / 10) * kr,\n ky = -Math.cos(math_tau / 10) * kr;\n\n/* harmony default export */ const star = ({\n draw: function(context, size) {\n var r = Math.sqrt(size * ka),\n x = kx * r,\n y = ky * r;\n context.moveTo(0, -r);\n context.lineTo(x, y);\n for (var i = 1; i < 5; ++i) {\n var a = math_tau * i / 5,\n c = Math.cos(a),\n s = Math.sin(a);\n context.lineTo(s * r, -c * r);\n context.lineTo(c * x - s * y, s * x + c * y);\n }\n context.closePath();\n }\n});\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol/square.js\n/* harmony default export */ const square = ({\n draw: function(context, size) {\n var w = Math.sqrt(size),\n x = -w / 2;\n context.rect(x, x, w, w);\n }\n});\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol/triangle.js\nvar sqrt3 = Math.sqrt(3);\n\n/* harmony default export */ const triangle = ({\n draw: function(context, size) {\n var y = -Math.sqrt(size / (sqrt3 * 3));\n context.moveTo(0, y * 2);\n context.lineTo(-sqrt3 * y, -y);\n context.lineTo(sqrt3 * y, -y);\n context.closePath();\n }\n});\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol/wye.js\nvar c = -0.5,\n s = Math.sqrt(3) / 2,\n k = 1 / Math.sqrt(12),\n a = (k / 2 + 1) * 3;\n\n/* harmony default export */ const wye = ({\n draw: function(context, size) {\n var r = Math.sqrt(size / a),\n x0 = r / 2,\n y0 = r * k,\n x1 = x0,\n y1 = r * k + r,\n x2 = -x1,\n y2 = y1;\n context.moveTo(x0, y0);\n context.lineTo(x1, y1);\n context.lineTo(x2, y2);\n context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n context.closePath();\n }\n});\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/symbol.js\n\n\n\n\n\n\n\n\n\n\nvar symbols = [\n symbol_circle,\n cross,\n diamond,\n square,\n star,\n triangle,\n wye\n];\n\n/* harmony default export */ function symbol() {\n var type = d3_shape_src_constant(symbol_circle),\n size = d3_shape_src_constant(64),\n context = null;\n\n function symbol() {\n var buffer;\n if (!context) context = buffer = src_path();\n type.apply(this, arguments).draw(context, +size.apply(this, arguments));\n if (buffer) return context = null, buffer + "" || null;\n }\n\n symbol.type = function(_) {\n return arguments.length ? (type = typeof _ === "function" ? _ : d3_shape_src_constant(_), symbol) : type;\n };\n\n symbol.size = function(_) {\n return arguments.length ? (size = typeof _ === "function" ? _ : d3_shape_src_constant(+_), symbol) : size;\n };\n\n symbol.context = function(_) {\n return arguments.length ? (context = _ == null ? null : _, symbol) : context;\n };\n\n return symbol;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/noop.js\n/* harmony default export */ function noop() {}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/basis.js\nfunction basis_point(that, x, y) {\n that._context.bezierCurveTo(\n (2 * that._x0 + that._x1) / 3,\n (2 * that._y0 + that._y1) / 3,\n (that._x0 + 2 * that._x1) / 3,\n (that._y0 + 2 * that._y1) / 3,\n (that._x0 + 4 * that._x1 + x) / 6,\n (that._y0 + 4 * that._y1 + y) / 6\n );\n}\n\nfunction Basis(context) {\n this._context = context;\n}\n\nBasis.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 3: basis_point(this, this._x1, this._y1); // proceed\n case 2: this._context.lineTo(this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n default: basis_point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\n/* harmony default export */ function curve_basis(context) {\n return new Basis(context);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/basisClosed.js\n\n\n\nfunction BasisClosed(context) {\n this._context = context;\n}\n\nBasisClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x2, this._y2);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x2, this._y2);\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x2 = x, this._y2 = y; break;\n case 1: this._point = 2; this._x3 = x, this._y3 = y; break;\n case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;\n default: basis_point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\n/* harmony default export */ function curve_basisClosed(context) {\n return new BasisClosed(context);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/basisOpen.js\n\n\nfunction BasisOpen(context) {\n this._context = context;\n}\n\nBasisOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;\n case 3: this._point = 4; // proceed\n default: basis_point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\n/* harmony default export */ function basisOpen(context) {\n return new BasisOpen(context);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/bundle.js\n\n\nfunction Bundle(context, beta) {\n this._basis = new Basis(context);\n this._beta = beta;\n}\n\nBundle.prototype = {\n lineStart: function() {\n this._x = [];\n this._y = [];\n this._basis.lineStart();\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n j = x.length - 1;\n\n if (j > 0) {\n var x0 = x[0],\n y0 = y[0],\n dx = x[j] - x0,\n dy = y[j] - y0,\n i = -1,\n t;\n\n while (++i <= j) {\n t = i / j;\n this._basis.point(\n this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n );\n }\n }\n\n this._x = this._y = null;\n this._basis.lineEnd();\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n/* harmony default export */ const bundle = ((function custom(beta) {\n\n function bundle(context) {\n return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n }\n\n bundle.beta = function(beta) {\n return custom(+beta);\n };\n\n return bundle;\n})(0.85));\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/cardinal.js\nfunction cardinal_point(that, x, y) {\n that._context.bezierCurveTo(\n that._x1 + that._k * (that._x2 - that._x0),\n that._y1 + that._k * (that._y2 - that._y0),\n that._x2 + that._k * (that._x1 - x),\n that._y2 + that._k * (that._y1 - y),\n that._x2,\n that._y2\n );\n}\n\nfunction Cardinal(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: cardinal_point(this, this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n case 2: this._point = 3; // proceed\n default: cardinal_point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\n/* harmony default export */ const cardinal = ((function custom(tension) {\n\n function cardinal(context) {\n return new Cardinal(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0));\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/cardinalClosed.js\n\n\n\nfunction CardinalClosed(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: cardinal_point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\n/* harmony default export */ const cardinalClosed = ((function custom(tension) {\n\n function cardinal(context) {\n return new CardinalClosed(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0));\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/cardinalOpen.js\n\n\nfunction CardinalOpen(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: cardinal_point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\n/* harmony default export */ const cardinalOpen = ((function custom(tension) {\n\n function cardinal(context) {\n return new CardinalOpen(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0));\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/catmullRom.js\n\n\n\nfunction catmullRom_point(that, x, y) {\n var x1 = that._x1,\n y1 = that._y1,\n x2 = that._x2,\n y2 = that._y2;\n\n if (that._l01_a > math_epsilon) {\n var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n }\n\n if (that._l23_a > math_epsilon) {\n var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n }\n\n that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: this.point(this._x2, this._y2); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; // proceed\n default: catmullRom_point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\n/* harmony default export */ const catmullRom = ((function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5));\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/catmullRomClosed.js\n\n\n\n\nfunction CatmullRomClosed(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: catmullRom_point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\n/* harmony default export */ const catmullRomClosed = ((function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5));\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/catmullRomOpen.js\n\n\n\nfunction CatmullRomOpen(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: catmullRom_point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\n/* harmony default export */ const catmullRomOpen = ((function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5));\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/linearClosed.js\n\n\nfunction LinearClosed(context) {\n this._context = context;\n}\n\nLinearClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._point) this._context.closePath();\n },\n point: function(x, y) {\n x = +x, y = +y;\n if (this._point) this._context.lineTo(x, y);\n else this._point = 1, this._context.moveTo(x, y);\n }\n};\n\n/* harmony default export */ function linearClosed(context) {\n return new LinearClosed(context);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/monotone.js\nfunction sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// "you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".\nfunction monotone_point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: monotone_point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; monotone_point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: monotone_point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nfunction monotoneX(context) {\n return new MonotoneX(context);\n}\n\nfunction monotoneY(context) {\n return new MonotoneY(context);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/natural.js\nfunction Natural(context) {\n this._context = context;\n}\n\nNatural.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = [];\n this._y = [];\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n n = x.length;\n\n if (n) {\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n if (n === 2) {\n this._context.lineTo(x[1], y[1]);\n } else {\n var px = controlPoints(x),\n py = controlPoints(y);\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n }\n }\n }\n\n if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n this._line = 1 - this._line;\n this._x = this._y = null;\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n var i,\n n = x.length - 1,\n m,\n a = new Array(n),\n b = new Array(n),\n r = new Array(n);\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n a[n - 1] = r[n - 1] / b[n - 1];\n for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n b[n - 1] = (x[n] + a[n - 1]) / 2;\n for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n return [a, b];\n}\n\n/* harmony default export */ function natural(context) {\n return new Natural(context);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/curve/step.js\nfunction Step(context, t) {\n this._context = context;\n this._t = t;\n}\n\nStep.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = this._y = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: {\n if (this._t <= 0) {\n this._context.lineTo(this._x, y);\n this._context.lineTo(x, y);\n } else {\n var x1 = this._x * (1 - this._t) + x * this._t;\n this._context.lineTo(x1, this._y);\n this._context.lineTo(x1, y);\n }\n break;\n }\n }\n this._x = x, this._y = y;\n }\n};\n\n/* harmony default export */ function step(context) {\n return new Step(context, 0.5);\n}\n\nfunction stepBefore(context) {\n return new Step(context, 0);\n}\n\nfunction stepAfter(context) {\n return new Step(context, 1);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/offset/none.js\n/* harmony default export */ function none(series, order) {\n if (!((n = series.length) > 1)) return;\n for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n s0 = s1, s1 = series[order[i]];\n for (j = 0; j < m; ++j) {\n s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n }\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/order/none.js\n/* harmony default export */ function order_none(series) {\n var n = series.length, o = new Array(n);\n while (--n >= 0) o[n] = n;\n return o;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/stack.js\n\n\n\n\n\nfunction stackValue(d, key) {\n return d[key];\n}\n\n/* harmony default export */ function stack() {\n var keys = d3_shape_src_constant([]),\n order = order_none,\n offset = none,\n value = stackValue;\n\n function stack(data) {\n var kz = keys.apply(this, arguments),\n i,\n m = data.length,\n n = kz.length,\n sz = new Array(n),\n oz;\n\n for (i = 0; i < n; ++i) {\n for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {\n si[j] = sij = [0, +value(data[j], ki, j, data)];\n sij.data = data[j];\n }\n si.key = ki;\n }\n\n for (i = 0, oz = order(sz); i < n; ++i) {\n sz[oz[i]].index = i;\n }\n\n offset(sz, oz);\n return sz;\n }\n\n stack.keys = function(_) {\n return arguments.length ? (keys = typeof _ === "function" ? _ : d3_shape_src_constant(d3_shape_src_array_slice.call(_)), stack) : keys;\n };\n\n stack.value = function(_) {\n return arguments.length ? (value = typeof _ === "function" ? _ : d3_shape_src_constant(+_), stack) : value;\n };\n\n stack.order = function(_) {\n return arguments.length ? (order = _ == null ? order_none : typeof _ === "function" ? _ : d3_shape_src_constant(d3_shape_src_array_slice.call(_)), stack) : order;\n };\n\n stack.offset = function(_) {\n return arguments.length ? (offset = _ == null ? none : _, stack) : offset;\n };\n\n return stack;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/offset/expand.js\n\n\n/* harmony default export */ function expand(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {\n for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;\n if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;\n }\n none(series, order);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/offset/diverging.js\n/* harmony default export */ function diverging(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {\n for (yp = yn = 0, i = 0; i < n; ++i) {\n if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) {\n d[0] = yp, d[1] = yp += dy;\n } else if (dy < 0) {\n d[1] = yn, d[0] = yn += dy;\n } else {\n d[0] = 0, d[1] = dy;\n }\n }\n }\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/offset/silhouette.js\n\n\n/* harmony default export */ function silhouette(series, order) {\n if (!((n = series.length) > 0)) return;\n for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {\n for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;\n s0[j][1] += s0[j][0] = -y / 2;\n }\n none(series, order);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/offset/wiggle.js\n\n\n/* harmony default export */ function wiggle(series, order) {\n if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;\n for (var y = 0, j = 1, s0, m, n; j < m; ++j) {\n for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {\n var si = series[order[i]],\n sij0 = si[j][1] || 0,\n sij1 = si[j - 1][1] || 0,\n s3 = (sij0 - sij1) / 2;\n for (var k = 0; k < i; ++k) {\n var sk = series[order[k]],\n skj0 = sk[j][1] || 0,\n skj1 = sk[j - 1][1] || 0;\n s3 += skj0 - skj1;\n }\n s1 += sij0, s2 += s3 * sij0;\n }\n s0[j - 1][1] += s0[j - 1][0] = y;\n if (s1) y -= s2 / s1;\n }\n s0[j - 1][1] += s0[j - 1][0] = y;\n none(series, order);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/order/appearance.js\n\n\n/* harmony default export */ function appearance(series) {\n var peaks = series.map(peak);\n return order_none(series).sort(function(a, b) { return peaks[a] - peaks[b]; });\n}\n\nfunction peak(series) {\n var i = -1, j = 0, n = series.length, vi, vj = -Infinity;\n while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i;\n return j;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/order/ascending.js\n\n\n/* harmony default export */ function order_ascending(series) {\n var sums = series.map(ascending_sum);\n return order_none(series).sort(function(a, b) { return sums[a] - sums[b]; });\n}\n\nfunction ascending_sum(series) {\n var s = 0, i = -1, n = series.length, v;\n while (++i < n) if (v = +series[i][1]) s += v;\n return s;\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/order/descending.js\n\n\n/* harmony default export */ function order_descending(series) {\n return order_ascending(series).reverse();\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/order/insideOut.js\n\n\n\n/* harmony default export */ function insideOut(series) {\n var n = series.length,\n i,\n j,\n sums = series.map(ascending_sum),\n order = appearance(series),\n top = 0,\n bottom = 0,\n tops = [],\n bottoms = [];\n\n for (i = 0; i < n; ++i) {\n j = order[i];\n if (top < bottom) {\n top += sums[j];\n tops.push(j);\n } else {\n bottom += sums[j];\n bottoms.push(j);\n }\n }\n\n return bottoms.reverse().concat(tops);\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/order/reverse.js\n\n\n/* harmony default export */ function reverse(series) {\n return order_none(series).reverse();\n}\n\n;// CONCATENATED MODULE: ./node_modules/d3-shape/src/index.js\n\n\n\n\n // Note: radialArea is deprecated!\n // Note: radialLine is deprecated!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./node_modules/victory-area/es/area.js\n\n\nfunction area_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { area_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction area_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/*eslint no-magic-numbers: ["error", { "ignore": [-1, 0, 1, 2] }]*/\n\n\n\n\n\nvar defined = function (d) {\n var y = d._y1 !== undefined ? d._y1 : d._y;\n return y !== null && y !== undefined && d._y0 !== null;\n};\n\nvar getXAccessor = function (scale) {\n return function (d) {\n return scale.x(d._x1 !== undefined ? d._x1 : d._x);\n };\n};\n\nvar getYAccessor = function (scale) {\n return function (d) {\n return scale.y(d._y1 !== undefined ? d._y1 : d._y);\n };\n};\n\nvar getY0Accessor = function (scale) {\n return function (d) {\n return scale.y(d._y0);\n };\n};\n\nvar getAngleAccessor = function (scale) {\n return function (d) {\n var x = scale.x(d._x1 !== undefined ? d._x1 : d._x);\n return -1 * x + Math.PI / 2;\n };\n};\n\nvar area_toNewName = function (interpolation) {\n // d3 shape changed the naming scheme for interpolators from "basis" -> "curveBasis" etc.\n var capitalize = function (s) {\n return s && s[0].toUpperCase() + s.slice(1);\n };\n\n return "curve".concat(capitalize(interpolation));\n};\n\nvar getLineFunction = function (props) {\n var polar = props.polar,\n scale = props.scale,\n horizontal = props.horizontal;\n var interpolationFunction = typeof props.interpolation === "function" && props.interpolation;\n var interpolationName = typeof props.interpolation === "string" && area_toNewName(props.interpolation);\n return polar ? src_lineRadial().defined(defined).curve(interpolationFunction || d3_shape_src_namespaceObject["".concat(interpolationName, "Closed")]).angle(getAngleAccessor(scale)).radius(getYAccessor(scale)) : src_line().defined(defined).curve(interpolationFunction || d3_shape_src_namespaceObject[interpolationName]).x(horizontal ? getYAccessor(scale) : getXAccessor(scale)).y(horizontal ? getXAccessor(scale) : getYAccessor(scale));\n};\n\nvar getCartesianArea = function (props, interpolation) {\n var horizontal = props.horizontal,\n scale = props.scale;\n var interpolationFunction = typeof interpolation === "function" && interpolation;\n var interpolationName = typeof interpolation === "string" && interpolation;\n return horizontal ? src_area().defined(defined).curve(interpolationFunction || d3_shape_src_namespaceObject[interpolationName]).x0(getY0Accessor(scale)).x1(getYAccessor(scale)).y(getXAccessor(scale)) : src_area().defined(defined).curve(interpolationFunction || d3_shape_src_namespaceObject[interpolationName]).x(getXAccessor(scale)).y1(getYAccessor(scale)).y0(getY0Accessor(scale));\n};\n\nvar getAreaFunction = function (props) {\n var polar = props.polar,\n scale = props.scale;\n var interpolationFunction = typeof props.interpolation === "function" && props.interpolation;\n var interpolationName = typeof props.interpolation === "string" && area_toNewName(props.interpolation);\n var interpolation = interpolationFunction || interpolationName;\n return polar ? areaRadial().defined(defined).curve(interpolationFunction || d3_shape_src_namespaceObject["".concat(interpolationName, "Closed")]).angle(getAngleAccessor(scale)).outerRadius(getYAccessor(scale)).innerRadius(getY0Accessor(scale)) : getCartesianArea(props, interpolation);\n};\n\nvar area_evaluateProps = function (props) {\n /**\n * Potential evaluated props are:\n * `ariaLabel`\n * `desc`\n * `id`\n * `style`\n * `tabIndex`\n */\n var ariaLabel = evaluateProp(props.ariaLabel, props);\n var desc = evaluateProp(props.desc, props);\n var id = evaluateProp(props.id, props);\n var style = evaluateStyle(assign_default()({\n fill: "black"\n }, props.style), props);\n var tabIndex = evaluateProp(props.tabIndex, props);\n return assign_default()({}, props, {\n ariaLabel: ariaLabel,\n desc: desc,\n id: id,\n style: style,\n tabIndex: tabIndex\n });\n};\n\nvar Area = function (props) {\n props = area_evaluateProps(props);\n var _props = props,\n ariaLabel = _props.ariaLabel,\n role = _props.role,\n shapeRendering = _props.shapeRendering,\n className = _props.className,\n polar = _props.polar,\n origin = _props.origin,\n data = _props.data,\n pathComponent = _props.pathComponent,\n events = _props.events,\n groupComponent = _props.groupComponent,\n clipPath = _props.clipPath,\n id = _props.id,\n style = _props.style,\n desc = _props.desc,\n tabIndex = _props.tabIndex;\n var defaultTransform = polar && origin ? "translate(".concat(origin.x, ", ").concat(origin.y, ")") : undefined;\n var transform = props.transform || defaultTransform;\n var renderLine = style.stroke && style.stroke !== "none" && style.stroke !== "transparent";\n var areaFunction = getAreaFunction(props);\n var lineFunction = renderLine && getLineFunction(props);\n var areaStroke = style.stroke ? "none" : style.fill;\n\n var sharedProps = area_objectSpread({\n "aria-label": ariaLabel,\n className: className,\n role: role,\n shapeRendering: shapeRendering,\n transform: transform\n }, events, {\n clipPath: clipPath,\n tabIndex: tabIndex\n });\n\n var area = react.cloneElement(pathComponent, assign_default()({\n key: "".concat(id, "-area"),\n style: assign_default()({}, style, {\n stroke: areaStroke\n }),\n d: areaFunction(data),\n desc: desc,\n tabIndex: tabIndex\n }, sharedProps));\n var line = renderLine ? react.cloneElement(pathComponent, assign_default()({\n key: "".concat(id, "-area-stroke"),\n style: assign_default()({}, style, {\n fill: "none"\n }),\n d: lineFunction(data)\n }, sharedProps)) : null;\n return renderLine ? react.cloneElement(groupComponent, {}, [area, line]) : area;\n};\n\nArea.propTypes = area_objectSpread({}, primitiveProps, {\n groupComponent: (prop_types_default()).element,\n interpolation: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).func]),\n pathComponent: (prop_types_default()).element\n});\nArea.defaultProps = {\n groupComponent: react.createElement("g", null),\n pathComponent: react.createElement(path, null),\n role: "presentation",\n shapeRendering: "auto"\n};\n/* harmony default export */ const es_area = (Area);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-primitives/clip-path.js\n\n\n\nvar ClipPath = function (props) {\n return react.createElement("defs", null, react.createElement("clipPath", {\n id: props.clipId\n }, props.children));\n};\n\nClipPath.propTypes = {\n children: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).node), (prop_types_default()).node]),\n clipId: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string])\n};\n/* harmony default export */ const clip_path = (ClipPath);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-clip-container/victory-clip-container.js\n\n\n\n\n\nfunction victory_clip_container_toConsumableArray(arr) { return victory_clip_container_arrayWithoutHoles(arr) || victory_clip_container_iterableToArray(arr) || victory_clip_container_nonIterableSpread(); }\n\nfunction victory_clip_container_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_clip_container_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_clip_container_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction victory_clip_container_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_clip_container_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_clip_container_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction victory_clip_container_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_clip_container_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_clip_container_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_clip_container_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_clip_container_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_clip_container_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_clip_container_assertThisInitialized(self); }\n\nfunction victory_clip_container_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_clip_container_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\n\n\n\n\nvar VictoryClipContainer =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_clip_container_inherits(VictoryClipContainer, _React$Component);\n\n function VictoryClipContainer(props) {\n var _this;\n\n victory_clip_container_classCallCheck(this, VictoryClipContainer);\n\n _this = victory_clip_container_possibleConstructorReturn(this, (VictoryClipContainer.__proto__ || Object.getPrototypeOf(VictoryClipContainer)).call(this, props));\n _this.clipId = !isObject_default()(props) || props.clipId === undefined ? uniqueId_default()("victory-clip-") : props.clipId;\n return _this;\n }\n\n victory_clip_container_createClass(VictoryClipContainer, [{\n key: "calculateAttributes",\n value: function calculateAttributes(props) {\n var polar = props.polar,\n origin = props.origin,\n _props$clipWidth = props.clipWidth,\n clipWidth = _props$clipWidth === void 0 ? 0 : _props$clipWidth,\n _props$clipHeight = props.clipHeight,\n clipHeight = _props$clipHeight === void 0 ? 0 : _props$clipHeight,\n _props$translateX = props.translateX,\n translateX = _props$translateX === void 0 ? 0 : _props$translateX,\n _props$translateY = props.translateY,\n translateY = _props$translateY === void 0 ? 0 : _props$translateY;\n var clipPadding = helpers_getPadding({\n padding: props.clipPadding\n });\n var radius = props.radius || getRadius(props);\n return {\n x: (polar ? origin.x : translateX) - clipPadding.left,\n y: (polar ? origin.y : translateY) - clipPadding.top,\n width: Math.max((polar ? radius : clipWidth) + clipPadding.left + clipPadding.right, 0),\n height: Math.max((polar ? radius : clipHeight) + clipPadding.top + clipPadding.bottom, 0)\n };\n }\n }, {\n key: "renderClippedGroup",\n value: function renderClippedGroup(props, clipId) {\n var style = props.style,\n events = props.events,\n transform = props.transform,\n children = props.children,\n className = props.className,\n groupComponent = props.groupComponent,\n tabIndex = props.tabIndex;\n var clipComponent = this.renderClipComponent(props, clipId);\n\n var groupProps = assign_default()({\n className: className,\n style: style,\n transform: transform,\n key: "clipped-group-".concat(clipId),\n clipPath: "url(#".concat(clipId, ")")\n }, events);\n\n return react.cloneElement(groupComponent, victory_clip_container_objectSpread({}, groupProps, {\n "aria-label": props["aria-label"],\n tabIndex: tabIndex\n }), [clipComponent].concat(victory_clip_container_toConsumableArray(react.Children.toArray(children))));\n }\n }, {\n key: "renderGroup",\n value: function renderGroup(props) {\n var style = props.style,\n events = props.events,\n transform = props.transform,\n children = props.children,\n className = props.className,\n groupComponent = props.groupComponent,\n tabIndex = props.tabIndex;\n return react.cloneElement(groupComponent, assign_default()({\n className: className,\n style: style,\n transform: transform,\n "aria-label": props["aria-label"],\n tabIndex: tabIndex\n }, events), children);\n }\n }, {\n key: "renderClipComponent",\n value: function renderClipComponent(props, clipId) {\n var polar = props.polar,\n origin = props.origin,\n _props$clipWidth2 = props.clipWidth,\n clipWidth = _props$clipWidth2 === void 0 ? 0 : _props$clipWidth2,\n _props$clipHeight2 = props.clipHeight,\n clipHeight = _props$clipHeight2 === void 0 ? 0 : _props$clipHeight2,\n _props$translateX2 = props.translateX,\n translateX = _props$translateX2 === void 0 ? 0 : _props$translateX2,\n _props$translateY2 = props.translateY,\n translateY = _props$translateY2 === void 0 ? 0 : _props$translateY2,\n circleComponent = props.circleComponent,\n rectComponent = props.rectComponent,\n clipPathComponent = props.clipPathComponent;\n\n var _Helpers$getPadding = helpers_getPadding({\n padding: props.clipPadding\n }),\n top = _Helpers$getPadding.top,\n bottom = _Helpers$getPadding.bottom,\n left = _Helpers$getPadding.left,\n right = _Helpers$getPadding.right;\n\n var child;\n\n if (polar) {\n var radius = props.radius || getRadius(props);\n var circleProps = {\n r: Math.max(radius + left + right, radius + top + bottom, 0),\n cx: origin.x - left,\n cy: origin.y - top\n };\n child = react.cloneElement(circleComponent, circleProps);\n } else {\n var rectProps = {\n x: translateX - left,\n y: translateY - top,\n width: Math.max(clipWidth + left + right, 0),\n height: Math.max(clipHeight + top + bottom, 0)\n };\n child = react.cloneElement(rectComponent, rectProps);\n }\n\n return react.cloneElement(clipPathComponent, assign_default()({\n key: "clip-path-".concat(clipId)\n }, props, {\n clipId: clipId\n }), child);\n }\n }, {\n key: "getClipValue",\n value: function getClipValue(props, axis) {\n var clipValues = {\n x: props.clipWidth,\n y: props.clipHeight\n };\n\n if (clipValues[axis] !== undefined) {\n return clipValues[axis];\n }\n\n var range = getRange(props, axis);\n return range ? Math.abs(range[0] - range[1]) || undefined : undefined;\n }\n }, {\n key: "getTranslateValue",\n value: function getTranslateValue(props, axis) {\n var translateValues = {\n x: props.translateX,\n y: props.translateY\n };\n\n if (translateValues[axis] !== undefined) {\n return translateValues[axis];\n }\n\n var range = getRange(props, axis);\n return range ? Math.min.apply(Math, victory_clip_container_toConsumableArray(range)) : undefined;\n }\n }, {\n key: "render",\n value: function render() {\n var clipHeight = this.getClipValue(this.props, "y");\n var clipWidth = this.getClipValue(this.props, "x");\n\n if (clipWidth === undefined || clipHeight === undefined) {\n return this.renderGroup(this.props);\n }\n\n var translateX = this.getTranslateValue(this.props, "x");\n var translateY = this.getTranslateValue(this.props, "y");\n\n var clipProps = defaults_default()({}, this.props, {\n clipHeight: clipHeight,\n clipWidth: clipWidth,\n translateX: translateX,\n translateY: translateY\n });\n\n return this.renderClippedGroup(clipProps, this.clipId);\n }\n }]);\n\n return VictoryClipContainer;\n}(react.Component);\n\nObject.defineProperty(VictoryClipContainer, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryClipContainer"\n});\nObject.defineProperty(VictoryClipContainer, "role", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "container"\n});\nObject.defineProperty(VictoryClipContainer, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n "aria-label": (prop_types_default()).string,\n children: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).node), (prop_types_default()).node]),\n circleComponent: (prop_types_default()).element,\n className: (prop_types_default()).string,\n clipHeight: nonNegative,\n clipId: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string]),\n clipPadding: prop_types_default().shape({\n top: (prop_types_default()).number,\n bottom: (prop_types_default()).number,\n left: (prop_types_default()).number,\n right: (prop_types_default()).number\n }),\n clipPathComponent: (prop_types_default()).element,\n clipWidth: nonNegative,\n events: (prop_types_default()).object,\n groupComponent: (prop_types_default()).element,\n origin: prop_types_default().shape({\n x: nonNegative,\n y: nonNegative\n }),\n polar: (prop_types_default()).bool,\n radius: nonNegative,\n style: (prop_types_default()).object,\n tabIndex: (prop_types_default()).number,\n transform: (prop_types_default()).string,\n translateX: (prop_types_default()).number,\n translateY: (prop_types_default()).number\n }\n});\nObject.defineProperty(VictoryClipContainer, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n circleComponent: react.createElement(circle, null),\n rectComponent: react.createElement(rect, null),\n clipPathComponent: react.createElement(clip_path, null),\n groupComponent: react.createElement("g", null)\n }\n});\n\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/default-transitions.js\n/* eslint-disable func-style */\nfunction continuousTransitions() {\n return {\n onLoad: {\n duration: 2000\n },\n onExit: {\n duration: 500\n },\n onEnter: {\n duration: 500\n }\n };\n}\nfunction continuousPolarTransitions() {\n return {\n onLoad: {\n duration: 2000,\n before: function () {\n return {\n _y: 0,\n _y1: 0,\n _y0: 0\n };\n },\n after: function (datum) {\n return {\n _y: datum._y,\n _y1: datum._y1,\n _y0: datum._y0\n };\n }\n },\n onExit: {\n duration: 500,\n before: function (datum, index, data) {\n var adjacent = function (attr) {\n var adj = index === 0 ? data[index + 1] : data[index - 1];\n return adj[attr];\n };\n\n return {\n _x: adjacent("_x"),\n _y: adjacent("_y"),\n _y0: adjacent("_y0")\n };\n }\n },\n onEnter: {\n duration: 500,\n before: function (datum, index, data) {\n var adjacent = function (attr) {\n var adj = index === 0 ? data[index + 1] : data[index - 1];\n return adj[attr];\n };\n\n return {\n _x: adjacent("_x"),\n _y: adjacent("_y"),\n _y0: adjacent("_y0")\n };\n },\n after: function (datum) {\n return {\n _x: datum._x,\n _y: datum._y,\n _y1: datum._y1,\n _y0: datum._y0\n };\n }\n }\n };\n}\nfunction discreteTransitions() {\n return {\n onLoad: {\n duration: 2000,\n before: function () {\n return {\n opacity: 0\n };\n },\n after: function (datum) {\n return datum;\n }\n },\n onExit: {\n duration: 600,\n before: function () {\n return {\n opacity: 0\n };\n }\n },\n onEnter: {\n duration: 600,\n before: function () {\n return {\n opacity: 0\n };\n },\n after: function (datum) {\n return datum;\n }\n }\n };\n}\n;// CONCATENATED MODULE: ./node_modules/victory-area/es/victory-area.js\nfunction victory_area_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_area_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_area_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction victory_area_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_area_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_area_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_area_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_area_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_area_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_area_assertThisInitialized(self); }\n\nfunction victory_area_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_area_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\n\nvar victory_area_fallbackProps = {\n width: 450,\n height: 300,\n padding: 50,\n interpolation: "linear"\n};\nvar victory_area_options = {\n components: [{\n name: "parent",\n index: "parent"\n }, {\n name: "data",\n index: "all"\n }, {\n name: "labels"\n }]\n};\n\nvar VictoryArea =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_area_inherits(VictoryArea, _React$Component);\n\n function VictoryArea() {\n victory_area_classCallCheck(this, VictoryArea);\n\n return victory_area_possibleConstructorReturn(this, (VictoryArea.__proto__ || Object.getPrototypeOf(VictoryArea)).apply(this, arguments));\n }\n\n victory_area_createClass(VictoryArea, [{\n key: "shouldAnimate",\n // Overridden in native versions\n value: function shouldAnimate() {\n return !!this.props.animate;\n }\n }, {\n key: "render",\n value: function render() {\n var animationWhitelist = VictoryArea.animationWhitelist,\n role = VictoryArea.role;\n var props = modifyProps(this.props, victory_area_fallbackProps, role);\n\n if (this.shouldAnimate()) {\n return this.animateComponent(props, animationWhitelist);\n }\n\n var children = this.renderContinuousData(props);\n return props.standalone ? this.renderContainer(props.containerComponent, children) : children;\n }\n }]);\n\n return VictoryArea;\n}(react.Component);\n\nObject.defineProperty(VictoryArea, "animationWhitelist", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["data", "domain", "height", "padding", "style", "width"]\n});\nObject.defineProperty(VictoryArea, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_area_objectSpread({}, baseProps, dataProps, {\n interpolation: prop_types_default().oneOfType([prop_types_default().oneOf(["basis", "cardinal", "catmullRom", "linear", "monotoneX", "monotoneY", "natural", "step", "stepAfter", "stepBefore"]), (prop_types_default()).func]),\n label: deprecated((prop_types_default()).string, "Use `labels` instead for individual data labels")\n })\n});\nObject.defineProperty(VictoryArea, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n containerComponent: react.createElement(VictoryContainer, null),\n dataComponent: react.createElement(es_area, null),\n groupComponent: react.createElement(VictoryClipContainer, null),\n labelComponent: react.createElement(victory_label, {\n renderInPortal: true\n }),\n samples: 50,\n sortKey: "x",\n sortOrder: "ascending",\n standalone: true,\n theme: victory_theme.grayscale\n }\n});\nObject.defineProperty(VictoryArea, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryArea"\n});\nObject.defineProperty(VictoryArea, "role", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "area"\n});\nObject.defineProperty(VictoryArea, "continuous", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: true\n});\nObject.defineProperty(VictoryArea, "defaultTransitions", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: continuousTransitions()\n});\nObject.defineProperty(VictoryArea, "defaultPolarTransitions", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: continuousPolarTransitions()\n});\nObject.defineProperty(VictoryArea, "getDomain", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: getDomainWithZero\n});\nObject.defineProperty(VictoryArea, "getData", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: data_getData\n});\nObject.defineProperty(VictoryArea, "getBaseProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return victory_area_es_helper_methods_getBaseProps(props, victory_area_fallbackProps);\n }\n});\nObject.defineProperty(VictoryArea, "expectedComponents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["dataComponent", "labelComponent", "groupComponent", "containerComponent"]\n});\n/* harmony default export */ const victory_area = (add_events(VictoryArea, victory_area_options));\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartArea/ChartArea.js\n\n\n\n\n\n\nvar ChartAreaSortOrder;\n(function (ChartAreaSortOrder) {\n ChartAreaSortOrder["ascending"] = "ascending";\n ChartAreaSortOrder["descending"] = "descending";\n})(ChartAreaSortOrder || (ChartAreaSortOrder = {}));\nconst ChartArea = (_a) => {\n var { containerComponent = react.createElement(ChartContainer, null), themeColor, themeVariant, \n // destructure last\n theme = getTheme(themeColor, themeVariant) } = _a, rest = (0,tslib_es6.__rest)(_a, ["containerComponent", "themeColor", "themeVariant", "theme"]);\n // Clone so users can override container props\n const container = react.cloneElement(containerComponent, Object.assign({ theme }, containerComponent.props));\n // Note: containerComponent is required for theme\n return react.createElement(victory_area, Object.assign({ containerComponent: container, theme: theme }, rest));\n};\nChartArea.displayName = \'ChartArea\';\n// Note: VictoryArea.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartArea, victory_area);\n//# sourceMappingURL=ChartArea.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartArea/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartAxis/ChartAxis.js\n\n\n\n\n\n\nconst ChartAxis = (_a) => {\n var { containerComponent = react.createElement(ChartContainer, null), showGrid = false, themeColor, themeVariant, \n // destructure last\n theme = getTheme(themeColor, themeVariant) } = _a, rest = (0,tslib_es6.__rest)(_a, ["containerComponent", "showGrid", "themeColor", "themeVariant", "theme"]);\n // Clone so users can override container props\n const container = react.cloneElement(containerComponent, Object.assign({ theme }, containerComponent.props));\n // Note: containerComponent is required for theme\n return (react.createElement(victory_axis, Object.assign({ containerComponent: container, theme: showGrid ? getAxisTheme(themeColor, themeVariant) : theme }, rest)));\n};\nChartAxis.displayName = \'ChartAxis\';\nhoist_non_react_statics_cjs_default()(ChartAxis, victory_axis);\n//# sourceMappingURL=ChartAxis.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartAxis/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/victory-bar/es/helper-methods.js\n\n\n\nvar getBarPosition = function (props, datum) {\n var getDefaultMin = function (axis) {\n var defaultZero = getType(props.scale[axis]) === "log" ? 1 / Number.MAX_SAFE_INTEGER : 0;\n var defaultMin = defaultZero;\n var minY = getMinValue(props.domain[axis]);\n var maxY = getMaxValue(props.domain[axis]);\n\n if (minY < 0 && maxY <= 0) {\n defaultMin = maxY;\n } else if (minY >= 0 && maxY > 0) {\n defaultMin = minY;\n }\n\n return datum["_".concat(axis)] instanceof Date ? new Date(defaultMin) : defaultMin;\n };\n\n var _y0 = datum._y0 !== undefined ? datum._y0 : getDefaultMin("y");\n\n var _x0 = datum._x0 !== undefined ? datum._x0 : getDefaultMin("x");\n\n return scalePoint(props, assign_default()({}, datum, {\n _y0: _y0,\n _x0: _x0\n }));\n};\n\nvar victory_bar_es_helper_methods_getCalculatedValues = function (props) {\n var polar = props.polar;\n var defaultStyles = getDefaultStyles(props, "bar");\n var style = !props.disableInlineStyles ? getStyles(props.style, defaultStyles) : {};\n var range = props.range || {\n x: getRange(props, "x"),\n y: getRange(props, "y")\n };\n var domain = {\n x: getDomainWithZero(props, "x"),\n y: getDomainWithZero(props, "y")\n };\n var scale = {\n x: getBaseScale(props, "x").domain(domain.x).range(props.horizontal ? range.y : range.x),\n y: getBaseScale(props, "y").domain(domain.y).range(props.horizontal ? range.x : range.y)\n };\n var origin = polar ? props.origin || getPolarOrigin(props) : undefined;\n var data = data_getData(props);\n data = formatDataFromDomain(data, domain, 0);\n return {\n style: style,\n data: data,\n scale: scale,\n domain: domain,\n origin: origin\n };\n};\n\nvar victory_bar_es_helper_methods_getBaseProps = function (props, fallbackProps) {\n var modifiedProps = modifyProps(props, fallbackProps, "bar");\n props = assign_default()({}, modifiedProps, victory_bar_es_helper_methods_getCalculatedValues(modifiedProps));\n var _props = props,\n alignment = _props.alignment,\n barRatio = _props.barRatio,\n cornerRadius = _props.cornerRadius,\n data = _props.data,\n disableInlineStyles = _props.disableInlineStyles,\n domain = _props.domain,\n events = _props.events,\n height = _props.height,\n horizontal = _props.horizontal,\n origin = _props.origin,\n padding = _props.padding,\n polar = _props.polar,\n scale = _props.scale,\n sharedEvents = _props.sharedEvents,\n standalone = _props.standalone,\n style = _props.style,\n theme = _props.theme,\n width = _props.width,\n labels = _props.labels,\n name = _props.name,\n barWidth = _props.barWidth,\n getPath = _props.getPath;\n var initialChildProps = {\n parent: {\n horizontal: horizontal,\n domain: domain,\n scale: scale,\n width: width,\n height: height,\n data: data,\n standalone: standalone,\n name: name,\n theme: theme,\n polar: polar,\n origin: origin,\n padding: padding,\n style: style.parent\n }\n };\n return data.reduce(function (childProps, datum, index) {\n var eventKey = !isNil_default()(datum.eventKey) ? datum.eventKey : index;\n\n var _getBarPosition = getBarPosition(props, datum),\n x = _getBarPosition.x,\n y = _getBarPosition.y,\n y0 = _getBarPosition.y0,\n x0 = _getBarPosition.x0;\n\n var dataProps = {\n alignment: alignment,\n barRatio: barRatio,\n barWidth: barWidth,\n cornerRadius: cornerRadius,\n data: data,\n datum: datum,\n disableInlineStyles: disableInlineStyles,\n getPath: getPath,\n horizontal: horizontal,\n index: index,\n polar: polar,\n origin: origin,\n scale: scale,\n style: style.data,\n width: width,\n height: height,\n x: x,\n y: y,\n y0: y0,\n x0: x0\n };\n childProps[eventKey] = {\n data: dataProps\n };\n var text = getText(props, datum, index);\n\n if (text !== undefined && text !== null || labels && (events || sharedEvents)) {\n childProps[eventKey].labels = getProps(props, index);\n }\n\n return childProps;\n }, initialChildProps);\n};\n;// CONCATENATED MODULE: ./node_modules/victory-bar/es/bar-helper-methods.js\n\n\n\n\nvar getBarWidth = function (barWidth, props) {\n var scale = props.scale,\n data = props.data,\n defaultBarWidth = props.defaultBarWidth,\n style = props.style;\n\n if (barWidth) {\n return evaluateProp(barWidth, props);\n } else if (style.width) {\n return style.width;\n }\n\n var range = scale.x.range();\n var extent = Math.abs(range[1] - range[0]);\n var bars = data.length + 2;\n var barRatio = props.barRatio || 0.5;\n var defaultWidth = barRatio * (data.length < 2 ? defaultBarWidth : extent / bars);\n return Math.max(1, defaultWidth);\n};\n\nvar getCornerRadiusFromObject = function (cornerRadius, props) {\n var realCornerRadius = {\n topLeft: 0,\n topRight: 0,\n bottomLeft: 0,\n bottomRight: 0\n };\n\n var updateCornerRadius = function (corner, fallback) {\n if (!isNil_default()(cornerRadius[corner])) {\n realCornerRadius[corner] = evaluateProp(cornerRadius[corner], props);\n } else if (!isNil_default()(cornerRadius[fallback])) {\n realCornerRadius[corner] = evaluateProp(cornerRadius[fallback], props);\n }\n };\n\n updateCornerRadius("topLeft", "top");\n updateCornerRadius("topRight", "top");\n updateCornerRadius("bottomLeft", "bottom");\n updateCornerRadius("bottomRight", "bottom");\n return realCornerRadius;\n};\n\nvar getCornerRadius = function (cornerRadius, props) {\n var realCornerRadius = {\n topLeft: 0,\n topRight: 0,\n bottomLeft: 0,\n bottomRight: 0\n };\n\n if (!cornerRadius) {\n return realCornerRadius;\n }\n\n if (isPlainObject_default()(cornerRadius)) {\n return getCornerRadiusFromObject(cornerRadius, props);\n } else {\n realCornerRadius.topLeft = evaluateProp(cornerRadius, props);\n realCornerRadius.topRight = evaluateProp(cornerRadius, props);\n return realCornerRadius;\n }\n};\nvar bar_helper_methods_getStyle = function () {\n var style = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var props = arguments.length > 1 ? arguments[1] : undefined;\n\n if (props.disableInlineStyles) {\n return {};\n }\n\n var stroke = style.fill || "black";\n var baseStyle = {\n fill: "black",\n stroke: stroke\n };\n return evaluateStyle(assign_default()(baseStyle, style), props);\n};\n;// CONCATENATED MODULE: ./node_modules/victory-bar/es/geometry-helper-methods.js\n/**\n * A point in the 2d plane\n * @param {number} x - x coordinate\n * @param {number} y - y coordinate\n * @returns {object} - point object\n */\nvar geometry_helper_methods_point = function (x, y) {\n return {\n x: x,\n y: y,\n distance: function (p1) {\n return Math.sqrt(Math.pow(this.x - p1.x, 2) + Math.pow(this.y - p1.y, 2));\n },\n // vector addition in 2d plane\n add: function (p1) {\n return geometry_helper_methods_point(this.x + p1.x, this.y + p1.y);\n },\n // vector subtraction in 2d\n // returns p0 - p1\n subtract: function (p1) {\n return geometry_helper_methods_point(this.x - p1.x, this.y - p1.y);\n },\n // multiply a 2d point by a scalar\n scalarMult: function (n) {\n return geometry_helper_methods_point(this.x * n, this.y * n);\n },\n scalarDivide: function (n) {\n if (n === 0) {\n throw new Error("Division by 0 error");\n }\n\n return geometry_helper_methods_point(this.x / n, this.y / n);\n },\n equals: function (p1) {\n return this.x === p1.x && this.y === p1.y;\n }\n };\n};\n/**\n * A circle in the 2d plane\n * @param {point} center - center of circle\n * @param {number} radius - radius of circle\n * @returns {object} - point object\n */\n\n\nvar geometry_helper_methods_circle = function (center, radius) {\n return {\n center: center,\n radius: radius,\n hasIntersection: function (circle1) {\n var P0 = this.center;\n var P1 = circle1.center;\n var r0 = this.radius;\n var r1 = circle1.radius;\n var d = P0.distance(P1);\n\n if (d > r0 + r1) {\n return false; // separate circles\n }\n\n if (d < Math.abs(r0 - r1)) {\n return false; // one circle contains another\n }\n\n return true;\n },\n equals: function (circle1) {\n var P0 = this.center;\n var P1 = circle1.center;\n var r0 = this.radius;\n var r1 = circle1.radius;\n return r0 === r1 && P0.equals(P1);\n },\n // Source: http://paulbourke.net/geometry/circlesphere/\n // "Intersection of two circles" by Paul Bourke\n // Left-most point is returned as 0th element of array\n // Right-most point is returned as 1st elemennt of array\n intersection: function (circle1) {\n // eslint-disable-line max-statements\n var P0 = this.center;\n var P1 = circle1.center;\n var r0 = this.radius;\n var r1 = circle1.radius;\n var d = P0.distance(P1);\n\n if (!this.hasIntersection(circle1) || this.equals(circle1)) {\n return [];\n }\n\n var a = (Math.pow(r0, 2) - Math.pow(r1, 2) + Math.pow(d, 2)) / (2 * d);\n var h = Math.sqrt(Math.pow(r0, 2) - Math.pow(a, 2));\n var P2 = P0.add(P1.subtract(P0).scalarMult(a).scalarDivide(d));\n var x0 = P0.x,\n y0 = P0.y;\n var x1 = P1.x,\n y1 = P1.y;\n var x2 = P2.x,\n y2 = P2.y;\n var P3s = [geometry_helper_methods_point(x2 - h * (y1 - y0) / d, y2 + h * (x1 - x0) / d), geometry_helper_methods_point(x2 + h * (y1 - y0) / d, y2 - h * (x1 - x0) / d)];\n P3s.sort(function (Point1, Point2) {\n return Point1.x - Point2.x;\n });\n return P3s;\n },\n solveX: function (y) {\n var sqrt = Math.sqrt(Math.pow(this.radius, 2) - Math.pow(y - this.center.y, 2));\n return [this.center.x - sqrt, this.center.x + sqrt];\n },\n solveY: function (x) {\n var sqrt = Math.sqrt(Math.pow(this.radius, 2) - Math.pow(x - this.center.x, 2));\n return [this.center.y - sqrt, this.center.y + sqrt];\n }\n };\n};\n\n\n;// CONCATENATED MODULE: ./node_modules/victory-bar/es/path-helper-methods.js\nfunction path_helper_methods_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { path_helper_methods_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction path_helper_methods_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction path_helper_methods_toConsumableArray(arr) { return path_helper_methods_arrayWithoutHoles(arr) || path_helper_methods_iterableToArray(arr) || path_helper_methods_nonIterableSpread(); }\n\nfunction path_helper_methods_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction path_helper_methods_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction path_helper_methods_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\n\n\n\nvar path_helper_methods_getPosition = function (props, width) {\n var x = props.x,\n x0 = props.x0,\n y = props.y,\n y0 = props.y0,\n horizontal = props.horizontal;\n var alignment = props.alignment || "middle";\n var size = alignment === "middle" ? width / 2 : width;\n var sign = horizontal ? -1 : 1;\n\n if (horizontal) {\n return {\n x0: x0,\n x1: x,\n y0: alignment === "start" ? y : y - sign * size,\n y1: alignment === "end" ? y : y + sign * size\n };\n }\n\n return {\n x0: alignment === "start" ? x : x - sign * size,\n x1: alignment === "end" ? x : x + sign * size,\n y0: y0,\n y1: y\n };\n};\n\nvar path_helper_methods_getAngle = function (props, index) {\n var data = props.data,\n scale = props.scale;\n var x = data[index]._x1 === undefined ? "_x" : "_x1";\n return scale.x(data[index][x]);\n};\n\nvar getAngularWidth = function (props, width) {\n var scale = props.scale;\n var range = scale.y.range();\n var r = Math.max.apply(Math, path_helper_methods_toConsumableArray(range));\n var angularRange = Math.abs(scale.x.range()[1] - scale.x.range()[0]);\n return width / (2 * Math.PI * r) * angularRange;\n};\n\nvar transformAngle = function (angle) {\n return -1 * angle + Math.PI / 2;\n};\n\nvar getCustomBarPath = function (props, width) {\n var getPath = props.getPath;\n\n var propsWithCalculatedValues = path_helper_methods_objectSpread({}, props, path_helper_methods_getPosition(props, width));\n\n return getPath(propsWithCalculatedValues);\n};\n\nvar getStartAngle = function (props, index) {\n var data = props.data,\n scale = props.scale,\n alignment = props.alignment;\n var currentAngle = path_helper_methods_getAngle(props, index);\n var angularRange = Math.abs(scale.x.range()[1] - scale.x.range()[0]);\n var previousAngle = index === 0 ? path_helper_methods_getAngle(props, data.length - 1) - Math.PI * 2 : path_helper_methods_getAngle(props, index - 1);\n\n if (index === 0 && angularRange < 2 * Math.PI) {\n return scale.x.range()[0];\n } else if (alignment === "start" || alignment === "end") {\n return alignment === "start" ? previousAngle : currentAngle;\n } else {\n return (currentAngle + previousAngle) / 2;\n }\n};\n\nvar getEndAngle = function (props, index) {\n var data = props.data,\n scale = props.scale,\n alignment = props.alignment;\n var currentAngle = path_helper_methods_getAngle(props, index);\n var angularRange = Math.abs(scale.x.range()[1] - scale.x.range()[0]);\n var lastAngle = scale.x.range()[1] === 2 * Math.PI ? path_helper_methods_getAngle(props, 0) + Math.PI * 2 : scale.x.range()[1];\n var nextAngle = index === data.length - 1 ? path_helper_methods_getAngle(props, 0) + Math.PI * 2 : path_helper_methods_getAngle(props, index + 1);\n\n if (index === data.length - 1 && angularRange < 2 * Math.PI) {\n return lastAngle;\n } else if (alignment === "start" || alignment === "end") {\n return alignment === "start" ? currentAngle : nextAngle;\n } else {\n return (currentAngle + nextAngle) / 2;\n }\n};\n\nvar mapPointsToPath = function (coords, cornerRadius, direction) {\n var topLeftPath = "".concat(cornerRadius.topLeft, " ").concat(cornerRadius.topLeft, " ").concat(direction);\n var topRightPath = "".concat(cornerRadius.topRight, " ").concat(cornerRadius.topRight, " ").concat(direction);\n var bottomLeftPath = "".concat(cornerRadius.bottomLeft, " ").concat(cornerRadius.bottomLeft, " ").concat(direction);\n var bottomRightPath = "".concat(cornerRadius.bottomRight, " ").concat(cornerRadius.bottomRight, " ").concat(direction);\n var commands = ["M", "A ".concat(bottomLeftPath, ","), "L", "A ".concat(topLeftPath, ","), "L", "A ".concat(topRightPath, ","), "L", "A ".concat(bottomRightPath, ",")];\n var path = commands.reduce(function (acc, command, i) {\n acc += "".concat(command, " ").concat(coords[i].x, ", ").concat(coords[i].y, " \\n");\n return acc;\n }, "");\n return "".concat(path, " z");\n};\n\nvar getVerticalBarPoints = function (position, sign, cr) {\n var x0 = position.x0,\n x1 = position.x1,\n y0 = position.y0,\n y1 = position.y1; // eslint-disable-next-line max-statements, max-len\n\n var getHalfPoints = function (side) {\n var isLeft = side === "Left";\n var signL = isLeft ? 1 : -1;\n var x = isLeft ? x0 : x1;\n var bottomPoint = {\n x: x + signL * cr["bottom".concat(side)],\n y: y0\n };\n var bottomMiddlePoint = {\n x: x,\n y: y0 - sign * cr["bottom".concat(side)]\n };\n var topMiddlePoint = {\n x: x,\n y: y1 + sign * cr["top".concat(side)]\n };\n var topPoint = {\n x: x + signL * cr["top".concat(side)],\n y: y1\n };\n var hasIntersection = sign === 1 ? y0 - cr["bottom".concat(side)] < y1 + cr["top".concat(side)] : y0 + cr["bottom".concat(side)] > y1 - cr["top".concat(side)];\n\n if (hasIntersection) {\n var topCenter = geometry_helper_methods_point(x + signL * cr["top".concat(side)], y1 + sign * cr["top".concat(side)]);\n var topCircle = geometry_helper_methods_circle(topCenter, cr["top".concat(side)]);\n var bottomCenter = geometry_helper_methods_point(x + signL * cr["bottom".concat(side)], y0 - sign * cr["bottom".concat(side)]);\n var bottomCircle = geometry_helper_methods_circle(bottomCenter, cr["bottom".concat(side)]);\n var circleIntersection = topCircle.intersection(bottomCircle);\n var hasArcIntersection = circleIntersection.length > 0;\n\n if (hasArcIntersection) {\n var arcIntersection = circleIntersection[isLeft ? 0 : 1];\n bottomMiddlePoint = {\n x: arcIntersection.x,\n y: arcIntersection.y\n };\n topMiddlePoint = {\n x: arcIntersection.x,\n y: arcIntersection.y\n };\n } else {\n var hasBottomLineTopArcIntersection = cr["top".concat(side)] > cr["bottom".concat(side)];\n\n if (hasBottomLineTopArcIntersection) {\n var newX = topCircle.solveX(y0)[isLeft ? 0 : 1];\n bottomPoint = {\n x: newX,\n y: y0\n };\n bottomMiddlePoint = {\n x: newX,\n y: y0\n };\n topMiddlePoint = {\n x: newX,\n y: y0\n };\n } else {\n var _newX = bottomCircle.solveX(y1)[isLeft ? 0 : 1];\n bottomMiddlePoint = {\n x: _newX,\n y: y1\n };\n topMiddlePoint = {\n x: _newX,\n y: y1\n };\n topPoint = {\n x: _newX,\n y: y1\n };\n }\n }\n }\n\n var points = [bottomPoint, bottomMiddlePoint, topMiddlePoint, topPoint];\n return isLeft ? points : points.reverse();\n };\n\n return getHalfPoints("Left").concat(getHalfPoints("Right"));\n};\n\nvar getHorizontalBarPoints = function (position, sign, cr) {\n var y0 = position.y0,\n y1 = position.y1;\n var x0 = position.x0 < position.x1 ? position.x0 : position.x1;\n var x1 = position.x0 < position.x1 ? position.x1 : position.x0; // eslint-disable-next-line max-statements, max-len\n\n var getHalfPoints = function (side) {\n var isTop = side === "top";\n var signL = isTop ? -1 : 1;\n var y = isTop ? y1 : y0;\n var leftPoint = {\n x: x0,\n y: y - signL * cr["".concat(side, "Left")]\n };\n var leftMiddlePoint = {\n x: x0 + cr["".concat(side, "Left")],\n y: y\n };\n var rightMiddlePoint = {\n x: x1 - cr["".concat(side, "Right")],\n y: y\n };\n var rightPoint = {\n x: x1,\n y: y - signL * cr["".concat(side, "Right")]\n };\n var hasIntersection = leftMiddlePoint.x > rightMiddlePoint.x;\n\n if (hasIntersection) {\n var leftCenter = geometry_helper_methods_point(x0 + cr["".concat(side, "Left")], y - signL * cr["".concat(side, "Left")]);\n var leftCircle = geometry_helper_methods_circle(leftCenter, cr["".concat(side, "Left")]);\n var rightCenter = geometry_helper_methods_point(x1 - cr["".concat(side, "Right")], y - signL * cr["".concat(side, "Right")]);\n var rightCircle = geometry_helper_methods_circle(rightCenter, cr["".concat(side, "Right")]);\n var circleIntersection = leftCircle.intersection(rightCircle);\n var hasArcIntersection = circleIntersection.length > 0;\n\n if (hasArcIntersection) {\n var arcIntersection = circleIntersection[sign > 0 ? 1 : 0];\n leftMiddlePoint = {\n x: arcIntersection.x,\n y: arcIntersection.y\n };\n rightMiddlePoint = {\n x: arcIntersection.x,\n y: arcIntersection.y\n };\n } else {\n var hasLeftLineRightArcIntersection = cr["".concat(side, "Right")] > cr["".concat(side, "Left")];\n\n if (hasLeftLineRightArcIntersection) {\n var newY = rightCircle.solveY(x0)[isTop ? 0 : 1];\n leftPoint = {\n x: x0,\n y: newY\n };\n leftMiddlePoint = {\n x: x0,\n y: newY\n };\n rightMiddlePoint = {\n x: x0,\n y: newY\n };\n } else {\n var _newY = leftCircle.solveY(x1)[isTop ? 0 : 1];\n rightPoint = {\n x: x1,\n y: _newY\n };\n rightMiddlePoint = {\n x: x1,\n y: _newY\n };\n leftMiddlePoint = {\n x: x1,\n y: _newY\n };\n }\n }\n }\n\n return [leftPoint, leftMiddlePoint, rightMiddlePoint, rightPoint];\n };\n\n var topPoints = getHalfPoints("top");\n var bottomPoints = getHalfPoints("bottom");\n return [bottomPoints[1], bottomPoints[0]].concat(path_helper_methods_toConsumableArray(topPoints), [// eslint-disable-next-line no-magic-numbers\n bottomPoints[3], bottomPoints[2]]);\n}; // eslint-disable-next-line max-params\n\n\nvar getVerticalBarPath = function (props, width, cornerRadius) {\n var position = path_helper_methods_getPosition(props, width);\n var sign = position.y0 > position.y1 ? 1 : -1;\n var direction = sign > 0 ? "0 0 1" : "0 0 0";\n var points = getVerticalBarPoints(position, sign, cornerRadius);\n return mapPointsToPath(points, cornerRadius, direction);\n}; // eslint-disable-next-line max-params\n\nvar getHorizontalBarPath = function (props, width, cornerRadius) {\n var position = path_helper_methods_getPosition(props, width);\n var sign = position.x0 < position.x1 ? 1 : -1;\n var direction = "0 0 1";\n var cr = {\n topRight: sign > 0 ? cornerRadius.topLeft : cornerRadius.bottomLeft,\n bottomRight: sign > 0 ? cornerRadius.topRight : cornerRadius.bottomRight,\n bottomLeft: sign > 0 ? cornerRadius.bottomRight : cornerRadius.topRight,\n topLeft: sign > 0 ? cornerRadius.bottomLeft : cornerRadius.topLeft\n };\n var points = getHorizontalBarPoints(position, sign, cr);\n return mapPointsToPath(points, cr, direction);\n};\nvar getVerticalPolarBarPath = function (props, cornerRadius) {\n var datum = props.datum,\n scale = props.scale,\n index = props.index,\n alignment = props.alignment,\n style = props.style;\n var r1 = scale.y(datum._y0 || 0);\n var r2 = scale.y(datum._y1 !== undefined ? datum._y1 : datum._y);\n var currentAngle = scale.x(datum._x1 !== undefined ? datum._x1 : datum._x);\n var start;\n var end;\n\n if (style.width) {\n var width = getAngularWidth(props, style.width);\n var size = alignment === "middle" ? width / 2 : width;\n start = alignment === "start" ? currentAngle : currentAngle - size;\n end = alignment === "end" ? currentAngle : currentAngle + size;\n } else {\n start = getStartAngle(props, index);\n end = getEndAngle(props, index);\n }\n\n var getPath = function (edge) {\n var pathFunction = src_arc().innerRadius(r1).outerRadius(r2).startAngle(transformAngle(start)).endAngle(transformAngle(end)).cornerRadius(cornerRadius[edge]);\n return pathFunction();\n };\n\n var getPathData = function (edge) {\n var rightPath = getPath("".concat(edge, "Right"));\n var rightMoves = rightPath.match(/[A-Z]/g);\n var rightCoords = rightPath.split(/[A-Z]/).slice(1);\n var rightMiddle = rightMoves.indexOf("L");\n var leftPath = getPath("".concat(edge, "Left"));\n var leftMoves = leftPath.match(/[A-Z]/g);\n var leftCoords = leftPath.split(/[A-Z]/).slice(1);\n var leftMiddle = leftMoves.indexOf("L");\n return {\n rightMoves: rightMoves,\n rightCoords: rightCoords,\n rightMiddle: rightMiddle,\n leftMoves: leftMoves,\n leftCoords: leftCoords,\n leftMiddle: leftMiddle\n };\n }; // eslint-disable-next-line max-statements\n\n\n var getTopPath = function () {\n var topRight = cornerRadius.topRight,\n topLeft = cornerRadius.topLeft;\n var arcLength = r2 * Math.abs(end - start);\n\n var _getPathData = getPathData("top"),\n rightMoves = _getPathData.rightMoves,\n rightCoords = _getPathData.rightCoords,\n rightMiddle = _getPathData.rightMiddle,\n leftMoves = _getPathData.leftMoves,\n leftCoords = _getPathData.leftCoords,\n leftMiddle = _getPathData.leftMiddle;\n\n var moves;\n var coords;\n\n if (topRight === topLeft || arcLength < 2 * topRight + 2 * topLeft) {\n moves = topRight > topLeft ? rightMoves : leftMoves;\n coords = topRight > topLeft ? rightCoords : leftCoords;\n } else {\n // eslint-disable-next-line no-magic-numbers\n var isShort = function (middle) {\n return middle < 3;\n };\n\n var rightOffset = topLeft > topRight && isShort(rightMiddle) ? 1 : 2;\n var leftOffset;\n\n if (topRight > topLeft) {\n var defaultOffset = isShort(rightMiddle) ? leftMiddle : leftMiddle - 2;\n leftOffset = isShort(leftMiddle) ? leftMiddle - 1 : defaultOffset;\n } else {\n var _defaultOffset = isShort(leftMiddle) ? 1 : 2;\n\n leftOffset = isShort(rightMiddle) ? _defaultOffset : leftMiddle - 2;\n }\n\n moves = path_helper_methods_toConsumableArray(rightMoves.slice(0, rightOffset)).concat(path_helper_methods_toConsumableArray(leftMoves.slice(leftOffset)));\n coords = path_helper_methods_toConsumableArray(rightCoords.slice(0, rightOffset)).concat(path_helper_methods_toConsumableArray(leftCoords.slice(leftOffset)));\n }\n\n var middle = moves.indexOf("L");\n var subMoves = moves.slice(0, middle);\n var subCoords = coords.slice(0, middle);\n return subMoves.map(function (m, i) {\n return {\n command: m,\n coords: subCoords[i].split(",")\n };\n });\n }; // eslint-disable-next-line max-statements\n\n\n var getBottomPath = function () {\n var bottomRight = cornerRadius.bottomRight,\n bottomLeft = cornerRadius.bottomLeft;\n var arcLength = r1 * Math.abs(end - start);\n\n var _getPathData2 = getPathData("bottom"),\n rightMoves = _getPathData2.rightMoves,\n rightCoords = _getPathData2.rightCoords,\n rightMiddle = _getPathData2.rightMiddle,\n leftMoves = _getPathData2.leftMoves,\n leftCoords = _getPathData2.leftCoords,\n leftMiddle = _getPathData2.leftMiddle;\n\n var moves;\n var coords;\n\n if (bottomRight === bottomLeft || arcLength < 2 * bottomRight + 2 * bottomLeft) {\n moves = bottomRight > bottomLeft ? rightMoves : leftMoves;\n coords = bottomRight > bottomLeft ? rightCoords : leftCoords;\n } else {\n // eslint-disable-next-line no-magic-numbers\n var isShort = function (m, middle) {\n return m.length - middle < 4;\n };\n\n var shortPath = bottomRight > bottomLeft ? isShort(rightMoves, rightMiddle) : isShort(leftMoves, leftMiddle); // eslint-disable-next-line no-magic-numbers\n\n var rightOffset = shortPath ? -1 : -3;\n moves = path_helper_methods_toConsumableArray(leftMoves.slice(0, leftMiddle + 2)).concat(path_helper_methods_toConsumableArray(rightMoves.slice(rightOffset)));\n coords = path_helper_methods_toConsumableArray(leftCoords.slice(0, leftMiddle + 2)).concat(path_helper_methods_toConsumableArray(rightCoords.slice(rightOffset)));\n }\n\n var middle = moves.indexOf("L");\n var subMoves = moves.slice(middle, -1);\n var subCoords = coords.slice(middle, -1);\n return subMoves.map(function (m, i) {\n return {\n command: m,\n coords: subCoords[i].split(",")\n };\n });\n };\n\n var topPath = getTopPath();\n var bottomPath = getBottomPath();\n\n var moves = path_helper_methods_toConsumableArray(topPath).concat(path_helper_methods_toConsumableArray(bottomPath));\n\n var path = moves.reduce(function (memo, move) {\n memo += "".concat(move.command, " ").concat(move.coords.join());\n return memo;\n }, "");\n return "".concat(path, " z");\n};\nvar getBarPath = function (props, width, cornerRadius) {\n if (props.getPath) {\n return getCustomBarPath(props, width);\n }\n\n return props.horizontal ? getHorizontalBarPath(props, width, cornerRadius) : getVerticalBarPath(props, width, cornerRadius);\n};\nvar getPolarBarPath = function (props, cornerRadius) {\n // TODO Radial bars\n return getVerticalPolarBarPath(props, cornerRadius);\n};\n;// CONCATENATED MODULE: ./node_modules/victory-bar/es/bar.js\n\n\nfunction bar_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { bar_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction bar_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nvar bar_evaluateProps = function (props) {\n /**\n * Potential evaluated props of following must be evaluated in this order:\n * 1) `style`\n * 2) `barWidth`\n * 3) `cornerRadius`\n *\n * Everything else does not have to be evaluated in a particular order:\n * `ariaLabel`\n * `desc`\n * `id`\n * `tabIndex`\n */\n var style = bar_helper_methods_getStyle(props.style, props);\n var barWidth = getBarWidth(props.barWidth, assign_default()({}, props, {\n style: style\n }));\n var cornerRadius = getCornerRadius(props.cornerRadius, assign_default()({}, props, {\n style: style,\n barWidth: barWidth\n }));\n var ariaLabel = evaluateProp(props.ariaLabel, props);\n var desc = evaluateProp(props.desc, props);\n var id = evaluateProp(props.id, props);\n var tabIndex = evaluateProp(props.tabIndex, props);\n return assign_default()({}, props, {\n ariaLabel: ariaLabel,\n style: style,\n barWidth: barWidth,\n cornerRadius: cornerRadius,\n desc: desc,\n id: id,\n tabIndex: tabIndex\n });\n};\n\nvar Bar = function (props) {\n props = bar_evaluateProps(props);\n var _props = props,\n polar = _props.polar,\n origin = _props.origin,\n style = _props.style,\n barWidth = _props.barWidth,\n cornerRadius = _props.cornerRadius;\n var path = polar ? getPolarBarPath(props, cornerRadius) : getBarPath(props, barWidth, cornerRadius);\n var defaultTransform = polar && origin ? "translate(".concat(origin.x, ", ").concat(origin.y, ")") : undefined;\n return react.cloneElement(props.pathComponent, bar_objectSpread({}, props.events, {\n "aria-label": props.ariaLabel,\n style: style,\n d: path,\n className: props.className,\n clipPath: props.clipPath,\n desc: props.desc,\n index: props.index,\n role: props.role,\n shapeRendering: props.shapeRendering,\n transform: props.transform || defaultTransform,\n tabIndex: props.tabIndex\n }));\n};\n\nBar.propTypes = bar_objectSpread({}, primitiveProps, {\n alignment: prop_types_default().oneOf(["start", "middle", "end"]),\n barRatio: (prop_types_default()).number,\n barWidth: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n cornerRadius: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func, prop_types_default().shape({\n top: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n topLeft: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n topRight: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n bottom: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n bottomLeft: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n bottomRight: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func])\n })]),\n datum: (prop_types_default()).object,\n getPath: (prop_types_default()).func,\n horizontal: (prop_types_default()).bool,\n pathComponent: (prop_types_default()).element,\n width: (prop_types_default()).number,\n x: (prop_types_default()).number,\n y: (prop_types_default()).number,\n y0: (prop_types_default()).number\n});\nBar.defaultProps = {\n defaultBarWidth: 8,\n pathComponent: react.createElement(path, null),\n role: "presentation",\n shapeRendering: "auto"\n};\n/* harmony default export */ const bar = (Bar);\n;// CONCATENATED MODULE: ./node_modules/victory-bar/es/victory-bar.js\nfunction victory_bar_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_bar_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_bar_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction victory_bar_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_bar_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_bar_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_bar_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_bar_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_bar_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_bar_assertThisInitialized(self); }\n\nfunction victory_bar_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_bar_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\n\nvar victory_bar_fallbackProps = {\n width: 450,\n height: 300,\n padding: 50\n};\nvar defaultData = [{\n x: 1,\n y: 1\n}, {\n x: 2,\n y: 2\n}, {\n x: 3,\n y: 3\n}, {\n x: 4,\n y: 4\n}];\n\nvar VictoryBar =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_bar_inherits(VictoryBar, _React$Component);\n\n function VictoryBar() {\n victory_bar_classCallCheck(this, VictoryBar);\n\n return victory_bar_possibleConstructorReturn(this, (VictoryBar.__proto__ || Object.getPrototypeOf(VictoryBar)).apply(this, arguments));\n }\n\n victory_bar_createClass(VictoryBar, [{\n key: "shouldAnimate",\n // Overridden in native versions\n value: function shouldAnimate() {\n return !!this.props.animate;\n }\n }, {\n key: "render",\n value: function render() {\n var animationWhitelist = VictoryBar.animationWhitelist,\n role = VictoryBar.role;\n var props = modifyProps(this.props, victory_bar_fallbackProps, role);\n\n if (this.shouldAnimate()) {\n return this.animateComponent(props, animationWhitelist);\n }\n\n var children = this.renderData(props);\n return props.standalone ? this.renderContainer(props.containerComponent, children) : children;\n }\n }]);\n\n return VictoryBar;\n}(react.Component);\n\nObject.defineProperty(VictoryBar, "animationWhitelist", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["data", "domain", "height", "padding", "style", "width"]\n});\nObject.defineProperty(VictoryBar, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryBar"\n});\nObject.defineProperty(VictoryBar, "role", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "bar"\n});\nObject.defineProperty(VictoryBar, "defaultTransitions", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n onLoad: {\n duration: 2000,\n before: function () {\n return {\n _y: 0,\n _y1: 0,\n _y0: 0\n };\n },\n after: function (datum) {\n return {\n _y: datum._y,\n _y1: datum._y1,\n _y0: datum._y0\n };\n }\n },\n onExit: {\n duration: 500,\n before: function () {\n return {\n _y: 0,\n yOffset: 0\n };\n }\n },\n onEnter: {\n duration: 500,\n before: function () {\n return {\n _y: 0,\n _y1: 0,\n _y0: 0\n };\n },\n after: function (datum) {\n return {\n _y: datum._y,\n _y1: datum._y1,\n _y0: datum._y0\n };\n }\n }\n }\n});\nObject.defineProperty(VictoryBar, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_bar_objectSpread({}, baseProps, dataProps, {\n alignment: prop_types_default().oneOf(["start", "middle", "end"]),\n barRatio: (prop_types_default()).number,\n barWidth: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n cornerRadius: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func, prop_types_default().shape({\n top: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n topLeft: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n topRight: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n bottom: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n bottomLeft: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n bottomRight: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func])\n })]),\n getPath: (prop_types_default()).func,\n horizontal: (prop_types_default()).bool\n })\n});\nObject.defineProperty(VictoryBar, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n containerComponent: react.createElement(VictoryContainer, null),\n data: defaultData,\n dataComponent: react.createElement(bar, null),\n groupComponent: react.createElement("g", {\n role: "presentation"\n }),\n labelComponent: react.createElement(victory_label, null),\n samples: 50,\n sortOrder: "ascending",\n standalone: true,\n theme: victory_theme.grayscale\n }\n});\nObject.defineProperty(VictoryBar, "getDomain", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: getDomainWithZero\n});\nObject.defineProperty(VictoryBar, "getData", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: data_getData\n});\nObject.defineProperty(VictoryBar, "getBaseProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return victory_bar_es_helper_methods_getBaseProps(props, victory_bar_fallbackProps);\n }\n});\nObject.defineProperty(VictoryBar, "expectedComponents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["dataComponent", "labelComponent", "groupComponent", "containerComponent"]\n});\n/* harmony default export */ const victory_bar = (add_events(VictoryBar));\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBar/ChartBar.js\n\n\n\n\n\n\nconst ChartBar = (_a) => {\n var { containerComponent = react.createElement(ChartContainer, null), themeColor, themeVariant, \n // destructure last\n theme = getTheme(themeColor, themeVariant) } = _a, rest = (0,tslib_es6.__rest)(_a, ["containerComponent", "themeColor", "themeVariant", "theme"]);\n // Clone so users can override container props\n const container = react.cloneElement(containerComponent, Object.assign({ theme }, containerComponent.props));\n // Note: containerComponent is required for theme\n return react.createElement(victory_bar, Object.assign({ containerComponent: container, theme: theme }, rest));\n};\nChartBar.displayName = \'ChartBar\';\n// Note: VictoryBar.getDomain & VictoryBar.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartBar, victory_bar);\n//# sourceMappingURL=ChartBar.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBar/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBullet/utils/chart-bullet-size.js\n\n\n\nconst scaleDimensions = ({ defaultSize, height, horizontal = true, scale = 1, value, width }) => {\n if (horizontal && height > defaultSize) {\n return value + (height - defaultSize) * scale;\n }\n else if (horizontal) {\n return value - (defaultSize - height) * scale;\n }\n else if (width > defaultSize) {\n return value + (width - defaultSize) * scale;\n }\n return value - (defaultSize - width) * scale;\n};\n// Scale bar width per the given size properties\nconst scaleBarWidth = (props) => Math.max(scaleDimensions(props), 0);\n// Scale size per the given size properties\nconst scaleSize = (_a) => {\n var { value } = _a, rest = (0,tslib_es6.__rest)(_a, ["value"]);\n return Math.round(scaleDimensions(Object.assign({ scale: 1 / value, value }, rest)));\n};\nconst getComparativeMeasureErrorWidth = ({ height, horizontal, themeColor, themeVariant, width, \n// destructure last\ntheme = getBulletComparativeErrorMeasureTheme(themeColor, themeVariant) }) => scaleBarWidth({\n defaultSize: theme.bar.height,\n height,\n horizontal,\n value: ChartBulletStyles.comparativeMeasureErrorWidth,\n width\n});\nconst getComparativeMeasureWidth = ({ height, horizontal, themeColor, themeVariant, width, \n// destructure last\ntheme = getBulletComparativeMeasureTheme(themeColor, themeVariant) }) => scaleBarWidth({\n defaultSize: theme.bar.height,\n height,\n horizontal,\n value: ChartBulletStyles.comparativeMeasureWidth,\n width\n});\nconst getComparativeMeasureWarningWidth = ({ height, horizontal, themeColor, themeVariant, width, \n// destructure last\ntheme = getBulletComparativeWarningMeasureTheme(themeColor, themeVariant) }) => scaleBarWidth({\n defaultSize: theme.bar.height,\n height,\n horizontal,\n value: ChartBulletStyles.comparativeMeasureWarningWidth,\n width\n});\nconst getPrimaryDotMeasureSize = ({ height, horizontal, themeColor, themeVariant, width, \n// destructure last\ntheme = getBulletPrimaryDotMeasureTheme(themeColor, themeVariant) }) => scaleSize({\n defaultSize: theme.group.height,\n height,\n horizontal,\n value: ChartBulletStyles.primaryDotMeasureSize,\n width\n});\nconst getPrimarySegmentedMeasureWidth = ({ height, horizontal, themeColor, themeVariant, width, \n// destructure last\ntheme = getBulletPrimarySegmentedMeasureTheme(themeColor, themeVariant) }) => scaleBarWidth({\n defaultSize: theme.group.height,\n height,\n horizontal,\n scale: 0.3,\n value: ChartBulletStyles.primarySegmentedMeasureWidth,\n width\n});\nconst getQualitativeRangeBarWidth = ({ height, horizontal, themeColor, themeVariant, width, \n// destructure last\ntheme = getBulletQualitativeRangeTheme(themeColor, themeVariant) }) => scaleBarWidth({\n defaultSize: theme.group.height,\n height,\n horizontal,\n value: ChartBulletStyles.qualitativeRangeWidth,\n width\n});\n//# sourceMappingURL=chart-bullet-size.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartUtils/chart-domain.js\n\n// Returns the min and max domain for given data\nconst chart_domain_getDomain = ({ data, maxDomain, minDomain, x, y }) => {\n // x-domain\n let xLow = 0;\n let xHigh = 0;\n let xLowSearch = true;\n let xHighSearch = true;\n if (minDomain !== undefined && minDomain.x !== undefined) {\n xLow = minDomain.x;\n xLowSearch = false;\n }\n else if (minDomain !== undefined && minDomain.y === undefined) {\n xLow = minDomain;\n xLowSearch = false;\n }\n if (maxDomain !== undefined && maxDomain.x !== undefined) {\n xHigh = maxDomain.x;\n xHighSearch = false;\n }\n else if (maxDomain !== undefined && maxDomain.y === undefined) {\n xHigh = maxDomain;\n xHighSearch = false;\n }\n // y-domain\n let yLow = 0;\n let yHigh = 0;\n let yLowSearch = true;\n let yHighSearch = true;\n if (minDomain !== undefined && minDomain.y !== undefined) {\n yLow = minDomain.y;\n yLowSearch = false;\n }\n else if (minDomain !== undefined && minDomain.x === undefined) {\n yLow = minDomain;\n yLowSearch = false;\n }\n if (maxDomain !== undefined && maxDomain.y !== undefined) {\n yHigh = maxDomain.y;\n yHighSearch = false;\n }\n else if (maxDomain !== undefined && maxDomain.x === undefined) {\n yHigh = maxDomain;\n yHighSearch = false;\n }\n // Search data for max / min range\n const datum = formatData(data, { x, y }, [\'x\', \'y\']);\n datum.forEach((dataPoint) => {\n if (xLowSearch) {\n if (dataPoint._x < xLow) {\n xLow = dataPoint._x;\n }\n }\n if (xHighSearch) {\n if (dataPoint._x > xHigh) {\n xHigh = dataPoint._x;\n }\n }\n if (yLowSearch) {\n if (dataPoint._y < yLow) {\n yLow = dataPoint._y;\n }\n }\n if (yHighSearch) {\n if (dataPoint._y > yHigh) {\n yHigh = dataPoint._y;\n }\n }\n });\n return { x: [xLow, xHigh], y: [yLow, yHigh] };\n};\nconst getDomains = ({ maxDomain, minDomain, sources }) => {\n const domains = [];\n sources.forEach(source => {\n const { data: compData = source.data } = source.component ? source.component.props : undefined;\n const domain = chart_domain_getDomain({\n data: compData,\n maxDomain,\n minDomain,\n x: source.component ? source.component.props.x : undefined,\n y: source.component ? source.component.props.y : undefined\n });\n domains.push(domain);\n });\n const xDomains = [];\n const yDomains = [];\n domains.forEach((domain) => {\n xDomains.push(...domain.x);\n yDomains.push(...domain.y);\n });\n const xLow = Math.min(...xDomains);\n const xHigh = Math.max(...xDomains);\n const yLow = Math.min(...yDomains);\n const yHigh = Math.max(...yDomains);\n return { x: [xLow, xHigh], y: [yLow, yHigh] };\n};\n//# sourceMappingURL=chart-domain.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBullet/utils/chart-bullet-domain.js\n\n// Returns the bullet chart\'s min and max domain for comparative / primary measures and qualitative range data\nconst getBulletDomain = ({ comparativeErrorMeasureComponent, comparativeErrorMeasureData, comparativeWarningMeasureComponent, comparativeWarningMeasureData, primaryDotMeasureComponent, primaryDotMeasureData, primarySegmentedMeasureComponent, primarySegmentedMeasureData, maxDomain, minDomain, qualitativeRangeComponent, qualitativeRangeData }) => {\n const domain = getDomains({\n maxDomain,\n minDomain,\n sources: [\n {\n component: comparativeErrorMeasureComponent,\n data: comparativeErrorMeasureData\n },\n {\n component: comparativeWarningMeasureComponent,\n data: comparativeWarningMeasureData\n },\n {\n component: primaryDotMeasureComponent,\n data: primaryDotMeasureData\n },\n {\n component: primarySegmentedMeasureComponent,\n data: primarySegmentedMeasureData\n },\n {\n component: qualitativeRangeComponent,\n data: qualitativeRangeData\n }\n ]\n });\n // Note that comparative measures and qualitative range bars are currently given an x-value of 1, while the bar widths\n // fill the domain. At one point, lines were used to represent comparative warning, comparative error, and zero\n // measures. Those components had x-values of 0 and 2, which rendered the lines on top of the comparative measure and\n // qualitative range bars.\n domain.x = [0, 2];\n return domain;\n};\n//# sourceMappingURL=chart-bullet-domain.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBullet/utils/chart-bullet-data.js\n\n\nconst getComparativeMeasureData = ({ data, themeColor, themeVariant, \n// destructure last\ntheme = getBulletComparativeMeasureTheme(themeColor, themeVariant), y }) => {\n const datum = [];\n formatData(data, { y }, [\'y\']).forEach((dataPoint, index) => {\n datum.push(Object.assign(Object.assign({}, dataPoint), { _index: index // Save to sync legend color\n }));\n });\n const computedData = datum.map((dataPoint) => (Object.assign(Object.assign({}, dataPoint), { x: 1, _x: 1, y0: dataPoint._y, _y0: dataPoint._y, _color: theme.bar.style.data.fill // Save to sync legend color\n })));\n return computedData;\n};\nconst getComparativeErrorMeasureData = ({ data, themeColor, themeVariant, \n// destructure last\ntheme = getBulletComparativeErrorMeasureTheme(themeColor, themeVariant), y }) => getComparativeMeasureData({\n data,\n theme,\n themeColor,\n themeVariant,\n y\n});\nconst getComparativeWarningMeasureData = ({ data, themeColor, themeVariant, \n// destructure last\ntheme = getBulletComparativeWarningMeasureTheme(themeColor, themeVariant), y }) => getComparativeMeasureData({\n data,\n theme,\n themeColor,\n themeVariant,\n y\n});\nconst getPrimaryDotMeasureData = ({ data, invert, themeColor, themeVariant, \n// destructure last\ntheme = getBulletPrimaryDotMeasureTheme(themeColor, themeVariant), y, y0 }) => getComparativeMeasureData({\n data,\n invert,\n theme,\n themeColor,\n themeVariant,\n y,\n y0\n});\nconst getPrimarySegmentedMeasureData = ({ data, invert, themeColor, themeVariant, \n// destructure last\ntheme = getBulletPrimarySegmentedMeasureTheme(themeColor, themeVariant), negativeMeasureTheme = getBulletPrimaryNegativeMeasureTheme(themeColor, themeVariant), y, y0 }) => {\n const negativeDatum = [];\n const positiveDatum = [];\n formatData(data, { y, y0 }, [\'y\', \'y0\']).forEach((dataPoint, index) => {\n if (dataPoint._y < 0) {\n negativeDatum.push(Object.assign(Object.assign({}, dataPoint), { _index: index // Save to sync legend color\n }));\n }\n else {\n positiveDatum.push(Object.assign(Object.assign({}, dataPoint), { _index: index // Save to sync legend color\n }));\n }\n });\n // Instead of relying on colorScale, colors must be added to each measure in ascending order\n const negativeComputedData = negativeDatum\n .sort((a, b) => b._y - a._y)\n .map((dataPoint, index) => (Object.assign(Object.assign({}, dataPoint), { x: 1, _x: 1, _color: invert\n ? theme.group.colorScale[index % theme.group.colorScale.length]\n : negativeMeasureTheme.group.colorScale[index % theme.group.colorScale.length] }))\n // Sort descending so largest bar is appears behind others\n )\n .reverse();\n // Instead of relying on colorScale, colors must be added to each measure in ascending order\n const positiveComputedData = positiveDatum\n .sort((a, b) => a._y - b._y)\n .map((dataPoint, index) => (Object.assign(Object.assign({}, dataPoint), { x: 1, _x: 1, _color: invert\n ? negativeMeasureTheme.group.colorScale[index % theme.group.colorScale.length]\n : theme.group.colorScale[index % theme.group.colorScale.length] }))\n // Sort descending so largest bar is appears behind others\n )\n .reverse();\n return [...negativeComputedData, ...positiveComputedData];\n};\nconst getQualitativeRangeData = ({ data, invert, themeColor, themeVariant, \n// destructure last\ntheme = getBulletQualitativeRangeTheme(themeColor, themeVariant), y, y0 }) => {\n const datum = [];\n formatData(data, { y, y0 }, [\'y\', \'y0\']).forEach((dataPoint, index) => {\n datum.push(Object.assign(Object.assign({}, dataPoint), { _index: index // Save to sync legend color\n }));\n });\n const computedData = datum\n .sort((a, b) => (invert ? b._y - a._y : a._y - b._y))\n .map((dataPoint, index) => (Object.assign(Object.assign({}, dataPoint), { x: 1, _x: 1, \n // Instead of relying on colorScale, colors must be added to each measure in ascending order\n _color: theme.group.colorScale[index % theme.group.colorScale.length] }))\n // Sort descending so largest bar is appears behind others\n )\n .reverse();\n return computedData;\n};\n//# sourceMappingURL=chart-bullet-data.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBullet/utils/chart-bullet-theme.js\n\n\nconst getLegendColorScale = (computedData, legendData) => {\n const colorScale = [];\n legendData.forEach((data, index) => {\n for (const i of computedData) {\n if (index === i._index) {\n colorScale.push(i._color);\n }\n }\n });\n return colorScale;\n};\nconst chart_bullet_theme_getColorScale = ({ comparativeErrorMeasureData, comparativeErrorMeasureLegendData, comparativeWarningMeasureData, comparativeWarningMeasureLegendData, invert, primaryDotMeasureData, primaryDotMeasureLegendData, primarySegmentedMeasureData, primarySegmentedMeasureLegendData, qualitativeRangeData, qualitativeRangeLegendData, themeColor, themeVariant }) => {\n const colorScale = [];\n if (primaryDotMeasureLegendData && primaryDotMeasureLegendData.length) {\n const computedData = getPrimaryDotMeasureData({\n data: primaryDotMeasureData,\n invert\n });\n colorScale.push(...getLegendColorScale(computedData, primaryDotMeasureLegendData));\n }\n if (primarySegmentedMeasureLegendData && primarySegmentedMeasureLegendData.length) {\n const computedData = getPrimarySegmentedMeasureData({\n data: primarySegmentedMeasureData,\n invert,\n themeColor,\n themeVariant\n });\n colorScale.push(...getLegendColorScale(computedData, primarySegmentedMeasureLegendData));\n }\n if (comparativeWarningMeasureLegendData && comparativeWarningMeasureLegendData.length) {\n const computedData = getComparativeWarningMeasureData({\n data: comparativeWarningMeasureData,\n invert,\n themeColor,\n themeVariant\n });\n colorScale.push(...getLegendColorScale(computedData, comparativeWarningMeasureLegendData));\n }\n if (comparativeErrorMeasureLegendData && comparativeErrorMeasureLegendData.length) {\n const computedData = getComparativeErrorMeasureData({\n data: comparativeErrorMeasureData,\n invert,\n themeColor,\n themeVariant\n });\n colorScale.push(...getLegendColorScale(computedData, comparativeErrorMeasureLegendData));\n }\n if (qualitativeRangeLegendData && qualitativeRangeLegendData.length) {\n const computedData = getQualitativeRangeData({\n data: qualitativeRangeData,\n invert\n });\n colorScale.push(...getLegendColorScale(computedData, qualitativeRangeLegendData));\n }\n return colorScale;\n};\n// Get bullet chart theme with legend color scale\nconst getBulletThemeWithLegendColorScale = ({ comparativeErrorMeasureData, comparativeErrorMeasureLegendData, comparativeWarningMeasureData, comparativeWarningMeasureLegendData, invert, primaryDotMeasureData, primaryDotMeasureLegendData, primarySegmentedMeasureData, primarySegmentedMeasureLegendData, qualitativeRangeData, qualitativeRangeLegendData, themeColor, themeVariant }) => {\n const colorScale = chart_bullet_theme_getColorScale({\n comparativeErrorMeasureData,\n comparativeErrorMeasureLegendData,\n comparativeWarningMeasureData,\n comparativeWarningMeasureLegendData,\n invert,\n primaryDotMeasureData,\n primaryDotMeasureLegendData,\n primarySegmentedMeasureData,\n primarySegmentedMeasureLegendData,\n qualitativeRangeData,\n qualitativeRangeLegendData,\n themeColor,\n themeVariant\n });\n const theme = getBulletTheme(themeColor, themeVariant);\n theme.legend.colorScale = [...colorScale];\n return theme;\n};\n//# sourceMappingURL=chart-bullet-theme.js.map\n;// CONCATENATED MODULE: ./node_modules/victory-tooltip/es/flyout.js\n\n\n\nfunction flyout_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { flyout_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction flyout_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/*eslint no-magic-numbers: ["error", { "ignore": [-1, 0, 1, 2] }]*/\n\n\n\n\nvar getVerticalPath = function (props) {\n var pointerWidth = props.pointerWidth,\n cornerRadius = props.cornerRadius,\n orientation = props.orientation,\n width = props.width,\n height = props.height,\n center = props.center;\n var sign = orientation === "bottom" ? 1 : -1;\n var x = props.x + (props.dx || 0);\n var y = props.y + (props.dy || 0);\n var centerX = isPlainObject_default()(center) && center.x;\n var centerY = isPlainObject_default()(center) && center.y;\n var pointerEdge = centerY + sign * (height / 2);\n var oppositeEdge = centerY - sign * (height / 2);\n var rightEdge = centerX + width / 2;\n var leftEdge = centerX - width / 2;\n var pointerLength = sign * (y - pointerEdge) < 0 ? 0 : props.pointerLength;\n var direction = orientation === "bottom" ? "0 0 0" : "0 0 1";\n var arc = "".concat(cornerRadius, " ").concat(cornerRadius, " ").concat(direction);\n return "M ".concat(centerX - pointerWidth / 2, ", ").concat(pointerEdge, "\\n L ").concat(pointerLength ? x : centerX + pointerWidth / 2, ", ").concat(pointerLength ? y : pointerEdge, "\\n L ").concat(centerX + pointerWidth / 2, ", ").concat(pointerEdge, "\\n L ").concat(rightEdge - cornerRadius, ", ").concat(pointerEdge, "\\n A ").concat(arc, " ").concat(rightEdge, ", ").concat(pointerEdge - sign * cornerRadius, "\\n L ").concat(rightEdge, ", ").concat(oppositeEdge + sign * cornerRadius, "\\n A ").concat(arc, " ").concat(rightEdge - cornerRadius, ", ").concat(oppositeEdge, "\\n L ").concat(leftEdge + cornerRadius, ", ").concat(oppositeEdge, "\\n A ").concat(arc, " ").concat(leftEdge, ", ").concat(oppositeEdge + sign * cornerRadius, "\\n L ").concat(leftEdge, ", ").concat(pointerEdge - sign * cornerRadius, "\\n A ").concat(arc, " ").concat(leftEdge + cornerRadius, ", ").concat(pointerEdge, "\\n z");\n};\n\nvar getHorizontalPath = function (props) {\n var pointerWidth = props.pointerWidth,\n cornerRadius = props.cornerRadius,\n orientation = props.orientation,\n width = props.width,\n height = props.height,\n center = props.center;\n var sign = orientation === "left" ? 1 : -1;\n var x = props.x + (props.dx || 0);\n var y = props.y + (props.dy || 0);\n var centerX = isPlainObject_default()(center) && center.x;\n var centerY = isPlainObject_default()(center) && center.y;\n var pointerEdge = centerX - sign * (width / 2);\n var oppositeEdge = centerX + sign * (width / 2);\n var bottomEdge = centerY + height / 2;\n var topEdge = centerY - height / 2;\n var pointerLength = sign * (x - pointerEdge) > 0 ? 0 : props.pointerLength;\n var direction = orientation === "left" ? "0 0 0" : "0 0 1";\n var arc = "".concat(cornerRadius, " ").concat(cornerRadius, " ").concat(direction);\n return "M ".concat(pointerEdge, ", ").concat(centerY - pointerWidth / 2, "\\n L ").concat(pointerLength ? x : pointerEdge, ", ").concat(pointerLength ? y : centerY + pointerWidth / 2, "\\n L ").concat(pointerEdge, ", ").concat(centerY + pointerWidth / 2, "\\n L ").concat(pointerEdge, ", ").concat(bottomEdge - cornerRadius, "\\n A ").concat(arc, " ").concat(pointerEdge + sign * cornerRadius, ", ").concat(bottomEdge, "\\n L ").concat(oppositeEdge - sign * cornerRadius, ", ").concat(bottomEdge, "\\n A ").concat(arc, " ").concat(oppositeEdge, ", ").concat(bottomEdge - cornerRadius, "\\n L ").concat(oppositeEdge, ", ").concat(topEdge + cornerRadius, "\\n A ").concat(arc, " ").concat(oppositeEdge - sign * cornerRadius, ", ").concat(topEdge, "\\n L ").concat(pointerEdge + sign * cornerRadius, ", ").concat(topEdge, "\\n A ").concat(arc, " ").concat(pointerEdge, ", ").concat(topEdge + cornerRadius, "\\n z");\n};\n\nvar getFlyoutPath = function (props) {\n var orientation = props.orientation || "top";\n return orientation === "left" || orientation === "right" ? getHorizontalPath(props) : getVerticalPath(props);\n};\n\nvar flyout_evaluateProps = function (props) {\n /**\n * Potential evaluated props are:\n * `id`\n * `style`\n */\n var id = evaluateProp(props.id, props);\n var style = evaluateStyle(props.style, props);\n return assign_default()({}, props, {\n id: id,\n style: style\n });\n};\n\nvar Flyout = function (props) {\n props = flyout_evaluateProps(props);\n return react.cloneElement(props.pathComponent, flyout_objectSpread({}, props.events, {\n style: props.style,\n d: getFlyoutPath(props),\n className: props.className,\n shapeRendering: props.shapeRendering,\n role: props.role,\n transform: props.transform,\n clipPath: props.clipPath\n }));\n};\n\nFlyout.propTypes = flyout_objectSpread({}, primitiveProps, {\n center: prop_types_default().shape({\n x: (prop_types_default()).number,\n y: (prop_types_default()).number\n }),\n cornerRadius: (prop_types_default()).number,\n datum: (prop_types_default()).object,\n dx: (prop_types_default()).number,\n dy: (prop_types_default()).number,\n height: (prop_types_default()).number,\n orientation: prop_types_default().oneOf(["top", "bottom", "left", "right"]),\n pathComponent: (prop_types_default()).element,\n pointerLength: (prop_types_default()).number,\n pointerWidth: (prop_types_default()).number,\n width: (prop_types_default()).number,\n x: (prop_types_default()).number,\n y: (prop_types_default()).number\n});\nFlyout.defaultProps = {\n pathComponent: react.createElement(path, null),\n role: "presentation",\n shapeRendering: "auto"\n};\n/* harmony default export */ const flyout = (Flyout);\n;// CONCATENATED MODULE: ./node_modules/victory-tooltip/es/victory-tooltip.js\n\n\n\n\n\n\nfunction victory_tooltip_toConsumableArray(arr) { return victory_tooltip_arrayWithoutHoles(arr) || victory_tooltip_iterableToArray(arr) || victory_tooltip_nonIterableSpread(); }\n\nfunction victory_tooltip_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_tooltip_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_tooltip_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction victory_tooltip_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_tooltip_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_tooltip_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_tooltip_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_tooltip_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_tooltip_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_tooltip_assertThisInitialized(self); }\n\nfunction victory_tooltip_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_tooltip_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\nvar victory_tooltip_fallbackProps = {\n cornerRadius: 5,\n pointerLength: 10,\n pointerWidth: 10\n};\n\nvar VictoryTooltip =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_tooltip_inherits(VictoryTooltip, _React$Component);\n\n function VictoryTooltip(props) {\n var _this;\n\n victory_tooltip_classCallCheck(this, VictoryTooltip);\n\n _this = victory_tooltip_possibleConstructorReturn(this, (VictoryTooltip.__proto__ || Object.getPrototypeOf(VictoryTooltip)).call(this, props));\n _this.id = props.id === undefined ? uniqueId_default()("tooltip-") : props.id;\n return _this;\n }\n\n victory_tooltip_createClass(VictoryTooltip, [{\n key: "getDefaultOrientation",\n value: function getDefaultOrientation(props) {\n var datum = props.datum,\n horizontal = props.horizontal,\n polar = props.polar;\n\n if (!polar) {\n var positive = horizontal ? "right" : "top";\n var negative = horizontal ? "left" : "bottom";\n return datum && datum.y < 0 ? negative : positive;\n } else {\n return this.getPolarOrientation(props, datum);\n }\n }\n }, {\n key: "getPolarOrientation",\n value: function getPolarOrientation(props, datum) {\n var degrees = getDegrees(props, datum);\n var placement = props.labelPlacement || "vertical";\n\n if (placement === " vertical") {\n return this.getVerticalOrientations(degrees);\n } else if (placement === "parallel") {\n return degrees < 90 || degrees > 270 ? "right" : "left";\n } else {\n return degrees > 180 ? "bottom" : "top";\n }\n }\n }, {\n key: "getVerticalOrientations",\n value: function getVerticalOrientations(degrees) {\n // eslint-disable-next-line no-magic-numbers\n if (degrees < 45 || degrees > 315) {\n return "right"; // eslint-disable-next-line no-magic-numbers\n } else if (degrees >= 45 && degrees <= 135) {\n return "top"; // eslint-disable-next-line no-magic-numbers\n } else if (degrees > 135 && degrees < 225) {\n return "left";\n } else {\n return "bottom";\n }\n }\n }, {\n key: "getStyles",\n value: function getStyles(props) {\n var theme = props.theme || victory_theme.grayscale;\n var defaultLabelStyles = theme && theme.tooltip && theme.tooltip.style ? theme.tooltip.style : {};\n var baseLabelStyle = Array.isArray(props.style) ? props.style.map(function (s) {\n return defaults_default()({}, s, defaultLabelStyles);\n }) : defaults_default()({}, props.style, defaultLabelStyles);\n var defaultFlyoutStyles = theme && theme.tooltip && theme.tooltip.flyoutStyle ? theme.tooltip.flyoutStyle : {};\n var baseFlyoutStyle = props.flyoutStyle ? defaults_default()({}, props.flyoutStyle, defaultFlyoutStyles) : defaultFlyoutStyles;\n var style = Array.isArray(baseLabelStyle) ? baseLabelStyle.map(function (s) {\n return evaluateStyle(s, props);\n }) : evaluateStyle(baseLabelStyle, props);\n var flyoutStyle = evaluateStyle(baseFlyoutStyle, assign_default()({}, props, {\n style: style\n }));\n return {\n style: style,\n flyoutStyle: flyoutStyle\n };\n }\n }, {\n key: "getEvaluatedProps",\n value: function getEvaluatedProps(props) {\n var cornerRadius = props.cornerRadius,\n centerOffset = props.centerOffset,\n dx = props.dx,\n dy = props.dy;\n var active = evaluateProp(props.active, props);\n var text = evaluateProp(props.text, assign_default()({}, props, {\n active: active\n }));\n\n var _getStyles = this.getStyles(assign_default()({}, props, {\n active: active,\n text: text\n })),\n style = _getStyles.style,\n flyoutStyle = _getStyles.flyoutStyle;\n\n var orientation = evaluateProp(props.orientation, assign_default()({}, props, {\n active: active,\n text: text,\n style: style,\n flyoutStyle: flyoutStyle\n })) || this.getDefaultOrientation(props);\n var padding = evaluateProp(props.flyoutPadding, assign_default()({}, props, {\n active: active,\n text: text,\n style: style,\n flyoutStyle: flyoutStyle,\n orientation: orientation\n })) || this.getLabelPadding(style);\n var flyoutPadding = helpers_getPadding({\n padding: padding\n });\n var pointerWidth = evaluateProp(props.pointerWidth, assign_default()({}, props, {\n active: active,\n text: text,\n style: style,\n flyoutStyle: flyoutStyle,\n orientation: orientation\n }));\n var pointerLength = evaluateProp(props.pointerLength, assign_default()({}, props, {\n active: active,\n text: text,\n style: style,\n flyoutStyle: flyoutStyle,\n orientation: orientation\n }));\n var labelSize = approximateTextSize(text, style);\n\n var _getDimensions = this.getDimensions(assign_default()({}, props, {\n style: style,\n flyoutStyle: flyoutStyle,\n active: active,\n text: text,\n orientation: orientation,\n flyoutPadding: flyoutPadding,\n pointerWidth: pointerWidth,\n pointerLength: pointerLength\n }), labelSize),\n flyoutHeight = _getDimensions.flyoutHeight,\n flyoutWidth = _getDimensions.flyoutWidth;\n\n var evaluatedProps = assign_default()({}, props, {\n active: active,\n text: text,\n style: style,\n flyoutStyle: flyoutStyle,\n orientation: orientation,\n flyoutHeight: flyoutHeight,\n flyoutWidth: flyoutWidth,\n flyoutPadding: flyoutPadding,\n pointerWidth: pointerWidth,\n pointerLength: pointerLength\n });\n\n var offsetX = isPlainObject_default()(centerOffset) && centerOffset.x !== undefined ? evaluateProp(centerOffset.x, evaluatedProps) : 0;\n var offsetY = isPlainObject_default()(centerOffset) && centerOffset.y !== undefined ? evaluateProp(centerOffset.y, evaluatedProps) : 0;\n return assign_default()({}, evaluatedProps, {\n centerOffset: {\n x: offsetX,\n y: offsetY\n },\n dx: dx !== undefined ? evaluateProp(dx, evaluatedProps) : 0,\n dy: dy !== undefined ? evaluateProp(dy, evaluatedProps) : 0,\n cornerRadius: evaluateProp(cornerRadius, evaluatedProps)\n });\n }\n }, {\n key: "getCalculatedValues",\n value: function getCalculatedValues(props) {\n var style = props.style,\n text = props.text,\n flyoutStyle = props.flyoutStyle,\n flyoutHeight = props.flyoutHeight,\n flyoutWidth = props.flyoutWidth;\n var labelSize = approximateTextSize(text, style);\n var flyoutDimensions = {\n height: flyoutHeight,\n width: flyoutWidth\n };\n var flyoutCenter = this.getFlyoutCenter(props, flyoutDimensions);\n var transform = this.getTransform(props);\n return {\n style: style,\n flyoutStyle: flyoutStyle,\n labelSize: labelSize,\n flyoutDimensions: flyoutDimensions,\n flyoutCenter: flyoutCenter,\n transform: transform\n };\n }\n }, {\n key: "getTransform",\n value: function getTransform(props) {\n var x = props.x,\n y = props.y,\n style = props.style;\n var labelStyle = style || {};\n var angle = labelStyle.angle || props.angle || this.getDefaultAngle(props);\n return angle ? "rotate(".concat(angle, " ").concat(x, " ").concat(y, ")") : undefined;\n } // eslint-disable-next-line complexity\n\n }, {\n key: "getDefaultAngle",\n value: function getDefaultAngle(props) {\n var polar = props.polar,\n labelPlacement = props.labelPlacement,\n orientation = props.orientation,\n datum = props.datum;\n\n if (!polar || !labelPlacement || labelPlacement === "vertical") {\n return 0;\n }\n\n var degrees = getDegrees(props, datum);\n var sign = degrees > 90 && degrees < 180 || degrees > 270 ? 1 : -1;\n var labelRotation = labelPlacement === "perpendicular" ? 0 : 90;\n var angle;\n\n if (degrees === 0 || degrees === 180) {\n angle = orientation === "top" && degrees === 180 ? 270 : 90;\n } else if (degrees > 0 && degrees < 180) {\n angle = 90 - degrees;\n } else if (degrees > 180 && degrees < 360) {\n angle = 270 - degrees;\n }\n\n return angle + sign * labelRotation;\n }\n }, {\n key: "constrainTooltip",\n value: function constrainTooltip(center, props, dimensions) {\n var x = center.x,\n y = center.y;\n var width = dimensions.width,\n height = dimensions.height;\n var extent = {\n x: [0, props.width],\n y: [0, props.height]\n };\n var flyoutExtent = {\n x: [x - width / 2, x + width / 2],\n y: [y - height / 2, y + height / 2]\n };\n var adjustments = {\n x: [flyoutExtent.x[0] < extent.x[0] ? extent.x[0] - flyoutExtent.x[0] : 0, flyoutExtent.x[1] > extent.x[1] ? flyoutExtent.x[1] - extent.x[1] : 0],\n y: [flyoutExtent.y[0] < extent.y[0] ? extent.y[0] - flyoutExtent.y[0] : 0, flyoutExtent.y[1] > extent.y[1] ? flyoutExtent.y[1] - extent.y[1] : 0]\n };\n return {\n x: Math.round(x + adjustments.x[0] - adjustments.x[1]),\n y: Math.round(y + adjustments.y[0] - adjustments.y[1])\n };\n } // eslint-disable-next-line complexity\n\n }, {\n key: "getFlyoutCenter",\n value: function getFlyoutCenter(props, dimensions) {\n var x = props.x,\n y = props.y,\n dx = props.dx,\n dy = props.dy,\n pointerLength = props.pointerLength,\n orientation = props.orientation,\n constrainToVisibleArea = props.constrainToVisibleArea,\n centerOffset = props.centerOffset;\n var height = dimensions.height,\n width = dimensions.width;\n var xSign = orientation === "left" ? -1 : 1;\n var ySign = orientation === "bottom" ? -1 : 1;\n var flyoutCenter = {\n x: orientation === "left" || orientation === "right" ? x + xSign * (pointerLength + width / 2 + xSign * dx) : x + dx,\n y: orientation === "top" || orientation === "bottom" ? y - ySign * (pointerLength + height / 2 - ySign * dy) : y + dy\n };\n var center = {\n x: isPlainObject_default()(props.center) && props.center.x !== undefined ? props.center.x : flyoutCenter.x,\n y: isPlainObject_default()(props.center) && props.center.y !== undefined ? props.center.y : flyoutCenter.y\n };\n var centerWithOffset = {\n x: center.x + centerOffset.x,\n y: center.y + centerOffset.y\n };\n return constrainToVisibleArea ? this.constrainTooltip(centerWithOffset, props, dimensions) : centerWithOffset;\n }\n }, {\n key: "getLabelPadding",\n value: function getLabelPadding(style) {\n if (!style) {\n return 0;\n }\n\n var paddings = Array.isArray(style) ? style.map(function (s) {\n return s.padding;\n }) : [style.padding];\n return Math.max.apply(Math, victory_tooltip_toConsumableArray(paddings).concat([0]));\n }\n }, {\n key: "getDimensions",\n value: function getDimensions(props, labelSize) {\n var orientation = props.orientation,\n pointerLength = props.pointerLength,\n pointerWidth = props.pointerWidth,\n flyoutHeight = props.flyoutHeight,\n flyoutWidth = props.flyoutWidth,\n flyoutPadding = props.flyoutPadding;\n var cornerRadius = evaluateProp(props.cornerRadius, props);\n\n var getHeight = function () {\n var calculatedHeight = labelSize.height + flyoutPadding.top + flyoutPadding.bottom;\n var minHeight = orientation === "top" || orientation === "bottom" ? 2 * cornerRadius : 2 * cornerRadius + pointerWidth;\n return Math.max(minHeight, calculatedHeight);\n };\n\n var getWidth = function () {\n var calculatedWidth = labelSize.width + flyoutPadding.left + flyoutPadding.right;\n var minWidth = orientation === "left" || orientation === "right" ? 2 * cornerRadius + pointerLength : 2 * cornerRadius;\n return Math.max(minWidth, calculatedWidth);\n };\n\n return {\n flyoutHeight: flyoutHeight ? evaluateProp(flyoutHeight, props) : getHeight(props, labelSize, orientation),\n flyoutWidth: flyoutWidth ? evaluateProp(flyoutWidth, props) : getWidth(props, labelSize, orientation)\n };\n }\n }, {\n key: "getLabelProps",\n value: function getLabelProps(props, calculatedValues) {\n var flyoutCenter = calculatedValues.flyoutCenter,\n style = calculatedValues.style,\n labelSize = calculatedValues.labelSize,\n _calculatedValues$dy = calculatedValues.dy,\n dy = _calculatedValues$dy === void 0 ? 0 : _calculatedValues$dy,\n _calculatedValues$dx = calculatedValues.dx,\n dx = _calculatedValues$dx === void 0 ? 0 : _calculatedValues$dx;\n var text = props.text,\n datum = props.datum,\n activePoints = props.activePoints,\n labelComponent = props.labelComponent,\n index = props.index,\n flyoutPadding = props.flyoutPadding;\n var textAnchor = (Array.isArray(style) && style.length ? style[0].textAnchor : style.textAnchor) || "middle";\n\n var getLabelX = function () {\n if (!textAnchor || textAnchor === "middle") {\n return flyoutCenter.x;\n }\n\n var sign = textAnchor === "end" ? -1 : 1;\n return flyoutCenter.x - sign * (labelSize.width / 2);\n };\n\n return defaults_default()({}, labelComponent.props, {\n key: "".concat(this.id, "-label-").concat(index),\n text: text,\n datum: datum,\n activePoints: activePoints,\n textAnchor: textAnchor,\n dy: dy,\n dx: dx,\n style: style,\n x: getLabelX() + (flyoutPadding.left - flyoutPadding.right) / 2,\n y: flyoutCenter.y + (flyoutPadding.top - flyoutPadding.bottom) / 2,\n verticalAnchor: "middle",\n angle: style.angle\n });\n }\n }, {\n key: "getPointerOrientation",\n value: function getPointerOrientation(point, center, flyoutDimensions) {\n var edges = {\n bottom: center.y + flyoutDimensions.height / 2,\n top: center.y - flyoutDimensions.height / 2,\n left: center.x - flyoutDimensions.width / 2,\n right: center.x + flyoutDimensions.width / 2\n };\n var gaps = [{\n side: "top",\n val: edges.top > point.y ? edges.top - point.y : -1\n }, {\n side: "bottom",\n val: edges.bottom < point.y ? point.y - edges.bottom : -1\n }, {\n side: "right",\n val: edges.right < point.x ? point.x - edges.right : -1\n }, {\n side: "left",\n val: edges.left > point.x ? edges.left - point.x : -1\n }];\n return orderBy_default()(gaps, "val", "desc")[0].side;\n }\n }, {\n key: "getFlyoutProps",\n value: function getFlyoutProps(props, calculatedValues) {\n var flyoutDimensions = calculatedValues.flyoutDimensions,\n flyoutStyle = calculatedValues.flyoutStyle,\n flyoutCenter = calculatedValues.flyoutCenter;\n var x = props.x,\n y = props.y,\n dx = props.dx,\n dy = props.dy,\n datum = props.datum,\n activePoints = props.activePoints,\n index = props.index,\n pointerLength = props.pointerLength,\n pointerWidth = props.pointerWidth,\n cornerRadius = props.cornerRadius,\n events = props.events,\n flyoutComponent = props.flyoutComponent;\n var pointerOrientation = evaluateProp(props.pointerOrientation, props);\n return defaults_default()({}, flyoutComponent.props, {\n x: x,\n y: y,\n dx: dx,\n dy: dy,\n datum: datum,\n activePoints: activePoints,\n index: index,\n pointerLength: pointerLength,\n pointerWidth: pointerWidth,\n cornerRadius: cornerRadius,\n events: events,\n orientation: pointerOrientation || this.getPointerOrientation({\n x: x,\n y: y\n }, flyoutCenter, flyoutDimensions),\n key: "".concat(this.id, "-tooltip-").concat(index),\n width: flyoutDimensions.width,\n height: flyoutDimensions.height,\n style: flyoutStyle,\n center: flyoutCenter\n });\n } // Overridden in victory-core-native\n\n }, {\n key: "renderTooltip",\n value: function renderTooltip(props) {\n var active = evaluateProp(props.active, props);\n var renderInPortal = props.renderInPortal;\n\n if (!active) {\n return renderInPortal ? react.createElement(VictoryPortal, null, null) : null;\n }\n\n var evaluatedProps = this.getEvaluatedProps(props);\n var flyoutComponent = evaluatedProps.flyoutComponent,\n labelComponent = evaluatedProps.labelComponent,\n groupComponent = evaluatedProps.groupComponent;\n var calculatedValues = this.getCalculatedValues(evaluatedProps);\n var children = [react.cloneElement(flyoutComponent, this.getFlyoutProps(evaluatedProps, calculatedValues)), react.cloneElement(labelComponent, this.getLabelProps(evaluatedProps, calculatedValues))];\n var tooltip = react.cloneElement(groupComponent, {\n role: "presentation",\n transform: calculatedValues.transform\n }, children);\n return renderInPortal ? react.createElement(VictoryPortal, null, tooltip) : tooltip;\n }\n }, {\n key: "render",\n value: function render() {\n var props = modifyProps(this.props, victory_tooltip_fallbackProps, "tooltip");\n return this.renderTooltip(props);\n }\n }]);\n\n return VictoryTooltip;\n}(react.Component);\n\nObject.defineProperty(VictoryTooltip, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryTooltip"\n});\nObject.defineProperty(VictoryTooltip, "role", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "tooltip"\n});\nObject.defineProperty(VictoryTooltip, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n activateData: (prop_types_default()).bool,\n active: prop_types_default().oneOfType([(prop_types_default()).bool, (prop_types_default()).func]),\n activePoints: (prop_types_default()).array,\n angle: (prop_types_default()).number,\n center: prop_types_default().shape({\n x: nonNegative,\n y: nonNegative\n }),\n centerOffset: prop_types_default().shape({\n x: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n y: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func])\n }),\n constrainToVisibleArea: (prop_types_default()).bool,\n cornerRadius: prop_types_default().oneOfType([nonNegative, (prop_types_default()).func]),\n data: (prop_types_default()).array,\n datum: (prop_types_default()).object,\n dx: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n dy: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n events: (prop_types_default()).object,\n flyoutComponent: (prop_types_default()).element,\n flyoutHeight: prop_types_default().oneOfType([nonNegative, (prop_types_default()).func]),\n flyoutPadding: prop_types_default().oneOfType([(prop_types_default()).func, (prop_types_default()).number, prop_types_default().shape({\n top: (prop_types_default()).number,\n bottom: (prop_types_default()).number,\n left: (prop_types_default()).number,\n right: (prop_types_default()).number\n })]),\n flyoutStyle: (prop_types_default()).object,\n flyoutWidth: prop_types_default().oneOfType([nonNegative, (prop_types_default()).func]),\n groupComponent: (prop_types_default()).element,\n height: (prop_types_default()).number,\n horizontal: (prop_types_default()).bool,\n id: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string]),\n index: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).string]),\n labelComponent: (prop_types_default()).element,\n orientation: prop_types_default().oneOfType([prop_types_default().oneOf(["top", "bottom", "left", "right"]), (prop_types_default()).func]),\n pointerLength: prop_types_default().oneOfType([nonNegative, (prop_types_default()).func]),\n pointerOrientation: prop_types_default().oneOfType([prop_types_default().oneOf(["top", "bottom", "left", "right"]), (prop_types_default()).func]),\n pointerWidth: prop_types_default().oneOfType([nonNegative, (prop_types_default()).func]),\n polar: (prop_types_default()).bool,\n renderInPortal: (prop_types_default()).bool,\n scale: prop_types_default().shape({\n x: scale,\n y: scale\n }),\n style: prop_types_default().oneOfType([(prop_types_default()).object, (prop_types_default()).array]),\n text: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).number, (prop_types_default()).func, (prop_types_default()).array]),\n theme: (prop_types_default()).object,\n width: (prop_types_default()).number,\n x: (prop_types_default()).number,\n y: (prop_types_default()).number\n }\n});\nObject.defineProperty(VictoryTooltip, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n active: false,\n renderInPortal: true,\n labelComponent: react.createElement(victory_label, null),\n flyoutComponent: react.createElement(flyout, null),\n groupComponent: react.createElement("g", null)\n }\n});\nObject.defineProperty(VictoryTooltip, "defaultEvents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n var activate = props.activateData ? [{\n target: "labels",\n mutation: function () {\n return {\n active: true\n };\n }\n }, {\n target: "data",\n mutation: function () {\n return {\n active: true\n };\n }\n }] : [{\n target: "labels",\n mutation: function () {\n return {\n active: true\n };\n }\n }];\n var deactivate = props.activateData ? [{\n target: "labels",\n mutation: function () {\n return {\n active: undefined\n };\n }\n }, {\n target: "data",\n mutation: function () {\n return {\n active: undefined\n };\n }\n }] : [{\n target: "labels",\n mutation: function () {\n return {\n active: undefined\n };\n }\n }];\n return [{\n target: "data",\n eventHandlers: {\n onMouseOver: function () {\n return activate;\n },\n onFocus: function () {\n return activate;\n },\n onTouchStart: function () {\n return activate;\n },\n onMouseOut: function () {\n return deactivate;\n },\n onBlur: function () {\n return deactivate;\n },\n onTouchEnd: function () {\n return deactivate;\n }\n }\n }];\n }\n});\n\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTooltip/ChartTooltip.js\n\n\n\n\n\n\nconst ChartTooltip = (_a) => {\n var { constrainToVisibleArea = false, labelComponent = react.createElement(ChartLabel, null), // Note that Victory provides its own label component here\n labelTextAnchor, themeColor, themeVariant, \n // destructure last\n theme = getTheme(themeColor, themeVariant) } = _a, rest = (0,tslib_es6.__rest)(_a, ["constrainToVisibleArea", "labelComponent", "labelTextAnchor", "themeColor", "themeVariant", "theme"]);\n const chartLabelComponent = react.cloneElement(labelComponent, Object.assign({ textAnchor: labelTextAnchor, theme }, labelComponent.props));\n return (react.createElement(VictoryTooltip, Object.assign({ constrainToVisibleArea: constrainToVisibleArea, labelComponent: chartLabelComponent, theme: theme }, rest)));\n};\nChartTooltip.displayName = \'ChartTooltip\';\n// Note: VictoryTooltip.defaultEvents must be hoisted\nhoist_non_react_statics_cjs_default()(ChartTooltip, VictoryTooltip);\n//# sourceMappingURL=ChartTooltip.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBullet/ChartBulletComparativeMeasure.js\n\n\n\n\n\n\n\n\n\nconst ChartBulletComparativeMeasure = ({ allowTooltip = true, ariaDesc, ariaTitle, barWidth = ChartBulletStyles.comparativeMeasureWidth, constrainToVisibleArea = false, data, domain, horizontal = true, labels, measureComponent = react.createElement(ChartBar, null), // Using bar instead of line for tooltip functionality\npadding, standalone = true, themeColor, themeVariant, y, \n// destructure last\ntheme = getBulletComparativeMeasureTheme(themeColor, themeVariant), height = theme.bar.height, width = theme.bar.width, labelComponent = react.createElement(ChartTooltip, null) }) => {\n const computedData = getComparativeMeasureData({\n data,\n theme,\n y\n });\n // Label component\n //\n // Note: SVG height and width are provided by ChartBullet as a workaround to support constrainToVisibleArea\n const tooltip = react.cloneElement(labelComponent, Object.assign({ constrainToVisibleArea, dx: () => {\n if (horizontal) {\n return 0;\n }\n const result = typeof barWidth === \'function\' ? barWidth(data) : barWidth;\n return result / 2;\n }, dy: () => {\n if (!horizontal) {\n return 0;\n }\n const result = typeof barWidth === \'function\' ? barWidth(data) : barWidth;\n return -(result / 2);\n }, orientation: \'top\' }, labelComponent.props));\n const measure = computedData.map((dataPoint, index) => react.cloneElement(measureComponent, Object.assign({ barWidth, data: [Object.assign({}, dataPoint)], domain,\n height,\n horizontal, labelComponent: allowTooltip ? tooltip : undefined, labels, key: `pf-chart-bullet-comparative-measure-${index}`, padding, standalone: false, theme,\n width }, measureComponent.props)));\n return standalone ? (react.createElement(ChartContainer, { desc: ariaDesc, height: height, title: ariaTitle, width: width }, measure)) : (react.createElement(react.Fragment, null, measure));\n};\nChartBulletComparativeMeasure.displayName = \'ChartBulletComparativeMeasure\';\n// Note: VictoryBar.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartBulletComparativeMeasure, victory_bar);\n//# sourceMappingURL=ChartBulletComparativeMeasure.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBullet/ChartBulletComparativeErrorMeasure.js\n\n\n\n\n\n\nconst ChartBulletComparativeErrorMeasure = ({ allowTooltip = true, ariaDesc, ariaTitle, barWidth, constrainToVisibleArea = false, data, domain, horizontal = true, labelComponent, labels, measureComponent = react.createElement(ChartBulletComparativeMeasure, null), padding, standalone = true, themeColor, themeVariant, y, \n// destructure last\ntheme = getBulletComparativeErrorMeasureTheme(themeColor, themeVariant), height = theme.bar.height, width = theme.bar.width }) => {\n // Comparative measure component\n const measure = react.cloneElement(measureComponent, Object.assign({ allowTooltip,\n ariaDesc,\n ariaTitle,\n barWidth,\n constrainToVisibleArea,\n data,\n domain,\n height,\n horizontal,\n labelComponent,\n labels,\n padding, standalone: false, theme,\n width,\n y }, measureComponent.props));\n return standalone ? (react.createElement(ChartContainer, { desc: ariaDesc, height: height, title: ariaTitle, width: width }, measure)) : (react.createElement(react.Fragment, null, measure));\n};\nChartBulletComparativeErrorMeasure.displayName = \'ChartBulletComparativeErrorMeasure\';\n// Note: VictoryBar.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartBulletComparativeErrorMeasure, victory_bar);\n//# sourceMappingURL=ChartBulletComparativeErrorMeasure.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBullet/ChartBulletComparativeWarningMeasure.js\n\n\n\n\n\n\nconst ChartBulletComparativeWarningMeasure = ({ allowTooltip = true, ariaDesc, ariaTitle, barWidth, constrainToVisibleArea = false, data, domain, horizontal = true, labelComponent, labels, measureComponent = react.createElement(ChartBulletComparativeMeasure, null), padding, standalone = true, themeColor, themeVariant, y, \n// destructure last\ntheme = getBulletComparativeWarningMeasureTheme(themeColor, themeVariant), height = theme.bar.height, width = theme.bar.width }) => {\n // Comparative measure component\n const measure = react.cloneElement(measureComponent, Object.assign({ allowTooltip,\n ariaDesc,\n ariaTitle,\n barWidth,\n constrainToVisibleArea,\n data,\n domain,\n height,\n horizontal,\n labelComponent,\n labels,\n padding, standalone: false, theme,\n width,\n y }, measureComponent.props));\n return standalone ? (react.createElement(ChartContainer, { desc: ariaDesc, height: height, title: ariaTitle, width: width }, measure)) : (react.createElement(react.Fragment, null, measure));\n};\nChartBulletComparativeWarningMeasure.displayName = \'ChartBulletComparativeWarningMeasure\';\n// Note: VictoryBar.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartBulletComparativeWarningMeasure, victory_bar);\n//# sourceMappingURL=ChartBulletComparativeWarningMeasure.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBullet/ChartBulletGroupTitle.js\n\n\n\n\n\n\nconst ChartBulletGroupTitle = ({ ariaDesc, ariaTitle, capHeight = 1.1, dividerComponent = react.createElement(line, null), padding, standalone = true, subTitle, themeColor, themeVariant, title, titleComponent = react.createElement(ChartLabel, null), \n// destructure last\ntheme = getBulletGroupTitleTheme(themeColor, themeVariant), height = theme.chart.height, width = theme.chart.width }) => {\n const defaultPadding = {\n bottom: getPaddingForSide(\'bottom\', padding, theme.chart.padding),\n left: getPaddingForSide(\'left\', padding, theme.chart.padding),\n right: getPaddingForSide(\'right\', padding, theme.chart.padding),\n top: getPaddingForSide(\'top\', padding, theme.chart.padding)\n };\n const labelPadding = {\n bottom: getPaddingForSide(\'bottom\', padding, Number(theme.legend.style.labels.padding)),\n left: getPaddingForSide(\'left\', padding, Number(theme.legend.style.labels.padding)),\n right: getPaddingForSide(\'right\', padding, Number(theme.legend.style.labels.padding)),\n top: getPaddingForSide(\'top\', padding, Number(theme.legend.style.labels.padding))\n };\n // Horizontal divider to render under the group title\n const getDivider = () => {\n const titleSize = getLabelTextSize({ text: title, theme });\n const subTitleSize = getLabelTextSize({ text: subTitle, theme });\n const dy = title && subTitle\n ? titleSize.height + subTitleSize.height + labelPadding.top + labelPadding.bottom\n : titleSize.height + labelPadding.top + labelPadding.bottom;\n return react.cloneElement(dividerComponent, Object.assign({ x1: defaultPadding.left, x2: width - defaultPadding.right, y1: defaultPadding.top + dy, y2: defaultPadding.top + dy, style: theme.line.style.data }, dividerComponent.props));\n };\n // Returns title\n const getTitle = () => {\n const titleProps = titleComponent ? titleComponent.props : {};\n const showBoth = title && subTitle;\n return react.cloneElement(titleComponent, Object.assign(Object.assign(Object.assign({}, (showBoth && { capHeight })), { style: [ChartBulletStyles.label.groupTitle, ChartBulletStyles.label.subTitle], text: showBoth ? [title, subTitle] : title, textAnchor: \'middle\', verticalAnchor: \'middle\', x: getBulletLabelX({\n chartWidth: width,\n labelPosition: \'top\'\n }), y: getBulletLabelY({\n chartHeight: height,\n dy: defaultPadding.top,\n labelPosition: \'top\'\n }) }), titleProps));\n };\n const groupTitle = Boolean(title) && (react.createElement(react.Fragment, null,\n getTitle(),\n getDivider()));\n return standalone ? (react.createElement(ChartContainer, { desc: ariaDesc, height: height, title: ariaTitle, width: width }, groupTitle)) : (react.createElement(react.Fragment, null, groupTitle));\n};\nChartBulletGroupTitle.displayName = \'ChartBulletGroupTitle\';\n//# sourceMappingURL=ChartBulletGroupTitle.js.map\n;// CONCATENATED MODULE: ./node_modules/victory-scatter/es/helper-methods.js\n\n\n\n\nfunction victory_scatter_es_helper_methods_toConsumableArray(arr) { return victory_scatter_es_helper_methods_arrayWithoutHoles(arr) || victory_scatter_es_helper_methods_iterableToArray(arr) || victory_scatter_es_helper_methods_nonIterableSpread(); }\n\nfunction victory_scatter_es_helper_methods_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_scatter_es_helper_methods_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_scatter_es_helper_methods_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\n\nvar getSymbol = function (data, props) {\n if (props.bubbleProperty) {\n return "circle";\n }\n\n return data.symbol || props.symbol;\n};\nvar getBubbleSize = function (datum, props) {\n var data = props.data,\n z = props.z,\n maxBubbleSize = props.maxBubbleSize,\n minBubbleSize = props.minBubbleSize;\n var zData = data.map(function (point) {\n return point[z];\n });\n var zMin = Math.min.apply(Math, victory_scatter_es_helper_methods_toConsumableArray(zData));\n var zMax = Math.max.apply(Math, victory_scatter_es_helper_methods_toConsumableArray(zData));\n\n var getMaxRadius = function () {\n var minPadding = Math.min.apply(Math, victory_scatter_es_helper_methods_toConsumableArray(values_default()(helpers_getPadding(props))));\n return Math.max(minPadding, 5); // eslint-disable-line no-magic-numbers\n };\n\n var maxRadius = maxBubbleSize || getMaxRadius();\n var minRadius = minBubbleSize || maxRadius * 0.1; // eslint-disable-line no-magic-numbers\n\n if (zMax === zMin) {\n return Math.max(minRadius, 1);\n }\n\n var maxArea = Math.PI * Math.pow(maxRadius, 2);\n var minArea = Math.PI * Math.pow(minRadius, 2);\n var pointArea = (datum[z] - zMin) / (zMax - zMin) * maxArea;\n var area = Math.max(pointArea, minArea);\n var radius = Math.sqrt(area / Math.PI);\n return Math.max(radius, 1);\n};\nvar getSize = function (datum, props) {\n var size = props.size,\n z = props.z;\n\n if (datum.size) {\n return typeof datum.size === "function" ? datum.size : Math.max(datum.size, 1);\n } else if (typeof props.size === "function") {\n return size;\n } else if (datum[z]) {\n return getBubbleSize(datum, props);\n } else {\n return Math.max(size || 0, 1);\n }\n};\n\nvar victory_scatter_es_helper_methods_getCalculatedValues = function (props) {\n var defaultStyles = getDefaultStyles(props, "scatter");\n var style = getStyles(props.style, defaultStyles);\n var range = {\n x: getRange(props, "x"),\n y: getRange(props, "y")\n };\n var domain = {\n x: getDomain(props, "x"),\n y: getDomain(props, "y")\n };\n var scale = {\n x: getBaseScale(props, "x").domain(domain.x).range(props.horizontal ? range.y : range.x),\n y: getBaseScale(props, "y").domain(domain.y).range(props.horizontal ? range.x : range.y)\n };\n var origin = props.polar ? props.origin || getPolarOrigin(props) : undefined;\n var z = props.bubbleProperty || "z";\n var data = data_getData(props);\n data = formatDataFromDomain(data, domain);\n return {\n domain: domain,\n data: data,\n scale: scale,\n style: style,\n origin: origin,\n z: z\n };\n};\n\nvar victory_scatter_es_helper_methods_getBaseProps = function (props, fallbackProps) {\n var modifiedProps = modifyProps(props, fallbackProps, "scatter");\n props = assign_default()({}, modifiedProps, victory_scatter_es_helper_methods_getCalculatedValues(modifiedProps));\n var _props = props,\n data = _props.data,\n domain = _props.domain,\n events = _props.events,\n height = _props.height,\n origin = _props.origin,\n padding = _props.padding,\n polar = _props.polar,\n scale = _props.scale,\n name = _props.name,\n sharedEvents = _props.sharedEvents,\n standalone = _props.standalone,\n style = _props.style,\n theme = _props.theme,\n width = _props.width,\n labels = _props.labels,\n horizontal = _props.horizontal,\n disableInlineStyles = _props.disableInlineStyles;\n var initialChildProps = {\n parent: {\n style: style.parent,\n scale: scale,\n domain: domain,\n data: data,\n height: height,\n width: width,\n standalone: standalone,\n theme: theme,\n origin: origin,\n polar: polar,\n padding: padding,\n name: name,\n horizontal: horizontal\n }\n };\n return data.reduce(function (childProps, datum, index) {\n var eventKey = !isNil_default()(datum.eventKey) ? datum.eventKey : index;\n\n var _Helpers$scalePoint = scalePoint(props, datum),\n x = _Helpers$scalePoint.x,\n y = _Helpers$scalePoint.y;\n\n var dataProps = {\n x: x,\n y: y,\n datum: datum,\n data: data,\n index: index,\n scale: scale,\n polar: polar,\n origin: origin,\n horizontal: horizontal,\n size: getSize(datum, props),\n symbol: getSymbol(datum, props),\n style: disableInlineStyles ? {} : style.data,\n disableInlineStyles: disableInlineStyles\n };\n childProps[eventKey] = {\n data: dataProps\n };\n var text = getText(props, datum, index);\n\n if (text !== undefined && text !== null || labels && (events || sharedEvents)) {\n childProps[eventKey].labels = getProps(props, index);\n }\n\n return childProps;\n }, initialChildProps);\n};\n;// CONCATENATED MODULE: ./node_modules/victory-scatter/es/victory-scatter.js\nfunction victory_scatter_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_scatter_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_scatter_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction victory_scatter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_scatter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_scatter_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_scatter_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_scatter_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_scatter_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_scatter_assertThisInitialized(self); }\n\nfunction victory_scatter_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_scatter_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\nvar victory_scatter_fallbackProps = {\n width: 450,\n height: 300,\n padding: 50,\n size: 3,\n symbol: "circle"\n};\n\nvar VictoryScatter =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_scatter_inherits(VictoryScatter, _React$Component);\n\n function VictoryScatter() {\n victory_scatter_classCallCheck(this, VictoryScatter);\n\n return victory_scatter_possibleConstructorReturn(this, (VictoryScatter.__proto__ || Object.getPrototypeOf(VictoryScatter)).apply(this, arguments));\n }\n\n victory_scatter_createClass(VictoryScatter, [{\n key: "shouldAnimate",\n // Overridden in native versions\n value: function shouldAnimate() {\n return !!this.props.animate;\n }\n }, {\n key: "render",\n value: function render() {\n var animationWhitelist = VictoryScatter.animationWhitelist,\n role = VictoryScatter.role;\n var props = modifyProps(this.props, victory_scatter_fallbackProps, role);\n\n if (this.shouldAnimate()) {\n return this.animateComponent(props, animationWhitelist);\n }\n\n var children = this.renderData(props);\n return props.standalone ? this.renderContainer(props.containerComponent, children) : children;\n }\n }]);\n\n return VictoryScatter;\n}(react.Component);\n\nObject.defineProperty(VictoryScatter, "animationWhitelist", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["data", "domain", "height", "maxBubbleSize", "padding", "samples", "size", "style", "width"]\n});\nObject.defineProperty(VictoryScatter, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryScatter"\n});\nObject.defineProperty(VictoryScatter, "role", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "scatter"\n});\nObject.defineProperty(VictoryScatter, "defaultTransitions", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: discreteTransitions()\n});\nObject.defineProperty(VictoryScatter, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_scatter_objectSpread({}, baseProps, dataProps, {\n bubbleProperty: (prop_types_default()).string,\n maxBubbleSize: nonNegative,\n minBubbleSize: nonNegative,\n size: prop_types_default().oneOfType([nonNegative, (prop_types_default()).func]),\n symbol: prop_types_default().oneOfType([prop_types_default().oneOf(["circle", "cross", "diamond", "plus", "minus", "square", "star", "triangleDown", "triangleUp"]), (prop_types_default()).func])\n })\n});\nObject.defineProperty(VictoryScatter, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n containerComponent: react.createElement(VictoryContainer, null),\n dataComponent: react.createElement(victory_primitives_point, null),\n labelComponent: react.createElement(victory_label, null),\n groupComponent: react.createElement("g", null),\n samples: 50,\n sortOrder: "ascending",\n standalone: true,\n theme: victory_theme.grayscale\n }\n});\nObject.defineProperty(VictoryScatter, "getDomain", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: getDomain\n});\nObject.defineProperty(VictoryScatter, "getData", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: data_getData\n});\nObject.defineProperty(VictoryScatter, "getBaseProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return victory_scatter_es_helper_methods_getBaseProps(props, victory_scatter_fallbackProps);\n }\n});\nObject.defineProperty(VictoryScatter, "expectedComponents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["dataComponent", "labelComponent", "groupComponent", "containerComponent"]\n});\n/* harmony default export */ const victory_scatter = (add_events(VictoryScatter));\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartScatter/ChartScatter.js\n\n\n\n\n\n\n\nvar ChartScatterSortOrder;\n(function (ChartScatterSortOrder) {\n ChartScatterSortOrder["ascending"] = "ascending";\n ChartScatterSortOrder["descending"] = "descending";\n})(ChartScatterSortOrder || (ChartScatterSortOrder = {}));\nconst ChartScatter = (_a) => {\n var { containerComponent = react.createElement(ChartContainer, null), themeColor, themeVariant, \n // destructure last\n theme = getTheme(themeColor, themeVariant), size = ({ active }) => (active ? ChartScatterStyles.activeSize : ChartScatterStyles.size) } = _a, rest = (0,tslib_es6.__rest)(_a, ["containerComponent", "themeColor", "themeVariant", "theme", "size"]);\n // Clone so users can override container props\n const container = react.cloneElement(containerComponent, Object.assign({ theme }, containerComponent.props));\n // Note: containerComponent is required for theme\n return react.createElement(victory_scatter, Object.assign({ containerComponent: container, size: size, theme: theme }, rest));\n};\nChartScatter.displayName = \'ChartScatter\';\n// Note: VictoryLine.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartScatter, victory_scatter);\n//# sourceMappingURL=ChartScatter.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBullet/ChartBulletPrimaryDotMeasure.js\n\n\n\n\n\n\n\n\n\nconst ChartBulletPrimaryDotMeasure = ({ allowTooltip = true, ariaDesc, ariaTitle, constrainToVisibleArea = false, data, domain, horizontal = true, invert = false, labels, measureComponent = react.createElement(ChartScatter, null), padding, size = ChartBulletStyles.primaryDotMeasureSize, standalone = true, themeColor, themeVariant, y, y0, \n// destructure last\ntheme = getBulletPrimaryDotMeasureTheme(themeColor, themeVariant), labelComponent = react.createElement(ChartTooltip, null), height = theme.group.height, width = theme.group.width }) => {\n const computedData = getPrimaryDotMeasureData({\n data,\n invert,\n theme,\n y,\n y0\n });\n // Label component\n //\n // Note: SVG height and width are provided by ChartBullet as a workaround to support constrainToVisibleArea\n const tooltip = react.cloneElement(labelComponent, Object.assign({ constrainToVisibleArea, dx: 0, dy: horizontal ? -size : 0, orientation: \'top\' }, labelComponent.props));\n const measure = computedData.map((dataPoint, index) => react.cloneElement(measureComponent, Object.assign({ data: [Object.assign({}, dataPoint)], domain,\n height,\n horizontal, key: `pf-chart-bullet-primary-dot-measure-${index}`, labelComponent: allowTooltip ? tooltip : undefined, labels,\n padding,\n size, standalone: false, style: {\n data: {\n fill: dataPoint._color\n }\n }, theme,\n width }, measureComponent.props)));\n return standalone ? (react.createElement(ChartContainer, { desc: ariaDesc, height: height, title: ariaTitle, width: width }, measure)) : (react.createElement(react.Fragment, null, measure));\n};\nChartBulletPrimaryDotMeasure.displayName = \'ChartBulletPrimaryDotMeasure\';\n// Note: VictoryBar.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartBulletPrimaryDotMeasure, victory_scatter);\n//# sourceMappingURL=ChartBulletPrimaryDotMeasure.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBullet/ChartBulletPrimarySegmentedMeasure.js\n\n\n\n\n\n\n\n\n\nconst ChartBulletPrimarySegmentedMeasure = ({ allowTooltip = true, ariaDesc, ariaTitle, barWidth = ChartBulletStyles.primarySegmentedMeasureWidth, constrainToVisibleArea = false, data, domain, horizontal = true, invert = false, labels, measureComponent = react.createElement(ChartBar, null), padding, standalone = true, themeColor, themeVariant, y, y0, \n// destructure last\ntheme = getBulletPrimarySegmentedMeasureTheme(themeColor, themeVariant), negativeMeasureTheme = getBulletPrimaryNegativeMeasureTheme(themeColor, themeVariant), height = theme.group.height, width = theme.group.width, labelComponent = react.createElement(ChartTooltip, null) }) => {\n const computedData = getPrimarySegmentedMeasureData({\n data,\n invert,\n negativeMeasureTheme,\n theme,\n y,\n y0\n });\n // Label component\n //\n // Note: SVG height and width are provided by ChartBullet as a workaround to support constrainToVisibleArea\n const tooltip = react.cloneElement(labelComponent, Object.assign({ constrainToVisibleArea, dx: () => {\n if (horizontal) {\n return 0;\n }\n const result = typeof barWidth === \'function\' ? barWidth(data) : barWidth;\n return result / 2;\n }, dy: () => {\n if (!horizontal) {\n return 0;\n }\n const result = typeof barWidth === \'function\' ? barWidth(data) : barWidth;\n return -(result / 2);\n }, orientation: \'top\' }, labelComponent.props));\n const measure = computedData.map((dataPoint, index) => react.cloneElement(measureComponent, Object.assign({ barWidth, data: [Object.assign({}, dataPoint)], domain,\n height,\n horizontal, key: `pf-chart-bullet-primary-segmented-measure-${index}`, labelComponent: allowTooltip ? tooltip : undefined, labels,\n padding, standalone: false, style: {\n data: {\n fill: dataPoint._color\n }\n }, theme,\n width }, measureComponent.props)));\n return standalone ? (react.createElement(ChartContainer, { desc: ariaDesc, height: height, title: ariaTitle, width: width }, measure)) : (react.createElement(react.Fragment, null, measure));\n};\nChartBulletPrimarySegmentedMeasure.displayName = \'ChartBulletPrimarySegmentedMeasure\';\n// Note: VictoryBar.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartBulletPrimarySegmentedMeasure, victory_bar);\n//# sourceMappingURL=ChartBulletPrimarySegmentedMeasure.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBullet/ChartBulletQualitativeRange.js\n\n\n\n\n\n\n\n\n\nconst ChartBulletQualitativeRange = ({ allowTooltip = true, ariaDesc, ariaTitle, barWidth = ChartBulletStyles.qualitativeRangeWidth, constrainToVisibleArea = false, data, domain, horizontal = true, invert = false, labels, measureComponent = react.createElement(ChartBar, null), padding, standalone = true, themeColor, themeVariant, y, y0, \n// destructure last\ntheme = getBulletQualitativeRangeTheme(themeColor, themeVariant), height = theme.group.height, width = theme.group.width, labelComponent = react.createElement(ChartTooltip, null) }) => {\n const computedData = getQualitativeRangeData({\n data,\n invert,\n theme,\n y,\n y0\n });\n // Label component\n //\n // The x and y calculations below ensure that the tooltip appears above the bar, instead of vertically centered.\n // Having the tooltip vertically centered is visually confusing with comparative measures.\n //\n // Note: SVG height and width are provided by ChartBullet as a workaround to support constrainToVisibleArea\n const tooltip = react.cloneElement(labelComponent, Object.assign({ constrainToVisibleArea, dx: () => {\n if (horizontal) {\n return 0;\n }\n const result = typeof barWidth === \'function\' ? barWidth(data) : barWidth;\n return result / 2;\n }, dy: () => {\n if (!horizontal) {\n return 0;\n }\n const result = typeof barWidth === \'function\' ? barWidth(data) : barWidth;\n return -(result / 2);\n }, orientation: \'top\' }, labelComponent.props));\n const measure = computedData.map((dataPoint, index) => react.cloneElement(measureComponent, Object.assign({ barWidth, data: [Object.assign({}, dataPoint)], domain,\n height,\n horizontal, key: `pf-chart-bullet-qualitative-range-${index}`, labelComponent: allowTooltip ? tooltip : undefined, labels,\n padding, standalone: false, style: {\n data: {\n fill: dataPoint._color\n }\n }, theme,\n width }, measureComponent.props)));\n return standalone ? (react.createElement(ChartContainer, { desc: ariaDesc, height: height, title: ariaTitle, width: width }, measure)) : (react.createElement(react.Fragment, null, measure));\n};\nChartBulletQualitativeRange.displayName = \'ChartBulletQualitativeRange\';\n// Note: VictoryBar.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartBulletQualitativeRange, victory_bar);\n//# sourceMappingURL=ChartBulletQualitativeRange.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBullet/ChartBulletTitle.js\n\n\n\n\n\nconst ChartBulletTitle = ({ ariaDesc, ariaTitle, capHeight = 1.1, horizontal = true, legendPosition = \'bottom\', padding, standalone = true, subTitle, themeColor, themeVariant, title, titleComponent = react.createElement(ChartLabel, null), titlePosition, \n// destructure last\ntheme = getBulletTheme(themeColor, themeVariant), height = horizontal ? theme.chart.height : theme.chart.width, width = horizontal ? theme.chart.width : theme.chart.height }) => {\n const chartSize = {\n height: horizontal ? theme.chart.height : height,\n width: horizontal ? width : theme.chart.height\n };\n const defaultPadding = {\n bottom: getPaddingForSide(\'bottom\', padding, theme.chart.padding),\n left: getPaddingForSide(\'left\', padding, theme.chart.padding),\n right: getPaddingForSide(\'right\', padding, theme.chart.padding),\n top: getPaddingForSide(\'top\', padding, theme.chart.padding)\n };\n // Returns title\n const getTitle = () => {\n const showBoth = title && subTitle;\n let labelPosition = horizontal ? \'left\' : \'bottom\';\n if (titlePosition && titlePosition.includes(\'left\') && horizontal) {\n labelPosition = titlePosition;\n }\n let textAnchor = \'middle\';\n if (labelPosition === \'top-left\') {\n textAnchor = \'start\';\n }\n else if (horizontal) {\n textAnchor = \'end\';\n }\n // Adjust for padding\n let dy = ChartCommonStyles.legend.margin * 2 - defaultPadding.bottom;\n if (labelPosition === \'top-left\') {\n const offsetLabelPosition = showBoth ? 0 : 1;\n dy =\n defaultPadding.top * 0.5 +\n (defaultPadding.bottom * 0.5 - defaultPadding.bottom) +\n 58 -\n ChartCommonStyles.legend.margin +\n offsetLabelPosition;\n }\n else if (horizontal) {\n dy = defaultPadding.top * 0.5 + (defaultPadding.bottom * 0.5 - defaultPadding.bottom);\n }\n // The x and y calculations below are used to adjust the position of the title, based on padding and scale.\n // This ensures that when padding is adjusted, the title moves along with the chart\'s position.\n return react.cloneElement(titleComponent, Object.assign(Object.assign(Object.assign({}, (showBoth && { capHeight })), { style: [ChartBulletStyles.label.title, ChartBulletStyles.label.subTitle], text: showBoth ? [title, subTitle] : title, textAnchor, verticalAnchor: labelPosition === \'top-left\' ? \'end\' : \'middle\', \n // Adjust for padding\n x: horizontal\n ? getBulletLabelX({\n chartWidth: chartSize.width,\n dx: labelPosition === \'top-left\'\n ? defaultPadding.left\n : defaultPadding.left - ChartCommonStyles.label.margin * 1.75,\n labelPosition: \'left\',\n legendPosition,\n svgWidth: width\n })\n : defaultPadding.left * 0.5 +\n (defaultPadding.right * 0.5 - (defaultPadding.right - 50)) +\n ChartBulletStyles.qualitativeRangeWidth / 2, y: getBulletLabelY({\n chartHeight: chartSize.height,\n dy,\n labelPosition\n }) }), titleComponent.props));\n };\n return standalone ? (react.createElement(ChartContainer, { desc: ariaDesc, height: height, title: ariaTitle, width: width }, getTitle())) : (react.createElement(react.Fragment, null, getTitle()));\n};\nChartBulletTitle.displayName = \'ChartBulletTitle\';\n//# sourceMappingURL=ChartBulletTitle.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBullet/ChartBullet.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst ChartBullet = ({ allowTooltip = true, ariaDesc, ariaTitle, axisComponent = react.createElement(ChartAxis, null), comparativeErrorMeasureComponent = react.createElement(ChartBulletComparativeErrorMeasure, null), comparativeErrorMeasureData, comparativeErrorMeasureDataY, comparativeErrorMeasureLegendData, comparativeWarningMeasureComponent = react.createElement(ChartBulletComparativeWarningMeasure, null), comparativeWarningMeasureData, comparativeWarningMeasureDataY, comparativeWarningMeasureLegendData, comparativeZeroMeasureComponent = react.createElement(ChartBulletComparativeMeasure, null), constrainToVisibleArea = false, groupTitleComponent = react.createElement(ChartBulletGroupTitle, null), groupSubTitle, groupTitle, horizontal = true, invert = false, labels, legendAllowWrap = false, legendComponent = react.createElement(ChartLegend, null), legendItemsPerRow, legendPosition = \'bottom\', maxDomain, minDomain, padding, primaryDotMeasureComponent = react.createElement(ChartBulletPrimaryDotMeasure, null), primaryDotMeasureData, primaryDotMeasureDataY, primaryDotMeasureLegendData, primarySegmentedMeasureComponent = react.createElement(ChartBulletPrimarySegmentedMeasure, null), primarySegmentedMeasureData, primarySegmentedMeasureDataY, primarySegmentedMeasureLegendData, qualitativeRangeComponent = react.createElement(ChartBulletQualitativeRange, null), qualitativeRangeData, qualitativeRangeDataY, qualitativeRangeDataY0, qualitativeRangeLegendData, standalone = true, subTitle, themeColor, themeVariant, title, titleComponent = react.createElement(ChartBulletTitle, null), titlePosition, \n// destructure last\ntheme = getBulletThemeWithLegendColorScale({\n comparativeErrorMeasureData,\n comparativeErrorMeasureLegendData,\n comparativeWarningMeasureData,\n comparativeWarningMeasureLegendData,\n invert,\n primaryDotMeasureData,\n primaryDotMeasureLegendData,\n primarySegmentedMeasureData,\n primarySegmentedMeasureLegendData,\n qualitativeRangeData,\n qualitativeRangeLegendData,\n themeColor,\n themeVariant\n}), domain = getBulletDomain({\n comparativeErrorMeasureComponent,\n comparativeErrorMeasureData,\n comparativeWarningMeasureComponent,\n comparativeWarningMeasureData,\n maxDomain,\n minDomain,\n primaryDotMeasureComponent,\n primaryDotMeasureData,\n primarySegmentedMeasureComponent,\n primarySegmentedMeasureData,\n qualitativeRangeComponent,\n qualitativeRangeData\n}), legendOrientation = theme.legend.orientation, height = horizontal ? theme.chart.height : theme.chart.width, width = horizontal ? theme.chart.width : theme.chart.height, bulletSize = theme.chart.height }) => {\n // Note that we\'re using a fixed bullet height width to align components.\n const chartSize = {\n height: horizontal ? bulletSize : height,\n width: horizontal ? width : bulletSize\n };\n const defaultPadding = {\n bottom: getPaddingForSide(\'bottom\', padding, theme.chart.padding),\n left: getPaddingForSide(\'left\', padding, theme.chart.padding),\n right: getPaddingForSide(\'right\', padding, theme.chart.padding),\n top: getPaddingForSide(\'top\', padding, theme.chart.padding)\n };\n // Bullet group title\n const bulletGroupTitle = react.cloneElement(groupTitleComponent, Object.assign({ height, standalone: false, subTitle: groupSubTitle, title: groupTitle, width }, groupTitleComponent.props));\n // Bullet title\n const bulletTitle = react.cloneElement(titleComponent, Object.assign({ height,\n horizontal,\n legendPosition,\n padding, standalone: false, subTitle,\n theme,\n title,\n titlePosition,\n width }, titleComponent.props));\n // Comparative error measure\n const comparativeErrorMeasure = react.cloneElement(comparativeErrorMeasureComponent, Object.assign({ allowTooltip, barWidth: getComparativeMeasureErrorWidth({ height: chartSize.height, horizontal, width: chartSize.width }), constrainToVisibleArea, data: comparativeErrorMeasureData, domain, height: chartSize.height, horizontal, labelComponent: allowTooltip ? react.createElement(ChartTooltip, { height: height, theme: theme, width: width }) : undefined, labels,\n padding, standalone: false, width: chartSize.width, y: comparativeErrorMeasureDataY }, comparativeErrorMeasureComponent.props));\n // Comparative warning measure\n const comparativeWarningMeasure = react.cloneElement(comparativeWarningMeasureComponent, Object.assign({ allowTooltip, barWidth: getComparativeMeasureWarningWidth({ height: chartSize.height, horizontal, width: chartSize.width }), constrainToVisibleArea, data: comparativeWarningMeasureData, domain, height: chartSize.height, horizontal, labelComponent: allowTooltip ? react.createElement(ChartTooltip, { height: height, theme: theme, width: width }) : undefined, labels,\n padding, standalone: false, width: chartSize.width, y: comparativeWarningMeasureDataY }, comparativeWarningMeasureComponent.props));\n // Comparative zero measure\n const comparativeZeroMeasure = react.cloneElement(comparativeZeroMeasureComponent, Object.assign({ barWidth: getComparativeMeasureWidth({ height: chartSize.height, horizontal, width: chartSize.width }), data: [{ y: 0 }], domain, height: chartSize.height, horizontal,\n padding, standalone: false, width: chartSize.width }, comparativeZeroMeasureComponent.props));\n // Legend\n const legend = react.cloneElement(legendComponent, Object.assign({ data: [\n ...(primaryDotMeasureLegendData ? primaryDotMeasureLegendData : []),\n ...(primarySegmentedMeasureLegendData ? primarySegmentedMeasureLegendData : []),\n ...(comparativeWarningMeasureLegendData ? comparativeWarningMeasureLegendData : []),\n ...(comparativeErrorMeasureLegendData ? comparativeErrorMeasureLegendData : []),\n ...(qualitativeRangeLegendData ? qualitativeRangeLegendData : [])\n ], itemsPerRow: legendItemsPerRow, orientation: legendOrientation, position: legendPosition, theme }, legendComponent.props));\n // Primary dot measure\n const primaryDotMeasure = react.cloneElement(primaryDotMeasureComponent, Object.assign({ allowTooltip,\n constrainToVisibleArea, data: primaryDotMeasureData, domain, height: chartSize.height, horizontal,\n invert, labelComponent: allowTooltip ? react.createElement(ChartTooltip, { height: height, theme: theme, width: width }) : undefined, labels,\n padding, size: getPrimaryDotMeasureSize({ height: chartSize.height, horizontal, width: chartSize.width }), standalone: false, themeColor,\n themeVariant, width: chartSize.width, y: primaryDotMeasureDataY }, primaryDotMeasureComponent.props));\n // Primary segmented measure\n const primarySegmentedMeasure = react.cloneElement(primarySegmentedMeasureComponent, Object.assign({ allowTooltip,\n constrainToVisibleArea, barWidth: getPrimarySegmentedMeasureWidth({ height: chartSize.height, horizontal, width: chartSize.width }), data: primarySegmentedMeasureData, domain, height: chartSize.height, horizontal,\n invert, labelComponent: allowTooltip ? react.createElement(ChartTooltip, { height: height, theme: theme, width: width }) : undefined, labels,\n padding, standalone: false, themeColor,\n themeVariant, width: chartSize.width, y: primarySegmentedMeasureDataY }, primarySegmentedMeasureComponent.props));\n // Qualitative range\n const qualitativeRange = react.cloneElement(qualitativeRangeComponent, Object.assign({ allowTooltip,\n constrainToVisibleArea, barWidth: getQualitativeRangeBarWidth({ height: chartSize.height, horizontal, width: chartSize.width }), data: qualitativeRangeData, domain, height: chartSize.height, horizontal,\n invert, labelComponent: allowTooltip ? react.createElement(ChartTooltip, { height: height, theme: theme, width: width }) : undefined, labels,\n padding, standalone: false, width: chartSize.width, y: qualitativeRangeDataY, y0: qualitativeRangeDataY0 }, qualitativeRangeComponent.props));\n // Returns tick values -- Victory doesn\'t include min/max domain\n const getTickValues = (minVal, maxVal) => {\n const tickValues = [minVal, maxVal];\n let range = 0;\n if (minVal < 0 && maxVal < 0) {\n range = Math.abs(minVal - maxVal);\n }\n else if (minVal < 0) {\n range = Math.abs(minVal) + maxVal;\n }\n else {\n range = maxVal - minVal;\n }\n const tickInterval = range / (ChartBulletStyles.axisTickCount - 1);\n for (let i = minVal; i < maxVal;) {\n i += tickInterval;\n tickValues.push(Math.ceil(i));\n }\n return tickValues;\n };\n // Returns a computed legend\n const getLegend = () => {\n if (!legend.props.data) {\n return null;\n }\n let dx = 0;\n let dy = 0;\n // Adjust for padding\n if (legendPosition === ChartLegendPosition.bottom) {\n if (horizontal) {\n dy = defaultPadding.top * 0.5 + (defaultPadding.bottom * 0.5 - defaultPadding.bottom) - 25;\n }\n else if (title) {\n dy = -defaultPadding.bottom + 60;\n }\n else {\n dy = -defaultPadding.bottom;\n }\n }\n else if (legendPosition === ChartLegendPosition.bottomLeft) {\n if (horizontal) {\n dy = defaultPadding.top * 0.5 + (defaultPadding.bottom * 0.5 - defaultPadding.bottom) - 25;\n }\n else if (title) {\n dy = -defaultPadding.bottom + 60;\n }\n else {\n dy = -defaultPadding.bottom;\n }\n dx = -10;\n }\n return getComputedLegend({\n allowWrap: legendAllowWrap,\n chartType: \'bullet\',\n dx,\n dy,\n height: chartSize.height,\n legendComponent: legend,\n padding: defaultPadding,\n position: legendPosition,\n theme,\n width: chartSize.width\n });\n };\n // Returns comparative zero measure\n const getComparativeZeroMeasure = () => {\n const _domain = domain;\n let low = 0;\n if (Array.isArray(_domain)) {\n low = _domain[0];\n }\n else if (_domain.y && Array.isArray(_domain.y)) {\n low = _domain.y[0];\n }\n let high = 0;\n if (Array.isArray(_domain)) {\n high = _domain[_domain.length - 1];\n }\n else if (_domain.y && Array.isArray(_domain.y)) {\n high = _domain.y[_domain.y.length - 1];\n }\n if (low < 0 && high > 0) {\n return comparativeZeroMeasure;\n }\n return null;\n };\n // Axis component for custom tick values\n const axis = react.cloneElement(axisComponent, Object.assign({ dependentAxis: horizontal ? false : true, domain: !horizontal\n ? domain\n : {\n x: domain.y,\n y: domain.x\n }, height: chartSize.height, \n // Adjust for padding\n offsetX: !horizontal ? defaultPadding.left * 0.5 + (defaultPadding.right * 0.5 - (defaultPadding.right - 55)) : 0, offsetY: horizontal ? 80 - defaultPadding.top * 0.5 + (defaultPadding.bottom * 0.5 - 25) : 0, padding, standalone: false, tickCount: ChartBulletStyles.axisTickCount, tickValues: getTickValues(domain.y[0], domain.y[1]), width: chartSize.width }, axisComponent.props));\n const bulletChart = (react.createElement(react.Fragment, null,\n axis,\n bulletGroupTitle,\n bulletTitle,\n qualitativeRange,\n primarySegmentedMeasure,\n primaryDotMeasure,\n comparativeErrorMeasure,\n comparativeWarningMeasure,\n getComparativeZeroMeasure(),\n getLegend()));\n return standalone ? (react.createElement(ChartContainer, { desc: ariaDesc, height: height, title: ariaTitle, theme: theme, width: width }, bulletChart)) : (react.createElement(react.Fragment, null, bulletChart));\n};\nChartBullet.displayName = \'ChartBullet\';\nhoist_non_react_statics_cjs_default()(ChartBullet, victory_chart);\n//# sourceMappingURL=ChartBullet.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartBullet/index.js\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartContainer/index.js\n\n//# sourceMappingURL=index.js.map\n// EXTERNAL MODULE: ./node_modules/lodash/mapValues.js\nvar mapValues = __webpack_require__(6604);\nvar mapValues_default = /*#__PURE__*/__webpack_require__.n(mapValues);\n// EXTERNAL MODULE: ./node_modules/lodash/throttle.js\nvar throttle = __webpack_require__(3493);\nvar throttle_default = /*#__PURE__*/__webpack_require__.n(throttle);\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/selection.js\n/* eslint-disable func-style */\n\n/* eslint-disable no-use-before-define */\n // Private Functions\n\nfunction transformTarget(target, matrix, dimension) {\n var a = matrix.a,\n d = matrix.d,\n e = matrix.e,\n f = matrix.f;\n return dimension === "y" ? d * target + f : a * target + e;\n}\n\nfunction getTransformationMatrix(svg) {\n return svg.getScreenCTM().inverse();\n} // Exported Functions\n\n\nfunction getParentSVG(evt) {\n if (evt.nativeEvent && evt.nativeEvent.identifier !== undefined) {\n return undefined;\n }\n\n var getParent = function (target) {\n if (target.nodeName === "svg") {\n return target;\n } else {\n return target.parentNode ? getParent(target.parentNode) : target;\n }\n };\n\n return getParent(evt.target);\n}\nfunction getSVGEventCoordinates(evt, svg) {\n if (evt.nativeEvent && evt.nativeEvent.identifier !== undefined) {\n // react-native override. relies on the RN.View being the _exact_ same size as its child SVG.\n // this should be fine: the svg is the only child of View and the View shirks to its children\n return {\n x: evt.nativeEvent.locationX,\n y: evt.nativeEvent.locationY\n };\n }\n\n evt = evt.changedTouches && evt.changedTouches.length ? evt.changedTouches[0] : evt;\n svg = svg || getParentSVG(evt);\n var matrix = getTransformationMatrix(svg);\n return {\n x: transformTarget(evt.clientX, matrix, "x"),\n y: transformTarget(evt.clientY, matrix, "y")\n };\n}\nfunction getDomainCoordinates(props, domain) {\n var scale = props.scale,\n horizontal = props.horizontal;\n domain = domain || {\n x: scale.x.domain(),\n y: scale.y.domain()\n };\n return {\n x: horizontal ? [scale.y(domain.y[0]), scale.y(domain.y[1])] : [scale.x(domain.x[0]), scale.x(domain.x[1])],\n y: horizontal ? [scale.x(domain.x[0]), scale.x(domain.x[1])] : [scale.y(domain.y[0]), scale.y(domain.y[1])]\n };\n} // eslint-disable-next-line max-params\n\nfunction getDataCoordinates(props, scale, x, y) {\n var polar = props.polar,\n horizontal = props.horizontal;\n\n if (!polar) {\n return {\n x: horizontal ? scale.x.invert(y) : scale.x.invert(x),\n y: horizontal ? scale.y.invert(x) : scale.y.invert(y)\n };\n } else {\n var origin = props.origin || {\n x: 0,\n y: 0\n };\n var baseX = x - origin.x;\n var baseY = y - origin.y;\n var radius = Math.abs(baseX * Math.sqrt(1 + Math.pow(-baseY / baseX, 2)));\n var angle = (-Math.atan2(baseY, baseX) + Math.PI * 2) % (Math.PI * 2);\n return {\n x: scale.x.invert(angle),\n y: scale.y.invert(radius)\n };\n }\n}\nfunction getBounds(props) {\n var x1 = props.x1,\n x2 = props.x2,\n y1 = props.y1,\n y2 = props.y2,\n scale = props.scale;\n var point1 = getDataCoordinates(props, scale, x1, y1);\n var point2 = getDataCoordinates(props, scale, x2, y2);\n\n var makeBound = function (a, b) {\n return [getMinValue([a, b]), getMaxValue([a, b])];\n };\n\n return {\n x: makeBound(point1.x, point2.x),\n y: makeBound(point1.y, point2.y)\n };\n}\n;// CONCATENATED MODULE: ./node_modules/victory-cursor-container/es/cursor-helpers.js\n\n\n\n\nfunction cursor_helpers_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { cursor_helpers_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction cursor_helpers_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\nvar ON_MOUSE_MOVE_THROTTLE_MS = 16;\nvar CursorHelpers = {\n getDimension: function (props) {\n var horizontal = props.horizontal,\n cursorDimension = props.cursorDimension;\n\n if (!horizontal || !cursorDimension) {\n return cursorDimension;\n }\n\n return cursorDimension === "x" ? "y" : "x";\n },\n withinBounds: function (point, bounds) {\n var _mapValues2 = mapValues_default()(bounds, Number),\n x1 = _mapValues2.x1,\n x2 = _mapValues2.x2,\n y1 = _mapValues2.y1,\n y2 = _mapValues2.y2;\n\n var _mapValues3 = mapValues_default()(point, Number),\n x = _mapValues3.x,\n y = _mapValues3.y;\n\n return x >= Math.min(x1, x2) && x <= Math.max(x1, x2) && y >= Math.min(y1, y2) && y <= Math.max(y1, y2);\n },\n onMouseMove: function (evt, targetProps) {\n var onCursorChange = targetProps.onCursorChange,\n domain = targetProps.domain;\n var cursorDimension = this.getDimension(targetProps);\n var parentSVG = targetProps.parentSVG || getParentSVG(evt);\n var cursorSVGPosition = getSVGEventCoordinates(evt, parentSVG);\n var cursorValue = getDataCoordinates(targetProps, targetProps.scale, cursorSVGPosition.x, cursorSVGPosition.y);\n var inBounds = this.withinBounds(cursorValue, {\n x1: domain.x[0],\n x2: domain.x[1],\n y1: domain.y[0],\n y2: domain.y[1]\n });\n\n if (!inBounds) {\n cursorValue = null;\n }\n\n if (isFunction_default()(onCursorChange)) {\n if (inBounds) {\n var value = cursorDimension ? cursorValue[cursorDimension] : cursorValue;\n onCursorChange(value, targetProps);\n } else if (cursorValue !== targetProps.cursorValue) {\n onCursorChange(targetProps.defaultCursorValue || null, targetProps);\n }\n }\n\n return [{\n target: "parent",\n eventKey: "parent",\n mutation: function () {\n return {\n cursorValue: cursorValue,\n parentSVG: parentSVG\n };\n }\n }];\n },\n onTouchEnd: function (evt, targetProps) {\n var onCursorChange = targetProps.onCursorChange;\n\n if (isFunction_default()(targetProps.onCursorChange)) {\n onCursorChange(null, targetProps);\n }\n\n return [{\n target: "parent",\n eventKey: "parent",\n mutation: function () {\n return {\n cursorValue: null\n };\n }\n }];\n }\n};\n/* harmony default export */ const cursor_helpers = (cursor_helpers_objectSpread({}, CursorHelpers, {\n onMouseMove: throttle_default()(CursorHelpers.onMouseMove.bind(CursorHelpers), ON_MOUSE_MOVE_THROTTLE_MS, {\n leading: true,\n trailing: false\n }),\n onMouseLeave: CursorHelpers.onMouseMove.bind(CursorHelpers),\n onTouchEnd: CursorHelpers.onTouchEnd.bind(CursorHelpers)\n}));\n;// CONCATENATED MODULE: ./node_modules/victory-cursor-container/es/victory-cursor-container.js\n\n\n\n\nfunction victory_cursor_container_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_cursor_container_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_cursor_container_toConsumableArray(arr) { return victory_cursor_container_arrayWithoutHoles(arr) || victory_cursor_container_iterableToArray(arr) || victory_cursor_container_nonIterableSpread(); }\n\nfunction victory_cursor_container_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_cursor_container_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_cursor_container_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction victory_cursor_container_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction victory_cursor_container_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_cursor_container_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_cursor_container_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_cursor_container_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_cursor_container_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_cursor_container_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_cursor_container_assertThisInitialized(self); }\n\nfunction victory_cursor_container_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_cursor_container_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\nvar cursorContainerMixin = function (base) {\n var _class, _temp;\n\n return _temp = _class =\n /*#__PURE__*/\n function (_base) {\n victory_cursor_container_inherits(VictoryCursorContainer, _base);\n\n function VictoryCursorContainer() {\n victory_cursor_container_classCallCheck(this, VictoryCursorContainer);\n\n return victory_cursor_container_possibleConstructorReturn(this, (VictoryCursorContainer.__proto__ || Object.getPrototypeOf(VictoryCursorContainer)).apply(this, arguments));\n }\n\n victory_cursor_container_createClass(VictoryCursorContainer, [{\n key: "getCursorPosition",\n value: function getCursorPosition(props) {\n var cursorValue = props.cursorValue,\n defaultCursorValue = props.defaultCursorValue,\n domain = props.domain,\n cursorDimension = props.cursorDimension;\n\n if (cursorValue) {\n return cursorValue;\n }\n\n if (typeof defaultCursorValue === "number") {\n return victory_cursor_container_defineProperty({\n x: (domain.x[0] + domain.x[1]) / 2,\n y: (domain.y[0] + domain.y[1]) / 2\n }, cursorDimension, defaultCursorValue);\n }\n\n return defaultCursorValue;\n }\n }, {\n key: "getCursorLabelOffset",\n value: function getCursorLabelOffset(props) {\n var cursorLabelOffset = props.cursorLabelOffset;\n\n if (typeof cursorLabelOffset === "number") {\n return {\n x: cursorLabelOffset,\n y: cursorLabelOffset\n };\n }\n\n return cursorLabelOffset;\n }\n }, {\n key: "getPadding",\n value: function getPadding(props) {\n if (props.padding === undefined) {\n var child = props.children.find(function (c) {\n return isObject_default()(c.props) && c.props.padding !== undefined;\n });\n return helpers_getPadding(child.props);\n } else {\n return helpers_getPadding(props);\n }\n }\n }, {\n key: "getCursorElements",\n value: function getCursorElements(props) {\n // eslint-disable-line max-statements\n var scale = props.scale,\n cursorLabelComponent = props.cursorLabelComponent,\n cursorLabel = props.cursorLabel,\n cursorComponent = props.cursorComponent,\n width = props.width,\n height = props.height,\n name = props.name,\n horizontal = props.horizontal,\n theme = props.theme;\n var cursorDimension = cursor_helpers.getDimension(props);\n var cursorValue = this.getCursorPosition(props);\n var cursorLabelOffset = this.getCursorLabelOffset(props);\n\n if (!cursorValue) {\n return [];\n }\n\n var newElements = [];\n var padding = this.getPadding(props);\n var cursorCoordinates = {\n x: horizontal ? scale.y(cursorValue.y) : scale.x(cursorValue.x),\n y: horizontal ? scale.x(cursorValue.x) : scale.y(cursorValue.y)\n };\n\n if (cursorLabel) {\n var labelProps = defaults_default()({\n active: true\n }, cursorLabelComponent.props, {\n x: cursorCoordinates.x + cursorLabelOffset.x,\n y: cursorCoordinates.y + cursorLabelOffset.y,\n datum: cursorValue,\n active: true,\n key: "".concat(name, "-cursor-label")\n });\n\n if (isTooltip(cursorLabelComponent)) {\n var tooltipTheme = theme && theme.tooltip || {};\n labelProps = defaults_default()({}, labelProps, tooltipTheme);\n }\n\n newElements.push(react.cloneElement(cursorLabelComponent, defaults_default()({}, labelProps, {\n text: evaluateProp(cursorLabel, labelProps)\n })));\n }\n\n var cursorStyle = assign_default()({\n stroke: "black"\n }, cursorComponent.props.style);\n\n if (cursorDimension === "x" || cursorDimension === undefined) {\n newElements.push(react.cloneElement(cursorComponent, {\n key: "".concat(name, "-x-cursor"),\n x1: cursorCoordinates.x,\n x2: cursorCoordinates.x,\n y1: padding.top,\n y2: height - padding.bottom,\n style: cursorStyle\n }));\n }\n\n if (cursorDimension === "y" || cursorDimension === undefined) {\n newElements.push(react.cloneElement(cursorComponent, {\n key: "".concat(name, "-y-cursor"),\n x1: padding.left,\n x2: width - padding.right,\n y1: cursorCoordinates.y,\n y2: cursorCoordinates.y,\n style: cursorStyle\n }));\n }\n\n return newElements;\n } // Overrides method in VictoryContainer\n\n }, {\n key: "getChildren",\n value: function getChildren(props) {\n return victory_cursor_container_toConsumableArray(react.Children.toArray(props.children)).concat(victory_cursor_container_toConsumableArray(this.getCursorElements(props)));\n }\n }]);\n\n return VictoryCursorContainer;\n }(base), Object.defineProperty(_class, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryCursorContainer"\n }), Object.defineProperty(_class, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_cursor_container_objectSpread({}, VictoryContainer.propTypes, {\n cursorDimension: prop_types_default().oneOf(["x", "y"]),\n cursorLabel: (prop_types_default()).func,\n cursorLabelComponent: (prop_types_default()).element,\n cursorLabelOffset: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().shape({\n x: (prop_types_default()).number,\n y: (prop_types_default()).number\n })]),\n defaultCursorValue: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().shape({\n x: (prop_types_default()).number,\n y: (prop_types_default()).number\n })]),\n disable: (prop_types_default()).bool,\n onCursorChange: (prop_types_default()).func\n })\n }), Object.defineProperty(_class, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_cursor_container_objectSpread({}, VictoryContainer.defaultProps, {\n cursorLabelComponent: react.createElement(victory_label, null),\n cursorLabelOffset: {\n x: 5,\n y: -10\n },\n cursorComponent: react.createElement(line_segment, null)\n })\n }), Object.defineProperty(_class, "defaultEvents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return [{\n target: "parent",\n eventHandlers: {\n onMouseLeave: function (evt, targetProps) {\n return props.disable ? {} : cursor_helpers.onMouseLeave(evt, targetProps);\n },\n onTouchCancel: function () {\n return [];\n },\n onMouseMove: function (evt, targetProps) {\n return props.disable ? {} : cursor_helpers.onMouseMove(evt, targetProps);\n },\n onTouchMove: function (evt, targetProps) {\n return props.disable ? {} : cursor_helpers.onMouseMove(evt, targetProps);\n }\n }\n }];\n }\n }), _temp;\n};\n/* harmony default export */ const victory_cursor_container = (cursorContainerMixin(VictoryContainer));\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartCursorContainer/ChartCursorContainer.js\n\n\n\n\n\n\nconst ChartCursorContainer = (_a) => {\n var { className, themeColor, themeVariant, \n // destructure last\n theme = getTheme(themeColor, themeVariant), cursorLabelComponent = react.createElement(ChartLabel, null) } = _a, // Note that Victory provides its own label component here\n rest = (0,tslib_es6.__rest)(_a, ["className", "themeColor", "themeVariant", "theme", "cursorLabelComponent"]);\n const chartClassName = getClassName({ className });\n const chartCursorLabelComponent = react.cloneElement(cursorLabelComponent, Object.assign({ theme }, cursorLabelComponent.props));\n // Note: theme is required by voronoiContainerMixin\n return (\n // Note: className is valid, but Victory is missing a type\n react.createElement(victory_cursor_container, Object.assign({ className: chartClassName, cursorLabelComponent: chartCursorLabelComponent, theme: theme }, rest)));\n};\nChartCursorContainer.displayName = \'ChartCursorContainer\';\nChartCursorContainer.defaultProps = victory_cursor_container.defaultProps;\n// Note: VictoryCursorContainer.defaultEvents & VictoryContainer.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartCursorContainer, victory_cursor_container);\n//# sourceMappingURL=ChartCursorContainer.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartCursorContainer/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartCursorTooltip/ChartCursorFlyout.js\n\n\n\n\nconst ChartCursorFlyout_getVerticalPath = (props) => {\n const { pointerWidth, cornerRadius, orientation, width, height, center } = props;\n const sign = orientation === \'bottom\' ? 1 : -1;\n // const x = props.x + (props.dx || 0);\n // const y = props.y + (props.dy || 0);\n const centerX = isPlainObject_default()(center) && center.x;\n const centerY = isPlainObject_default()(center) && center.y;\n const pointerEdge = centerY + sign * (height / 2);\n const oppositeEdge = centerY - sign * (height / 2);\n const rightEdge = centerX + width / 2;\n const leftEdge = centerX - width / 2;\n // This has been overridden so the pointer does not stick to data points -- want pointerLength to take precedence\n const x = center.x + (props.dx || 0);\n const y = orientation === \'bottom\'\n ? pointerEdge + props.pointerLength + (props.dy || 0)\n : pointerEdge - props.pointerLength + (props.dy || 0);\n const pointerLength = sign * (y - pointerEdge) < 0 ? 0 : props.pointerLength;\n const direction = orientation === \'bottom\' ? \'0 0 0\' : \'0 0 1\';\n const arc = `${cornerRadius} ${cornerRadius} ${direction}`;\n return `M ${centerX - pointerWidth / 2}, ${pointerEdge}\n L ${pointerLength ? x : centerX + pointerWidth / 2}, ${pointerLength ? y : pointerEdge}\n L ${centerX + pointerWidth / 2}, ${pointerEdge}\n L ${rightEdge - cornerRadius}, ${pointerEdge}\n A ${arc} ${rightEdge}, ${pointerEdge - sign * cornerRadius}\n L ${rightEdge}, ${oppositeEdge + sign * cornerRadius}\n A ${arc} ${rightEdge - cornerRadius}, ${oppositeEdge}\n L ${leftEdge + cornerRadius}, ${oppositeEdge}\n A ${arc} ${leftEdge}, ${oppositeEdge + sign * cornerRadius}\n L ${leftEdge}, ${pointerEdge - sign * cornerRadius}\n A ${arc} ${leftEdge + cornerRadius}, ${pointerEdge}\n z`;\n};\nconst ChartCursorFlyout_getHorizontalPath = (props) => {\n const { pointerWidth, cornerRadius, orientation, width, height, center } = props;\n const sign = orientation === \'left\' ? 1 : -1;\n // const x = props.x + (props.dx || 0);\n // const y = props.y + (props.dy || 0);\n const centerX = isPlainObject_default()(center) && center.x;\n const centerY = isPlainObject_default()(center) && center.y;\n const pointerEdge = centerX - sign * (width / 2);\n const oppositeEdge = centerX + sign * (width / 2);\n const bottomEdge = centerY + height / 2;\n const topEdge = centerY - height / 2;\n // This has been overridden so the pointer does not stick to data points -- want pointerLength to take precedence\n const x = orientation === \'left\'\n ? pointerEdge - props.pointerLength + (props.dx || 0)\n : pointerEdge + props.pointerLength + (props.dx || 0);\n const y = center.y + (props.dy || 0);\n const pointerLength = sign * (x - pointerEdge) > 0 ? 0 : props.pointerLength;\n const direction = orientation === \'left\' ? \'0 0 0\' : \'0 0 1\';\n const arc = `${cornerRadius} ${cornerRadius} ${direction}`;\n return `M ${pointerEdge}, ${centerY - pointerWidth / 2}\n L ${pointerLength ? x : pointerEdge}, ${pointerLength ? y : centerY + pointerWidth / 2}\n L ${pointerEdge}, ${centerY + pointerWidth / 2}\n L ${pointerEdge}, ${bottomEdge - cornerRadius}\n A ${arc} ${pointerEdge + sign * cornerRadius}, ${bottomEdge}\n L ${oppositeEdge - sign * cornerRadius}, ${bottomEdge}\n A ${arc} ${oppositeEdge}, ${bottomEdge - cornerRadius}\n L ${oppositeEdge}, ${topEdge + cornerRadius}\n A ${arc} ${oppositeEdge - sign * cornerRadius}, ${topEdge}\n L ${pointerEdge + sign * cornerRadius}, ${topEdge}\n A ${arc} ${pointerEdge}, ${topEdge + cornerRadius}\n z`;\n};\nconst ChartCursorFlyout_getFlyoutPath = (props) => {\n const orientation = props.orientation || \'top\';\n return orientation === \'left\' || orientation === \'right\' ? ChartCursorFlyout_getHorizontalPath(props) : ChartCursorFlyout_getVerticalPath(props);\n};\nconst ChartCursorFlyout_evaluateProps = (props) => {\n /**\n * Potential evaluated props are:\n * `id`\n * `style`\n */\n const id = evaluateProp(props.id, props);\n const style = evaluateStyle(props.style, props);\n return Object.assign({}, props, { id, style });\n};\nconst ChartCursorFlyout = (props) => {\n props = ChartCursorFlyout_evaluateProps(props);\n return react.cloneElement(props.pathComponent, Object.assign(Object.assign({}, props.events), { style: props.style, d: ChartCursorFlyout_getFlyoutPath(props), className: props.className, shapeRendering: props.shapeRendering, role: props.role, transform: props.transform, clipPath: props.clipPath }));\n};\nChartCursorFlyout.propTypes = Object.assign(Object.assign({}, primitiveProps), { center: prop_types_default().shape({ x: (prop_types_default()).number, y: (prop_types_default()).number }), cornerRadius: (prop_types_default()).number, datum: (prop_types_default()).object, dx: (prop_types_default()).number, dy: (prop_types_default()).number, height: (prop_types_default()).number, orientation: prop_types_default().oneOf([\'top\', \'bottom\', \'left\', \'right\']), pathComponent: (prop_types_default()).element, pointerLength: (prop_types_default()).number, pointerWidth: (prop_types_default()).number, width: (prop_types_default()).number, x: (prop_types_default()).number, y: (prop_types_default()).number });\nChartCursorFlyout.defaultProps = {\n pathComponent: react.createElement(path, null),\n role: \'presentation\',\n shapeRendering: \'auto\'\n};\n\n//# sourceMappingURL=ChartCursorFlyout.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartUtils/chart-tooltip.js\n/* eslint-disable camelcase */\n\n\n\n\n/**\n * When using a cursor container, the tooltip can be offset from the cursor point. If offsetCursorDimensionX is true,\n * the tooltip will appear to the right the vertical cursor. If offsetCursorDimensionY is true, the tooltip will appear\n * above the vertical cursor.\n */\nconst getCursorTooltipCenterOffset = ({ offsetCursorDimensionX = false, offsetCursorDimensionY = false, theme }) => {\n const pointerLength = theme && theme.tooltip ? evaluateProp(theme.tooltip.pointerLength) : 10;\n const offsetX = ({ center, flyoutWidth, width }) => {\n const offset = flyoutWidth / 2 + pointerLength;\n return width > center.x + flyoutWidth + pointerLength ? offset : -offset;\n };\n const offsetY = ({ center, flyoutHeight, width }) => {\n const offset = flyoutHeight / 2 + pointerLength;\n return width > center.y + flyoutHeight + pointerLength ? -offset : offset;\n };\n return {\n x: offsetCursorDimensionX ? offsetX : 0,\n y: offsetCursorDimensionY ? offsetY : 0\n };\n};\n/**\n * When using a cursor container, the tooltip pointer orientation can be adjusted as the cursor approaches the edge of\n * the chart. If horizontal is true, the tooltip pointer will either be \'left\' or \'right\'. If horizontal is true, the\n * tooltip pointer will either be \'top\' or \'bottom\'.\n */\nconst getCursorTooltipPoniterOrientation = ({ horizontal = true, theme }) => {\n const pointerLength = theme && theme.tooltip ? evaluateProp(theme.tooltip.pointerLength) : 10;\n const orientationX = ({ center, flyoutWidth, width }) => width > center.x + flyoutWidth + pointerLength ? \'left\' : \'right\';\n const orientationY = ({ center, flyoutHeight, height }) => height > center.y + flyoutHeight + pointerLength ? \'top\' : \'bottom\';\n return horizontal ? orientationX : orientationY;\n};\n// Returns props associated with legend data\nconst getLegendTooltipDataProps = (defaultProps) => (Object.assign({ borderPadding: 0, gutter: 0, orientation: \'vertical\', padding: 0, rowGutter: 0, style: {\n labels: {\n fill: ChartLegendTooltipStyles.label.fill,\n lineHeight: 0.275,\n padding: 0\n },\n title: {\n fill: ChartLegendTooltipStyles.label.fill,\n padding: 0\n }\n } }, defaultProps));\n// Returns the legend height and width\nconst getLegendTooltipSize = ({ legendData, legendOrientation = \'vertical\', legendProps, text = \'\', theme }) => {\n const textEvaluated = evaluateProp(text);\n const _text = Array.isArray(textEvaluated) ? textEvaluated : [textEvaluated];\n // Find max char lengths\n let maxDataLength = 0;\n let maxTextLength = 0;\n _text.map((name, index) => {\n if (name) {\n if (name.length > maxTextLength) {\n maxTextLength = name.length;\n }\n const hasData = legendData && legendData[index] && legendData[index].name;\n if (hasData) {\n if (legendData[index].name.length > maxDataLength) {\n maxDataLength = legendData[index].name.length;\n }\n }\n }\n });\n // Set length to ensure minimum spacing between label and value\n let maxLength = maxDataLength + maxTextLength;\n if (maxDataLength < 20) {\n maxLength += 2;\n }\n // Get spacing to help align legend labels and text values\n const spacer = \'x\';\n const getSpacing = (legendLabel, textLabel) => {\n let spacing = \'\';\n if (maxLength === 0) {\n return spacing;\n }\n const legendLabelChars = legendLabel ? legendLabel.length : 0;\n const textLabelChars = textLabel ? textLabel.length : 0;\n const maxChars = legendLabelChars + textLabelChars;\n // Add spacer\n while (spacing.length < maxLength - maxChars) {\n spacing += spacer;\n }\n return spacing;\n };\n // Format all text (similar to below) to help determine overall width.\n //\n // {name: "Cats no data"}\n // {name: "Dogs 1"}\n // {name: "Birds 4"}\n // {name: "Mice 3"}\n const data = _text.map((label, index) => {\n const hasData = legendData && legendData[index] && legendData[index].name;\n const spacing = hasData ? getSpacing(legendData[index].name, label) : \'\';\n return {\n name: `${hasData ? legendData[index].name : \'\'}${spacing}${label}`\n };\n });\n // Replace whitespace with spacer char for consistency in width\n const formattedData = data.map(val => ({\n name: val.name.replace(/ /g, spacer)\n }));\n // This should include both legend data and text\n const widthDimensions = getLegendDimensions({\n legendData: formattedData,\n legendOrientation,\n legendProps,\n theme\n });\n // This should only use text. The row gutter changes when displaying all "no data" messages\n const heightDimensions = getLegendDimensions({\n legendData: _text.map((name) => ({ name })),\n legendOrientation,\n legendProps,\n theme\n });\n return {\n height: heightDimensions.height,\n width: widthDimensions.width > 0 ? widthDimensions.width : 0\n };\n};\n// Returns visible legend data, while syncing color scale. If textAsLegendData is true, the text prop is used as\n// legend data so y values can be passed individually to the label component\nconst getLegendTooltipVisibleData = ({ activePoints, colorScale, legendData, text, textAsLegendData = false, theme }) => {\n const textEvaluated = evaluateProp(text);\n const _text = Array.isArray(textEvaluated) ? textEvaluated : [textEvaluated];\n const result = [];\n // Sync data with interactive legends\n if (legendData) {\n let index = -1;\n for (let i = 0; i < legendData.length; i++) {\n const data = legendData[i];\n const activePoint = activePoints ? activePoints.find(item => item.childName === data.childName) : \'\';\n if (!activePoint ||\n (data.symbol && data.symbol.type === \'eyeSlash\' && data.symbol.fill === esm_chart_color_black_500.value)) {\n continue; // Skip hidden data\n }\n if (index++ < _text.length - 1) {\n const themeColor = theme && theme.legend && theme.legend.colorScale\n ? theme.legend.colorScale[i % theme.legend.colorScale.length]\n : undefined;\n result.push({\n name: textAsLegendData ? _text[index] : data.name,\n symbol: Object.assign({ fill: colorScale ? colorScale[i % colorScale.length] : themeColor }, data.symbol)\n });\n }\n }\n }\n return result;\n};\n// Returns visible text for interactive legends\nconst getLegendTooltipVisibleText = ({ activePoints, legendData, text }) => {\n const textEvaluated = evaluateProp(text);\n const _text = Array.isArray(textEvaluated) ? textEvaluated : [textEvaluated];\n const result = [];\n if (legendData) {\n let index = -1;\n for (const data of legendData) {\n const activePoint = activePoints ? activePoints.find(item => item.childName === data.childName) : \'\';\n if (!activePoint ||\n (data.symbol && data.symbol.type === \'eyeSlash\' && data.symbol.fill === esm_chart_color_black_500.value)) {\n continue; // Skip hidden data\n }\n if (index++ < _text.length - 1) {\n result.push(_text[index]);\n }\n }\n }\n return result;\n};\n//# sourceMappingURL=chart-tooltip.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartCursorTooltip/ChartCursorTooltip.js\n\n\n\n\n\n\n\n\n\nconst ChartCursorTooltip = (_a) => {\n var { constrainToVisibleArea = true, flyoutComponent = react.createElement(ChartCursorFlyout, null), labelComponent = react.createElement(ChartLabel, null), labelTextAnchor = \'start\', showPointer = true, style, themeColor, themeVariant, \n // destructure last\n theme = getTheme(themeColor, themeVariant), centerOffset = getCursorTooltipCenterOffset({ offsetCursorDimensionX: true, theme }), pointerOrientation = getCursorTooltipPoniterOrientation({ horizontal: true, theme }), pointerLength = showPointer && theme && theme.tooltip ? theme.tooltip.pointerLength : 0, pointerWidth = theme.tooltip.pointerWidth } = _a, rest = (0,tslib_es6.__rest)(_a, ["constrainToVisibleArea", "flyoutComponent", "labelComponent", "labelTextAnchor", "showPointer", "style", "themeColor", "themeVariant", "theme", "centerOffset", "pointerOrientation", "pointerLength", "pointerWidth"]);\n // Apply text anchor style\n const applyDefaultStyle = (customStyle) => (Object.assign(Object.assign({}, customStyle), { textAnchor: labelTextAnchor // Workaround for VictoryTooltip.getLabelProps referencing the theme style only\n }));\n const newStyle = Array.isArray(style) ? style.map(applyDefaultStyle) : applyDefaultStyle(style);\n const getFlyoutComponent = () => {\n let _pointerLength = evaluateProp(pointerLength);\n if (showPointer && _pointerLength === 0) {\n _pointerLength = theme && theme.tooltip ? evaluateProp(theme.tooltip.pointerLength) : 10;\n }\n return react.cloneElement(flyoutComponent, Object.assign({ pointerLength: _pointerLength, pointerWidth }, flyoutComponent.props));\n };\n return (react.createElement(ChartTooltip, Object.assign({ centerOffset: centerOffset, constrainToVisibleArea: constrainToVisibleArea, flyoutComponent: getFlyoutComponent(), labelComponent: labelComponent, labelTextAnchor: labelTextAnchor, pointerOrientation: pointerOrientation, style: newStyle, theme: theme }, rest)));\n};\nChartCursorTooltip.displayName = \'ChartCursorTooltip\';\n// Note: VictoryTooltip.defaultEvents must be hoisted\nhoist_non_react_statics_cjs_default()(ChartCursorTooltip, VictoryTooltip);\n//# sourceMappingURL=ChartCursorTooltip.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartCursorTooltip/index.js\n\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/victory-pie/es/slice.js\n\n\n\n\nfunction slice_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { slice_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction slice_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\nvar slice_getPath = function (props) {\n var slice = props.slice,\n radius = props.radius,\n innerRadius = props.innerRadius,\n cornerRadius = props.cornerRadius;\n\n if (isFunction_default()(props.pathFunction)) {\n return props.pathFunction(slice);\n }\n\n var padAngle = degreesToRadians(props.padAngle);\n var startAngle = degreesToRadians(props.sliceStartAngle);\n var endAngle = degreesToRadians(props.sliceEndAngle);\n var pathFunction = src_arc().cornerRadius(cornerRadius).outerRadius(radius).innerRadius(innerRadius || 0);\n return pathFunction(defaults_default()({\n startAngle: startAngle,\n endAngle: endAngle,\n padAngle: padAngle\n }, slice));\n};\n\nvar slice_evaluateProps = function (props) {\n /**\n * * Potential evaluated props of following must be evaluated in this order:\n * 1) `style`\n * 2) `radius`\n * 3) `innerRadius`\n *\n * Everything else does not have to be evaluated in a particular order:\n * `ariaLabel`\n * `id`\n * `cornerRadius`\n * `padAngle`\n * `sliceStartAngle`\n * `sliceEndAngle`\n * `tabIndex`\n */\n var style = evaluateStyle(props.style, props);\n var radius = evaluateProp(props.radius, assign_default()({}, props, {\n style: style\n }));\n var innerRadius = evaluateProp(props.innerRadius, assign_default()({}, props, {\n style: style,\n radius: radius\n }));\n var ariaLabel = evaluateProp(props.ariaLabel, props);\n var id = evaluateProp(props.id, props);\n var cornerRadius = evaluateProp(props.cornerRadius, props);\n var padAngle = evaluateProp(props.padAngle, props);\n var sliceStartAngle = evaluateProp(props.sliceStartAngle, props);\n var sliceEndAngle = evaluateProp(props.sliceEndAngle, props);\n var tabIndex = evaluateProp(props.tabIndex, props);\n return assign_default()({}, props, {\n ariaLabel: ariaLabel,\n style: style,\n radius: radius,\n innerRadius: innerRadius,\n id: id,\n cornerRadius: cornerRadius,\n padAngle: padAngle,\n sliceStartAngle: sliceStartAngle,\n sliceEndAngle: sliceEndAngle,\n tabIndex: tabIndex\n });\n};\n\nvar Slice = function (props) {\n props = slice_evaluateProps(props);\n var defaultTransform = props.origin ? "translate(".concat(props.origin.x, ", ").concat(props.origin.y, ")") : undefined;\n return react.cloneElement(props.pathComponent, slice_objectSpread({}, props.events, {\n "aria-label": props.ariaLabel,\n d: slice_getPath(props),\n style: props.style,\n transform: props.transform || defaultTransform,\n className: props.className,\n role: props.role,\n shapeRendering: props.shapeRendering,\n clipPath: props.clipPath,\n tabIndex: props.tabIndex\n }));\n};\n\nSlice.propTypes = slice_objectSpread({}, primitiveProps, {\n cornerRadius: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n datum: (prop_types_default()).object,\n innerRadius: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n padAngle: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n pathComponent: (prop_types_default()).element,\n pathFunction: (prop_types_default()).func,\n radius: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n slice: (prop_types_default()).object,\n sliceEndAngle: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func]),\n sliceStartAngle: prop_types_default().oneOfType([(prop_types_default()).number, (prop_types_default()).func])\n});\nSlice.defaultProps = {\n pathComponent: react.createElement(path, null),\n role: "presentation",\n shapeRendering: "auto"\n};\n/* harmony default export */ const es_slice = (Slice);\n;// CONCATENATED MODULE: ./node_modules/victory-pie/es/helper-methods.js\n\n\n\n\n\n\n\n\nvar checkForValidText = function (text) {\n if (text === undefined || text === null || isFunction_default()(text)) {\n return text;\n } else {\n return "".concat(text);\n }\n};\n\nvar helper_methods_getColor = function (style, colors, index) {\n if (style && style.data && style.data.fill) {\n return style.data.fill;\n }\n\n return colors && colors[index % colors.length];\n};\n\nvar es_helper_methods_getRadius = function (props, padding) {\n if (typeof props.radius === "number") {\n return props.radius;\n }\n\n return Math.min(props.width - padding.left - padding.right, props.height - padding.top - padding.bottom) / 2;\n};\n\nvar helper_methods_getOrigin = function (props, padding) {\n var width = props.width,\n height = props.height;\n var origin = isPlainObject_default()(props.origin) ? props.origin : {};\n return {\n x: origin.x !== undefined ? origin.x : (padding.left - padding.right + width) / 2,\n y: origin.y !== undefined ? origin.y : (padding.top - padding.bottom + height) / 2\n };\n};\n\nvar getSlices = function (props, data) {\n var padAngle = isFunction_default()(props.padAngle) ? 0 : props.padAngle;\n var layoutFunction = pie().sort(null).startAngle(degreesToRadians(props.startAngle)).endAngle(degreesToRadians(props.endAngle)).padAngle(degreesToRadians(padAngle)).value(function (datum) {\n return datum._y;\n });\n return layoutFunction(data);\n};\n\nvar victory_pie_es_helper_methods_getCalculatedValues = function (props) {\n var colorScale = props.colorScale;\n var styleObject = getDefaultStyles(props, "pie");\n var style = getStyles(props.style, styleObject, "auto", "100%");\n var colors = Array.isArray(colorScale) ? colorScale : getColorScale(colorScale);\n var padding = helpers_getPadding(props);\n var defaultRadius = es_helper_methods_getRadius(props, padding);\n var origin = helper_methods_getOrigin(props, padding);\n var data = data_getData(props);\n var slices = getSlices(props, data);\n return assign_default()({}, props, {\n style: style,\n colors: colors,\n padding: padding,\n defaultRadius: defaultRadius,\n data: data,\n slices: slices,\n origin: origin\n });\n};\n\nvar getSliceStyle = function (index, calculatedValues) {\n var style = calculatedValues.style,\n colors = calculatedValues.colors;\n var fill = helper_methods_getColor(style, colors, index);\n return assign_default()({\n fill: fill\n }, style.data);\n};\n\nvar getLabelText = function (props, datum, index) {\n var text;\n\n if (datum.label) {\n text = datum.label;\n } else if (Array.isArray(props.labels)) {\n text = props.labels[index];\n } else {\n text = isFunction_default()(props.labels) ? props.labels : datum.xName || datum._x;\n }\n\n return checkForValidText(text);\n};\n\nvar getLabelArc = function (radius, labelRadius, style) {\n var padding = style && style.padding || 0;\n var arcRadius = labelRadius || radius + padding;\n return src_arc().outerRadius(arcRadius).innerRadius(arcRadius);\n};\n\nvar getLabelPosition = function (arc, slice, position) {\n var construct = {\n startAngle: position === "startAngle" ? slice.startAngle : slice.endAngle,\n endAngle: position === "endAngle" ? slice.endAngle : slice.startAngle\n };\n\n var clonedArc = assign_default()({}, slice, construct);\n\n return arc.centroid(clonedArc);\n};\n\nvar getLabelOrientation = function (degree, labelPlacement) {\n if (labelPlacement === "perpendicular") {\n return degree > 90 && degree < 270 ? "bottom" : "top";\n } else if (labelPlacement === "parallel") {\n return degree >= 0 && degree <= 180 ? "right" : "left";\n }\n\n if (degree < 45 || degree > 315) {\n return "top";\n } else if (degree >= 45 && degree < 135) {\n return "right";\n } else if (degree >= 135 && degree < 225) {\n return "bottom";\n } else {\n return "left";\n }\n};\n\nvar helper_methods_getTextAnchor = function (orientation) {\n if (orientation === "top" || orientation === "bottom") {\n return "middle";\n }\n\n return orientation === "right" ? "start" : "end";\n};\n\nvar helper_methods_getVerticalAnchor = function (orientation) {\n if (orientation === "left" || orientation === "right") {\n return "middle";\n }\n\n return orientation === "bottom" ? "start" : "end";\n};\n\nvar getBaseLabelAngle = function (slice, labelPosition, labelStyle) {\n var baseAngle = 0;\n\n if (labelPosition.angle !== undefined) {\n baseAngle = labelStyle.angle;\n } else if (labelPosition === "centroid") {\n baseAngle = radiansToDegrees((slice.startAngle + slice.endAngle) / 2);\n } else {\n baseAngle = labelPosition === "startAngle" ? radiansToDegrees(slice.startAngle) : radiansToDegrees(slice.endAngle);\n }\n\n var positiveAngle = baseAngle < 0 ? 360 - baseAngle : baseAngle;\n return positiveAngle % 360;\n};\n\nvar getLabelAngle = function (baseAngle, labelPlacement) {\n if (labelPlacement === "vertical") {\n return 0;\n }\n\n if (labelPlacement === "parallel") {\n return baseAngle > 180 && baseAngle < 360 ? baseAngle + 90 : baseAngle - 90;\n }\n\n return baseAngle > 90 && baseAngle < 270 ? baseAngle - 180 : baseAngle;\n};\n\nvar getLabelProps = function (text, dataProps, calculatedValues) {\n var index = dataProps.index,\n datum = dataProps.datum,\n data = dataProps.data,\n slice = dataProps.slice,\n labelComponent = dataProps.labelComponent,\n theme = dataProps.theme;\n var style = calculatedValues.style,\n defaultRadius = calculatedValues.defaultRadius,\n origin = calculatedValues.origin,\n width = calculatedValues.width,\n height = calculatedValues.height;\n var labelRadius = evaluateProp(calculatedValues.labelRadius, assign_default()({\n text: text\n }, dataProps));\n var labelPosition = evaluateProp(calculatedValues.labelPosition, assign_default()({\n text: text\n }, dataProps)) || "centroid";\n var labelPlacement = evaluateProp(calculatedValues.labelPlacement, assign_default()({\n text: text\n }, dataProps)) || "vertical";\n\n var labelStyle = assign_default()({\n padding: 0\n }, style.labels);\n\n var evaluatedStyle = evaluateStyle(labelStyle, assign_default()({\n labelRadius: labelRadius,\n text: text\n }, dataProps));\n var labelArc = getLabelArc(defaultRadius, labelRadius, evaluatedStyle);\n var position = getLabelPosition(labelArc, slice, labelPosition);\n var baseAngle = getBaseLabelAngle(slice, labelPosition, labelStyle);\n var labelAngle = getLabelAngle(baseAngle, labelPlacement);\n var orientation = getLabelOrientation(baseAngle, labelPlacement);\n var textAnchor = labelStyle.textAnchor || helper_methods_getTextAnchor(orientation);\n var verticalAnchor = labelStyle.verticalAnchor || helper_methods_getVerticalAnchor(orientation);\n var labelProps = {\n width: width,\n height: height,\n index: index,\n datum: datum,\n data: data,\n slice: slice,\n orientation: orientation,\n text: text,\n style: labelStyle,\n x: Math.round(position[0]) + origin.x,\n y: Math.round(position[1]) + origin.y,\n textAnchor: textAnchor,\n verticalAnchor: verticalAnchor,\n angle: labelAngle\n };\n\n if (!isTooltip(labelComponent)) {\n return labelProps;\n }\n\n var tooltipTheme = theme && theme.tooltip || {};\n return defaults_default()({}, labelProps, omit(tooltipTheme, ["style"]));\n};\n\nvar victory_pie_es_helper_methods_getBaseProps = function (props, fallbackProps) {\n props = modifyProps(props, fallbackProps, "pie");\n var calculatedValues = victory_pie_es_helper_methods_getCalculatedValues(props);\n var slices = calculatedValues.slices,\n style = calculatedValues.style,\n data = calculatedValues.data,\n origin = calculatedValues.origin,\n defaultRadius = calculatedValues.defaultRadius,\n labels = calculatedValues.labels,\n events = calculatedValues.events,\n sharedEvents = calculatedValues.sharedEvents,\n height = calculatedValues.height,\n width = calculatedValues.width,\n standalone = calculatedValues.standalone,\n name = calculatedValues.name,\n innerRadius = calculatedValues.innerRadius,\n cornerRadius = calculatedValues.cornerRadius,\n padAngle = calculatedValues.padAngle,\n disableInlineStyles = calculatedValues.disableInlineStyles;\n var radius = props.radius || defaultRadius;\n var initialChildProps = {\n parent: {\n standalone: standalone,\n height: height,\n width: width,\n slices: slices,\n name: name,\n style: style.parent\n }\n };\n return slices.reduce(function (childProps, slice, index) {\n var datum = defaults_default()({}, data[index], {\n startAngle: radiansToDegrees(slice.startAngle),\n endAngle: radiansToDegrees(slice.endAngle),\n padAngle: radiansToDegrees(slice.padAngle)\n });\n\n var eventKey = !isNil_default()(datum.eventKey) ? datum.eventKey : index;\n var dataProps = {\n index: index,\n slice: slice,\n datum: datum,\n data: data,\n origin: origin,\n innerRadius: innerRadius,\n radius: radius,\n cornerRadius: cornerRadius,\n padAngle: padAngle,\n style: disableInlineStyles ? {} : getSliceStyle(index, calculatedValues),\n disableInlineStyles: disableInlineStyles\n };\n childProps[eventKey] = {\n data: dataProps\n };\n var text = getLabelText(props, datum, index);\n\n if (text !== undefined && text !== null || labels && (events || sharedEvents)) {\n var evaluatedText = evaluateProp(text, dataProps);\n childProps[eventKey].labels = getLabelProps(evaluatedText, assign_default()({}, props, dataProps), calculatedValues);\n }\n\n return childProps;\n }, initialChildProps);\n};\n;// CONCATENATED MODULE: ./node_modules/victory-pie/es/victory-pie.js\nfunction victory_pie_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_pie_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_pie_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_pie_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_pie_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_pie_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_pie_assertThisInitialized(self); }\n\nfunction victory_pie_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_pie_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/*eslint no-magic-numbers: ["error", { "ignore": [-1, 0, 1, 2] }]*/\n\n\n\n\n\nvar victory_pie_fallbackProps = {\n endAngle: 360,\n height: 400,\n innerRadius: 0,\n cornerRadius: 0,\n padAngle: 0,\n padding: 30,\n width: 400,\n startAngle: 0,\n colorScale: ["#ffffff", "#f0f0f0", "#d9d9d9", "#bdbdbd", "#969696", "#737373", "#525252", "#252525", "#000000"],\n labelPosition: "centroid"\n};\n\nvar VictoryPie =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_pie_inherits(VictoryPie, _React$Component);\n\n function VictoryPie() {\n victory_pie_classCallCheck(this, VictoryPie);\n\n return victory_pie_possibleConstructorReturn(this, (VictoryPie.__proto__ || Object.getPrototypeOf(VictoryPie)).apply(this, arguments));\n }\n\n victory_pie_createClass(VictoryPie, [{\n key: "shouldAnimate",\n // Overridden in victory-native\n value: function shouldAnimate() {\n return Boolean(this.props.animate);\n }\n }, {\n key: "render",\n value: function render() {\n var animationWhitelist = VictoryPie.animationWhitelist,\n role = VictoryPie.role;\n var props = modifyProps(this.props, victory_pie_fallbackProps, role);\n\n if (this.shouldAnimate()) {\n return this.animateComponent(props, animationWhitelist);\n }\n\n var children = this.renderData(props);\n return props.standalone ? this.renderContainer(props.containerComponent, children) : children;\n }\n }]);\n\n return VictoryPie;\n}(react.Component);\n\nObject.defineProperty(VictoryPie, "animationWhitelist", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["data", "endAngle", "height", "innerRadius", "cornerRadius", "padAngle", "padding", "colorScale", "startAngle", "style", "width"]\n});\nObject.defineProperty(VictoryPie, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryPie"\n});\nObject.defineProperty(VictoryPie, "role", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "pie"\n});\nObject.defineProperty(VictoryPie, "defaultTransitions", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n onExit: {\n duration: 500,\n before: function () {\n return {\n _y: 0,\n label: " "\n };\n }\n },\n onEnter: {\n duration: 500,\n before: function () {\n return {\n _y: 0,\n label: " "\n };\n },\n after: function (datum) {\n return {\n y_: datum._y,\n label: datum.label\n };\n }\n }\n }\n});\nObject.defineProperty(VictoryPie, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n animate: prop_types_default().oneOfType([(prop_types_default()).bool, (prop_types_default()).object]),\n colorScale: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).string), prop_types_default().oneOf(["grayscale", "qualitative", "heatmap", "warm", "cool", "red", "green", "blue"])]),\n containerComponent: (prop_types_default()).element,\n cornerRadius: prop_types_default().oneOfType([nonNegative, (prop_types_default()).func]),\n data: (prop_types_default()).array,\n dataComponent: (prop_types_default()).element,\n disableInlineStyes: (prop_types_default()).bool,\n endAngle: (prop_types_default()).number,\n eventKey: prop_types_default().oneOfType([(prop_types_default()).func, allOfType([integer, nonNegative]), (prop_types_default()).string]),\n events: prop_types_default().arrayOf(prop_types_default().shape({\n target: prop_types_default().oneOf(["data", "labels", "parent"]),\n eventKey: prop_types_default().oneOfType([(prop_types_default()).array, (prop_types_default()).func, allOfType([integer, nonNegative]), (prop_types_default()).string]),\n eventHandlers: (prop_types_default()).object\n })),\n externalEventMutations: prop_types_default().arrayOf(prop_types_default().shape({\n callback: (prop_types_default())["function"],\n childName: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).array]),\n eventKey: prop_types_default().oneOfType([(prop_types_default()).array, allOfType([integer, nonNegative]), (prop_types_default()).string]),\n mutation: (prop_types_default())["function"],\n target: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).array])\n })),\n groupComponent: (prop_types_default()).element,\n height: nonNegative,\n innerRadius: prop_types_default().oneOfType([nonNegative, (prop_types_default()).func]),\n labelComponent: (prop_types_default()).element,\n labelPlacement: prop_types_default().oneOfType([(prop_types_default()).func, prop_types_default().oneOf(["parallel", "perpendicular", "vertical"])]),\n labelPosition: prop_types_default().oneOfType([(prop_types_default()).func, prop_types_default().oneOf(["startAngle", "centroid", "endAngle"])]),\n labelRadius: prop_types_default().oneOfType([nonNegative, (prop_types_default()).func]),\n labels: prop_types_default().oneOfType([(prop_types_default()).func, (prop_types_default()).array]),\n name: (prop_types_default()).string,\n origin: prop_types_default().shape({\n x: nonNegative,\n y: nonNegative\n }),\n padAngle: prop_types_default().oneOfType([nonNegative, (prop_types_default()).func]),\n padding: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().shape({\n top: (prop_types_default()).number,\n bottom: (prop_types_default()).number,\n left: (prop_types_default()).number,\n right: (prop_types_default()).number\n })]),\n radius: prop_types_default().oneOfType([nonNegative, (prop_types_default()).func]),\n sharedEvents: prop_types_default().shape({\n events: (prop_types_default()).array,\n getEventState: (prop_types_default()).func\n }),\n sortKey: prop_types_default().oneOfType([(prop_types_default()).func, allOfType([integer, nonNegative]), (prop_types_default()).string, prop_types_default().arrayOf((prop_types_default()).string)]),\n sortOrder: prop_types_default().oneOf(["ascending", "descending"]),\n standalone: (prop_types_default()).bool,\n startAngle: (prop_types_default()).number,\n style: prop_types_default().shape({\n parent: (prop_types_default()).object,\n data: (prop_types_default()).object,\n labels: (prop_types_default()).object\n }),\n theme: (prop_types_default()).object,\n width: nonNegative,\n x: prop_types_default().oneOfType([(prop_types_default()).func, allOfType([integer, nonNegative]), (prop_types_default()).string, prop_types_default().arrayOf((prop_types_default()).string)]),\n y: prop_types_default().oneOfType([(prop_types_default()).func, allOfType([integer, nonNegative]), (prop_types_default()).string, prop_types_default().arrayOf((prop_types_default()).string)])\n }\n});\nObject.defineProperty(VictoryPie, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n data: [{\n x: "A",\n y: 1\n }, {\n x: "B",\n y: 2\n }, {\n x: "C",\n y: 3\n }, {\n x: "D",\n y: 1\n }, {\n x: "E",\n y: 2\n }],\n standalone: true,\n dataComponent: react.createElement(es_slice, null),\n labelComponent: react.createElement(victory_label, null),\n containerComponent: react.createElement(VictoryContainer, null),\n groupComponent: react.createElement("g", null),\n sortOrder: "ascending",\n theme: victory_theme.grayscale\n }\n});\nObject.defineProperty(VictoryPie, "getBaseProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return victory_pie_es_helper_methods_getBaseProps(props, victory_pie_fallbackProps);\n }\n});\nObject.defineProperty(VictoryPie, "getData", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: data_getData\n});\nObject.defineProperty(VictoryPie, "expectedComponents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["dataComponent", "labelComponent", "groupComponent", "containerComponent"]\n});\n/* harmony default export */ const victory_pie = (add_events(VictoryPie));\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartPie/ChartPie.js\n\n\n\n\n\n\n\n\n\n\nvar ChartPieLabelPosition;\n(function (ChartPieLabelPosition) {\n ChartPieLabelPosition["centroid"] = "centroid";\n ChartPieLabelPosition["endAngle"] = "endAngle";\n ChartPieLabelPosition["startAngle"] = "startAngle";\n})(ChartPieLabelPosition || (ChartPieLabelPosition = {}));\nvar ChartPieLegendPosition;\n(function (ChartPieLegendPosition) {\n ChartPieLegendPosition["bottom"] = "bottom";\n ChartPieLegendPosition["right"] = "right";\n})(ChartPieLegendPosition || (ChartPieLegendPosition = {}));\nvar ChartPieSortOrder;\n(function (ChartPieSortOrder) {\n ChartPieSortOrder["ascending"] = "ascending";\n ChartPieSortOrder["descending"] = "descending";\n})(ChartPieSortOrder || (ChartPieSortOrder = {}));\nconst ChartPie = (_a) => {\n var { allowTooltip = true, ariaDesc, ariaTitle, constrainToVisibleArea = false, containerComponent = react.createElement(ChartContainer, null), labels, legendAllowWrap = false, legendComponent = react.createElement(ChartLegend, null), legendData, legendPosition = ChartCommonStyles.legend.position, padding, radius, standalone = true, themeColor, themeVariant, \n // destructure last\n theme = getTheme(themeColor, themeVariant), labelComponent = allowTooltip ? (react.createElement(ChartTooltip, { constrainToVisibleArea: constrainToVisibleArea, theme: theme })) : (undefined), legendOrientation = theme.legend.orientation, height = theme.pie.height, width = theme.pie.width } = _a, rest = (0,tslib_es6.__rest)(_a, ["allowTooltip", "ariaDesc", "ariaTitle", "constrainToVisibleArea", "containerComponent", "labels", "legendAllowWrap", "legendComponent", "legendData", "legendPosition", "padding", "radius", "standalone", "themeColor", "themeVariant", "theme", "labelComponent", "legendOrientation", "height", "width"]);\n const defaultPadding = {\n bottom: getPaddingForSide(\'bottom\', padding, theme.pie.padding),\n left: getPaddingForSide(\'left\', padding, theme.pie.padding),\n right: getPaddingForSide(\'right\', padding, theme.pie.padding),\n top: getPaddingForSide(\'top\', padding, theme.pie.padding)\n };\n // Ensure non-negative value is returned\n const getDefaultRadius = () => {\n const result = getRadius({\n height,\n width,\n padding: defaultPadding\n });\n return result > -1 ? result : undefined;\n };\n const chartRadius = radius ? radius : getDefaultRadius();\n const chart = (react.createElement(victory_pie, Object.assign({ height: height, key: "pf-chart-pie", labels: labels, labelComponent: labelComponent, padding: padding, radius: chartRadius, standalone: false, theme: theme, width: width }, rest)));\n const legend = react.cloneElement(legendComponent, Object.assign({ data: legendData, key: \'pf-chart-pie-legend\', orientation: legendOrientation, theme }, legendComponent.props));\n // Returns a computed legend\n const getLegend = () => {\n if (!legend.props.data) {\n return null;\n }\n return getComputedLegend({\n allowWrap: legendAllowWrap,\n chartType: \'pie\',\n height,\n legendComponent: legend,\n padding: defaultPadding,\n position: legendPosition,\n theme,\n width\n });\n };\n // Clone so users can override container props\n const container = react.cloneElement(containerComponent, Object.assign({ desc: ariaDesc, height, title: ariaTitle, width,\n theme }, containerComponent.props), [chart, getLegend()]);\n return standalone ? (react.createElement(react.Fragment, null, container)) : (react.createElement(react.Fragment, null,\n chart,\n getLegend()));\n};\nChartPie.displayName = \'ChartPie\';\n// Note: VictoryPie.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartPie, victory_pie);\n//# sourceMappingURL=ChartPie.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartDonut/ChartDonut.js\n\n\n\n\n\n\n\n\n\n\n\nvar ChartDonutLabelPosition;\n(function (ChartDonutLabelPosition) {\n ChartDonutLabelPosition["centroid"] = "centroid";\n ChartDonutLabelPosition["endAngle"] = "endAngle";\n ChartDonutLabelPosition["startAngle"] = "startAngle";\n})(ChartDonutLabelPosition || (ChartDonutLabelPosition = {}));\nvar ChartDonutSortOrder;\n(function (ChartDonutSortOrder) {\n ChartDonutSortOrder["ascending"] = "ascending";\n ChartDonutSortOrder["descending"] = "descending";\n})(ChartDonutSortOrder || (ChartDonutSortOrder = {}));\nvar ChartDonutSubTitlePosition;\n(function (ChartDonutSubTitlePosition) {\n ChartDonutSubTitlePosition["bottom"] = "bottom";\n ChartDonutSubTitlePosition["center"] = "center";\n ChartDonutSubTitlePosition["right"] = "right";\n})(ChartDonutSubTitlePosition || (ChartDonutSubTitlePosition = {}));\nconst ChartDonut = (_a) => {\n var { allowTooltip = true, ariaDesc, ariaTitle, capHeight = 1.1, containerComponent = react.createElement(ChartContainer, null), innerRadius, legendAllowWrap, legendPosition = ChartCommonStyles.legend.position, padAngle, padding, radius, standalone = true, subTitle, subTitleComponent, subTitlePosition = ChartDonutStyles.label.subTitlePosition, themeColor, themeVariant, title, titleComponent = react.createElement(ChartLabel, null), \n // destructure last\n theme = getDonutTheme(themeColor, themeVariant), height = theme.pie.height, width = theme.pie.width } = _a, rest = (0,tslib_es6.__rest)(_a, ["allowTooltip", "ariaDesc", "ariaTitle", "capHeight", "containerComponent", "innerRadius", "legendAllowWrap", "legendPosition", "padAngle", "padding", "radius", "standalone", "subTitle", "subTitleComponent", "subTitlePosition", "themeColor", "themeVariant", "title", "titleComponent", "theme", "height", "width"]);\n const defaultPadding = {\n bottom: getPaddingForSide(\'bottom\', padding, theme.pie.padding),\n left: getPaddingForSide(\'left\', padding, theme.pie.padding),\n right: getPaddingForSide(\'right\', padding, theme.pie.padding),\n top: getPaddingForSide(\'top\', padding, theme.pie.padding)\n };\n const chartRadius = radius\n ? radius\n : getRadius({\n height,\n width,\n padding: defaultPadding\n });\n const chartInnerRadius = innerRadius ? innerRadius : chartRadius - 9; // Todo: Add pf-core variable\n const centerSubTitle = subTitle && subTitlePosition === ChartDonutSubTitlePosition.center;\n // Returns title and subtitle\n const getAllTitles = () => {\n if (!subTitleComponent && centerSubTitle) {\n return getTitle({\n styles: [ChartDonutStyles.label.title, ChartDonutStyles.label.subTitle],\n titles: [title, subTitle]\n });\n }\n return (react.createElement(react.Fragment, { key: "pf-chart-donut-titles" },\n getTitle({ titles: title, dy: centerSubTitle ? -8 : 0 }),\n getSubTitle({ textComponent: subTitleComponent, dy: centerSubTitle ? 15 : 0 })));\n };\n // This function will be evaluated for each slice with the props that correspond to that slice.\n const getPadAngle = ({ datum }) => (datum._y > 0 ? theme.pie.padAngle : 0);\n // Returns subtitle\n const getSubTitle = ({ dy = 0, textComponent = react.createElement(ChartLabel, null) }) => {\n if (!subTitle) {\n return null;\n }\n const subTitleProps = textComponent.props ? textComponent.props : {};\n return react.cloneElement(textComponent, Object.assign({ key: \'pf-chart-donut-subtitle\', style: ChartDonutStyles.label.subTitle, text: subTitle, textAnchor: subTitlePosition === \'right\' ? \'start\' : \'middle\', verticalAnchor: \'middle\', x: getPieLabelX({\n height,\n labelPosition: subTitlePosition,\n legendPosition,\n padding: defaultPadding,\n width\n }), y: getPieLabelY({\n dy,\n height,\n labelPosition: subTitlePosition,\n padding: defaultPadding,\n width\n }) }, subTitleProps));\n };\n // Returns title\n const getTitle = ({ dy = 0, styles = ChartDonutStyles.label.title, titles = title }) => {\n if (!titles) {\n return null;\n }\n const titleProps = titleComponent ? titleComponent.props : {};\n return react.cloneElement(titleComponent, Object.assign(Object.assign(Object.assign({}, (Array.isArray(titles) && { capHeight })), { key: \'pf-chart-donut-title\', style: styles, text: titles, textAnchor: \'middle\', verticalAnchor: \'middle\', x: getPieLabelX({\n height,\n labelPosition: \'center\',\n legendPosition,\n padding: defaultPadding,\n width\n }), y: getPieLabelY({\n dy,\n height,\n labelPosition: \'center\',\n padding: defaultPadding,\n width\n }) }), titleProps));\n };\n const chart = (react.createElement(ChartPie, Object.assign({ allowTooltip: allowTooltip, height: height, innerRadius: chartInnerRadius > 0 ? chartInnerRadius : 0, key: "pf-chart-donut-pie", legendAllowWrap: legendAllowWrap, legendPosition: legendPosition, padAngle: padAngle !== undefined ? padAngle : getPadAngle, padding: padding, radius: chartRadius > 0 ? chartRadius : 0, standalone: false, theme: theme, width: width }, rest)));\n // Clone so users can override container props\n const container = react.cloneElement(containerComponent, Object.assign({ desc: ariaDesc, height, title: ariaTitle, width,\n theme }, containerComponent.props), [chart, getAllTitles()]);\n return standalone ? (react.createElement(react.Fragment, null, container)) : (react.createElement(react.Fragment, null,\n chart,\n getAllTitles()));\n};\nChartDonut.displayName = \'ChartDonut\';\n// Note: VictoryPie.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartDonut, victory_pie);\n//# sourceMappingURL=ChartDonut.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartDonut/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartDonutUtilization/ChartDonutThreshold.js\n\n\n\n\n\n\n\n\n\nvar ChartDonutThresholdDonutOrientation;\n(function (ChartDonutThresholdDonutOrientation) {\n ChartDonutThresholdDonutOrientation["left"] = "left";\n ChartDonutThresholdDonutOrientation["right"] = "right";\n ChartDonutThresholdDonutOrientation["top"] = "top";\n})(ChartDonutThresholdDonutOrientation || (ChartDonutThresholdDonutOrientation = {}));\nvar ChartDonutThresholdLabelOrientation;\n(function (ChartDonutThresholdLabelOrientation) {\n ChartDonutThresholdLabelOrientation["horizontal"] = "horizontal";\n ChartDonutThresholdLabelOrientation["vertical"] = "vertical";\n})(ChartDonutThresholdLabelOrientation || (ChartDonutThresholdLabelOrientation = {}));\nvar ChartDonutThresholdLabelPosition;\n(function (ChartDonutThresholdLabelPosition) {\n ChartDonutThresholdLabelPosition["centroid"] = "centroid";\n ChartDonutThresholdLabelPosition["endAngle"] = "endAngle";\n ChartDonutThresholdLabelPosition["startAngle"] = "startAngle";\n})(ChartDonutThresholdLabelPosition || (ChartDonutThresholdLabelPosition = {}));\nvar ChartDonutThresholdSortOrder;\n(function (ChartDonutThresholdSortOrder) {\n ChartDonutThresholdSortOrder["ascending"] = "ascending";\n ChartDonutThresholdSortOrder["descending"] = "descending";\n})(ChartDonutThresholdSortOrder || (ChartDonutThresholdSortOrder = {}));\nvar ChartDonutThresholdSubTitlePosition;\n(function (ChartDonutThresholdSubTitlePosition) {\n ChartDonutThresholdSubTitlePosition["bottom"] = "bottom";\n ChartDonutThresholdSubTitlePosition["center"] = "center";\n ChartDonutThresholdSubTitlePosition["right"] = "right";\n})(ChartDonutThresholdSubTitlePosition || (ChartDonutThresholdSubTitlePosition = {}));\nconst ChartDonutThreshold = (_a) => {\n var { allowTooltip = true, ariaDesc, ariaTitle, children, constrainToVisibleArea = false, containerComponent = react.createElement(ChartContainer, null), data = [], invert = false, labels = [], // Don\'t show any tooltip labels by default, let consumer override if needed\n padding, radius, standalone = true, subTitlePosition = ChartDonutStyles.label.subTitlePosition, themeColor, themeVariant, x, y, \n // destructure last\n theme = getDonutThresholdStaticTheme(themeColor, themeVariant, invert), height = theme.pie.height, width = theme.pie.width } = _a, rest = (0,tslib_es6.__rest)(_a, ["allowTooltip", "ariaDesc", "ariaTitle", "children", "constrainToVisibleArea", "containerComponent", "data", "invert", "labels", "padding", "radius", "standalone", "subTitlePosition", "themeColor", "themeVariant", "x", "y", "theme", "height", "width"]);\n const defaultPadding = {\n bottom: getPaddingForSide(\'bottom\', padding, theme.pie.padding),\n left: getPaddingForSide(\'left\', padding, theme.pie.padding),\n right: getPaddingForSide(\'right\', padding, theme.pie.padding),\n top: getPaddingForSide(\'top\', padding, theme.pie.padding)\n };\n const chartRadius = radius ||\n getRadius({\n height,\n width,\n padding: defaultPadding\n });\n // Returns computed data representing pie chart slices\n const getComputedData = () => {\n // Format and sort data. Sorting ensures thresholds are displayed in the correct order and simplifies calculations.\n const datum = formatData(data, Object.assign({ x, y }, rest), [\'x\', \'y\']).sort((a, b) => a._y - b._y);\n // Data must be offset so that the sum of all data point y-values (including the final slice) == 100.\n const [prev, computedData] = datum.reduce((acc, dataPoint) => [\n dataPoint._y,\n [\n ...acc[1],\n {\n x: dataPoint._x,\n y: dataPoint._y - acc[0] // Must be offset by previous value\n }\n ]\n ], [0, []]);\n return [\n ...computedData,\n {\n y: prev ? 100 - prev : 0\n }\n ];\n };\n // Render dynamic utilization donut cart\n const renderChildren = () => react.Children.toArray(children).map((child, index) => {\n if (react.isValidElement(child)) {\n const _a = child.props, { data: childData } = _a, childProps = (0,tslib_es6.__rest)(_a, ["data"]);\n const datum = formatData([childData], childProps, [\'x\', \'y\']); // Format child data independently of this component\'s props\n const dynamicTheme = childProps.theme ||\n getDonutThresholdDynamicTheme(childProps.themeColor || themeColor, childProps.themeVariant || themeVariant);\n return react.cloneElement(child, Object.assign({ constrainToVisibleArea, data: childData, endAngle: 360 * (datum[0]._y ? datum[0]._y / 100 : 0), height,\n invert, key: `pf-chart-donut-threshold-child-${index}`, padding: defaultPadding, radius: chartRadius - 14, showStatic: false, standalone: false, subTitlePosition: childProps.subTitlePosition || subTitlePosition, theme: dynamicTheme, width }, childProps));\n }\n return child;\n });\n // Static threshold donut chart\n const chart = (react.createElement(ChartDonut, Object.assign({ allowTooltip: allowTooltip, constrainToVisibleArea: constrainToVisibleArea, data: getComputedData(), height: height, key: "pf-chart-donut-threshold", labels: labels, padding: defaultPadding, standalone: false, theme: theme, width: width }, rest)));\n // Clone so users can override container props\n const container = react.cloneElement(containerComponent, Object.assign({ desc: ariaDesc, height, title: ariaTitle, width,\n theme }, containerComponent.props), [chart, renderChildren()]);\n return standalone ? (react.createElement(react.Fragment, null, container)) : (react.createElement(react.Fragment, null,\n chart,\n renderChildren()));\n};\nChartDonutThreshold.displayName = \'ChartDonutThreshold\';\n// Note: VictoryPie.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartDonutThreshold, victory_pie);\n//# sourceMappingURL=ChartDonutThreshold.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartDonutUtilization/ChartDonutUtilization.js\n\n\n\n\n\n\n\n\n\n\nvar ChartDonutUtilizationLabelPosition;\n(function (ChartDonutUtilizationLabelPosition) {\n ChartDonutUtilizationLabelPosition["centroid"] = "centroid";\n ChartDonutUtilizationLabelPosition["endAngle"] = "endAngle";\n ChartDonutUtilizationLabelPosition["startAngle"] = "startAngle";\n})(ChartDonutUtilizationLabelPosition || (ChartDonutUtilizationLabelPosition = {}));\nvar ChartDonutUtilizationLegendOrientation;\n(function (ChartDonutUtilizationLegendOrientation) {\n ChartDonutUtilizationLegendOrientation["horizontal"] = "horizontal";\n ChartDonutUtilizationLegendOrientation["vertical"] = "vertical";\n})(ChartDonutUtilizationLegendOrientation || (ChartDonutUtilizationLegendOrientation = {}));\nvar ChartDonutUtilizationLegendPosition;\n(function (ChartDonutUtilizationLegendPosition) {\n ChartDonutUtilizationLegendPosition["bottom"] = "bottom";\n ChartDonutUtilizationLegendPosition["right"] = "right";\n})(ChartDonutUtilizationLegendPosition || (ChartDonutUtilizationLegendPosition = {}));\nvar ChartDonutUtilizationSortOrder;\n(function (ChartDonutUtilizationSortOrder) {\n ChartDonutUtilizationSortOrder["ascending"] = "ascending";\n ChartDonutUtilizationSortOrder["descending"] = "descending";\n})(ChartDonutUtilizationSortOrder || (ChartDonutUtilizationSortOrder = {}));\nvar ChartDonutUtilizationSubTitlePosition;\n(function (ChartDonutUtilizationSubTitlePosition) {\n ChartDonutUtilizationSubTitlePosition["bottom"] = "bottom";\n ChartDonutUtilizationSubTitlePosition["center"] = "center";\n ChartDonutUtilizationSubTitlePosition["right"] = "right";\n})(ChartDonutUtilizationSubTitlePosition || (ChartDonutUtilizationSubTitlePosition = {}));\nconst ChartDonutUtilization = (_a) => {\n var { allowTooltip = true, ariaDesc, ariaTitle, containerComponent = react.createElement(ChartContainer, null), data, invert = false, legendPosition = ChartCommonStyles.legend.position, padding, showStatic = true, standalone = true, themeColor, themeVariant, thresholds, x, y, \n // destructure last\n theme = getDonutUtilizationTheme(themeColor, themeVariant), height = theme.pie.height, width = theme.pie.width } = _a, rest = (0,tslib_es6.__rest)(_a, ["allowTooltip", "ariaDesc", "ariaTitle", "containerComponent", "data", "invert", "legendPosition", "padding", "showStatic", "standalone", "themeColor", "themeVariant", "thresholds", "x", "y", "theme", "height", "width"]);\n // Returns computed data representing pie chart slices\n const getComputedData = () => {\n const datum = getData();\n const computedData = [{ x: datum[0]._x, y: datum[0]._y || 0 }];\n if (showStatic) {\n computedData.push({ y: datum[0]._x ? Math.abs(100 - datum[0]._y) : 100 });\n }\n return computedData;\n };\n const getData = () => {\n const datum = [Object.assign({}, data)];\n return formatData(datum, Object.assign({ x, y }, rest), [\'x\', \'y\']).sort((a, b) => a._y - b._y);\n };\n // Returns thresholds with default color scale\n const getDonutThresholds = () => {\n const result = [];\n if (thresholds) {\n // Ensure thresholds are in sorted order\n const sThresholds = orderBy_default()(thresholds, \'value\', invert ? \'desc\' : \'asc\');\n const numColors = ChartDonutUtilizationStyles.thresholds.colorScale.length;\n for (let i = 0; i < sThresholds.length; i++) {\n result.push({\n color: sThresholds[i].color\n ? sThresholds[i].color\n : ChartDonutUtilizationStyles.thresholds.colorScale[i % numColors],\n value: sThresholds[i].value\n });\n }\n }\n return result;\n };\n // Returns theme based on threshold and current value\n const getThresholdTheme = () => {\n const newTheme = Object.assign({}, theme);\n if (data) {\n const datum = getData();\n const donutThresholds = getDonutThresholds();\n const mergeThemeProps = (i) => {\n // Merge just the first color of dynamic (blue, green, etc.) with static (gray) for expected colorScale\n if (newTheme.pie.colorScale instanceof Array) {\n newTheme.pie.colorScale[0] = donutThresholds[i].color;\n }\n else {\n newTheme.pie.colorScale = donutThresholds[i].color;\n }\n if (newTheme.legend.colorScale instanceof Array) {\n newTheme.legend.colorScale[0] = donutThresholds[i].color;\n }\n else {\n newTheme.legend.colorScale = donutThresholds[i].color;\n }\n };\n for (let i = 0; i < donutThresholds.length; i++) {\n if (invert) {\n if (datum[0]._y <= donutThresholds[i].value) {\n mergeThemeProps(i);\n }\n }\n else {\n if (datum[0]._y >= donutThresholds[i].value) {\n mergeThemeProps(i);\n }\n }\n }\n }\n return newTheme;\n };\n // Dynamic donut chart\n const chart = (react.createElement(ChartDonut, Object.assign({ allowTooltip: allowTooltip, data: getComputedData(), height: height, key: "pf-chart-donut-utilization", legendPosition: legendPosition, padding: padding, standalone: false, theme: getThresholdTheme(), width: width }, rest)));\n // Clone so users can override container props\n const container = react.cloneElement(containerComponent, Object.assign({ desc: ariaDesc, height, title: ariaTitle, width,\n theme }, containerComponent.props), [chart]);\n return standalone ? react.createElement(react.Fragment, null, container) : react.createElement(react.Fragment, null, chart);\n};\nChartDonutUtilization.displayName = \'ChartDonutUtilization\';\n// Note: VictoryPie.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartDonutUtilization, victory_pie);\n//# sourceMappingURL=ChartDonutUtilization.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartDonutUtilization/index.js\n\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/victory-group/es/helper-methods.js\n\n\nfunction victory_group_es_helper_methods_toConsumableArray(arr) { return victory_group_es_helper_methods_arrayWithoutHoles(arr) || victory_group_es_helper_methods_iterableToArray(arr) || victory_group_es_helper_methods_nonIterableSpread(); }\n\nfunction victory_group_es_helper_methods_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_group_es_helper_methods_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_group_es_helper_methods_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction helper_methods_slicedToArray(arr, i) { return helper_methods_arrayWithHoles(arr) || helper_methods_iterableToArrayLimit(arr, i) || helper_methods_nonIterableRest(); }\n\nfunction helper_methods_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }\n\nfunction helper_methods_iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction helper_methods_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction es_helper_methods_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_group_es_helper_methods_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_group_es_helper_methods_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\nvar es_helper_methods_fallbackProps = {\n width: 450,\n height: 300,\n padding: 50,\n offset: 0\n}; // eslint-disable-next-line max-statements\n\nfunction es_helper_methods_getCalculatedProps(props, childComponents) {\n var role = "group";\n props = modifyProps(props, es_helper_methods_fallbackProps, role);\n var style = getStyle(props.theme, props.style, role);\n var _props = props,\n offset = _props.offset,\n colorScale = _props.colorScale,\n color = _props.color,\n polar = _props.polar,\n horizontal = _props.horizontal;\n var categories = props.categories || wrapper_getCategories(props, childComponents);\n var datasets = props.datasets || getDataFromChildren(props);\n var domain = {\n x: wrapper_getDomain(assign_default()({}, props, {\n categories: categories\n }), "x", childComponents),\n y: wrapper_getDomain(assign_default()({}, props, {\n categories: categories\n }), "y", childComponents)\n };\n var range = props.range || {\n x: getRange(props, "x"),\n y: getRange(props, "y")\n };\n var baseScale = {\n x: getScaleFromProps(props, "x") || getScale(props, "x"),\n y: getScaleFromProps(props, "y") || getScale(props, "y")\n };\n var scale = {\n x: baseScale.x.domain(domain.x).range(props.horizontal ? range.y : range.x),\n y: baseScale.y.domain(domain.y).range(props.horizontal ? range.x : range.y)\n };\n var origin = polar ? props.origin : getPolarOrigin(props);\n var padding = helpers_getPadding(props);\n return {\n datasets: datasets,\n categories: categories,\n range: range,\n domain: domain,\n horizontal: horizontal,\n scale: scale,\n style: style,\n colorScale: colorScale,\n color: color,\n offset: offset,\n origin: origin,\n padding: padding\n };\n} // We need to remove sharedEvents in order to memoize the calculated data\n// With shared events, the props change on every event, and every value is re-calculated\n\nvar withoutSharedEvents = function (props) {\n var children = props.children;\n var modifiedChildren = react.Children.toArray(children).map(function (child) {\n return es_helper_methods_objectSpread({}, child, {\n props: omit(child.props, ["sharedEvents"])\n });\n });\n props.children = modifiedChildren;\n return props;\n};\n\nfunction useMemoizedProps(initialProps) {\n var modifiedProps = withoutSharedEvents(initialProps);\n\n var _React$useState = react.useState(modifiedProps),\n _React$useState2 = helper_methods_slicedToArray(_React$useState, 2),\n props = _React$useState2[0],\n setProps = _React$useState2[1]; // React.memo uses shallow equality to compare objects. This way props\n // will only be re-calculated when they change.\n\n\n react.useEffect(function () {\n if (!react_fast_compare_default()(modifiedProps, props)) {\n setProps(modifiedProps);\n }\n }, [props, setProps, modifiedProps]);\n return react.useMemo(function () {\n return es_helper_methods_getCalculatedProps(props, props.children);\n }, [props]);\n}\n\nfunction pixelsToValue(props, axis, calculatedProps) {\n if (!props.offset) {\n return 0;\n }\n\n var currentAxis = getCurrentAxis(axis, props.horizontal);\n var domain = calculatedProps.domain[axis];\n var range = calculatedProps.range[currentAxis];\n var domainExtent = Math.max.apply(Math, victory_group_es_helper_methods_toConsumableArray(domain)) - Math.min.apply(Math, victory_group_es_helper_methods_toConsumableArray(domain));\n var rangeExtent = Math.max.apply(Math, victory_group_es_helper_methods_toConsumableArray(range)) - Math.min.apply(Math, victory_group_es_helper_methods_toConsumableArray(range));\n return domainExtent / rangeExtent * props.offset;\n} // eslint-disable-next-line max-params\n\n\nfunction getX0(props, calculatedProps, index, role) {\n var groupLength = role === "stack" ? calculatedProps.datasets[0].length : calculatedProps.datasets.length;\n var center = (groupLength - 1) / 2;\n var totalWidth = pixelsToValue(props, "x", calculatedProps);\n return (index - center) * totalWidth;\n} // eslint-disable-next-line max-params\n\n\nfunction getPolarX0(props, calculatedProps, index, role) {\n var groupLength = role === "stack" ? calculatedProps.datasets[0].length : calculatedProps.datasets.length;\n var center = (groupLength - 1) / 2;\n var width = helper_methods_getAngularWidth(props, calculatedProps);\n return (index - center) * width;\n}\n\nfunction helper_methods_getAngularWidth(props, calculatedProps) {\n var range = calculatedProps.range;\n var angularRange = Math.abs(range.x[1] - range.x[0]);\n var r = Math.max.apply(Math, victory_group_es_helper_methods_toConsumableArray(range.y));\n return props.offset / (2 * Math.PI * r) * angularRange;\n}\n\nfunction getLabels(props, datasets, index) {\n if (!props.labels) {\n return undefined;\n }\n\n return Math.floor(datasets.length / 2) === index ? props.labels : undefined;\n}\n\nfunction helper_methods_getChildProps(props, calculatedProps) {\n var categories = calculatedProps.categories,\n domain = calculatedProps.domain,\n range = calculatedProps.range,\n scale = calculatedProps.scale,\n horizontal = calculatedProps.horizontal,\n origin = calculatedProps.origin,\n padding = calculatedProps.padding;\n var width = props.width,\n height = props.height,\n theme = props.theme,\n polar = props.polar;\n return {\n height: height,\n width: width,\n theme: theme,\n polar: polar,\n origin: origin,\n categories: categories,\n domain: domain,\n range: range,\n scale: scale,\n horizontal: horizontal,\n padding: padding,\n standalone: false\n };\n}\n\nfunction es_helper_methods_getColorScale(props, child) {\n var role = child.type && child.type.role;\n var colorScaleOptions = child.props.colorScale || props.colorScale;\n\n if (role !== "group" && role !== "stack") {\n return undefined;\n }\n\n return props.theme && props.theme.group ? colorScaleOptions || props.theme.group.colorScale : colorScaleOptions;\n}\n\nfunction getDataWithOffset(props) {\n var defaultDataset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n var offset = arguments.length > 2 ? arguments[2] : undefined;\n var dataset = props.data || props.y ? data_getData(props) : defaultDataset;\n var xOffset = offset || 0;\n return dataset.map(function (datum) {\n var _x1 = datum._x instanceof Date ? new Date(datum._x.getTime() + xOffset) : datum._x + xOffset;\n\n return assign_default()({}, datum, {\n _x1: _x1\n });\n });\n}\n\nfunction helper_methods_getChildren(props, childComponents, calculatedProps) {\n props = modifyProps(props, es_helper_methods_fallbackProps, "stack");\n childComponents = childComponents || react.Children.toArray(props.children);\n calculatedProps = calculatedProps || es_helper_methods_getCalculatedProps(props, childComponents);\n var _calculatedProps = calculatedProps,\n datasets = _calculatedProps.datasets;\n var _props2 = props,\n labelComponent = _props2.labelComponent,\n polar = _props2.polar;\n var childProps = helper_methods_getChildProps(props, calculatedProps);\n var parentName = props.name || "group";\n return childComponents.map(function (child, index) {\n var role = child.type && child.type.role;\n var xOffset = polar ? getPolarX0(props, calculatedProps, index, role) : getX0(props, calculatedProps, index, role);\n var style = role === "voronoi" || role === "tooltip" || role === "label" ? child.props.style : getChildStyle(child, index, calculatedProps);\n var labels = props.labels ? getLabels(props, datasets, index) : child.props.labels;\n var name = child.props.name || "".concat(parentName, "-").concat(role, "-").concat(index);\n return react.cloneElement(child, assign_default()({\n labels: labels,\n style: style,\n key: "".concat(name, "-key-").concat(index),\n name: name,\n data: getDataWithOffset(props, datasets[index], xOffset),\n colorScale: es_helper_methods_getColorScale(props, child),\n labelComponent: labelComponent || child.props.labelComponent,\n xOffset: xOffset\n }, childProps));\n });\n}\n;// CONCATENATED MODULE: ./node_modules/victory-group/es/victory-group.js\n\n\n\n\nfunction victory_group_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_group_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_group_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nvar victory_group_fallbackProps = {\n width: 450,\n height: 300,\n padding: 50,\n offset: 0\n};\n\nvar VictoryGroup = function (initialProps) {\n // eslint-disable-next-line no-use-before-define\n var role = VictoryGroupMemo.role;\n\n var _Hooks$useAnimationSt = useAnimationState(),\n getAnimationProps = _Hooks$useAnimationSt.getAnimationProps,\n setAnimationState = _Hooks$useAnimationSt.setAnimationState,\n getProps = _Hooks$useAnimationSt.getProps;\n\n var props = getProps(initialProps);\n var modifiedProps = modifyProps(props, victory_group_fallbackProps, role);\n var eventKey = modifiedProps.eventKey,\n containerComponent = modifiedProps.containerComponent,\n standalone = modifiedProps.standalone,\n groupComponent = modifiedProps.groupComponent,\n externalEventMutations = modifiedProps.externalEventMutations,\n width = modifiedProps.width,\n height = modifiedProps.height,\n theme = modifiedProps.theme,\n polar = modifiedProps.polar,\n horizontal = modifiedProps.horizontal,\n name = modifiedProps.name;\n var childComponents = react.Children.toArray(modifiedProps.children);\n var calculatedProps = useMemoizedProps(modifiedProps);\n var domain = calculatedProps.domain,\n scale = calculatedProps.scale,\n style = calculatedProps.style,\n origin = calculatedProps.origin;\n var newChildren = react.useMemo(function () {\n var children = helper_methods_getChildren(props, childComponents, calculatedProps);\n return children.map(function (child, index) {\n var childProps = assign_default()({\n animate: getAnimationProps(props, child, index, "victory-group")\n }, child.props);\n\n return react.cloneElement(child, childProps);\n });\n }, [props, childComponents, calculatedProps, getAnimationProps]);\n var containerProps = react.useMemo(function () {\n if (standalone) {\n return {\n domain: domain,\n scale: scale,\n width: width,\n height: height,\n standalone: standalone,\n theme: theme,\n style: style.parent,\n horizontal: horizontal,\n polar: polar,\n origin: origin,\n name: name\n };\n }\n\n return {};\n }, [standalone, domain, scale, width, height, theme, style, horizontal, polar, origin, name]);\n var container = react.useMemo(function () {\n if (standalone) {\n var defaultContainerProps = defaults_default()({}, containerComponent.props, containerProps);\n\n return react.cloneElement(containerComponent, defaultContainerProps);\n }\n\n return groupComponent;\n }, [groupComponent, standalone, containerComponent, containerProps]);\n var events = react.useMemo(function () {\n return getAllEvents(props);\n }, [props]);\n var previousProps = usePreviousProps(initialProps);\n react.useEffect(function () {\n // This is called before dismount to keep state in sync\n return function () {\n if (initialProps.animate) {\n setAnimationState(previousProps, props);\n }\n };\n }, [setAnimationState, previousProps, initialProps, props]);\n\n if (!isEmpty_default()(events)) {\n return react.createElement(VictorySharedEvents, {\n container: container,\n eventKey: eventKey,\n events: events,\n externalEventMutations: externalEventMutations\n }, newChildren);\n }\n\n return react.cloneElement(container, container.props, newChildren);\n};\n\nVictoryGroup.propTypes = victory_group_objectSpread({}, baseProps, dataProps, {\n children: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).node), (prop_types_default()).node]),\n color: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).func]),\n colorScale: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).string), prop_types_default().oneOf(["grayscale", "qualitative", "heatmap", "warm", "cool", "red", "green", "blue"])]),\n horizontal: (prop_types_default()).bool,\n offset: (prop_types_default()).number\n});\nVictoryGroup.defaultProps = {\n containerComponent: react.createElement(VictoryContainer, null),\n groupComponent: react.createElement("g", null),\n samples: 50,\n sortOrder: "ascending",\n standalone: true,\n theme: victory_theme.grayscale\n}; // We need to attatch the static properties to the memoized version, or else\n// VictoryChart will not be able to get this component\'s role type\n\nvar VictoryGroupMemo = react.memo(VictoryGroup, (react_fast_compare_default()));\nVictoryGroupMemo.displayName = "VictoryGroup";\nVictoryGroupMemo.role = "group";\nVictoryGroupMemo.expectedComponents = ["groupComponent", "containerComponent", "labelComponent"];\nVictoryGroupMemo.getChildren = helper_methods_getChildren;\n/* harmony default export */ const victory_group = (VictoryGroupMemo);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartGroup/ChartGroup.js\n\n\n\n\n\n\nvar ChartGroupSortOrder;\n(function (ChartGroupSortOrder) {\n ChartGroupSortOrder["ascending"] = "ascending";\n ChartGroupSortOrder["descending"] = "descending";\n})(ChartGroupSortOrder || (ChartGroupSortOrder = {}));\nconst ChartGroup = (_a) => {\n var { ariaDesc, ariaTitle, children, containerComponent = react.createElement(ChartContainer, null), themeColor, themeVariant, \n // destructure last\n theme = getTheme(themeColor, themeVariant) } = _a, rest = (0,tslib_es6.__rest)(_a, ["ariaDesc", "ariaTitle", "children", "containerComponent", "themeColor", "themeVariant", "theme"]);\n // Clone so users can override container props\n const container = react.cloneElement(containerComponent, Object.assign(Object.assign({ desc: ariaDesc, title: ariaTitle, theme }, containerComponent.props), { className: getClassName({ className: containerComponent.props.className }) // Override VictoryContainer class name\n }));\n // Note: containerComponent is required for theme\n return (react.createElement(victory_group, Object.assign({ containerComponent: container, theme: theme }, rest), children));\n};\nChartGroup.displayName = \'ChartGroup\';\n// Note: VictoryGroup.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartGroup, victory_group);\n//# sourceMappingURL=ChartGroup.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartGroup/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartLabel/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartLegend/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartLegendTooltip/ChartLegendTooltipLabel.js\n\n\n\n\n\n\n\nconst ChartLegendTooltipLabel = (_a) => {\n var { dx = 0, index = 0, legendData, legendLabelComponent = react.createElement(ChartLabel, null), style, text, textAnchor = \'end\', x, y } = _a, \n // destructure last\n rest = (0,tslib_es6.__rest)(_a, ["dx", "index", "legendData", "legendLabelComponent", "style", "text", "textAnchor", "x", "y"]);\n const getStyle = (styles) => {\n const applyDefaultStyle = (customStyle) => defaults_default()(Object.assign({}, customStyle), {\n fill: ChartLegendTooltipStyles.label.fill\n });\n return Array.isArray(styles) ? styles.map(applyDefaultStyle) : applyDefaultStyle(styles);\n };\n const getLegendLabelComponent = () => {\n const label = legendData && legendData.length ? legendData[index].name : undefined;\n return react.cloneElement(legendLabelComponent, {\n style: getStyle({}),\n text: label,\n textAnchor: \'start\',\n x,\n y\n });\n };\n const getValueLabelComponent = () => {\n const _x = x + evaluateProp(dx);\n return react.createElement(ChartLabel, Object.assign({ style: getStyle(style), text: text, textAnchor: textAnchor, x: _x, y: y }, rest));\n };\n const legendLabel = getLegendLabelComponent();\n const valueLabel = getValueLabelComponent();\n return (react.createElement(react.Fragment, null,\n legendLabel,\n valueLabel));\n};\nChartLegendTooltipLabel.displayName = \'ChartLegendTooltipLabel\';\n// Note: VictoryLabel.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartLegendTooltipLabel, victory_label);\n//# sourceMappingURL=ChartLegendTooltipLabel.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartLegendTooltip/ChartLegendTooltipContent.js\n\n\n\n\n\n\n\n\n\n\nconst ChartLegendTooltipContent = (_a) => {\n var { activePoints, center, datum, dx = 0, dy = 0, flyoutHeight, flyoutWidth, height, labelComponent = react.createElement(ChartLegendTooltipLabel, null), legendComponent = react.createElement(ChartLegend, null), legendData, text, themeColor, themeVariant, title, titleComponent = react.createElement(ChartLabel, null), width, \n // destructure last\n theme = getTheme(themeColor, themeVariant) } = _a, rest = (0,tslib_es6.__rest)(_a, ["activePoints", "center", "datum", "dx", "dy", "flyoutHeight", "flyoutWidth", "height", "labelComponent", "legendComponent", "legendData", "text", "themeColor", "themeVariant", "title", "titleComponent", "width", "theme"]);\n const pointerLength = theme && theme.tooltip ? evaluateProp(theme.tooltip.pointerLength) : 10;\n const legendProps = getLegendTooltipDataProps(legendComponent.props);\n const visibleLegendData = getLegendTooltipVisibleData({\n activePoints,\n colorScale: legendProps.colorScale,\n legendData,\n text,\n theme\n });\n // Component offsets\n const legendOffsetX = 0;\n const legendOffsetY = title ? 5 : -10;\n const titleOffsetX = 10;\n const titleOffsetY = 0;\n // Returns x position of flyout\n const getX = () => {\n if (!(center || flyoutWidth || width)) {\n const x = rest.x;\n return x ? x : undefined;\n }\n const _flyoutWidth = evaluateProp(flyoutWidth);\n if (width > center.x + _flyoutWidth + pointerLength) {\n return center.x + ChartLegendTooltipStyles.flyout.padding / 2;\n }\n else if (center.x < _flyoutWidth + pointerLength) {\n return ChartLegendTooltipStyles.flyout.padding / 2 - pointerLength;\n }\n else {\n return center.x - _flyoutWidth;\n }\n };\n // Returns y position\n const getY = () => {\n if (!(center || flyoutHeight || height)) {\n const y = rest.y;\n return y ? y : undefined;\n }\n const _flyoutHeight = evaluateProp(flyoutHeight);\n if (center.y < _flyoutHeight / 2) {\n return ChartLegendTooltipStyles.flyout.padding / 2;\n }\n else if (center.y > height - _flyoutHeight / 2) {\n return height - _flyoutHeight + ChartLegendTooltipStyles.flyout.padding / 2;\n }\n else {\n return center.y - _flyoutHeight / 2 + ChartLegendTooltipStyles.flyout.padding / 2;\n }\n };\n // Min & max dimensions do not include flyout padding\n const maxLegendDimensions = getLegendTooltipSize({\n legendData: visibleLegendData,\n legendProps,\n text: getLegendTooltipVisibleText({ activePoints, legendData, text }),\n theme\n });\n const minLegendDimensions = getLegendTooltipSize({\n legendData: [{ name: \'\' }],\n legendProps,\n theme\n });\n // Returns the label component\n const getLabelComponent = () => react.cloneElement(labelComponent, Object.assign({ dx: maxLegendDimensions.width - minLegendDimensions.width, legendData: visibleLegendData }, labelComponent.props));\n // Returns the title component\n const getTitleComponent = () => {\n const _title = title instanceof Function ? title(datum) : title;\n return react.cloneElement(titleComponent, Object.assign({ style: {\n fill: ChartLegendTooltipStyles.label.fill,\n fontWeight: ChartLegendTooltipStyles.label.fontWeight\n }, text: _title, textAnchor: \'start\', x: getX() + titleOffsetX + evaluateProp(dx), y: getY() + titleOffsetY + evaluateProp(dy) }, titleComponent.props));\n };\n // Returns the legebd component\n const getLegendComponent = () => react.cloneElement(legendComponent, Object.assign({ data: getLegendTooltipVisibleData({\n activePoints,\n colorScale: legendProps.colorScale,\n legendData,\n text,\n textAsLegendData: true,\n theme\n }), labelComponent: getLabelComponent(), standalone: false, theme, x: getX() + legendOffsetX + evaluateProp(dx), y: getY() + legendOffsetY + evaluateProp(dy) }, legendProps));\n return (react.createElement(react.Fragment, null,\n getTitleComponent(),\n getLegendComponent()));\n};\nChartLegendTooltipContent.displayName = \'ChartLegendTooltipContent\';\n// Note: VictoryLegend.role must be hoisted, but getBaseProps causes error with ChartVoronoiContainer\nhoist_non_react_statics_cjs_default()(ChartLegendTooltipContent, victory_legend, { getBaseProps: true });\n//# sourceMappingURL=ChartLegendTooltipContent.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartLegendTooltip/ChartLegendTooltip.js\n\n\n\n\n\n\n\n\n\n\nconst ChartLegendTooltip = (_a) => {\n var { activePoints, datum, center = { x: 0, y: 0 }, flyoutHeight, flyoutWidth, height, isCursorTooltip = true, labelComponent = react.createElement(ChartLegendTooltipContent, null), legendData, text, themeColor, themeVariant, title, width, \n // destructure last\n theme = getTheme(themeColor, themeVariant) } = _a, rest = (0,tslib_es6.__rest)(_a, ["activePoints", "datum", "center", "flyoutHeight", "flyoutWidth", "height", "isCursorTooltip", "labelComponent", "legendData", "text", "themeColor", "themeVariant", "title", "width", "theme"]);\n const pointerLength = theme && theme.tooltip ? evaluateProp(theme.tooltip.pointerLength) : 10;\n const legendTooltipProps = () => ({\n legendData: getLegendTooltipVisibleData({ activePoints, legendData, text, theme }),\n legendProps: getLegendTooltipDataProps(labelComponent.props.legendComponent),\n text: getLegendTooltipVisibleText({ activePoints, legendData, text }),\n theme\n });\n // Returns flyout height based on legend size\n const getFlyoutHeight = ({ height }) => {\n const _flyoutHeight = height + ChartLegendTooltipStyles.flyout.padding;\n return title ? _flyoutHeight : _flyoutHeight - 10;\n };\n // Returns flyout width based on legend size\n const getFlyoutWidth = ({ width }) => width + ChartLegendTooltipStyles.flyout.padding;\n // Returns the tooltip content component\n const getTooltipContentComponent = (props) => react.cloneElement(labelComponent, Object.assign({ center, flyoutHeight: flyoutHeight || getFlyoutHeight(props), flyoutWidth: flyoutWidth || getFlyoutWidth(props), height,\n legendData,\n title,\n width }, labelComponent.props));\n // Returns the tooltip component\n const getTooltipComponent = () => {\n // There must be at least one active, visible item or else this will return zero for height & width.\n const legendSize = getLegendTooltipSize(legendTooltipProps());\n if (legendSize.height === 0 && legendSize.width === 0) {\n return null;\n }\n const _flyoutWidth = getFlyoutWidth(legendSize);\n const tooltipComponent = isCursorTooltip ? react.createElement(ChartCursorTooltip, null) : react.createElement(ChartTooltip, null);\n return react.cloneElement(tooltipComponent, Object.assign(Object.assign(Object.assign({ activePoints,\n center,\n datum, flyoutHeight: flyoutHeight || getFlyoutHeight(legendSize), flyoutWidth: flyoutWidth || getFlyoutWidth(legendSize), height, labelComponent: getTooltipContentComponent(legendSize) }, (flyoutWidth === undefined && {\n showPointer: width > _flyoutWidth + center.x + pointerLength || center.x > _flyoutWidth + pointerLength\n })), { text,\n theme,\n width }), rest));\n };\n return getTooltipComponent();\n};\nChartLegendTooltip.displayName = \'ChartLegendTooltip\';\n// Note: VictoryTooltip.defaultEvents must be hoisted\nhoist_non_react_statics_cjs_default()(ChartLegendTooltip, VictoryTooltip);\n//# sourceMappingURL=ChartLegendTooltip.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartLegendTooltip/index.js\n\n\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/victory-line/es/helper-methods.js\n\n\n\n\nvar victory_line_es_helper_methods_getCalculatedValues = function (props) {\n var data = data_getData(props);\n\n if (data.length < 2) {\n data = [];\n }\n\n var range = {\n x: getRange(props, "x"),\n y: getRange(props, "y")\n };\n var domain = {\n x: getDomain(props, "x"),\n y: getDomain(props, "y")\n };\n var scale = {\n x: getBaseScale(props, "x").domain(domain.x).range(props.horizontal ? range.y : range.x),\n y: getBaseScale(props, "y").domain(domain.y).range(props.horizontal ? range.x : range.y)\n };\n var origin = props.polar ? props.origin || getPolarOrigin(props) : undefined;\n var defaultStyles = getDefaultStyles(props, "line");\n var style = getStyles(props.style, defaultStyles);\n return {\n domain: domain,\n data: data,\n scale: scale,\n style: style,\n origin: origin\n };\n};\n\nvar victory_line_es_helper_methods_getBaseProps = function (props, fallbackProps) {\n var modifiedProps = modifyProps(props, fallbackProps, "line");\n props = assign_default()({}, modifiedProps, victory_line_es_helper_methods_getCalculatedValues(modifiedProps));\n var _props = props,\n data = _props.data,\n domain = _props.domain,\n events = _props.events,\n groupComponent = _props.groupComponent,\n height = _props.height,\n horizontal = _props.horizontal,\n interpolation = _props.interpolation,\n origin = _props.origin,\n padding = _props.padding,\n polar = _props.polar,\n scale = _props.scale,\n sharedEvents = _props.sharedEvents,\n standalone = _props.standalone,\n style = _props.style,\n theme = _props.theme,\n width = _props.width,\n labels = _props.labels,\n name = _props.name,\n disableInlineStyles = _props.disableInlineStyles;\n var initialChildProps = {\n parent: {\n style: style.parent,\n scale: scale,\n data: data,\n height: height,\n width: width,\n name: name,\n domain: domain,\n standalone: standalone,\n polar: polar,\n origin: origin,\n padding: padding,\n horizontal: horizontal\n },\n all: {\n data: {\n horizontal: horizontal,\n polar: polar,\n origin: origin,\n scale: scale,\n data: data,\n interpolation: interpolation,\n groupComponent: groupComponent,\n style: disableInlineStyles ? {} : style.data,\n theme: theme,\n disableInlineStyles: disableInlineStyles\n }\n }\n };\n return data.reduce(function (childProps, datum, index) {\n var text = getText(props, datum, index);\n\n if (text !== undefined && text !== null || labels && (events || sharedEvents)) {\n var eventKey = !isNil_default()(datum.eventKey) ? datum.eventKey : index;\n childProps[eventKey] = {\n labels: getProps(props, index)\n };\n }\n\n return childProps;\n }, initialChildProps);\n};\n;// CONCATENATED MODULE: ./node_modules/victory-core/es/victory-util/line-helpers.js\n\n\nvar line_helpers_defined = function (d) {\n var y = d._y1 !== undefined ? d._y1 : d._y;\n return y !== null && y !== undefined && d._y0 !== null;\n};\n\nvar line_helpers_getXAccessor = function (scale) {\n return function (d) {\n return scale.x(d._x1 !== undefined ? d._x1 : d._x);\n };\n};\n\nvar line_helpers_getYAccessor = function (scale) {\n return function (d) {\n return scale.y(d._y1 !== undefined ? d._y1 : d._y);\n };\n};\n\nvar line_helpers_getAngleAccessor = function (scale) {\n return function (d) {\n var x = scale.x(d._x1 !== undefined ? d._x1 : d._x);\n return -1 * x + Math.PI / 2;\n };\n};\n\nvar line_helpers_toNewName = function (interpolation) {\n // d3 shape changed the naming scheme for interpolators from "basis" -> "curveBasis" etc.\n var capitalize = function (s) {\n return s && s[0].toUpperCase() + s.slice(1);\n };\n\n return "curve".concat(capitalize(interpolation));\n};\n\nvar line_helpers_getLineFunction = function (props) {\n var polar = props.polar,\n scale = props.scale,\n horizontal = props.horizontal;\n var defaultOpenCurve = polar ? false : true;\n var openCurve = props.openCurve === undefined ? defaultOpenCurve : props.openCurve;\n var interpolationFunction = typeof props.interpolation === "function" && props.interpolation;\n var interpolationName = typeof props.interpolation === "string" && (!openCurve ? "".concat(line_helpers_toNewName(props.interpolation), "Closed") : line_helpers_toNewName(props.interpolation));\n return polar ? src_lineRadial().defined(line_helpers_defined).curve(interpolationFunction || d3_shape_src_namespaceObject[interpolationName]).angle(line_helpers_getAngleAccessor(scale)).radius(line_helpers_getYAccessor(scale)) : src_line().defined(line_helpers_defined).curve(interpolationFunction || d3_shape_src_namespaceObject[interpolationName]).x(horizontal ? line_helpers_getYAccessor(scale) : line_helpers_getXAccessor(scale)).y(horizontal ? line_helpers_getXAccessor(scale) : line_helpers_getYAccessor(scale));\n};\n;// CONCATENATED MODULE: ./node_modules/victory-line/es/curve.js\n\n\nfunction curve_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { curve_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction curve_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/*eslint no-magic-numbers: ["error", { "ignore": [-1, 0, 1, 2] }]*/\n\n\n\n\nvar curve_evaluateProps = function (props) {\n /**\n * Potential evaluated props are:\n * `ariaLabel`\n * `id`\n * `style`\n * `tabIndex`\n */\n var ariaLabel = evaluateProp(props.ariaLabel, props);\n var id = evaluateProp(props.id, props);\n var style = evaluateStyle(assign_default()({\n fill: "none",\n stroke: "black"\n }, props.style), props);\n var tabIndex = evaluateProp(props.tabIndex, props);\n return assign_default()({}, props, {\n ariaLabel: ariaLabel,\n id: id,\n style: style,\n tabIndex: tabIndex\n });\n};\n\nvar Curve = function (props) {\n props = curve_evaluateProps(props);\n var _props = props,\n polar = _props.polar,\n origin = _props.origin;\n var lineFunction = line_helpers_getLineFunction(props);\n var defaultTransform = polar && origin ? "translate(".concat(origin.x, ", ").concat(origin.y, ")") : undefined;\n return react.cloneElement(props.pathComponent, curve_objectSpread({}, props.events, {\n "aria-label": props.ariaLabel,\n d: lineFunction(props.data),\n style: props.style,\n transform: props.transform || defaultTransform,\n className: props.className,\n role: props.role,\n shapeRendering: props.shapeRendering,\n clipPath: props.clipPath,\n tabIndex: props.tabIndex\n }));\n};\n\nCurve.propTypes = curve_objectSpread({}, primitiveProps, {\n interpolation: prop_types_default().oneOfType([(prop_types_default()).string, (prop_types_default()).func]),\n openCurve: (prop_types_default()).bool,\n origin: (prop_types_default()).object,\n pathComponent: (prop_types_default()).element,\n polar: (prop_types_default()).bool\n});\nCurve.defaultProps = {\n pathComponent: react.createElement(path, null),\n role: "presentation",\n shapeRendering: "auto"\n};\n/* harmony default export */ const curve = (Curve);\n;// CONCATENATED MODULE: ./node_modules/victory-line/es/victory-line.js\nfunction victory_line_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_line_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_line_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction victory_line_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_line_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_line_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_line_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_line_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_line_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_line_assertThisInitialized(self); }\n\nfunction victory_line_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_line_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\n\nvar victory_line_fallbackProps = {\n width: 450,\n height: 300,\n padding: 50,\n interpolation: "linear"\n};\nvar victory_line_options = {\n components: [{\n name: "parent",\n index: "parent"\n }, {\n name: "data",\n index: "all"\n }, {\n name: "labels"\n }]\n};\n\nvar VictoryLine =\n/*#__PURE__*/\nfunction (_React$Component) {\n victory_line_inherits(VictoryLine, _React$Component);\n\n function VictoryLine() {\n victory_line_classCallCheck(this, VictoryLine);\n\n return victory_line_possibleConstructorReturn(this, (VictoryLine.__proto__ || Object.getPrototypeOf(VictoryLine)).apply(this, arguments));\n }\n\n victory_line_createClass(VictoryLine, [{\n key: "shouldAnimate",\n // Overridden in native versions\n value: function shouldAnimate() {\n return !!this.props.animate;\n }\n }, {\n key: "render",\n value: function render() {\n var animationWhitelist = VictoryLine.animationWhitelist,\n role = VictoryLine.role;\n var props = modifyProps(this.props, victory_line_fallbackProps, role);\n\n if (this.shouldAnimate()) {\n return this.animateComponent(props, animationWhitelist);\n }\n\n var children = this.renderContinuousData(props);\n return props.standalone ? this.renderContainer(props.containerComponent, children) : children;\n }\n }]);\n\n return VictoryLine;\n}(react.Component);\n\nObject.defineProperty(VictoryLine, "animationWhitelist", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["data", "domain", "height", "padding", "samples", "style", "width"]\n});\nObject.defineProperty(VictoryLine, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryLine"\n});\nObject.defineProperty(VictoryLine, "role", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "line"\n});\nObject.defineProperty(VictoryLine, "defaultTransitions", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: continuousTransitions()\n});\nObject.defineProperty(VictoryLine, "defaultPolarTransitions", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: continuousPolarTransitions()\n});\nObject.defineProperty(VictoryLine, "continuous", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: true\n});\nObject.defineProperty(VictoryLine, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_line_objectSpread({}, baseProps, dataProps, {\n interpolation: prop_types_default().oneOfType([prop_types_default().oneOf(["basis", "bundle", "cardinal", "catmullRom", "linear", "monotoneX", "monotoneY", "natural", "step", "stepAfter", "stepBefore"]), (prop_types_default()).func]),\n label: deprecated((prop_types_default()).string, "Use `labels` instead for individual data labels")\n })\n});\nObject.defineProperty(VictoryLine, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {\n containerComponent: react.createElement(VictoryContainer, null),\n dataComponent: react.createElement(curve, null),\n labelComponent: react.createElement(victory_label, {\n renderInPortal: true\n }),\n groupComponent: react.createElement(VictoryClipContainer, null),\n samples: 50,\n sortKey: "x",\n sortOrder: "ascending",\n standalone: true,\n theme: victory_theme.grayscale\n }\n});\nObject.defineProperty(VictoryLine, "getDomain", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: getDomain\n});\nObject.defineProperty(VictoryLine, "getData", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: data_getData\n});\nObject.defineProperty(VictoryLine, "getBaseProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return victory_line_es_helper_methods_getBaseProps(props, victory_line_fallbackProps);\n }\n});\nObject.defineProperty(VictoryLine, "expectedComponents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: ["dataComponent", "labelComponent", "groupComponent", "containerComponent"]\n});\n/* harmony default export */ const victory_line = (add_events(VictoryLine, victory_line_options));\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartLine/ChartLine.js\n\n\n\n\n\n\nvar ChartLineSortOrder;\n(function (ChartLineSortOrder) {\n ChartLineSortOrder["ascending"] = "ascending";\n ChartLineSortOrder["descending"] = "descending";\n})(ChartLineSortOrder || (ChartLineSortOrder = {}));\nconst ChartLine = (_a) => {\n var { containerComponent = react.createElement(ChartContainer, null), themeColor, themeVariant, \n // destructure last\n theme = getTheme(themeColor, themeVariant) } = _a, rest = (0,tslib_es6.__rest)(_a, ["containerComponent", "themeColor", "themeVariant", "theme"]);\n // Clone so users can override container props\n const container = react.cloneElement(containerComponent, Object.assign({ theme }, containerComponent.props));\n // Note: containerComponent is required for theme\n return react.createElement(victory_line, Object.assign({ containerComponent: container, theme: theme }, rest));\n};\nChartLine.displayName = \'ChartLine\';\n// Note: VictoryLine.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartLine, victory_line);\n//# sourceMappingURL=ChartLine.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartLine/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartPie/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartPoint/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartScatter/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/victory-stack/es/helper-methods.js\n\n\n\n\nfunction es_helper_methods_slicedToArray(arr, i) { return es_helper_methods_arrayWithHoles(arr) || es_helper_methods_iterableToArrayLimit(arr, i) || es_helper_methods_nonIterableRest(); }\n\nfunction es_helper_methods_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }\n\nfunction es_helper_methods_iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction es_helper_methods_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction victory_stack_es_helper_methods_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_stack_es_helper_methods_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_stack_es_helper_methods_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\nvar victory_stack_es_helper_methods_fallbackProps = {\n width: 450,\n height: 300,\n padding: 50\n}; // Assumes data in `datasets` is sorted by `Data.getData`.\n\nfunction fillData(props, datasets) {\n var fillInMissingData = props.fillInMissingData;\n var xMap = datasets.reduce(function (prev, dataset) {\n dataset.forEach(function (datum) {\n prev[datum._x instanceof Date ? datum._x.getTime() : datum._x] = true;\n });\n return prev;\n }, {});\n\n var xKeys = keys_default()(xMap).map(function (k) {\n return +k;\n });\n\n var xArr = orderBy_default()(xKeys);\n\n return datasets.map(function (dataset) {\n var indexOffset = 0;\n var isDate = dataset[0] && dataset[0]._x instanceof Date;\n var filledInData = xArr.map(function (x, index) {\n x = +x;\n var datum = dataset[index - indexOffset];\n\n if (datum) {\n var x1 = isDate ? datum._x.getTime() : datum._x;\n\n if (x1 === x) {\n return datum;\n } else {\n indexOffset++;\n var y = fillInMissingData ? 0 : null;\n x = isDate ? new Date(x) : x;\n return {\n x: x,\n y: y,\n _x: x,\n _y: y\n };\n }\n } else {\n var _y = fillInMissingData ? 0 : null;\n\n x = isDate ? new Date(x) : x;\n return {\n x: x,\n y: _y,\n _x: x,\n _y: _y\n };\n }\n });\n return filledInData;\n });\n}\n\nfunction getY0(datum, index, datasets) {\n if (datum.y0) {\n return datum.y0;\n }\n\n var y = datum._y;\n var group = datum._group;\n var firstDatasetBaseline = datasets[0].map(function (d) {\n return d.y0;\n });\n var previousDatasets = datasets.slice(0, index);\n var previousPoints = previousDatasets.reduce(function (prev, dataset) {\n return prev.concat(dataset.filter(function (previousDatum) {\n return datum._x instanceof Date ? previousDatum._x.getTime() === datum._x.getTime() : previousDatum._x === datum._x;\n }).map(function (previousDatum) {\n return previousDatum._y || 0;\n }));\n }, []);\n var y0 = previousPoints.length && previousPoints.reduce(function (memo, value) {\n var sameSign = y < 0 && value < 0 || y >= 0 && value >= 0;\n return sameSign ? +value + memo : memo;\n }, firstDatasetBaseline[group] || 0);\n return previousPoints.some(function (point) {\n return point instanceof Date;\n }) ? new Date(y0) : y0;\n}\n/* eslint-disable no-nested-ternary */\n\n\nfunction addLayoutData(props, datasets, index) {\n var xOffset = props.xOffset || 0;\n return datasets[index].map(function (datum) {\n var yOffset = getY0(datum, index, datasets) || 0;\n return assign_default()({}, datum, {\n _y0: !(datum._y instanceof Date) ? yOffset : yOffset ? new Date(yOffset) : datum._y,\n _y1: datum._y === null ? null : datum._y instanceof Date ? new Date(+datum._y + +yOffset) : datum._y + yOffset,\n _x1: datum._x === null ? null : datum._x instanceof Date ? new Date(+datum._x + +xOffset) : datum._x + xOffset\n });\n });\n}\n/* eslint-enable no-nested-ternary */\n\n\nfunction stackData(props, childComponents) {\n var dataFromChildren = getDataFromChildren(props, childComponents);\n var filterNullChildData = dataFromChildren.map(function (dataset) {\n return dataset.filter(function (datum) {\n return datum._x !== null && datum._y !== null;\n });\n });\n var datasets = fillData(props, filterNullChildData);\n return datasets.map(function (d, i) {\n return addLayoutData(props, datasets, i);\n });\n}\n\nfunction victory_stack_es_helper_methods_getCalculatedProps(props, childComponents) {\n childComponents = childComponents || react.Children.toArray(props.children);\n var role = "stack";\n props = modifyProps(props, victory_stack_es_helper_methods_fallbackProps, role);\n var style = getStyle(props.theme, props.style, role);\n var categories = props.categories || wrapper_getCategories(props, childComponents);\n var datasets = props.datasets || stackData(props, childComponents);\n var children = childComponents.map(function (c, i) {\n return react.cloneElement(c, {\n data: datasets[i]\n });\n });\n var domain = {\n x: wrapper_getDomain(assign_default()({}, props, {\n categories: categories\n }), "x", children),\n y: wrapper_getDomain(assign_default()({}, props, {\n categories: categories\n }), "y", children)\n };\n var range = props.range || {\n x: getRange(props, "x"),\n y: getRange(props, "y")\n };\n var baseScale = {\n x: getScaleFromProps(props, "x") || getScale(props, "x"),\n y: getScaleFromProps(props, "y") || getScale(props, "y")\n };\n var scale = {\n x: baseScale.x.domain(domain.x).range(props.horizontal ? range.y : range.x),\n y: baseScale.y.domain(domain.y).range(props.horizontal ? range.x : range.y)\n };\n var _props = props,\n colorScale = _props.colorScale,\n horizontal = _props.horizontal;\n return {\n datasets: datasets,\n categories: categories,\n range: range,\n domain: domain,\n horizontal: horizontal,\n scale: scale,\n style: style,\n colorScale: colorScale,\n role: role\n };\n} // We need to remove sharedEvents in order to memoize the calculated data\n// With shared events, the props change on every event, and every value is re-calculated\n\nvar helper_methods_withoutSharedEvents = function (props) {\n var children = props.children;\n var modifiedChildren = react.Children.toArray(children).map(function (child) {\n return victory_stack_es_helper_methods_objectSpread({}, child, {\n props: omit(child.props, ["sharedEvents"])\n });\n });\n props.children = modifiedChildren;\n return props;\n};\n\nfunction helper_methods_useMemoizedProps(initialProps) {\n var modifiedProps = helper_methods_withoutSharedEvents(initialProps);\n\n var _React$useState = react.useState(modifiedProps),\n _React$useState2 = es_helper_methods_slicedToArray(_React$useState, 2),\n props = _React$useState2[0],\n setProps = _React$useState2[1]; // React.memo uses shallow equality to compare objects. This way props\n // will only be re-calculated when they change.\n\n\n react.useEffect(function () {\n if (!react_fast_compare_default()(modifiedProps, props)) {\n setProps(modifiedProps);\n }\n }, [props, setProps, modifiedProps]);\n return react.useMemo(function () {\n return victory_stack_es_helper_methods_getCalculatedProps(props, props.children);\n }, [props]);\n}\n\nfunction helper_methods_getLabels(props, datasets, index) {\n if (!props.labels) {\n return undefined;\n }\n\n return datasets.length === index + 1 ? props.labels : undefined;\n}\n\nfunction es_helper_methods_getChildProps(props, calculatedProps) {\n var categories = calculatedProps.categories,\n domain = calculatedProps.domain,\n range = calculatedProps.range,\n scale = calculatedProps.scale,\n horizontal = calculatedProps.horizontal;\n return {\n height: props.height,\n width: props.width,\n padding: helpers_getPadding(props),\n standalone: false,\n theme: props.theme,\n categories: categories,\n domain: domain,\n range: range,\n scale: scale,\n horizontal: horizontal\n };\n}\n\nfunction victory_stack_es_helper_methods_getColorScale(props, child) {\n var role = child.type && child.type.role;\n var colorScaleOptions = child.props.colorScale || props.colorScale;\n\n if (role !== "group" && role !== "stack") {\n return undefined;\n }\n\n return props.theme ? colorScaleOptions || props.theme.props.colorScale : colorScaleOptions;\n}\n\nfunction es_helper_methods_getChildren(props, childComponents, calculatedProps) {\n props = modifyProps(props, victory_stack_es_helper_methods_fallbackProps, "stack");\n childComponents = childComponents || react.Children.toArray(props.children);\n calculatedProps = calculatedProps || victory_stack_es_helper_methods_getCalculatedProps(props, childComponents);\n var _calculatedProps = calculatedProps,\n datasets = _calculatedProps.datasets;\n var childProps = es_helper_methods_getChildProps(props, calculatedProps);\n var parentName = props.name || "stack";\n return childComponents.map(function (child, index) {\n var role = child.type && child.type.role;\n var data = datasets[index];\n var style = getChildStyle(child, index, calculatedProps);\n var labels = props.labels ? helper_methods_getLabels(props, datasets, index) : child.props.labels;\n var name = child.props.name || "".concat(parentName, "-").concat(role, "-").concat(index);\n return react.cloneElement(child, assign_default()({\n key: "".concat(name, "-key-").concat(index),\n labels: labels,\n name: name,\n domainPadding: child.props.domainPadding || props.domainPadding,\n theme: props.theme,\n labelComponent: props.labelComponent || child.props.labelComponent,\n style: style,\n colorScale: victory_stack_es_helper_methods_getColorScale(props, child),\n data: data,\n polar: props.polar\n }, childProps));\n });\n}\n;// CONCATENATED MODULE: ./node_modules/victory-stack/es/victory-stack.js\n\n\n\n\nfunction victory_stack_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_stack_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_stack_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\nvar victory_stack_fallbackProps = {\n width: 450,\n height: 300,\n padding: 50\n};\n\nvar VictoryStack = function (initialProps) {\n // eslint-disable-next-line no-use-before-define\n var role = VictoryStackMemo.role;\n\n var _Hooks$useAnimationSt = useAnimationState(),\n setAnimationState = _Hooks$useAnimationSt.setAnimationState,\n getAnimationProps = _Hooks$useAnimationSt.getAnimationProps,\n getProps = _Hooks$useAnimationSt.getProps;\n\n var props = getProps(initialProps);\n var modifiedProps = modifyProps(props, victory_stack_fallbackProps, role);\n var eventKey = modifiedProps.eventKey,\n containerComponent = modifiedProps.containerComponent,\n standalone = modifiedProps.standalone,\n groupComponent = modifiedProps.groupComponent,\n externalEventMutations = modifiedProps.externalEventMutations,\n width = modifiedProps.width,\n height = modifiedProps.height,\n theme = modifiedProps.theme,\n polar = modifiedProps.polar,\n horizontal = modifiedProps.horizontal,\n name = modifiedProps.name;\n var childComponents = react.Children.toArray(modifiedProps.children);\n var calculatedProps = helper_methods_useMemoizedProps(modifiedProps);\n var domain = calculatedProps.domain,\n scale = calculatedProps.scale,\n style = calculatedProps.style,\n origin = calculatedProps.origin;\n var newChildren = react.useMemo(function () {\n var children = es_helper_methods_getChildren(props, childComponents, calculatedProps);\n var orderedChildren = children.map(function (child, index) {\n var childProps = assign_default()({\n animate: getAnimationProps(props, child, index, "victory-stack")\n }, child.props);\n\n return react.cloneElement(child, childProps);\n });\n /*\n reverse render order for children of `VictoryStack` so that higher children in the stack\n are rendered behind lower children. This looks nicer for stacked bars with cornerRadius, and\n areas with strokes\n */\n\n return orderedChildren.reverse();\n }, [props, childComponents, calculatedProps, getAnimationProps]);\n var containerProps = react.useMemo(function () {\n if (standalone) {\n return {\n domain: domain,\n scale: scale,\n width: width,\n height: height,\n standalone: standalone,\n theme: theme,\n style: style.parent,\n horizontal: horizontal,\n polar: polar,\n origin: origin,\n name: name\n };\n }\n\n return {};\n }, [standalone, domain, scale, width, height, theme, style, horizontal, polar, origin, name]);\n var container = react.useMemo(function () {\n if (standalone) {\n var defaultContainerProps = defaults_default()({}, containerComponent.props, containerProps);\n\n return react.cloneElement(containerComponent, defaultContainerProps);\n }\n\n return groupComponent;\n }, [groupComponent, standalone, containerComponent, containerProps]);\n var events = react.useMemo(function () {\n return getAllEvents(props);\n }, [props]);\n var previousProps = usePreviousProps(initialProps);\n react.useEffect(function () {\n // This is called before dismount to keep state in sync\n return function () {\n if (initialProps.animate) {\n setAnimationState(previousProps, initialProps);\n }\n };\n }, [setAnimationState, previousProps, initialProps]);\n\n if (!isEmpty_default()(events)) {\n return react.createElement(VictorySharedEvents, {\n container: container,\n eventKey: eventKey,\n events: events,\n externalEventMutations: externalEventMutations\n }, newChildren);\n }\n\n return react.cloneElement(container, container.props, newChildren);\n};\n\nVictoryStack.propTypes = victory_stack_objectSpread({}, baseProps, {\n bins: prop_types_default().oneOfType([prop_types_default().arrayOf(prop_types_default().oneOfType([nonNegative, prop_types_default().instanceOf(Date)])), nonNegative]),\n categories: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).string), prop_types_default().shape({\n x: prop_types_default().arrayOf((prop_types_default()).string),\n y: prop_types_default().arrayOf((prop_types_default()).string)\n })]),\n children: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).node), (prop_types_default()).node]),\n colorScale: prop_types_default().oneOfType([prop_types_default().arrayOf((prop_types_default()).string), prop_types_default().oneOf(["grayscale", "qualitative", "heatmap", "warm", "cool", "red", "green", "blue"])]),\n fillInMissingData: (prop_types_default()).bool,\n horizontal: (prop_types_default()).bool,\n labelComponent: (prop_types_default()).element,\n labels: prop_types_default().oneOfType([(prop_types_default()).func, (prop_types_default()).array]),\n style: prop_types_default().shape({\n parent: (prop_types_default()).object,\n data: (prop_types_default()).object,\n labels: (prop_types_default()).object\n }),\n xOffset: (prop_types_default()).number\n});\nVictoryStack.defaultProps = {\n containerComponent: react.createElement(VictoryContainer, null),\n groupComponent: react.createElement("g", null),\n standalone: true,\n theme: victory_theme.grayscale,\n fillInMissingData: true\n};\nvar VictoryStackMemo = react.memo(VictoryStack, (react_fast_compare_default()));\nVictoryStackMemo.displayName = "VictoryStack";\nVictoryStackMemo.role = "stack";\nVictoryStackMemo.expectedComponents = ["groupComponent", "containerComponent", "labelComponent"];\nVictoryStackMemo.getChildren = es_helper_methods_getChildren;\n/* harmony default export */ const victory_stack = (VictoryStackMemo);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartStack/ChartStack.js\n\n\n\n\n\n\nconst ChartStack = (_a) => {\n var { ariaDesc, ariaTitle, children, containerComponent = react.createElement(ChartContainer, null), themeColor, themeVariant, \n // destructure last\n theme = getTheme(themeColor, themeVariant) } = _a, rest = (0,tslib_es6.__rest)(_a, ["ariaDesc", "ariaTitle", "children", "containerComponent", "themeColor", "themeVariant", "theme"]);\n // Clone so users can override container props\n const container = react.cloneElement(containerComponent, Object.assign(Object.assign({ desc: ariaDesc, title: ariaTitle, theme }, containerComponent.props), { className: getClassName({ className: containerComponent.props.className }) // Override VictoryContainer class name\n }));\n // Note: containerComponent is required for theme\n return (react.createElement(victory_stack, Object.assign({ containerComponent: container, theme: theme }, rest), children));\n};\nChartStack.displayName = \'ChartStack\';\n// Note: VictoryStack.getChildren & VictoryStack.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartStack, victory_stack);\n//# sourceMappingURL=ChartStack.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartStack/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTheme/index.js\n\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartThreshold/ChartThreshold.js\n\n\n\n\n\n\n\nconst ChartThreshold = (_a) => {\n var { style = {}, themeColor, themeVariant, \n // destructure last\n theme = getThresholdTheme(themeColor, themeVariant) } = _a, rest = (0,tslib_es6.__rest)(_a, ["style", "themeColor", "themeVariant", "theme"]);\n // Returned style prop takes precedence over default theme\n const getStrokeDasharray = () => {\n if (style && style.data && style.data.strokeDasharray) {\n return style.data.strokeDasharray;\n }\n return getThresholdTheme(themeColor, themeVariant).line.style.data.strokeDasharray;\n };\n const getStrokeWidth = () => {\n if (style && style.data && style.data.strokeWidth) {\n return style.data.strokeWidth;\n }\n return getThresholdTheme(themeColor, themeVariant).line.style.data.strokeWidth;\n };\n // Clone style and apply strokeDasharray prop\n const thresholdStyle = cloneDeep_default()(style);\n if (thresholdStyle.data) {\n thresholdStyle.data.strokeDasharray = getStrokeDasharray();\n thresholdStyle.data.strokeWidth = getStrokeWidth();\n }\n else {\n thresholdStyle.data = {\n strokeDasharray: getStrokeDasharray(),\n strokeWidth: getStrokeWidth()\n };\n }\n return react.createElement(ChartLine, Object.assign({ style: thresholdStyle, theme: theme }, rest));\n};\nChartThreshold.displayName = \'ChartThreshold\';\n// Note: VictoryLine.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartThreshold, victory_line);\n//# sourceMappingURL=ChartThreshold.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartThreshold/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartTooltip/index.js\n\n//# sourceMappingURL=index.js.map\n// EXTERNAL MODULE: ./node_modules/lodash/flow.js\nvar flow = __webpack_require__(9242);\nvar flow_default = /*#__PURE__*/__webpack_require__.n(flow);\n// EXTERNAL MODULE: ./node_modules/lodash/forOwn.js\nvar forOwn = __webpack_require__(2525);\nvar forOwn_default = /*#__PURE__*/__webpack_require__.n(forOwn);\n// EXTERNAL MODULE: ./node_modules/lodash/toPairs.js\nvar toPairs = __webpack_require__(3220);\nvar toPairs_default = /*#__PURE__*/__webpack_require__.n(toPairs);\n// EXTERNAL MODULE: ./node_modules/lodash/isString.js\nvar isString = __webpack_require__(7037);\nvar isString_default = /*#__PURE__*/__webpack_require__.n(isString);\n// EXTERNAL MODULE: ./node_modules/delaunay-find/lib/index.js\nvar lib = __webpack_require__(3759);\n;// CONCATENATED MODULE: ./node_modules/victory-voronoi-container/es/voronoi-helpers.js\n\n\n\n\n\n\n\n\nfunction voronoi_helpers_toConsumableArray(arr) { return voronoi_helpers_arrayWithoutHoles(arr) || voronoi_helpers_iterableToArray(arr) || voronoi_helpers_nonIterableSpread(); }\n\nfunction voronoi_helpers_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction voronoi_helpers_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction voronoi_helpers_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\n\n\n\n\nvar VoronoiHelpers = {\n withinBounds: function (props, point) {\n var width = props.width,\n height = props.height,\n polar = props.polar,\n origin = props.origin,\n scale = props.scale;\n var padding = helpers_getPadding(props, "voronoiPadding");\n var x = point.x,\n y = point.y;\n\n if (polar) {\n var distanceSquared = Math.pow(x - origin.x, 2) + Math.pow(y - origin.y, 2);\n var radius = Math.max.apply(Math, voronoi_helpers_toConsumableArray(scale.y.range()));\n return distanceSquared < Math.pow(radius, 2);\n } else {\n return x >= padding.left && x <= width - padding.right && y >= padding.top && y <= height - padding.bottom;\n }\n },\n getDatasets: function (props) {\n var minDomain = {\n x: getMinValue(props.domain.x),\n y: getMinValue(props.domain.y)\n };\n var children = react.Children.toArray(props.children);\n\n var addMeta = function (data, name, child) {\n var continuous = child && child.type && child.type.continuous;\n var style = child ? child.props && child.props.style : props.style;\n return data.map(function (datum, index) {\n var _Helpers$getPoint = getPoint(datum),\n x = _Helpers$getPoint.x,\n y = _Helpers$getPoint.y,\n y0 = _Helpers$getPoint.y0,\n x0 = _Helpers$getPoint.x0;\n\n var voronoiX = (+x + +x0) / 2;\n var voronoiY = (+y + +y0) / 2;\n return assign_default()({\n _voronoiX: props.voronoiDimension === "y" ? minDomain.x : voronoiX,\n _voronoiY: props.voronoiDimension === "x" ? minDomain.y : voronoiY,\n eventKey: index,\n childName: name,\n continuous: continuous,\n style: style\n }, datum);\n });\n };\n\n if (props.data) {\n return addMeta(props.data);\n }\n\n var getData = function (childProps) {\n var data = data_getData(childProps);\n return Array.isArray(data) && data.length > 0 ? data : undefined;\n };\n\n var iteratee = function (child, childName) {\n var childProps = child.props || {};\n var name = childProps.name || childName;\n var blacklist = props.voronoiBlacklist || [];\n var blacklistStr = blacklist.filter((isString_default()));\n var blacklistRegExp = blacklist.filter((isRegExp_default()));\n var isRegExpMatch = blacklistRegExp.some(function (regExp) {\n return regExp.test(name);\n });\n\n if (!data_isDataComponent(child) || includes_default()(blacklistStr, name) || isRegExpMatch) {\n return null;\n }\n\n var getChildData = child.type && isFunction_default()(child.type.getData) ? child.type.getData : getData;\n var childData = getChildData(child.props);\n return childData ? addMeta(childData, name, child) : null;\n };\n\n return reduceChildren(children, iteratee, props);\n },\n findPoints: function (datasets, point) {\n return datasets.filter(function (d) {\n return point._voronoiX === d._voronoiX && point._voronoiY === d._voronoiY;\n });\n },\n withinRadius: function (point, mousePosition, radius) {\n if (!point) {\n return false;\n }\n\n if (!radius) {\n return true;\n }\n\n var x = mousePosition.x,\n y = mousePosition.y;\n var distanceSquared = Math.pow(x - point[0], 2) + Math.pow(y - point[1], 2);\n return distanceSquared < Math.pow(radius, 2);\n },\n getVoronoiPoints: function (props, mousePosition) {\n var datasets = this.getDatasets(props);\n var scaledData = datasets.map(function (d) {\n var _Helpers$scalePoint = scalePoint(props, d),\n x = _Helpers$scalePoint.x,\n y = _Helpers$scalePoint.y;\n\n return [x, y];\n });\n var delaunay = lib/* default.from */.Z.from(scaledData);\n var index = delaunay.find(mousePosition.x, mousePosition.y);\n var withinRadius = this.withinRadius(scaledData[index], mousePosition, props.radius);\n var points = withinRadius ? this.findPoints(datasets, datasets[index]) : [];\n return {\n points: points,\n index: index\n };\n },\n getActiveMutations: function (props, point) {\n var childName = point.childName,\n continuous = point.continuous;\n var activateData = props.activateData,\n activateLabels = props.activateLabels,\n labels = props.labels;\n\n if (!activateData && !activateLabels) {\n return [];\n }\n\n var defaultTarget = activateData ? ["data"] : [];\n var targets = labels && !activateLabels ? defaultTarget : defaultTarget.concat("labels");\n\n if (isEmpty_default()(targets)) {\n return [];\n }\n\n return targets.map(function (target) {\n var eventKey = continuous === true && target === "data" ? "all" : point.eventKey;\n return {\n childName: childName,\n eventKey: eventKey,\n target: target,\n mutation: function () {\n return {\n active: true\n };\n }\n };\n });\n },\n getInactiveMutations: function (props, point) {\n var childName = point.childName,\n continuous = point.continuous;\n var activateData = props.activateData,\n activateLabels = props.activateLabels,\n labels = props.labels;\n\n if (!activateData && !activateLabels) {\n return [];\n }\n\n var defaultTarget = activateData ? ["data"] : [];\n var targets = labels && !activateLabels ? defaultTarget : defaultTarget.concat("labels");\n\n if (isEmpty_default()(targets)) {\n return [];\n }\n\n return targets.map(function (target) {\n var eventKey = continuous && target === "data" ? "all" : point.eventKey;\n return {\n childName: childName,\n eventKey: eventKey,\n target: target,\n mutation: function () {\n return null;\n }\n };\n });\n },\n // eslint-disable-next-line max-params\n getParentMutation: function (activePoints, mousePosition, parentSVG, vIndex) {\n return [{\n target: "parent",\n eventKey: "parent",\n mutation: function () {\n return {\n activePoints: activePoints,\n mousePosition: mousePosition,\n parentSVG: parentSVG,\n vIndex: vIndex\n };\n }\n }];\n },\n onActivated: function (props, points) {\n if (isFunction_default()(props.onActivated)) {\n props.onActivated(points, props);\n }\n },\n onDeactivated: function (props, points) {\n if (isFunction_default()(props.onDeactivated)) {\n props.onDeactivated(points, props);\n }\n },\n onMouseLeave: function (evt, targetProps) {\n var _this = this,\n _getParentMutation;\n\n var activePoints = targetProps.activePoints || [];\n this.onDeactivated(targetProps, activePoints);\n var inactiveMutations = activePoints.length ? activePoints.map(function (point) {\n return _this.getInactiveMutations(targetProps, point);\n }) : [];\n return (_getParentMutation = this.getParentMutation([])).concat.apply(_getParentMutation, voronoi_helpers_toConsumableArray(inactiveMutations));\n },\n onMouseMove: function (evt, targetProps) {\n var _this2 = this;\n\n // eslint-disable-line max-statements\n var activePoints = targetProps.activePoints || [];\n var parentSVG = targetProps.parentSVG || getParentSVG(evt);\n var mousePosition = getSVGEventCoordinates(evt, parentSVG);\n\n if (!this.withinBounds(targetProps, mousePosition)) {\n var _getParentMutation2;\n\n this.onDeactivated(targetProps, activePoints);\n var inactiveMutations = activePoints.length ? activePoints.map(function (point) {\n return _this2.getInactiveMutations(targetProps, point);\n }) : [];\n return (_getParentMutation2 = this.getParentMutation([], mousePosition, parentSVG)).concat.apply(_getParentMutation2, voronoi_helpers_toConsumableArray(inactiveMutations));\n }\n\n var _getVoronoiPoints = this.getVoronoiPoints(targetProps, mousePosition),\n _getVoronoiPoints$poi = _getVoronoiPoints.points,\n points = _getVoronoiPoints$poi === void 0 ? [] : _getVoronoiPoints$poi,\n index = _getVoronoiPoints.index;\n\n var parentMutations = this.getParentMutation(points, mousePosition, parentSVG, index);\n\n if (activePoints.length && react_fast_compare_default()(points, activePoints)) {\n return parentMutations;\n } else {\n this.onActivated(targetProps, points);\n this.onDeactivated(targetProps, activePoints);\n var activeMutations = points.length ? points.map(function (point) {\n return _this2.getActiveMutations(targetProps, point);\n }) : [];\n\n var _inactiveMutations = activePoints.length ? activePoints.map(function (point) {\n return _this2.getInactiveMutations(targetProps, point);\n }) : [];\n\n return parentMutations.concat.apply(parentMutations, voronoi_helpers_toConsumableArray(_inactiveMutations).concat(voronoi_helpers_toConsumableArray(activeMutations)));\n }\n }\n};\n/* harmony default export */ const voronoi_helpers = ({\n onMouseLeave: VoronoiHelpers.onMouseLeave.bind(VoronoiHelpers),\n onMouseMove: throttle_default()(VoronoiHelpers.onMouseMove.bind(VoronoiHelpers), 32, // eslint-disable-line no-magic-numbers\n {\n leading: true,\n trailing: false\n })\n});\n;// CONCATENATED MODULE: ./node_modules/victory-voronoi-container/es/victory-voronoi-container.js\n\n\n\n\nfunction victory_voronoi_container_toConsumableArray(arr) { return victory_voronoi_container_arrayWithoutHoles(arr) || victory_voronoi_container_iterableToArray(arr) || victory_voronoi_container_nonIterableSpread(); }\n\nfunction victory_voronoi_container_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_voronoi_container_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_voronoi_container_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction victory_voronoi_container_objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction victory_voronoi_container_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_voronoi_container_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_voronoi_container_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction victory_voronoi_container_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_voronoi_container_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_voronoi_container_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_voronoi_container_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_voronoi_container_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_voronoi_container_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_voronoi_container_assertThisInitialized(self); }\n\nfunction victory_voronoi_container_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_voronoi_container_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\n\nvar voronoiContainerMixin = function (base) {\n var _class, _temp;\n\n return _temp = _class =\n /*#__PURE__*/\n function (_base) {\n victory_voronoi_container_inherits(VictoryVoronoiContainer, _base);\n\n function VictoryVoronoiContainer() {\n victory_voronoi_container_classCallCheck(this, VictoryVoronoiContainer);\n\n return victory_voronoi_container_possibleConstructorReturn(this, (VictoryVoronoiContainer.__proto__ || Object.getPrototypeOf(VictoryVoronoiContainer)).apply(this, arguments));\n }\n\n victory_voronoi_container_createClass(VictoryVoronoiContainer, [{\n key: "getDimension",\n value: function getDimension(props) {\n var horizontal = props.horizontal,\n voronoiDimension = props.voronoiDimension;\n\n if (!horizontal || !voronoiDimension) {\n return voronoiDimension;\n }\n\n return voronoiDimension === "x" ? "y" : "x";\n }\n }, {\n key: "getPoint",\n value: function getPoint(point) {\n var whitelist = ["_x", "_x1", "_x0", "_y", "_y1", "_y0"];\n return pick_default()(point, whitelist);\n }\n }, {\n key: "getLabelPosition",\n value: function getLabelPosition(props, labelProps, points) {\n var mousePosition = props.mousePosition,\n mouseFollowTooltips = props.mouseFollowTooltips;\n var voronoiDimension = this.getDimension(props);\n var point = this.getPoint(points[0]);\n var basePosition = scalePoint(props, point);\n var center = mouseFollowTooltips ? mousePosition : undefined;\n\n if (!voronoiDimension || points.length < 2) {\n return victory_voronoi_container_objectSpread({}, basePosition, {\n center: defaults_default()({}, labelProps.center, center)\n });\n }\n\n var x = voronoiDimension === "y" ? mousePosition.x : basePosition.x;\n var y = voronoiDimension === "x" ? mousePosition.y : basePosition.y;\n center = mouseFollowTooltips ? mousePosition : {\n x: x,\n y: y\n };\n return {\n x: x,\n y: y,\n center: defaults_default()({}, labelProps.center, center)\n };\n }\n }, {\n key: "getStyle",\n value: function getStyle(props, points, type) {\n var labels = props.labels,\n labelComponent = props.labelComponent,\n theme = props.theme;\n var componentProps = labelComponent.props || {};\n var themeStyles = theme && theme.voronoi && theme.voronoi.style ? theme.voronoi.style : {};\n var componentStyleArray = type === "flyout" ? componentProps.flyoutStyle : componentProps.style;\n return points.reduce(function (memo, datum, index) {\n var labelProps = defaults_default()({}, componentProps, {\n datum: datum,\n active: true\n });\n\n var text = isFunction_default()(labels) ? labels(labelProps) : undefined;\n var textArray = text !== undefined ? "".concat(text).split("\\n") : [];\n var baseStyle = datum.style && datum.style[type] || {};\n var componentStyle = Array.isArray(componentStyleArray) ? componentStyleArray[index] : componentStyleArray;\n var style = evaluateStyle(defaults_default()({}, componentStyle, baseStyle, themeStyles[type]), labelProps);\n var styleArray = textArray.length ? textArray.map(function () {\n return style;\n }) : [style];\n memo = memo.concat(styleArray);\n return memo;\n }, []);\n }\n }, {\n key: "getDefaultLabelProps",\n value: function getDefaultLabelProps(props, points) {\n var voronoiDimension = props.voronoiDimension,\n horizontal = props.horizontal,\n mouseFollowTooltips = props.mouseFollowTooltips;\n var point = this.getPoint(points[0]);\n var multiPoint = voronoiDimension && points.length > 1;\n var y = point._y1 !== undefined ? point._y1 : point._y;\n var defaultHorizontalOrientation = y < 0 ? "left" : "right";\n var defaultOrientation = y < 0 ? "bottom" : "top";\n var labelOrientation = horizontal ? defaultHorizontalOrientation : defaultOrientation;\n var orientation = mouseFollowTooltips ? undefined : labelOrientation;\n return {\n orientation: orientation,\n pointerLength: multiPoint ? 0 : undefined,\n constrainToVisibleArea: multiPoint || mouseFollowTooltips ? true : undefined\n };\n }\n }, {\n key: "getLabelProps",\n value: function getLabelProps(props, points) {\n var labels = props.labels,\n scale = props.scale,\n labelComponent = props.labelComponent,\n theme = props.theme,\n width = props.width,\n height = props.height;\n var componentProps = labelComponent.props || {};\n var text = points.reduce(function (memo, datum) {\n var labelProps = defaults_default()({}, componentProps, {\n datum: datum,\n active: true\n });\n\n var t = isFunction_default()(labels) ? labels(labelProps) : null;\n\n if (t === null || t === undefined) {\n return memo;\n }\n\n memo = memo.concat("".concat(t).split("\\n"));\n return memo;\n }, []); // remove properties from first point to make datum\n // eslint-disable-next-line no-unused-vars\n\n var _points$ = points[0],\n childName = _points$.childName,\n eventKey = _points$.eventKey,\n style = _points$.style,\n continuous = _points$.continuous,\n datum = victory_voronoi_container_objectWithoutProperties(_points$, ["childName", "eventKey", "style", "continuous"]);\n\n var name = props.name === childName ? childName : "".concat(props.name, "-").concat(childName);\n\n var labelProps = defaults_default()({\n key: "".concat(name, "-").concat(eventKey, "-voronoi-tooltip"),\n id: "".concat(name, "-").concat(eventKey, "-voronoi-tooltip"),\n active: true,\n renderInPortal: false,\n activePoints: points,\n datum: datum,\n scale: scale,\n theme: theme\n }, componentProps, {\n text: text,\n width: width,\n height: height,\n style: this.getStyle(props, points, "labels"),\n flyoutStyle: this.getStyle(props, points, "flyout")[0]\n }, this.getDefaultLabelProps(props, points));\n\n var labelPosition = this.getLabelPosition(props, labelProps, points);\n return defaults_default()({}, labelPosition, labelProps);\n }\n }, {\n key: "getTooltip",\n value: function getTooltip(props) {\n var labels = props.labels,\n activePoints = props.activePoints,\n labelComponent = props.labelComponent;\n\n if (!labels) {\n return null;\n }\n\n if (Array.isArray(activePoints) && activePoints.length) {\n var labelProps = this.getLabelProps(props, activePoints);\n var text = labelProps.text;\n var showLabel = Array.isArray(text) ? text.filter(Boolean).length : text;\n return showLabel ? react.cloneElement(labelComponent, labelProps) : null;\n } else {\n return null;\n }\n } // Overrides method in VictoryContainer\n\n }, {\n key: "getChildren",\n value: function getChildren(props) {\n return victory_voronoi_container_toConsumableArray(react.Children.toArray(props.children)).concat([this.getTooltip(props)]);\n }\n }]);\n\n return VictoryVoronoiContainer;\n }(base), Object.defineProperty(_class, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryVoronoiContainer"\n }), Object.defineProperty(_class, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_voronoi_container_objectSpread({}, VictoryContainer.propTypes, {\n activateData: (prop_types_default()).bool,\n activateLabels: (prop_types_default()).bool,\n disable: (prop_types_default()).bool,\n labelComponent: (prop_types_default()).element,\n labels: (prop_types_default()).func,\n mouseFollowTooltips: (prop_types_default()).bool,\n onActivated: (prop_types_default()).func,\n onDeactivated: (prop_types_default()).func,\n radius: (prop_types_default()).number,\n voronoiBlacklist: prop_types_default().arrayOf(prop_types_default().oneOfType([(prop_types_default()).string, regExp])),\n voronoiDimension: prop_types_default().oneOf(["x", "y"]),\n voronoiPadding: prop_types_default().oneOfType([(prop_types_default()).number, prop_types_default().shape({\n top: (prop_types_default()).number,\n bottom: (prop_types_default()).number,\n left: (prop_types_default()).number,\n right: (prop_types_default()).number\n })])\n })\n }), Object.defineProperty(_class, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_voronoi_container_objectSpread({}, VictoryContainer.defaultProps, {\n activateData: true,\n activateLabels: true,\n labelComponent: react.createElement(VictoryTooltip, null),\n voronoiPadding: 5\n })\n }), Object.defineProperty(_class, "defaultEvents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return [{\n target: "parent",\n eventHandlers: {\n onMouseLeave: function (evt, targetProps) {\n return props.disable ? {} : voronoi_helpers.onMouseLeave(evt, targetProps);\n },\n onTouchCancel: function (evt, targetProps) {\n return props.disable ? {} : voronoi_helpers.onMouseLeave(evt, targetProps);\n },\n onMouseMove: function (evt, targetProps) {\n return props.disable ? {} : voronoi_helpers.onMouseMove(evt, targetProps);\n },\n onTouchMove: function (evt, targetProps) {\n return props.disable ? {} : voronoi_helpers.onMouseMove(evt, targetProps);\n }\n }\n }, {\n target: "data",\n eventHandlers: props.disable ? {} : {\n onMouseOver: function () {\n return null;\n },\n onMouseOut: function () {\n return null;\n },\n onMouseMove: function () {\n return null;\n }\n }\n }];\n }\n }), _temp;\n};\n/* harmony default export */ const victory_voronoi_container = (voronoiContainerMixin(VictoryContainer));\n// EXTERNAL MODULE: ./node_modules/lodash/delay.js\nvar delay = __webpack_require__(8066);\nvar delay_default = /*#__PURE__*/__webpack_require__.n(delay);\n;// CONCATENATED MODULE: ./node_modules/victory-zoom-container/es/zoom-helpers.js\n\n\n\n\n\nfunction zoom_helpers_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction zoom_helpers_slicedToArray(arr, i) { return zoom_helpers_arrayWithHoles(arr) || zoom_helpers_iterableToArrayLimit(arr, i) || zoom_helpers_nonIterableRest(); }\n\nfunction zoom_helpers_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }\n\nfunction zoom_helpers_iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction zoom_helpers_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\n/*eslint no-magic-numbers: ["error", { "ignore": [-1, 0, 1, 2, 1000] }]*/\n\n\nvar RawZoomHelpers = {\n checkDomainEquality: function (a, b) {\n var checkDimension = function (dim) {\n var val1 = a && a[dim];\n var val2 = b && b[dim];\n\n if (!val1 && !val2) {\n return true;\n } else if (!val1 || !val2) {\n return false;\n }\n\n return +val1[0] === +val2[0] && +val1[1] === +val2[1];\n };\n\n return checkDimension("x") && checkDimension("y");\n },\n\n /**\n * Generates a new domain scaled by factor and constrained by the original domain.\n * @param {[Number, Number]} currentDomain The domain to be scaled.\n * @param {Object} evt the event object\n * @param {Object} props the props of the targeted component\n * @param {String} axis the desired dimension (either x or y)\n * @return {[Number, Number]} The scale domain\n */\n // eslint-disable-next-line max-params\n scale: function (currentDomain, evt, props, axis) {\n var _currentDomain = zoom_helpers_slicedToArray(currentDomain, 2),\n from = _currentDomain[0],\n to = _currentDomain[1];\n\n var range = Math.abs(to - from);\n var minimumZoom = props.minimumZoom && props.minimumZoom[axis];\n var factor = this.getScaleFactor(evt);\n\n if (minimumZoom && range <= minimumZoom && factor < 1) {\n return currentDomain;\n }\n\n var _getDomain$axis = zoom_helpers_slicedToArray(this.getDomain(props)[axis], 2),\n fromBound = _getDomain$axis[0],\n toBound = _getDomain$axis[1];\n\n var percent = this.getScalePercent(evt, props, axis);\n var point = factor * from + percent * (factor * range);\n var minDomain = this.getMinimumDomain(point, props, axis);\n\n var _getScaledDomain = this.getScaledDomain(currentDomain, factor, percent),\n _getScaledDomain2 = zoom_helpers_slicedToArray(_getScaledDomain, 2),\n newMin = _getScaledDomain2[0],\n newMax = _getScaledDomain2[1];\n\n var newDomain = [newMin > fromBound && newMin < toBound ? newMin : fromBound, newMax < toBound && newMax > fromBound ? newMax : toBound];\n var domain = Math.abs(minDomain[1] - minDomain[0]) > Math.abs(newDomain[1] - newDomain[0]) ? minDomain : newDomain;\n return containsDates([fromBound, toBound]) ? [new Date(domain[0]), new Date(domain[1])] : domain;\n },\n getScaledDomain: function (currentDomain, factor, percent) {\n var _currentDomain2 = zoom_helpers_slicedToArray(currentDomain, 2),\n from = _currentDomain2[0],\n to = _currentDomain2[1];\n\n var range = Math.abs(to - from);\n var diff = range - range * factor;\n var newMin = +from + diff * percent;\n var newMax = +to - diff * (1 - percent);\n return [Math.min(newMin, newMax), Math.max(newMin, newMax)];\n },\n getMinimumDomain: function (point, props, axis) {\n var minimumZoom = props.minimumZoom;\n var originalDomain = this.getDomain(props)[axis];\n\n var _originalDomain = zoom_helpers_slicedToArray(originalDomain, 2),\n from = _originalDomain[0],\n to = _originalDomain[1];\n\n var defaultMin = Math.abs(from - to) / 1000;\n var extent = minimumZoom ? minimumZoom[axis] || defaultMin : defaultMin;\n var minExtent = point - extent / 2;\n var maxExtent = point + extent / 2;\n return [minExtent > from && minExtent < to ? minExtent : from, maxExtent < to && maxExtent > from ? maxExtent : +from + extent / 2];\n },\n zoommingOut: function (evt) {\n return evt.deltaY > 0;\n },\n getScaleFactor: function (evt) {\n var sign = this.zoommingOut(evt) ? 1 : -1; // eslint-disable-next-line no-magic-numbers\n\n var delta = Math.min(Math.abs(evt.deltaY / 300), 0.5); // TODO: Check scale factor\n\n return Math.abs(1 + sign * delta);\n },\n getScalePercent: function (evt, props, axis) {\n var originalDomain = this.getDomain(props);\n\n var _originalDomain$axis = zoom_helpers_slicedToArray(originalDomain[axis], 2),\n from = _originalDomain$axis[0],\n to = _originalDomain$axis[1];\n\n var position = this.getPosition(evt, props, originalDomain);\n return (position[axis] - from) / Math.abs(to - from);\n },\n getPosition: function (evt, props, originalDomain) {\n var _Selection$getSVGEven = getSVGEventCoordinates(evt),\n x = _Selection$getSVGEven.x,\n y = _Selection$getSVGEven.y;\n\n var originalScale = {\n x: props.scale.x.domain(originalDomain.x),\n y: props.scale.y.domain(originalDomain.y)\n };\n return getDataCoordinates(props, originalScale, x, y);\n },\n\n /**\n * Generate a new domain translated by the delta and constrained by the original domain.\n * @param {[Number, Number]} currentDomain The domain to be translated.\n * @param {[Number, Number]} originalDomain The original domain for the data set.\n * @param {Number} delta The delta to translate by\n * @return {[Number, Number]} The translated domain\n */\n pan: function (currentDomain, originalDomain, delta) {\n var _currentDomain$map = currentDomain.map(function (val) {\n return +val;\n }),\n _currentDomain$map2 = zoom_helpers_slicedToArray(_currentDomain$map, 2),\n fromCurrent = _currentDomain$map2[0],\n toCurrent = _currentDomain$map2[1];\n\n var _originalDomain$map = originalDomain.map(function (val) {\n return +val;\n }),\n _originalDomain$map2 = zoom_helpers_slicedToArray(_originalDomain$map, 2),\n fromOriginal = _originalDomain$map2[0],\n toOriginal = _originalDomain$map2[1];\n\n var lowerBound = fromCurrent + delta;\n var upperBound = toCurrent + delta;\n var newDomain;\n\n if (lowerBound > fromOriginal && upperBound < toOriginal) {\n newDomain = [lowerBound, upperBound];\n } else if (lowerBound < fromOriginal) {\n // Clamp to lower limit\n var dx = toCurrent - fromCurrent;\n newDomain = [fromOriginal, fromOriginal + dx];\n } else if (upperBound > toOriginal) {\n // Clamp to upper limit\n var _dx = toCurrent - fromCurrent;\n\n newDomain = [toOriginal - _dx, toOriginal];\n } else {\n newDomain = currentDomain;\n }\n\n return containsDates(currentDomain) || containsDates(originalDomain) ? newDomain.map(function (val) {\n return new Date(val);\n }) : newDomain;\n },\n // eslint-disable-next-line max-params\n getDomainScale: function (domain, scale, axis, horizontal) {\n var axisDomain = Array.isArray(domain) ? domain : domain[axis];\n\n var _axisDomain = zoom_helpers_slicedToArray(axisDomain, 2),\n from = _axisDomain[0],\n to = _axisDomain[1];\n\n var otherAxis = axis === "x" ? "y" : "x";\n var range = horizontal ? scale[otherAxis].range() : scale[axis].range();\n var plottableWidth = Math.abs(range[0] - range[1]);\n return plottableWidth / (to - from);\n },\n handleAnimation: function (ctx) {\n var animationTimer = ctx.context.animationTimer;\n var transitionTimer = ctx.context.transitionTimer;\n transitionTimer.bypassAnimation();\n animationTimer.bypassAnimation();\n\n var resumeAnimation = function () {\n animationTimer.resumeAnimation();\n transitionTimer.resumeAnimation();\n }; // delay the callback that resumes animation by ~1 frame so that animation does not interfere with wheel events\n\n\n return delay_default()(resumeAnimation, 16); // eslint-disable-line no-magic-numbers\n },\n getLastDomain: function (targetProps, originalDomain) {\n var zoomDomain = targetProps.zoomDomain,\n cachedZoomDomain = targetProps.cachedZoomDomain,\n currentDomain = targetProps.currentDomain,\n domain = targetProps.domain;\n\n if (zoomDomain && !this.checkDomainEquality(zoomDomain, cachedZoomDomain)) {\n return defaults_default()({}, zoomDomain, domain);\n }\n\n return defaults_default()({}, currentDomain || zoomDomain || originalDomain, domain);\n },\n getDomain: function (props) {\n var originalDomain = props.originalDomain,\n domain = props.domain,\n children = props.children,\n zoomDimension = props.zoomDimension;\n var childComponents = react.Children.toArray(children);\n var childrenDomain = {};\n\n if (childComponents.length) {\n childrenDomain = zoomDimension ? zoom_helpers_defineProperty({}, zoomDimension, getDomainFromChildren(props, zoomDimension, childComponents)) : {\n x: getDomainFromChildren(props, "x", childComponents),\n y: getDomainFromChildren(props, "y", childComponents)\n };\n }\n\n return defaults_default()({}, childrenDomain, originalDomain, domain);\n },\n onMouseDown: function (evt, targetProps) {\n evt.preventDefault();\n\n if (!targetProps.allowPan) {\n return undefined;\n }\n\n var parentSVG = targetProps.parentSVG || getParentSVG(evt);\n\n var _Selection$getSVGEven2 = getSVGEventCoordinates(evt, parentSVG),\n x = _Selection$getSVGEven2.x,\n y = _Selection$getSVGEven2.y;\n\n return [{\n target: "parent",\n mutation: function () {\n return {\n startX: x,\n startY: y,\n panning: true,\n parentSVG: parentSVG,\n parentControlledProps: ["domain"]\n };\n }\n }];\n },\n onMouseUp: function (evt, targetProps) {\n if (!targetProps.allowPan) {\n return undefined;\n }\n\n return [{\n target: "parent",\n mutation: function () {\n return {\n panning: false\n };\n }\n }];\n },\n onMouseLeave: function (evt, targetProps) {\n if (!targetProps.allowPan) {\n return undefined;\n }\n\n return [{\n target: "parent",\n mutation: function () {\n return {\n panning: false\n };\n }\n }];\n },\n // eslint-disable-next-line max-params, max-statements\n onMouseMove: function (evt, targetProps, eventKey, ctx) {\n if (targetProps.panning && targetProps.allowPan) {\n var scale = targetProps.scale,\n startX = targetProps.startX,\n startY = targetProps.startY,\n onZoomDomainChange = targetProps.onZoomDomainChange,\n zoomDomain = targetProps.zoomDomain,\n zoomDimension = targetProps.zoomDimension,\n horizontal = targetProps.horizontal;\n var parentSVG = targetProps.parentSVG || getParentSVG(evt);\n\n var _Selection$getSVGEven3 = getSVGEventCoordinates(evt, parentSVG),\n x = _Selection$getSVGEven3.x,\n y = _Selection$getSVGEven3.y;\n\n var originalDomain = this.getDomain(targetProps);\n var lastDomain = this.getLastDomain(targetProps, originalDomain);\n var deltaX = horizontal ? y - startY : startX - x;\n var deltaY = horizontal ? startX - x : y - startY;\n var dx = deltaX / this.getDomainScale(lastDomain, scale, "x", horizontal);\n var dy = deltaY / this.getDomainScale(lastDomain, scale, "y", horizontal);\n var currentDomain = {\n x: zoomDimension === "y" ? originalDomain.x : this.pan(lastDomain.x, originalDomain.x, dx),\n y: zoomDimension === "x" ? originalDomain.y : this.pan(lastDomain.y, originalDomain.y, dy)\n };\n var resumeAnimation = this.handleAnimation(ctx);\n var zoomActive = !this.checkDomainEquality(originalDomain, lastDomain);\n var mutatedProps = {\n parentControlledProps: ["domain"],\n startX: x,\n startY: y,\n parentSVG: parentSVG,\n currentDomain: currentDomain,\n originalDomain: originalDomain,\n cachedZoomDomain: zoomDomain,\n zoomActive: zoomActive\n };\n\n if (isFunction_default()(onZoomDomainChange)) {\n onZoomDomainChange(currentDomain, defaults_default()({}, mutatedProps, targetProps));\n }\n\n return [{\n target: "parent",\n callback: resumeAnimation,\n mutation: function () {\n return mutatedProps;\n }\n }];\n }\n\n return undefined;\n },\n // eslint-disable-next-line max-params\n onWheel: function (evt, targetProps, eventKey, ctx) {\n if (!targetProps.allowZoom) {\n return undefined;\n }\n\n var onZoomDomainChange = targetProps.onZoomDomainChange,\n zoomDimension = targetProps.zoomDimension,\n zoomDomain = targetProps.zoomDomain;\n var originalDomain = this.getDomain(targetProps);\n var lastDomain = this.getLastDomain(targetProps, originalDomain);\n var x = lastDomain.x,\n y = lastDomain.y;\n var currentDomain = {\n x: zoomDimension === "y" ? lastDomain.x : this.scale(x, evt, targetProps, "x"),\n y: zoomDimension === "x" ? lastDomain.y : this.scale(y, evt, targetProps, "y")\n };\n var resumeAnimation = this.handleAnimation(ctx);\n var zoomActive = !this.zoommingOut(evt) || // if zoomming in or\n // if zoomActive is already set AND user hasn\'t zoommed out all the way\n targetProps.zoomActive && !this.checkDomainEquality(originalDomain, lastDomain);\n var mutatedProps = {\n currentDomain: currentDomain,\n originalDomain: originalDomain,\n cachedZoomDomain: zoomDomain,\n parentControlledProps: ["domain"],\n panning: false,\n zoomActive: zoomActive\n };\n\n if (isFunction_default()(onZoomDomainChange)) {\n onZoomDomainChange(currentDomain, defaults_default()({}, mutatedProps, targetProps));\n }\n\n return [{\n target: "parent",\n callback: resumeAnimation,\n mutation: function () {\n return mutatedProps;\n }\n }];\n }\n};\n // allow victory-native to extend these helpers\n\n/* harmony default export */ const zoom_helpers = ({\n checkDomainEquality: RawZoomHelpers.checkDomainEquality.bind(RawZoomHelpers),\n onMouseDown: RawZoomHelpers.onMouseDown.bind(RawZoomHelpers),\n onMouseUp: RawZoomHelpers.onMouseUp.bind(RawZoomHelpers),\n onMouseLeave: RawZoomHelpers.onMouseLeave.bind(RawZoomHelpers),\n onMouseMove: throttle_default()(RawZoomHelpers.onMouseMove.bind(RawZoomHelpers), 16, // eslint-disable-line no-magic-numbers\n {\n leading: true,\n trailing: false\n }),\n onWheel: throttle_default()(RawZoomHelpers.onWheel.bind(RawZoomHelpers), 16, // eslint-disable-line no-magic-numbers\n {\n leading: true,\n trailing: false\n })\n});\n;// CONCATENATED MODULE: ./node_modules/victory-zoom-container/es/victory-zoom-container.js\n\n\n\nfunction victory_zoom_container_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_zoom_container_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_zoom_container_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction victory_zoom_container_toConsumableArray(arr) { return victory_zoom_container_arrayWithoutHoles(arr) || victory_zoom_container_iterableToArray(arr) || victory_zoom_container_nonIterableSpread(); }\n\nfunction victory_zoom_container_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_zoom_container_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_zoom_container_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction victory_zoom_container_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_zoom_container_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_zoom_container_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_zoom_container_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_zoom_container_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_zoom_container_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_zoom_container_assertThisInitialized(self); }\n\nfunction victory_zoom_container_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_zoom_container_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\nvar DEFAULT_DOWNSAMPLE = 150;\nvar zoomContainerMixin = function (base) {\n var _class, _temp;\n\n return _temp = _class =\n /*#__PURE__*/\n function (_base) {\n victory_zoom_container_inherits(VictoryZoomContainer, _base);\n\n function VictoryZoomContainer() {\n victory_zoom_container_classCallCheck(this, VictoryZoomContainer);\n\n return victory_zoom_container_possibleConstructorReturn(this, (VictoryZoomContainer.__proto__ || Object.getPrototypeOf(VictoryZoomContainer)).apply(this, arguments));\n }\n\n victory_zoom_container_createClass(VictoryZoomContainer, [{\n key: "clipDataComponents",\n value: function clipDataComponents(children, props) {\n var scale = props.scale,\n clipContainerComponent = props.clipContainerComponent,\n polar = props.polar,\n origin = props.origin,\n horizontal = props.horizontal;\n var rangeX = horizontal ? scale.y.range() : scale.x.range();\n var rangeY = horizontal ? scale.x.range() : scale.y.range();\n var plottableWidth = Math.abs(rangeX[0] - rangeX[1]);\n var plottableHeight = Math.abs(rangeY[0] - rangeY[1]);\n var radius = Math.max.apply(Math, victory_zoom_container_toConsumableArray(rangeY));\n var groupComponent = react.cloneElement(clipContainerComponent, victory_zoom_container_objectSpread({\n clipWidth: plottableWidth,\n clipHeight: plottableHeight,\n translateX: Math.min.apply(Math, victory_zoom_container_toConsumableArray(rangeX)),\n translateY: Math.min.apply(Math, victory_zoom_container_toConsumableArray(rangeY)),\n polar: polar,\n origin: polar ? origin : undefined,\n radius: polar ? radius : undefined\n }, clipContainerComponent.props));\n return react.Children.toArray(children).map(function (child) {\n if (!data_isDataComponent(child)) {\n return child;\n } else {\n return react.cloneElement(child, {\n groupComponent: groupComponent\n });\n }\n });\n }\n }, {\n key: "modifyPolarDomain",\n value: function modifyPolarDomain(domain, originalDomain) {\n // Only zoom the radius of polar charts. Zooming angles is very confusing\n return {\n x: originalDomain.x,\n y: [0, domain.y[1]]\n };\n }\n }, {\n key: "downsampleZoomData",\n value: function downsampleZoomData(props, child, domain) {\n var downsample = props.downsample;\n\n var getData = function (childProps) {\n var data = childProps.data,\n x = childProps.x,\n y = childProps.y;\n var defaultGetData = child.type && isFunction_default()(child.type.getData) ? child.type.getData : function () {\n return undefined;\n }; // skip costly data formatting if x and y accessors are not present\n\n return Array.isArray(data) && !x && !y ? data : defaultGetData(childProps);\n };\n\n var data = getData(child.props); // return undefined if downsample is not run, then default() will replace with child.props.data\n\n if (!downsample || !domain || !data) {\n return undefined;\n }\n\n var maxPoints = downsample === true ? DEFAULT_DOWNSAMPLE : downsample;\n var dimension = props.zoomDimension || "x"; // important: assumes data is ordered by dimension\n // get the start and end of the data that is in the current visible domain\n\n var startIndex = data.findIndex(function (d) {\n return d[dimension] >= domain[dimension][0];\n });\n var endIndex = data.findIndex(function (d) {\n return d[dimension] > domain[dimension][1];\n }); // pick one more point (if available) at each end so that VictoryLine, VictoryArea connect\n\n if (startIndex !== 0) {\n startIndex -= 1;\n }\n\n if (endIndex !== -1) {\n endIndex += 1;\n }\n\n var visibleData = data.slice(startIndex, endIndex);\n return data_downsample(visibleData, maxPoints, startIndex);\n }\n }, {\n key: "modifyChildren",\n value: function modifyChildren(props) {\n var _this = this;\n\n var childComponents = react.Children.toArray(props.children); // eslint-disable-next-line max-statements\n\n return childComponents.map(function (child) {\n var role = child.type && child.type.role;\n var isDataComponent = data_isDataComponent(child);\n var currentDomain = props.currentDomain,\n zoomActive = props.zoomActive,\n allowZoom = props.allowZoom;\n\n var originalDomain = defaults_default()({}, props.originalDomain, props.domain);\n\n var zoomDomain = defaults_default()({}, props.zoomDomain, props.domain);\n\n var cachedZoomDomain = defaults_default()({}, props.cachedZoomDomain, props.domain);\n\n var domain;\n\n if (!zoom_helpers.checkDomainEquality(zoomDomain, cachedZoomDomain)) {\n // if zoomDomain has been changed, use it\n domain = zoomDomain;\n } else if (allowZoom && !zoomActive) {\n // if user has zoomed all the way out, use the child domain\n domain = child.props.domain;\n } else {\n // default: use currentDomain, set by the event handlers\n domain = defaults_default()({}, currentDomain, originalDomain);\n }\n\n var newDomain = props.polar ? _this.modifyPolarDomain(domain, originalDomain) : domain;\n\n if (newDomain && props.zoomDimension) {\n // if zooming is restricted to a dimension, don\'t squash changes to zoomDomain in other dim\n newDomain = victory_zoom_container_objectSpread({}, zoomDomain, victory_zoom_container_defineProperty({}, props.zoomDimension, newDomain[props.zoomDimension]));\n } // don\'t downsample stacked data\n\n\n var newProps = isDataComponent && role !== "stack" ? {\n domain: newDomain,\n data: _this.downsampleZoomData(props, child, newDomain)\n } : {\n domain: newDomain\n };\n return react.cloneElement(child, defaults_default()(newProps, child.props));\n });\n } // Overrides method in VictoryContainer\n\n }, {\n key: "getChildren",\n value: function getChildren(props) {\n var children = this.modifyChildren(props);\n return this.clipDataComponents(children, props);\n }\n }]);\n\n return VictoryZoomContainer;\n }(base), Object.defineProperty(_class, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryZoomContainer"\n }), Object.defineProperty(_class, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_zoom_container_objectSpread({}, VictoryContainer.propTypes, {\n allowPan: (prop_types_default()).bool,\n allowZoom: (prop_types_default()).bool,\n clipContainerComponent: (prop_types_default()).element.isRequired,\n disable: (prop_types_default()).bool,\n downsample: prop_types_default().oneOfType([(prop_types_default()).bool, (prop_types_default()).number]),\n minimumZoom: prop_types_default().shape({\n x: (prop_types_default()).number,\n y: (prop_types_default()).number\n }),\n onZoomDomainChange: (prop_types_default()).func,\n zoomDimension: prop_types_default().oneOf(["x", "y"]),\n zoomDomain: prop_types_default().shape({\n x: domain,\n y: domain\n })\n })\n }), Object.defineProperty(_class, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_zoom_container_objectSpread({}, VictoryContainer.defaultProps, {\n clipContainerComponent: react.createElement(VictoryClipContainer, null),\n allowPan: true,\n allowZoom: true,\n zoomActive: false\n })\n }), Object.defineProperty(_class, "defaultEvents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return [{\n target: "parent",\n eventHandlers: victory_zoom_container_objectSpread({\n onMouseDown: function (evt, targetProps) {\n return props.disable ? {} : zoom_helpers.onMouseDown(evt, targetProps);\n },\n onTouchStart: function (evt, targetProps) {\n return props.disable ? {} : zoom_helpers.onMouseDown(evt, targetProps);\n },\n onMouseUp: function (evt, targetProps) {\n return props.disable ? {} : zoom_helpers.onMouseUp(evt, targetProps);\n },\n onTouchEnd: function (evt, targetProps) {\n return props.disable ? {} : zoom_helpers.onMouseUp(evt, targetProps);\n },\n onMouseLeave: function (evt, targetProps) {\n return props.disable ? {} : zoom_helpers.onMouseLeave(evt, targetProps);\n },\n onTouchCancel: function (evt, targetProps) {\n return props.disable ? {} : zoom_helpers.onMouseLeave(evt, targetProps);\n },\n // eslint-disable-next-line max-params\n onMouseMove: function (evt, targetProps, eventKey, ctx) {\n if (props.disable) {\n return {};\n }\n\n return zoom_helpers.onMouseMove(evt, targetProps, eventKey, ctx);\n },\n // eslint-disable-next-line max-params\n onTouchMove: function (evt, targetProps, eventKey, ctx) {\n if (props.disable) {\n return {};\n }\n\n evt.preventDefault();\n return zoom_helpers.onMouseMove(evt, targetProps, eventKey, ctx);\n }\n }, props.disable || !props.allowZoom ? {} : {\n onWheel: zoom_helpers.onWheel\n })\n }];\n }\n }), _temp;\n};\n/* harmony default export */ const victory_zoom_container = (zoomContainerMixin(VictoryContainer));\n;// CONCATENATED MODULE: ./node_modules/victory-selection-container/es/selection-helpers.js\n\n\n\n\n\n\nfunction selection_helpers_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { selection_helpers_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction selection_helpers_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction selection_helpers_toConsumableArray(arr) { return selection_helpers_arrayWithoutHoles(arr) || selection_helpers_iterableToArray(arr) || selection_helpers_nonIterableSpread(); }\n\nfunction selection_helpers_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction selection_helpers_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction selection_helpers_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\n\n\nvar SelectionHelpers = {\n getDimension: function (props) {\n var horizontal = props.horizontal,\n selectionDimension = props.selectionDimension;\n\n if (!horizontal || !selectionDimension) {\n return selectionDimension;\n }\n\n return selectionDimension === "x" ? "y" : "x";\n },\n getDatasets: function (props) {\n if (props.data) {\n return [{\n data: props.data\n }];\n }\n\n var getData = function (childProps) {\n var data = data_getData(childProps);\n return Array.isArray(data) && data.length > 0 ? data : undefined;\n };\n\n var iteratee = function (child, childName, parent) {\n var blacklist = props.selectionBlacklist || [];\n\n if (!data_isDataComponent(child) || includes_default()(blacklist, childName)) {\n return null;\n } else if (child.type && isFunction_default()(child.type.getData)) {\n child = parent ? react.cloneElement(child, parent.props) : child;\n var childData = child.props && child.type.getData(child.props);\n return childData ? {\n childName: childName,\n data: childData\n } : null;\n } else {\n var _childData = getData(child.props);\n\n return _childData ? {\n childName: childName,\n data: _childData\n } : null;\n }\n };\n\n return reduceChildren(react.Children.toArray(props.children), iteratee, props);\n },\n filterDatasets: function (props, datasets, bounds) {\n var _this = this;\n\n var filtered = datasets.reduce(function (memo, dataset) {\n var selectedData = _this.getSelectedData(props, dataset.data, bounds);\n\n memo = selectedData ? memo.concat({\n childName: dataset.childName,\n eventKey: selectedData.eventKey,\n data: selectedData.data\n }) : memo;\n return memo;\n }, []);\n return filtered.length ? filtered : null;\n },\n getSelectedData: function (props, dataset) {\n var x1 = props.x1,\n y1 = props.y1,\n x2 = props.x2,\n y2 = props.y2;\n\n var withinBounds = function (d) {\n var scaledPoint = scalePoint(props, d);\n return scaledPoint.x >= Math.min(x1, x2) && scaledPoint.x <= Math.max(x1, x2) && scaledPoint.y >= Math.min(y1, y2) && scaledPoint.y <= Math.max(y1, y2);\n };\n\n var eventKey = [];\n var data = [];\n var count = 0;\n\n for (var index = 0, len = dataset.length; index < len; index++) {\n var datum = dataset[index];\n\n if (withinBounds(datum)) {\n data[count] = datum;\n eventKey[count] = datum.eventKey === undefined ? index : datum.eventKey;\n count++;\n }\n }\n\n return count > 0 ? {\n eventKey: eventKey,\n data: data\n } : null;\n },\n // eslint-disable-next-line complexity, max-statements\n onMouseDown: function (evt, targetProps) {\n evt.preventDefault();\n var activateSelectedData = targetProps.activateSelectedData,\n allowSelection = targetProps.allowSelection,\n polar = targetProps.polar,\n selectedData = targetProps.selectedData;\n\n if (!allowSelection) {\n return {};\n }\n\n var dimension = this.getDimension(targetProps);\n var parentSVG = targetProps.parentSVG || getParentSVG(evt);\n\n var _Selection$getSVGEven = getSVGEventCoordinates(evt, parentSVG),\n x = _Selection$getSVGEven.x,\n y = _Selection$getSVGEven.y;\n\n var x1 = polar || dimension !== "y" ? x : getDomainCoordinates(targetProps).x[0];\n var y1 = polar || dimension !== "x" ? y : getDomainCoordinates(targetProps).y[0];\n var x2 = polar || dimension !== "y" ? x : getDomainCoordinates(targetProps).x[1];\n var y2 = polar || dimension !== "x" ? y : getDomainCoordinates(targetProps).y[1];\n var mutatedProps = {\n x1: x1,\n y1: y1,\n select: true,\n x2: x2,\n y2: y2,\n parentSVG: parentSVG\n };\n\n if (selectedData && isFunction_default()(targetProps.onSelectionCleared)) {\n targetProps.onSelectionCleared(defaults_default()({}, mutatedProps, targetProps));\n }\n\n var parentMutation = [{\n target: "parent",\n mutation: function () {\n return mutatedProps;\n }\n }];\n var dataMutation = selectedData && activateSelectedData ? selectedData.map(function (d) {\n return {\n childName: d.childName,\n eventKey: d.eventKey,\n target: "data",\n mutation: function () {\n return null;\n }\n };\n }) : [];\n return parentMutation.concat.apply(parentMutation, selection_helpers_toConsumableArray(dataMutation));\n },\n onMouseMove: function (evt, targetProps) {\n var allowSelection = targetProps.allowSelection,\n select = targetProps.select,\n polar = targetProps.polar;\n var dimension = this.getDimension(targetProps);\n\n if (!allowSelection || !select) {\n return null;\n } else {\n var parentSVG = targetProps.parentSVG || getParentSVG(evt);\n\n var _Selection$getSVGEven2 = getSVGEventCoordinates(evt, parentSVG),\n x = _Selection$getSVGEven2.x,\n y = _Selection$getSVGEven2.y;\n\n var x2 = polar || dimension !== "y" ? x : getDomainCoordinates(targetProps).x[1];\n var y2 = polar || dimension !== "x" ? y : getDomainCoordinates(targetProps).y[1];\n return {\n target: "parent",\n mutation: function () {\n return {\n x2: x2,\n y2: y2,\n parentSVG: parentSVG\n };\n }\n };\n }\n },\n onMouseUp: function (evt, targetProps) {\n var activateSelectedData = targetProps.activateSelectedData,\n allowSelection = targetProps.allowSelection,\n x2 = targetProps.x2,\n y2 = targetProps.y2;\n\n if (!allowSelection) {\n return null;\n }\n\n if (!x2 || !y2) {\n return [{\n target: "parent",\n mutation: function () {\n return {\n select: false,\n x1: null,\n x2: null,\n y1: null,\n y2: null\n };\n }\n }];\n }\n\n var datasets = this.getDatasets(targetProps);\n var bounds = getBounds(targetProps);\n var selectedData = this.filterDatasets(targetProps, datasets, bounds);\n var mutatedProps = {\n selectedData: selectedData,\n datasets: datasets,\n select: false,\n x1: null,\n x2: null,\n y1: null,\n y2: null\n };\n var callbackMutation = selectedData && isFunction_default()(targetProps.onSelection) ? targetProps.onSelection(selectedData, bounds, defaults_default()({}, mutatedProps, targetProps)) : {};\n var parentMutation = [{\n target: "parent",\n mutation: function () {\n return mutatedProps;\n }\n }];\n var dataMutation = selectedData && activateSelectedData ? selectedData.map(function (d) {\n return {\n childName: d.childName,\n eventKey: d.eventKey,\n target: "data",\n mutation: function () {\n return assign_default()({\n active: true\n }, callbackMutation);\n }\n };\n }) : [];\n return parentMutation.concat(dataMutation);\n }\n};\n/* harmony default export */ const selection_helpers = (selection_helpers_objectSpread({}, SelectionHelpers, {\n onMouseDown: SelectionHelpers.onMouseDown.bind(SelectionHelpers),\n onMouseUp: SelectionHelpers.onMouseUp.bind(SelectionHelpers),\n onMouseMove: throttle_default()(SelectionHelpers.onMouseMove.bind(SelectionHelpers), 16, // eslint-disable-line no-magic-numbers\n {\n leading: true,\n trailing: false\n })\n}));\n;// CONCATENATED MODULE: ./node_modules/victory-selection-container/es/victory-selection-container.js\nfunction victory_selection_container_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_selection_container_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_selection_container_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction victory_selection_container_toConsumableArray(arr) { return victory_selection_container_arrayWithoutHoles(arr) || victory_selection_container_iterableToArray(arr) || victory_selection_container_nonIterableSpread(); }\n\nfunction victory_selection_container_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_selection_container_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_selection_container_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction victory_selection_container_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_selection_container_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_selection_container_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_selection_container_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_selection_container_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_selection_container_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_selection_container_assertThisInitialized(self); }\n\nfunction victory_selection_container_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_selection_container_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\nvar selectionContainerMixin = function (base) {\n var _class, _temp;\n\n return _temp = _class =\n /*#__PURE__*/\n function (_base) {\n victory_selection_container_inherits(VictorySelectionContainer, _base);\n\n function VictorySelectionContainer() {\n victory_selection_container_classCallCheck(this, VictorySelectionContainer);\n\n return victory_selection_container_possibleConstructorReturn(this, (VictorySelectionContainer.__proto__ || Object.getPrototypeOf(VictorySelectionContainer)).apply(this, arguments));\n }\n\n victory_selection_container_createClass(VictorySelectionContainer, [{\n key: "getRect",\n value: function getRect(props) {\n var x1 = props.x1,\n x2 = props.x2,\n y1 = props.y1,\n y2 = props.y2,\n selectionStyle = props.selectionStyle,\n selectionComponent = props.selectionComponent,\n name = props.name;\n var width = Math.abs(x2 - x1) || 1;\n var height = Math.abs(y2 - y1) || 1;\n var x = Math.min(x1, x2);\n var y = Math.min(y1, y2);\n return y2 && x2 && x1 && y1 ? react.cloneElement(selectionComponent, {\n key: "".concat(name, "-selection"),\n x: x,\n y: y,\n width: width,\n height: height,\n style: selectionStyle\n }) : null;\n } // Overrides method in VictoryContainer\n\n }, {\n key: "getChildren",\n value: function getChildren(props) {\n return victory_selection_container_toConsumableArray(react.Children.toArray(props.children)).concat([this.getRect(props)]);\n }\n }]);\n\n return VictorySelectionContainer;\n }(base), Object.defineProperty(_class, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictorySelectionContainer"\n }), Object.defineProperty(_class, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_selection_container_objectSpread({}, VictoryContainer.propTypes, {\n activateSelectedData: (prop_types_default()).bool,\n allowSelection: (prop_types_default()).bool,\n disable: (prop_types_default()).bool,\n onSelection: (prop_types_default()).func,\n onSelectionCleared: (prop_types_default()).func,\n selectionBlacklist: prop_types_default().arrayOf((prop_types_default()).string),\n selectionComponent: (prop_types_default()).element,\n selectionDimension: prop_types_default().oneOf(["x", "y"]),\n selectionStyle: (prop_types_default()).object\n })\n }), Object.defineProperty(_class, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_selection_container_objectSpread({}, VictoryContainer.defaultProps, {\n activateSelectedData: true,\n allowSelection: true,\n selectionComponent: react.createElement(rect, null),\n selectionStyle: {\n stroke: "transparent",\n fill: "black",\n fillOpacity: 0.1\n }\n })\n }), Object.defineProperty(_class, "defaultEvents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return [{\n target: "parent",\n eventHandlers: {\n onMouseDown: function (evt, targetProps) {\n return props.disable ? {} : selection_helpers.onMouseDown(evt, targetProps);\n },\n onTouchStart: function (evt, targetProps) {\n return props.disable ? {} : selection_helpers.onMouseDown(evt, targetProps);\n },\n onMouseMove: function (evt, targetProps) {\n return props.disable ? {} : selection_helpers.onMouseMove(evt, targetProps);\n },\n onTouchMove: function (evt, targetProps) {\n return props.disable ? {} : selection_helpers.onMouseMove(evt, targetProps);\n },\n onMouseUp: function (evt, targetProps) {\n return props.disable ? {} : selection_helpers.onMouseUp(evt, targetProps);\n },\n onTouchEnd: function (evt, targetProps) {\n return props.disable ? {} : selection_helpers.onMouseUp(evt, targetProps);\n }\n }\n }];\n }\n }), _temp;\n};\n/* harmony default export */ const victory_selection_container = (selectionContainerMixin(VictoryContainer));\n;// CONCATENATED MODULE: ./node_modules/victory-brush-container/es/brush-helpers.js\n\n\n\n\n\n\nfunction brush_helpers_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { brush_helpers_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction brush_helpers_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction brush_helpers_toConsumableArray(arr) { return brush_helpers_arrayWithoutHoles(arr) || brush_helpers_iterableToArray(arr) || brush_helpers_nonIterableSpread(); }\n\nfunction brush_helpers_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction brush_helpers_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction brush_helpers_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\n\n\nvar Helpers = {\n getDimension: function (props) {\n var horizontal = props.horizontal,\n brushDimension = props.brushDimension;\n\n if (!horizontal || !brushDimension) {\n return brushDimension;\n }\n\n return brushDimension === "x" ? "y" : "x";\n },\n withinBounds: function (point, bounds, padding) {\n var _mapValues2 = mapValues_default()(bounds, Number),\n x1 = _mapValues2.x1,\n x2 = _mapValues2.x2,\n y1 = _mapValues2.y1,\n y2 = _mapValues2.y2;\n\n var _mapValues3 = mapValues_default()(point, Number),\n x = _mapValues3.x,\n y = _mapValues3.y;\n\n padding = padding ? padding / 2 : 0;\n return x + padding >= Math.min(x1, x2) && x - padding <= Math.max(x1, x2) && y + padding >= Math.min(y1, y2) && y - padding <= Math.max(y1, y2);\n },\n getDomainBox: function (props, fullDomain, selectedDomain) {\n var brushDimension = this.getDimension(props);\n fullDomain = defaults_default()({}, fullDomain, props.domain);\n selectedDomain = defaults_default()({}, selectedDomain, fullDomain);\n var fullCoords = getDomainCoordinates(props, fullDomain);\n var selectedCoords = getDomainCoordinates(props, selectedDomain);\n return {\n x1: brushDimension !== "y" ? Math.min.apply(Math, brush_helpers_toConsumableArray(selectedCoords.x)) : Math.min.apply(Math, brush_helpers_toConsumableArray(fullCoords.x)),\n x2: brushDimension !== "y" ? Math.max.apply(Math, brush_helpers_toConsumableArray(selectedCoords.x)) : Math.max.apply(Math, brush_helpers_toConsumableArray(fullCoords.x)),\n y1: brushDimension !== "x" ? Math.min.apply(Math, brush_helpers_toConsumableArray(selectedCoords.y)) : Math.min.apply(Math, brush_helpers_toConsumableArray(fullCoords.y)),\n y2: brushDimension !== "x" ? Math.max.apply(Math, brush_helpers_toConsumableArray(selectedCoords.y)) : Math.max.apply(Math, brush_helpers_toConsumableArray(fullCoords.y))\n };\n },\n getHandles: function (props, domainBox) {\n var brushDimension = this.getDimension(props);\n var x1 = domainBox.x1,\n x2 = domainBox.x2,\n y1 = domainBox.y1,\n y2 = domainBox.y2;\n var minX = Math.min(x1, x2);\n var maxX = Math.max(x1, x2);\n var minY = Math.min(y1, y2);\n var maxY = Math.max(y1, y2);\n var handleWidth = props.handleWidth / 2;\n return {\n left: brushDimension !== "y" && {\n x1: minX - handleWidth,\n x2: minX + handleWidth,\n y1: y1,\n y2: y2\n },\n right: brushDimension !== "y" && {\n x1: maxX - handleWidth,\n x2: maxX + handleWidth,\n y1: y1,\n y2: y2\n },\n top: brushDimension !== "x" && {\n x1: x1,\n x2: x2,\n y1: minY - handleWidth,\n y2: minY + handleWidth\n },\n bottom: brushDimension !== "x" && {\n x1: x1,\n x2: x2,\n y1: maxY - handleWidth,\n y2: maxY + handleWidth\n }\n };\n },\n getActiveHandles: function (point, props, domainBox) {\n var _this = this;\n\n var handles = this.getHandles(props, domainBox);\n var activeHandles = ["top", "bottom", "left", "right"].reduce(function (memo, opt) {\n memo = handles[opt] && _this.withinBounds(point, handles[opt]) ? memo.concat(opt) : memo;\n return memo;\n }, []);\n return activeHandles.length && activeHandles;\n },\n getResizeMutation: function (box, handles) {\n var x1 = box.x1,\n y1 = box.y1,\n x2 = box.x2,\n y2 = box.y2;\n var mutations = {\n left: {\n x1: Math.max(x1, x2),\n x2: Math.min(x1, x2),\n y1: y1,\n y2: y2\n },\n right: {\n x1: Math.min(x1, x2),\n x2: Math.max(x1, x2),\n y1: y1,\n y2: y2\n },\n top: {\n y1: Math.max(y1, y2),\n y2: Math.min(y1, y2),\n x1: x1,\n x2: x2\n },\n bottom: {\n y1: Math.min(y1, y2),\n y2: Math.max(y1, y2),\n x1: x1,\n x2: x2\n }\n };\n return handles.reduce(function (memo, current) {\n return assign_default()(memo, mutations[current]);\n }, {});\n },\n getMinimumDomain: function () {\n return {\n x: [0, 1 / Number.MAX_SAFE_INTEGER],\n y: [0, 1 / Number.MAX_SAFE_INTEGER]\n };\n },\n getDefaultBrushArea: function (targetProps, cachedDomain, evt) {\n var domain = targetProps.domain,\n fullDomain = targetProps.fullDomain,\n scale = targetProps.scale,\n horizontal = targetProps.horizontal,\n allowResize = targetProps.allowResize;\n var defaultBrushArea = !allowResize && !targetProps.defaultBrushArea ? "move" : targetProps.defaultBrushArea;\n\n if (defaultBrushArea === "none") {\n return this.getMinimumDomain();\n } else if (defaultBrushArea === "disable") {\n return cachedDomain;\n } else if (defaultBrushArea === "move") {\n var brushBox = this.getDomainBox(targetProps, fullDomain, cachedDomain);\n var parentSVG = targetProps.parentSVG || getParentSVG(evt);\n var pannedBox = this.panBox(brush_helpers_objectSpread({}, targetProps, brushBox, {\n brushDomain: cachedDomain,\n startX: (brushBox.x1 + brushBox.x2) / 2,\n startY: (brushBox.y1 + brushBox.y2) / 2\n }), getSVGEventCoordinates(evt, parentSVG));\n var fullDomainBox = targetProps.fullDomainBox || this.getDomainBox(targetProps, fullDomain);\n var constrainedBox = this.constrainBox(pannedBox, fullDomainBox);\n return getBounds(brush_helpers_objectSpread({}, constrainedBox, {\n scale: scale,\n horizontal: horizontal\n }));\n } else {\n return domain;\n }\n },\n getSelectionMutation: function (point, box, brushDimension) {\n var x = point.x,\n y = point.y;\n var x1 = box.x1,\n x2 = box.x2,\n y1 = box.y1,\n y2 = box.y2;\n return {\n x1: brushDimension !== "y" ? x : x1,\n y1: brushDimension !== "x" ? y : y1,\n x2: brushDimension !== "y" ? x : x2,\n y2: brushDimension !== "x" ? y : y2\n };\n },\n panBox: function (props, point) {\n var domain = props.domain,\n startX = props.startX,\n startY = props.startY;\n var brushDimension = this.getDimension(props);\n\n var brushDomain = defaults_default()({}, props.brushDomain, domain);\n\n var fullDomain = defaults_default()({}, props.fullDomain, domain);\n\n var _ref = props.x1 ? props : this.getDomainBox(props, fullDomain, brushDomain),\n x1 = _ref.x1,\n x2 = _ref.x2,\n y1 = _ref.y1,\n y2 = _ref.y2;\n\n var x = point.x,\n y = point.y;\n var delta = {\n x: startX ? startX - x : 0,\n y: startY ? startY - y : 0\n };\n return {\n x1: brushDimension !== "y" ? Math.min(x1, x2) - delta.x : Math.min(x1, x2),\n x2: brushDimension !== "y" ? Math.max(x1, x2) - delta.x : Math.max(x1, x2),\n y1: brushDimension !== "x" ? Math.min(y1, y2) - delta.y : Math.min(y1, y2),\n y2: brushDimension !== "x" ? Math.max(y1, y2) - delta.y : Math.max(y1, y2)\n };\n },\n constrainBox: function (box, fullDomainBox) {\n var _mapValues4 = mapValues_default()(fullDomainBox, Number),\n x1 = _mapValues4.x1,\n y1 = _mapValues4.y1,\n x2 = _mapValues4.x2,\n y2 = _mapValues4.y2;\n\n return {\n x1: box.x2 > x2 ? x2 - Math.abs(box.x2 - box.x1) : Math.max(box.x1, x1),\n y1: box.y2 > y2 ? y2 - Math.abs(box.y2 - box.y1) : Math.max(box.y1, y1),\n x2: box.x1 < x1 ? x1 + Math.abs(box.x2 - box.x1) : Math.min(box.x2, x2),\n y2: box.y1 < y1 ? y1 + Math.abs(box.y2 - box.y1) : Math.min(box.y2, y2)\n };\n },\n constrainPoint: function (point, fullDomainBox) {\n var _mapValues5 = mapValues_default()(fullDomainBox, Number),\n x1 = _mapValues5.x1,\n y1 = _mapValues5.y1,\n x2 = _mapValues5.x2,\n y2 = _mapValues5.y2;\n\n return {\n x: Math.min(Math.max(point.x, x1), x2),\n y: Math.min(Math.max(point.y, y1), y2)\n };\n },\n hasMoved: function (props) {\n var x1 = props.x1,\n x2 = props.x2,\n y1 = props.y1,\n y2 = props.y2,\n mouseMoveThreshold = props.mouseMoveThreshold;\n var brushDimension = this.getDimension(props);\n var xMoved = Math.abs(x1 - x2) >= mouseMoveThreshold;\n var yMoved = Math.abs(y1 - y2) >= mouseMoveThreshold;\n\n switch (brushDimension) {\n case "x":\n return xMoved;\n\n case "y":\n return yMoved;\n\n default:\n return xMoved || yMoved;\n }\n },\n // eslint-disable-next-line max-statements, complexity\n onMouseDown: function (evt, targetProps) {\n var _this2 = this;\n\n evt.preventDefault();\n var handleWidth = targetProps.handleWidth,\n cachedBrushDomain = targetProps.cachedBrushDomain,\n domain = targetProps.domain,\n allowResize = targetProps.allowResize,\n allowDrag = targetProps.allowDrag,\n allowDraw = targetProps.allowDraw;\n var brushDimension = this.getDimension(targetProps);\n var defaultBrushArea = !allowResize && !targetProps.defaultBrushArea ? "move" : targetProps.defaultBrushArea; // Don\'t trigger events for static brushes\n\n if (!allowResize && !allowDrag) {\n return {};\n }\n\n var fullDomainBox = targetProps.fullDomainBox || this.getDomainBox(targetProps, domain);\n var parentSVG = targetProps.parentSVG || getParentSVG(evt);\n\n var _Selection$getSVGEven = getSVGEventCoordinates(evt, parentSVG),\n x = _Selection$getSVGEven.x,\n y = _Selection$getSVGEven.y; // Ignore events that occur outside of the maximum domain region\n\n\n if (!this.withinBounds({\n x: x,\n y: y\n }, fullDomainBox, handleWidth)) {\n return {};\n }\n\n var brushDomain = defaults_default()({}, targetProps.brushDomain, domain);\n\n var currentDomain = react_fast_compare_default()(brushDomain, cachedBrushDomain) ? targetProps.currentDomain || brushDomain || domain : brushDomain || domain;\n var domainBox = this.getDomainBox(targetProps, domain, currentDomain);\n var activeHandles = allowResize && this.getActiveHandles({\n x: x,\n y: y\n }, targetProps, domainBox); // If the event occurs in any of the handle regions, start a resize\n\n if (activeHandles) {\n return [{\n target: "parent",\n mutation: function () {\n return brush_helpers_objectSpread({\n isSelecting: true,\n domainBox: domainBox,\n fullDomainBox: fullDomainBox,\n cachedBrushDomain: brushDomain,\n currentDomain: currentDomain,\n parentSVG: parentSVG\n }, _this2.getResizeMutation(domainBox, activeHandles));\n }\n }];\n } else if (this.withinBounds({\n x: x,\n y: y\n }, domainBox) && !react_fast_compare_default()(domain, currentDomain)) {\n // if the event occurs within a selected region start a panning event, unless the whole\n // domain is selected\n return [{\n target: "parent",\n mutation: function () {\n return brush_helpers_objectSpread({\n isPanning: allowDrag,\n startX: x,\n startY: y,\n domainBox: domainBox,\n fullDomainBox: fullDomainBox,\n currentDomain: currentDomain,\n cachedBrushDomain: brushDomain,\n parentSVG: parentSVG\n }, domainBox);\n }\n }];\n } else {\n // if the event occurs outside the region, or if the whole domain is selected,\n // start a new selection\n return allowDraw ? [{\n target: "parent",\n mutation: function () {\n return brush_helpers_objectSpread({\n isSelecting: allowResize || defaultBrushArea === "move",\n domainBox: domainBox,\n fullDomainBox: fullDomainBox,\n parentSVG: parentSVG,\n cachedBrushDomain: brushDomain,\n cachedCurrentDomain: currentDomain,\n currentDomain: _this2.getMinimumDomain()\n }, _this2.getSelectionMutation({\n x: x,\n y: y\n }, domainBox, brushDimension));\n }\n }] : {};\n }\n },\n // eslint-disable-next-line max-statements, complexity\n onGlobalMouseMove: function (evt, targetProps) {\n var scale = targetProps.scale,\n isPanning = targetProps.isPanning,\n isSelecting = targetProps.isSelecting,\n fullDomainBox = targetProps.fullDomainBox,\n onBrushDomainChange = targetProps.onBrushDomainChange,\n allowResize = targetProps.allowResize,\n allowDrag = targetProps.allowDrag,\n horizontal = targetProps.horizontal,\n mouseMoveThreshold = targetProps.mouseMoveThreshold,\n parentSVG = targetProps.parentSVG;\n var brushDimension = this.getDimension(targetProps);\n\n var _Selection$getSVGEven2 = getSVGEventCoordinates(evt, parentSVG),\n x = _Selection$getSVGEven2.x,\n y = _Selection$getSVGEven2.y;\n\n if (!allowResize && !allowDrag || mouseMoveThreshold > 0 && !this.hasMoved(brush_helpers_objectSpread({}, targetProps, {\n x2: x,\n y2: y\n }))) {\n return {};\n }\n\n if (allowDrag && isPanning) {\n var startX = targetProps.startX,\n startY = targetProps.startY;\n var pannedBox = this.panBox(targetProps, {\n x: x,\n y: y\n });\n var constrainedBox = this.constrainBox(pannedBox, fullDomainBox);\n var currentDomain = getBounds(brush_helpers_objectSpread({}, constrainedBox, {\n scale: scale,\n horizontal: horizontal\n }));\n\n var mutatedProps = brush_helpers_objectSpread({\n currentDomain: currentDomain,\n parentSVG: parentSVG,\n startX: pannedBox.x2 >= fullDomainBox.x2 || pannedBox.x1 <= fullDomainBox.x1 ? startX : x,\n startY: pannedBox.y2 >= fullDomainBox.y2 || pannedBox.y1 <= fullDomainBox.y1 ? startY : y\n }, constrainedBox);\n\n if (isFunction_default()(onBrushDomainChange)) {\n onBrushDomainChange(currentDomain, defaults_default()({}, mutatedProps, targetProps));\n }\n\n return [{\n target: "parent",\n mutation: function () {\n return mutatedProps;\n }\n }];\n } else if (allowResize && isSelecting) {\n var _constrainPoint = this.constrainPoint({\n x: brushDimension !== "y" ? x : targetProps.x2,\n y: brushDimension !== "x" ? y : targetProps.y2\n }, fullDomainBox),\n x2 = _constrainPoint.x,\n y2 = _constrainPoint.y;\n\n var _currentDomain = getBounds({\n x2: x2,\n y2: y2,\n x1: targetProps.x1,\n y1: targetProps.y1,\n scale: scale,\n horizontal: horizontal\n });\n\n var _mutatedProps = {\n x2: x2,\n y2: y2,\n currentDomain: _currentDomain,\n parentSVG: parentSVG\n };\n\n if (isFunction_default()(onBrushDomainChange)) {\n onBrushDomainChange(_currentDomain, defaults_default()({}, _mutatedProps, targetProps));\n }\n\n return [{\n target: "parent",\n mutation: function () {\n return _mutatedProps;\n }\n }];\n }\n\n return {};\n },\n // eslint-disable-next-line complexity\n onGlobalMouseUp: function (evt, targetProps) {\n // if a panning or selection has not been started, ignore the event\n if (!targetProps.isPanning && !targetProps.isSelecting) {\n return {};\n } // eslint-disable-line max-statements, complexity\n\n\n var x1 = targetProps.x1,\n y1 = targetProps.y1,\n x2 = targetProps.x2,\n y2 = targetProps.y2,\n isPanning = targetProps.isPanning,\n isSelecting = targetProps.isSelecting,\n onBrushDomainChange = targetProps.onBrushDomainChange,\n onBrushDomainChangeEnd = targetProps.onBrushDomainChangeEnd,\n onBrushCleared = targetProps.onBrushCleared,\n currentDomain = targetProps.currentDomain,\n allowResize = targetProps.allowResize,\n allowDrag = targetProps.allowDrag;\n var defaultBrushArea = !allowResize && !targetProps.defaultBrushArea ? "move" : targetProps.defaultBrushArea;\n var defaultBrushHasArea = defaultBrushArea !== undefined && defaultBrushArea !== "none";\n var mutatedProps = {\n isPanning: false,\n isSelecting: false\n }; // if the mouse hasn\'t moved since a mouseDown event, select the default brush area\n\n if ((allowResize || defaultBrushHasArea) && (x1 === x2 || y1 === y2)) {\n var cachedDomain = targetProps.cachedCurrentDomain || currentDomain;\n var defaultDomain = this.getDefaultBrushArea(targetProps, cachedDomain, evt);\n mutatedProps.currentDomain = defaultDomain;\n\n if (isFunction_default()(onBrushDomainChange)) {\n onBrushDomainChange(defaultDomain, defaults_default()({}, mutatedProps, targetProps));\n }\n\n if (isFunction_default()(onBrushDomainChangeEnd)) {\n onBrushDomainChangeEnd(defaultDomain, defaults_default()({}, mutatedProps, targetProps));\n }\n\n if (isFunction_default()(onBrushCleared)) {\n onBrushCleared(defaultDomain, defaults_default()({}, mutatedProps, targetProps));\n }\n } else if (allowDrag && isPanning || allowResize && isSelecting) {\n if (isFunction_default()(onBrushDomainChangeEnd)) {\n onBrushDomainChangeEnd(currentDomain, defaults_default()({}, mutatedProps, targetProps));\n }\n }\n\n return [{\n target: "parent",\n mutation: function () {\n return mutatedProps;\n }\n }];\n }\n};\n/* harmony default export */ const brush_helpers = (brush_helpers_objectSpread({}, Helpers, {\n onMouseDown: Helpers.onMouseDown.bind(Helpers),\n onGlobalMouseUp: Helpers.onGlobalMouseUp.bind(Helpers),\n onGlobalMouseMove: throttle_default()(Helpers.onGlobalMouseMove.bind(Helpers), 16, // eslint-disable-line no-magic-numbers\n {\n leading: true,\n trailing: false\n })\n}));\n;// CONCATENATED MODULE: ./node_modules/victory-brush-container/es/victory-brush-container.js\n\n\n\nfunction victory_brush_container_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { victory_brush_container_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction victory_brush_container_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction victory_brush_container_toConsumableArray(arr) { return victory_brush_container_arrayWithoutHoles(arr) || victory_brush_container_iterableToArray(arr) || victory_brush_container_nonIterableSpread(); }\n\nfunction victory_brush_container_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction victory_brush_container_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction victory_brush_container_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction victory_brush_container_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction victory_brush_container_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction victory_brush_container_createClass(Constructor, protoProps, staticProps) { if (protoProps) victory_brush_container_defineProperties(Constructor.prototype, protoProps); if (staticProps) victory_brush_container_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction victory_brush_container_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return victory_brush_container_assertThisInitialized(self); }\n\nfunction victory_brush_container_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction victory_brush_container_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\n\nvar brushContainerMixin = function (base) {\n var _class, _temp;\n\n return _temp = _class =\n /*#__PURE__*/\n function (_base) {\n victory_brush_container_inherits(VictoryBrushContainer, _base);\n\n function VictoryBrushContainer() {\n victory_brush_container_classCallCheck(this, VictoryBrushContainer);\n\n return victory_brush_container_possibleConstructorReturn(this, (VictoryBrushContainer.__proto__ || Object.getPrototypeOf(VictoryBrushContainer)).apply(this, arguments));\n }\n\n victory_brush_container_createClass(VictoryBrushContainer, [{\n key: "getSelectBox",\n value: function getSelectBox(props, coordinates) {\n var x = coordinates.x,\n y = coordinates.y;\n var brushStyle = props.brushStyle,\n brushComponent = props.brushComponent,\n name = props.name;\n var brushComponentStyle = brushComponent.props && brushComponent.props.style;\n var cursor = !props.allowDrag && !props.allowResize ? "auto" : "move";\n return x[0] !== x[1] && y[0] !== y[1] ? react.cloneElement(brushComponent, {\n key: "".concat(name, "-brush"),\n width: Math.abs(x[1] - x[0]) || 1,\n height: Math.abs(y[1] - y[0]) || 1,\n x: Math.min(x[0], x[1]),\n y: Math.min(y[0], y[1]),\n cursor: cursor,\n style: defaults_default()({}, brushComponentStyle, brushStyle)\n }) : null;\n }\n }, {\n key: "getCursorPointers",\n value: function getCursorPointers(props) {\n var cursors = {\n yProps: "ns-resize",\n xProps: "ew-resize"\n };\n\n if (!props.allowResize && props.allowDrag) {\n cursors.xProps = "move";\n cursors.yProps = "move";\n } else if (!props.allowResize && !props.allowDrag) {\n cursors.xProps = "auto";\n cursors.yProps = "auto";\n }\n\n return cursors;\n }\n }, {\n key: "getHandles",\n value: function getHandles(props, domain) {\n var handleWidth = props.handleWidth,\n handleStyle = props.handleStyle,\n handleComponent = props.handleComponent,\n name = props.name;\n var domainBox = brush_helpers.getDomainBox(props, domain);\n var x1 = domainBox.x1,\n x2 = domainBox.x2,\n y1 = domainBox.y1,\n y2 = domainBox.y2;\n\n var _BrushHelpers$getHand = brush_helpers.getHandles(props, domainBox),\n top = _BrushHelpers$getHand.top,\n bottom = _BrushHelpers$getHand.bottom,\n left = _BrushHelpers$getHand.left,\n right = _BrushHelpers$getHand.right;\n\n var width = Math.abs(x2 - x1) || 1;\n var height = Math.abs(y2 - y1) || 1;\n var handleComponentStyle = handleComponent.props && handleComponent.props.style || {};\n\n var style = defaults_default()({}, handleComponentStyle, handleStyle);\n\n var cursors = this.getCursorPointers(props);\n var yProps = {\n style: style,\n width: width,\n height: handleWidth,\n cursor: cursors.yProps\n };\n var xProps = {\n style: style,\n width: handleWidth,\n height: height,\n cursor: cursors.xProps\n };\n var handleProps = {\n top: top && assign_default()({\n x: top.x1,\n y: top.y1\n }, yProps),\n bottom: bottom && assign_default()({\n x: bottom.x1,\n y: bottom.y1\n }, yProps),\n left: left && assign_default()({\n y: left.y1,\n x: left.x1\n }, xProps),\n right: right && assign_default()({\n y: right.y1,\n x: right.x1\n }, xProps)\n };\n var handles = ["top", "bottom", "left", "right"].reduce(function (memo, curr) {\n memo = handleProps[curr] ? memo.concat(react.cloneElement(handleComponent, assign_default()({\n key: "".concat(name, "-handle-").concat(curr)\n }, handleProps[curr]))) : memo;\n return memo;\n }, []);\n return handles.length ? handles : null;\n }\n }, {\n key: "getRect",\n value: function getRect(props) {\n var currentDomain = props.currentDomain,\n cachedBrushDomain = props.cachedBrushDomain;\n\n var brushDomain = defaults_default()({}, props.brushDomain, props.domain);\n\n var domain = react_fast_compare_default()(brushDomain, cachedBrushDomain) ? defaults_default()({}, currentDomain, brushDomain) : brushDomain;\n var coordinates = getDomainCoordinates(props, domain);\n var selectBox = this.getSelectBox(props, coordinates);\n return selectBox ? [selectBox, this.getHandles(props, domain)] : [];\n } // Overrides method in VictoryContainer\n\n }, {\n key: "getChildren",\n value: function getChildren(props) {\n return victory_brush_container_toConsumableArray(react.Children.toArray(props.children)).concat(victory_brush_container_toConsumableArray(this.getRect(props)));\n }\n }]);\n\n return VictoryBrushContainer;\n }(base), Object.defineProperty(_class, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "VictoryBrushContainer"\n }), Object.defineProperty(_class, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_brush_container_objectSpread({}, VictoryContainer.propTypes, {\n allowDrag: (prop_types_default()).bool,\n allowDraw: (prop_types_default()).bool,\n allowResize: (prop_types_default()).bool,\n brushComponent: (prop_types_default()).element,\n brushDimension: prop_types_default().oneOf(["x", "y"]),\n brushDomain: prop_types_default().shape({\n x: (prop_types_default()).array,\n y: (prop_types_default()).array\n }),\n brushStyle: (prop_types_default()).object,\n defaultBrushArea: prop_types_default().oneOf(["all", "disable", "none", "move"]),\n disable: (prop_types_default()).bool,\n handleComponent: (prop_types_default()).element,\n handleStyle: (prop_types_default()).object,\n handleWidth: (prop_types_default()).number,\n onBrushCleared: (prop_types_default()).func,\n onBrushDomainChange: (prop_types_default()).func,\n onBrushDomainChangeEnd: (prop_types_default()).func\n })\n }), Object.defineProperty(_class, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: victory_brush_container_objectSpread({}, VictoryContainer.defaultProps, {\n allowDrag: true,\n allowDraw: true,\n allowResize: true,\n brushComponent: react.createElement(rect, null),\n brushStyle: {\n stroke: "transparent",\n fill: "black",\n fillOpacity: 0.1\n },\n handleComponent: react.createElement(rect, null),\n handleStyle: {\n stroke: "transparent",\n fill: "transparent"\n },\n handleWidth: 8,\n mouseMoveThreshold: 0\n })\n }), Object.defineProperty(_class, "defaultEvents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return [{\n target: "parent",\n eventHandlers: {\n onMouseDown: function (evt, targetProps) {\n return props.disable ? {} : brush_helpers.onMouseDown(evt, targetProps);\n },\n onTouchStart: function (evt, targetProps) {\n return props.disable ? {} : brush_helpers.onMouseDown(evt, targetProps);\n },\n onGlobalMouseMove: function (evt, targetProps) {\n return props.disable || !targetProps.isPanning && !targetProps.isSelecting ? {} : brush_helpers.onGlobalMouseMove(evt, targetProps);\n },\n onGlobalTouchMove: function (evt, targetProps) {\n return props.disable || !targetProps.isPanning && !targetProps.isSelecting ? {} : brush_helpers.onGlobalMouseMove(evt, targetProps);\n },\n onGlobalMouseUp: function (evt, targetProps) {\n return props.disable ? {} : brush_helpers.onGlobalMouseUp(evt, targetProps);\n },\n onGlobalTouchEnd: function (evt, targetProps) {\n return props.disable ? {} : brush_helpers.onGlobalMouseUp(evt, targetProps);\n },\n onGlobalTouchCancel: function (evt, targetProps) {\n return props.disable ? {} : brush_helpers.onGlobalMouseUp(evt, targetProps);\n }\n }\n }];\n }\n }), _temp;\n};\n/* harmony default export */ const victory_brush_container = (brushContainerMixin(VictoryContainer));\n;// CONCATENATED MODULE: ./node_modules/victory-create-container/es/create-container.js\n\n\n\n\n\n\n\n\n\nfunction create_container_toConsumableArray(arr) { return create_container_arrayWithoutHoles(arr) || create_container_iterableToArray(arr) || create_container_nonIterableSpread(); }\n\nfunction create_container_nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }\n\nfunction create_container_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }\n\nfunction create_container_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction create_container_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === \'function\') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { create_container_defineProperty(target, key, source[key]); }); } return target; }\n\nfunction create_container_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction create_container_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction create_container_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction create_container_createClass(Constructor, protoProps, staticProps) { if (protoProps) create_container_defineProperties(Constructor.prototype, protoProps); if (staticProps) create_container_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction create_container_possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return create_container_assertThisInitialized(self); }\n\nfunction create_container_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction create_container_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction create_container_slicedToArray(arr, i) { return create_container_arrayWithHoles(arr) || create_container_iterableToArrayLimit(arr, i) || create_container_nonIterableRest(); }\n\nfunction create_container_nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }\n\nfunction create_container_iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction create_container_arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\n\n\n\n\n\n\n\nvar ensureArray = function (thing) {\n if (!thing) {\n return [];\n } else if (!Array.isArray(thing)) {\n return [thing];\n } else {\n return thing;\n }\n};\n\nvar combineEventHandlers = function (eventHandlersArray) {\n // takes an array of event handler objects and produces one eventHandlers object\n // creates a custom combinedHandler() for events with multiple conflicting handlers\n return eventHandlersArray.reduce(function (localHandlers, finalHandlers) {\n forOwn_default()(localHandlers, function (localHandler, eventName) {\n var existingHandler = finalHandlers[eventName];\n\n if (existingHandler) {\n // create new handler for event that concats the existing handler\'s mutations with new ones\n finalHandlers[eventName] = function combinedHandler() {\n // named for debug clarity\n // sometimes handlers return undefined; use empty array instead, for concat()\n var existingMutations = ensureArray(existingHandler.apply(void 0, arguments));\n var localMutations = ensureArray(localHandler.apply(void 0, arguments));\n return existingMutations.concat(localMutations);\n };\n } else {\n finalHandlers[eventName] = localHandler;\n }\n });\n\n return finalHandlers;\n });\n};\n\nvar combineDefaultEvents = function (defaultEvents) {\n // takes a defaultEvents array and returns one equal or lesser length,\n // by combining any events that have the same target\n var eventsByTarget = groupBy_default()(defaultEvents, "target");\n\n var events = toPairs_default()(eventsByTarget).map(function (_ref) {\n var _ref2 = create_container_slicedToArray(_ref, 2),\n target = _ref2[0],\n eventsArray = _ref2[1];\n\n eventsArray = eventsArray.filter(Boolean);\n return isEmpty_default()(eventsArray) ? null : {\n target: target,\n eventHandlers: combineEventHandlers(eventsArray.map(function (event) {\n return event.eventHandlers;\n })) // note: does not currently handle eventKey or childName\n\n };\n });\n\n return events.filter(Boolean);\n};\n\nvar combineContainerMixins = function (mixins, Container) {\n var _class, _temp;\n\n // similar to Object.assign(A, B), this function will decide conflicts in favor mixinB.\n // this applies to propTypes and defaultProps.\n // getChildren will call A\'s getChildren() and pass the resulting children to B\'s.\n // defaultEvents attempts to resolve any conflicts between A and B\'s defaultEvents.\n var Classes = mixins.map(function (mixin) {\n return mixin(Container);\n });\n var instances = Classes.map(function (Class) {\n return new Class();\n });\n\n var NaiveCombinedContainer = flow_default()(mixins)(Container);\n\n var displayType = Classes.map(function (Class) {\n var match = Class.displayName.match(/Victory(.*)Container/);\n return match[1] || "";\n }).join("");\n return _temp = _class =\n /*#__PURE__*/\n function (_NaiveCombinedContain) {\n create_container_inherits(VictoryCombinedContainer, _NaiveCombinedContain);\n\n function VictoryCombinedContainer() {\n create_container_classCallCheck(this, VictoryCombinedContainer);\n\n return create_container_possibleConstructorReturn(this, (VictoryCombinedContainer.__proto__ || Object.getPrototypeOf(VictoryCombinedContainer)).apply(this, arguments));\n }\n\n create_container_createClass(VictoryCombinedContainer, [{\n key: "getChildren",\n value: function getChildren(props) {\n return instances.reduce(function (children, instance) {\n return instance.getChildren(create_container_objectSpread({}, props, {\n children: children\n }));\n }, props.children);\n }\n }]);\n\n return VictoryCombinedContainer;\n }(NaiveCombinedContainer), Object.defineProperty(_class, "displayName", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: "Victory".concat(displayType, "Container")\n }), Object.defineProperty(_class, "propTypes", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: Classes.reduce(function (propTypes, Class) {\n return create_container_objectSpread({}, propTypes, Class.propTypes);\n }, {})\n }), Object.defineProperty(_class, "defaultProps", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: Classes.reduce(function (defaultProps, Class) {\n return create_container_objectSpread({}, defaultProps, Class.defaultProps);\n }, {})\n }), Object.defineProperty(_class, "defaultEvents", {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function (props) {\n return combineDefaultEvents(Classes.reduce(function (defaultEvents, Class) {\n var events = isFunction_default()(Class.defaultEvents) ? Class.defaultEvents(props) : Class.defaultEvents;\n return create_container_toConsumableArray(defaultEvents).concat(create_container_toConsumableArray(events));\n }, []));\n }\n }), _temp;\n};\n\nvar checkBehaviorName = function (behavior, behaviors) {\n if (behavior && !includes_default()(behaviors, behavior)) {\n warn("\\"".concat(behavior, "\\" is not a valid behavior. Choose from [").concat(behaviors.join(", "), "]."));\n }\n};\n\nvar makeCreateContainerFunction = function (mixinMap, Container) {\n return function (behaviorA, behaviorB) {\n // eslint-disable-line\n var behaviors = keys_default()(mixinMap);\n\n checkBehaviorName(behaviorA, behaviors);\n checkBehaviorName(behaviorB, behaviors);\n\n if (arguments.length <= 2 ? 0 : arguments.length - 2) {\n warn("too many arguments given to createContainer (maximum accepted: 2).");\n }\n\n var firstMixins = mixinMap[behaviorA];\n var secondMixins = mixinMap[behaviorB] || [];\n\n if (!firstMixins) {\n return Container;\n }\n\n return combineContainerMixins(create_container_toConsumableArray(firstMixins).concat(create_container_toConsumableArray(secondMixins)), Container);\n };\n};\n\nvar createContainer = makeCreateContainerFunction({\n zoom: [zoomContainerMixin],\n voronoi: [voronoiContainerMixin],\n selection: [selectionContainerMixin],\n cursor: [cursorContainerMixin],\n brush: [brushContainerMixin]\n}, VictoryContainer);\n\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartUtils/chart-container.js\n\n\n\n\n/**\n * Makes a container component with multiple behaviors. It allows you to effectively combine any two\n * containers of type \'brush\', \'cursor\', \'selection\', \'voronoi\', or \'zoom\'. Default container props are applied to\n * support the PatternFly theme.\n *\n * Each behavior must be one of the following strings: \'brush\', \'cursor\', \'selection\', \'voronoi\', and \'zoom\'. The\n * resulting container uses the events from both behaviors. For example, if both behaviors use the click event (like\n * zoom and selection) the combined container will trigger both behaviors\' events on each click.\n *\n * Note: Order of the behaviors matters in a few cases. It is recommended to use \'zoom\' before any other behaviors: for\n * example, createContainer(\'zoom\', \'voronoi\') instead of createContainer(\'voronoi\', \'zoom\').\n *\n * See https://formidable.com/open-source/victory/docs/create-container\n *\n * @param {string} behaviorA \'brush\', \'cursor\', \'selection\', \'voronoi\', or \'zoom\'\n * @param {string} behaviorB \'brush\', \'cursor\', \'selection\', \'voronoi\', or \'zoom\'\n */\nconst chart_container_createContainer = (behaviorA, behaviorB) => {\n const container = createContainer(behaviorA, behaviorB);\n const isCursor = behaviorA === \'cursor\' || behaviorB === \'cursor\';\n const isVoronoi = behaviorA === \'voronoi\' || behaviorB === \'voronoi\';\n if (isCursor) {\n container.defaultProps.cursorLabelComponent = react.createElement(ChartLabel, { textAnchor: "start" });\n }\n if (isVoronoi) {\n container.defaultProps.labelComponent = react.createElement(ChartCursorTooltip, null);\n }\n return container;\n};\n//# sourceMappingURL=chart-container.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartUtils/chart-interactive-legend.js\n/* eslint-disable camelcase */\n\n\n// Returns child names for each series, except given ID index\nconst getChildNames = ({ chartNames, omitIndex }) => {\n const result = [];\n chartNames.map((chartName, index) => {\n if (index !== omitIndex) {\n if (Array.isArray(chartName)) {\n chartName.forEach(name => result.push(name));\n }\n else {\n result.push(chartName);\n }\n }\n });\n return result;\n};\n// Returns events for an interactive legend\nconst getInteractiveLegendEvents = (props) => [\n ...getInteractiveLegendTargetEvents(Object.assign(Object.assign({}, props), { target: \'data\' })),\n ...getInteractiveLegendTargetEvents(Object.assign(Object.assign({}, props), { target: \'labels\' }))\n];\n// Returns legend items, except given ID index\nconst getInteractiveLegendItems = ({ chartNames, omitIndex }) => {\n const result = [];\n chartNames.map((_, index) => {\n if (index !== omitIndex) {\n result.push(index);\n }\n });\n return result;\n};\n// Returns styles for interactive legend items\nconst getInteractiveLegendItemStyles = (hidden = false) => !hidden\n ? {}\n : {\n labels: {\n fill: esm_chart_color_black_500.value\n },\n symbol: {\n fill: esm_chart_color_black_500.value,\n type: \'eyeSlash\'\n }\n };\n// Returns targeted events for legend \'data\' or \'labels\'\nconst getInteractiveLegendTargetEvents = ({ chartNames, isDataHidden = () => false, isHidden = () => false, legendName, onLegendClick = () => null, target }) => {\n if (chartNames === undefined || legendName === undefined) {\n // eslint-disable-next-line no-console\n console.error(\'getInteractiveLegendTargetEvents:\', \'requires chartNames and legendName to be specified\');\n return [];\n }\n return chartNames.map((_, index) => {\n // Get IDs to attach events to, except the IDs associated with this event.\n //\n // For example, if the current event key is 0, we need IDs associated with events 1 and 2. If the current event\n // key is 1, we need IDs associated with events 0 and 2. And so on...\n const childNames = getChildNames({ chartNames, legendName, omitIndex: index });\n const legendItems = getInteractiveLegendItems({ chartNames, legendName, omitIndex: index });\n return {\n childName: legendName,\n target,\n eventKey: index,\n eventHandlers: {\n onClick: () => [\n {\n // Hide each data series individually\n target: \'data\',\n mutation: (props) => {\n onLegendClick(props);\n return null;\n }\n }\n ],\n onMouseOver: () => isHidden(index)\n ? null\n : [\n {\n // Mute all data series, except the data associated with this event\n childName: childNames,\n target: \'data\',\n eventKey: \'all\',\n mutation: (props) => isDataHidden(props.data)\n ? null\n : {\n // Skip if hidden\n style: props.padAngle !== undefined // Support for pie chart\n ? Object.assign(Object.assign({}, props.style), (index !== props.index && { opacity: esm_chart_area_Opacity.value })) : Object.assign(Object.assign({}, props.style), { opacity: esm_chart_area_Opacity.value })\n }\n },\n {\n // Mute all legend item symbols, except the symbol associated with this event\n childName: legendName,\n target: \'data\',\n eventKey: legendItems,\n mutation: (props) => isHidden(props.index)\n ? null\n : {\n // Skip if hidden\n style: Object.assign(Object.assign({}, props.style), { opacity: esm_chart_area_Opacity.value })\n }\n },\n {\n // Mute all legend item labels, except the label associated with this event\n childName: legendName,\n target: \'labels\',\n eventKey: legendItems,\n mutation: (props) => {\n const column = props.datum && props.datum.column ? props.datum.column : 0;\n return isHidden(column)\n ? null\n : {\n // Skip if hidden\n style: Object.assign(Object.assign({}, props.style), { opacity: esm_chart_area_Opacity.value })\n };\n }\n }\n ],\n onMouseOut: () => [\n {\n // Restore all data series associated with this event\n childName: \'all\',\n target: \'data\',\n eventKey: \'all\',\n mutation: () => null\n },\n {\n // Restore all legend item symbols associated with this event\n childName: \'legend\',\n target: \'data\',\n eventKey: legendItems,\n mutation: () => null\n },\n {\n // Restore all legend item labels associated with this event\n childName: \'legend\',\n target: \'labels\',\n eventKey: legendItems,\n mutation: () => null\n }\n ]\n }\n };\n });\n};\n//# sourceMappingURL=chart-interactive-legend.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartUtils/chart-resize.js\n\n/**\n * This function creates a ResizeObserver used to handle resize events for the given containerRef. If ResizeObserver\n * or the given containerRef are not available, a window resize event listener is used by default.\n *\n * Example 1:\n *\n * private containerRef = React.createRef();\n * private observer: any = () => {};\n *\n * public componentDidMount() {\n * this.observer = getResizeObserver(this.containerRef.current, this.handleResize);\n * }\n *\n * public componentWillUnmount() {\n * this.observer();\n * }\n *\n * private handleResize = () => {\n * if (this.containerRef.current && this.containerRef.current.clientWidth) {\n * this.setState({ width: this.containerRef.current.clientWidth });\n * }\n * };\n *\n * public render() {\n * return (\n *
\n * \n *
\n * );\n * }\n *\n * Example 2:\n *\n * private inputRef = React.createRef();\n * private observer: any = () => {};\n *\n * public componentDidMount() {\n * this.observer = getResizeObserver(this.inputRef.current, this.handleResize);\n * }\n *\n * public componentWillUnmount() {\n * this.observer();\n * }\n *\n * private handleResize = () => {\n * if (this.inputRef.current) {\n * trimLeft(inputRef.current, String(this.props.value));\n * }\n * };\n *\n * public render() {\n * return (\n * \n * );\n * }\n *\n * @param {Element} containerRefElement The container reference to observe\n * @param {Function} handleResize The function to call for resize events\n * @return {Function} The function used to unobserve resize events\n */\nconst getResizeObserver = (containerRefElement, handleResize) => {\n let unobserve;\n if (canUseDOM) {\n const { ResizeObserver } = window;\n if (containerRefElement && ResizeObserver) {\n const resizeObserver = new ResizeObserver((entries) => {\n // Wrap resize function in requestAnimationFrame to avoid "ResizeObserver loop limit exceeded" errors\n window.requestAnimationFrame(() => {\n if (Array.isArray(entries) && entries.length > 0) {\n handleResize();\n }\n });\n });\n resizeObserver.observe(containerRefElement);\n unobserve = () => resizeObserver.unobserve(containerRefElement);\n }\n else {\n window.addEventListener(\'resize\', handleResize);\n unobserve = () => window.removeEventListener(\'resize\', handleResize);\n }\n }\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n};\n//# sourceMappingURL=chart-resize.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartUtils/index.js\n\n\n\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartVoronoiContainer/ChartVoronoiContainer.js\n\n\n\n\n\n\nvar ChartVoronoiDimension;\n(function (ChartVoronoiDimension) {\n ChartVoronoiDimension["x"] = "x";\n ChartVoronoiDimension["y"] = "y";\n})(ChartVoronoiDimension || (ChartVoronoiDimension = {}));\nconst ChartVoronoiContainer = (_a) => {\n var { className, constrainToVisibleArea = false, themeColor, themeVariant, \n // destructure last\n theme = getTheme(themeColor, themeVariant), labelComponent = react.createElement(ChartTooltip, null) } = _a, // Note that Victory provides its own tooltip component here\n rest = (0,tslib_es6.__rest)(_a, ["className", "constrainToVisibleArea", "themeColor", "themeVariant", "theme", "labelComponent"]);\n const chartClassName = getClassName({ className });\n const chartLabelComponent = react.cloneElement(labelComponent, Object.assign({ constrainToVisibleArea,\n theme }, labelComponent.props));\n // Note: theme is required by voronoiContainerMixin\n return (\n // Note: className is valid, but Victory is missing a type\n react.createElement(victory_voronoi_container, Object.assign({ className: chartClassName, labelComponent: chartLabelComponent, theme: theme }, rest)));\n};\nChartVoronoiContainer.displayName = \'ChartVoronoiContainer\';\nChartVoronoiContainer.defaultProps = victory_voronoi_container.defaultProps;\n// Note: VictoryVoronoiContainer.defaultEvents & VictoryContainer.role must be hoisted\nhoist_non_react_statics_cjs_default()(ChartVoronoiContainer, victory_voronoi_container);\n//# sourceMappingURL=ChartVoronoiContainer.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/ChartVoronoiContainer/index.js\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/components/index.js\n/** Keep alphabetically sorted */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-charts/dist/esm/index.js\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRU87QUFDUDtBQUNBOzs7QUNwR0EsNkJBQWUsbUNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7OztBQ0pBLDZCQUFlLG9CQUFTO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBOzs7QUNUMkM7O0FBRXBDOztBQUVBO0FBQ0E7O0FBRVA7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLElBQUk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVMsU0FBRztBQUNuQjtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFNLE1BQU0sU0FBRyxFQUFFLE1BQU07QUFDdkI7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxjQUFjLFNBQVMsU0FBUztBQUN4RSxpQkFBaUIsaUJBQWE7QUFDOUI7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0Esd0NBQXdDLFdBQWUsU0FBUyxNQUFVO0FBQzFFLGlCQUFpQixjQUFjO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxZQUFZLDRCQUE0QjtBQUN4QztBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7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Q0EsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsVUFBVTtBQUNyQixZQUFZLFVBQVU7QUFDdEI7QUFDTztBQUNQO0FBQ0EsUUFBUSxTQUFTO0FBQ2pCLGdCQUFnQixpQkFBaUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Qzs7QUN4RmtDO0FBQ0g7QUFDQztBQUNXO0FBQ2I7QUFDQztBQUNBO0FBQ0M7QUFDRDtBQUNEO0FBQ0U7QUFDaEMsaUM7O0FDWCtCO0FBQ0E7QUFDNEI7QUFDUztBQUNyQjtBQUNRO0FBQ2hEO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxzREFBc0Q7QUFDaEQ7QUFDUCxVQUFVO0FBQ1Y7QUFDQSxZQUFZLFFBQVEsNkNBQTZDLG1CQUFtQixDQUFDLFlBQVksVUFBVTtBQUMzRyxXQUFXLG9CQUFNO0FBQ2pCLDJCQUEyQixZQUFZLEdBQUcsV0FBVztBQUNyRCxnQ0FBZ0Msa0JBQWtCLGlDQUFpQztBQUNuRixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsSUFBSSxtQkFBbUIsQ0FBQyx5QkFBdUIsa0JBQWtCLDhFQUE4RTtBQUMvSTtBQUNBO0FBQ0EscUNBQXFDLHNDQUFvQztBQUN6RTtBQUNBLHFDQUFvQix3QkFBd0IseUJBQXVCO0FBQ25FLGlEOztBQzVCd0M7QUFDeEMsaUM7O0FDREE7QUFDd0I7QUFDSTtBQUNBO0FBQ0Q7QUFDRztBQUNHO0FBQ007QUFDRjtBQUNSO0FBQ1c7QUFDWDtBQUNBO0FBQ0M7QUFDTztBQUNUO0FBQ0Q7QUFDRTtBQUNFO0FBQ0Y7QUFDQTtBQUNJO0FBQ0Y7QUFDRjtBQUNXO0FBQ3hDLGlDOztBQ3pCNkI7QUFDN0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2xlZ2VuZF9NYXJnaW4uanM/OTNiMSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jb3JlL2VzL3ZpY3RvcnktdXRpbC9oZWxwZXJzLmpzPzQzOTkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXV0aWwvY29sbGVjdGlvbi5qcz82MjJlIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYXNjZW5kaW5nLmpzPzAwZmIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9iaXNlY3Rvci5qcz8yYTJkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYmlzZWN0LmpzPzg3YzkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9hcnJheS5qcz9jMGMyIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvdGlja3MuanM/ZWVjYiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2hpc3RvZ3JhbS5qcz82YzRiIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvdGhyZXNob2xkL2ZyZWVkbWFuRGlhY29uaXMuanM/YzIzNCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL251bWJlci5qcz8wYTIwIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVhbnRpbGUuanM/MTg3NSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3JhbmdlLmpzPzM2NWIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9pbmRleC5qcz9iYzE3Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1jb2xsZWN0aW9uL3NyYy9tYXAuanM/ZjkxOSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtY29sbGVjdGlvbi9zcmMvbmVzdC5qcz85OTkzIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1jb2xsZWN0aW9uL3NyYy9zZXQuanM/NWY1ZiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtY29sbGVjdGlvbi9zcmMvaW5kZXguanM/NmYwNCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2FycmF5LmpzPzljZmEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9vcmRpbmFsLmpzP2RmMTkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9iYW5kLmpzP2IwMjYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9udW1iZXIuanM/ZTMxNyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2RlZmluZS5qcz82M2FkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY29sb3IuanM/MTY2YSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2Jhc2lzLmpzP2M4NGEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpc0Nsb3NlZC5qcz80YmNkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29uc3RhbnQuanM/YzY5OCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbG9yLmpzP2IwNTUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9yZ2IuanM/ZTM2MCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2FycmF5LmpzPzY3MzAiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9kYXRlLmpzPzFiNmQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9vYmplY3QuanM/NzFiZCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3N0cmluZy5qcz85MGVmIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyQXJyYXkuanM/NTFkZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3ZhbHVlLmpzP2VhMWQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9yb3VuZC5qcz81ODU3Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvY29uc3RhbnQuanM/NGRmMSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL251bWJlci5qcz9lMjZlIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvY29udGludW91cy5qcz9lOTgxIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFNwZWNpZmllci5qcz8wOWI4Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdERlY2ltYWwuanM/YWE3NCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9leHBvbmVudC5qcz9hN2ZkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL3ByZWNpc2lvblByZWZpeC5qcz9kOTMzIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdEdyb3VwLmpzPzk4NzEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0TnVtZXJhbHMuanM/MDE0YSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRUcmltLmpzPzkxZGIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0UHJlZml4QXV0by5qcz9jZGVkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFJvdW5kZWQuanM/M2Y3OCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRUeXBlcy5qcz9iNGVmIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2lkZW50aXR5LmpzPzExNDkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvbG9jYWxlLmpzP2IxNzAiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZGVmYXVsdExvY2FsZS5qcz8xMjMxIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL3ByZWNpc2lvblJvdW5kLmpzP2Q5ODkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvcHJlY2lzaW9uRml4ZWQuanM/ZGFkMSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3RpY2tGb3JtYXQuanM/YjJjOSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2xpbmVhci5qcz81NDhhIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvaWRlbnRpdHkuanM/ZDRlMiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL25pY2UuanM/NmRjNiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2xvZy5qcz85ZjQ4Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvcG93LmpzPzc4OWIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9xdWFudGlsZS5qcz83MjZhIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvcXVhbnRpemUuanM/N2Y4MCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3RocmVzaG9sZC5qcz82YjBmIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy9pbnRlcnZhbC5qcz8xOGUyIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy95ZWFyLmpzP2ExNWEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXRpbWUvc3JjL21vbnRoLmpzPzk2MDMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXRpbWUvc3JjL2R1cmF0aW9uLmpzPzE3MzgiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXRpbWUvc3JjL3dlZWsuanM/YjE0YyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtdGltZS9zcmMvZGF5LmpzPzc0MmMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXRpbWUvc3JjL2hvdXIuanM/YjNjMyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtdGltZS9zcmMvbWludXRlLmpzPzJjMzgiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXRpbWUvc3JjL3NlY29uZC5qcz81ZWRmIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy9taWxsaXNlY29uZC5qcz8xODA5Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy91dGNXZWVrLmpzPzI3MzkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXRpbWUvc3JjL3V0Y0RheS5qcz82ZWIyIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy91dGNZZWFyLmpzPzc3YWUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXRpbWUtZm9ybWF0L3NyYy9sb2NhbGUuanM/YTU5MSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtdGltZS1mb3JtYXQvc3JjL2RlZmF1bHRMb2NhbGUuanM/NGMyMyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3RpbWUuanM/NDc0OCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtdGltZS9zcmMvdXRjTW9udGguanM/NTVmOCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtdGltZS9zcmMvdXRjSG91ci5qcz9mNjIzIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy10aW1lL3NyYy91dGNNaW51dGUuanM/ZjhlZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3V0Y1RpbWUuanM/M2I0MCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2NvbG9ycy5qcz84ODQ1Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvY2F0ZWdvcnkxMC5qcz8zNTc2Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvY2F0ZWdvcnkyMGIuanM/MDQ1ZiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2NhdGVnb3J5MjBjLmpzPzVkNzEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9jYXRlZ29yeTIwLmpzP2E4MDAiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9tYXRoLmpzPzUzMGEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9jdWJlaGVsaXguanM/MTVhNyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2N1YmVoZWxpeC5qcz8zODcyIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvY3ViZWhlbGl4LmpzPzM1MjQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9yYWluYm93LmpzP2FlZjkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy92aXJpZGlzLmpzPzhmMTkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9zZXF1ZW50aWFsLmpzP2NlNmIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNjYWxlL2luZGV4LmpzP2UyMzYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXV0aWwvc2NhbGUuanM/MDI4NiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jb3JlL2VzL3ZpY3RvcnktdXRpbC9pbW11dGFibGUuanM/ZWIzOSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jb3JlL2VzL3ZpY3RvcnktdXRpbC9kYXRhLmpzPzAzYzYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXV0aWwvZG9tYWluLmpzP2M1MWIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXV0aWwvYXhpcy5qcz8wZWQ2Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNvcmUvZXMvdmljdG9yeS11dGlsL3N0eWxlLmpzPzM0MGQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXV0aWwvZXZlbnRzLmpzPzdmZTYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXV0aWwvbG9nLmpzPzg0NmEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXV0aWwvd3JhcHBlci5qcz83MGUyIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNvcmUvZXMvdmljdG9yeS11dGlsL3Byb3AtdHlwZXMuanM/YzQzOCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jb3JlL2VzL3ZpY3RvcnktdXRpbC9jb21tb24tcHJvcHMuanM/NjkyOSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jb3JlL2VzL3ZpY3RvcnktcHJpbWl0aXZlcy9yZWN0LmpzPzM3MjEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXByaW1pdGl2ZXMvY2lyY2xlLmpzP2E0Y2QiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXByaW1pdGl2ZXMvYmFja2dyb3VuZC5qcz9mYzI2Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNvcmUvZXMvdmljdG9yeS1wb3J0YWwvcG9ydGFsLmpzPzU3OTYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXBvcnRhbC9wb3J0YWwtY29udGV4dC5qcz8wMDY5Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZXIuanM/NzRmNCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jb3JlL2VzL3ZpY3RvcnktdXRpbC90aW1lci5qcz8zMmZmIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNvcmUvZXMvdmljdG9yeS11dGlsL3RpbWVyLWNvbnRleHQuanM/ZDNiMiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jb3JlL2VzL3ZpY3RvcnktY29udGFpbmVyL3ZpY3RvcnktY29udGFpbmVyLmpzPzJhNTAiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXRoZW1lL21hdGVyaWFsLmpzPzI2YzEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXRoZW1lL2dyYXlzY2FsZS5qcz8wMThkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNvcmUvZXMvdmljdG9yeS10aGVtZS92aWN0b3J5LXRoZW1lLmpzP2U0YTAiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXV0aWwvdHJhbnNpdGlvbnMuanM/Y2M2ZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jb3JlL2VzL3ZpY3RvcnktdXRpbC9ob29rcy91c2UtYW5pbWF0aW9uLXN0YXRlLmpzPzM3N2YiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXV0aWwvaG9va3MvdXNlLXByZXZpb3VzLXByb3BzLmpzP2E5MjQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3Rvcnktc2hhcmVkLWV2ZW50cy9lcy92aWN0b3J5LXNoYXJlZC1ldmVudHMuanM/OTI0NyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jb3JlL2VzL3ZpY3RvcnktdXRpbC90ZXh0c2l6ZS5qcz8xYzQ4Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNvcmUvZXMvdmljdG9yeS1wcmltaXRpdmVzL2xpbmUuanM/Mjg2YiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jb3JlL2VzL3ZpY3RvcnktcHJpbWl0aXZlcy9saW5lLXNlZ21lbnQuanM/ZmMzYSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jb3JlL2VzL3ZpY3RvcnktcG9ydGFsL3ZpY3RvcnktcG9ydGFsLmpzPzM5ZTQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXV0aWwvbGFiZWwtaGVscGVycy5qcz8xY2U4Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNvcmUvZXMvdmljdG9yeS1wcmltaXRpdmVzL3RzcGFuLmpzP2YyMjYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXByaW1pdGl2ZXMvdGV4dC5qcz9iOWNmIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNvcmUvZXMvdmljdG9yeS1sYWJlbC92aWN0b3J5LWxhYmVsLmpzPzQzNjkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2xpbmVhci5qcz82NTEzIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9xdWFkLmpzPzRkNzIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzPzg5MjEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL3BvbHkuanM/ZTU3YSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvc2luLmpzP2ViNjciLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL21hdGguanM/ZTk5MSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvZXhwLmpzPzJjZTUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2NpcmNsZS5qcz9iNDg5Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9ib3VuY2UuanM/MzA3OCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvYmFjay5qcz84OTQ2Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9lbGFzdGljLmpzP2I5Y2YiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2luZGV4LmpzP2ZiNzciLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LWFuaW1hdGlvbi91dGlsLmpzPzI0MDgiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LWFuaW1hdGlvbi92aWN0b3J5LWFuaW1hdGlvbi5qcz8zMmJkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNvcmUvZXMvdmljdG9yeS10cmFuc2l0aW9uL3ZpY3RvcnktdHJhbnNpdGlvbi5qcz82N2ViIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNvcmUvZXMvdmljdG9yeS11dGlsL2FkZC1ldmVudHMuanM/YzRhZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1heGlzL2VzL2hlbHBlci1tZXRob2RzLmpzP2ZkOWUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktYXhpcy9lcy92aWN0b3J5LWF4aXMuanM/ZjAyYSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jb3JlL2VzL3ZpY3RvcnktcHJpbWl0aXZlcy9wYXRoLmpzP2JhNWIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXByaW1pdGl2ZXMvYXJjLmpzP2EwOWIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktcG9sYXItYXhpcy9lcy9oZWxwZXItbWV0aG9kcy5qcz8zM2U2Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LXBvbGFyLWF4aXMvZXMvdmljdG9yeS1wb2xhci1heGlzLmpzPzEwZTMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY2hhcnQvZXMvaGVscGVyLW1ldGhvZHMuanM/YTU1YSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jaGFydC9lcy92aWN0b3J5LWNoYXJ0LmpzPzhkNzMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibHVlXzEwMC5qcz8xNjUzIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmx1ZV8yMDAuanM/YTBmZiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsdWVfMzAwLmpzP2Q1ZjkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibHVlXzQwMC5qcz8xMmJmIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmx1ZV81MDAuanM/N2JiMiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUaGVtZS90aGVtZXMvY29sb3ItdGhlbWUuanM/N2RlNSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUaGVtZS90aGVtZXMvZGFyay9ibHVlLWNvbG9yLXRoZW1lLmpzPzBhNWQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9jeWFuXzEwMC5qcz9jYWI2Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfY3lhbl8yMDAuanM/MThjYSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2N5YW5fMzAwLmpzPzAyMTUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9jeWFuXzQwMC5qcz85YmExIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfY3lhbl81MDAuanM/MTBmZiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUaGVtZS90aGVtZXMvZGFyay9jeWFuLWNvbG9yLXRoZW1lLmpzP2Y1ZmEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9nb2xkXzEwMC5qcz9kOGNlIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ29sZF8yMDAuanM/ODU1NSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dvbGRfMzAwLmpzPzExZjAiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9nb2xkXzQwMC5qcz8wZGM5Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ29sZF81MDAuanM/ZmMxYyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUaGVtZS90aGVtZXMvZGFyay9nb2xkLWNvbG9yLXRoZW1lLmpzPzQ3ODciLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibGFja18xMDAuanM/MzA2NiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsYWNrXzIwMC5qcz9hMzJkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmxhY2tfMzAwLmpzPzcwNjQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibGFja180MDAuanM/ZDdhOSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsYWNrXzUwMC5qcz81MWIxIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydFRoZW1lL3RoZW1lcy9kYXJrL2dyYXktY29sb3ItdGhlbWUuanM/ZDBjNSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dyZWVuXzEwMC5qcz8yNWE3Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ3JlZW5fMjAwLmpzPzkwNmIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ncmVlbl8zMDAuanM/MzY1YiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dyZWVuXzQwMC5qcz9mMTUyIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ3JlZW5fNTAwLmpzP2FlZDkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvdGhlbWVzL2RhcmsvZ3JlZW4tY29sb3ItdGhlbWUuanM/MzRlYSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV8xMDAuanM/MjI2MCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV8yMDAuanM/ZDE2NCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV8zMDAuanM/ODY1ZiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV80MDAuanM/ODc3OSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV81MDAuanM/MmNlMyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUaGVtZS90aGVtZXMvZGFyay9tdWx0aS1jb2xvci1vcmRlcmVkLXRoZW1lLmpzP2I5OGUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfMTAwLmpzP2IxZTkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfMjAwLmpzP2QyNDAiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfMzAwLmpzP2Y3NjUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfNDAwLmpzP2JiMmYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfNTAwLmpzPzUxZTEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvdGhlbWVzL2RhcmsvbXVsdGktY29sb3ItdW5vcmRlcmVkLXRoZW1lLmpzPzE5ZGMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvdGhlbWVzL2Rhcmsvb3JhbmdlLWNvbG9yLXRoZW1lLmpzP2NiMjciLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvdGhlbWVzL2RhcmsvcHVycGxlLWNvbG9yLXRoZW1lLmpzP2JmNWQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvdGhlbWVzL2xpZ2h0L2JsdWUtY29sb3ItdGhlbWUuanM/YTI2ZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUaGVtZS90aGVtZXMvbGlnaHQvY3lhbi1jb2xvci10aGVtZS5qcz9jNzhkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydFRoZW1lL3RoZW1lcy9saWdodC9nb2xkLWNvbG9yLXRoZW1lLmpzPzI2OGUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvdGhlbWVzL2xpZ2h0L2dyYXktY29sb3ItdGhlbWUuanM/OTk4ZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUaGVtZS90aGVtZXMvbGlnaHQvZ3JlZW4tY29sb3ItdGhlbWUuanM/MWE3NSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUaGVtZS90aGVtZXMvbGlnaHQvbXVsdGktY29sb3Itb3JkZXJlZC10aGVtZS5qcz8yMjZlIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydFRoZW1lL3RoZW1lcy9saWdodC9tdWx0aS1jb2xvci11bm9yZGVyZWQtdGhlbWUuanM/YWIxYiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUaGVtZS90aGVtZXMvbGlnaHQvb3JhbmdlLWNvbG9yLXRoZW1lLmpzPzQ3ZGQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvdGhlbWVzL2xpZ2h0L3B1cnBsZS1jb2xvci10aGVtZS5qcz84NTQ2Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYXhpc19ncmlkX3N0cm9rZV9Db2xvci5qcz9iNWJmIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYXhpc190aWNrX3N0cm9rZV9Db2xvci5qcz9kN2UwIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydFRoZW1lL3RoZW1lcy9heGlzLXRoZW1lLmpzPzg2NzQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9nbG9iYWxfRm9udEZhbWlseS5qcz85ZWQ3Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZ2xvYmFsX2xldHRlcl9zcGFjaW5nLmpzPzFlN2EiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9nbG9iYWxfRm9udFNpemVfc20uanM/ODRhOCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2dsb2JhbF9sYWJlbF9QYWRkaW5nLmpzPzBhMzQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9nbG9iYWxfbGFiZWxfc3Ryb2tlLmpzP2ExMzEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9nbG9iYWxfbGFiZWxfdGV4dF9hbmNob3IuanM/ZGVkZCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2dsb2JhbF9sYXlvdXRfUGFkZGluZy5qcz8yY2E5Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZ2xvYmFsX2xheW91dF9IZWlnaHQuanM/N2RhZiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2dsb2JhbF9sYXlvdXRfV2lkdGguanM/YWM0NCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2dsb2JhbF9zdHJva2VfbGluZV9jYXAuanM/Njc5ZiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2dsb2JhbF9zdHJva2VfbGluZV9qb2luLmpzPzNhZjIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9hcmVhX2RhdGFfRmlsbC5qcz8xNzkzIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYXJlYV9PcGFjaXR5LmpzPzc2MzkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9hcmVhX3N0cm9rZV9XaWR0aC5qcz8yYjgwIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYXhpc19heGlzX3N0cm9rZV9XaWR0aC5qcz8wMTg5Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYXhpc19heGlzX3N0cm9rZV9Db2xvci5qcz83NWE2Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYXhpc19heGlzX0ZpbGwuanM/ZDBiNCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2F4aXNfYXhpc19sYWJlbF9QYWRkaW5nLmpzP2VjMTQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9heGlzX2F4aXNfbGFiZWxfc3Ryb2tlX0NvbG9yLmpzP2I1ZjYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9heGlzX2dyaWRfRmlsbC5qcz9hMjcwIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYXhpc19ncmlkX1BvaW50ZXJFdmVudHMuanM/MGMzMSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2F4aXNfdGlja19GaWxsLmpzP2JhNzEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9heGlzX3RpY2tfU2l6ZS5qcz8zNDZiIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYXhpc190aWNrX1dpZHRoLmpzPzcxYTYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9heGlzX3RpY2tfbGFiZWxfRmlsbC5qcz8zYTVlIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYmFyX1dpZHRoLmpzPzJjOGEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9iYXJfZGF0YV9zdHJva2UuanM/OWQ1NSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2Jhcl9kYXRhX0ZpbGwuanM/MjM3NyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2Jhcl9kYXRhX1BhZGRpbmcuanM/MmY4NiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2Jhcl9kYXRhX3N0cm9rZV9XaWR0aC5qcz8yN2M0Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYm94cGxvdF9tYXhfUGFkZGluZy5qcz9hNzFiIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYm94cGxvdF9tYXhfc3Ryb2tlX0NvbG9yLmpzPzAxM2IiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9ib3hwbG90X21heF9zdHJva2VfV2lkdGguanM/MzY4NiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2JveHBsb3RfbWVkaWFuX1BhZGRpbmcuanM/ZDk1YyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2JveHBsb3RfbWVkaWFuX3N0cm9rZV9Db2xvci5qcz9hODcwIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYm94cGxvdF9tZWRpYW5fc3Ryb2tlX1dpZHRoLmpzP2JlNTAiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9ib3hwbG90X21pbl9QYWRkaW5nLmpzPzJmMzIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9ib3hwbG90X21pbl9zdHJva2VfV2lkdGguanM/NzJlNSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2JveHBsb3RfbWluX3N0cm9rZV9Db2xvci5qcz9hNWM4Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYm94cGxvdF9sb3dlcl9xdWFydGlsZV9QYWRkaW5nLmpzPzk0ZmMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9ib3hwbG90X2xvd2VyX3F1YXJ0aWxlX0ZpbGwuanM/YjE1NiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2JveHBsb3RfdXBwZXJfcXVhcnRpbGVfUGFkZGluZy5qcz85OTJiIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYm94cGxvdF91cHBlcl9xdWFydGlsZV9GaWxsLmpzPzE2ZGMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9ib3hwbG90X2JveF9XaWR0aC5qcz84ZGY0Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY2FuZGVsc3RpY2tfZGF0YV9zdHJva2VfV2lkdGguanM/ZWUwNiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NhbmRlbHN0aWNrX2RhdGFfc3Ryb2tlX0NvbG9yLmpzP2VmOTkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jYW5kZWxzdGlja19jYW5kbGVfcG9zaXRpdmVfQ29sb3IuanM/ZTQ3ZiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NhbmRlbHN0aWNrX2NhbmRsZV9uZWdhdGl2ZV9Db2xvci5qcz8yOGFmIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZXJyb3JiYXJfQm9yZGVyV2lkdGguanM/NmVjZCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2Vycm9yYmFyX2RhdGFfRmlsbC5qcz9jZGU1Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZXJyb3JiYXJfZGF0YV9PcGFjaXR5LmpzP2IzODkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9lcnJvcmJhcl9kYXRhX3N0cm9rZV9XaWR0aC5qcz9mY2M1Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZXJyb3JiYXJfZGF0YV9zdHJva2VfQ29sb3IuanM/ZDk0MCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2xlZ2VuZF9ndXR0ZXJfV2lkdGguanM/ZTFkNCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2xlZ2VuZF9vcmllbnRhdGlvbi5qcz9jOWEzIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfbGVnZW5kX3RpdGxlX29yaWVudGF0aW9uLmpzPzI4OWQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9sZWdlbmRfZGF0YV90eXBlLmpzPzIyMmEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9sZWdlbmRfdGl0bGVfUGFkZGluZy5qcz84MGUwIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfbGluZV9kYXRhX0ZpbGwuanM/NDUxZiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2xpbmVfZGF0YV9PcGFjaXR5LmpzP2U0NmYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9saW5lX2RhdGFfc3Ryb2tlX1dpZHRoLmpzPzEyZTUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9saW5lX2RhdGFfc3Ryb2tlX0NvbG9yLmpzPzk4NDkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9waWVfUGFkZGluZy5qcz9hMTVjIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfcGllX2RhdGFfUGFkZGluZy5qcz8wNmZlIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfcGllX2RhdGFfc3Ryb2tlX1dpZHRoLmpzPzIyMzEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9waWVfZGF0YV9zdHJva2VfQ29sb3IuanM/YmI0ZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3BpZV9sYWJlbHNfUGFkZGluZy5qcz9kMzAxIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfcGllX0hlaWdodC5qcz83MmYwIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfcGllX1dpZHRoLmpzPzI1ODUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9zY2F0dGVyX2RhdGFfc3Ryb2tlX0NvbG9yLmpzP2Y1MjgiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9zY2F0dGVyX2RhdGFfc3Ryb2tlX1dpZHRoLmpzPzlkZTQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9zY2F0dGVyX2RhdGFfT3BhY2l0eS5qcz85YmMzIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfc2NhdHRlcl9kYXRhX0ZpbGwuanM/NjI4MiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3N0YWNrX2RhdGFfc3Ryb2tlX1dpZHRoLmpzPzI3NGIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF90b29sdGlwX2Nvcm5lcl9yYWRpdXMuanM/MDlkZCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3Rvb2x0aXBfcG9pbnRlcl9sZW5ndGguanM/ZjdjOCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3Rvb2x0aXBfRmlsbC5qcz85NzFkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdG9vbHRpcF9mbHlvdXRTdHlsZV9jb3JuZXJfcmFkaXVzLmpzPzU3NTMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF90b29sdGlwX2ZseW91dFN0eWxlX3N0cm9rZV9XaWR0aC5qcz82YmZmIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdG9vbHRpcF9mbHlvdXRTdHlsZV9Qb2ludGVyRXZlbnRzLmpzP2MwMzEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF90b29sdGlwX2ZseW91dFN0eWxlX3N0cm9rZV9Db2xvci5qcz8yNWQ5Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdG9vbHRpcF9mbHlvdXRTdHlsZV9GaWxsLmpzPzhlYjciLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF90b29sdGlwX3BvaW50ZXJfV2lkdGguanM/OTFiNCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3Rvb2x0aXBfUGFkZGluZy5qcz9mYThjIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdG9vbHRpcF9Qb2ludGVyRXZlbnRzLmpzPzQ5MDYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF92b3Jvbm9pX2RhdGFfRmlsbC5qcz83MWU0Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdm9yb25vaV9kYXRhX3N0cm9rZV9Db2xvci5qcz8xYTNlIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdm9yb25vaV9kYXRhX3N0cm9rZV9XaWR0aC5qcz8xNzcyIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdm9yb25vaV9sYWJlbHNfRmlsbC5qcz82ODhjIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdm9yb25vaV9sYWJlbHNfUGFkZGluZy5qcz9jYWQyIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdm9yb25vaV9sYWJlbHNfUG9pbnRlckV2ZW50cy5qcz8yNDNhIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdm9yb25vaV9mbHlvdXRfc3Ryb2tlX1dpZHRoLmpzPzc0N2QiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF92b3Jvbm9pX2ZseW91dF9Qb2ludGVyRXZlbnRzLmpzPzNkZmUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF92b3Jvbm9pX2ZseW91dF9zdHJva2VfQ29sb3IuanM/ODRkZCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3Zvcm9ub2lfZmx5b3V0X3N0cm9rZV9GaWxsLmpzPzYxZDkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvdGhlbWVzL2Jhc2UtdGhlbWUuanM/YzA1YSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2J1bGxldF9IZWlnaHQuanM/MjI4YSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX0ZpbGxfQ29sb3IuanM/NzRkNiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX3N0cm9rZV9Db2xvci5qcz9iYjI1Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfc3Ryb2tlX1dpZHRoLmpzP2I4MDUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9lcnJvcl9GaWxsX0NvbG9yLmpzPzUyMTMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9lcnJvcl9zdHJva2VfQ29sb3IuanM/MzE5MSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX2Vycm9yX3N0cm9rZV9XaWR0aC5qcz8xZjcxIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfd2FybmluZ19GaWxsX0NvbG9yLmpzP2Q4NGUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV93YXJuaW5nX3N0cm9rZV9Db2xvci5qcz82ODg0Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfd2FybmluZ19zdHJva2VfV2lkdGguanM/Yzg2NyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2J1bGxldF9ncm91cF90aXRsZV9kaXZpZGVyX0ZpbGxfQ29sb3IuanM/MTdmOSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2J1bGxldF9ncm91cF90aXRsZV9kaXZpZGVyX3N0cm9rZV9Db2xvci5qcz9jM2MyIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X2dyb3VwX3RpdGxlX2RpdmlkZXJfc3Ryb2tlX1dpZHRoLmpzPzRlODAiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9yZWRfMTAwLmpzPzg3M2YiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9yZWRfMjAwLmpzPzVjNWEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9yZWRfMzAwLmpzP2ZiOWYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9yZWRfNDAwLmpzP2M1ODMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9yZWRfNTAwLmpzPzI5Y2QiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvdGhlbWVzL2J1bGxldC10aGVtZS5qcz9kZGRhIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfcGllX0hlaWdodC5qcz85ZWJiIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfcGllX2FuZ2xlX1BhZGRpbmcuanM/ZTU5NiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2RvbnV0X3BpZV9QYWRkaW5nLmpzPzNmN2EiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9kb251dF9waWVfV2lkdGguanM/NDEyMyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUaGVtZS90aGVtZXMvZG9udXQtdGhlbWUuanM/Y2YyMiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3RocmVzaG9sZF9zdHJva2VfZGFzaF9hcnJheS5qcz81NzgzIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdGhyZXNob2xkX3N0cm9rZV9XaWR0aC5qcz8xNmIxIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydFRoZW1lL3RoZW1lcy90aHJlc2hvbGQtdGhlbWUuanM/Njc1NyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2RvbnV0X3RocmVzaG9sZF9maXJzdF9Db2xvci5qcz8xODI2Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdGhyZXNob2xkX3NlY29uZF9Db2xvci5qcz9kNThmIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdGhyZXNob2xkX3RoaXJkX0NvbG9yLmpzPzY4ZTQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9kb251dF90aHJlc2hvbGRfZHluYW1pY19waWVfSGVpZ2h0LmpzPzBlN2UiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9kb251dF90aHJlc2hvbGRfZHluYW1pY19waWVfUGFkZGluZy5qcz8xZTczIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdGhyZXNob2xkX2R5bmFtaWNfcGllX1dpZHRoLmpzP2RiM2EiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9kb251dF90aHJlc2hvbGRfc3RhdGljX3BpZV9IZWlnaHQuanM/MjhlMSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2RvbnV0X3RocmVzaG9sZF9zdGF0aWNfcGllX2FuZ2xlX1BhZGRpbmcuanM/OGE2NCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2RvbnV0X3RocmVzaG9sZF9zdGF0aWNfcGllX1BhZGRpbmcuanM/NmEyZCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2RvbnV0X3RocmVzaG9sZF9zdGF0aWNfcGllX1dpZHRoLmpzPzhmNjkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvdGhlbWVzL2RvbnV0LXRocmVzaG9sZC10aGVtZS5qcz8yODUxIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdXRpbGl6YXRpb25fZHluYW1pY19waWVfSGVpZ2h0LmpzPzNmOTciLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9kb251dF91dGlsaXphdGlvbl9keW5hbWljX3BpZV9hbmdsZV9QYWRkaW5nLmpzP2I3OTMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9kb251dF91dGlsaXphdGlvbl9keW5hbWljX3BpZV9QYWRkaW5nLmpzPzM0NDAiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9kb251dF91dGlsaXphdGlvbl9keW5hbWljX3BpZV9XaWR0aC5qcz85NDJkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdXRpbGl6YXRpb25fc3RhdGljX3BpZV9QYWRkaW5nLmpzPzYzMDUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvdGhlbWVzL2RvbnV0LXV0aWxpemF0aW9uLXRoZW1lLmpzPzMxYjYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvQ2hhcnRUaGVtZS5qcz81ZWRkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydFV0aWxzL2NoYXJ0LXRoZW1lLmpzPzRiNGIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VXRpbHMvY2hhcnQtaGVscGVycy5qcz8yOGU0Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydENvbnRhaW5lci9DaGFydENvbnRhaW5lci5qcz9hNmI0Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWxlZ2VuZC9lcy9oZWxwZXItbWV0aG9kcy5qcz80M2Q5Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNvcmUvZXMvdmljdG9yeS1wcmltaXRpdmVzL2JvcmRlci5qcz82YWRiIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNvcmUvZXMvdmljdG9yeS11dGlsL3BvaW50LXBhdGgtaGVscGVycy5qcz81YTc1Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNvcmUvZXMvdmljdG9yeS1wcmltaXRpdmVzL3BvaW50LmpzP2E4MjkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktbGVnZW5kL2VzL3ZpY3RvcnktbGVnZW5kLmpzP2Q3YjQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9nbG9iYWxfbGFiZWxfTWFyZ2luLmpzPzc3ZjkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9sZWdlbmRfcG9zaXRpb24uanM/OGRjMCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUaGVtZS9zdHlsZXMvY29tbW9uLXN0eWxlcy5qcz9kNDIyIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X2F4aXNfdGlja19jb3VudC5qcz81NTQyIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfV2lkdGguanM/MmE4NiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX2Vycm9yX1dpZHRoLmpzP2ZjNGMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV93YXJuaW5nX1dpZHRoLmpzPzkyZjEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9idWxsZXRfbGFiZWxfc3VidGl0bGVfRmlsbC5qcz81ZWE2Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X3ByaW1hcnlfbWVhc3VyZV9kb3Rfc2l6ZS5qcz85YjQ0Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X3ByaW1hcnlfbWVhc3VyZV9zZWdtZW50ZWRfV2lkdGguanM/NDU2MCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2J1bGxldF9xdWFsaXRhdGl2ZV9yYW5nZV9XaWR0aC5qcz8yNjJkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZ2xvYmFsX0ZvbnRTaXplXzJ4bC5qcz82NDI0Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZ2xvYmFsX0ZvbnRTaXplX2xnLmpzPzM2YzMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvc3R5bGVzL2J1bGxldC1zdHlsZXMuanM/MDBmYiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2RvbnV0X2xhYmVsX3N1YnRpdGxlX0ZpbGwuanM/ZmQxNSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2RvbnV0X2xhYmVsX3N1YnRpdGxlX3Bvc2l0aW9uLmpzP2Q5MDEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvc3R5bGVzL2RvbnV0LXN0eWxlcy5qcz80ZjBhIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdGhyZXNob2xkX3dhcm5pbmdfQ29sb3IuanM/YWEwZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2RvbnV0X3RocmVzaG9sZF9kYW5nZXJfQ29sb3IuanM/ODE0OCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUaGVtZS9zdHlsZXMvZG9udXQtdXRpbGl6YXRpb24tc3R5bGVzLmpzP2RlMTgiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9nbG9iYWxfRm9udFdlaWdodF9ib2xkLmpzPzBlNTgiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvc3R5bGVzL2xlZ2VuZC10b29sdGlwLXN0eWxlcy5qcz81ZTk2Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfc2NhdHRlcl9hY3RpdmVfc2l6ZS5qcz85ZTY1Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfc2NhdHRlcl9zaXplLmpzPzk4YmYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvc3R5bGVzL3NjYXR0ZXItc3R5bGVzLmpzP2Q5NWYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvQ2hhcnRTdHlsZXMuanM/NzkzMiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRMYWJlbC9DaGFydExhYmVsLmpzPzVkM2UiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0UG9pbnQvcGF0aC1oZWxwZXJzLmpzPzQ4NzEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0UG9pbnQvQ2hhcnRQb2ludC5qcz9kN2U0Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydExlZ2VuZC9DaGFydExlZ2VuZC5qcz9lZmE0Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydFV0aWxzL2NoYXJ0LXBhZGRpbmcuanM/N2U1NyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRVdGlscy9jaGFydC1vcmlnaW4uanM/Yzk1YSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRVdGlscy9jaGFydC1sYWJlbC5qcz9mYjZkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydFV0aWxzL2NoYXJ0LWxlZ2VuZC5qcz85NDcwIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydC9DaGFydC5qcz81NmJkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydC9pbmRleC5qcz9iYjllIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWFyZWEvZXMvaGVscGVyLW1ldGhvZHMuanM/YjAwOCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtcGF0aC9zcmMvcGF0aC5qcz9lYWRjIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY29uc3RhbnQuanM/ZDhhZCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL21hdGguanM/MDk4NiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2FyYy5qcz82NTBjIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvbGluZWFyLmpzPzQ4MzAiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9wb2ludC5qcz9mZGE0Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvbGluZS5qcz9mYWU4Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJlYS5qcz9lMzhjIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvZGVzY2VuZGluZy5qcz84ODQ3Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvaWRlbnRpdHkuanM/MTkwNiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3BpZS5qcz84OGYxIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvcmFkaWFsLmpzPzI2NzAiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9saW5lUmFkaWFsLmpzPzRjOGQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9hcmVhUmFkaWFsLmpzPzFhOTQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9wb2ludFJhZGlhbC5qcz8xMzI0Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJyYXkuanM/ODJhYyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2xpbmsvaW5kZXguanM/MWE4OCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC9jaXJjbGUuanM/MWFmMCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC9jcm9zcy5qcz9hMGFjIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvc3ltYm9sL2RpYW1vbmQuanM/OWFjZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC9zdGFyLmpzPzA4MDMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9zeW1ib2wvc3F1YXJlLmpzP2Q1YTciLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9zeW1ib2wvdHJpYW5nbGUuanM/YWU0MCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC93eWUuanM/YzQ5NCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL3N5bWJvbC5qcz85MTUwIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvbm9vcC5qcz9kMGFlIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvYmFzaXMuanM/OGM4MCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2Jhc2lzQ2xvc2VkLmpzPzlhZTYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9iYXNpc09wZW4uanM/ZDY3NSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2J1bmRsZS5qcz83Nzg0Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvY2FyZGluYWwuanM/Nzc5MiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2NhcmRpbmFsQ2xvc2VkLmpzPzNiNGQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9jYXJkaW5hbE9wZW4uanM/YjBhZCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2NhdG11bGxSb20uanM/MjljOCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2NhdG11bGxSb21DbG9zZWQuanM/NTY0NCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2NhdG11bGxSb21PcGVuLmpzPzQzOGQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9saW5lYXJDbG9zZWQuanM/Y2MzZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL21vbm90b25lLmpzP2E0YmQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9uYXR1cmFsLmpzP2E4NGQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9zdGVwLmpzPzdiZDYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9vZmZzZXQvbm9uZS5qcz9kMTNlIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvb3JkZXIvbm9uZS5qcz9hYWFhIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvc3RhY2suanM/YzA4YiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL29mZnNldC9leHBhbmQuanM/MWEzNCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL29mZnNldC9kaXZlcmdpbmcuanM/ZTFiOSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL29mZnNldC9zaWxob3VldHRlLmpzPzM2ZGMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9vZmZzZXQvd2lnZ2xlLmpzP2YxZTIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9vcmRlci9hcHBlYXJhbmNlLmpzPzRmNWUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9vcmRlci9hc2NlbmRpbmcuanM/NWFlMCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL29yZGVyL2Rlc2NlbmRpbmcuanM/ZjVjZiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL29yZGVyL2luc2lkZU91dC5qcz8zYThlIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvb3JkZXIvcmV2ZXJzZS5qcz81MDU2Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvaW5kZXguanM/ZjFkZiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1hcmVhL2VzL2FyZWEuanM/NmUyZCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jb3JlL2VzL3ZpY3RvcnktcHJpbWl0aXZlcy9jbGlwLXBhdGguanM/Y2ExZCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1jb3JlL2VzL3ZpY3RvcnktY2xpcC1jb250YWluZXIvdmljdG9yeS1jbGlwLWNvbnRhaW5lci5qcz8wMTMyIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNvcmUvZXMvdmljdG9yeS11dGlsL2RlZmF1bHQtdHJhbnNpdGlvbnMuanM/MjdhYSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1hcmVhL2VzL3ZpY3RvcnktYXJlYS5qcz9jMDRlIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydEFyZWEvQ2hhcnRBcmVhLmpzP2UxZTAiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0QXJlYS9pbmRleC5qcz9iOTc2Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydEF4aXMvQ2hhcnRBeGlzLmpzPzhlZTYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0QXhpcy9pbmRleC5qcz8zZmVjIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWJhci9lcy9oZWxwZXItbWV0aG9kcy5qcz83MGQzIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWJhci9lcy9iYXItaGVscGVyLW1ldGhvZHMuanM/YWEyMyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1iYXIvZXMvZ2VvbWV0cnktaGVscGVyLW1ldGhvZHMuanM/NGIzZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1iYXIvZXMvcGF0aC1oZWxwZXItbWV0aG9kcy5qcz84YzVkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWJhci9lcy9iYXIuanM/Njg3ZCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1iYXIvZXMvdmljdG9yeS1iYXIuanM/Y2IyZiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRCYXIvQ2hhcnRCYXIuanM/NTE5ZCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRCYXIvaW5kZXguanM/MzJjZCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRCdWxsZXQvdXRpbHMvY2hhcnQtYnVsbGV0LXNpemUuanM/NWU0YSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRVdGlscy9jaGFydC1kb21haW4uanM/OTcyZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRCdWxsZXQvdXRpbHMvY2hhcnQtYnVsbGV0LWRvbWFpbi5qcz8wOGJlIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydEJ1bGxldC91dGlscy9jaGFydC1idWxsZXQtZGF0YS5qcz9kNWVjIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydEJ1bGxldC91dGlscy9jaGFydC1idWxsZXQtdGhlbWUuanM/ZGYyMiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS10b29sdGlwL2VzL2ZseW91dC5qcz9mOTc4Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LXRvb2x0aXAvZXMvdmljdG9yeS10b29sdGlwLmpzPzFkOTgiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VG9vbHRpcC9DaGFydFRvb2x0aXAuanM/MTcwNiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRCdWxsZXQvQ2hhcnRCdWxsZXRDb21wYXJhdGl2ZU1lYXN1cmUuanM/NTEzOSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRCdWxsZXQvQ2hhcnRCdWxsZXRDb21wYXJhdGl2ZUVycm9yTWVhc3VyZS5qcz81NjU2Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydEJ1bGxldC9DaGFydEJ1bGxldENvbXBhcmF0aXZlV2FybmluZ01lYXN1cmUuanM/NmU4ZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRCdWxsZXQvQ2hhcnRCdWxsZXRHcm91cFRpdGxlLmpzPzM4MTUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3Rvcnktc2NhdHRlci9lcy9oZWxwZXItbWV0aG9kcy5qcz84MzNhIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LXNjYXR0ZXIvZXMvdmljdG9yeS1zY2F0dGVyLmpzPzgyOTIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0U2NhdHRlci9DaGFydFNjYXR0ZXIuanM/ZmU5YiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRCdWxsZXQvQ2hhcnRCdWxsZXRQcmltYXJ5RG90TWVhc3VyZS5qcz9iMDJjIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydEJ1bGxldC9DaGFydEJ1bGxldFByaW1hcnlTZWdtZW50ZWRNZWFzdXJlLmpzPzAzY2IiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0QnVsbGV0L0NoYXJ0QnVsbGV0UXVhbGl0YXRpdmVSYW5nZS5qcz9mYTY5Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydEJ1bGxldC9DaGFydEJ1bGxldFRpdGxlLmpzPzgyOWMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0QnVsbGV0L0NoYXJ0QnVsbGV0LmpzPzZhYjEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0QnVsbGV0L2luZGV4LmpzPzUyNTMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0Q29udGFpbmVyL2luZGV4LmpzPzdlYWMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXV0aWwvc2VsZWN0aW9uLmpzPzlhYWMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY3Vyc29yLWNvbnRhaW5lci9lcy9jdXJzb3ItaGVscGVycy5qcz8wNzNmIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWN1cnNvci1jb250YWluZXIvZXMvdmljdG9yeS1jdXJzb3ItY29udGFpbmVyLmpzP2YzNjkiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0Q3Vyc29yQ29udGFpbmVyL0NoYXJ0Q3Vyc29yQ29udGFpbmVyLmpzPzE0YzUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0Q3Vyc29yQ29udGFpbmVyL2luZGV4LmpzP2Q5NGYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0Q3Vyc29yVG9vbHRpcC9DaGFydEN1cnNvckZseW91dC5qcz8wZGE4Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydFV0aWxzL2NoYXJ0LXRvb2x0aXAuanM/MzhiYyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRDdXJzb3JUb29sdGlwL0NoYXJ0Q3Vyc29yVG9vbHRpcC5qcz80Mzc1Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydEN1cnNvclRvb2x0aXAvaW5kZXguanM/NzgwMSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1waWUvZXMvc2xpY2UuanM/MmU3YyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1waWUvZXMvaGVscGVyLW1ldGhvZHMuanM/OTRjMSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1waWUvZXMvdmljdG9yeS1waWUuanM/YmY5YiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRQaWUvQ2hhcnRQaWUuanM/MjdkNyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnREb251dC9DaGFydERvbnV0LmpzP2E2YWYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0RG9udXQvaW5kZXguanM/YWU0ZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnREb251dFV0aWxpemF0aW9uL0NoYXJ0RG9udXRUaHJlc2hvbGQuanM/OTRmOSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnREb251dFV0aWxpemF0aW9uL0NoYXJ0RG9udXRVdGlsaXphdGlvbi5qcz9iYjU3Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydERvbnV0VXRpbGl6YXRpb24vaW5kZXguanM/Y2UxYiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1ncm91cC9lcy9oZWxwZXItbWV0aG9kcy5qcz9lODczIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWdyb3VwL2VzL3ZpY3RvcnktZ3JvdXAuanM/OGRhNiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRHcm91cC9DaGFydEdyb3VwLmpzPzgyNmEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0R3JvdXAvaW5kZXguanM/MjM1OSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRMYWJlbC9pbmRleC5qcz8xM2FiIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydExlZ2VuZC9pbmRleC5qcz9mMjkyIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydExlZ2VuZFRvb2x0aXAvQ2hhcnRMZWdlbmRUb29sdGlwTGFiZWwuanM/YTBmMiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRMZWdlbmRUb29sdGlwL0NoYXJ0TGVnZW5kVG9vbHRpcENvbnRlbnQuanM/ZTdiZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRMZWdlbmRUb29sdGlwL0NoYXJ0TGVnZW5kVG9vbHRpcC5qcz9lZjZjIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydExlZ2VuZFRvb2x0aXAvaW5kZXguanM/YWMxZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1saW5lL2VzL2hlbHBlci1tZXRob2RzLmpzPzAxZDQiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktY29yZS9lcy92aWN0b3J5LXV0aWwvbGluZS1oZWxwZXJzLmpzP2RlODMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3RvcnktbGluZS9lcy9jdXJ2ZS5qcz8zMTdmIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWxpbmUvZXMvdmljdG9yeS1saW5lLmpzP2ZhMjciLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0TGluZS9DaGFydExpbmUuanM/M2EyZCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRMaW5lL2luZGV4LmpzP2M1ODciLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0UGllL2luZGV4LmpzP2NjN2MiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0UG9pbnQvaW5kZXguanM/ZWU2MyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRTY2F0dGVyL2luZGV4LmpzP2Q4MDIiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3Rvcnktc3RhY2svZXMvaGVscGVyLW1ldGhvZHMuanM/MmQ3ZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1zdGFjay9lcy92aWN0b3J5LXN0YWNrLmpzPzQwMzgiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0U3RhY2svQ2hhcnRTdGFjay5qcz8zNTRkIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydFN0YWNrL2luZGV4LmpzPzhjZjEiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0VGhlbWUvaW5kZXguanM/MmJjYSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUaHJlc2hvbGQvQ2hhcnRUaHJlc2hvbGQuanM/ZDk4ZSIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUaHJlc2hvbGQvaW5kZXguanM/MTcxNiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRUb29sdGlwL2luZGV4LmpzP2RkMzYiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3Rvcnktdm9yb25vaS1jb250YWluZXIvZXMvdm9yb25vaS1oZWxwZXJzLmpzP2ExODAiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3Rvcnktdm9yb25vaS1jb250YWluZXIvZXMvdmljdG9yeS12b3Jvbm9pLWNvbnRhaW5lci5qcz9lZmZhIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LXpvb20tY29udGFpbmVyL2VzL3pvb20taGVscGVycy5qcz9hOTZmIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LXpvb20tY29udGFpbmVyL2VzL3ZpY3Rvcnktem9vbS1jb250YWluZXIuanM/OGU3YyIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1zZWxlY3Rpb24tY29udGFpbmVyL2VzL3NlbGVjdGlvbi1oZWxwZXJzLmpzPzE3YmMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL3ZpY3Rvcnktc2VsZWN0aW9uLWNvbnRhaW5lci9lcy92aWN0b3J5LXNlbGVjdGlvbi1jb250YWluZXIuanM/ODZhOCIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvdmljdG9yeS1icnVzaC1jb250YWluZXIvZXMvYnJ1c2gtaGVscGVycy5qcz9kNjFlIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWJydXNoLWNvbnRhaW5lci9lcy92aWN0b3J5LWJydXNoLWNvbnRhaW5lci5qcz8wY2U3Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy92aWN0b3J5LWNyZWF0ZS1jb250YWluZXIvZXMvY3JlYXRlLWNvbnRhaW5lci5qcz82Njk3Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydFV0aWxzL2NoYXJ0LWNvbnRhaW5lci5qcz81YzkwIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydFV0aWxzL2NoYXJ0LWludGVyYWN0aXZlLWxlZ2VuZC5qcz8wNmYzIiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydFV0aWxzL2NoYXJ0LXJlc2l6ZS5qcz81NzM0Iiwid2VicGFjazovL0BwYXR0ZXJuZmx5L3BhdHRlcm5mbHktYTExeS8uL25vZGVfbW9kdWxlcy9AcGF0dGVybmZseS9yZWFjdC1jaGFydHMvZGlzdC9lc20vY29tcG9uZW50cy9DaGFydFV0aWxzL2luZGV4LmpzPzI0YWUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL0NoYXJ0Vm9yb25vaUNvbnRhaW5lci9DaGFydFZvcm9ub2lDb250YWluZXIuanM/MTQ3ZiIsIndlYnBhY2s6Ly9AcGF0dGVybmZseS9wYXR0ZXJuZmx5LWExMXkvLi9ub2RlX21vZHVsZXMvQHBhdHRlcm5mbHkvcmVhY3QtY2hhcnRzL2Rpc3QvZXNtL2NvbXBvbmVudHMvQ2hhcnRWb3Jvbm9pQ29udGFpbmVyL2luZGV4LmpzPzBlYWUiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9jb21wb25lbnRzL2luZGV4LmpzPzliOGMiLCJ3ZWJwYWNrOi8vQHBhdHRlcm5mbHkvcGF0dGVybmZseS1hMTF5Ly4vbm9kZV9tb2R1bGVzL0BwYXR0ZXJuZmx5L3JlYWN0LWNoYXJ0cy9kaXN0L2VzbS9pbmRleC5qcz9iMjZkIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBjaGFydF9sZWdlbmRfTWFyZ2luID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWxlZ2VuZC0tTWFyZ2luXCIsXG4gIFwidmFsdWVcIjogMTYsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtbGVnZW5kLS1NYXJnaW4pXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9sZWdlbmRfTWFyZ2luOyIsImltcG9ydCBfa2V5cyBmcm9tIFwibG9kYXNoL2tleXNcIjtcbmltcG9ydCBfYXNzaWduIGZyb20gXCJsb2Rhc2gvYXNzaWduXCI7XG5pbXBvcnQgX3BpY2sgZnJvbSBcImxvZGFzaC9waWNrXCI7XG5pbXBvcnQgX3Byb3BlcnR5IGZyb20gXCJsb2Rhc2gvcHJvcGVydHlcIjtcbmltcG9ydCBfaXNGdW5jdGlvbiBmcm9tIFwibG9kYXNoL2lzRnVuY3Rpb25cIjtcbmltcG9ydCBfZGVmYXVsdHMgZnJvbSBcImxvZGFzaC9kZWZhdWx0c1wiO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbi8vIFByaXZhdGUgRnVuY3Rpb25zXG5mdW5jdGlvbiBnZXRDYXJ0ZXNpYW5SYW5nZShwcm9wcywgYXhpcykge1xuICAvLyBkZXRlcm1pbmUgaG93IHRvIGxheSB0aGUgYXhpcyBhbmQgd2hhdCBkaXJlY3Rpb24gcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGFyZVxuICB2YXIgdmVydGljYWwgPSBheGlzICE9PSBcInhcIjtcbiAgdmFyIHBhZGRpbmcgPSBnZXRQYWRkaW5nKHByb3BzKTtcblxuICBpZiAodmVydGljYWwpIHtcbiAgICByZXR1cm4gW3Byb3BzLmhlaWdodCAtIHBhZGRpbmcuYm90dG9tLCBwYWRkaW5nLnRvcF07XG4gIH1cblxuICByZXR1cm4gW3BhZGRpbmcubGVmdCwgcHJvcHMud2lkdGggLSBwYWRkaW5nLnJpZ2h0XTtcbn1cblxuZnVuY3Rpb24gZ2V0UG9sYXJSYW5nZShwcm9wcywgYXhpcykge1xuICBpZiAoYXhpcyA9PT0gXCJ4XCIpIHtcbiAgICB2YXIgc3RhcnRBbmdsZSA9IGRlZ3JlZXNUb1JhZGlhbnMocHJvcHMuc3RhcnRBbmdsZSB8fCAwKTtcbiAgICB2YXIgZW5kQW5nbGUgPSBkZWdyZWVzVG9SYWRpYW5zKHByb3BzLmVuZEFuZ2xlIHx8IDM2MCk7XG4gICAgcmV0dXJuIFtzdGFydEFuZ2xlLCBlbmRBbmdsZV07XG4gIH1cblxuICByZXR1cm4gW3Byb3BzLmlubmVyUmFkaXVzIHx8IDAsIGdldFJhZGl1cyhwcm9wcyldO1xufSAvLyBFeHBvcnRlZCBGdW5jdGlvbnNcblxuLyoqXG4gKiBjcmVhdGVzIGFuIG9iamVjdCB3aXRoIHNvbWUga2V5cyBleGNsdWRlZFxuICogcmVwbGFjZW1lbnQgZm9yIGxvZGFzaC5vbWl0IGZvciBwZXJmb3JtYW5jZS4gZG9lcyBub3QgbWltaWNrIHRoZSBlbnRpcmUgbG9kYXNoLm9taXQgYXBpXG4gKiBAcGFyYW0ge09iamVjdH0gb3JpZ2luYWxPYmplY3Q6IGNyZWF0ZWQgb2JqZWN0IHdpbGwgYmUgYmFzZWQgb24gdGhpcyBvYmplY3RcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0ga3M6IGFuIGFycmF5IG9mIGtleXMgdG8gb21pdCBmcm9tIHRoZSBuZXcgb2JqZWN0XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBuZXcgb2JqZWN0IHdpdGggc2FtZSBwcm9wZXJ0aWVzIGFzIG9yaWdpbmFsT2JqZWN0XG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gb21pdChvcmlnaW5hbE9iamVjdCkge1xuICB2YXIga3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdO1xuICAvLyBjb2RlIGJhc2VkIG9uIGJhYmVsJ3MgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXG4gIHZhciBuZXdPYmplY3QgPSB7fTtcblxuICBmb3IgKHZhciBrZXkgaW4gb3JpZ2luYWxPYmplY3QpIHtcbiAgICBpZiAoa3MuaW5kZXhPZihrZXkpID49IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9yaWdpbmFsT2JqZWN0LCBrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBuZXdPYmplY3Rba2V5XSA9IG9yaWdpbmFsT2JqZWN0W2tleV07XG4gIH1cblxuICByZXR1cm4gbmV3T2JqZWN0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBvaW50KGRhdHVtKSB7XG4gIHZhciBleGlzdHMgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkO1xuICB9O1xuXG4gIHZhciBfeCA9IGRhdHVtLl94LFxuICAgICAgX3gxID0gZGF0dW0uX3gxLFxuICAgICAgX3gwID0gZGF0dW0uX3gwLFxuICAgICAgX3Zvcm9ub2lYID0gZGF0dW0uX3Zvcm9ub2lYLFxuICAgICAgX3kgPSBkYXR1bS5feSxcbiAgICAgIF95MSA9IGRhdHVtLl95MSxcbiAgICAgIF95MCA9IGRhdHVtLl95MCxcbiAgICAgIF92b3Jvbm9pWSA9IGRhdHVtLl92b3Jvbm9pWTtcbiAgdmFyIGRlZmF1bHRYID0gZXhpc3RzKF94MSkgPyBfeDEgOiBfeDtcbiAgdmFyIGRlZmF1bHRZID0gZXhpc3RzKF95MSkgPyBfeTEgOiBfeTtcbiAgdmFyIHBvaW50ID0ge1xuICAgIHg6IGV4aXN0cyhfdm9yb25vaVgpID8gX3Zvcm9ub2lYIDogZGVmYXVsdFgsXG4gICAgeDA6IGV4aXN0cyhfeDApID8gX3gwIDogX3gsXG4gICAgeTogZXhpc3RzKF92b3Jvbm9pWSkgPyBfdm9yb25vaVkgOiBkZWZhdWx0WSxcbiAgICB5MDogZXhpc3RzKF95MCkgPyBfeTAgOiBfeVxuICB9O1xuICByZXR1cm4gX2RlZmF1bHRzKHt9LCBwb2ludCwgZGF0dW0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlUG9pbnQocHJvcHMsIGRhdHVtKSB7XG4gIHZhciBzY2FsZSA9IHByb3BzLnNjYWxlLFxuICAgICAgcG9sYXIgPSBwcm9wcy5wb2xhcixcbiAgICAgIGhvcml6b250YWwgPSBwcm9wcy5ob3Jpem9udGFsO1xuICB2YXIgZCA9IGdldFBvaW50KGRhdHVtKTtcbiAgdmFyIG9yaWdpbiA9IHByb3BzLm9yaWdpbiB8fCB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG4gIHZhciB4ID0gaG9yaXpvbnRhbCA/IHNjYWxlLnkoZC55KSA6IHNjYWxlLngoZC54KTtcbiAgdmFyIHgwID0gaG9yaXpvbnRhbCA/IHNjYWxlLnkoZC55MCkgOiBzY2FsZS54KGQueDApO1xuICB2YXIgeSA9IGhvcml6b250YWwgPyBzY2FsZS54KGQueCkgOiBzY2FsZS55KGQueSk7XG4gIHZhciB5MCA9IGhvcml6b250YWwgPyBzY2FsZS54KGQueDApIDogc2NhbGUueShkLnkwKTtcbiAgcmV0dXJuIHtcbiAgICB4OiBwb2xhciA/IHkgKiBNYXRoLmNvcyh4KSArIG9yaWdpbi54IDogeCxcbiAgICB4MDogcG9sYXIgPyB5MCAqIE1hdGguY29zKHgwKSArIG9yaWdpbi54IDogeDAsXG4gICAgeTogcG9sYXIgPyAteSAqIE1hdGguc2luKHgpICsgb3JpZ2luLnkgOiB5LFxuICAgIHkwOiBwb2xhciA/IC15MCAqIE1hdGguc2luKHgwKSArIG9yaWdpbi54IDogeTBcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWRkaW5nKHByb3BzKSB7XG4gIHZhciBuYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBcInBhZGRpbmdcIjtcbiAgdmFyIHBhZGRpbmcgPSBwcm9wc1tuYW1lXTtcbiAgdmFyIHBhZGRpbmdWYWwgPSB0eXBlb2YgcGFkZGluZyA9PT0gXCJudW1iZXJcIiA/IHBhZGRpbmcgOiAwO1xuICB2YXIgcGFkZGluZ09iaiA9IHR5cGVvZiBwYWRkaW5nID09PSBcIm9iamVjdFwiID8gcGFkZGluZyA6IHt9O1xuICByZXR1cm4ge1xuICAgIHRvcDogcGFkZGluZ09iai50b3AgfHwgcGFkZGluZ1ZhbCxcbiAgICBib3R0b206IHBhZGRpbmdPYmouYm90dG9tIHx8IHBhZGRpbmdWYWwsXG4gICAgbGVmdDogcGFkZGluZ09iai5sZWZ0IHx8IHBhZGRpbmdWYWwsXG4gICAgcmlnaHQ6IHBhZGRpbmdPYmoucmlnaHQgfHwgcGFkZGluZ1ZhbFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVG9vbHRpcChjb21wb25lbnQpIHtcbiAgdmFyIGxhYmVsUm9sZSA9IGNvbXBvbmVudCAmJiBjb21wb25lbnQudHlwZSAmJiBjb21wb25lbnQudHlwZS5yb2xlO1xuICByZXR1cm4gbGFiZWxSb2xlID09PSBcInRvb2x0aXBcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0U3R5bGVzKHByb3BzLCByb2xlKSB7XG4gIHZhciBfcHJvcHMkdGhlbWUgPSBwcm9wcy50aGVtZSxcbiAgICAgIHRoZW1lID0gX3Byb3BzJHRoZW1lID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyR0aGVtZSxcbiAgICAgIGxhYmVsQ29tcG9uZW50ID0gcHJvcHMubGFiZWxDb21wb25lbnQ7XG4gIHZhciBkZWZhdWx0U3R5bGVzID0gdGhlbWVbcm9sZV0gJiYgdGhlbWVbcm9sZV0uc3R5bGUgfHwge307XG5cbiAgaWYgKCFpc1Rvb2x0aXAobGFiZWxDb21wb25lbnQpKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRTdHlsZXM7XG4gIH1cblxuICB2YXIgdG9vbHRpcFN0eWxlID0gdGhlbWUudG9vbHRpcCAmJiB0aGVtZS50b29sdGlwLnN0eWxlIHx8IHt9O1xuXG4gIHZhciBsYWJlbFN0eWxlID0gX2RlZmF1bHRzKHt9LCB0b29sdGlwU3R5bGUsIGRlZmF1bHRTdHlsZXMubGFiZWxzKTtcblxuICByZXR1cm4gX2RlZmF1bHRzKHt9LCB7XG4gICAgbGFiZWxzOiBsYWJlbFN0eWxlXG4gIH0sIGRlZmF1bHRTdHlsZXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlcyhzdHlsZSwgZGVmYXVsdFN0eWxlcykge1xuICB2YXIgd2lkdGggPSBcIjEwMCVcIjtcbiAgdmFyIGhlaWdodCA9IFwiMTAwJVwiO1xuXG4gIGlmICghc3R5bGUpIHtcbiAgICByZXR1cm4gX2RlZmF1bHRzKHtcbiAgICAgIHBhcmVudDoge1xuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgd2lkdGg6IHdpZHRoXG4gICAgICB9XG4gICAgfSwgZGVmYXVsdFN0eWxlcyk7XG4gIH1cblxuICB2YXIgZGF0YSA9IHN0eWxlLmRhdGEsXG4gICAgICBsYWJlbHMgPSBzdHlsZS5sYWJlbHMsXG4gICAgICBwYXJlbnQgPSBzdHlsZS5wYXJlbnQ7XG4gIHZhciBkZWZhdWx0UGFyZW50ID0gZGVmYXVsdFN0eWxlcyAmJiBkZWZhdWx0U3R5bGVzLnBhcmVudCB8fCB7fTtcbiAgdmFyIGRlZmF1bHRMYWJlbHMgPSBkZWZhdWx0U3R5bGVzICYmIGRlZmF1bHRTdHlsZXMubGFiZWxzIHx8IHt9O1xuICB2YXIgZGVmYXVsdERhdGEgPSBkZWZhdWx0U3R5bGVzICYmIGRlZmF1bHRTdHlsZXMuZGF0YSB8fCB7fTtcbiAgcmV0dXJuIHtcbiAgICBwYXJlbnQ6IF9kZWZhdWx0cyh7fSwgcGFyZW50LCBkZWZhdWx0UGFyZW50LCB7XG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH0pLFxuICAgIGxhYmVsczogX2RlZmF1bHRzKHt9LCBsYWJlbHMsIGRlZmF1bHRMYWJlbHMpLFxuICAgIGRhdGE6IF9kZWZhdWx0cyh7fSwgZGF0YSwgZGVmYXVsdERhdGEpXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVQcm9wKHByb3AsIHByb3BzKSB7XG4gIHJldHVybiBfaXNGdW5jdGlvbihwcm9wKSA/IHByb3AocHJvcHMpIDogcHJvcDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZVN0eWxlKHN0eWxlLCBwcm9wcykge1xuICBpZiAocHJvcHMuZGlzYWJsZUlubGluZVN0eWxlcykge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGlmICghc3R5bGUgfHwgIV9rZXlzKHN0eWxlKS5zb21lKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBfaXNGdW5jdGlvbihzdHlsZVt2YWx1ZV0pO1xuICB9KSkge1xuICAgIHJldHVybiBzdHlsZTtcbiAgfVxuXG4gIHJldHVybiBfa2V5cyhzdHlsZSkucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXJyKSB7XG4gICAgcHJldltjdXJyXSA9IGV2YWx1YXRlUHJvcChzdHlsZVtjdXJyXSwgcHJvcHMpO1xuICAgIHJldHVybiBwcmV2O1xuICB9LCB7fSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVncmVlc1RvUmFkaWFucyhkZWdyZWVzKSB7XG4gIHJldHVybiB0eXBlb2YgZGVncmVlcyA9PT0gXCJudW1iZXJcIiA/IGRlZ3JlZXMgKiAoTWF0aC5QSSAvIDE4MCkgOiBkZWdyZWVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJhZGlhbnNUb0RlZ3JlZXMocmFkaWFucykge1xuICByZXR1cm4gdHlwZW9mIHJhZGlhbnMgPT09IFwibnVtYmVyXCIgPyByYWRpYW5zIC8gKE1hdGguUEkgLyAxODApIDogcmFkaWFucztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYWRpdXMocHJvcHMpIHtcbiAgdmFyIF9nZXRQYWRkaW5nID0gZ2V0UGFkZGluZyhwcm9wcyksXG4gICAgICBsZWZ0ID0gX2dldFBhZGRpbmcubGVmdCxcbiAgICAgIHJpZ2h0ID0gX2dldFBhZGRpbmcucmlnaHQsXG4gICAgICB0b3AgPSBfZ2V0UGFkZGluZy50b3AsXG4gICAgICBib3R0b20gPSBfZ2V0UGFkZGluZy5ib3R0b207XG5cbiAgdmFyIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgICBoZWlnaHQgPSBwcm9wcy5oZWlnaHQ7XG4gIHJldHVybiBNYXRoLm1pbih3aWR0aCAtIGxlZnQgLSByaWdodCwgaGVpZ2h0IC0gdG9wIC0gYm90dG9tKSAvIDI7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9sYXJPcmlnaW4ocHJvcHMpIHtcbiAgdmFyIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgICBoZWlnaHQgPSBwcm9wcy5oZWlnaHQ7XG5cbiAgdmFyIF9nZXRQYWRkaW5nMiA9IGdldFBhZGRpbmcocHJvcHMpLFxuICAgICAgdG9wID0gX2dldFBhZGRpbmcyLnRvcCxcbiAgICAgIGJvdHRvbSA9IF9nZXRQYWRkaW5nMi5ib3R0b20sXG4gICAgICBsZWZ0ID0gX2dldFBhZGRpbmcyLmxlZnQsXG4gICAgICByaWdodCA9IF9nZXRQYWRkaW5nMi5yaWdodDtcblxuICB2YXIgcmFkaXVzID0gTWF0aC5taW4od2lkdGggLSBsZWZ0IC0gcmlnaHQsIGhlaWdodCAtIHRvcCAtIGJvdHRvbSkgLyAyO1xuICB2YXIgb2Zmc2V0V2lkdGggPSB3aWR0aCAvIDIgKyBsZWZ0IC0gcmlnaHQ7XG4gIHZhciBvZmZzZXRIZWlnaHQgPSBoZWlnaHQgLyAyICsgdG9wIC0gYm90dG9tO1xuICByZXR1cm4ge1xuICAgIHg6IG9mZnNldFdpZHRoICsgcmFkaXVzID4gd2lkdGggPyByYWRpdXMgKyBsZWZ0IC0gcmlnaHQgOiBvZmZzZXRXaWR0aCxcbiAgICB5OiBvZmZzZXRIZWlnaHQgKyByYWRpdXMgPiBoZWlnaHQgPyByYWRpdXMgKyB0b3AgLSBib3R0b20gOiBvZmZzZXRIZWlnaHRcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYW5nZShwcm9wcywgYXhpcykge1xuICBpZiAocHJvcHMucmFuZ2UgJiYgcHJvcHMucmFuZ2VbYXhpc10pIHtcbiAgICByZXR1cm4gcHJvcHMucmFuZ2VbYXhpc107XG4gIH0gZWxzZSBpZiAocHJvcHMucmFuZ2UgJiYgQXJyYXkuaXNBcnJheShwcm9wcy5yYW5nZSkpIHtcbiAgICByZXR1cm4gcHJvcHMucmFuZ2U7XG4gIH1cblxuICByZXR1cm4gcHJvcHMucG9sYXIgPyBnZXRQb2xhclJhbmdlKHByb3BzLCBheGlzKSA6IGdldENhcnRlc2lhblJhbmdlKHByb3BzLCBheGlzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBY2Nlc3NvcihrZXkpIHtcbiAgLy8gY3JlYXRlcyBhIGRhdGEgYWNjZXNzb3IgZnVuY3Rpb25cbiAgLy8gZ2l2ZW4gYSBwcm9wZXJ0eSBrZXksIHBhdGgsIGFycmF5IGluZGV4LCBvciBudWxsIGZvciBpZGVudGl0eS5cbiAgaWYgKF9pc0Z1bmN0aW9uKGtleSkpIHtcbiAgICByZXR1cm4ga2V5O1xuICB9IGVsc2UgaWYgKGtleSA9PT0gbnVsbCB8fCBrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIG51bGwvdW5kZWZpbmVkIG1lYW5zIFwicmV0dXJuIHRoZSBkYXRhIGl0ZW0gaXRzZWxmXCJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiB4O1xuICAgIH07XG4gIH0gLy8gb3RoZXJ3aXNlLCBhc3N1bWUgaXQgaXMgYW4gYXJyYXkgaW5kZXgsIHByb3BlcnR5IGtleSBvciBwYXRoIChfLnByb3BlcnR5IGhhbmRsZXMgYWxsIHRocmVlKVxuXG5cbiAgcmV0dXJuIF9wcm9wZXJ0eShrZXkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1vZGlmeVByb3BzKHByb3BzLCBmYWxsYmFja1Byb3BzLCByb2xlKSB7XG4gIHZhciB0aGVtZSA9IHByb3BzLnRoZW1lICYmIHByb3BzLnRoZW1lW3JvbGVdID8gcHJvcHMudGhlbWVbcm9sZV0gOiB7fTtcbiAgdmFyIHRoZW1lUHJvcHMgPSBvbWl0KHRoZW1lLCBbXCJzdHlsZVwiXSk7XG4gIHZhciBob3Jpem9udGFsID0gaXNIb3Jpem9udGFsKHByb3BzKTtcbiAgdmFyIGRlZmF1bHRPYmplY3QgPSBob3Jpem9udGFsID09PSB1bmRlZmluZWQgPyB7fSA6IHtcbiAgICBob3Jpem9udGFsOiBob3Jpem9udGFsXG4gIH07XG4gIHJldHVybiBfZGVmYXVsdHMoZGVmYXVsdE9iamVjdCwgcHJvcHMsIHRoZW1lUHJvcHMsIGZhbGxiYWNrUHJvcHMpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnaXZlbiBheGlzIG9yIHRoZSBvcHBvc2l0ZSBheGlzIHdoZW4gaG9yaXpvbnRhbFxuICogQHBhcmFtIHtzdHJpbmd9IGF4aXM6IHRoZSBnaXZlbiBheGlzLCBlaXRoZXIgXCJ4XCIgcHIgXCJ5XCJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaG9yaXpvbnRhbDogdHJ1ZSB3aGVuIHRoZSBjaGFydCBpcyBmbGlwcGVkIHRvIHRoZSBob3Jpem9udGFsIG9yaWVudGF0aW9uXG4gKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgZGltZW5zaW9uIGFwcHJvcHJpYXRlIGZvciB0aGUgYXhpcyBnaXZlbiBpdHMgcHJvcHMgXCJ4XCIgb3IgXCJ5XCJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudEF4aXMoYXhpcywgaG9yaXpvbnRhbCkge1xuICB2YXIgb3RoZXJBeGlzID0gYXhpcyA9PT0gXCJ4XCIgPyBcInlcIiA6IFwieFwiO1xuICByZXR1cm4gaG9yaXpvbnRhbCA/IG90aGVyQXhpcyA6IGF4aXM7XG59XG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IGNoaWxkcmVuOiBhbiBhcnJheSBvZiBjaGlsZCBjb21wb25lbnRzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZTogYSBmdW5jdGlvbiB3aXRoIGFyZ3VtZW50cyBcImNoaWxkXCIsIFwiY2hpbGROYW1lXCIsIGFuZCBcInBhcmVudFwiXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyZW50UHJvcHM6IHByb3BzIGZyb20gdGhlIHBhcmVudCB0aGF0IGFyZSBhcHBsaWVkIHRvIGNoaWxkcmVuXG4gKiBAcGFyYW0ge2FueX0gIGluaXRpYWxNZW1vOiBUaGUgb2JqZWN0IGluIHdoaWNoIHRoZSBpdGVyYXRpb24gcmVzdWx0cyBhcmUgY29tYmluZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21iaW5lOiBDb21iaW5lcyB0aGUgcmVzdWx0IG9mIHRoZSBpdGVyYXRlZSB3aXRoIHRoZSBjdXJyZW50IG1lbW9cbiAqICAgdG8gdGhlIG1lbW8gZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiBzdGVwXG4gKiBAcmV0dXJucyB7QXJyYXl9IHJldHVybnMgYW4gYXJyYXkgb2YgcmVzdWx0cyBmcm9tIGNhbGxpbmcgdGhlIGl0ZXJhdGVlIG9uIGFsbCBuZXN0ZWQgY2hpbGRyZW5cbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtcGFyYW1zICovXG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2VDaGlsZHJlbihjaGlsZHJlbiwgaXRlcmF0ZWUpIHtcbiAgdmFyIHBhcmVudFByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIGluaXRpYWxNZW1vID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBbXTtcbiAgdmFyIGNvbWJpbmUgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IGZ1bmN0aW9uIChtZW1vLCBpdGVtKSB7XG4gICAgcmV0dXJuIG1lbW8uY29uY2F0KGl0ZW0pO1xuICB9O1xuICB2YXIgc2hhcmVkUHJvcHMgPSBbXCJkYXRhXCIsIFwiZG9tYWluXCIsIFwiY2F0ZWdvcmllc1wiLCBcInBvbGFyXCIsIFwic3RhcnRBbmdsZVwiLCBcImVuZEFuZ2xlXCIsIFwibWluRG9tYWluXCIsIFwibWF4RG9tYWluXCIsIFwiaG9yaXpvbnRhbFwiXTtcblxuICB2YXIgdHJhdmVyc2VDaGlsZHJlbiA9IGZ1bmN0aW9uIChjaGlsZEFycmF5LCBuYW1lcywgcGFyZW50KSB7XG4gICAgcmV0dXJuIGNoaWxkQXJyYXkucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBjaGlsZCwgaW5kZXgpIHtcbiAgICAgIHZhciBjaGlsZFJvbGUgPSBjaGlsZC50eXBlICYmIGNoaWxkLnR5cGUucm9sZTtcbiAgICAgIHZhciBjaGlsZE5hbWUgPSBjaGlsZC5wcm9wcy5uYW1lIHx8IFwiXCIuY29uY2F0KGNoaWxkUm9sZSwgXCItXCIpLmNvbmNhdChuYW1lc1tpbmRleF0pO1xuXG4gICAgICBpZiAoY2hpbGQucHJvcHMgJiYgY2hpbGQucHJvcHMuY2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIGNoaWxkUHJvcHMgPSBfYXNzaWduKHt9LCBjaGlsZC5wcm9wcywgX3BpY2socGFyZW50UHJvcHMsIHNoYXJlZFByb3BzKSk7XG5cbiAgICAgICAgdmFyIG5lc3RlZENoaWxkcmVuID0gY2hpbGQudHlwZSAmJiBjaGlsZC50eXBlLnJvbGUgPT09IFwic3RhY2tcIiAmJiBfaXNGdW5jdGlvbihjaGlsZC50eXBlLmdldENoaWxkcmVuKSA/IGNoaWxkLnR5cGUuZ2V0Q2hpbGRyZW4oY2hpbGRQcm9wcykgOiBSZWFjdC5DaGlsZHJlbi50b0FycmF5KGNoaWxkLnByb3BzLmNoaWxkcmVuKS5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICB2YXIgbmVzdGVkQ2hpbGRQcm9wcyA9IF9hc3NpZ24oe30sIGMucHJvcHMsIF9waWNrKGNoaWxkUHJvcHMsIHNoYXJlZFByb3BzKSk7XG5cbiAgICAgICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGMsIG5lc3RlZENoaWxkUHJvcHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2NoaWxkTmFtZXMgPSBuZXN0ZWRDaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGMsIGkpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQoY2hpbGROYW1lLCBcIi1cIikuY29uY2F0KGkpO1xuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgbmVzdGVkUmVzdWx0cyA9IHRyYXZlcnNlQ2hpbGRyZW4obmVzdGVkQ2hpbGRyZW4sIF9jaGlsZE5hbWVzLCBjaGlsZCk7XG4gICAgICAgIG1lbW8gPSBjb21iaW5lKG1lbW8sIG5lc3RlZFJlc3VsdHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdGVlKGNoaWxkLCBjaGlsZE5hbWUsIHBhcmVudCk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIG1lbW8gPSBjb21iaW5lKG1lbW8sIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfSwgaW5pdGlhbE1lbW8pO1xuICB9O1xuXG4gIHZhciBjaGlsZE5hbWVzID0gY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjLCBpKSB7XG4gICAgcmV0dXJuIGk7XG4gIH0pO1xuICByZXR1cm4gdHJhdmVyc2VDaGlsZHJlbihjaGlsZHJlbiwgY2hpbGROYW1lcyk7XG59XG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wczogdGhlIHByb3BzIG9iamVjdFxuICogQHJldHVybnMge0Jvb2xlYW59IHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcHMgb2JqZWN0IGNvbnRhaW5zIGBob3Jpem9udGFsOiB0cnVlYCBvZiBpZiBhbnlcbiAqIGNoaWxkcmVuIG9yIG5lc3RlZCBjaGlsZHJlbiBhcmUgaG9pem9udGFsXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSG9yaXpvbnRhbChwcm9wcykge1xuICBpZiAocHJvcHMuaG9yaXpvbnRhbCAhPT0gdW5kZWZpbmVkIHx8ICFwcm9wcy5jaGlsZHJlbikge1xuICAgIHJldHVybiBwcm9wcy5ob3Jpem9udGFsO1xuICB9XG5cbiAgdmFyIHRyYXZlcnNlQ2hpbGRyZW4gPSBmdW5jdGlvbiAoY2hpbGRBcnJheSkge1xuICAgIHJldHVybiBjaGlsZEFycmF5LnJlZHVjZShmdW5jdGlvbiAobWVtbywgY2hpbGQpIHtcbiAgICAgIHZhciBjaGlsZFByb3BzID0gY2hpbGQucHJvcHMgfHwge307XG5cbiAgICAgIGlmIChtZW1vIHx8IGNoaWxkUHJvcHMuaG9yaXpvbnRhbCB8fCAhY2hpbGRQcm9wcy5jaGlsZHJlbikge1xuICAgICAgICBtZW1vID0gbWVtbyB8fCBjaGlsZFByb3BzLmhvcml6b250YWw7XG4gICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJhdmVyc2VDaGlsZHJlbihSZWFjdC5DaGlsZHJlbi50b0FycmF5KGNoaWxkUHJvcHMuY2hpbGRyZW4pKTtcbiAgICB9LCBmYWxzZSk7XG4gIH07XG5cbiAgcmV0dXJuIHRyYXZlcnNlQ2hpbGRyZW4oUmVhY3QuQ2hpbGRyZW4udG9BcnJheShwcm9wcy5jaGlsZHJlbikpO1xufSIsImZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbi8qIGVzbGludC1kaXNhYmxlIGZ1bmMtc3R5bGUgKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbmZ1bmN0aW9uIGlzTm9uRW1wdHlBcnJheShjb2xsZWN0aW9uKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGNvbGxlY3Rpb24pICYmIGNvbGxlY3Rpb24ubGVuZ3RoID4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zU3RyaW5ncyhjb2xsZWN0aW9uKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGNvbGxlY3Rpb24pICYmIGNvbGxlY3Rpb24uc29tZShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiO1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluc0RhdGVzKGNvbGxlY3Rpb24pIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY29sbGVjdGlvbikgJiYgY29sbGVjdGlvbi5zb21lKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zTnVtYmVycyhjb2xsZWN0aW9uKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGNvbGxlY3Rpb24pICYmIGNvbGxlY3Rpb24uc29tZShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiO1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluc09ubHlTdHJpbmdzKGNvbGxlY3Rpb24pIHtcbiAgcmV0dXJuIGlzTm9uRW1wdHlBcnJheShjb2xsZWN0aW9uKSAmJiBjb2xsZWN0aW9uLmV2ZXJ5KGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCI7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXlPZkFycmF5cyhjb2xsZWN0aW9uKSB7XG4gIHJldHVybiBpc05vbkVtcHR5QXJyYXkoY29sbGVjdGlvbikgJiYgY29sbGVjdGlvbi5ldmVyeShBcnJheS5pc0FycmF5KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVVbmRlZmluZWQoYXJyKSB7XG4gIHJldHVybiBhcnIuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuICAgIHJldHVybiBlbCAhPT0gdW5kZWZpbmVkO1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXhWYWx1ZShhcnIpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHZhbHVlcyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgdmFsdWVzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHZhciBhcnJheSA9IGFyci5jb25jYXQodmFsdWVzKTtcbiAgcmV0dXJuIGNvbnRhaW5zRGF0ZXMoYXJyYXkpID8gbmV3IERhdGUoTWF0aC5tYXguYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGFycmF5KSkpIDogTWF0aC5tYXguYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGFycmF5KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TWluVmFsdWUoYXJyKSB7XG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgdmFsdWVzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICB2YWx1ZXNbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICB2YXIgYXJyYXkgPSBhcnIuY29uY2F0KHZhbHVlcyk7XG4gIHJldHVybiBjb250YWluc0RhdGVzKGFycmF5KSA/IG5ldyBEYXRlKE1hdGgubWluLmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheShhcnJheSkpKSA6IE1hdGgubWluLmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheShhcnJheSkpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmdcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcGFyZSkge1xuICBpZiAoY29tcGFyZS5sZW5ndGggPT09IDEpIGNvbXBhcmUgPSBhc2NlbmRpbmdDb21wYXJhdG9yKGNvbXBhcmUpO1xuICByZXR1cm4ge1xuICAgIGxlZnQ6IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSkge1xuICAgICAgaWYgKGxvID09IG51bGwpIGxvID0gMDtcbiAgICAgIGlmIChoaSA9PSBudWxsKSBoaSA9IGEubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxvIDwgaGkpIHtcbiAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4+IDE7XG4gICAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPCAwKSBsbyA9IG1pZCArIDE7XG4gICAgICAgIGVsc2UgaGkgPSBtaWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbG87XG4gICAgfSxcbiAgICByaWdodDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7XG4gICAgICBpZiAobG8gPT0gbnVsbCkgbG8gPSAwO1xuICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7XG4gICAgICB3aGlsZSAobG8gPCBoaSkge1xuICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTtcbiAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA+IDApIGhpID0gbWlkO1xuICAgICAgICBlbHNlIGxvID0gbWlkICsgMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsbztcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZ0NvbXBhcmF0b3IoZikge1xuICByZXR1cm4gZnVuY3Rpb24oZCwgeCkge1xuICAgIHJldHVybiBhc2NlbmRpbmcoZihkKSwgeCk7XG4gIH07XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZ1wiO1xuaW1wb3J0IGJpc2VjdG9yIGZyb20gXCIuL2Jpc2VjdG9yXCI7XG5cbnZhciBhc2NlbmRpbmdCaXNlY3QgPSBiaXNlY3Rvcihhc2NlbmRpbmcpO1xuZXhwb3J0IHZhciBiaXNlY3RSaWdodCA9IGFzY2VuZGluZ0Jpc2VjdC5yaWdodDtcbmV4cG9ydCB2YXIgYmlzZWN0TGVmdCA9IGFzY2VuZGluZ0Jpc2VjdC5sZWZ0O1xuZXhwb3J0IGRlZmF1bHQgYmlzZWN0UmlnaHQ7XG4iLCJ2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGU7XG5cbmV4cG9ydCB2YXIgc2xpY2UgPSBhcnJheS5zbGljZTtcbmV4cG9ydCB2YXIgbWFwID0gYXJyYXkubWFwO1xuIiwidmFyIGUxMCA9IE1hdGguc3FydCg1MCksXG4gICAgZTUgPSBNYXRoLnNxcnQoMTApLFxuICAgIGUyID0gTWF0aC5zcXJ0KDIpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgdmFyIHJldmVyc2UsXG4gICAgICBpID0gLTEsXG4gICAgICBuLFxuICAgICAgdGlja3MsXG4gICAgICBzdGVwO1xuXG4gIHN0b3AgPSArc3RvcCwgc3RhcnQgPSArc3RhcnQsIGNvdW50ID0gK2NvdW50O1xuICBpZiAoc3RhcnQgPT09IHN0b3AgJiYgY291bnQgPiAwKSByZXR1cm4gW3N0YXJ0XTtcbiAgaWYgKHJldmVyc2UgPSBzdG9wIDwgc3RhcnQpIG4gPSBzdGFydCwgc3RhcnQgPSBzdG9wLCBzdG9wID0gbjtcbiAgaWYgKChzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpKSA9PT0gMCB8fCAhaXNGaW5pdGUoc3RlcCkpIHJldHVybiBbXTtcblxuICBpZiAoc3RlcCA+IDApIHtcbiAgICBzdGFydCA9IE1hdGguY2VpbChzdGFydCAvIHN0ZXApO1xuICAgIHN0b3AgPSBNYXRoLmZsb29yKHN0b3AgLyBzdGVwKTtcbiAgICB0aWNrcyA9IG5ldyBBcnJheShuID0gTWF0aC5jZWlsKHN0b3AgLSBzdGFydCArIDEpKTtcbiAgICB3aGlsZSAoKytpIDwgbikgdGlja3NbaV0gPSAoc3RhcnQgKyBpKSAqIHN0ZXA7XG4gIH0gZWxzZSB7XG4gICAgc3RhcnQgPSBNYXRoLmZsb29yKHN0YXJ0ICogc3RlcCk7XG4gICAgc3RvcCA9IE1hdGguY2VpbChzdG9wICogc3RlcCk7XG4gICAgdGlja3MgPSBuZXcgQXJyYXkobiA9IE1hdGguY2VpbChzdGFydCAtIHN0b3AgKyAxKSk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHRpY2tzW2ldID0gKHN0YXJ0IC0gaSkgLyBzdGVwO1xuICB9XG5cbiAgaWYgKHJldmVyc2UpIHRpY2tzLnJldmVyc2UoKTtcblxuICByZXR1cm4gdGlja3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCkge1xuICB2YXIgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLFxuICAgICAgcG93ZXIgPSBNYXRoLmZsb29yKE1hdGgubG9nKHN0ZXApIC8gTWF0aC5MTjEwKSxcbiAgICAgIGVycm9yID0gc3RlcCAvIE1hdGgucG93KDEwLCBwb3dlcik7XG4gIHJldHVybiBwb3dlciA+PSAwXG4gICAgICA/IChlcnJvciA+PSBlMTAgPyAxMCA6IGVycm9yID49IGU1ID8gNSA6IGVycm9yID49IGUyID8gMiA6IDEpICogTWF0aC5wb3coMTAsIHBvd2VyKVxuICAgICAgOiAtTWF0aC5wb3coMTAsIC1wb3dlcikgLyAoZXJyb3IgPj0gZTEwID8gMTAgOiBlcnJvciA+PSBlNSA/IDUgOiBlcnJvciA+PSBlMiA/IDIgOiAxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCkge1xuICB2YXIgc3RlcDAgPSBNYXRoLmFicyhzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLFxuICAgICAgc3RlcDEgPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZyhzdGVwMCkgLyBNYXRoLkxOMTApKSxcbiAgICAgIGVycm9yID0gc3RlcDAgLyBzdGVwMTtcbiAgaWYgKGVycm9yID49IGUxMCkgc3RlcDEgKj0gMTA7XG4gIGVsc2UgaWYgKGVycm9yID49IGU1KSBzdGVwMSAqPSA1O1xuICBlbHNlIGlmIChlcnJvciA+PSBlMikgc3RlcDEgKj0gMjtcbiAgcmV0dXJuIHN0b3AgPCBzdGFydCA/IC1zdGVwMSA6IHN0ZXAxO1xufVxuIiwiaW1wb3J0IHtzbGljZX0gZnJvbSBcIi4vYXJyYXlcIjtcbmltcG9ydCBiaXNlY3QgZnJvbSBcIi4vYmlzZWN0XCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCBleHRlbnQgZnJvbSBcIi4vZXh0ZW50XCI7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4vaWRlbnRpdHlcIjtcbmltcG9ydCByYW5nZSBmcm9tIFwiLi9yYW5nZVwiO1xuaW1wb3J0IHt0aWNrU3RlcH0gZnJvbSBcIi4vdGlja3NcIjtcbmltcG9ydCBzdHVyZ2VzIGZyb20gXCIuL3RocmVzaG9sZC9zdHVyZ2VzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgdmFsdWUgPSBpZGVudGl0eSxcbiAgICAgIGRvbWFpbiA9IGV4dGVudCxcbiAgICAgIHRocmVzaG9sZCA9IHN0dXJnZXM7XG5cbiAgZnVuY3Rpb24gaGlzdG9ncmFtKGRhdGEpIHtcbiAgICB2YXIgaSxcbiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLFxuICAgICAgICB4LFxuICAgICAgICB2YWx1ZXMgPSBuZXcgQXJyYXkobik7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB2YWx1ZXNbaV0gPSB2YWx1ZShkYXRhW2ldLCBpLCBkYXRhKTtcbiAgICB9XG5cbiAgICB2YXIgeHogPSBkb21haW4odmFsdWVzKSxcbiAgICAgICAgeDAgPSB4elswXSxcbiAgICAgICAgeDEgPSB4elsxXSxcbiAgICAgICAgdHogPSB0aHJlc2hvbGQodmFsdWVzLCB4MCwgeDEpO1xuXG4gICAgLy8gQ29udmVydCBudW1iZXIgb2YgdGhyZXNob2xkcyBpbnRvIHVuaWZvcm0gdGhyZXNob2xkcy5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodHopKSB7XG4gICAgICB0eiA9IHRpY2tTdGVwKHgwLCB4MSwgdHopO1xuICAgICAgdHogPSByYW5nZShNYXRoLmNlaWwoeDAgLyB0eikgKiB0eiwgeDEsIHR6KTsgLy8gZXhjbHVzaXZlXG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSB0aHJlc2hvbGRzIG91dHNpZGUgdGhlIGRvbWFpbi5cbiAgICB2YXIgbSA9IHR6Lmxlbmd0aDtcbiAgICB3aGlsZSAodHpbMF0gPD0geDApIHR6LnNoaWZ0KCksIC0tbTtcbiAgICB3aGlsZSAodHpbbSAtIDFdID4geDEpIHR6LnBvcCgpLCAtLW07XG5cbiAgICB2YXIgYmlucyA9IG5ldyBBcnJheShtICsgMSksXG4gICAgICAgIGJpbjtcblxuICAgIC8vIEluaXRpYWxpemUgYmlucy5cbiAgICBmb3IgKGkgPSAwOyBpIDw9IG07ICsraSkge1xuICAgICAgYmluID0gYmluc1tpXSA9IFtdO1xuICAgICAgYmluLngwID0gaSA+IDAgPyB0eltpIC0gMV0gOiB4MDtcbiAgICAgIGJpbi54MSA9IGkgPCBtID8gdHpbaV0gOiB4MTtcbiAgICB9XG5cbiAgICAvLyBBc3NpZ24gZGF0YSB0byBiaW5zIGJ5IHZhbHVlLCBpZ25vcmluZyBhbnkgb3V0c2lkZSB0aGUgZG9tYWluLlxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHggPSB2YWx1ZXNbaV07XG4gICAgICBpZiAoeDAgPD0geCAmJiB4IDw9IHgxKSB7XG4gICAgICAgIGJpbnNbYmlzZWN0KHR6LCB4LCAwLCBtKV0ucHVzaChkYXRhW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYmlucztcbiAgfVxuXG4gIGhpc3RvZ3JhbS52YWx1ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIGhpc3RvZ3JhbSkgOiB2YWx1ZTtcbiAgfTtcblxuICBoaXN0b2dyYW0uZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoW19bMF0sIF9bMV1dKSwgaGlzdG9ncmFtKSA6IGRvbWFpbjtcbiAgfTtcblxuICBoaXN0b2dyYW0udGhyZXNob2xkcyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aHJlc2hvbGQgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IEFycmF5LmlzQXJyYXkoXykgPyBjb25zdGFudChzbGljZS5jYWxsKF8pKSA6IGNvbnN0YW50KF8pLCBoaXN0b2dyYW0pIDogdGhyZXNob2xkO1xuICB9O1xuXG4gIHJldHVybiBoaXN0b2dyYW07XG59XG4iLCJpbXBvcnQge21hcH0gZnJvbSBcIi4uL2FycmF5XCI7XG5pbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuLi9hc2NlbmRpbmdcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlclwiO1xuaW1wb3J0IHF1YW50aWxlIGZyb20gXCIuLi9xdWFudGlsZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMsIG1pbiwgbWF4KSB7XG4gIHZhbHVlcyA9IG1hcC5jYWxsKHZhbHVlcywgbnVtYmVyKS5zb3J0KGFzY2VuZGluZyk7XG4gIHJldHVybiBNYXRoLmNlaWwoKG1heCAtIG1pbikgLyAoMiAqIChxdWFudGlsZSh2YWx1ZXMsIDAuNzUpIC0gcXVhbnRpbGUodmFsdWVzLCAwLjI1KSkgKiBNYXRoLnBvdyh2YWx1ZXMubGVuZ3RoLCAtMSAvIDMpKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7XG59XG4iLCJpbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMsIHAsIHZhbHVlb2YpIHtcbiAgaWYgKHZhbHVlb2YgPT0gbnVsbCkgdmFsdWVvZiA9IG51bWJlcjtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpKSByZXR1cm47XG4gIGlmICgocCA9ICtwKSA8PSAwIHx8IG4gPCAyKSByZXR1cm4gK3ZhbHVlb2YodmFsdWVzWzBdLCAwLCB2YWx1ZXMpO1xuICBpZiAocCA+PSAxKSByZXR1cm4gK3ZhbHVlb2YodmFsdWVzW24gLSAxXSwgbiAtIDEsIHZhbHVlcyk7XG4gIHZhciBuLFxuICAgICAgaSA9IChuIC0gMSkgKiBwLFxuICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLFxuICAgICAgdmFsdWUwID0gK3ZhbHVlb2YodmFsdWVzW2kwXSwgaTAsIHZhbHVlcyksXG4gICAgICB2YWx1ZTEgPSArdmFsdWVvZih2YWx1ZXNbaTAgKyAxXSwgaTAgKyAxLCB2YWx1ZXMpO1xuICByZXR1cm4gdmFsdWUwICsgKHZhbHVlMSAtIHZhbHVlMCkgKiAoaSAtIGkwKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7XG4gIHN0YXJ0ID0gK3N0YXJ0LCBzdG9wID0gK3N0b3AsIHN0ZXAgPSAobiA9IGFyZ3VtZW50cy5sZW5ndGgpIDwgMiA/IChzdG9wID0gc3RhcnQsIHN0YXJ0ID0gMCwgMSkgOiBuIDwgMyA/IDEgOiArc3RlcDtcblxuICB2YXIgaSA9IC0xLFxuICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApKSB8IDAsXG4gICAgICByYW5nZSA9IG5ldyBBcnJheShuKTtcblxuICB3aGlsZSAoKytpIDwgbikge1xuICAgIHJhbmdlW2ldID0gc3RhcnQgKyBpICogc3RlcDtcbiAgfVxuXG4gIHJldHVybiByYW5nZTtcbn1cbiIsImV4cG9ydCB7ZGVmYXVsdCBhcyBiaXNlY3QsIGJpc2VjdFJpZ2h0LCBiaXNlY3RMZWZ0fSBmcm9tIFwiLi9iaXNlY3RcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBhc2NlbmRpbmd9IGZyb20gXCIuL2FzY2VuZGluZ1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGJpc2VjdG9yfSBmcm9tIFwiLi9iaXNlY3RvclwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGNyb3NzfSBmcm9tIFwiLi9jcm9zc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGRlc2NlbmRpbmd9IGZyb20gXCIuL2Rlc2NlbmRpbmdcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBkZXZpYXRpb259IGZyb20gXCIuL2RldmlhdGlvblwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGV4dGVudH0gZnJvbSBcIi4vZXh0ZW50XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgaGlzdG9ncmFtfSBmcm9tIFwiLi9oaXN0b2dyYW1cIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzfSBmcm9tIFwiLi90aHJlc2hvbGQvZnJlZWRtYW5EaWFjb25pc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRocmVzaG9sZFNjb3R0fSBmcm9tIFwiLi90aHJlc2hvbGQvc2NvdHRcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0aHJlc2hvbGRTdHVyZ2VzfSBmcm9tIFwiLi90aHJlc2hvbGQvc3R1cmdlc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIG1heH0gZnJvbSBcIi4vbWF4XCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWVhbn0gZnJvbSBcIi4vbWVhblwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIG1lZGlhbn0gZnJvbSBcIi4vbWVkaWFuXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWVyZ2V9IGZyb20gXCIuL21lcmdlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgbWlufSBmcm9tIFwiLi9taW5cIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwYWlyc30gZnJvbSBcIi4vcGFpcnNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwZXJtdXRlfSBmcm9tIFwiLi9wZXJtdXRlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcXVhbnRpbGV9IGZyb20gXCIuL3F1YW50aWxlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgcmFuZ2V9IGZyb20gXCIuL3JhbmdlXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc2Nhbn0gZnJvbSBcIi4vc2NhblwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHNodWZmbGV9IGZyb20gXCIuL3NodWZmbGVcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdW19IGZyb20gXCIuL3N1bVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHRpY2tzLCB0aWNrSW5jcmVtZW50LCB0aWNrU3RlcH0gZnJvbSBcIi4vdGlja3NcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyB0cmFuc3Bvc2V9IGZyb20gXCIuL3RyYW5zcG9zZVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHZhcmlhbmNlfSBmcm9tIFwiLi92YXJpYW5jZVwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHppcH0gZnJvbSBcIi4vemlwXCI7XG4iLCJleHBvcnQgdmFyIHByZWZpeCA9IFwiJFwiO1xuXG5mdW5jdGlvbiBNYXAoKSB7fVxuXG5NYXAucHJvdG90eXBlID0gbWFwLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IE1hcCxcbiAgaGFzOiBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gKHByZWZpeCArIGtleSkgaW4gdGhpcztcbiAgfSxcbiAgZ2V0OiBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gdGhpc1twcmVmaXggKyBrZXldO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICB0aGlzW3ByZWZpeCArIGtleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgcHJvcGVydHkgPSBwcmVmaXggKyBrZXk7XG4gICAgcmV0dXJuIHByb3BlcnR5IGluIHRoaXMgJiYgZGVsZXRlIHRoaXNbcHJvcGVydHldO1xuICB9LFxuICBjbGVhcjogZnVuY3Rpb24oKSB7XG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTtcbiAgfSxcbiAga2V5czogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkga2V5cy5wdXNoKHByb3BlcnR5LnNsaWNlKDEpKTtcbiAgICByZXR1cm4ga2V5cztcbiAgfSxcbiAgdmFsdWVzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIHZhbHVlcy5wdXNoKHRoaXNbcHJvcGVydHldKTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9LFxuICBlbnRyaWVzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZW50cmllcyA9IFtdO1xuICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSBlbnRyaWVzLnB1c2goe2tleTogcHJvcGVydHkuc2xpY2UoMSksIHZhbHVlOiB0aGlzW3Byb3BlcnR5XX0pO1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9LFxuICBzaXplOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpICsrc2l6ZTtcbiAgICByZXR1cm4gc2l6ZTtcbiAgfSxcbiAgZW1wdHk6IGZ1bmN0aW9uKCkge1xuICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGVhY2g6IGZ1bmN0aW9uKGYpIHtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgZih0aGlzW3Byb3BlcnR5XSwgcHJvcGVydHkuc2xpY2UoMSksIHRoaXMpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBtYXAob2JqZWN0LCBmKSB7XG4gIHZhciBtYXAgPSBuZXcgTWFwO1xuXG4gIC8vIENvcHkgY29uc3RydWN0b3IuXG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNYXApIG9iamVjdC5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsgbWFwLnNldChrZXksIHZhbHVlKTsgfSk7XG5cbiAgLy8gSW5kZXggYXJyYXkgYnkgbnVtZXJpYyBpbmRleCBvciBzcGVjaWZpZWQga2V5IGZ1bmN0aW9uLlxuICBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICB2YXIgaSA9IC0xLFxuICAgICAgICBuID0gb2JqZWN0Lmxlbmd0aCxcbiAgICAgICAgbztcblxuICAgIGlmIChmID09IG51bGwpIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGksIG9iamVjdFtpXSk7XG4gICAgZWxzZSB3aGlsZSAoKytpIDwgbikgbWFwLnNldChmKG8gPSBvYmplY3RbaV0sIGksIG9iamVjdCksIG8pO1xuICB9XG5cbiAgLy8gQ29udmVydCBvYmplY3QgdG8gbWFwLlxuICBlbHNlIGlmIChvYmplY3QpIGZvciAodmFyIGtleSBpbiBvYmplY3QpIG1hcC5zZXQoa2V5LCBvYmplY3Rba2V5XSk7XG5cbiAgcmV0dXJuIG1hcDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFwO1xuIiwiaW1wb3J0IG1hcCBmcm9tIFwiLi9tYXBcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBrZXlzID0gW10sXG4gICAgICBzb3J0S2V5cyA9IFtdLFxuICAgICAgc29ydFZhbHVlcyxcbiAgICAgIHJvbGx1cCxcbiAgICAgIG5lc3Q7XG5cbiAgZnVuY3Rpb24gYXBwbHkoYXJyYXksIGRlcHRoLCBjcmVhdGVSZXN1bHQsIHNldFJlc3VsdCkge1xuICAgIGlmIChkZXB0aCA+PSBrZXlzLmxlbmd0aCkge1xuICAgICAgaWYgKHNvcnRWYWx1ZXMgIT0gbnVsbCkgYXJyYXkuc29ydChzb3J0VmFsdWVzKTtcbiAgICAgIHJldHVybiByb2xsdXAgIT0gbnVsbCA/IHJvbGx1cChhcnJheSkgOiBhcnJheTtcbiAgICB9XG5cbiAgICB2YXIgaSA9IC0xLFxuICAgICAgICBuID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBrZXkgPSBrZXlzW2RlcHRoKytdLFxuICAgICAgICBrZXlWYWx1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlc0J5S2V5ID0gbWFwKCksXG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlUmVzdWx0KCk7XG5cbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKHZhbHVlcyA9IHZhbHVlc0J5S2V5LmdldChrZXlWYWx1ZSA9IGtleSh2YWx1ZSA9IGFycmF5W2ldKSArIFwiXCIpKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlc0J5S2V5LnNldChrZXlWYWx1ZSwgW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsdWVzQnlLZXkuZWFjaChmdW5jdGlvbih2YWx1ZXMsIGtleSkge1xuICAgICAgc2V0UmVzdWx0KHJlc3VsdCwga2V5LCBhcHBseSh2YWx1ZXMsIGRlcHRoLCBjcmVhdGVSZXN1bHQsIHNldFJlc3VsdCkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVudHJpZXMobWFwLCBkZXB0aCkge1xuICAgIGlmICgrK2RlcHRoID4ga2V5cy5sZW5ndGgpIHJldHVybiBtYXA7XG4gICAgdmFyIGFycmF5LCBzb3J0S2V5ID0gc29ydEtleXNbZGVwdGggLSAxXTtcbiAgICBpZiAocm9sbHVwICE9IG51bGwgJiYgZGVwdGggPj0ga2V5cy5sZW5ndGgpIGFycmF5ID0gbWFwLmVudHJpZXMoKTtcbiAgICBlbHNlIGFycmF5ID0gW10sIG1hcC5lYWNoKGZ1bmN0aW9uKHYsIGspIHsgYXJyYXkucHVzaCh7a2V5OiBrLCB2YWx1ZXM6IGVudHJpZXModiwgZGVwdGgpfSk7IH0pO1xuICAgIHJldHVybiBzb3J0S2V5ICE9IG51bGwgPyBhcnJheS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHNvcnRLZXkoYS5rZXksIGIua2V5KTsgfSkgOiBhcnJheTtcbiAgfVxuXG4gIHJldHVybiBuZXN0ID0ge1xuICAgIG9iamVjdDogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGFwcGx5KGFycmF5LCAwLCBjcmVhdGVPYmplY3QsIHNldE9iamVjdCk7IH0sXG4gICAgbWFwOiBmdW5jdGlvbihhcnJheSkgeyByZXR1cm4gYXBwbHkoYXJyYXksIDAsIGNyZWF0ZU1hcCwgc2V0TWFwKTsgfSxcbiAgICBlbnRyaWVzOiBmdW5jdGlvbihhcnJheSkgeyByZXR1cm4gZW50cmllcyhhcHBseShhcnJheSwgMCwgY3JlYXRlTWFwLCBzZXRNYXApLCAwKTsgfSxcbiAgICBrZXk6IGZ1bmN0aW9uKGQpIHsga2V5cy5wdXNoKGQpOyByZXR1cm4gbmVzdDsgfSxcbiAgICBzb3J0S2V5czogZnVuY3Rpb24ob3JkZXIpIHsgc29ydEtleXNba2V5cy5sZW5ndGggLSAxXSA9IG9yZGVyOyByZXR1cm4gbmVzdDsgfSxcbiAgICBzb3J0VmFsdWVzOiBmdW5jdGlvbihvcmRlcikgeyBzb3J0VmFsdWVzID0gb3JkZXI7IHJldHVybiBuZXN0OyB9LFxuICAgIHJvbGx1cDogZnVuY3Rpb24oZikgeyByb2xsdXAgPSBmOyByZXR1cm4gbmVzdDsgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVPYmplY3QoKSB7XG4gIHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gc2V0T2JqZWN0KG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXAoKSB7XG4gIHJldHVybiBtYXAoKTtcbn1cblxuZnVuY3Rpb24gc2V0TWFwKG1hcCwga2V5LCB2YWx1ZSkge1xuICBtYXAuc2V0KGtleSwgdmFsdWUpO1xufVxuIiwiaW1wb3J0IHtkZWZhdWx0IGFzIG1hcCwgcHJlZml4fSBmcm9tIFwiLi9tYXBcIjtcblxuZnVuY3Rpb24gU2V0KCkge31cblxudmFyIHByb3RvID0gbWFwLnByb3RvdHlwZTtcblxuU2V0LnByb3RvdHlwZSA9IHNldC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBTZXQsXG4gIGhhczogcHJvdG8uaGFzLFxuICBhZGQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFsdWUgKz0gXCJcIjtcbiAgICB0aGlzW3ByZWZpeCArIHZhbHVlXSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmU6IHByb3RvLnJlbW92ZSxcbiAgY2xlYXI6IHByb3RvLmNsZWFyLFxuICB2YWx1ZXM6IHByb3RvLmtleXMsXG4gIHNpemU6IHByb3RvLnNpemUsXG4gIGVtcHR5OiBwcm90by5lbXB0eSxcbiAgZWFjaDogcHJvdG8uZWFjaFxufTtcblxuZnVuY3Rpb24gc2V0KG9iamVjdCwgZikge1xuICB2YXIgc2V0ID0gbmV3IFNldDtcblxuICAvLyBDb3B5IGNvbnN0cnVjdG9yLlxuICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2V0KSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSkgeyBzZXQuYWRkKHZhbHVlKTsgfSk7XG5cbiAgLy8gT3RoZXJ3aXNlLCBhc3N1bWUgaXTigJlzIGFuIGFycmF5LlxuICBlbHNlIGlmIChvYmplY3QpIHtcbiAgICB2YXIgaSA9IC0xLCBuID0gb2JqZWN0Lmxlbmd0aDtcbiAgICBpZiAoZiA9PSBudWxsKSB3aGlsZSAoKytpIDwgbikgc2V0LmFkZChvYmplY3RbaV0pO1xuICAgIGVsc2Ugd2hpbGUgKCsraSA8IG4pIHNldC5hZGQoZihvYmplY3RbaV0sIGksIG9iamVjdCkpO1xuICB9XG5cbiAgcmV0dXJuIHNldDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2V0O1xuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIG5lc3R9IGZyb20gXCIuL25lc3RcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzZXR9IGZyb20gXCIuL3NldFwiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIG1hcH0gZnJvbSBcIi4vbWFwXCI7XG5leHBvcnQge2RlZmF1bHQgYXMga2V5c30gZnJvbSBcIi4va2V5c1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHZhbHVlc30gZnJvbSBcIi4vdmFsdWVzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgZW50cmllc30gZnJvbSBcIi4vZW50cmllc1wiO1xuIiwidmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlO1xuXG5leHBvcnQgdmFyIG1hcCA9IGFycmF5Lm1hcDtcbmV4cG9ydCB2YXIgc2xpY2UgPSBhcnJheS5zbGljZTtcbiIsImltcG9ydCB7bWFwfSBmcm9tIFwiZDMtY29sbGVjdGlvblwiO1xuaW1wb3J0IHtzbGljZX0gZnJvbSBcIi4vYXJyYXlcIjtcblxuZXhwb3J0IHZhciBpbXBsaWNpdCA9IHtuYW1lOiBcImltcGxpY2l0XCJ9O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvcmRpbmFsKHJhbmdlKSB7XG4gIHZhciBpbmRleCA9IG1hcCgpLFxuICAgICAgZG9tYWluID0gW10sXG4gICAgICB1bmtub3duID0gaW1wbGljaXQ7XG5cbiAgcmFuZ2UgPSByYW5nZSA9PSBudWxsID8gW10gOiBzbGljZS5jYWxsKHJhbmdlKTtcblxuICBmdW5jdGlvbiBzY2FsZShkKSB7XG4gICAgdmFyIGtleSA9IGQgKyBcIlwiLCBpID0gaW5kZXguZ2V0KGtleSk7XG4gICAgaWYgKCFpKSB7XG4gICAgICBpZiAodW5rbm93biAhPT0gaW1wbGljaXQpIHJldHVybiB1bmtub3duO1xuICAgICAgaW5kZXguc2V0KGtleSwgaSA9IGRvbWFpbi5wdXNoKGQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlWyhpIC0gMSkgJSByYW5nZS5sZW5ndGhdO1xuICB9XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbi5zbGljZSgpO1xuICAgIGRvbWFpbiA9IFtdLCBpbmRleCA9IG1hcCgpO1xuICAgIHZhciBpID0gLTEsIG4gPSBfLmxlbmd0aCwgZCwga2V5O1xuICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWluZGV4LmhhcyhrZXkgPSAoZCA9IF9baV0pICsgXCJcIikpIGluZGV4LnNldChrZXksIGRvbWFpbi5wdXNoKGQpKTtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBzbGljZS5jYWxsKF8pLCBzY2FsZSkgOiByYW5nZS5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247XG4gIH07XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBvcmRpbmFsKClcbiAgICAgICAgLmRvbWFpbihkb21haW4pXG4gICAgICAgIC5yYW5nZShyYW5nZSlcbiAgICAgICAgLnVua25vd24odW5rbm93bik7XG4gIH07XG5cbiAgcmV0dXJuIHNjYWxlO1xufVxuIiwiaW1wb3J0IHtyYW5nZSBhcyBzZXF1ZW5jZX0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQgb3JkaW5hbCBmcm9tIFwiLi9vcmRpbmFsXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJhbmQoKSB7XG4gIHZhciBzY2FsZSA9IG9yZGluYWwoKS51bmtub3duKHVuZGVmaW5lZCksXG4gICAgICBkb21haW4gPSBzY2FsZS5kb21haW4sXG4gICAgICBvcmRpbmFsUmFuZ2UgPSBzY2FsZS5yYW5nZSxcbiAgICAgIHJhbmdlID0gWzAsIDFdLFxuICAgICAgc3RlcCxcbiAgICAgIGJhbmR3aWR0aCxcbiAgICAgIHJvdW5kID0gZmFsc2UsXG4gICAgICBwYWRkaW5nSW5uZXIgPSAwLFxuICAgICAgcGFkZGluZ091dGVyID0gMCxcbiAgICAgIGFsaWduID0gMC41O1xuXG4gIGRlbGV0ZSBzY2FsZS51bmtub3duO1xuXG4gIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgdmFyIG4gPSBkb21haW4oKS5sZW5ndGgsXG4gICAgICAgIHJldmVyc2UgPSByYW5nZVsxXSA8IHJhbmdlWzBdLFxuICAgICAgICBzdGFydCA9IHJhbmdlW3JldmVyc2UgLSAwXSxcbiAgICAgICAgc3RvcCA9IHJhbmdlWzEgLSByZXZlcnNlXTtcbiAgICBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgxLCBuIC0gcGFkZGluZ0lubmVyICsgcGFkZGluZ091dGVyICogMik7XG4gICAgaWYgKHJvdW5kKSBzdGVwID0gTWF0aC5mbG9vcihzdGVwKTtcbiAgICBzdGFydCArPSAoc3RvcCAtIHN0YXJ0IC0gc3RlcCAqIChuIC0gcGFkZGluZ0lubmVyKSkgKiBhbGlnbjtcbiAgICBiYW5kd2lkdGggPSBzdGVwICogKDEgLSBwYWRkaW5nSW5uZXIpO1xuICAgIGlmIChyb3VuZCkgc3RhcnQgPSBNYXRoLnJvdW5kKHN0YXJ0KSwgYmFuZHdpZHRoID0gTWF0aC5yb3VuZChiYW5kd2lkdGgpO1xuICAgIHZhciB2YWx1ZXMgPSBzZXF1ZW5jZShuKS5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gc3RhcnQgKyBzdGVwICogaTsgfSk7XG4gICAgcmV0dXJuIG9yZGluYWxSYW5nZShyZXZlcnNlID8gdmFsdWVzLnJldmVyc2UoKSA6IHZhbHVlcyk7XG4gIH1cblxuICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluKF8pLCByZXNjYWxlKCkpIDogZG9tYWluKCk7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBbK19bMF0sICtfWzFdXSwgcmVzY2FsZSgpKSA6IHJhbmdlLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gcmFuZ2UgPSBbK19bMF0sICtfWzFdXSwgcm91bmQgPSB0cnVlLCByZXNjYWxlKCk7XG4gIH07XG5cbiAgc2NhbGUuYmFuZHdpZHRoID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGJhbmR3aWR0aDtcbiAgfTtcblxuICBzY2FsZS5zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHN0ZXA7XG4gIH07XG5cbiAgc2NhbGUucm91bmQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocm91bmQgPSAhIV8sIHJlc2NhbGUoKSkgOiByb3VuZDtcbiAgfTtcblxuICBzY2FsZS5wYWRkaW5nID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IHBhZGRpbmdPdXRlciA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIF8pKSwgcmVzY2FsZSgpKSA6IHBhZGRpbmdJbm5lcjtcbiAgfTtcblxuICBzY2FsZS5wYWRkaW5nSW5uZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgXykpLCByZXNjYWxlKCkpIDogcGFkZGluZ0lubmVyO1xuICB9O1xuXG4gIHNjYWxlLnBhZGRpbmdPdXRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nT3V0ZXIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBwYWRkaW5nT3V0ZXI7XG4gIH07XG5cbiAgc2NhbGUuYWxpZ24gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxpZ24gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBhbGlnbjtcbiAgfTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGJhbmQoKVxuICAgICAgICAuZG9tYWluKGRvbWFpbigpKVxuICAgICAgICAucmFuZ2UocmFuZ2UpXG4gICAgICAgIC5yb3VuZChyb3VuZClcbiAgICAgICAgLnBhZGRpbmdJbm5lcihwYWRkaW5nSW5uZXIpXG4gICAgICAgIC5wYWRkaW5nT3V0ZXIocGFkZGluZ091dGVyKVxuICAgICAgICAuYWxpZ24oYWxpZ24pO1xuICB9O1xuXG4gIHJldHVybiByZXNjYWxlKCk7XG59XG5cbmZ1bmN0aW9uIHBvaW50aXNoKHNjYWxlKSB7XG4gIHZhciBjb3B5ID0gc2NhbGUuY29weTtcblxuICBzY2FsZS5wYWRkaW5nID0gc2NhbGUucGFkZGluZ091dGVyO1xuICBkZWxldGUgc2NhbGUucGFkZGluZ0lubmVyO1xuICBkZWxldGUgc2NhbGUucGFkZGluZ091dGVyO1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcG9pbnRpc2goY29weSgpKTtcbiAgfTtcblxuICByZXR1cm4gc2NhbGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludCgpIHtcbiAgcmV0dXJuIHBvaW50aXNoKGJhbmQoKS5wYWRkaW5nSW5uZXIoMSkpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5pdGlvbikge1xuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTtcbiAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldO1xuICByZXR1cm4gcHJvdG90eXBlO1xufVxuIiwiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb2xvcigpIHt9XG5cbmV4cG9ydCB2YXIgZGFya2VyID0gMC43O1xuZXhwb3J0IHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7XG5cbnZhciByZUkgPSBcIlxcXFxzKihbKy1dP1xcXFxkKylcXFxccypcIixcbiAgICByZU4gPSBcIlxcXFxzKihbKy1dP1xcXFxkKlxcXFwuP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KVxcXFxzKlwiLFxuICAgIHJlUCA9IFwiXFxcXHMqKFsrLV0/XFxcXGQqXFxcXC4/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pJVxcXFxzKlwiLFxuICAgIHJlSGV4ID0gL14jKFswLTlhLWZdezMsOH0pJC8sXG4gICAgcmVSZ2JJbnRlZ2VyID0gbmV3IFJlZ0V4cChcIl5yZ2JcXFxcKFwiICsgW3JlSSwgcmVJLCByZUldICsgXCJcXFxcKSRcIiksXG4gICAgcmVSZ2JQZXJjZW50ID0gbmV3IFJlZ0V4cChcIl5yZ2JcXFxcKFwiICsgW3JlUCwgcmVQLCByZVBdICsgXCJcXFxcKSRcIiksXG4gICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoXCJecmdiYVxcXFwoXCIgKyBbcmVJLCByZUksIHJlSSwgcmVOXSArIFwiXFxcXCkkXCIpLFxuICAgIHJlUmdiYVBlcmNlbnQgPSBuZXcgUmVnRXhwKFwiXnJnYmFcXFxcKFwiICsgW3JlUCwgcmVQLCByZVAsIHJlTl0gKyBcIlxcXFwpJFwiKSxcbiAgICByZUhzbFBlcmNlbnQgPSBuZXcgUmVnRXhwKFwiXmhzbFxcXFwoXCIgKyBbcmVOLCByZVAsIHJlUF0gKyBcIlxcXFwpJFwiKSxcbiAgICByZUhzbGFQZXJjZW50ID0gbmV3IFJlZ0V4cChcIl5oc2xhXFxcXChcIiArIFtyZU4sIHJlUCwgcmVQLCByZU5dICsgXCJcXFxcKSRcIik7XG5cbnZhciBuYW1lZCA9IHtcbiAgYWxpY2VibHVlOiAweGYwZjhmZixcbiAgYW50aXF1ZXdoaXRlOiAweGZhZWJkNyxcbiAgYXF1YTogMHgwMGZmZmYsXG4gIGFxdWFtYXJpbmU6IDB4N2ZmZmQ0LFxuICBhenVyZTogMHhmMGZmZmYsXG4gIGJlaWdlOiAweGY1ZjVkYyxcbiAgYmlzcXVlOiAweGZmZTRjNCxcbiAgYmxhY2s6IDB4MDAwMDAwLFxuICBibGFuY2hlZGFsbW9uZDogMHhmZmViY2QsXG4gIGJsdWU6IDB4MDAwMGZmLFxuICBibHVldmlvbGV0OiAweDhhMmJlMixcbiAgYnJvd246IDB4YTUyYTJhLFxuICBidXJseXdvb2Q6IDB4ZGViODg3LFxuICBjYWRldGJsdWU6IDB4NWY5ZWEwLFxuICBjaGFydHJldXNlOiAweDdmZmYwMCxcbiAgY2hvY29sYXRlOiAweGQyNjkxZSxcbiAgY29yYWw6IDB4ZmY3ZjUwLFxuICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsXG4gIGNvcm5zaWxrOiAweGZmZjhkYyxcbiAgY3JpbXNvbjogMHhkYzE0M2MsXG4gIGN5YW46IDB4MDBmZmZmLFxuICBkYXJrYmx1ZTogMHgwMDAwOGIsXG4gIGRhcmtjeWFuOiAweDAwOGI4YixcbiAgZGFya2dvbGRlbnJvZDogMHhiODg2MGIsXG4gIGRhcmtncmF5OiAweGE5YTlhOSxcbiAgZGFya2dyZWVuOiAweDAwNjQwMCxcbiAgZGFya2dyZXk6IDB4YTlhOWE5LFxuICBkYXJra2hha2k6IDB4YmRiNzZiLFxuICBkYXJrbWFnZW50YTogMHg4YjAwOGIsXG4gIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZixcbiAgZGFya29yYW5nZTogMHhmZjhjMDAsXG4gIGRhcmtvcmNoaWQ6IDB4OTkzMmNjLFxuICBkYXJrcmVkOiAweDhiMDAwMCxcbiAgZGFya3NhbG1vbjogMHhlOTk2N2EsXG4gIGRhcmtzZWFncmVlbjogMHg4ZmJjOGYsXG4gIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiLFxuICBkYXJrc2xhdGVncmF5OiAweDJmNGY0ZixcbiAgZGFya3NsYXRlZ3JleTogMHgyZjRmNGYsXG4gIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLFxuICBkYXJrdmlvbGV0OiAweDk0MDBkMyxcbiAgZGVlcHBpbms6IDB4ZmYxNDkzLFxuICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsXG4gIGRpbWdyYXk6IDB4Njk2OTY5LFxuICBkaW1ncmV5OiAweDY5Njk2OSxcbiAgZG9kZ2VyYmx1ZTogMHgxZTkwZmYsXG4gIGZpcmVicmljazogMHhiMjIyMjIsXG4gIGZsb3JhbHdoaXRlOiAweGZmZmFmMCxcbiAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyLFxuICBmdWNoc2lhOiAweGZmMDBmZixcbiAgZ2FpbnNib3JvOiAweGRjZGNkYyxcbiAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsXG4gIGdvbGQ6IDB4ZmZkNzAwLFxuICBnb2xkZW5yb2Q6IDB4ZGFhNTIwLFxuICBncmF5OiAweDgwODA4MCxcbiAgZ3JlZW46IDB4MDA4MDAwLFxuICBncmVlbnllbGxvdzogMHhhZGZmMmYsXG4gIGdyZXk6IDB4ODA4MDgwLFxuICBob25leWRldzogMHhmMGZmZjAsXG4gIGhvdHBpbms6IDB4ZmY2OWI0LFxuICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLFxuICBpbmRpZ286IDB4NGIwMDgyLFxuICBpdm9yeTogMHhmZmZmZjAsXG4gIGtoYWtpOiAweGYwZTY4YyxcbiAgbGF2ZW5kZXI6IDB4ZTZlNmZhLFxuICBsYXZlbmRlcmJsdXNoOiAweGZmZjBmNSxcbiAgbGF3bmdyZWVuOiAweDdjZmMwMCxcbiAgbGVtb25jaGlmZm9uOiAweGZmZmFjZCxcbiAgbGlnaHRibHVlOiAweGFkZDhlNixcbiAgbGlnaHRjb3JhbDogMHhmMDgwODAsXG4gIGxpZ2h0Y3lhbjogMHhlMGZmZmYsXG4gIGxpZ2h0Z29sZGVucm9keWVsbG93OiAweGZhZmFkMixcbiAgbGlnaHRncmF5OiAweGQzZDNkMyxcbiAgbGlnaHRncmVlbjogMHg5MGVlOTAsXG4gIGxpZ2h0Z3JleTogMHhkM2QzZDMsXG4gIGxpZ2h0cGluazogMHhmZmI2YzEsXG4gIGxpZ2h0c2FsbW9uOiAweGZmYTA3YSxcbiAgbGlnaHRzZWFncmVlbjogMHgyMGIyYWEsXG4gIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmEsXG4gIGxpZ2h0c2xhdGVncmF5OiAweDc3ODg5OSxcbiAgbGlnaHRzbGF0ZWdyZXk6IDB4Nzc4ODk5LFxuICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsXG4gIGxpZ2h0eWVsbG93OiAweGZmZmZlMCxcbiAgbGltZTogMHgwMGZmMDAsXG4gIGxpbWVncmVlbjogMHgzMmNkMzIsXG4gIGxpbmVuOiAweGZhZjBlNixcbiAgbWFnZW50YTogMHhmZjAwZmYsXG4gIG1hcm9vbjogMHg4MDAwMDAsXG4gIG1lZGl1bWFxdWFtYXJpbmU6IDB4NjZjZGFhLFxuICBtZWRpdW1ibHVlOiAweDAwMDBjZCxcbiAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMyxcbiAgbWVkaXVtcHVycGxlOiAweDkzNzBkYixcbiAgbWVkaXVtc2VhZ3JlZW46IDB4M2NiMzcxLFxuICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLFxuICBtZWRpdW1zcHJpbmdncmVlbjogMHgwMGZhOWEsXG4gIG1lZGl1bXR1cnF1b2lzZTogMHg0OGQxY2MsXG4gIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsXG4gIG1pZG5pZ2h0Ymx1ZTogMHgxOTE5NzAsXG4gIG1pbnRjcmVhbTogMHhmNWZmZmEsXG4gIG1pc3R5cm9zZTogMHhmZmU0ZTEsXG4gIG1vY2Nhc2luOiAweGZmZTRiNSxcbiAgbmF2YWpvd2hpdGU6IDB4ZmZkZWFkLFxuICBuYXZ5OiAweDAwMDA4MCxcbiAgb2xkbGFjZTogMHhmZGY1ZTYsXG4gIG9saXZlOiAweDgwODAwMCxcbiAgb2xpdmVkcmFiOiAweDZiOGUyMyxcbiAgb3JhbmdlOiAweGZmYTUwMCxcbiAgb3JhbmdlcmVkOiAweGZmNDUwMCxcbiAgb3JjaGlkOiAweGRhNzBkNixcbiAgcGFsZWdvbGRlbnJvZDogMHhlZWU4YWEsXG4gIHBhbGVncmVlbjogMHg5OGZiOTgsXG4gIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLFxuICBwYWxldmlvbGV0cmVkOiAweGRiNzA5MyxcbiAgcGFwYXlhd2hpcDogMHhmZmVmZDUsXG4gIHBlYWNocHVmZjogMHhmZmRhYjksXG4gIHBlcnU6IDB4Y2Q4NTNmLFxuICBwaW5rOiAweGZmYzBjYixcbiAgcGx1bTogMHhkZGEwZGQsXG4gIHBvd2RlcmJsdWU6IDB4YjBlMGU2LFxuICBwdXJwbGU6IDB4ODAwMDgwLFxuICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSxcbiAgcmVkOiAweGZmMDAwMCxcbiAgcm9zeWJyb3duOiAweGJjOGY4ZixcbiAgcm95YWxibHVlOiAweDQxNjllMSxcbiAgc2FkZGxlYnJvd246IDB4OGI0NTEzLFxuICBzYWxtb246IDB4ZmE4MDcyLFxuICBzYW5keWJyb3duOiAweGY0YTQ2MCxcbiAgc2VhZ3JlZW46IDB4MmU4YjU3LFxuICBzZWFzaGVsbDogMHhmZmY1ZWUsXG4gIHNpZW5uYTogMHhhMDUyMmQsXG4gIHNpbHZlcjogMHhjMGMwYzAsXG4gIHNreWJsdWU6IDB4ODdjZWViLFxuICBzbGF0ZWJsdWU6IDB4NmE1YWNkLFxuICBzbGF0ZWdyYXk6IDB4NzA4MDkwLFxuICBzbGF0ZWdyZXk6IDB4NzA4MDkwLFxuICBzbm93OiAweGZmZmFmYSxcbiAgc3ByaW5nZ3JlZW46IDB4MDBmZjdmLFxuICBzdGVlbGJsdWU6IDB4NDY4MmI0LFxuICB0YW46IDB4ZDJiNDhjLFxuICB0ZWFsOiAweDAwODA4MCxcbiAgdGhpc3RsZTogMHhkOGJmZDgsXG4gIHRvbWF0bzogMHhmZjYzNDcsXG4gIHR1cnF1b2lzZTogMHg0MGUwZDAsXG4gIHZpb2xldDogMHhlZTgyZWUsXG4gIHdoZWF0OiAweGY1ZGViMyxcbiAgd2hpdGU6IDB4ZmZmZmZmLFxuICB3aGl0ZXNtb2tlOiAweGY1ZjVmNSxcbiAgeWVsbG93OiAweGZmZmYwMCxcbiAgeWVsbG93Z3JlZW46IDB4OWFjZDMyXG59O1xuXG5kZWZpbmUoQ29sb3IsIGNvbG9yLCB7XG4gIGNvcHk6IGZ1bmN0aW9uKGNoYW5uZWxzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsIHRoaXMsIGNoYW5uZWxzKTtcbiAgfSxcbiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7XG4gIH0sXG4gIGhleDogY29sb3JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IGNvbG9yX2Zvcm1hdEhleCxcbiAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsXG4gIGZvcm1hdFJnYjogY29sb3JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiXG59KTtcblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SHNsKCkge1xuICByZXR1cm4gaHNsQ29udmVydCh0aGlzKS5mb3JtYXRIc2woKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0UmdiKCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29sb3IoZm9ybWF0KSB7XG4gIHZhciBtLCBsO1xuICBmb3JtYXQgPSAoZm9ybWF0ICsgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAobSA9IHJlSGV4LmV4ZWMoZm9ybWF0KSkgPyAobCA9IG1bMV0ubGVuZ3RoLCBtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBsID09PSA2ID8gcmdibihtKSAvLyAjZmYwMDAwXG4gICAgICA6IGwgPT09IDMgPyBuZXcgUmdiKChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZiksIDEpIC8vICNmMDBcbiAgICAgIDogbCA9PT0gOCA/IHJnYmEobSA+PiAyNCAmIDB4ZmYsIG0gPj4gMTYgJiAweGZmLCBtID4+IDggJiAweGZmLCAobSAmIDB4ZmYpIC8gMHhmZikgLy8gI2ZmMDAwMDAwXG4gICAgICA6IGwgPT09IDQgPyByZ2JhKChtID4+IDEyICYgMHhmKSB8IChtID4+IDggJiAweGYwKSwgKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKCgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZikpIC8gMHhmZikgLy8gI2YwMDBcbiAgICAgIDogbnVsbCkgLy8gaW52YWxpZCBoZXhcbiAgICAgIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMClcbiAgICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSlcbiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKVxuICAgICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSlcbiAgICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpXG4gICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpXG4gICAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICA6IGZvcm1hdCA9PT0gXCJ0cmFuc3BhcmVudFwiID8gbmV3IFJnYihOYU4sIE5hTiwgTmFOLCAwKVxuICAgICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiByZ2JuKG4pIHtcbiAgcmV0dXJuIG5ldyBSZ2IobiA+PiAxNiAmIDB4ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTtcbn1cblxuZnVuY3Rpb24gcmdiYShyLCBnLCBiLCBhKSB7XG4gIGlmIChhIDw9IDApIHIgPSBnID0gYiA9IE5hTjtcbiAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgUmdiO1xuICBvID0gby5yZ2IoKTtcbiAgcmV0dXJuIG5ldyBSZ2Ioby5yLCBvLmcsIG8uYiwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gcmdiQ29udmVydChyKSA6IG5ldyBSZ2IociwgZywgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgdGhpcy5yID0gK3I7XG4gIHRoaXMuZyA9ICtnO1xuICB0aGlzLmIgPSArYjtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShSZ2IsIHJnYiwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmcgJiYgdGhpcy5nIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuYiAmJiB0aGlzLmIgPCAyNTUuNSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgaGV4OiByZ2JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsXG4gIGZvcm1hdFJnYjogcmdiX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IHJnYl9mb3JtYXRSZ2Jcbn0pKTtcblxuZnVuY3Rpb24gcmdiX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIFwiI1wiICsgaGV4KHRoaXMucikgKyBoZXgodGhpcy5nKSArIGhleCh0aGlzLmIpO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0UmdiKCkge1xuICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTtcbiAgcmV0dXJuIChhID09PSAxID8gXCJyZ2IoXCIgOiBcInJnYmEoXCIpXG4gICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLnIpIHx8IDApKSArIFwiLCBcIlxuICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5nKSB8fCAwKSkgKyBcIiwgXCJcbiAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuYikgfHwgMCkpXG4gICAgICArIChhID09PSAxID8gXCIpXCIgOiBcIiwgXCIgKyBhICsgXCIpXCIpO1xufVxuXG5mdW5jdGlvbiBoZXgodmFsdWUpIHtcbiAgdmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodmFsdWUpIHx8IDApKTtcbiAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gXCIwXCIgOiBcIlwiKSArIHZhbHVlLnRvU3RyaW5nKDE2KTtcbn1cblxuZnVuY3Rpb24gaHNsYShoLCBzLCBsLCBhKSB7XG4gIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjtcbiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47XG4gIGVsc2UgaWYgKHMgPD0gMCkgaCA9IE5hTjtcbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2xDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBuZXcgSHNsKG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBvO1xuICBvID0gby5yZ2IoKTtcbiAgdmFyIHIgPSBvLnIgLyAyNTUsXG4gICAgICBnID0gby5nIC8gMjU1LFxuICAgICAgYiA9IG8uYiAvIDI1NSxcbiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLFxuICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksXG4gICAgICBoID0gTmFOLFxuICAgICAgcyA9IG1heCAtIG1pbixcbiAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7XG4gIGlmIChzKSB7XG4gICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7XG4gICAgZWxzZSBpZiAoZyA9PT0gbWF4KSBoID0gKGIgLSByKSAvIHMgKyAyO1xuICAgIGVsc2UgaCA9IChyIC0gZykgLyBzICsgNDtcbiAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluO1xuICAgIGggKj0gNjA7XG4gIH0gZWxzZSB7XG4gICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7XG4gIH1cbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaHNsQ29udmVydChoKSA6IG5ldyBIc2woaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5mdW5jdGlvbiBIc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5zID0gK3M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKEhzbCwgaHNsLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLFxuICAgICAgICBzID0gaXNOYU4oaCkgfHwgaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMsXG4gICAgICAgIGwgPSB0aGlzLmwsXG4gICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsXG4gICAgICAgIG0xID0gMiAqIGwgLSBtMjtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIGhzbDJyZ2IoaCA+PSAyNDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCA8IDEyMCA/IGggKyAyNDAgOiBoIC0gMTIwLCBtMSwgbTIpLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfSxcbiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAoMCA8PSB0aGlzLnMgJiYgdGhpcy5zIDw9IDEgfHwgaXNOYU4odGhpcy5zKSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5sICYmIHRoaXMubCA8PSAxKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9LFxuICBmb3JtYXRIc2w6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhID0gdGhpcy5vcGFjaXR5OyBhID0gaXNOYU4oYSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgYSkpO1xuICAgIHJldHVybiAoYSA9PT0gMSA/IFwiaHNsKFwiIDogXCJoc2xhKFwiKVxuICAgICAgICArICh0aGlzLmggfHwgMCkgKyBcIiwgXCJcbiAgICAgICAgKyAodGhpcy5zIHx8IDApICogMTAwICsgXCIlLCBcIlxuICAgICAgICArICh0aGlzLmwgfHwgMCkgKiAxMDAgKyBcIiVcIlxuICAgICAgICArIChhID09PSAxID8gXCIpXCIgOiBcIiwgXCIgKyBhICsgXCIpXCIpO1xuICB9XG59KSk7XG5cbi8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi9cbmZ1bmN0aW9uIGhzbDJyZ2IoaCwgbTEsIG0yKSB7XG4gIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjBcbiAgICAgIDogaCA8IDE4MCA/IG0yXG4gICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwXG4gICAgICA6IG0xKSAqIDI1NTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHtcbiAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxO1xuICByZXR1cm4gKCgxIC0gMyAqIHQxICsgMyAqIHQyIC0gdDMpICogdjBcbiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjFcbiAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjJcbiAgICAgICsgdDMgKiB2MykgLyA2O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQgPD0gMCA/ICh0ID0gMCkgOiB0ID49IDEgPyAodCA9IDEsIG4gLSAxKSA6IE1hdGguZmxvb3IodCAqIG4pLFxuICAgICAgICB2MSA9IHZhbHVlc1tpXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbaSArIDFdLFxuICAgICAgICB2MCA9IGkgPiAwID8gdmFsdWVzW2kgLSAxXSA6IDIgKiB2MSAtIHYyLFxuICAgICAgICB2MyA9IGkgPCBuIC0gMSA/IHZhbHVlc1tpICsgMl0gOiAyICogdjIgLSB2MTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCJpbXBvcnQge2Jhc2lzfSBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gTWF0aC5mbG9vcigoKHQgJT0gMSkgPCAwID8gKyt0IDogdCkgKiBuKSxcbiAgICAgICAgdjAgPSB2YWx1ZXNbKGkgKyBuIC0gMSkgJSBuXSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaSAlIG5dLFxuICAgICAgICB2MiA9IHZhbHVlc1soaSArIDEpICUgbl0sXG4gICAgICAgIHYzID0gdmFsdWVzWyhpICsgMikgJSBuXTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBsaW5lYXIoYSwgZCkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICsgdCAqIGQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4cG9uZW50aWFsKGEsIGIsIHkpIHtcbiAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBodWUoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2FtbWEoeSkge1xuICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hIDogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vZ2FtbWEoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuIiwiaW1wb3J0IHtyZ2IgYXMgY29sb3JSZ2J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGJhc2lzIGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5pbXBvcnQgYmFzaXNDbG9zZWQgZnJvbSBcIi4vYmFzaXNDbG9zZWQuanNcIjtcbmltcG9ydCBub2dhbW1hLCB7Z2FtbWF9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiByZ2JHYW1tYSh5KSB7XG4gIHZhciBjb2xvciA9IGdhbW1hKHkpO1xuXG4gIGZ1bmN0aW9uIHJnYihzdGFydCwgZW5kKSB7XG4gICAgdmFyIHIgPSBjb2xvcigoc3RhcnQgPSBjb2xvclJnYihzdGFydCkpLnIsIChlbmQgPSBjb2xvclJnYihlbmQpKS5yKSxcbiAgICAgICAgZyA9IGNvbG9yKHN0YXJ0LmcsIGVuZC5nKSxcbiAgICAgICAgYiA9IGNvbG9yKHN0YXJ0LmIsIGVuZC5iKSxcbiAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBzdGFydC5yID0gcih0KTtcbiAgICAgIHN0YXJ0LmcgPSBnKHQpO1xuICAgICAgc3RhcnQuYiA9IGIodCk7XG4gICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICAgIHJldHVybiBzdGFydCArIFwiXCI7XG4gICAgfTtcbiAgfVxuXG4gIHJnYi5nYW1tYSA9IHJnYkdhbW1hO1xuXG4gIHJldHVybiByZ2I7XG59KSgxKTtcblxuZnVuY3Rpb24gcmdiU3BsaW5lKHNwbGluZSkge1xuICByZXR1cm4gZnVuY3Rpb24oY29sb3JzKSB7XG4gICAgdmFyIG4gPSBjb2xvcnMubGVuZ3RoLFxuICAgICAgICByID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBnID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBiID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBpLCBjb2xvcjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBjb2xvciA9IGNvbG9yUmdiKGNvbG9yc1tpXSk7XG4gICAgICByW2ldID0gY29sb3IuciB8fCAwO1xuICAgICAgZ1tpXSA9IGNvbG9yLmcgfHwgMDtcbiAgICAgIGJbaV0gPSBjb2xvci5iIHx8IDA7XG4gICAgfVxuICAgIHIgPSBzcGxpbmUocik7XG4gICAgZyA9IHNwbGluZShnKTtcbiAgICBiID0gc3BsaW5lKGIpO1xuICAgIGNvbG9yLm9wYWNpdHkgPSAxO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBjb2xvci5yID0gcih0KTtcbiAgICAgIGNvbG9yLmcgPSBnKHQpO1xuICAgICAgY29sb3IuYiA9IGIodCk7XG4gICAgICByZXR1cm4gY29sb3IgKyBcIlwiO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB2YXIgcmdiQmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMpO1xuZXhwb3J0IHZhciByZ2JCYXNpc0Nsb3NlZCA9IHJnYlNwbGluZShiYXNpc0Nsb3NlZCk7XG4iLCJpbXBvcnQgdmFsdWUgZnJvbSBcIi4vdmFsdWUuanNcIjtcbmltcG9ydCBudW1iZXJBcnJheSwge2lzTnVtYmVyQXJyYXl9IGZyb20gXCIuL251bWJlckFycmF5LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIChpc051bWJlckFycmF5KGIpID8gbnVtYmVyQXJyYXkgOiBnZW5lcmljQXJyYXkpKGEsIGIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJpY0FycmF5KGEsIGIpIHtcbiAgdmFyIG5iID0gYiA/IGIubGVuZ3RoIDogMCxcbiAgICAgIG5hID0gYSA/IE1hdGgubWluKG5iLCBhLmxlbmd0aCkgOiAwLFxuICAgICAgeCA9IG5ldyBBcnJheShuYSksXG4gICAgICBjID0gbmV3IEFycmF5KG5iKSxcbiAgICAgIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IG5hOyArK2kpIHhbaV0gPSB2YWx1ZShhW2ldLCBiW2ldKTtcbiAgZm9yICg7IGkgPCBuYjsgKytpKSBjW2ldID0gYltpXTtcblxuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSBjW2ldID0geFtpXSh0KTtcbiAgICByZXR1cm4gYztcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZTtcbiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGQuc2V0VGltZShhICogKDEgLSB0KSArIGIgKiB0KSwgZDtcbiAgfTtcbn1cbiIsImltcG9ydCB2YWx1ZSBmcm9tIFwiLi92YWx1ZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBpID0ge30sXG4gICAgICBjID0ge30sXG4gICAgICBrO1xuXG4gIGlmIChhID09PSBudWxsIHx8IHR5cGVvZiBhICE9PSBcIm9iamVjdFwiKSBhID0ge307XG4gIGlmIChiID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiKSBiID0ge307XG5cbiAgZm9yIChrIGluIGIpIHtcbiAgICBpZiAoayBpbiBhKSB7XG4gICAgICBpW2tdID0gdmFsdWUoYVtrXSwgYltrXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNba10gPSBiW2tdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgZm9yIChrIGluIGkpIGNba10gPSBpW2tdKHQpO1xuICAgIHJldHVybiBjO1xuICB9O1xufVxuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxudmFyIHJlQSA9IC9bLStdPyg/OlxcZCtcXC4/XFxkKnxcXC4/XFxkKykoPzpbZUVdWy0rXT9cXGQrKT8vZyxcbiAgICByZUIgPSBuZXcgUmVnRXhwKHJlQS5zb3VyY2UsIFwiZ1wiKTtcblxuZnVuY3Rpb24gemVybyhiKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25lKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYih0KSArIFwiXCI7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLCAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiXG4gICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhXG4gICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiXG4gICAgICBicywgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnlcbiAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gc1xuICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcblxuICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuXG4gIGEgPSBhICsgXCJcIiwgYiA9IGIgKyBcIlwiO1xuXG4gIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuXG4gIHdoaWxlICgoYW0gPSByZUEuZXhlYyhhKSlcbiAgICAgICYmIChibSA9IHJlQi5leGVjKGIpKSkge1xuICAgIGlmICgoYnMgPSBibS5pbmRleCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7XG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gICAgfVxuICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgeyAvLyBudW1iZXJzIGluIGEgJiBiIG1hdGNoXG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYm07XG4gICAgfSBlbHNlIHsgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnNcbiAgICAgIHNbKytpXSA9IG51bGw7XG4gICAgICBxLnB1c2goe2k6IGksIHg6IG51bWJlcihhbSwgYm0pfSk7XG4gICAgfVxuICAgIGJpID0gcmVCLmxhc3RJbmRleDtcbiAgfVxuXG4gIC8vIEFkZCByZW1haW5zIG9mIGIuXG4gIGlmIChiaSA8IGIubGVuZ3RoKSB7XG4gICAgYnMgPSBiLnNsaWNlKGJpKTtcbiAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICBlbHNlIHNbKytpXSA9IGJzO1xuICB9XG5cbiAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guXG4gIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuXG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAocVswXVxuICAgICAgPyBvbmUocVswXS54KVxuICAgICAgOiB6ZXJvKGIpKVxuICAgICAgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgICAgICB9KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgaWYgKCFiKSBiID0gW107XG4gIHZhciBuID0gYSA/IE1hdGgubWluKGIubGVuZ3RoLCBhLmxlbmd0aCkgOiAwLFxuICAgICAgYyA9IGIuc2xpY2UoKSxcbiAgICAgIGk7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY1tpXSA9IGFbaV0gKiAoMSAtIHQpICsgYltpXSAqIHQ7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlckFycmF5KHgpIHtcbiAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh4KSAmJiAhKHggaW5zdGFuY2VvZiBEYXRhVmlldyk7XG59XG4iLCJpbXBvcnQge2NvbG9yfSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCByZ2IgZnJvbSBcIi4vcmdiLmpzXCI7XG5pbXBvcnQge2dlbmVyaWNBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIjtcbmltcG9ydCBkYXRlIGZyb20gXCIuL2RhdGUuanNcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQgb2JqZWN0IGZyb20gXCIuL29iamVjdC5qc1wiO1xuaW1wb3J0IHN0cmluZyBmcm9tIFwiLi9zdHJpbmcuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IG51bWJlckFycmF5LCB7aXNOdW1iZXJBcnJheX0gZnJvbSBcIi4vbnVtYmVyQXJyYXkuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgdCA9IHR5cGVvZiBiLCBjO1xuICByZXR1cm4gYiA9PSBudWxsIHx8IHQgPT09IFwiYm9vbGVhblwiID8gY29uc3RhbnQoYilcbiAgICAgIDogKHQgPT09IFwibnVtYmVyXCIgPyBudW1iZXJcbiAgICAgIDogdCA9PT0gXCJzdHJpbmdcIiA/ICgoYyA9IGNvbG9yKGIpKSA/IChiID0gYywgcmdiKSA6IHN0cmluZylcbiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gcmdiXG4gICAgICA6IGIgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZVxuICAgICAgOiBpc051bWJlckFycmF5KGIpID8gbnVtYmVyQXJyYXlcbiAgICAgIDogQXJyYXkuaXNBcnJheShiKSA/IGdlbmVyaWNBcnJheVxuICAgICAgOiB0eXBlb2YgYi52YWx1ZU9mICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGIudG9TdHJpbmcgIT09IFwiZnVuY3Rpb25cIiB8fCBpc05hTihiKSA/IG9iamVjdFxuICAgICAgOiBudW1iZXIpKGEsIGIpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChhICogKDEgLSB0KSArIGIgKiB0KTtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gK3g7XG59XG4iLCJpbXBvcnQge2Jpc2VjdH0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge2ludGVycG9sYXRlIGFzIGludGVycG9sYXRlVmFsdWUsIGludGVycG9sYXRlUm91bmR9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHttYXAsIHNsaWNlfSBmcm9tIFwiLi9hcnJheVwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlclwiO1xuXG52YXIgdW5pdCA9IFswLCAxXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlaW50ZXJwb2xhdGVMaW5lYXIoYSwgYikge1xuICByZXR1cm4gKGIgLT0gKGEgPSArYSkpXG4gICAgICA/IGZ1bmN0aW9uKHgpIHsgcmV0dXJuICh4IC0gYSkgLyBiOyB9XG4gICAgICA6IGNvbnN0YW50KGIpO1xufVxuXG5mdW5jdGlvbiBkZWludGVycG9sYXRlQ2xhbXAoZGVpbnRlcnBvbGF0ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBkID0gZGVpbnRlcnBvbGF0ZShhID0gK2EsIGIgPSArYik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggPD0gYSA/IDAgOiB4ID49IGIgPyAxIDogZCh4KTsgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVpbnRlcnBvbGF0ZUNsYW1wKHJlaW50ZXJwb2xhdGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgciA9IHJlaW50ZXJwb2xhdGUoYSA9ICthLCBiID0gK2IpO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7IHJldHVybiB0IDw9IDAgPyBhIDogdCA+PSAxID8gYiA6IHIodCk7IH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGJpbWFwKGRvbWFpbiwgcmFuZ2UsIGRlaW50ZXJwb2xhdGUsIHJlaW50ZXJwb2xhdGUpIHtcbiAgdmFyIGQwID0gZG9tYWluWzBdLCBkMSA9IGRvbWFpblsxXSwgcjAgPSByYW5nZVswXSwgcjEgPSByYW5nZVsxXTtcbiAgaWYgKGQxIDwgZDApIGQwID0gZGVpbnRlcnBvbGF0ZShkMSwgZDApLCByMCA9IHJlaW50ZXJwb2xhdGUocjEsIHIwKTtcbiAgZWxzZSBkMCA9IGRlaW50ZXJwb2xhdGUoZDAsIGQxKSwgcjAgPSByZWludGVycG9sYXRlKHIwLCByMSk7XG4gIHJldHVybiBmdW5jdGlvbih4KSB7IHJldHVybiByMChkMCh4KSk7IH07XG59XG5cbmZ1bmN0aW9uIHBvbHltYXAoZG9tYWluLCByYW5nZSwgZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSkge1xuICB2YXIgaiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgLSAxLFxuICAgICAgZCA9IG5ldyBBcnJheShqKSxcbiAgICAgIHIgPSBuZXcgQXJyYXkoaiksXG4gICAgICBpID0gLTE7XG5cbiAgLy8gUmV2ZXJzZSBkZXNjZW5kaW5nIGRvbWFpbnMuXG4gIGlmIChkb21haW5bal0gPCBkb21haW5bMF0pIHtcbiAgICBkb21haW4gPSBkb21haW4uc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgcmFuZ2UgPSByYW5nZS5zbGljZSgpLnJldmVyc2UoKTtcbiAgfVxuXG4gIHdoaWxlICgrK2kgPCBqKSB7XG4gICAgZFtpXSA9IGRlaW50ZXJwb2xhdGUoZG9tYWluW2ldLCBkb21haW5baSArIDFdKTtcbiAgICByW2ldID0gcmVpbnRlcnBvbGF0ZShyYW5nZVtpXSwgcmFuZ2VbaSArIDFdKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbih4KSB7XG4gICAgdmFyIGkgPSBiaXNlY3QoZG9tYWluLCB4LCAxLCBqKSAtIDE7XG4gICAgcmV0dXJuIHJbaV0oZFtpXSh4KSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KHNvdXJjZSwgdGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXRcbiAgICAgIC5kb21haW4oc291cmNlLmRvbWFpbigpKVxuICAgICAgLnJhbmdlKHNvdXJjZS5yYW5nZSgpKVxuICAgICAgLmludGVycG9sYXRlKHNvdXJjZS5pbnRlcnBvbGF0ZSgpKVxuICAgICAgLmNsYW1wKHNvdXJjZS5jbGFtcCgpKTtcbn1cblxuLy8gZGVpbnRlcnBvbGF0ZShhLCBiKSh4KSB0YWtlcyBhIGRvbWFpbiB2YWx1ZSB4IGluIFthLGJdIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciB0IGluIFswLDFdLlxuLy8gcmVpbnRlcnBvbGF0ZShhLCBiKSh0KSB0YWtlcyBhIHBhcmFtZXRlciB0IGluIFswLDFdIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGRvbWFpbiB2YWx1ZSB4IGluIFthLGJdLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29udGludW91cyhkZWludGVycG9sYXRlLCByZWludGVycG9sYXRlKSB7XG4gIHZhciBkb21haW4gPSB1bml0LFxuICAgICAgcmFuZ2UgPSB1bml0LFxuICAgICAgaW50ZXJwb2xhdGUgPSBpbnRlcnBvbGF0ZVZhbHVlLFxuICAgICAgY2xhbXAgPSBmYWxzZSxcbiAgICAgIHBpZWNld2lzZSxcbiAgICAgIG91dHB1dCxcbiAgICAgIGlucHV0O1xuXG4gIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgcGllY2V3aXNlID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoKSA+IDIgPyBwb2x5bWFwIDogYmltYXA7XG4gICAgb3V0cHV0ID0gaW5wdXQgPSBudWxsO1xuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICByZXR1cm4gKG91dHB1dCB8fCAob3V0cHV0ID0gcGllY2V3aXNlKGRvbWFpbiwgcmFuZ2UsIGNsYW1wID8gZGVpbnRlcnBvbGF0ZUNsYW1wKGRlaW50ZXJwb2xhdGUpIDogZGVpbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGUpKSkoK3gpO1xuICB9XG5cbiAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiAoaW5wdXQgfHwgKGlucHV0ID0gcGllY2V3aXNlKHJhbmdlLCBkb21haW4sIGRlaW50ZXJwb2xhdGVMaW5lYXIsIGNsYW1wID8gcmVpbnRlcnBvbGF0ZUNsYW1wKHJlaW50ZXJwb2xhdGUpIDogcmVpbnRlcnBvbGF0ZSkpKSgreSk7XG4gIH07XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IG1hcC5jYWxsKF8sIG51bWJlciksIHJlc2NhbGUoKSkgOiBkb21haW4uc2xpY2UoKTtcbiAgfTtcblxuICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IHNsaWNlLmNhbGwoXyksIHJlc2NhbGUoKSkgOiByYW5nZS5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIHJhbmdlID0gc2xpY2UuY2FsbChfKSwgaW50ZXJwb2xhdGUgPSBpbnRlcnBvbGF0ZVJvdW5kLCByZXNjYWxlKCk7XG4gIH07XG5cbiAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xhbXAgPSAhIV8sIHJlc2NhbGUoKSkgOiBjbGFtcDtcbiAgfTtcblxuICBzY2FsZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0ZSA9IF8sIHJlc2NhbGUoKSkgOiBpbnRlcnBvbGF0ZTtcbiAgfTtcblxuICByZXR1cm4gcmVzY2FsZSgpO1xufVxuIiwiLy8gW1tmaWxsXWFsaWduXVtzaWduXVtzeW1ib2xdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt+XVt0eXBlXVxudmFyIHJlID0gL14oPzooLik/KFs8Pj1eXSkpPyhbK1xcLSggXSk/KFskI10pPygwKT8oXFxkKyk/KCwpPyhcXC5cXGQrKT8ofik/KFthLXolXSk/JC9pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7XG4gIGlmICghKG1hdGNoID0gcmUuZXhlYyhzcGVjaWZpZXIpKSkgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmb3JtYXQ6IFwiICsgc3BlY2lmaWVyKTtcbiAgdmFyIG1hdGNoO1xuICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmllcih7XG4gICAgZmlsbDogbWF0Y2hbMV0sXG4gICAgYWxpZ246IG1hdGNoWzJdLFxuICAgIHNpZ246IG1hdGNoWzNdLFxuICAgIHN5bWJvbDogbWF0Y2hbNF0sXG4gICAgemVybzogbWF0Y2hbNV0sXG4gICAgd2lkdGg6IG1hdGNoWzZdLFxuICAgIGNvbW1hOiBtYXRjaFs3XSxcbiAgICBwcmVjaXNpb246IG1hdGNoWzhdICYmIG1hdGNoWzhdLnNsaWNlKDEpLFxuICAgIHRyaW06IG1hdGNoWzldLFxuICAgIHR5cGU6IG1hdGNoWzEwXVxuICB9KTtcbn1cblxuZm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZSA9IEZvcm1hdFNwZWNpZmllci5wcm90b3R5cGU7IC8vIGluc3RhbmNlb2ZcblxuZXhwb3J0IGZ1bmN0aW9uIEZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgdGhpcy5maWxsID0gc3BlY2lmaWVyLmZpbGwgPT09IHVuZGVmaW5lZCA/IFwiIFwiIDogc3BlY2lmaWVyLmZpbGwgKyBcIlwiO1xuICB0aGlzLmFsaWduID0gc3BlY2lmaWVyLmFsaWduID09PSB1bmRlZmluZWQgPyBcIj5cIiA6IHNwZWNpZmllci5hbGlnbiArIFwiXCI7XG4gIHRoaXMuc2lnbiA9IHNwZWNpZmllci5zaWduID09PSB1bmRlZmluZWQgPyBcIi1cIiA6IHNwZWNpZmllci5zaWduICsgXCJcIjtcbiAgdGhpcy5zeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sID09PSB1bmRlZmluZWQgPyBcIlwiIDogc3BlY2lmaWVyLnN5bWJvbCArIFwiXCI7XG4gIHRoaXMuemVybyA9ICEhc3BlY2lmaWVyLnplcm87XG4gIHRoaXMud2lkdGggPSBzcGVjaWZpZXIud2lkdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIud2lkdGg7XG4gIHRoaXMuY29tbWEgPSAhIXNwZWNpZmllci5jb21tYTtcbiAgdGhpcy5wcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiArc3BlY2lmaWVyLnByZWNpc2lvbjtcbiAgdGhpcy50cmltID0gISFzcGVjaWZpZXIudHJpbTtcbiAgdGhpcy50eXBlID0gc3BlY2lmaWVyLnR5cGUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBzcGVjaWZpZXIudHlwZSArIFwiXCI7XG59XG5cbkZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZmlsbFxuICAgICAgKyB0aGlzLmFsaWduXG4gICAgICArIHRoaXMuc2lnblxuICAgICAgKyB0aGlzLnN5bWJvbFxuICAgICAgKyAodGhpcy56ZXJvID8gXCIwXCIgOiBcIlwiKVxuICAgICAgKyAodGhpcy53aWR0aCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IE1hdGgubWF4KDEsIHRoaXMud2lkdGggfCAwKSlcbiAgICAgICsgKHRoaXMuY29tbWEgPyBcIixcIiA6IFwiXCIpXG4gICAgICArICh0aGlzLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IFwiLlwiICsgTWF0aC5tYXgoMCwgdGhpcy5wcmVjaXNpb24gfCAwKSlcbiAgICAgICsgKHRoaXMudHJpbSA/IFwiflwiIDogXCJcIilcbiAgICAgICsgdGhpcy50eXBlO1xufTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHggPSBNYXRoLnJvdW5kKHgpKSA+PSAxZTIxXG4gICAgICA/IHgudG9Mb2NhbGVTdHJpbmcoXCJlblwiKS5yZXBsYWNlKC8sL2csIFwiXCIpXG4gICAgICA6IHgudG9TdHJpbmcoMTApO1xufVxuXG4vLyBDb21wdXRlcyB0aGUgZGVjaW1hbCBjb2VmZmljaWVudCBhbmQgZXhwb25lbnQgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgeCB3aXRoXG4vLyBzaWduaWZpY2FudCBkaWdpdHMgcCwgd2hlcmUgeCBpcyBwb3NpdGl2ZSBhbmQgcCBpcyBpbiBbMSwgMjFdIG9yIHVuZGVmaW5lZC5cbi8vIEZvciBleGFtcGxlLCBmb3JtYXREZWNpbWFsUGFydHMoMS4yMykgcmV0dXJucyBbXCIxMjNcIiwgMF0uXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApIHtcbiAgaWYgKChpID0gKHggPSBwID8geC50b0V4cG9uZW50aWFsKHAgLSAxKSA6IHgudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKFwiZVwiKSkgPCAwKSByZXR1cm4gbnVsbDsgLy8gTmFOLCDCsUluZmluaXR5XG4gIHZhciBpLCBjb2VmZmljaWVudCA9IHguc2xpY2UoMCwgaSk7XG5cbiAgLy8gVGhlIHN0cmluZyByZXR1cm5lZCBieSB0b0V4cG9uZW50aWFsIGVpdGhlciBoYXMgdGhlIGZvcm0gXFxkXFwuXFxkK2VbLStdXFxkK1xuICAvLyAoZS5nLiwgMS4yZSszKSBvciB0aGUgZm9ybSBcXGRlWy0rXVxcZCsgKGUuZy4sIDFlKzMpLlxuICByZXR1cm4gW1xuICAgIGNvZWZmaWNpZW50Lmxlbmd0aCA+IDEgPyBjb2VmZmljaWVudFswXSArIGNvZWZmaWNpZW50LnNsaWNlKDIpIDogY29lZmZpY2llbnQsXG4gICAgK3guc2xpY2UoaSArIDEpXG4gIF07XG59XG4iLCJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4ID0gZm9ybWF0RGVjaW1hbFBhcnRzKE1hdGguYWJzKHgpKSwgeCA/IHhbMV0gOiBOYU47XG59XG4iLCJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RlcCwgdmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50KHZhbHVlKSAvIDMpKSkgKiAzIC0gZXhwb25lbnQoTWF0aC5hYnMoc3RlcCkpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGdyb3VwaW5nLCB0aG91c2FuZHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCB3aWR0aCkge1xuICAgIHZhciBpID0gdmFsdWUubGVuZ3RoLFxuICAgICAgICB0ID0gW10sXG4gICAgICAgIGogPSAwLFxuICAgICAgICBnID0gZ3JvdXBpbmdbMF0sXG4gICAgICAgIGxlbmd0aCA9IDA7XG5cbiAgICB3aGlsZSAoaSA+IDAgJiYgZyA+IDApIHtcbiAgICAgIGlmIChsZW5ndGggKyBnICsgMSA+IHdpZHRoKSBnID0gTWF0aC5tYXgoMSwgd2lkdGggLSBsZW5ndGgpO1xuICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkgKyBnKSk7XG4gICAgICBpZiAoKGxlbmd0aCArPSBnICsgMSkgPiB3aWR0aCkgYnJlYWs7XG4gICAgICBnID0gZ3JvdXBpbmdbaiA9IChqICsgMSkgJSBncm91cGluZy5sZW5ndGhdO1xuICAgIH1cblxuICAgIHJldHVybiB0LnJldmVyc2UoKS5qb2luKHRob3VzYW5kcyk7XG4gIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihudW1lcmFscykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWzAtOV0vZywgZnVuY3Rpb24oaSkge1xuICAgICAgcmV0dXJuIG51bWVyYWxzWytpXTtcbiAgICB9KTtcbiAgfTtcbn1cbiIsIi8vIFRyaW1zIGluc2lnbmlmaWNhbnQgemVyb3MsIGUuZy4sIHJlcGxhY2VzIDEuMjAwMGsgd2l0aCAxLjJrLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocykge1xuICBvdXQ6IGZvciAodmFyIG4gPSBzLmxlbmd0aCwgaSA9IDEsIGkwID0gLTEsIGkxOyBpIDwgbjsgKytpKSB7XG4gICAgc3dpdGNoIChzW2ldKSB7XG4gICAgICBjYXNlIFwiLlwiOiBpMCA9IGkxID0gaTsgYnJlYWs7XG4gICAgICBjYXNlIFwiMFwiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IGlmICghK3NbaV0pIGJyZWFrIG91dDsgaWYgKGkwID4gMCkgaTAgPSAwOyBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGkwID4gMCA/IHMuc2xpY2UoMCwgaTApICsgcy5zbGljZShpMSArIDEpIDogcztcbn1cbiIsImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCB2YXIgcHJlZml4RXhwb25lbnQ7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHApIHtcbiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCk7XG4gIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLFxuICAgICAgZXhwb25lbnQgPSBkWzFdLFxuICAgICAgaSA9IGV4cG9uZW50IC0gKHByZWZpeEV4cG9uZW50ID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQgLyAzKSkpICogMykgKyAxLFxuICAgICAgbiA9IGNvZWZmaWNpZW50Lmxlbmd0aDtcbiAgcmV0dXJuIGkgPT09IG4gPyBjb2VmZmljaWVudFxuICAgICAgOiBpID4gbiA/IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGkgLSBuICsgMSkuam9pbihcIjBcIilcbiAgICAgIDogaSA+IDAgPyBjb2VmZmljaWVudC5zbGljZSgwLCBpKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoaSlcbiAgICAgIDogXCIwLlwiICsgbmV3IEFycmF5KDEgLSBpKS5qb2luKFwiMFwiKSArIGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBNYXRoLm1heCgwLCBwICsgaSAtIDEpKVswXTsgLy8gbGVzcyB0aGFuIDF5IVxufVxuIiwiaW1wb3J0IHtmb3JtYXREZWNpbWFsUGFydHN9IGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgcCkge1xuICB2YXIgZCA9IGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKTtcbiAgaWYgKCFkKSByZXR1cm4geCArIFwiXCI7XG4gIHZhciBjb2VmZmljaWVudCA9IGRbMF0sXG4gICAgICBleHBvbmVudCA9IGRbMV07XG4gIHJldHVybiBleHBvbmVudCA8IDAgPyBcIjAuXCIgKyBuZXcgQXJyYXkoLWV4cG9uZW50KS5qb2luKFwiMFwiKSArIGNvZWZmaWNpZW50XG4gICAgICA6IGNvZWZmaWNpZW50Lmxlbmd0aCA+IGV4cG9uZW50ICsgMSA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGV4cG9uZW50ICsgMSkgKyBcIi5cIiArIGNvZWZmaWNpZW50LnNsaWNlKGV4cG9uZW50ICsgMSlcbiAgICAgIDogY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoZXhwb25lbnQgLSBjb2VmZmljaWVudC5sZW5ndGggKyAyKS5qb2luKFwiMFwiKTtcbn1cbiIsImltcG9ydCBmb3JtYXREZWNpbWFsIGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcbmltcG9ydCBmb3JtYXRQcmVmaXhBdXRvIGZyb20gXCIuL2Zvcm1hdFByZWZpeEF1dG8uanNcIjtcbmltcG9ydCBmb3JtYXRSb3VuZGVkIGZyb20gXCIuL2Zvcm1hdFJvdW5kZWQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBcIiVcIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4gKHggKiAxMDApLnRvRml4ZWQocCk7IH0sXG4gIFwiYlwiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDIpOyB9LFxuICBcImNcIjogZnVuY3Rpb24oeCkgeyByZXR1cm4geCArIFwiXCI7IH0sXG4gIFwiZFwiOiBmb3JtYXREZWNpbWFsLFxuICBcImVcIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0V4cG9uZW50aWFsKHApOyB9LFxuICBcImZcIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0ZpeGVkKHApOyB9LFxuICBcImdcIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b1ByZWNpc2lvbihwKTsgfSxcbiAgXCJvXCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoOCk7IH0sXG4gIFwicFwiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiBmb3JtYXRSb3VuZGVkKHggKiAxMDAsIHApOyB9LFxuICBcInJcIjogZm9ybWF0Um91bmRlZCxcbiAgXCJzXCI6IGZvcm1hdFByZWZpeEF1dG8sXG4gIFwiWFwiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOyB9LFxuICBcInhcIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNik7IH1cbn07XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4O1xufVxuIiwiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5pbXBvcnQgZm9ybWF0R3JvdXAgZnJvbSBcIi4vZm9ybWF0R3JvdXAuanNcIjtcbmltcG9ydCBmb3JtYXROdW1lcmFscyBmcm9tIFwiLi9mb3JtYXROdW1lcmFscy5qc1wiO1xuaW1wb3J0IGZvcm1hdFNwZWNpZmllciBmcm9tIFwiLi9mb3JtYXRTcGVjaWZpZXIuanNcIjtcbmltcG9ydCBmb3JtYXRUcmltIGZyb20gXCIuL2Zvcm1hdFRyaW0uanNcIjtcbmltcG9ydCBmb3JtYXRUeXBlcyBmcm9tIFwiLi9mb3JtYXRUeXBlcy5qc1wiO1xuaW1wb3J0IHtwcmVmaXhFeHBvbmVudH0gZnJvbSBcIi4vZm9ybWF0UHJlZml4QXV0by5qc1wiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuL2lkZW50aXR5LmpzXCI7XG5cbnZhciBtYXAgPSBBcnJheS5wcm90b3R5cGUubWFwLFxuICAgIHByZWZpeGVzID0gW1wieVwiLFwielwiLFwiYVwiLFwiZlwiLFwicFwiLFwiblwiLFwiwrVcIixcIm1cIixcIlwiLFwia1wiLFwiTVwiLFwiR1wiLFwiVFwiLFwiUFwiLFwiRVwiLFwiWlwiLFwiWVwiXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obG9jYWxlKSB7XG4gIHZhciBncm91cCA9IGxvY2FsZS5ncm91cGluZyA9PT0gdW5kZWZpbmVkIHx8IGxvY2FsZS50aG91c2FuZHMgPT09IHVuZGVmaW5lZCA/IGlkZW50aXR5IDogZm9ybWF0R3JvdXAobWFwLmNhbGwobG9jYWxlLmdyb3VwaW5nLCBOdW1iZXIpLCBsb2NhbGUudGhvdXNhbmRzICsgXCJcIiksXG4gICAgICBjdXJyZW5jeVByZWZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGxvY2FsZS5jdXJyZW5jeVswXSArIFwiXCIsXG4gICAgICBjdXJyZW5jeVN1ZmZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGxvY2FsZS5jdXJyZW5jeVsxXSArIFwiXCIsXG4gICAgICBkZWNpbWFsID0gbG9jYWxlLmRlY2ltYWwgPT09IHVuZGVmaW5lZCA/IFwiLlwiIDogbG9jYWxlLmRlY2ltYWwgKyBcIlwiLFxuICAgICAgbnVtZXJhbHMgPSBsb2NhbGUubnVtZXJhbHMgPT09IHVuZGVmaW5lZCA/IGlkZW50aXR5IDogZm9ybWF0TnVtZXJhbHMobWFwLmNhbGwobG9jYWxlLm51bWVyYWxzLCBTdHJpbmcpKSxcbiAgICAgIHBlcmNlbnQgPSBsb2NhbGUucGVyY2VudCA9PT0gdW5kZWZpbmVkID8gXCIlXCIgOiBsb2NhbGUucGVyY2VudCArIFwiXCIsXG4gICAgICBtaW51cyA9IGxvY2FsZS5taW51cyA9PT0gdW5kZWZpbmVkID8gXCItXCIgOiBsb2NhbGUubWludXMgKyBcIlwiLFxuICAgICAgbmFuID0gbG9jYWxlLm5hbiA9PT0gdW5kZWZpbmVkID8gXCJOYU5cIiA6IGxvY2FsZS5uYW4gKyBcIlwiO1xuXG4gIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIpIHtcbiAgICBzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKTtcblxuICAgIHZhciBmaWxsID0gc3BlY2lmaWVyLmZpbGwsXG4gICAgICAgIGFsaWduID0gc3BlY2lmaWVyLmFsaWduLFxuICAgICAgICBzaWduID0gc3BlY2lmaWVyLnNpZ24sXG4gICAgICAgIHN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wsXG4gICAgICAgIHplcm8gPSBzcGVjaWZpZXIuemVybyxcbiAgICAgICAgd2lkdGggPSBzcGVjaWZpZXIud2lkdGgsXG4gICAgICAgIGNvbW1hID0gc3BlY2lmaWVyLmNvbW1hLFxuICAgICAgICBwcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uLFxuICAgICAgICB0cmltID0gc3BlY2lmaWVyLnRyaW0sXG4gICAgICAgIHR5cGUgPSBzcGVjaWZpZXIudHlwZTtcblxuICAgIC8vIFRoZSBcIm5cIiB0eXBlIGlzIGFuIGFsaWFzIGZvciBcIixnXCIuXG4gICAgaWYgKHR5cGUgPT09IFwiblwiKSBjb21tYSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIFRoZSBcIlwiIHR5cGUsIGFuZCBhbnkgaW52YWxpZCB0eXBlLCBpcyBhbiBhbGlhcyBmb3IgXCIuMTJ+Z1wiLlxuICAgIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgcHJlY2lzaW9uID09PSB1bmRlZmluZWQgJiYgKHByZWNpc2lvbiA9IDEyKSwgdHJpbSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBhZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLlxuICAgIGlmICh6ZXJvIHx8IChmaWxsID09PSBcIjBcIiAmJiBhbGlnbiA9PT0gXCI9XCIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9IFwiMFwiLCBhbGlnbiA9IFwiPVwiO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgLy8gRm9yIFNJLXByZWZpeCwgdGhlIHN1ZmZpeCBpcyBsYXppbHkgY29tcHV0ZWQuXG4gICAgdmFyIHByZWZpeCA9IHN5bWJvbCA9PT0gXCIkXCIgPyBjdXJyZW5jeVByZWZpeCA6IHN5bWJvbCA9PT0gXCIjXCIgJiYgL1tib3hYXS8udGVzdCh0eXBlKSA/IFwiMFwiICsgdHlwZS50b0xvd2VyQ2FzZSgpIDogXCJcIixcbiAgICAgICAgc3VmZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5U3VmZml4IDogL1slcF0vLnRlc3QodHlwZSkgPyBwZXJjZW50IDogXCJcIjtcblxuICAgIC8vIFdoYXQgZm9ybWF0IGZ1bmN0aW9uIHNob3VsZCB3ZSB1c2U/XG4gICAgLy8gSXMgdGhpcyBhbiBpbnRlZ2VyIHR5cGU/XG4gICAgLy8gQ2FuIHRoaXMgdHlwZSBnZW5lcmF0ZSBleHBvbmVudGlhbCBub3RhdGlvbj9cbiAgICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdFR5cGVzW3R5cGVdLFxuICAgICAgICBtYXliZVN1ZmZpeCA9IC9bZGVmZ3BycyVdLy50ZXN0KHR5cGUpO1xuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0IHByZWNpc2lvbiBpZiBub3Qgc3BlY2lmaWVkLFxuICAgIC8vIG9yIGNsYW1wIHRoZSBzcGVjaWZpZWQgcHJlY2lzaW9uIHRvIHRoZSBzdXBwb3J0ZWQgcmFuZ2UuXG4gICAgLy8gRm9yIHNpZ25pZmljYW50IHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMSwgMjFdLlxuICAgIC8vIEZvciBmaXhlZCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzAsIDIwXS5cbiAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IDZcbiAgICAgICAgOiAvW2dwcnNdLy50ZXN0KHR5cGUpID8gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpXG4gICAgICAgIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpO1xuXG4gICAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlKSB7XG4gICAgICB2YXIgdmFsdWVQcmVmaXggPSBwcmVmaXgsXG4gICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsXG4gICAgICAgICAgaSwgbiwgYztcblxuICAgICAgaWYgKHR5cGUgPT09IFwiY1wiKSB7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gZm9ybWF0VHlwZSh2YWx1ZSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgdmFsdWUgPSBcIlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSArdmFsdWU7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBzaWduLiAtMCBpcyBub3QgbGVzcyB0aGFuIDAsIGJ1dCAxIC8gLTAgaXMhXG4gICAgICAgIHZhciB2YWx1ZU5lZ2F0aXZlID0gdmFsdWUgPCAwIHx8IDEgLyB2YWx1ZSA8IDA7XG5cbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgaW5pdGlhbCBmb3JtYXR0aW5nLlxuICAgICAgICB2YWx1ZSA9IGlzTmFOKHZhbHVlKSA/IG5hbiA6IGZvcm1hdFR5cGUoTWF0aC5hYnModmFsdWUpLCBwcmVjaXNpb24pO1xuXG4gICAgICAgIC8vIFRyaW0gaW5zaWduaWZpY2FudCB6ZXJvcy5cbiAgICAgICAgaWYgKHRyaW0pIHZhbHVlID0gZm9ybWF0VHJpbSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gSWYgYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgdG8gemVybyBhZnRlciBmb3JtYXR0aW5nLCBhbmQgbm8gZXhwbGljaXQgcG9zaXRpdmUgc2lnbiBpcyByZXF1ZXN0ZWQsIGhpZGUgdGhlIHNpZ24uXG4gICAgICAgIGlmICh2YWx1ZU5lZ2F0aXZlICYmICt2YWx1ZSA9PT0gMCAmJiBzaWduICE9PSBcIitcIikgdmFsdWVOZWdhdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICAgICAgICB2YWx1ZVByZWZpeCA9ICh2YWx1ZU5lZ2F0aXZlID8gKHNpZ24gPT09IFwiKFwiID8gc2lnbiA6IG1pbnVzKSA6IHNpZ24gPT09IFwiLVwiIHx8IHNpZ24gPT09IFwiKFwiID8gXCJcIiA6IHNpZ24pICsgdmFsdWVQcmVmaXg7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gKHR5cGUgPT09IFwic1wiID8gcHJlZml4ZXNbOCArIHByZWZpeEV4cG9uZW50IC8gM10gOiBcIlwiKSArIHZhbHVlU3VmZml4ICsgKHZhbHVlTmVnYXRpdmUgJiYgc2lnbiA9PT0gXCIoXCIgPyBcIilcIiA6IFwiXCIpO1xuXG4gICAgICAgIC8vIEJyZWFrIHRoZSBmb3JtYXR0ZWQgdmFsdWUgaW50byB0aGUgaW50ZWdlciDigJx2YWx1ZeKAnSBwYXJ0IHRoYXQgY2FuIGJlXG4gICAgICAgIC8vIGdyb3VwZWQsIGFuZCBmcmFjdGlvbmFsIG9yIGV4cG9uZW50aWFsIOKAnHN1ZmZpeOKAnSBwYXJ0IHRoYXQgaXMgbm90LlxuICAgICAgICBpZiAobWF5YmVTdWZmaXgpIHtcbiAgICAgICAgICBpID0gLTEsIG4gPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICAgIGlmIChjID0gdmFsdWUuY2hhckNvZGVBdChpKSwgNDggPiBjIHx8IGMgPiA1Nykge1xuICAgICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IChjID09PSA0NiA/IGRlY2ltYWwgKyB2YWx1ZS5zbGljZShpICsgMSkgOiB2YWx1ZS5zbGljZShpKSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBub3QgXCIwXCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuXG4gICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTtcblxuICAgICAgLy8gQ29tcHV0ZSB0aGUgcGFkZGluZy5cbiAgICAgIHZhciBsZW5ndGggPSB2YWx1ZVByZWZpeC5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKyB2YWx1ZVN1ZmZpeC5sZW5ndGgsXG4gICAgICAgICAgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6IFwiXCI7XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBcIjBcIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBhZnRlciBwYWRkaW5nLlxuICAgICAgaWYgKGNvbW1hICYmIHplcm8pIHZhbHVlID0gZ3JvdXAocGFkZGluZyArIHZhbHVlLCBwYWRkaW5nLmxlbmd0aCA/IHdpZHRoIC0gdmFsdWVTdWZmaXgubGVuZ3RoIDogSW5maW5pdHkpLCBwYWRkaW5nID0gXCJcIjtcblxuICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuXG4gICAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICAgIGNhc2UgXCI8XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZzsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCI9XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyBwYWRkaW5nICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJeXCI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudW1lcmFscyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9ybWF0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3BlY2lmaWVyICsgXCJcIjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKSB7XG4gICAgdmFyIGYgPSBuZXdGb3JtYXQoKHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpLCBzcGVjaWZpZXIudHlwZSA9IFwiZlwiLCBzcGVjaWZpZXIpKSxcbiAgICAgICAgZSA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50KHZhbHVlKSAvIDMpKSkgKiAzLFxuICAgICAgICBrID0gTWF0aC5wb3coMTAsIC1lKSxcbiAgICAgICAgcHJlZml4ID0gcHJlZml4ZXNbOCArIGUgLyAzXTtcbiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBmKGsgKiB2YWx1ZSkgKyBwcmVmaXg7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0OiBuZXdGb3JtYXQsXG4gICAgZm9ybWF0UHJlZml4OiBmb3JtYXRQcmVmaXhcbiAgfTtcbn1cbiIsImltcG9ydCBmb3JtYXRMb2NhbGUgZnJvbSBcIi4vbG9jYWxlLmpzXCI7XG5cbnZhciBsb2NhbGU7XG5leHBvcnQgdmFyIGZvcm1hdDtcbmV4cG9ydCB2YXIgZm9ybWF0UHJlZml4O1xuXG5kZWZhdWx0TG9jYWxlKHtcbiAgZGVjaW1hbDogXCIuXCIsXG4gIHRob3VzYW5kczogXCIsXCIsXG4gIGdyb3VwaW5nOiBbM10sXG4gIGN1cnJlbmN5OiBbXCIkXCIsIFwiXCJdLFxuICBtaW51czogXCItXCJcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWZhdWx0TG9jYWxlKGRlZmluaXRpb24pIHtcbiAgbG9jYWxlID0gZm9ybWF0TG9jYWxlKGRlZmluaXRpb24pO1xuICBmb3JtYXQgPSBsb2NhbGUuZm9ybWF0O1xuICBmb3JtYXRQcmVmaXggPSBsb2NhbGUuZm9ybWF0UHJlZml4O1xuICByZXR1cm4gbG9jYWxlO1xufVxuIiwiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0ZXAsIG1heCkge1xuICBzdGVwID0gTWF0aC5hYnMoc3RlcCksIG1heCA9IE1hdGguYWJzKG1heCkgLSBzdGVwO1xuICByZXR1cm4gTWF0aC5tYXgoMCwgZXhwb25lbnQobWF4KSAtIGV4cG9uZW50KHN0ZXApKSArIDE7XG59XG4iLCJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RlcCkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgLWV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7XG59XG4iLCJpbXBvcnQge3RpY2tTdGVwfSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7Zm9ybWF0LCBmb3JtYXRQcmVmaXgsIGZvcm1hdFNwZWNpZmllciwgcHJlY2lzaW9uRml4ZWQsIHByZWNpc2lvblByZWZpeCwgcHJlY2lzaW9uUm91bmR9IGZyb20gXCJkMy1mb3JtYXRcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZG9tYWluLCBjb3VudCwgc3BlY2lmaWVyKSB7XG4gIHZhciBzdGFydCA9IGRvbWFpblswXSxcbiAgICAgIHN0b3AgPSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdLFxuICAgICAgc3RlcCA9IHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCksXG4gICAgICBwcmVjaXNpb247XG4gIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIgPT0gbnVsbCA/IFwiLGZcIiA6IHNwZWNpZmllcik7XG4gIHN3aXRjaCAoc3BlY2lmaWVyLnR5cGUpIHtcbiAgICBjYXNlIFwic1wiOiB7XG4gICAgICB2YXIgdmFsdWUgPSBNYXRoLm1heChNYXRoLmFicyhzdGFydCksIE1hdGguYWJzKHN0b3ApKTtcbiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvblByZWZpeChzdGVwLCB2YWx1ZSkpKSBzcGVjaWZpZXIucHJlY2lzaW9uID0gcHJlY2lzaW9uO1xuICAgICAgcmV0dXJuIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKTtcbiAgICB9XG4gICAgY2FzZSBcIlwiOlxuICAgIGNhc2UgXCJlXCI6XG4gICAgY2FzZSBcImdcIjpcbiAgICBjYXNlIFwicFwiOlxuICAgIGNhc2UgXCJyXCI6IHtcbiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvblJvdW5kKHN0ZXAsIE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb24gLSAoc3BlY2lmaWVyLnR5cGUgPT09IFwiZVwiKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiZlwiOlxuICAgIGNhc2UgXCIlXCI6IHtcbiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvbkZpeGVkKHN0ZXApKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlwZSA9PT0gXCIlXCIpICogMjtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZm9ybWF0KHNwZWNpZmllcik7XG59XG4iLCJpbXBvcnQge3RpY2tzLCB0aWNrSW5jcmVtZW50fSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGVOdW1iZXIgYXMgcmVpbnRlcnBvbGF0ZX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge2RlZmF1bHQgYXMgY29udGludW91cywgY29weSwgZGVpbnRlcnBvbGF0ZUxpbmVhciBhcyBkZWludGVycG9sYXRlfSBmcm9tIFwiLi9jb250aW51b3VzXCI7XG5pbXBvcnQgdGlja0Zvcm1hdCBmcm9tIFwiLi90aWNrRm9ybWF0XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5lYXJpc2goc2NhbGUpIHtcbiAgdmFyIGRvbWFpbiA9IHNjYWxlLmRvbWFpbjtcblxuICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgdmFyIGQgPSBkb21haW4oKTtcbiAgICByZXR1cm4gdGlja3MoZFswXSwgZFtkLmxlbmd0aCAtIDFdLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCk7XG4gIH07XG5cbiAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGNvdW50LCBzcGVjaWZpZXIpIHtcbiAgICByZXR1cm4gdGlja0Zvcm1hdChkb21haW4oKSwgY291bnQsIHNwZWNpZmllcik7XG4gIH07XG5cbiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09IG51bGwpIGNvdW50ID0gMTA7XG5cbiAgICB2YXIgZCA9IGRvbWFpbigpLFxuICAgICAgICBpMCA9IDAsXG4gICAgICAgIGkxID0gZC5sZW5ndGggLSAxLFxuICAgICAgICBzdGFydCA9IGRbaTBdLFxuICAgICAgICBzdG9wID0gZFtpMV0sXG4gICAgICAgIHN0ZXA7XG5cbiAgICBpZiAoc3RvcCA8IHN0YXJ0KSB7XG4gICAgICBzdGVwID0gc3RhcnQsIHN0YXJ0ID0gc3RvcCwgc3RvcCA9IHN0ZXA7XG4gICAgICBzdGVwID0gaTAsIGkwID0gaTEsIGkxID0gc3RlcDtcbiAgICB9XG5cbiAgICBzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpO1xuXG4gICAgaWYgKHN0ZXAgPiAwKSB7XG4gICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc3RhcnQgLyBzdGVwKSAqIHN0ZXA7XG4gICAgICBzdG9wID0gTWF0aC5jZWlsKHN0b3AgLyBzdGVwKSAqIHN0ZXA7XG4gICAgICBzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpO1xuICAgIH0gZWxzZSBpZiAoc3RlcCA8IDApIHtcbiAgICAgIHN0YXJ0ID0gTWF0aC5jZWlsKHN0YXJ0ICogc3RlcCkgLyBzdGVwO1xuICAgICAgc3RvcCA9IE1hdGguZmxvb3Ioc3RvcCAqIHN0ZXApIC8gc3RlcDtcbiAgICAgIHN0ZXAgPSB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCk7XG4gICAgfVxuXG4gICAgaWYgKHN0ZXAgPiAwKSB7XG4gICAgICBkW2kwXSA9IE1hdGguZmxvb3Ioc3RhcnQgLyBzdGVwKSAqIHN0ZXA7XG4gICAgICBkW2kxXSA9IE1hdGguY2VpbChzdG9wIC8gc3RlcCkgKiBzdGVwO1xuICAgICAgZG9tYWluKGQpO1xuICAgIH0gZWxzZSBpZiAoc3RlcCA8IDApIHtcbiAgICAgIGRbaTBdID0gTWF0aC5jZWlsKHN0YXJ0ICogc3RlcCkgLyBzdGVwO1xuICAgICAgZFtpMV0gPSBNYXRoLmZsb29yKHN0b3AgKiBzdGVwKSAvIHN0ZXA7XG4gICAgICBkb21haW4oZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9O1xuXG4gIHJldHVybiBzY2FsZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGluZWFyKCkge1xuICB2YXIgc2NhbGUgPSBjb250aW51b3VzKGRlaW50ZXJwb2xhdGUsIHJlaW50ZXJwb2xhdGUpO1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gY29weShzY2FsZSwgbGluZWFyKCkpO1xuICB9O1xuXG4gIHJldHVybiBsaW5lYXJpc2goc2NhbGUpO1xufVxuIiwiaW1wb3J0IHttYXB9IGZyb20gXCIuL2FycmF5XCI7XG5pbXBvcnQge2xpbmVhcmlzaH0gZnJvbSBcIi4vbGluZWFyXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpZGVudGl0eSgpIHtcbiAgdmFyIGRvbWFpbiA9IFswLCAxXTtcblxuICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgcmV0dXJuICt4O1xuICB9XG5cbiAgc2NhbGUuaW52ZXJ0ID0gc2NhbGU7XG5cbiAgc2NhbGUuZG9tYWluID0gc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gbWFwLmNhbGwoXywgbnVtYmVyKSwgc2NhbGUpIDogZG9tYWluLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBpZGVudGl0eSgpLmRvbWFpbihkb21haW4pO1xuICB9O1xuXG4gIHJldHVybiBsaW5lYXJpc2goc2NhbGUpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZG9tYWluLCBpbnRlcnZhbCkge1xuICBkb21haW4gPSBkb21haW4uc2xpY2UoKTtcblxuICB2YXIgaTAgPSAwLFxuICAgICAgaTEgPSBkb21haW4ubGVuZ3RoIC0gMSxcbiAgICAgIHgwID0gZG9tYWluW2kwXSxcbiAgICAgIHgxID0gZG9tYWluW2kxXSxcbiAgICAgIHQ7XG5cbiAgaWYgKHgxIDwgeDApIHtcbiAgICB0ID0gaTAsIGkwID0gaTEsIGkxID0gdDtcbiAgICB0ID0geDAsIHgwID0geDEsIHgxID0gdDtcbiAgfVxuXG4gIGRvbWFpbltpMF0gPSBpbnRlcnZhbC5mbG9vcih4MCk7XG4gIGRvbWFpbltpMV0gPSBpbnRlcnZhbC5jZWlsKHgxKTtcbiAgcmV0dXJuIGRvbWFpbjtcbn1cbiIsImltcG9ydCB7dGlja3N9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHtmb3JtYXR9IGZyb20gXCJkMy1mb3JtYXRcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IG5pY2UgZnJvbSBcIi4vbmljZVwiO1xuaW1wb3J0IHtkZWZhdWx0IGFzIGNvbnRpbnVvdXMsIGNvcHl9IGZyb20gXCIuL2NvbnRpbnVvdXNcIjtcblxuZnVuY3Rpb24gZGVpbnRlcnBvbGF0ZShhLCBiKSB7XG4gIHJldHVybiAoYiA9IE1hdGgubG9nKGIgLyBhKSlcbiAgICAgID8gZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5sb2coeCAvIGEpIC8gYjsgfVxuICAgICAgOiBjb25zdGFudChiKTtcbn1cblxuZnVuY3Rpb24gcmVpbnRlcnBvbGF0ZShhLCBiKSB7XG4gIHJldHVybiBhIDwgMFxuICAgICAgPyBmdW5jdGlvbih0KSB7IHJldHVybiAtTWF0aC5wb3coLWIsIHQpICogTWF0aC5wb3coLWEsIDEgLSB0KTsgfVxuICAgICAgOiBmdW5jdGlvbih0KSB7IHJldHVybiBNYXRoLnBvdyhiLCB0KSAqIE1hdGgucG93KGEsIDEgLSB0KTsgfTtcbn1cblxuZnVuY3Rpb24gcG93MTAoeCkge1xuICByZXR1cm4gaXNGaW5pdGUoeCkgPyArKFwiMWVcIiArIHgpIDogeCA8IDAgPyAwIDogeDtcbn1cblxuZnVuY3Rpb24gcG93cChiYXNlKSB7XG4gIHJldHVybiBiYXNlID09PSAxMCA/IHBvdzEwXG4gICAgICA6IGJhc2UgPT09IE1hdGguRSA/IE1hdGguZXhwXG4gICAgICA6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucG93KGJhc2UsIHgpOyB9O1xufVxuXG5mdW5jdGlvbiBsb2dwKGJhc2UpIHtcbiAgcmV0dXJuIGJhc2UgPT09IE1hdGguRSA/IE1hdGgubG9nXG4gICAgICA6IGJhc2UgPT09IDEwICYmIE1hdGgubG9nMTBcbiAgICAgIHx8IGJhc2UgPT09IDIgJiYgTWF0aC5sb2cyXG4gICAgICB8fCAoYmFzZSA9IE1hdGgubG9nKGJhc2UpLCBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLmxvZyh4KSAvIGJhc2U7IH0pO1xufVxuXG5mdW5jdGlvbiByZWZsZWN0KGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gLWYoLXgpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2coKSB7XG4gIHZhciBzY2FsZSA9IGNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSkuZG9tYWluKFsxLCAxMF0pLFxuICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluLFxuICAgICAgYmFzZSA9IDEwLFxuICAgICAgbG9ncyA9IGxvZ3AoMTApLFxuICAgICAgcG93cyA9IHBvd3AoMTApO1xuXG4gIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgbG9ncyA9IGxvZ3AoYmFzZSksIHBvd3MgPSBwb3dwKGJhc2UpO1xuICAgIGlmIChkb21haW4oKVswXSA8IDApIGxvZ3MgPSByZWZsZWN0KGxvZ3MpLCBwb3dzID0gcmVmbGVjdChwb3dzKTtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBzY2FsZS5iYXNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhc2UgPSArXywgcmVzY2FsZSgpKSA6IGJhc2U7XG4gIH07XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbihfKSwgcmVzY2FsZSgpKSA6IGRvbWFpbigpO1xuICB9O1xuXG4gIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICB2YXIgZCA9IGRvbWFpbigpLFxuICAgICAgICB1ID0gZFswXSxcbiAgICAgICAgdiA9IGRbZC5sZW5ndGggLSAxXSxcbiAgICAgICAgcjtcblxuICAgIGlmIChyID0gdiA8IHUpIGkgPSB1LCB1ID0gdiwgdiA9IGk7XG5cbiAgICB2YXIgaSA9IGxvZ3ModSksXG4gICAgICAgIGogPSBsb2dzKHYpLFxuICAgICAgICBwLFxuICAgICAgICBrLFxuICAgICAgICB0LFxuICAgICAgICBuID0gY291bnQgPT0gbnVsbCA/IDEwIDogK2NvdW50LFxuICAgICAgICB6ID0gW107XG5cbiAgICBpZiAoIShiYXNlICUgMSkgJiYgaiAtIGkgPCBuKSB7XG4gICAgICBpID0gTWF0aC5yb3VuZChpKSAtIDEsIGogPSBNYXRoLnJvdW5kKGopICsgMTtcbiAgICAgIGlmICh1ID4gMCkgZm9yICg7IGkgPCBqOyArK2kpIHtcbiAgICAgICAgZm9yIChrID0gMSwgcCA9IHBvd3MoaSk7IGsgPCBiYXNlOyArK2spIHtcbiAgICAgICAgICB0ID0gcCAqIGs7XG4gICAgICAgICAgaWYgKHQgPCB1KSBjb250aW51ZTtcbiAgICAgICAgICBpZiAodCA+IHYpIGJyZWFrO1xuICAgICAgICAgIHoucHVzaCh0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGZvciAoOyBpIDwgajsgKytpKSB7XG4gICAgICAgIGZvciAoayA9IGJhc2UgLSAxLCBwID0gcG93cyhpKTsgayA+PSAxOyAtLWspIHtcbiAgICAgICAgICB0ID0gcCAqIGs7XG4gICAgICAgICAgaWYgKHQgPCB1KSBjb250aW51ZTtcbiAgICAgICAgICBpZiAodCA+IHYpIGJyZWFrO1xuICAgICAgICAgIHoucHVzaCh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB6ID0gdGlja3MoaSwgaiwgTWF0aC5taW4oaiAtIGksIG4pKS5tYXAocG93cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHIgPyB6LnJldmVyc2UoKSA6IHo7XG4gIH07XG5cbiAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGNvdW50LCBzcGVjaWZpZXIpIHtcbiAgICBpZiAoc3BlY2lmaWVyID09IG51bGwpIHNwZWNpZmllciA9IGJhc2UgPT09IDEwID8gXCIuMGVcIiA6IFwiLFwiO1xuICAgIGlmICh0eXBlb2Ygc3BlY2lmaWVyICE9PSBcImZ1bmN0aW9uXCIpIHNwZWNpZmllciA9IGZvcm1hdChzcGVjaWZpZXIpO1xuICAgIGlmIChjb3VudCA9PT0gSW5maW5pdHkpIHJldHVybiBzcGVjaWZpZXI7XG4gICAgaWYgKGNvdW50ID09IG51bGwpIGNvdW50ID0gMTA7XG4gICAgdmFyIGsgPSBNYXRoLm1heCgxLCBiYXNlICogY291bnQgLyBzY2FsZS50aWNrcygpLmxlbmd0aCk7IC8vIFRPRE8gZmFzdCBlc3RpbWF0ZT9cbiAgICByZXR1cm4gZnVuY3Rpb24oZCkge1xuICAgICAgdmFyIGkgPSBkIC8gcG93cyhNYXRoLnJvdW5kKGxvZ3MoZCkpKTtcbiAgICAgIGlmIChpICogYmFzZSA8IGJhc2UgLSAwLjUpIGkgKj0gYmFzZTtcbiAgICAgIHJldHVybiBpIDw9IGsgPyBzcGVjaWZpZXIoZCkgOiBcIlwiO1xuICAgIH07XG4gIH07XG5cbiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkb21haW4obmljZShkb21haW4oKSwge1xuICAgICAgZmxvb3I6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHBvd3MoTWF0aC5mbG9vcihsb2dzKHgpKSk7IH0sXG4gICAgICBjZWlsOiBmdW5jdGlvbih4KSB7IHJldHVybiBwb3dzKE1hdGguY2VpbChsb2dzKHgpKSk7IH1cbiAgICB9KSk7XG4gIH07XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBjb3B5KHNjYWxlLCBsb2coKS5iYXNlKGJhc2UpKTtcbiAgfTtcblxuICByZXR1cm4gc2NhbGU7XG59XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCB7bGluZWFyaXNofSBmcm9tIFwiLi9saW5lYXJcIjtcbmltcG9ydCB7ZGVmYXVsdCBhcyBjb250aW51b3VzLCBjb3B5fSBmcm9tIFwiLi9jb250aW51b3VzXCI7XG5cbmZ1bmN0aW9uIHJhaXNlKHgsIGV4cG9uZW50KSB7XG4gIHJldHVybiB4IDwgMCA/IC1NYXRoLnBvdygteCwgZXhwb25lbnQpIDogTWF0aC5wb3coeCwgZXhwb25lbnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwb3coKSB7XG4gIHZhciBleHBvbmVudCA9IDEsXG4gICAgICBzY2FsZSA9IGNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSksXG4gICAgICBkb21haW4gPSBzY2FsZS5kb21haW47XG5cbiAgZnVuY3Rpb24gZGVpbnRlcnBvbGF0ZShhLCBiKSB7XG4gICAgcmV0dXJuIChiID0gcmFpc2UoYiwgZXhwb25lbnQpIC0gKGEgPSByYWlzZShhLCBleHBvbmVudCkpKVxuICAgICAgICA/IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIChyYWlzZSh4LCBleHBvbmVudCkgLSBhKSAvIGI7IH1cbiAgICAgICAgOiBjb25zdGFudChiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlaW50ZXJwb2xhdGUoYSwgYikge1xuICAgIGIgPSByYWlzZShiLCBleHBvbmVudCkgLSAoYSA9IHJhaXNlKGEsIGV4cG9uZW50KSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsgcmV0dXJuIHJhaXNlKGEgKyBiICogdCwgMSAvIGV4cG9uZW50KTsgfTtcbiAgfVxuXG4gIHNjYWxlLmV4cG9uZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4cG9uZW50ID0gK18sIGRvbWFpbihkb21haW4oKSkpIDogZXhwb25lbnQ7XG4gIH07XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBjb3B5KHNjYWxlLCBwb3coKS5leHBvbmVudChleHBvbmVudCkpO1xuICB9O1xuXG4gIHJldHVybiBsaW5lYXJpc2goc2NhbGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3FydCgpIHtcbiAgcmV0dXJuIHBvdygpLmV4cG9uZW50KDAuNSk7XG59XG4iLCJpbXBvcnQge2FzY2VuZGluZywgYmlzZWN0LCBxdWFudGlsZSBhcyB0aHJlc2hvbGR9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHtzbGljZX0gZnJvbSBcIi4vYXJyYXlcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVhbnRpbGUoKSB7XG4gIHZhciBkb21haW4gPSBbXSxcbiAgICAgIHJhbmdlID0gW10sXG4gICAgICB0aHJlc2hvbGRzID0gW107XG5cbiAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcbiAgICB2YXIgaSA9IDAsIG4gPSBNYXRoLm1heCgxLCByYW5nZS5sZW5ndGgpO1xuICAgIHRocmVzaG9sZHMgPSBuZXcgQXJyYXkobiAtIDEpO1xuICAgIHdoaWxlICgrK2kgPCBuKSB0aHJlc2hvbGRzW2kgLSAxXSA9IHRocmVzaG9sZChkb21haW4sIGkgLyBuKTtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgaWYgKCFpc05hTih4ID0gK3gpKSByZXR1cm4gcmFuZ2VbYmlzZWN0KHRocmVzaG9sZHMsIHgpXTtcbiAgfVxuXG4gIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHtcbiAgICB2YXIgaSA9IHJhbmdlLmluZGV4T2YoeSk7XG4gICAgcmV0dXJuIGkgPCAwID8gW05hTiwgTmFOXSA6IFtcbiAgICAgIGkgPiAwID8gdGhyZXNob2xkc1tpIC0gMV0gOiBkb21haW5bMF0sXG4gICAgICBpIDwgdGhyZXNob2xkcy5sZW5ndGggPyB0aHJlc2hvbGRzW2ldIDogZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXVxuICAgIF07XG4gIH07XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbi5zbGljZSgpO1xuICAgIGRvbWFpbiA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gXy5sZW5ndGgsIGQ7IGkgPCBuOyArK2kpIGlmIChkID0gX1tpXSwgZCAhPSBudWxsICYmICFpc05hTihkID0gK2QpKSBkb21haW4ucHVzaChkKTtcbiAgICBkb21haW4uc29ydChhc2NlbmRpbmcpO1xuICAgIHJldHVybiByZXNjYWxlKCk7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBzbGljZS5jYWxsKF8pLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTtcbiAgfTtcblxuICBzY2FsZS5xdWFudGlsZXMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhyZXNob2xkcy5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcXVhbnRpbGUoKVxuICAgICAgICAuZG9tYWluKGRvbWFpbilcbiAgICAgICAgLnJhbmdlKHJhbmdlKTtcbiAgfTtcblxuICByZXR1cm4gc2NhbGU7XG59XG4iLCJpbXBvcnQge2Jpc2VjdH0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge3NsaWNlfSBmcm9tIFwiLi9hcnJheVwiO1xuaW1wb3J0IHtsaW5lYXJpc2h9IGZyb20gXCIuL2xpbmVhclwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFudGl6ZSgpIHtcbiAgdmFyIHgwID0gMCxcbiAgICAgIHgxID0gMSxcbiAgICAgIG4gPSAxLFxuICAgICAgZG9tYWluID0gWzAuNV0sXG4gICAgICByYW5nZSA9IFswLCAxXTtcblxuICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgaWYgKHggPD0geCkgcmV0dXJuIHJhbmdlW2Jpc2VjdChkb21haW4sIHgsIDAsIG4pXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgdmFyIGkgPSAtMTtcbiAgICBkb21haW4gPSBuZXcgQXJyYXkobik7XG4gICAgd2hpbGUgKCsraSA8IG4pIGRvbWFpbltpXSA9ICgoaSArIDEpICogeDEgLSAoaSAtIG4pICogeDApIC8gKG4gKyAxKTtcbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSArX1swXSwgeDEgPSArX1sxXSwgcmVzY2FsZSgpKSA6IFt4MCwgeDFdO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG4gPSAocmFuZ2UgPSBzbGljZS5jYWxsKF8pKS5sZW5ndGggLSAxLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTtcbiAgfTtcblxuICBzY2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7XG4gICAgdmFyIGkgPSByYW5nZS5pbmRleE9mKHkpO1xuICAgIHJldHVybiBpIDwgMCA/IFtOYU4sIE5hTl1cbiAgICAgICAgOiBpIDwgMSA/IFt4MCwgZG9tYWluWzBdXVxuICAgICAgICA6IGkgPj0gbiA/IFtkb21haW5bbiAtIDFdLCB4MV1cbiAgICAgICAgOiBbZG9tYWluW2kgLSAxXSwgZG9tYWluW2ldXTtcbiAgfTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHF1YW50aXplKClcbiAgICAgICAgLmRvbWFpbihbeDAsIHgxXSlcbiAgICAgICAgLnJhbmdlKHJhbmdlKTtcbiAgfTtcblxuICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTtcbn1cbiIsImltcG9ydCB7YmlzZWN0fSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7c2xpY2V9IGZyb20gXCIuL2FycmF5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRocmVzaG9sZCgpIHtcbiAgdmFyIGRvbWFpbiA9IFswLjVdLFxuICAgICAgcmFuZ2UgPSBbMCwgMV0sXG4gICAgICBuID0gMTtcblxuICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgaWYgKHggPD0geCkgcmV0dXJuIHJhbmdlW2Jpc2VjdChkb21haW4sIHgsIDAsIG4pXTtcbiAgfVxuXG4gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4gPSBzbGljZS5jYWxsKF8pLCBuID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoIC0gMSksIHNjYWxlKSA6IGRvbWFpbi5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gc2xpY2UuY2FsbChfKSwgbiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCAtIDEpLCBzY2FsZSkgOiByYW5nZS5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHtcbiAgICB2YXIgaSA9IHJhbmdlLmluZGV4T2YoeSk7XG4gICAgcmV0dXJuIFtkb21haW5baSAtIDFdLCBkb21haW5baV1dO1xuICB9O1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhyZXNob2xkKClcbiAgICAgICAgLmRvbWFpbihkb21haW4pXG4gICAgICAgIC5yYW5nZShyYW5nZSk7XG4gIH07XG5cbiAgcmV0dXJuIHNjYWxlO1xufVxuIiwidmFyIHQwID0gbmV3IERhdGUsXG4gICAgdDEgPSBuZXcgRGF0ZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbmV3SW50ZXJ2YWwoZmxvb3JpLCBvZmZzZXRpLCBjb3VudCwgZmllbGQpIHtcblxuICBmdW5jdGlvbiBpbnRlcnZhbChkYXRlKSB7XG4gICAgcmV0dXJuIGZsb29yaShkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMCA/IG5ldyBEYXRlIDogbmV3IERhdGUoK2RhdGUpKSwgZGF0ZTtcbiAgfVxuXG4gIGludGVydmFsLmZsb29yID0gZnVuY3Rpb24oZGF0ZSkge1xuICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKSksIGRhdGU7XG4gIH07XG5cbiAgaW50ZXJ2YWwuY2VpbCA9IGZ1bmN0aW9uKGRhdGUpIHtcbiAgICByZXR1cm4gZmxvb3JpKGRhdGUgPSBuZXcgRGF0ZShkYXRlIC0gMSkpLCBvZmZzZXRpKGRhdGUsIDEpLCBmbG9vcmkoZGF0ZSksIGRhdGU7XG4gIH07XG5cbiAgaW50ZXJ2YWwucm91bmQgPSBmdW5jdGlvbihkYXRlKSB7XG4gICAgdmFyIGQwID0gaW50ZXJ2YWwoZGF0ZSksXG4gICAgICAgIGQxID0gaW50ZXJ2YWwuY2VpbChkYXRlKTtcbiAgICByZXR1cm4gZGF0ZSAtIGQwIDwgZDEgLSBkYXRlID8gZDAgOiBkMTtcbiAgfTtcblxuICBpbnRlcnZhbC5vZmZzZXQgPSBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gICAgcmV0dXJuIG9mZnNldGkoZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKSwgc3RlcCA9PSBudWxsID8gMSA6IE1hdGguZmxvb3Ioc3RlcCkpLCBkYXRlO1xuICB9O1xuXG4gIGludGVydmFsLnJhbmdlID0gZnVuY3Rpb24oc3RhcnQsIHN0b3AsIHN0ZXApIHtcbiAgICB2YXIgcmFuZ2UgPSBbXSwgcHJldmlvdXM7XG4gICAgc3RhcnQgPSBpbnRlcnZhbC5jZWlsKHN0YXJ0KTtcbiAgICBzdGVwID0gc3RlcCA9PSBudWxsID8gMSA6IE1hdGguZmxvb3Ioc3RlcCk7XG4gICAgaWYgKCEoc3RhcnQgPCBzdG9wKSB8fCAhKHN0ZXAgPiAwKSkgcmV0dXJuIHJhbmdlOyAvLyBhbHNvIGhhbmRsZXMgSW52YWxpZCBEYXRlXG4gICAgZG8gcmFuZ2UucHVzaChwcmV2aW91cyA9IG5ldyBEYXRlKCtzdGFydCkpLCBvZmZzZXRpKHN0YXJ0LCBzdGVwKSwgZmxvb3JpKHN0YXJ0KTtcbiAgICB3aGlsZSAocHJldmlvdXMgPCBzdGFydCAmJiBzdGFydCA8IHN0b3ApO1xuICAgIHJldHVybiByYW5nZTtcbiAgfTtcblxuICBpbnRlcnZhbC5maWx0ZXIgPSBmdW5jdGlvbih0ZXN0KSB7XG4gICAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgICAgIGlmIChkYXRlID49IGRhdGUpIHdoaWxlIChmbG9vcmkoZGF0ZSksICF0ZXN0KGRhdGUpKSBkYXRlLnNldFRpbWUoZGF0ZSAtIDEpO1xuICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgICAgIGlmIChkYXRlID49IGRhdGUpIHtcbiAgICAgICAgaWYgKHN0ZXAgPCAwKSB3aGlsZSAoKytzdGVwIDw9IDApIHtcbiAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCAtMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgICAgIH0gZWxzZSB3aGlsZSAoLS1zdGVwID49IDApIHtcbiAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCArMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBpZiAoY291bnQpIHtcbiAgICBpbnRlcnZhbC5jb3VudCA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICAgIHQwLnNldFRpbWUoK3N0YXJ0KSwgdDEuc2V0VGltZSgrZW5kKTtcbiAgICAgIGZsb29yaSh0MCksIGZsb29yaSh0MSk7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihjb3VudCh0MCwgdDEpKTtcbiAgICB9O1xuXG4gICAgaW50ZXJ2YWwuZXZlcnkgPSBmdW5jdGlvbihzdGVwKSB7XG4gICAgICBzdGVwID0gTWF0aC5mbG9vcihzdGVwKTtcbiAgICAgIHJldHVybiAhaXNGaW5pdGUoc3RlcCkgfHwgIShzdGVwID4gMCkgPyBudWxsXG4gICAgICAgICAgOiAhKHN0ZXAgPiAxKSA/IGludGVydmFsXG4gICAgICAgICAgOiBpbnRlcnZhbC5maWx0ZXIoZmllbGRcbiAgICAgICAgICAgICAgPyBmdW5jdGlvbihkKSB7IHJldHVybiBmaWVsZChkKSAlIHN0ZXAgPT09IDA7IH1cbiAgICAgICAgICAgICAgOiBmdW5jdGlvbihkKSB7IHJldHVybiBpbnRlcnZhbC5jb3VudCgwLCBkKSAlIHN0ZXAgPT09IDA7IH0pO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gaW50ZXJ2YWw7XG59XG4iLCJpbXBvcnQgaW50ZXJ2YWwgZnJvbSBcIi4vaW50ZXJ2YWwuanNcIjtcblxudmFyIHllYXIgPSBpbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gIGRhdGUuc2V0TW9udGgoMCwgMSk7XG4gIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpICsgc3RlcCk7XG59LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gIHJldHVybiBlbmQuZ2V0RnVsbFllYXIoKSAtIHN0YXJ0LmdldEZ1bGxZZWFyKCk7XG59LCBmdW5jdGlvbihkYXRlKSB7XG4gIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCk7XG59KTtcblxuLy8gQW4gb3B0aW1pemVkIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNpbXBsZSBjYXNlLlxueWVhci5ldmVyeSA9IGZ1bmN0aW9uKGspIHtcbiAgcmV0dXJuICFpc0Zpbml0ZShrID0gTWF0aC5mbG9vcihrKSkgfHwgIShrID4gMCkgPyBudWxsIDogaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICAgIGRhdGUuc2V0RnVsbFllYXIoTWF0aC5mbG9vcihkYXRlLmdldEZ1bGxZZWFyKCkgLyBrKSAqIGspO1xuICAgIGRhdGUuc2V0TW9udGgoMCwgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICAgIGRhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpICsgc3RlcCAqIGspO1xuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHllYXI7XG5leHBvcnQgdmFyIHllYXJzID0geWVhci5yYW5nZTtcbiIsImltcG9ydCBpbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuXG52YXIgbW9udGggPSBpbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gIGRhdGUuc2V0RGF0ZSgxKTtcbiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBzdGVwKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIGVuZC5nZXRNb250aCgpIC0gc3RhcnQuZ2V0TW9udGgoKSArIChlbmQuZ2V0RnVsbFllYXIoKSAtIHN0YXJ0LmdldEZ1bGxZZWFyKCkpICogMTI7XG59LCBmdW5jdGlvbihkYXRlKSB7XG4gIHJldHVybiBkYXRlLmdldE1vbnRoKCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgbW9udGg7XG5leHBvcnQgdmFyIG1vbnRocyA9IG1vbnRoLnJhbmdlO1xuIiwiZXhwb3J0IHZhciBkdXJhdGlvblNlY29uZCA9IDFlMztcbmV4cG9ydCB2YXIgZHVyYXRpb25NaW51dGUgPSA2ZTQ7XG5leHBvcnQgdmFyIGR1cmF0aW9uSG91ciA9IDM2ZTU7XG5leHBvcnQgdmFyIGR1cmF0aW9uRGF5ID0gODY0ZTU7XG5leHBvcnQgdmFyIGR1cmF0aW9uV2VlayA9IDYwNDhlNTtcbiIsImltcG9ydCBpbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IHtkdXJhdGlvbk1pbnV0ZSwgZHVyYXRpb25XZWVrfSBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuXG5mdW5jdGlvbiB3ZWVrZGF5KGkpIHtcbiAgcmV0dXJuIGludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSAoZGF0ZS5nZXREYXkoKSArIDcgLSBpKSAlIDcpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwICogNyk7XG4gIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gKGVuZCAtIHN0YXJ0IC0gKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpIC0gc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkgKiBkdXJhdGlvbk1pbnV0ZSkgLyBkdXJhdGlvbldlZWs7XG4gIH0pO1xufVxuXG5leHBvcnQgdmFyIHN1bmRheSA9IHdlZWtkYXkoMCk7XG5leHBvcnQgdmFyIG1vbmRheSA9IHdlZWtkYXkoMSk7XG5leHBvcnQgdmFyIHR1ZXNkYXkgPSB3ZWVrZGF5KDIpO1xuZXhwb3J0IHZhciB3ZWRuZXNkYXkgPSB3ZWVrZGF5KDMpO1xuZXhwb3J0IHZhciB0aHVyc2RheSA9IHdlZWtkYXkoNCk7XG5leHBvcnQgdmFyIGZyaWRheSA9IHdlZWtkYXkoNSk7XG5leHBvcnQgdmFyIHNhdHVyZGF5ID0gd2Vla2RheSg2KTtcblxuZXhwb3J0IHZhciBzdW5kYXlzID0gc3VuZGF5LnJhbmdlO1xuZXhwb3J0IHZhciBtb25kYXlzID0gbW9uZGF5LnJhbmdlO1xuZXhwb3J0IHZhciB0dWVzZGF5cyA9IHR1ZXNkYXkucmFuZ2U7XG5leHBvcnQgdmFyIHdlZG5lc2RheXMgPSB3ZWRuZXNkYXkucmFuZ2U7XG5leHBvcnQgdmFyIHRodXJzZGF5cyA9IHRodXJzZGF5LnJhbmdlO1xuZXhwb3J0IHZhciBmcmlkYXlzID0gZnJpZGF5LnJhbmdlO1xuZXhwb3J0IHZhciBzYXR1cmRheXMgPSBzYXR1cmRheS5yYW5nZTtcbiIsImltcG9ydCBpbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IHtkdXJhdGlvbkRheSwgZHVyYXRpb25NaW51dGV9IGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5cbnZhciBkYXkgPSBpbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIHN0ZXApO1xufSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICByZXR1cm4gKGVuZCAtIHN0YXJ0IC0gKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpIC0gc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkgKiBkdXJhdGlvbk1pbnV0ZSkgLyBkdXJhdGlvbkRheTtcbn0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpIC0gMTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBkYXk7XG5leHBvcnQgdmFyIGRheXMgPSBkYXkucmFuZ2U7XG4iLCJpbXBvcnQgaW50ZXJ2YWwgZnJvbSBcIi4vaW50ZXJ2YWwuanNcIjtcbmltcG9ydCB7ZHVyYXRpb25Ib3VyLCBkdXJhdGlvbk1pbnV0ZSwgZHVyYXRpb25TZWNvbmR9IGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5cbnZhciBob3VyID0gaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICBkYXRlLnNldFRpbWUoZGF0ZSAtIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSBkYXRlLmdldFNlY29uZHMoKSAqIGR1cmF0aW9uU2Vjb25kIC0gZGF0ZS5nZXRNaW51dGVzKCkgKiBkdXJhdGlvbk1pbnV0ZSk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbkhvdXIpO1xufSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uSG91cjtcbn0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBob3VyO1xuZXhwb3J0IHZhciBob3VycyA9IGhvdXIucmFuZ2U7XG4iLCJpbXBvcnQgaW50ZXJ2YWwgZnJvbSBcIi4vaW50ZXJ2YWwuanNcIjtcbmltcG9ydCB7ZHVyYXRpb25NaW51dGUsIGR1cmF0aW9uU2Vjb25kfSBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuXG52YXIgbWludXRlID0gaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICBkYXRlLnNldFRpbWUoZGF0ZSAtIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSBkYXRlLmdldFNlY29uZHMoKSAqIGR1cmF0aW9uU2Vjb25kKTtcbn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uTWludXRlKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbk1pbnV0ZTtcbn0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0TWludXRlcygpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG1pbnV0ZTtcbmV4cG9ydCB2YXIgbWludXRlcyA9IG1pbnV0ZS5yYW5nZTtcbiIsImltcG9ydCBpbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IHtkdXJhdGlvblNlY29uZH0gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcblxudmFyIHNlY29uZCA9IGludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgZGF0ZS5zZXRUaW1lKGRhdGUgLSBkYXRlLmdldE1pbGxpc2Vjb25kcygpKTtcbn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uU2Vjb25kKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvblNlY29uZDtcbn0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0VVRDU2Vjb25kcygpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHNlY29uZDtcbmV4cG9ydCB2YXIgc2Vjb25kcyA9IHNlY29uZC5yYW5nZTtcbiIsImltcG9ydCBpbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuXG52YXIgbWlsbGlzZWNvbmQgPSBpbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgLy8gbm9vcFxufSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIGVuZCAtIHN0YXJ0O1xufSk7XG5cbi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS5cbm1pbGxpc2Vjb25kLmV2ZXJ5ID0gZnVuY3Rpb24oaykge1xuICBrID0gTWF0aC5mbG9vcihrKTtcbiAgaWYgKCFpc0Zpbml0ZShrKSB8fCAhKGsgPiAwKSkgcmV0dXJuIG51bGw7XG4gIGlmICghKGsgPiAxKSkgcmV0dXJuIG1pbGxpc2Vjb25kO1xuICByZXR1cm4gaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICAgIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBrKSAqIGspO1xuICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gICAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGspO1xuICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBrO1xuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1pbGxpc2Vjb25kO1xuZXhwb3J0IHZhciBtaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZC5yYW5nZTtcbiIsImltcG9ydCBpbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IHtkdXJhdGlvbldlZWt9IGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5cbmZ1bmN0aW9uIHV0Y1dlZWtkYXkoaSkge1xuICByZXR1cm4gaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICAgIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSAtIChkYXRlLmdldFVUQ0RheSgpICsgNyAtIGkpICUgNyk7XG4gICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICAgIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIHN0ZXAgKiA3KTtcbiAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25XZWVrO1xuICB9KTtcbn1cblxuZXhwb3J0IHZhciB1dGNTdW5kYXkgPSB1dGNXZWVrZGF5KDApO1xuZXhwb3J0IHZhciB1dGNNb25kYXkgPSB1dGNXZWVrZGF5KDEpO1xuZXhwb3J0IHZhciB1dGNUdWVzZGF5ID0gdXRjV2Vla2RheSgyKTtcbmV4cG9ydCB2YXIgdXRjV2VkbmVzZGF5ID0gdXRjV2Vla2RheSgzKTtcbmV4cG9ydCB2YXIgdXRjVGh1cnNkYXkgPSB1dGNXZWVrZGF5KDQpO1xuZXhwb3J0IHZhciB1dGNGcmlkYXkgPSB1dGNXZWVrZGF5KDUpO1xuZXhwb3J0IHZhciB1dGNTYXR1cmRheSA9IHV0Y1dlZWtkYXkoNik7XG5cbmV4cG9ydCB2YXIgdXRjU3VuZGF5cyA9IHV0Y1N1bmRheS5yYW5nZTtcbmV4cG9ydCB2YXIgdXRjTW9uZGF5cyA9IHV0Y01vbmRheS5yYW5nZTtcbmV4cG9ydCB2YXIgdXRjVHVlc2RheXMgPSB1dGNUdWVzZGF5LnJhbmdlO1xuZXhwb3J0IHZhciB1dGNXZWRuZXNkYXlzID0gdXRjV2VkbmVzZGF5LnJhbmdlO1xuZXhwb3J0IHZhciB1dGNUaHVyc2RheXMgPSB1dGNUaHVyc2RheS5yYW5nZTtcbmV4cG9ydCB2YXIgdXRjRnJpZGF5cyA9IHV0Y0ZyaWRheS5yYW5nZTtcbmV4cG9ydCB2YXIgdXRjU2F0dXJkYXlzID0gdXRjU2F0dXJkYXkucmFuZ2U7XG4iLCJpbXBvcnQgaW50ZXJ2YWwgZnJvbSBcIi4vaW50ZXJ2YWwuanNcIjtcbmltcG9ydCB7ZHVyYXRpb25EYXl9IGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5cbnZhciB1dGNEYXkgPSBpbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIHN0ZXApO1xufSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uRGF5O1xufSwgZnVuY3Rpb24oZGF0ZSkge1xuICByZXR1cm4gZGF0ZS5nZXRVVENEYXRlKCkgLSAxO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHV0Y0RheTtcbmV4cG9ydCB2YXIgdXRjRGF5cyA9IHV0Y0RheS5yYW5nZTtcbiIsImltcG9ydCBpbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuXG52YXIgdXRjWWVhciA9IGludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgZGF0ZS5zZXRVVENNb250aCgwLCAxKTtcbiAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgZGF0ZS5zZXRVVENGdWxsWWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgKyBzdGVwKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIGVuZC5nZXRVVENGdWxsWWVhcigpIC0gc3RhcnQuZ2V0VVRDRnVsbFllYXIoKTtcbn0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbn0pO1xuXG4vLyBBbiBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2ltcGxlIGNhc2UuXG51dGNZZWFyLmV2ZXJ5ID0gZnVuY3Rpb24oaykge1xuICByZXR1cm4gIWlzRmluaXRlKGsgPSBNYXRoLmZsb29yKGspKSB8fCAhKGsgPiAwKSA/IG51bGwgOiBpbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSAvIGspICogayk7XG4gICAgZGF0ZS5zZXRVVENNb250aCgwLCAxKTtcbiAgICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgKyBzdGVwICogayk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgdXRjWWVhcjtcbmV4cG9ydCB2YXIgdXRjWWVhcnMgPSB1dGNZZWFyLnJhbmdlO1xuIiwiaW1wb3J0IHtcbiAgdGltZURheSxcbiAgdGltZVN1bmRheSxcbiAgdGltZU1vbmRheSxcbiAgdGltZVRodXJzZGF5LFxuICB0aW1lWWVhcixcbiAgdXRjRGF5LFxuICB1dGNTdW5kYXksXG4gIHV0Y01vbmRheSxcbiAgdXRjVGh1cnNkYXksXG4gIHV0Y1llYXJcbn0gZnJvbSBcImQzLXRpbWVcIjtcblxuZnVuY3Rpb24gbG9jYWxEYXRlKGQpIHtcbiAgaWYgKDAgPD0gZC55ICYmIGQueSA8IDEwMCkge1xuICAgIHZhciBkYXRlID0gbmV3IERhdGUoLTEsIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpO1xuICAgIGRhdGUuc2V0RnVsbFllYXIoZC55KTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuICByZXR1cm4gbmV3IERhdGUoZC55LCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKTtcbn1cblxuZnVuY3Rpb24gdXRjRGF0ZShkKSB7XG4gIGlmICgwIDw9IGQueSAmJiBkLnkgPCAxMDApIHtcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKC0xLCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKSk7XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcihkLnkpO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG4gIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhkLnksIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpKTtcbn1cblxuZnVuY3Rpb24gbmV3RGF0ZSh5LCBtLCBkKSB7XG4gIHJldHVybiB7eTogeSwgbTogbSwgZDogZCwgSDogMCwgTTogMCwgUzogMCwgTDogMH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdExvY2FsZShsb2NhbGUpIHtcbiAgdmFyIGxvY2FsZV9kYXRlVGltZSA9IGxvY2FsZS5kYXRlVGltZSxcbiAgICAgIGxvY2FsZV9kYXRlID0gbG9jYWxlLmRhdGUsXG4gICAgICBsb2NhbGVfdGltZSA9IGxvY2FsZS50aW1lLFxuICAgICAgbG9jYWxlX3BlcmlvZHMgPSBsb2NhbGUucGVyaW9kcyxcbiAgICAgIGxvY2FsZV93ZWVrZGF5cyA9IGxvY2FsZS5kYXlzLFxuICAgICAgbG9jYWxlX3Nob3J0V2Vla2RheXMgPSBsb2NhbGUuc2hvcnREYXlzLFxuICAgICAgbG9jYWxlX21vbnRocyA9IGxvY2FsZS5tb250aHMsXG4gICAgICBsb2NhbGVfc2hvcnRNb250aHMgPSBsb2NhbGUuc2hvcnRNb250aHM7XG5cbiAgdmFyIHBlcmlvZFJlID0gZm9ybWF0UmUobG9jYWxlX3BlcmlvZHMpLFxuICAgICAgcGVyaW9kTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9wZXJpb2RzKSxcbiAgICAgIHdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV93ZWVrZGF5cyksXG4gICAgICB3ZWVrZGF5TG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV93ZWVrZGF5cyksXG4gICAgICBzaG9ydFdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydFdlZWtkYXlzKSxcbiAgICAgIHNob3J0V2Vla2RheUxvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfc2hvcnRXZWVrZGF5cyksXG4gICAgICBtb250aFJlID0gZm9ybWF0UmUobG9jYWxlX21vbnRocyksXG4gICAgICBtb250aExvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfbW9udGhzKSxcbiAgICAgIHNob3J0TW9udGhSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydE1vbnRocyksXG4gICAgICBzaG9ydE1vbnRoTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydE1vbnRocyk7XG5cbiAgdmFyIGZvcm1hdHMgPSB7XG4gICAgXCJhXCI6IGZvcm1hdFNob3J0V2Vla2RheSxcbiAgICBcIkFcIjogZm9ybWF0V2Vla2RheSxcbiAgICBcImJcIjogZm9ybWF0U2hvcnRNb250aCxcbiAgICBcIkJcIjogZm9ybWF0TW9udGgsXG4gICAgXCJjXCI6IG51bGwsXG4gICAgXCJkXCI6IGZvcm1hdERheU9mTW9udGgsXG4gICAgXCJlXCI6IGZvcm1hdERheU9mTW9udGgsXG4gICAgXCJmXCI6IGZvcm1hdE1pY3Jvc2Vjb25kcyxcbiAgICBcImdcIjogZm9ybWF0WWVhcklTTyxcbiAgICBcIkdcIjogZm9ybWF0RnVsbFllYXJJU08sXG4gICAgXCJIXCI6IGZvcm1hdEhvdXIyNCxcbiAgICBcIklcIjogZm9ybWF0SG91cjEyLFxuICAgIFwialwiOiBmb3JtYXREYXlPZlllYXIsXG4gICAgXCJMXCI6IGZvcm1hdE1pbGxpc2Vjb25kcyxcbiAgICBcIm1cIjogZm9ybWF0TW9udGhOdW1iZXIsXG4gICAgXCJNXCI6IGZvcm1hdE1pbnV0ZXMsXG4gICAgXCJwXCI6IGZvcm1hdFBlcmlvZCxcbiAgICBcInFcIjogZm9ybWF0UXVhcnRlcixcbiAgICBcIlFcIjogZm9ybWF0VW5peFRpbWVzdGFtcCxcbiAgICBcInNcIjogZm9ybWF0VW5peFRpbWVzdGFtcFNlY29uZHMsXG4gICAgXCJTXCI6IGZvcm1hdFNlY29uZHMsXG4gICAgXCJ1XCI6IGZvcm1hdFdlZWtkYXlOdW1iZXJNb25kYXksXG4gICAgXCJVXCI6IGZvcm1hdFdlZWtOdW1iZXJTdW5kYXksXG4gICAgXCJWXCI6IGZvcm1hdFdlZWtOdW1iZXJJU08sXG4gICAgXCJ3XCI6IGZvcm1hdFdlZWtkYXlOdW1iZXJTdW5kYXksXG4gICAgXCJXXCI6IGZvcm1hdFdlZWtOdW1iZXJNb25kYXksXG4gICAgXCJ4XCI6IG51bGwsXG4gICAgXCJYXCI6IG51bGwsXG4gICAgXCJ5XCI6IGZvcm1hdFllYXIsXG4gICAgXCJZXCI6IGZvcm1hdEZ1bGxZZWFyLFxuICAgIFwiWlwiOiBmb3JtYXRab25lLFxuICAgIFwiJVwiOiBmb3JtYXRMaXRlcmFsUGVyY2VudFxuICB9O1xuXG4gIHZhciB1dGNGb3JtYXRzID0ge1xuICAgIFwiYVwiOiBmb3JtYXRVVENTaG9ydFdlZWtkYXksXG4gICAgXCJBXCI6IGZvcm1hdFVUQ1dlZWtkYXksXG4gICAgXCJiXCI6IGZvcm1hdFVUQ1Nob3J0TW9udGgsXG4gICAgXCJCXCI6IGZvcm1hdFVUQ01vbnRoLFxuICAgIFwiY1wiOiBudWxsLFxuICAgIFwiZFwiOiBmb3JtYXRVVENEYXlPZk1vbnRoLFxuICAgIFwiZVwiOiBmb3JtYXRVVENEYXlPZk1vbnRoLFxuICAgIFwiZlwiOiBmb3JtYXRVVENNaWNyb3NlY29uZHMsXG4gICAgXCJnXCI6IGZvcm1hdFVUQ1llYXJJU08sXG4gICAgXCJHXCI6IGZvcm1hdFVUQ0Z1bGxZZWFySVNPLFxuICAgIFwiSFwiOiBmb3JtYXRVVENIb3VyMjQsXG4gICAgXCJJXCI6IGZvcm1hdFVUQ0hvdXIxMixcbiAgICBcImpcIjogZm9ybWF0VVRDRGF5T2ZZZWFyLFxuICAgIFwiTFwiOiBmb3JtYXRVVENNaWxsaXNlY29uZHMsXG4gICAgXCJtXCI6IGZvcm1hdFVUQ01vbnRoTnVtYmVyLFxuICAgIFwiTVwiOiBmb3JtYXRVVENNaW51dGVzLFxuICAgIFwicFwiOiBmb3JtYXRVVENQZXJpb2QsXG4gICAgXCJxXCI6IGZvcm1hdFVUQ1F1YXJ0ZXIsXG4gICAgXCJRXCI6IGZvcm1hdFVuaXhUaW1lc3RhbXAsXG4gICAgXCJzXCI6IGZvcm1hdFVuaXhUaW1lc3RhbXBTZWNvbmRzLFxuICAgIFwiU1wiOiBmb3JtYXRVVENTZWNvbmRzLFxuICAgIFwidVwiOiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyTW9uZGF5LFxuICAgIFwiVVwiOiBmb3JtYXRVVENXZWVrTnVtYmVyU3VuZGF5LFxuICAgIFwiVlwiOiBmb3JtYXRVVENXZWVrTnVtYmVySVNPLFxuICAgIFwid1wiOiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyU3VuZGF5LFxuICAgIFwiV1wiOiBmb3JtYXRVVENXZWVrTnVtYmVyTW9uZGF5LFxuICAgIFwieFwiOiBudWxsLFxuICAgIFwiWFwiOiBudWxsLFxuICAgIFwieVwiOiBmb3JtYXRVVENZZWFyLFxuICAgIFwiWVwiOiBmb3JtYXRVVENGdWxsWWVhcixcbiAgICBcIlpcIjogZm9ybWF0VVRDWm9uZSxcbiAgICBcIiVcIjogZm9ybWF0TGl0ZXJhbFBlcmNlbnRcbiAgfTtcblxuICB2YXIgcGFyc2VzID0ge1xuICAgIFwiYVwiOiBwYXJzZVNob3J0V2Vla2RheSxcbiAgICBcIkFcIjogcGFyc2VXZWVrZGF5LFxuICAgIFwiYlwiOiBwYXJzZVNob3J0TW9udGgsXG4gICAgXCJCXCI6IHBhcnNlTW9udGgsXG4gICAgXCJjXCI6IHBhcnNlTG9jYWxlRGF0ZVRpbWUsXG4gICAgXCJkXCI6IHBhcnNlRGF5T2ZNb250aCxcbiAgICBcImVcIjogcGFyc2VEYXlPZk1vbnRoLFxuICAgIFwiZlwiOiBwYXJzZU1pY3Jvc2Vjb25kcyxcbiAgICBcImdcIjogcGFyc2VZZWFyLFxuICAgIFwiR1wiOiBwYXJzZUZ1bGxZZWFyLFxuICAgIFwiSFwiOiBwYXJzZUhvdXIyNCxcbiAgICBcIklcIjogcGFyc2VIb3VyMjQsXG4gICAgXCJqXCI6IHBhcnNlRGF5T2ZZZWFyLFxuICAgIFwiTFwiOiBwYXJzZU1pbGxpc2Vjb25kcyxcbiAgICBcIm1cIjogcGFyc2VNb250aE51bWJlcixcbiAgICBcIk1cIjogcGFyc2VNaW51dGVzLFxuICAgIFwicFwiOiBwYXJzZVBlcmlvZCxcbiAgICBcInFcIjogcGFyc2VRdWFydGVyLFxuICAgIFwiUVwiOiBwYXJzZVVuaXhUaW1lc3RhbXAsXG4gICAgXCJzXCI6IHBhcnNlVW5peFRpbWVzdGFtcFNlY29uZHMsXG4gICAgXCJTXCI6IHBhcnNlU2Vjb25kcyxcbiAgICBcInVcIjogcGFyc2VXZWVrZGF5TnVtYmVyTW9uZGF5LFxuICAgIFwiVVwiOiBwYXJzZVdlZWtOdW1iZXJTdW5kYXksXG4gICAgXCJWXCI6IHBhcnNlV2Vla051bWJlcklTTyxcbiAgICBcIndcIjogcGFyc2VXZWVrZGF5TnVtYmVyU3VuZGF5LFxuICAgIFwiV1wiOiBwYXJzZVdlZWtOdW1iZXJNb25kYXksXG4gICAgXCJ4XCI6IHBhcnNlTG9jYWxlRGF0ZSxcbiAgICBcIlhcIjogcGFyc2VMb2NhbGVUaW1lLFxuICAgIFwieVwiOiBwYXJzZVllYXIsXG4gICAgXCJZXCI6IHBhcnNlRnVsbFllYXIsXG4gICAgXCJaXCI6IHBhcnNlWm9uZSxcbiAgICBcIiVcIjogcGFyc2VMaXRlcmFsUGVyY2VudFxuICB9O1xuXG4gIC8vIFRoZXNlIHJlY3Vyc2l2ZSBkaXJlY3RpdmUgZGVmaW5pdGlvbnMgbXVzdCBiZSBkZWZlcnJlZC5cbiAgZm9ybWF0cy54ID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlLCBmb3JtYXRzKTtcbiAgZm9ybWF0cy5YID0gbmV3Rm9ybWF0KGxvY2FsZV90aW1lLCBmb3JtYXRzKTtcbiAgZm9ybWF0cy5jID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlVGltZSwgZm9ybWF0cyk7XG4gIHV0Y0Zvcm1hdHMueCA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZSwgdXRjRm9ybWF0cyk7XG4gIHV0Y0Zvcm1hdHMuWCA9IG5ld0Zvcm1hdChsb2NhbGVfdGltZSwgdXRjRm9ybWF0cyk7XG4gIHV0Y0Zvcm1hdHMuYyA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZVRpbWUsIHV0Y0Zvcm1hdHMpO1xuXG4gIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIsIGZvcm1hdHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZGF0ZSkge1xuICAgICAgdmFyIHN0cmluZyA9IFtdLFxuICAgICAgICAgIGkgPSAtMSxcbiAgICAgICAgICBqID0gMCxcbiAgICAgICAgICBuID0gc3BlY2lmaWVyLmxlbmd0aCxcbiAgICAgICAgICBjLFxuICAgICAgICAgIHBhZCxcbiAgICAgICAgICBmb3JtYXQ7XG5cbiAgICAgIGlmICghKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSkgZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKTtcblxuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgaWYgKHNwZWNpZmllci5jaGFyQ29kZUF0KGkpID09PSAzNykge1xuICAgICAgICAgIHN0cmluZy5wdXNoKHNwZWNpZmllci5zbGljZShqLCBpKSk7XG4gICAgICAgICAgaWYgKChwYWQgPSBwYWRzW2MgPSBzcGVjaWZpZXIuY2hhckF0KCsraSldKSAhPSBudWxsKSBjID0gc3BlY2lmaWVyLmNoYXJBdCgrK2kpO1xuICAgICAgICAgIGVsc2UgcGFkID0gYyA9PT0gXCJlXCIgPyBcIiBcIiA6IFwiMFwiO1xuICAgICAgICAgIGlmIChmb3JtYXQgPSBmb3JtYXRzW2NdKSBjID0gZm9ybWF0KGRhdGUsIHBhZCk7XG4gICAgICAgICAgc3RyaW5nLnB1c2goYyk7XG4gICAgICAgICAgaiA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0cmluZy5wdXNoKHNwZWNpZmllci5zbGljZShqLCBpKSk7XG4gICAgICByZXR1cm4gc3RyaW5nLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5ld1BhcnNlKHNwZWNpZmllciwgWikge1xuICAgIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIHZhciBkID0gbmV3RGF0ZSgxOTAwLCB1bmRlZmluZWQsIDEpLFxuICAgICAgICAgIGkgPSBwYXJzZVNwZWNpZmllcihkLCBzcGVjaWZpZXIsIHN0cmluZyArPSBcIlwiLCAwKSxcbiAgICAgICAgICB3ZWVrLCBkYXk7XG4gICAgICBpZiAoaSAhPSBzdHJpbmcubGVuZ3RoKSByZXR1cm4gbnVsbDtcblxuICAgICAgLy8gSWYgYSBVTklYIHRpbWVzdGFtcCBpcyBzcGVjaWZpZWQsIHJldHVybiBpdC5cbiAgICAgIGlmIChcIlFcIiBpbiBkKSByZXR1cm4gbmV3IERhdGUoZC5RKTtcbiAgICAgIGlmIChcInNcIiBpbiBkKSByZXR1cm4gbmV3IERhdGUoZC5zICogMTAwMCArIChcIkxcIiBpbiBkID8gZC5MIDogMCkpO1xuXG4gICAgICAvLyBJZiB0aGlzIGlzIHV0Y1BhcnNlLCBuZXZlciB1c2UgdGhlIGxvY2FsIHRpbWV6b25lLlxuICAgICAgaWYgKFogJiYgIShcIlpcIiBpbiBkKSkgZC5aID0gMDtcblxuICAgICAgLy8gVGhlIGFtLXBtIGZsYWcgaXMgMCBmb3IgQU0sIGFuZCAxIGZvciBQTS5cbiAgICAgIGlmIChcInBcIiBpbiBkKSBkLkggPSBkLkggJSAxMiArIGQucCAqIDEyO1xuXG4gICAgICAvLyBJZiB0aGUgbW9udGggd2FzIG5vdCBzcGVjaWZpZWQsIGluaGVyaXQgZnJvbSB0aGUgcXVhcnRlci5cbiAgICAgIGlmIChkLm0gPT09IHVuZGVmaW5lZCkgZC5tID0gXCJxXCIgaW4gZCA/IGQucSA6IDA7XG5cbiAgICAgIC8vIENvbnZlcnQgZGF5LW9mLXdlZWsgYW5kIHdlZWstb2YteWVhciB0byBkYXktb2YteWVhci5cbiAgICAgIGlmIChcIlZcIiBpbiBkKSB7XG4gICAgICAgIGlmIChkLlYgPCAxIHx8IGQuViA+IDUzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCEoXCJ3XCIgaW4gZCkpIGQudyA9IDE7XG4gICAgICAgIGlmIChcIlpcIiBpbiBkKSB7XG4gICAgICAgICAgd2VlayA9IHV0Y0RhdGUobmV3RGF0ZShkLnksIDAsIDEpKSwgZGF5ID0gd2Vlay5nZXRVVENEYXkoKTtcbiAgICAgICAgICB3ZWVrID0gZGF5ID4gNCB8fCBkYXkgPT09IDAgPyB1dGNNb25kYXkuY2VpbCh3ZWVrKSA6IHV0Y01vbmRheSh3ZWVrKTtcbiAgICAgICAgICB3ZWVrID0gdXRjRGF5Lm9mZnNldCh3ZWVrLCAoZC5WIC0gMSkgKiA3KTtcbiAgICAgICAgICBkLnkgPSB3ZWVrLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgICAgICAgZC5tID0gd2Vlay5nZXRVVENNb250aCgpO1xuICAgICAgICAgIGQuZCA9IHdlZWsuZ2V0VVRDRGF0ZSgpICsgKGQudyArIDYpICUgNztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3ZWVrID0gbG9jYWxEYXRlKG5ld0RhdGUoZC55LCAwLCAxKSksIGRheSA9IHdlZWsuZ2V0RGF5KCk7XG4gICAgICAgICAgd2VlayA9IGRheSA+IDQgfHwgZGF5ID09PSAwID8gdGltZU1vbmRheS5jZWlsKHdlZWspIDogdGltZU1vbmRheSh3ZWVrKTtcbiAgICAgICAgICB3ZWVrID0gdGltZURheS5vZmZzZXQod2VlaywgKGQuViAtIDEpICogNyk7XG4gICAgICAgICAgZC55ID0gd2Vlay5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgIGQubSA9IHdlZWsuZ2V0TW9udGgoKTtcbiAgICAgICAgICBkLmQgPSB3ZWVrLmdldERhdGUoKSArIChkLncgKyA2KSAlIDc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXCJXXCIgaW4gZCB8fCBcIlVcIiBpbiBkKSB7XG4gICAgICAgIGlmICghKFwid1wiIGluIGQpKSBkLncgPSBcInVcIiBpbiBkID8gZC51ICUgNyA6IFwiV1wiIGluIGQgPyAxIDogMDtcbiAgICAgICAgZGF5ID0gXCJaXCIgaW4gZCA/IHV0Y0RhdGUobmV3RGF0ZShkLnksIDAsIDEpKS5nZXRVVENEYXkoKSA6IGxvY2FsRGF0ZShuZXdEYXRlKGQueSwgMCwgMSkpLmdldERheSgpO1xuICAgICAgICBkLm0gPSAwO1xuICAgICAgICBkLmQgPSBcIldcIiBpbiBkID8gKGQudyArIDYpICUgNyArIGQuVyAqIDcgLSAoZGF5ICsgNSkgJSA3IDogZC53ICsgZC5VICogNyAtIChkYXkgKyA2KSAlIDc7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGEgdGltZSB6b25lIGlzIHNwZWNpZmllZCwgYWxsIGZpZWxkcyBhcmUgaW50ZXJwcmV0ZWQgYXMgVVRDIGFuZCB0aGVuXG4gICAgICAvLyBvZmZzZXQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgdGltZSB6b25lLlxuICAgICAgaWYgKFwiWlwiIGluIGQpIHtcbiAgICAgICAgZC5IICs9IGQuWiAvIDEwMCB8IDA7XG4gICAgICAgIGQuTSArPSBkLlogJSAxMDA7XG4gICAgICAgIHJldHVybiB1dGNEYXRlKGQpO1xuICAgICAgfVxuXG4gICAgICAvLyBPdGhlcndpc2UsIGFsbCBmaWVsZHMgYXJlIGluIGxvY2FsIHRpbWUuXG4gICAgICByZXR1cm4gbG9jYWxEYXRlKGQpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVNwZWNpZmllcihkLCBzcGVjaWZpZXIsIHN0cmluZywgaikge1xuICAgIHZhciBpID0gMCxcbiAgICAgICAgbiA9IHNwZWNpZmllci5sZW5ndGgsXG4gICAgICAgIG0gPSBzdHJpbmcubGVuZ3RoLFxuICAgICAgICBjLFxuICAgICAgICBwYXJzZTtcblxuICAgIHdoaWxlIChpIDwgbikge1xuICAgICAgaWYgKGogPj0gbSkgcmV0dXJuIC0xO1xuICAgICAgYyA9IHNwZWNpZmllci5jaGFyQ29kZUF0KGkrKyk7XG4gICAgICBpZiAoYyA9PT0gMzcpIHtcbiAgICAgICAgYyA9IHNwZWNpZmllci5jaGFyQXQoaSsrKTtcbiAgICAgICAgcGFyc2UgPSBwYXJzZXNbYyBpbiBwYWRzID8gc3BlY2lmaWVyLmNoYXJBdChpKyspIDogY107XG4gICAgICAgIGlmICghcGFyc2UgfHwgKChqID0gcGFyc2UoZCwgc3RyaW5nLCBqKSkgPCAwKSkgcmV0dXJuIC0xO1xuICAgICAgfSBlbHNlIGlmIChjICE9IHN0cmluZy5jaGFyQ29kZUF0KGorKykpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBqO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VQZXJpb2QoZCwgc3RyaW5nLCBpKSB7XG4gICAgdmFyIG4gPSBwZXJpb2RSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XG4gICAgcmV0dXJuIG4gPyAoZC5wID0gcGVyaW9kTG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlU2hvcnRXZWVrZGF5KGQsIHN0cmluZywgaSkge1xuICAgIHZhciBuID0gc2hvcnRXZWVrZGF5UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO1xuICAgIHJldHVybiBuID8gKGQudyA9IHNob3J0V2Vla2RheUxvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVdlZWtkYXkoZCwgc3RyaW5nLCBpKSB7XG4gICAgdmFyIG4gPSB3ZWVrZGF5UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO1xuICAgIHJldHVybiBuID8gKGQudyA9IHdlZWtkYXlMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VTaG9ydE1vbnRoKGQsIHN0cmluZywgaSkge1xuICAgIHZhciBuID0gc2hvcnRNb250aFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcbiAgICByZXR1cm4gbiA/IChkLm0gPSBzaG9ydE1vbnRoTG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlTW9udGgoZCwgc3RyaW5nLCBpKSB7XG4gICAgdmFyIG4gPSBtb250aFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcbiAgICByZXR1cm4gbiA/IChkLm0gPSBtb250aExvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUxvY2FsZURhdGVUaW1lKGQsIHN0cmluZywgaSkge1xuICAgIHJldHVybiBwYXJzZVNwZWNpZmllcihkLCBsb2NhbGVfZGF0ZVRpbWUsIHN0cmluZywgaSk7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUxvY2FsZURhdGUoZCwgc3RyaW5nLCBpKSB7XG4gICAgcmV0dXJuIHBhcnNlU3BlY2lmaWVyKGQsIGxvY2FsZV9kYXRlLCBzdHJpbmcsIGkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VMb2NhbGVUaW1lKGQsIHN0cmluZywgaSkge1xuICAgIHJldHVybiBwYXJzZVNwZWNpZmllcihkLCBsb2NhbGVfdGltZSwgc3RyaW5nLCBpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFNob3J0V2Vla2RheShkKSB7XG4gICAgcmV0dXJuIGxvY2FsZV9zaG9ydFdlZWtkYXlzW2QuZ2V0RGF5KCldO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0V2Vla2RheShkKSB7XG4gICAgcmV0dXJuIGxvY2FsZV93ZWVrZGF5c1tkLmdldERheSgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFNob3J0TW9udGgoZCkge1xuICAgIHJldHVybiBsb2NhbGVfc2hvcnRNb250aHNbZC5nZXRNb250aCgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdE1vbnRoKGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX21vbnRoc1tkLmdldE1vbnRoKCldO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0UGVyaW9kKGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX3BlcmlvZHNbKyhkLmdldEhvdXJzKCkgPj0gMTIpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFF1YXJ0ZXIoZCkge1xuICAgIHJldHVybiAxICsgfn4oZC5nZXRNb250aCgpIC8gMyk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRVVENTaG9ydFdlZWtkYXkoZCkge1xuICAgIHJldHVybiBsb2NhbGVfc2hvcnRXZWVrZGF5c1tkLmdldFVUQ0RheSgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtkYXkoZCkge1xuICAgIHJldHVybiBsb2NhbGVfd2Vla2RheXNbZC5nZXRVVENEYXkoKV07XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRVVENTaG9ydE1vbnRoKGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX3Nob3J0TW9udGhzW2QuZ2V0VVRDTW9udGgoKV07XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRVVENNb250aChkKSB7XG4gICAgcmV0dXJuIGxvY2FsZV9tb250aHNbZC5nZXRVVENNb250aCgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFVUQ1BlcmlvZChkKSB7XG4gICAgcmV0dXJuIGxvY2FsZV9wZXJpb2RzWysoZC5nZXRVVENIb3VycygpID49IDEyKV07XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRVVENRdWFydGVyKGQpIHtcbiAgICByZXR1cm4gMSArIH5+KGQuZ2V0VVRDTW9udGgoKSAvIDMpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXQ6IGZ1bmN0aW9uKHNwZWNpZmllcikge1xuICAgICAgdmFyIGYgPSBuZXdGb3JtYXQoc3BlY2lmaWVyICs9IFwiXCIsIGZvcm1hdHMpO1xuICAgICAgZi50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3BlY2lmaWVyOyB9O1xuICAgICAgcmV0dXJuIGY7XG4gICAgfSxcbiAgICBwYXJzZTogZnVuY3Rpb24oc3BlY2lmaWVyKSB7XG4gICAgICB2YXIgcCA9IG5ld1BhcnNlKHNwZWNpZmllciArPSBcIlwiLCBmYWxzZSk7XG4gICAgICBwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07XG4gICAgICByZXR1cm4gcDtcbiAgICB9LFxuICAgIHV0Y0Zvcm1hdDogZnVuY3Rpb24oc3BlY2lmaWVyKSB7XG4gICAgICB2YXIgZiA9IG5ld0Zvcm1hdChzcGVjaWZpZXIgKz0gXCJcIiwgdXRjRm9ybWF0cyk7XG4gICAgICBmLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07XG4gICAgICByZXR1cm4gZjtcbiAgICB9LFxuICAgIHV0Y1BhcnNlOiBmdW5jdGlvbihzcGVjaWZpZXIpIHtcbiAgICAgIHZhciBwID0gbmV3UGFyc2Uoc3BlY2lmaWVyICs9IFwiXCIsIHRydWUpO1xuICAgICAgcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3BlY2lmaWVyOyB9O1xuICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICB9O1xufVxuXG52YXIgcGFkcyA9IHtcIi1cIjogXCJcIiwgXCJfXCI6IFwiIFwiLCBcIjBcIjogXCIwXCJ9LFxuICAgIG51bWJlclJlID0gL15cXHMqXFxkKy8sIC8vIG5vdGU6IGlnbm9yZXMgbmV4dCBkaXJlY3RpdmVcbiAgICBwZXJjZW50UmUgPSAvXiUvLFxuICAgIHJlcXVvdGVSZSA9IC9bXFxcXF4kKis/fFtcXF0oKS57fV0vZztcblxuZnVuY3Rpb24gcGFkKHZhbHVlLCBmaWxsLCB3aWR0aCkge1xuICB2YXIgc2lnbiA9IHZhbHVlIDwgMCA/IFwiLVwiIDogXCJcIixcbiAgICAgIHN0cmluZyA9IChzaWduID8gLXZhbHVlIDogdmFsdWUpICsgXCJcIixcbiAgICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gIHJldHVybiBzaWduICsgKGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSArIHN0cmluZyA6IHN0cmluZyk7XG59XG5cbmZ1bmN0aW9uIHJlcXVvdGUocykge1xuICByZXR1cm4gcy5yZXBsYWNlKHJlcXVvdGVSZSwgXCJcXFxcJCZcIik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlKG5hbWVzKSB7XG4gIHJldHVybiBuZXcgUmVnRXhwKFwiXig/OlwiICsgbmFtZXMubWFwKHJlcXVvdGUpLmpvaW4oXCJ8XCIpICsgXCIpXCIsIFwiaVwiKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TG9va3VwKG5hbWVzKSB7XG4gIHZhciBtYXAgPSB7fSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbWFwW25hbWVzW2ldLnRvTG93ZXJDYXNlKCldID0gaTtcbiAgcmV0dXJuIG1hcDtcbn1cblxuZnVuY3Rpb24gcGFyc2VXZWVrZGF5TnVtYmVyU3VuZGF5KGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAxKSk7XG4gIHJldHVybiBuID8gKGQudyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlV2Vla2RheU51bWJlck1vbmRheShkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpO1xuICByZXR1cm4gbiA/IChkLnUgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZVdlZWtOdW1iZXJTdW5kYXkoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTtcbiAgcmV0dXJuIG4gPyAoZC5VID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VXZWVrTnVtYmVySVNPKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gIHJldHVybiBuID8gKGQuViA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlV2Vla051bWJlck1vbmRheShkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICByZXR1cm4gbiA/IChkLlcgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZ1bGxZZWFyKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyA0KSk7XG4gIHJldHVybiBuID8gKGQueSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlWWVhcihkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICByZXR1cm4gbiA/IChkLnkgPSArblswXSArICgrblswXSA+IDY4ID8gMTkwMCA6IDIwMDApLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlWm9uZShkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSAvXihaKXwoWystXVxcZFxcZCkoPzo6PyhcXGRcXGQpKT8vLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyA2KSk7XG4gIHJldHVybiBuID8gKGQuWiA9IG5bMV0gPyAwIDogLShuWzJdICsgKG5bM10gfHwgXCIwMFwiKSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VRdWFydGVyKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAxKSk7XG4gIHJldHVybiBuID8gKGQucSA9IG5bMF0gKiAzIC0gMywgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1vbnRoTnVtYmVyKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gIHJldHVybiBuID8gKGQubSA9IG5bMF0gLSAxLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRGF5T2ZNb250aChkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICByZXR1cm4gbiA/IChkLmQgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZURheU9mWWVhcihkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMykpO1xuICByZXR1cm4gbiA/IChkLm0gPSAwLCBkLmQgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUhvdXIyNChkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICByZXR1cm4gbiA/IChkLkggPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1pbnV0ZXMoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTtcbiAgcmV0dXJuIG4gPyAoZC5NID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTZWNvbmRzKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gIHJldHVybiBuID8gKGQuUyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWlsbGlzZWNvbmRzKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAzKSk7XG4gIHJldHVybiBuID8gKGQuTCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWljcm9zZWNvbmRzKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyA2KSk7XG4gIHJldHVybiBuID8gKGQuTCA9IE1hdGguZmxvb3IoblswXSAvIDEwMDApLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTGl0ZXJhbFBlcmNlbnQoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gcGVyY2VudFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAxKSk7XG4gIHJldHVybiBuID8gaSArIG5bMF0ubGVuZ3RoIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVW5peFRpbWVzdGFtcChkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XG4gIHJldHVybiBuID8gKGQuUSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVW5peFRpbWVzdGFtcFNlY29uZHMoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO1xuICByZXR1cm4gbiA/IChkLnMgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBmb3JtYXREYXlPZk1vbnRoKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldERhdGUoKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEhvdXIyNChkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRIb3VycygpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0SG91cjEyKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldEhvdXJzKCkgJSAxMiB8fCAxMiwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERheU9mWWVhcihkLCBwKSB7XG4gIHJldHVybiBwYWQoMSArIHRpbWVEYXkuY291bnQodGltZVllYXIoZCksIGQpLCBwLCAzKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TWlsbGlzZWNvbmRzKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldE1pbGxpc2Vjb25kcygpLCBwLCAzKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TWljcm9zZWNvbmRzKGQsIHApIHtcbiAgcmV0dXJuIGZvcm1hdE1pbGxpc2Vjb25kcyhkLCBwKSArIFwiMDAwXCI7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE1vbnRoTnVtYmVyKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldE1vbnRoKCkgKyAxLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TWludXRlcyhkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRNaW51dGVzKCksIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRTZWNvbmRzKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldFNlY29uZHMoKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFdlZWtkYXlOdW1iZXJNb25kYXkoZCkge1xuICB2YXIgZGF5ID0gZC5nZXREYXkoKTtcbiAgcmV0dXJuIGRheSA9PT0gMCA/IDcgOiBkYXk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFdlZWtOdW1iZXJTdW5kYXkoZCwgcCkge1xuICByZXR1cm4gcGFkKHRpbWVTdW5kYXkuY291bnQodGltZVllYXIoZCkgLSAxLCBkKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGRJU08oZCkge1xuICB2YXIgZGF5ID0gZC5nZXREYXkoKTtcbiAgcmV0dXJuIChkYXkgPj0gNCB8fCBkYXkgPT09IDApID8gdGltZVRodXJzZGF5KGQpIDogdGltZVRodXJzZGF5LmNlaWwoZCk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFdlZWtOdW1iZXJJU08oZCwgcCkge1xuICBkID0gZElTTyhkKTtcbiAgcmV0dXJuIHBhZCh0aW1lVGh1cnNkYXkuY291bnQodGltZVllYXIoZCksIGQpICsgKHRpbWVZZWFyKGQpLmdldERheSgpID09PSA0KSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFdlZWtkYXlOdW1iZXJTdW5kYXkoZCkge1xuICByZXR1cm4gZC5nZXREYXkoKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlck1vbmRheShkLCBwKSB7XG4gIHJldHVybiBwYWQodGltZU1vbmRheS5jb3VudCh0aW1lWWVhcihkKSAtIDEsIGQpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0WWVhcihkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRGdWxsWWVhcigpICUgMTAwLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0WWVhcklTTyhkLCBwKSB7XG4gIGQgPSBkSVNPKGQpO1xuICByZXR1cm4gcGFkKGQuZ2V0RnVsbFllYXIoKSAlIDEwMCwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZ1bGxZZWFyKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldEZ1bGxZZWFyKCkgJSAxMDAwMCwgcCwgNCk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZ1bGxZZWFySVNPKGQsIHApIHtcbiAgdmFyIGRheSA9IGQuZ2V0RGF5KCk7XG4gIGQgPSAoZGF5ID49IDQgfHwgZGF5ID09PSAwKSA/IHRpbWVUaHVyc2RheShkKSA6IHRpbWVUaHVyc2RheS5jZWlsKGQpO1xuICByZXR1cm4gcGFkKGQuZ2V0RnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0Wm9uZShkKSB7XG4gIHZhciB6ID0gZC5nZXRUaW1lem9uZU9mZnNldCgpO1xuICByZXR1cm4gKHogPiAwID8gXCItXCIgOiAoeiAqPSAtMSwgXCIrXCIpKVxuICAgICAgKyBwYWQoeiAvIDYwIHwgMCwgXCIwXCIsIDIpXG4gICAgICArIHBhZCh6ICUgNjAsIFwiMFwiLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDRGF5T2ZNb250aChkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRVVENEYXRlKCksIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENIb3VyMjQoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDSG91cnMoKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ0hvdXIxMihkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRVVENIb3VycygpICUgMTIgfHwgMTIsIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENEYXlPZlllYXIoZCwgcCkge1xuICByZXR1cm4gcGFkKDEgKyB1dGNEYXkuY291bnQodXRjWWVhcihkKSwgZCksIHAsIDMpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENNaWxsaXNlY29uZHMoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksIHAsIDMpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENNaWNyb3NlY29uZHMoZCwgcCkge1xuICByZXR1cm4gZm9ybWF0VVRDTWlsbGlzZWNvbmRzKGQsIHApICsgXCIwMDBcIjtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDTW9udGhOdW1iZXIoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDTW9udGgoKSArIDEsIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENNaW51dGVzKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldFVUQ01pbnV0ZXMoKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ1NlY29uZHMoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDU2Vjb25kcygpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDV2Vla2RheU51bWJlck1vbmRheShkKSB7XG4gIHZhciBkb3cgPSBkLmdldFVUQ0RheSgpO1xuICByZXR1cm4gZG93ID09PSAwID8gNyA6IGRvdztcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDV2Vla051bWJlclN1bmRheShkLCBwKSB7XG4gIHJldHVybiBwYWQodXRjU3VuZGF5LmNvdW50KHV0Y1llYXIoZCkgLSAxLCBkKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIFVUQ2RJU08oZCkge1xuICB2YXIgZGF5ID0gZC5nZXRVVENEYXkoKTtcbiAgcmV0dXJuIChkYXkgPj0gNCB8fCBkYXkgPT09IDApID8gdXRjVGh1cnNkYXkoZCkgOiB1dGNUaHVyc2RheS5jZWlsKGQpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENXZWVrTnVtYmVySVNPKGQsIHApIHtcbiAgZCA9IFVUQ2RJU08oZCk7XG4gIHJldHVybiBwYWQodXRjVGh1cnNkYXkuY291bnQodXRjWWVhcihkKSwgZCkgKyAodXRjWWVhcihkKS5nZXRVVENEYXkoKSA9PT0gNCksIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyU3VuZGF5KGQpIHtcbiAgcmV0dXJuIGQuZ2V0VVRDRGF5KCk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtOdW1iZXJNb25kYXkoZCwgcCkge1xuICByZXR1cm4gcGFkKHV0Y01vbmRheS5jb3VudCh1dGNZZWFyKGQpIC0gMSwgZCksIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENZZWFyKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldFVUQ0Z1bGxZZWFyKCkgJSAxMDAsIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENZZWFySVNPKGQsIHApIHtcbiAgZCA9IFVUQ2RJU08oZCk7XG4gIHJldHVybiBwYWQoZC5nZXRVVENGdWxsWWVhcigpICUgMTAwLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDRnVsbFllYXIoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDRnVsbFllYXJJU08oZCwgcCkge1xuICB2YXIgZGF5ID0gZC5nZXRVVENEYXkoKTtcbiAgZCA9IChkYXkgPj0gNCB8fCBkYXkgPT09IDApID8gdXRjVGh1cnNkYXkoZCkgOiB1dGNUaHVyc2RheS5jZWlsKGQpO1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDWm9uZSgpIHtcbiAgcmV0dXJuIFwiKzAwMDBcIjtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGl0ZXJhbFBlcmNlbnQoKSB7XG4gIHJldHVybiBcIiVcIjtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VW5peFRpbWVzdGFtcChkKSB7XG4gIHJldHVybiArZDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VW5peFRpbWVzdGFtcFNlY29uZHMoZCkge1xuICByZXR1cm4gTWF0aC5mbG9vcigrZCAvIDEwMDApO1xufVxuIiwiaW1wb3J0IGZvcm1hdExvY2FsZSBmcm9tIFwiLi9sb2NhbGUuanNcIjtcblxudmFyIGxvY2FsZTtcbmV4cG9ydCB2YXIgdGltZUZvcm1hdDtcbmV4cG9ydCB2YXIgdGltZVBhcnNlO1xuZXhwb3J0IHZhciB1dGNGb3JtYXQ7XG5leHBvcnQgdmFyIHV0Y1BhcnNlO1xuXG5kZWZhdWx0TG9jYWxlKHtcbiAgZGF0ZVRpbWU6IFwiJXgsICVYXCIsXG4gIGRhdGU6IFwiJS1tLyUtZC8lWVwiLFxuICB0aW1lOiBcIiUtSTolTTolUyAlcFwiLFxuICBwZXJpb2RzOiBbXCJBTVwiLCBcIlBNXCJdLFxuICBkYXlzOiBbXCJTdW5kYXlcIiwgXCJNb25kYXlcIiwgXCJUdWVzZGF5XCIsIFwiV2VkbmVzZGF5XCIsIFwiVGh1cnNkYXlcIiwgXCJGcmlkYXlcIiwgXCJTYXR1cmRheVwiXSxcbiAgc2hvcnREYXlzOiBbXCJTdW5cIiwgXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIiwgXCJUaHVcIiwgXCJGcmlcIiwgXCJTYXRcIl0sXG4gIG1vbnRoczogW1wiSmFudWFyeVwiLCBcIkZlYnJ1YXJ5XCIsIFwiTWFyY2hcIiwgXCJBcHJpbFwiLCBcIk1heVwiLCBcIkp1bmVcIiwgXCJKdWx5XCIsIFwiQXVndXN0XCIsIFwiU2VwdGVtYmVyXCIsIFwiT2N0b2JlclwiLCBcIk5vdmVtYmVyXCIsIFwiRGVjZW1iZXJcIl0sXG4gIHNob3J0TW9udGhzOiBbXCJKYW5cIiwgXCJGZWJcIiwgXCJNYXJcIiwgXCJBcHJcIiwgXCJNYXlcIiwgXCJKdW5cIiwgXCJKdWxcIiwgXCJBdWdcIiwgXCJTZXBcIiwgXCJPY3RcIiwgXCJOb3ZcIiwgXCJEZWNcIl1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWZhdWx0TG9jYWxlKGRlZmluaXRpb24pIHtcbiAgbG9jYWxlID0gZm9ybWF0TG9jYWxlKGRlZmluaXRpb24pO1xuICB0aW1lRm9ybWF0ID0gbG9jYWxlLmZvcm1hdDtcbiAgdGltZVBhcnNlID0gbG9jYWxlLnBhcnNlO1xuICB1dGNGb3JtYXQgPSBsb2NhbGUudXRjRm9ybWF0O1xuICB1dGNQYXJzZSA9IGxvY2FsZS51dGNQYXJzZTtcbiAgcmV0dXJuIGxvY2FsZTtcbn1cbiIsImltcG9ydCB7YmlzZWN0b3IsIHRpY2tTdGVwfSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGVOdW1iZXIgYXMgcmVpbnRlcnBvbGF0ZX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3RpbWVZZWFyLCB0aW1lTW9udGgsIHRpbWVXZWVrLCB0aW1lRGF5LCB0aW1lSG91ciwgdGltZU1pbnV0ZSwgdGltZVNlY29uZCwgdGltZU1pbGxpc2Vjb25kfSBmcm9tIFwiZDMtdGltZVwiO1xuaW1wb3J0IHt0aW1lRm9ybWF0fSBmcm9tIFwiZDMtdGltZS1mb3JtYXRcIjtcbmltcG9ydCB7bWFwfSBmcm9tIFwiLi9hcnJheVwiO1xuaW1wb3J0IHtkZWZhdWx0IGFzIGNvbnRpbnVvdXMsIGNvcHksIGRlaW50ZXJwb2xhdGVMaW5lYXIgYXMgZGVpbnRlcnBvbGF0ZX0gZnJvbSBcIi4vY29udGludW91c1wiO1xuaW1wb3J0IG5pY2UgZnJvbSBcIi4vbmljZVwiO1xuXG52YXIgZHVyYXRpb25TZWNvbmQgPSAxMDAwLFxuICAgIGR1cmF0aW9uTWludXRlID0gZHVyYXRpb25TZWNvbmQgKiA2MCxcbiAgICBkdXJhdGlvbkhvdXIgPSBkdXJhdGlvbk1pbnV0ZSAqIDYwLFxuICAgIGR1cmF0aW9uRGF5ID0gZHVyYXRpb25Ib3VyICogMjQsXG4gICAgZHVyYXRpb25XZWVrID0gZHVyYXRpb25EYXkgKiA3LFxuICAgIGR1cmF0aW9uTW9udGggPSBkdXJhdGlvbkRheSAqIDMwLFxuICAgIGR1cmF0aW9uWWVhciA9IGR1cmF0aW9uRGF5ICogMzY1O1xuXG5mdW5jdGlvbiBkYXRlKHQpIHtcbiAgcmV0dXJuIG5ldyBEYXRlKHQpO1xufVxuXG5mdW5jdGlvbiBudW1iZXIodCkge1xuICByZXR1cm4gdCBpbnN0YW5jZW9mIERhdGUgPyArdCA6ICtuZXcgRGF0ZSgrdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhcih5ZWFyLCBtb250aCwgd2VlaywgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQsIGZvcm1hdCkge1xuICB2YXIgc2NhbGUgPSBjb250aW51b3VzKGRlaW50ZXJwb2xhdGUsIHJlaW50ZXJwb2xhdGUpLFxuICAgICAgaW52ZXJ0ID0gc2NhbGUuaW52ZXJ0LFxuICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluO1xuXG4gIHZhciBmb3JtYXRNaWxsaXNlY29uZCA9IGZvcm1hdChcIi4lTFwiKSxcbiAgICAgIGZvcm1hdFNlY29uZCA9IGZvcm1hdChcIjolU1wiKSxcbiAgICAgIGZvcm1hdE1pbnV0ZSA9IGZvcm1hdChcIiVJOiVNXCIpLFxuICAgICAgZm9ybWF0SG91ciA9IGZvcm1hdChcIiVJICVwXCIpLFxuICAgICAgZm9ybWF0RGF5ID0gZm9ybWF0KFwiJWEgJWRcIiksXG4gICAgICBmb3JtYXRXZWVrID0gZm9ybWF0KFwiJWIgJWRcIiksXG4gICAgICBmb3JtYXRNb250aCA9IGZvcm1hdChcIiVCXCIpLFxuICAgICAgZm9ybWF0WWVhciA9IGZvcm1hdChcIiVZXCIpO1xuXG4gIHZhciB0aWNrSW50ZXJ2YWxzID0gW1xuICAgIFtzZWNvbmQsICAxLCAgICAgIGR1cmF0aW9uU2Vjb25kXSxcbiAgICBbc2Vjb25kLCAgNSwgIDUgKiBkdXJhdGlvblNlY29uZF0sXG4gICAgW3NlY29uZCwgMTUsIDE1ICogZHVyYXRpb25TZWNvbmRdLFxuICAgIFtzZWNvbmQsIDMwLCAzMCAqIGR1cmF0aW9uU2Vjb25kXSxcbiAgICBbbWludXRlLCAgMSwgICAgICBkdXJhdGlvbk1pbnV0ZV0sXG4gICAgW21pbnV0ZSwgIDUsICA1ICogZHVyYXRpb25NaW51dGVdLFxuICAgIFttaW51dGUsIDE1LCAxNSAqIGR1cmF0aW9uTWludXRlXSxcbiAgICBbbWludXRlLCAzMCwgMzAgKiBkdXJhdGlvbk1pbnV0ZV0sXG4gICAgWyAgaG91ciwgIDEsICAgICAgZHVyYXRpb25Ib3VyICBdLFxuICAgIFsgIGhvdXIsICAzLCAgMyAqIGR1cmF0aW9uSG91ciAgXSxcbiAgICBbICBob3VyLCAgNiwgIDYgKiBkdXJhdGlvbkhvdXIgIF0sXG4gICAgWyAgaG91ciwgMTIsIDEyICogZHVyYXRpb25Ib3VyICBdLFxuICAgIFsgICBkYXksICAxLCAgICAgIGR1cmF0aW9uRGF5ICAgXSxcbiAgICBbICAgZGF5LCAgMiwgIDIgKiBkdXJhdGlvbkRheSAgIF0sXG4gICAgWyAgd2VlaywgIDEsICAgICAgZHVyYXRpb25XZWVrICBdLFxuICAgIFsgbW9udGgsICAxLCAgICAgIGR1cmF0aW9uTW9udGggXSxcbiAgICBbIG1vbnRoLCAgMywgIDMgKiBkdXJhdGlvbk1vbnRoIF0sXG4gICAgWyAgeWVhciwgIDEsICAgICAgZHVyYXRpb25ZZWFyICBdXG4gIF07XG5cbiAgZnVuY3Rpb24gdGlja0Zvcm1hdChkYXRlKSB7XG4gICAgcmV0dXJuIChzZWNvbmQoZGF0ZSkgPCBkYXRlID8gZm9ybWF0TWlsbGlzZWNvbmRcbiAgICAgICAgOiBtaW51dGUoZGF0ZSkgPCBkYXRlID8gZm9ybWF0U2Vjb25kXG4gICAgICAgIDogaG91cihkYXRlKSA8IGRhdGUgPyBmb3JtYXRNaW51dGVcbiAgICAgICAgOiBkYXkoZGF0ZSkgPCBkYXRlID8gZm9ybWF0SG91clxuICAgICAgICA6IG1vbnRoKGRhdGUpIDwgZGF0ZSA/ICh3ZWVrKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdERheSA6IGZvcm1hdFdlZWspXG4gICAgICAgIDogeWVhcihkYXRlKSA8IGRhdGUgPyBmb3JtYXRNb250aFxuICAgICAgICA6IGZvcm1hdFllYXIpKGRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGlja0ludGVydmFsKGludGVydmFsLCBzdGFydCwgc3RvcCwgc3RlcCkge1xuICAgIGlmIChpbnRlcnZhbCA9PSBudWxsKSBpbnRlcnZhbCA9IDEwO1xuXG4gICAgLy8gSWYgYSBkZXNpcmVkIHRpY2sgY291bnQgaXMgc3BlY2lmaWVkLCBwaWNrIGEgcmVhc29uYWJsZSB0aWNrIGludGVydmFsXG4gICAgLy8gYmFzZWQgb24gdGhlIGV4dGVudCBvZiB0aGUgZG9tYWluIGFuZCBhIHJvdWdoIGVzdGltYXRlIG9mIHRpY2sgc2l6ZS5cbiAgICAvLyBPdGhlcndpc2UsIGFzc3VtZSBpbnRlcnZhbCBpcyBhbHJlYWR5IGEgdGltZSBpbnRlcnZhbCBhbmQgdXNlIGl0LlxuICAgIGlmICh0eXBlb2YgaW50ZXJ2YWwgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBNYXRoLmFicyhzdG9wIC0gc3RhcnQpIC8gaW50ZXJ2YWwsXG4gICAgICAgICAgaSA9IGJpc2VjdG9yKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIGlbMl07IH0pLnJpZ2h0KHRpY2tJbnRlcnZhbHMsIHRhcmdldCk7XG4gICAgICBpZiAoaSA9PT0gdGlja0ludGVydmFscy5sZW5ndGgpIHtcbiAgICAgICAgc3RlcCA9IHRpY2tTdGVwKHN0YXJ0IC8gZHVyYXRpb25ZZWFyLCBzdG9wIC8gZHVyYXRpb25ZZWFyLCBpbnRlcnZhbCk7XG4gICAgICAgIGludGVydmFsID0geWVhcjtcbiAgICAgIH0gZWxzZSBpZiAoaSkge1xuICAgICAgICBpID0gdGlja0ludGVydmFsc1t0YXJnZXQgLyB0aWNrSW50ZXJ2YWxzW2kgLSAxXVsyXSA8IHRpY2tJbnRlcnZhbHNbaV1bMl0gLyB0YXJnZXQgPyBpIC0gMSA6IGldO1xuICAgICAgICBzdGVwID0gaVsxXTtcbiAgICAgICAgaW50ZXJ2YWwgPSBpWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RlcCA9IE1hdGgubWF4KHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBpbnRlcnZhbCksIDEpO1xuICAgICAgICBpbnRlcnZhbCA9IG1pbGxpc2Vjb25kO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGVwID09IG51bGwgPyBpbnRlcnZhbCA6IGludGVydmFsLmV2ZXJ5KHN0ZXApO1xuICB9XG5cbiAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShpbnZlcnQoeSkpO1xuICB9O1xuXG4gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IGRvbWFpbihtYXAuY2FsbChfLCBudW1iZXIpKSA6IGRvbWFpbigpLm1hcChkYXRlKTtcbiAgfTtcblxuICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGludGVydmFsLCBzdGVwKSB7XG4gICAgdmFyIGQgPSBkb21haW4oKSxcbiAgICAgICAgdDAgPSBkWzBdLFxuICAgICAgICB0MSA9IGRbZC5sZW5ndGggLSAxXSxcbiAgICAgICAgciA9IHQxIDwgdDAsXG4gICAgICAgIHQ7XG4gICAgaWYgKHIpIHQgPSB0MCwgdDAgPSB0MSwgdDEgPSB0O1xuICAgIHQgPSB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIHQwLCB0MSwgc3RlcCk7XG4gICAgdCA9IHQgPyB0LnJhbmdlKHQwLCB0MSArIDEpIDogW107IC8vIGluY2x1c2l2ZSBzdG9wXG4gICAgcmV0dXJuIHIgPyB0LnJldmVyc2UoKSA6IHQ7XG4gIH07XG5cbiAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGNvdW50LCBzcGVjaWZpZXIpIHtcbiAgICByZXR1cm4gc3BlY2lmaWVyID09IG51bGwgPyB0aWNrRm9ybWF0IDogZm9ybWF0KHNwZWNpZmllcik7XG4gIH07XG5cbiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGludGVydmFsLCBzdGVwKSB7XG4gICAgdmFyIGQgPSBkb21haW4oKTtcbiAgICByZXR1cm4gKGludGVydmFsID0gdGlja0ludGVydmFsKGludGVydmFsLCBkWzBdLCBkW2QubGVuZ3RoIC0gMV0sIHN0ZXApKVxuICAgICAgICA/IGRvbWFpbihuaWNlKGQsIGludGVydmFsKSlcbiAgICAgICAgOiBzY2FsZTtcbiAgfTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGNvcHkoc2NhbGUsIGNhbGVuZGFyKHllYXIsIG1vbnRoLCB3ZWVrLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCwgZm9ybWF0KSk7XG4gIH07XG5cbiAgcmV0dXJuIHNjYWxlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGNhbGVuZGFyKHRpbWVZZWFyLCB0aW1lTW9udGgsIHRpbWVXZWVrLCB0aW1lRGF5LCB0aW1lSG91ciwgdGltZU1pbnV0ZSwgdGltZVNlY29uZCwgdGltZU1pbGxpc2Vjb25kLCB0aW1lRm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDIwMDAsIDAsIDEpLCBuZXcgRGF0ZSgyMDAwLCAwLCAyKV0pO1xufVxuIiwiaW1wb3J0IGludGVydmFsIGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5cbnZhciB1dGNNb250aCA9IGludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgZGF0ZS5zZXRVVENEYXRlKDEpO1xuICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xufSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICBkYXRlLnNldFVUQ01vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKSArIHN0ZXApO1xufSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICByZXR1cm4gZW5kLmdldFVUQ01vbnRoKCkgLSBzdGFydC5nZXRVVENNb250aCgpICsgKGVuZC5nZXRVVENGdWxsWWVhcigpIC0gc3RhcnQuZ2V0VVRDRnVsbFllYXIoKSkgKiAxMjtcbn0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0VVRDTW9udGgoKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB1dGNNb250aDtcbmV4cG9ydCB2YXIgdXRjTW9udGhzID0gdXRjTW9udGgucmFuZ2U7XG4iLCJpbXBvcnQgaW50ZXJ2YWwgZnJvbSBcIi4vaW50ZXJ2YWwuanNcIjtcbmltcG9ydCB7ZHVyYXRpb25Ib3VyfSBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuXG52YXIgdXRjSG91ciA9IGludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgZGF0ZS5zZXRVVENNaW51dGVzKDAsIDAsIDApO1xufSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25Ib3VyKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkhvdXI7XG59LCBmdW5jdGlvbihkYXRlKSB7XG4gIHJldHVybiBkYXRlLmdldFVUQ0hvdXJzKCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdXRjSG91cjtcbmV4cG9ydCB2YXIgdXRjSG91cnMgPSB1dGNIb3VyLnJhbmdlO1xuIiwiaW1wb3J0IGludGVydmFsIGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5pbXBvcnQge2R1cmF0aW9uTWludXRlfSBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuXG52YXIgdXRjTWludXRlID0gaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICBkYXRlLnNldFVUQ1NlY29uZHMoMCwgMCk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbk1pbnV0ZSk7XG59LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25NaW51dGU7XG59LCBmdW5jdGlvbihkYXRlKSB7XG4gIHJldHVybiBkYXRlLmdldFVUQ01pbnV0ZXMoKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB1dGNNaW51dGU7XG5leHBvcnQgdmFyIHV0Y01pbnV0ZXMgPSB1dGNNaW51dGUucmFuZ2U7XG4iLCJpbXBvcnQge2NhbGVuZGFyfSBmcm9tIFwiLi90aW1lXCI7XG5pbXBvcnQge3V0Y0Zvcm1hdH0gZnJvbSBcImQzLXRpbWUtZm9ybWF0XCI7XG5pbXBvcnQge3V0Y1llYXIsIHV0Y01vbnRoLCB1dGNXZWVrLCB1dGNEYXksIHV0Y0hvdXIsIHV0Y01pbnV0ZSwgdXRjU2Vjb25kLCB1dGNNaWxsaXNlY29uZH0gZnJvbSBcImQzLXRpbWVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBjYWxlbmRhcih1dGNZZWFyLCB1dGNNb250aCwgdXRjV2VlaywgdXRjRGF5LCB1dGNIb3VyLCB1dGNNaW51dGUsIHV0Y1NlY29uZCwgdXRjTWlsbGlzZWNvbmQsIHV0Y0Zvcm1hdCkuZG9tYWluKFtEYXRlLlVUQygyMDAwLCAwLCAxKSwgRGF0ZS5VVEMoMjAwMCwgMCwgMildKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHMubWF0Y2goLy57Nn0vZykubWFwKGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gXCIjXCIgKyB4O1xuICB9KTtcbn1cbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4vY29sb3JzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbG9ycyhcIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZlwiKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4vY29sb3JzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbG9ycyhcIjM5M2I3OTUyNTRhMzZiNmVjZjljOWVkZTYzNzkzOThjYTI1MmI1Y2Y2YmNlZGI5YzhjNmQzMWJkOWUzOWU3YmE1MmU3Y2I5NDg0M2MzOWFkNDk0YWQ2NjE2YmU3OTY5YzdiNDE3M2E1NTE5NGNlNmRiZGRlOWVkNlwiKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4vY29sb3JzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbG9ycyhcIjMxODJiZDZiYWVkNjllY2FlMWM2ZGJlZmU2NTUwZGZkOGQzY2ZkYWU2YmZkZDBhMjMxYTM1NDc0YzQ3NmExZDk5YmM3ZTljMDc1NmJiMTllOWFjOGJjYmRkY2RhZGFlYjYzNjM2Mzk2OTY5NmJkYmRiZGQ5ZDlkOVwiKTtcbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4vY29sb3JzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbG9ycyhcIjFmNzdiNGFlYzdlOGZmN2YwZWZmYmI3ODJjYTAyYzk4ZGY4YWQ2MjcyOGZmOTg5Njk0NjdiZGM1YjBkNThjNTY0YmM0OWM5NGUzNzdjMmY3YjZkMjdmN2Y3ZmM3YzdjN2JjYmQyMmRiZGI4ZDE3YmVjZjllZGFlNVwiKTtcbiIsImV4cG9ydCB2YXIgZGVnMnJhZCA9IE1hdGguUEkgLyAxODA7XG5leHBvcnQgdmFyIHJhZDJkZWcgPSAxODAgLyBNYXRoLlBJO1xuIiwiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5pbXBvcnQge0NvbG9yLCByZ2JDb252ZXJ0LCBSZ2IsIGRhcmtlciwgYnJpZ2h0ZXJ9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5pbXBvcnQge2RlZzJyYWQsIHJhZDJkZWd9IGZyb20gXCIuL21hdGguanNcIjtcblxudmFyIEEgPSAtMC4xNDg2MSxcbiAgICBCID0gKzEuNzgyNzcsXG4gICAgQyA9IC0wLjI5MjI3LFxuICAgIEQgPSAtMC45MDY0OSxcbiAgICBFID0gKzEuOTcyOTQsXG4gICAgRUQgPSBFICogRCxcbiAgICBFQiA9IEUgKiBCLFxuICAgIEJDX0RBID0gQiAqIEMgLSBEICogQTtcblxuZnVuY3Rpb24gY3ViZWhlbGl4Q29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgQ3ViZWhlbGl4KSByZXR1cm4gbmV3IEN1YmVoZWxpeChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgUmdiKSkgbyA9IHJnYkNvbnZlcnQobyk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBsID0gKEJDX0RBICogYiArIEVEICogciAtIEVCICogZykgLyAoQkNfREEgKyBFRCAtIEVCKSxcbiAgICAgIGJsID0gYiAtIGwsXG4gICAgICBrID0gKEUgKiAoZyAtIGwpIC0gQyAqIGJsKSAvIEQsXG4gICAgICBzID0gTWF0aC5zcXJ0KGsgKiBrICsgYmwgKiBibCkgLyAoRSAqIGwgKiAoMSAtIGwpKSwgLy8gTmFOIGlmIGw9MCBvciBsPTFcbiAgICAgIGggPSBzID8gTWF0aC5hdGFuMihrLCBibCkgKiByYWQyZGVnIC0gMTIwIDogTmFOO1xuICByZXR1cm4gbmV3IEN1YmVoZWxpeChoIDwgMCA/IGggKyAzNjAgOiBoLCBzLCBsLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGN1YmVoZWxpeENvbnZlcnQoaCkgOiBuZXcgQ3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEN1YmVoZWxpeChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHRoaXMuaCA9ICtoO1xuICB0aGlzLnMgPSArcztcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoQ3ViZWhlbGl4LCBjdWJlaGVsaXgsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IEN1YmVoZWxpeCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyOiBmdW5jdGlvbihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGggPSBpc05hTih0aGlzLmgpID8gMCA6ICh0aGlzLmggKyAxMjApICogZGVnMnJhZCxcbiAgICAgICAgbCA9ICt0aGlzLmwsXG4gICAgICAgIGEgPSBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucyAqIGwgKiAoMSAtIGwpLFxuICAgICAgICBjb3NoID0gTWF0aC5jb3MoaCksXG4gICAgICAgIHNpbmggPSBNYXRoLnNpbihoKTtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIDI1NSAqIChsICsgYSAqIChBICogY29zaCArIEIgKiBzaW5oKSksXG4gICAgICAyNTUgKiAobCArIGEgKiAoQyAqIGNvc2ggKyBEICogc2luaCkpLFxuICAgICAgMjU1ICogKGwgKyBhICogKEUgKiBjb3NoKSksXG4gICAgICB0aGlzLm9wYWNpdHlcbiAgICApO1xuICB9XG59KSk7XG4iLCJpbXBvcnQge2N1YmVoZWxpeCBhcyBjb2xvckN1YmVoZWxpeH0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgY29sb3IsIHtodWV9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5cbmZ1bmN0aW9uIGN1YmVoZWxpeChodWUpIHtcbiAgcmV0dXJuIChmdW5jdGlvbiBjdWJlaGVsaXhHYW1tYSh5KSB7XG4gICAgeSA9ICt5O1xuXG4gICAgZnVuY3Rpb24gY3ViZWhlbGl4KHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBoID0gaHVlKChzdGFydCA9IGNvbG9yQ3ViZWhlbGl4KHN0YXJ0KSkuaCwgKGVuZCA9IGNvbG9yQ3ViZWhlbGl4KGVuZCkpLmgpLFxuICAgICAgICAgIHMgPSBjb2xvcihzdGFydC5zLCBlbmQucyksXG4gICAgICAgICAgbCA9IGNvbG9yKHN0YXJ0LmwsIGVuZC5sKSxcbiAgICAgICAgICBvcGFjaXR5ID0gY29sb3Ioc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgc3RhcnQuaCA9IGgodCk7XG4gICAgICAgIHN0YXJ0LnMgPSBzKHQpO1xuICAgICAgICBzdGFydC5sID0gbChNYXRoLnBvdyh0LCB5KSk7XG4gICAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBjdWJlaGVsaXguZ2FtbWEgPSBjdWJlaGVsaXhHYW1tYTtcblxuICAgIHJldHVybiBjdWJlaGVsaXg7XG4gIH0pKDEpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjdWJlaGVsaXgoaHVlKTtcbmV4cG9ydCB2YXIgY3ViZWhlbGl4TG9uZyA9IGN1YmVoZWxpeChjb2xvcik7XG4iLCJpbXBvcnQge2N1YmVoZWxpeH0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQge2ludGVycG9sYXRlQ3ViZWhlbGl4TG9uZ30gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGludGVycG9sYXRlQ3ViZWhlbGl4TG9uZyhjdWJlaGVsaXgoMzAwLCAwLjUsIDAuMCksIGN1YmVoZWxpeCgtMjQwLCAwLjUsIDEuMCkpO1xuIiwiaW1wb3J0IHtjdWJlaGVsaXh9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmd9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuXG5leHBvcnQgdmFyIHdhcm0gPSBpbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmcoY3ViZWhlbGl4KC0xMDAsIDAuNzUsIDAuMzUpLCBjdWJlaGVsaXgoODAsIDEuNTAsIDAuOCkpO1xuXG5leHBvcnQgdmFyIGNvb2wgPSBpbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmcoY3ViZWhlbGl4KDI2MCwgMC43NSwgMC4zNSksIGN1YmVoZWxpeCg4MCwgMS41MCwgMC44KSk7XG5cbnZhciByYWluYm93ID0gY3ViZWhlbGl4KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHQpIHtcbiAgaWYgKHQgPCAwIHx8IHQgPiAxKSB0IC09IE1hdGguZmxvb3IodCk7XG4gIHZhciB0cyA9IE1hdGguYWJzKHQgLSAwLjUpO1xuICByYWluYm93LmggPSAzNjAgKiB0IC0gMTAwO1xuICByYWluYm93LnMgPSAxLjUgLSAxLjUgKiB0cztcbiAgcmFpbmJvdy5sID0gMC44IC0gMC45ICogdHM7XG4gIHJldHVybiByYWluYm93ICsgXCJcIjtcbn1cbiIsImltcG9ydCBjb2xvcnMgZnJvbSBcIi4vY29sb3JzXCI7XG5cbmZ1bmN0aW9uIHJhbXAocmFuZ2UpIHtcbiAgdmFyIG4gPSByYW5nZS5sZW5ndGg7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIHJhbmdlW01hdGgubWF4KDAsIE1hdGgubWluKG4gLSAxLCBNYXRoLmZsb29yKHQgKiBuKSkpXTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmFtcChjb2xvcnMoXCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjVcIikpO1xuXG5leHBvcnQgdmFyIG1hZ21hID0gcmFtcChjb2xvcnMoXCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIxMDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEwNDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgyOTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEwNmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIxODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJiODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2VhMzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZjMjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQxNmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5NjhkZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNmMzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFmYzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlhNmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRmZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJkODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBmZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUwYTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJmY2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmZcIikpO1xuXG5leHBvcnQgdmFyIGluZmVybm8gPSByYW1wKGNvbG9ycyhcIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwYTAyMDIwYzAyMDIwZTAzMDIxMDA0MDMxMjA0MDMxNDA1MDQxNzA2MDQxOTA3MDUxYjA4MDUxZDA5MDYxZjBhMDcyMjBiMDcyNDBjMDgyNjBkMDgyOTBlMDkyYjEwMDkyZDExMGEzMDEyMGEzMjE0MGIzNDE1MGIzNzE2MGIzOTE4MGMzYzE5MGMzZTFiMGM0MTFjMGM0MzFlMGM0NTFmMGM0ODIxMGM0YTIzMGM0YzI0MGM0ZjI2MGM1MTI4MGI1MzI5MGI1NTJiMGI1NzJkMGI1OTJmMGE1YjMxMGE1YzMyMGE1ZTM0MGE1ZjM2MDk2MTM4MDk2MjM5MDk2MzNiMDk2NDNkMDk2NTNlMDk2NjQwMGE2NzQyMGE2ODQ0MGE2ODQ1MGE2OTQ3MGI2YTQ5MGI2YTRhMGM2YjRjMGM2YjRkMGQ2YzRmMGQ2YzUxMGU2YzUyMGU2ZDU0MGY2ZDU1MGY2ZDU3MTA2ZTU5MTA2ZTVhMTE2ZTVjMTI2ZTVkMTI2ZTVmMTM2ZTYxMTM2ZTYyMTQ2ZTY0MTU2ZTY1MTU2ZTY3MTY2ZTY5MTY2ZTZhMTc2ZTZjMTg2ZTZkMTg2ZTZmMTk2ZTcxMTk2ZTcyMWE2ZTc0MWE2ZTc1MWI2ZTc3MWM2ZDc4MWM2ZDdhMWQ2ZDdjMWQ2ZDdkMWU2ZDdmMWU2YzgwMWY2YzgyMjA2Yzg0MjA2Yjg1MjE2Yjg3MjE2Yjg4MjI2YThhMjI2YThjMjM2OThkMjM2OThmMjQ2OTkwMjU2ODkyMjU2ODkzMjY2Nzk1MjY2Nzk3Mjc2Njk4Mjc2NjlhMjg2NTliMjk2NDlkMjk2NDlmMmE2M2EwMmE2M2EyMmI2MmEzMmM2MWE1MmM2MGE2MmQ2MGE4MmU1ZmE5MmU1ZWFiMmY1ZWFkMzA1ZGFlMzA1Y2IwMzE1YmIxMzI1YWIzMzI1YWI0MzM1OWI2MzQ1OGI3MzU1N2I5MzU1NmJhMzY1NWJjMzc1NGJkMzg1M2JmMzk1MmMwM2E1MWMxM2E1MGMzM2I0ZmM0M2M0ZWM2M2Q0ZGM3M2U0Y2M4M2Y0YmNhNDA0YWNiNDE0OWNjNDI0OGNlNDM0N2NmNDQ0NmQwNDU0NWQyNDY0NGQzNDc0M2Q0NDg0MmQ1NGE0MWQ3NGIzZmQ4NGMzZWQ5NGQzZGRhNGUzY2RiNTAzYmRkNTEzYWRlNTIzOGRmNTMzN2UwNTUzNmUxNTYzNWUyNTczNGUzNTkzM2U0NWEzMWU1NWMzMGU2NWQyZmU3NWUyZWU4NjAyZGU5NjEyYmVhNjMyYWViNjQyOWViNjYyOGVjNjcyNmVkNjkyNWVlNmEyNGVmNmMyM2VmNmUyMWYwNmYyMGYxNzExZmYxNzMxZGYyNzQxY2YzNzYxYmYzNzgxOWY0NzkxOGY1N2IxN2Y1N2QxNWY2N2UxNGY2ODAxM2Y3ODIxMmY3ODQxMGY4ODUwZmY4ODcwZWY4ODkwY2Y5OGIwYmY5OGMwYWY5OGUwOWZhOTAwOGZhOTIwN2ZhOTQwN2ZiOTYwNmZiOTcwNmZiOTkwNmZiOWIwNmZiOWQwN2ZjOWYwN2ZjYTEwOGZjYTMwOWZjYTUwYWZjYTYwY2ZjYTgwZGZjYWEwZmZjYWMxMWZjYWUxMmZjYjAxNGZjYjIxNmZjYjQxOGZiYjYxYWZiYjgxZGZiYmExZmZiYmMyMWZiYmUyM2ZhYzAyNmZhYzIyOGZhYzQyYWZhYzYyZGY5YzcyZmY5YzkzMmY5Y2IzNWY4Y2QzN2Y4Y2YzYWY3ZDEzZGY3ZDM0MGY2ZDU0M2Y2ZDc0NmY1ZDk0OWY1ZGI0Y2Y0ZGQ0ZmY0ZGY1M2Y0ZTE1NmYzZTM1YWYzZTU1ZGYyZTY2MWYyZTg2NWYyZWE2OWYxZWM2ZGYxZWQ3MWYxZWY3NWYxZjE3OWYyZjI3ZGYyZjQ4MmYzZjU4NmYzZjY4YWY0Zjg4ZWY1Zjk5MmY2ZmE5NmY4ZmI5YWY5ZmM5ZGZhZmRhMWZjZmZhNFwiKSk7XG5cbmV4cG9ydCB2YXIgcGxhc21hID0gcmFtcChjb2xvcnMoXCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjFcIikpO1xuIiwiaW1wb3J0IHtsaW5lYXJpc2h9IGZyb20gXCIuL2xpbmVhclwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXF1ZW50aWFsKGludGVycG9sYXRvcikge1xuICB2YXIgeDAgPSAwLFxuICAgICAgeDEgPSAxLFxuICAgICAgY2xhbXAgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgdmFyIHQgPSAoeCAtIHgwKSAvICh4MSAtIHgwKTtcbiAgICByZXR1cm4gaW50ZXJwb2xhdG9yKGNsYW1wID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdCkpIDogdCk7XG4gIH1cblxuICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSArX1swXSwgeDEgPSArX1sxXSwgc2NhbGUpIDogW3gwLCB4MV07XG4gIH07XG5cbiAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xhbXAgPSAhIV8sIHNjYWxlKSA6IGNsYW1wO1xuICB9O1xuXG4gIHNjYWxlLmludGVycG9sYXRvciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0b3IgPSBfLCBzY2FsZSkgOiBpbnRlcnBvbGF0b3I7XG4gIH07XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBzZXF1ZW50aWFsKGludGVycG9sYXRvcikuZG9tYWluKFt4MCwgeDFdKS5jbGFtcChjbGFtcCk7XG4gIH07XG5cbiAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7XG59XG4iLCJleHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlQmFuZCxcbiAgcG9pbnQgYXMgc2NhbGVQb2ludFxufSBmcm9tIFwiLi9zcmMvYmFuZFwiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlSWRlbnRpdHlcbn0gZnJvbSBcIi4vc3JjL2lkZW50aXR5XCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NhbGVMaW5lYXJcbn0gZnJvbSBcIi4vc3JjL2xpbmVhclwiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlTG9nXG59IGZyb20gXCIuL3NyYy9sb2dcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZU9yZGluYWwsXG4gIGltcGxpY2l0IGFzIHNjYWxlSW1wbGljaXRcbn0gZnJvbSBcIi4vc3JjL29yZGluYWxcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZVBvdyxcbiAgc3FydCBhcyBzY2FsZVNxcnRcbn0gZnJvbSBcIi4vc3JjL3Bvd1wiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIHNjYWxlUXVhbnRpbGVcbn0gZnJvbSBcIi4vc3JjL3F1YW50aWxlXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NhbGVRdWFudGl6ZVxufSBmcm9tIFwiLi9zcmMvcXVhbnRpemVcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZVRocmVzaG9sZFxufSBmcm9tIFwiLi9zcmMvdGhyZXNob2xkXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NhbGVUaW1lXG59IGZyb20gXCIuL3NyYy90aW1lXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NhbGVVdGNcbn0gZnJvbSBcIi4vc3JjL3V0Y1RpbWVcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2hlbWVDYXRlZ29yeTEwXG59IGZyb20gXCIuL3NyYy9jYXRlZ29yeTEwXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NoZW1lQ2F0ZWdvcnkyMGJcbn0gZnJvbSBcIi4vc3JjL2NhdGVnb3J5MjBiXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NoZW1lQ2F0ZWdvcnkyMGNcbn0gZnJvbSBcIi4vc3JjL2NhdGVnb3J5MjBjXCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgc2NoZW1lQ2F0ZWdvcnkyMFxufSBmcm9tIFwiLi9zcmMvY2F0ZWdvcnkyMFwiO1xuXG5leHBvcnQge1xuICBkZWZhdWx0IGFzIGludGVycG9sYXRlQ3ViZWhlbGl4RGVmYXVsdFxufSBmcm9tIFwiLi9zcmMvY3ViZWhlbGl4XCI7XG5cbmV4cG9ydCB7XG4gIGRlZmF1bHQgYXMgaW50ZXJwb2xhdGVSYWluYm93LFxuICB3YXJtIGFzIGludGVycG9sYXRlV2FybSxcbiAgY29vbCBhcyBpbnRlcnBvbGF0ZUNvb2xcbn0gZnJvbSBcIi4vc3JjL3JhaW5ib3dcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBpbnRlcnBvbGF0ZVZpcmlkaXMsXG4gIG1hZ21hIGFzIGludGVycG9sYXRlTWFnbWEsXG4gIGluZmVybm8gYXMgaW50ZXJwb2xhdGVJbmZlcm5vLFxuICBwbGFzbWEgYXMgaW50ZXJwb2xhdGVQbGFzbWFcbn0gZnJvbSBcIi4vc3JjL3ZpcmlkaXNcIjtcblxuZXhwb3J0IHtcbiAgZGVmYXVsdCBhcyBzY2FsZVNlcXVlbnRpYWxcbn0gZnJvbSBcIi4vc3JjL3NlcXVlbnRpYWxcIjtcbiIsImltcG9ydCBfaXNQbGFpbk9iamVjdCBmcm9tIFwibG9kYXNoL2lzUGxhaW5PYmplY3RcIjtcbmltcG9ydCBfaXNGdW5jdGlvbiBmcm9tIFwibG9kYXNoL2lzRnVuY3Rpb25cIjtcbmltcG9ydCBfaW5jbHVkZXMgZnJvbSBcImxvZGFzaC9pbmNsdWRlc1wiO1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgKiBhcyBDb2xsZWN0aW9uIGZyb20gXCIuL2NvbGxlY3Rpb25cIjtcbmltcG9ydCAqIGFzIGQzU2NhbGUgZnJvbSBcImQzLXNjYWxlXCI7XG52YXIgc3VwcG9ydGVkU2NhbGVTdHJpbmdzID0gW1wibGluZWFyXCIsIFwidGltZVwiLCBcImxvZ1wiLCBcInNxcnRcIl07IC8vIFByaXZhdGUgRnVuY3Rpb25zXG5cbmZ1bmN0aW9uIHRvTmV3TmFtZShzY2FsZSkge1xuICAvLyBkMyBzY2FsZSBjaGFuZ2VkIHRoZSBuYW1pbmcgc2NoZW1lIGZvciBzY2FsZSBmcm9tIFwibGluZWFyXCIgLT4gXCJzY2FsZUxpbmVhclwiIGV0Yy5cbiAgdmFyIGNhcGl0YWxpemUgPSBmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBzICYmIHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSk7XG4gIH07XG5cbiAgcmV0dXJuIFwic2NhbGVcIi5jb25jYXQoY2FwaXRhbGl6ZShzY2FsZSkpO1xufVxuXG5mdW5jdGlvbiB2YWxpZFNjYWxlKHNjYWxlKSB7XG4gIGlmICh0eXBlb2Ygc2NhbGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBfaXNGdW5jdGlvbihzY2FsZS5jb3B5KSAmJiBfaXNGdW5jdGlvbihzY2FsZS5kb21haW4pICYmIF9pc0Z1bmN0aW9uKHNjYWxlLnJhbmdlKTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc2NhbGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gX2luY2x1ZGVzKHN1cHBvcnRlZFNjYWxlU3RyaW5ncywgc2NhbGUpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1NjYWxlRGVmaW5lZChwcm9wcywgYXhpcykge1xuICBpZiAoIXByb3BzLnNjYWxlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKHByb3BzLnNjYWxlLnggfHwgcHJvcHMuc2NhbGUueSkge1xuICAgIHJldHVybiBwcm9wcy5zY2FsZVtheGlzXSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBnZXRTY2FsZVR5cGVGcm9tUHJvcHMocHJvcHMsIGF4aXMpIHtcbiAgaWYgKCFpc1NjYWxlRGVmaW5lZChwcm9wcywgYXhpcykpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIHNjYWxlID0gcHJvcHMuc2NhbGVbYXhpc10gfHwgcHJvcHMuc2NhbGU7XG4gIHJldHVybiB0eXBlb2Ygc2NhbGUgPT09IFwic3RyaW5nXCIgPyBzY2FsZSA6IGdldFR5cGUoc2NhbGUpO1xufVxuXG5mdW5jdGlvbiBnZXRTY2FsZUZyb21Eb21haW4ocHJvcHMsIGF4aXMpIHtcbiAgdmFyIGRvbWFpbjtcblxuICBpZiAocHJvcHMuZG9tYWluICYmIHByb3BzLmRvbWFpbltheGlzXSkge1xuICAgIGRvbWFpbiA9IHByb3BzLmRvbWFpbltheGlzXTtcbiAgfSBlbHNlIGlmIChwcm9wcy5kb21haW4gJiYgQXJyYXkuaXNBcnJheShwcm9wcy5kb21haW4pKSB7XG4gICAgZG9tYWluID0gcHJvcHMuZG9tYWluO1xuICB9XG5cbiAgaWYgKCFkb21haW4pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIENvbGxlY3Rpb24uY29udGFpbnNEYXRlcyhkb21haW4pID8gXCJ0aW1lXCIgOiBcImxpbmVhclwiO1xufVxuXG5mdW5jdGlvbiBnZXRTY2FsZVR5cGVGcm9tRGF0YShwcm9wcywgYXhpcykge1xuICBpZiAoIXByb3BzLmRhdGEpIHtcbiAgICByZXR1cm4gXCJsaW5lYXJcIjtcbiAgfVxuXG4gIHZhciBhY2Nlc3NvciA9IEhlbHBlcnMuY3JlYXRlQWNjZXNzb3IocHJvcHNbYXhpc10pO1xuICB2YXIgYXhpc0RhdGEgPSBwcm9wcy5kYXRhLm1hcChmdW5jdGlvbiAoZGF0dW0pIHtcbiAgICB2YXIgcHJvY2Vzc2VkRGF0YSA9IF9pc1BsYWluT2JqZWN0KGFjY2Vzc29yKGRhdHVtKSkgPyBhY2Nlc3NvcihkYXR1bSlbYXhpc10gOiBhY2Nlc3NvcihkYXR1bSk7XG4gICAgcmV0dXJuIHByb2Nlc3NlZERhdGEgIT09IHVuZGVmaW5lZCA/IHByb2Nlc3NlZERhdGEgOiBkYXR1bVtheGlzXTtcbiAgfSk7XG4gIHJldHVybiBDb2xsZWN0aW9uLmNvbnRhaW5zRGF0ZXMoYXhpc0RhdGEpID8gXCJ0aW1lXCIgOiBcImxpbmVhclwiO1xufSAvLyBFeHBvcnRlZCBGdW5jdGlvbnNcblxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NhbGVGcm9tTmFtZShuYW1lKSB7XG4gIHJldHVybiB2YWxpZFNjYWxlKG5hbWUpID8gZDNTY2FsZVt0b05ld05hbWUobmFtZSldKCkgOiBkM1NjYWxlLnNjYWxlTGluZWFyKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFzZVNjYWxlKHByb3BzLCBheGlzKSB7XG4gIHZhciBzY2FsZSA9IGdldFNjYWxlRnJvbVByb3BzKHByb3BzLCBheGlzKTtcblxuICBpZiAoc2NhbGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHNjYWxlID09PSBcInN0cmluZ1wiID8gZ2V0U2NhbGVGcm9tTmFtZShzY2FsZSkgOiBzY2FsZTtcbiAgfVxuXG4gIHZhciBkZWZhdWx0U2NhbGUgPSBnZXRTY2FsZUZyb21Eb21haW4ocHJvcHMsIGF4aXMpIHx8IGdldFNjYWxlVHlwZUZyb21EYXRhKHByb3BzLCBheGlzKTtcbiAgcmV0dXJuIGQzU2NhbGVbdG9OZXdOYW1lKGRlZmF1bHRTY2FsZSldKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFNjYWxlKCkge1xuICByZXR1cm4gZDNTY2FsZS5zY2FsZUxpbmVhcigpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlRnJvbVByb3BzKHByb3BzLCBheGlzKSB7XG4gIGlmICghaXNTY2FsZURlZmluZWQocHJvcHMsIGF4aXMpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBzY2FsZSA9IHByb3BzLnNjYWxlW2F4aXNdIHx8IHByb3BzLnNjYWxlO1xuXG4gIGlmICh2YWxpZFNjYWxlKHNjYWxlKSkge1xuICAgIHJldHVybiBfaXNGdW5jdGlvbihzY2FsZSkgPyBzY2FsZSA6IGQzU2NhbGVbdG9OZXdOYW1lKHNjYWxlKV0oKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NhbGVUeXBlKHByb3BzLCBheGlzKSB7XG4gIC8vIGlmIHRoZSBzY2FsZSB3YXMgbm90IGdpdmVuIGluIHByb3BzLCBpdCB3aWxsIGJlIHNldCB0byBsaW5lYXIgb3IgdGltZSBkZXBlbmRpbmcgb24gZGF0YVxuICByZXR1cm4gZ2V0U2NhbGVUeXBlRnJvbVByb3BzKHByb3BzLCBheGlzKSB8fCBnZXRTY2FsZVR5cGVGcm9tRGF0YShwcm9wcywgYXhpcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZShzY2FsZSkge1xuICBpZiAodHlwZW9mIHNjYWxlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgdmFyIGR1Y2tUeXBlcyA9IFt7XG4gICAgbmFtZTogXCJsb2dcIixcbiAgICBtZXRob2Q6IFwiYmFzZVwiXG4gIH0sIHtcbiAgICBuYW1lOiBcIm9yZGluYWxcIixcbiAgICBtZXRob2Q6IFwidW5rbm93blwiXG4gIH0sIHtcbiAgICBuYW1lOiBcInBvdy1zcXJ0XCIsXG4gICAgbWV0aG9kOiBcImV4cG9uZW50XCJcbiAgfSwge1xuICAgIG5hbWU6IFwicXVhbnRpbGVcIixcbiAgICBtZXRob2Q6IFwicXVhbnRpbGVzXCJcbiAgfSwge1xuICAgIG5hbWU6IFwicXVhbnRpemUtdGhyZXNob2xkXCIsXG4gICAgbWV0aG9kOiBcImludmVydEV4dGVudFwiXG4gIH1dO1xuICB2YXIgc2NhbGVUeXBlID0gZHVja1R5cGVzLmZpbHRlcihmdW5jdGlvbiAodHlwZSkge1xuICAgIHJldHVybiBzY2FsZVt0eXBlLm1ldGhvZF0gIT09IHVuZGVmaW5lZDtcbiAgfSlbMF07XG4gIHJldHVybiBzY2FsZVR5cGUgPyBzY2FsZVR5cGUubmFtZSA6IHVuZGVmaW5lZDtcbn0iLCIvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovXG5leHBvcnQgdmFyIElNTVVUQUJMRV9JVEVSQUJMRSA9IFwiQEBfX0lNTVVUQUJMRV9JVEVSQUJMRV9fQEBcIjtcbmV4cG9ydCB2YXIgSU1NVVRBQkxFX1JFQ09SRCA9IFwiQEBfX0lNTVVUQUJMRV9SRUNPUkRfX0BAXCI7XG5leHBvcnQgdmFyIElNTVVUQUJMRV9MSVNUID0gXCJAQF9fSU1NVVRBQkxFX0xJU1RfX0BAXCI7XG5leHBvcnQgdmFyIElNTVVUQUJMRV9NQVAgPSBcIkBAX19JTU1VVEFCTEVfTUFQX19AQFwiO1xuZXhwb3J0IGZ1bmN0aW9uIGlzSXRlcmFibGUoeCkge1xuICByZXR1cm4gISEoeCAmJiB4W0lNTVVUQUJMRV9JVEVSQUJMRV0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVjb3JkKHgpIHtcbiAgcmV0dXJuICEhKHggJiYgeFtJTU1VVEFCTEVfUkVDT1JEXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbW11dGFibGUoeCkge1xuICByZXR1cm4gaXNJdGVyYWJsZSh4KSB8fCBpc1JlY29yZCh4KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0xpc3QoeCkge1xuICByZXR1cm4gISEoeCAmJiB4W0lNTVVUQUJMRV9MSVNUXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNNYXAoeCkge1xuICByZXR1cm4gISEoeCAmJiB4W0lNTVVUQUJMRV9NQVBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93VG9KUyh4LCB3aGl0ZWxpc3QpIHtcbiAgcmV0dXJuIGlzSXRlcmFibGUoeCkgPyB4LnJlZHVjZShmdW5jdGlvbiAocHJldiwgY3Vyciwga2V5KSB7XG4gICAgaWYgKHdoaXRlbGlzdCAmJiB3aGl0ZWxpc3Rba2V5XSkge1xuICAgICAgY3VyciA9IHNoYWxsb3dUb0pTKGN1cnIpO1xuICAgIH1cblxuICAgIHByZXZba2V5XSA9IGN1cnI7XG4gICAgcmV0dXJuIHByZXY7XG4gIH0sIGlzTGlzdCh4KSA/IFtdIDoge30pIDogeDtcbn0iLCJpbXBvcnQgX29taXRCeSBmcm9tIFwibG9kYXNoL29taXRCeVwiO1xuaW1wb3J0IF9pc1VuZGVmaW5lZCBmcm9tIFwibG9kYXNoL2lzVW5kZWZpbmVkXCI7XG5pbXBvcnQgX2luY2x1ZGVzIGZyb20gXCJsb2Rhc2gvaW5jbHVkZXNcIjtcbmltcG9ydCBfaXNFcXVhbCBmcm9tIFwibG9kYXNoL2lzRXF1YWxcIjtcbmltcG9ydCBfaXNFbXB0eSBmcm9tIFwibG9kYXNoL2lzRW1wdHlcIjtcbmltcG9ydCBfb3JkZXJCeSBmcm9tIFwibG9kYXNoL29yZGVyQnlcIjtcbmltcG9ydCBfcHJvcGVydHkgZnJvbSBcImxvZGFzaC9wcm9wZXJ0eVwiO1xuaW1wb3J0IF9pc1BsYWluT2JqZWN0IGZyb20gXCJsb2Rhc2gvaXNQbGFpbk9iamVjdFwiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gvaXNGdW5jdGlvblwiO1xuaW1wb3J0IF9sYXN0IGZyb20gXCJsb2Rhc2gvbGFzdFwiO1xuaW1wb3J0IF9yYW5nZSBmcm9tIFwibG9kYXNoL3JhbmdlXCI7XG5pbXBvcnQgX3VuaXEgZnJvbSBcImxvZGFzaC91bmlxXCI7XG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gfVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgKiBhcyBIZWxwZXJzIGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCAqIGFzIENvbGxlY3Rpb24gZnJvbSBcIi4vY29sbGVjdGlvblwiO1xuaW1wb3J0ICogYXMgU2NhbGUgZnJvbSBcIi4vc2NhbGVcIjtcbmltcG9ydCAqIGFzIEltbXV0YWJsZSBmcm9tIFwiLi9pbW11dGFibGVcIjsgLy8gUHJpdmF0ZSBGdW5jdGlvbnNcblxuZnVuY3Rpb24gcGFyc2VEYXR1bShkYXR1bSkge1xuICB2YXIgaW1tdXRhYmxlRGF0dW1XaGl0ZWxpc3QgPSB7XG4gICAgZXJyb3JYOiB0cnVlLFxuICAgIGVycm9yWTogdHJ1ZVxuICB9O1xuICByZXR1cm4gSW1tdXRhYmxlLmlzSW1tdXRhYmxlKGRhdHVtKSA/IEltbXV0YWJsZS5zaGFsbG93VG9KUyhkYXR1bSwgaW1tdXRhYmxlRGF0dW1XaGl0ZWxpc3QpIDogZGF0dW07XG59XG5cbmZ1bmN0aW9uIGdldExlbmd0aChkYXRhKSB7XG4gIHJldHVybiBJbW11dGFibGUuaXNJdGVyYWJsZShkYXRhKSA/IGRhdGEuc2l6ZSA6IGRhdGEubGVuZ3RoO1xufSAvLyBSZXR1cm5zIGdlbmVyYXRlZCBkYXRhIGZvciBhIGdpdmVuIGF4aXMgYmFzZWQgb24gZG9tYWluIGFuZCBzYW1wbGUgZnJvbSBwcm9wc1xuXG5cbmZ1bmN0aW9uIGdlbmVyYXRlRGF0YUFycmF5KHByb3BzLCBheGlzKSB7XG4gIHZhciBwcm9wc0RvbWFpbiA9IF9pc1BsYWluT2JqZWN0KHByb3BzLmRvbWFpbikgPyBwcm9wcy5kb21haW5bYXhpc10gOiBwcm9wcy5kb21haW47XG4gIHZhciBkb21haW4gPSBwcm9wc0RvbWFpbiB8fCBTY2FsZS5nZXRCYXNlU2NhbGUocHJvcHMsIGF4aXMpLmRvbWFpbigpO1xuICB2YXIgc2FtcGxlcyA9IHByb3BzLnNhbXBsZXMgfHwgMTtcbiAgdmFyIGRvbWFpbk1heCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheShkb21haW4pKTtcbiAgdmFyIGRvbWFpbk1pbiA9IE1hdGgubWluLmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheShkb21haW4pKTtcbiAgdmFyIHN0ZXAgPSAoZG9tYWluTWF4IC0gZG9tYWluTWluKSAvIHNhbXBsZXM7XG5cbiAgdmFyIHZhbHVlcyA9IF9yYW5nZShkb21haW5NaW4sIGRvbWFpbk1heCwgc3RlcCk7XG5cbiAgcmV0dXJuIF9sYXN0KHZhbHVlcykgPT09IGRvbWFpbk1heCA/IHZhbHVlcyA6IHZhbHVlcy5jb25jYXQoZG9tYWluTWF4KTtcbn0gLy8gUmV0dXJucyBzb3J0ZWQgZGF0YS4gSWYgbm8gc29ydCBrZXlzIGFyZSBwcm92aWRlZCwgZGF0YSBpcyByZXR1cm5lZCB1bmFsdGVyZWQuXG5cblxuZnVuY3Rpb24gc29ydERhdGEoZGF0YXNldCwgc29ydEtleSkge1xuICB2YXIgc29ydE9yZGVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBcImFzY2VuZGluZ1wiO1xuXG4gIGlmICghc29ydEtleSkge1xuICAgIHJldHVybiBkYXRhc2V0O1xuICB9IC8vIEVuc3VyZXMgcHJldmlvdXMgVmljdG9yeUxpbmUgYXBpIGZvciBzb3J0S2V5IHByb3Agc3RheXMgY29uc2lzdGVudFxuXG5cbiAgaWYgKHNvcnRLZXkgPT09IFwieFwiIHx8IHNvcnRLZXkgPT09IFwieVwiKSB7XG4gICAgc29ydEtleSA9IFwiX1wiLmNvbmNhdChzb3J0S2V5KTtcbiAgfVxuXG4gIHZhciBvcmRlciA9IHNvcnRPcmRlciA9PT0gXCJhc2NlbmRpbmdcIiA/IFwiYXNjXCIgOiBcImRlc2NcIjtcbiAgcmV0dXJuIF9vcmRlckJ5KGRhdGFzZXQsIHNvcnRLZXksIG9yZGVyKTtcbn0gLy8gVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgZGF0YSBwb2ludHMgdGhhdCBicmVhayBjZXJ0YWluIHNjYWxlcy4gKGxvZyBzY2FsZSBvbmx5KVxuXG5cbmZ1bmN0aW9uIGNsZWFuRGF0YShkYXRhc2V0LCBwcm9wcykge1xuICB2YXIgc21hbGxOdW1iZXIgPSAxIC8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gIHZhciBzY2FsZVR5cGUgPSB7XG4gICAgeDogU2NhbGUuZ2V0U2NhbGVUeXBlKHByb3BzLCBcInhcIiksXG4gICAgeTogU2NhbGUuZ2V0U2NhbGVUeXBlKHByb3BzLCBcInlcIilcbiAgfTtcblxuICBpZiAoc2NhbGVUeXBlLnggIT09IFwibG9nXCIgJiYgc2NhbGVUeXBlLnkgIT09IFwibG9nXCIpIHtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfVxuXG4gIHZhciBydWxlcyA9IGZ1bmN0aW9uIChkYXR1bSwgYXhpcykge1xuICAgIHJldHVybiBzY2FsZVR5cGVbYXhpc10gPT09IFwibG9nXCIgPyBkYXR1bVtcIl9cIi5jb25jYXQoYXhpcyldICE9PSAwIDogdHJ1ZTtcbiAgfTtcblxuICB2YXIgc2FuaXRpemUgPSBmdW5jdGlvbiAoZGF0dW0pIHtcbiAgICB2YXIgX3ggPSBydWxlcyhkYXR1bSwgXCJ4XCIpID8gZGF0dW0uX3ggOiBzbWFsbE51bWJlcjtcblxuICAgIHZhciBfeSA9IHJ1bGVzKGRhdHVtLCBcInlcIikgPyBkYXR1bS5feSA6IHNtYWxsTnVtYmVyO1xuXG4gICAgdmFyIF95MCA9IHJ1bGVzKGRhdHVtLCBcInkwXCIpID8gZGF0dW0uX3kwIDogc21hbGxOdW1iZXI7XG5cbiAgICByZXR1cm4gX2Fzc2lnbih7fSwgZGF0dW0sIHtcbiAgICAgIF94OiBfeCxcbiAgICAgIF95OiBfeSxcbiAgICAgIF95MDogX3kwXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIGRhdGFzZXQubWFwKGZ1bmN0aW9uIChkYXR1bSkge1xuICAgIGlmIChydWxlcyhkYXR1bSwgXCJ4XCIpICYmIHJ1bGVzKGRhdHVtLCBcInlcIikgJiYgcnVsZXMoZGF0dW0sIFwieTBcIikpIHtcbiAgICAgIHJldHVybiBkYXR1bTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2FuaXRpemUoZGF0dW0pO1xuICB9KTtcbn0gLy8gUmV0dXJucyBhIGRhdGEgYWNjZXNzb3IgZ2l2ZW4gYW4gZXZlbnRLZXkgcHJvcFxuXG5cbmZ1bmN0aW9uIGdldEV2ZW50S2V5KGtleSkge1xuICAvLyBjcmVhdGVzIGEgZGF0YSBhY2Nlc3NvciBmdW5jdGlvblxuICAvLyBnaXZlbiBhIHByb3BlcnR5IGtleSwgcGF0aCwgYXJyYXkgaW5kZXgsIG9yIG51bGwgZm9yIGlkZW50aXR5LlxuICBpZiAoX2lzRnVuY3Rpb24oa2V5KSkge1xuICAgIHJldHVybiBrZXk7XG4gIH0gZWxzZSBpZiAoa2V5ID09PSBudWxsIHx8IGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgfSAvLyBvdGhlcndpc2UsIGFzc3VtZSBpdCBpcyBhbiBhcnJheSBpbmRleCwgcHJvcGVydHkga2V5IG9yIHBhdGggKF8ucHJvcGVydHkgaGFuZGxlcyBhbGwgdGhyZWUpXG5cblxuICByZXR1cm4gX3Byb3BlcnR5KGtleSk7XG59IC8vIFJldHVybnMgZGF0YSB3aXRoIGFuIGV2ZW50S2V5IHByb3AgYWRkZWQgdG8gZWFjaCBkYXR1bVxuXG5cbmZ1bmN0aW9uIGFkZEV2ZW50S2V5cyhwcm9wcywgZGF0YSkge1xuICB2YXIgaGFzRXZlbnRLZXlBY2Nlc3NvciA9ICEhcHJvcHMuZXZlbnRLZXk7XG4gIHZhciBldmVudEtleUFjY2Vzc29yID0gZ2V0RXZlbnRLZXkocHJvcHMuZXZlbnRLZXkpO1xuICByZXR1cm4gZGF0YS5tYXAoZnVuY3Rpb24gKGRhdHVtLCBpbmRleCkge1xuICAgIGlmIChkYXR1bS5ldmVudEtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZGF0dW07XG4gICAgfSBlbHNlIGlmIChoYXNFdmVudEtleUFjY2Vzc29yKSB7XG4gICAgICB2YXIgZXZlbnRLZXkgPSBldmVudEtleUFjY2Vzc29yKGRhdHVtLCBpbmRleCk7XG4gICAgICByZXR1cm4gZXZlbnRLZXkgIT09IHVuZGVmaW5lZCA/IF9hc3NpZ24oe1xuICAgICAgICBldmVudEtleTogZXZlbnRLZXlcbiAgICAgIH0sIGRhdHVtKSA6IGRhdHVtO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGF0dW07XG4gICAgfVxuICB9KTtcbn0gLy8gRXhwb3J0ZWQgRnVuY3Rpb25zXG4vLyBUaGlzIG1ldGhvZCB3aWxsIHJlbW92ZSBkYXRhIHBvaW50cyB0aGF0IGZhbGwgb3V0c2lkZSBvZiB0aGUgZGVzaXJlZCBkb21haW4gKG5vbi1jb250aW51b3VzIGNoYXJ0cyBvbmx5KVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRhRnJvbURvbWFpbihkYXRhc2V0LCBkb21haW4sIGRlZmF1bHRCYXNlbGluZSkge1xuICB2YXIgZXhpc3RzID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiB2YWwgIT09IHVuZGVmaW5lZDtcbiAgfTtcblxuICB2YXIgbWluRG9tYWluWCA9IENvbGxlY3Rpb24uZ2V0TWluVmFsdWUoZG9tYWluLngpO1xuICB2YXIgbWF4RG9tYWluWCA9IENvbGxlY3Rpb24uZ2V0TWF4VmFsdWUoZG9tYWluLngpO1xuICB2YXIgbWluRG9tYWluWSA9IENvbGxlY3Rpb24uZ2V0TWluVmFsdWUoZG9tYWluLnkpO1xuICB2YXIgbWF4RG9tYWluWSA9IENvbGxlY3Rpb24uZ2V0TWF4VmFsdWUoZG9tYWluLnkpO1xuXG4gIHZhciB1bmRlck1pbiA9IGZ1bmN0aW9uIChtaW4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcmV0dXJuIGV4aXN0cyh2YWwpICYmIHZhbCA8IG1pbjtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBvdmVyTWF4ID0gZnVuY3Rpb24gKG1heCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gZXhpc3RzKHZhbCkgJiYgdmFsID4gbWF4O1xuICAgIH07XG4gIH07XG5cbiAgdmFyIGlzVW5kZXJNaW5YID0gdW5kZXJNaW4obWluRG9tYWluWCk7XG4gIHZhciBpc1VuZGVyTWluWSA9IHVuZGVyTWluKG1pbkRvbWFpblkpO1xuICB2YXIgaXNPdmVyTWF4WCA9IG92ZXJNYXgobWF4RG9tYWluWCk7XG4gIHZhciBpc092ZXJNYXhZID0gb3Zlck1heChtYXhEb21haW5ZKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcblxuICByZXR1cm4gZGF0YXNldC5tYXAoZnVuY3Rpb24gKGRhdHVtKSB7XG4gICAgdmFyIF94ID0gZGF0dW0uX3gsXG4gICAgICAgIF95ID0gZGF0dW0uX3ksXG4gICAgICAgIF95MCA9IGRhdHVtLl95MCxcbiAgICAgICAgX3kxID0gZGF0dW0uX3kxOyAvLyBzaW5nbGUgeCBwb2ludCBsZXNzIHRoYW4gbWluIGRvbWFpblxuXG4gICAgaWYgKGlzVW5kZXJNaW5YKF94KSB8fCBpc092ZXJNYXhYKF94KSkgX3ggPSBudWxsO1xuICAgIHZhciBiYXNlbGluZSA9IGV4aXN0cyhfeTApID8gX3kwIDogZGVmYXVsdEJhc2VsaW5lO1xuICAgIHZhciB2YWx1ZSA9IGV4aXN0cyhfeTEpID8gX3kxIDogX3k7XG4gICAgaWYgKCFleGlzdHModmFsdWUpKSByZXR1cm4gZGF0dW07IC8vIHZhbHVlIG9ubHkgYW5kIGxlc3MgdGhhbiBtaW4gZG9tYWluIG9yIGdyZWF0ZXIgdGhhbiBtYXggZG9tYWluXG5cbiAgICBpZiAoIWV4aXN0cyhiYXNlbGluZSkgJiYgKGlzVW5kZXJNaW5ZKHZhbHVlKSB8fCBpc092ZXJNYXhZKHZhbHVlKSkpIF95ID0gbnVsbDsgLy8gYmFzZWxpbmUgYW5kIHZhbHVlIGFyZSBib3RoIGxlc3MgdGhhbiBtaW4gZG9tYWluIG9yIGJvdGggZ3JlYXRlciB0aGFuIG1heCBkb21haW5cblxuICAgIGlmIChpc1VuZGVyTWluWShiYXNlbGluZSkgJiYgaXNVbmRlck1pblkodmFsdWUpIHx8IGlzT3Zlck1heFkoYmFzZWxpbmUpICYmIGlzT3Zlck1heFkodmFsdWUpKSBfeSA9IF95MCA9IF95MSA9IG51bGw7IC8vIGJhc2VsaW5lIGFuZCB2YWx1ZSB3aXRoIG9ubHkgYmFzZWxpbmUgYmVsb3cgbWluLCBzZXQgYmFzZWxpbmUgdG8gbWluRG9tYWluWVxuXG4gICAgaWYgKGlzVW5kZXJNaW5ZKGJhc2VsaW5lKSAmJiAhaXNVbmRlck1pblkodmFsdWUpKSBfeTAgPSBtaW5Eb21haW5ZOyAvLyBiYXNlbGluZSBhbmQgdmFsdWUgd2l0aCBvbmx5IGJhc2VsaW5lIGFib3ZlIG1heCwgc2V0IGJhc2VsaW5lIHRvIG1heERvbWFpbllcblxuICAgIGlmIChpc092ZXJNYXhZKGJhc2VsaW5lKSAmJiAhaXNPdmVyTWF4WSh2YWx1ZSkpIF95MCA9IG1heERvbWFpblk7XG4gICAgcmV0dXJuIF9hc3NpZ24oe30sIGRhdHVtLCBfb21pdEJ5KHtcbiAgICAgIF94OiBfeCxcbiAgICAgIF95OiBfeSxcbiAgICAgIF95MDogX3kwLFxuICAgICAgX3kxOiBfeTFcbiAgICB9LCBfaXNVbmRlZmluZWQpKTtcbiAgfSk7XG59XG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IG1hcHBpbmcgc3RyaW5nIGRhdGEgdG8gbnVtZXJpYyBkYXRhXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHM6IHRoZSBwcm9wcyBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBheGlzOiB0aGUgY3VycmVudCBheGlzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBhbiBvYmplY3QgbWFwcGluZyBzdHJpbmcgZGF0YSB0byBudW1lcmljIGRhdGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RyaW5nTWFwKHByb3BzLCBheGlzKSB7XG4gIHZhciBzdHJpbmdzRnJvbUF4ZXMgPSBnZXRTdHJpbmdzRnJvbUF4ZXMocHJvcHMsIGF4aXMpO1xuICB2YXIgc3RyaW5nc0Zyb21DYXRlZ29yaWVzID0gZ2V0U3RyaW5nc0Zyb21DYXRlZ29yaWVzKHByb3BzLCBheGlzKTtcbiAgdmFyIHN0cmluZ3NGcm9tRGF0YSA9IGdldFN0cmluZ3NGcm9tRGF0YShwcm9wcywgYXhpcyk7XG5cbiAgdmFyIGFsbFN0cmluZ3MgPSBfdW5pcShfdG9Db25zdW1hYmxlQXJyYXkoc3RyaW5nc0Zyb21BeGVzKS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHN0cmluZ3NGcm9tQ2F0ZWdvcmllcyksIF90b0NvbnN1bWFibGVBcnJheShzdHJpbmdzRnJvbURhdGEpKSk7XG5cbiAgcmV0dXJuIGFsbFN0cmluZ3MubGVuZ3RoID09PSAwID8gbnVsbCA6IGFsbFN0cmluZ3MucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBzdHJpbmcsIGluZGV4KSB7XG4gICAgbWVtb1tzdHJpbmddID0gaW5kZXggKyAxO1xuICAgIHJldHVybiBtZW1vO1xuICB9LCB7fSk7XG59XG4vKipcbiAqIFJlZHVjZXMgdGhlIHNpemUgb2YgYSBkYXRhIGFycmF5LCBzdWNoIHRoYXQgaXQgaXMgPD0gbWF4UG9pbnRzLlxuICogQHBhcmFtIHtBcnJheX0gZGF0YTogYW4gYXJyYXkgb2YgZGF0YTsgbXVzdCBiZSBzb3J0ZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhQb2ludHM6IG1heGltdW0gbnVtYmVyIG9mIGRhdGEgcG9pbnRzIHRvIHJldHVyblxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0aW5nSW5kZXg6IHRoZSBpbmRleCBvZiB0aGUgZGF0YVswXSAqaW4gdGhlIGVudGlyZSBkYXRhc2V0KjsgdGhpcyBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgIGFzc3VtZXMgYGRhdGFgIHBhcmFtIGlzIGEgc3Vic2V0IG9mIGxhcmdlciBkYXRhc2V0IHRoYXQgaGFzIGJlZW4gem9vbW1lZFxuICAqIEByZXR1cm5zIHtBcnJheX0gYW4gYXJyYXkgb2YgZGF0YSwgYSBzdWJzZXQgb2YgZGF0YSBwYXJhbVxuICAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZG93bnNhbXBsZShkYXRhLCBtYXhQb2ludHMpIHtcbiAgdmFyIHN0YXJ0aW5nSW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7XG4gIC8vIGVuc3VyZXMgdGhhdCB0aGUgZG93bmFtcGxpbmcgb2YgZGF0YSB3aGlsZSB6b29taW5nIGxvb2tzIGdvb2QuXG4gIHZhciBkYXRhTGVuZ3RoID0gZ2V0TGVuZ3RoKGRhdGEpO1xuXG4gIGlmIChkYXRhTGVuZ3RoID4gbWF4UG9pbnRzKSB7XG4gICAgLy8gbGltaXQgayB0byBwb3dlcnMgb2YgMiwgZS5nLiA2NCwgMTI4LCAyNTZcbiAgICAvLyBzbyB0aGF0IHRoZSBzYW1lIHBvaW50cyB3aWxsIGJlIGNob3NlbiByZWxpYWJseSwgcmVkdWNpbmcgZmxpY2tlciBvbiB6b29tXG4gICAgdmFyIGsgPSBNYXRoLnBvdygyLCBNYXRoLmNlaWwoTWF0aC5sb2cyKGRhdGFMZW5ndGggLyBtYXhQb2ludHMpKSk7XG4gICAgcmV0dXJuIGRhdGEuZmlsdGVyKCAvLyBlbnN1cmUgbW9kdWxvIGlzIGFsd2F5cyBjYWxjdWxhdGVkIGZyb20gc2FtZSByZWZlcmVuY2U6IGkgKyBzdGFydGluZ0luZGV4XG4gICAgZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgIHJldHVybiAoaSArIHN0YXJ0aW5nSW5kZXgpICUgayA9PT0gMDtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuLyoqXG4gKiBSZXR1cm5zIGZvcm1hdHRlZCBkYXRhLiBEYXRhIGFjY2Vzc29ycyBhcmUgYXBwbGllZCwgYW5kIHN0cmluZyB2YWx1ZXMgYXJlIHJlcGxhY2VkLlxuICogQHBhcmFtIHtBcnJheX0gZGF0YXNldDogdGhlIG9yaWdpbmFsIGRvbWFpblxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzOiB0aGUgcHJvcHMgb2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5fSBleHBlY3RlZEtleXM6IGFuIGFycmF5IG9mIGV4cGVjdGVkIGRhdGEga2V5c1xuICogQHJldHVybnMge0FycmF5fSB0aGUgZm9ybWF0dGVkIGRhdGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGF0YShkYXRhc2V0LCBwcm9wcywgZXhwZWN0ZWRLZXlzKSB7XG4gIHZhciBpc0FycmF5T3JJdGVyYWJsZSA9IEFycmF5LmlzQXJyYXkoZGF0YXNldCkgfHwgSW1tdXRhYmxlLmlzSXRlcmFibGUoZGF0YXNldCk7XG5cbiAgaWYgKCFpc0FycmF5T3JJdGVyYWJsZSB8fCBnZXRMZW5ndGgoZGF0YXNldCkgPCAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIGRlZmF1bHRLZXlzID0gW1wieFwiLCBcInlcIiwgXCJ5MFwiXTtcbiAgZXhwZWN0ZWRLZXlzID0gQXJyYXkuaXNBcnJheShleHBlY3RlZEtleXMpID8gZXhwZWN0ZWRLZXlzIDogZGVmYXVsdEtleXM7XG5cbiAgdmFyIGNyZWF0ZUFjY2Vzc29yID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gSGVscGVycy5jcmVhdGVBY2Nlc3Nvcihwcm9wc1tuYW1lXSAhPT0gdW5kZWZpbmVkID8gcHJvcHNbbmFtZV0gOiBuYW1lKTtcbiAgfTtcblxuICB2YXIgYWNjZXNzb3IgPSBleHBlY3RlZEtleXMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCB0eXBlKSB7XG4gICAgbWVtb1t0eXBlXSA9IGNyZWF0ZUFjY2Vzc29yKHR5cGUpO1xuICAgIHJldHVybiBtZW1vO1xuICB9LCB7fSk7XG4gIHZhciBwcmVmb3JtYXR0ZWREYXRhID0gX2lzRXF1YWwoZXhwZWN0ZWRLZXlzLCBkZWZhdWx0S2V5cykgJiYgcHJvcHMueCA9PT0gXCJfeFwiICYmIHByb3BzLnkgPT09IFwiX3lcIiAmJiBwcm9wcy55MCA9PT0gXCJfeTBcIjtcbiAgdmFyIHN0cmluZ01hcDtcblxuICBpZiAocHJlZm9ybWF0dGVkRGF0YSA9PT0gZmFsc2UpIHtcbiAgICAvLyBzdHJpbmdNYXAgaXMgbm90IHJlcXVpcmVkIGlmIHRoZSBkYXRhIGlzIHByZWZvcm1hdHRlZFxuICAgIHN0cmluZ01hcCA9IHtcbiAgICAgIHg6IGV4cGVjdGVkS2V5cy5pbmRleE9mKFwieFwiKSAhPT0gLTEgPyBjcmVhdGVTdHJpbmdNYXAocHJvcHMsIFwieFwiKSA6IHVuZGVmaW5lZCxcbiAgICAgIHk6IGV4cGVjdGVkS2V5cy5pbmRleE9mKFwieVwiKSAhPT0gLTEgPyBjcmVhdGVTdHJpbmdNYXAocHJvcHMsIFwieVwiKSA6IHVuZGVmaW5lZCxcbiAgICAgIHkwOiBleHBlY3RlZEtleXMuaW5kZXhPZihcInkwXCIpICE9PSAtMSA/IGNyZWF0ZVN0cmluZ01hcChwcm9wcywgXCJ5XCIpIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIHZhciBkYXRhID0gcHJlZm9ybWF0dGVkRGF0YSA/IGRhdGFzZXQgOiBkYXRhc2V0LnJlZHVjZShmdW5jdGlvbiAoZGF0YUFyciwgZGF0dW0sIGluZGV4KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb21wbGV4aXR5XG4gICAgZGF0dW0gPSBwYXJzZURhdHVtKGRhdHVtKTtcbiAgICB2YXIgZmFsbGJhY2tWYWx1ZXMgPSB7XG4gICAgICB4OiBpbmRleCxcbiAgICAgIHk6IGRhdHVtXG4gICAgfTtcbiAgICB2YXIgcHJvY2Vzc2VkVmFsdWVzID0gZXhwZWN0ZWRLZXlzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgdHlwZSkge1xuICAgICAgdmFyIHByb2Nlc3NlZFZhbHVlID0gYWNjZXNzb3JbdHlwZV0oZGF0dW0pO1xuICAgICAgdmFyIHZhbHVlID0gcHJvY2Vzc2VkVmFsdWUgIT09IHVuZGVmaW5lZCA/IHByb2Nlc3NlZFZhbHVlIDogZmFsbGJhY2tWYWx1ZXNbdHlwZV07XG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgc3RyaW5nTWFwW3R5cGVdKSB7XG4gICAgICAgICAgbWVtb1tcIlwiLmNvbmNhdCh0eXBlLCBcIk5hbWVcIildID0gdmFsdWU7XG4gICAgICAgICAgbWVtb1tcIl9cIi5jb25jYXQodHlwZSldID0gc3RyaW5nTWFwW3R5cGVdW3ZhbHVlXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZW1vW1wiX1wiLmNvbmNhdCh0eXBlKV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVtbztcbiAgICB9LCB7fSk7XG5cbiAgICB2YXIgZm9ybWF0dGVkRGF0dW0gPSBfYXNzaWduKHt9LCBwcm9jZXNzZWRWYWx1ZXMsIGRhdHVtKTtcblxuICAgIGlmICghX2lzRW1wdHkoZm9ybWF0dGVkRGF0dW0pKSB7XG4gICAgICBkYXRhQXJyLnB1c2goZm9ybWF0dGVkRGF0dW0pO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhQXJyO1xuICB9LCBbXSk7XG4gIHZhciBzb3J0ZWREYXRhID0gc29ydERhdGEoZGF0YSwgcHJvcHMuc29ydEtleSwgcHJvcHMuc29ydE9yZGVyKTtcbiAgdmFyIGNsZWFuZWREYXRhID0gY2xlYW5EYXRhKHNvcnRlZERhdGEsIHByb3BzKTtcbiAgcmV0dXJuIGFkZEV2ZW50S2V5cyhwcm9wcywgY2xlYW5lZERhdGEpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGdlbmVyYXRlZCB4IGFuZCB5IGRhdGEgYmFzZWQgb24gZG9tYWluIGFuZCBzYW1wbGUgZnJvbSBwcm9wc1xuICogQHBhcmFtIHtPYmplY3R9IHByb3BzOiB0aGUgcHJvcHMgb2JqZWN0XG4gKiBAcmV0dXJucyB7QXJyYXl9IGFuIGFycmF5IG9mIGRhdGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVEYXRhKHByb3BzKSB7XG4gIHZhciB4VmFsdWVzID0gZ2VuZXJhdGVEYXRhQXJyYXkocHJvcHMsIFwieFwiKTtcbiAgdmFyIHlWYWx1ZXMgPSBnZW5lcmF0ZURhdGFBcnJheShwcm9wcywgXCJ5XCIpO1xuICB2YXIgdmFsdWVzID0geFZhbHVlcy5tYXAoZnVuY3Rpb24gKHgsIGkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogeCxcbiAgICAgIHk6IHlWYWx1ZXNbaV1cbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIHZhbHVlcztcbn1cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBjYXRlZ29yaWVzIGZvciBhIGdpdmVuIGF4aXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wczogdGhlIHByb3BzIG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IGF4aXM6IHRoZSBjdXJyZW50IGF4aXNcbiAqIEByZXR1cm5zIHtBcnJheX0gYW4gYXJyYXkgb2YgY2F0ZWdvcmllc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYXRlZ29yaWVzKHByb3BzLCBheGlzKSB7XG4gIHJldHVybiBwcm9wcy5jYXRlZ29yaWVzICYmICFBcnJheS5pc0FycmF5KHByb3BzLmNhdGVnb3JpZXMpID8gcHJvcHMuY2F0ZWdvcmllc1theGlzXSA6IHByb3BzLmNhdGVnb3JpZXM7XG59XG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgZm9ybWF0dGVkIGRhdGFcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wczogdGhlIHByb3BzIG9iamVjdFxuICogQHJldHVybnMge0FycmF5fSBhbiBhcnJheSBvZiBkYXRhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGEocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmRhdGEgPyBmb3JtYXREYXRhKHByb3BzLmRhdGEsIHByb3BzKSA6IGZvcm1hdERhdGEoZ2VuZXJhdGVEYXRhKHByb3BzKSwgcHJvcHMpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3MgZnJvbSBheGlzIHRpY2tWYWx1ZXMgZm9yIGEgZ2l2ZW4gYXhpc1xuICogQHBhcmFtIHtPYmplY3R9IHByb3BzOiB0aGUgcHJvcHMgb2JqZWN0XG4gKiBAcGFyYW0ge1N0cmluZ30gYXhpczogdGhlIGN1cnJlbnQgYXhpc1xuICogQHJldHVybnMge0FycmF5fSBhbiBhcnJheSBvZiBzdHJpbmdzXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmluZ3NGcm9tQXhlcyhwcm9wcywgYXhpcykge1xuICB2YXIgdGlja1ZhbHVlcyA9IHByb3BzLnRpY2tWYWx1ZXMsXG4gICAgICB0aWNrRm9ybWF0ID0gcHJvcHMudGlja0Zvcm1hdDtcbiAgdmFyIHRpY2tWYWx1ZUFycmF5O1xuXG4gIGlmICghdGlja1ZhbHVlcyB8fCAhQXJyYXkuaXNBcnJheSh0aWNrVmFsdWVzKSAmJiAhdGlja1ZhbHVlc1theGlzXSkge1xuICAgIHRpY2tWYWx1ZUFycmF5ID0gdGlja0Zvcm1hdCAmJiBBcnJheS5pc0FycmF5KHRpY2tGb3JtYXQpID8gdGlja0Zvcm1hdCA6IFtdO1xuICB9IGVsc2Uge1xuICAgIHRpY2tWYWx1ZUFycmF5ID0gdGlja1ZhbHVlc1theGlzXSB8fCB0aWNrVmFsdWVzO1xuICB9XG5cbiAgcmV0dXJuIHRpY2tWYWx1ZUFycmF5LmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCI7XG4gIH0pO1xufVxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3MgZnJvbSBjYXRlZ29yaWVzIGZvciBhIGdpdmVuIGF4aXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wczogdGhlIHByb3BzIG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IGF4aXM6IHRoZSBjdXJyZW50IGF4aXNcbiAqIEByZXR1cm5zIHtBcnJheX0gYW4gYXJyYXkgb2Ygc3RyaW5nc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJpbmdzRnJvbUNhdGVnb3JpZXMocHJvcHMsIGF4aXMpIHtcbiAgaWYgKCFwcm9wcy5jYXRlZ29yaWVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIGNhdGVnb3JpZXMgPSBnZXRDYXRlZ29yaWVzKHByb3BzLCBheGlzKTtcbiAgdmFyIGNhdGVnb3J5U3RyaW5ncyA9IGNhdGVnb3JpZXMgJiYgY2F0ZWdvcmllcy5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiO1xuICB9KTtcbiAgcmV0dXJuIGNhdGVnb3J5U3RyaW5ncyA/IENvbGxlY3Rpb24ucmVtb3ZlVW5kZWZpbmVkKGNhdGVnb3J5U3RyaW5ncykgOiBbXTtcbn1cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIGZyb20gZGF0YVxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzOiB0aGUgcHJvcHMgb2JqZWN0XG4gKiBAcGFyYW0ge1N0cmluZ30gYXhpczogdGhlIGN1cnJlbnQgYXhpc1xuICogQHJldHVybnMge0FycmF5fSBhbiBhcnJheSBvZiBzdHJpbmdzXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmluZ3NGcm9tRGF0YShwcm9wcywgYXhpcykge1xuICB2YXIgaXNBcnJheU9ySXRlcmFibGUgPSBBcnJheS5pc0FycmF5KHByb3BzLmRhdGEpIHx8IEltbXV0YWJsZS5pc0l0ZXJhYmxlKHByb3BzLmRhdGEpO1xuXG4gIGlmICghaXNBcnJheU9ySXRlcmFibGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIga2V5ID0gcHJvcHNbYXhpc10gPT09IHVuZGVmaW5lZCA/IGF4aXMgOiBwcm9wc1theGlzXTtcbiAgdmFyIGFjY2Vzc29yID0gSGVscGVycy5jcmVhdGVBY2Nlc3NvcihrZXkpOyAvLyBzdXBwb3J0IGltbXV0YWJsZSBkYXRhXG5cbiAgdmFyIGRhdGEgPSBwcm9wcy5kYXRhLnJlZHVjZShmdW5jdGlvbiAobWVtbywgZCkge1xuICAgIG1lbW8ucHVzaChwYXJzZURhdHVtKGQpKTtcbiAgICByZXR1cm4gbWVtbztcbiAgfSwgW10pO1xuICB2YXIgc29ydGVkRGF0YSA9IHNvcnREYXRhKGRhdGEsIHByb3BzLnNvcnRLZXksIHByb3BzLnNvcnRPcmRlcik7XG4gIHZhciBkYXRhU3RyaW5ncyA9IHNvcnRlZERhdGEucmVkdWNlKGZ1bmN0aW9uIChkYXRhQXJyLCBkYXR1bSkge1xuICAgIGRhdHVtID0gcGFyc2VEYXR1bShkYXR1bSk7XG4gICAgZGF0YUFyci5wdXNoKGFjY2Vzc29yKGRhdHVtKSk7XG4gICAgcmV0dXJuIGRhdGFBcnI7XG4gIH0sIFtdKS5maWx0ZXIoZnVuY3Rpb24gKGRhdHVtKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXR1bSA9PT0gXCJzdHJpbmdcIjtcbiAgfSk7IC8vIHJldHVybiBhIHVuaXF1ZSBzZXQgb2Ygc3RyaW5nc1xuXG4gIHJldHVybiBkYXRhU3RyaW5ncy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnIpIHtcbiAgICBpZiAoY3VyciAhPT0gdW5kZWZpbmVkICYmIGN1cnIgIT09IG51bGwgJiYgcHJldi5pbmRleE9mKGN1cnIpID09PSAtMSkge1xuICAgICAgcHJldi5wdXNoKGN1cnIpO1xuICAgIH1cblxuICAgIHJldHVybiBwcmV2O1xuICB9LCBbXSk7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gY29tcG9uZW50IGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSBkYXRhXG4gKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50OiBhIFJlYWN0IGNvbXBvbmVudCBpbnN0YW5jZVxuICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGhhcyBhIHJvbGUgaW5jbHVkZWQgaW4gdGhlIHdoaXRlbGlzdFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFDb21wb25lbnQoY29tcG9uZW50KSB7XG4gIHZhciBnZXRSb2xlID0gZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGNoaWxkICYmIGNoaWxkLnR5cGUgPyBjaGlsZC50eXBlLnJvbGUgOiBcIlwiO1xuICB9O1xuXG4gIHZhciByb2xlID0gZ2V0Um9sZShjb21wb25lbnQpO1xuXG4gIGlmIChyb2xlID09PSBcInBvcnRhbFwiKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjb21wb25lbnQucHJvcHMuY2hpbGRyZW4pO1xuICAgIHJvbGUgPSBjaGlsZHJlbi5sZW5ndGggPyBnZXRSb2xlKGNoaWxkcmVuWzBdKSA6IFwiXCI7XG4gIH1cblxuICB2YXIgd2hpdGVsaXN0ID0gW1wiYXJlYVwiLCBcImJhclwiLCBcImJveHBsb3RcIiwgXCJjYW5kbGVzdGlja1wiLCBcImVycm9yYmFyXCIsIFwiZ3JvdXBcIiwgXCJoaXN0b2dyYW1cIiwgXCJsaW5lXCIsIFwicGllXCIsIFwic2NhdHRlclwiLCBcInN0YWNrXCIsIFwidm9yb25vaVwiXTtcbiAgcmV0dXJuIF9pbmNsdWRlcyh3aGl0ZWxpc3QsIHJvbGUpO1xufSIsImltcG9ydCBfaXNEYXRlIGZyb20gXCJsb2Rhc2gvaXNEYXRlXCI7XG5pbXBvcnQgX2luY2x1ZGVzIGZyb20gXCJsb2Rhc2gvaW5jbHVkZXNcIjtcbmltcG9ydCBfaXNGdW5jdGlvbiBmcm9tIFwibG9kYXNoL2lzRnVuY3Rpb25cIjtcbmltcG9ydCBfc29ydGVkVW5pcSBmcm9tIFwibG9kYXNoL3NvcnRlZFVuaXFcIjtcbmltcG9ydCBfaXNQbGFpbk9iamVjdCBmcm9tIFwibG9kYXNoL2lzUGxhaW5PYmplY3RcIjtcbmltcG9ydCBfZmxhdHRlbiBmcm9tIFwibG9kYXNoL2ZsYXR0ZW5cIjtcblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IH1cblxuLyogZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0ICogYXMgRGF0YSBmcm9tIFwiLi9kYXRhXCI7XG5pbXBvcnQgKiBhcyBTY2FsZSBmcm9tIFwiLi9zY2FsZVwiO1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgKiBhcyBDb2xsZWN0aW9uIGZyb20gXCIuL2NvbGxlY3Rpb25cIjsgLy8gUHJpdmF0ZSBNZXRob2RzXG5cbmZ1bmN0aW9uIGNsZWFuRG9tYWluKGRvbWFpbiwgcHJvcHMsIGF4aXMpIHtcbiAgdmFyIHNjYWxlVHlwZSA9IFNjYWxlLmdldFNjYWxlVHlwZShwcm9wcywgYXhpcyk7XG5cbiAgaWYgKHNjYWxlVHlwZSAhPT0gXCJsb2dcIikge1xuICAgIHJldHVybiBkb21haW47XG4gIH1cblxuICB2YXIgcnVsZXMgPSBmdW5jdGlvbiAoZG9tKSB7XG4gICAgdmFyIGFsbW9zdFplcm8gPSBkb21bMF0gPCAwIHx8IGRvbVsxXSA8IDAgPyAtMSAvIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogMSAvIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgIHZhciBkb21haW5PbmUgPSBkb21bMF0gPT09IDAgPyBhbG1vc3RaZXJvIDogZG9tWzBdO1xuICAgIHZhciBkb21haW5Ud28gPSBkb21bMV0gPT09IDAgPyBhbG1vc3RaZXJvIDogZG9tWzFdO1xuICAgIHJldHVybiBbZG9tYWluT25lLCBkb21haW5Ud29dO1xuICB9O1xuXG4gIHJldHVybiBydWxlcyhkb21haW4pO1xufVxuXG5mdW5jdGlvbiBnZXREb21haW5QYWRkaW5nKHByb3BzLCBheGlzKSB7XG4gIHZhciBmb3JtYXRQYWRkaW5nID0gZnVuY3Rpb24gKHBhZGRpbmcpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYWRkaW5nKSA/IHtcbiAgICAgIGxlZnQ6IHBhZGRpbmdbMF0sXG4gICAgICByaWdodDogcGFkZGluZ1sxXVxuICAgIH0gOiB7XG4gICAgICBsZWZ0OiBwYWRkaW5nLFxuICAgICAgcmlnaHQ6IHBhZGRpbmdcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBfaXNQbGFpbk9iamVjdChwcm9wcy5kb21haW5QYWRkaW5nKSA/IGZvcm1hdFBhZGRpbmcocHJvcHMuZG9tYWluUGFkZGluZ1theGlzXSkgOiBmb3JtYXRQYWRkaW5nKHByb3BzLmRvbWFpblBhZGRpbmcpO1xufVxuXG5mdW5jdGlvbiBnZXRGbGF0RGF0YShkYXRhc2V0LCBheGlzKSB7XG4gIHJldHVybiBfZmxhdHRlbihkYXRhc2V0KS5tYXAoZnVuY3Rpb24gKGRhdHVtKSB7XG4gICAgcmV0dXJuIGRhdHVtW1wiX1wiLmNvbmNhdChheGlzKV0gJiYgZGF0dW1bXCJfXCIuY29uY2F0KGF4aXMpXVsxXSAhPT0gdW5kZWZpbmVkID8gZGF0dW1bXCJfXCIuY29uY2F0KGF4aXMpXVsxXSA6IGRhdHVtW1wiX1wiLmNvbmNhdChheGlzKV07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRFeHRyZW1lRnJvbURhdGEoZGF0YXNldCwgYXhpcykge1xuICB2YXIgdHlwZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogXCJtaW5cIjtcblxuICB2YXIgZ2V0RXh0cmVtZSA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgICByZXR1cm4gdHlwZSA9PT0gXCJtYXhcIiA/IE1hdGgubWF4LmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheShhcnIpKSA6IE1hdGgubWluLmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheShhcnIpKTtcbiAgfTtcblxuICB2YXIgaW5pdGlhbFZhbHVlID0gdHlwZSA9PT0gXCJtYXhcIiA/IC1JbmZpbml0eSA6IEluZmluaXR5O1xuICB2YXIgY29udGFpbnNEYXRlID0gZmFsc2U7XG5cbiAgdmFyIHJlc3VsdCA9IF9mbGF0dGVuKGRhdGFzZXQpLnJlZHVjZShmdW5jdGlvbiAobWVtbywgZGF0dW0pIHtcbiAgICB2YXIgY3VycmVudDAgPSBkYXR1bVtcIl9cIi5jb25jYXQoYXhpcywgXCIwXCIpXSAhPT0gdW5kZWZpbmVkID8gZGF0dW1bXCJfXCIuY29uY2F0KGF4aXMsIFwiMFwiKV0gOiBkYXR1bVtcIl9cIi5jb25jYXQoYXhpcyldO1xuICAgIHZhciBjdXJyZW50MSA9IGRhdHVtW1wiX1wiLmNvbmNhdChheGlzLCBcIjFcIildICE9PSB1bmRlZmluZWQgPyBkYXR1bVtcIl9cIi5jb25jYXQoYXhpcywgXCIxXCIpXSA6IGRhdHVtW1wiX1wiLmNvbmNhdChheGlzKV07XG4gICAgdmFyIGN1cnJlbnQgPSBnZXRFeHRyZW1lKFtjdXJyZW50MCwgY3VycmVudDFdKTtcbiAgICBjb250YWluc0RhdGUgPSBjb250YWluc0RhdGUgfHwgY3VycmVudDAgaW5zdGFuY2VvZiBEYXRlIHx8IGN1cnJlbnQxIGluc3RhbmNlb2YgRGF0ZTtcbiAgICByZXR1cm4gZ2V0RXh0cmVtZShbbWVtbywgY3VycmVudF0pO1xuICB9LCBpbml0aWFsVmFsdWUpO1xuXG4gIHJldHVybiBjb250YWluc0RhdGUgPyBuZXcgRGF0ZShyZXN1bHQpIDogcmVzdWx0O1xufSAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xuXG5cbmZ1bmN0aW9uIHBhZERvbWFpbihkb21haW4sIHByb3BzLCBheGlzKSB7XG4gIGlmICghcHJvcHMuZG9tYWluUGFkZGluZykge1xuICAgIHJldHVybiBkb21haW47XG4gIH1cblxuICB2YXIgbWluRG9tYWluID0gZ2V0TWluRnJvbVByb3BzKHByb3BzLCBheGlzKTtcbiAgdmFyIG1heERvbWFpbiA9IGdldE1heEZyb21Qcm9wcyhwcm9wcywgYXhpcyk7XG4gIHZhciBwYWRkaW5nID0gZ2V0RG9tYWluUGFkZGluZyhwcm9wcywgYXhpcyk7XG5cbiAgaWYgKCFwYWRkaW5nLmxlZnQgJiYgIXBhZGRpbmcucmlnaHQpIHtcbiAgICByZXR1cm4gZG9tYWluO1xuICB9XG5cbiAgdmFyIG1pbiA9IENvbGxlY3Rpb24uZ2V0TWluVmFsdWUoZG9tYWluKTtcbiAgdmFyIG1heCA9IENvbGxlY3Rpb24uZ2V0TWF4VmFsdWUoZG9tYWluKTtcbiAgdmFyIGN1cnJlbnRBeGlzID0gSGVscGVycy5nZXRDdXJyZW50QXhpcyhheGlzLCBwcm9wcy5ob3Jpem9udGFsKTtcbiAgdmFyIHJhbmdlID0gSGVscGVycy5nZXRSYW5nZShwcm9wcywgY3VycmVudEF4aXMpO1xuICB2YXIgcmFuZ2VFeHRlbnQgPSBNYXRoLmFicyhyYW5nZVswXSAtIHJhbmdlWzFdKTtcbiAgdmFyIHBhZGRlZFJhbmdlRXh0ZW50ID0gTWF0aC5tYXgocmFuZ2VFeHRlbnQgLSBwYWRkaW5nLmxlZnQgLSBwYWRkaW5nLnJpZ2h0LCAxKTtcbiAgdmFyIHBhZGRlZERvbWFpbkV4dGVudCA9IE1hdGguYWJzKG1heC52YWx1ZU9mKCkgLSBtaW4udmFsdWVPZigpKSAvIHBhZGRlZFJhbmdlRXh0ZW50ICogcmFuZ2VFeHRlbnQ7XG4gIHZhciBzaW1wbGVQYWRkaW5nID0ge1xuICAgIGxlZnQ6IHBhZGRlZERvbWFpbkV4dGVudCAqIHBhZGRpbmcubGVmdCAvIHJhbmdlRXh0ZW50LFxuICAgIHJpZ2h0OiBwYWRkZWREb21haW5FeHRlbnQgKiBwYWRkaW5nLnJpZ2h0IC8gcmFuZ2VFeHRlbnRcbiAgfTtcbiAgdmFyIHBhZGRlZERvbWFpbiA9IHtcbiAgICBtaW46IG1pbi52YWx1ZU9mKCkgLSBzaW1wbGVQYWRkaW5nLmxlZnQsXG4gICAgbWF4OiBtYXgudmFsdWVPZigpICsgc2ltcGxlUGFkZGluZy5yaWdodFxuICB9O1xuICB2YXIgc2luZ2xlUXVhZHJhbnREb21haW5QYWRkaW5nID0gX2lzUGxhaW5PYmplY3QocHJvcHMuc2luZ2xlUXVhZHJhbnREb21haW5QYWRkaW5nKSA/IHByb3BzLnNpbmdsZVF1YWRyYW50RG9tYWluUGFkZGluZ1theGlzXSA6IHByb3BzLnNpbmdsZVF1YWRyYW50RG9tYWluUGFkZGluZztcbiAgdmFyIGFkZHNRdWFkcmFudHMgPSBtaW4gPj0gMCAmJiBwYWRkZWREb21haW4ubWluIDw9IDAgfHwgbWF4IDw9IDAgJiYgcGFkZGVkRG9tYWluLm1heCA+PSAwO1xuXG4gIHZhciBhZGp1c3QgPSBmdW5jdGlvbiAodmFsLCB0eXBlKSB7XG4gICAgdmFyIGNvZXJjZSA9IHR5cGUgPT09IFwibWluXCIgJiYgbWluID49IDAgJiYgdmFsIDw9IDAgfHwgdHlwZSA9PT0gXCJtYXhcIiAmJiBtYXggPD0gMCAmJiB2YWwgPj0gMDtcbiAgICByZXR1cm4gY29lcmNlID8gMCA6IHZhbDtcbiAgfTtcblxuICBpZiAoYWRkc1F1YWRyYW50cyAmJiBzaW5nbGVRdWFkcmFudERvbWFpblBhZGRpbmcgIT09IGZhbHNlKSB7XG4gICAgLy8gTmFpdmUgaW5pdGlhbCBwYWRkaW5nIGNhbGN1bGF0aW9uXG4gICAgdmFyIGluaXRpYWxQYWRkaW5nID0ge1xuICAgICAgbGVmdDogTWF0aC5hYnMobWF4IC0gbWluKSAqIHBhZGRpbmcubGVmdCAvIHJhbmdlRXh0ZW50LFxuICAgICAgcmlnaHQ6IE1hdGguYWJzKG1heCAtIG1pbikgKiBwYWRkaW5nLnJpZ2h0IC8gcmFuZ2VFeHRlbnRcbiAgICB9OyAvLyBBZGp1c3QgdGhlIGRvbWFpbiBieSB0aGUgaW5pdGlhbCBwYWRkaW5nXG5cbiAgICB2YXIgYWRqdXN0ZWREb21haW4gPSB7XG4gICAgICBtaW46IGFkanVzdChtaW4udmFsdWVPZigpIC0gaW5pdGlhbFBhZGRpbmcubGVmdCwgXCJtaW5cIiksXG4gICAgICBtYXg6IGFkanVzdChtYXgudmFsdWVPZigpICsgaW5pdGlhbFBhZGRpbmcucmlnaHQsIFwibWF4XCIpXG4gICAgfTsgLy8gcmUtY2FsY3VsYXRlIHBhZGRpbmcsIHRha2luZyB0aGUgYWRqdXN0ZWQgZG9tYWluIGludG8gYWNjb3VudFxuXG4gICAgdmFyIGZpbmFsUGFkZGluZyA9IHtcbiAgICAgIGxlZnQ6IE1hdGguYWJzKGFkanVzdGVkRG9tYWluLm1heCAtIGFkanVzdGVkRG9tYWluLm1pbikgKiBwYWRkaW5nLmxlZnQgLyByYW5nZUV4dGVudCxcbiAgICAgIHJpZ2h0OiBNYXRoLmFicyhhZGp1c3RlZERvbWFpbi5tYXggLSBhZGp1c3RlZERvbWFpbi5taW4pICogcGFkZGluZy5yaWdodCAvIHJhbmdlRXh0ZW50XG4gICAgfTsgLy8gQWRqdXN0IHRoZSBkb21haW4gYnkgdGhlIGZpbmFsIHBhZGRpbmdcblxuICAgIHBhZGRlZERvbWFpbiA9IHtcbiAgICAgIG1pbjogYWRqdXN0KG1pbi52YWx1ZU9mKCkgLSBmaW5hbFBhZGRpbmcubGVmdCwgXCJtaW5cIiksXG4gICAgICBtYXg6IGFkanVzdChtYXgudmFsdWVPZigpICsgZmluYWxQYWRkaW5nLnJpZ2h0LCBcIm1heFwiKVxuICAgIH07XG4gIH0gLy8gZGVmYXVsdCB0byBtaW5Eb21haW4gLyBtYXhEb21haW4gaWYgdGhleSBleGlzdFxuXG5cbiAgdmFyIGZpbmFsRG9tYWluID0ge1xuICAgIG1pbjogbWluRG9tYWluICE9PSB1bmRlZmluZWQgPyBtaW5Eb21haW4gOiBwYWRkZWREb21haW4ubWluLFxuICAgIG1heDogbWF4RG9tYWluICE9PSB1bmRlZmluZWQgPyBtYXhEb21haW4gOiBwYWRkZWREb21haW4ubWF4XG4gIH07XG4gIHJldHVybiBtaW4gaW5zdGFuY2VvZiBEYXRlIHx8IG1heCBpbnN0YW5jZW9mIERhdGUgPyBnZXREb21haW5Gcm9tTWluTWF4KG5ldyBEYXRlKGZpbmFsRG9tYWluLm1pbiksIG5ldyBEYXRlKGZpbmFsRG9tYWluLm1heCkpIDogZ2V0RG9tYWluRnJvbU1pbk1heChmaW5hbERvbWFpbi5taW4sIGZpbmFsRG9tYWluLm1heCk7XG59IC8vIFB1YmxpYyBNZXRob2RzXG5cbi8qKlxuICogUmV0dXJucyBhIGdldERvbWFpbiBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0RG9tYWluRnJvbURhdGFGdW5jdGlvbjogYSBmdW5jdGlvbiB0aGF0IHRha2VzIHByb3BzIGFuZCBheGlzIGFuZFxuICogcmV0dXJucyBhIGRvbWFpbiBiYXNlZCBvbiBkYXRhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmb3JtYXREb21haW5GdW5jdGlvbjogYSBmdW5jdGlvbiB0aGF0IHRha2VzIGRvbWFpbiwgcHJvcHMsIGFuZCBheGlzIGFuZFxuICogcmV0dXJucyBhIGZvcm1hdHRlZCBkb21haW5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBmdW5jdGlvbiB0aGF0IHRha2VzIHByb3BzIGFuZCBheGlzIGFuZCByZXR1cm5zIGEgZm9ybWF0dGVkIGRvbWFpblxuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURvbWFpbkZ1bmN0aW9uKGdldERvbWFpbkZyb21EYXRhRnVuY3Rpb24sIGZvcm1hdERvbWFpbkZ1bmN0aW9uKSB7XG4gIGdldERvbWFpbkZyb21EYXRhRnVuY3Rpb24gPSBfaXNGdW5jdGlvbihnZXREb21haW5Gcm9tRGF0YUZ1bmN0aW9uKSA/IGdldERvbWFpbkZyb21EYXRhRnVuY3Rpb24gOiBnZXREb21haW5Gcm9tRGF0YTtcbiAgZm9ybWF0RG9tYWluRnVuY3Rpb24gPSBfaXNGdW5jdGlvbihmb3JtYXREb21haW5GdW5jdGlvbikgPyBmb3JtYXREb21haW5GdW5jdGlvbiA6IGZvcm1hdERvbWFpbjtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wcywgYXhpcykge1xuICAgIHZhciBwcm9wc0RvbWFpbiA9IGdldERvbWFpbkZyb21Qcm9wcyhwcm9wcywgYXhpcyk7XG5cbiAgICBpZiAocHJvcHNEb21haW4pIHtcbiAgICAgIHJldHVybiBmb3JtYXREb21haW5GdW5jdGlvbihwcm9wc0RvbWFpbiwgcHJvcHMsIGF4aXMpO1xuICAgIH1cblxuICAgIHZhciBjYXRlZ29yaWVzID0gRGF0YS5nZXRDYXRlZ29yaWVzKHByb3BzLCBheGlzKTtcbiAgICB2YXIgZG9tYWluID0gY2F0ZWdvcmllcyA/IGdldERvbWFpbkZyb21DYXRlZ29yaWVzKHByb3BzLCBheGlzLCBjYXRlZ29yaWVzKSA6IGdldERvbWFpbkZyb21EYXRhRnVuY3Rpb24ocHJvcHMsIGF4aXMpO1xuICAgIHJldHVybiBkb21haW4gPyBmb3JtYXREb21haW5GdW5jdGlvbihkb21haW4sIHByb3BzLCBheGlzKSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGZvcm1hdHRlZCBkb21haW4uXG4gKiBAcGFyYW0ge0FycmF5fSBkb21haW46IGEgZG9tYWluIGluIHRoZSBmb3JtIG9mIGEgdHdvIGVsZW1lbnQgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wczogdGhlIHByb3BzIG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IGF4aXM6IHRoZSBjdXJyZW50IGF4aXNcbiAqIEByZXR1cm5zIHtBcnJheX0gYSBkb21haW4gaW4gdGhlIGZvcm0gb2YgYSB0d28gZWxlbWVudCBhcnJheVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREb21haW4oZG9tYWluLCBwcm9wcywgYXhpcykge1xuICByZXR1cm4gY2xlYW5Eb21haW4ocGFkRG9tYWluKGRvbWFpbiwgcHJvcHMsIGF4aXMpLCBwcm9wcywgYXhpcyk7XG59XG4vKipcbiAqIFJldHVybnMgYSBkb21haW4gZm9yIGEgZ2l2ZW4gYXhpcyBiYXNlZCBvbiBwcm9wcywgY2F0ZWdvcnksIG9yIGRhdGFcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wczogdGhlIHByb3BzIG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IGF4aXM6IHRoZSBjdXJyZW50IGF4aXNcbiAqIEByZXR1cm5zIHtBcnJheX0gdGhlIGRvbWFpbiBmb3IgdGhlIGdpdmVuIGF4aXNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9tYWluKHByb3BzLCBheGlzKSB7XG4gIHJldHVybiBjcmVhdGVEb21haW5GdW5jdGlvbigpKHByb3BzLCBheGlzKTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGRvbWFpbiBiYXNlZCBvbiBjYXRlZ29yaWVzIGlmIHRoZXkgZXhpc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wczogdGhlIHByb3BzIG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IGF4aXM6IHRoZSBjdXJyZW50IGF4aXNcbiAqIEBwYXJhbSB7QXJyYXl9IGNhdGVnb3JpZXM6IGFuIGFycmF5IG9mIGNhdGVnb3JpZXMgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGF4aXNcbiAqIEByZXR1cm5zIHtBcnJheXx1bmRlZmluZWR9IHJldHVybnMgYSBkb21haW4gZnJvbSBjYXRlZ29yaWVzIG9yIHVuZGVmaW5lZFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREb21haW5Gcm9tQ2F0ZWdvcmllcyhwcm9wcywgYXhpcywgY2F0ZWdvcmllcykge1xuICBjYXRlZ29yaWVzID0gY2F0ZWdvcmllcyB8fCBEYXRhLmdldENhdGVnb3JpZXMocHJvcHMsIGF4aXMpO1xuICB2YXIgcG9sYXIgPSBwcm9wcy5wb2xhcixcbiAgICAgIF9wcm9wcyRzdGFydEFuZ2xlID0gcHJvcHMuc3RhcnRBbmdsZSxcbiAgICAgIHN0YXJ0QW5nbGUgPSBfcHJvcHMkc3RhcnRBbmdsZSA9PT0gdm9pZCAwID8gMCA6IF9wcm9wcyRzdGFydEFuZ2xlLFxuICAgICAgX3Byb3BzJGVuZEFuZ2xlID0gcHJvcHMuZW5kQW5nbGUsXG4gICAgICBlbmRBbmdsZSA9IF9wcm9wcyRlbmRBbmdsZSA9PT0gdm9pZCAwID8gMzYwIDogX3Byb3BzJGVuZEFuZ2xlO1xuXG4gIGlmICghY2F0ZWdvcmllcykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgbWluRG9tYWluID0gZ2V0TWluRnJvbVByb3BzKHByb3BzLCBheGlzKTtcbiAgdmFyIG1heERvbWFpbiA9IGdldE1heEZyb21Qcm9wcyhwcm9wcywgYXhpcyk7XG4gIHZhciBzdHJpbmdBcnJheSA9IENvbGxlY3Rpb24uY29udGFpbnNTdHJpbmdzKGNhdGVnb3JpZXMpID8gRGF0YS5nZXRTdHJpbmdzRnJvbUNhdGVnb3JpZXMocHJvcHMsIGF4aXMpIDogW107XG4gIHZhciBzdHJpbmdNYXAgPSBzdHJpbmdBcnJheS5sZW5ndGggPT09IDAgPyBudWxsIDogc3RyaW5nQXJyYXkucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBzdHJpbmcsIGluZGV4KSB7XG4gICAgbWVtb1tzdHJpbmddID0gaW5kZXggKyAxO1xuICAgIHJldHVybiBtZW1vO1xuICB9LCB7fSk7XG4gIHZhciBjYXRlZ29yeVZhbHVlcyA9IHN0cmluZ01hcCA/IGNhdGVnb3JpZXMubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBzdHJpbmdNYXBbdmFsdWVdO1xuICB9KSA6IGNhdGVnb3JpZXM7XG4gIHZhciBtaW4gPSBtaW5Eb21haW4gIT09IHVuZGVmaW5lZCA/IG1pbkRvbWFpbiA6IENvbGxlY3Rpb24uZ2V0TWluVmFsdWUoY2F0ZWdvcnlWYWx1ZXMpO1xuICB2YXIgbWF4ID0gbWF4RG9tYWluICE9PSB1bmRlZmluZWQgPyBtYXhEb21haW4gOiBDb2xsZWN0aW9uLmdldE1heFZhbHVlKGNhdGVnb3J5VmFsdWVzKTtcbiAgdmFyIGNhdGVnb3J5RG9tYWluID0gZ2V0RG9tYWluRnJvbU1pbk1heChtaW4sIG1heCk7XG4gIHJldHVybiBwb2xhciAmJiBheGlzID09PSBcInhcIiAmJiBNYXRoLmFicyhzdGFydEFuZ2xlIC0gZW5kQW5nbGUpID09PSAzNjAgPyBnZXRTeW1tZXRyaWNEb21haW4oY2F0ZWdvcnlEb21haW4sIGNhdGVnb3J5VmFsdWVzKSA6IGNhdGVnb3J5RG9tYWluO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgZG9tYWluIGZyb20gYSBkYXRhc2V0IGZvciBhIGdpdmVuIGF4aXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wczogdGhlIHByb3BzIG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IGF4aXM6IHRoZSBjdXJyZW50IGF4aXNcbiAqIEBwYXJhbSB7QXJyYXl9IGRhdGFzZXQ6IGFuIGFycmF5IG9mIGRhdGFcbiAqIEByZXR1cm5zIHtBcnJheX0gdGhlIGRvbWFpbiBiYXNlZCBvbiBkYXRhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERvbWFpbkZyb21EYXRhKHByb3BzLCBheGlzLCBkYXRhc2V0KSB7XG4gIGRhdGFzZXQgPSBkYXRhc2V0IHx8IERhdGEuZ2V0RGF0YShwcm9wcyk7XG4gIHZhciBwb2xhciA9IHByb3BzLnBvbGFyLFxuICAgICAgX3Byb3BzJHN0YXJ0QW5nbGUyID0gcHJvcHMuc3RhcnRBbmdsZSxcbiAgICAgIHN0YXJ0QW5nbGUgPSBfcHJvcHMkc3RhcnRBbmdsZTIgPT09IHZvaWQgMCA/IDAgOiBfcHJvcHMkc3RhcnRBbmdsZTIsXG4gICAgICBfcHJvcHMkZW5kQW5nbGUyID0gcHJvcHMuZW5kQW5nbGUsXG4gICAgICBlbmRBbmdsZSA9IF9wcm9wcyRlbmRBbmdsZTIgPT09IHZvaWQgMCA/IDM2MCA6IF9wcm9wcyRlbmRBbmdsZTI7XG4gIHZhciBtaW5Eb21haW4gPSBnZXRNaW5Gcm9tUHJvcHMocHJvcHMsIGF4aXMpO1xuICB2YXIgbWF4RG9tYWluID0gZ2V0TWF4RnJvbVByb3BzKHByb3BzLCBheGlzKTtcblxuICBpZiAoZGF0YXNldC5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIG1pbkRvbWFpbiAhPT0gdW5kZWZpbmVkICYmIG1heERvbWFpbiAhPT0gdW5kZWZpbmVkID8gZ2V0RG9tYWluRnJvbU1pbk1heChtaW5Eb21haW4sIG1heERvbWFpbikgOiB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgbWluID0gbWluRG9tYWluICE9PSB1bmRlZmluZWQgPyBtaW5Eb21haW4gOiBnZXRFeHRyZW1lRnJvbURhdGEoZGF0YXNldCwgYXhpcywgXCJtaW5cIik7XG4gIHZhciBtYXggPSBtYXhEb21haW4gIT09IHVuZGVmaW5lZCA/IG1heERvbWFpbiA6IGdldEV4dHJlbWVGcm9tRGF0YShkYXRhc2V0LCBheGlzLCBcIm1heFwiKTtcbiAgdmFyIGRvbWFpbiA9IGdldERvbWFpbkZyb21NaW5NYXgobWluLCBtYXgpO1xuICByZXR1cm4gcG9sYXIgJiYgYXhpcyA9PT0gXCJ4XCIgJiYgTWF0aC5hYnMoc3RhcnRBbmdsZSAtIGVuZEFuZ2xlKSA9PT0gMzYwID8gZ2V0U3ltbWV0cmljRG9tYWluKGRvbWFpbiwgZ2V0RmxhdERhdGEoZGF0YXNldCwgYXhpcykpIDogZG9tYWluO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgZG9tYWluIGluIHRoZSBmb3JtIG9mIGEgdHdvIGVsZW1lbnQgYXJyYXkgZ2l2ZW4gYSBtaW4gYW5kIG1heCB2YWx1ZS5cbiAqIEBwYXJhbSB7TnVtYmVyfERhdGV9IG1pbjogdGhlIHByb3BzIG9iamVjdFxuICogQHBhcmFtIHtOdW1iZXJ8RGF0ZX0gbWF4OiB0aGUgY3VycmVudCBheGlzXG4gKiBAcmV0dXJucyB7QXJyYXl9IHRoZSBtaW5Eb21haW4gYmFzZWQgb24gcHJvcHNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9tYWluRnJvbU1pbk1heChtaW4sIG1heCkge1xuICB2YXIgZ2V0U2luZ2xlUG9pbnREb21haW4gPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgLy8gZDMtc2NhbGUgZG9lcyBub3QgcHJvcGVybHkgcmVzb2x2ZSB2ZXJ5IHNtYWxsIGRpZmZlcmVuY2VzLlxuICAgIHZhciB2ZXJ5U21hbGxOdW1iZXIgPSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICAgIHZhbCA9PT0gMCA/IDIgKiBNYXRoLnBvdygxMCwgLTEwKSA6IE1hdGgucG93KDEwLCAtMTApO1xuICAgIHZhciB2ZXJ5U21hbGxEYXRlID0gMTtcbiAgICB2YXIgbWluVmFsID0gdmFsIGluc3RhbmNlb2YgRGF0ZSA/IG5ldyBEYXRlKCt2YWwgLSB2ZXJ5U21hbGxEYXRlKSA6ICt2YWwgLSB2ZXJ5U21hbGxOdW1iZXI7XG4gICAgdmFyIG1heFZhbCA9IHZhbCBpbnN0YW5jZW9mIERhdGUgPyBuZXcgRGF0ZSgrdmFsICsgdmVyeVNtYWxsRGF0ZSkgOiArdmFsICsgdmVyeVNtYWxsTnVtYmVyO1xuICAgIHJldHVybiB2YWwgPT09IDAgPyBbMCwgbWF4VmFsXSA6IFttaW5WYWwsIG1heFZhbF07XG4gIH07XG5cbiAgcmV0dXJuICttaW4gPT09ICttYXggPyBnZXRTaW5nbGVQb2ludERvbWFpbihtYXgpIDogW21pbiwgbWF4XTtcbn1cbi8qKlxuICogUmV0dXJucyBhIHRoZSBkb21haW4gZm9yIGEgZ2l2ZW4gYXhpcyBpZiBkb21haW4gaXMgZ2l2ZW4gaW4gcHJvcHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wczogdGhlIHByb3BzIG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IGF4aXM6IHRoZSBjdXJyZW50IGF4aXNcbiAqIEByZXR1cm5zIHtBcnJheXx1bmRlZmluZWR9IHRoZSBkb21haW4gYmFzZWQgb24gcHJvcHNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9tYWluRnJvbVByb3BzKHByb3BzLCBheGlzKSB7XG4gIHZhciBtaW5Eb21haW4gPSBnZXRNaW5Gcm9tUHJvcHMocHJvcHMsIGF4aXMpO1xuICB2YXIgbWF4RG9tYWluID0gZ2V0TWF4RnJvbVByb3BzKHByb3BzLCBheGlzKTtcblxuICBpZiAoX2lzUGxhaW5PYmplY3QocHJvcHMuZG9tYWluKSAmJiBwcm9wcy5kb21haW5bYXhpc10pIHtcbiAgICByZXR1cm4gcHJvcHMuZG9tYWluW2F4aXNdO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMuZG9tYWluKSkge1xuICAgIHJldHVybiBwcm9wcy5kb21haW47XG4gIH0gZWxzZSBpZiAobWluRG9tYWluICE9PSB1bmRlZmluZWQgJiYgbWF4RG9tYWluICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZ2V0RG9tYWluRnJvbU1pbk1heChtaW5Eb21haW4sIG1heERvbWFpbik7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgZG9tYWluIGZvciBhIGdpdmVuIGF4aXMuIFRoaXMgbWV0aG9kIGZvcmNlcyB0aGUgZG9tYWluIHRvIGluY2x1ZGVcbiAqIHplcm8gdW5sZXNzIHRoZSBkb21haW4gaXMgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gcHJvcHMuXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHM6IHRoZSBwcm9wcyBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBheGlzOiB0aGUgY3VycmVudCBheGlzXG4gKiBAcmV0dXJucyB7QXJyYXl9IHRoZSBkb21haW4gZm9yIHRoZSBnaXZlbiBheGlzXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERvbWFpbldpdGhaZXJvKHByb3BzLCBheGlzKSB7XG4gIHZhciBwcm9wc0RvbWFpbiA9IGdldERvbWFpbkZyb21Qcm9wcyhwcm9wcywgYXhpcyk7XG5cbiAgaWYgKHByb3BzRG9tYWluKSB7XG4gICAgcmV0dXJuIHByb3BzRG9tYWluO1xuICB9XG5cbiAgdmFyIGRhdGFzZXQgPSBEYXRhLmdldERhdGEocHJvcHMpO1xuICB2YXIgeTBNaW4gPSBkYXRhc2V0LnJlZHVjZShmdW5jdGlvbiAobWluLCBkYXR1bSkge1xuICAgIHJldHVybiBkYXR1bS5feTAgPCBtaW4gPyBkYXR1bS5feTAgOiBtaW47XG4gIH0sIEluZmluaXR5KTtcblxuICB2YXIgZW5zdXJlWmVybyA9IGZ1bmN0aW9uIChkb21haW4pIHtcbiAgICBpZiAoYXhpcyA9PT0gXCJ4XCIpIHtcbiAgICAgIHJldHVybiBkb21haW47XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRNaW4gPSB5ME1pbiAhPT0gSW5maW5pdHkgPyB5ME1pbiA6IDA7XG4gICAgdmFyIG1heERvbWFpblByb3AgPSBnZXRNYXhGcm9tUHJvcHMocHJvcHMsIGF4aXMpO1xuICAgIHZhciBtaW5Eb21haW5Qcm9wID0gZ2V0TWluRnJvbVByb3BzKHByb3BzLCBheGlzKTtcbiAgICB2YXIgbWF4ID0gbWF4RG9tYWluUHJvcCAhPT0gdW5kZWZpbmVkID8gbWF4RG9tYWluUHJvcCA6IENvbGxlY3Rpb24uZ2V0TWF4VmFsdWUoZG9tYWluLCBkZWZhdWx0TWluKTtcbiAgICB2YXIgbWluID0gbWluRG9tYWluUHJvcCAhPT0gdW5kZWZpbmVkID8gbWluRG9tYWluUHJvcCA6IENvbGxlY3Rpb24uZ2V0TWluVmFsdWUoZG9tYWluLCBkZWZhdWx0TWluKTtcbiAgICByZXR1cm4gZ2V0RG9tYWluRnJvbU1pbk1heChtaW4sIG1heCk7XG4gIH07XG5cbiAgdmFyIGdldERvbWFpbkZ1bmN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXREb21haW5Gcm9tRGF0YShwcm9wcywgYXhpcywgZGF0YXNldCk7XG4gIH07XG5cbiAgdmFyIGZvcm1hdERvbWFpbkZ1bmN0aW9uID0gZnVuY3Rpb24gKGRvbWFpbikge1xuICAgIHJldHVybiBmb3JtYXREb21haW4oZW5zdXJlWmVybyhkb21haW4pLCBwcm9wcywgYXhpcyk7XG4gIH07XG5cbiAgcmV0dXJuIGNyZWF0ZURvbWFpbkZ1bmN0aW9uKGdldERvbWFpbkZ1bmN0aW9uLCBmb3JtYXREb21haW5GdW5jdGlvbikocHJvcHMsIGF4aXMpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhEb21haW4gZnJvbSBwcm9wcyBpZiBpdCBleGlzdHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wczogdGhlIHByb3BzIG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IGF4aXM6IHRoZSBjdXJyZW50IGF4aXNcbiAqIEByZXR1cm5zIHtOdW1iZXJ8RGF0ZXx1bmRlZmluZWR9IHRoZSBtYXhEb21haW4gYmFzZWQgb24gcHJvcHNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF4RnJvbVByb3BzKHByb3BzLCBheGlzKSB7XG4gIGlmIChfaXNQbGFpbk9iamVjdChwcm9wcy5tYXhEb21haW4pICYmIHByb3BzLm1heERvbWFpbltheGlzXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHByb3BzLm1heERvbWFpbltheGlzXTtcbiAgfVxuXG4gIHJldHVybiB0eXBlb2YgcHJvcHMubWF4RG9tYWluID09PSBcIm51bWJlclwiIHx8IF9pc0RhdGUocHJvcHMubWF4RG9tYWluKSA/IHByb3BzLm1heERvbWFpbiA6IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbWluRG9tYWluIGZyb20gcHJvcHMgaWYgaXQgZXhpc3RzXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHM6IHRoZSBwcm9wcyBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBheGlzOiB0aGUgY3VycmVudCBheGlzXG4gKiBAcmV0dXJucyB7TnVtYmVyfERhdGV8dW5kZWZpbmVkfSB0aGUgbWluRG9tYWluIGJhc2VkIG9uIHByb3BzXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1pbkZyb21Qcm9wcyhwcm9wcywgYXhpcykge1xuICBpZiAoX2lzUGxhaW5PYmplY3QocHJvcHMubWluRG9tYWluKSAmJiBwcm9wcy5taW5Eb21haW5bYXhpc10gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBwcm9wcy5taW5Eb21haW5bYXhpc107XG4gIH1cblxuICByZXR1cm4gdHlwZW9mIHByb3BzLm1pbkRvbWFpbiA9PT0gXCJudW1iZXJcIiB8fCBfaXNEYXRlKHByb3BzLm1pbkRvbWFpbikgPyBwcm9wcy5taW5Eb21haW4gOiB1bmRlZmluZWQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzeW1tZXRyaWNhbGx5IHBhZGRlZCBkb21haW4gZm9yIHBvbGFyIGNoYXJ0c1xuICogQHBhcmFtIHtBcnJheX0gZG9tYWluOiB0aGUgb3JpZ2luYWwgZG9tYWluXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXM6IGEgZmxhdCBhcnJheSBvZiB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlaXRoZXIgdGlja1ZhbHVlcywgb3IgZGF0YSB2YWx1ZXNcbiAqIGZvciBhIGdpdmVuIGRpbWVuc2lvbiBpLmUuIG9ubHkgeCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IHRoZSBzeW1tZXRyaWMgZG9tYWluXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN5bW1ldHJpY0RvbWFpbihkb21haW4sIHZhbHVlcykge1xuICB2YXIgcHJvY2Vzc2VkRGF0YSA9IF9zb3J0ZWRVbmlxKHZhbHVlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGEgLSBiO1xuICB9KSk7XG5cbiAgdmFyIHN0ZXAgPSBwcm9jZXNzZWREYXRhWzFdIC0gcHJvY2Vzc2VkRGF0YVswXTtcbiAgcmV0dXJuIFtkb21haW5bMF0sIGRvbWFpblsxXSArIHN0ZXBdO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIGNvbXBvbmVudCBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgZG9tYWluXG4gKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50OiBhIFJlYWN0IGNvbXBvbmVudCBpbnN0YW5jZVxuICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGhhcyBhIHJvbGUgaW5jbHVkZWQgaW4gdGhlIHdoaXRlbGlzdFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RvbWFpbkNvbXBvbmVudChjb21wb25lbnQpIHtcbiAgdmFyIGdldFJvbGUgPSBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQgJiYgY2hpbGQudHlwZSA/IGNoaWxkLnR5cGUucm9sZSA6IFwiXCI7XG4gIH07XG5cbiAgdmFyIHJvbGUgPSBnZXRSb2xlKGNvbXBvbmVudCk7XG5cbiAgaWYgKHJvbGUgPT09IFwicG9ydGFsXCIpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KGNvbXBvbmVudC5wcm9wcy5jaGlsZHJlbik7XG4gICAgcm9sZSA9IGNoaWxkcmVuLmxlbmd0aCA/IGdldFJvbGUoY2hpbGRyZW5bMF0pIDogXCJcIjtcbiAgfVxuXG4gIHZhciB3aGl0ZWxpc3QgPSBbXCJhcmVhXCIsIFwiYXhpc1wiLCBcImJhclwiLCBcImJveHBsb3RcIiwgXCJjYW5kbGVzdGlja1wiLCBcImVycm9yYmFyXCIsIFwiZ3JvdXBcIiwgXCJoaXN0b2dyYW1cIiwgXCJsaW5lXCIsIFwicGllXCIsIFwic2NhdHRlclwiLCBcInN0YWNrXCIsIFwidm9yb25vaVwiXTtcbiAgcmV0dXJuIF9pbmNsdWRlcyh3aGl0ZWxpc3QsIHJvbGUpO1xufSIsImltcG9ydCBfd2l0aG91dCBmcm9tIFwibG9kYXNoL3dpdGhvdXRcIjtcbmltcG9ydCBfaW5jbHVkZXMgZnJvbSBcImxvZGFzaC9pbmNsdWRlc1wiO1xuaW1wb3J0IF92YWx1ZXMgZnJvbSBcImxvZGFzaC92YWx1ZXNcIjtcbmltcG9ydCBfb3JkZXJCeSBmcm9tIFwibG9kYXNoL29yZGVyQnlcIjtcbmltcG9ydCBfcmFuZ2UgZnJvbSBcImxvZGFzaC9yYW5nZVwiO1xuaW1wb3J0IF91bmlxIGZyb20gXCJsb2Rhc2gvdW5pcVwiO1xuaW1wb3J0IF9pbnZlcnQgZnJvbSBcImxvZGFzaC9pbnZlcnRcIjtcbmltcG9ydCBfaXNPYmplY3QgZnJvbSBcImxvZGFzaC9pc09iamVjdFwiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gvaXNGdW5jdGlvblwiO1xuaW1wb3J0IF9pZGVudGl0eSBmcm9tIFwibG9kYXNoL2lkZW50aXR5XCI7XG5pbXBvcnQgX2RlZmF1bHRzIGZyb20gXCJsb2Rhc2gvZGVmYXVsdHNcIjtcbmltcG9ydCBfYXNzaWduIGZyb20gXCJsb2Rhc2gvYXNzaWduXCI7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbi8qIGVzbGludC1kaXNhYmxlIGZ1bmMtc3R5bGUgKi9cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCAqIGFzIENvbGxlY3Rpb24gZnJvbSBcIi4vY29sbGVjdGlvblwiO1xuaW1wb3J0ICogYXMgRG9tYWluIGZyb20gXCIuL2RvbWFpblwiO1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tIFwiLi9oZWxwZXJzXCI7XG4vKipcbiAqIFJldHVybnMgdGhlIGF4aXMgKHggb3IgeSkgb2YgYSBwYXJ0aWN1bGFyIGF4aXMgY29tcG9uZW50XG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHM6IHRoZSBwcm9wcyBvYmplY3QuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGhvcml6b250YWw6IHRydWUgZm9yIGhvcml6b250YWwgY2hhcnRzXG4gKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgZGltZW5zaW9uIGFwcHJvcHJpYXRlIGZvciB0aGUgYXhpcyBnaXZlbiBpdHMgcHJvcHNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXhpcyhwcm9wcykge1xuICB2YXIgZGVwZW5kZW50QXhpcyA9IHByb3BzLmRlcGVuZGVudEF4aXM7XG4gIHJldHVybiBkZXBlbmRlbnRBeGlzID8gXCJ5XCIgOiBcInhcIjtcbn1cbi8qKlxuICogUmV0dXJucyBhbGwgYXhpcyBjb21wb25lbnRzIHRoYXQgcGFzcyBhIGdpdmVuIHByZWRpY2F0ZVxuICogQHBhcmFtIHtBcnJheX0gY2hpbGRDb21wb25lbnRzOiBhbiBhcnJheSBvZiBjaGlsZHJlblxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlOiBhIHByZWRpY2F0ZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggZWFjaFxuICogQHJldHVybnMge0FycmF5fSBhbGwgYXhpcyBjb21wb25lbnRzIHRoYXQgcGFzcyB0aGUgZ2l2ZW4gcHJlZGljYXRlIG9yIFtdXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRBeGlzQ29tcG9uZW50cyhjaGlsZENvbXBvbmVudHMsIHByZWRpY2F0ZSkge1xuICBwcmVkaWNhdGUgPSBwcmVkaWNhdGUgfHwgX2lkZW50aXR5O1xuXG4gIHZhciBmaW5kQXhlcyA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAgIHJldHVybiBjaGlsZHJlbi5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQudHlwZSAmJiBjaGlsZC50eXBlLnJvbGUgPT09IFwiYXhpc1wiICYmIHByZWRpY2F0ZShjaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIG1lbW8uY29uY2F0KGNoaWxkKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hpbGQucHJvcHMgJiYgY2hpbGQucHJvcHMuY2hpbGRyZW4pIHtcbiAgICAgICAgcmV0dXJuIG1lbW8uY29uY2F0KGZpbmRBeGVzKFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGQucHJvcHMuY2hpbGRyZW4pKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH0sIFtdKTtcbiAgfTtcblxuICByZXR1cm4gZmluZEF4ZXMoY2hpbGRDb21wb25lbnRzKTtcbn1cbi8qKlxuICogUmV0dXJucyBhIHNpbmdsZSBheGlzIGNvbXBvbmVudCBvZiB0aGUgZGVzaXJlZCBheGlzIHR5cGUgKHggb3IgeSlcbiAqIEBwYXJhbSB7QXJyYXl9IGNoaWxkQ29tcG9uZW50czogYW4gYXJyYXkgb2YgY2hpbGRyZW5cbiAqIEBwYXJhbSB7U3RyaW5nfSBheGlzOiBkZXNpcmVkIGF4aXMgZWl0aGVyIFwieFwiIG9yIFwieVwiLlxuICogQHJldHVybnMge1JlYWN0Q29tcG9uZW50fSBhbiBheGlzIGNvbXBvbmVudCBvZiB0aGUgZGVzaXJlZCBheGlzIG9yIHVuZGVmaW5lZFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBeGlzQ29tcG9uZW50KGNoaWxkQ29tcG9uZW50cywgYXhpcykge1xuICB2YXIgbWF0Y2hlc0F4aXMgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgdmFyIHR5cGUgPSBjb21wb25lbnQudHlwZS5nZXRBeGlzKGNvbXBvbmVudC5wcm9wcyk7XG4gICAgcmV0dXJuIHR5cGUgPT09IGF4aXM7XG4gIH07XG5cbiAgcmV0dXJuIGZpbmRBeGlzQ29tcG9uZW50cyhjaGlsZENvbXBvbmVudHMsIG1hdGNoZXNBeGlzKVswXTtcbn1cbi8qKlxuICogUmV0dXJucyBhbGwgYXhpcyBjb21wb25lbnRzIG9mIHRoZSBkZXNpcmVkIGF4aXMgdHlwZSAoeCBvciB5KSBhbG9uZyB3aXRoIGFueVxuICogcGFyZW50IGNvbXBvbmVudHMgZXhjbHVkaW5nIFZpY3RvcnlDaGFydFxuICogQHBhcmFtIHtBcnJheX0gY2hpbGRDb21wb25lbnRzOiBhbiBvcHRpb25hbCBhcnJheSBvZiBjaGlsZHJlbi5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlOiBkZXNpcmVkIGF4aXMgZWl0aGVyIFwiZGVwZW5kZW50XCIgb3IgXCJpbmRlcGVuZGVudFwiLlxuICogQHJldHVybnMge1JlYWN0Q29tcG9uZW50fSBhbiBheGlzIGNvbXBvbmVudCBvZiB0aGUgZGVzaXJlZCB0eXBlIG9yIHVuZGVmaW5lZFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBeGlzQ29tcG9uZW50c1dpdGhQYXJlbnQoY2hpbGRDb21wb25lbnRzLCB0eXBlKSB7XG4gIHZhciBtYXRjaGVzVHlwZSA9IGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiB0eXBlID09PSBcImRlcGVuZGVudFwiID8gY2hpbGQucHJvcHMuZGVwZW5kZW50QXhpcyA6ICFjaGlsZC5wcm9wcy5kZXBlbmRlbnRBeGlzO1xuICB9O1xuXG4gIHZhciBmaW5kQ29tcG9uZW50cyA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAgIHJldHVybiBjaGlsZHJlbi5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQudHlwZSAmJiBjaGlsZC50eXBlLnJvbGUgPT09IFwiYXhpc1wiICYmIG1hdGNoZXNUeXBlKGNoaWxkKSkge1xuICAgICAgICByZXR1cm4gbWVtby5jb25jYXQoY2hpbGQpO1xuICAgICAgfSBlbHNlIGlmIChjaGlsZC5wcm9wcyAmJiBjaGlsZC5wcm9wcy5jaGlsZHJlbikge1xuICAgICAgICB2YXIgY2hpbGRBeGlzID0gZmluZENvbXBvbmVudHMoUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZC5wcm9wcy5jaGlsZHJlbikpO1xuICAgICAgICByZXR1cm4gY2hpbGRBeGlzLmxlbmd0aCA+IDAgPyBtZW1vLmNvbmNhdChjaGlsZCkgOiBtZW1vO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVtbztcbiAgICB9LCBbXSk7XG4gIH07XG5cbiAgcmV0dXJuIGZpbmRDb21wb25lbnRzKGNoaWxkQ29tcG9uZW50cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JpZ2luKGRvbWFpbikge1xuICB2YXIgZ2V0U2luZ2xlT3JpZ2luID0gZnVuY3Rpb24gKGQpIHtcbiAgICB2YXIgZG9tYWluTWluID0gTWF0aC5taW4uYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGQpKTtcbiAgICB2YXIgZG9tYWluTWF4ID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGQpKTtcbiAgICByZXR1cm4gZG9tYWluTWF4IDwgMCA/IGRvbWFpbk1heCA6IE1hdGgubWF4KDAsIGRvbWFpbk1pbik7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICB4OiBDb2xsZWN0aW9uLmNvbnRhaW5zRGF0ZXMoZG9tYWluLngpID8gbmV3IERhdGUoTWF0aC5taW4uYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGRvbWFpbi54KSkpIDogZ2V0U2luZ2xlT3JpZ2luKGRvbWFpbi54KSxcbiAgICB5OiBDb2xsZWN0aW9uLmNvbnRhaW5zRGF0ZXMoZG9tYWluLnkpID8gbmV3IERhdGUoTWF0aC5taW4uYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGRvbWFpbi55KSkpIDogZ2V0U2luZ2xlT3JpZ2luKGRvbWFpbi55KVxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE9yaWdpblNpZ24ob3JpZ2luLCBkb21haW4pIHtcbiAgdmFyIGdldFNpZ24gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG9yaWdpbiA8PSAwICYmIE1hdGgubWF4LmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheShkb21haW4pKSA8PSAwID8gXCJuZWdhdGl2ZVwiIDogXCJwb3NpdGl2ZVwiO1xuICB9O1xuXG4gIHJldHVybiBDb2xsZWN0aW9uLmNvbnRhaW5zRGF0ZXMoZG9tYWluKSA/IFwicG9zaXRpdmVcIiA6IGdldFNpZ24oKTtcbn1cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IHByb3BzOiBheGlzIGNvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgd2hlbiB0aGUgYXhpcyBpcyB2ZXJ0aWNhbFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcnRpY2FsKHByb3BzKSB7XG4gIHZhciBvcmllbnRhdGlvbiA9IHByb3BzLm9yaWVudGF0aW9uIHx8IChwcm9wcy5kZXBlbmRlbnRBeGlzID8gXCJsZWZ0XCIgOiBcImJvdHRvbVwiKTtcbiAgdmFyIHZlcnRpY2FsID0ge1xuICAgIHRvcDogZmFsc2UsXG4gICAgYm90dG9tOiBmYWxzZSxcbiAgICBsZWZ0OiB0cnVlLFxuICAgIHJpZ2h0OiB0cnVlXG4gIH07XG4gIHJldHVybiB2ZXJ0aWNhbFtvcmllbnRhdGlvbl07XG59XG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wczogYXhpcyBjb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIHdoZW4gdGlja1ZhbHVlcyBjb250YWluIHN0cmluZ3NcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVGlja3MocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLnRpY2tWYWx1ZXMgIT09IHVuZGVmaW5lZCAmJiBDb2xsZWN0aW9uLmNvbnRhaW5zU3RyaW5ncyhwcm9wcy50aWNrVmFsdWVzKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFRpY2tGb3JtYXQocHJvcHMpIHtcbiAgdmFyIHRpY2tWYWx1ZXMgPSBwcm9wcy50aWNrVmFsdWVzO1xuICB2YXIgYXhpcyA9IGdldEF4aXMocHJvcHMpO1xuICB2YXIgc3RyaW5nTWFwID0gcHJvcHMuc3RyaW5nTWFwICYmIHByb3BzLnN0cmluZ01hcFtheGlzXTtcbiAgdmFyIGZhbGxiYWNrRm9ybWF0ID0gdGlja1ZhbHVlcyAmJiAhQ29sbGVjdGlvbi5jb250YWluc0RhdGVzKHRpY2tWYWx1ZXMpID8gZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4geDtcbiAgfSA6IHVuZGVmaW5lZDtcblxuICBpZiAoIXN0cmluZ01hcCkge1xuICAgIHJldHVybiBzdHJpbmdUaWNrcyhwcm9wcykgPyBmdW5jdGlvbiAoeCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiB0aWNrVmFsdWVzW2luZGV4XTtcbiAgICB9IDogZmFsbGJhY2tGb3JtYXQ7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGludmVydGVkU3RyaW5nTWFwID0gc3RyaW5nTWFwICYmIF9pbnZlcnQoc3RyaW5nTWFwKTtcblxuICAgIHZhciB0aWNrVmFsdWVBcnJheSA9IF9vcmRlckJ5KF92YWx1ZXMoc3RyaW5nTWFwKSwgZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBuO1xuICAgIH0pO1xuXG4gICAgdmFyIGRhdGFOYW1lcyA9IHRpY2tWYWx1ZUFycmF5Lm1hcChmdW5jdGlvbiAodGljaykge1xuICAgICAgcmV0dXJuIGludmVydGVkU3RyaW5nTWFwW3RpY2tdO1xuICAgIH0pOyAvLyBzdHJpbmcgdGlja3Mgc2hvdWxkIGhhdmUgb25lIHRpY2sgb2YgcGFkZGluZyBhdCB0aGUgYmVnaW5uaW5nXG5cbiAgICB2YXIgZGF0YVRpY2tzID0gW1wiXCJdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZGF0YU5hbWVzKSwgW1wiXCJdKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBkYXRhVGlja3NbeF07XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTdHJpbmdUaWNrcyhwcm9wcykge1xuICB2YXIgYXhpcyA9IGdldEF4aXMocHJvcHMpO1xuICB2YXIgc3RyaW5nTWFwID0gcHJvcHMuc3RyaW5nTWFwICYmIHByb3BzLnN0cmluZ01hcFtheGlzXTtcbiAgdmFyIGNhdGVnb3JpZXMgPSBBcnJheS5pc0FycmF5KHByb3BzLmNhdGVnb3JpZXMpID8gcHJvcHMuY2F0ZWdvcmllcyA6IHByb3BzLmNhdGVnb3JpZXMgJiYgcHJvcHMuY2F0ZWdvcmllc1theGlzXTtcbiAgdmFyIHRpY2tzRnJvbUNhdGVnb3JpZXMgPSBjYXRlZ29yaWVzICYmIENvbGxlY3Rpb24uY29udGFpbnNPbmx5U3RyaW5ncyhjYXRlZ29yaWVzKSA/IGNhdGVnb3JpZXMubWFwKGZ1bmN0aW9uICh0aWNrKSB7XG4gICAgcmV0dXJuIHN0cmluZ01hcFt0aWNrXTtcbiAgfSkgOiB1bmRlZmluZWQ7XG5cbiAgdmFyIHRpY2tzRnJvbVN0cmluZ01hcCA9IHN0cmluZ01hcCAmJiBfdmFsdWVzKHN0cmluZ01hcCk7XG5cbiAgcmV0dXJuIHRpY2tzRnJvbUNhdGVnb3JpZXMgJiYgdGlja3NGcm9tQ2F0ZWdvcmllcy5sZW5ndGggIT09IDAgPyB0aWNrc0Zyb21DYXRlZ29yaWVzIDogdGlja3NGcm9tU3RyaW5nTWFwO1xufVxuXG5mdW5jdGlvbiBnZXRUaWNrQXJyYXkocHJvcHMpIHtcbiAgdmFyIHRpY2tWYWx1ZXMgPSBwcm9wcy50aWNrVmFsdWVzLFxuICAgICAgdGlja0Zvcm1hdCA9IHByb3BzLnRpY2tGb3JtYXQ7XG4gIHZhciBheGlzID0gZ2V0QXhpcyhwcm9wcyk7XG4gIHZhciBzdHJpbmdNYXAgPSBwcm9wcy5zdHJpbmdNYXAgJiYgcHJvcHMuc3RyaW5nTWFwW2F4aXNdO1xuXG4gIHZhciBnZXRUaWNrc0Zyb21Gb3JtYXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aWNrRm9ybWF0IHx8ICFBcnJheS5pc0FycmF5KHRpY2tGb3JtYXQpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBDb2xsZWN0aW9uLmNvbnRhaW5zU3RyaW5ncyh0aWNrRm9ybWF0KSA/IHRpY2tGb3JtYXQubWFwKGZ1bmN0aW9uICh0LCBpKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9KSA6IHRpY2tGb3JtYXQ7XG4gIH07XG5cbiAgdmFyIHRpY2tzID0gdGlja1ZhbHVlcztcblxuICBpZiAoc3RyaW5nTWFwKSB7XG4gICAgdGlja3MgPSBnZXRTdHJpbmdUaWNrcyhwcm9wcyk7XG4gIH1cblxuICBpZiAodGlja1ZhbHVlcyAmJiBDb2xsZWN0aW9uLmNvbnRhaW5zU3RyaW5ncyh0aWNrVmFsdWVzKSkge1xuICAgIHRpY2tzID0gc3RyaW5nTWFwID8gdGlja1ZhbHVlcy5tYXAoZnVuY3Rpb24gKHRpY2spIHtcbiAgICAgIHJldHVybiBzdHJpbmdNYXBbdGlja107XG4gICAgfSkgOiBfcmFuZ2UoMSwgdGlja1ZhbHVlcy5sZW5ndGggKyAxKTtcbiAgfVxuXG4gIHZhciB0aWNrQXJyYXkgPSB0aWNrcyA/IF91bmlxKHRpY2tzKSA6IGdldFRpY2tzRnJvbUZvcm1hdChwcm9wcyk7XG5cbiAgdmFyIGJ1aWxkVGlja0FycmF5ID0gZnVuY3Rpb24gKGFycikge1xuICAgIHZhciBuZXdUaWNrQXJyYXkgPSBbXTtcbiAgICB2YXIgZG9tYWluID0gcHJvcHMuZG9tYWluICYmIHByb3BzLmRvbWFpbltheGlzXSB8fCBwcm9wcy5kb21haW47XG5cbiAgICBpZiAoYXJyKSB7XG4gICAgICBhcnIuZm9yRWFjaChmdW5jdGlvbiAodCwgaW5kZXgpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZG9tYWluKSkge1xuICAgICAgICAgIGlmICh0ID49IENvbGxlY3Rpb24uZ2V0TWluVmFsdWUoZG9tYWluKSAmJiB0IDw9IENvbGxlY3Rpb24uZ2V0TWF4VmFsdWUoZG9tYWluKSkge1xuICAgICAgICAgICAgbmV3VGlja0FycmF5LnB1c2goe1xuICAgICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3VGlja0FycmF5LnB1c2goe1xuICAgICAgICAgICAgdmFsdWU6IHQsXG4gICAgICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3VGlja0FycmF5O1xuICAgIH0gZWxzZSByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRpY2tBcnJheSkgJiYgdGlja0FycmF5Lmxlbmd0aCA/IGJ1aWxkVGlja0FycmF5KHRpY2tBcnJheSkgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaWNrRm9ybWF0KHByb3BzLCBzY2FsZSkge1xuICB2YXIgdGlja0Zvcm1hdCA9IHByb3BzLnRpY2tGb3JtYXQ7XG4gIHZhciBheGlzID0gZ2V0QXhpcyhwcm9wcyk7XG4gIHZhciBzdHJpbmdNYXAgPSBwcm9wcy5zdHJpbmdNYXAgJiYgcHJvcHMuc3RyaW5nTWFwW2F4aXNdO1xuXG4gIGlmICghdGlja0Zvcm1hdCkge1xuICAgIHZhciBkZWZhdWx0VGlja0Zvcm1hdCA9IGdldERlZmF1bHRUaWNrRm9ybWF0KHByb3BzKTtcbiAgICB2YXIgc2NhbGVUaWNrRm9ybWF0ID0gc2NhbGUudGlja0Zvcm1hdCAmJiBfaXNGdW5jdGlvbihzY2FsZS50aWNrRm9ybWF0KSA/IHNjYWxlLnRpY2tGb3JtYXQoKSA6IGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4geDtcbiAgICB9O1xuICAgIHJldHVybiBkZWZhdWx0VGlja0Zvcm1hdCB8fCBzY2FsZVRpY2tGb3JtYXQ7XG4gIH0gZWxzZSBpZiAodGlja0Zvcm1hdCAmJiBBcnJheS5pc0FycmF5KHRpY2tGb3JtYXQpKSB7XG4gICAgdmFyIHRpY2tBcnJheSA9IGdldFRpY2tBcnJheShwcm9wcyk7XG4gICAgdmFyIHRpY2tBcnJheUluZGljZXMgPSB0aWNrQXJyYXkgPyB0aWNrQXJyYXkubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gdi5pbmRleDtcbiAgICB9KSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgZmlsdGVyZWRUaWNrRm9ybWF0ID0gdGlja0Zvcm1hdC5maWx0ZXIoZnVuY3Rpb24gKHQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gdGlja0FycmF5SW5kaWNlcy5pbmNsdWRlcyhpbmRleCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh4LCBpbmRleCkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkVGlja0Zvcm1hdFtpbmRleF07XG4gICAgfTtcbiAgfSBlbHNlIGlmICh0aWNrRm9ybWF0ICYmIF9pc0Z1bmN0aW9uKHRpY2tGb3JtYXQpKSB7XG4gICAgdmFyIGFwcGx5U3RyaW5nVGlja3MgPSBmdW5jdGlvbiAodGljaywgaW5kZXgsIHRpY2tzKSB7XG4gICAgICB2YXIgaW52ZXJ0ZWRTdHJpbmdNYXAgPSBfaW52ZXJ0KHN0cmluZ01hcCk7XG5cbiAgICAgIHZhciBzdHJpbmdUaWNrQXJyYXkgPSB0aWNrcy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGludmVydGVkU3RyaW5nTWFwW3RdO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJvcHMudGlja0Zvcm1hdChpbnZlcnRlZFN0cmluZ01hcFt0aWNrXSwgaW5kZXgsIHN0cmluZ1RpY2tBcnJheSk7XG4gICAgfTtcblxuICAgIHJldHVybiBzdHJpbmdNYXAgPyBhcHBseVN0cmluZ1RpY2tzIDogdGlja0Zvcm1hdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiB4O1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZG93bnNhbXBsZVRpY2tzKHRpY2tzLCB0aWNrQ291bnQpIHtcbiAgaWYgKCF0aWNrQ291bnQgfHwgIUFycmF5LmlzQXJyYXkodGlja3MpIHx8IHRpY2tzLmxlbmd0aCA8PSB0aWNrQ291bnQpIHtcbiAgICByZXR1cm4gdGlja3M7XG4gIH1cblxuICB2YXIgayA9IE1hdGguZmxvb3IodGlja3MubGVuZ3RoIC8gdGlja0NvdW50KTtcbiAgcmV0dXJuIHRpY2tzLmZpbHRlcihmdW5jdGlvbiAoZCwgaSkge1xuICAgIHJldHVybiBpICUgayA9PT0gMDtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaWNrcyhwcm9wcywgc2NhbGUsIGZpbHRlclplcm8pIHtcbiAgdmFyIHRpY2tDb3VudCA9IHByb3BzLnRpY2tDb3VudDtcbiAgdmFyIHRpY2tBcnJheSA9IGdldFRpY2tBcnJheShwcm9wcyk7XG4gIHZhciB0aWNrVmFsdWVzID0gdGlja0FycmF5ID8gdGlja0FycmF5Lm1hcChmdW5jdGlvbiAodikge1xuICAgIHJldHVybiB2LnZhbHVlO1xuICB9KSA6IHVuZGVmaW5lZDtcblxuICBpZiAodGlja1ZhbHVlcykge1xuICAgIHJldHVybiBkb3duc2FtcGxlVGlja3ModGlja1ZhbHVlcywgdGlja0NvdW50KTtcbiAgfSBlbHNlIGlmIChzY2FsZS50aWNrcyAmJiBfaXNGdW5jdGlvbihzY2FsZS50aWNrcykpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICAgIHZhciBkZWZhdWx0VGlja0NvdW50ID0gdGlja0NvdW50IHx8IDU7XG4gICAgdmFyIHNjYWxlVGlja3MgPSBzY2FsZS50aWNrcyhkZWZhdWx0VGlja0NvdW50KTtcbiAgICB2YXIgc2NhbGVkVGlja0FycmF5ID0gQXJyYXkuaXNBcnJheShzY2FsZVRpY2tzKSAmJiBzY2FsZVRpY2tzLmxlbmd0aCA/IHNjYWxlVGlja3MgOiBzY2FsZS5kb21haW4oKTtcbiAgICB2YXIgdGlja3MgPSBkb3duc2FtcGxlVGlja3Moc2NhbGVkVGlja0FycmF5LCB0aWNrQ291bnQpO1xuXG4gICAgaWYgKGZpbHRlclplcm8pIHtcbiAgICAgIHZhciBmaWx0ZXJlZFRpY2tzID0gX2luY2x1ZGVzKHRpY2tzLCAwKSA/IF93aXRob3V0KHRpY2tzLCAwKSA6IHRpY2tzO1xuICAgICAgcmV0dXJuIGZpbHRlcmVkVGlja3MubGVuZ3RoID8gZmlsdGVyZWRUaWNrcyA6IHRpY2tzO1xuICAgIH1cblxuICAgIHJldHVybiB0aWNrcztcbiAgfVxuXG4gIHJldHVybiBzY2FsZS5kb21haW4oKTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGRvbWFpbiBiYXNlZCB0aWNrVmFsdWVzXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHM6IHRoZSBwcm9wcyBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBheGlzOiBlaXRoZXIgeCBvciB5XG4gKiBAcmV0dXJucyB7QXJyYXl9IHJldHVybnMgYSBkb21haW4gZnJvbSB0aWNrVmFsdWVzXG4gKi9cbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG5cbmZ1bmN0aW9uIGdldERvbWFpbkZyb21EYXRhKHByb3BzLCBheGlzKSB7XG4gIHZhciBwb2xhciA9IHByb3BzLnBvbGFyLFxuICAgICAgX3Byb3BzJHN0YXJ0QW5nbGUgPSBwcm9wcy5zdGFydEFuZ2xlLFxuICAgICAgc3RhcnRBbmdsZSA9IF9wcm9wcyRzdGFydEFuZ2xlID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJHN0YXJ0QW5nbGUsXG4gICAgICBfcHJvcHMkZW5kQW5nbGUgPSBwcm9wcy5lbmRBbmdsZSxcbiAgICAgIGVuZEFuZ2xlID0gX3Byb3BzJGVuZEFuZ2xlID09PSB2b2lkIDAgPyAzNjAgOiBfcHJvcHMkZW5kQW5nbGU7XG4gIHZhciB0aWNrQXJyYXkgPSBnZXRUaWNrQXJyYXkocHJvcHMpO1xuICB2YXIgdGlja1ZhbHVlcyA9IHRpY2tBcnJheSA/IHRpY2tBcnJheS5tYXAoZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gdi52YWx1ZTtcbiAgfSkgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHRpY2tWYWx1ZXMpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBtaW5Eb21haW4gPSBEb21haW4uZ2V0TWluRnJvbVByb3BzKHByb3BzLCBheGlzKTtcbiAgdmFyIG1heERvbWFpbiA9IERvbWFpbi5nZXRNYXhGcm9tUHJvcHMocHJvcHMsIGF4aXMpO1xuICB2YXIgdGlja1N0cmluZ3MgPSBzdHJpbmdUaWNrcyhwcm9wcyk7XG4gIHZhciB0aWNrcyA9IHRpY2tWYWx1ZXMubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiArdmFsdWU7XG4gIH0pO1xuICB2YXIgZGVmYXVsdE1pbiA9IHRpY2tTdHJpbmdzID8gMSA6IENvbGxlY3Rpb24uZ2V0TWluVmFsdWUodGlja3MpO1xuICB2YXIgZGVmYXVsdE1heCA9IHRpY2tTdHJpbmdzID8gdGlja1ZhbHVlcy5sZW5ndGggOiBDb2xsZWN0aW9uLmdldE1heFZhbHVlKHRpY2tzKTtcbiAgdmFyIG1pbiA9IG1pbkRvbWFpbiAhPT0gdW5kZWZpbmVkID8gbWluRG9tYWluIDogZGVmYXVsdE1pbjtcbiAgdmFyIG1heCA9IG1heERvbWFpbiAhPT0gdW5kZWZpbmVkID8gbWF4RG9tYWluIDogZGVmYXVsdE1heDtcbiAgdmFyIGluaXRpYWxEb21haW4gPSBEb21haW4uZ2V0RG9tYWluRnJvbU1pbk1heChtaW4sIG1heCk7XG4gIHZhciBkb21haW4gPSBwb2xhciAmJiBheGlzID09PSBcInhcIiAmJiBNYXRoLmFicyhzdGFydEFuZ2xlIC0gZW5kQW5nbGUpID09PSAzNjAgPyBEb21haW4uZ2V0U3ltbWV0cmljRG9tYWluKGluaXRpYWxEb21haW4sIHRpY2tzKSA6IGluaXRpYWxEb21haW47XG5cbiAgaWYgKGlzVmVydGljYWwocHJvcHMpICYmICFwb2xhcikge1xuICAgIGRvbWFpbi5yZXZlcnNlKCk7XG4gIH1cblxuICByZXR1cm4gZG9tYWluO1xufSAvLyBleHBvc2VkIGZvciB1c2UgYnkgVmljdG9yeUNoYXJ0XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERvbWFpbihwcm9wcywgYXhpcykge1xuICB2YXIgaW5oZXJlbnRBeGlzID0gZ2V0QXhpcyhwcm9wcyk7XG5cbiAgaWYgKGF4aXMgJiYgYXhpcyAhPT0gaW5oZXJlbnRBeGlzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBEb21haW4uY3JlYXRlRG9tYWluRnVuY3Rpb24oZ2V0RG9tYWluRnJvbURhdGEpKHByb3BzLCBpbmhlcmVudEF4aXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEF4aXNWYWx1ZShwcm9wcywgYXhpcykge1xuICBpZiAoIXByb3BzLmF4aXNWYWx1ZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgc2NhbGVBeGlzID0gYXhpcyA9PT0gXCJ4XCIgPyBcInlcIiA6IFwieFwiO1xuICB2YXIgc2NhbGUgPSBfaXNPYmplY3QocHJvcHMuc2NhbGUpICYmIF9pc0Z1bmN0aW9uKHByb3BzLnNjYWxlW3NjYWxlQXhpc10pID8gcHJvcHMuc2NhbGVbc2NhbGVBeGlzXSA6IHVuZGVmaW5lZDtcblxuICBpZiAoIXNjYWxlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBzdHJpbmdNYXBBeGlzID0gYXhpcyA9PT0gXCJ4XCIgPyBcInlcIiA6IFwieFwiO1xuICB2YXIgc3RyaW5nTWFwID0gX2lzT2JqZWN0KHByb3BzLnN0cmluZ01hcCkgJiYgcHJvcHMuc3RyaW5nTWFwW3N0cmluZ01hcEF4aXNdO1xuICB2YXIgYXhpc1ZhbHVlID0gc3RyaW5nTWFwICYmIHR5cGVvZiBwcm9wcy5heGlzVmFsdWUgPT09IFwic3RyaW5nXCIgPyBzdHJpbmdNYXBbcHJvcHMuYXhpc1ZhbHVlXSA6IHByb3BzLmF4aXNWYWx1ZTtcbiAgcmV0dXJuIHNjYWxlKGF4aXNWYWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbW9kaWZ5UHJvcHMocHJvcHMsIGZhbGxiYWNrUHJvcHMpIHtcbiAgaWYgKCFfaXNPYmplY3QocHJvcHMudGhlbWUpKSB7XG4gICAgcmV0dXJuIEhlbHBlcnMubW9kaWZ5UHJvcHMocHJvcHMsIGZhbGxiYWNrUHJvcHMsIFwiYXhpc1wiKTtcbiAgfVxuXG4gIHZhciByb2xlID0gXCJheGlzXCI7XG5cbiAgaWYgKHByb3BzLmRlcGVuZGVudEF4aXMgJiYgcHJvcHMudGhlbWUuZGVwZW5kZW50QXhpcykge1xuICAgIHJvbGUgPSBcImRlcGVuZGVudEF4aXNcIjtcbiAgfSBlbHNlIGlmICghcHJvcHMuZGVwZW5kZW50QXhpcyAmJiBwcm9wcy50aGVtZS5pbmRlcGVuZGVudEF4aXMpIHtcbiAgICByb2xlID0gXCJpbmRlcGVuZGVudEF4aXNcIjtcbiAgfVxuXG4gIGlmIChyb2xlID09PSBcImF4aXNcIikge1xuICAgIHJldHVybiBIZWxwZXJzLm1vZGlmeVByb3BzKHByb3BzLCBmYWxsYmFja1Byb3BzLCBcImF4aXNcIik7XG4gIH1cblxuICB2YXIgYXhpc1RoZW1lID0gX2RlZmF1bHRzKHt9LCBwcm9wcy50aGVtZVtyb2xlXSwgcHJvcHMudGhlbWUuYXhpcyk7XG5cbiAgdmFyIHRoZW1lID0gX2Fzc2lnbih7fSwgcHJvcHMudGhlbWUsIHtcbiAgICBheGlzOiBheGlzVGhlbWVcbiAgfSk7XG5cbiAgcmV0dXJuIEhlbHBlcnMubW9kaWZ5UHJvcHMoX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB0aGVtZTogdGhlbWVcbiAgfSksIGZhbGxiYWNrUHJvcHMsIFwiYXhpc1wiKTtcbn0iLCIvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovXG5cbi8qKlxuICogR2l2ZW4gYW4gb2JqZWN0IHdpdGggQ1NTL1NWRyB0cmFuc2Zvcm0gZGVmaW5pdGlvbnMsIHJldHVybiB0aGUgc3RyaW5nIHZhbHVlXG4gKiBmb3IgdXNlIHdpdGggdGhlIGB0cmFuc2Zvcm1gIENTUyBwcm9wZXJ0eSBvciBTVkcgYXR0cmlidXRlLiBOb3RlIHRoYXQgd2VcbiAqIGNhbid0IGFsd2F5cyBndWFyYW50ZWUgdGhlIG9yZGVyIHdpbGwgbWF0Y2ggdGhlIGF1dGhvcidzIGludGVuZGVkIG9yZGVyLCBzb1xuICogYXV0aG9ycyBzaG91bGQgb25seSB1c2UgdGhlIG9iamVjdCBub3RhdGlvbiBpZiB0aGV5IGtub3cgdGhhdCB0aGVpciB0cmFuc2Zvcm1cbiAqIGlzIGNvbW11dGF0aXZlIG9yIHRoYXQgdGhlcmUgaXMgb25seSBvbmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIEFuIG9iamVjdCBvZiB0cmFuc2Zvcm0gZGVmaW5pdGlvbnMuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHRyYW5zZm9ybSBzdHJpbmcuXG4gKi9cbmV4cG9ydCB2YXIgdG9UcmFuc2Zvcm1TdHJpbmcgPSBmdW5jdGlvbiAob2JqKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtb3JlID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtb3JlW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChtb3JlLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gbW9yZS5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIGN1cnJlbnRPYmopIHtcbiAgICAgIHJldHVybiBbbWVtbywgdG9UcmFuc2Zvcm1TdHJpbmcoY3VycmVudE9iaildLmpvaW4oXCIgXCIpO1xuICAgIH0sIHRvVHJhbnNmb3JtU3RyaW5nKG9iaikpLnRyaW0oKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAob2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgdmFyIHRyYW5zZm9ybXMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgdHJhbnNmb3Jtcy5wdXNoKFwiXCIuY29uY2F0KGtleSwgXCIoXCIpLmNvbmNhdCh2YWx1ZSwgXCIpXCIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJhbnNmb3Jtcy5qb2luKFwiIFwiKS50cmltKCk7XG4gIH1cbn07XG4vKipcbiAqIEdpdmVuIHRoZSBuYW1lIG9mIGEgY29sb3Igc2NhbGUsIGdldENvbG9yU2NhbGUgd2lsbCByZXR1cm4gYW4gYXJyYXlcbiAqIG9mIDUgaGV4IHN0cmluZyB2YWx1ZXMgaW4gdGhhdCBjb2xvciBzY2FsZS4gSWYgbm8gJ25hbWUnIHBhcmFtZXRlclxuICogaXMgZ2l2ZW4sIGl0IHdpbGwgcmV0dXJuIHRoZSBWaWN0b3J5IGRlZmF1bHQgZ3JheXNjYWxlLlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbG9yIHNjYWxlIHRvIHJldHVybiAob3B0aW9uYWwpLlxuICogQHJldHVybnMge0FycmF5fSBBbiBhcnJheSBvZiA1IGhleCBzdHJpbmcgdmFsdWVzIGNvbXBvc2luZyBhIGNvbG9yIHNjYWxlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2xvclNjYWxlKG5hbWUpIHtcbiAgdmFyIHNjYWxlcyA9IHtcbiAgICBncmF5c2NhbGU6IFtcIiNjY2NjY2NcIiwgXCIjOTY5Njk2XCIsIFwiIzYzNjM2M1wiLCBcIiMyNTI1MjVcIl0sXG4gICAgcXVhbGl0YXRpdmU6IFtcIiMzMzRENUNcIiwgXCIjNDVCMjlEXCIsIFwiI0VGQzk0Q1wiLCBcIiNFMjdBM0ZcIiwgXCIjREY1QTQ5XCIsIFwiIzRGN0RBMVwiLCBcIiM1NURCQzFcIiwgXCIjRUZEQTk3XCIsIFwiI0UyQTM3RlwiLCBcIiNERjk0OEFcIl0sXG4gICAgaGVhdG1hcDogW1wiIzQyODUxN1wiLCBcIiM3N0QyMDBcIiwgXCIjRDZEMzA1XCIsIFwiI0VDOEUxOVwiLCBcIiNDOTJCMDVcIl0sXG4gICAgd2FybTogW1wiIzk0MDAzMVwiLCBcIiNDNDMzNDNcIiwgXCIjREM1NDI5XCIsIFwiI0ZGODIxRFwiLCBcIiNGRkFGNTVcIl0sXG4gICAgY29vbDogW1wiIzI3NDZCOVwiLCBcIiMwQjY5RDRcIiwgXCIjMjc5NERCXCIsIFwiIzMxQkI3NlwiLCBcIiM2MEU4M0JcIl0sXG4gICAgcmVkOiBbXCIjRkNBRTkxXCIsIFwiI0ZCNkE0QVwiLCBcIiNERTJEMjZcIiwgXCIjQTUwRjE1XCIsIFwiIzc1MEIwRVwiXSxcbiAgICBibHVlOiBbXCIjMDAyQzYxXCIsIFwiIzAwNEI4RlwiLCBcIiMwMDZCQzlcIiwgXCIjMzc5NUU1XCIsIFwiIzY1QjRGNFwiXSxcbiAgICBncmVlbjogW1wiIzM1NDcyMlwiLCBcIiM0NjY2MzFcIiwgXCIjNjQ5MTQ2XCIsIFwiIzhBQjI1Q1wiLCBcIiNBOUM5N0VcIl1cbiAgfTtcbiAgcmV0dXJuIG5hbWUgPyBzY2FsZXNbbmFtZV0gOiBzY2FsZXMuZ3JheXNjYWxlO1xufSIsImltcG9ydCBfa2V5cyBmcm9tIFwibG9kYXNoL2tleXNcIjtcbmltcG9ydCBfaW5jbHVkZXMgZnJvbSBcImxvZGFzaC9pbmNsdWRlc1wiO1xuaW1wb3J0IF91bmlxIGZyb20gXCJsb2Rhc2gvdW5pcVwiO1xuaW1wb3J0IF9vbWl0QnkgZnJvbSBcImxvZGFzaC9vbWl0QnlcIjtcbmltcG9ydCBfcGlja0J5IGZyb20gXCJsb2Rhc2gvcGlja0J5XCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC93aXRob3V0XCI7XG5pbXBvcnQgX2lzRnVuY3Rpb24gZnJvbSBcImxvZGFzaC9pc0Z1bmN0aW9uXCI7XG5pbXBvcnQgX2lzRW1wdHkgZnJvbSBcImxvZGFzaC9pc0VtcHR5XCI7XG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gfVxuXG52YXIgR0xPQkFMX0VWRU5UX1JFR0VYID0gL15vbkdsb2JhbCguKikkLztcbi8qIFJldHVybnMgYWxsIG93biBhbmQgc2hhcmVkIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBhdHRhY2hlZCB0byBhIHNpbmdsZSB0YXJnZXQgZWxlbWVudCxcbiAqIGkuZS4gYW4gaW5kaXZpZHVhbCBiYXIgc3BlY2lmaWVkIGJ5IHRhcmdldDogXCJkYXRhXCIsIGV2ZW50S2V5OiBbaW5kZXhdLlxuICogUmV0dXJuZWQgZXZlbnRzIGFyZSBzY29wZWQgdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXRlLiBFaXRoZXIgdGhhdCBvZiB0aGUgY29tcG9uZW50IGl0c2VsZlxuICogKGkuZS4gVmljdG9yeUJhcikgaW4gdGhlIGNhc2Ugb2Ygb3duIGV2ZW50cywgb3IgdGhhdCBvZiB0aGUgcGFyZW50IGNvbXBvbmVudFxuICogKGkuZS4gVmljdG9yeUNoYXJ0KSBpbiB0aGUgY2FzZSBvZiBzaGFyZWQgZXZlbnRzXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zLG5vLXNoYWRvd1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnRzKHByb3BzLCB0YXJnZXQsIGV2ZW50S2V5LCBnZXRTY29wZWRFdmVudHMpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICAvLyBSZXR1cm5zIGFsbCBldmVudHMgdGhhdCBhcHBseSB0byBhIHBhcnRpY3VsYXIgdGFyZ2V0IGVsZW1lbnRcbiAgdmFyIGdldEV2ZW50c0J5VGFyZ2V0ID0gZnVuY3Rpb24gKGV2ZW50cykge1xuICAgIHZhciBnZXRTZWxlY3RlZEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0YXJnZXRFdmVudHMgPSBldmVudHMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YXIgbWF0Y2hlc1RhcmdldCA9IEFycmF5LmlzQXJyYXkoZXZlbnQudGFyZ2V0KSA/IF9pbmNsdWRlcyhldmVudC50YXJnZXQsIHRhcmdldCkgOiBcIlwiLmNvbmNhdChldmVudC50YXJnZXQpID09PSBcIlwiLmNvbmNhdCh0YXJnZXQpO1xuICAgICAgICAgIHJldHVybiBtYXRjaGVzVGFyZ2V0ID8gbWVtby5jb25jYXQoZXZlbnQpIDogbWVtbztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtZW1vLmNvbmNhdChldmVudCk7XG4gICAgICB9LCBbXSk7XG5cbiAgICAgIGlmIChldmVudEtleSAhPT0gdW5kZWZpbmVkICYmIHRhcmdldCAhPT0gXCJwYXJlbnRcIikge1xuICAgICAgICByZXR1cm4gdGFyZ2V0RXZlbnRzLmZpbHRlcihmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgdmFyIHRhcmdldEtleXMgPSBvYmouZXZlbnRLZXk7XG5cbiAgICAgICAgICB2YXIgdXNlS2V5ID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGtleSA/IFwiXCIuY29uY2F0KGtleSkgPT09IFwiXCIuY29uY2F0KGV2ZW50S2V5KSA6IHRydWU7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRhcmdldEtleXMpID8gdGFyZ2V0S2V5cy5zb21lKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgICByZXR1cm4gdXNlS2V5KGspO1xuICAgICAgICAgIH0pIDogdXNlS2V5KHRhcmdldEtleXMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldEV2ZW50cztcbiAgICB9O1xuXG4gICAgdmFyIHNlbGVjdGVkRXZlbnRzID0gZ2V0U2VsZWN0ZWRFdmVudHMoKTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShzZWxlY3RlZEV2ZW50cykgJiYgc2VsZWN0ZWRFdmVudHMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50ID8gX2Fzc2lnbihtZW1vLCBldmVudC5ldmVudEhhbmRsZXJzKSA6IG1lbW87XG4gICAgfSwge30pO1xuICB9O1xuICAvKiBSZXR1cm5zIGFsbCBldmVudHMgZnJvbSBwcm9wcyBhbmQgZGVmYXVsdEV2ZW50cyBmcm9tIGNvbXBvbmVudHMuIEV2ZW50cyBoYW5kbGVyc1xuICAgKiBzcGVjaWZpZWQgaW4gcHJvcHMgd2lsbCBvdmVycmlkZSBoYW5kbGVycyBmb3IgdGhlIHNhbWUgZXZlbnQgaWYgdGhleSBhcmUgYWxzb1xuICAgKiBzcGVjaWZpZWQgaW4gZGVmYXVsdEV2ZW50cyBvZiBhIHN1Yi1jb21wb25lbnRcbiAgICovXG5cblxuICB2YXIgZ2V0QWxsRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIE1hbmRhdG9yeSB1c2FnZTogYGdldEV2ZW50cy5iaW5kKHRoaXMpYFxuXG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoX3RoaXMuY29tcG9uZW50RXZlbnRzKSkge1xuICAgICAgdmFyIF90aGlzJGNvbXBvbmVudEV2ZW50cztcblxuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocHJvcHMuZXZlbnRzKSA/IChfdGhpcyRjb21wb25lbnRFdmVudHMgPSBfdGhpcy5jb21wb25lbnRFdmVudHMpLmNvbmNhdC5hcHBseShfdGhpcyRjb21wb25lbnRFdmVudHMsIF90b0NvbnN1bWFibGVBcnJheShwcm9wcy5ldmVudHMpKSA6IF90aGlzLmNvbXBvbmVudEV2ZW50cztcbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblxuXG4gICAgcmV0dXJuIHByb3BzLmV2ZW50cztcbiAgfTtcblxuICB2YXIgYWxsRXZlbnRzID0gZ2V0QWxsRXZlbnRzKCk7XG4gIHZhciBvd25FdmVudHMgPSBhbGxFdmVudHMgJiYgX2lzRnVuY3Rpb24oZ2V0U2NvcGVkRXZlbnRzKSA/IGdldFNjb3BlZEV2ZW50cyhnZXRFdmVudHNCeVRhcmdldChhbGxFdmVudHMpLCB0YXJnZXQpIDogdW5kZWZpbmVkO1xuXG4gIGlmICghcHJvcHMuc2hhcmVkRXZlbnRzKSB7XG4gICAgcmV0dXJuIG93bkV2ZW50cztcbiAgfVxuXG4gIHZhciBnZXRTaGFyZWRFdmVudHMgPSBwcm9wcy5zaGFyZWRFdmVudHMuZ2V0RXZlbnRzO1xuICB2YXIgc2hhcmVkRXZlbnRzID0gcHJvcHMuc2hhcmVkRXZlbnRzLmV2ZW50cyAmJiBnZXRTaGFyZWRFdmVudHMoZ2V0RXZlbnRzQnlUYXJnZXQocHJvcHMuc2hhcmVkRXZlbnRzLmV2ZW50cyksIHRhcmdldCk7XG4gIHJldHVybiBfYXNzaWduKHt9LCBzaGFyZWRFdmVudHMsIG93bkV2ZW50cyk7XG59XG4vKiBSZXR1cm5zIGEgbW9kaWZpZWQgZXZlbnRzIG9iamVjdCB3aGVyZSBlYWNoIGV2ZW50IGhhbmRsZXIgaXMgcmVwbGFjZWQgYnkgYSBuZXdcbiAqIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIG9yaWdpbmFsIGhhbmRsZXIgYW5kIHRoZW4gY2FsbHMgc2V0U3RhdGUgd2l0aCB0aGUgcmV0dXJuXG4gKiBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgaGFuZGxlciBhc3NpZ25lZCB0byBzdGF0ZSBwcm9wZXJ0eSB0aGF0IG1hcHMgdG8gdGhlIHRhcmdldFxuICogZWxlbWVudC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjb3BlZEV2ZW50cyhldmVudHMsIG5hbWVzcGFjZSwgY2hpbGRUeXBlLCBiYXNlUHJvcHMpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgaWYgKF9pc0VtcHR5KGV2ZW50cykpIHtcbiAgICByZXR1cm4ge307XG4gIH0gLy8gTWFuZGF0b3J5IHVzYWdlOiBgZ2V0U2NvcGVkRXZlbnRzLmJpbmQodGhpcylgXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbnZhbGlkLXRoaXNcblxuXG4gIGJhc2VQcm9wcyA9IGJhc2VQcm9wcyB8fCB0aGlzLmJhc2VQcm9wczsgLy8gcmV0dXJucyB0aGUgb3JpZ2luYWwgYmFzZSBwcm9wcyBvciBiYXNlIHN0YXRlIG9mIGEgZ2l2ZW4gdGFyZ2V0IGVsZW1lbnRcblxuICB2YXIgZ2V0VGFyZ2V0UHJvcHMgPSBmdW5jdGlvbiAoaWRlbnRpZmllciwgdHlwZSkge1xuICAgIHZhciBjaGlsZE5hbWUgPSBpZGVudGlmaWVyLmNoaWxkTmFtZSxcbiAgICAgICAgdGFyZ2V0ID0gaWRlbnRpZmllci50YXJnZXQsXG4gICAgICAgIGtleSA9IGlkZW50aWZpZXIua2V5OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW52YWxpZC10aGlzXG5cbiAgICB2YXIgYmFzZVR5cGUgPSB0eXBlID09PSBcInByb3BzXCIgPyBiYXNlUHJvcHMgOiBfdGhpczIuc3RhdGUgfHwge307XG4gICAgdmFyIGJhc2UgPSBjaGlsZE5hbWUgPT09IHVuZGVmaW5lZCB8fCBjaGlsZE5hbWUgPT09IG51bGwgfHwgIWJhc2VUeXBlW2NoaWxkTmFtZV0gPyBiYXNlVHlwZSA6IGJhc2VUeXBlW2NoaWxkTmFtZV07XG4gICAgcmV0dXJuIGtleSA9PT0gXCJwYXJlbnRcIiA/IGJhc2UucGFyZW50IDogYmFzZVtrZXldICYmIGJhc2Vba2V5XVt0YXJnZXRdO1xuICB9OyAvLyBSZXR1cm5zIHRoZSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgbXV0YXRpb24gY2F1c2VkIGJ5IGEgZ2l2ZW4gZXZlbnRSZXR1cm5cbiAgLy8gYXBwbGllZCB0byB0aGUgYXBwcm9wcmlhdGUgcHJvcGVydHkgb24gdGhlIHN0YXRlIG9iamVjdFxuXG5cbiAgdmFyIHBhcnNlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnRSZXR1cm4sIGV2ZW50S2V5KSB7XG4gICAgdmFyIGNoaWxkTmFtZXMgPSBuYW1lc3BhY2UgPT09IFwicGFyZW50XCIgPyBldmVudFJldHVybi5jaGlsZE5hbWUgOiBldmVudFJldHVybi5jaGlsZE5hbWUgfHwgY2hpbGRUeXBlO1xuICAgIHZhciB0YXJnZXQgPSBldmVudFJldHVybi50YXJnZXQgfHwgbmFtZXNwYWNlOyAvLyByZXR1cm5zIGFsbCBldmVudEtleXMgdG8gbW9kaWZ5IGZvciBhIHRhcmdldGVkIGNoaWxkTmFtZVxuXG4gICAgdmFyIGdldEtleXMgPSBmdW5jdGlvbiAoY2hpbGROYW1lKSB7XG4gICAgICBpZiAodGFyZ2V0ID09PSBcInBhcmVudFwiKSB7XG4gICAgICAgIHJldHVybiBcInBhcmVudFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRSZXR1cm4uZXZlbnRLZXkgPT09IFwiYWxsXCIpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VQcm9wc1tjaGlsZE5hbWVdID8gX3dpdGhvdXQoX2tleXMoYmFzZVByb3BzW2NoaWxkTmFtZV0pLCBcInBhcmVudFwiKSA6IF93aXRob3V0KF9rZXlzKGJhc2VQcm9wcyksIFwicGFyZW50XCIpO1xuICAgICAgfSBlbHNlIGlmIChldmVudFJldHVybi5ldmVudEtleSA9PT0gdW5kZWZpbmVkICYmIGV2ZW50S2V5ID09PSBcInBhcmVudFwiKSB7XG4gICAgICAgIHJldHVybiBiYXNlUHJvcHNbY2hpbGROYW1lXSA/IF9rZXlzKGJhc2VQcm9wc1tjaGlsZE5hbWVdKSA6IF9rZXlzKGJhc2VQcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBldmVudFJldHVybi5ldmVudEtleSAhPT0gdW5kZWZpbmVkID8gZXZlbnRSZXR1cm4uZXZlbnRLZXkgOiBldmVudEtleTtcbiAgICB9OyAvLyByZXR1cm5zIHRoZSBzdGF0ZSBvYmplY3Qgd2l0aCBtdXRhdGVkIHByb3BzIGFwcGxpZWQgZm9yIGEgc2luZ2xlIGtleVxuXG5cbiAgICB2YXIgZ2V0TXV0YXRpb25PYmplY3QgPSBmdW5jdGlvbiAoa2V5LCBjaGlsZE5hbWUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbnZhbGlkLXRoaXNcbiAgICAgIHZhciBiYXNlU3RhdGUgPSBfdGhpczIuc3RhdGUgfHwge307XG5cbiAgICAgIGlmICghX2lzRnVuY3Rpb24oZXZlbnRSZXR1cm4ubXV0YXRpb24pKSB7XG4gICAgICAgIHJldHVybiBiYXNlU3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHZhciBtdXRhdGlvblRhcmdldFByb3BzID0gZ2V0VGFyZ2V0UHJvcHMoe1xuICAgICAgICBjaGlsZE5hbWU6IGNoaWxkTmFtZSxcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgICB9LCBcInByb3BzXCIpO1xuICAgICAgdmFyIG11dGF0aW9uVGFyZ2V0U3RhdGUgPSBnZXRUYXJnZXRQcm9wcyh7XG4gICAgICAgIGNoaWxkTmFtZTogY2hpbGROYW1lLFxuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICAgIH0sIFwic3RhdGVcIik7XG4gICAgICB2YXIgbXV0YXRlZFByb3BzID0gZXZlbnRSZXR1cm4ubXV0YXRpb24oX2Fzc2lnbih7fSwgbXV0YXRpb25UYXJnZXRQcm9wcywgbXV0YXRpb25UYXJnZXRTdGF0ZSksIGJhc2VQcm9wcyk7XG4gICAgICB2YXIgY2hpbGRTdGF0ZSA9IGJhc2VTdGF0ZVtjaGlsZE5hbWVdIHx8IHt9O1xuXG4gICAgICB2YXIgZmlsdGVyU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgaWYgKHN0YXRlW2tleV0gJiYgc3RhdGVba2V5XVt0YXJnZXRdKSB7XG4gICAgICAgICAgZGVsZXRlIHN0YXRlW2tleV1bdGFyZ2V0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZVtrZXldICYmICFfa2V5cyhzdGF0ZVtrZXldKS5sZW5ndGgpIHtcbiAgICAgICAgICBkZWxldGUgc3RhdGVba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBleHRlbmRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0ID09PSBcInBhcmVudFwiID8gX2Fzc2lnbihzdGF0ZSwgX2RlZmluZVByb3BlcnR5KHt9LCBrZXksIF9hc3NpZ24oc3RhdGVba2V5XSwgbXV0YXRlZFByb3BzKSkpIDogX2Fzc2lnbihzdGF0ZSwgX2RlZmluZVByb3BlcnR5KHt9LCBrZXksIF9hc3NpZ24oc3RhdGVba2V5XSwgX2RlZmluZVByb3BlcnR5KHt9LCB0YXJnZXQsIG11dGF0ZWRQcm9wcykpKSk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgdXBkYXRlU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIG11dGF0ZWRQcm9wcyA/IGV4dGVuZFN0YXRlKHN0YXRlKSA6IGZpbHRlclN0YXRlKHN0YXRlKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBjaGlsZE5hbWUgIT09IHVuZGVmaW5lZCAmJiBjaGlsZE5hbWUgIT09IG51bGwgPyBfYXNzaWduKGJhc2VTdGF0ZSwgX2RlZmluZVByb3BlcnR5KHt9LCBjaGlsZE5hbWUsIHVwZGF0ZVN0YXRlKGNoaWxkU3RhdGUpKSkgOiB1cGRhdGVTdGF0ZShiYXNlU3RhdGUpO1xuICAgIH07IC8vIHJldHVybnMgZW50aXJlIG11dGF0ZWQgc3RhdGUgZm9yIGEgZ2l2ZW4gY2hpbGROYW1lXG5cblxuICAgIHZhciBnZXRSZXR1cm5CeUNoaWxkID0gZnVuY3Rpb24gKGNoaWxkTmFtZSkge1xuICAgICAgdmFyIG11dGF0aW9uS2V5cyA9IGdldEtleXMoY2hpbGROYW1lKTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG11dGF0aW9uS2V5cykgPyBtdXRhdGlvbktleXMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIF9hc3NpZ24obWVtbywgZ2V0TXV0YXRpb25PYmplY3Qoa2V5LCBjaGlsZE5hbWUpKTtcbiAgICAgIH0sIHt9KSA6IGdldE11dGF0aW9uT2JqZWN0KG11dGF0aW9uS2V5cywgY2hpbGROYW1lKTtcbiAgICB9OyAvLyByZXR1cm5zIGFuIGVudGlyZSBtdXRhdGVkIHN0YXRlIGZvciBhbGwgY2hpbGRyZW5cblxuXG4gICAgdmFyIGFsbENoaWxkTmFtZXMgPSBjaGlsZE5hbWVzID09PSBcImFsbFwiID8gX3dpdGhvdXQoX2tleXMoYmFzZVByb3BzKSwgXCJwYXJlbnRcIikgOiBjaGlsZE5hbWVzO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFsbENoaWxkTmFtZXMpID8gYWxsQ2hpbGROYW1lcy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIGNoaWxkTmFtZSkge1xuICAgICAgcmV0dXJuIF9hc3NpZ24obWVtbywgZ2V0UmV0dXJuQnlDaGlsZChjaGlsZE5hbWUpKTtcbiAgICB9LCB7fSkgOiBnZXRSZXR1cm5CeUNoaWxkKGFsbENoaWxkTmFtZXMpO1xuICB9OyAvLyBQYXJzZXMgYW4gYXJyYXkgb2YgZXZlbnQgcmV0dXJucyBpbnRvIGEgc2luZ2xlIHN0YXRlIG11dGF0aW9uXG5cblxuICB2YXIgcGFyc2VFdmVudFJldHVybiA9IGZ1bmN0aW9uIChldmVudFJldHVybiwgZXZlbnRLZXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShldmVudFJldHVybikgPyBldmVudFJldHVybi5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIHByb3BzKSB7XG4gICAgICBtZW1vID0gX2Fzc2lnbih7fSwgbWVtbywgcGFyc2VFdmVudChwcm9wcywgZXZlbnRLZXkpKTtcbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH0sIHt9KSA6IHBhcnNlRXZlbnQoZXZlbnRSZXR1cm4sIGV2ZW50S2V5KTtcbiAgfTtcblxuICB2YXIgY29tcGlsZUNhbGxiYWNrcyA9IGZ1bmN0aW9uIChldmVudFJldHVybikge1xuICAgIHZhciBnZXRDYWxsYmFjayA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiBfaXNGdW5jdGlvbihvYmouY2FsbGJhY2spICYmIG9iai5jYWxsYmFjaztcbiAgICB9O1xuXG4gICAgdmFyIGNhbGxiYWNrcyA9IEFycmF5LmlzQXJyYXkoZXZlbnRSZXR1cm4pID8gZXZlbnRSZXR1cm4ubWFwKGZ1bmN0aW9uIChldnRPYmopIHtcbiAgICAgIHJldHVybiBnZXRDYWxsYmFjayhldnRPYmopO1xuICAgIH0pIDogW2dldENhbGxiYWNrKGV2ZW50UmV0dXJuKV07XG4gICAgdmFyIGNhbGxiYWNrQXJyYXkgPSBjYWxsYmFja3MuZmlsdGVyKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrICE9PSBmYWxzZTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2FsbGJhY2tBcnJheS5sZW5ndGggPyBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2tBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH0gOiB1bmRlZmluZWQ7XG4gIH07IC8vIEEgZnVuY3Rpb24gdGhhdCBjYWxscyBhIHBhcnRpY3VsYXIgZXZlbnQgaGFuZGxlciwgcGFyc2VzIGl0cyByZXR1cm5cbiAgLy8gaW50byBhIHN0YXRlIG11dGF0aW9uLCBhbmQgY2FsbHMgc2V0U3RhdGVcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcblxuXG4gIHZhciBvbkV2ZW50ID0gZnVuY3Rpb24gKGV2dCwgY2hpbGRQcm9wcywgZXZlbnRLZXksIGV2ZW50TmFtZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbnZhbGlkLXRoaXNcbiAgICB2YXIgZXZlbnRSZXR1cm4gPSBldmVudHNbZXZlbnROYW1lXShldnQsIGNoaWxkUHJvcHMsIGV2ZW50S2V5LCBfdGhpczIpO1xuXG4gICAgaWYgKCFfaXNFbXB0eShldmVudFJldHVybikpIHtcbiAgICAgIHZhciBjYWxsYmFja3MgPSBjb21waWxlQ2FsbGJhY2tzKGV2ZW50UmV0dXJuKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWludmFsaWQtdGhpc1xuXG4gICAgICBfdGhpczIuc2V0U3RhdGUocGFyc2VFdmVudFJldHVybihldmVudFJldHVybiwgZXZlbnRLZXkpLCBjYWxsYmFja3MpO1xuICAgIH1cbiAgfTsgLy8gcmV0dXJucyBhIG5ldyBldmVudHMgb2JqZWN0IHdpdGggZW5oYW5jZWQgZXZlbnQgaGFuZGxlcnNcblxuXG4gIHJldHVybiBfa2V5cyhldmVudHMpLnJlZHVjZShmdW5jdGlvbiAobWVtbywgZXZlbnQpIHtcbiAgICBtZW1vW2V2ZW50XSA9IG9uRXZlbnQ7XG4gICAgcmV0dXJuIG1lbW87XG4gIH0sIHt9KTtcbn1cbi8qIFJldHVybnMgYSBwYXJ0aWFsbHkgYXBwbGllZCBldmVudCBoYW5kbGVyIGZvciBhIHNwZWNpZmljIHRhcmdldCBlbGVtZW50XG4gKiBUaGlzIGFsbG93cyBldmVudCBoYW5kbGVycyB0byBoYXZlIGFjY2VzcyB0byBwcm9wcyBjb250cm9sbGluZyBlYWNoIGVsZW1lbnRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFydGlhbEV2ZW50cyhldmVudHMsIGV2ZW50S2V5LCBjaGlsZFByb3BzKSB7XG4gIHJldHVybiBldmVudHMgPyBfa2V5cyhldmVudHMpLnJlZHVjZShmdW5jdGlvbiAobWVtbywgZXZlbnROYW1lKSB7XG4gICAgdmFyIGFwcGxpZWRFdmVudCA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIHJldHVybiBldmVudHNbZXZlbnROYW1lXShldnQsIGNoaWxkUHJvcHMsIGV2ZW50S2V5LCBldmVudE5hbWUpO1xuICAgIH07XG5cbiAgICBtZW1vW2V2ZW50TmFtZV0gPSBhcHBsaWVkRXZlbnQ7XG4gICAgcmV0dXJuIG1lbW87XG4gIH0sIHt9KSA6IHt9O1xufVxuLyogUmV0dXJucyB0aGUgcHJvcGVydHkgb2YgdGhlIHN0YXRlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIGV2ZW50IGNoYW5nZXMgZm9yXG4gKiBhIHBhcnRpY3VsYXIgZWxlbWVudFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFdmVudFN0YXRlKGV2ZW50S2V5LCBuYW1lc3BhY2UsIGNoaWxkVHlwZSkge1xuICAvLyBNYW5kYXRvcnkgdXNhZ2U6IGBnZXRFdmVudFN0YXRlLmJpbmQodGhpcylgXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbnZhbGlkLXRoaXNcbiAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZSB8fCB7fTtcblxuICBpZiAoIWNoaWxkVHlwZSkge1xuICAgIHJldHVybiBldmVudEtleSA9PT0gXCJwYXJlbnRcIiA/IHN0YXRlW2V2ZW50S2V5XSAmJiBzdGF0ZVtldmVudEtleV1bbmFtZXNwYWNlXSB8fCBzdGF0ZVtldmVudEtleV0gOiBzdGF0ZVtldmVudEtleV0gJiYgc3RhdGVbZXZlbnRLZXldW25hbWVzcGFjZV07XG4gIH1cblxuICByZXR1cm4gc3RhdGVbY2hpbGRUeXBlXSAmJiBzdGF0ZVtjaGlsZFR5cGVdW2V2ZW50S2V5XSAmJiBzdGF0ZVtjaGlsZFR5cGVdW2V2ZW50S2V5XVtuYW1lc3BhY2VdO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgc2V0IG9mIGFsbCBtdXRhdGlvbnMgZm9yIHNoYXJlZCBldmVudHNcbiAqXG4gKiBAcGFyYW0gIHtBcnJheX0gbXV0YXRpb25zIGFuIGFycmF5IG9mIG11dGF0aW9ucyBvYmplY3RzXG4gKiBAcGFyYW0gIHtPYmplY3R9IGJhc2VQcm9wcyBhbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgYWxsIHByb3BzIGZvciBjaGlsZHJlbiBvZiBWaWN0b3J5U2hhcmVkRXZlbnRzXG4gKiBAcGFyYW0gIHtPYmplY3R9IGJhc2VTdGF0ZSBhbiBvYmplY3QgdGhhdCBkZXNjcmliZXMgc3RhdGUgZm9yIGNoaWxkcmVuIG9mIFZpY3RvcnlTaGFyZWRFdmVudHNcbiAqIEBwYXJhbSAge0FycmF5fSBjaGlsZE5hbWVzIGFuIGFycmF5IG9mIGNoaWxkTmFtZXNcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IGEgb2JqZWN0IGRlc2NyaWJpbmcgYWxsIG11dGF0aW9ucyBmb3IgVmljdG9yeVNoYXJlZEV2ZW50c1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxNdXRhdGlvbnNXaXRoQ2hpbGRyZW4obXV0YXRpb25zLCBiYXNlUHJvcHMsIGJhc2VTdGF0ZSwgY2hpbGROYW1lcykge1xuICBiYXNlUHJvcHMgPSBiYXNlUHJvcHMgfHwge307XG4gIGJhc2VTdGF0ZSA9IGJhc2VTdGF0ZSB8fCB7fTtcbiAgcmV0dXJuIGNoaWxkTmFtZXMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBjaGlsZE5hbWUpIHtcbiAgICB2YXIgY2hpbGRTdGF0ZSA9IGJhc2VTdGF0ZVtjaGlsZE5hbWVdO1xuICAgIHZhciBtdXRhdGlvbiA9IGdldEV4dGVybmFsTXV0YXRpb25zKG11dGF0aW9ucywgYmFzZVByb3BzW2NoaWxkTmFtZV0sIGJhc2VTdGF0ZVtjaGlsZE5hbWVdLCBjaGlsZE5hbWUpO1xuICAgIG1lbW9bY2hpbGROYW1lXSA9IG11dGF0aW9uID8gbXV0YXRpb24gOiBjaGlsZFN0YXRlO1xuICAgIHJldHVybiBfcGlja0J5KG1lbW8sIGZ1bmN0aW9uICh2KSB7XG4gICAgICByZXR1cm4gIV9pc0VtcHR5KHYpO1xuICAgIH0pO1xuICB9LCB7fSk7XG59XG4vKipcbiAqIFJldHVybnMgYSBzZXQgb2YgYWxsIG11dGF0aW9ucyBmb3IgYSBjb21wb25lbnRcbiAqXG4gKiBAcGFyYW0gIHtBcnJheX0gbXV0YXRpb25zIGFuIGFycmF5IG9mIG11dGF0aW9ucyBvYmplY3RzXG4gKiBAcGFyYW0gIHtPYmplY3R9IGJhc2VQcm9wcyBhIHByb3BzIG9iamVjdCAoc2NvcGVkIHRvIGEgY2hpbGROYW1lIHdoZW4gdXNlZCBieSBzaGFyZWQgZXZlbnRzKVxuICogQHBhcmFtICB7T2JqZWN0fSBiYXNlU3RhdGUgYSBzdGF0ZSBvYmplY3QgKHNjb3BlZCB0byBhIGNoaWxkTmFtZSB3aGVuIHVzZWQgYnkgc2hhcmVkIGV2ZW50cylcbiAqIEBwYXJhbSAge1N0cmluZ30gY2hpbGROYW1lIGFuIG9wdGlvbmFsIGNoaWxkTmFtZVxuICpcbiAqIEByZXR1cm4ge09iamVjdH0gYSBvYmplY3QgZGVzY3JpYmluZyBtdXRhdGlvbnMgZm9yIGEgZ2l2ZW4gY29tcG9uZW50XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlcm5hbE11dGF0aW9ucyhtdXRhdGlvbnMsIGJhc2VQcm9wcywgYmFzZVN0YXRlLCBjaGlsZE5hbWUpIHtcbiAgYmFzZVByb3BzID0gYmFzZVByb3BzIHx8IHt9O1xuICBiYXNlU3RhdGUgPSBiYXNlU3RhdGUgfHwge307XG5cbiAgdmFyIGV2ZW50S2V5cyA9IF9rZXlzKGJhc2VQcm9wcyk7XG5cbiAgcmV0dXJuIGV2ZW50S2V5cy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIGV2ZW50S2V5KSB7XG4gICAgdmFyIGtleVN0YXRlID0gYmFzZVN0YXRlW2V2ZW50S2V5XSB8fCB7fTtcbiAgICB2YXIga2V5UHJvcHMgPSBiYXNlUHJvcHNbZXZlbnRLZXldIHx8IHt9O1xuXG4gICAgaWYgKGV2ZW50S2V5ID09PSBcInBhcmVudFwiKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IHtcbiAgICAgICAgZXZlbnRLZXk6IGV2ZW50S2V5LFxuICAgICAgICB0YXJnZXQ6IFwicGFyZW50XCJcbiAgICAgIH07XG4gICAgICB2YXIgbXV0YXRpb24gPSBnZXRFeHRlcm5hbE11dGF0aW9uKG11dGF0aW9ucywga2V5UHJvcHMsIGtleVN0YXRlLCBpZGVudGlmaWVyKTtcbiAgICAgIG1lbW9bZXZlbnRLZXldID0gbXV0YXRpb24gIT09IHVuZGVmaW5lZCA/IF9hc3NpZ24oe30sIGtleVN0YXRlLCBtdXRhdGlvbikgOiBrZXlTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXNlIGtleXMgZnJvbSBib3RoIHN0YXRlIGFuZCBwcm9wcyBzbyB0aGF0IGVsZW1lbnRzIG5vdCBpbnRpYWxseSBpbmNsdWRlZCBpbiBiYXNlUHJvcHNcbiAgICAgIC8vIHdpbGwgYmUgdXNlZC4gKGkuZS4gbGFiZWxzKVxuICAgICAgdmFyIHRhcmdldHMgPSBfdW5pcShfa2V5cyhrZXlQcm9wcykuY29uY2F0KF9rZXlzKGtleVN0YXRlKSkpO1xuXG4gICAgICBtZW1vW2V2ZW50S2V5XSA9IHRhcmdldHMucmVkdWNlKGZ1bmN0aW9uIChtLCB0YXJnZXQpIHtcbiAgICAgICAgdmFyIGlkZW50aWZpZXIgPSB7XG4gICAgICAgICAgZXZlbnRLZXk6IGV2ZW50S2V5LFxuICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgIGNoaWxkTmFtZTogY2hpbGROYW1lXG4gICAgICAgIH07XG4gICAgICAgIHZhciBtdXRhdGlvbiA9IGdldEV4dGVybmFsTXV0YXRpb24obXV0YXRpb25zLCBrZXlQcm9wc1t0YXJnZXRdLCBrZXlTdGF0ZVt0YXJnZXRdLCBpZGVudGlmaWVyKTtcbiAgICAgICAgbVt0YXJnZXRdID0gbXV0YXRpb24gIT09IHVuZGVmaW5lZCA/IF9hc3NpZ24oe30sIGtleVN0YXRlW3RhcmdldF0sIG11dGF0aW9uKSA6IGtleVN0YXRlW3RhcmdldF07XG4gICAgICAgIHJldHVybiBfcGlja0J5KG0sIGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgcmV0dXJuICFfaXNFbXB0eSh2KTtcbiAgICAgICAgfSk7XG4gICAgICB9LCB7fSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9waWNrQnkobWVtbywgZnVuY3Rpb24gKHYpIHtcbiAgICAgIHJldHVybiAhX2lzRW1wdHkodik7XG4gICAgfSk7XG4gIH0sIHt9KTtcbn1cbi8qKlxuICogUmV0dXJucyBhIHNldCBvZiBtdXRhdGlvbnMgZm9yIGEgcGFydGljdWxhciBlbGVtZW50IGdpdmVuIHNjb3BlZCBiYXNlUHJvcHMgYW5kIGJhc2VTdGF0ZVxuICpcbiAqIEBwYXJhbSAge0FycmF5fSBtdXRhdGlvbnMgYW4gYXJyYXkgb2YgbXV0YXRpb25zIG9iamVjdHNcbiAqIEBwYXJhbSAge09iamVjdH0gYmFzZVByb3BzIGEgcHJvcHMgb2JqZWN0IChzY29wZWQgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBpZGVudGlmaWVyKVxuICogQHBhcmFtICB7T2JqZWN0fSBiYXNlU3RhdGUgYSBzdGF0ZSBvYmplY3QgKHNjb3BlZCB0aGUgZWxlbWVudCBzcGVjaWZpZWQgYnkgdGhlIGlkZW50aWZpZXIpXG4gKiBAcGFyYW0gIHtPYmplY3R9IGlkZW50aWZpZXIgeyBldmVudEtleSwgdGFyZ2V0LCBjaGlsZE5hbWUgfVxuICpcbiAqIEByZXR1cm4ge09iamVjdCB8IHVuZGVmaW5lZH0gYSBvYmplY3QgZGVzY3JpYmluZyBtdXRhdGlvbnMgZm9yIGEgZ2l2ZW4gZWxlbWVudCwgb3IgdW5kZWZpbmVkXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlcm5hbE11dGF0aW9uKG11dGF0aW9ucywgYmFzZVByb3BzLCBiYXNlU3RhdGUsIGlkZW50aWZpZXIpIHtcbiAgdmFyIGZpbHRlck11dGF0aW9ucyA9IGZ1bmN0aW9uIChtdXRhdGlvbiwgdHlwZSkge1xuICAgIGlmICh0eXBlb2YgbXV0YXRpb25bdHlwZV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBtdXRhdGlvblt0eXBlXSA9PT0gXCJhbGxcIiB8fCBtdXRhdGlvblt0eXBlXSA9PT0gaWRlbnRpZmllclt0eXBlXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobXV0YXRpb25bdHlwZV0pKSB7XG4gICAgICAvLyBjb2VyY2UgYXJyYXlzIHRvIHN0cmluZ3MgYmVmb3JlIG1hdGNoaW5nXG4gICAgICB2YXIgc3RyaW5nQXJyYXkgPSBtdXRhdGlvblt0eXBlXS5tYXAoZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgcmV0dXJuIFwiXCIuY29uY2F0KG0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gX2luY2x1ZGVzKHN0cmluZ0FycmF5LCBpZGVudGlmaWVyW3R5cGVdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBtdXRhdGlvbnMgPSBBcnJheS5pc0FycmF5KG11dGF0aW9ucykgPyBtdXRhdGlvbnMgOiBbbXV0YXRpb25zXTtcbiAgdmFyIHNjb3BlZE11dGF0aW9ucyA9IG11dGF0aW9ucztcblxuICBpZiAoaWRlbnRpZmllci5jaGlsZE5hbWUpIHtcbiAgICBzY29wZWRNdXRhdGlvbnMgPSBtdXRhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChtKSB7XG4gICAgICByZXR1cm4gZmlsdGVyTXV0YXRpb25zKG0sIFwiY2hpbGROYW1lXCIpO1xuICAgIH0pO1xuICB9IC8vIGZpbmQgYW55IG11dGF0aW9uIG9iamVjdHMgdGhhdCBtYXRjaCB0aGUgdGFyZ2V0XG5cblxuICB2YXIgdGFyZ2V0TXV0YXRpb25zID0gc2NvcGVkTXV0YXRpb25zLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgIHJldHVybiBmaWx0ZXJNdXRhdGlvbnMobSwgXCJ0YXJnZXRcIik7XG4gIH0pO1xuXG4gIGlmIChfaXNFbXB0eSh0YXJnZXRNdXRhdGlvbnMpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBrZXlNdXRhdGlvbnMgPSB0YXJnZXRNdXRhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChtKSB7XG4gICAgcmV0dXJuIGZpbHRlck11dGF0aW9ucyhtLCBcImV2ZW50S2V5XCIpO1xuICB9KTtcblxuICBpZiAoX2lzRW1wdHkoa2V5TXV0YXRpb25zKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ga2V5TXV0YXRpb25zLnJlZHVjZShmdW5jdGlvbiAobWVtbywgY3Vycikge1xuICAgIHZhciBtdXRhdGlvbkZ1bmN0aW9uID0gY3VyciAmJiBfaXNGdW5jdGlvbihjdXJyLm11dGF0aW9uKSA/IGN1cnIubXV0YXRpb24gOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgdmFyIGN1cnJlbnRNdXRhdGlvbiA9IG11dGF0aW9uRnVuY3Rpb24oX2Fzc2lnbih7fSwgYmFzZVByb3BzLCBiYXNlU3RhdGUpKTtcbiAgICByZXR1cm4gX2Fzc2lnbih7fSwgbWVtbywgY3VycmVudE11dGF0aW9uKTtcbiAgfSwge30pO1xufVxuLyogUmV0dXJucyBhbiBhcnJheSBvZiBkZWZhdWx0RXZlbnRzIGZyb20gc3ViLWNvbXBvbmVudHMgb2YgYSBnaXZlbiBjb21wb25lbnQuXG4gKiBpLmUuIGFueSBzdGF0aWMgYGRlZmF1bHRFdmVudHNgIG9uIGBsYWJlbENvbXBvbmVudGAgd2lsbCBiZSByZXR1cm5lZFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21wb25lbnRFdmVudHMocHJvcHMsIGNvbXBvbmVudHMpIHtcbiAgdmFyIGV2ZW50cyA9IEFycmF5LmlzQXJyYXkoY29tcG9uZW50cykgJiYgY29tcG9uZW50cy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIGNvbXBvbmVudE5hbWUpIHtcbiAgICB2YXIgX21lbW87XG5cbiAgICB2YXIgY29tcG9uZW50ID0gcHJvcHNbY29tcG9uZW50TmFtZV07XG4gICAgdmFyIGRlZmF1bHRFdmVudHMgPSBjb21wb25lbnQgJiYgY29tcG9uZW50LnR5cGUgJiYgY29tcG9uZW50LnR5cGUuZGVmYXVsdEV2ZW50cztcbiAgICB2YXIgY29tcG9uZW50RXZlbnRzID0gX2lzRnVuY3Rpb24oZGVmYXVsdEV2ZW50cykgPyBkZWZhdWx0RXZlbnRzKGNvbXBvbmVudC5wcm9wcykgOiBkZWZhdWx0RXZlbnRzO1xuICAgIG1lbW8gPSBBcnJheS5pc0FycmF5KGNvbXBvbmVudEV2ZW50cykgPyAoX21lbW8gPSBtZW1vKS5jb25jYXQuYXBwbHkoX21lbW8sIF90b0NvbnN1bWFibGVBcnJheShjb21wb25lbnRFdmVudHMpKSA6IG1lbW87XG4gICAgcmV0dXJuIG1lbW87XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGV2ZW50cyAmJiBldmVudHMubGVuZ3RoID8gZXZlbnRzIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbEV2ZW50TmFtZUZyb21LZXkoa2V5KSB7XG4gIHZhciBtYXRjaCA9IGtleS5tYXRjaChHTE9CQUxfRVZFTlRfUkVHRVgpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV0gJiYgbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtcbn1cbmV4cG9ydCB2YXIgZ2V0R2xvYmFsRXZlbnRzID0gZnVuY3Rpb24gKGV2ZW50cykge1xuICByZXR1cm4gX3BpY2tCeShldmVudHMsIGZ1bmN0aW9uIChfLCBrZXkpIHtcbiAgICByZXR1cm4gR0xPQkFMX0VWRU5UX1JFR0VYLnRlc3Qoa2V5KTtcbiAgfSk7XG59O1xuZXhwb3J0IHZhciBvbWl0R2xvYmFsRXZlbnRzID0gZnVuY3Rpb24gKGV2ZW50cykge1xuICByZXR1cm4gX29taXRCeShldmVudHMsIGZ1bmN0aW9uIChfLCBrZXkpIHtcbiAgICByZXR1cm4gR0xPQkFMX0VWRU5UX1JFR0VYLnRlc3Qoa2V5KTtcbiAgfSk7XG59O1xuZXhwb3J0IHZhciBlbXVsYXRlUmVhY3RFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICByZXR1cm4gX2Fzc2lnbihldmVudCwge1xuICAgIG5hdGl2ZUV2ZW50OiBldmVudFxuICB9KTtcbn07IiwiLyogZ2xvYmFsIGNvbnNvbGUgKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuLy8gVE9ETzogVXNlIFwid2FybmluZ1wiIG5wbSBtb2R1bGUgbGlrZSBSZWFjdCBpcyBzd2l0Y2hpbmcgdG8uXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1zdHlsZVxuZXhwb3J0IGZ1bmN0aW9uIHdhcm4obWVzc2FnZSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSB7XG4gICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgfVxuICB9XG59IiwiaW1wb3J0IF9pc1BsYWluT2JqZWN0IGZyb20gXCJsb2Rhc2gvaXNQbGFpbk9iamVjdFwiO1xuaW1wb3J0IF92YWx1ZXMgZnJvbSBcImxvZGFzaC92YWx1ZXNcIjtcbmltcG9ydCBfdW5pcUJ5IGZyb20gXCJsb2Rhc2gvdW5pcUJ5XCI7XG5pbXBvcnQgX2dyb3VwQnkgZnJvbSBcImxvZGFzaC9ncm91cEJ5XCI7XG5pbXBvcnQgX3VuaXEgZnJvbSBcImxvZGFzaC91bmlxXCI7XG5pbXBvcnQgX2lzRnVuY3Rpb24gZnJvbSBcImxvZGFzaC9pc0Z1bmN0aW9uXCI7XG5pbXBvcnQgX2ZsYXR0ZW4gZnJvbSBcImxvZGFzaC9mbGF0dGVuXCI7XG5pbXBvcnQgX2RlZmF1bHRzIGZyb20gXCJsb2Rhc2gvZGVmYXVsdHNcIjtcbmltcG9ydCBfYXNzaWduIGZyb20gXCJsb2Rhc2gvYXNzaWduXCI7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0ICogYXMgQXhpcyBmcm9tIFwiLi9heGlzXCI7XG5pbXBvcnQgKiBhcyBTdHlsZSBmcm9tIFwiLi9zdHlsZVwiO1xuaW1wb3J0ICogYXMgRGF0YSBmcm9tIFwiLi9kYXRhXCI7XG5pbXBvcnQgKiBhcyBEb21haW4gZnJvbSBcIi4vZG9tYWluXCI7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSBcIi4vZXZlbnRzXCI7XG5pbXBvcnQgKiBhcyBDb2xsZWN0aW9uIGZyb20gXCIuL2NvbGxlY3Rpb25cIjtcbmltcG9ydCAqIGFzIEhlbHBlcnMgZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0ICogYXMgU2NhbGUgZnJvbSBcIi4vc2NhbGVcIjtcbmltcG9ydCAqIGFzIExvZyBmcm9tIFwiLi9sb2dcIjtcbmV4cG9ydCBmdW5jdGlvbiBhZGRCaW5zVG9QYXJlbnRQcm9wc0lmSGlzdG9ncmFtKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICAgIHByb3BzID0gX3JlZi5wcm9wcyxcbiAgICAgIGNoaWxkQ29tcG9uZW50cyA9IF9yZWYuY2hpbGRDb21wb25lbnRzLFxuICAgICAgcGFyZW50UHJvcHMgPSBfcmVmLnBhcmVudFByb3BzO1xuICB2YXIgc29tZUNoaWxkcmVuQXJlSGlzdG9ncmFtcyA9IGNoaWxkcmVuLnNvbWUoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGNoaWxkLnR5cGUgJiYgY2hpbGQudHlwZS5yb2xlID09PSBcImhpc3RvZ3JhbVwiO1xuICB9KTtcbiAgdmFyIGFsbENoaWxkcmVuQXJlSGlzdG9ncmFtcyA9IHNvbWVDaGlsZHJlbkFyZUhpc3RvZ3JhbXMgJiYgY2hpbGRyZW4ubGVuZ3RoICYmIGNoaWxkcmVuLmV2ZXJ5KGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC50eXBlICYmIGNoaWxkLnR5cGUucm9sZSA9PT0gXCJoaXN0b2dyYW1cIjtcbiAgfSk7XG5cbiAgaWYgKHNvbWVDaGlsZHJlbkFyZUhpc3RvZ3JhbXMgJiYgIWFsbENoaWxkcmVuQXJlSGlzdG9ncmFtcykge1xuICAgIExvZy53YXJuKFwiVmljdG9yeUhpc3RvZ3JhbSBvbmx5IHN1cHBvcnRzIGJlaW5nIHN0YWNrZWQgd2l0aCBvdGhlciBWaWN0b3J5SGlzdG9ncmFtIGNvbXBvbmVudHMuIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBhcmUgb25seSBwYXNzaW5nIFZpY3RvcnlIaXN0b2dyYW0gY29tcG9uZW50cyB0byBWaWN0b3J5U3RhY2tcIik7XG4gIH0gLy8gaWYgd2UgYXJlIHN0YWNraW5nIGhpc3RvZ3JhbXMsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgZXhwbGljaXQgYmluc1xuICAvLyBvciBlbHNlIGVhY2ggaGlzdG9ncmFtIG1heSBlbmQgdXAgaGF2aW5nIGRpZmZlcmVudCBiaW5zXG5cblxuICBpZiAoIWFsbENoaWxkcmVuQXJlSGlzdG9ncmFtcykge1xuICAgIHJldHVybiBwYXJlbnRQcm9wcztcbiAgfVxuXG4gIHZhciBjaGlsZEJpbnMgPSBwcm9wcy5iaW5zIHx8IGNoaWxkQ29tcG9uZW50c1swXS5wcm9wcy5iaW5zOyAvLyBpZiB3ZSBoYXZlIGV4cGxpY2l0IGJpbnMgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGNhbGN1bGF0ZSB0aGVtXG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkQmlucykpIHtcbiAgICB2YXIgY29tYmluZWREYXRhID0gY2hpbGRyZW4ucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBjaGlsZCkge1xuICAgICAgdmFyIHhBY2Nlc3NvciA9IEhlbHBlcnMuY3JlYXRlQWNjZXNzb3IoY2hpbGQucHJvcHMueCB8fCBcInhcIik7XG4gICAgICByZXR1cm4gbWVtby5jb25jYXQoY2hpbGQucHJvcHMuZGF0YS5tYXAoZnVuY3Rpb24gKGRhdHVtKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogeEFjY2Vzc29yKGRhdHVtKVxuICAgICAgICB9O1xuICAgICAgfSkpO1xuICAgIH0sIFtdKTsgLy8gdXNlIHRoZSBzYW1lIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGJpbnMgYXMgVmljdG9yeUhpc3RvZ3JhbSBidXQgd2l0aFxuICAgIC8vIHRoZSBjb21iaW5lZCBkYXRhIGZyb20gYWJvdmUsIHRoZW4gZ2V0IGV4cGxpY2l0IGJpbnMgZnJvbSB0aGF0XG5cbiAgICB2YXIgZ2V0Rm9ybWF0dGVkSGlzdG9ncmFtRGF0YSA9IGNoaWxkcmVuWzBdLnR5cGUuZ2V0Rm9ybWF0dGVkRGF0YTtcbiAgICBjaGlsZEJpbnMgPSBnZXRGb3JtYXR0ZWRIaXN0b2dyYW1EYXRhKHtcbiAgICAgIGRhdGE6IGNvbWJpbmVkRGF0YSxcbiAgICAgIGJpbnM6IGNoaWxkQmluc1xuICAgIH0pLnJlZHVjZShmdW5jdGlvbiAobWVtbywgX3JlZjIsIGluZGV4KSB7XG4gICAgICB2YXIgeDAgPSBfcmVmMi54MCxcbiAgICAgICAgICB4MSA9IF9yZWYyLngxO1xuICAgICAgcmV0dXJuIGluZGV4ID09PSAwID8gbWVtby5jb25jYXQoW3gwLCB4MV0pIDogbWVtby5jb25jYXQoeDEpO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBwYXJlbnRQcm9wcywge1xuICAgIGJpbnM6IGNoaWxkQmluc1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhRnJvbUNoaWxkcmVuKHByb3BzLCBjaGlsZENvbXBvbmVudHMpIHtcbiAgdmFyIHBvbGFyID0gcHJvcHMucG9sYXIsXG4gICAgICBzdGFydEFuZ2xlID0gcHJvcHMuc3RhcnRBbmdsZSxcbiAgICAgIGVuZEFuZ2xlID0gcHJvcHMuZW5kQW5nbGUsXG4gICAgICBjYXRlZ29yaWVzID0gcHJvcHMuY2F0ZWdvcmllcyxcbiAgICAgIG1pbkRvbWFpbiA9IHByb3BzLm1pbkRvbWFpbixcbiAgICAgIG1heERvbWFpbiA9IHByb3BzLm1heERvbWFpbjtcbiAgdmFyIHBhcmVudFByb3BzID0ge1xuICAgIHBvbGFyOiBwb2xhcixcbiAgICBzdGFydEFuZ2xlOiBzdGFydEFuZ2xlLFxuICAgIGVuZEFuZ2xlOiBlbmRBbmdsZSxcbiAgICBjYXRlZ29yaWVzOiBjYXRlZ29yaWVzLFxuICAgIG1pbkRvbWFpbjogbWluRG9tYWluLFxuICAgIG1heERvbWFpbjogbWF4RG9tYWluXG4gIH07XG4gIHZhciBzdGFjayA9IDA7XG4gIHZhciBjaGlsZHJlbiA9IGNoaWxkQ29tcG9uZW50cyA/IGNoaWxkQ29tcG9uZW50cy5zbGljZSgwKSA6IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkocHJvcHMuY2hpbGRyZW4pO1xuICBwYXJlbnRQcm9wcyA9IGFkZEJpbnNUb1BhcmVudFByb3BzSWZIaXN0b2dyYW0oe1xuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBwcm9wczogcHJvcHMsXG4gICAgY2hpbGRDb21wb25lbnRzOiBjaGlsZENvbXBvbmVudHMsXG4gICAgcGFyZW50UHJvcHM6IHBhcmVudFByb3BzXG4gIH0pO1xuXG4gIHZhciBpdGVyYXRlZSA9IGZ1bmN0aW9uIChjaGlsZCwgY2hpbGROYW1lLCBwYXJlbnQpIHtcbiAgICB2YXIgY2hpbGRQcm9wcyA9IF9hc3NpZ24oe30sIGNoaWxkLnByb3BzLCBwYXJlbnRQcm9wcyk7XG5cbiAgICB2YXIgY2hpbGREYXRhO1xuXG4gICAgaWYgKCFEYXRhLmlzRGF0YUNvbXBvbmVudChjaGlsZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoY2hpbGQudHlwZSAmJiBfaXNGdW5jdGlvbihjaGlsZC50eXBlLmdldERhdGEpKSB7XG4gICAgICBjaGlsZCA9IHBhcmVudCA/IFJlYWN0LmNsb25lRWxlbWVudChjaGlsZCwgcGFyZW50LnByb3BzKSA6IGNoaWxkO1xuICAgICAgY2hpbGREYXRhID0gY2hpbGQudHlwZS5nZXREYXRhKGNoaWxkUHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZERhdGEgPSBEYXRhLmdldERhdGEoY2hpbGRQcm9wcyk7XG4gICAgfVxuXG4gICAgc3RhY2sgKz0gMTtcbiAgICByZXR1cm4gY2hpbGREYXRhLm1hcChmdW5jdGlvbiAoZGF0dW0sIGluZGV4KSB7XG4gICAgICByZXR1cm4gX2Fzc2lnbih7XG4gICAgICAgIF9zdGFjazogc3RhY2ssXG4gICAgICAgIF9ncm91cDogaW5kZXhcbiAgICAgIH0sIGRhdHVtKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgc3RhY2tlZCA9IGNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbiAoYykge1xuICAgIHJldHVybiBjLnR5cGUgJiYgYy50eXBlLnJvbGUgPT09IFwic3RhY2tcIjtcbiAgfSkubGVuZ3RoO1xuXG4gIHZhciBjb21iaW5lID0gZnVuY3Rpb24gKG1lbW8sIHZhbCkge1xuICAgIHJldHVybiBtZW1vLmNvbmNhdChfdW5pcUJ5KHZhbCwgXCJfZ3JvdXBcIikpO1xuICB9O1xuXG4gIHZhciBkYXRhc2V0cyA9IEhlbHBlcnMucmVkdWNlQ2hpbGRyZW4oY2hpbGRyZW4sIGl0ZXJhdGVlLCBwcm9wcywgW10sIGNvbWJpbmUpO1xuICB2YXIgZ3JvdXAgPSBzdGFja2VkID8gXCJfZ3JvdXBcIiA6IFwiX3N0YWNrXCI7XG4gIHJldHVybiBfdmFsdWVzKF9ncm91cEJ5KGRhdGFzZXRzLCBncm91cCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGEocHJvcHMsIGNoaWxkQ29tcG9uZW50cykge1xuICBpZiAocHJvcHMuZGF0YSkge1xuICAgIHJldHVybiBEYXRhLmdldERhdGEocHJvcHMpO1xuICB9XG5cbiAgY2hpbGRDb21wb25lbnRzID0gY2hpbGRDb21wb25lbnRzIHx8IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkocHJvcHMuY2hpbGRyZW4pO1xuICByZXR1cm4gZ2V0RGF0YUZyb21DaGlsZHJlbihjaGlsZENvbXBvbmVudHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFdpZHRoKHByb3BzLCBncm91cExlbmd0aCwgc2VyaWVzTGVuZ3RoKSB7XG4gIHZhciBkYXRhc2V0cyA9IHByb3BzLmRhdGFzZXRzLFxuICAgICAgaG9yaXpvbnRhbCA9IHByb3BzLmhvcml6b250YWw7XG4gIHZhciByYW5nZSA9IGhvcml6b250YWwgPyBIZWxwZXJzLmdldFJhbmdlKHByb3BzLCBcInlcIikgOiBIZWxwZXJzLmdldFJhbmdlKHByb3BzLCBcInhcIik7XG4gIHZhciBleHRlbnQgPSBNYXRoLmFicyhyYW5nZVsxXSAtIHJhbmdlWzBdKTtcbiAgc2VyaWVzTGVuZ3RoID0gc2VyaWVzTGVuZ3RoICE9PSB1bmRlZmluZWQgPyBzZXJpZXNMZW5ndGggOiBBcnJheS5pc0FycmF5KGRhdGFzZXRzWzBdKSAmJiBkYXRhc2V0c1swXS5sZW5ndGggfHwgMTtcbiAgZ3JvdXBMZW5ndGggPSBncm91cExlbmd0aCB8fCBkYXRhc2V0cy5sZW5ndGg7XG4gIHZhciBiYXJzID0gZ3JvdXBMZW5ndGggKiBzZXJpZXNMZW5ndGg7XG4gIHZhciBiYXJSYXRpbyA9IDAuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQoYmFyUmF0aW8gKiBleHRlbnQgLyBiYXJzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0RG9tYWluUGFkZGluZyhwcm9wcywgYXhpcywgY2hpbGRDb21wb25lbnRzKSB7XG4gIGlmIChwcm9wcy5wb2xhciB8fCBheGlzICE9PSBcInhcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgZ3JvdXBDb21wb25lbnQgPSBjaGlsZENvbXBvbmVudHMuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC50eXBlICYmIGNoaWxkLnR5cGUucm9sZSAmJiBjaGlsZC50eXBlLnJvbGUgPT09IFwiZ3JvdXBcIjtcbiAgfSk7XG5cbiAgaWYgKGdyb3VwQ29tcG9uZW50Lmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIF9ncm91cENvbXBvbmVudCQwJHBybyA9IGdyb3VwQ29tcG9uZW50WzBdLnByb3BzLFxuICAgICAgb2Zmc2V0ID0gX2dyb3VwQ29tcG9uZW50JDAkcHJvLm9mZnNldCxcbiAgICAgIGNoaWxkcmVuID0gX2dyb3VwQ29tcG9uZW50JDAkcHJvLmNoaWxkcmVuO1xuXG4gIGlmICghb2Zmc2V0KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBmaXJzdENoaWxkID0gQXJyYXkuaXNBcnJheShjaGlsZHJlbikgJiYgY2hpbGRyZW5bMF07XG5cbiAgaWYgKCFmaXJzdENoaWxkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBiYXJXaWR0aCA9IGZpcnN0Q2hpbGQucHJvcHMuYmFyV2lkdGg7XG4gIHZhciBkYXRhTGVuZ3RoID0gZmlyc3RDaGlsZC5wcm9wcy5kYXRhICYmIGZpcnN0Q2hpbGQucHJvcHMuZGF0YS5sZW5ndGggfHwgMTtcblxuICBpZiAoZmlyc3RDaGlsZCAmJiBmaXJzdENoaWxkLnR5cGUucm9sZSA9PT0gXCJzdGFja1wiKSB7XG4gICAgdmFyIG5lc3RlZENoaWxkID0gZmlyc3RDaGlsZC5wcm9wcy5jaGlsZHJlbiAmJiBmaXJzdENoaWxkLnByb3BzLmNoaWxkcmVuWzBdO1xuXG4gICAgaWYgKCFuZXN0ZWRDaGlsZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBiYXJXaWR0aCA9IG5lc3RlZENoaWxkLnByb3BzLmJhcldpZHRoO1xuICAgIGRhdGFMZW5ndGggPSBmaXJzdENoaWxkLnByb3BzLmNoaWxkcmVuLmxlbmd0aDtcbiAgfVxuXG4gIHZhciB3aWR0aCA9IGJhcldpZHRoIHx8IGdldFdpZHRoKHByb3BzLCBjaGlsZHJlbi5sZW5ndGgsIGRhdGFMZW5ndGgpO1xuICByZXR1cm4ge1xuICAgIHg6IHdpZHRoICogY2hpbGRyZW4ubGVuZ3RoIC8gMiArIChvZmZzZXQgLSB3aWR0aCAqICgoY2hpbGRyZW4ubGVuZ3RoIC0gMSkgLyAyKSlcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREb21haW5Gcm9tQ2hpbGRyZW4ocHJvcHMsIGF4aXMsIGNoaWxkQ29tcG9uZW50cykge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1zdGF0ZW1lbnRzLCBjb21wbGV4aXR5LCBtYXgtbGVuXG4gIHZhciBjaGlsZHJlbiA9IGNoaWxkQ29tcG9uZW50cyA/IGNoaWxkQ29tcG9uZW50cy5zbGljZSgwKSA6IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkocHJvcHMuY2hpbGRyZW4pO1xuICB2YXIgcGFyZW50RGF0YSA9IHByb3BzLmRhdGEgPyBEYXRhLmdldERhdGEocHJvcHMsIGF4aXMpIDogdW5kZWZpbmVkO1xuICB2YXIgcG9sYXIgPSBwcm9wcy5wb2xhcixcbiAgICAgIHN0YXJ0QW5nbGUgPSBwcm9wcy5zdGFydEFuZ2xlLFxuICAgICAgZW5kQW5nbGUgPSBwcm9wcy5lbmRBbmdsZSxcbiAgICAgIGNhdGVnb3JpZXMgPSBwcm9wcy5jYXRlZ29yaWVzLFxuICAgICAgbWluRG9tYWluID0gcHJvcHMubWluRG9tYWluLFxuICAgICAgbWF4RG9tYWluID0gcHJvcHMubWF4RG9tYWluLFxuICAgICAgaG9yaXpvbnRhbCA9IHByb3BzLmhvcml6b250YWw7XG4gIHZhciBiYXNlUGFyZW50UHJvcHMgPSB7XG4gICAgaG9yaXpvbnRhbDogaG9yaXpvbnRhbCxcbiAgICBwb2xhcjogcG9sYXIsXG4gICAgc3RhcnRBbmdsZTogc3RhcnRBbmdsZSxcbiAgICBlbmRBbmdsZTogZW5kQW5nbGUsXG4gICAgbWluRG9tYWluOiBtaW5Eb21haW4sXG4gICAgbWF4RG9tYWluOiBtYXhEb21haW4sXG4gICAgY2F0ZWdvcmllczogY2F0ZWdvcmllc1xuICB9O1xuICB2YXIgcGFyZW50UHJvcHMgPSBwYXJlbnREYXRhID8gX2Fzc2lnbihiYXNlUGFyZW50UHJvcHMsIHtcbiAgICBkYXRhOiBwYXJlbnREYXRhXG4gIH0pIDogYmFzZVBhcmVudFByb3BzO1xuXG4gIHZhciBpdGVyYXRlZSA9IGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHZhciBzaGFyZWRQcm9wcyA9IF9hc3NpZ24oe30sIGNoaWxkLnByb3BzLCBwYXJlbnRQcm9wcyk7XG5cbiAgICBpZiAoIURvbWFpbi5pc0RvbWFpbkNvbXBvbmVudChjaGlsZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoY2hpbGQudHlwZSAmJiBfaXNGdW5jdGlvbihjaGlsZC50eXBlLmdldERvbWFpbikpIHtcbiAgICAgIHJldHVybiBjaGlsZC5wcm9wcyAmJiBjaGlsZC50eXBlLmdldERvbWFpbihzaGFyZWRQcm9wcywgYXhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBEb21haW4uZ2V0RG9tYWluKHNoYXJlZFByb3BzLCBheGlzKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGNoaWxkRG9tYWlucyA9IEhlbHBlcnMucmVkdWNlQ2hpbGRyZW4oY2hpbGRyZW4sIGl0ZXJhdGVlLCBwcm9wcyk7XG4gIHZhciBtaW4gPSBjaGlsZERvbWFpbnMubGVuZ3RoID09PSAwID8gMCA6IENvbGxlY3Rpb24uZ2V0TWluVmFsdWUoY2hpbGREb21haW5zKTtcbiAgdmFyIG1heCA9IGNoaWxkRG9tYWlucy5sZW5ndGggPT09IDAgPyAxIDogQ29sbGVjdGlvbi5nZXRNYXhWYWx1ZShjaGlsZERvbWFpbnMpO1xuICByZXR1cm4gW21pbiwgbWF4XTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREb21haW4ocHJvcHMsIGF4aXMsIGNoaWxkQ29tcG9uZW50cykge1xuICBjaGlsZENvbXBvbmVudHMgPSBjaGlsZENvbXBvbmVudHMgfHwgUmVhY3QuQ2hpbGRyZW4udG9BcnJheShwcm9wcy5jaGlsZHJlbik7XG4gIHZhciBwcm9wc0RvbWFpbiA9IERvbWFpbi5nZXREb21haW5Gcm9tUHJvcHMocHJvcHMsIGF4aXMpO1xuICB2YXIgZG9tYWluUGFkZGluZyA9IGdldERlZmF1bHREb21haW5QYWRkaW5nKHByb3BzLCBheGlzLCBjaGlsZENvbXBvbmVudHMpO1xuICB2YXIgZG9tYWluO1xuXG4gIGlmIChwcm9wc0RvbWFpbikge1xuICAgIGRvbWFpbiA9IHByb3BzRG9tYWluO1xuICB9IGVsc2Uge1xuICAgIHZhciBtaW5Eb21haW4gPSBEb21haW4uZ2V0TWluRnJvbVByb3BzKHByb3BzLCBheGlzKTtcbiAgICB2YXIgbWF4RG9tYWluID0gRG9tYWluLmdldE1heEZyb21Qcm9wcyhwcm9wcywgYXhpcyk7XG4gICAgdmFyIGRhdGFzZXQgPSAocHJvcHMuZGF0YSB8fCBwcm9wcy55KSAmJiBEYXRhLmdldERhdGEocHJvcHMpO1xuICAgIHZhciBkYXRhRG9tYWluID0gZGF0YXNldCA/IERvbWFpbi5nZXREb21haW5Gcm9tRGF0YShwcm9wcywgYXhpcywgZGF0YXNldCkgOiBbXTtcbiAgICB2YXIgY2hpbGREb21haW4gPSBnZXREb21haW5Gcm9tQ2hpbGRyZW4ocHJvcHMsIGF4aXMsIGNoaWxkQ29tcG9uZW50cyk7XG4gICAgdmFyIG1pbiA9IG1pbkRvbWFpbiB8fCBDb2xsZWN0aW9uLmdldE1pblZhbHVlKF90b0NvbnN1bWFibGVBcnJheShkYXRhRG9tYWluKS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGNoaWxkRG9tYWluKSkpO1xuICAgIHZhciBtYXggPSBtYXhEb21haW4gfHwgQ29sbGVjdGlvbi5nZXRNYXhWYWx1ZShfdG9Db25zdW1hYmxlQXJyYXkoZGF0YURvbWFpbikuY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjaGlsZERvbWFpbikpKTtcbiAgICBkb21haW4gPSBEb21haW4uZ2V0RG9tYWluRnJvbU1pbk1heChtaW4sIG1heCk7XG4gIH1cblxuICByZXR1cm4gRG9tYWluLmZvcm1hdERvbWFpbihkb21haW4sIF9hc3NpZ24oe1xuICAgIGRvbWFpblBhZGRpbmc6IGRvbWFpblBhZGRpbmdcbiAgfSwgcHJvcHMpLCBheGlzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2FsZShwcm9wcywgYXhpcywgY2hpbGRDb21wb25lbnRzKSB7XG4gIGlmIChwcm9wcy5kYXRhKSB7XG4gICAgcmV0dXJuIFNjYWxlLmdldEJhc2VTY2FsZShwcm9wcywgYXhpcyk7XG4gIH1cblxuICB2YXIgY2hpbGRyZW4gPSBjaGlsZENvbXBvbmVudHMgPyBjaGlsZENvbXBvbmVudHMuc2xpY2UoMCkgOiBSZWFjdC5DaGlsZHJlbi50b0FycmF5KHByb3BzLmNoaWxkcmVuKTtcblxuICB2YXIgaXRlcmF0ZWUgPSBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICB2YXIgc2hhcmVkUHJvcHMgPSBfYXNzaWduKHt9LCBjaGlsZC5wcm9wcywge1xuICAgICAgaG9yaXpvbnRhbDogcHJvcHMuaG9yaXpvbnRhbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIFNjYWxlLmdldFNjYWxlVHlwZShzaGFyZWRQcm9wcywgYXhpcyk7XG4gIH07XG5cbiAgdmFyIGNoaWxkU2NhbGUgPSBfdW5pcShIZWxwZXJzLnJlZHVjZUNoaWxkcmVuKGNoaWxkcmVuLCBpdGVyYXRlZSwgcHJvcHMpKTsgLy8gZGVmYXVsdCB0byBsaW5lYXIgc2NhbGUgaWYgbW9yZSB0aGFuIG9uZSB1bmlxIHNjYWxlIHR5cGUgaXMgZ2l2ZW4gYnkgY2hpbGRyZW5cblxuXG4gIHJldHVybiBjaGlsZFNjYWxlLmxlbmd0aCA+IDEgPyBTY2FsZS5nZXRTY2FsZUZyb21OYW1lKFwibGluZWFyXCIpIDogU2NhbGUuZ2V0U2NhbGVGcm9tTmFtZShjaGlsZFNjYWxlWzBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxFdmVudHMocHJvcHMpIHtcbiAgdmFyIGNvbXBvbmVudHMgPSBbXCJncm91cENvbXBvbmVudFwiLCBcImNvbnRhaW5lckNvbXBvbmVudFwiLCBcImxhYmVsQ29tcG9uZW50XCJdO1xuICB2YXIgY29tcG9uZW50RXZlbnRzID0gRXZlbnRzLmdldENvbXBvbmVudEV2ZW50cyhwcm9wcywgY29tcG9uZW50cyk7XG4gIHZhciBldmVudHMgPSBwcm9wcy5ldmVudHM7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoY29tcG9uZW50RXZlbnRzKSkge1xuICAgIGV2ZW50cyA9IEFycmF5LmlzQXJyYXkocHJvcHMuZXZlbnRzKSA/IGNvbXBvbmVudEV2ZW50cy5jb25jYXQuYXBwbHkoY29tcG9uZW50RXZlbnRzLCBfdG9Db25zdW1hYmxlQXJyYXkocHJvcHMuZXZlbnRzKSkgOiBjb21wb25lbnRFdmVudHM7XG4gIH1cblxuICByZXR1cm4gZXZlbnRzIHx8IFtdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbG9yKGNhbGN1bGF0ZWRQcm9wcywgY2hpbGQsIGluZGV4KSB7XG4gIC8vIGNoZWNrIGZvciBzdHlsZXMgZmlyc3RcbiAgdmFyIHN0eWxlID0gY2FsY3VsYXRlZFByb3BzLnN0eWxlO1xuICB2YXIgY29sb3JTY2FsZSA9IGNhbGN1bGF0ZWRQcm9wcy5jb2xvclNjYWxlLFxuICAgICAgY29sb3IgPSBjYWxjdWxhdGVkUHJvcHMuY29sb3I7XG5cbiAgaWYgKHN0eWxlICYmIHN0eWxlLmRhdGEgJiYgc3R5bGUuZGF0YS5maWxsKSB7XG4gICAgcmV0dXJuIHN0eWxlLmRhdGEuZmlsbDtcbiAgfVxuXG4gIGNvbG9yU2NhbGUgPSBjaGlsZC5wcm9wcyAmJiBjaGlsZC5wcm9wcy5jb2xvclNjYWxlID8gY2hpbGQucHJvcHMuY29sb3JTY2FsZSA6IGNvbG9yU2NhbGU7XG4gIGNvbG9yID0gY2hpbGQucHJvcHMgJiYgY2hpbGQucHJvcHMuY29sb3IgPyBjaGlsZC5wcm9wcy5jb2xvciA6IGNvbG9yO1xuXG4gIGlmICghY29sb3JTY2FsZSAmJiAhY29sb3IpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIGNvbG9ycyA9IEFycmF5LmlzQXJyYXkoY29sb3JTY2FsZSkgPyBjb2xvclNjYWxlIDogU3R5bGUuZ2V0Q29sb3JTY2FsZShjb2xvclNjYWxlKTtcbiAgcmV0dXJuIGNvbG9yIHx8IGNvbG9yc1tpbmRleCAlIGNvbG9ycy5sZW5ndGhdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlKHRoZW1lLCBzdHlsZSwgcm9sZSkge1xuICB2YXIgZGVmYXVsdFN0eWxlID0gdGhlbWUgJiYgdGhlbWVbcm9sZV0gJiYgdGhlbWVbcm9sZV0uc3R5bGUgPyB0aGVtZVtyb2xlXS5zdHlsZSA6IHt9O1xuICByZXR1cm4gSGVscGVycy5nZXRTdHlsZXMoc3R5bGUsIGRlZmF1bHRTdHlsZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hpbGRTdHlsZShjaGlsZCwgaW5kZXgsIGNhbGN1bGF0ZWRQcm9wcykge1xuICB2YXIgc3R5bGUgPSBjYWxjdWxhdGVkUHJvcHMuc3R5bGUsXG4gICAgICByb2xlID0gY2FsY3VsYXRlZFByb3BzLnJvbGU7XG4gIHZhciBjaGlsZFN0eWxlID0gY2hpbGQucHJvcHMuc3R5bGUgfHwge307XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRTdHlsZSkpIHtcbiAgICByZXR1cm4gY2hpbGRTdHlsZTtcbiAgfVxuXG4gIHZhciBjaGlsZFJvbGUgPSBjaGlsZC50eXBlICYmIGNoaWxkLnR5cGUucm9sZTtcbiAgdmFyIGRlZmF1bHRGaWxsID0gY2hpbGRSb2xlID09PSBcInN0YWNrXCIgPyB1bmRlZmluZWQgOiBnZXRDb2xvcihjYWxjdWxhdGVkUHJvcHMsIGNoaWxkLCBpbmRleCk7XG4gIHZhciBkZWZhdWx0Q29sb3IgPSBjaGlsZFJvbGUgPT09IFwibGluZVwiID8ge1xuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHN0cm9rZTogZGVmYXVsdEZpbGxcbiAgfSA6IHtcbiAgICBmaWxsOiBkZWZhdWx0RmlsbFxuICB9O1xuICB2YXIgZGF0YVdpZHRoID0gcm9sZSA9PT0gXCJzdGFja1wiID8ge30gOiB7XG4gICAgd2lkdGg6IGdldFdpZHRoKGNhbGN1bGF0ZWRQcm9wcylcbiAgfTtcblxuICB2YXIgZGF0YVN0eWxlID0gX2RlZmF1bHRzKHt9LCBjaGlsZFN0eWxlLmRhdGEsIF9hc3NpZ24oe30sIGRhdGFXaWR0aCwgc3R5bGUuZGF0YSwgZGVmYXVsdENvbG9yKSk7XG5cbiAgdmFyIGxhYmVsc1N0eWxlID0gX2RlZmF1bHRzKHt9LCBjaGlsZFN0eWxlLmxhYmVscywgc3R5bGUubGFiZWxzKTtcblxuICByZXR1cm4ge1xuICAgIHBhcmVudDogc3R5bGUucGFyZW50LFxuICAgIGRhdGE6IGRhdGFTdHlsZSxcbiAgICBsYWJlbHM6IGxhYmVsc1N0eWxlXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyaW5nc0Zyb21DYXRlZ29yaWVzKGNoaWxkQ29tcG9uZW50cywgYXhpcykge1xuICB2YXIgaXRlcmF0ZWUgPSBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICB2YXIgY2hpbGRQcm9wcyA9IGNoaWxkLnByb3BzIHx8IHt9O1xuXG4gICAgaWYgKCFEb21haW4uaXNEb21haW5Db21wb25lbnQoY2hpbGQpIHx8ICFjaGlsZFByb3BzLmNhdGVnb3JpZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY2F0ZWdvcmllcyA9IGNoaWxkUHJvcHMuY2F0ZWdvcmllcyAmJiAhQXJyYXkuaXNBcnJheShjaGlsZFByb3BzLmNhdGVnb3JpZXMpID8gY2hpbGRQcm9wcy5jYXRlZ29yaWVzW2F4aXNdIDogY2hpbGRQcm9wcy5wcm9wcy5jYXRlZ29yaWVzO1xuICAgICAgdmFyIGNhdGVnb3J5U3RyaW5ncyA9IGNhdGVnb3JpZXMgJiYgY2F0ZWdvcmllcy5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNhdGVnb3J5U3RyaW5ncyA/IENvbGxlY3Rpb24ucmVtb3ZlVW5kZWZpbmVkKGNhdGVnb3J5U3RyaW5ncykgOiBbXTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEhlbHBlcnMucmVkdWNlQ2hpbGRyZW4oY2hpbGRDb21wb25lbnRzLnNsaWNlKDApLCBpdGVyYXRlZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyaW5nc0Zyb21EYXRhKGNoaWxkQ29tcG9uZW50cykge1xuICB2YXIgaXRlcmF0ZWUgPSBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICB2YXIgY2hpbGRQcm9wcyA9IGNoaWxkLnByb3BzIHx8IHt9O1xuICAgIHZhciBkYXRhO1xuXG4gICAgaWYgKCFEYXRhLmlzRGF0YUNvbXBvbmVudChjaGlsZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoY2hpbGQudHlwZSAmJiBfaXNGdW5jdGlvbihjaGlsZC50eXBlLmdldERhdGEpKSB7XG4gICAgICBkYXRhID0gY2hpbGQudHlwZS5nZXREYXRhKGNoaWxkUHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gRGF0YS5nZXREYXRhKGNoaWxkUHJvcHMpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhLm1hcChmdW5jdGlvbiAoZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogZC54TmFtZSxcbiAgICAgICAgeTogZC55TmFtZVxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgaW5pdGlhbE1lbW8gPSB7XG4gICAgeDogW10sXG4gICAgeTogW11cbiAgfTtcblxuICB2YXIgY29tYmluZSA9IGZ1bmN0aW9uIChtZW1vLCBkYXR1bSkge1xuICAgIHZhciB4ID0gQXJyYXkuaXNBcnJheShkYXR1bSkgPyBkYXR1bS5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgIHJldHVybiBkLng7XG4gICAgfSkuZmlsdGVyKEJvb2xlYW4pIDogZGF0dW0ueDtcbiAgICB2YXIgeSA9IEFycmF5LmlzQXJyYXkoZGF0dW0pID8gZGF0dW0ubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgICByZXR1cm4gZC55O1xuICAgIH0pLmZpbHRlcihCb29sZWFuKSA6IGRhdHVtLnk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHggIT09IHVuZGVmaW5lZCA/IG1lbW8ueC5jb25jYXQoeCkgOiBtZW1vLngsXG4gICAgICB5OiB5ICE9PSB1bmRlZmluZWQgPyBtZW1vLnkuY29uY2F0KHkpIDogbWVtby55XG4gICAgfTtcbiAgfTtcblxuICByZXR1cm4gSGVscGVycy5yZWR1Y2VDaGlsZHJlbihjaGlsZENvbXBvbmVudHMuc2xpY2UoMCksIGl0ZXJhdGVlLCB7fSwgaW5pdGlhbE1lbW8sIGNvbWJpbmUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldENhdGVnb3J5QW5kQXhpc1N0cmluZ3NGcm9tQ2hpbGRyZW4ocHJvcHMsIGF4aXMsIGNoaWxkQ29tcG9uZW50cykge1xuICB2YXIgY2F0ZWdvcmllcyA9IF9pc1BsYWluT2JqZWN0KHByb3BzLmNhdGVnb3JpZXMpID8gcHJvcHMuY2F0ZWdvcmllc1theGlzXSA6IHByb3BzLmNhdGVnb3JpZXM7XG4gIHZhciBheGlzQ29tcG9uZW50ID0gQXhpcy5nZXRBeGlzQ29tcG9uZW50KGNoaWxkQ29tcG9uZW50cywgYXhpcyk7XG4gIHZhciBheGlzU3RyaW5ncyA9IGF4aXNDb21wb25lbnQgPyBEYXRhLmdldFN0cmluZ3NGcm9tQXhlcyhheGlzQ29tcG9uZW50LnByb3BzLCBheGlzKSA6IFtdO1xuICB2YXIgY2F0ZWdvcnlTdHJpbmdzID0gY2F0ZWdvcmllcyB8fCBnZXRTdHJpbmdzRnJvbUNhdGVnb3JpZXMoY2hpbGRDb21wb25lbnRzLCBheGlzKTtcbiAgcmV0dXJuIF91bmlxKF9mbGF0dGVuKF90b0NvbnN1bWFibGVBcnJheShjYXRlZ29yeVN0cmluZ3MpLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYXhpc1N0cmluZ3MpKSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmluZ3NGcm9tQ2hpbGRyZW4ocHJvcHMsIGNoaWxkQ29tcG9uZW50cykge1xuICBjaGlsZENvbXBvbmVudHMgPSBjaGlsZENvbXBvbmVudHMgfHwgUmVhY3QuQ2hpbGRyZW4udG9BcnJheShwcm9wcy5jaGlsZHJlbik7XG4gIHZhciB4U3RyaW5ncyA9IGdldENhdGVnb3J5QW5kQXhpc1N0cmluZ3NGcm9tQ2hpbGRyZW4ocHJvcHMsIFwieFwiLCBjaGlsZENvbXBvbmVudHMpO1xuICB2YXIgeVN0cmluZ3MgPSBnZXRDYXRlZ29yeUFuZEF4aXNTdHJpbmdzRnJvbUNoaWxkcmVuKHByb3BzLCBcInlcIiwgY2hpbGRDb21wb25lbnRzKTtcbiAgdmFyIGRhdGFTdHJpbmdzID0gZ2V0U3RyaW5nc0Zyb21EYXRhKGNoaWxkQ29tcG9uZW50cyk7XG4gIHJldHVybiB7XG4gICAgeDogX3VuaXEoX2ZsYXR0ZW4oX3RvQ29uc3VtYWJsZUFycmF5KHhTdHJpbmdzKS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGRhdGFTdHJpbmdzLngpKSkpLFxuICAgIHk6IF91bmlxKF9mbGF0dGVuKF90b0NvbnN1bWFibGVBcnJheSh5U3RyaW5ncykuY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShkYXRhU3RyaW5ncy55KSkpKVxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldENhdGVnb3JpZXMocHJvcHMsIGNoaWxkQ29tcG9uZW50cywgYWxsU3RyaW5ncykge1xuICB2YXIgeFByb3BDYXRlZ29yaWVzID0gcHJvcHMuY2F0ZWdvcmllcyAmJiAhQXJyYXkuaXNBcnJheShwcm9wcy5jYXRlZ29yaWVzKSA/IHByb3BzLmNhdGVnb3JpZXMueCA6IHByb3BzLmNhdGVnb3JpZXM7XG4gIHZhciB5UHJvcENhdGVnb3JpZXMgPSBwcm9wcy5jYXRlZ29yaWVzICYmICFBcnJheS5pc0FycmF5KHByb3BzLmNhdGVnb3JpZXMpID8gcHJvcHMuY2F0ZWdvcmllcy55IDogcHJvcHMuY2F0ZWdvcmllcztcbiAgdmFyIGZhbGxiYWNrUmVxdWlyZWQgPSAheFByb3BDYXRlZ29yaWVzIHx8ICF5UHJvcENhdGVnb3JpZXM7XG4gIHZhciBmYWxsYmFja1Byb3BzID0gZmFsbGJhY2tSZXF1aXJlZCA/IGFsbFN0cmluZ3MgfHwgZ2V0U3RyaW5nc0Zyb21DaGlsZHJlbihwcm9wcywgY2hpbGRDb21wb25lbnRzKSA6IHt9O1xuICB2YXIgeENhdGVnb3JpZXMgPSB4UHJvcENhdGVnb3JpZXMgfHwgZmFsbGJhY2tQcm9wcy54O1xuICB2YXIgeUNhdGVnb3JpZXMgPSB5UHJvcENhdGVnb3JpZXMgfHwgZmFsbGJhY2tQcm9wcy55O1xuICByZXR1cm4ge1xuICAgIHg6IHhDYXRlZ29yaWVzLmxlbmd0aCA+IDAgPyB4Q2F0ZWdvcmllcyA6IHVuZGVmaW5lZCxcbiAgICB5OiB5Q2F0ZWdvcmllcy5sZW5ndGggPiAwID8geUNhdGVnb3JpZXMgOiB1bmRlZmluZWRcbiAgfTtcbn0iLCJpbXBvcnQgX2lzUmVnRXhwIGZyb20gXCJsb2Rhc2gvaXNSZWdFeHBcIjtcbmltcG9ydCBfZmluZCBmcm9tIFwibG9kYXNoL2ZpbmRcIjtcbmltcG9ydCBfaXNGdW5jdGlvbiBmcm9tIFwibG9kYXNoL2lzRnVuY3Rpb25cIjtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0ICogYXMgTG9nIGZyb20gXCIuL2xvZ1wiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuLyoqXG4gKiBSZXR1cm4gYSBuZXcgdmFsaWRhdG9yIGJhc2VkIG9uIGB2YWxpZGF0b3JgIGJ1dCB3aXRoIHRoZSBvcHRpb24gdG8gY2hhaW5cbiAqIGBpc1JlcXVpcmVkYCBvbnRvIHRoZSB2YWxpZGF0aW9uLiBUaGlzIGlzIG5lYXJseSBpZGVudGljYWwgdG8gaG93IFJlYWN0XG4gKiBkb2VzIGl0IGludGVybmFsbHksIGJ1dCB0aGV5IGRvbid0IGV4cG9zZSB0aGVpciBoZWxwZXIgZm9yIHVzIHRvIHVzZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbGlkYXRvciBWYWxpZGF0aW9uIGZ1bmN0aW9uLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBWYWxpZGF0b3Igd2l0aCBgaXNSZXF1aXJlZGAgb3B0aW9uLlxuICovXG5cbnZhciBtYWtlQ2hhaW5hYmxlID0gZnVuY3Rpb24gKHZhbGlkYXRvcikge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtcGFyYW1zICovXG4gIHZhciBfY2hhaW5hYmxlID0gZnVuY3Rpb24gKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgIHZhciB2YWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcblxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKFwiUmVxdWlyZWQgYFwiLmNvbmNhdChwcm9wTmFtZSwgXCJgIHdhcyBub3Qgc3BlY2lmaWVkIGluIGBcIikuY29uY2F0KGNvbXBvbmVudE5hbWUsIFwiYC5cIikpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuID4gNCA/IF9sZW4gLSA0IDogMCksIF9rZXkgPSA0OyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICByZXN0W19rZXkgLSA0XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yLmFwcGx5KHZvaWQgMCwgW3Byb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZV0uY29uY2F0KHJlc3QpKTtcbiAgfTtcblxuICB2YXIgY2hhaW5hYmxlID0gX2NoYWluYWJsZS5iaW5kKG51bGwsIGZhbHNlKTtcblxuICBjaGFpbmFibGUuaXNSZXF1aXJlZCA9IF9jaGFpbmFibGUuYmluZChudWxsLCB0cnVlKTtcbiAgcmV0dXJuIGNoYWluYWJsZTtcbn07XG5cbnZhciBudWxsQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxudmFyIHVuZGVmaW5lZENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbi8qKlxuICogR2V0IHRoZSBjb25zdHJ1Y3RvciBvZiBgdmFsdWVgLiBJZiBgdmFsdWVgIGlzIG51bGwgb3IgdW5kZWZpbmVkLCByZXR1cm4gdGhlXG4gKiBzcGVjaWFsIHNpbmdsZXRvbnMgYG51bGxDb25zdHJ1Y3RvcmAgb3IgYHVuZGVmaW5lZENvbnN0cnVjdG9yYCwgcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBJbnN0YW5jZSB0byByZXR1cm4gdGhlIGNvbnN0cnVjdG9yIG9mLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBDb25zdHJ1Y3RvciBvZiBgdmFsdWVgLlxuICovXG5cblxudmFyIGdldENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZENvbnN0cnVjdG9yO1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGxDb25zdHJ1Y3RvcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsdWUuY29uc3RydWN0b3I7XG4gIH1cbn07XG4vKipcbiAqIEdldCB0aGUgbmFtZSBvZiB0aGUgY29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgYHZhbHVlYCwgdXNpbmdcbiAqIGBPYmplY3QucHJvdG95cGUudG9TdHJpbmdgLiBJZiB0aGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQsIHJldHVyblxuICogXCJudWxsXCIgb3IgXCJ1bmRlZmluZWRcIiwgcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBJbnN0YW5jZSB0byByZXR1cm4gdGhlIGNvbnN0cnVjdG9yIG5hbWUgb2YuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBOYW1lIG9mIHRoZSBjb25zdHJ1Y3Rvci5cbiAqL1xuXG5cbnZhciBnZXRDb25zdHJ1Y3Rvck5hbWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBcIm51bGxcIjtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG59O1xuLyoqXG4gKiBSZXR1cm4gYSBuZXcgdmFsaWRhdG9yIGJhc2VkIG9uIGBwcm9wVHlwZWAgYnV0IHdoaWNoIGxvZ3MgYSBgY29uc29sZS5lcnJvcmBcbiAqIHdpdGggYGV4cGxhbmF0aW9uYCBpZiB1c2VkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJvcFR5cGUgVGhlIG9sZCwgZGVwcmVjYXRlZCBwcm9wVHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBleHBsYW5hdGlvbiBUaGUgbWVzc2FnZSB0byBwcm92aWRlIHRoZSB1c2VyIG9mIHRoZSBkZXByZWNhdGVkIHByb3BUeXBlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBWYWxpZGF0b3Igd2hpY2ggbG9ncyB1c2FnZSBvZiB0aGlzIHByb3BUeXBlXG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRlZChwcm9wVHlwZSwgZXhwbGFuYXRpb24pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG5cbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgTG9nLndhcm4oXCJcXFwiXCIuY29uY2F0KHByb3BOYW1lLCBcIlxcXCIgcHJvcGVydHkgb2YgXFxcIlwiKS5jb25jYXQoY29tcG9uZW50TmFtZSwgXCJcXFwiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgXCIpLmNvbmNhdChleHBsYW5hdGlvbikpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoX2RlZmluZVByb3BlcnR5KHt9LCBwcm9wTmFtZSwgcHJvcFR5cGUpLCBwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICB9O1xufVxuLyoqXG4gKiBSZXR1cm4gYSBuZXcgdmFsaWRhdG9yIHdoaWNoIHJldHVybnMgdHJ1ZVxuICogaWYgYW5kIG9ubHkgaWYgYWxsIHZhbGlkYXRvcnMgcGFzc2VkIGFzIGFyZ3VtZW50cyByZXR1cm4gdHJ1ZS5cbiAqIExpa2UgUmVhY3QucHJvcFR5cGVzLm9uZU9mVHlwZSwgZXhjZXB0IFwiYWxsXCIgaW5zdGVhZCBvZiBcImFueVwiXG4gKiBAcGFyYW0ge0FycmF5fSB2YWxpZGF0b3JzIFZhbGlkYXRpb24gZnVuY3Rpb25zLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBDb21iaW5lZCB2YWxpZGF0b3IgZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWxsT2ZUeXBlKHZhbGlkYXRvcnMpIHtcbiAgcmV0dXJuIG1ha2VDaGFpbmFibGUoZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuMiA+IDMgPyBfbGVuMiAtIDMgOiAwKSwgX2tleTIgPSAzOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICByZXN0W19rZXkyIC0gM10gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3JzLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCB2YWxpZGF0b3IpIHtcbiAgICAgIHJldHVybiByZXN1bHQgfHwgdmFsaWRhdG9yLmFwcGx5KHZvaWQgMCwgW3Byb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZV0uY29uY2F0KHJlc3QpKTtcbiAgICB9LCB1bmRlZmluZWQpO1xuICB9KTtcbn1cbi8qKlxuICogQ2hlY2sgdGhhdCB0aGUgdmFsdWUgaXMgYSBub24tbmVnYXRpdmUgbnVtYmVyLlxuICovXG5cbmV4cG9ydCB2YXIgbm9uTmVnYXRpdmUgPSBtYWtlQ2hhaW5hYmxlKGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgdmFyIHZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgfHwgdmFsdWUgPCAwKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcImBcIi5jb25jYXQocHJvcE5hbWUsIFwiYCBpbiBgXCIpLmNvbmNhdChjb21wb25lbnROYW1lLCBcImAgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuXCIpKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59KTtcbi8qKlxuICogQ2hlY2sgdGhhdCB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlci5cbiAqL1xuXG5leHBvcnQgdmFyIGludGVnZXIgPSBtYWtlQ2hhaW5hYmxlKGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgdmFyIHZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgfHwgdmFsdWUgJSAxICE9PSAwKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcImBcIi5jb25jYXQocHJvcE5hbWUsIFwiYCBpbiBgXCIpLmNvbmNhdChjb21wb25lbnROYW1lLCBcImAgbXVzdCBiZSBhbiBpbnRlZ2VyLlwiKSk7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSk7XG4vKipcbiAqIENoZWNrIHRoYXQgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLlxuICovXG5cbmV4cG9ydCB2YXIgZ3JlYXRlclRoYW5aZXJvID0gbWFrZUNoYWluYWJsZShmdW5jdGlvbiAocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gIHZhciB2YWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiIHx8IHZhbHVlIDw9IDApIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFwiYFwiLmNvbmNhdChwcm9wTmFtZSwgXCJgIGluIGBcIikuY29uY2F0KGNvbXBvbmVudE5hbWUsIFwiYCBtdXN0IGJlIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvLlwiKSk7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSk7XG4vKipcbiAqIENoZWNrIHRoYXQgdGhlIHZhbHVlIGlzIGFuIEFycmF5IG9mIHR3byB1bmlxdWUgdmFsdWVzLlxuICovXG5cbmV4cG9ydCB2YXIgZG9tYWluID0gbWFrZUNoYWluYWJsZShmdW5jdGlvbiAocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gIHZhciB2YWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCAhPT0gMiB8fCB2YWx1ZVsxXSA9PT0gdmFsdWVbMF0pIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFwiYFwiLmNvbmNhdChwcm9wTmFtZSwgXCJgIGluIGBcIikuY29uY2F0KGNvbXBvbmVudE5hbWUsIFwiYCBtdXN0IGJlIGFuIGFycmF5IG9mIHR3byB1bmlxdWUgbnVtZXJpYyB2YWx1ZXMuXCIpKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59KTtcbi8qKlxuICogQ2hlY2sgdGhhdCB0aGUgdmFsdWUgbG9va3MgbGlrZSBhIGQzIGBzY2FsZWAgZnVuY3Rpb24uXG4gKi9cblxuZXhwb3J0IHZhciBzY2FsZSA9IG1ha2VDaGFpbmFibGUoZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICB2YXIgc3VwcG9ydGVkU2NhbGVTdHJpbmdzID0gW1wibGluZWFyXCIsIFwidGltZVwiLCBcImxvZ1wiLCBcInNxcnRcIl07XG5cbiAgdmFyIHZhbGlkU2NhbGUgPSBmdW5jdGlvbiAoc2NsKSB7XG4gICAgaWYgKF9pc0Z1bmN0aW9uKHNjbCkpIHtcbiAgICAgIHJldHVybiBfaXNGdW5jdGlvbihzY2wuY29weSkgJiYgX2lzRnVuY3Rpb24oc2NsLmRvbWFpbikgJiYgX2lzRnVuY3Rpb24oc2NsLnJhbmdlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBzY2wgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBzdXBwb3J0ZWRTY2FsZVN0cmluZ3MuaW5kZXhPZihzY2wpICE9PSAtMTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgdmFyIHZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuXG4gIGlmICghdmFsaWRTY2FsZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFwiYFwiLmNvbmNhdChwcm9wTmFtZSwgXCJgIGluIGBcIikuY29uY2F0KGNvbXBvbmVudE5hbWUsIFwiYCBtdXN0IGJlIGEgZDMgc2NhbGUuXCIpKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59KTtcbi8qKlxuICogQ2hlY2sgdGhhdCBhbiBhcnJheSBjb250YWlucyBpdGVtcyBvZiB0aGUgc2FtZSB0eXBlLlxuICovXG5cbmV4cG9ydCB2YXIgaG9tb2dlbmVvdXNBcnJheSA9IG1ha2VDaGFpbmFibGUoZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICB2YXIgdmFsdWVzID0gcHJvcHNbcHJvcE5hbWVdO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcImBcIi5jb25jYXQocHJvcE5hbWUsIFwiYCBpbiBgXCIpLmNvbmNhdChjb21wb25lbnROYW1lLCBcImAgbXVzdCBiZSBhbiBhcnJheS5cIikpO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBjb21wYXJpc29uQ29uc3RydWN0b3IgPSBnZXRDb25zdHJ1Y3Rvcih2YWx1ZXNbMF0pO1xuXG4gIHZhciB0eXBlTWlzbWF0Y2hlZFZhbHVlID0gX2ZpbmQodmFsdWVzLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gY29tcGFyaXNvbkNvbnN0cnVjdG9yICE9PSBnZXRDb25zdHJ1Y3Rvcih2YWx1ZSk7XG4gIH0pO1xuXG4gIGlmICh0eXBlTWlzbWF0Y2hlZFZhbHVlKSB7XG4gICAgdmFyIGNvbnN0cnVjdG9yTmFtZSA9IGdldENvbnN0cnVjdG9yTmFtZSh2YWx1ZXNbMF0pO1xuICAgIHZhciBvdGhlckNvbnN0cnVjdG9yTmFtZSA9IGdldENvbnN0cnVjdG9yTmFtZSh0eXBlTWlzbWF0Y2hlZFZhbHVlKTtcbiAgICByZXR1cm4gbmV3IEVycm9yKFwiRXhwZWN0ZWQgYFwiLmNvbmNhdChwcm9wTmFtZSwgXCJgIGluIGBcIikuY29uY2F0KGNvbXBvbmVudE5hbWUsIFwiYCB0byBiZSBhIFwiKSArIFwiaG9tb2dlbmVvdXMgYXJyYXksIGJ1dCBmb3VuZCB0eXBlcyBgXCIuY29uY2F0KGNvbnN0cnVjdG9yTmFtZSwgXCJgIGFuZCBcIikgKyBcImBcIi5jb25jYXQob3RoZXJDb25zdHJ1Y3Rvck5hbWUsIFwiYC5cIikpO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn0pO1xuLyoqXG4gKiBDaGVjayB0aGF0IGFycmF5IHByb3AgbGVuZ3RoIG1hdGNoZXMgcHJvcHMuZGF0YS5sZW5ndGhcbiAqL1xuXG5leHBvcnQgdmFyIG1hdGNoRGF0YUxlbmd0aCA9IG1ha2VDaGFpbmFibGUoZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSkge1xuICBpZiAocHJvcHNbcHJvcE5hbWVdICYmIEFycmF5LmlzQXJyYXkocHJvcHNbcHJvcE5hbWVdKSAmJiBwcm9wc1twcm9wTmFtZV0ubGVuZ3RoICE9PSBwcm9wcy5kYXRhLmxlbmd0aCkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoXCJMZW5ndGggb2YgZGF0YSBhbmQgXCIuY29uY2F0KHByb3BOYW1lLCBcIiBhcnJheXMgbXVzdCBtYXRjaC5cIikpO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn0pO1xuLyoqXG4gKiBDaGVjayB0aGF0IHRoZSB2YWx1ZSBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvblxuICovXG5cbmV4cG9ydCB2YXIgcmVnRXhwID0gbWFrZUNoYWluYWJsZShmdW5jdGlvbiAocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gIGlmIChwcm9wc1twcm9wTmFtZV0gJiYgIV9pc1JlZ0V4cChwcm9wc1twcm9wTmFtZV0pKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcImBcIi5jb25jYXQocHJvcE5hbWUsIFwiYCBpbiBgXCIpLmNvbmNhdChjb21wb25lbnROYW1lLCBcImAgbXVzdCBiZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cIikpO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn0pOyIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCAqIGFzIEN1c3RvbVByb3BUeXBlcyBmcm9tIFwiLi9wcm9wLXR5cGVzXCI7XG5leHBvcnQgdmFyIGRhdGFQcm9wcyA9IHtcbiAgY2F0ZWdvcmllczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgeDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gICAgeTogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZylcbiAgfSldKSxcbiAgZGF0YTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5LCBQcm9wVHlwZXMub2JqZWN0XSksXG4gIGRhdGFDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICBkaXNhYmxlSW5saW5lU3R5bGVzOiBQcm9wVHlwZXMuYm9vbCxcbiAgbGFiZWxDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICBsYWJlbHM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5mdW5jLCBQcm9wVHlwZXMuYXJyYXldKSxcbiAgc2FtcGxlczogQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlLFxuICBzb3J0S2V5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgQ3VzdG9tUHJvcFR5cGVzLmFsbE9mVHlwZShbQ3VzdG9tUHJvcFR5cGVzLmludGVnZXIsIEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZV0pLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKV0pLFxuICBzb3J0T3JkZXI6IFByb3BUeXBlcy5vbmVPZihbXCJhc2NlbmRpbmdcIiwgXCJkZXNjZW5kaW5nXCJdKSxcbiAgc3R5bGU6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgcGFyZW50OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGRhdGE6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgbGFiZWxzOiBQcm9wVHlwZXMub2JqZWN0XG4gIH0pLFxuICB4OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgQ3VzdG9tUHJvcFR5cGVzLmFsbE9mVHlwZShbQ3VzdG9tUHJvcFR5cGVzLmludGVnZXIsIEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZV0pLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKV0pLFxuICB5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgQ3VzdG9tUHJvcFR5cGVzLmFsbE9mVHlwZShbQ3VzdG9tUHJvcFR5cGVzLmludGVnZXIsIEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZV0pLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKV0pLFxuICB5MDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIEN1c3RvbVByb3BUeXBlcy5hbGxPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5pbnRlZ2VyLCBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmVdKSwgUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyldKVxufTtcbmV4cG9ydCB2YXIgYmFzZVByb3BzID0ge1xuICBhbmltYXRlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9iamVjdF0pLFxuICBjb250YWluZXJDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICBkb21haW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5kb21haW4sIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgeDogQ3VzdG9tUHJvcFR5cGVzLmRvbWFpbixcbiAgICB5OiBDdXN0b21Qcm9wVHlwZXMuZG9tYWluXG4gIH0pXSksXG4gIG1heERvbWFpbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmluc3RhbmNlT2YoRGF0ZSksIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgeDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmluc3RhbmNlT2YoRGF0ZSldKSxcbiAgICB5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuaW5zdGFuY2VPZihEYXRlKV0pXG4gIH0pXSksXG4gIG1pbkRvbWFpbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmluc3RhbmNlT2YoRGF0ZSksIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgeDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmluc3RhbmNlT2YoRGF0ZSldKSxcbiAgICB5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuaW5zdGFuY2VPZihEYXRlKV0pXG4gIH0pXSksXG4gIGRvbWFpblBhZGRpbmc6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zaGFwZSh7XG4gICAgeDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm51bWJlcildKSxcbiAgICB5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKV0pXG4gIH0pLCBQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKV0pLFxuICBldmVudEtleTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIEN1c3RvbVByb3BUeXBlcy5hbGxPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5pbnRlZ2VyLCBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmVdKSwgUHJvcFR5cGVzLnN0cmluZ10pLFxuICBldmVudHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zaGFwZSh7XG4gICAgdGFyZ2V0OiBQcm9wVHlwZXMub25lT2YoW1wiZGF0YVwiLCBcImxhYmVsc1wiLCBcInBhcmVudFwiXSksXG4gICAgZXZlbnRLZXk6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheSwgQ3VzdG9tUHJvcFR5cGVzLmFsbE9mVHlwZShbQ3VzdG9tUHJvcFR5cGVzLmludGVnZXIsIEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZV0pLCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gICAgZXZlbnRIYW5kbGVyczogUHJvcFR5cGVzLm9iamVjdFxuICB9KSksXG4gIGV4dGVybmFsRXZlbnRNdXRhdGlvbnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zaGFwZSh7XG4gICAgY2FsbGJhY2s6IFByb3BUeXBlcy5mdW5jdGlvbixcbiAgICBjaGlsZE5hbWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5hcnJheV0pLFxuICAgIGV2ZW50S2V5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXksIEN1c3RvbVByb3BUeXBlcy5hbGxPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5pbnRlZ2VyLCBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmVdKSwgUHJvcFR5cGVzLnN0cmluZ10pLFxuICAgIG11dGF0aW9uOiBQcm9wVHlwZXMuZnVuY3Rpb24sXG4gICAgdGFyZ2V0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuYXJyYXldKVxuICB9KSksXG4gIGdyb3VwQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgaGVpZ2h0OiBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmUsXG4gIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIG9yaWdpbjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICB4OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHk6IFByb3BUeXBlcy5udW1iZXJcbiAgfSksXG4gIHBhZGRpbmc6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgdG9wOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGJvdHRvbTogUHJvcFR5cGVzLm51bWJlcixcbiAgICBsZWZ0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHJpZ2h0OiBQcm9wVHlwZXMubnVtYmVyXG4gIH0pXSksXG4gIHBvbGFyOiBQcm9wVHlwZXMuYm9vbCxcbiAgcmFuZ2U6IFByb3BUeXBlcy5vbmVPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5kb21haW4sIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgeDogQ3VzdG9tUHJvcFR5cGVzLmRvbWFpbixcbiAgICB5OiBDdXN0b21Qcm9wVHlwZXMuZG9tYWluXG4gIH0pXSksXG4gIHNjYWxlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMuc2NhbGUsIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgeDogQ3VzdG9tUHJvcFR5cGVzLnNjYWxlLFxuICAgIHk6IEN1c3RvbVByb3BUeXBlcy5zY2FsZVxuICB9KV0pLFxuICBzaGFyZWRFdmVudHM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgZXZlbnRzOiBQcm9wVHlwZXMuYXJyYXksXG4gICAgZ2V0RXZlbnRTdGF0ZTogUHJvcFR5cGVzLmZ1bmNcbiAgfSksXG4gIHNpbmdsZVF1YWRyYW50RG9tYWluUGFkZGluZzogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgeDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2xdKSxcbiAgICB5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbF0pXG4gIH0pXSksXG4gIHN0YW5kYWxvbmU6IFByb3BUeXBlcy5ib29sLFxuICB0aGVtZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgd2lkdGg6IEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZVxufTtcbmV4cG9ydCB2YXIgcHJpbWl0aXZlUHJvcHMgPSB7XG4gIGFjdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG4gIGFyaWFMYWJlbDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjbGlwUGF0aDogUHJvcFR5cGVzLnN0cmluZyxcbiAgZGF0YTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5LCBQcm9wVHlwZXMub2JqZWN0XSksXG4gIGRlc2M6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gIGRpc2FibGVJbmxpbmVTdHlsZXM6IFByb3BUeXBlcy5ib29sLFxuICBldmVudHM6IFByb3BUeXBlcy5vYmplY3QsXG4gIGlkOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuZnVuY10pLFxuICBpbmRleDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuICBvcmlnaW46IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgeDogUHJvcFR5cGVzLm51bWJlcixcbiAgICB5OiBQcm9wVHlwZXMubnVtYmVyXG4gIH0pLFxuICBwb2xhcjogUHJvcFR5cGVzLmJvb2wsXG4gIHJvbGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHNjYWxlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMuc2NhbGUsIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgeDogQ3VzdG9tUHJvcFR5cGVzLnNjYWxlLFxuICAgIHk6IEN1c3RvbVByb3BUeXBlcy5zY2FsZVxuICB9KV0pLFxuICBzaGFwZVJlbmRlcmluZzogUHJvcFR5cGVzLnN0cmluZyxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIHRhYkluZGV4OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuZnVuY10pLFxuICB0cmFuc2Zvcm06IFByb3BUeXBlcy5zdHJpbmdcbn07IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbnZhciBSZWN0ID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9wcm9wLXR5cGVzXG4gIHZhciBkZXNjID0gcHJvcHMuZGVzYyxcbiAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImRlc2NcIl0pO1xuXG4gIHJldHVybiBkZXNjID8gUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwgX2V4dGVuZHMoe1xuICAgIHZlY3RvckVmZmVjdDogXCJub24tc2NhbGluZy1zdHJva2VcIlxuICB9LCByZXN0KSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRlc2NcIiwgbnVsbCwgZGVzYykpIDogUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwgX2V4dGVuZHMoe1xuICAgIHZlY3RvckVmZmVjdDogXCJub24tc2NhbGluZy1zdHJva2VcIlxuICB9LCByZXN0KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSZWN0OyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG52YXIgQ2lyY2xlID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9wcm9wLXR5cGVzXG4gIHZhciBkZXNjID0gcHJvcHMuZGVzYyxcbiAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImRlc2NcIl0pO1xuXG4gIHJldHVybiBkZXNjID8gUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCBfZXh0ZW5kcyh7XG4gICAgdmVjdG9yRWZmZWN0OiBcIm5vbi1zY2FsaW5nLXN0cm9rZVwiXG4gIH0sIHJlc3QpLCBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGVzY1wiLCBudWxsLCBkZXNjKSkgOiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIF9leHRlbmRzKHtcbiAgICB2ZWN0b3JFZmZlY3Q6IFwibm9uLXNjYWxpbmctc3Ryb2tlXCJcbiAgfSwgcmVzdCkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQ2lyY2xlOyIsImltcG9ydCBfYXNzaWduIGZyb20gXCJsb2Rhc2gvYXNzaWduXCI7XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tIFwiLi4vdmljdG9yeS11dGlsL2hlbHBlcnNcIjtcbmltcG9ydCAqIGFzIENvbW1vblByb3BzIGZyb20gXCIuLi92aWN0b3J5LXV0aWwvY29tbW9uLXByb3BzXCI7XG5pbXBvcnQgUmVjdCBmcm9tIFwiLi9yZWN0XCI7XG5pbXBvcnQgQ2lyY2xlIGZyb20gXCIuL2NpcmNsZVwiO1xuXG52YXIgZXZhbHVhdGVQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAvKipcbiAgICogUG90ZW50aWFsIGV2YWx1YXRlZCBwcm9wIGlzOlxuICAgKiBgaWRgXG4gICAqL1xuICB2YXIgaWQgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy5pZCwgcHJvcHMpO1xuICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBpZDogaWRcbiAgfSk7XG59O1xuXG52YXIgQmFja2dyb3VuZCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBwcm9wcyA9IGV2YWx1YXRlUHJvcHMocHJvcHMpO1xuICByZXR1cm4gcHJvcHMucG9sYXIgPyBSZWFjdC5jbG9uZUVsZW1lbnQocHJvcHMuY2lyY2xlQ29tcG9uZW50LCBfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcy5ldmVudHMsIHtcbiAgICBzdHlsZTogcHJvcHMuc3R5bGUsXG4gICAgcm9sZTogcHJvcHMucm9sZSxcbiAgICBzaGFwZVJlbmRlcmluZzogcHJvcHMuc2hhcGVSZW5kZXJpbmcsXG4gICAgY3g6IHByb3BzLngsXG4gICAgY3k6IHByb3BzLnksXG4gICAgcjogcHJvcHMuaGVpZ2h0LFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lXG4gIH0pKSA6IFJlYWN0LmNsb25lRWxlbWVudChwcm9wcy5yZWN0Q29tcG9uZW50LCBfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcy5ldmVudHMsIHtcbiAgICBzdHlsZTogcHJvcHMuc3R5bGUsXG4gICAgcm9sZTogcHJvcHMucm9sZSxcbiAgICBzaGFwZVJlbmRlcmluZzogcHJvcHMuc2hhcGVSZW5kZXJpbmcsXG4gICAgeDogcHJvcHMueCxcbiAgICB5OiBwcm9wcy55LFxuICAgIHJ4OiBwcm9wcy5yeCxcbiAgICByeTogcHJvcHMucnksXG4gICAgd2lkdGg6IHByb3BzLndpZHRoLFxuICAgIGhlaWdodDogcHJvcHMuaGVpZ2h0LFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lXG4gIH0pKTtcbn07XG5cbkJhY2tncm91bmQucHJvcFR5cGVzID0gX29iamVjdFNwcmVhZCh7fSwgQ29tbW9uUHJvcHMucHJpbWl0aXZlUHJvcHMsIHtcbiAgY2lyY2xlQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgaGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICByZWN0Q29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgcng6IFByb3BUeXBlcy5udW1iZXIsXG4gIHJ5OiBQcm9wVHlwZXMubnVtYmVyLFxuICB3aWR0aDogUHJvcFR5cGVzLm51bWJlcixcbiAgeDogUHJvcFR5cGVzLm51bWJlcixcbiAgeTogUHJvcFR5cGVzLm51bWJlclxufSk7XG5CYWNrZ3JvdW5kLmRlZmF1bHRQcm9wcyA9IHtcbiAgY2lyY2xlQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KENpcmNsZSwgbnVsbCksXG4gIHJlY3RDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVjdCwgbnVsbCksXG4gIHJvbGU6IFwicHJlc2VudGF0aW9uXCIsXG4gIHNoYXBlUmVuZGVyaW5nOiBcImF1dG9cIlxufTtcbmV4cG9ydCBkZWZhdWx0IEJhY2tncm91bmQ7IiwiaW1wb3J0IF9rZXlzIGZyb20gXCJsb2Rhc2gva2V5c1wiO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCAqIGFzIEN1c3RvbVByb3BUeXBlcyBmcm9tIFwiLi4vdmljdG9yeS11dGlsL3Byb3AtdHlwZXNcIjtcblxudmFyIFBvcnRhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUG9ydGFsLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQb3J0YWwocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9ydGFsKTtcblxuICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKFBvcnRhbC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFBvcnRhbCkpLmNhbGwodGhpcywgcHJvcHMpKTtcbiAgICBfdGhpcy5tYXAgPSB7fTtcbiAgICBfdGhpcy5pbmRleCA9IDE7XG4gICAgX3RoaXMucG9ydGFsVXBkYXRlID0gX3RoaXMucG9ydGFsVXBkYXRlLmJpbmQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIF90aGlzLnBvcnRhbFJlZ2lzdGVyID0gX3RoaXMucG9ydGFsUmVnaXN0ZXIuYmluZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgX3RoaXMucG9ydGFsRGVyZWdpc3RlciA9IF90aGlzLnBvcnRhbERlcmVnaXN0ZXIuYmluZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFBvcnRhbCwgW3tcbiAgICBrZXk6IFwicG9ydGFsUmVnaXN0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9ydGFsUmVnaXN0ZXIoKSB7XG4gICAgICByZXR1cm4gKyt0aGlzLmluZGV4O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwb3J0YWxVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9ydGFsVXBkYXRlKGtleSwgZWxlbWVudCkge1xuICAgICAgdGhpcy5tYXBba2V5XSA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBvcnRhbERlcmVnaXN0ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9ydGFsRGVyZWdpc3RlcihrZXkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm1hcFtrZXldO1xuICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDaGlsZHJlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDaGlsZHJlbigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gX2tleXModGhpcy5tYXApLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBlbCA9IF90aGlzMi5tYXBba2V5XTtcbiAgICAgICAgcmV0dXJuIGVsID8gUmVhY3QuY2xvbmVFbGVtZW50KGVsLCB7XG4gICAgICAgICAga2V5OiBrZXlcbiAgICAgICAgfSkgOiBlbDtcbiAgICAgIH0pO1xuICAgIH0gLy8gT3ZlcnJpZGRlbiBpbiB2aWN0b3J5LWNvcmUtbmF0aXZlXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgdGhpcy5wcm9wcywgdGhpcy5nZXRDaGlsZHJlbigpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUG9ydGFsO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUG9ydGFsLCBcImRpc3BsYXlOYW1lXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFwiUG9ydGFsXCJcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFBvcnRhbCwgXCJwcm9wVHlwZXNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZToge1xuICAgIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBoZWlnaHQ6IEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZSxcbiAgICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICB2aWV3Qm94OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHdpZHRoOiBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmVcbiAgfVxufSk7XG5leHBvcnQgeyBQb3J0YWwgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbi8qKlxuICogVGhlIFJlYWN0IGNvbnRleHQgb2JqZWN0IGNvbnN1bWVycyBtYXkgdXNlIHRvIGFjY2VzcyB0aGUgY29udGV4dCBvZiB0aGVcbiAqIHBvcnRhbC5cbiAqL1xuXG52YXIgUG9ydGFsQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuUG9ydGFsQ29udGV4dC5kaXNwbGF5TmFtZSA9IFwiUG9ydGFsQ29udGV4dFwiO1xuZXhwb3J0IGRlZmF1bHQgUG9ydGFsQ29udGV4dDsiLCJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKG51bGwsIGUpO1xuICAgIHQgPSB0Ll9uZXh0O1xuICB9XG4gIC0tZnJhbWU7XG59XG5cbmZ1bmN0aW9uIHdha2UoKSB7XG4gIGNsb2NrTm93ID0gKGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpKSArIGNsb2NrU2tldztcbiAgZnJhbWUgPSB0aW1lb3V0ID0gMDtcbiAgdHJ5IHtcbiAgICB0aW1lckZsdXNoKCk7XG4gIH0gZmluYWxseSB7XG4gICAgZnJhbWUgPSAwO1xuICAgIG5hcCgpO1xuICAgIGNsb2NrTm93ID0gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb2tlKCkge1xuICB2YXIgbm93ID0gY2xvY2subm93KCksIGRlbGF5ID0gbm93IC0gY2xvY2tMYXN0O1xuICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkpIGNsb2NrU2tldyAtPSBkZWxheSwgY2xvY2tMYXN0ID0gbm93O1xufVxuXG5mdW5jdGlvbiBuYXAoKSB7XG4gIHZhciB0MCwgdDEgPSB0YXNrSGVhZCwgdDIsIHRpbWUgPSBJbmZpbml0eTtcbiAgd2hpbGUgKHQxKSB7XG4gICAgaWYgKHQxLl9jYWxsKSB7XG4gICAgICBpZiAodGltZSA+IHQxLl90aW1lKSB0aW1lID0gdDEuX3RpbWU7XG4gICAgICB0MCA9IHQxLCB0MSA9IHQxLl9uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0MiA9IHQxLl9uZXh0LCB0MS5fbmV4dCA9IG51bGw7XG4gICAgICB0MSA9IHQwID8gdDAuX25leHQgPSB0MiA6IHRhc2tIZWFkID0gdDI7XG4gICAgfVxuICB9XG4gIHRhc2tUYWlsID0gdDA7XG4gIHNsZWVwKHRpbWUpO1xufVxuXG5mdW5jdGlvbiBzbGVlcCh0aW1lKSB7XG4gIGlmIChmcmFtZSkgcmV0dXJuOyAvLyBTb29uZXN0IGFsYXJtIGFscmVhZHkgc2V0LCBvciB3aWxsIGJlLlxuICBpZiAodGltZW91dCkgdGltZW91dCA9IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93OyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy5cbiAgaWYgKGRlbGF5ID4gMjQpIHtcbiAgICBpZiAodGltZSA8IEluZmluaXR5KSB0aW1lb3V0ID0gc2V0VGltZW91dCh3YWtlLCB0aW1lIC0gY2xvY2subm93KCkgLSBjbG9ja1NrZXcpO1xuICAgIGlmIChpbnRlcnZhbCkgaW50ZXJ2YWwgPSBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWludGVydmFsKSBjbG9ja0xhc3QgPSBjbG9jay5ub3coKSwgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChwb2tlLCBwb2tlRGVsYXkpO1xuICAgIGZyYW1lID0gMSwgc2V0RnJhbWUod2FrZSk7XG4gIH1cbn1cbiIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuaW1wb3J0IHsgdGltZXIsIG5vdyB9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgVGltZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUaW1lcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGltZXIpO1xuXG4gICAgdGhpcy5zaG91bGRBbmltYXRlID0gdHJ1ZTtcbiAgICB0aGlzLnN1YnNjcmliZXJzID0gW107XG4gICAgdGhpcy5sb29wID0gdGhpcy5sb29wLmJpbmQodGhpcyk7XG4gICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgdGhpcy5hY3RpdmVTdWJzY3JpcHRpb25zID0gMDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUaW1lciwgW3tcbiAgICBrZXk6IFwiYnlwYXNzQW5pbWF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ5cGFzc0FuaW1hdGlvbigpIHtcbiAgICAgIHRoaXMuc2hvdWxkQW5pbWF0ZSA9IGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXN1bWVBbmltYXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzdW1lQW5pbWF0aW9uKCkge1xuICAgICAgdGhpcy5zaG91bGRBbmltYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9vcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb29wKCkge1xuICAgICAgdGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgIHMuY2FsbGJhY2sobm93KCkgLSBzLnN0YXJ0VGltZSwgcy5kdXJhdGlvbik7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RhcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICBpZiAoIXRoaXMudGltZXIpIHtcbiAgICAgICAgdGhpcy50aW1lciA9IHRpbWVyKHRoaXMubG9vcCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIGlmICh0aGlzLnRpbWVyKSB7XG4gICAgICAgIHRoaXMudGltZXIuc3RvcCgpO1xuICAgICAgICB0aGlzLnRpbWVyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3Vic2NyaWJlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN1YnNjcmliZShjYWxsYmFjaywgZHVyYXRpb24pIHtcbiAgICAgIGR1cmF0aW9uID0gdGhpcy5zaG91bGRBbmltYXRlID8gZHVyYXRpb24gOiAwO1xuICAgICAgdmFyIHN1YnNjcmlwdGlvbklEID0gdGhpcy5zdWJzY3JpYmVycy5wdXNoKHtcbiAgICAgICAgc3RhcnRUaW1lOiBub3coKSxcbiAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25cbiAgICAgIH0pO1xuICAgICAgdGhpcy5hY3RpdmVTdWJzY3JpcHRpb25zKys7XG4gICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICByZXR1cm4gc3Vic2NyaXB0aW9uSUQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVuc3Vic2NyaWJlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVuc3Vic2NyaWJlKGlkKSB7XG4gICAgICBpZiAoaWQgIT09IG51bGwgJiYgdGhpcy5zdWJzY3JpYmVyc1tpZCAtIDFdKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnN1YnNjcmliZXJzW2lkIC0gMV07XG4gICAgICAgIHRoaXMuYWN0aXZlU3Vic2NyaXB0aW9ucy0tO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hY3RpdmVTdWJzY3JpcHRpb25zID09PSAwKSB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUaW1lcjtcbn0oKTtcblxuZXhwb3J0IHsgVGltZXIgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBUaW1lciBmcm9tIFwiLi90aW1lclwiO1xuLyoqXG4gKiBUaGUgUmVhY3QgY29udGV4dCBvYmplY3QgY29uc3VtZXJzIG1heSB1c2UgdG8gYWNjZXNzIG9yIG92ZXJyaWRlIHRoZSBnbG9iYWxcbiAqIHRpbWVyLlxuICovXG5cbnZhciBUaW1lckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgdHJhbnNpdGlvblRpbWVyOiBuZXcgVGltZXIoKSxcbiAgYW5pbWF0aW9uVGltZXI6IG5ldyBUaW1lcigpXG59KTtcblRpbWVyQ29udGV4dC5kaXNwbGF5TmFtZSA9IFwiVGltZXJDb250ZXh0XCI7XG5leHBvcnQgZGVmYXVsdCBUaW1lckNvbnRleHQ7IiwiaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gvaXNGdW5jdGlvblwiO1xuaW1wb3J0IF9pc09iamVjdCBmcm9tIFwibG9kYXNoL2lzT2JqZWN0XCI7XG5pbXBvcnQgX3VuaXF1ZUlkIGZyb20gXCJsb2Rhc2gvdW5pcXVlSWRcIjtcbmltcG9ydCBfZGVmYXVsdHMgZnJvbSBcImxvZGFzaC9kZWZhdWx0c1wiO1xuaW1wb3J0IF9hc3NpZ24gZnJvbSBcImxvZGFzaC9hc3NpZ25cIjtcblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCAqIGFzIEN1c3RvbVByb3BUeXBlcyBmcm9tIFwiLi4vdmljdG9yeS11dGlsL3Byb3AtdHlwZXNcIjtcbmltcG9ydCBQb3J0YWwgZnJvbSBcIi4uL3ZpY3RvcnktcG9ydGFsL3BvcnRhbFwiO1xuaW1wb3J0IFBvcnRhbENvbnRleHQgZnJvbSBcIi4uL3ZpY3RvcnktcG9ydGFsL3BvcnRhbC1jb250ZXh0XCI7XG5pbXBvcnQgVGltZXJDb250ZXh0IGZyb20gXCIuLi92aWN0b3J5LXV0aWwvdGltZXItY29udGV4dFwiO1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tIFwiLi4vdmljdG9yeS11dGlsL2hlbHBlcnNcIjtcblxudmFyIFZpY3RvcnlDb250YWluZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFZpY3RvcnlDb250YWluZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFZpY3RvcnlDb250YWluZXIocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmljdG9yeUNvbnRhaW5lcik7XG5cbiAgICBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChWaWN0b3J5Q29udGFpbmVyLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoVmljdG9yeUNvbnRhaW5lcikpLmNhbGwodGhpcywgcHJvcHMpKTtcbiAgICBfdGhpcy5jb250YWluZXJJZCA9ICFfaXNPYmplY3QocHJvcHMpIHx8IHByb3BzLmNvbnRhaW5lcklkID09PSB1bmRlZmluZWQgPyBfdW5pcXVlSWQoXCJ2aWN0b3J5LWNvbnRhaW5lci1cIikgOiBwcm9wcy5jb250YWluZXJJZDtcblxuICAgIF90aGlzLnNhdmVQb3J0YWxSZWYgPSBmdW5jdGlvbiAocG9ydGFsKSB7XG4gICAgICBfdGhpcy5wb3J0YWxSZWYgPSBwb3J0YWw7XG4gICAgICByZXR1cm4gcG9ydGFsO1xuICAgIH07XG5cbiAgICBfdGhpcy5wb3J0YWxVcGRhdGUgPSBmdW5jdGlvbiAoa2V5LCBlbCkge1xuICAgICAgcmV0dXJuIF90aGlzLnBvcnRhbFJlZi5wb3J0YWxVcGRhdGUoa2V5LCBlbCk7XG4gICAgfTtcblxuICAgIF90aGlzLnBvcnRhbFJlZ2lzdGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnBvcnRhbFJlZi5wb3J0YWxSZWdpc3RlcigpO1xuICAgIH07XG5cbiAgICBfdGhpcy5wb3J0YWxEZXJlZ2lzdGVyID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIF90aGlzLnBvcnRhbFJlZi5wb3J0YWxEZXJlZ2lzdGVyKGtleSk7XG4gICAgfTtcblxuICAgIF90aGlzLnNhdmVDb250YWluZXJSZWYgPSBwcm9wcyAmJiBfaXNGdW5jdGlvbihwcm9wcy5jb250YWluZXJSZWYpID8gcHJvcHMuY29udGFpbmVyUmVmIDogZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgICAgX3RoaXMuY29udGFpbmVyUmVmID0gY29udGFpbmVyO1xuICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9O1xuICAgIF90aGlzLnNob3VsZEhhbmRsZVdoZWVsID0gcHJvcHMgJiYgcHJvcHMuZXZlbnRzICYmIHByb3BzLmV2ZW50cy5vbldoZWVsO1xuXG4gICAgaWYgKF90aGlzLnNob3VsZEhhbmRsZVdoZWVsKSB7XG4gICAgICBfdGhpcy5oYW5kbGVXaGVlbCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhWaWN0b3J5Q29udGFpbmVyLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZEhhbmRsZVdoZWVsICYmIHRoaXMuY29udGFpbmVyUmVmKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyUmVmLmFkZEV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCB0aGlzLmhhbmRsZVdoZWVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRIYW5kbGVXaGVlbCAmJiB0aGlzLmNvbnRhaW5lclJlZikge1xuICAgICAgICB0aGlzLmNvbnRhaW5lclJlZi5yZW1vdmVFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgdGhpcy5oYW5kbGVXaGVlbCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldElkRm9yRWxlbWVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRJZEZvckVsZW1lbnQoZWxlbWVudE5hbWUpIHtcbiAgICAgIHJldHVybiBcIlwiLmNvbmNhdCh0aGlzLmNvbnRhaW5lcklkLCBcIi1cIikuY29uY2F0KGVsZW1lbnROYW1lKTtcbiAgICB9IC8vIG92ZXJyaWRkZW4gaW4gY3VzdG9tIGNvbnRhaW5lcnNcblxuICB9LCB7XG4gICAga2V5OiBcImdldENoaWxkcmVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENoaWxkcmVuKHByb3BzKSB7XG4gICAgICByZXR1cm4gcHJvcHMuY2hpbGRyZW47XG4gICAgfSAvLyBHZXQgcHJvcHMgZGVmaW5lZCBieSB0aGUgT3BlbiBVSSBBdXRvbWF0aW9uIChPVUlBKSAxLjAtUkMgc3BlY1xuICAgIC8vIFNlZSBodHRwczovL291aWEucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L1JFQURNRS5odG1sI291aWEtY29tcG9uZW50XG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRPVUlBUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T1VJQVByb3BzKHByb3BzKSB7XG4gICAgICB2YXIgb3VpYUlkID0gcHJvcHMub3VpYUlkLFxuICAgICAgICAgIG91aWFTYWZlID0gcHJvcHMub3VpYVNhZmUsXG4gICAgICAgICAgb3VpYVR5cGUgPSBwcm9wcy5vdWlhVHlwZTtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBvdWlhSWQgJiYge1xuICAgICAgICBcImRhdGEtb3VpYS1jb21wb25lbnQtaWRcIjogb3VpYUlkXG4gICAgICB9LCBvdWlhVHlwZSAmJiB7XG4gICAgICAgIFwiZGF0YS1vdWlhLWNvbXBvbmVudC10eXBlXCI6IG91aWFUeXBlXG4gICAgICB9LCBvdWlhU2FmZSAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgXCJkYXRhLW91aWEtc2FmZVwiOiBvdWlhU2FmZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlckNvbnRhaW5lclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJDb250YWluZXIocHJvcHMsIHN2Z1Byb3BzLCBzdHlsZSkge1xuICAgICAgdmFyIHRpdGxlID0gcHJvcHMudGl0bGUsXG4gICAgICAgICAgZGVzYyA9IHByb3BzLmRlc2MsXG4gICAgICAgICAgcG9ydGFsQ29tcG9uZW50ID0gcHJvcHMucG9ydGFsQ29tcG9uZW50LFxuICAgICAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgICB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICAgICAgICBwb3J0YWxaSW5kZXggPSBwcm9wcy5wb3J0YWxaSW5kZXgsXG4gICAgICAgICAgcmVzcG9uc2l2ZSA9IHByb3BzLnJlc3BvbnNpdmU7XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKHByb3BzKTtcbiAgICAgIHZhciBkaW1lbnNpb25zID0gcmVzcG9uc2l2ZSA/IHtcbiAgICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgICBoZWlnaHQ6IFwiMTAwJVwiXG4gICAgICB9IDoge1xuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICB9O1xuXG4gICAgICB2YXIgZGl2U3R5bGUgPSBfYXNzaWduKHtcbiAgICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCIsXG4gICAgICAgIHRvdWNoQWN0aW9uOiBcIm5vbmVcIixcbiAgICAgICAgcG9zaXRpb246IFwicmVsYXRpdmVcIlxuICAgICAgfSwgZGltZW5zaW9ucyk7XG5cbiAgICAgIHZhciBwb3J0YWxEaXZTdHlsZSA9IF9hc3NpZ24oe1xuICAgICAgICB6SW5kZXg6IHBvcnRhbFpJbmRleCxcbiAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBsZWZ0OiAwXG4gICAgICB9LCBkaW1lbnNpb25zKTtcblxuICAgICAgdmFyIHN2Z1N0eWxlID0gX2Fzc2lnbih7XG4gICAgICAgIHBvaW50ZXJFdmVudHM6IFwiYWxsXCJcbiAgICAgIH0sIGRpbWVuc2lvbnMpO1xuXG4gICAgICB2YXIgcG9ydGFsU3ZnU3R5bGUgPSBfYXNzaWduKHtcbiAgICAgICAgb3ZlcmZsb3c6IFwidmlzaWJsZVwiXG4gICAgICB9LCBkaW1lbnNpb25zKTtcblxuICAgICAgdmFyIHBvcnRhbFByb3BzID0ge1xuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICB2aWV3Qm94OiBzdmdQcm9wcy52aWV3Qm94LFxuICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvOiBzdmdQcm9wcy5wcmVzZXJ2ZUFzcGVjdFJhdGlvLFxuICAgICAgICBzdHlsZTogcG9ydGFsU3ZnU3R5bGVcbiAgICAgIH07XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChQb3J0YWxDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcG9ydGFsVXBkYXRlOiB0aGlzLnBvcnRhbFVwZGF0ZSxcbiAgICAgICAgICBwb3J0YWxSZWdpc3RlcjogdGhpcy5wb3J0YWxSZWdpc3RlcixcbiAgICAgICAgICBwb3J0YWxEZXJlZ2lzdGVyOiB0aGlzLnBvcnRhbERlcmVnaXN0ZXJcbiAgICAgICAgfVxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICAgIHN0eWxlOiBfZGVmYXVsdHMoe30sIHN0eWxlLCBkaXZTdHlsZSksXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICByZWY6IHRoaXMuc2F2ZUNvbnRhaW5lclJlZlxuICAgICAgfSwgdGhpcy5nZXRPVUlBUHJvcHMocHJvcHMpKSwgUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7fSwgc3ZnUHJvcHMsIHtcbiAgICAgICAgc3R5bGU6IHN2Z1N0eWxlXG4gICAgICB9KSwgdGl0bGUgPyBSZWFjdC5jcmVhdGVFbGVtZW50KFwidGl0bGVcIiwge1xuICAgICAgICBpZDogdGhpcy5nZXRJZEZvckVsZW1lbnQoXCJ0aXRsZVwiKVxuICAgICAgfSwgdGl0bGUpIDogbnVsbCwgZGVzYyA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkZXNjXCIsIHtcbiAgICAgICAgaWQ6IHRoaXMuZ2V0SWRGb3JFbGVtZW50KFwiZGVzY1wiKVxuICAgICAgfSwgZGVzYykgOiBudWxsLCBjaGlsZHJlbiksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBzdHlsZTogcG9ydGFsRGl2U3R5bGVcbiAgICAgIH0sIFJlYWN0LmNsb25lRWxlbWVudChwb3J0YWxDb21wb25lbnQsIF9vYmplY3RTcHJlYWQoe30sIHBvcnRhbFByb3BzLCB7XG4gICAgICAgIHJlZjogdGhpcy5zYXZlUG9ydGFsUmVmXG4gICAgICB9KSkpKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB3aWR0aCA9IF9wcm9wcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBfcHJvcHMuaGVpZ2h0LFxuICAgICAgICAgIHJlc3BvbnNpdmUgPSBfcHJvcHMucmVzcG9uc2l2ZSxcbiAgICAgICAgICBldmVudHMgPSBfcHJvcHMuZXZlbnRzLFxuICAgICAgICAgIHRpdGxlID0gX3Byb3BzLnRpdGxlLFxuICAgICAgICAgIGRlc2MgPSBfcHJvcHMuZGVzYyxcbiAgICAgICAgICB0YWJJbmRleCA9IF9wcm9wcy50YWJJbmRleCxcbiAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvID0gX3Byb3BzLnByZXNlcnZlQXNwZWN0UmF0aW8sXG4gICAgICAgICAgcm9sZSA9IF9wcm9wcy5yb2xlO1xuICAgICAgdmFyIHN0eWxlID0gcmVzcG9uc2l2ZSA/IHRoaXMucHJvcHMuc3R5bGUgOiBIZWxwZXJzLm9taXQodGhpcy5wcm9wcy5zdHlsZSwgW1wiaGVpZ2h0XCIsIFwid2lkdGhcIl0pO1xuXG4gICAgICB2YXIgc3ZnUHJvcHMgPSBfYXNzaWduKHtcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgICAgICByb2xlOiByb2xlLFxuICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiOiBbdGl0bGUgJiYgdGhpcy5nZXRJZEZvckVsZW1lbnQoXCJ0aXRsZVwiKSwgdGhpcy5wcm9wc1tcImFyaWEtbGFiZWxsZWRieVwiXV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWRlc2NyaWJlZGJ5XCI6IFtkZXNjICYmIHRoaXMuZ2V0SWRGb3JFbGVtZW50KFwiZGVzY1wiKSwgdGhpcy5wcm9wc1tcImFyaWEtZGVzY3JpYmVkYnlcIl1dLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKSB8fCB1bmRlZmluZWQsXG4gICAgICAgIHZpZXdCb3g6IHJlc3BvbnNpdmUgPyBcIjAgMCBcIi5jb25jYXQod2lkdGgsIFwiIFwiKS5jb25jYXQoaGVpZ2h0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbzogcmVzcG9uc2l2ZSA/IHByZXNlcnZlQXNwZWN0UmF0aW8gOiB1bmRlZmluZWRcbiAgICAgIH0sIGV2ZW50cyk7XG5cbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbnRhaW5lcih0aGlzLnByb3BzLCBzdmdQcm9wcywgc3R5bGUpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBWaWN0b3J5Q29udGFpbmVyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUNvbnRhaW5lciwgXCJkaXNwbGF5TmFtZVwiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBcIlZpY3RvcnlDb250YWluZXJcIlxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUNvbnRhaW5lciwgXCJyb2xlXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFwiY29udGFpbmVyXCJcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlDb250YWluZXIsIFwicHJvcFR5cGVzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHtcbiAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBcImFyaWEtbGFiZWxsZWRieVwiOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubm9kZSksIFByb3BUeXBlcy5ub2RlXSksXG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvbnRhaW5lcklkOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gICAgY29udGFpbmVyUmVmOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBkZXNjOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGV2ZW50czogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBoZWlnaHQ6IEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZSxcbiAgICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIG9yaWdpbjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIHg6IEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZSxcbiAgICAgIHk6IEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZVxuICAgIH0pLFxuICAgIG91aWFJZDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuICAgIG91aWFTYWZlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBvdWlhVHlwZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBwb2xhcjogUHJvcFR5cGVzLmJvb2wsXG4gICAgcG9ydGFsQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgICBwb3J0YWxaSW5kZXg6IEN1c3RvbVByb3BUeXBlcy5pbnRlZ2VyLFxuICAgIHByZXNlcnZlQXNwZWN0UmF0aW86IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgcmVzcG9uc2l2ZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgcm9sZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICB0YWJJbmRleDogUHJvcFR5cGVzLm51bWJlcixcbiAgICB0aGVtZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB3aWR0aDogQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlXG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlDb250YWluZXIsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHtcbiAgICBjbGFzc05hbWU6IFwiVmljdG9yeUNvbnRhaW5lclwiLFxuICAgIHBvcnRhbENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChQb3J0YWwsIG51bGwpLFxuICAgIHBvcnRhbFpJbmRleDogOTksXG4gICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICByb2xlOiBcImltZ1wiXG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlDb250YWluZXIsIFwiY29udGV4dFR5cGVcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogVGltZXJDb250ZXh0XG59KTtcbmV4cG9ydCB7IFZpY3RvcnlDb250YWluZXIgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfYXNzaWduIGZyb20gXCJsb2Rhc2gvYXNzaWduXCI7XG4vLyAqXG4vLyAqIENvbG9yc1xuLy8gKlxudmFyIHllbGxvdzIwMCA9IFwiI0ZGRjU5RFwiO1xudmFyIGRlZXBPcmFuZ2U2MDAgPSBcIiNGNDUxMUVcIjtcbnZhciBsaW1lMzAwID0gXCIjRENFNzc1XCI7XG52YXIgbGlnaHRHcmVlbjUwMCA9IFwiIzhCQzM0QVwiO1xudmFyIHRlYWw3MDAgPSBcIiMwMDc5NkJcIjtcbnZhciBjeWFuOTAwID0gXCIjMDA2MDY0XCI7XG52YXIgY29sb3JzID0gW2RlZXBPcmFuZ2U2MDAsIHllbGxvdzIwMCwgbGltZTMwMCwgbGlnaHRHcmVlbjUwMCwgdGVhbDcwMCwgY3lhbjkwMF07XG52YXIgYmx1ZUdyZXk1MCA9IFwiI0VDRUZGMVwiO1xudmFyIGJsdWVHcmV5MzAwID0gXCIjOTBBNEFFXCI7XG52YXIgYmx1ZUdyZXk3MDAgPSBcIiM0NTVBNjRcIjtcbnZhciBncmV5OTAwID0gXCIjMjEyMTIxXCI7IC8vICpcbi8vICogVHlwb2dyYXBoeVxuLy8gKlxuXG52YXIgc2Fuc1NlcmlmID0gXCInSGVsdmV0aWNhIE5ldWUnLCAnSGVsdmV0aWNhJywgc2Fucy1zZXJpZlwiO1xudmFyIGxldHRlclNwYWNpbmcgPSBcIm5vcm1hbFwiO1xudmFyIGZvbnRTaXplID0gMTI7IC8vICpcbi8vICogTGF5b3V0XG4vLyAqXG5cbnZhciBwYWRkaW5nID0gODtcbnZhciBiYXNlUHJvcHMgPSB7XG4gIHdpZHRoOiAzNTAsXG4gIGhlaWdodDogMzUwLFxuICBwYWRkaW5nOiA1MFxufTsgLy8gKlxuLy8gKiBMYWJlbHNcbi8vICpcblxudmFyIGJhc2VMYWJlbFN0eWxlcyA9IHtcbiAgZm9udEZhbWlseTogc2Fuc1NlcmlmLFxuICBmb250U2l6ZTogZm9udFNpemUsXG4gIGxldHRlclNwYWNpbmc6IGxldHRlclNwYWNpbmcsXG4gIHBhZGRpbmc6IHBhZGRpbmcsXG4gIGZpbGw6IGJsdWVHcmV5NzAwLFxuICBzdHJva2U6IFwidHJhbnNwYXJlbnRcIixcbiAgc3Ryb2tlV2lkdGg6IDBcbn07XG5cbnZhciBjZW50ZXJlZExhYmVsU3R5bGVzID0gX2Fzc2lnbih7XG4gIHRleHRBbmNob3I6IFwibWlkZGxlXCJcbn0sIGJhc2VMYWJlbFN0eWxlcyk7IC8vICpcbi8vICogU3Ryb2tlc1xuLy8gKlxuXG5cbnZhciBzdHJva2VEYXNoYXJyYXkgPSBcIjEwLCA1XCI7XG52YXIgc3Ryb2tlTGluZWNhcCA9IFwicm91bmRcIjtcbnZhciBzdHJva2VMaW5lam9pbiA9IFwicm91bmRcIjtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgYXJlYTogX2Fzc2lnbih7XG4gICAgc3R5bGU6IHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZmlsbDogZ3JleTkwMFxuICAgICAgfSxcbiAgICAgIGxhYmVsczogYmFzZUxhYmVsU3R5bGVzXG4gICAgfVxuICB9LCBiYXNlUHJvcHMpLFxuICBheGlzOiBfYXNzaWduKHtcbiAgICBzdHlsZToge1xuICAgICAgYXhpczoge1xuICAgICAgICBmaWxsOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIHN0cm9rZTogYmx1ZUdyZXkzMDAsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgICBzdHJva2VMaW5lY2FwOiBzdHJva2VMaW5lY2FwLFxuICAgICAgICBzdHJva2VMaW5lam9pbjogc3Ryb2tlTGluZWpvaW5cbiAgICAgIH0sXG4gICAgICBheGlzTGFiZWw6IF9hc3NpZ24oe30sIGNlbnRlcmVkTGFiZWxTdHlsZXMsIHtcbiAgICAgICAgcGFkZGluZzogcGFkZGluZyxcbiAgICAgICAgc3Ryb2tlOiBcInRyYW5zcGFyZW50XCJcbiAgICAgIH0pLFxuICAgICAgZ3JpZDoge1xuICAgICAgICBmaWxsOiBcIm5vbmVcIixcbiAgICAgICAgc3Ryb2tlOiBibHVlR3JleTUwLFxuICAgICAgICBzdHJva2VEYXNoYXJyYXk6IHN0cm9rZURhc2hhcnJheSxcbiAgICAgICAgc3Ryb2tlTGluZWNhcDogc3Ryb2tlTGluZWNhcCxcbiAgICAgICAgc3Ryb2tlTGluZWpvaW46IHN0cm9rZUxpbmVqb2luLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiBcInBhaW50ZWRcIlxuICAgICAgfSxcbiAgICAgIHRpY2tzOiB7XG4gICAgICAgIGZpbGw6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgc2l6ZTogNSxcbiAgICAgICAgc3Ryb2tlOiBibHVlR3JleTMwMCxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXG4gICAgICAgIHN0cm9rZUxpbmVjYXA6IHN0cm9rZUxpbmVjYXAsXG4gICAgICAgIHN0cm9rZUxpbmVqb2luOiBzdHJva2VMaW5lam9pblxuICAgICAgfSxcbiAgICAgIHRpY2tMYWJlbHM6IF9hc3NpZ24oe30sIGJhc2VMYWJlbFN0eWxlcywge1xuICAgICAgICBmaWxsOiBibHVlR3JleTcwMFxuICAgICAgfSlcbiAgICB9XG4gIH0sIGJhc2VQcm9wcyksXG4gIHBvbGFyRGVwZW5kZW50QXhpczogX2Fzc2lnbih7XG4gICAgc3R5bGU6IHtcbiAgICAgIHRpY2tzOiB7XG4gICAgICAgIGZpbGw6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgc2l6ZTogMSxcbiAgICAgICAgc3Ryb2tlOiBcInRyYW5zcGFyZW50XCJcbiAgICAgIH1cbiAgICB9XG4gIH0pLFxuICBiYXI6IF9hc3NpZ24oe1xuICAgIHN0eWxlOiB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZpbGw6IGJsdWVHcmV5NzAwLFxuICAgICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgICBzdHJva2VXaWR0aDogMFxuICAgICAgfSxcbiAgICAgIGxhYmVsczogYmFzZUxhYmVsU3R5bGVzXG4gICAgfVxuICB9LCBiYXNlUHJvcHMpLFxuICBib3hwbG90OiBfYXNzaWduKHtcbiAgICBzdHlsZToge1xuICAgICAgbWF4OiB7XG4gICAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICAgIHN0cm9rZTogYmx1ZUdyZXk3MDAsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAxXG4gICAgICB9LFxuICAgICAgbWF4TGFiZWxzOiBfYXNzaWduKHt9LCBiYXNlTGFiZWxTdHlsZXMsIHtcbiAgICAgICAgcGFkZGluZzogM1xuICAgICAgfSksXG4gICAgICBtZWRpYW46IHtcbiAgICAgICAgcGFkZGluZzogcGFkZGluZyxcbiAgICAgICAgc3Ryb2tlOiBibHVlR3JleTcwMCxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDFcbiAgICAgIH0sXG4gICAgICBtZWRpYW5MYWJlbHM6IF9hc3NpZ24oe30sIGJhc2VMYWJlbFN0eWxlcywge1xuICAgICAgICBwYWRkaW5nOiAzXG4gICAgICB9KSxcbiAgICAgIG1pbjoge1xuICAgICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgICBzdHJva2U6IGJsdWVHcmV5NzAwLFxuICAgICAgICBzdHJva2VXaWR0aDogMVxuICAgICAgfSxcbiAgICAgIG1pbkxhYmVsczogX2Fzc2lnbih7fSwgYmFzZUxhYmVsU3R5bGVzLCB7XG4gICAgICAgIHBhZGRpbmc6IDNcbiAgICAgIH0pLFxuICAgICAgcTE6IHtcbiAgICAgICAgcGFkZGluZzogcGFkZGluZyxcbiAgICAgICAgZmlsbDogYmx1ZUdyZXk3MDBcbiAgICAgIH0sXG4gICAgICBxMUxhYmVsczogX2Fzc2lnbih7fSwgYmFzZUxhYmVsU3R5bGVzLCB7XG4gICAgICAgIHBhZGRpbmc6IDNcbiAgICAgIH0pLFxuICAgICAgcTM6IHtcbiAgICAgICAgcGFkZGluZzogcGFkZGluZyxcbiAgICAgICAgZmlsbDogYmx1ZUdyZXk3MDBcbiAgICAgIH0sXG4gICAgICBxM0xhYmVsczogX2Fzc2lnbih7fSwgYmFzZUxhYmVsU3R5bGVzLCB7XG4gICAgICAgIHBhZGRpbmc6IDNcbiAgICAgIH0pXG4gICAgfSxcbiAgICBib3hXaWR0aDogMjBcbiAgfSwgYmFzZVByb3BzKSxcbiAgY2FuZGxlc3RpY2s6IF9hc3NpZ24oe1xuICAgIHN0eWxlOiB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHN0cm9rZTogYmx1ZUdyZXk3MDBcbiAgICAgIH0sXG4gICAgICBsYWJlbHM6IF9hc3NpZ24oe30sIGJhc2VMYWJlbFN0eWxlcywge1xuICAgICAgICBwYWRkaW5nOiA1XG4gICAgICB9KVxuICAgIH0sXG4gICAgY2FuZGxlQ29sb3JzOiB7XG4gICAgICBwb3NpdGl2ZTogXCIjZmZmZmZmXCIsXG4gICAgICBuZWdhdGl2ZTogYmx1ZUdyZXk3MDBcbiAgICB9XG4gIH0sIGJhc2VQcm9wcyksXG4gIGNoYXJ0OiBiYXNlUHJvcHMsXG4gIGVycm9yYmFyOiBfYXNzaWduKHtcbiAgICBib3JkZXJXaWR0aDogOCxcbiAgICBzdHlsZToge1xuICAgICAgZGF0YToge1xuICAgICAgICBmaWxsOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIHN0cm9rZTogYmx1ZUdyZXk3MDAsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAyXG4gICAgICB9LFxuICAgICAgbGFiZWxzOiBiYXNlTGFiZWxTdHlsZXNcbiAgICB9XG4gIH0sIGJhc2VQcm9wcyksXG4gIGdyb3VwOiBfYXNzaWduKHtcbiAgICBjb2xvclNjYWxlOiBjb2xvcnNcbiAgfSwgYmFzZVByb3BzKSxcbiAgaGlzdG9ncmFtOiBfYXNzaWduKHtcbiAgICBzdHlsZToge1xuICAgICAgZGF0YToge1xuICAgICAgICBmaWxsOiBibHVlR3JleTcwMCxcbiAgICAgICAgc3Ryb2tlOiBncmV5OTAwLFxuICAgICAgICBzdHJva2VXaWR0aDogMlxuICAgICAgfSxcbiAgICAgIGxhYmVsczogYmFzZUxhYmVsU3R5bGVzXG4gICAgfVxuICB9LCBiYXNlUHJvcHMpLFxuICBsZWdlbmQ6IHtcbiAgICBjb2xvclNjYWxlOiBjb2xvcnMsXG4gICAgZ3V0dGVyOiAxMCxcbiAgICBvcmllbnRhdGlvbjogXCJ2ZXJ0aWNhbFwiLFxuICAgIHRpdGxlT3JpZW50YXRpb246IFwidG9wXCIsXG4gICAgc3R5bGU6IHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdHlwZTogXCJjaXJjbGVcIlxuICAgICAgfSxcbiAgICAgIGxhYmVsczogYmFzZUxhYmVsU3R5bGVzLFxuICAgICAgdGl0bGU6IF9hc3NpZ24oe30sIGJhc2VMYWJlbFN0eWxlcywge1xuICAgICAgICBwYWRkaW5nOiA1XG4gICAgICB9KVxuICAgIH1cbiAgfSxcbiAgbGluZTogX2Fzc2lnbih7XG4gICAgc3R5bGU6IHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZmlsbDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICBzdHJva2U6IGJsdWVHcmV5NzAwLFxuICAgICAgICBzdHJva2VXaWR0aDogMlxuICAgICAgfSxcbiAgICAgIGxhYmVsczogYmFzZUxhYmVsU3R5bGVzXG4gICAgfVxuICB9LCBiYXNlUHJvcHMpLFxuICBwaWU6IF9hc3NpZ24oe1xuICAgIGNvbG9yU2NhbGU6IGNvbG9ycyxcbiAgICBzdHlsZToge1xuICAgICAgZGF0YToge1xuICAgICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgICBzdHJva2U6IGJsdWVHcmV5NTAsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAxXG4gICAgICB9LFxuICAgICAgbGFiZWxzOiBfYXNzaWduKHt9LCBiYXNlTGFiZWxTdHlsZXMsIHtcbiAgICAgICAgcGFkZGluZzogMjBcbiAgICAgIH0pXG4gICAgfVxuICB9LCBiYXNlUHJvcHMpLFxuICBzY2F0dGVyOiBfYXNzaWduKHtcbiAgICBzdHlsZToge1xuICAgICAgZGF0YToge1xuICAgICAgICBmaWxsOiBibHVlR3JleTcwMCxcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgc3Ryb2tlOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwXG4gICAgICB9LFxuICAgICAgbGFiZWxzOiBiYXNlTGFiZWxTdHlsZXNcbiAgICB9XG4gIH0sIGJhc2VQcm9wcyksXG4gIHN0YWNrOiBfYXNzaWduKHtcbiAgICBjb2xvclNjYWxlOiBjb2xvcnNcbiAgfSwgYmFzZVByb3BzKSxcbiAgdG9vbHRpcDoge1xuICAgIHN0eWxlOiBfYXNzaWduKHt9LCBiYXNlTGFiZWxTdHlsZXMsIHtcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIlxuICAgIH0pLFxuICAgIGZseW91dFN0eWxlOiB7XG4gICAgICBzdHJva2U6IGdyZXk5MDAsXG4gICAgICBzdHJva2VXaWR0aDogMSxcbiAgICAgIGZpbGw6IFwiI2YwZjBmMFwiLFxuICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCJcbiAgICB9LFxuICAgIGZseW91dFBhZGRpbmc6IDUsXG4gICAgY29ybmVyUmFkaXVzOiA1LFxuICAgIHBvaW50ZXJMZW5ndGg6IDEwXG4gIH0sXG4gIHZvcm9ub2k6IF9hc3NpZ24oe1xuICAgIHN0eWxlOiB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZpbGw6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgc3Ryb2tlOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwXG4gICAgICB9LFxuICAgICAgbGFiZWxzOiBfYXNzaWduKHt9LCBiYXNlTGFiZWxTdHlsZXMsIHtcbiAgICAgICAgcGFkZGluZzogNSxcbiAgICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCJcbiAgICAgIH0pLFxuICAgICAgZmx5b3V0OiB7XG4gICAgICAgIHN0cm9rZTogZ3JleTkwMCxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXG4gICAgICAgIGZpbGw6IFwiI2YwZjBmMFwiLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIlxuICAgICAgfVxuICAgIH1cbiAgfSwgYmFzZVByb3BzKVxufTsiLCJpbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuLy8gKlxuLy8gKiBDb2xvcnNcbi8vICpcbnZhciBjb2xvcnMgPSBbXCIjMjUyNTI1XCIsIFwiIzUyNTI1MlwiLCBcIiM3MzczNzNcIiwgXCIjOTY5Njk2XCIsIFwiI2JkYmRiZFwiLCBcIiNkOWQ5ZDlcIiwgXCIjZjBmMGYwXCJdO1xudmFyIGNoYXJjb2FsID0gXCIjMjUyNTI1XCI7XG52YXIgZ3JleSA9IFwiIzk2OTY5NlwiOyAvLyAqXG4vLyAqIFR5cG9ncmFwaHlcbi8vICpcblxudmFyIHNhbnNTZXJpZiA9IFwiJ0dpbGwgU2FucycsICdTZXJhdmVrJywgJ1RyZWJ1Y2hldCBNUycsIHNhbnMtc2VyaWZcIjtcbnZhciBsZXR0ZXJTcGFjaW5nID0gXCJub3JtYWxcIjtcbnZhciBmb250U2l6ZSA9IDE0OyAvLyAqXG4vLyAqIExheW91dFxuLy8gKlxuXG52YXIgYmFzZVByb3BzID0ge1xuICB3aWR0aDogNDUwLFxuICBoZWlnaHQ6IDMwMCxcbiAgcGFkZGluZzogNTAsXG4gIGNvbG9yU2NhbGU6IGNvbG9yc1xufTsgLy8gKlxuLy8gKiBMYWJlbHNcbi8vICpcblxudmFyIGJhc2VMYWJlbFN0eWxlcyA9IHtcbiAgZm9udEZhbWlseTogc2Fuc1NlcmlmLFxuICBmb250U2l6ZTogZm9udFNpemUsXG4gIGxldHRlclNwYWNpbmc6IGxldHRlclNwYWNpbmcsXG4gIHBhZGRpbmc6IDEwLFxuICBmaWxsOiBjaGFyY29hbCxcbiAgc3Ryb2tlOiBcInRyYW5zcGFyZW50XCJcbn07XG5cbnZhciBjZW50ZXJlZExhYmVsU3R5bGVzID0gX2Fzc2lnbih7XG4gIHRleHRBbmNob3I6IFwibWlkZGxlXCJcbn0sIGJhc2VMYWJlbFN0eWxlcyk7IC8vICpcbi8vICogU3Ryb2tlc1xuLy8gKlxuXG5cbnZhciBzdHJva2VMaW5lY2FwID0gXCJyb3VuZFwiO1xudmFyIHN0cm9rZUxpbmVqb2luID0gXCJyb3VuZFwiO1xuZXhwb3J0IGRlZmF1bHQge1xuICBhcmVhOiBfYXNzaWduKHtcbiAgICBzdHlsZToge1xuICAgICAgZGF0YToge1xuICAgICAgICBmaWxsOiBjaGFyY29hbFxuICAgICAgfSxcbiAgICAgIGxhYmVsczogYmFzZUxhYmVsU3R5bGVzXG4gICAgfVxuICB9LCBiYXNlUHJvcHMpLFxuICBheGlzOiBfYXNzaWduKHtcbiAgICBzdHlsZToge1xuICAgICAgYXhpczoge1xuICAgICAgICBmaWxsOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIHN0cm9rZTogY2hhcmNvYWwsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAxLFxuICAgICAgICBzdHJva2VMaW5lY2FwOiBzdHJva2VMaW5lY2FwLFxuICAgICAgICBzdHJva2VMaW5lam9pbjogc3Ryb2tlTGluZWpvaW5cbiAgICAgIH0sXG4gICAgICBheGlzTGFiZWw6IF9hc3NpZ24oe30sIGNlbnRlcmVkTGFiZWxTdHlsZXMsIHtcbiAgICAgICAgcGFkZGluZzogMjVcbiAgICAgIH0pLFxuICAgICAgZ3JpZDoge1xuICAgICAgICBmaWxsOiBcIm5vbmVcIixcbiAgICAgICAgc3Ryb2tlOiBcIm5vbmVcIixcbiAgICAgICAgcG9pbnRlckV2ZW50czogXCJwYWludGVkXCJcbiAgICAgIH0sXG4gICAgICB0aWNrczoge1xuICAgICAgICBmaWxsOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIHNpemU6IDEsXG4gICAgICAgIHN0cm9rZTogXCJ0cmFuc3BhcmVudFwiXG4gICAgICB9LFxuICAgICAgdGlja0xhYmVsczogYmFzZUxhYmVsU3R5bGVzXG4gICAgfVxuICB9LCBiYXNlUHJvcHMpLFxuICBiYXI6IF9hc3NpZ24oe1xuICAgIHN0eWxlOiB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZpbGw6IGNoYXJjb2FsLFxuICAgICAgICBwYWRkaW5nOiA4LFxuICAgICAgICBzdHJva2VXaWR0aDogMFxuICAgICAgfSxcbiAgICAgIGxhYmVsczogYmFzZUxhYmVsU3R5bGVzXG4gICAgfVxuICB9LCBiYXNlUHJvcHMpLFxuICBib3hwbG90OiBfYXNzaWduKHtcbiAgICBzdHlsZToge1xuICAgICAgbWF4OiB7XG4gICAgICAgIHBhZGRpbmc6IDgsXG4gICAgICAgIHN0cm9rZTogY2hhcmNvYWwsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAxXG4gICAgICB9LFxuICAgICAgbWF4TGFiZWxzOiBfYXNzaWduKHt9LCBiYXNlTGFiZWxTdHlsZXMsIHtcbiAgICAgICAgcGFkZGluZzogM1xuICAgICAgfSksXG4gICAgICBtZWRpYW46IHtcbiAgICAgICAgcGFkZGluZzogOCxcbiAgICAgICAgc3Ryb2tlOiBjaGFyY29hbCxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDFcbiAgICAgIH0sXG4gICAgICBtZWRpYW5MYWJlbHM6IF9hc3NpZ24oe30sIGJhc2VMYWJlbFN0eWxlcywge1xuICAgICAgICBwYWRkaW5nOiAzXG4gICAgICB9KSxcbiAgICAgIG1pbjoge1xuICAgICAgICBwYWRkaW5nOiA4LFxuICAgICAgICBzdHJva2U6IGNoYXJjb2FsLFxuICAgICAgICBzdHJva2VXaWR0aDogMVxuICAgICAgfSxcbiAgICAgIG1pbkxhYmVsczogX2Fzc2lnbih7fSwgYmFzZUxhYmVsU3R5bGVzLCB7XG4gICAgICAgIHBhZGRpbmc6IDNcbiAgICAgIH0pLFxuICAgICAgcTE6IHtcbiAgICAgICAgcGFkZGluZzogOCxcbiAgICAgICAgZmlsbDogZ3JleVxuICAgICAgfSxcbiAgICAgIHExTGFiZWxzOiBfYXNzaWduKHt9LCBiYXNlTGFiZWxTdHlsZXMsIHtcbiAgICAgICAgcGFkZGluZzogM1xuICAgICAgfSksXG4gICAgICBxMzoge1xuICAgICAgICBwYWRkaW5nOiA4LFxuICAgICAgICBmaWxsOiBncmV5XG4gICAgICB9LFxuICAgICAgcTNMYWJlbHM6IF9hc3NpZ24oe30sIGJhc2VMYWJlbFN0eWxlcywge1xuICAgICAgICBwYWRkaW5nOiAzXG4gICAgICB9KVxuICAgIH0sXG4gICAgYm94V2lkdGg6IDIwXG4gIH0sIGJhc2VQcm9wcyksXG4gIGNhbmRsZXN0aWNrOiBfYXNzaWduKHtcbiAgICBzdHlsZToge1xuICAgICAgZGF0YToge1xuICAgICAgICBzdHJva2U6IGNoYXJjb2FsLFxuICAgICAgICBzdHJva2VXaWR0aDogMVxuICAgICAgfSxcbiAgICAgIGxhYmVsczogX2Fzc2lnbih7fSwgYmFzZUxhYmVsU3R5bGVzLCB7XG4gICAgICAgIHBhZGRpbmc6IDVcbiAgICAgIH0pXG4gICAgfSxcbiAgICBjYW5kbGVDb2xvcnM6IHtcbiAgICAgIHBvc2l0aXZlOiBcIiNmZmZmZmZcIixcbiAgICAgIG5lZ2F0aXZlOiBjaGFyY29hbFxuICAgIH1cbiAgfSwgYmFzZVByb3BzKSxcbiAgY2hhcnQ6IGJhc2VQcm9wcyxcbiAgZXJyb3JiYXI6IF9hc3NpZ24oe1xuICAgIGJvcmRlcldpZHRoOiA4LFxuICAgIHN0eWxlOiB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZpbGw6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgc3Ryb2tlOiBjaGFyY29hbCxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDJcbiAgICAgIH0sXG4gICAgICBsYWJlbHM6IGJhc2VMYWJlbFN0eWxlc1xuICAgIH1cbiAgfSwgYmFzZVByb3BzKSxcbiAgZ3JvdXA6IF9hc3NpZ24oe1xuICAgIGNvbG9yU2NhbGU6IGNvbG9yc1xuICB9LCBiYXNlUHJvcHMpLFxuICBoaXN0b2dyYW06IF9hc3NpZ24oe1xuICAgIHN0eWxlOiB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZpbGw6IGdyZXksXG4gICAgICAgIHN0cm9rZTogY2hhcmNvYWwsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAyXG4gICAgICB9LFxuICAgICAgbGFiZWxzOiBiYXNlTGFiZWxTdHlsZXNcbiAgICB9XG4gIH0sIGJhc2VQcm9wcyksXG4gIGxlZ2VuZDoge1xuICAgIGNvbG9yU2NhbGU6IGNvbG9ycyxcbiAgICBndXR0ZXI6IDEwLFxuICAgIG9yaWVudGF0aW9uOiBcInZlcnRpY2FsXCIsXG4gICAgdGl0bGVPcmllbnRhdGlvbjogXCJ0b3BcIixcbiAgICBzdHlsZToge1xuICAgICAgZGF0YToge1xuICAgICAgICB0eXBlOiBcImNpcmNsZVwiXG4gICAgICB9LFxuICAgICAgbGFiZWxzOiBiYXNlTGFiZWxTdHlsZXMsXG4gICAgICB0aXRsZTogX2Fzc2lnbih7fSwgYmFzZUxhYmVsU3R5bGVzLCB7XG4gICAgICAgIHBhZGRpbmc6IDVcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuICBsaW5lOiBfYXNzaWduKHtcbiAgICBzdHlsZToge1xuICAgICAgZGF0YToge1xuICAgICAgICBmaWxsOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIHN0cm9rZTogY2hhcmNvYWwsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAyXG4gICAgICB9LFxuICAgICAgbGFiZWxzOiBiYXNlTGFiZWxTdHlsZXNcbiAgICB9XG4gIH0sIGJhc2VQcm9wcyksXG4gIHBpZToge1xuICAgIHN0eWxlOiB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHBhZGRpbmc6IDEwLFxuICAgICAgICBzdHJva2U6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDFcbiAgICAgIH0sXG4gICAgICBsYWJlbHM6IF9hc3NpZ24oe30sIGJhc2VMYWJlbFN0eWxlcywge1xuICAgICAgICBwYWRkaW5nOiAyMFxuICAgICAgfSlcbiAgICB9LFxuICAgIGNvbG9yU2NhbGU6IGNvbG9ycyxcbiAgICB3aWR0aDogNDAwLFxuICAgIGhlaWdodDogNDAwLFxuICAgIHBhZGRpbmc6IDUwXG4gIH0sXG4gIHNjYXR0ZXI6IF9hc3NpZ24oe1xuICAgIHN0eWxlOiB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZpbGw6IGNoYXJjb2FsLFxuICAgICAgICBzdHJva2U6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDBcbiAgICAgIH0sXG4gICAgICBsYWJlbHM6IGJhc2VMYWJlbFN0eWxlc1xuICAgIH1cbiAgfSwgYmFzZVByb3BzKSxcbiAgc3RhY2s6IF9hc3NpZ24oe1xuICAgIGNvbG9yU2NhbGU6IGNvbG9yc1xuICB9LCBiYXNlUHJvcHMpLFxuICB0b29sdGlwOiB7XG4gICAgc3R5bGU6IF9hc3NpZ24oe30sIGJhc2VMYWJlbFN0eWxlcywge1xuICAgICAgcGFkZGluZzogMCxcbiAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiXG4gICAgfSksXG4gICAgZmx5b3V0U3R5bGU6IHtcbiAgICAgIHN0cm9rZTogY2hhcmNvYWwsXG4gICAgICBzdHJva2VXaWR0aDogMSxcbiAgICAgIGZpbGw6IFwiI2YwZjBmMFwiLFxuICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCJcbiAgICB9LFxuICAgIGZseW91dFBhZGRpbmc6IDUsXG4gICAgY29ybmVyUmFkaXVzOiA1LFxuICAgIHBvaW50ZXJMZW5ndGg6IDEwXG4gIH0sXG4gIHZvcm9ub2k6IF9hc3NpZ24oe1xuICAgIHN0eWxlOiB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZpbGw6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgc3Ryb2tlOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwXG4gICAgICB9LFxuICAgICAgbGFiZWxzOiBfYXNzaWduKHt9LCBiYXNlTGFiZWxTdHlsZXMsIHtcbiAgICAgICAgcGFkZGluZzogNSxcbiAgICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCJcbiAgICAgIH0pLFxuICAgICAgZmx5b3V0OiB7XG4gICAgICAgIHN0cm9rZTogY2hhcmNvYWwsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAxLFxuICAgICAgICBmaWxsOiBcIiNmMGYwZjBcIixcbiAgICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCJcbiAgICAgIH1cbiAgICB9XG4gIH0sIGJhc2VQcm9wcylcbn07IiwiaW1wb3J0IG1hdGVyaWFsVGhlbWUgZnJvbSBcIi4vbWF0ZXJpYWxcIjtcbmltcG9ydCBncmF5c2NhbGVUaGVtZSBmcm9tIFwiLi9ncmF5c2NhbGVcIjtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWF0ZXJpYWw6IG1hdGVyaWFsVGhlbWUsXG4gIGdyYXlzY2FsZTogZ3JheXNjYWxlVGhlbWVcbn07IiwiaW1wb3J0IF9rZXlzIGZyb20gXCJsb2Rhc2gva2V5c1wiO1xuaW1wb3J0IF9pZGVudGl0eSBmcm9tIFwibG9kYXNoL2lkZW50aXR5XCI7XG5pbXBvcnQgX2RlZmF1bHRzIGZyb20gXCJsb2Rhc2gvZGVmYXVsdHNcIjtcbmltcG9ydCBfYXNzaWduIGZyb20gXCJsb2Rhc2gvYXNzaWduXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmZ1bmN0aW9uIGdldERhdHVtS2V5KGRhdHVtLCBpZHgpIHtcbiAgcmV0dXJuIChkYXR1bS5rZXkgfHwgaWR4KS50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiBnZXRLZXllZERhdGEoZGF0YSkge1xuICByZXR1cm4gZGF0YS5yZWR1Y2UoZnVuY3Rpb24gKGtleWVkRGF0YSwgZGF0dW0sIGlkeCkge1xuICAgIHZhciBrZXkgPSBnZXREYXR1bUtleShkYXR1bSwgaWR4KTtcbiAgICBrZXllZERhdGFba2V5XSA9IGRhdHVtO1xuICAgIHJldHVybiBrZXllZERhdGE7XG4gIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5ZWREYXRhRGlmZmVyZW5jZShhLCBiKSB7XG4gIHZhciBoYXNEaWZmZXJlbmNlID0gZmFsc2U7XG5cbiAgdmFyIGRpZmZlcmVuY2UgPSBfa2V5cyhhKS5yZWR1Y2UoZnVuY3Rpb24gKF9kaWZmZXJlbmNlLCBrZXkpIHtcbiAgICBpZiAoIShrZXkgaW4gYikpIHtcbiAgICAgIGhhc0RpZmZlcmVuY2UgPSB0cnVlO1xuICAgICAgX2RpZmZlcmVuY2Vba2V5XSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9kaWZmZXJlbmNlO1xuICB9LCB7fSk7XG5cbiAgcmV0dXJuIGhhc0RpZmZlcmVuY2UgJiYgZGlmZmVyZW5jZTtcbn1cbi8qKlxuICogQ2FsY3VsYXRlIHdoaWNoIGRhdGEtcG9pbnRzIGV4aXN0IGluIG9sZERhdGEgYW5kIG5vdCBuZXh0RGF0YSAtXG4gKiB0aGVzZSBhcmUgdGhlIGBleGl0aW5nYCBkYXRhLXBvaW50cy4gIEFsc28gY2FsY3VsYXRlIHdoaWNoXG4gKiBkYXRhLXBvaW50cyBleGlzdCBpbiBuZXh0RGF0YSBhbmQgbm90IG9sZERhdGEgLSB0aGVzZSBhcmUgdGhlXG4gKiBgZW50ZXJpbmdgIGRhdGEtcG9pbnRzLlxuICpcbiAqIEBwYXJhbSAge0FycmF5fSBvbGREYXRhICAgdGhpcy5wcm9wcy5kYXRhIEFycmF5XG4gKiBAcGFyYW0gIHtBcnJheX0gbmV4dERhdGEgIHRoaXMucHJvcHMuZGF0YSBBcnJheVxuICpcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgT2JqZWN0IHdpdGggYGVudGVyaW5nYCBhbmQgYGV4aXRpbmdgIHByb3BlcnRpZXMuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nW2RhdHVtLmtleV0gd2lsbCBiZSB0cnVlIGlmIHRoZSBkYXRhIGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nLCBhbmQgc2ltaWxhcmx5IGZvciBgZXhpdGluZ2AuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXROb2RlVHJhbnNpdGlvbnMob2xkRGF0YSwgbmV4dERhdGEpIHtcbiAgdmFyIG9sZERhdGFLZXllZCA9IG9sZERhdGEgJiYgZ2V0S2V5ZWREYXRhKG9sZERhdGEpO1xuICB2YXIgbmV4dERhdGFLZXllZCA9IG5leHREYXRhICYmIGdldEtleWVkRGF0YShuZXh0RGF0YSk7XG4gIHJldHVybiB7XG4gICAgZW50ZXJpbmc6IG9sZERhdGFLZXllZCAmJiBnZXRLZXllZERhdGFEaWZmZXJlbmNlKG5leHREYXRhS2V5ZWQsIG9sZERhdGFLZXllZCksXG4gICAgZXhpdGluZzogbmV4dERhdGFLZXllZCAmJiBnZXRLZXllZERhdGFEaWZmZXJlbmNlKG9sZERhdGFLZXllZCwgbmV4dERhdGFLZXllZClcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hpbGREYXRhKGNoaWxkKSB7XG4gIGlmIChjaGlsZC50eXBlICYmIGNoaWxkLnR5cGUuZ2V0RGF0YSkge1xuICAgIHJldHVybiBjaGlsZC50eXBlLmdldERhdGEoY2hpbGQucHJvcHMpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkLnByb3BzICYmIGNoaWxkLnByb3BzLmRhdGEgfHwgZmFsc2U7XG59XG4vKipcbiAqIElmIGEgcGFyZW50IGNvbXBvbmVudCBoYXMgYW5pbWF0aW9uIGVuYWJsZWQsIGNhbGN1bGF0ZSB0aGUgdHJhbnNpdGlvbnNcbiAqIGZvciBhbnkgZGF0YSBvZiBhbnkgY2hpbGQgY29tcG9uZW50IHRoYXQgc3VwcG9ydHMgZGF0YSB0cmFuc2l0aW9uc1xuICogRGF0YSB0cmFuc2l0aW9ucyBhcmUgZGVmaW5lZCBhcyBhbnkgdHdvIGRhdGFzZXRzIHdoZXJlIGRhdGEgbm9kZXMgZXhpc3RcbiAqIGluIHRoZSBmaXJzdCBzZXQgYW5kIG5vdCB0aGUgc2Vjb25kLCBpbiB0aGUgc2Vjb25kIGFuZCBub3QgdGhlIGZpcnN0LFxuICogb3IgYm90aC5cbiAqXG4gKiBAcGFyYW0gIHtDaGlsZHJlbn0gIG9sZENoaWxkcmVuICAgdGhpcy5wcm9wcy5jaGlsZHJlbiBmcm9tIG9sZCBwcm9wc1xuICogQHBhcmFtICB7Q2hpbGRyZW59ICBuZXh0Q2hpbGRyZW4gIHRoaXMucHJvcHMuY2hpbGRyZW4gZnJvbSBuZXh0IHByb3BzXG4gKlxuICogQHJldHVybiB7T2JqZWN0fSAgICAgICAgICAgICAgICAgIE9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBub2Rlc1dpbGxFeGl0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbm9kZXNXaWxsRW50ZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBjaGlsZHJlblRyYW5zaXRpb25zXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbm9kZXNTaG91bGRFbnRlclxuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluaXRpYWxUcmFuc2l0aW9uU3RhdGUob2xkQ2hpbGRyZW4sIG5leHRDaGlsZHJlbikge1xuICB2YXIgbm9kZXNXaWxsRXhpdCA9IGZhbHNlO1xuICB2YXIgbm9kZXNXaWxsRW50ZXIgPSBmYWxzZTtcblxuICB2YXIgZ2V0VHJhbnNpdGlvbiA9IGZ1bmN0aW9uIChvbGRDaGlsZCwgbmV3Q2hpbGQpIHtcbiAgICBpZiAoIW5ld0NoaWxkIHx8IG9sZENoaWxkLnR5cGUgIT09IG5ld0NoaWxkLnR5cGUpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICB2YXIgX3JlZiA9IGdldE5vZGVUcmFuc2l0aW9ucyhnZXRDaGlsZERhdGEob2xkQ2hpbGQpLCBnZXRDaGlsZERhdGEobmV3Q2hpbGQpKSB8fCB7fSxcbiAgICAgICAgZW50ZXJpbmcgPSBfcmVmLmVudGVyaW5nLFxuICAgICAgICBleGl0aW5nID0gX3JlZi5leGl0aW5nO1xuXG4gICAgbm9kZXNXaWxsRXhpdCA9IG5vZGVzV2lsbEV4aXQgfHwgISFleGl0aW5nO1xuICAgIG5vZGVzV2lsbEVudGVyID0gbm9kZXNXaWxsRW50ZXIgfHwgISFlbnRlcmluZztcbiAgICByZXR1cm4ge1xuICAgICAgZW50ZXJpbmc6IGVudGVyaW5nIHx8IGZhbHNlLFxuICAgICAgZXhpdGluZzogZXhpdGluZyB8fCBmYWxzZVxuICAgIH07XG4gIH07XG5cbiAgdmFyIGdldFRyYW5zaXRpb25zRnJvbUNoaWxkcmVuID0gZnVuY3Rpb24gKG9sZCwgbmV4dCkge1xuICAgIHJldHVybiBvbGQubWFwKGZ1bmN0aW9uIChjaGlsZCwgaWR4KSB7XG4gICAgICBpZiAoY2hpbGQgJiYgY2hpbGQucHJvcHMgJiYgY2hpbGQucHJvcHMuY2hpbGRyZW4gJiYgbmV4dFtpZHhdKSB7XG4gICAgICAgIHJldHVybiBnZXRUcmFuc2l0aW9uc0Zyb21DaGlsZHJlbihSZWFjdC5DaGlsZHJlbi50b0FycmF5KG9sZFtpZHhdLnByb3BzLmNoaWxkcmVuKSwgUmVhY3QuQ2hpbGRyZW4udG9BcnJheShuZXh0W2lkeF0ucHJvcHMuY2hpbGRyZW4pKTtcbiAgICAgIH0gLy8gZ2V0IFRyYW5zaXRpb24gZW50ZXJpbmcgYW5kIGV4aXRpbmcgbm9kZXNcblxuXG4gICAgICByZXR1cm4gZ2V0VHJhbnNpdGlvbihjaGlsZCwgbmV4dFtpZHhdKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgY2hpbGRyZW5UcmFuc2l0aW9ucyA9IGdldFRyYW5zaXRpb25zRnJvbUNoaWxkcmVuKFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkob2xkQ2hpbGRyZW4pLCBSZWFjdC5DaGlsZHJlbi50b0FycmF5KG5leHRDaGlsZHJlbikpO1xuICByZXR1cm4ge1xuICAgIG5vZGVzV2lsbEV4aXQ6IG5vZGVzV2lsbEV4aXQsXG4gICAgbm9kZXNXaWxsRW50ZXI6IG5vZGVzV2lsbEVudGVyLFxuICAgIGNoaWxkcmVuVHJhbnNpdGlvbnM6IGNoaWxkcmVuVHJhbnNpdGlvbnMsXG4gICAgLy8gVE9ETzogVGhpcyBtYXkgbmVlZCB0byBiZSByZWZhY3RvcmVkIGZvciB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbi5cbiAgICAvLyAgICAgICBUaGUgY29tcG9uZW50IHJlY2VpdmVzIG5ldyBwcm9wcywgYW5kIHRoZSBkYXRhIHByb3ZpZGVkXG4gICAgLy8gICAgICAgaXMgYSBwZXJmZWN0IG1hdGNoIGZvciB0aGUgcHJldmlvdXMgZGF0YSBhbmQgZG9tYWluIGV4Y2VwdFxuICAgIC8vICAgICAgIGZvciBuZXcgbm9kZXMuIEluIHRoaXMgY2FzZSwgd2Ugd291bGRuJ3Qgd2FudCBhIGRlbGF5IGJlZm9yZVxuICAgIC8vICAgICAgIHRoZSBuZXcgbm9kZXMgYXBwZWFyLlxuICAgIG5vZGVzU2hvdWxkRW50ZXI6IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEluaXRpYWxDaGlsZFByb3BzKGFuaW1hdGUsIGRhdGEpIHtcbiAgdmFyIGFmdGVyID0gYW5pbWF0ZS5vbkVudGVyICYmIGFuaW1hdGUub25FbnRlci5hZnRlciA/IGFuaW1hdGUub25FbnRlci5hZnRlciA6IF9pZGVudGl0eTtcbiAgcmV0dXJuIHtcbiAgICBkYXRhOiBkYXRhLm1hcChmdW5jdGlvbiAoZGF0dW0sIGlkeCkge1xuICAgICAgcmV0dXJuIF9hc3NpZ24oe30sIGRhdHVtLCBhZnRlcihkYXR1bSwgaWR4LCBkYXRhKSk7XG4gICAgfSlcbiAgfTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcblxuXG5mdW5jdGlvbiBnZXRDaGlsZEJlZm9yZUxvYWQoYW5pbWF0ZSwgY2hpbGQsIGRhdGEsIGNiKSB7XG4gIGFuaW1hdGUgPSBfYXNzaWduKHt9LCBhbmltYXRlLCB7XG4gICAgb25FbmQ6IGNiXG4gIH0pO1xuXG4gIGlmIChhbmltYXRlICYmIGFuaW1hdGUub25Mb2FkICYmICFhbmltYXRlLm9uTG9hZC5kdXJhdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICBhbmltYXRlOiBhbmltYXRlLFxuICAgICAgZGF0YTogZGF0YVxuICAgIH07XG4gIH1cblxuICB2YXIgYmVmb3JlID0gYW5pbWF0ZS5vbkxvYWQgJiYgYW5pbWF0ZS5vbkxvYWQuYmVmb3JlID8gYW5pbWF0ZS5vbkxvYWQuYmVmb3JlIDogX2lkZW50aXR5OyAvLyBJZiBub2RlcyBuZWVkIHRvIGV4aXQsIHRyYW5zZm9ybSB0aGVtIHdpdGggdGhlIHByb3ZpZGVkIG9uTG9hZC5iZWZvcmUgZnVuY3Rpb24uXG5cbiAgZGF0YSA9IGRhdGEubWFwKGZ1bmN0aW9uIChkYXR1bSwgaWR4KSB7XG4gICAgcmV0dXJuIF9hc3NpZ24oe30sIGRhdHVtLCBiZWZvcmUoZGF0dW0sIGlkeCwgZGF0YSkpO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBhbmltYXRlOiBhbmltYXRlLFxuICAgIGRhdGE6IGRhdGEsXG4gICAgY2xpcFdpZHRoOiAwXG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG5cblxuZnVuY3Rpb24gZ2V0Q2hpbGRPbkxvYWQoYW5pbWF0ZSwgZGF0YSwgY2IpIHtcbiAgYW5pbWF0ZSA9IF9hc3NpZ24oe30sIGFuaW1hdGUsIHtcbiAgICBvbkVuZDogY2JcbiAgfSk7XG5cbiAgaWYgKGFuaW1hdGUgJiYgYW5pbWF0ZS5vbkxvYWQgJiYgIWFuaW1hdGUub25Mb2FkLmR1cmF0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFuaW1hdGU6IGFuaW1hdGUsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfTtcbiAgfVxuXG4gIHZhciBhZnRlciA9IGFuaW1hdGUub25Mb2FkICYmIGFuaW1hdGUub25Mb2FkLmFmdGVyID8gYW5pbWF0ZS5vbkxvYWQuYWZ0ZXIgOiBfaWRlbnRpdHk7IC8vIElmIG5vZGVzIG5lZWQgdG8gZXhpdCwgdHJhbnNmb3JtIHRoZW0gd2l0aCB0aGUgcHJvdmlkZWQgb25Mb2FkLmFmdGVyIGZ1bmN0aW9uLlxuXG4gIGRhdGEgPSBkYXRhLm1hcChmdW5jdGlvbiAoZGF0dW0sIGlkeCkge1xuICAgIHJldHVybiBfYXNzaWduKHt9LCBkYXR1bSwgYWZ0ZXIoZGF0dW0sIGlkeCwgZGF0YSkpO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBhbmltYXRlOiBhbmltYXRlLFxuICAgIGRhdGE6IGRhdGFcbiAgfTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXMsIG1heC1sZW5cblxuXG5mdW5jdGlvbiBnZXRDaGlsZFByb3BzT25FeGl0KGFuaW1hdGUsIGNoaWxkLCBkYXRhLCBleGl0aW5nTm9kZXMsIGNiKSB7XG4gIC8vIFdoZXRoZXIgb3Igbm90IF90aGlzXyBjaGlsZCBoYXMgZXhpdGluZyBub2Rlcywgd2Ugd2FudCB0aGUgZXhpdC1cbiAgLy8gdHJhbnNpdGlvbiBmb3IgYWxsIGNoaWxkcmVuIHRvIGhhdmUgdGhlIHNhbWUgZHVyYXRpb24sIGRlbGF5LCBldGMuXG4gIHZhciBvbkV4aXQgPSBhbmltYXRlICYmIGFuaW1hdGUub25FeGl0O1xuICBhbmltYXRlID0gX2Fzc2lnbih7fSwgYW5pbWF0ZSwgb25FeGl0KTtcblxuICBpZiAoZXhpdGluZ05vZGVzKSB7XG4gICAgLy8gQWZ0ZXIgdGhlIGV4aXQgdHJhbnNpdGlvbiBvY2N1cnMsIHRyaWdnZXIgdGhlIGFuaW1hdGlvbnMgZm9yXG4gICAgLy8gbm9kZXMgdGhhdCBhcmUgbmVpdGhlciBleGl0aW5nIG9yIGVudGVyaW5nLlxuICAgIGFuaW1hdGUub25FbmQgPSBjYjtcbiAgICB2YXIgYmVmb3JlID0gYW5pbWF0ZS5vbkV4aXQgJiYgYW5pbWF0ZS5vbkV4aXQuYmVmb3JlID8gYW5pbWF0ZS5vbkV4aXQuYmVmb3JlIDogX2lkZW50aXR5OyAvLyBJZiBub2RlcyBuZWVkIHRvIGV4aXQsIHRyYW5zZm9ybSB0aGVtIHdpdGggdGhlIHByb3ZpZGVkIG9uRXhpdC5iZWZvcmUgZnVuY3Rpb24uXG5cbiAgICBkYXRhID0gZGF0YS5tYXAoZnVuY3Rpb24gKGRhdHVtLCBpZHgpIHtcbiAgICAgIHZhciBrZXkgPSAoZGF0dW0ua2V5IHx8IGlkeCkudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiBleGl0aW5nTm9kZXNba2V5XSA/IF9hc3NpZ24oe30sIGRhdHVtLCBiZWZvcmUoZGF0dW0sIGlkeCwgZGF0YSkpIDogZGF0dW07XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFuaW1hdGU6IGFuaW1hdGUsXG4gICAgZGF0YTogZGF0YVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtcyxtYXgtbGVuXG5cblxuZnVuY3Rpb24gZ2V0Q2hpbGRQcm9wc0JlZm9yZUVudGVyKGFuaW1hdGUsIGNoaWxkLCBkYXRhLCBlbnRlcmluZ05vZGVzLCBjYikge1xuICBpZiAoZW50ZXJpbmdOb2Rlcykge1xuICAgIC8vIFBlcmZvcm0gYSBub3JtYWwgYW5pbWF0aW9uIGhlcmUsIGV4Y2VwdCAtIHdoZW4gaXQgZmluaXNoZXMgLSB0cmlnZ2VyXG4gICAgLy8gdGhlIHRyYW5zaXRpb24gZm9yIGVudGVyaW5nIG5vZGVzLlxuICAgIGFuaW1hdGUgPSBfYXNzaWduKHt9LCBhbmltYXRlLCB7XG4gICAgICBvbkVuZDogY2JcbiAgICB9KTtcbiAgICB2YXIgYmVmb3JlID0gYW5pbWF0ZS5vbkVudGVyICYmIGFuaW1hdGUub25FbnRlci5iZWZvcmUgPyBhbmltYXRlLm9uRW50ZXIuYmVmb3JlIDogX2lkZW50aXR5OyAvLyBXZSB3YW50IHRoZSBlbnRlcmluZyBub2RlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgdHJhbnNpdGlvbiB0YXJnZXRcbiAgICAvLyBkb21haW4uICBIb3dldmVyLCB3ZSBtYXkgbm90IHdhbnQgdGhlc2Ugbm9kZXMgdG8gYmUgZGlzcGxheWVkIGluaXRpYWxseSxcbiAgICAvLyBzbyBwZXJmb3JtIHRoZSBgb25FbnRlci5iZWZvcmVgIHRyYW5zZm9ybWF0aW9uIG9uIGVhY2ggbm9kZS5cblxuICAgIGRhdGEgPSBkYXRhLm1hcChmdW5jdGlvbiAoZGF0dW0sIGlkeCkge1xuICAgICAgdmFyIGtleSA9IChkYXR1bS5rZXkgfHwgaWR4KS50b1N0cmluZygpO1xuICAgICAgcmV0dXJuIGVudGVyaW5nTm9kZXNba2V5XSA/IF9hc3NpZ24oe30sIGRhdHVtLCBiZWZvcmUoZGF0dW0sIGlkeCwgZGF0YSkpIDogZGF0dW07XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFuaW1hdGU6IGFuaW1hdGUsXG4gICAgZGF0YTogZGF0YVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtcywgbWF4LWxlblxuXG5cbmZ1bmN0aW9uIGdldENoaWxkUHJvcHNPbkVudGVyKGFuaW1hdGUsIGRhdGEsIGVudGVyaW5nTm9kZXMsIGNiKSB7XG4gIC8vIFdoZXRoZXIgb3Igbm90IF90aGlzXyBjaGlsZCBoYXMgZW50ZXJpbmcgbm9kZXMsIHdlIHdhbnQgdGhlIGVudGVyaW5nLVxuICAvLyB0cmFuc2l0aW9uIGZvciBhbGwgY2hpbGRyZW4gdG8gaGF2ZSB0aGUgc2FtZSBkdXJhdGlvbiwgZGVsYXksIGV0Yy5cbiAgdmFyIG9uRW50ZXIgPSBhbmltYXRlICYmIGFuaW1hdGUub25FbnRlcjtcbiAgYW5pbWF0ZSA9IF9hc3NpZ24oe30sIGFuaW1hdGUsIG9uRW50ZXIpO1xuXG4gIGlmIChlbnRlcmluZ05vZGVzKSB7XG4gICAgLy8gT2xkIG5vZGVzIGhhdmUgYmVlbiB0cmFuc2l0aW9uZWQgdG8gdGhlaXIgbmV3IHZhbHVlcywgYW5kIHRoZVxuICAgIC8vIGRvbWFpbiBzaG91bGQgZW5jb21wYXNzIHRoZSBub2RlcyB0aGF0IHdpbGwgbm93IGVudGVyLiBTbyBwZXJmb3JtXG4gICAgLy8gdGhlIGBvbkVudGVyLmFmdGVyYCB0cmFuc2Zvcm1hdGlvbiBvbiBlYWNoIG5vZGUuXG4gICAgYW5pbWF0ZS5vbkVuZCA9IGNiO1xuICAgIHZhciBhZnRlciA9IGFuaW1hdGUub25FbnRlciAmJiBhbmltYXRlLm9uRW50ZXIuYWZ0ZXIgPyBhbmltYXRlLm9uRW50ZXIuYWZ0ZXIgOiBfaWRlbnRpdHk7XG4gICAgZGF0YSA9IGRhdGEubWFwKGZ1bmN0aW9uIChkYXR1bSwgaWR4KSB7XG4gICAgICB2YXIga2V5ID0gZ2V0RGF0dW1LZXkoZGF0dW0sIGlkeCk7XG4gICAgICByZXR1cm4gZW50ZXJpbmdOb2Rlc1trZXldID8gX2Fzc2lnbih7fSwgZGF0dW0sIGFmdGVyKGRhdHVtLCBpZHgsIGRhdGEpKSA6IGRhdHVtO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhbmltYXRlOiBhbmltYXRlLFxuICAgIGRhdGE6IGRhdGFcbiAgfTtcbn1cbi8qKlxuICogZ2V0VHJhbnNpdGlvblByb3BzRmFjdG9yeSAtIHB1dHRpbmcgdGhlIEphdmEgaW4gSmF2YVNjcmlwdC4gIFRoaXMgd2lsbCByZXR1cm4gYVxuICogZnVuY3Rpb24gdGhhdCByZXR1cm5zIHByb3AgdHJhbnNmb3JtYXRpb25zIGZvciBhIGNoaWxkLCBnaXZlbiB0aGF0IGNoaWxkJ3MgcHJvcHNcbiAqIGFuZCBpdHMgaW5kZXggaW4gdGhlIHBhcmVudCdzIGNoaWxkcmVuIGFycmF5LlxuICpcbiAqIEluIHBhcnRpY3VsYXIsIHRoaXMgd2lsbCBpbmNsdWRlIGFuIGBhbmltYXRlYCBvYmplY3QgdGhhdCBpcyBzZXQgYXBwcm9wcmlhdGVseVxuICogc28gdGhhdCBlYWNoIGNoaWxkIHdpbGwgYmUgc3luY2hvcm9uaXplZCBmb3IgZWFjaCBzdGFnZSBvZiBhIHRyYW5zaXRpb25cbiAqIGFuaW1hdGlvbi4gIEl0IHdpbGwgYWxzbyBpbmNsdWRlIGEgdHJhbnNmb3JtZWQgYGRhdGFgIG9iamVjdCwgd2hlcmUgZWFjaCBkYXR1bVxuICogaXMgdHJhbnNmb3JtZWQgYnkgYGFuaW1hdGUub25FeGl0YCBhbmQgYGFuaW1hdGUub25FbnRlcmAgYGJlZm9yZWAgYW5kIGBhZnRlcmBcbiAqIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBwcm9wcyAgICAgICBgdGhpcy5wcm9wc2AgZm9yIHRoZSBwYXJlbnQgY29tcG9uZW50LlxuICogQHBhcmFtICB7T2JqZWN0fSBzdGF0ZSAgICAgICAgYHRoaXMuc3RhdGVgIGZvciB0aGUgcGFyZW50IGNvbXBvbmVudC5cbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBzZXRTdGF0ZSAgICBGdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCBgdGhpcy5zZXRTdGF0ZWAgb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb25lbnQgd2l0aCB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuICpcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSAgICAgICAgICAgICAgQ2hpbGQtcHJvcCB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbi5cbiAqL1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2l0aW9uUHJvcHNGYWN0b3J5KHByb3BzLCBzdGF0ZSwgc2V0U3RhdGUpIHtcbiAgdmFyIG5vZGVzV2lsbEV4aXQgPSBzdGF0ZSAmJiBzdGF0ZS5ub2Rlc1dpbGxFeGl0O1xuICB2YXIgbm9kZXNXaWxsRW50ZXIgPSBzdGF0ZSAmJiBzdGF0ZS5ub2Rlc1dpbGxFbnRlcjtcbiAgdmFyIG5vZGVzU2hvdWxkRW50ZXIgPSBzdGF0ZSAmJiBzdGF0ZS5ub2Rlc1Nob3VsZEVudGVyO1xuICB2YXIgbm9kZXNTaG91bGRMb2FkID0gc3RhdGUgJiYgc3RhdGUubm9kZXNTaG91bGRMb2FkO1xuICB2YXIgbm9kZXNEb25lTG9hZCA9IHN0YXRlICYmIHN0YXRlLm5vZGVzRG9uZUxvYWQ7XG4gIHZhciBjaGlsZHJlblRyYW5zaXRpb25zID0gc3RhdGUgJiYgc3RhdGUuY2hpbGRyZW5UcmFuc2l0aW9ucyB8fCBbXTtcbiAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbnMgPSB7XG4gICAgZW50ZXI6IHByb3BzLmFuaW1hdGUgJiYgcHJvcHMuYW5pbWF0ZS5vbkVudGVyICYmIHByb3BzLmFuaW1hdGUub25FbnRlci5kdXJhdGlvbixcbiAgICBleGl0OiBwcm9wcy5hbmltYXRlICYmIHByb3BzLmFuaW1hdGUub25FeGl0ICYmIHByb3BzLmFuaW1hdGUub25FeGl0LmR1cmF0aW9uLFxuICAgIGxvYWQ6IHByb3BzLmFuaW1hdGUgJiYgcHJvcHMuYW5pbWF0ZS5vbkxvYWQgJiYgcHJvcHMuYW5pbWF0ZS5vbkxvYWQuZHVyYXRpb24sXG4gICAgbW92ZTogcHJvcHMuYW5pbWF0ZSAmJiBwcm9wcy5hbmltYXRlLmR1cmF0aW9uXG4gIH07XG5cbiAgdmFyIG9uTG9hZCA9IGZ1bmN0aW9uIChjaGlsZCwgZGF0YSwgYW5pbWF0ZSkge1xuICAgIGlmIChub2Rlc1Nob3VsZExvYWQpIHtcbiAgICAgIHJldHVybiBnZXRDaGlsZE9uTG9hZChhbmltYXRlLCBkYXRhLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBub2Rlc1Nob3VsZExvYWQ6IGZhbHNlLFxuICAgICAgICAgIG5vZGVzRG9uZUxvYWQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0Q2hpbGRCZWZvcmVMb2FkKGFuaW1hdGUsIGNoaWxkLCBkYXRhLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIG5vZGVzRG9uZUxvYWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuXG5cbiAgdmFyIG9uRXhpdCA9IGZ1bmN0aW9uIChub2RlcywgY2hpbGQsIGRhdGEsIGFuaW1hdGUpIHtcbiAgICByZXR1cm4gZ2V0Q2hpbGRQcm9wc09uRXhpdChhbmltYXRlLCBjaGlsZCwgZGF0YSwgbm9kZXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgbm9kZXNXaWxsRXhpdDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuXG5cbiAgdmFyIG9uRW50ZXIgPSBmdW5jdGlvbiAobm9kZXMsIGNoaWxkLCBkYXRhLCBhbmltYXRlKSB7XG4gICAgaWYgKG5vZGVzU2hvdWxkRW50ZXIpIHtcbiAgICAgIHJldHVybiBnZXRDaGlsZFByb3BzT25FbnRlcihhbmltYXRlLCBkYXRhLCBub2RlcywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgbm9kZXNXaWxsRW50ZXI6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldENoaWxkUHJvcHNCZWZvcmVFbnRlcihhbmltYXRlLCBjaGlsZCwgZGF0YSwgbm9kZXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgbm9kZXNTaG91bGRFbnRlcjogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGdldENoaWxkVHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24gKGNoaWxkLCB0eXBlKSB7XG4gICAgdmFyIGFuaW1hdGUgPSBjaGlsZC5wcm9wcy5hbmltYXRlO1xuXG4gICAgaWYgKCFjaGlsZC50eXBlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRUcmFuc2l0aW9ucyA9IGNoaWxkLnByb3BzICYmIGNoaWxkLnByb3BzLnBvbGFyID8gY2hpbGQudHlwZS5kZWZhdWx0UG9sYXJUcmFuc2l0aW9ucyB8fCBjaGlsZC50eXBlLmRlZmF1bHRUcmFuc2l0aW9ucyA6IGNoaWxkLnR5cGUuZGVmYXVsdFRyYW5zaXRpb25zO1xuXG4gICAgaWYgKGRlZmF1bHRUcmFuc2l0aW9ucykge1xuICAgICAgdmFyIGFuaW1hdGlvbkR1cmF0aW9uID0gYW5pbWF0ZVt0eXBlXSAmJiBhbmltYXRlW3R5cGVdLmR1cmF0aW9uO1xuICAgICAgcmV0dXJuIGFuaW1hdGlvbkR1cmF0aW9uICE9PSB1bmRlZmluZWQgPyBhbmltYXRpb25EdXJhdGlvbiA6IGRlZmF1bHRUcmFuc2l0aW9uc1t0eXBlXSAmJiBkZWZhdWx0VHJhbnNpdGlvbnNbdHlwZV0uZHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50cywgY29tcGxleGl0eSwgbWF4LWxlblxuXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGdldFRyYW5zaXRpb25Qcm9wcyhjaGlsZCwgaW5kZXgpIHtcbiAgICB2YXIgZGF0YSA9IGdldENoaWxkRGF0YShjaGlsZCkgfHwgW107XG5cbiAgICB2YXIgYW5pbWF0ZSA9IF9kZWZhdWx0cyh7fSwgcHJvcHMuYW5pbWF0ZSwgY2hpbGQucHJvcHMuYW5pbWF0ZSk7XG5cbiAgICB2YXIgZGVmYXVsdFRyYW5zaXRpb25zID0gY2hpbGQucHJvcHMucG9sYXIgPyBjaGlsZC50eXBlLmRlZmF1bHRQb2xhclRyYW5zaXRpb25zIHx8IGNoaWxkLnR5cGUuZGVmYXVsdFRyYW5zaXRpb25zIDogY2hpbGQudHlwZS5kZWZhdWx0VHJhbnNpdGlvbnM7XG4gICAgYW5pbWF0ZS5vbkV4aXQgPSBfZGVmYXVsdHMoe30sIGFuaW1hdGUub25FeGl0LCBkZWZhdWx0VHJhbnNpdGlvbnMgJiYgZGVmYXVsdFRyYW5zaXRpb25zLm9uRXhpdCk7XG4gICAgYW5pbWF0ZS5vbkVudGVyID0gX2RlZmF1bHRzKHt9LCBhbmltYXRlLm9uRW50ZXIsIGRlZmF1bHRUcmFuc2l0aW9ucyAmJiBkZWZhdWx0VHJhbnNpdGlvbnMub25FbnRlcik7XG4gICAgYW5pbWF0ZS5vbkxvYWQgPSBfZGVmYXVsdHMoe30sIGFuaW1hdGUub25Mb2FkLCBkZWZhdWx0VHJhbnNpdGlvbnMgJiYgZGVmYXVsdFRyYW5zaXRpb25zLm9uTG9hZCk7XG4gICAgdmFyIGNoaWxkVHJhbnNpdGlvbnMgPSBjaGlsZHJlblRyYW5zaXRpb25zW2luZGV4XSB8fCBjaGlsZHJlblRyYW5zaXRpb25zWzBdO1xuXG4gICAgaWYgKCFub2Rlc0RvbmVMb2FkKSB7XG4gICAgICAvLyBzaG91bGQgZG8gb25Mb2FkIGFuaW1hdGlvblxuICAgICAgdmFyIGxvYWQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxvYWQgIT09IHVuZGVmaW5lZCA/IHRyYW5zaXRpb25EdXJhdGlvbnMubG9hZCA6IGdldENoaWxkVHJhbnNpdGlvbkR1cmF0aW9uKGNoaWxkLCBcIm9uTG9hZFwiKTtcbiAgICAgIHZhciBhbmltYXRpb24gPSB7XG4gICAgICAgIGR1cmF0aW9uOiBsb2FkXG4gICAgICB9O1xuICAgICAgcmV0dXJuIG9uTG9hZChjaGlsZCwgZGF0YSwgX2Fzc2lnbih7fSwgYW5pbWF0ZSwgYW5pbWF0aW9uKSk7XG4gICAgfSBlbHNlIGlmIChub2Rlc1dpbGxFeGl0KSB7XG4gICAgICB2YXIgZXhpdGluZ05vZGVzID0gY2hpbGRUcmFuc2l0aW9ucyAmJiBjaGlsZFRyYW5zaXRpb25zLmV4aXRpbmc7XG4gICAgICB2YXIgZXhpdCA9IHRyYW5zaXRpb25EdXJhdGlvbnMuZXhpdCAhPT0gdW5kZWZpbmVkID8gdHJhbnNpdGlvbkR1cmF0aW9ucy5leGl0IDogZ2V0Q2hpbGRUcmFuc2l0aW9uRHVyYXRpb24oY2hpbGQsIFwib25FeGl0XCIpOyAvLyBpZiBub2Rlc1dpbGxFeGl0LCBidXQgdGhpcyBjaGlsZCBoYXMgbm8gZXhpdGluZyBub2Rlcywgc2V0IGEgZGVsYXkgaW5zdGVhZCBvZiBhIGR1cmF0aW9uXG5cbiAgICAgIHZhciBfYW5pbWF0aW9uID0gZXhpdGluZ05vZGVzID8ge1xuICAgICAgICBkdXJhdGlvbjogZXhpdFxuICAgICAgfSA6IHtcbiAgICAgICAgZGVsYXk6IGV4aXRcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBvbkV4aXQoZXhpdGluZ05vZGVzLCBjaGlsZCwgZGF0YSwgX2Fzc2lnbih7fSwgYW5pbWF0ZSwgX2FuaW1hdGlvbikpO1xuICAgIH0gZWxzZSBpZiAobm9kZXNXaWxsRW50ZXIpIHtcbiAgICAgIHZhciBlbnRlcmluZ05vZGVzID0gY2hpbGRUcmFuc2l0aW9ucyAmJiBjaGlsZFRyYW5zaXRpb25zLmVudGVyaW5nO1xuICAgICAgdmFyIGVudGVyID0gdHJhbnNpdGlvbkR1cmF0aW9ucy5lbnRlciAhPT0gdW5kZWZpbmVkID8gdHJhbnNpdGlvbkR1cmF0aW9ucy5lbnRlciA6IGdldENoaWxkVHJhbnNpdGlvbkR1cmF0aW9uKGNoaWxkLCBcIm9uRW50ZXJcIik7XG4gICAgICB2YXIgbW92ZSA9IHRyYW5zaXRpb25EdXJhdGlvbnMubW92ZSAhPT0gdW5kZWZpbmVkID8gdHJhbnNpdGlvbkR1cmF0aW9ucy5tb3ZlIDogY2hpbGQucHJvcHMuYW5pbWF0ZSAmJiBjaGlsZC5wcm9wcy5hbmltYXRlLmR1cmF0aW9uO1xuICAgICAgdmFyIF9hbmltYXRpb24yID0ge1xuICAgICAgICBkdXJhdGlvbjogbm9kZXNTaG91bGRFbnRlciAmJiBlbnRlcmluZ05vZGVzID8gZW50ZXIgOiBtb3ZlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIG9uRW50ZXIoZW50ZXJpbmdOb2RlcywgY2hpbGQsIGRhdGEsIF9hc3NpZ24oe30sIGFuaW1hdGUsIF9hbmltYXRpb24yKSk7XG4gICAgfSBlbHNlIGlmICghc3RhdGUgJiYgYW5pbWF0ZSAmJiBhbmltYXRlLm9uRXhpdCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgaW5pdGlhbCByZW5kZXIsIGFuZCBub2RlcyBtYXkgZW50ZXIgd2hlbiBwcm9wcyBjaGFuZ2UuIEJlY2F1c2VcbiAgICAgIC8vIGFuaW1hdGlvbiBpbnRlcnBvbGF0aW9uIGlzIGRldGVybWluZWQgYnkgb2xkLSBhbmQgbmV4dC0gcHJvcHMsIGRhdGEgbWF5IG5lZWRcbiAgICAgIC8vIHRvIGJlIGF1Z21lbnRlZCB3aXRoIGNlcnRhaW4gcHJvcGVydGllcy5cbiAgICAgIC8vXG4gICAgICAvLyBGb3IgZXhhbXBsZSwgaXQgbWF5IGJlIGRlc2lyZWQgdGhhdCBleGl0aW5nIG5vZGVzIGdvIGZyb20gYG9wYWNpdHk6IDFgIHRvXG4gICAgICAvLyBgb3BhY2l0eTogMGAuIFdpdGhvdXQgc2V0dGluZyB0aGlzIG9uIGEgcGVyLWRhdHVtIGJhc2lzLCB0aGUgaW50ZXJwb2xhdGlvblxuICAgICAgLy8gbWlnaHQgZ28gZnJvbSBgb3BhY2l0eTogdW5kZWZpbmVkYCB0byBgb3BhY2l0eTogMGAsIHdoaWNoIHdvdWxkIHJlc3VsdCBpblxuICAgICAgLy8gaW50ZXJwb2xhdGVkIGBvcGFjaXR5OiBOYU5gIHZhbHVlcy5cbiAgICAgIC8vXG4gICAgICByZXR1cm4gZ2V0SW5pdGlhbENoaWxkUHJvcHMoYW5pbWF0ZSwgZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFuaW1hdGU6IGFuaW1hdGUsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfTtcbiAgfTtcbn0iLCJpbXBvcnQgX3NvbWUgZnJvbSBcImxvZGFzaC9zb21lXCI7XG5pbXBvcnQgX2RlZmF1bHRzIGZyb20gXCJsb2Rhc2gvZGVmYXVsdHNcIjtcblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0ICogYXMgQ29sbGVjdGlvbiBmcm9tIFwiLi4vY29sbGVjdGlvblwiO1xuaW1wb3J0ICogYXMgVHJhbnNpdGlvbnMgZnJvbSBcIi4uL3RyYW5zaXRpb25zXCI7XG52YXIgSU5JVElBTF9TVEFURSA9IHtcbiAgbm9kZXNTaG91bGRMb2FkOiBmYWxzZSxcbiAgbm9kZXNEb25lTG9hZDogZmFsc2UsXG4gIGFuaW1hdGluZzogdHJ1ZVxufTtcbmV4cG9ydCB2YXIgdXNlQW5pbWF0aW9uU3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpbml0aWFsU3RhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IElOSVRJQUxfU1RBVEU7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGluaXRpYWxTdGF0ZSksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIHN0YXRlID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIF9zZXRTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07IC8vIFRoaXMgYWxsb3dzIHVzIHRvIHVzZSBhIHN0YXRlIG9iamVjdCBhbmQgbWFpbnRhaW4gdGhlIHNhbWUgQVBJIGFzIHRoaXMuc2V0U3RhdGVcblxuXG4gIHZhciBzZXRTdGF0ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChuZXdTdGF0ZSkge1xuICAgIF9zZXRTdGF0ZShmdW5jdGlvbiAob2xkU3RhdGUpIHtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgIH0pO1xuICB9LCBbX3NldFN0YXRlXSk7IC8vIFRoaXMgaXMgYSBjb3B5IG9mIFdyYXBwZXIuZ2V0QW5pbWF0aW9uUHJvcHNcblxuICB2YXIgZ2V0QW5pbWF0aW9uUHJvcHMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAocHJvcHMsIGNoaWxkLCBpbmRleCkge1xuICAgIGlmICghcHJvcHMuYW5pbWF0ZSkge1xuICAgICAgcmV0dXJuIGNoaWxkLnByb3BzLmFuaW1hdGU7XG4gICAgfVxuXG4gICAgdmFyIGdldEZpbHRlcmVkU3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY2hpbGRyZW5UcmFuc2l0aW9ucyA9IHN0YXRlICYmIHN0YXRlLmNoaWxkcmVuVHJhbnNpdGlvbnM7XG4gICAgICBjaGlsZHJlblRyYW5zaXRpb25zID0gQ29sbGVjdGlvbi5pc0FycmF5T2ZBcnJheXMoY2hpbGRyZW5UcmFuc2l0aW9ucykgPyBjaGlsZHJlblRyYW5zaXRpb25zW2luZGV4XSA6IGNoaWxkcmVuVHJhbnNpdGlvbnM7XG4gICAgICByZXR1cm4gX2RlZmF1bHRzKHtcbiAgICAgICAgY2hpbGRyZW5UcmFuc2l0aW9uczogY2hpbGRyZW5UcmFuc2l0aW9uc1xuICAgICAgfSwgc3RhdGUpO1xuICAgIH07XG5cbiAgICB2YXIgZ2V0VHJhbnNpdGlvbnMgPSBwcm9wcy5hbmltYXRlICYmIHByb3BzLmFuaW1hdGUuZ2V0VHJhbnNpdGlvbnM7XG4gICAgdmFyIGZpbHRlcmVkU3RhdGUgPSBnZXRGaWx0ZXJlZFN0YXRlKCk7XG4gICAgdmFyIHBhcmVudFN0YXRlID0gcHJvcHMuYW5pbWF0ZSAmJiBwcm9wcy5hbmltYXRlLnBhcmVudFN0YXRlIHx8IGZpbHRlcmVkU3RhdGU7XG5cbiAgICBpZiAoIWdldFRyYW5zaXRpb25zKSB7XG4gICAgICB2YXIgZ2V0VHJhbnNpdGlvblByb3BzID0gVHJhbnNpdGlvbnMuZ2V0VHJhbnNpdGlvblByb3BzRmFjdG9yeShwcm9wcywgZmlsdGVyZWRTdGF0ZSwgZnVuY3Rpb24gKG5ld1N0YXRlKSB7XG4gICAgICAgIHJldHVybiBzZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgICB9KTtcblxuICAgICAgZ2V0VHJhbnNpdGlvbnMgPSBmdW5jdGlvbiAoY2hpbGRDb21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuIGdldFRyYW5zaXRpb25Qcm9wcyhjaGlsZENvbXBvbmVudCwgaW5kZXgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2RlZmF1bHRzKHtcbiAgICAgIGdldFRyYW5zaXRpb25zOiBnZXRUcmFuc2l0aW9ucyxcbiAgICAgIHBhcmVudFN0YXRlOiBwYXJlbnRTdGF0ZVxuICAgIH0sIHByb3BzLmFuaW1hdGUsIGNoaWxkLnByb3BzLmFuaW1hdGUpO1xuICB9LCBbc3RhdGUsIHNldFN0YXRlXSk7IC8vIFRoaXMgaXMgYSBjb3B5IG9mIFdyYXBwZXIuc2V0QW5pbWF0aW9uU3RhdGVcblxuICB2YXIgc2V0QW5pbWF0aW9uU3RhdGUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAocHJvcHMsIG5leHRQcm9wcykge1xuICAgIGlmICghcHJvcHMuYW5pbWF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5hbmltYXRlLnBhcmVudFN0YXRlKSB7XG4gICAgICB2YXIgbm9kZXNXaWxsRXhpdCA9IHByb3BzLmFuaW1hdGUucGFyZW50U3RhdGUubm9kZXNXaWxsRXhpdDtcbiAgICAgIHZhciBvbGRQcm9wcyA9IG5vZGVzV2lsbEV4aXQgPyBwcm9wcyA6IG51bGw7XG5cbiAgICAgIHZhciBuZXdTdGF0ZSA9IF9kZWZhdWx0cyh7XG4gICAgICAgIG9sZFByb3BzOiBvbGRQcm9wcyxcbiAgICAgICAgbmV4dFByb3BzOiBuZXh0UHJvcHNcbiAgICAgIH0sIHByb3BzLmFuaW1hdGUucGFyZW50U3RhdGUpO1xuXG4gICAgICBzZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvbGRDaGlsZHJlbiA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkocHJvcHMuY2hpbGRyZW4pO1xuICAgICAgdmFyIG5leHRDaGlsZHJlbiA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkobmV4dFByb3BzLmNoaWxkcmVuKTtcblxuICAgICAgdmFyIGlzQ29udGludW91cyA9IGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICB2YXIgY2hlY2sgPSBmdW5jdGlvbiAoYykge1xuICAgICAgICAgIHJldHVybiBjLnR5cGUgJiYgYy50eXBlLmNvbnRpbnVvdXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY2hpbGQpID8gX3NvbWUoY2hpbGQsIGNoZWNrKSA6IGNoZWNrKGNoaWxkKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBjb250aW51b3VzID0gIXByb3BzLnBvbGFyICYmIF9zb21lKG9sZENoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29udGludW91cyhjaGlsZCkgfHwgY2hpbGQucHJvcHMuY2hpbGRyZW4gJiYgaXNDb250aW51b3VzKGNoaWxkLnByb3BzLmNoaWxkcmVuKTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgX1RyYW5zaXRpb25zJGdldEluaXRpID0gVHJhbnNpdGlvbnMuZ2V0SW5pdGlhbFRyYW5zaXRpb25TdGF0ZShvbGRDaGlsZHJlbiwgbmV4dENoaWxkcmVuKSxcbiAgICAgICAgICBfbm9kZXNXaWxsRXhpdCA9IF9UcmFuc2l0aW9ucyRnZXRJbml0aS5ub2Rlc1dpbGxFeGl0LFxuICAgICAgICAgIG5vZGVzV2lsbEVudGVyID0gX1RyYW5zaXRpb25zJGdldEluaXRpLm5vZGVzV2lsbEVudGVyLFxuICAgICAgICAgIGNoaWxkcmVuVHJhbnNpdGlvbnMgPSBfVHJhbnNpdGlvbnMkZ2V0SW5pdGkuY2hpbGRyZW5UcmFuc2l0aW9ucyxcbiAgICAgICAgICBub2Rlc1Nob3VsZEVudGVyID0gX1RyYW5zaXRpb25zJGdldEluaXRpLm5vZGVzU2hvdWxkRW50ZXI7XG5cbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgbm9kZXNXaWxsRXhpdDogX25vZGVzV2lsbEV4aXQsXG4gICAgICAgIG5vZGVzV2lsbEVudGVyOiBub2Rlc1dpbGxFbnRlcixcbiAgICAgICAgbm9kZXNTaG91bGRFbnRlcjogbm9kZXNTaG91bGRFbnRlcixcbiAgICAgICAgY2hpbGRyZW5UcmFuc2l0aW9uczogQ29sbGVjdGlvbi5pc0FycmF5T2ZBcnJheXMoY2hpbGRyZW5UcmFuc2l0aW9ucykgPyBjaGlsZHJlblRyYW5zaXRpb25zWzBdIDogY2hpbGRyZW5UcmFuc2l0aW9ucyxcbiAgICAgICAgb2xkUHJvcHM6IF9ub2Rlc1dpbGxFeGl0ID8gcHJvcHMgOiBudWxsLFxuICAgICAgICBuZXh0UHJvcHM6IG5leHRQcm9wcyxcbiAgICAgICAgY29udGludW91czogY29udGludW91c1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbc2V0U3RhdGVdKTtcbiAgdmFyIGdldFByb3BzID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGluaXRpYWxQcm9wcykge1xuICAgIHJldHVybiBzdGF0ZSAmJiBzdGF0ZS5ub2Rlc1dpbGxFeGl0ID8gc3RhdGUub2xkUHJvcHMgfHwgaW5pdGlhbFByb3BzIDogaW5pdGlhbFByb3BzO1xuICB9LCBbc3RhdGVdKTtcbiAgcmV0dXJuIHtcbiAgICBzdGF0ZTogc3RhdGUsXG4gICAgc2V0U3RhdGU6IHNldFN0YXRlLFxuICAgIGdldEFuaW1hdGlvblByb3BzOiBnZXRBbmltYXRpb25Qcm9wcyxcbiAgICBzZXRBbmltYXRpb25TdGF0ZTogc2V0QW5pbWF0aW9uU3RhdGUsXG4gICAgZ2V0UHJvcHM6IGdldFByb3BzXG4gIH07XG59OyIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmV4cG9ydCB2YXIgdXNlUHJldmlvdXNQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgcmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmVmLmN1cnJlbnQgPSBwcm9wcztcbiAgfSk7XG4gIHJldHVybiByZWYuY3VycmVudCB8fCB7fTtcbn07IiwiaW1wb3J0IF9kaWZmZXJlbmNlIGZyb20gXCJsb2Rhc2gvZGlmZmVyZW5jZVwiO1xuaW1wb3J0IF9rZXlzIGZyb20gXCJsb2Rhc2gva2V5c1wiO1xuaW1wb3J0IF9mcm9tUGFpcnMgZnJvbSBcImxvZGFzaC9mcm9tUGFpcnNcIjtcbmltcG9ydCBfaXNFbXB0eSBmcm9tIFwibG9kYXNoL2lzRW1wdHlcIjtcbmltcG9ydCBfZGVmYXVsdHMgZnJvbSBcImxvZGFzaC9kZWZhdWx0c1wiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gvaXNGdW5jdGlvblwiO1xuaW1wb3J0IF9hc3NpZ24gZnJvbSBcImxvZGFzaC9hc3NpZ25cIjtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyB2YXIgX2FyciA9IFtdOyB2YXIgX24gPSB0cnVlOyB2YXIgX2QgPSBmYWxzZTsgdmFyIF9lID0gdW5kZWZpbmVkOyB0cnkgeyBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2QgPSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHsgUHJvcFR5cGVzIGFzIEN1c3RvbVByb3BUeXBlcywgRXZlbnRzLCBIZWxwZXJzLCBUaW1lckNvbnRleHQgfSBmcm9tIFwidmljdG9yeS1jb3JlXCI7XG5pbXBvcnQgaXNFcXVhbCBmcm9tIFwicmVhY3QtZmFzdC1jb21wYXJlXCI7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gXCJqc29uLXN0cmluZ2lmeS1zYWZlXCI7XG5cbnZhciBWaWN0b3J5U2hhcmVkRXZlbnRzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhWaWN0b3J5U2hhcmVkRXZlbnRzLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBWaWN0b3J5U2hhcmVkRXZlbnRzKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFZpY3RvcnlTaGFyZWRFdmVudHMpO1xuXG4gICAgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoVmljdG9yeVNoYXJlZEV2ZW50cy5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFZpY3RvcnlTaGFyZWRFdmVudHMpKS5jYWxsKHRoaXMsIHByb3BzKSk7XG4gICAgX3RoaXMuc3RhdGUgPSBfdGhpcy5zdGF0ZSB8fCB7fTtcbiAgICBfdGhpcy5nZXRTY29wZWRFdmVudHMgPSBFdmVudHMuZ2V0U2NvcGVkRXZlbnRzLmJpbmQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIF90aGlzLmdldEV2ZW50U3RhdGUgPSBFdmVudHMuZ2V0RXZlbnRTdGF0ZS5iaW5kKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICBfdGhpcy5iYXNlUHJvcHMgPSBfdGhpcy5nZXRCYXNlUHJvcHMocHJvcHMpO1xuICAgIF90aGlzLnNoYXJlZEV2ZW50c0NhY2hlID0ge307XG4gICAgX3RoaXMuZ2xvYmFsRXZlbnRzID0ge307XG4gICAgX3RoaXMucHJldkdsb2JhbEV2ZW50S2V5cyA9IFtdO1xuICAgIF90aGlzLmJvdW5kR2xvYmFsRXZlbnRzID0ge307XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFZpY3RvcnlTaGFyZWRFdmVudHMsIFt7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICBpZiAoIWlzRXF1YWwodGhpcy5wcm9wcywgbmV4dFByb3BzKSkge1xuICAgICAgICB0aGlzLmJhc2VQcm9wcyA9IHRoaXMuZ2V0QmFzZVByb3BzKG5leHRQcm9wcyk7XG4gICAgICAgIHZhciBleHRlcm5hbE11dGF0aW9ucyA9IHRoaXMuZ2V0RXh0ZXJuYWxNdXRhdGlvbnMobmV4dFByb3BzLCB0aGlzLmJhc2VQcm9wcyk7XG4gICAgICAgIHRoaXMuYXBwbHlFeHRlcm5hbE11dGF0aW9ucyhuZXh0UHJvcHMsIGV4dGVybmFsTXV0YXRpb25zKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBnbG9iYWxFdmVudEtleXMgPSBfa2V5cyh0aGlzLmdsb2JhbEV2ZW50cyk7XG5cbiAgICAgIGdsb2JhbEV2ZW50S2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5hZGRHbG9iYWxMaXN0ZW5lcihrZXkpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnByZXZHbG9iYWxFdmVudEtleXMgPSBnbG9iYWxFdmVudEtleXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIGdsb2JhbEV2ZW50S2V5cyA9IF9rZXlzKHRoaXMuZ2xvYmFsRXZlbnRzKTtcblxuICAgICAgdmFyIHJlbW92ZWRHbG9iYWxFdmVudEtleXMgPSBfZGlmZmVyZW5jZSh0aGlzLnByZXZHbG9iYWxFdmVudEtleXMsIGdsb2JhbEV2ZW50S2V5cyk7XG5cbiAgICAgIHJlbW92ZWRHbG9iYWxFdmVudEtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBfdGhpczMucmVtb3ZlR2xvYmFsTGlzdGVuZXIoa2V5KTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgYWRkZWRHbG9iYWxFdmVudEtleXMgPSBfZGlmZmVyZW5jZShnbG9iYWxFdmVudEtleXMsIHRoaXMucHJldkdsb2JhbEV2ZW50S2V5cyk7XG5cbiAgICAgIGFkZGVkR2xvYmFsRXZlbnRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gX3RoaXMzLmFkZEdsb2JhbExpc3RlbmVyKGtleSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucHJldkdsb2JhbEV2ZW50S2V5cyA9IGdsb2JhbEV2ZW50S2V5cztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdGhpcy5wcmV2R2xvYmFsRXZlbnRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gX3RoaXM0LnJlbW92ZUdsb2JhbExpc3RlbmVyKGtleSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkR2xvYmFsTGlzdGVuZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkR2xvYmFsTGlzdGVuZXIoa2V5KSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgdmFyIGJvdW5kTGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIGxpc3RlbmVyID0gX3RoaXM1Lmdsb2JhbEV2ZW50c1trZXldO1xuICAgICAgICByZXR1cm4gbGlzdGVuZXIgJiYgbGlzdGVuZXIoRXZlbnRzLmVtdWxhdGVSZWFjdEV2ZW50KGV2ZW50KSk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLmJvdW5kR2xvYmFsRXZlbnRzW2tleV0gPSBib3VuZExpc3RlbmVyO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRXZlbnRzLmdldEdsb2JhbEV2ZW50TmFtZUZyb21LZXkoa2V5KSwgYm91bmRMaXN0ZW5lcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUdsb2JhbExpc3RlbmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUdsb2JhbExpc3RlbmVyKGtleSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRXZlbnRzLmdldEdsb2JhbEV2ZW50TmFtZUZyb21LZXkoa2V5KSwgdGhpcy5ib3VuZEdsb2JhbEV2ZW50c1trZXldKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QWxsRXZlbnRzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFsbEV2ZW50cyhwcm9wcykge1xuICAgICAgdmFyIGNvbXBvbmVudHMgPSBbXCJjb250YWluZXJcIiwgXCJncm91cENvbXBvbmVudFwiXTtcbiAgICAgIHZhciBjb21wb25lbnRFdmVudHMgPSBFdmVudHMuZ2V0Q29tcG9uZW50RXZlbnRzKHByb3BzLCBjb21wb25lbnRzKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29tcG9uZW50RXZlbnRzKSkge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwcm9wcy5ldmVudHMpID8gY29tcG9uZW50RXZlbnRzLmNvbmNhdC5hcHBseShjb21wb25lbnRFdmVudHMsIF90b0NvbnN1bWFibGVBcnJheShwcm9wcy5ldmVudHMpKSA6IGNvbXBvbmVudEV2ZW50cztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb3BzLmV2ZW50cztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYXBwbHlFeHRlcm5hbE11dGF0aW9uc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseUV4dGVybmFsTXV0YXRpb25zKHByb3BzLCBleHRlcm5hbE11dGF0aW9ucykge1xuICAgICAgaWYgKCFfaXNFbXB0eShleHRlcm5hbE11dGF0aW9ucykpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrcyA9IHByb3BzLmV4dGVybmFsRXZlbnRNdXRhdGlvbnMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBtdXRhdGlvbikge1xuICAgICAgICAgIG1lbW8gPSBfaXNGdW5jdGlvbihtdXRhdGlvbi5jYWxsYmFjaykgPyBtZW1vLmNvbmNhdChtdXRhdGlvbi5jYWxsYmFjaykgOiBtZW1vO1xuICAgICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIHZhciBjb21waWxlZENhbGxiYWNrcyA9IGNhbGxiYWNrcy5sZW5ndGggPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgIHJldHVybiBjKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoZXh0ZXJuYWxNdXRhdGlvbnMsIGNvbXBpbGVkQ2FsbGJhY2tzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RXh0ZXJuYWxNdXRhdGlvbnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RXh0ZXJuYWxNdXRhdGlvbnMocHJvcHMsIGJhc2VQcm9wcykge1xuICAgICAgcmV0dXJuICFfaXNFbXB0eShwcm9wcy5leHRlcm5hbEV2ZW50TXV0YXRpb25zKSA/IEV2ZW50cy5nZXRFeHRlcm5hbE11dGF0aW9uc1dpdGhDaGlsZHJlbihwcm9wcy5leHRlcm5hbEV2ZW50TXV0YXRpb25zLCBiYXNlUHJvcHMsIHRoaXMuc3RhdGUsIF9rZXlzKGJhc2VQcm9wcykpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjYWNoZVNoYXJlZEV2ZW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYWNoZVNoYXJlZEV2ZW50cyhuYW1lLCBzaGFyZWRFdmVudHMsIGNhY2hlVmFsdWVzKSB7XG4gICAgICB0aGlzLnNoYXJlZEV2ZW50c0NhY2hlW25hbWVdID0gW3NoYXJlZEV2ZW50cywgY2FjaGVWYWx1ZXNdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDYWNoZWRTaGFyZWRFdmVudHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2FjaGVkU2hhcmVkRXZlbnRzKG5hbWUsIGNhY2hlVmFsdWVzKSB7XG4gICAgICB2YXIgX3JlZiA9IHRoaXMuc2hhcmVkRXZlbnRzQ2FjaGVbbmFtZV0gfHwgW10sXG4gICAgICAgICAgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgICAgICBzaGFyZWRFdmVudHMgPSBfcmVmMlswXSxcbiAgICAgICAgICBwcmV2Q2FjaGVWYWx1ZXMgPSBfcmVmMlsxXTtcblxuICAgICAgaWYgKHNoYXJlZEV2ZW50cyAmJiBpc0VxdWFsKGNhY2hlVmFsdWVzLCBwcmV2Q2FjaGVWYWx1ZXMpKSB7XG4gICAgICAgIHJldHVybiBzaGFyZWRFdmVudHM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEJhc2VQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRCYXNlUHJvcHMocHJvcHMpIHtcbiAgICAgIHZhciBjb250YWluZXIgPSBwcm9wcy5jb250YWluZXI7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KHRoaXMucHJvcHMuY2hpbGRyZW4pO1xuICAgICAgdmFyIGNoaWxkQmFzZVByb3BzID0gdGhpcy5nZXRCYXNlUHJvcHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4pO1xuICAgICAgdmFyIHBhcmVudEJhc2VQcm9wcyA9IGNvbnRhaW5lciA/IGNvbnRhaW5lci5wcm9wcyA6IHt9O1xuICAgICAgcmV0dXJuIF9hc3NpZ24oe30sIGNoaWxkQmFzZVByb3BzLCB7XG4gICAgICAgIHBhcmVudDogcGFyZW50QmFzZVByb3BzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QmFzZVByb3BzRnJvbUNoaWxkcmVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEJhc2VQcm9wc0Zyb21DaGlsZHJlbihjaGlsZENvbXBvbmVudHMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGZ1bmN0aW9uIChjaGlsZCwgY2hpbGROYW1lKSB7XG4gICAgICAgIGlmIChjaGlsZC50eXBlICYmIF9pc0Z1bmN0aW9uKGNoaWxkLnR5cGUuZ2V0QmFzZVByb3BzKSkge1xuICAgICAgICAgIHZhciBfYmFzZVByb3BzID0gY2hpbGQucHJvcHMgJiYgY2hpbGQudHlwZS5nZXRCYXNlUHJvcHMoY2hpbGQucHJvcHMpO1xuXG4gICAgICAgICAgcmV0dXJuIF9iYXNlUHJvcHMgPyBbW2NoaWxkTmFtZSwgX2Jhc2VQcm9wc11dIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdmFyIGJhc2VQcm9wcyA9IEhlbHBlcnMucmVkdWNlQ2hpbGRyZW4oY2hpbGRDb21wb25lbnRzLCBpdGVyYXRlZSk7XG4gICAgICByZXR1cm4gX2Zyb21QYWlycyhiYXNlUHJvcHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXROZXdDaGlsZHJlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROZXdDaGlsZHJlbihwcm9wcywgYmFzZVByb3BzKSB7XG4gICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgICAgdmFyIGV2ZW50cyA9IHByb3BzLmV2ZW50cyxcbiAgICAgICAgICBldmVudEtleSA9IHByb3BzLmV2ZW50S2V5O1xuXG4gICAgICB2YXIgYWx0ZXJDaGlsZHJlbiA9IGZ1bmN0aW9uIChjaGlsZHJlbiwgY2hpbGROYW1lcykge1xuICAgICAgICByZXR1cm4gY2hpbGRyZW4ucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBjaGlsZCwgaW5kZXgpIHtcbiAgICAgICAgICBpZiAoY2hpbGQucHJvcHMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHZhciBuZXdDaGlsZHJlbiA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGQucHJvcHMuY2hpbGRyZW4pO1xuICAgICAgICAgICAgdmFyIG5hbWVzID0gY2hpbGROYW1lcy5zbGljZShpbmRleCwgaW5kZXggKyBuZXdDaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIGNoaWxkLnByb3BzLCBhbHRlckNoaWxkcmVuKG5ld0NoaWxkcmVuLCBuYW1lcykpO1xuICAgICAgICAgICAgcmV0dXJuIG1lbW8uY29uY2F0KHJlc3VsdHMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGROYW1lc1tpbmRleF0gIT09IFwicGFyZW50XCIgJiYgY2hpbGQudHlwZSAmJiBfaXNGdW5jdGlvbihjaGlsZC50eXBlLmdldEJhc2VQcm9wcykpIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gY2hpbGQucHJvcHMubmFtZSB8fCBjaGlsZE5hbWVzW2luZGV4XTtcbiAgICAgICAgICAgIHZhciBjaGlsZEV2ZW50cyA9IEFycmF5LmlzQXJyYXkoZXZlbnRzKSAmJiBldmVudHMuZmlsdGVyKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBcInBhcmVudFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZXZlbnQuY2hpbGROYW1lKSA/IGV2ZW50LmNoaWxkTmFtZS5pbmRleE9mKG5hbWUpID4gLTEgOiBldmVudC5jaGlsZE5hbWUgPT09IG5hbWUgfHwgZXZlbnQuY2hpbGROYW1lID09PSBcImFsbFwiO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgc2hhcmVkRXZlbnRzQ2FjaGVWYWx1ZXMgPSBbbmFtZSwgYmFzZVByb3BzLCBjaGlsZEV2ZW50cywgc3RyaW5naWZ5KF90aGlzNi5zdGF0ZVtuYW1lXSldO1xuICAgICAgICAgICAgdmFyIHNoYXJlZEV2ZW50cyA9IF90aGlzNi5nZXRDYWNoZWRTaGFyZWRFdmVudHMobmFtZSwgc2hhcmVkRXZlbnRzQ2FjaGVWYWx1ZXMpIHx8IHtcbiAgICAgICAgICAgICAgZXZlbnRzOiBjaGlsZEV2ZW50cyxcbiAgICAgICAgICAgICAgLy8gcGFydGlhbGx5IGFwcGx5IGNoaWxkIG5hbWUgYW5kIGJhc2VQcm9wcyxcbiAgICAgICAgICAgICAgZ2V0RXZlbnRzOiBmdW5jdGlvbiAoZXZ0cywgdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNi5nZXRTY29wZWRFdmVudHMoZXZ0cywgdGFyZ2V0LCBuYW1lLCBiYXNlUHJvcHMpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAvLyBwYXJ0aWFsbHkgYXBwbHkgY2hpbGQgbmFtZVxuICAgICAgICAgICAgICBnZXRFdmVudFN0YXRlOiBmdW5jdGlvbiAoa2V5LCB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM2LmdldEV2ZW50U3RhdGUoa2V5LCB0YXJnZXQsIG5hbWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBfdGhpczYuY2FjaGVTaGFyZWRFdmVudHMobmFtZSwgc2hhcmVkRXZlbnRzLCBzaGFyZWRFdmVudHNDYWNoZVZhbHVlcyk7XG5cbiAgICAgICAgICAgIHJldHVybiBtZW1vLmNvbmNhdChSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIF9hc3NpZ24oe1xuICAgICAgICAgICAgICBrZXk6IFwiZXZlbnRzLVwiLmNvbmNhdChuYW1lKSxcbiAgICAgICAgICAgICAgc2hhcmVkRXZlbnRzOiBzaGFyZWRFdmVudHMsXG4gICAgICAgICAgICAgIGV2ZW50S2V5OiBldmVudEtleSxcbiAgICAgICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICAgICAgfSwgY2hpbGQucHJvcHMpKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBtZW1vLmNvbmNhdChjaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBbXSk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgY2hpbGROYW1lcyA9IF9rZXlzKGJhc2VQcm9wcyk7XG5cbiAgICAgIHZhciBjaGlsZENvbXBvbmVudHMgPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KHByb3BzLmNoaWxkcmVuKTtcbiAgICAgIHJldHVybiBhbHRlckNoaWxkcmVuKGNoaWxkQ29tcG9uZW50cywgY2hpbGROYW1lcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldENvbnRhaW5lclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDb250YWluZXIocHJvcHMsIGJhc2VQcm9wcywgZXZlbnRzKSB7XG4gICAgICB2YXIgX3RoaXM3ID0gdGhpcztcblxuICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5nZXROZXdDaGlsZHJlbihwcm9wcywgYmFzZVByb3BzKTtcbiAgICAgIHZhciBwYXJlbnRzID0gQXJyYXkuaXNBcnJheShldmVudHMpICYmIGV2ZW50cy5maWx0ZXIoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBldmVudC50YXJnZXQgPT09IFwicGFyZW50XCI7XG4gICAgICB9KTtcbiAgICAgIHZhciBzaGFyZWRFdmVudHMgPSBwYXJlbnRzLmxlbmd0aCA+IDAgPyB7XG4gICAgICAgIGV2ZW50czogcGFyZW50cyxcbiAgICAgICAgLy8gcGFydGlhbGx5IGFwcGx5IGNoaWxkTmFtZSAobnVsbCkgYW5kIGJhc2VQcm9wcyxcbiAgICAgICAgZ2V0RXZlbnRzOiBmdW5jdGlvbiAoZXZ0cywgdGFyZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzNy5nZXRTY29wZWRFdmVudHMoZXZ0cywgdGFyZ2V0LCBudWxsLCBiYXNlUHJvcHMpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRFdmVudFN0YXRlOiB0aGlzLmdldEV2ZW50U3RhdGVcbiAgICAgIH0gOiBudWxsO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHByb3BzLmNvbnRhaW5lciB8fCBwcm9wcy5ncm91cENvbXBvbmVudDtcbiAgICAgIHZhciByb2xlID0gY29udGFpbmVyLnR5cGUgJiYgY29udGFpbmVyLnR5cGUucm9sZTtcbiAgICAgIHZhciBjb250YWluZXJQcm9wcyA9IGNvbnRhaW5lci5wcm9wcyB8fCB7fTtcbiAgICAgIHZhciBib3VuZEdldEV2ZW50cyA9IEV2ZW50cy5nZXRFdmVudHMuYmluZCh0aGlzKTtcbiAgICAgIHZhciBwYXJlbnRFdmVudHMgPSBzaGFyZWRFdmVudHMgJiYgYm91bmRHZXRFdmVudHMoe1xuICAgICAgICBzaGFyZWRFdmVudHM6IHNoYXJlZEV2ZW50c1xuICAgICAgfSwgXCJwYXJlbnRcIik7XG5cbiAgICAgIHZhciBwYXJlbnRQcm9wcyA9IF9kZWZhdWx0cyh7fSwgdGhpcy5nZXRFdmVudFN0YXRlKFwicGFyZW50XCIsIFwicGFyZW50XCIpLCBjb250YWluZXJQcm9wcywgYmFzZVByb3BzLnBhcmVudCwge1xuICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgY29udGFpbmVyRXZlbnRzID0gX2RlZmF1bHRzKHt9LCBFdmVudHMuZ2V0UGFydGlhbEV2ZW50cyhwYXJlbnRFdmVudHMsIFwicGFyZW50XCIsIHBhcmVudFByb3BzKSwgY29udGFpbmVyUHJvcHMuZXZlbnRzKTtcblxuICAgICAgdGhpcy5nbG9iYWxFdmVudHMgPSBFdmVudHMuZ2V0R2xvYmFsRXZlbnRzKGNvbnRhaW5lckV2ZW50cyk7XG4gICAgICB2YXIgbG9jYWxFdmVudHMgPSBFdmVudHMub21pdEdsb2JhbEV2ZW50cyhjb250YWluZXJFdmVudHMpO1xuICAgICAgcmV0dXJuIHJvbGUgPT09IFwiY29udGFpbmVyXCIgPyBSZWFjdC5jbG9uZUVsZW1lbnQoY29udGFpbmVyLCBfYXNzaWduKHt9LCBwYXJlbnRQcm9wcywge1xuICAgICAgICBldmVudHM6IGxvY2FsRXZlbnRzXG4gICAgICB9KSkgOiBSZWFjdC5jbG9uZUVsZW1lbnQoY29udGFpbmVyLCBsb2NhbEV2ZW50cywgY2hpbGRyZW4pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuZ2V0QWxsRXZlbnRzKHRoaXMucHJvcHMpO1xuXG4gICAgICBpZiAoZXZlbnRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbnRhaW5lcih0aGlzLnByb3BzLCB0aGlzLmJhc2VQcm9wcywgZXZlbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudCh0aGlzLnByb3BzLmNvbnRhaW5lciwge1xuICAgICAgICBjaGlsZHJlbjogdGhpcy5wcm9wcy5jaGlsZHJlblxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFZpY3RvcnlTaGFyZWRFdmVudHM7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5U2hhcmVkRXZlbnRzLCBcImRpc3BsYXlOYW1lXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFwiVmljdG9yeVNoYXJlZEV2ZW50c1wiXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5U2hhcmVkRXZlbnRzLCBcInJvbGVcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogXCJzaGFyZWQtZXZlbnQtd3JhcHBlclwiXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5U2hhcmVkRXZlbnRzLCBcInByb3BUeXBlc1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiB7XG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5ub2RlKSwgUHJvcFR5cGVzLm5vZGVdKSxcbiAgICBjb250YWluZXI6IFByb3BUeXBlcy5ub2RlLFxuICAgIGV2ZW50S2V5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXksIFByb3BUeXBlcy5mdW5jLCBDdXN0b21Qcm9wVHlwZXMuYWxsT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMuaW50ZWdlciwgQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlXSksIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgICBldmVudHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICBjaGlsZE5hbWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5hcnJheV0pLFxuICAgICAgZXZlbnRIYW5kbGVyczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIGV2ZW50S2V5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXksIFByb3BUeXBlcy5mdW5jLCBDdXN0b21Qcm9wVHlwZXMuYWxsT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMuaW50ZWdlciwgQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlXSksIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgICAgIHRhcmdldDogUHJvcFR5cGVzLnN0cmluZ1xuICAgIH0pKSxcbiAgICBleHRlcm5hbEV2ZW50TXV0YXRpb25zOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgY2FsbGJhY2s6IFByb3BUeXBlcy5mdW5jdGlvbixcbiAgICAgIGNoaWxkTmFtZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmFycmF5XSksXG4gICAgICBldmVudEtleTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5LCBDdXN0b21Qcm9wVHlwZXMuYWxsT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMuaW50ZWdlciwgQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlXSksIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgICAgIG11dGF0aW9uOiBQcm9wVHlwZXMuZnVuY3Rpb24sXG4gICAgICB0YXJnZXQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5hcnJheV0pXG4gICAgfSkpLFxuICAgIGdyb3VwQ29tcG9uZW50OiBQcm9wVHlwZXMubm9kZVxuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5U2hhcmVkRXZlbnRzLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiB7XG4gICAgZ3JvdXBDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIG51bGwpXG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlTaGFyZWRFdmVudHMsIFwiY29udGV4dFR5cGVcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogVGltZXJDb250ZXh0XG59KTtcbmV4cG9ydCB7IFZpY3RvcnlTaGFyZWRFdmVudHMgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZGVmYXVsdHMgZnJvbSBcImxvZGFzaC9kZWZhdWx0c1wiO1xuaW1wb3J0IF9hc3NpZ24gZnJvbSBcImxvZGFzaC9hc3NpZ25cIjtcblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IH1cblxuLy8gQmFzZWQgb24gbWVhc3VyaW5nIHNwZWNpZmljIGNoYXJhY3RlciB3aWR0aHNcbi8vIGFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBodHRwczovL2JsLm9ja3Mub3JnL3RvcGh0dWNrZXIvNjJmOTNhNDY1ODM4N2JiNjFlNDUxMGMzN2UyZTk3Y2Zcbi8vcHJldHRpZXItaWdub3JlXG52YXIgZm9udHMgPSB7XG4gIFwiQW1lcmljYW4gVHlwZXdyaXRlclwiOiB7XG4gICAgd2lkdGhzOiBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMC4yNSwgMC40MjAzMTI1LCAwLjMyOTY4NzUsIDAuNiwgMC42Mzc1LCAwLjgwMTU2MjUsIDAuODIwMzEyNSwgMC4xODc1LCAwLjQ1NjI1LCAwLjQ1NjI1LCAwLjYzNzUsIDAuNSwgMC4yNzM0Mzc1LCAwLjMwOTM3NSwgMC4yNzM0Mzc1LCAwLjQzOTA2MjUsIDAuNjM3NSwgMC42Mzc1LCAwLjYzNzUsIDAuNjM3NSwgMC42Mzc1LCAwLjYzNzUsIDAuNjM3NSwgMC42Mzc1LCAwLjYzNzUsIDAuNjM3NSwgMC4yNzM0Mzc1LCAwLjI3MzQzNzUsIDAuNSwgMC41LCAwLjUsIDAuNiwgMC42OTIxODc1LCAwLjc2NDA2MjUsIDAuNjkyMTg3NSwgMC42Mzc1LCAwLjcyODEyNSwgMC42NzM0Mzc1LCAwLjYyMDMxMjUsIDAuNzEwOTM3NSwgMC43ODQzNzUsIDAuMzgyODEyNSwgMC42NDIxODc1LCAwLjc4NTkzNzUsIDAuNjM3NSwgMC45NDg0Mzc1LCAwLjc2NDA2MjUsIDAuNjU2MjUsIDAuNjM3NSwgMC42NTYyNSwgMC43Mjk2ODc1LCAwLjYyMDMxMjUsIDAuNjM3NSwgMC43MTA5Mzc1LCAwLjc0MDYyNSwgMC45NDA2MjUsIDAuNzg0Mzc1LCAwLjc1NzgxMjUsIDAuNjIwMzEyNSwgMC40Mzc1LCAwLjUsIDAuNDM3NSwgMC41LCAwLjUsIDAuNDkyMTg3NSwgMC41NzM0Mzc1LCAwLjU4OTA2MjUsIDAuNTEwOTM3NSwgMC42LCAwLjUyODEyNSwgMC40MzEyNSwgMC41NTc4MTI1LCAwLjYzNzUsIDAuMzEwOTM3NSwgMC40MDYyNSwgMC42MjM0Mzc1LCAwLjMwOTM3NSwgMC45MjgxMjUsIDAuNjM3NSwgMC41NDY4NzUsIDAuNiwgMC41ODEyNSwgMC40OTIxODc1LCAwLjQ5MjE4NzUsIDAuNCwgMC42MjAzMTI1LCAwLjYyNSwgMC44MjUsIDAuNjM3NSwgMC42NDA2MjUsIDAuNTI4MTI1LCAwLjUsIDAuNSwgMC41LCAwLjY2NzE4NzVdLFxuICAgIGF2ZzogMC41NzkzNDIxMDUyNjMxNTc4XG4gIH0sXG4gIEFyaWFsOiB7XG4gICAgd2lkdGhzOiBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMC4yNzgxMjUsIDAuMjc4MTI1LCAwLjM1NjI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjg5MDYyNSwgMC42NjcxODc1LCAwLjE5MjE4NzUsIDAuMzM0Mzc1LCAwLjMzNDM3NSwgMC4zOTA2MjUsIDAuNTg0Mzc1LCAwLjI3ODEyNSwgMC4zMzQzNzUsIDAuMjc4MTI1LCAwLjI3ODEyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC4yNzgxMjUsIDAuMjc4MTI1LCAwLjU4NDM3NSwgMC41ODQzNzUsIDAuNTg0Mzc1LCAwLjU1NjI1LCAxLjAxNTYyNSwgMC42NzAzMTI1LCAwLjY2NzE4NzUsIDAuNzIzNDM3NSwgMC43MjM0Mzc1LCAwLjY2NzE4NzUsIDAuNjEwOTM3NSwgMC43NzgxMjUsIDAuNzIzNDM3NSwgMC4yNzgxMjUsIDAuNSwgMC42NjcxODc1LCAwLjU1NjI1LCAwLjgzNDM3NSwgMC43MjM0Mzc1LCAwLjc3ODEyNSwgMC42NjcxODc1LCAwLjc3ODEyNSwgMC43MjM0Mzc1LCAwLjY2NzE4NzUsIDAuNjEwOTM3NSwgMC43MjM0Mzc1LCAwLjY2NzE4NzUsIDAuOTQ1MzEyNSwgMC42NjcxODc1LCAwLjY2NzE4NzUsIDAuNjEwOTM3NSwgMC4yNzgxMjUsIDAuMjc4MTI1LCAwLjI3ODEyNSwgMC40NzAzMTI1LCAwLjU4NDM3NSwgMC4zMzQzNzUsIDAuNTU2MjUsIDAuNTU2MjUsIDAuNSwgMC41NTYyNSwgMC41NTYyNSwgMC4zMTI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjIyMzQzNzUsIDAuMjcwMzEyNSwgMC41LCAwLjIyMzQzNzUsIDAuODM0Mzc1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjM0Njg3NSwgMC41LCAwLjI3ODEyNSwgMC41NTYyNSwgMC41LCAwLjcyMzQzNzUsIDAuNSwgMC41LCAwLjUsIDAuMzM0Mzc1LCAwLjI2MDkzNzUsIDAuMzM0Mzc1LCAwLjU4NDM3NV0sXG4gICAgYXZnOiAwLjUyODczMzU1MjYzMTU3OVxuICB9LFxuICBcIkFyaWFsIEJsYWNrXCI6IHtcbiAgICB3aWR0aHM6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjMzMTI1LCAwLjMzNDM3NSwgMC41LCAwLjY2MDkzNzUsIDAuNjY3MTg3NSwgMSwgMC44OTA2MjUsIDAuMjc4MTI1LCAwLjM5MDYyNSwgMC4zOTA2MjUsIDAuNTU2MjUsIDAuNjYwOTM3NSwgMC4zMzQzNzUsIDAuMzM0Mzc1LCAwLjMzNDM3NSwgMC4yODEyNSwgMC42NjcxODc1LCAwLjY2NzE4NzUsIDAuNjY3MTg3NSwgMC42NjcxODc1LCAwLjY2NzE4NzUsIDAuNjY3MTg3NSwgMC42NjcxODc1LCAwLjY2NzE4NzUsIDAuNjY3MTg3NSwgMC42NjcxODc1LCAwLjMzNDM3NSwgMC4zMzQzNzUsIDAuNjYwOTM3NSwgMC42NjA5Mzc1LCAwLjY2MDkzNzUsIDAuNjEwOTM3NSwgMC43NDUzMTI1LCAwLjc4MTI1LCAwLjc3ODEyNSwgMC43NzgxMjUsIDAuNzc4MTI1LCAwLjcyMzQzNzUsIDAuNjY3MTg3NSwgMC44MzQzNzUsIDAuODM0Mzc1LCAwLjM5MDYyNSwgMC42NjcxODc1LCAwLjgzNDM3NSwgMC42NjcxODc1LCAwLjk0NTMxMjUsIDAuODM0Mzc1LCAwLjgzNDM3NSwgMC43MjM0Mzc1LCAwLjgzNDM3NSwgMC43ODEyNSwgMC43MjM0Mzc1LCAwLjcyMzQzNzUsIDAuODM0Mzc1LCAwLjc3OTY4NzUsIDEuMDAzMTI1LCAwLjc4MTI1LCAwLjc4MTI1LCAwLjcyMzQzNzUsIDAuMzkwNjI1LCAwLjI4MTI1LCAwLjM5MDYyNSwgMC42NjA5Mzc1LCAwLjUxMjUsIDAuMzM0Mzc1LCAwLjY2NzE4NzUsIDAuNjY3MTg3NSwgMC42NjcxODc1LCAwLjY2NzE4NzUsIDAuNjY3MTg3NSwgMC40MTg3NSwgMC42NjcxODc1LCAwLjY2NzE4NzUsIDAuMzM0Mzc1LCAwLjM4NDM3NSwgMC42NjcxODc1LCAwLjMzNDM3NSwgMSwgMC42NjcxODc1LCAwLjY2NzE4NzUsIDAuNjY3MTg3NSwgMC42NjcxODc1LCAwLjQ3MDMxMjUsIDAuNjEwOTM3NSwgMC40NDUzMTI1LCAwLjY2NzE4NzUsIDAuNjE0MDYyNSwgMC45NDY4NzUsIDAuNjY3MTg3NSwgMC42MTU2MjUsIDAuNTU2MjUsIDAuMzkwNjI1LCAwLjI3ODEyNSwgMC4zOTA2MjUsIDAuNjYwOTM3NV0sXG4gICAgYXZnOiAwLjYyMTMxNTc4OTQ3MzY4NDJcbiAgfSxcbiAgQmFza2VydmlsbGU6IHtcbiAgICB3aWR0aHM6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjI1LCAwLjI1LCAwLjQwNjI1LCAwLjY2NzE4NzUsIDAuNDkwNjI1LCAwLjg3NSwgMC43MDE1NjI1LCAwLjE3ODEyNSwgMC4yNDUzMTI1LCAwLjI0Njg3NSwgMC40MTcxODc1LCAwLjY2NzE4NzUsIDAuMjUsIDAuMzEyNSwgMC4yNSwgMC41MjE4NzUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC4yNSwgMC4yNSwgMC42NjcxODc1LCAwLjY2NzE4NzUsIDAuNjY3MTg3NSwgMC4zOTY4NzUsIDAuOTE3MTg3NSwgMC42ODQzNzUsIDAuNjE1NjI1LCAwLjcxODc1LCAwLjc2MDkzNzUsIDAuNjI1LCAwLjU1MzEyNSwgMC43NzE4NzUsIDAuODAzMTI1LCAwLjM1NDY4NzUsIDAuNTE1NjI1LCAwLjc4MTI1LCAwLjYwNDY4NzUsIDAuOTI4MTI1LCAwLjc1LCAwLjgyMzQzNzUsIDAuNTYyNSwgMC45Njg3NSwgMC43Mjk2ODc1LCAwLjU0MjE4NzUsIDAuNjk4NDM3NSwgMC43NzE4NzUsIDAuNzI5Njg3NSwgMC45NDg0Mzc1LCAwLjc3MTg3NSwgMC42NzgxMjUsIDAuNjM1OTM3NSwgMC4zNjQwNjI1LCAwLjUyMTg3NSwgMC4zNjQwNjI1LCAwLjQ2ODc1LCAwLjUxMjUsIDAuMzM0Mzc1LCAwLjQ2ODc1LCAwLjUyMTg3NSwgMC40MjgxMjUsIDAuNTIxODc1LCAwLjQzNzUsIDAuMzg5MDYyNSwgMC40NzY1NjI1LCAwLjUzMTI1LCAwLjI1LCAwLjM1OTM3NSwgMC40NjQwNjI1LCAwLjI0MDYyNSwgMC44MDMxMjUsIDAuNTMxMjUsIDAuNSwgMC41MjE4NzUsIDAuNTIxODc1LCAwLjM2NTYyNSwgMC4zMzQzNzUsIDAuMjkyMTg3NSwgMC41MjE4NzUsIDAuNDY0MDYyNSwgMC42NzgxMjUsIDAuNDc5Njg3NSwgMC40NjU2MjUsIDAuNDI4MTI1LCAwLjQ3OTY4NzUsIDAuNTEwOTM3NSwgMC40Nzk2ODc1LCAwLjY2NzE4NzVdLFxuICAgIGF2ZzogMC41MzIzNTE5NzM2ODQyMTA4XG4gIH0sXG4gIENvdXJpZXI6IHtcbiAgICB3aWR0aHM6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjU5ODQzNzUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwNzgxMjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYxODc1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYxNDA2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNV0sXG4gICAgYXZnOiAwLjYwMjA1NTkyMTA1MjYzMTZcbiAgfSxcbiAgXCJDb3VyaWVyIE5ld1wiOiB7XG4gICAgd2lkdGhzOiBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMC41OTg0Mzc1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjVdLFxuICAgIGF2ZzogMC42MDE1Mjk2MDUyNjMxNTc5XG4gIH0sXG4gIGN1cnNpdmU6IHtcbiAgICB3aWR0aHM6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjE5MjE4NzUsIDAuMjQzNzUsIDAuNDA2MjUsIDAuNTY3MTg3NSwgMC4zOTg0Mzc1LCAwLjcyMTg3NSwgMC45MDkzNzUsIDAuMjMyODEyNSwgMC40MzQzNzUsIDAuMzY1NjI1LCAwLjQ3MzQzNzUsIDAuNTU3ODEyNSwgMC4xOTM3NSwgMC4zNDg0Mzc1LCAwLjE5Mzc1LCAwLjc3MzQzNzUsIDAuNTAzMTI1LCAwLjQxNzE4NzUsIDAuNTQ1MzEyNSwgMC40NSwgMC42MDQ2ODc1LCAwLjQ3MDMxMjUsIDAuNTk4NDM3NSwgMC41NTYyNSwgMC41MDMxMjUsIDAuNTU0Njg3NSwgMC4yMDYyNSwgMC4yLCAwLjU2MjUsIDAuNTU0Njg3NSwgMC41NDY4NzUsIDAuNDAzMTI1LCAwLjcwNjI1LCAwLjczNDM3NSwgMC43MDc4MTI1LCAwLjY0Mzc1LCAwLjg1LCAwLjc1MzEyNSwgMC43NSwgMC42NDg0Mzc1LCAxLjA3NjU2MjUsIDAuNDQzNzUsIDAuNTM1OTM3NSwgMC44MzU5Mzc1LCAwLjY1MzEyNSwgMS4wMTA5Mzc1LCAxLjE1MTU2MjUsIDAuNjc5Njg3NSwgMC42OTg0Mzc1LCAxLjA2MjUsIDAuODIzNDM3NSwgMC41MTI1LCAwLjkyMzQzNzUsIDAuODU0Njg3NSwgMC43MDYyNSwgMC45MTA5Mzc1LCAwLjc0MjE4NzUsIDAuNzE1NjI1LCAwLjYwMTU2MjUsIDAuNDY0MDYyNSwgMC4zMzU5Mzc1LCAwLjQxMDkzNzUsIDAuNTQyMTg3NSwgMC41NDIxODc1LCAwLjQzMjgxMjUsIDAuNTEyNSwgMC41LCAwLjM4NTkzNzUsIDAuNzM3NSwgMC4zNTkzNzUsIDAuNzU2MjUsIDAuNTQwNjI1LCAwLjUzMjgxMjUsIDAuMzIwMzEyNSwgMC41Mjk2ODc1LCAwLjUwMTU2MjUsIDAuNDg0Mzc1LCAwLjc4OTA2MjUsIDAuNTY0MDYyNSwgMC40MjAzMTI1LCAwLjcwMzEyNSwgMC40NzE4NzUsIDAuNDczNDM3NSwgMC4zNSwgMC40MTI1LCAwLjU2NDA2MjUsIDAuNDcxODc1LCAwLjY0ODQzNzUsIDAuNTI5Njg3NSwgMC41NzUsIDAuNDE0MDYyNSwgMC40MTU2MjUsIDAuMjA2MjUsIDAuMzc5Njg3NSwgMC41NDIxODc1XSxcbiAgICBhdmc6IDAuNTYwNDQ0MDc4OTQ3MzY4NFxuICB9LFxuICBmYW50YXN5OiB7XG4gICAgd2lkdGhzOiBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMC4yMTU2MjUsIDAuMjYyNSwgMC4zMjY1NjI1LCAwLjYxMDkzNzUsIDAuNTM0Mzc1LCAwLjc2MjUsIDAuNzgyODEyNSwgMC4yLCAwLjQzNTkzNzUsIDAuNDM1OTM3NSwgMC4zNzY1NjI1LCAwLjUxMDkzNzUsIDAuMjc5Njg3NSwgMC40NjA5Mzc1LCAwLjI3OTY4NzUsIDAuNTI5Njg3NSwgMC42NjQwNjI1LCAwLjI1MzEyNSwgMC41MjE4NzUsIDAuNDc2NTYyNSwgMC42NjQwNjI1LCAwLjQ5MDYyNSwgMC41MjgxMjUsIDAuNTU0Njg3NSwgMC40OTY4NzUsIDAuNTQyMTg3NSwgMC4yNzk2ODc1LCAwLjI3OTY4NzUsIDAuNTYyNSwgMC40NjA5Mzc1LCAwLjU2MjUsIDAuNDgyODEyNSwgMC42MDkzNzUsIDAuNzQwNjI1LCAwLjcyMzQzNzUsIDAuNzQwNjI1LCAwLjgyNjU2MjUsIDAuNzIzNDM3NSwgMC42MTcxODc1LCAwLjczNTkzNzUsIDAuNzY1NjI1LCAwLjI0MDYyNSwgMC41NDUzMTI1LCAwLjcxNTYyNSwgMC42MDc4MTI1LCAwLjg2NDA2MjUsIDAuNjUzMTI1LCAwLjkxMjUsIDAuNjQ4NDM3NSwgMC45NDY4NzUsIDAuNjkyMTg3NSwgMC42NTMxMjUsIDAuNjk1MzEyNSwgMC44MDE1NjI1LCAwLjU4MTI1LCAwLjc4NDM3NSwgMC42NzE4NzUsIDAuNjI2NTYyNSwgMC42OTA2MjUsIDAuNDM1OTM3NSwgMC41Mjk2ODc1LCAwLjQzNTkzNzUsIDAuNTMxMjUsIDAuNSwgMC4yODc1LCAwLjUzNzUsIDAuNjAzMTI1LCAwLjQ5ODQzNzUsIDAuNjA2MjUsIDAuNTMxMjUsIDAuNDM0Mzc1LCAwLjY0MjE4NzUsIDAuNTY4NzUsIDAuMjA5Mzc1LCAwLjQ2NzE4NzUsIDAuNTQ4NDM3NSwgMC4yMjAzMTI1LCAwLjcwOTM3NSwgMC41NSwgMC41OTg0Mzc1LCAwLjYxNDA2MjUsIDAuNTc2NTYyNSwgMC40MDYyNSwgMC40NzM0Mzc1LCAwLjM3MzQzNzUsIDAuNTU5Mzc1LCAwLjQ0MjE4NzUsIDAuNjQyMTg3NSwgMC40ODkwNjI1LCAwLjU3ODEyNSwgMC40NDg0Mzc1LCAwLjI1NDY4NzUsIDAuMjIwMzEyNSwgMC4yNTQ2ODc1LCAwLjU1XSxcbiAgICBhdmc6IDAuNTM2NDk2NzEwNTI2MzE2XG4gIH0sXG4gIEdlbmV2YToge1xuICAgIHdpZHRoczogWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAuMzMyODEyNSwgMC4zMDQ2ODc1LCAwLjUsIDAuNjY3MTg3NSwgMC42NjcxODc1LCAwLjkwNjI1LCAwLjcyODEyNSwgMC4zMDQ2ODc1LCAwLjQ0Njg3NSwgMC40NDY4NzUsIDAuNTA3ODEyNSwgMC42NjcxODc1LCAwLjMwNDY4NzUsIDAuMzc5Njg3NSwgMC4zMDQ2ODc1LCAwLjUzOTA2MjUsIDAuNjY3MTg3NSwgMC42NjcxODc1LCAwLjY2NzE4NzUsIDAuNjY3MTg3NSwgMC42NjcxODc1LCAwLjY2NzE4NzUsIDAuNjY3MTg3NSwgMC42NjcxODc1LCAwLjY2NzE4NzUsIDAuNjY3MTg3NSwgMC4zMDQ2ODc1LCAwLjMwNDY4NzUsIDAuNjY3MTg3NSwgMC42NjcxODc1LCAwLjY2NzE4NzUsIDAuNTY4NzUsIDAuODcxODc1LCAwLjcyODEyNSwgMC42Mzc1LCAwLjY1MTU2MjUsIDAuNzAxNTYyNSwgMC41NzY1NjI1LCAwLjU1NDY4NzUsIDAuNjc1LCAwLjY5MDYyNSwgMC4yNDIxODc1LCAwLjQ5MjE4NzUsIDAuNjY0MDYyNSwgMC41ODQzNzUsIDAuNzg5MDYyNSwgMC43MDkzNzUsIDAuNzM1OTM3NSwgMC41ODQzNzUsIDAuNzgxMjUsIDAuNjA2MjUsIDAuNjA2MjUsIDAuNjQwNjI1LCAwLjY2NzE4NzUsIDAuNzI4MTI1LCAwLjk0Njg3NSwgMC42MTA5Mzc1LCAwLjYxMDkzNzUsIDAuNTc2NTYyNSwgMC40NDY4NzUsIDAuNTM5MDYyNSwgMC40NDY4NzUsIDAuNjY3MTg3NSwgMC42NjcxODc1LCAwLjU5MjE4NzUsIDAuNTU0Njg3NSwgMC42MTA5Mzc1LCAwLjU0Njg3NSwgMC42MDMxMjUsIDAuNTc2NTYyNSwgMC4zOTA2MjUsIDAuNjEwOTM3NSwgMC41ODQzNzUsIDAuMjM1OTM3NSwgMC4zMzQzNzUsIDAuNTM5MDYyNSwgMC4yMzU5Mzc1LCAwLjg5NTMxMjUsIDAuNTg0Mzc1LCAwLjYwNjI1LCAwLjYwMzEyNSwgMC42MDMxMjUsIDAuMzg3NSwgMC41MDkzNzUsIDAuNDQzNzUsIDAuNTg0Mzc1LCAwLjU2NTYyNSwgMC43ODEyNSwgMC41MzEyNSwgMC41NzE4NzUsIDAuNTU0Njg3NSwgMC40NTE1NjI1LCAwLjI0Njg3NSwgMC40NTE1NjI1LCAwLjY2NzE4NzVdLFxuICAgIGF2ZzogMC41NzYyNjY0NDczNjg0MjExXG4gIH0sXG4gIEdlb3JnaWE6IHtcbiAgICB3aWR0aHM6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjI0MjE4NzUsIDAuMzMxMjUsIDAuNDEyNSwgMC42NDM3NSwgMC42MTA5Mzc1LCAwLjgxODc1LCAwLjcxMDkzNzUsIDAuMjE1NjI1LCAwLjM3NSwgMC4zNzUsIDAuNDczNDM3NSwgMC42NDM3NSwgMC4yNzAzMTI1LCAwLjM3NSwgMC4yNzAzMTI1LCAwLjQ2ODc1LCAwLjYxNDA2MjUsIDAuNDI5Njg3NSwgMC41NTkzNzUsIDAuNTUzMTI1LCAwLjU2NTYyNSwgMC41Mjk2ODc1LCAwLjU2NzE4NzUsIDAuNTAzMTI1LCAwLjU5Njg3NSwgMC41NjcxODc1LCAwLjMxMjUsIDAuMzEyNSwgMC42NDM3NSwgMC42NDM3NSwgMC42NDM3NSwgMC40Nzk2ODc1LCAwLjkyOTY4NzUsIDAuNzE1NjI1LCAwLjY1NDY4NzUsIDAuNjQyMTg3NSwgMC43NSwgMC42NTQ2ODc1LCAwLjYsIDAuNzI2NTYyNSwgMC44MTU2MjUsIDAuMzkwNjI1LCAwLjUxODc1LCAwLjcyMDMxMjUsIDAuNjA0Njg3NSwgMC45MjgxMjUsIDAuNzY3MTg3NSwgMC43NDUzMTI1LCAwLjYxMDkzNzUsIDAuNzQ1MzEyNSwgMC43MjM0Mzc1LCAwLjU2MjUsIDAuNjE4NzUsIDAuNzU3ODEyNSwgMC43MDYyNSwgMC45OTM3NSwgMC43MTI1LCAwLjY2NDA2MjUsIDAuNjAxNTYyNSwgMC4zNzUsIDAuNDY4NzUsIDAuMzc1LCAwLjY0Mzc1LCAwLjY1LCAwLjUsIDAuNTA0Njg3NSwgMC41Njg3NSwgMC40NTQ2ODc1LCAwLjU3NSwgMC40ODQzNzUsIDAuMzkzNzUsIDAuNTA5Mzc1LCAwLjU4MjgxMjUsIDAuMjkzNzUsIDAuMzY3MTg3NSwgMC41NDY4NzUsIDAuMjg3NSwgMC44ODEyNSwgMC41OTIxODc1LCAwLjUzOTA2MjUsIDAuNTcxODc1LCAwLjU2NDA2MjUsIDAuNDEwOTM3NSwgMC40MzI4MTI1LCAwLjM0NTMxMjUsIDAuNTc2NTYyNSwgMC41MjAzMTI1LCAwLjc1NjI1LCAwLjUwNjI1LCAwLjUxNzE4NzUsIDAuNDQ1MzEyNSwgMC40MzEyNSwgMC4zNzUsIDAuNDMxMjUsIDAuNjQzNzVdLFxuICAgIGF2ZzogMC41NTUxODA5MjEwNTI2MzE2XG4gIH0sXG4gIFwiR2lsbCBTYW5zXCI6IHtcbiAgICB3aWR0aHM6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjI3NjU2MjUsIDAuMjcxODc1LCAwLjM1NDY4NzUsIDAuNTg0Mzc1LCAwLjU0MjE4NzUsIDAuNjc2NTYyNSwgMC42MjUsIDAuMTg5MDYyNSwgMC4zMjM0Mzc1LCAwLjMyMzQzNzUsIDAuNDE3MTg3NSwgMC41ODQzNzUsIDAuMjIwMzEyNSwgMC4zMjM0Mzc1LCAwLjIyMDMxMjUsIDAuMjgxMjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC4yMjAzMTI1LCAwLjIyOTY4NzUsIDAuNTg0Mzc1LCAwLjU4NDM3NSwgMC41ODQzNzUsIDAuMzM0Mzc1LCAxLjAxMDkzNzUsIDAuNjY3MTg3NSwgMC41NjQwNjI1LCAwLjcwOTM3NSwgMC43NSwgMC41LCAwLjQ3MDMxMjUsIDAuNzQwNjI1LCAwLjcyOTY4NzUsIDAuMjUsIDAuMzEyNSwgMC42NTYyNSwgMC40OTA2MjUsIDAuNzgxMjUsIDAuNzgxMjUsIDAuODIzNDM3NSwgMC41MTA5Mzc1LCAwLjgyMzQzNzUsIDAuNjA0Njg3NSwgMC40NTkzNzUsIDAuNjA0Njg3NSwgMC43MDkzNzUsIDAuNjA0Njg3NSwgMS4wNDIxODc1LCAwLjcwOTM3NSwgMC42MDQ2ODc1LCAwLjY0Njg3NSwgMC4zMzQzNzUsIDAuMjgxMjUsIDAuMzM0Mzc1LCAwLjQ3MDMxMjUsIDAuNTgyODEyNSwgMC4zMzQzNzUsIDAuNDI4MTI1LCAwLjUsIDAuNDM5MDYyNSwgMC41MTA5Mzc1LCAwLjQ3OTY4NzUsIDAuMjk2ODc1LCAwLjQyODEyNSwgMC41LCAwLjIyMDMxMjUsIDAuMjI2NTYyNSwgMC41LCAwLjIyMDMxMjUsIDAuNzcxODc1LCAwLjUsIDAuNTUzMTI1LCAwLjUsIDAuNSwgMC4zOTg0Mzc1LCAwLjM4NTkzNzUsIDAuMzM0Mzc1LCAwLjUsIDAuNDM5MDYyNSwgMC43MjAzMTI1LCAwLjUsIDAuNDM5MDYyNSwgMC40MTcxODc1LCAwLjMzNDM3NSwgMC4yNjA5Mzc1LCAwLjMzNDM3NSwgMC41ODQzNzVdLFxuICAgIGF2ZzogMC40OTMzNzE3MTA1MjYzMTU5XG4gIH0sXG4gIEhlbHZldGljYToge1xuICAgIHdpZHRoczogWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAuMjc5Njg3NSwgMC4yNzY1NjI1LCAwLjM1NDY4NzUsIDAuNTU0Njg3NSwgMC41NTQ2ODc1LCAwLjg4OTA2MjUsIDAuNjY1NjI1LCAwLjE5MDYyNSwgMC4zMzI4MTI1LCAwLjMzMjgxMjUsIDAuMzg5MDYyNSwgMC41ODI4MTI1LCAwLjI3NjU2MjUsIDAuMzMyODEyNSwgMC4yNzY1NjI1LCAwLjMwMTU2MjUsIDAuNTU0Njg3NSwgMC41NTQ2ODc1LCAwLjU1NDY4NzUsIDAuNTU0Njg3NSwgMC41NTQ2ODc1LCAwLjU1NDY4NzUsIDAuNTU0Njg3NSwgMC41NTQ2ODc1LCAwLjU1NDY4NzUsIDAuNTU0Njg3NSwgMC4yNzY1NjI1LCAwLjI3NjU2MjUsIDAuNTg0Mzc1LCAwLjU4MjgxMjUsIDAuNTg0Mzc1LCAwLjU1NDY4NzUsIDEuMDE0MDYyNSwgMC42NjU2MjUsIDAuNjY1NjI1LCAwLjcyMTg3NSwgMC43MjE4NzUsIDAuNjY1NjI1LCAwLjYwOTM3NSwgMC43NzY1NjI1LCAwLjcyMTg3NSwgMC4yNzY1NjI1LCAwLjUsIDAuNjY1NjI1LCAwLjU1NDY4NzUsIDAuODMyODEyNSwgMC43MjE4NzUsIDAuNzc2NTYyNSwgMC42NjU2MjUsIDAuNzc2NTYyNSwgMC43MjE4NzUsIDAuNjY1NjI1LCAwLjYwOTM3NSwgMC43MjE4NzUsIDAuNjY1NjI1LCAwLjk0Mzc1LCAwLjY2NTYyNSwgMC42NjU2MjUsIDAuNjA5Mzc1LCAwLjI3NjU2MjUsIDAuMzU0Njg3NSwgMC4yNzY1NjI1LCAwLjQ3NjU2MjUsIDAuNTU0Njg3NSwgMC4zMzI4MTI1LCAwLjU1NDY4NzUsIDAuNTU0Njg3NSwgMC41LCAwLjU1NDY4NzUsIDAuNTU0Njg3NSwgMC4yNzY1NjI1LCAwLjU1NDY4NzUsIDAuNTU0Njg3NSwgMC4yMjE4NzUsIDAuMjQwNjI1LCAwLjUsIDAuMjIxODc1LCAwLjgzMjgxMjUsIDAuNTU0Njg3NSwgMC41NTQ2ODc1LCAwLjU1NDY4NzUsIDAuNTU0Njg3NSwgMC4zMzI4MTI1LCAwLjUsIDAuMjc2NTYyNSwgMC41NTQ2ODc1LCAwLjUsIDAuNzIxODc1LCAwLjUsIDAuNSwgMC41LCAwLjM1NDY4NzUsIDAuMjU5Mzc1LCAwLjM1MzEyNSwgMC41ODkwNjI1XSxcbiAgICBhdmc6IDAuNTI3OTI3NjMxNTc4OTQ3MVxuICB9LFxuICBcIkhlbHZldGljYSBOZXVlXCI6IHtcbiAgICB3aWR0aHM6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjI3ODEyNSwgMC4yNTkzNzUsIDAuNDI2NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMSwgMC42NDUzMTI1LCAwLjI3ODEyNSwgMC4yNzAzMTI1LCAwLjI2ODc1LCAwLjM1MzEyNSwgMC42LCAwLjI3ODEyNSwgMC4zODkwNjI1LCAwLjI3ODEyNSwgMC4zNjg3NSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC41NTYyNSwgMC4yNzgxMjUsIDAuMjc4MTI1LCAwLjYsIDAuNiwgMC42LCAwLjU1NjI1LCAwLjgsIDAuNjYyNSwgMC42ODU5Mzc1LCAwLjcyMzQzNzUsIDAuNzA0Njg3NSwgMC42MTI1LCAwLjU3NSwgMC43NTkzNzUsIDAuNzIzNDM3NSwgMC4yNTkzNzUsIDAuNTIwMzEyNSwgMC42NzAzMTI1LCAwLjU1NjI1LCAwLjg3MTg3NSwgMC43MjM0Mzc1LCAwLjc2MDkzNzUsIDAuNjQ4NDM3NSwgMC43NjA5Mzc1LCAwLjY4NTkzNzUsIDAuNjQ4NDM3NSwgMC41NzUsIDAuNzIzNDM3NSwgMC42MTQwNjI1LCAwLjkyNjU2MjUsIDAuNjEyNSwgMC42NDg0Mzc1LCAwLjYxMjUsIDAuMjU5Mzc1LCAwLjM2ODc1LCAwLjI1OTM3NSwgMC42LCAwLjUsIDAuMjU2MjUsIDAuNTM3NSwgMC41OTM3NSwgMC41Mzc1LCAwLjU5Mzc1LCAwLjUzNzUsIDAuMjk4NDM3NSwgMC41NzUsIDAuNTU2MjUsIDAuMjIzNDM3NSwgMC4yMzc1LCAwLjUyMDMxMjUsIDAuMjIzNDM3NSwgMC44NTMxMjUsIDAuNTU2MjUsIDAuNTc1LCAwLjU5Mzc1LCAwLjU5Mzc1LCAwLjMzNDM3NSwgMC41LCAwLjMxNTYyNSwgMC41NTYyNSwgMC41LCAwLjc1OTM3NSwgMC41MTg3NSwgMC41LCAwLjQ4MTI1LCAwLjMzNDM3NSwgMC4yMjM0Mzc1LCAwLjMzNDM3NSwgMC42XSxcbiAgICBhdmc6IDAuNTI3OTQ0MDc4OTQ3MzY4NFxuICB9LFxuICBcIkhvZWZsZXIgVGV4dFwiOiB7XG4gICAgd2lkdGhzOiBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMC4yMzU5Mzc1LCAwLjIyMzQzNzUsIDAuMzkyMTg3NSwgMC43MTI1LCAwLjQ5Mzc1LCAwLjg4NTkzNzUsIDAuNzcxODc1LCAwLjIxMjUsIDAuMzA3ODEyNSwgMC4zMDkzNzUsIDAuMzc1LCAwLjQyMzQzNzUsIDAuMjM0Mzc1LCAwLjMxMjUsIDAuMjM0Mzc1LCAwLjMsIDAuNTgyODEyNSwgMC4zNjU2MjUsIDAuNDM0Mzc1LCAwLjM5MjE4NzUsIDAuNTIzNDM3NSwgMC4zOTg0Mzc1LCAwLjUxMjUsIDAuNDMyODEyNSwgMC40Njg3NSwgMC41MTI1LCAwLjIzNDM3NSwgMC4yMzQzNzUsIDAuNTE1NjI1LCAwLjQyMzQzNzUsIDAuNTE1NjI1LCAwLjM0MDYyNSwgMC43NjA5Mzc1LCAwLjczNTkzNzUsIDAuNjM1OTM3NSwgMC43MjE4NzUsIDAuODEyNSwgMC42Mzc1LCAwLjU4NzUsIDAuODA3ODEyNSwgMC44NTMxMjUsIDAuNDI5Njg3NSwgMC41MDMxMjUsIDAuNzgxMjUsIDAuNjA5Mzc1LCAwLjk2MDkzNzUsIDAuODUxNTYyNSwgMC44MTQwNjI1LCAwLjYxMjUsIDAuODE0MDYyNSwgMC43MTg3NSwgMC40OTM3NSwgMC43MTI1LCAwLjc2ODc1LCAwLjc3MTg3NSwgMS4xMjUsIDAuNzc2NTYyNSwgMC43NzM0Mzc1LCAwLjY1NjI1LCAwLjMyMTg3NSwgMC4zMDc4MTI1LCAwLjMyMTg3NSwgMC4zNTQ2ODc1LCAwLjUsIDAuMzM3NSwgMC40NDY4NzUsIDAuNTM1OTM3NSwgMC40NSwgMC41Mjk2ODc1LCAwLjQ1NDY4NzUsIDAuNDI1LCAwLjQ5MjE4NzUsIDAuNTQzNzUsIDAuMjY3MTg3NSwgMC4yNDA2MjUsIDAuNTM5MDYyNSwgMC4yNSwgMC44MTU2MjUsIDAuNTM3NSwgMC41MjM0Mzc1LCAwLjUzOTA2MjUsIDAuNTQyMTg3NSwgMC4zNjU2MjUsIDAuMzY4NzUsIDAuMzU2MjUsIDAuNTE3MTg3NSwgMC41MDE1NjI1LCAwLjc1LCAwLjUsIDAuNTA5Mzc1LCAwLjQ0Mzc1LCAwLjI0MjE4NzUsIDAuMTQzNzUsIDAuMjQyMTg3NSwgMC4zNV0sXG4gICAgYXZnOiAwLjUxMTY0NDczNjg0MjEwNTFcbiAgfSxcbiAgXCJNb250c2VycmF0XCI6IHtcbiAgICB3aWR0aHM6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjI2MjUsIDAuMjYwOTM3NSwgMC4zNzM0Mzc1LCAwLjY5Njg3NSwgMC42MTU2MjUsIDAuODI5Njg3NSwgMC42NzAzMTI1LCAwLjIwMzEyNSwgMC4zMjk2ODc1LCAwLjMyOTY4NzUsIDAuMzg3NSwgMC41NzUsIDAuMjEyNSwgMC4zODI4MTI1LCAwLjIxMjUsIDAuMzk1MzEyNSwgMC42NjI1LCAwLjM2MjUsIDAuNTY4NzUsIDAuNTY0MDYyNSwgMC42NjI1LCAwLjU2NzE4NzUsIDAuNjA5Mzc1LCAwLjU4OTA2MjUsIDAuNjM5MDYyNSwgMC42MDkzNzUsIDAuMjEyNSwgMC4yMTI1LCAwLjU3NSwgMC41NzUsIDAuNTc1LCAwLjU2NzE4NzUsIDEuMDM0Mzc1LCAwLjcxNzE4NzUsIDAuNzU0Njg3NSwgMC43MjAzMTI1LCAwLjgyNjU2MjUsIDAuNjcwMzEyNSwgMC42MzQzNzUsIDAuNzczNDM3NSwgMC44MTQwNjI1LCAwLjMwMzEyNSwgMC41MDc4MTI1LCAwLjcxMjUsIDAuNTg5MDYyNSwgMC45NTYyNSwgMC44MTQwNjI1LCAwLjgzOTA2MjUsIDAuNzE4NzUsIDAuODM5MDYyNSwgMC43MjM0Mzc1LCAwLjYxNTYyNSwgMC41NzUsIDAuNzkyMTg3NSwgMC42OTg0Mzc1LCAxLjExMjUsIDAuNjU2MjUsIDAuNjM1OTM3NSwgMC42NTE1NjI1LCAwLjMxODc1LCAwLjM5Njg3NSwgMC4zMTg3NSwgMC41NzY1NjI1LCAwLjUsIDAuNiwgMC41OTA2MjUsIDAuNjc4MTI1LCAwLjU2NDA2MjUsIDAuNjc4MTI1LCAwLjYwNDY4NzUsIDAuMzc1LCAwLjY4NzUsIDAuNjc4MTI1LCAwLjI3MDMxMjUsIDAuMzY1NjI1LCAwLjYwMTU2MjUsIDAuMjcwMzEyNSwgMS4wNjI1LCAwLjY3ODEyNSwgMC42MjgxMjUsIDAuNjc4MTI1LCAwLjY3ODEyNSwgMC40MDE1NjI1LCAwLjQ4OTA2MjUsIDAuNDA2MjUsIDAuNjczNDM3NSwgMC41NDIxODc1LCAwLjg3OTY4NzUsIDAuNTM0Mzc1LCAwLjU2NzE4NzUsIDAuNTEyNSwgMC4zMzQzNzUsIDAuMjk1MzEyNSwgMC4zMzQzNzUsIDAuNTc1XSxcbiAgICBhdmc6IDAuNTcxNzkyNzYzMTU3ODk1XG4gIH0sXG4gIG1vbm9zcGFjZToge1xuICAgIHdpZHRoczogWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAuNTk4NDM3NSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjA3ODEyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjE4NzUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjE0MDYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1LCAwLjYwMTU2MjUsIDAuNjAxNTYyNSwgMC42MDE1NjI1XSxcbiAgICBhdmc6IDAuNjAyMDU1OTIxMDUyNjMxNlxuICB9LFxuICBPdmVycGFzczoge1xuICAgIHdpZHRoczogWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAuMjI5Njg3NSwgMC4yNzY1NjI1LCAwLjQyMDMxMjUsIDAuNjgxMjUsIDAuNTg0Mzc1LCAwLjg1MTU2MjUsIDAuNzAxNTYyNSwgMC4yMjAzMTI1LCAwLjM0NTMxMjUsIDAuMzQ1MzEyNSwgMC41MzEyNSwgMC42MzEyNSwgMC4yMjM0Mzc1LCAwLjM5NTMxMjUsIDAuMjIzNDM3NSwgMC41MDkzNzUsIDAuNjUsIDAuNDA0Njg3NSwgMC42MTcxODc1LCAwLjYwNjI1LCAwLjY0ODQzNzUsIDAuNjA2MjUsIDAuNjAxNTYyNSwgMC41Mzc1LCAwLjYxNTYyNSwgMC42MDE1NjI1LCAwLjIyMzQzNzUsIDAuMjIzNDM3NSwgMC42MzEyNSwgMC42MzEyNSwgMC42MzEyNSwgMC41MDE1NjI1LCAwLjgyMDMxMjUsIDAuNjk2ODc1LCAwLjY2NzE4NzUsIDAuNjUsIDAuNjg1OTM3NSwgMC42MDE1NjI1LCAwLjU1OTM3NSwgMC42OTA2MjUsIDAuNzA3ODEyNSwgMC4yOTUzMTI1LCAwLjU2NTYyNSwgMC42NzgxMjUsIDAuNTgxMjUsIDAuODA0Njg3NSwgMC43MTA5Mzc1LCAwLjc0MDYyNSwgMC42NDIxODc1LCAwLjc0MDYyNSwgMC42NzY1NjI1LCAwLjYwNDY4NzUsIDAuNTkwNjI1LCAwLjY5Njg3NSwgMC42NjQwNjI1LCAwLjg1MzEyNSwgMC42NSwgMC42NjcxODc1LCAwLjY2MjUsIDAuMzczNDM3NSwgMC41MDkzNzUsIDAuMzczNDM3NSwgMC42MzEyNSwgMC41MTI1LCAwLjQsIDAuNTMyODEyNSwgMC41NjI1LCAwLjUxODc1LCAwLjU2MjUsIDAuNTQ2ODc1LCAwLjMzNTkzNzUsIDAuNTYyNSwgMC41NjU2MjUsIDAuMjU2MjUsIDAuMzIwMzEyNSwgMC41NSwgMC4yNjU2MjUsIDAuODUsIDAuNTY1NjI1LCAwLjU2NzE4NzUsIDAuNTYyNSwgMC41NjI1LCAwLjQwNDY4NzUsIDAuNDc2NTYyNSwgMC4zNzk2ODc1LCAwLjU2NTYyNSwgMC41MjE4NzUsIDAuNzI2NTYyNSwgMC41MzEyNSwgMC41MzkwNjI1LCAwLjUxMjUsIDAuMzY3MTg3NSwgMC4yNzUsIDAuMzY3MTg3NSwgMC42MzEyNV0sXG4gICAgYXZnOiAwLjU0MzA3NTY1Nzg5NDczNjlcbiAgfSxcbiAgUGFsYXRpbm86IHtcbiAgICB3aWR0aHM6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjI1LCAwLjI3ODEyNSwgMC4zNzE4NzUsIDAuNjA2MjUsIDAuNSwgMC44NDA2MjUsIDAuNzc4MTI1LCAwLjIwOTM3NSwgMC4zMzQzNzUsIDAuMzM0Mzc1LCAwLjM5MDYyNSwgMC42MDYyNSwgMC4yNTc4MTI1LCAwLjMzNDM3NSwgMC4yNSwgMC42MDYyNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjI1LCAwLjI1LCAwLjYwNjI1LCAwLjYwNjI1LCAwLjYwNjI1LCAwLjQ0NTMxMjUsIDAuNzQ4NDM3NSwgMC43NzgxMjUsIDAuNjEwOTM3NSwgMC43MDkzNzUsIDAuNzc1LCAwLjYxMDkzNzUsIDAuNTU2MjUsIDAuNzY0MDYyNSwgMC44MzI4MTI1LCAwLjMzNzUsIDAuMzQ2ODc1LCAwLjcyNjU2MjUsIDAuNjEwOTM3NSwgMC45NDY4NzUsIDAuODMxMjUsIDAuNzg3NSwgMC42MDQ2ODc1LCAwLjc4NzUsIDAuNjY4NzUsIDAuNTI1LCAwLjYxNDA2MjUsIDAuNzc4MTI1LCAwLjcyMzQzNzUsIDEsIDAuNjY3MTg3NSwgMC42NjcxODc1LCAwLjY2NzE4NzUsIDAuMzM0Mzc1LCAwLjYwNjI1LCAwLjMzNDM3NSwgMC42MDYyNSwgMC41LCAwLjMzNDM3NSwgMC41LCAwLjU2NTYyNSwgMC40NDUzMTI1LCAwLjYxMDkzNzUsIDAuNDc5Njg3NSwgMC4zNDA2MjUsIDAuNTU2MjUsIDAuNTgyODEyNSwgMC4yOTIxODc1LCAwLjI2NzE4NzUsIDAuNTY0MDYyNSwgMC4yOTIxODc1LCAwLjg4MjgxMjUsIDAuNTgyODEyNSwgMC41NDY4NzUsIDAuNjAxNTYyNSwgMC41NjA5Mzc1LCAwLjM5NTMxMjUsIDAuNDI1LCAwLjMyNjU2MjUsIDAuNjAzMTI1LCAwLjU2NTYyNSwgMC44MzQzNzUsIDAuNTE3MTg3NSwgMC41NTYyNSwgMC41LCAwLjMzNDM3NSwgMC42MDYyNSwgMC4zMzQzNzUsIDAuNjA2MjVdLFxuICAgIGF2ZzogMC41NDA4NTUyNjMxNTc4OTQ3XG4gIH0sXG4gIFwiUmVkSGF0VGV4dFwiOiB7XG4gICAgd2lkdGhzOiBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMC4yMzI4MTI1LCAwLjIyMDMxMjUsIDAuMzU2MjUsIDAuNjg5MDYyNSwgMC41NSwgMC43MzkwNjI1LCAwLjY3MDMxMjUsIDAuMjE0MDYyNSwgMC40MDE1NjI1LCAwLjQwMTU2MjUsIDAuNDU0Njg3NSwgMC41MzEyNSwgMC4yMjAzMTI1LCAwLjQ1NjI1LCAwLjIyMDMxMjUsIDAuNTE1NjI1LCAwLjY2MDkzNzUsIDAuMzA3ODEyNSwgMC41NDg0Mzc1LCAwLjU4NzUsIDAuNjE4NzUsIDAuNTcwMzEyNSwgMC42MjAzMTI1LCAwLjU1OTM3NSwgMC42MTQwNjI1LCAwLjYyMDMxMjUsIDAuMjIwMzEyNSwgMC4yMjM0Mzc1LCAwLjQ2NTYyNSwgMC41MzQzNzUsIDAuNDY1NjI1LCAwLjUxMjUsIDAuNzY3MTg3NSwgMC42NjA5Mzc1LCAwLjY3MDMxMjUsIDAuNzI2NTYyNSwgMC43MjgxMjUsIDAuNjIwMzEyNSwgMC42MTA5Mzc1LCAwLjgsIDAuNzMxMjUsIDAuMjUzMTI1LCAwLjYsIDAuNjEyNSwgMC42MDc4MTI1LCAwLjg2MjUsIDAuNzM5MDYyNSwgMC44MTA5Mzc1LCAwLjY1NDY4NzUsIDAuODA5Mzc1LCAwLjY0ODQzNzUsIDAuNjIzNDM3NSwgMC42MTcxODc1LCAwLjcxMjUsIDAuNjYwOTM3NSwgMC44OTg0Mzc1LCAwLjY1NDY4NzUsIDAuNjQ2ODc1LCAwLjYwNjI1LCAwLjM2MjUsIDAuNTIwMzEyNSwgMC4zNjI1LCAwLjU0MDYyNSwgMC40NjA5Mzc1LCAwLjUyMzQzNzUsIDAuNTI2NTYyNSwgMC41ODQzNzUsIDAuNTA5Mzc1LCAwLjU4MjgxMjUsIDAuNTU3ODEyNSwgMC4zNzAzMTI1LCAwLjU4MjgxMjUsIDAuNTUzMTI1LCAwLjIyMzQzNzUsIDAuMjQzNzUsIDAuNDg5MDYyNSwgMC4yMjM0Mzc1LCAwLjg0NTMxMjUsIDAuNTUzMTI1LCAwLjU4MTI1LCAwLjU4NDM3NSwgMC41ODI4MTI1LCAwLjM1MzEyNSwgMC40NTMxMjUsIDAuMzc4MTI1LCAwLjU1MzEyNSwgMC41MDE1NjI1LCAwLjY5ODQzNzUsIDAuNDg3NSwgMC40OTg0Mzc1LCAwLjQ1OTM3NSwgMC4zOTUzMTI1LCAwLjI5MjE4NzUsIDAuMzk1MzEyNSwgMC41ODEyNV0sXG4gICAgYXZnOiAwLjUzNDE5NDA3ODk0NzM2ODVcbiAgfSxcbiAgXCJzYW5zLXNlcmlmXCI6IHtcbiAgICB3aWR0aHM6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjI3ODEyNSwgMC4yNzgxMjUsIDAuMzU2MjUsIDAuNTU2MjUsIDAuNTU2MjUsIDAuODkwNjI1LCAwLjY2NzE4NzUsIDAuMTkyMTg3NSwgMC4zMzQzNzUsIDAuMzM0Mzc1LCAwLjM5MDYyNSwgMC41ODQzNzUsIDAuMjc4MTI1LCAwLjMzNDM3NSwgMC4yNzgxMjUsIDAuMzAzMTI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjI3ODEyNSwgMC4yNzgxMjUsIDAuNTg1OTM3NSwgMC41ODQzNzUsIDAuNTg1OTM3NSwgMC41NTYyNSwgMS4wMTU2MjUsIDAuNjY3MTg3NSwgMC42NjcxODc1LCAwLjcyMzQzNzUsIDAuNzIzNDM3NSwgMC42NjcxODc1LCAwLjYxMDkzNzUsIDAuNzc4MTI1LCAwLjcyMzQzNzUsIDAuMjc4MTI1LCAwLjUsIDAuNjY3MTg3NSwgMC41NTYyNSwgMC44MzQzNzUsIDAuNzIzNDM3NSwgMC43NzgxMjUsIDAuNjY3MTg3NSwgMC43NzgxMjUsIDAuNzIzNDM3NSwgMC42NjcxODc1LCAwLjYxMDkzNzUsIDAuNzIzNDM3NSwgMC42NjcxODc1LCAwLjk0NTMxMjUsIDAuNjY3MTg3NSwgMC42NjcxODc1LCAwLjYxMDkzNzUsIDAuMjc4MTI1LCAwLjM1NjI1LCAwLjI3ODEyNSwgMC40NzgxMjUsIDAuNTU2MjUsIDAuMzM0Mzc1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjUsIDAuNTU2MjUsIDAuNTU2MjUsIDAuMjc4MTI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjIyMzQzNzUsIDAuMjQyMTg3NSwgMC41LCAwLjIyMzQzNzUsIDAuODM0Mzc1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjU1NjI1LCAwLjMzNDM3NSwgMC41LCAwLjI3ODEyNSwgMC41NTYyNSwgMC41LCAwLjcyMzQzNzUsIDAuNSwgMC41LCAwLjUsIDAuMzU2MjUsIDAuMjYwOTM3NSwgMC4zNTQ2ODc1LCAwLjU5MDYyNV0sXG4gICAgYXZnOiAwLjUyOTMyNTY1Nzg5NDczNjhcbiAgfSxcbiAgU2VyYXZlazoge1xuICAgIHdpZHRoczogWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAuMjE1NjI1LCAwLjI5Njg3NSwgMC40MTcxODc1LCAwLjY3MzQzNzUsIDAuNDk1MzEyNSwgMC45MTI1LCAwLjc0MDYyNSwgMC4yNDIxODc1LCAwLjMzNzUsIDAuMzM3NSwgMC40MDkzNzUsIDAuNjA2MjUsIDAuMjYwOTM3NSwgMC4zNTYyNSwgMC4yNTYyNSwgMC40MTg3NSwgMC41OTIxODc1LCAwLjM1MTU2MjUsIDAuNDc1LCAwLjQ4NzUsIDAuNTM3NSwgMC41MDkzNzUsIDAuNTQ4NDM3NSwgMC40NTQ2ODc1LCAwLjU0MjE4NzUsIDAuNTQ4NDM3NSwgMC4yNTYyNSwgMC4yNTQ2ODc1LCAwLjU4NzUsIDAuNjE3MTg3NSwgMC41ODc1LCAwLjQ1NzgxMjUsIDAuODE0MDYyNSwgMC42NzY1NjI1LCAwLjU3MDMxMjUsIDAuNjEwOTM3NSwgMC42ODQzNzUsIDAuNTEwOTM3NSwgMC40OTUzMTI1LCAwLjY3ODEyNSwgMC42ODU5Mzc1LCAwLjI2MjUsIDAuMjYyNSwgMC41ODU5Mzc1LCAwLjQ3MzQzNzUsIDAuODQ2ODc1LCAwLjcwOTM3NSwgMC43NDA2MjUsIDAuNTA5Mzc1LCAwLjc0MDYyNSwgMC41ODQzNzUsIDAuNTAxNTYyNSwgMC41MjgxMjUsIDAuNjc1LCAwLjU5NTMxMjUsIDAuOTQ1MzEyNSwgMC41OTY4NzUsIDAuNTQwNjI1LCAwLjU0MDYyNSwgMC4zNTkzNzUsIDAuNDIwMzEyNSwgMC4zNTkzNzUsIDAuNTEwOTM3NSwgMC40MjE4NzUsIDAuNDA0Njg3NSwgMC41MDE1NjI1LCAwLjU0MjE4NzUsIDAuNDQ2ODc1LCAwLjU0NTMxMjUsIDAuNDg0Mzc1LCAwLjM4MTI1LCAwLjUxNDA2MjUsIDAuNTU0Njg3NSwgMC4yNDA2MjUsIDAuMjY0MDYyNSwgMC40OTA2MjUsIDAuMjc2NTYyNSwgMC44NjI1LCAwLjU1NDY4NzUsIDAuNTQ2ODc1LCAwLjU0NTMxMjUsIDAuNTQ1MzEyNSwgMC4zNjI1LCAwLjQxODc1LCAwLjM4OTA2MjUsIDAuNTQ1MzEyNSwgMC40NzAzMTI1LCAwLjc1NDY4NzUsIDAuNDkyMTg3NSwgMC40NjA5Mzc1LCAwLjQ1MzEyNSwgMC40MDE1NjI1LCAwLjI2NDA2MjUsIDAuNDAxNTYyNSwgMC41ODEyNV0sXG4gICAgYXZnOiAwLjUwNDQwNzg5NDczNjg0MjFcbiAgfSxcbiAgc2VyaWY6IHtcbiAgICB3aWR0aHM6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjI0ODQzNzUsIDAuMzM0Mzc1LCAwLjQwOTM3NSwgMC41LCAwLjUsIDAuODM0Mzc1LCAwLjc3ODEyNSwgMC4xODEyNSwgMC4zMzQzNzUsIDAuMzM0Mzc1LCAwLjUsIDAuNTY0MDYyNSwgMC4yNSwgMC4zMzQzNzUsIDAuMjUsIDAuMjc4MTI1LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuMjc4MTI1LCAwLjI3ODEyNSwgMC41NjQwNjI1LCAwLjU2NDA2MjUsIDAuNTY0MDYyNSwgMC40NDUzMTI1LCAwLjkyMTg3NSwgMC43MjM0Mzc1LCAwLjY2NzE4NzUsIDAuNjY3MTg3NSwgMC43MjM0Mzc1LCAwLjYxMDkzNzUsIDAuNTU2MjUsIDAuNzIzNDM3NSwgMC43MjM0Mzc1LCAwLjMzNDM3NSwgMC4zOTA2MjUsIDAuNzIzNDM3NSwgMC42MTA5Mzc1LCAwLjg5MDYyNSwgMC43MjM0Mzc1LCAwLjcyMzQzNzUsIDAuNTU2MjUsIDAuNzIzNDM3NSwgMC42NjcxODc1LCAwLjU1NjI1LCAwLjYxMDkzNzUsIDAuNzIzNDM3NSwgMC43MjM0Mzc1LCAwLjk0NTMxMjUsIDAuNzIzNDM3NSwgMC43MjM0Mzc1LCAwLjYxMDkzNzUsIDAuMzM0Mzc1LCAwLjM0MDYyNSwgMC4zMzQzNzUsIDAuNDcwMzEyNSwgMC41LCAwLjM0NTMxMjUsIDAuNDQ1MzEyNSwgMC41LCAwLjQ0NTMxMjUsIDAuNSwgMC40NDUzMTI1LCAwLjM4MjgxMjUsIDAuNSwgMC41LCAwLjI3ODEyNSwgMC4zMzU5Mzc1LCAwLjUsIDAuMjc4MTI1LCAwLjc3ODEyNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjMzNzUsIDAuMzkwNjI1LCAwLjI3OTY4NzUsIDAuNSwgMC41LCAwLjcyMzQzNzUsIDAuNSwgMC41LCAwLjQ0NTMxMjUsIDAuNDgxMjUsIDAuMjAxNTYyNSwgMC40ODEyNSwgMC41NDIxODc1XSxcbiAgICBhdmc6IDAuNTEyNjMxNTc4OTQ3MzY4NFxuICB9LFxuICBUYWhvbWE6IHtcbiAgICB3aWR0aHM6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjMxMDkzNzUsIDAuMzMyODEyNSwgMC40MDE1NjI1LCAwLjcyODEyNSwgMC41NDY4NzUsIDAuOTc2NTYyNSwgMC43MDYyNSwgMC4yMTA5Mzc1LCAwLjM4MjgxMjUsIDAuMzgyODEyNSwgMC41NDY4NzUsIDAuNzI4MTI1LCAwLjMwMzEyNSwgMC4zNjQwNjI1LCAwLjMwMzEyNSwgMC4zOTUzMTI1LCAwLjU0Njg3NSwgMC41NDY4NzUsIDAuNTQ2ODc1LCAwLjU0Njg3NSwgMC41NDY4NzUsIDAuNTQ2ODc1LCAwLjU0Njg3NSwgMC41NDY4NzUsIDAuNTQ2ODc1LCAwLjU0Njg3NSwgMC4zNTQ2ODc1LCAwLjM1NDY4NzUsIDAuNzI4MTI1LCAwLjcyODEyNSwgMC43MjgxMjUsIDAuNDc1LCAwLjkwOTM3NSwgMC42MTA5Mzc1LCAwLjU5MDYyNSwgMC42MDE1NjI1LCAwLjY3OTY4NzUsIDAuNTYyNSwgMC41MjE4NzUsIDAuNjY4NzUsIDAuNjc2NTYyNSwgMC4zNzM0Mzc1LCAwLjQxNzE4NzUsIDAuNjA0Njg3NSwgMC40OTg0Mzc1LCAwLjc3MTg3NSwgMC42Njg3NSwgMC43MDc4MTI1LCAwLjU1MTU2MjUsIDAuNzA3ODEyNSwgMC42Mzc1LCAwLjU1NzgxMjUsIDAuNTg3NSwgMC42NTYyNSwgMC42MDYyNSwgMC45MDMxMjUsIDAuNTgxMjUsIDAuNTg5MDYyNSwgMC41NTkzNzUsIDAuMzgyODEyNSwgMC4zOTM3NSwgMC4zODI4MTI1LCAwLjcyODEyNSwgMC41NjI1LCAwLjU0Njg3NSwgMC41MjUsIDAuNTUzMTI1LCAwLjQ2MjUsIDAuNTUzMTI1LCAwLjUyNjU2MjUsIDAuMzU0Njg3NSwgMC41NTMxMjUsIDAuNTU3ODEyNSwgMC4yMjk2ODc1LCAwLjMyODEyNSwgMC41MTg3NSwgMC4yMjk2ODc1LCAwLjg0MDYyNSwgMC41NTc4MTI1LCAwLjU0Mzc1LCAwLjU1MzEyNSwgMC41NTMxMjUsIDAuMzYwOTM3NSwgMC40NDY4NzUsIDAuMzM1OTM3NSwgMC41NTc4MTI1LCAwLjQ5ODQzNzUsIDAuNzQyMTg3NSwgMC40OTUzMTI1LCAwLjQ5ODQzNzUsIDAuNDQ1MzEyNSwgMC40ODEyNSwgMC4zODI4MTI1LCAwLjQ4MTI1LCAwLjcyODEyNV0sXG4gICAgYXZnOiAwLjUzODQzNzQ5OTk5OTk5OThcbiAgfSxcbiAgXCJUaW1lcyBOZXcgUm9tYW5cIjoge1xuICAgIHdpZHRoczogWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAuMjQ4NDM3NSwgMC4zMzQzNzUsIDAuNDA5Mzc1LCAwLjUsIDAuNSwgMC44MzQzNzUsIDAuNzc4MTI1LCAwLjE4MTI1LCAwLjMzNDM3NSwgMC4zMzQzNzUsIDAuNSwgMC41NjQwNjI1LCAwLjI1LCAwLjMzNDM3NSwgMC4yNSwgMC4yODEyNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjI3ODEyNSwgMC4yNzgxMjUsIDAuNTY0MDYyNSwgMC41NjQwNjI1LCAwLjU2NDA2MjUsIDAuNDQ1MzEyNSwgMC45MjE4NzUsIDAuNzIzNDM3NSwgMC42NjcxODc1LCAwLjY2NzE4NzUsIDAuNzIzNDM3NSwgMC42MTA5Mzc1LCAwLjU1NjI1LCAwLjcyMzQzNzUsIDAuNzIzNDM3NSwgMC4zMzQzNzUsIDAuMzkwNjI1LCAwLjczMTI1LCAwLjYxMDkzNzUsIDAuODkwNjI1LCAwLjczNzUsIDAuNzIzNDM3NSwgMC41NTYyNSwgMC43MjM0Mzc1LCAwLjY3NjU2MjUsIDAuNTU2MjUsIDAuNjEwOTM3NSwgMC43MjM0Mzc1LCAwLjcyMzQzNzUsIDAuOTQ1MzEyNSwgMC43MjM0Mzc1LCAwLjcyMzQzNzUsIDAuNjEwOTM3NSwgMC4zMzQzNzUsIDAuMjgxMjUsIDAuMzM0Mzc1LCAwLjQ3MDMxMjUsIDAuNTE4NzUsIDAuMzM0Mzc1LCAwLjQ0NTMxMjUsIDAuNTAzMTI1LCAwLjQ0NTMxMjUsIDAuNTAzMTI1LCAwLjQ0NTMxMjUsIDAuNDM1OTM3NSwgMC41LCAwLjUsIDAuMjc4MTI1LCAwLjM1NjI1LCAwLjUwNjI1LCAwLjI3ODEyNSwgMC43NzgxMjUsIDAuNSwgMC41LCAwLjUwNDY4NzUsIDAuNSwgMC4zNDA2MjUsIDAuMzkwNjI1LCAwLjI3OTY4NzUsIDAuNSwgMC41LCAwLjcyMzQzNzUsIDAuNSwgMC41LCAwLjQ0NTMxMjUsIDAuNDgxMjUsIDAuMjAxNTYyNSwgMC40ODEyNSwgMC41NDIxODc1XSxcbiAgICBhdmc6IDAuNTEzNDM3NVxuICB9LFxuICBcIlRyZWJ1Y2hldCBNU1wiOiB7XG4gICAgd2lkdGhzOiBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMC4zMDE1NjI1LCAwLjM2NzE4NzUsIDAuMzI1LCAwLjUzMTI1LCAwLjUyNSwgMC42MDE1NjI1LCAwLjcwNjI1LCAwLjE2MDkzNzUsIDAuMzY3MTg3NSwgMC4zNjcxODc1LCAwLjM2NzE4NzUsIDAuNTI1LCAwLjM2NzE4NzUsIDAuMzY3MTg3NSwgMC4zNjcxODc1LCAwLjUyNSwgMC41MjUsIDAuNTI1LCAwLjUyNSwgMC41MjUsIDAuNTI1LCAwLjUyNSwgMC41MjUsIDAuNTI1LCAwLjUyNSwgMC41MjUsIDAuMzY3MTg3NSwgMC4zNjcxODc1LCAwLjUyNSwgMC41MjUsIDAuNTI1LCAwLjM2NzE4NzUsIDAuNzcxODc1LCAwLjU5MDYyNSwgMC41NjcxODc1LCAwLjU5ODQzNzUsIDAuNjE0MDYyNSwgMC41MzU5Mzc1LCAwLjUyNSwgMC42NzY1NjI1LCAwLjY1NDY4NzUsIDAuMjc5Njg3NSwgMC40NzY1NjI1LCAwLjU3NjU2MjUsIDAuNTA3ODEyNSwgMC43MTA5Mzc1LCAwLjYzOTA2MjUsIDAuNjc1LCAwLjU1NzgxMjUsIDAuNzQyMTg3NSwgMC41ODI4MTI1LCAwLjQ4MTI1LCAwLjU4MTI1LCAwLjY0ODQzNzUsIDAuNTg3NSwgMC44NTMxMjUsIDAuNTU3ODEyNSwgMC41NzAzMTI1LCAwLjU1MTU2MjUsIDAuMzY3MTg3NSwgMC4zNTc4MTI1LCAwLjM2NzE4NzUsIDAuNTI1LCAwLjUzMTI1LCAwLjUyNSwgMC41MjY1NjI1LCAwLjU1NzgxMjUsIDAuNDk1MzEyNSwgMC41NTc4MTI1LCAwLjU0Njg3NSwgMC4zNzUsIDAuNTAzMTI1LCAwLjU0Njg3NSwgMC4yODU5Mzc1LCAwLjM2NzE4NzUsIDAuNTA0Njg3NSwgMC4yOTUzMTI1LCAwLjgzMTI1LCAwLjU0Njg3NSwgMC41Mzc1LCAwLjU1NzgxMjUsIDAuNTU3ODEyNSwgMC4zODkwNjI1LCAwLjQwNjI1LCAwLjM5Njg3NSwgMC41NDY4NzUsIDAuNDkwNjI1LCAwLjc0NTMxMjUsIDAuNTAxNTYyNSwgMC40OTM3NSwgMC40NzUsIDAuMzY3MTg3NSwgMC41MjUsIDAuMzY3MTg3NSwgMC41MjVdLFxuICAgIGF2ZzogMC41MDg1MTk3MzY4NDIxMDUyXG4gIH0sXG4gIFZlcmRhbmE6IHtcbiAgICB3aWR0aHM6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLjM1LCAwLjM5Mzc1LCAwLjQ1OTM3NSwgMC44MTg3NSwgMC42MzU5Mzc1LCAxLjA3NjU2MjUsIDAuNzU5Mzc1LCAwLjI2ODc1LCAwLjQ1NDY4NzUsIDAuNDU0Njg3NSwgMC42MzU5Mzc1LCAwLjgxODc1LCAwLjM2NDA2MjUsIDAuNDU0Njg3NSwgMC4zNjQwNjI1LCAwLjQ3MDMxMjUsIDAuNjM1OTM3NSwgMC42MzU5Mzc1LCAwLjYzNTkzNzUsIDAuNjM1OTM3NSwgMC42MzU5Mzc1LCAwLjYzNTkzNzUsIDAuNjM1OTM3NSwgMC42MzU5Mzc1LCAwLjYzNTkzNzUsIDAuNjM1OTM3NSwgMC40NTQ2ODc1LCAwLjQ1NDY4NzUsIDAuODE4NzUsIDAuODE4NzUsIDAuODE4NzUsIDAuNTQ2ODc1LCAxLCAwLjY4NDM3NSwgMC42ODU5Mzc1LCAwLjY5ODQzNzUsIDAuNzcxODc1LCAwLjYzMjgxMjUsIDAuNTc1LCAwLjc3NjU2MjUsIDAuNzUxNTYyNSwgMC40MjE4NzUsIDAuNDU0Njg3NSwgMC42OTM3NSwgMC41NTc4MTI1LCAwLjg0Mzc1LCAwLjc0ODQzNzUsIDAuNzg3NSwgMC42MDMxMjUsIDAuNzg3NSwgMC43LCAwLjY4NDM3NSwgMC42MTcxODc1LCAwLjczMjgxMjUsIDAuNjg0Mzc1LCAwLjk4OTA2MjUsIDAuNjg1OTM3NSwgMC42MTU2MjUsIDAuNjg1OTM3NSwgMC40NTQ2ODc1LCAwLjQ2ODc1LCAwLjQ1NDY4NzUsIDAuODE4NzUsIDAuNjQyMTg3NSwgMC42MzU5Mzc1LCAwLjYwMTU2MjUsIDAuNjIzNDM3NSwgMC41MjE4NzUsIDAuNjIzNDM3NSwgMC41OTY4NzUsIDAuMzg0Mzc1LCAwLjYyMzQzNzUsIDAuNjMyODEyNSwgMC4yNzUsIDAuMzc2NTYyNSwgMC41OTIxODc1LCAwLjI3NSwgMC45NzM0Mzc1LCAwLjYzMjgxMjUsIDAuNjA3ODEyNSwgMC42MjM0Mzc1LCAwLjYyMzQzNzUsIDAuNDMxMjUsIDAuNTIxODc1LCAwLjM5NTMxMjUsIDAuNjMyODEyNSwgMC41OTIxODc1LCAwLjgxODc1LCAwLjU5MjE4NzUsIDAuNTkyMTg3NSwgMC41MjY1NjI1LCAwLjYzNTkzNzUsIDAuNDU0Njg3NSwgMC42MzU5Mzc1LCAwLjgxODc1XSxcbiAgICBhdmc6IDAuNjE3MTg3NTAwMDAwMDAwM1xuICB9IC8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQ1NTL2xlbmd0aFxuICAvLyBBYnNvbHV0ZSBzaXplcyBpbiBwaXhlbHMgZm9yIG9ic29sZXRlIG1lYXN1cmVtZW50IHVuaXRzLlxuXG59O1xudmFyIGFic29sdXRlTWVhc3VyZW1lbnRVbml0c1RvUGl4ZWxzID0ge1xuICBtbTogMy44LFxuICBzbTogMzgsXG4gIHB0OiAxLjMzLFxuICBwYzogMTYsXG4gIGluOiA5NixcbiAgcHg6IDFcbn07XG52YXIgcmVsYXRpdmVNZWFzdXJlbWVudFVuaXRzQ29lZiA9IHtcbiAgZW06IDEsXG4gIGV4OiAwLjVcbn07XG52YXIgY29lZmZpY2llbnRzID0ge1xuICBoZWlnaHRPdmVybGFwQ29lZjogMS4wNSxcbiAgLy8gQ29lZmZpY2llbnQgZm9yIGhlaWdodCB2YWx1ZSB0byBwcmV2ZW50IG92ZXJsYXAuXG4gIGxpbmVDYXBpdGFsQ29lZjogMS4xNSAvLyBDb2VmZmljaWVudCBmb3IgaGVpZ2h0IHZhbHVlLiBSZXNlcnZlIHNwYWNlIGZvciBjYXBpdGFsIGNoYXJzLlxuXG59O1xudmFyIGRlZmF1bHRTdHlsZSA9IHtcbiAgbGluZUhlaWdodDogMSxcbiAgbGV0dGVyU3BhY2luZzogXCIwcHhcIixcbiAgZm9udFNpemU6IDAsXG4gIGFuZ2xlOiAwLFxuICBmb250RmFtaWx5OiBcIlwiXG59O1xuXG52YXIgX2RlZ3JlZVRvUmFkaWFuID0gZnVuY3Rpb24gKGFuZ2xlKSB7XG4gIHJldHVybiBhbmdsZSAqIE1hdGguUEkgLyAxODA7XG59O1xuXG52YXIgX2dldEZvbnREYXRhID0gZnVuY3Rpb24gKGZvbnRGYW1pbHkpIHtcbiAgdmFyIHBvc3NpYmxlRm9udHMgPSBmb250RmFtaWx5LnNwbGl0KFwiLFwiKS5tYXAoZnVuY3Rpb24gKGYpIHtcbiAgICByZXR1cm4gZi5yZXBsYWNlKC8nfFwiL2csIFwiXCIpO1xuICB9KTtcbiAgdmFyIGZvbnRNYXRjaCA9IHBvc3NpYmxlRm9udHMuZmluZChmdW5jdGlvbiAoZikge1xuICAgIHJldHVybiBmb250c1tmXTtcbiAgfSkgfHwgXCJIZWx2ZXRpY2FcIjtcbiAgcmV0dXJuIGZvbnRzW2ZvbnRNYXRjaF07XG59O1xuXG52YXIgX3NwbGl0VG9MaW5lcyA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRleHQpID8gdGV4dCA6IHRleHQudG9TdHJpbmcoKS5zcGxpdCgvXFxyXFxufFxccnxcXG4vZyk7XG59O1xuXG52YXIgX2dldFNpemVXaXRoUm90YXRlID0gZnVuY3Rpb24gKGF4aXNTaXplLCBkZXBlbmRlbnRTaXplLCBhbmdsZSkge1xuICB2YXIgYW5nbGVJblJhZGlhbiA9IF9kZWdyZWVUb1JhZGlhbihhbmdsZSk7XG5cbiAgcmV0dXJuIE1hdGguYWJzKE1hdGguY29zKGFuZ2xlSW5SYWRpYW4pICogYXhpc1NpemUpICsgTWF0aC5hYnMoTWF0aC5zaW4oYW5nbGVJblJhZGlhbikgKiBkZXBlbmRlbnRTaXplKTtcbn07XG4vKipcbiAqIENvbnZlcnQgbGVuZ3RoLXR5cGUgcGFyYW1ldGVycyBmcm9tIHNwZWNpZmljIG1lYXN1cmVtZW50IHVuaXRzIHRvIHBpeGVsc1xuICogQHBhcmFtICB7c3RyaW5nfSBsZW5ndGggQ3NzIGxlbmd0aCBzdHJpbmcgdmFsdWUuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IGZvbnRTaXplIEN1cnJlbnQgdGV4dCBmb250LXNpemUuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBBcHByb3hpbWF0ZSBDc3MgbGVuZ3RoIGluIHBpeGVscy5cbiAqL1xuXG5cbmV4cG9ydCB2YXIgY29udmVydExlbmd0aFRvUGl4ZWxzID0gZnVuY3Rpb24gKGxlbmd0aCwgZm9udFNpemUpIHtcbiAgdmFyIGF0dHJpYnV0ZSA9IGxlbmd0aC5tYXRjaCgvW2EtekEtWiVdKy8pICYmIGxlbmd0aC5tYXRjaCgvW2EtekEtWiVdKy8pWzBdO1xuICB2YXIgdmFsdWUgPSBsZW5ndGgubWF0Y2goL1swLTkuLF0rLyk7XG4gIHZhciByZXN1bHQ7XG5cbiAgaWYgKCFhdHRyaWJ1dGUpIHtcbiAgICByZXN1bHQgPSB2YWx1ZSB8fCAwO1xuICB9IGVsc2UgaWYgKGFic29sdXRlTWVhc3VyZW1lbnRVbml0c1RvUGl4ZWxzLmhhc093blByb3BlcnR5KGF0dHJpYnV0ZSkpIHtcbiAgICByZXN1bHQgPSB2YWx1ZSAqIGFic29sdXRlTWVhc3VyZW1lbnRVbml0c1RvUGl4ZWxzW2F0dHJpYnV0ZV07XG4gIH0gZWxzZSBpZiAocmVsYXRpdmVNZWFzdXJlbWVudFVuaXRzQ29lZi5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGUpKSB7XG4gICAgcmVzdWx0ID0gKGZvbnRTaXplID8gdmFsdWUgKiBmb250U2l6ZSA6IHZhbHVlICogZGVmYXVsdFN0eWxlLmZvbnRTaXplKSAqIHJlbGF0aXZlTWVhc3VyZW1lbnRVbml0c0NvZWZbYXR0cmlidXRlXTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG52YXIgX3ByZXBhcmVQYXJhbXMgPSBmdW5jdGlvbiAoaW5wdXRTdHlsZSwgaW5kZXgpIHtcbiAgdmFyIGxpbmVTdHlsZSA9IEFycmF5LmlzQXJyYXkoaW5wdXRTdHlsZSkgPyBpbnB1dFN0eWxlW2luZGV4XSA6IGlucHV0U3R5bGU7XG5cbiAgdmFyIHN0eWxlID0gX2RlZmF1bHRzKHt9LCBsaW5lU3R5bGUsIGRlZmF1bHRTdHlsZSk7XG5cbiAgcmV0dXJuIF9hc3NpZ24oe30sIHN0eWxlLCB7XG4gICAgZm9udEZhbWlseTogc3R5bGUuZm9udEZhbWlseSxcbiAgICBsZXR0ZXJTcGFjaW5nOiB0eXBlb2Ygc3R5bGUubGV0dGVyU3BhY2luZyA9PT0gXCJudW1iZXJcIiA/IHN0eWxlLmxldHRlclNwYWNpbmcgOiBjb252ZXJ0TGVuZ3RoVG9QaXhlbHMoU3RyaW5nKHN0eWxlLmxldHRlclNwYWNpbmcpLCBzdHlsZS5mb250U2l6ZSksXG4gICAgZm9udFNpemU6IHR5cGVvZiBzdHlsZS5mb250U2l6ZSA9PT0gXCJudW1iZXJcIiA/IHN0eWxlLmZvbnRTaXplIDogY29udmVydExlbmd0aFRvUGl4ZWxzKFN0cmluZyhzdHlsZS5mb250U2l6ZSkpXG4gIH0pO1xufTtcblxudmFyIF9hcHByb3hpbWF0ZVRleHRXaWR0aEludGVybmFsID0gZnVuY3Rpb24gKHRleHQsIHN0eWxlKSB7XG4gIGlmICh0ZXh0ID09PSB1bmRlZmluZWQgfHwgdGV4dCA9PT0gXCJcIiB8fCB0ZXh0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICB2YXIgd2lkdGhzID0gX3NwbGl0VG9MaW5lcyh0ZXh0KS5tYXAoZnVuY3Rpb24gKGxpbmUsIGluZGV4KSB7XG4gICAgdmFyIGxlbiA9IGxpbmUudG9TdHJpbmcoKS5sZW5ndGg7XG5cbiAgICB2YXIgX3ByZXBhcmVQYXJhbXMyID0gX3ByZXBhcmVQYXJhbXMoc3R5bGUsIGluZGV4KSxcbiAgICAgICAgZm9udFNpemUgPSBfcHJlcGFyZVBhcmFtczIuZm9udFNpemUsXG4gICAgICAgIGxldHRlclNwYWNpbmcgPSBfcHJlcGFyZVBhcmFtczIubGV0dGVyU3BhY2luZyxcbiAgICAgICAgZm9udEZhbWlseSA9IF9wcmVwYXJlUGFyYW1zMi5mb250RmFtaWx5O1xuXG4gICAgdmFyIGZvbnREYXRhID0gX2dldEZvbnREYXRhKGZvbnRGYW1pbHkpO1xuXG4gICAgdmFyIHdpZHRoID0gbGluZS50b1N0cmluZygpLnNwbGl0KFwiXCIpLm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgcmV0dXJuIGMuY2hhckNvZGVBdCgwKSA8IGZvbnREYXRhLndpZHRocy5sZW5ndGggPyBmb250RGF0YS53aWR0aHNbYy5jaGFyQ29kZUF0KDApXSA6IGZvbnREYXRhLmF2ZztcbiAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGN1ciwgYWNjKSB7XG4gICAgICByZXR1cm4gYWNjICsgY3VyO1xuICAgIH0sIDApICogZm9udFNpemU7XG4gICAgcmV0dXJuIHdpZHRoICsgbGV0dGVyU3BhY2luZyAqIE1hdGgubWF4KGxlbiAtIDEsIDApO1xuICB9KTtcblxuICByZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KHdpZHRocykpO1xufTtcblxudmFyIF9hcHByb3hpbWF0ZVRleHRIZWlnaHRJbnRlcm5hbCA9IGZ1bmN0aW9uICh0ZXh0LCBzdHlsZSkge1xuICBpZiAodGV4dCA9PT0gdW5kZWZpbmVkIHx8IHRleHQgPT09IFwiXCIgfHwgdGV4dCA9PT0gbnVsbCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIF9zcGxpdFRvTGluZXModGV4dCkucmVkdWNlKGZ1bmN0aW9uICh0b3RhbCwgbGluZSwgaW5kZXgpIHtcbiAgICB2YXIgbGluZVN0eWxlID0gX3ByZXBhcmVQYXJhbXMoc3R5bGUsIGluZGV4KTtcblxuICAgIHZhciBjb250YWluc0NhcHMgPSBsaW5lLnRvU3RyaW5nKCkubWF0Y2goL1soQS1aKSgwLTkpXS8pO1xuICAgIHZhciBoZWlnaHQgPSBjb250YWluc0NhcHMgPyBsaW5lU3R5bGUuZm9udFNpemUgKiBjb2VmZmljaWVudHMubGluZUNhcGl0YWxDb2VmIDogbGluZVN0eWxlLmZvbnRTaXplO1xuICAgIHJldHVybiB0b3RhbCArIGxpbmVTdHlsZS5saW5lSGVpZ2h0ICogaGVpZ2h0O1xuICB9LCAwKTtcbn07IC8vIFN0dWJiYWJsZSBpbXBsZW1lbnRhdGlvbi5cblxuXG5leHBvcnQgdmFyIF9hcHByb3hpbWF0ZVRleHRTaXplSW50ZXJuYWwgPSB7XG4gIGltcGw6IGZ1bmN0aW9uICh0ZXh0LCBzdHlsZSkge1xuICAgIHZhciBhbmdsZSA9IEFycmF5LmlzQXJyYXkoc3R5bGUpID8gc3R5bGVbMF0gJiYgc3R5bGVbMF0uYW5nbGUgOiBzdHlsZSAmJiBzdHlsZS5hbmdsZTtcblxuICAgIHZhciBoZWlnaHQgPSBfYXBwcm94aW1hdGVUZXh0SGVpZ2h0SW50ZXJuYWwodGV4dCwgc3R5bGUpO1xuXG4gICAgdmFyIHdpZHRoID0gX2FwcHJveGltYXRlVGV4dFdpZHRoSW50ZXJuYWwodGV4dCwgc3R5bGUpO1xuXG4gICAgdmFyIHdpZHRoV2l0aFJvdGF0ZSA9IGFuZ2xlID8gX2dldFNpemVXaXRoUm90YXRlKHdpZHRoLCBoZWlnaHQsIGFuZ2xlKSA6IHdpZHRoO1xuICAgIHZhciBoZWlnaHRXaXRoUm90YXRlID0gYW5nbGUgPyBfZ2V0U2l6ZVdpdGhSb3RhdGUoaGVpZ2h0LCB3aWR0aCwgYW5nbGUpIDogaGVpZ2h0O1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogd2lkdGhXaXRoUm90YXRlLFxuICAgICAgaGVpZ2h0OiBoZWlnaHRXaXRoUm90YXRlICogY29lZmZpY2llbnRzLmhlaWdodE92ZXJsYXBDb2VmXG4gICAgfTtcbiAgfVxufTtcbi8qKlxuICogUHJlZGljdCB0ZXh0IHNpemUgYnkgZm9udCBwYXJhbXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBDb250ZW50IGZvciB3aWR0aCBjYWxjdWxhdGlvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZSBUZXh0IHN0eWxlcywgLGZvbnRGYW1pbHksIGZvbnRTaXplLCBldGMuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3R5bGUuZm9udEZhbWlseSBUZXh0IGZvbnRGYW1pbHkuXG4gKiBAcGFyYW0geyhudW1iZXJ8c3RyaW5nKX0gc3R5bGUuZm9udFNpemUgVGV4dCBmb250U2l6ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzdHlsZS5hbmdsZSBUZXh0IHJvdGF0ZSBhbmdsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZS5sZXR0ZXJTcGFjaW5nIFRleHQgbGV0dGVyU3BhY2luZyhzcGFjZSBiZXR3ZWVuIGxldHRlcnMpLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0eWxlLmxpbmVIZWlnaHQgTGluZSBoZWlnaHQgY29lZmZpY2llbnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBBcHByb3hpbWF0ZSB0ZXh0IGxhYmVsIGhlaWdodC5cbiAqL1xuXG5leHBvcnQgdmFyIGFwcHJveGltYXRlVGV4dFNpemUgPSBmdW5jdGlvbiAodGV4dCwgc3R5bGUpIHtcbiAgcmV0dXJuIF9hcHByb3hpbWF0ZVRleHRTaXplSW50ZXJuYWwuaW1wbCh0ZXh0LCBzdHlsZSk7XG59OyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG52YXIgTGluZSA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvcHJvcC10eXBlc1xuICB2YXIgZGVzYyA9IHByb3BzLmRlc2MsXG4gICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJkZXNjXCJdKTtcblxuICByZXR1cm4gZGVzYyA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaW5lXCIsIF9leHRlbmRzKHtcbiAgICB2ZWN0b3JFZmZlY3Q6IFwibm9uLXNjYWxpbmctc3Ryb2tlXCJcbiAgfSwgcmVzdCksIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkZXNjXCIsIG51bGwsIGRlc2MpKSA6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaW5lXCIsIF9leHRlbmRzKHtcbiAgICB2ZWN0b3JFZmZlY3Q6IFwibm9uLXNjYWxpbmctc3Ryb2tlXCJcbiAgfSwgcmVzdCkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTGluZTsiLCJpbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHsgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTsgfSkpOyB9IG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCAqIGFzIEhlbHBlcnMgZnJvbSBcIi4uL3ZpY3RvcnktdXRpbC9oZWxwZXJzXCI7XG5pbXBvcnQgKiBhcyBDb21tb25Qcm9wcyBmcm9tIFwiLi4vdmljdG9yeS11dGlsL2NvbW1vbi1wcm9wc1wiO1xuaW1wb3J0IExpbmUgZnJvbSBcIi4vbGluZVwiO1xuXG52YXIgZXZhbHVhdGVQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAvKipcbiAgICogUG90ZW50aWFsIGV2YWx1YXRlZCBwcm9wcyBhcmU6XG4gICAqIGBhcmlhTGFiZWxgXG4gICAqIGBkZXNjYFxuICAgKiBgaWRgXG4gICAqIGBzdHlsZWBcbiAgICogYHRhYkluZGV4YFxuICAgKi9cbiAgdmFyIGFyaWFMYWJlbCA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmFyaWFMYWJlbCwgcHJvcHMpO1xuICB2YXIgZGVzYyA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmRlc2MsIHByb3BzKTtcbiAgdmFyIGlkID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuaWQsIHByb3BzKTtcbiAgdmFyIHN0eWxlID0gSGVscGVycy5ldmFsdWF0ZVN0eWxlKF9hc3NpZ24oe1xuICAgIHN0cm9rZTogXCJibGFja1wiXG4gIH0sIHByb3BzLnN0eWxlKSwgcHJvcHMpO1xuICB2YXIgdGFiSW5kZXggPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy50YWJJbmRleCwgcHJvcHMpO1xuICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBhcmlhTGFiZWw6IGFyaWFMYWJlbCxcbiAgICBkZXNjOiBkZXNjLFxuICAgIGlkOiBpZCxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgdGFiSW5kZXg6IHRhYkluZGV4XG4gIH0pO1xufTtcblxudmFyIExpbmVTZWdtZW50ID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHByb3BzID0gZXZhbHVhdGVQcm9wcyhwcm9wcyk7XG4gIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQocHJvcHMubGluZUNvbXBvbmVudCwgX29iamVjdFNwcmVhZCh7fSwgcHJvcHMuZXZlbnRzLCB7XG4gICAgXCJhcmlhLWxhYmVsXCI6IHByb3BzLmFyaWFMYWJlbCxcbiAgICBzdHlsZTogcHJvcHMuc3R5bGUsXG4gICAgZGVzYzogcHJvcHMuZGVzYyxcbiAgICB0YWJJbmRleDogcHJvcHMudGFiSW5kZXgsXG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgcm9sZTogcHJvcHMucm9sZSxcbiAgICBzaGFwZVJlbmRlcmluZzogcHJvcHMuc2hhcGVSZW5kZXJpbmcsXG4gICAgeDE6IHByb3BzLngxLFxuICAgIHgyOiBwcm9wcy54MixcbiAgICB5MTogcHJvcHMueTEsXG4gICAgeTI6IHByb3BzLnkyLFxuICAgIHRyYW5zZm9ybTogcHJvcHMudHJhbnNmb3JtLFxuICAgIGNsaXBQYXRoOiBwcm9wcy5jbGlwUGF0aFxuICB9KSk7XG59O1xuXG5MaW5lU2VnbWVudC5wcm9wVHlwZXMgPSBfb2JqZWN0U3ByZWFkKHt9LCBDb21tb25Qcm9wcy5wcmltaXRpdmVQcm9wcywge1xuICBkYXR1bTogUHJvcFR5cGVzLmFueSxcbiAgbGluZUNvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gIHgxOiBQcm9wVHlwZXMubnVtYmVyLFxuICB4MjogUHJvcFR5cGVzLm51bWJlcixcbiAgeTE6IFByb3BUeXBlcy5udW1iZXIsXG4gIHkyOiBQcm9wVHlwZXMubnVtYmVyXG59KTtcbkxpbmVTZWdtZW50LmRlZmF1bHRQcm9wcyA9IHtcbiAgbGluZUNvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChMaW5lLCBudWxsKSxcbiAgcm9sZTogXCJwcmVzZW50YXRpb25cIixcbiAgc2hhcGVSZW5kZXJpbmc6IFwiYXV0b1wiXG59O1xuZXhwb3J0IGRlZmF1bHQgTGluZVNlZ21lbnQ7IiwiaW1wb3J0IF9kZWZhdWx0cyBmcm9tIFwibG9kYXNoL2RlZmF1bHRzXCI7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0ICogYXMgTG9nIGZyb20gXCIuLi92aWN0b3J5LXV0aWwvbG9nXCI7XG5pbXBvcnQgKiBhcyBIZWxwZXJzIGZyb20gXCIuLi92aWN0b3J5LXV0aWwvaGVscGVyc1wiO1xuaW1wb3J0IFBvcnRhbENvbnRleHQgZnJvbSBcIi4vcG9ydGFsLWNvbnRleHRcIjtcblxudmFyIFZpY3RvcnlQb3J0YWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFZpY3RvcnlQb3J0YWwsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFZpY3RvcnlQb3J0YWwoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFZpY3RvcnlQb3J0YWwpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChWaWN0b3J5UG9ydGFsLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoVmljdG9yeVBvcnRhbCkpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFZpY3RvcnlQb3J0YWwsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgaWYgKCF0aGlzLmNoZWNrZWRDb250ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb250ZXh0LnBvcnRhbFVwZGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgdmFyIG1zZyA9IFwiYHJlbmRlckluUG9ydGFsYCBpcyBub3Qgc3VwcG9ydGVkIG91dHNpZGUgb2YgYFZpY3RvcnlDb250YWluZXJgLiBcIiArIFwiQ29tcG9uZW50IHdpbGwgYmUgcmVuZGVyZWQgaW4gcGxhY2VcIjtcbiAgICAgICAgICBMb2cud2Fybihtc2cpO1xuICAgICAgICAgIHRoaXMucmVuZGVySW5QbGFjZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoZWNrZWRDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgaWYgKCF0aGlzLnJlbmRlckluUGxhY2UpIHtcbiAgICAgICAgdGhpcy5wb3J0YWxLZXkgPSB0aGlzLnBvcnRhbEtleSB8fCB0aGlzLmNvbnRleHQucG9ydGFsUmVnaXN0ZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnBvcnRhbFVwZGF0ZSh0aGlzLnBvcnRhbEtleSwgdGhpcy5lbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICBpZiAodGhpcy5jb250ZXh0ICYmIHRoaXMuY29udGV4dC5wb3J0YWxEZXJlZ2lzdGVyKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5wb3J0YWxEZXJlZ2lzdGVyKHRoaXMucG9ydGFsS2V5KTtcbiAgICAgIH1cbiAgICB9IC8vIE92ZXJyaWRkZW4gaW4gdmljdG9yeS1jb3JlLW5hdGl2ZVxuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyUG9ydGFsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlclBvcnRhbChjaGlsZCkge1xuICAgICAgaWYgKHRoaXMucmVuZGVySW5QbGFjZSkge1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZWxlbWVudCA9IGNoaWxkO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBBcnJheS5pc0FycmF5KHRoaXMucHJvcHMuY2hpbGRyZW4pID8gdGhpcy5wcm9wcy5jaGlsZHJlblswXSA6IHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgZ3JvdXBDb21wb25lbnQgPSB0aGlzLnByb3BzLmdyb3VwQ29tcG9uZW50O1xuICAgICAgdmFyIGNoaWxkUHJvcHMgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5wcm9wcyB8fCB7fTtcbiAgICAgIHZhciBzdGFuZGFyZFByb3BzID0gY2hpbGRQcm9wcy5ncm91cENvbXBvbmVudCA/IHtcbiAgICAgICAgZ3JvdXBDb21wb25lbnQ6IGdyb3VwQ29tcG9uZW50LFxuICAgICAgICBzdGFuZGFsb25lOiBmYWxzZVxuICAgICAgfSA6IHt9O1xuXG4gICAgICB2YXIgbmV3UHJvcHMgPSBfZGVmYXVsdHMoc3RhbmRhcmRQcm9wcywgY2hpbGRQcm9wcywgSGVscGVycy5vbWl0KHRoaXMucHJvcHMsIFtcImNoaWxkcmVuXCIsIFwiZ3JvdXBDb21wb25lbnRcIl0pKTtcblxuICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW4gJiYgUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCBuZXdQcm9wcyk7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJQb3J0YWwoY2hpbGQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBWaWN0b3J5UG9ydGFsO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVBvcnRhbCwgXCJkaXNwbGF5TmFtZVwiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBcIlZpY3RvcnlQb3J0YWxcIlxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVBvcnRhbCwgXCJyb2xlXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFwicG9ydGFsXCJcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlQb3J0YWwsIFwicHJvcFR5cGVzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gICAgZ3JvdXBDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlQb3J0YWwsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHtcbiAgICBncm91cENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwgbnVsbClcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVBvcnRhbCwgXCJjb250ZXh0VHlwZVwiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBQb3J0YWxDb250ZXh0XG59KTtcbmV4cG9ydCB7IFZpY3RvcnlQb3J0YWwgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZGVmYXVsdHMgZnJvbSBcImxvZGFzaC9kZWZhdWx0c1wiO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG5pbXBvcnQgKiBhcyBIZWxwZXJzIGZyb20gXCIuL2hlbHBlcnNcIjtcblxuLy8gUHJpdmF0ZSBGdW5jdGlvbnNcbmZ1bmN0aW9uIGdldFZlcnRpY2FsQW5jaG9yKHByb3BzLCBkYXR1bSkge1xuICBkYXR1bSA9IGRhdHVtIHx8IHt9O1xuICB2YXIgc2lnbiA9IGRhdHVtLl95ID49IDAgPyAxIDogLTE7XG4gIHZhciBsYWJlbFN0eWxlID0gcHJvcHMuc3R5bGUgJiYgcHJvcHMuc3R5bGUubGFiZWxzIHx8IHt9O1xuXG4gIGlmIChkYXR1bS52ZXJ0aWNhbEFuY2hvciB8fCBsYWJlbFN0eWxlLnZlcnRpY2FsQW5jaG9yKSB7XG4gICAgcmV0dXJuIGRhdHVtLnZlcnRpY2FsQW5jaG9yIHx8IGxhYmVsU3R5bGUudmVydGljYWxBbmNob3I7XG4gIH0gZWxzZSBpZiAoIXByb3BzLmhvcml6b250YWwpIHtcbiAgICByZXR1cm4gc2lnbiA+PSAwID8gXCJlbmRcIiA6IFwic3RhcnRcIjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCJtaWRkbGVcIjtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUZXh0QW5jaG9yKHByb3BzLCBkYXR1bSkge1xuICBkYXR1bSA9IGRhdHVtIHx8IHt9O1xuICB2YXIgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgIGhvcml6b250YWwgPSBwcm9wcy5ob3Jpem9udGFsO1xuICB2YXIgc2lnbiA9IGRhdHVtLl95ID49IDAgPyAxIDogLTE7XG4gIHZhciBsYWJlbFN0eWxlID0gc3R5bGUgJiYgc3R5bGUubGFiZWxzIHx8IHt9O1xuXG4gIGlmIChkYXR1bS52ZXJ0aWNhbEFuY2hvciB8fCBsYWJlbFN0eWxlLnZlcnRpY2FsQW5jaG9yKSB7XG4gICAgcmV0dXJuIGRhdHVtLnZlcnRpY2FsQW5jaG9yIHx8IGxhYmVsU3R5bGUudmVydGljYWxBbmNob3I7XG4gIH0gZWxzZSBpZiAoIWhvcml6b250YWwpIHtcbiAgICByZXR1cm4gXCJtaWRkbGVcIjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc2lnbiA+PSAwID8gXCJzdGFydFwiIDogXCJlbmRcIjtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRBbmdsZShwcm9wcywgZGF0dW0pIHtcbiAgZGF0dW0gPSBkYXR1bSB8fCB7fTtcbiAgdmFyIGxhYmVsU3R5bGUgPSBwcm9wcy5zdHlsZSAmJiBwcm9wcy5zdHlsZS5sYWJlbHMgfHwge307XG4gIHJldHVybiBkYXR1bS5hbmdsZSA9PT0gdW5kZWZpbmVkID8gbGFiZWxTdHlsZS5hbmdsZSA6IGRhdHVtLmFuZ2xlO1xufVxuXG5mdW5jdGlvbiBnZXRQYWRkaW5nKHByb3BzLCBkYXR1bSkge1xuICBkYXR1bSA9IGRhdHVtIHx8IHt9O1xuICB2YXIgaG9yaXpvbnRhbCA9IHByb3BzLmhvcml6b250YWwsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlO1xuICB2YXIgbGFiZWxTdHlsZSA9IHN0eWxlLmxhYmVscyB8fCB7fTtcbiAgdmFyIGRlZmF1bHRQYWRkaW5nID0gSGVscGVycy5ldmFsdWF0ZVByb3AobGFiZWxTdHlsZS5wYWRkaW5nLCBwcm9wcykgfHwgMDtcbiAgdmFyIHNpZ24gPSBkYXR1bS5feSA8IDAgPyAtMSA6IDE7XG4gIHJldHVybiB7XG4gICAgeDogaG9yaXpvbnRhbCA/IHNpZ24gKiBkZWZhdWx0UGFkZGluZyA6IDAsXG4gICAgeTogaG9yaXpvbnRhbCA/IDAgOiAtMSAqIHNpZ24gKiBkZWZhdWx0UGFkZGluZ1xuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRPZmZzZXQocHJvcHMsIGRhdHVtKSB7XG4gIGlmIChwcm9wcy5wb2xhcikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHZhciBwYWRkaW5nID0gZ2V0UGFkZGluZyhwcm9wcywgZGF0dW0pO1xuICByZXR1cm4ge1xuICAgIGR4OiBwYWRkaW5nLngsXG4gICAgZHk6IHBhZGRpbmcueVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRQb3NpdGlvbihwcm9wcywgZGF0dW0pIHtcbiAgdmFyIHBvbGFyID0gcHJvcHMucG9sYXI7XG5cbiAgdmFyIF9IZWxwZXJzJHNjYWxlUG9pbnQgPSBIZWxwZXJzLnNjYWxlUG9pbnQocHJvcHMsIGRhdHVtKSxcbiAgICAgIHggPSBfSGVscGVycyRzY2FsZVBvaW50LngsXG4gICAgICB5ID0gX0hlbHBlcnMkc2NhbGVQb2ludC55O1xuXG4gIGlmICghcG9sYXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogeCxcbiAgICAgIHk6IHlcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBwb2xhclBhZGRpbmcgPSBnZXRQb2xhclBhZGRpbmcocHJvcHMsIGRhdHVtKTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogeCArIHBvbGFyUGFkZGluZy54LFxuICAgICAgeTogeSArIHBvbGFyUGFkZGluZy55XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQb2xhclBhZGRpbmcocHJvcHMsIGRhdHVtKSB7XG4gIHZhciBzdHlsZSA9IHByb3BzLnN0eWxlO1xuICB2YXIgZGVncmVlcyA9IGdldERlZ3JlZXMocHJvcHMsIGRhdHVtKTtcbiAgdmFyIGxhYmVsU3R5bGUgPSBzdHlsZS5sYWJlbHMgfHwge307XG4gIHZhciBwYWRkaW5nID0gSGVscGVycy5ldmFsdWF0ZVByb3AobGFiZWxTdHlsZS5wYWRkaW5nLCBwcm9wcykgfHwgMDtcbiAgdmFyIGFuZ2xlID0gSGVscGVycy5kZWdyZWVzVG9SYWRpYW5zKGRlZ3JlZXMpO1xuICByZXR1cm4ge1xuICAgIHg6IHBhZGRpbmcgKiBNYXRoLmNvcyhhbmdsZSksXG4gICAgeTogLXBhZGRpbmcgKiBNYXRoLnNpbihhbmdsZSlcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0TGFiZWxQbGFjZW1lbnQocHJvcHMpIHtcbiAgdmFyIGxhYmVsQ29tcG9uZW50ID0gcHJvcHMubGFiZWxDb21wb25lbnQsXG4gICAgICBsYWJlbFBsYWNlbWVudCA9IHByb3BzLmxhYmVsUGxhY2VtZW50LFxuICAgICAgcG9sYXIgPSBwcm9wcy5wb2xhcjtcbiAgdmFyIGRlZmF1bHRMYWJlbFBsYWNlbWVudCA9IHBvbGFyID8gXCJwZXJwZW5kaWN1bGFyXCIgOiBcInZlcnRpY2FsXCI7XG4gIHJldHVybiBsYWJlbFBsYWNlbWVudCA/IGxhYmVsUGxhY2VtZW50IDogbGFiZWxDb21wb25lbnQucHJvcHMgJiYgbGFiZWxDb21wb25lbnQucHJvcHMubGFiZWxQbGFjZW1lbnQgfHwgZGVmYXVsdExhYmVsUGxhY2VtZW50O1xufVxuXG5mdW5jdGlvbiBnZXRQb2xhck9yaWVudGF0aW9uKGRlZ3JlZXMpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgaWYgKGRlZ3JlZXMgPCA0NSB8fCBkZWdyZWVzID4gMzE1KSB7XG4gICAgcmV0dXJuIFwicmlnaHRcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgfSBlbHNlIGlmIChkZWdyZWVzID49IDQ1ICYmIGRlZ3JlZXMgPD0gMTM1KSB7XG4gICAgcmV0dXJuIFwidG9wXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gIH0gZWxzZSBpZiAoZGVncmVlcyA+IDEzNSAmJiBkZWdyZWVzIDwgMjI1KSB7XG4gICAgcmV0dXJuIFwibGVmdFwiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBcImJvdHRvbVwiO1xuICB9XG59IC8vIEV4cG9ydGVkIEZ1bmN0aW9uc1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0KHByb3BzLCBkYXR1bSwgaW5kZXgpIHtcbiAgZGF0dW0gPSBkYXR1bSB8fCB7fTtcblxuICBpZiAoZGF0dW0ubGFiZWwgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBkYXR1bS5sYWJlbDtcbiAgfVxuXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHByb3BzLmxhYmVscykgPyBwcm9wcy5sYWJlbHNbaW5kZXhdIDogcHJvcHMubGFiZWxzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBvbGFyVGV4dEFuY2hvcihwcm9wcywgZGVncmVlcykge1xuICB2YXIgbGFiZWxQbGFjZW1lbnQgPSBnZXRMYWJlbFBsYWNlbWVudChwcm9wcyk7XG5cbiAgaWYgKGxhYmVsUGxhY2VtZW50ID09PSBcInBlcnBlbmRpY3VsYXJcIiB8fCBsYWJlbFBsYWNlbWVudCA9PT0gXCJ2ZXJ0aWNhbFwiICYmIChkZWdyZWVzID09PSA5MCB8fCBkZWdyZWVzID09PSAyNzApKSB7XG4gICAgcmV0dXJuIFwibWlkZGxlXCI7XG4gIH1cblxuICByZXR1cm4gZGVncmVlcyA8PSA5MCB8fCBkZWdyZWVzID4gMjcwID8gXCJzdGFydFwiIDogXCJlbmRcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2xhclZlcnRpY2FsQW5jaG9yKHByb3BzLCBkZWdyZWVzKSB7XG4gIHZhciBsYWJlbFBsYWNlbWVudCA9IGdldExhYmVsUGxhY2VtZW50KHByb3BzKTtcbiAgdmFyIG9yaWVudGF0aW9uID0gZ2V0UG9sYXJPcmllbnRhdGlvbihkZWdyZWVzKTtcblxuICBpZiAobGFiZWxQbGFjZW1lbnQgPT09IFwicGFyYWxsZWxcIiB8fCBvcmllbnRhdGlvbiA9PT0gXCJsZWZ0XCIgfHwgb3JpZW50YXRpb24gPT09IFwicmlnaHRcIikge1xuICAgIHJldHVybiBcIm1pZGRsZVwiO1xuICB9XG5cbiAgcmV0dXJuIG9yaWVudGF0aW9uID09PSBcInRvcFwiID8gXCJlbmRcIiA6IFwic3RhcnRcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2xhckFuZ2xlKHByb3BzLCBiYXNlQW5nbGUpIHtcbiAgdmFyIGxhYmVsUGxhY2VtZW50ID0gcHJvcHMubGFiZWxQbGFjZW1lbnQsXG4gICAgICBkYXR1bSA9IHByb3BzLmRhdHVtO1xuXG4gIGlmICghbGFiZWxQbGFjZW1lbnQgfHwgbGFiZWxQbGFjZW1lbnQgPT09IFwidmVydGljYWxcIikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIGRlZ3JlZXMgPSBiYXNlQW5nbGUgIT09IHVuZGVmaW5lZCA/IGJhc2VBbmdsZSAlIDM2MCA6IGdldERlZ3JlZXMocHJvcHMsIGRhdHVtKTtcbiAgdmFyIHNpZ24gPSBkZWdyZWVzID4gOTAgJiYgZGVncmVlcyA8IDE4MCB8fCBkZWdyZWVzID4gMjcwID8gMSA6IC0xO1xuICB2YXIgYW5nbGUgPSAwO1xuXG4gIGlmIChkZWdyZWVzID09PSAwIHx8IGRlZ3JlZXMgPT09IDE4MCkge1xuICAgIGFuZ2xlID0gOTA7XG4gIH0gZWxzZSBpZiAoZGVncmVlcyA+IDAgJiYgZGVncmVlcyA8IDE4MCkge1xuICAgIGFuZ2xlID0gOTAgLSBkZWdyZWVzO1xuICB9IGVsc2UgaWYgKGRlZ3JlZXMgPiAxODAgJiYgZGVncmVlcyA8IDM2MCkge1xuICAgIGFuZ2xlID0gMjcwIC0gZGVncmVlcztcbiAgfVxuXG4gIHZhciBsYWJlbFJvdGF0aW9uID0gbGFiZWxQbGFjZW1lbnQgPT09IFwicGVycGVuZGljdWxhclwiID8gMCA6IDkwO1xuICByZXR1cm4gYW5nbGUgKyBzaWduICogbGFiZWxSb3RhdGlvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWdyZWVzKHByb3BzLCBkYXR1bSkge1xuICB2YXIgX0hlbHBlcnMkZ2V0UG9pbnQgPSBIZWxwZXJzLmdldFBvaW50KGRhdHVtKSxcbiAgICAgIHggPSBfSGVscGVycyRnZXRQb2ludC54O1xuXG4gIHJldHVybiBIZWxwZXJzLnJhZGlhbnNUb0RlZ3JlZXMocHJvcHMuc2NhbGUueCh4KSkgJSAzNjA7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcHMocHJvcHMsIGluZGV4KSB7XG4gIHZhciBzY2FsZSA9IHByb3BzLnNjYWxlLFxuICAgICAgZGF0YSA9IHByb3BzLmRhdGEsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgaG9yaXpvbnRhbCA9IHByb3BzLmhvcml6b250YWwsXG4gICAgICBwb2xhciA9IHByb3BzLnBvbGFyLFxuICAgICAgd2lkdGggPSBwcm9wcy53aWR0aCxcbiAgICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICAgIHRoZW1lID0gcHJvcHMudGhlbWUsXG4gICAgICBsYWJlbENvbXBvbmVudCA9IHByb3BzLmxhYmVsQ29tcG9uZW50LFxuICAgICAgZGlzYWJsZUlubGluZVN0eWxlcyA9IHByb3BzLmRpc2FibGVJbmxpbmVTdHlsZXM7XG4gIHZhciBkYXR1bSA9IGRhdGFbaW5kZXhdO1xuICB2YXIgZGVncmVlcyA9IGdldERlZ3JlZXMocHJvcHMsIGRhdHVtKTtcbiAgdmFyIHRleHRBbmNob3IgPSBwb2xhciA/IGdldFBvbGFyVGV4dEFuY2hvcihwcm9wcywgZGVncmVlcykgOiBnZXRUZXh0QW5jaG9yKHByb3BzLCBkYXR1bSk7XG4gIHZhciB2ZXJ0aWNhbEFuY2hvciA9IHBvbGFyID8gZ2V0UG9sYXJWZXJ0aWNhbEFuY2hvcihwcm9wcywgZGVncmVlcykgOiBnZXRWZXJ0aWNhbEFuY2hvcihwcm9wcywgZGF0dW0pO1xuICB2YXIgYW5nbGUgPSBnZXRBbmdsZShwcm9wcywgZGF0dW0pO1xuICB2YXIgdGV4dCA9IGdldFRleHQocHJvcHMsIGRhdHVtLCBpbmRleCk7XG4gIHZhciBsYWJlbFBsYWNlbWVudCA9IGdldExhYmVsUGxhY2VtZW50KHByb3BzKTtcblxuICB2YXIgX2dldFBvc2l0aW9uID0gZ2V0UG9zaXRpb24ocHJvcHMsIGRhdHVtKSxcbiAgICAgIHggPSBfZ2V0UG9zaXRpb24ueCxcbiAgICAgIHkgPSBfZ2V0UG9zaXRpb24ueTtcblxuICB2YXIgX2dldE9mZnNldCA9IGdldE9mZnNldChwcm9wcywgZGF0dW0pLFxuICAgICAgZHggPSBfZ2V0T2Zmc2V0LmR4LFxuICAgICAgZHkgPSBfZ2V0T2Zmc2V0LmR5O1xuXG4gIHZhciBsYWJlbFByb3BzID0ge1xuICAgIGFuZ2xlOiBhbmdsZSxcbiAgICBkYXRhOiBkYXRhLFxuICAgIGRhdHVtOiBkYXR1bSxcbiAgICBkaXNhYmxlSW5saW5lU3R5bGVzOiBkaXNhYmxlSW5saW5lU3R5bGVzLFxuICAgIGhvcml6b250YWw6IGhvcml6b250YWwsXG4gICAgaW5kZXg6IGluZGV4LFxuICAgIHBvbGFyOiBwb2xhcixcbiAgICBzY2FsZTogc2NhbGUsXG4gICAgbGFiZWxQbGFjZW1lbnQ6IGxhYmVsUGxhY2VtZW50LFxuICAgIHRleHQ6IHRleHQsXG4gICAgdGV4dEFuY2hvcjogdGV4dEFuY2hvcixcbiAgICB2ZXJ0aWNhbEFuY2hvcjogdmVydGljYWxBbmNob3IsXG4gICAgeDogeCxcbiAgICB5OiB5LFxuICAgIGR4OiBkeCxcbiAgICBkeTogZHksXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHN0eWxlOiBzdHlsZS5sYWJlbHNcbiAgfTtcblxuICBpZiAoIUhlbHBlcnMuaXNUb29sdGlwKGxhYmVsQ29tcG9uZW50KSkge1xuICAgIHJldHVybiBsYWJlbFByb3BzO1xuICB9XG5cbiAgdmFyIHRvb2x0aXBUaGVtZSA9IHRoZW1lICYmIHRoZW1lLnRvb2x0aXAgfHwge307XG4gIHJldHVybiBfZGVmYXVsdHMoe30sIGxhYmVsUHJvcHMsIEhlbHBlcnMub21pdCh0b29sdGlwVGhlbWUsIFtcInN0eWxlXCJdKSk7XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG52YXIgVFNwYW4gPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0c3BhblwiLCBwcm9wcyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUU3BhbjsiLCJmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcblxudmFyIFRleHQgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICB0aXRsZSA9IHByb3BzLnRpdGxlLFxuICAgICAgZGVzYyA9IHByb3BzLmRlc2MsXG4gICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcInRpdGxlXCIsIFwiZGVzY1wiXSk7XG5cbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0XCIsIHJlc3QsIHRpdGxlICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0aXRsZVwiLCBudWxsLCB0aXRsZSksIGRlc2MgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcImRlc2NcIiwgbnVsbCwgZGVzYyksIGNoaWxkcmVuKTtcbn07XG5cblRleHQucHJvcFR5cGVzID0ge1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gIGRlc2M6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuZXhwb3J0IGRlZmF1bHQgVGV4dDsiLCJpbXBvcnQgX2lzRW1wdHkgZnJvbSBcImxvZGFzaC9pc0VtcHR5XCI7XG5pbXBvcnQgX2RlZmF1bHRzIGZyb20gXCJsb2Rhc2gvZGVmYXVsdHNcIjtcbmltcG9ydCBfYXNzaWduIGZyb20gXCJsb2Rhc2gvYXNzaWduXCI7XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IH1cblxuLyplc2xpbnQgbm8tbWFnaWMtbnVtYmVyczogW1wiZXJyb3JcIiwgeyBcImlnbm9yZVwiOiBbLTAuNSwgMC41LCAwLCAxLCAyXSB9XSovXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgVmljdG9yeVBvcnRhbCBmcm9tIFwiLi4vdmljdG9yeS1wb3J0YWwvdmljdG9yeS1wb3J0YWxcIjtcbmltcG9ydCBSZWN0IGZyb20gXCIuLi92aWN0b3J5LXByaW1pdGl2ZXMvcmVjdFwiO1xuaW1wb3J0ICogYXMgQ3VzdG9tUHJvcFR5cGVzIGZyb20gXCIuLi92aWN0b3J5LXV0aWwvcHJvcC10eXBlc1wiO1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tIFwiLi4vdmljdG9yeS11dGlsL2hlbHBlcnNcIjtcbmltcG9ydCAqIGFzIExhYmVsSGVscGVycyBmcm9tIFwiLi4vdmljdG9yeS11dGlsL2xhYmVsLWhlbHBlcnNcIjtcbmltcG9ydCAqIGFzIFN0eWxlIGZyb20gXCIuLi92aWN0b3J5LXV0aWwvc3R5bGVcIjtcbmltcG9ydCAqIGFzIExvZyBmcm9tIFwiLi4vdmljdG9yeS11dGlsL2xvZ1wiO1xuaW1wb3J0ICogYXMgVGV4dFNpemUgZnJvbSBcIi4uL3ZpY3RvcnktdXRpbC90ZXh0c2l6ZVwiO1xuaW1wb3J0IFRTcGFuIGZyb20gXCIuLi92aWN0b3J5LXByaW1pdGl2ZXMvdHNwYW5cIjtcbmltcG9ydCBUZXh0IGZyb20gXCIuLi92aWN0b3J5LXByaW1pdGl2ZXMvdGV4dFwiO1xudmFyIGRlZmF1bHRTdHlsZXMgPSB7XG4gIGZpbGw6IFwiIzI1MjUyNVwiLFxuICBmb250U2l6ZTogMTQsXG4gIGZvbnRGYW1pbHk6IFwiJ0dpbGwgU2FucycsICdHaWxsIFNhbnMgTVQnLCAnU2Vywq1hdmVrJywgJ1RyZWJ1Y2hldCBNUycsIHNhbnMtc2VyaWZcIixcbiAgc3Ryb2tlOiBcInRyYW5zcGFyZW50XCJcbn07XG5cbnZhciBnZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIChwcm9wcywgZGltZW5zaW9uKSB7XG4gIGlmICghcHJvcHMuZGF0dW0pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciBzY2FsZWRQb2ludCA9IEhlbHBlcnMuc2NhbGVQb2ludChwcm9wcywgcHJvcHMuZGF0dW0pO1xuICByZXR1cm4gc2NhbGVkUG9pbnRbZGltZW5zaW9uXTtcbn07XG5cbnZhciBnZXRGb250U2l6ZSA9IGZ1bmN0aW9uIChzdHlsZSkge1xuICB2YXIgYmFzZVNpemUgPSBzdHlsZSAmJiBzdHlsZS5mb250U2l6ZTtcblxuICBpZiAodHlwZW9mIGJhc2VTaXplID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIGJhc2VTaXplO1xuICB9IGVsc2UgaWYgKGJhc2VTaXplID09PSB1bmRlZmluZWQgfHwgYmFzZVNpemUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZGVmYXVsdFN0eWxlcy5mb250U2l6ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgYmFzZVNpemUgPT09IFwic3RyaW5nXCIpIHtcbiAgICB2YXIgZm9udFNpemUgPSArYmFzZVNpemUucmVwbGFjZShcInB4XCIsIFwiXCIpO1xuXG4gICAgaWYgKCFpc05hTihmb250U2l6ZSkpIHtcbiAgICAgIHJldHVybiBmb250U2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgTG9nLndhcm4oXCJmb250U2l6ZSBzaG91bGQgYmUgZXhwcmVzc2VkIGFzIGEgbnVtYmVyIG9mIHBpeGVsc1wiKTtcbiAgICAgIHJldHVybiBkZWZhdWx0U3R5bGVzLmZvbnRTaXplO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkZWZhdWx0U3R5bGVzLmZvbnRTaXplO1xufTtcblxudmFyIGdldFNpbmdsZVZhbHVlID0gZnVuY3Rpb24gKHByb3ApIHtcbiAgdmFyIGluZGV4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShwcm9wKSA/IHByb3BbaW5kZXhdIHx8IHByb3BbMF0gOiBwcm9wO1xufTtcblxudmFyIHNob3VsZFVzZU11bHRpbGluZUJhY2tncm91bmRzID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciBiYWNrZ3JvdW5kU3R5bGUgPSBwcm9wcy5iYWNrZ3JvdW5kU3R5bGUsXG4gICAgICBiYWNrZ3JvdW5kUGFkZGluZyA9IHByb3BzLmJhY2tncm91bmRQYWRkaW5nO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShiYWNrZ3JvdW5kU3R5bGUpICYmICFfaXNFbXB0eShiYWNrZ3JvdW5kU3R5bGUpIHx8IEFycmF5LmlzQXJyYXkoYmFja2dyb3VuZFBhZGRpbmcpICYmICFfaXNFbXB0eShiYWNrZ3JvdW5kUGFkZGluZyk7XG59O1xuXG52YXIgZ2V0U3R5bGVzID0gZnVuY3Rpb24gKHN0eWxlLCBwcm9wcykge1xuICBpZiAocHJvcHMuZGlzYWJsZUlubGluZVN0eWxlcykge1xuICAgIHZhciBiYXNlU3R5bGVzID0gSGVscGVycy5ldmFsdWF0ZVN0eWxlKHN0eWxlLCBwcm9wcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIEZvbnQgc2l6ZSBpcyBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlIHRoZSB5IHBvc2l0aW9uIG9mIHRoZSBsYWJlbFxuICAgICAgZm9udFNpemU6IGdldEZvbnRTaXplKGJhc2VTdHlsZXMpXG4gICAgfTtcbiAgfVxuXG4gIHZhciBnZXRTaW5nbGVTdHlsZSA9IGZ1bmN0aW9uIChzKSB7XG4gICAgcyA9IHMgPyBfZGVmYXVsdHMoe30sIHMsIGRlZmF1bHRTdHlsZXMpIDogZGVmYXVsdFN0eWxlcztcbiAgICB2YXIgYmFzZVN0eWxlcyA9IEhlbHBlcnMuZXZhbHVhdGVTdHlsZShzLCBwcm9wcyk7XG4gICAgcmV0dXJuIF9hc3NpZ24oe30sIGJhc2VTdHlsZXMsIHtcbiAgICAgIGZvbnRTaXplOiBnZXRGb250U2l6ZShiYXNlU3R5bGVzKVxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHN0eWxlKSAmJiAhX2lzRW1wdHkoc3R5bGUpID8gc3R5bGUubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIGdldFNpbmdsZVN0eWxlKHMpO1xuICB9KSA6IGdldFNpbmdsZVN0eWxlKHN0eWxlKTtcbn07XG5cbnZhciBnZXRCYWNrZ3JvdW5kU3R5bGVzID0gZnVuY3Rpb24gKHN0eWxlLCBwcm9wcykge1xuICBpZiAoIXN0eWxlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHN0eWxlKSAmJiAhX2lzRW1wdHkoc3R5bGUpID8gc3R5bGUubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIEhlbHBlcnMuZXZhbHVhdGVTdHlsZShzLCBwcm9wcyk7XG4gIH0pIDogSGVscGVycy5ldmFsdWF0ZVN0eWxlKHN0eWxlLCBwcm9wcyk7XG59O1xuXG52YXIgZ2V0QmFja2dyb3VuZFBhZGRpbmcgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgaWYgKHByb3BzLmJhY2tncm91bmRQYWRkaW5nICYmIEFycmF5LmlzQXJyYXkocHJvcHMuYmFja2dyb3VuZFBhZGRpbmcpKSB7XG4gICAgcmV0dXJuIHByb3BzLmJhY2tncm91bmRQYWRkaW5nLm1hcChmdW5jdGlvbiAoYmFja2dyb3VuZFBhZGRpbmcpIHtcbiAgICAgIHZhciBwYWRkaW5nID0gSGVscGVycy5ldmFsdWF0ZVByb3AoYmFja2dyb3VuZFBhZGRpbmcsIHByb3BzKTtcbiAgICAgIHJldHVybiBIZWxwZXJzLmdldFBhZGRpbmcoe1xuICAgICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcGFkZGluZyA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmJhY2tncm91bmRQYWRkaW5nLCBwcm9wcyk7XG4gICAgcmV0dXJuIEhlbHBlcnMuZ2V0UGFkZGluZyh7XG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSk7XG4gIH1cbn07XG5cbnZhciBnZXRMaW5lSGVpZ2h0ID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciBsaW5lSGVpZ2h0ID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMubGluZUhlaWdodCwgcHJvcHMpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGxpbmVIZWlnaHQpKSB7XG4gICAgcmV0dXJuIF9pc0VtcHR5KGxpbmVIZWlnaHQpID8gWzFdIDogbGluZUhlaWdodDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGluZUhlaWdodDtcbiAgfVxufTtcblxudmFyIGdldENvbnRlbnQgPSBmdW5jdGlvbiAodGV4dCwgcHJvcHMpIHtcbiAgaWYgKHRleHQgPT09IHVuZGVmaW5lZCB8fCB0ZXh0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHRleHQpKSB7XG4gICAgcmV0dXJuIHRleHQubWFwKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICByZXR1cm4gSGVscGVycy5ldmFsdWF0ZVByb3AobGluZSwgcHJvcHMpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gSGVscGVycy5ldmFsdWF0ZVByb3AodGV4dCwgcHJvcHMpO1xuXG4gIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkIHx8IGNoaWxkID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBBcnJheS5pc0FycmF5KGNoaWxkKSA/IGNoaWxkIDogXCJcIi5jb25jYXQoY2hpbGQpLnNwbGl0KFwiXFxuXCIpO1xufTtcblxudmFyIGdldER5ID0gZnVuY3Rpb24gKHByb3BzLCB2ZXJ0aWNhbEFuY2hvciwgbGluZUhlaWdodCkge1xuICB2YXIgZHkgPSBwcm9wcy5keSA/IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmR5LCBwcm9wcykgOiAwO1xuICB2YXIgbGVuZ3RoID0gcHJvcHMuaW5saW5lID8gMSA6IHByb3BzLnRleHQubGVuZ3RoO1xuICB2YXIgY2FwSGVpZ2h0ID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuY2FwSGVpZ2h0LCBwcm9wcyk7XG4gIHZhciBhbmNob3IgPSB2ZXJ0aWNhbEFuY2hvciA/IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHZlcnRpY2FsQW5jaG9yLCBwcm9wcykgOiBcIm1pZGRsZVwiO1xuXG4gIHZhciBmb250U2l6ZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkoQXJyYXkobGVuZ3RoKS5rZXlzKCkpLm1hcChmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBnZXRTaW5nbGVWYWx1ZShwcm9wcy5zdHlsZSwgaSkuZm9udFNpemU7XG4gIH0pO1xuXG4gIHZhciBsaW5lSGVpZ2h0cyA9IF90b0NvbnN1bWFibGVBcnJheShBcnJheShsZW5ndGgpLmtleXMoKSkubWFwKGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGdldFNpbmdsZVZhbHVlKGxpbmVIZWlnaHQsIGkpO1xuICB9KTtcblxuICBpZiAoYW5jaG9yID09PSBcInN0YXJ0XCIpIHtcbiAgICByZXR1cm4gZHkgKyAoY2FwSGVpZ2h0IC8gMiArIGxpbmVIZWlnaHRzWzBdIC8gMikgKiBmb250U2l6ZXNbMF07XG4gIH0gZWxzZSBpZiAocHJvcHMuaW5saW5lKSB7XG4gICAgcmV0dXJuIGFuY2hvciA9PT0gXCJlbmRcIiA/IGR5ICsgKGNhcEhlaWdodCAvIDIgLSBsaW5lSGVpZ2h0c1swXSAvIDIpICogZm9udFNpemVzWzBdIDogZHkgKyBjYXBIZWlnaHQgLyAyICogZm9udFNpemVzWzBdO1xuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBhbmNob3IgPT09IFwiZW5kXCIgPyBkeSArIChjYXBIZWlnaHQgLyAyICsgKDAuNSAtIGxlbmd0aCkgKiBsaW5lSGVpZ2h0c1swXSkgKiBmb250U2l6ZXNbMF0gOiBkeSArIChjYXBIZWlnaHQgLyAyICsgKDAuNSAtIGxlbmd0aCAvIDIpICogbGluZUhlaWdodHNbMF0pICogZm9udFNpemVzWzBdO1xuICB9IGVsc2Uge1xuICAgIHZhciBhbGxIZWlnaHRzID0gX3RvQ29uc3VtYWJsZUFycmF5KEFycmF5KGxlbmd0aCkua2V5cygpKS5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIGkpIHtcbiAgICAgIHJldHVybiBtZW1vICsgKGNhcEhlaWdodCAvIDIgKyAoMC41IC0gbGVuZ3RoKSAqIGxpbmVIZWlnaHRzW2ldKSAqIGZvbnRTaXplc1tpXSAvIGxlbmd0aDtcbiAgICB9LCAwKTtcblxuICAgIHJldHVybiBhbmNob3IgPT09IFwiZW5kXCIgPyBkeSArIGFsbEhlaWdodHMgOiBkeSArIGFsbEhlaWdodHMgLyAyICsgY2FwSGVpZ2h0IC8gMiAqIGxpbmVIZWlnaHRzW2xlbmd0aCAtIDFdICogZm9udFNpemVzW2xlbmd0aCAtIDFdO1xuICB9XG59O1xuXG52YXIgZ2V0VHJhbnNmb3JtID0gZnVuY3Rpb24gKHByb3BzLCB4LCB5KSB7XG4gIHZhciBwb2xhciA9IHByb3BzLnBvbGFyO1xuICB2YXIgc3R5bGUgPSBnZXRTaW5nbGVWYWx1ZShwcm9wcy5zdHlsZSk7XG4gIHZhciBkZWZhdWx0QW5nbGUgPSBwb2xhciA/IExhYmVsSGVscGVycy5nZXRQb2xhckFuZ2xlKHByb3BzKSA6IDA7XG4gIHZhciBiYXNlQW5nbGUgPSBzdHlsZS5hbmdsZSA9PT0gdW5kZWZpbmVkID8gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuYW5nbGUsIHByb3BzKSA6IHN0eWxlLmFuZ2xlO1xuICB2YXIgYW5nbGUgPSBiYXNlQW5nbGUgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRBbmdsZSA6IGJhc2VBbmdsZTtcbiAgdmFyIHRyYW5zZm9ybSA9IHByb3BzLnRyYW5zZm9ybSB8fCBzdHlsZS50cmFuc2Zvcm07XG4gIHZhciB0cmFuc2Zvcm1QYXJ0ID0gdHJhbnNmb3JtICYmIEhlbHBlcnMuZXZhbHVhdGVQcm9wKHRyYW5zZm9ybSwgcHJvcHMpO1xuICB2YXIgcm90YXRlUGFydCA9IGFuZ2xlICYmIHtcbiAgICByb3RhdGU6IFthbmdsZSwgeCwgeV1cbiAgfTtcbiAgcmV0dXJuIHRyYW5zZm9ybVBhcnQgfHwgYW5nbGUgPyBTdHlsZS50b1RyYW5zZm9ybVN0cmluZyh0cmFuc2Zvcm1QYXJ0LCByb3RhdGVQYXJ0KSA6IHVuZGVmaW5lZDtcbn07XG5cbnZhciBnZXRYQ29vcmRpbmF0ZSA9IGZ1bmN0aW9uIChjYWxjdWxhdGVkUHJvcHMsIGxhYmVsU2l6ZVdpZHRoKSB7XG4gIHZhciBkaXJlY3Rpb24gPSBjYWxjdWxhdGVkUHJvcHMuZGlyZWN0aW9uLFxuICAgICAgdGV4dEFuY2hvciA9IGNhbGN1bGF0ZWRQcm9wcy50ZXh0QW5jaG9yLFxuICAgICAgeCA9IGNhbGN1bGF0ZWRQcm9wcy54LFxuICAgICAgZHggPSBjYWxjdWxhdGVkUHJvcHMuZHg7XG5cbiAgaWYgKGRpcmVjdGlvbiA9PT0gXCJydGxcIikge1xuICAgIHJldHVybiB4IC0gbGFiZWxTaXplV2lkdGg7XG4gIH1cblxuICBzd2l0Y2ggKHRleHRBbmNob3IpIHtcbiAgICBjYXNlIFwibWlkZGxlXCI6XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZCh4IC0gbGFiZWxTaXplV2lkdGggLyAyKTtcblxuICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHggLSBsYWJlbFNpemVXaWR0aCk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gc3RhcnRcbiAgICAgIHJldHVybiB4ICsgKGR4IHx8IDApO1xuICB9XG59O1xuXG52YXIgZ2V0WUNvb3JkaW5hdGUgPSBmdW5jdGlvbiAoY2FsY3VsYXRlZFByb3BzLCB0ZXh0SGVpZ2h0KSB7XG4gIHZhciB2ZXJ0aWNhbEFuY2hvciA9IGNhbGN1bGF0ZWRQcm9wcy52ZXJ0aWNhbEFuY2hvcixcbiAgICAgIHkgPSBjYWxjdWxhdGVkUHJvcHMueSxcbiAgICAgIF9jYWxjdWxhdGVkUHJvcHMkb3JpZyA9IGNhbGN1bGF0ZWRQcm9wcy5vcmlnaW5hbER5LFxuICAgICAgb3JpZ2luYWxEeSA9IF9jYWxjdWxhdGVkUHJvcHMkb3JpZyA9PT0gdm9pZCAwID8gMCA6IF9jYWxjdWxhdGVkUHJvcHMkb3JpZztcbiAgdmFyIG9mZnNldCA9IHkgKyBvcmlnaW5hbER5O1xuXG4gIHN3aXRjaCAodmVydGljYWxBbmNob3IpIHtcbiAgICBjYXNlIFwic3RhcnRcIjpcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKG9mZnNldCk7XG5cbiAgICBjYXNlIFwiZW5kXCI6XG4gICAgICByZXR1cm4gTWF0aC5jZWlsKG9mZnNldCAtIHRleHRIZWlnaHQpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIG1pZGRsZVxuICAgICAgcmV0dXJuIE1hdGguZmxvb3Iob2Zmc2V0IC0gdGV4dEhlaWdodCAvIDIpO1xuICB9XG59O1xuXG52YXIgZ2V0RnVsbEJhY2tncm91bmQgPSBmdW5jdGlvbiAoY2FsY3VsYXRlZFByb3BzLCB0c3BhblZhbHVlcykge1xuICB2YXIgX2NhbGN1bGF0ZWRQcm9wcyRkeCA9IGNhbGN1bGF0ZWRQcm9wcy5keCxcbiAgICAgIGR4ID0gX2NhbGN1bGF0ZWRQcm9wcyRkeCA9PT0gdm9pZCAwID8gMCA6IF9jYWxjdWxhdGVkUHJvcHMkZHgsXG4gICAgICB0cmFuc2Zvcm0gPSBjYWxjdWxhdGVkUHJvcHMudHJhbnNmb3JtLFxuICAgICAgYmFja2dyb3VuZENvbXBvbmVudCA9IGNhbGN1bGF0ZWRQcm9wcy5iYWNrZ3JvdW5kQ29tcG9uZW50LFxuICAgICAgYmFja2dyb3VuZFN0eWxlID0gY2FsY3VsYXRlZFByb3BzLmJhY2tncm91bmRTdHlsZSxcbiAgICAgIGlubGluZSA9IGNhbGN1bGF0ZWRQcm9wcy5pbmxpbmUsXG4gICAgICBiYWNrZ3JvdW5kUGFkZGluZyA9IGNhbGN1bGF0ZWRQcm9wcy5iYWNrZ3JvdW5kUGFkZGluZyxcbiAgICAgIGNhcEhlaWdodCA9IGNhbGN1bGF0ZWRQcm9wcy5jYXBIZWlnaHQ7XG4gIHZhciB0ZXh0U2l6ZXMgPSB0c3BhblZhbHVlcy5tYXAoZnVuY3Rpb24gKHRzcGFuKSB7XG4gICAgcmV0dXJuIHRzcGFuLnRleHRTaXplO1xuICB9KTtcbiAgdmFyIGhlaWdodCA9IGlubGluZSA/IE1hdGgubWF4LmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheSh0ZXh0U2l6ZXMubWFwKGZ1bmN0aW9uIChzaXplKSB7XG4gICAgcmV0dXJuIHNpemUuaGVpZ2h0O1xuICB9KSkpIDogdGV4dFNpemVzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgc2l6ZSwgaSkge1xuICAgIHZhciBjYXBIZWlnaHRBZGp1c3RtZW50ID0gaSA/IDAgOiBjYXBIZWlnaHQgLyAyO1xuICAgIHJldHVybiBtZW1vICsgc2l6ZS5oZWlnaHQgKiAodHNwYW5WYWx1ZXNbaV0ubGluZUhlaWdodCAtIGNhcEhlaWdodEFkanVzdG1lbnQpO1xuICB9LCAwKTtcbiAgdmFyIHdpZHRoID0gaW5saW5lID8gdGV4dFNpemVzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgc2l6ZSwgaW5kZXgpIHtcbiAgICB2YXIgb2Zmc2V0ID0gaW5kZXggPyBkeCA6IDA7XG4gICAgcmV0dXJuIG1lbW8gKyBzaXplLndpZHRoICsgb2Zmc2V0O1xuICB9LCAwKSA6IE1hdGgubWF4LmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheSh0ZXh0U2l6ZXMubWFwKGZ1bmN0aW9uIChzaXplKSB7XG4gICAgcmV0dXJuIHNpemUud2lkdGg7XG4gIH0pKSk7XG4gIHZhciB4Q29vcmRpbmF0ZSA9IGdldFhDb29yZGluYXRlKGNhbGN1bGF0ZWRQcm9wcywgd2lkdGgpO1xuICB2YXIgeUNvb3JkaW5hdGUgPSBnZXRZQ29vcmRpbmF0ZShjYWxjdWxhdGVkUHJvcHMsIGhlaWdodCk7XG4gIHZhciBiYWNrZ3JvdW5kUHJvcHMgPSB7XG4gICAga2V5OiBcImJhY2tncm91bmRcIixcbiAgICBoZWlnaHQ6IGhlaWdodCArIGJhY2tncm91bmRQYWRkaW5nLnRvcCArIGJhY2tncm91bmRQYWRkaW5nLmJvdHRvbSxcbiAgICBzdHlsZTogYmFja2dyb3VuZFN0eWxlLFxuICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICAgIHdpZHRoOiB3aWR0aCArIGJhY2tncm91bmRQYWRkaW5nLmxlZnQgKyBiYWNrZ3JvdW5kUGFkZGluZy5yaWdodCxcbiAgICB4OiBpbmxpbmUgPyB4Q29vcmRpbmF0ZSAtIGJhY2tncm91bmRQYWRkaW5nLmxlZnQgOiB4Q29vcmRpbmF0ZSArIGR4IC0gYmFja2dyb3VuZFBhZGRpbmcubGVmdCxcbiAgICB5OiB5Q29vcmRpbmF0ZVxuICB9O1xuICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGJhY2tncm91bmRDb21wb25lbnQsIF9kZWZhdWx0cyh7fSwgYmFja2dyb3VuZENvbXBvbmVudC5wcm9wcywgYmFja2dyb3VuZFByb3BzKSk7XG59O1xuXG52YXIgZ2V0SW5saW5lWE9mZnNldCA9IGZ1bmN0aW9uIChjYWxjdWxhdGVkUHJvcHMsIHRleHRFbGVtZW50cywgaW5kZXgpIHtcbiAgdmFyIHRleHRBbmNob3IgPSBjYWxjdWxhdGVkUHJvcHMudGV4dEFuY2hvcjtcbiAgdmFyIHdpZHRocyA9IHRleHRFbGVtZW50cy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC53aWR0aFdpdGhQYWRkaW5nO1xuICB9KTtcbiAgdmFyIHRvdGFsV2lkdGggPSB3aWR0aHMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCB3aWR0aCkge1xuICAgIHJldHVybiBtZW1vICsgd2lkdGg7XG4gIH0sIDApO1xuICB2YXIgY2VudGVyT2Zmc2V0ID0gLXRvdGFsV2lkdGggLyAyO1xuXG4gIHN3aXRjaCAodGV4dEFuY2hvcikge1xuICAgIGNhc2UgXCJzdGFydFwiOlxuICAgICAgcmV0dXJuIHdpZHRocy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIHdpZHRoLCBpKSB7XG4gICAgICAgIG1lbW8gPSBpIDwgaW5kZXggPyBtZW1vICsgd2lkdGggOiBtZW1vO1xuICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgIH0sIDApO1xuXG4gICAgY2FzZSBcImVuZFwiOlxuICAgICAgcmV0dXJuIHdpZHRocy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIHdpZHRoLCBpKSB7XG4gICAgICAgIG1lbW8gPSBpID4gaW5kZXggPyBtZW1vIC0gd2lkdGggOiBtZW1vO1xuICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgIH0sIDApO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIG1pZGRsZVxuICAgICAgcmV0dXJuIHdpZHRocy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIHdpZHRoLCBpKSB7XG4gICAgICAgIHZhciBvZmZzZXRXaWR0aCA9IGkgPCBpbmRleCA/IHdpZHRoIDogMDtcbiAgICAgICAgbWVtbyA9IGkgPT09IGluZGV4ID8gbWVtbyArIHdpZHRoIC8gMiA6IG1lbW8gKyBvZmZzZXRXaWR0aDtcbiAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICB9LCBjZW50ZXJPZmZzZXQpO1xuICB9XG59O1xuXG52YXIgZ2V0Q2hpbGRCYWNrZ3JvdW5kcyA9IGZ1bmN0aW9uIChjYWxjdWxhdGVkUHJvcHMsIHRzcGFuVmFsdWVzKSB7XG4gIHZhciBkeSA9IGNhbGN1bGF0ZWRQcm9wcy5keSxcbiAgICAgIGR4ID0gY2FsY3VsYXRlZFByb3BzLmR4LFxuICAgICAgdHJhbnNmb3JtID0gY2FsY3VsYXRlZFByb3BzLnRyYW5zZm9ybSxcbiAgICAgIGJhY2tncm91bmRTdHlsZSA9IGNhbGN1bGF0ZWRQcm9wcy5iYWNrZ3JvdW5kU3R5bGUsXG4gICAgICBiYWNrZ3JvdW5kUGFkZGluZyA9IGNhbGN1bGF0ZWRQcm9wcy5iYWNrZ3JvdW5kUGFkZGluZyxcbiAgICAgIGJhY2tncm91bmRDb21wb25lbnQgPSBjYWxjdWxhdGVkUHJvcHMuYmFja2dyb3VuZENvbXBvbmVudCxcbiAgICAgIGlubGluZSA9IGNhbGN1bGF0ZWRQcm9wcy5pbmxpbmUsXG4gICAgICB5ID0gY2FsY3VsYXRlZFByb3BzLnk7XG4gIHZhciB0ZXh0RWxlbWVudHMgPSB0c3BhblZhbHVlcy5tYXAoZnVuY3Rpb24gKGN1cnJlbnQsIGkpIHtcbiAgICB2YXIgcHJldmlvdXMgPSBnZXRTaW5nbGVWYWx1ZSh0c3BhblZhbHVlcywgaSAtIDEpO1xuICAgIHZhciBsYWJlbFNpemUgPSBjdXJyZW50LnRleHRTaXplO1xuICAgIHZhciB0b3RhbExpbmVIZWlnaHQgPSBjdXJyZW50LmZvbnRTaXplICogY3VycmVudC5saW5lSGVpZ2h0O1xuICAgIHZhciB0ZXh0SGVpZ2h0ID0gTWF0aC5jZWlsKHRvdGFsTGluZUhlaWdodCk7XG4gICAgdmFyIHBhZGRpbmcgPSBnZXRTaW5nbGVWYWx1ZShiYWNrZ3JvdW5kUGFkZGluZywgaSk7XG4gICAgdmFyIHByZXZQYWRkaW5nID0gZ2V0U2luZ2xlVmFsdWUoYmFja2dyb3VuZFBhZGRpbmcsIGkgLSAxKTtcbiAgICB2YXIgeE9mZnNldCA9IGlubGluZSA/IGR4IHx8IDAgOiAwO1xuICAgIHZhciBjaGlsZER5ID0gaSAmJiAhaW5saW5lID8gcHJldmlvdXMuZm9udFNpemUgKiBwcmV2aW91cy5saW5lSGVpZ2h0ICsgcHJldlBhZGRpbmcudG9wICsgcHJldlBhZGRpbmcuYm90dG9tIDogZHkgLSB0b3RhbExpbmVIZWlnaHQgKiAwLjUgLSAoY3VycmVudC5mb250U2l6ZSAtIGN1cnJlbnQuY2FwSGVpZ2h0KTtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dEhlaWdodDogdGV4dEhlaWdodCxcbiAgICAgIGxhYmVsU2l6ZTogbGFiZWxTaXplLFxuICAgICAgaGVpZ2h0V2l0aFBhZGRpbmc6IHRleHRIZWlnaHQgKyBwYWRkaW5nLnRvcCArIHBhZGRpbmcuYm90dG9tLFxuICAgICAgd2lkdGhXaXRoUGFkZGluZzogbGFiZWxTaXplLndpZHRoICsgcGFkZGluZy5sZWZ0ICsgcGFkZGluZy5yaWdodCArIHhPZmZzZXQsXG4gICAgICB5OiB5LFxuICAgICAgZm9udFNpemU6IGN1cnJlbnQuZm9udFNpemUsXG4gICAgICBkeTogY2hpbGREeVxuICAgIH07XG4gIH0pO1xuICByZXR1cm4gdGV4dEVsZW1lbnRzLm1hcChmdW5jdGlvbiAodGV4dEVsZW1lbnQsIGkpIHtcbiAgICB2YXIgeENvb3JkaW5hdGUgPSBnZXRYQ29vcmRpbmF0ZShjYWxjdWxhdGVkUHJvcHMsIHRleHRFbGVtZW50LmxhYmVsU2l6ZS53aWR0aCk7XG4gICAgdmFyIHlDb29yZGluYXRlID0gdGV4dEVsZW1lbnRzLnNsaWNlKDAsIGkgKyAxKS5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnIpIHtcbiAgICAgIHJldHVybiBwcmV2ICsgY3Vyci5keTtcbiAgICB9LCB5KTtcbiAgICB2YXIgcGFkZGluZyA9IGdldFNpbmdsZVZhbHVlKGJhY2tncm91bmRQYWRkaW5nLCBpKTtcbiAgICB2YXIgaGVpZ2h0ID0gdGV4dEVsZW1lbnQuaGVpZ2h0V2l0aFBhZGRpbmc7XG4gICAgdmFyIHhDb29yZCA9IGlubGluZSA/IGdldElubGluZVhPZmZzZXQoY2FsY3VsYXRlZFByb3BzLCB0ZXh0RWxlbWVudHMsIGkpICsgeENvb3JkaW5hdGUgLSBwYWRkaW5nLmxlZnQgOiB4Q29vcmRpbmF0ZTtcbiAgICB2YXIgeUNvb3JkID0gaW5saW5lID8gZ2V0WUNvb3JkaW5hdGUoY2FsY3VsYXRlZFByb3BzLCBoZWlnaHQpIC0gcGFkZGluZy50b3AgOiB5Q29vcmRpbmF0ZTtcbiAgICB2YXIgYmFja2dyb3VuZFByb3BzID0ge1xuICAgICAga2V5OiBcInRzcGFuLWJhY2tncm91bmQtXCIuY29uY2F0KGkpLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBzdHlsZTogZ2V0U2luZ2xlVmFsdWUoYmFja2dyb3VuZFN0eWxlLCBpKSxcbiAgICAgIHdpZHRoOiB0ZXh0RWxlbWVudC53aWR0aFdpdGhQYWRkaW5nLFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgICB4OiB4Q29vcmQgLSBwYWRkaW5nLmxlZnQsXG4gICAgICB5OiB5Q29vcmRcbiAgICB9O1xuICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoYmFja2dyb3VuZENvbXBvbmVudCwgX2RlZmF1bHRzKHt9LCBiYWNrZ3JvdW5kQ29tcG9uZW50LnByb3BzLCBiYWNrZ3JvdW5kUHJvcHMpKTtcbiAgfSk7XG59O1xuXG52YXIgZ2V0QmFja2dyb3VuZEVsZW1lbnQgPSBmdW5jdGlvbiAoY2FsY3VsYXRlZFByb3BzLCB0c3BhblZhbHVlcykge1xuICByZXR1cm4gc2hvdWxkVXNlTXVsdGlsaW5lQmFja2dyb3VuZHMoY2FsY3VsYXRlZFByb3BzKSA/IGdldENoaWxkQmFja2dyb3VuZHMoY2FsY3VsYXRlZFByb3BzLCB0c3BhblZhbHVlcykgOiBnZXRGdWxsQmFja2dyb3VuZChjYWxjdWxhdGVkUHJvcHMsIHRzcGFuVmFsdWVzKTtcbn07XG5cbnZhciBjYWxjdWxhdGVTcGFuRHkgPSBmdW5jdGlvbiAodHNwYW5WYWx1ZXMsIGksIGNhbGN1bGF0ZWRQcm9wcykge1xuICB2YXIgY3VycmVudCA9IGdldFNpbmdsZVZhbHVlKHRzcGFuVmFsdWVzLCBpKTtcbiAgdmFyIHByZXZpb3VzID0gZ2V0U2luZ2xlVmFsdWUodHNwYW5WYWx1ZXMsIGkgLSAxKTtcbiAgdmFyIHByZXZpb3VzSGVpZ2h0ID0gcHJldmlvdXMuZm9udFNpemUgKiBwcmV2aW91cy5saW5lSGVpZ2h0O1xuICB2YXIgY3VycmVudEhlaWdodCA9IGN1cnJlbnQuZm9udFNpemUgKiBjdXJyZW50LmxpbmVIZWlnaHQ7XG4gIHZhciBwcmV2aW91c0NhcHMgPSBwcmV2aW91cy5mb250U2l6ZSAtIHByZXZpb3VzLmNhcEhlaWdodDtcbiAgdmFyIGN1cnJlbnRDYXBzID0gY3VycmVudC5mb250U2l6ZSAtIGN1cnJlbnQuY2FwSGVpZ2h0O1xuICB2YXIgdGV4dEhlaWdodCA9IHByZXZpb3VzSGVpZ2h0IC0gcHJldmlvdXMuZm9udFNpemUgLyAyICsgY3VycmVudC5mb250U2l6ZSAvIDIgLSBwcmV2aW91c0hlaWdodCAvIDIgKyBjdXJyZW50SGVpZ2h0IC8gMiAtIGN1cnJlbnRDYXBzIC8gMiArIHByZXZpb3VzQ2FwcyAvIDI7XG4gIHJldHVybiBzaG91bGRVc2VNdWx0aWxpbmVCYWNrZ3JvdW5kcyhjYWxjdWxhdGVkUHJvcHMpID8gdGV4dEhlaWdodCArIGN1cnJlbnQuYmFja2dyb3VuZFBhZGRpbmcudG9wICsgcHJldmlvdXMuYmFja2dyb3VuZFBhZGRpbmcuYm90dG9tIDogdGV4dEhlaWdodDtcbn07XG5cbnZhciBnZXRUU3BhbkR5ID0gZnVuY3Rpb24gKHRzcGFuVmFsdWVzLCBjYWxjdWxhdGVkUHJvcHMsIGkpIHtcbiAgdmFyIGlubGluZSA9IGNhbGN1bGF0ZWRQcm9wcy5pbmxpbmU7XG4gIHZhciBjdXJyZW50ID0gZ2V0U2luZ2xlVmFsdWUodHNwYW5WYWx1ZXMsIGkpO1xuXG4gIGlmIChpICYmICFpbmxpbmUpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlU3BhbkR5KHRzcGFuVmFsdWVzLCBpLCBjYWxjdWxhdGVkUHJvcHMpO1xuICB9IGVsc2UgaWYgKGlubGluZSkge1xuICAgIHJldHVybiBpID09PSAwID8gY3VycmVudC5iYWNrZ3JvdW5kUGFkZGluZy50b3AgOiB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGN1cnJlbnQuYmFja2dyb3VuZFBhZGRpbmcudG9wO1xuICB9XG59O1xuXG52YXIgZXZhbHVhdGVQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAvKiBQb3RlbnRpYWwgZXZhbHVhdGVkIHByb3BzIGFyZVxuICAgIDEpIHRleHRcbiAgICAyKSBzdHlsZVxuICAgIDMpIGV2ZXJ5dGhpbmcgZWxzZVxuICAqL1xuICB2YXIgdGV4dCA9IGdldENvbnRlbnQocHJvcHMudGV4dCwgcHJvcHMpO1xuICB2YXIgc3R5bGUgPSBnZXRTdHlsZXMocHJvcHMuc3R5bGUsIF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdGV4dDogdGV4dFxuICB9KSk7XG4gIHZhciBiYWNrZ3JvdW5kU3R5bGUgPSBnZXRCYWNrZ3JvdW5kU3R5bGVzKHByb3BzLmJhY2tncm91bmRTdHlsZSwgX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB0ZXh0OiB0ZXh0LFxuICAgIHN0eWxlOiBzdHlsZVxuICB9KSk7XG4gIHZhciBiYWNrZ3JvdW5kUGFkZGluZyA9IGdldEJhY2tncm91bmRQYWRkaW5nKF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdGV4dDogdGV4dCxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgYmFja2dyb3VuZFN0eWxlOiBiYWNrZ3JvdW5kU3R5bGVcbiAgfSkpO1xuICB2YXIgaWQgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy5pZCwgcHJvcHMpO1xuICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBiYWNrZ3JvdW5kU3R5bGU6IGJhY2tncm91bmRTdHlsZSxcbiAgICBiYWNrZ3JvdW5kUGFkZGluZzogYmFja2dyb3VuZFBhZGRpbmcsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHRleHQ6IHRleHQsXG4gICAgaWQ6IGlkXG4gIH0pO1xufTtcblxudmFyIGdldENhbGN1bGF0ZWRQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgYXJpYUxhYmVsID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuYXJpYUxhYmVsLCBwcm9wcyk7XG4gIHZhciBzdHlsZSA9IGdldFNpbmdsZVZhbHVlKHByb3BzLnN0eWxlKTtcbiAgdmFyIGxpbmVIZWlnaHQgPSBnZXRMaW5lSGVpZ2h0KHByb3BzKTtcbiAgdmFyIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbiA/IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmRpcmVjdGlvbiwgcHJvcHMpIDogXCJpbmhlcml0XCI7XG4gIHZhciB0ZXh0QW5jaG9yID0gcHJvcHMudGV4dEFuY2hvciA/IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLnRleHRBbmNob3IsIHByb3BzKSA6IHN0eWxlLnRleHRBbmNob3IgfHwgXCJzdGFydFwiO1xuICB2YXIgdmVydGljYWxBbmNob3IgPSBwcm9wcy52ZXJ0aWNhbEFuY2hvciA/IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLnZlcnRpY2FsQW5jaG9yLCBwcm9wcykgOiBzdHlsZS52ZXJ0aWNhbEFuY2hvciB8fCBcIm1pZGRsZVwiO1xuICB2YXIgZHggPSBwcm9wcy5keCA/IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmR4LCBwcm9wcykgOiAwO1xuICB2YXIgZHkgPSBnZXREeShwcm9wcywgdmVydGljYWxBbmNob3IsIGxpbmVIZWlnaHQpO1xuICB2YXIgeCA9IHByb3BzLnggIT09IHVuZGVmaW5lZCA/IHByb3BzLnggOiBnZXRQb3NpdGlvbihwcm9wcywgXCJ4XCIpO1xuICB2YXIgeSA9IHByb3BzLnkgIT09IHVuZGVmaW5lZCA/IHByb3BzLnkgOiBnZXRQb3NpdGlvbihwcm9wcywgXCJ5XCIpO1xuICB2YXIgdHJhbnNmb3JtID0gZ2V0VHJhbnNmb3JtKHByb3BzLCB4LCB5KTtcbiAgcmV0dXJuIF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgYXJpYUxhYmVsOiBhcmlhTGFiZWwsXG4gICAgbGluZUhlaWdodDogbGluZUhlaWdodCxcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICB0ZXh0QW5jaG9yOiB0ZXh0QW5jaG9yLFxuICAgIHZlcnRpY2FsQW5jaG9yOiB2ZXJ0aWNhbEFuY2hvcixcbiAgICBkeDogZHgsXG4gICAgZHk6IGR5LFxuICAgIG9yaWdpbmFsRHk6IHByb3BzLmR5LFxuICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICAgIHg6IHgsXG4gICAgeTogeVxuICB9KTtcbn07XG5cbnZhciByZW5kZXJMYWJlbCA9IGZ1bmN0aW9uIChjYWxjdWxhdGVkUHJvcHMsIHRzcGFuVmFsdWVzKSB7XG4gIHZhciBhcmlhTGFiZWwgPSBjYWxjdWxhdGVkUHJvcHMuYXJpYUxhYmVsLFxuICAgICAgaW5saW5lID0gY2FsY3VsYXRlZFByb3BzLmlubGluZSxcbiAgICAgIGNsYXNzTmFtZSA9IGNhbGN1bGF0ZWRQcm9wcy5jbGFzc05hbWUsXG4gICAgICB0aXRsZSA9IGNhbGN1bGF0ZWRQcm9wcy50aXRsZSxcbiAgICAgIGV2ZW50cyA9IGNhbGN1bGF0ZWRQcm9wcy5ldmVudHMsXG4gICAgICBkaXJlY3Rpb24gPSBjYWxjdWxhdGVkUHJvcHMuZGlyZWN0aW9uLFxuICAgICAgdGV4dCA9IGNhbGN1bGF0ZWRQcm9wcy50ZXh0LFxuICAgICAgdGV4dEFuY2hvciA9IGNhbGN1bGF0ZWRQcm9wcy50ZXh0QW5jaG9yLFxuICAgICAgZHggPSBjYWxjdWxhdGVkUHJvcHMuZHgsXG4gICAgICBkeSA9IGNhbGN1bGF0ZWRQcm9wcy5keSxcbiAgICAgIHRyYW5zZm9ybSA9IGNhbGN1bGF0ZWRQcm9wcy50cmFuc2Zvcm0sXG4gICAgICB4ID0gY2FsY3VsYXRlZFByb3BzLngsXG4gICAgICB5ID0gY2FsY3VsYXRlZFByb3BzLnksXG4gICAgICBkZXNjID0gY2FsY3VsYXRlZFByb3BzLmRlc2MsXG4gICAgICBpZCA9IGNhbGN1bGF0ZWRQcm9wcy5pZCxcbiAgICAgIHRhYkluZGV4ID0gY2FsY3VsYXRlZFByb3BzLnRhYkluZGV4LFxuICAgICAgdHNwYW5Db21wb25lbnQgPSBjYWxjdWxhdGVkUHJvcHMudHNwYW5Db21wb25lbnQsXG4gICAgICB0ZXh0Q29tcG9uZW50ID0gY2FsY3VsYXRlZFByb3BzLnRleHRDb21wb25lbnQ7XG5cbiAgdmFyIHRleHRQcm9wcyA9IF9vYmplY3RTcHJlYWQoe1xuICAgIFwiYXJpYS1sYWJlbFwiOiBhcmlhTGFiZWwsXG4gICAga2V5OiBcInRleHRcIlxuICB9LCBldmVudHMsIHtcbiAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICBkeDogZHgsXG4gICAgeDogeCxcbiAgICB5OiB5ICsgZHksXG4gICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgdGl0bGU6IHRpdGxlLFxuICAgIGRlc2M6IEhlbHBlcnMuZXZhbHVhdGVQcm9wKGRlc2MsIGNhbGN1bGF0ZWRQcm9wcyksXG4gICAgdGFiSW5kZXg6IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHRhYkluZGV4LCBjYWxjdWxhdGVkUHJvcHMpLFxuICAgIGlkOiBpZFxuICB9KTtcblxuICB2YXIgdHNwYW5zID0gdGV4dC5tYXAoZnVuY3Rpb24gKGxpbmUsIGkpIHtcbiAgICB2YXIgY3VycmVudFN0eWxlID0gdHNwYW5WYWx1ZXNbaV0uc3R5bGU7XG4gICAgdmFyIHRzcGFuUHJvcHMgPSB7XG4gICAgICBrZXk6IFwiXCIuY29uY2F0KGlkLCBcIi1rZXktXCIpLmNvbmNhdChpKSxcbiAgICAgIHg6ICFpbmxpbmUgPyB4IDogdW5kZWZpbmVkLFxuICAgICAgZHg6IGlubGluZSA/IGR4ICsgdHNwYW5WYWx1ZXNbaV0uYmFja2dyb3VuZFBhZGRpbmcubGVmdCA6IGR4LFxuICAgICAgZHk6IGdldFRTcGFuRHkodHNwYW5WYWx1ZXMsIGNhbGN1bGF0ZWRQcm9wcywgaSksXG4gICAgICB0ZXh0QW5jaG9yOiBjdXJyZW50U3R5bGUudGV4dEFuY2hvciB8fCB0ZXh0QW5jaG9yLFxuICAgICAgc3R5bGU6IGN1cnJlbnRTdHlsZSxcbiAgICAgIGNoaWxkcmVuOiBsaW5lXG4gICAgfTtcbiAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KHRzcGFuQ29tcG9uZW50LCB0c3BhblByb3BzKTtcbiAgfSk7XG4gIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQodGV4dENvbXBvbmVudCwgdGV4dFByb3BzLCB0c3BhbnMpO1xufTtcblxudmFyIFZpY3RvcnlMYWJlbCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBwcm9wcyA9IGV2YWx1YXRlUHJvcHMocHJvcHMpO1xuXG4gIGlmIChwcm9wcy50ZXh0ID09PSBudWxsIHx8IHByb3BzLnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGNhbGN1bGF0ZWRQcm9wcyA9IGdldENhbGN1bGF0ZWRQcm9wcyhwcm9wcyk7XG4gIHZhciB0ZXh0ID0gY2FsY3VsYXRlZFByb3BzLnRleHQsXG4gICAgICBzdHlsZSA9IGNhbGN1bGF0ZWRQcm9wcy5zdHlsZSxcbiAgICAgIGNhcEhlaWdodCA9IGNhbGN1bGF0ZWRQcm9wcy5jYXBIZWlnaHQsXG4gICAgICBiYWNrZ3JvdW5kUGFkZGluZyA9IGNhbGN1bGF0ZWRQcm9wcy5iYWNrZ3JvdW5kUGFkZGluZyxcbiAgICAgIGxpbmVIZWlnaHQgPSBjYWxjdWxhdGVkUHJvcHMubGluZUhlaWdodDtcbiAgdmFyIHRzcGFuVmFsdWVzID0gdGV4dC5tYXAoZnVuY3Rpb24gKGxpbmUsIGkpIHtcbiAgICB2YXIgY3VycmVudFN0eWxlID0gZ2V0U2luZ2xlVmFsdWUoc3R5bGUsIGkpO1xuICAgIHZhciBjYXBIZWlnaHRQeCA9IFRleHRTaXplLmNvbnZlcnRMZW5ndGhUb1BpeGVscyhcIlwiLmNvbmNhdChjYXBIZWlnaHQsIFwiZW1cIiksIGN1cnJlbnRTdHlsZS5mb250U2l6ZSk7XG4gICAgdmFyIGN1cnJlbnRMaW5lSGVpZ2h0ID0gZ2V0U2luZ2xlVmFsdWUobGluZUhlaWdodCwgaSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0eWxlOiBjdXJyZW50U3R5bGUsXG4gICAgICBmb250U2l6ZTogY3VycmVudFN0eWxlLmZvbnRTaXplIHx8IGRlZmF1bHRTdHlsZXMuZm9udFNpemUsXG4gICAgICBjYXBIZWlnaHQ6IGNhcEhlaWdodFB4LFxuICAgICAgdGV4dDogbGluZSxcbiAgICAgIHRleHRTaXplOiBUZXh0U2l6ZS5hcHByb3hpbWF0ZVRleHRTaXplKGxpbmUsIGN1cnJlbnRTdHlsZSksXG4gICAgICBsaW5lSGVpZ2h0OiBjdXJyZW50TGluZUhlaWdodCxcbiAgICAgIGJhY2tncm91bmRQYWRkaW5nOiBnZXRTaW5nbGVWYWx1ZShiYWNrZ3JvdW5kUGFkZGluZywgaSlcbiAgICB9O1xuICB9KTtcbiAgdmFyIGxhYmVsID0gcmVuZGVyTGFiZWwoY2FsY3VsYXRlZFByb3BzLCB0c3BhblZhbHVlcyk7XG5cbiAgaWYgKHByb3BzLmJhY2tncm91bmRTdHlsZSkge1xuICAgIHZhciBiYWNrZ3JvdW5kRWxlbWVudCA9IGdldEJhY2tncm91bmRFbGVtZW50KGNhbGN1bGF0ZWRQcm9wcywgdHNwYW5WYWx1ZXMpO1xuICAgIHZhciBjaGlsZHJlbiA9IFtiYWNrZ3JvdW5kRWxlbWVudCwgbGFiZWxdO1xuICAgIHZhciBiYWNrZ3JvdW5kV2l0aExhYmVsID0gUmVhY3QuY2xvbmVFbGVtZW50KHByb3BzLmdyb3VwQ29tcG9uZW50LCB7fSwgY2hpbGRyZW4pO1xuICAgIHJldHVybiBwcm9wcy5yZW5kZXJJblBvcnRhbCA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeVBvcnRhbCwgbnVsbCwgYmFja2dyb3VuZFdpdGhMYWJlbCkgOiBiYWNrZ3JvdW5kV2l0aExhYmVsO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzLnJlbmRlckluUG9ydGFsID8gUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5UG9ydGFsLCBudWxsLCBsYWJlbCkgOiBsYWJlbDtcbn07XG5cblZpY3RvcnlMYWJlbC5kaXNwbGF5TmFtZSA9IFwiVmljdG9yeUxhYmVsXCI7XG5WaWN0b3J5TGFiZWwucm9sZSA9IFwibGFiZWxcIjtcblZpY3RvcnlMYWJlbC5kZWZhdWx0U3R5bGVzID0gZGVmYXVsdFN0eWxlcztcblZpY3RvcnlMYWJlbC5wcm9wVHlwZXMgPSB7XG4gIGFjdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG4gIGFuZ2xlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuZnVuY10pLFxuICBhcmlhTGFiZWw6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gIGJhY2tncm91bmRDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICBiYWNrZ3JvdW5kUGFkZGluZzogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLmFycmF5XSksXG4gIGJhY2tncm91bmRTdHlsZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLmFycmF5XSksXG4gIGNhcEhlaWdodDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlLCBQcm9wVHlwZXMuZnVuY10pLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGRhdGE6IFByb3BUeXBlcy5hcnJheSxcbiAgZGF0dW06IFByb3BUeXBlcy5hbnksXG4gIGRlc2M6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gIGRpcmVjdGlvbjogUHJvcFR5cGVzLm9uZU9mKFtcInJ0bFwiLCBcImx0clwiLCBcImluaGVyaXRcIl0pLFxuICBkeDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgZHk6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gIGV2ZW50czogUHJvcFR5cGVzLm9iamVjdCxcbiAgZ3JvdXBDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICBpZDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgaW5kZXg6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgaW5saW5lOiBQcm9wVHlwZXMuYm9vbCxcbiAgbGFiZWxQbGFjZW1lbnQ6IFByb3BUeXBlcy5vbmVPZihbXCJwYXJhbGxlbFwiLCBcInBlcnBlbmRpY3VsYXJcIiwgXCJ2ZXJ0aWNhbFwiXSksXG4gIGxpbmVIZWlnaHQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZSwgUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5hcnJheV0pLFxuICBvcmlnaW46IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgeDogQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlLFxuICAgIHk6IEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZVxuICB9KSxcbiAgcG9sYXI6IFByb3BUeXBlcy5ib29sLFxuICByZW5kZXJJblBvcnRhbDogUHJvcFR5cGVzLmJvb2wsXG4gIHNjYWxlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIHg6IEN1c3RvbVByb3BUeXBlcy5zY2FsZSxcbiAgICB5OiBDdXN0b21Qcm9wVHlwZXMuc2NhbGVcbiAgfSksXG4gIHN0eWxlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuYXJyYXldKSxcbiAgdGFiSW5kZXg6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5mdW5jXSksXG4gIHRleHQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5mdW5jLCBQcm9wVHlwZXMuYXJyYXldKSxcbiAgdGV4dEFuY2hvcjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9uZU9mKFtcInN0YXJ0XCIsIFwibWlkZGxlXCIsIFwiZW5kXCIsIFwiaW5oZXJpdFwiXSksIFByb3BUeXBlcy5mdW5jXSksXG4gIHRleHRDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgdHJhbnNmb3JtOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuZnVuY10pLFxuICB0c3BhbkNvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gIHZlcnRpY2FsQW5jaG9yOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub25lT2YoW1wic3RhcnRcIiwgXCJtaWRkbGVcIiwgXCJlbmRcIl0pLCBQcm9wVHlwZXMuZnVuY10pLFxuICB4OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gIHk6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKVxufTtcblZpY3RvcnlMYWJlbC5kZWZhdWx0UHJvcHMgPSB7XG4gIGJhY2tncm91bmRDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVjdCwgbnVsbCksXG4gIGdyb3VwQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCBudWxsKSxcbiAgZGlyZWN0aW9uOiBcImluaGVyaXRcIixcbiAgdGV4dENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChUZXh0LCBudWxsKSxcbiAgdHNwYW5Db21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVFNwYW4sIG51bGwpLFxuICBjYXBIZWlnaHQ6IDAuNzEsXG4gIC8vIE1hZ2ljIG51bWJlciBmcm9tIGQzLlxuICBsaW5lSGVpZ2h0OiAxXG59O1xuZXhwb3J0IGRlZmF1bHQgVmljdG9yeUxhYmVsOyIsImV4cG9ydCBmdW5jdGlvbiBsaW5lYXIodCkge1xuICByZXR1cm4gK3Q7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcXVhZEluKHQpIHtcbiAgcmV0dXJuIHQgKiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVhZE91dCh0KSB7XG4gIHJldHVybiB0ICogKDIgLSB0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1YWRJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0IDogLS10ICogKDIgLSB0KSArIDEpIC8gMjtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjdWJpY0luKHQpIHtcbiAgcmV0dXJuIHQgKiB0ICogdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljT3V0KHQpIHtcbiAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyO1xufVxuIiwidmFyIGV4cG9uZW50ID0gMztcblxuZXhwb3J0IHZhciBwb2x5SW4gPSAoZnVuY3Rpb24gY3VzdG9tKGUpIHtcbiAgZSA9ICtlO1xuXG4gIGZ1bmN0aW9uIHBvbHlJbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KHQsIGUpO1xuICB9XG5cbiAgcG9seUluLmV4cG9uZW50ID0gY3VzdG9tO1xuXG4gIHJldHVybiBwb2x5SW47XG59KShleHBvbmVudCk7XG5cbmV4cG9ydCB2YXIgcG9seU91dCA9IChmdW5jdGlvbiBjdXN0b20oZSkge1xuICBlID0gK2U7XG5cbiAgZnVuY3Rpb24gcG9seU91dCh0KSB7XG4gICAgcmV0dXJuIDEgLSBNYXRoLnBvdygxIC0gdCwgZSk7XG4gIH1cblxuICBwb2x5T3V0LmV4cG9uZW50ID0gY3VzdG9tO1xuXG4gIHJldHVybiBwb2x5T3V0O1xufSkoZXhwb25lbnQpO1xuXG5leHBvcnQgdmFyIHBvbHlJbk91dCA9IChmdW5jdGlvbiBjdXN0b20oZSkge1xuICBlID0gK2U7XG5cbiAgZnVuY3Rpb24gcG9seUluT3V0KHQpIHtcbiAgICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyBNYXRoLnBvdyh0LCBlKSA6IDIgLSBNYXRoLnBvdygyIC0gdCwgZSkpIC8gMjtcbiAgfVxuXG4gIHBvbHlJbk91dC5leHBvbmVudCA9IGN1c3RvbTtcblxuICByZXR1cm4gcG9seUluT3V0O1xufSkoZXhwb25lbnQpO1xuIiwidmFyIHBpID0gTWF0aC5QSSxcbiAgICBoYWxmUGkgPSBwaSAvIDI7XG5cbmV4cG9ydCBmdW5jdGlvbiBzaW5Jbih0KSB7XG4gIHJldHVybiAoK3QgPT09IDEpID8gMSA6IDEgLSBNYXRoLmNvcyh0ICogaGFsZlBpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpbk91dCh0KSB7XG4gIHJldHVybiBNYXRoLnNpbih0ICogaGFsZlBpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpbkluT3V0KHQpIHtcbiAgcmV0dXJuICgxIC0gTWF0aC5jb3MocGkgKiB0KSkgLyAyO1xufVxuIiwiLy8gdHBtdCBpcyB0d28gcG93ZXIgbWludXMgdGVuIHRpbWVzIHQgc2NhbGVkIHRvIFswLDFdXG5leHBvcnQgZnVuY3Rpb24gdHBtdCh4KSB7XG4gIHJldHVybiAoTWF0aC5wb3coMiwgLTEwICogeCkgLSAwLjAwMDk3NjU2MjUpICogMS4wMDA5Nzc1MTcxMDY1NDk0O1xufVxuIiwiaW1wb3J0IHt0cG10fSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBJbih0KSB7XG4gIHJldHVybiB0cG10KDEgLSArdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBPdXQodCkge1xuICByZXR1cm4gMSAtIHRwbXQodCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHRwbXQoMSAtIHQpIDogMiAtIHRwbXQodCAtIDEpKSAvIDI7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gY2lyY2xlSW4odCkge1xuICByZXR1cm4gMSAtIE1hdGguc3FydCgxIC0gdCAqIHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2lyY2xlT3V0KHQpIHtcbiAgcmV0dXJuIE1hdGguc3FydCgxIC0gLS10ICogdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaXJjbGVJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IDEgLSBNYXRoLnNxcnQoMSAtIHQgKiB0KSA6IE1hdGguc3FydCgxIC0gKHQgLT0gMikgKiB0KSArIDEpIC8gMjtcbn1cbiIsInZhciBiMSA9IDQgLyAxMSxcbiAgICBiMiA9IDYgLyAxMSxcbiAgICBiMyA9IDggLyAxMSxcbiAgICBiNCA9IDMgLyA0LFxuICAgIGI1ID0gOSAvIDExLFxuICAgIGI2ID0gMTAgLyAxMSxcbiAgICBiNyA9IDE1IC8gMTYsXG4gICAgYjggPSAyMSAvIDIyLFxuICAgIGI5ID0gNjMgLyA2NCxcbiAgICBiMCA9IDEgLyBiMSAvIGIxO1xuXG5leHBvcnQgZnVuY3Rpb24gYm91bmNlSW4odCkge1xuICByZXR1cm4gMSAtIGJvdW5jZU91dCgxIC0gdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBib3VuY2VPdXQodCkge1xuICByZXR1cm4gKHQgPSArdCkgPCBiMSA/IGIwICogdCAqIHQgOiB0IDwgYjMgPyBiMCAqICh0IC09IGIyKSAqIHQgKyBiNCA6IHQgPCBiNiA/IGIwICogKHQgLT0gYjUpICogdCArIGI3IDogYjAgKiAodCAtPSBiOCkgKiB0ICsgYjk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBib3VuY2VJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IDEgLSBib3VuY2VPdXQoMSAtIHQpIDogYm91bmNlT3V0KHQgLSAxKSArIDEpIC8gMjtcbn1cbiIsInZhciBvdmVyc2hvb3QgPSAxLjcwMTU4O1xuXG5leHBvcnQgdmFyIGJhY2tJbiA9IChmdW5jdGlvbiBjdXN0b20ocykge1xuICBzID0gK3M7XG5cbiAgZnVuY3Rpb24gYmFja0luKHQpIHtcbiAgICByZXR1cm4gKHQgPSArdCkgKiB0ICogKHMgKiAodCAtIDEpICsgdCk7XG4gIH1cblxuICBiYWNrSW4ub3ZlcnNob290ID0gY3VzdG9tO1xuXG4gIHJldHVybiBiYWNrSW47XG59KShvdmVyc2hvb3QpO1xuXG5leHBvcnQgdmFyIGJhY2tPdXQgPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHtcbiAgcyA9ICtzO1xuXG4gIGZ1bmN0aW9uIGJhY2tPdXQodCkge1xuICAgIHJldHVybiAtLXQgKiB0ICogKCh0ICsgMSkgKiBzICsgdCkgKyAxO1xuICB9XG5cbiAgYmFja091dC5vdmVyc2hvb3QgPSBjdXN0b207XG5cbiAgcmV0dXJuIGJhY2tPdXQ7XG59KShvdmVyc2hvb3QpO1xuXG5leHBvcnQgdmFyIGJhY2tJbk91dCA9IChmdW5jdGlvbiBjdXN0b20ocykge1xuICBzID0gK3M7XG5cbiAgZnVuY3Rpb24gYmFja0luT3V0KHQpIHtcbiAgICByZXR1cm4gKCh0ICo9IDIpIDwgMSA/IHQgKiB0ICogKChzICsgMSkgKiB0IC0gcykgOiAodCAtPSAyKSAqIHQgKiAoKHMgKyAxKSAqIHQgKyBzKSArIDIpIC8gMjtcbiAgfVxuXG4gIGJhY2tJbk91dC5vdmVyc2hvb3QgPSBjdXN0b207XG5cbiAgcmV0dXJuIGJhY2tJbk91dDtcbn0pKG92ZXJzaG9vdCk7XG4iLCJpbXBvcnQge3RwbXR9IGZyb20gXCIuL21hdGguanNcIjtcblxudmFyIHRhdSA9IDIgKiBNYXRoLlBJLFxuICAgIGFtcGxpdHVkZSA9IDEsXG4gICAgcGVyaW9kID0gMC4zO1xuXG5leHBvcnQgdmFyIGVsYXN0aWNJbiA9IChmdW5jdGlvbiBjdXN0b20oYSwgcCkge1xuICB2YXIgcyA9IE1hdGguYXNpbigxIC8gKGEgPSBNYXRoLm1heCgxLCBhKSkpICogKHAgLz0gdGF1KTtcblxuICBmdW5jdGlvbiBlbGFzdGljSW4odCkge1xuICAgIHJldHVybiBhICogdHBtdCgtKC0tdCkpICogTWF0aC5zaW4oKHMgLSB0KSAvIHApO1xuICB9XG5cbiAgZWxhc3RpY0luLmFtcGxpdHVkZSA9IGZ1bmN0aW9uKGEpIHsgcmV0dXJuIGN1c3RvbShhLCBwICogdGF1KTsgfTtcbiAgZWxhc3RpY0luLnBlcmlvZCA9IGZ1bmN0aW9uKHApIHsgcmV0dXJuIGN1c3RvbShhLCBwKTsgfTtcblxuICByZXR1cm4gZWxhc3RpY0luO1xufSkoYW1wbGl0dWRlLCBwZXJpb2QpO1xuXG5leHBvcnQgdmFyIGVsYXN0aWNPdXQgPSAoZnVuY3Rpb24gY3VzdG9tKGEsIHApIHtcbiAgdmFyIHMgPSBNYXRoLmFzaW4oMSAvIChhID0gTWF0aC5tYXgoMSwgYSkpKSAqIChwIC89IHRhdSk7XG5cbiAgZnVuY3Rpb24gZWxhc3RpY091dCh0KSB7XG4gICAgcmV0dXJuIDEgLSBhICogdHBtdCh0ID0gK3QpICogTWF0aC5zaW4oKHQgKyBzKSAvIHApO1xuICB9XG5cbiAgZWxhc3RpY091dC5hbXBsaXR1ZGUgPSBmdW5jdGlvbihhKSB7IHJldHVybiBjdXN0b20oYSwgcCAqIHRhdSk7IH07XG4gIGVsYXN0aWNPdXQucGVyaW9kID0gZnVuY3Rpb24ocCkgeyByZXR1cm4gY3VzdG9tKGEsIHApOyB9O1xuXG4gIHJldHVybiBlbGFzdGljT3V0O1xufSkoYW1wbGl0dWRlLCBwZXJpb2QpO1xuXG5leHBvcnQgdmFyIGVsYXN0aWNJbk91dCA9IChmdW5jdGlvbiBjdXN0b20oYSwgcCkge1xuICB2YXIgcyA9IE1hdGguYXNpbigxIC8gKGEgPSBNYXRoLm1heCgxLCBhKSkpICogKHAgLz0gdGF1KTtcblxuICBmdW5jdGlvbiBlbGFzdGljSW5PdXQodCkge1xuICAgIHJldHVybiAoKHQgPSB0ICogMiAtIDEpIDwgMFxuICAgICAgICA/IGEgKiB0cG10KC10KSAqIE1hdGguc2luKChzIC0gdCkgLyBwKVxuICAgICAgICA6IDIgLSBhICogdHBtdCh0KSAqIE1hdGguc2luKChzICsgdCkgLyBwKSkgLyAyO1xuICB9XG5cbiAgZWxhc3RpY0luT3V0LmFtcGxpdHVkZSA9IGZ1bmN0aW9uKGEpIHsgcmV0dXJuIGN1c3RvbShhLCBwICogdGF1KTsgfTtcbiAgZWxhc3RpY0luT3V0LnBlcmlvZCA9IGZ1bmN0aW9uKHApIHsgcmV0dXJuIGN1c3RvbShhLCBwKTsgfTtcblxuICByZXR1cm4gZWxhc3RpY0luT3V0O1xufSkoYW1wbGl0dWRlLCBwZXJpb2QpO1xuIiwiZXhwb3J0IHtcbiAgbGluZWFyIGFzIGVhc2VMaW5lYXJcbn0gZnJvbSBcIi4vbGluZWFyLmpzXCI7XG5cbmV4cG9ydCB7XG4gIHF1YWRJbk91dCBhcyBlYXNlUXVhZCxcbiAgcXVhZEluIGFzIGVhc2VRdWFkSW4sXG4gIHF1YWRPdXQgYXMgZWFzZVF1YWRPdXQsXG4gIHF1YWRJbk91dCBhcyBlYXNlUXVhZEluT3V0XG59IGZyb20gXCIuL3F1YWQuanNcIjtcblxuZXhwb3J0IHtcbiAgY3ViaWNJbk91dCBhcyBlYXNlQ3ViaWMsXG4gIGN1YmljSW4gYXMgZWFzZUN1YmljSW4sXG4gIGN1YmljT3V0IGFzIGVhc2VDdWJpY091dCxcbiAgY3ViaWNJbk91dCBhcyBlYXNlQ3ViaWNJbk91dFxufSBmcm9tIFwiLi9jdWJpYy5qc1wiO1xuXG5leHBvcnQge1xuICBwb2x5SW5PdXQgYXMgZWFzZVBvbHksXG4gIHBvbHlJbiBhcyBlYXNlUG9seUluLFxuICBwb2x5T3V0IGFzIGVhc2VQb2x5T3V0LFxuICBwb2x5SW5PdXQgYXMgZWFzZVBvbHlJbk91dFxufSBmcm9tIFwiLi9wb2x5LmpzXCI7XG5cbmV4cG9ydCB7XG4gIHNpbkluT3V0IGFzIGVhc2VTaW4sXG4gIHNpbkluIGFzIGVhc2VTaW5JbixcbiAgc2luT3V0IGFzIGVhc2VTaW5PdXQsXG4gIHNpbkluT3V0IGFzIGVhc2VTaW5Jbk91dFxufSBmcm9tIFwiLi9zaW4uanNcIjtcblxuZXhwb3J0IHtcbiAgZXhwSW5PdXQgYXMgZWFzZUV4cCxcbiAgZXhwSW4gYXMgZWFzZUV4cEluLFxuICBleHBPdXQgYXMgZWFzZUV4cE91dCxcbiAgZXhwSW5PdXQgYXMgZWFzZUV4cEluT3V0XG59IGZyb20gXCIuL2V4cC5qc1wiO1xuXG5leHBvcnQge1xuICBjaXJjbGVJbk91dCBhcyBlYXNlQ2lyY2xlLFxuICBjaXJjbGVJbiBhcyBlYXNlQ2lyY2xlSW4sXG4gIGNpcmNsZU91dCBhcyBlYXNlQ2lyY2xlT3V0LFxuICBjaXJjbGVJbk91dCBhcyBlYXNlQ2lyY2xlSW5PdXRcbn0gZnJvbSBcIi4vY2lyY2xlLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGJvdW5jZU91dCBhcyBlYXNlQm91bmNlLFxuICBib3VuY2VJbiBhcyBlYXNlQm91bmNlSW4sXG4gIGJvdW5jZU91dCBhcyBlYXNlQm91bmNlT3V0LFxuICBib3VuY2VJbk91dCBhcyBlYXNlQm91bmNlSW5PdXRcbn0gZnJvbSBcIi4vYm91bmNlLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGJhY2tJbk91dCBhcyBlYXNlQmFjayxcbiAgYmFja0luIGFzIGVhc2VCYWNrSW4sXG4gIGJhY2tPdXQgYXMgZWFzZUJhY2tPdXQsXG4gIGJhY2tJbk91dCBhcyBlYXNlQmFja0luT3V0XG59IGZyb20gXCIuL2JhY2suanNcIjtcblxuZXhwb3J0IHtcbiAgZWxhc3RpY091dCBhcyBlYXNlRWxhc3RpYyxcbiAgZWxhc3RpY0luIGFzIGVhc2VFbGFzdGljSW4sXG4gIGVsYXN0aWNPdXQgYXMgZWFzZUVsYXN0aWNPdXQsXG4gIGVsYXN0aWNJbk91dCBhcyBlYXNlRWxhc3RpY0luT3V0XG59IGZyb20gXCIuL2VsYXN0aWMuanNcIjtcbiIsImltcG9ydCBfb3JkZXJCeSBmcm9tIFwibG9kYXNoL29yZGVyQnlcIjtcbmltcG9ydCBfaXNQbGFpbk9iamVjdCBmcm9tIFwibG9kYXNoL2lzUGxhaW5PYmplY3RcIjtcbmltcG9ydCB7IGludGVycG9sYXRlIH0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5leHBvcnQgdmFyIGlzSW50ZXJwb2xhdGFibGUgPSBmdW5jdGlvbiAob2JqKSB7XG4gIC8vIGQzIHR1cm5zIG51bGwgaW50byAwIGFuZCB1bmRlZmluZWQgaW50byBOYU4sIHdoaWNoIHdlIGRvbid0IHdhbnQuXG4gIGlmIChvYmogIT09IG51bGwpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBvYmopIHtcbiAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIC8vIFRoZSBzdGFuZGFyZCBgaXNOYU5gIGlzIGZpbmUgaW4gdGhpcyBjYXNlIHNpbmNlIHdlIGFscmVhZHkga25vdyB0aGVcbiAgICAgICAgLy8gdHlwZSBpcyBudW1iZXIuXG4gICAgICAgIHJldHVybiAhaXNOYU4ob2JqKSAmJiBvYmogIT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSAmJiBvYmogIT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAvLyBkMyBtaWdodCBub3QgKmFjdHVhbGx5KiBiZSBhYmxlIHRvIGludGVycG9sYXRlIHRoZSBzdHJpbmcsIGJ1dCBpdFxuICAgICAgICAvLyB3b24ndCBjYXVzZSBhbnkgaXNzdWVzIHRvIGxldCBpdCB0cnkuXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAvLyBkMyB0dXJucyBCb29sZWFucyBpbnRvIGludGVnZXJzLCB3aGljaCB3ZSBkb24ndCB3YW50LiBTdXJlLCB3ZSBjb3VsZFxuICAgICAgICAvLyBpbnRlcnBvbGF0ZSBmcm9tIDAgLT4gMSwgYnV0IHdlJ2QgYmUgc2VuZGluZyBhIG5vbi1Cb29sZWFuIHRvXG4gICAgICAgIC8vIHNvbWV0aGluZyBleHBlY3RpbmcgYSBCb29sZWFuLlxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIGludGVycG9sYXRlIGNsYXNzIGluc3RhbmNlcyAoZXhjZXB0IERhdGUgb3IgQXJyYXkpLlxuICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRGF0ZSB8fCBBcnJheS5pc0FycmF5KG9iaikgfHwgX2lzUGxhaW5PYmplY3Qob2JqKTtcblxuICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgIC8vIENhcmVmdWwhIFRoZXJlIG1heSBiZSBleHRyYSBwcm9wZXJ0aWVzIG9uIGZ1bmN0aW9uIG9iamVjdHMgdGhhdCB0aGVcbiAgICAgICAgLy8gY29tcG9uZW50IGV4cGVjdHMgdG8gYWNjZXNzIC0gZm9yIGluc3RhbmNlLCBpdCBtYXkgYmUgYSBgZDMuc2NhbGUoKWBcbiAgICAgICAgLy8gZnVuY3Rpb24sIHdoaWNoIGhhcyBpdHMgb3duIG1ldGhvZHMgYXR0YWNoZWQuIFdlIGRvbid0IGtub3cgaWYgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCBpcyBvbmx5IGdvaW5nIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIChpbiB3aGljaCBjYXNlIGl0J3NcbiAgICAgICAgLy8gc2FmZWx5IGludGVycG9sYXRhYmxlKSBvciBpZiBpdCdzIGdvaW5nIHRvIGFjY2VzcyBzcGVjaWFsIHByb3BlcnRpZXNcbiAgICAgICAgLy8gKGluIHdoaWNoIGNhc2Ugb3VyIGZ1bmN0aW9uIGdlbmVyYXRlZCBmcm9tIGBpbnRlcnBvbGF0ZUZ1bmN0aW9uYCB3aWxsXG4gICAgICAgIC8vIG1vc3QgbGlrZWx5IGNhdXNlIGFuIGVycm9yLiBXZSBjb3VsZCBjaGVjayBmb3IgZW51bWVyYWJsZSBwcm9wZXJ0aWVzXG4gICAgICAgIC8vIG9uIHRoZSBmdW5jdGlvbiBvYmplY3QgaGVyZSB0byBzZWUgaWYgaXQncyBhIFwicGxhaW5cIiBmdW5jdGlvbiwgYnV0XG4gICAgICAgIC8vIGxldCdzIGp1c3QgcmVxdWlyZSB0aGF0IGNvbXBvbmVudHMgcHJldmVudCBzdWNoIGZ1bmN0aW9uIHByb3BzIGZyb21cbiAgICAgICAgLy8gYmVpbmcgYW5pbWF0ZWQgaW4gdGhlIGZpcnN0IHBsYWNlLlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG4gKiBJbnRlcnBvbGF0ZSBpbW1lZGlhdGVseSB0byB0aGUgZW5kIHZhbHVlIGF0IHRoZSBnaXZlbiBzdGVwIGB3aGVuYC5cbiAqIFNvbWUgbmljZXIgZGVmYXVsdCBiZWhhdmlvciBtaWdodCBiZSB0byBqdW1wIGF0IHRoZSBoYWxmd2F5IHBvaW50IG9yIHJldHVyblxuICogYGFgIGlmIGB0YCBpcyAwIChpbnN0ZWFkIG9mIGFsd2F5cyByZXR1cm5pbmcgYGJgKS4gQnV0IGQzJ3MgZGVmYXVsdFxuICogaW50ZXJwb2xhdG9yIGRvZXMgbm90IGRvIHRoZXNlIHRoaW5nczpcbiAqXG4gKiAgIGQzLmludGVycG9sYXRlKCdhYWEnLCAnYmJiJykoMCkgPT09ICdiYmInXG4gKlxuICogLi4uYW5kIHRoaW5ncyBtaWdodCBnZXQgd29ua3kgaWYgd2UgZG9uJ3QgcmVwbGljYXRlIHRoYXQgYmVoYXZpb3IuXG4gKlxuICogQHBhcmFtIHthbnl9IGEgLSBTdGFydCB2YWx1ZS5cbiAqIEBwYXJhbSB7YW55fSBiIC0gRW5kIHZhbHVlLlxuICogQHBhcmFtIHtOdW1iZXJ9IHdoZW4gLSBTdGVwIHZhbHVlICgwIHRvIDEpIGF0IHdoaWNoIHRvIGp1bXAgdG8gYGJgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBbiBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uLlxuICovXG5cbmV4cG9ydCB2YXIgaW50ZXJwb2xhdGVJbW1lZGlhdGUgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgd2hlbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMDtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQgPCB3aGVuID8gYSA6IGI7XG4gIH07XG59O1xuLyoqXG4gKiBJbnRlcnBvbGF0ZSB0byBvciBmcm9tIGEgZnVuY3Rpb24uIFRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUgd2lsbCBiZSBhIGZ1bmN0aW9uXG4gKiB0aGF0IGNhbGxzIGBhYCAoaWYgaXQncyBhIGZ1bmN0aW9uKSBhbmQgYGJgIChpZiBpdCdzIGEgZnVuY3Rpb24pIGFuZCBjYWxsc1xuICogYGQzLmludGVycG9sYXRlYCBvbiB0aGUgcmVzdWx0aW5nIHZhbHVlcy4gTm90ZSB0aGF0IG91ciBmdW5jdGlvbiB3b24ndFxuICogbmVjZXNzYXJpbHkgYmUgY2FsbGVkICh0aGF0J3MgdXAgdG8gdGhlIGNvbXBvbmVudCB0aGlzIGV2ZW50dWFsbHkgZ2V0c1xuICogcGFzc2VkIHRvKSAtIGJ1dCBpZiBpdCBkb2VzIGdldCBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGFuIGFwcHJvcHJpYXRlbHlcbiAqIGludGVycG9sYXRlZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gYSAtIFN0YXJ0IHZhbHVlLlxuICogQHBhcmFtIHthbnl9IGIgLSBFbmQgdmFsdWUuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEFuIGludGVycG9sYXRpb24gZnVuY3Rpb24uXG4gKi9cblxuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZUZ1bmN0aW9uID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7XG4gICAgaWYgKHQgPj0gMSkge1xuICAgICAgcmV0dXJuIGI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuICAgICAgdmFyIGF2YWwgPSB0eXBlb2YgYSA9PT0gXCJmdW5jdGlvblwiID8gYS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogYTtcbiAgICAgIHZhciBidmFsID0gdHlwZW9mIGIgPT09IFwiZnVuY3Rpb25cIiA/IGIuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGI7XG4gICAgICByZXR1cm4gaW50ZXJwb2xhdGUoYXZhbCwgYnZhbCkodCk7XG4gICAgfTtcbiAgfTtcbn07XG4vKipcbiAqIEludGVycG9sYXRlIHRvIG9yIGZyb20gYW4gb2JqZWN0LiBUaGlzIG1ldGhvZCBpcyBhIG1vZGlmaWNhdGlvbiBvZiB0aGUgb2JqZWN0IGludGVycG9sYXRvciBpblxuICogZDMtaW50ZXJwb2xhdGUgaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLWludGVycG9sYXRlL2Jsb2IvbWFzdGVyL3NyYy9vYmplY3QuanMuIFRoaXMgaW50ZXJwb2xhdG9yXG4gKiBkaWZmZXJzIGluIHRoYXQgaXQgdXNlcyBvdXIgY3VzdG9tIGludGVycG9sYXRvcnMgd2hlbiBpbnRlcnBvbGF0aW5nIHRoZSB2YWx1ZSBvZiBlYWNoIHByb3BlcnR5IGluXG4gKiBhbiBvYmplY3QuIFRoaXMgYWxsb3dzIHRoZSBjb3JyZWN0IGludGVycG9sYXRpb24gb2YgbmVzdGVkIG9iamVjdHMsIGluY2x1ZGluZyBzdHlsZXNcbiAqXG4gKiBAcGFyYW0ge2FueX0gYSAtIFN0YXJ0IHZhbHVlLlxuICogQHBhcmFtIHthbnl9IGIgLSBFbmQgdmFsdWUuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEFuIGludGVycG9sYXRpb24gZnVuY3Rpb24uXG4gKi9cblxuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZU9iamVjdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHZhciBpbnRlcnBvbGF0ZVR5cGVzID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICBpZiAoeCA9PT0geSB8fCAhaXNJbnRlcnBvbGF0YWJsZSh4KSB8fCAhaXNJbnRlcnBvbGF0YWJsZSh5KSkge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlSW1tZWRpYXRlKHgsIHkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0ZUZ1bmN0aW9uKHgsIHkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAmJiBfaXNQbGFpbk9iamVjdCh4KSB8fCB0eXBlb2YgeSA9PT0gXCJvYmplY3RcIiAmJiBfaXNQbGFpbk9iamVjdCh5KSkge1xuICAgICAgcmV0dXJuIGludGVycG9sYXRlT2JqZWN0KHgsIHkpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnRlcnBvbGF0ZSh4LCB5KTtcbiAgfTsgLy8gV2hlbiB0aGUgdmFsdWUgaXMgYW4gYXJyYXksIGF0dGVtcHQgdG8gc29ydCBieSBcImtleVwiIHNvIHRoYXQgYW5pbWF0aW5nIG5vZGVzIG1heSBiZSBpZGVudGlmaWVkXG4gIC8vIGJhc2VkIG9uIFwia2V5XCIgaW5zdGVhZCBvZiBpbmRleFxuXG5cbiAgdmFyIGtleURhdGEgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsKSA/IF9vcmRlckJ5KHZhbCwgXCJrZXlcIikgOiB2YWw7XG4gIH07XG5cbiAgdmFyIGkgPSB7fTtcbiAgdmFyIGMgPSB7fTtcbiAgdmFyIGs7XG5cbiAgaWYgKGEgPT09IG51bGwgfHwgdHlwZW9mIGEgIT09IFwib2JqZWN0XCIpIHtcbiAgICBhID0ge307XG4gIH1cblxuICBpZiAoYiA9PT0gbnVsbCB8fCB0eXBlb2YgYiAhPT0gXCJvYmplY3RcIikge1xuICAgIGIgPSB7fTtcbiAgfVxuXG4gIGZvciAoayBpbiBiKSB7XG4gICAgaWYgKGsgaW4gYSkge1xuICAgICAgaVtrXSA9IGludGVycG9sYXRlVHlwZXMoa2V5RGF0YShhW2tdKSwga2V5RGF0YShiW2tdKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNba10gPSBiW2tdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAodCkge1xuICAgIGZvciAoayBpbiBpKSB7XG4gICAgICBjW2tdID0gaVtrXSh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYztcbiAgfTtcbn07XG5leHBvcnQgdmFyIGludGVycG9sYXRlU3RyaW5nID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgdmFyIGZvcm1hdCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiA/IHZhbC5yZXBsYWNlKC8sL2csIFwiXCIpIDogdmFsO1xuICB9O1xuXG4gIHJldHVybiBpbnRlcnBvbGF0ZShmb3JtYXQoYSksIGZvcm1hdChiKSk7XG59O1xuLyoqXG4gKiBCeSBkZWZhdWx0LCB0aGUgbGlzdCBvZiBpbnRlcnBvbGF0b3JzIHVzZWQgYnkgYGQzLmludGVycG9sYXRlYCBoYXMgYSBmZXdcbiAqIGRvd25zaWRlczpcbiAqXG4gKiAtIGBudWxsYCB2YWx1ZXMgZ2V0IHR1cm5lZCBpbnRvIDAuXG4gKiAtIGB1bmRlZmluZWRgLCBgZnVuY3Rpb25gLCBhbmQgc29tZSBvdGhlciB2YWx1ZSB0eXBlcyBnZXQgdHVybmVkIGludG8gTmFOLlxuICogLSBCb29sZWFuIHR5cGVzIGdldCB0dXJuZWQgaW50byBudW1iZXJzLCB3aGljaCBwcm9iYWJseSB3aWxsIGJlIG1lYW5pbmdsZXNzXG4gKiAgIHRvIHdoYXRldmVyIGlzIGNvbnN1bWluZyB0aGVtLlxuICogLSBJdCB0cmllcyB0byBpbnRlcnBvbGF0ZSBiZXR3ZWVuIGlkZW50aWNhbCBzdGFydCBhbmQgZW5kIHZhbHVlcywgZG9pbmdcbiAqICAgdW5uZWNlc3NhcnkgY2FsY3VsYXRpb25zIHRoYXQgc29tZXRpbWVzIHJlc3VsdCBpbiBmbG9hdGluZyBwb2ludCByb3VuZGluZ1xuICogICBlcnJvcnMuXG4gKlxuICogSWYgb25seSB0aGUgZGVmYXVsdCBpbnRlcnBvbGF0b3JzIGFyZSB1c2VkLCBgVmljdG9yeUFuaW1hdGlvbmAgd2lsbCBoYXBwaWx5XG4gKiBwYXNzIGRvd24gTmFOIChhbmQgb3RoZXIgYmFkKSB2YWx1ZXMgYXMgcHJvcHMgdG8gdGhlIHdyYXBwZWQgY29tcG9uZW50LlxuICogVGhlIGNvbXBvbmVudCB3aWxsIHRoZW4gZWl0aGVyIHVzZSB0aGUgaW5jb3JyZWN0IHZhbHVlcyBvciBjb21wbGFpbiB0aGF0IGl0XG4gKiB3YXMgcGFzc2VkIHByb3BzIG9mIHRoZSBpbmNvcnJlY3QgdHlwZS4gVGhpcyBjdXN0b20gaW50ZXJwb2xhdG9yIGlzIGFkZGVkXG4gKiB1c2luZyB0aGUgYGQzLmludGVycG9sYXRvcnNgIEFQSSwgYW5kIHByZXZlbnRzIHN1Y2ggY2FzZXMgZnJvbSBoYXBwZW5pbmdcbiAqIGZvciBtb3N0IHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gYSAtIFN0YXJ0IHZhbHVlLlxuICogQHBhcmFtIHthbnl9IGIgLSBFbmQgdmFsdWUuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb258dW5kZWZpbmVkfSBBbiBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uLCBpZiBuZWNlc3NhcnkuXG4gKi9cblxuZXhwb3J0IHZhciB2aWN0b3J5SW50ZXJwb2xhdG9yID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgLy8gSWYgdGhlIHZhbHVlcyBhcmUgc3RyaWN0bHkgZXF1YWwsIG9yIGVpdGhlciB2YWx1ZSBpcyBub3QgaW50ZXJwb2xhdGFibGUsXG4gIC8vIGp1c3QgdXNlIGVpdGhlciB0aGUgc3RhcnQgdmFsdWUgYGFgIG9yIGVuZCB2YWx1ZSBgYmAgYXQgZXZlcnkgc3RlcCwgYXNcbiAgLy8gdGhlcmUgaXMgbm8gcmVhc29uYWJsZSBpbi1iZXR3ZWVuIHZhbHVlLlxuICBpZiAoYSA9PT0gYiB8fCAhaXNJbnRlcnBvbGF0YWJsZShhKSB8fCAhaXNJbnRlcnBvbGF0YWJsZShiKSkge1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZUltbWVkaWF0ZShhLCBiKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYSA9PT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiBiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gaW50ZXJwb2xhdGVGdW5jdGlvbihhLCBiKTtcbiAgfVxuXG4gIGlmIChfaXNQbGFpbk9iamVjdChhKSB8fCBfaXNQbGFpbk9iamVjdChiKSkge1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZU9iamVjdChhLCBiKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgYiA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZVN0cmluZyhhLCBiKTtcbiAgfVxuXG4gIHJldHVybiBpbnRlcnBvbGF0ZShhLCBiKTtcbn07IiwiZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG4vKmdsb2JhbCBzZXRUaW1lb3V0OmZhbHNlICovXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgKiBhcyBkM0Vhc2UgZnJvbSBcImQzLWVhc2VcIjtcbmltcG9ydCB7IHZpY3RvcnlJbnRlcnBvbGF0b3IgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgVGltZXJDb250ZXh0IGZyb20gXCIuLi92aWN0b3J5LXV0aWwvdGltZXItY29udGV4dFwiO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSBcInJlYWN0LWZhc3QtY29tcGFyZVwiO1xuXG52YXIgVmljdG9yeUFuaW1hdGlvbiA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoVmljdG9yeUFuaW1hdGlvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gVmljdG9yeUFuaW1hdGlvbihwcm9wcywgY29udGV4dCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBWaWN0b3J5QW5pbWF0aW9uKTtcblxuICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKFZpY3RvcnlBbmltYXRpb24uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihWaWN0b3J5QW5pbWF0aW9uKSkuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuICAgIC8qIGRlZmF1bHRzICovXG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGRhdGE6IEFycmF5LmlzQXJyYXkoX3RoaXMucHJvcHMuZGF0YSkgPyBfdGhpcy5wcm9wcy5kYXRhWzBdIDogX3RoaXMucHJvcHMuZGF0YSxcbiAgICAgIGFuaW1hdGlvbkluZm86IHtcbiAgICAgICAgcHJvZ3Jlc3M6IDAsXG4gICAgICAgIGFuaW1hdGluZzogZmFsc2VcbiAgICAgIH1cbiAgICB9O1xuICAgIF90aGlzLmludGVycG9sYXRvciA9IG51bGw7XG4gICAgX3RoaXMucXVldWUgPSBBcnJheS5pc0FycmF5KF90aGlzLnByb3BzLmRhdGEpID8gX3RoaXMucHJvcHMuZGF0YS5zbGljZSgxKSA6IFtdO1xuICAgIC8qIGJ1aWxkIGVhc2luZyBmdW5jdGlvbiAqL1xuXG4gICAgX3RoaXMuZWFzZSA9IGQzRWFzZVtfdGhpcy50b05ld05hbWUoX3RoaXMucHJvcHMuZWFzaW5nKV07XG4gICAgLypcbiAgICAgIFRoZXJlIGlzIG5vIGF1dG9iaW5kaW5nIG9mIHRoaXMgaW4gRVM2IGNsYXNzZXNcbiAgICAgIHNvIHdlIGJpbmQgZnVuY3Rpb25Ub0JlUnVuRWFjaEZyYW1lIHRvIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdmljdG9yeSBhbmltYXRpb24gY2xhc3NcbiAgICAqL1xuXG4gICAgX3RoaXMuZnVuY3Rpb25Ub0JlUnVuRWFjaEZyYW1lID0gX3RoaXMuZnVuY3Rpb25Ub0JlUnVuRWFjaEZyYW1lLmJpbmQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIF90aGlzLnRpbWVyID0gX3RoaXMuY29udGV4dC5hbmltYXRpb25UaW1lcjtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVmljdG9yeUFuaW1hdGlvbiwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAvLyBMZW5ndGggY2hlY2sgcHJldmVudHMgdXMgZnJvbSB0cmlnZ2VyaW5nIGBvbkVuZGAgaW4gYHRyYXZlcnNlUXVldWVgLlxuICAgICAgaWYgKHRoaXMucXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMudHJhdmVyc2VRdWV1ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgdmFyIGVxdWFsUHJvcHMgPSBpc0VxdWFsKHRoaXMucHJvcHMsIHByZXZQcm9wcyk7XG5cbiAgICAgIGlmICghZXF1YWxQcm9wcykge1xuICAgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgYW5pbWF0aW9uIGRpZG4ndCBmaW5pc2gsIGZvcmNlIGl0IHRvIGNvbXBsZXRlIGJlZm9yZSBzdGFydGluZyBhIG5ldyBvbmUgKi9cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJwb2xhdG9yICYmIHRoaXMuc3RhdGUuYW5pbWF0aW9uSW5mbyAmJiB0aGlzLnN0YXRlLmFuaW1hdGlvbkluZm8ucHJvZ3Jlc3MgPCAxKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWRpZC11cGRhdGUtc2V0LXN0YXRlXG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBkYXRhOiB0aGlzLmludGVycG9sYXRvcigxKSxcbiAgICAgICAgICAgIGFuaW1hdGlvbkluZm86IHtcbiAgICAgICAgICAgICAgcHJvZ3Jlc3M6IDEsXG4gICAgICAgICAgICAgIGFuaW1hdGluZzogZmFsc2UsXG4gICAgICAgICAgICAgIHRlcm1pbmF0aW5nOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyogY2FuY2VsIGV4aXN0aW5nIGxvb3AgaWYgaXQgZXhpc3RzICovXG4gICAgICAgICAgdGhpcy50aW1lci51bnN1YnNjcmliZSh0aGlzLmxvb3BJRCk7XG4gICAgICAgICAgLyogSWYgYW4gb2JqZWN0IHdhcyBzdXBwbGllZCAqL1xuXG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMucHJvcHMuZGF0YSkpIHtcbiAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIHR3ZWVuIHF1ZXVlLiBDb3VsZCBzZXQgYHRoaXMucXVldWUgPSBbbmV4dFByb3BzLmRhdGFdYCxcbiAgICAgICAgICAgIC8vIGJ1dCBsZXQncyByZXVzZSB0aGUgc2FtZSBhcnJheS5cbiAgICAgICAgICAgIHRoaXMucXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIHRoaXMucXVldWUucHVzaCh0aGlzLnByb3BzLmRhdGEpO1xuICAgICAgICAgICAgLyogSWYgYW4gYXJyYXkgd2FzIHN1cHBsaWVkICovXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBfcXVldWU7XG5cbiAgICAgICAgICAgIC8qIEV4dGVuZCB0aGUgdHdlZW4gcXVldWUgKi9cbiAgICAgICAgICAgIChfcXVldWUgPSB0aGlzLnF1ZXVlKS5wdXNoLmFwcGx5KF9xdWV1ZSwgX3RvQ29uc3VtYWJsZUFycmF5KHRoaXMucHJvcHMuZGF0YSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBTdGFydCB0cmF2ZXJzaW5nIHRoZSB0d2VlbiBxdWV1ZSAqL1xuXG5cbiAgICAgICAgICB0aGlzLnRyYXZlcnNlUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLmxvb3BJRCkge1xuICAgICAgICB0aGlzLnRpbWVyLnVuc3Vic2NyaWJlKHRoaXMubG9vcElEKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGltZXIuc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b05ld05hbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9OZXdOYW1lKGVhc2UpIHtcbiAgICAgIC8vIGQzLWVhc2UgY2hhbmdlZCB0aGUgbmFtaW5nIHNjaGVtZSBmb3IgZWFzZSBmcm9tIFwibGluZWFyXCIgLT4gXCJlYXNlTGluZWFyXCIgZXRjLlxuICAgICAgdmFyIGNhcGl0YWxpemUgPSBmdW5jdGlvbiAocykge1xuICAgICAgICByZXR1cm4gcyAmJiBzWzBdLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFwiZWFzZVwiLmNvbmNhdChjYXBpdGFsaXplKGVhc2UpKTtcbiAgICB9XG4gICAgLyogVHJhdmVyc2UgdGhlIHR3ZWVuIHF1ZXVlICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ0cmF2ZXJzZVF1ZXVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRyYXZlcnNlUXVldWUoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMucXVldWUubGVuZ3RoKSB7XG4gICAgICAgIC8qIEdldCB0aGUgbmV4dCBpbmRleCAqL1xuICAgICAgICB2YXIgZGF0YSA9IHRoaXMucXVldWVbMF07XG4gICAgICAgIC8qIGNvbXBhcmUgY2FjaGVkIHZlcnNpb24gdG8gbmV4dCBwcm9wcyAqL1xuXG4gICAgICAgIHRoaXMuaW50ZXJwb2xhdG9yID0gdmljdG9yeUludGVycG9sYXRvcih0aGlzLnN0YXRlLmRhdGEsIGRhdGEpO1xuICAgICAgICAvKiByZXNldCBzdGVwIHRvIHplcm8gKi9cblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5kZWxheSkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMyLmxvb3BJRCA9IF90aGlzMi50aW1lci5zdWJzY3JpYmUoX3RoaXMyLmZ1bmN0aW9uVG9CZVJ1bkVhY2hGcmFtZSwgX3RoaXMyLnByb3BzLmR1cmF0aW9uKTtcbiAgICAgICAgICB9LCB0aGlzLnByb3BzLmRlbGF5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvb3BJRCA9IHRoaXMudGltZXIuc3Vic2NyaWJlKHRoaXMuZnVuY3Rpb25Ub0JlUnVuRWFjaEZyYW1lLCB0aGlzLnByb3BzLmR1cmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLm9uRW5kKSB7XG4gICAgICAgIHRoaXMucHJvcHMub25FbmQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogZXZlcnkgZnJhbWUgd2UuLi4gKi9cblxuICB9LCB7XG4gICAga2V5OiBcImZ1bmN0aW9uVG9CZVJ1bkVhY2hGcmFtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmdW5jdGlvblRvQmVSdW5FYWNoRnJhbWUoZWxhcHNlZCwgZHVyYXRpb24pIHtcbiAgICAgIC8qXG4gICAgICAgIHN0ZXAgY2FuIGdlbmVyYXRlIGltcHJlY2lzZSB2YWx1ZXMsIHNvbWV0aW1lcyBncmVhdGVyIHRoYW4gMVxuICAgICAgICBpZiB0aGlzIGhhcHBlbnMgc2V0IHRoZSBzdGF0ZSB0byAxIGFuZCByZXR1cm4sIGNhbmNlbGxpbmcgdGhlIHRpbWVyXG4gICAgICAqL1xuICAgICAgZHVyYXRpb24gPSBkdXJhdGlvbiAhPT0gdW5kZWZpbmVkID8gZHVyYXRpb24gOiB0aGlzLnByb3BzLmR1cmF0aW9uO1xuICAgICAgdmFyIHN0ZXAgPSBkdXJhdGlvbiA/IGVsYXBzZWQgLyBkdXJhdGlvbiA6IDE7XG5cbiAgICAgIGlmIChzdGVwID49IDEpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZGF0YTogdGhpcy5pbnRlcnBvbGF0b3IoMSksXG4gICAgICAgICAgYW5pbWF0aW9uSW5mbzoge1xuICAgICAgICAgICAgcHJvZ3Jlc3M6IDEsXG4gICAgICAgICAgICBhbmltYXRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgdGVybWluYXRpbmc6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmxvb3BJRCkge1xuICAgICAgICAgIHRoaXMudGltZXIudW5zdWJzY3JpYmUodGhpcy5sb29wSUQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICB0aGlzLnRyYXZlcnNlUXVldWUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLypcbiAgICAgICAgaWYgd2UncmUgbm90IGF0IHRoZSBlbmQgb2YgdGhlIHRpbWVyLCBzZXQgdGhlIHN0YXRlIGJ5IHBhc3NpbmdcbiAgICAgICAgY3VycmVudCBzdGVwIHZhbHVlIHRoYXQncyB0cmFuc2Zvcm1lZCBieSB0aGUgZWFzZSBmdW5jdGlvbiB0byB0aGVcbiAgICAgICAgaW50ZXJwb2xhdG9yLCB3aGljaCBpcyBjYWNoZWQgZm9yIHBlcmZvcm1hbmNlIHdoZW5ldmVyIHByb3BzIGFyZSByZWNlaXZlZFxuICAgICAgKi9cblxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZGF0YTogdGhpcy5pbnRlcnBvbGF0b3IodGhpcy5lYXNlKHN0ZXApKSxcbiAgICAgICAgYW5pbWF0aW9uSW5mbzoge1xuICAgICAgICAgIHByb2dyZXNzOiBzdGVwLFxuICAgICAgICAgIGFuaW1hdGluZzogc3RlcCA8IDFcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbih0aGlzLnN0YXRlLmRhdGEsIHRoaXMuc3RhdGUuYW5pbWF0aW9uSW5mbyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFZpY3RvcnlBbmltYXRpb247XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5QW5pbWF0aW9uLCBcImRpc3BsYXlOYW1lXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFwiVmljdG9yeUFuaW1hdGlvblwiXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5QW5pbWF0aW9uLCBcInByb3BUeXBlc1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiB7XG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5mdW5jLFxuICAgIGRhdGE6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vYmplY3QsIFByb3BUeXBlcy5hcnJheV0pLFxuICAgIGRlbGF5OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGR1cmF0aW9uOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGVhc2luZzogUHJvcFR5cGVzLm9uZU9mKFtcImJhY2tcIiwgXCJiYWNrSW5cIiwgXCJiYWNrT3V0XCIsIFwiYmFja0luT3V0XCIsIFwiYm91bmNlXCIsIFwiYm91bmNlSW5cIiwgXCJib3VuY2VPdXRcIiwgXCJib3VuY2VJbk91dFwiLCBcImNpcmNsZVwiLCBcImNpcmNsZUluXCIsIFwiY2lyY2xlT3V0XCIsIFwiY2lyY2xlSW5PdXRcIiwgXCJsaW5lYXJcIiwgXCJsaW5lYXJJblwiLCBcImxpbmVhck91dFwiLCBcImxpbmVhckluT3V0XCIsIFwiY3ViaWNcIiwgXCJjdWJpY0luXCIsIFwiY3ViaWNPdXRcIiwgXCJjdWJpY0luT3V0XCIsIFwiZWxhc3RpY1wiLCBcImVsYXN0aWNJblwiLCBcImVsYXN0aWNPdXRcIiwgXCJlbGFzdGljSW5PdXRcIiwgXCJleHBcIiwgXCJleHBJblwiLCBcImV4cE91dFwiLCBcImV4cEluT3V0XCIsIFwicG9seVwiLCBcInBvbHlJblwiLCBcInBvbHlPdXRcIiwgXCJwb2x5SW5PdXRcIiwgXCJxdWFkXCIsIFwicXVhZEluXCIsIFwicXVhZE91dFwiLCBcInF1YWRJbk91dFwiLCBcInNpblwiLCBcInNpbkluXCIsIFwic2luT3V0XCIsIFwic2luSW5PdXRcIl0pLFxuICAgIG9uRW5kOiBQcm9wVHlwZXMuZnVuY1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5QW5pbWF0aW9uLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiB7XG4gICAgZGF0YToge30sXG4gICAgZGVsYXk6IDAsXG4gICAgZHVyYXRpb246IDEwMDAsXG4gICAgZWFzaW5nOiBcInF1YWRJbk91dFwiXG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlBbmltYXRpb24sIFwiY29udGV4dFR5cGVcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogVGltZXJDb250ZXh0XG59KTtcbmV4cG9ydCB7IFZpY3RvcnlBbmltYXRpb24gYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfaXNPYmplY3QgZnJvbSBcImxvZGFzaC9pc09iamVjdFwiO1xuaW1wb3J0IF9waWNrIGZyb20gXCJsb2Rhc2gvcGlja1wiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gvaXNGdW5jdGlvblwiO1xuaW1wb3J0IF9kZWZhdWx0cyBmcm9tIFwibG9kYXNoL2RlZmF1bHRzXCI7XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IFZpY3RvcnlBbmltYXRpb24gZnJvbSBcIi4uL3ZpY3RvcnktYW5pbWF0aW9uL3ZpY3RvcnktYW5pbWF0aW9uXCI7XG5pbXBvcnQgKiBhcyBDb2xsZWN0aW9uIGZyb20gXCIuLi92aWN0b3J5LXV0aWwvY29sbGVjdGlvblwiO1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tIFwiLi4vdmljdG9yeS11dGlsL2hlbHBlcnNcIjtcbmltcG9ydCBUaW1lckNvbnRleHQgZnJvbSBcIi4uL3ZpY3RvcnktdXRpbC90aW1lci1jb250ZXh0XCI7XG5pbXBvcnQgKiBhcyBUcmFuc2l0aW9ucyBmcm9tIFwiLi4vdmljdG9yeS11dGlsL3RyYW5zaXRpb25zXCI7XG5pbXBvcnQgaXNFcXVhbCBmcm9tIFwicmVhY3QtZmFzdC1jb21wYXJlXCI7XG5cbnZhciBWaWN0b3J5VHJhbnNpdGlvbiA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoVmljdG9yeVRyYW5zaXRpb24sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFZpY3RvcnlUcmFuc2l0aW9uKHByb3BzLCBjb250ZXh0KSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFZpY3RvcnlUcmFuc2l0aW9uKTtcblxuICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKFZpY3RvcnlUcmFuc2l0aW9uLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoVmljdG9yeVRyYW5zaXRpb24pKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBub2Rlc1Nob3VsZExvYWQ6IGZhbHNlLFxuICAgICAgbm9kZXNEb25lTG9hZDogZmFsc2VcbiAgICB9O1xuICAgIHZhciBjaGlsZCA9IF90aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIHZhciBwb2xhciA9IGNoaWxkLnByb3BzLnBvbGFyO1xuICAgIF90aGlzLmNvbnRpbnVvdXMgPSAhcG9sYXIgJiYgY2hpbGQudHlwZSAmJiBjaGlsZC50eXBlLmNvbnRpbnVvdXMgPT09IHRydWU7XG4gICAgX3RoaXMuZ2V0VHJhbnNpdGlvblN0YXRlID0gX3RoaXMuZ2V0VHJhbnNpdGlvblN0YXRlLmJpbmQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIF90aGlzLnRpbWVyID0gX3RoaXMuY29udGV4dC50cmFuc2l0aW9uVGltZXI7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFZpY3RvcnlUcmFuc2l0aW9uLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBub2Rlc1Nob3VsZExvYWQ6IHRydWVcbiAgICAgIH0pOyAvL2VzbGludC1kaXNhYmxlLWxpbmUgcmVhY3Qvbm8tZGlkLW1vdW50LXNldC1zdGF0ZVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaG91bGRDb21wb25lbnRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmICghaXNFcXVhbCh0aGlzLnByb3BzLCBuZXh0UHJvcHMpKSB7XG4gICAgICAgIHRoaXMudGltZXIuYnlwYXNzQW5pbWF0aW9uKCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUodGhpcy5nZXRUcmFuc2l0aW9uU3RhdGUodGhpcy5wcm9wcywgbmV4dFByb3BzKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIudGltZXIucmVzdW1lQW5pbWF0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLnRpbWVyLnN0b3AoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0VHJhbnNpdGlvblN0YXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRyYW5zaXRpb25TdGF0ZShwcm9wcywgbmV4dFByb3BzKSB7XG4gICAgICB2YXIgYW5pbWF0ZSA9IHByb3BzLmFuaW1hdGU7XG5cbiAgICAgIGlmICghYW5pbWF0ZSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9IGVsc2UgaWYgKGFuaW1hdGUucGFyZW50U3RhdGUpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gYW5pbWF0ZS5wYXJlbnRTdGF0ZTtcbiAgICAgICAgdmFyIG9sZFByb3BzID0gc3RhdGUubm9kZXNXaWxsRXhpdCA/IHByb3BzIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvbGRQcm9wczogb2xkUHJvcHMsXG4gICAgICAgICAgbmV4dFByb3BzOiBuZXh0UHJvcHNcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBvbGRDaGlsZHJlbiA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkocHJvcHMuY2hpbGRyZW4pO1xuICAgICAgICB2YXIgbmV4dENoaWxkcmVuID0gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShuZXh0UHJvcHMuY2hpbGRyZW4pO1xuXG4gICAgICAgIHZhciBfVHJhbnNpdGlvbnMkZ2V0SW5pdGkgPSBUcmFuc2l0aW9ucy5nZXRJbml0aWFsVHJhbnNpdGlvblN0YXRlKG9sZENoaWxkcmVuLCBuZXh0Q2hpbGRyZW4pLFxuICAgICAgICAgICAgbm9kZXNXaWxsRXhpdCA9IF9UcmFuc2l0aW9ucyRnZXRJbml0aS5ub2Rlc1dpbGxFeGl0LFxuICAgICAgICAgICAgbm9kZXNXaWxsRW50ZXIgPSBfVHJhbnNpdGlvbnMkZ2V0SW5pdGkubm9kZXNXaWxsRW50ZXIsXG4gICAgICAgICAgICBjaGlsZHJlblRyYW5zaXRpb25zID0gX1RyYW5zaXRpb25zJGdldEluaXRpLmNoaWxkcmVuVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICBub2Rlc1Nob3VsZEVudGVyID0gX1RyYW5zaXRpb25zJGdldEluaXRpLm5vZGVzU2hvdWxkRW50ZXI7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2Rlc1dpbGxFeGl0OiBub2Rlc1dpbGxFeGl0LFxuICAgICAgICAgIG5vZGVzV2lsbEVudGVyOiBub2Rlc1dpbGxFbnRlcixcbiAgICAgICAgICBjaGlsZHJlblRyYW5zaXRpb25zOiBjaGlsZHJlblRyYW5zaXRpb25zLFxuICAgICAgICAgIG5vZGVzU2hvdWxkRW50ZXI6IG5vZGVzU2hvdWxkRW50ZXIsXG4gICAgICAgICAgb2xkUHJvcHM6IG5vZGVzV2lsbEV4aXQgPyBwcm9wcyA6IG51bGwsXG4gICAgICAgICAgbmV4dFByb3BzOiBuZXh0UHJvcHNcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RG9tYWluRnJvbUNoaWxkcmVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERvbWFpbkZyb21DaGlsZHJlbihwcm9wcywgYXhpcykge1xuICAgICAgdmFyIGdldENoaWxkRG9tYWlucyA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAgICAgICByZXR1cm4gY2hpbGRyZW4ucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBjaGlsZCkge1xuICAgICAgICAgIGlmIChjaGlsZC50eXBlICYmIF9pc0Z1bmN0aW9uKGNoaWxkLnR5cGUuZ2V0RG9tYWluKSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkRG9tYWluID0gY2hpbGQucHJvcHMgJiYgY2hpbGQudHlwZS5nZXREb21haW4oY2hpbGQucHJvcHMsIGF4aXMpO1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkRG9tYWluID8gbWVtby5jb25jYXQoY2hpbGREb21haW4pIDogbWVtbztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLnByb3BzICYmIGNoaWxkLnByb3BzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVtby5jb25jYXQoZ2V0Q2hpbGREb21haW5zKFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGQucHJvcHMuY2hpbGRyZW4pKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICAgIH0sIFtdKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBjaGlsZCA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkocHJvcHMuY2hpbGRyZW4pWzBdO1xuICAgICAgdmFyIGNoaWxkUHJvcHMgPSBjaGlsZC5wcm9wcyB8fCB7fTtcbiAgICAgIHZhciBkb21haW4gPSBBcnJheS5pc0FycmF5KGNoaWxkUHJvcHMuZG9tYWluKSA/IGNoaWxkUHJvcHMuZG9tYWluIDogY2hpbGRQcm9wcy5kb21haW4gJiYgY2hpbGRQcm9wcy5kb21haW5bYXhpc107XG5cbiAgICAgIGlmICghY2hpbGRQcm9wcy5jaGlsZHJlbiAmJiBkb21haW4pIHtcbiAgICAgICAgcmV0dXJuIGRvbWFpbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBjaGlsZERvbWFpbnMgPSBnZXRDaGlsZERvbWFpbnMoW2NoaWxkXSk7XG4gICAgICAgIHJldHVybiBjaGlsZERvbWFpbnMubGVuZ3RoID09PSAwID8gWzAsIDFdIDogW0NvbGxlY3Rpb24uZ2V0TWluVmFsdWUoY2hpbGREb21haW5zKSwgQ29sbGVjdGlvbi5nZXRNYXhWYWx1ZShjaGlsZERvbWFpbnMpXTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGlja1Byb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBpY2tQcm9wcygpIHtcbiAgICAgIGlmICghdGhpcy5zdGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUubm9kZXNXaWxsRXhpdCA/IHRoaXMuc3RhdGUub2xkUHJvcHMgfHwgdGhpcy5wcm9wcyA6IHRoaXMucHJvcHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBpY2tEb21haW5Qcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwaWNrRG9tYWluUHJvcHMocHJvcHMpIHtcbiAgICAgIHZhciBwYXJlbnRTdGF0ZSA9IF9pc09iamVjdChwcm9wcy5hbmltYXRlKSAmJiBwcm9wcy5hbmltYXRlLnBhcmVudFN0YXRlO1xuXG4gICAgICBpZiAocGFyZW50U3RhdGUgJiYgcGFyZW50U3RhdGUubm9kZXNXaWxsRXhpdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250aW5vdXMgfHwgcGFyZW50U3RhdGUuY29udGludW91cyA/IHBhcmVudFN0YXRlLm5leHRQcm9wcyB8fCB0aGlzLnN0YXRlLm5leHRQcm9wcyB8fCBwcm9wcyA6IHByb3BzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb250aW51b3VzICYmIHRoaXMuc3RhdGUubm9kZXNXaWxsRXhpdCA/IHRoaXMuc3RhdGUubmV4dFByb3BzIHx8IHByb3BzIDogcHJvcHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldENsaXBXaWR0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDbGlwV2lkdGgocHJvcHMsIGNoaWxkKSB7XG4gICAgICB2YXIgZ2V0RGVmYXVsdENsaXBXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJhbmdlID0gSGVscGVycy5nZXRSYW5nZShjaGlsZC5wcm9wcywgXCJ4XCIpO1xuICAgICAgICByZXR1cm4gcmFuZ2UgPyBNYXRoLmFicyhyYW5nZVsxXSAtIHJhbmdlWzBdKSA6IHByb3BzLndpZHRoO1xuICAgICAgfTtcblxuICAgICAgdmFyIGNsaXBXaWR0aCA9IHRoaXMudHJhbnNpdGlvblByb3BzID8gdGhpcy50cmFuc2l0aW9uUHJvcHMuY2xpcFdpZHRoIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGNsaXBXaWR0aCAhPT0gdW5kZWZpbmVkID8gY2xpcFdpZHRoIDogZ2V0RGVmYXVsdENsaXBXaWR0aCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBwcm9wcyA9IHRoaXMucGlja1Byb3BzKCk7XG4gICAgICB2YXIgZ2V0VHJhbnNpdGlvblByb3BzID0gX2lzT2JqZWN0KHRoaXMucHJvcHMuYW5pbWF0ZSkgJiYgdGhpcy5wcm9wcy5hbmltYXRlLmdldFRyYW5zaXRpb25zID8gdGhpcy5wcm9wcy5hbmltYXRlLmdldFRyYW5zaXRpb25zIDogVHJhbnNpdGlvbnMuZ2V0VHJhbnNpdGlvblByb3BzRmFjdG9yeShwcm9wcywgdGhpcy5zdGF0ZSwgZnVuY3Rpb24gKG5ld1N0YXRlKSB7XG4gICAgICAgIHJldHVybiBfdGhpczMuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgICAgfSk7XG4gICAgICB2YXIgY2hpbGQgPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KHByb3BzLmNoaWxkcmVuKVswXTtcbiAgICAgIHZhciB0cmFuc2l0aW9uUHJvcHMgPSBnZXRUcmFuc2l0aW9uUHJvcHMoY2hpbGQpO1xuICAgICAgdGhpcy50cmFuc2l0aW9uUHJvcHMgPSB0cmFuc2l0aW9uUHJvcHM7XG4gICAgICB2YXIgZG9tYWluID0ge1xuICAgICAgICB4OiB0aGlzLmdldERvbWFpbkZyb21DaGlsZHJlbih0aGlzLnBpY2tEb21haW5Qcm9wcyhwcm9wcyksIFwieFwiKSxcbiAgICAgICAgeTogdGhpcy5nZXREb21haW5Gcm9tQ2hpbGRyZW4ocHJvcHMsIFwieVwiKVxuICAgICAgfTtcbiAgICAgIHZhciBjbGlwV2lkdGggPSB0aGlzLmdldENsaXBXaWR0aChwcm9wcywgY2hpbGQpO1xuXG4gICAgICB2YXIgY29tYmluZWRQcm9wcyA9IF9kZWZhdWx0cyh7XG4gICAgICAgIGRvbWFpbjogZG9tYWluLFxuICAgICAgICBjbGlwV2lkdGg6IGNsaXBXaWR0aFxuICAgICAgfSwgdHJhbnNpdGlvblByb3BzLCBjaGlsZC5wcm9wcyk7XG5cbiAgICAgIHZhciBhbmltYXRpb25XaGl0ZWxpc3QgPSBwcm9wcy5hbmltYXRpb25XaGl0ZWxpc3QgfHwgW107XG4gICAgICB2YXIgd2hpdGVsaXN0ID0gYW5pbWF0aW9uV2hpdGVsaXN0LmNvbmNhdChbXCJjbGlwV2lkdGhcIl0pO1xuICAgICAgdmFyIHByb3BzVG9BbmltYXRlID0gd2hpdGVsaXN0Lmxlbmd0aCA/IF9waWNrKGNvbWJpbmVkUHJvcHMsIHdoaXRlbGlzdCkgOiBjb21iaW5lZFByb3BzO1xuICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUFuaW1hdGlvbiwgX2V4dGVuZHMoe30sIGNvbWJpbmVkUHJvcHMuYW5pbWF0ZSwge1xuICAgICAgICBkYXRhOiBwcm9wc1RvQW5pbWF0ZVxuICAgICAgfSksIGZ1bmN0aW9uIChuZXdQcm9wcykge1xuICAgICAgICBpZiAoY2hpbGQucHJvcHMuZ3JvdXBDb21wb25lbnQpIHtcbiAgICAgICAgICB2YXIgZ3JvdXBDb21wb25lbnQgPSBfdGhpczMuY29udGludW91cyA/IFJlYWN0LmNsb25lRWxlbWVudChjaGlsZC5wcm9wcy5ncm91cENvbXBvbmVudCwge1xuICAgICAgICAgICAgY2xpcFdpZHRoOiBuZXdQcm9wcy5jbGlwV2lkdGggfHwgMFxuICAgICAgICAgIH0pIDogY2hpbGQucHJvcHMuZ3JvdXBDb21wb25lbnQ7XG4gICAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChjaGlsZCwgX2RlZmF1bHRzKHtcbiAgICAgICAgICAgIGFuaW1hdGU6IG51bGwsXG4gICAgICAgICAgICBhbmltYXRpbmc6IHRydWUsXG4gICAgICAgICAgICBncm91cENvbXBvbmVudDogZ3JvdXBDb21wb25lbnRcbiAgICAgICAgICB9LCBuZXdQcm9wcywgY29tYmluZWRQcm9wcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChjaGlsZCwgX2RlZmF1bHRzKHtcbiAgICAgICAgICBhbmltYXRlOiBudWxsLFxuICAgICAgICAgIGFuaW1hdGluZzogdHJ1ZVxuICAgICAgICB9LCBuZXdQcm9wcywgY29tYmluZWRQcm9wcykpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFZpY3RvcnlUcmFuc2l0aW9uO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVRyYW5zaXRpb24sIFwiZGlzcGxheU5hbWVcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogXCJWaWN0b3J5VHJhbnNpdGlvblwiXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5VHJhbnNpdGlvbiwgXCJwcm9wVHlwZXNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZToge1xuICAgIGFuaW1hdGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub2JqZWN0XSksXG4gICAgYW5pbWF0aW9uV2hpdGVsaXN0OiBQcm9wVHlwZXMuYXJyYXksXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlXG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlUcmFuc2l0aW9uLCBcImNvbnRleHRUeXBlXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFRpbWVyQ29udGV4dFxufSk7XG5leHBvcnQgeyBWaWN0b3J5VHJhbnNpdGlvbiBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9kaWZmZXJlbmNlIGZyb20gXCJsb2Rhc2gvZGlmZmVyZW5jZVwiO1xuaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoL2lzTmlsXCI7XG5pbXBvcnQgX2lzRW1wdHkgZnJvbSBcImxvZGFzaC9pc0VtcHR5XCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC93aXRob3V0XCI7XG5pbXBvcnQgX3BpY2sgZnJvbSBcImxvZGFzaC9waWNrXCI7XG5pbXBvcnQgX2lzRnVuY3Rpb24gZnJvbSBcImxvZGFzaC9pc0Z1bmN0aW9uXCI7XG5pbXBvcnQgX2tleXMgZnJvbSBcImxvZGFzaC9rZXlzXCI7XG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuaW1wb3J0IF9kZWZhdWx0cyBmcm9tIFwibG9kYXNoL2RlZmF1bHRzXCI7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuLypnbG9iYWwgd2luZG93OmZhbHNlICovXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSBcIi4vZXZlbnRzXCI7XG5pbXBvcnQgaXNFcXVhbCBmcm9tIFwicmVhY3QtZmFzdC1jb21wYXJlXCI7XG5pbXBvcnQgVmljdG9yeVRyYW5zaXRpb24gZnJvbSBcIi4uL3ZpY3RvcnktdHJhbnNpdGlvbi92aWN0b3J5LXRyYW5zaXRpb25cIjtcblxudmFyIGRhdHVtSGFzWGFuZFkgPSBmdW5jdGlvbiAoZGF0dW0pIHtcbiAgcmV0dXJuICFfaXNOaWwoZGF0dW0uX3gpICYmICFfaXNOaWwoZGF0dW0uX3kpO1xufTsgLy8gIHVzZWQgZm9yIGNoZWNraW5nIHN0YXRlIGNoYW5nZXMuIEV4cGVjdGVkIGNvbXBvbmVudHMgY2FuIGJlIHBhc3NlZCBpbiB2aWEgb3B0aW9uc1xuXG5cbnZhciBkZWZhdWx0Q29tcG9uZW50cyA9IFt7XG4gIG5hbWU6IFwicGFyZW50XCIsXG4gIGluZGV4OiBcInBhcmVudFwiXG59LCB7XG4gIG5hbWU6IFwiZGF0YVwiXG59LCB7XG4gIG5hbWU6IFwibGFiZWxzXCJcbn1dO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChXcmFwcGVkQ29tcG9uZW50LCBvcHRpb25zKSB7XG4gIHJldHVybiAoXG4gICAgLyojX19QVVJFX18qL1xuICAgIGZ1bmN0aW9uIChfV3JhcHBlZENvbXBvbmVudCkge1xuICAgICAgX2luaGVyaXRzKGFkZEV2ZW50cywgX1dyYXBwZWRDb21wb25lbnQpO1xuXG4gICAgICBmdW5jdGlvbiBhZGRFdmVudHMocHJvcHMpIHtcbiAgICAgICAgdmFyIF90aGlzO1xuXG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBhZGRFdmVudHMpO1xuXG4gICAgICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKGFkZEV2ZW50cy5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKGFkZEV2ZW50cykpLmNhbGwodGhpcywgcHJvcHMpKTtcbiAgICAgICAgdmFyIGdldFNjb3BlZEV2ZW50cyA9IEV2ZW50cy5nZXRTY29wZWRFdmVudHMuYmluZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgICAgIHZhciBib3VuZEdldEV2ZW50cyA9IEV2ZW50cy5nZXRFdmVudHMuYmluZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgICAgIF90aGlzLnN0YXRlID0ge307XG5cbiAgICAgICAgX3RoaXMuZ2V0RXZlbnRzID0gZnVuY3Rpb24gKHAsIHRhcmdldCwgZXZlbnRLZXkpIHtcbiAgICAgICAgICByZXR1cm4gYm91bmRHZXRFdmVudHMocCwgdGFyZ2V0LCBldmVudEtleSwgZ2V0U2NvcGVkRXZlbnRzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBfdGhpcy5nZXRFdmVudFN0YXRlID0gRXZlbnRzLmdldEV2ZW50U3RhdGUuYmluZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG5cbiAgICAgICAgdmFyIGNhbGN1bGF0ZWRWYWx1ZXMgPSBfdGhpcy5nZXRDYWxjdWxhdGVkVmFsdWVzKHByb3BzKTtcblxuICAgICAgICBfdGhpcy5jYWNoZVZhbHVlcyhjYWxjdWxhdGVkVmFsdWVzKTtcblxuICAgICAgICBfdGhpcy5leHRlcm5hbE11dGF0aW9ucyA9IF90aGlzLmdldEV4dGVybmFsTXV0YXRpb25zKHByb3BzKTtcbiAgICAgICAgX3RoaXMuY2FsY3VsYXRlZFN0YXRlID0gX3RoaXMuZ2V0U3RhdGVDaGFuZ2VzKHByb3BzKTtcbiAgICAgICAgX3RoaXMuZ2xvYmFsRXZlbnRzID0ge307XG4gICAgICAgIF90aGlzLnByZXZHbG9iYWxFdmVudEtleXMgPSBbXTtcbiAgICAgICAgX3RoaXMuYm91bmRHbG9iYWxFdmVudHMgPSB7fTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgICAgfVxuXG4gICAgICBfY3JlYXRlQ2xhc3MoYWRkRXZlbnRzLCBbe1xuICAgICAgICBrZXk6IFwic2hvdWxkQ29tcG9uZW50VXBkYXRlXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICAgICAgdmFyIGV4dGVybmFsTXV0YXRpb25zID0gdGhpcy5nZXRFeHRlcm5hbE11dGF0aW9ucyhuZXh0UHJvcHMpO1xuICAgICAgICAgIHZhciBhbmltYXRpbmcgPSB0aGlzLnByb3BzLmFuaW1hdGluZyB8fCB0aGlzLnByb3BzLmFuaW1hdGU7XG4gICAgICAgICAgdmFyIG5ld011dGF0aW9uID0gIWlzRXF1YWwoZXh0ZXJuYWxNdXRhdGlvbnMsIHRoaXMuZXh0ZXJuYWxNdXRhdGlvbnMpO1xuXG4gICAgICAgICAgaWYgKGFuaW1hdGluZyB8fCBuZXdNdXRhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVZhbHVlcyh0aGlzLmdldENhbGN1bGF0ZWRWYWx1ZXMobmV4dFByb3BzKSk7XG4gICAgICAgICAgICB0aGlzLmV4dGVybmFsTXV0YXRpb25zID0gZXh0ZXJuYWxNdXRhdGlvbnM7XG4gICAgICAgICAgICB0aGlzLmFwcGx5RXh0ZXJuYWxNdXRhdGlvbnMobmV4dFByb3BzLCBleHRlcm5hbE11dGF0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY2FsY3VsYXRlZFN0YXRlID0gdGhpcy5nZXRTdGF0ZUNoYW5nZXMobmV4dFByb3BzKTtcblxuICAgICAgICAgIGlmICghaXNFcXVhbCh0aGlzLmNhbGN1bGF0ZWRTdGF0ZSwgY2FsY3VsYXRlZFN0YXRlKSkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVZhbHVlcyh0aGlzLmdldENhbGN1bGF0ZWRWYWx1ZXMobmV4dFByb3BzKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWlzRXF1YWwodGhpcy5wcm9wcywgbmV4dFByb3BzKSkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVZhbHVlcyh0aGlzLmdldENhbGN1bGF0ZWRWYWx1ZXMobmV4dFByb3BzKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICAgIHZhciBnbG9iYWxFdmVudEtleXMgPSBfa2V5cyh0aGlzLmdsb2JhbEV2ZW50cyk7XG5cbiAgICAgICAgICBnbG9iYWxFdmVudEtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMyLmFkZEdsb2JhbExpc3RlbmVyKGtleSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5wcmV2R2xvYmFsRXZlbnRLZXlzID0gZ2xvYmFsRXZlbnRLZXlzO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgICAgIHZhciBjYWxjdWxhdGVkU3RhdGUgPSB0aGlzLmdldFN0YXRlQ2hhbmdlcyhwcmV2UHJvcHMpO1xuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlZFN0YXRlID0gY2FsY3VsYXRlZFN0YXRlO1xuXG4gICAgICAgICAgdmFyIGdsb2JhbEV2ZW50S2V5cyA9IF9rZXlzKHRoaXMuZ2xvYmFsRXZlbnRzKTtcblxuICAgICAgICAgIHZhciByZW1vdmVkR2xvYmFsRXZlbnRLZXlzID0gX2RpZmZlcmVuY2UodGhpcy5wcmV2R2xvYmFsRXZlbnRLZXlzLCBnbG9iYWxFdmVudEtleXMpO1xuXG4gICAgICAgICAgcmVtb3ZlZEdsb2JhbEV2ZW50S2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMucmVtb3ZlR2xvYmFsTGlzdGVuZXIoa2V5KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZhciBhZGRlZEdsb2JhbEV2ZW50S2V5cyA9IF9kaWZmZXJlbmNlKGdsb2JhbEV2ZW50S2V5cywgdGhpcy5wcmV2R2xvYmFsRXZlbnRLZXlzKTtcblxuICAgICAgICAgIGFkZGVkR2xvYmFsRXZlbnRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5hZGRHbG9iYWxMaXN0ZW5lcihrZXkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucHJldkdsb2JhbEV2ZW50S2V5cyA9IGdsb2JhbEV2ZW50S2V5cztcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICAgICAgdGhpcy5wcmV2R2xvYmFsRXZlbnRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzNC5yZW1vdmVHbG9iYWxMaXN0ZW5lcihrZXkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJhZGRHbG9iYWxMaXN0ZW5lclwiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYWRkR2xvYmFsTGlzdGVuZXIoa2V5KSB7XG4gICAgICAgICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICAgICAgICB2YXIgYm91bmRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gX3RoaXM1Lmdsb2JhbEV2ZW50c1trZXldO1xuICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyICYmIGxpc3RlbmVyKEV2ZW50cy5lbXVsYXRlUmVhY3RFdmVudChldmVudCkpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0aGlzLmJvdW5kR2xvYmFsRXZlbnRzW2tleV0gPSBib3VuZExpc3RlbmVyO1xuICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEV2ZW50cy5nZXRHbG9iYWxFdmVudE5hbWVGcm9tS2V5KGtleSksIGJvdW5kTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJyZW1vdmVHbG9iYWxMaXN0ZW5lclwiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlR2xvYmFsTGlzdGVuZXIoa2V5KSB7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRXZlbnRzLmdldEdsb2JhbEV2ZW50TmFtZUZyb21LZXkoa2V5KSwgdGhpcy5ib3VuZEdsb2JhbEV2ZW50c1trZXldKTtcbiAgICAgICAgfSAvLyBjb21waWxlIGFsbCBzdGF0ZSBjaGFuZ2VzIGZyb20gb3duIGFuZCBwYXJlbnQgc3RhdGUuIE9yZGVyIGRvZXNuJ3QgbWF0dGVyLCBhcyBhbnkgc3RhdGVcbiAgICAgICAgLy8gc3RhdGUgY2hhbmdlIHNob3VsZCB0cmlnZ2VyIGEgcmUtcmVuZGVyXG5cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcImdldFN0YXRlQ2hhbmdlc1wiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U3RhdGVDaGFuZ2VzKHByb3BzKSB7XG4gICAgICAgICAgdmFyIF90aGlzNiA9IHRoaXM7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuaGFzRXZlbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGdldFN0YXRlID0gZnVuY3Rpb24gKGtleSwgdHlwZSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9kZWZhdWx0cyh7fSwgX3RoaXM2LmdldEV2ZW50U3RhdGUoa2V5LCB0eXBlKSwgX3RoaXM2LmdldFNoYXJlZEV2ZW50U3RhdGUoa2V5LCB0eXBlKSk7XG5cbiAgICAgICAgICAgIHJldHVybiBfaXNFbXB0eShyZXN1bHQpID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICB2YXIgY29tcG9uZW50cyA9IG9wdGlvbnMuY29tcG9uZW50cyB8fCBkZWZhdWx0Q29tcG9uZW50cztcbiAgICAgICAgICB2YXIgc3RhdGVDaGFuZ2VzID0gY29tcG9uZW50cy5tYXAoZnVuY3Rpb24gKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgaWYgKCFwcm9wcy5zdGFuZGFsb25lICYmIGNvbXBvbmVudC5uYW1lID09PSBcInBhcmVudFwiKSB7XG4gICAgICAgICAgICAgIC8vIGRvbid0IGNoZWNrIGZvciBjaGFuZ2VzIG9uIHBhcmVudCBwcm9wcyBmb3Igbm9uLXN0YW5kYWxvbmUgY29tcG9uZW50c1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5pbmRleCAhPT0gdW5kZWZpbmVkID8gZ2V0U3RhdGUoY29tcG9uZW50LmluZGV4LCBjb21wb25lbnQubmFtZSkgOiBfdGhpczYuZGF0YUtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3RhdGUoa2V5LCBjb21wb25lbnQubmFtZSk7XG4gICAgICAgICAgICAgIH0pLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlQ2hhbmdlcztcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBrZXk6IFwiYXBwbHlFeHRlcm5hbE11dGF0aW9uc1wiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHlFeHRlcm5hbE11dGF0aW9ucyhwcm9wcywgZXh0ZXJuYWxNdXRhdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIV9pc0VtcHR5KGV4dGVybmFsTXV0YXRpb25zKSkge1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrcyA9IHByb3BzLmV4dGVybmFsRXZlbnRNdXRhdGlvbnMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBtdXRhdGlvbikge1xuICAgICAgICAgICAgICBtZW1vID0gX2lzRnVuY3Rpb24obXV0YXRpb24uY2FsbGJhY2spID8gbWVtby5jb25jYXQobXV0YXRpb24uY2FsbGJhY2spIDogbWVtbztcbiAgICAgICAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICAgICAgICB9LCBbXSk7XG4gICAgICAgICAgICB2YXIgY29tcGlsZWRDYWxsYmFja3MgPSBjYWxsYmFja3MubGVuZ3RoID8gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBjYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoZXh0ZXJuYWxNdXRhdGlvbnMsIGNvbXBpbGVkQ2FsbGJhY2tzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcImdldENhbGN1bGF0ZWRWYWx1ZXNcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldENhbGN1bGF0ZWRWYWx1ZXMocHJvcHMpIHtcbiAgICAgICAgICB2YXIgc2hhcmVkRXZlbnRzID0gcHJvcHMuc2hhcmVkRXZlbnRzO1xuICAgICAgICAgIHZhciBjb21wb25lbnRzID0gV3JhcHBlZENvbXBvbmVudC5leHBlY3RlZENvbXBvbmVudHM7XG4gICAgICAgICAgdmFyIGNvbXBvbmVudEV2ZW50cyA9IEV2ZW50cy5nZXRDb21wb25lbnRFdmVudHMocHJvcHMsIGNvbXBvbmVudHMpO1xuICAgICAgICAgIHZhciBnZXRTaGFyZWRFdmVudFN0YXRlID0gc2hhcmVkRXZlbnRzICYmIF9pc0Z1bmN0aW9uKHNoYXJlZEV2ZW50cy5nZXRFdmVudFN0YXRlKSA/IHNoYXJlZEV2ZW50cy5nZXRFdmVudFN0YXRlIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhciBiYXNlUHJvcHMgPSB0aGlzLmdldEJhc2VQcm9wcyhwcm9wcywgZ2V0U2hhcmVkRXZlbnRTdGF0ZSk7XG5cbiAgICAgICAgICB2YXIgZGF0YUtleXMgPSBfa2V5cyhiYXNlUHJvcHMpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5ICE9PSBcInBhcmVudFwiO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdmFyIGhhc0V2ZW50cyA9IHByb3BzLmV2ZW50cyB8fCBwcm9wcy5zaGFyZWRFdmVudHMgfHwgY29tcG9uZW50RXZlbnRzO1xuICAgICAgICAgIHZhciBldmVudHMgPSB0aGlzLmdldEFsbEV2ZW50cyhwcm9wcyk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbXBvbmVudEV2ZW50czogY29tcG9uZW50RXZlbnRzLFxuICAgICAgICAgICAgZ2V0U2hhcmVkRXZlbnRTdGF0ZTogZ2V0U2hhcmVkRXZlbnRTdGF0ZSxcbiAgICAgICAgICAgIGJhc2VQcm9wczogYmFzZVByb3BzLFxuICAgICAgICAgICAgZGF0YUtleXM6IGRhdGFLZXlzLFxuICAgICAgICAgICAgaGFzRXZlbnRzOiBoYXNFdmVudHMsXG4gICAgICAgICAgICBldmVudHM6IGV2ZW50c1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAga2V5OiBcImdldEV4dGVybmFsTXV0YXRpb25zXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFeHRlcm5hbE11dGF0aW9ucyhwcm9wcykge1xuICAgICAgICAgIHZhciBzaGFyZWRFdmVudHMgPSBwcm9wcy5zaGFyZWRFdmVudHMsXG4gICAgICAgICAgICAgIGV4dGVybmFsRXZlbnRNdXRhdGlvbnMgPSBwcm9wcy5leHRlcm5hbEV2ZW50TXV0YXRpb25zO1xuICAgICAgICAgIHJldHVybiBfaXNFbXB0eShleHRlcm5hbEV2ZW50TXV0YXRpb25zKSB8fCBzaGFyZWRFdmVudHMgPyB1bmRlZmluZWQgOiBFdmVudHMuZ2V0RXh0ZXJuYWxNdXRhdGlvbnMoZXh0ZXJuYWxFdmVudE11dGF0aW9ucywgdGhpcy5iYXNlUHJvcHMsIHRoaXMuc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJjYWNoZVZhbHVlc1wiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gY2FjaGVWYWx1ZXMob2JqKSB7XG4gICAgICAgICAgdmFyIF90aGlzNyA9IHRoaXM7XG5cbiAgICAgICAgICBfa2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgX3RoaXM3W2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBrZXk6IFwiZ2V0QmFzZVByb3BzXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRCYXNlUHJvcHMocHJvcHMsIGdldFNoYXJlZEV2ZW50U3RhdGUpIHtcbiAgICAgICAgICBnZXRTaGFyZWRFdmVudFN0YXRlID0gZ2V0U2hhcmVkRXZlbnRTdGF0ZSB8fCB0aGlzLmdldFNoYXJlZEV2ZW50U3RhdGU7XG4gICAgICAgICAgdmFyIHNoYXJlZFBhcmVudFN0YXRlID0gZ2V0U2hhcmVkRXZlbnRTdGF0ZShcInBhcmVudFwiLCBcInBhcmVudFwiKTtcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGUgPSB0aGlzLmdldEV2ZW50U3RhdGUoXCJwYXJlbnRcIiwgXCJwYXJlbnRcIik7XG5cbiAgICAgICAgICB2YXIgYmFzZVBhcmVudFByb3BzID0gX2RlZmF1bHRzKHt9LCBwYXJlbnRTdGF0ZSwgc2hhcmVkUGFyZW50U3RhdGUpO1xuXG4gICAgICAgICAgdmFyIHBhcmVudFByb3BzTGlzdCA9IGJhc2VQYXJlbnRQcm9wcy5wYXJlbnRDb250cm9sbGVkUHJvcHM7XG4gICAgICAgICAgdmFyIHBhcmVudFByb3BzID0gcGFyZW50UHJvcHNMaXN0ID8gX3BpY2soYmFzZVBhcmVudFByb3BzLCBwYXJlbnRQcm9wc0xpc3QpIDoge307XG5cbiAgICAgICAgICB2YXIgbW9kaWZpZWRQcm9wcyA9IF9kZWZhdWx0cyh7fSwgcGFyZW50UHJvcHMsIHByb3BzKTtcblxuICAgICAgICAgIHJldHVybiBfaXNGdW5jdGlvbihXcmFwcGVkQ29tcG9uZW50LmdldEJhc2VQcm9wcykgPyBXcmFwcGVkQ29tcG9uZW50LmdldEJhc2VQcm9wcyhtb2RpZmllZFByb3BzKSA6IHt9O1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJnZXRBbGxFdmVudHNcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFsbEV2ZW50cyhwcm9wcykge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY29tcG9uZW50RXZlbnRzKSkge1xuICAgICAgICAgICAgdmFyIF9jb21wb25lbnRFdmVudHM7XG5cbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHByb3BzLmV2ZW50cykgPyAoX2NvbXBvbmVudEV2ZW50cyA9IHRoaXMuY29tcG9uZW50RXZlbnRzKS5jb25jYXQuYXBwbHkoX2NvbXBvbmVudEV2ZW50cywgX3RvQ29uc3VtYWJsZUFycmF5KHByb3BzLmV2ZW50cykpIDogdGhpcy5jb21wb25lbnRFdmVudHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHByb3BzLmV2ZW50cztcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBrZXk6IFwiZ2V0Q29tcG9uZW50UHJvcHNcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldENvbXBvbmVudFByb3BzKGNvbXBvbmVudCwgdHlwZSwgaW5kZXgpIHtcbiAgICAgICAgICB2YXIgbmFtZSA9IHRoaXMucHJvcHMubmFtZSB8fCBXcmFwcGVkQ29tcG9uZW50LnJvbGU7XG4gICAgICAgICAgdmFyIGtleSA9IHRoaXMuZGF0YUtleXMgJiYgdGhpcy5kYXRhS2V5c1tpbmRleF0gfHwgaW5kZXg7XG4gICAgICAgICAgdmFyIGlkID0gXCJcIi5jb25jYXQobmFtZSwgXCItXCIpLmNvbmNhdCh0eXBlLCBcIi1cIikuY29uY2F0KGtleSk7XG4gICAgICAgICAgdmFyIGJhc2VQcm9wcyA9IHRoaXMuYmFzZVByb3BzW2tleV0gJiYgdGhpcy5iYXNlUHJvcHNba2V5XVt0eXBlXSB8fCB0aGlzLmJhc2VQcm9wc1trZXldO1xuXG4gICAgICAgICAgaWYgKCFiYXNlUHJvcHMgJiYgIXRoaXMuaGFzRXZlbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLmhhc0V2ZW50cykge1xuICAgICAgICAgICAgdmFyIGJhc2VFdmVudHMgPSB0aGlzLmdldEV2ZW50cyh0aGlzLnByb3BzLCB0eXBlLCBrZXkpO1xuXG4gICAgICAgICAgICB2YXIgY29tcG9uZW50UHJvcHMgPSBfZGVmYXVsdHMoe1xuICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgIGtleTogaWRcbiAgICAgICAgICAgIH0sIHRoaXMuZ2V0RXZlbnRTdGF0ZShrZXksIHR5cGUpLCB0aGlzLmdldFNoYXJlZEV2ZW50U3RhdGUoa2V5LCB0eXBlKSwgY29tcG9uZW50LnByb3BzLCBiYXNlUHJvcHMsIHtcbiAgICAgICAgICAgICAgaWQ6IGlkXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdmFyIGV2ZW50cyA9IF9kZWZhdWx0cyh7fSwgRXZlbnRzLmdldFBhcnRpYWxFdmVudHMoYmFzZUV2ZW50cywga2V5LCBjb21wb25lbnRQcm9wcyksIGNvbXBvbmVudFByb3BzLmV2ZW50cyk7XG5cbiAgICAgICAgICAgIHJldHVybiBfYXNzaWduKHt9LCBjb21wb25lbnRQcm9wcywge1xuICAgICAgICAgICAgICBldmVudHM6IGV2ZW50c1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIF9kZWZhdWx0cyh7XG4gICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICBrZXk6IGlkXG4gICAgICAgICAgfSwgY29tcG9uZW50LnByb3BzLCBiYXNlUHJvcHMsIHtcbiAgICAgICAgICAgIGlkOiBpZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJyZW5kZXJDb250YWluZXJcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckNvbnRhaW5lcihjb21wb25lbnQsIGNoaWxkcmVuKSB7XG4gICAgICAgICAgdmFyIGlzQ29udGFpbmVyID0gY29tcG9uZW50LnR5cGUgJiYgY29tcG9uZW50LnR5cGUucm9sZSA9PT0gXCJjb250YWluZXJcIjtcbiAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSBpc0NvbnRhaW5lciA/IHRoaXMuZ2V0Q29tcG9uZW50UHJvcHMoY29tcG9uZW50LCBcInBhcmVudFwiLCBcInBhcmVudFwiKSA6IHt9O1xuXG4gICAgICAgICAgaWYgKHBhcmVudFByb3BzLmV2ZW50cykge1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxFdmVudHMgPSBFdmVudHMuZ2V0R2xvYmFsRXZlbnRzKHBhcmVudFByb3BzLmV2ZW50cyk7XG4gICAgICAgICAgICBwYXJlbnRQcm9wcy5ldmVudHMgPSBFdmVudHMub21pdEdsb2JhbEV2ZW50cyhwYXJlbnRQcm9wcy5ldmVudHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY29tcG9uZW50LCBwYXJlbnRQcm9wcywgY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJhbmltYXRlQ29tcG9uZW50XCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBhbmltYXRlQ29tcG9uZW50KHByb3BzLCBkZWZhdWx0QW5pbWF0aW9uV2hpdGVsaXN0KSB7XG4gICAgICAgICAgdmFyIGFuaW1hdGlvbldoaXRlbGlzdCA9IHByb3BzLmFuaW1hdGUgJiYgcHJvcHMuYW5pbWF0ZS5hbmltYXRpb25XaGl0ZWxpc3QgPyBwcm9wcy5hbmltYXRlLmFuaW1hdGlvbldoaXRlbGlzdCA6IGRlZmF1bHRBbmltYXRpb25XaGl0ZWxpc3Q7XG4gICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeVRyYW5zaXRpb24sIHtcbiAgICAgICAgICAgIGFuaW1hdGU6IHByb3BzLmFuaW1hdGUsXG4gICAgICAgICAgICBhbmltYXRpb25XaGl0ZWxpc3Q6IGFuaW1hdGlvbldoaXRlbGlzdFxuICAgICAgICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQodGhpcy5jb25zdHJ1Y3RvciwgcHJvcHMpKTtcbiAgICAgICAgfSAvLyBVc2VkIGJ5IGBWaWN0b3J5TGluZWAgYW5kIGBWaWN0b3J5QXJlYWBcblxuICAgICAgfSwge1xuICAgICAgICBrZXk6IFwicmVuZGVyQ29udGludW91c0RhdGFcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckNvbnRpbnVvdXNEYXRhKHByb3BzKSB7XG4gICAgICAgICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICAgICAgICB2YXIgZGF0YUNvbXBvbmVudCA9IHByb3BzLmRhdGFDb21wb25lbnQsXG4gICAgICAgICAgICAgIGxhYmVsQ29tcG9uZW50ID0gcHJvcHMubGFiZWxDb21wb25lbnQsXG4gICAgICAgICAgICAgIGdyb3VwQ29tcG9uZW50ID0gcHJvcHMuZ3JvdXBDb21wb25lbnQ7XG5cbiAgICAgICAgICB2YXIgZGF0YUtleXMgPSBfd2l0aG91dCh0aGlzLmRhdGFLZXlzLCBcImFsbFwiKTtcblxuICAgICAgICAgIHZhciBsYWJlbENvbXBvbmVudHMgPSBkYXRhS2V5cy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIGtleSkge1xuICAgICAgICAgICAgdmFyIGxhYmVsUHJvcHMgPSBfdGhpczguZ2V0Q29tcG9uZW50UHJvcHMobGFiZWxDb21wb25lbnQsIFwibGFiZWxzXCIsIGtleSk7XG5cbiAgICAgICAgICAgIGlmIChsYWJlbFByb3BzICYmIGxhYmVsUHJvcHMudGV4dCAhPT0gdW5kZWZpbmVkICYmIGxhYmVsUHJvcHMudGV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBtZW1vID0gbWVtby5jb25jYXQoUmVhY3QuY2xvbmVFbGVtZW50KGxhYmVsQ29tcG9uZW50LCBsYWJlbFByb3BzKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgICAgIH0sIFtdKTtcbiAgICAgICAgICB2YXIgZGF0YVByb3BzID0gdGhpcy5nZXRDb21wb25lbnRQcm9wcyhkYXRhQ29tcG9uZW50LCBcImRhdGFcIiwgXCJhbGxcIik7XG4gICAgICAgICAgdmFyIGNoaWxkcmVuID0gW1JlYWN0LmNsb25lRWxlbWVudChkYXRhQ29tcG9uZW50LCBkYXRhUHJvcHMpXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGxhYmVsQ29tcG9uZW50cykpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbnRhaW5lcihncm91cENvbXBvbmVudCwgY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGtleTogXCJyZW5kZXJEYXRhXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJEYXRhKHByb3BzKSB7XG4gICAgICAgICAgdmFyIF90aGlzOSA9IHRoaXM7XG5cbiAgICAgICAgICB2YXIgc2hvdWxkUmVuZGVyRGF0dW0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGRhdHVtSGFzWGFuZFk7XG4gICAgICAgICAgdmFyIGRhdGFDb21wb25lbnQgPSBwcm9wcy5kYXRhQ29tcG9uZW50LFxuICAgICAgICAgICAgICBsYWJlbENvbXBvbmVudCA9IHByb3BzLmxhYmVsQ29tcG9uZW50LFxuICAgICAgICAgICAgICBncm91cENvbXBvbmVudCA9IHByb3BzLmdyb3VwQ29tcG9uZW50O1xuICAgICAgICAgIHZhciBkYXRhQ29tcG9uZW50cyA9IHRoaXMuZGF0YUtleXMucmVkdWNlKGZ1bmN0aW9uICh2YWxpZERhdGFDb21wb25lbnRzLCBfZGF0YUtleSwgaW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhUHJvcHMgPSBfdGhpczkuZ2V0Q29tcG9uZW50UHJvcHMoZGF0YUNvbXBvbmVudCwgXCJkYXRhXCIsIGluZGV4KTtcblxuICAgICAgICAgICAgaWYgKHNob3VsZFJlbmRlckRhdHVtKGRhdGFQcm9wcy5kYXR1bSkpIHtcbiAgICAgICAgICAgICAgdmFsaWREYXRhQ29tcG9uZW50cy5wdXNoKFJlYWN0LmNsb25lRWxlbWVudChkYXRhQ29tcG9uZW50LCBkYXRhUHJvcHMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkRGF0YUNvbXBvbmVudHM7XG4gICAgICAgICAgfSwgW10pO1xuICAgICAgICAgIHZhciBsYWJlbENvbXBvbmVudHMgPSB0aGlzLmRhdGFLZXlzLm1hcChmdW5jdGlvbiAoX2RhdGFLZXksIGluZGV4KSB7XG4gICAgICAgICAgICB2YXIgbGFiZWxQcm9wcyA9IF90aGlzOS5nZXRDb21wb25lbnRQcm9wcyhsYWJlbENvbXBvbmVudCwgXCJsYWJlbHNcIiwgaW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAobGFiZWxQcm9wcy50ZXh0ICE9PSB1bmRlZmluZWQgJiYgbGFiZWxQcm9wcy50ZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQobGFiZWxDb21wb25lbnQsIGxhYmVsUHJvcHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH0pLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgICAgIHZhciBjaGlsZHJlbiA9IF90b0NvbnN1bWFibGVBcnJheShkYXRhQ29tcG9uZW50cykuY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShsYWJlbENvbXBvbmVudHMpKTtcblxuICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbnRhaW5lcihncm91cENvbXBvbmVudCwgY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9XSk7XG5cbiAgICAgIHJldHVybiBhZGRFdmVudHM7XG4gICAgfShXcmFwcGVkQ29tcG9uZW50KVxuICApO1xufSk7IiwiaW1wb3J0IF9kZWZhdWx0cyBmcm9tIFwibG9kYXNoL2RlZmF1bHRzXCI7XG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBIZWxwZXJzLCBTY2FsZSwgQXhpcyB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbnZhciBvcmllbnRhdGlvblNpZ24gPSB7XG4gIHRvcDogLTEsXG4gIGxlZnQ6IC0xLFxuICByaWdodDogMSxcbiAgYm90dG9tOiAxXG59O1xuXG52YXIgZXhpc3RzID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkO1xufTtcblxudmFyIGdldEN1cnJlbnRBeGlzID0gZnVuY3Rpb24gKHByb3BzLCBheGlzKSB7XG4gIHZhciBvcmllbnRhdGlvbiA9IHByb3BzLm9yaWVudGF0aW9uLFxuICAgICAgaG9yaXpvbnRhbCA9IHByb3BzLmhvcml6b250YWw7XG5cbiAgaWYgKG9yaWVudGF0aW9uKSB7XG4gICAgdmFyIGRpbWVuc2lvbnMgPSB7XG4gICAgICB0b3A6IFwieFwiLFxuICAgICAgYm90dG9tOiBcInhcIixcbiAgICAgIGxlZnQ6IFwieVwiLFxuICAgICAgcmlnaHQ6IFwieVwiXG4gICAgfTtcbiAgICByZXR1cm4gZGltZW5zaW9uc1tvcmllbnRhdGlvbl07XG4gIH1cblxuICB2YXIgb3RoZXJBeGlzID0gYXhpcyA9PT0gXCJ4XCIgPyBcInlcIiA6IFwieFwiO1xuICByZXR1cm4gaG9yaXpvbnRhbCA/IG90aGVyQXhpcyA6IGF4aXM7XG59O1xuXG52YXIgZ2V0U2NhbGUgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIGF4aXMgPSBBeGlzLmdldEF4aXMocHJvcHMpO1xuICB2YXIgY3VycmVudEF4aXMgPSBnZXRDdXJyZW50QXhpcyhwcm9wcywgYXhpcyk7XG4gIHZhciBzY2FsZSA9IFNjYWxlLmdldEJhc2VTY2FsZShwcm9wcywgYXhpcyk7XG4gIHZhciBwcm9wc0RvbWFpbiA9IHByb3BzLmRvbWFpbiAmJiBwcm9wcy5kb21haW5bYXhpc107XG4gIHZhciBkb21haW4gPSBwcm9wc0RvbWFpbiB8fCBBeGlzLmdldERvbWFpbihwcm9wcykgfHwgc2NhbGUuZG9tYWluKCk7XG4gIHNjYWxlLnJhbmdlKEhlbHBlcnMuZ2V0UmFuZ2UocHJvcHMsIGN1cnJlbnRBeGlzKSk7XG4gIHNjYWxlLmRvbWFpbihkb21haW4pO1xuICByZXR1cm4gc2NhbGU7XG59O1xuXG52YXIgZ2V0U3R5bGVPYmplY3QgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIHRoZW1lID0gcHJvcHMudGhlbWUsXG4gICAgICBkZXBlbmRlbnRBeGlzID0gcHJvcHMuZGVwZW5kZW50QXhpcztcbiAgdmFyIGdlbmVyYWxBeGlzU3R5bGUgPSB0aGVtZSAmJiB0aGVtZS5heGlzICYmIHRoZW1lLmF4aXMuc3R5bGU7XG4gIHZhciBheGlzVHlwZSA9IGRlcGVuZGVudEF4aXMgPyBcImRlcGVuZGVudEF4aXNcIiA6IFwiaW5kZXBlbmRlbnRBeGlzXCI7XG4gIHZhciBzcGVjaWZpY0F4aXNTdHlsZSA9IHRoZW1lICYmIHRoZW1lW2F4aXNUeXBlXSAmJiB0aGVtZVtheGlzVHlwZV0uc3R5bGU7XG5cbiAgdmFyIG1lcmdlU3R5bGVzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdHlsZU5hbWVzcGFjZXMgPSBbXCJheGlzXCIsIFwiYXhpc0xhYmVsXCIsIFwiZ3JpZFwiLCBcInBhcmVudFwiLCBcInRpY2tMYWJlbHNcIiwgXCJ0aWNrc1wiXTtcbiAgICByZXR1cm4gc3R5bGVOYW1lc3BhY2VzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgY3Vycikge1xuICAgICAgbWVtb1tjdXJyXSA9IF9kZWZhdWx0cyh7fSwgc3BlY2lmaWNBeGlzU3R5bGVbY3Vycl0sIGdlbmVyYWxBeGlzU3R5bGVbY3Vycl0pO1xuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfSwge30pO1xuICB9O1xuXG4gIHJldHVybiBnZW5lcmFsQXhpc1N0eWxlICYmIHNwZWNpZmljQXhpc1N0eWxlID8gbWVyZ2VTdHlsZXMoKSA6IHNwZWNpZmljQXhpc1N0eWxlIHx8IGdlbmVyYWxBeGlzU3R5bGU7XG59O1xuXG5leHBvcnQgdmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uIChwcm9wcywgc3R5bGVPYmplY3QpIHtcbiAgdmFyIHN0eWxlID0gcHJvcHMuc3R5bGUgfHwge307XG4gIHN0eWxlT2JqZWN0ID0gc3R5bGVPYmplY3QgfHwge307XG4gIHZhciBwYXJlbnRTdHlsZVByb3BzID0ge1xuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgd2lkdGg6IFwiMTAwJVwiXG4gIH07XG4gIHJldHVybiB7XG4gICAgcGFyZW50OiBfZGVmYXVsdHMoc3R5bGUucGFyZW50LCBzdHlsZU9iamVjdC5wYXJlbnQsIHBhcmVudFN0eWxlUHJvcHMpLFxuICAgIGF4aXM6IF9kZWZhdWx0cyh7fSwgc3R5bGUuYXhpcywgc3R5bGVPYmplY3QuYXhpcyksXG4gICAgYXhpc0xhYmVsOiBfZGVmYXVsdHMoe30sIHN0eWxlLmF4aXNMYWJlbCwgc3R5bGVPYmplY3QuYXhpc0xhYmVsKSxcbiAgICBncmlkOiBfZGVmYXVsdHMoe30sIHN0eWxlLmdyaWQsIHN0eWxlT2JqZWN0LmdyaWQpLFxuICAgIHRpY2tzOiBfZGVmYXVsdHMoe30sIHN0eWxlLnRpY2tzLCBzdHlsZU9iamVjdC50aWNrcyksXG4gICAgdGlja0xhYmVsczogX2RlZmF1bHRzKHt9LCBzdHlsZS50aWNrTGFiZWxzLCBzdHlsZU9iamVjdC50aWNrTGFiZWxzKVxuICB9O1xufTtcblxudmFyIGdldFRpY2tQcm9wcyA9IGZ1bmN0aW9uIChsYXlvdXQsIHN0eWxlLCBkYXR1bSkge1xuICB2YXIgcG9zaXRpb24gPSBsYXlvdXQucG9zaXRpb24sXG4gICAgICB0cmFuc2Zvcm0gPSBsYXlvdXQudHJhbnNmb3JtO1xuICByZXR1cm4ge1xuICAgIHgxOiB0cmFuc2Zvcm0ueCxcbiAgICB5MTogdHJhbnNmb3JtLnksXG4gICAgeDI6IHRyYW5zZm9ybS54ICsgcG9zaXRpb24ueDIsXG4gICAgeTI6IHRyYW5zZm9ybS55ICsgcG9zaXRpb24ueTIsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGRhdHVtOiBkYXR1bVxuICB9O1xufTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcblxuXG52YXIgZ2V0VGlja0xhYmVsUHJvcHMgPSBmdW5jdGlvbiAobGF5b3V0LCBzdHlsZSwgYW5jaG9ycywgZGF0dW0sIHRleHQpIHtcbiAgdmFyIHBvc2l0aW9uID0gbGF5b3V0LnBvc2l0aW9uLFxuICAgICAgdHJhbnNmb3JtID0gbGF5b3V0LnRyYW5zZm9ybTtcbiAgcmV0dXJuIHtcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgeDogdHJhbnNmb3JtLnggKyBwb3NpdGlvbi54LFxuICAgIHk6IHRyYW5zZm9ybS55ICsgcG9zaXRpb24ueSxcbiAgICB2ZXJ0aWNhbEFuY2hvcjogYW5jaG9ycy52ZXJ0aWNhbEFuY2hvcixcbiAgICB0ZXh0QW5jaG9yOiBhbmNob3JzLnRleHRBbmNob3IsXG4gICAgYW5nbGU6IHN0eWxlLmFuZ2xlLFxuICAgIHRleHQ6IHRleHQsXG4gICAgZGF0dW06IGRhdHVtXG4gIH07XG59O1xuXG52YXIgZ2V0R3JpZFByb3BzID0gZnVuY3Rpb24gKGxheW91dCwgc3R5bGUsIGRhdHVtKSB7XG4gIHZhciBlZGdlID0gbGF5b3V0LmVkZ2UsXG4gICAgICB0cmFuc2Zvcm0gPSBsYXlvdXQudHJhbnNmb3JtO1xuICByZXR1cm4ge1xuICAgIHgxOiB0cmFuc2Zvcm0ueCxcbiAgICB5MTogdHJhbnNmb3JtLnksXG4gICAgeDI6IGVkZ2UueCArIHRyYW5zZm9ybS54LFxuICAgIHkyOiBlZGdlLnkgKyB0cmFuc2Zvcm0ueSxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgZGF0dW06IGRhdHVtXG4gIH07XG59O1xuXG52YXIgZ2V0QXhpc1Byb3BzID0gZnVuY3Rpb24gKG1vZGlmaWVkUHJvcHMsIGNhbGN1bGF0ZWRWYWx1ZXMsIGdsb2JhbFRyYW5zZm9ybSkge1xuICB2YXIgc3R5bGUgPSBjYWxjdWxhdGVkVmFsdWVzLnN0eWxlLFxuICAgICAgcGFkZGluZyA9IGNhbGN1bGF0ZWRWYWx1ZXMucGFkZGluZyxcbiAgICAgIGlzVmVydGljYWwgPSBjYWxjdWxhdGVkVmFsdWVzLmlzVmVydGljYWw7XG4gIHZhciB3aWR0aCA9IG1vZGlmaWVkUHJvcHMud2lkdGgsXG4gICAgICBoZWlnaHQgPSBtb2RpZmllZFByb3BzLmhlaWdodDtcbiAgcmV0dXJuIHtcbiAgICBzdHlsZTogc3R5bGUuYXhpcyxcbiAgICB4MTogaXNWZXJ0aWNhbCA/IGdsb2JhbFRyYW5zZm9ybS54IDogcGFkZGluZy5sZWZ0ICsgZ2xvYmFsVHJhbnNmb3JtLngsXG4gICAgeDI6IGlzVmVydGljYWwgPyBnbG9iYWxUcmFuc2Zvcm0ueCA6IHdpZHRoIC0gcGFkZGluZy5yaWdodCArIGdsb2JhbFRyYW5zZm9ybS54LFxuICAgIHkxOiBpc1ZlcnRpY2FsID8gcGFkZGluZy50b3AgKyBnbG9iYWxUcmFuc2Zvcm0ueSA6IGdsb2JhbFRyYW5zZm9ybS55LFxuICAgIHkyOiBpc1ZlcnRpY2FsID8gaGVpZ2h0IC0gcGFkZGluZy5ib3R0b20gKyBnbG9iYWxUcmFuc2Zvcm0ueSA6IGdsb2JhbFRyYW5zZm9ybS55XG4gIH07XG59O1xuXG52YXIgZ2V0RXZhbHVhdGVkU3R5bGVzID0gZnVuY3Rpb24gKHN0eWxlLCBwcm9wcykge1xuICByZXR1cm4ge1xuICAgIHRpY2tTdHlsZTogSGVscGVycy5ldmFsdWF0ZVN0eWxlKHN0eWxlLnRpY2tzLCBwcm9wcyksXG4gICAgbGFiZWxTdHlsZTogSGVscGVycy5ldmFsdWF0ZVN0eWxlKHN0eWxlLnRpY2tMYWJlbHMsIHByb3BzKSxcbiAgICBncmlkU3R5bGU6IEhlbHBlcnMuZXZhbHVhdGVTdHlsZShzdHlsZS5ncmlkLCBwcm9wcylcbiAgfTtcbn07XG5cbnZhciBnZXRBeGlzTGFiZWxQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcywgY2FsY3VsYXRlZFZhbHVlcywgZ2xvYmFsVHJhbnNmb3JtKSB7XG4gIHZhciBzdHlsZSA9IGNhbGN1bGF0ZWRWYWx1ZXMuc3R5bGUsXG4gICAgICBvcmllbnRhdGlvbiA9IGNhbGN1bGF0ZWRWYWx1ZXMub3JpZW50YXRpb24sXG4gICAgICBwYWRkaW5nID0gY2FsY3VsYXRlZFZhbHVlcy5wYWRkaW5nLFxuICAgICAgbGFiZWxQYWRkaW5nID0gY2FsY3VsYXRlZFZhbHVlcy5sYWJlbFBhZGRpbmcsXG4gICAgICBpc1ZlcnRpY2FsID0gY2FsY3VsYXRlZFZhbHVlcy5pc1ZlcnRpY2FsO1xuICB2YXIgc2lnbiA9IG9yaWVudGF0aW9uU2lnbltvcmllbnRhdGlvbl07XG4gIHZhciBoUGFkZGluZyA9IHBhZGRpbmcubGVmdCArIHBhZGRpbmcucmlnaHQ7XG4gIHZhciB2UGFkZGluZyA9IHBhZGRpbmcudG9wICsgcGFkZGluZy5ib3R0b207XG4gIHZhciB2ZXJ0aWNhbEFuY2hvciA9IHNpZ24gPCAwID8gXCJlbmRcIiA6IFwic3RhcnRcIjtcbiAgdmFyIGxhYmVsU3R5bGUgPSBzdHlsZS5heGlzTGFiZWw7XG4gIHZhciBhbmdsZSA9IGlzVmVydGljYWwgPyAtOTAgOiAwOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcblxuICB2YXIgeCA9IGlzVmVydGljYWwgPyBnbG9iYWxUcmFuc2Zvcm0ueCArIHNpZ24gKiBsYWJlbFBhZGRpbmcgOiAocHJvcHMud2lkdGggLSBoUGFkZGluZykgLyAyICsgcGFkZGluZy5sZWZ0ICsgZ2xvYmFsVHJhbnNmb3JtLng7XG4gIHZhciB5ID0gaXNWZXJ0aWNhbCA/IChwcm9wcy5oZWlnaHQgLSB2UGFkZGluZykgLyAyICsgcGFkZGluZy50b3AgKyBnbG9iYWxUcmFuc2Zvcm0ueSA6IHNpZ24gKiBsYWJlbFBhZGRpbmcgKyBnbG9iYWxUcmFuc2Zvcm0ueTtcbiAgcmV0dXJuIHtcbiAgICB4OiB4LFxuICAgIHk6IHksXG4gICAgdmVydGljYWxBbmNob3I6IGxhYmVsU3R5bGUudmVydGljYWxBbmNob3IgfHwgdmVydGljYWxBbmNob3IsXG4gICAgdGV4dEFuY2hvcjogbGFiZWxTdHlsZS50ZXh0QW5jaG9yIHx8IFwibWlkZGxlXCIsXG4gICAgYW5nbGU6IGxhYmVsU3R5bGUuYW5nbGUgPT09IHVuZGVmaW5lZCA/IGFuZ2xlIDogbGFiZWxTdHlsZS5hbmdsZSxcbiAgICBzdHlsZTogbGFiZWxTdHlsZSxcbiAgICB0ZXh0OiBwcm9wcy5sYWJlbFxuICB9O1xufTtcblxudmFyIGdldEFuY2hvcnMgPSBmdW5jdGlvbiAob3JpZW50YXRpb24sIGlzVmVydGljYWwpIHtcbiAgdmFyIGFuY2hvck9yaWVudGF0aW9uID0ge1xuICAgIHRvcDogXCJlbmRcIixcbiAgICBsZWZ0OiBcImVuZFwiLFxuICAgIHJpZ2h0OiBcInN0YXJ0XCIsXG4gICAgYm90dG9tOiBcInN0YXJ0XCJcbiAgfTtcbiAgdmFyIGFuY2hvciA9IGFuY2hvck9yaWVudGF0aW9uW29yaWVudGF0aW9uXTtcbiAgcmV0dXJuIHtcbiAgICB0ZXh0QW5jaG9yOiBpc1ZlcnRpY2FsID8gYW5jaG9yIDogXCJtaWRkbGVcIixcbiAgICB2ZXJ0aWNhbEFuY2hvcjogaXNWZXJ0aWNhbCA/IFwibWlkZGxlXCIgOiBhbmNob3JcbiAgfTtcbn07XG5cbnZhciBnZXRMYWJlbFBhZGRpbmcgPSBmdW5jdGlvbiAocHJvcHMsIHN0eWxlKSB7XG4gIHZhciBsYWJlbFN0eWxlID0gc3R5bGUuYXhpc0xhYmVsIHx8IHt9O1xuXG4gIGlmIChsYWJlbFN0eWxlLnBhZGRpbmcgIT09IHVuZGVmaW5lZCAmJiBsYWJlbFN0eWxlLnBhZGRpbmcgIT09IG51bGwpIHtcbiAgICByZXR1cm4gbGFiZWxTdHlsZS5wYWRkaW5nO1xuICB9XG5cbiAgdmFyIGlzVmVydGljYWwgPSBBeGlzLmlzVmVydGljYWwocHJvcHMpOyAvLyBUT0RPOiBtYWdpYyBudW1iZXJzXG5cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1tYWdpYy1udW1iZXJzKi9cblxuICB2YXIgZm9udFNpemUgPSBsYWJlbFN0eWxlLmZvbnRTaXplIHx8IDE0O1xuICByZXR1cm4gcHJvcHMubGFiZWwgPyBmb250U2l6ZSAqIChpc1ZlcnRpY2FsID8gMi4zIDogMS42KSA6IDA7XG4gIC8qZXNsaW50LWVuYWJsZSBuby1tYWdpYy1udW1iZXJzKi9cbn07XG5cbnZhciBnZXREZWZhdWx0T3JpZW50YXRpb25zID0gZnVuY3Rpb24gKGF4aXMsIG9yaWdpblNpZ24sIGhvcml6b250YWwpIHtcbiAgdmFyIHNpZ24gPSBvcmlnaW5TaWduIHx8IFwicG9zaXRpdmVcIjtcbiAgdmFyIG9yaWVudGF0aW9ucyA9IHtcbiAgICBwb3NpdGl2ZToge1xuICAgICAgeDogXCJib3R0b21cIixcbiAgICAgIHk6IFwibGVmdFwiXG4gICAgfSxcbiAgICBuZWdhdGl2ZToge1xuICAgICAgeDogXCJ0b3BcIixcbiAgICAgIHk6IFwicmlnaHRcIlxuICAgIH1cbiAgfTtcbiAgdmFyIGhvcml6b250YWxPcmllbnRhdGlvbnMgPSB7XG4gICAgcG9zaXRpdmU6IHtcbiAgICAgIHg6IFwibGVmdFwiLFxuICAgICAgeTogXCJib3R0b21cIlxuICAgIH0sXG4gICAgbmVnYXRpdmU6IHtcbiAgICAgIHg6IFwicmlnaHRcIixcbiAgICAgIHk6IFwidG9wXCJcbiAgICB9XG4gIH07XG4gIHJldHVybiBob3Jpem9udGFsID8gaG9yaXpvbnRhbE9yaWVudGF0aW9uc1tzaWduXVtheGlzXSA6IG9yaWVudGF0aW9uc1tzaWduXVtheGlzXTtcbn07XG5cbnZhciBnZXRTdGFuZGFsb25lT2Zmc2V0ID0gZnVuY3Rpb24gKHByb3BzLCBjYWxjdWxhdGVkVmFsdWVzKSB7XG4gIHZhciBzdHlsZSA9IGNhbGN1bGF0ZWRWYWx1ZXMuc3R5bGUsXG4gICAgICBzY2FsZSA9IGNhbGN1bGF0ZWRWYWx1ZXMuc2NhbGUsXG4gICAgICBvcmllbnRhdGlvbiA9IGNhbGN1bGF0ZWRWYWx1ZXMub3JpZW50YXRpb24sXG4gICAgICBwYWRkaW5nID0gY2FsY3VsYXRlZFZhbHVlcy5wYWRkaW5nLFxuICAgICAgYXhpcyA9IGNhbGN1bGF0ZWRWYWx1ZXMuYXhpcyxcbiAgICAgIHRpY2tzID0gY2FsY3VsYXRlZFZhbHVlcy50aWNrcyxcbiAgICAgIHN0cmluZ1RpY2tzID0gY2FsY3VsYXRlZFZhbHVlcy5zdHJpbmdUaWNrcyxcbiAgICAgIGlzVmVydGljYWwgPSBjYWxjdWxhdGVkVmFsdWVzLmlzVmVydGljYWwsXG4gICAgICBsYWJlbFBhZGRpbmcgPSBjYWxjdWxhdGVkVmFsdWVzLmxhYmVsUGFkZGluZztcbiAgdmFyIHBvbGFyID0gcHJvcHMucG9sYXIsXG4gICAgICBob3Jpem9udGFsID0gcHJvcHMuaG9yaXpvbnRhbDtcbiAgdmFyIHNoYXJlZFByb3BzID0ge1xuICAgIHNjYWxlOiBfZGVmaW5lUHJvcGVydHkoe30sIGF4aXMsIHNjYWxlKSxcbiAgICBwb2xhcjogcG9sYXIsXG4gICAgaG9yaXpvbnRhbDogaG9yaXpvbnRhbCxcbiAgICB0aWNrczogdGlja3MsXG4gICAgc3RyaW5nVGlja3M6IHN0cmluZ1RpY2tzXG4gIH07XG4gIHZhciB4UGFkZGluZyA9IG9yaWVudGF0aW9uID09PSBcInJpZ2h0XCIgPyBwYWRkaW5nLnJpZ2h0IDogcGFkZGluZy5sZWZ0O1xuICB2YXIgeVBhZGRpbmcgPSBvcmllbnRhdGlvbiA9PT0gXCJ0b3BcIiA/IHBhZGRpbmcudG9wIDogcGFkZGluZy5ib3R0b207XG4gIHZhciBvZmZzZXRYID0gcHJvcHMub2Zmc2V0WCAhPT0gbnVsbCAmJiBwcm9wcy5vZmZzZXRYICE9PSB1bmRlZmluZWQgPyBwcm9wcy5vZmZzZXRYIDogeFBhZGRpbmc7XG4gIHZhciBvZmZzZXRZID0gcHJvcHMub2Zmc2V0WSAhPT0gbnVsbCAmJiBwcm9wcy5vZmZzZXRZICE9PSB1bmRlZmluZWQgPyBwcm9wcy5vZmZzZXRZIDogeVBhZGRpbmc7XG4gIHZhciBmb250U2l6ZSA9IHN0eWxlLmF4aXNMYWJlbC5mb250U2l6ZSB8fCAxNDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG5cbiAgdmFyIHRpY2tTaXplcyA9IHRpY2tzLm1hcChmdW5jdGlvbiAoZGF0YSwgaW5kZXgpIHtcbiAgICB2YXIgdGljayA9IHN0cmluZ1RpY2tzID8gcHJvcHMudGlja1ZhbHVlc1tkYXRhIC0gMV0gOiBkYXRhO1xuICAgIHZhciB0aWNrU3R5bGUgPSBIZWxwZXJzLmV2YWx1YXRlU3R5bGUoc3R5bGUudGlja3MsIF9hc3NpZ24oe30sIHNoYXJlZFByb3BzLCB7XG4gICAgICB0aWNrOiB0aWNrLFxuICAgICAgaW5kZXg6IGluZGV4XG4gICAgfSkpO1xuICAgIHJldHVybiB0aWNrU3R5bGUuc2l6ZSB8fCAwO1xuICB9KTtcbiAgdmFyIHRvdGFsUGFkZGluZyA9IGZvbnRTaXplICsgMiAqIE1hdGgubWF4LmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheSh0aWNrU2l6ZXMpKSArIGxhYmVsUGFkZGluZztcbiAgdmFyIG1pbmltdW1QYWRkaW5nID0gMS4yICogZm9udFNpemU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuXG4gIHZhciB4ID0gaXNWZXJ0aWNhbCA/IHRvdGFsUGFkZGluZyA6IG1pbmltdW1QYWRkaW5nO1xuICB2YXIgeSA9IGlzVmVydGljYWwgPyBtaW5pbXVtUGFkZGluZyA6IHRvdGFsUGFkZGluZztcbiAgcmV0dXJuIHtcbiAgICB4OiBvZmZzZXRYICE9PSBudWxsICYmIG9mZnNldFggIT09IHVuZGVmaW5lZCA/IG9mZnNldFggOiB4LFxuICAgIHk6IG9mZnNldFkgIT09IG51bGwgJiYgb2Zmc2V0WSAhPT0gdW5kZWZpbmVkID8gb2Zmc2V0WSA6IHlcbiAgfTtcbn07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5cblxudmFyIGdldE9mZnNldCA9IGZ1bmN0aW9uIChwcm9wcywgY2FsY3VsYXRlZFZhbHVlcykge1xuICB2YXIgc2NhbGUgPSBjYWxjdWxhdGVkVmFsdWVzLnNjYWxlLFxuICAgICAgb3JpZ2luID0gY2FsY3VsYXRlZFZhbHVlcy5vcmlnaW4sXG4gICAgICBvcmllbnRhdGlvbiA9IGNhbGN1bGF0ZWRWYWx1ZXMub3JpZW50YXRpb24sXG4gICAgICBvcmllbnRhdGlvbnMgPSBjYWxjdWxhdGVkVmFsdWVzLm9yaWVudGF0aW9ucyxcbiAgICAgIGRvbWFpbiA9IGNhbGN1bGF0ZWRWYWx1ZXMuZG9tYWluLFxuICAgICAgcGFkZGluZyA9IGNhbGN1bGF0ZWRWYWx1ZXMucGFkZGluZztcbiAgdmFyIHRvcCA9IHBhZGRpbmcudG9wLFxuICAgICAgYm90dG9tID0gcGFkZGluZy5ib3R0b20sXG4gICAgICBsZWZ0ID0gcGFkZGluZy5sZWZ0LFxuICAgICAgcmlnaHQgPSBwYWRkaW5nLnJpZ2h0O1xuICB2YXIgY2FsY3VsYXRlZE9yaWVudGF0aW9uID0ge1xuICAgIHg6IG9yaWVudGF0aW9uID09PSBcImJvdHRvbVwiIHx8IG9yaWVudGF0aW9uID09PSBcInRvcFwiID8gb3JpZW50YXRpb24gOiBvcmllbnRhdGlvbnMueCxcbiAgICB5OiBvcmllbnRhdGlvbiA9PT0gXCJsZWZ0XCIgfHwgb3JpZW50YXRpb24gPT09IFwicmlnaHRcIiA/IG9yaWVudGF0aW9uIDogb3JpZW50YXRpb25zLnlcbiAgfTsgLy8gbWFrZSB0aGUgYXhlcyBsaW5lIHVwLCBhbmQgY3Jvc3Mgd2hlbiBhcHByb3ByaWF0ZVxuXG4gIHZhciBvcmllbnRhdGlvbk9mZnNldCA9IHtcbiAgICB4OiBjYWxjdWxhdGVkT3JpZW50YXRpb24ueSA9PT0gXCJsZWZ0XCIgPyBsZWZ0IDogcmlnaHQsXG4gICAgeTogY2FsY3VsYXRlZE9yaWVudGF0aW9uLnggPT09IFwiYm90dG9tXCIgPyBib3R0b20gOiB0b3BcbiAgfTtcbiAgdmFyIG9yaWdpbk9mZnNldCA9IHtcbiAgICB4OiBjYWxjdWxhdGVkT3JpZW50YXRpb24ueSA9PT0gXCJsZWZ0XCIgPyAwIDogcHJvcHMud2lkdGgsXG4gICAgeTogY2FsY3VsYXRlZE9yaWVudGF0aW9uLnggPT09IFwiYm90dG9tXCIgPyBwcm9wcy5oZWlnaHQgOiAwXG4gIH07XG4gIHZhciBvcmlnaW5Qb3NpdGlvbiA9IHtcbiAgICB4OiBvcmlnaW4ueCA9PT0gZG9tYWluLnhbMF0gfHwgb3JpZ2luLnggPT09IGRvbWFpbi54WzFdID8gMCA6IHNjYWxlLngob3JpZ2luLngpLFxuICAgIHk6IG9yaWdpbi55ID09PSBkb21haW4ueVswXSB8fCBvcmlnaW4ueSA9PT0gZG9tYWluLnlbMV0gPyAwIDogc2NhbGUueShvcmlnaW4ueSlcbiAgfTtcbiAgdmFyIHggPSBvcmlnaW5Qb3NpdGlvbi54ID8gTWF0aC5hYnMob3JpZ2luT2Zmc2V0LnggLSBvcmlnaW5Qb3NpdGlvbi54KSA6IG9yaWVudGF0aW9uT2Zmc2V0Lng7XG4gIHZhciB5ID0gb3JpZ2luUG9zaXRpb24ueSA/IE1hdGguYWJzKG9yaWdpbk9mZnNldC55IC0gb3JpZ2luUG9zaXRpb24ueSkgOiBvcmllbnRhdGlvbk9mZnNldC55O1xuICB2YXIgb2Zmc2V0WCA9IGV4aXN0cyhwcm9wcy5vZmZzZXRYKSA/IHByb3BzLm9mZnNldFggOiB4O1xuICB2YXIgb2Zmc2V0WSA9IGV4aXN0cyhwcm9wcy5vZmZzZXRZKSA/IHByb3BzLm9mZnNldFkgOiB5O1xuICByZXR1cm4ge1xuICAgIHg6IG9mZnNldFgsXG4gICAgeTogb2Zmc2V0WVxuICB9O1xufTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcblxuXG52YXIgZ2V0SG9yaXpvbnRhbE9mZnNldCA9IGZ1bmN0aW9uIChwcm9wcywgY2FsY3VsYXRlZFZhbHVlcykge1xuICB2YXIgc2NhbGUgPSBjYWxjdWxhdGVkVmFsdWVzLnNjYWxlLFxuICAgICAgb3JpZ2luID0gY2FsY3VsYXRlZFZhbHVlcy5vcmlnaW4sXG4gICAgICBvcmllbnRhdGlvbiA9IGNhbGN1bGF0ZWRWYWx1ZXMub3JpZW50YXRpb24sXG4gICAgICBvcmllbnRhdGlvbnMgPSBjYWxjdWxhdGVkVmFsdWVzLm9yaWVudGF0aW9ucyxcbiAgICAgIGRvbWFpbiA9IGNhbGN1bGF0ZWRWYWx1ZXMuZG9tYWluLFxuICAgICAgcGFkZGluZyA9IGNhbGN1bGF0ZWRWYWx1ZXMucGFkZGluZztcbiAgdmFyIHRvcCA9IHBhZGRpbmcudG9wLFxuICAgICAgYm90dG9tID0gcGFkZGluZy5ib3R0b20sXG4gICAgICBsZWZ0ID0gcGFkZGluZy5sZWZ0LFxuICAgICAgcmlnaHQgPSBwYWRkaW5nLnJpZ2h0O1xuICB2YXIgY2FsY3VsYXRlZE9yaWVudGF0aW9uID0ge1xuICAgIHk6IG9yaWVudGF0aW9uID09PSBcImJvdHRvbVwiIHx8IG9yaWVudGF0aW9uID09PSBcInRvcFwiID8gb3JpZW50YXRpb24gOiBvcmllbnRhdGlvbnMueCxcbiAgICB4OiBvcmllbnRhdGlvbiA9PT0gXCJsZWZ0XCIgfHwgb3JpZW50YXRpb24gPT09IFwicmlnaHRcIiA/IG9yaWVudGF0aW9uIDogb3JpZW50YXRpb25zLnlcbiAgfTsgLy8gbWFrZSB0aGUgYXhlcyBsaW5lIHVwLCBhbmQgY3Jvc3Mgd2hlbiBhcHByb3ByaWF0ZVxuXG4gIHZhciBvcmllbnRhdGlvbk9mZnNldCA9IHtcbiAgICB4OiBjYWxjdWxhdGVkT3JpZW50YXRpb24ueSA9PT0gXCJib3R0b21cIiA/IGJvdHRvbSA6IHRvcCxcbiAgICB5OiBjYWxjdWxhdGVkT3JpZW50YXRpb24ueCA9PT0gXCJsZWZ0XCIgPyBsZWZ0IDogcmlnaHRcbiAgfTtcbiAgdmFyIG9yaWdpbk9mZnNldCA9IHtcbiAgICB5OiBjYWxjdWxhdGVkT3JpZW50YXRpb24ueCA9PT0gXCJsZWZ0XCIgPyAwIDogcHJvcHMud2lkdGgsXG4gICAgeDogY2FsY3VsYXRlZE9yaWVudGF0aW9uLnkgPT09IFwiYm90dG9tXCIgPyBwcm9wcy5oZWlnaHQgOiAwXG4gIH07XG4gIHZhciBvcmlnaW5Qb3NpdGlvbiA9IHtcbiAgICB4OiBvcmlnaW4ueCA9PT0gZG9tYWluLnhbMF0gfHwgb3JpZ2luLnggPT09IGRvbWFpbi54WzFdID8gMCA6IHNjYWxlLngob3JpZ2luLngpLFxuICAgIHk6IG9yaWdpbi55ID09PSBkb21haW4ueVswXSB8fCBvcmlnaW4ueSA9PT0gZG9tYWluLnlbMV0gPyAwIDogc2NhbGUueShvcmlnaW4ueSlcbiAgfTtcbiAgdmFyIHkgPSBvcmlnaW5Qb3NpdGlvbi54ID8gTWF0aC5hYnMob3JpZ2luT2Zmc2V0LnggLSBvcmlnaW5Qb3NpdGlvbi54KSA6IG9yaWVudGF0aW9uT2Zmc2V0Lng7XG4gIHZhciB4ID0gb3JpZ2luUG9zaXRpb24ueSA/IE1hdGguYWJzKG9yaWdpbk9mZnNldC55IC0gb3JpZ2luUG9zaXRpb24ueSkgOiBvcmllbnRhdGlvbk9mZnNldC55O1xuICB2YXIgb2Zmc2V0WCA9IGV4aXN0cyhwcm9wcy5vZmZzZXRYKSA/IHByb3BzLm9mZnNldFggOiB4O1xuICB2YXIgb2Zmc2V0WSA9IGV4aXN0cyhwcm9wcy5vZmZzZXRZKSA/IHByb3BzLm9mZnNldFkgOiB5O1xuICByZXR1cm4ge1xuICAgIHg6IG9mZnNldFgsXG4gICAgeTogb2Zmc2V0WVxuICB9O1xufTtcblxudmFyIGdldFRyYW5zZm9ybSA9IGZ1bmN0aW9uIChwcm9wcywgY2FsY3VsYXRlZFZhbHVlcywgb2Zmc2V0KSB7XG4gIHZhciBvcmllbnRhdGlvbiA9IGNhbGN1bGF0ZWRWYWx1ZXMub3JpZW50YXRpb24sXG4gICAgICBheGlzID0gY2FsY3VsYXRlZFZhbHVlcy5heGlzO1xuICB2YXIgYXhpc1ZhbHVlID0gQXhpcy5nZXRBeGlzVmFsdWUocHJvcHMsIGF4aXMpO1xuICByZXR1cm4ge1xuICAgIHRvcDoge1xuICAgICAgeDogMCxcbiAgICAgIHk6IGF4aXNWYWx1ZSAhPT0gdW5kZWZpbmVkID8gYXhpc1ZhbHVlIDogb2Zmc2V0LnlcbiAgICB9LFxuICAgIGJvdHRvbToge1xuICAgICAgeDogMCxcbiAgICAgIHk6IGF4aXNWYWx1ZSAhPT0gdW5kZWZpbmVkID8gYXhpc1ZhbHVlIDogcHJvcHMuaGVpZ2h0IC0gb2Zmc2V0LnlcbiAgICB9LFxuICAgIGxlZnQ6IHtcbiAgICAgIHg6IGF4aXNWYWx1ZSAhPT0gdW5kZWZpbmVkID8gYXhpc1ZhbHVlIDogb2Zmc2V0LngsXG4gICAgICB5OiAwXG4gICAgfSxcbiAgICByaWdodDoge1xuICAgICAgeDogYXhpc1ZhbHVlICE9PSB1bmRlZmluZWQgPyBheGlzVmFsdWUgOiBwcm9wcy53aWR0aCAtIG9mZnNldC54LFxuICAgICAgeTogMFxuICAgIH1cbiAgfVtvcmllbnRhdGlvbl07XG59O1xuXG52YXIgZ2V0VGlja1Bvc2l0aW9uID0gZnVuY3Rpb24gKHN0eWxlLCBvcmllbnRhdGlvbiwgaXNWZXJ0aWNhbCkge1xuICB2YXIgdGlja1N0eWxlID0gc3R5bGUudGlja1N0eWxlLFxuICAgICAgbGFiZWxTdHlsZSA9IHN0eWxlLmxhYmVsU3R5bGU7XG4gIHZhciBzaXplID0gdGlja1N0eWxlLnNpemUgfHwgMDtcbiAgdmFyIHRpY2tQYWRkaW5nID0gdGlja1N0eWxlLnBhZGRpbmcgfHwgMDtcbiAgdmFyIGxhYmVsUGFkZGluZyA9IGxhYmVsU3R5bGUucGFkZGluZyB8fCAwO1xuICB2YXIgdGlja1NwYWNpbmcgPSBzaXplICsgdGlja1BhZGRpbmcgKyBsYWJlbFBhZGRpbmc7XG4gIHZhciBzaWduID0gb3JpZW50YXRpb25TaWduW29yaWVudGF0aW9uXTtcbiAgcmV0dXJuIHtcbiAgICB4OiBpc1ZlcnRpY2FsID8gc2lnbiAqIHRpY2tTcGFjaW5nIDogMCxcbiAgICB4MjogaXNWZXJ0aWNhbCA/IHNpZ24gKiBzaXplIDogMCxcbiAgICB5OiBpc1ZlcnRpY2FsID8gMCA6IHNpZ24gKiB0aWNrU3BhY2luZyxcbiAgICB5MjogaXNWZXJ0aWNhbCA/IDAgOiBzaWduICogc2l6ZVxuICB9O1xufTtcblxudmFyIGdldFRpY2tUcmFuc2Zvcm0gPSBmdW5jdGlvbiAodGljaywgZ2xvYmFsVHJhbnNmb3JtLCBpc1ZlcnRpY2FsKSB7XG4gIHJldHVybiB7XG4gICAgeDogaXNWZXJ0aWNhbCA/IGdsb2JhbFRyYW5zZm9ybS54IDogdGljayArIGdsb2JhbFRyYW5zZm9ybS54LFxuICAgIHk6IGlzVmVydGljYWwgPyB0aWNrICsgZ2xvYmFsVHJhbnNmb3JtLnkgOiBnbG9iYWxUcmFuc2Zvcm0ueVxuICB9O1xufTtcblxudmFyIGdldEdyaWRFZGdlID0gZnVuY3Rpb24gKHByb3BzLCBjYWxjdWxhdGVkVmFsdWVzKSB7XG4gIHZhciBvcmllbnRhdGlvbiA9IGNhbGN1bGF0ZWRWYWx1ZXMub3JpZW50YXRpb24sXG4gICAgICBwYWRkaW5nID0gY2FsY3VsYXRlZFZhbHVlcy5wYWRkaW5nLFxuICAgICAgaXNWZXJ0aWNhbCA9IGNhbGN1bGF0ZWRWYWx1ZXMuaXNWZXJ0aWNhbDtcbiAgdmFyIHNpZ24gPSAtb3JpZW50YXRpb25TaWduW29yaWVudGF0aW9uXTtcbiAgdmFyIHggPSBpc1ZlcnRpY2FsID8gc2lnbiAqIChwcm9wcy53aWR0aCAtIChwYWRkaW5nLmxlZnQgKyBwYWRkaW5nLnJpZ2h0KSkgOiAwO1xuICB2YXIgeSA9IGlzVmVydGljYWwgPyAwIDogc2lnbiAqIChwcm9wcy5oZWlnaHQgLSAocGFkZGluZy50b3AgKyBwYWRkaW5nLmJvdHRvbSkpO1xuICByZXR1cm4ge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufTtcblxudmFyIGdldEdyaWRPZmZzZXQgPSBmdW5jdGlvbiAoY2FsY3VsYXRlZFZhbHVlcywgb2Zmc2V0KSB7XG4gIHZhciBwYWRkaW5nID0gY2FsY3VsYXRlZFZhbHVlcy5wYWRkaW5nLFxuICAgICAgb3JpZW50YXRpb24gPSBjYWxjdWxhdGVkVmFsdWVzLm9yaWVudGF0aW9uLFxuICAgICAgY3Jvc3NBeGlzID0gY2FsY3VsYXRlZFZhbHVlcy5jcm9zc0F4aXM7XG4gIHZhciB4UGFkZGluZyA9IG9yaWVudGF0aW9uID09PSBcInJpZ2h0XCIgPyBwYWRkaW5nLnJpZ2h0IDogcGFkZGluZy5sZWZ0O1xuICB2YXIgeVBhZGRpbmcgPSBvcmllbnRhdGlvbiA9PT0gXCJ0b3BcIiA/IHBhZGRpbmcudG9wIDogcGFkZGluZy5ib3R0b207XG4gIHJldHVybiB7XG4gICAgeDogY3Jvc3NBeGlzID8gb2Zmc2V0LnggLSB4UGFkZGluZyA6IDAsXG4gICAgeTogY3Jvc3NBeGlzID8gb2Zmc2V0LnkgLSB5UGFkZGluZyA6IDBcbiAgfTtcbn07XG5cbnZhciBnZXRMYXlvdXRQcm9wcyA9IGZ1bmN0aW9uIChtb2RpZmllZFByb3BzLCBjYWxjdWxhdGVkVmFsdWVzKSB7XG4gIHZhciBvZmZzZXQ7XG5cbiAgaWYgKGNhbGN1bGF0ZWRWYWx1ZXMuZG9tYWluLnggJiYgY2FsY3VsYXRlZFZhbHVlcy5kb21haW4ueSkge1xuICAgIG9mZnNldCA9IG1vZGlmaWVkUHJvcHMuaG9yaXpvbnRhbCA/IGdldEhvcml6b250YWxPZmZzZXQobW9kaWZpZWRQcm9wcywgY2FsY3VsYXRlZFZhbHVlcykgOiBnZXRPZmZzZXQobW9kaWZpZWRQcm9wcywgY2FsY3VsYXRlZFZhbHVlcyk7XG4gIH0gZWxzZSB7XG4gICAgb2Zmc2V0ID0gZ2V0U3RhbmRhbG9uZU9mZnNldChtb2RpZmllZFByb3BzLCBjYWxjdWxhdGVkVmFsdWVzKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2xvYmFsVHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm0obW9kaWZpZWRQcm9wcywgY2FsY3VsYXRlZFZhbHVlcywgb2Zmc2V0KSxcbiAgICBncmlkT2Zmc2V0OiBnZXRHcmlkT2Zmc2V0KGNhbGN1bGF0ZWRWYWx1ZXMsIG9mZnNldCksXG4gICAgZ3JpZEVkZ2U6IGdldEdyaWRFZGdlKG1vZGlmaWVkUHJvcHMsIGNhbGN1bGF0ZWRWYWx1ZXMpXG4gIH07XG59O1xuXG52YXIgZ2V0T3JpZW50YXRpb24gPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgaWYgKHByb3BzLm9yaWVudGF0aW9uKSB7XG4gICAgcmV0dXJuIHByb3BzLm9yaWVudGF0aW9uO1xuICB9XG5cbiAgdmFyIGRlZmF1bHRPcmllbnRhdGlvbnMgPSB7XG4gICAgZGVwZW5kZW50OiBwcm9wcy5ob3Jpem9udGFsID8gXCJib3R0b21cIiA6IFwibGVmdFwiLFxuICAgIGluZGVwZW5kZW50OiBwcm9wcy5ob3Jpem9udGFsID8gXCJsZWZ0XCIgOiBcImJvdHRvbVwiXG4gIH07XG4gIHJldHVybiBwcm9wcy5kZXBlbmRlbnRBeGlzID8gZGVmYXVsdE9yaWVudGF0aW9ucy5kZXBlbmRlbnQgOiBkZWZhdWx0T3JpZW50YXRpb25zLmluZGVwZW5kZW50O1xufTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcblxuXG52YXIgZ2V0Q2FsY3VsYXRlZFZhbHVlcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgZGVmYXVsdFN0eWxlcyA9IGdldFN0eWxlT2JqZWN0KHByb3BzKTtcbiAgdmFyIHN0eWxlID0gZ2V0U3R5bGVzKHByb3BzLCBkZWZhdWx0U3R5bGVzKTtcbiAgdmFyIHBhZGRpbmcgPSBIZWxwZXJzLmdldFBhZGRpbmcocHJvcHMpO1xuICB2YXIgbGFiZWxQYWRkaW5nID0gZ2V0TGFiZWxQYWRkaW5nKHByb3BzLCBzdHlsZSk7XG4gIHZhciBzdHJpbmdUaWNrcyA9IEF4aXMuc3RyaW5nVGlja3MocHJvcHMpID8gcHJvcHMudGlja1ZhbHVlcyA6IHVuZGVmaW5lZDtcbiAgdmFyIGF4aXMgPSBBeGlzLmdldEF4aXMocHJvcHMpO1xuICB2YXIgYXhpc0RvbWFpbiA9IEF4aXMuZ2V0RG9tYWluKHByb3BzKTtcbiAgdmFyIGF4aXNTY2FsZSA9IGdldFNjYWxlKHByb3BzKTtcbiAgdmFyIHhBeGlzRG9tYWluID0gYXhpcyA9PT0gXCJ4XCIgPyBheGlzRG9tYWluIDogdW5kZWZpbmVkO1xuICB2YXIgeUF4aXNEb21haW4gPSBheGlzID09PSBcInlcIiA/IGF4aXNEb21haW4gOiB1bmRlZmluZWQ7XG4gIHZhciB4QXhpc1NjYWxlID0gYXhpcyA9PT0gXCJ4XCIgPyBheGlzU2NhbGUgOiB1bmRlZmluZWQ7XG4gIHZhciB5QXhpc1NjYWxlID0gYXhpcyA9PT0gXCJ5XCIgPyBheGlzU2NhbGUgOiB1bmRlZmluZWQ7XG4gIHZhciBjcm9zc0F4aXMgPSBwcm9wcy5jcm9zc0F4aXMgPT09IGZhbHNlIHx8IHByb3BzLnN0YW5kYWxvbmUgPT09IHRydWUgPyBmYWxzZSA6IHRydWU7XG4gIHZhciB0aWNrcyA9IEF4aXMuZ2V0VGlja3MocHJvcHMsIGF4aXNTY2FsZSwgY3Jvc3NBeGlzKTtcbiAgdmFyIHRpY2tGb3JtYXQgPSBBeGlzLmdldFRpY2tGb3JtYXQocHJvcHMsIGF4aXNTY2FsZSk7XG4gIHZhciByYW5nZSA9IHtcbiAgICB4OiBIZWxwZXJzLmdldFJhbmdlKHByb3BzLCBcInhcIiksXG4gICAgeTogSGVscGVycy5nZXRSYW5nZShwcm9wcywgXCJ5XCIpXG4gIH07IC8vIHVzZSBmdWxsIGRvbWFpbiBpZiBwYXNzZWQgaW4gZnJvbSBwYXJlbnQsXG4gIC8vIG90aGVyd2lzZSB1c2UgdGhlIGp1c3QgdGhlIG9uZSBheGlzIGF2YWlsYWJsZVxuXG4gIHZhciBkb21haW4gPSB7XG4gICAgeDogcHJvcHMuZG9tYWluICYmIHByb3BzLmRvbWFpbi54ID8gcHJvcHMuZG9tYWluLnggOiB4QXhpc0RvbWFpbixcbiAgICB5OiBwcm9wcy5kb21haW4gJiYgcHJvcHMuZG9tYWluLnkgPyBwcm9wcy5kb21haW4ueSA6IHlBeGlzRG9tYWluXG4gIH07IC8vIHVzZSBmdWxsIHNjYWxlIGlmIHBhc3NlZCBpbiBmcm9tIHBhcmVudCxcbiAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUganVzdCB0aGUgb25lIGF4aXMgYXZhaWxhYmxlXG5cbiAgdmFyIHNjYWxlID0ge1xuICAgIHg6IHByb3BzLmRvbWFpbiAmJiBwcm9wcy5kb21haW4ueCA/IFNjYWxlLmdldEJhc2VTY2FsZShwcm9wcywgXCJ4XCIpLmRvbWFpbihwcm9wcy5kb21haW4ueCkucmFuZ2UocHJvcHMuaG9yaXpvbnRhbCA/IHJhbmdlLnkgOiByYW5nZS54KSA6IHhBeGlzU2NhbGUsXG4gICAgeTogcHJvcHMuZG9tYWluICYmIHByb3BzLmRvbWFpbi55ID8gU2NhbGUuZ2V0QmFzZVNjYWxlKHByb3BzLCBcInlcIikuZG9tYWluKHByb3BzLmRvbWFpbi55KS5yYW5nZShwcm9wcy5ob3Jpem9udGFsID8gcmFuZ2UueCA6IHJhbmdlLnkpIDogeUF4aXNTY2FsZVxuICB9O1xuICB2YXIgb3JpZ2luID0gZG9tYWluLnggJiYgZG9tYWluLnkgPyBBeGlzLmdldE9yaWdpbihkb21haW4pIDogdW5kZWZpbmVkO1xuICB2YXIgb3JpZ2luU2lnbiA9IG9yaWdpbiA/IHtcbiAgICB4OiBBeGlzLmdldE9yaWdpblNpZ24ob3JpZ2luLngsIGRvbWFpbi54KSxcbiAgICB5OiBBeGlzLmdldE9yaWdpblNpZ24ob3JpZ2luLnksIGRvbWFpbi55KVxuICB9IDogdW5kZWZpbmVkO1xuICB2YXIgb3JpZW50YXRpb25zID0gb3JpZ2luU2lnbiA/IHtcbiAgICB4OiBnZXREZWZhdWx0T3JpZW50YXRpb25zKFwieFwiLCBvcmlnaW5TaWduLnksIHByb3BzLmhvcml6b250YWwpLFxuICAgIHk6IGdldERlZmF1bHRPcmllbnRhdGlvbnMoXCJ5XCIsIG9yaWdpblNpZ24ueCwgcHJvcHMuaG9yaXpvbnRhbClcbiAgfSA6IHVuZGVmaW5lZDtcbiAgdmFyIG9yaWVudGF0aW9uID0gb3JpZW50YXRpb25zID8gcHJvcHMub3JpZW50YXRpb24gfHwgb3JpZW50YXRpb25zW2F4aXNdIDogZ2V0T3JpZW50YXRpb24ocHJvcHMpO1xuICB2YXIgaXNWZXJ0aWNhbCA9IEF4aXMuaXNWZXJ0aWNhbChPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIG9yaWVudGF0aW9uOiBvcmllbnRhdGlvblxuICB9KSk7XG4gIHZhciBhbmNob3JzID0gZ2V0QW5jaG9ycyhvcmllbnRhdGlvbiwgaXNWZXJ0aWNhbCk7XG4gIHJldHVybiB7XG4gICAgYW5jaG9yczogYW5jaG9ycyxcbiAgICBheGlzOiBheGlzLFxuICAgIGNyb3NzQXhpczogY3Jvc3NBeGlzLFxuICAgIGRvbWFpbjogZG9tYWluLFxuICAgIGlzVmVydGljYWw6IGlzVmVydGljYWwsXG4gICAgbGFiZWxQYWRkaW5nOiBsYWJlbFBhZGRpbmcsXG4gICAgb3JpZW50YXRpb246IG9yaWVudGF0aW9uLFxuICAgIG9yaWVudGF0aW9uczogb3JpZW50YXRpb25zLFxuICAgIG9yaWdpbjogb3JpZ2luLFxuICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIHN0cmluZ1RpY2tzOiBzdHJpbmdUaWNrcyxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgdGlja0Zvcm1hdDogdGlja0Zvcm1hdCxcbiAgICB0aWNrczogdGlja3NcbiAgfTtcbn07XG5cbmV4cG9ydCB2YXIgZ2V0QmFzZVByb3BzID0gZnVuY3Rpb24gKHByb3BzLCBmYWxsYmFja1Byb3BzKSB7XG4gIHByb3BzID0gQXhpcy5tb2RpZnlQcm9wcyhwcm9wcywgZmFsbGJhY2tQcm9wcyk7XG4gIHZhciBjYWxjdWxhdGVkVmFsdWVzID0gZ2V0Q2FsY3VsYXRlZFZhbHVlcyhwcm9wcyk7XG4gIHZhciBheGlzID0gY2FsY3VsYXRlZFZhbHVlcy5heGlzLFxuICAgICAgc3R5bGUgPSBjYWxjdWxhdGVkVmFsdWVzLnN0eWxlLFxuICAgICAgb3JpZW50YXRpb24gPSBjYWxjdWxhdGVkVmFsdWVzLm9yaWVudGF0aW9uLFxuICAgICAgaXNWZXJ0aWNhbCA9IGNhbGN1bGF0ZWRWYWx1ZXMuaXNWZXJ0aWNhbCxcbiAgICAgIHNjYWxlID0gY2FsY3VsYXRlZFZhbHVlcy5zY2FsZSxcbiAgICAgIHRpY2tzID0gY2FsY3VsYXRlZFZhbHVlcy50aWNrcyxcbiAgICAgIHRpY2tGb3JtYXQgPSBjYWxjdWxhdGVkVmFsdWVzLnRpY2tGb3JtYXQsXG4gICAgICBhbmNob3JzID0gY2FsY3VsYXRlZFZhbHVlcy5hbmNob3JzLFxuICAgICAgZG9tYWluID0gY2FsY3VsYXRlZFZhbHVlcy5kb21haW4sXG4gICAgICBzdHJpbmdUaWNrcyA9IGNhbGN1bGF0ZWRWYWx1ZXMuc3RyaW5nVGlja3MsXG4gICAgICBuYW1lID0gY2FsY3VsYXRlZFZhbHVlcy5uYW1lO1xuICB2YXIgb3RoZXJBeGlzID0gYXhpcyA9PT0gXCJ4XCIgPyBcInlcIiA6IFwieFwiO1xuICB2YXIgX3Byb3BzID0gcHJvcHMsXG4gICAgICB3aWR0aCA9IF9wcm9wcy53aWR0aCxcbiAgICAgIGhlaWdodCA9IF9wcm9wcy5oZWlnaHQsXG4gICAgICBzdGFuZGFsb25lID0gX3Byb3BzLnN0YW5kYWxvbmUsXG4gICAgICB0aGVtZSA9IF9wcm9wcy50aGVtZSxcbiAgICAgIHBvbGFyID0gX3Byb3BzLnBvbGFyLFxuICAgICAgcGFkZGluZyA9IF9wcm9wcy5wYWRkaW5nLFxuICAgICAgaG9yaXpvbnRhbCA9IF9wcm9wcy5ob3Jpem9udGFsO1xuXG4gIHZhciBfZ2V0TGF5b3V0UHJvcHMgPSBnZXRMYXlvdXRQcm9wcyhwcm9wcywgY2FsY3VsYXRlZFZhbHVlcyksXG4gICAgICBnbG9iYWxUcmFuc2Zvcm0gPSBfZ2V0TGF5b3V0UHJvcHMuZ2xvYmFsVHJhbnNmb3JtLFxuICAgICAgZ3JpZE9mZnNldCA9IF9nZXRMYXlvdXRQcm9wcy5ncmlkT2Zmc2V0LFxuICAgICAgZ3JpZEVkZ2UgPSBfZ2V0TGF5b3V0UHJvcHMuZ3JpZEVkZ2U7XG5cbiAgdmFyIHNoYXJlZFByb3BzID0ge1xuICAgIHNjYWxlOiBfZGVmaW5lUHJvcGVydHkoe30sIGF4aXMsIHNjYWxlW2F4aXNdKSxcbiAgICBwb2xhcjogcG9sYXIsXG4gICAgaG9yaXpvbnRhbDogaG9yaXpvbnRhbCxcbiAgICB0aWNrczogdGlja3MsXG4gICAgc3RyaW5nVGlja3M6IHN0cmluZ1RpY2tzXG4gIH07XG4gIHZhciBheGlzUHJvcHMgPSBnZXRBeGlzUHJvcHMocHJvcHMsIGNhbGN1bGF0ZWRWYWx1ZXMsIGdsb2JhbFRyYW5zZm9ybSk7XG4gIHZhciBheGlzTGFiZWxQcm9wcyA9IGdldEF4aXNMYWJlbFByb3BzKHByb3BzLCBjYWxjdWxhdGVkVmFsdWVzLCBnbG9iYWxUcmFuc2Zvcm0pO1xuICB2YXIgaW5pdGlhbENoaWxkUHJvcHMgPSB7XG4gICAgcGFyZW50OiBfYXNzaWduKHtcbiAgICAgIHN0eWxlOiBzdHlsZS5wYXJlbnQsXG4gICAgICB0aWNrczogdGlja3MsXG4gICAgICBzdGFuZGFsb25lOiBzdGFuZGFsb25lLFxuICAgICAgdGhlbWU6IHRoZW1lLFxuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgZG9tYWluOiBkb21haW4sXG4gICAgICBuYW1lOiBuYW1lXG4gICAgfSwgc2hhcmVkUHJvcHMpXG4gIH07XG4gIHZhciBncmlkUHJvcHMgPSB7XG4gICAgZGltZW5zaW9uOiBvdGhlckF4aXMsXG4gICAgcmFuZ2U6IF9kZWZpbmVQcm9wZXJ0eSh7fSwgb3RoZXJBeGlzLCBIZWxwZXJzLmdldFJhbmdlKHByb3BzLCBvdGhlckF4aXMpKSxcbiAgICBzY2FsZTogcHJvcHMuc2NhbGUgJiYgcHJvcHMuc2NhbGVbb3RoZXJBeGlzXSA/IF9kZWZpbmVQcm9wZXJ0eSh7fSwgb3RoZXJBeGlzLCBwcm9wcy5zY2FsZVtvdGhlckF4aXNdKSA6IHVuZGVmaW5lZFxuICB9O1xuICByZXR1cm4gdGlja3MucmVkdWNlKGZ1bmN0aW9uIChjaGlsZFByb3BzLCB0aWNrVmFsdWUsIGluZGV4KSB7XG4gICAgdmFyIHRpY2sgPSBzdHJpbmdUaWNrcyA/IHN0cmluZ1RpY2tzW2luZGV4XSA6IHRpY2tWYWx1ZTtcbiAgICB2YXIgdGV4dCA9IHRpY2tGb3JtYXQodGlja1ZhbHVlLCBpbmRleCwgdGlja3MpO1xuICAgIHZhciBzdHlsZXMgPSBnZXRFdmFsdWF0ZWRTdHlsZXMoc3R5bGUsIF9hc3NpZ24oe30sIHNoYXJlZFByb3BzLCB7XG4gICAgICB0aWNrOiB0aWNrLFxuICAgICAgdGlja1ZhbHVlOiB0aWNrVmFsdWUsXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICB0ZXh0OiB0ZXh0XG4gICAgfSkpO1xuICAgIHZhciB0aWNrTGF5b3V0ID0ge1xuICAgICAgcG9zaXRpb246IGdldFRpY2tQb3NpdGlvbihzdHlsZXMsIG9yaWVudGF0aW9uLCBpc1ZlcnRpY2FsKSxcbiAgICAgIHRyYW5zZm9ybTogZ2V0VGlja1RyYW5zZm9ybShzY2FsZVtheGlzXSh0aWNrVmFsdWUpLCBnbG9iYWxUcmFuc2Zvcm0sIGlzVmVydGljYWwpXG4gICAgfTtcbiAgICB2YXIgZ3JpZExheW91dCA9IHtcbiAgICAgIGVkZ2U6IGdyaWRFZGdlLFxuICAgICAgdHJhbnNmb3JtOiB7XG4gICAgICAgIHg6IGlzVmVydGljYWwgPyAtZ3JpZE9mZnNldC54ICsgZ2xvYmFsVHJhbnNmb3JtLnggOiBzY2FsZVtheGlzXSh0aWNrVmFsdWUpICsgZ2xvYmFsVHJhbnNmb3JtLngsXG4gICAgICAgIHk6IGlzVmVydGljYWwgPyBzY2FsZVtheGlzXSh0aWNrVmFsdWUpICsgZ2xvYmFsVHJhbnNmb3JtLnkgOiBncmlkT2Zmc2V0LnkgKyBnbG9iYWxUcmFuc2Zvcm0ueVxuICAgICAgfVxuICAgIH07XG4gICAgY2hpbGRQcm9wc1tpbmRleF0gPSB7XG4gICAgICBheGlzOiBfYXNzaWduKHtcbiAgICAgICAgZGltZW5zaW9uOiBheGlzXG4gICAgICB9LCBzaGFyZWRQcm9wcywgYXhpc1Byb3BzKSxcbiAgICAgIGF4aXNMYWJlbDogX2Fzc2lnbih7fSwgc2hhcmVkUHJvcHMsIGF4aXNMYWJlbFByb3BzKSxcbiAgICAgIHRpY2tzOiBfYXNzaWduKHt9LCBzaGFyZWRQcm9wcywgZ2V0VGlja1Byb3BzKHRpY2tMYXlvdXQsIHN0eWxlcy50aWNrU3R5bGUsIHRpY2tWYWx1ZSkpLFxuICAgICAgdGlja0xhYmVsczogX2Fzc2lnbih7fSwgc2hhcmVkUHJvcHMsIGdldFRpY2tMYWJlbFByb3BzKHRpY2tMYXlvdXQsIHN0eWxlcy5sYWJlbFN0eWxlLCBhbmNob3JzLCB0aWNrVmFsdWUsIHRleHQpKSxcbiAgICAgIGdyaWQ6IF9hc3NpZ24oe30sIHNoYXJlZFByb3BzLCBncmlkUHJvcHMsIGdldEdyaWRQcm9wcyhncmlkTGF5b3V0LCBzdHlsZXMuZ3JpZFN0eWxlLCB0aWNrVmFsdWUpKVxuICAgIH07XG4gICAgcmV0dXJuIGNoaWxkUHJvcHM7XG4gIH0sIGluaXRpYWxDaGlsZFByb3BzKTtcbn07IiwiaW1wb3J0IF9pc0VtcHR5IGZyb20gXCJsb2Rhc2gvaXNFbXB0eVwiO1xuaW1wb3J0IF9hc3NpZ24gZnJvbSBcImxvZGFzaC9hc3NpZ25cIjtcblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFByb3BUeXBlcyBhcyBDdXN0b21Qcm9wVHlwZXMsIFZpY3RvcnlMYWJlbCwgQ29tbW9uUHJvcHMsIFZpY3RvcnlDb250YWluZXIsIFZpY3RvcnlUaGVtZSwgTGluZVNlZ21lbnQsIFRleHRTaXplLCBhZGRFdmVudHMsIEF4aXMgfSBmcm9tIFwidmljdG9yeS1jb3JlXCI7XG5pbXBvcnQgeyBnZXRCYXNlUHJvcHMsIGdldFN0eWxlcyB9IGZyb20gXCIuL2hlbHBlci1tZXRob2RzXCI7XG52YXIgZmFsbGJhY2tQcm9wcyA9IHtcbiAgd2lkdGg6IDQ1MCxcbiAgaGVpZ2h0OiAzMDAsXG4gIHBhZGRpbmc6IDUwXG59O1xudmFyIG9wdGlvbnMgPSB7XG4gIGNvbXBvbmVudHM6IFt7XG4gICAgbmFtZTogXCJheGlzXCIsXG4gICAgaW5kZXg6IDBcbiAgfSwge1xuICAgIG5hbWU6IFwiYXhpc0xhYmVsXCIsXG4gICAgaW5kZXg6IDBcbiAgfSwge1xuICAgIG5hbWU6IFwiZ3JpZFwiXG4gIH0sIHtcbiAgICBuYW1lOiBcInBhcmVudFwiLFxuICAgIGluZGV4OiBcInBhcmVudFwiXG4gIH0sIHtcbiAgICBuYW1lOiBcInRpY2tzXCJcbiAgfSwge1xuICAgIG5hbWU6IFwidGlja0xhYmVsc1wiXG4gIH1dXG59O1xuXG52YXIgVmljdG9yeUF4aXMgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFZpY3RvcnlBeGlzLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBWaWN0b3J5QXhpcygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmljdG9yeUF4aXMpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChWaWN0b3J5QXhpcy5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFZpY3RvcnlBeGlzKSkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVmljdG9yeUF4aXMsIFt7XG4gICAga2V5OiBcInJlbmRlckxpbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyTGluZShwcm9wcykge1xuICAgICAgdmFyIGF4aXNDb21wb25lbnQgPSBwcm9wcy5heGlzQ29tcG9uZW50O1xuICAgICAgdmFyIGF4aXNQcm9wcyA9IHRoaXMuZ2V0Q29tcG9uZW50UHJvcHMoYXhpc0NvbXBvbmVudCwgXCJheGlzXCIsIDApO1xuICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChheGlzQ29tcG9uZW50LCBheGlzUHJvcHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJMYWJlbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJMYWJlbChwcm9wcykge1xuICAgICAgdmFyIGF4aXNMYWJlbENvbXBvbmVudCA9IHByb3BzLmF4aXNMYWJlbENvbXBvbmVudCxcbiAgICAgICAgICBsYWJlbCA9IHByb3BzLmxhYmVsO1xuXG4gICAgICBpZiAoIWxhYmVsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgYXhpc0xhYmVsUHJvcHMgPSB0aGlzLmdldENvbXBvbmVudFByb3BzKGF4aXNMYWJlbENvbXBvbmVudCwgXCJheGlzTGFiZWxcIiwgMCk7XG4gICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGF4aXNMYWJlbENvbXBvbmVudCwgYXhpc0xhYmVsUHJvcHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJHcmlkQW5kVGlja3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyR3JpZEFuZFRpY2tzKHByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgdGlja0NvbXBvbmVudCA9IHByb3BzLnRpY2tDb21wb25lbnQsXG4gICAgICAgICAgdGlja0xhYmVsQ29tcG9uZW50ID0gcHJvcHMudGlja0xhYmVsQ29tcG9uZW50LFxuICAgICAgICAgIGdyaWRDb21wb25lbnQgPSBwcm9wcy5ncmlkQ29tcG9uZW50LFxuICAgICAgICAgIG5hbWUgPSBwcm9wcy5uYW1lO1xuXG4gICAgICB2YXIgc2hvdWxkUmVuZGVyID0gZnVuY3Rpb24gKGNvbXBvbmVudFByb3BzKSB7XG4gICAgICAgIHZhciBfY29tcG9uZW50UHJvcHMkc3R5bGUgPSBjb21wb25lbnRQcm9wcy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlID0gX2NvbXBvbmVudFByb3BzJHN0eWxlID09PSB2b2lkIDAgPyB7fSA6IF9jb21wb25lbnRQcm9wcyRzdHlsZSxcbiAgICAgICAgICAgIF9jb21wb25lbnRQcm9wcyRldmVudCA9IGNvbXBvbmVudFByb3BzLmV2ZW50cyxcbiAgICAgICAgICAgIGV2ZW50cyA9IF9jb21wb25lbnRQcm9wcyRldmVudCA9PT0gdm9pZCAwID8ge30gOiBfY29tcG9uZW50UHJvcHMkZXZlbnQ7XG4gICAgICAgIHZhciB2aXNpYmxlID0gc3R5bGUuc3Ryb2tlICE9PSBcInRyYW5zcGFyZW50XCIgJiYgc3R5bGUuc3Ryb2tlICE9PSBcIm5vbmVcIiAmJiBzdHlsZS5zdHJva2VXaWR0aCAhPT0gMDtcbiAgICAgICAgcmV0dXJuIHZpc2libGUgfHwgIV9pc0VtcHR5KGV2ZW50cyk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcy5kYXRhS2V5cy5tYXAoZnVuY3Rpb24gKGtleSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHRpY2tQcm9wcyA9IF90aGlzLmdldENvbXBvbmVudFByb3BzKHRpY2tDb21wb25lbnQsIFwidGlja3NcIiwgaW5kZXgpO1xuXG4gICAgICAgIHZhciBCYXNlVGlja0NvbXBvbmVudCA9IFJlYWN0LmNsb25lRWxlbWVudCh0aWNrQ29tcG9uZW50LCB0aWNrUHJvcHMpO1xuICAgICAgICB2YXIgVGlja0NvbXBvbmVudCA9IHNob3VsZFJlbmRlcihCYXNlVGlja0NvbXBvbmVudC5wcm9wcykgPyBCYXNlVGlja0NvbXBvbmVudCA6IHVuZGVmaW5lZDtcblxuICAgICAgICB2YXIgZ3JpZFByb3BzID0gX3RoaXMuZ2V0Q29tcG9uZW50UHJvcHMoZ3JpZENvbXBvbmVudCwgXCJncmlkXCIsIGluZGV4KTtcblxuICAgICAgICB2YXIgQmFzZUdyaWRDb21wb25lbnQgPSBSZWFjdC5jbG9uZUVsZW1lbnQoZ3JpZENvbXBvbmVudCwgZ3JpZFByb3BzKTtcbiAgICAgICAgdmFyIEdyaWRDb21wb25lbnQgPSBzaG91bGRSZW5kZXIoQmFzZUdyaWRDb21wb25lbnQucHJvcHMpID8gQmFzZUdyaWRDb21wb25lbnQgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgdmFyIHRpY2tMYWJlbFByb3BzID0gX3RoaXMuZ2V0Q29tcG9uZW50UHJvcHModGlja0xhYmVsQ29tcG9uZW50LCBcInRpY2tMYWJlbHNcIiwgaW5kZXgpO1xuXG4gICAgICAgIHZhciBUaWNrTGFiZWwgPSBSZWFjdC5jbG9uZUVsZW1lbnQodGlja0xhYmVsQ29tcG9uZW50LCB0aWNrTGFiZWxQcm9wcyk7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IFtHcmlkQ29tcG9uZW50LCBUaWNrQ29tcG9uZW50LCBUaWNrTGFiZWxdLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChwcm9wcy5ncm91cENvbXBvbmVudCwge1xuICAgICAgICAgIGtleTogXCJcIi5jb25jYXQobmFtZSwgXCItdGljay1ncm91cC1cIikuY29uY2F0KGtleSlcbiAgICAgICAgfSwgY2hpbGRyZW4pO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZpeExhYmVsT3ZlcmxhcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaXhMYWJlbE92ZXJsYXAoZ3JpZEFuZFRpY2tzLCBwcm9wcykge1xuICAgICAgdmFyIGlzVmVydGljYWwgPSBBeGlzLmlzVmVydGljYWwocHJvcHMpO1xuICAgICAgdmFyIHNpemUgPSBpc1ZlcnRpY2FsID8gcHJvcHMuaGVpZ2h0IDogcHJvcHMud2lkdGg7XG5cbiAgICAgIHZhciBpc1ZpY3RvcnlMYWJlbCA9IGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gY2hpbGQudHlwZSAmJiBjaGlsZC50eXBlLnJvbGUgPT09IFwibGFiZWxcIjtcbiAgICAgIH07XG5cbiAgICAgIHZhciBsYWJlbHMgPSBncmlkQW5kVGlja3MubWFwKGZ1bmN0aW9uIChncmlkQW5kVGljaykge1xuICAgICAgICByZXR1cm4gZ3JpZEFuZFRpY2sucHJvcHMuY2hpbGRyZW47XG4gICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGFjY3VtdWxhdG9yLCBjaGlsZEFycikge1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3IuY29uY2F0KGNoaWxkQXJyKTtcbiAgICAgIH0sIFtdKS5maWx0ZXIoaXNWaWN0b3J5TGFiZWwpLm1hcChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkLnByb3BzO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBwYWRkaW5nVG9PYmplY3QgPSBmdW5jdGlvbiAocGFkZGluZykge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHBhZGRpbmcgPT09IFwib2JqZWN0XCIgPyBfYXNzaWduKHt9LCB7XG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICBsZWZ0OiAwXG4gICAgICAgIH0sIHBhZGRpbmcpIDoge1xuICAgICAgICAgIHRvcDogcGFkZGluZyxcbiAgICAgICAgICByaWdodDogcGFkZGluZyxcbiAgICAgICAgICBib3R0b206IHBhZGRpbmcsXG4gICAgICAgICAgbGVmdDogcGFkZGluZ1xuICAgICAgICB9O1xuICAgICAgfTtcblxuICAgICAgdmFyIGxhYmVsc1N1bVNpemUgPSBsYWJlbHMucmVkdWNlKGZ1bmN0aW9uIChzdW0sIGxhYmVsKSB7XG4gICAgICAgIHZhciBwYWRkaW5nID0gcGFkZGluZ1RvT2JqZWN0KGxhYmVsLnN0eWxlLnBhZGRpbmcpO1xuICAgICAgICB2YXIgbGFiZWxTaXplID0gVGV4dFNpemUuYXBwcm94aW1hdGVUZXh0U2l6ZShsYWJlbC50ZXh0LCB7XG4gICAgICAgICAgYW5nbGU6IGxhYmVsLmFuZ2xlLFxuICAgICAgICAgIGZvbnRTaXplOiBsYWJlbC5zdHlsZS5mb250U2l6ZSxcbiAgICAgICAgICBsZXR0ZXJTcGFjaW5nOiBsYWJlbC5zdHlsZS5sZXR0ZXJTcGFjaW5nLFxuICAgICAgICAgIGZvbnRGYW1pbHk6IGxhYmVsLnN0eWxlLmZvbnRGYW1pbHlcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdW0gKyAoaXNWZXJ0aWNhbCA/IGxhYmVsU2l6ZS5oZWlnaHQgKyBwYWRkaW5nLnRvcCArIHBhZGRpbmcuYm90dG9tIDogbGFiZWxTaXplLndpZHRoICsgcGFkZGluZy5yaWdodCArIHBhZGRpbmcubGVmdCk7XG4gICAgICB9LCAwKTtcbiAgICAgIHZhciBhdmFpbGlhYmxlTGFiZWxDb3VudCA9IE1hdGguZmxvb3Ioc2l6ZSAqIGdyaWRBbmRUaWNrcy5sZW5ndGggLyBsYWJlbHNTdW1TaXplKTtcbiAgICAgIHZhciBkaXZpZGVyID0gTWF0aC5jZWlsKGdyaWRBbmRUaWNrcy5sZW5ndGggLyBhdmFpbGlhYmxlTGFiZWxDb3VudCkgfHwgMTtcblxuICAgICAgdmFyIGdldExhYmVsQ29vcmQgPSBmdW5jdGlvbiAoZ3JpZEFuZFRpY2spIHtcbiAgICAgICAgcmV0dXJuIGdyaWRBbmRUaWNrLnByb3BzLmNoaWxkcmVuLmZpbHRlcihpc1ZpY3RvcnlMYWJlbCkucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjaGlsZCkge1xuICAgICAgICAgIHJldHVybiAoaXNWZXJ0aWNhbCA/IGNoaWxkLnByb3BzLnkgOiBjaGlsZC5wcm9wcy54KSB8fCAwO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBzb3J0ZWQgPSBncmlkQW5kVGlja3Muc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gaXNWZXJ0aWNhbCA/IGdldExhYmVsQ29vcmQoYikgLSBnZXRMYWJlbENvb3JkKGEpIC8vb3JkaW5hcnkgYXhpcyBoYXMgdG9wLWJvdHRvbSBvcmllbnRhdGlvblxuICAgICAgICA6IGdldExhYmVsQ29vcmQoYSkgLSBnZXRMYWJlbENvb3JkKGIpO1xuICAgICAgfSAvL29yZGluYXJ5IGF4aXMgaGFzIGxlZnQtcmlnaHQgb3JpZW50YXRpb25cbiAgICAgICk7XG4gICAgICByZXR1cm4gc29ydGVkLmZpbHRlcihmdW5jdGlvbiAoZ3JpZEFuZFRpY2ssIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBpbmRleCAlIGRpdmlkZXIgPT09IDA7XG4gICAgICB9KTtcbiAgICB9IC8vIE92ZXJyaWRkZW4gaW4gbmF0aXZlIHZlcnNpb25zXG5cbiAgfSwge1xuICAgIGtleTogXCJzaG91bGRBbmltYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZEFuaW1hdGUoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnByb3BzLmFuaW1hdGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgYW5pbWF0aW9uV2hpdGVsaXN0ID0gVmljdG9yeUF4aXMuYW5pbWF0aW9uV2hpdGVsaXN0O1xuICAgICAgdmFyIHByb3BzID0gQXhpcy5tb2RpZnlQcm9wcyh0aGlzLnByb3BzLCBmYWxsYmFja1Byb3BzKTtcblxuICAgICAgaWYgKHRoaXMuc2hvdWxkQW5pbWF0ZSgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuaW1hdGVDb21wb25lbnQocHJvcHMsIGFuaW1hdGlvbldoaXRlbGlzdCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBncmlkQW5kVGlja3MgPSB0aGlzLnJlbmRlckdyaWRBbmRUaWNrcyhwcm9wcyk7XG4gICAgICB2YXIgbW9kaWZpZWRHcmlkQW5kVGlja3MgPSBwcm9wcy5maXhMYWJlbE92ZXJsYXAgPyB0aGlzLmZpeExhYmVsT3ZlcmxhcChncmlkQW5kVGlja3MsIHByb3BzKSA6IGdyaWRBbmRUaWNrcztcbiAgICAgIHZhciBjaGlsZHJlbiA9IFt0aGlzLnJlbmRlckxpbmUocHJvcHMpLCB0aGlzLnJlbmRlckxhYmVsKHByb3BzKV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShtb2RpZmllZEdyaWRBbmRUaWNrcykpO1xuICAgICAgcmV0dXJuIHByb3BzLnN0YW5kYWxvbmUgPyB0aGlzLnJlbmRlckNvbnRhaW5lcihwcm9wcy5jb250YWluZXJDb21wb25lbnQsIGNoaWxkcmVuKSA6IFJlYWN0LmNsb25lRWxlbWVudChwcm9wcy5ncm91cENvbXBvbmVudCwge30sIGNoaWxkcmVuKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVmljdG9yeUF4aXM7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5QXhpcywgXCJhbmltYXRpb25XaGl0ZWxpc3RcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogW1wic3R5bGVcIiwgXCJkb21haW5cIiwgXCJyYW5nZVwiLCBcInRpY2tDb3VudFwiLCBcInRpY2tWYWx1ZXNcIiwgXCJvZmZzZXRYXCIsIFwib2Zmc2V0WVwiLCBcInBhZGRpbmdcIiwgXCJ3aWR0aFwiLCBcImhlaWdodFwiXVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUF4aXMsIFwiZGlzcGxheU5hbWVcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogXCJWaWN0b3J5QXhpc1wiXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5QXhpcywgXCJyb2xlXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFwiYXhpc1wiXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5QXhpcywgXCJkZWZhdWx0VHJhbnNpdGlvbnNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZToge1xuICAgIG9uRXhpdDoge1xuICAgICAgZHVyYXRpb246IDUwMFxuICAgIH0sXG4gICAgb25FbnRlcjoge1xuICAgICAgZHVyYXRpb246IDUwMFxuICAgIH1cbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUF4aXMsIFwicHJvcFR5cGVzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IF9vYmplY3RTcHJlYWQoe30sIENvbW1vblByb3BzLmJhc2VQcm9wcywge1xuICAgIGF4aXNDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICAgIGF4aXNMYWJlbENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gICAgYXhpc1ZhbHVlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMub2JqZWN0XSksXG4gICAgY2F0ZWdvcmllczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICB4OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSxcbiAgICAgIHk6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpXG4gICAgfSldKSxcbiAgICBjcm9zc0F4aXM6IFByb3BUeXBlcy5ib29sLFxuICAgIGRlcGVuZGVudEF4aXM6IFByb3BUeXBlcy5ib29sLFxuICAgIGV2ZW50czogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIHRhcmdldDogUHJvcFR5cGVzLm9uZU9mKFtcImF4aXNcIiwgXCJheGlzTGFiZWxcIiwgXCJncmlkXCIsIFwidGlja3NcIiwgXCJ0aWNrTGFiZWxzXCJdKSxcbiAgICAgIGV2ZW50S2V5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXksIEN1c3RvbVByb3BUeXBlcy5hbGxPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5pbnRlZ2VyLCBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmVdKSwgUHJvcFR5cGVzLnN0cmluZ10pLFxuICAgICAgZXZlbnRIYW5kbGVyczogUHJvcFR5cGVzLm9iamVjdFxuICAgIH0pKSxcbiAgICBmaXhMYWJlbE92ZXJsYXA6IFByb3BUeXBlcy5ib29sLFxuICAgIGdyaWRDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICAgIGdyb3VwQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgICBpbnZlcnRBeGlzOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBsYWJlbDogUHJvcFR5cGVzLmFueSxcbiAgICBvZmZzZXRYOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIG9mZnNldFk6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgb3JpZW50YXRpb246IFByb3BUeXBlcy5vbmVPZihbXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwicmlnaHRcIl0pLFxuICAgIG9yaWdpbjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIHg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICB5OiBQcm9wVHlwZXMubnVtYmVyXG4gICAgfSksXG4gICAgc3RyaW5nTWFwOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHN0eWxlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgcGFyZW50OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgYXhpczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIGF4aXNMYWJlbDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIGdyaWQ6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICB0aWNrczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIHRpY2tMYWJlbHM6IFByb3BUeXBlcy5vYmplY3RcbiAgICB9KSxcbiAgICB0aWNrQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgICB0aWNrQ291bnQ6IEN1c3RvbVByb3BUeXBlcy5hbGxPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5pbnRlZ2VyLCBDdXN0b21Qcm9wVHlwZXMuZ3JlYXRlclRoYW5aZXJvXSksXG4gICAgdGlja0Zvcm1hdDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIEN1c3RvbVByb3BUeXBlcy5ob21vZ2VuZW91c0FycmF5XSksXG4gICAgdGlja0xhYmVsQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgICB0aWNrVmFsdWVzOiBDdXN0b21Qcm9wVHlwZXMuaG9tb2dlbmVvdXNBcnJheVxuICB9KVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUF4aXMsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHtcbiAgICBheGlzQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KExpbmVTZWdtZW50LCBudWxsKSxcbiAgICBheGlzTGFiZWxDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUxhYmVsLCBudWxsKSxcbiAgICB0aWNrTGFiZWxDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUxhYmVsLCBudWxsKSxcbiAgICB0aWNrQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KExpbmVTZWdtZW50LCBudWxsKSxcbiAgICBncmlkQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KExpbmVTZWdtZW50LCBudWxsKSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRoZW1lOiBWaWN0b3J5VGhlbWUuZ3JheXNjYWxlLFxuICAgIGNvbnRhaW5lckNvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5Q29udGFpbmVyLCBudWxsKSxcbiAgICBncm91cENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgICAgcm9sZTogXCJwcmVzZW50YXRpb25cIlxuICAgIH0pLFxuICAgIGZpeExhYmVsT3ZlcmxhcDogZmFsc2VcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUF4aXMsIFwiZ2V0RG9tYWluXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IEF4aXMuZ2V0RG9tYWluXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5QXhpcywgXCJnZXRBeGlzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IEF4aXMuZ2V0QXhpc1xufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUF4aXMsIFwiZ2V0U3R5bGVzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiBnZXRTdHlsZXMocHJvcHMsIGZhbGxiYWNrUHJvcHMuc3R5bGUpO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5QXhpcywgXCJnZXRCYXNlUHJvcHNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIGdldEJhc2VQcm9wcyhwcm9wcywgZmFsbGJhY2tQcm9wcyk7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlBeGlzLCBcImV4cGVjdGVkQ29tcG9uZW50c1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBbXCJheGlzQ29tcG9uZW50XCIsIFwiYXhpc0xhYmVsQ29tcG9uZW50XCIsIFwiZ3JvdXBDb21wb25lbnRcIiwgXCJjb250YWluZXJDb21wb25lbnRcIiwgXCJ0aWNrQ29tcG9uZW50XCIsIFwidGlja0xhYmVsQ29tcG9uZW50XCIsIFwiZ3JpZENvbXBvbmVudFwiXVxufSk7XG5leHBvcnQgZGVmYXVsdCBhZGRFdmVudHMoVmljdG9yeUF4aXMsIG9wdGlvbnMpOyIsImZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG52YXIgUGF0aCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvcHJvcC10eXBlc1xuICB2YXIgZGVzYyA9IHByb3BzLmRlc2MsXG4gICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJkZXNjXCJdKTtcblxuICByZXR1cm4gZGVzYyA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHJlc3QsIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkZXNjXCIsIG51bGwsIGRlc2MpKSA6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHJlc3QpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUGF0aDsiLCJpbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHsgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTsgfSkpOyB9IG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbi8qZXNsaW50IG5vLW1hZ2ljLW51bWJlcnM6IFtcImVycm9yXCIsIHsgXCJpZ25vcmVcIjogWzAsIDEsIDIsIDE4MF0gfV0qL1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tIFwiLi4vdmljdG9yeS11dGlsL2hlbHBlcnNcIjtcbmltcG9ydCAqIGFzIENvbW1vblByb3BzIGZyb20gXCIuLi92aWN0b3J5LXV0aWwvY29tbW9uLXByb3BzXCI7XG5pbXBvcnQgUGF0aCBmcm9tIFwiLi9wYXRoXCI7XG5cbnZhciBnZXRBcmNQYXRoID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciBjeCA9IHByb3BzLmN4LFxuICAgICAgY3kgPSBwcm9wcy5jeSxcbiAgICAgIHIgPSBwcm9wcy5yLFxuICAgICAgc3RhcnRBbmdsZSA9IHByb3BzLnN0YXJ0QW5nbGUsXG4gICAgICBlbmRBbmdsZSA9IHByb3BzLmVuZEFuZ2xlLFxuICAgICAgY2xvc2VkUGF0aCA9IHByb3BzLmNsb3NlZFBhdGg7IC8vIEFsd2F5cyBkcmF3IHRoZSBwYXRoIGFzIHR3byBhcmNzIHNvIHRoYXQgY29tcGxldGUgY2lyY2xlcyBtYXkgYmUgcmVuZGVyZWQuXG5cbiAgdmFyIGhhbGZBbmdsZSA9IE1hdGguYWJzKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSkgLyAyICsgc3RhcnRBbmdsZTtcbiAgdmFyIHgxID0gY3ggKyByICogTWF0aC5jb3MoSGVscGVycy5kZWdyZWVzVG9SYWRpYW5zKHN0YXJ0QW5nbGUpKTtcbiAgdmFyIHkxID0gY3kgLSByICogTWF0aC5zaW4oSGVscGVycy5kZWdyZWVzVG9SYWRpYW5zKHN0YXJ0QW5nbGUpKTtcbiAgdmFyIHgyID0gY3ggKyByICogTWF0aC5jb3MoSGVscGVycy5kZWdyZWVzVG9SYWRpYW5zKGhhbGZBbmdsZSkpO1xuICB2YXIgeTIgPSBjeSAtIHIgKiBNYXRoLnNpbihIZWxwZXJzLmRlZ3JlZXNUb1JhZGlhbnMoaGFsZkFuZ2xlKSk7XG4gIHZhciB4MyA9IGN4ICsgciAqIE1hdGguY29zKEhlbHBlcnMuZGVncmVlc1RvUmFkaWFucyhlbmRBbmdsZSkpO1xuICB2YXIgeTMgPSBjeSAtIHIgKiBNYXRoLnNpbihIZWxwZXJzLmRlZ3JlZXNUb1JhZGlhbnMoZW5kQW5nbGUpKTtcbiAgdmFyIGxhcmdlckFyY0ZsYWcxID0gaGFsZkFuZ2xlIC0gc3RhcnRBbmdsZSA8PSAxODAgPyAwIDogMTtcbiAgdmFyIGxhcmdlckFyY0ZsYWcyID0gZW5kQW5nbGUgLSBoYWxmQW5nbGUgPD0gMTgwID8gMCA6IDE7XG4gIHZhciBhcmNTdGFydCA9IGNsb3NlZFBhdGggPyBcIiBNIFwiLmNvbmNhdChjeCwgXCIsIFwiKS5jb25jYXQoY3ksIFwiIEwgXCIpLmNvbmNhdCh4MSwgXCIsIFwiKS5jb25jYXQoeTEpIDogXCJNIFwiLmNvbmNhdCh4MSwgXCIsIFwiKS5jb25jYXQoeTEpO1xuICB2YXIgYXJjMSA9IFwiQSBcIi5jb25jYXQociwgXCIsIFwiKS5jb25jYXQociwgXCIsIDAsIFwiKS5jb25jYXQobGFyZ2VyQXJjRmxhZzEsIFwiLCAwLCBcIikuY29uY2F0KHgyLCBcIiwgXCIpLmNvbmNhdCh5Mik7XG4gIHZhciBhcmMyID0gXCJBIFwiLmNvbmNhdChyLCBcIiwgXCIpLmNvbmNhdChyLCBcIiwgMCwgXCIpLmNvbmNhdChsYXJnZXJBcmNGbGFnMiwgXCIsIDAsIFwiKS5jb25jYXQoeDMsIFwiLCBcIikuY29uY2F0KHkzKTtcbiAgdmFyIGFyY0VuZCA9IGNsb3NlZFBhdGggPyBcIlpcIiA6IFwiXCI7XG4gIHJldHVybiBcIlwiLmNvbmNhdChhcmNTdGFydCwgXCIgXCIpLmNvbmNhdChhcmMxLCBcIiBcIikuY29uY2F0KGFyYzIsIFwiIFwiKS5jb25jYXQoYXJjRW5kKTtcbn07XG5cbnZhciBldmFsdWF0ZVByb3BzID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIC8qKlxuICAgKiBQb3RlbnRpYWwgZXZhbHVhdGVkIHByb3BzIGFyZTpcbiAgICogYGFyaWFMYWJlbGBcbiAgICogYGRlc2NgXG4gICAqIGBpZGBcbiAgICogYHN0eWxlYFxuICAgKiBgdGFiSW5kZXhgXG4gICAqL1xuICB2YXIgYXJpYUxhYmVsID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuYXJpYUxhYmVsLCBwcm9wcyk7XG4gIHZhciBkZXNjID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuZGVzYywgcHJvcHMpO1xuICB2YXIgaWQgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy5pZCwgcHJvcHMpO1xuICB2YXIgc3R5bGUgPSBIZWxwZXJzLmV2YWx1YXRlU3R5bGUoX2Fzc2lnbih7XG4gICAgc3Ryb2tlOiBcImJsYWNrXCIsXG4gICAgZmlsbDogXCJub25lXCJcbiAgfSwgcHJvcHMuc3R5bGUpLCBwcm9wcyk7XG4gIHZhciB0YWJJbmRleCA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLnRhYkluZGV4LCBwcm9wcyk7XG4gIHJldHVybiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgIGFyaWFMYWJlbDogYXJpYUxhYmVsLFxuICAgIGRlc2M6IGRlc2MsXG4gICAgaWQ6IGlkLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICB0YWJJbmRleDogdGFiSW5kZXhcbiAgfSk7XG59O1xuXG52YXIgQXJjID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHByb3BzID0gZXZhbHVhdGVQcm9wcyhwcm9wcyk7XG4gIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQocHJvcHMucGF0aENvbXBvbmVudCwgX29iamVjdFNwcmVhZCh7fSwgcHJvcHMuZXZlbnRzLCB7XG4gICAgXCJhcmlhLWxhYmVsXCI6IHByb3BzLmFyaWFMYWJlbCxcbiAgICBkOiBnZXRBcmNQYXRoKHByb3BzKSxcbiAgICBzdHlsZTogcHJvcHMuc3R5bGUsXG4gICAgZGVzYzogcHJvcHMuZGVzYyxcbiAgICB0YWJJbmRleDogcHJvcHMudGFiSW5kZXgsXG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgcm9sZTogcHJvcHMucm9sZSxcbiAgICBzaGFwZVJlbmRlcmluZzogcHJvcHMuc2hhcGVSZW5kZXJpbmcsXG4gICAgdHJhbnNmb3JtOiBwcm9wcy50cmFuc2Zvcm0sXG4gICAgY2xpcFBhdGg6IHByb3BzLmNsaXBQYXRoXG4gIH0pKTtcbn07XG5cbkFyYy5wcm9wVHlwZXMgPSBfb2JqZWN0U3ByZWFkKHt9LCBDb21tb25Qcm9wcy5wcmltaXRpdmVQcm9wcywge1xuICBjbG9zZWRQYXRoOiBQcm9wVHlwZXMuYm9vbCxcbiAgY3g6IFByb3BUeXBlcy5udW1iZXIsXG4gIGN5OiBQcm9wVHlwZXMubnVtYmVyLFxuICBkYXR1bTogUHJvcFR5cGVzLmFueSxcbiAgZW5kQW5nbGU6IFByb3BUeXBlcy5udW1iZXIsXG4gIHBhdGhDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICByOiBQcm9wVHlwZXMubnVtYmVyLFxuICBzdGFydEFuZ2xlOiBQcm9wVHlwZXMubnVtYmVyXG59KTtcbkFyYy5kZWZhdWx0UHJvcHMgPSB7XG4gIHBhdGhDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUGF0aCwgbnVsbCksXG4gIHJvbGU6IFwicHJlc2VudGF0aW9uXCIsXG4gIHNoYXBlUmVuZGVyaW5nOiBcImF1dG9cIlxufTtcbmV4cG9ydCBkZWZhdWx0IEFyYzsiLCJpbXBvcnQgX2RlZmF1bHRzIGZyb20gXCJsb2Rhc2gvZGVmYXVsdHNcIjtcbmltcG9ydCBfdW5pcUJ5IGZyb20gXCJsb2Rhc2gvdW5pcUJ5XCI7XG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuaW1wb3J0IHsgSGVscGVycywgTGFiZWxIZWxwZXJzLCBTY2FsZSwgQXhpcyB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcblxudmFyIGdldFBvc2l0aW9uID0gZnVuY3Rpb24gKHIsIGFuZ2xlLCBheGlzKSB7XG4gIHJldHVybiBheGlzID09PSBcInhcIiA/IHIgKiBNYXRoLmNvcyhhbmdsZSkgOiAtciAqIE1hdGguc2luKGFuZ2xlKTtcbn07XG5cbnZhciBnZXRBeGlzVHlwZSA9IGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgdHlwaWNhbFR5cGUgPSBwcm9wcy5kZXBlbmRlbnRBeGlzID8gXCJyYWRpYWxcIiA6IFwiYW5ndWxhclwiO1xuICB2YXIgaW52ZXJ0ZWRUeXBlID0gdHlwaWNhbFR5cGUgPT09IFwiYW5ndWxhclwiID8gXCJyYWRpYWxcIiA6IFwiYW5ndWxhclwiO1xuICByZXR1cm4gcHJvcHMuaG9yaXpvbnRhbCA/IGludmVydGVkVHlwZSA6IHR5cGljYWxUeXBlO1xufTtcblxudmFyIGZpbHRlclRpY2tzID0gZnVuY3Rpb24gKHRpY2tzLCBzY2FsZSkge1xuICB2YXIgY29tcGFyZVRpY2tzID0gZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gc2NhbGUodCkgJSAoMiAqIE1hdGguUEkpO1xuICB9O1xuXG4gIHJldHVybiBfdW5pcUJ5KHRpY2tzLCBjb21wYXJlVGlja3MpO1xufTtcblxudmFyIGdldEV2YWx1YXRlZFN0eWxlcyA9IGZ1bmN0aW9uIChzdHlsZSwgcHJvcHMpIHtcbiAgcmV0dXJuIHtcbiAgICB0aWNrU3R5bGU6IEhlbHBlcnMuZXZhbHVhdGVTdHlsZShzdHlsZS50aWNrcywgcHJvcHMpLFxuICAgIGxhYmVsU3R5bGU6IEhlbHBlcnMuZXZhbHVhdGVTdHlsZShzdHlsZS50aWNrTGFiZWxzLCBwcm9wcyksXG4gICAgZ3JpZFN0eWxlOiBIZWxwZXJzLmV2YWx1YXRlU3R5bGUoc3R5bGUuZ3JpZCwgcHJvcHMpXG4gIH07XG59O1xuXG52YXIgZ2V0U3R5bGVPYmplY3QgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIF9wcm9wcyR0aGVtZSA9IHByb3BzLnRoZW1lLFxuICAgICAgdGhlbWUgPSBfcHJvcHMkdGhlbWUgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJHRoZW1lLFxuICAgICAgZGVwZW5kZW50QXhpcyA9IHByb3BzLmRlcGVuZGVudEF4aXM7XG4gIHZhciBnZW5lcmFsQXhpc1N0eWxlID0gdGhlbWUucG9sYXJBeGlzICYmIHRoZW1lLnBvbGFyQXhpcy5zdHlsZSB8fCB0aGVtZS5heGlzICYmIHRoZW1lLmF4aXMuc3R5bGU7XG4gIHZhciBwb2xhckF4aXNUeXBlID0gZGVwZW5kZW50QXhpcyA/IFwicG9sYXJEZXBlbmRlbnRBeGlzXCIgOiBcInBvbGFySW5kZXBlbmRlbnRBeGlzXCI7XG4gIHZhciBzdGFuZGFyZEF4aXNUeXBlID0gZGVwZW5kZW50QXhpcyA/IFwiZGVwZW5kZW50QXhpc1wiIDogXCJpbmRlcGVuZGVudEF4aXNcIjtcbiAgdmFyIHNwZWNpZmljQXhpc1N0eWxlID0gdGhlbWVbcG9sYXJBeGlzVHlwZV0gJiYgdGhlbWVbcG9sYXJBeGlzVHlwZV0uc3R5bGUgfHwgdGhlbWVbc3RhbmRhcmRBeGlzVHlwZV0gJiYgdGhlbWVbc3RhbmRhcmRBeGlzVHlwZV0uc3R5bGU7XG5cbiAgdmFyIG1lcmdlU3R5bGVzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdHlsZU5hbWVzcGFjZXMgPSBbXCJheGlzXCIsIFwiYXhpc0xhYmVsXCIsIFwiZ3JpZFwiLCBcInBhcmVudFwiLCBcInRpY2tMYWJlbHNcIiwgXCJ0aWNrc1wiXTtcbiAgICByZXR1cm4gc3R5bGVOYW1lc3BhY2VzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgY3Vycikge1xuICAgICAgbWVtb1tjdXJyXSA9IF9kZWZhdWx0cyh7fSwgc3BlY2lmaWNBeGlzU3R5bGVbY3Vycl0sIGdlbmVyYWxBeGlzU3R5bGVbY3Vycl0pO1xuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfSwge30pO1xuICB9O1xuXG4gIHJldHVybiBnZW5lcmFsQXhpc1N0eWxlICYmIHNwZWNpZmljQXhpc1N0eWxlID8gbWVyZ2VTdHlsZXMoKSA6IHNwZWNpZmljQXhpc1N0eWxlIHx8IGdlbmVyYWxBeGlzU3R5bGU7XG59O1xuXG52YXIgZ2V0UmFkaXVzID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciBfSGVscGVycyRnZXRQYWRkaW5nID0gSGVscGVycy5nZXRQYWRkaW5nKHByb3BzKSxcbiAgICAgIGxlZnQgPSBfSGVscGVycyRnZXRQYWRkaW5nLmxlZnQsXG4gICAgICByaWdodCA9IF9IZWxwZXJzJGdldFBhZGRpbmcucmlnaHQsXG4gICAgICB0b3AgPSBfSGVscGVycyRnZXRQYWRkaW5nLnRvcCxcbiAgICAgIGJvdHRvbSA9IF9IZWxwZXJzJGdldFBhZGRpbmcuYm90dG9tO1xuXG4gIHZhciB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0O1xuICByZXR1cm4gTWF0aC5taW4od2lkdGggLSBsZWZ0IC0gcmlnaHQsIGhlaWdodCAtIHRvcCAtIGJvdHRvbSkgLyAyO1xufTtcblxudmFyIGdldFJhbmdlID0gZnVuY3Rpb24gKHByb3BzLCBheGlzKSB7XG4gIC8vIFJldHVybiB0aGUgcmFuZ2UgZnJvbSBwcm9wcyBpZiBvbmUgaXMgZ2l2ZW4uXG4gIGlmIChwcm9wcy5yYW5nZSAmJiBwcm9wcy5yYW5nZVtheGlzXSkge1xuICAgIHJldHVybiBwcm9wcy5yYW5nZVtheGlzXTtcbiAgfSBlbHNlIGlmIChwcm9wcy5yYW5nZSAmJiBBcnJheS5pc0FycmF5KHByb3BzLnJhbmdlKSkge1xuICAgIHJldHVybiBwcm9wcy5yYW5nZTtcbiAgfVxuXG4gIHZhciBheGlzVHlwZSA9IGdldEF4aXNUeXBlKHByb3BzKTtcblxuICBpZiAoYXhpc1R5cGUgPT09IFwiYW5ndWxhclwiKSB7XG4gICAgdmFyIHN0YXJ0QW5nbGUgPSBIZWxwZXJzLmRlZ3JlZXNUb1JhZGlhbnMocHJvcHMuc3RhcnRBbmdsZSk7XG4gICAgdmFyIGVuZEFuZ2xlID0gSGVscGVycy5kZWdyZWVzVG9SYWRpYW5zKHByb3BzLmVuZEFuZ2xlKTtcbiAgICByZXR1cm4gW3N0YXJ0QW5nbGUsIGVuZEFuZ2xlXTtcbiAgfVxuXG4gIHZhciByYWRpdXMgPSBnZXRSYWRpdXMocHJvcHMpO1xuICByZXR1cm4gW3Byb3BzLmlubmVyUmFkaXVzIHx8IDAsIHJhZGl1c107XG59OyAvLyBleHBvc2VkIGZvciB1c2UgYnkgVmljdG9yeUNoYXJ0IChuZWNlc3Nhcnk/KVxuXG5cbmV4cG9ydCB2YXIgZ2V0U2NhbGUgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIGF4aXMgPSBBeGlzLmdldEF4aXMocHJvcHMpO1xuICB2YXIgc2NhbGUgPSBTY2FsZS5nZXRCYXNlU2NhbGUocHJvcHMsIGF4aXMpO1xuICB2YXIgZG9tYWluID0gQXhpcy5nZXREb21haW4ocHJvcHMsIGF4aXMpIHx8IHNjYWxlLmRvbWFpbigpO1xuICB2YXIgcmFuZ2UgPSBnZXRSYW5nZShwcm9wcywgYXhpcyk7XG4gIHNjYWxlLnJhbmdlKHJhbmdlKTtcbiAgc2NhbGUuZG9tYWluKGRvbWFpbik7XG4gIHJldHVybiBzY2FsZTtcbn07XG5leHBvcnQgdmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uIChwcm9wcywgc3R5bGVPYmplY3QpIHtcbiAgaWYgKHByb3BzLmRpc2FibGVJbmxpbmVTdHlsZXMpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICB2YXIgc3R5bGUgPSBwcm9wcy5zdHlsZSB8fCB7fTtcbiAgc3R5bGVPYmplY3QgPSBzdHlsZU9iamVjdCB8fCB7fTtcbiAgdmFyIHBhcmVudFN0eWxlUHJvcHMgPSB7XG4gICAgaGVpZ2h0OiBcImF1dG9cIixcbiAgICB3aWR0aDogXCIxMDAlXCJcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBwYXJlbnQ6IF9kZWZhdWx0cyhwYXJlbnRTdHlsZVByb3BzLCBzdHlsZS5wYXJlbnQsIHN0eWxlT2JqZWN0LnBhcmVudCksXG4gICAgYXhpczogX2RlZmF1bHRzKHt9LCBzdHlsZS5heGlzLCBzdHlsZU9iamVjdC5heGlzKSxcbiAgICBheGlzTGFiZWw6IF9kZWZhdWx0cyh7fSwgc3R5bGUuYXhpc0xhYmVsLCBzdHlsZU9iamVjdC5heGlzTGFiZWwpLFxuICAgIGdyaWQ6IF9kZWZhdWx0cyh7fSwgc3R5bGUuZ3JpZCwgc3R5bGVPYmplY3QuZ3JpZCksXG4gICAgdGlja3M6IF9kZWZhdWx0cyh7fSwgc3R5bGUudGlja3MsIHN0eWxlT2JqZWN0LnRpY2tzKSxcbiAgICB0aWNrTGFiZWxzOiBfZGVmYXVsdHMoe30sIHN0eWxlLnRpY2tMYWJlbHMsIHN0eWxlT2JqZWN0LnRpY2tMYWJlbHMpXG4gIH07XG59O1xuXG52YXIgZ2V0QXhpc0FuZ2xlID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciBheGlzQW5nbGUgPSBwcm9wcy5heGlzQW5nbGUsXG4gICAgICBzdGFydEFuZ2xlID0gcHJvcHMuc3RhcnRBbmdsZSxcbiAgICAgIGRlcGVuZGVudEF4aXMgPSBwcm9wcy5kZXBlbmRlbnRBeGlzO1xuICB2YXIgYXhpcyA9IEF4aXMuZ2V0QXhpcyhwcm9wcyk7XG4gIHZhciBheGlzVmFsdWUgPSBBeGlzLmdldEF4aXNWYWx1ZShwcm9wcywgYXhpcyk7XG5cbiAgaWYgKGF4aXNWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICFkZXBlbmRlbnRBeGlzKSB7XG4gICAgcmV0dXJuIGF4aXNBbmdsZSA9PT0gdW5kZWZpbmVkID8gc3RhcnRBbmdsZSA6IGF4aXNBbmdsZTtcbiAgfVxuXG4gIHJldHVybiBIZWxwZXJzLnJhZGlhbnNUb0RlZ3JlZXMoYXhpc1ZhbHVlKTtcbn07IC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcblxuXG52YXIgZ2V0VGlja1Byb3BzID0gZnVuY3Rpb24gKHByb3BzLCBjYWxjdWxhdGVkVmFsdWVzLCB0aWNrVmFsdWUsIGluZGV4KSB7XG4gIHZhciBheGlzVHlwZSA9IGNhbGN1bGF0ZWRWYWx1ZXMuYXhpc1R5cGUsXG4gICAgICByYWRpdXMgPSBjYWxjdWxhdGVkVmFsdWVzLnJhZGl1cyxcbiAgICAgIHNjYWxlID0gY2FsY3VsYXRlZFZhbHVlcy5zY2FsZSxcbiAgICAgIHN0eWxlID0gY2FsY3VsYXRlZFZhbHVlcy5zdHlsZSxcbiAgICAgIHN0cmluZ1RpY2tzID0gY2FsY3VsYXRlZFZhbHVlcy5zdHJpbmdUaWNrcyxcbiAgICAgIHRpY2tzID0gY2FsY3VsYXRlZFZhbHVlcy50aWNrcyxcbiAgICAgIHRpY2tGb3JtYXQgPSBjYWxjdWxhdGVkVmFsdWVzLnRpY2tGb3JtYXQsXG4gICAgICBvcmlnaW4gPSBjYWxjdWxhdGVkVmFsdWVzLm9yaWdpbjtcbiAgdmFyIHRleHQgPSB0aWNrRm9ybWF0KHRpY2tWYWx1ZSwgaW5kZXgsIHRpY2tzKTtcbiAgdmFyIHRpY2sgPSBzdHJpbmdUaWNrcyA/IHN0cmluZ1RpY2tzW2luZGV4XSA6IHRpY2tWYWx1ZTtcblxuICB2YXIgX2dldEV2YWx1YXRlZFN0eWxlcyA9IGdldEV2YWx1YXRlZFN0eWxlcyhzdHlsZSwge1xuICAgIHRpY2s6IHRpY2ssXG4gICAgdGlja1ZhbHVlOiB0aWNrVmFsdWUsXG4gICAgaW5kZXg6IGluZGV4LFxuICAgIHRpY2tzOiB0aWNrcyxcbiAgICBzdHJpbmdUaWNrczogc3RyaW5nVGlja3MsXG4gICAgcmFkaXVzOiByYWRpdXMsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIGF4aXNUeXBlOiBheGlzVHlwZSxcbiAgICB0ZXh0OiB0ZXh0XG4gIH0pLFxuICAgICAgdGlja1N0eWxlID0gX2dldEV2YWx1YXRlZFN0eWxlcy50aWNrU3R5bGU7XG5cbiAgdmFyIGF4aXNBbmdsZSA9IGF4aXNUeXBlID09PSBcInJhZGlhbFwiID8gZ2V0QXhpc0FuZ2xlKHByb3BzLCBzY2FsZSkgOiB1bmRlZmluZWQ7XG4gIHZhciB0aWNrUGFkZGluZyA9IHRpY2tTdHlsZS5wYWRkaW5nIHx8IHRpY2tTdHlsZS5zaXplIHx8IDA7XG4gIHZhciBwYWRBbmdsZSA9IEhlbHBlcnMuZGVncmVlc1RvUmFkaWFucyg5MCAtIGF4aXNBbmdsZSk7XG4gIHZhciB0aWNrQW5nbGUgPSBheGlzVHlwZSA9PT0gXCJhbmd1bGFyXCIgPyBzY2FsZSh0aWNrVmFsdWUpIDogSGVscGVycy5kZWdyZWVzVG9SYWRpYW5zKC0xICogYXhpc0FuZ2xlKTtcbiAgdmFyIHRpY2tSYWRpdXMgPSBheGlzVHlwZSA9PT0gXCJhbmd1bGFyXCIgPyByYWRpdXMgOiBzY2FsZSh0aWNrVmFsdWUpO1xuICByZXR1cm4gYXhpc1R5cGUgPT09IFwiYW5ndWxhclwiID8ge1xuICAgIGluZGV4OiBpbmRleCxcbiAgICBkYXR1bTogdGljayxcbiAgICBzdHlsZTogdGlja1N0eWxlLFxuICAgIHgxOiBnZXRQb3NpdGlvbih0aWNrUmFkaXVzLCB0aWNrQW5nbGUsIFwieFwiKSArIG9yaWdpbi54LFxuICAgIHkxOiBnZXRQb3NpdGlvbih0aWNrUmFkaXVzLCB0aWNrQW5nbGUsIFwieVwiKSArIG9yaWdpbi55LFxuICAgIHgyOiBnZXRQb3NpdGlvbih0aWNrUmFkaXVzICsgdGlja1BhZGRpbmcsIHRpY2tBbmdsZSwgXCJ4XCIpICsgb3JpZ2luLngsXG4gICAgeTI6IGdldFBvc2l0aW9uKHRpY2tSYWRpdXMgKyB0aWNrUGFkZGluZywgdGlja0FuZ2xlLCBcInlcIikgKyBvcmlnaW4ueVxuICB9IDoge1xuICAgIGluZGV4OiBpbmRleCxcbiAgICBkYXR1bTogdGljayxcbiAgICBzdHlsZTogdGlja1N0eWxlLFxuICAgIHgxOiB0aWNrUmFkaXVzICogTWF0aC5jb3ModGlja0FuZ2xlKSArIE1hdGguY29zKHBhZEFuZ2xlKSAqIHRpY2tQYWRkaW5nICsgb3JpZ2luLngsXG4gICAgeDI6IHRpY2tSYWRpdXMgKiBNYXRoLmNvcyh0aWNrQW5nbGUpIC0gTWF0aC5jb3MocGFkQW5nbGUpICogdGlja1BhZGRpbmcgKyBvcmlnaW4ueCxcbiAgICB5MTogdGlja1JhZGl1cyAqIE1hdGguc2luKHRpY2tBbmdsZSkgKyBNYXRoLnNpbihwYWRBbmdsZSkgKiB0aWNrUGFkZGluZyArIG9yaWdpbi55LFxuICAgIHkyOiB0aWNrUmFkaXVzICogTWF0aC5zaW4odGlja0FuZ2xlKSAtIE1hdGguc2luKHBhZEFuZ2xlKSAqIHRpY2tQYWRkaW5nICsgb3JpZ2luLnlcbiAgfTtcbn07IC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcblxuXG52YXIgZ2V0VGlja0xhYmVsUHJvcHMgPSBmdW5jdGlvbiAocHJvcHMsIGNhbGN1bGF0ZWRWYWx1ZXMsIHRpY2tWYWx1ZSwgaW5kZXgpIHtcbiAgdmFyIGF4aXNUeXBlID0gY2FsY3VsYXRlZFZhbHVlcy5heGlzVHlwZSxcbiAgICAgIHJhZGl1cyA9IGNhbGN1bGF0ZWRWYWx1ZXMucmFkaXVzLFxuICAgICAgdGlja0Zvcm1hdCA9IGNhbGN1bGF0ZWRWYWx1ZXMudGlja0Zvcm1hdCxcbiAgICAgIHN0eWxlID0gY2FsY3VsYXRlZFZhbHVlcy5zdHlsZSxcbiAgICAgIHNjYWxlID0gY2FsY3VsYXRlZFZhbHVlcy5zY2FsZSxcbiAgICAgIHRpY2tzID0gY2FsY3VsYXRlZFZhbHVlcy50aWNrcyxcbiAgICAgIHN0cmluZ1RpY2tzID0gY2FsY3VsYXRlZFZhbHVlcy5zdHJpbmdUaWNrcyxcbiAgICAgIG9yaWdpbiA9IGNhbGN1bGF0ZWRWYWx1ZXMub3JpZ2luO1xuICB2YXIgdGV4dCA9IHRpY2tGb3JtYXQodGlja1ZhbHVlLCBpbmRleCwgdGlja3MpO1xuICB2YXIgdGljayA9IHN0cmluZ1RpY2tzID8gc3RyaW5nVGlja3NbaW5kZXhdIDogdGlja1ZhbHVlO1xuXG4gIHZhciBfZ2V0RXZhbHVhdGVkU3R5bGVzMiA9IGdldEV2YWx1YXRlZFN0eWxlcyhzdHlsZSwge1xuICAgIHRleHQ6IHRleHQsXG4gICAgdGljazogdGljayxcbiAgICB0aWNrVmFsdWU6IHRpY2tWYWx1ZSxcbiAgICBpbmRleDogaW5kZXgsXG4gICAgdGlja3M6IHRpY2tzLFxuICAgIHN0cmluZ1RpY2tzOiBzdHJpbmdUaWNrcyxcbiAgICByYWRpdXM6IHJhZGl1cyxcbiAgICBzY2FsZTogc2NhbGUsXG4gICAgYXhpc1R5cGU6IGF4aXNUeXBlXG4gIH0pLFxuICAgICAgbGFiZWxTdHlsZSA9IF9nZXRFdmFsdWF0ZWRTdHlsZXMyLmxhYmVsU3R5bGU7XG5cbiAgdmFyIHRpY2tMYWJlbENvbXBvbmVudCA9IHByb3BzLnRpY2tMYWJlbENvbXBvbmVudDtcbiAgdmFyIGxhYmVsUGxhY2VtZW50ID0gdGlja0xhYmVsQ29tcG9uZW50LnByb3BzICYmIHRpY2tMYWJlbENvbXBvbmVudC5wcm9wcy5sYWJlbFBsYWNlbWVudCA/IHRpY2tMYWJlbENvbXBvbmVudC5wcm9wcy5sYWJlbFBsYWNlbWVudCA6IHByb3BzLmxhYmVsUGxhY2VtZW50O1xuICB2YXIgdGlja1BhZGRpbmcgPSBsYWJlbFN0eWxlLnBhZGRpbmcgfHwgMDtcbiAgdmFyIGFuZ3VsYXJQYWRkaW5nID0gMDsgLy8gVE9ETzogZG8gc29tZSBnZW9tZXRyeVxuXG4gIHZhciBheGlzQW5nbGUgPSBheGlzVHlwZSA9PT0gXCJyYWRpYWxcIiA/IGdldEF4aXNBbmdsZShwcm9wcywgc2NhbGUpIDogdW5kZWZpbmVkO1xuICB2YXIgbGFiZWxBbmdsZSA9IGF4aXNUeXBlID09PSBcImFuZ3VsYXJcIiA/IEhlbHBlcnMucmFkaWFuc1RvRGVncmVlcyhzY2FsZSh0aWNrVmFsdWUpKSA6IGF4aXNBbmdsZSArIGFuZ3VsYXJQYWRkaW5nO1xuICB2YXIgdGV4dEFuZ2xlID0gbGFiZWxTdHlsZS5hbmdsZSA9PT0gdW5kZWZpbmVkID8gTGFiZWxIZWxwZXJzLmdldFBvbGFyQW5nbGUoX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBsYWJlbFBsYWNlbWVudDogbGFiZWxQbGFjZW1lbnRcbiAgfSksIGxhYmVsQW5nbGUpIDogbGFiZWxTdHlsZS5hbmdsZTtcbiAgdmFyIGxhYmVsUmFkaXVzID0gYXhpc1R5cGUgPT09IFwiYW5ndWxhclwiID8gcmFkaXVzICsgdGlja1BhZGRpbmcgOiBzY2FsZSh0aWNrVmFsdWUpO1xuICB2YXIgdGV4dEFuY2hvciA9IGxhYmVsU3R5bGUudGV4dEFuY2hvciB8fCBMYWJlbEhlbHBlcnMuZ2V0UG9sYXJUZXh0QW5jaG9yKF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgbGFiZWxQbGFjZW1lbnQ6IGxhYmVsUGxhY2VtZW50XG4gIH0pLCBsYWJlbEFuZ2xlKTtcbiAgcmV0dXJuIHtcbiAgICBpbmRleDogaW5kZXgsXG4gICAgZGF0dW06IHRpY2ssXG4gICAgc3R5bGU6IGxhYmVsU3R5bGUsXG4gICAgYW5nbGU6IHRleHRBbmdsZSxcbiAgICB0ZXh0QW5jaG9yOiB0ZXh0QW5jaG9yLFxuICAgIHRleHQ6IHRleHQsXG4gICAgeDogbGFiZWxSYWRpdXMgKiBNYXRoLmNvcyhIZWxwZXJzLmRlZ3JlZXNUb1JhZGlhbnMobGFiZWxBbmdsZSkpICsgb3JpZ2luLngsXG4gICAgeTogLWxhYmVsUmFkaXVzICogTWF0aC5zaW4oSGVscGVycy5kZWdyZWVzVG9SYWRpYW5zKGxhYmVsQW5nbGUpKSArIG9yaWdpbi55XG4gIH07XG59OyAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG5cblxudmFyIGdldEdyaWRQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcywgY2FsY3VsYXRlZFZhbHVlcywgdGlja1ZhbHVlLCBpbmRleCkge1xuICB2YXIgYXhpc1R5cGUgPSBjYWxjdWxhdGVkVmFsdWVzLmF4aXNUeXBlLFxuICAgICAgcmFkaXVzID0gY2FsY3VsYXRlZFZhbHVlcy5yYWRpdXMsXG4gICAgICBzdHlsZSA9IGNhbGN1bGF0ZWRWYWx1ZXMuc3R5bGUsXG4gICAgICBzY2FsZSA9IGNhbGN1bGF0ZWRWYWx1ZXMuc2NhbGUsXG4gICAgICBzdHJpbmdUaWNrcyA9IGNhbGN1bGF0ZWRWYWx1ZXMuc3RyaW5nVGlja3MsXG4gICAgICB0aWNrcyA9IGNhbGN1bGF0ZWRWYWx1ZXMudGlja3MsXG4gICAgICB0aWNrRm9ybWF0ID0gY2FsY3VsYXRlZFZhbHVlcy50aWNrRm9ybWF0LFxuICAgICAgb3JpZ2luID0gY2FsY3VsYXRlZFZhbHVlcy5vcmlnaW47XG4gIHZhciB0ZXh0ID0gdGlja0Zvcm1hdCh0aWNrVmFsdWUsIGluZGV4LCB0aWNrcyk7XG4gIHZhciBzdGFydEFuZ2xlID0gcHJvcHMuc3RhcnRBbmdsZSxcbiAgICAgIGVuZEFuZ2xlID0gcHJvcHMuZW5kQW5nbGUsXG4gICAgICBfcHJvcHMkaW5uZXJSYWRpdXMgPSBwcm9wcy5pbm5lclJhZGl1cyxcbiAgICAgIGlubmVyUmFkaXVzID0gX3Byb3BzJGlubmVyUmFkaXVzID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJGlubmVyUmFkaXVzO1xuICB2YXIgdGljayA9IHN0cmluZ1RpY2tzID8gc3RyaW5nVGlja3NbaW5kZXhdIDogdGlja1ZhbHVlO1xuXG4gIHZhciBfZ2V0RXZhbHVhdGVkU3R5bGVzMyA9IGdldEV2YWx1YXRlZFN0eWxlcyhzdHlsZSwge1xuICAgIHRpY2s6IHRpY2ssXG4gICAgdGlja1ZhbHVlOiB0aWNrVmFsdWUsXG4gICAgaW5kZXg6IGluZGV4LFxuICAgIHRpY2tzOiB0aWNrcyxcbiAgICBzdHJpbmdUaWNrczogc3RyaW5nVGlja3MsXG4gICAgcmFkaXVzOiByYWRpdXMsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIGF4aXNUeXBlOiBheGlzVHlwZSxcbiAgICB0ZXh0OiB0ZXh0XG4gIH0pLFxuICAgICAgZ3JpZFN0eWxlID0gX2dldEV2YWx1YXRlZFN0eWxlczMuZ3JpZFN0eWxlO1xuXG4gIHZhciBhbmdsZSA9IHNjYWxlKHRpY2tWYWx1ZSk7XG4gIHJldHVybiBheGlzVHlwZSA9PT0gXCJhbmd1bGFyXCIgPyB7XG4gICAgaW5kZXg6IGluZGV4LFxuICAgIGRhdHVtOiB0aWNrLFxuICAgIHN0eWxlOiBncmlkU3R5bGUsXG4gICAgeDE6IGdldFBvc2l0aW9uKHJhZGl1cywgYW5nbGUsIFwieFwiKSArIG9yaWdpbi54LFxuICAgIHkxOiBnZXRQb3NpdGlvbihyYWRpdXMsIGFuZ2xlLCBcInlcIikgKyBvcmlnaW4ueSxcbiAgICB4MjogZ2V0UG9zaXRpb24oaW5uZXJSYWRpdXMsIGFuZ2xlLCBcInhcIikgKyBvcmlnaW4ueCxcbiAgICB5MjogZ2V0UG9zaXRpb24oaW5uZXJSYWRpdXMsIGFuZ2xlLCBcInlcIikgKyBvcmlnaW4ueVxuICB9IDoge1xuICAgIHN0eWxlOiBncmlkU3R5bGUsXG4gICAgaW5kZXg6IGluZGV4LFxuICAgIGRhdHVtOiB0aWNrLFxuICAgIGN4OiBvcmlnaW4ueCxcbiAgICBjeTogb3JpZ2luLnksXG4gICAgcjogc2NhbGUodGlja1ZhbHVlKSxcbiAgICBzdGFydEFuZ2xlOiBzdGFydEFuZ2xlLFxuICAgIGVuZEFuZ2xlOiBlbmRBbmdsZVxuICB9O1xufTtcblxudmFyIGdldEF4aXNMYWJlbFByb3BzID0gZnVuY3Rpb24gKHByb3BzLCBjYWxjdWxhdGVkVmFsdWVzKSB7XG4gIHZhciBheGlzVHlwZSA9IGNhbGN1bGF0ZWRWYWx1ZXMuYXhpc1R5cGUsXG4gICAgICByYWRpdXMgPSBjYWxjdWxhdGVkVmFsdWVzLnJhZGl1cyxcbiAgICAgIHN0eWxlID0gY2FsY3VsYXRlZFZhbHVlcy5zdHlsZSxcbiAgICAgIHNjYWxlID0gY2FsY3VsYXRlZFZhbHVlcy5zY2FsZSxcbiAgICAgIG9yaWdpbiA9IGNhbGN1bGF0ZWRWYWx1ZXMub3JpZ2luO1xuICB2YXIgYXhpc0xhYmVsQ29tcG9uZW50ID0gcHJvcHMuYXhpc0xhYmVsQ29tcG9uZW50O1xuXG4gIGlmIChheGlzVHlwZSAhPT0gXCJyYWRpYWxcIikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHZhciBsYWJlbFBsYWNlbWVudCA9IGF4aXNMYWJlbENvbXBvbmVudC5wcm9wcyAmJiBheGlzTGFiZWxDb21wb25lbnQucHJvcHMubGFiZWxQbGFjZW1lbnQgPyBheGlzTGFiZWxDb21wb25lbnQucHJvcHMubGFiZWxQbGFjZW1lbnQgOiBwcm9wcy5sYWJlbFBsYWNlbWVudDtcbiAgdmFyIGxhYmVsU3R5bGUgPSBzdHlsZSAmJiBzdHlsZS5heGlzTGFiZWwgfHwge307XG4gIHZhciBheGlzQW5nbGUgPSBheGlzVHlwZSA9PT0gXCJyYWRpYWxcIiA/IGdldEF4aXNBbmdsZShwcm9wcywgc2NhbGUpIDogdW5kZWZpbmVkO1xuICB2YXIgdGV4dEFuZ2xlID0gbGFiZWxTdHlsZS5hbmdsZSA9PT0gdW5kZWZpbmVkID8gTGFiZWxIZWxwZXJzLmdldFBvbGFyQW5nbGUoX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBsYWJlbFBsYWNlbWVudDogbGFiZWxQbGFjZW1lbnRcbiAgfSksIGF4aXNBbmdsZSkgOiBsYWJlbFN0eWxlLmFuZ2xlO1xuICB2YXIgbGFiZWxSYWRpdXMgPSByYWRpdXMgKyAobGFiZWxTdHlsZS5wYWRkaW5nIHx8IDApO1xuICB2YXIgdGV4dEFuY2hvciA9IGxhYmVsU3R5bGUudGV4dEFuY2hvciB8fCBMYWJlbEhlbHBlcnMuZ2V0UG9sYXJUZXh0QW5jaG9yKF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgbGFiZWxQbGFjZW1lbnQ6IGxhYmVsUGxhY2VtZW50XG4gIH0pLCBheGlzQW5nbGUpO1xuICB2YXIgdmVydGljYWxBbmNob3IgPSBsYWJlbFN0eWxlLnZlcnRpY2FsQW5jaG9yIHx8IExhYmVsSGVscGVycy5nZXRQb2xhclZlcnRpY2FsQW5jaG9yKF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgbGFiZWxQbGFjZW1lbnQ6IGxhYmVsUGxhY2VtZW50XG4gIH0pLCBheGlzQW5nbGUpO1xuICByZXR1cm4ge1xuICAgIHN0eWxlOiBsYWJlbFN0eWxlLFxuICAgIGFuZ2xlOiB0ZXh0QW5nbGUsXG4gICAgdGV4dEFuY2hvcjogdGV4dEFuY2hvcixcbiAgICB2ZXJ0aWNhbEFuY2hvcjogdmVydGljYWxBbmNob3IsXG4gICAgdGV4dDogcHJvcHMubGFiZWwsXG4gICAgeDogZ2V0UG9zaXRpb24obGFiZWxSYWRpdXMsIEhlbHBlcnMuZGVncmVlc1RvUmFkaWFucyhheGlzQW5nbGUpLCBcInhcIikgKyBvcmlnaW4ueCxcbiAgICB5OiBnZXRQb3NpdGlvbihsYWJlbFJhZGl1cywgSGVscGVycy5kZWdyZWVzVG9SYWRpYW5zKGF4aXNBbmdsZSksIFwieVwiKSArIG9yaWdpbi55XG4gIH07XG59O1xuXG52YXIgZ2V0QXhpc1Byb3BzID0gZnVuY3Rpb24gKG1vZGlmaWVkUHJvcHMsIGNhbGN1bGF0ZWRWYWx1ZXMpIHtcbiAgdmFyIHN0eWxlID0gY2FsY3VsYXRlZFZhbHVlcy5zdHlsZSxcbiAgICAgIGF4aXNUeXBlID0gY2FsY3VsYXRlZFZhbHVlcy5heGlzVHlwZSxcbiAgICAgIHJhZGl1cyA9IGNhbGN1bGF0ZWRWYWx1ZXMucmFkaXVzLFxuICAgICAgc2NhbGUgPSBjYWxjdWxhdGVkVmFsdWVzLnNjYWxlLFxuICAgICAgb3JpZ2luID0gY2FsY3VsYXRlZFZhbHVlcy5vcmlnaW47XG4gIHZhciBzdGFydEFuZ2xlID0gbW9kaWZpZWRQcm9wcy5zdGFydEFuZ2xlLFxuICAgICAgZW5kQW5nbGUgPSBtb2RpZmllZFByb3BzLmVuZEFuZ2xlLFxuICAgICAgX21vZGlmaWVkUHJvcHMkaW5uZXJSID0gbW9kaWZpZWRQcm9wcy5pbm5lclJhZGl1cyxcbiAgICAgIGlubmVyUmFkaXVzID0gX21vZGlmaWVkUHJvcHMkaW5uZXJSID09PSB2b2lkIDAgPyAwIDogX21vZGlmaWVkUHJvcHMkaW5uZXJSO1xuICB2YXIgYXhpc0FuZ2xlID0gYXhpc1R5cGUgPT09IFwicmFkaWFsXCIgPyBIZWxwZXJzLmRlZ3JlZXNUb1JhZGlhbnMoZ2V0QXhpc0FuZ2xlKG1vZGlmaWVkUHJvcHMsIHNjYWxlKSkgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBheGlzVHlwZSA9PT0gXCJyYWRpYWxcIiA/IHtcbiAgICBzdHlsZTogc3R5bGUuYXhpcyxcbiAgICB4MTogZ2V0UG9zaXRpb24oaW5uZXJSYWRpdXMsIGF4aXNBbmdsZSwgXCJ4XCIpICsgb3JpZ2luLngsXG4gICAgeDI6IGdldFBvc2l0aW9uKHJhZGl1cywgYXhpc0FuZ2xlLCBcInhcIikgKyBvcmlnaW4ueCxcbiAgICB5MTogZ2V0UG9zaXRpb24oaW5uZXJSYWRpdXMsIGF4aXNBbmdsZSwgXCJ5XCIpICsgb3JpZ2luLnksXG4gICAgeTI6IGdldFBvc2l0aW9uKHJhZGl1cywgYXhpc0FuZ2xlLCBcInlcIikgKyBvcmlnaW4ueVxuICB9IDoge1xuICAgIHN0eWxlOiBzdHlsZS5heGlzLFxuICAgIGN4OiBvcmlnaW4ueCxcbiAgICBjeTogb3JpZ2luLnksXG4gICAgcjogcmFkaXVzLFxuICAgIHN0YXJ0QW5nbGU6IHN0YXJ0QW5nbGUsXG4gICAgZW5kQW5nbGU6IGVuZEFuZ2xlXG4gIH07XG59O1xuXG52YXIgZ2V0Q2FsY3VsYXRlZFZhbHVlcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBwcm9wcyA9IF9hc3NpZ24oe1xuICAgIHBvbGFyOiB0cnVlXG4gIH0sIHByb3BzKTtcbiAgdmFyIGRlZmF1bHRTdHlsZXMgPSBnZXRTdHlsZU9iamVjdChwcm9wcyk7XG4gIHZhciBzdHlsZSA9IGdldFN0eWxlcyhwcm9wcywgZGVmYXVsdFN0eWxlcyk7XG4gIHZhciBwYWRkaW5nID0gSGVscGVycy5nZXRQYWRkaW5nKHByb3BzKTtcbiAgdmFyIGF4aXMgPSBBeGlzLmdldEF4aXMocHJvcHMpO1xuICB2YXIgYXhpc1R5cGUgPSBnZXRBeGlzVHlwZShwcm9wcyk7XG4gIHZhciBzdHJpbmdUaWNrcyA9IEF4aXMuc3RyaW5nVGlja3MocHJvcHMpID8gcHJvcHMudGlja1ZhbHVlcyA6IHVuZGVmaW5lZDtcbiAgdmFyIGRvbWFpbiA9IEF4aXMuZ2V0RG9tYWluKHByb3BzLCBheGlzKTtcbiAgdmFyIHJhbmdlID0gZ2V0UmFuZ2UocHJvcHMsIGF4aXMpO1xuICB2YXIgc2NhbGUgPSBnZXRTY2FsZShwcm9wcyk7XG4gIHZhciBpbml0aWFsVGlja3MgPSBBeGlzLmdldFRpY2tzKHByb3BzLCBzY2FsZSk7XG4gIHZhciB0aWNrcyA9IGF4aXNUeXBlID09PSBcImFuZ3VsYXJcIiA/IGZpbHRlclRpY2tzKGluaXRpYWxUaWNrcywgc2NhbGUpIDogaW5pdGlhbFRpY2tzO1xuICB2YXIgdGlja0Zvcm1hdCA9IEF4aXMuZ2V0VGlja0Zvcm1hdChwcm9wcywgc2NhbGUpO1xuICB2YXIgcmFkaXVzID0gZ2V0UmFkaXVzKHByb3BzKTtcbiAgdmFyIG9yaWdpbiA9IEhlbHBlcnMuZ2V0UG9sYXJPcmlnaW4ocHJvcHMpO1xuICByZXR1cm4ge1xuICAgIGF4aXM6IGF4aXMsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgc3RyaW5nVGlja3M6IHN0cmluZ1RpY2tzLFxuICAgIGF4aXNUeXBlOiBheGlzVHlwZSxcbiAgICBzY2FsZTogc2NhbGUsXG4gICAgdGlja3M6IHRpY2tzLFxuICAgIHRpY2tGb3JtYXQ6IHRpY2tGb3JtYXQsXG4gICAgZG9tYWluOiBkb21haW4sXG4gICAgcmFuZ2U6IHJhbmdlLFxuICAgIHJhZGl1czogcmFkaXVzLFxuICAgIG9yaWdpbjogb3JpZ2luXG4gIH07XG59O1xuXG5leHBvcnQgdmFyIGdldEJhc2VQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcywgZmFsbGJhY2tQcm9wcykge1xuICBwcm9wcyA9IEF4aXMubW9kaWZ5UHJvcHMocHJvcHMsIGZhbGxiYWNrUHJvcHMpO1xuICB2YXIgY2FsY3VsYXRlZFZhbHVlcyA9IGdldENhbGN1bGF0ZWRWYWx1ZXMocHJvcHMpO1xuICB2YXIgc3R5bGUgPSBjYWxjdWxhdGVkVmFsdWVzLnN0eWxlLFxuICAgICAgc2NhbGUgPSBjYWxjdWxhdGVkVmFsdWVzLnNjYWxlLFxuICAgICAgdGlja3MgPSBjYWxjdWxhdGVkVmFsdWVzLnRpY2tzLFxuICAgICAgZG9tYWluID0gY2FsY3VsYXRlZFZhbHVlcy5kb21haW47XG4gIHZhciBfcHJvcHMgPSBwcm9wcyxcbiAgICAgIHdpZHRoID0gX3Byb3BzLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gX3Byb3BzLmhlaWdodCxcbiAgICAgIHN0YW5kYWxvbmUgPSBfcHJvcHMuc3RhbmRhbG9uZSxcbiAgICAgIHRoZW1lID0gX3Byb3BzLnRoZW1lLFxuICAgICAgbmFtZSA9IF9wcm9wcy5uYW1lO1xuICB2YXIgYXhpc1Byb3BzID0gZ2V0QXhpc1Byb3BzKHByb3BzLCBjYWxjdWxhdGVkVmFsdWVzKTtcbiAgdmFyIGF4aXNMYWJlbFByb3BzID0gZ2V0QXhpc0xhYmVsUHJvcHMocHJvcHMsIGNhbGN1bGF0ZWRWYWx1ZXMpO1xuICB2YXIgaW5pdGlhbENoaWxkUHJvcHMgPSB7XG4gICAgcGFyZW50OiB7XG4gICAgICBzdHlsZTogc3R5bGUucGFyZW50LFxuICAgICAgdGlja3M6IHRpY2tzLFxuICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBkb21haW46IGRvbWFpbixcbiAgICAgIHN0YW5kYWxvbmU6IHN0YW5kYWxvbmUsXG4gICAgICB0aGVtZTogdGhlbWUsXG4gICAgICBuYW1lOiBuYW1lXG4gICAgfVxuICB9O1xuICByZXR1cm4gdGlja3MucmVkdWNlKGZ1bmN0aW9uIChjaGlsZFByb3BzLCB0aWNrLCBpbmRleCkge1xuICAgIGNoaWxkUHJvcHNbaW5kZXhdID0ge1xuICAgICAgYXhpczogYXhpc1Byb3BzLFxuICAgICAgYXhpc0xhYmVsOiBheGlzTGFiZWxQcm9wcyxcbiAgICAgIHRpY2tzOiBnZXRUaWNrUHJvcHMocHJvcHMsIGNhbGN1bGF0ZWRWYWx1ZXMsIHRpY2ssIGluZGV4KSxcbiAgICAgIHRpY2tMYWJlbHM6IGdldFRpY2tMYWJlbFByb3BzKHByb3BzLCBjYWxjdWxhdGVkVmFsdWVzLCB0aWNrLCBpbmRleCksXG4gICAgICBncmlkOiBnZXRHcmlkUHJvcHMocHJvcHMsIGNhbGN1bGF0ZWRWYWx1ZXMsIHRpY2ssIGluZGV4KVxuICAgIH07XG4gICAgcmV0dXJuIGNoaWxkUHJvcHM7XG4gIH0sIGluaXRpYWxDaGlsZFByb3BzKTtcbn07IiwiaW1wb3J0IF9pc0VtcHR5IGZyb20gXCJsb2Rhc2gvaXNFbXB0eVwiO1xuaW1wb3J0IF9hc3NpZ24gZnJvbSBcImxvZGFzaC9hc3NpZ25cIjtcblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCB7IFByb3BUeXBlcyBhcyBDdXN0b21Qcm9wVHlwZXMsIFZpY3RvcnlMYWJlbCwgQ29tbW9uUHJvcHMsIFZpY3RvcnlDb250YWluZXIsIFZpY3RvcnlUaGVtZSwgTGluZVNlZ21lbnQsIGFkZEV2ZW50cywgQXJjLCBBeGlzIH0gZnJvbSBcInZpY3RvcnktY29yZVwiO1xuaW1wb3J0IHsgZ2V0U2NhbGUsIGdldFN0eWxlcywgZ2V0QmFzZVByb3BzIH0gZnJvbSBcIi4vaGVscGVyLW1ldGhvZHNcIjtcbnZhciBmYWxsYmFja1Byb3BzID0ge1xuICB3aWR0aDogNDUwLFxuICBoZWlnaHQ6IDMwMCxcbiAgcGFkZGluZzogNTBcbn07XG52YXIgb3B0aW9ucyA9IHtcbiAgY29tcG9uZW50czogW3tcbiAgICBuYW1lOiBcImF4aXNcIixcbiAgICBpbmRleDogMFxuICB9LCB7XG4gICAgbmFtZTogXCJheGlzTGFiZWxcIixcbiAgICBpbmRleDogMFxuICB9LCB7XG4gICAgbmFtZTogXCJncmlkXCJcbiAgfSwge1xuICAgIG5hbWU6IFwicGFyZW50XCIsXG4gICAgaW5kZXg6IFwicGFyZW50XCJcbiAgfSwge1xuICAgIG5hbWU6IFwidGlja3NcIlxuICB9LCB7XG4gICAgbmFtZTogXCJ0aWNrTGFiZWxzXCJcbiAgfV1cbn07XG5cbnZhciBWaWN0b3J5UG9sYXJBeGlzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhWaWN0b3J5UG9sYXJBeGlzLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBWaWN0b3J5UG9sYXJBeGlzKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBWaWN0b3J5UG9sYXJBeGlzKTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoVmljdG9yeVBvbGFyQXhpcy5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFZpY3RvcnlQb2xhckF4aXMpKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhWaWN0b3J5UG9sYXJBeGlzLCBbe1xuICAgIGtleTogXCJyZW5kZXJBeGlzTGluZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJBeGlzTGluZShwcm9wcykge1xuICAgICAgdmFyIGRlcGVuZGVudEF4aXMgPSBwcm9wcy5kZXBlbmRlbnRBeGlzO1xuICAgICAgdmFyIGF4aXNDb21wb25lbnQgPSBkZXBlbmRlbnRBeGlzID8gcHJvcHMuYXhpc0NvbXBvbmVudCA6IHByb3BzLmNpcmN1bGFyQXhpc0NvbXBvbmVudDtcbiAgICAgIHZhciBheGlzUHJvcHMgPSB0aGlzLmdldENvbXBvbmVudFByb3BzKGF4aXNDb21wb25lbnQsIFwiYXhpc1wiLCAwKTtcbiAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoYXhpc0NvbXBvbmVudCwgYXhpc1Byb3BzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyTGFiZWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyTGFiZWwocHJvcHMpIHtcbiAgICAgIHZhciBheGlzTGFiZWxDb21wb25lbnQgPSBwcm9wcy5heGlzTGFiZWxDb21wb25lbnQsXG4gICAgICAgICAgZGVwZW5kZW50QXhpcyA9IHByb3BzLmRlcGVuZGVudEF4aXMsXG4gICAgICAgICAgbGFiZWwgPSBwcm9wcy5sYWJlbDtcblxuICAgICAgaWYgKCFsYWJlbCB8fCAhZGVwZW5kZW50QXhpcykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGF4aXNMYWJlbFByb3BzID0gdGhpcy5nZXRDb21wb25lbnRQcm9wcyhheGlzTGFiZWxDb21wb25lbnQsIFwiYXhpc0xhYmVsXCIsIDApO1xuICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChheGlzTGFiZWxDb21wb25lbnQsIGF4aXNMYWJlbFByb3BzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQXhpc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJBeGlzKHByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgdGlja0NvbXBvbmVudCA9IHByb3BzLnRpY2tDb21wb25lbnQsXG4gICAgICAgICAgdGlja0xhYmVsQ29tcG9uZW50ID0gcHJvcHMudGlja0xhYmVsQ29tcG9uZW50LFxuICAgICAgICAgIG5hbWUgPSBwcm9wcy5uYW1lO1xuXG4gICAgICB2YXIgc2hvdWxkUmVuZGVyID0gZnVuY3Rpb24gKGNvbXBvbmVudFByb3BzKSB7XG4gICAgICAgIHZhciBfY29tcG9uZW50UHJvcHMkc3R5bGUgPSBjb21wb25lbnRQcm9wcy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlID0gX2NvbXBvbmVudFByb3BzJHN0eWxlID09PSB2b2lkIDAgPyB7fSA6IF9jb21wb25lbnRQcm9wcyRzdHlsZSxcbiAgICAgICAgICAgIF9jb21wb25lbnRQcm9wcyRldmVudCA9IGNvbXBvbmVudFByb3BzLmV2ZW50cyxcbiAgICAgICAgICAgIGV2ZW50cyA9IF9jb21wb25lbnRQcm9wcyRldmVudCA9PT0gdm9pZCAwID8ge30gOiBfY29tcG9uZW50UHJvcHMkZXZlbnQ7XG4gICAgICAgIHZhciB2aXNpYmxlID0gc3R5bGUuc3Ryb2tlICE9PSBcInRyYW5zcGFyZW50XCIgJiYgc3R5bGUuc3Ryb2tlICE9PSBcIm5vbmVcIiAmJiBzdHlsZS5zdHJva2VXaWR0aCAhPT0gMDtcbiAgICAgICAgcmV0dXJuIHZpc2libGUgfHwgIV9pc0VtcHR5KGV2ZW50cyk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgYXhpc1R5cGUgPSBwcm9wcy5kZXBlbmRlbnRBeGlzID8gXCJyYWRpYWxcIiA6IFwiYW5ndWxhclwiO1xuICAgICAgdmFyIGdyaWRDb21wb25lbnQgPSBheGlzVHlwZSA9PT0gXCJyYWRpYWxcIiA/IHByb3BzLmNpcmN1bGFyR3JpZENvbXBvbmVudCA6IHByb3BzLmdyaWRDb21wb25lbnQ7XG4gICAgICB2YXIgdGlja0NvbXBvbmVudHMgPSB0aGlzLmRhdGFLZXlzLm1hcChmdW5jdGlvbiAoa2V5LCBpbmRleCkge1xuICAgICAgICB2YXIgdGlja1Byb3BzID0gX2Fzc2lnbih7XG4gICAgICAgICAga2V5OiBcIlwiLmNvbmNhdChuYW1lLCBcIi10aWNrLVwiKS5jb25jYXQoa2V5KVxuICAgICAgICB9LCBfdGhpcy5nZXRDb21wb25lbnRQcm9wcyh0aWNrQ29tcG9uZW50LCBcInRpY2tzXCIsIGluZGV4KSk7XG5cbiAgICAgICAgdmFyIFRpY2tDb21wb25lbnQgPSBSZWFjdC5jbG9uZUVsZW1lbnQodGlja0NvbXBvbmVudCwgdGlja1Byb3BzKTtcbiAgICAgICAgcmV0dXJuIHNob3VsZFJlbmRlcihUaWNrQ29tcG9uZW50LnByb3BzKSA/IFRpY2tDb21wb25lbnQgOiB1bmRlZmluZWQ7XG4gICAgICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICB2YXIgZ3JpZENvbXBvbmVudHMgPSB0aGlzLmRhdGFLZXlzLm1hcChmdW5jdGlvbiAoa2V5LCBpbmRleCkge1xuICAgICAgICB2YXIgZ3JpZFByb3BzID0gX2Fzc2lnbih7XG4gICAgICAgICAga2V5OiBcIlwiLmNvbmNhdChuYW1lLCBcIi1ncmlkLVwiKS5jb25jYXQoa2V5KVxuICAgICAgICB9LCBfdGhpcy5nZXRDb21wb25lbnRQcm9wcyhncmlkQ29tcG9uZW50LCBcImdyaWRcIiwgaW5kZXgpKTtcblxuICAgICAgICB2YXIgR3JpZENvbXBvbmVudCA9IFJlYWN0LmNsb25lRWxlbWVudChncmlkQ29tcG9uZW50LCBncmlkUHJvcHMpO1xuICAgICAgICByZXR1cm4gc2hvdWxkUmVuZGVyKEdyaWRDb21wb25lbnQucHJvcHMpID8gR3JpZENvbXBvbmVudCA6IHVuZGVmaW5lZDtcbiAgICAgIH0pLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIHZhciB0aWNrTGFiZWxDb21wb25lbnRzID0gdGhpcy5kYXRhS2V5cy5tYXAoZnVuY3Rpb24gKGtleSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHRpY2tMYWJlbFByb3BzID0gX2Fzc2lnbih7XG4gICAgICAgICAga2V5OiBcIlwiLmNvbmNhdChuYW1lLCBcIi10aWNrLVwiKS5jb25jYXQoa2V5KVxuICAgICAgICB9LCBfdGhpcy5nZXRDb21wb25lbnRQcm9wcyh0aWNrTGFiZWxDb21wb25lbnQsIFwidGlja0xhYmVsc1wiLCBpbmRleCkpO1xuXG4gICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQodGlja0xhYmVsQ29tcG9uZW50LCB0aWNrTGFiZWxQcm9wcyk7XG4gICAgICB9KTtcbiAgICAgIHZhciBheGlzID0gdGhpcy5yZW5kZXJBeGlzTGluZShwcm9wcyk7XG4gICAgICB2YXIgYXhpc0xhYmVsID0gdGhpcy5yZW5kZXJMYWJlbChwcm9wcyk7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBbYXhpcywgYXhpc0xhYmVsXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHRpY2tDb21wb25lbnRzKSwgX3RvQ29uc3VtYWJsZUFycmF5KGdyaWRDb21wb25lbnRzKSwgX3RvQ29uc3VtYWJsZUFycmF5KHRpY2tMYWJlbENvbXBvbmVudHMpKTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckdyb3VwKHByb3BzLCBjaGlsZHJlbik7XG4gICAgfSAvLyBPdmVycmlkZGVuIGluIHZpY3RvcnktbmF0aXZlXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJHcm91cFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJHcm91cChwcm9wcywgY2hpbGRyZW4pIHtcbiAgICAgIHZhciBncm91cENvbXBvbmVudCA9IHByb3BzLmdyb3VwQ29tcG9uZW50O1xuICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChncm91cENvbXBvbmVudCwge30sIGNoaWxkcmVuKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hvdWxkQW5pbWF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRBbmltYXRlKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5wcm9wcy5hbmltYXRlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIGFuaW1hdGlvbldoaXRlbGlzdCA9IFZpY3RvcnlQb2xhckF4aXMuYW5pbWF0aW9uV2hpdGVsaXN0O1xuICAgICAgdmFyIHByb3BzID0gQXhpcy5tb2RpZnlQcm9wcyh0aGlzLnByb3BzLCBmYWxsYmFja1Byb3BzKTtcblxuICAgICAgaWYgKHRoaXMuc2hvdWxkQW5pbWF0ZSgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuaW1hdGVDb21wb25lbnQocHJvcHMsIGFuaW1hdGlvbldoaXRlbGlzdCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucmVuZGVyQXhpcyhwcm9wcyk7XG4gICAgICByZXR1cm4gcHJvcHMuc3RhbmRhbG9uZSA/IHRoaXMucmVuZGVyQ29udGFpbmVyKHByb3BzLmNvbnRhaW5lckNvbXBvbmVudCwgY2hpbGRyZW4pIDogY2hpbGRyZW47XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFZpY3RvcnlQb2xhckF4aXM7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5UG9sYXJBeGlzLCBcImFuaW1hdGlvbldoaXRlbGlzdFwiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBbXCJzdHlsZVwiLCBcImRvbWFpblwiLCBcInJhbmdlXCIsIFwidGlja0NvdW50XCIsIFwidGlja1ZhbHVlc1wiLCBcInBhZGRpbmdcIiwgXCJ3aWR0aFwiLCBcImhlaWdodFwiXVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVBvbGFyQXhpcywgXCJkaXNwbGF5TmFtZVwiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBcIlZpY3RvcnlBeGlzXCJcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlQb2xhckF4aXMsIFwicm9sZVwiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBcImF4aXNcIlxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVBvbGFyQXhpcywgXCJkZWZhdWx0VHJhbnNpdGlvbnNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZToge1xuICAgIG9uRXhpdDoge1xuICAgICAgZHVyYXRpb246IDUwMFxuICAgIH0sXG4gICAgb25FbnRlcjoge1xuICAgICAgZHVyYXRpb246IDUwMFxuICAgIH1cbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVBvbGFyQXhpcywgXCJwcm9wVHlwZXNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogX29iamVjdFNwcmVhZCh7fSwgQ29tbW9uUHJvcHMuYmFzZVByb3BzLCB7XG4gICAgYXhpc0FuZ2xlOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGF4aXNDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICAgIGF4aXNMYWJlbENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gICAgYXhpc1ZhbHVlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMub2JqZWN0XSksXG4gICAgY2F0ZWdvcmllczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICB4OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSxcbiAgICAgIHk6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpXG4gICAgfSldKSxcbiAgICBjaXJjdWxhckF4aXNDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICAgIGNpcmN1bGFyR3JpZENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gICAgY29udGFpbmVyQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgICBkZXBlbmRlbnRBeGlzOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBkaXNhYmxlSW5saW5lU3R5bGVzOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBlbmRBbmdsZTogUHJvcFR5cGVzLm51bWJlcixcbiAgICBldmVudHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICB0YXJnZXQ6IFByb3BUeXBlcy5vbmVPZihbXCJheGlzXCIsIFwiYXhpc0xhYmVsXCIsIFwiZ3JpZFwiLCBcInRpY2tzXCIsIFwidGlja0xhYmVsc1wiXSksXG4gICAgICBldmVudEtleTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5LCBDdXN0b21Qcm9wVHlwZXMuYWxsT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMuaW50ZWdlciwgQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlXSksIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgICAgIGV2ZW50SGFuZGxlcnM6IFByb3BUeXBlcy5vYmplY3RcbiAgICB9KSksXG4gICAgZ3JpZENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gICAgaW5uZXJSYWRpdXM6IEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZSxcbiAgICBsYWJlbFBsYWNlbWVudDogUHJvcFR5cGVzLm9uZU9mKFtcInBhcmFsbGVsXCIsIFwicGVycGVuZGljdWxhclwiLCBcInZlcnRpY2FsXCJdKSxcbiAgICBzdGFydEFuZ2xlOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHN0cmluZ01hcDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBzdHlsZTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIHBhcmVudDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIGF4aXM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICBheGlzTGFiZWw6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICBncmlkOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgdGlja3M6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICB0aWNrTGFiZWxzOiBQcm9wVHlwZXMub2JqZWN0XG4gICAgfSksXG4gICAgdGlja0NvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gICAgdGlja0NvdW50OiBDdXN0b21Qcm9wVHlwZXMuYWxsT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMuaW50ZWdlciwgQ3VzdG9tUHJvcFR5cGVzLmdyZWF0ZXJUaGFuWmVyb10pLFxuICAgIHRpY2tGb3JtYXQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5mdW5jLCBDdXN0b21Qcm9wVHlwZXMuaG9tb2dlbmVvdXNBcnJheV0pLFxuICAgIHRpY2tMYWJlbENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gICAgdGlja1ZhbHVlczogQ3VzdG9tUHJvcFR5cGVzLmhvbW9nZW5lb3VzQXJyYXlcbiAgfSlcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlQb2xhckF4aXMsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHtcbiAgICBheGlzQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KExpbmVTZWdtZW50LCBudWxsKSxcbiAgICBheGlzTGFiZWxDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUxhYmVsLCBudWxsKSxcbiAgICBjaXJjdWxhckF4aXNDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQXJjLCBudWxsKSxcbiAgICBjaXJjdWxhckdyaWRDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQXJjLCBudWxsKSxcbiAgICBjb250YWluZXJDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUNvbnRhaW5lciwgbnVsbCksXG4gICAgZW5kQW5nbGU6IDM2MCxcbiAgICBncmlkQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KExpbmVTZWdtZW50LCBudWxsKSxcbiAgICBncm91cENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgICAgcm9sZTogXCJwcmVzZW50YXRpb25cIlxuICAgIH0pLFxuICAgIGxhYmVsUGxhY2VtZW50OiBcInBhcmFsbGVsXCIsXG4gICAgc3RhcnRBbmdsZTogMCxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRoZW1lOiBWaWN0b3J5VGhlbWUuZ3JheXNjYWxlLFxuICAgIHRpY2tDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGluZVNlZ21lbnQsIG51bGwpLFxuICAgIHRpY2tMYWJlbENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5TGFiZWwsIG51bGwpXG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlQb2xhckF4aXMsIFwiZ2V0RG9tYWluXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IEF4aXMuZ2V0RG9tYWluXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5UG9sYXJBeGlzLCBcImdldEF4aXNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogQXhpcy5nZXRBeGlzXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5UG9sYXJBeGlzLCBcImdldFNjYWxlXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IGdldFNjYWxlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5UG9sYXJBeGlzLCBcImdldFN0eWxlc1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gZ2V0U3R5bGVzKHByb3BzLCBmYWxsYmFja1Byb3BzLnN0eWxlKTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVBvbGFyQXhpcywgXCJnZXRCYXNlUHJvcHNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIGdldEJhc2VQcm9wcyhwcm9wcywgZmFsbGJhY2tQcm9wcyk7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlQb2xhckF4aXMsIFwiZXhwZWN0ZWRDb21wb25lbnRzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFtcImF4aXNDb21wb25lbnRcIiwgXCJjaXJjdWxhckF4aXNDb21wb25lbnRcIiwgXCJncm91cENvbXBvbmVudFwiLCBcImNvbnRhaW5lckNvbXBvbmVudFwiLCBcInRpY2tDb21wb25lbnRcIiwgXCJ0aWNrTGFiZWxDb21wb25lbnRcIiwgXCJncmlkQ29tcG9uZW50XCIsIFwiY2lyY3VsYXJHcmlkQ29tcG9uZW50XCJdXG59KTtcbmV4cG9ydCBkZWZhdWx0IGFkZEV2ZW50cyhWaWN0b3J5UG9sYXJBeGlzLCBvcHRpb25zKTsiLCJpbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuaW1wb3J0IF9kZWZhdWx0cyBmcm9tIFwibG9kYXNoL2RlZmF1bHRzXCI7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbi8qIGVzbGludC1kaXNhYmxlIGZ1bmMtc3R5bGUgKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IEhlbHBlcnMsIFNjYWxlLCBBeGlzLCBXcmFwcGVyIH0gZnJvbSBcInZpY3RvcnktY29yZVwiO1xudmFyIGZhbGxiYWNrUHJvcHMgPSB7XG4gIHdpZHRoOiA0NTAsXG4gIGhlaWdodDogMzAwLFxuICBwYWRkaW5nOiA1MFxufTtcblxuZnVuY3Rpb24gZ2V0QXhpc1Byb3BzKGNoaWxkLCBwcm9wcywgY2FsY3VsYXRlZFByb3BzKSB7XG4gIHZhciBkb21haW4gPSBjYWxjdWxhdGVkUHJvcHMuZG9tYWluLFxuICAgICAgc2NhbGUgPSBjYWxjdWxhdGVkUHJvcHMuc2NhbGUsXG4gICAgICBzdHJpbmdNYXAgPSBjYWxjdWxhdGVkUHJvcHMuc3RyaW5nTWFwLFxuICAgICAgY2F0ZWdvcmllcyA9IGNhbGN1bGF0ZWRQcm9wcy5jYXRlZ29yaWVzLFxuICAgICAgaG9yaXpvbnRhbCA9IGNhbGN1bGF0ZWRQcm9wcy5ob3Jpem9udGFsO1xuICByZXR1cm4ge1xuICAgIHN0cmluZ01hcDogc3RyaW5nTWFwLFxuICAgIGhvcml6b250YWw6IGhvcml6b250YWwsXG4gICAgY2F0ZWdvcmllczogY2F0ZWdvcmllcyxcbiAgICBzdGFydEFuZ2xlOiBwcm9wcy5zdGFydEFuZ2xlLFxuICAgIGVuZEFuZ2xlOiBwcm9wcy5lbmRBbmdsZSxcbiAgICBpbm5lclJhZGl1czogcHJvcHMuaW5uZXJSYWRpdXMsXG4gICAgZG9tYWluOiBkb21haW4sXG4gICAgc2NhbGU6IHNjYWxlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYWNrZ3JvdW5kV2l0aFByb3BzKHByb3BzLCBjYWxjdWxhdGVkUHJvcHMpIHtcbiAgdmFyIGJhY2tncm91bmRFbGVtZW50ID0gcHJvcHMuYmFja2dyb3VuZENvbXBvbmVudDtcbiAgdmFyIGhlaWdodCA9IHByb3BzLnBvbGFyID8gY2FsY3VsYXRlZFByb3BzLnJhbmdlLnlbMV0gOiBjYWxjdWxhdGVkUHJvcHMucmFuZ2UueVswXSAtIGNhbGN1bGF0ZWRQcm9wcy5yYW5nZS55WzFdO1xuICB2YXIgd2lkdGggPSBjYWxjdWxhdGVkUHJvcHMucmFuZ2UueFsxXSAtIGNhbGN1bGF0ZWRQcm9wcy5yYW5nZS54WzBdO1xuICB2YXIgeFNjYWxlID0gcHJvcHMuaG9yaXpvbnRhbCA/IGNhbGN1bGF0ZWRQcm9wcy5zY2FsZS55LnJhbmdlKClbMF0gOiBjYWxjdWxhdGVkUHJvcHMuc2NhbGUueC5yYW5nZSgpWzBdO1xuICB2YXIgeVNjYWxlID0gcHJvcHMuaG9yaXpvbnRhbCA/IGNhbGN1bGF0ZWRQcm9wcy5zY2FsZS54LnJhbmdlKClbMV0gOiBjYWxjdWxhdGVkUHJvcHMuc2NhbGUueS5yYW5nZSgpWzFdO1xuICB2YXIgeENvb3JkaW5hdGUgPSBwcm9wcy5wb2xhciA/IGNhbGN1bGF0ZWRQcm9wcy5vcmlnaW4ueCA6IHhTY2FsZTtcbiAgdmFyIHlDb29yZGluYXRlID0gcHJvcHMucG9sYXIgPyBjYWxjdWxhdGVkUHJvcHMub3JpZ2luLnkgOiB5U2NhbGU7XG4gIHZhciBwYXJlbnROYW1lID0gcHJvcHMubmFtZSB8fCBcImNoYXJ0XCI7XG4gIHZhciBiYWNrZ3JvdW5kUHJvcHMgPSB7XG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgcG9sYXI6IHByb3BzLnBvbGFyLFxuICAgIHNjYWxlOiBjYWxjdWxhdGVkUHJvcHMuc2NhbGUsXG4gICAgc3R5bGU6IHByb3BzLnN0eWxlLmJhY2tncm91bmQsXG4gICAgeDogeENvb3JkaW5hdGUsXG4gICAgeTogeUNvb3JkaW5hdGUsXG4gICAga2V5OiBcIlwiLmNvbmNhdChwYXJlbnROYW1lLCBcIi1iYWNrZ3JvdW5kXCIpLFxuICAgIHdpZHRoOiB3aWR0aFxuICB9O1xuICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGJhY2tncm91bmRFbGVtZW50LCBfZGVmYXVsdHMoe30sIGJhY2tncm91bmRFbGVtZW50LnByb3BzLCBiYWNrZ3JvdW5kUHJvcHMpKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hpbGRQcm9wcyhjaGlsZCwgcHJvcHMsIGNhbGN1bGF0ZWRQcm9wcykge1xuICB2YXIgYXhpc0NoaWxkID0gQXhpcy5maW5kQXhpc0NvbXBvbmVudHMoW2NoaWxkXSk7XG5cbiAgaWYgKGF4aXNDaGlsZC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGdldEF4aXNQcm9wcyhheGlzQ2hpbGRbMF0sIHByb3BzLCBjYWxjdWxhdGVkUHJvcHMpO1xuICB9XG5cbiAgdmFyIGNhdGVnb3JpZXMgPSBjYWxjdWxhdGVkUHJvcHMuY2F0ZWdvcmllcyxcbiAgICAgIGRvbWFpbiA9IGNhbGN1bGF0ZWRQcm9wcy5kb21haW4sXG4gICAgICByYW5nZSA9IGNhbGN1bGF0ZWRQcm9wcy5yYW5nZSxcbiAgICAgIHNjYWxlID0gY2FsY3VsYXRlZFByb3BzLnNjYWxlLFxuICAgICAgc3RyaW5nTWFwID0gY2FsY3VsYXRlZFByb3BzLnN0cmluZ01hcCxcbiAgICAgIGhvcml6b250YWwgPSBjYWxjdWxhdGVkUHJvcHMuaG9yaXpvbnRhbDtcbiAgcmV0dXJuIHtcbiAgICBjYXRlZ29yaWVzOiBjYXRlZ29yaWVzLFxuICAgIGRvbWFpbjogZG9tYWluLFxuICAgIHJhbmdlOiByYW5nZSxcbiAgICBzY2FsZTogc2NhbGUsXG4gICAgc3RyaW5nTWFwOiBzdHJpbmdNYXAsXG4gICAgaG9yaXpvbnRhbDogaG9yaXpvbnRhbFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRTdHlsZXMocHJvcHMpIHtcbiAgdmFyIHN0eWxlUHJvcHMgPSBwcm9wcy5zdHlsZSAmJiBwcm9wcy5zdHlsZS5wYXJlbnQ7XG4gIHJldHVybiB7XG4gICAgcGFyZW50OiBfZGVmYXVsdHMoe30sIHN0eWxlUHJvcHMsIHtcbiAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICB1c2VyU2VsZWN0OiBcIm5vbmVcIlxuICAgIH0pXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYWxjdWxhdGVkUHJvcHMocHJvcHMsIGNoaWxkQ29tcG9uZW50cykge1xuICB2YXIgc3R5bGUgPSBnZXRTdHlsZXMocHJvcHMpO1xuICBwcm9wcyA9IEhlbHBlcnMubW9kaWZ5UHJvcHMocHJvcHMsIGZhbGxiYWNrUHJvcHMsIFwiY2hhcnRcIik7XG4gIHZhciBfcHJvcHMgPSBwcm9wcyxcbiAgICAgIGhvcml6b250YWwgPSBfcHJvcHMuaG9yaXpvbnRhbCxcbiAgICAgIHBvbGFyID0gX3Byb3BzLnBvbGFyO1xuICB2YXIgYWxsU3RyaW5ncyA9IFdyYXBwZXIuZ2V0U3RyaW5nc0Zyb21DaGlsZHJlbihwcm9wcywgY2hpbGRDb21wb25lbnRzKTtcbiAgdmFyIGNhdGVnb3JpZXMgPSBXcmFwcGVyLmdldENhdGVnb3JpZXMocHJvcHMsIGNoaWxkQ29tcG9uZW50cywgYWxsU3RyaW5ncyk7XG4gIHZhciBzdHJpbmdNYXAgPSBjcmVhdGVTdHJpbmdNYXAocHJvcHMsIGNoaWxkQ29tcG9uZW50cywgYWxsU3RyaW5ncyk7XG4gIHZhciBkb21haW4gPSB7XG4gICAgeDogZ2V0RG9tYWluKF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICBjYXRlZ29yaWVzOiBjYXRlZ29yaWVzXG4gICAgfSksIFwieFwiLCBjaGlsZENvbXBvbmVudHMpLFxuICAgIHk6IGdldERvbWFpbihfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgY2F0ZWdvcmllczogY2F0ZWdvcmllc1xuICAgIH0pLCBcInlcIiwgY2hpbGRDb21wb25lbnRzKVxuICB9O1xuICB2YXIgcmFuZ2UgPSB7XG4gICAgeDogSGVscGVycy5nZXRSYW5nZShwcm9wcywgXCJ4XCIpLFxuICAgIHk6IEhlbHBlcnMuZ2V0UmFuZ2UocHJvcHMsIFwieVwiKVxuICB9O1xuICB2YXIgYmFzZVNjYWxlID0ge1xuICAgIHg6IFNjYWxlLmdldFNjYWxlRnJvbVByb3BzKHByb3BzLCBcInhcIikgfHwgV3JhcHBlci5nZXRTY2FsZShwcm9wcywgXCJ4XCIpLFxuICAgIHk6IFNjYWxlLmdldFNjYWxlRnJvbVByb3BzKHByb3BzLCBcInlcIikgfHwgV3JhcHBlci5nZXRTY2FsZShwcm9wcywgXCJ5XCIpXG4gIH07XG4gIHZhciBzY2FsZSA9IHtcbiAgICB4OiBiYXNlU2NhbGUueC5kb21haW4oZG9tYWluLngpLnJhbmdlKGhvcml6b250YWwgPyByYW5nZS55IDogcmFuZ2UueCksXG4gICAgeTogYmFzZVNjYWxlLnkuZG9tYWluKGRvbWFpbi55KS5yYW5nZShob3Jpem9udGFsID8gcmFuZ2UueCA6IHJhbmdlLnkpXG4gIH07XG4gIHZhciBvcmlnaW4gPSBwb2xhciA/IEhlbHBlcnMuZ2V0UG9sYXJPcmlnaW4ocHJvcHMpIDogQXhpcy5nZXRPcmlnaW4oZG9tYWluKTtcbiAgdmFyIHBhZGRpbmcgPSBIZWxwZXJzLmdldFBhZGRpbmcocHJvcHMpO1xuICByZXR1cm4ge1xuICAgIGNhdGVnb3JpZXM6IGNhdGVnb3JpZXMsXG4gICAgZG9tYWluOiBkb21haW4sXG4gICAgcmFuZ2U6IHJhbmdlLFxuICAgIGhvcml6b250YWw6IGhvcml6b250YWwsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIHN0cmluZ01hcDogc3RyaW5nTWFwLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBvcmlnaW46IG9yaWdpbixcbiAgICBwYWRkaW5nOiBwYWRkaW5nXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hpbGRyZW4ocHJvcHMsIGNoaWxkQ29tcG9uZW50cywgY2FsY3VsYXRlZFByb3BzKSB7XG4gIGNoaWxkQ29tcG9uZW50cyA9IGNoaWxkQ29tcG9uZW50cyB8fCBnZXRDaGlsZENvbXBvbmVudHMocHJvcHMpO1xuICBjYWxjdWxhdGVkUHJvcHMgPSBjYWxjdWxhdGVkUHJvcHMgfHwgZ2V0Q2FsY3VsYXRlZFByb3BzKHByb3BzLCBjaGlsZENvbXBvbmVudHMpO1xuICB2YXIgYmFzZVN0eWxlID0gY2FsY3VsYXRlZFByb3BzLnN0eWxlLnBhcmVudDtcbiAgdmFyIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICAgIHBvbGFyID0gcHJvcHMucG9sYXIsXG4gICAgICB0aGVtZSA9IHByb3BzLnRoZW1lLFxuICAgICAgd2lkdGggPSBwcm9wcy53aWR0aDtcbiAgdmFyIF9jYWxjdWxhdGVkUHJvcHMgPSBjYWxjdWxhdGVkUHJvcHMsXG4gICAgICBvcmlnaW4gPSBfY2FsY3VsYXRlZFByb3BzLm9yaWdpbixcbiAgICAgIGhvcml6b250YWwgPSBfY2FsY3VsYXRlZFByb3BzLmhvcml6b250YWw7XG4gIHZhciBwYXJlbnROYW1lID0gcHJvcHMubmFtZSB8fCBcImNoYXJ0XCI7XG4gIHJldHVybiBjaGlsZENvbXBvbmVudHMubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICB2YXIgcm9sZSA9IGNoaWxkLnR5cGUgJiYgY2hpbGQudHlwZS5yb2xlO1xuICAgIHZhciBzdHlsZSA9IEFycmF5LmlzQXJyYXkoY2hpbGQucHJvcHMuc3R5bGUpID8gY2hpbGQucHJvcHMuc3R5bGUgOiBfZGVmYXVsdHMoe30sIGNoaWxkLnByb3BzLnN0eWxlLCB7XG4gICAgICBwYXJlbnQ6IGJhc2VTdHlsZVxuICAgIH0pO1xuICAgIHZhciBjaGlsZFByb3BzID0gZ2V0Q2hpbGRQcm9wcyhjaGlsZCwgcHJvcHMsIGNhbGN1bGF0ZWRQcm9wcyk7XG4gICAgdmFyIG5hbWUgPSBjaGlsZC5wcm9wcy5uYW1lIHx8IFwiXCIuY29uY2F0KHBhcmVudE5hbWUsIFwiLVwiKS5jb25jYXQocm9sZSwgXCItXCIpLmNvbmNhdChpbmRleCk7XG5cbiAgICB2YXIgbmV3UHJvcHMgPSBfZGVmYXVsdHMoe1xuICAgICAgaG9yaXpvbnRhbDogaG9yaXpvbnRhbCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgcG9sYXI6IHBvbGFyLFxuICAgICAgdGhlbWU6IHRoZW1lLFxuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIG9yaWdpbjogcG9sYXIgPyBvcmlnaW4gOiB1bmRlZmluZWQsXG4gICAgICBwYWRkaW5nOiBjYWxjdWxhdGVkUHJvcHMucGFkZGluZyxcbiAgICAgIGtleTogXCJcIi5jb25jYXQobmFtZSwgXCIta2V5LVwiKS5jb25jYXQoaW5kZXgpLFxuICAgICAgc3RhbmRhbG9uZTogZmFsc2VcbiAgICB9LCBjaGlsZFByb3BzKTtcblxuICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIG5ld1Byb3BzKTtcbiAgfSk7XG59XG5leHBvcnQgdmFyIGdldENoaWxkQ29tcG9uZW50cyA9IGZ1bmN0aW9uIChwcm9wcywgZGVmYXVsdEF4ZXMpIHtcbiAgdmFyIGNoaWxkQ29tcG9uZW50cyA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkocHJvcHMuY2hpbGRyZW4pO1xuXG4gIHZhciBuZXdDaGlsZENvbXBvbmVudHMgPSBfdG9Db25zdW1hYmxlQXJyYXkoY2hpbGRDb21wb25lbnRzKTtcblxuICBpZiAoY2hpbGRDb21wb25lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIG5ld0NoaWxkQ29tcG9uZW50cy5wdXNoKGRlZmF1bHRBeGVzLmluZGVwZW5kZW50LCBkZWZhdWx0QXhlcy5kZXBlbmRlbnQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBheGlzQ29tcG9uZW50cyA9IHtcbiAgICAgIGRlcGVuZGVudDogQXhpcy5nZXRBeGlzQ29tcG9uZW50c1dpdGhQYXJlbnQoY2hpbGRDb21wb25lbnRzLCBcImRlcGVuZGVudFwiKSxcbiAgICAgIGluZGVwZW5kZW50OiBBeGlzLmdldEF4aXNDb21wb25lbnRzV2l0aFBhcmVudChjaGlsZENvbXBvbmVudHMsIFwiaW5kZXBlbmRlbnRcIilcbiAgICB9O1xuXG4gICAgaWYgKGF4aXNDb21wb25lbnRzLmRlcGVuZGVudC5sZW5ndGggPT09IDAgJiYgYXhpc0NvbXBvbmVudHMuaW5kZXBlbmRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICBuZXdDaGlsZENvbXBvbmVudHMgPSBwcm9wcy5wcmVwZW5kRGVmYXVsdEF4ZXMgPyBbZGVmYXVsdEF4ZXMuaW5kZXBlbmRlbnQsIGRlZmF1bHRBeGVzLmRlcGVuZGVudF0uY29uY2F0KG5ld0NoaWxkQ29tcG9uZW50cykgOiBuZXdDaGlsZENvbXBvbmVudHMuY29uY2F0KFtkZWZhdWx0QXhlcy5pbmRlcGVuZGVudCwgZGVmYXVsdEF4ZXMuZGVwZW5kZW50XSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0NoaWxkQ29tcG9uZW50cztcbn07XG5cbnZhciBnZXREb21haW4gPSBmdW5jdGlvbiAocHJvcHMsIGF4aXMsIGNoaWxkQ29tcG9uZW50cykge1xuICBjaGlsZENvbXBvbmVudHMgPSBjaGlsZENvbXBvbmVudHMgfHwgUmVhY3QuQ2hpbGRyZW4udG9BcnJheShwcm9wcy5jaGlsZHJlbik7XG4gIHZhciBkb21haW4gPSBXcmFwcGVyLmdldERvbWFpbihwcm9wcywgYXhpcywgY2hpbGRDb21wb25lbnRzKTtcbiAgdmFyIGF4aXNDb21wb25lbnQgPSBBeGlzLmdldEF4aXNDb21wb25lbnQoY2hpbGRDb21wb25lbnRzLCBheGlzKTtcbiAgdmFyIGludmVydERvbWFpbiA9IGF4aXNDb21wb25lbnQgJiYgYXhpc0NvbXBvbmVudC5wcm9wcyAmJiBheGlzQ29tcG9uZW50LnByb3BzLmludmVydEF4aXM7XG4gIHJldHVybiBpbnZlcnREb21haW4gPyBkb21haW4uY29uY2F0KCkucmV2ZXJzZSgpIDogZG9tYWluO1xufTtcblxudmFyIGNyZWF0ZVN0cmluZ01hcCA9IGZ1bmN0aW9uIChwcm9wcywgY2hpbGRDb21wb25lbnRzLCBhbGxTdHJpbmdzKSB7XG4gIHZhciB4ID0gIWFsbFN0cmluZ3MueCB8fCBhbGxTdHJpbmdzLngubGVuZ3RoID09PSAwID8gbnVsbCA6IGFsbFN0cmluZ3MueC5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIHN0cmluZywgaW5kZXgpIHtcbiAgICBtZW1vW3N0cmluZ10gPSBpbmRleCArIDE7XG4gICAgcmV0dXJuIG1lbW87XG4gIH0sIHt9KTtcbiAgdmFyIHkgPSAhYWxsU3RyaW5ncy55IHx8IGFsbFN0cmluZ3MueS5sZW5ndGggPT09IDAgPyBudWxsIDogYWxsU3RyaW5ncy55LnJlZHVjZShmdW5jdGlvbiAobWVtbywgc3RyaW5nLCBpbmRleCkge1xuICAgIG1lbW9bc3RyaW5nXSA9IGluZGV4ICsgMTtcbiAgICByZXR1cm4gbWVtbztcbiAgfSwge30pO1xuICByZXR1cm4ge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufTsiLCJpbXBvcnQgX2lzRW1wdHkgZnJvbSBcImxvZGFzaC9pc0VtcHR5XCI7XG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuaW1wb3J0IF9kZWZhdWx0cyBmcm9tIFwibG9kYXNoL2RlZmF1bHRzXCI7XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgQmFja2dyb3VuZCwgSGVscGVycywgVmljdG9yeUNvbnRhaW5lciwgVmljdG9yeVRoZW1lLCBDb21tb25Qcm9wcywgUHJvcFR5cGVzIGFzIEN1c3RvbVByb3BUeXBlcywgV3JhcHBlciwgSG9va3MgfSBmcm9tIFwidmljdG9yeS1jb3JlXCI7XG5pbXBvcnQgeyBWaWN0b3J5U2hhcmVkRXZlbnRzIH0gZnJvbSBcInZpY3Rvcnktc2hhcmVkLWV2ZW50c1wiO1xuaW1wb3J0IHsgVmljdG9yeUF4aXMgfSBmcm9tIFwidmljdG9yeS1heGlzXCI7XG5pbXBvcnQgeyBWaWN0b3J5UG9sYXJBeGlzIH0gZnJvbSBcInZpY3RvcnktcG9sYXItYXhpc1wiO1xuaW1wb3J0IHsgZ2V0QmFja2dyb3VuZFdpdGhQcm9wcywgZ2V0Q2hpbGRDb21wb25lbnRzLCBnZXRDYWxjdWxhdGVkUHJvcHMsIGdldENoaWxkcmVuIH0gZnJvbSBcIi4vaGVscGVyLW1ldGhvZHNcIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJyZWFjdC1mYXN0LWNvbXBhcmVcIjtcbnZhciBmYWxsYmFja1Byb3BzID0ge1xuICB3aWR0aDogNDUwLFxuICBoZWlnaHQ6IDMwMCxcbiAgcGFkZGluZzogNTBcbn07XG5cbnZhciBWaWN0b3J5Q2hhcnQgPSBmdW5jdGlvbiAoaW5pdGlhbFByb3BzKSB7XG4gIHZhciByb2xlID0gXCJjaGFydFwiO1xuXG4gIHZhciBfSG9va3MkdXNlQW5pbWF0aW9uU3QgPSBIb29rcy51c2VBbmltYXRpb25TdGF0ZSgpLFxuICAgICAgZ2V0QW5pbWF0aW9uUHJvcHMgPSBfSG9va3MkdXNlQW5pbWF0aW9uU3QuZ2V0QW5pbWF0aW9uUHJvcHMsXG4gICAgICBzZXRBbmltYXRpb25TdGF0ZSA9IF9Ib29rcyR1c2VBbmltYXRpb25TdC5zZXRBbmltYXRpb25TdGF0ZSxcbiAgICAgIGdldFByb3BzID0gX0hvb2tzJHVzZUFuaW1hdGlvblN0LmdldFByb3BzO1xuXG4gIHZhciBwcm9wcyA9IGdldFByb3BzKGluaXRpYWxQcm9wcyk7XG4gIHZhciBtb2RpZmllZFByb3BzID0gSGVscGVycy5tb2RpZnlQcm9wcyhwcm9wcywgZmFsbGJhY2tQcm9wcywgcm9sZSk7XG4gIHZhciBldmVudEtleSA9IG1vZGlmaWVkUHJvcHMuZXZlbnRLZXksXG4gICAgICBjb250YWluZXJDb21wb25lbnQgPSBtb2RpZmllZFByb3BzLmNvbnRhaW5lckNvbXBvbmVudCxcbiAgICAgIHN0YW5kYWxvbmUgPSBtb2RpZmllZFByb3BzLnN0YW5kYWxvbmUsXG4gICAgICBncm91cENvbXBvbmVudCA9IG1vZGlmaWVkUHJvcHMuZ3JvdXBDb21wb25lbnQsXG4gICAgICBleHRlcm5hbEV2ZW50TXV0YXRpb25zID0gbW9kaWZpZWRQcm9wcy5leHRlcm5hbEV2ZW50TXV0YXRpb25zLFxuICAgICAgd2lkdGggPSBtb2RpZmllZFByb3BzLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gbW9kaWZpZWRQcm9wcy5oZWlnaHQsXG4gICAgICB0aGVtZSA9IG1vZGlmaWVkUHJvcHMudGhlbWUsXG4gICAgICBwb2xhciA9IG1vZGlmaWVkUHJvcHMucG9sYXIsXG4gICAgICBuYW1lID0gbW9kaWZpZWRQcm9wcy5uYW1lO1xuICB2YXIgYXhlcyA9IHByb3BzLnBvbGFyID8gbW9kaWZpZWRQcm9wcy5kZWZhdWx0UG9sYXJBeGVzIDogbW9kaWZpZWRQcm9wcy5kZWZhdWx0QXhlcztcbiAgdmFyIGNoaWxkQ29tcG9uZW50cyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRDaGlsZENvbXBvbmVudHMobW9kaWZpZWRQcm9wcywgYXhlcyk7XG4gIH0sIFttb2RpZmllZFByb3BzLCBheGVzXSk7XG4gIHZhciBjYWxjdWxhdGVkUHJvcHMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0Q2FsY3VsYXRlZFByb3BzKG1vZGlmaWVkUHJvcHMsIGNoaWxkQ29tcG9uZW50cyk7XG4gIH0sIFttb2RpZmllZFByb3BzLCBjaGlsZENvbXBvbmVudHNdKTtcbiAgdmFyIGRvbWFpbiA9IGNhbGN1bGF0ZWRQcm9wcy5kb21haW4sXG4gICAgICBzY2FsZSA9IGNhbGN1bGF0ZWRQcm9wcy5zY2FsZSxcbiAgICAgIHN0eWxlID0gY2FsY3VsYXRlZFByb3BzLnN0eWxlLFxuICAgICAgb3JpZ2luID0gY2FsY3VsYXRlZFByb3BzLm9yaWdpbixcbiAgICAgIHJhZGl1cyA9IGNhbGN1bGF0ZWRQcm9wcy5yYWRpdXMsXG4gICAgICBob3Jpem9udGFsID0gY2FsY3VsYXRlZFByb3BzLmhvcml6b250YWw7XG4gIHZhciBuZXdDaGlsZHJlbiA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHByb3BzLCBjaGlsZENvbXBvbmVudHMsIGNhbGN1bGF0ZWRQcm9wcyk7XG4gICAgdmFyIG1hcHBlZENoaWxkcmVuID0gY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICAgIHZhciBjaGlsZFByb3BzID0gX2Fzc2lnbih7XG4gICAgICAgIGFuaW1hdGU6IGdldEFuaW1hdGlvblByb3BzKHByb3BzLCBjaGlsZCwgaW5kZXgsIFwidmljdG9yeSBjaGFydFwiKVxuICAgICAgfSwgY2hpbGQucHJvcHMpO1xuXG4gICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkLCBjaGlsZFByb3BzKTtcbiAgICB9KTtcblxuICAgIGlmIChwcm9wcy5zdHlsZSAmJiBwcm9wcy5zdHlsZS5iYWNrZ3JvdW5kKSB7XG4gICAgICB2YXIgYmFja2dyb3VuZENvbXBvbmVudCA9IGdldEJhY2tncm91bmRXaXRoUHJvcHMocHJvcHMsIGNhbGN1bGF0ZWRQcm9wcyk7XG4gICAgICBtYXBwZWRDaGlsZHJlbi51bnNoaWZ0KGJhY2tncm91bmRDb21wb25lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBtYXBwZWRDaGlsZHJlbjtcbiAgfSwgW2dldEFuaW1hdGlvblByb3BzLCBjaGlsZENvbXBvbmVudHMsIHByb3BzLCBjYWxjdWxhdGVkUHJvcHNdKTtcbiAgdmFyIGNvbnRhaW5lclByb3BzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHN0YW5kYWxvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbWFpbjogZG9tYWluLFxuICAgICAgICBzY2FsZTogc2NhbGUsXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIHN0YW5kYWxvbmU6IHN0YW5kYWxvbmUsXG4gICAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgICAgc3R5bGU6IHN0eWxlLnBhcmVudCxcbiAgICAgICAgaG9yaXpvbnRhbDogaG9yaXpvbnRhbCxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgcG9sYXI6IHBvbGFyLFxuICAgICAgICByYWRpdXM6IHJhZGl1cyxcbiAgICAgICAgb3JpZ2luOiBwb2xhciA/IG9yaWdpbiA6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH0sIFtkb21haW4sIHNjYWxlLCB3aWR0aCwgaGVpZ2h0LCBzdGFuZGFsb25lLCB0aGVtZSwgc3R5bGUsIGhvcml6b250YWwsIG5hbWUsIHBvbGFyLCByYWRpdXMsIG9yaWdpbl0pO1xuICB2YXIgY29udGFpbmVyID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHN0YW5kYWxvbmUpIHtcbiAgICAgIHZhciBkZWZhdWx0Q29udGFpbmVyUHJvcHMgPSBfZGVmYXVsdHMoe30sIGNvbnRhaW5lckNvbXBvbmVudC5wcm9wcywgY29udGFpbmVyUHJvcHMpO1xuXG4gICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNvbnRhaW5lckNvbXBvbmVudCwgZGVmYXVsdENvbnRhaW5lclByb3BzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JvdXBDb21wb25lbnQ7XG4gIH0sIFtncm91cENvbXBvbmVudCwgc3RhbmRhbG9uZSwgY29udGFpbmVyQ29tcG9uZW50LCBjb250YWluZXJQcm9wc10pO1xuICB2YXIgZXZlbnRzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFdyYXBwZXIuZ2V0QWxsRXZlbnRzKHByb3BzKTtcbiAgfSwgW3Byb3BzXSk7XG4gIHZhciBwcmV2aW91c1Byb3BzID0gSG9va3MudXNlUHJldmlvdXNQcm9wcyhpbml0aWFsUHJvcHMpO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBkaXNtb3VudCB0byBrZWVwIHN0YXRlIGluIHN5bmNcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGluaXRpYWxQcm9wcy5hbmltYXRlKSB7XG4gICAgICAgIHNldEFuaW1hdGlvblN0YXRlKHByZXZpb3VzUHJvcHMsIGluaXRpYWxQcm9wcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3NldEFuaW1hdGlvblN0YXRlLCBwcmV2aW91c1Byb3BzLCBpbml0aWFsUHJvcHNdKTtcblxuICBpZiAoIV9pc0VtcHR5KGV2ZW50cykpIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5U2hhcmVkRXZlbnRzLCB7XG4gICAgICBjb250YWluZXI6IGNvbnRhaW5lcixcbiAgICAgIGV2ZW50S2V5OiBldmVudEtleSxcbiAgICAgIGV2ZW50czogZXZlbnRzLFxuICAgICAgZXh0ZXJuYWxFdmVudE11dGF0aW9uczogZXh0ZXJuYWxFdmVudE11dGF0aW9uc1xuICAgIH0sIG5ld0NoaWxkcmVuKTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY29udGFpbmVyLCBjb250YWluZXIucHJvcHMsIG5ld0NoaWxkcmVuKTtcbn07XG5cblZpY3RvcnlDaGFydC5wcm9wVHlwZXMgPSBfb2JqZWN0U3ByZWFkKHt9LCBDb21tb25Qcm9wcy5iYXNlUHJvcHMsIHtcbiAgYmFja2dyb3VuZENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubm9kZSksIFByb3BUeXBlcy5ub2RlXSksXG4gIGRlZmF1bHRBeGVzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGluZGVwZW5kZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgICBkZXBlbmRlbnQ6IFByb3BUeXBlcy5lbGVtZW50XG4gIH0pLFxuICBkZWZhdWx0UG9sYXJBeGVzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGluZGVwZW5kZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgICBkZXBlbmRlbnQ6IFByb3BUeXBlcy5lbGVtZW50XG4gIH0pLFxuICBlbmRBbmdsZTogUHJvcFR5cGVzLm51bWJlcixcbiAgaW5uZXJSYWRpdXM6IEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZSxcbiAgcHJlcGVuZERlZmF1bHRBeGVzOiBQcm9wVHlwZXMuYm9vbCxcbiAgc3RhcnRBbmdsZTogUHJvcFR5cGVzLm51bWJlclxufSk7XG5WaWN0b3J5Q2hhcnQuZGVmYXVsdFByb3BzID0ge1xuICBiYWNrZ3JvdW5kQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KEJhY2tncm91bmQsIG51bGwpLFxuICBjb250YWluZXJDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUNvbnRhaW5lciwgbnVsbCksXG4gIGRlZmF1bHRBeGVzOiB7XG4gICAgaW5kZXBlbmRlbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUF4aXMsIG51bGwpLFxuICAgIGRlcGVuZGVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5QXhpcywge1xuICAgICAgZGVwZW5kZW50QXhpczogdHJ1ZVxuICAgIH0pXG4gIH0sXG4gIGRlZmF1bHRQb2xhckF4ZXM6IHtcbiAgICBpbmRlcGVuZGVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5UG9sYXJBeGlzLCBudWxsKSxcbiAgICBkZXBlbmRlbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeVBvbGFyQXhpcywge1xuICAgICAgZGVwZW5kZW50QXhpczogdHJ1ZVxuICAgIH0pXG4gIH0sXG4gIGdyb3VwQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCBudWxsKSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGhlbWU6IFZpY3RvcnlUaGVtZS5ncmF5c2NhbGVcbn07XG52YXIgVmljdG9yeUNoYXJ0TWVtbyA9IFJlYWN0Lm1lbW8oVmljdG9yeUNoYXJ0LCBpc0VxdWFsKTtcblZpY3RvcnlDaGFydE1lbW8uZGlzcGxheU5hbWUgPSBcIlZpY3RvcnlDaGFydFwiO1xuVmljdG9yeUNoYXJ0TWVtby5leHBlY3RlZENvbXBvbmVudHMgPSBbXCJncm91cENvbXBvbmVudFwiLCBcImNvbnRhaW5lckNvbXBvbmVudFwiXTtcbmV4cG9ydCBkZWZhdWx0IFZpY3RvcnlDaGFydE1lbW87IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2NvbG9yX2JsdWVfMTAwID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNvbG9yLWJsdWUtMTAwXCIsXG4gIFwidmFsdWVcIjogXCIjOGJjMWY3XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3ItYmx1ZS0xMDApXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9jb2xvcl9ibHVlXzEwMDsiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfYmx1ZV8yMDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3ItYmx1ZS0yMDBcIixcbiAgXCJ2YWx1ZVwiOiBcIiM1MTlkZTlcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1jb2xvci1ibHVlLTIwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX2JsdWVfMjAwOyIsImV4cG9ydCBjb25zdCBjaGFydF9jb2xvcl9ibHVlXzMwMCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1jb2xvci1ibHVlLTMwMFwiLFxuICBcInZhbHVlXCI6IFwiIzA2Y1wiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNvbG9yLWJsdWUtMzAwKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfY29sb3JfYmx1ZV8zMDA7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2NvbG9yX2JsdWVfNDAwID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNvbG9yLWJsdWUtNDAwXCIsXG4gIFwidmFsdWVcIjogXCIjMDA0Yjk1XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3ItYmx1ZS00MDApXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9jb2xvcl9ibHVlXzQwMDsiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfYmx1ZV81MDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3ItYmx1ZS01MDBcIixcbiAgXCJ2YWx1ZVwiOiBcIiMwMDJmNWRcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1jb2xvci1ibHVlLTUwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX2JsdWVfNTAwOyIsIi8vIFZpY3RvcnkgdGhlbWUgcHJvcGVydGllcyBvbmx5XG5leHBvcnQgY29uc3QgQ29sb3JUaGVtZSA9IChwcm9wcykgPT4ge1xuICAgIGNvbnN0IHsgQ09MT1JfU0NBTEUgfSA9IHByb3BzO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFyZWE6IHtcbiAgICAgICAgICAgIGNvbG9yU2NhbGU6IENPTE9SX1NDQUxFLFxuICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGw6IENPTE9SX1NDQUxFWzBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBheGlzOiB7XG4gICAgICAgICAgICBjb2xvclNjYWxlOiBDT0xPUl9TQ0FMRVxuICAgICAgICB9LFxuICAgICAgICBiYXI6IHtcbiAgICAgICAgICAgIGNvbG9yU2NhbGU6IENPTE9SX1NDQUxFLFxuICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGw6IENPTE9SX1NDQUxFWzBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBib3hwbG90OiB7XG4gICAgICAgICAgICBjb2xvclNjYWxlOiBDT0xPUl9TQ0FMRVxuICAgICAgICB9LFxuICAgICAgICBjYW5kbGVzdGljazoge1xuICAgICAgICAgICAgY29sb3JTY2FsZTogQ09MT1JfU0NBTEVcbiAgICAgICAgfSxcbiAgICAgICAgY2hhcnQ6IHtcbiAgICAgICAgICAgIGNvbG9yU2NhbGU6IENPTE9SX1NDQUxFXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yYmFyOiB7XG4gICAgICAgICAgICBjb2xvclNjYWxlOiBDT0xPUl9TQ0FMRVxuICAgICAgICB9LFxuICAgICAgICBncm91cDoge1xuICAgICAgICAgICAgY29sb3JTY2FsZTogQ09MT1JfU0NBTEVcbiAgICAgICAgfSxcbiAgICAgICAgbGVnZW5kOiB7XG4gICAgICAgICAgICBjb2xvclNjYWxlOiBDT0xPUl9TQ0FMRVxuICAgICAgICB9LFxuICAgICAgICBsaW5lOiB7XG4gICAgICAgICAgICBjb2xvclNjYWxlOiBDT0xPUl9TQ0FMRSxcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IENPTE9SX1NDQUxFWzBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBwaWU6IHtcbiAgICAgICAgICAgIGNvbG9yU2NhbGU6IENPTE9SX1NDQUxFXG4gICAgICAgIH0sXG4gICAgICAgIHNjYXR0ZXI6IHtcbiAgICAgICAgICAgIGNvbG9yU2NhbGU6IENPTE9SX1NDQUxFXG4gICAgICAgIH0sXG4gICAgICAgIHN0YWNrOiB7XG4gICAgICAgICAgICBjb2xvclNjYWxlOiBDT0xPUl9TQ0FMRVxuICAgICAgICB9LFxuICAgICAgICB2b3Jvbm9pOiB7XG4gICAgICAgICAgICBjb2xvclNjYWxlOiBDT0xPUl9TQ0FMRVxuICAgICAgICB9XG4gICAgfTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb2xvci10aGVtZS5qcy5tYXAiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCBjaGFydF9jb2xvcl9ibHVlXzEwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmx1ZV8xMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsdWVfMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibHVlXzIwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmx1ZV8zMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsdWVfMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ibHVlXzQwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmx1ZV80MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsdWVfNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibHVlXzUwMCc7XG5pbXBvcnQgeyBDb2xvclRoZW1lIH0gZnJvbSAnLi4vY29sb3ItdGhlbWUnO1xuLy8gQ29sb3Igc2NhbGVcbi8vIFNlZSBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFjdzEwcEpGWFdydUIxU0E4VFF3aXR1eG41U3M2S3B4WVBDT1lHckg4cUFZL2VkaXRcbmNvbnN0IENPTE9SX1NDQUxFID0gW1xuICAgIGNoYXJ0X2NvbG9yX2JsdWVfMzAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsdWVfMTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsdWVfNTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsdWVfMjAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsdWVfNDAwLnZhbHVlXG5dO1xuZXhwb3J0IGNvbnN0IERhcmtCbHVlQ29sb3JUaGVtZSA9IENvbG9yVGhlbWUoe1xuICAgIENPTE9SX1NDQUxFXG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJsdWUtY29sb3ItdGhlbWUuanMubWFwIiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2NvbG9yX2N5YW5fMTAwID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNvbG9yLWN5YW4tMTAwXCIsXG4gIFwidmFsdWVcIjogXCIjYTJkOWQ5XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3ItY3lhbi0xMDApXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9jb2xvcl9jeWFuXzEwMDsiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfY3lhbl8yMDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3ItY3lhbi0yMDBcIixcbiAgXCJ2YWx1ZVwiOiBcIiM3M2M1YzVcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1jb2xvci1jeWFuLTIwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX2N5YW5fMjAwOyIsImV4cG9ydCBjb25zdCBjaGFydF9jb2xvcl9jeWFuXzMwMCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1jb2xvci1jeWFuLTMwMFwiLFxuICBcInZhbHVlXCI6IFwiIzAwOTU5NlwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNvbG9yLWN5YW4tMzAwKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfY29sb3JfY3lhbl8zMDA7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2NvbG9yX2N5YW5fNDAwID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNvbG9yLWN5YW4tNDAwXCIsXG4gIFwidmFsdWVcIjogXCIjMDA1ZjYwXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3ItY3lhbi00MDApXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9jb2xvcl9jeWFuXzQwMDsiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfY3lhbl81MDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3ItY3lhbi01MDBcIixcbiAgXCJ2YWx1ZVwiOiBcIiMwMDM3MzdcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1jb2xvci1jeWFuLTUwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX2N5YW5fNTAwOyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2N5YW5fMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9jeWFuXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfY3lhbl8yMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2N5YW5fMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9jeWFuXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfY3lhbl8zMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2N5YW5fNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9jeWFuXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfY3lhbl81MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2N5YW5fNTAwJztcbmltcG9ydCB7IENvbG9yVGhlbWUgfSBmcm9tICcuLi9jb2xvci10aGVtZSc7XG4vLyBDb2xvciBzY2FsZVxuLy8gU2VlIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMWN3MTBwSkZYV3J1QjFTQThUUXdpdHV4bjVTczZLcHhZUENPWUdySDhxQVkvZWRpdFxuY29uc3QgQ09MT1JfU0NBTEUgPSBbXG4gICAgY2hhcnRfY29sb3JfY3lhbl8zMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfY3lhbl8xMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfY3lhbl81MDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfY3lhbl8yMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfY3lhbl80MDAudmFsdWVcbl07XG5leHBvcnQgY29uc3QgRGFya0N5YW5Db2xvclRoZW1lID0gQ29sb3JUaGVtZSh7XG4gICAgQ09MT1JfU0NBTEVcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3lhbi1jb2xvci10aGVtZS5qcy5tYXAiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfZ29sZF8xMDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3ItZ29sZC0xMDBcIixcbiAgXCJ2YWx1ZVwiOiBcIiNmOWUwYTJcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1jb2xvci1nb2xkLTEwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX2dvbGRfMTAwOyIsImV4cG9ydCBjb25zdCBjaGFydF9jb2xvcl9nb2xkXzIwMCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1jb2xvci1nb2xkLTIwMFwiLFxuICBcInZhbHVlXCI6IFwiI2Y2ZDE3M1wiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNvbG9yLWdvbGQtMjAwKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfY29sb3JfZ29sZF8yMDA7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2NvbG9yX2dvbGRfMzAwID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNvbG9yLWdvbGQtMzAwXCIsXG4gIFwidmFsdWVcIjogXCIjZjRjMTQ1XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3ItZ29sZC0zMDApXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9jb2xvcl9nb2xkXzMwMDsiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfZ29sZF80MDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3ItZ29sZC00MDBcIixcbiAgXCJ2YWx1ZVwiOiBcIiNmMGFiMDBcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1jb2xvci1nb2xkLTQwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX2dvbGRfNDAwOyIsImV4cG9ydCBjb25zdCBjaGFydF9jb2xvcl9nb2xkXzUwMCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1jb2xvci1nb2xkLTUwMFwiLFxuICBcInZhbHVlXCI6IFwiI2M1OGMwMFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNvbG9yLWdvbGQtNTAwKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfY29sb3JfZ29sZF81MDA7IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgY2hhcnRfY29sb3JfZ29sZF8xMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dvbGRfMTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9nb2xkXzIwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ29sZF8yMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dvbGRfMzAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9nb2xkXzMwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ29sZF80MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dvbGRfNDAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9nb2xkXzUwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ29sZF81MDAnO1xuaW1wb3J0IHsgQ29sb3JUaGVtZSB9IGZyb20gJy4uL2NvbG9yLXRoZW1lJztcbi8vIENvbG9yIHNjYWxlXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xY3cxMHBKRlhXcnVCMVNBOFRRd2l0dXhuNVNzNktweFlQQ09ZR3JIOHFBWS9lZGl0XG5jb25zdCBDT0xPUl9TQ0FMRSA9IFtcbiAgICBjaGFydF9jb2xvcl9nb2xkXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzQwMC52YWx1ZVxuXTtcbmV4cG9ydCBjb25zdCBEYXJrR29sZENvbG9yVGhlbWUgPSBDb2xvclRoZW1lKHtcbiAgICBDT0xPUl9TQ0FMRVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nb2xkLWNvbG9yLXRoZW1lLmpzLm1hcCIsImV4cG9ydCBjb25zdCBjaGFydF9jb2xvcl9ibGFja18xMDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3ItYmxhY2stMTAwXCIsXG4gIFwidmFsdWVcIjogXCIjZjBmMGYwXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3ItYmxhY2stMTAwKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfY29sb3JfYmxhY2tfMTAwOyIsImV4cG9ydCBjb25zdCBjaGFydF9jb2xvcl9ibGFja18yMDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3ItYmxhY2stMjAwXCIsXG4gIFwidmFsdWVcIjogXCIjZDJkMmQyXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3ItYmxhY2stMjAwKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfY29sb3JfYmxhY2tfMjAwOyIsImV4cG9ydCBjb25zdCBjaGFydF9jb2xvcl9ibGFja18zMDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3ItYmxhY2stMzAwXCIsXG4gIFwidmFsdWVcIjogXCIjYjhiYmJlXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3ItYmxhY2stMzAwKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfY29sb3JfYmxhY2tfMzAwOyIsImV4cG9ydCBjb25zdCBjaGFydF9jb2xvcl9ibGFja180MDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3ItYmxhY2stNDAwXCIsXG4gIFwidmFsdWVcIjogXCIjOGE4ZDkwXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3ItYmxhY2stNDAwKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfY29sb3JfYmxhY2tfNDAwOyIsImV4cG9ydCBjb25zdCBjaGFydF9jb2xvcl9ibGFja181MDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3ItYmxhY2stNTAwXCIsXG4gIFwidmFsdWVcIjogXCIjNmE2ZTczXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3ItYmxhY2stNTAwKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfY29sb3JfYmxhY2tfNTAwOyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsYWNrXzEwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmxhY2tfMTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ibGFja18yMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsYWNrXzIwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmxhY2tfMzAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibGFja18zMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsYWNrXzQwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmxhY2tfNDAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ibGFja181MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsYWNrXzUwMCc7XG5pbXBvcnQgeyBDb2xvclRoZW1lIH0gZnJvbSAnLi4vY29sb3ItdGhlbWUnO1xuLy8gQ29sb3Igc2NhbGVcbi8vIFNlZSBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFjdzEwcEpGWFdydUIxU0E4VFF3aXR1eG41U3M2S3B4WVBDT1lHckg4cUFZL2VkaXRcbmNvbnN0IENPTE9SX1NDQUxFID0gW1xuICAgIGNoYXJ0X2NvbG9yX2JsYWNrXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibGFja18xMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfYmxhY2tfNTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsYWNrXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibGFja180MDAudmFsdWVcbl07XG5leHBvcnQgY29uc3QgRGFya0dyYXlDb2xvclRoZW1lID0gQ29sb3JUaGVtZSh7XG4gICAgQ09MT1JfU0NBTEVcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z3JheS1jb2xvci10aGVtZS5qcy5tYXAiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfZ3JlZW5fMTAwID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNvbG9yLWdyZWVuLTEwMFwiLFxuICBcInZhbHVlXCI6IFwiI2JkZTJiOVwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNvbG9yLWdyZWVuLTEwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX2dyZWVuXzEwMDsiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfZ3JlZW5fMjAwID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNvbG9yLWdyZWVuLTIwMFwiLFxuICBcInZhbHVlXCI6IFwiIzdjYzY3NFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNvbG9yLWdyZWVuLTIwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX2dyZWVuXzIwMDsiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfZ3JlZW5fMzAwID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNvbG9yLWdyZWVuLTMwMFwiLFxuICBcInZhbHVlXCI6IFwiIzRjYjE0MFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNvbG9yLWdyZWVuLTMwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX2dyZWVuXzMwMDsiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfZ3JlZW5fNDAwID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNvbG9yLWdyZWVuLTQwMFwiLFxuICBcInZhbHVlXCI6IFwiIzM4ODEyZlwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNvbG9yLWdyZWVuLTQwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX2dyZWVuXzQwMDsiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfZ3JlZW5fNTAwID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNvbG9yLWdyZWVuLTUwMFwiLFxuICBcInZhbHVlXCI6IFwiIzIzNTExZVwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNvbG9yLWdyZWVuLTUwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX2dyZWVuXzUwMDsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCBjaGFydF9jb2xvcl9ncmVlbl8xMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dyZWVuXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ3JlZW5fMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ncmVlbl8yMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dyZWVuXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ3JlZW5fMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ncmVlbl80MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dyZWVuXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ3JlZW5fNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ncmVlbl81MDAnO1xuaW1wb3J0IHsgQ29sb3JUaGVtZSB9IGZyb20gJy4uL2NvbG9yLXRoZW1lJztcbi8vIENvbG9yIHNjYWxlXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xY3cxMHBKRlhXcnVCMVNBOFRRd2l0dXhuNVNzNktweFlQQ09ZR3JIOHFBWS9lZGl0XG5jb25zdCBDT0xPUl9TQ0FMRSA9IFtcbiAgICBjaGFydF9jb2xvcl9ncmVlbl8zMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfZ3JlZW5fMTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2dyZWVuXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl8yMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfZ3JlZW5fNDAwLnZhbHVlXG5dO1xuZXhwb3J0IGNvbnN0IERhcmtHcmVlbkNvbG9yVGhlbWUgPSBDb2xvclRoZW1lKHtcbiAgICBDT0xPUl9TQ0FMRVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncmVlbi1jb2xvci10aGVtZS5qcy5tYXAiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3Jfb3JhbmdlXzEwMCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1jb2xvci1vcmFuZ2UtMTAwXCIsXG4gIFwidmFsdWVcIjogXCIjZjRiNjc4XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3Itb3JhbmdlLTEwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX29yYW5nZV8xMDA7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2NvbG9yX29yYW5nZV8yMDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3Itb3JhbmdlLTIwMFwiLFxuICBcInZhbHVlXCI6IFwiI2VmOTIzNFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNvbG9yLW9yYW5nZS0yMDApXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9jb2xvcl9vcmFuZ2VfMjAwOyIsImV4cG9ydCBjb25zdCBjaGFydF9jb2xvcl9vcmFuZ2VfMzAwID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNvbG9yLW9yYW5nZS0zMDBcIixcbiAgXCJ2YWx1ZVwiOiBcIiNlYzdhMDhcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1jb2xvci1vcmFuZ2UtMzAwKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfY29sb3Jfb3JhbmdlXzMwMDsiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3Jfb3JhbmdlXzQwMCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1jb2xvci1vcmFuZ2UtNDAwXCIsXG4gIFwidmFsdWVcIjogXCIjYzQ2MTAwXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3Itb3JhbmdlLTQwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX29yYW5nZV80MDA7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2NvbG9yX29yYW5nZV81MDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3Itb3JhbmdlLTUwMFwiLFxuICBcInZhbHVlXCI6IFwiIzhmNDcwMFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNvbG9yLW9yYW5nZS01MDApXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9jb2xvcl9vcmFuZ2VfNTAwOyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsdWVfMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibHVlXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmx1ZV8yMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsdWVfMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ibHVlXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmx1ZV8zMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsdWVfNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibHVlXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmx1ZV81MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsdWVfNTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ncmVlbl8xMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dyZWVuXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ3JlZW5fMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ncmVlbl8yMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dyZWVuXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ3JlZW5fMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ncmVlbl80MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dyZWVuXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ3JlZW5fNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ncmVlbl81MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2N5YW5fMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9jeWFuXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfY3lhbl8yMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2N5YW5fMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9jeWFuXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfY3lhbl8zMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2N5YW5fNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9jeWFuXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfY3lhbl81MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2N5YW5fNTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9nb2xkXzEwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ29sZF8xMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dvbGRfMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9nb2xkXzIwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ29sZF8zMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dvbGRfMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9nb2xkXzQwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ29sZF80MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dvbGRfNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9nb2xkXzUwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzEwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzIwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzIwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzMwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzQwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzUwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzUwMCc7XG5pbXBvcnQgeyBDb2xvclRoZW1lIH0gZnJvbSAnLi4vY29sb3ItdGhlbWUnO1xuLy8gVGhlIGNvbG9yIG9yZGVyIGJlbG93IChtaW51cyB0aGUgcHVycGxlIGNvbG9yIGZhbWlseSkgaW1wcm92ZXMgdGhlIGNvbG9yIGNvbnRyYXN0IGluIG9yZGVyZWQgY2hhcnRzOyBkb251dCwgcGllLCBiYXIsICYgc3RhY2tcbi8vIFNlZSBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFjdzEwcEpGWFdydUIxU0E4VFF3aXR1eG41U3M2S3B4WVBDT1lHckg4cUFZL2VkaXRcbmNvbnN0IENPTE9SX1NDQUxFID0gW1xuICAgIGNoYXJ0X2NvbG9yX2JsdWVfMzAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2dyZWVuXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9jeWFuXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfMzAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsdWVfMTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2dyZWVuXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9jeWFuXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfNTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsdWVfNTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2dyZWVuXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9jeWFuXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfMTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsdWVfMjAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2dyZWVuXzQwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9jeWFuXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfNDAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsdWVfNDAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2dyZWVuXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9jeWFuXzQwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzQwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfMjAwLnZhbHVlXG5dO1xuZXhwb3J0IGNvbnN0IERhcmtNdWx0aUNvbG9yT3JkZXJlZFRoZW1lID0gQ29sb3JUaGVtZSh7XG4gICAgQ09MT1JfU0NBTEVcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bXVsdGktY29sb3Itb3JkZXJlZC10aGVtZS5qcy5tYXAiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfcHVycGxlXzEwMCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1jb2xvci1wdXJwbGUtMTAwXCIsXG4gIFwidmFsdWVcIjogXCIjYjJiMGVhXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3ItcHVycGxlLTEwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX3B1cnBsZV8xMDA7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2NvbG9yX3B1cnBsZV8yMDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3ItcHVycGxlLTIwMFwiLFxuICBcInZhbHVlXCI6IFwiIzg0ODFkZFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNvbG9yLXB1cnBsZS0yMDApXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9jb2xvcl9wdXJwbGVfMjAwOyIsImV4cG9ydCBjb25zdCBjaGFydF9jb2xvcl9wdXJwbGVfMzAwID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNvbG9yLXB1cnBsZS0zMDBcIixcbiAgXCJ2YWx1ZVwiOiBcIiM1NzUyZDFcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1jb2xvci1wdXJwbGUtMzAwKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfY29sb3JfcHVycGxlXzMwMDsiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfcHVycGxlXzQwMCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1jb2xvci1wdXJwbGUtNDAwXCIsXG4gIFwidmFsdWVcIjogXCIjM2MzZDk5XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3ItcHVycGxlLTQwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX3B1cnBsZV80MDA7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2NvbG9yX3B1cnBsZV81MDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3ItcHVycGxlLTUwMFwiLFxuICBcInZhbHVlXCI6IFwiIzJhMjY1ZlwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNvbG9yLXB1cnBsZS01MDApXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9jb2xvcl9wdXJwbGVfNTAwOyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsdWVfMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibHVlXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmx1ZV8yMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsdWVfMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ibHVlXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmx1ZV8zMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsdWVfNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibHVlXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmx1ZV81MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsdWVfNTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ncmVlbl8xMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dyZWVuXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ3JlZW5fMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ncmVlbl8yMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dyZWVuXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ3JlZW5fMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ncmVlbl80MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dyZWVuXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ3JlZW5fNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ncmVlbl81MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2N5YW5fMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9jeWFuXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfY3lhbl8yMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2N5YW5fMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9jeWFuXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfY3lhbl8zMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2N5YW5fNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9jeWFuXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfY3lhbl81MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2N5YW5fNTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfMTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfMzAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfNDAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfNTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9nb2xkXzEwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ29sZF8xMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dvbGRfMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9nb2xkXzIwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ29sZF8zMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dvbGRfMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9nb2xkXzQwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ29sZF80MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dvbGRfNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9nb2xkXzUwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzEwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzIwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzIwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzMwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzQwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzUwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzUwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmxhY2tfMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibGFja18xMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsYWNrXzIwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmxhY2tfMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ibGFja18zMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsYWNrXzMwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmxhY2tfNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibGFja180MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsYWNrXzUwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmxhY2tfNTAwJztcbmltcG9ydCB7IENvbG9yVGhlbWUgfSBmcm9tICcuLi9jb2xvci10aGVtZSc7XG4vLyBUaGUgY29sb3Igb3JkZXIgYmVsb3cgaW1wcm92ZXMgdGhlIGNvbG9yIGNvbnRyYXN0IGluIHVub3JkZXJlZCBjaGFydHM7IGFyZWEgJiBsaW5lXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3BhdHRlcm5mbHkvcGF0dGVybmZseS1uZXh0L2lzc3Vlcy8xNTUxXG5jb25zdCBDT0xPUl9TQ0FMRSA9IFtcbiAgICBjaGFydF9jb2xvcl9ibHVlXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl8zMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfcHVycGxlXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfMzAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2N5YW5fMzAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsYWNrXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibHVlXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl8xMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfcHVycGxlXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfMTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2N5YW5fNTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsYWNrXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibHVlXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl81MDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfcHVycGxlXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfNTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2N5YW5fMTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsYWNrXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibHVlXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzQwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl8yMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfcHVycGxlXzQwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfMjAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2N5YW5fNDAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsYWNrXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibHVlXzQwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl80MDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfcHVycGxlXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfNDAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2N5YW5fMjAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsYWNrXzQwMC52YWx1ZVxuXTtcbmV4cG9ydCBjb25zdCBEYXJrTXVsdGlDb2xvclVub3JkZXJlZFRoZW1lID0gQ29sb3JUaGVtZSh7XG4gICAgQ09MT1JfU0NBTEVcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bXVsdGktY29sb3ItdW5vcmRlcmVkLXRoZW1lLmpzLm1hcCIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IGNoYXJ0X2NvbG9yX29yYW5nZV8xMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV8xMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX29yYW5nZV8yMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV8yMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX29yYW5nZV8zMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV8zMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX29yYW5nZV80MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV80MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX29yYW5nZV81MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV81MDAnO1xuaW1wb3J0IHsgQ29sb3JUaGVtZSB9IGZyb20gJy4uL2NvbG9yLXRoZW1lJztcbi8vIENvbG9yIHNjYWxlXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xY3cxMHBKRlhXcnVCMVNBOFRRd2l0dXhuNVNzNktweFlQQ09ZR3JIOHFBWS9lZGl0XG5jb25zdCBDT0xPUl9TQ0FMRSA9IFtcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfMzAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX29yYW5nZV8xMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3Jfb3JhbmdlXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfMjAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX29yYW5nZV80MDAudmFsdWVcbl07XG5leHBvcnQgY29uc3QgRGFya09yYW5nZUNvbG9yVGhlbWUgPSBDb2xvclRoZW1lKHtcbiAgICBDT0xPUl9TQ0FMRVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcmFuZ2UtY29sb3ItdGhlbWUuanMubWFwIiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgY2hhcnRfY29sb3JfcHVycGxlXzEwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfcHVycGxlXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfcHVycGxlXzIwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfcHVycGxlXzIwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfcHVycGxlXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfcHVycGxlXzMwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfcHVycGxlXzQwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfcHVycGxlXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfcHVycGxlXzUwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfcHVycGxlXzUwMCc7XG5pbXBvcnQgeyBDb2xvclRoZW1lIH0gZnJvbSAnLi4vY29sb3ItdGhlbWUnO1xuLy8gQ29sb3Igc2NhbGVcbi8vIFNlZSBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFjdzEwcEpGWFdydUIxU0E4VFF3aXR1eG41U3M2S3B4WVBDT1lHckg4cUFZL2VkaXRcbmNvbnN0IENPTE9SX1NDQUxFID0gW1xuICAgIGNoYXJ0X2NvbG9yX3B1cnBsZV8zMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfcHVycGxlXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9wdXJwbGVfNTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX3B1cnBsZV8yMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfcHVycGxlXzQwMC52YWx1ZVxuXTtcbmV4cG9ydCBjb25zdCBEYXJrUHVycGxlQ29sb3JUaGVtZSA9IENvbG9yVGhlbWUoe1xuICAgIENPTE9SX1NDQUxFXG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXB1cnBsZS1jb2xvci10aGVtZS5qcy5tYXAiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCBjaGFydF9jb2xvcl9ibHVlXzEwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmx1ZV8xMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsdWVfMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibHVlXzIwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmx1ZV8zMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsdWVfMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ibHVlXzQwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmx1ZV80MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsdWVfNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibHVlXzUwMCc7XG5pbXBvcnQgeyBDb2xvclRoZW1lIH0gZnJvbSAnLi4vY29sb3ItdGhlbWUnO1xuLy8gQ29sb3Igc2NhbGVcbi8vIFNlZSBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFjdzEwcEpGWFdydUIxU0E4VFF3aXR1eG41U3M2S3B4WVBDT1lHckg4cUFZL2VkaXRcbmNvbnN0IENPTE9SX1NDQUxFID0gW1xuICAgIGNoYXJ0X2NvbG9yX2JsdWVfMzAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsdWVfMTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsdWVfNTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsdWVfMjAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsdWVfNDAwLnZhbHVlXG5dO1xuZXhwb3J0IGNvbnN0IExpZ2h0Qmx1ZUNvbG9yVGhlbWUgPSBDb2xvclRoZW1lKHtcbiAgICBDT0xPUl9TQ0FMRVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ibHVlLWNvbG9yLXRoZW1lLmpzLm1hcCIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2N5YW5fMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9jeWFuXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfY3lhbl8yMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2N5YW5fMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9jeWFuXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfY3lhbl8zMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2N5YW5fNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9jeWFuXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfY3lhbl81MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2N5YW5fNTAwJztcbmltcG9ydCB7IENvbG9yVGhlbWUgfSBmcm9tICcuLi9jb2xvci10aGVtZSc7XG4vLyBDb2xvciBzY2FsZVxuLy8gU2VlIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMWN3MTBwSkZYV3J1QjFTQThUUXdpdHV4bjVTczZLcHhZUENPWUdySDhxQVkvZWRpdFxuY29uc3QgQ09MT1JfU0NBTEUgPSBbXG4gICAgY2hhcnRfY29sb3JfY3lhbl8zMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfY3lhbl8xMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfY3lhbl81MDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfY3lhbl8yMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfY3lhbl80MDAudmFsdWVcbl07XG5leHBvcnQgY29uc3QgTGlnaHRDeWFuQ29sb3JUaGVtZSA9IENvbG9yVGhlbWUoe1xuICAgIENPTE9SX1NDQUxFXG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWN5YW4tY29sb3ItdGhlbWUuanMubWFwIiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgY2hhcnRfY29sb3JfZ29sZF8xMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dvbGRfMTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9nb2xkXzIwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ29sZF8yMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dvbGRfMzAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9nb2xkXzMwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ29sZF80MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dvbGRfNDAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9nb2xkXzUwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ29sZF81MDAnO1xuaW1wb3J0IHsgQ29sb3JUaGVtZSB9IGZyb20gJy4uL2NvbG9yLXRoZW1lJztcbi8vIENvbG9yIHNjYWxlXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xY3cxMHBKRlhXcnVCMVNBOFRRd2l0dXhuNVNzNktweFlQQ09ZR3JIOHFBWS9lZGl0XG5jb25zdCBDT0xPUl9TQ0FMRSA9IFtcbiAgICBjaGFydF9jb2xvcl9nb2xkXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzQwMC52YWx1ZVxuXTtcbmV4cG9ydCBjb25zdCBMaWdodEdvbGRDb2xvclRoZW1lID0gQ29sb3JUaGVtZSh7XG4gICAgQ09MT1JfU0NBTEVcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z29sZC1jb2xvci10aGVtZS5qcy5tYXAiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCBjaGFydF9jb2xvcl9ibGFja18xMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsYWNrXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmxhY2tfMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibGFja18yMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsYWNrXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmxhY2tfMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ibGFja180MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsYWNrXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmxhY2tfNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibGFja181MDAnO1xuaW1wb3J0IHsgQ29sb3JUaGVtZSB9IGZyb20gJy4uL2NvbG9yLXRoZW1lJztcbi8vIENvbG9yIHNjYWxlXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xY3cxMHBKRlhXcnVCMVNBOFRRd2l0dXhuNVNzNktweFlQQ09ZR3JIOHFBWS9lZGl0XG5jb25zdCBDT0xPUl9TQ0FMRSA9IFtcbiAgICBjaGFydF9jb2xvcl9ibGFja18zMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfYmxhY2tfMTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsYWNrXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibGFja18yMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfYmxhY2tfNDAwLnZhbHVlXG5dO1xuZXhwb3J0IGNvbnN0IExpZ2h0R3JheUNvbG9yVGhlbWUgPSBDb2xvclRoZW1lKHtcbiAgICBDT0xPUl9TQ0FMRVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncmF5LWNvbG9yLXRoZW1lLmpzLm1hcCIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dyZWVuXzEwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ3JlZW5fMTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ncmVlbl8yMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dyZWVuXzIwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ3JlZW5fMzAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ncmVlbl8zMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dyZWVuXzQwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ3JlZW5fNDAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ncmVlbl81MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dyZWVuXzUwMCc7XG5pbXBvcnQgeyBDb2xvclRoZW1lIH0gZnJvbSAnLi4vY29sb3ItdGhlbWUnO1xuLy8gQ29sb3Igc2NhbGVcbi8vIFNlZSBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFjdzEwcEpGWFdydUIxU0E4VFF3aXR1eG41U3M2S3B4WVBDT1lHckg4cUFZL2VkaXRcbmNvbnN0IENPTE9SX1NDQUxFID0gW1xuICAgIGNoYXJ0X2NvbG9yX2dyZWVuXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl8xMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfZ3JlZW5fNTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2dyZWVuXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl80MDAudmFsdWVcbl07XG5leHBvcnQgY29uc3QgTGlnaHRHcmVlbkNvbG9yVGhlbWUgPSBDb2xvclRoZW1lKHtcbiAgICBDT0xPUl9TQ0FMRVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncmVlbi1jb2xvci10aGVtZS5qcy5tYXAiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCBjaGFydF9jb2xvcl9ibHVlXzEwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmx1ZV8xMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsdWVfMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibHVlXzIwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmx1ZV8zMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsdWVfMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ibHVlXzQwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmx1ZV80MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsdWVfNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibHVlXzUwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ3JlZW5fMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ncmVlbl8xMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dyZWVuXzIwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ3JlZW5fMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ncmVlbl8zMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dyZWVuXzMwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ3JlZW5fNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ncmVlbl80MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dyZWVuXzUwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ3JlZW5fNTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9jeWFuXzEwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfY3lhbl8xMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2N5YW5fMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9jeWFuXzIwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfY3lhbl8zMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2N5YW5fMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9jeWFuXzQwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfY3lhbl80MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2N5YW5fNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9jeWFuXzUwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ29sZF8xMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dvbGRfMTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9nb2xkXzIwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ29sZF8yMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dvbGRfMzAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9nb2xkXzMwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ29sZF80MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dvbGRfNDAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9nb2xkXzUwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ29sZF81MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX29yYW5nZV8xMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV8xMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX29yYW5nZV8yMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV8yMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX29yYW5nZV8zMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV8zMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX29yYW5nZV80MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV80MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX29yYW5nZV81MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX29yYW5nZV81MDAnO1xuaW1wb3J0IHsgQ29sb3JUaGVtZSB9IGZyb20gJy4uL2NvbG9yLXRoZW1lJztcbi8vIFRoZSBjb2xvciBvcmRlciBiZWxvdyAobWludXMgdGhlIHB1cnBsZSBjb2xvciBmYW1pbHkpIGltcHJvdmVzIHRoZSBjb2xvciBjb250cmFzdCBpbiBvcmRlcmVkIGNoYXJ0czsgZG9udXQsIHBpZSwgYmFyLCAmIHN0YWNrXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xY3cxMHBKRlhXcnVCMVNBOFRRd2l0dXhuNVNzNktweFlQQ09ZR3JIOHFBWS9lZGl0XG5jb25zdCBDT0xPUl9TQ0FMRSA9IFtcbiAgICBjaGFydF9jb2xvcl9ibHVlXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl8zMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfY3lhbl8zMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfZ29sZF8zMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3Jfb3JhbmdlXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibHVlXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl81MDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfY3lhbl8xMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfZ29sZF8xMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3Jfb3JhbmdlXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibHVlXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl8xMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfY3lhbl81MDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfZ29sZF81MDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3Jfb3JhbmdlXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibHVlXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl80MDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfY3lhbl8yMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfZ29sZF8yMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3Jfb3JhbmdlXzQwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibHVlXzQwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl8yMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfY3lhbl80MDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfZ29sZF80MDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3Jfb3JhbmdlXzIwMC52YWx1ZVxuXTtcbmV4cG9ydCBjb25zdCBMaWdodE11bHRpQ29sb3JPcmRlcmVkVGhlbWUgPSBDb2xvclRoZW1lKHtcbiAgICBDT0xPUl9TQ0FMRVxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tdWx0aS1jb2xvci1vcmRlcmVkLXRoZW1lLmpzLm1hcCIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsdWVfMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibHVlXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmx1ZV8yMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsdWVfMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ibHVlXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmx1ZV8zMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsdWVfNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibHVlXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmx1ZV81MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsdWVfNTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ncmVlbl8xMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dyZWVuXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ3JlZW5fMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ncmVlbl8yMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dyZWVuXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ3JlZW5fMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ncmVlbl80MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dyZWVuXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ3JlZW5fNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ncmVlbl81MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2N5YW5fMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9jeWFuXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfY3lhbl8yMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2N5YW5fMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9jeWFuXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfY3lhbl8zMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2N5YW5fNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9jeWFuXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfY3lhbl81MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2N5YW5fNTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfMTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfMzAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfNDAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfNTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9nb2xkXzEwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ29sZF8xMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dvbGRfMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9nb2xkXzIwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfZ29sZF8zMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2dvbGRfMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9nb2xkXzQwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfZ29sZF80MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2dvbGRfNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9nb2xkXzUwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzEwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzIwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzIwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzMwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzQwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3Jfb3JhbmdlXzUwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3Jfb3JhbmdlXzUwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmxhY2tfMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibGFja18xMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsYWNrXzIwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmxhY2tfMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ibGFja18zMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsYWNrXzMwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmxhY2tfNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibGFja180MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsYWNrXzUwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmxhY2tfNTAwJztcbmltcG9ydCB7IENvbG9yVGhlbWUgfSBmcm9tICcuLi9jb2xvci10aGVtZSc7XG4vLyBUaGUgY29sb3Igb3JkZXIgYmVsb3cgaW1wcm92ZXMgdGhlIGNvbG9yIGNvbnRyYXN0IGluIHVub3JkZXJlZCBjaGFydHM7IGFyZWEgJiBsaW5lXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3BhdHRlcm5mbHkvcGF0dGVybmZseS1uZXh0L2lzc3Vlcy8xNTUxXG5jb25zdCBDT0xPUl9TQ0FMRSA9IFtcbiAgICBjaGFydF9jb2xvcl9ibHVlXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl8zMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfcHVycGxlXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfMzAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2N5YW5fMzAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsYWNrXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibHVlXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl8xMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfcHVycGxlXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfMTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2N5YW5fNTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsYWNrXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibHVlXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl81MDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfcHVycGxlXzEwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfNTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2N5YW5fMTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsYWNrXzUwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibHVlXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzQwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl8yMDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfcHVycGxlXzQwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfMjAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2N5YW5fNDAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsYWNrXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ibHVlXzQwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9nb2xkXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9ncmVlbl80MDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfcHVycGxlXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfNDAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2N5YW5fMjAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX2JsYWNrXzQwMC52YWx1ZVxuXTtcbmV4cG9ydCBjb25zdCBMaWdodE11bHRpQ29sb3JVbm9yZGVyZWRUaGVtZSA9IENvbG9yVGhlbWUoe1xuICAgIENPTE9SX1NDQUxFXG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW11bHRpLWNvbG9yLXVub3JkZXJlZC10aGVtZS5qcy5tYXAiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCBjaGFydF9jb2xvcl9vcmFuZ2VfMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9vcmFuZ2VfMTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9vcmFuZ2VfMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9vcmFuZ2VfMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9vcmFuZ2VfMzAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9vcmFuZ2VfMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9vcmFuZ2VfNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9vcmFuZ2VfNDAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9vcmFuZ2VfNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9vcmFuZ2VfNTAwJztcbmltcG9ydCB7IENvbG9yVGhlbWUgfSBmcm9tICcuLi9jb2xvci10aGVtZSc7XG4vLyBDb2xvciBzY2FsZVxuLy8gU2VlIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMWN3MTBwSkZYV3J1QjFTQThUUXdpdHV4bjVTczZLcHhZUENPWUdySDhxQVkvZWRpdFxuY29uc3QgQ09MT1JfU0NBTEUgPSBbXG4gICAgY2hhcnRfY29sb3Jfb3JhbmdlXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfMTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX29yYW5nZV81MDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3Jfb3JhbmdlXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9vcmFuZ2VfNDAwLnZhbHVlXG5dO1xuZXhwb3J0IGNvbnN0IExpZ2h0T3JhbmdlQ29sb3JUaGVtZSA9IENvbG9yVGhlbWUoe1xuICAgIENPTE9SX1NDQUxFXG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9yYW5nZS1jb2xvci10aGVtZS5qcy5tYXAiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfMTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfMTAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfMjAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfMzAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfNDAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfNDAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9wdXJwbGVfNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9wdXJwbGVfNTAwJztcbmltcG9ydCB7IENvbG9yVGhlbWUgfSBmcm9tICcuLi9jb2xvci10aGVtZSc7XG4vLyBDb2xvciBzY2FsZVxuLy8gU2VlIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMWN3MTBwSkZYV3J1QjFTQThUUXdpdHV4bjVTczZLcHhZUENPWUdySDhxQVkvZWRpdFxuY29uc3QgQ09MT1JfU0NBTEUgPSBbXG4gICAgY2hhcnRfY29sb3JfcHVycGxlXzMwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9wdXJwbGVfMTAwLnZhbHVlLFxuICAgIGNoYXJ0X2NvbG9yX3B1cnBsZV81MDAudmFsdWUsXG4gICAgY2hhcnRfY29sb3JfcHVycGxlXzIwMC52YWx1ZSxcbiAgICBjaGFydF9jb2xvcl9wdXJwbGVfNDAwLnZhbHVlXG5dO1xuZXhwb3J0IGNvbnN0IExpZ2h0UHVycGxlQ29sb3JUaGVtZSA9IENvbG9yVGhlbWUoe1xuICAgIENPTE9SX1NDQUxFXG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXB1cnBsZS1jb2xvci10aGVtZS5qcy5tYXAiLCJleHBvcnQgY29uc3QgY2hhcnRfYXhpc19ncmlkX3N0cm9rZV9Db2xvciA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1heGlzLS1ncmlkLS1zdHJva2UtLUNvbG9yXCIsXG4gIFwidmFsdWVcIjogXCIjZDJkMmQyXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYXhpcy0tZ3JpZC0tc3Ryb2tlLS1Db2xvcilcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2F4aXNfZ3JpZF9zdHJva2VfQ29sb3I7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2F4aXNfdGlja19zdHJva2VfQ29sb3IgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYXhpcy0tdGljay0tc3Ryb2tlLS1Db2xvclwiLFxuICBcInZhbHVlXCI6IFwiI2QyZDJkMlwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWF4aXMtLXRpY2stLXN0cm9rZS0tQ29sb3IpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9heGlzX3RpY2tfc3Ryb2tlX0NvbG9yOyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IGNoYXJ0X2F4aXNfZ3JpZF9zdHJva2VfQ29sb3IgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2F4aXNfZ3JpZF9zdHJva2VfQ29sb3InO1xuaW1wb3J0IGNoYXJ0X2F4aXNfdGlja19zdHJva2VfQ29sb3IgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2F4aXNfdGlja19zdHJva2VfQ29sb3InO1xuLy8gQXhpcyB0aGVtZVxuZXhwb3J0IGNvbnN0IEF4aXNUaGVtZSA9IHtcbiAgICBheGlzOiB7XG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBncmlkOiB7XG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjaGFydF9heGlzX2dyaWRfc3Ryb2tlX0NvbG9yLnZhbHVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGlja3M6IHtcbiAgICAgICAgICAgICAgICBzdHJva2U6IGNoYXJ0X2F4aXNfdGlja19zdHJva2VfQ29sb3IudmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1heGlzLXRoZW1lLmpzLm1hcCIsImV4cG9ydCBjb25zdCBjaGFydF9nbG9iYWxfRm9udEZhbWlseSA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1nbG9iYWwtLUZvbnRGYW1pbHlcIixcbiAgXCJ2YWx1ZVwiOiBcIlxcXCJSZWRIYXRUZXh0XFxcIiwgXFxcIk92ZXJwYXNzXFxcIiwgb3ZlcnBhc3MsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWZcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1nbG9iYWwtLUZvbnRGYW1pbHkpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9nbG9iYWxfRm9udEZhbWlseTsiLCJleHBvcnQgY29uc3QgY2hhcnRfZ2xvYmFsX2xldHRlcl9zcGFjaW5nID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWdsb2JhbC0tbGV0dGVyLXNwYWNpbmdcIixcbiAgXCJ2YWx1ZVwiOiBcIm5vcm1hbFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWdsb2JhbC0tbGV0dGVyLXNwYWNpbmcpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9nbG9iYWxfbGV0dGVyX3NwYWNpbmc7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2dsb2JhbF9Gb250U2l6ZV9zbSA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1nbG9iYWwtLUZvbnRTaXplLS1zbVwiLFxuICBcInZhbHVlXCI6IDE0LFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWdsb2JhbC0tRm9udFNpemUtLXNtKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZ2xvYmFsX0ZvbnRTaXplX3NtOyIsImV4cG9ydCBjb25zdCBjaGFydF9nbG9iYWxfbGFiZWxfUGFkZGluZyA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1nbG9iYWwtLWxhYmVsLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogMTAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZ2xvYmFsLS1sYWJlbC0tUGFkZGluZylcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2dsb2JhbF9sYWJlbF9QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9nbG9iYWxfbGFiZWxfc3Ryb2tlID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWdsb2JhbC0tbGFiZWwtLXN0cm9rZVwiLFxuICBcInZhbHVlXCI6IFwidHJhbnNwYXJlbnRcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1nbG9iYWwtLWxhYmVsLS1zdHJva2UpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9nbG9iYWxfbGFiZWxfc3Ryb2tlOyIsImV4cG9ydCBjb25zdCBjaGFydF9nbG9iYWxfbGFiZWxfdGV4dF9hbmNob3IgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZ2xvYmFsLS1sYWJlbC0tdGV4dC1hbmNob3JcIixcbiAgXCJ2YWx1ZVwiOiBcIm1pZGRsZVwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWdsb2JhbC0tbGFiZWwtLXRleHQtYW5jaG9yKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZ2xvYmFsX2xhYmVsX3RleHRfYW5jaG9yOyIsImV4cG9ydCBjb25zdCBjaGFydF9nbG9iYWxfbGF5b3V0X1BhZGRpbmcgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZ2xvYmFsLS1sYXlvdXQtLVBhZGRpbmdcIixcbiAgXCJ2YWx1ZVwiOiA1MCxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1nbG9iYWwtLWxheW91dC0tUGFkZGluZylcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2dsb2JhbF9sYXlvdXRfUGFkZGluZzsiLCJleHBvcnQgY29uc3QgY2hhcnRfZ2xvYmFsX2xheW91dF9IZWlnaHQgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZ2xvYmFsLS1sYXlvdXQtLUhlaWdodFwiLFxuICBcInZhbHVlXCI6IDMwMCxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1nbG9iYWwtLWxheW91dC0tSGVpZ2h0KVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZ2xvYmFsX2xheW91dF9IZWlnaHQ7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2dsb2JhbF9sYXlvdXRfV2lkdGggPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZ2xvYmFsLS1sYXlvdXQtLVdpZHRoXCIsXG4gIFwidmFsdWVcIjogNDUwLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWdsb2JhbC0tbGF5b3V0LS1XaWR0aClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2dsb2JhbF9sYXlvdXRfV2lkdGg7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2dsb2JhbF9zdHJva2VfbGluZV9jYXAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZ2xvYmFsLS1zdHJva2UtbGluZS1jYXBcIixcbiAgXCJ2YWx1ZVwiOiBcInJvdW5kXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZ2xvYmFsLS1zdHJva2UtbGluZS1jYXApXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9nbG9iYWxfc3Ryb2tlX2xpbmVfY2FwOyIsImV4cG9ydCBjb25zdCBjaGFydF9nbG9iYWxfc3Ryb2tlX2xpbmVfam9pbiA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1nbG9iYWwtLXN0cm9rZS1saW5lLWpvaW5cIixcbiAgXCJ2YWx1ZVwiOiBcInJvdW5kXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZ2xvYmFsLS1zdHJva2UtbGluZS1qb2luKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZ2xvYmFsX3N0cm9rZV9saW5lX2pvaW47IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2FyZWFfZGF0YV9GaWxsID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWFyZWEtLWRhdGEtLUZpbGxcIixcbiAgXCJ2YWx1ZVwiOiBcIiMxNTE1MTVcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1hcmVhLS1kYXRhLS1GaWxsKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYXJlYV9kYXRhX0ZpbGw7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2FyZWFfT3BhY2l0eSA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1hcmVhLS1PcGFjaXR5XCIsXG4gIFwidmFsdWVcIjogMC4zLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWFyZWEtLU9wYWNpdHkpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9hcmVhX09wYWNpdHk7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2FyZWFfc3Ryb2tlX1dpZHRoID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWFyZWEtLXN0cm9rZS0tV2lkdGhcIixcbiAgXCJ2YWx1ZVwiOiAyLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWFyZWEtLXN0cm9rZS0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9hcmVhX3N0cm9rZV9XaWR0aDsiLCJleHBvcnQgY29uc3QgY2hhcnRfYXhpc19heGlzX3N0cm9rZV9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1heGlzLS1heGlzLS1zdHJva2UtLVdpZHRoXCIsXG4gIFwidmFsdWVcIjogMSxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1heGlzLS1heGlzLS1zdHJva2UtLVdpZHRoKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYXhpc19heGlzX3N0cm9rZV9XaWR0aDsiLCJleHBvcnQgY29uc3QgY2hhcnRfYXhpc19heGlzX3N0cm9rZV9Db2xvciA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1heGlzLS1heGlzLS1zdHJva2UtLUNvbG9yXCIsXG4gIFwidmFsdWVcIjogXCIjZDJkMmQyXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYXhpcy0tYXhpcy0tc3Ryb2tlLS1Db2xvcilcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2F4aXNfYXhpc19zdHJva2VfQ29sb3I7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2F4aXNfYXhpc19GaWxsID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWF4aXMtLWF4aXMtLUZpbGxcIixcbiAgXCJ2YWx1ZVwiOiBcInRyYW5zcGFyZW50XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYXhpcy0tYXhpcy0tRmlsbClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2F4aXNfYXhpc19GaWxsOyIsImV4cG9ydCBjb25zdCBjaGFydF9heGlzX2F4aXNfbGFiZWxfUGFkZGluZyA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1heGlzLS1heGlzLWxhYmVsLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogNDAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYXhpcy0tYXhpcy1sYWJlbC0tUGFkZGluZylcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2F4aXNfYXhpc19sYWJlbF9QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9heGlzX2F4aXNfbGFiZWxfc3Ryb2tlX0NvbG9yID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWF4aXMtLWF4aXMtbGFiZWwtLXN0cm9rZS0tQ29sb3JcIixcbiAgXCJ2YWx1ZVwiOiBcInRyYW5zcGFyZW50XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYXhpcy0tYXhpcy1sYWJlbC0tc3Ryb2tlLS1Db2xvcilcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2F4aXNfYXhpc19sYWJlbF9zdHJva2VfQ29sb3I7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2F4aXNfZ3JpZF9GaWxsID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWF4aXMtLWdyaWQtLUZpbGxcIixcbiAgXCJ2YWx1ZVwiOiBcIm5vbmVcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1heGlzLS1ncmlkLS1GaWxsKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYXhpc19ncmlkX0ZpbGw7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2F4aXNfZ3JpZF9Qb2ludGVyRXZlbnRzID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWF4aXMtLWdyaWQtLVBvaW50ZXJFdmVudHNcIixcbiAgXCJ2YWx1ZVwiOiBcInBhaW50ZWRcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1heGlzLS1ncmlkLS1Qb2ludGVyRXZlbnRzKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYXhpc19ncmlkX1BvaW50ZXJFdmVudHM7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2F4aXNfdGlja19GaWxsID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWF4aXMtLXRpY2stLUZpbGxcIixcbiAgXCJ2YWx1ZVwiOiBcInRyYW5zcGFyZW50XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYXhpcy0tdGljay0tRmlsbClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2F4aXNfdGlja19GaWxsOyIsImV4cG9ydCBjb25zdCBjaGFydF9heGlzX3RpY2tfU2l6ZSA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1heGlzLS10aWNrLS1TaXplXCIsXG4gIFwidmFsdWVcIjogNSxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1heGlzLS10aWNrLS1TaXplKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYXhpc190aWNrX1NpemU7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2F4aXNfdGlja19XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1heGlzLS10aWNrLS1XaWR0aFwiLFxuICBcInZhbHVlXCI6IDEsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYXhpcy0tdGljay0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9heGlzX3RpY2tfV2lkdGg7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2F4aXNfdGlja19sYWJlbF9GaWxsID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWF4aXMtLXRpY2stbGFiZWwtLUZpbGxcIixcbiAgXCJ2YWx1ZVwiOiBcIiM0ZjUyNTVcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1heGlzLS10aWNrLWxhYmVsLS1GaWxsKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYXhpc190aWNrX2xhYmVsX0ZpbGw7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2Jhcl9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1iYXItLVdpZHRoXCIsXG4gIFwidmFsdWVcIjogMTAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYmFyLS1XaWR0aClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2Jhcl9XaWR0aDsiLCJleHBvcnQgY29uc3QgY2hhcnRfYmFyX2RhdGFfc3Ryb2tlID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWJhci0tZGF0YS0tc3Ryb2tlXCIsXG4gIFwidmFsdWVcIjogXCJub25lXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYmFyLS1kYXRhLS1zdHJva2UpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9iYXJfZGF0YV9zdHJva2U7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2Jhcl9kYXRhX0ZpbGwgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYmFyLS1kYXRhLS1GaWxsXCIsXG4gIFwidmFsdWVcIjogXCIjMTUxNTE1XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYmFyLS1kYXRhLS1GaWxsKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYmFyX2RhdGFfRmlsbDsiLCJleHBvcnQgY29uc3QgY2hhcnRfYmFyX2RhdGFfUGFkZGluZyA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1iYXItLWRhdGEtLVBhZGRpbmdcIixcbiAgXCJ2YWx1ZVwiOiA4LFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWJhci0tZGF0YS0tUGFkZGluZylcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2Jhcl9kYXRhX1BhZGRpbmc7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2Jhcl9kYXRhX3N0cm9rZV9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1iYXItLWRhdGEtc3Ryb2tlLS1XaWR0aFwiLFxuICBcInZhbHVlXCI6IDAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYmFyLS1kYXRhLXN0cm9rZS0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9iYXJfZGF0YV9zdHJva2VfV2lkdGg7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2JveHBsb3RfbWF4X1BhZGRpbmcgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYm94cGxvdC0tbWF4LS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogOCxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1ib3hwbG90LS1tYXgtLVBhZGRpbmcpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9ib3hwbG90X21heF9QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9ib3hwbG90X21heF9zdHJva2VfQ29sb3IgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYm94cGxvdC0tbWF4LS1zdHJva2UtLUNvbG9yXCIsXG4gIFwidmFsdWVcIjogXCIjMTUxNTE1XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYm94cGxvdC0tbWF4LS1zdHJva2UtLUNvbG9yKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYm94cGxvdF9tYXhfc3Ryb2tlX0NvbG9yOyIsImV4cG9ydCBjb25zdCBjaGFydF9ib3hwbG90X21heF9zdHJva2VfV2lkdGggPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYm94cGxvdC0tbWF4LS1zdHJva2UtLVdpZHRoXCIsXG4gIFwidmFsdWVcIjogMSxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1ib3hwbG90LS1tYXgtLXN0cm9rZS0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9ib3hwbG90X21heF9zdHJva2VfV2lkdGg7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2JveHBsb3RfbWVkaWFuX1BhZGRpbmcgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYm94cGxvdC0tbWVkaWFuLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogOCxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1ib3hwbG90LS1tZWRpYW4tLVBhZGRpbmcpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9ib3hwbG90X21lZGlhbl9QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9ib3hwbG90X21lZGlhbl9zdHJva2VfQ29sb3IgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYm94cGxvdC0tbWVkaWFuLS1zdHJva2UtLUNvbG9yXCIsXG4gIFwidmFsdWVcIjogXCIjMTUxNTE1XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYm94cGxvdC0tbWVkaWFuLS1zdHJva2UtLUNvbG9yKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYm94cGxvdF9tZWRpYW5fc3Ryb2tlX0NvbG9yOyIsImV4cG9ydCBjb25zdCBjaGFydF9ib3hwbG90X21lZGlhbl9zdHJva2VfV2lkdGggPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYm94cGxvdC0tbWVkaWFuLS1zdHJva2UtLVdpZHRoXCIsXG4gIFwidmFsdWVcIjogMSxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1ib3hwbG90LS1tZWRpYW4tLXN0cm9rZS0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9ib3hwbG90X21lZGlhbl9zdHJva2VfV2lkdGg7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2JveHBsb3RfbWluX1BhZGRpbmcgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYm94cGxvdC0tbWluLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogOCxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1ib3hwbG90LS1taW4tLVBhZGRpbmcpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9ib3hwbG90X21pbl9QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9ib3hwbG90X21pbl9zdHJva2VfV2lkdGggPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYm94cGxvdC0tbWluLS1zdHJva2UtLVdpZHRoXCIsXG4gIFwidmFsdWVcIjogMSxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1ib3hwbG90LS1taW4tLXN0cm9rZS0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9ib3hwbG90X21pbl9zdHJva2VfV2lkdGg7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2JveHBsb3RfbWluX3N0cm9rZV9Db2xvciA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1ib3hwbG90LS1taW4tLXN0cm9rZS0tQ29sb3JcIixcbiAgXCJ2YWx1ZVwiOiBcIiMxNTE1MTVcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1ib3hwbG90LS1taW4tLXN0cm9rZS0tQ29sb3IpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9ib3hwbG90X21pbl9zdHJva2VfQ29sb3I7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2JveHBsb3RfbG93ZXJfcXVhcnRpbGVfUGFkZGluZyA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1ib3hwbG90LS1sb3dlci1xdWFydGlsZS0tUGFkZGluZ1wiLFxuICBcInZhbHVlXCI6IDgsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYm94cGxvdC0tbG93ZXItcXVhcnRpbGUtLVBhZGRpbmcpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9ib3hwbG90X2xvd2VyX3F1YXJ0aWxlX1BhZGRpbmc7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2JveHBsb3RfbG93ZXJfcXVhcnRpbGVfRmlsbCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1ib3hwbG90LS1sb3dlci1xdWFydGlsZS0tRmlsbFwiLFxuICBcInZhbHVlXCI6IFwiIzhhOGQ5MFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWJveHBsb3QtLWxvd2VyLXF1YXJ0aWxlLS1GaWxsKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYm94cGxvdF9sb3dlcl9xdWFydGlsZV9GaWxsOyIsImV4cG9ydCBjb25zdCBjaGFydF9ib3hwbG90X3VwcGVyX3F1YXJ0aWxlX1BhZGRpbmcgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYm94cGxvdC0tdXBwZXItcXVhcnRpbGUtLVBhZGRpbmdcIixcbiAgXCJ2YWx1ZVwiOiA4LFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWJveHBsb3QtLXVwcGVyLXF1YXJ0aWxlLS1QYWRkaW5nKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYm94cGxvdF91cHBlcl9xdWFydGlsZV9QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9ib3hwbG90X3VwcGVyX3F1YXJ0aWxlX0ZpbGwgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYm94cGxvdC0tdXBwZXItcXVhcnRpbGUtLUZpbGxcIixcbiAgXCJ2YWx1ZVwiOiBcIiM4YThkOTBcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1ib3hwbG90LS11cHBlci1xdWFydGlsZS0tRmlsbClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2JveHBsb3RfdXBwZXJfcXVhcnRpbGVfRmlsbDsiLCJleHBvcnQgY29uc3QgY2hhcnRfYm94cGxvdF9ib3hfV2lkdGggPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYm94cGxvdC0tYm94LS1XaWR0aFwiLFxuICBcInZhbHVlXCI6IDIwLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWJveHBsb3QtLWJveC0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9ib3hwbG90X2JveF9XaWR0aDsiLCJleHBvcnQgY29uc3QgY2hhcnRfY2FuZGVsc3RpY2tfZGF0YV9zdHJva2VfV2lkdGggPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY2FuZGVsc3RpY2stLWRhdGEtLXN0cm9rZS0tV2lkdGhcIixcbiAgXCJ2YWx1ZVwiOiAxLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNhbmRlbHN0aWNrLS1kYXRhLS1zdHJva2UtLVdpZHRoKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfY2FuZGVsc3RpY2tfZGF0YV9zdHJva2VfV2lkdGg7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2NhbmRlbHN0aWNrX2RhdGFfc3Ryb2tlX0NvbG9yID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNhbmRlbHN0aWNrLS1kYXRhLS1zdHJva2UtLUNvbG9yXCIsXG4gIFwidmFsdWVcIjogXCIjMTUxNTE1XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY2FuZGVsc3RpY2stLWRhdGEtLXN0cm9rZS0tQ29sb3IpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9jYW5kZWxzdGlja19kYXRhX3N0cm9rZV9Db2xvcjsiLCJleHBvcnQgY29uc3QgY2hhcnRfY2FuZGVsc3RpY2tfY2FuZGxlX3Bvc2l0aXZlX0NvbG9yID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNhbmRlbHN0aWNrLS1jYW5kbGUtLXBvc2l0aXZlLS1Db2xvclwiLFxuICBcInZhbHVlXCI6IFwiI2ZmZlwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNhbmRlbHN0aWNrLS1jYW5kbGUtLXBvc2l0aXZlLS1Db2xvcilcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NhbmRlbHN0aWNrX2NhbmRsZV9wb3NpdGl2ZV9Db2xvcjsiLCJleHBvcnQgY29uc3QgY2hhcnRfY2FuZGVsc3RpY2tfY2FuZGxlX25lZ2F0aXZlX0NvbG9yID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNhbmRlbHN0aWNrLS1jYW5kbGUtLW5lZ2F0aXZlLS1Db2xvclwiLFxuICBcInZhbHVlXCI6IFwiIzE1MTUxNVwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNhbmRlbHN0aWNrLS1jYW5kbGUtLW5lZ2F0aXZlLS1Db2xvcilcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NhbmRlbHN0aWNrX2NhbmRsZV9uZWdhdGl2ZV9Db2xvcjsiLCJleHBvcnQgY29uc3QgY2hhcnRfZXJyb3JiYXJfQm9yZGVyV2lkdGggPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZXJyb3JiYXItLUJvcmRlcldpZHRoXCIsXG4gIFwidmFsdWVcIjogOCxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1lcnJvcmJhci0tQm9yZGVyV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9lcnJvcmJhcl9Cb3JkZXJXaWR0aDsiLCJleHBvcnQgY29uc3QgY2hhcnRfZXJyb3JiYXJfZGF0YV9GaWxsID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWVycm9yYmFyLS1kYXRhLS1GaWxsXCIsXG4gIFwidmFsdWVcIjogXCJ0cmFuc3BhcmVudFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWVycm9yYmFyLS1kYXRhLS1GaWxsKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZXJyb3JiYXJfZGF0YV9GaWxsOyIsImV4cG9ydCBjb25zdCBjaGFydF9lcnJvcmJhcl9kYXRhX09wYWNpdHkgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZXJyb3JiYXItLWRhdGEtLU9wYWNpdHlcIixcbiAgXCJ2YWx1ZVwiOiAxLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWVycm9yYmFyLS1kYXRhLS1PcGFjaXR5KVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZXJyb3JiYXJfZGF0YV9PcGFjaXR5OyIsImV4cG9ydCBjb25zdCBjaGFydF9lcnJvcmJhcl9kYXRhX3N0cm9rZV9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1lcnJvcmJhci0tZGF0YS1zdHJva2UtLVdpZHRoXCIsXG4gIFwidmFsdWVcIjogMixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1lcnJvcmJhci0tZGF0YS1zdHJva2UtLVdpZHRoKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZXJyb3JiYXJfZGF0YV9zdHJva2VfV2lkdGg7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2Vycm9yYmFyX2RhdGFfc3Ryb2tlX0NvbG9yID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWVycm9yYmFyLS1kYXRhLXN0cm9rZS0tQ29sb3JcIixcbiAgXCJ2YWx1ZVwiOiBcIiMxNTE1MTVcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1lcnJvcmJhci0tZGF0YS1zdHJva2UtLUNvbG9yKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZXJyb3JiYXJfZGF0YV9zdHJva2VfQ29sb3I7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2xlZ2VuZF9ndXR0ZXJfV2lkdGggPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtbGVnZW5kLS1ndXR0ZXItLVdpZHRoXCIsXG4gIFwidmFsdWVcIjogMjAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtbGVnZW5kLS1ndXR0ZXItLVdpZHRoKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfbGVnZW5kX2d1dHRlcl9XaWR0aDsiLCJleHBvcnQgY29uc3QgY2hhcnRfbGVnZW5kX29yaWVudGF0aW9uID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWxlZ2VuZC0tb3JpZW50YXRpb25cIixcbiAgXCJ2YWx1ZVwiOiBcImhvcml6b250YWxcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1sZWdlbmQtLW9yaWVudGF0aW9uKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfbGVnZW5kX29yaWVudGF0aW9uOyIsImV4cG9ydCBjb25zdCBjaGFydF9sZWdlbmRfdGl0bGVfb3JpZW50YXRpb24gPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtbGVnZW5kLS10aXRsZS0tb3JpZW50YXRpb25cIixcbiAgXCJ2YWx1ZVwiOiBcInRvcFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWxlZ2VuZC0tdGl0bGUtLW9yaWVudGF0aW9uKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfbGVnZW5kX3RpdGxlX29yaWVudGF0aW9uOyIsImV4cG9ydCBjb25zdCBjaGFydF9sZWdlbmRfZGF0YV90eXBlID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWxlZ2VuZC0tZGF0YS0tdHlwZVwiLFxuICBcInZhbHVlXCI6IFwic3F1YXJlXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtbGVnZW5kLS1kYXRhLS10eXBlKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfbGVnZW5kX2RhdGFfdHlwZTsiLCJleHBvcnQgY29uc3QgY2hhcnRfbGVnZW5kX3RpdGxlX1BhZGRpbmcgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtbGVnZW5kLS10aXRsZS0tUGFkZGluZ1wiLFxuICBcInZhbHVlXCI6IDIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtbGVnZW5kLS10aXRsZS0tUGFkZGluZylcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2xlZ2VuZF90aXRsZV9QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9saW5lX2RhdGFfRmlsbCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1saW5lLS1kYXRhLS1GaWxsXCIsXG4gIFwidmFsdWVcIjogXCJ0cmFuc3BhcmVudFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWxpbmUtLWRhdGEtLUZpbGwpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9saW5lX2RhdGFfRmlsbDsiLCJleHBvcnQgY29uc3QgY2hhcnRfbGluZV9kYXRhX09wYWNpdHkgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtbGluZS0tZGF0YS0tT3BhY2l0eVwiLFxuICBcInZhbHVlXCI6IDEsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtbGluZS0tZGF0YS0tT3BhY2l0eSlcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2xpbmVfZGF0YV9PcGFjaXR5OyIsImV4cG9ydCBjb25zdCBjaGFydF9saW5lX2RhdGFfc3Ryb2tlX1dpZHRoID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWxpbmUtLWRhdGEtLXN0cm9rZS0tV2lkdGhcIixcbiAgXCJ2YWx1ZVwiOiAyLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWxpbmUtLWRhdGEtLXN0cm9rZS0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9saW5lX2RhdGFfc3Ryb2tlX1dpZHRoOyIsImV4cG9ydCBjb25zdCBjaGFydF9saW5lX2RhdGFfc3Ryb2tlX0NvbG9yID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWxpbmUtLWRhdGEtLXN0cm9rZS0tQ29sb3JcIixcbiAgXCJ2YWx1ZVwiOiBcIiMxNTE1MTVcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1saW5lLS1kYXRhLS1zdHJva2UtLUNvbG9yKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfbGluZV9kYXRhX3N0cm9rZV9Db2xvcjsiLCJleHBvcnQgY29uc3QgY2hhcnRfcGllX1BhZGRpbmcgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtcGllLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogMjAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtcGllLS1QYWRkaW5nKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfcGllX1BhZGRpbmc7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X3BpZV9kYXRhX1BhZGRpbmcgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtcGllLS1kYXRhLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogOCxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1waWUtLWRhdGEtLVBhZGRpbmcpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9waWVfZGF0YV9QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9waWVfZGF0YV9zdHJva2VfV2lkdGggPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtcGllLS1kYXRhLS1zdHJva2UtLVdpZHRoXCIsXG4gIFwidmFsdWVcIjogMSxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1waWUtLWRhdGEtLXN0cm9rZS0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9waWVfZGF0YV9zdHJva2VfV2lkdGg7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X3BpZV9kYXRhX3N0cm9rZV9Db2xvciA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1waWUtLWRhdGEtLXN0cm9rZS0tQ29sb3JcIixcbiAgXCJ2YWx1ZVwiOiBcInRyYW5zcGFyZW50XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtcGllLS1kYXRhLS1zdHJva2UtLUNvbG9yKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfcGllX2RhdGFfc3Ryb2tlX0NvbG9yOyIsImV4cG9ydCBjb25zdCBjaGFydF9waWVfbGFiZWxzX1BhZGRpbmcgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtcGllLS1sYWJlbHMtLVBhZGRpbmdcIixcbiAgXCJ2YWx1ZVwiOiA4LFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXBpZS0tbGFiZWxzLS1QYWRkaW5nKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfcGllX2xhYmVsc19QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9waWVfSGVpZ2h0ID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXBpZS0tSGVpZ2h0XCIsXG4gIFwidmFsdWVcIjogMjMwLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXBpZS0tSGVpZ2h0KVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfcGllX0hlaWdodDsiLCJleHBvcnQgY29uc3QgY2hhcnRfcGllX1dpZHRoID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXBpZS0tV2lkdGhcIixcbiAgXCJ2YWx1ZVwiOiAyMzAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtcGllLS1XaWR0aClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X3BpZV9XaWR0aDsiLCJleHBvcnQgY29uc3QgY2hhcnRfc2NhdHRlcl9kYXRhX3N0cm9rZV9Db2xvciA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1zY2F0dGVyLS1kYXRhLS1zdHJva2UtLUNvbG9yXCIsXG4gIFwidmFsdWVcIjogXCJ0cmFuc3BhcmVudFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXNjYXR0ZXItLWRhdGEtLXN0cm9rZS0tQ29sb3IpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9zY2F0dGVyX2RhdGFfc3Ryb2tlX0NvbG9yOyIsImV4cG9ydCBjb25zdCBjaGFydF9zY2F0dGVyX2RhdGFfc3Ryb2tlX1dpZHRoID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXNjYXR0ZXItLWRhdGEtLXN0cm9rZS0tV2lkdGhcIixcbiAgXCJ2YWx1ZVwiOiAwLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXNjYXR0ZXItLWRhdGEtLXN0cm9rZS0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9zY2F0dGVyX2RhdGFfc3Ryb2tlX1dpZHRoOyIsImV4cG9ydCBjb25zdCBjaGFydF9zY2F0dGVyX2RhdGFfT3BhY2l0eSA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1zY2F0dGVyLS1kYXRhLS1PcGFjaXR5XCIsXG4gIFwidmFsdWVcIjogMSxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1zY2F0dGVyLS1kYXRhLS1PcGFjaXR5KVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfc2NhdHRlcl9kYXRhX09wYWNpdHk7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X3NjYXR0ZXJfZGF0YV9GaWxsID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXNjYXR0ZXItLWRhdGEtLUZpbGxcIixcbiAgXCJ2YWx1ZVwiOiBcIiMxNTE1MTVcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1zY2F0dGVyLS1kYXRhLS1GaWxsKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfc2NhdHRlcl9kYXRhX0ZpbGw7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X3N0YWNrX2RhdGFfc3Ryb2tlX1dpZHRoID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXN0YWNrLS1kYXRhLS1zdHJva2UtLVdpZHRoXCIsXG4gIFwidmFsdWVcIjogMSxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1zdGFjay0tZGF0YS0tc3Ryb2tlLS1XaWR0aClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X3N0YWNrX2RhdGFfc3Ryb2tlX1dpZHRoOyIsImV4cG9ydCBjb25zdCBjaGFydF90b29sdGlwX2Nvcm5lcl9yYWRpdXMgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtdG9vbHRpcC0tY29ybmVyLXJhZGl1c1wiLFxuICBcInZhbHVlXCI6IDAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtdG9vbHRpcC0tY29ybmVyLXJhZGl1cylcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X3Rvb2x0aXBfY29ybmVyX3JhZGl1czsiLCJleHBvcnQgY29uc3QgY2hhcnRfdG9vbHRpcF9wb2ludGVyX2xlbmd0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC10b29sdGlwLS1wb2ludGVyLWxlbmd0aFwiLFxuICBcInZhbHVlXCI6IDEwLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXRvb2x0aXAtLXBvaW50ZXItbGVuZ3RoKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfdG9vbHRpcF9wb2ludGVyX2xlbmd0aDsiLCJleHBvcnQgY29uc3QgY2hhcnRfdG9vbHRpcF9GaWxsID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXRvb2x0aXAtLUZpbGxcIixcbiAgXCJ2YWx1ZVwiOiBcIiNmMGYwZjBcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC10b29sdGlwLS1GaWxsKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfdG9vbHRpcF9GaWxsOyIsImV4cG9ydCBjb25zdCBjaGFydF90b29sdGlwX2ZseW91dFN0eWxlX2Nvcm5lcl9yYWRpdXMgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtdG9vbHRpcC0tZmx5b3V0U3R5bGUtLWNvcm5lci1yYWRpdXNcIixcbiAgXCJ2YWx1ZVwiOiAwLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXRvb2x0aXAtLWZseW91dFN0eWxlLS1jb3JuZXItcmFkaXVzKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfdG9vbHRpcF9mbHlvdXRTdHlsZV9jb3JuZXJfcmFkaXVzOyIsImV4cG9ydCBjb25zdCBjaGFydF90b29sdGlwX2ZseW91dFN0eWxlX3N0cm9rZV9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC10b29sdGlwLS1mbHlvdXRTdHlsZS0tc3Ryb2tlLS1XaWR0aFwiLFxuICBcInZhbHVlXCI6IDAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtdG9vbHRpcC0tZmx5b3V0U3R5bGUtLXN0cm9rZS0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF90b29sdGlwX2ZseW91dFN0eWxlX3N0cm9rZV9XaWR0aDsiLCJleHBvcnQgY29uc3QgY2hhcnRfdG9vbHRpcF9mbHlvdXRTdHlsZV9Qb2ludGVyRXZlbnRzID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXRvb2x0aXAtLWZseW91dFN0eWxlLS1Qb2ludGVyRXZlbnRzXCIsXG4gIFwidmFsdWVcIjogXCJub25lXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtdG9vbHRpcC0tZmx5b3V0U3R5bGUtLVBvaW50ZXJFdmVudHMpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF90b29sdGlwX2ZseW91dFN0eWxlX1BvaW50ZXJFdmVudHM7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X3Rvb2x0aXBfZmx5b3V0U3R5bGVfc3Ryb2tlX0NvbG9yID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXRvb2x0aXAtLWZseW91dFN0eWxlLS1zdHJva2UtLUNvbG9yXCIsXG4gIFwidmFsdWVcIjogXCIjMTUxNTE1XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtdG9vbHRpcC0tZmx5b3V0U3R5bGUtLXN0cm9rZS0tQ29sb3IpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF90b29sdGlwX2ZseW91dFN0eWxlX3N0cm9rZV9Db2xvcjsiLCJleHBvcnQgY29uc3QgY2hhcnRfdG9vbHRpcF9mbHlvdXRTdHlsZV9GaWxsID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXRvb2x0aXAtLWZseW91dFN0eWxlLS1GaWxsXCIsXG4gIFwidmFsdWVcIjogXCIjMTUxNTE1XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtdG9vbHRpcC0tZmx5b3V0U3R5bGUtLUZpbGwpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF90b29sdGlwX2ZseW91dFN0eWxlX0ZpbGw7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X3Rvb2x0aXBfcG9pbnRlcl9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC10b29sdGlwLS1wb2ludGVyLS1XaWR0aFwiLFxuICBcInZhbHVlXCI6IDIwLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXRvb2x0aXAtLXBvaW50ZXItLVdpZHRoKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfdG9vbHRpcF9wb2ludGVyX1dpZHRoOyIsImV4cG9ydCBjb25zdCBjaGFydF90b29sdGlwX1BhZGRpbmcgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtdG9vbHRpcC0tUGFkZGluZ1wiLFxuICBcInZhbHVlXCI6IDgsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtdG9vbHRpcC0tUGFkZGluZylcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X3Rvb2x0aXBfUGFkZGluZzsiLCJleHBvcnQgY29uc3QgY2hhcnRfdG9vbHRpcF9Qb2ludGVyRXZlbnRzID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXRvb2x0aXAtLVBvaW50ZXJFdmVudHNcIixcbiAgXCJ2YWx1ZVwiOiBcIm5vbmVcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC10b29sdGlwLS1Qb2ludGVyRXZlbnRzKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfdG9vbHRpcF9Qb2ludGVyRXZlbnRzOyIsImV4cG9ydCBjb25zdCBjaGFydF92b3Jvbm9pX2RhdGFfRmlsbCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC12b3Jvbm9pLS1kYXRhLS1GaWxsXCIsXG4gIFwidmFsdWVcIjogXCJ0cmFuc3BhcmVudFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXZvcm9ub2ktLWRhdGEtLUZpbGwpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF92b3Jvbm9pX2RhdGFfRmlsbDsiLCJleHBvcnQgY29uc3QgY2hhcnRfdm9yb25vaV9kYXRhX3N0cm9rZV9Db2xvciA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC12b3Jvbm9pLS1kYXRhLS1zdHJva2UtLUNvbG9yXCIsXG4gIFwidmFsdWVcIjogXCJ0cmFuc3BhcmVudFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXZvcm9ub2ktLWRhdGEtLXN0cm9rZS0tQ29sb3IpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF92b3Jvbm9pX2RhdGFfc3Ryb2tlX0NvbG9yOyIsImV4cG9ydCBjb25zdCBjaGFydF92b3Jvbm9pX2RhdGFfc3Ryb2tlX1dpZHRoID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXZvcm9ub2ktLWRhdGEtLXN0cm9rZS0tV2lkdGhcIixcbiAgXCJ2YWx1ZVwiOiAwLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXZvcm9ub2ktLWRhdGEtLXN0cm9rZS0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF92b3Jvbm9pX2RhdGFfc3Ryb2tlX1dpZHRoOyIsImV4cG9ydCBjb25zdCBjaGFydF92b3Jvbm9pX2xhYmVsc19GaWxsID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXZvcm9ub2ktLWxhYmVscy0tRmlsbFwiLFxuICBcInZhbHVlXCI6IFwiI2YwZjBmMFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXZvcm9ub2ktLWxhYmVscy0tRmlsbClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X3Zvcm9ub2lfbGFiZWxzX0ZpbGw7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X3Zvcm9ub2lfbGFiZWxzX1BhZGRpbmcgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtdm9yb25vaS0tbGFiZWxzLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogOCxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC12b3Jvbm9pLS1sYWJlbHMtLVBhZGRpbmcpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF92b3Jvbm9pX2xhYmVsc19QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF92b3Jvbm9pX2xhYmVsc19Qb2ludGVyRXZlbnRzID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXZvcm9ub2ktLWxhYmVscy0tUG9pbnRlckV2ZW50c1wiLFxuICBcInZhbHVlXCI6IFwibm9uZVwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXZvcm9ub2ktLWxhYmVscy0tUG9pbnRlckV2ZW50cylcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X3Zvcm9ub2lfbGFiZWxzX1BvaW50ZXJFdmVudHM7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X3Zvcm9ub2lfZmx5b3V0X3N0cm9rZV9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC12b3Jvbm9pLS1mbHlvdXQtLXN0cm9rZS0tV2lkdGhcIixcbiAgXCJ2YWx1ZVwiOiAxLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXZvcm9ub2ktLWZseW91dC0tc3Ryb2tlLS1XaWR0aClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X3Zvcm9ub2lfZmx5b3V0X3N0cm9rZV9XaWR0aDsiLCJleHBvcnQgY29uc3QgY2hhcnRfdm9yb25vaV9mbHlvdXRfUG9pbnRlckV2ZW50cyA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC12b3Jvbm9pLS1mbHlvdXQtLVBvaW50ZXJFdmVudHNcIixcbiAgXCJ2YWx1ZVwiOiBcIm5vbmVcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC12b3Jvbm9pLS1mbHlvdXQtLVBvaW50ZXJFdmVudHMpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF92b3Jvbm9pX2ZseW91dF9Qb2ludGVyRXZlbnRzOyIsImV4cG9ydCBjb25zdCBjaGFydF92b3Jvbm9pX2ZseW91dF9zdHJva2VfQ29sb3IgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtdm9yb25vaS0tZmx5b3V0LS1zdHJva2UtLUNvbG9yXCIsXG4gIFwidmFsdWVcIjogXCIjMTUxNTE1XCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtdm9yb25vaS0tZmx5b3V0LS1zdHJva2UtLUNvbG9yKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfdm9yb25vaV9mbHlvdXRfc3Ryb2tlX0NvbG9yOyIsImV4cG9ydCBjb25zdCBjaGFydF92b3Jvbm9pX2ZseW91dF9zdHJva2VfRmlsbCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC12b3Jvbm9pLS1mbHlvdXQtLXN0cm9rZS0tRmlsbFwiLFxuICBcInZhbHVlXCI6IFwiIzE1MTUxNVwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXZvcm9ub2ktLWZseW91dC0tc3Ryb2tlLS1GaWxsKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfdm9yb25vaV9mbHlvdXRfc3Ryb2tlX0ZpbGw7IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgY2hhcnRfZ2xvYmFsX0ZvbnRGYW1pbHkgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2dsb2JhbF9Gb250RmFtaWx5JztcbmltcG9ydCBjaGFydF9nbG9iYWxfbGV0dGVyX3NwYWNpbmcgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2dsb2JhbF9sZXR0ZXJfc3BhY2luZyc7XG5pbXBvcnQgY2hhcnRfZ2xvYmFsX0ZvbnRTaXplX3NtIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9nbG9iYWxfRm9udFNpemVfc20nO1xuaW1wb3J0IGNoYXJ0X2dsb2JhbF9sYWJlbF9QYWRkaW5nIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9nbG9iYWxfbGFiZWxfUGFkZGluZyc7XG5pbXBvcnQgY2hhcnRfZ2xvYmFsX2xhYmVsX3N0cm9rZSBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZ2xvYmFsX2xhYmVsX3N0cm9rZSc7XG5pbXBvcnQgY2hhcnRfZ2xvYmFsX2xhYmVsX3RleHRfYW5jaG9yIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9nbG9iYWxfbGFiZWxfdGV4dF9hbmNob3InO1xuaW1wb3J0IGNoYXJ0X2dsb2JhbF9sYXlvdXRfUGFkZGluZyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZ2xvYmFsX2xheW91dF9QYWRkaW5nJztcbmltcG9ydCBjaGFydF9nbG9iYWxfbGF5b3V0X0hlaWdodCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZ2xvYmFsX2xheW91dF9IZWlnaHQnO1xuaW1wb3J0IGNoYXJ0X2dsb2JhbF9sYXlvdXRfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2dsb2JhbF9sYXlvdXRfV2lkdGgnO1xuaW1wb3J0IGNoYXJ0X2dsb2JhbF9zdHJva2VfbGluZV9jYXAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2dsb2JhbF9zdHJva2VfbGluZV9jYXAnO1xuaW1wb3J0IGNoYXJ0X2dsb2JhbF9zdHJva2VfbGluZV9qb2luIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9nbG9iYWxfc3Ryb2tlX2xpbmVfam9pbic7XG5pbXBvcnQgY2hhcnRfYXJlYV9kYXRhX0ZpbGwgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2FyZWFfZGF0YV9GaWxsJztcbmltcG9ydCBjaGFydF9hcmVhX09wYWNpdHkgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2FyZWFfT3BhY2l0eSc7XG5pbXBvcnQgY2hhcnRfYXJlYV9zdHJva2VfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2FyZWFfc3Ryb2tlX1dpZHRoJztcbmltcG9ydCBjaGFydF9heGlzX2F4aXNfc3Ryb2tlX1dpZHRoIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9heGlzX2F4aXNfc3Ryb2tlX1dpZHRoJztcbmltcG9ydCBjaGFydF9heGlzX2F4aXNfc3Ryb2tlX0NvbG9yIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9heGlzX2F4aXNfc3Ryb2tlX0NvbG9yJztcbmltcG9ydCBjaGFydF9heGlzX2F4aXNfRmlsbCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYXhpc19heGlzX0ZpbGwnO1xuaW1wb3J0IGNoYXJ0X2F4aXNfYXhpc19sYWJlbF9QYWRkaW5nIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9heGlzX2F4aXNfbGFiZWxfUGFkZGluZyc7XG5pbXBvcnQgY2hhcnRfYXhpc19heGlzX2xhYmVsX3N0cm9rZV9Db2xvciBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYXhpc19heGlzX2xhYmVsX3N0cm9rZV9Db2xvcic7XG5pbXBvcnQgY2hhcnRfYXhpc19ncmlkX0ZpbGwgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2F4aXNfZ3JpZF9GaWxsJztcbmltcG9ydCBjaGFydF9heGlzX2dyaWRfUG9pbnRlckV2ZW50cyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYXhpc19ncmlkX1BvaW50ZXJFdmVudHMnO1xuaW1wb3J0IGNoYXJ0X2F4aXNfdGlja19GaWxsIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9heGlzX3RpY2tfRmlsbCc7XG5pbXBvcnQgY2hhcnRfYXhpc190aWNrX1NpemUgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2F4aXNfdGlja19TaXplJztcbmltcG9ydCBjaGFydF9heGlzX3RpY2tfc3Ryb2tlX0NvbG9yIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9heGlzX3RpY2tfc3Ryb2tlX0NvbG9yJztcbmltcG9ydCBjaGFydF9heGlzX3RpY2tfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2F4aXNfdGlja19XaWR0aCc7XG5pbXBvcnQgY2hhcnRfYXhpc190aWNrX2xhYmVsX0ZpbGwgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2F4aXNfdGlja19sYWJlbF9GaWxsJztcbmltcG9ydCBjaGFydF9iYXJfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2Jhcl9XaWR0aCc7XG5pbXBvcnQgY2hhcnRfYmFyX2RhdGFfc3Ryb2tlIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9iYXJfZGF0YV9zdHJva2UnO1xuaW1wb3J0IGNoYXJ0X2Jhcl9kYXRhX0ZpbGwgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2Jhcl9kYXRhX0ZpbGwnO1xuaW1wb3J0IGNoYXJ0X2Jhcl9kYXRhX1BhZGRpbmcgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2Jhcl9kYXRhX1BhZGRpbmcnO1xuaW1wb3J0IGNoYXJ0X2Jhcl9kYXRhX3N0cm9rZV9XaWR0aCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYmFyX2RhdGFfc3Ryb2tlX1dpZHRoJztcbmltcG9ydCBjaGFydF9ib3hwbG90X21heF9QYWRkaW5nIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9ib3hwbG90X21heF9QYWRkaW5nJztcbmltcG9ydCBjaGFydF9ib3hwbG90X21heF9zdHJva2VfQ29sb3IgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2JveHBsb3RfbWF4X3N0cm9rZV9Db2xvcic7XG5pbXBvcnQgY2hhcnRfYm94cGxvdF9tYXhfc3Ryb2tlX1dpZHRoIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9ib3hwbG90X21heF9zdHJva2VfV2lkdGgnO1xuaW1wb3J0IGNoYXJ0X2JveHBsb3RfbWVkaWFuX1BhZGRpbmcgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2JveHBsb3RfbWVkaWFuX1BhZGRpbmcnO1xuaW1wb3J0IGNoYXJ0X2JveHBsb3RfbWVkaWFuX3N0cm9rZV9Db2xvciBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYm94cGxvdF9tZWRpYW5fc3Ryb2tlX0NvbG9yJztcbmltcG9ydCBjaGFydF9ib3hwbG90X21lZGlhbl9zdHJva2VfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2JveHBsb3RfbWVkaWFuX3N0cm9rZV9XaWR0aCc7XG5pbXBvcnQgY2hhcnRfYm94cGxvdF9taW5fUGFkZGluZyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYm94cGxvdF9taW5fUGFkZGluZyc7XG5pbXBvcnQgY2hhcnRfYm94cGxvdF9taW5fc3Ryb2tlX1dpZHRoIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9ib3hwbG90X21pbl9zdHJva2VfV2lkdGgnO1xuaW1wb3J0IGNoYXJ0X2JveHBsb3RfbWluX3N0cm9rZV9Db2xvciBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYm94cGxvdF9taW5fc3Ryb2tlX0NvbG9yJztcbmltcG9ydCBjaGFydF9ib3hwbG90X2xvd2VyX3F1YXJ0aWxlX1BhZGRpbmcgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2JveHBsb3RfbG93ZXJfcXVhcnRpbGVfUGFkZGluZyc7XG5pbXBvcnQgY2hhcnRfYm94cGxvdF9sb3dlcl9xdWFydGlsZV9GaWxsIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9ib3hwbG90X2xvd2VyX3F1YXJ0aWxlX0ZpbGwnO1xuaW1wb3J0IGNoYXJ0X2JveHBsb3RfdXBwZXJfcXVhcnRpbGVfUGFkZGluZyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYm94cGxvdF91cHBlcl9xdWFydGlsZV9QYWRkaW5nJztcbmltcG9ydCBjaGFydF9ib3hwbG90X3VwcGVyX3F1YXJ0aWxlX0ZpbGwgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2JveHBsb3RfdXBwZXJfcXVhcnRpbGVfRmlsbCc7XG5pbXBvcnQgY2hhcnRfYm94cGxvdF9ib3hfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2JveHBsb3RfYm94X1dpZHRoJztcbmltcG9ydCBjaGFydF9jYW5kZWxzdGlja19kYXRhX3N0cm9rZV9XaWR0aCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY2FuZGVsc3RpY2tfZGF0YV9zdHJva2VfV2lkdGgnO1xuaW1wb3J0IGNoYXJ0X2NhbmRlbHN0aWNrX2RhdGFfc3Ryb2tlX0NvbG9yIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jYW5kZWxzdGlja19kYXRhX3N0cm9rZV9Db2xvcic7XG5pbXBvcnQgY2hhcnRfY2FuZGVsc3RpY2tfY2FuZGxlX3Bvc2l0aXZlX0NvbG9yIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jYW5kZWxzdGlja19jYW5kbGVfcG9zaXRpdmVfQ29sb3InO1xuaW1wb3J0IGNoYXJ0X2NhbmRlbHN0aWNrX2NhbmRsZV9uZWdhdGl2ZV9Db2xvciBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY2FuZGVsc3RpY2tfY2FuZGxlX25lZ2F0aXZlX0NvbG9yJztcbmltcG9ydCBjaGFydF9lcnJvcmJhcl9Cb3JkZXJXaWR0aCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZXJyb3JiYXJfQm9yZGVyV2lkdGgnO1xuaW1wb3J0IGNoYXJ0X2Vycm9yYmFyX2RhdGFfRmlsbCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZXJyb3JiYXJfZGF0YV9GaWxsJztcbmltcG9ydCBjaGFydF9lcnJvcmJhcl9kYXRhX09wYWNpdHkgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2Vycm9yYmFyX2RhdGFfT3BhY2l0eSc7XG5pbXBvcnQgY2hhcnRfZXJyb3JiYXJfZGF0YV9zdHJva2VfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2Vycm9yYmFyX2RhdGFfc3Ryb2tlX1dpZHRoJztcbmltcG9ydCBjaGFydF9lcnJvcmJhcl9kYXRhX3N0cm9rZV9Db2xvciBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZXJyb3JiYXJfZGF0YV9zdHJva2VfQ29sb3InO1xuaW1wb3J0IGNoYXJ0X2xlZ2VuZF9ndXR0ZXJfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2xlZ2VuZF9ndXR0ZXJfV2lkdGgnO1xuaW1wb3J0IGNoYXJ0X2xlZ2VuZF9vcmllbnRhdGlvbiBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfbGVnZW5kX29yaWVudGF0aW9uJztcbmltcG9ydCBjaGFydF9sZWdlbmRfdGl0bGVfb3JpZW50YXRpb24gZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2xlZ2VuZF90aXRsZV9vcmllbnRhdGlvbic7XG5pbXBvcnQgY2hhcnRfbGVnZW5kX2RhdGFfdHlwZSBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfbGVnZW5kX2RhdGFfdHlwZSc7XG5pbXBvcnQgY2hhcnRfbGVnZW5kX3RpdGxlX1BhZGRpbmcgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2xlZ2VuZF90aXRsZV9QYWRkaW5nJztcbmltcG9ydCBjaGFydF9saW5lX2RhdGFfRmlsbCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfbGluZV9kYXRhX0ZpbGwnO1xuaW1wb3J0IGNoYXJ0X2xpbmVfZGF0YV9PcGFjaXR5IGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9saW5lX2RhdGFfT3BhY2l0eSc7XG5pbXBvcnQgY2hhcnRfbGluZV9kYXRhX3N0cm9rZV9XaWR0aCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfbGluZV9kYXRhX3N0cm9rZV9XaWR0aCc7XG5pbXBvcnQgY2hhcnRfbGluZV9kYXRhX3N0cm9rZV9Db2xvciBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfbGluZV9kYXRhX3N0cm9rZV9Db2xvcic7XG5pbXBvcnQgY2hhcnRfcGllX1BhZGRpbmcgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3BpZV9QYWRkaW5nJztcbmltcG9ydCBjaGFydF9waWVfZGF0YV9QYWRkaW5nIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9waWVfZGF0YV9QYWRkaW5nJztcbmltcG9ydCBjaGFydF9waWVfZGF0YV9zdHJva2VfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3BpZV9kYXRhX3N0cm9rZV9XaWR0aCc7XG5pbXBvcnQgY2hhcnRfcGllX2RhdGFfc3Ryb2tlX0NvbG9yIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9waWVfZGF0YV9zdHJva2VfQ29sb3InO1xuaW1wb3J0IGNoYXJ0X3BpZV9sYWJlbHNfUGFkZGluZyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfcGllX2xhYmVsc19QYWRkaW5nJztcbmltcG9ydCBjaGFydF9waWVfSGVpZ2h0IGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9waWVfSGVpZ2h0JztcbmltcG9ydCBjaGFydF9waWVfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3BpZV9XaWR0aCc7XG5pbXBvcnQgY2hhcnRfc2NhdHRlcl9kYXRhX3N0cm9rZV9Db2xvciBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfc2NhdHRlcl9kYXRhX3N0cm9rZV9Db2xvcic7XG5pbXBvcnQgY2hhcnRfc2NhdHRlcl9kYXRhX3N0cm9rZV9XaWR0aCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfc2NhdHRlcl9kYXRhX3N0cm9rZV9XaWR0aCc7XG5pbXBvcnQgY2hhcnRfc2NhdHRlcl9kYXRhX09wYWNpdHkgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3NjYXR0ZXJfZGF0YV9PcGFjaXR5JztcbmltcG9ydCBjaGFydF9zY2F0dGVyX2RhdGFfRmlsbCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfc2NhdHRlcl9kYXRhX0ZpbGwnO1xuaW1wb3J0IGNoYXJ0X3N0YWNrX2RhdGFfc3Ryb2tlX1dpZHRoIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9zdGFja19kYXRhX3N0cm9rZV9XaWR0aCc7XG5pbXBvcnQgY2hhcnRfdG9vbHRpcF9jb3JuZXJfcmFkaXVzIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF90b29sdGlwX2Nvcm5lcl9yYWRpdXMnO1xuaW1wb3J0IGNoYXJ0X3Rvb2x0aXBfcG9pbnRlcl9sZW5ndGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3Rvb2x0aXBfcG9pbnRlcl9sZW5ndGgnO1xuaW1wb3J0IGNoYXJ0X3Rvb2x0aXBfRmlsbCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdG9vbHRpcF9GaWxsJztcbmltcG9ydCBjaGFydF90b29sdGlwX2ZseW91dFN0eWxlX2Nvcm5lcl9yYWRpdXMgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3Rvb2x0aXBfZmx5b3V0U3R5bGVfY29ybmVyX3JhZGl1cyc7XG5pbXBvcnQgY2hhcnRfdG9vbHRpcF9mbHlvdXRTdHlsZV9zdHJva2VfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3Rvb2x0aXBfZmx5b3V0U3R5bGVfc3Ryb2tlX1dpZHRoJztcbmltcG9ydCBjaGFydF90b29sdGlwX2ZseW91dFN0eWxlX1BvaW50ZXJFdmVudHMgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3Rvb2x0aXBfZmx5b3V0U3R5bGVfUG9pbnRlckV2ZW50cyc7XG5pbXBvcnQgY2hhcnRfdG9vbHRpcF9mbHlvdXRTdHlsZV9zdHJva2VfQ29sb3IgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3Rvb2x0aXBfZmx5b3V0U3R5bGVfc3Ryb2tlX0NvbG9yJztcbmltcG9ydCBjaGFydF90b29sdGlwX2ZseW91dFN0eWxlX0ZpbGwgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3Rvb2x0aXBfZmx5b3V0U3R5bGVfRmlsbCc7XG5pbXBvcnQgY2hhcnRfdG9vbHRpcF9wb2ludGVyX1dpZHRoIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF90b29sdGlwX3BvaW50ZXJfV2lkdGgnO1xuaW1wb3J0IGNoYXJ0X3Rvb2x0aXBfUGFkZGluZyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdG9vbHRpcF9QYWRkaW5nJztcbmltcG9ydCBjaGFydF90b29sdGlwX1BvaW50ZXJFdmVudHMgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3Rvb2x0aXBfUG9pbnRlckV2ZW50cyc7XG5pbXBvcnQgY2hhcnRfdm9yb25vaV9kYXRhX0ZpbGwgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3Zvcm9ub2lfZGF0YV9GaWxsJztcbmltcG9ydCBjaGFydF92b3Jvbm9pX2RhdGFfc3Ryb2tlX0NvbG9yIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF92b3Jvbm9pX2RhdGFfc3Ryb2tlX0NvbG9yJztcbmltcG9ydCBjaGFydF92b3Jvbm9pX2RhdGFfc3Ryb2tlX1dpZHRoIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF92b3Jvbm9pX2RhdGFfc3Ryb2tlX1dpZHRoJztcbmltcG9ydCBjaGFydF92b3Jvbm9pX2xhYmVsc19GaWxsIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF92b3Jvbm9pX2xhYmVsc19GaWxsJztcbmltcG9ydCBjaGFydF92b3Jvbm9pX2xhYmVsc19QYWRkaW5nIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF92b3Jvbm9pX2xhYmVsc19QYWRkaW5nJztcbmltcG9ydCBjaGFydF92b3Jvbm9pX2xhYmVsc19Qb2ludGVyRXZlbnRzIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF92b3Jvbm9pX2xhYmVsc19Qb2ludGVyRXZlbnRzJztcbmltcG9ydCBjaGFydF92b3Jvbm9pX2ZseW91dF9zdHJva2VfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3Zvcm9ub2lfZmx5b3V0X3N0cm9rZV9XaWR0aCc7XG5pbXBvcnQgY2hhcnRfdm9yb25vaV9mbHlvdXRfUG9pbnRlckV2ZW50cyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdm9yb25vaV9mbHlvdXRfUG9pbnRlckV2ZW50cyc7XG5pbXBvcnQgY2hhcnRfdm9yb25vaV9mbHlvdXRfc3Ryb2tlX0NvbG9yIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF92b3Jvbm9pX2ZseW91dF9zdHJva2VfQ29sb3InO1xuaW1wb3J0IGNoYXJ0X3Zvcm9ub2lfZmx5b3V0X3N0cm9rZV9GaWxsIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF92b3Jvbm9pX2ZseW91dF9zdHJva2VfRmlsbCc7XG4vLyBOb3RlOiBWYWx1ZXMgbXVzdCBiZSBpbiBwaXhsZXNcbi8vIFR5cG9ncmFwaHlcbi8vXG4vLyBOb3RlOiBWaWN0b3J5J3MgYXBwcm94aW1hdGVUZXh0U2l6ZSBmdW5jdGlvbiB1c2VzIHNwZWNpZmljIGNoYXJhY3RlciB3aWR0aHMgYW5kIGRvZXMgbm90IHdvcmsgd2l0aCBmb250IHZhcmlhYmxlc1xuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wYXR0ZXJuZmx5L3BhdHRlcm5mbHktcmVhY3QvaXNzdWVzLzUzMDBcbmNvbnN0IFRZUE9HUkFQSFlfRk9OVF9GQU1JTFkgPSBjaGFydF9nbG9iYWxfRm9udEZhbWlseS52YWx1ZS5yZXBsYWNlKC8gL2csICcnKTtcbmNvbnN0IFRZUE9HUkFQSFlfTEVUVEVSX1NQQUNJTkcgPSBjaGFydF9nbG9iYWxfbGV0dGVyX3NwYWNpbmcudmFsdWU7XG5jb25zdCBUWVBPR1JBUEhZX0ZPTlRfU0laRSA9IGNoYXJ0X2dsb2JhbF9Gb250U2l6ZV9zbS52YWx1ZTtcbi8vIExhYmVsc1xuY29uc3QgTEFCRUxfUFJPUFMgPSB7XG4gICAgZm9udEZhbWlseTogVFlQT0dSQVBIWV9GT05UX0ZBTUlMWSxcbiAgICBmb250U2l6ZTogVFlQT0dSQVBIWV9GT05UX1NJWkUsXG4gICAgbGV0dGVyU3BhY2luZzogVFlQT0dSQVBIWV9MRVRURVJfU1BBQ0lORyxcbiAgICBwYWRkaW5nOiBjaGFydF9nbG9iYWxfbGFiZWxfUGFkZGluZy52YWx1ZSxcbiAgICBzdHJva2U6IGNoYXJ0X2dsb2JhbF9sYWJlbF9zdHJva2UudmFsdWVcbn07XG5jb25zdCBMQUJFTF9DRU5URVJFRF9QUk9QUyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgTEFCRUxfUFJPUFMpLCB7IHRleHRBbmNob3I6IGNoYXJ0X2dsb2JhbF9sYWJlbF90ZXh0X2FuY2hvci52YWx1ZSB9KTtcbi8vIExheW91dFxuY29uc3QgTEFZT1VUX1BST1BTID0ge1xuICAgIHBhZGRpbmc6IGNoYXJ0X2dsb2JhbF9sYXlvdXRfUGFkZGluZy52YWx1ZSxcbiAgICBoZWlnaHQ6IGNoYXJ0X2dsb2JhbF9sYXlvdXRfSGVpZ2h0LnZhbHVlLFxuICAgIHdpZHRoOiBjaGFydF9nbG9iYWxfbGF5b3V0X1dpZHRoLnZhbHVlXG59O1xuLy8gU3Ryb2tlc1xuY29uc3QgU1RST0tFX0xJTkVfQ0FQID0gY2hhcnRfZ2xvYmFsX3N0cm9rZV9saW5lX2NhcC52YWx1ZTtcbmNvbnN0IFNUUk9LRV9MSU5FX0pPSU4gPSBjaGFydF9nbG9iYWxfc3Ryb2tlX2xpbmVfam9pbi52YWx1ZTtcbi8vIFZpY3RvcnkgdGhlbWUgcHJvcGVydGllcyBvbmx5XG5leHBvcnQgY29uc3QgQmFzZVRoZW1lID0ge1xuICAgIGFyZWE6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgTEFZT1VUX1BST1BTKSwgeyBzdHlsZToge1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGZpbGw6IGNoYXJ0X2FyZWFfZGF0YV9GaWxsLnZhbHVlLFxuICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiBjaGFydF9hcmVhX09wYWNpdHkudmFsdWUsXG4gICAgICAgICAgICAgICAgLy8gT21pdCBzdHJva2UgdG8gYWRkIGEgbGluZSBib3JkZXIgZnJvbSBjb2xvciBzY2FsZVxuICAgICAgICAgICAgICAgIC8vIHN0cm9rZTogY2hhcnRfZ2xvYmFsX2xhYmVsX3N0cm9rZS52YWx1ZSxcbiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogY2hhcnRfYXJlYV9zdHJva2VfV2lkdGgudmFsdWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYWJlbHM6IExBQkVMX0NFTlRFUkVEX1BST1BTXG4gICAgICAgIH0gfSksXG4gICAgYXhpczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBMQVlPVVRfUFJPUFMpLCB7IHN0eWxlOiB7XG4gICAgICAgICAgICBheGlzOiB7XG4gICAgICAgICAgICAgICAgZmlsbDogY2hhcnRfYXhpc19heGlzX0ZpbGwudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGNoYXJ0X2F4aXNfYXhpc19zdHJva2VfV2lkdGgudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjaGFydF9heGlzX2F4aXNfc3Ryb2tlX0NvbG9yLnZhbHVlLFxuICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVjYXA6IFNUUk9LRV9MSU5FX0NBUCxcbiAgICAgICAgICAgICAgICBzdHJva2VMaW5lam9pbjogU1RST0tFX0xJTkVfSk9JTlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF4aXNMYWJlbDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBMQUJFTF9DRU5URVJFRF9QUk9QUyksIHsgcGFkZGluZzogY2hhcnRfYXhpc19heGlzX2xhYmVsX1BhZGRpbmcudmFsdWUsIHN0cm9rZTogY2hhcnRfYXhpc19heGlzX2xhYmVsX3N0cm9rZV9Db2xvci52YWx1ZSB9KSxcbiAgICAgICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICAgICAgICBmaWxsOiBjaGFydF9heGlzX2dyaWRfRmlsbC52YWx1ZSxcbiAgICAgICAgICAgICAgICBzdHJva2U6ICdub25lJyxcbiAgICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzOiBjaGFydF9heGlzX2dyaWRfUG9pbnRlckV2ZW50cy52YWx1ZSxcbiAgICAgICAgICAgICAgICBzdHJva2VMaW5lY2FwOiBTVFJPS0VfTElORV9DQVAsXG4gICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW46IFNUUk9LRV9MSU5FX0pPSU5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aWNrczoge1xuICAgICAgICAgICAgICAgIGZpbGw6IGNoYXJ0X2F4aXNfdGlja19GaWxsLnZhbHVlLFxuICAgICAgICAgICAgICAgIHNpemU6IGNoYXJ0X2F4aXNfdGlja19TaXplLnZhbHVlLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogY2hhcnRfYXhpc190aWNrX3N0cm9rZV9Db2xvci52YWx1ZSxcbiAgICAgICAgICAgICAgICBzdHJva2VMaW5lY2FwOiBTVFJPS0VfTElORV9DQVAsXG4gICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW46IFNUUk9LRV9MSU5FX0pPSU4sXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGNoYXJ0X2F4aXNfdGlja19XaWR0aC52YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRpY2tMYWJlbHM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgTEFCRUxfUFJPUFMpLCB7IGZpbGw6IGNoYXJ0X2F4aXNfdGlja19sYWJlbF9GaWxsLnZhbHVlIH0pXG4gICAgICAgIH0gfSksXG4gICAgYmFyOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIExBWU9VVF9QUk9QUyksIHsgYmFyV2lkdGg6IGNoYXJ0X2Jhcl9XaWR0aC52YWx1ZSwgc3R5bGU6IHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBmaWxsOiBjaGFydF9iYXJfZGF0YV9GaWxsLnZhbHVlLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IGNoYXJ0X2Jhcl9kYXRhX1BhZGRpbmcudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjaGFydF9iYXJfZGF0YV9zdHJva2UudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGNoYXJ0X2Jhcl9kYXRhX3N0cm9rZV9XaWR0aC52YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhYmVsczogTEFCRUxfUFJPUFNcbiAgICAgICAgfSB9KSxcbiAgICBib3hwbG90OiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIExBWU9VVF9QUk9QUyksIHsgc3R5bGU6IHtcbiAgICAgICAgICAgIG1heDoge1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6IGNoYXJ0X2JveHBsb3RfbWF4X1BhZGRpbmcudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjaGFydF9ib3hwbG90X21heF9zdHJva2VfQ29sb3IudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGNoYXJ0X2JveHBsb3RfbWF4X3N0cm9rZV9XaWR0aC52YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1heExhYmVsczogTEFCRUxfUFJPUFMsXG4gICAgICAgICAgICBtZWRpYW46IHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiBjaGFydF9ib3hwbG90X21lZGlhbl9QYWRkaW5nLnZhbHVlLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogY2hhcnRfYm94cGxvdF9tZWRpYW5fc3Ryb2tlX0NvbG9yLnZhbHVlLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiBjaGFydF9ib3hwbG90X21lZGlhbl9zdHJva2VfV2lkdGgudmFsdWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZWRpYW5MYWJlbHM6IExBQkVMX1BST1BTLFxuICAgICAgICAgICAgbWluOiB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogY2hhcnRfYm94cGxvdF9taW5fUGFkZGluZy52YWx1ZSxcbiAgICAgICAgICAgICAgICBzdHJva2U6IGNoYXJ0X2JveHBsb3RfbWluX3N0cm9rZV9Db2xvci52YWx1ZSxcbiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogY2hhcnRfYm94cGxvdF9taW5fc3Ryb2tlX1dpZHRoLnZhbHVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWluTGFiZWxzOiBMQUJFTF9QUk9QUyxcbiAgICAgICAgICAgIHExOiB7XG4gICAgICAgICAgICAgICAgZmlsbDogY2hhcnRfYm94cGxvdF9sb3dlcl9xdWFydGlsZV9GaWxsLnZhbHVlLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IGNoYXJ0X2JveHBsb3RfbG93ZXJfcXVhcnRpbGVfUGFkZGluZy52YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHExTGFiZWxzOiBMQUJFTF9QUk9QUyxcbiAgICAgICAgICAgIHEzOiB7XG4gICAgICAgICAgICAgICAgZmlsbDogY2hhcnRfYm94cGxvdF91cHBlcl9xdWFydGlsZV9GaWxsLnZhbHVlLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IGNoYXJ0X2JveHBsb3RfdXBwZXJfcXVhcnRpbGVfUGFkZGluZy52YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHEzTGFiZWxzOiBMQUJFTF9QUk9QU1xuICAgICAgICB9LCBib3hXaWR0aDogY2hhcnRfYm94cGxvdF9ib3hfV2lkdGgudmFsdWUgfSksXG4gICAgY2FuZGxlc3RpY2s6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgTEFZT1VUX1BST1BTKSwgeyBjYW5kbGVDb2xvcnM6IHtcbiAgICAgICAgICAgIHBvc2l0aXZlOiBjaGFydF9jYW5kZWxzdGlja19jYW5kbGVfcG9zaXRpdmVfQ29sb3IudmFsdWUsXG4gICAgICAgICAgICBuZWdhdGl2ZTogY2hhcnRfY2FuZGVsc3RpY2tfY2FuZGxlX25lZ2F0aXZlX0NvbG9yLnZhbHVlXG4gICAgICAgIH0sIHN0eWxlOiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjaGFydF9jYW5kZWxzdGlja19kYXRhX3N0cm9rZV9Db2xvci52YWx1ZSxcbiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogY2hhcnRfY2FuZGVsc3RpY2tfZGF0YV9zdHJva2VfV2lkdGgudmFsdWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYWJlbHM6IExBQkVMX0NFTlRFUkVEX1BST1BTXG4gICAgICAgIH0gfSksXG4gICAgY2hhcnQ6IE9iamVjdC5hc3NpZ24oe30sIExBWU9VVF9QUk9QUyksXG4gICAgZXJyb3JiYXI6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgTEFZT1VUX1BST1BTKSwgeyBib3JkZXJXaWR0aDogY2hhcnRfZXJyb3JiYXJfQm9yZGVyV2lkdGgudmFsdWUsIHN0eWxlOiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZmlsbDogY2hhcnRfZXJyb3JiYXJfZGF0YV9GaWxsLnZhbHVlLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IGNoYXJ0X2Vycm9yYmFyX2RhdGFfT3BhY2l0eS52YWx1ZSxcbiAgICAgICAgICAgICAgICBzdHJva2U6IGNoYXJ0X2Vycm9yYmFyX2RhdGFfc3Ryb2tlX0NvbG9yLnZhbHVlLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiBjaGFydF9lcnJvcmJhcl9kYXRhX3N0cm9rZV9XaWR0aC52YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhYmVsczogTEFCRUxfQ0VOVEVSRURfUFJPUFNcbiAgICAgICAgfSB9KSxcbiAgICBncm91cDogT2JqZWN0LmFzc2lnbih7fSwgTEFZT1VUX1BST1BTKSxcbiAgICBsZWdlbmQ6IHtcbiAgICAgICAgZ3V0dGVyOiBjaGFydF9sZWdlbmRfZ3V0dGVyX1dpZHRoLnZhbHVlLFxuICAgICAgICBvcmllbnRhdGlvbjogY2hhcnRfbGVnZW5kX29yaWVudGF0aW9uLnZhbHVlLFxuICAgICAgICB0aXRsZU9yaWVudGF0aW9uOiBjaGFydF9sZWdlbmRfdGl0bGVfb3JpZW50YXRpb24udmFsdWUsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogY2hhcnRfbGVnZW5kX2RhdGFfdHlwZS52YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhYmVsczogTEFCRUxfUFJPUFMsXG4gICAgICAgICAgICB0aXRsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBMQUJFTF9QUk9QUyksIHsgZm9udFNpemU6IFRZUE9HUkFQSFlfRk9OVF9TSVpFLCBwYWRkaW5nOiBjaGFydF9sZWdlbmRfdGl0bGVfUGFkZGluZy52YWx1ZSB9KVxuICAgICAgICB9XG4gICAgfSxcbiAgICBsaW5lOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIExBWU9VVF9QUk9QUyksIHsgc3R5bGU6IHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBmaWxsOiBjaGFydF9saW5lX2RhdGFfRmlsbC52YWx1ZSxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiBjaGFydF9saW5lX2RhdGFfT3BhY2l0eS52YWx1ZSxcbiAgICAgICAgICAgICAgICBzdHJva2U6IGNoYXJ0X2xpbmVfZGF0YV9zdHJva2VfQ29sb3IudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGNoYXJ0X2xpbmVfZGF0YV9zdHJva2VfV2lkdGgudmFsdWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYWJlbHM6IExBQkVMX0NFTlRFUkVEX1BST1BTXG4gICAgICAgIH0gfSksXG4gICAgcGllOiB7XG4gICAgICAgIHBhZGRpbmc6IGNoYXJ0X3BpZV9QYWRkaW5nLnZhbHVlLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6IGNoYXJ0X3BpZV9kYXRhX1BhZGRpbmcudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjaGFydF9waWVfZGF0YV9zdHJva2VfQ29sb3IudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGNoYXJ0X3BpZV9kYXRhX3N0cm9rZV9XaWR0aC52YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhYmVsczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBMQUJFTF9QUk9QUyksIHsgcGFkZGluZzogY2hhcnRfcGllX2xhYmVsc19QYWRkaW5nLnZhbHVlIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGhlaWdodDogY2hhcnRfcGllX0hlaWdodC52YWx1ZSxcbiAgICAgICAgd2lkdGg6IGNoYXJ0X3BpZV9XaWR0aC52YWx1ZVxuICAgIH0sXG4gICAgc2NhdHRlcjogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBMQVlPVVRfUFJPUFMpLCB7IHN0eWxlOiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZmlsbDogY2hhcnRfc2NhdHRlcl9kYXRhX0ZpbGwudmFsdWUsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogY2hhcnRfc2NhdHRlcl9kYXRhX09wYWNpdHkudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjaGFydF9zY2F0dGVyX2RhdGFfc3Ryb2tlX0NvbG9yLnZhbHVlLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiBjaGFydF9zY2F0dGVyX2RhdGFfc3Ryb2tlX1dpZHRoLnZhbHVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFiZWxzOiBMQUJFTF9DRU5URVJFRF9QUk9QU1xuICAgICAgICB9IH0pLFxuICAgIHN0YWNrOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIExBWU9VVF9QUk9QUyksIHsgc3R5bGU6IHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogY2hhcnRfc3RhY2tfZGF0YV9zdHJva2VfV2lkdGgudmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB9KSxcbiAgICB0b29sdGlwOiB7XG4gICAgICAgIGNvcm5lclJhZGl1czogY2hhcnRfdG9vbHRpcF9jb3JuZXJfcmFkaXVzLnZhbHVlLFxuICAgICAgICBmbHlvdXRQYWRkaW5nOiBjaGFydF90b29sdGlwX1BhZGRpbmcudmFsdWUsXG4gICAgICAgIGZseW91dFN0eWxlOiB7XG4gICAgICAgICAgICBjb3JuZXJSYWRpdXM6IGNoYXJ0X3Rvb2x0aXBfZmx5b3V0U3R5bGVfY29ybmVyX3JhZGl1cy52YWx1ZSxcbiAgICAgICAgICAgIGZpbGw6IGNoYXJ0X3Rvb2x0aXBfZmx5b3V0U3R5bGVfRmlsbC52YWx1ZSxcbiAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6IGNoYXJ0X3Rvb2x0aXBfZmx5b3V0U3R5bGVfUG9pbnRlckV2ZW50cy52YWx1ZSxcbiAgICAgICAgICAgIHN0cm9rZTogY2hhcnRfdG9vbHRpcF9mbHlvdXRTdHlsZV9zdHJva2VfQ29sb3IudmFsdWUsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogY2hhcnRfdG9vbHRpcF9mbHlvdXRTdHlsZV9zdHJva2VfV2lkdGgudmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgcG9pbnRlckxlbmd0aDogY2hhcnRfdG9vbHRpcF9wb2ludGVyX2xlbmd0aC52YWx1ZSxcbiAgICAgICAgcG9pbnRlcldpZHRoOiBjaGFydF90b29sdGlwX3BvaW50ZXJfV2lkdGgudmFsdWUsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBmaWxsOiBjaGFydF90b29sdGlwX0ZpbGwudmFsdWUsXG4gICAgICAgICAgICBwb2ludGVyRXZlbnRzOiBjaGFydF90b29sdGlwX1BvaW50ZXJFdmVudHMudmFsdWVcbiAgICAgICAgfVxuICAgIH0sXG4gICAgdm9yb25vaTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBMQVlPVVRfUFJPUFMpLCB7IHN0eWxlOiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZmlsbDogY2hhcnRfdm9yb25vaV9kYXRhX0ZpbGwudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjaGFydF92b3Jvbm9pX2RhdGFfc3Ryb2tlX0NvbG9yLnZhbHVlLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiBjaGFydF92b3Jvbm9pX2RhdGFfc3Ryb2tlX1dpZHRoLnZhbHVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFiZWxzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIExBQkVMX0NFTlRFUkVEX1BST1BTKSwgeyBmaWxsOiBjaGFydF92b3Jvbm9pX2xhYmVsc19GaWxsLnZhbHVlLCBwYWRkaW5nOiBjaGFydF92b3Jvbm9pX2xhYmVsc19QYWRkaW5nLnZhbHVlLCBwb2ludGVyRXZlbnRzOiBjaGFydF92b3Jvbm9pX2xhYmVsc19Qb2ludGVyRXZlbnRzLnZhbHVlIH0pLFxuICAgICAgICAgICAgLy8gTm90ZTogVGhlc2UgcHJvcGVydGllcyBvdmVycmlkZSB0b29sdGlwXG4gICAgICAgICAgICBmbHlvdXQ6IHtcbiAgICAgICAgICAgICAgICBmaWxsOiBjaGFydF92b3Jvbm9pX2ZseW91dF9zdHJva2VfRmlsbC52YWx1ZSxcbiAgICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzOiBjaGFydF92b3Jvbm9pX2ZseW91dF9Qb2ludGVyRXZlbnRzLnZhbHVlLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogY2hhcnRfdm9yb25vaV9mbHlvdXRfc3Ryb2tlX0NvbG9yLnZhbHVlLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiBjaGFydF92b3Jvbm9pX2ZseW91dF9zdHJva2VfV2lkdGgudmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB9KVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2UtdGhlbWUuanMubWFwIiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2J1bGxldF9IZWlnaHQgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYnVsbGV0LS1IZWlnaHRcIixcbiAgXCJ2YWx1ZVwiOiAxNDAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYnVsbGV0LS1IZWlnaHQpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9idWxsZXRfSGVpZ2h0OyIsImV4cG9ydCBjb25zdCBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9GaWxsX0NvbG9yID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWJ1bGxldC0tY29tcGFyYXRpdmUtbWVhc3VyZS0tRmlsbC0tQ29sb3JcIixcbiAgXCJ2YWx1ZVwiOiBcIiM0ZjUyNTVcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1idWxsZXQtLWNvbXBhcmF0aXZlLW1lYXN1cmUtLUZpbGwtLUNvbG9yKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfRmlsbF9Db2xvcjsiLCJleHBvcnQgY29uc3QgY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfc3Ryb2tlX0NvbG9yID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWJ1bGxldC0tY29tcGFyYXRpdmUtbWVhc3VyZS0tc3Ryb2tlLS1Db2xvclwiLFxuICBcInZhbHVlXCI6IFwiIzRmNTI1NVwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWJ1bGxldC0tY29tcGFyYXRpdmUtbWVhc3VyZS0tc3Ryb2tlLS1Db2xvcilcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX3N0cm9rZV9Db2xvcjsiLCJleHBvcnQgY29uc3QgY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfc3Ryb2tlX1dpZHRoID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWJ1bGxldC0tY29tcGFyYXRpdmUtbWVhc3VyZS0tc3Ryb2tlLS1XaWR0aFwiLFxuICBcInZhbHVlXCI6IDEsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYnVsbGV0LS1jb21wYXJhdGl2ZS1tZWFzdXJlLS1zdHJva2UtLVdpZHRoKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfc3Ryb2tlX1dpZHRoOyIsImV4cG9ydCBjb25zdCBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9lcnJvcl9GaWxsX0NvbG9yID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWJ1bGxldC0tY29tcGFyYXRpdmUtbWVhc3VyZS0tZXJyb3ItLUZpbGwtLUNvbG9yXCIsXG4gIFwidmFsdWVcIjogXCIjYzkxOTBiXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYnVsbGV0LS1jb21wYXJhdGl2ZS1tZWFzdXJlLS1lcnJvci0tRmlsbC0tQ29sb3IpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9lcnJvcl9GaWxsX0NvbG9yOyIsImV4cG9ydCBjb25zdCBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9lcnJvcl9zdHJva2VfQ29sb3IgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYnVsbGV0LS1jb21wYXJhdGl2ZS1tZWFzdXJlLS1lcnJvci0tc3Ryb2tlLS1Db2xvclwiLFxuICBcInZhbHVlXCI6IFwiI2M5MTkwYlwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWJ1bGxldC0tY29tcGFyYXRpdmUtbWVhc3VyZS0tZXJyb3ItLXN0cm9rZS0tQ29sb3IpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9lcnJvcl9zdHJva2VfQ29sb3I7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX2Vycm9yX3N0cm9rZV9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1idWxsZXQtLWNvbXBhcmF0aXZlLW1lYXN1cmUtLWVycm9yLS1zdHJva2UtLVdpZHRoXCIsXG4gIFwidmFsdWVcIjogMixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1idWxsZXQtLWNvbXBhcmF0aXZlLW1lYXN1cmUtLWVycm9yLS1zdHJva2UtLVdpZHRoKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfZXJyb3Jfc3Ryb2tlX1dpZHRoOyIsImV4cG9ydCBjb25zdCBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV93YXJuaW5nX0ZpbGxfQ29sb3IgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYnVsbGV0LS1jb21wYXJhdGl2ZS1tZWFzdXJlLS13YXJuaW5nLS1GaWxsLS1Db2xvclwiLFxuICBcInZhbHVlXCI6IFwiI2VjN2EwOFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWJ1bGxldC0tY29tcGFyYXRpdmUtbWVhc3VyZS0td2FybmluZy0tRmlsbC0tQ29sb3IpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV93YXJuaW5nX0ZpbGxfQ29sb3I7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX3dhcm5pbmdfc3Ryb2tlX0NvbG9yID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWJ1bGxldC0tY29tcGFyYXRpdmUtbWVhc3VyZS0td2FybmluZy0tc3Ryb2tlLS1Db2xvclwiLFxuICBcInZhbHVlXCI6IFwiI2VjN2EwOFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWJ1bGxldC0tY29tcGFyYXRpdmUtbWVhc3VyZS0td2FybmluZy0tc3Ryb2tlLS1Db2xvcilcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX3dhcm5pbmdfc3Ryb2tlX0NvbG9yOyIsImV4cG9ydCBjb25zdCBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV93YXJuaW5nX3N0cm9rZV9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1idWxsZXQtLWNvbXBhcmF0aXZlLW1lYXN1cmUtLXdhcm5pbmctLXN0cm9rZS0tV2lkdGhcIixcbiAgXCJ2YWx1ZVwiOiAyLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWJ1bGxldC0tY29tcGFyYXRpdmUtbWVhc3VyZS0td2FybmluZy0tc3Ryb2tlLS1XaWR0aClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX3dhcm5pbmdfc3Ryb2tlX1dpZHRoOyIsImV4cG9ydCBjb25zdCBjaGFydF9idWxsZXRfZ3JvdXBfdGl0bGVfZGl2aWRlcl9GaWxsX0NvbG9yID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWJ1bGxldC0tZ3JvdXAtdGl0bGUtLWRpdmlkZXItLUZpbGwtLUNvbG9yXCIsXG4gIFwidmFsdWVcIjogXCIjZjBmMGYwXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYnVsbGV0LS1ncm91cC10aXRsZS0tZGl2aWRlci0tRmlsbC0tQ29sb3IpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9idWxsZXRfZ3JvdXBfdGl0bGVfZGl2aWRlcl9GaWxsX0NvbG9yOyIsImV4cG9ydCBjb25zdCBjaGFydF9idWxsZXRfZ3JvdXBfdGl0bGVfZGl2aWRlcl9zdHJva2VfQ29sb3IgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYnVsbGV0LS1ncm91cC10aXRsZS0tZGl2aWRlci0tc3Ryb2tlLS1Db2xvclwiLFxuICBcInZhbHVlXCI6IFwiI2YwZjBmMFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWJ1bGxldC0tZ3JvdXAtdGl0bGUtLWRpdmlkZXItLXN0cm9rZS0tQ29sb3IpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9idWxsZXRfZ3JvdXBfdGl0bGVfZGl2aWRlcl9zdHJva2VfQ29sb3I7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2J1bGxldF9ncm91cF90aXRsZV9kaXZpZGVyX3N0cm9rZV9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1idWxsZXQtLWdyb3VwLXRpdGxlLS1kaXZpZGVyLS1zdHJva2UtLVdpZHRoXCIsXG4gIFwidmFsdWVcIjogMixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1idWxsZXQtLWdyb3VwLXRpdGxlLS1kaXZpZGVyLS1zdHJva2UtLVdpZHRoKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYnVsbGV0X2dyb3VwX3RpdGxlX2RpdmlkZXJfc3Ryb2tlX1dpZHRoOyIsImV4cG9ydCBjb25zdCBjaGFydF9jb2xvcl9yZWRfMTAwID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNvbG9yLXJlZC0xMDBcIixcbiAgXCJ2YWx1ZVwiOiBcIiNjOTE5MGJcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1jb2xvci1yZWQtMTAwKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfY29sb3JfcmVkXzEwMDsiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfcmVkXzIwMCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1jb2xvci1yZWQtMjAwXCIsXG4gIFwidmFsdWVcIjogXCIjYTMwMDAwXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3ItcmVkLTIwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX3JlZF8yMDA7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2NvbG9yX3JlZF8zMDAgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtY29sb3ItcmVkLTMwMFwiLFxuICBcInZhbHVlXCI6IFwiIzdkMTAwN1wiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWNvbG9yLXJlZC0zMDApXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9jb2xvcl9yZWRfMzAwOyIsImV4cG9ydCBjb25zdCBjaGFydF9jb2xvcl9yZWRfNDAwID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWNvbG9yLXJlZC00MDBcIixcbiAgXCJ2YWx1ZVwiOiBcIiM0NzAwMDBcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1jb2xvci1yZWQtNDAwKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfY29sb3JfcmVkXzQwMDsiLCJleHBvcnQgY29uc3QgY2hhcnRfY29sb3JfcmVkXzUwMCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1jb2xvci1yZWQtNTAwXCIsXG4gIFwidmFsdWVcIjogXCIjMmMwMDAwXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtY29sb3ItcmVkLTUwMClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2NvbG9yX3JlZF81MDA7IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgY2hhcnRfYnVsbGV0X0hlaWdodCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X0hlaWdodCc7XG5pbXBvcnQgY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfRmlsbF9Db2xvciBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfRmlsbF9Db2xvcic7XG5pbXBvcnQgY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfc3Ryb2tlX0NvbG9yIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9zdHJva2VfQ29sb3InO1xuaW1wb3J0IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX3N0cm9rZV9XaWR0aCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfc3Ryb2tlX1dpZHRoJztcbmltcG9ydCBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9lcnJvcl9GaWxsX0NvbG9yIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9lcnJvcl9GaWxsX0NvbG9yJztcbmltcG9ydCBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9lcnJvcl9zdHJva2VfQ29sb3IgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX2Vycm9yX3N0cm9rZV9Db2xvcic7XG5pbXBvcnQgY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfZXJyb3Jfc3Ryb2tlX1dpZHRoIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9lcnJvcl9zdHJva2VfV2lkdGgnO1xuaW1wb3J0IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX3dhcm5pbmdfRmlsbF9Db2xvciBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfd2FybmluZ19GaWxsX0NvbG9yJztcbmltcG9ydCBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV93YXJuaW5nX3N0cm9rZV9Db2xvciBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfd2FybmluZ19zdHJva2VfQ29sb3InO1xuaW1wb3J0IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX3dhcm5pbmdfc3Ryb2tlX1dpZHRoIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV93YXJuaW5nX3N0cm9rZV9XaWR0aCc7XG5pbXBvcnQgY2hhcnRfYnVsbGV0X2dyb3VwX3RpdGxlX2RpdmlkZXJfRmlsbF9Db2xvciBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X2dyb3VwX3RpdGxlX2RpdmlkZXJfRmlsbF9Db2xvcic7XG5pbXBvcnQgY2hhcnRfYnVsbGV0X2dyb3VwX3RpdGxlX2RpdmlkZXJfc3Ryb2tlX0NvbG9yIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9idWxsZXRfZ3JvdXBfdGl0bGVfZGl2aWRlcl9zdHJva2VfQ29sb3InO1xuaW1wb3J0IGNoYXJ0X2J1bGxldF9ncm91cF90aXRsZV9kaXZpZGVyX3N0cm9rZV9XaWR0aCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X2dyb3VwX3RpdGxlX2RpdmlkZXJfc3Ryb2tlX1dpZHRoJztcbmltcG9ydCBjaGFydF9jb2xvcl9ibGFja18xMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsYWNrXzEwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmxhY2tfMjAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibGFja18yMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsYWNrXzMwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmxhY2tfMzAwJztcbmltcG9ydCBjaGFydF9jb2xvcl9ibGFja180MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX2JsYWNrXzQwMCc7XG5pbXBvcnQgY2hhcnRfY29sb3JfYmxhY2tfNTAwIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9jb2xvcl9ibGFja181MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX3JlZF8xMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX3JlZF8xMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX3JlZF8yMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX3JlZF8yMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX3JlZF8zMDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX3JlZF8zMDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX3JlZF80MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX3JlZF80MDAnO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX3JlZF81MDAgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2NvbG9yX3JlZF81MDAnO1xuaW1wb3J0IGNoYXJ0X2dsb2JhbF9sYXlvdXRfUGFkZGluZyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZ2xvYmFsX2xheW91dF9QYWRkaW5nJztcbi8vIFNlZSBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFjdzEwcEpGWFdydUIxU0E4VFF3aXR1eG41U3M2S3B4WVBDT1lHckg4cUFZL2VkaXQjXG4vLyBTZWUgaHR0cHM6Ly93d3cucGF0dGVybmZseS5vcmcvdjMvcGF0dGVybi1saWJyYXJ5L2RhdGEtdmlzdWFsaXphdGlvbi9idWxsZXQtY2hhcnQvI2Rlc2lnblxuLy8gQnVsbGV0IHRoZW1lXG5leHBvcnQgY29uc3QgQnVsbGV0VGhlbWUgPSB7XG4gICAgY2hhcnQ6IHtcbiAgICAgICAgaGVpZ2h0OiBjaGFydF9idWxsZXRfSGVpZ2h0LnZhbHVlXG4gICAgfVxufTtcbi8vIEJ1bGxldCBjb21wYXJhdGl2ZSBtZWFzdXJlIGVycm9yIHRoZW1lXG5leHBvcnQgY29uc3QgQnVsbGV0Q29tcGFyYXRpdmVFcnJvck1lYXN1cmVUaGVtZSA9IHtcbiAgICBiYXI6IHtcbiAgICAgICAgaGVpZ2h0OiBjaGFydF9idWxsZXRfSGVpZ2h0LnZhbHVlLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGZpbGw6IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX2Vycm9yX0ZpbGxfQ29sb3IudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9lcnJvcl9zdHJva2VfQ29sb3IudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX2Vycm9yX3N0cm9rZV9XaWR0aC52YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbi8vIEJ1bGxldCBjb21wYXJhdGl2ZSBtZWFzdXJlIHRoZW1lXG5leHBvcnQgY29uc3QgQnVsbGV0Q29tcGFyYXRpdmVNZWFzdXJlVGhlbWUgPSB7XG4gICAgYmFyOiB7XG4gICAgICAgIGhlaWdodDogY2hhcnRfYnVsbGV0X0hlaWdodC52YWx1ZSxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBmaWxsOiBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9GaWxsX0NvbG9yLnZhbHVlLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfc3Ryb2tlX0NvbG9yLnZhbHVlLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9zdHJva2VfV2lkdGgudmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG4vLyBCdWxsZXQgY29tcGFyYXRpdmUgbWVhc3VyZSB3YXJuaW5nIHRoZW1lXG5leHBvcnQgY29uc3QgQnVsbGV0Q29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZVRoZW1lID0ge1xuICAgIGJhcjoge1xuICAgICAgICBoZWlnaHQ6IGNoYXJ0X2J1bGxldF9IZWlnaHQudmFsdWUsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZmlsbDogY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfd2FybmluZ19GaWxsX0NvbG9yLnZhbHVlLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfd2FybmluZ19zdHJva2VfQ29sb3IudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX3dhcm5pbmdfc3Ryb2tlX1dpZHRoLnZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuLy8gQnVsbGV0IGdyb3VwIHRpdGxlIHRoZW1lXG5leHBvcnQgY29uc3QgQnVsbGV0R3JvdXBUaXRsZVRoZW1lID0ge1xuICAgIGNoYXJ0OiB7XG4gICAgICAgIHBhZGRpbmc6IHtcbiAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgIHRvcDogY2hhcnRfZ2xvYmFsX2xheW91dF9QYWRkaW5nLnZhbHVlXG4gICAgICAgIH0gLy8gVmljdG9yeSBpbmNvcnJlY3RseSB0eXBlZCBUaGVtZUJhc2VQcm9wcy5wYWRkaW5nIGFzIG51bWJlciBpbnN0ZWFkIG9mIFBhZGRpbmdQcm9wc1xuICAgIH0sXG4gICAgbGluZToge1xuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGZpbGw6IGNoYXJ0X2J1bGxldF9ncm91cF90aXRsZV9kaXZpZGVyX0ZpbGxfQ29sb3IudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjaGFydF9idWxsZXRfZ3JvdXBfdGl0bGVfZGl2aWRlcl9zdHJva2VfQ29sb3IudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGNoYXJ0X2J1bGxldF9ncm91cF90aXRsZV9kaXZpZGVyX3N0cm9rZV9XaWR0aC52YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbi8vIEJ1bGxldCBwcmltYXJ5IGRvdCBtZWFzdXJlIHRoZW1lXG5leHBvcnQgY29uc3QgQnVsbGV0UHJpbWFyeURvdE1lYXN1cmVUaGVtZSA9IHtcbiAgICBncm91cDoge1xuICAgICAgICBoZWlnaHQ6IGNoYXJ0X2J1bGxldF9IZWlnaHQudmFsdWVcbiAgICB9XG59O1xuLy8gQnVsbGV0IHByaW1hcnkgbmVnYXRpdmUgbWVhc3VyZSB0aGVtZVxuZXhwb3J0IGNvbnN0IEJ1bGxldFByaW1hcnlOZWdhdGl2ZU1lYXN1cmVUaGVtZSA9IHtcbiAgICBncm91cDoge1xuICAgICAgICBjb2xvclNjYWxlOiBbXG4gICAgICAgICAgICBjaGFydF9jb2xvcl9yZWRfMTAwLnZhbHVlLFxuICAgICAgICAgICAgY2hhcnRfY29sb3JfcmVkXzIwMC52YWx1ZSxcbiAgICAgICAgICAgIGNoYXJ0X2NvbG9yX3JlZF8zMDAudmFsdWUsXG4gICAgICAgICAgICBjaGFydF9jb2xvcl9yZWRfNDAwLnZhbHVlLFxuICAgICAgICAgICAgY2hhcnRfY29sb3JfcmVkXzUwMC52YWx1ZVxuICAgICAgICBdLFxuICAgICAgICBoZWlnaHQ6IGNoYXJ0X2J1bGxldF9IZWlnaHQudmFsdWVcbiAgICB9XG59O1xuLy8gQnVsbGV0IHByaW1hcnkgc2VnbWVudGVkIG1lYXN1cmUgdGhlbWVcbmV4cG9ydCBjb25zdCBCdWxsZXRQcmltYXJ5U2VnbWVudGVkTWVhc3VyZVRoZW1lID0ge1xuICAgIGdyb3VwOiB7XG4gICAgICAgIGhlaWdodDogY2hhcnRfYnVsbGV0X0hlaWdodC52YWx1ZVxuICAgIH1cbn07XG4vLyBCdWxsZXQgcXVhbGl0YXRpdmUgcmFuZ2UgdGhlbWVcbmV4cG9ydCBjb25zdCBCdWxsZXRRdWFsaXRhdGl2ZVJhbmdlVGhlbWUgPSB7XG4gICAgZ3JvdXA6IHtcbiAgICAgICAgY29sb3JTY2FsZTogW1xuICAgICAgICAgICAgY2hhcnRfY29sb3JfYmxhY2tfMTAwLnZhbHVlLFxuICAgICAgICAgICAgY2hhcnRfY29sb3JfYmxhY2tfMjAwLnZhbHVlLFxuICAgICAgICAgICAgY2hhcnRfY29sb3JfYmxhY2tfMzAwLnZhbHVlLFxuICAgICAgICAgICAgY2hhcnRfY29sb3JfYmxhY2tfNDAwLnZhbHVlLFxuICAgICAgICAgICAgY2hhcnRfY29sb3JfYmxhY2tfNTAwLnZhbHVlXG4gICAgICAgIF0sXG4gICAgICAgIGhlaWdodDogY2hhcnRfYnVsbGV0X0hlaWdodC52YWx1ZVxuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idWxsZXQtdGhlbWUuanMubWFwIiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2RvbnV0X3BpZV9IZWlnaHQgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZG9udXQtLXBpZS0tSGVpZ2h0XCIsXG4gIFwidmFsdWVcIjogMjMwLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWRvbnV0LS1waWUtLUhlaWdodClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2RvbnV0X3BpZV9IZWlnaHQ7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2RvbnV0X3BpZV9hbmdsZV9QYWRkaW5nID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWRvbnV0LS1waWUtLWFuZ2xlLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogMSxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1kb251dC0tcGllLS1hbmdsZS0tUGFkZGluZylcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2RvbnV0X3BpZV9hbmdsZV9QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9kb251dF9waWVfUGFkZGluZyA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1kb251dC0tcGllLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogMjAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZG9udXQtLXBpZS0tUGFkZGluZylcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2RvbnV0X3BpZV9QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9kb251dF9waWVfV2lkdGggPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZG9udXQtLXBpZS0tV2lkdGhcIixcbiAgXCJ2YWx1ZVwiOiAyMzAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZG9udXQtLXBpZS0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9kb251dF9waWVfV2lkdGg7IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgY2hhcnRfZG9udXRfcGllX0hlaWdodCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfcGllX0hlaWdodCc7XG5pbXBvcnQgY2hhcnRfZG9udXRfcGllX2FuZ2xlX1BhZGRpbmcgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2RvbnV0X3BpZV9hbmdsZV9QYWRkaW5nJztcbmltcG9ydCBjaGFydF9kb251dF9waWVfUGFkZGluZyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfcGllX1BhZGRpbmcnO1xuaW1wb3J0IGNoYXJ0X2RvbnV0X3BpZV9XaWR0aCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfcGllX1dpZHRoJztcbi8vIERvbnV0IHRoZW1lXG5leHBvcnQgY29uc3QgRG9udXRUaGVtZSA9IHtcbiAgICBwaWU6IHtcbiAgICAgICAgaGVpZ2h0OiBjaGFydF9kb251dF9waWVfSGVpZ2h0LnZhbHVlLFxuICAgICAgICBwYWRkaW5nOiBjaGFydF9kb251dF9waWVfUGFkZGluZy52YWx1ZSxcbiAgICAgICAgcGFkQW5nbGU6IGNoYXJ0X2RvbnV0X3BpZV9hbmdsZV9QYWRkaW5nLnZhbHVlLFxuICAgICAgICB3aWR0aDogY2hhcnRfZG9udXRfcGllX1dpZHRoLnZhbHVlXG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRvbnV0LXRoZW1lLmpzLm1hcCIsImV4cG9ydCBjb25zdCBjaGFydF90aHJlc2hvbGRfc3Ryb2tlX2Rhc2hfYXJyYXkgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtdGhyZXNob2xkLS1zdHJva2UtZGFzaC1hcnJheVwiLFxuICBcInZhbHVlXCI6IFwiNCwyXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtdGhyZXNob2xkLS1zdHJva2UtZGFzaC1hcnJheSlcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X3RocmVzaG9sZF9zdHJva2VfZGFzaF9hcnJheTsiLCJleHBvcnQgY29uc3QgY2hhcnRfdGhyZXNob2xkX3N0cm9rZV9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC10aHJlc2hvbGQtLXN0cm9rZS0tV2lkdGhcIixcbiAgXCJ2YWx1ZVwiOiAxLjUsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtdGhyZXNob2xkLS1zdHJva2UtLVdpZHRoKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfdGhyZXNob2xkX3N0cm9rZV9XaWR0aDsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCBjaGFydF90aHJlc2hvbGRfc3Ryb2tlX2Rhc2hfYXJyYXkgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3RocmVzaG9sZF9zdHJva2VfZGFzaF9hcnJheSc7XG5pbXBvcnQgY2hhcnRfdGhyZXNob2xkX3N0cm9rZV9XaWR0aCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfdGhyZXNob2xkX3N0cm9rZV9XaWR0aCc7XG4vLyBUaHJlc2hvbGQgdGhlbWVcbmV4cG9ydCBjb25zdCBUaHJlc2hvbGRUaGVtZSA9IHtcbiAgICBsaW5lOiB7XG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgc3Ryb2tlRGFzaGFycmF5OiBjaGFydF90aHJlc2hvbGRfc3Ryb2tlX2Rhc2hfYXJyYXkudmFsdWUsXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGNoYXJ0X3RocmVzaG9sZF9zdHJva2VfV2lkdGgudmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aHJlc2hvbGQtdGhlbWUuanMubWFwIiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2RvbnV0X3RocmVzaG9sZF9maXJzdF9Db2xvciA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1kb251dC0tdGhyZXNob2xkLS1maXJzdC0tQ29sb3JcIixcbiAgXCJ2YWx1ZVwiOiBcIiNmMGYwZjBcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1kb251dC0tdGhyZXNob2xkLS1maXJzdC0tQ29sb3IpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9kb251dF90aHJlc2hvbGRfZmlyc3RfQ29sb3I7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2RvbnV0X3RocmVzaG9sZF9zZWNvbmRfQ29sb3IgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZG9udXQtLXRocmVzaG9sZC0tc2Vjb25kLS1Db2xvclwiLFxuICBcInZhbHVlXCI6IFwiI2QyZDJkMlwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWRvbnV0LS10aHJlc2hvbGQtLXNlY29uZC0tQ29sb3IpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9kb251dF90aHJlc2hvbGRfc2Vjb25kX0NvbG9yOyIsImV4cG9ydCBjb25zdCBjaGFydF9kb251dF90aHJlc2hvbGRfdGhpcmRfQ29sb3IgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZG9udXQtLXRocmVzaG9sZC0tdGhpcmQtLUNvbG9yXCIsXG4gIFwidmFsdWVcIjogXCIjYjhiYmJlXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZG9udXQtLXRocmVzaG9sZC0tdGhpcmQtLUNvbG9yKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZG9udXRfdGhyZXNob2xkX3RoaXJkX0NvbG9yOyIsImV4cG9ydCBjb25zdCBjaGFydF9kb251dF90aHJlc2hvbGRfZHluYW1pY19waWVfSGVpZ2h0ID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWRvbnV0LS10aHJlc2hvbGQtLWR5bmFtaWMtLXBpZS0tSGVpZ2h0XCIsXG4gIFwidmFsdWVcIjogMjAyLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWRvbnV0LS10aHJlc2hvbGQtLWR5bmFtaWMtLXBpZS0tSGVpZ2h0KVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZG9udXRfdGhyZXNob2xkX2R5bmFtaWNfcGllX0hlaWdodDsiLCJleHBvcnQgY29uc3QgY2hhcnRfZG9udXRfdGhyZXNob2xkX2R5bmFtaWNfcGllX1BhZGRpbmcgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZG9udXQtLXRocmVzaG9sZC0tZHluYW1pYy0tcGllLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogMjAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZG9udXQtLXRocmVzaG9sZC0tZHluYW1pYy0tcGllLS1QYWRkaW5nKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZG9udXRfdGhyZXNob2xkX2R5bmFtaWNfcGllX1BhZGRpbmc7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2RvbnV0X3RocmVzaG9sZF9keW5hbWljX3BpZV9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1kb251dC0tdGhyZXNob2xkLS1keW5hbWljLS1waWUtLVdpZHRoXCIsXG4gIFwidmFsdWVcIjogMjAyLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWRvbnV0LS10aHJlc2hvbGQtLWR5bmFtaWMtLXBpZS0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9kb251dF90aHJlc2hvbGRfZHluYW1pY19waWVfV2lkdGg7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2RvbnV0X3RocmVzaG9sZF9zdGF0aWNfcGllX0hlaWdodCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1kb251dC0tdGhyZXNob2xkLS1zdGF0aWMtLXBpZS0tSGVpZ2h0XCIsXG4gIFwidmFsdWVcIjogMjMwLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWRvbnV0LS10aHJlc2hvbGQtLXN0YXRpYy0tcGllLS1IZWlnaHQpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9kb251dF90aHJlc2hvbGRfc3RhdGljX3BpZV9IZWlnaHQ7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2RvbnV0X3RocmVzaG9sZF9zdGF0aWNfcGllX2FuZ2xlX1BhZGRpbmcgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZG9udXQtLXRocmVzaG9sZC0tc3RhdGljLS1waWUtLWFuZ2xlLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogMSxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1kb251dC0tdGhyZXNob2xkLS1zdGF0aWMtLXBpZS0tYW5nbGUtLVBhZGRpbmcpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9kb251dF90aHJlc2hvbGRfc3RhdGljX3BpZV9hbmdsZV9QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9kb251dF90aHJlc2hvbGRfc3RhdGljX3BpZV9QYWRkaW5nID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWRvbnV0LS10aHJlc2hvbGQtLXN0YXRpYy0tcGllLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogMjAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZG9udXQtLXRocmVzaG9sZC0tc3RhdGljLS1waWUtLVBhZGRpbmcpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9kb251dF90aHJlc2hvbGRfc3RhdGljX3BpZV9QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9kb251dF90aHJlc2hvbGRfc3RhdGljX3BpZV9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1kb251dC0tdGhyZXNob2xkLS1zdGF0aWMtLXBpZS0tV2lkdGhcIixcbiAgXCJ2YWx1ZVwiOiAyMzAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZG9udXQtLXRocmVzaG9sZC0tc3RhdGljLS1waWUtLVdpZHRoKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZG9udXRfdGhyZXNob2xkX3N0YXRpY19waWVfV2lkdGg7IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgY2hhcnRfZG9udXRfdGhyZXNob2xkX2ZpcnN0X0NvbG9yIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9kb251dF90aHJlc2hvbGRfZmlyc3RfQ29sb3InO1xuaW1wb3J0IGNoYXJ0X2RvbnV0X3RocmVzaG9sZF9zZWNvbmRfQ29sb3IgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2RvbnV0X3RocmVzaG9sZF9zZWNvbmRfQ29sb3InO1xuaW1wb3J0IGNoYXJ0X2RvbnV0X3RocmVzaG9sZF90aGlyZF9Db2xvciBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdGhyZXNob2xkX3RoaXJkX0NvbG9yJztcbmltcG9ydCBjaGFydF9kb251dF90aHJlc2hvbGRfZHluYW1pY19waWVfSGVpZ2h0IGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9kb251dF90aHJlc2hvbGRfZHluYW1pY19waWVfSGVpZ2h0JztcbmltcG9ydCBjaGFydF9kb251dF90aHJlc2hvbGRfZHluYW1pY19waWVfUGFkZGluZyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdGhyZXNob2xkX2R5bmFtaWNfcGllX1BhZGRpbmcnO1xuaW1wb3J0IGNoYXJ0X2RvbnV0X3RocmVzaG9sZF9keW5hbWljX3BpZV9XaWR0aCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdGhyZXNob2xkX2R5bmFtaWNfcGllX1dpZHRoJztcbmltcG9ydCBjaGFydF9kb251dF90aHJlc2hvbGRfc3RhdGljX3BpZV9IZWlnaHQgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2RvbnV0X3RocmVzaG9sZF9zdGF0aWNfcGllX0hlaWdodCc7XG5pbXBvcnQgY2hhcnRfZG9udXRfdGhyZXNob2xkX3N0YXRpY19waWVfYW5nbGVfUGFkZGluZyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdGhyZXNob2xkX3N0YXRpY19waWVfYW5nbGVfUGFkZGluZyc7XG5pbXBvcnQgY2hhcnRfZG9udXRfdGhyZXNob2xkX3N0YXRpY19waWVfUGFkZGluZyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdGhyZXNob2xkX3N0YXRpY19waWVfUGFkZGluZyc7XG5pbXBvcnQgY2hhcnRfZG9udXRfdGhyZXNob2xkX3N0YXRpY19waWVfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2RvbnV0X3RocmVzaG9sZF9zdGF0aWNfcGllX1dpZHRoJztcbi8vIERvbnV0IHRocmVzaG9sZCBkeW5hbWljIHRoZW1lXG5leHBvcnQgY29uc3QgRG9udXRUaHJlc2hvbGREeW5hbWljVGhlbWUgPSB7XG4gICAgbGVnZW5kOiB7XG4gICAgICAgIGNvbG9yU2NhbGU6IFtjaGFydF9kb251dF90aHJlc2hvbGRfc2Vjb25kX0NvbG9yLnZhbHVlLCBjaGFydF9kb251dF90aHJlc2hvbGRfdGhpcmRfQ29sb3IudmFsdWVdXG4gICAgfSxcbiAgICBwaWU6IHtcbiAgICAgICAgaGVpZ2h0OiBjaGFydF9kb251dF90aHJlc2hvbGRfZHluYW1pY19waWVfSGVpZ2h0LnZhbHVlLFxuICAgICAgICBwYWRkaW5nOiBjaGFydF9kb251dF90aHJlc2hvbGRfZHluYW1pY19waWVfUGFkZGluZy52YWx1ZSxcbiAgICAgICAgd2lkdGg6IGNoYXJ0X2RvbnV0X3RocmVzaG9sZF9keW5hbWljX3BpZV9XaWR0aC52YWx1ZVxuICAgIH1cbn07XG4vLyBEb251dCB0aHJlc2hvbGQgc3RhdGljIHRoZW1lXG5leHBvcnQgY29uc3QgRG9udXRUaHJlc2hvbGRTdGF0aWNUaGVtZSA9IHtcbiAgICBwaWU6IHtcbiAgICAgICAgY29sb3JTY2FsZTogW1xuICAgICAgICAgICAgY2hhcnRfZG9udXRfdGhyZXNob2xkX2ZpcnN0X0NvbG9yLnZhbHVlLFxuICAgICAgICAgICAgY2hhcnRfZG9udXRfdGhyZXNob2xkX3NlY29uZF9Db2xvci52YWx1ZSxcbiAgICAgICAgICAgIGNoYXJ0X2RvbnV0X3RocmVzaG9sZF90aGlyZF9Db2xvci52YWx1ZVxuICAgICAgICBdLFxuICAgICAgICBoZWlnaHQ6IGNoYXJ0X2RvbnV0X3RocmVzaG9sZF9zdGF0aWNfcGllX0hlaWdodC52YWx1ZSxcbiAgICAgICAgcGFkQW5nbGU6IGNoYXJ0X2RvbnV0X3RocmVzaG9sZF9zdGF0aWNfcGllX2FuZ2xlX1BhZGRpbmcudmFsdWUsXG4gICAgICAgIHBhZGRpbmc6IGNoYXJ0X2RvbnV0X3RocmVzaG9sZF9zdGF0aWNfcGllX1BhZGRpbmcudmFsdWUsXG4gICAgICAgIHdpZHRoOiBjaGFydF9kb251dF90aHJlc2hvbGRfc3RhdGljX3BpZV9XaWR0aC52YWx1ZVxuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kb251dC10aHJlc2hvbGQtdGhlbWUuanMubWFwIiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2RvbnV0X3V0aWxpemF0aW9uX2R5bmFtaWNfcGllX0hlaWdodCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1kb251dC0tdXRpbGl6YXRpb24tLWR5bmFtaWMtLXBpZS0tSGVpZ2h0XCIsXG4gIFwidmFsdWVcIjogMjMwLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWRvbnV0LS11dGlsaXphdGlvbi0tZHluYW1pYy0tcGllLS1IZWlnaHQpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9kb251dF91dGlsaXphdGlvbl9keW5hbWljX3BpZV9IZWlnaHQ7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2RvbnV0X3V0aWxpemF0aW9uX2R5bmFtaWNfcGllX2FuZ2xlX1BhZGRpbmcgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZG9udXQtLXV0aWxpemF0aW9uLS1keW5hbWljLS1waWUtLWFuZ2xlLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogMSxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1kb251dC0tdXRpbGl6YXRpb24tLWR5bmFtaWMtLXBpZS0tYW5nbGUtLVBhZGRpbmcpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9kb251dF91dGlsaXphdGlvbl9keW5hbWljX3BpZV9hbmdsZV9QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9kb251dF91dGlsaXphdGlvbl9keW5hbWljX3BpZV9QYWRkaW5nID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWRvbnV0LS11dGlsaXphdGlvbi0tZHluYW1pYy0tcGllLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogMjAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZG9udXQtLXV0aWxpemF0aW9uLS1keW5hbWljLS1waWUtLVBhZGRpbmcpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9kb251dF91dGlsaXphdGlvbl9keW5hbWljX3BpZV9QYWRkaW5nOyIsImV4cG9ydCBjb25zdCBjaGFydF9kb251dF91dGlsaXphdGlvbl9keW5hbWljX3BpZV9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1kb251dC0tdXRpbGl6YXRpb24tLWR5bmFtaWMtLXBpZS0tV2lkdGhcIixcbiAgXCJ2YWx1ZVwiOiAyMzAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZG9udXQtLXV0aWxpemF0aW9uLS1keW5hbWljLS1waWUtLVdpZHRoKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZG9udXRfdXRpbGl6YXRpb25fZHluYW1pY19waWVfV2lkdGg7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2RvbnV0X3V0aWxpemF0aW9uX3N0YXRpY19waWVfUGFkZGluZyA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1kb251dC0tdXRpbGl6YXRpb24tLXN0YXRpYy0tcGllLS1QYWRkaW5nXCIsXG4gIFwidmFsdWVcIjogMjAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZG9udXQtLXV0aWxpemF0aW9uLS1zdGF0aWMtLXBpZS0tUGFkZGluZylcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2RvbnV0X3V0aWxpemF0aW9uX3N0YXRpY19waWVfUGFkZGluZzsiLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCBjaGFydF9kb251dF90aHJlc2hvbGRfZmlyc3RfQ29sb3IgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2RvbnV0X3RocmVzaG9sZF9maXJzdF9Db2xvcic7XG5pbXBvcnQgY2hhcnRfZG9udXRfdGhyZXNob2xkX3NlY29uZF9Db2xvciBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdGhyZXNob2xkX3NlY29uZF9Db2xvcic7XG5pbXBvcnQgY2hhcnRfZG9udXRfdGhyZXNob2xkX3RoaXJkX0NvbG9yIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9kb251dF90aHJlc2hvbGRfdGhpcmRfQ29sb3InO1xuaW1wb3J0IGNoYXJ0X2RvbnV0X3V0aWxpemF0aW9uX2R5bmFtaWNfcGllX0hlaWdodCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdXRpbGl6YXRpb25fZHluYW1pY19waWVfSGVpZ2h0JztcbmltcG9ydCBjaGFydF9kb251dF91dGlsaXphdGlvbl9keW5hbWljX3BpZV9hbmdsZV9QYWRkaW5nIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9kb251dF91dGlsaXphdGlvbl9keW5hbWljX3BpZV9hbmdsZV9QYWRkaW5nJztcbmltcG9ydCBjaGFydF9kb251dF91dGlsaXphdGlvbl9keW5hbWljX3BpZV9QYWRkaW5nIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9kb251dF91dGlsaXphdGlvbl9keW5hbWljX3BpZV9QYWRkaW5nJztcbmltcG9ydCBjaGFydF9kb251dF91dGlsaXphdGlvbl9keW5hbWljX3BpZV9XaWR0aCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdXRpbGl6YXRpb25fZHluYW1pY19waWVfV2lkdGgnO1xuaW1wb3J0IGNoYXJ0X2RvbnV0X3V0aWxpemF0aW9uX3N0YXRpY19waWVfUGFkZGluZyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdXRpbGl6YXRpb25fc3RhdGljX3BpZV9QYWRkaW5nJztcbi8vIERvbnV0IHV0aWxpemF0aW9uIGR5bmFtaWMgdGhlbWVcbmV4cG9ydCBjb25zdCBEb251dFV0aWxpemF0aW9uRHluYW1pY1RoZW1lID0ge1xuICAgIHBpZToge1xuICAgICAgICBoZWlnaHQ6IGNoYXJ0X2RvbnV0X3V0aWxpemF0aW9uX2R5bmFtaWNfcGllX0hlaWdodC52YWx1ZSxcbiAgICAgICAgcGFkZGluZzogY2hhcnRfZG9udXRfdXRpbGl6YXRpb25fZHluYW1pY19waWVfUGFkZGluZy52YWx1ZSxcbiAgICAgICAgcGFkQW5nbGU6IGNoYXJ0X2RvbnV0X3V0aWxpemF0aW9uX2R5bmFtaWNfcGllX2FuZ2xlX1BhZGRpbmcudmFsdWUsXG4gICAgICAgIHdpZHRoOiBjaGFydF9kb251dF91dGlsaXphdGlvbl9keW5hbWljX3BpZV9XaWR0aC52YWx1ZVxuICAgIH1cbn07XG4vLyBEb251dCB1dGlsaXphdGlvbiBzdGF0aWMgdGhlbWVcbmV4cG9ydCBjb25zdCBEb251dFV0aWxpemF0aW9uU3RhdGljVGhlbWUgPSB7XG4gICAgbGVnZW5kOiB7XG4gICAgICAgIGNvbG9yU2NhbGU6IFtcbiAgICAgICAgICAgIGNoYXJ0X2RvbnV0X3RocmVzaG9sZF9maXJzdF9Db2xvci52YWx1ZSxcbiAgICAgICAgICAgIGNoYXJ0X2RvbnV0X3RocmVzaG9sZF9zZWNvbmRfQ29sb3IudmFsdWUsXG4gICAgICAgICAgICBjaGFydF9kb251dF90aHJlc2hvbGRfdGhpcmRfQ29sb3IudmFsdWVcbiAgICAgICAgXVxuICAgIH0sXG4gICAgcGllOiB7XG4gICAgICAgIGNvbG9yU2NhbGU6IFtjaGFydF9kb251dF90aHJlc2hvbGRfZmlyc3RfQ29sb3IudmFsdWVdLFxuICAgICAgICBwYWRkaW5nOiBjaGFydF9kb251dF91dGlsaXphdGlvbl9zdGF0aWNfcGllX1BhZGRpbmcudmFsdWVcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZG9udXQtdXRpbGl6YXRpb24tdGhlbWUuanMubWFwIiwiaW1wb3J0IHsgQXhpc1RoZW1lIH0gZnJvbSAnLi90aGVtZXMvYXhpcy10aGVtZSc7XG5pbXBvcnQgeyBCYXNlVGhlbWUgfSBmcm9tICcuL3RoZW1lcy9iYXNlLXRoZW1lJztcbmltcG9ydCB7IEJ1bGxldFRoZW1lLCBCdWxsZXRDb21wYXJhdGl2ZUVycm9yTWVhc3VyZVRoZW1lLCBCdWxsZXRDb21wYXJhdGl2ZU1lYXN1cmVUaGVtZSwgQnVsbGV0Q29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZVRoZW1lLCBCdWxsZXRHcm91cFRpdGxlVGhlbWUsIEJ1bGxldFByaW1hcnlEb3RNZWFzdXJlVGhlbWUsIEJ1bGxldFByaW1hcnlOZWdhdGl2ZU1lYXN1cmVUaGVtZSwgQnVsbGV0UHJpbWFyeVNlZ21lbnRlZE1lYXN1cmVUaGVtZSwgQnVsbGV0UXVhbGl0YXRpdmVSYW5nZVRoZW1lIH0gZnJvbSAnLi90aGVtZXMvYnVsbGV0LXRoZW1lJztcbmltcG9ydCB7IERvbnV0VGhlbWUgfSBmcm9tICcuL3RoZW1lcy9kb251dC10aGVtZSc7XG5pbXBvcnQgeyBUaHJlc2hvbGRUaGVtZSB9IGZyb20gJy4vdGhlbWVzL3RocmVzaG9sZC10aGVtZSc7XG5pbXBvcnQgeyBEb251dFRocmVzaG9sZER5bmFtaWNUaGVtZSwgRG9udXRUaHJlc2hvbGRTdGF0aWNUaGVtZSB9IGZyb20gJy4vdGhlbWVzL2RvbnV0LXRocmVzaG9sZC10aGVtZSc7XG5pbXBvcnQgeyBEb251dFV0aWxpemF0aW9uRHluYW1pY1RoZW1lLCBEb251dFV0aWxpemF0aW9uU3RhdGljVGhlbWUgfSBmcm9tICcuL3RoZW1lcy9kb251dC11dGlsaXphdGlvbi10aGVtZSc7XG4vKipcbiAqIFRoZSBjb2xvciBmYW1pbHkgdG8gYmUgYXBwbGllZCB0byBhIHRoZW1lLiBGb3IgZXhhbXBsZSwgJ2JsdWUnIHJlcHJlc2VudHMgYW4gb3JkZXJlZCBsaXN0IG9mIGNvbG9yc1xuICogKGkuZS4sIGEgY29sb3Igc2NhbGUpIGNvbXBvc2VkIGZyb20gdGhlIGJsdWUgY29sb3IgZmFtaWx5IGRlZmluZWQgYnkgUGF0dGVybkZseSBjb3JlLlxuICpcbiAqIEZvciBleGFtcGxlLCB0aGUgJ2JsdWUnIGNvbG9yIHNjYWxlIGxvb2tzIGxpa2U6XG4gKlxuICogY2hhcnRfY29sb3JfYmx1ZV8xMDBcbiAqIGNoYXJ0X2NvbG9yX2JsdWVfMjAwXG4gKiBjaGFydF9jb2xvcl9ibHVlXzMwMFxuICogY2hhcnRfY29sb3JfYmx1ZV80MDBcbiAqIGNoYXJ0X2NvbG9yX2JsdWVfNTAwXG4gKlxuICogSW4gdGhpcyBjYXNlLCB0aGUgY2hhcnRfY29sb3JfYmx1ZV8xMDAgdmFsdWUgd291bGQgYmUgYXBwbGllZCB0byB0aGUgZmlyc3QgZGF0YSBwb2ludCBpbiBhIGNoYXJ0LlxuICogVGhlIGNoYXJ0X2NvbG9yX2JsdWVfMjAwIHZhbHVlIHdvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHNlY29uZCBkYXRhIHBvaW50IGluIGEgY2hhcnQuIEFuZCBzbyBvbi4uLlxuICpcbiAqIElmIGxlZ2VuZCBkYXRhIGlzIHByb3ZpZGVkIHRvIGEgY2hhcnQsIHRob3NlIGNvbG9ycyB3b3VsZCBiZSBzeW5jZWQgd2l0aCB0aGUgbGVnZW5kIGFzIHdlbGwuXG4gKlxuICogVGhlICdtdWx0aU9yZGVyZWQnIGNvbG9yIGZhbWlseSBpcyBpbnRlbmRlZCBmb3Igb3JkZXJlZCBjaGFydHM7IGRvbnV0LCBwaWUsIGJhciwgJiBzdGFja1xuICogVGhlICdtdWx0aVVub3JkZXJlZCcgY29sb3IgZmFtaWx5IGlzIGludGVuZGVkIGZvciB1bm9yZGVyZWQgY2hhcnRzOyBhcmVhICYgbGluZVxuICogVGhlICdtdWx0aScgZGVmYXVsdHMgdG8gdGhlICdtdWx0aU9yZGVyZWQnIGNvbG9yIGZhbWlseVxuICpcbiAqIE5vdGU6IFRoZXNlIHZhbHVlcyBhcmUgbm90IGludGVuZGVkIHRvIGJlIGFwcGxpZWQgZGlyZWN0bHkgYXMgYSBjb21wb25lbnQncyBmaWxsIHN0eWxlLiBGb3IgZXhhbXBsZSwgXCJtdWx0aVwiIHdvdWxkXG4gKiBub3QgYmUgYSB2YWxpZCBmaWxsIGNvbG9yLiBQbGVhc2UgdXNlIGNoYXJ0IHZhcmlhYmxlcyBmcm9tIFBhdHRlcm5GbHkgY29yZSAoZS5nLiwgdmlhIHRoZSByZWFjdC1jaGFydHMgcGFja2FnZSlcbiAqL1xuZXhwb3J0IGNvbnN0IENoYXJ0VGhlbWVDb2xvciA9IHtcbiAgICBibHVlOiAnYmx1ZScsXG4gICAgY3lhbjogJ2N5YW4nLFxuICAgIGRlZmF1bHQ6ICdibHVlJyxcbiAgICBnb2xkOiAnZ29sZCcsXG4gICAgZ3JheTogJ2dyYXknLFxuICAgIGdyZWVuOiAnZ3JlZW4nLFxuICAgIG11bHRpOiAnbXVsdGknLFxuICAgIG11bHRpT3JkZXJlZDogJ211bHRpLW9yZGVyZWQnLFxuICAgIG11bHRpVW5vcmRlcmVkOiAnbXVsdGktdW5vcmRlcmVkJyxcbiAgICBvcmFuZ2U6ICdvcmFuZ2UnLFxuICAgIHB1cnBsZTogJ3B1cnBsZSdcbn07XG4vKipcbiAqIFRoZSB2YXJpYW50IHRvIGJlIGFwcGxpZWQgdG8gYSB0aGVtZS5cbiAqXG4gKiBOb3RlOiBPbmx5IHRoZSBsaWdodCB2YXJpYW50IGlzIGN1cnJlbnRseSBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IENoYXJ0VGhlbWVWYXJpYW50ID0ge1xuICAgIGRhcms6ICdkYXJrJyxcbiAgICBkZWZhdWx0OiAnbGlnaHQnLFxuICAgIGxpZ2h0OiAnbGlnaHQnXG59O1xuZXhwb3J0IGNvbnN0IENoYXJ0QXhpc1RoZW1lID0gQXhpc1RoZW1lO1xuZXhwb3J0IGNvbnN0IENoYXJ0QmFzZVRoZW1lID0gQmFzZVRoZW1lO1xuZXhwb3J0IGNvbnN0IENoYXJ0QnVsbGV0Q29tcGFyYXRpdmVFcnJvck1lYXN1cmVUaGVtZSA9IEJ1bGxldENvbXBhcmF0aXZlRXJyb3JNZWFzdXJlVGhlbWU7XG5leHBvcnQgY29uc3QgQ2hhcnRCdWxsZXRDb21wYXJhdGl2ZU1lYXN1cmVUaGVtZSA9IEJ1bGxldENvbXBhcmF0aXZlTWVhc3VyZVRoZW1lO1xuZXhwb3J0IGNvbnN0IENoYXJ0QnVsbGV0Q29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZVRoZW1lID0gQnVsbGV0Q29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZVRoZW1lO1xuZXhwb3J0IGNvbnN0IENoYXJ0QnVsbGV0R3JvdXBUaXRsZVRoZW1lID0gQnVsbGV0R3JvdXBUaXRsZVRoZW1lO1xuZXhwb3J0IGNvbnN0IENoYXJ0QnVsbGV0UHJpbWFyeURvdE1lYXN1cmVUaGVtZSA9IEJ1bGxldFByaW1hcnlEb3RNZWFzdXJlVGhlbWU7XG5leHBvcnQgY29uc3QgQ2hhcnRCdWxsZXRQcmltYXJ5TmVnYXRpdmVNZWFzdXJlVGhlbWUgPSBCdWxsZXRQcmltYXJ5TmVnYXRpdmVNZWFzdXJlVGhlbWU7XG5leHBvcnQgY29uc3QgQ2hhcnRCdWxsZXRQcmltYXJ5U2VnbWVudGVkTWVhc3VyZVRoZW1lID0gQnVsbGV0UHJpbWFyeVNlZ21lbnRlZE1lYXN1cmVUaGVtZTtcbmV4cG9ydCBjb25zdCBDaGFydEJ1bGxldFRoZW1lID0gQnVsbGV0VGhlbWU7XG5leHBvcnQgY29uc3QgQ2hhcnRCdWxsZXRRdWFsaXRhdGl2ZVJhbmdlVGhlbWUgPSBCdWxsZXRRdWFsaXRhdGl2ZVJhbmdlVGhlbWU7XG5leHBvcnQgY29uc3QgQ2hhcnREb251dFV0aWxpemF0aW9uRHluYW1pY1RoZW1lID0gRG9udXRVdGlsaXphdGlvbkR5bmFtaWNUaGVtZTtcbmV4cG9ydCBjb25zdCBDaGFydERvbnV0VXRpbGl6YXRpb25TdGF0aWNUaGVtZSA9IERvbnV0VXRpbGl6YXRpb25TdGF0aWNUaGVtZTtcbmV4cG9ydCBjb25zdCBDaGFydERvbnV0VGhlbWUgPSBEb251dFRoZW1lO1xuZXhwb3J0IGNvbnN0IENoYXJ0RG9udXRUaHJlc2hvbGREeW5hbWljVGhlbWUgPSBEb251dFRocmVzaG9sZER5bmFtaWNUaGVtZTtcbmV4cG9ydCBjb25zdCBDaGFydERvbnV0VGhyZXNob2xkU3RhdGljVGhlbWUgPSBEb251dFRocmVzaG9sZFN0YXRpY1RoZW1lO1xuZXhwb3J0IGNvbnN0IENoYXJ0VGhyZXNob2xkVGhlbWUgPSBUaHJlc2hvbGRUaGVtZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJ0VGhlbWUuanMubWFwIiwiaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvY2xvbmVEZWVwJztcbmltcG9ydCBtZXJnZSBmcm9tICdsb2Rhc2gvbWVyZ2UnO1xuaW1wb3J0IHsgRGFya0JsdWVDb2xvclRoZW1lIH0gZnJvbSAnLi4vQ2hhcnRUaGVtZS90aGVtZXMvZGFyay9ibHVlLWNvbG9yLXRoZW1lJztcbmltcG9ydCB7IERhcmtDeWFuQ29sb3JUaGVtZSB9IGZyb20gJy4uL0NoYXJ0VGhlbWUvdGhlbWVzL2RhcmsvY3lhbi1jb2xvci10aGVtZSc7XG5pbXBvcnQgeyBEYXJrR29sZENvbG9yVGhlbWUgfSBmcm9tICcuLi9DaGFydFRoZW1lL3RoZW1lcy9kYXJrL2dvbGQtY29sb3ItdGhlbWUnO1xuaW1wb3J0IHsgRGFya0dyYXlDb2xvclRoZW1lIH0gZnJvbSAnLi4vQ2hhcnRUaGVtZS90aGVtZXMvZGFyay9ncmF5LWNvbG9yLXRoZW1lJztcbmltcG9ydCB7IERhcmtHcmVlbkNvbG9yVGhlbWUgfSBmcm9tICcuLi9DaGFydFRoZW1lL3RoZW1lcy9kYXJrL2dyZWVuLWNvbG9yLXRoZW1lJztcbmltcG9ydCB7IERhcmtNdWx0aUNvbG9yT3JkZXJlZFRoZW1lIH0gZnJvbSAnLi4vQ2hhcnRUaGVtZS90aGVtZXMvZGFyay9tdWx0aS1jb2xvci1vcmRlcmVkLXRoZW1lJztcbmltcG9ydCB7IERhcmtNdWx0aUNvbG9yVW5vcmRlcmVkVGhlbWUgfSBmcm9tICcuLi9DaGFydFRoZW1lL3RoZW1lcy9kYXJrL211bHRpLWNvbG9yLXVub3JkZXJlZC10aGVtZSc7XG5pbXBvcnQgeyBEYXJrT3JhbmdlQ29sb3JUaGVtZSB9IGZyb20gJy4uL0NoYXJ0VGhlbWUvdGhlbWVzL2Rhcmsvb3JhbmdlLWNvbG9yLXRoZW1lJztcbmltcG9ydCB7IERhcmtQdXJwbGVDb2xvclRoZW1lIH0gZnJvbSAnLi4vQ2hhcnRUaGVtZS90aGVtZXMvZGFyay9wdXJwbGUtY29sb3ItdGhlbWUnO1xuaW1wb3J0IHsgTGlnaHRCbHVlQ29sb3JUaGVtZSB9IGZyb20gJy4uL0NoYXJ0VGhlbWUvdGhlbWVzL2xpZ2h0L2JsdWUtY29sb3ItdGhlbWUnO1xuaW1wb3J0IHsgTGlnaHRDeWFuQ29sb3JUaGVtZSB9IGZyb20gJy4uL0NoYXJ0VGhlbWUvdGhlbWVzL2xpZ2h0L2N5YW4tY29sb3ItdGhlbWUnO1xuaW1wb3J0IHsgTGlnaHRHb2xkQ29sb3JUaGVtZSB9IGZyb20gJy4uL0NoYXJ0VGhlbWUvdGhlbWVzL2xpZ2h0L2dvbGQtY29sb3ItdGhlbWUnO1xuaW1wb3J0IHsgTGlnaHRHcmF5Q29sb3JUaGVtZSB9IGZyb20gJy4uL0NoYXJ0VGhlbWUvdGhlbWVzL2xpZ2h0L2dyYXktY29sb3ItdGhlbWUnO1xuaW1wb3J0IHsgTGlnaHRHcmVlbkNvbG9yVGhlbWUgfSBmcm9tICcuLi9DaGFydFRoZW1lL3RoZW1lcy9saWdodC9ncmVlbi1jb2xvci10aGVtZSc7XG5pbXBvcnQgeyBMaWdodE11bHRpQ29sb3JPcmRlcmVkVGhlbWUgfSBmcm9tICcuLi9DaGFydFRoZW1lL3RoZW1lcy9saWdodC9tdWx0aS1jb2xvci1vcmRlcmVkLXRoZW1lJztcbmltcG9ydCB7IExpZ2h0TXVsdGlDb2xvclVub3JkZXJlZFRoZW1lIH0gZnJvbSAnLi4vQ2hhcnRUaGVtZS90aGVtZXMvbGlnaHQvbXVsdGktY29sb3ItdW5vcmRlcmVkLXRoZW1lJztcbmltcG9ydCB7IExpZ2h0T3JhbmdlQ29sb3JUaGVtZSB9IGZyb20gJy4uL0NoYXJ0VGhlbWUvdGhlbWVzL2xpZ2h0L29yYW5nZS1jb2xvci10aGVtZSc7XG5pbXBvcnQgeyBMaWdodFB1cnBsZUNvbG9yVGhlbWUgfSBmcm9tICcuLi9DaGFydFRoZW1lL3RoZW1lcy9saWdodC9wdXJwbGUtY29sb3ItdGhlbWUnO1xuaW1wb3J0IHsgQ2hhcnRBeGlzVGhlbWUsIENoYXJ0QmFzZVRoZW1lLCBDaGFydEJ1bGxldENvbXBhcmF0aXZlRXJyb3JNZWFzdXJlVGhlbWUsIENoYXJ0QnVsbGV0Q29tcGFyYXRpdmVNZWFzdXJlVGhlbWUsIENoYXJ0QnVsbGV0Q29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZVRoZW1lLCBDaGFydEJ1bGxldEdyb3VwVGl0bGVUaGVtZSwgQ2hhcnRCdWxsZXRQcmltYXJ5RG90TWVhc3VyZVRoZW1lLCBDaGFydEJ1bGxldFByaW1hcnlOZWdhdGl2ZU1lYXN1cmVUaGVtZSwgQ2hhcnRCdWxsZXRQcmltYXJ5U2VnbWVudGVkTWVhc3VyZVRoZW1lLCBDaGFydEJ1bGxldFRoZW1lLCBDaGFydEJ1bGxldFF1YWxpdGF0aXZlUmFuZ2VUaGVtZSwgQ2hhcnREb251dFRoZW1lLCBDaGFydERvbnV0VXRpbGl6YXRpb25EeW5hbWljVGhlbWUsIENoYXJ0RG9udXRVdGlsaXphdGlvblN0YXRpY1RoZW1lLCBDaGFydERvbnV0VGhyZXNob2xkRHluYW1pY1RoZW1lLCBDaGFydERvbnV0VGhyZXNob2xkU3RhdGljVGhlbWUsIENoYXJ0VGhlbWVDb2xvciwgQ2hhcnRUaGVtZVZhcmlhbnQsIENoYXJ0VGhyZXNob2xkVGhlbWUgfSBmcm9tICcuLi9DaGFydFRoZW1lL0NoYXJ0VGhlbWUnO1xuLy8gQXBwbHkgY3VzdG9tIHByb3BlcnRpZXMgdG8gYmFzZSBhbmQgY29sb3IgdGhlbWVzXG5leHBvcnQgY29uc3QgZ2V0Q3VzdG9tVGhlbWUgPSAodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCBjdXN0b21UaGVtZSkgPT4gbWVyZ2UoZ2V0VGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSwgY3VzdG9tVGhlbWUpO1xuLy8gUmV0dXJucyBheGlzIHRoZW1lXG5leHBvcnQgY29uc3QgZ2V0QXhpc1RoZW1lID0gKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCkgPT4gZ2V0Q3VzdG9tVGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCBDaGFydEF4aXNUaGVtZSk7XG4vLyBSZXR1cm5zIGJ1bGxldCBjaGFydCB0aGVtZVxuZXhwb3J0IGNvbnN0IGdldEJ1bGxldFRoZW1lID0gKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCkgPT4gZ2V0Q3VzdG9tVGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCBDaGFydEJ1bGxldFRoZW1lKTtcbi8vIFJldHVybnMgY29tcGFyYXRpdmUgZXJyb3IgbWVhc3VyZSB0aGVtZSBmb3IgYnVsbGV0IGNoYXJ0XG5leHBvcnQgY29uc3QgZ2V0QnVsbGV0Q29tcGFyYXRpdmVFcnJvck1lYXN1cmVUaGVtZSA9ICh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpID0+IGdldEN1c3RvbVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgQ2hhcnRCdWxsZXRDb21wYXJhdGl2ZUVycm9yTWVhc3VyZVRoZW1lKTtcbi8vIFJldHVybnMgY29tcGFyYXRpdmUgbWVhc3VyZSB0aGVtZSBmb3IgYnVsbGV0IGNoYXJ0XG5leHBvcnQgY29uc3QgZ2V0QnVsbGV0Q29tcGFyYXRpdmVNZWFzdXJlVGhlbWUgPSAodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSA9PiBnZXRDdXN0b21UaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIENoYXJ0QnVsbGV0Q29tcGFyYXRpdmVNZWFzdXJlVGhlbWUpO1xuLy8gUmV0dXJucyBjb21wYXJhdGl2ZSB3YXJuaW5nIG1lYXN1cmUgdGhlbWUgZm9yIGJ1bGxldCBjaGFydFxuZXhwb3J0IGNvbnN0IGdldEJ1bGxldENvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVUaGVtZSA9ICh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpID0+IGdldEN1c3RvbVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgQ2hhcnRCdWxsZXRDb21wYXJhdGl2ZVdhcm5pbmdNZWFzdXJlVGhlbWUpO1xuLy8gUmV0dXJucyBncm91cCB0aXRsZSB0aGVtZSBmb3IgYnVsbGV0IGNoYXJ0XG5leHBvcnQgY29uc3QgZ2V0QnVsbGV0R3JvdXBUaXRsZVRoZW1lID0gKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCkgPT4gZ2V0Q3VzdG9tVGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCBDaGFydEJ1bGxldEdyb3VwVGl0bGVUaGVtZSk7XG4vLyBSZXR1cm5zIHByaW1hcnkgZG90IG1lYXN1cmUgdGhlbWUgZm9yIGJ1bGxldCBjaGFydFxuZXhwb3J0IGNvbnN0IGdldEJ1bGxldFByaW1hcnlEb3RNZWFzdXJlVGhlbWUgPSAodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSA9PiBnZXRDdXN0b21UaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIENoYXJ0QnVsbGV0UHJpbWFyeURvdE1lYXN1cmVUaGVtZSk7XG4vLyBSZXR1cm5zIHByaW1hcnkgbmVnYXRpdmUgbWVhc3VyZSB0aGVtZSBmb3IgYnVsbGV0IGNoYXJ0XG5leHBvcnQgY29uc3QgZ2V0QnVsbGV0UHJpbWFyeU5lZ2F0aXZlTWVhc3VyZVRoZW1lID0gKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCkgPT4gZ2V0Q3VzdG9tVGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCBDaGFydEJ1bGxldFByaW1hcnlOZWdhdGl2ZU1lYXN1cmVUaGVtZSk7XG4vLyBSZXR1cm5zIHByaW1hcnkgc2VnbWVudGVkIG1lYXN1cmUgdGhlbWUgZm9yIGJ1bGxldCBjaGFydFxuZXhwb3J0IGNvbnN0IGdldEJ1bGxldFByaW1hcnlTZWdtZW50ZWRNZWFzdXJlVGhlbWUgPSAodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSA9PiBnZXRDdXN0b21UaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIENoYXJ0QnVsbGV0UHJpbWFyeVNlZ21lbnRlZE1lYXN1cmVUaGVtZSk7XG4vLyBSZXR1cm5zIHF1YWxpdGF0aXZlIHJhbmdlIHRoZW1lIGZvciBidWxsZXQgY2hhcnRcbmV4cG9ydCBjb25zdCBnZXRCdWxsZXRRdWFsaXRhdGl2ZVJhbmdlVGhlbWUgPSAodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSA9PiBnZXRDdXN0b21UaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIENoYXJ0QnVsbGV0UXVhbGl0YXRpdmVSYW5nZVRoZW1lKTtcbi8vIFJldHVybnMgdGhlbWUgZm9yIENoYXJ0IGNvbXBvbmVudFxuZXhwb3J0IGNvbnN0IGdldENoYXJ0VGhlbWUgPSAodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCBzaG93QXhpcykgPT4ge1xuICAgIGNvbnN0IHRoZW1lID0gZ2V0VGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KTtcbiAgICBpZiAoIXNob3dBeGlzKSB7XG4gICAgICAgIHRoZW1lLmF4aXMucGFkZGluZyA9IDA7XG4gICAgICAgIHRoZW1lLmF4aXMuc3R5bGUuYXhpcy5maWxsID0gJ25vbmUnO1xuICAgICAgICB0aGVtZS5heGlzLnN0eWxlLmF4aXMuc3Ryb2tlID0gJ25vbmUnO1xuICAgICAgICB0aGVtZS5heGlzLnN0eWxlLmdyaWQuZmlsbCA9ICdub25lJztcbiAgICAgICAgdGhlbWUuYXhpcy5zdHlsZS5ncmlkLnN0cm9rZSA9ICdub25lJztcbiAgICAgICAgdGhlbWUuYXhpcy5zdHlsZS50aWNrcy5maWxsID0gJ25vbmUnO1xuICAgICAgICB0aGVtZS5heGlzLnN0eWxlLnRpY2tzLnN0cm9rZSA9ICdub25lJztcbiAgICAgICAgdGhlbWUuYXhpcy5zdHlsZS50aWNrTGFiZWxzLmZpbGwgPSAnbm9uZSc7XG4gICAgfVxuICAgIHJldHVybiB0aGVtZTtcbn07XG4vLyBSZXR1cm5zIGRvbnV0IHRoZW1lXG5leHBvcnQgY29uc3QgZ2V0RG9udXRUaGVtZSA9ICh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpID0+IGdldEN1c3RvbVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgQ2hhcnREb251dFRoZW1lKTtcbi8vIFJldHVybnMgZHluYW1pYyBkb251dCB0aHJlc2hvbGQgdGhlbWVcbmV4cG9ydCBjb25zdCBnZXREb251dFRocmVzaG9sZER5bmFtaWNUaGVtZSA9ICh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpID0+IHtcbiAgICBjb25zdCB0aGVtZSA9IGdldEN1c3RvbVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgQ2hhcnREb251dFRocmVzaG9sZER5bmFtaWNUaGVtZSk7XG4gICAgLy8gTWVyZ2UganVzdCB0aGUgZmlyc3QgY29sb3Igb2YgZHluYW1pYyAoYmx1ZSwgZ3JlZW4sIGV0Yy4pIHdpdGggc3RhdGljIChncmV5KSBmb3IgZXhwZWN0ZWQgY29sb3JTY2FsZVxuICAgIHRoZW1lLmxlZ2VuZC5jb2xvclNjYWxlID0gW3RoZW1lLnBpZS5jb2xvclNjYWxlWzBdLCAuLi5DaGFydERvbnV0VGhyZXNob2xkRHluYW1pY1RoZW1lLmxlZ2VuZC5jb2xvclNjYWxlXTtcbiAgICAvLyBNZXJnZSB0aGUgdGhyZXNob2xkIGNvbG9ycyBpbiBjYXNlIHVzZXJzIHdhbnQgdG8gc2hvdyB0aGUgdW51c2VkIGRhdGFcbiAgICB0aGVtZS5waWUuY29sb3JTY2FsZSA9IFt0aGVtZS5waWUuY29sb3JTY2FsZVswXSwgLi4uQ2hhcnREb251dFRocmVzaG9sZFN0YXRpY1RoZW1lLnBpZS5jb2xvclNjYWxlXTtcbiAgICByZXR1cm4gdGhlbWU7XG59O1xuLy8gUmV0dXJucyBzdGF0aWMgZG9udXQgdGhyZXNob2xkIHRoZW1lXG5leHBvcnQgY29uc3QgZ2V0RG9udXRUaHJlc2hvbGRTdGF0aWNUaGVtZSA9ICh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIGludmVydCkgPT4ge1xuICAgIGNvbnN0IHN0YXRpY1RoZW1lID0gY2xvbmVEZWVwKENoYXJ0RG9udXRUaHJlc2hvbGRTdGF0aWNUaGVtZSk7XG4gICAgaWYgKGludmVydCAmJiBzdGF0aWNUaGVtZS5waWUuY29sb3JTY2FsZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIHN0YXRpY1RoZW1lLnBpZS5jb2xvclNjYWxlID0gc3RhdGljVGhlbWUucGllLmNvbG9yU2NhbGUucmV2ZXJzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0Q3VzdG9tVGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCBzdGF0aWNUaGVtZSk7XG59O1xuLy8gUmV0dXJucyBkb251dCB1dGlsaXphdGlvbiB0aGVtZVxuZXhwb3J0IGNvbnN0IGdldERvbnV0VXRpbGl6YXRpb25UaGVtZSA9ICh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpID0+IHtcbiAgICBjb25zdCB0aGVtZSA9IGdldEN1c3RvbVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgQ2hhcnREb251dFV0aWxpemF0aW9uRHluYW1pY1RoZW1lKTtcbiAgICAvLyBNZXJnZSBqdXN0IHRoZSBmaXJzdCBjb2xvciBvZiBkeW5hbWljIChibHVlLCBncmVlbiwgZXRjLikgd2l0aCBzdGF0aWMgKGdyZXkpIGZvciBleHBlY3RlZCBjb2xvclNjYWxlXG4gICAgdGhlbWUucGllLmNvbG9yU2NhbGUgPSBbdGhlbWUucGllLmNvbG9yU2NhbGVbMF0sIC4uLkNoYXJ0RG9udXRVdGlsaXphdGlvblN0YXRpY1RoZW1lLnBpZS5jb2xvclNjYWxlXTtcbiAgICB0aGVtZS5sZWdlbmQuY29sb3JTY2FsZSA9IFt0aGVtZS5sZWdlbmQuY29sb3JTY2FsZVswXSwgLi4uQ2hhcnREb251dFV0aWxpemF0aW9uU3RhdGljVGhlbWUubGVnZW5kLmNvbG9yU2NhbGVdO1xuICAgIHJldHVybiB0aGVtZTtcbn07XG4vLyBSZXR1cm5zIGRhcmsgdGhlbWUgY29sb3JzXG5leHBvcnQgY29uc3QgZ2V0RGFya1RoZW1lQ29sb3JzID0gKHRoZW1lQ29sb3IpID0+IHtcbiAgICBzd2l0Y2ggKHRoZW1lQ29sb3IpIHtcbiAgICAgICAgY2FzZSBDaGFydFRoZW1lQ29sb3IuYmx1ZTpcbiAgICAgICAgICAgIHJldHVybiBEYXJrQmx1ZUNvbG9yVGhlbWU7XG4gICAgICAgIGNhc2UgQ2hhcnRUaGVtZUNvbG9yLmN5YW46XG4gICAgICAgICAgICByZXR1cm4gRGFya0N5YW5Db2xvclRoZW1lO1xuICAgICAgICBjYXNlIENoYXJ0VGhlbWVDb2xvci5nb2xkOlxuICAgICAgICAgICAgcmV0dXJuIERhcmtHb2xkQ29sb3JUaGVtZTtcbiAgICAgICAgY2FzZSBDaGFydFRoZW1lQ29sb3IuZ3JheTpcbiAgICAgICAgICAgIHJldHVybiBEYXJrR3JheUNvbG9yVGhlbWU7XG4gICAgICAgIGNhc2UgQ2hhcnRUaGVtZUNvbG9yLmdyZWVuOlxuICAgICAgICAgICAgcmV0dXJuIERhcmtHcmVlbkNvbG9yVGhlbWU7XG4gICAgICAgIGNhc2UgQ2hhcnRUaGVtZUNvbG9yLm11bHRpOlxuICAgICAgICBjYXNlIENoYXJ0VGhlbWVDb2xvci5tdWx0aU9yZGVyZWQ6XG4gICAgICAgICAgICByZXR1cm4gRGFya011bHRpQ29sb3JPcmRlcmVkVGhlbWU7XG4gICAgICAgIGNhc2UgQ2hhcnRUaGVtZUNvbG9yLm11bHRpVW5vcmRlcmVkOlxuICAgICAgICAgICAgcmV0dXJuIERhcmtNdWx0aUNvbG9yVW5vcmRlcmVkVGhlbWU7XG4gICAgICAgIGNhc2UgQ2hhcnRUaGVtZUNvbG9yLm9yYW5nZTpcbiAgICAgICAgICAgIHJldHVybiBEYXJrT3JhbmdlQ29sb3JUaGVtZTtcbiAgICAgICAgY2FzZSBDaGFydFRoZW1lQ29sb3IucHVycGxlOlxuICAgICAgICAgICAgcmV0dXJuIERhcmtQdXJwbGVDb2xvclRoZW1lO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIERhcmtCbHVlQ29sb3JUaGVtZTtcbiAgICB9XG59O1xuLy8gUmV0dXJucyBsaWdodCB0aGVtZSBjb2xvcnNcbmV4cG9ydCBjb25zdCBnZXRMaWdodFRoZW1lQ29sb3JzID0gKHRoZW1lQ29sb3IpID0+IHtcbiAgICBzd2l0Y2ggKHRoZW1lQ29sb3IpIHtcbiAgICAgICAgY2FzZSBDaGFydFRoZW1lQ29sb3IuYmx1ZTpcbiAgICAgICAgICAgIHJldHVybiBMaWdodEJsdWVDb2xvclRoZW1lO1xuICAgICAgICBjYXNlIENoYXJ0VGhlbWVDb2xvci5jeWFuOlxuICAgICAgICAgICAgcmV0dXJuIExpZ2h0Q3lhbkNvbG9yVGhlbWU7XG4gICAgICAgIGNhc2UgQ2hhcnRUaGVtZUNvbG9yLmdvbGQ6XG4gICAgICAgICAgICByZXR1cm4gTGlnaHRHb2xkQ29sb3JUaGVtZTtcbiAgICAgICAgY2FzZSBDaGFydFRoZW1lQ29sb3IuZ3JheTpcbiAgICAgICAgICAgIHJldHVybiBMaWdodEdyYXlDb2xvclRoZW1lO1xuICAgICAgICBjYXNlIENoYXJ0VGhlbWVDb2xvci5ncmVlbjpcbiAgICAgICAgICAgIHJldHVybiBMaWdodEdyZWVuQ29sb3JUaGVtZTtcbiAgICAgICAgY2FzZSBDaGFydFRoZW1lQ29sb3IubXVsdGk6XG4gICAgICAgIGNhc2UgQ2hhcnRUaGVtZUNvbG9yLm11bHRpT3JkZXJlZDpcbiAgICAgICAgICAgIHJldHVybiBMaWdodE11bHRpQ29sb3JPcmRlcmVkVGhlbWU7XG4gICAgICAgIGNhc2UgQ2hhcnRUaGVtZUNvbG9yLm11bHRpVW5vcmRlcmVkOlxuICAgICAgICAgICAgcmV0dXJuIExpZ2h0TXVsdGlDb2xvclVub3JkZXJlZFRoZW1lO1xuICAgICAgICBjYXNlIENoYXJ0VGhlbWVDb2xvci5vcmFuZ2U6XG4gICAgICAgICAgICByZXR1cm4gTGlnaHRPcmFuZ2VDb2xvclRoZW1lO1xuICAgICAgICBjYXNlIENoYXJ0VGhlbWVDb2xvci5wdXJwbGU6XG4gICAgICAgICAgICByZXR1cm4gTGlnaHRQdXJwbGVDb2xvclRoZW1lO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIExpZ2h0Qmx1ZUNvbG9yVGhlbWU7XG4gICAgfVxufTtcbi8vIEFwcGxpZXMgdGhlbWUgY29sb3IgYW5kIHZhcmlhbnQgdG8gYmFzZSB0aGVtZVxuZXhwb3J0IGNvbnN0IGdldFRoZW1lID0gKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCkgPT4ge1xuICAgIC8vIERlZXAgY2xvbmVcbiAgICBjb25zdCBiYXNlVGhlbWUgPSBPYmplY3QuYXNzaWduKHt9LCBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KENoYXJ0QmFzZVRoZW1lKSkpO1xuICAgIHN3aXRjaCAodGhlbWVWYXJpYW50KSB7XG4gICAgICAgIGNhc2UgQ2hhcnRUaGVtZVZhcmlhbnQuZGFyazpcbiAgICAgICAgICAgIHJldHVybiBtZXJnZShiYXNlVGhlbWUsIGdldERhcmtUaGVtZUNvbG9ycyh0aGVtZUNvbG9yKSk7XG4gICAgICAgIGNhc2UgQ2hhcnRUaGVtZVZhcmlhbnQubGlnaHQ6XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2UoYmFzZVRoZW1lLCBnZXRMaWdodFRoZW1lQ29sb3JzKHRoZW1lQ29sb3IpKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtZXJnZShiYXNlVGhlbWUsIGdldExpZ2h0VGhlbWVDb2xvcnModGhlbWVDb2xvcikpO1xuICAgIH1cbn07XG4vLyBSZXR1cm5zIHRocmVzaG9sZCB0aGVtZVxuZXhwb3J0IGNvbnN0IGdldFRocmVzaG9sZFRoZW1lID0gKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCkgPT4gZ2V0Q3VzdG9tVGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCBDaGFydFRocmVzaG9sZFRoZW1lKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNoYXJ0LXRoZW1lLmpzLm1hcCIsIi8vIE1pc2MgdXRpbCBmdW5jdGlvbnNcbi8vIENvcGllZCBmcm9tIGV4ZW52XG5leHBvcnQgY29uc3QgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbi8vIFJldHVybnMgdGhlIGNsYXNzIG5hbWUgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIG91dGVyLW1vc3QgZGl2IHJlbmRlcmVkIGJ5IHRoZSBjaGFydCdzIGNvbnRhaW5lclxuZXhwb3J0IGNvbnN0IGdldENsYXNzTmFtZSA9ICh7IGNsYXNzTmFtZSB9KSA9PiB7XG4gICAgbGV0IGNsZWFuQ2xhc3NOYW1lO1xuICAgIC8vIFdvcmthcm91bmQgZm9yIFZpY3RvcnlDb250YWluZXIgY2xhc3MgbmFtZVxuICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgICAgY2xlYW5DbGFzc05hbWUgPSBjbGFzc05hbWVcbiAgICAgICAgICAgIC5yZXBsYWNlKC9WaWN0b3J5Q29udGFpbmVyL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3BmLWMtY2hhcnQvZywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpXG4gICAgICAgICAgICAudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gY2xlYW5DbGFzc05hbWUgJiYgY2xlYW5DbGFzc05hbWUubGVuZ3RoID8gYHBmLWMtY2hhcnQgJHtjbGVhbkNsYXNzTmFtZX1gIDogJ3BmLWMtY2hhcnQnO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNoYXJ0LWhlbHBlcnMuanMubWFwIiwiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IHsgVmljdG9yeUNvbnRhaW5lciB9IGZyb20gJ3ZpY3RvcnktY29yZSc7XG5pbXBvcnQgeyBnZXRDbGFzc05hbWUsIGdldFRoZW1lIH0gZnJvbSAnLi4vQ2hhcnRVdGlscyc7XG5leHBvcnQgY29uc3QgQ2hhcnRDb250YWluZXIgPSAoX2EpID0+IHtcbiAgICB2YXIgeyBjbGFzc05hbWUsIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgXG4gICAgLy8gZGVzdHJ1Y3R1cmUgbGFzdFxuICAgIHRoZW1lID0gZ2V0VGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSB9ID0gX2EsIHJlc3QgPSBfX3Jlc3QoX2EsIFtcImNsYXNzTmFtZVwiLCBcInRoZW1lQ29sb3JcIiwgXCJ0aGVtZVZhcmlhbnRcIiwgXCJ0aGVtZVwiXSk7XG4gICAgY29uc3QgY2hhcnRDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUoeyBjbGFzc05hbWUgfSk7XG4gICAgLy8gTm90ZTogY2xhc3NOYW1lIGlzIHZhbGlkLCBidXQgVmljdG9yeSBpcyBtaXNzaW5nIGEgdHlwZVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFZpY3RvcnlDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBjbGFzc05hbWU6IGNoYXJ0Q2xhc3NOYW1lLCB0aGVtZTogdGhlbWUgfSwgcmVzdCkpO1xufTtcbkNoYXJ0Q29udGFpbmVyLmRpc3BsYXlOYW1lID0gJ0NoYXJ0Q29udGFpbmVyJztcbi8vIE5vdGU6IFZpY3RvcnlDb250YWluZXIucm9sZSBtdXN0IGJlIGhvaXN0ZWRcbmhvaXN0Tm9uUmVhY3RTdGF0aWNzKENoYXJ0Q29udGFpbmVyLCBWaWN0b3J5Q29udGFpbmVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJ0Q29udGFpbmVyLmpzLm1hcCIsImltcG9ydCBfaXNOaWwgZnJvbSBcImxvZGFzaC9pc05pbFwiO1xuaW1wb3J0IF9yYW5nZSBmcm9tIFwibG9kYXNoL3JhbmdlXCI7XG5pbXBvcnQgX3N1bSBmcm9tIFwibG9kYXNoL3N1bVwiO1xuaW1wb3J0IF9rZXlzIGZyb20gXCJsb2Rhc2gva2V5c1wiO1xuaW1wb3J0IF9ncm91cEJ5IGZyb20gXCJsb2Rhc2gvZ3JvdXBCeVwiO1xuaW1wb3J0IF9hc3NpZ24gZnJvbSBcImxvZGFzaC9hc3NpZ25cIjtcbmltcG9ydCBfZGVmYXVsdHMgZnJvbSBcImxvZGFzaC9kZWZhdWx0c1wiO1xuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHsgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTsgfSkpOyB9IG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCB7IEhlbHBlcnMsIFN0eWxlLCBUZXh0U2l6ZSB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcblxudmFyIGdldENvbG9yU2NhbGUgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIGNvbG9yU2NhbGUgPSBwcm9wcy5jb2xvclNjYWxlO1xuICByZXR1cm4gdHlwZW9mIGNvbG9yU2NhbGUgPT09IFwic3RyaW5nXCIgPyBTdHlsZS5nZXRDb2xvclNjYWxlKGNvbG9yU2NhbGUpIDogY29sb3JTY2FsZSB8fCBbXTtcbn07XG5cbnZhciBnZXRMYWJlbFN0eWxlcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgZGF0YSA9IHByb3BzLmRhdGEsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlO1xuICByZXR1cm4gZGF0YS5tYXAoZnVuY3Rpb24gKGRhdHVtLCBpbmRleCkge1xuICAgIHZhciBiYXNlTGFiZWxTdHlsZXMgPSBfZGVmYXVsdHMoe30sIGRhdHVtLmxhYmVscywgc3R5bGUubGFiZWxzKTtcblxuICAgIHJldHVybiBIZWxwZXJzLmV2YWx1YXRlU3R5bGUoYmFzZUxhYmVsU3R5bGVzLCB7XG4gICAgICBkYXR1bTogZGF0dW0sXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSk7XG4gIH0pO1xufTtcblxudmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uIChwcm9wcywgc3R5bGVPYmplY3QpIHtcbiAgdmFyIHN0eWxlID0gcHJvcHMuc3R5bGUgfHwge307XG4gIHN0eWxlT2JqZWN0ID0gc3R5bGVPYmplY3QgfHwge307XG4gIHZhciBwYXJlbnRTdHlsZVByb3BzID0ge1xuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgd2lkdGg6IFwiMTAwJVwiXG4gIH07XG4gIHJldHVybiB7XG4gICAgcGFyZW50OiBfZGVmYXVsdHMoc3R5bGUucGFyZW50LCBzdHlsZU9iamVjdC5wYXJlbnQsIHBhcmVudFN0eWxlUHJvcHMpLFxuICAgIGRhdGE6IF9kZWZhdWx0cyh7fSwgc3R5bGUuZGF0YSwgc3R5bGVPYmplY3QuZGF0YSksXG4gICAgbGFiZWxzOiBfZGVmYXVsdHMoe30sIHN0eWxlLmxhYmVscywgc3R5bGVPYmplY3QubGFiZWxzKSxcbiAgICBib3JkZXI6IF9kZWZhdWx0cyh7fSwgc3R5bGUuYm9yZGVyLCBzdHlsZU9iamVjdC5ib3JkZXIpLFxuICAgIHRpdGxlOiBfZGVmYXVsdHMoe30sIHN0eWxlLnRpdGxlLCBzdHlsZU9iamVjdC50aXRsZSlcbiAgfTtcbn07XG5cbnZhciBnZXRDYWxjdWxhdGVkVmFsdWVzID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciBvcmllbnRhdGlvbiA9IHByb3BzLm9yaWVudGF0aW9uLFxuICAgICAgdGhlbWUgPSBwcm9wcy50aGVtZTtcbiAgdmFyIGRlZmF1bHRTdHlsZXMgPSB0aGVtZSAmJiB0aGVtZS5sZWdlbmQgJiYgdGhlbWUubGVnZW5kLnN0eWxlID8gdGhlbWUubGVnZW5kLnN0eWxlIDoge307XG4gIHZhciBzdHlsZSA9IGdldFN0eWxlcyhwcm9wcywgZGVmYXVsdFN0eWxlcyk7XG4gIHZhciBjb2xvclNjYWxlID0gZ2V0Q29sb3JTY2FsZShwcm9wcyk7XG4gIHZhciBpc0hvcml6b250YWwgPSBvcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCI7XG4gIHZhciBib3JkZXJQYWRkaW5nID0gSGVscGVycy5nZXRQYWRkaW5nKHtcbiAgICBwYWRkaW5nOiBwcm9wcy5ib3JkZXJQYWRkaW5nXG4gIH0pO1xuICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgaXNIb3Jpem9udGFsOiBpc0hvcml6b250YWwsXG4gICAgY29sb3JTY2FsZTogY29sb3JTY2FsZSxcbiAgICBib3JkZXJQYWRkaW5nOiBib3JkZXJQYWRkaW5nXG4gIH0pO1xufTtcblxudmFyIGdldENvbHVtbiA9IGZ1bmN0aW9uIChwcm9wcywgaW5kZXgpIHtcbiAgdmFyIGl0ZW1zUGVyUm93ID0gcHJvcHMuaXRlbXNQZXJSb3csXG4gICAgICBpc0hvcml6b250YWwgPSBwcm9wcy5pc0hvcml6b250YWw7XG5cbiAgaWYgKCFpdGVtc1BlclJvdykge1xuICAgIHJldHVybiBpc0hvcml6b250YWwgPyBpbmRleCA6IDA7XG4gIH1cblxuICByZXR1cm4gaXNIb3Jpem9udGFsID8gaW5kZXggJSBpdGVtc1BlclJvdyA6IE1hdGguZmxvb3IoaW5kZXggLyBpdGVtc1BlclJvdyk7XG59O1xuXG52YXIgZ2V0Um93ID0gZnVuY3Rpb24gKHByb3BzLCBpbmRleCkge1xuICB2YXIgaXRlbXNQZXJSb3cgPSBwcm9wcy5pdGVtc1BlclJvdyxcbiAgICAgIGlzSG9yaXpvbnRhbCA9IHByb3BzLmlzSG9yaXpvbnRhbDtcblxuICBpZiAoIWl0ZW1zUGVyUm93KSB7XG4gICAgcmV0dXJuIGlzSG9yaXpvbnRhbCA/IDAgOiBpbmRleDtcbiAgfVxuXG4gIHJldHVybiBpc0hvcml6b250YWwgPyBNYXRoLmZsb29yKGluZGV4IC8gaXRlbXNQZXJSb3cpIDogaW5kZXggJSBpdGVtc1BlclJvdztcbn07XG5cbnZhciBncm91cERhdGEgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIGRhdGEgPSBwcm9wcy5kYXRhO1xuICB2YXIgc3R5bGUgPSBwcm9wcy5zdHlsZSAmJiBwcm9wcy5zdHlsZS5kYXRhIHx8IHt9O1xuICB2YXIgbGFiZWxTdHlsZXMgPSBnZXRMYWJlbFN0eWxlcyhwcm9wcyk7XG4gIHJldHVybiBkYXRhLm1hcChmdW5jdGlvbiAoZGF0dW0sIGluZGV4KSB7XG4gICAgdmFyIHN5bWJvbCA9IGRhdHVtLnN5bWJvbCB8fCB7fTtcbiAgICB2YXIgZm9udFNpemUgPSBsYWJlbFN0eWxlc1tpbmRleF0uZm9udFNpemU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tYWdpYy1udW1iZXJzXG5cbiAgICB2YXIgc2l6ZSA9IHN5bWJvbC5zaXplIHx8IHN0eWxlLnNpemUgfHwgZm9udFNpemUgLyAyLjU7XG4gICAgdmFyIHN5bWJvbFNwYWNlciA9IHByb3BzLnN5bWJvbFNwYWNlciB8fCBNYXRoLm1heChzaXplLCBmb250U2l6ZSk7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIGRhdHVtLCB7XG4gICAgICBzaXplOiBzaXplLFxuICAgICAgc3ltYm9sU3BhY2VyOiBzeW1ib2xTcGFjZXIsXG4gICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICB0ZXh0U2l6ZTogVGV4dFNpemUuYXBwcm94aW1hdGVUZXh0U2l6ZShkYXR1bS5uYW1lLCBsYWJlbFN0eWxlc1tpbmRleF0pLFxuICAgICAgY29sdW1uOiBnZXRDb2x1bW4ocHJvcHMsIGluZGV4KSxcbiAgICAgIHJvdzogZ2V0Um93KHByb3BzLCBpbmRleClcbiAgICB9KTtcbiAgfSk7XG59O1xuXG52YXIgZ2V0Q29sdW1uV2lkdGhzID0gZnVuY3Rpb24gKHByb3BzLCBkYXRhKSB7XG4gIHZhciBndXR0ZXIgPSBwcm9wcy5ndXR0ZXIgfHwge307XG4gIHZhciBndXR0ZXJXaWR0aCA9IHR5cGVvZiBndXR0ZXIgPT09IFwib2JqZWN0XCIgPyAoZ3V0dGVyLmxlZnQgfHwgMCkgKyAoZ3V0dGVyLnJpZ2h0IHx8IDApIDogZ3V0dGVyIHx8IDA7XG5cbiAgdmFyIGRhdGFCeUNvbHVtbiA9IF9ncm91cEJ5KGRhdGEsIFwiY29sdW1uXCIpO1xuXG4gIHZhciBjb2x1bW5zID0gX2tleXMoZGF0YUJ5Q29sdW1uKTtcblxuICByZXR1cm4gY29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIGN1cnIsIGluZGV4KSB7XG4gICAgdmFyIGxlbmd0aHMgPSBkYXRhQnlDb2x1bW5bY3Vycl0ubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgICByZXR1cm4gZC50ZXh0U2l6ZS53aWR0aCArIGQuc2l6ZSArIGQuc3ltYm9sU3BhY2VyICsgZ3V0dGVyV2lkdGg7XG4gICAgfSk7XG4gICAgbWVtb1tpbmRleF0gPSBNYXRoLm1heC5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkobGVuZ3RocykpO1xuICAgIHJldHVybiBtZW1vO1xuICB9LCBbXSk7XG59O1xuXG52YXIgZ2V0Um93SGVpZ2h0cyA9IGZ1bmN0aW9uIChwcm9wcywgZGF0YSkge1xuICB2YXIgZ3V0dGVyID0gcHJvcHMucm93R3V0dGVyIHx8IHt9O1xuICB2YXIgZ3V0dGVySGVpZ2h0ID0gdHlwZW9mIGd1dHRlciA9PT0gXCJvYmplY3RcIiA/IChndXR0ZXIudG9wIHx8IDApICsgKGd1dHRlci5ib3R0b20gfHwgMCkgOiBndXR0ZXIgfHwgMDtcblxuICB2YXIgZGF0YUJ5Um93ID0gX2dyb3VwQnkoZGF0YSwgXCJyb3dcIik7XG5cbiAgcmV0dXJuIF9rZXlzKGRhdGFCeVJvdykucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBjdXJyLCBpbmRleCkge1xuICAgIHZhciByb3dzID0gZGF0YUJ5Um93W2N1cnJdO1xuICAgIHZhciBsZW5ndGhzID0gcm93cy5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgIHJldHVybiBkLnRleHRTaXplLmhlaWdodCArIGQuc3ltYm9sU3BhY2VyICsgZ3V0dGVySGVpZ2h0O1xuICAgIH0pO1xuICAgIG1lbW9baW5kZXhdID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGxlbmd0aHMpKTtcbiAgICByZXR1cm4gbWVtbztcbiAgfSwgW10pO1xufTtcblxudmFyIGdldFRpdGxlRGltZW5zaW9ucyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgc3R5bGUgPSBwcm9wcy5zdHlsZSAmJiBwcm9wcy5zdHlsZS50aXRsZSB8fCB7fTtcbiAgdmFyIHRleHRTaXplID0gVGV4dFNpemUuYXBwcm94aW1hdGVUZXh0U2l6ZShwcm9wcy50aXRsZSwgc3R5bGUpO1xuICB2YXIgcGFkZGluZyA9IHN0eWxlLnBhZGRpbmcgfHwgMDtcbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IHRleHRTaXplLmhlaWdodCArIDIgKiBwYWRkaW5nIHx8IDAsXG4gICAgd2lkdGg6IHRleHRTaXplLndpZHRoICsgMiAqIHBhZGRpbmcgfHwgMFxuICB9O1xufTtcblxudmFyIGdldE9mZnNldCA9IGZ1bmN0aW9uIChkYXR1bSwgcm93SGVpZ2h0cywgY29sdW1uV2lkdGhzKSB7XG4gIHZhciBjb2x1bW4gPSBkYXR1bS5jb2x1bW4sXG4gICAgICByb3cgPSBkYXR1bS5yb3c7XG4gIHJldHVybiB7XG4gICAgeDogX3JhbmdlKGNvbHVtbikucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBjdXJyKSB7XG4gICAgICBtZW1vICs9IGNvbHVtbldpZHRoc1tjdXJyXTtcbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH0sIDApLFxuICAgIHk6IF9yYW5nZShyb3cpLnJlZHVjZShmdW5jdGlvbiAobWVtbywgY3Vycikge1xuICAgICAgbWVtbyArPSByb3dIZWlnaHRzW2N1cnJdO1xuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfSwgMClcbiAgfTtcbn07XG5cbnZhciBnZXRBbmNob3JzID0gZnVuY3Rpb24gKHRpdGxlT3JpZW50YXRpb24sIGNlbnRlclRpdGxlKSB7XG4gIHZhciBzdGFuZGFyZEFuY2hvcnMgPSB7XG4gICAgdGV4dEFuY2hvcjogdGl0bGVPcmllbnRhdGlvbiA9PT0gXCJyaWdodFwiID8gXCJlbmRcIiA6IFwic3RhcnRcIixcbiAgICB2ZXJ0aWNhbEFuY2hvcjogdGl0bGVPcmllbnRhdGlvbiA9PT0gXCJib3R0b21cIiA/IFwiZW5kXCIgOiBcInN0YXJ0XCJcbiAgfTtcblxuICBpZiAoY2VudGVyVGl0bGUpIHtcbiAgICB2YXIgaG9yaXpvbnRhbCA9IHRpdGxlT3JpZW50YXRpb24gPT09IFwidG9wXCIgfHwgdGl0bGVPcmllbnRhdGlvbiA9PT0gXCJib3R0b21cIjtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dEFuY2hvcjogaG9yaXpvbnRhbCA/IFwibWlkZGxlXCIgOiBzdGFuZGFyZEFuY2hvcnMudGV4dEFuY2hvcixcbiAgICAgIHZlcnRpY2FsQW5jaG9yOiBob3Jpem9udGFsID8gc3RhbmRhcmRBbmNob3JzLnZlcnRpY2FsQW5jaG9yIDogXCJtaWRkbGVcIlxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0YW5kYXJkQW5jaG9ycztcbiAgfVxufTtcblxudmFyIGdldFRpdGxlU3R5bGUgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIHRpdGxlT3JpZW50YXRpb24gPSBwcm9wcy50aXRsZU9yaWVudGF0aW9uLFxuICAgICAgY2VudGVyVGl0bGUgPSBwcm9wcy5jZW50ZXJUaXRsZSxcbiAgICAgIHRpdGxlQ29tcG9uZW50ID0gcHJvcHMudGl0bGVDb21wb25lbnQ7XG4gIHZhciBiYXNlU3R5bGUgPSBwcm9wcy5zdHlsZSAmJiBwcm9wcy5zdHlsZS50aXRsZSB8fCB7fTtcbiAgdmFyIGNvbXBvbmVudFN0eWxlID0gdGl0bGVDb21wb25lbnQucHJvcHMgJiYgdGl0bGVDb21wb25lbnQucHJvcHMuc3R5bGUgfHwge307XG4gIHZhciBhbmNob3JzID0gZ2V0QW5jaG9ycyh0aXRsZU9yaWVudGF0aW9uLCBjZW50ZXJUaXRsZSk7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGNvbXBvbmVudFN0eWxlKSA/IGNvbXBvbmVudFN0eWxlLm1hcChmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIF9kZWZhdWx0cyh7fSwgb2JqLCBiYXNlU3R5bGUsIGFuY2hvcnMpO1xuICB9KSA6IF9kZWZhdWx0cyh7fSwgY29tcG9uZW50U3R5bGUsIGJhc2VTdHlsZSwgYW5jaG9ycyk7XG59OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuXG5cbnZhciBnZXRUaXRsZVByb3BzID0gZnVuY3Rpb24gKHByb3BzLCBib3JkZXJQcm9wcykge1xuICB2YXIgdGl0bGUgPSBwcm9wcy50aXRsZSxcbiAgICAgIHRpdGxlT3JpZW50YXRpb24gPSBwcm9wcy50aXRsZU9yaWVudGF0aW9uLFxuICAgICAgY2VudGVyVGl0bGUgPSBwcm9wcy5jZW50ZXJUaXRsZSxcbiAgICAgIGJvcmRlclBhZGRpbmcgPSBwcm9wcy5ib3JkZXJQYWRkaW5nO1xuICB2YXIgaGVpZ2h0ID0gYm9yZGVyUHJvcHMuaGVpZ2h0LFxuICAgICAgd2lkdGggPSBib3JkZXJQcm9wcy53aWR0aDtcbiAgdmFyIHN0eWxlID0gZ2V0VGl0bGVTdHlsZShwcm9wcyk7XG4gIHZhciBwYWRkaW5nID0gQXJyYXkuaXNBcnJheShzdHlsZSkgPyBzdHlsZVswXS5wYWRkaW5nIDogc3R5bGUucGFkZGluZztcbiAgdmFyIGhvcml6b250YWwgPSB0aXRsZU9yaWVudGF0aW9uID09PSBcInRvcFwiIHx8IHRpdGxlT3JpZW50YXRpb24gPT09IFwiYm90dG9tXCI7XG4gIHZhciB4T3JpZW50YXRpb24gPSB0aXRsZU9yaWVudGF0aW9uID09PSBcImJvdHRvbVwiID8gXCJib3R0b21cIiA6IFwidG9wXCI7XG4gIHZhciB5T3JpZW50YXRpb24gPSB0aXRsZU9yaWVudGF0aW9uID09PSBcInJpZ2h0XCIgPyBcInJpZ2h0XCIgOiBcImxlZnRcIjtcbiAgdmFyIHN0YW5kYXJkUGFkZGluZyA9IHtcbiAgICB4OiBjZW50ZXJUaXRsZSA/IHdpZHRoIC8gMiA6IGJvcmRlclBhZGRpbmdbeE9yaWVudGF0aW9uXSArIChwYWRkaW5nIHx8IDApLFxuICAgIHk6IGNlbnRlclRpdGxlID8gaGVpZ2h0IC8gMiA6IGJvcmRlclBhZGRpbmdbeU9yaWVudGF0aW9uXSArIChwYWRkaW5nIHx8IDApXG4gIH07XG5cbiAgdmFyIGdldFBhZGRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGJvcmRlclBhZGRpbmdbdGl0bGVPcmllbnRhdGlvbl0gKyAocGFkZGluZyB8fCAwKTtcbiAgfTtcblxuICB2YXIgeE9mZnNldCA9IGhvcml6b250YWwgPyBzdGFuZGFyZFBhZGRpbmcueCA6IGdldFBhZGRpbmcoKTtcbiAgdmFyIHlPZmZzZXQgPSBob3Jpem9udGFsID8gZ2V0UGFkZGluZygpIDogc3RhbmRhcmRQYWRkaW5nLnk7XG4gIHJldHVybiB7XG4gICAgeDogdGl0bGVPcmllbnRhdGlvbiA9PT0gXCJyaWdodFwiID8gcHJvcHMueCArIHdpZHRoIC0geE9mZnNldCA6IHByb3BzLnggKyB4T2Zmc2V0LFxuICAgIHk6IHRpdGxlT3JpZW50YXRpb24gPT09IFwiYm90dG9tXCIgPyBwcm9wcy55ICsgaGVpZ2h0IC0geU9mZnNldCA6IHByb3BzLnkgKyB5T2Zmc2V0LFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICB0ZXh0OiB0aXRsZVxuICB9O1xufTtcblxudmFyIGdldEJvcmRlclByb3BzID0gZnVuY3Rpb24gKHByb3BzLCBjb250ZW50SGVpZ2h0LCBjb250ZW50V2lkdGgpIHtcbiAgdmFyIHggPSBwcm9wcy54LFxuICAgICAgeSA9IHByb3BzLnksXG4gICAgICBib3JkZXJQYWRkaW5nID0gcHJvcHMuYm9yZGVyUGFkZGluZyxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGU7XG4gIHZhciBoZWlnaHQgPSAoY29udGVudEhlaWdodCB8fCAwKSArIGJvcmRlclBhZGRpbmcudG9wICsgYm9yZGVyUGFkZGluZy5ib3R0b207XG4gIHZhciB3aWR0aCA9IChjb250ZW50V2lkdGggfHwgMCkgKyBib3JkZXJQYWRkaW5nLmxlZnQgKyBib3JkZXJQYWRkaW5nLnJpZ2h0O1xuICByZXR1cm4ge1xuICAgIHg6IHgsXG4gICAgeTogeSxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgc3R5bGU6IF9hc3NpZ24oe1xuICAgICAgZmlsbDogXCJub25lXCJcbiAgICB9LCBzdHlsZS5ib3JkZXIpXG4gIH07XG59O1xuXG5leHBvcnQgdmFyIGdldERpbWVuc2lvbnMgPSBmdW5jdGlvbiAocHJvcHMsIGZhbGxiYWNrUHJvcHMpIHtcbiAgdmFyIG1vZGlmaWVkUHJvcHMgPSBIZWxwZXJzLm1vZGlmeVByb3BzKHByb3BzLCBmYWxsYmFja1Byb3BzLCBcImxlZ2VuZFwiKTtcbiAgcHJvcHMgPSBfYXNzaWduKHt9LCBtb2RpZmllZFByb3BzLCBnZXRDYWxjdWxhdGVkVmFsdWVzKG1vZGlmaWVkUHJvcHMpKTtcbiAgdmFyIF9wcm9wcyA9IHByb3BzLFxuICAgICAgdGl0bGUgPSBfcHJvcHMudGl0bGUsXG4gICAgICB0aXRsZU9yaWVudGF0aW9uID0gX3Byb3BzLnRpdGxlT3JpZW50YXRpb247XG4gIHZhciBncm91cGVkRGF0YSA9IGdyb3VwRGF0YShwcm9wcyk7XG4gIHZhciBjb2x1bW5XaWR0aHMgPSBnZXRDb2x1bW5XaWR0aHMocHJvcHMsIGdyb3VwZWREYXRhKTtcbiAgdmFyIHJvd0hlaWdodHMgPSBnZXRSb3dIZWlnaHRzKHByb3BzLCBncm91cGVkRGF0YSk7XG4gIHZhciB0aXRsZURpbWVuc2lvbnMgPSB0aXRsZSA/IGdldFRpdGxlRGltZW5zaW9ucyhwcm9wcykgOiB7XG4gICAgaGVpZ2h0OiAwLFxuICAgIHdpZHRoOiAwXG4gIH07XG4gIHJldHVybiB7XG4gICAgaGVpZ2h0OiB0aXRsZU9yaWVudGF0aW9uID09PSBcImxlZnRcIiB8fCB0aXRsZU9yaWVudGF0aW9uID09PSBcInJpZ2h0XCIgPyBNYXRoLm1heChfc3VtKHJvd0hlaWdodHMpLCB0aXRsZURpbWVuc2lvbnMuaGVpZ2h0KSA6IF9zdW0ocm93SGVpZ2h0cykgKyB0aXRsZURpbWVuc2lvbnMuaGVpZ2h0LFxuICAgIHdpZHRoOiB0aXRsZU9yaWVudGF0aW9uID09PSBcImxlZnRcIiB8fCB0aXRsZU9yaWVudGF0aW9uID09PSBcInJpZ2h0XCIgPyBfc3VtKGNvbHVtbldpZHRocykgKyB0aXRsZURpbWVuc2lvbnMud2lkdGggOiBNYXRoLm1heChfc3VtKGNvbHVtbldpZHRocyksIHRpdGxlRGltZW5zaW9ucy53aWR0aClcbiAgfTtcbn07XG5leHBvcnQgdmFyIGdldEJhc2VQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcywgZmFsbGJhY2tQcm9wcykge1xuICB2YXIgbW9kaWZpZWRQcm9wcyA9IEhlbHBlcnMubW9kaWZ5UHJvcHMocHJvcHMsIGZhbGxiYWNrUHJvcHMsIFwibGVnZW5kXCIpO1xuICBwcm9wcyA9IF9hc3NpZ24oe30sIG1vZGlmaWVkUHJvcHMsIGdldENhbGN1bGF0ZWRWYWx1ZXMobW9kaWZpZWRQcm9wcykpO1xuICB2YXIgX3Byb3BzMiA9IHByb3BzLFxuICAgICAgZGF0YSA9IF9wcm9wczIuZGF0YSxcbiAgICAgIHN0YW5kYWxvbmUgPSBfcHJvcHMyLnN0YW5kYWxvbmUsXG4gICAgICB0aGVtZSA9IF9wcm9wczIudGhlbWUsXG4gICAgICBwYWRkaW5nID0gX3Byb3BzMi5wYWRkaW5nLFxuICAgICAgc3R5bGUgPSBfcHJvcHMyLnN0eWxlLFxuICAgICAgY29sb3JTY2FsZSA9IF9wcm9wczIuY29sb3JTY2FsZSxcbiAgICAgIGd1dHRlciA9IF9wcm9wczIuZ3V0dGVyLFxuICAgICAgcm93R3V0dGVyID0gX3Byb3BzMi5yb3dHdXR0ZXIsXG4gICAgICBib3JkZXJQYWRkaW5nID0gX3Byb3BzMi5ib3JkZXJQYWRkaW5nLFxuICAgICAgdGl0bGUgPSBfcHJvcHMyLnRpdGxlLFxuICAgICAgdGl0bGVPcmllbnRhdGlvbiA9IF9wcm9wczIudGl0bGVPcmllbnRhdGlvbixcbiAgICAgIG5hbWUgPSBfcHJvcHMyLm5hbWUsXG4gICAgICBfcHJvcHMyJHggPSBfcHJvcHMyLngsXG4gICAgICB4ID0gX3Byb3BzMiR4ID09PSB2b2lkIDAgPyAwIDogX3Byb3BzMiR4LFxuICAgICAgX3Byb3BzMiR5ID0gX3Byb3BzMi55LFxuICAgICAgeSA9IF9wcm9wczIkeSA9PT0gdm9pZCAwID8gMCA6IF9wcm9wczIkeTtcbiAgdmFyIGdyb3VwZWREYXRhID0gZ3JvdXBEYXRhKHByb3BzKTtcbiAgdmFyIGNvbHVtbldpZHRocyA9IGdldENvbHVtbldpZHRocyhwcm9wcywgZ3JvdXBlZERhdGEpO1xuICB2YXIgcm93SGVpZ2h0cyA9IGdldFJvd0hlaWdodHMocHJvcHMsIGdyb3VwZWREYXRhKTtcbiAgdmFyIGxhYmVsU3R5bGVzID0gZ2V0TGFiZWxTdHlsZXMocHJvcHMpO1xuICB2YXIgdGl0bGVEaW1lbnNpb25zID0gdGl0bGUgPyBnZXRUaXRsZURpbWVuc2lvbnMocHJvcHMpIDoge1xuICAgIGhlaWdodDogMCxcbiAgICB3aWR0aDogMFxuICB9O1xuICB2YXIgdGl0bGVPZmZzZXQgPSB7XG4gICAgeDogdGl0bGVPcmllbnRhdGlvbiA9PT0gXCJsZWZ0XCIgPyB0aXRsZURpbWVuc2lvbnMud2lkdGggOiAwLFxuICAgIHk6IHRpdGxlT3JpZW50YXRpb24gPT09IFwidG9wXCIgPyB0aXRsZURpbWVuc2lvbnMuaGVpZ2h0IDogMFxuICB9O1xuICB2YXIgZ3V0dGVyT2Zmc2V0ID0ge1xuICAgIHg6IGd1dHRlciAmJiB0eXBlb2YgZ3V0dGVyID09PSBcIm9iamVjdFwiID8gZ3V0dGVyLmxlZnQgfHwgMCA6IDAsXG4gICAgeTogcm93R3V0dGVyICYmIHR5cGVvZiByb3dHdXR0ZXIgPT09IFwib2JqZWN0XCIgPyByb3dHdXR0ZXIudG9wIHx8IDAgOiAwXG4gIH07XG5cbiAgdmFyIF9nZXREaW1lbnNpb25zID0gZ2V0RGltZW5zaW9ucyhwcm9wcywgZmFsbGJhY2tQcm9wcyksXG4gICAgICBoZWlnaHQgPSBfZ2V0RGltZW5zaW9ucy5oZWlnaHQsXG4gICAgICB3aWR0aCA9IF9nZXREaW1lbnNpb25zLndpZHRoO1xuXG4gIHZhciBib3JkZXJQcm9wcyA9IGdldEJvcmRlclByb3BzKHByb3BzLCBoZWlnaHQsIHdpZHRoKTtcbiAgdmFyIHRpdGxlUHJvcHMgPSBnZXRUaXRsZVByb3BzKHByb3BzLCBib3JkZXJQcm9wcyk7XG4gIHZhciBpbml0aWFsUHJvcHMgPSB7XG4gICAgcGFyZW50OiB7XG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgc3RhbmRhbG9uZTogc3RhbmRhbG9uZSxcbiAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgaGVpZ2h0OiBwcm9wcy5oZWlnaHQsXG4gICAgICB3aWR0aDogcHJvcHMud2lkdGgsXG4gICAgICBzdHlsZTogc3R5bGUucGFyZW50XG4gICAgfSxcbiAgICBhbGw6IHtcbiAgICAgIGJvcmRlcjogYm9yZGVyUHJvcHMsXG4gICAgICB0aXRsZTogdGl0bGVQcm9wc1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGdyb3VwZWREYXRhLnJlZHVjZShmdW5jdGlvbiAoY2hpbGRQcm9wcywgZGF0dW0sIGkpIHtcbiAgICB2YXIgY29sb3IgPSBjb2xvclNjYWxlW2kgJSBjb2xvclNjYWxlLmxlbmd0aF07XG5cbiAgICB2YXIgZGF0YVN0eWxlID0gX2RlZmF1bHRzKHt9LCBkYXR1bS5zeW1ib2wsIHN0eWxlLmRhdGEsIHtcbiAgICAgIGZpbGw6IGNvbG9yXG4gICAgfSk7XG5cbiAgICB2YXIgZXZlbnRLZXkgPSAhX2lzTmlsKGRhdHVtLmV2ZW50S2V5KSA/IGRhdHVtLmV2ZW50S2V5IDogaTtcbiAgICB2YXIgb2Zmc2V0ID0gZ2V0T2Zmc2V0KGRhdHVtLCByb3dIZWlnaHRzLCBjb2x1bW5XaWR0aHMpO1xuICAgIHZhciBvcmlnaW5ZID0geSArIGJvcmRlclBhZGRpbmcudG9wICsgZGF0dW0uc3ltYm9sU3BhY2VyO1xuICAgIHZhciBvcmlnaW5YID0geCArIGJvcmRlclBhZGRpbmcubGVmdCArIGRhdHVtLnN5bWJvbFNwYWNlcjtcbiAgICB2YXIgZGF0YVByb3BzID0ge1xuICAgICAgaW5kZXg6IGksXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgZGF0dW06IGRhdHVtLFxuICAgICAgc3ltYm9sOiBkYXRhU3R5bGUudHlwZSB8fCBkYXRhU3R5bGUuc3ltYm9sIHx8IFwiY2lyY2xlXCIsXG4gICAgICBzaXplOiBkYXR1bS5zaXplLFxuICAgICAgc3R5bGU6IGRhdGFTdHlsZSxcbiAgICAgIHk6IG9yaWdpblkgKyBvZmZzZXQueSArIHRpdGxlT2Zmc2V0LnkgKyBndXR0ZXJPZmZzZXQueSxcbiAgICAgIHg6IG9yaWdpblggKyBvZmZzZXQueCArIHRpdGxlT2Zmc2V0LnggKyBndXR0ZXJPZmZzZXQueFxuICAgIH07XG4gICAgdmFyIGxhYmVsUHJvcHMgPSB7XG4gICAgICBkYXR1bTogZGF0dW0sXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgdGV4dDogZGF0dW0ubmFtZSxcbiAgICAgIHN0eWxlOiBsYWJlbFN0eWxlc1tpXSxcbiAgICAgIHk6IGRhdGFQcm9wcy55LFxuICAgICAgeDogZGF0YVByb3BzLnggKyBkYXR1bS5zeW1ib2xTcGFjZXIgKyBkYXR1bS5zaXplIC8gMlxuICAgIH07XG4gICAgY2hpbGRQcm9wc1tldmVudEtleV0gPSB7XG4gICAgICBkYXRhOiBkYXRhUHJvcHMsXG4gICAgICBsYWJlbHM6IGxhYmVsUHJvcHNcbiAgICB9O1xuICAgIHJldHVybiBjaGlsZFByb3BzO1xuICB9LCBpbml0aWFsUHJvcHMpO1xufTsiLCJpbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHsgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTsgfSkpOyB9IG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCAqIGFzIEhlbHBlcnMgZnJvbSBcIi4uL3ZpY3RvcnktdXRpbC9oZWxwZXJzXCI7XG5pbXBvcnQgKiBhcyBDb21tb25Qcm9wcyBmcm9tIFwiLi4vdmljdG9yeS11dGlsL2NvbW1vbi1wcm9wc1wiO1xuaW1wb3J0IFJlY3QgZnJvbSBcIi4vcmVjdFwiO1xuXG52YXIgZXZhbHVhdGVQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAvKipcbiAgICogUG90ZW50aWFsIGV2YWx1YXRlZCBwcm9wcyBhcmU6XG4gICAqIGBhcmlhTGFiZWxgXG4gICAqIGBkZXNjYFxuICAgKiBgaWRgXG4gICAqIGBzdHlsZWBcbiAgICogYHRhYkluZGV4YFxuICAgKi9cbiAgdmFyIGFyaWFMYWJlbCA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmFyaWFMYWJlbCwgcHJvcHMpO1xuICB2YXIgZGVzYyA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmRlc2MsIHByb3BzKTtcbiAgdmFyIGlkID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuaWQsIHByb3BzKTtcbiAgdmFyIHN0eWxlID0gSGVscGVycy5ldmFsdWF0ZVN0eWxlKF9hc3NpZ24oe1xuICAgIGZpbGw6IFwibm9uZVwiXG4gIH0sIHByb3BzLnN0eWxlKSwgcHJvcHMpO1xuICB2YXIgdGFiSW5kZXggPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy50YWJJbmRleCwgcHJvcHMpO1xuICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBhcmlhTGFiZWw6IGFyaWFMYWJlbCxcbiAgICBkZXNjOiBkZXNjLFxuICAgIGlkOiBpZCxcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgdGFiSW5kZXg6IHRhYkluZGV4XG4gIH0pO1xufTtcblxudmFyIEJvcmRlciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBwcm9wcyA9IGV2YWx1YXRlUHJvcHMocHJvcHMpO1xuICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KHByb3BzLnJlY3RDb21wb25lbnQsIF9vYmplY3RTcHJlYWQoe30sIHByb3BzLmV2ZW50cywge1xuICAgIFwiYXJpYS1sYWJlbFwiOiBwcm9wcy5hcmlhTGFiZWwsXG4gICAgc3R5bGU6IHByb3BzLnN0eWxlLFxuICAgIGRlc2M6IHByb3BzLmRlc2MsXG4gICAgdGFiSW5kZXg6IHByb3BzLnRhYkluZGV4LFxuICAgIHRyYW5zZm9ybTogcHJvcHMudHJhbnNmb3JtLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIHJvbGU6IHByb3BzLnJvbGUsXG4gICAgc2hhcGVSZW5kZXJpbmc6IHByb3BzLnNoYXBlUmVuZGVyaW5nLFxuICAgIHg6IHByb3BzLngsXG4gICAgeTogcHJvcHMueSxcbiAgICB3aWR0aDogcHJvcHMud2lkdGgsXG4gICAgaGVpZ2h0OiBwcm9wcy5oZWlnaHQsXG4gICAgY2xpcFBhdGg6IHByb3BzLmNsaXBQYXRoXG4gIH0pKTtcbn07XG5cbkJvcmRlci5wcm9wVHlwZXMgPSBfb2JqZWN0U3ByZWFkKHt9LCBDb21tb25Qcm9wcy5wcmltaXRpdmVQcm9wcywge1xuICBoZWlnaHQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIHJlY3RDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICB3aWR0aDogUHJvcFR5cGVzLm51bWJlcixcbiAgeDogUHJvcFR5cGVzLm51bWJlcixcbiAgeTogUHJvcFR5cGVzLm51bWJlclxufSk7XG5Cb3JkZXIuZGVmYXVsdFByb3BzID0ge1xuICByZWN0Q29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KFJlY3QsIG51bGwpLFxuICByb2xlOiBcInByZXNlbnRhdGlvblwiLFxuICBzaGFwZVJlbmRlcmluZzogXCJhdXRvXCJcbn07XG5leHBvcnQgZGVmYXVsdCBCb3JkZXI7IiwiaW1wb3J0IF9yYW5nZSBmcm9tIFwibG9kYXNoL3JhbmdlXCI7XG5leHBvcnQgZGVmYXVsdCB7XG4gIGNpcmNsZTogZnVuY3Rpb24gKHgsIHksIHNpemUpIHtcbiAgICByZXR1cm4gXCJNIFwiLmNvbmNhdCh4LCBcIiwgXCIpLmNvbmNhdCh5LCBcIlxcbiAgICAgIG0gXCIpLmNvbmNhdCgtc2l6ZSwgXCIsIDBcXG4gICAgICBhIFwiKS5jb25jYXQoc2l6ZSwgXCIsIFwiKS5jb25jYXQoc2l6ZSwgXCIgMCAxLDAgXCIpLmNvbmNhdChzaXplICogMiwgXCIsMFxcbiAgICAgIGEgXCIpLmNvbmNhdChzaXplLCBcIiwgXCIpLmNvbmNhdChzaXplLCBcIiAwIDEsMCBcIikuY29uY2F0KC1zaXplICogMiwgXCIsMFwiKTtcbiAgfSxcbiAgc3F1YXJlOiBmdW5jdGlvbiAoeCwgeSwgc2l6ZSkge1xuICAgIHZhciBiYXNlU2l6ZSA9IDAuODcgKiBzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcblxuICAgIHZhciB4MCA9IHggLSBiYXNlU2l6ZTtcbiAgICB2YXIgeTEgPSB5ICsgYmFzZVNpemU7XG4gICAgdmFyIGRpc3RhbmNlID0geCArIGJhc2VTaXplIC0geDA7XG4gICAgcmV0dXJuIFwiTSBcIi5jb25jYXQoeDAsIFwiLCBcIikuY29uY2F0KHkxLCBcIlxcbiAgICAgIGhcIikuY29uY2F0KGRpc3RhbmNlLCBcIlxcbiAgICAgIHYtXCIpLmNvbmNhdChkaXN0YW5jZSwgXCJcXG4gICAgICBoLVwiKS5jb25jYXQoZGlzdGFuY2UsIFwiXFxuICAgICAgelwiKTtcbiAgfSxcbiAgZGlhbW9uZDogZnVuY3Rpb24gKHgsIHksIHNpemUpIHtcbiAgICB2YXIgYmFzZVNpemUgPSAwLjg3ICogc2l6ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG5cbiAgICB2YXIgbGVuZ3RoID0gTWF0aC5zcXJ0KDIgKiAoYmFzZVNpemUgKiBiYXNlU2l6ZSkpO1xuICAgIHJldHVybiBcIk0gXCIuY29uY2F0KHgsIFwiLCBcIikuY29uY2F0KHkgKyBsZW5ndGgsIFwiXFxuICAgICAgbCBcIikuY29uY2F0KGxlbmd0aCwgXCIsIC1cIikuY29uY2F0KGxlbmd0aCwgXCJcXG4gICAgICBsIC1cIikuY29uY2F0KGxlbmd0aCwgXCIsIC1cIikuY29uY2F0KGxlbmd0aCwgXCJcXG4gICAgICBsIC1cIikuY29uY2F0KGxlbmd0aCwgXCIsIFwiKS5jb25jYXQobGVuZ3RoLCBcIlxcbiAgICAgIGwgXCIpLmNvbmNhdChsZW5ndGgsIFwiLCBcIikuY29uY2F0KGxlbmd0aCwgXCJcXG4gICAgICB6XCIpO1xuICB9LFxuICB0cmlhbmdsZURvd246IGZ1bmN0aW9uICh4LCB5LCBzaXplKSB7XG4gICAgdmFyIGhlaWdodCA9IHNpemUgLyAyICogTWF0aC5zcXJ0KDMpO1xuICAgIHZhciB4MCA9IHggLSBzaXplO1xuICAgIHZhciB4MSA9IHggKyBzaXplO1xuICAgIHZhciB5MCA9IHkgLSBzaXplO1xuICAgIHZhciB5MSA9IHkgKyBoZWlnaHQ7XG4gICAgcmV0dXJuIFwiTSBcIi5jb25jYXQoeDAsIFwiLCBcIikuY29uY2F0KHkwLCBcIlxcbiAgICAgIEwgXCIpLmNvbmNhdCh4MSwgXCIsIFwiKS5jb25jYXQoeTAsIFwiXFxuICAgICAgTCBcIikuY29uY2F0KHgsIFwiLCBcIikuY29uY2F0KHkxLCBcIlxcbiAgICAgIHpcIik7XG4gIH0sXG4gIHRyaWFuZ2xlVXA6IGZ1bmN0aW9uICh4LCB5LCBzaXplKSB7XG4gICAgdmFyIGhlaWdodCA9IHNpemUgLyAyICogTWF0aC5zcXJ0KDMpO1xuICAgIHZhciB4MCA9IHggLSBzaXplO1xuICAgIHZhciB4MSA9IHggKyBzaXplO1xuICAgIHZhciB5MCA9IHkgLSBoZWlnaHQ7XG4gICAgdmFyIHkxID0geSArIHNpemU7XG4gICAgcmV0dXJuIFwiTSBcIi5jb25jYXQoeDAsIFwiLCBcIikuY29uY2F0KHkxLCBcIlxcbiAgICAgIEwgXCIpLmNvbmNhdCh4MSwgXCIsIFwiKS5jb25jYXQoeTEsIFwiXFxuICAgICAgTCBcIikuY29uY2F0KHgsIFwiLCBcIikuY29uY2F0KHkwLCBcIlxcbiAgICAgIHpcIik7XG4gIH0sXG4gIHBsdXM6IGZ1bmN0aW9uICh4LCB5LCBzaXplKSB7XG4gICAgdmFyIGJhc2VTaXplID0gMS4xICogc2l6ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG5cbiAgICB2YXIgZGlzdGFuY2UgPSBiYXNlU2l6ZSAvIDEuNTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG5cbiAgICByZXR1cm4gXCJcXG4gICAgICBNIFwiLmNvbmNhdCh4IC0gZGlzdGFuY2UgLyAyLCBcIiwgXCIpLmNvbmNhdCh5ICsgYmFzZVNpemUsIFwiXFxuICAgICAgdi1cIikuY29uY2F0KGRpc3RhbmNlLCBcIlxcbiAgICAgIGgtXCIpLmNvbmNhdChkaXN0YW5jZSwgXCJcXG4gICAgICB2LVwiKS5jb25jYXQoZGlzdGFuY2UsIFwiXFxuICAgICAgaFwiKS5jb25jYXQoZGlzdGFuY2UsIFwiXFxuICAgICAgdi1cIikuY29uY2F0KGRpc3RhbmNlLCBcIlxcbiAgICAgIGhcIikuY29uY2F0KGRpc3RhbmNlLCBcIlxcbiAgICAgIHZcIikuY29uY2F0KGRpc3RhbmNlLCBcIlxcbiAgICAgIGhcIikuY29uY2F0KGRpc3RhbmNlLCBcIlxcbiAgICAgIHZcIikuY29uY2F0KGRpc3RhbmNlLCBcIlxcbiAgICAgIGgtXCIpLmNvbmNhdChkaXN0YW5jZSwgXCJcXG4gICAgICB2XCIpLmNvbmNhdChkaXN0YW5jZSwgXCJcXG4gICAgICB6XCIpO1xuICB9LFxuICBjcm9zczogZnVuY3Rpb24gKHgsIHksIHNpemUpIHtcbiAgICB2YXIgYmFzZVNpemUgPSAwLjggKiBzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcblxuICAgIHZhciBkaXN0YW5jZSA9IGJhc2VTaXplIC8gMS41OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcblxuICAgIHJldHVybiBcIlxcbiAgICAgIE0gXCIuY29uY2F0KHggLSBkaXN0YW5jZSAvIDIsIFwiLCBcIikuY29uY2F0KHkgKyBiYXNlU2l6ZSArIGRpc3RhbmNlLCBcIlxcbiAgICAgIHYtXCIpLmNvbmNhdChkaXN0YW5jZSAqIDIsIFwiXFxuICAgICAgaC1cIikuY29uY2F0KGRpc3RhbmNlLCBcIlxcbiAgICAgIHYtXCIpLmNvbmNhdChkaXN0YW5jZSwgXCJcXG4gICAgICBoXCIpLmNvbmNhdChkaXN0YW5jZSwgXCJcXG4gICAgICB2LVwiKS5jb25jYXQoZGlzdGFuY2UsIFwiXFxuICAgICAgaFwiKS5jb25jYXQoZGlzdGFuY2UsIFwiXFxuICAgICAgdlwiKS5jb25jYXQoZGlzdGFuY2UsIFwiXFxuICAgICAgaFwiKS5jb25jYXQoZGlzdGFuY2UsIFwiXFxuICAgICAgdlwiKS5jb25jYXQoZGlzdGFuY2UsIFwiXFxuICAgICAgaC1cIikuY29uY2F0KGRpc3RhbmNlLCBcIlxcbiAgICAgIHZcIikuY29uY2F0KGRpc3RhbmNlICogMiwgXCJcXG4gICAgICB6XCIpO1xuICB9LFxuICBtaW51czogZnVuY3Rpb24gKHgsIHksIHNpemUpIHtcbiAgICB2YXIgYmFzZVNpemUgPSAxLjEgKiBzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcblxuICAgIHZhciBsaW5lSGVpZ2h0ID0gYmFzZVNpemUgLSBiYXNlU2l6ZSAqIDAuMzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG5cbiAgICB2YXIgeDAgPSB4IC0gYmFzZVNpemU7XG4gICAgdmFyIHkxID0geSArIGxpbmVIZWlnaHQgLyAyO1xuICAgIHZhciBkaXN0YW5jZSA9IHggKyBiYXNlU2l6ZSAtIHgwO1xuICAgIHJldHVybiBcIk0gXCIuY29uY2F0KHgwLCBcIiwgXCIpLmNvbmNhdCh5MSwgXCJcXG4gICAgICBoXCIpLmNvbmNhdChkaXN0YW5jZSwgXCJcXG4gICAgICB2LVwiKS5jb25jYXQobGluZUhlaWdodCwgXCJcXG4gICAgICBoLVwiKS5jb25jYXQoZGlzdGFuY2UsIFwiXFxuICAgICAgelwiKTtcbiAgfSxcbiAgc3RhcjogZnVuY3Rpb24gKHgsIHksIHNpemUpIHtcbiAgICB2YXIgYmFzZVNpemUgPSAxLjM1ICogc2l6ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG5cbiAgICB2YXIgYW5nbGUgPSBNYXRoLlBJIC8gNTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcblxuICAgIHZhciBzdGFyQ29vcmRzID0gX3JhbmdlKDEwKS5tYXAoZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gaW5kZXggJSAyID09PSAwID8gYmFzZVNpemUgOiBiYXNlU2l6ZSAvIDI7XG4gICAgICByZXR1cm4gXCJcIi5jb25jYXQobGVuZ3RoICogTWF0aC5zaW4oYW5nbGUgKiAoaW5kZXggKyAxKSkgKyB4LCBcIixcXG4gICAgICAgIFwiKS5jb25jYXQobGVuZ3RoICogTWF0aC5jb3MoYW5nbGUgKiAoaW5kZXggKyAxKSkgKyB5KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBcIk0gXCIuY29uY2F0KHN0YXJDb29yZHMuam9pbihcIkxcIiksIFwiIHpcIik7XG4gIH1cbn07IiwiaW1wb3J0IF9hc3NpZ24gZnJvbSBcImxvZGFzaC9hc3NpZ25cIjtcblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgKiBhcyBIZWxwZXJzIGZyb20gXCIuLi92aWN0b3J5LXV0aWwvaGVscGVyc1wiO1xuaW1wb3J0IHBhdGhIZWxwZXJzIGZyb20gXCIuLi92aWN0b3J5LXV0aWwvcG9pbnQtcGF0aC1oZWxwZXJzXCI7XG5pbXBvcnQgKiBhcyBDb21tb25Qcm9wcyBmcm9tIFwiLi4vdmljdG9yeS11dGlsL2NvbW1vbi1wcm9wc1wiO1xuaW1wb3J0IFBhdGggZnJvbSBcIi4vcGF0aFwiO1xuXG52YXIgZ2V0UGF0aCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgeCA9IHByb3BzLngsXG4gICAgICB5ID0gcHJvcHMueSxcbiAgICAgIHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgc3ltYm9sID0gcHJvcHMuc3ltYm9sO1xuXG4gIGlmIChwcm9wcy5nZXRQYXRoKSB7XG4gICAgcmV0dXJuIHByb3BzLmdldFBhdGgoeCwgeSwgc2l6ZSk7XG4gIH1cblxuICB2YXIgcGF0aEZ1bmN0aW9ucyA9IHtcbiAgICBjaXJjbGU6IHBhdGhIZWxwZXJzLmNpcmNsZSxcbiAgICBzcXVhcmU6IHBhdGhIZWxwZXJzLnNxdWFyZSxcbiAgICBkaWFtb25kOiBwYXRoSGVscGVycy5kaWFtb25kLFxuICAgIHRyaWFuZ2xlRG93bjogcGF0aEhlbHBlcnMudHJpYW5nbGVEb3duLFxuICAgIHRyaWFuZ2xlVXA6IHBhdGhIZWxwZXJzLnRyaWFuZ2xlVXAsXG4gICAgcGx1czogcGF0aEhlbHBlcnMucGx1cyxcbiAgICBtaW51czogcGF0aEhlbHBlcnMubWludXMsXG4gICAgc3RhcjogcGF0aEhlbHBlcnMuc3RhcixcbiAgICBjcm9zczogcGF0aEhlbHBlcnMuY3Jvc3NcbiAgfTtcbiAgdmFyIHN5bWJvbEZ1bmN0aW9uID0gdHlwZW9mIHBhdGhGdW5jdGlvbnNbc3ltYm9sXSA9PT0gXCJmdW5jdGlvblwiID8gcGF0aEZ1bmN0aW9uc1tzeW1ib2xdIDogcGF0aEZ1bmN0aW9ucy5jaXJjbGU7XG4gIHJldHVybiBzeW1ib2xGdW5jdGlvbih4LCB5LCBzaXplKTtcbn07XG5cbnZhciBldmFsdWF0ZVByb3BzID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIC8qKlxuICAgKiBQb3RlbnRpYWwgZXZhbHVhdGVkIHByb3BzIGFyZTpcbiAgICogYGFyaWFMYWJlbGBcbiAgICogYGRlc2NgXG4gICAqIGBpZGBcbiAgICogYHNpemVgXG4gICAqIGBzdHlsZWBcbiAgICogYHN5bWJvbGBcbiAgICogYHRhYkluZGV4YFxuICAgKi9cbiAgdmFyIGFyaWFMYWJlbCA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmFyaWFMYWJlbCwgcHJvcHMpO1xuICB2YXIgZGVzYyA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmRlc2MsIHByb3BzKTtcbiAgdmFyIGlkID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuaWQsIHByb3BzKTtcbiAgdmFyIHNpemUgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy5zaXplLCBwcm9wcyk7XG4gIHZhciBzdHlsZSA9IEhlbHBlcnMuZXZhbHVhdGVTdHlsZShwcm9wcy5zdHlsZSwgcHJvcHMpO1xuICB2YXIgc3ltYm9sID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuc3ltYm9sLCBwcm9wcyk7XG4gIHZhciB0YWJJbmRleCA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLnRhYkluZGV4LCBwcm9wcyk7XG4gIHJldHVybiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgIGFyaWFMYWJlbDogYXJpYUxhYmVsLFxuICAgIGRlc2M6IGRlc2MsXG4gICAgaWQ6IGlkLFxuICAgIHNpemU6IHNpemUsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHN5bWJvbDogc3ltYm9sLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleFxuICB9KTtcbn07XG5cbnZhciBQb2ludCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBwcm9wcyA9IGV2YWx1YXRlUHJvcHMocHJvcHMpO1xuICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KHByb3BzLnBhdGhDb21wb25lbnQsIF9vYmplY3RTcHJlYWQoe30sIHByb3BzLmV2ZW50cywge1xuICAgIFwiYXJpYS1sYWJlbFwiOiBwcm9wcy5hcmlhTGFiZWwsXG4gICAgZDogZ2V0UGF0aChwcm9wcyksXG4gICAgc3R5bGU6IHByb3BzLnN0eWxlLFxuICAgIGRlc2M6IHByb3BzLmRlc2MsXG4gICAgdGFiSW5kZXg6IHByb3BzLnRhYkluZGV4LFxuICAgIHJvbGU6IHByb3BzLnJvbGUsXG4gICAgc2hhcGVSZW5kZXJpbmc6IHByb3BzLnNoYXBlUmVuZGVyaW5nLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIHRyYW5zZm9ybTogcHJvcHMudHJhbnNmb3JtLFxuICAgIGNsaXBQYXRoOiBwcm9wcy5jbGlwUGF0aFxuICB9KSk7XG59O1xuXG5Qb2ludC5wcm9wVHlwZXMgPSBfb2JqZWN0U3ByZWFkKHt9LCBDb21tb25Qcm9wcy5wcmltaXRpdmVQcm9wcywge1xuICBkYXR1bTogUHJvcFR5cGVzLm9iamVjdCxcbiAgZ2V0UGF0aDogUHJvcFR5cGVzLmZ1bmMsXG4gIHBhdGhDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICBzaXplOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuZnVuY10pLFxuICBzeW1ib2w6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vbmVPZihbXCJjaXJjbGVcIiwgXCJjcm9zc1wiLCBcImRpYW1vbmRcIiwgXCJwbHVzXCIsIFwibWludXNcIiwgXCJzcXVhcmVcIiwgXCJzdGFyXCIsIFwidHJpYW5nbGVEb3duXCIsIFwidHJpYW5nbGVVcFwiXSksIFByb3BUeXBlcy5mdW5jXSksXG4gIHg6IFByb3BUeXBlcy5udW1iZXIsXG4gIHk6IFByb3BUeXBlcy5udW1iZXJcbn0pO1xuUG9pbnQuZGVmYXVsdFByb3BzID0ge1xuICBwYXRoQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KFBhdGgsIG51bGwpLFxuICByb2xlOiBcInByZXNlbnRhdGlvblwiLFxuICBzaGFwZVJlbmRlcmluZzogXCJhdXRvXCJcbn07XG5leHBvcnQgZGVmYXVsdCBQb2ludDsiLCJmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCB7IGdldEJhc2VQcm9wcywgZ2V0RGltZW5zaW9ucyB9IGZyb20gXCIuL2hlbHBlci1tZXRob2RzXCI7XG5pbXBvcnQgeyBQcm9wVHlwZXMgYXMgQ3VzdG9tUHJvcFR5cGVzLCBhZGRFdmVudHMsIEhlbHBlcnMsIFZpY3RvcnlMYWJlbCwgVmljdG9yeUNvbnRhaW5lciwgVmljdG9yeVRoZW1lLCBQb2ludCwgQm9yZGVyIH0gZnJvbSBcInZpY3RvcnktY29yZVwiO1xudmFyIGZhbGxiYWNrUHJvcHMgPSB7XG4gIG9yaWVudGF0aW9uOiBcInZlcnRpY2FsXCIsXG4gIHRpdGxlT3JpZW50YXRpb246IFwidG9wXCIsXG4gIHdpZHRoOiA0NTAsXG4gIGhlaWdodDogMzAwLFxuICB4OiAwLFxuICB5OiAwXG59O1xudmFyIGRlZmF1bHRMZWdlbmREYXRhID0gW3tcbiAgbmFtZTogXCJTZXJpZXMgMVwiXG59LCB7XG4gIG5hbWU6IFwiU2VyaWVzIDJcIlxufV07XG5cbnZhciBWaWN0b3J5TGVnZW5kID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhWaWN0b3J5TGVnZW5kLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBWaWN0b3J5TGVnZW5kKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBWaWN0b3J5TGVnZW5kKTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoVmljdG9yeUxlZ2VuZC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFZpY3RvcnlMZWdlbmQpKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhWaWN0b3J5TGVnZW5kLCBbe1xuICAgIGtleTogXCJyZW5kZXJDaGlsZHJlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJDaGlsZHJlbihwcm9wcykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGRhdGFDb21wb25lbnQgPSBwcm9wcy5kYXRhQ29tcG9uZW50LFxuICAgICAgICAgIGxhYmVsQ29tcG9uZW50ID0gcHJvcHMubGFiZWxDb21wb25lbnQsXG4gICAgICAgICAgdGl0bGUgPSBwcm9wcy50aXRsZTtcbiAgICAgIHZhciBkYXRhQ29tcG9uZW50cyA9IHRoaXMuZGF0YUtleXMubWFwKGZ1bmN0aW9uIChfZGF0YUtleSwgaW5kZXgpIHtcbiAgICAgICAgaWYgKF9kYXRhS2V5ID09PSBcImFsbFwiKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkYXRhUHJvcHMgPSBfdGhpcy5nZXRDb21wb25lbnRQcm9wcyhkYXRhQ29tcG9uZW50LCBcImRhdGFcIiwgaW5kZXgpO1xuXG4gICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoZGF0YUNvbXBvbmVudCwgZGF0YVByb3BzKTtcbiAgICAgIH0pLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIHZhciBsYWJlbENvbXBvbmVudHMgPSB0aGlzLmRhdGFLZXlzLm1hcChmdW5jdGlvbiAoX2RhdGFLZXksIGluZGV4KSB7XG4gICAgICAgIGlmIChfZGF0YUtleSA9PT0gXCJhbGxcIikge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGFiZWxQcm9wcyA9IF90aGlzLmdldENvbXBvbmVudFByb3BzKGxhYmVsQ29tcG9uZW50LCBcImxhYmVsc1wiLCBpbmRleCk7XG5cbiAgICAgICAgaWYgKGxhYmVsUHJvcHMudGV4dCAhPT0gdW5kZWZpbmVkICYmIGxhYmVsUHJvcHMudGV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQobGFiZWxDb21wb25lbnQsIGxhYmVsUHJvcHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIHZhciBib3JkZXJQcm9wcyA9IHRoaXMuZ2V0Q29tcG9uZW50UHJvcHMocHJvcHMuYm9yZGVyQ29tcG9uZW50LCBcImJvcmRlclwiLCBcImFsbFwiKTtcbiAgICAgIHZhciBib3JkZXJDb21wb25lbnQgPSBSZWFjdC5jbG9uZUVsZW1lbnQocHJvcHMuYm9yZGVyQ29tcG9uZW50LCBib3JkZXJQcm9wcyk7XG5cbiAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICB2YXIgdGl0bGVQcm9wcyA9IHRoaXMuZ2V0Q29tcG9uZW50UHJvcHMocHJvcHMudGl0bGUsIFwidGl0bGVcIiwgXCJhbGxcIik7XG4gICAgICAgIHZhciB0aXRsZUNvbXBvbmVudCA9IFJlYWN0LmNsb25lRWxlbWVudChwcm9wcy50aXRsZUNvbXBvbmVudCwgdGl0bGVQcm9wcyk7XG4gICAgICAgIHJldHVybiBbYm9yZGVyQ29tcG9uZW50XS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGRhdGFDb21wb25lbnRzKSwgW3RpdGxlQ29tcG9uZW50XSwgX3RvQ29uc3VtYWJsZUFycmF5KGxhYmVsQ29tcG9uZW50cykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW2JvcmRlckNvbXBvbmVudF0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShkYXRhQ29tcG9uZW50cyksIF90b0NvbnN1bWFibGVBcnJheShsYWJlbENvbXBvbmVudHMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciByb2xlID0gdGhpcy5jb25zdHJ1Y3Rvci5yb2xlO1xuICAgICAgdmFyIHByb3BzID0gSGVscGVycy5tb2RpZnlQcm9wcyh0aGlzLnByb3BzLCBmYWxsYmFja1Byb3BzLCByb2xlKTtcbiAgICAgIHZhciBjaGlsZHJlbiA9IFt0aGlzLnJlbmRlckNoaWxkcmVuKHByb3BzKV07XG4gICAgICByZXR1cm4gcHJvcHMuc3RhbmRhbG9uZSA/IHRoaXMucmVuZGVyQ29udGFpbmVyKHByb3BzLmNvbnRhaW5lckNvbXBvbmVudCwgY2hpbGRyZW4pIDogUmVhY3QuY2xvbmVFbGVtZW50KHByb3BzLmdyb3VwQ29tcG9uZW50LCB7fSwgY2hpbGRyZW4pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBWaWN0b3J5TGVnZW5kO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUxlZ2VuZCwgXCJkaXNwbGF5TmFtZVwiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBcIlZpY3RvcnlMZWdlbmRcIlxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUxlZ2VuZCwgXCJyb2xlXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFwibGVnZW5kXCJcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlMZWdlbmQsIFwicHJvcFR5cGVzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHtcbiAgICBib3JkZXJDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICAgIGJvcmRlclBhZGRpbmc6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICB0b3A6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICBib3R0b206IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICBsZWZ0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgcmlnaHQ6IFByb3BUeXBlcy5udW1iZXJcbiAgICB9KV0pLFxuICAgIGNlbnRlclRpdGxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBjb2xvclNjYWxlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSwgUHJvcFR5cGVzLm9uZU9mKFtcImdyYXlzY2FsZVwiLCBcInF1YWxpdGF0aXZlXCIsIFwiaGVhdG1hcFwiLCBcIndhcm1cIiwgXCJjb29sXCIsIFwicmVkXCIsIFwiZ3JlZW5cIiwgXCJibHVlXCJdKV0pLFxuICAgIGNvbnRhaW5lckNvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gICAgZGF0YTogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAgIGxhYmVsOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgc3ltYm9sOiBQcm9wVHlwZXMub2JqZWN0XG4gICAgfSkpLFxuICAgIGRhdGFDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICAgIGV2ZW50S2V5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgQ3VzdG9tUHJvcFR5cGVzLmFsbE9mVHlwZShbQ3VzdG9tUHJvcFR5cGVzLmludGVnZXIsIEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZV0pLCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gICAgZXZlbnRzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgdGFyZ2V0OiBQcm9wVHlwZXMub25lT2YoW1wiZGF0YVwiLCBcImxhYmVsc1wiLCBcInBhcmVudFwiXSksXG4gICAgICBldmVudEtleTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5LCBDdXN0b21Qcm9wVHlwZXMuYWxsT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMuaW50ZWdlciwgQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlXSksIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgICAgIGV2ZW50SGFuZGxlcnM6IFByb3BUeXBlcy5vYmplY3RcbiAgICB9KSksXG4gICAgZXh0ZXJuYWxFdmVudE11dGF0aW9uczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIGNhbGxiYWNrOiBQcm9wVHlwZXMuZnVuY3Rpb24sXG4gICAgICBjaGlsZE5hbWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5hcnJheV0pLFxuICAgICAgZXZlbnRLZXk6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheSwgQ3VzdG9tUHJvcFR5cGVzLmFsbE9mVHlwZShbQ3VzdG9tUHJvcFR5cGVzLmludGVnZXIsIEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZV0pLCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gICAgICBtdXRhdGlvbjogUHJvcFR5cGVzLmZ1bmN0aW9uLFxuICAgICAgdGFyZ2V0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuYXJyYXldKVxuICAgIH0pKSxcbiAgICBncm91cENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gICAgZ3V0dGVyOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgbGVmdDogUHJvcFR5cGVzLm51bWJlcixcbiAgICAgIHJpZ2h0OiBQcm9wVHlwZXMubnVtYmVyXG4gICAgfSldKSxcbiAgICBoZWlnaHQ6IEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZSxcbiAgICBpdGVtc1BlclJvdzogQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlLFxuICAgIGxhYmVsQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIG9yaWVudGF0aW9uOiBQcm9wVHlwZXMub25lT2YoW1wiaG9yaXpvbnRhbFwiLCBcInZlcnRpY2FsXCJdKSxcbiAgICBwYWRkaW5nOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgdG9wOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgYm90dG9tOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgbGVmdDogUHJvcFR5cGVzLm51bWJlcixcbiAgICAgIHJpZ2h0OiBQcm9wVHlwZXMubnVtYmVyXG4gICAgfSldKSxcbiAgICByb3dHdXR0ZXI6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICB0b3A6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICBib3R0b206IFByb3BUeXBlcy5udW1iZXJcbiAgICB9KV0pLFxuICAgIHNoYXJlZEV2ZW50czogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIGV2ZW50czogUHJvcFR5cGVzLmFycmF5LFxuICAgICAgZ2V0RXZlbnRTdGF0ZTogUHJvcFR5cGVzLmZ1bmNcbiAgICB9KSxcbiAgICBzdGFuZGFsb25lOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBzdHlsZTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIGJvcmRlcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIGRhdGE6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICBsYWJlbHM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICBwYXJlbnQ6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICB0aXRsZTogUHJvcFR5cGVzLm9iamVjdFxuICAgIH0pLFxuICAgIHN5bWJvbFNwYWNlcjogUHJvcFR5cGVzLm51bWJlcixcbiAgICB0aGVtZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICB0aXRsZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmFycmF5XSksXG4gICAgdGl0bGVDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICAgIHRpdGxlT3JpZW50YXRpb246IFByb3BUeXBlcy5vbmVPZihbXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwicmlnaHRcIl0pLFxuICAgIHdpZHRoOiBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmUsXG4gICAgeDogQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlLFxuICAgIHk6IEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZVxuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5TGVnZW5kLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiB7XG4gICAgYm9yZGVyQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KEJvcmRlciwgbnVsbCksXG4gICAgZGF0YTogZGVmYXVsdExlZ2VuZERhdGEsXG4gICAgY29udGFpbmVyQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KFZpY3RvcnlDb250YWluZXIsIG51bGwpLFxuICAgIGRhdGFDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUG9pbnQsIG51bGwpLFxuICAgIGdyb3VwQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCBudWxsKSxcbiAgICBsYWJlbENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5TGFiZWwsIG51bGwpLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGhlbWU6IFZpY3RvcnlUaGVtZS5ncmF5c2NhbGUsXG4gICAgdGl0bGVDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUxhYmVsLCBudWxsKVxuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5TGVnZW5kLCBcImdldEJhc2VQcm9wc1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gZ2V0QmFzZVByb3BzKHByb3BzLCBmYWxsYmFja1Byb3BzKTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUxlZ2VuZCwgXCJnZXREaW1lbnNpb25zXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiBnZXREaW1lbnNpb25zKHByb3BzLCBmYWxsYmFja1Byb3BzKTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUxlZ2VuZCwgXCJleHBlY3RlZENvbXBvbmVudHNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogW1wiYm9yZGVyQ29tcG9uZW50XCIsIFwiY29udGFpbmVyQ29tcG9uZW50XCIsIFwiZGF0YUNvbXBvbmVudFwiLCBcImdyb3VwQ29tcG9uZW50XCIsIFwibGFiZWxDb21wb25lbnRcIiwgXCJ0aXRsZUNvbXBvbmVudFwiXVxufSk7XG5leHBvcnQgZGVmYXVsdCBhZGRFdmVudHMoVmljdG9yeUxlZ2VuZCk7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2dsb2JhbF9sYWJlbF9NYXJnaW4gPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZ2xvYmFsLS1sYWJlbC0tTWFyZ2luXCIsXG4gIFwidmFsdWVcIjogOCxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1nbG9iYWwtLWxhYmVsLS1NYXJnaW4pXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9nbG9iYWxfbGFiZWxfTWFyZ2luOyIsImV4cG9ydCBjb25zdCBjaGFydF9sZWdlbmRfcG9zaXRpb24gPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtbGVnZW5kLS1wb3NpdGlvblwiLFxuICBcInZhbHVlXCI6IFwicmlnaHRcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1sZWdlbmQtLXBvc2l0aW9uKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfbGVnZW5kX3Bvc2l0aW9uOyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IGNoYXJ0X2dsb2JhbF9Gb250RmFtaWx5IGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9nbG9iYWxfRm9udEZhbWlseSc7XG5pbXBvcnQgY2hhcnRfZ2xvYmFsX0ZvbnRTaXplX3NtIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9nbG9iYWxfRm9udFNpemVfc20nO1xuaW1wb3J0IGNoYXJ0X2dsb2JhbF9sYWJlbF9NYXJnaW4gZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2dsb2JhbF9sYWJlbF9NYXJnaW4nO1xuaW1wb3J0IGNoYXJ0X2dsb2JhbF9sZXR0ZXJfc3BhY2luZyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZ2xvYmFsX2xldHRlcl9zcGFjaW5nJztcbmltcG9ydCBjaGFydF9sZWdlbmRfTWFyZ2luIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9sZWdlbmRfTWFyZ2luJztcbmltcG9ydCBjaGFydF9sZWdlbmRfcG9zaXRpb24gZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2xlZ2VuZF9wb3NpdGlvbic7XG4vLyBUeXBvZ3JhcGh5XG5jb25zdCBUWVBPR1JBUEhZX0ZPTlRfRkFNSUxZID0gY2hhcnRfZ2xvYmFsX0ZvbnRGYW1pbHkudmFyO1xuY29uc3QgVFlQT0dSQVBIWV9MRVRURVJfU1BBQ0lORyA9IGNoYXJ0X2dsb2JhbF9sZXR0ZXJfc3BhY2luZy52YXI7XG5jb25zdCBUWVBPR1JBUEhZX0ZPTlRfU0laRSA9IGNoYXJ0X2dsb2JhbF9Gb250U2l6ZV9zbS52YWx1ZTtcbmV4cG9ydCBjb25zdCBDb21tb25TdHlsZXMgPSB7XG4gICAgbGFiZWw6IHtcbiAgICAgICAgZm9udEZhbWlseTogVFlQT0dSQVBIWV9GT05UX0ZBTUlMWSxcbiAgICAgICAgZm9udFNpemU6IFRZUE9HUkFQSFlfRk9OVF9TSVpFLFxuICAgICAgICBsZXR0ZXJTcGFjaW5nOiBUWVBPR1JBUEhZX0xFVFRFUl9TUEFDSU5HLFxuICAgICAgICBtYXJnaW46IGNoYXJ0X2dsb2JhbF9sYWJlbF9NYXJnaW4udmFsdWVcbiAgICB9LFxuICAgIGxlZ2VuZDoge1xuICAgICAgICBtYXJnaW46IGNoYXJ0X2xlZ2VuZF9NYXJnaW4udmFsdWUsXG4gICAgICAgIHBvc2l0aW9uOiBjaGFydF9sZWdlbmRfcG9zaXRpb24udmFsdWVcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbW9uLXN0eWxlcy5qcy5tYXAiLCJleHBvcnQgY29uc3QgY2hhcnRfYnVsbGV0X2F4aXNfdGlja19jb3VudCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1idWxsZXQtLWF4aXMtLXRpY2stLWNvdW50XCIsXG4gIFwidmFsdWVcIjogNSxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1idWxsZXQtLWF4aXMtLXRpY2stLWNvdW50KVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYnVsbGV0X2F4aXNfdGlja19jb3VudDsiLCJleHBvcnQgY29uc3QgY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfV2lkdGggPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYnVsbGV0LS1jb21wYXJhdGl2ZS1tZWFzdXJlLS1XaWR0aFwiLFxuICBcInZhbHVlXCI6IDMwLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWJ1bGxldC0tY29tcGFyYXRpdmUtbWVhc3VyZS0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9XaWR0aDsiLCJleHBvcnQgY29uc3QgY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfZXJyb3JfV2lkdGggPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYnVsbGV0LS1jb21wYXJhdGl2ZS1tZWFzdXJlLS1lcnJvci0tV2lkdGhcIixcbiAgXCJ2YWx1ZVwiOiAzMCxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1idWxsZXQtLWNvbXBhcmF0aXZlLW1lYXN1cmUtLWVycm9yLS1XaWR0aClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX2Vycm9yX1dpZHRoOyIsImV4cG9ydCBjb25zdCBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV93YXJuaW5nX1dpZHRoID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWJ1bGxldC0tY29tcGFyYXRpdmUtbWVhc3VyZS0td2FybmluZy0tV2lkdGhcIixcbiAgXCJ2YWx1ZVwiOiAzMCxcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1idWxsZXQtLWNvbXBhcmF0aXZlLW1lYXN1cmUtLXdhcm5pbmctLVdpZHRoKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfd2FybmluZ19XaWR0aDsiLCJleHBvcnQgY29uc3QgY2hhcnRfYnVsbGV0X2xhYmVsX3N1YnRpdGxlX0ZpbGwgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtYnVsbGV0LS1sYWJlbC0tc3VidGl0bGUtLUZpbGxcIixcbiAgXCJ2YWx1ZVwiOiBcIiNiOGJiYmVcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1idWxsZXQtLWxhYmVsLS1zdWJ0aXRsZS0tRmlsbClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2J1bGxldF9sYWJlbF9zdWJ0aXRsZV9GaWxsOyIsImV4cG9ydCBjb25zdCBjaGFydF9idWxsZXRfcHJpbWFyeV9tZWFzdXJlX2RvdF9zaXplID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWJ1bGxldC0tcHJpbWFyeS1tZWFzdXJlLS1kb3QtLXNpemVcIixcbiAgXCJ2YWx1ZVwiOiA2LFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWJ1bGxldC0tcHJpbWFyeS1tZWFzdXJlLS1kb3QtLXNpemUpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9idWxsZXRfcHJpbWFyeV9tZWFzdXJlX2RvdF9zaXplOyIsImV4cG9ydCBjb25zdCBjaGFydF9idWxsZXRfcHJpbWFyeV9tZWFzdXJlX3NlZ21lbnRlZF9XaWR0aCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1idWxsZXQtLXByaW1hcnktbWVhc3VyZS0tc2VnbWVudGVkLS1XaWR0aFwiLFxuICBcInZhbHVlXCI6IDksXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYnVsbGV0LS1wcmltYXJ5LW1lYXN1cmUtLXNlZ21lbnRlZC0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9idWxsZXRfcHJpbWFyeV9tZWFzdXJlX3NlZ21lbnRlZF9XaWR0aDsiLCJleHBvcnQgY29uc3QgY2hhcnRfYnVsbGV0X3F1YWxpdGF0aXZlX3JhbmdlX1dpZHRoID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWJ1bGxldC0tcXVhbGl0YXRpdmUtcmFuZ2UtLVdpZHRoXCIsXG4gIFwidmFsdWVcIjogMzAsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtYnVsbGV0LS1xdWFsaXRhdGl2ZS1yYW5nZS0tV2lkdGgpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9idWxsZXRfcXVhbGl0YXRpdmVfcmFuZ2VfV2lkdGg7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2dsb2JhbF9Gb250U2l6ZV8yeGwgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZ2xvYmFsLS1Gb250U2l6ZS0tMnhsXCIsXG4gIFwidmFsdWVcIjogMjQsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZ2xvYmFsLS1Gb250U2l6ZS0tMnhsKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZ2xvYmFsX0ZvbnRTaXplXzJ4bDsiLCJleHBvcnQgY29uc3QgY2hhcnRfZ2xvYmFsX0ZvbnRTaXplX2xnID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWdsb2JhbC0tRm9udFNpemUtLWxnXCIsXG4gIFwidmFsdWVcIjogMTgsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZ2xvYmFsLS1Gb250U2l6ZS0tbGcpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9nbG9iYWxfRm9udFNpemVfbGc7IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgY2hhcnRfYnVsbGV0X2F4aXNfdGlja19jb3VudCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X2F4aXNfdGlja19jb3VudCc7XG5pbXBvcnQgY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX1dpZHRoJztcbmltcG9ydCBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9lcnJvcl9XaWR0aCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X2NvbXBhcmF0aXZlX21lYXN1cmVfZXJyb3JfV2lkdGgnO1xuaW1wb3J0IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX3dhcm5pbmdfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX3dhcm5pbmdfV2lkdGgnO1xuaW1wb3J0IGNoYXJ0X2J1bGxldF9sYWJlbF9zdWJ0aXRsZV9GaWxsIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9idWxsZXRfbGFiZWxfc3VidGl0bGVfRmlsbCc7XG5pbXBvcnQgY2hhcnRfYnVsbGV0X3ByaW1hcnlfbWVhc3VyZV9kb3Rfc2l6ZSBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfYnVsbGV0X3ByaW1hcnlfbWVhc3VyZV9kb3Rfc2l6ZSc7XG5pbXBvcnQgY2hhcnRfYnVsbGV0X3ByaW1hcnlfbWVhc3VyZV9zZWdtZW50ZWRfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2J1bGxldF9wcmltYXJ5X21lYXN1cmVfc2VnbWVudGVkX1dpZHRoJztcbmltcG9ydCBjaGFydF9idWxsZXRfcXVhbGl0YXRpdmVfcmFuZ2VfV2lkdGggZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X2J1bGxldF9xdWFsaXRhdGl2ZV9yYW5nZV9XaWR0aCc7XG5pbXBvcnQgY2hhcnRfZ2xvYmFsX0ZvbnRTaXplXzJ4bCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZ2xvYmFsX0ZvbnRTaXplXzJ4bCc7XG5pbXBvcnQgY2hhcnRfZ2xvYmFsX0ZvbnRTaXplX3NtIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9nbG9iYWxfRm9udFNpemVfc20nO1xuaW1wb3J0IGNoYXJ0X2dsb2JhbF9Gb250U2l6ZV9sZyBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZ2xvYmFsX0ZvbnRTaXplX2xnJztcbi8vIEJ1bGxldCBzdHlsZXNcbmV4cG9ydCBjb25zdCBCdWxsZXRTdHlsZXMgPSB7XG4gICAgYXhpc1RpY2tDb3VudDogY2hhcnRfYnVsbGV0X2F4aXNfdGlja19jb3VudC52YWx1ZSxcbiAgICBjb21wYXJhdGl2ZU1lYXN1cmVFcnJvcldpZHRoOiBjaGFydF9idWxsZXRfY29tcGFyYXRpdmVfbWVhc3VyZV9lcnJvcl9XaWR0aC52YWx1ZSxcbiAgICBjb21wYXJhdGl2ZU1lYXN1cmVXYXJuaW5nV2lkdGg6IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX3dhcm5pbmdfV2lkdGgudmFsdWUsXG4gICAgY29tcGFyYXRpdmVNZWFzdXJlV2lkdGg6IGNoYXJ0X2J1bGxldF9jb21wYXJhdGl2ZV9tZWFzdXJlX1dpZHRoLnZhbHVlLFxuICAgIGxhYmVsOiB7XG4gICAgICAgIGdyb3VwVGl0bGU6IHtcbiAgICAgICAgICAgIC8vIFZpY3RvcnkgcHJvcHMgb25seVxuICAgICAgICAgICAgZm9udFNpemU6IGNoYXJ0X2dsb2JhbF9Gb250U2l6ZV8yeGwudmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgc3ViVGl0bGU6IHtcbiAgICAgICAgICAgIC8vIFZpY3RvcnkgcHJvcHMgb25seVxuICAgICAgICAgICAgZmlsbDogY2hhcnRfYnVsbGV0X2xhYmVsX3N1YnRpdGxlX0ZpbGwudmFsdWUsXG4gICAgICAgICAgICBmb250U2l6ZTogY2hhcnRfZ2xvYmFsX0ZvbnRTaXplX3NtLnZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICAvLyBWaWN0b3J5IHByb3BzIG9ubHlcbiAgICAgICAgICAgIGZvbnRTaXplOiBjaGFydF9nbG9iYWxfRm9udFNpemVfbGcudmFsdWVcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcHJpbWFyeURvdE1lYXN1cmVTaXplOiBjaGFydF9idWxsZXRfcHJpbWFyeV9tZWFzdXJlX2RvdF9zaXplLnZhbHVlLFxuICAgIHByaW1hcnlTZWdtZW50ZWRNZWFzdXJlV2lkdGg6IGNoYXJ0X2J1bGxldF9wcmltYXJ5X21lYXN1cmVfc2VnbWVudGVkX1dpZHRoLnZhbHVlLFxuICAgIHF1YWxpdGF0aXZlUmFuZ2VXaWR0aDogY2hhcnRfYnVsbGV0X3F1YWxpdGF0aXZlX3JhbmdlX1dpZHRoLnZhbHVlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVsbGV0LXN0eWxlcy5qcy5tYXAiLCJleHBvcnQgY29uc3QgY2hhcnRfZG9udXRfbGFiZWxfc3VidGl0bGVfRmlsbCA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1kb251dC0tbGFiZWwtLXN1YnRpdGxlLS1GaWxsXCIsXG4gIFwidmFsdWVcIjogXCIjYjhiYmJlXCIsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtZG9udXQtLWxhYmVsLS1zdWJ0aXRsZS0tRmlsbClcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2RvbnV0X2xhYmVsX3N1YnRpdGxlX0ZpbGw7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2RvbnV0X2xhYmVsX3N1YnRpdGxlX3Bvc2l0aW9uID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LWRvbnV0LS1sYWJlbC0tc3VidGl0bGUtLXBvc2l0aW9uXCIsXG4gIFwidmFsdWVcIjogXCJjZW50ZXJcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1jaGFydC1kb251dC0tbGFiZWwtLXN1YnRpdGxlLS1wb3NpdGlvbilcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGNoYXJ0X2RvbnV0X2xhYmVsX3N1YnRpdGxlX3Bvc2l0aW9uOyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IGNoYXJ0X2dsb2JhbF9Gb250U2l6ZV9zbSBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZ2xvYmFsX0ZvbnRTaXplX3NtJztcbmltcG9ydCBjaGFydF9nbG9iYWxfRm9udFNpemVfMnhsIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9nbG9iYWxfRm9udFNpemVfMnhsJztcbmltcG9ydCBjaGFydF9kb251dF9sYWJlbF9zdWJ0aXRsZV9GaWxsIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9kb251dF9sYWJlbF9zdWJ0aXRsZV9GaWxsJztcbmltcG9ydCBjaGFydF9kb251dF9sYWJlbF9zdWJ0aXRsZV9wb3NpdGlvbiBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfbGFiZWxfc3VidGl0bGVfcG9zaXRpb24nO1xuLy8gRG9udXQgc3R5bGVzXG5leHBvcnQgY29uc3QgRG9udXRTdHlsZXMgPSB7XG4gICAgbGFiZWw6IHtcbiAgICAgICAgc3ViVGl0bGU6IHtcbiAgICAgICAgICAgIC8vIFZpY3RvcnkgcHJvcHMgb25seVxuICAgICAgICAgICAgZmlsbDogY2hhcnRfZG9udXRfbGFiZWxfc3VidGl0bGVfRmlsbC52YWx1ZSxcbiAgICAgICAgICAgIGZvbnRTaXplOiBjaGFydF9nbG9iYWxfRm9udFNpemVfc20udmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgc3ViVGl0bGVQb3NpdGlvbjogY2hhcnRfZG9udXRfbGFiZWxfc3VidGl0bGVfcG9zaXRpb24udmFsdWUsXG4gICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICAvLyBWaWN0b3J5IHByb3BzIG9ubHlcbiAgICAgICAgICAgIGZvbnRTaXplOiBjaGFydF9nbG9iYWxfRm9udFNpemVfMnhsLnZhbHVlXG4gICAgICAgIH1cbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZG9udXQtc3R5bGVzLmpzLm1hcCIsImV4cG9ydCBjb25zdCBjaGFydF9kb251dF90aHJlc2hvbGRfd2FybmluZ19Db2xvciA9IHtcbiAgXCJuYW1lXCI6IFwiLS1wZi1jaGFydC1kb251dC0tdGhyZXNob2xkLS13YXJuaW5nLS1Db2xvclwiLFxuICBcInZhbHVlXCI6IFwiI2YwYWIwMFwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWRvbnV0LS10aHJlc2hvbGQtLXdhcm5pbmctLUNvbG9yKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfZG9udXRfdGhyZXNob2xkX3dhcm5pbmdfQ29sb3I7IiwiZXhwb3J0IGNvbnN0IGNoYXJ0X2RvbnV0X3RocmVzaG9sZF9kYW5nZXJfQ29sb3IgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtY2hhcnQtZG9udXQtLXRocmVzaG9sZC0tZGFuZ2VyLS1Db2xvclwiLFxuICBcInZhbHVlXCI6IFwiI2M5MTkwYlwiLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LWRvbnV0LS10aHJlc2hvbGQtLWRhbmdlci0tQ29sb3IpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9kb251dF90aHJlc2hvbGRfZGFuZ2VyX0NvbG9yOyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IGNoYXJ0X2RvbnV0X3RocmVzaG9sZF93YXJuaW5nX0NvbG9yIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9kb251dF90aHJlc2hvbGRfd2FybmluZ19Db2xvcic7XG5pbXBvcnQgY2hhcnRfZG9udXRfdGhyZXNob2xkX2Rhbmdlcl9Db2xvciBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfZG9udXRfdGhyZXNob2xkX2Rhbmdlcl9Db2xvcic7XG4vLyBEb251dCB1dGlsaXphdGlvbiBzdHlsZXNcbmV4cG9ydCBjb25zdCBEb251dFV0aWxpemF0aW9uU3R5bGVzID0ge1xuICAgIHRocmVzaG9sZHM6IHtcbiAgICAgICAgY29sb3JTY2FsZTogW2NoYXJ0X2RvbnV0X3RocmVzaG9sZF93YXJuaW5nX0NvbG9yLnZhbHVlLCBjaGFydF9kb251dF90aHJlc2hvbGRfZGFuZ2VyX0NvbG9yLnZhbHVlXVxuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kb251dC11dGlsaXphdGlvbi1zdHlsZXMuanMubWFwIiwiZXhwb3J0IGNvbnN0IGdsb2JhbF9Gb250V2VpZ2h0X2JvbGQgPSB7XG4gIFwibmFtZVwiOiBcIi0tcGYtZ2xvYmFsLS1Gb250V2VpZ2h0LS1ib2xkXCIsXG4gIFwidmFsdWVcIjogXCI2MDBcIixcbiAgXCJ2YXJcIjogXCJ2YXIoLS1wZi1nbG9iYWwtLUZvbnRXZWlnaHQtLWJvbGQpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBnbG9iYWxfRm9udFdlaWdodF9ib2xkOyIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IGdsb2JhbF9Gb250V2VpZ2h0X2JvbGQgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2dsb2JhbF9Gb250V2VpZ2h0X2JvbGQnO1xuaW1wb3J0IGNoYXJ0X3Zvcm9ub2lfbGFiZWxzX0ZpbGwgZnJvbSAnQHBhdHRlcm5mbHkvcmVhY3QtdG9rZW5zL2Rpc3QvZXNtL2NoYXJ0X3Zvcm9ub2lfbGFiZWxzX0ZpbGwnO1xuLy8gTGVnZW5kIHRvb2x0aXAgc3R5bGVzXG5leHBvcnQgY29uc3QgTGVnZW5kVG9vbHRpcFN0eWxlcyA9IHtcbiAgICBmbHlvdXQ6IHtcbiAgICAgICAgcGFkZGluZzogNDBcbiAgICB9LFxuICAgIGxhYmVsOiB7XG4gICAgICAgIGZpbGw6IGNoYXJ0X3Zvcm9ub2lfbGFiZWxzX0ZpbGwudmFsdWUsXG4gICAgICAgIGZvbnRXZWlnaHQ6IGdsb2JhbF9Gb250V2VpZ2h0X2JvbGQudmFsdWVcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGVnZW5kLXRvb2x0aXAtc3R5bGVzLmpzLm1hcCIsImV4cG9ydCBjb25zdCBjaGFydF9zY2F0dGVyX2FjdGl2ZV9zaXplID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXNjYXR0ZXItLWFjdGl2ZS0tc2l6ZVwiLFxuICBcInZhbHVlXCI6IDUsXG4gIFwidmFyXCI6IFwidmFyKC0tcGYtY2hhcnQtc2NhdHRlci0tYWN0aXZlLS1zaXplKVwiXG59O1xuZXhwb3J0IGRlZmF1bHQgY2hhcnRfc2NhdHRlcl9hY3RpdmVfc2l6ZTsiLCJleHBvcnQgY29uc3QgY2hhcnRfc2NhdHRlcl9zaXplID0ge1xuICBcIm5hbWVcIjogXCItLXBmLWNoYXJ0LXNjYXR0ZXItLXNpemVcIixcbiAgXCJ2YWx1ZVwiOiAzLFxuICBcInZhclwiOiBcInZhcigtLXBmLWNoYXJ0LXNjYXR0ZXItLXNpemUpXCJcbn07XG5leHBvcnQgZGVmYXVsdCBjaGFydF9zY2F0dGVyX3NpemU7IiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgY2hhcnRfc2NhdHRlcl9hY3RpdmVfc2l6ZSBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfc2NhdHRlcl9hY3RpdmVfc2l6ZSc7XG5pbXBvcnQgY2hhcnRfc2NhdHRlcl9zaXplIGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9zY2F0dGVyX3NpemUnO1xuLy8gRG9udXQgc3R5bGVzXG5leHBvcnQgY29uc3QgU2NhdHRlclN0eWxlcyA9IHtcbiAgICBhY3RpdmVTaXplOiBjaGFydF9zY2F0dGVyX2FjdGl2ZV9zaXplLnZhbHVlLFxuICAgIHNpemU6IGNoYXJ0X3NjYXR0ZXJfc2l6ZS52YWx1ZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjYXR0ZXItc3R5bGVzLmpzLm1hcCIsImltcG9ydCB7IENvbW1vblN0eWxlcyB9IGZyb20gJy4vc3R5bGVzL2NvbW1vbi1zdHlsZXMnO1xuaW1wb3J0IHsgQnVsbGV0U3R5bGVzIH0gZnJvbSAnLi9zdHlsZXMvYnVsbGV0LXN0eWxlcyc7XG5pbXBvcnQgeyBEb251dFN0eWxlcyB9IGZyb20gJy4vc3R5bGVzL2RvbnV0LXN0eWxlcyc7XG5pbXBvcnQgeyBEb251dFV0aWxpemF0aW9uU3R5bGVzIH0gZnJvbSAnLi9zdHlsZXMvZG9udXQtdXRpbGl6YXRpb24tc3R5bGVzJztcbmltcG9ydCB7IExlZ2VuZFRvb2x0aXBTdHlsZXMgfSBmcm9tICcuL3N0eWxlcy9sZWdlbmQtdG9vbHRpcC1zdHlsZXMnO1xuaW1wb3J0IHsgU2NhdHRlclN0eWxlcyB9IGZyb20gJy4vc3R5bGVzL3NjYXR0ZXItc3R5bGVzJztcbmV4cG9ydCBjb25zdCBDaGFydENvbW1vblN0eWxlcyA9IENvbW1vblN0eWxlcztcbmV4cG9ydCBjb25zdCBDaGFydEJ1bGxldFN0eWxlcyA9IEJ1bGxldFN0eWxlcztcbmV4cG9ydCBjb25zdCBDaGFydERvbnV0U3R5bGVzID0gRG9udXRTdHlsZXM7XG5leHBvcnQgY29uc3QgQ2hhcnREb251dFV0aWxpemF0aW9uU3R5bGVzID0gRG9udXRVdGlsaXphdGlvblN0eWxlcztcbmV4cG9ydCBjb25zdCBDaGFydExlZ2VuZFRvb2x0aXBTdHlsZXMgPSBMZWdlbmRUb29sdGlwU3R5bGVzO1xuZXhwb3J0IGNvbnN0IENoYXJ0U2NhdHRlclN0eWxlcyA9IFNjYXR0ZXJTdHlsZXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFydFN0eWxlcy5qcy5tYXAiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBob2lzdE5vblJlYWN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnbG9kYXNoL2RlZmF1bHRzJztcbmltcG9ydCB7IFZpY3RvcnlMYWJlbCB9IGZyb20gJ3ZpY3RvcnktY29yZSc7XG5pbXBvcnQgeyBDaGFydENvbW1vblN0eWxlcyB9IGZyb20gJy4uL0NoYXJ0VGhlbWUnO1xuZXhwb3J0IHZhciBDaGFydExhYmVsRGlyZWN0aW9uO1xuKGZ1bmN0aW9uIChDaGFydExhYmVsRGlyZWN0aW9uKSB7XG4gICAgQ2hhcnRMYWJlbERpcmVjdGlvbltcInJ0bFwiXSA9IFwicnRsXCI7XG4gICAgQ2hhcnRMYWJlbERpcmVjdGlvbltcImx0clwiXSA9IFwibHRyXCI7XG4gICAgQ2hhcnRMYWJlbERpcmVjdGlvbltcImluaGVyaXRcIl0gPSBcImluaGVyaXRcIjtcbn0pKENoYXJ0TGFiZWxEaXJlY3Rpb24gfHwgKENoYXJ0TGFiZWxEaXJlY3Rpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFydExhYmVsUGxhY2VtZW50O1xuKGZ1bmN0aW9uIChDaGFydExhYmVsUGxhY2VtZW50KSB7XG4gICAgQ2hhcnRMYWJlbFBsYWNlbWVudFtcInBhcmFsbGVsXCJdID0gXCJwYXJhbGxlbFwiO1xuICAgIENoYXJ0TGFiZWxQbGFjZW1lbnRbXCJwZXJwZW5kaWN1bGFyXCJdID0gXCJwZXJwZW5kaWN1bGFyXCI7XG4gICAgQ2hhcnRMYWJlbFBsYWNlbWVudFtcInZlcnRpY2FsXCJdID0gXCJ2ZXJ0aWNhbFwiO1xufSkoQ2hhcnRMYWJlbFBsYWNlbWVudCB8fCAoQ2hhcnRMYWJlbFBsYWNlbWVudCA9IHt9KSk7XG5leHBvcnQgY29uc3QgQ2hhcnRMYWJlbCA9IChfYSkgPT4ge1xuICAgIHZhciB7IHN0eWxlLCB0ZXh0QW5jaG9yIH0gPSBfYSwgcmVzdCA9IF9fcmVzdChfYSwgW1wic3R5bGVcIiwgXCJ0ZXh0QW5jaG9yXCJdKTtcbiAgICBjb25zdCBhcHBseURlZmF1bHRTdHlsZSA9IChjdXN0b21TdHlsZSkgPT4gZGVmYXVsdHMoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdXN0b21TdHlsZSksIHsgdGV4dEFuY2hvciAvLyB0ZXh0QW5jaG9yIHByb3AgbXVzdCBvdmVycmlkZSBnaXZlbiB0aGVtZSBzdHlsZXNcbiAgICAgfSksIHtcbiAgICAgICAgZm9udEZhbWlseTogQ2hhcnRDb21tb25TdHlsZXMubGFiZWwuZm9udEZhbWlseSxcbiAgICAgICAgZm9udFNpemU6IENoYXJ0Q29tbW9uU3R5bGVzLmxhYmVsLmZvbnRTaXplLFxuICAgICAgICBsZXR0ZXJTcGFjaW5nOiBDaGFydENvbW1vblN0eWxlcy5sYWJlbC5sZXR0ZXJTcGFjaW5nXG4gICAgfSk7XG4gICAgY29uc3QgbmV3U3R5bGUgPSBBcnJheS5pc0FycmF5KHN0eWxlKSA/IHN0eWxlLm1hcChhcHBseURlZmF1bHRTdHlsZSkgOiBhcHBseURlZmF1bHRTdHlsZShzdHlsZSk7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUxhYmVsLCBPYmplY3QuYXNzaWduKHsgc3R5bGU6IG5ld1N0eWxlLCB0ZXh0QW5jaG9yOiB0ZXh0QW5jaG9yIH0sIHJlc3QpKTtcbn07XG5DaGFydExhYmVsLmRpc3BsYXlOYW1lID0gJ0NoYXJ0TGFiZWwnO1xuLy8gTm90ZTogVmljdG9yeUxhYmVsLnJvbGUgbXVzdCBiZSBob2lzdGVkXG5ob2lzdE5vblJlYWN0U3RhdGljcyhDaGFydExhYmVsLCBWaWN0b3J5TGFiZWwpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2hhcnRMYWJlbC5qcy5tYXAiLCJleHBvcnQgY29uc3QgUGF0aEhlbHBlcnMgPSB7XG4gICAgY2lyY2xlOiAoeCwgeSwgc2l6ZSkgPT4gYE0gJHt4fSwgJHt5fVxuICAgICAgbSAkey1zaXplfSwgMFxuICAgICAgYSAke3NpemV9LCAke3NpemV9IDAgMSwwICR7c2l6ZSAqIDJ9LDBcbiAgICAgIGEgJHtzaXplfSwgJHtzaXplfSAwIDEsMCAkey1zaXplICogMn0sMGAsXG4gICAgZGFzaDogKHgsIHksIHNpemUpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZVNpemUgPSAxLjEgKiBzaXplO1xuICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gYmFzZVNpemUgLSBiYXNlU2l6ZSAqIDAuMztcbiAgICAgICAgY29uc3QgeDAgPSB4IC0gYmFzZVNpemU7XG4gICAgICAgIGNvbnN0IHkxID0geSArIGxpbmVIZWlnaHQgLyAyO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9ICh4ICsgYmFzZVNpemUgLSB4MCkgKiAwLjM7XG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSBkaXN0YW5jZSAvIDM7XG4gICAgICAgIHJldHVybiBgTSAke3gwfSwgJHt5MX1cbiAgICAgIGgke2Rpc3RhbmNlfVxuICAgICAgdi0ke2xpbmVIZWlnaHR9XG4gICAgICBoLSR7ZGlzdGFuY2V9XG4gICAgICB6XG4gICAgICBNICR7eDAgKyBkaXN0YW5jZSArIHBhZGRpbmd9LCAke3kxfVxuICAgICAgaCR7ZGlzdGFuY2V9XG4gICAgICB2LSR7bGluZUhlaWdodH1cbiAgICAgIGgtJHtkaXN0YW5jZX1cbiAgICAgIHpcbiAgICAgIE0gJHt4MCArIGRpc3RhbmNlICogMiArIHBhZGRpbmcgKiAyfSwgJHt5MX1cbiAgICAgIGgke2Rpc3RhbmNlfVxuICAgICAgdi0ke2xpbmVIZWlnaHR9XG4gICAgICBoLSR7ZGlzdGFuY2V9XG4gICAgICB6YDtcbiAgICB9LFxuICAgIGRpYW1vbmQ6ICh4LCB5LCBzaXplKSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2VTaXplID0gMC44NyAqIHNpemU7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGguc3FydCgyICogKGJhc2VTaXplICogYmFzZVNpemUpKTtcbiAgICAgICAgcmV0dXJuIGBNICR7eH0sICR7eSArIGxlbmd0aH1cbiAgICAgIGwgJHtsZW5ndGh9LCAtJHtsZW5ndGh9XG4gICAgICBsIC0ke2xlbmd0aH0sIC0ke2xlbmd0aH1cbiAgICAgIGwgLSR7bGVuZ3RofSwgJHtsZW5ndGh9XG4gICAgICBsICR7bGVuZ3RofSwgJHtsZW5ndGh9XG4gICAgICB6YDtcbiAgICB9LFxuICAgIC8vIFRoZSBleWUgc2xhc2ggc3ltYm9sIGlzIHVzZWQgdG8gaGlkZSAvIHNob3cgZWFjaCBkYXRhIHNlcmllcyBpbmRpdmlkdWFsbHlcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3BhdHRlcm5mbHkvcGF0dGVybmZseS1uZXh0L2lzc3Vlcy8yMzUyXG4gICAgZXllU2xhc2g6ICh4LCB5LCBzaXplKSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2VTaXplID0gMC44NyAqIHNpemU7XG4gICAgICAgIGNvbnN0IHgwID0geCAtIGJhc2VTaXplO1xuICAgICAgICBjb25zdCB5MSA9IHkgLSBzaXplICogMS4yNTtcbiAgICAgICAgLy8gRm9yIGNvbnZlcnRpbmcgdG8gcmVsYXRpdmUgcGF0aHMsIHNlZSBodHRwczovL2F5ZG9zLmNvbS9zdmdlZGl0L1xuICAgICAgICAvLyBEYXRhIHRha2VuIGZyb20gcGF0aCBvZiBhc3NldHMvRXllY29uLnN2ZywgbWludXMgZmlyc3QgdHdvIHggYW5kIHkgdmFsdWVzXG4gICAgICAgIGNvbnN0IGRhdGEgPSAnLjAxMyAuMDEzIDAgMCAyLjE3OSAyLjIxOWMuNy0uMjA0IDEuNDE4LS4zMDcgMi4xNTItLjMwNyAyLjg1OSAwIDUuNDY0IDEuNTUxIDcuODE0IDQuNjU0LjI0MyAuMzIxLjI2OCAuNzUzLjA3MyAxLjA5N2wtLjA3My4xMTEtLjIzNi4zMDVjLS42MzIuODAxLTEuMjgyIDEuNDkxLTEuOTUxIDIuMDcxbDEuNzczIDEuODA2Yy4zODIuMzg5IC4zODIgMS4wMTIgMCAxLjQwMWwtLjA1OC4wNTljLS4zODcuMzk0LTEuMDIuNC0xLjQxNC4wMTNsLS4wMTMtLjAxMy0xMS43MzItMTEuOTU2Yy0uMzgyLS4zODktLjM4Mi0xLjAxMiAwLTEuNDAxbC4wNTgtLjA1OWMuMzg3LS4zOTQgMS4wMi0uNCAxLjQxNC0uMDEzem0tLjY3NCAzLjcxIDEuNDA3IDEuNDM2Yy0uMzI5LjYwNC0uNTE2IDEuMjk4LS41MTYgMi4wMzggMCAyLjMyMyAxLjg0OCA0LjIwNiA0LjEyNyA0LjIwNi43MjYgMCAxLjQwOC0uMTkxIDItLjUyNmwuOTY2Ljk4NGMtLjk1Ni4zOTYtMS45NDUuNTkzLTIuOTY2LjU5My0yLjg1OSAwLTUuNDY0LTEuNTUxLTcuODE0LTQuNjU0LS4yNDMtLjMyMS0uMjY4LS43NTMtLjA3My0xLjA5N2wuMDczLS4xMTEuMjM2LS4zMDVjLjgyMy0xLjA0MiAxLjY3Ni0xLjg5NyAyLjU2LTIuNTY1em0yLjE3NyAyLjIyIDQuMDcyIDQuMTQ5Yy0uMzc3LjE2Ny0uNzkzLjI1OS0xLjIzLjI1OS0xLjcxIDAtMy4wOTYtMS40MTItMy4wOTYtMy4xNTUgMC0uNDQ1LjA5MS0uODY5LjI1NC0xLjI1M3ptMi44NDItMi45NTNjLS40MyAwLS44NDUuMDY3LTEuMjM0LjE5MWwuODY1Ljg4MmMuMTIxLS4wMTUuMjQ0LS4wMjIuMzY5LS4wMjIgMS43MSAwIDMuMDk2IDEuNDEyIDMuMDk2IDMuMTU1IDAgLjEyNy0uMDA3LjI1Mi0uMDIyLjM3NWwuODY2Ljg4MmMuMTIyLS4zOTcuMTg3LS44MTkuMTg3LTEuMjU3IDAtMi4zMjMtMS44NDgtNC4yMDYtNC4xMjctNC4yMDZ6JztcbiAgICAgICAgcmV0dXJuIGBtJHt4MH0sICR7eTF9ICR7ZGF0YX1gO1xuICAgIH0sXG4gICAgbWludXM6ICh4LCB5LCBzaXplKSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2VTaXplID0gMS4xICogc2l6ZTtcbiAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IGJhc2VTaXplIC0gYmFzZVNpemUgKiAwLjM7XG4gICAgICAgIGNvbnN0IHgwID0geCAtIGJhc2VTaXplO1xuICAgICAgICBjb25zdCB5MSA9IHkgKyBsaW5lSGVpZ2h0IC8gMjtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSB4ICsgYmFzZVNpemUgLSB4MDtcbiAgICAgICAgcmV0dXJuIGBNICR7eDB9LCAke3kxfVxuICAgICAgaCR7ZGlzdGFuY2V9XG4gICAgICB2LSR7bGluZUhlaWdodH1cbiAgICAgIGgtJHtkaXN0YW5jZX1cbiAgICAgIHpgO1xuICAgIH0sXG4gICAgcGx1czogKHgsIHksIHNpemUpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZVNpemUgPSAxLjEgKiBzaXplO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGJhc2VTaXplIC8gMS41O1xuICAgICAgICByZXR1cm4gYFxuICAgICAgTSAke3ggLSBkaXN0YW5jZSAvIDJ9LCAke3kgKyBiYXNlU2l6ZX1cbiAgICAgIHYtJHtkaXN0YW5jZX1cbiAgICAgIGgtJHtkaXN0YW5jZX1cbiAgICAgIHYtJHtkaXN0YW5jZX1cbiAgICAgIGgke2Rpc3RhbmNlfVxuICAgICAgdi0ke2Rpc3RhbmNlfVxuICAgICAgaCR7ZGlzdGFuY2V9XG4gICAgICB2JHtkaXN0YW5jZX1cbiAgICAgIGgke2Rpc3RhbmNlfVxuICAgICAgdiR7ZGlzdGFuY2V9XG4gICAgICBoLSR7ZGlzdGFuY2V9XG4gICAgICB2JHtkaXN0YW5jZX1cbiAgICAgIHpgO1xuICAgIH0sXG4gICAgc3RhcjogKHgsIHksIHNpemUpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZVNpemUgPSAxLjM1ICogc2l6ZTtcbiAgICAgICAgY29uc3QgYW5nbGUgPSBNYXRoLlBJIC8gNTtcbiAgICAgICAgY29uc3Qgc3RhckNvb3JkcyA9IFsuLi5BcnJheSgxMCkua2V5cygpXS5tYXAoaW5kZXggPT4ge1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gaW5kZXggJSAyID09PSAwID8gYmFzZVNpemUgOiBiYXNlU2l6ZSAvIDI7XG4gICAgICAgICAgICByZXR1cm4gYCR7bGVuZ3RoICogTWF0aC5zaW4oYW5nbGUgKiAoaW5kZXggKyAxKSkgKyB4fSxcbiAgICAgICAgJHtsZW5ndGggKiBNYXRoLmNvcyhhbmdsZSAqIChpbmRleCArIDEpKSArIHl9YDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBgTSAke3N0YXJDb29yZHMuam9pbignTCcpfSB6YDtcbiAgICB9LFxuICAgIHNxdWFyZTogKHgsIHksIHNpemUpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZVNpemUgPSAwLjg3ICogc2l6ZTtcbiAgICAgICAgY29uc3QgeDAgPSB4IC0gYmFzZVNpemU7XG4gICAgICAgIGNvbnN0IHkxID0geSArIGJhc2VTaXplO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IHggKyBiYXNlU2l6ZSAtIHgwO1xuICAgICAgICByZXR1cm4gYE0gJHt4MH0sICR7eTF9XG4gICAgICBoJHtkaXN0YW5jZX1cbiAgICAgIHYtJHtkaXN0YW5jZX1cbiAgICAgIGgtJHtkaXN0YW5jZX1cbiAgICAgIHpgO1xuICAgIH0sXG4gICAgdGhyZXNob2xkOiAoeCwgeSwgc2l6ZSkgPT4ge1xuICAgICAgICBjb25zdCBiYXNlU2l6ZSA9IDEuMSAqIHNpemU7XG4gICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBiYXNlU2l6ZSAtIGJhc2VTaXplICogMC4zO1xuICAgICAgICBjb25zdCB4MCA9IHggLSBiYXNlU2l6ZTtcbiAgICAgICAgY29uc3QgeTEgPSB5ICsgbGluZUhlaWdodCAvIDI7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gKHggKyBiYXNlU2l6ZSAtIHgwKSAqIDAuNTtcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IGRpc3RhbmNlIC8gMztcbiAgICAgICAgcmV0dXJuIGBNICR7eDB9LCAke3kxfVxuICAgICAgaCR7ZGlzdGFuY2V9XG4gICAgICB2LSR7bGluZUhlaWdodH1cbiAgICAgIGgtJHtkaXN0YW5jZX1cbiAgICAgIHpcbiAgICAgIE0gJHt4MCArIGRpc3RhbmNlICsgcGFkZGluZ30sICR7eTF9XG4gICAgICBoJHtkaXN0YW5jZX1cbiAgICAgIHYtJHtsaW5lSGVpZ2h0fVxuICAgICAgaC0ke2Rpc3RhbmNlfVxuICAgICAgemA7XG4gICAgfSxcbiAgICB0cmlhbmdsZURvd246ICh4LCB5LCBzaXplKSA9PiB7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IChzaXplIC8gMikgKiBNYXRoLnNxcnQoMyk7XG4gICAgICAgIGNvbnN0IHgwID0geCAtIHNpemU7XG4gICAgICAgIGNvbnN0IHgxID0geCArIHNpemU7XG4gICAgICAgIGNvbnN0IHkwID0geSAtIHNpemU7XG4gICAgICAgIGNvbnN0IHkxID0geSArIGhlaWdodDtcbiAgICAgICAgcmV0dXJuIGBNICR7eDB9LCAke3kwfVxuICAgICAgTCAke3gxfSwgJHt5MH1cbiAgICAgIEwgJHt4fSwgJHt5MX1cbiAgICAgIHpgO1xuICAgIH0sXG4gICAgdHJpYW5nbGVMZWZ0OiAoeCwgeSwgc2l6ZSkgPT4ge1xuICAgICAgICBjb25zdCBoZWlnaHQgPSAoc2l6ZSAvIDIpICogTWF0aC5zcXJ0KDMpO1xuICAgICAgICBjb25zdCB4MCA9IHggLSBoZWlnaHQ7XG4gICAgICAgIGNvbnN0IHgxID0geCArIHNpemU7XG4gICAgICAgIGNvbnN0IHkwID0geSAtIHNpemU7XG4gICAgICAgIGNvbnN0IHkxID0geSArIHNpemU7XG4gICAgICAgIHJldHVybiBgTSAke3gxfSwgJHt5MH1cbiAgICAgIEwgJHt4MX0sICR7eTF9XG4gICAgICBMICR7eDB9LCAke3l9XG4gICAgICB6YDtcbiAgICB9LFxuICAgIHRyaWFuZ2xlUmlnaHQ6ICh4LCB5LCBzaXplKSA9PiB7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IChzaXplIC8gMikgKiBNYXRoLnNxcnQoMyk7XG4gICAgICAgIGNvbnN0IHgwID0geCAtIHNpemU7XG4gICAgICAgIGNvbnN0IHgxID0geCArIGhlaWdodDtcbiAgICAgICAgY29uc3QgeTAgPSB5IC0gc2l6ZTtcbiAgICAgICAgY29uc3QgeTEgPSB5ICsgc2l6ZTtcbiAgICAgICAgcmV0dXJuIGBNICR7eDB9LCAke3kwfVxuICAgICAgTCAke3gwfSwgJHt5MX1cbiAgICAgIEwgJHt4MX0sICR7eX1cbiAgICAgIHpgO1xuICAgIH0sXG4gICAgdHJpYW5nbGVVcDogKHgsIHksIHNpemUpID0+IHtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gKHNpemUgLyAyKSAqIE1hdGguc3FydCgzKTtcbiAgICAgICAgY29uc3QgeDAgPSB4IC0gc2l6ZTtcbiAgICAgICAgY29uc3QgeDEgPSB4ICsgc2l6ZTtcbiAgICAgICAgY29uc3QgeTAgPSB5IC0gaGVpZ2h0O1xuICAgICAgICBjb25zdCB5MSA9IHkgKyBzaXplO1xuICAgICAgICByZXR1cm4gYE0gJHt4MH0sICR7eTF9XG4gICAgICBMICR7eDF9LCAke3kxfVxuICAgICAgTCAke3h9LCAke3kwfVxuICAgICAgemA7XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhdGgtaGVscGVycy5qcy5tYXAiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEhlbHBlcnMsIFBhdGggfSBmcm9tICd2aWN0b3J5LWNvcmUnO1xuaW1wb3J0IHsgUGF0aEhlbHBlcnMgfSBmcm9tICcuL3BhdGgtaGVscGVycyc7XG5jb25zdCBnZXRQYXRoID0gKHByb3BzKSA9PiB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSBwcm9wcztcbiAgICBjb25zdCBzaXplID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuc2l6ZSwgcHJvcHMpO1xuICAgIGlmIChwcm9wcy5nZXRQYXRoKSB7XG4gICAgICAgIHJldHVybiBwcm9wcy5nZXRQYXRoKHgsIHksIHNpemUpO1xuICAgIH1cbiAgICBjb25zdCBwYXRoRnVuY3Rpb25zID0ge1xuICAgICAgICBjaXJjbGU6IFBhdGhIZWxwZXJzLmNpcmNsZSxcbiAgICAgICAgc3F1YXJlOiBQYXRoSGVscGVycy5zcXVhcmUsXG4gICAgICAgIGRpYW1vbmQ6IFBhdGhIZWxwZXJzLmRpYW1vbmQsXG4gICAgICAgIGV5ZVNsYXNoOiBQYXRoSGVscGVycy5leWVTbGFzaCxcbiAgICAgICAgdHJpYW5nbGVEb3duOiBQYXRoSGVscGVycy50cmlhbmdsZURvd24sXG4gICAgICAgIHRyaWFuZ2xlTGVmdDogUGF0aEhlbHBlcnMudHJpYW5nbGVMZWZ0LFxuICAgICAgICB0cmlhbmdsZVJpZ2h0OiBQYXRoSGVscGVycy50cmlhbmdsZVJpZ2h0LFxuICAgICAgICB0cmlhbmdsZVVwOiBQYXRoSGVscGVycy50cmlhbmdsZVVwLFxuICAgICAgICBwbHVzOiBQYXRoSGVscGVycy5wbHVzLFxuICAgICAgICBtaW51czogUGF0aEhlbHBlcnMubWludXMsXG4gICAgICAgIHN0YXI6IFBhdGhIZWxwZXJzLnN0YXIsXG4gICAgICAgIGRhc2g6IFBhdGhIZWxwZXJzLmRhc2gsXG4gICAgICAgIHRocmVzaG9sZDogUGF0aEhlbHBlcnMudGhyZXNob2xkXG4gICAgfTtcbiAgICBjb25zdCBzeW1ib2wgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy5zeW1ib2wsIHByb3BzKTtcbiAgICBjb25zdCBrZXkgPSBzeW1ib2w7XG4gICAgY29uc3Qgc3ltYm9sRnVuY3Rpb24gPSB0eXBlb2YgcGF0aEZ1bmN0aW9uc1trZXldID09PSAnZnVuY3Rpb24nID8gcGF0aEZ1bmN0aW9uc1trZXldIDogcGF0aEZ1bmN0aW9ucy5zcXVhcmU7XG4gICAgcmV0dXJuIHN5bWJvbEZ1bmN0aW9uKHgsIHksIHNpemUpO1xufTtcbmV4cG9ydCBjb25zdCBDaGFydFBvaW50ID0gKF9hKSA9PiB7XG4gICAgdmFyIHsgYWN0aXZlLCBjbGFzc05hbWUsIGNsaXBQYXRoLCBkYXR1bSwgZGVzYywgZXZlbnRzLCBwYXRoQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChQYXRoLCBudWxsKSwgcm9sZSA9ICdwcmVzZW50YXRpb24nLCBzaGFwZVJlbmRlcmluZyA9ICdhdXRvJywgdGFiSW5kZXgsIHRyYW5zZm9ybSB9ID0gX2EsIHJlc3QgPSBfX3Jlc3QoX2EsIFtcImFjdGl2ZVwiLCBcImNsYXNzTmFtZVwiLCBcImNsaXBQYXRoXCIsIFwiZGF0dW1cIiwgXCJkZXNjXCIsIFwiZXZlbnRzXCIsIFwicGF0aENvbXBvbmVudFwiLCBcInJvbGVcIiwgXCJzaGFwZVJlbmRlcmluZ1wiLCBcInRhYkluZGV4XCIsIFwidHJhbnNmb3JtXCJdKTtcbiAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oeyBhY3RpdmUsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgY2xpcFBhdGgsXG4gICAgICAgIGRhdHVtLFxuICAgICAgICBkZXNjLFxuICAgICAgICBldmVudHMsXG4gICAgICAgIHJvbGUsXG4gICAgICAgIHNoYXBlUmVuZGVyaW5nLFxuICAgICAgICB0YWJJbmRleCxcbiAgICAgICAgdHJhbnNmb3JtIH0sIHJlc3QpO1xuICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQocGF0aENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgY2xhc3NOYW1lLFxuICAgICAgICBjbGlwUGF0aCwgZDogZ2V0UGF0aChwcm9wcyksIGRlc2M6IEhlbHBlcnMuZXZhbHVhdGVQcm9wKGRlc2MsIHByb3BzKSB9LCBldmVudHMpLCB7IHJvbGUsXG4gICAgICAgIHNoYXBlUmVuZGVyaW5nLCBzdHlsZTogSGVscGVycy5ldmFsdWF0ZVN0eWxlKHJlc3Quc3R5bGUsIHByb3BzKSwgdGFiSW5kZXg6IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHRhYkluZGV4LCBwcm9wcyksIHRyYW5zZm9ybSB9KSk7XG59O1xuQ2hhcnRQb2ludC5kaXNwbGF5TmFtZSA9ICdDaGFydFBvaW50Jztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJ0UG9pbnQuanMubWFwIiwiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IHsgVmljdG9yeUxlZ2VuZCB9IGZyb20gJ3ZpY3RvcnktbGVnZW5kJztcbmltcG9ydCB7IENoYXJ0Q29udGFpbmVyIH0gZnJvbSAnLi4vQ2hhcnRDb250YWluZXInO1xuaW1wb3J0IHsgQ2hhcnRMYWJlbCB9IGZyb20gJy4uL0NoYXJ0TGFiZWwnO1xuaW1wb3J0IHsgQ2hhcnRQb2ludCB9IGZyb20gJy4uL0NoYXJ0UG9pbnQnO1xuaW1wb3J0IHsgZ2V0VGhlbWUgfSBmcm9tICcuLi9DaGFydFV0aWxzJztcbmV4cG9ydCB2YXIgQ2hhcnRMZWdlbmRPcmllbnRhdGlvbjtcbihmdW5jdGlvbiAoQ2hhcnRMZWdlbmRPcmllbnRhdGlvbikge1xuICAgIENoYXJ0TGVnZW5kT3JpZW50YXRpb25bXCJob3Jpem9udGFsXCJdID0gXCJob3Jpem9udGFsXCI7XG4gICAgQ2hhcnRMZWdlbmRPcmllbnRhdGlvbltcInZlcnRpY2FsXCJdID0gXCJ2ZXJ0aWNhbFwiO1xufSkoQ2hhcnRMZWdlbmRPcmllbnRhdGlvbiB8fCAoQ2hhcnRMZWdlbmRPcmllbnRhdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIENoYXJ0TGVnZW5kUG9zaXRpb247XG4oZnVuY3Rpb24gKENoYXJ0TGVnZW5kUG9zaXRpb24pIHtcbiAgICBDaGFydExlZ2VuZFBvc2l0aW9uW1wiYm90dG9tXCJdID0gXCJib3R0b21cIjtcbiAgICBDaGFydExlZ2VuZFBvc2l0aW9uW1wiYm90dG9tTGVmdFwiXSA9IFwiYm90dG9tLWxlZnRcIjtcbiAgICBDaGFydExlZ2VuZFBvc2l0aW9uW1wicmlnaHRcIl0gPSBcInJpZ2h0XCI7XG59KShDaGFydExlZ2VuZFBvc2l0aW9uIHx8IChDaGFydExlZ2VuZFBvc2l0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhcnRMZWdlbmRSb3dHdXR0ZXI7XG4oZnVuY3Rpb24gKENoYXJ0TGVnZW5kUm93R3V0dGVyKSB7XG4gICAgQ2hhcnRMZWdlbmRSb3dHdXR0ZXJbXCJib3R0b21cIl0gPSBcImJvdHRvbVwiO1xuICAgIENoYXJ0TGVnZW5kUm93R3V0dGVyW1widG9wXCJdID0gXCJ0b3BcIjtcbn0pKENoYXJ0TGVnZW5kUm93R3V0dGVyIHx8IChDaGFydExlZ2VuZFJvd0d1dHRlciA9IHt9KSk7XG5leHBvcnQgY29uc3QgQ2hhcnRMZWdlbmQgPSAoX2EpID0+IHtcbiAgICB2YXIgeyBjb250YWluZXJDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0Q29udGFpbmVyLCBudWxsKSwgZGF0YUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRQb2ludCwgbnVsbCksIGxhYmVsQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydExhYmVsLCBudWxsKSwgcmVzcG9uc2l2ZSA9IHRydWUsIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgdGl0bGVDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0TGFiZWwsIG51bGwpLCBcbiAgICAvLyBkZXN0cnVjdHVyZSBsYXN0XG4gICAgdGhlbWUgPSBnZXRUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpIH0gPSBfYSwgcmVzdCA9IF9fcmVzdChfYSwgW1wiY29udGFpbmVyQ29tcG9uZW50XCIsIFwiZGF0YUNvbXBvbmVudFwiLCBcImxhYmVsQ29tcG9uZW50XCIsIFwicmVzcG9uc2l2ZVwiLCBcInRoZW1lQ29sb3JcIiwgXCJ0aGVtZVZhcmlhbnRcIiwgXCJ0aXRsZUNvbXBvbmVudFwiLCBcInRoZW1lXCJdKTtcbiAgICAvLyBDbG9uZSBzbyB1c2VycyBjYW4gb3ZlcnJpZGUgY29udGFpbmVyIHByb3BzXG4gICAgY29uc3QgY29udGFpbmVyID0gUmVhY3QuY2xvbmVFbGVtZW50KGNvbnRhaW5lckNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7IHJlc3BvbnNpdmUsXG4gICAgICAgIHRoZW1lIH0sIGNvbnRhaW5lckNvbXBvbmVudC5wcm9wcykpO1xuICAgIC8vIE5vdGU6IGNvbnRhaW5lckNvbXBvbmVudCBpcyByZXF1aXJlZCBmb3IgdGhlbWVcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUxlZ2VuZCwgT2JqZWN0LmFzc2lnbih7IGNvbnRhaW5lckNvbXBvbmVudDogY29udGFpbmVyLCBkYXRhQ29tcG9uZW50OiBkYXRhQ29tcG9uZW50LCBsYWJlbENvbXBvbmVudDogbGFiZWxDb21wb25lbnQsIHRoZW1lOiB0aGVtZSwgdGl0bGVDb21wb25lbnQ6IHRpdGxlQ29tcG9uZW50IH0sIHJlc3QpKSk7XG59O1xuQ2hhcnRMZWdlbmQuZGlzcGxheU5hbWUgPSAnQ2hhcnRMZWdlbmQnO1xuLy8gTm90ZTogVmljdG9yeUxlZ2VuZC5yb2xlIG11c3QgYmUgaG9pc3RlZCwgYnV0IGdldEJhc2VQcm9wcyBjYXVzZXMgZXJyb3Igd2l0aCBDaGFydFZvcm9ub2lDb250YWluZXJcbmhvaXN0Tm9uUmVhY3RTdGF0aWNzKENoYXJ0TGVnZW5kLCBWaWN0b3J5TGVnZW5kLCB7IGdldEJhc2VQcm9wczogdHJ1ZSB9KTtcbkNoYXJ0TGVnZW5kLmdldEJhc2VQcm9wcyA9IChwcm9wcykgPT4ge1xuICAgIGNvbnN0IHRoZW1lID0gZ2V0VGhlbWUobnVsbCwgbnVsbCk7XG4gICAgcmV0dXJuIFZpY3RvcnlMZWdlbmQuZ2V0QmFzZVByb3BzKE9iamVjdC5hc3NpZ24oeyB0aXRsZUNvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydExhYmVsLCBudWxsKSB9LCBwcm9wcyksIHtcbiAgICAgICAgaGVpZ2h0OiB0aGVtZS5jaGFydC5oZWlnaHQsXG4gICAgICAgIG9yaWVudGF0aW9uOiB0aGVtZS5sZWdlbmQub3JpZW50YXRpb24sXG4gICAgICAgIHRpdGxlT3JpZW50YXRpb246IHRoZW1lLmxlZ2VuZC50aXRsZU9yaWVudGF0aW9uLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICB3aWR0aDogdGhlbWUuY2hhcnQud2lkdGhcbiAgICB9KTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFydExlZ2VuZC5qcy5tYXAiLCJleHBvcnQgY29uc3QgZ2V0UGFkZGluZ0ZvclNpZGUgPSAoc2lkZSwgcGFkZGluZywgZmFsbGJhY2spID0+IHtcbiAgICBpZiAodHlwZW9mIHBhZGRpbmcgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHBhZGRpbmc7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBwYWRkaW5nID09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHBhZGRpbmcpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHBhZGRpbmdbc2lkZV0gfHwgMDtcbiAgICB9XG4gICAgcmV0dXJuIGdldFBhZGRpbmdGb3JTaWRlKHNpZGUsIGZhbGxiYWNrLCAwKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGFydC1wYWRkaW5nLmpzLm1hcCIsImltcG9ydCB7IEhlbHBlcnMgfSBmcm9tICd2aWN0b3J5LWNvcmUnO1xuLy8gUmV0dXJucyB0aGUgb3JpZ2luIGZvciBwaWUgYmFzZWQgY2hhcnRzLiBGb3IgZXhhbXBsZSwgc29tZXRoaW5nIHdpdGggYSByYWRpdXMgc3VjaCBhcyBwaWUsIGRvbnV0LCBkb251dCB1dGlsaXphdGlvbixcbi8vIGFuZCBkb251dCB0aHJlc2hvbGQuXG5leHBvcnQgY29uc3QgZ2V0UGllT3JpZ2luID0gKHsgaGVpZ2h0LCBwYWRkaW5nLCB3aWR0aCB9KSA9PiB7XG4gICAgY29uc3QgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSA9IEhlbHBlcnMuZ2V0UGFkZGluZyh7IHBhZGRpbmcgfSk7XG4gICAgY29uc3QgcmFkaXVzID0gSGVscGVycy5nZXRSYWRpdXMoeyBoZWlnaHQsIHdpZHRoLCBwYWRkaW5nIH0pO1xuICAgIGNvbnN0IG9mZnNldFggPSAod2lkdGggLSByYWRpdXMgKiAyIC0gbGVmdCAtIHJpZ2h0KSAvIDI7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IChoZWlnaHQgLSByYWRpdXMgKiAyIC0gdG9wIC0gYm90dG9tKSAvIDI7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogcmFkaXVzICsgbGVmdCArIG9mZnNldFgsXG4gICAgICAgIHk6IHJhZGl1cyArIHRvcCArIG9mZnNldFlcbiAgICB9O1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNoYXJ0LW9yaWdpbi5qcy5tYXAiLCJpbXBvcnQgeyBIZWxwZXJzLCBUZXh0U2l6ZSB9IGZyb20gJ3ZpY3RvcnktY29yZSc7XG5pbXBvcnQgeyBnZXRQaWVPcmlnaW4gfSBmcm9tICcuL2NoYXJ0LW9yaWdpbic7XG5pbXBvcnQgeyBDaGFydENvbW1vblN0eWxlcyB9IGZyb20gJy4uL0NoYXJ0VGhlbWUnO1xuLy8gUmV0dXJucyB4IGNvb3JkaW5hdGUgZm9yIGJ1bGxldCBsYWJlbHNcbmV4cG9ydCBjb25zdCBnZXRCdWxsZXRMYWJlbFggPSAoeyBjaGFydFdpZHRoLCBkeCA9IDAsIGxhYmVsUG9zaXRpb24gfSkgPT4gbGFiZWxQb3NpdGlvbiA9PT0gJ3RvcCcgJiYgY2hhcnRXaWR0aCA/IE1hdGgucm91bmQoY2hhcnRXaWR0aCAvIDIpIDogZHg7XG4vLyBSZXR1cm5zIHkgY29vcmRpbmF0ZSBmb3IgYnVsbGV0IGxhYmVsc1xuZXhwb3J0IGNvbnN0IGdldEJ1bGxldExhYmVsWSA9ICh7IGNoYXJ0SGVpZ2h0LCBkeSA9IDAsIGxhYmVsUG9zaXRpb24gfSkgPT4ge1xuICAgIHN3aXRjaCAobGFiZWxQb3NpdGlvbikge1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgcmV0dXJuIGNoYXJ0SGVpZ2h0ICsgQ2hhcnRDb21tb25TdHlsZXMubGFiZWwubWFyZ2luICsgZHk7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgcmV0dXJuIGNoYXJ0SGVpZ2h0ID8gTWF0aC5yb3VuZChjaGFydEhlaWdodCAvIDIpICsgZHkgOiBkeTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBkeTtcbiAgICB9XG59O1xuLy8gUmV0dXJucyB4IGNvb3JkaW5hdGUgZm9yIHBpZSBsYWJlbHNcbmV4cG9ydCBjb25zdCBnZXRQaWVMYWJlbFggPSAoeyBkeCA9IDAsIGhlaWdodCwgbGFiZWxQb3NpdGlvbiwgbGVnZW5kUG9zaXRpb24sIHBhZGRpbmcsIHdpZHRoIH0pID0+IHtcbiAgICBjb25zdCBvcmlnaW4gPSBnZXRQaWVPcmlnaW4oeyBoZWlnaHQsIHBhZGRpbmcsIHdpZHRoIH0pO1xuICAgIGNvbnN0IHJhZGl1cyA9IEhlbHBlcnMuZ2V0UmFkaXVzKHsgaGVpZ2h0LCB3aWR0aCwgcGFkZGluZyB9KTtcbiAgICBzd2l0Y2ggKGxhYmVsUG9zaXRpb24pIHtcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICAgIHJldHVybiBvcmlnaW4ueCArIGR4O1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICBzd2l0Y2ggKGxlZ2VuZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbi54ICsgQ2hhcnRDb21tb25TdHlsZXMubGFiZWwubWFyZ2luICsgZHggKyByYWRpdXM7XG4gICAgICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luLnggKyBDaGFydENvbW1vblN0eWxlcy5sYWJlbC5tYXJnaW4gKyBkeDtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHg7XG4gICAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZHg7XG4gICAgfVxufTtcbi8vIFJldHVybnMgeCBjb29yZGluYXRlIGZvciBwaWUgbGFiZWxzXG5leHBvcnQgY29uc3QgZ2V0UGllTGFiZWxZID0gKHsgZHkgPSAwLCBoZWlnaHQsIGxhYmVsUG9zaXRpb24sIHBhZGRpbmcsIHdpZHRoIH0pID0+IHtcbiAgICBjb25zdCBvcmlnaW4gPSBnZXRQaWVPcmlnaW4oeyBoZWlnaHQsIHBhZGRpbmcsIHdpZHRoIH0pO1xuICAgIGNvbnN0IHJhZGl1cyA9IEhlbHBlcnMuZ2V0UmFkaXVzKHsgaGVpZ2h0LCB3aWR0aCwgcGFkZGluZyB9KTtcbiAgICBzd2l0Y2ggKGxhYmVsUG9zaXRpb24pIHtcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbi55ICsgZHk7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luLnkgKyByYWRpdXMgKyBDaGFydENvbW1vblN0eWxlcy5sYWJlbC5tYXJnaW4gKiAyICsgZHk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZHk7XG4gICAgfVxufTtcbi8vIFJldHVybnMgYW4gYXBwcm94aW1hdGUgc2l6ZSBmb3IgdGhlIGdpdmUgdGV4dFxuZXhwb3J0IGNvbnN0IGdldExhYmVsVGV4dFNpemUgPSAoeyB0ZXh0LCB0aGVtZSB9KSA9PiB7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGVtZS5sZWdlbmQuc3R5bGUubGFiZWxzO1xuICAgIC8vIFRoZSBhcHByb3hpbWF0ZVRleHRTaXplIGZ1bmN0aW9uIHJldHVybnMgaGVpZ2h0IGFuZCB3aWR0aCwgYnV0IFZpY3RvcnkgaW5jb3JyZWN0bHkgdHlwZWQgaXQgYXMgbnVtYmVyXG4gICAgcmV0dXJuIFRleHRTaXplLmFwcHJveGltYXRlVGV4dFNpemUodGV4dCwgT2JqZWN0LmFzc2lnbih7fSwgc3R5bGUpKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGFydC1sYWJlbC5qcy5tYXAiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBkZWZhdWx0cyBmcm9tICdsb2Rhc2gvZGVmYXVsdHMnO1xuaW1wb3J0IHsgSGVscGVycywgVGV4dFNpemUgfSBmcm9tICd2aWN0b3J5LWNvcmUnO1xuaW1wb3J0IHsgVmljdG9yeUxlZ2VuZCB9IGZyb20gJ3ZpY3RvcnktbGVnZW5kJztcbmltcG9ydCB7IENoYXJ0Q29tbW9uU3R5bGVzIH0gZnJvbSAnLi4vQ2hhcnRUaGVtZSc7XG5pbXBvcnQgeyBnZXRQaWVPcmlnaW4gfSBmcm9tICcuL2NoYXJ0LW9yaWdpbic7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG4vLyBSZXR1cm5zIGEgbGVnZW5kIHdoaWNoIGhhcyBiZWVuIHBvc2l0aW9uZWQgcGVyIHRoZSBnaXZlbiBjaGFydCBwcm9wZXJ0aWVzXG5leHBvcnQgY29uc3QgZ2V0Q29tcHV0ZWRMZWdlbmQgPSAoeyBhbGxvd1dyYXAgPSB0cnVlLCBjaGFydFR5cGUgPSAnY2hhcnQnLCBkeCA9IDAsIGR5ID0gMCwgaGVpZ2h0LCBsZWdlbmRDb21wb25lbnQsIHBhZGRpbmcsIHBvc2l0aW9uID0gQ2hhcnRDb21tb25TdHlsZXMubGVnZW5kLnBvc2l0aW9uLCB0aGVtZSwgd2lkdGgsIFxuLy8gZGVzdHJ1Y3R1cmUgbGFzdFxub3JpZW50YXRpb24gPSB0aGVtZS5sZWdlbmQub3JpZW50YXRpb24gfSkgPT4ge1xuICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGxlZ2VuZCBpdGVtcyBwZXIgcm93XG4gICAgY29uc3QgbGVnZW5kSXRlbXNQcm9wcyA9IGxlZ2VuZENvbXBvbmVudC5wcm9wcyA/IGxlZ2VuZENvbXBvbmVudC5wcm9wcyA6IHt9O1xuICAgIGNvbnN0IGxlZ2VuZEl0ZW1zUGVyUm93ID0gYWxsb3dXcmFwXG4gICAgICAgID8gZ2V0TGVnZW5kSXRlbXNQZXJSb3coe1xuICAgICAgICAgICAgY2hhcnRUeXBlLFxuICAgICAgICAgICAgZHgsXG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICBsZWdlbmREYXRhOiBsZWdlbmRJdGVtc1Byb3BzLmRhdGEsXG4gICAgICAgICAgICBsZWdlbmRPcmllbnRhdGlvbjogbGVnZW5kSXRlbXNQcm9wcy5sZWdlbmRPcmllbnRhdGlvbiA/IGxlZ2VuZEl0ZW1zUHJvcHMubGVnZW5kT3JpZW50YXRpb24gOiBvcmllbnRhdGlvbixcbiAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uOiBwb3NpdGlvbixcbiAgICAgICAgICAgIGxlZ2VuZFByb3BzOiBsZWdlbmRJdGVtc1Byb3BzLFxuICAgICAgICAgICAgcGFkZGluZyxcbiAgICAgICAgICAgIHRoZW1lLFxuICAgICAgICAgICAgd2lkdGhcbiAgICAgICAgfSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgLy8gSW5jbHVkZSBuZXcgaXRlbXNQZXJSb3cgcHJvcCB3aGVuIGRldGVybWluaW5nIHggYW5kIHkgcG9zaXRpb25cbiAgICBjb25zdCBsZWdlbmRQb3NpdGlvblByb3BzID0gZGVmYXVsdHMoe30sIGxlZ2VuZENvbXBvbmVudC5wcm9wcywge1xuICAgICAgICBpdGVtc1BlclJvdzogbGVnZW5kSXRlbXNQZXJSb3dcbiAgICB9KTtcbiAgICBjb25zdCBsZWdlbmRYID0gZ2V0TGVnZW5kWCh7XG4gICAgICAgIGNoYXJ0VHlwZSxcbiAgICAgICAgZHgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgbGVnZW5kRGF0YTogbGVnZW5kUG9zaXRpb25Qcm9wcy5kYXRhLFxuICAgICAgICBsZWdlbmRPcmllbnRhdGlvbjogbGVnZW5kUG9zaXRpb25Qcm9wcy5sZWdlbmRPcmllbnRhdGlvbiA/IGxlZ2VuZFBvc2l0aW9uUHJvcHMubGVnZW5kT3JpZW50YXRpb24gOiBvcmllbnRhdGlvbixcbiAgICAgICAgbGVnZW5kUG9zaXRpb246IHBvc2l0aW9uLFxuICAgICAgICBsZWdlbmRQcm9wczogbGVnZW5kUG9zaXRpb25Qcm9wcyxcbiAgICAgICAgcGFkZGluZyxcbiAgICAgICAgdGhlbWUsXG4gICAgICAgIHdpZHRoXG4gICAgfSk7XG4gICAgY29uc3QgbGVnZW5kWSA9IGdldExlZ2VuZFkoe1xuICAgICAgICBjaGFydFR5cGUsXG4gICAgICAgIGR5LFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIGxlZ2VuZERhdGE6IGxlZ2VuZFBvc2l0aW9uUHJvcHMuZGF0YSxcbiAgICAgICAgbGVnZW5kT3JpZW50YXRpb246IGxlZ2VuZFBvc2l0aW9uUHJvcHMubGVnZW5kT3JpZW50YXRpb24gPyBsZWdlbmRQb3NpdGlvblByb3BzLmxlZ2VuZE9yaWVudGF0aW9uIDogb3JpZW50YXRpb24sXG4gICAgICAgIGxlZ2VuZFByb3BzOiBsZWdlbmRQb3NpdGlvblByb3BzLFxuICAgICAgICBsZWdlbmRQb3NpdGlvbjogcG9zaXRpb24sXG4gICAgICAgIHBhZGRpbmcsXG4gICAgICAgIHRoZW1lLFxuICAgICAgICB3aWR0aFxuICAgIH0pO1xuICAgIC8vIENsb25lIGxlZ2VuZCB3aXRoIHVwZGF0ZWQgcHJvcHNcbiAgICBjb25zdCBsZWdlbmRQcm9wcyA9IGRlZmF1bHRzKHt9LCBsZWdlbmRDb21wb25lbnQucHJvcHMsIHtcbiAgICAgICAgaXRlbXNQZXJSb3c6IGxlZ2VuZEl0ZW1zUGVyUm93LFxuICAgICAgICBvcmllbnRhdGlvbixcbiAgICAgICAgc3RhbmRhbG9uZTogZmFsc2UsXG4gICAgICAgIHRoZW1lLFxuICAgICAgICB4OiBsZWdlbmRYID4gMCA/IGxlZ2VuZFggOiAwLFxuICAgICAgICB5OiBsZWdlbmRZID4gMCA/IGxlZ2VuZFkgOiAwXG4gICAgfSk7XG4gICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChsZWdlbmRDb21wb25lbnQsIGxlZ2VuZFByb3BzKTtcbn07XG4vLyBSZXR1cm5zIGxlZ2VuZCBkaW1lbnNpb25zXG5leHBvcnQgY29uc3QgZ2V0TGVnZW5kRGltZW5zaW9ucyA9ICh7IGxlZ2VuZERhdGEsIGxlZ2VuZE9yaWVudGF0aW9uLCBsZWdlbmRQcm9wcywgdGhlbWUgfSkgPT4ge1xuICAgIGlmIChsZWdlbmREYXRhIHx8IGxlZ2VuZFByb3BzLmRhdGEpIHtcbiAgICAgICAgcmV0dXJuIFZpY3RvcnlMZWdlbmQuZ2V0RGltZW5zaW9ucyhPYmplY3QuYXNzaWduKHsgZGF0YTogbGVnZW5kRGF0YSwgb3JpZW50YXRpb246IGxlZ2VuZE9yaWVudGF0aW9uLCB0aGVtZSB9LCBsZWdlbmRQcm9wcyAvLyBvdmVycmlkZSBhYm92ZVxuICAgICAgICApKTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xufTtcbi8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVnZW5kIGlzIHNtYWxsZXIgdGhhbiBpdHMgY29udGFpbmVyXG5leHBvcnQgY29uc3QgZG9lc0xlZ2VuZEZpdCA9ICh7IGR4ID0gMCwgaGVpZ2h0LCBsZWdlbmRQb3NpdGlvbiwgbGVnZW5kRGF0YSwgbGVnZW5kT3JpZW50YXRpb24sIGxlZ2VuZFByb3BzLCBwYWRkaW5nLCB0aGVtZSwgd2lkdGggfSkgPT4ge1xuICAgIGNvbnN0IHsgbGVmdCwgcmlnaHQgfSA9IEhlbHBlcnMuZ2V0UGFkZGluZyh7IHBhZGRpbmcgfSk7XG4gICAgY29uc3QgY2hhcnRTaXplID0ge1xuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIGxlZnQgLSByaWdodFxuICAgIH07XG4gICAgY29uc3QgbGVnZW5kRGltZW5zaW9ucyA9IGdldExlZ2VuZERpbWVuc2lvbnMoe1xuICAgICAgICBsZWdlbmREYXRhLFxuICAgICAgICBsZWdlbmRPcmllbnRhdGlvbixcbiAgICAgICAgbGVnZW5kUHJvcHMsXG4gICAgICAgIHRoZW1lXG4gICAgfSk7XG4gICAgbGV0IG9jY3VwaWVkV2lkdGggPSAwO1xuICAgIHN3aXRjaCAobGVnZW5kUG9zaXRpb24pIHtcbiAgICAgICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICAgICAgb2NjdXBpZWRXaWR0aCA9IGxlZnQgKyBkeDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICBvY2N1cGllZFdpZHRoID0gY2hhcnRTaXplLndpZHRoICsgQ2hhcnRDb21tb25TdHlsZXMubGVnZW5kLm1hcmdpbiArIGxlZnQgKyBkeDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgb2NjdXBpZWRXaWR0aCA9IGR4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB3aWR0aCAtIG9jY3VwaWVkV2lkdGggPiBsZWdlbmREaW1lbnNpb25zLndpZHRoO1xufTtcbi8vIFJldHVybnMgdGhlIG51bWJlciBvZiBsZWdlbmQgaXRlbXMgcGVyIHJvd1xuZXhwb3J0IGNvbnN0IGdldExlZ2VuZEl0ZW1zUGVyUm93ID0gKHsgZHgsIGhlaWdodCwgbGVnZW5kUG9zaXRpb24sIGxlZ2VuZERhdGEsIGxlZ2VuZE9yaWVudGF0aW9uLCBsZWdlbmRQcm9wcywgcGFkZGluZywgdGhlbWUsIHdpZHRoIH0pID0+IHtcbiAgICBsZXQgaXRlbXNQZXJSb3cgPSBsZWdlbmREYXRhID8gbGVnZW5kRGF0YS5sZW5ndGggOiAwO1xuICAgIGZvciAobGV0IGkgPSBpdGVtc1BlclJvdzsgaSA+IDA7IGktLSkge1xuICAgICAgICBjb25zdCBmaXRzID0gZG9lc0xlZ2VuZEZpdCh7XG4gICAgICAgICAgICBkeCxcbiAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uLFxuICAgICAgICAgICAgbGVnZW5kRGF0YSxcbiAgICAgICAgICAgIGxlZ2VuZE9yaWVudGF0aW9uLFxuICAgICAgICAgICAgbGVnZW5kUHJvcHM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbGVnZW5kUHJvcHMpLCB7IGl0ZW1zUGVyUm93OiBpIH0pLFxuICAgICAgICAgICAgcGFkZGluZyxcbiAgICAgICAgICAgIHRoZW1lLFxuICAgICAgICAgICAgd2lkdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChmaXRzKSB7XG4gICAgICAgICAgICBpdGVtc1BlclJvdyA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXRlbXNQZXJSb3c7XG59O1xuLy8gUmV0dXJucyB4IGNvb3JkaW5hdGUgZm9yIGxlZ2VuZFxuZXhwb3J0IGNvbnN0IGdldExlZ2VuZFggPSAoX2EpID0+IHtcbiAgICB2YXIgeyBjaGFydFR5cGUgfSA9IF9hLCByZXN0ID0gX19yZXN0KF9hLCBbXCJjaGFydFR5cGVcIl0pO1xuICAgIHJldHVybiBjaGFydFR5cGUgPT09ICdwaWUnID8gZ2V0UGllTGVnZW5kWChyZXN0KSA6IGdldENoYXJ0TGVnZW5kWChyZXN0KTtcbn07XG4vLyBSZXR1cm5zIHkgY29vcmRpbmF0ZSBmb3IgbGVnZW5kXG5leHBvcnQgY29uc3QgZ2V0TGVnZW5kWSA9IChfYSkgPT4ge1xuICAgIHZhciB7IGNoYXJ0VHlwZSB9ID0gX2EsIHJlc3QgPSBfX3Jlc3QoX2EsIFtcImNoYXJ0VHlwZVwiXSk7XG4gICAgc3dpdGNoIChjaGFydFR5cGUpIHtcbiAgICAgICAgY2FzZSAncGllJzpcbiAgICAgICAgICAgIHJldHVybiBnZXRQaWVMZWdlbmRZKHJlc3QpO1xuICAgICAgICBjYXNlICdidWxsZXQnOlxuICAgICAgICAgICAgcmV0dXJuIGdldEJ1bGxldExlZ2VuZFkocmVzdCk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q2hhcnRMZWdlbmRZKHJlc3QpO1xuICAgIH1cbn07XG4vLyBSZXR1cm5zIHkgY29vcmRpbmF0ZSBmb3IgYnVsbGV0IGxlZ2VuZHNcbmV4cG9ydCBjb25zdCBnZXRCdWxsZXRMZWdlbmRZID0gKHsgZHkgPSAwLCBoZWlnaHQsIGxlZ2VuZFBvc2l0aW9uLCBsZWdlbmREYXRhLCBsZWdlbmRPcmllbnRhdGlvbiwgbGVnZW5kUHJvcHMsIHBhZGRpbmcsIHRoZW1lLCB3aWR0aCB9KSA9PiB7XG4gICAgY29uc3QgeyBsZWZ0LCByaWdodCB9ID0gSGVscGVycy5nZXRQYWRkaW5nKHsgcGFkZGluZyB9KTtcbiAgICBjb25zdCBjaGFydFNpemUgPSB7XG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gbGVmdCAtIHJpZ2h0XG4gICAgfTtcbiAgICBzd2l0Y2ggKGxlZ2VuZFBvc2l0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgICAgIHJldHVybiBjaGFydFNpemUuaGVpZ2h0ICsgQ2hhcnRDb21tb25TdHlsZXMubGVnZW5kLm1hcmdpbiArIGR5O1xuICAgICAgICBjYXNlICdyaWdodCc6IHtcbiAgICAgICAgICAgIC8vIExlZ2VuZCBoZWlnaHQgd2l0aCBwYWRkaW5nXG4gICAgICAgICAgICBjb25zdCBsZWdlbmREaW1lbnNpb25zID0gZ2V0TGVnZW5kRGltZW5zaW9ucyh7XG4gICAgICAgICAgICAgICAgbGVnZW5kRGF0YSxcbiAgICAgICAgICAgICAgICBsZWdlbmRPcmllbnRhdGlvbixcbiAgICAgICAgICAgICAgICBsZWdlbmRQcm9wcyxcbiAgICAgICAgICAgICAgICB0aGVtZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBsZWdlbmRQYWRkaW5nID0gKGxlZ2VuZERhdGFBcnIpID0+IChsZWdlbmREYXRhQXJyICYmIGxlZ2VuZERhdGFBcnIubGVuZ3RoID4gMCA/IDE3IDogMCk7XG4gICAgICAgICAgICByZXR1cm4gKGNoYXJ0U2l6ZS5oZWlnaHQgLSBsZWdlbmREaW1lbnNpb25zLmhlaWdodCkgLyAyICsgbGVnZW5kUGFkZGluZyhsZWdlbmREYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGR5O1xuICAgIH1cbn07XG4vLyBSZXR1cm5zIHggY29vcmRpbmF0ZSBmb3IgY2hhcnQgbGVnZW5kc1xuZXhwb3J0IGNvbnN0IGdldENoYXJ0TGVnZW5kWCA9ICh7IGR4ID0gMCwgaGVpZ2h0LCBsZWdlbmREYXRhLCBsZWdlbmRPcmllbnRhdGlvbiwgbGVnZW5kUG9zaXRpb24sIGxlZ2VuZFByb3BzLCBwYWRkaW5nLCB0aGVtZSwgd2lkdGggfSkgPT4ge1xuICAgIGNvbnN0IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0gPSBIZWxwZXJzLmdldFBhZGRpbmcoeyBwYWRkaW5nIH0pO1xuICAgIGNvbnN0IGNoYXJ0U2l6ZSA9IHtcbiAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyhoZWlnaHQgLSAoYm90dG9tICsgdG9wKSksXG4gICAgICAgIHdpZHRoOiBNYXRoLmFicyh3aWR0aCAtIChsZWZ0ICsgcmlnaHQpKVxuICAgIH07XG4gICAgY29uc3QgbGVnZW5kRGltZW5zaW9ucyA9IGdldExlZ2VuZERpbWVuc2lvbnMoe1xuICAgICAgICBsZWdlbmREYXRhLFxuICAgICAgICBsZWdlbmRPcmllbnRhdGlvbixcbiAgICAgICAgbGVnZW5kUHJvcHMsXG4gICAgICAgIHRoZW1lXG4gICAgfSk7XG4gICAgc3dpdGNoIChsZWdlbmRQb3NpdGlvbikge1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgcmV0dXJuIHdpZHRoID4gbGVnZW5kRGltZW5zaW9ucy53aWR0aCA/IE1hdGgucm91bmQoKHdpZHRoIC0gbGVnZW5kRGltZW5zaW9ucy53aWR0aCkgLyAyKSArIGR4IDogZHg7XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgZHg7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgIHJldHVybiBjaGFydFNpemUud2lkdGggKyBDaGFydENvbW1vblN0eWxlcy5sZWdlbmQubWFyZ2luICsgbGVmdCArIGR4O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGR4O1xuICAgIH1cbn07XG4vLyBSZXR1cm5zIHkgY29vcmRpbmF0ZSBmb3IgY2hhcnQgbGVnZW5kc1xuZXhwb3J0IGNvbnN0IGdldENoYXJ0TGVnZW5kWSA9ICh7IGR5ID0gMCwgaGVpZ2h0LCBsZWdlbmRQb3NpdGlvbiwgbGVnZW5kRGF0YSwgbGVnZW5kT3JpZW50YXRpb24sIGxlZ2VuZFByb3BzLCBwYWRkaW5nLCB0aGVtZSwgd2lkdGggfSkgPT4ge1xuICAgIGNvbnN0IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0gPSBIZWxwZXJzLmdldFBhZGRpbmcoeyBwYWRkaW5nIH0pO1xuICAgIGNvbnN0IGNoYXJ0U2l6ZSA9IHtcbiAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyhoZWlnaHQgLSAoYm90dG9tICsgdG9wKSksXG4gICAgICAgIHdpZHRoOiBNYXRoLmFicyh3aWR0aCAtIChsZWZ0ICsgcmlnaHQpKVxuICAgIH07XG4gICAgc3dpdGNoIChsZWdlbmRQb3NpdGlvbikge1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgICAgICByZXR1cm4gY2hhcnRTaXplLmhlaWdodCArIENoYXJ0Q29tbW9uU3R5bGVzLmxlZ2VuZC5tYXJnaW4gKiAyICsgdG9wICsgZHk7XG4gICAgICAgIGNhc2UgJ3JpZ2h0Jzoge1xuICAgICAgICAgICAgLy8gTGVnZW5kIGhlaWdodCB3aXRoIHBhZGRpbmdcbiAgICAgICAgICAgIGNvbnN0IGxlZ2VuZERpbWVuc2lvbnMgPSBnZXRMZWdlbmREaW1lbnNpb25zKHtcbiAgICAgICAgICAgICAgICBsZWdlbmREYXRhLFxuICAgICAgICAgICAgICAgIGxlZ2VuZE9yaWVudGF0aW9uLFxuICAgICAgICAgICAgICAgIGxlZ2VuZFByb3BzLFxuICAgICAgICAgICAgICAgIHRoZW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpblggPSBjaGFydFNpemUuaGVpZ2h0IC8gMiArIHRvcDtcbiAgICAgICAgICAgIGNvbnN0IGxlZ2VuZFBhZGRpbmcgPSAobGVnZW5kRGF0YUFycikgPT4gKGxlZ2VuZERhdGFBcnIgJiYgbGVnZW5kRGF0YUFyci5sZW5ndGggPiAwID8gMiA6IDApO1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpblggLSBsZWdlbmREaW1lbnNpb25zLmhlaWdodCAvIDIgKyBsZWdlbmRQYWRkaW5nKGxlZ2VuZERhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZHk7XG4gICAgfVxufTtcbi8vIFJldHVybnMgeCBjb29yZGluYXRlIGZvciBwaWUgbGVnZW5kc1xuZXhwb3J0IGNvbnN0IGdldFBpZUxlZ2VuZFggPSAoeyBkeCA9IDAsIGhlaWdodCwgbGVnZW5kRGF0YSwgbGVnZW5kT3JpZW50YXRpb24sIGxlZ2VuZFBvc2l0aW9uLCBsZWdlbmRQcm9wcywgcGFkZGluZywgdGhlbWUsIHdpZHRoIH0pID0+IHtcbiAgICBjb25zdCBvcmlnaW4gPSBnZXRQaWVPcmlnaW4oeyBoZWlnaHQsIHBhZGRpbmcsIHdpZHRoIH0pO1xuICAgIGNvbnN0IHJhZGl1cyA9IEhlbHBlcnMuZ2V0UmFkaXVzKHsgaGVpZ2h0LCB3aWR0aCwgcGFkZGluZyB9KTtcbiAgICBjb25zdCBsZWdlbmREaW1lbnNpb25zID0gZ2V0TGVnZW5kRGltZW5zaW9ucyh7XG4gICAgICAgIGxlZ2VuZERhdGEsXG4gICAgICAgIGxlZ2VuZE9yaWVudGF0aW9uLFxuICAgICAgICBsZWdlbmRQcm9wcyxcbiAgICAgICAgdGhlbWVcbiAgICB9KTtcbiAgICBzd2l0Y2ggKGxlZ2VuZFBvc2l0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICByZXR1cm4gd2lkdGggPiBsZWdlbmREaW1lbnNpb25zLndpZHRoID8gTWF0aC5yb3VuZCgod2lkdGggLSBsZWdlbmREaW1lbnNpb25zLndpZHRoKSAvIDIpICsgZHggOiBkeDtcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbi54ICsgQ2hhcnRDb21tb25TdHlsZXMubGFiZWwubWFyZ2luICsgZHggKyByYWRpdXM7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZHg7XG4gICAgfVxufTtcbi8vIFJldHVybnMgeSBjb29yZGluYXRlIGZvciBwaWUgbGVnZW5kc1xuZXhwb3J0IGNvbnN0IGdldFBpZUxlZ2VuZFkgPSAoeyBkeSA9IDAsIGhlaWdodCwgbGVnZW5kUG9zaXRpb24sIGxlZ2VuZERhdGEsIGxlZ2VuZE9yaWVudGF0aW9uLCBsZWdlbmRQcm9wcywgcGFkZGluZywgdGhlbWUsIHdpZHRoIH0pID0+IHtcbiAgICBjb25zdCBvcmlnaW4gPSBnZXRQaWVPcmlnaW4oeyBoZWlnaHQsIHBhZGRpbmcsIHdpZHRoIH0pO1xuICAgIGNvbnN0IHJhZGl1cyA9IEhlbHBlcnMuZ2V0UmFkaXVzKHsgaGVpZ2h0LCB3aWR0aCwgcGFkZGluZyB9KTtcbiAgICBzd2l0Y2ggKGxlZ2VuZFBvc2l0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luLnkgKyBDaGFydENvbW1vblN0eWxlcy5sZWdlbmQubWFyZ2luICsgcmFkaXVzICsgZHk7XG4gICAgICAgIGNhc2UgJ3JpZ2h0Jzoge1xuICAgICAgICAgICAgLy8gTGVnZW5kIGhlaWdodCB3aXRoIHBhZGRpbmdcbiAgICAgICAgICAgIGNvbnN0IGxlZ2VuZERpbWVuc2lvbnMgPSBnZXRMZWdlbmREaW1lbnNpb25zKHtcbiAgICAgICAgICAgICAgICBsZWdlbmREYXRhLFxuICAgICAgICAgICAgICAgIGxlZ2VuZE9yaWVudGF0aW9uLFxuICAgICAgICAgICAgICAgIGxlZ2VuZFByb3BzLFxuICAgICAgICAgICAgICAgIHRoZW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGxlZ2VuZFBhZGRpbmcgPSAobGVnZW5kRGF0YUFycikgPT4gKGxlZ2VuZERhdGFBcnIgJiYgbGVnZW5kRGF0YUFyci5sZW5ndGggPiAwID8gMiA6IDApO1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbi55IC0gbGVnZW5kRGltZW5zaW9ucy5oZWlnaHQgLyAyICsgbGVnZW5kUGFkZGluZyhsZWdlbmREYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGR5O1xuICAgIH1cbn07XG4vLyBSZXR1cm5zIGFuIGFwcHJveGltYXRpb24gb2YgbG9uZ2VzdCB0ZXh0IHdpZHRoIGJhc2VkIG9uIGxlZ2VuZCBzdHlsZXNcbmV4cG9ydCBjb25zdCBnZXRNYXhMZWdlbmRUZXh0U2l6ZSA9ICh7IGxlZ2VuZERhdGEsIHRoZW1lIH0pID0+IHtcbiAgICBjb25zdCBzdHlsZSA9IHRoZW1lICYmIHRoZW1lLmxlZ2VuZCAmJiB0aGVtZS5sZWdlbmQuc3R5bGUgPyB0aGVtZS5sZWdlbmQuc3R5bGUubGFiZWxzIDogdW5kZWZpbmVkO1xuICAgIGlmICghKGxlZ2VuZERhdGEgJiYgbGVnZW5kRGF0YS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgbGVnZW5kRGF0YS5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgICBpZiAoZGF0YS5uYW1lICYmIGRhdGEubmFtZS5sZW5ndGggPiByZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBkYXRhLm5hbWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBUaGUgYXBwcm94aW1hdGVUZXh0U2l6ZSBmdW5jdGlvbiByZXR1cm5zIGhlaWdodCBhbmQgd2lkdGgsIGJ1dCBWaWN0b3J5IGluY29ycmVjdGx5IHR5cGVkIGl0IGFzIG51bWJlclxuICAgIGNvbnN0IGFkanVzdGVkVGV4dFNpemUgPSBUZXh0U2l6ZS5hcHByb3hpbWF0ZVRleHRTaXplKHJlc3VsdCwgT2JqZWN0LmFzc2lnbih7fSwgc3R5bGUpKTtcbiAgICByZXR1cm4gYWRqdXN0ZWRUZXh0U2l6ZS53aWR0aDtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGFydC1sZWdlbmQuanMubWFwIiwiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgY2hhcnRfbGVnZW5kX01hcmdpbiBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfbGVnZW5kX01hcmdpbic7XG5pbXBvcnQgeyBWaWN0b3J5Q2hhcnQgfSBmcm9tICd2aWN0b3J5LWNoYXJ0JztcbmltcG9ydCB7IENoYXJ0Q29udGFpbmVyIH0gZnJvbSAnLi4vQ2hhcnRDb250YWluZXInO1xuaW1wb3J0IHsgQ2hhcnRMZWdlbmQsIENoYXJ0TGVnZW5kUG9zaXRpb24gfSBmcm9tICcuLi9DaGFydExlZ2VuZCc7XG5pbXBvcnQgeyBDaGFydENvbW1vblN0eWxlcyB9IGZyb20gJy4uL0NoYXJ0VGhlbWUnO1xuaW1wb3J0IHsgZ2V0Q2hhcnRUaGVtZSwgZ2V0Q2xhc3NOYW1lLCBnZXRDb21wdXRlZExlZ2VuZCwgZ2V0TGFiZWxUZXh0U2l6ZSwgZ2V0UGFkZGluZ0ZvclNpZGUgfSBmcm9tICcuLi9DaGFydFV0aWxzJztcbmV4cG9ydCBjb25zdCBDaGFydCA9IChfYSkgPT4ge1xuICAgIHZhciB7IGFyaWFEZXNjLCBhcmlhVGl0bGUsIGNoaWxkcmVuLCBsZWdlbmRBbGxvd1dyYXAgPSBmYWxzZSwgbGVnZW5kQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydExlZ2VuZCwgbnVsbCksIGxlZ2VuZERhdGEsIGxlZ2VuZFBvc2l0aW9uID0gQ2hhcnRDb21tb25TdHlsZXMubGVnZW5kLnBvc2l0aW9uLCBwYWRkaW5nLCBzaG93QXhpcyA9IHRydWUsIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgXG4gICAgLy8gZGVzdHJ1Y3R1cmUgbGFzdFxuICAgIHRoZW1lID0gZ2V0Q2hhcnRUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIHNob3dBeGlzKSwgY29udGFpbmVyQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydENvbnRhaW5lciwgbnVsbCksIGxlZ2VuZE9yaWVudGF0aW9uID0gdGhlbWUubGVnZW5kLm9yaWVudGF0aW9uLCBoZWlnaHQgPSB0aGVtZS5jaGFydC5oZWlnaHQsIHdpZHRoID0gdGhlbWUuY2hhcnQud2lkdGggfSA9IF9hLCByZXN0ID0gX19yZXN0KF9hLCBbXCJhcmlhRGVzY1wiLCBcImFyaWFUaXRsZVwiLCBcImNoaWxkcmVuXCIsIFwibGVnZW5kQWxsb3dXcmFwXCIsIFwibGVnZW5kQ29tcG9uZW50XCIsIFwibGVnZW5kRGF0YVwiLCBcImxlZ2VuZFBvc2l0aW9uXCIsIFwicGFkZGluZ1wiLCBcInNob3dBeGlzXCIsIFwidGhlbWVDb2xvclwiLCBcInRoZW1lVmFyaWFudFwiLCBcInRoZW1lXCIsIFwiY29udGFpbmVyQ29tcG9uZW50XCIsIFwibGVnZW5kT3JpZW50YXRpb25cIiwgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiXSk7XG4gICAgY29uc3QgZGVmYXVsdFBhZGRpbmcgPSB7XG4gICAgICAgIGJvdHRvbTogZ2V0UGFkZGluZ0ZvclNpZGUoJ2JvdHRvbScsIHBhZGRpbmcsIHRoZW1lLmNoYXJ0LnBhZGRpbmcpLFxuICAgICAgICBsZWZ0OiBnZXRQYWRkaW5nRm9yU2lkZSgnbGVmdCcsIHBhZGRpbmcsIHRoZW1lLmNoYXJ0LnBhZGRpbmcpLFxuICAgICAgICByaWdodDogZ2V0UGFkZGluZ0ZvclNpZGUoJ3JpZ2h0JywgcGFkZGluZywgdGhlbWUuY2hhcnQucGFkZGluZyksXG4gICAgICAgIHRvcDogZ2V0UGFkZGluZ0ZvclNpZGUoJ3RvcCcsIHBhZGRpbmcsIHRoZW1lLmNoYXJ0LnBhZGRpbmcpXG4gICAgfTtcbiAgICAvLyBDbG9uZSBzbyB1c2VycyBjYW4gb3ZlcnJpZGUgY29udGFpbmVyIHByb3BzXG4gICAgY29uc3QgY29udGFpbmVyID0gUmVhY3QuY2xvbmVFbGVtZW50KGNvbnRhaW5lckNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgZGVzYzogYXJpYURlc2MsIHRpdGxlOiBhcmlhVGl0bGUsIHRoZW1lIH0sIGNvbnRhaW5lckNvbXBvbmVudC5wcm9wcyksIHsgY2xhc3NOYW1lOiBnZXRDbGFzc05hbWUoeyBjbGFzc05hbWU6IGNvbnRhaW5lckNvbXBvbmVudC5wcm9wcy5jbGFzc05hbWUgfSkgLy8gT3ZlcnJpZGUgVmljdG9yeUNvbnRhaW5lciBjbGFzcyBuYW1lXG4gICAgIH0pKTtcbiAgICBjb25zdCBsZWdlbmQgPSBSZWFjdC5jbG9uZUVsZW1lbnQobGVnZW5kQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgZGF0YTogbGVnZW5kRGF0YSwgb3JpZW50YXRpb246IGxlZ2VuZE9yaWVudGF0aW9uLCB0aGVtZSB9LCBsZWdlbmRDb21wb25lbnQucHJvcHMpKTtcbiAgICAvLyBSZXR1cm5zIGEgY29tcHV0ZWQgbGVnZW5kXG4gICAgY29uc3QgZ2V0TGVnZW5kID0gKCkgPT4ge1xuICAgICAgICBpZiAoIWxlZ2VuZC5wcm9wcy5kYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZHggPSAwO1xuICAgICAgICBsZXQgZHkgPSAwO1xuICAgICAgICBsZXQgeEF4aXNMYWJlbEhlaWdodCA9IDA7XG4gICAgICAgIGxldCBsZWdlbmRUaXRsZUhlaWdodCA9IGxlZ2VuZC5wcm9wcy50aXRsZSA/IDEwIDogMDtcbiAgICAgICAgLy8gQWRqdXN0IGZvciBheGlzIGxhYmVsXG4gICAgICAgIFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIGlmIChjaGlsZC50eXBlLnJvbGUgPT09ICdheGlzJyAmJiBjaGlsZC5wcm9wcy5sYWJlbCAmJiAhY2hpbGQucHJvcHMuZGVwZW5kZW50QXhpcykge1xuICAgICAgICAgICAgICAgIHhBeGlzTGFiZWxIZWlnaHQgPSBnZXRMYWJlbFRleHRTaXplKHsgdGV4dDogY2hpbGQucHJvcHMubGFiZWwsIHRoZW1lIH0pLmhlaWdodCArIDEwO1xuICAgICAgICAgICAgICAgIGxlZ2VuZFRpdGxlSGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gQ2hhcnRMZWdlbmRQb3NpdGlvbi5ib3R0b20pIHtcbiAgICAgICAgICAgIGR5ICs9IHhBeGlzTGFiZWxIZWlnaHQgKyBsZWdlbmRUaXRsZUhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gQ2hhcnRMZWdlbmRQb3NpdGlvbi5ib3R0b21MZWZ0KSB7XG4gICAgICAgICAgICBkeSArPSB4QXhpc0xhYmVsSGVpZ2h0ICsgbGVnZW5kVGl0bGVIZWlnaHQ7XG4gICAgICAgICAgICBkeCA9IC0xMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGp1c3QgbGVnZW5kIHBvc2l0aW9uIHdoZW4gYXhpcyBpcyBoaWRkZW5cbiAgICAgICAgaWYgKCFzaG93QXhpcykge1xuICAgICAgICAgICAgZHkgLT0gY2hhcnRfbGVnZW5kX01hcmdpbi52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0Q29tcHV0ZWRMZWdlbmQoe1xuICAgICAgICAgICAgYWxsb3dXcmFwOiBsZWdlbmRBbGxvd1dyYXAsXG4gICAgICAgICAgICBjaGFydFR5cGU6ICdjaGFydCcsXG4gICAgICAgICAgICBkeCxcbiAgICAgICAgICAgIGR5LFxuICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgbGVnZW5kQ29tcG9uZW50OiBsZWdlbmQsXG4gICAgICAgICAgICBwYWRkaW5nOiBkZWZhdWx0UGFkZGluZyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBsZWdlbmRQb3NpdGlvbixcbiAgICAgICAgICAgIHRoZW1lLFxuICAgICAgICAgICAgd2lkdGhcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBOb3RlOiBjb250YWluZXJDb21wb25lbnQgaXMgcmVxdWlyZWQgZm9yIHRoZW1lXG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFZpY3RvcnlDaGFydCwgT2JqZWN0LmFzc2lnbih7IGNvbnRhaW5lckNvbXBvbmVudDogY29udGFpbmVyLCBoZWlnaHQ6IGhlaWdodCwgcGFkZGluZzogZGVmYXVsdFBhZGRpbmcsIHRoZW1lOiB0aGVtZSwgd2lkdGg6IHdpZHRoIH0sIHJlc3QpLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgZ2V0TGVnZW5kKCkpKTtcbn07XG5DaGFydC5kaXNwbGF5TmFtZSA9ICdDaGFydCc7XG5ob2lzdE5vblJlYWN0U3RhdGljcyhDaGFydCwgVmljdG9yeUNoYXJ0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJ0LmpzLm1hcCIsImV4cG9ydCAqIGZyb20gJy4vQ2hhcnQnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoL2lzTmlsXCI7XG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuaW1wb3J0IHsgSGVscGVycywgTGFiZWxIZWxwZXJzLCBEYXRhLCBEb21haW4sIFNjYWxlLCBDb2xsZWN0aW9uIH0gZnJvbSBcInZpY3RvcnktY29yZVwiO1xuZXhwb3J0IHZhciBnZXREYXRhV2l0aEJhc2VsaW5lID0gZnVuY3Rpb24gKHByb3BzLCBzY2FsZSkge1xuICB2YXIgZGF0YSA9IERhdGEuZ2V0RGF0YShwcm9wcyk7XG5cbiAgaWYgKGRhdGEubGVuZ3RoIDwgMikge1xuICAgIGRhdGEgPSBbXTtcbiAgfVxuXG4gIHZhciBnZXREZWZhdWx0TWluID0gZnVuY3Rpb24gKGF4aXMpIHtcbiAgICB2YXIgZGVmYXVsdFplcm8gPSBTY2FsZS5nZXRUeXBlKHNjYWxlW2F4aXNdKSA9PT0gXCJsb2dcIiA/IDEgLyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA6IDA7XG4gICAgdmFyIGRvbWFpbiA9IHNjYWxlW2F4aXNdLmRvbWFpbigpO1xuICAgIHZhciBtaW5ZID0gQ29sbGVjdGlvbi5nZXRNaW5WYWx1ZShkb21haW4pO1xuICAgIHZhciBtYXhZID0gQ29sbGVjdGlvbi5nZXRNYXhWYWx1ZShkb21haW4pO1xuICAgIHZhciBkZWZhdWx0TWluID0gZGVmYXVsdFplcm87XG5cbiAgICBpZiAobWluWSA8IDAgJiYgbWF4WSA8PSAwKSB7XG4gICAgICBkZWZhdWx0TWluID0gbWF4WTtcbiAgICB9IGVsc2UgaWYgKG1pblkgPj0gMCAmJiBtYXhZID4gMCkge1xuICAgICAgZGVmYXVsdE1pbiA9IG1pblk7XG4gICAgfVxuXG4gICAgcmV0dXJuIENvbGxlY3Rpb24uY29udGFpbnNEYXRlcyhkb21haW4pID8gbmV3IERhdGUoZGVmYXVsdE1pbikgOiBkZWZhdWx0TWluO1xuICB9O1xuXG4gIHJldHVybiBkYXRhLm1hcChmdW5jdGlvbiAoZGF0dW0pIHtcbiAgICB2YXIgX3kxID0gZGF0dW0uX3kxICE9PSB1bmRlZmluZWQgPyBkYXR1bS5feTEgOiBkYXR1bS5feTtcblxuICAgIHZhciBfeTAgPSBkYXR1bS5feTAgIT09IHVuZGVmaW5lZCA/IGRhdHVtLl95MCA6IGdldERlZmF1bHRNaW4oXCJ5XCIpO1xuXG4gICAgdmFyIF94MSA9IGRhdHVtLl94MSAhPT0gdW5kZWZpbmVkID8gZGF0dW0uX3gxIDogZGF0dW0uX3g7XG5cbiAgICB2YXIgX3gwID0gZGF0dW0uX3gwICE9PSB1bmRlZmluZWQgPyBkYXR1bS5feDAgOiBnZXREZWZhdWx0TWluKFwieFwiKTtcblxuICAgIHJldHVybiBfYXNzaWduKHt9LCBkYXR1bSwge1xuICAgICAgX3kwOiBfeTAsXG4gICAgICBfeTE6IF95MSxcbiAgICAgIF94MDogX3gwLFxuICAgICAgX3gxOiBfeDFcbiAgICB9KTtcbiAgfSk7XG59O1xuXG52YXIgZ2V0Q2FsY3VsYXRlZFZhbHVlcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgcG9sYXIgPSBwcm9wcy5wb2xhcjtcbiAgdmFyIGRlZmF1bHRTdHlsZXMgPSBIZWxwZXJzLmdldERlZmF1bHRTdHlsZXMocHJvcHMsIFwiYXJlYVwiKTtcbiAgdmFyIHN0eWxlID0gSGVscGVycy5nZXRTdHlsZXMocHJvcHMuc3R5bGUsIGRlZmF1bHRTdHlsZXMpO1xuICB2YXIgcmFuZ2UgPSB7XG4gICAgeDogSGVscGVycy5nZXRSYW5nZShwcm9wcywgXCJ4XCIpLFxuICAgIHk6IEhlbHBlcnMuZ2V0UmFuZ2UocHJvcHMsIFwieVwiKVxuICB9O1xuICB2YXIgZG9tYWluID0ge1xuICAgIHg6IERvbWFpbi5nZXREb21haW5XaXRoWmVybyhwcm9wcywgXCJ4XCIpLFxuICAgIHk6IERvbWFpbi5nZXREb21haW5XaXRoWmVybyhwcm9wcywgXCJ5XCIpXG4gIH07XG4gIHZhciBzY2FsZSA9IHtcbiAgICB4OiBTY2FsZS5nZXRCYXNlU2NhbGUocHJvcHMsIFwieFwiKS5kb21haW4oZG9tYWluLngpLnJhbmdlKHByb3BzLmhvcml6b250YWwgPyByYW5nZS55IDogcmFuZ2UueCksXG4gICAgeTogU2NhbGUuZ2V0QmFzZVNjYWxlKHByb3BzLCBcInlcIikuZG9tYWluKGRvbWFpbi55KS5yYW5nZShwcm9wcy5ob3Jpem9udGFsID8gcmFuZ2UueCA6IHJhbmdlLnkpXG4gIH07XG4gIHZhciBvcmlnaW4gPSBwb2xhciA/IHByb3BzLm9yaWdpbiB8fCBIZWxwZXJzLmdldFBvbGFyT3JpZ2luKHByb3BzKSA6IHVuZGVmaW5lZDtcbiAgdmFyIGRhdGEgPSBnZXREYXRhV2l0aEJhc2VsaW5lKHByb3BzLCBzY2FsZSk7XG4gIHJldHVybiB7XG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGRhdGE6IGRhdGEsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIGRvbWFpbjogZG9tYWluLFxuICAgIG9yaWdpbjogb3JpZ2luXG4gIH07XG59O1xuXG5leHBvcnQgdmFyIGdldEJhc2VQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcywgZmFsbGJhY2tQcm9wcykge1xuICB2YXIgbW9kaWZpZWRQcm9wcyA9IEhlbHBlcnMubW9kaWZ5UHJvcHMocHJvcHMsIGZhbGxiYWNrUHJvcHMsIFwiYXJlYVwiKTtcbiAgcHJvcHMgPSBfYXNzaWduKHt9LCBtb2RpZmllZFByb3BzLCBnZXRDYWxjdWxhdGVkVmFsdWVzKG1vZGlmaWVkUHJvcHMpKTtcbiAgdmFyIF9wcm9wcyA9IHByb3BzLFxuICAgICAgZGF0YSA9IF9wcm9wcy5kYXRhLFxuICAgICAgZG9tYWluID0gX3Byb3BzLmRvbWFpbixcbiAgICAgIGV2ZW50cyA9IF9wcm9wcy5ldmVudHMsXG4gICAgICBncm91cENvbXBvbmVudCA9IF9wcm9wcy5ncm91cENvbXBvbmVudCxcbiAgICAgIGhlaWdodCA9IF9wcm9wcy5oZWlnaHQsXG4gICAgICBob3Jpem9udGFsID0gX3Byb3BzLmhvcml6b250YWwsXG4gICAgICBpbnRlcnBvbGF0aW9uID0gX3Byb3BzLmludGVycG9sYXRpb24sXG4gICAgICBvcmlnaW4gPSBfcHJvcHMub3JpZ2luLFxuICAgICAgcGFkZGluZyA9IF9wcm9wcy5wYWRkaW5nLFxuICAgICAgcG9sYXIgPSBfcHJvcHMucG9sYXIsXG4gICAgICBzY2FsZSA9IF9wcm9wcy5zY2FsZSxcbiAgICAgIHNoYXJlZEV2ZW50cyA9IF9wcm9wcy5zaGFyZWRFdmVudHMsXG4gICAgICBzdGFuZGFsb25lID0gX3Byb3BzLnN0YW5kYWxvbmUsXG4gICAgICBzdHlsZSA9IF9wcm9wcy5zdHlsZSxcbiAgICAgIHRoZW1lID0gX3Byb3BzLnRoZW1lLFxuICAgICAgd2lkdGggPSBfcHJvcHMud2lkdGgsXG4gICAgICBsYWJlbHMgPSBfcHJvcHMubGFiZWxzLFxuICAgICAgbmFtZSA9IF9wcm9wcy5uYW1lLFxuICAgICAgZGlzYWJsZUlubGluZVN0eWxlcyA9IF9wcm9wcy5kaXNhYmxlSW5saW5lU3R5bGVzO1xuICB2YXIgaW5pdGlhbENoaWxkUHJvcHMgPSB7XG4gICAgcGFyZW50OiB7XG4gICAgICBzdHlsZTogc3R5bGUucGFyZW50LFxuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBzY2FsZTogc2NhbGUsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgZG9tYWluOiBkb21haW4sXG4gICAgICBzdGFuZGFsb25lOiBzdGFuZGFsb25lLFxuICAgICAgdGhlbWU6IHRoZW1lLFxuICAgICAgcG9sYXI6IHBvbGFyLFxuICAgICAgb3JpZ2luOiBvcmlnaW4sXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGhvcml6b250YWw6IGhvcml6b250YWxcbiAgICB9LFxuICAgIGFsbDoge1xuICAgICAgZGF0YToge1xuICAgICAgICBob3Jpem9udGFsOiBob3Jpem9udGFsLFxuICAgICAgICBwb2xhcjogcG9sYXIsXG4gICAgICAgIG9yaWdpbjogb3JpZ2luLFxuICAgICAgICBzY2FsZTogc2NhbGUsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGludGVycG9sYXRpb246IGludGVycG9sYXRpb24sXG4gICAgICAgIGdyb3VwQ29tcG9uZW50OiBncm91cENvbXBvbmVudCxcbiAgICAgICAgc3R5bGU6IGRpc2FibGVJbmxpbmVTdHlsZXMgPyB7fSA6IHN0eWxlLmRhdGEsXG4gICAgICAgIGRpc2FibGVJbmxpbmVTdHlsZXM6IGRpc2FibGVJbmxpbmVTdHlsZXNcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBkYXRhLnJlZHVjZShmdW5jdGlvbiAoY2hpbGRQcm9wcywgZGF0dW0sIGluZGV4KSB7XG4gICAgdmFyIHRleHQgPSBMYWJlbEhlbHBlcnMuZ2V0VGV4dChwcm9wcywgZGF0dW0sIGluZGV4KTtcblxuICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQgJiYgdGV4dCAhPT0gbnVsbCB8fCBsYWJlbHMgJiYgKGV2ZW50cyB8fCBzaGFyZWRFdmVudHMpKSB7XG4gICAgICB2YXIgZXZlbnRLZXkgPSAhX2lzTmlsKGRhdHVtLmV2ZW50S2V5KSA/IGRhdHVtLmV2ZW50S2V5IDogaW5kZXg7XG4gICAgICBjaGlsZFByb3BzW2V2ZW50S2V5XSA9IHtcbiAgICAgICAgbGFiZWxzOiBMYWJlbEhlbHBlcnMuZ2V0UHJvcHMocHJvcHMsIGluZGV4KVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hpbGRQcm9wcztcbiAgfSwgaW5pdGlhbENoaWxkUHJvcHMpO1xufTsiLCJ2YXIgcGkgPSBNYXRoLlBJLFxuICAgIHRhdSA9IDIgKiBwaSxcbiAgICBlcHNpbG9uID0gMWUtNixcbiAgICB0YXVFcHNpbG9uID0gdGF1IC0gZXBzaWxvbjtcblxuZnVuY3Rpb24gUGF0aCgpIHtcbiAgdGhpcy5feDAgPSB0aGlzLl95MCA9IC8vIHN0YXJ0IG9mIGN1cnJlbnQgc3VicGF0aFxuICB0aGlzLl94MSA9IHRoaXMuX3kxID0gbnVsbDsgLy8gZW5kIG9mIGN1cnJlbnQgc3VicGF0aFxuICB0aGlzLl8gPSBcIlwiO1xufVxuXG5mdW5jdGlvbiBwYXRoKCkge1xuICByZXR1cm4gbmV3IFBhdGg7XG59XG5cblBhdGgucHJvdG90eXBlID0gcGF0aC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBQYXRoLFxuICBtb3ZlVG86IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB0aGlzLl8gKz0gXCJNXCIgKyAodGhpcy5feDAgPSB0aGlzLl94MSA9ICt4KSArIFwiLFwiICsgKHRoaXMuX3kwID0gdGhpcy5feTEgPSAreSk7XG4gIH0sXG4gIGNsb3NlUGF0aDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX3gxICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl94MSA9IHRoaXMuX3gwLCB0aGlzLl95MSA9IHRoaXMuX3kwO1xuICAgICAgdGhpcy5fICs9IFwiWlwiO1xuICAgIH1cbiAgfSxcbiAgbGluZVRvOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgdGhpcy5fICs9IFwiTFwiICsgKHRoaXMuX3gxID0gK3gpICsgXCIsXCIgKyAodGhpcy5feTEgPSAreSk7XG4gIH0sXG4gIHF1YWRyYXRpY0N1cnZlVG86IGZ1bmN0aW9uKHgxLCB5MSwgeCwgeSkge1xuICAgIHRoaXMuXyArPSBcIlFcIiArICgreDEpICsgXCIsXCIgKyAoK3kxKSArIFwiLFwiICsgKHRoaXMuX3gxID0gK3gpICsgXCIsXCIgKyAodGhpcy5feTEgPSAreSk7XG4gIH0sXG4gIGJlemllckN1cnZlVG86IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCB4LCB5KSB7XG4gICAgdGhpcy5fICs9IFwiQ1wiICsgKCt4MSkgKyBcIixcIiArICgreTEpICsgXCIsXCIgKyAoK3gyKSArIFwiLFwiICsgKCt5MikgKyBcIixcIiArICh0aGlzLl94MSA9ICt4KSArIFwiLFwiICsgKHRoaXMuX3kxID0gK3kpO1xuICB9LFxuICBhcmNUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHIpIHtcbiAgICB4MSA9ICt4MSwgeTEgPSAreTEsIHgyID0gK3gyLCB5MiA9ICt5MiwgciA9ICtyO1xuICAgIHZhciB4MCA9IHRoaXMuX3gxLFxuICAgICAgICB5MCA9IHRoaXMuX3kxLFxuICAgICAgICB4MjEgPSB4MiAtIHgxLFxuICAgICAgICB5MjEgPSB5MiAtIHkxLFxuICAgICAgICB4MDEgPSB4MCAtIHgxLFxuICAgICAgICB5MDEgPSB5MCAtIHkxLFxuICAgICAgICBsMDFfMiA9IHgwMSAqIHgwMSArIHkwMSAqIHkwMTtcblxuICAgIC8vIElzIHRoZSByYWRpdXMgbmVnYXRpdmU/IEVycm9yLlxuICAgIGlmIChyIDwgMCkgdGhyb3cgbmV3IEVycm9yKFwibmVnYXRpdmUgcmFkaXVzOiBcIiArIHIpO1xuXG4gICAgLy8gSXMgdGhpcyBwYXRoIGVtcHR5PyBNb3ZlIHRvICh4MSx5MSkuXG4gICAgaWYgKHRoaXMuX3gxID09PSBudWxsKSB7XG4gICAgICB0aGlzLl8gKz0gXCJNXCIgKyAodGhpcy5feDEgPSB4MSkgKyBcIixcIiArICh0aGlzLl95MSA9IHkxKTtcbiAgICB9XG5cbiAgICAvLyBPciwgaXMgKHgxLHkxKSBjb2luY2lkZW50IHdpdGggKHgwLHkwKT8gRG8gbm90aGluZy5cbiAgICBlbHNlIGlmICghKGwwMV8yID4gZXBzaWxvbikpO1xuXG4gICAgLy8gT3IsIGFyZSAoeDAseTApLCAoeDEseTEpIGFuZCAoeDIseTIpIGNvbGxpbmVhcj9cbiAgICAvLyBFcXVpdmFsZW50bHksIGlzICh4MSx5MSkgY29pbmNpZGVudCB3aXRoICh4Mix5Mik/XG4gICAgLy8gT3IsIGlzIHRoZSByYWRpdXMgemVybz8gTGluZSB0byAoeDEseTEpLlxuICAgIGVsc2UgaWYgKCEoTWF0aC5hYnMoeTAxICogeDIxIC0geTIxICogeDAxKSA+IGVwc2lsb24pIHx8ICFyKSB7XG4gICAgICB0aGlzLl8gKz0gXCJMXCIgKyAodGhpcy5feDEgPSB4MSkgKyBcIixcIiArICh0aGlzLl95MSA9IHkxKTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIGRyYXcgYW4gYXJjIVxuICAgIGVsc2Uge1xuICAgICAgdmFyIHgyMCA9IHgyIC0geDAsXG4gICAgICAgICAgeTIwID0geTIgLSB5MCxcbiAgICAgICAgICBsMjFfMiA9IHgyMSAqIHgyMSArIHkyMSAqIHkyMSxcbiAgICAgICAgICBsMjBfMiA9IHgyMCAqIHgyMCArIHkyMCAqIHkyMCxcbiAgICAgICAgICBsMjEgPSBNYXRoLnNxcnQobDIxXzIpLFxuICAgICAgICAgIGwwMSA9IE1hdGguc3FydChsMDFfMiksXG4gICAgICAgICAgbCA9IHIgKiBNYXRoLnRhbigocGkgLSBNYXRoLmFjb3MoKGwyMV8yICsgbDAxXzIgLSBsMjBfMikgLyAoMiAqIGwyMSAqIGwwMSkpKSAvIDIpLFxuICAgICAgICAgIHQwMSA9IGwgLyBsMDEsXG4gICAgICAgICAgdDIxID0gbCAvIGwyMTtcblxuICAgICAgLy8gSWYgdGhlIHN0YXJ0IHRhbmdlbnQgaXMgbm90IGNvaW5jaWRlbnQgd2l0aCAoeDAseTApLCBsaW5lIHRvLlxuICAgICAgaWYgKE1hdGguYWJzKHQwMSAtIDEpID4gZXBzaWxvbikge1xuICAgICAgICB0aGlzLl8gKz0gXCJMXCIgKyAoeDEgKyB0MDEgKiB4MDEpICsgXCIsXCIgKyAoeTEgKyB0MDEgKiB5MDEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl8gKz0gXCJBXCIgKyByICsgXCIsXCIgKyByICsgXCIsMCwwLFwiICsgKCsoeTAxICogeDIwID4geDAxICogeTIwKSkgKyBcIixcIiArICh0aGlzLl94MSA9IHgxICsgdDIxICogeDIxKSArIFwiLFwiICsgKHRoaXMuX3kxID0geTEgKyB0MjEgKiB5MjEpO1xuICAgIH1cbiAgfSxcbiAgYXJjOiBmdW5jdGlvbih4LCB5LCByLCBhMCwgYTEsIGNjdykge1xuICAgIHggPSAreCwgeSA9ICt5LCByID0gK3IsIGNjdyA9ICEhY2N3O1xuICAgIHZhciBkeCA9IHIgKiBNYXRoLmNvcyhhMCksXG4gICAgICAgIGR5ID0gciAqIE1hdGguc2luKGEwKSxcbiAgICAgICAgeDAgPSB4ICsgZHgsXG4gICAgICAgIHkwID0geSArIGR5LFxuICAgICAgICBjdyA9IDEgXiBjY3csXG4gICAgICAgIGRhID0gY2N3ID8gYTAgLSBhMSA6IGExIC0gYTA7XG5cbiAgICAvLyBJcyB0aGUgcmFkaXVzIG5lZ2F0aXZlPyBFcnJvci5cbiAgICBpZiAociA8IDApIHRocm93IG5ldyBFcnJvcihcIm5lZ2F0aXZlIHJhZGl1czogXCIgKyByKTtcblxuICAgIC8vIElzIHRoaXMgcGF0aCBlbXB0eT8gTW92ZSB0byAoeDAseTApLlxuICAgIGlmICh0aGlzLl94MSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fICs9IFwiTVwiICsgeDAgKyBcIixcIiArIHkwO1xuICAgIH1cblxuICAgIC8vIE9yLCBpcyAoeDAseTApIG5vdCBjb2luY2lkZW50IHdpdGggdGhlIHByZXZpb3VzIHBvaW50PyBMaW5lIHRvICh4MCx5MCkuXG4gICAgZWxzZSBpZiAoTWF0aC5hYnModGhpcy5feDEgLSB4MCkgPiBlcHNpbG9uIHx8IE1hdGguYWJzKHRoaXMuX3kxIC0geTApID4gZXBzaWxvbikge1xuICAgICAgdGhpcy5fICs9IFwiTFwiICsgeDAgKyBcIixcIiArIHkwO1xuICAgIH1cblxuICAgIC8vIElzIHRoaXMgYXJjIGVtcHR5PyBXZeKAmXJlIGRvbmUuXG4gICAgaWYgKCFyKSByZXR1cm47XG5cbiAgICAvLyBEb2VzIHRoZSBhbmdsZSBnbyB0aGUgd3Jvbmcgd2F5PyBGbGlwIHRoZSBkaXJlY3Rpb24uXG4gICAgaWYgKGRhIDwgMCkgZGEgPSBkYSAlIHRhdSArIHRhdTtcblxuICAgIC8vIElzIHRoaXMgYSBjb21wbGV0ZSBjaXJjbGU/IERyYXcgdHdvIGFyY3MgdG8gY29tcGxldGUgdGhlIGNpcmNsZS5cbiAgICBpZiAoZGEgPiB0YXVFcHNpbG9uKSB7XG4gICAgICB0aGlzLl8gKz0gXCJBXCIgKyByICsgXCIsXCIgKyByICsgXCIsMCwxLFwiICsgY3cgKyBcIixcIiArICh4IC0gZHgpICsgXCIsXCIgKyAoeSAtIGR5KSArIFwiQVwiICsgciArIFwiLFwiICsgciArIFwiLDAsMSxcIiArIGN3ICsgXCIsXCIgKyAodGhpcy5feDEgPSB4MCkgKyBcIixcIiArICh0aGlzLl95MSA9IHkwKTtcbiAgICB9XG5cbiAgICAvLyBJcyB0aGlzIGFyYyBub24tZW1wdHk/IERyYXcgYW4gYXJjIVxuICAgIGVsc2UgaWYgKGRhID4gZXBzaWxvbikge1xuICAgICAgdGhpcy5fICs9IFwiQVwiICsgciArIFwiLFwiICsgciArIFwiLDAsXCIgKyAoKyhkYSA+PSBwaSkpICsgXCIsXCIgKyBjdyArIFwiLFwiICsgKHRoaXMuX3gxID0geCArIHIgKiBNYXRoLmNvcyhhMSkpICsgXCIsXCIgKyAodGhpcy5feTEgPSB5ICsgciAqIE1hdGguc2luKGExKSk7XG4gICAgfVxuICB9LFxuICByZWN0OiBmdW5jdGlvbih4LCB5LCB3LCBoKSB7XG4gICAgdGhpcy5fICs9IFwiTVwiICsgKHRoaXMuX3gwID0gdGhpcy5feDEgPSAreCkgKyBcIixcIiArICh0aGlzLl95MCA9IHRoaXMuX3kxID0gK3kpICsgXCJoXCIgKyAoK3cpICsgXCJ2XCIgKyAoK2gpICsgXCJoXCIgKyAoLXcpICsgXCJaXCI7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBwYXRoO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24gY29uc3RhbnQoKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJleHBvcnQgdmFyIGFicyA9IE1hdGguYWJzO1xuZXhwb3J0IHZhciBhdGFuMiA9IE1hdGguYXRhbjI7XG5leHBvcnQgdmFyIGNvcyA9IE1hdGguY29zO1xuZXhwb3J0IHZhciBtYXggPSBNYXRoLm1heDtcbmV4cG9ydCB2YXIgbWluID0gTWF0aC5taW47XG5leHBvcnQgdmFyIHNpbiA9IE1hdGguc2luO1xuZXhwb3J0IHZhciBzcXJ0ID0gTWF0aC5zcXJ0O1xuXG5leHBvcnQgdmFyIGVwc2lsb24gPSAxZS0xMjtcbmV4cG9ydCB2YXIgcGkgPSBNYXRoLlBJO1xuZXhwb3J0IHZhciBoYWxmUGkgPSBwaSAvIDI7XG5leHBvcnQgdmFyIHRhdSA9IDIgKiBwaTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFjb3MoeCkge1xuICByZXR1cm4geCA+IDEgPyAwIDogeCA8IC0xID8gcGkgOiBNYXRoLmFjb3MoeCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc2luKHgpIHtcbiAgcmV0dXJuIHggPj0gMSA/IGhhbGZQaSA6IHggPD0gLTEgPyAtaGFsZlBpIDogTWF0aC5hc2luKHgpO1xufVxuIiwiaW1wb3J0IHtwYXRofSBmcm9tIFwiZDMtcGF0aFwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQge2FicywgYWNvcywgYXNpbiwgYXRhbjIsIGNvcywgZXBzaWxvbiwgaGFsZlBpLCBtYXgsIG1pbiwgcGksIHNpbiwgc3FydCwgdGF1fSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGFyY0lubmVyUmFkaXVzKGQpIHtcbiAgcmV0dXJuIGQuaW5uZXJSYWRpdXM7XG59XG5cbmZ1bmN0aW9uIGFyY091dGVyUmFkaXVzKGQpIHtcbiAgcmV0dXJuIGQub3V0ZXJSYWRpdXM7XG59XG5cbmZ1bmN0aW9uIGFyY1N0YXJ0QW5nbGUoZCkge1xuICByZXR1cm4gZC5zdGFydEFuZ2xlO1xufVxuXG5mdW5jdGlvbiBhcmNFbmRBbmdsZShkKSB7XG4gIHJldHVybiBkLmVuZEFuZ2xlO1xufVxuXG5mdW5jdGlvbiBhcmNQYWRBbmdsZShkKSB7XG4gIHJldHVybiBkICYmIGQucGFkQW5nbGU7IC8vIE5vdGU6IG9wdGlvbmFsIVxufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3QoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG4gIHZhciB4MTAgPSB4MSAtIHgwLCB5MTAgPSB5MSAtIHkwLFxuICAgICAgeDMyID0geDMgLSB4MiwgeTMyID0geTMgLSB5MixcbiAgICAgIHQgPSB5MzIgKiB4MTAgLSB4MzIgKiB5MTA7XG4gIGlmICh0ICogdCA8IGVwc2lsb24pIHJldHVybjtcbiAgdCA9ICh4MzIgKiAoeTAgLSB5MikgLSB5MzIgKiAoeDAgLSB4MikpIC8gdDtcbiAgcmV0dXJuIFt4MCArIHQgKiB4MTAsIHkwICsgdCAqIHkxMF07XG59XG5cbi8vIENvbXB1dGUgcGVycGVuZGljdWxhciBvZmZzZXQgbGluZSBvZiBsZW5ndGggcmMuXG4vLyBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL0NpcmNsZS1MaW5lSW50ZXJzZWN0aW9uLmh0bWxcbmZ1bmN0aW9uIGNvcm5lclRhbmdlbnRzKHgwLCB5MCwgeDEsIHkxLCByMSwgcmMsIGN3KSB7XG4gIHZhciB4MDEgPSB4MCAtIHgxLFxuICAgICAgeTAxID0geTAgLSB5MSxcbiAgICAgIGxvID0gKGN3ID8gcmMgOiAtcmMpIC8gc3FydCh4MDEgKiB4MDEgKyB5MDEgKiB5MDEpLFxuICAgICAgb3ggPSBsbyAqIHkwMSxcbiAgICAgIG95ID0gLWxvICogeDAxLFxuICAgICAgeDExID0geDAgKyBveCxcbiAgICAgIHkxMSA9IHkwICsgb3ksXG4gICAgICB4MTAgPSB4MSArIG94LFxuICAgICAgeTEwID0geTEgKyBveSxcbiAgICAgIHgwMCA9ICh4MTEgKyB4MTApIC8gMixcbiAgICAgIHkwMCA9ICh5MTEgKyB5MTApIC8gMixcbiAgICAgIGR4ID0geDEwIC0geDExLFxuICAgICAgZHkgPSB5MTAgLSB5MTEsXG4gICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5LFxuICAgICAgciA9IHIxIC0gcmMsXG4gICAgICBEID0geDExICogeTEwIC0geDEwICogeTExLFxuICAgICAgZCA9IChkeSA8IDAgPyAtMSA6IDEpICogc3FydChtYXgoMCwgciAqIHIgKiBkMiAtIEQgKiBEKSksXG4gICAgICBjeDAgPSAoRCAqIGR5IC0gZHggKiBkKSAvIGQyLFxuICAgICAgY3kwID0gKC1EICogZHggLSBkeSAqIGQpIC8gZDIsXG4gICAgICBjeDEgPSAoRCAqIGR5ICsgZHggKiBkKSAvIGQyLFxuICAgICAgY3kxID0gKC1EICogZHggKyBkeSAqIGQpIC8gZDIsXG4gICAgICBkeDAgPSBjeDAgLSB4MDAsXG4gICAgICBkeTAgPSBjeTAgLSB5MDAsXG4gICAgICBkeDEgPSBjeDEgLSB4MDAsXG4gICAgICBkeTEgPSBjeTEgLSB5MDA7XG5cbiAgLy8gUGljayB0aGUgY2xvc2VyIG9mIHRoZSB0d28gaW50ZXJzZWN0aW9uIHBvaW50cy5cbiAgLy8gVE9ETyBJcyB0aGVyZSBhIGZhc3RlciB3YXkgdG8gZGV0ZXJtaW5lIHdoaWNoIGludGVyc2VjdGlvbiB0byB1c2U/XG4gIGlmIChkeDAgKiBkeDAgKyBkeTAgKiBkeTAgPiBkeDEgKiBkeDEgKyBkeTEgKiBkeTEpIGN4MCA9IGN4MSwgY3kwID0gY3kxO1xuXG4gIHJldHVybiB7XG4gICAgY3g6IGN4MCxcbiAgICBjeTogY3kwLFxuICAgIHgwMTogLW94LFxuICAgIHkwMTogLW95LFxuICAgIHgxMTogY3gwICogKHIxIC8gciAtIDEpLFxuICAgIHkxMTogY3kwICogKHIxIC8gciAtIDEpXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgaW5uZXJSYWRpdXMgPSBhcmNJbm5lclJhZGl1cyxcbiAgICAgIG91dGVyUmFkaXVzID0gYXJjT3V0ZXJSYWRpdXMsXG4gICAgICBjb3JuZXJSYWRpdXMgPSBjb25zdGFudCgwKSxcbiAgICAgIHBhZFJhZGl1cyA9IG51bGwsXG4gICAgICBzdGFydEFuZ2xlID0gYXJjU3RhcnRBbmdsZSxcbiAgICAgIGVuZEFuZ2xlID0gYXJjRW5kQW5nbGUsXG4gICAgICBwYWRBbmdsZSA9IGFyY1BhZEFuZ2xlLFxuICAgICAgY29udGV4dCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gYXJjKCkge1xuICAgIHZhciBidWZmZXIsXG4gICAgICAgIHIsXG4gICAgICAgIHIwID0gK2lubmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIHIxID0gK291dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIGEwID0gc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC0gaGFsZlBpLFxuICAgICAgICBhMSA9IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmUGksXG4gICAgICAgIGRhID0gYWJzKGExIC0gYTApLFxuICAgICAgICBjdyA9IGExID4gYTA7XG5cbiAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBwYXRoKCk7XG5cbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgb3V0ZXIgcmFkaXVzIGlzIGFsd2F5cyBsYXJnZXIgdGhhbiB0aGUgaW5uZXIgcmFkaXVzLlxuICAgIGlmIChyMSA8IHIwKSByID0gcjEsIHIxID0gcjAsIHIwID0gcjtcblxuICAgIC8vIElzIGl0IGEgcG9pbnQ/XG4gICAgaWYgKCEocjEgPiBlcHNpbG9uKSkgY29udGV4dC5tb3ZlVG8oMCwgMCk7XG5cbiAgICAvLyBPciBpcyBpdCBhIGNpcmNsZSBvciBhbm51bHVzP1xuICAgIGVsc2UgaWYgKGRhID4gdGF1IC0gZXBzaWxvbikge1xuICAgICAgY29udGV4dC5tb3ZlVG8ocjEgKiBjb3MoYTApLCByMSAqIHNpbihhMCkpO1xuICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjEsIGEwLCBhMSwgIWN3KTtcbiAgICAgIGlmIChyMCA+IGVwc2lsb24pIHtcbiAgICAgICAgY29udGV4dC5tb3ZlVG8ocjAgKiBjb3MoYTEpLCByMCAqIHNpbihhMSkpO1xuICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMCwgYTEsIGEwLCBjdyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3IgaXMgaXQgYSBjaXJjdWxhciBvciBhbm51bGFyIHNlY3Rvcj9cbiAgICBlbHNlIHtcbiAgICAgIHZhciBhMDEgPSBhMCxcbiAgICAgICAgICBhMTEgPSBhMSxcbiAgICAgICAgICBhMDAgPSBhMCxcbiAgICAgICAgICBhMTAgPSBhMSxcbiAgICAgICAgICBkYTAgPSBkYSxcbiAgICAgICAgICBkYTEgPSBkYSxcbiAgICAgICAgICBhcCA9IHBhZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLyAyLFxuICAgICAgICAgIHJwID0gKGFwID4gZXBzaWxvbikgJiYgKHBhZFJhZGl1cyA/ICtwYWRSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNxcnQocjAgKiByMCArIHIxICogcjEpKSxcbiAgICAgICAgICByYyA9IG1pbihhYnMocjEgLSByMCkgLyAyLCArY29ybmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpLFxuICAgICAgICAgIHJjMCA9IHJjLFxuICAgICAgICAgIHJjMSA9IHJjLFxuICAgICAgICAgIHQwLFxuICAgICAgICAgIHQxO1xuXG4gICAgICAvLyBBcHBseSBwYWRkaW5nPyBOb3RlIHRoYXQgc2luY2UgcjEg4omlIHIwLCBkYTEg4omlIGRhMC5cbiAgICAgIGlmIChycCA+IGVwc2lsb24pIHtcbiAgICAgICAgdmFyIHAwID0gYXNpbihycCAvIHIwICogc2luKGFwKSksXG4gICAgICAgICAgICBwMSA9IGFzaW4ocnAgLyByMSAqIHNpbihhcCkpO1xuICAgICAgICBpZiAoKGRhMCAtPSBwMCAqIDIpID4gZXBzaWxvbikgcDAgKj0gKGN3ID8gMSA6IC0xKSwgYTAwICs9IHAwLCBhMTAgLT0gcDA7XG4gICAgICAgIGVsc2UgZGEwID0gMCwgYTAwID0gYTEwID0gKGEwICsgYTEpIC8gMjtcbiAgICAgICAgaWYgKChkYTEgLT0gcDEgKiAyKSA+IGVwc2lsb24pIHAxICo9IChjdyA/IDEgOiAtMSksIGEwMSArPSBwMSwgYTExIC09IHAxO1xuICAgICAgICBlbHNlIGRhMSA9IDAsIGEwMSA9IGExMSA9IChhMCArIGExKSAvIDI7XG4gICAgICB9XG5cbiAgICAgIHZhciB4MDEgPSByMSAqIGNvcyhhMDEpLFxuICAgICAgICAgIHkwMSA9IHIxICogc2luKGEwMSksXG4gICAgICAgICAgeDEwID0gcjAgKiBjb3MoYTEwKSxcbiAgICAgICAgICB5MTAgPSByMCAqIHNpbihhMTApO1xuXG4gICAgICAvLyBBcHBseSByb3VuZGVkIGNvcm5lcnM/XG4gICAgICBpZiAocmMgPiBlcHNpbG9uKSB7XG4gICAgICAgIHZhciB4MTEgPSByMSAqIGNvcyhhMTEpLFxuICAgICAgICAgICAgeTExID0gcjEgKiBzaW4oYTExKSxcbiAgICAgICAgICAgIHgwMCA9IHIwICogY29zKGEwMCksXG4gICAgICAgICAgICB5MDAgPSByMCAqIHNpbihhMDApLFxuICAgICAgICAgICAgb2M7XG5cbiAgICAgICAgLy8gUmVzdHJpY3QgdGhlIGNvcm5lciByYWRpdXMgYWNjb3JkaW5nIHRvIHRoZSBzZWN0b3IgYW5nbGUuXG4gICAgICAgIGlmIChkYSA8IHBpICYmIChvYyA9IGludGVyc2VjdCh4MDEsIHkwMSwgeDAwLCB5MDAsIHgxMSwgeTExLCB4MTAsIHkxMCkpKSB7XG4gICAgICAgICAgdmFyIGF4ID0geDAxIC0gb2NbMF0sXG4gICAgICAgICAgICAgIGF5ID0geTAxIC0gb2NbMV0sXG4gICAgICAgICAgICAgIGJ4ID0geDExIC0gb2NbMF0sXG4gICAgICAgICAgICAgIGJ5ID0geTExIC0gb2NbMV0sXG4gICAgICAgICAgICAgIGtjID0gMSAvIHNpbihhY29zKChheCAqIGJ4ICsgYXkgKiBieSkgLyAoc3FydChheCAqIGF4ICsgYXkgKiBheSkgKiBzcXJ0KGJ4ICogYnggKyBieSAqIGJ5KSkpIC8gMiksXG4gICAgICAgICAgICAgIGxjID0gc3FydChvY1swXSAqIG9jWzBdICsgb2NbMV0gKiBvY1sxXSk7XG4gICAgICAgICAgcmMwID0gbWluKHJjLCAocjAgLSBsYykgLyAoa2MgLSAxKSk7XG4gICAgICAgICAgcmMxID0gbWluKHJjLCAocjEgLSBsYykgLyAoa2MgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSXMgdGhlIHNlY3RvciBjb2xsYXBzZWQgdG8gYSBsaW5lP1xuICAgICAgaWYgKCEoZGExID4gZXBzaWxvbikpIGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKTtcblxuICAgICAgLy8gRG9lcyB0aGUgc2VjdG9y4oCZcyBvdXRlciByaW5nIGhhdmUgcm91bmRlZCBjb3JuZXJzP1xuICAgICAgZWxzZSBpZiAocmMxID4gZXBzaWxvbikge1xuICAgICAgICB0MCA9IGNvcm5lclRhbmdlbnRzKHgwMCwgeTAwLCB4MDEsIHkwMSwgcjEsIHJjMSwgY3cpO1xuICAgICAgICB0MSA9IGNvcm5lclRhbmdlbnRzKHgxMSwgeTExLCB4MTAsIHkxMCwgcjEsIHJjMSwgY3cpO1xuXG4gICAgICAgIGNvbnRleHQubW92ZVRvKHQwLmN4ICsgdDAueDAxLCB0MC5jeSArIHQwLnkwMSk7XG5cbiAgICAgICAgLy8gSGF2ZSB0aGUgY29ybmVycyBtZXJnZWQ/XG4gICAgICAgIGlmIChyYzEgPCByYykgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzEsIGF0YW4yKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpO1xuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgZHJhdyB0aGUgdHdvIGNvcm5lcnMgYW5kIHRoZSByaW5nLlxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMSwgYXRhbjIodDAueTAxLCB0MC54MDEpLCBhdGFuMih0MC55MTEsIHQwLngxMSksICFjdyk7XG4gICAgICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjEsIGF0YW4yKHQwLmN5ICsgdDAueTExLCB0MC5jeCArIHQwLngxMSksIGF0YW4yKHQxLmN5ICsgdDEueTExLCB0MS5jeCArIHQxLngxMSksICFjdyk7XG4gICAgICAgICAgY29udGV4dC5hcmModDEuY3gsIHQxLmN5LCByYzEsIGF0YW4yKHQxLnkxMSwgdDEueDExKSwgYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE9yIGlzIHRoZSBvdXRlciByaW5nIGp1c3QgYSBjaXJjdWxhciBhcmM/XG4gICAgICBlbHNlIGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKSwgY29udGV4dC5hcmMoMCwgMCwgcjEsIGEwMSwgYTExLCAhY3cpO1xuXG4gICAgICAvLyBJcyB0aGVyZSBubyBpbm5lciByaW5nLCBhbmQgaXTigJlzIGEgY2lyY3VsYXIgc2VjdG9yP1xuICAgICAgLy8gT3IgcGVyaGFwcyBpdOKAmXMgYW4gYW5udWxhciBzZWN0b3IgY29sbGFwc2VkIGR1ZSB0byBwYWRkaW5nP1xuICAgICAgaWYgKCEocjAgPiBlcHNpbG9uKSB8fCAhKGRhMCA+IGVwc2lsb24pKSBjb250ZXh0LmxpbmVUbyh4MTAsIHkxMCk7XG5cbiAgICAgIC8vIERvZXMgdGhlIHNlY3RvcuKAmXMgaW5uZXIgcmluZyAob3IgcG9pbnQpIGhhdmUgcm91bmRlZCBjb3JuZXJzP1xuICAgICAgZWxzZSBpZiAocmMwID4gZXBzaWxvbikge1xuICAgICAgICB0MCA9IGNvcm5lclRhbmdlbnRzKHgxMCwgeTEwLCB4MTEsIHkxMSwgcjAsIC1yYzAsIGN3KTtcbiAgICAgICAgdDEgPSBjb3JuZXJUYW5nZW50cyh4MDEsIHkwMSwgeDAwLCB5MDAsIHIwLCAtcmMwLCBjdyk7XG5cbiAgICAgICAgY29udGV4dC5saW5lVG8odDAuY3ggKyB0MC54MDEsIHQwLmN5ICsgdDAueTAxKTtcblxuICAgICAgICAvLyBIYXZlIHRoZSBjb3JuZXJzIG1lcmdlZD9cbiAgICAgICAgaWYgKHJjMCA8IHJjKSBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMCwgYXRhbjIodDAueTAxLCB0MC54MDEpLCBhdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IHRoZSB0d28gY29ybmVycyBhbmQgdGhlIHJpbmcuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMwLCBhdGFuMih0MC55MDEsIHQwLngwMSksIGF0YW4yKHQwLnkxMSwgdDAueDExKSwgIWN3KTtcbiAgICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMCwgYXRhbjIodDAuY3kgKyB0MC55MTEsIHQwLmN4ICsgdDAueDExKSwgYXRhbjIodDEuY3kgKyB0MS55MTEsIHQxLmN4ICsgdDEueDExKSwgY3cpO1xuICAgICAgICAgIGNvbnRleHQuYXJjKHQxLmN4LCB0MS5jeSwgcmMwLCBhdGFuMih0MS55MTEsIHQxLngxMSksIGF0YW4yKHQxLnkwMSwgdDEueDAxKSwgIWN3KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBPciBpcyB0aGUgaW5uZXIgcmluZyBqdXN0IGEgY2lyY3VsYXIgYXJjP1xuICAgICAgZWxzZSBjb250ZXh0LmFyYygwLCAwLCByMCwgYTEwLCBhMDAsIGN3KTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuXG4gICAgaWYgKGJ1ZmZlcikgcmV0dXJuIGNvbnRleHQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICBhcmMuY2VudHJvaWQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgciA9ICgraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtvdXRlclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIsXG4gICAgICAgIGEgPSAoK3N0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIgLSBwaSAvIDI7XG4gICAgcmV0dXJuIFtjb3MoYSkgKiByLCBzaW4oYSkgKiByXTtcbiAgfTtcblxuICBhcmMuaW5uZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW5uZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IGlubmVyUmFkaXVzO1xuICB9O1xuXG4gIGFyYy5vdXRlclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdXRlclJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogb3V0ZXJSYWRpdXM7XG4gIH07XG5cbiAgYXJjLmNvcm5lclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb3JuZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IGNvcm5lclJhZGl1cztcbiAgfTtcblxuICBhcmMucGFkUmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZFJhZGl1cyA9IF8gPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IHBhZFJhZGl1cztcbiAgfTtcblxuICBhcmMuc3RhcnRBbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdGFydEFuZ2xlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBzdGFydEFuZ2xlO1xuICB9O1xuXG4gIGFyYy5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChlbmRBbmdsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogZW5kQW5nbGU7XG4gIH07XG5cbiAgYXJjLnBhZEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZEFuZ2xlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBwYWRBbmdsZTtcbiAgfTtcblxuICBhcmMuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfKSwgYXJjKSA6IGNvbnRleHQ7XG4gIH07XG5cbiAgcmV0dXJuIGFyYztcbn1cbiIsImZ1bmN0aW9uIExpbmVhcihjb250ZXh0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xufVxuXG5MaW5lYXIucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrO1xuICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IC8vIHByb2NlZWRcbiAgICAgIGRlZmF1bHQ6IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpOyBicmVhaztcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ldyBMaW5lYXIoY29udGV4dCk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24geChwKSB7XG4gIHJldHVybiBwWzBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24geShwKSB7XG4gIHJldHVybiBwWzFdO1xufVxuIiwiaW1wb3J0IHtwYXRofSBmcm9tIFwiZDMtcGF0aFwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgY3VydmVMaW5lYXIgZnJvbSBcIi4vY3VydmUvbGluZWFyLmpzXCI7XG5pbXBvcnQge3ggYXMgcG9pbnRYLCB5IGFzIHBvaW50WX0gZnJvbSBcIi4vcG9pbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciB4ID0gcG9pbnRYLFxuICAgICAgeSA9IHBvaW50WSxcbiAgICAgIGRlZmluZWQgPSBjb25zdGFudCh0cnVlKSxcbiAgICAgIGNvbnRleHQgPSBudWxsLFxuICAgICAgY3VydmUgPSBjdXJ2ZUxpbmVhcixcbiAgICAgIG91dHB1dCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gbGluZShkYXRhKSB7XG4gICAgdmFyIGksXG4gICAgICAgIG4gPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZCxcbiAgICAgICAgZGVmaW5lZDAgPSBmYWxzZSxcbiAgICAgICAgYnVmZmVyO1xuXG4gICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgb3V0cHV0ID0gY3VydmUoYnVmZmVyID0gcGF0aCgpKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPD0gbjsgKytpKSB7XG4gICAgICBpZiAoIShpIDwgbiAmJiBkZWZpbmVkKGQgPSBkYXRhW2ldLCBpLCBkYXRhKSkgPT09IGRlZmluZWQwKSB7XG4gICAgICAgIGlmIChkZWZpbmVkMCA9ICFkZWZpbmVkMCkgb3V0cHV0LmxpbmVTdGFydCgpO1xuICAgICAgICBlbHNlIG91dHB1dC5saW5lRW5kKCk7XG4gICAgICB9XG4gICAgICBpZiAoZGVmaW5lZDApIG91dHB1dC5wb2ludCgreChkLCBpLCBkYXRhKSwgK3koZCwgaSwgZGF0YSkpO1xuICAgIH1cblxuICAgIGlmIChidWZmZXIpIHJldHVybiBvdXRwdXQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICBsaW5lLnggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBsaW5lKSA6IHg7XG4gIH07XG5cbiAgbGluZS55ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgbGluZSkgOiB5O1xuICB9O1xuXG4gIGxpbmUuZGVmaW5lZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWZpbmVkID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBsaW5lKSA6IGRlZmluZWQ7XG4gIH07XG5cbiAgbGluZS5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjdXJ2ZSA9IF8sIGNvbnRleHQgIT0gbnVsbCAmJiAob3V0cHV0ID0gY3VydmUoY29udGV4dCkpLCBsaW5lKSA6IGN1cnZlO1xuICB9O1xuXG4gIGxpbmUuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChfID09IG51bGwgPyBjb250ZXh0ID0gb3V0cHV0ID0gbnVsbCA6IG91dHB1dCA9IGN1cnZlKGNvbnRleHQgPSBfKSwgbGluZSkgOiBjb250ZXh0O1xuICB9O1xuXG4gIHJldHVybiBsaW5lO1xufVxuIiwiaW1wb3J0IHtwYXRofSBmcm9tIFwiZDMtcGF0aFwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgY3VydmVMaW5lYXIgZnJvbSBcIi4vY3VydmUvbGluZWFyLmpzXCI7XG5pbXBvcnQgbGluZSBmcm9tIFwiLi9saW5lLmpzXCI7XG5pbXBvcnQge3ggYXMgcG9pbnRYLCB5IGFzIHBvaW50WX0gZnJvbSBcIi4vcG9pbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciB4MCA9IHBvaW50WCxcbiAgICAgIHgxID0gbnVsbCxcbiAgICAgIHkwID0gY29uc3RhbnQoMCksXG4gICAgICB5MSA9IHBvaW50WSxcbiAgICAgIGRlZmluZWQgPSBjb25zdGFudCh0cnVlKSxcbiAgICAgIGNvbnRleHQgPSBudWxsLFxuICAgICAgY3VydmUgPSBjdXJ2ZUxpbmVhcixcbiAgICAgIG91dHB1dCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gYXJlYShkYXRhKSB7XG4gICAgdmFyIGksXG4gICAgICAgIGosXG4gICAgICAgIGssXG4gICAgICAgIG4gPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZCxcbiAgICAgICAgZGVmaW5lZDAgPSBmYWxzZSxcbiAgICAgICAgYnVmZmVyLFxuICAgICAgICB4MHogPSBuZXcgQXJyYXkobiksXG4gICAgICAgIHkweiA9IG5ldyBBcnJheShuKTtcblxuICAgIGlmIChjb250ZXh0ID09IG51bGwpIG91dHB1dCA9IGN1cnZlKGJ1ZmZlciA9IHBhdGgoKSk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDw9IG47ICsraSkge1xuICAgICAgaWYgKCEoaSA8IG4gJiYgZGVmaW5lZChkID0gZGF0YVtpXSwgaSwgZGF0YSkpID09PSBkZWZpbmVkMCkge1xuICAgICAgICBpZiAoZGVmaW5lZDAgPSAhZGVmaW5lZDApIHtcbiAgICAgICAgICBqID0gaTtcbiAgICAgICAgICBvdXRwdXQuYXJlYVN0YXJ0KCk7XG4gICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dHB1dC5saW5lRW5kKCk7XG4gICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpO1xuICAgICAgICAgIGZvciAoayA9IGkgLSAxOyBrID49IGo7IC0taykge1xuICAgICAgICAgICAgb3V0cHV0LnBvaW50KHgweltrXSwgeTB6W2tdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0cHV0LmxpbmVFbmQoKTtcbiAgICAgICAgICBvdXRwdXQuYXJlYUVuZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGVmaW5lZDApIHtcbiAgICAgICAgeDB6W2ldID0gK3gwKGQsIGksIGRhdGEpLCB5MHpbaV0gPSAreTAoZCwgaSwgZGF0YSk7XG4gICAgICAgIG91dHB1dC5wb2ludCh4MSA/ICt4MShkLCBpLCBkYXRhKSA6IHgweltpXSwgeTEgPyAreTEoZCwgaSwgZGF0YSkgOiB5MHpbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChidWZmZXIpIHJldHVybiBvdXRwdXQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBhcmVhbGluZSgpIHtcbiAgICByZXR1cm4gbGluZSgpLmRlZmluZWQoZGVmaW5lZCkuY3VydmUoY3VydmUpLmNvbnRleHQoY29udGV4dCk7XG4gIH1cblxuICBhcmVhLnggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgeDEgPSBudWxsLCBhcmVhKSA6IHgwO1xuICB9O1xuXG4gIGFyZWEueDAgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJlYSkgOiB4MDtcbiAgfTtcblxuICBhcmVhLngxID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgxID0gXyA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmVhKSA6IHgxO1xuICB9O1xuXG4gIGFyZWEueSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5MCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCB5MSA9IG51bGwsIGFyZWEpIDogeTA7XG4gIH07XG5cbiAgYXJlYS55MCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5MCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmVhKSA6IHkwO1xuICB9O1xuXG4gIGFyZWEueTEgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeTEgPSBfID09IG51bGwgPyBudWxsIDogdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyZWEpIDogeTE7XG4gIH07XG5cbiAgYXJlYS5saW5lWDAgPVxuICBhcmVhLmxpbmVZMCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBhcmVhbGluZSgpLngoeDApLnkoeTApO1xuICB9O1xuXG4gIGFyZWEubGluZVkxID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGFyZWFsaW5lKCkueCh4MCkueSh5MSk7XG4gIH07XG5cbiAgYXJlYS5saW5lWDEgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYXJlYWxpbmUoKS54KHgxKS55KHkwKTtcbiAgfTtcblxuICBhcmVhLmRlZmluZWQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGVmaW5lZCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgYXJlYSkgOiBkZWZpbmVkO1xuICB9O1xuXG4gIGFyZWEuY3VydmUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY3VydmUgPSBfLCBjb250ZXh0ICE9IG51bGwgJiYgKG91dHB1dCA9IGN1cnZlKGNvbnRleHQpKSwgYXJlYSkgOiBjdXJ2ZTtcbiAgfTtcblxuICBhcmVhLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gY29udGV4dCA9IG91dHB1dCA9IG51bGwgOiBvdXRwdXQgPSBjdXJ2ZShjb250ZXh0ID0gXyksIGFyZWEpIDogY29udGV4dDtcbiAgfTtcblxuICByZXR1cm4gYXJlYTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGIgPCBhID8gLTEgOiBiID4gYSA/IDEgOiBiID49IGEgPyAwIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZCkge1xuICByZXR1cm4gZDtcbn1cbiIsImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IGRlc2NlbmRpbmcgZnJvbSBcIi4vZGVzY2VuZGluZy5qc1wiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuL2lkZW50aXR5LmpzXCI7XG5pbXBvcnQge3RhdX0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHZhbHVlID0gaWRlbnRpdHksXG4gICAgICBzb3J0VmFsdWVzID0gZGVzY2VuZGluZyxcbiAgICAgIHNvcnQgPSBudWxsLFxuICAgICAgc3RhcnRBbmdsZSA9IGNvbnN0YW50KDApLFxuICAgICAgZW5kQW5nbGUgPSBjb25zdGFudCh0YXUpLFxuICAgICAgcGFkQW5nbGUgPSBjb25zdGFudCgwKTtcblxuICBmdW5jdGlvbiBwaWUoZGF0YSkge1xuICAgIHZhciBpLFxuICAgICAgICBuID0gZGF0YS5sZW5ndGgsXG4gICAgICAgIGosXG4gICAgICAgIGssXG4gICAgICAgIHN1bSA9IDAsXG4gICAgICAgIGluZGV4ID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBhcmNzID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBhMCA9ICtzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgIGRhID0gTWF0aC5taW4odGF1LCBNYXRoLm1heCgtdGF1LCBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC0gYTApKSxcbiAgICAgICAgYTEsXG4gICAgICAgIHAgPSBNYXRoLm1pbihNYXRoLmFicyhkYSkgLyBuLCBwYWRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSxcbiAgICAgICAgcGEgPSBwICogKGRhIDwgMCA/IC0xIDogMSksXG4gICAgICAgIHY7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKHYgPSBhcmNzW2luZGV4W2ldID0gaV0gPSArdmFsdWUoZGF0YVtpXSwgaSwgZGF0YSkpID4gMCkge1xuICAgICAgICBzdW0gKz0gdjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPcHRpb25hbGx5IHNvcnQgdGhlIGFyY3MgYnkgcHJldmlvdXNseS1jb21wdXRlZCB2YWx1ZXMgb3IgYnkgZGF0YS5cbiAgICBpZiAoc29ydFZhbHVlcyAhPSBudWxsKSBpbmRleC5zb3J0KGZ1bmN0aW9uKGksIGopIHsgcmV0dXJuIHNvcnRWYWx1ZXMoYXJjc1tpXSwgYXJjc1tqXSk7IH0pO1xuICAgIGVsc2UgaWYgKHNvcnQgIT0gbnVsbCkgaW5kZXguc29ydChmdW5jdGlvbihpLCBqKSB7IHJldHVybiBzb3J0KGRhdGFbaV0sIGRhdGFbal0pOyB9KTtcblxuICAgIC8vIENvbXB1dGUgdGhlIGFyY3MhIFRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgb3JpZ2luYWwgZGF0YSdzIG9yZGVyLlxuICAgIGZvciAoaSA9IDAsIGsgPSBzdW0gPyAoZGEgLSBuICogcGEpIC8gc3VtIDogMDsgaSA8IG47ICsraSwgYTAgPSBhMSkge1xuICAgICAgaiA9IGluZGV4W2ldLCB2ID0gYXJjc1tqXSwgYTEgPSBhMCArICh2ID4gMCA/IHYgKiBrIDogMCkgKyBwYSwgYXJjc1tqXSA9IHtcbiAgICAgICAgZGF0YTogZGF0YVtqXSxcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICAgIHZhbHVlOiB2LFxuICAgICAgICBzdGFydEFuZ2xlOiBhMCxcbiAgICAgICAgZW5kQW5nbGU6IGExLFxuICAgICAgICBwYWRBbmdsZTogcFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJjcztcbiAgfVxuXG4gIHBpZS52YWx1ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBwaWUpIDogdmFsdWU7XG4gIH07XG5cbiAgcGllLnNvcnRWYWx1ZXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc29ydFZhbHVlcyA9IF8sIHNvcnQgPSBudWxsLCBwaWUpIDogc29ydFZhbHVlcztcbiAgfTtcblxuICBwaWUuc29ydCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0ID0gXywgc29ydFZhbHVlcyA9IG51bGwsIHBpZSkgOiBzb3J0O1xuICB9O1xuXG4gIHBpZS5zdGFydEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0YXJ0QW5nbGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgcGllKSA6IHN0YXJ0QW5nbGU7XG4gIH07XG5cbiAgcGllLmVuZEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHBpZSkgOiBlbmRBbmdsZTtcbiAgfTtcblxuICBwaWUucGFkQW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkQW5nbGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgcGllKSA6IHBhZEFuZ2xlO1xuICB9O1xuXG4gIHJldHVybiBwaWU7XG59XG4iLCJpbXBvcnQgY3VydmVMaW5lYXIgZnJvbSBcIi4vbGluZWFyLmpzXCI7XG5cbmV4cG9ydCB2YXIgY3VydmVSYWRpYWxMaW5lYXIgPSBjdXJ2ZVJhZGlhbChjdXJ2ZUxpbmVhcik7XG5cbmZ1bmN0aW9uIFJhZGlhbChjdXJ2ZSkge1xuICB0aGlzLl9jdXJ2ZSA9IGN1cnZlO1xufVxuXG5SYWRpYWwucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2N1cnZlLmFyZWFTdGFydCgpO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9jdXJ2ZS5hcmVhRW5kKCk7XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fY3VydmUubGluZVN0YXJ0KCk7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2N1cnZlLmxpbmVFbmQoKTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKGEsIHIpIHtcbiAgICB0aGlzLl9jdXJ2ZS5wb2ludChyICogTWF0aC5zaW4oYSksIHIgKiAtTWF0aC5jb3MoYSkpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJ2ZVJhZGlhbChjdXJ2ZSkge1xuXG4gIGZ1bmN0aW9uIHJhZGlhbChjb250ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBSYWRpYWwoY3VydmUoY29udGV4dCkpO1xuICB9XG5cbiAgcmFkaWFsLl9jdXJ2ZSA9IGN1cnZlO1xuXG4gIHJldHVybiByYWRpYWw7XG59XG4iLCJpbXBvcnQgY3VydmVSYWRpYWwsIHtjdXJ2ZVJhZGlhbExpbmVhcn0gZnJvbSBcIi4vY3VydmUvcmFkaWFsLmpzXCI7XG5pbXBvcnQgbGluZSBmcm9tIFwiLi9saW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5lUmFkaWFsKGwpIHtcbiAgdmFyIGMgPSBsLmN1cnZlO1xuXG4gIGwuYW5nbGUgPSBsLngsIGRlbGV0ZSBsLng7XG4gIGwucmFkaXVzID0gbC55LCBkZWxldGUgbC55O1xuXG4gIGwuY3VydmUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7XG4gIH07XG5cbiAgcmV0dXJuIGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbGluZVJhZGlhbChsaW5lKCkuY3VydmUoY3VydmVSYWRpYWxMaW5lYXIpKTtcbn1cbiIsImltcG9ydCBjdXJ2ZVJhZGlhbCwge2N1cnZlUmFkaWFsTGluZWFyfSBmcm9tIFwiLi9jdXJ2ZS9yYWRpYWwuanNcIjtcbmltcG9ydCBhcmVhIGZyb20gXCIuL2FyZWEuanNcIjtcbmltcG9ydCB7bGluZVJhZGlhbH0gZnJvbSBcIi4vbGluZVJhZGlhbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGEgPSBhcmVhKCkuY3VydmUoY3VydmVSYWRpYWxMaW5lYXIpLFxuICAgICAgYyA9IGEuY3VydmUsXG4gICAgICB4MCA9IGEubGluZVgwLFxuICAgICAgeDEgPSBhLmxpbmVYMSxcbiAgICAgIHkwID0gYS5saW5lWTAsXG4gICAgICB5MSA9IGEubGluZVkxO1xuXG4gIGEuYW5nbGUgPSBhLngsIGRlbGV0ZSBhLng7XG4gIGEuc3RhcnRBbmdsZSA9IGEueDAsIGRlbGV0ZSBhLngwO1xuICBhLmVuZEFuZ2xlID0gYS54MSwgZGVsZXRlIGEueDE7XG4gIGEucmFkaXVzID0gYS55LCBkZWxldGUgYS55O1xuICBhLmlubmVyUmFkaXVzID0gYS55MCwgZGVsZXRlIGEueTA7XG4gIGEub3V0ZXJSYWRpdXMgPSBhLnkxLCBkZWxldGUgYS55MTtcbiAgYS5saW5lU3RhcnRBbmdsZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh4MCgpKTsgfSwgZGVsZXRlIGEubGluZVgwO1xuICBhLmxpbmVFbmRBbmdsZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh4MSgpKTsgfSwgZGVsZXRlIGEubGluZVgxO1xuICBhLmxpbmVJbm5lclJhZGl1cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh5MCgpKTsgfSwgZGVsZXRlIGEubGluZVkwO1xuICBhLmxpbmVPdXRlclJhZGl1cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh5MSgpKTsgfSwgZGVsZXRlIGEubGluZVkxO1xuXG4gIGEuY3VydmUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7XG4gIH07XG5cbiAgcmV0dXJuIGE7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCB5KSB7XG4gIHJldHVybiBbKHkgPSAreSkgKiBNYXRoLmNvcyh4IC09IE1hdGguUEkgLyAyKSwgeSAqIE1hdGguc2luKHgpXTtcbn1cbiIsImV4cG9ydCB2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG4iLCJpbXBvcnQge3BhdGh9IGZyb20gXCJkMy1wYXRoXCI7XG5pbXBvcnQge3NsaWNlfSBmcm9tIFwiLi4vYXJyYXkuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCB7eCBhcyBwb2ludFgsIHkgYXMgcG9pbnRZfSBmcm9tIFwiLi4vcG9pbnQuanNcIjtcbmltcG9ydCBwb2ludFJhZGlhbCBmcm9tIFwiLi4vcG9pbnRSYWRpYWwuanNcIjtcblxuZnVuY3Rpb24gbGlua1NvdXJjZShkKSB7XG4gIHJldHVybiBkLnNvdXJjZTtcbn1cblxuZnVuY3Rpb24gbGlua1RhcmdldChkKSB7XG4gIHJldHVybiBkLnRhcmdldDtcbn1cblxuZnVuY3Rpb24gbGluayhjdXJ2ZSkge1xuICB2YXIgc291cmNlID0gbGlua1NvdXJjZSxcbiAgICAgIHRhcmdldCA9IGxpbmtUYXJnZXQsXG4gICAgICB4ID0gcG9pbnRYLFxuICAgICAgeSA9IHBvaW50WSxcbiAgICAgIGNvbnRleHQgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGxpbmsoKSB7XG4gICAgdmFyIGJ1ZmZlciwgYXJndiA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKSwgcyA9IHNvdXJjZS5hcHBseSh0aGlzLCBhcmd2KSwgdCA9IHRhcmdldC5hcHBseSh0aGlzLCBhcmd2KTtcbiAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBwYXRoKCk7XG4gICAgY3VydmUoY29udGV4dCwgK3guYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSBzLCBhcmd2KSksICt5LmFwcGx5KHRoaXMsIGFyZ3YpLCAreC5hcHBseSh0aGlzLCAoYXJndlswXSA9IHQsIGFyZ3YpKSwgK3kuYXBwbHkodGhpcywgYXJndikpO1xuICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgXCJcIiB8fCBudWxsO1xuICB9XG5cbiAgbGluay5zb3VyY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc291cmNlID0gXywgbGluaykgOiBzb3VyY2U7XG4gIH07XG5cbiAgbGluay50YXJnZXQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGFyZ2V0ID0gXywgbGluaykgOiB0YXJnZXQ7XG4gIH07XG5cbiAgbGluay54ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgbGluaykgOiB4O1xuICB9O1xuXG4gIGxpbmsueSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGxpbmspIDogeTtcbiAgfTtcblxuICBsaW5rLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKGNvbnRleHQgPSBfID09IG51bGwgPyBudWxsIDogXyksIGxpbmspIDogY29udGV4dDtcbiAgfTtcblxuICByZXR1cm4gbGluaztcbn1cblxuZnVuY3Rpb24gY3VydmVIb3Jpem9udGFsKGNvbnRleHQsIHgwLCB5MCwgeDEsIHkxKSB7XG4gIGNvbnRleHQubW92ZVRvKHgwLCB5MCk7XG4gIGNvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCA9ICh4MCArIHgxKSAvIDIsIHkwLCB4MCwgeTEsIHgxLCB5MSk7XG59XG5cbmZ1bmN0aW9uIGN1cnZlVmVydGljYWwoY29udGV4dCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgY29udGV4dC5tb3ZlVG8oeDAsIHkwKTtcbiAgY29udGV4dC5iZXppZXJDdXJ2ZVRvKHgwLCB5MCA9ICh5MCArIHkxKSAvIDIsIHgxLCB5MCwgeDEsIHkxKTtcbn1cblxuZnVuY3Rpb24gY3VydmVSYWRpYWwoY29udGV4dCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIHAwID0gcG9pbnRSYWRpYWwoeDAsIHkwKSxcbiAgICAgIHAxID0gcG9pbnRSYWRpYWwoeDAsIHkwID0gKHkwICsgeTEpIC8gMiksXG4gICAgICBwMiA9IHBvaW50UmFkaWFsKHgxLCB5MCksXG4gICAgICBwMyA9IHBvaW50UmFkaWFsKHgxLCB5MSk7XG4gIGNvbnRleHQubW92ZVRvKHAwWzBdLCBwMFsxXSk7XG4gIGNvbnRleHQuYmV6aWVyQ3VydmVUbyhwMVswXSwgcDFbMV0sIHAyWzBdLCBwMlsxXSwgcDNbMF0sIHAzWzFdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtIb3Jpem9udGFsKCkge1xuICByZXR1cm4gbGluayhjdXJ2ZUhvcml6b250YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlua1ZlcnRpY2FsKCkge1xuICByZXR1cm4gbGluayhjdXJ2ZVZlcnRpY2FsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtSYWRpYWwoKSB7XG4gIHZhciBsID0gbGluayhjdXJ2ZVJhZGlhbCk7XG4gIGwuYW5nbGUgPSBsLngsIGRlbGV0ZSBsLng7XG4gIGwucmFkaXVzID0gbC55LCBkZWxldGUgbC55O1xuICByZXR1cm4gbDtcbn1cbiIsImltcG9ydCB7cGksIHRhdX0gZnJvbSBcIi4uL21hdGguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7XG4gICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIHBpKTtcbiAgICBjb250ZXh0Lm1vdmVUbyhyLCAwKTtcbiAgICBjb250ZXh0LmFyYygwLCAwLCByLCAwLCB0YXUpO1xuICB9XG59O1xuIiwiZXhwb3J0IGRlZmF1bHQge1xuICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7XG4gICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIDUpIC8gMjtcbiAgICBjb250ZXh0Lm1vdmVUbygtMyAqIHIsIC1yKTtcbiAgICBjb250ZXh0LmxpbmVUbygtciwgLXIpO1xuICAgIGNvbnRleHQubGluZVRvKC1yLCAtMyAqIHIpO1xuICAgIGNvbnRleHQubGluZVRvKHIsIC0zICogcik7XG4gICAgY29udGV4dC5saW5lVG8ociwgLXIpO1xuICAgIGNvbnRleHQubGluZVRvKDMgKiByLCAtcik7XG4gICAgY29udGV4dC5saW5lVG8oMyAqIHIsIHIpO1xuICAgIGNvbnRleHQubGluZVRvKHIsIHIpO1xuICAgIGNvbnRleHQubGluZVRvKHIsIDMgKiByKTtcbiAgICBjb250ZXh0LmxpbmVUbygtciwgMyAqIHIpO1xuICAgIGNvbnRleHQubGluZVRvKC1yLCByKTtcbiAgICBjb250ZXh0LmxpbmVUbygtMyAqIHIsIHIpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH1cbn07XG4iLCJ2YXIgdGFuMzAgPSBNYXRoLnNxcnQoMSAvIDMpLFxuICAgIHRhbjMwXzIgPSB0YW4zMCAqIDI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6ZSkge1xuICAgIHZhciB5ID0gTWF0aC5zcXJ0KHNpemUgLyB0YW4zMF8yKSxcbiAgICAgICAgeCA9IHkgKiB0YW4zMDtcbiAgICBjb250ZXh0Lm1vdmVUbygwLCAteSk7XG4gICAgY29udGV4dC5saW5lVG8oeCwgMCk7XG4gICAgY29udGV4dC5saW5lVG8oMCwgeSk7XG4gICAgY29udGV4dC5saW5lVG8oLXgsIDApO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH1cbn07XG4iLCJpbXBvcnQge3BpLCB0YXV9IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5cbnZhciBrYSA9IDAuODkwODEzMDkxNTI5Mjg1MjI4MTAsXG4gICAga3IgPSBNYXRoLnNpbihwaSAvIDEwKSAvIE1hdGguc2luKDcgKiBwaSAvIDEwKSxcbiAgICBreCA9IE1hdGguc2luKHRhdSAvIDEwKSAqIGtyLFxuICAgIGt5ID0gLU1hdGguY29zKHRhdSAvIDEwKSAqIGtyO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHtcbiAgICB2YXIgciA9IE1hdGguc3FydChzaXplICoga2EpLFxuICAgICAgICB4ID0ga3ggKiByLFxuICAgICAgICB5ID0ga3kgKiByO1xuICAgIGNvbnRleHQubW92ZVRvKDAsIC1yKTtcbiAgICBjb250ZXh0LmxpbmVUbyh4LCB5KTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IDU7ICsraSkge1xuICAgICAgdmFyIGEgPSB0YXUgKiBpIC8gNSxcbiAgICAgICAgICBjID0gTWF0aC5jb3MoYSksXG4gICAgICAgICAgcyA9IE1hdGguc2luKGEpO1xuICAgICAgY29udGV4dC5saW5lVG8ocyAqIHIsIC1jICogcik7XG4gICAgICBjb250ZXh0LmxpbmVUbyhjICogeCAtIHMgKiB5LCBzICogeCArIGMgKiB5KTtcbiAgICB9XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgfVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6ZSkge1xuICAgIHZhciB3ID0gTWF0aC5zcXJ0KHNpemUpLFxuICAgICAgICB4ID0gLXcgLyAyO1xuICAgIGNvbnRleHQucmVjdCh4LCB4LCB3LCB3KTtcbiAgfVxufTtcbiIsInZhciBzcXJ0MyA9IE1hdGguc3FydCgzKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7XG4gICAgdmFyIHkgPSAtTWF0aC5zcXJ0KHNpemUgLyAoc3FydDMgKiAzKSk7XG4gICAgY29udGV4dC5tb3ZlVG8oMCwgeSAqIDIpO1xuICAgIGNvbnRleHQubGluZVRvKC1zcXJ0MyAqIHksIC15KTtcbiAgICBjb250ZXh0LmxpbmVUbyhzcXJ0MyAqIHksIC15KTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9XG59O1xuIiwidmFyIGMgPSAtMC41LFxuICAgIHMgPSBNYXRoLnNxcnQoMykgLyAyLFxuICAgIGsgPSAxIC8gTWF0aC5zcXJ0KDEyKSxcbiAgICBhID0gKGsgLyAyICsgMSkgKiAzO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHtcbiAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gYSksXG4gICAgICAgIHgwID0gciAvIDIsXG4gICAgICAgIHkwID0gciAqIGssXG4gICAgICAgIHgxID0geDAsXG4gICAgICAgIHkxID0gciAqIGsgKyByLFxuICAgICAgICB4MiA9IC14MSxcbiAgICAgICAgeTIgPSB5MTtcbiAgICBjb250ZXh0Lm1vdmVUbyh4MCwgeTApO1xuICAgIGNvbnRleHQubGluZVRvKHgxLCB5MSk7XG4gICAgY29udGV4dC5saW5lVG8oeDIsIHkyKTtcbiAgICBjb250ZXh0LmxpbmVUbyhjICogeDAgLSBzICogeTAsIHMgKiB4MCArIGMgKiB5MCk7XG4gICAgY29udGV4dC5saW5lVG8oYyAqIHgxIC0gcyAqIHkxLCBzICogeDEgKyBjICogeTEpO1xuICAgIGNvbnRleHQubGluZVRvKGMgKiB4MiAtIHMgKiB5MiwgcyAqIHgyICsgYyAqIHkyKTtcbiAgICBjb250ZXh0LmxpbmVUbyhjICogeDAgKyBzICogeTAsIGMgKiB5MCAtIHMgKiB4MCk7XG4gICAgY29udGV4dC5saW5lVG8oYyAqIHgxICsgcyAqIHkxLCBjICogeTEgLSBzICogeDEpO1xuICAgIGNvbnRleHQubGluZVRvKGMgKiB4MiArIHMgKiB5MiwgYyAqIHkyIC0gcyAqIHgyKTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9XG59O1xuIiwiaW1wb3J0IHtwYXRofSBmcm9tIFwiZDMtcGF0aFwiO1xuaW1wb3J0IGNpcmNsZSBmcm9tIFwiLi9zeW1ib2wvY2lyY2xlLmpzXCI7XG5pbXBvcnQgY3Jvc3MgZnJvbSBcIi4vc3ltYm9sL2Nyb3NzLmpzXCI7XG5pbXBvcnQgZGlhbW9uZCBmcm9tIFwiLi9zeW1ib2wvZGlhbW9uZC5qc1wiO1xuaW1wb3J0IHN0YXIgZnJvbSBcIi4vc3ltYm9sL3N0YXIuanNcIjtcbmltcG9ydCBzcXVhcmUgZnJvbSBcIi4vc3ltYm9sL3NxdWFyZS5qc1wiO1xuaW1wb3J0IHRyaWFuZ2xlIGZyb20gXCIuL3N5bWJvbC90cmlhbmdsZS5qc1wiO1xuaW1wb3J0IHd5ZSBmcm9tIFwiLi9zeW1ib2wvd3llLmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZXhwb3J0IHZhciBzeW1ib2xzID0gW1xuICBjaXJjbGUsXG4gIGNyb3NzLFxuICBkaWFtb25kLFxuICBzcXVhcmUsXG4gIHN0YXIsXG4gIHRyaWFuZ2xlLFxuICB3eWVcbl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgdHlwZSA9IGNvbnN0YW50KGNpcmNsZSksXG4gICAgICBzaXplID0gY29uc3RhbnQoNjQpLFxuICAgICAgY29udGV4dCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gc3ltYm9sKCkge1xuICAgIHZhciBidWZmZXI7XG4gICAgaWYgKCFjb250ZXh0KSBjb250ZXh0ID0gYnVmZmVyID0gcGF0aCgpO1xuICAgIHR5cGUuYXBwbHkodGhpcywgYXJndW1lbnRzKS5kcmF3KGNvbnRleHQsICtzaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgXCJcIiB8fCBudWxsO1xuICB9XG5cbiAgc3ltYm9sLnR5cGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHlwZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIHN5bWJvbCkgOiB0eXBlO1xuICB9O1xuXG4gIHN5bWJvbC5zaXplID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNpemUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgc3ltYm9sKSA6IHNpemU7XG4gIH07XG5cbiAgc3ltYm9sLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfLCBzeW1ib2wpIDogY29udGV4dDtcbiAgfTtcblxuICByZXR1cm4gc3ltYm9sO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7fVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHBvaW50KHRoYXQsIHgsIHkpIHtcbiAgdGhhdC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKFxuICAgICgyICogdGhhdC5feDAgKyB0aGF0Ll94MSkgLyAzLFxuICAgICgyICogdGhhdC5feTAgKyB0aGF0Ll95MSkgLyAzLFxuICAgICh0aGF0Ll94MCArIDIgKiB0aGF0Ll94MSkgLyAzLFxuICAgICh0aGF0Ll95MCArIDIgKiB0aGF0Ll95MSkgLyAzLFxuICAgICh0aGF0Ll94MCArIDQgKiB0aGF0Ll94MSArIHgpIC8gNixcbiAgICAodGhhdC5feTAgKyA0ICogdGhhdC5feTEgKyB5KSAvIDZcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEJhc2lzKGNvbnRleHQpIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG59XG5cbkJhc2lzLnByb3RvdHlwZSA9IHtcbiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gMDtcbiAgfSxcbiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IE5hTjtcbiAgfSxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID1cbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gTmFOO1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAzOiBwb2ludCh0aGlzLCB0aGlzLl94MSwgdGhpcy5feTEpOyAvLyBwcm9jZWVkXG4gICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLCB0aGlzLl95MSk7IGJyZWFrO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHggPSAreCwgeSA9ICt5O1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7XG4gICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5fY29udGV4dC5saW5lVG8oKDUgKiB0aGlzLl94MCArIHRoaXMuX3gxKSAvIDYsICg1ICogdGhpcy5feTAgKyB0aGlzLl95MSkgLyA2KTsgLy8gcHJvY2VlZFxuICAgICAgZGVmYXVsdDogcG9pbnQodGhpcywgeCwgeSk7IGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgQmFzaXMoY29udGV4dCk7XG59XG4iLCJpbXBvcnQgbm9vcCBmcm9tIFwiLi4vbm9vcC5qc1wiO1xuaW1wb3J0IHtwb2ludH0gZnJvbSBcIi4vYmFzaXMuanNcIjtcblxuZnVuY3Rpb24gQmFzaXNDbG9zZWQoY29udGV4dCkge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbn1cblxuQmFzaXNDbG9zZWQucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IG5vb3AsXG4gIGFyZWFFbmQ6IG5vb3AsXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0gdGhpcy5feDMgPSB0aGlzLl94NCA9XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gdGhpcy5feTMgPSB0aGlzLl95NCA9IE5hTjtcbiAgICB0aGlzLl9wb2ludCA9IDA7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMToge1xuICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MiwgdGhpcy5feTIpO1xuICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMjoge1xuICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDIgKyAyICogdGhpcy5feDMpIC8gMywgKHRoaXMuX3kyICsgMiAqIHRoaXMuX3kzKSAvIDMpO1xuICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMgKyAyICogdGhpcy5feDIpIC8gMywgKHRoaXMuX3kzICsgMiAqIHRoaXMuX3kyKSAvIDMpO1xuICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMzoge1xuICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3gyLCB0aGlzLl95Mik7XG4gICAgICAgIHRoaXMucG9pbnQodGhpcy5feDMsIHRoaXMuX3kzKTtcbiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NCwgdGhpcy5feTQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgeCA9ICt4LCB5ID0gK3k7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX3gyID0geCwgdGhpcy5feTIgPSB5OyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl94MyA9IHgsIHRoaXMuX3kzID0geTsgYnJlYWs7XG4gICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5feDQgPSB4LCB0aGlzLl95NCA9IHk7IHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCArIDQgKiB0aGlzLl94MSArIHgpIC8gNiwgKHRoaXMuX3kwICsgNCAqIHRoaXMuX3kxICsgeSkgLyA2KTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ldyBCYXNpc0Nsb3NlZChjb250ZXh0KTtcbn1cbiIsImltcG9ydCB7cG9pbnR9IGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5cbmZ1bmN0aW9uIEJhc2lzT3Blbihjb250ZXh0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xufVxuXG5CYXNpc09wZW4ucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPVxuICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSBOYU47XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMykpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHggPSAreCwgeSA9ICt5O1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhaztcbiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB2YXIgeDAgPSAodGhpcy5feDAgKyA0ICogdGhpcy5feDEgKyB4KSAvIDYsIHkwID0gKHRoaXMuX3kwICsgNCAqIHRoaXMuX3kxICsgeSkgLyA2OyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeDAsIHkwKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgwLCB5MCk7IGJyZWFrO1xuICAgICAgY2FzZSAzOiB0aGlzLl9wb2ludCA9IDQ7IC8vIHByb2NlZWRcbiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHgsIHkpOyBicmVhaztcbiAgICB9XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB4O1xuICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICByZXR1cm4gbmV3IEJhc2lzT3Blbihjb250ZXh0KTtcbn1cbiIsImltcG9ydCB7QmFzaXN9IGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5cbmZ1bmN0aW9uIEJ1bmRsZShjb250ZXh0LCBiZXRhKSB7XG4gIHRoaXMuX2Jhc2lzID0gbmV3IEJhc2lzKGNvbnRleHQpO1xuICB0aGlzLl9iZXRhID0gYmV0YTtcbn1cblxuQnVuZGxlLnByb3RvdHlwZSA9IHtcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl94ID0gW107XG4gICAgdGhpcy5feSA9IFtdO1xuICAgIHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgeCA9IHRoaXMuX3gsXG4gICAgICAgIHkgPSB0aGlzLl95LFxuICAgICAgICBqID0geC5sZW5ndGggLSAxO1xuXG4gICAgaWYgKGogPiAwKSB7XG4gICAgICB2YXIgeDAgPSB4WzBdLFxuICAgICAgICAgIHkwID0geVswXSxcbiAgICAgICAgICBkeCA9IHhbal0gLSB4MCxcbiAgICAgICAgICBkeSA9IHlbal0gLSB5MCxcbiAgICAgICAgICBpID0gLTEsXG4gICAgICAgICAgdDtcblxuICAgICAgd2hpbGUgKCsraSA8PSBqKSB7XG4gICAgICAgIHQgPSBpIC8gajtcbiAgICAgICAgdGhpcy5fYmFzaXMucG9pbnQoXG4gICAgICAgICAgdGhpcy5fYmV0YSAqIHhbaV0gKyAoMSAtIHRoaXMuX2JldGEpICogKHgwICsgdCAqIGR4KSxcbiAgICAgICAgICB0aGlzLl9iZXRhICogeVtpXSArICgxIC0gdGhpcy5fYmV0YSkgKiAoeTAgKyB0ICogZHkpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5feCA9IHRoaXMuX3kgPSBudWxsO1xuICAgIHRoaXMuX2Jhc2lzLmxpbmVFbmQoKTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB0aGlzLl94LnB1c2goK3gpO1xuICAgIHRoaXMuX3kucHVzaCgreSk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20oYmV0YSkge1xuXG4gIGZ1bmN0aW9uIGJ1bmRsZShjb250ZXh0KSB7XG4gICAgcmV0dXJuIGJldGEgPT09IDEgPyBuZXcgQmFzaXMoY29udGV4dCkgOiBuZXcgQnVuZGxlKGNvbnRleHQsIGJldGEpO1xuICB9XG5cbiAgYnVuZGxlLmJldGEgPSBmdW5jdGlvbihiZXRhKSB7XG4gICAgcmV0dXJuIGN1c3RvbSgrYmV0YSk7XG4gIH07XG5cbiAgcmV0dXJuIGJ1bmRsZTtcbn0pKDAuODUpO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIHBvaW50KHRoYXQsIHgsIHkpIHtcbiAgdGhhdC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKFxuICAgIHRoYXQuX3gxICsgdGhhdC5fayAqICh0aGF0Ll94MiAtIHRoYXQuX3gwKSxcbiAgICB0aGF0Ll95MSArIHRoYXQuX2sgKiAodGhhdC5feTIgLSB0aGF0Ll95MCksXG4gICAgdGhhdC5feDIgKyB0aGF0Ll9rICogKHRoYXQuX3gxIC0geCksXG4gICAgdGhhdC5feTIgKyB0aGF0Ll9rICogKHRoYXQuX3kxIC0geSksXG4gICAgdGhhdC5feDIsXG4gICAgdGhhdC5feTJcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENhcmRpbmFsKGNvbnRleHQsIHRlbnNpb24pIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuX2sgPSAoMSAtIHRlbnNpb24pIC8gNjtcbn1cblxuQ2FyZGluYWwucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPSB0aGlzLl94MiA9XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gTmFOO1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhaztcbiAgICAgIGNhc2UgMzogcG9pbnQodGhpcywgdGhpcy5feDEsIHRoaXMuX3kxKTsgYnJlYWs7XG4gICAgfVxuICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgeCA9ICt4LCB5ID0gK3k7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl94MSA9IHgsIHRoaXMuX3kxID0geTsgYnJlYWs7XG4gICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgLy8gcHJvY2VlZFxuICAgICAgZGVmYXVsdDogcG9pbnQodGhpcywgeCwgeSk7IGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gY3VzdG9tKHRlbnNpb24pIHtcblxuICBmdW5jdGlvbiBjYXJkaW5hbChjb250ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBDYXJkaW5hbChjb250ZXh0LCB0ZW5zaW9uKTtcbiAgfVxuXG4gIGNhcmRpbmFsLnRlbnNpb24gPSBmdW5jdGlvbih0ZW5zaW9uKSB7XG4gICAgcmV0dXJuIGN1c3RvbSgrdGVuc2lvbik7XG4gIH07XG5cbiAgcmV0dXJuIGNhcmRpbmFsO1xufSkoMCk7XG4iLCJpbXBvcnQgbm9vcCBmcm9tIFwiLi4vbm9vcC5qc1wiO1xuaW1wb3J0IHtwb2ludH0gZnJvbSBcIi4vY2FyZGluYWwuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIENhcmRpbmFsQ2xvc2VkKGNvbnRleHQsIHRlbnNpb24pIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuX2sgPSAoMSAtIHRlbnNpb24pIC8gNjtcbn1cblxuQ2FyZGluYWxDbG9zZWQucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IG5vb3AsXG4gIGFyZWFFbmQ6IG5vb3AsXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0gdGhpcy5feDMgPSB0aGlzLl94NCA9IHRoaXMuX3g1ID1cbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSB0aGlzLl95MyA9IHRoaXMuX3k0ID0gdGhpcy5feTUgPSBOYU47XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDE6IHtcbiAgICAgICAgdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsIHRoaXMuX3kzKTtcbiAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIDI6IHtcbiAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsIHRoaXMuX3kzKTtcbiAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIDM6IHtcbiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94MywgdGhpcy5feTMpO1xuICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g0LCB0aGlzLl95NCk7XG4gICAgICAgIHRoaXMucG9pbnQodGhpcy5feDUsIHRoaXMuX3k1KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHggPSAreCwgeSA9ICt5O1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl94MyA9IHgsIHRoaXMuX3kzID0geTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQgPSB4LCB0aGlzLl95NCA9IHkpOyBicmVhaztcbiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl94NSA9IHgsIHRoaXMuX3k1ID0geTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20odGVuc2lvbikge1xuXG4gIGZ1bmN0aW9uIGNhcmRpbmFsKGNvbnRleHQpIHtcbiAgICByZXR1cm4gbmV3IENhcmRpbmFsQ2xvc2VkKGNvbnRleHQsIHRlbnNpb24pO1xuICB9XG5cbiAgY2FyZGluYWwudGVuc2lvbiA9IGZ1bmN0aW9uKHRlbnNpb24pIHtcbiAgICByZXR1cm4gY3VzdG9tKCt0ZW5zaW9uKTtcbiAgfTtcblxuICByZXR1cm4gY2FyZGluYWw7XG59KSgwKTtcbiIsImltcG9ydCB7cG9pbnR9IGZyb20gXCIuL2NhcmRpbmFsLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDYXJkaW5hbE9wZW4oY29udGV4dCwgdGVuc2lvbikge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5fayA9ICgxIC0gdGVuc2lvbikgLyA2O1xufVxuXG5DYXJkaW5hbE9wZW4ucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPSB0aGlzLl94MiA9XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gTmFOO1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDMpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7XG4gICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95MikgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhaztcbiAgICAgIGNhc2UgMzogdGhpcy5fcG9pbnQgPSA0OyAvLyBwcm9jZWVkXG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20odGVuc2lvbikge1xuXG4gIGZ1bmN0aW9uIGNhcmRpbmFsKGNvbnRleHQpIHtcbiAgICByZXR1cm4gbmV3IENhcmRpbmFsT3Blbihjb250ZXh0LCB0ZW5zaW9uKTtcbiAgfVxuXG4gIGNhcmRpbmFsLnRlbnNpb24gPSBmdW5jdGlvbih0ZW5zaW9uKSB7XG4gICAgcmV0dXJuIGN1c3RvbSgrdGVuc2lvbik7XG4gIH07XG5cbiAgcmV0dXJuIGNhcmRpbmFsO1xufSkoMCk7XG4iLCJpbXBvcnQge2Vwc2lsb259IGZyb20gXCIuLi9tYXRoLmpzXCI7XG5pbXBvcnQge0NhcmRpbmFsfSBmcm9tIFwiLi9jYXJkaW5hbC5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnQodGhhdCwgeCwgeSkge1xuICB2YXIgeDEgPSB0aGF0Ll94MSxcbiAgICAgIHkxID0gdGhhdC5feTEsXG4gICAgICB4MiA9IHRoYXQuX3gyLFxuICAgICAgeTIgPSB0aGF0Ll95MjtcblxuICBpZiAodGhhdC5fbDAxX2EgPiBlcHNpbG9uKSB7XG4gICAgdmFyIGEgPSAyICogdGhhdC5fbDAxXzJhICsgMyAqIHRoYXQuX2wwMV9hICogdGhhdC5fbDEyX2EgKyB0aGF0Ll9sMTJfMmEsXG4gICAgICAgIG4gPSAzICogdGhhdC5fbDAxX2EgKiAodGhhdC5fbDAxX2EgKyB0aGF0Ll9sMTJfYSk7XG4gICAgeDEgPSAoeDEgKiBhIC0gdGhhdC5feDAgKiB0aGF0Ll9sMTJfMmEgKyB0aGF0Ll94MiAqIHRoYXQuX2wwMV8yYSkgLyBuO1xuICAgIHkxID0gKHkxICogYSAtIHRoYXQuX3kwICogdGhhdC5fbDEyXzJhICsgdGhhdC5feTIgKiB0aGF0Ll9sMDFfMmEpIC8gbjtcbiAgfVxuXG4gIGlmICh0aGF0Ll9sMjNfYSA+IGVwc2lsb24pIHtcbiAgICB2YXIgYiA9IDIgKiB0aGF0Ll9sMjNfMmEgKyAzICogdGhhdC5fbDIzX2EgKiB0aGF0Ll9sMTJfYSArIHRoYXQuX2wxMl8yYSxcbiAgICAgICAgbSA9IDMgKiB0aGF0Ll9sMjNfYSAqICh0aGF0Ll9sMjNfYSArIHRoYXQuX2wxMl9hKTtcbiAgICB4MiA9ICh4MiAqIGIgKyB0aGF0Ll94MSAqIHRoYXQuX2wyM18yYSAtIHggKiB0aGF0Ll9sMTJfMmEpIC8gbTtcbiAgICB5MiA9ICh5MiAqIGIgKyB0aGF0Ll95MSAqIHRoYXQuX2wyM18yYSAtIHkgKiB0aGF0Ll9sMTJfMmEpIC8gbTtcbiAgfVxuXG4gIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh4MSwgeTEsIHgyLCB5MiwgdGhhdC5feDIsIHRoYXQuX3kyKTtcbn1cblxuZnVuY3Rpb24gQ2F0bXVsbFJvbShjb250ZXh0LCBhbHBoYSkge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5fYWxwaGEgPSBhbHBoYTtcbn1cblxuQ2F0bXVsbFJvbS5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID1cbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47XG4gICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hID1cbiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmEgPVxuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhaztcbiAgICAgIGNhc2UgMzogdGhpcy5wb2ludCh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhaztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcblxuICAgIGlmICh0aGlzLl9wb2ludCkge1xuICAgICAgdmFyIHgyMyA9IHRoaXMuX3gyIC0geCxcbiAgICAgICAgICB5MjMgPSB0aGlzLl95MiAtIHk7XG4gICAgICB0aGlzLl9sMjNfYSA9IE1hdGguc3FydCh0aGlzLl9sMjNfMmEgPSBNYXRoLnBvdyh4MjMgKiB4MjMgKyB5MjMgKiB5MjMsIHRoaXMuX2FscGhhKSk7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhaztcbiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyAvLyBwcm9jZWVkXG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYTtcbiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gY3VzdG9tKGFscGhhKSB7XG5cbiAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7XG4gICAgcmV0dXJuIGFscGhhID8gbmV3IENhdG11bGxSb20oY29udGV4dCwgYWxwaGEpIDogbmV3IENhcmRpbmFsKGNvbnRleHQsIDApO1xuICB9XG5cbiAgY2F0bXVsbFJvbS5hbHBoYSA9IGZ1bmN0aW9uKGFscGhhKSB7XG4gICAgcmV0dXJuIGN1c3RvbSgrYWxwaGEpO1xuICB9O1xuXG4gIHJldHVybiBjYXRtdWxsUm9tO1xufSkoMC41KTtcbiIsImltcG9ydCB7Q2FyZGluYWxDbG9zZWR9IGZyb20gXCIuL2NhcmRpbmFsQ2xvc2VkLmpzXCI7XG5pbXBvcnQgbm9vcCBmcm9tIFwiLi4vbm9vcC5qc1wiO1xuaW1wb3J0IHtwb2ludH0gZnJvbSBcIi4vY2F0bXVsbFJvbS5qc1wiO1xuXG5mdW5jdGlvbiBDYXRtdWxsUm9tQ2xvc2VkKGNvbnRleHQsIGFscGhhKSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLl9hbHBoYSA9IGFscGhhO1xufVxuXG5DYXRtdWxsUm9tQ2xvc2VkLnByb3RvdHlwZSA9IHtcbiAgYXJlYVN0YXJ0OiBub29wLFxuICBhcmVhRW5kOiBub29wLFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPSB0aGlzLl94MiA9IHRoaXMuX3gzID0gdGhpcy5feDQgPSB0aGlzLl94NSA9XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gdGhpcy5feTMgPSB0aGlzLl95NCA9IHRoaXMuX3k1ID0gTmFOO1xuICAgIHRoaXMuX2wwMV9hID0gdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYSA9XG4gICAgdGhpcy5fbDAxXzJhID0gdGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhID1cbiAgICB0aGlzLl9wb2ludCA9IDA7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMToge1xuICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MywgdGhpcy5feTMpO1xuICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMjoge1xuICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MywgdGhpcy5feTMpO1xuICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMzoge1xuICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3gzLCB0aGlzLl95Myk7XG4gICAgICAgIHRoaXMucG9pbnQodGhpcy5feDQsIHRoaXMuX3k0KTtcbiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NSwgdGhpcy5feTUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgeCA9ICt4LCB5ID0gK3k7XG5cbiAgICBpZiAodGhpcy5fcG9pbnQpIHtcbiAgICAgIHZhciB4MjMgPSB0aGlzLl94MiAtIHgsXG4gICAgICAgICAgeTIzID0gdGhpcy5feTIgLSB5O1xuICAgICAgdGhpcy5fbDIzX2EgPSBNYXRoLnNxcnQodGhpcy5fbDIzXzJhID0gTWF0aC5wb3coeDIzICogeDIzICsgeTIzICogeTIzLCB0aGlzLl9hbHBoYSkpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl94MyA9IHgsIHRoaXMuX3kzID0geTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQgPSB4LCB0aGlzLl95NCA9IHkpOyBicmVhaztcbiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl94NSA9IHgsIHRoaXMuX3k1ID0geTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYTtcbiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gY3VzdG9tKGFscGhhKSB7XG5cbiAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7XG4gICAgcmV0dXJuIGFscGhhID8gbmV3IENhdG11bGxSb21DbG9zZWQoY29udGV4dCwgYWxwaGEpIDogbmV3IENhcmRpbmFsQ2xvc2VkKGNvbnRleHQsIDApO1xuICB9XG5cbiAgY2F0bXVsbFJvbS5hbHBoYSA9IGZ1bmN0aW9uKGFscGhhKSB7XG4gICAgcmV0dXJuIGN1c3RvbSgrYWxwaGEpO1xuICB9O1xuXG4gIHJldHVybiBjYXRtdWxsUm9tO1xufSkoMC41KTtcbiIsImltcG9ydCB7Q2FyZGluYWxPcGVufSBmcm9tIFwiLi9jYXJkaW5hbE9wZW4uanNcIjtcbmltcG9ydCB7cG9pbnR9IGZyb20gXCIuL2NhdG11bGxSb20uanNcIjtcblxuZnVuY3Rpb24gQ2F0bXVsbFJvbU9wZW4oY29udGV4dCwgYWxwaGEpIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuX2FscGhhID0gYWxwaGE7XG59XG5cbkNhdG11bGxSb21PcGVuLnByb3RvdHlwZSA9IHtcbiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gMDtcbiAgfSxcbiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IE5hTjtcbiAgfSxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPVxuICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IE5hTjtcbiAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hID0gdGhpcy5fbDIzX2EgPVxuICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYSA9XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMykpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHggPSAreCwgeSA9ICt5O1xuXG4gICAgaWYgKHRoaXMuX3BvaW50KSB7XG4gICAgICB2YXIgeDIzID0gdGhpcy5feDIgLSB4LFxuICAgICAgICAgIHkyMyA9IHRoaXMuX3kyIC0geTtcbiAgICAgIHRoaXMuX2wyM19hID0gTWF0aC5zcXJ0KHRoaXMuX2wyM18yYSA9IE1hdGgucG93KHgyMyAqIHgyMyArIHkyMyAqIHkyMywgdGhpcy5fYWxwaGEpKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7XG4gICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95MikgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhaztcbiAgICAgIGNhc2UgMzogdGhpcy5fcG9pbnQgPSA0OyAvLyBwcm9jZWVkXG4gICAgICBkZWZhdWx0OiBwb2ludCh0aGlzLCB4LCB5KTsgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYTtcbiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gY3VzdG9tKGFscGhhKSB7XG5cbiAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7XG4gICAgcmV0dXJuIGFscGhhID8gbmV3IENhdG11bGxSb21PcGVuKGNvbnRleHQsIGFscGhhKSA6IG5ldyBDYXJkaW5hbE9wZW4oY29udGV4dCwgMCk7XG4gIH1cblxuICBjYXRtdWxsUm9tLmFscGhhID0gZnVuY3Rpb24oYWxwaGEpIHtcbiAgICByZXR1cm4gY3VzdG9tKCthbHBoYSk7XG4gIH07XG5cbiAgcmV0dXJuIGNhdG11bGxSb207XG59KSgwLjUpO1xuIiwiaW1wb3J0IG5vb3AgZnJvbSBcIi4uL25vb3AuanNcIjtcblxuZnVuY3Rpb24gTGluZWFyQ2xvc2VkKGNvbnRleHQpIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG59XG5cbkxpbmVhckNsb3NlZC5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogbm9vcCxcbiAgYXJlYUVuZDogbm9vcCxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9wb2ludCA9IDA7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9wb2ludCkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBpZiAodGhpcy5fcG9pbnQpIHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpO1xuICAgIGVsc2UgdGhpcy5fcG9pbnQgPSAxLCB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICByZXR1cm4gbmV3IExpbmVhckNsb3NlZChjb250ZXh0KTtcbn1cbiIsImZ1bmN0aW9uIHNpZ24oeCkge1xuICByZXR1cm4geCA8IDAgPyAtMSA6IDE7XG59XG5cbi8vIENhbGN1bGF0ZSB0aGUgc2xvcGVzIG9mIHRoZSB0YW5nZW50cyAoSGVybWl0ZS10eXBlIGludGVycG9sYXRpb24pIGJhc2VkIG9uXG4vLyB0aGUgZm9sbG93aW5nIHBhcGVyOiBTdGVmZmVuLCBNLiAxOTkwLiBBIFNpbXBsZSBNZXRob2QgZm9yIE1vbm90b25pY1xuLy8gSW50ZXJwb2xhdGlvbiBpbiBPbmUgRGltZW5zaW9uLiBBc3Ryb25vbXkgYW5kIEFzdHJvcGh5c2ljcywgVm9sLiAyMzksIE5PLlxuLy8gTk9WKElJKSwgUC4gNDQzLCAxOTkwLlxuZnVuY3Rpb24gc2xvcGUzKHRoYXQsIHgyLCB5Mikge1xuICB2YXIgaDAgPSB0aGF0Ll94MSAtIHRoYXQuX3gwLFxuICAgICAgaDEgPSB4MiAtIHRoYXQuX3gxLFxuICAgICAgczAgPSAodGhhdC5feTEgLSB0aGF0Ll95MCkgLyAoaDAgfHwgaDEgPCAwICYmIC0wKSxcbiAgICAgIHMxID0gKHkyIC0gdGhhdC5feTEpIC8gKGgxIHx8IGgwIDwgMCAmJiAtMCksXG4gICAgICBwID0gKHMwICogaDEgKyBzMSAqIGgwKSAvIChoMCArIGgxKTtcbiAgcmV0dXJuIChzaWduKHMwKSArIHNpZ24oczEpKSAqIE1hdGgubWluKE1hdGguYWJzKHMwKSwgTWF0aC5hYnMoczEpLCAwLjUgKiBNYXRoLmFicyhwKSkgfHwgMDtcbn1cblxuLy8gQ2FsY3VsYXRlIGEgb25lLXNpZGVkIHNsb3BlLlxuZnVuY3Rpb24gc2xvcGUyKHRoYXQsIHQpIHtcbiAgdmFyIGggPSB0aGF0Ll94MSAtIHRoYXQuX3gwO1xuICByZXR1cm4gaCA/ICgzICogKHRoYXQuX3kxIC0gdGhhdC5feTApIC8gaCAtIHQpIC8gMiA6IHQ7XG59XG5cbi8vIEFjY29yZGluZyB0byBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdWJpY19IZXJtaXRlX3NwbGluZSNSZXByZXNlbnRhdGlvbnNcbi8vIFwieW91IGNhbiBleHByZXNzIGN1YmljIEhlcm1pdGUgaW50ZXJwb2xhdGlvbiBpbiB0ZXJtcyBvZiBjdWJpYyBCw6l6aWVyIGN1cnZlc1xuLy8gd2l0aCByZXNwZWN0IHRvIHRoZSBmb3VyIHZhbHVlcyBwMCwgcDAgKyBtMCAvIDMsIHAxIC0gbTEgLyAzLCBwMVwiLlxuZnVuY3Rpb24gcG9pbnQodGhhdCwgdDAsIHQxKSB7XG4gIHZhciB4MCA9IHRoYXQuX3gwLFxuICAgICAgeTAgPSB0aGF0Ll95MCxcbiAgICAgIHgxID0gdGhhdC5feDEsXG4gICAgICB5MSA9IHRoYXQuX3kxLFxuICAgICAgZHggPSAoeDEgLSB4MCkgLyAzO1xuICB0aGF0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oeDAgKyBkeCwgeTAgKyBkeCAqIHQwLCB4MSAtIGR4LCB5MSAtIGR4ICogdDEsIHgxLCB5MSk7XG59XG5cbmZ1bmN0aW9uIE1vbm90b25lWChjb250ZXh0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xufVxuXG5Nb25vdG9uZVgucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSAwO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gTmFOO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPVxuICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPVxuICAgIHRoaXMuX3QwID0gTmFOO1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSwgdGhpcy5feTEpOyBicmVhaztcbiAgICAgIGNhc2UgMzogcG9pbnQodGhpcywgdGhpcy5fdDAsIHNsb3BlMih0aGlzLCB0aGlzLl90MCkpOyBicmVhaztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB2YXIgdDEgPSBOYU47XG5cbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBpZiAoeCA9PT0gdGhpcy5feDEgJiYgeSA9PT0gdGhpcy5feTEpIHJldHVybjsgLy8gSWdub3JlIGNvaW5jaWRlbnQgcG9pbnRzLlxuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7XG4gICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgcG9pbnQodGhpcywgc2xvcGUyKHRoaXMsIHQxID0gc2xvcGUzKHRoaXMsIHgsIHkpKSwgdDEpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHRoaXMuX3QwLCB0MSA9IHNsb3BlMyh0aGlzLCB4LCB5KSk7IGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0geDtcbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHk7XG4gICAgdGhpcy5fdDAgPSB0MTtcbiAgfVxufVxuXG5mdW5jdGlvbiBNb25vdG9uZVkoY29udGV4dCkge1xuICB0aGlzLl9jb250ZXh0ID0gbmV3IFJlZmxlY3RDb250ZXh0KGNvbnRleHQpO1xufVxuXG4oTW9ub3RvbmVZLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTW9ub3RvbmVYLnByb3RvdHlwZSkpLnBvaW50ID0gZnVuY3Rpb24oeCwgeSkge1xuICBNb25vdG9uZVgucHJvdG90eXBlLnBvaW50LmNhbGwodGhpcywgeSwgeCk7XG59O1xuXG5mdW5jdGlvbiBSZWZsZWN0Q29udGV4dChjb250ZXh0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xufVxuXG5SZWZsZWN0Q29udGV4dC5wcm90b3R5cGUgPSB7XG4gIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkgeyB0aGlzLl9jb250ZXh0Lm1vdmVUbyh5LCB4KTsgfSxcbiAgY2xvc2VQYXRoOiBmdW5jdGlvbigpIHsgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsgfSxcbiAgbGluZVRvOiBmdW5jdGlvbih4LCB5KSB7IHRoaXMuX2NvbnRleHQubGluZVRvKHksIHgpOyB9LFxuICBiZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgeCwgeSkgeyB0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oeTEsIHgxLCB5MiwgeDIsIHksIHgpOyB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbW9ub3RvbmVYKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ldyBNb25vdG9uZVgoY29udGV4dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb25vdG9uZVkoY29udGV4dCkge1xuICByZXR1cm4gbmV3IE1vbm90b25lWShjb250ZXh0KTtcbn1cbiIsImZ1bmN0aW9uIE5hdHVyYWwoY29udGV4dCkge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbn1cblxuTmF0dXJhbC5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feCA9IFtdO1xuICAgIHRoaXMuX3kgPSBbXTtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHggPSB0aGlzLl94LFxuICAgICAgICB5ID0gdGhpcy5feSxcbiAgICAgICAgbiA9IHgubGVuZ3RoO1xuXG4gICAgaWYgKG4pIHtcbiAgICAgIHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4WzBdLCB5WzBdKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHhbMF0sIHlbMF0pO1xuICAgICAgaWYgKG4gPT09IDIpIHtcbiAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeFsxXSwgeVsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcHggPSBjb250cm9sUG9pbnRzKHgpLFxuICAgICAgICAgICAgcHkgPSBjb250cm9sUG9pbnRzKHkpO1xuICAgICAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMTsgaTEgPCBuOyArK2kwLCArK2kxKSB7XG4gICAgICAgICAgdGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHB4WzBdW2kwXSwgcHlbMF1baTBdLCBweFsxXVtpMF0sIHB5WzFdW2kwXSwgeFtpMV0sIHlbaTFdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIG4gPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgICB0aGlzLl94ID0gdGhpcy5feSA9IG51bGw7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgdGhpcy5feC5wdXNoKCt4KTtcbiAgICB0aGlzLl95LnB1c2goK3kpO1xuICB9XG59O1xuXG4vLyBTZWUgaHR0cHM6Ly93d3cucGFydGljbGVpbmNlbGwuY29tLzIwMTIvYmV6aWVyLXNwbGluZXMvIGZvciBkZXJpdmF0aW9uLlxuZnVuY3Rpb24gY29udHJvbFBvaW50cyh4KSB7XG4gIHZhciBpLFxuICAgICAgbiA9IHgubGVuZ3RoIC0gMSxcbiAgICAgIG0sXG4gICAgICBhID0gbmV3IEFycmF5KG4pLFxuICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgIHIgPSBuZXcgQXJyYXkobik7XG4gIGFbMF0gPSAwLCBiWzBdID0gMiwgclswXSA9IHhbMF0gKyAyICogeFsxXTtcbiAgZm9yIChpID0gMTsgaSA8IG4gLSAxOyArK2kpIGFbaV0gPSAxLCBiW2ldID0gNCwgcltpXSA9IDQgKiB4W2ldICsgMiAqIHhbaSArIDFdO1xuICBhW24gLSAxXSA9IDIsIGJbbiAtIDFdID0gNywgcltuIC0gMV0gPSA4ICogeFtuIC0gMV0gKyB4W25dO1xuICBmb3IgKGkgPSAxOyBpIDwgbjsgKytpKSBtID0gYVtpXSAvIGJbaSAtIDFdLCBiW2ldIC09IG0sIHJbaV0gLT0gbSAqIHJbaSAtIDFdO1xuICBhW24gLSAxXSA9IHJbbiAtIDFdIC8gYltuIC0gMV07XG4gIGZvciAoaSA9IG4gLSAyOyBpID49IDA7IC0taSkgYVtpXSA9IChyW2ldIC0gYVtpICsgMV0pIC8gYltpXTtcbiAgYltuIC0gMV0gPSAoeFtuXSArIGFbbiAtIDFdKSAvIDI7XG4gIGZvciAoaSA9IDA7IGkgPCBuIC0gMTsgKytpKSBiW2ldID0gMiAqIHhbaSArIDFdIC0gYVtpICsgMV07XG4gIHJldHVybiBbYSwgYl07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgcmV0dXJuIG5ldyBOYXR1cmFsKGNvbnRleHQpO1xufVxuIiwiZnVuY3Rpb24gU3RlcChjb250ZXh0LCB0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLl90ID0gdDtcbn1cblxuU3RlcC5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feCA9IHRoaXMuX3kgPSBOYU47XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoMCA8IHRoaXMuX3QgJiYgdGhpcy5fdCA8IDEgJiYgdGhpcy5fcG9pbnQgPT09IDIpIHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsIHRoaXMuX3kpO1xuICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBpZiAodGhpcy5fbGluZSA+PSAwKSB0aGlzLl90ID0gMSAtIHRoaXMuX3QsIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrO1xuICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IC8vIHByb2NlZWRcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKHRoaXMuX3QgPD0gMCkge1xuICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsIHkpO1xuICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB4MSA9IHRoaXMuX3ggKiAoMSAtIHRoaXMuX3QpICsgeCAqIHRoaXMuX3Q7XG4gICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeDEsIHRoaXMuX3kpO1xuICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHgxLCB5KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5feCA9IHgsIHRoaXMuX3kgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAwLjUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RlcEJlZm9yZShjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0ZXBBZnRlcihjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAxKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHtcbiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDEpKSByZXR1cm47XG4gIGZvciAodmFyIGkgPSAxLCBqLCBzMCwgczEgPSBzZXJpZXNbb3JkZXJbMF1dLCBuLCBtID0gczEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgczAgPSBzMSwgczEgPSBzZXJpZXNbb3JkZXJbaV1dO1xuICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICAgIHMxW2pdWzFdICs9IHMxW2pdWzBdID0gaXNOYU4oczBbal1bMV0pID8gczBbal1bMF0gOiBzMFtqXVsxXTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcykge1xuICB2YXIgbiA9IHNlcmllcy5sZW5ndGgsIG8gPSBuZXcgQXJyYXkobik7XG4gIHdoaWxlICgtLW4gPj0gMCkgb1tuXSA9IG47XG4gIHJldHVybiBvO1xufVxuIiwiaW1wb3J0IHtzbGljZX0gZnJvbSBcIi4vYXJyYXkuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IG9mZnNldE5vbmUgZnJvbSBcIi4vb2Zmc2V0L25vbmUuanNcIjtcbmltcG9ydCBvcmRlck5vbmUgZnJvbSBcIi4vb3JkZXIvbm9uZS5qc1wiO1xuXG5mdW5jdGlvbiBzdGFja1ZhbHVlKGQsIGtleSkge1xuICByZXR1cm4gZFtrZXldO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGtleXMgPSBjb25zdGFudChbXSksXG4gICAgICBvcmRlciA9IG9yZGVyTm9uZSxcbiAgICAgIG9mZnNldCA9IG9mZnNldE5vbmUsXG4gICAgICB2YWx1ZSA9IHN0YWNrVmFsdWU7XG5cbiAgZnVuY3Rpb24gc3RhY2soZGF0YSkge1xuICAgIHZhciBreiA9IGtleXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgaSxcbiAgICAgICAgbSA9IGRhdGEubGVuZ3RoLFxuICAgICAgICBuID0ga3oubGVuZ3RoLFxuICAgICAgICBzeiA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgb3o7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBmb3IgKHZhciBraSA9IGt6W2ldLCBzaSA9IHN6W2ldID0gbmV3IEFycmF5KG0pLCBqID0gMCwgc2lqOyBqIDwgbTsgKytqKSB7XG4gICAgICAgIHNpW2pdID0gc2lqID0gWzAsICt2YWx1ZShkYXRhW2pdLCBraSwgaiwgZGF0YSldO1xuICAgICAgICBzaWouZGF0YSA9IGRhdGFbal07XG4gICAgICB9XG4gICAgICBzaS5rZXkgPSBraTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwLCBveiA9IG9yZGVyKHN6KTsgaSA8IG47ICsraSkge1xuICAgICAgc3pbb3pbaV1dLmluZGV4ID0gaTtcbiAgICB9XG5cbiAgICBvZmZzZXQoc3osIG96KTtcbiAgICByZXR1cm4gc3o7XG4gIH1cblxuICBzdGFjay5rZXlzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGtleXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KHNsaWNlLmNhbGwoXykpLCBzdGFjaykgOiBrZXlzO1xuICB9O1xuXG4gIHN0YWNrLnZhbHVlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHN0YWNrKSA6IHZhbHVlO1xuICB9O1xuXG4gIHN0YWNrLm9yZGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9yZGVyID0gXyA9PSBudWxsID8gb3JkZXJOb25lIDogdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChzbGljZS5jYWxsKF8pKSwgc3RhY2spIDogb3JkZXI7XG4gIH07XG5cbiAgc3RhY2sub2Zmc2V0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9mZnNldCA9IF8gPT0gbnVsbCA/IG9mZnNldE5vbmUgOiBfLCBzdGFjaykgOiBvZmZzZXQ7XG4gIH07XG5cbiAgcmV0dXJuIHN0YWNrO1xufVxuIiwiaW1wb3J0IG5vbmUgZnJvbSBcIi4vbm9uZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZXJpZXMsIG9yZGVyKSB7XG4gIGlmICghKChuID0gc2VyaWVzLmxlbmd0aCkgPiAwKSkgcmV0dXJuO1xuICBmb3IgKHZhciBpLCBuLCBqID0gMCwgbSA9IHNlcmllc1swXS5sZW5ndGgsIHk7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHkgPSBpID0gMDsgaSA8IG47ICsraSkgeSArPSBzZXJpZXNbaV1bal1bMV0gfHwgMDtcbiAgICBpZiAoeSkgZm9yIChpID0gMDsgaSA8IG47ICsraSkgc2VyaWVzW2ldW2pdWzFdIC89IHk7XG4gIH1cbiAgbm9uZShzZXJpZXMsIG9yZGVyKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHtcbiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDApKSByZXR1cm47XG4gIGZvciAodmFyIGksIGogPSAwLCBkLCBkeSwgeXAsIHluLCBuLCBtID0gc2VyaWVzW29yZGVyWzBdXS5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHlwID0geW4gPSAwLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChkeSA9IChkID0gc2VyaWVzW29yZGVyW2ldXVtqXSlbMV0gLSBkWzBdKSA+IDApIHtcbiAgICAgICAgZFswXSA9IHlwLCBkWzFdID0geXAgKz0gZHk7XG4gICAgICB9IGVsc2UgaWYgKGR5IDwgMCkge1xuICAgICAgICBkWzFdID0geW4sIGRbMF0gPSB5biArPSBkeTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRbMF0gPSAwLCBkWzFdID0gZHk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgbm9uZSBmcm9tIFwiLi9ub25lLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHtcbiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDApKSByZXR1cm47XG4gIGZvciAodmFyIGogPSAwLCBzMCA9IHNlcmllc1tvcmRlclswXV0sIG4sIG0gPSBzMC5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBpID0gMCwgeSA9IDA7IGkgPCBuOyArK2kpIHkgKz0gc2VyaWVzW2ldW2pdWzFdIHx8IDA7XG4gICAgczBbal1bMV0gKz0gczBbal1bMF0gPSAteSAvIDI7XG4gIH1cbiAgbm9uZShzZXJpZXMsIG9yZGVyKTtcbn1cbiIsImltcG9ydCBub25lIGZyb20gXCIuL25vbmUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VyaWVzLCBvcmRlcikge1xuICBpZiAoISgobiA9IHNlcmllcy5sZW5ndGgpID4gMCkgfHwgISgobSA9IChzMCA9IHNlcmllc1tvcmRlclswXV0pLmxlbmd0aCkgPiAwKSkgcmV0dXJuO1xuICBmb3IgKHZhciB5ID0gMCwgaiA9IDEsIHMwLCBtLCBuOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIHMxID0gMCwgczIgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB2YXIgc2kgPSBzZXJpZXNbb3JkZXJbaV1dLFxuICAgICAgICAgIHNpajAgPSBzaVtqXVsxXSB8fCAwLFxuICAgICAgICAgIHNpajEgPSBzaVtqIC0gMV1bMV0gfHwgMCxcbiAgICAgICAgICBzMyA9IChzaWowIC0gc2lqMSkgLyAyO1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBpOyArK2spIHtcbiAgICAgICAgdmFyIHNrID0gc2VyaWVzW29yZGVyW2tdXSxcbiAgICAgICAgICAgIHNrajAgPSBza1tqXVsxXSB8fCAwLFxuICAgICAgICAgICAgc2tqMSA9IHNrW2ogLSAxXVsxXSB8fCAwO1xuICAgICAgICBzMyArPSBza2owIC0gc2tqMTtcbiAgICAgIH1cbiAgICAgIHMxICs9IHNpajAsIHMyICs9IHMzICogc2lqMDtcbiAgICB9XG4gICAgczBbaiAtIDFdWzFdICs9IHMwW2ogLSAxXVswXSA9IHk7XG4gICAgaWYgKHMxKSB5IC09IHMyIC8gczE7XG4gIH1cbiAgczBbaiAtIDFdWzFdICs9IHMwW2ogLSAxXVswXSA9IHk7XG4gIG5vbmUoc2VyaWVzLCBvcmRlcik7XG59XG4iLCJpbXBvcnQgbm9uZSBmcm9tIFwiLi9ub25lLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlcmllcykge1xuICB2YXIgcGVha3MgPSBzZXJpZXMubWFwKHBlYWspO1xuICByZXR1cm4gbm9uZShzZXJpZXMpLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gcGVha3NbYV0gLSBwZWFrc1tiXTsgfSk7XG59XG5cbmZ1bmN0aW9uIHBlYWsoc2VyaWVzKSB7XG4gIHZhciBpID0gLTEsIGogPSAwLCBuID0gc2VyaWVzLmxlbmd0aCwgdmksIHZqID0gLUluZmluaXR5O1xuICB3aGlsZSAoKytpIDwgbikgaWYgKCh2aSA9ICtzZXJpZXNbaV1bMV0pID4gdmopIHZqID0gdmksIGogPSBpO1xuICByZXR1cm4gajtcbn1cbiIsImltcG9ydCBub25lIGZyb20gXCIuL25vbmUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VyaWVzKSB7XG4gIHZhciBzdW1zID0gc2VyaWVzLm1hcChzdW0pO1xuICByZXR1cm4gbm9uZShzZXJpZXMpLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gc3Vtc1thXSAtIHN1bXNbYl07IH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3VtKHNlcmllcykge1xuICB2YXIgcyA9IDAsIGkgPSAtMSwgbiA9IHNlcmllcy5sZW5ndGgsIHY7XG4gIHdoaWxlICgrK2kgPCBuKSBpZiAodiA9ICtzZXJpZXNbaV1bMV0pIHMgKz0gdjtcbiAgcmV0dXJuIHM7XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZXJpZXMpIHtcbiAgcmV0dXJuIGFzY2VuZGluZyhzZXJpZXMpLnJldmVyc2UoKTtcbn1cbiIsImltcG9ydCBhcHBlYXJhbmNlIGZyb20gXCIuL2FwcGVhcmFuY2UuanNcIjtcbmltcG9ydCB7c3VtfSBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VyaWVzKSB7XG4gIHZhciBuID0gc2VyaWVzLmxlbmd0aCxcbiAgICAgIGksXG4gICAgICBqLFxuICAgICAgc3VtcyA9IHNlcmllcy5tYXAoc3VtKSxcbiAgICAgIG9yZGVyID0gYXBwZWFyYW5jZShzZXJpZXMpLFxuICAgICAgdG9wID0gMCxcbiAgICAgIGJvdHRvbSA9IDAsXG4gICAgICB0b3BzID0gW10sXG4gICAgICBib3R0b21zID0gW107XG5cbiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgIGogPSBvcmRlcltpXTtcbiAgICBpZiAodG9wIDwgYm90dG9tKSB7XG4gICAgICB0b3AgKz0gc3Vtc1tqXTtcbiAgICAgIHRvcHMucHVzaChqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm90dG9tICs9IHN1bXNbal07XG4gICAgICBib3R0b21zLnB1c2goaik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdHRvbXMucmV2ZXJzZSgpLmNvbmNhdCh0b3BzKTtcbn1cbiIsImltcG9ydCBub25lIGZyb20gXCIuL25vbmUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VyaWVzKSB7XG4gIHJldHVybiBub25lKHNlcmllcykucmV2ZXJzZSgpO1xufVxuIiwiZXhwb3J0IHtkZWZhdWx0IGFzIGFyY30gZnJvbSBcIi4vYXJjLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgYXJlYX0gZnJvbSBcIi4vYXJlYS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGxpbmV9IGZyb20gXCIuL2xpbmUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwaWV9IGZyb20gXCIuL3BpZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGFyZWFSYWRpYWwsIGRlZmF1bHQgYXMgcmFkaWFsQXJlYX0gZnJvbSBcIi4vYXJlYVJhZGlhbC5qc1wiOyAvLyBOb3RlOiByYWRpYWxBcmVhIGlzIGRlcHJlY2F0ZWQhXG5leHBvcnQge2RlZmF1bHQgYXMgbGluZVJhZGlhbCwgZGVmYXVsdCBhcyByYWRpYWxMaW5lfSBmcm9tIFwiLi9saW5lUmFkaWFsLmpzXCI7IC8vIE5vdGU6IHJhZGlhbExpbmUgaXMgZGVwcmVjYXRlZCFcbmV4cG9ydCB7ZGVmYXVsdCBhcyBwb2ludFJhZGlhbH0gZnJvbSBcIi4vcG9pbnRSYWRpYWwuanNcIjtcbmV4cG9ydCB7bGlua0hvcml6b250YWwsIGxpbmtWZXJ0aWNhbCwgbGlua1JhZGlhbH0gZnJvbSBcIi4vbGluay9pbmRleC5qc1wiO1xuXG5leHBvcnQge2RlZmF1bHQgYXMgc3ltYm9sLCBzeW1ib2xzfSBmcm9tIFwiLi9zeW1ib2wuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xDaXJjbGV9IGZyb20gXCIuL3N5bWJvbC9jaXJjbGUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xDcm9zc30gZnJvbSBcIi4vc3ltYm9sL2Nyb3NzLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3ltYm9sRGlhbW9uZH0gZnJvbSBcIi4vc3ltYm9sL2RpYW1vbmQuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xTcXVhcmV9IGZyb20gXCIuL3N5bWJvbC9zcXVhcmUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xTdGFyfSBmcm9tIFwiLi9zeW1ib2wvc3Rhci5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN5bWJvbFRyaWFuZ2xlfSBmcm9tIFwiLi9zeW1ib2wvdHJpYW5nbGUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzeW1ib2xXeWV9IGZyb20gXCIuL3N5bWJvbC93eWUuanNcIjtcblxuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQmFzaXNDbG9zZWR9IGZyb20gXCIuL2N1cnZlL2Jhc2lzQ2xvc2VkLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVCYXNpc09wZW59IGZyb20gXCIuL2N1cnZlL2Jhc2lzT3Blbi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQmFzaXN9IGZyb20gXCIuL2N1cnZlL2Jhc2lzLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVCdW5kbGV9IGZyb20gXCIuL2N1cnZlL2J1bmRsZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQ2FyZGluYWxDbG9zZWR9IGZyb20gXCIuL2N1cnZlL2NhcmRpbmFsQ2xvc2VkLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVDYXJkaW5hbE9wZW59IGZyb20gXCIuL2N1cnZlL2NhcmRpbmFsT3Blbi5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGN1cnZlQ2FyZGluYWx9IGZyb20gXCIuL2N1cnZlL2NhcmRpbmFsLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVDYXRtdWxsUm9tQ2xvc2VkfSBmcm9tIFwiLi9jdXJ2ZS9jYXRtdWxsUm9tQ2xvc2VkLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVDYXRtdWxsUm9tT3Blbn0gZnJvbSBcIi4vY3VydmUvY2F0bXVsbFJvbU9wZW4uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZUNhdG11bGxSb219IGZyb20gXCIuL2N1cnZlL2NhdG11bGxSb20uanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZUxpbmVhckNsb3NlZH0gZnJvbSBcIi4vY3VydmUvbGluZWFyQ2xvc2VkLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgY3VydmVMaW5lYXJ9IGZyb20gXCIuL2N1cnZlL2xpbmVhci5qc1wiO1xuZXhwb3J0IHttb25vdG9uZVggYXMgY3VydmVNb25vdG9uZVgsIG1vbm90b25lWSBhcyBjdXJ2ZU1vbm90b25lWX0gZnJvbSBcIi4vY3VydmUvbW9ub3RvbmUuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZU5hdHVyYWx9IGZyb20gXCIuL2N1cnZlL25hdHVyYWwuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBjdXJ2ZVN0ZXAsIHN0ZXBBZnRlciBhcyBjdXJ2ZVN0ZXBBZnRlciwgc3RlcEJlZm9yZSBhcyBjdXJ2ZVN0ZXBCZWZvcmV9IGZyb20gXCIuL2N1cnZlL3N0ZXAuanNcIjtcblxuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrfSBmcm9tIFwiLi9zdGFjay5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT2Zmc2V0RXhwYW5kfSBmcm9tIFwiLi9vZmZzZXQvZXhwYW5kLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RhY2tPZmZzZXREaXZlcmdpbmd9IGZyb20gXCIuL29mZnNldC9kaXZlcmdpbmcuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja09mZnNldE5vbmV9IGZyb20gXCIuL29mZnNldC9ub25lLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RhY2tPZmZzZXRTaWxob3VldHRlfSBmcm9tIFwiLi9vZmZzZXQvc2lsaG91ZXR0ZS5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT2Zmc2V0V2lnZ2xlfSBmcm9tIFwiLi9vZmZzZXQvd2lnZ2xlLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RhY2tPcmRlckFwcGVhcmFuY2V9IGZyb20gXCIuL29yZGVyL2FwcGVhcmFuY2UuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja09yZGVyQXNjZW5kaW5nfSBmcm9tIFwiLi9vcmRlci9hc2NlbmRpbmcuanNcIjtcbmV4cG9ydCB7ZGVmYXVsdCBhcyBzdGFja09yZGVyRGVzY2VuZGluZ30gZnJvbSBcIi4vb3JkZXIvZGVzY2VuZGluZy5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT3JkZXJJbnNpZGVPdXR9IGZyb20gXCIuL29yZGVyL2luc2lkZU91dC5qc1wiO1xuZXhwb3J0IHtkZWZhdWx0IGFzIHN0YWNrT3JkZXJOb25lfSBmcm9tIFwiLi9vcmRlci9ub25lLmpzXCI7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RhY2tPcmRlclJldmVyc2V9IGZyb20gXCIuL29yZGVyL3JldmVyc2UuanNcIjtcbiIsImltcG9ydCBfYXNzaWduIGZyb20gXCJsb2Rhc2gvYXNzaWduXCI7XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuLyplc2xpbnQgbm8tbWFnaWMtbnVtYmVyczogW1wiZXJyb3JcIiwgeyBcImlnbm9yZVwiOiBbLTEsIDAsIDEsIDJdIH1dKi9cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCAqIGFzIGQzU2hhcGUgZnJvbSBcImQzLXNoYXBlXCI7XG5pbXBvcnQgeyBIZWxwZXJzLCBDb21tb25Qcm9wcywgUGF0aCB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcblxudmFyIGRlZmluZWQgPSBmdW5jdGlvbiAoZCkge1xuICB2YXIgeSA9IGQuX3kxICE9PSB1bmRlZmluZWQgPyBkLl95MSA6IGQuX3k7XG4gIHJldHVybiB5ICE9PSBudWxsICYmIHkgIT09IHVuZGVmaW5lZCAmJiBkLl95MCAhPT0gbnVsbDtcbn07XG5cbnZhciBnZXRYQWNjZXNzb3IgPSBmdW5jdGlvbiAoc2NhbGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChkKSB7XG4gICAgcmV0dXJuIHNjYWxlLngoZC5feDEgIT09IHVuZGVmaW5lZCA/IGQuX3gxIDogZC5feCk7XG4gIH07XG59O1xuXG52YXIgZ2V0WUFjY2Vzc29yID0gZnVuY3Rpb24gKHNjYWxlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZCkge1xuICAgIHJldHVybiBzY2FsZS55KGQuX3kxICE9PSB1bmRlZmluZWQgPyBkLl95MSA6IGQuX3kpO1xuICB9O1xufTtcblxudmFyIGdldFkwQWNjZXNzb3IgPSBmdW5jdGlvbiAoc2NhbGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChkKSB7XG4gICAgcmV0dXJuIHNjYWxlLnkoZC5feTApO1xuICB9O1xufTtcblxudmFyIGdldEFuZ2xlQWNjZXNzb3IgPSBmdW5jdGlvbiAoc2NhbGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChkKSB7XG4gICAgdmFyIHggPSBzY2FsZS54KGQuX3gxICE9PSB1bmRlZmluZWQgPyBkLl94MSA6IGQuX3gpO1xuICAgIHJldHVybiAtMSAqIHggKyBNYXRoLlBJIC8gMjtcbiAgfTtcbn07XG5cbnZhciB0b05ld05hbWUgPSBmdW5jdGlvbiAoaW50ZXJwb2xhdGlvbikge1xuICAvLyBkMyBzaGFwZSBjaGFuZ2VkIHRoZSBuYW1pbmcgc2NoZW1lIGZvciBpbnRlcnBvbGF0b3JzIGZyb20gXCJiYXNpc1wiIC0+IFwiY3VydmVCYXNpc1wiIGV0Yy5cbiAgdmFyIGNhcGl0YWxpemUgPSBmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBzICYmIHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSk7XG4gIH07XG5cbiAgcmV0dXJuIFwiY3VydmVcIi5jb25jYXQoY2FwaXRhbGl6ZShpbnRlcnBvbGF0aW9uKSk7XG59O1xuXG52YXIgZ2V0TGluZUZ1bmN0aW9uID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciBwb2xhciA9IHByb3BzLnBvbGFyLFxuICAgICAgc2NhbGUgPSBwcm9wcy5zY2FsZSxcbiAgICAgIGhvcml6b250YWwgPSBwcm9wcy5ob3Jpem9udGFsO1xuICB2YXIgaW50ZXJwb2xhdGlvbkZ1bmN0aW9uID0gdHlwZW9mIHByb3BzLmludGVycG9sYXRpb24gPT09IFwiZnVuY3Rpb25cIiAmJiBwcm9wcy5pbnRlcnBvbGF0aW9uO1xuICB2YXIgaW50ZXJwb2xhdGlvbk5hbWUgPSB0eXBlb2YgcHJvcHMuaW50ZXJwb2xhdGlvbiA9PT0gXCJzdHJpbmdcIiAmJiB0b05ld05hbWUocHJvcHMuaW50ZXJwb2xhdGlvbik7XG4gIHJldHVybiBwb2xhciA/IGQzU2hhcGUubGluZVJhZGlhbCgpLmRlZmluZWQoZGVmaW5lZCkuY3VydmUoaW50ZXJwb2xhdGlvbkZ1bmN0aW9uIHx8IGQzU2hhcGVbXCJcIi5jb25jYXQoaW50ZXJwb2xhdGlvbk5hbWUsIFwiQ2xvc2VkXCIpXSkuYW5nbGUoZ2V0QW5nbGVBY2Nlc3NvcihzY2FsZSkpLnJhZGl1cyhnZXRZQWNjZXNzb3Ioc2NhbGUpKSA6IGQzU2hhcGUubGluZSgpLmRlZmluZWQoZGVmaW5lZCkuY3VydmUoaW50ZXJwb2xhdGlvbkZ1bmN0aW9uIHx8IGQzU2hhcGVbaW50ZXJwb2xhdGlvbk5hbWVdKS54KGhvcml6b250YWwgPyBnZXRZQWNjZXNzb3Ioc2NhbGUpIDogZ2V0WEFjY2Vzc29yKHNjYWxlKSkueShob3Jpem9udGFsID8gZ2V0WEFjY2Vzc29yKHNjYWxlKSA6IGdldFlBY2Nlc3NvcihzY2FsZSkpO1xufTtcblxudmFyIGdldENhcnRlc2lhbkFyZWEgPSBmdW5jdGlvbiAocHJvcHMsIGludGVycG9sYXRpb24pIHtcbiAgdmFyIGhvcml6b250YWwgPSBwcm9wcy5ob3Jpem9udGFsLFxuICAgICAgc2NhbGUgPSBwcm9wcy5zY2FsZTtcbiAgdmFyIGludGVycG9sYXRpb25GdW5jdGlvbiA9IHR5cGVvZiBpbnRlcnBvbGF0aW9uID09PSBcImZ1bmN0aW9uXCIgJiYgaW50ZXJwb2xhdGlvbjtcbiAgdmFyIGludGVycG9sYXRpb25OYW1lID0gdHlwZW9mIGludGVycG9sYXRpb24gPT09IFwic3RyaW5nXCIgJiYgaW50ZXJwb2xhdGlvbjtcbiAgcmV0dXJuIGhvcml6b250YWwgPyBkM1NoYXBlLmFyZWEoKS5kZWZpbmVkKGRlZmluZWQpLmN1cnZlKGludGVycG9sYXRpb25GdW5jdGlvbiB8fCBkM1NoYXBlW2ludGVycG9sYXRpb25OYW1lXSkueDAoZ2V0WTBBY2Nlc3NvcihzY2FsZSkpLngxKGdldFlBY2Nlc3NvcihzY2FsZSkpLnkoZ2V0WEFjY2Vzc29yKHNjYWxlKSkgOiBkM1NoYXBlLmFyZWEoKS5kZWZpbmVkKGRlZmluZWQpLmN1cnZlKGludGVycG9sYXRpb25GdW5jdGlvbiB8fCBkM1NoYXBlW2ludGVycG9sYXRpb25OYW1lXSkueChnZXRYQWNjZXNzb3Ioc2NhbGUpKS55MShnZXRZQWNjZXNzb3Ioc2NhbGUpKS55MChnZXRZMEFjY2Vzc29yKHNjYWxlKSk7XG59O1xuXG52YXIgZ2V0QXJlYUZ1bmN0aW9uID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciBwb2xhciA9IHByb3BzLnBvbGFyLFxuICAgICAgc2NhbGUgPSBwcm9wcy5zY2FsZTtcbiAgdmFyIGludGVycG9sYXRpb25GdW5jdGlvbiA9IHR5cGVvZiBwcm9wcy5pbnRlcnBvbGF0aW9uID09PSBcImZ1bmN0aW9uXCIgJiYgcHJvcHMuaW50ZXJwb2xhdGlvbjtcbiAgdmFyIGludGVycG9sYXRpb25OYW1lID0gdHlwZW9mIHByb3BzLmludGVycG9sYXRpb24gPT09IFwic3RyaW5nXCIgJiYgdG9OZXdOYW1lKHByb3BzLmludGVycG9sYXRpb24pO1xuICB2YXIgaW50ZXJwb2xhdGlvbiA9IGludGVycG9sYXRpb25GdW5jdGlvbiB8fCBpbnRlcnBvbGF0aW9uTmFtZTtcbiAgcmV0dXJuIHBvbGFyID8gZDNTaGFwZS5yYWRpYWxBcmVhKCkuZGVmaW5lZChkZWZpbmVkKS5jdXJ2ZShpbnRlcnBvbGF0aW9uRnVuY3Rpb24gfHwgZDNTaGFwZVtcIlwiLmNvbmNhdChpbnRlcnBvbGF0aW9uTmFtZSwgXCJDbG9zZWRcIildKS5hbmdsZShnZXRBbmdsZUFjY2Vzc29yKHNjYWxlKSkub3V0ZXJSYWRpdXMoZ2V0WUFjY2Vzc29yKHNjYWxlKSkuaW5uZXJSYWRpdXMoZ2V0WTBBY2Nlc3NvcihzY2FsZSkpIDogZ2V0Q2FydGVzaWFuQXJlYShwcm9wcywgaW50ZXJwb2xhdGlvbik7XG59O1xuXG52YXIgZXZhbHVhdGVQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAvKipcbiAgICogUG90ZW50aWFsIGV2YWx1YXRlZCBwcm9wcyBhcmU6XG4gICAqIGBhcmlhTGFiZWxgXG4gICAqIGBkZXNjYFxuICAgKiBgaWRgXG4gICAqIGBzdHlsZWBcbiAgICogYHRhYkluZGV4YFxuICAgKi9cbiAgdmFyIGFyaWFMYWJlbCA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmFyaWFMYWJlbCwgcHJvcHMpO1xuICB2YXIgZGVzYyA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmRlc2MsIHByb3BzKTtcbiAgdmFyIGlkID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuaWQsIHByb3BzKTtcbiAgdmFyIHN0eWxlID0gSGVscGVycy5ldmFsdWF0ZVN0eWxlKF9hc3NpZ24oe1xuICAgIGZpbGw6IFwiYmxhY2tcIlxuICB9LCBwcm9wcy5zdHlsZSksIHByb3BzKTtcbiAgdmFyIHRhYkluZGV4ID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMudGFiSW5kZXgsIHByb3BzKTtcbiAgcmV0dXJuIF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgYXJpYUxhYmVsOiBhcmlhTGFiZWwsXG4gICAgZGVzYzogZGVzYyxcbiAgICBpZDogaWQsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleFxuICB9KTtcbn07XG5cbnZhciBBcmVhID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHByb3BzID0gZXZhbHVhdGVQcm9wcyhwcm9wcyk7XG4gIHZhciBfcHJvcHMgPSBwcm9wcyxcbiAgICAgIGFyaWFMYWJlbCA9IF9wcm9wcy5hcmlhTGFiZWwsXG4gICAgICByb2xlID0gX3Byb3BzLnJvbGUsXG4gICAgICBzaGFwZVJlbmRlcmluZyA9IF9wcm9wcy5zaGFwZVJlbmRlcmluZyxcbiAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICBwb2xhciA9IF9wcm9wcy5wb2xhcixcbiAgICAgIG9yaWdpbiA9IF9wcm9wcy5vcmlnaW4sXG4gICAgICBkYXRhID0gX3Byb3BzLmRhdGEsXG4gICAgICBwYXRoQ29tcG9uZW50ID0gX3Byb3BzLnBhdGhDb21wb25lbnQsXG4gICAgICBldmVudHMgPSBfcHJvcHMuZXZlbnRzLFxuICAgICAgZ3JvdXBDb21wb25lbnQgPSBfcHJvcHMuZ3JvdXBDb21wb25lbnQsXG4gICAgICBjbGlwUGF0aCA9IF9wcm9wcy5jbGlwUGF0aCxcbiAgICAgIGlkID0gX3Byb3BzLmlkLFxuICAgICAgc3R5bGUgPSBfcHJvcHMuc3R5bGUsXG4gICAgICBkZXNjID0gX3Byb3BzLmRlc2MsXG4gICAgICB0YWJJbmRleCA9IF9wcm9wcy50YWJJbmRleDtcbiAgdmFyIGRlZmF1bHRUcmFuc2Zvcm0gPSBwb2xhciAmJiBvcmlnaW4gPyBcInRyYW5zbGF0ZShcIi5jb25jYXQob3JpZ2luLngsIFwiLCBcIikuY29uY2F0KG9yaWdpbi55LCBcIilcIikgOiB1bmRlZmluZWQ7XG4gIHZhciB0cmFuc2Zvcm0gPSBwcm9wcy50cmFuc2Zvcm0gfHwgZGVmYXVsdFRyYW5zZm9ybTtcbiAgdmFyIHJlbmRlckxpbmUgPSBzdHlsZS5zdHJva2UgJiYgc3R5bGUuc3Ryb2tlICE9PSBcIm5vbmVcIiAmJiBzdHlsZS5zdHJva2UgIT09IFwidHJhbnNwYXJlbnRcIjtcbiAgdmFyIGFyZWFGdW5jdGlvbiA9IGdldEFyZWFGdW5jdGlvbihwcm9wcyk7XG4gIHZhciBsaW5lRnVuY3Rpb24gPSByZW5kZXJMaW5lICYmIGdldExpbmVGdW5jdGlvbihwcm9wcyk7XG4gIHZhciBhcmVhU3Ryb2tlID0gc3R5bGUuc3Ryb2tlID8gXCJub25lXCIgOiBzdHlsZS5maWxsO1xuXG4gIHZhciBzaGFyZWRQcm9wcyA9IF9vYmplY3RTcHJlYWQoe1xuICAgIFwiYXJpYS1sYWJlbFwiOiBhcmlhTGFiZWwsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgcm9sZTogcm9sZSxcbiAgICBzaGFwZVJlbmRlcmluZzogc2hhcGVSZW5kZXJpbmcsXG4gICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1cbiAgfSwgZXZlbnRzLCB7XG4gICAgY2xpcFBhdGg6IGNsaXBQYXRoLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleFxuICB9KTtcblxuICB2YXIgYXJlYSA9IFJlYWN0LmNsb25lRWxlbWVudChwYXRoQ29tcG9uZW50LCBfYXNzaWduKHtcbiAgICBrZXk6IFwiXCIuY29uY2F0KGlkLCBcIi1hcmVhXCIpLFxuICAgIHN0eWxlOiBfYXNzaWduKHt9LCBzdHlsZSwge1xuICAgICAgc3Ryb2tlOiBhcmVhU3Ryb2tlXG4gICAgfSksXG4gICAgZDogYXJlYUZ1bmN0aW9uKGRhdGEpLFxuICAgIGRlc2M6IGRlc2MsXG4gICAgdGFiSW5kZXg6IHRhYkluZGV4XG4gIH0sIHNoYXJlZFByb3BzKSk7XG4gIHZhciBsaW5lID0gcmVuZGVyTGluZSA/IFJlYWN0LmNsb25lRWxlbWVudChwYXRoQ29tcG9uZW50LCBfYXNzaWduKHtcbiAgICBrZXk6IFwiXCIuY29uY2F0KGlkLCBcIi1hcmVhLXN0cm9rZVwiKSxcbiAgICBzdHlsZTogX2Fzc2lnbih7fSwgc3R5bGUsIHtcbiAgICAgIGZpbGw6IFwibm9uZVwiXG4gICAgfSksXG4gICAgZDogbGluZUZ1bmN0aW9uKGRhdGEpXG4gIH0sIHNoYXJlZFByb3BzKSkgOiBudWxsO1xuICByZXR1cm4gcmVuZGVyTGluZSA/IFJlYWN0LmNsb25lRWxlbWVudChncm91cENvbXBvbmVudCwge30sIFthcmVhLCBsaW5lXSkgOiBhcmVhO1xufTtcblxuQXJlYS5wcm9wVHlwZXMgPSBfb2JqZWN0U3ByZWFkKHt9LCBDb21tb25Qcm9wcy5wcmltaXRpdmVQcm9wcywge1xuICBncm91cENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gIGludGVycG9sYXRpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gIHBhdGhDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50XG59KTtcbkFyZWEuZGVmYXVsdFByb3BzID0ge1xuICBncm91cENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwgbnVsbCksXG4gIHBhdGhDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUGF0aCwgbnVsbCksXG4gIHJvbGU6IFwicHJlc2VudGF0aW9uXCIsXG4gIHNoYXBlUmVuZGVyaW5nOiBcImF1dG9cIlxufTtcbmV4cG9ydCBkZWZhdWx0IEFyZWE7IiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuXG52YXIgQ2xpcFBhdGggPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIsIG51bGwsIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjbGlwUGF0aFwiLCB7XG4gICAgaWQ6IHByb3BzLmNsaXBJZFxuICB9LCBwcm9wcy5jaGlsZHJlbikpO1xufTtcblxuQ2xpcFBhdGgucHJvcFR5cGVzID0ge1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm5vZGUpLCBQcm9wVHlwZXMubm9kZV0pLFxuICBjbGlwSWQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKVxufTtcbmV4cG9ydCBkZWZhdWx0IENsaXBQYXRoOyIsImltcG9ydCBfdW5pcXVlSWQgZnJvbSBcImxvZGFzaC91bmlxdWVJZFwiO1xuaW1wb3J0IF9pc09iamVjdCBmcm9tIFwibG9kYXNoL2lzT2JqZWN0XCI7XG5pbXBvcnQgX2RlZmF1bHRzIGZyb20gXCJsb2Rhc2gvZGVmYXVsdHNcIjtcbmltcG9ydCBfYXNzaWduIGZyb20gXCJsb2Rhc2gvYXNzaWduXCI7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgKiBhcyBDdXN0b21Qcm9wVHlwZXMgZnJvbSBcIi4uL3ZpY3RvcnktdXRpbC9wcm9wLXR5cGVzXCI7XG5pbXBvcnQgKiBhcyBIZWxwZXJzIGZyb20gXCIuLi92aWN0b3J5LXV0aWwvaGVscGVyc1wiO1xuaW1wb3J0IENsaXBQYXRoIGZyb20gXCIuLi92aWN0b3J5LXByaW1pdGl2ZXMvY2xpcC1wYXRoXCI7XG5pbXBvcnQgQ2lyY2xlIGZyb20gXCIuLi92aWN0b3J5LXByaW1pdGl2ZXMvY2lyY2xlXCI7XG5pbXBvcnQgUmVjdCBmcm9tIFwiLi4vdmljdG9yeS1wcmltaXRpdmVzL3JlY3RcIjtcblxudmFyIFZpY3RvcnlDbGlwQ29udGFpbmVyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhWaWN0b3J5Q2xpcENvbnRhaW5lciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gVmljdG9yeUNsaXBDb250YWluZXIocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmljdG9yeUNsaXBDb250YWluZXIpO1xuXG4gICAgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoVmljdG9yeUNsaXBDb250YWluZXIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihWaWN0b3J5Q2xpcENvbnRhaW5lcikpLmNhbGwodGhpcywgcHJvcHMpKTtcbiAgICBfdGhpcy5jbGlwSWQgPSAhX2lzT2JqZWN0KHByb3BzKSB8fCBwcm9wcy5jbGlwSWQgPT09IHVuZGVmaW5lZCA/IF91bmlxdWVJZChcInZpY3RvcnktY2xpcC1cIikgOiBwcm9wcy5jbGlwSWQ7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFZpY3RvcnlDbGlwQ29udGFpbmVyLCBbe1xuICAgIGtleTogXCJjYWxjdWxhdGVBdHRyaWJ1dGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhbGN1bGF0ZUF0dHJpYnV0ZXMocHJvcHMpIHtcbiAgICAgIHZhciBwb2xhciA9IHByb3BzLnBvbGFyLFxuICAgICAgICAgIG9yaWdpbiA9IHByb3BzLm9yaWdpbixcbiAgICAgICAgICBfcHJvcHMkY2xpcFdpZHRoID0gcHJvcHMuY2xpcFdpZHRoLFxuICAgICAgICAgIGNsaXBXaWR0aCA9IF9wcm9wcyRjbGlwV2lkdGggPT09IHZvaWQgMCA/IDAgOiBfcHJvcHMkY2xpcFdpZHRoLFxuICAgICAgICAgIF9wcm9wcyRjbGlwSGVpZ2h0ID0gcHJvcHMuY2xpcEhlaWdodCxcbiAgICAgICAgICBjbGlwSGVpZ2h0ID0gX3Byb3BzJGNsaXBIZWlnaHQgPT09IHZvaWQgMCA/IDAgOiBfcHJvcHMkY2xpcEhlaWdodCxcbiAgICAgICAgICBfcHJvcHMkdHJhbnNsYXRlWCA9IHByb3BzLnRyYW5zbGF0ZVgsXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IF9wcm9wcyR0cmFuc2xhdGVYID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJHRyYW5zbGF0ZVgsXG4gICAgICAgICAgX3Byb3BzJHRyYW5zbGF0ZVkgPSBwcm9wcy50cmFuc2xhdGVZLFxuICAgICAgICAgIHRyYW5zbGF0ZVkgPSBfcHJvcHMkdHJhbnNsYXRlWSA9PT0gdm9pZCAwID8gMCA6IF9wcm9wcyR0cmFuc2xhdGVZO1xuICAgICAgdmFyIGNsaXBQYWRkaW5nID0gSGVscGVycy5nZXRQYWRkaW5nKHtcbiAgICAgICAgcGFkZGluZzogcHJvcHMuY2xpcFBhZGRpbmdcbiAgICAgIH0pO1xuICAgICAgdmFyIHJhZGl1cyA9IHByb3BzLnJhZGl1cyB8fCBIZWxwZXJzLmdldFJhZGl1cyhwcm9wcyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiAocG9sYXIgPyBvcmlnaW4ueCA6IHRyYW5zbGF0ZVgpIC0gY2xpcFBhZGRpbmcubGVmdCxcbiAgICAgICAgeTogKHBvbGFyID8gb3JpZ2luLnkgOiB0cmFuc2xhdGVZKSAtIGNsaXBQYWRkaW5nLnRvcCxcbiAgICAgICAgd2lkdGg6IE1hdGgubWF4KChwb2xhciA/IHJhZGl1cyA6IGNsaXBXaWR0aCkgKyBjbGlwUGFkZGluZy5sZWZ0ICsgY2xpcFBhZGRpbmcucmlnaHQsIDApLFxuICAgICAgICBoZWlnaHQ6IE1hdGgubWF4KChwb2xhciA/IHJhZGl1cyA6IGNsaXBIZWlnaHQpICsgY2xpcFBhZGRpbmcudG9wICsgY2xpcFBhZGRpbmcuYm90dG9tLCAwKVxuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyQ2xpcHBlZEdyb3VwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckNsaXBwZWRHcm91cChwcm9wcywgY2xpcElkKSB7XG4gICAgICB2YXIgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgICAgICBldmVudHMgPSBwcm9wcy5ldmVudHMsXG4gICAgICAgICAgdHJhbnNmb3JtID0gcHJvcHMudHJhbnNmb3JtLFxuICAgICAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICAgIGdyb3VwQ29tcG9uZW50ID0gcHJvcHMuZ3JvdXBDb21wb25lbnQsXG4gICAgICAgICAgdGFiSW5kZXggPSBwcm9wcy50YWJJbmRleDtcbiAgICAgIHZhciBjbGlwQ29tcG9uZW50ID0gdGhpcy5yZW5kZXJDbGlwQ29tcG9uZW50KHByb3BzLCBjbGlwSWQpO1xuXG4gICAgICB2YXIgZ3JvdXBQcm9wcyA9IF9hc3NpZ24oe1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybSxcbiAgICAgICAga2V5OiBcImNsaXBwZWQtZ3JvdXAtXCIuY29uY2F0KGNsaXBJZCksXG4gICAgICAgIGNsaXBQYXRoOiBcInVybCgjXCIuY29uY2F0KGNsaXBJZCwgXCIpXCIpXG4gICAgICB9LCBldmVudHMpO1xuXG4gICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGdyb3VwQ29tcG9uZW50LCBfb2JqZWN0U3ByZWFkKHt9LCBncm91cFByb3BzLCB7XG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBwcm9wc1tcImFyaWEtbGFiZWxcIl0sXG4gICAgICAgIHRhYkluZGV4OiB0YWJJbmRleFxuICAgICAgfSksIFtjbGlwQ29tcG9uZW50XS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pKSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJHcm91cFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJHcm91cChwcm9wcykge1xuICAgICAgdmFyIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICAgICAgZXZlbnRzID0gcHJvcHMuZXZlbnRzLFxuICAgICAgICAgIHRyYW5zZm9ybSA9IHByb3BzLnRyYW5zZm9ybSxcbiAgICAgICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgICBncm91cENvbXBvbmVudCA9IHByb3BzLmdyb3VwQ29tcG9uZW50LFxuICAgICAgICAgIHRhYkluZGV4ID0gcHJvcHMudGFiSW5kZXg7XG4gICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGdyb3VwQ29tcG9uZW50LCBfYXNzaWduKHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBwcm9wc1tcImFyaWEtbGFiZWxcIl0sXG4gICAgICAgIHRhYkluZGV4OiB0YWJJbmRleFxuICAgICAgfSwgZXZlbnRzKSwgY2hpbGRyZW4pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJDbGlwQ29tcG9uZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckNsaXBDb21wb25lbnQocHJvcHMsIGNsaXBJZCkge1xuICAgICAgdmFyIHBvbGFyID0gcHJvcHMucG9sYXIsXG4gICAgICAgICAgb3JpZ2luID0gcHJvcHMub3JpZ2luLFxuICAgICAgICAgIF9wcm9wcyRjbGlwV2lkdGgyID0gcHJvcHMuY2xpcFdpZHRoLFxuICAgICAgICAgIGNsaXBXaWR0aCA9IF9wcm9wcyRjbGlwV2lkdGgyID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJGNsaXBXaWR0aDIsXG4gICAgICAgICAgX3Byb3BzJGNsaXBIZWlnaHQyID0gcHJvcHMuY2xpcEhlaWdodCxcbiAgICAgICAgICBjbGlwSGVpZ2h0ID0gX3Byb3BzJGNsaXBIZWlnaHQyID09PSB2b2lkIDAgPyAwIDogX3Byb3BzJGNsaXBIZWlnaHQyLFxuICAgICAgICAgIF9wcm9wcyR0cmFuc2xhdGVYMiA9IHByb3BzLnRyYW5zbGF0ZVgsXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IF9wcm9wcyR0cmFuc2xhdGVYMiA9PT0gdm9pZCAwID8gMCA6IF9wcm9wcyR0cmFuc2xhdGVYMixcbiAgICAgICAgICBfcHJvcHMkdHJhbnNsYXRlWTIgPSBwcm9wcy50cmFuc2xhdGVZLFxuICAgICAgICAgIHRyYW5zbGF0ZVkgPSBfcHJvcHMkdHJhbnNsYXRlWTIgPT09IHZvaWQgMCA/IDAgOiBfcHJvcHMkdHJhbnNsYXRlWTIsXG4gICAgICAgICAgY2lyY2xlQ29tcG9uZW50ID0gcHJvcHMuY2lyY2xlQ29tcG9uZW50LFxuICAgICAgICAgIHJlY3RDb21wb25lbnQgPSBwcm9wcy5yZWN0Q29tcG9uZW50LFxuICAgICAgICAgIGNsaXBQYXRoQ29tcG9uZW50ID0gcHJvcHMuY2xpcFBhdGhDb21wb25lbnQ7XG5cbiAgICAgIHZhciBfSGVscGVycyRnZXRQYWRkaW5nID0gSGVscGVycy5nZXRQYWRkaW5nKHtcbiAgICAgICAgcGFkZGluZzogcHJvcHMuY2xpcFBhZGRpbmdcbiAgICAgIH0pLFxuICAgICAgICAgIHRvcCA9IF9IZWxwZXJzJGdldFBhZGRpbmcudG9wLFxuICAgICAgICAgIGJvdHRvbSA9IF9IZWxwZXJzJGdldFBhZGRpbmcuYm90dG9tLFxuICAgICAgICAgIGxlZnQgPSBfSGVscGVycyRnZXRQYWRkaW5nLmxlZnQsXG4gICAgICAgICAgcmlnaHQgPSBfSGVscGVycyRnZXRQYWRkaW5nLnJpZ2h0O1xuXG4gICAgICB2YXIgY2hpbGQ7XG5cbiAgICAgIGlmIChwb2xhcikge1xuICAgICAgICB2YXIgcmFkaXVzID0gcHJvcHMucmFkaXVzIHx8IEhlbHBlcnMuZ2V0UmFkaXVzKHByb3BzKTtcbiAgICAgICAgdmFyIGNpcmNsZVByb3BzID0ge1xuICAgICAgICAgIHI6IE1hdGgubWF4KHJhZGl1cyArIGxlZnQgKyByaWdodCwgcmFkaXVzICsgdG9wICsgYm90dG9tLCAwKSxcbiAgICAgICAgICBjeDogb3JpZ2luLnggLSBsZWZ0LFxuICAgICAgICAgIGN5OiBvcmlnaW4ueSAtIHRvcFxuICAgICAgICB9O1xuICAgICAgICBjaGlsZCA9IFJlYWN0LmNsb25lRWxlbWVudChjaXJjbGVDb21wb25lbnQsIGNpcmNsZVByb3BzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZWN0UHJvcHMgPSB7XG4gICAgICAgICAgeDogdHJhbnNsYXRlWCAtIGxlZnQsXG4gICAgICAgICAgeTogdHJhbnNsYXRlWSAtIHRvcCxcbiAgICAgICAgICB3aWR0aDogTWF0aC5tYXgoY2xpcFdpZHRoICsgbGVmdCArIHJpZ2h0LCAwKSxcbiAgICAgICAgICBoZWlnaHQ6IE1hdGgubWF4KGNsaXBIZWlnaHQgKyB0b3AgKyBib3R0b20sIDApXG4gICAgICAgIH07XG4gICAgICAgIGNoaWxkID0gUmVhY3QuY2xvbmVFbGVtZW50KHJlY3RDb21wb25lbnQsIHJlY3RQcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY2xpcFBhdGhDb21wb25lbnQsIF9hc3NpZ24oe1xuICAgICAgICBrZXk6IFwiY2xpcC1wYXRoLVwiLmNvbmNhdChjbGlwSWQpXG4gICAgICB9LCBwcm9wcywge1xuICAgICAgICBjbGlwSWQ6IGNsaXBJZFxuICAgICAgfSksIGNoaWxkKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2xpcFZhbHVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENsaXBWYWx1ZShwcm9wcywgYXhpcykge1xuICAgICAgdmFyIGNsaXBWYWx1ZXMgPSB7XG4gICAgICAgIHg6IHByb3BzLmNsaXBXaWR0aCxcbiAgICAgICAgeTogcHJvcHMuY2xpcEhlaWdodFxuICAgICAgfTtcblxuICAgICAgaWYgKGNsaXBWYWx1ZXNbYXhpc10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gY2xpcFZhbHVlc1theGlzXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJhbmdlID0gSGVscGVycy5nZXRSYW5nZShwcm9wcywgYXhpcyk7XG4gICAgICByZXR1cm4gcmFuZ2UgPyBNYXRoLmFicyhyYW5nZVswXSAtIHJhbmdlWzFdKSB8fCB1bmRlZmluZWQgOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFRyYW5zbGF0ZVZhbHVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRyYW5zbGF0ZVZhbHVlKHByb3BzLCBheGlzKSB7XG4gICAgICB2YXIgdHJhbnNsYXRlVmFsdWVzID0ge1xuICAgICAgICB4OiBwcm9wcy50cmFuc2xhdGVYLFxuICAgICAgICB5OiBwcm9wcy50cmFuc2xhdGVZXG4gICAgICB9O1xuXG4gICAgICBpZiAodHJhbnNsYXRlVmFsdWVzW2F4aXNdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVZhbHVlc1theGlzXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJhbmdlID0gSGVscGVycy5nZXRSYW5nZShwcm9wcywgYXhpcyk7XG4gICAgICByZXR1cm4gcmFuZ2UgPyBNYXRoLm1pbi5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkocmFuZ2UpKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBjbGlwSGVpZ2h0ID0gdGhpcy5nZXRDbGlwVmFsdWUodGhpcy5wcm9wcywgXCJ5XCIpO1xuICAgICAgdmFyIGNsaXBXaWR0aCA9IHRoaXMuZ2V0Q2xpcFZhbHVlKHRoaXMucHJvcHMsIFwieFwiKTtcblxuICAgICAgaWYgKGNsaXBXaWR0aCA9PT0gdW5kZWZpbmVkIHx8IGNsaXBIZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJHcm91cCh0aGlzLnByb3BzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHRyYW5zbGF0ZVggPSB0aGlzLmdldFRyYW5zbGF0ZVZhbHVlKHRoaXMucHJvcHMsIFwieFwiKTtcbiAgICAgIHZhciB0cmFuc2xhdGVZID0gdGhpcy5nZXRUcmFuc2xhdGVWYWx1ZSh0aGlzLnByb3BzLCBcInlcIik7XG5cbiAgICAgIHZhciBjbGlwUHJvcHMgPSBfZGVmYXVsdHMoe30sIHRoaXMucHJvcHMsIHtcbiAgICAgICAgY2xpcEhlaWdodDogY2xpcEhlaWdodCxcbiAgICAgICAgY2xpcFdpZHRoOiBjbGlwV2lkdGgsXG4gICAgICAgIHRyYW5zbGF0ZVg6IHRyYW5zbGF0ZVgsXG4gICAgICAgIHRyYW5zbGF0ZVk6IHRyYW5zbGF0ZVlcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJDbGlwcGVkR3JvdXAoY2xpcFByb3BzLCB0aGlzLmNsaXBJZCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFZpY3RvcnlDbGlwQ29udGFpbmVyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUNsaXBDb250YWluZXIsIFwiZGlzcGxheU5hbWVcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogXCJWaWN0b3J5Q2xpcENvbnRhaW5lclwiXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5Q2xpcENvbnRhaW5lciwgXCJyb2xlXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFwiY29udGFpbmVyXCJcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlDbGlwQ29udGFpbmVyLCBcInByb3BUeXBlc1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiB7XG4gICAgXCJhcmlhLWxhYmVsXCI6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5ub2RlKSwgUHJvcFR5cGVzLm5vZGVdKSxcbiAgICBjaXJjbGVDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICAgIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjbGlwSGVpZ2h0OiBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmUsXG4gICAgY2xpcElkOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gICAgY2xpcFBhZGRpbmc6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICB0b3A6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICBib3R0b206IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICBsZWZ0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgcmlnaHQ6IFByb3BUeXBlcy5udW1iZXJcbiAgICB9KSxcbiAgICBjbGlwUGF0aENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gICAgY2xpcFdpZHRoOiBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmUsXG4gICAgZXZlbnRzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGdyb3VwQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgICBvcmlnaW46IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICB4OiBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmUsXG4gICAgICB5OiBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmVcbiAgICB9KSxcbiAgICBwb2xhcjogUHJvcFR5cGVzLmJvb2wsXG4gICAgcmFkaXVzOiBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmUsXG4gICAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgdGFiSW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgdHJhbnNmb3JtOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHRyYW5zbGF0ZVg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgdHJhbnNsYXRlWTogUHJvcFR5cGVzLm51bWJlclxuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5Q2xpcENvbnRhaW5lciwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZToge1xuICAgIGNpcmNsZUNvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChDaXJjbGUsIG51bGwpLFxuICAgIHJlY3RDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVjdCwgbnVsbCksXG4gICAgY2xpcFBhdGhDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xpcFBhdGgsIG51bGwpLFxuICAgIGdyb3VwQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCBudWxsKVxuICB9XG59KTtcbmV4cG9ydCB7IFZpY3RvcnlDbGlwQ29udGFpbmVyIGFzIGRlZmF1bHQgfTsiLCIvKiBlc2xpbnQtZGlzYWJsZSBmdW5jLXN0eWxlICovXG5leHBvcnQgZnVuY3Rpb24gY29udGludW91c1RyYW5zaXRpb25zKCkge1xuICByZXR1cm4ge1xuICAgIG9uTG9hZDoge1xuICAgICAgZHVyYXRpb246IDIwMDBcbiAgICB9LFxuICAgIG9uRXhpdDoge1xuICAgICAgZHVyYXRpb246IDUwMFxuICAgIH0sXG4gICAgb25FbnRlcjoge1xuICAgICAgZHVyYXRpb246IDUwMFxuICAgIH1cbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb250aW51b3VzUG9sYXJUcmFuc2l0aW9ucygpIHtcbiAgcmV0dXJuIHtcbiAgICBvbkxvYWQ6IHtcbiAgICAgIGR1cmF0aW9uOiAyMDAwLFxuICAgICAgYmVmb3JlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX3k6IDAsXG4gICAgICAgICAgX3kxOiAwLFxuICAgICAgICAgIF95MDogMFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGFmdGVyOiBmdW5jdGlvbiAoZGF0dW0pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfeTogZGF0dW0uX3ksXG4gICAgICAgICAgX3kxOiBkYXR1bS5feTEsXG4gICAgICAgICAgX3kwOiBkYXR1bS5feTBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uRXhpdDoge1xuICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgIGJlZm9yZTogZnVuY3Rpb24gKGRhdHVtLCBpbmRleCwgZGF0YSkge1xuICAgICAgICB2YXIgYWRqYWNlbnQgPSBmdW5jdGlvbiAoYXR0cikge1xuICAgICAgICAgIHZhciBhZGogPSBpbmRleCA9PT0gMCA/IGRhdGFbaW5kZXggKyAxXSA6IGRhdGFbaW5kZXggLSAxXTtcbiAgICAgICAgICByZXR1cm4gYWRqW2F0dHJdO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX3g6IGFkamFjZW50KFwiX3hcIiksXG4gICAgICAgICAgX3k6IGFkamFjZW50KFwiX3lcIiksXG4gICAgICAgICAgX3kwOiBhZGphY2VudChcIl95MFwiKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gICAgb25FbnRlcjoge1xuICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgIGJlZm9yZTogZnVuY3Rpb24gKGRhdHVtLCBpbmRleCwgZGF0YSkge1xuICAgICAgICB2YXIgYWRqYWNlbnQgPSBmdW5jdGlvbiAoYXR0cikge1xuICAgICAgICAgIHZhciBhZGogPSBpbmRleCA9PT0gMCA/IGRhdGFbaW5kZXggKyAxXSA6IGRhdGFbaW5kZXggLSAxXTtcbiAgICAgICAgICByZXR1cm4gYWRqW2F0dHJdO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX3g6IGFkamFjZW50KFwiX3hcIiksXG4gICAgICAgICAgX3k6IGFkamFjZW50KFwiX3lcIiksXG4gICAgICAgICAgX3kwOiBhZGphY2VudChcIl95MFwiKVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGFmdGVyOiBmdW5jdGlvbiAoZGF0dW0pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfeDogZGF0dW0uX3gsXG4gICAgICAgICAgX3k6IGRhdHVtLl95LFxuICAgICAgICAgIF95MTogZGF0dW0uX3kxLFxuICAgICAgICAgIF95MDogZGF0dW0uX3kwXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRpc2NyZXRlVHJhbnNpdGlvbnMoKSB7XG4gIHJldHVybiB7XG4gICAgb25Mb2FkOiB7XG4gICAgICBkdXJhdGlvbjogMjAwMCxcbiAgICAgIGJlZm9yZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBhZnRlcjogZnVuY3Rpb24gKGRhdHVtKSB7XG4gICAgICAgIHJldHVybiBkYXR1bTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uRXhpdDoge1xuICAgICAgZHVyYXRpb246IDYwMCxcbiAgICAgIGJlZm9yZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uRW50ZXI6IHtcbiAgICAgIGR1cmF0aW9uOiA2MDAsXG4gICAgICBiZWZvcmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgYWZ0ZXI6IGZ1bmN0aW9uIChkYXR1bSkge1xuICAgICAgICByZXR1cm4gZGF0dW07XG4gICAgICB9XG4gICAgfVxuICB9O1xufSIsImZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBnZXRCYXNlUHJvcHMgfSBmcm9tIFwiLi9oZWxwZXItbWV0aG9kc1wiO1xuaW1wb3J0IEFyZWEgZnJvbSBcIi4vYXJlYVwiO1xuaW1wb3J0IHsgUHJvcFR5cGVzIGFzIEN1c3RvbVByb3BUeXBlcywgSGVscGVycywgVmljdG9yeUxhYmVsLCBWaWN0b3J5Q29udGFpbmVyLCBDb21tb25Qcm9wcywgRGVmYXVsdFRyYW5zaXRpb25zLCBWaWN0b3J5Q2xpcENvbnRhaW5lciwgYWRkRXZlbnRzLCBWaWN0b3J5VGhlbWUsIERhdGEsIERvbWFpbiB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbnZhciBmYWxsYmFja1Byb3BzID0ge1xuICB3aWR0aDogNDUwLFxuICBoZWlnaHQ6IDMwMCxcbiAgcGFkZGluZzogNTAsXG4gIGludGVycG9sYXRpb246IFwibGluZWFyXCJcbn07XG52YXIgb3B0aW9ucyA9IHtcbiAgY29tcG9uZW50czogW3tcbiAgICBuYW1lOiBcInBhcmVudFwiLFxuICAgIGluZGV4OiBcInBhcmVudFwiXG4gIH0sIHtcbiAgICBuYW1lOiBcImRhdGFcIixcbiAgICBpbmRleDogXCJhbGxcIlxuICB9LCB7XG4gICAgbmFtZTogXCJsYWJlbHNcIlxuICB9XVxufTtcblxudmFyIFZpY3RvcnlBcmVhID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhWaWN0b3J5QXJlYSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gVmljdG9yeUFyZWEoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFZpY3RvcnlBcmVhKTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoVmljdG9yeUFyZWEuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihWaWN0b3J5QXJlYSkpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFZpY3RvcnlBcmVhLCBbe1xuICAgIGtleTogXCJzaG91bGRBbmltYXRlXCIsXG4gICAgLy8gT3ZlcnJpZGRlbiBpbiBuYXRpdmUgdmVyc2lvbnNcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQW5pbWF0ZSgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMucHJvcHMuYW5pbWF0ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBhbmltYXRpb25XaGl0ZWxpc3QgPSBWaWN0b3J5QXJlYS5hbmltYXRpb25XaGl0ZWxpc3QsXG4gICAgICAgICAgcm9sZSA9IFZpY3RvcnlBcmVhLnJvbGU7XG4gICAgICB2YXIgcHJvcHMgPSBIZWxwZXJzLm1vZGlmeVByb3BzKHRoaXMucHJvcHMsIGZhbGxiYWNrUHJvcHMsIHJvbGUpO1xuXG4gICAgICBpZiAodGhpcy5zaG91bGRBbmltYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZUNvbXBvbmVudChwcm9wcywgYW5pbWF0aW9uV2hpdGVsaXN0KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5yZW5kZXJDb250aW51b3VzRGF0YShwcm9wcyk7XG4gICAgICByZXR1cm4gcHJvcHMuc3RhbmRhbG9uZSA/IHRoaXMucmVuZGVyQ29udGFpbmVyKHByb3BzLmNvbnRhaW5lckNvbXBvbmVudCwgY2hpbGRyZW4pIDogY2hpbGRyZW47XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFZpY3RvcnlBcmVhO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUFyZWEsIFwiYW5pbWF0aW9uV2hpdGVsaXN0XCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFtcImRhdGFcIiwgXCJkb21haW5cIiwgXCJoZWlnaHRcIiwgXCJwYWRkaW5nXCIsIFwic3R5bGVcIiwgXCJ3aWR0aFwiXVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUFyZWEsIFwicHJvcFR5cGVzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IF9vYmplY3RTcHJlYWQoe30sIENvbW1vblByb3BzLmJhc2VQcm9wcywgQ29tbW9uUHJvcHMuZGF0YVByb3BzLCB7XG4gICAgaW50ZXJwb2xhdGlvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9uZU9mKFtcImJhc2lzXCIsIFwiY2FyZGluYWxcIiwgXCJjYXRtdWxsUm9tXCIsIFwibGluZWFyXCIsIFwibW9ub3RvbmVYXCIsIFwibW9ub3RvbmVZXCIsIFwibmF0dXJhbFwiLCBcInN0ZXBcIiwgXCJzdGVwQWZ0ZXJcIiwgXCJzdGVwQmVmb3JlXCJdKSwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBsYWJlbDogQ3VzdG9tUHJvcFR5cGVzLmRlcHJlY2F0ZWQoUHJvcFR5cGVzLnN0cmluZywgXCJVc2UgYGxhYmVsc2AgaW5zdGVhZCBmb3IgaW5kaXZpZHVhbCBkYXRhIGxhYmVsc1wiKVxuICB9KVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUFyZWEsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHtcbiAgICBjb250YWluZXJDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUNvbnRhaW5lciwgbnVsbCksXG4gICAgZGF0YUNvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChBcmVhLCBudWxsKSxcbiAgICBncm91cENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5Q2xpcENvbnRhaW5lciwgbnVsbCksXG4gICAgbGFiZWxDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUxhYmVsLCB7XG4gICAgICByZW5kZXJJblBvcnRhbDogdHJ1ZVxuICAgIH0pLFxuICAgIHNhbXBsZXM6IDUwLFxuICAgIHNvcnRLZXk6IFwieFwiLFxuICAgIHNvcnRPcmRlcjogXCJhc2NlbmRpbmdcIixcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRoZW1lOiBWaWN0b3J5VGhlbWUuZ3JheXNjYWxlXG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlBcmVhLCBcImRpc3BsYXlOYW1lXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFwiVmljdG9yeUFyZWFcIlxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUFyZWEsIFwicm9sZVwiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBcImFyZWFcIlxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUFyZWEsIFwiY29udGludW91c1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5QXJlYSwgXCJkZWZhdWx0VHJhbnNpdGlvbnNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogRGVmYXVsdFRyYW5zaXRpb25zLmNvbnRpbnVvdXNUcmFuc2l0aW9ucygpXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5QXJlYSwgXCJkZWZhdWx0UG9sYXJUcmFuc2l0aW9uc1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBEZWZhdWx0VHJhbnNpdGlvbnMuY29udGludW91c1BvbGFyVHJhbnNpdGlvbnMoKVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUFyZWEsIFwiZ2V0RG9tYWluXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IERvbWFpbi5nZXREb21haW5XaXRoWmVyb1xufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUFyZWEsIFwiZ2V0RGF0YVwiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBEYXRhLmdldERhdGFcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlBcmVhLCBcImdldEJhc2VQcm9wc1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gZ2V0QmFzZVByb3BzKHByb3BzLCBmYWxsYmFja1Byb3BzKTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUFyZWEsIFwiZXhwZWN0ZWRDb21wb25lbnRzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFtcImRhdGFDb21wb25lbnRcIiwgXCJsYWJlbENvbXBvbmVudFwiLCBcImdyb3VwQ29tcG9uZW50XCIsIFwiY29udGFpbmVyQ29tcG9uZW50XCJdXG59KTtcbmV4cG9ydCBkZWZhdWx0IGFkZEV2ZW50cyhWaWN0b3J5QXJlYSwgb3B0aW9ucyk7IiwiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IHsgVmljdG9yeUFyZWEgfSBmcm9tICd2aWN0b3J5LWFyZWEnO1xuaW1wb3J0IHsgQ2hhcnRDb250YWluZXIgfSBmcm9tICcuLi9DaGFydENvbnRhaW5lcic7XG5pbXBvcnQgeyBnZXRUaGVtZSB9IGZyb20gJy4uL0NoYXJ0VXRpbHMnO1xuZXhwb3J0IHZhciBDaGFydEFyZWFTb3J0T3JkZXI7XG4oZnVuY3Rpb24gKENoYXJ0QXJlYVNvcnRPcmRlcikge1xuICAgIENoYXJ0QXJlYVNvcnRPcmRlcltcImFzY2VuZGluZ1wiXSA9IFwiYXNjZW5kaW5nXCI7XG4gICAgQ2hhcnRBcmVhU29ydE9yZGVyW1wiZGVzY2VuZGluZ1wiXSA9IFwiZGVzY2VuZGluZ1wiO1xufSkoQ2hhcnRBcmVhU29ydE9yZGVyIHx8IChDaGFydEFyZWFTb3J0T3JkZXIgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IENoYXJ0QXJlYSA9IChfYSkgPT4ge1xuICAgIHZhciB7IGNvbnRhaW5lckNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRDb250YWluZXIsIG51bGwpLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIFxuICAgIC8vIGRlc3RydWN0dXJlIGxhc3RcbiAgICB0aGVtZSA9IGdldFRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCkgfSA9IF9hLCByZXN0ID0gX19yZXN0KF9hLCBbXCJjb250YWluZXJDb21wb25lbnRcIiwgXCJ0aGVtZUNvbG9yXCIsIFwidGhlbWVWYXJpYW50XCIsIFwidGhlbWVcIl0pO1xuICAgIC8vIENsb25lIHNvIHVzZXJzIGNhbiBvdmVycmlkZSBjb250YWluZXIgcHJvcHNcbiAgICBjb25zdCBjb250YWluZXIgPSBSZWFjdC5jbG9uZUVsZW1lbnQoY29udGFpbmVyQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgdGhlbWUgfSwgY29udGFpbmVyQ29tcG9uZW50LnByb3BzKSk7XG4gICAgLy8gTm90ZTogY29udGFpbmVyQ29tcG9uZW50IGlzIHJlcXVpcmVkIGZvciB0aGVtZVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFZpY3RvcnlBcmVhLCBPYmplY3QuYXNzaWduKHsgY29udGFpbmVyQ29tcG9uZW50OiBjb250YWluZXIsIHRoZW1lOiB0aGVtZSB9LCByZXN0KSk7XG59O1xuQ2hhcnRBcmVhLmRpc3BsYXlOYW1lID0gJ0NoYXJ0QXJlYSc7XG4vLyBOb3RlOiBWaWN0b3J5QXJlYS5yb2xlIG11c3QgYmUgaG9pc3RlZFxuaG9pc3ROb25SZWFjdFN0YXRpY3MoQ2hhcnRBcmVhLCBWaWN0b3J5QXJlYSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFydEFyZWEuanMubWFwIiwiZXhwb3J0ICogZnJvbSAnLi9DaGFydEFyZWEnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IHsgVmljdG9yeUF4aXMgfSBmcm9tICd2aWN0b3J5LWF4aXMnO1xuaW1wb3J0IHsgQ2hhcnRDb250YWluZXIgfSBmcm9tICcuLi9DaGFydENvbnRhaW5lcic7XG5pbXBvcnQgeyBnZXRBeGlzVGhlbWUsIGdldFRoZW1lIH0gZnJvbSAnLi4vQ2hhcnRVdGlscyc7XG5leHBvcnQgY29uc3QgQ2hhcnRBeGlzID0gKF9hKSA9PiB7XG4gICAgdmFyIHsgY29udGFpbmVyQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydENvbnRhaW5lciwgbnVsbCksIHNob3dHcmlkID0gZmFsc2UsIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgXG4gICAgLy8gZGVzdHJ1Y3R1cmUgbGFzdFxuICAgIHRoZW1lID0gZ2V0VGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSB9ID0gX2EsIHJlc3QgPSBfX3Jlc3QoX2EsIFtcImNvbnRhaW5lckNvbXBvbmVudFwiLCBcInNob3dHcmlkXCIsIFwidGhlbWVDb2xvclwiLCBcInRoZW1lVmFyaWFudFwiLCBcInRoZW1lXCJdKTtcbiAgICAvLyBDbG9uZSBzbyB1c2VycyBjYW4gb3ZlcnJpZGUgY29udGFpbmVyIHByb3BzXG4gICAgY29uc3QgY29udGFpbmVyID0gUmVhY3QuY2xvbmVFbGVtZW50KGNvbnRhaW5lckNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7IHRoZW1lIH0sIGNvbnRhaW5lckNvbXBvbmVudC5wcm9wcykpO1xuICAgIC8vIE5vdGU6IGNvbnRhaW5lckNvbXBvbmVudCBpcyByZXF1aXJlZCBmb3IgdGhlbWVcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUF4aXMsIE9iamVjdC5hc3NpZ24oeyBjb250YWluZXJDb21wb25lbnQ6IGNvbnRhaW5lciwgdGhlbWU6IHNob3dHcmlkID8gZ2V0QXhpc1RoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCkgOiB0aGVtZSB9LCByZXN0KSkpO1xufTtcbkNoYXJ0QXhpcy5kaXNwbGF5TmFtZSA9ICdDaGFydEF4aXMnO1xuaG9pc3ROb25SZWFjdFN0YXRpY3MoQ2hhcnRBeGlzLCBWaWN0b3J5QXhpcyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFydEF4aXMuanMubWFwIiwiZXhwb3J0ICogZnJvbSAnLi9DaGFydEF4aXMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoL2lzTmlsXCI7XG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgRGF0YSwgRG9tYWluLCBIZWxwZXJzLCBMYWJlbEhlbHBlcnMsIFNjYWxlIH0gZnJvbSBcInZpY3RvcnktY29yZVwiO1xuZXhwb3J0IHZhciBnZXRCYXJQb3NpdGlvbiA9IGZ1bmN0aW9uIChwcm9wcywgZGF0dW0pIHtcbiAgdmFyIGdldERlZmF1bHRNaW4gPSBmdW5jdGlvbiAoYXhpcykge1xuICAgIHZhciBkZWZhdWx0WmVybyA9IFNjYWxlLmdldFR5cGUocHJvcHMuc2NhbGVbYXhpc10pID09PSBcImxvZ1wiID8gMSAvIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogMDtcbiAgICB2YXIgZGVmYXVsdE1pbiA9IGRlZmF1bHRaZXJvO1xuICAgIHZhciBtaW5ZID0gQ29sbGVjdGlvbi5nZXRNaW5WYWx1ZShwcm9wcy5kb21haW5bYXhpc10pO1xuICAgIHZhciBtYXhZID0gQ29sbGVjdGlvbi5nZXRNYXhWYWx1ZShwcm9wcy5kb21haW5bYXhpc10pO1xuXG4gICAgaWYgKG1pblkgPCAwICYmIG1heFkgPD0gMCkge1xuICAgICAgZGVmYXVsdE1pbiA9IG1heFk7XG4gICAgfSBlbHNlIGlmIChtaW5ZID49IDAgJiYgbWF4WSA+IDApIHtcbiAgICAgIGRlZmF1bHRNaW4gPSBtaW5ZO1xuICAgIH1cblxuICAgIHJldHVybiBkYXR1bVtcIl9cIi5jb25jYXQoYXhpcyldIGluc3RhbmNlb2YgRGF0ZSA/IG5ldyBEYXRlKGRlZmF1bHRNaW4pIDogZGVmYXVsdE1pbjtcbiAgfTtcblxuICB2YXIgX3kwID0gZGF0dW0uX3kwICE9PSB1bmRlZmluZWQgPyBkYXR1bS5feTAgOiBnZXREZWZhdWx0TWluKFwieVwiKTtcblxuICB2YXIgX3gwID0gZGF0dW0uX3gwICE9PSB1bmRlZmluZWQgPyBkYXR1bS5feDAgOiBnZXREZWZhdWx0TWluKFwieFwiKTtcblxuICByZXR1cm4gSGVscGVycy5zY2FsZVBvaW50KHByb3BzLCBfYXNzaWduKHt9LCBkYXR1bSwge1xuICAgIF95MDogX3kwLFxuICAgIF94MDogX3gwXG4gIH0pKTtcbn07XG5cbnZhciBnZXRDYWxjdWxhdGVkVmFsdWVzID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciBwb2xhciA9IHByb3BzLnBvbGFyO1xuICB2YXIgZGVmYXVsdFN0eWxlcyA9IEhlbHBlcnMuZ2V0RGVmYXVsdFN0eWxlcyhwcm9wcywgXCJiYXJcIik7XG4gIHZhciBzdHlsZSA9ICFwcm9wcy5kaXNhYmxlSW5saW5lU3R5bGVzID8gSGVscGVycy5nZXRTdHlsZXMocHJvcHMuc3R5bGUsIGRlZmF1bHRTdHlsZXMpIDoge307XG4gIHZhciByYW5nZSA9IHByb3BzLnJhbmdlIHx8IHtcbiAgICB4OiBIZWxwZXJzLmdldFJhbmdlKHByb3BzLCBcInhcIiksXG4gICAgeTogSGVscGVycy5nZXRSYW5nZShwcm9wcywgXCJ5XCIpXG4gIH07XG4gIHZhciBkb21haW4gPSB7XG4gICAgeDogRG9tYWluLmdldERvbWFpbldpdGhaZXJvKHByb3BzLCBcInhcIiksXG4gICAgeTogRG9tYWluLmdldERvbWFpbldpdGhaZXJvKHByb3BzLCBcInlcIilcbiAgfTtcbiAgdmFyIHNjYWxlID0ge1xuICAgIHg6IFNjYWxlLmdldEJhc2VTY2FsZShwcm9wcywgXCJ4XCIpLmRvbWFpbihkb21haW4ueCkucmFuZ2UocHJvcHMuaG9yaXpvbnRhbCA/IHJhbmdlLnkgOiByYW5nZS54KSxcbiAgICB5OiBTY2FsZS5nZXRCYXNlU2NhbGUocHJvcHMsIFwieVwiKS5kb21haW4oZG9tYWluLnkpLnJhbmdlKHByb3BzLmhvcml6b250YWwgPyByYW5nZS54IDogcmFuZ2UueSlcbiAgfTtcbiAgdmFyIG9yaWdpbiA9IHBvbGFyID8gcHJvcHMub3JpZ2luIHx8IEhlbHBlcnMuZ2V0UG9sYXJPcmlnaW4ocHJvcHMpIDogdW5kZWZpbmVkO1xuICB2YXIgZGF0YSA9IERhdGEuZ2V0RGF0YShwcm9wcyk7XG4gIGRhdGEgPSBEYXRhLmZvcm1hdERhdGFGcm9tRG9tYWluKGRhdGEsIGRvbWFpbiwgMCk7XG4gIHJldHVybiB7XG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGRhdGE6IGRhdGEsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIGRvbWFpbjogZG9tYWluLFxuICAgIG9yaWdpbjogb3JpZ2luXG4gIH07XG59O1xuXG5leHBvcnQgdmFyIGdldEJhc2VQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcywgZmFsbGJhY2tQcm9wcykge1xuICB2YXIgbW9kaWZpZWRQcm9wcyA9IEhlbHBlcnMubW9kaWZ5UHJvcHMocHJvcHMsIGZhbGxiYWNrUHJvcHMsIFwiYmFyXCIpO1xuICBwcm9wcyA9IF9hc3NpZ24oe30sIG1vZGlmaWVkUHJvcHMsIGdldENhbGN1bGF0ZWRWYWx1ZXMobW9kaWZpZWRQcm9wcykpO1xuICB2YXIgX3Byb3BzID0gcHJvcHMsXG4gICAgICBhbGlnbm1lbnQgPSBfcHJvcHMuYWxpZ25tZW50LFxuICAgICAgYmFyUmF0aW8gPSBfcHJvcHMuYmFyUmF0aW8sXG4gICAgICBjb3JuZXJSYWRpdXMgPSBfcHJvcHMuY29ybmVyUmFkaXVzLFxuICAgICAgZGF0YSA9IF9wcm9wcy5kYXRhLFxuICAgICAgZGlzYWJsZUlubGluZVN0eWxlcyA9IF9wcm9wcy5kaXNhYmxlSW5saW5lU3R5bGVzLFxuICAgICAgZG9tYWluID0gX3Byb3BzLmRvbWFpbixcbiAgICAgIGV2ZW50cyA9IF9wcm9wcy5ldmVudHMsXG4gICAgICBoZWlnaHQgPSBfcHJvcHMuaGVpZ2h0LFxuICAgICAgaG9yaXpvbnRhbCA9IF9wcm9wcy5ob3Jpem9udGFsLFxuICAgICAgb3JpZ2luID0gX3Byb3BzLm9yaWdpbixcbiAgICAgIHBhZGRpbmcgPSBfcHJvcHMucGFkZGluZyxcbiAgICAgIHBvbGFyID0gX3Byb3BzLnBvbGFyLFxuICAgICAgc2NhbGUgPSBfcHJvcHMuc2NhbGUsXG4gICAgICBzaGFyZWRFdmVudHMgPSBfcHJvcHMuc2hhcmVkRXZlbnRzLFxuICAgICAgc3RhbmRhbG9uZSA9IF9wcm9wcy5zdGFuZGFsb25lLFxuICAgICAgc3R5bGUgPSBfcHJvcHMuc3R5bGUsXG4gICAgICB0aGVtZSA9IF9wcm9wcy50aGVtZSxcbiAgICAgIHdpZHRoID0gX3Byb3BzLndpZHRoLFxuICAgICAgbGFiZWxzID0gX3Byb3BzLmxhYmVscyxcbiAgICAgIG5hbWUgPSBfcHJvcHMubmFtZSxcbiAgICAgIGJhcldpZHRoID0gX3Byb3BzLmJhcldpZHRoLFxuICAgICAgZ2V0UGF0aCA9IF9wcm9wcy5nZXRQYXRoO1xuICB2YXIgaW5pdGlhbENoaWxkUHJvcHMgPSB7XG4gICAgcGFyZW50OiB7XG4gICAgICBob3Jpem9udGFsOiBob3Jpem9udGFsLFxuICAgICAgZG9tYWluOiBkb21haW4sXG4gICAgICBzY2FsZTogc2NhbGUsXG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBzdGFuZGFsb25lOiBzdGFuZGFsb25lLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgIHBvbGFyOiBwb2xhcixcbiAgICAgIG9yaWdpbjogb3JpZ2luLFxuICAgICAgcGFkZGluZzogcGFkZGluZyxcbiAgICAgIHN0eWxlOiBzdHlsZS5wYXJlbnRcbiAgICB9XG4gIH07XG4gIHJldHVybiBkYXRhLnJlZHVjZShmdW5jdGlvbiAoY2hpbGRQcm9wcywgZGF0dW0sIGluZGV4KSB7XG4gICAgdmFyIGV2ZW50S2V5ID0gIV9pc05pbChkYXR1bS5ldmVudEtleSkgPyBkYXR1bS5ldmVudEtleSA6IGluZGV4O1xuXG4gICAgdmFyIF9nZXRCYXJQb3NpdGlvbiA9IGdldEJhclBvc2l0aW9uKHByb3BzLCBkYXR1bSksXG4gICAgICAgIHggPSBfZ2V0QmFyUG9zaXRpb24ueCxcbiAgICAgICAgeSA9IF9nZXRCYXJQb3NpdGlvbi55LFxuICAgICAgICB5MCA9IF9nZXRCYXJQb3NpdGlvbi55MCxcbiAgICAgICAgeDAgPSBfZ2V0QmFyUG9zaXRpb24ueDA7XG5cbiAgICB2YXIgZGF0YVByb3BzID0ge1xuICAgICAgYWxpZ25tZW50OiBhbGlnbm1lbnQsXG4gICAgICBiYXJSYXRpbzogYmFyUmF0aW8sXG4gICAgICBiYXJXaWR0aDogYmFyV2lkdGgsXG4gICAgICBjb3JuZXJSYWRpdXM6IGNvcm5lclJhZGl1cyxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBkYXR1bTogZGF0dW0sXG4gICAgICBkaXNhYmxlSW5saW5lU3R5bGVzOiBkaXNhYmxlSW5saW5lU3R5bGVzLFxuICAgICAgZ2V0UGF0aDogZ2V0UGF0aCxcbiAgICAgIGhvcml6b250YWw6IGhvcml6b250YWwsXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBwb2xhcjogcG9sYXIsXG4gICAgICBvcmlnaW46IG9yaWdpbixcbiAgICAgIHNjYWxlOiBzY2FsZSxcbiAgICAgIHN0eWxlOiBzdHlsZS5kYXRhLFxuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICB4OiB4LFxuICAgICAgeTogeSxcbiAgICAgIHkwOiB5MCxcbiAgICAgIHgwOiB4MFxuICAgIH07XG4gICAgY2hpbGRQcm9wc1tldmVudEtleV0gPSB7XG4gICAgICBkYXRhOiBkYXRhUHJvcHNcbiAgICB9O1xuICAgIHZhciB0ZXh0ID0gTGFiZWxIZWxwZXJzLmdldFRleHQocHJvcHMsIGRhdHVtLCBpbmRleCk7XG5cbiAgICBpZiAodGV4dCAhPT0gdW5kZWZpbmVkICYmIHRleHQgIT09IG51bGwgfHwgbGFiZWxzICYmIChldmVudHMgfHwgc2hhcmVkRXZlbnRzKSkge1xuICAgICAgY2hpbGRQcm9wc1tldmVudEtleV0ubGFiZWxzID0gTGFiZWxIZWxwZXJzLmdldFByb3BzKHByb3BzLCBpbmRleCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoaWxkUHJvcHM7XG4gIH0sIGluaXRpYWxDaGlsZFByb3BzKTtcbn07IiwiaW1wb3J0IF9pc1BsYWluT2JqZWN0IGZyb20gXCJsb2Rhc2gvaXNQbGFpbk9iamVjdFwiO1xuaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoL2lzTmlsXCI7XG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbmV4cG9ydCB2YXIgZ2V0QmFyV2lkdGggPSBmdW5jdGlvbiAoYmFyV2lkdGgsIHByb3BzKSB7XG4gIHZhciBzY2FsZSA9IHByb3BzLnNjYWxlLFxuICAgICAgZGF0YSA9IHByb3BzLmRhdGEsXG4gICAgICBkZWZhdWx0QmFyV2lkdGggPSBwcm9wcy5kZWZhdWx0QmFyV2lkdGgsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlO1xuXG4gIGlmIChiYXJXaWR0aCkge1xuICAgIHJldHVybiBIZWxwZXJzLmV2YWx1YXRlUHJvcChiYXJXaWR0aCwgcHJvcHMpO1xuICB9IGVsc2UgaWYgKHN0eWxlLndpZHRoKSB7XG4gICAgcmV0dXJuIHN0eWxlLndpZHRoO1xuICB9XG5cbiAgdmFyIHJhbmdlID0gc2NhbGUueC5yYW5nZSgpO1xuICB2YXIgZXh0ZW50ID0gTWF0aC5hYnMocmFuZ2VbMV0gLSByYW5nZVswXSk7XG4gIHZhciBiYXJzID0gZGF0YS5sZW5ndGggKyAyO1xuICB2YXIgYmFyUmF0aW8gPSBwcm9wcy5iYXJSYXRpbyB8fCAwLjU7XG4gIHZhciBkZWZhdWx0V2lkdGggPSBiYXJSYXRpbyAqIChkYXRhLmxlbmd0aCA8IDIgPyBkZWZhdWx0QmFyV2lkdGggOiBleHRlbnQgLyBiYXJzKTtcbiAgcmV0dXJuIE1hdGgubWF4KDEsIGRlZmF1bHRXaWR0aCk7XG59O1xuXG52YXIgZ2V0Q29ybmVyUmFkaXVzRnJvbU9iamVjdCA9IGZ1bmN0aW9uIChjb3JuZXJSYWRpdXMsIHByb3BzKSB7XG4gIHZhciByZWFsQ29ybmVyUmFkaXVzID0ge1xuICAgIHRvcExlZnQ6IDAsXG4gICAgdG9wUmlnaHQ6IDAsXG4gICAgYm90dG9tTGVmdDogMCxcbiAgICBib3R0b21SaWdodDogMFxuICB9O1xuXG4gIHZhciB1cGRhdGVDb3JuZXJSYWRpdXMgPSBmdW5jdGlvbiAoY29ybmVyLCBmYWxsYmFjaykge1xuICAgIGlmICghX2lzTmlsKGNvcm5lclJhZGl1c1tjb3JuZXJdKSkge1xuICAgICAgcmVhbENvcm5lclJhZGl1c1tjb3JuZXJdID0gSGVscGVycy5ldmFsdWF0ZVByb3AoY29ybmVyUmFkaXVzW2Nvcm5lcl0sIHByb3BzKTtcbiAgICB9IGVsc2UgaWYgKCFfaXNOaWwoY29ybmVyUmFkaXVzW2ZhbGxiYWNrXSkpIHtcbiAgICAgIHJlYWxDb3JuZXJSYWRpdXNbY29ybmVyXSA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKGNvcm5lclJhZGl1c1tmYWxsYmFja10sIHByb3BzKTtcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlQ29ybmVyUmFkaXVzKFwidG9wTGVmdFwiLCBcInRvcFwiKTtcbiAgdXBkYXRlQ29ybmVyUmFkaXVzKFwidG9wUmlnaHRcIiwgXCJ0b3BcIik7XG4gIHVwZGF0ZUNvcm5lclJhZGl1cyhcImJvdHRvbUxlZnRcIiwgXCJib3R0b21cIik7XG4gIHVwZGF0ZUNvcm5lclJhZGl1cyhcImJvdHRvbVJpZ2h0XCIsIFwiYm90dG9tXCIpO1xuICByZXR1cm4gcmVhbENvcm5lclJhZGl1cztcbn07XG5cbmV4cG9ydCB2YXIgZ2V0Q29ybmVyUmFkaXVzID0gZnVuY3Rpb24gKGNvcm5lclJhZGl1cywgcHJvcHMpIHtcbiAgdmFyIHJlYWxDb3JuZXJSYWRpdXMgPSB7XG4gICAgdG9wTGVmdDogMCxcbiAgICB0b3BSaWdodDogMCxcbiAgICBib3R0b21MZWZ0OiAwLFxuICAgIGJvdHRvbVJpZ2h0OiAwXG4gIH07XG5cbiAgaWYgKCFjb3JuZXJSYWRpdXMpIHtcbiAgICByZXR1cm4gcmVhbENvcm5lclJhZGl1cztcbiAgfVxuXG4gIGlmIChfaXNQbGFpbk9iamVjdChjb3JuZXJSYWRpdXMpKSB7XG4gICAgcmV0dXJuIGdldENvcm5lclJhZGl1c0Zyb21PYmplY3QoY29ybmVyUmFkaXVzLCBwcm9wcyk7XG4gIH0gZWxzZSB7XG4gICAgcmVhbENvcm5lclJhZGl1cy50b3BMZWZ0ID0gSGVscGVycy5ldmFsdWF0ZVByb3AoY29ybmVyUmFkaXVzLCBwcm9wcyk7XG4gICAgcmVhbENvcm5lclJhZGl1cy50b3BSaWdodCA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKGNvcm5lclJhZGl1cywgcHJvcHMpO1xuICAgIHJldHVybiByZWFsQ29ybmVyUmFkaXVzO1xuICB9XG59O1xuZXhwb3J0IHZhciBnZXRTdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0eWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgdmFyIHByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG5cbiAgaWYgKHByb3BzLmRpc2FibGVJbmxpbmVTdHlsZXMpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICB2YXIgc3Ryb2tlID0gc3R5bGUuZmlsbCB8fCBcImJsYWNrXCI7XG4gIHZhciBiYXNlU3R5bGUgPSB7XG4gICAgZmlsbDogXCJibGFja1wiLFxuICAgIHN0cm9rZTogc3Ryb2tlXG4gIH07XG4gIHJldHVybiBIZWxwZXJzLmV2YWx1YXRlU3R5bGUoX2Fzc2lnbihiYXNlU3R5bGUsIHN0eWxlKSwgcHJvcHMpO1xufTsiLCIvKipcbiAqIEEgcG9pbnQgaW4gdGhlIDJkIHBsYW5lXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIHggY29vcmRpbmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSB5IGNvb3JkaW5hdGVcbiAqIEByZXR1cm5zIHtvYmplY3R9IC0gcG9pbnQgb2JqZWN0XG4gKi9cbnZhciBwb2ludCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gIHJldHVybiB7XG4gICAgeDogeCxcbiAgICB5OiB5LFxuICAgIGRpc3RhbmNlOiBmdW5jdGlvbiAocDEpIHtcbiAgICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codGhpcy54IC0gcDEueCwgMikgKyBNYXRoLnBvdyh0aGlzLnkgLSBwMS55LCAyKSk7XG4gICAgfSxcbiAgICAvLyB2ZWN0b3IgYWRkaXRpb24gaW4gMmQgcGxhbmVcbiAgICBhZGQ6IGZ1bmN0aW9uIChwMSkge1xuICAgICAgcmV0dXJuIHBvaW50KHRoaXMueCArIHAxLngsIHRoaXMueSArIHAxLnkpO1xuICAgIH0sXG4gICAgLy8gdmVjdG9yIHN1YnRyYWN0aW9uIGluIDJkXG4gICAgLy8gcmV0dXJucyBwMCAtIHAxXG4gICAgc3VidHJhY3Q6IGZ1bmN0aW9uIChwMSkge1xuICAgICAgcmV0dXJuIHBvaW50KHRoaXMueCAtIHAxLngsIHRoaXMueSAtIHAxLnkpO1xuICAgIH0sXG4gICAgLy8gbXVsdGlwbHkgYSAyZCBwb2ludCBieSBhIHNjYWxhclxuICAgIHNjYWxhck11bHQ6IGZ1bmN0aW9uIChuKSB7XG4gICAgICByZXR1cm4gcG9pbnQodGhpcy54ICogbiwgdGhpcy55ICogbik7XG4gICAgfSxcbiAgICBzY2FsYXJEaXZpZGU6IGZ1bmN0aW9uIChuKSB7XG4gICAgICBpZiAobiA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaXZpc2lvbiBieSAwIGVycm9yXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcG9pbnQodGhpcy54IC8gbiwgdGhpcy55IC8gbik7XG4gICAgfSxcbiAgICBlcXVhbHM6IGZ1bmN0aW9uIChwMSkge1xuICAgICAgcmV0dXJuIHRoaXMueCA9PT0gcDEueCAmJiB0aGlzLnkgPT09IHAxLnk7XG4gICAgfVxuICB9O1xufTtcbi8qKlxuICogQSBjaXJjbGUgaW4gdGhlIDJkIHBsYW5lXG4gKiBAcGFyYW0ge3BvaW50fSBjZW50ZXIgLSBjZW50ZXIgb2YgY2lyY2xlXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gcmFkaXVzIG9mIGNpcmNsZVxuICogQHJldHVybnMge29iamVjdH0gLSBwb2ludCBvYmplY3RcbiAqL1xuXG5cbnZhciBjaXJjbGUgPSBmdW5jdGlvbiAoY2VudGVyLCByYWRpdXMpIHtcbiAgcmV0dXJuIHtcbiAgICBjZW50ZXI6IGNlbnRlcixcbiAgICByYWRpdXM6IHJhZGl1cyxcbiAgICBoYXNJbnRlcnNlY3Rpb246IGZ1bmN0aW9uIChjaXJjbGUxKSB7XG4gICAgICB2YXIgUDAgPSB0aGlzLmNlbnRlcjtcbiAgICAgIHZhciBQMSA9IGNpcmNsZTEuY2VudGVyO1xuICAgICAgdmFyIHIwID0gdGhpcy5yYWRpdXM7XG4gICAgICB2YXIgcjEgPSBjaXJjbGUxLnJhZGl1cztcbiAgICAgIHZhciBkID0gUDAuZGlzdGFuY2UoUDEpO1xuXG4gICAgICBpZiAoZCA+IHIwICsgcjEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBzZXBhcmF0ZSBjaXJjbGVzXG4gICAgICB9XG5cbiAgICAgIGlmIChkIDwgTWF0aC5hYnMocjAgLSByMSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBvbmUgY2lyY2xlIGNvbnRhaW5zIGFub3RoZXJcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBlcXVhbHM6IGZ1bmN0aW9uIChjaXJjbGUxKSB7XG4gICAgICB2YXIgUDAgPSB0aGlzLmNlbnRlcjtcbiAgICAgIHZhciBQMSA9IGNpcmNsZTEuY2VudGVyO1xuICAgICAgdmFyIHIwID0gdGhpcy5yYWRpdXM7XG4gICAgICB2YXIgcjEgPSBjaXJjbGUxLnJhZGl1cztcbiAgICAgIHJldHVybiByMCA9PT0gcjEgJiYgUDAuZXF1YWxzKFAxKTtcbiAgICB9LFxuICAgIC8vIFNvdXJjZTogaHR0cDovL3BhdWxib3Vya2UubmV0L2dlb21ldHJ5L2NpcmNsZXNwaGVyZS9cbiAgICAvLyBcIkludGVyc2VjdGlvbiBvZiB0d28gY2lyY2xlc1wiIGJ5IFBhdWwgQm91cmtlXG4gICAgLy8gTGVmdC1tb3N0IHBvaW50IGlzIHJldHVybmVkIGFzIDB0aCBlbGVtZW50IG9mIGFycmF5XG4gICAgLy8gUmlnaHQtbW9zdCBwb2ludCBpcyByZXR1cm5lZCBhcyAxc3QgZWxlbWVubnQgb2YgYXJyYXlcbiAgICBpbnRlcnNlY3Rpb246IGZ1bmN0aW9uIChjaXJjbGUxKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1zdGF0ZW1lbnRzXG4gICAgICB2YXIgUDAgPSB0aGlzLmNlbnRlcjtcbiAgICAgIHZhciBQMSA9IGNpcmNsZTEuY2VudGVyO1xuICAgICAgdmFyIHIwID0gdGhpcy5yYWRpdXM7XG4gICAgICB2YXIgcjEgPSBjaXJjbGUxLnJhZGl1cztcbiAgICAgIHZhciBkID0gUDAuZGlzdGFuY2UoUDEpO1xuXG4gICAgICBpZiAoIXRoaXMuaGFzSW50ZXJzZWN0aW9uKGNpcmNsZTEpIHx8IHRoaXMuZXF1YWxzKGNpcmNsZTEpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgdmFyIGEgPSAoTWF0aC5wb3cocjAsIDIpIC0gTWF0aC5wb3cocjEsIDIpICsgTWF0aC5wb3coZCwgMikpIC8gKDIgKiBkKTtcbiAgICAgIHZhciBoID0gTWF0aC5zcXJ0KE1hdGgucG93KHIwLCAyKSAtIE1hdGgucG93KGEsIDIpKTtcbiAgICAgIHZhciBQMiA9IFAwLmFkZChQMS5zdWJ0cmFjdChQMCkuc2NhbGFyTXVsdChhKS5zY2FsYXJEaXZpZGUoZCkpO1xuICAgICAgdmFyIHgwID0gUDAueCxcbiAgICAgICAgICB5MCA9IFAwLnk7XG4gICAgICB2YXIgeDEgPSBQMS54LFxuICAgICAgICAgIHkxID0gUDEueTtcbiAgICAgIHZhciB4MiA9IFAyLngsXG4gICAgICAgICAgeTIgPSBQMi55O1xuICAgICAgdmFyIFAzcyA9IFtwb2ludCh4MiAtIGggKiAoeTEgLSB5MCkgLyBkLCB5MiArIGggKiAoeDEgLSB4MCkgLyBkKSwgcG9pbnQoeDIgKyBoICogKHkxIC0geTApIC8gZCwgeTIgLSBoICogKHgxIC0geDApIC8gZCldO1xuICAgICAgUDNzLnNvcnQoZnVuY3Rpb24gKFBvaW50MSwgUG9pbnQyKSB7XG4gICAgICAgIHJldHVybiBQb2ludDEueCAtIFBvaW50Mi54O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUDNzO1xuICAgIH0sXG4gICAgc29sdmVYOiBmdW5jdGlvbiAoeSkge1xuICAgICAgdmFyIHNxcnQgPSBNYXRoLnNxcnQoTWF0aC5wb3codGhpcy5yYWRpdXMsIDIpIC0gTWF0aC5wb3coeSAtIHRoaXMuY2VudGVyLnksIDIpKTtcbiAgICAgIHJldHVybiBbdGhpcy5jZW50ZXIueCAtIHNxcnQsIHRoaXMuY2VudGVyLnggKyBzcXJ0XTtcbiAgICB9LFxuICAgIHNvbHZlWTogZnVuY3Rpb24gKHgpIHtcbiAgICAgIHZhciBzcXJ0ID0gTWF0aC5zcXJ0KE1hdGgucG93KHRoaXMucmFkaXVzLCAyKSAtIE1hdGgucG93KHggLSB0aGlzLmNlbnRlci54LCAyKSk7XG4gICAgICByZXR1cm4gW3RoaXMuY2VudGVyLnkgLSBzcXJ0LCB0aGlzLmNlbnRlci55ICsgc3FydF07XG4gICAgfVxuICB9O1xufTtcblxuZXhwb3J0IHsgY2lyY2xlLCBwb2ludCB9OyIsImZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IH1cblxuaW1wb3J0ICogYXMgZDNTaGFwZSBmcm9tIFwiZDMtc2hhcGVcIjtcbmltcG9ydCB7IGNpcmNsZSwgcG9pbnQgfSBmcm9tIFwiLi9nZW9tZXRyeS1oZWxwZXItbWV0aG9kc1wiO1xuXG52YXIgZ2V0UG9zaXRpb24gPSBmdW5jdGlvbiAocHJvcHMsIHdpZHRoKSB7XG4gIHZhciB4ID0gcHJvcHMueCxcbiAgICAgIHgwID0gcHJvcHMueDAsXG4gICAgICB5ID0gcHJvcHMueSxcbiAgICAgIHkwID0gcHJvcHMueTAsXG4gICAgICBob3Jpem9udGFsID0gcHJvcHMuaG9yaXpvbnRhbDtcbiAgdmFyIGFsaWdubWVudCA9IHByb3BzLmFsaWdubWVudCB8fCBcIm1pZGRsZVwiO1xuICB2YXIgc2l6ZSA9IGFsaWdubWVudCA9PT0gXCJtaWRkbGVcIiA/IHdpZHRoIC8gMiA6IHdpZHRoO1xuICB2YXIgc2lnbiA9IGhvcml6b250YWwgPyAtMSA6IDE7XG5cbiAgaWYgKGhvcml6b250YWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDA6IHgwLFxuICAgICAgeDE6IHgsXG4gICAgICB5MDogYWxpZ25tZW50ID09PSBcInN0YXJ0XCIgPyB5IDogeSAtIHNpZ24gKiBzaXplLFxuICAgICAgeTE6IGFsaWdubWVudCA9PT0gXCJlbmRcIiA/IHkgOiB5ICsgc2lnbiAqIHNpemVcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4MDogYWxpZ25tZW50ID09PSBcInN0YXJ0XCIgPyB4IDogeCAtIHNpZ24gKiBzaXplLFxuICAgIHgxOiBhbGlnbm1lbnQgPT09IFwiZW5kXCIgPyB4IDogeCArIHNpZ24gKiBzaXplLFxuICAgIHkwOiB5MCxcbiAgICB5MTogeVxuICB9O1xufTtcblxudmFyIGdldEFuZ2xlID0gZnVuY3Rpb24gKHByb3BzLCBpbmRleCkge1xuICB2YXIgZGF0YSA9IHByb3BzLmRhdGEsXG4gICAgICBzY2FsZSA9IHByb3BzLnNjYWxlO1xuICB2YXIgeCA9IGRhdGFbaW5kZXhdLl94MSA9PT0gdW5kZWZpbmVkID8gXCJfeFwiIDogXCJfeDFcIjtcbiAgcmV0dXJuIHNjYWxlLngoZGF0YVtpbmRleF1beF0pO1xufTtcblxudmFyIGdldEFuZ3VsYXJXaWR0aCA9IGZ1bmN0aW9uIChwcm9wcywgd2lkdGgpIHtcbiAgdmFyIHNjYWxlID0gcHJvcHMuc2NhbGU7XG4gIHZhciByYW5nZSA9IHNjYWxlLnkucmFuZ2UoKTtcbiAgdmFyIHIgPSBNYXRoLm1heC5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkocmFuZ2UpKTtcbiAgdmFyIGFuZ3VsYXJSYW5nZSA9IE1hdGguYWJzKHNjYWxlLngucmFuZ2UoKVsxXSAtIHNjYWxlLngucmFuZ2UoKVswXSk7XG4gIHJldHVybiB3aWR0aCAvICgyICogTWF0aC5QSSAqIHIpICogYW5ndWxhclJhbmdlO1xufTtcblxudmFyIHRyYW5zZm9ybUFuZ2xlID0gZnVuY3Rpb24gKGFuZ2xlKSB7XG4gIHJldHVybiAtMSAqIGFuZ2xlICsgTWF0aC5QSSAvIDI7XG59O1xuXG5leHBvcnQgdmFyIGdldEN1c3RvbUJhclBhdGggPSBmdW5jdGlvbiAocHJvcHMsIHdpZHRoKSB7XG4gIHZhciBnZXRQYXRoID0gcHJvcHMuZ2V0UGF0aDtcblxuICB2YXIgcHJvcHNXaXRoQ2FsY3VsYXRlZFZhbHVlcyA9IF9vYmplY3RTcHJlYWQoe30sIHByb3BzLCBnZXRQb3NpdGlvbihwcm9wcywgd2lkdGgpKTtcblxuICByZXR1cm4gZ2V0UGF0aChwcm9wc1dpdGhDYWxjdWxhdGVkVmFsdWVzKTtcbn07XG5cbnZhciBnZXRTdGFydEFuZ2xlID0gZnVuY3Rpb24gKHByb3BzLCBpbmRleCkge1xuICB2YXIgZGF0YSA9IHByb3BzLmRhdGEsXG4gICAgICBzY2FsZSA9IHByb3BzLnNjYWxlLFxuICAgICAgYWxpZ25tZW50ID0gcHJvcHMuYWxpZ25tZW50O1xuICB2YXIgY3VycmVudEFuZ2xlID0gZ2V0QW5nbGUocHJvcHMsIGluZGV4KTtcbiAgdmFyIGFuZ3VsYXJSYW5nZSA9IE1hdGguYWJzKHNjYWxlLngucmFuZ2UoKVsxXSAtIHNjYWxlLngucmFuZ2UoKVswXSk7XG4gIHZhciBwcmV2aW91c0FuZ2xlID0gaW5kZXggPT09IDAgPyBnZXRBbmdsZShwcm9wcywgZGF0YS5sZW5ndGggLSAxKSAtIE1hdGguUEkgKiAyIDogZ2V0QW5nbGUocHJvcHMsIGluZGV4IC0gMSk7XG5cbiAgaWYgKGluZGV4ID09PSAwICYmIGFuZ3VsYXJSYW5nZSA8IDIgKiBNYXRoLlBJKSB7XG4gICAgcmV0dXJuIHNjYWxlLngucmFuZ2UoKVswXTtcbiAgfSBlbHNlIGlmIChhbGlnbm1lbnQgPT09IFwic3RhcnRcIiB8fCBhbGlnbm1lbnQgPT09IFwiZW5kXCIpIHtcbiAgICByZXR1cm4gYWxpZ25tZW50ID09PSBcInN0YXJ0XCIgPyBwcmV2aW91c0FuZ2xlIDogY3VycmVudEFuZ2xlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAoY3VycmVudEFuZ2xlICsgcHJldmlvdXNBbmdsZSkgLyAyO1xuICB9XG59O1xuXG52YXIgZ2V0RW5kQW5nbGUgPSBmdW5jdGlvbiAocHJvcHMsIGluZGV4KSB7XG4gIHZhciBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICAgIHNjYWxlID0gcHJvcHMuc2NhbGUsXG4gICAgICBhbGlnbm1lbnQgPSBwcm9wcy5hbGlnbm1lbnQ7XG4gIHZhciBjdXJyZW50QW5nbGUgPSBnZXRBbmdsZShwcm9wcywgaW5kZXgpO1xuICB2YXIgYW5ndWxhclJhbmdlID0gTWF0aC5hYnMoc2NhbGUueC5yYW5nZSgpWzFdIC0gc2NhbGUueC5yYW5nZSgpWzBdKTtcbiAgdmFyIGxhc3RBbmdsZSA9IHNjYWxlLngucmFuZ2UoKVsxXSA9PT0gMiAqIE1hdGguUEkgPyBnZXRBbmdsZShwcm9wcywgMCkgKyBNYXRoLlBJICogMiA6IHNjYWxlLngucmFuZ2UoKVsxXTtcbiAgdmFyIG5leHRBbmdsZSA9IGluZGV4ID09PSBkYXRhLmxlbmd0aCAtIDEgPyBnZXRBbmdsZShwcm9wcywgMCkgKyBNYXRoLlBJICogMiA6IGdldEFuZ2xlKHByb3BzLCBpbmRleCArIDEpO1xuXG4gIGlmIChpbmRleCA9PT0gZGF0YS5sZW5ndGggLSAxICYmIGFuZ3VsYXJSYW5nZSA8IDIgKiBNYXRoLlBJKSB7XG4gICAgcmV0dXJuIGxhc3RBbmdsZTtcbiAgfSBlbHNlIGlmIChhbGlnbm1lbnQgPT09IFwic3RhcnRcIiB8fCBhbGlnbm1lbnQgPT09IFwiZW5kXCIpIHtcbiAgICByZXR1cm4gYWxpZ25tZW50ID09PSBcInN0YXJ0XCIgPyBjdXJyZW50QW5nbGUgOiBuZXh0QW5nbGU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChjdXJyZW50QW5nbGUgKyBuZXh0QW5nbGUpIC8gMjtcbiAgfVxufTtcblxudmFyIG1hcFBvaW50c1RvUGF0aCA9IGZ1bmN0aW9uIChjb29yZHMsIGNvcm5lclJhZGl1cywgZGlyZWN0aW9uKSB7XG4gIHZhciB0b3BMZWZ0UGF0aCA9IFwiXCIuY29uY2F0KGNvcm5lclJhZGl1cy50b3BMZWZ0LCBcIiBcIikuY29uY2F0KGNvcm5lclJhZGl1cy50b3BMZWZ0LCBcIiBcIikuY29uY2F0KGRpcmVjdGlvbik7XG4gIHZhciB0b3BSaWdodFBhdGggPSBcIlwiLmNvbmNhdChjb3JuZXJSYWRpdXMudG9wUmlnaHQsIFwiIFwiKS5jb25jYXQoY29ybmVyUmFkaXVzLnRvcFJpZ2h0LCBcIiBcIikuY29uY2F0KGRpcmVjdGlvbik7XG4gIHZhciBib3R0b21MZWZ0UGF0aCA9IFwiXCIuY29uY2F0KGNvcm5lclJhZGl1cy5ib3R0b21MZWZ0LCBcIiBcIikuY29uY2F0KGNvcm5lclJhZGl1cy5ib3R0b21MZWZ0LCBcIiBcIikuY29uY2F0KGRpcmVjdGlvbik7XG4gIHZhciBib3R0b21SaWdodFBhdGggPSBcIlwiLmNvbmNhdChjb3JuZXJSYWRpdXMuYm90dG9tUmlnaHQsIFwiIFwiKS5jb25jYXQoY29ybmVyUmFkaXVzLmJvdHRvbVJpZ2h0LCBcIiBcIikuY29uY2F0KGRpcmVjdGlvbik7XG4gIHZhciBjb21tYW5kcyA9IFtcIk1cIiwgXCJBIFwiLmNvbmNhdChib3R0b21MZWZ0UGF0aCwgXCIsXCIpLCBcIkxcIiwgXCJBIFwiLmNvbmNhdCh0b3BMZWZ0UGF0aCwgXCIsXCIpLCBcIkxcIiwgXCJBIFwiLmNvbmNhdCh0b3BSaWdodFBhdGgsIFwiLFwiKSwgXCJMXCIsIFwiQSBcIi5jb25jYXQoYm90dG9tUmlnaHRQYXRoLCBcIixcIildO1xuICB2YXIgcGF0aCA9IGNvbW1hbmRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBjb21tYW5kLCBpKSB7XG4gICAgYWNjICs9IFwiXCIuY29uY2F0KGNvbW1hbmQsIFwiIFwiKS5jb25jYXQoY29vcmRzW2ldLngsIFwiLCBcIikuY29uY2F0KGNvb3Jkc1tpXS55LCBcIiBcXG5cIik7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgXCJcIik7XG4gIHJldHVybiBcIlwiLmNvbmNhdChwYXRoLCBcIiB6XCIpO1xufTtcblxudmFyIGdldFZlcnRpY2FsQmFyUG9pbnRzID0gZnVuY3Rpb24gKHBvc2l0aW9uLCBzaWduLCBjcikge1xuICB2YXIgeDAgPSBwb3NpdGlvbi54MCxcbiAgICAgIHgxID0gcG9zaXRpb24ueDEsXG4gICAgICB5MCA9IHBvc2l0aW9uLnkwLFxuICAgICAgeTEgPSBwb3NpdGlvbi55MTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzLCBtYXgtbGVuXG5cbiAgdmFyIGdldEhhbGZQb2ludHMgPSBmdW5jdGlvbiAoc2lkZSkge1xuICAgIHZhciBpc0xlZnQgPSBzaWRlID09PSBcIkxlZnRcIjtcbiAgICB2YXIgc2lnbkwgPSBpc0xlZnQgPyAxIDogLTE7XG4gICAgdmFyIHggPSBpc0xlZnQgPyB4MCA6IHgxO1xuICAgIHZhciBib3R0b21Qb2ludCA9IHtcbiAgICAgIHg6IHggKyBzaWduTCAqIGNyW1wiYm90dG9tXCIuY29uY2F0KHNpZGUpXSxcbiAgICAgIHk6IHkwXG4gICAgfTtcbiAgICB2YXIgYm90dG9tTWlkZGxlUG9pbnQgPSB7XG4gICAgICB4OiB4LFxuICAgICAgeTogeTAgLSBzaWduICogY3JbXCJib3R0b21cIi5jb25jYXQoc2lkZSldXG4gICAgfTtcbiAgICB2YXIgdG9wTWlkZGxlUG9pbnQgPSB7XG4gICAgICB4OiB4LFxuICAgICAgeTogeTEgKyBzaWduICogY3JbXCJ0b3BcIi5jb25jYXQoc2lkZSldXG4gICAgfTtcbiAgICB2YXIgdG9wUG9pbnQgPSB7XG4gICAgICB4OiB4ICsgc2lnbkwgKiBjcltcInRvcFwiLmNvbmNhdChzaWRlKV0sXG4gICAgICB5OiB5MVxuICAgIH07XG4gICAgdmFyIGhhc0ludGVyc2VjdGlvbiA9IHNpZ24gPT09IDEgPyB5MCAtIGNyW1wiYm90dG9tXCIuY29uY2F0KHNpZGUpXSA8IHkxICsgY3JbXCJ0b3BcIi5jb25jYXQoc2lkZSldIDogeTAgKyBjcltcImJvdHRvbVwiLmNvbmNhdChzaWRlKV0gPiB5MSAtIGNyW1widG9wXCIuY29uY2F0KHNpZGUpXTtcblxuICAgIGlmIChoYXNJbnRlcnNlY3Rpb24pIHtcbiAgICAgIHZhciB0b3BDZW50ZXIgPSBwb2ludCh4ICsgc2lnbkwgKiBjcltcInRvcFwiLmNvbmNhdChzaWRlKV0sIHkxICsgc2lnbiAqIGNyW1widG9wXCIuY29uY2F0KHNpZGUpXSk7XG4gICAgICB2YXIgdG9wQ2lyY2xlID0gY2lyY2xlKHRvcENlbnRlciwgY3JbXCJ0b3BcIi5jb25jYXQoc2lkZSldKTtcbiAgICAgIHZhciBib3R0b21DZW50ZXIgPSBwb2ludCh4ICsgc2lnbkwgKiBjcltcImJvdHRvbVwiLmNvbmNhdChzaWRlKV0sIHkwIC0gc2lnbiAqIGNyW1wiYm90dG9tXCIuY29uY2F0KHNpZGUpXSk7XG4gICAgICB2YXIgYm90dG9tQ2lyY2xlID0gY2lyY2xlKGJvdHRvbUNlbnRlciwgY3JbXCJib3R0b21cIi5jb25jYXQoc2lkZSldKTtcbiAgICAgIHZhciBjaXJjbGVJbnRlcnNlY3Rpb24gPSB0b3BDaXJjbGUuaW50ZXJzZWN0aW9uKGJvdHRvbUNpcmNsZSk7XG4gICAgICB2YXIgaGFzQXJjSW50ZXJzZWN0aW9uID0gY2lyY2xlSW50ZXJzZWN0aW9uLmxlbmd0aCA+IDA7XG5cbiAgICAgIGlmIChoYXNBcmNJbnRlcnNlY3Rpb24pIHtcbiAgICAgICAgdmFyIGFyY0ludGVyc2VjdGlvbiA9IGNpcmNsZUludGVyc2VjdGlvbltpc0xlZnQgPyAwIDogMV07XG4gICAgICAgIGJvdHRvbU1pZGRsZVBvaW50ID0ge1xuICAgICAgICAgIHg6IGFyY0ludGVyc2VjdGlvbi54LFxuICAgICAgICAgIHk6IGFyY0ludGVyc2VjdGlvbi55XG4gICAgICAgIH07XG4gICAgICAgIHRvcE1pZGRsZVBvaW50ID0ge1xuICAgICAgICAgIHg6IGFyY0ludGVyc2VjdGlvbi54LFxuICAgICAgICAgIHk6IGFyY0ludGVyc2VjdGlvbi55XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaGFzQm90dG9tTGluZVRvcEFyY0ludGVyc2VjdGlvbiA9IGNyW1widG9wXCIuY29uY2F0KHNpZGUpXSA+IGNyW1wiYm90dG9tXCIuY29uY2F0KHNpZGUpXTtcblxuICAgICAgICBpZiAoaGFzQm90dG9tTGluZVRvcEFyY0ludGVyc2VjdGlvbikge1xuICAgICAgICAgIHZhciBuZXdYID0gdG9wQ2lyY2xlLnNvbHZlWCh5MClbaXNMZWZ0ID8gMCA6IDFdO1xuICAgICAgICAgIGJvdHRvbVBvaW50ID0ge1xuICAgICAgICAgICAgeDogbmV3WCxcbiAgICAgICAgICAgIHk6IHkwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBib3R0b21NaWRkbGVQb2ludCA9IHtcbiAgICAgICAgICAgIHg6IG5ld1gsXG4gICAgICAgICAgICB5OiB5MFxuICAgICAgICAgIH07XG4gICAgICAgICAgdG9wTWlkZGxlUG9pbnQgPSB7XG4gICAgICAgICAgICB4OiBuZXdYLFxuICAgICAgICAgICAgeTogeTBcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfbmV3WCA9IGJvdHRvbUNpcmNsZS5zb2x2ZVgoeTEpW2lzTGVmdCA/IDAgOiAxXTtcbiAgICAgICAgICBib3R0b21NaWRkbGVQb2ludCA9IHtcbiAgICAgICAgICAgIHg6IF9uZXdYLFxuICAgICAgICAgICAgeTogeTFcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRvcE1pZGRsZVBvaW50ID0ge1xuICAgICAgICAgICAgeDogX25ld1gsXG4gICAgICAgICAgICB5OiB5MVxuICAgICAgICAgIH07XG4gICAgICAgICAgdG9wUG9pbnQgPSB7XG4gICAgICAgICAgICB4OiBfbmV3WCxcbiAgICAgICAgICAgIHk6IHkxXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwb2ludHMgPSBbYm90dG9tUG9pbnQsIGJvdHRvbU1pZGRsZVBvaW50LCB0b3BNaWRkbGVQb2ludCwgdG9wUG9pbnRdO1xuICAgIHJldHVybiBpc0xlZnQgPyBwb2ludHMgOiBwb2ludHMucmV2ZXJzZSgpO1xuICB9O1xuXG4gIHJldHVybiBnZXRIYWxmUG9pbnRzKFwiTGVmdFwiKS5jb25jYXQoZ2V0SGFsZlBvaW50cyhcIlJpZ2h0XCIpKTtcbn07XG5cbnZhciBnZXRIb3Jpem9udGFsQmFyUG9pbnRzID0gZnVuY3Rpb24gKHBvc2l0aW9uLCBzaWduLCBjcikge1xuICB2YXIgeTAgPSBwb3NpdGlvbi55MCxcbiAgICAgIHkxID0gcG9zaXRpb24ueTE7XG4gIHZhciB4MCA9IHBvc2l0aW9uLngwIDwgcG9zaXRpb24ueDEgPyBwb3NpdGlvbi54MCA6IHBvc2l0aW9uLngxO1xuICB2YXIgeDEgPSBwb3NpdGlvbi54MCA8IHBvc2l0aW9uLngxID8gcG9zaXRpb24ueDEgOiBwb3NpdGlvbi54MDsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzLCBtYXgtbGVuXG5cbiAgdmFyIGdldEhhbGZQb2ludHMgPSBmdW5jdGlvbiAoc2lkZSkge1xuICAgIHZhciBpc1RvcCA9IHNpZGUgPT09IFwidG9wXCI7XG4gICAgdmFyIHNpZ25MID0gaXNUb3AgPyAtMSA6IDE7XG4gICAgdmFyIHkgPSBpc1RvcCA/IHkxIDogeTA7XG4gICAgdmFyIGxlZnRQb2ludCA9IHtcbiAgICAgIHg6IHgwLFxuICAgICAgeTogeSAtIHNpZ25MICogY3JbXCJcIi5jb25jYXQoc2lkZSwgXCJMZWZ0XCIpXVxuICAgIH07XG4gICAgdmFyIGxlZnRNaWRkbGVQb2ludCA9IHtcbiAgICAgIHg6IHgwICsgY3JbXCJcIi5jb25jYXQoc2lkZSwgXCJMZWZ0XCIpXSxcbiAgICAgIHk6IHlcbiAgICB9O1xuICAgIHZhciByaWdodE1pZGRsZVBvaW50ID0ge1xuICAgICAgeDogeDEgLSBjcltcIlwiLmNvbmNhdChzaWRlLCBcIlJpZ2h0XCIpXSxcbiAgICAgIHk6IHlcbiAgICB9O1xuICAgIHZhciByaWdodFBvaW50ID0ge1xuICAgICAgeDogeDEsXG4gICAgICB5OiB5IC0gc2lnbkwgKiBjcltcIlwiLmNvbmNhdChzaWRlLCBcIlJpZ2h0XCIpXVxuICAgIH07XG4gICAgdmFyIGhhc0ludGVyc2VjdGlvbiA9IGxlZnRNaWRkbGVQb2ludC54ID4gcmlnaHRNaWRkbGVQb2ludC54O1xuXG4gICAgaWYgKGhhc0ludGVyc2VjdGlvbikge1xuICAgICAgdmFyIGxlZnRDZW50ZXIgPSBwb2ludCh4MCArIGNyW1wiXCIuY29uY2F0KHNpZGUsIFwiTGVmdFwiKV0sIHkgLSBzaWduTCAqIGNyW1wiXCIuY29uY2F0KHNpZGUsIFwiTGVmdFwiKV0pO1xuICAgICAgdmFyIGxlZnRDaXJjbGUgPSBjaXJjbGUobGVmdENlbnRlciwgY3JbXCJcIi5jb25jYXQoc2lkZSwgXCJMZWZ0XCIpXSk7XG4gICAgICB2YXIgcmlnaHRDZW50ZXIgPSBwb2ludCh4MSAtIGNyW1wiXCIuY29uY2F0KHNpZGUsIFwiUmlnaHRcIildLCB5IC0gc2lnbkwgKiBjcltcIlwiLmNvbmNhdChzaWRlLCBcIlJpZ2h0XCIpXSk7XG4gICAgICB2YXIgcmlnaHRDaXJjbGUgPSBjaXJjbGUocmlnaHRDZW50ZXIsIGNyW1wiXCIuY29uY2F0KHNpZGUsIFwiUmlnaHRcIildKTtcbiAgICAgIHZhciBjaXJjbGVJbnRlcnNlY3Rpb24gPSBsZWZ0Q2lyY2xlLmludGVyc2VjdGlvbihyaWdodENpcmNsZSk7XG4gICAgICB2YXIgaGFzQXJjSW50ZXJzZWN0aW9uID0gY2lyY2xlSW50ZXJzZWN0aW9uLmxlbmd0aCA+IDA7XG5cbiAgICAgIGlmIChoYXNBcmNJbnRlcnNlY3Rpb24pIHtcbiAgICAgICAgdmFyIGFyY0ludGVyc2VjdGlvbiA9IGNpcmNsZUludGVyc2VjdGlvbltzaWduID4gMCA/IDEgOiAwXTtcbiAgICAgICAgbGVmdE1pZGRsZVBvaW50ID0ge1xuICAgICAgICAgIHg6IGFyY0ludGVyc2VjdGlvbi54LFxuICAgICAgICAgIHk6IGFyY0ludGVyc2VjdGlvbi55XG4gICAgICAgIH07XG4gICAgICAgIHJpZ2h0TWlkZGxlUG9pbnQgPSB7XG4gICAgICAgICAgeDogYXJjSW50ZXJzZWN0aW9uLngsXG4gICAgICAgICAgeTogYXJjSW50ZXJzZWN0aW9uLnlcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBoYXNMZWZ0TGluZVJpZ2h0QXJjSW50ZXJzZWN0aW9uID0gY3JbXCJcIi5jb25jYXQoc2lkZSwgXCJSaWdodFwiKV0gPiBjcltcIlwiLmNvbmNhdChzaWRlLCBcIkxlZnRcIildO1xuXG4gICAgICAgIGlmIChoYXNMZWZ0TGluZVJpZ2h0QXJjSW50ZXJzZWN0aW9uKSB7XG4gICAgICAgICAgdmFyIG5ld1kgPSByaWdodENpcmNsZS5zb2x2ZVkoeDApW2lzVG9wID8gMCA6IDFdO1xuICAgICAgICAgIGxlZnRQb2ludCA9IHtcbiAgICAgICAgICAgIHg6IHgwLFxuICAgICAgICAgICAgeTogbmV3WVxuICAgICAgICAgIH07XG4gICAgICAgICAgbGVmdE1pZGRsZVBvaW50ID0ge1xuICAgICAgICAgICAgeDogeDAsXG4gICAgICAgICAgICB5OiBuZXdZXG4gICAgICAgICAgfTtcbiAgICAgICAgICByaWdodE1pZGRsZVBvaW50ID0ge1xuICAgICAgICAgICAgeDogeDAsXG4gICAgICAgICAgICB5OiBuZXdZXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgX25ld1kgPSBsZWZ0Q2lyY2xlLnNvbHZlWSh4MSlbaXNUb3AgPyAwIDogMV07XG4gICAgICAgICAgcmlnaHRQb2ludCA9IHtcbiAgICAgICAgICAgIHg6IHgxLFxuICAgICAgICAgICAgeTogX25ld1lcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJpZ2h0TWlkZGxlUG9pbnQgPSB7XG4gICAgICAgICAgICB4OiB4MSxcbiAgICAgICAgICAgIHk6IF9uZXdZXG4gICAgICAgICAgfTtcbiAgICAgICAgICBsZWZ0TWlkZGxlUG9pbnQgPSB7XG4gICAgICAgICAgICB4OiB4MSxcbiAgICAgICAgICAgIHk6IF9uZXdZXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbbGVmdFBvaW50LCBsZWZ0TWlkZGxlUG9pbnQsIHJpZ2h0TWlkZGxlUG9pbnQsIHJpZ2h0UG9pbnRdO1xuICB9O1xuXG4gIHZhciB0b3BQb2ludHMgPSBnZXRIYWxmUG9pbnRzKFwidG9wXCIpO1xuICB2YXIgYm90dG9tUG9pbnRzID0gZ2V0SGFsZlBvaW50cyhcImJvdHRvbVwiKTtcbiAgcmV0dXJuIFtib3R0b21Qb2ludHNbMV0sIGJvdHRvbVBvaW50c1swXV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSh0b3BQb2ludHMpLCBbLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgYm90dG9tUG9pbnRzWzNdLCBib3R0b21Qb2ludHNbMl1dKTtcbn07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG5cblxuZXhwb3J0IHZhciBnZXRWZXJ0aWNhbEJhclBhdGggPSBmdW5jdGlvbiAocHJvcHMsIHdpZHRoLCBjb3JuZXJSYWRpdXMpIHtcbiAgdmFyIHBvc2l0aW9uID0gZ2V0UG9zaXRpb24ocHJvcHMsIHdpZHRoKTtcbiAgdmFyIHNpZ24gPSBwb3NpdGlvbi55MCA+IHBvc2l0aW9uLnkxID8gMSA6IC0xO1xuICB2YXIgZGlyZWN0aW9uID0gc2lnbiA+IDAgPyBcIjAgMCAxXCIgOiBcIjAgMCAwXCI7XG4gIHZhciBwb2ludHMgPSBnZXRWZXJ0aWNhbEJhclBvaW50cyhwb3NpdGlvbiwgc2lnbiwgY29ybmVyUmFkaXVzKTtcbiAgcmV0dXJuIG1hcFBvaW50c1RvUGF0aChwb2ludHMsIGNvcm5lclJhZGl1cywgZGlyZWN0aW9uKTtcbn07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG5cbmV4cG9ydCB2YXIgZ2V0SG9yaXpvbnRhbEJhclBhdGggPSBmdW5jdGlvbiAocHJvcHMsIHdpZHRoLCBjb3JuZXJSYWRpdXMpIHtcbiAgdmFyIHBvc2l0aW9uID0gZ2V0UG9zaXRpb24ocHJvcHMsIHdpZHRoKTtcbiAgdmFyIHNpZ24gPSBwb3NpdGlvbi54MCA8IHBvc2l0aW9uLngxID8gMSA6IC0xO1xuICB2YXIgZGlyZWN0aW9uID0gXCIwIDAgMVwiO1xuICB2YXIgY3IgPSB7XG4gICAgdG9wUmlnaHQ6IHNpZ24gPiAwID8gY29ybmVyUmFkaXVzLnRvcExlZnQgOiBjb3JuZXJSYWRpdXMuYm90dG9tTGVmdCxcbiAgICBib3R0b21SaWdodDogc2lnbiA+IDAgPyBjb3JuZXJSYWRpdXMudG9wUmlnaHQgOiBjb3JuZXJSYWRpdXMuYm90dG9tUmlnaHQsXG4gICAgYm90dG9tTGVmdDogc2lnbiA+IDAgPyBjb3JuZXJSYWRpdXMuYm90dG9tUmlnaHQgOiBjb3JuZXJSYWRpdXMudG9wUmlnaHQsXG4gICAgdG9wTGVmdDogc2lnbiA+IDAgPyBjb3JuZXJSYWRpdXMuYm90dG9tTGVmdCA6IGNvcm5lclJhZGl1cy50b3BMZWZ0XG4gIH07XG4gIHZhciBwb2ludHMgPSBnZXRIb3Jpem9udGFsQmFyUG9pbnRzKHBvc2l0aW9uLCBzaWduLCBjcik7XG4gIHJldHVybiBtYXBQb2ludHNUb1BhdGgocG9pbnRzLCBjciwgZGlyZWN0aW9uKTtcbn07XG5leHBvcnQgdmFyIGdldFZlcnRpY2FsUG9sYXJCYXJQYXRoID0gZnVuY3Rpb24gKHByb3BzLCBjb3JuZXJSYWRpdXMpIHtcbiAgdmFyIGRhdHVtID0gcHJvcHMuZGF0dW0sXG4gICAgICBzY2FsZSA9IHByb3BzLnNjYWxlLFxuICAgICAgaW5kZXggPSBwcm9wcy5pbmRleCxcbiAgICAgIGFsaWdubWVudCA9IHByb3BzLmFsaWdubWVudCxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGU7XG4gIHZhciByMSA9IHNjYWxlLnkoZGF0dW0uX3kwIHx8IDApO1xuICB2YXIgcjIgPSBzY2FsZS55KGRhdHVtLl95MSAhPT0gdW5kZWZpbmVkID8gZGF0dW0uX3kxIDogZGF0dW0uX3kpO1xuICB2YXIgY3VycmVudEFuZ2xlID0gc2NhbGUueChkYXR1bS5feDEgIT09IHVuZGVmaW5lZCA/IGRhdHVtLl94MSA6IGRhdHVtLl94KTtcbiAgdmFyIHN0YXJ0O1xuICB2YXIgZW5kO1xuXG4gIGlmIChzdHlsZS53aWR0aCkge1xuICAgIHZhciB3aWR0aCA9IGdldEFuZ3VsYXJXaWR0aChwcm9wcywgc3R5bGUud2lkdGgpO1xuICAgIHZhciBzaXplID0gYWxpZ25tZW50ID09PSBcIm1pZGRsZVwiID8gd2lkdGggLyAyIDogd2lkdGg7XG4gICAgc3RhcnQgPSBhbGlnbm1lbnQgPT09IFwic3RhcnRcIiA/IGN1cnJlbnRBbmdsZSA6IGN1cnJlbnRBbmdsZSAtIHNpemU7XG4gICAgZW5kID0gYWxpZ25tZW50ID09PSBcImVuZFwiID8gY3VycmVudEFuZ2xlIDogY3VycmVudEFuZ2xlICsgc2l6ZTtcbiAgfSBlbHNlIHtcbiAgICBzdGFydCA9IGdldFN0YXJ0QW5nbGUocHJvcHMsIGluZGV4KTtcbiAgICBlbmQgPSBnZXRFbmRBbmdsZShwcm9wcywgaW5kZXgpO1xuICB9XG5cbiAgdmFyIGdldFBhdGggPSBmdW5jdGlvbiAoZWRnZSkge1xuICAgIHZhciBwYXRoRnVuY3Rpb24gPSBkM1NoYXBlLmFyYygpLmlubmVyUmFkaXVzKHIxKS5vdXRlclJhZGl1cyhyMikuc3RhcnRBbmdsZSh0cmFuc2Zvcm1BbmdsZShzdGFydCkpLmVuZEFuZ2xlKHRyYW5zZm9ybUFuZ2xlKGVuZCkpLmNvcm5lclJhZGl1cyhjb3JuZXJSYWRpdXNbZWRnZV0pO1xuICAgIHJldHVybiBwYXRoRnVuY3Rpb24oKTtcbiAgfTtcblxuICB2YXIgZ2V0UGF0aERhdGEgPSBmdW5jdGlvbiAoZWRnZSkge1xuICAgIHZhciByaWdodFBhdGggPSBnZXRQYXRoKFwiXCIuY29uY2F0KGVkZ2UsIFwiUmlnaHRcIikpO1xuICAgIHZhciByaWdodE1vdmVzID0gcmlnaHRQYXRoLm1hdGNoKC9bQS1aXS9nKTtcbiAgICB2YXIgcmlnaHRDb29yZHMgPSByaWdodFBhdGguc3BsaXQoL1tBLVpdLykuc2xpY2UoMSk7XG4gICAgdmFyIHJpZ2h0TWlkZGxlID0gcmlnaHRNb3Zlcy5pbmRleE9mKFwiTFwiKTtcbiAgICB2YXIgbGVmdFBhdGggPSBnZXRQYXRoKFwiXCIuY29uY2F0KGVkZ2UsIFwiTGVmdFwiKSk7XG4gICAgdmFyIGxlZnRNb3ZlcyA9IGxlZnRQYXRoLm1hdGNoKC9bQS1aXS9nKTtcbiAgICB2YXIgbGVmdENvb3JkcyA9IGxlZnRQYXRoLnNwbGl0KC9bQS1aXS8pLnNsaWNlKDEpO1xuICAgIHZhciBsZWZ0TWlkZGxlID0gbGVmdE1vdmVzLmluZGV4T2YoXCJMXCIpO1xuICAgIHJldHVybiB7XG4gICAgICByaWdodE1vdmVzOiByaWdodE1vdmVzLFxuICAgICAgcmlnaHRDb29yZHM6IHJpZ2h0Q29vcmRzLFxuICAgICAgcmlnaHRNaWRkbGU6IHJpZ2h0TWlkZGxlLFxuICAgICAgbGVmdE1vdmVzOiBsZWZ0TW92ZXMsXG4gICAgICBsZWZ0Q29vcmRzOiBsZWZ0Q29vcmRzLFxuICAgICAgbGVmdE1pZGRsZTogbGVmdE1pZGRsZVxuICAgIH07XG4gIH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xuXG5cbiAgdmFyIGdldFRvcFBhdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRvcFJpZ2h0ID0gY29ybmVyUmFkaXVzLnRvcFJpZ2h0LFxuICAgICAgICB0b3BMZWZ0ID0gY29ybmVyUmFkaXVzLnRvcExlZnQ7XG4gICAgdmFyIGFyY0xlbmd0aCA9IHIyICogTWF0aC5hYnMoZW5kIC0gc3RhcnQpO1xuXG4gICAgdmFyIF9nZXRQYXRoRGF0YSA9IGdldFBhdGhEYXRhKFwidG9wXCIpLFxuICAgICAgICByaWdodE1vdmVzID0gX2dldFBhdGhEYXRhLnJpZ2h0TW92ZXMsXG4gICAgICAgIHJpZ2h0Q29vcmRzID0gX2dldFBhdGhEYXRhLnJpZ2h0Q29vcmRzLFxuICAgICAgICByaWdodE1pZGRsZSA9IF9nZXRQYXRoRGF0YS5yaWdodE1pZGRsZSxcbiAgICAgICAgbGVmdE1vdmVzID0gX2dldFBhdGhEYXRhLmxlZnRNb3ZlcyxcbiAgICAgICAgbGVmdENvb3JkcyA9IF9nZXRQYXRoRGF0YS5sZWZ0Q29vcmRzLFxuICAgICAgICBsZWZ0TWlkZGxlID0gX2dldFBhdGhEYXRhLmxlZnRNaWRkbGU7XG5cbiAgICB2YXIgbW92ZXM7XG4gICAgdmFyIGNvb3JkcztcblxuICAgIGlmICh0b3BSaWdodCA9PT0gdG9wTGVmdCB8fCBhcmNMZW5ndGggPCAyICogdG9wUmlnaHQgKyAyICogdG9wTGVmdCkge1xuICAgICAgbW92ZXMgPSB0b3BSaWdodCA+IHRvcExlZnQgPyByaWdodE1vdmVzIDogbGVmdE1vdmVzO1xuICAgICAgY29vcmRzID0gdG9wUmlnaHQgPiB0b3BMZWZ0ID8gcmlnaHRDb29yZHMgOiBsZWZ0Q29vcmRzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICAgICAgdmFyIGlzU2hvcnQgPSBmdW5jdGlvbiAobWlkZGxlKSB7XG4gICAgICAgIHJldHVybiBtaWRkbGUgPCAzO1xuICAgICAgfTtcblxuICAgICAgdmFyIHJpZ2h0T2Zmc2V0ID0gdG9wTGVmdCA+IHRvcFJpZ2h0ICYmIGlzU2hvcnQocmlnaHRNaWRkbGUpID8gMSA6IDI7XG4gICAgICB2YXIgbGVmdE9mZnNldDtcblxuICAgICAgaWYgKHRvcFJpZ2h0ID4gdG9wTGVmdCkge1xuICAgICAgICB2YXIgZGVmYXVsdE9mZnNldCA9IGlzU2hvcnQocmlnaHRNaWRkbGUpID8gbGVmdE1pZGRsZSA6IGxlZnRNaWRkbGUgLSAyO1xuICAgICAgICBsZWZ0T2Zmc2V0ID0gaXNTaG9ydChsZWZ0TWlkZGxlKSA/IGxlZnRNaWRkbGUgLSAxIDogZGVmYXVsdE9mZnNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBfZGVmYXVsdE9mZnNldCA9IGlzU2hvcnQobGVmdE1pZGRsZSkgPyAxIDogMjtcblxuICAgICAgICBsZWZ0T2Zmc2V0ID0gaXNTaG9ydChyaWdodE1pZGRsZSkgPyBfZGVmYXVsdE9mZnNldCA6IGxlZnRNaWRkbGUgLSAyO1xuICAgICAgfVxuXG4gICAgICBtb3ZlcyA9IF90b0NvbnN1bWFibGVBcnJheShyaWdodE1vdmVzLnNsaWNlKDAsIHJpZ2h0T2Zmc2V0KSkuY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShsZWZ0TW92ZXMuc2xpY2UobGVmdE9mZnNldCkpKTtcbiAgICAgIGNvb3JkcyA9IF90b0NvbnN1bWFibGVBcnJheShyaWdodENvb3Jkcy5zbGljZSgwLCByaWdodE9mZnNldCkpLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkobGVmdENvb3Jkcy5zbGljZShsZWZ0T2Zmc2V0KSkpO1xuICAgIH1cblxuICAgIHZhciBtaWRkbGUgPSBtb3Zlcy5pbmRleE9mKFwiTFwiKTtcbiAgICB2YXIgc3ViTW92ZXMgPSBtb3Zlcy5zbGljZSgwLCBtaWRkbGUpO1xuICAgIHZhciBzdWJDb29yZHMgPSBjb29yZHMuc2xpY2UoMCwgbWlkZGxlKTtcbiAgICByZXR1cm4gc3ViTW92ZXMubWFwKGZ1bmN0aW9uIChtLCBpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kOiBtLFxuICAgICAgICBjb29yZHM6IHN1YkNvb3Jkc1tpXS5zcGxpdChcIixcIilcbiAgICAgIH07XG4gICAgfSk7XG4gIH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xuXG5cbiAgdmFyIGdldEJvdHRvbVBhdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGJvdHRvbVJpZ2h0ID0gY29ybmVyUmFkaXVzLmJvdHRvbVJpZ2h0LFxuICAgICAgICBib3R0b21MZWZ0ID0gY29ybmVyUmFkaXVzLmJvdHRvbUxlZnQ7XG4gICAgdmFyIGFyY0xlbmd0aCA9IHIxICogTWF0aC5hYnMoZW5kIC0gc3RhcnQpO1xuXG4gICAgdmFyIF9nZXRQYXRoRGF0YTIgPSBnZXRQYXRoRGF0YShcImJvdHRvbVwiKSxcbiAgICAgICAgcmlnaHRNb3ZlcyA9IF9nZXRQYXRoRGF0YTIucmlnaHRNb3ZlcyxcbiAgICAgICAgcmlnaHRDb29yZHMgPSBfZ2V0UGF0aERhdGEyLnJpZ2h0Q29vcmRzLFxuICAgICAgICByaWdodE1pZGRsZSA9IF9nZXRQYXRoRGF0YTIucmlnaHRNaWRkbGUsXG4gICAgICAgIGxlZnRNb3ZlcyA9IF9nZXRQYXRoRGF0YTIubGVmdE1vdmVzLFxuICAgICAgICBsZWZ0Q29vcmRzID0gX2dldFBhdGhEYXRhMi5sZWZ0Q29vcmRzLFxuICAgICAgICBsZWZ0TWlkZGxlID0gX2dldFBhdGhEYXRhMi5sZWZ0TWlkZGxlO1xuXG4gICAgdmFyIG1vdmVzO1xuICAgIHZhciBjb29yZHM7XG5cbiAgICBpZiAoYm90dG9tUmlnaHQgPT09IGJvdHRvbUxlZnQgfHwgYXJjTGVuZ3RoIDwgMiAqIGJvdHRvbVJpZ2h0ICsgMiAqIGJvdHRvbUxlZnQpIHtcbiAgICAgIG1vdmVzID0gYm90dG9tUmlnaHQgPiBib3R0b21MZWZ0ID8gcmlnaHRNb3ZlcyA6IGxlZnRNb3ZlcztcbiAgICAgIGNvb3JkcyA9IGJvdHRvbVJpZ2h0ID4gYm90dG9tTGVmdCA/IHJpZ2h0Q29vcmRzIDogbGVmdENvb3JkcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgICAgIHZhciBpc1Nob3J0ID0gZnVuY3Rpb24gKG0sIG1pZGRsZSkge1xuICAgICAgICByZXR1cm4gbS5sZW5ndGggLSBtaWRkbGUgPCA0O1xuICAgICAgfTtcblxuICAgICAgdmFyIHNob3J0UGF0aCA9IGJvdHRvbVJpZ2h0ID4gYm90dG9tTGVmdCA/IGlzU2hvcnQocmlnaHRNb3ZlcywgcmlnaHRNaWRkbGUpIDogaXNTaG9ydChsZWZ0TW92ZXMsIGxlZnRNaWRkbGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuXG4gICAgICB2YXIgcmlnaHRPZmZzZXQgPSBzaG9ydFBhdGggPyAtMSA6IC0zO1xuICAgICAgbW92ZXMgPSBfdG9Db25zdW1hYmxlQXJyYXkobGVmdE1vdmVzLnNsaWNlKDAsIGxlZnRNaWRkbGUgKyAyKSkuY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShyaWdodE1vdmVzLnNsaWNlKHJpZ2h0T2Zmc2V0KSkpO1xuICAgICAgY29vcmRzID0gX3RvQ29uc3VtYWJsZUFycmF5KGxlZnRDb29yZHMuc2xpY2UoMCwgbGVmdE1pZGRsZSArIDIpKS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHJpZ2h0Q29vcmRzLnNsaWNlKHJpZ2h0T2Zmc2V0KSkpO1xuICAgIH1cblxuICAgIHZhciBtaWRkbGUgPSBtb3Zlcy5pbmRleE9mKFwiTFwiKTtcbiAgICB2YXIgc3ViTW92ZXMgPSBtb3Zlcy5zbGljZShtaWRkbGUsIC0xKTtcbiAgICB2YXIgc3ViQ29vcmRzID0gY29vcmRzLnNsaWNlKG1pZGRsZSwgLTEpO1xuICAgIHJldHVybiBzdWJNb3Zlcy5tYXAoZnVuY3Rpb24gKG0sIGkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbW1hbmQ6IG0sXG4gICAgICAgIGNvb3Jkczogc3ViQ29vcmRzW2ldLnNwbGl0KFwiLFwiKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgdG9wUGF0aCA9IGdldFRvcFBhdGgoKTtcbiAgdmFyIGJvdHRvbVBhdGggPSBnZXRCb3R0b21QYXRoKCk7XG5cbiAgdmFyIG1vdmVzID0gX3RvQ29uc3VtYWJsZUFycmF5KHRvcFBhdGgpLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYm90dG9tUGF0aCkpO1xuXG4gIHZhciBwYXRoID0gbW92ZXMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBtb3ZlKSB7XG4gICAgbWVtbyArPSBcIlwiLmNvbmNhdChtb3ZlLmNvbW1hbmQsIFwiIFwiKS5jb25jYXQobW92ZS5jb29yZHMuam9pbigpKTtcbiAgICByZXR1cm4gbWVtbztcbiAgfSwgXCJcIik7XG4gIHJldHVybiBcIlwiLmNvbmNhdChwYXRoLCBcIiB6XCIpO1xufTtcbmV4cG9ydCB2YXIgZ2V0QmFyUGF0aCA9IGZ1bmN0aW9uIChwcm9wcywgd2lkdGgsIGNvcm5lclJhZGl1cykge1xuICBpZiAocHJvcHMuZ2V0UGF0aCkge1xuICAgIHJldHVybiBnZXRDdXN0b21CYXJQYXRoKHByb3BzLCB3aWR0aCk7XG4gIH1cblxuICByZXR1cm4gcHJvcHMuaG9yaXpvbnRhbCA/IGdldEhvcml6b250YWxCYXJQYXRoKHByb3BzLCB3aWR0aCwgY29ybmVyUmFkaXVzKSA6IGdldFZlcnRpY2FsQmFyUGF0aChwcm9wcywgd2lkdGgsIGNvcm5lclJhZGl1cyk7XG59O1xuZXhwb3J0IHZhciBnZXRQb2xhckJhclBhdGggPSBmdW5jdGlvbiAocHJvcHMsIGNvcm5lclJhZGl1cykge1xuICAvLyBUT0RPIFJhZGlhbCBiYXJzXG4gIHJldHVybiBnZXRWZXJ0aWNhbFBvbGFyQmFyUGF0aChwcm9wcywgY29ybmVyUmFkaXVzKTtcbn07IiwiaW1wb3J0IF9hc3NpZ24gZnJvbSBcImxvZGFzaC9hc3NpZ25cIjtcblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBDb21tb25Qcm9wcywgSGVscGVycywgUGF0aCB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbmltcG9ydCB7IGdldFN0eWxlLCBnZXRCYXJXaWR0aCwgZ2V0Q29ybmVyUmFkaXVzIH0gZnJvbSBcIi4vYmFyLWhlbHBlci1tZXRob2RzXCI7XG5pbXBvcnQgeyBnZXRQb2xhckJhclBhdGgsIGdldEJhclBhdGggfSBmcm9tIFwiLi9wYXRoLWhlbHBlci1tZXRob2RzXCI7XG5cbnZhciBldmFsdWF0ZVByb3BzID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIC8qKlxuICAgKiBQb3RlbnRpYWwgZXZhbHVhdGVkIHByb3BzIG9mIGZvbGxvd2luZyBtdXN0IGJlIGV2YWx1YXRlZCBpbiB0aGlzIG9yZGVyOlxuICAgKiAxKSBgc3R5bGVgXG4gICAqIDIpIGBiYXJXaWR0aGBcbiAgICogMykgYGNvcm5lclJhZGl1c2BcbiAgICpcbiAgICogRXZlcnl0aGluZyBlbHNlIGRvZXMgbm90IGhhdmUgdG8gYmUgZXZhbHVhdGVkIGluIGEgcGFydGljdWxhciBvcmRlcjpcbiAgICogYGFyaWFMYWJlbGBcbiAgICogYGRlc2NgXG4gICAqIGBpZGBcbiAgICogYHRhYkluZGV4YFxuICAgKi9cbiAgdmFyIHN0eWxlID0gZ2V0U3R5bGUocHJvcHMuc3R5bGUsIHByb3BzKTtcbiAgdmFyIGJhcldpZHRoID0gZ2V0QmFyV2lkdGgocHJvcHMuYmFyV2lkdGgsIF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgc3R5bGU6IHN0eWxlXG4gIH0pKTtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IGdldENvcm5lclJhZGl1cyhwcm9wcy5jb3JuZXJSYWRpdXMsIF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIGJhcldpZHRoOiBiYXJXaWR0aFxuICB9KSk7XG4gIHZhciBhcmlhTGFiZWwgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy5hcmlhTGFiZWwsIHByb3BzKTtcbiAgdmFyIGRlc2MgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy5kZXNjLCBwcm9wcyk7XG4gIHZhciBpZCA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmlkLCBwcm9wcyk7XG4gIHZhciB0YWJJbmRleCA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLnRhYkluZGV4LCBwcm9wcyk7XG4gIHJldHVybiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgIGFyaWFMYWJlbDogYXJpYUxhYmVsLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBiYXJXaWR0aDogYmFyV2lkdGgsXG4gICAgY29ybmVyUmFkaXVzOiBjb3JuZXJSYWRpdXMsXG4gICAgZGVzYzogZGVzYyxcbiAgICBpZDogaWQsXG4gICAgdGFiSW5kZXg6IHRhYkluZGV4XG4gIH0pO1xufTtcblxudmFyIEJhciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBwcm9wcyA9IGV2YWx1YXRlUHJvcHMocHJvcHMpO1xuICB2YXIgX3Byb3BzID0gcHJvcHMsXG4gICAgICBwb2xhciA9IF9wcm9wcy5wb2xhcixcbiAgICAgIG9yaWdpbiA9IF9wcm9wcy5vcmlnaW4sXG4gICAgICBzdHlsZSA9IF9wcm9wcy5zdHlsZSxcbiAgICAgIGJhcldpZHRoID0gX3Byb3BzLmJhcldpZHRoLFxuICAgICAgY29ybmVyUmFkaXVzID0gX3Byb3BzLmNvcm5lclJhZGl1cztcbiAgdmFyIHBhdGggPSBwb2xhciA/IGdldFBvbGFyQmFyUGF0aChwcm9wcywgY29ybmVyUmFkaXVzKSA6IGdldEJhclBhdGgocHJvcHMsIGJhcldpZHRoLCBjb3JuZXJSYWRpdXMpO1xuICB2YXIgZGVmYXVsdFRyYW5zZm9ybSA9IHBvbGFyICYmIG9yaWdpbiA/IFwidHJhbnNsYXRlKFwiLmNvbmNhdChvcmlnaW4ueCwgXCIsIFwiKS5jb25jYXQob3JpZ2luLnksIFwiKVwiKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChwcm9wcy5wYXRoQ29tcG9uZW50LCBfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcy5ldmVudHMsIHtcbiAgICBcImFyaWEtbGFiZWxcIjogcHJvcHMuYXJpYUxhYmVsLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBkOiBwYXRoLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIGNsaXBQYXRoOiBwcm9wcy5jbGlwUGF0aCxcbiAgICBkZXNjOiBwcm9wcy5kZXNjLFxuICAgIGluZGV4OiBwcm9wcy5pbmRleCxcbiAgICByb2xlOiBwcm9wcy5yb2xlLFxuICAgIHNoYXBlUmVuZGVyaW5nOiBwcm9wcy5zaGFwZVJlbmRlcmluZyxcbiAgICB0cmFuc2Zvcm06IHByb3BzLnRyYW5zZm9ybSB8fCBkZWZhdWx0VHJhbnNmb3JtLFxuICAgIHRhYkluZGV4OiBwcm9wcy50YWJJbmRleFxuICB9KSk7XG59O1xuXG5CYXIucHJvcFR5cGVzID0gX29iamVjdFNwcmVhZCh7fSwgQ29tbW9uUHJvcHMucHJpbWl0aXZlUHJvcHMsIHtcbiAgYWxpZ25tZW50OiBQcm9wVHlwZXMub25lT2YoW1wic3RhcnRcIiwgXCJtaWRkbGVcIiwgXCJlbmRcIl0pLFxuICBiYXJSYXRpbzogUHJvcFR5cGVzLm51bWJlcixcbiAgYmFyV2lkdGg6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5mdW5jXSksXG4gIGNvcm5lclJhZGl1czogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgdG9wOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIHRvcExlZnQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgdG9wUmlnaHQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgYm90dG9tOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIGJvdHRvbUxlZnQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgYm90dG9tUmlnaHQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5mdW5jXSlcbiAgfSldKSxcbiAgZGF0dW06IFByb3BUeXBlcy5vYmplY3QsXG4gIGdldFBhdGg6IFByb3BUeXBlcy5mdW5jLFxuICBob3Jpem9udGFsOiBQcm9wVHlwZXMuYm9vbCxcbiAgcGF0aENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICB4OiBQcm9wVHlwZXMubnVtYmVyLFxuICB5OiBQcm9wVHlwZXMubnVtYmVyLFxuICB5MDogUHJvcFR5cGVzLm51bWJlclxufSk7XG5CYXIuZGVmYXVsdFByb3BzID0ge1xuICBkZWZhdWx0QmFyV2lkdGg6IDgsXG4gIHBhdGhDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUGF0aCwgbnVsbCksXG4gIHJvbGU6IFwicHJlc2VudGF0aW9uXCIsXG4gIHNoYXBlUmVuZGVyaW5nOiBcImF1dG9cIlxufTtcbmV4cG9ydCBkZWZhdWx0IEJhcjsiLCJmdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHsgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTsgfSkpOyB9IG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgZ2V0QmFzZVByb3BzIH0gZnJvbSBcIi4vaGVscGVyLW1ldGhvZHNcIjtcbmltcG9ydCBCYXIgZnJvbSBcIi4vYmFyXCI7XG5pbXBvcnQgeyBIZWxwZXJzLCBWaWN0b3J5TGFiZWwsIFZpY3RvcnlDb250YWluZXIsIFZpY3RvcnlUaGVtZSwgQ29tbW9uUHJvcHMsIGFkZEV2ZW50cywgRGF0YSwgRG9tYWluIH0gZnJvbSBcInZpY3RvcnktY29yZVwiO1xudmFyIGZhbGxiYWNrUHJvcHMgPSB7XG4gIHdpZHRoOiA0NTAsXG4gIGhlaWdodDogMzAwLFxuICBwYWRkaW5nOiA1MFxufTtcbnZhciBkZWZhdWx0RGF0YSA9IFt7XG4gIHg6IDEsXG4gIHk6IDFcbn0sIHtcbiAgeDogMixcbiAgeTogMlxufSwge1xuICB4OiAzLFxuICB5OiAzXG59LCB7XG4gIHg6IDQsXG4gIHk6IDRcbn1dO1xuXG52YXIgVmljdG9yeUJhciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoVmljdG9yeUJhciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gVmljdG9yeUJhcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmljdG9yeUJhcik7XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKFZpY3RvcnlCYXIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihWaWN0b3J5QmFyKSkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVmljdG9yeUJhciwgW3tcbiAgICBrZXk6IFwic2hvdWxkQW5pbWF0ZVwiLFxuICAgIC8vIE92ZXJyaWRkZW4gaW4gbmF0aXZlIHZlcnNpb25zXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZEFuaW1hdGUoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnByb3BzLmFuaW1hdGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgYW5pbWF0aW9uV2hpdGVsaXN0ID0gVmljdG9yeUJhci5hbmltYXRpb25XaGl0ZWxpc3QsXG4gICAgICAgICAgcm9sZSA9IFZpY3RvcnlCYXIucm9sZTtcbiAgICAgIHZhciBwcm9wcyA9IEhlbHBlcnMubW9kaWZ5UHJvcHModGhpcy5wcm9wcywgZmFsbGJhY2tQcm9wcywgcm9sZSk7XG5cbiAgICAgIGlmICh0aGlzLnNob3VsZEFuaW1hdGUoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmltYXRlQ29tcG9uZW50KHByb3BzLCBhbmltYXRpb25XaGl0ZWxpc3QpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnJlbmRlckRhdGEocHJvcHMpO1xuICAgICAgcmV0dXJuIHByb3BzLnN0YW5kYWxvbmUgPyB0aGlzLnJlbmRlckNvbnRhaW5lcihwcm9wcy5jb250YWluZXJDb21wb25lbnQsIGNoaWxkcmVuKSA6IGNoaWxkcmVuO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBWaWN0b3J5QmFyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUJhciwgXCJhbmltYXRpb25XaGl0ZWxpc3RcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogW1wiZGF0YVwiLCBcImRvbWFpblwiLCBcImhlaWdodFwiLCBcInBhZGRpbmdcIiwgXCJzdHlsZVwiLCBcIndpZHRoXCJdXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5QmFyLCBcImRpc3BsYXlOYW1lXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFwiVmljdG9yeUJhclwiXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5QmFyLCBcInJvbGVcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogXCJiYXJcIlxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUJhciwgXCJkZWZhdWx0VHJhbnNpdGlvbnNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZToge1xuICAgIG9uTG9hZDoge1xuICAgICAgZHVyYXRpb246IDIwMDAsXG4gICAgICBiZWZvcmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfeTogMCxcbiAgICAgICAgICBfeTE6IDAsXG4gICAgICAgICAgX3kwOiAwXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgYWZ0ZXI6IGZ1bmN0aW9uIChkYXR1bSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF95OiBkYXR1bS5feSxcbiAgICAgICAgICBfeTE6IGRhdHVtLl95MSxcbiAgICAgICAgICBfeTA6IGRhdHVtLl95MFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gICAgb25FeGl0OiB7XG4gICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgYmVmb3JlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX3k6IDAsXG4gICAgICAgICAgeU9mZnNldDogMFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gICAgb25FbnRlcjoge1xuICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgIGJlZm9yZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF95OiAwLFxuICAgICAgICAgIF95MTogMCxcbiAgICAgICAgICBfeTA6IDBcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBhZnRlcjogZnVuY3Rpb24gKGRhdHVtKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX3k6IGRhdHVtLl95LFxuICAgICAgICAgIF95MTogZGF0dW0uX3kxLFxuICAgICAgICAgIF95MDogZGF0dW0uX3kwXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5QmFyLCBcInByb3BUeXBlc1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBfb2JqZWN0U3ByZWFkKHt9LCBDb21tb25Qcm9wcy5iYXNlUHJvcHMsIENvbW1vblByb3BzLmRhdGFQcm9wcywge1xuICAgIGFsaWdubWVudDogUHJvcFR5cGVzLm9uZU9mKFtcInN0YXJ0XCIsIFwibWlkZGxlXCIsIFwiZW5kXCJdKSxcbiAgICBiYXJSYXRpbzogUHJvcFR5cGVzLm51bWJlcixcbiAgICBiYXJXaWR0aDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBjb3JuZXJSYWRpdXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5mdW5jLCBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgdG9wOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgICAgdG9wTGVmdDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICAgIHRvcFJpZ2h0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgICAgYm90dG9tOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgICAgYm90dG9tTGVmdDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICAgIGJvdHRvbVJpZ2h0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuZnVuY10pXG4gICAgfSldKSxcbiAgICBnZXRQYXRoOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBob3Jpem9udGFsOiBQcm9wVHlwZXMuYm9vbFxuICB9KVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUJhciwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZToge1xuICAgIGNvbnRhaW5lckNvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5Q29udGFpbmVyLCBudWxsKSxcbiAgICBkYXRhOiBkZWZhdWx0RGF0YSxcbiAgICBkYXRhQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KEJhciwgbnVsbCksXG4gICAgZ3JvdXBDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICAgIHJvbGU6IFwicHJlc2VudGF0aW9uXCJcbiAgICB9KSxcbiAgICBsYWJlbENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5TGFiZWwsIG51bGwpLFxuICAgIHNhbXBsZXM6IDUwLFxuICAgIHNvcnRPcmRlcjogXCJhc2NlbmRpbmdcIixcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRoZW1lOiBWaWN0b3J5VGhlbWUuZ3JheXNjYWxlXG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlCYXIsIFwiZ2V0RG9tYWluXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IERvbWFpbi5nZXREb21haW5XaXRoWmVyb1xufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUJhciwgXCJnZXREYXRhXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IERhdGEuZ2V0RGF0YVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUJhciwgXCJnZXRCYXNlUHJvcHNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgcmV0dXJuIGdldEJhc2VQcm9wcyhwcm9wcywgZmFsbGJhY2tQcm9wcyk7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlCYXIsIFwiZXhwZWN0ZWRDb21wb25lbnRzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFtcImRhdGFDb21wb25lbnRcIiwgXCJsYWJlbENvbXBvbmVudFwiLCBcImdyb3VwQ29tcG9uZW50XCIsIFwiY29udGFpbmVyQ29tcG9uZW50XCJdXG59KTtcbmV4cG9ydCBkZWZhdWx0IGFkZEV2ZW50cyhWaWN0b3J5QmFyKTsiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBob2lzdE5vblJlYWN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgeyBWaWN0b3J5QmFyIH0gZnJvbSAndmljdG9yeS1iYXInO1xuaW1wb3J0IHsgQ2hhcnRDb250YWluZXIgfSBmcm9tICcuLi9DaGFydENvbnRhaW5lcic7XG5pbXBvcnQgeyBnZXRUaGVtZSB9IGZyb20gJy4uL0NoYXJ0VXRpbHMnO1xuZXhwb3J0IGNvbnN0IENoYXJ0QmFyID0gKF9hKSA9PiB7XG4gICAgdmFyIHsgY29udGFpbmVyQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydENvbnRhaW5lciwgbnVsbCksIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgXG4gICAgLy8gZGVzdHJ1Y3R1cmUgbGFzdFxuICAgIHRoZW1lID0gZ2V0VGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSB9ID0gX2EsIHJlc3QgPSBfX3Jlc3QoX2EsIFtcImNvbnRhaW5lckNvbXBvbmVudFwiLCBcInRoZW1lQ29sb3JcIiwgXCJ0aGVtZVZhcmlhbnRcIiwgXCJ0aGVtZVwiXSk7XG4gICAgLy8gQ2xvbmUgc28gdXNlcnMgY2FuIG92ZXJyaWRlIGNvbnRhaW5lciBwcm9wc1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IFJlYWN0LmNsb25lRWxlbWVudChjb250YWluZXJDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oeyB0aGVtZSB9LCBjb250YWluZXJDb21wb25lbnQucHJvcHMpKTtcbiAgICAvLyBOb3RlOiBjb250YWluZXJDb21wb25lbnQgaXMgcmVxdWlyZWQgZm9yIHRoZW1lXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUJhciwgT2JqZWN0LmFzc2lnbih7IGNvbnRhaW5lckNvbXBvbmVudDogY29udGFpbmVyLCB0aGVtZTogdGhlbWUgfSwgcmVzdCkpO1xufTtcbkNoYXJ0QmFyLmRpc3BsYXlOYW1lID0gJ0NoYXJ0QmFyJztcbi8vIE5vdGU6IFZpY3RvcnlCYXIuZ2V0RG9tYWluICYgVmljdG9yeUJhci5yb2xlIG11c3QgYmUgaG9pc3RlZFxuaG9pc3ROb25SZWFjdFN0YXRpY3MoQ2hhcnRCYXIsIFZpY3RvcnlCYXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2hhcnRCYXIuanMubWFwIiwiZXhwb3J0ICogZnJvbSAnLi9DaGFydEJhcic7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IENoYXJ0QnVsbGV0U3R5bGVzIH0gZnJvbSAnLi4vLi4vQ2hhcnRUaGVtZSc7XG5pbXBvcnQgeyBnZXRCdWxsZXRDb21wYXJhdGl2ZUVycm9yTWVhc3VyZVRoZW1lLCBnZXRCdWxsZXRDb21wYXJhdGl2ZU1lYXN1cmVUaGVtZSwgZ2V0QnVsbGV0Q29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZVRoZW1lLCBnZXRCdWxsZXRQcmltYXJ5RG90TWVhc3VyZVRoZW1lLCBnZXRCdWxsZXRQcmltYXJ5U2VnbWVudGVkTWVhc3VyZVRoZW1lLCBnZXRCdWxsZXRRdWFsaXRhdGl2ZVJhbmdlVGhlbWUgfSBmcm9tICcuLi8uLi9DaGFydFV0aWxzJztcbmNvbnN0IHNjYWxlRGltZW5zaW9ucyA9ICh7IGRlZmF1bHRTaXplLCBoZWlnaHQsIGhvcml6b250YWwgPSB0cnVlLCBzY2FsZSA9IDEsIHZhbHVlLCB3aWR0aCB9KSA9PiB7XG4gICAgaWYgKGhvcml6b250YWwgJiYgaGVpZ2h0ID4gZGVmYXVsdFNpemUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICsgKGhlaWdodCAtIGRlZmF1bHRTaXplKSAqIHNjYWxlO1xuICAgIH1cbiAgICBlbHNlIGlmIChob3Jpem9udGFsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAtIChkZWZhdWx0U2l6ZSAtIGhlaWdodCkgKiBzY2FsZTtcbiAgICB9XG4gICAgZWxzZSBpZiAod2lkdGggPiBkZWZhdWx0U2l6ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgKyAod2lkdGggLSBkZWZhdWx0U2l6ZSkgKiBzY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlIC0gKGRlZmF1bHRTaXplIC0gd2lkdGgpICogc2NhbGU7XG59O1xuLy8gU2NhbGUgYmFyIHdpZHRoIHBlciB0aGUgZ2l2ZW4gc2l6ZSBwcm9wZXJ0aWVzXG5leHBvcnQgY29uc3Qgc2NhbGVCYXJXaWR0aCA9IChwcm9wcykgPT4gTWF0aC5tYXgoc2NhbGVEaW1lbnNpb25zKHByb3BzKSwgMCk7XG4vLyBTY2FsZSBzaXplIHBlciB0aGUgZ2l2ZW4gc2l6ZSBwcm9wZXJ0aWVzXG5leHBvcnQgY29uc3Qgc2NhbGVTaXplID0gKF9hKSA9PiB7XG4gICAgdmFyIHsgdmFsdWUgfSA9IF9hLCByZXN0ID0gX19yZXN0KF9hLCBbXCJ2YWx1ZVwiXSk7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoc2NhbGVEaW1lbnNpb25zKE9iamVjdC5hc3NpZ24oeyBzY2FsZTogMSAvIHZhbHVlLCB2YWx1ZSB9LCByZXN0KSkpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRDb21wYXJhdGl2ZU1lYXN1cmVFcnJvcldpZHRoID0gKHsgaGVpZ2h0LCBob3Jpem9udGFsLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIHdpZHRoLCBcbi8vIGRlc3RydWN0dXJlIGxhc3RcbnRoZW1lID0gZ2V0QnVsbGV0Q29tcGFyYXRpdmVFcnJvck1lYXN1cmVUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpIH0pID0+IHNjYWxlQmFyV2lkdGgoe1xuICAgIGRlZmF1bHRTaXplOiB0aGVtZS5iYXIuaGVpZ2h0LFxuICAgIGhlaWdodCxcbiAgICBob3Jpem9udGFsLFxuICAgIHZhbHVlOiBDaGFydEJ1bGxldFN0eWxlcy5jb21wYXJhdGl2ZU1lYXN1cmVFcnJvcldpZHRoLFxuICAgIHdpZHRoXG59KTtcbmV4cG9ydCBjb25zdCBnZXRDb21wYXJhdGl2ZU1lYXN1cmVXaWR0aCA9ICh7IGhlaWdodCwgaG9yaXpvbnRhbCwgdGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCB3aWR0aCwgXG4vLyBkZXN0cnVjdHVyZSBsYXN0XG50aGVtZSA9IGdldEJ1bGxldENvbXBhcmF0aXZlTWVhc3VyZVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCkgfSkgPT4gc2NhbGVCYXJXaWR0aCh7XG4gICAgZGVmYXVsdFNpemU6IHRoZW1lLmJhci5oZWlnaHQsXG4gICAgaGVpZ2h0LFxuICAgIGhvcml6b250YWwsXG4gICAgdmFsdWU6IENoYXJ0QnVsbGV0U3R5bGVzLmNvbXBhcmF0aXZlTWVhc3VyZVdpZHRoLFxuICAgIHdpZHRoXG59KTtcbmV4cG9ydCBjb25zdCBnZXRDb21wYXJhdGl2ZU1lYXN1cmVXYXJuaW5nV2lkdGggPSAoeyBoZWlnaHQsIGhvcml6b250YWwsIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgd2lkdGgsIFxuLy8gZGVzdHJ1Y3R1cmUgbGFzdFxudGhlbWUgPSBnZXRCdWxsZXRDb21wYXJhdGl2ZVdhcm5pbmdNZWFzdXJlVGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSB9KSA9PiBzY2FsZUJhcldpZHRoKHtcbiAgICBkZWZhdWx0U2l6ZTogdGhlbWUuYmFyLmhlaWdodCxcbiAgICBoZWlnaHQsXG4gICAgaG9yaXpvbnRhbCxcbiAgICB2YWx1ZTogQ2hhcnRCdWxsZXRTdHlsZXMuY29tcGFyYXRpdmVNZWFzdXJlV2FybmluZ1dpZHRoLFxuICAgIHdpZHRoXG59KTtcbmV4cG9ydCBjb25zdCBnZXRQcmltYXJ5RG90TWVhc3VyZVNpemUgPSAoeyBoZWlnaHQsIGhvcml6b250YWwsIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgd2lkdGgsIFxuLy8gZGVzdHJ1Y3R1cmUgbGFzdFxudGhlbWUgPSBnZXRCdWxsZXRQcmltYXJ5RG90TWVhc3VyZVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCkgfSkgPT4gc2NhbGVTaXplKHtcbiAgICBkZWZhdWx0U2l6ZTogdGhlbWUuZ3JvdXAuaGVpZ2h0LFxuICAgIGhlaWdodCxcbiAgICBob3Jpem9udGFsLFxuICAgIHZhbHVlOiBDaGFydEJ1bGxldFN0eWxlcy5wcmltYXJ5RG90TWVhc3VyZVNpemUsXG4gICAgd2lkdGhcbn0pO1xuZXhwb3J0IGNvbnN0IGdldFByaW1hcnlTZWdtZW50ZWRNZWFzdXJlV2lkdGggPSAoeyBoZWlnaHQsIGhvcml6b250YWwsIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgd2lkdGgsIFxuLy8gZGVzdHJ1Y3R1cmUgbGFzdFxudGhlbWUgPSBnZXRCdWxsZXRQcmltYXJ5U2VnbWVudGVkTWVhc3VyZVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCkgfSkgPT4gc2NhbGVCYXJXaWR0aCh7XG4gICAgZGVmYXVsdFNpemU6IHRoZW1lLmdyb3VwLmhlaWdodCxcbiAgICBoZWlnaHQsXG4gICAgaG9yaXpvbnRhbCxcbiAgICBzY2FsZTogMC4zLFxuICAgIHZhbHVlOiBDaGFydEJ1bGxldFN0eWxlcy5wcmltYXJ5U2VnbWVudGVkTWVhc3VyZVdpZHRoLFxuICAgIHdpZHRoXG59KTtcbmV4cG9ydCBjb25zdCBnZXRRdWFsaXRhdGl2ZVJhbmdlQmFyV2lkdGggPSAoeyBoZWlnaHQsIGhvcml6b250YWwsIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgd2lkdGgsIFxuLy8gZGVzdHJ1Y3R1cmUgbGFzdFxudGhlbWUgPSBnZXRCdWxsZXRRdWFsaXRhdGl2ZVJhbmdlVGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSB9KSA9PiBzY2FsZUJhcldpZHRoKHtcbiAgICBkZWZhdWx0U2l6ZTogdGhlbWUuZ3JvdXAuaGVpZ2h0LFxuICAgIGhlaWdodCxcbiAgICBob3Jpem9udGFsLFxuICAgIHZhbHVlOiBDaGFydEJ1bGxldFN0eWxlcy5xdWFsaXRhdGl2ZVJhbmdlV2lkdGgsXG4gICAgd2lkdGhcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2hhcnQtYnVsbGV0LXNpemUuanMubWFwIiwiaW1wb3J0IHsgRGF0YSB9IGZyb20gJ3ZpY3RvcnktY29yZSc7XG4vLyBSZXR1cm5zIHRoZSBtaW4gYW5kIG1heCBkb21haW4gZm9yIGdpdmVuIGRhdGFcbmV4cG9ydCBjb25zdCBnZXREb21haW4gPSAoeyBkYXRhLCBtYXhEb21haW4sIG1pbkRvbWFpbiwgeCwgeSB9KSA9PiB7XG4gICAgLy8geC1kb21haW5cbiAgICBsZXQgeExvdyA9IDA7XG4gICAgbGV0IHhIaWdoID0gMDtcbiAgICBsZXQgeExvd1NlYXJjaCA9IHRydWU7XG4gICAgbGV0IHhIaWdoU2VhcmNoID0gdHJ1ZTtcbiAgICBpZiAobWluRG9tYWluICE9PSB1bmRlZmluZWQgJiYgbWluRG9tYWluLnggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB4TG93ID0gbWluRG9tYWluLng7XG4gICAgICAgIHhMb3dTZWFyY2ggPSBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSBpZiAobWluRG9tYWluICE9PSB1bmRlZmluZWQgJiYgbWluRG9tYWluLnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB4TG93ID0gbWluRG9tYWluO1xuICAgICAgICB4TG93U2VhcmNoID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChtYXhEb21haW4gIT09IHVuZGVmaW5lZCAmJiBtYXhEb21haW4ueCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHhIaWdoID0gbWF4RG9tYWluLng7XG4gICAgICAgIHhIaWdoU2VhcmNoID0gZmFsc2U7XG4gICAgfVxuICAgIGVsc2UgaWYgKG1heERvbWFpbiAhPT0gdW5kZWZpbmVkICYmIG1heERvbWFpbi55ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgeEhpZ2ggPSBtYXhEb21haW47XG4gICAgICAgIHhIaWdoU2VhcmNoID0gZmFsc2U7XG4gICAgfVxuICAgIC8vIHktZG9tYWluXG4gICAgbGV0IHlMb3cgPSAwO1xuICAgIGxldCB5SGlnaCA9IDA7XG4gICAgbGV0IHlMb3dTZWFyY2ggPSB0cnVlO1xuICAgIGxldCB5SGlnaFNlYXJjaCA9IHRydWU7XG4gICAgaWYgKG1pbkRvbWFpbiAhPT0gdW5kZWZpbmVkICYmIG1pbkRvbWFpbi55ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgeUxvdyA9IG1pbkRvbWFpbi55O1xuICAgICAgICB5TG93U2VhcmNoID0gZmFsc2U7XG4gICAgfVxuICAgIGVsc2UgaWYgKG1pbkRvbWFpbiAhPT0gdW5kZWZpbmVkICYmIG1pbkRvbWFpbi54ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgeUxvdyA9IG1pbkRvbWFpbjtcbiAgICAgICAgeUxvd1NlYXJjaCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAobWF4RG9tYWluICE9PSB1bmRlZmluZWQgJiYgbWF4RG9tYWluLnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB5SGlnaCA9IG1heERvbWFpbi55O1xuICAgICAgICB5SGlnaFNlYXJjaCA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmIChtYXhEb21haW4gIT09IHVuZGVmaW5lZCAmJiBtYXhEb21haW4ueCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHlIaWdoID0gbWF4RG9tYWluO1xuICAgICAgICB5SGlnaFNlYXJjaCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBTZWFyY2ggZGF0YSBmb3IgbWF4IC8gbWluIHJhbmdlXG4gICAgY29uc3QgZGF0dW0gPSBEYXRhLmZvcm1hdERhdGEoZGF0YSwgeyB4LCB5IH0sIFsneCcsICd5J10pO1xuICAgIGRhdHVtLmZvckVhY2goKGRhdGFQb2ludCkgPT4ge1xuICAgICAgICBpZiAoeExvd1NlYXJjaCkge1xuICAgICAgICAgICAgaWYgKGRhdGFQb2ludC5feCA8IHhMb3cpIHtcbiAgICAgICAgICAgICAgICB4TG93ID0gZGF0YVBvaW50Ll94O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh4SGlnaFNlYXJjaCkge1xuICAgICAgICAgICAgaWYgKGRhdGFQb2ludC5feCA+IHhIaWdoKSB7XG4gICAgICAgICAgICAgICAgeEhpZ2ggPSBkYXRhUG9pbnQuX3g7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHlMb3dTZWFyY2gpIHtcbiAgICAgICAgICAgIGlmIChkYXRhUG9pbnQuX3kgPCB5TG93KSB7XG4gICAgICAgICAgICAgICAgeUxvdyA9IGRhdGFQb2ludC5feTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoeUhpZ2hTZWFyY2gpIHtcbiAgICAgICAgICAgIGlmIChkYXRhUG9pbnQuX3kgPiB5SGlnaCkge1xuICAgICAgICAgICAgICAgIHlIaWdoID0gZGF0YVBvaW50Ll95O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgeDogW3hMb3csIHhIaWdoXSwgeTogW3lMb3csIHlIaWdoXSB9O1xufTtcbmV4cG9ydCBjb25zdCBnZXREb21haW5zID0gKHsgbWF4RG9tYWluLCBtaW5Eb21haW4sIHNvdXJjZXMgfSkgPT4ge1xuICAgIGNvbnN0IGRvbWFpbnMgPSBbXTtcbiAgICBzb3VyY2VzLmZvckVhY2goc291cmNlID0+IHtcbiAgICAgICAgY29uc3QgeyBkYXRhOiBjb21wRGF0YSA9IHNvdXJjZS5kYXRhIH0gPSBzb3VyY2UuY29tcG9uZW50ID8gc291cmNlLmNvbXBvbmVudC5wcm9wcyA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZG9tYWluID0gZ2V0RG9tYWluKHtcbiAgICAgICAgICAgIGRhdGE6IGNvbXBEYXRhLFxuICAgICAgICAgICAgbWF4RG9tYWluLFxuICAgICAgICAgICAgbWluRG9tYWluLFxuICAgICAgICAgICAgeDogc291cmNlLmNvbXBvbmVudCA/IHNvdXJjZS5jb21wb25lbnQucHJvcHMueCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHk6IHNvdXJjZS5jb21wb25lbnQgPyBzb3VyY2UuY29tcG9uZW50LnByb3BzLnkgOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICAgIGRvbWFpbnMucHVzaChkb21haW4pO1xuICAgIH0pO1xuICAgIGNvbnN0IHhEb21haW5zID0gW107XG4gICAgY29uc3QgeURvbWFpbnMgPSBbXTtcbiAgICBkb21haW5zLmZvckVhY2goKGRvbWFpbikgPT4ge1xuICAgICAgICB4RG9tYWlucy5wdXNoKC4uLmRvbWFpbi54KTtcbiAgICAgICAgeURvbWFpbnMucHVzaCguLi5kb21haW4ueSk7XG4gICAgfSk7XG4gICAgY29uc3QgeExvdyA9IE1hdGgubWluKC4uLnhEb21haW5zKTtcbiAgICBjb25zdCB4SGlnaCA9IE1hdGgubWF4KC4uLnhEb21haW5zKTtcbiAgICBjb25zdCB5TG93ID0gTWF0aC5taW4oLi4ueURvbWFpbnMpO1xuICAgIGNvbnN0IHlIaWdoID0gTWF0aC5tYXgoLi4ueURvbWFpbnMpO1xuICAgIHJldHVybiB7IHg6IFt4TG93LCB4SGlnaF0sIHk6IFt5TG93LCB5SGlnaF0gfTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGFydC1kb21haW4uanMubWFwIiwiaW1wb3J0IHsgZ2V0RG9tYWlucyB9IGZyb20gJy4uLy4uL0NoYXJ0VXRpbHMnO1xuLy8gUmV0dXJucyB0aGUgYnVsbGV0IGNoYXJ0J3MgbWluIGFuZCBtYXggZG9tYWluIGZvciBjb21wYXJhdGl2ZSAvIHByaW1hcnkgbWVhc3VyZXMgYW5kIHF1YWxpdGF0aXZlIHJhbmdlIGRhdGFcbmV4cG9ydCBjb25zdCBnZXRCdWxsZXREb21haW4gPSAoeyBjb21wYXJhdGl2ZUVycm9yTWVhc3VyZUNvbXBvbmVudCwgY29tcGFyYXRpdmVFcnJvck1lYXN1cmVEYXRhLCBjb21wYXJhdGl2ZVdhcm5pbmdNZWFzdXJlQ29tcG9uZW50LCBjb21wYXJhdGl2ZVdhcm5pbmdNZWFzdXJlRGF0YSwgcHJpbWFyeURvdE1lYXN1cmVDb21wb25lbnQsIHByaW1hcnlEb3RNZWFzdXJlRGF0YSwgcHJpbWFyeVNlZ21lbnRlZE1lYXN1cmVDb21wb25lbnQsIHByaW1hcnlTZWdtZW50ZWRNZWFzdXJlRGF0YSwgbWF4RG9tYWluLCBtaW5Eb21haW4sIHF1YWxpdGF0aXZlUmFuZ2VDb21wb25lbnQsIHF1YWxpdGF0aXZlUmFuZ2VEYXRhIH0pID0+IHtcbiAgICBjb25zdCBkb21haW4gPSBnZXREb21haW5zKHtcbiAgICAgICAgbWF4RG9tYWluLFxuICAgICAgICBtaW5Eb21haW4sXG4gICAgICAgIHNvdXJjZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBhcmF0aXZlRXJyb3JNZWFzdXJlQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIGRhdGE6IGNvbXBhcmF0aXZlRXJyb3JNZWFzdXJlRGF0YVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgZGF0YTogY29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZURhdGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBwcmltYXJ5RG90TWVhc3VyZUNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBkYXRhOiBwcmltYXJ5RG90TWVhc3VyZURhdGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBwcmltYXJ5U2VnbWVudGVkTWVhc3VyZUNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBkYXRhOiBwcmltYXJ5U2VnbWVudGVkTWVhc3VyZURhdGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBxdWFsaXRhdGl2ZVJhbmdlQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIGRhdGE6IHF1YWxpdGF0aXZlUmFuZ2VEYXRhXG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KTtcbiAgICAvLyBOb3RlIHRoYXQgY29tcGFyYXRpdmUgbWVhc3VyZXMgYW5kIHF1YWxpdGF0aXZlIHJhbmdlIGJhcnMgYXJlIGN1cnJlbnRseSBnaXZlbiBhbiB4LXZhbHVlIG9mIDEsIHdoaWxlIHRoZSBiYXIgd2lkdGhzXG4gICAgLy8gZmlsbCB0aGUgZG9tYWluLiBBdCBvbmUgcG9pbnQsIGxpbmVzIHdlcmUgdXNlZCB0byByZXByZXNlbnQgY29tcGFyYXRpdmUgd2FybmluZywgY29tcGFyYXRpdmUgZXJyb3IsIGFuZCB6ZXJvXG4gICAgLy8gbWVhc3VyZXMuIFRob3NlIGNvbXBvbmVudHMgaGFkIHgtdmFsdWVzIG9mIDAgYW5kIDIsIHdoaWNoIHJlbmRlcmVkIHRoZSBsaW5lcyBvbiB0b3Agb2YgdGhlIGNvbXBhcmF0aXZlIG1lYXN1cmUgYW5kXG4gICAgLy8gcXVhbGl0YXRpdmUgcmFuZ2UgYmFycy5cbiAgICBkb21haW4ueCA9IFswLCAyXTtcbiAgICByZXR1cm4gZG9tYWluO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNoYXJ0LWJ1bGxldC1kb21haW4uanMubWFwIiwiaW1wb3J0IHsgRGF0YSB9IGZyb20gJ3ZpY3RvcnktY29yZSc7XG5pbXBvcnQgeyBnZXRCdWxsZXRDb21wYXJhdGl2ZUVycm9yTWVhc3VyZVRoZW1lLCBnZXRCdWxsZXRDb21wYXJhdGl2ZU1lYXN1cmVUaGVtZSwgZ2V0QnVsbGV0Q29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZVRoZW1lLCBnZXRCdWxsZXRQcmltYXJ5RG90TWVhc3VyZVRoZW1lLCBnZXRCdWxsZXRQcmltYXJ5TmVnYXRpdmVNZWFzdXJlVGhlbWUsIGdldEJ1bGxldFByaW1hcnlTZWdtZW50ZWRNZWFzdXJlVGhlbWUsIGdldEJ1bGxldFF1YWxpdGF0aXZlUmFuZ2VUaGVtZSB9IGZyb20gJy4uLy4uL0NoYXJ0VXRpbHMnO1xuZXhwb3J0IGNvbnN0IGdldENvbXBhcmF0aXZlTWVhc3VyZURhdGEgPSAoeyBkYXRhLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIFxuLy8gZGVzdHJ1Y3R1cmUgbGFzdFxudGhlbWUgPSBnZXRCdWxsZXRDb21wYXJhdGl2ZU1lYXN1cmVUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpLCB5IH0pID0+IHtcbiAgICBjb25zdCBkYXR1bSA9IFtdO1xuICAgIERhdGEuZm9ybWF0RGF0YShkYXRhLCB7IHkgfSwgWyd5J10pLmZvckVhY2goKGRhdGFQb2ludCwgaW5kZXgpID0+IHtcbiAgICAgICAgZGF0dW0ucHVzaChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdGFQb2ludCksIHsgX2luZGV4OiBpbmRleCAvLyBTYXZlIHRvIHN5bmMgbGVnZW5kIGNvbG9yXG4gICAgICAgICB9KSk7XG4gICAgfSk7XG4gICAgY29uc3QgY29tcHV0ZWREYXRhID0gZGF0dW0ubWFwKChkYXRhUG9pbnQpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdGFQb2ludCksIHsgeDogMSwgX3g6IDEsIHkwOiBkYXRhUG9pbnQuX3ksIF95MDogZGF0YVBvaW50Ll95LCBfY29sb3I6IHRoZW1lLmJhci5zdHlsZS5kYXRhLmZpbGwgLy8gU2F2ZSB0byBzeW5jIGxlZ2VuZCBjb2xvclxuICAgICB9KSkpO1xuICAgIHJldHVybiBjb21wdXRlZERhdGE7XG59O1xuZXhwb3J0IGNvbnN0IGdldENvbXBhcmF0aXZlRXJyb3JNZWFzdXJlRGF0YSA9ICh7IGRhdGEsIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgXG4vLyBkZXN0cnVjdHVyZSBsYXN0XG50aGVtZSA9IGdldEJ1bGxldENvbXBhcmF0aXZlRXJyb3JNZWFzdXJlVGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSwgeSB9KSA9PiBnZXRDb21wYXJhdGl2ZU1lYXN1cmVEYXRhKHtcbiAgICBkYXRhLFxuICAgIHRoZW1lLFxuICAgIHRoZW1lQ29sb3IsXG4gICAgdGhlbWVWYXJpYW50LFxuICAgIHlcbn0pO1xuZXhwb3J0IGNvbnN0IGdldENvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVEYXRhID0gKHsgZGF0YSwgdGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCBcbi8vIGRlc3RydWN0dXJlIGxhc3RcbnRoZW1lID0gZ2V0QnVsbGV0Q29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCksIHkgfSkgPT4gZ2V0Q29tcGFyYXRpdmVNZWFzdXJlRGF0YSh7XG4gICAgZGF0YSxcbiAgICB0aGVtZSxcbiAgICB0aGVtZUNvbG9yLFxuICAgIHRoZW1lVmFyaWFudCxcbiAgICB5XG59KTtcbmV4cG9ydCBjb25zdCBnZXRQcmltYXJ5RG90TWVhc3VyZURhdGEgPSAoeyBkYXRhLCBpbnZlcnQsIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgXG4vLyBkZXN0cnVjdHVyZSBsYXN0XG50aGVtZSA9IGdldEJ1bGxldFByaW1hcnlEb3RNZWFzdXJlVGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSwgeSwgeTAgfSkgPT4gZ2V0Q29tcGFyYXRpdmVNZWFzdXJlRGF0YSh7XG4gICAgZGF0YSxcbiAgICBpbnZlcnQsXG4gICAgdGhlbWUsXG4gICAgdGhlbWVDb2xvcixcbiAgICB0aGVtZVZhcmlhbnQsXG4gICAgeSxcbiAgICB5MFxufSk7XG5leHBvcnQgY29uc3QgZ2V0UHJpbWFyeVNlZ21lbnRlZE1lYXN1cmVEYXRhID0gKHsgZGF0YSwgaW52ZXJ0LCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIFxuLy8gZGVzdHJ1Y3R1cmUgbGFzdFxudGhlbWUgPSBnZXRCdWxsZXRQcmltYXJ5U2VnbWVudGVkTWVhc3VyZVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCksIG5lZ2F0aXZlTWVhc3VyZVRoZW1lID0gZ2V0QnVsbGV0UHJpbWFyeU5lZ2F0aXZlTWVhc3VyZVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCksIHksIHkwIH0pID0+IHtcbiAgICBjb25zdCBuZWdhdGl2ZURhdHVtID0gW107XG4gICAgY29uc3QgcG9zaXRpdmVEYXR1bSA9IFtdO1xuICAgIERhdGEuZm9ybWF0RGF0YShkYXRhLCB7IHksIHkwIH0sIFsneScsICd5MCddKS5mb3JFYWNoKChkYXRhUG9pbnQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChkYXRhUG9pbnQuX3kgPCAwKSB7XG4gICAgICAgICAgICBuZWdhdGl2ZURhdHVtLnB1c2goT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkYXRhUG9pbnQpLCB7IF9pbmRleDogaW5kZXggLy8gU2F2ZSB0byBzeW5jIGxlZ2VuZCBjb2xvclxuICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBvc2l0aXZlRGF0dW0ucHVzaChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdGFQb2ludCksIHsgX2luZGV4OiBpbmRleCAvLyBTYXZlIHRvIHN5bmMgbGVnZW5kIGNvbG9yXG4gICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gSW5zdGVhZCBvZiByZWx5aW5nIG9uIGNvbG9yU2NhbGUsIGNvbG9ycyBtdXN0IGJlIGFkZGVkIHRvIGVhY2ggbWVhc3VyZSBpbiBhc2NlbmRpbmcgb3JkZXJcbiAgICBjb25zdCBuZWdhdGl2ZUNvbXB1dGVkRGF0YSA9IG5lZ2F0aXZlRGF0dW1cbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIuX3kgLSBhLl95KVxuICAgICAgICAubWFwKChkYXRhUG9pbnQsIGluZGV4KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkYXRhUG9pbnQpLCB7IHg6IDEsIF94OiAxLCBfY29sb3I6IGludmVydFxuICAgICAgICAgICAgPyB0aGVtZS5ncm91cC5jb2xvclNjYWxlW2luZGV4ICUgdGhlbWUuZ3JvdXAuY29sb3JTY2FsZS5sZW5ndGhdXG4gICAgICAgICAgICA6IG5lZ2F0aXZlTWVhc3VyZVRoZW1lLmdyb3VwLmNvbG9yU2NhbGVbaW5kZXggJSB0aGVtZS5ncm91cC5jb2xvclNjYWxlLmxlbmd0aF0gfSkpXG4gICAgLy8gU29ydCBkZXNjZW5kaW5nIHNvIGxhcmdlc3QgYmFyIGlzIGFwcGVhcnMgYmVoaW5kIG90aGVyc1xuICAgIClcbiAgICAgICAgLnJldmVyc2UoKTtcbiAgICAvLyBJbnN0ZWFkIG9mIHJlbHlpbmcgb24gY29sb3JTY2FsZSwgY29sb3JzIG11c3QgYmUgYWRkZWQgdG8gZWFjaCBtZWFzdXJlIGluIGFzY2VuZGluZyBvcmRlclxuICAgIGNvbnN0IHBvc2l0aXZlQ29tcHV0ZWREYXRhID0gcG9zaXRpdmVEYXR1bVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5feSAtIGIuX3kpXG4gICAgICAgIC5tYXAoKGRhdGFQb2ludCwgaW5kZXgpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdGFQb2ludCksIHsgeDogMSwgX3g6IDEsIF9jb2xvcjogaW52ZXJ0XG4gICAgICAgICAgICA/IG5lZ2F0aXZlTWVhc3VyZVRoZW1lLmdyb3VwLmNvbG9yU2NhbGVbaW5kZXggJSB0aGVtZS5ncm91cC5jb2xvclNjYWxlLmxlbmd0aF1cbiAgICAgICAgICAgIDogdGhlbWUuZ3JvdXAuY29sb3JTY2FsZVtpbmRleCAlIHRoZW1lLmdyb3VwLmNvbG9yU2NhbGUubGVuZ3RoXSB9KSlcbiAgICAvLyBTb3J0IGRlc2NlbmRpbmcgc28gbGFyZ2VzdCBiYXIgaXMgYXBwZWFycyBiZWhpbmQgb3RoZXJzXG4gICAgKVxuICAgICAgICAucmV2ZXJzZSgpO1xuICAgIHJldHVybiBbLi4ubmVnYXRpdmVDb21wdXRlZERhdGEsIC4uLnBvc2l0aXZlQ29tcHV0ZWREYXRhXTtcbn07XG5leHBvcnQgY29uc3QgZ2V0UXVhbGl0YXRpdmVSYW5nZURhdGEgPSAoeyBkYXRhLCBpbnZlcnQsIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgXG4vLyBkZXN0cnVjdHVyZSBsYXN0XG50aGVtZSA9IGdldEJ1bGxldFF1YWxpdGF0aXZlUmFuZ2VUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpLCB5LCB5MCB9KSA9PiB7XG4gICAgY29uc3QgZGF0dW0gPSBbXTtcbiAgICBEYXRhLmZvcm1hdERhdGEoZGF0YSwgeyB5LCB5MCB9LCBbJ3knLCAneTAnXSkuZm9yRWFjaCgoZGF0YVBvaW50LCBpbmRleCkgPT4ge1xuICAgICAgICBkYXR1bS5wdXNoKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0YVBvaW50KSwgeyBfaW5kZXg6IGluZGV4IC8vIFNhdmUgdG8gc3luYyBsZWdlbmQgY29sb3JcbiAgICAgICAgIH0pKTtcbiAgICB9KTtcbiAgICBjb25zdCBjb21wdXRlZERhdGEgPSBkYXR1bVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gKGludmVydCA/IGIuX3kgLSBhLl95IDogYS5feSAtIGIuX3kpKVxuICAgICAgICAubWFwKChkYXRhUG9pbnQsIGluZGV4KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkYXRhUG9pbnQpLCB7IHg6IDEsIF94OiAxLCBcbiAgICAgICAgLy8gSW5zdGVhZCBvZiByZWx5aW5nIG9uIGNvbG9yU2NhbGUsIGNvbG9ycyBtdXN0IGJlIGFkZGVkIHRvIGVhY2ggbWVhc3VyZSBpbiBhc2NlbmRpbmcgb3JkZXJcbiAgICAgICAgX2NvbG9yOiB0aGVtZS5ncm91cC5jb2xvclNjYWxlW2luZGV4ICUgdGhlbWUuZ3JvdXAuY29sb3JTY2FsZS5sZW5ndGhdIH0pKVxuICAgIC8vIFNvcnQgZGVzY2VuZGluZyBzbyBsYXJnZXN0IGJhciBpcyBhcHBlYXJzIGJlaGluZCBvdGhlcnNcbiAgICApXG4gICAgICAgIC5yZXZlcnNlKCk7XG4gICAgcmV0dXJuIGNvbXB1dGVkRGF0YTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGFydC1idWxsZXQtZGF0YS5qcy5tYXAiLCJpbXBvcnQgeyBnZXRQcmltYXJ5RG90TWVhc3VyZURhdGEsIGdldENvbXBhcmF0aXZlRXJyb3JNZWFzdXJlRGF0YSwgZ2V0Q29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZURhdGEsIGdldFByaW1hcnlTZWdtZW50ZWRNZWFzdXJlRGF0YSwgZ2V0UXVhbGl0YXRpdmVSYW5nZURhdGEgfSBmcm9tICcuL2NoYXJ0LWJ1bGxldC1kYXRhJztcbmltcG9ydCB7IGdldEJ1bGxldFRoZW1lIH0gZnJvbSAnLi4vLi4vQ2hhcnRVdGlscyc7XG5jb25zdCBnZXRMZWdlbmRDb2xvclNjYWxlID0gKGNvbXB1dGVkRGF0YSwgbGVnZW5kRGF0YSkgPT4ge1xuICAgIGNvbnN0IGNvbG9yU2NhbGUgPSBbXTtcbiAgICBsZWdlbmREYXRhLmZvckVhY2goKGRhdGEsIGluZGV4KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBjb21wdXRlZERhdGEpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gaS5faW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjb2xvclNjYWxlLnB1c2goaS5fY29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbG9yU2NhbGU7XG59O1xuZXhwb3J0IGNvbnN0IGdldENvbG9yU2NhbGUgPSAoeyBjb21wYXJhdGl2ZUVycm9yTWVhc3VyZURhdGEsIGNvbXBhcmF0aXZlRXJyb3JNZWFzdXJlTGVnZW5kRGF0YSwgY29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZURhdGEsIGNvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVMZWdlbmREYXRhLCBpbnZlcnQsIHByaW1hcnlEb3RNZWFzdXJlRGF0YSwgcHJpbWFyeURvdE1lYXN1cmVMZWdlbmREYXRhLCBwcmltYXJ5U2VnbWVudGVkTWVhc3VyZURhdGEsIHByaW1hcnlTZWdtZW50ZWRNZWFzdXJlTGVnZW5kRGF0YSwgcXVhbGl0YXRpdmVSYW5nZURhdGEsIHF1YWxpdGF0aXZlUmFuZ2VMZWdlbmREYXRhLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQgfSkgPT4ge1xuICAgIGNvbnN0IGNvbG9yU2NhbGUgPSBbXTtcbiAgICBpZiAocHJpbWFyeURvdE1lYXN1cmVMZWdlbmREYXRhICYmIHByaW1hcnlEb3RNZWFzdXJlTGVnZW5kRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWREYXRhID0gZ2V0UHJpbWFyeURvdE1lYXN1cmVEYXRhKHtcbiAgICAgICAgICAgIGRhdGE6IHByaW1hcnlEb3RNZWFzdXJlRGF0YSxcbiAgICAgICAgICAgIGludmVydFxuICAgICAgICB9KTtcbiAgICAgICAgY29sb3JTY2FsZS5wdXNoKC4uLmdldExlZ2VuZENvbG9yU2NhbGUoY29tcHV0ZWREYXRhLCBwcmltYXJ5RG90TWVhc3VyZUxlZ2VuZERhdGEpKTtcbiAgICB9XG4gICAgaWYgKHByaW1hcnlTZWdtZW50ZWRNZWFzdXJlTGVnZW5kRGF0YSAmJiBwcmltYXJ5U2VnbWVudGVkTWVhc3VyZUxlZ2VuZERhdGEubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkRGF0YSA9IGdldFByaW1hcnlTZWdtZW50ZWRNZWFzdXJlRGF0YSh7XG4gICAgICAgICAgICBkYXRhOiBwcmltYXJ5U2VnbWVudGVkTWVhc3VyZURhdGEsXG4gICAgICAgICAgICBpbnZlcnQsXG4gICAgICAgICAgICB0aGVtZUNvbG9yLFxuICAgICAgICAgICAgdGhlbWVWYXJpYW50XG4gICAgICAgIH0pO1xuICAgICAgICBjb2xvclNjYWxlLnB1c2goLi4uZ2V0TGVnZW5kQ29sb3JTY2FsZShjb21wdXRlZERhdGEsIHByaW1hcnlTZWdtZW50ZWRNZWFzdXJlTGVnZW5kRGF0YSkpO1xuICAgIH1cbiAgICBpZiAoY29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZUxlZ2VuZERhdGEgJiYgY29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZUxlZ2VuZERhdGEubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkRGF0YSA9IGdldENvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVEYXRhKHtcbiAgICAgICAgICAgIGRhdGE6IGNvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVEYXRhLFxuICAgICAgICAgICAgaW52ZXJ0LFxuICAgICAgICAgICAgdGhlbWVDb2xvcixcbiAgICAgICAgICAgIHRoZW1lVmFyaWFudFxuICAgICAgICB9KTtcbiAgICAgICAgY29sb3JTY2FsZS5wdXNoKC4uLmdldExlZ2VuZENvbG9yU2NhbGUoY29tcHV0ZWREYXRhLCBjb21wYXJhdGl2ZVdhcm5pbmdNZWFzdXJlTGVnZW5kRGF0YSkpO1xuICAgIH1cbiAgICBpZiAoY29tcGFyYXRpdmVFcnJvck1lYXN1cmVMZWdlbmREYXRhICYmIGNvbXBhcmF0aXZlRXJyb3JNZWFzdXJlTGVnZW5kRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWREYXRhID0gZ2V0Q29tcGFyYXRpdmVFcnJvck1lYXN1cmVEYXRhKHtcbiAgICAgICAgICAgIGRhdGE6IGNvbXBhcmF0aXZlRXJyb3JNZWFzdXJlRGF0YSxcbiAgICAgICAgICAgIGludmVydCxcbiAgICAgICAgICAgIHRoZW1lQ29sb3IsXG4gICAgICAgICAgICB0aGVtZVZhcmlhbnRcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbG9yU2NhbGUucHVzaCguLi5nZXRMZWdlbmRDb2xvclNjYWxlKGNvbXB1dGVkRGF0YSwgY29tcGFyYXRpdmVFcnJvck1lYXN1cmVMZWdlbmREYXRhKSk7XG4gICAgfVxuICAgIGlmIChxdWFsaXRhdGl2ZVJhbmdlTGVnZW5kRGF0YSAmJiBxdWFsaXRhdGl2ZVJhbmdlTGVnZW5kRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWREYXRhID0gZ2V0UXVhbGl0YXRpdmVSYW5nZURhdGEoe1xuICAgICAgICAgICAgZGF0YTogcXVhbGl0YXRpdmVSYW5nZURhdGEsXG4gICAgICAgICAgICBpbnZlcnRcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbG9yU2NhbGUucHVzaCguLi5nZXRMZWdlbmRDb2xvclNjYWxlKGNvbXB1dGVkRGF0YSwgcXVhbGl0YXRpdmVSYW5nZUxlZ2VuZERhdGEpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbG9yU2NhbGU7XG59O1xuLy8gR2V0IGJ1bGxldCBjaGFydCB0aGVtZSB3aXRoIGxlZ2VuZCBjb2xvciBzY2FsZVxuZXhwb3J0IGNvbnN0IGdldEJ1bGxldFRoZW1lV2l0aExlZ2VuZENvbG9yU2NhbGUgPSAoeyBjb21wYXJhdGl2ZUVycm9yTWVhc3VyZURhdGEsIGNvbXBhcmF0aXZlRXJyb3JNZWFzdXJlTGVnZW5kRGF0YSwgY29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZURhdGEsIGNvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVMZWdlbmREYXRhLCBpbnZlcnQsIHByaW1hcnlEb3RNZWFzdXJlRGF0YSwgcHJpbWFyeURvdE1lYXN1cmVMZWdlbmREYXRhLCBwcmltYXJ5U2VnbWVudGVkTWVhc3VyZURhdGEsIHByaW1hcnlTZWdtZW50ZWRNZWFzdXJlTGVnZW5kRGF0YSwgcXVhbGl0YXRpdmVSYW5nZURhdGEsIHF1YWxpdGF0aXZlUmFuZ2VMZWdlbmREYXRhLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQgfSkgPT4ge1xuICAgIGNvbnN0IGNvbG9yU2NhbGUgPSBnZXRDb2xvclNjYWxlKHtcbiAgICAgICAgY29tcGFyYXRpdmVFcnJvck1lYXN1cmVEYXRhLFxuICAgICAgICBjb21wYXJhdGl2ZUVycm9yTWVhc3VyZUxlZ2VuZERhdGEsXG4gICAgICAgIGNvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVEYXRhLFxuICAgICAgICBjb21wYXJhdGl2ZVdhcm5pbmdNZWFzdXJlTGVnZW5kRGF0YSxcbiAgICAgICAgaW52ZXJ0LFxuICAgICAgICBwcmltYXJ5RG90TWVhc3VyZURhdGEsXG4gICAgICAgIHByaW1hcnlEb3RNZWFzdXJlTGVnZW5kRGF0YSxcbiAgICAgICAgcHJpbWFyeVNlZ21lbnRlZE1lYXN1cmVEYXRhLFxuICAgICAgICBwcmltYXJ5U2VnbWVudGVkTWVhc3VyZUxlZ2VuZERhdGEsXG4gICAgICAgIHF1YWxpdGF0aXZlUmFuZ2VEYXRhLFxuICAgICAgICBxdWFsaXRhdGl2ZVJhbmdlTGVnZW5kRGF0YSxcbiAgICAgICAgdGhlbWVDb2xvcixcbiAgICAgICAgdGhlbWVWYXJpYW50XG4gICAgfSk7XG4gICAgY29uc3QgdGhlbWUgPSBnZXRCdWxsZXRUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpO1xuICAgIHRoZW1lLmxlZ2VuZC5jb2xvclNjYWxlID0gWy4uLmNvbG9yU2NhbGVdO1xuICAgIHJldHVybiB0aGVtZTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGFydC1idWxsZXQtdGhlbWUuanMubWFwIiwiaW1wb3J0IF9hc3NpZ24gZnJvbSBcImxvZGFzaC9hc3NpZ25cIjtcbmltcG9ydCBfaXNQbGFpbk9iamVjdCBmcm9tIFwibG9kYXNoL2lzUGxhaW5PYmplY3RcIjtcblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG4vKmVzbGludCBuby1tYWdpYy1udW1iZXJzOiBbXCJlcnJvclwiLCB7IFwiaWdub3JlXCI6IFstMSwgMCwgMSwgMl0gfV0qL1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHsgSGVscGVycywgQ29tbW9uUHJvcHMsIFBhdGggfSBmcm9tIFwidmljdG9yeS1jb3JlXCI7XG5cbnZhciBnZXRWZXJ0aWNhbFBhdGggPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIHBvaW50ZXJXaWR0aCA9IHByb3BzLnBvaW50ZXJXaWR0aCxcbiAgICAgIGNvcm5lclJhZGl1cyA9IHByb3BzLmNvcm5lclJhZGl1cyxcbiAgICAgIG9yaWVudGF0aW9uID0gcHJvcHMub3JpZW50YXRpb24sXG4gICAgICB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgICAgY2VudGVyID0gcHJvcHMuY2VudGVyO1xuICB2YXIgc2lnbiA9IG9yaWVudGF0aW9uID09PSBcImJvdHRvbVwiID8gMSA6IC0xO1xuICB2YXIgeCA9IHByb3BzLnggKyAocHJvcHMuZHggfHwgMCk7XG4gIHZhciB5ID0gcHJvcHMueSArIChwcm9wcy5keSB8fCAwKTtcbiAgdmFyIGNlbnRlclggPSBfaXNQbGFpbk9iamVjdChjZW50ZXIpICYmIGNlbnRlci54O1xuICB2YXIgY2VudGVyWSA9IF9pc1BsYWluT2JqZWN0KGNlbnRlcikgJiYgY2VudGVyLnk7XG4gIHZhciBwb2ludGVyRWRnZSA9IGNlbnRlclkgKyBzaWduICogKGhlaWdodCAvIDIpO1xuICB2YXIgb3Bwb3NpdGVFZGdlID0gY2VudGVyWSAtIHNpZ24gKiAoaGVpZ2h0IC8gMik7XG4gIHZhciByaWdodEVkZ2UgPSBjZW50ZXJYICsgd2lkdGggLyAyO1xuICB2YXIgbGVmdEVkZ2UgPSBjZW50ZXJYIC0gd2lkdGggLyAyO1xuICB2YXIgcG9pbnRlckxlbmd0aCA9IHNpZ24gKiAoeSAtIHBvaW50ZXJFZGdlKSA8IDAgPyAwIDogcHJvcHMucG9pbnRlckxlbmd0aDtcbiAgdmFyIGRpcmVjdGlvbiA9IG9yaWVudGF0aW9uID09PSBcImJvdHRvbVwiID8gXCIwIDAgMFwiIDogXCIwIDAgMVwiO1xuICB2YXIgYXJjID0gXCJcIi5jb25jYXQoY29ybmVyUmFkaXVzLCBcIiBcIikuY29uY2F0KGNvcm5lclJhZGl1cywgXCIgXCIpLmNvbmNhdChkaXJlY3Rpb24pO1xuICByZXR1cm4gXCJNIFwiLmNvbmNhdChjZW50ZXJYIC0gcG9pbnRlcldpZHRoIC8gMiwgXCIsIFwiKS5jb25jYXQocG9pbnRlckVkZ2UsIFwiXFxuICAgIEwgXCIpLmNvbmNhdChwb2ludGVyTGVuZ3RoID8geCA6IGNlbnRlclggKyBwb2ludGVyV2lkdGggLyAyLCBcIiwgXCIpLmNvbmNhdChwb2ludGVyTGVuZ3RoID8geSA6IHBvaW50ZXJFZGdlLCBcIlxcbiAgICBMIFwiKS5jb25jYXQoY2VudGVyWCArIHBvaW50ZXJXaWR0aCAvIDIsIFwiLCBcIikuY29uY2F0KHBvaW50ZXJFZGdlLCBcIlxcbiAgICBMIFwiKS5jb25jYXQocmlnaHRFZGdlIC0gY29ybmVyUmFkaXVzLCBcIiwgXCIpLmNvbmNhdChwb2ludGVyRWRnZSwgXCJcXG4gICAgQSBcIikuY29uY2F0KGFyYywgXCIgXCIpLmNvbmNhdChyaWdodEVkZ2UsIFwiLCBcIikuY29uY2F0KHBvaW50ZXJFZGdlIC0gc2lnbiAqIGNvcm5lclJhZGl1cywgXCJcXG4gICAgTCBcIikuY29uY2F0KHJpZ2h0RWRnZSwgXCIsIFwiKS5jb25jYXQob3Bwb3NpdGVFZGdlICsgc2lnbiAqIGNvcm5lclJhZGl1cywgXCJcXG4gICAgQSBcIikuY29uY2F0KGFyYywgXCIgXCIpLmNvbmNhdChyaWdodEVkZ2UgLSBjb3JuZXJSYWRpdXMsIFwiLCBcIikuY29uY2F0KG9wcG9zaXRlRWRnZSwgXCJcXG4gICAgTCBcIikuY29uY2F0KGxlZnRFZGdlICsgY29ybmVyUmFkaXVzLCBcIiwgXCIpLmNvbmNhdChvcHBvc2l0ZUVkZ2UsIFwiXFxuICAgIEEgXCIpLmNvbmNhdChhcmMsIFwiIFwiKS5jb25jYXQobGVmdEVkZ2UsIFwiLCBcIikuY29uY2F0KG9wcG9zaXRlRWRnZSArIHNpZ24gKiBjb3JuZXJSYWRpdXMsIFwiXFxuICAgIEwgXCIpLmNvbmNhdChsZWZ0RWRnZSwgXCIsIFwiKS5jb25jYXQocG9pbnRlckVkZ2UgLSBzaWduICogY29ybmVyUmFkaXVzLCBcIlxcbiAgICBBIFwiKS5jb25jYXQoYXJjLCBcIiBcIikuY29uY2F0KGxlZnRFZGdlICsgY29ybmVyUmFkaXVzLCBcIiwgXCIpLmNvbmNhdChwb2ludGVyRWRnZSwgXCJcXG4gICAgelwiKTtcbn07XG5cbnZhciBnZXRIb3Jpem9udGFsUGF0aCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgcG9pbnRlcldpZHRoID0gcHJvcHMucG9pbnRlcldpZHRoLFxuICAgICAgY29ybmVyUmFkaXVzID0gcHJvcHMuY29ybmVyUmFkaXVzLFxuICAgICAgb3JpZW50YXRpb24gPSBwcm9wcy5vcmllbnRhdGlvbixcbiAgICAgIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgICBoZWlnaHQgPSBwcm9wcy5oZWlnaHQsXG4gICAgICBjZW50ZXIgPSBwcm9wcy5jZW50ZXI7XG4gIHZhciBzaWduID0gb3JpZW50YXRpb24gPT09IFwibGVmdFwiID8gMSA6IC0xO1xuICB2YXIgeCA9IHByb3BzLnggKyAocHJvcHMuZHggfHwgMCk7XG4gIHZhciB5ID0gcHJvcHMueSArIChwcm9wcy5keSB8fCAwKTtcbiAgdmFyIGNlbnRlclggPSBfaXNQbGFpbk9iamVjdChjZW50ZXIpICYmIGNlbnRlci54O1xuICB2YXIgY2VudGVyWSA9IF9pc1BsYWluT2JqZWN0KGNlbnRlcikgJiYgY2VudGVyLnk7XG4gIHZhciBwb2ludGVyRWRnZSA9IGNlbnRlclggLSBzaWduICogKHdpZHRoIC8gMik7XG4gIHZhciBvcHBvc2l0ZUVkZ2UgPSBjZW50ZXJYICsgc2lnbiAqICh3aWR0aCAvIDIpO1xuICB2YXIgYm90dG9tRWRnZSA9IGNlbnRlclkgKyBoZWlnaHQgLyAyO1xuICB2YXIgdG9wRWRnZSA9IGNlbnRlclkgLSBoZWlnaHQgLyAyO1xuICB2YXIgcG9pbnRlckxlbmd0aCA9IHNpZ24gKiAoeCAtIHBvaW50ZXJFZGdlKSA+IDAgPyAwIDogcHJvcHMucG9pbnRlckxlbmd0aDtcbiAgdmFyIGRpcmVjdGlvbiA9IG9yaWVudGF0aW9uID09PSBcImxlZnRcIiA/IFwiMCAwIDBcIiA6IFwiMCAwIDFcIjtcbiAgdmFyIGFyYyA9IFwiXCIuY29uY2F0KGNvcm5lclJhZGl1cywgXCIgXCIpLmNvbmNhdChjb3JuZXJSYWRpdXMsIFwiIFwiKS5jb25jYXQoZGlyZWN0aW9uKTtcbiAgcmV0dXJuIFwiTSBcIi5jb25jYXQocG9pbnRlckVkZ2UsIFwiLCBcIikuY29uY2F0KGNlbnRlclkgLSBwb2ludGVyV2lkdGggLyAyLCBcIlxcbiAgICBMIFwiKS5jb25jYXQocG9pbnRlckxlbmd0aCA/IHggOiBwb2ludGVyRWRnZSwgXCIsIFwiKS5jb25jYXQocG9pbnRlckxlbmd0aCA/IHkgOiBjZW50ZXJZICsgcG9pbnRlcldpZHRoIC8gMiwgXCJcXG4gICAgTCBcIikuY29uY2F0KHBvaW50ZXJFZGdlLCBcIiwgXCIpLmNvbmNhdChjZW50ZXJZICsgcG9pbnRlcldpZHRoIC8gMiwgXCJcXG4gICAgTCBcIikuY29uY2F0KHBvaW50ZXJFZGdlLCBcIiwgXCIpLmNvbmNhdChib3R0b21FZGdlIC0gY29ybmVyUmFkaXVzLCBcIlxcbiAgICBBIFwiKS5jb25jYXQoYXJjLCBcIiBcIikuY29uY2F0KHBvaW50ZXJFZGdlICsgc2lnbiAqIGNvcm5lclJhZGl1cywgXCIsIFwiKS5jb25jYXQoYm90dG9tRWRnZSwgXCJcXG4gICAgTCBcIikuY29uY2F0KG9wcG9zaXRlRWRnZSAtIHNpZ24gKiBjb3JuZXJSYWRpdXMsIFwiLCBcIikuY29uY2F0KGJvdHRvbUVkZ2UsIFwiXFxuICAgIEEgXCIpLmNvbmNhdChhcmMsIFwiIFwiKS5jb25jYXQob3Bwb3NpdGVFZGdlLCBcIiwgXCIpLmNvbmNhdChib3R0b21FZGdlIC0gY29ybmVyUmFkaXVzLCBcIlxcbiAgICBMIFwiKS5jb25jYXQob3Bwb3NpdGVFZGdlLCBcIiwgXCIpLmNvbmNhdCh0b3BFZGdlICsgY29ybmVyUmFkaXVzLCBcIlxcbiAgICBBIFwiKS5jb25jYXQoYXJjLCBcIiBcIikuY29uY2F0KG9wcG9zaXRlRWRnZSAtIHNpZ24gKiBjb3JuZXJSYWRpdXMsIFwiLCBcIikuY29uY2F0KHRvcEVkZ2UsIFwiXFxuICAgIEwgXCIpLmNvbmNhdChwb2ludGVyRWRnZSArIHNpZ24gKiBjb3JuZXJSYWRpdXMsIFwiLCBcIikuY29uY2F0KHRvcEVkZ2UsIFwiXFxuICAgIEEgXCIpLmNvbmNhdChhcmMsIFwiIFwiKS5jb25jYXQocG9pbnRlckVkZ2UsIFwiLCBcIikuY29uY2F0KHRvcEVkZ2UgKyBjb3JuZXJSYWRpdXMsIFwiXFxuICAgIHpcIik7XG59O1xuXG52YXIgZ2V0Rmx5b3V0UGF0aCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgb3JpZW50YXRpb24gPSBwcm9wcy5vcmllbnRhdGlvbiB8fCBcInRvcFwiO1xuICByZXR1cm4gb3JpZW50YXRpb24gPT09IFwibGVmdFwiIHx8IG9yaWVudGF0aW9uID09PSBcInJpZ2h0XCIgPyBnZXRIb3Jpem9udGFsUGF0aChwcm9wcykgOiBnZXRWZXJ0aWNhbFBhdGgocHJvcHMpO1xufTtcblxudmFyIGV2YWx1YXRlUHJvcHMgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgLyoqXG4gICAqIFBvdGVudGlhbCBldmFsdWF0ZWQgcHJvcHMgYXJlOlxuICAgKiBgaWRgXG4gICAqIGBzdHlsZWBcbiAgICovXG4gIHZhciBpZCA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmlkLCBwcm9wcyk7XG4gIHZhciBzdHlsZSA9IEhlbHBlcnMuZXZhbHVhdGVTdHlsZShwcm9wcy5zdHlsZSwgcHJvcHMpO1xuICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBpZDogaWQsXG4gICAgc3R5bGU6IHN0eWxlXG4gIH0pO1xufTtcblxudmFyIEZseW91dCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBwcm9wcyA9IGV2YWx1YXRlUHJvcHMocHJvcHMpO1xuICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KHByb3BzLnBhdGhDb21wb25lbnQsIF9vYmplY3RTcHJlYWQoe30sIHByb3BzLmV2ZW50cywge1xuICAgIHN0eWxlOiBwcm9wcy5zdHlsZSxcbiAgICBkOiBnZXRGbHlvdXRQYXRoKHByb3BzKSxcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBzaGFwZVJlbmRlcmluZzogcHJvcHMuc2hhcGVSZW5kZXJpbmcsXG4gICAgcm9sZTogcHJvcHMucm9sZSxcbiAgICB0cmFuc2Zvcm06IHByb3BzLnRyYW5zZm9ybSxcbiAgICBjbGlwUGF0aDogcHJvcHMuY2xpcFBhdGhcbiAgfSkpO1xufTtcblxuRmx5b3V0LnByb3BUeXBlcyA9IF9vYmplY3RTcHJlYWQoe30sIENvbW1vblByb3BzLnByaW1pdGl2ZVByb3BzLCB7XG4gIGNlbnRlcjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICB4OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHk6IFByb3BUeXBlcy5udW1iZXJcbiAgfSksXG4gIGNvcm5lclJhZGl1czogUHJvcFR5cGVzLm51bWJlcixcbiAgZGF0dW06IFByb3BUeXBlcy5vYmplY3QsXG4gIGR4OiBQcm9wVHlwZXMubnVtYmVyLFxuICBkeTogUHJvcFR5cGVzLm51bWJlcixcbiAgaGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBvcmllbnRhdGlvbjogUHJvcFR5cGVzLm9uZU9mKFtcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIiwgXCJyaWdodFwiXSksXG4gIHBhdGhDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICBwb2ludGVyTGVuZ3RoOiBQcm9wVHlwZXMubnVtYmVyLFxuICBwb2ludGVyV2lkdGg6IFByb3BUeXBlcy5udW1iZXIsXG4gIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICB4OiBQcm9wVHlwZXMubnVtYmVyLFxuICB5OiBQcm9wVHlwZXMubnVtYmVyXG59KTtcbkZseW91dC5kZWZhdWx0UHJvcHMgPSB7XG4gIHBhdGhDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUGF0aCwgbnVsbCksXG4gIHJvbGU6IFwicHJlc2VudGF0aW9uXCIsXG4gIHNoYXBlUmVuZGVyaW5nOiBcImF1dG9cIlxufTtcbmV4cG9ydCBkZWZhdWx0IEZseW91dDsiLCJpbXBvcnQgX29yZGVyQnkgZnJvbSBcImxvZGFzaC9vcmRlckJ5XCI7XG5pbXBvcnQgX2lzUGxhaW5PYmplY3QgZnJvbSBcImxvZGFzaC9pc1BsYWluT2JqZWN0XCI7XG5pbXBvcnQgX3VuaXF1ZUlkIGZyb20gXCJsb2Rhc2gvdW5pcXVlSWRcIjtcbmltcG9ydCBfZGVmYXVsdHMgZnJvbSBcImxvZGFzaC9kZWZhdWx0c1wiO1xuaW1wb3J0IF9hc3NpZ24gZnJvbSBcImxvZGFzaC9hc3NpZ25cIjtcblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgeyBQcm9wVHlwZXMgYXMgQ3VzdG9tUHJvcFR5cGVzLCBUZXh0U2l6ZSwgSGVscGVycywgTGFiZWxIZWxwZXJzLCBWaWN0b3J5TGFiZWwsIFZpY3RvcnlUaGVtZSwgVmljdG9yeVBvcnRhbCB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbmltcG9ydCBGbHlvdXQgZnJvbSBcIi4vZmx5b3V0XCI7XG52YXIgZmFsbGJhY2tQcm9wcyA9IHtcbiAgY29ybmVyUmFkaXVzOiA1LFxuICBwb2ludGVyTGVuZ3RoOiAxMCxcbiAgcG9pbnRlcldpZHRoOiAxMFxufTtcblxudmFyIFZpY3RvcnlUb29sdGlwID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhWaWN0b3J5VG9vbHRpcCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gVmljdG9yeVRvb2x0aXAocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmljdG9yeVRvb2x0aXApO1xuXG4gICAgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoVmljdG9yeVRvb2x0aXAuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihWaWN0b3J5VG9vbHRpcCkpLmNhbGwodGhpcywgcHJvcHMpKTtcbiAgICBfdGhpcy5pZCA9IHByb3BzLmlkID09PSB1bmRlZmluZWQgPyBfdW5pcXVlSWQoXCJ0b29sdGlwLVwiKSA6IHByb3BzLmlkO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhWaWN0b3J5VG9vbHRpcCwgW3tcbiAgICBrZXk6IFwiZ2V0RGVmYXVsdE9yaWVudGF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlZmF1bHRPcmllbnRhdGlvbihwcm9wcykge1xuICAgICAgdmFyIGRhdHVtID0gcHJvcHMuZGF0dW0sXG4gICAgICAgICAgaG9yaXpvbnRhbCA9IHByb3BzLmhvcml6b250YWwsXG4gICAgICAgICAgcG9sYXIgPSBwcm9wcy5wb2xhcjtcblxuICAgICAgaWYgKCFwb2xhcikge1xuICAgICAgICB2YXIgcG9zaXRpdmUgPSBob3Jpem9udGFsID8gXCJyaWdodFwiIDogXCJ0b3BcIjtcbiAgICAgICAgdmFyIG5lZ2F0aXZlID0gaG9yaXpvbnRhbCA/IFwibGVmdFwiIDogXCJib3R0b21cIjtcbiAgICAgICAgcmV0dXJuIGRhdHVtICYmIGRhdHVtLnkgPCAwID8gbmVnYXRpdmUgOiBwb3NpdGl2ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBvbGFyT3JpZW50YXRpb24ocHJvcHMsIGRhdHVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UG9sYXJPcmllbnRhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQb2xhck9yaWVudGF0aW9uKHByb3BzLCBkYXR1bSkge1xuICAgICAgdmFyIGRlZ3JlZXMgPSBMYWJlbEhlbHBlcnMuZ2V0RGVncmVlcyhwcm9wcywgZGF0dW0pO1xuICAgICAgdmFyIHBsYWNlbWVudCA9IHByb3BzLmxhYmVsUGxhY2VtZW50IHx8IFwidmVydGljYWxcIjtcblxuICAgICAgaWYgKHBsYWNlbWVudCA9PT0gXCIgdmVydGljYWxcIikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRWZXJ0aWNhbE9yaWVudGF0aW9ucyhkZWdyZWVzKTtcbiAgICAgIH0gZWxzZSBpZiAocGxhY2VtZW50ID09PSBcInBhcmFsbGVsXCIpIHtcbiAgICAgICAgcmV0dXJuIGRlZ3JlZXMgPCA5MCB8fCBkZWdyZWVzID4gMjcwID8gXCJyaWdodFwiIDogXCJsZWZ0XCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGVncmVlcyA+IDE4MCA/IFwiYm90dG9tXCIgOiBcInRvcFwiO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRWZXJ0aWNhbE9yaWVudGF0aW9uc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRWZXJ0aWNhbE9yaWVudGF0aW9ucyhkZWdyZWVzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICAgICAgaWYgKGRlZ3JlZXMgPCA0NSB8fCBkZWdyZWVzID4gMzE1KSB7XG4gICAgICAgIHJldHVybiBcInJpZ2h0XCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gICAgICB9IGVsc2UgaWYgKGRlZ3JlZXMgPj0gNDUgJiYgZGVncmVlcyA8PSAxMzUpIHtcbiAgICAgICAgcmV0dXJuIFwidG9wXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gICAgICB9IGVsc2UgaWYgKGRlZ3JlZXMgPiAxMzUgJiYgZGVncmVlcyA8IDIyNSkge1xuICAgICAgICByZXR1cm4gXCJsZWZ0XCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gXCJib3R0b21cIjtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U3R5bGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFN0eWxlcyhwcm9wcykge1xuICAgICAgdmFyIHRoZW1lID0gcHJvcHMudGhlbWUgfHwgVmljdG9yeVRoZW1lLmdyYXlzY2FsZTtcbiAgICAgIHZhciBkZWZhdWx0TGFiZWxTdHlsZXMgPSB0aGVtZSAmJiB0aGVtZS50b29sdGlwICYmIHRoZW1lLnRvb2x0aXAuc3R5bGUgPyB0aGVtZS50b29sdGlwLnN0eWxlIDoge307XG4gICAgICB2YXIgYmFzZUxhYmVsU3R5bGUgPSBBcnJheS5pc0FycmF5KHByb3BzLnN0eWxlKSA/IHByb3BzLnN0eWxlLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgICByZXR1cm4gX2RlZmF1bHRzKHt9LCBzLCBkZWZhdWx0TGFiZWxTdHlsZXMpO1xuICAgICAgfSkgOiBfZGVmYXVsdHMoe30sIHByb3BzLnN0eWxlLCBkZWZhdWx0TGFiZWxTdHlsZXMpO1xuICAgICAgdmFyIGRlZmF1bHRGbHlvdXRTdHlsZXMgPSB0aGVtZSAmJiB0aGVtZS50b29sdGlwICYmIHRoZW1lLnRvb2x0aXAuZmx5b3V0U3R5bGUgPyB0aGVtZS50b29sdGlwLmZseW91dFN0eWxlIDoge307XG4gICAgICB2YXIgYmFzZUZseW91dFN0eWxlID0gcHJvcHMuZmx5b3V0U3R5bGUgPyBfZGVmYXVsdHMoe30sIHByb3BzLmZseW91dFN0eWxlLCBkZWZhdWx0Rmx5b3V0U3R5bGVzKSA6IGRlZmF1bHRGbHlvdXRTdHlsZXM7XG4gICAgICB2YXIgc3R5bGUgPSBBcnJheS5pc0FycmF5KGJhc2VMYWJlbFN0eWxlKSA/IGJhc2VMYWJlbFN0eWxlLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgICByZXR1cm4gSGVscGVycy5ldmFsdWF0ZVN0eWxlKHMsIHByb3BzKTtcbiAgICAgIH0pIDogSGVscGVycy5ldmFsdWF0ZVN0eWxlKGJhc2VMYWJlbFN0eWxlLCBwcm9wcyk7XG4gICAgICB2YXIgZmx5b3V0U3R5bGUgPSBIZWxwZXJzLmV2YWx1YXRlU3R5bGUoYmFzZUZseW91dFN0eWxlLCBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgZmx5b3V0U3R5bGU6IGZseW91dFN0eWxlXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRFdmFsdWF0ZWRQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFdmFsdWF0ZWRQcm9wcyhwcm9wcykge1xuICAgICAgdmFyIGNvcm5lclJhZGl1cyA9IHByb3BzLmNvcm5lclJhZGl1cyxcbiAgICAgICAgICBjZW50ZXJPZmZzZXQgPSBwcm9wcy5jZW50ZXJPZmZzZXQsXG4gICAgICAgICAgZHggPSBwcm9wcy5keCxcbiAgICAgICAgICBkeSA9IHByb3BzLmR5O1xuICAgICAgdmFyIGFjdGl2ZSA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmFjdGl2ZSwgcHJvcHMpO1xuICAgICAgdmFyIHRleHQgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy50ZXh0LCBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICBhY3RpdmU6IGFjdGl2ZVxuICAgICAgfSkpO1xuXG4gICAgICB2YXIgX2dldFN0eWxlcyA9IHRoaXMuZ2V0U3R5bGVzKF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgICAgICB0ZXh0OiB0ZXh0XG4gICAgICB9KSksXG4gICAgICAgICAgc3R5bGUgPSBfZ2V0U3R5bGVzLnN0eWxlLFxuICAgICAgICAgIGZseW91dFN0eWxlID0gX2dldFN0eWxlcy5mbHlvdXRTdHlsZTtcblxuICAgICAgdmFyIG9yaWVudGF0aW9uID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMub3JpZW50YXRpb24sIF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIGZseW91dFN0eWxlOiBmbHlvdXRTdHlsZVxuICAgICAgfSkpIHx8IHRoaXMuZ2V0RGVmYXVsdE9yaWVudGF0aW9uKHByb3BzKTtcbiAgICAgIHZhciBwYWRkaW5nID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuZmx5b3V0UGFkZGluZywgX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgYWN0aXZlOiBhY3RpdmUsXG4gICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgZmx5b3V0U3R5bGU6IGZseW91dFN0eWxlLFxuICAgICAgICBvcmllbnRhdGlvbjogb3JpZW50YXRpb25cbiAgICAgIH0pKSB8fCB0aGlzLmdldExhYmVsUGFkZGluZyhzdHlsZSk7XG4gICAgICB2YXIgZmx5b3V0UGFkZGluZyA9IEhlbHBlcnMuZ2V0UGFkZGluZyh7XG4gICAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICAgIH0pO1xuICAgICAgdmFyIHBvaW50ZXJXaWR0aCA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLnBvaW50ZXJXaWR0aCwgX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgYWN0aXZlOiBhY3RpdmUsXG4gICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgZmx5b3V0U3R5bGU6IGZseW91dFN0eWxlLFxuICAgICAgICBvcmllbnRhdGlvbjogb3JpZW50YXRpb25cbiAgICAgIH0pKTtcbiAgICAgIHZhciBwb2ludGVyTGVuZ3RoID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMucG9pbnRlckxlbmd0aCwgX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgYWN0aXZlOiBhY3RpdmUsXG4gICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgZmx5b3V0U3R5bGU6IGZseW91dFN0eWxlLFxuICAgICAgICBvcmllbnRhdGlvbjogb3JpZW50YXRpb25cbiAgICAgIH0pKTtcbiAgICAgIHZhciBsYWJlbFNpemUgPSBUZXh0U2l6ZS5hcHByb3hpbWF0ZVRleHRTaXplKHRleHQsIHN0eWxlKTtcblxuICAgICAgdmFyIF9nZXREaW1lbnNpb25zID0gdGhpcy5nZXREaW1lbnNpb25zKF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgZmx5b3V0U3R5bGU6IGZseW91dFN0eWxlLFxuICAgICAgICBhY3RpdmU6IGFjdGl2ZSxcbiAgICAgICAgdGV4dDogdGV4dCxcbiAgICAgICAgb3JpZW50YXRpb246IG9yaWVudGF0aW9uLFxuICAgICAgICBmbHlvdXRQYWRkaW5nOiBmbHlvdXRQYWRkaW5nLFxuICAgICAgICBwb2ludGVyV2lkdGg6IHBvaW50ZXJXaWR0aCxcbiAgICAgICAgcG9pbnRlckxlbmd0aDogcG9pbnRlckxlbmd0aFxuICAgICAgfSksIGxhYmVsU2l6ZSksXG4gICAgICAgICAgZmx5b3V0SGVpZ2h0ID0gX2dldERpbWVuc2lvbnMuZmx5b3V0SGVpZ2h0LFxuICAgICAgICAgIGZseW91dFdpZHRoID0gX2dldERpbWVuc2lvbnMuZmx5b3V0V2lkdGg7XG5cbiAgICAgIHZhciBldmFsdWF0ZWRQcm9wcyA9IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIGZseW91dFN0eWxlOiBmbHlvdXRTdHlsZSxcbiAgICAgICAgb3JpZW50YXRpb246IG9yaWVudGF0aW9uLFxuICAgICAgICBmbHlvdXRIZWlnaHQ6IGZseW91dEhlaWdodCxcbiAgICAgICAgZmx5b3V0V2lkdGg6IGZseW91dFdpZHRoLFxuICAgICAgICBmbHlvdXRQYWRkaW5nOiBmbHlvdXRQYWRkaW5nLFxuICAgICAgICBwb2ludGVyV2lkdGg6IHBvaW50ZXJXaWR0aCxcbiAgICAgICAgcG9pbnRlckxlbmd0aDogcG9pbnRlckxlbmd0aFxuICAgICAgfSk7XG5cbiAgICAgIHZhciBvZmZzZXRYID0gX2lzUGxhaW5PYmplY3QoY2VudGVyT2Zmc2V0KSAmJiBjZW50ZXJPZmZzZXQueCAhPT0gdW5kZWZpbmVkID8gSGVscGVycy5ldmFsdWF0ZVByb3AoY2VudGVyT2Zmc2V0LngsIGV2YWx1YXRlZFByb3BzKSA6IDA7XG4gICAgICB2YXIgb2Zmc2V0WSA9IF9pc1BsYWluT2JqZWN0KGNlbnRlck9mZnNldCkgJiYgY2VudGVyT2Zmc2V0LnkgIT09IHVuZGVmaW5lZCA/IEhlbHBlcnMuZXZhbHVhdGVQcm9wKGNlbnRlck9mZnNldC55LCBldmFsdWF0ZWRQcm9wcykgOiAwO1xuICAgICAgcmV0dXJuIF9hc3NpZ24oe30sIGV2YWx1YXRlZFByb3BzLCB7XG4gICAgICAgIGNlbnRlck9mZnNldDoge1xuICAgICAgICAgIHg6IG9mZnNldFgsXG4gICAgICAgICAgeTogb2Zmc2V0WVxuICAgICAgICB9LFxuICAgICAgICBkeDogZHggIT09IHVuZGVmaW5lZCA/IEhlbHBlcnMuZXZhbHVhdGVQcm9wKGR4LCBldmFsdWF0ZWRQcm9wcykgOiAwLFxuICAgICAgICBkeTogZHkgIT09IHVuZGVmaW5lZCA/IEhlbHBlcnMuZXZhbHVhdGVQcm9wKGR5LCBldmFsdWF0ZWRQcm9wcykgOiAwLFxuICAgICAgICBjb3JuZXJSYWRpdXM6IEhlbHBlcnMuZXZhbHVhdGVQcm9wKGNvcm5lclJhZGl1cywgZXZhbHVhdGVkUHJvcHMpXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2FsY3VsYXRlZFZhbHVlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDYWxjdWxhdGVkVmFsdWVzKHByb3BzKSB7XG4gICAgICB2YXIgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICAgICAgICB0ZXh0ID0gcHJvcHMudGV4dCxcbiAgICAgICAgICBmbHlvdXRTdHlsZSA9IHByb3BzLmZseW91dFN0eWxlLFxuICAgICAgICAgIGZseW91dEhlaWdodCA9IHByb3BzLmZseW91dEhlaWdodCxcbiAgICAgICAgICBmbHlvdXRXaWR0aCA9IHByb3BzLmZseW91dFdpZHRoO1xuICAgICAgdmFyIGxhYmVsU2l6ZSA9IFRleHRTaXplLmFwcHJveGltYXRlVGV4dFNpemUodGV4dCwgc3R5bGUpO1xuICAgICAgdmFyIGZseW91dERpbWVuc2lvbnMgPSB7XG4gICAgICAgIGhlaWdodDogZmx5b3V0SGVpZ2h0LFxuICAgICAgICB3aWR0aDogZmx5b3V0V2lkdGhcbiAgICAgIH07XG4gICAgICB2YXIgZmx5b3V0Q2VudGVyID0gdGhpcy5nZXRGbHlvdXRDZW50ZXIocHJvcHMsIGZseW91dERpbWVuc2lvbnMpO1xuICAgICAgdmFyIHRyYW5zZm9ybSA9IHRoaXMuZ2V0VHJhbnNmb3JtKHByb3BzKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgZmx5b3V0U3R5bGU6IGZseW91dFN0eWxlLFxuICAgICAgICBsYWJlbFNpemU6IGxhYmVsU2l6ZSxcbiAgICAgICAgZmx5b3V0RGltZW5zaW9uczogZmx5b3V0RGltZW5zaW9ucyxcbiAgICAgICAgZmx5b3V0Q2VudGVyOiBmbHlvdXRDZW50ZXIsXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRUcmFuc2Zvcm1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VHJhbnNmb3JtKHByb3BzKSB7XG4gICAgICB2YXIgeCA9IHByb3BzLngsXG4gICAgICAgICAgeSA9IHByb3BzLnksXG4gICAgICAgICAgc3R5bGUgPSBwcm9wcy5zdHlsZTtcbiAgICAgIHZhciBsYWJlbFN0eWxlID0gc3R5bGUgfHwge307XG4gICAgICB2YXIgYW5nbGUgPSBsYWJlbFN0eWxlLmFuZ2xlIHx8IHByb3BzLmFuZ2xlIHx8IHRoaXMuZ2V0RGVmYXVsdEFuZ2xlKHByb3BzKTtcbiAgICAgIHJldHVybiBhbmdsZSA/IFwicm90YXRlKFwiLmNvbmNhdChhbmdsZSwgXCIgXCIpLmNvbmNhdCh4LCBcIiBcIikuY29uY2F0KHksIFwiKVwiKSA6IHVuZGVmaW5lZDtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5cbiAgfSwge1xuICAgIGtleTogXCJnZXREZWZhdWx0QW5nbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVmYXVsdEFuZ2xlKHByb3BzKSB7XG4gICAgICB2YXIgcG9sYXIgPSBwcm9wcy5wb2xhcixcbiAgICAgICAgICBsYWJlbFBsYWNlbWVudCA9IHByb3BzLmxhYmVsUGxhY2VtZW50LFxuICAgICAgICAgIG9yaWVudGF0aW9uID0gcHJvcHMub3JpZW50YXRpb24sXG4gICAgICAgICAgZGF0dW0gPSBwcm9wcy5kYXR1bTtcblxuICAgICAgaWYgKCFwb2xhciB8fCAhbGFiZWxQbGFjZW1lbnQgfHwgbGFiZWxQbGFjZW1lbnQgPT09IFwidmVydGljYWxcIikge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgdmFyIGRlZ3JlZXMgPSBMYWJlbEhlbHBlcnMuZ2V0RGVncmVlcyhwcm9wcywgZGF0dW0pO1xuICAgICAgdmFyIHNpZ24gPSBkZWdyZWVzID4gOTAgJiYgZGVncmVlcyA8IDE4MCB8fCBkZWdyZWVzID4gMjcwID8gMSA6IC0xO1xuICAgICAgdmFyIGxhYmVsUm90YXRpb24gPSBsYWJlbFBsYWNlbWVudCA9PT0gXCJwZXJwZW5kaWN1bGFyXCIgPyAwIDogOTA7XG4gICAgICB2YXIgYW5nbGU7XG5cbiAgICAgIGlmIChkZWdyZWVzID09PSAwIHx8IGRlZ3JlZXMgPT09IDE4MCkge1xuICAgICAgICBhbmdsZSA9IG9yaWVudGF0aW9uID09PSBcInRvcFwiICYmIGRlZ3JlZXMgPT09IDE4MCA/IDI3MCA6IDkwO1xuICAgICAgfSBlbHNlIGlmIChkZWdyZWVzID4gMCAmJiBkZWdyZWVzIDwgMTgwKSB7XG4gICAgICAgIGFuZ2xlID0gOTAgLSBkZWdyZWVzO1xuICAgICAgfSBlbHNlIGlmIChkZWdyZWVzID4gMTgwICYmIGRlZ3JlZXMgPCAzNjApIHtcbiAgICAgICAgYW5nbGUgPSAyNzAgLSBkZWdyZWVzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYW5nbGUgKyBzaWduICogbGFiZWxSb3RhdGlvbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29uc3RyYWluVG9vbHRpcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb25zdHJhaW5Ub29sdGlwKGNlbnRlciwgcHJvcHMsIGRpbWVuc2lvbnMpIHtcbiAgICAgIHZhciB4ID0gY2VudGVyLngsXG4gICAgICAgICAgeSA9IGNlbnRlci55O1xuICAgICAgdmFyIHdpZHRoID0gZGltZW5zaW9ucy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBkaW1lbnNpb25zLmhlaWdodDtcbiAgICAgIHZhciBleHRlbnQgPSB7XG4gICAgICAgIHg6IFswLCBwcm9wcy53aWR0aF0sXG4gICAgICAgIHk6IFswLCBwcm9wcy5oZWlnaHRdXG4gICAgICB9O1xuICAgICAgdmFyIGZseW91dEV4dGVudCA9IHtcbiAgICAgICAgeDogW3ggLSB3aWR0aCAvIDIsIHggKyB3aWR0aCAvIDJdLFxuICAgICAgICB5OiBbeSAtIGhlaWdodCAvIDIsIHkgKyBoZWlnaHQgLyAyXVxuICAgICAgfTtcbiAgICAgIHZhciBhZGp1c3RtZW50cyA9IHtcbiAgICAgICAgeDogW2ZseW91dEV4dGVudC54WzBdIDwgZXh0ZW50LnhbMF0gPyBleHRlbnQueFswXSAtIGZseW91dEV4dGVudC54WzBdIDogMCwgZmx5b3V0RXh0ZW50LnhbMV0gPiBleHRlbnQueFsxXSA/IGZseW91dEV4dGVudC54WzFdIC0gZXh0ZW50LnhbMV0gOiAwXSxcbiAgICAgICAgeTogW2ZseW91dEV4dGVudC55WzBdIDwgZXh0ZW50LnlbMF0gPyBleHRlbnQueVswXSAtIGZseW91dEV4dGVudC55WzBdIDogMCwgZmx5b3V0RXh0ZW50LnlbMV0gPiBleHRlbnQueVsxXSA/IGZseW91dEV4dGVudC55WzFdIC0gZXh0ZW50LnlbMV0gOiAwXVxuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IE1hdGgucm91bmQoeCArIGFkanVzdG1lbnRzLnhbMF0gLSBhZGp1c3RtZW50cy54WzFdKSxcbiAgICAgICAgeTogTWF0aC5yb3VuZCh5ICsgYWRqdXN0bWVudHMueVswXSAtIGFkanVzdG1lbnRzLnlbMV0pXG4gICAgICB9O1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcblxuICB9LCB7XG4gICAga2V5OiBcImdldEZseW91dENlbnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRGbHlvdXRDZW50ZXIocHJvcHMsIGRpbWVuc2lvbnMpIHtcbiAgICAgIHZhciB4ID0gcHJvcHMueCxcbiAgICAgICAgICB5ID0gcHJvcHMueSxcbiAgICAgICAgICBkeCA9IHByb3BzLmR4LFxuICAgICAgICAgIGR5ID0gcHJvcHMuZHksXG4gICAgICAgICAgcG9pbnRlckxlbmd0aCA9IHByb3BzLnBvaW50ZXJMZW5ndGgsXG4gICAgICAgICAgb3JpZW50YXRpb24gPSBwcm9wcy5vcmllbnRhdGlvbixcbiAgICAgICAgICBjb25zdHJhaW5Ub1Zpc2libGVBcmVhID0gcHJvcHMuY29uc3RyYWluVG9WaXNpYmxlQXJlYSxcbiAgICAgICAgICBjZW50ZXJPZmZzZXQgPSBwcm9wcy5jZW50ZXJPZmZzZXQ7XG4gICAgICB2YXIgaGVpZ2h0ID0gZGltZW5zaW9ucy5oZWlnaHQsXG4gICAgICAgICAgd2lkdGggPSBkaW1lbnNpb25zLndpZHRoO1xuICAgICAgdmFyIHhTaWduID0gb3JpZW50YXRpb24gPT09IFwibGVmdFwiID8gLTEgOiAxO1xuICAgICAgdmFyIHlTaWduID0gb3JpZW50YXRpb24gPT09IFwiYm90dG9tXCIgPyAtMSA6IDE7XG4gICAgICB2YXIgZmx5b3V0Q2VudGVyID0ge1xuICAgICAgICB4OiBvcmllbnRhdGlvbiA9PT0gXCJsZWZ0XCIgfHwgb3JpZW50YXRpb24gPT09IFwicmlnaHRcIiA/IHggKyB4U2lnbiAqIChwb2ludGVyTGVuZ3RoICsgd2lkdGggLyAyICsgeFNpZ24gKiBkeCkgOiB4ICsgZHgsXG4gICAgICAgIHk6IG9yaWVudGF0aW9uID09PSBcInRvcFwiIHx8IG9yaWVudGF0aW9uID09PSBcImJvdHRvbVwiID8geSAtIHlTaWduICogKHBvaW50ZXJMZW5ndGggKyBoZWlnaHQgLyAyIC0geVNpZ24gKiBkeSkgOiB5ICsgZHlcbiAgICAgIH07XG4gICAgICB2YXIgY2VudGVyID0ge1xuICAgICAgICB4OiBfaXNQbGFpbk9iamVjdChwcm9wcy5jZW50ZXIpICYmIHByb3BzLmNlbnRlci54ICE9PSB1bmRlZmluZWQgPyBwcm9wcy5jZW50ZXIueCA6IGZseW91dENlbnRlci54LFxuICAgICAgICB5OiBfaXNQbGFpbk9iamVjdChwcm9wcy5jZW50ZXIpICYmIHByb3BzLmNlbnRlci55ICE9PSB1bmRlZmluZWQgPyBwcm9wcy5jZW50ZXIueSA6IGZseW91dENlbnRlci55XG4gICAgICB9O1xuICAgICAgdmFyIGNlbnRlcldpdGhPZmZzZXQgPSB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgY2VudGVyT2Zmc2V0LngsXG4gICAgICAgIHk6IGNlbnRlci55ICsgY2VudGVyT2Zmc2V0LnlcbiAgICAgIH07XG4gICAgICByZXR1cm4gY29uc3RyYWluVG9WaXNpYmxlQXJlYSA/IHRoaXMuY29uc3RyYWluVG9vbHRpcChjZW50ZXJXaXRoT2Zmc2V0LCBwcm9wcywgZGltZW5zaW9ucykgOiBjZW50ZXJXaXRoT2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRMYWJlbFBhZGRpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TGFiZWxQYWRkaW5nKHN0eWxlKSB7XG4gICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICB2YXIgcGFkZGluZ3MgPSBBcnJheS5pc0FycmF5KHN0eWxlKSA/IHN0eWxlLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgICByZXR1cm4gcy5wYWRkaW5nO1xuICAgICAgfSkgOiBbc3R5bGUucGFkZGluZ107XG4gICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KHBhZGRpbmdzKS5jb25jYXQoWzBdKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldERpbWVuc2lvbnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGltZW5zaW9ucyhwcm9wcywgbGFiZWxTaXplKSB7XG4gICAgICB2YXIgb3JpZW50YXRpb24gPSBwcm9wcy5vcmllbnRhdGlvbixcbiAgICAgICAgICBwb2ludGVyTGVuZ3RoID0gcHJvcHMucG9pbnRlckxlbmd0aCxcbiAgICAgICAgICBwb2ludGVyV2lkdGggPSBwcm9wcy5wb2ludGVyV2lkdGgsXG4gICAgICAgICAgZmx5b3V0SGVpZ2h0ID0gcHJvcHMuZmx5b3V0SGVpZ2h0LFxuICAgICAgICAgIGZseW91dFdpZHRoID0gcHJvcHMuZmx5b3V0V2lkdGgsXG4gICAgICAgICAgZmx5b3V0UGFkZGluZyA9IHByb3BzLmZseW91dFBhZGRpbmc7XG4gICAgICB2YXIgY29ybmVyUmFkaXVzID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuY29ybmVyUmFkaXVzLCBwcm9wcyk7XG5cbiAgICAgIHZhciBnZXRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjYWxjdWxhdGVkSGVpZ2h0ID0gbGFiZWxTaXplLmhlaWdodCArIGZseW91dFBhZGRpbmcudG9wICsgZmx5b3V0UGFkZGluZy5ib3R0b207XG4gICAgICAgIHZhciBtaW5IZWlnaHQgPSBvcmllbnRhdGlvbiA9PT0gXCJ0b3BcIiB8fCBvcmllbnRhdGlvbiA9PT0gXCJib3R0b21cIiA/IDIgKiBjb3JuZXJSYWRpdXMgOiAyICogY29ybmVyUmFkaXVzICsgcG9pbnRlcldpZHRoO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgobWluSGVpZ2h0LCBjYWxjdWxhdGVkSGVpZ2h0KTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBnZXRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhbGN1bGF0ZWRXaWR0aCA9IGxhYmVsU2l6ZS53aWR0aCArIGZseW91dFBhZGRpbmcubGVmdCArIGZseW91dFBhZGRpbmcucmlnaHQ7XG4gICAgICAgIHZhciBtaW5XaWR0aCA9IG9yaWVudGF0aW9uID09PSBcImxlZnRcIiB8fCBvcmllbnRhdGlvbiA9PT0gXCJyaWdodFwiID8gMiAqIGNvcm5lclJhZGl1cyArIHBvaW50ZXJMZW5ndGggOiAyICogY29ybmVyUmFkaXVzO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgobWluV2lkdGgsIGNhbGN1bGF0ZWRXaWR0aCk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmbHlvdXRIZWlnaHQ6IGZseW91dEhlaWdodCA/IEhlbHBlcnMuZXZhbHVhdGVQcm9wKGZseW91dEhlaWdodCwgcHJvcHMpIDogZ2V0SGVpZ2h0KHByb3BzLCBsYWJlbFNpemUsIG9yaWVudGF0aW9uKSxcbiAgICAgICAgZmx5b3V0V2lkdGg6IGZseW91dFdpZHRoID8gSGVscGVycy5ldmFsdWF0ZVByb3AoZmx5b3V0V2lkdGgsIHByb3BzKSA6IGdldFdpZHRoKHByb3BzLCBsYWJlbFNpemUsIG9yaWVudGF0aW9uKVxuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TGFiZWxQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRMYWJlbFByb3BzKHByb3BzLCBjYWxjdWxhdGVkVmFsdWVzKSB7XG4gICAgICB2YXIgZmx5b3V0Q2VudGVyID0gY2FsY3VsYXRlZFZhbHVlcy5mbHlvdXRDZW50ZXIsXG4gICAgICAgICAgc3R5bGUgPSBjYWxjdWxhdGVkVmFsdWVzLnN0eWxlLFxuICAgICAgICAgIGxhYmVsU2l6ZSA9IGNhbGN1bGF0ZWRWYWx1ZXMubGFiZWxTaXplLFxuICAgICAgICAgIF9jYWxjdWxhdGVkVmFsdWVzJGR5ID0gY2FsY3VsYXRlZFZhbHVlcy5keSxcbiAgICAgICAgICBkeSA9IF9jYWxjdWxhdGVkVmFsdWVzJGR5ID09PSB2b2lkIDAgPyAwIDogX2NhbGN1bGF0ZWRWYWx1ZXMkZHksXG4gICAgICAgICAgX2NhbGN1bGF0ZWRWYWx1ZXMkZHggPSBjYWxjdWxhdGVkVmFsdWVzLmR4LFxuICAgICAgICAgIGR4ID0gX2NhbGN1bGF0ZWRWYWx1ZXMkZHggPT09IHZvaWQgMCA/IDAgOiBfY2FsY3VsYXRlZFZhbHVlcyRkeDtcbiAgICAgIHZhciB0ZXh0ID0gcHJvcHMudGV4dCxcbiAgICAgICAgICBkYXR1bSA9IHByb3BzLmRhdHVtLFxuICAgICAgICAgIGFjdGl2ZVBvaW50cyA9IHByb3BzLmFjdGl2ZVBvaW50cyxcbiAgICAgICAgICBsYWJlbENvbXBvbmVudCA9IHByb3BzLmxhYmVsQ29tcG9uZW50LFxuICAgICAgICAgIGluZGV4ID0gcHJvcHMuaW5kZXgsXG4gICAgICAgICAgZmx5b3V0UGFkZGluZyA9IHByb3BzLmZseW91dFBhZGRpbmc7XG4gICAgICB2YXIgdGV4dEFuY2hvciA9IChBcnJheS5pc0FycmF5KHN0eWxlKSAmJiBzdHlsZS5sZW5ndGggPyBzdHlsZVswXS50ZXh0QW5jaG9yIDogc3R5bGUudGV4dEFuY2hvcikgfHwgXCJtaWRkbGVcIjtcblxuICAgICAgdmFyIGdldExhYmVsWCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0ZXh0QW5jaG9yIHx8IHRleHRBbmNob3IgPT09IFwibWlkZGxlXCIpIHtcbiAgICAgICAgICByZXR1cm4gZmx5b3V0Q2VudGVyLng7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2lnbiA9IHRleHRBbmNob3IgPT09IFwiZW5kXCIgPyAtMSA6IDE7XG4gICAgICAgIHJldHVybiBmbHlvdXRDZW50ZXIueCAtIHNpZ24gKiAobGFiZWxTaXplLndpZHRoIC8gMik7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gX2RlZmF1bHRzKHt9LCBsYWJlbENvbXBvbmVudC5wcm9wcywge1xuICAgICAgICBrZXk6IFwiXCIuY29uY2F0KHRoaXMuaWQsIFwiLWxhYmVsLVwiKS5jb25jYXQoaW5kZXgpLFxuICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICBkYXR1bTogZGF0dW0sXG4gICAgICAgIGFjdGl2ZVBvaW50czogYWN0aXZlUG9pbnRzLFxuICAgICAgICB0ZXh0QW5jaG9yOiB0ZXh0QW5jaG9yLFxuICAgICAgICBkeTogZHksXG4gICAgICAgIGR4OiBkeCxcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICB4OiBnZXRMYWJlbFgoKSArIChmbHlvdXRQYWRkaW5nLmxlZnQgLSBmbHlvdXRQYWRkaW5nLnJpZ2h0KSAvIDIsXG4gICAgICAgIHk6IGZseW91dENlbnRlci55ICsgKGZseW91dFBhZGRpbmcudG9wIC0gZmx5b3V0UGFkZGluZy5ib3R0b20pIC8gMixcbiAgICAgICAgdmVydGljYWxBbmNob3I6IFwibWlkZGxlXCIsXG4gICAgICAgIGFuZ2xlOiBzdHlsZS5hbmdsZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFBvaW50ZXJPcmllbnRhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQb2ludGVyT3JpZW50YXRpb24ocG9pbnQsIGNlbnRlciwgZmx5b3V0RGltZW5zaW9ucykge1xuICAgICAgdmFyIGVkZ2VzID0ge1xuICAgICAgICBib3R0b206IGNlbnRlci55ICsgZmx5b3V0RGltZW5zaW9ucy5oZWlnaHQgLyAyLFxuICAgICAgICB0b3A6IGNlbnRlci55IC0gZmx5b3V0RGltZW5zaW9ucy5oZWlnaHQgLyAyLFxuICAgICAgICBsZWZ0OiBjZW50ZXIueCAtIGZseW91dERpbWVuc2lvbnMud2lkdGggLyAyLFxuICAgICAgICByaWdodDogY2VudGVyLnggKyBmbHlvdXREaW1lbnNpb25zLndpZHRoIC8gMlxuICAgICAgfTtcbiAgICAgIHZhciBnYXBzID0gW3tcbiAgICAgICAgc2lkZTogXCJ0b3BcIixcbiAgICAgICAgdmFsOiBlZGdlcy50b3AgPiBwb2ludC55ID8gZWRnZXMudG9wIC0gcG9pbnQueSA6IC0xXG4gICAgICB9LCB7XG4gICAgICAgIHNpZGU6IFwiYm90dG9tXCIsXG4gICAgICAgIHZhbDogZWRnZXMuYm90dG9tIDwgcG9pbnQueSA/IHBvaW50LnkgLSBlZGdlcy5ib3R0b20gOiAtMVxuICAgICAgfSwge1xuICAgICAgICBzaWRlOiBcInJpZ2h0XCIsXG4gICAgICAgIHZhbDogZWRnZXMucmlnaHQgPCBwb2ludC54ID8gcG9pbnQueCAtIGVkZ2VzLnJpZ2h0IDogLTFcbiAgICAgIH0sIHtcbiAgICAgICAgc2lkZTogXCJsZWZ0XCIsXG4gICAgICAgIHZhbDogZWRnZXMubGVmdCA+IHBvaW50LnggPyBlZGdlcy5sZWZ0IC0gcG9pbnQueCA6IC0xXG4gICAgICB9XTtcbiAgICAgIHJldHVybiBfb3JkZXJCeShnYXBzLCBcInZhbFwiLCBcImRlc2NcIilbMF0uc2lkZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Rmx5b3V0UHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Rmx5b3V0UHJvcHMocHJvcHMsIGNhbGN1bGF0ZWRWYWx1ZXMpIHtcbiAgICAgIHZhciBmbHlvdXREaW1lbnNpb25zID0gY2FsY3VsYXRlZFZhbHVlcy5mbHlvdXREaW1lbnNpb25zLFxuICAgICAgICAgIGZseW91dFN0eWxlID0gY2FsY3VsYXRlZFZhbHVlcy5mbHlvdXRTdHlsZSxcbiAgICAgICAgICBmbHlvdXRDZW50ZXIgPSBjYWxjdWxhdGVkVmFsdWVzLmZseW91dENlbnRlcjtcbiAgICAgIHZhciB4ID0gcHJvcHMueCxcbiAgICAgICAgICB5ID0gcHJvcHMueSxcbiAgICAgICAgICBkeCA9IHByb3BzLmR4LFxuICAgICAgICAgIGR5ID0gcHJvcHMuZHksXG4gICAgICAgICAgZGF0dW0gPSBwcm9wcy5kYXR1bSxcbiAgICAgICAgICBhY3RpdmVQb2ludHMgPSBwcm9wcy5hY3RpdmVQb2ludHMsXG4gICAgICAgICAgaW5kZXggPSBwcm9wcy5pbmRleCxcbiAgICAgICAgICBwb2ludGVyTGVuZ3RoID0gcHJvcHMucG9pbnRlckxlbmd0aCxcbiAgICAgICAgICBwb2ludGVyV2lkdGggPSBwcm9wcy5wb2ludGVyV2lkdGgsXG4gICAgICAgICAgY29ybmVyUmFkaXVzID0gcHJvcHMuY29ybmVyUmFkaXVzLFxuICAgICAgICAgIGV2ZW50cyA9IHByb3BzLmV2ZW50cyxcbiAgICAgICAgICBmbHlvdXRDb21wb25lbnQgPSBwcm9wcy5mbHlvdXRDb21wb25lbnQ7XG4gICAgICB2YXIgcG9pbnRlck9yaWVudGF0aW9uID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMucG9pbnRlck9yaWVudGF0aW9uLCBwcm9wcyk7XG4gICAgICByZXR1cm4gX2RlZmF1bHRzKHt9LCBmbHlvdXRDb21wb25lbnQucHJvcHMsIHtcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeSxcbiAgICAgICAgZHg6IGR4LFxuICAgICAgICBkeTogZHksXG4gICAgICAgIGRhdHVtOiBkYXR1bSxcbiAgICAgICAgYWN0aXZlUG9pbnRzOiBhY3RpdmVQb2ludHMsXG4gICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgcG9pbnRlckxlbmd0aDogcG9pbnRlckxlbmd0aCxcbiAgICAgICAgcG9pbnRlcldpZHRoOiBwb2ludGVyV2lkdGgsXG4gICAgICAgIGNvcm5lclJhZGl1czogY29ybmVyUmFkaXVzLFxuICAgICAgICBldmVudHM6IGV2ZW50cyxcbiAgICAgICAgb3JpZW50YXRpb246IHBvaW50ZXJPcmllbnRhdGlvbiB8fCB0aGlzLmdldFBvaW50ZXJPcmllbnRhdGlvbih7XG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiB5XG4gICAgICAgIH0sIGZseW91dENlbnRlciwgZmx5b3V0RGltZW5zaW9ucyksXG4gICAgICAgIGtleTogXCJcIi5jb25jYXQodGhpcy5pZCwgXCItdG9vbHRpcC1cIikuY29uY2F0KGluZGV4KSxcbiAgICAgICAgd2lkdGg6IGZseW91dERpbWVuc2lvbnMud2lkdGgsXG4gICAgICAgIGhlaWdodDogZmx5b3V0RGltZW5zaW9ucy5oZWlnaHQsXG4gICAgICAgIHN0eWxlOiBmbHlvdXRTdHlsZSxcbiAgICAgICAgY2VudGVyOiBmbHlvdXRDZW50ZXJcbiAgICAgIH0pO1xuICAgIH0gLy8gT3ZlcnJpZGRlbiBpbiB2aWN0b3J5LWNvcmUtbmF0aXZlXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJUb29sdGlwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlclRvb2x0aXAocHJvcHMpIHtcbiAgICAgIHZhciBhY3RpdmUgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy5hY3RpdmUsIHByb3BzKTtcbiAgICAgIHZhciByZW5kZXJJblBvcnRhbCA9IHByb3BzLnJlbmRlckluUG9ydGFsO1xuXG4gICAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgICByZXR1cm4gcmVuZGVySW5Qb3J0YWwgPyBSZWFjdC5jcmVhdGVFbGVtZW50KFZpY3RvcnlQb3J0YWwsIG51bGwsIG51bGwpIDogbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGV2YWx1YXRlZFByb3BzID0gdGhpcy5nZXRFdmFsdWF0ZWRQcm9wcyhwcm9wcyk7XG4gICAgICB2YXIgZmx5b3V0Q29tcG9uZW50ID0gZXZhbHVhdGVkUHJvcHMuZmx5b3V0Q29tcG9uZW50LFxuICAgICAgICAgIGxhYmVsQ29tcG9uZW50ID0gZXZhbHVhdGVkUHJvcHMubGFiZWxDb21wb25lbnQsXG4gICAgICAgICAgZ3JvdXBDb21wb25lbnQgPSBldmFsdWF0ZWRQcm9wcy5ncm91cENvbXBvbmVudDtcbiAgICAgIHZhciBjYWxjdWxhdGVkVmFsdWVzID0gdGhpcy5nZXRDYWxjdWxhdGVkVmFsdWVzKGV2YWx1YXRlZFByb3BzKTtcbiAgICAgIHZhciBjaGlsZHJlbiA9IFtSZWFjdC5jbG9uZUVsZW1lbnQoZmx5b3V0Q29tcG9uZW50LCB0aGlzLmdldEZseW91dFByb3BzKGV2YWx1YXRlZFByb3BzLCBjYWxjdWxhdGVkVmFsdWVzKSksIFJlYWN0LmNsb25lRWxlbWVudChsYWJlbENvbXBvbmVudCwgdGhpcy5nZXRMYWJlbFByb3BzKGV2YWx1YXRlZFByb3BzLCBjYWxjdWxhdGVkVmFsdWVzKSldO1xuICAgICAgdmFyIHRvb2x0aXAgPSBSZWFjdC5jbG9uZUVsZW1lbnQoZ3JvdXBDb21wb25lbnQsIHtcbiAgICAgICAgcm9sZTogXCJwcmVzZW50YXRpb25cIixcbiAgICAgICAgdHJhbnNmb3JtOiBjYWxjdWxhdGVkVmFsdWVzLnRyYW5zZm9ybVxuICAgICAgfSwgY2hpbGRyZW4pO1xuICAgICAgcmV0dXJuIHJlbmRlckluUG9ydGFsID8gUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5UG9ydGFsLCBudWxsLCB0b29sdGlwKSA6IHRvb2x0aXA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgcHJvcHMgPSBIZWxwZXJzLm1vZGlmeVByb3BzKHRoaXMucHJvcHMsIGZhbGxiYWNrUHJvcHMsIFwidG9vbHRpcFwiKTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclRvb2x0aXAocHJvcHMpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBWaWN0b3J5VG9vbHRpcDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlUb29sdGlwLCBcImRpc3BsYXlOYW1lXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFwiVmljdG9yeVRvb2x0aXBcIlxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVRvb2x0aXAsIFwicm9sZVwiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBcInRvb2x0aXBcIlxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVRvb2x0aXAsIFwicHJvcFR5cGVzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHtcbiAgICBhY3RpdmF0ZURhdGE6IFByb3BUeXBlcy5ib29sLFxuICAgIGFjdGl2ZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgYWN0aXZlUG9pbnRzOiBQcm9wVHlwZXMuYXJyYXksXG4gICAgYW5nbGU6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgY2VudGVyOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgeDogQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlLFxuICAgICAgeTogQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlXG4gICAgfSksXG4gICAgY2VudGVyT2Zmc2V0OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgeDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICAgIHk6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5mdW5jXSlcbiAgICB9KSxcbiAgICBjb25zdHJhaW5Ub1Zpc2libGVBcmVhOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBjb3JuZXJSYWRpdXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZSwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBkYXRhOiBQcm9wVHlwZXMuYXJyYXksXG4gICAgZGF0dW06IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZHg6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgZHk6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgZXZlbnRzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGZseW91dENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gICAgZmx5b3V0SGVpZ2h0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmUsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgZmx5b3V0UGFkZGluZzogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICB0b3A6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICBib3R0b206IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICBsZWZ0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgcmlnaHQ6IFByb3BUeXBlcy5udW1iZXJcbiAgICB9KV0pLFxuICAgIGZseW91dFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGZseW91dFdpZHRoOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmUsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgZ3JvdXBDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICAgIGhlaWdodDogUHJvcFR5cGVzLm51bWJlcixcbiAgICBob3Jpem9udGFsOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBpZDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuICAgIGluZGV4OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gICAgbGFiZWxDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICAgIG9yaWVudGF0aW9uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub25lT2YoW1widG9wXCIsIFwiYm90dG9tXCIsIFwibGVmdFwiLCBcInJpZ2h0XCJdKSwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBwb2ludGVyTGVuZ3RoOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmUsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgcG9pbnRlck9yaWVudGF0aW9uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub25lT2YoW1widG9wXCIsIFwiYm90dG9tXCIsIFwibGVmdFwiLCBcInJpZ2h0XCJdKSwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBwb2ludGVyV2lkdGg6IFByb3BUeXBlcy5vbmVPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZSwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBwb2xhcjogUHJvcFR5cGVzLmJvb2wsXG4gICAgcmVuZGVySW5Qb3J0YWw6IFByb3BUeXBlcy5ib29sLFxuICAgIHNjYWxlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgeDogQ3VzdG9tUHJvcFR5cGVzLnNjYWxlLFxuICAgICAgeTogQ3VzdG9tUHJvcFR5cGVzLnNjYWxlXG4gICAgfSksXG4gICAgc3R5bGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vYmplY3QsIFByb3BUeXBlcy5hcnJheV0pLFxuICAgIHRleHQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5mdW5jLCBQcm9wVHlwZXMuYXJyYXldKSxcbiAgICB0aGVtZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICB3aWR0aDogUHJvcFR5cGVzLm51bWJlcixcbiAgICB4OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHk6IFByb3BUeXBlcy5udW1iZXJcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVRvb2x0aXAsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHtcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIHJlbmRlckluUG9ydGFsOiB0cnVlLFxuICAgIGxhYmVsQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KFZpY3RvcnlMYWJlbCwgbnVsbCksXG4gICAgZmx5b3V0Q29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KEZseW91dCwgbnVsbCksXG4gICAgZ3JvdXBDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIG51bGwpXG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlUb29sdGlwLCBcImRlZmF1bHRFdmVudHNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgdmFyIGFjdGl2YXRlID0gcHJvcHMuYWN0aXZhdGVEYXRhID8gW3tcbiAgICAgIHRhcmdldDogXCJsYWJlbHNcIixcbiAgICAgIG11dGF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWN0aXZlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgdGFyZ2V0OiBcImRhdGFcIixcbiAgICAgIG11dGF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWN0aXZlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfV0gOiBbe1xuICAgICAgdGFyZ2V0OiBcImxhYmVsc1wiLFxuICAgICAgbXV0YXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhY3RpdmU6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XTtcbiAgICB2YXIgZGVhY3RpdmF0ZSA9IHByb3BzLmFjdGl2YXRlRGF0YSA/IFt7XG4gICAgICB0YXJnZXQ6IFwibGFiZWxzXCIsXG4gICAgICBtdXRhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFjdGl2ZTogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgdGFyZ2V0OiBcImRhdGFcIixcbiAgICAgIG11dGF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWN0aXZlOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XSA6IFt7XG4gICAgICB0YXJnZXQ6IFwibGFiZWxzXCIsXG4gICAgICBtdXRhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFjdGl2ZTogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfV07XG4gICAgcmV0dXJuIFt7XG4gICAgICB0YXJnZXQ6IFwiZGF0YVwiLFxuICAgICAgZXZlbnRIYW5kbGVyczoge1xuICAgICAgICBvbk1vdXNlT3ZlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBhY3RpdmF0ZTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Gb2N1czogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBhY3RpdmF0ZTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ub3VjaFN0YXJ0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGFjdGl2YXRlO1xuICAgICAgICB9LFxuICAgICAgICBvbk1vdXNlT3V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGU7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQmx1cjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBkZWFjdGl2YXRlO1xuICAgICAgICB9LFxuICAgICAgICBvblRvdWNoRW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGRlYWN0aXZhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XTtcbiAgfVxufSk7XG5leHBvcnQgeyBWaWN0b3J5VG9vbHRpcCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IHsgVmljdG9yeVRvb2x0aXAgfSBmcm9tICd2aWN0b3J5LXRvb2x0aXAnO1xuaW1wb3J0IHsgQ2hhcnRMYWJlbCB9IGZyb20gJy4uL0NoYXJ0TGFiZWwnO1xuaW1wb3J0IHsgZ2V0VGhlbWUgfSBmcm9tICcuLi9DaGFydFV0aWxzJztcbmV4cG9ydCBjb25zdCBDaGFydFRvb2x0aXAgPSAoX2EpID0+IHtcbiAgICB2YXIgeyBjb25zdHJhaW5Ub1Zpc2libGVBcmVhID0gZmFsc2UsIGxhYmVsQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydExhYmVsLCBudWxsKSwgLy8gTm90ZSB0aGF0IFZpY3RvcnkgcHJvdmlkZXMgaXRzIG93biBsYWJlbCBjb21wb25lbnQgaGVyZVxuICAgIGxhYmVsVGV4dEFuY2hvciwgdGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCBcbiAgICAvLyBkZXN0cnVjdHVyZSBsYXN0XG4gICAgdGhlbWUgPSBnZXRUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpIH0gPSBfYSwgcmVzdCA9IF9fcmVzdChfYSwgW1wiY29uc3RyYWluVG9WaXNpYmxlQXJlYVwiLCBcImxhYmVsQ29tcG9uZW50XCIsIFwibGFiZWxUZXh0QW5jaG9yXCIsIFwidGhlbWVDb2xvclwiLCBcInRoZW1lVmFyaWFudFwiLCBcInRoZW1lXCJdKTtcbiAgICBjb25zdCBjaGFydExhYmVsQ29tcG9uZW50ID0gUmVhY3QuY2xvbmVFbGVtZW50KGxhYmVsQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgdGV4dEFuY2hvcjogbGFiZWxUZXh0QW5jaG9yLCB0aGVtZSB9LCBsYWJlbENvbXBvbmVudC5wcm9wcykpO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5VG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGNvbnN0cmFpblRvVmlzaWJsZUFyZWE6IGNvbnN0cmFpblRvVmlzaWJsZUFyZWEsIGxhYmVsQ29tcG9uZW50OiBjaGFydExhYmVsQ29tcG9uZW50LCB0aGVtZTogdGhlbWUgfSwgcmVzdCkpKTtcbn07XG5DaGFydFRvb2x0aXAuZGlzcGxheU5hbWUgPSAnQ2hhcnRUb29sdGlwJztcbi8vIE5vdGU6IFZpY3RvcnlUb29sdGlwLmRlZmF1bHRFdmVudHMgbXVzdCBiZSBob2lzdGVkXG5ob2lzdE5vblJlYWN0U3RhdGljcyhDaGFydFRvb2x0aXAsIFZpY3RvcnlUb29sdGlwKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJ0VG9vbHRpcC5qcy5tYXAiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IHsgVmljdG9yeUJhciB9IGZyb20gJ3ZpY3RvcnktYmFyJztcbmltcG9ydCB7IGdldENvbXBhcmF0aXZlTWVhc3VyZURhdGEgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IENoYXJ0QmFyIH0gZnJvbSAnLi4vQ2hhcnRCYXInO1xuaW1wb3J0IHsgQ2hhcnRDb250YWluZXIgfSBmcm9tICcuLi9DaGFydENvbnRhaW5lcic7XG5pbXBvcnQgeyBDaGFydEJ1bGxldFN0eWxlcyB9IGZyb20gJy4uL0NoYXJ0VGhlbWUnO1xuaW1wb3J0IHsgQ2hhcnRUb29sdGlwIH0gZnJvbSAnLi4vQ2hhcnRUb29sdGlwJztcbmltcG9ydCB7IGdldEJ1bGxldENvbXBhcmF0aXZlTWVhc3VyZVRoZW1lIH0gZnJvbSAnLi4vQ2hhcnRVdGlscyc7XG5leHBvcnQgY29uc3QgQ2hhcnRCdWxsZXRDb21wYXJhdGl2ZU1lYXN1cmUgPSAoeyBhbGxvd1Rvb2x0aXAgPSB0cnVlLCBhcmlhRGVzYywgYXJpYVRpdGxlLCBiYXJXaWR0aCA9IENoYXJ0QnVsbGV0U3R5bGVzLmNvbXBhcmF0aXZlTWVhc3VyZVdpZHRoLCBjb25zdHJhaW5Ub1Zpc2libGVBcmVhID0gZmFsc2UsIGRhdGEsIGRvbWFpbiwgaG9yaXpvbnRhbCA9IHRydWUsIGxhYmVscywgbWVhc3VyZUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRCYXIsIG51bGwpLCAvLyBVc2luZyBiYXIgaW5zdGVhZCBvZiBsaW5lIGZvciB0b29sdGlwIGZ1bmN0aW9uYWxpdHlcbnBhZGRpbmcsIHN0YW5kYWxvbmUgPSB0cnVlLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIHksIFxuLy8gZGVzdHJ1Y3R1cmUgbGFzdFxudGhlbWUgPSBnZXRCdWxsZXRDb21wYXJhdGl2ZU1lYXN1cmVUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpLCBoZWlnaHQgPSB0aGVtZS5iYXIuaGVpZ2h0LCB3aWR0aCA9IHRoZW1lLmJhci53aWR0aCwgbGFiZWxDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0VG9vbHRpcCwgbnVsbCkgfSkgPT4ge1xuICAgIGNvbnN0IGNvbXB1dGVkRGF0YSA9IGdldENvbXBhcmF0aXZlTWVhc3VyZURhdGEoe1xuICAgICAgICBkYXRhLFxuICAgICAgICB0aGVtZSxcbiAgICAgICAgeVxuICAgIH0pO1xuICAgIC8vIExhYmVsIGNvbXBvbmVudFxuICAgIC8vXG4gICAgLy8gTm90ZTogU1ZHIGhlaWdodCBhbmQgd2lkdGggYXJlIHByb3ZpZGVkIGJ5IENoYXJ0QnVsbGV0IGFzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGNvbnN0cmFpblRvVmlzaWJsZUFyZWFcbiAgICBjb25zdCB0b29sdGlwID0gUmVhY3QuY2xvbmVFbGVtZW50KGxhYmVsQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgY29uc3RyYWluVG9WaXNpYmxlQXJlYSwgZHg6ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChob3Jpem9udGFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0eXBlb2YgYmFyV2lkdGggPT09ICdmdW5jdGlvbicgPyBiYXJXaWR0aChkYXRhKSA6IGJhcldpZHRoO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAvIDI7XG4gICAgICAgIH0sIGR5OiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWhvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHR5cGVvZiBiYXJXaWR0aCA9PT0gJ2Z1bmN0aW9uJyA/IGJhcldpZHRoKGRhdGEpIDogYmFyV2lkdGg7XG4gICAgICAgICAgICByZXR1cm4gLShyZXN1bHQgLyAyKTtcbiAgICAgICAgfSwgb3JpZW50YXRpb246ICd0b3AnIH0sIGxhYmVsQ29tcG9uZW50LnByb3BzKSk7XG4gICAgY29uc3QgbWVhc3VyZSA9IGNvbXB1dGVkRGF0YS5tYXAoKGRhdGFQb2ludCwgaW5kZXgpID0+IFJlYWN0LmNsb25lRWxlbWVudChtZWFzdXJlQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgYmFyV2lkdGgsIGRhdGE6IFtPYmplY3QuYXNzaWduKHt9LCBkYXRhUG9pbnQpXSwgZG9tYWluLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIGhvcml6b250YWwsIGxhYmVsQ29tcG9uZW50OiBhbGxvd1Rvb2x0aXAgPyB0b29sdGlwIDogdW5kZWZpbmVkLCBsYWJlbHMsIGtleTogYHBmLWNoYXJ0LWJ1bGxldC1jb21wYXJhdGl2ZS1tZWFzdXJlLSR7aW5kZXh9YCwgcGFkZGluZywgc3RhbmRhbG9uZTogZmFsc2UsIHRoZW1lLFxuICAgICAgICB3aWR0aCB9LCBtZWFzdXJlQ29tcG9uZW50LnByb3BzKSkpO1xuICAgIHJldHVybiBzdGFuZGFsb25lID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRDb250YWluZXIsIHsgZGVzYzogYXJpYURlc2MsIGhlaWdodDogaGVpZ2h0LCB0aXRsZTogYXJpYVRpdGxlLCB3aWR0aDogd2lkdGggfSwgbWVhc3VyZSkpIDogKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIG1lYXN1cmUpKTtcbn07XG5DaGFydEJ1bGxldENvbXBhcmF0aXZlTWVhc3VyZS5kaXNwbGF5TmFtZSA9ICdDaGFydEJ1bGxldENvbXBhcmF0aXZlTWVhc3VyZSc7XG4vLyBOb3RlOiBWaWN0b3J5QmFyLnJvbGUgbXVzdCBiZSBob2lzdGVkXG5ob2lzdE5vblJlYWN0U3RhdGljcyhDaGFydEJ1bGxldENvbXBhcmF0aXZlTWVhc3VyZSwgVmljdG9yeUJhcik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFydEJ1bGxldENvbXBhcmF0aXZlTWVhc3VyZS5qcy5tYXAiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IHsgVmljdG9yeUJhciB9IGZyb20gJ3ZpY3RvcnktYmFyJztcbmltcG9ydCB7IENoYXJ0Q29udGFpbmVyIH0gZnJvbSAnLi4vQ2hhcnRDb250YWluZXInO1xuaW1wb3J0IHsgZ2V0QnVsbGV0Q29tcGFyYXRpdmVFcnJvck1lYXN1cmVUaGVtZSB9IGZyb20gJy4uL0NoYXJ0VXRpbHMnO1xuaW1wb3J0IHsgQ2hhcnRCdWxsZXRDb21wYXJhdGl2ZU1lYXN1cmUgfSBmcm9tICcuL0NoYXJ0QnVsbGV0Q29tcGFyYXRpdmVNZWFzdXJlJztcbmV4cG9ydCBjb25zdCBDaGFydEJ1bGxldENvbXBhcmF0aXZlRXJyb3JNZWFzdXJlID0gKHsgYWxsb3dUb29sdGlwID0gdHJ1ZSwgYXJpYURlc2MsIGFyaWFUaXRsZSwgYmFyV2lkdGgsIGNvbnN0cmFpblRvVmlzaWJsZUFyZWEgPSBmYWxzZSwgZGF0YSwgZG9tYWluLCBob3Jpem9udGFsID0gdHJ1ZSwgbGFiZWxDb21wb25lbnQsIGxhYmVscywgbWVhc3VyZUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRCdWxsZXRDb21wYXJhdGl2ZU1lYXN1cmUsIG51bGwpLCBwYWRkaW5nLCBzdGFuZGFsb25lID0gdHJ1ZSwgdGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCB5LCBcbi8vIGRlc3RydWN0dXJlIGxhc3RcbnRoZW1lID0gZ2V0QnVsbGV0Q29tcGFyYXRpdmVFcnJvck1lYXN1cmVUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpLCBoZWlnaHQgPSB0aGVtZS5iYXIuaGVpZ2h0LCB3aWR0aCA9IHRoZW1lLmJhci53aWR0aCB9KSA9PiB7XG4gICAgLy8gQ29tcGFyYXRpdmUgbWVhc3VyZSBjb21wb25lbnRcbiAgICBjb25zdCBtZWFzdXJlID0gUmVhY3QuY2xvbmVFbGVtZW50KG1lYXN1cmVDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oeyBhbGxvd1Rvb2x0aXAsXG4gICAgICAgIGFyaWFEZXNjLFxuICAgICAgICBhcmlhVGl0bGUsXG4gICAgICAgIGJhcldpZHRoLFxuICAgICAgICBjb25zdHJhaW5Ub1Zpc2libGVBcmVhLFxuICAgICAgICBkYXRhLFxuICAgICAgICBkb21haW4sXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgaG9yaXpvbnRhbCxcbiAgICAgICAgbGFiZWxDb21wb25lbnQsXG4gICAgICAgIGxhYmVscyxcbiAgICAgICAgcGFkZGluZywgc3RhbmRhbG9uZTogZmFsc2UsIHRoZW1lLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgeSB9LCBtZWFzdXJlQ29tcG9uZW50LnByb3BzKSk7XG4gICAgcmV0dXJuIHN0YW5kYWxvbmUgPyAoUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydENvbnRhaW5lciwgeyBkZXNjOiBhcmlhRGVzYywgaGVpZ2h0OiBoZWlnaHQsIHRpdGxlOiBhcmlhVGl0bGUsIHdpZHRoOiB3aWR0aCB9LCBtZWFzdXJlKSkgOiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgbWVhc3VyZSkpO1xufTtcbkNoYXJ0QnVsbGV0Q29tcGFyYXRpdmVFcnJvck1lYXN1cmUuZGlzcGxheU5hbWUgPSAnQ2hhcnRCdWxsZXRDb21wYXJhdGl2ZUVycm9yTWVhc3VyZSc7XG4vLyBOb3RlOiBWaWN0b3J5QmFyLnJvbGUgbXVzdCBiZSBob2lzdGVkXG5ob2lzdE5vblJlYWN0U3RhdGljcyhDaGFydEJ1bGxldENvbXBhcmF0aXZlRXJyb3JNZWFzdXJlLCBWaWN0b3J5QmFyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJ0QnVsbGV0Q29tcGFyYXRpdmVFcnJvck1lYXN1cmUuanMubWFwIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGhvaXN0Tm9uUmVhY3RTdGF0aWNzIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJztcbmltcG9ydCB7IFZpY3RvcnlCYXIgfSBmcm9tICd2aWN0b3J5LWJhcic7XG5pbXBvcnQgeyBDaGFydENvbnRhaW5lciB9IGZyb20gJy4uL0NoYXJ0Q29udGFpbmVyJztcbmltcG9ydCB7IGdldEJ1bGxldENvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVUaGVtZSB9IGZyb20gJy4uL0NoYXJ0VXRpbHMnO1xuaW1wb3J0IHsgQ2hhcnRCdWxsZXRDb21wYXJhdGl2ZU1lYXN1cmUgfSBmcm9tICcuL0NoYXJ0QnVsbGV0Q29tcGFyYXRpdmVNZWFzdXJlJztcbmV4cG9ydCBjb25zdCBDaGFydEJ1bGxldENvbXBhcmF0aXZlV2FybmluZ01lYXN1cmUgPSAoeyBhbGxvd1Rvb2x0aXAgPSB0cnVlLCBhcmlhRGVzYywgYXJpYVRpdGxlLCBiYXJXaWR0aCwgY29uc3RyYWluVG9WaXNpYmxlQXJlYSA9IGZhbHNlLCBkYXRhLCBkb21haW4sIGhvcml6b250YWwgPSB0cnVlLCBsYWJlbENvbXBvbmVudCwgbGFiZWxzLCBtZWFzdXJlQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydEJ1bGxldENvbXBhcmF0aXZlTWVhc3VyZSwgbnVsbCksIHBhZGRpbmcsIHN0YW5kYWxvbmUgPSB0cnVlLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIHksIFxuLy8gZGVzdHJ1Y3R1cmUgbGFzdFxudGhlbWUgPSBnZXRCdWxsZXRDb21wYXJhdGl2ZVdhcm5pbmdNZWFzdXJlVGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSwgaGVpZ2h0ID0gdGhlbWUuYmFyLmhlaWdodCwgd2lkdGggPSB0aGVtZS5iYXIud2lkdGggfSkgPT4ge1xuICAgIC8vIENvbXBhcmF0aXZlIG1lYXN1cmUgY29tcG9uZW50XG4gICAgY29uc3QgbWVhc3VyZSA9IFJlYWN0LmNsb25lRWxlbWVudChtZWFzdXJlQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgYWxsb3dUb29sdGlwLFxuICAgICAgICBhcmlhRGVzYyxcbiAgICAgICAgYXJpYVRpdGxlLFxuICAgICAgICBiYXJXaWR0aCxcbiAgICAgICAgY29uc3RyYWluVG9WaXNpYmxlQXJlYSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgZG9tYWluLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIGhvcml6b250YWwsXG4gICAgICAgIGxhYmVsQ29tcG9uZW50LFxuICAgICAgICBsYWJlbHMsXG4gICAgICAgIHBhZGRpbmcsIHN0YW5kYWxvbmU6IGZhbHNlLCB0aGVtZSxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIHkgfSwgbWVhc3VyZUNvbXBvbmVudC5wcm9wcykpO1xuICAgIHJldHVybiBzdGFuZGFsb25lID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRDb250YWluZXIsIHsgZGVzYzogYXJpYURlc2MsIGhlaWdodDogaGVpZ2h0LCB0aXRsZTogYXJpYVRpdGxlLCB3aWR0aDogd2lkdGggfSwgbWVhc3VyZSkpIDogKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIG1lYXN1cmUpKTtcbn07XG5DaGFydEJ1bGxldENvbXBhcmF0aXZlV2FybmluZ01lYXN1cmUuZGlzcGxheU5hbWUgPSAnQ2hhcnRCdWxsZXRDb21wYXJhdGl2ZVdhcm5pbmdNZWFzdXJlJztcbi8vIE5vdGU6IFZpY3RvcnlCYXIucm9sZSBtdXN0IGJlIGhvaXN0ZWRcbmhvaXN0Tm9uUmVhY3RTdGF0aWNzKENoYXJ0QnVsbGV0Q29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZSwgVmljdG9yeUJhcik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFydEJ1bGxldENvbXBhcmF0aXZlV2FybmluZ01lYXN1cmUuanMubWFwIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTGluZSB9IGZyb20gJ3ZpY3RvcnktY29yZSc7XG5pbXBvcnQgeyBDaGFydENvbnRhaW5lciB9IGZyb20gJy4uL0NoYXJ0Q29udGFpbmVyJztcbmltcG9ydCB7IENoYXJ0TGFiZWwgfSBmcm9tICcuLi9DaGFydExhYmVsJztcbmltcG9ydCB7IENoYXJ0QnVsbGV0U3R5bGVzIH0gZnJvbSAnLi4vQ2hhcnRUaGVtZSc7XG5pbXBvcnQgeyBnZXRCdWxsZXRHcm91cFRpdGxlVGhlbWUsIGdldExhYmVsVGV4dFNpemUsIGdldEJ1bGxldExhYmVsWCwgZ2V0QnVsbGV0TGFiZWxZLCBnZXRQYWRkaW5nRm9yU2lkZSB9IGZyb20gJy4uL0NoYXJ0VXRpbHMnO1xuZXhwb3J0IGNvbnN0IENoYXJ0QnVsbGV0R3JvdXBUaXRsZSA9ICh7IGFyaWFEZXNjLCBhcmlhVGl0bGUsIGNhcEhlaWdodCA9IDEuMSwgZGl2aWRlckNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGluZSwgbnVsbCksIHBhZGRpbmcsIHN0YW5kYWxvbmUgPSB0cnVlLCBzdWJUaXRsZSwgdGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCB0aXRsZSwgdGl0bGVDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0TGFiZWwsIG51bGwpLCBcbi8vIGRlc3RydWN0dXJlIGxhc3RcbnRoZW1lID0gZ2V0QnVsbGV0R3JvdXBUaXRsZVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCksIGhlaWdodCA9IHRoZW1lLmNoYXJ0LmhlaWdodCwgd2lkdGggPSB0aGVtZS5jaGFydC53aWR0aCB9KSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdFBhZGRpbmcgPSB7XG4gICAgICAgIGJvdHRvbTogZ2V0UGFkZGluZ0ZvclNpZGUoJ2JvdHRvbScsIHBhZGRpbmcsIHRoZW1lLmNoYXJ0LnBhZGRpbmcpLFxuICAgICAgICBsZWZ0OiBnZXRQYWRkaW5nRm9yU2lkZSgnbGVmdCcsIHBhZGRpbmcsIHRoZW1lLmNoYXJ0LnBhZGRpbmcpLFxuICAgICAgICByaWdodDogZ2V0UGFkZGluZ0ZvclNpZGUoJ3JpZ2h0JywgcGFkZGluZywgdGhlbWUuY2hhcnQucGFkZGluZyksXG4gICAgICAgIHRvcDogZ2V0UGFkZGluZ0ZvclNpZGUoJ3RvcCcsIHBhZGRpbmcsIHRoZW1lLmNoYXJ0LnBhZGRpbmcpXG4gICAgfTtcbiAgICBjb25zdCBsYWJlbFBhZGRpbmcgPSB7XG4gICAgICAgIGJvdHRvbTogZ2V0UGFkZGluZ0ZvclNpZGUoJ2JvdHRvbScsIHBhZGRpbmcsIE51bWJlcih0aGVtZS5sZWdlbmQuc3R5bGUubGFiZWxzLnBhZGRpbmcpKSxcbiAgICAgICAgbGVmdDogZ2V0UGFkZGluZ0ZvclNpZGUoJ2xlZnQnLCBwYWRkaW5nLCBOdW1iZXIodGhlbWUubGVnZW5kLnN0eWxlLmxhYmVscy5wYWRkaW5nKSksXG4gICAgICAgIHJpZ2h0OiBnZXRQYWRkaW5nRm9yU2lkZSgncmlnaHQnLCBwYWRkaW5nLCBOdW1iZXIodGhlbWUubGVnZW5kLnN0eWxlLmxhYmVscy5wYWRkaW5nKSksXG4gICAgICAgIHRvcDogZ2V0UGFkZGluZ0ZvclNpZGUoJ3RvcCcsIHBhZGRpbmcsIE51bWJlcih0aGVtZS5sZWdlbmQuc3R5bGUubGFiZWxzLnBhZGRpbmcpKVxuICAgIH07XG4gICAgLy8gSG9yaXpvbnRhbCBkaXZpZGVyIHRvIHJlbmRlciB1bmRlciB0aGUgZ3JvdXAgdGl0bGVcbiAgICBjb25zdCBnZXREaXZpZGVyID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB0aXRsZVNpemUgPSBnZXRMYWJlbFRleHRTaXplKHsgdGV4dDogdGl0bGUsIHRoZW1lIH0pO1xuICAgICAgICBjb25zdCBzdWJUaXRsZVNpemUgPSBnZXRMYWJlbFRleHRTaXplKHsgdGV4dDogc3ViVGl0bGUsIHRoZW1lIH0pO1xuICAgICAgICBjb25zdCBkeSA9IHRpdGxlICYmIHN1YlRpdGxlXG4gICAgICAgICAgICA/IHRpdGxlU2l6ZS5oZWlnaHQgKyBzdWJUaXRsZVNpemUuaGVpZ2h0ICsgbGFiZWxQYWRkaW5nLnRvcCArIGxhYmVsUGFkZGluZy5ib3R0b21cbiAgICAgICAgICAgIDogdGl0bGVTaXplLmhlaWdodCArIGxhYmVsUGFkZGluZy50b3AgKyBsYWJlbFBhZGRpbmcuYm90dG9tO1xuICAgICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGRpdmlkZXJDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oeyB4MTogZGVmYXVsdFBhZGRpbmcubGVmdCwgeDI6IHdpZHRoIC0gZGVmYXVsdFBhZGRpbmcucmlnaHQsIHkxOiBkZWZhdWx0UGFkZGluZy50b3AgKyBkeSwgeTI6IGRlZmF1bHRQYWRkaW5nLnRvcCArIGR5LCBzdHlsZTogdGhlbWUubGluZS5zdHlsZS5kYXRhIH0sIGRpdmlkZXJDb21wb25lbnQucHJvcHMpKTtcbiAgICB9O1xuICAgIC8vIFJldHVybnMgdGl0bGVcbiAgICBjb25zdCBnZXRUaXRsZSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdGl0bGVQcm9wcyA9IHRpdGxlQ29tcG9uZW50ID8gdGl0bGVDb21wb25lbnQucHJvcHMgOiB7fTtcbiAgICAgICAgY29uc3Qgc2hvd0JvdGggPSB0aXRsZSAmJiBzdWJUaXRsZTtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudCh0aXRsZUNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIChzaG93Qm90aCAmJiB7IGNhcEhlaWdodCB9KSksIHsgc3R5bGU6IFtDaGFydEJ1bGxldFN0eWxlcy5sYWJlbC5ncm91cFRpdGxlLCBDaGFydEJ1bGxldFN0eWxlcy5sYWJlbC5zdWJUaXRsZV0sIHRleHQ6IHNob3dCb3RoID8gW3RpdGxlLCBzdWJUaXRsZV0gOiB0aXRsZSwgdGV4dEFuY2hvcjogJ21pZGRsZScsIHZlcnRpY2FsQW5jaG9yOiAnbWlkZGxlJywgeDogZ2V0QnVsbGV0TGFiZWxYKHtcbiAgICAgICAgICAgICAgICBjaGFydFdpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgICAgICBsYWJlbFBvc2l0aW9uOiAndG9wJ1xuICAgICAgICAgICAgfSksIHk6IGdldEJ1bGxldExhYmVsWSh7XG4gICAgICAgICAgICAgICAgY2hhcnRIZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICAgICAgICBkeTogZGVmYXVsdFBhZGRpbmcudG9wLFxuICAgICAgICAgICAgICAgIGxhYmVsUG9zaXRpb246ICd0b3AnXG4gICAgICAgICAgICB9KSB9KSwgdGl0bGVQcm9wcykpO1xuICAgIH07XG4gICAgY29uc3QgZ3JvdXBUaXRsZSA9IEJvb2xlYW4odGl0bGUpICYmIChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICBnZXRUaXRsZSgpLFxuICAgICAgICBnZXREaXZpZGVyKCkpKTtcbiAgICByZXR1cm4gc3RhbmRhbG9uZSA/IChSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0Q29udGFpbmVyLCB7IGRlc2M6IGFyaWFEZXNjLCBoZWlnaHQ6IGhlaWdodCwgdGl0bGU6IGFyaWFUaXRsZSwgd2lkdGg6IHdpZHRoIH0sIGdyb3VwVGl0bGUpKSA6IChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBncm91cFRpdGxlKSk7XG59O1xuQ2hhcnRCdWxsZXRHcm91cFRpdGxlLmRpc3BsYXlOYW1lID0gJ0NoYXJ0QnVsbGV0R3JvdXBUaXRsZSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFydEJ1bGxldEdyb3VwVGl0bGUuanMubWFwIiwiaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoL2lzTmlsXCI7XG5pbXBvcnQgX3ZhbHVlcyBmcm9tIFwibG9kYXNoL3ZhbHVlc1wiO1xuaW1wb3J0IF9hc3NpZ24gZnJvbSBcImxvZGFzaC9hc3NpZ25cIjtcblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IH1cblxuaW1wb3J0IHsgSGVscGVycywgTGFiZWxIZWxwZXJzLCBEYXRhLCBEb21haW4sIFNjYWxlIH0gZnJvbSBcInZpY3RvcnktY29yZVwiO1xuZXhwb3J0IHZhciBnZXRTeW1ib2wgPSBmdW5jdGlvbiAoZGF0YSwgcHJvcHMpIHtcbiAgaWYgKHByb3BzLmJ1YmJsZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIFwiY2lyY2xlXCI7XG4gIH1cblxuICByZXR1cm4gZGF0YS5zeW1ib2wgfHwgcHJvcHMuc3ltYm9sO1xufTtcbmV4cG9ydCB2YXIgZ2V0QnViYmxlU2l6ZSA9IGZ1bmN0aW9uIChkYXR1bSwgcHJvcHMpIHtcbiAgdmFyIGRhdGEgPSBwcm9wcy5kYXRhLFxuICAgICAgeiA9IHByb3BzLnosXG4gICAgICBtYXhCdWJibGVTaXplID0gcHJvcHMubWF4QnViYmxlU2l6ZSxcbiAgICAgIG1pbkJ1YmJsZVNpemUgPSBwcm9wcy5taW5CdWJibGVTaXplO1xuICB2YXIgekRhdGEgPSBkYXRhLm1hcChmdW5jdGlvbiAocG9pbnQpIHtcbiAgICByZXR1cm4gcG9pbnRbel07XG4gIH0pO1xuICB2YXIgek1pbiA9IE1hdGgubWluLmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheSh6RGF0YSkpO1xuICB2YXIgek1heCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheSh6RGF0YSkpO1xuXG4gIHZhciBnZXRNYXhSYWRpdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1pblBhZGRpbmcgPSBNYXRoLm1pbi5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkoX3ZhbHVlcyhIZWxwZXJzLmdldFBhZGRpbmcocHJvcHMpKSkpO1xuICAgIHJldHVybiBNYXRoLm1heChtaW5QYWRkaW5nLCA1KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gIH07XG5cbiAgdmFyIG1heFJhZGl1cyA9IG1heEJ1YmJsZVNpemUgfHwgZ2V0TWF4UmFkaXVzKCk7XG4gIHZhciBtaW5SYWRpdXMgPSBtaW5CdWJibGVTaXplIHx8IG1heFJhZGl1cyAqIDAuMTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG5cbiAgaWYgKHpNYXggPT09IHpNaW4pIHtcbiAgICByZXR1cm4gTWF0aC5tYXgobWluUmFkaXVzLCAxKTtcbiAgfVxuXG4gIHZhciBtYXhBcmVhID0gTWF0aC5QSSAqIE1hdGgucG93KG1heFJhZGl1cywgMik7XG4gIHZhciBtaW5BcmVhID0gTWF0aC5QSSAqIE1hdGgucG93KG1pblJhZGl1cywgMik7XG4gIHZhciBwb2ludEFyZWEgPSAoZGF0dW1bel0gLSB6TWluKSAvICh6TWF4IC0gek1pbikgKiBtYXhBcmVhO1xuICB2YXIgYXJlYSA9IE1hdGgubWF4KHBvaW50QXJlYSwgbWluQXJlYSk7XG4gIHZhciByYWRpdXMgPSBNYXRoLnNxcnQoYXJlYSAvIE1hdGguUEkpO1xuICByZXR1cm4gTWF0aC5tYXgocmFkaXVzLCAxKTtcbn07XG5leHBvcnQgdmFyIGdldFNpemUgPSBmdW5jdGlvbiAoZGF0dW0sIHByb3BzKSB7XG4gIHZhciBzaXplID0gcHJvcHMuc2l6ZSxcbiAgICAgIHogPSBwcm9wcy56O1xuXG4gIGlmIChkYXR1bS5zaXplKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXR1bS5zaXplID09PSBcImZ1bmN0aW9uXCIgPyBkYXR1bS5zaXplIDogTWF0aC5tYXgoZGF0dW0uc2l6ZSwgMSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHByb3BzLnNpemUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBzaXplO1xuICB9IGVsc2UgaWYgKGRhdHVtW3pdKSB7XG4gICAgcmV0dXJuIGdldEJ1YmJsZVNpemUoZGF0dW0sIHByb3BzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoc2l6ZSB8fCAwLCAxKTtcbiAgfVxufTtcblxudmFyIGdldENhbGN1bGF0ZWRWYWx1ZXMgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIGRlZmF1bHRTdHlsZXMgPSBIZWxwZXJzLmdldERlZmF1bHRTdHlsZXMocHJvcHMsIFwic2NhdHRlclwiKTtcbiAgdmFyIHN0eWxlID0gSGVscGVycy5nZXRTdHlsZXMocHJvcHMuc3R5bGUsIGRlZmF1bHRTdHlsZXMpO1xuICB2YXIgcmFuZ2UgPSB7XG4gICAgeDogSGVscGVycy5nZXRSYW5nZShwcm9wcywgXCJ4XCIpLFxuICAgIHk6IEhlbHBlcnMuZ2V0UmFuZ2UocHJvcHMsIFwieVwiKVxuICB9O1xuICB2YXIgZG9tYWluID0ge1xuICAgIHg6IERvbWFpbi5nZXREb21haW4ocHJvcHMsIFwieFwiKSxcbiAgICB5OiBEb21haW4uZ2V0RG9tYWluKHByb3BzLCBcInlcIilcbiAgfTtcbiAgdmFyIHNjYWxlID0ge1xuICAgIHg6IFNjYWxlLmdldEJhc2VTY2FsZShwcm9wcywgXCJ4XCIpLmRvbWFpbihkb21haW4ueCkucmFuZ2UocHJvcHMuaG9yaXpvbnRhbCA/IHJhbmdlLnkgOiByYW5nZS54KSxcbiAgICB5OiBTY2FsZS5nZXRCYXNlU2NhbGUocHJvcHMsIFwieVwiKS5kb21haW4oZG9tYWluLnkpLnJhbmdlKHByb3BzLmhvcml6b250YWwgPyByYW5nZS54IDogcmFuZ2UueSlcbiAgfTtcbiAgdmFyIG9yaWdpbiA9IHByb3BzLnBvbGFyID8gcHJvcHMub3JpZ2luIHx8IEhlbHBlcnMuZ2V0UG9sYXJPcmlnaW4ocHJvcHMpIDogdW5kZWZpbmVkO1xuICB2YXIgeiA9IHByb3BzLmJ1YmJsZVByb3BlcnR5IHx8IFwielwiO1xuICB2YXIgZGF0YSA9IERhdGEuZ2V0RGF0YShwcm9wcyk7XG4gIGRhdGEgPSBEYXRhLmZvcm1hdERhdGFGcm9tRG9tYWluKGRhdGEsIGRvbWFpbik7XG4gIHJldHVybiB7XG4gICAgZG9tYWluOiBkb21haW4sXG4gICAgZGF0YTogZGF0YSxcbiAgICBzY2FsZTogc2NhbGUsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIG9yaWdpbjogb3JpZ2luLFxuICAgIHo6IHpcbiAgfTtcbn07XG5cbmV4cG9ydCB2YXIgZ2V0QmFzZVByb3BzID0gZnVuY3Rpb24gKHByb3BzLCBmYWxsYmFja1Byb3BzKSB7XG4gIHZhciBtb2RpZmllZFByb3BzID0gSGVscGVycy5tb2RpZnlQcm9wcyhwcm9wcywgZmFsbGJhY2tQcm9wcywgXCJzY2F0dGVyXCIpO1xuICBwcm9wcyA9IF9hc3NpZ24oe30sIG1vZGlmaWVkUHJvcHMsIGdldENhbGN1bGF0ZWRWYWx1ZXMobW9kaWZpZWRQcm9wcykpO1xuICB2YXIgX3Byb3BzID0gcHJvcHMsXG4gICAgICBkYXRhID0gX3Byb3BzLmRhdGEsXG4gICAgICBkb21haW4gPSBfcHJvcHMuZG9tYWluLFxuICAgICAgZXZlbnRzID0gX3Byb3BzLmV2ZW50cyxcbiAgICAgIGhlaWdodCA9IF9wcm9wcy5oZWlnaHQsXG4gICAgICBvcmlnaW4gPSBfcHJvcHMub3JpZ2luLFxuICAgICAgcGFkZGluZyA9IF9wcm9wcy5wYWRkaW5nLFxuICAgICAgcG9sYXIgPSBfcHJvcHMucG9sYXIsXG4gICAgICBzY2FsZSA9IF9wcm9wcy5zY2FsZSxcbiAgICAgIG5hbWUgPSBfcHJvcHMubmFtZSxcbiAgICAgIHNoYXJlZEV2ZW50cyA9IF9wcm9wcy5zaGFyZWRFdmVudHMsXG4gICAgICBzdGFuZGFsb25lID0gX3Byb3BzLnN0YW5kYWxvbmUsXG4gICAgICBzdHlsZSA9IF9wcm9wcy5zdHlsZSxcbiAgICAgIHRoZW1lID0gX3Byb3BzLnRoZW1lLFxuICAgICAgd2lkdGggPSBfcHJvcHMud2lkdGgsXG4gICAgICBsYWJlbHMgPSBfcHJvcHMubGFiZWxzLFxuICAgICAgaG9yaXpvbnRhbCA9IF9wcm9wcy5ob3Jpem9udGFsLFxuICAgICAgZGlzYWJsZUlubGluZVN0eWxlcyA9IF9wcm9wcy5kaXNhYmxlSW5saW5lU3R5bGVzO1xuICB2YXIgaW5pdGlhbENoaWxkUHJvcHMgPSB7XG4gICAgcGFyZW50OiB7XG4gICAgICBzdHlsZTogc3R5bGUucGFyZW50LFxuICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgZG9tYWluOiBkb21haW4sXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBzdGFuZGFsb25lOiBzdGFuZGFsb25lLFxuICAgICAgdGhlbWU6IHRoZW1lLFxuICAgICAgb3JpZ2luOiBvcmlnaW4sXG4gICAgICBwb2xhcjogcG9sYXIsXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGhvcml6b250YWw6IGhvcml6b250YWxcbiAgICB9XG4gIH07XG4gIHJldHVybiBkYXRhLnJlZHVjZShmdW5jdGlvbiAoY2hpbGRQcm9wcywgZGF0dW0sIGluZGV4KSB7XG4gICAgdmFyIGV2ZW50S2V5ID0gIV9pc05pbChkYXR1bS5ldmVudEtleSkgPyBkYXR1bS5ldmVudEtleSA6IGluZGV4O1xuXG4gICAgdmFyIF9IZWxwZXJzJHNjYWxlUG9pbnQgPSBIZWxwZXJzLnNjYWxlUG9pbnQocHJvcHMsIGRhdHVtKSxcbiAgICAgICAgeCA9IF9IZWxwZXJzJHNjYWxlUG9pbnQueCxcbiAgICAgICAgeSA9IF9IZWxwZXJzJHNjYWxlUG9pbnQueTtcblxuICAgIHZhciBkYXRhUHJvcHMgPSB7XG4gICAgICB4OiB4LFxuICAgICAgeTogeSxcbiAgICAgIGRhdHVtOiBkYXR1bSxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBzY2FsZTogc2NhbGUsXG4gICAgICBwb2xhcjogcG9sYXIsXG4gICAgICBvcmlnaW46IG9yaWdpbixcbiAgICAgIGhvcml6b250YWw6IGhvcml6b250YWwsXG4gICAgICBzaXplOiBnZXRTaXplKGRhdHVtLCBwcm9wcyksXG4gICAgICBzeW1ib2w6IGdldFN5bWJvbChkYXR1bSwgcHJvcHMpLFxuICAgICAgc3R5bGU6IGRpc2FibGVJbmxpbmVTdHlsZXMgPyB7fSA6IHN0eWxlLmRhdGEsXG4gICAgICBkaXNhYmxlSW5saW5lU3R5bGVzOiBkaXNhYmxlSW5saW5lU3R5bGVzXG4gICAgfTtcbiAgICBjaGlsZFByb3BzW2V2ZW50S2V5XSA9IHtcbiAgICAgIGRhdGE6IGRhdGFQcm9wc1xuICAgIH07XG4gICAgdmFyIHRleHQgPSBMYWJlbEhlbHBlcnMuZ2V0VGV4dChwcm9wcywgZGF0dW0sIGluZGV4KTtcblxuICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQgJiYgdGV4dCAhPT0gbnVsbCB8fCBsYWJlbHMgJiYgKGV2ZW50cyB8fCBzaGFyZWRFdmVudHMpKSB7XG4gICAgICBjaGlsZFByb3BzW2V2ZW50S2V5XS5sYWJlbHMgPSBMYWJlbEhlbHBlcnMuZ2V0UHJvcHMocHJvcHMsIGluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hpbGRQcm9wcztcbiAgfSwgaW5pdGlhbENoaWxkUHJvcHMpO1xufTsiLCJmdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHsgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTsgfSkpOyB9IG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgUHJvcFR5cGVzIGFzIEN1c3RvbVByb3BUeXBlcywgSGVscGVycywgVmljdG9yeUxhYmVsLCBhZGRFdmVudHMsIENvbW1vblByb3BzLCBWaWN0b3J5Q29udGFpbmVyLCBWaWN0b3J5VGhlbWUsIERlZmF1bHRUcmFuc2l0aW9ucywgRGF0YSwgRG9tYWluLCBQb2ludCB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbmltcG9ydCB7IGdldEJhc2VQcm9wcyB9IGZyb20gXCIuL2hlbHBlci1tZXRob2RzXCI7XG52YXIgZmFsbGJhY2tQcm9wcyA9IHtcbiAgd2lkdGg6IDQ1MCxcbiAgaGVpZ2h0OiAzMDAsXG4gIHBhZGRpbmc6IDUwLFxuICBzaXplOiAzLFxuICBzeW1ib2w6IFwiY2lyY2xlXCJcbn07XG5cbnZhciBWaWN0b3J5U2NhdHRlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoVmljdG9yeVNjYXR0ZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFZpY3RvcnlTY2F0dGVyKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBWaWN0b3J5U2NhdHRlcik7XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKFZpY3RvcnlTY2F0dGVyLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoVmljdG9yeVNjYXR0ZXIpKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhWaWN0b3J5U2NhdHRlciwgW3tcbiAgICBrZXk6IFwic2hvdWxkQW5pbWF0ZVwiLFxuICAgIC8vIE92ZXJyaWRkZW4gaW4gbmF0aXZlIHZlcnNpb25zXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZEFuaW1hdGUoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnByb3BzLmFuaW1hdGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgYW5pbWF0aW9uV2hpdGVsaXN0ID0gVmljdG9yeVNjYXR0ZXIuYW5pbWF0aW9uV2hpdGVsaXN0LFxuICAgICAgICAgIHJvbGUgPSBWaWN0b3J5U2NhdHRlci5yb2xlO1xuICAgICAgdmFyIHByb3BzID0gSGVscGVycy5tb2RpZnlQcm9wcyh0aGlzLnByb3BzLCBmYWxsYmFja1Byb3BzLCByb2xlKTtcblxuICAgICAgaWYgKHRoaXMuc2hvdWxkQW5pbWF0ZSgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuaW1hdGVDb21wb25lbnQocHJvcHMsIGFuaW1hdGlvbldoaXRlbGlzdCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucmVuZGVyRGF0YShwcm9wcyk7XG4gICAgICByZXR1cm4gcHJvcHMuc3RhbmRhbG9uZSA/IHRoaXMucmVuZGVyQ29udGFpbmVyKHByb3BzLmNvbnRhaW5lckNvbXBvbmVudCwgY2hpbGRyZW4pIDogY2hpbGRyZW47XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFZpY3RvcnlTY2F0dGVyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVNjYXR0ZXIsIFwiYW5pbWF0aW9uV2hpdGVsaXN0XCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFtcImRhdGFcIiwgXCJkb21haW5cIiwgXCJoZWlnaHRcIiwgXCJtYXhCdWJibGVTaXplXCIsIFwicGFkZGluZ1wiLCBcInNhbXBsZXNcIiwgXCJzaXplXCIsIFwic3R5bGVcIiwgXCJ3aWR0aFwiXVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVNjYXR0ZXIsIFwiZGlzcGxheU5hbWVcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogXCJWaWN0b3J5U2NhdHRlclwiXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5U2NhdHRlciwgXCJyb2xlXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFwic2NhdHRlclwiXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5U2NhdHRlciwgXCJkZWZhdWx0VHJhbnNpdGlvbnNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogRGVmYXVsdFRyYW5zaXRpb25zLmRpc2NyZXRlVHJhbnNpdGlvbnMoKVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVNjYXR0ZXIsIFwicHJvcFR5cGVzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IF9vYmplY3RTcHJlYWQoe30sIENvbW1vblByb3BzLmJhc2VQcm9wcywgQ29tbW9uUHJvcHMuZGF0YVByb3BzLCB7XG4gICAgYnViYmxlUHJvcGVydHk6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgbWF4QnViYmxlU2l6ZTogQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlLFxuICAgIG1pbkJ1YmJsZVNpemU6IEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZSxcbiAgICBzaXplOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmUsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgc3ltYm9sOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub25lT2YoW1wiY2lyY2xlXCIsIFwiY3Jvc3NcIiwgXCJkaWFtb25kXCIsIFwicGx1c1wiLCBcIm1pbnVzXCIsIFwic3F1YXJlXCIsIFwic3RhclwiLCBcInRyaWFuZ2xlRG93blwiLCBcInRyaWFuZ2xlVXBcIl0pLCBQcm9wVHlwZXMuZnVuY10pXG4gIH0pXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5U2NhdHRlciwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZToge1xuICAgIGNvbnRhaW5lckNvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5Q29udGFpbmVyLCBudWxsKSxcbiAgICBkYXRhQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KFBvaW50LCBudWxsKSxcbiAgICBsYWJlbENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5TGFiZWwsIG51bGwpLFxuICAgIGdyb3VwQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCBudWxsKSxcbiAgICBzYW1wbGVzOiA1MCxcbiAgICBzb3J0T3JkZXI6IFwiYXNjZW5kaW5nXCIsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB0aGVtZTogVmljdG9yeVRoZW1lLmdyYXlzY2FsZVxuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5U2NhdHRlciwgXCJnZXREb21haW5cIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogRG9tYWluLmdldERvbWFpblxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVNjYXR0ZXIsIFwiZ2V0RGF0YVwiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBEYXRhLmdldERhdGFcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlTY2F0dGVyLCBcImdldEJhc2VQcm9wc1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICByZXR1cm4gZ2V0QmFzZVByb3BzKHByb3BzLCBmYWxsYmFja1Byb3BzKTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVNjYXR0ZXIsIFwiZXhwZWN0ZWRDb21wb25lbnRzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFtcImRhdGFDb21wb25lbnRcIiwgXCJsYWJlbENvbXBvbmVudFwiLCBcImdyb3VwQ29tcG9uZW50XCIsIFwiY29udGFpbmVyQ29tcG9uZW50XCJdXG59KTtcbmV4cG9ydCBkZWZhdWx0IGFkZEV2ZW50cyhWaWN0b3J5U2NhdHRlcik7IiwiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IHsgVmljdG9yeVNjYXR0ZXIgfSBmcm9tICd2aWN0b3J5LXNjYXR0ZXInO1xuaW1wb3J0IHsgQ2hhcnRDb250YWluZXIgfSBmcm9tICcuLi9DaGFydENvbnRhaW5lcic7XG5pbXBvcnQgeyBDaGFydFNjYXR0ZXJTdHlsZXMgfSBmcm9tICcuLi9DaGFydFRoZW1lJztcbmltcG9ydCB7IGdldFRoZW1lIH0gZnJvbSAnLi4vQ2hhcnRVdGlscyc7XG5leHBvcnQgdmFyIENoYXJ0U2NhdHRlclNvcnRPcmRlcjtcbihmdW5jdGlvbiAoQ2hhcnRTY2F0dGVyU29ydE9yZGVyKSB7XG4gICAgQ2hhcnRTY2F0dGVyU29ydE9yZGVyW1wiYXNjZW5kaW5nXCJdID0gXCJhc2NlbmRpbmdcIjtcbiAgICBDaGFydFNjYXR0ZXJTb3J0T3JkZXJbXCJkZXNjZW5kaW5nXCJdID0gXCJkZXNjZW5kaW5nXCI7XG59KShDaGFydFNjYXR0ZXJTb3J0T3JkZXIgfHwgKENoYXJ0U2NhdHRlclNvcnRPcmRlciA9IHt9KSk7XG5leHBvcnQgY29uc3QgQ2hhcnRTY2F0dGVyID0gKF9hKSA9PiB7XG4gICAgdmFyIHsgY29udGFpbmVyQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydENvbnRhaW5lciwgbnVsbCksIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgXG4gICAgLy8gZGVzdHJ1Y3R1cmUgbGFzdFxuICAgIHRoZW1lID0gZ2V0VGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSwgc2l6ZSA9ICh7IGFjdGl2ZSB9KSA9PiAoYWN0aXZlID8gQ2hhcnRTY2F0dGVyU3R5bGVzLmFjdGl2ZVNpemUgOiBDaGFydFNjYXR0ZXJTdHlsZXMuc2l6ZSkgfSA9IF9hLCByZXN0ID0gX19yZXN0KF9hLCBbXCJjb250YWluZXJDb21wb25lbnRcIiwgXCJ0aGVtZUNvbG9yXCIsIFwidGhlbWVWYXJpYW50XCIsIFwidGhlbWVcIiwgXCJzaXplXCJdKTtcbiAgICAvLyBDbG9uZSBzbyB1c2VycyBjYW4gb3ZlcnJpZGUgY29udGFpbmVyIHByb3BzXG4gICAgY29uc3QgY29udGFpbmVyID0gUmVhY3QuY2xvbmVFbGVtZW50KGNvbnRhaW5lckNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7IHRoZW1lIH0sIGNvbnRhaW5lckNvbXBvbmVudC5wcm9wcykpO1xuICAgIC8vIE5vdGU6IGNvbnRhaW5lckNvbXBvbmVudCBpcyByZXF1aXJlZCBmb3IgdGhlbWVcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5U2NhdHRlciwgT2JqZWN0LmFzc2lnbih7IGNvbnRhaW5lckNvbXBvbmVudDogY29udGFpbmVyLCBzaXplOiBzaXplLCB0aGVtZTogdGhlbWUgfSwgcmVzdCkpO1xufTtcbkNoYXJ0U2NhdHRlci5kaXNwbGF5TmFtZSA9ICdDaGFydFNjYXR0ZXInO1xuLy8gTm90ZTogVmljdG9yeUxpbmUucm9sZSBtdXN0IGJlIGhvaXN0ZWRcbmhvaXN0Tm9uUmVhY3RTdGF0aWNzKENoYXJ0U2NhdHRlciwgVmljdG9yeVNjYXR0ZXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2hhcnRTY2F0dGVyLmpzLm1hcCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBob2lzdE5vblJlYWN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgeyBWaWN0b3J5U2NhdHRlciB9IGZyb20gJ3ZpY3Rvcnktc2NhdHRlcic7XG5pbXBvcnQgeyBnZXRQcmltYXJ5RG90TWVhc3VyZURhdGEgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IENoYXJ0Q29udGFpbmVyIH0gZnJvbSAnLi4vQ2hhcnRDb250YWluZXInO1xuaW1wb3J0IHsgQ2hhcnRTY2F0dGVyIH0gZnJvbSAnLi4vQ2hhcnRTY2F0dGVyJztcbmltcG9ydCB7IENoYXJ0QnVsbGV0U3R5bGVzIH0gZnJvbSAnLi4vQ2hhcnRUaGVtZSc7XG5pbXBvcnQgeyBDaGFydFRvb2x0aXAgfSBmcm9tICcuLi9DaGFydFRvb2x0aXAnO1xuaW1wb3J0IHsgZ2V0QnVsbGV0UHJpbWFyeURvdE1lYXN1cmVUaGVtZSB9IGZyb20gJy4uL0NoYXJ0VXRpbHMnO1xuZXhwb3J0IGNvbnN0IENoYXJ0QnVsbGV0UHJpbWFyeURvdE1lYXN1cmUgPSAoeyBhbGxvd1Rvb2x0aXAgPSB0cnVlLCBhcmlhRGVzYywgYXJpYVRpdGxlLCBjb25zdHJhaW5Ub1Zpc2libGVBcmVhID0gZmFsc2UsIGRhdGEsIGRvbWFpbiwgaG9yaXpvbnRhbCA9IHRydWUsIGludmVydCA9IGZhbHNlLCBsYWJlbHMsIG1lYXN1cmVDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0U2NhdHRlciwgbnVsbCksIHBhZGRpbmcsIHNpemUgPSBDaGFydEJ1bGxldFN0eWxlcy5wcmltYXJ5RG90TWVhc3VyZVNpemUsIHN0YW5kYWxvbmUgPSB0cnVlLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIHksIHkwLCBcbi8vIGRlc3RydWN0dXJlIGxhc3RcbnRoZW1lID0gZ2V0QnVsbGV0UHJpbWFyeURvdE1lYXN1cmVUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpLCBsYWJlbENvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRUb29sdGlwLCBudWxsKSwgaGVpZ2h0ID0gdGhlbWUuZ3JvdXAuaGVpZ2h0LCB3aWR0aCA9IHRoZW1lLmdyb3VwLndpZHRoIH0pID0+IHtcbiAgICBjb25zdCBjb21wdXRlZERhdGEgPSBnZXRQcmltYXJ5RG90TWVhc3VyZURhdGEoe1xuICAgICAgICBkYXRhLFxuICAgICAgICBpbnZlcnQsXG4gICAgICAgIHRoZW1lLFxuICAgICAgICB5LFxuICAgICAgICB5MFxuICAgIH0pO1xuICAgIC8vIExhYmVsIGNvbXBvbmVudFxuICAgIC8vXG4gICAgLy8gTm90ZTogU1ZHIGhlaWdodCBhbmQgd2lkdGggYXJlIHByb3ZpZGVkIGJ5IENoYXJ0QnVsbGV0IGFzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGNvbnN0cmFpblRvVmlzaWJsZUFyZWFcbiAgICBjb25zdCB0b29sdGlwID0gUmVhY3QuY2xvbmVFbGVtZW50KGxhYmVsQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgY29uc3RyYWluVG9WaXNpYmxlQXJlYSwgZHg6IDAsIGR5OiBob3Jpem9udGFsID8gLXNpemUgOiAwLCBvcmllbnRhdGlvbjogJ3RvcCcgfSwgbGFiZWxDb21wb25lbnQucHJvcHMpKTtcbiAgICBjb25zdCBtZWFzdXJlID0gY29tcHV0ZWREYXRhLm1hcCgoZGF0YVBvaW50LCBpbmRleCkgPT4gUmVhY3QuY2xvbmVFbGVtZW50KG1lYXN1cmVDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oeyBkYXRhOiBbT2JqZWN0LmFzc2lnbih7fSwgZGF0YVBvaW50KV0sIGRvbWFpbixcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBob3Jpem9udGFsLCBrZXk6IGBwZi1jaGFydC1idWxsZXQtcHJpbWFyeS1kb3QtbWVhc3VyZS0ke2luZGV4fWAsIGxhYmVsQ29tcG9uZW50OiBhbGxvd1Rvb2x0aXAgPyB0b29sdGlwIDogdW5kZWZpbmVkLCBsYWJlbHMsXG4gICAgICAgIHBhZGRpbmcsXG4gICAgICAgIHNpemUsIHN0YW5kYWxvbmU6IGZhbHNlLCBzdHlsZToge1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGZpbGw6IGRhdGFQb2ludC5fY29sb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhlbWUsXG4gICAgICAgIHdpZHRoIH0sIG1lYXN1cmVDb21wb25lbnQucHJvcHMpKSk7XG4gICAgcmV0dXJuIHN0YW5kYWxvbmUgPyAoUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydENvbnRhaW5lciwgeyBkZXNjOiBhcmlhRGVzYywgaGVpZ2h0OiBoZWlnaHQsIHRpdGxlOiBhcmlhVGl0bGUsIHdpZHRoOiB3aWR0aCB9LCBtZWFzdXJlKSkgOiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgbWVhc3VyZSkpO1xufTtcbkNoYXJ0QnVsbGV0UHJpbWFyeURvdE1lYXN1cmUuZGlzcGxheU5hbWUgPSAnQ2hhcnRCdWxsZXRQcmltYXJ5RG90TWVhc3VyZSc7XG4vLyBOb3RlOiBWaWN0b3J5QmFyLnJvbGUgbXVzdCBiZSBob2lzdGVkXG5ob2lzdE5vblJlYWN0U3RhdGljcyhDaGFydEJ1bGxldFByaW1hcnlEb3RNZWFzdXJlLCBWaWN0b3J5U2NhdHRlcik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFydEJ1bGxldFByaW1hcnlEb3RNZWFzdXJlLmpzLm1hcCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBob2lzdE5vblJlYWN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgeyBWaWN0b3J5QmFyIH0gZnJvbSAndmljdG9yeS1iYXInO1xuaW1wb3J0IHsgZ2V0UHJpbWFyeVNlZ21lbnRlZE1lYXN1cmVEYXRhIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBDaGFydEJhciB9IGZyb20gJy4uL0NoYXJ0QmFyJztcbmltcG9ydCB7IENoYXJ0Q29udGFpbmVyIH0gZnJvbSAnLi4vQ2hhcnRDb250YWluZXInO1xuaW1wb3J0IHsgQ2hhcnRCdWxsZXRTdHlsZXMgfSBmcm9tICcuLi9DaGFydFRoZW1lJztcbmltcG9ydCB7IENoYXJ0VG9vbHRpcCB9IGZyb20gJy4uL0NoYXJ0VG9vbHRpcCc7XG5pbXBvcnQgeyBnZXRCdWxsZXRQcmltYXJ5TmVnYXRpdmVNZWFzdXJlVGhlbWUsIGdldEJ1bGxldFByaW1hcnlTZWdtZW50ZWRNZWFzdXJlVGhlbWUgfSBmcm9tICcuLi9DaGFydFV0aWxzJztcbmV4cG9ydCBjb25zdCBDaGFydEJ1bGxldFByaW1hcnlTZWdtZW50ZWRNZWFzdXJlID0gKHsgYWxsb3dUb29sdGlwID0gdHJ1ZSwgYXJpYURlc2MsIGFyaWFUaXRsZSwgYmFyV2lkdGggPSBDaGFydEJ1bGxldFN0eWxlcy5wcmltYXJ5U2VnbWVudGVkTWVhc3VyZVdpZHRoLCBjb25zdHJhaW5Ub1Zpc2libGVBcmVhID0gZmFsc2UsIGRhdGEsIGRvbWFpbiwgaG9yaXpvbnRhbCA9IHRydWUsIGludmVydCA9IGZhbHNlLCBsYWJlbHMsIG1lYXN1cmVDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0QmFyLCBudWxsKSwgcGFkZGluZywgc3RhbmRhbG9uZSA9IHRydWUsIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgeSwgeTAsIFxuLy8gZGVzdHJ1Y3R1cmUgbGFzdFxudGhlbWUgPSBnZXRCdWxsZXRQcmltYXJ5U2VnbWVudGVkTWVhc3VyZVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCksIG5lZ2F0aXZlTWVhc3VyZVRoZW1lID0gZ2V0QnVsbGV0UHJpbWFyeU5lZ2F0aXZlTWVhc3VyZVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCksIGhlaWdodCA9IHRoZW1lLmdyb3VwLmhlaWdodCwgd2lkdGggPSB0aGVtZS5ncm91cC53aWR0aCwgbGFiZWxDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0VG9vbHRpcCwgbnVsbCkgfSkgPT4ge1xuICAgIGNvbnN0IGNvbXB1dGVkRGF0YSA9IGdldFByaW1hcnlTZWdtZW50ZWRNZWFzdXJlRGF0YSh7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIGludmVydCxcbiAgICAgICAgbmVnYXRpdmVNZWFzdXJlVGhlbWUsXG4gICAgICAgIHRoZW1lLFxuICAgICAgICB5LFxuICAgICAgICB5MFxuICAgIH0pO1xuICAgIC8vIExhYmVsIGNvbXBvbmVudFxuICAgIC8vXG4gICAgLy8gTm90ZTogU1ZHIGhlaWdodCBhbmQgd2lkdGggYXJlIHByb3ZpZGVkIGJ5IENoYXJ0QnVsbGV0IGFzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IGNvbnN0cmFpblRvVmlzaWJsZUFyZWFcbiAgICBjb25zdCB0b29sdGlwID0gUmVhY3QuY2xvbmVFbGVtZW50KGxhYmVsQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgY29uc3RyYWluVG9WaXNpYmxlQXJlYSwgZHg6ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChob3Jpem9udGFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0eXBlb2YgYmFyV2lkdGggPT09ICdmdW5jdGlvbicgPyBiYXJXaWR0aChkYXRhKSA6IGJhcldpZHRoO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAvIDI7XG4gICAgICAgIH0sIGR5OiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWhvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHR5cGVvZiBiYXJXaWR0aCA9PT0gJ2Z1bmN0aW9uJyA/IGJhcldpZHRoKGRhdGEpIDogYmFyV2lkdGg7XG4gICAgICAgICAgICByZXR1cm4gLShyZXN1bHQgLyAyKTtcbiAgICAgICAgfSwgb3JpZW50YXRpb246ICd0b3AnIH0sIGxhYmVsQ29tcG9uZW50LnByb3BzKSk7XG4gICAgY29uc3QgbWVhc3VyZSA9IGNvbXB1dGVkRGF0YS5tYXAoKGRhdGFQb2ludCwgaW5kZXgpID0+IFJlYWN0LmNsb25lRWxlbWVudChtZWFzdXJlQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgYmFyV2lkdGgsIGRhdGE6IFtPYmplY3QuYXNzaWduKHt9LCBkYXRhUG9pbnQpXSwgZG9tYWluLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIGhvcml6b250YWwsIGtleTogYHBmLWNoYXJ0LWJ1bGxldC1wcmltYXJ5LXNlZ21lbnRlZC1tZWFzdXJlLSR7aW5kZXh9YCwgbGFiZWxDb21wb25lbnQ6IGFsbG93VG9vbHRpcCA/IHRvb2x0aXAgOiB1bmRlZmluZWQsIGxhYmVscyxcbiAgICAgICAgcGFkZGluZywgc3RhbmRhbG9uZTogZmFsc2UsIHN0eWxlOiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZmlsbDogZGF0YVBvaW50Ll9jb2xvclxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGVtZSxcbiAgICAgICAgd2lkdGggfSwgbWVhc3VyZUNvbXBvbmVudC5wcm9wcykpKTtcbiAgICByZXR1cm4gc3RhbmRhbG9uZSA/IChSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0Q29udGFpbmVyLCB7IGRlc2M6IGFyaWFEZXNjLCBoZWlnaHQ6IGhlaWdodCwgdGl0bGU6IGFyaWFUaXRsZSwgd2lkdGg6IHdpZHRoIH0sIG1lYXN1cmUpKSA6IChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBtZWFzdXJlKSk7XG59O1xuQ2hhcnRCdWxsZXRQcmltYXJ5U2VnbWVudGVkTWVhc3VyZS5kaXNwbGF5TmFtZSA9ICdDaGFydEJ1bGxldFByaW1hcnlTZWdtZW50ZWRNZWFzdXJlJztcbi8vIE5vdGU6IFZpY3RvcnlCYXIucm9sZSBtdXN0IGJlIGhvaXN0ZWRcbmhvaXN0Tm9uUmVhY3RTdGF0aWNzKENoYXJ0QnVsbGV0UHJpbWFyeVNlZ21lbnRlZE1lYXN1cmUsIFZpY3RvcnlCYXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2hhcnRCdWxsZXRQcmltYXJ5U2VnbWVudGVkTWVhc3VyZS5qcy5tYXAiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IHsgVmljdG9yeUJhciB9IGZyb20gJ3ZpY3RvcnktYmFyJztcbmltcG9ydCB7IGdldFF1YWxpdGF0aXZlUmFuZ2VEYXRhIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBDaGFydEJhciB9IGZyb20gJy4uL0NoYXJ0QmFyJztcbmltcG9ydCB7IENoYXJ0Q29udGFpbmVyIH0gZnJvbSAnLi4vQ2hhcnRDb250YWluZXInO1xuaW1wb3J0IHsgQ2hhcnRCdWxsZXRTdHlsZXMgfSBmcm9tICcuLi9DaGFydFRoZW1lJztcbmltcG9ydCB7IENoYXJ0VG9vbHRpcCB9IGZyb20gJy4uL0NoYXJ0VG9vbHRpcCc7XG5pbXBvcnQgeyBnZXRCdWxsZXRRdWFsaXRhdGl2ZVJhbmdlVGhlbWUgfSBmcm9tICcuLi9DaGFydFV0aWxzJztcbmV4cG9ydCBjb25zdCBDaGFydEJ1bGxldFF1YWxpdGF0aXZlUmFuZ2UgPSAoeyBhbGxvd1Rvb2x0aXAgPSB0cnVlLCBhcmlhRGVzYywgYXJpYVRpdGxlLCBiYXJXaWR0aCA9IENoYXJ0QnVsbGV0U3R5bGVzLnF1YWxpdGF0aXZlUmFuZ2VXaWR0aCwgY29uc3RyYWluVG9WaXNpYmxlQXJlYSA9IGZhbHNlLCBkYXRhLCBkb21haW4sIGhvcml6b250YWwgPSB0cnVlLCBpbnZlcnQgPSBmYWxzZSwgbGFiZWxzLCBtZWFzdXJlQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydEJhciwgbnVsbCksIHBhZGRpbmcsIHN0YW5kYWxvbmUgPSB0cnVlLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIHksIHkwLCBcbi8vIGRlc3RydWN0dXJlIGxhc3RcbnRoZW1lID0gZ2V0QnVsbGV0UXVhbGl0YXRpdmVSYW5nZVRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCksIGhlaWdodCA9IHRoZW1lLmdyb3VwLmhlaWdodCwgd2lkdGggPSB0aGVtZS5ncm91cC53aWR0aCwgbGFiZWxDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0VG9vbHRpcCwgbnVsbCkgfSkgPT4ge1xuICAgIGNvbnN0IGNvbXB1dGVkRGF0YSA9IGdldFF1YWxpdGF0aXZlUmFuZ2VEYXRhKHtcbiAgICAgICAgZGF0YSxcbiAgICAgICAgaW52ZXJ0LFxuICAgICAgICB0aGVtZSxcbiAgICAgICAgeSxcbiAgICAgICAgeTBcbiAgICB9KTtcbiAgICAvLyBMYWJlbCBjb21wb25lbnRcbiAgICAvL1xuICAgIC8vIFRoZSB4IGFuZCB5IGNhbGN1bGF0aW9ucyBiZWxvdyBlbnN1cmUgdGhhdCB0aGUgdG9vbHRpcCBhcHBlYXJzIGFib3ZlIHRoZSBiYXIsIGluc3RlYWQgb2YgdmVydGljYWxseSBjZW50ZXJlZC5cbiAgICAvLyBIYXZpbmcgdGhlIHRvb2x0aXAgdmVydGljYWxseSBjZW50ZXJlZCBpcyB2aXN1YWxseSBjb25mdXNpbmcgd2l0aCBjb21wYXJhdGl2ZSBtZWFzdXJlcy5cbiAgICAvL1xuICAgIC8vIE5vdGU6IFNWRyBoZWlnaHQgYW5kIHdpZHRoIGFyZSBwcm92aWRlZCBieSBDaGFydEJ1bGxldCBhcyBhIHdvcmthcm91bmQgdG8gc3VwcG9ydCBjb25zdHJhaW5Ub1Zpc2libGVBcmVhXG4gICAgY29uc3QgdG9vbHRpcCA9IFJlYWN0LmNsb25lRWxlbWVudChsYWJlbENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7IGNvbnN0cmFpblRvVmlzaWJsZUFyZWEsIGR4OiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdHlwZW9mIGJhcldpZHRoID09PSAnZnVuY3Rpb24nID8gYmFyV2lkdGgoZGF0YSkgOiBiYXJXaWR0aDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgLyAyO1xuICAgICAgICB9LCBkeTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFob3Jpem9udGFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0eXBlb2YgYmFyV2lkdGggPT09ICdmdW5jdGlvbicgPyBiYXJXaWR0aChkYXRhKSA6IGJhcldpZHRoO1xuICAgICAgICAgICAgcmV0dXJuIC0ocmVzdWx0IC8gMik7XG4gICAgICAgIH0sIG9yaWVudGF0aW9uOiAndG9wJyB9LCBsYWJlbENvbXBvbmVudC5wcm9wcykpO1xuICAgIGNvbnN0IG1lYXN1cmUgPSBjb21wdXRlZERhdGEubWFwKChkYXRhUG9pbnQsIGluZGV4KSA9PiBSZWFjdC5jbG9uZUVsZW1lbnQobWVhc3VyZUNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7IGJhcldpZHRoLCBkYXRhOiBbT2JqZWN0LmFzc2lnbih7fSwgZGF0YVBvaW50KV0sIGRvbWFpbixcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBob3Jpem9udGFsLCBrZXk6IGBwZi1jaGFydC1idWxsZXQtcXVhbGl0YXRpdmUtcmFuZ2UtJHtpbmRleH1gLCBsYWJlbENvbXBvbmVudDogYWxsb3dUb29sdGlwID8gdG9vbHRpcCA6IHVuZGVmaW5lZCwgbGFiZWxzLFxuICAgICAgICBwYWRkaW5nLCBzdGFuZGFsb25lOiBmYWxzZSwgc3R5bGU6IHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBmaWxsOiBkYXRhUG9pbnQuX2NvbG9yXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoZW1lLFxuICAgICAgICB3aWR0aCB9LCBtZWFzdXJlQ29tcG9uZW50LnByb3BzKSkpO1xuICAgIHJldHVybiBzdGFuZGFsb25lID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRDb250YWluZXIsIHsgZGVzYzogYXJpYURlc2MsIGhlaWdodDogaGVpZ2h0LCB0aXRsZTogYXJpYVRpdGxlLCB3aWR0aDogd2lkdGggfSwgbWVhc3VyZSkpIDogKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIG1lYXN1cmUpKTtcbn07XG5DaGFydEJ1bGxldFF1YWxpdGF0aXZlUmFuZ2UuZGlzcGxheU5hbWUgPSAnQ2hhcnRCdWxsZXRRdWFsaXRhdGl2ZVJhbmdlJztcbi8vIE5vdGU6IFZpY3RvcnlCYXIucm9sZSBtdXN0IGJlIGhvaXN0ZWRcbmhvaXN0Tm9uUmVhY3RTdGF0aWNzKENoYXJ0QnVsbGV0UXVhbGl0YXRpdmVSYW5nZSwgVmljdG9yeUJhcik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFydEJ1bGxldFF1YWxpdGF0aXZlUmFuZ2UuanMubWFwIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ2hhcnRDb250YWluZXIgfSBmcm9tICcuLi9DaGFydENvbnRhaW5lcic7XG5pbXBvcnQgeyBDaGFydExhYmVsIH0gZnJvbSAnLi4vQ2hhcnRMYWJlbCc7XG5pbXBvcnQgeyBDaGFydEJ1bGxldFN0eWxlcywgQ2hhcnRDb21tb25TdHlsZXMgfSBmcm9tICcuLi9DaGFydFRoZW1lJztcbmltcG9ydCB7IGdldEJ1bGxldFRoZW1lLCBnZXRCdWxsZXRMYWJlbFgsIGdldEJ1bGxldExhYmVsWSwgZ2V0UGFkZGluZ0ZvclNpZGUgfSBmcm9tICcuLi9DaGFydFV0aWxzJztcbmV4cG9ydCBjb25zdCBDaGFydEJ1bGxldFRpdGxlID0gKHsgYXJpYURlc2MsIGFyaWFUaXRsZSwgY2FwSGVpZ2h0ID0gMS4xLCBob3Jpem9udGFsID0gdHJ1ZSwgbGVnZW5kUG9zaXRpb24gPSAnYm90dG9tJywgcGFkZGluZywgc3RhbmRhbG9uZSA9IHRydWUsIHN1YlRpdGxlLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIHRpdGxlLCB0aXRsZUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRMYWJlbCwgbnVsbCksIHRpdGxlUG9zaXRpb24sIFxuLy8gZGVzdHJ1Y3R1cmUgbGFzdFxudGhlbWUgPSBnZXRCdWxsZXRUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpLCBoZWlnaHQgPSBob3Jpem9udGFsID8gdGhlbWUuY2hhcnQuaGVpZ2h0IDogdGhlbWUuY2hhcnQud2lkdGgsIHdpZHRoID0gaG9yaXpvbnRhbCA/IHRoZW1lLmNoYXJ0LndpZHRoIDogdGhlbWUuY2hhcnQuaGVpZ2h0IH0pID0+IHtcbiAgICBjb25zdCBjaGFydFNpemUgPSB7XG4gICAgICAgIGhlaWdodDogaG9yaXpvbnRhbCA/IHRoZW1lLmNoYXJ0LmhlaWdodCA6IGhlaWdodCxcbiAgICAgICAgd2lkdGg6IGhvcml6b250YWwgPyB3aWR0aCA6IHRoZW1lLmNoYXJ0LmhlaWdodFxuICAgIH07XG4gICAgY29uc3QgZGVmYXVsdFBhZGRpbmcgPSB7XG4gICAgICAgIGJvdHRvbTogZ2V0UGFkZGluZ0ZvclNpZGUoJ2JvdHRvbScsIHBhZGRpbmcsIHRoZW1lLmNoYXJ0LnBhZGRpbmcpLFxuICAgICAgICBsZWZ0OiBnZXRQYWRkaW5nRm9yU2lkZSgnbGVmdCcsIHBhZGRpbmcsIHRoZW1lLmNoYXJ0LnBhZGRpbmcpLFxuICAgICAgICByaWdodDogZ2V0UGFkZGluZ0ZvclNpZGUoJ3JpZ2h0JywgcGFkZGluZywgdGhlbWUuY2hhcnQucGFkZGluZyksXG4gICAgICAgIHRvcDogZ2V0UGFkZGluZ0ZvclNpZGUoJ3RvcCcsIHBhZGRpbmcsIHRoZW1lLmNoYXJ0LnBhZGRpbmcpXG4gICAgfTtcbiAgICAvLyBSZXR1cm5zIHRpdGxlXG4gICAgY29uc3QgZ2V0VGl0bGUgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNob3dCb3RoID0gdGl0bGUgJiYgc3ViVGl0bGU7XG4gICAgICAgIGxldCBsYWJlbFBvc2l0aW9uID0gaG9yaXpvbnRhbCA/ICdsZWZ0JyA6ICdib3R0b20nO1xuICAgICAgICBpZiAodGl0bGVQb3NpdGlvbiAmJiB0aXRsZVBvc2l0aW9uLmluY2x1ZGVzKCdsZWZ0JykgJiYgaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgbGFiZWxQb3NpdGlvbiA9IHRpdGxlUG9zaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRleHRBbmNob3IgPSAnbWlkZGxlJztcbiAgICAgICAgaWYgKGxhYmVsUG9zaXRpb24gPT09ICd0b3AtbGVmdCcpIHtcbiAgICAgICAgICAgIHRleHRBbmNob3IgPSAnc3RhcnQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGhvcml6b250YWwpIHtcbiAgICAgICAgICAgIHRleHRBbmNob3IgPSAnZW5kJztcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGp1c3QgZm9yIHBhZGRpbmdcbiAgICAgICAgbGV0IGR5ID0gQ2hhcnRDb21tb25TdHlsZXMubGVnZW5kLm1hcmdpbiAqIDIgLSBkZWZhdWx0UGFkZGluZy5ib3R0b207XG4gICAgICAgIGlmIChsYWJlbFBvc2l0aW9uID09PSAndG9wLWxlZnQnKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXRMYWJlbFBvc2l0aW9uID0gc2hvd0JvdGggPyAwIDogMTtcbiAgICAgICAgICAgIGR5ID1cbiAgICAgICAgICAgICAgICBkZWZhdWx0UGFkZGluZy50b3AgKiAwLjUgK1xuICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdFBhZGRpbmcuYm90dG9tICogMC41IC0gZGVmYXVsdFBhZGRpbmcuYm90dG9tKSArXG4gICAgICAgICAgICAgICAgICAgIDU4IC1cbiAgICAgICAgICAgICAgICAgICAgQ2hhcnRDb21tb25TdHlsZXMubGVnZW5kLm1hcmdpbiArXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldExhYmVsUG9zaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgZHkgPSBkZWZhdWx0UGFkZGluZy50b3AgKiAwLjUgKyAoZGVmYXVsdFBhZGRpbmcuYm90dG9tICogMC41IC0gZGVmYXVsdFBhZGRpbmcuYm90dG9tKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgeCBhbmQgeSBjYWxjdWxhdGlvbnMgYmVsb3cgYXJlIHVzZWQgdG8gYWRqdXN0IHRoZSBwb3NpdGlvbiBvZiB0aGUgdGl0bGUsIGJhc2VkIG9uIHBhZGRpbmcgYW5kIHNjYWxlLlxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3aGVuIHBhZGRpbmcgaXMgYWRqdXN0ZWQsIHRoZSB0aXRsZSBtb3ZlcyBhbG9uZyB3aXRoIHRoZSBjaGFydCdzIHBvc2l0aW9uLlxuICAgICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KHRpdGxlQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKHNob3dCb3RoICYmIHsgY2FwSGVpZ2h0IH0pKSwgeyBzdHlsZTogW0NoYXJ0QnVsbGV0U3R5bGVzLmxhYmVsLnRpdGxlLCBDaGFydEJ1bGxldFN0eWxlcy5sYWJlbC5zdWJUaXRsZV0sIHRleHQ6IHNob3dCb3RoID8gW3RpdGxlLCBzdWJUaXRsZV0gOiB0aXRsZSwgdGV4dEFuY2hvciwgdmVydGljYWxBbmNob3I6IGxhYmVsUG9zaXRpb24gPT09ICd0b3AtbGVmdCcgPyAnZW5kJyA6ICdtaWRkbGUnLCBcbiAgICAgICAgICAgIC8vIEFkanVzdCBmb3IgcGFkZGluZ1xuICAgICAgICAgICAgeDogaG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgID8gZ2V0QnVsbGV0TGFiZWxYKHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnRXaWR0aDogY2hhcnRTaXplLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICBkeDogbGFiZWxQb3NpdGlvbiA9PT0gJ3RvcC1sZWZ0J1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBkZWZhdWx0UGFkZGluZy5sZWZ0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IGRlZmF1bHRQYWRkaW5nLmxlZnQgLSBDaGFydENvbW1vblN0eWxlcy5sYWJlbC5tYXJnaW4gKiAxLjc1LFxuICAgICAgICAgICAgICAgICAgICBsYWJlbFBvc2l0aW9uOiAnbGVmdCcsXG4gICAgICAgICAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICBzdmdXaWR0aDogd2lkdGhcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogZGVmYXVsdFBhZGRpbmcubGVmdCAqIDAuNSArXG4gICAgICAgICAgICAgICAgICAgIChkZWZhdWx0UGFkZGluZy5yaWdodCAqIDAuNSAtIChkZWZhdWx0UGFkZGluZy5yaWdodCAtIDUwKSkgK1xuICAgICAgICAgICAgICAgICAgICBDaGFydEJ1bGxldFN0eWxlcy5xdWFsaXRhdGl2ZVJhbmdlV2lkdGggLyAyLCB5OiBnZXRCdWxsZXRMYWJlbFkoe1xuICAgICAgICAgICAgICAgIGNoYXJ0SGVpZ2h0OiBjaGFydFNpemUuaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGR5LFxuICAgICAgICAgICAgICAgIGxhYmVsUG9zaXRpb25cbiAgICAgICAgICAgIH0pIH0pLCB0aXRsZUNvbXBvbmVudC5wcm9wcykpO1xuICAgIH07XG4gICAgcmV0dXJuIHN0YW5kYWxvbmUgPyAoUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydENvbnRhaW5lciwgeyBkZXNjOiBhcmlhRGVzYywgaGVpZ2h0OiBoZWlnaHQsIHRpdGxlOiBhcmlhVGl0bGUsIHdpZHRoOiB3aWR0aCB9LCBnZXRUaXRsZSgpKSkgOiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgZ2V0VGl0bGUoKSkpO1xufTtcbkNoYXJ0QnVsbGV0VGl0bGUuZGlzcGxheU5hbWUgPSAnQ2hhcnRCdWxsZXRUaXRsZSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFydEJ1bGxldFRpdGxlLmpzLm1hcCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBob2lzdE5vblJlYWN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgeyBWaWN0b3J5Q2hhcnQgfSBmcm9tICd2aWN0b3J5LWNoYXJ0JztcbmltcG9ydCB7IGdldENvbXBhcmF0aXZlTWVhc3VyZUVycm9yV2lkdGgsIGdldENvbXBhcmF0aXZlTWVhc3VyZVdpZHRoLCBnZXRDb21wYXJhdGl2ZU1lYXN1cmVXYXJuaW5nV2lkdGgsIGdldFByaW1hcnlEb3RNZWFzdXJlU2l6ZSwgZ2V0UHJpbWFyeVNlZ21lbnRlZE1lYXN1cmVXaWR0aCwgZ2V0UXVhbGl0YXRpdmVSYW5nZUJhcldpZHRoIH0gZnJvbSAnLi91dGlscy9jaGFydC1idWxsZXQtc2l6ZSc7XG5pbXBvcnQgeyBnZXRCdWxsZXREb21haW4gfSBmcm9tICcuL3V0aWxzL2NoYXJ0LWJ1bGxldC1kb21haW4nO1xuaW1wb3J0IHsgZ2V0QnVsbGV0VGhlbWVXaXRoTGVnZW5kQ29sb3JTY2FsZSB9IGZyb20gJy4vdXRpbHMvY2hhcnQtYnVsbGV0LXRoZW1lJztcbmltcG9ydCB7IENoYXJ0QXhpcyB9IGZyb20gJy4uL0NoYXJ0QXhpcyc7XG5pbXBvcnQgeyBDaGFydEJ1bGxldENvbXBhcmF0aXZlRXJyb3JNZWFzdXJlIH0gZnJvbSAnLi9DaGFydEJ1bGxldENvbXBhcmF0aXZlRXJyb3JNZWFzdXJlJztcbmltcG9ydCB7IENoYXJ0QnVsbGV0Q29tcGFyYXRpdmVNZWFzdXJlIH0gZnJvbSAnLi9DaGFydEJ1bGxldENvbXBhcmF0aXZlTWVhc3VyZSc7XG5pbXBvcnQgeyBDaGFydEJ1bGxldENvbXBhcmF0aXZlV2FybmluZ01lYXN1cmUgfSBmcm9tICcuL0NoYXJ0QnVsbGV0Q29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZSc7XG5pbXBvcnQgeyBDaGFydEJ1bGxldEdyb3VwVGl0bGUgfSBmcm9tICcuL0NoYXJ0QnVsbGV0R3JvdXBUaXRsZSc7XG5pbXBvcnQgeyBDaGFydEJ1bGxldFByaW1hcnlEb3RNZWFzdXJlIH0gZnJvbSAnLi9DaGFydEJ1bGxldFByaW1hcnlEb3RNZWFzdXJlJztcbmltcG9ydCB7IENoYXJ0QnVsbGV0UHJpbWFyeVNlZ21lbnRlZE1lYXN1cmUgfSBmcm9tICcuL0NoYXJ0QnVsbGV0UHJpbWFyeVNlZ21lbnRlZE1lYXN1cmUnO1xuaW1wb3J0IHsgQ2hhcnRCdWxsZXRRdWFsaXRhdGl2ZVJhbmdlIH0gZnJvbSAnLi9DaGFydEJ1bGxldFF1YWxpdGF0aXZlUmFuZ2UnO1xuaW1wb3J0IHsgQ2hhcnRCdWxsZXRUaXRsZSB9IGZyb20gJy4vQ2hhcnRCdWxsZXRUaXRsZSc7XG5pbXBvcnQgeyBDaGFydENvbnRhaW5lciB9IGZyb20gJy4uL0NoYXJ0Q29udGFpbmVyJztcbmltcG9ydCB7IENoYXJ0TGVnZW5kLCBDaGFydExlZ2VuZFBvc2l0aW9uIH0gZnJvbSAnLi4vQ2hhcnRMZWdlbmQnO1xuaW1wb3J0IHsgQ2hhcnRCdWxsZXRTdHlsZXMgfSBmcm9tICcuLi9DaGFydFRoZW1lJztcbmltcG9ydCB7IENoYXJ0VG9vbHRpcCB9IGZyb20gJy4uL0NoYXJ0VG9vbHRpcCc7XG5pbXBvcnQgeyBnZXRDb21wdXRlZExlZ2VuZCwgZ2V0UGFkZGluZ0ZvclNpZGUgfSBmcm9tICcuLi9DaGFydFV0aWxzJztcbmV4cG9ydCBjb25zdCBDaGFydEJ1bGxldCA9ICh7IGFsbG93VG9vbHRpcCA9IHRydWUsIGFyaWFEZXNjLCBhcmlhVGl0bGUsIGF4aXNDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0QXhpcywgbnVsbCksIGNvbXBhcmF0aXZlRXJyb3JNZWFzdXJlQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydEJ1bGxldENvbXBhcmF0aXZlRXJyb3JNZWFzdXJlLCBudWxsKSwgY29tcGFyYXRpdmVFcnJvck1lYXN1cmVEYXRhLCBjb21wYXJhdGl2ZUVycm9yTWVhc3VyZURhdGFZLCBjb21wYXJhdGl2ZUVycm9yTWVhc3VyZUxlZ2VuZERhdGEsIGNvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0QnVsbGV0Q29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZSwgbnVsbCksIGNvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVEYXRhLCBjb21wYXJhdGl2ZVdhcm5pbmdNZWFzdXJlRGF0YVksIGNvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVMZWdlbmREYXRhLCBjb21wYXJhdGl2ZVplcm9NZWFzdXJlQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydEJ1bGxldENvbXBhcmF0aXZlTWVhc3VyZSwgbnVsbCksIGNvbnN0cmFpblRvVmlzaWJsZUFyZWEgPSBmYWxzZSwgZ3JvdXBUaXRsZUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRCdWxsZXRHcm91cFRpdGxlLCBudWxsKSwgZ3JvdXBTdWJUaXRsZSwgZ3JvdXBUaXRsZSwgaG9yaXpvbnRhbCA9IHRydWUsIGludmVydCA9IGZhbHNlLCBsYWJlbHMsIGxlZ2VuZEFsbG93V3JhcCA9IGZhbHNlLCBsZWdlbmRDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0TGVnZW5kLCBudWxsKSwgbGVnZW5kSXRlbXNQZXJSb3csIGxlZ2VuZFBvc2l0aW9uID0gJ2JvdHRvbScsIG1heERvbWFpbiwgbWluRG9tYWluLCBwYWRkaW5nLCBwcmltYXJ5RG90TWVhc3VyZUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRCdWxsZXRQcmltYXJ5RG90TWVhc3VyZSwgbnVsbCksIHByaW1hcnlEb3RNZWFzdXJlRGF0YSwgcHJpbWFyeURvdE1lYXN1cmVEYXRhWSwgcHJpbWFyeURvdE1lYXN1cmVMZWdlbmREYXRhLCBwcmltYXJ5U2VnbWVudGVkTWVhc3VyZUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRCdWxsZXRQcmltYXJ5U2VnbWVudGVkTWVhc3VyZSwgbnVsbCksIHByaW1hcnlTZWdtZW50ZWRNZWFzdXJlRGF0YSwgcHJpbWFyeVNlZ21lbnRlZE1lYXN1cmVEYXRhWSwgcHJpbWFyeVNlZ21lbnRlZE1lYXN1cmVMZWdlbmREYXRhLCBxdWFsaXRhdGl2ZVJhbmdlQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydEJ1bGxldFF1YWxpdGF0aXZlUmFuZ2UsIG51bGwpLCBxdWFsaXRhdGl2ZVJhbmdlRGF0YSwgcXVhbGl0YXRpdmVSYW5nZURhdGFZLCBxdWFsaXRhdGl2ZVJhbmdlRGF0YVkwLCBxdWFsaXRhdGl2ZVJhbmdlTGVnZW5kRGF0YSwgc3RhbmRhbG9uZSA9IHRydWUsIHN1YlRpdGxlLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIHRpdGxlLCB0aXRsZUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRCdWxsZXRUaXRsZSwgbnVsbCksIHRpdGxlUG9zaXRpb24sIFxuLy8gZGVzdHJ1Y3R1cmUgbGFzdFxudGhlbWUgPSBnZXRCdWxsZXRUaGVtZVdpdGhMZWdlbmRDb2xvclNjYWxlKHtcbiAgICBjb21wYXJhdGl2ZUVycm9yTWVhc3VyZURhdGEsXG4gICAgY29tcGFyYXRpdmVFcnJvck1lYXN1cmVMZWdlbmREYXRhLFxuICAgIGNvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVEYXRhLFxuICAgIGNvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVMZWdlbmREYXRhLFxuICAgIGludmVydCxcbiAgICBwcmltYXJ5RG90TWVhc3VyZURhdGEsXG4gICAgcHJpbWFyeURvdE1lYXN1cmVMZWdlbmREYXRhLFxuICAgIHByaW1hcnlTZWdtZW50ZWRNZWFzdXJlRGF0YSxcbiAgICBwcmltYXJ5U2VnbWVudGVkTWVhc3VyZUxlZ2VuZERhdGEsXG4gICAgcXVhbGl0YXRpdmVSYW5nZURhdGEsXG4gICAgcXVhbGl0YXRpdmVSYW5nZUxlZ2VuZERhdGEsXG4gICAgdGhlbWVDb2xvcixcbiAgICB0aGVtZVZhcmlhbnRcbn0pLCBkb21haW4gPSBnZXRCdWxsZXREb21haW4oe1xuICAgIGNvbXBhcmF0aXZlRXJyb3JNZWFzdXJlQ29tcG9uZW50LFxuICAgIGNvbXBhcmF0aXZlRXJyb3JNZWFzdXJlRGF0YSxcbiAgICBjb21wYXJhdGl2ZVdhcm5pbmdNZWFzdXJlQ29tcG9uZW50LFxuICAgIGNvbXBhcmF0aXZlV2FybmluZ01lYXN1cmVEYXRhLFxuICAgIG1heERvbWFpbixcbiAgICBtaW5Eb21haW4sXG4gICAgcHJpbWFyeURvdE1lYXN1cmVDb21wb25lbnQsXG4gICAgcHJpbWFyeURvdE1lYXN1cmVEYXRhLFxuICAgIHByaW1hcnlTZWdtZW50ZWRNZWFzdXJlQ29tcG9uZW50LFxuICAgIHByaW1hcnlTZWdtZW50ZWRNZWFzdXJlRGF0YSxcbiAgICBxdWFsaXRhdGl2ZVJhbmdlQ29tcG9uZW50LFxuICAgIHF1YWxpdGF0aXZlUmFuZ2VEYXRhXG59KSwgbGVnZW5kT3JpZW50YXRpb24gPSB0aGVtZS5sZWdlbmQub3JpZW50YXRpb24sIGhlaWdodCA9IGhvcml6b250YWwgPyB0aGVtZS5jaGFydC5oZWlnaHQgOiB0aGVtZS5jaGFydC53aWR0aCwgd2lkdGggPSBob3Jpem9udGFsID8gdGhlbWUuY2hhcnQud2lkdGggOiB0aGVtZS5jaGFydC5oZWlnaHQsIGJ1bGxldFNpemUgPSB0aGVtZS5jaGFydC5oZWlnaHQgfSkgPT4ge1xuICAgIC8vIE5vdGUgdGhhdCB3ZSdyZSB1c2luZyBhIGZpeGVkIGJ1bGxldCBoZWlnaHQgd2lkdGggdG8gYWxpZ24gY29tcG9uZW50cy5cbiAgICBjb25zdCBjaGFydFNpemUgPSB7XG4gICAgICAgIGhlaWdodDogaG9yaXpvbnRhbCA/IGJ1bGxldFNpemUgOiBoZWlnaHQsXG4gICAgICAgIHdpZHRoOiBob3Jpem9udGFsID8gd2lkdGggOiBidWxsZXRTaXplXG4gICAgfTtcbiAgICBjb25zdCBkZWZhdWx0UGFkZGluZyA9IHtcbiAgICAgICAgYm90dG9tOiBnZXRQYWRkaW5nRm9yU2lkZSgnYm90dG9tJywgcGFkZGluZywgdGhlbWUuY2hhcnQucGFkZGluZyksXG4gICAgICAgIGxlZnQ6IGdldFBhZGRpbmdGb3JTaWRlKCdsZWZ0JywgcGFkZGluZywgdGhlbWUuY2hhcnQucGFkZGluZyksXG4gICAgICAgIHJpZ2h0OiBnZXRQYWRkaW5nRm9yU2lkZSgncmlnaHQnLCBwYWRkaW5nLCB0aGVtZS5jaGFydC5wYWRkaW5nKSxcbiAgICAgICAgdG9wOiBnZXRQYWRkaW5nRm9yU2lkZSgndG9wJywgcGFkZGluZywgdGhlbWUuY2hhcnQucGFkZGluZylcbiAgICB9O1xuICAgIC8vIEJ1bGxldCBncm91cCB0aXRsZVxuICAgIGNvbnN0IGJ1bGxldEdyb3VwVGl0bGUgPSBSZWFjdC5jbG9uZUVsZW1lbnQoZ3JvdXBUaXRsZUNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7IGhlaWdodCwgc3RhbmRhbG9uZTogZmFsc2UsIHN1YlRpdGxlOiBncm91cFN1YlRpdGxlLCB0aXRsZTogZ3JvdXBUaXRsZSwgd2lkdGggfSwgZ3JvdXBUaXRsZUNvbXBvbmVudC5wcm9wcykpO1xuICAgIC8vIEJ1bGxldCB0aXRsZVxuICAgIGNvbnN0IGJ1bGxldFRpdGxlID0gUmVhY3QuY2xvbmVFbGVtZW50KHRpdGxlQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgaGVpZ2h0LFxuICAgICAgICBob3Jpem9udGFsLFxuICAgICAgICBsZWdlbmRQb3NpdGlvbixcbiAgICAgICAgcGFkZGluZywgc3RhbmRhbG9uZTogZmFsc2UsIHN1YlRpdGxlLFxuICAgICAgICB0aGVtZSxcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIHRpdGxlUG9zaXRpb24sXG4gICAgICAgIHdpZHRoIH0sIHRpdGxlQ29tcG9uZW50LnByb3BzKSk7XG4gICAgLy8gQ29tcGFyYXRpdmUgZXJyb3IgbWVhc3VyZVxuICAgIGNvbnN0IGNvbXBhcmF0aXZlRXJyb3JNZWFzdXJlID0gUmVhY3QuY2xvbmVFbGVtZW50KGNvbXBhcmF0aXZlRXJyb3JNZWFzdXJlQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgYWxsb3dUb29sdGlwLCBiYXJXaWR0aDogZ2V0Q29tcGFyYXRpdmVNZWFzdXJlRXJyb3JXaWR0aCh7IGhlaWdodDogY2hhcnRTaXplLmhlaWdodCwgaG9yaXpvbnRhbCwgd2lkdGg6IGNoYXJ0U2l6ZS53aWR0aCB9KSwgY29uc3RyYWluVG9WaXNpYmxlQXJlYSwgZGF0YTogY29tcGFyYXRpdmVFcnJvck1lYXN1cmVEYXRhLCBkb21haW4sIGhlaWdodDogY2hhcnRTaXplLmhlaWdodCwgaG9yaXpvbnRhbCwgbGFiZWxDb21wb25lbnQ6IGFsbG93VG9vbHRpcCA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRUb29sdGlwLCB7IGhlaWdodDogaGVpZ2h0LCB0aGVtZTogdGhlbWUsIHdpZHRoOiB3aWR0aCB9KSA6IHVuZGVmaW5lZCwgbGFiZWxzLFxuICAgICAgICBwYWRkaW5nLCBzdGFuZGFsb25lOiBmYWxzZSwgd2lkdGg6IGNoYXJ0U2l6ZS53aWR0aCwgeTogY29tcGFyYXRpdmVFcnJvck1lYXN1cmVEYXRhWSB9LCBjb21wYXJhdGl2ZUVycm9yTWVhc3VyZUNvbXBvbmVudC5wcm9wcykpO1xuICAgIC8vIENvbXBhcmF0aXZlIHdhcm5pbmcgbWVhc3VyZVxuICAgIGNvbnN0IGNvbXBhcmF0aXZlV2FybmluZ01lYXN1cmUgPSBSZWFjdC5jbG9uZUVsZW1lbnQoY29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZUNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7IGFsbG93VG9vbHRpcCwgYmFyV2lkdGg6IGdldENvbXBhcmF0aXZlTWVhc3VyZVdhcm5pbmdXaWR0aCh7IGhlaWdodDogY2hhcnRTaXplLmhlaWdodCwgaG9yaXpvbnRhbCwgd2lkdGg6IGNoYXJ0U2l6ZS53aWR0aCB9KSwgY29uc3RyYWluVG9WaXNpYmxlQXJlYSwgZGF0YTogY29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZURhdGEsIGRvbWFpbiwgaGVpZ2h0OiBjaGFydFNpemUuaGVpZ2h0LCBob3Jpem9udGFsLCBsYWJlbENvbXBvbmVudDogYWxsb3dUb29sdGlwID8gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydFRvb2x0aXAsIHsgaGVpZ2h0OiBoZWlnaHQsIHRoZW1lOiB0aGVtZSwgd2lkdGg6IHdpZHRoIH0pIDogdW5kZWZpbmVkLCBsYWJlbHMsXG4gICAgICAgIHBhZGRpbmcsIHN0YW5kYWxvbmU6IGZhbHNlLCB3aWR0aDogY2hhcnRTaXplLndpZHRoLCB5OiBjb21wYXJhdGl2ZVdhcm5pbmdNZWFzdXJlRGF0YVkgfSwgY29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZUNvbXBvbmVudC5wcm9wcykpO1xuICAgIC8vIENvbXBhcmF0aXZlIHplcm8gbWVhc3VyZVxuICAgIGNvbnN0IGNvbXBhcmF0aXZlWmVyb01lYXN1cmUgPSBSZWFjdC5jbG9uZUVsZW1lbnQoY29tcGFyYXRpdmVaZXJvTWVhc3VyZUNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7IGJhcldpZHRoOiBnZXRDb21wYXJhdGl2ZU1lYXN1cmVXaWR0aCh7IGhlaWdodDogY2hhcnRTaXplLmhlaWdodCwgaG9yaXpvbnRhbCwgd2lkdGg6IGNoYXJ0U2l6ZS53aWR0aCB9KSwgZGF0YTogW3sgeTogMCB9XSwgZG9tYWluLCBoZWlnaHQ6IGNoYXJ0U2l6ZS5oZWlnaHQsIGhvcml6b250YWwsXG4gICAgICAgIHBhZGRpbmcsIHN0YW5kYWxvbmU6IGZhbHNlLCB3aWR0aDogY2hhcnRTaXplLndpZHRoIH0sIGNvbXBhcmF0aXZlWmVyb01lYXN1cmVDb21wb25lbnQucHJvcHMpKTtcbiAgICAvLyBMZWdlbmRcbiAgICBjb25zdCBsZWdlbmQgPSBSZWFjdC5jbG9uZUVsZW1lbnQobGVnZW5kQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgZGF0YTogW1xuICAgICAgICAgICAgLi4uKHByaW1hcnlEb3RNZWFzdXJlTGVnZW5kRGF0YSA/IHByaW1hcnlEb3RNZWFzdXJlTGVnZW5kRGF0YSA6IFtdKSxcbiAgICAgICAgICAgIC4uLihwcmltYXJ5U2VnbWVudGVkTWVhc3VyZUxlZ2VuZERhdGEgPyBwcmltYXJ5U2VnbWVudGVkTWVhc3VyZUxlZ2VuZERhdGEgOiBbXSksXG4gICAgICAgICAgICAuLi4oY29tcGFyYXRpdmVXYXJuaW5nTWVhc3VyZUxlZ2VuZERhdGEgPyBjb21wYXJhdGl2ZVdhcm5pbmdNZWFzdXJlTGVnZW5kRGF0YSA6IFtdKSxcbiAgICAgICAgICAgIC4uLihjb21wYXJhdGl2ZUVycm9yTWVhc3VyZUxlZ2VuZERhdGEgPyBjb21wYXJhdGl2ZUVycm9yTWVhc3VyZUxlZ2VuZERhdGEgOiBbXSksXG4gICAgICAgICAgICAuLi4ocXVhbGl0YXRpdmVSYW5nZUxlZ2VuZERhdGEgPyBxdWFsaXRhdGl2ZVJhbmdlTGVnZW5kRGF0YSA6IFtdKVxuICAgICAgICBdLCBpdGVtc1BlclJvdzogbGVnZW5kSXRlbXNQZXJSb3csIG9yaWVudGF0aW9uOiBsZWdlbmRPcmllbnRhdGlvbiwgcG9zaXRpb246IGxlZ2VuZFBvc2l0aW9uLCB0aGVtZSB9LCBsZWdlbmRDb21wb25lbnQucHJvcHMpKTtcbiAgICAvLyBQcmltYXJ5IGRvdCBtZWFzdXJlXG4gICAgY29uc3QgcHJpbWFyeURvdE1lYXN1cmUgPSBSZWFjdC5jbG9uZUVsZW1lbnQocHJpbWFyeURvdE1lYXN1cmVDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oeyBhbGxvd1Rvb2x0aXAsXG4gICAgICAgIGNvbnN0cmFpblRvVmlzaWJsZUFyZWEsIGRhdGE6IHByaW1hcnlEb3RNZWFzdXJlRGF0YSwgZG9tYWluLCBoZWlnaHQ6IGNoYXJ0U2l6ZS5oZWlnaHQsIGhvcml6b250YWwsXG4gICAgICAgIGludmVydCwgbGFiZWxDb21wb25lbnQ6IGFsbG93VG9vbHRpcCA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRUb29sdGlwLCB7IGhlaWdodDogaGVpZ2h0LCB0aGVtZTogdGhlbWUsIHdpZHRoOiB3aWR0aCB9KSA6IHVuZGVmaW5lZCwgbGFiZWxzLFxuICAgICAgICBwYWRkaW5nLCBzaXplOiBnZXRQcmltYXJ5RG90TWVhc3VyZVNpemUoeyBoZWlnaHQ6IGNoYXJ0U2l6ZS5oZWlnaHQsIGhvcml6b250YWwsIHdpZHRoOiBjaGFydFNpemUud2lkdGggfSksIHN0YW5kYWxvbmU6IGZhbHNlLCB0aGVtZUNvbG9yLFxuICAgICAgICB0aGVtZVZhcmlhbnQsIHdpZHRoOiBjaGFydFNpemUud2lkdGgsIHk6IHByaW1hcnlEb3RNZWFzdXJlRGF0YVkgfSwgcHJpbWFyeURvdE1lYXN1cmVDb21wb25lbnQucHJvcHMpKTtcbiAgICAvLyBQcmltYXJ5IHNlZ21lbnRlZCBtZWFzdXJlXG4gICAgY29uc3QgcHJpbWFyeVNlZ21lbnRlZE1lYXN1cmUgPSBSZWFjdC5jbG9uZUVsZW1lbnQocHJpbWFyeVNlZ21lbnRlZE1lYXN1cmVDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oeyBhbGxvd1Rvb2x0aXAsXG4gICAgICAgIGNvbnN0cmFpblRvVmlzaWJsZUFyZWEsIGJhcldpZHRoOiBnZXRQcmltYXJ5U2VnbWVudGVkTWVhc3VyZVdpZHRoKHsgaGVpZ2h0OiBjaGFydFNpemUuaGVpZ2h0LCBob3Jpem9udGFsLCB3aWR0aDogY2hhcnRTaXplLndpZHRoIH0pLCBkYXRhOiBwcmltYXJ5U2VnbWVudGVkTWVhc3VyZURhdGEsIGRvbWFpbiwgaGVpZ2h0OiBjaGFydFNpemUuaGVpZ2h0LCBob3Jpem9udGFsLFxuICAgICAgICBpbnZlcnQsIGxhYmVsQ29tcG9uZW50OiBhbGxvd1Rvb2x0aXAgPyBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0VG9vbHRpcCwgeyBoZWlnaHQ6IGhlaWdodCwgdGhlbWU6IHRoZW1lLCB3aWR0aDogd2lkdGggfSkgOiB1bmRlZmluZWQsIGxhYmVscyxcbiAgICAgICAgcGFkZGluZywgc3RhbmRhbG9uZTogZmFsc2UsIHRoZW1lQ29sb3IsXG4gICAgICAgIHRoZW1lVmFyaWFudCwgd2lkdGg6IGNoYXJ0U2l6ZS53aWR0aCwgeTogcHJpbWFyeVNlZ21lbnRlZE1lYXN1cmVEYXRhWSB9LCBwcmltYXJ5U2VnbWVudGVkTWVhc3VyZUNvbXBvbmVudC5wcm9wcykpO1xuICAgIC8vIFF1YWxpdGF0aXZlIHJhbmdlXG4gICAgY29uc3QgcXVhbGl0YXRpdmVSYW5nZSA9IFJlYWN0LmNsb25lRWxlbWVudChxdWFsaXRhdGl2ZVJhbmdlQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgYWxsb3dUb29sdGlwLFxuICAgICAgICBjb25zdHJhaW5Ub1Zpc2libGVBcmVhLCBiYXJXaWR0aDogZ2V0UXVhbGl0YXRpdmVSYW5nZUJhcldpZHRoKHsgaGVpZ2h0OiBjaGFydFNpemUuaGVpZ2h0LCBob3Jpem9udGFsLCB3aWR0aDogY2hhcnRTaXplLndpZHRoIH0pLCBkYXRhOiBxdWFsaXRhdGl2ZVJhbmdlRGF0YSwgZG9tYWluLCBoZWlnaHQ6IGNoYXJ0U2l6ZS5oZWlnaHQsIGhvcml6b250YWwsXG4gICAgICAgIGludmVydCwgbGFiZWxDb21wb25lbnQ6IGFsbG93VG9vbHRpcCA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRUb29sdGlwLCB7IGhlaWdodDogaGVpZ2h0LCB0aGVtZTogdGhlbWUsIHdpZHRoOiB3aWR0aCB9KSA6IHVuZGVmaW5lZCwgbGFiZWxzLFxuICAgICAgICBwYWRkaW5nLCBzdGFuZGFsb25lOiBmYWxzZSwgd2lkdGg6IGNoYXJ0U2l6ZS53aWR0aCwgeTogcXVhbGl0YXRpdmVSYW5nZURhdGFZLCB5MDogcXVhbGl0YXRpdmVSYW5nZURhdGFZMCB9LCBxdWFsaXRhdGl2ZVJhbmdlQ29tcG9uZW50LnByb3BzKSk7XG4gICAgLy8gUmV0dXJucyB0aWNrIHZhbHVlcyAtLSBWaWN0b3J5IGRvZXNuJ3QgaW5jbHVkZSBtaW4vbWF4IGRvbWFpblxuICAgIGNvbnN0IGdldFRpY2tWYWx1ZXMgPSAobWluVmFsLCBtYXhWYWwpID0+IHtcbiAgICAgICAgY29uc3QgdGlja1ZhbHVlcyA9IFttaW5WYWwsIG1heFZhbF07XG4gICAgICAgIGxldCByYW5nZSA9IDA7XG4gICAgICAgIGlmIChtaW5WYWwgPCAwICYmIG1heFZhbCA8IDApIHtcbiAgICAgICAgICAgIHJhbmdlID0gTWF0aC5hYnMobWluVmFsIC0gbWF4VmFsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtaW5WYWwgPCAwKSB7XG4gICAgICAgICAgICByYW5nZSA9IE1hdGguYWJzKG1pblZhbCkgKyBtYXhWYWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByYW5nZSA9IG1heFZhbCAtIG1pblZhbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aWNrSW50ZXJ2YWwgPSByYW5nZSAvIChDaGFydEJ1bGxldFN0eWxlcy5heGlzVGlja0NvdW50IC0gMSk7XG4gICAgICAgIGZvciAobGV0IGkgPSBtaW5WYWw7IGkgPCBtYXhWYWw7KSB7XG4gICAgICAgICAgICBpICs9IHRpY2tJbnRlcnZhbDtcbiAgICAgICAgICAgIHRpY2tWYWx1ZXMucHVzaChNYXRoLmNlaWwoaSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWNrVmFsdWVzO1xuICAgIH07XG4gICAgLy8gUmV0dXJucyBhIGNvbXB1dGVkIGxlZ2VuZFxuICAgIGNvbnN0IGdldExlZ2VuZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFsZWdlbmQucHJvcHMuZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGR4ID0gMDtcbiAgICAgICAgbGV0IGR5ID0gMDtcbiAgICAgICAgLy8gQWRqdXN0IGZvciBwYWRkaW5nXG4gICAgICAgIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gQ2hhcnRMZWdlbmRQb3NpdGlvbi5ib3R0b20pIHtcbiAgICAgICAgICAgIGlmIChob3Jpem9udGFsKSB7XG4gICAgICAgICAgICAgICAgZHkgPSBkZWZhdWx0UGFkZGluZy50b3AgKiAwLjUgKyAoZGVmYXVsdFBhZGRpbmcuYm90dG9tICogMC41IC0gZGVmYXVsdFBhZGRpbmcuYm90dG9tKSAtIDI1O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgICAgICBkeSA9IC1kZWZhdWx0UGFkZGluZy5ib3R0b20gKyA2MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGR5ID0gLWRlZmF1bHRQYWRkaW5nLmJvdHRvbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gQ2hhcnRMZWdlbmRQb3NpdGlvbi5ib3R0b21MZWZ0KSB7XG4gICAgICAgICAgICBpZiAoaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgIGR5ID0gZGVmYXVsdFBhZGRpbmcudG9wICogMC41ICsgKGRlZmF1bHRQYWRkaW5nLmJvdHRvbSAqIDAuNSAtIGRlZmF1bHRQYWRkaW5nLmJvdHRvbSkgLSAyNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRpdGxlKSB7XG4gICAgICAgICAgICAgICAgZHkgPSAtZGVmYXVsdFBhZGRpbmcuYm90dG9tICsgNjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkeSA9IC1kZWZhdWx0UGFkZGluZy5ib3R0b207XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkeCA9IC0xMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0Q29tcHV0ZWRMZWdlbmQoe1xuICAgICAgICAgICAgYWxsb3dXcmFwOiBsZWdlbmRBbGxvd1dyYXAsXG4gICAgICAgICAgICBjaGFydFR5cGU6ICdidWxsZXQnLFxuICAgICAgICAgICAgZHgsXG4gICAgICAgICAgICBkeSxcbiAgICAgICAgICAgIGhlaWdodDogY2hhcnRTaXplLmhlaWdodCxcbiAgICAgICAgICAgIGxlZ2VuZENvbXBvbmVudDogbGVnZW5kLFxuICAgICAgICAgICAgcGFkZGluZzogZGVmYXVsdFBhZGRpbmcsXG4gICAgICAgICAgICBwb3NpdGlvbjogbGVnZW5kUG9zaXRpb24sXG4gICAgICAgICAgICB0aGVtZSxcbiAgICAgICAgICAgIHdpZHRoOiBjaGFydFNpemUud2lkdGhcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBSZXR1cm5zIGNvbXBhcmF0aXZlIHplcm8gbWVhc3VyZVxuICAgIGNvbnN0IGdldENvbXBhcmF0aXZlWmVyb01lYXN1cmUgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IF9kb21haW4gPSBkb21haW47XG4gICAgICAgIGxldCBsb3cgPSAwO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShfZG9tYWluKSkge1xuICAgICAgICAgICAgbG93ID0gX2RvbWFpblswXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfZG9tYWluLnkgJiYgQXJyYXkuaXNBcnJheShfZG9tYWluLnkpKSB7XG4gICAgICAgICAgICBsb3cgPSBfZG9tYWluLnlbMF07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGhpZ2ggPSAwO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShfZG9tYWluKSkge1xuICAgICAgICAgICAgaGlnaCA9IF9kb21haW5bX2RvbWFpbi5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfZG9tYWluLnkgJiYgQXJyYXkuaXNBcnJheShfZG9tYWluLnkpKSB7XG4gICAgICAgICAgICBoaWdoID0gX2RvbWFpbi55W19kb21haW4ueS5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG93IDwgMCAmJiBoaWdoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmF0aXZlWmVyb01lYXN1cmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICAvLyBBeGlzIGNvbXBvbmVudCBmb3IgY3VzdG9tIHRpY2sgdmFsdWVzXG4gICAgY29uc3QgYXhpcyA9IFJlYWN0LmNsb25lRWxlbWVudChheGlzQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgZGVwZW5kZW50QXhpczogaG9yaXpvbnRhbCA/IGZhbHNlIDogdHJ1ZSwgZG9tYWluOiAhaG9yaXpvbnRhbFxuICAgICAgICAgICAgPyBkb21haW5cbiAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgIHg6IGRvbWFpbi55LFxuICAgICAgICAgICAgICAgIHk6IGRvbWFpbi54XG4gICAgICAgICAgICB9LCBoZWlnaHQ6IGNoYXJ0U2l6ZS5oZWlnaHQsIFxuICAgICAgICAvLyBBZGp1c3QgZm9yIHBhZGRpbmdcbiAgICAgICAgb2Zmc2V0WDogIWhvcml6b250YWwgPyBkZWZhdWx0UGFkZGluZy5sZWZ0ICogMC41ICsgKGRlZmF1bHRQYWRkaW5nLnJpZ2h0ICogMC41IC0gKGRlZmF1bHRQYWRkaW5nLnJpZ2h0IC0gNTUpKSA6IDAsIG9mZnNldFk6IGhvcml6b250YWwgPyA4MCAtIGRlZmF1bHRQYWRkaW5nLnRvcCAqIDAuNSArIChkZWZhdWx0UGFkZGluZy5ib3R0b20gKiAwLjUgLSAyNSkgOiAwLCBwYWRkaW5nLCBzdGFuZGFsb25lOiBmYWxzZSwgdGlja0NvdW50OiBDaGFydEJ1bGxldFN0eWxlcy5heGlzVGlja0NvdW50LCB0aWNrVmFsdWVzOiBnZXRUaWNrVmFsdWVzKGRvbWFpbi55WzBdLCBkb21haW4ueVsxXSksIHdpZHRoOiBjaGFydFNpemUud2lkdGggfSwgYXhpc0NvbXBvbmVudC5wcm9wcykpO1xuICAgIGNvbnN0IGJ1bGxldENoYXJ0ID0gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgIGF4aXMsXG4gICAgICAgIGJ1bGxldEdyb3VwVGl0bGUsXG4gICAgICAgIGJ1bGxldFRpdGxlLFxuICAgICAgICBxdWFsaXRhdGl2ZVJhbmdlLFxuICAgICAgICBwcmltYXJ5U2VnbWVudGVkTWVhc3VyZSxcbiAgICAgICAgcHJpbWFyeURvdE1lYXN1cmUsXG4gICAgICAgIGNvbXBhcmF0aXZlRXJyb3JNZWFzdXJlLFxuICAgICAgICBjb21wYXJhdGl2ZVdhcm5pbmdNZWFzdXJlLFxuICAgICAgICBnZXRDb21wYXJhdGl2ZVplcm9NZWFzdXJlKCksXG4gICAgICAgIGdldExlZ2VuZCgpKSk7XG4gICAgcmV0dXJuIHN0YW5kYWxvbmUgPyAoUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydENvbnRhaW5lciwgeyBkZXNjOiBhcmlhRGVzYywgaGVpZ2h0OiBoZWlnaHQsIHRpdGxlOiBhcmlhVGl0bGUsIHRoZW1lOiB0aGVtZSwgd2lkdGg6IHdpZHRoIH0sIGJ1bGxldENoYXJ0KSkgOiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgYnVsbGV0Q2hhcnQpKTtcbn07XG5DaGFydEJ1bGxldC5kaXNwbGF5TmFtZSA9ICdDaGFydEJ1bGxldCc7XG5ob2lzdE5vblJlYWN0U3RhdGljcyhDaGFydEJ1bGxldCwgVmljdG9yeUNoYXJ0KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJ0QnVsbGV0LmpzLm1hcCIsImV4cG9ydCAqIGZyb20gJy4vQ2hhcnRCdWxsZXQnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFydEJ1bGxldENvbXBhcmF0aXZlRXJyb3JNZWFzdXJlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhcnRCdWxsZXRDb21wYXJhdGl2ZU1lYXN1cmUnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFydEJ1bGxldENvbXBhcmF0aXZlV2FybmluZ01lYXN1cmUnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFydEJ1bGxldFByaW1hcnlEb3RNZWFzdXJlJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhcnRCdWxsZXRQcmltYXJ5U2VnbWVudGVkTWVhc3VyZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYXJ0QnVsbGV0UXVhbGl0YXRpdmVSYW5nZSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tICcuL0NoYXJ0Q29udGFpbmVyJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qIGVzbGludC1kaXNhYmxlIGZ1bmMtc3R5bGUgKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbmltcG9ydCAqIGFzIENvbGxlY3Rpb24gZnJvbSBcIi4vY29sbGVjdGlvblwiOyAvLyBQcml2YXRlIEZ1bmN0aW9uc1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1UYXJnZXQodGFyZ2V0LCBtYXRyaXgsIGRpbWVuc2lvbikge1xuICB2YXIgYSA9IG1hdHJpeC5hLFxuICAgICAgZCA9IG1hdHJpeC5kLFxuICAgICAgZSA9IG1hdHJpeC5lLFxuICAgICAgZiA9IG1hdHJpeC5mO1xuICByZXR1cm4gZGltZW5zaW9uID09PSBcInlcIiA/IGQgKiB0YXJnZXQgKyBmIDogYSAqIHRhcmdldCArIGU7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zZm9ybWF0aW9uTWF0cml4KHN2Zykge1xuICByZXR1cm4gc3ZnLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKTtcbn0gLy8gRXhwb3J0ZWQgRnVuY3Rpb25zXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudFNWRyhldnQpIHtcbiAgaWYgKGV2dC5uYXRpdmVFdmVudCAmJiBldnQubmF0aXZlRXZlbnQuaWRlbnRpZmllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBnZXRQYXJlbnQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgaWYgKHRhcmdldC5ub2RlTmFtZSA9PT0gXCJzdmdcIikge1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRhcmdldC5wYXJlbnROb2RlID8gZ2V0UGFyZW50KHRhcmdldC5wYXJlbnROb2RlKSA6IHRhcmdldDtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGdldFBhcmVudChldnQudGFyZ2V0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTVkdFdmVudENvb3JkaW5hdGVzKGV2dCwgc3ZnKSB7XG4gIGlmIChldnQubmF0aXZlRXZlbnQgJiYgZXZ0Lm5hdGl2ZUV2ZW50LmlkZW50aWZpZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIHJlYWN0LW5hdGl2ZSBvdmVycmlkZS4gcmVsaWVzIG9uIHRoZSBSTi5WaWV3IGJlaW5nIHRoZSBfZXhhY3RfIHNhbWUgc2l6ZSBhcyBpdHMgY2hpbGQgU1ZHLlxuICAgIC8vIHRoaXMgc2hvdWxkIGJlIGZpbmU6IHRoZSBzdmcgaXMgdGhlIG9ubHkgY2hpbGQgb2YgVmlldyBhbmQgdGhlIFZpZXcgc2hpcmtzIHRvIGl0cyBjaGlsZHJlblxuICAgIHJldHVybiB7XG4gICAgICB4OiBldnQubmF0aXZlRXZlbnQubG9jYXRpb25YLFxuICAgICAgeTogZXZ0Lm5hdGl2ZUV2ZW50LmxvY2F0aW9uWVxuICAgIH07XG4gIH1cblxuICBldnQgPSBldnQuY2hhbmdlZFRvdWNoZXMgJiYgZXZ0LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA/IGV2dC5jaGFuZ2VkVG91Y2hlc1swXSA6IGV2dDtcbiAgc3ZnID0gc3ZnIHx8IGdldFBhcmVudFNWRyhldnQpO1xuICB2YXIgbWF0cml4ID0gZ2V0VHJhbnNmb3JtYXRpb25NYXRyaXgoc3ZnKTtcbiAgcmV0dXJuIHtcbiAgICB4OiB0cmFuc2Zvcm1UYXJnZXQoZXZ0LmNsaWVudFgsIG1hdHJpeCwgXCJ4XCIpLFxuICAgIHk6IHRyYW5zZm9ybVRhcmdldChldnQuY2xpZW50WSwgbWF0cml4LCBcInlcIilcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREb21haW5Db29yZGluYXRlcyhwcm9wcywgZG9tYWluKSB7XG4gIHZhciBzY2FsZSA9IHByb3BzLnNjYWxlLFxuICAgICAgaG9yaXpvbnRhbCA9IHByb3BzLmhvcml6b250YWw7XG4gIGRvbWFpbiA9IGRvbWFpbiB8fCB7XG4gICAgeDogc2NhbGUueC5kb21haW4oKSxcbiAgICB5OiBzY2FsZS55LmRvbWFpbigpXG4gIH07XG4gIHJldHVybiB7XG4gICAgeDogaG9yaXpvbnRhbCA/IFtzY2FsZS55KGRvbWFpbi55WzBdKSwgc2NhbGUueShkb21haW4ueVsxXSldIDogW3NjYWxlLngoZG9tYWluLnhbMF0pLCBzY2FsZS54KGRvbWFpbi54WzFdKV0sXG4gICAgeTogaG9yaXpvbnRhbCA/IFtzY2FsZS54KGRvbWFpbi54WzBdKSwgc2NhbGUueChkb21haW4ueFsxXSldIDogW3NjYWxlLnkoZG9tYWluLnlbMF0pLCBzY2FsZS55KGRvbWFpbi55WzFdKV1cbiAgfTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFDb29yZGluYXRlcyhwcm9wcywgc2NhbGUsIHgsIHkpIHtcbiAgdmFyIHBvbGFyID0gcHJvcHMucG9sYXIsXG4gICAgICBob3Jpem9udGFsID0gcHJvcHMuaG9yaXpvbnRhbDtcblxuICBpZiAoIXBvbGFyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGhvcml6b250YWwgPyBzY2FsZS54LmludmVydCh5KSA6IHNjYWxlLnguaW52ZXJ0KHgpLFxuICAgICAgeTogaG9yaXpvbnRhbCA/IHNjYWxlLnkuaW52ZXJ0KHgpIDogc2NhbGUueS5pbnZlcnQoeSlcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBvcmlnaW4gPSBwcm9wcy5vcmlnaW4gfHwge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICAgIHZhciBiYXNlWCA9IHggLSBvcmlnaW4ueDtcbiAgICB2YXIgYmFzZVkgPSB5IC0gb3JpZ2luLnk7XG4gICAgdmFyIHJhZGl1cyA9IE1hdGguYWJzKGJhc2VYICogTWF0aC5zcXJ0KDEgKyBNYXRoLnBvdygtYmFzZVkgLyBiYXNlWCwgMikpKTtcbiAgICB2YXIgYW5nbGUgPSAoLU1hdGguYXRhbjIoYmFzZVksIGJhc2VYKSArIE1hdGguUEkgKiAyKSAlIChNYXRoLlBJICogMik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHNjYWxlLnguaW52ZXJ0KGFuZ2xlKSxcbiAgICAgIHk6IHNjYWxlLnkuaW52ZXJ0KHJhZGl1cylcbiAgICB9O1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Qm91bmRzKHByb3BzKSB7XG4gIHZhciB4MSA9IHByb3BzLngxLFxuICAgICAgeDIgPSBwcm9wcy54MixcbiAgICAgIHkxID0gcHJvcHMueTEsXG4gICAgICB5MiA9IHByb3BzLnkyLFxuICAgICAgc2NhbGUgPSBwcm9wcy5zY2FsZTtcbiAgdmFyIHBvaW50MSA9IGdldERhdGFDb29yZGluYXRlcyhwcm9wcywgc2NhbGUsIHgxLCB5MSk7XG4gIHZhciBwb2ludDIgPSBnZXREYXRhQ29vcmRpbmF0ZXMocHJvcHMsIHNjYWxlLCB4MiwgeTIpO1xuXG4gIHZhciBtYWtlQm91bmQgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBbQ29sbGVjdGlvbi5nZXRNaW5WYWx1ZShbYSwgYl0pLCBDb2xsZWN0aW9uLmdldE1heFZhbHVlKFthLCBiXSldO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgeDogbWFrZUJvdW5kKHBvaW50MS54LCBwb2ludDIueCksXG4gICAgeTogbWFrZUJvdW5kKHBvaW50MS55LCBwb2ludDIueSlcbiAgfTtcbn0iLCJpbXBvcnQgX21hcFZhbHVlcyBmcm9tIFwibG9kYXNoL21hcFZhbHVlc1wiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gvaXNGdW5jdGlvblwiO1xuaW1wb3J0IF90aHJvdHRsZSBmcm9tIFwibG9kYXNoL3Rocm90dGxlXCI7XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IHsgU2VsZWN0aW9uIH0gZnJvbSBcInZpY3RvcnktY29yZVwiO1xudmFyIE9OX01PVVNFX01PVkVfVEhST1RUTEVfTVMgPSAxNjtcbnZhciBDdXJzb3JIZWxwZXJzID0ge1xuICBnZXREaW1lbnNpb246IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHZhciBob3Jpem9udGFsID0gcHJvcHMuaG9yaXpvbnRhbCxcbiAgICAgICAgY3Vyc29yRGltZW5zaW9uID0gcHJvcHMuY3Vyc29yRGltZW5zaW9uO1xuXG4gICAgaWYgKCFob3Jpem9udGFsIHx8ICFjdXJzb3JEaW1lbnNpb24pIHtcbiAgICAgIHJldHVybiBjdXJzb3JEaW1lbnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnNvckRpbWVuc2lvbiA9PT0gXCJ4XCIgPyBcInlcIiA6IFwieFwiO1xuICB9LFxuICB3aXRoaW5Cb3VuZHM6IGZ1bmN0aW9uIChwb2ludCwgYm91bmRzKSB7XG4gICAgdmFyIF9tYXBWYWx1ZXMyID0gX21hcFZhbHVlcyhib3VuZHMsIE51bWJlciksXG4gICAgICAgIHgxID0gX21hcFZhbHVlczIueDEsXG4gICAgICAgIHgyID0gX21hcFZhbHVlczIueDIsXG4gICAgICAgIHkxID0gX21hcFZhbHVlczIueTEsXG4gICAgICAgIHkyID0gX21hcFZhbHVlczIueTI7XG5cbiAgICB2YXIgX21hcFZhbHVlczMgPSBfbWFwVmFsdWVzKHBvaW50LCBOdW1iZXIpLFxuICAgICAgICB4ID0gX21hcFZhbHVlczMueCxcbiAgICAgICAgeSA9IF9tYXBWYWx1ZXMzLnk7XG5cbiAgICByZXR1cm4geCA+PSBNYXRoLm1pbih4MSwgeDIpICYmIHggPD0gTWF0aC5tYXgoeDEsIHgyKSAmJiB5ID49IE1hdGgubWluKHkxLCB5MikgJiYgeSA8PSBNYXRoLm1heCh5MSwgeTIpO1xuICB9LFxuICBvbk1vdXNlTW92ZTogZnVuY3Rpb24gKGV2dCwgdGFyZ2V0UHJvcHMpIHtcbiAgICB2YXIgb25DdXJzb3JDaGFuZ2UgPSB0YXJnZXRQcm9wcy5vbkN1cnNvckNoYW5nZSxcbiAgICAgICAgZG9tYWluID0gdGFyZ2V0UHJvcHMuZG9tYWluO1xuICAgIHZhciBjdXJzb3JEaW1lbnNpb24gPSB0aGlzLmdldERpbWVuc2lvbih0YXJnZXRQcm9wcyk7XG4gICAgdmFyIHBhcmVudFNWRyA9IHRhcmdldFByb3BzLnBhcmVudFNWRyB8fCBTZWxlY3Rpb24uZ2V0UGFyZW50U1ZHKGV2dCk7XG4gICAgdmFyIGN1cnNvclNWR1Bvc2l0aW9uID0gU2VsZWN0aW9uLmdldFNWR0V2ZW50Q29vcmRpbmF0ZXMoZXZ0LCBwYXJlbnRTVkcpO1xuICAgIHZhciBjdXJzb3JWYWx1ZSA9IFNlbGVjdGlvbi5nZXREYXRhQ29vcmRpbmF0ZXModGFyZ2V0UHJvcHMsIHRhcmdldFByb3BzLnNjYWxlLCBjdXJzb3JTVkdQb3NpdGlvbi54LCBjdXJzb3JTVkdQb3NpdGlvbi55KTtcbiAgICB2YXIgaW5Cb3VuZHMgPSB0aGlzLndpdGhpbkJvdW5kcyhjdXJzb3JWYWx1ZSwge1xuICAgICAgeDE6IGRvbWFpbi54WzBdLFxuICAgICAgeDI6IGRvbWFpbi54WzFdLFxuICAgICAgeTE6IGRvbWFpbi55WzBdLFxuICAgICAgeTI6IGRvbWFpbi55WzFdXG4gICAgfSk7XG5cbiAgICBpZiAoIWluQm91bmRzKSB7XG4gICAgICBjdXJzb3JWYWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKF9pc0Z1bmN0aW9uKG9uQ3Vyc29yQ2hhbmdlKSkge1xuICAgICAgaWYgKGluQm91bmRzKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGN1cnNvckRpbWVuc2lvbiA/IGN1cnNvclZhbHVlW2N1cnNvckRpbWVuc2lvbl0gOiBjdXJzb3JWYWx1ZTtcbiAgICAgICAgb25DdXJzb3JDaGFuZ2UodmFsdWUsIHRhcmdldFByb3BzKTtcbiAgICAgIH0gZWxzZSBpZiAoY3Vyc29yVmFsdWUgIT09IHRhcmdldFByb3BzLmN1cnNvclZhbHVlKSB7XG4gICAgICAgIG9uQ3Vyc29yQ2hhbmdlKHRhcmdldFByb3BzLmRlZmF1bHRDdXJzb3JWYWx1ZSB8fCBudWxsLCB0YXJnZXRQcm9wcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFt7XG4gICAgICB0YXJnZXQ6IFwicGFyZW50XCIsXG4gICAgICBldmVudEtleTogXCJwYXJlbnRcIixcbiAgICAgIG11dGF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY3Vyc29yVmFsdWU6IGN1cnNvclZhbHVlLFxuICAgICAgICAgIHBhcmVudFNWRzogcGFyZW50U1ZHXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfV07XG4gIH0sXG4gIG9uVG91Y2hFbmQ6IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzKSB7XG4gICAgdmFyIG9uQ3Vyc29yQ2hhbmdlID0gdGFyZ2V0UHJvcHMub25DdXJzb3JDaGFuZ2U7XG5cbiAgICBpZiAoX2lzRnVuY3Rpb24odGFyZ2V0UHJvcHMub25DdXJzb3JDaGFuZ2UpKSB7XG4gICAgICBvbkN1cnNvckNoYW5nZShudWxsLCB0YXJnZXRQcm9wcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFt7XG4gICAgICB0YXJnZXQ6IFwicGFyZW50XCIsXG4gICAgICBldmVudEtleTogXCJwYXJlbnRcIixcbiAgICAgIG11dGF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY3Vyc29yVmFsdWU6IG51bGxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XTtcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IF9vYmplY3RTcHJlYWQoe30sIEN1cnNvckhlbHBlcnMsIHtcbiAgb25Nb3VzZU1vdmU6IF90aHJvdHRsZShDdXJzb3JIZWxwZXJzLm9uTW91c2VNb3ZlLmJpbmQoQ3Vyc29ySGVscGVycyksIE9OX01PVVNFX01PVkVfVEhST1RUTEVfTVMsIHtcbiAgICBsZWFkaW5nOiB0cnVlLFxuICAgIHRyYWlsaW5nOiBmYWxzZVxuICB9KSxcbiAgb25Nb3VzZUxlYXZlOiBDdXJzb3JIZWxwZXJzLm9uTW91c2VNb3ZlLmJpbmQoQ3Vyc29ySGVscGVycyksXG4gIG9uVG91Y2hFbmQ6IEN1cnNvckhlbHBlcnMub25Ub3VjaEVuZC5iaW5kKEN1cnNvckhlbHBlcnMpXG59KTsiLCJpbXBvcnQgX2lzT2JqZWN0IGZyb20gXCJsb2Rhc2gvaXNPYmplY3RcIjtcbmltcG9ydCBfYXNzaWduIGZyb20gXCJsb2Rhc2gvYXNzaWduXCI7XG5pbXBvcnQgX2RlZmF1bHRzIGZyb20gXCJsb2Rhc2gvZGVmYXVsdHNcIjtcblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFZpY3RvcnlDb250YWluZXIsIFZpY3RvcnlMYWJlbCwgTGluZVNlZ21lbnQsIEhlbHBlcnMgfSBmcm9tIFwidmljdG9yeS1jb3JlXCI7XG5pbXBvcnQgQ3Vyc29ySGVscGVycyBmcm9tIFwiLi9jdXJzb3ItaGVscGVyc1wiO1xuZXhwb3J0IHZhciBjdXJzb3JDb250YWluZXJNaXhpbiA9IGZ1bmN0aW9uIChiYXNlKSB7XG4gIHZhciBfY2xhc3MsIF90ZW1wO1xuXG4gIHJldHVybiBfdGVtcCA9IF9jbGFzcyA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKF9iYXNlKSB7XG4gICAgX2luaGVyaXRzKFZpY3RvcnlDdXJzb3JDb250YWluZXIsIF9iYXNlKTtcblxuICAgIGZ1bmN0aW9uIFZpY3RvcnlDdXJzb3JDb250YWluZXIoKSB7XG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmljdG9yeUN1cnNvckNvbnRhaW5lcik7XG5cbiAgICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoVmljdG9yeUN1cnNvckNvbnRhaW5lci5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFZpY3RvcnlDdXJzb3JDb250YWluZXIpKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoVmljdG9yeUN1cnNvckNvbnRhaW5lciwgW3tcbiAgICAgIGtleTogXCJnZXRDdXJzb3JQb3NpdGlvblwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEN1cnNvclBvc2l0aW9uKHByb3BzKSB7XG4gICAgICAgIHZhciBjdXJzb3JWYWx1ZSA9IHByb3BzLmN1cnNvclZhbHVlLFxuICAgICAgICAgICAgZGVmYXVsdEN1cnNvclZhbHVlID0gcHJvcHMuZGVmYXVsdEN1cnNvclZhbHVlLFxuICAgICAgICAgICAgZG9tYWluID0gcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgY3Vyc29yRGltZW5zaW9uID0gcHJvcHMuY3Vyc29yRGltZW5zaW9uO1xuXG4gICAgICAgIGlmIChjdXJzb3JWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiBjdXJzb3JWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVmYXVsdEN1cnNvclZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eSh7XG4gICAgICAgICAgICB4OiAoZG9tYWluLnhbMF0gKyBkb21haW4ueFsxXSkgLyAyLFxuICAgICAgICAgICAgeTogKGRvbWFpbi55WzBdICsgZG9tYWluLnlbMV0pIC8gMlxuICAgICAgICAgIH0sIGN1cnNvckRpbWVuc2lvbiwgZGVmYXVsdEN1cnNvclZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0Q3Vyc29yVmFsdWU7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImdldEN1cnNvckxhYmVsT2Zmc2V0XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3Vyc29yTGFiZWxPZmZzZXQocHJvcHMpIHtcbiAgICAgICAgdmFyIGN1cnNvckxhYmVsT2Zmc2V0ID0gcHJvcHMuY3Vyc29yTGFiZWxPZmZzZXQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjdXJzb3JMYWJlbE9mZnNldCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBjdXJzb3JMYWJlbE9mZnNldCxcbiAgICAgICAgICAgIHk6IGN1cnNvckxhYmVsT2Zmc2V0XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdXJzb3JMYWJlbE9mZnNldDtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiZ2V0UGFkZGluZ1wiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBhZGRpbmcocHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3BzLnBhZGRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IHByb3BzLmNoaWxkcmVuLmZpbmQoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgIHJldHVybiBfaXNPYmplY3QoYy5wcm9wcykgJiYgYy5wcm9wcy5wYWRkaW5nICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIEhlbHBlcnMuZ2V0UGFkZGluZyhjaGlsZC5wcm9wcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIEhlbHBlcnMuZ2V0UGFkZGluZyhwcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiZ2V0Q3Vyc29yRWxlbWVudHNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJzb3JFbGVtZW50cyhwcm9wcykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1zdGF0ZW1lbnRzXG4gICAgICAgIHZhciBzY2FsZSA9IHByb3BzLnNjYWxlLFxuICAgICAgICAgICAgY3Vyc29yTGFiZWxDb21wb25lbnQgPSBwcm9wcy5jdXJzb3JMYWJlbENvbXBvbmVudCxcbiAgICAgICAgICAgIGN1cnNvckxhYmVsID0gcHJvcHMuY3Vyc29yTGFiZWwsXG4gICAgICAgICAgICBjdXJzb3JDb21wb25lbnQgPSBwcm9wcy5jdXJzb3JDb21wb25lbnQsXG4gICAgICAgICAgICB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgICAgICAgICAgbmFtZSA9IHByb3BzLm5hbWUsXG4gICAgICAgICAgICBob3Jpem9udGFsID0gcHJvcHMuaG9yaXpvbnRhbCxcbiAgICAgICAgICAgIHRoZW1lID0gcHJvcHMudGhlbWU7XG4gICAgICAgIHZhciBjdXJzb3JEaW1lbnNpb24gPSBDdXJzb3JIZWxwZXJzLmdldERpbWVuc2lvbihwcm9wcyk7XG4gICAgICAgIHZhciBjdXJzb3JWYWx1ZSA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24ocHJvcHMpO1xuICAgICAgICB2YXIgY3Vyc29yTGFiZWxPZmZzZXQgPSB0aGlzLmdldEN1cnNvckxhYmVsT2Zmc2V0KHByb3BzKTtcblxuICAgICAgICBpZiAoIWN1cnNvclZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5ld0VsZW1lbnRzID0gW107XG4gICAgICAgIHZhciBwYWRkaW5nID0gdGhpcy5nZXRQYWRkaW5nKHByb3BzKTtcbiAgICAgICAgdmFyIGN1cnNvckNvb3JkaW5hdGVzID0ge1xuICAgICAgICAgIHg6IGhvcml6b250YWwgPyBzY2FsZS55KGN1cnNvclZhbHVlLnkpIDogc2NhbGUueChjdXJzb3JWYWx1ZS54KSxcbiAgICAgICAgICB5OiBob3Jpem9udGFsID8gc2NhbGUueChjdXJzb3JWYWx1ZS54KSA6IHNjYWxlLnkoY3Vyc29yVmFsdWUueSlcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoY3Vyc29yTGFiZWwpIHtcbiAgICAgICAgICB2YXIgbGFiZWxQcm9wcyA9IF9kZWZhdWx0cyh7XG4gICAgICAgICAgICBhY3RpdmU6IHRydWVcbiAgICAgICAgICB9LCBjdXJzb3JMYWJlbENvbXBvbmVudC5wcm9wcywge1xuICAgICAgICAgICAgeDogY3Vyc29yQ29vcmRpbmF0ZXMueCArIGN1cnNvckxhYmVsT2Zmc2V0LngsXG4gICAgICAgICAgICB5OiBjdXJzb3JDb29yZGluYXRlcy55ICsgY3Vyc29yTGFiZWxPZmZzZXQueSxcbiAgICAgICAgICAgIGRhdHVtOiBjdXJzb3JWYWx1ZSxcbiAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIGtleTogXCJcIi5jb25jYXQobmFtZSwgXCItY3Vyc29yLWxhYmVsXCIpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoSGVscGVycy5pc1Rvb2x0aXAoY3Vyc29yTGFiZWxDb21wb25lbnQpKSB7XG4gICAgICAgICAgICB2YXIgdG9vbHRpcFRoZW1lID0gdGhlbWUgJiYgdGhlbWUudG9vbHRpcCB8fCB7fTtcbiAgICAgICAgICAgIGxhYmVsUHJvcHMgPSBfZGVmYXVsdHMoe30sIGxhYmVsUHJvcHMsIHRvb2x0aXBUaGVtZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV3RWxlbWVudHMucHVzaChSZWFjdC5jbG9uZUVsZW1lbnQoY3Vyc29yTGFiZWxDb21wb25lbnQsIF9kZWZhdWx0cyh7fSwgbGFiZWxQcm9wcywge1xuICAgICAgICAgICAgdGV4dDogSGVscGVycy5ldmFsdWF0ZVByb3AoY3Vyc29yTGFiZWwsIGxhYmVsUHJvcHMpXG4gICAgICAgICAgfSkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjdXJzb3JTdHlsZSA9IF9hc3NpZ24oe1xuICAgICAgICAgIHN0cm9rZTogXCJibGFja1wiXG4gICAgICAgIH0sIGN1cnNvckNvbXBvbmVudC5wcm9wcy5zdHlsZSk7XG5cbiAgICAgICAgaWYgKGN1cnNvckRpbWVuc2lvbiA9PT0gXCJ4XCIgfHwgY3Vyc29yRGltZW5zaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBuZXdFbGVtZW50cy5wdXNoKFJlYWN0LmNsb25lRWxlbWVudChjdXJzb3JDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGtleTogXCJcIi5jb25jYXQobmFtZSwgXCIteC1jdXJzb3JcIiksXG4gICAgICAgICAgICB4MTogY3Vyc29yQ29vcmRpbmF0ZXMueCxcbiAgICAgICAgICAgIHgyOiBjdXJzb3JDb29yZGluYXRlcy54LFxuICAgICAgICAgICAgeTE6IHBhZGRpbmcudG9wLFxuICAgICAgICAgICAgeTI6IGhlaWdodCAtIHBhZGRpbmcuYm90dG9tLFxuICAgICAgICAgICAgc3R5bGU6IGN1cnNvclN0eWxlXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnNvckRpbWVuc2lvbiA9PT0gXCJ5XCIgfHwgY3Vyc29yRGltZW5zaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBuZXdFbGVtZW50cy5wdXNoKFJlYWN0LmNsb25lRWxlbWVudChjdXJzb3JDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGtleTogXCJcIi5jb25jYXQobmFtZSwgXCIteS1jdXJzb3JcIiksXG4gICAgICAgICAgICB4MTogcGFkZGluZy5sZWZ0LFxuICAgICAgICAgICAgeDI6IHdpZHRoIC0gcGFkZGluZy5yaWdodCxcbiAgICAgICAgICAgIHkxOiBjdXJzb3JDb29yZGluYXRlcy55LFxuICAgICAgICAgICAgeTI6IGN1cnNvckNvb3JkaW5hdGVzLnksXG4gICAgICAgICAgICBzdHlsZTogY3Vyc29yU3R5bGVcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3RWxlbWVudHM7XG4gICAgICB9IC8vIE92ZXJyaWRlcyBtZXRob2QgaW4gVmljdG9yeUNvbnRhaW5lclxuXG4gICAgfSwge1xuICAgICAga2V5OiBcImdldENoaWxkcmVuXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2hpbGRyZW4ocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIF90b0NvbnN1bWFibGVBcnJheShSZWFjdC5DaGlsZHJlbi50b0FycmF5KHByb3BzLmNoaWxkcmVuKSkuY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSh0aGlzLmdldEN1cnNvckVsZW1lbnRzKHByb3BzKSkpO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBWaWN0b3J5Q3Vyc29yQ29udGFpbmVyO1xuICB9KGJhc2UpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcImRpc3BsYXlOYW1lXCIsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogXCJWaWN0b3J5Q3Vyc29yQ29udGFpbmVyXCJcbiAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwicHJvcFR5cGVzXCIsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogX29iamVjdFNwcmVhZCh7fSwgVmljdG9yeUNvbnRhaW5lci5wcm9wVHlwZXMsIHtcbiAgICAgIGN1cnNvckRpbWVuc2lvbjogUHJvcFR5cGVzLm9uZU9mKFtcInhcIiwgXCJ5XCJdKSxcbiAgICAgIGN1cnNvckxhYmVsOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIGN1cnNvckxhYmVsQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgICAgIGN1cnNvckxhYmVsT2Zmc2V0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICB4OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgICB5OiBQcm9wVHlwZXMubnVtYmVyXG4gICAgICB9KV0pLFxuICAgICAgZGVmYXVsdEN1cnNvclZhbHVlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICB4OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgICB5OiBQcm9wVHlwZXMubnVtYmVyXG4gICAgICB9KV0pLFxuICAgICAgZGlzYWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgICBvbkN1cnNvckNoYW5nZTogUHJvcFR5cGVzLmZ1bmNcbiAgICB9KVxuICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzcywgXCJkZWZhdWx0UHJvcHNcIiwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiBfb2JqZWN0U3ByZWFkKHt9LCBWaWN0b3J5Q29udGFpbmVyLmRlZmF1bHRQcm9wcywge1xuICAgICAgY3Vyc29yTGFiZWxDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUxhYmVsLCBudWxsKSxcbiAgICAgIGN1cnNvckxhYmVsT2Zmc2V0OiB7XG4gICAgICAgIHg6IDUsXG4gICAgICAgIHk6IC0xMFxuICAgICAgfSxcbiAgICAgIGN1cnNvckNvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChMaW5lU2VnbWVudCwgbnVsbClcbiAgICB9KVxuICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzcywgXCJkZWZhdWx0RXZlbnRzXCIsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgdGFyZ2V0OiBcInBhcmVudFwiLFxuICAgICAgICBldmVudEhhbmRsZXJzOiB7XG4gICAgICAgICAgb25Nb3VzZUxlYXZlOiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzLmRpc2FibGUgPyB7fSA6IEN1cnNvckhlbHBlcnMub25Nb3VzZUxlYXZlKGV2dCwgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Ub3VjaENhbmNlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHMuZGlzYWJsZSA/IHt9IDogQ3Vyc29ySGVscGVycy5vbk1vdXNlTW92ZShldnQsIHRhcmdldFByb3BzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uVG91Y2hNb3ZlOiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzLmRpc2FibGUgPyB7fSA6IEN1cnNvckhlbHBlcnMub25Nb3VzZU1vdmUoZXZ0LCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XTtcbiAgICB9XG4gIH0pLCBfdGVtcDtcbn07XG5leHBvcnQgZGVmYXVsdCBjdXJzb3JDb250YWluZXJNaXhpbihWaWN0b3J5Q29udGFpbmVyKTsiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBob2lzdE5vblJlYWN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgeyBWaWN0b3J5Q3Vyc29yQ29udGFpbmVyIH0gZnJvbSAndmljdG9yeS1jdXJzb3ItY29udGFpbmVyJztcbmltcG9ydCB7IENoYXJ0TGFiZWwgfSBmcm9tICcuLi9DaGFydExhYmVsJztcbmltcG9ydCB7IGdldENsYXNzTmFtZSwgZ2V0VGhlbWUgfSBmcm9tICcuLi9DaGFydFV0aWxzJztcbmV4cG9ydCBjb25zdCBDaGFydEN1cnNvckNvbnRhaW5lciA9IChfYSkgPT4ge1xuICAgIHZhciB7IGNsYXNzTmFtZSwgdGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCBcbiAgICAvLyBkZXN0cnVjdHVyZSBsYXN0XG4gICAgdGhlbWUgPSBnZXRUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpLCBjdXJzb3JMYWJlbENvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRMYWJlbCwgbnVsbCkgfSA9IF9hLCAvLyBOb3RlIHRoYXQgVmljdG9yeSBwcm92aWRlcyBpdHMgb3duIGxhYmVsIGNvbXBvbmVudCBoZXJlXG4gICAgcmVzdCA9IF9fcmVzdChfYSwgW1wiY2xhc3NOYW1lXCIsIFwidGhlbWVDb2xvclwiLCBcInRoZW1lVmFyaWFudFwiLCBcInRoZW1lXCIsIFwiY3Vyc29yTGFiZWxDb21wb25lbnRcIl0pO1xuICAgIGNvbnN0IGNoYXJ0Q2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKHsgY2xhc3NOYW1lIH0pO1xuICAgIGNvbnN0IGNoYXJ0Q3Vyc29yTGFiZWxDb21wb25lbnQgPSBSZWFjdC5jbG9uZUVsZW1lbnQoY3Vyc29yTGFiZWxDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oeyB0aGVtZSB9LCBjdXJzb3JMYWJlbENvbXBvbmVudC5wcm9wcykpO1xuICAgIC8vIE5vdGU6IHRoZW1lIGlzIHJlcXVpcmVkIGJ5IHZvcm9ub2lDb250YWluZXJNaXhpblxuICAgIHJldHVybiAoXG4gICAgLy8gTm90ZTogY2xhc3NOYW1lIGlzIHZhbGlkLCBidXQgVmljdG9yeSBpcyBtaXNzaW5nIGEgdHlwZVxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUN1cnNvckNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGNsYXNzTmFtZTogY2hhcnRDbGFzc05hbWUsIGN1cnNvckxhYmVsQ29tcG9uZW50OiBjaGFydEN1cnNvckxhYmVsQ29tcG9uZW50LCB0aGVtZTogdGhlbWUgfSwgcmVzdCkpKTtcbn07XG5DaGFydEN1cnNvckNvbnRhaW5lci5kaXNwbGF5TmFtZSA9ICdDaGFydEN1cnNvckNvbnRhaW5lcic7XG5DaGFydEN1cnNvckNvbnRhaW5lci5kZWZhdWx0UHJvcHMgPSBWaWN0b3J5Q3Vyc29yQ29udGFpbmVyLmRlZmF1bHRQcm9wcztcbi8vIE5vdGU6IFZpY3RvcnlDdXJzb3JDb250YWluZXIuZGVmYXVsdEV2ZW50cyAmIFZpY3RvcnlDb250YWluZXIucm9sZSBtdXN0IGJlIGhvaXN0ZWRcbmhvaXN0Tm9uUmVhY3RTdGF0aWNzKENoYXJ0Q3Vyc29yQ29udGFpbmVyLCBWaWN0b3J5Q3Vyc29yQ29udGFpbmVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJ0Q3Vyc29yQ29udGFpbmVyLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gJy4vQ2hhcnRDdXJzb3JDb250YWluZXInO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IEhlbHBlcnMsIENvbW1vblByb3BzLCBQYXRoIH0gZnJvbSAndmljdG9yeS1jb3JlJztcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2xvZGFzaC9pc1BsYWluT2JqZWN0JztcbmNvbnN0IGdldFZlcnRpY2FsUGF0aCA9IChwcm9wcykgPT4ge1xuICAgIGNvbnN0IHsgcG9pbnRlcldpZHRoLCBjb3JuZXJSYWRpdXMsIG9yaWVudGF0aW9uLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXIgfSA9IHByb3BzO1xuICAgIGNvbnN0IHNpZ24gPSBvcmllbnRhdGlvbiA9PT0gJ2JvdHRvbScgPyAxIDogLTE7XG4gICAgLy8gY29uc3QgeCA9IHByb3BzLnggKyAocHJvcHMuZHggfHwgMCk7XG4gICAgLy8gY29uc3QgeSA9IHByb3BzLnkgKyAocHJvcHMuZHkgfHwgMCk7XG4gICAgY29uc3QgY2VudGVyWCA9IGlzUGxhaW5PYmplY3QoY2VudGVyKSAmJiBjZW50ZXIueDtcbiAgICBjb25zdCBjZW50ZXJZID0gaXNQbGFpbk9iamVjdChjZW50ZXIpICYmIGNlbnRlci55O1xuICAgIGNvbnN0IHBvaW50ZXJFZGdlID0gY2VudGVyWSArIHNpZ24gKiAoaGVpZ2h0IC8gMik7XG4gICAgY29uc3Qgb3Bwb3NpdGVFZGdlID0gY2VudGVyWSAtIHNpZ24gKiAoaGVpZ2h0IC8gMik7XG4gICAgY29uc3QgcmlnaHRFZGdlID0gY2VudGVyWCArIHdpZHRoIC8gMjtcbiAgICBjb25zdCBsZWZ0RWRnZSA9IGNlbnRlclggLSB3aWR0aCAvIDI7XG4gICAgLy8gVGhpcyBoYXMgYmVlbiBvdmVycmlkZGVuIHNvIHRoZSBwb2ludGVyIGRvZXMgbm90IHN0aWNrIHRvIGRhdGEgcG9pbnRzIC0tIHdhbnQgcG9pbnRlckxlbmd0aCB0byB0YWtlIHByZWNlZGVuY2VcbiAgICBjb25zdCB4ID0gY2VudGVyLnggKyAocHJvcHMuZHggfHwgMCk7XG4gICAgY29uc3QgeSA9IG9yaWVudGF0aW9uID09PSAnYm90dG9tJ1xuICAgICAgICA/IHBvaW50ZXJFZGdlICsgcHJvcHMucG9pbnRlckxlbmd0aCArIChwcm9wcy5keSB8fCAwKVxuICAgICAgICA6IHBvaW50ZXJFZGdlIC0gcHJvcHMucG9pbnRlckxlbmd0aCArIChwcm9wcy5keSB8fCAwKTtcbiAgICBjb25zdCBwb2ludGVyTGVuZ3RoID0gc2lnbiAqICh5IC0gcG9pbnRlckVkZ2UpIDwgMCA/IDAgOiBwcm9wcy5wb2ludGVyTGVuZ3RoO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IG9yaWVudGF0aW9uID09PSAnYm90dG9tJyA/ICcwIDAgMCcgOiAnMCAwIDEnO1xuICAgIGNvbnN0IGFyYyA9IGAke2Nvcm5lclJhZGl1c30gJHtjb3JuZXJSYWRpdXN9ICR7ZGlyZWN0aW9ufWA7XG4gICAgcmV0dXJuIGBNICR7Y2VudGVyWCAtIHBvaW50ZXJXaWR0aCAvIDJ9LCAke3BvaW50ZXJFZGdlfVxuICAgIEwgJHtwb2ludGVyTGVuZ3RoID8geCA6IGNlbnRlclggKyBwb2ludGVyV2lkdGggLyAyfSwgJHtwb2ludGVyTGVuZ3RoID8geSA6IHBvaW50ZXJFZGdlfVxuICAgIEwgJHtjZW50ZXJYICsgcG9pbnRlcldpZHRoIC8gMn0sICR7cG9pbnRlckVkZ2V9XG4gICAgTCAke3JpZ2h0RWRnZSAtIGNvcm5lclJhZGl1c30sICR7cG9pbnRlckVkZ2V9XG4gICAgQSAke2FyY30gJHtyaWdodEVkZ2V9LCAke3BvaW50ZXJFZGdlIC0gc2lnbiAqIGNvcm5lclJhZGl1c31cbiAgICBMICR7cmlnaHRFZGdlfSwgJHtvcHBvc2l0ZUVkZ2UgKyBzaWduICogY29ybmVyUmFkaXVzfVxuICAgIEEgJHthcmN9ICR7cmlnaHRFZGdlIC0gY29ybmVyUmFkaXVzfSwgJHtvcHBvc2l0ZUVkZ2V9XG4gICAgTCAke2xlZnRFZGdlICsgY29ybmVyUmFkaXVzfSwgJHtvcHBvc2l0ZUVkZ2V9XG4gICAgQSAke2FyY30gJHtsZWZ0RWRnZX0sICR7b3Bwb3NpdGVFZGdlICsgc2lnbiAqIGNvcm5lclJhZGl1c31cbiAgICBMICR7bGVmdEVkZ2V9LCAke3BvaW50ZXJFZGdlIC0gc2lnbiAqIGNvcm5lclJhZGl1c31cbiAgICBBICR7YXJjfSAke2xlZnRFZGdlICsgY29ybmVyUmFkaXVzfSwgJHtwb2ludGVyRWRnZX1cbiAgICB6YDtcbn07XG5jb25zdCBnZXRIb3Jpem9udGFsUGF0aCA9IChwcm9wcykgPT4ge1xuICAgIGNvbnN0IHsgcG9pbnRlcldpZHRoLCBjb3JuZXJSYWRpdXMsIG9yaWVudGF0aW9uLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXIgfSA9IHByb3BzO1xuICAgIGNvbnN0IHNpZ24gPSBvcmllbnRhdGlvbiA9PT0gJ2xlZnQnID8gMSA6IC0xO1xuICAgIC8vIGNvbnN0IHggPSBwcm9wcy54ICsgKHByb3BzLmR4IHx8IDApO1xuICAgIC8vIGNvbnN0IHkgPSBwcm9wcy55ICsgKHByb3BzLmR5IHx8IDApO1xuICAgIGNvbnN0IGNlbnRlclggPSBpc1BsYWluT2JqZWN0KGNlbnRlcikgJiYgY2VudGVyLng7XG4gICAgY29uc3QgY2VudGVyWSA9IGlzUGxhaW5PYmplY3QoY2VudGVyKSAmJiBjZW50ZXIueTtcbiAgICBjb25zdCBwb2ludGVyRWRnZSA9IGNlbnRlclggLSBzaWduICogKHdpZHRoIC8gMik7XG4gICAgY29uc3Qgb3Bwb3NpdGVFZGdlID0gY2VudGVyWCArIHNpZ24gKiAod2lkdGggLyAyKTtcbiAgICBjb25zdCBib3R0b21FZGdlID0gY2VudGVyWSArIGhlaWdodCAvIDI7XG4gICAgY29uc3QgdG9wRWRnZSA9IGNlbnRlclkgLSBoZWlnaHQgLyAyO1xuICAgIC8vIFRoaXMgaGFzIGJlZW4gb3ZlcnJpZGRlbiBzbyB0aGUgcG9pbnRlciBkb2VzIG5vdCBzdGljayB0byBkYXRhIHBvaW50cyAtLSB3YW50IHBvaW50ZXJMZW5ndGggdG8gdGFrZSBwcmVjZWRlbmNlXG4gICAgY29uc3QgeCA9IG9yaWVudGF0aW9uID09PSAnbGVmdCdcbiAgICAgICAgPyBwb2ludGVyRWRnZSAtIHByb3BzLnBvaW50ZXJMZW5ndGggKyAocHJvcHMuZHggfHwgMClcbiAgICAgICAgOiBwb2ludGVyRWRnZSArIHByb3BzLnBvaW50ZXJMZW5ndGggKyAocHJvcHMuZHggfHwgMCk7XG4gICAgY29uc3QgeSA9IGNlbnRlci55ICsgKHByb3BzLmR5IHx8IDApO1xuICAgIGNvbnN0IHBvaW50ZXJMZW5ndGggPSBzaWduICogKHggLSBwb2ludGVyRWRnZSkgPiAwID8gMCA6IHByb3BzLnBvaW50ZXJMZW5ndGg7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gb3JpZW50YXRpb24gPT09ICdsZWZ0JyA/ICcwIDAgMCcgOiAnMCAwIDEnO1xuICAgIGNvbnN0IGFyYyA9IGAke2Nvcm5lclJhZGl1c30gJHtjb3JuZXJSYWRpdXN9ICR7ZGlyZWN0aW9ufWA7XG4gICAgcmV0dXJuIGBNICR7cG9pbnRlckVkZ2V9LCAke2NlbnRlclkgLSBwb2ludGVyV2lkdGggLyAyfVxuICAgIEwgJHtwb2ludGVyTGVuZ3RoID8geCA6IHBvaW50ZXJFZGdlfSwgJHtwb2ludGVyTGVuZ3RoID8geSA6IGNlbnRlclkgKyBwb2ludGVyV2lkdGggLyAyfVxuICAgIEwgJHtwb2ludGVyRWRnZX0sICR7Y2VudGVyWSArIHBvaW50ZXJXaWR0aCAvIDJ9XG4gICAgTCAke3BvaW50ZXJFZGdlfSwgJHtib3R0b21FZGdlIC0gY29ybmVyUmFkaXVzfVxuICAgIEEgJHthcmN9ICR7cG9pbnRlckVkZ2UgKyBzaWduICogY29ybmVyUmFkaXVzfSwgJHtib3R0b21FZGdlfVxuICAgIEwgJHtvcHBvc2l0ZUVkZ2UgLSBzaWduICogY29ybmVyUmFkaXVzfSwgJHtib3R0b21FZGdlfVxuICAgIEEgJHthcmN9ICR7b3Bwb3NpdGVFZGdlfSwgJHtib3R0b21FZGdlIC0gY29ybmVyUmFkaXVzfVxuICAgIEwgJHtvcHBvc2l0ZUVkZ2V9LCAke3RvcEVkZ2UgKyBjb3JuZXJSYWRpdXN9XG4gICAgQSAke2FyY30gJHtvcHBvc2l0ZUVkZ2UgLSBzaWduICogY29ybmVyUmFkaXVzfSwgJHt0b3BFZGdlfVxuICAgIEwgJHtwb2ludGVyRWRnZSArIHNpZ24gKiBjb3JuZXJSYWRpdXN9LCAke3RvcEVkZ2V9XG4gICAgQSAke2FyY30gJHtwb2ludGVyRWRnZX0sICR7dG9wRWRnZSArIGNvcm5lclJhZGl1c31cbiAgICB6YDtcbn07XG5jb25zdCBnZXRGbHlvdXRQYXRoID0gKHByb3BzKSA9PiB7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSBwcm9wcy5vcmllbnRhdGlvbiB8fCAndG9wJztcbiAgICByZXR1cm4gb3JpZW50YXRpb24gPT09ICdsZWZ0JyB8fCBvcmllbnRhdGlvbiA9PT0gJ3JpZ2h0JyA/IGdldEhvcml6b250YWxQYXRoKHByb3BzKSA6IGdldFZlcnRpY2FsUGF0aChwcm9wcyk7XG59O1xuY29uc3QgZXZhbHVhdGVQcm9wcyA9IChwcm9wcykgPT4ge1xuICAgIC8qKlxuICAgICAqIFBvdGVudGlhbCBldmFsdWF0ZWQgcHJvcHMgYXJlOlxuICAgICAqIGBpZGBcbiAgICAgKiBgc3R5bGVgXG4gICAgICovXG4gICAgY29uc3QgaWQgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy5pZCwgcHJvcHMpO1xuICAgIGNvbnN0IHN0eWxlID0gSGVscGVycy5ldmFsdWF0ZVN0eWxlKHByb3BzLnN0eWxlLCBwcm9wcyk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7IGlkLCBzdHlsZSB9KTtcbn07XG5jb25zdCBDaGFydEN1cnNvckZseW91dCA9IChwcm9wcykgPT4ge1xuICAgIHByb3BzID0gZXZhbHVhdGVQcm9wcyhwcm9wcyk7XG4gICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChwcm9wcy5wYXRoQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzLmV2ZW50cyksIHsgc3R5bGU6IHByb3BzLnN0eWxlLCBkOiBnZXRGbHlvdXRQYXRoKHByb3BzKSwgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsIHNoYXBlUmVuZGVyaW5nOiBwcm9wcy5zaGFwZVJlbmRlcmluZywgcm9sZTogcHJvcHMucm9sZSwgdHJhbnNmb3JtOiBwcm9wcy50cmFuc2Zvcm0sIGNsaXBQYXRoOiBwcm9wcy5jbGlwUGF0aCB9KSk7XG59O1xuQ2hhcnRDdXJzb3JGbHlvdXQucHJvcFR5cGVzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBDb21tb25Qcm9wcy5wcmltaXRpdmVQcm9wcyksIHsgY2VudGVyOiBQcm9wVHlwZXMuc2hhcGUoeyB4OiBQcm9wVHlwZXMubnVtYmVyLCB5OiBQcm9wVHlwZXMubnVtYmVyIH0pLCBjb3JuZXJSYWRpdXM6IFByb3BUeXBlcy5udW1iZXIsIGRhdHVtOiBQcm9wVHlwZXMub2JqZWN0LCBkeDogUHJvcFR5cGVzLm51bWJlciwgZHk6IFByb3BUeXBlcy5udW1iZXIsIGhlaWdodDogUHJvcFR5cGVzLm51bWJlciwgb3JpZW50YXRpb246IFByb3BUeXBlcy5vbmVPZihbJ3RvcCcsICdib3R0b20nLCAnbGVmdCcsICdyaWdodCddKSwgcGF0aENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsIHBvaW50ZXJMZW5ndGg6IFByb3BUeXBlcy5udW1iZXIsIHBvaW50ZXJXaWR0aDogUHJvcFR5cGVzLm51bWJlciwgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIsIHg6IFByb3BUeXBlcy5udW1iZXIsIHk6IFByb3BUeXBlcy5udW1iZXIgfSk7XG5DaGFydEN1cnNvckZseW91dC5kZWZhdWx0UHJvcHMgPSB7XG4gICAgcGF0aENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChQYXRoLCBudWxsKSxcbiAgICByb2xlOiAncHJlc2VudGF0aW9uJyxcbiAgICBzaGFwZVJlbmRlcmluZzogJ2F1dG8nXG59O1xuZXhwb3J0IHsgQ2hhcnRDdXJzb3JGbHlvdXQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJ0Q3Vyc29yRmx5b3V0LmpzLm1hcCIsIi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsYWNrXzUwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmxhY2tfNTAwJztcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tICd2aWN0b3J5LWNvcmUnO1xuaW1wb3J0IHsgQ2hhcnRMZWdlbmRUb29sdGlwU3R5bGVzIH0gZnJvbSAnLi4vQ2hhcnRUaGVtZSc7XG5pbXBvcnQgeyBnZXRMZWdlbmREaW1lbnNpb25zIH0gZnJvbSAnLi9jaGFydC1sZWdlbmQnO1xuLyoqXG4gKiBXaGVuIHVzaW5nIGEgY3Vyc29yIGNvbnRhaW5lciwgdGhlIHRvb2x0aXAgY2FuIGJlIG9mZnNldCBmcm9tIHRoZSBjdXJzb3IgcG9pbnQuIElmIG9mZnNldEN1cnNvckRpbWVuc2lvblggaXMgdHJ1ZSxcbiAqIHRoZSB0b29sdGlwIHdpbGwgYXBwZWFyIHRvIHRoZSByaWdodCB0aGUgdmVydGljYWwgY3Vyc29yLiBJZiBvZmZzZXRDdXJzb3JEaW1lbnNpb25ZIGlzIHRydWUsIHRoZSB0b29sdGlwIHdpbGwgYXBwZWFyXG4gKiBhYm92ZSB0aGUgdmVydGljYWwgY3Vyc29yLlxuICovXG5leHBvcnQgY29uc3QgZ2V0Q3Vyc29yVG9vbHRpcENlbnRlck9mZnNldCA9ICh7IG9mZnNldEN1cnNvckRpbWVuc2lvblggPSBmYWxzZSwgb2Zmc2V0Q3Vyc29yRGltZW5zaW9uWSA9IGZhbHNlLCB0aGVtZSB9KSA9PiB7XG4gICAgY29uc3QgcG9pbnRlckxlbmd0aCA9IHRoZW1lICYmIHRoZW1lLnRvb2x0aXAgPyBIZWxwZXJzLmV2YWx1YXRlUHJvcCh0aGVtZS50b29sdGlwLnBvaW50ZXJMZW5ndGgpIDogMTA7XG4gICAgY29uc3Qgb2Zmc2V0WCA9ICh7IGNlbnRlciwgZmx5b3V0V2lkdGgsIHdpZHRoIH0pID0+IHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZmx5b3V0V2lkdGggLyAyICsgcG9pbnRlckxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHdpZHRoID4gY2VudGVyLnggKyBmbHlvdXRXaWR0aCArIHBvaW50ZXJMZW5ndGggPyBvZmZzZXQgOiAtb2Zmc2V0O1xuICAgIH07XG4gICAgY29uc3Qgb2Zmc2V0WSA9ICh7IGNlbnRlciwgZmx5b3V0SGVpZ2h0LCB3aWR0aCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGZseW91dEhlaWdodCAvIDIgKyBwb2ludGVyTGVuZ3RoO1xuICAgICAgICByZXR1cm4gd2lkdGggPiBjZW50ZXIueSArIGZseW91dEhlaWdodCArIHBvaW50ZXJMZW5ndGggPyAtb2Zmc2V0IDogb2Zmc2V0O1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogb2Zmc2V0Q3Vyc29yRGltZW5zaW9uWCA/IG9mZnNldFggOiAwLFxuICAgICAgICB5OiBvZmZzZXRDdXJzb3JEaW1lbnNpb25ZID8gb2Zmc2V0WSA6IDBcbiAgICB9O1xufTtcbi8qKlxuICogV2hlbiB1c2luZyBhIGN1cnNvciBjb250YWluZXIsIHRoZSB0b29sdGlwIHBvaW50ZXIgb3JpZW50YXRpb24gY2FuIGJlIGFkanVzdGVkIGFzIHRoZSBjdXJzb3IgYXBwcm9hY2hlcyB0aGUgZWRnZSBvZlxuICogdGhlIGNoYXJ0LiBJZiBob3Jpem9udGFsIGlzIHRydWUsIHRoZSB0b29sdGlwIHBvaW50ZXIgd2lsbCBlaXRoZXIgYmUgJ2xlZnQnIG9yICdyaWdodCcuIElmIGhvcml6b250YWwgaXMgdHJ1ZSwgdGhlXG4gKiB0b29sdGlwIHBvaW50ZXIgd2lsbCBlaXRoZXIgYmUgJ3RvcCcgb3IgJ2JvdHRvbScuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDdXJzb3JUb29sdGlwUG9uaXRlck9yaWVudGF0aW9uID0gKHsgaG9yaXpvbnRhbCA9IHRydWUsIHRoZW1lIH0pID0+IHtcbiAgICBjb25zdCBwb2ludGVyTGVuZ3RoID0gdGhlbWUgJiYgdGhlbWUudG9vbHRpcCA/IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHRoZW1lLnRvb2x0aXAucG9pbnRlckxlbmd0aCkgOiAxMDtcbiAgICBjb25zdCBvcmllbnRhdGlvblggPSAoeyBjZW50ZXIsIGZseW91dFdpZHRoLCB3aWR0aCB9KSA9PiB3aWR0aCA+IGNlbnRlci54ICsgZmx5b3V0V2lkdGggKyBwb2ludGVyTGVuZ3RoID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICBjb25zdCBvcmllbnRhdGlvblkgPSAoeyBjZW50ZXIsIGZseW91dEhlaWdodCwgaGVpZ2h0IH0pID0+IGhlaWdodCA+IGNlbnRlci55ICsgZmx5b3V0SGVpZ2h0ICsgcG9pbnRlckxlbmd0aCA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gICAgcmV0dXJuIGhvcml6b250YWwgPyBvcmllbnRhdGlvblggOiBvcmllbnRhdGlvblk7XG59O1xuLy8gUmV0dXJucyBwcm9wcyBhc3NvY2lhdGVkIHdpdGggbGVnZW5kIGRhdGFcbmV4cG9ydCBjb25zdCBnZXRMZWdlbmRUb29sdGlwRGF0YVByb3BzID0gKGRlZmF1bHRQcm9wcykgPT4gKE9iamVjdC5hc3NpZ24oeyBib3JkZXJQYWRkaW5nOiAwLCBndXR0ZXI6IDAsIG9yaWVudGF0aW9uOiAndmVydGljYWwnLCBwYWRkaW5nOiAwLCByb3dHdXR0ZXI6IDAsIHN0eWxlOiB7XG4gICAgICAgIGxhYmVsczoge1xuICAgICAgICAgICAgZmlsbDogQ2hhcnRMZWdlbmRUb29sdGlwU3R5bGVzLmxhYmVsLmZpbGwsXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiAwLjI3NSxcbiAgICAgICAgICAgIHBhZGRpbmc6IDBcbiAgICAgICAgfSxcbiAgICAgICAgdGl0bGU6IHtcbiAgICAgICAgICAgIGZpbGw6IENoYXJ0TGVnZW5kVG9vbHRpcFN0eWxlcy5sYWJlbC5maWxsLFxuICAgICAgICAgICAgcGFkZGluZzogMFxuICAgICAgICB9XG4gICAgfSB9LCBkZWZhdWx0UHJvcHMpKTtcbi8vIFJldHVybnMgdGhlIGxlZ2VuZCBoZWlnaHQgYW5kIHdpZHRoXG5leHBvcnQgY29uc3QgZ2V0TGVnZW5kVG9vbHRpcFNpemUgPSAoeyBsZWdlbmREYXRhLCBsZWdlbmRPcmllbnRhdGlvbiA9ICd2ZXJ0aWNhbCcsIGxlZ2VuZFByb3BzLCB0ZXh0ID0gJycsIHRoZW1lIH0pID0+IHtcbiAgICBjb25zdCB0ZXh0RXZhbHVhdGVkID0gSGVscGVycy5ldmFsdWF0ZVByb3AodGV4dCk7XG4gICAgY29uc3QgX3RleHQgPSBBcnJheS5pc0FycmF5KHRleHRFdmFsdWF0ZWQpID8gdGV4dEV2YWx1YXRlZCA6IFt0ZXh0RXZhbHVhdGVkXTtcbiAgICAvLyBGaW5kIG1heCBjaGFyIGxlbmd0aHNcbiAgICBsZXQgbWF4RGF0YUxlbmd0aCA9IDA7XG4gICAgbGV0IG1heFRleHRMZW5ndGggPSAwO1xuICAgIF90ZXh0Lm1hcCgobmFtZSwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgIGlmIChuYW1lLmxlbmd0aCA+IG1heFRleHRMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBtYXhUZXh0TGVuZ3RoID0gbmFtZS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBoYXNEYXRhID0gbGVnZW5kRGF0YSAmJiBsZWdlbmREYXRhW2luZGV4XSAmJiBsZWdlbmREYXRhW2luZGV4XS5uYW1lO1xuICAgICAgICAgICAgaWYgKGhhc0RhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAobGVnZW5kRGF0YVtpbmRleF0ubmFtZS5sZW5ndGggPiBtYXhEYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heERhdGFMZW5ndGggPSBsZWdlbmREYXRhW2luZGV4XS5uYW1lLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBTZXQgbGVuZ3RoIHRvIGVuc3VyZSBtaW5pbXVtIHNwYWNpbmcgYmV0d2VlbiBsYWJlbCBhbmQgdmFsdWVcbiAgICBsZXQgbWF4TGVuZ3RoID0gbWF4RGF0YUxlbmd0aCArIG1heFRleHRMZW5ndGg7XG4gICAgaWYgKG1heERhdGFMZW5ndGggPCAyMCkge1xuICAgICAgICBtYXhMZW5ndGggKz0gMjtcbiAgICB9XG4gICAgLy8gR2V0IHNwYWNpbmcgdG8gaGVscCBhbGlnbiBsZWdlbmQgbGFiZWxzIGFuZCB0ZXh0IHZhbHVlc1xuICAgIGNvbnN0IHNwYWNlciA9ICd4JztcbiAgICBjb25zdCBnZXRTcGFjaW5nID0gKGxlZ2VuZExhYmVsLCB0ZXh0TGFiZWwpID0+IHtcbiAgICAgICAgbGV0IHNwYWNpbmcgPSAnJztcbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHNwYWNpbmc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVnZW5kTGFiZWxDaGFycyA9IGxlZ2VuZExhYmVsID8gbGVnZW5kTGFiZWwubGVuZ3RoIDogMDtcbiAgICAgICAgY29uc3QgdGV4dExhYmVsQ2hhcnMgPSB0ZXh0TGFiZWwgPyB0ZXh0TGFiZWwubGVuZ3RoIDogMDtcbiAgICAgICAgY29uc3QgbWF4Q2hhcnMgPSBsZWdlbmRMYWJlbENoYXJzICsgdGV4dExhYmVsQ2hhcnM7XG4gICAgICAgIC8vIEFkZCBzcGFjZXJcbiAgICAgICAgd2hpbGUgKHNwYWNpbmcubGVuZ3RoIDwgbWF4TGVuZ3RoIC0gbWF4Q2hhcnMpIHtcbiAgICAgICAgICAgIHNwYWNpbmcgKz0gc3BhY2VyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGFjaW5nO1xuICAgIH07XG4gICAgLy8gRm9ybWF0IGFsbCB0ZXh0IChzaW1pbGFyIHRvIGJlbG93KSB0byBoZWxwIGRldGVybWluZSBvdmVyYWxsIHdpZHRoLlxuICAgIC8vXG4gICAgLy8ge25hbWU6IFwiQ2F0cyAgIG5vIGRhdGFcIn1cbiAgICAvLyB7bmFtZTogXCJEb2dzICAgICAgICAgMVwifVxuICAgIC8vIHtuYW1lOiBcIkJpcmRzICAgICAgICA0XCJ9XG4gICAgLy8ge25hbWU6IFwiTWljZSAgICAgICAgIDNcIn1cbiAgICBjb25zdCBkYXRhID0gX3RleHQubWFwKChsYWJlbCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgaGFzRGF0YSA9IGxlZ2VuZERhdGEgJiYgbGVnZW5kRGF0YVtpbmRleF0gJiYgbGVnZW5kRGF0YVtpbmRleF0ubmFtZTtcbiAgICAgICAgY29uc3Qgc3BhY2luZyA9IGhhc0RhdGEgPyBnZXRTcGFjaW5nKGxlZ2VuZERhdGFbaW5kZXhdLm5hbWUsIGxhYmVsKSA6ICcnO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYCR7aGFzRGF0YSA/IGxlZ2VuZERhdGFbaW5kZXhdLm5hbWUgOiAnJ30ke3NwYWNpbmd9JHtsYWJlbH1gXG4gICAgICAgIH07XG4gICAgfSk7XG4gICAgLy8gUmVwbGFjZSB3aGl0ZXNwYWNlIHdpdGggc3BhY2VyIGNoYXIgZm9yIGNvbnNpc3RlbmN5IGluIHdpZHRoXG4gICAgY29uc3QgZm9ybWF0dGVkRGF0YSA9IGRhdGEubWFwKHZhbCA9PiAoe1xuICAgICAgICBuYW1lOiB2YWwubmFtZS5yZXBsYWNlKC8gL2csIHNwYWNlcilcbiAgICB9KSk7XG4gICAgLy8gVGhpcyBzaG91bGQgaW5jbHVkZSBib3RoIGxlZ2VuZCBkYXRhIGFuZCB0ZXh0XG4gICAgY29uc3Qgd2lkdGhEaW1lbnNpb25zID0gZ2V0TGVnZW5kRGltZW5zaW9ucyh7XG4gICAgICAgIGxlZ2VuZERhdGE6IGZvcm1hdHRlZERhdGEsXG4gICAgICAgIGxlZ2VuZE9yaWVudGF0aW9uLFxuICAgICAgICBsZWdlbmRQcm9wcyxcbiAgICAgICAgdGhlbWVcbiAgICB9KTtcbiAgICAvLyBUaGlzIHNob3VsZCBvbmx5IHVzZSB0ZXh0LiBUaGUgcm93IGd1dHRlciBjaGFuZ2VzIHdoZW4gZGlzcGxheWluZyBhbGwgXCJubyBkYXRhXCIgbWVzc2FnZXNcbiAgICBjb25zdCBoZWlnaHREaW1lbnNpb25zID0gZ2V0TGVnZW5kRGltZW5zaW9ucyh7XG4gICAgICAgIGxlZ2VuZERhdGE6IF90ZXh0Lm1hcCgobmFtZSkgPT4gKHsgbmFtZSB9KSksXG4gICAgICAgIGxlZ2VuZE9yaWVudGF0aW9uLFxuICAgICAgICBsZWdlbmRQcm9wcyxcbiAgICAgICAgdGhlbWVcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBoZWlnaHQ6IGhlaWdodERpbWVuc2lvbnMuaGVpZ2h0LFxuICAgICAgICB3aWR0aDogd2lkdGhEaW1lbnNpb25zLndpZHRoID4gMCA/IHdpZHRoRGltZW5zaW9ucy53aWR0aCA6IDBcbiAgICB9O1xufTtcbi8vIFJldHVybnMgdmlzaWJsZSBsZWdlbmQgZGF0YSwgd2hpbGUgc3luY2luZyBjb2xvciBzY2FsZS4gSWYgdGV4dEFzTGVnZW5kRGF0YSBpcyB0cnVlLCB0aGUgdGV4dCBwcm9wIGlzIHVzZWQgYXNcbi8vIGxlZ2VuZCBkYXRhIHNvIHkgdmFsdWVzIGNhbiBiZSBwYXNzZWQgaW5kaXZpZHVhbGx5IHRvIHRoZSBsYWJlbCBjb21wb25lbnRcbmV4cG9ydCBjb25zdCBnZXRMZWdlbmRUb29sdGlwVmlzaWJsZURhdGEgPSAoeyBhY3RpdmVQb2ludHMsIGNvbG9yU2NhbGUsIGxlZ2VuZERhdGEsIHRleHQsIHRleHRBc0xlZ2VuZERhdGEgPSBmYWxzZSwgdGhlbWUgfSkgPT4ge1xuICAgIGNvbnN0IHRleHRFdmFsdWF0ZWQgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcCh0ZXh0KTtcbiAgICBjb25zdCBfdGV4dCA9IEFycmF5LmlzQXJyYXkodGV4dEV2YWx1YXRlZCkgPyB0ZXh0RXZhbHVhdGVkIDogW3RleHRFdmFsdWF0ZWRdO1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIC8vIFN5bmMgZGF0YSB3aXRoIGludGVyYWN0aXZlIGxlZ2VuZHNcbiAgICBpZiAobGVnZW5kRGF0YSkge1xuICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZWdlbmREYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gbGVnZW5kRGF0YVtpXTtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVBvaW50ID0gYWN0aXZlUG9pbnRzID8gYWN0aXZlUG9pbnRzLmZpbmQoaXRlbSA9PiBpdGVtLmNoaWxkTmFtZSA9PT0gZGF0YS5jaGlsZE5hbWUpIDogJyc7XG4gICAgICAgICAgICBpZiAoIWFjdGl2ZVBvaW50IHx8XG4gICAgICAgICAgICAgICAgKGRhdGEuc3ltYm9sICYmIGRhdGEuc3ltYm9sLnR5cGUgPT09ICdleWVTbGFzaCcgJiYgZGF0YS5zeW1ib2wuZmlsbCA9PT0gY2hhcnRfY29sb3JfYmxhY2tfNTAwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGhpZGRlbiBkYXRhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5kZXgrKyA8IF90ZXh0Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aGVtZUNvbG9yID0gdGhlbWUgJiYgdGhlbWUubGVnZW5kICYmIHRoZW1lLmxlZ2VuZC5jb2xvclNjYWxlXG4gICAgICAgICAgICAgICAgICAgID8gdGhlbWUubGVnZW5kLmNvbG9yU2NhbGVbaSAlIHRoZW1lLmxlZ2VuZC5jb2xvclNjYWxlLmxlbmd0aF1cbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiB0ZXh0QXNMZWdlbmREYXRhID8gX3RleHRbaW5kZXhdIDogZGF0YS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBzeW1ib2w6IE9iamVjdC5hc3NpZ24oeyBmaWxsOiBjb2xvclNjYWxlID8gY29sb3JTY2FsZVtpICUgY29sb3JTY2FsZS5sZW5ndGhdIDogdGhlbWVDb2xvciB9LCBkYXRhLnN5bWJvbClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbi8vIFJldHVybnMgdmlzaWJsZSB0ZXh0IGZvciBpbnRlcmFjdGl2ZSBsZWdlbmRzXG5leHBvcnQgY29uc3QgZ2V0TGVnZW5kVG9vbHRpcFZpc2libGVUZXh0ID0gKHsgYWN0aXZlUG9pbnRzLCBsZWdlbmREYXRhLCB0ZXh0IH0pID0+IHtcbiAgICBjb25zdCB0ZXh0RXZhbHVhdGVkID0gSGVscGVycy5ldmFsdWF0ZVByb3AodGV4dCk7XG4gICAgY29uc3QgX3RleHQgPSBBcnJheS5pc0FycmF5KHRleHRFdmFsdWF0ZWQpID8gdGV4dEV2YWx1YXRlZCA6IFt0ZXh0RXZhbHVhdGVkXTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBpZiAobGVnZW5kRGF0YSkge1xuICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgZm9yIChjb25zdCBkYXRhIG9mIGxlZ2VuZERhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVBvaW50ID0gYWN0aXZlUG9pbnRzID8gYWN0aXZlUG9pbnRzLmZpbmQoaXRlbSA9PiBpdGVtLmNoaWxkTmFtZSA9PT0gZGF0YS5jaGlsZE5hbWUpIDogJyc7XG4gICAgICAgICAgICBpZiAoIWFjdGl2ZVBvaW50IHx8XG4gICAgICAgICAgICAgICAgKGRhdGEuc3ltYm9sICYmIGRhdGEuc3ltYm9sLnR5cGUgPT09ICdleWVTbGFzaCcgJiYgZGF0YS5zeW1ib2wuZmlsbCA9PT0gY2hhcnRfY29sb3JfYmxhY2tfNTAwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGhpZGRlbiBkYXRhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5kZXgrKyA8IF90ZXh0Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChfdGV4dFtpbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2hhcnQtdG9vbHRpcC5qcy5tYXAiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBob2lzdE5vblJlYWN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSAndmljdG9yeS1jb3JlJztcbmltcG9ydCB7IFZpY3RvcnlUb29sdGlwIH0gZnJvbSAndmljdG9yeS10b29sdGlwJztcbmltcG9ydCB7IENoYXJ0TGFiZWwgfSBmcm9tICcuLi9DaGFydExhYmVsJztcbmltcG9ydCB7IENoYXJ0VG9vbHRpcCB9IGZyb20gJy4uL0NoYXJ0VG9vbHRpcCc7XG5pbXBvcnQgeyBnZXRUaGVtZSwgZ2V0Q3Vyc29yVG9vbHRpcENlbnRlck9mZnNldCwgZ2V0Q3Vyc29yVG9vbHRpcFBvbml0ZXJPcmllbnRhdGlvbiB9IGZyb20gJy4uL0NoYXJ0VXRpbHMnO1xuaW1wb3J0IHsgQ2hhcnRDdXJzb3JGbHlvdXQgfSBmcm9tICcuL0NoYXJ0Q3Vyc29yRmx5b3V0JztcbmV4cG9ydCBjb25zdCBDaGFydEN1cnNvclRvb2x0aXAgPSAoX2EpID0+IHtcbiAgICB2YXIgeyBjb25zdHJhaW5Ub1Zpc2libGVBcmVhID0gdHJ1ZSwgZmx5b3V0Q29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydEN1cnNvckZseW91dCwgbnVsbCksIGxhYmVsQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydExhYmVsLCBudWxsKSwgbGFiZWxUZXh0QW5jaG9yID0gJ3N0YXJ0Jywgc2hvd1BvaW50ZXIgPSB0cnVlLCBzdHlsZSwgdGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCBcbiAgICAvLyBkZXN0cnVjdHVyZSBsYXN0XG4gICAgdGhlbWUgPSBnZXRUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpLCBjZW50ZXJPZmZzZXQgPSBnZXRDdXJzb3JUb29sdGlwQ2VudGVyT2Zmc2V0KHsgb2Zmc2V0Q3Vyc29yRGltZW5zaW9uWDogdHJ1ZSwgdGhlbWUgfSksIHBvaW50ZXJPcmllbnRhdGlvbiA9IGdldEN1cnNvclRvb2x0aXBQb25pdGVyT3JpZW50YXRpb24oeyBob3Jpem9udGFsOiB0cnVlLCB0aGVtZSB9KSwgcG9pbnRlckxlbmd0aCA9IHNob3dQb2ludGVyICYmIHRoZW1lICYmIHRoZW1lLnRvb2x0aXAgPyB0aGVtZS50b29sdGlwLnBvaW50ZXJMZW5ndGggOiAwLCBwb2ludGVyV2lkdGggPSB0aGVtZS50b29sdGlwLnBvaW50ZXJXaWR0aCB9ID0gX2EsIHJlc3QgPSBfX3Jlc3QoX2EsIFtcImNvbnN0cmFpblRvVmlzaWJsZUFyZWFcIiwgXCJmbHlvdXRDb21wb25lbnRcIiwgXCJsYWJlbENvbXBvbmVudFwiLCBcImxhYmVsVGV4dEFuY2hvclwiLCBcInNob3dQb2ludGVyXCIsIFwic3R5bGVcIiwgXCJ0aGVtZUNvbG9yXCIsIFwidGhlbWVWYXJpYW50XCIsIFwidGhlbWVcIiwgXCJjZW50ZXJPZmZzZXRcIiwgXCJwb2ludGVyT3JpZW50YXRpb25cIiwgXCJwb2ludGVyTGVuZ3RoXCIsIFwicG9pbnRlcldpZHRoXCJdKTtcbiAgICAvLyBBcHBseSB0ZXh0IGFuY2hvciBzdHlsZVxuICAgIGNvbnN0IGFwcGx5RGVmYXVsdFN0eWxlID0gKGN1c3RvbVN0eWxlKSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdXN0b21TdHlsZSksIHsgdGV4dEFuY2hvcjogbGFiZWxUZXh0QW5jaG9yIC8vIFdvcmthcm91bmQgZm9yIFZpY3RvcnlUb29sdGlwLmdldExhYmVsUHJvcHMgcmVmZXJlbmNpbmcgdGhlIHRoZW1lIHN0eWxlIG9ubHlcbiAgICAgfSkpO1xuICAgIGNvbnN0IG5ld1N0eWxlID0gQXJyYXkuaXNBcnJheShzdHlsZSkgPyBzdHlsZS5tYXAoYXBwbHlEZWZhdWx0U3R5bGUpIDogYXBwbHlEZWZhdWx0U3R5bGUoc3R5bGUpO1xuICAgIGNvbnN0IGdldEZseW91dENvbXBvbmVudCA9ICgpID0+IHtcbiAgICAgICAgbGV0IF9wb2ludGVyTGVuZ3RoID0gSGVscGVycy5ldmFsdWF0ZVByb3AocG9pbnRlckxlbmd0aCk7XG4gICAgICAgIGlmIChzaG93UG9pbnRlciAmJiBfcG9pbnRlckxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgX3BvaW50ZXJMZW5ndGggPSB0aGVtZSAmJiB0aGVtZS50b29sdGlwID8gSGVscGVycy5ldmFsdWF0ZVByb3AodGhlbWUudG9vbHRpcC5wb2ludGVyTGVuZ3RoKSA6IDEwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoZmx5b3V0Q29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgcG9pbnRlckxlbmd0aDogX3BvaW50ZXJMZW5ndGgsIHBvaW50ZXJXaWR0aCB9LCBmbHlvdXRDb21wb25lbnQucHJvcHMpKTtcbiAgICB9O1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBjZW50ZXJPZmZzZXQ6IGNlbnRlck9mZnNldCwgY29uc3RyYWluVG9WaXNpYmxlQXJlYTogY29uc3RyYWluVG9WaXNpYmxlQXJlYSwgZmx5b3V0Q29tcG9uZW50OiBnZXRGbHlvdXRDb21wb25lbnQoKSwgbGFiZWxDb21wb25lbnQ6IGxhYmVsQ29tcG9uZW50LCBsYWJlbFRleHRBbmNob3I6IGxhYmVsVGV4dEFuY2hvciwgcG9pbnRlck9yaWVudGF0aW9uOiBwb2ludGVyT3JpZW50YXRpb24sIHN0eWxlOiBuZXdTdHlsZSwgdGhlbWU6IHRoZW1lIH0sIHJlc3QpKSk7XG59O1xuQ2hhcnRDdXJzb3JUb29sdGlwLmRpc3BsYXlOYW1lID0gJ0NoYXJ0Q3Vyc29yVG9vbHRpcCc7XG4vLyBOb3RlOiBWaWN0b3J5VG9vbHRpcC5kZWZhdWx0RXZlbnRzIG11c3QgYmUgaG9pc3RlZFxuaG9pc3ROb25SZWFjdFN0YXRpY3MoQ2hhcnRDdXJzb3JUb29sdGlwLCBWaWN0b3J5VG9vbHRpcCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFydEN1cnNvclRvb2x0aXAuanMubWFwIiwiZXhwb3J0ICogZnJvbSAnLi9DaGFydEN1cnNvckZseW91dCc7XG5leHBvcnQgKiBmcm9tICcuL0NoYXJ0Q3Vyc29yVG9vbHRpcCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gvaXNGdW5jdGlvblwiO1xuaW1wb3J0IF9kZWZhdWx0cyBmcm9tIFwibG9kYXNoL2RlZmF1bHRzXCI7XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHsgSGVscGVycywgQ29tbW9uUHJvcHMsIFBhdGggfSBmcm9tIFwidmljdG9yeS1jb3JlXCI7XG5pbXBvcnQgKiBhcyBkM1NoYXBlIGZyb20gXCJkMy1zaGFwZVwiO1xuXG52YXIgZ2V0UGF0aCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgc2xpY2UgPSBwcm9wcy5zbGljZSxcbiAgICAgIHJhZGl1cyA9IHByb3BzLnJhZGl1cyxcbiAgICAgIGlubmVyUmFkaXVzID0gcHJvcHMuaW5uZXJSYWRpdXMsXG4gICAgICBjb3JuZXJSYWRpdXMgPSBwcm9wcy5jb3JuZXJSYWRpdXM7XG5cbiAgaWYgKF9pc0Z1bmN0aW9uKHByb3BzLnBhdGhGdW5jdGlvbikpIHtcbiAgICByZXR1cm4gcHJvcHMucGF0aEZ1bmN0aW9uKHNsaWNlKTtcbiAgfVxuXG4gIHZhciBwYWRBbmdsZSA9IEhlbHBlcnMuZGVncmVlc1RvUmFkaWFucyhwcm9wcy5wYWRBbmdsZSk7XG4gIHZhciBzdGFydEFuZ2xlID0gSGVscGVycy5kZWdyZWVzVG9SYWRpYW5zKHByb3BzLnNsaWNlU3RhcnRBbmdsZSk7XG4gIHZhciBlbmRBbmdsZSA9IEhlbHBlcnMuZGVncmVlc1RvUmFkaWFucyhwcm9wcy5zbGljZUVuZEFuZ2xlKTtcbiAgdmFyIHBhdGhGdW5jdGlvbiA9IGQzU2hhcGUuYXJjKCkuY29ybmVyUmFkaXVzKGNvcm5lclJhZGl1cykub3V0ZXJSYWRpdXMocmFkaXVzKS5pbm5lclJhZGl1cyhpbm5lclJhZGl1cyB8fCAwKTtcbiAgcmV0dXJuIHBhdGhGdW5jdGlvbihfZGVmYXVsdHMoe1xuICAgIHN0YXJ0QW5nbGU6IHN0YXJ0QW5nbGUsXG4gICAgZW5kQW5nbGU6IGVuZEFuZ2xlLFxuICAgIHBhZEFuZ2xlOiBwYWRBbmdsZVxuICB9LCBzbGljZSkpO1xufTtcblxudmFyIGV2YWx1YXRlUHJvcHMgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgLyoqXG4gICAqICogUG90ZW50aWFsIGV2YWx1YXRlZCBwcm9wcyBvZiBmb2xsb3dpbmcgbXVzdCBiZSBldmFsdWF0ZWQgaW4gdGhpcyBvcmRlcjpcbiAgICogMSkgYHN0eWxlYFxuICAgKiAyKSBgcmFkaXVzYFxuICAgKiAzKSBgaW5uZXJSYWRpdXNgXG4gICAqXG4gICAqIEV2ZXJ5dGhpbmcgZWxzZSBkb2VzIG5vdCBoYXZlIHRvIGJlIGV2YWx1YXRlZCBpbiBhIHBhcnRpY3VsYXIgb3JkZXI6XG4gICAqIGBhcmlhTGFiZWxgXG4gICAqIGBpZGBcbiAgICogYGNvcm5lclJhZGl1c2BcbiAgICogYHBhZEFuZ2xlYFxuICAgKiBgc2xpY2VTdGFydEFuZ2xlYFxuICAgKiBgc2xpY2VFbmRBbmdsZWBcbiAgICogYHRhYkluZGV4YFxuICAgKi9cbiAgdmFyIHN0eWxlID0gSGVscGVycy5ldmFsdWF0ZVN0eWxlKHByb3BzLnN0eWxlLCBwcm9wcyk7XG4gIHZhciByYWRpdXMgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy5yYWRpdXMsIF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgc3R5bGU6IHN0eWxlXG4gIH0pKTtcbiAgdmFyIGlubmVyUmFkaXVzID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuaW5uZXJSYWRpdXMsIF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHJhZGl1czogcmFkaXVzXG4gIH0pKTtcbiAgdmFyIGFyaWFMYWJlbCA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLmFyaWFMYWJlbCwgcHJvcHMpO1xuICB2YXIgaWQgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy5pZCwgcHJvcHMpO1xuICB2YXIgY29ybmVyUmFkaXVzID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuY29ybmVyUmFkaXVzLCBwcm9wcyk7XG4gIHZhciBwYWRBbmdsZSA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLnBhZEFuZ2xlLCBwcm9wcyk7XG4gIHZhciBzbGljZVN0YXJ0QW5nbGUgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy5zbGljZVN0YXJ0QW5nbGUsIHByb3BzKTtcbiAgdmFyIHNsaWNlRW5kQW5nbGUgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy5zbGljZUVuZEFuZ2xlLCBwcm9wcyk7XG4gIHZhciB0YWJJbmRleCA9IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHByb3BzLnRhYkluZGV4LCBwcm9wcyk7XG4gIHJldHVybiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgIGFyaWFMYWJlbDogYXJpYUxhYmVsLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICByYWRpdXM6IHJhZGl1cyxcbiAgICBpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG4gICAgaWQ6IGlkLFxuICAgIGNvcm5lclJhZGl1czogY29ybmVyUmFkaXVzLFxuICAgIHBhZEFuZ2xlOiBwYWRBbmdsZSxcbiAgICBzbGljZVN0YXJ0QW5nbGU6IHNsaWNlU3RhcnRBbmdsZSxcbiAgICBzbGljZUVuZEFuZ2xlOiBzbGljZUVuZEFuZ2xlLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleFxuICB9KTtcbn07XG5cbnZhciBTbGljZSA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBwcm9wcyA9IGV2YWx1YXRlUHJvcHMocHJvcHMpO1xuICB2YXIgZGVmYXVsdFRyYW5zZm9ybSA9IHByb3BzLm9yaWdpbiA/IFwidHJhbnNsYXRlKFwiLmNvbmNhdChwcm9wcy5vcmlnaW4ueCwgXCIsIFwiKS5jb25jYXQocHJvcHMub3JpZ2luLnksIFwiKVwiKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChwcm9wcy5wYXRoQ29tcG9uZW50LCBfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcy5ldmVudHMsIHtcbiAgICBcImFyaWEtbGFiZWxcIjogcHJvcHMuYXJpYUxhYmVsLFxuICAgIGQ6IGdldFBhdGgocHJvcHMpLFxuICAgIHN0eWxlOiBwcm9wcy5zdHlsZSxcbiAgICB0cmFuc2Zvcm06IHByb3BzLnRyYW5zZm9ybSB8fCBkZWZhdWx0VHJhbnNmb3JtLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIHJvbGU6IHByb3BzLnJvbGUsXG4gICAgc2hhcGVSZW5kZXJpbmc6IHByb3BzLnNoYXBlUmVuZGVyaW5nLFxuICAgIGNsaXBQYXRoOiBwcm9wcy5jbGlwUGF0aCxcbiAgICB0YWJJbmRleDogcHJvcHMudGFiSW5kZXhcbiAgfSkpO1xufTtcblxuU2xpY2UucHJvcFR5cGVzID0gX29iamVjdFNwcmVhZCh7fSwgQ29tbW9uUHJvcHMucHJpbWl0aXZlUHJvcHMsIHtcbiAgY29ybmVyUmFkaXVzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuZnVuY10pLFxuICBkYXR1bTogUHJvcFR5cGVzLm9iamVjdCxcbiAgaW5uZXJSYWRpdXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5mdW5jXSksXG4gIHBhZEFuZ2xlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuZnVuY10pLFxuICBwYXRoQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgcGF0aEZ1bmN0aW9uOiBQcm9wVHlwZXMuZnVuYyxcbiAgcmFkaXVzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuZnVuY10pLFxuICBzbGljZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgc2xpY2VFbmRBbmdsZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgc2xpY2VTdGFydEFuZ2xlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuZnVuY10pXG59KTtcblNsaWNlLmRlZmF1bHRQcm9wcyA9IHtcbiAgcGF0aENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChQYXRoLCBudWxsKSxcbiAgcm9sZTogXCJwcmVzZW50YXRpb25cIixcbiAgc2hhcGVSZW5kZXJpbmc6IFwiYXV0b1wiXG59O1xuZXhwb3J0IGRlZmF1bHQgU2xpY2U7IiwiaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoL2lzTmlsXCI7XG5pbXBvcnQgX2lzUGxhaW5PYmplY3QgZnJvbSBcImxvZGFzaC9pc1BsYWluT2JqZWN0XCI7XG5pbXBvcnQgX2lzRnVuY3Rpb24gZnJvbSBcImxvZGFzaC9pc0Z1bmN0aW9uXCI7XG5pbXBvcnQgX2RlZmF1bHRzIGZyb20gXCJsb2Rhc2gvZGVmYXVsdHNcIjtcbmltcG9ydCBfYXNzaWduIGZyb20gXCJsb2Rhc2gvYXNzaWduXCI7XG5pbXBvcnQgKiBhcyBkM1NoYXBlIGZyb20gXCJkMy1zaGFwZVwiO1xuaW1wb3J0IHsgSGVscGVycywgRGF0YSwgU3R5bGUgfSBmcm9tIFwidmljdG9yeS1jb3JlXCI7XG5cbnZhciBjaGVja0ZvclZhbGlkVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIGlmICh0ZXh0ID09PSB1bmRlZmluZWQgfHwgdGV4dCA9PT0gbnVsbCB8fCBfaXNGdW5jdGlvbih0ZXh0KSkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIlwiLmNvbmNhdCh0ZXh0KTtcbiAgfVxufTtcblxudmFyIGdldENvbG9yID0gZnVuY3Rpb24gKHN0eWxlLCBjb2xvcnMsIGluZGV4KSB7XG4gIGlmIChzdHlsZSAmJiBzdHlsZS5kYXRhICYmIHN0eWxlLmRhdGEuZmlsbCkge1xuICAgIHJldHVybiBzdHlsZS5kYXRhLmZpbGw7XG4gIH1cblxuICByZXR1cm4gY29sb3JzICYmIGNvbG9yc1tpbmRleCAlIGNvbG9ycy5sZW5ndGhdO1xufTtcblxudmFyIGdldFJhZGl1cyA9IGZ1bmN0aW9uIChwcm9wcywgcGFkZGluZykge1xuICBpZiAodHlwZW9mIHByb3BzLnJhZGl1cyA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBwcm9wcy5yYWRpdXM7XG4gIH1cblxuICByZXR1cm4gTWF0aC5taW4ocHJvcHMud2lkdGggLSBwYWRkaW5nLmxlZnQgLSBwYWRkaW5nLnJpZ2h0LCBwcm9wcy5oZWlnaHQgLSBwYWRkaW5nLnRvcCAtIHBhZGRpbmcuYm90dG9tKSAvIDI7XG59O1xuXG52YXIgZ2V0T3JpZ2luID0gZnVuY3Rpb24gKHByb3BzLCBwYWRkaW5nKSB7XG4gIHZhciB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0O1xuICB2YXIgb3JpZ2luID0gX2lzUGxhaW5PYmplY3QocHJvcHMub3JpZ2luKSA/IHByb3BzLm9yaWdpbiA6IHt9O1xuICByZXR1cm4ge1xuICAgIHg6IG9yaWdpbi54ICE9PSB1bmRlZmluZWQgPyBvcmlnaW4ueCA6IChwYWRkaW5nLmxlZnQgLSBwYWRkaW5nLnJpZ2h0ICsgd2lkdGgpIC8gMixcbiAgICB5OiBvcmlnaW4ueSAhPT0gdW5kZWZpbmVkID8gb3JpZ2luLnkgOiAocGFkZGluZy50b3AgLSBwYWRkaW5nLmJvdHRvbSArIGhlaWdodCkgLyAyXG4gIH07XG59O1xuXG52YXIgZ2V0U2xpY2VzID0gZnVuY3Rpb24gKHByb3BzLCBkYXRhKSB7XG4gIHZhciBwYWRBbmdsZSA9IF9pc0Z1bmN0aW9uKHByb3BzLnBhZEFuZ2xlKSA/IDAgOiBwcm9wcy5wYWRBbmdsZTtcbiAgdmFyIGxheW91dEZ1bmN0aW9uID0gZDNTaGFwZS5waWUoKS5zb3J0KG51bGwpLnN0YXJ0QW5nbGUoSGVscGVycy5kZWdyZWVzVG9SYWRpYW5zKHByb3BzLnN0YXJ0QW5nbGUpKS5lbmRBbmdsZShIZWxwZXJzLmRlZ3JlZXNUb1JhZGlhbnMocHJvcHMuZW5kQW5nbGUpKS5wYWRBbmdsZShIZWxwZXJzLmRlZ3JlZXNUb1JhZGlhbnMocGFkQW5nbGUpKS52YWx1ZShmdW5jdGlvbiAoZGF0dW0pIHtcbiAgICByZXR1cm4gZGF0dW0uX3k7XG4gIH0pO1xuICByZXR1cm4gbGF5b3V0RnVuY3Rpb24oZGF0YSk7XG59O1xuXG52YXIgZ2V0Q2FsY3VsYXRlZFZhbHVlcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgY29sb3JTY2FsZSA9IHByb3BzLmNvbG9yU2NhbGU7XG4gIHZhciBzdHlsZU9iamVjdCA9IEhlbHBlcnMuZ2V0RGVmYXVsdFN0eWxlcyhwcm9wcywgXCJwaWVcIik7XG4gIHZhciBzdHlsZSA9IEhlbHBlcnMuZ2V0U3R5bGVzKHByb3BzLnN0eWxlLCBzdHlsZU9iamVjdCwgXCJhdXRvXCIsIFwiMTAwJVwiKTtcbiAgdmFyIGNvbG9ycyA9IEFycmF5LmlzQXJyYXkoY29sb3JTY2FsZSkgPyBjb2xvclNjYWxlIDogU3R5bGUuZ2V0Q29sb3JTY2FsZShjb2xvclNjYWxlKTtcbiAgdmFyIHBhZGRpbmcgPSBIZWxwZXJzLmdldFBhZGRpbmcocHJvcHMpO1xuICB2YXIgZGVmYXVsdFJhZGl1cyA9IGdldFJhZGl1cyhwcm9wcywgcGFkZGluZyk7XG4gIHZhciBvcmlnaW4gPSBnZXRPcmlnaW4ocHJvcHMsIHBhZGRpbmcpO1xuICB2YXIgZGF0YSA9IERhdGEuZ2V0RGF0YShwcm9wcyk7XG4gIHZhciBzbGljZXMgPSBnZXRTbGljZXMocHJvcHMsIGRhdGEpO1xuICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBzdHlsZTogc3R5bGUsXG4gICAgY29sb3JzOiBjb2xvcnMsXG4gICAgcGFkZGluZzogcGFkZGluZyxcbiAgICBkZWZhdWx0UmFkaXVzOiBkZWZhdWx0UmFkaXVzLFxuICAgIGRhdGE6IGRhdGEsXG4gICAgc2xpY2VzOiBzbGljZXMsXG4gICAgb3JpZ2luOiBvcmlnaW5cbiAgfSk7XG59O1xuXG52YXIgZ2V0U2xpY2VTdHlsZSA9IGZ1bmN0aW9uIChpbmRleCwgY2FsY3VsYXRlZFZhbHVlcykge1xuICB2YXIgc3R5bGUgPSBjYWxjdWxhdGVkVmFsdWVzLnN0eWxlLFxuICAgICAgY29sb3JzID0gY2FsY3VsYXRlZFZhbHVlcy5jb2xvcnM7XG4gIHZhciBmaWxsID0gZ2V0Q29sb3Ioc3R5bGUsIGNvbG9ycywgaW5kZXgpO1xuICByZXR1cm4gX2Fzc2lnbih7XG4gICAgZmlsbDogZmlsbFxuICB9LCBzdHlsZS5kYXRhKTtcbn07XG5cbnZhciBnZXRMYWJlbFRleHQgPSBmdW5jdGlvbiAocHJvcHMsIGRhdHVtLCBpbmRleCkge1xuICB2YXIgdGV4dDtcblxuICBpZiAoZGF0dW0ubGFiZWwpIHtcbiAgICB0ZXh0ID0gZGF0dW0ubGFiZWw7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwcm9wcy5sYWJlbHMpKSB7XG4gICAgdGV4dCA9IHByb3BzLmxhYmVsc1tpbmRleF07XG4gIH0gZWxzZSB7XG4gICAgdGV4dCA9IF9pc0Z1bmN0aW9uKHByb3BzLmxhYmVscykgPyBwcm9wcy5sYWJlbHMgOiBkYXR1bS54TmFtZSB8fCBkYXR1bS5feDtcbiAgfVxuXG4gIHJldHVybiBjaGVja0ZvclZhbGlkVGV4dCh0ZXh0KTtcbn07XG5cbnZhciBnZXRMYWJlbEFyYyA9IGZ1bmN0aW9uIChyYWRpdXMsIGxhYmVsUmFkaXVzLCBzdHlsZSkge1xuICB2YXIgcGFkZGluZyA9IHN0eWxlICYmIHN0eWxlLnBhZGRpbmcgfHwgMDtcbiAgdmFyIGFyY1JhZGl1cyA9IGxhYmVsUmFkaXVzIHx8IHJhZGl1cyArIHBhZGRpbmc7XG4gIHJldHVybiBkM1NoYXBlLmFyYygpLm91dGVyUmFkaXVzKGFyY1JhZGl1cykuaW5uZXJSYWRpdXMoYXJjUmFkaXVzKTtcbn07XG5cbnZhciBnZXRMYWJlbFBvc2l0aW9uID0gZnVuY3Rpb24gKGFyYywgc2xpY2UsIHBvc2l0aW9uKSB7XG4gIHZhciBjb25zdHJ1Y3QgPSB7XG4gICAgc3RhcnRBbmdsZTogcG9zaXRpb24gPT09IFwic3RhcnRBbmdsZVwiID8gc2xpY2Uuc3RhcnRBbmdsZSA6IHNsaWNlLmVuZEFuZ2xlLFxuICAgIGVuZEFuZ2xlOiBwb3NpdGlvbiA9PT0gXCJlbmRBbmdsZVwiID8gc2xpY2UuZW5kQW5nbGUgOiBzbGljZS5zdGFydEFuZ2xlXG4gIH07XG5cbiAgdmFyIGNsb25lZEFyYyA9IF9hc3NpZ24oe30sIHNsaWNlLCBjb25zdHJ1Y3QpO1xuXG4gIHJldHVybiBhcmMuY2VudHJvaWQoY2xvbmVkQXJjKTtcbn07XG5cbnZhciBnZXRMYWJlbE9yaWVudGF0aW9uID0gZnVuY3Rpb24gKGRlZ3JlZSwgbGFiZWxQbGFjZW1lbnQpIHtcbiAgaWYgKGxhYmVsUGxhY2VtZW50ID09PSBcInBlcnBlbmRpY3VsYXJcIikge1xuICAgIHJldHVybiBkZWdyZWUgPiA5MCAmJiBkZWdyZWUgPCAyNzAgPyBcImJvdHRvbVwiIDogXCJ0b3BcIjtcbiAgfSBlbHNlIGlmIChsYWJlbFBsYWNlbWVudCA9PT0gXCJwYXJhbGxlbFwiKSB7XG4gICAgcmV0dXJuIGRlZ3JlZSA+PSAwICYmIGRlZ3JlZSA8PSAxODAgPyBcInJpZ2h0XCIgOiBcImxlZnRcIjtcbiAgfVxuXG4gIGlmIChkZWdyZWUgPCA0NSB8fCBkZWdyZWUgPiAzMTUpIHtcbiAgICByZXR1cm4gXCJ0b3BcIjtcbiAgfSBlbHNlIGlmIChkZWdyZWUgPj0gNDUgJiYgZGVncmVlIDwgMTM1KSB7XG4gICAgcmV0dXJuIFwicmlnaHRcIjtcbiAgfSBlbHNlIGlmIChkZWdyZWUgPj0gMTM1ICYmIGRlZ3JlZSA8IDIyNSkge1xuICAgIHJldHVybiBcImJvdHRvbVwiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBcImxlZnRcIjtcbiAgfVxufTtcblxudmFyIGdldFRleHRBbmNob3IgPSBmdW5jdGlvbiAob3JpZW50YXRpb24pIHtcbiAgaWYgKG9yaWVudGF0aW9uID09PSBcInRvcFwiIHx8IG9yaWVudGF0aW9uID09PSBcImJvdHRvbVwiKSB7XG4gICAgcmV0dXJuIFwibWlkZGxlXCI7XG4gIH1cblxuICByZXR1cm4gb3JpZW50YXRpb24gPT09IFwicmlnaHRcIiA/IFwic3RhcnRcIiA6IFwiZW5kXCI7XG59O1xuXG52YXIgZ2V0VmVydGljYWxBbmNob3IgPSBmdW5jdGlvbiAob3JpZW50YXRpb24pIHtcbiAgaWYgKG9yaWVudGF0aW9uID09PSBcImxlZnRcIiB8fCBvcmllbnRhdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgcmV0dXJuIFwibWlkZGxlXCI7XG4gIH1cblxuICByZXR1cm4gb3JpZW50YXRpb24gPT09IFwiYm90dG9tXCIgPyBcInN0YXJ0XCIgOiBcImVuZFwiO1xufTtcblxudmFyIGdldEJhc2VMYWJlbEFuZ2xlID0gZnVuY3Rpb24gKHNsaWNlLCBsYWJlbFBvc2l0aW9uLCBsYWJlbFN0eWxlKSB7XG4gIHZhciBiYXNlQW5nbGUgPSAwO1xuXG4gIGlmIChsYWJlbFBvc2l0aW9uLmFuZ2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICBiYXNlQW5nbGUgPSBsYWJlbFN0eWxlLmFuZ2xlO1xuICB9IGVsc2UgaWYgKGxhYmVsUG9zaXRpb24gPT09IFwiY2VudHJvaWRcIikge1xuICAgIGJhc2VBbmdsZSA9IEhlbHBlcnMucmFkaWFuc1RvRGVncmVlcygoc2xpY2Uuc3RhcnRBbmdsZSArIHNsaWNlLmVuZEFuZ2xlKSAvIDIpO1xuICB9IGVsc2Uge1xuICAgIGJhc2VBbmdsZSA9IGxhYmVsUG9zaXRpb24gPT09IFwic3RhcnRBbmdsZVwiID8gSGVscGVycy5yYWRpYW5zVG9EZWdyZWVzKHNsaWNlLnN0YXJ0QW5nbGUpIDogSGVscGVycy5yYWRpYW5zVG9EZWdyZWVzKHNsaWNlLmVuZEFuZ2xlKTtcbiAgfVxuXG4gIHZhciBwb3NpdGl2ZUFuZ2xlID0gYmFzZUFuZ2xlIDwgMCA/IDM2MCAtIGJhc2VBbmdsZSA6IGJhc2VBbmdsZTtcbiAgcmV0dXJuIHBvc2l0aXZlQW5nbGUgJSAzNjA7XG59O1xuXG52YXIgZ2V0TGFiZWxBbmdsZSA9IGZ1bmN0aW9uIChiYXNlQW5nbGUsIGxhYmVsUGxhY2VtZW50KSB7XG4gIGlmIChsYWJlbFBsYWNlbWVudCA9PT0gXCJ2ZXJ0aWNhbFwiKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZiAobGFiZWxQbGFjZW1lbnQgPT09IFwicGFyYWxsZWxcIikge1xuICAgIHJldHVybiBiYXNlQW5nbGUgPiAxODAgJiYgYmFzZUFuZ2xlIDwgMzYwID8gYmFzZUFuZ2xlICsgOTAgOiBiYXNlQW5nbGUgLSA5MDtcbiAgfVxuXG4gIHJldHVybiBiYXNlQW5nbGUgPiA5MCAmJiBiYXNlQW5nbGUgPCAyNzAgPyBiYXNlQW5nbGUgLSAxODAgOiBiYXNlQW5nbGU7XG59O1xuXG52YXIgZ2V0TGFiZWxQcm9wcyA9IGZ1bmN0aW9uICh0ZXh0LCBkYXRhUHJvcHMsIGNhbGN1bGF0ZWRWYWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gZGF0YVByb3BzLmluZGV4LFxuICAgICAgZGF0dW0gPSBkYXRhUHJvcHMuZGF0dW0sXG4gICAgICBkYXRhID0gZGF0YVByb3BzLmRhdGEsXG4gICAgICBzbGljZSA9IGRhdGFQcm9wcy5zbGljZSxcbiAgICAgIGxhYmVsQ29tcG9uZW50ID0gZGF0YVByb3BzLmxhYmVsQ29tcG9uZW50LFxuICAgICAgdGhlbWUgPSBkYXRhUHJvcHMudGhlbWU7XG4gIHZhciBzdHlsZSA9IGNhbGN1bGF0ZWRWYWx1ZXMuc3R5bGUsXG4gICAgICBkZWZhdWx0UmFkaXVzID0gY2FsY3VsYXRlZFZhbHVlcy5kZWZhdWx0UmFkaXVzLFxuICAgICAgb3JpZ2luID0gY2FsY3VsYXRlZFZhbHVlcy5vcmlnaW4sXG4gICAgICB3aWR0aCA9IGNhbGN1bGF0ZWRWYWx1ZXMud2lkdGgsXG4gICAgICBoZWlnaHQgPSBjYWxjdWxhdGVkVmFsdWVzLmhlaWdodDtcbiAgdmFyIGxhYmVsUmFkaXVzID0gSGVscGVycy5ldmFsdWF0ZVByb3AoY2FsY3VsYXRlZFZhbHVlcy5sYWJlbFJhZGl1cywgX2Fzc2lnbih7XG4gICAgdGV4dDogdGV4dFxuICB9LCBkYXRhUHJvcHMpKTtcbiAgdmFyIGxhYmVsUG9zaXRpb24gPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChjYWxjdWxhdGVkVmFsdWVzLmxhYmVsUG9zaXRpb24sIF9hc3NpZ24oe1xuICAgIHRleHQ6IHRleHRcbiAgfSwgZGF0YVByb3BzKSkgfHwgXCJjZW50cm9pZFwiO1xuICB2YXIgbGFiZWxQbGFjZW1lbnQgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChjYWxjdWxhdGVkVmFsdWVzLmxhYmVsUGxhY2VtZW50LCBfYXNzaWduKHtcbiAgICB0ZXh0OiB0ZXh0XG4gIH0sIGRhdGFQcm9wcykpIHx8IFwidmVydGljYWxcIjtcblxuICB2YXIgbGFiZWxTdHlsZSA9IF9hc3NpZ24oe1xuICAgIHBhZGRpbmc6IDBcbiAgfSwgc3R5bGUubGFiZWxzKTtcblxuICB2YXIgZXZhbHVhdGVkU3R5bGUgPSBIZWxwZXJzLmV2YWx1YXRlU3R5bGUobGFiZWxTdHlsZSwgX2Fzc2lnbih7XG4gICAgbGFiZWxSYWRpdXM6IGxhYmVsUmFkaXVzLFxuICAgIHRleHQ6IHRleHRcbiAgfSwgZGF0YVByb3BzKSk7XG4gIHZhciBsYWJlbEFyYyA9IGdldExhYmVsQXJjKGRlZmF1bHRSYWRpdXMsIGxhYmVsUmFkaXVzLCBldmFsdWF0ZWRTdHlsZSk7XG4gIHZhciBwb3NpdGlvbiA9IGdldExhYmVsUG9zaXRpb24obGFiZWxBcmMsIHNsaWNlLCBsYWJlbFBvc2l0aW9uKTtcbiAgdmFyIGJhc2VBbmdsZSA9IGdldEJhc2VMYWJlbEFuZ2xlKHNsaWNlLCBsYWJlbFBvc2l0aW9uLCBsYWJlbFN0eWxlKTtcbiAgdmFyIGxhYmVsQW5nbGUgPSBnZXRMYWJlbEFuZ2xlKGJhc2VBbmdsZSwgbGFiZWxQbGFjZW1lbnQpO1xuICB2YXIgb3JpZW50YXRpb24gPSBnZXRMYWJlbE9yaWVudGF0aW9uKGJhc2VBbmdsZSwgbGFiZWxQbGFjZW1lbnQpO1xuICB2YXIgdGV4dEFuY2hvciA9IGxhYmVsU3R5bGUudGV4dEFuY2hvciB8fCBnZXRUZXh0QW5jaG9yKG9yaWVudGF0aW9uKTtcbiAgdmFyIHZlcnRpY2FsQW5jaG9yID0gbGFiZWxTdHlsZS52ZXJ0aWNhbEFuY2hvciB8fCBnZXRWZXJ0aWNhbEFuY2hvcihvcmllbnRhdGlvbik7XG4gIHZhciBsYWJlbFByb3BzID0ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICBpbmRleDogaW5kZXgsXG4gICAgZGF0dW06IGRhdHVtLFxuICAgIGRhdGE6IGRhdGEsXG4gICAgc2xpY2U6IHNsaWNlLFxuICAgIG9yaWVudGF0aW9uOiBvcmllbnRhdGlvbixcbiAgICB0ZXh0OiB0ZXh0LFxuICAgIHN0eWxlOiBsYWJlbFN0eWxlLFxuICAgIHg6IE1hdGgucm91bmQocG9zaXRpb25bMF0pICsgb3JpZ2luLngsXG4gICAgeTogTWF0aC5yb3VuZChwb3NpdGlvblsxXSkgKyBvcmlnaW4ueSxcbiAgICB0ZXh0QW5jaG9yOiB0ZXh0QW5jaG9yLFxuICAgIHZlcnRpY2FsQW5jaG9yOiB2ZXJ0aWNhbEFuY2hvcixcbiAgICBhbmdsZTogbGFiZWxBbmdsZVxuICB9O1xuXG4gIGlmICghSGVscGVycy5pc1Rvb2x0aXAobGFiZWxDb21wb25lbnQpKSB7XG4gICAgcmV0dXJuIGxhYmVsUHJvcHM7XG4gIH1cblxuICB2YXIgdG9vbHRpcFRoZW1lID0gdGhlbWUgJiYgdGhlbWUudG9vbHRpcCB8fCB7fTtcbiAgcmV0dXJuIF9kZWZhdWx0cyh7fSwgbGFiZWxQcm9wcywgSGVscGVycy5vbWl0KHRvb2x0aXBUaGVtZSwgW1wic3R5bGVcIl0pKTtcbn07XG5cbmV4cG9ydCB2YXIgZ2V0QmFzZVByb3BzID0gZnVuY3Rpb24gKHByb3BzLCBmYWxsYmFja1Byb3BzKSB7XG4gIHByb3BzID0gSGVscGVycy5tb2RpZnlQcm9wcyhwcm9wcywgZmFsbGJhY2tQcm9wcywgXCJwaWVcIik7XG4gIHZhciBjYWxjdWxhdGVkVmFsdWVzID0gZ2V0Q2FsY3VsYXRlZFZhbHVlcyhwcm9wcyk7XG4gIHZhciBzbGljZXMgPSBjYWxjdWxhdGVkVmFsdWVzLnNsaWNlcyxcbiAgICAgIHN0eWxlID0gY2FsY3VsYXRlZFZhbHVlcy5zdHlsZSxcbiAgICAgIGRhdGEgPSBjYWxjdWxhdGVkVmFsdWVzLmRhdGEsXG4gICAgICBvcmlnaW4gPSBjYWxjdWxhdGVkVmFsdWVzLm9yaWdpbixcbiAgICAgIGRlZmF1bHRSYWRpdXMgPSBjYWxjdWxhdGVkVmFsdWVzLmRlZmF1bHRSYWRpdXMsXG4gICAgICBsYWJlbHMgPSBjYWxjdWxhdGVkVmFsdWVzLmxhYmVscyxcbiAgICAgIGV2ZW50cyA9IGNhbGN1bGF0ZWRWYWx1ZXMuZXZlbnRzLFxuICAgICAgc2hhcmVkRXZlbnRzID0gY2FsY3VsYXRlZFZhbHVlcy5zaGFyZWRFdmVudHMsXG4gICAgICBoZWlnaHQgPSBjYWxjdWxhdGVkVmFsdWVzLmhlaWdodCxcbiAgICAgIHdpZHRoID0gY2FsY3VsYXRlZFZhbHVlcy53aWR0aCxcbiAgICAgIHN0YW5kYWxvbmUgPSBjYWxjdWxhdGVkVmFsdWVzLnN0YW5kYWxvbmUsXG4gICAgICBuYW1lID0gY2FsY3VsYXRlZFZhbHVlcy5uYW1lLFxuICAgICAgaW5uZXJSYWRpdXMgPSBjYWxjdWxhdGVkVmFsdWVzLmlubmVyUmFkaXVzLFxuICAgICAgY29ybmVyUmFkaXVzID0gY2FsY3VsYXRlZFZhbHVlcy5jb3JuZXJSYWRpdXMsXG4gICAgICBwYWRBbmdsZSA9IGNhbGN1bGF0ZWRWYWx1ZXMucGFkQW5nbGUsXG4gICAgICBkaXNhYmxlSW5saW5lU3R5bGVzID0gY2FsY3VsYXRlZFZhbHVlcy5kaXNhYmxlSW5saW5lU3R5bGVzO1xuICB2YXIgcmFkaXVzID0gcHJvcHMucmFkaXVzIHx8IGRlZmF1bHRSYWRpdXM7XG4gIHZhciBpbml0aWFsQ2hpbGRQcm9wcyA9IHtcbiAgICBwYXJlbnQ6IHtcbiAgICAgIHN0YW5kYWxvbmU6IHN0YW5kYWxvbmUsXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIHNsaWNlczogc2xpY2VzLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHN0eWxlOiBzdHlsZS5wYXJlbnRcbiAgICB9XG4gIH07XG4gIHJldHVybiBzbGljZXMucmVkdWNlKGZ1bmN0aW9uIChjaGlsZFByb3BzLCBzbGljZSwgaW5kZXgpIHtcbiAgICB2YXIgZGF0dW0gPSBfZGVmYXVsdHMoe30sIGRhdGFbaW5kZXhdLCB7XG4gICAgICBzdGFydEFuZ2xlOiBIZWxwZXJzLnJhZGlhbnNUb0RlZ3JlZXMoc2xpY2Uuc3RhcnRBbmdsZSksXG4gICAgICBlbmRBbmdsZTogSGVscGVycy5yYWRpYW5zVG9EZWdyZWVzKHNsaWNlLmVuZEFuZ2xlKSxcbiAgICAgIHBhZEFuZ2xlOiBIZWxwZXJzLnJhZGlhbnNUb0RlZ3JlZXMoc2xpY2UucGFkQW5nbGUpXG4gICAgfSk7XG5cbiAgICB2YXIgZXZlbnRLZXkgPSAhX2lzTmlsKGRhdHVtLmV2ZW50S2V5KSA/IGRhdHVtLmV2ZW50S2V5IDogaW5kZXg7XG4gICAgdmFyIGRhdGFQcm9wcyA9IHtcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIHNsaWNlOiBzbGljZSxcbiAgICAgIGRhdHVtOiBkYXR1bSxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBvcmlnaW46IG9yaWdpbixcbiAgICAgIGlubmVyUmFkaXVzOiBpbm5lclJhZGl1cyxcbiAgICAgIHJhZGl1czogcmFkaXVzLFxuICAgICAgY29ybmVyUmFkaXVzOiBjb3JuZXJSYWRpdXMsXG4gICAgICBwYWRBbmdsZTogcGFkQW5nbGUsXG4gICAgICBzdHlsZTogZGlzYWJsZUlubGluZVN0eWxlcyA/IHt9IDogZ2V0U2xpY2VTdHlsZShpbmRleCwgY2FsY3VsYXRlZFZhbHVlcyksXG4gICAgICBkaXNhYmxlSW5saW5lU3R5bGVzOiBkaXNhYmxlSW5saW5lU3R5bGVzXG4gICAgfTtcbiAgICBjaGlsZFByb3BzW2V2ZW50S2V5XSA9IHtcbiAgICAgIGRhdGE6IGRhdGFQcm9wc1xuICAgIH07XG4gICAgdmFyIHRleHQgPSBnZXRMYWJlbFRleHQocHJvcHMsIGRhdHVtLCBpbmRleCk7XG5cbiAgICBpZiAodGV4dCAhPT0gdW5kZWZpbmVkICYmIHRleHQgIT09IG51bGwgfHwgbGFiZWxzICYmIChldmVudHMgfHwgc2hhcmVkRXZlbnRzKSkge1xuICAgICAgdmFyIGV2YWx1YXRlZFRleHQgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcCh0ZXh0LCBkYXRhUHJvcHMpO1xuICAgICAgY2hpbGRQcm9wc1tldmVudEtleV0ubGFiZWxzID0gZ2V0TGFiZWxQcm9wcyhldmFsdWF0ZWRUZXh0LCBfYXNzaWduKHt9LCBwcm9wcywgZGF0YVByb3BzKSwgY2FsY3VsYXRlZFZhbHVlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoaWxkUHJvcHM7XG4gIH0sIGluaXRpYWxDaGlsZFByb3BzKTtcbn07IiwiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG4vKmVzbGludCBuby1tYWdpYy1udW1iZXJzOiBbXCJlcnJvclwiLCB7IFwiaWdub3JlXCI6IFstMSwgMCwgMSwgMl0gfV0qL1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHsgYWRkRXZlbnRzLCBIZWxwZXJzLCBEYXRhLCBQcm9wVHlwZXMgYXMgQ3VzdG9tUHJvcFR5cGVzLCBWaWN0b3J5Q29udGFpbmVyLCBWaWN0b3J5TGFiZWwsIFZpY3RvcnlUaGVtZSB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbmltcG9ydCBTbGljZSBmcm9tIFwiLi9zbGljZVwiO1xuaW1wb3J0IHsgZ2V0QmFzZVByb3BzIH0gZnJvbSBcIi4vaGVscGVyLW1ldGhvZHNcIjtcbnZhciBmYWxsYmFja1Byb3BzID0ge1xuICBlbmRBbmdsZTogMzYwLFxuICBoZWlnaHQ6IDQwMCxcbiAgaW5uZXJSYWRpdXM6IDAsXG4gIGNvcm5lclJhZGl1czogMCxcbiAgcGFkQW5nbGU6IDAsXG4gIHBhZGRpbmc6IDMwLFxuICB3aWR0aDogNDAwLFxuICBzdGFydEFuZ2xlOiAwLFxuICBjb2xvclNjYWxlOiBbXCIjZmZmZmZmXCIsIFwiI2YwZjBmMFwiLCBcIiNkOWQ5ZDlcIiwgXCIjYmRiZGJkXCIsIFwiIzk2OTY5NlwiLCBcIiM3MzczNzNcIiwgXCIjNTI1MjUyXCIsIFwiIzI1MjUyNVwiLCBcIiMwMDAwMDBcIl0sXG4gIGxhYmVsUG9zaXRpb246IFwiY2VudHJvaWRcIlxufTtcblxudmFyIFZpY3RvcnlQaWUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFZpY3RvcnlQaWUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFZpY3RvcnlQaWUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFZpY3RvcnlQaWUpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChWaWN0b3J5UGllLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoVmljdG9yeVBpZSkpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFZpY3RvcnlQaWUsIFt7XG4gICAga2V5OiBcInNob3VsZEFuaW1hdGVcIixcbiAgICAvLyBPdmVycmlkZGVuIGluIHZpY3RvcnktbmF0aXZlXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZEFuaW1hdGUoKSB7XG4gICAgICByZXR1cm4gQm9vbGVhbih0aGlzLnByb3BzLmFuaW1hdGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIGFuaW1hdGlvbldoaXRlbGlzdCA9IFZpY3RvcnlQaWUuYW5pbWF0aW9uV2hpdGVsaXN0LFxuICAgICAgICAgIHJvbGUgPSBWaWN0b3J5UGllLnJvbGU7XG4gICAgICB2YXIgcHJvcHMgPSBIZWxwZXJzLm1vZGlmeVByb3BzKHRoaXMucHJvcHMsIGZhbGxiYWNrUHJvcHMsIHJvbGUpO1xuXG4gICAgICBpZiAodGhpcy5zaG91bGRBbmltYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZUNvbXBvbmVudChwcm9wcywgYW5pbWF0aW9uV2hpdGVsaXN0KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5yZW5kZXJEYXRhKHByb3BzKTtcbiAgICAgIHJldHVybiBwcm9wcy5zdGFuZGFsb25lID8gdGhpcy5yZW5kZXJDb250YWluZXIocHJvcHMuY29udGFpbmVyQ29tcG9uZW50LCBjaGlsZHJlbikgOiBjaGlsZHJlbjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVmljdG9yeVBpZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlQaWUsIFwiYW5pbWF0aW9uV2hpdGVsaXN0XCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFtcImRhdGFcIiwgXCJlbmRBbmdsZVwiLCBcImhlaWdodFwiLCBcImlubmVyUmFkaXVzXCIsIFwiY29ybmVyUmFkaXVzXCIsIFwicGFkQW5nbGVcIiwgXCJwYWRkaW5nXCIsIFwiY29sb3JTY2FsZVwiLCBcInN0YXJ0QW5nbGVcIiwgXCJzdHlsZVwiLCBcIndpZHRoXCJdXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5UGllLCBcImRpc3BsYXlOYW1lXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFwiVmljdG9yeVBpZVwiXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5UGllLCBcInJvbGVcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogXCJwaWVcIlxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeVBpZSwgXCJkZWZhdWx0VHJhbnNpdGlvbnNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZToge1xuICAgIG9uRXhpdDoge1xuICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgIGJlZm9yZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF95OiAwLFxuICAgICAgICAgIGxhYmVsOiBcIiBcIlxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gICAgb25FbnRlcjoge1xuICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgIGJlZm9yZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF95OiAwLFxuICAgICAgICAgIGxhYmVsOiBcIiBcIlxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGFmdGVyOiBmdW5jdGlvbiAoZGF0dW0pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB5XzogZGF0dW0uX3ksXG4gICAgICAgICAgbGFiZWw6IGRhdHVtLmxhYmVsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5UGllLCBcInByb3BUeXBlc1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiB7XG4gICAgYW5pbWF0ZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vYmplY3RdKSxcbiAgICBjb2xvclNjYWxlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSwgUHJvcFR5cGVzLm9uZU9mKFtcImdyYXlzY2FsZVwiLCBcInF1YWxpdGF0aXZlXCIsIFwiaGVhdG1hcFwiLCBcIndhcm1cIiwgXCJjb29sXCIsIFwicmVkXCIsIFwiZ3JlZW5cIiwgXCJibHVlXCJdKV0pLFxuICAgIGNvbnRhaW5lckNvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gICAgY29ybmVyUmFkaXVzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmUsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgZGF0YTogUHJvcFR5cGVzLmFycmF5LFxuICAgIGRhdGFDb21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICAgIGRpc2FibGVJbmxpbmVTdHllczogUHJvcFR5cGVzLmJvb2wsXG4gICAgZW5kQW5nbGU6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgZXZlbnRLZXk6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5mdW5jLCBDdXN0b21Qcm9wVHlwZXMuYWxsT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMuaW50ZWdlciwgQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlXSksIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgICBldmVudHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICB0YXJnZXQ6IFByb3BUeXBlcy5vbmVPZihbXCJkYXRhXCIsIFwibGFiZWxzXCIsIFwicGFyZW50XCJdKSxcbiAgICAgIGV2ZW50S2V5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXksIFByb3BUeXBlcy5mdW5jLCBDdXN0b21Qcm9wVHlwZXMuYWxsT2ZUeXBlKFtDdXN0b21Qcm9wVHlwZXMuaW50ZWdlciwgQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlXSksIFByb3BUeXBlcy5zdHJpbmddKSxcbiAgICAgIGV2ZW50SGFuZGxlcnM6IFByb3BUeXBlcy5vYmplY3RcbiAgICB9KSksXG4gICAgZXh0ZXJuYWxFdmVudE11dGF0aW9uczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIGNhbGxiYWNrOiBQcm9wVHlwZXMuZnVuY3Rpb24sXG4gICAgICBjaGlsZE5hbWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5hcnJheV0pLFxuICAgICAgZXZlbnRLZXk6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheSwgQ3VzdG9tUHJvcFR5cGVzLmFsbE9mVHlwZShbQ3VzdG9tUHJvcFR5cGVzLmludGVnZXIsIEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZV0pLCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gICAgICBtdXRhdGlvbjogUHJvcFR5cGVzLmZ1bmN0aW9uLFxuICAgICAgdGFyZ2V0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuYXJyYXldKVxuICAgIH0pKSxcbiAgICBncm91cENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gICAgaGVpZ2h0OiBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmUsXG4gICAgaW5uZXJSYWRpdXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZSwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBsYWJlbENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gICAgbGFiZWxQbGFjZW1lbnQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5mdW5jLCBQcm9wVHlwZXMub25lT2YoW1wicGFyYWxsZWxcIiwgXCJwZXJwZW5kaWN1bGFyXCIsIFwidmVydGljYWxcIl0pXSksXG4gICAgbGFiZWxQb3NpdGlvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5vbmVPZihbXCJzdGFydEFuZ2xlXCIsIFwiY2VudHJvaWRcIiwgXCJlbmRBbmdsZVwiXSldKSxcbiAgICBsYWJlbFJhZGl1czogUHJvcFR5cGVzLm9uZU9mVHlwZShbQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIGxhYmVsczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5hcnJheV0pLFxuICAgIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgb3JpZ2luOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgeDogQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlLFxuICAgICAgeTogQ3VzdG9tUHJvcFR5cGVzLm5vbk5lZ2F0aXZlXG4gICAgfSksXG4gICAgcGFkQW5nbGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZSwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBwYWRkaW5nOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgdG9wOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgYm90dG9tOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgbGVmdDogUHJvcFR5cGVzLm51bWJlcixcbiAgICAgIHJpZ2h0OiBQcm9wVHlwZXMubnVtYmVyXG4gICAgfSldKSxcbiAgICByYWRpdXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZSwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBzaGFyZWRFdmVudHM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICBldmVudHM6IFByb3BUeXBlcy5hcnJheSxcbiAgICAgIGdldEV2ZW50U3RhdGU6IFByb3BUeXBlcy5mdW5jXG4gICAgfSksXG4gICAgc29ydEtleTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIEN1c3RvbVByb3BUeXBlcy5hbGxPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5pbnRlZ2VyLCBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmVdKSwgUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyldKSxcbiAgICBzb3J0T3JkZXI6IFByb3BUeXBlcy5vbmVPZihbXCJhc2NlbmRpbmdcIiwgXCJkZXNjZW5kaW5nXCJdKSxcbiAgICBzdGFuZGFsb25lOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBzdGFydEFuZ2xlOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHN0eWxlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgcGFyZW50OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgZGF0YTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIGxhYmVsczogUHJvcFR5cGVzLm9iamVjdFxuICAgIH0pLFxuICAgIHRoZW1lOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHdpZHRoOiBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmUsXG4gICAgeDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIEN1c3RvbVByb3BUeXBlcy5hbGxPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5pbnRlZ2VyLCBDdXN0b21Qcm9wVHlwZXMubm9uTmVnYXRpdmVdKSwgUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyldKSxcbiAgICB5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgQ3VzdG9tUHJvcFR5cGVzLmFsbE9mVHlwZShbQ3VzdG9tUHJvcFR5cGVzLmludGVnZXIsIEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZV0pLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKV0pXG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlQaWUsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHtcbiAgICBkYXRhOiBbe1xuICAgICAgeDogXCJBXCIsXG4gICAgICB5OiAxXG4gICAgfSwge1xuICAgICAgeDogXCJCXCIsXG4gICAgICB5OiAyXG4gICAgfSwge1xuICAgICAgeDogXCJDXCIsXG4gICAgICB5OiAzXG4gICAgfSwge1xuICAgICAgeDogXCJEXCIsXG4gICAgICB5OiAxXG4gICAgfSwge1xuICAgICAgeDogXCJFXCIsXG4gICAgICB5OiAyXG4gICAgfV0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBkYXRhQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KFNsaWNlLCBudWxsKSxcbiAgICBsYWJlbENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5TGFiZWwsIG51bGwpLFxuICAgIGNvbnRhaW5lckNvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5Q29udGFpbmVyLCBudWxsKSxcbiAgICBncm91cENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwgbnVsbCksXG4gICAgc29ydE9yZGVyOiBcImFzY2VuZGluZ1wiLFxuICAgIHRoZW1lOiBWaWN0b3J5VGhlbWUuZ3JheXNjYWxlXG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlQaWUsIFwiZ2V0QmFzZVByb3BzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiBnZXRCYXNlUHJvcHMocHJvcHMsIGZhbGxiYWNrUHJvcHMpO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5UGllLCBcImdldERhdGFcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogRGF0YS5nZXREYXRhXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5UGllLCBcImV4cGVjdGVkQ29tcG9uZW50c1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBbXCJkYXRhQ29tcG9uZW50XCIsIFwibGFiZWxDb21wb25lbnRcIiwgXCJncm91cENvbXBvbmVudFwiLCBcImNvbnRhaW5lckNvbXBvbmVudFwiXVxufSk7XG5leHBvcnQgZGVmYXVsdCBhZGRFdmVudHMoVmljdG9yeVBpZSk7IiwiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gJ3ZpY3RvcnktY29yZSc7XG5pbXBvcnQgeyBWaWN0b3J5UGllIH0gZnJvbSAndmljdG9yeS1waWUnO1xuaW1wb3J0IHsgQ2hhcnRDb250YWluZXIgfSBmcm9tICcuLi9DaGFydENvbnRhaW5lcic7XG5pbXBvcnQgeyBDaGFydExlZ2VuZCB9IGZyb20gJy4uL0NoYXJ0TGVnZW5kJztcbmltcG9ydCB7IENoYXJ0Q29tbW9uU3R5bGVzIH0gZnJvbSAnLi4vQ2hhcnRUaGVtZSc7XG5pbXBvcnQgeyBDaGFydFRvb2x0aXAgfSBmcm9tICcuLi9DaGFydFRvb2x0aXAnO1xuaW1wb3J0IHsgZ2V0Q29tcHV0ZWRMZWdlbmQsIGdldFBhZGRpbmdGb3JTaWRlLCBnZXRUaGVtZSB9IGZyb20gJy4uL0NoYXJ0VXRpbHMnO1xuZXhwb3J0IHZhciBDaGFydFBpZUxhYmVsUG9zaXRpb247XG4oZnVuY3Rpb24gKENoYXJ0UGllTGFiZWxQb3NpdGlvbikge1xuICAgIENoYXJ0UGllTGFiZWxQb3NpdGlvbltcImNlbnRyb2lkXCJdID0gXCJjZW50cm9pZFwiO1xuICAgIENoYXJ0UGllTGFiZWxQb3NpdGlvbltcImVuZEFuZ2xlXCJdID0gXCJlbmRBbmdsZVwiO1xuICAgIENoYXJ0UGllTGFiZWxQb3NpdGlvbltcInN0YXJ0QW5nbGVcIl0gPSBcInN0YXJ0QW5nbGVcIjtcbn0pKENoYXJ0UGllTGFiZWxQb3NpdGlvbiB8fCAoQ2hhcnRQaWVMYWJlbFBvc2l0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhcnRQaWVMZWdlbmRQb3NpdGlvbjtcbihmdW5jdGlvbiAoQ2hhcnRQaWVMZWdlbmRQb3NpdGlvbikge1xuICAgIENoYXJ0UGllTGVnZW5kUG9zaXRpb25bXCJib3R0b21cIl0gPSBcImJvdHRvbVwiO1xuICAgIENoYXJ0UGllTGVnZW5kUG9zaXRpb25bXCJyaWdodFwiXSA9IFwicmlnaHRcIjtcbn0pKENoYXJ0UGllTGVnZW5kUG9zaXRpb24gfHwgKENoYXJ0UGllTGVnZW5kUG9zaXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFydFBpZVNvcnRPcmRlcjtcbihmdW5jdGlvbiAoQ2hhcnRQaWVTb3J0T3JkZXIpIHtcbiAgICBDaGFydFBpZVNvcnRPcmRlcltcImFzY2VuZGluZ1wiXSA9IFwiYXNjZW5kaW5nXCI7XG4gICAgQ2hhcnRQaWVTb3J0T3JkZXJbXCJkZXNjZW5kaW5nXCJdID0gXCJkZXNjZW5kaW5nXCI7XG59KShDaGFydFBpZVNvcnRPcmRlciB8fCAoQ2hhcnRQaWVTb3J0T3JkZXIgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IENoYXJ0UGllID0gKF9hKSA9PiB7XG4gICAgdmFyIHsgYWxsb3dUb29sdGlwID0gdHJ1ZSwgYXJpYURlc2MsIGFyaWFUaXRsZSwgY29uc3RyYWluVG9WaXNpYmxlQXJlYSA9IGZhbHNlLCBjb250YWluZXJDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0Q29udGFpbmVyLCBudWxsKSwgbGFiZWxzLCBsZWdlbmRBbGxvd1dyYXAgPSBmYWxzZSwgbGVnZW5kQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydExlZ2VuZCwgbnVsbCksIGxlZ2VuZERhdGEsIGxlZ2VuZFBvc2l0aW9uID0gQ2hhcnRDb21tb25TdHlsZXMubGVnZW5kLnBvc2l0aW9uLCBwYWRkaW5nLCByYWRpdXMsIHN0YW5kYWxvbmUgPSB0cnVlLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIFxuICAgIC8vIGRlc3RydWN0dXJlIGxhc3RcbiAgICB0aGVtZSA9IGdldFRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCksIGxhYmVsQ29tcG9uZW50ID0gYWxsb3dUb29sdGlwID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRUb29sdGlwLCB7IGNvbnN0cmFpblRvVmlzaWJsZUFyZWE6IGNvbnN0cmFpblRvVmlzaWJsZUFyZWEsIHRoZW1lOiB0aGVtZSB9KSkgOiAodW5kZWZpbmVkKSwgbGVnZW5kT3JpZW50YXRpb24gPSB0aGVtZS5sZWdlbmQub3JpZW50YXRpb24sIGhlaWdodCA9IHRoZW1lLnBpZS5oZWlnaHQsIHdpZHRoID0gdGhlbWUucGllLndpZHRoIH0gPSBfYSwgcmVzdCA9IF9fcmVzdChfYSwgW1wiYWxsb3dUb29sdGlwXCIsIFwiYXJpYURlc2NcIiwgXCJhcmlhVGl0bGVcIiwgXCJjb25zdHJhaW5Ub1Zpc2libGVBcmVhXCIsIFwiY29udGFpbmVyQ29tcG9uZW50XCIsIFwibGFiZWxzXCIsIFwibGVnZW5kQWxsb3dXcmFwXCIsIFwibGVnZW5kQ29tcG9uZW50XCIsIFwibGVnZW5kRGF0YVwiLCBcImxlZ2VuZFBvc2l0aW9uXCIsIFwicGFkZGluZ1wiLCBcInJhZGl1c1wiLCBcInN0YW5kYWxvbmVcIiwgXCJ0aGVtZUNvbG9yXCIsIFwidGhlbWVWYXJpYW50XCIsIFwidGhlbWVcIiwgXCJsYWJlbENvbXBvbmVudFwiLCBcImxlZ2VuZE9yaWVudGF0aW9uXCIsIFwiaGVpZ2h0XCIsIFwid2lkdGhcIl0pO1xuICAgIGNvbnN0IGRlZmF1bHRQYWRkaW5nID0ge1xuICAgICAgICBib3R0b206IGdldFBhZGRpbmdGb3JTaWRlKCdib3R0b20nLCBwYWRkaW5nLCB0aGVtZS5waWUucGFkZGluZyksXG4gICAgICAgIGxlZnQ6IGdldFBhZGRpbmdGb3JTaWRlKCdsZWZ0JywgcGFkZGluZywgdGhlbWUucGllLnBhZGRpbmcpLFxuICAgICAgICByaWdodDogZ2V0UGFkZGluZ0ZvclNpZGUoJ3JpZ2h0JywgcGFkZGluZywgdGhlbWUucGllLnBhZGRpbmcpLFxuICAgICAgICB0b3A6IGdldFBhZGRpbmdGb3JTaWRlKCd0b3AnLCBwYWRkaW5nLCB0aGVtZS5waWUucGFkZGluZylcbiAgICB9O1xuICAgIC8vIEVuc3VyZSBub24tbmVnYXRpdmUgdmFsdWUgaXMgcmV0dXJuZWRcbiAgICBjb25zdCBnZXREZWZhdWx0UmFkaXVzID0gKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBIZWxwZXJzLmdldFJhZGl1cyh7XG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgIHBhZGRpbmc6IGRlZmF1bHRQYWRkaW5nXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID4gLTEgPyByZXN1bHQgOiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBjb25zdCBjaGFydFJhZGl1cyA9IHJhZGl1cyA/IHJhZGl1cyA6IGdldERlZmF1bHRSYWRpdXMoKTtcbiAgICBjb25zdCBjaGFydCA9IChSZWFjdC5jcmVhdGVFbGVtZW50KFZpY3RvcnlQaWUsIE9iamVjdC5hc3NpZ24oeyBoZWlnaHQ6IGhlaWdodCwga2V5OiBcInBmLWNoYXJ0LXBpZVwiLCBsYWJlbHM6IGxhYmVscywgbGFiZWxDb21wb25lbnQ6IGxhYmVsQ29tcG9uZW50LCBwYWRkaW5nOiBwYWRkaW5nLCByYWRpdXM6IGNoYXJ0UmFkaXVzLCBzdGFuZGFsb25lOiBmYWxzZSwgdGhlbWU6IHRoZW1lLCB3aWR0aDogd2lkdGggfSwgcmVzdCkpKTtcbiAgICBjb25zdCBsZWdlbmQgPSBSZWFjdC5jbG9uZUVsZW1lbnQobGVnZW5kQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgZGF0YTogbGVnZW5kRGF0YSwga2V5OiAncGYtY2hhcnQtcGllLWxlZ2VuZCcsIG9yaWVudGF0aW9uOiBsZWdlbmRPcmllbnRhdGlvbiwgdGhlbWUgfSwgbGVnZW5kQ29tcG9uZW50LnByb3BzKSk7XG4gICAgLy8gUmV0dXJucyBhIGNvbXB1dGVkIGxlZ2VuZFxuICAgIGNvbnN0IGdldExlZ2VuZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFsZWdlbmQucHJvcHMuZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldENvbXB1dGVkTGVnZW5kKHtcbiAgICAgICAgICAgIGFsbG93V3JhcDogbGVnZW5kQWxsb3dXcmFwLFxuICAgICAgICAgICAgY2hhcnRUeXBlOiAncGllJyxcbiAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgIGxlZ2VuZENvbXBvbmVudDogbGVnZW5kLFxuICAgICAgICAgICAgcGFkZGluZzogZGVmYXVsdFBhZGRpbmcsXG4gICAgICAgICAgICBwb3NpdGlvbjogbGVnZW5kUG9zaXRpb24sXG4gICAgICAgICAgICB0aGVtZSxcbiAgICAgICAgICAgIHdpZHRoXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gQ2xvbmUgc28gdXNlcnMgY2FuIG92ZXJyaWRlIGNvbnRhaW5lciBwcm9wc1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IFJlYWN0LmNsb25lRWxlbWVudChjb250YWluZXJDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oeyBkZXNjOiBhcmlhRGVzYywgaGVpZ2h0LCB0aXRsZTogYXJpYVRpdGxlLCB3aWR0aCxcbiAgICAgICAgdGhlbWUgfSwgY29udGFpbmVyQ29tcG9uZW50LnByb3BzKSwgW2NoYXJ0LCBnZXRMZWdlbmQoKV0pO1xuICAgIHJldHVybiBzdGFuZGFsb25lID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNvbnRhaW5lcikpIDogKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgIGNoYXJ0LFxuICAgICAgICBnZXRMZWdlbmQoKSkpO1xufTtcbkNoYXJ0UGllLmRpc3BsYXlOYW1lID0gJ0NoYXJ0UGllJztcbi8vIE5vdGU6IFZpY3RvcnlQaWUucm9sZSBtdXN0IGJlIGhvaXN0ZWRcbmhvaXN0Tm9uUmVhY3RTdGF0aWNzKENoYXJ0UGllLCBWaWN0b3J5UGllKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJ0UGllLmpzLm1hcCIsImltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGhvaXN0Tm9uUmVhY3RTdGF0aWNzIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJztcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tICd2aWN0b3J5LWNvcmUnO1xuaW1wb3J0IHsgVmljdG9yeVBpZSB9IGZyb20gJ3ZpY3RvcnktcGllJztcbmltcG9ydCB7IGdldERvbnV0VGhlbWUgfSBmcm9tICcuLi9DaGFydFV0aWxzL2NoYXJ0LXRoZW1lJztcbmltcG9ydCB7IENoYXJ0Q29udGFpbmVyIH0gZnJvbSAnLi4vQ2hhcnRDb250YWluZXInO1xuaW1wb3J0IHsgQ2hhcnRMYWJlbCB9IGZyb20gJy4uL0NoYXJ0TGFiZWwnO1xuaW1wb3J0IHsgQ2hhcnRQaWUgfSBmcm9tICcuLi9DaGFydFBpZSc7XG5pbXBvcnQgeyBDaGFydENvbW1vblN0eWxlcywgQ2hhcnREb251dFN0eWxlcyB9IGZyb20gJy4uL0NoYXJ0VGhlbWUnO1xuaW1wb3J0IHsgZ2V0UGllTGFiZWxYLCBnZXRQaWVMYWJlbFksIGdldFBhZGRpbmdGb3JTaWRlIH0gZnJvbSAnLi4vQ2hhcnRVdGlscyc7XG5leHBvcnQgdmFyIENoYXJ0RG9udXRMYWJlbFBvc2l0aW9uO1xuKGZ1bmN0aW9uIChDaGFydERvbnV0TGFiZWxQb3NpdGlvbikge1xuICAgIENoYXJ0RG9udXRMYWJlbFBvc2l0aW9uW1wiY2VudHJvaWRcIl0gPSBcImNlbnRyb2lkXCI7XG4gICAgQ2hhcnREb251dExhYmVsUG9zaXRpb25bXCJlbmRBbmdsZVwiXSA9IFwiZW5kQW5nbGVcIjtcbiAgICBDaGFydERvbnV0TGFiZWxQb3NpdGlvbltcInN0YXJ0QW5nbGVcIl0gPSBcInN0YXJ0QW5nbGVcIjtcbn0pKENoYXJ0RG9udXRMYWJlbFBvc2l0aW9uIHx8IChDaGFydERvbnV0TGFiZWxQb3NpdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIENoYXJ0RG9udXRTb3J0T3JkZXI7XG4oZnVuY3Rpb24gKENoYXJ0RG9udXRTb3J0T3JkZXIpIHtcbiAgICBDaGFydERvbnV0U29ydE9yZGVyW1wiYXNjZW5kaW5nXCJdID0gXCJhc2NlbmRpbmdcIjtcbiAgICBDaGFydERvbnV0U29ydE9yZGVyW1wiZGVzY2VuZGluZ1wiXSA9IFwiZGVzY2VuZGluZ1wiO1xufSkoQ2hhcnREb251dFNvcnRPcmRlciB8fCAoQ2hhcnREb251dFNvcnRPcmRlciA9IHt9KSk7XG5leHBvcnQgdmFyIENoYXJ0RG9udXRTdWJUaXRsZVBvc2l0aW9uO1xuKGZ1bmN0aW9uIChDaGFydERvbnV0U3ViVGl0bGVQb3NpdGlvbikge1xuICAgIENoYXJ0RG9udXRTdWJUaXRsZVBvc2l0aW9uW1wiYm90dG9tXCJdID0gXCJib3R0b21cIjtcbiAgICBDaGFydERvbnV0U3ViVGl0bGVQb3NpdGlvbltcImNlbnRlclwiXSA9IFwiY2VudGVyXCI7XG4gICAgQ2hhcnREb251dFN1YlRpdGxlUG9zaXRpb25bXCJyaWdodFwiXSA9IFwicmlnaHRcIjtcbn0pKENoYXJ0RG9udXRTdWJUaXRsZVBvc2l0aW9uIHx8IChDaGFydERvbnV0U3ViVGl0bGVQb3NpdGlvbiA9IHt9KSk7XG5leHBvcnQgY29uc3QgQ2hhcnREb251dCA9IChfYSkgPT4ge1xuICAgIHZhciB7IGFsbG93VG9vbHRpcCA9IHRydWUsIGFyaWFEZXNjLCBhcmlhVGl0bGUsIGNhcEhlaWdodCA9IDEuMSwgY29udGFpbmVyQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydENvbnRhaW5lciwgbnVsbCksIGlubmVyUmFkaXVzLCBsZWdlbmRBbGxvd1dyYXAsIGxlZ2VuZFBvc2l0aW9uID0gQ2hhcnRDb21tb25TdHlsZXMubGVnZW5kLnBvc2l0aW9uLCBwYWRBbmdsZSwgcGFkZGluZywgcmFkaXVzLCBzdGFuZGFsb25lID0gdHJ1ZSwgc3ViVGl0bGUsIHN1YlRpdGxlQ29tcG9uZW50LCBzdWJUaXRsZVBvc2l0aW9uID0gQ2hhcnREb251dFN0eWxlcy5sYWJlbC5zdWJUaXRsZVBvc2l0aW9uLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIHRpdGxlLCB0aXRsZUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRMYWJlbCwgbnVsbCksIFxuICAgIC8vIGRlc3RydWN0dXJlIGxhc3RcbiAgICB0aGVtZSA9IGdldERvbnV0VGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSwgaGVpZ2h0ID0gdGhlbWUucGllLmhlaWdodCwgd2lkdGggPSB0aGVtZS5waWUud2lkdGggfSA9IF9hLCByZXN0ID0gX19yZXN0KF9hLCBbXCJhbGxvd1Rvb2x0aXBcIiwgXCJhcmlhRGVzY1wiLCBcImFyaWFUaXRsZVwiLCBcImNhcEhlaWdodFwiLCBcImNvbnRhaW5lckNvbXBvbmVudFwiLCBcImlubmVyUmFkaXVzXCIsIFwibGVnZW5kQWxsb3dXcmFwXCIsIFwibGVnZW5kUG9zaXRpb25cIiwgXCJwYWRBbmdsZVwiLCBcInBhZGRpbmdcIiwgXCJyYWRpdXNcIiwgXCJzdGFuZGFsb25lXCIsIFwic3ViVGl0bGVcIiwgXCJzdWJUaXRsZUNvbXBvbmVudFwiLCBcInN1YlRpdGxlUG9zaXRpb25cIiwgXCJ0aGVtZUNvbG9yXCIsIFwidGhlbWVWYXJpYW50XCIsIFwidGl0bGVcIiwgXCJ0aXRsZUNvbXBvbmVudFwiLCBcInRoZW1lXCIsIFwiaGVpZ2h0XCIsIFwid2lkdGhcIl0pO1xuICAgIGNvbnN0IGRlZmF1bHRQYWRkaW5nID0ge1xuICAgICAgICBib3R0b206IGdldFBhZGRpbmdGb3JTaWRlKCdib3R0b20nLCBwYWRkaW5nLCB0aGVtZS5waWUucGFkZGluZyksXG4gICAgICAgIGxlZnQ6IGdldFBhZGRpbmdGb3JTaWRlKCdsZWZ0JywgcGFkZGluZywgdGhlbWUucGllLnBhZGRpbmcpLFxuICAgICAgICByaWdodDogZ2V0UGFkZGluZ0ZvclNpZGUoJ3JpZ2h0JywgcGFkZGluZywgdGhlbWUucGllLnBhZGRpbmcpLFxuICAgICAgICB0b3A6IGdldFBhZGRpbmdGb3JTaWRlKCd0b3AnLCBwYWRkaW5nLCB0aGVtZS5waWUucGFkZGluZylcbiAgICB9O1xuICAgIGNvbnN0IGNoYXJ0UmFkaXVzID0gcmFkaXVzXG4gICAgICAgID8gcmFkaXVzXG4gICAgICAgIDogSGVscGVycy5nZXRSYWRpdXMoe1xuICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBwYWRkaW5nOiBkZWZhdWx0UGFkZGluZ1xuICAgICAgICB9KTtcbiAgICBjb25zdCBjaGFydElubmVyUmFkaXVzID0gaW5uZXJSYWRpdXMgPyBpbm5lclJhZGl1cyA6IGNoYXJ0UmFkaXVzIC0gOTsgLy8gVG9kbzogQWRkIHBmLWNvcmUgdmFyaWFibGVcbiAgICBjb25zdCBjZW50ZXJTdWJUaXRsZSA9IHN1YlRpdGxlICYmIHN1YlRpdGxlUG9zaXRpb24gPT09IENoYXJ0RG9udXRTdWJUaXRsZVBvc2l0aW9uLmNlbnRlcjtcbiAgICAvLyBSZXR1cm5zIHRpdGxlIGFuZCBzdWJ0aXRsZVxuICAgIGNvbnN0IGdldEFsbFRpdGxlcyA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFzdWJUaXRsZUNvbXBvbmVudCAmJiBjZW50ZXJTdWJUaXRsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGdldFRpdGxlKHtcbiAgICAgICAgICAgICAgICBzdHlsZXM6IFtDaGFydERvbnV0U3R5bGVzLmxhYmVsLnRpdGxlLCBDaGFydERvbnV0U3R5bGVzLmxhYmVsLnN1YlRpdGxlXSxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IFt0aXRsZSwgc3ViVGl0bGVdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIHsga2V5OiBcInBmLWNoYXJ0LWRvbnV0LXRpdGxlc1wiIH0sXG4gICAgICAgICAgICBnZXRUaXRsZSh7IHRpdGxlczogdGl0bGUsIGR5OiBjZW50ZXJTdWJUaXRsZSA/IC04IDogMCB9KSxcbiAgICAgICAgICAgIGdldFN1YlRpdGxlKHsgdGV4dENvbXBvbmVudDogc3ViVGl0bGVDb21wb25lbnQsIGR5OiBjZW50ZXJTdWJUaXRsZSA/IDE1IDogMCB9KSkpO1xuICAgIH07XG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGV2YWx1YXRlZCBmb3IgZWFjaCBzbGljZSB3aXRoIHRoZSBwcm9wcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhhdCBzbGljZS5cbiAgICBjb25zdCBnZXRQYWRBbmdsZSA9ICh7IGRhdHVtIH0pID0+IChkYXR1bS5feSA+IDAgPyB0aGVtZS5waWUucGFkQW5nbGUgOiAwKTtcbiAgICAvLyBSZXR1cm5zIHN1YnRpdGxlXG4gICAgY29uc3QgZ2V0U3ViVGl0bGUgPSAoeyBkeSA9IDAsIHRleHRDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0TGFiZWwsIG51bGwpIH0pID0+IHtcbiAgICAgICAgaWYgKCFzdWJUaXRsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3ViVGl0bGVQcm9wcyA9IHRleHRDb21wb25lbnQucHJvcHMgPyB0ZXh0Q29tcG9uZW50LnByb3BzIDoge307XG4gICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQodGV4dENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7IGtleTogJ3BmLWNoYXJ0LWRvbnV0LXN1YnRpdGxlJywgc3R5bGU6IENoYXJ0RG9udXRTdHlsZXMubGFiZWwuc3ViVGl0bGUsIHRleHQ6IHN1YlRpdGxlLCB0ZXh0QW5jaG9yOiBzdWJUaXRsZVBvc2l0aW9uID09PSAncmlnaHQnID8gJ3N0YXJ0JyA6ICdtaWRkbGUnLCB2ZXJ0aWNhbEFuY2hvcjogJ21pZGRsZScsIHg6IGdldFBpZUxhYmVsWCh7XG4gICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGxhYmVsUG9zaXRpb246IHN1YlRpdGxlUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgbGVnZW5kUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgcGFkZGluZzogZGVmYXVsdFBhZGRpbmcsXG4gICAgICAgICAgICAgICAgd2lkdGhcbiAgICAgICAgICAgIH0pLCB5OiBnZXRQaWVMYWJlbFkoe1xuICAgICAgICAgICAgICAgIGR5LFxuICAgICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgICBsYWJlbFBvc2l0aW9uOiBzdWJUaXRsZVBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IGRlZmF1bHRQYWRkaW5nLFxuICAgICAgICAgICAgICAgIHdpZHRoXG4gICAgICAgICAgICB9KSB9LCBzdWJUaXRsZVByb3BzKSk7XG4gICAgfTtcbiAgICAvLyBSZXR1cm5zIHRpdGxlXG4gICAgY29uc3QgZ2V0VGl0bGUgPSAoeyBkeSA9IDAsIHN0eWxlcyA9IENoYXJ0RG9udXRTdHlsZXMubGFiZWwudGl0bGUsIHRpdGxlcyA9IHRpdGxlIH0pID0+IHtcbiAgICAgICAgaWYgKCF0aXRsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpdGxlUHJvcHMgPSB0aXRsZUNvbXBvbmVudCA/IHRpdGxlQ29tcG9uZW50LnByb3BzIDoge307XG4gICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQodGl0bGVDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoQXJyYXkuaXNBcnJheSh0aXRsZXMpICYmIHsgY2FwSGVpZ2h0IH0pKSwgeyBrZXk6ICdwZi1jaGFydC1kb251dC10aXRsZScsIHN0eWxlOiBzdHlsZXMsIHRleHQ6IHRpdGxlcywgdGV4dEFuY2hvcjogJ21pZGRsZScsIHZlcnRpY2FsQW5jaG9yOiAnbWlkZGxlJywgeDogZ2V0UGllTGFiZWxYKHtcbiAgICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgICAgbGFiZWxQb3NpdGlvbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgbGVnZW5kUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgcGFkZGluZzogZGVmYXVsdFBhZGRpbmcsXG4gICAgICAgICAgICAgICAgd2lkdGhcbiAgICAgICAgICAgIH0pLCB5OiBnZXRQaWVMYWJlbFkoe1xuICAgICAgICAgICAgICAgIGR5LFxuICAgICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgICBsYWJlbFBvc2l0aW9uOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiBkZWZhdWx0UGFkZGluZyxcbiAgICAgICAgICAgICAgICB3aWR0aFxuICAgICAgICAgICAgfSkgfSksIHRpdGxlUHJvcHMpKTtcbiAgICB9O1xuICAgIGNvbnN0IGNoYXJ0ID0gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRQaWUsIE9iamVjdC5hc3NpZ24oeyBhbGxvd1Rvb2x0aXA6IGFsbG93VG9vbHRpcCwgaGVpZ2h0OiBoZWlnaHQsIGlubmVyUmFkaXVzOiBjaGFydElubmVyUmFkaXVzID4gMCA/IGNoYXJ0SW5uZXJSYWRpdXMgOiAwLCBrZXk6IFwicGYtY2hhcnQtZG9udXQtcGllXCIsIGxlZ2VuZEFsbG93V3JhcDogbGVnZW5kQWxsb3dXcmFwLCBsZWdlbmRQb3NpdGlvbjogbGVnZW5kUG9zaXRpb24sIHBhZEFuZ2xlOiBwYWRBbmdsZSAhPT0gdW5kZWZpbmVkID8gcGFkQW5nbGUgOiBnZXRQYWRBbmdsZSwgcGFkZGluZzogcGFkZGluZywgcmFkaXVzOiBjaGFydFJhZGl1cyA+IDAgPyBjaGFydFJhZGl1cyA6IDAsIHN0YW5kYWxvbmU6IGZhbHNlLCB0aGVtZTogdGhlbWUsIHdpZHRoOiB3aWR0aCB9LCByZXN0KSkpO1xuICAgIC8vIENsb25lIHNvIHVzZXJzIGNhbiBvdmVycmlkZSBjb250YWluZXIgcHJvcHNcbiAgICBjb25zdCBjb250YWluZXIgPSBSZWFjdC5jbG9uZUVsZW1lbnQoY29udGFpbmVyQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgZGVzYzogYXJpYURlc2MsIGhlaWdodCwgdGl0bGU6IGFyaWFUaXRsZSwgd2lkdGgsXG4gICAgICAgIHRoZW1lIH0sIGNvbnRhaW5lckNvbXBvbmVudC5wcm9wcyksIFtjaGFydCwgZ2V0QWxsVGl0bGVzKCldKTtcbiAgICByZXR1cm4gc3RhbmRhbG9uZSA/IChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjb250YWluZXIpKSA6IChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICBjaGFydCxcbiAgICAgICAgZ2V0QWxsVGl0bGVzKCkpKTtcbn07XG5DaGFydERvbnV0LmRpc3BsYXlOYW1lID0gJ0NoYXJ0RG9udXQnO1xuLy8gTm90ZTogVmljdG9yeVBpZS5yb2xlIG11c3QgYmUgaG9pc3RlZFxuaG9pc3ROb25SZWFjdFN0YXRpY3MoQ2hhcnREb251dCwgVmljdG9yeVBpZSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFydERvbnV0LmpzLm1hcCIsImV4cG9ydCAqIGZyb20gJy4vQ2hhcnREb251dCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IERhdGEsIEhlbHBlcnMgfSBmcm9tICd2aWN0b3J5LWNvcmUnO1xuaW1wb3J0IHsgVmljdG9yeVBpZSB9IGZyb20gJ3ZpY3RvcnktcGllJztcbmltcG9ydCBob2lzdE5vblJlYWN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgeyBDaGFydENvbnRhaW5lciB9IGZyb20gJy4uL0NoYXJ0Q29udGFpbmVyJztcbmltcG9ydCB7IENoYXJ0RG9udXQgfSBmcm9tICcuLi9DaGFydERvbnV0JztcbmltcG9ydCB7IENoYXJ0RG9udXRTdHlsZXMgfSBmcm9tICcuLi9DaGFydFRoZW1lJztcbmltcG9ydCB7IGdldERvbnV0VGhyZXNob2xkRHluYW1pY1RoZW1lLCBnZXREb251dFRocmVzaG9sZFN0YXRpY1RoZW1lLCBnZXRQYWRkaW5nRm9yU2lkZSB9IGZyb20gJy4uL0NoYXJ0VXRpbHMnO1xuZXhwb3J0IHZhciBDaGFydERvbnV0VGhyZXNob2xkRG9udXRPcmllbnRhdGlvbjtcbihmdW5jdGlvbiAoQ2hhcnREb251dFRocmVzaG9sZERvbnV0T3JpZW50YXRpb24pIHtcbiAgICBDaGFydERvbnV0VGhyZXNob2xkRG9udXRPcmllbnRhdGlvbltcImxlZnRcIl0gPSBcImxlZnRcIjtcbiAgICBDaGFydERvbnV0VGhyZXNob2xkRG9udXRPcmllbnRhdGlvbltcInJpZ2h0XCJdID0gXCJyaWdodFwiO1xuICAgIENoYXJ0RG9udXRUaHJlc2hvbGREb251dE9yaWVudGF0aW9uW1widG9wXCJdID0gXCJ0b3BcIjtcbn0pKENoYXJ0RG9udXRUaHJlc2hvbGREb251dE9yaWVudGF0aW9uIHx8IChDaGFydERvbnV0VGhyZXNob2xkRG9udXRPcmllbnRhdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIENoYXJ0RG9udXRUaHJlc2hvbGRMYWJlbE9yaWVudGF0aW9uO1xuKGZ1bmN0aW9uIChDaGFydERvbnV0VGhyZXNob2xkTGFiZWxPcmllbnRhdGlvbikge1xuICAgIENoYXJ0RG9udXRUaHJlc2hvbGRMYWJlbE9yaWVudGF0aW9uW1wiaG9yaXpvbnRhbFwiXSA9IFwiaG9yaXpvbnRhbFwiO1xuICAgIENoYXJ0RG9udXRUaHJlc2hvbGRMYWJlbE9yaWVudGF0aW9uW1widmVydGljYWxcIl0gPSBcInZlcnRpY2FsXCI7XG59KShDaGFydERvbnV0VGhyZXNob2xkTGFiZWxPcmllbnRhdGlvbiB8fCAoQ2hhcnREb251dFRocmVzaG9sZExhYmVsT3JpZW50YXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFydERvbnV0VGhyZXNob2xkTGFiZWxQb3NpdGlvbjtcbihmdW5jdGlvbiAoQ2hhcnREb251dFRocmVzaG9sZExhYmVsUG9zaXRpb24pIHtcbiAgICBDaGFydERvbnV0VGhyZXNob2xkTGFiZWxQb3NpdGlvbltcImNlbnRyb2lkXCJdID0gXCJjZW50cm9pZFwiO1xuICAgIENoYXJ0RG9udXRUaHJlc2hvbGRMYWJlbFBvc2l0aW9uW1wiZW5kQW5nbGVcIl0gPSBcImVuZEFuZ2xlXCI7XG4gICAgQ2hhcnREb251dFRocmVzaG9sZExhYmVsUG9zaXRpb25bXCJzdGFydEFuZ2xlXCJdID0gXCJzdGFydEFuZ2xlXCI7XG59KShDaGFydERvbnV0VGhyZXNob2xkTGFiZWxQb3NpdGlvbiB8fCAoQ2hhcnREb251dFRocmVzaG9sZExhYmVsUG9zaXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFydERvbnV0VGhyZXNob2xkU29ydE9yZGVyO1xuKGZ1bmN0aW9uIChDaGFydERvbnV0VGhyZXNob2xkU29ydE9yZGVyKSB7XG4gICAgQ2hhcnREb251dFRocmVzaG9sZFNvcnRPcmRlcltcImFzY2VuZGluZ1wiXSA9IFwiYXNjZW5kaW5nXCI7XG4gICAgQ2hhcnREb251dFRocmVzaG9sZFNvcnRPcmRlcltcImRlc2NlbmRpbmdcIl0gPSBcImRlc2NlbmRpbmdcIjtcbn0pKENoYXJ0RG9udXRUaHJlc2hvbGRTb3J0T3JkZXIgfHwgKENoYXJ0RG9udXRUaHJlc2hvbGRTb3J0T3JkZXIgPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFydERvbnV0VGhyZXNob2xkU3ViVGl0bGVQb3NpdGlvbjtcbihmdW5jdGlvbiAoQ2hhcnREb251dFRocmVzaG9sZFN1YlRpdGxlUG9zaXRpb24pIHtcbiAgICBDaGFydERvbnV0VGhyZXNob2xkU3ViVGl0bGVQb3NpdGlvbltcImJvdHRvbVwiXSA9IFwiYm90dG9tXCI7XG4gICAgQ2hhcnREb251dFRocmVzaG9sZFN1YlRpdGxlUG9zaXRpb25bXCJjZW50ZXJcIl0gPSBcImNlbnRlclwiO1xuICAgIENoYXJ0RG9udXRUaHJlc2hvbGRTdWJUaXRsZVBvc2l0aW9uW1wicmlnaHRcIl0gPSBcInJpZ2h0XCI7XG59KShDaGFydERvbnV0VGhyZXNob2xkU3ViVGl0bGVQb3NpdGlvbiB8fCAoQ2hhcnREb251dFRocmVzaG9sZFN1YlRpdGxlUG9zaXRpb24gPSB7fSkpO1xuZXhwb3J0IGNvbnN0IENoYXJ0RG9udXRUaHJlc2hvbGQgPSAoX2EpID0+IHtcbiAgICB2YXIgeyBhbGxvd1Rvb2x0aXAgPSB0cnVlLCBhcmlhRGVzYywgYXJpYVRpdGxlLCBjaGlsZHJlbiwgY29uc3RyYWluVG9WaXNpYmxlQXJlYSA9IGZhbHNlLCBjb250YWluZXJDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0Q29udGFpbmVyLCBudWxsKSwgZGF0YSA9IFtdLCBpbnZlcnQgPSBmYWxzZSwgbGFiZWxzID0gW10sIC8vIERvbid0IHNob3cgYW55IHRvb2x0aXAgbGFiZWxzIGJ5IGRlZmF1bHQsIGxldCBjb25zdW1lciBvdmVycmlkZSBpZiBuZWVkZWRcbiAgICBwYWRkaW5nLCByYWRpdXMsIHN0YW5kYWxvbmUgPSB0cnVlLCBzdWJUaXRsZVBvc2l0aW9uID0gQ2hhcnREb251dFN0eWxlcy5sYWJlbC5zdWJUaXRsZVBvc2l0aW9uLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIHgsIHksIFxuICAgIC8vIGRlc3RydWN0dXJlIGxhc3RcbiAgICB0aGVtZSA9IGdldERvbnV0VGhyZXNob2xkU3RhdGljVGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCBpbnZlcnQpLCBoZWlnaHQgPSB0aGVtZS5waWUuaGVpZ2h0LCB3aWR0aCA9IHRoZW1lLnBpZS53aWR0aCB9ID0gX2EsIHJlc3QgPSBfX3Jlc3QoX2EsIFtcImFsbG93VG9vbHRpcFwiLCBcImFyaWFEZXNjXCIsIFwiYXJpYVRpdGxlXCIsIFwiY2hpbGRyZW5cIiwgXCJjb25zdHJhaW5Ub1Zpc2libGVBcmVhXCIsIFwiY29udGFpbmVyQ29tcG9uZW50XCIsIFwiZGF0YVwiLCBcImludmVydFwiLCBcImxhYmVsc1wiLCBcInBhZGRpbmdcIiwgXCJyYWRpdXNcIiwgXCJzdGFuZGFsb25lXCIsIFwic3ViVGl0bGVQb3NpdGlvblwiLCBcInRoZW1lQ29sb3JcIiwgXCJ0aGVtZVZhcmlhbnRcIiwgXCJ4XCIsIFwieVwiLCBcInRoZW1lXCIsIFwiaGVpZ2h0XCIsIFwid2lkdGhcIl0pO1xuICAgIGNvbnN0IGRlZmF1bHRQYWRkaW5nID0ge1xuICAgICAgICBib3R0b206IGdldFBhZGRpbmdGb3JTaWRlKCdib3R0b20nLCBwYWRkaW5nLCB0aGVtZS5waWUucGFkZGluZyksXG4gICAgICAgIGxlZnQ6IGdldFBhZGRpbmdGb3JTaWRlKCdsZWZ0JywgcGFkZGluZywgdGhlbWUucGllLnBhZGRpbmcpLFxuICAgICAgICByaWdodDogZ2V0UGFkZGluZ0ZvclNpZGUoJ3JpZ2h0JywgcGFkZGluZywgdGhlbWUucGllLnBhZGRpbmcpLFxuICAgICAgICB0b3A6IGdldFBhZGRpbmdGb3JTaWRlKCd0b3AnLCBwYWRkaW5nLCB0aGVtZS5waWUucGFkZGluZylcbiAgICB9O1xuICAgIGNvbnN0IGNoYXJ0UmFkaXVzID0gcmFkaXVzIHx8XG4gICAgICAgIEhlbHBlcnMuZ2V0UmFkaXVzKHtcbiAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgcGFkZGluZzogZGVmYXVsdFBhZGRpbmdcbiAgICAgICAgfSk7XG4gICAgLy8gUmV0dXJucyBjb21wdXRlZCBkYXRhIHJlcHJlc2VudGluZyBwaWUgY2hhcnQgc2xpY2VzXG4gICAgY29uc3QgZ2V0Q29tcHV0ZWREYXRhID0gKCkgPT4ge1xuICAgICAgICAvLyBGb3JtYXQgYW5kIHNvcnQgZGF0YS4gU29ydGluZyBlbnN1cmVzIHRocmVzaG9sZHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgY29ycmVjdCBvcmRlciBhbmQgc2ltcGxpZmllcyBjYWxjdWxhdGlvbnMuXG4gICAgICAgIGNvbnN0IGRhdHVtID0gRGF0YS5mb3JtYXREYXRhKGRhdGEsIE9iamVjdC5hc3NpZ24oeyB4LCB5IH0sIHJlc3QpLCBbJ3gnLCAneSddKS5zb3J0KChhLCBiKSA9PiBhLl95IC0gYi5feSk7XG4gICAgICAgIC8vIERhdGEgbXVzdCBiZSBvZmZzZXQgc28gdGhhdCB0aGUgc3VtIG9mIGFsbCBkYXRhIHBvaW50IHktdmFsdWVzIChpbmNsdWRpbmcgdGhlIGZpbmFsIHNsaWNlKSA9PSAxMDAuXG4gICAgICAgIGNvbnN0IFtwcmV2LCBjb21wdXRlZERhdGFdID0gZGF0dW0ucmVkdWNlKChhY2MsIGRhdGFQb2ludCkgPT4gW1xuICAgICAgICAgICAgZGF0YVBvaW50Ll95LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIC4uLmFjY1sxXSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHg6IGRhdGFQb2ludC5feCxcbiAgICAgICAgICAgICAgICAgICAgeTogZGF0YVBvaW50Ll95IC0gYWNjWzBdIC8vIE11c3QgYmUgb2Zmc2V0IGJ5IHByZXZpb3VzIHZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICBdLCBbMCwgW11dKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIC4uLmNvbXB1dGVkRGF0YSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB5OiBwcmV2ID8gMTAwIC0gcHJldiA6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICB9O1xuICAgIC8vIFJlbmRlciBkeW5hbWljIHV0aWxpemF0aW9uIGRvbnV0IGNhcnRcbiAgICBjb25zdCByZW5kZXJDaGlsZHJlbiA9ICgpID0+IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pLm1hcCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IF9hID0gY2hpbGQucHJvcHMsIHsgZGF0YTogY2hpbGREYXRhIH0gPSBfYSwgY2hpbGRQcm9wcyA9IF9fcmVzdChfYSwgW1wiZGF0YVwiXSk7XG4gICAgICAgICAgICBjb25zdCBkYXR1bSA9IERhdGEuZm9ybWF0RGF0YShbY2hpbGREYXRhXSwgY2hpbGRQcm9wcywgWyd4JywgJ3knXSk7IC8vIEZvcm1hdCBjaGlsZCBkYXRhIGluZGVwZW5kZW50bHkgb2YgdGhpcyBjb21wb25lbnQncyBwcm9wc1xuICAgICAgICAgICAgY29uc3QgZHluYW1pY1RoZW1lID0gY2hpbGRQcm9wcy50aGVtZSB8fFxuICAgICAgICAgICAgICAgIGdldERvbnV0VGhyZXNob2xkRHluYW1pY1RoZW1lKGNoaWxkUHJvcHMudGhlbWVDb2xvciB8fCB0aGVtZUNvbG9yLCBjaGlsZFByb3BzLnRoZW1lVmFyaWFudCB8fCB0aGVtZVZhcmlhbnQpO1xuICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChjaGlsZCwgT2JqZWN0LmFzc2lnbih7IGNvbnN0cmFpblRvVmlzaWJsZUFyZWEsIGRhdGE6IGNoaWxkRGF0YSwgZW5kQW5nbGU6IDM2MCAqIChkYXR1bVswXS5feSA/IGRhdHVtWzBdLl95IC8gMTAwIDogMCksIGhlaWdodCxcbiAgICAgICAgICAgICAgICBpbnZlcnQsIGtleTogYHBmLWNoYXJ0LWRvbnV0LXRocmVzaG9sZC1jaGlsZC0ke2luZGV4fWAsIHBhZGRpbmc6IGRlZmF1bHRQYWRkaW5nLCByYWRpdXM6IGNoYXJ0UmFkaXVzIC0gMTQsIHNob3dTdGF0aWM6IGZhbHNlLCBzdGFuZGFsb25lOiBmYWxzZSwgc3ViVGl0bGVQb3NpdGlvbjogY2hpbGRQcm9wcy5zdWJUaXRsZVBvc2l0aW9uIHx8IHN1YlRpdGxlUG9zaXRpb24sIHRoZW1lOiBkeW5hbWljVGhlbWUsIHdpZHRoIH0sIGNoaWxkUHJvcHMpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfSk7XG4gICAgLy8gU3RhdGljIHRocmVzaG9sZCBkb251dCBjaGFydFxuICAgIGNvbnN0IGNoYXJ0ID0gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnREb251dCwgT2JqZWN0LmFzc2lnbih7IGFsbG93VG9vbHRpcDogYWxsb3dUb29sdGlwLCBjb25zdHJhaW5Ub1Zpc2libGVBcmVhOiBjb25zdHJhaW5Ub1Zpc2libGVBcmVhLCBkYXRhOiBnZXRDb21wdXRlZERhdGEoKSwgaGVpZ2h0OiBoZWlnaHQsIGtleTogXCJwZi1jaGFydC1kb251dC10aHJlc2hvbGRcIiwgbGFiZWxzOiBsYWJlbHMsIHBhZGRpbmc6IGRlZmF1bHRQYWRkaW5nLCBzdGFuZGFsb25lOiBmYWxzZSwgdGhlbWU6IHRoZW1lLCB3aWR0aDogd2lkdGggfSwgcmVzdCkpKTtcbiAgICAvLyBDbG9uZSBzbyB1c2VycyBjYW4gb3ZlcnJpZGUgY29udGFpbmVyIHByb3BzXG4gICAgY29uc3QgY29udGFpbmVyID0gUmVhY3QuY2xvbmVFbGVtZW50KGNvbnRhaW5lckNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7IGRlc2M6IGFyaWFEZXNjLCBoZWlnaHQsIHRpdGxlOiBhcmlhVGl0bGUsIHdpZHRoLFxuICAgICAgICB0aGVtZSB9LCBjb250YWluZXJDb21wb25lbnQucHJvcHMpLCBbY2hhcnQsIHJlbmRlckNoaWxkcmVuKCldKTtcbiAgICByZXR1cm4gc3RhbmRhbG9uZSA/IChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjb250YWluZXIpKSA6IChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICBjaGFydCxcbiAgICAgICAgcmVuZGVyQ2hpbGRyZW4oKSkpO1xufTtcbkNoYXJ0RG9udXRUaHJlc2hvbGQuZGlzcGxheU5hbWUgPSAnQ2hhcnREb251dFRocmVzaG9sZCc7XG4vLyBOb3RlOiBWaWN0b3J5UGllLnJvbGUgbXVzdCBiZSBob2lzdGVkXG5ob2lzdE5vblJlYWN0U3RhdGljcyhDaGFydERvbnV0VGhyZXNob2xkLCBWaWN0b3J5UGllKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJ0RG9udXRUaHJlc2hvbGQuanMubWFwIiwiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IG9yZGVyQnkgZnJvbSAnbG9kYXNoL29yZGVyQnknO1xuaW1wb3J0IHsgRGF0YSB9IGZyb20gJ3ZpY3RvcnktY29yZSc7XG5pbXBvcnQgeyBWaWN0b3J5UGllIH0gZnJvbSAndmljdG9yeS1waWUnO1xuaW1wb3J0IHsgQ2hhcnRDb250YWluZXIgfSBmcm9tICcuLi9DaGFydENvbnRhaW5lcic7XG5pbXBvcnQgeyBDaGFydERvbnV0IH0gZnJvbSAnLi4vQ2hhcnREb251dCc7XG5pbXBvcnQgeyBDaGFydENvbW1vblN0eWxlcywgQ2hhcnREb251dFV0aWxpemF0aW9uU3R5bGVzIH0gZnJvbSAnLi4vQ2hhcnRUaGVtZSc7XG5pbXBvcnQgeyBnZXREb251dFV0aWxpemF0aW9uVGhlbWUgfSBmcm9tICcuLi9DaGFydFV0aWxzJztcbmV4cG9ydCB2YXIgQ2hhcnREb251dFV0aWxpemF0aW9uTGFiZWxQb3NpdGlvbjtcbihmdW5jdGlvbiAoQ2hhcnREb251dFV0aWxpemF0aW9uTGFiZWxQb3NpdGlvbikge1xuICAgIENoYXJ0RG9udXRVdGlsaXphdGlvbkxhYmVsUG9zaXRpb25bXCJjZW50cm9pZFwiXSA9IFwiY2VudHJvaWRcIjtcbiAgICBDaGFydERvbnV0VXRpbGl6YXRpb25MYWJlbFBvc2l0aW9uW1wiZW5kQW5nbGVcIl0gPSBcImVuZEFuZ2xlXCI7XG4gICAgQ2hhcnREb251dFV0aWxpemF0aW9uTGFiZWxQb3NpdGlvbltcInN0YXJ0QW5nbGVcIl0gPSBcInN0YXJ0QW5nbGVcIjtcbn0pKENoYXJ0RG9udXRVdGlsaXphdGlvbkxhYmVsUG9zaXRpb24gfHwgKENoYXJ0RG9udXRVdGlsaXphdGlvbkxhYmVsUG9zaXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFydERvbnV0VXRpbGl6YXRpb25MZWdlbmRPcmllbnRhdGlvbjtcbihmdW5jdGlvbiAoQ2hhcnREb251dFV0aWxpemF0aW9uTGVnZW5kT3JpZW50YXRpb24pIHtcbiAgICBDaGFydERvbnV0VXRpbGl6YXRpb25MZWdlbmRPcmllbnRhdGlvbltcImhvcml6b250YWxcIl0gPSBcImhvcml6b250YWxcIjtcbiAgICBDaGFydERvbnV0VXRpbGl6YXRpb25MZWdlbmRPcmllbnRhdGlvbltcInZlcnRpY2FsXCJdID0gXCJ2ZXJ0aWNhbFwiO1xufSkoQ2hhcnREb251dFV0aWxpemF0aW9uTGVnZW5kT3JpZW50YXRpb24gfHwgKENoYXJ0RG9udXRVdGlsaXphdGlvbkxlZ2VuZE9yaWVudGF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhcnREb251dFV0aWxpemF0aW9uTGVnZW5kUG9zaXRpb247XG4oZnVuY3Rpb24gKENoYXJ0RG9udXRVdGlsaXphdGlvbkxlZ2VuZFBvc2l0aW9uKSB7XG4gICAgQ2hhcnREb251dFV0aWxpemF0aW9uTGVnZW5kUG9zaXRpb25bXCJib3R0b21cIl0gPSBcImJvdHRvbVwiO1xuICAgIENoYXJ0RG9udXRVdGlsaXphdGlvbkxlZ2VuZFBvc2l0aW9uW1wicmlnaHRcIl0gPSBcInJpZ2h0XCI7XG59KShDaGFydERvbnV0VXRpbGl6YXRpb25MZWdlbmRQb3NpdGlvbiB8fCAoQ2hhcnREb251dFV0aWxpemF0aW9uTGVnZW5kUG9zaXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFydERvbnV0VXRpbGl6YXRpb25Tb3J0T3JkZXI7XG4oZnVuY3Rpb24gKENoYXJ0RG9udXRVdGlsaXphdGlvblNvcnRPcmRlcikge1xuICAgIENoYXJ0RG9udXRVdGlsaXphdGlvblNvcnRPcmRlcltcImFzY2VuZGluZ1wiXSA9IFwiYXNjZW5kaW5nXCI7XG4gICAgQ2hhcnREb251dFV0aWxpemF0aW9uU29ydE9yZGVyW1wiZGVzY2VuZGluZ1wiXSA9IFwiZGVzY2VuZGluZ1wiO1xufSkoQ2hhcnREb251dFV0aWxpemF0aW9uU29ydE9yZGVyIHx8IChDaGFydERvbnV0VXRpbGl6YXRpb25Tb3J0T3JkZXIgPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFydERvbnV0VXRpbGl6YXRpb25TdWJUaXRsZVBvc2l0aW9uO1xuKGZ1bmN0aW9uIChDaGFydERvbnV0VXRpbGl6YXRpb25TdWJUaXRsZVBvc2l0aW9uKSB7XG4gICAgQ2hhcnREb251dFV0aWxpemF0aW9uU3ViVGl0bGVQb3NpdGlvbltcImJvdHRvbVwiXSA9IFwiYm90dG9tXCI7XG4gICAgQ2hhcnREb251dFV0aWxpemF0aW9uU3ViVGl0bGVQb3NpdGlvbltcImNlbnRlclwiXSA9IFwiY2VudGVyXCI7XG4gICAgQ2hhcnREb251dFV0aWxpemF0aW9uU3ViVGl0bGVQb3NpdGlvbltcInJpZ2h0XCJdID0gXCJyaWdodFwiO1xufSkoQ2hhcnREb251dFV0aWxpemF0aW9uU3ViVGl0bGVQb3NpdGlvbiB8fCAoQ2hhcnREb251dFV0aWxpemF0aW9uU3ViVGl0bGVQb3NpdGlvbiA9IHt9KSk7XG5leHBvcnQgY29uc3QgQ2hhcnREb251dFV0aWxpemF0aW9uID0gKF9hKSA9PiB7XG4gICAgdmFyIHsgYWxsb3dUb29sdGlwID0gdHJ1ZSwgYXJpYURlc2MsIGFyaWFUaXRsZSwgY29udGFpbmVyQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydENvbnRhaW5lciwgbnVsbCksIGRhdGEsIGludmVydCA9IGZhbHNlLCBsZWdlbmRQb3NpdGlvbiA9IENoYXJ0Q29tbW9uU3R5bGVzLmxlZ2VuZC5wb3NpdGlvbiwgcGFkZGluZywgc2hvd1N0YXRpYyA9IHRydWUsIHN0YW5kYWxvbmUgPSB0cnVlLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIHRocmVzaG9sZHMsIHgsIHksIFxuICAgIC8vIGRlc3RydWN0dXJlIGxhc3RcbiAgICB0aGVtZSA9IGdldERvbnV0VXRpbGl6YXRpb25UaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpLCBoZWlnaHQgPSB0aGVtZS5waWUuaGVpZ2h0LCB3aWR0aCA9IHRoZW1lLnBpZS53aWR0aCB9ID0gX2EsIHJlc3QgPSBfX3Jlc3QoX2EsIFtcImFsbG93VG9vbHRpcFwiLCBcImFyaWFEZXNjXCIsIFwiYXJpYVRpdGxlXCIsIFwiY29udGFpbmVyQ29tcG9uZW50XCIsIFwiZGF0YVwiLCBcImludmVydFwiLCBcImxlZ2VuZFBvc2l0aW9uXCIsIFwicGFkZGluZ1wiLCBcInNob3dTdGF0aWNcIiwgXCJzdGFuZGFsb25lXCIsIFwidGhlbWVDb2xvclwiLCBcInRoZW1lVmFyaWFudFwiLCBcInRocmVzaG9sZHNcIiwgXCJ4XCIsIFwieVwiLCBcInRoZW1lXCIsIFwiaGVpZ2h0XCIsIFwid2lkdGhcIl0pO1xuICAgIC8vIFJldHVybnMgY29tcHV0ZWQgZGF0YSByZXByZXNlbnRpbmcgcGllIGNoYXJ0IHNsaWNlc1xuICAgIGNvbnN0IGdldENvbXB1dGVkRGF0YSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0dW0gPSBnZXREYXRhKCk7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkRGF0YSA9IFt7IHg6IGRhdHVtWzBdLl94LCB5OiBkYXR1bVswXS5feSB8fCAwIH1dO1xuICAgICAgICBpZiAoc2hvd1N0YXRpYykge1xuICAgICAgICAgICAgY29tcHV0ZWREYXRhLnB1c2goeyB5OiBkYXR1bVswXS5feCA/IE1hdGguYWJzKDEwMCAtIGRhdHVtWzBdLl95KSA6IDEwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcHV0ZWREYXRhO1xuICAgIH07XG4gICAgY29uc3QgZ2V0RGF0YSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0dW0gPSBbT2JqZWN0LmFzc2lnbih7fSwgZGF0YSldO1xuICAgICAgICByZXR1cm4gRGF0YS5mb3JtYXREYXRhKGRhdHVtLCBPYmplY3QuYXNzaWduKHsgeCwgeSB9LCByZXN0KSwgWyd4JywgJ3knXSkuc29ydCgoYSwgYikgPT4gYS5feSAtIGIuX3kpO1xuICAgIH07XG4gICAgLy8gUmV0dXJucyB0aHJlc2hvbGRzIHdpdGggZGVmYXVsdCBjb2xvciBzY2FsZVxuICAgIGNvbnN0IGdldERvbnV0VGhyZXNob2xkcyA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICh0aHJlc2hvbGRzKSB7XG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhyZXNob2xkcyBhcmUgaW4gc29ydGVkIG9yZGVyXG4gICAgICAgICAgICBjb25zdCBzVGhyZXNob2xkcyA9IG9yZGVyQnkodGhyZXNob2xkcywgJ3ZhbHVlJywgaW52ZXJ0ID8gJ2Rlc2MnIDogJ2FzYycpO1xuICAgICAgICAgICAgY29uc3QgbnVtQ29sb3JzID0gQ2hhcnREb251dFV0aWxpemF0aW9uU3R5bGVzLnRocmVzaG9sZHMuY29sb3JTY2FsZS5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNUaHJlc2hvbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjogc1RocmVzaG9sZHNbaV0uY29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgID8gc1RocmVzaG9sZHNbaV0uY29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIDogQ2hhcnREb251dFV0aWxpemF0aW9uU3R5bGVzLnRocmVzaG9sZHMuY29sb3JTY2FsZVtpICUgbnVtQ29sb3JzXSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNUaHJlc2hvbGRzW2ldLnZhbHVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIC8vIFJldHVybnMgdGhlbWUgYmFzZWQgb24gdGhyZXNob2xkIGFuZCBjdXJyZW50IHZhbHVlXG4gICAgY29uc3QgZ2V0VGhyZXNob2xkVGhlbWUgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1RoZW1lID0gT2JqZWN0LmFzc2lnbih7fSwgdGhlbWUpO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgZGF0dW0gPSBnZXREYXRhKCk7XG4gICAgICAgICAgICBjb25zdCBkb251dFRocmVzaG9sZHMgPSBnZXREb251dFRocmVzaG9sZHMoKTtcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlVGhlbWVQcm9wcyA9IChpKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTWVyZ2UganVzdCB0aGUgZmlyc3QgY29sb3Igb2YgZHluYW1pYyAoYmx1ZSwgZ3JlZW4sIGV0Yy4pIHdpdGggc3RhdGljIChncmF5KSBmb3IgZXhwZWN0ZWQgY29sb3JTY2FsZVxuICAgICAgICAgICAgICAgIGlmIChuZXdUaGVtZS5waWUuY29sb3JTY2FsZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1RoZW1lLnBpZS5jb2xvclNjYWxlWzBdID0gZG9udXRUaHJlc2hvbGRzW2ldLmNvbG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VGhlbWUucGllLmNvbG9yU2NhbGUgPSBkb251dFRocmVzaG9sZHNbaV0uY29sb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZXdUaGVtZS5sZWdlbmQuY29sb3JTY2FsZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1RoZW1lLmxlZ2VuZC5jb2xvclNjYWxlWzBdID0gZG9udXRUaHJlc2hvbGRzW2ldLmNvbG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VGhlbWUubGVnZW5kLmNvbG9yU2NhbGUgPSBkb251dFRocmVzaG9sZHNbaV0uY29sb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9udXRUaHJlc2hvbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGludmVydCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0dW1bMF0uX3kgPD0gZG9udXRUaHJlc2hvbGRzW2ldLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZVRoZW1lUHJvcHMoaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXR1bVswXS5feSA+PSBkb251dFRocmVzaG9sZHNbaV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlVGhlbWVQcm9wcyhpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3VGhlbWU7XG4gICAgfTtcbiAgICAvLyBEeW5hbWljIGRvbnV0IGNoYXJ0XG4gICAgY29uc3QgY2hhcnQgPSAoUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydERvbnV0LCBPYmplY3QuYXNzaWduKHsgYWxsb3dUb29sdGlwOiBhbGxvd1Rvb2x0aXAsIGRhdGE6IGdldENvbXB1dGVkRGF0YSgpLCBoZWlnaHQ6IGhlaWdodCwga2V5OiBcInBmLWNoYXJ0LWRvbnV0LXV0aWxpemF0aW9uXCIsIGxlZ2VuZFBvc2l0aW9uOiBsZWdlbmRQb3NpdGlvbiwgcGFkZGluZzogcGFkZGluZywgc3RhbmRhbG9uZTogZmFsc2UsIHRoZW1lOiBnZXRUaHJlc2hvbGRUaGVtZSgpLCB3aWR0aDogd2lkdGggfSwgcmVzdCkpKTtcbiAgICAvLyBDbG9uZSBzbyB1c2VycyBjYW4gb3ZlcnJpZGUgY29udGFpbmVyIHByb3BzXG4gICAgY29uc3QgY29udGFpbmVyID0gUmVhY3QuY2xvbmVFbGVtZW50KGNvbnRhaW5lckNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7IGRlc2M6IGFyaWFEZXNjLCBoZWlnaHQsIHRpdGxlOiBhcmlhVGl0bGUsIHdpZHRoLFxuICAgICAgICB0aGVtZSB9LCBjb250YWluZXJDb21wb25lbnQucHJvcHMpLCBbY2hhcnRdKTtcbiAgICByZXR1cm4gc3RhbmRhbG9uZSA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGNvbnRhaW5lcikgOiBSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjaGFydCk7XG59O1xuQ2hhcnREb251dFV0aWxpemF0aW9uLmRpc3BsYXlOYW1lID0gJ0NoYXJ0RG9udXRVdGlsaXphdGlvbic7XG4vLyBOb3RlOiBWaWN0b3J5UGllLnJvbGUgbXVzdCBiZSBob2lzdGVkXG5ob2lzdE5vblJlYWN0U3RhdGljcyhDaGFydERvbnV0VXRpbGl6YXRpb24sIFZpY3RvcnlQaWUpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2hhcnREb251dFV0aWxpemF0aW9uLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gJy4vQ2hhcnREb251dFRocmVzaG9sZCc7XG5leHBvcnQgKiBmcm9tICcuL0NoYXJ0RG9udXRVdGlsaXphdGlvbic7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gfVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBEYXRhLCBIZWxwZXJzLCBTY2FsZSwgV3JhcHBlciB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJyZWFjdC1mYXN0LWNvbXBhcmVcIjtcbnZhciBmYWxsYmFja1Byb3BzID0ge1xuICB3aWR0aDogNDUwLFxuICBoZWlnaHQ6IDMwMCxcbiAgcGFkZGluZzogNTAsXG4gIG9mZnNldDogMFxufTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYWxjdWxhdGVkUHJvcHMocHJvcHMsIGNoaWxkQ29tcG9uZW50cykge1xuICB2YXIgcm9sZSA9IFwiZ3JvdXBcIjtcbiAgcHJvcHMgPSBIZWxwZXJzLm1vZGlmeVByb3BzKHByb3BzLCBmYWxsYmFja1Byb3BzLCByb2xlKTtcbiAgdmFyIHN0eWxlID0gV3JhcHBlci5nZXRTdHlsZShwcm9wcy50aGVtZSwgcHJvcHMuc3R5bGUsIHJvbGUpO1xuICB2YXIgX3Byb3BzID0gcHJvcHMsXG4gICAgICBvZmZzZXQgPSBfcHJvcHMub2Zmc2V0LFxuICAgICAgY29sb3JTY2FsZSA9IF9wcm9wcy5jb2xvclNjYWxlLFxuICAgICAgY29sb3IgPSBfcHJvcHMuY29sb3IsXG4gICAgICBwb2xhciA9IF9wcm9wcy5wb2xhcixcbiAgICAgIGhvcml6b250YWwgPSBfcHJvcHMuaG9yaXpvbnRhbDtcbiAgdmFyIGNhdGVnb3JpZXMgPSBwcm9wcy5jYXRlZ29yaWVzIHx8IFdyYXBwZXIuZ2V0Q2F0ZWdvcmllcyhwcm9wcywgY2hpbGRDb21wb25lbnRzKTtcbiAgdmFyIGRhdGFzZXRzID0gcHJvcHMuZGF0YXNldHMgfHwgV3JhcHBlci5nZXREYXRhRnJvbUNoaWxkcmVuKHByb3BzKTtcbiAgdmFyIGRvbWFpbiA9IHtcbiAgICB4OiBXcmFwcGVyLmdldERvbWFpbihfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgY2F0ZWdvcmllczogY2F0ZWdvcmllc1xuICAgIH0pLCBcInhcIiwgY2hpbGRDb21wb25lbnRzKSxcbiAgICB5OiBXcmFwcGVyLmdldERvbWFpbihfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgY2F0ZWdvcmllczogY2F0ZWdvcmllc1xuICAgIH0pLCBcInlcIiwgY2hpbGRDb21wb25lbnRzKVxuICB9O1xuICB2YXIgcmFuZ2UgPSBwcm9wcy5yYW5nZSB8fCB7XG4gICAgeDogSGVscGVycy5nZXRSYW5nZShwcm9wcywgXCJ4XCIpLFxuICAgIHk6IEhlbHBlcnMuZ2V0UmFuZ2UocHJvcHMsIFwieVwiKVxuICB9O1xuICB2YXIgYmFzZVNjYWxlID0ge1xuICAgIHg6IFNjYWxlLmdldFNjYWxlRnJvbVByb3BzKHByb3BzLCBcInhcIikgfHwgV3JhcHBlci5nZXRTY2FsZShwcm9wcywgXCJ4XCIpLFxuICAgIHk6IFNjYWxlLmdldFNjYWxlRnJvbVByb3BzKHByb3BzLCBcInlcIikgfHwgV3JhcHBlci5nZXRTY2FsZShwcm9wcywgXCJ5XCIpXG4gIH07XG4gIHZhciBzY2FsZSA9IHtcbiAgICB4OiBiYXNlU2NhbGUueC5kb21haW4oZG9tYWluLngpLnJhbmdlKHByb3BzLmhvcml6b250YWwgPyByYW5nZS55IDogcmFuZ2UueCksXG4gICAgeTogYmFzZVNjYWxlLnkuZG9tYWluKGRvbWFpbi55KS5yYW5nZShwcm9wcy5ob3Jpem9udGFsID8gcmFuZ2UueCA6IHJhbmdlLnkpXG4gIH07XG4gIHZhciBvcmlnaW4gPSBwb2xhciA/IHByb3BzLm9yaWdpbiA6IEhlbHBlcnMuZ2V0UG9sYXJPcmlnaW4ocHJvcHMpO1xuICB2YXIgcGFkZGluZyA9IEhlbHBlcnMuZ2V0UGFkZGluZyhwcm9wcyk7XG4gIHJldHVybiB7XG4gICAgZGF0YXNldHM6IGRhdGFzZXRzLFxuICAgIGNhdGVnb3JpZXM6IGNhdGVnb3JpZXMsXG4gICAgcmFuZ2U6IHJhbmdlLFxuICAgIGRvbWFpbjogZG9tYWluLFxuICAgIGhvcml6b250YWw6IGhvcml6b250YWwsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBjb2xvclNjYWxlOiBjb2xvclNjYWxlLFxuICAgIGNvbG9yOiBjb2xvcixcbiAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICBvcmlnaW46IG9yaWdpbixcbiAgICBwYWRkaW5nOiBwYWRkaW5nXG4gIH07XG59IC8vIFdlIG5lZWQgdG8gcmVtb3ZlIHNoYXJlZEV2ZW50cyBpbiBvcmRlciB0byBtZW1vaXplIHRoZSBjYWxjdWxhdGVkIGRhdGFcbi8vIFdpdGggc2hhcmVkIGV2ZW50cywgdGhlIHByb3BzIGNoYW5nZSBvbiBldmVyeSBldmVudCwgYW5kIGV2ZXJ5IHZhbHVlIGlzIHJlLWNhbGN1bGF0ZWRcblxudmFyIHdpdGhvdXRTaGFyZWRFdmVudHMgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG4gIHZhciBtb2RpZmllZENoaWxkcmVuID0gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbikubWFwKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBjaGlsZCwge1xuICAgICAgcHJvcHM6IEhlbHBlcnMub21pdChjaGlsZC5wcm9wcywgW1wic2hhcmVkRXZlbnRzXCJdKVxuICAgIH0pO1xuICB9KTtcbiAgcHJvcHMuY2hpbGRyZW4gPSBtb2RpZmllZENoaWxkcmVuO1xuICByZXR1cm4gcHJvcHM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlTWVtb2l6ZWRQcm9wcyhpbml0aWFsUHJvcHMpIHtcbiAgdmFyIG1vZGlmaWVkUHJvcHMgPSB3aXRob3V0U2hhcmVkRXZlbnRzKGluaXRpYWxQcm9wcyk7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKG1vZGlmaWVkUHJvcHMpLFxuICAgICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgICBwcm9wcyA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRQcm9wcyA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07IC8vIFJlYWN0Lm1lbW8gdXNlcyBzaGFsbG93IGVxdWFsaXR5IHRvIGNvbXBhcmUgb2JqZWN0cy4gVGhpcyB3YXkgcHJvcHNcbiAgLy8gd2lsbCBvbmx5IGJlIHJlLWNhbGN1bGF0ZWQgd2hlbiB0aGV5IGNoYW5nZS5cblxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFpc0VxdWFsKG1vZGlmaWVkUHJvcHMsIHByb3BzKSkge1xuICAgICAgc2V0UHJvcHMobW9kaWZpZWRQcm9wcyk7XG4gICAgfVxuICB9LCBbcHJvcHMsIHNldFByb3BzLCBtb2RpZmllZFByb3BzXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0Q2FsY3VsYXRlZFByb3BzKHByb3BzLCBwcm9wcy5jaGlsZHJlbik7XG4gIH0sIFtwcm9wc10pO1xufVxuXG5mdW5jdGlvbiBwaXhlbHNUb1ZhbHVlKHByb3BzLCBheGlzLCBjYWxjdWxhdGVkUHJvcHMpIHtcbiAgaWYgKCFwcm9wcy5vZmZzZXQpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciBjdXJyZW50QXhpcyA9IEhlbHBlcnMuZ2V0Q3VycmVudEF4aXMoYXhpcywgcHJvcHMuaG9yaXpvbnRhbCk7XG4gIHZhciBkb21haW4gPSBjYWxjdWxhdGVkUHJvcHMuZG9tYWluW2F4aXNdO1xuICB2YXIgcmFuZ2UgPSBjYWxjdWxhdGVkUHJvcHMucmFuZ2VbY3VycmVudEF4aXNdO1xuICB2YXIgZG9tYWluRXh0ZW50ID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGRvbWFpbikpIC0gTWF0aC5taW4uYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGRvbWFpbikpO1xuICB2YXIgcmFuZ2VFeHRlbnQgPSBNYXRoLm1heC5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkocmFuZ2UpKSAtIE1hdGgubWluLmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheShyYW5nZSkpO1xuICByZXR1cm4gZG9tYWluRXh0ZW50IC8gcmFuZ2VFeHRlbnQgKiBwcm9wcy5vZmZzZXQ7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG5cblxuZnVuY3Rpb24gZ2V0WDAocHJvcHMsIGNhbGN1bGF0ZWRQcm9wcywgaW5kZXgsIHJvbGUpIHtcbiAgdmFyIGdyb3VwTGVuZ3RoID0gcm9sZSA9PT0gXCJzdGFja1wiID8gY2FsY3VsYXRlZFByb3BzLmRhdGFzZXRzWzBdLmxlbmd0aCA6IGNhbGN1bGF0ZWRQcm9wcy5kYXRhc2V0cy5sZW5ndGg7XG4gIHZhciBjZW50ZXIgPSAoZ3JvdXBMZW5ndGggLSAxKSAvIDI7XG4gIHZhciB0b3RhbFdpZHRoID0gcGl4ZWxzVG9WYWx1ZShwcm9wcywgXCJ4XCIsIGNhbGN1bGF0ZWRQcm9wcyk7XG4gIHJldHVybiAoaW5kZXggLSBjZW50ZXIpICogdG90YWxXaWR0aDtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcblxuXG5mdW5jdGlvbiBnZXRQb2xhclgwKHByb3BzLCBjYWxjdWxhdGVkUHJvcHMsIGluZGV4LCByb2xlKSB7XG4gIHZhciBncm91cExlbmd0aCA9IHJvbGUgPT09IFwic3RhY2tcIiA/IGNhbGN1bGF0ZWRQcm9wcy5kYXRhc2V0c1swXS5sZW5ndGggOiBjYWxjdWxhdGVkUHJvcHMuZGF0YXNldHMubGVuZ3RoO1xuICB2YXIgY2VudGVyID0gKGdyb3VwTGVuZ3RoIC0gMSkgLyAyO1xuICB2YXIgd2lkdGggPSBnZXRBbmd1bGFyV2lkdGgocHJvcHMsIGNhbGN1bGF0ZWRQcm9wcyk7XG4gIHJldHVybiAoaW5kZXggLSBjZW50ZXIpICogd2lkdGg7XG59XG5cbmZ1bmN0aW9uIGdldEFuZ3VsYXJXaWR0aChwcm9wcywgY2FsY3VsYXRlZFByb3BzKSB7XG4gIHZhciByYW5nZSA9IGNhbGN1bGF0ZWRQcm9wcy5yYW5nZTtcbiAgdmFyIGFuZ3VsYXJSYW5nZSA9IE1hdGguYWJzKHJhbmdlLnhbMV0gLSByYW5nZS54WzBdKTtcbiAgdmFyIHIgPSBNYXRoLm1heC5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkocmFuZ2UueSkpO1xuICByZXR1cm4gcHJvcHMub2Zmc2V0IC8gKDIgKiBNYXRoLlBJICogcikgKiBhbmd1bGFyUmFuZ2U7XG59XG5cbmZ1bmN0aW9uIGdldExhYmVscyhwcm9wcywgZGF0YXNldHMsIGluZGV4KSB7XG4gIGlmICghcHJvcHMubGFiZWxzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKGRhdGFzZXRzLmxlbmd0aCAvIDIpID09PSBpbmRleCA/IHByb3BzLmxhYmVscyA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hpbGRQcm9wcyhwcm9wcywgY2FsY3VsYXRlZFByb3BzKSB7XG4gIHZhciBjYXRlZ29yaWVzID0gY2FsY3VsYXRlZFByb3BzLmNhdGVnb3JpZXMsXG4gICAgICBkb21haW4gPSBjYWxjdWxhdGVkUHJvcHMuZG9tYWluLFxuICAgICAgcmFuZ2UgPSBjYWxjdWxhdGVkUHJvcHMucmFuZ2UsXG4gICAgICBzY2FsZSA9IGNhbGN1bGF0ZWRQcm9wcy5zY2FsZSxcbiAgICAgIGhvcml6b250YWwgPSBjYWxjdWxhdGVkUHJvcHMuaG9yaXpvbnRhbCxcbiAgICAgIG9yaWdpbiA9IGNhbGN1bGF0ZWRQcm9wcy5vcmlnaW4sXG4gICAgICBwYWRkaW5nID0gY2FsY3VsYXRlZFByb3BzLnBhZGRpbmc7XG4gIHZhciB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0LFxuICAgICAgdGhlbWUgPSBwcm9wcy50aGVtZSxcbiAgICAgIHBvbGFyID0gcHJvcHMucG9sYXI7XG4gIHJldHVybiB7XG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIHRoZW1lOiB0aGVtZSxcbiAgICBwb2xhcjogcG9sYXIsXG4gICAgb3JpZ2luOiBvcmlnaW4sXG4gICAgY2F0ZWdvcmllczogY2F0ZWdvcmllcyxcbiAgICBkb21haW46IGRvbWFpbixcbiAgICByYW5nZTogcmFuZ2UsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIGhvcml6b250YWw6IGhvcml6b250YWwsXG4gICAgcGFkZGluZzogcGFkZGluZyxcbiAgICBzdGFuZGFsb25lOiBmYWxzZVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDb2xvclNjYWxlKHByb3BzLCBjaGlsZCkge1xuICB2YXIgcm9sZSA9IGNoaWxkLnR5cGUgJiYgY2hpbGQudHlwZS5yb2xlO1xuICB2YXIgY29sb3JTY2FsZU9wdGlvbnMgPSBjaGlsZC5wcm9wcy5jb2xvclNjYWxlIHx8IHByb3BzLmNvbG9yU2NhbGU7XG5cbiAgaWYgKHJvbGUgIT09IFwiZ3JvdXBcIiAmJiByb2xlICE9PSBcInN0YWNrXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzLnRoZW1lICYmIHByb3BzLnRoZW1lLmdyb3VwID8gY29sb3JTY2FsZU9wdGlvbnMgfHwgcHJvcHMudGhlbWUuZ3JvdXAuY29sb3JTY2FsZSA6IGNvbG9yU2NhbGVPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhV2l0aE9mZnNldChwcm9wcykge1xuICB2YXIgZGVmYXVsdERhdGFzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdO1xuICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBkYXRhc2V0ID0gcHJvcHMuZGF0YSB8fCBwcm9wcy55ID8gRGF0YS5nZXREYXRhKHByb3BzKSA6IGRlZmF1bHREYXRhc2V0O1xuICB2YXIgeE9mZnNldCA9IG9mZnNldCB8fCAwO1xuICByZXR1cm4gZGF0YXNldC5tYXAoZnVuY3Rpb24gKGRhdHVtKSB7XG4gICAgdmFyIF94MSA9IGRhdHVtLl94IGluc3RhbmNlb2YgRGF0ZSA/IG5ldyBEYXRlKGRhdHVtLl94LmdldFRpbWUoKSArIHhPZmZzZXQpIDogZGF0dW0uX3ggKyB4T2Zmc2V0O1xuXG4gICAgcmV0dXJuIF9hc3NpZ24oe30sIGRhdHVtLCB7XG4gICAgICBfeDE6IF94MVxuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENoaWxkcmVuKHByb3BzLCBjaGlsZENvbXBvbmVudHMsIGNhbGN1bGF0ZWRQcm9wcykge1xuICBwcm9wcyA9IEhlbHBlcnMubW9kaWZ5UHJvcHMocHJvcHMsIGZhbGxiYWNrUHJvcHMsIFwic3RhY2tcIik7XG4gIGNoaWxkQ29tcG9uZW50cyA9IGNoaWxkQ29tcG9uZW50cyB8fCBSZWFjdC5DaGlsZHJlbi50b0FycmF5KHByb3BzLmNoaWxkcmVuKTtcbiAgY2FsY3VsYXRlZFByb3BzID0gY2FsY3VsYXRlZFByb3BzIHx8IGdldENhbGN1bGF0ZWRQcm9wcyhwcm9wcywgY2hpbGRDb21wb25lbnRzKTtcbiAgdmFyIF9jYWxjdWxhdGVkUHJvcHMgPSBjYWxjdWxhdGVkUHJvcHMsXG4gICAgICBkYXRhc2V0cyA9IF9jYWxjdWxhdGVkUHJvcHMuZGF0YXNldHM7XG4gIHZhciBfcHJvcHMyID0gcHJvcHMsXG4gICAgICBsYWJlbENvbXBvbmVudCA9IF9wcm9wczIubGFiZWxDb21wb25lbnQsXG4gICAgICBwb2xhciA9IF9wcm9wczIucG9sYXI7XG4gIHZhciBjaGlsZFByb3BzID0gZ2V0Q2hpbGRQcm9wcyhwcm9wcywgY2FsY3VsYXRlZFByb3BzKTtcbiAgdmFyIHBhcmVudE5hbWUgPSBwcm9wcy5uYW1lIHx8IFwiZ3JvdXBcIjtcbiAgcmV0dXJuIGNoaWxkQ29tcG9uZW50cy5tYXAoZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgIHZhciByb2xlID0gY2hpbGQudHlwZSAmJiBjaGlsZC50eXBlLnJvbGU7XG4gICAgdmFyIHhPZmZzZXQgPSBwb2xhciA/IGdldFBvbGFyWDAocHJvcHMsIGNhbGN1bGF0ZWRQcm9wcywgaW5kZXgsIHJvbGUpIDogZ2V0WDAocHJvcHMsIGNhbGN1bGF0ZWRQcm9wcywgaW5kZXgsIHJvbGUpO1xuICAgIHZhciBzdHlsZSA9IHJvbGUgPT09IFwidm9yb25vaVwiIHx8IHJvbGUgPT09IFwidG9vbHRpcFwiIHx8IHJvbGUgPT09IFwibGFiZWxcIiA/IGNoaWxkLnByb3BzLnN0eWxlIDogV3JhcHBlci5nZXRDaGlsZFN0eWxlKGNoaWxkLCBpbmRleCwgY2FsY3VsYXRlZFByb3BzKTtcbiAgICB2YXIgbGFiZWxzID0gcHJvcHMubGFiZWxzID8gZ2V0TGFiZWxzKHByb3BzLCBkYXRhc2V0cywgaW5kZXgpIDogY2hpbGQucHJvcHMubGFiZWxzO1xuICAgIHZhciBuYW1lID0gY2hpbGQucHJvcHMubmFtZSB8fCBcIlwiLmNvbmNhdChwYXJlbnROYW1lLCBcIi1cIikuY29uY2F0KHJvbGUsIFwiLVwiKS5jb25jYXQoaW5kZXgpO1xuICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIF9hc3NpZ24oe1xuICAgICAgbGFiZWxzOiBsYWJlbHMsXG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICBrZXk6IFwiXCIuY29uY2F0KG5hbWUsIFwiLWtleS1cIikuY29uY2F0KGluZGV4KSxcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICBkYXRhOiBnZXREYXRhV2l0aE9mZnNldChwcm9wcywgZGF0YXNldHNbaW5kZXhdLCB4T2Zmc2V0KSxcbiAgICAgIGNvbG9yU2NhbGU6IGdldENvbG9yU2NhbGUocHJvcHMsIGNoaWxkKSxcbiAgICAgIGxhYmVsQ29tcG9uZW50OiBsYWJlbENvbXBvbmVudCB8fCBjaGlsZC5wcm9wcy5sYWJlbENvbXBvbmVudCxcbiAgICAgIHhPZmZzZXQ6IHhPZmZzZXRcbiAgICB9LCBjaGlsZFByb3BzKSk7XG4gIH0pO1xufSIsImltcG9ydCBfaXNFbXB0eSBmcm9tIFwibG9kYXNoL2lzRW1wdHlcIjtcbmltcG9ydCBfZGVmYXVsdHMgZnJvbSBcImxvZGFzaC9kZWZhdWx0c1wiO1xuaW1wb3J0IF9hc3NpZ24gZnJvbSBcImxvZGFzaC9hc3NpZ25cIjtcblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBIZWxwZXJzLCBWaWN0b3J5Q29udGFpbmVyLCBWaWN0b3J5VGhlbWUsIENvbW1vblByb3BzLCBXcmFwcGVyLCBIb29rcyB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbmltcG9ydCB7IFZpY3RvcnlTaGFyZWRFdmVudHMgfSBmcm9tIFwidmljdG9yeS1zaGFyZWQtZXZlbnRzXCI7XG5pbXBvcnQgeyBnZXRDaGlsZHJlbiwgdXNlTWVtb2l6ZWRQcm9wcyB9IGZyb20gXCIuL2hlbHBlci1tZXRob2RzXCI7XG5pbXBvcnQgaXNFcXVhbCBmcm9tIFwicmVhY3QtZmFzdC1jb21wYXJlXCI7XG52YXIgZmFsbGJhY2tQcm9wcyA9IHtcbiAgd2lkdGg6IDQ1MCxcbiAgaGVpZ2h0OiAzMDAsXG4gIHBhZGRpbmc6IDUwLFxuICBvZmZzZXQ6IDBcbn07XG5cbnZhciBWaWN0b3J5R3JvdXAgPSBmdW5jdGlvbiAoaW5pdGlhbFByb3BzKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICB2YXIgcm9sZSA9IFZpY3RvcnlHcm91cE1lbW8ucm9sZTtcblxuICB2YXIgX0hvb2tzJHVzZUFuaW1hdGlvblN0ID0gSG9va3MudXNlQW5pbWF0aW9uU3RhdGUoKSxcbiAgICAgIGdldEFuaW1hdGlvblByb3BzID0gX0hvb2tzJHVzZUFuaW1hdGlvblN0LmdldEFuaW1hdGlvblByb3BzLFxuICAgICAgc2V0QW5pbWF0aW9uU3RhdGUgPSBfSG9va3MkdXNlQW5pbWF0aW9uU3Quc2V0QW5pbWF0aW9uU3RhdGUsXG4gICAgICBnZXRQcm9wcyA9IF9Ib29rcyR1c2VBbmltYXRpb25TdC5nZXRQcm9wcztcblxuICB2YXIgcHJvcHMgPSBnZXRQcm9wcyhpbml0aWFsUHJvcHMpO1xuICB2YXIgbW9kaWZpZWRQcm9wcyA9IEhlbHBlcnMubW9kaWZ5UHJvcHMocHJvcHMsIGZhbGxiYWNrUHJvcHMsIHJvbGUpO1xuICB2YXIgZXZlbnRLZXkgPSBtb2RpZmllZFByb3BzLmV2ZW50S2V5LFxuICAgICAgY29udGFpbmVyQ29tcG9uZW50ID0gbW9kaWZpZWRQcm9wcy5jb250YWluZXJDb21wb25lbnQsXG4gICAgICBzdGFuZGFsb25lID0gbW9kaWZpZWRQcm9wcy5zdGFuZGFsb25lLFxuICAgICAgZ3JvdXBDb21wb25lbnQgPSBtb2RpZmllZFByb3BzLmdyb3VwQ29tcG9uZW50LFxuICAgICAgZXh0ZXJuYWxFdmVudE11dGF0aW9ucyA9IG1vZGlmaWVkUHJvcHMuZXh0ZXJuYWxFdmVudE11dGF0aW9ucyxcbiAgICAgIHdpZHRoID0gbW9kaWZpZWRQcm9wcy53aWR0aCxcbiAgICAgIGhlaWdodCA9IG1vZGlmaWVkUHJvcHMuaGVpZ2h0LFxuICAgICAgdGhlbWUgPSBtb2RpZmllZFByb3BzLnRoZW1lLFxuICAgICAgcG9sYXIgPSBtb2RpZmllZFByb3BzLnBvbGFyLFxuICAgICAgaG9yaXpvbnRhbCA9IG1vZGlmaWVkUHJvcHMuaG9yaXpvbnRhbCxcbiAgICAgIG5hbWUgPSBtb2RpZmllZFByb3BzLm5hbWU7XG4gIHZhciBjaGlsZENvbXBvbmVudHMgPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KG1vZGlmaWVkUHJvcHMuY2hpbGRyZW4pO1xuICB2YXIgY2FsY3VsYXRlZFByb3BzID0gdXNlTWVtb2l6ZWRQcm9wcyhtb2RpZmllZFByb3BzKTtcbiAgdmFyIGRvbWFpbiA9IGNhbGN1bGF0ZWRQcm9wcy5kb21haW4sXG4gICAgICBzY2FsZSA9IGNhbGN1bGF0ZWRQcm9wcy5zY2FsZSxcbiAgICAgIHN0eWxlID0gY2FsY3VsYXRlZFByb3BzLnN0eWxlLFxuICAgICAgb3JpZ2luID0gY2FsY3VsYXRlZFByb3BzLm9yaWdpbjtcbiAgdmFyIG5ld0NoaWxkcmVuID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocHJvcHMsIGNoaWxkQ29tcG9uZW50cywgY2FsY3VsYXRlZFByb3BzKTtcbiAgICByZXR1cm4gY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICAgIHZhciBjaGlsZFByb3BzID0gX2Fzc2lnbih7XG4gICAgICAgIGFuaW1hdGU6IGdldEFuaW1hdGlvblByb3BzKHByb3BzLCBjaGlsZCwgaW5kZXgsIFwidmljdG9yeS1ncm91cFwiKVxuICAgICAgfSwgY2hpbGQucHJvcHMpO1xuXG4gICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkLCBjaGlsZFByb3BzKTtcbiAgICB9KTtcbiAgfSwgW3Byb3BzLCBjaGlsZENvbXBvbmVudHMsIGNhbGN1bGF0ZWRQcm9wcywgZ2V0QW5pbWF0aW9uUHJvcHNdKTtcbiAgdmFyIGNvbnRhaW5lclByb3BzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHN0YW5kYWxvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbWFpbjogZG9tYWluLFxuICAgICAgICBzY2FsZTogc2NhbGUsXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIHN0YW5kYWxvbmU6IHN0YW5kYWxvbmUsXG4gICAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgICAgc3R5bGU6IHN0eWxlLnBhcmVudCxcbiAgICAgICAgaG9yaXpvbnRhbDogaG9yaXpvbnRhbCxcbiAgICAgICAgcG9sYXI6IHBvbGFyLFxuICAgICAgICBvcmlnaW46IG9yaWdpbixcbiAgICAgICAgbmFtZTogbmFtZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH0sIFtzdGFuZGFsb25lLCBkb21haW4sIHNjYWxlLCB3aWR0aCwgaGVpZ2h0LCB0aGVtZSwgc3R5bGUsIGhvcml6b250YWwsIHBvbGFyLCBvcmlnaW4sIG5hbWVdKTtcbiAgdmFyIGNvbnRhaW5lciA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChzdGFuZGFsb25lKSB7XG4gICAgICB2YXIgZGVmYXVsdENvbnRhaW5lclByb3BzID0gX2RlZmF1bHRzKHt9LCBjb250YWluZXJDb21wb25lbnQucHJvcHMsIGNvbnRhaW5lclByb3BzKTtcblxuICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChjb250YWluZXJDb21wb25lbnQsIGRlZmF1bHRDb250YWluZXJQcm9wcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyb3VwQ29tcG9uZW50O1xuICB9LCBbZ3JvdXBDb21wb25lbnQsIHN0YW5kYWxvbmUsIGNvbnRhaW5lckNvbXBvbmVudCwgY29udGFpbmVyUHJvcHNdKTtcbiAgdmFyIGV2ZW50cyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBXcmFwcGVyLmdldEFsbEV2ZW50cyhwcm9wcyk7XG4gIH0sIFtwcm9wc10pO1xuICB2YXIgcHJldmlvdXNQcm9wcyA9IEhvb2tzLnVzZVByZXZpb3VzUHJvcHMoaW5pdGlhbFByb3BzKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgZGlzbW91bnQgdG8ga2VlcCBzdGF0ZSBpbiBzeW5jXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpbml0aWFsUHJvcHMuYW5pbWF0ZSkge1xuICAgICAgICBzZXRBbmltYXRpb25TdGF0ZShwcmV2aW91c1Byb3BzLCBwcm9wcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3NldEFuaW1hdGlvblN0YXRlLCBwcmV2aW91c1Byb3BzLCBpbml0aWFsUHJvcHMsIHByb3BzXSk7XG5cbiAgaWYgKCFfaXNFbXB0eShldmVudHMpKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeVNoYXJlZEV2ZW50cywge1xuICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgICBldmVudEtleTogZXZlbnRLZXksXG4gICAgICBldmVudHM6IGV2ZW50cyxcbiAgICAgIGV4dGVybmFsRXZlbnRNdXRhdGlvbnM6IGV4dGVybmFsRXZlbnRNdXRhdGlvbnNcbiAgICB9LCBuZXdDaGlsZHJlbik7XG4gIH1cblxuICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNvbnRhaW5lciwgY29udGFpbmVyLnByb3BzLCBuZXdDaGlsZHJlbik7XG59O1xuXG5WaWN0b3J5R3JvdXAucHJvcFR5cGVzID0gX29iamVjdFNwcmVhZCh7fSwgQ29tbW9uUHJvcHMuYmFzZVByb3BzLCBDb21tb25Qcm9wcy5kYXRhUHJvcHMsIHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5ub2RlKSwgUHJvcFR5cGVzLm5vZGVdKSxcbiAgY29sb3I6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gIGNvbG9yU2NhbGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpLCBQcm9wVHlwZXMub25lT2YoW1wiZ3JheXNjYWxlXCIsIFwicXVhbGl0YXRpdmVcIiwgXCJoZWF0bWFwXCIsIFwid2FybVwiLCBcImNvb2xcIiwgXCJyZWRcIiwgXCJncmVlblwiLCBcImJsdWVcIl0pXSksXG4gIGhvcml6b250YWw6IFByb3BUeXBlcy5ib29sLFxuICBvZmZzZXQ6IFByb3BUeXBlcy5udW1iZXJcbn0pO1xuVmljdG9yeUdyb3VwLmRlZmF1bHRQcm9wcyA9IHtcbiAgY29udGFpbmVyQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KFZpY3RvcnlDb250YWluZXIsIG51bGwpLFxuICBncm91cENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwgbnVsbCksXG4gIHNhbXBsZXM6IDUwLFxuICBzb3J0T3JkZXI6IFwiYXNjZW5kaW5nXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRoZW1lOiBWaWN0b3J5VGhlbWUuZ3JheXNjYWxlXG59OyAvLyBXZSBuZWVkIHRvIGF0dGF0Y2ggdGhlIHN0YXRpYyBwcm9wZXJ0aWVzIHRvIHRoZSBtZW1vaXplZCB2ZXJzaW9uLCBvciBlbHNlXG4vLyBWaWN0b3J5Q2hhcnQgd2lsbCBub3QgYmUgYWJsZSB0byBnZXQgdGhpcyBjb21wb25lbnQncyByb2xlIHR5cGVcblxudmFyIFZpY3RvcnlHcm91cE1lbW8gPSBSZWFjdC5tZW1vKFZpY3RvcnlHcm91cCwgaXNFcXVhbCk7XG5WaWN0b3J5R3JvdXBNZW1vLmRpc3BsYXlOYW1lID0gXCJWaWN0b3J5R3JvdXBcIjtcblZpY3RvcnlHcm91cE1lbW8ucm9sZSA9IFwiZ3JvdXBcIjtcblZpY3RvcnlHcm91cE1lbW8uZXhwZWN0ZWRDb21wb25lbnRzID0gW1wiZ3JvdXBDb21wb25lbnRcIiwgXCJjb250YWluZXJDb21wb25lbnRcIiwgXCJsYWJlbENvbXBvbmVudFwiXTtcblZpY3RvcnlHcm91cE1lbW8uZ2V0Q2hpbGRyZW4gPSBnZXRDaGlsZHJlbjtcbmV4cG9ydCBkZWZhdWx0IFZpY3RvcnlHcm91cE1lbW87IiwiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaG9pc3ROb25SZWFjdFN0YXRpY3MgZnJvbSAnaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MnO1xuaW1wb3J0IHsgVmljdG9yeUdyb3VwIH0gZnJvbSAndmljdG9yeS1ncm91cCc7XG5pbXBvcnQgeyBDaGFydENvbnRhaW5lciB9IGZyb20gJy4uL0NoYXJ0Q29udGFpbmVyJztcbmltcG9ydCB7IGdldENsYXNzTmFtZSwgZ2V0VGhlbWUgfSBmcm9tICcuLi9DaGFydFV0aWxzJztcbmV4cG9ydCB2YXIgQ2hhcnRHcm91cFNvcnRPcmRlcjtcbihmdW5jdGlvbiAoQ2hhcnRHcm91cFNvcnRPcmRlcikge1xuICAgIENoYXJ0R3JvdXBTb3J0T3JkZXJbXCJhc2NlbmRpbmdcIl0gPSBcImFzY2VuZGluZ1wiO1xuICAgIENoYXJ0R3JvdXBTb3J0T3JkZXJbXCJkZXNjZW5kaW5nXCJdID0gXCJkZXNjZW5kaW5nXCI7XG59KShDaGFydEdyb3VwU29ydE9yZGVyIHx8IChDaGFydEdyb3VwU29ydE9yZGVyID0ge30pKTtcbmV4cG9ydCBjb25zdCBDaGFydEdyb3VwID0gKF9hKSA9PiB7XG4gICAgdmFyIHsgYXJpYURlc2MsIGFyaWFUaXRsZSwgY2hpbGRyZW4sIGNvbnRhaW5lckNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRDb250YWluZXIsIG51bGwpLCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIFxuICAgIC8vIGRlc3RydWN0dXJlIGxhc3RcbiAgICB0aGVtZSA9IGdldFRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCkgfSA9IF9hLCByZXN0ID0gX19yZXN0KF9hLCBbXCJhcmlhRGVzY1wiLCBcImFyaWFUaXRsZVwiLCBcImNoaWxkcmVuXCIsIFwiY29udGFpbmVyQ29tcG9uZW50XCIsIFwidGhlbWVDb2xvclwiLCBcInRoZW1lVmFyaWFudFwiLCBcInRoZW1lXCJdKTtcbiAgICAvLyBDbG9uZSBzbyB1c2VycyBjYW4gb3ZlcnJpZGUgY29udGFpbmVyIHByb3BzXG4gICAgY29uc3QgY29udGFpbmVyID0gUmVhY3QuY2xvbmVFbGVtZW50KGNvbnRhaW5lckNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgZGVzYzogYXJpYURlc2MsIHRpdGxlOiBhcmlhVGl0bGUsIHRoZW1lIH0sIGNvbnRhaW5lckNvbXBvbmVudC5wcm9wcyksIHsgY2xhc3NOYW1lOiBnZXRDbGFzc05hbWUoeyBjbGFzc05hbWU6IGNvbnRhaW5lckNvbXBvbmVudC5wcm9wcy5jbGFzc05hbWUgfSkgLy8gT3ZlcnJpZGUgVmljdG9yeUNvbnRhaW5lciBjbGFzcyBuYW1lXG4gICAgIH0pKTtcbiAgICAvLyBOb3RlOiBjb250YWluZXJDb21wb25lbnQgaXMgcmVxdWlyZWQgZm9yIHRoZW1lXG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFZpY3RvcnlHcm91cCwgT2JqZWN0LmFzc2lnbih7IGNvbnRhaW5lckNvbXBvbmVudDogY29udGFpbmVyLCB0aGVtZTogdGhlbWUgfSwgcmVzdCksIGNoaWxkcmVuKSk7XG59O1xuQ2hhcnRHcm91cC5kaXNwbGF5TmFtZSA9ICdDaGFydEdyb3VwJztcbi8vIE5vdGU6IFZpY3RvcnlHcm91cC5yb2xlIG11c3QgYmUgaG9pc3RlZFxuaG9pc3ROb25SZWFjdFN0YXRpY3MoQ2hhcnRHcm91cCwgVmljdG9yeUdyb3VwKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJ0R3JvdXAuanMubWFwIiwiZXhwb3J0ICogZnJvbSAnLi9DaGFydEdyb3VwJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImV4cG9ydCAqIGZyb20gJy4vQ2hhcnRMYWJlbCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tICcuL0NoYXJ0TGVnZW5kJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGhvaXN0Tm9uUmVhY3RTdGF0aWNzIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICdsb2Rhc2gvZGVmYXVsdHMnO1xuaW1wb3J0IHsgSGVscGVycywgVmljdG9yeUxhYmVsIH0gZnJvbSAndmljdG9yeS1jb3JlJztcbmltcG9ydCB7IENoYXJ0TGFiZWwgfSBmcm9tICcuLi9DaGFydExhYmVsJztcbmltcG9ydCB7IENoYXJ0TGVnZW5kVG9vbHRpcFN0eWxlcyB9IGZyb20gJy4uL0NoYXJ0VGhlbWUnO1xuZXhwb3J0IGNvbnN0IENoYXJ0TGVnZW5kVG9vbHRpcExhYmVsID0gKF9hKSA9PiB7XG4gICAgdmFyIHsgZHggPSAwLCBpbmRleCA9IDAsIGxlZ2VuZERhdGEsIGxlZ2VuZExhYmVsQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydExhYmVsLCBudWxsKSwgc3R5bGUsIHRleHQsIHRleHRBbmNob3IgPSAnZW5kJywgeCwgeSB9ID0gX2EsIFxuICAgIC8vIGRlc3RydWN0dXJlIGxhc3RcbiAgICByZXN0ID0gX19yZXN0KF9hLCBbXCJkeFwiLCBcImluZGV4XCIsIFwibGVnZW5kRGF0YVwiLCBcImxlZ2VuZExhYmVsQ29tcG9uZW50XCIsIFwic3R5bGVcIiwgXCJ0ZXh0XCIsIFwidGV4dEFuY2hvclwiLCBcInhcIiwgXCJ5XCJdKTtcbiAgICBjb25zdCBnZXRTdHlsZSA9IChzdHlsZXMpID0+IHtcbiAgICAgICAgY29uc3QgYXBwbHlEZWZhdWx0U3R5bGUgPSAoY3VzdG9tU3R5bGUpID0+IGRlZmF1bHRzKE9iamVjdC5hc3NpZ24oe30sIGN1c3RvbVN0eWxlKSwge1xuICAgICAgICAgICAgZmlsbDogQ2hhcnRMZWdlbmRUb29sdGlwU3R5bGVzLmxhYmVsLmZpbGxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHN0eWxlcykgPyBzdHlsZXMubWFwKGFwcGx5RGVmYXVsdFN0eWxlKSA6IGFwcGx5RGVmYXVsdFN0eWxlKHN0eWxlcyk7XG4gICAgfTtcbiAgICBjb25zdCBnZXRMZWdlbmRMYWJlbENvbXBvbmVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBsZWdlbmREYXRhICYmIGxlZ2VuZERhdGEubGVuZ3RoID8gbGVnZW5kRGF0YVtpbmRleF0ubmFtZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChsZWdlbmRMYWJlbENvbXBvbmVudCwge1xuICAgICAgICAgICAgc3R5bGU6IGdldFN0eWxlKHt9KSxcbiAgICAgICAgICAgIHRleHQ6IGxhYmVsLFxuICAgICAgICAgICAgdGV4dEFuY2hvcjogJ3N0YXJ0JyxcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgZ2V0VmFsdWVMYWJlbENvbXBvbmVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgX3ggPSB4ICsgSGVscGVycy5ldmFsdWF0ZVByb3AoZHgpO1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydExhYmVsLCBPYmplY3QuYXNzaWduKHsgc3R5bGU6IGdldFN0eWxlKHN0eWxlKSwgdGV4dDogdGV4dCwgdGV4dEFuY2hvcjogdGV4dEFuY2hvciwgeDogX3gsIHk6IHkgfSwgcmVzdCkpO1xuICAgIH07XG4gICAgY29uc3QgbGVnZW5kTGFiZWwgPSBnZXRMZWdlbmRMYWJlbENvbXBvbmVudCgpO1xuICAgIGNvbnN0IHZhbHVlTGFiZWwgPSBnZXRWYWx1ZUxhYmVsQ29tcG9uZW50KCk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICBsZWdlbmRMYWJlbCxcbiAgICAgICAgdmFsdWVMYWJlbCkpO1xufTtcbkNoYXJ0TGVnZW5kVG9vbHRpcExhYmVsLmRpc3BsYXlOYW1lID0gJ0NoYXJ0TGVnZW5kVG9vbHRpcExhYmVsJztcbi8vIE5vdGU6IFZpY3RvcnlMYWJlbC5yb2xlIG11c3QgYmUgaG9pc3RlZFxuaG9pc3ROb25SZWFjdFN0YXRpY3MoQ2hhcnRMZWdlbmRUb29sdGlwTGFiZWwsIFZpY3RvcnlMYWJlbCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFydExlZ2VuZFRvb2x0aXBMYWJlbC5qcy5tYXAiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBob2lzdE5vblJlYWN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSAndmljdG9yeS1jb3JlJztcbmltcG9ydCB7IFZpY3RvcnlMZWdlbmQgfSBmcm9tICd2aWN0b3J5LWxlZ2VuZCc7XG5pbXBvcnQgeyBDaGFydExhYmVsIH0gZnJvbSAnLi4vQ2hhcnRMYWJlbCc7XG5pbXBvcnQgeyBDaGFydExlZ2VuZCB9IGZyb20gJy4uL0NoYXJ0TGVnZW5kJztcbmltcG9ydCB7IENoYXJ0TGVnZW5kVG9vbHRpcExhYmVsIH0gZnJvbSAnLi9DaGFydExlZ2VuZFRvb2x0aXBMYWJlbCc7XG5pbXBvcnQgeyBDaGFydExlZ2VuZFRvb2x0aXBTdHlsZXMgfSBmcm9tICcuLi9DaGFydFRoZW1lJztcbmltcG9ydCB7IGdldExlZ2VuZFRvb2x0aXBEYXRhUHJvcHMsIGdldExlZ2VuZFRvb2x0aXBTaXplLCBnZXRMZWdlbmRUb29sdGlwVmlzaWJsZURhdGEsIGdldExlZ2VuZFRvb2x0aXBWaXNpYmxlVGV4dCwgZ2V0VGhlbWUgfSBmcm9tICcuLi9DaGFydFV0aWxzJztcbmV4cG9ydCBjb25zdCBDaGFydExlZ2VuZFRvb2x0aXBDb250ZW50ID0gKF9hKSA9PiB7XG4gICAgdmFyIHsgYWN0aXZlUG9pbnRzLCBjZW50ZXIsIGRhdHVtLCBkeCA9IDAsIGR5ID0gMCwgZmx5b3V0SGVpZ2h0LCBmbHlvdXRXaWR0aCwgaGVpZ2h0LCBsYWJlbENvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRMZWdlbmRUb29sdGlwTGFiZWwsIG51bGwpLCBsZWdlbmRDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0TGVnZW5kLCBudWxsKSwgbGVnZW5kRGF0YSwgdGV4dCwgdGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCB0aXRsZSwgdGl0bGVDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0TGFiZWwsIG51bGwpLCB3aWR0aCwgXG4gICAgLy8gZGVzdHJ1Y3R1cmUgbGFzdFxuICAgIHRoZW1lID0gZ2V0VGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSB9ID0gX2EsIHJlc3QgPSBfX3Jlc3QoX2EsIFtcImFjdGl2ZVBvaW50c1wiLCBcImNlbnRlclwiLCBcImRhdHVtXCIsIFwiZHhcIiwgXCJkeVwiLCBcImZseW91dEhlaWdodFwiLCBcImZseW91dFdpZHRoXCIsIFwiaGVpZ2h0XCIsIFwibGFiZWxDb21wb25lbnRcIiwgXCJsZWdlbmRDb21wb25lbnRcIiwgXCJsZWdlbmREYXRhXCIsIFwidGV4dFwiLCBcInRoZW1lQ29sb3JcIiwgXCJ0aGVtZVZhcmlhbnRcIiwgXCJ0aXRsZVwiLCBcInRpdGxlQ29tcG9uZW50XCIsIFwid2lkdGhcIiwgXCJ0aGVtZVwiXSk7XG4gICAgY29uc3QgcG9pbnRlckxlbmd0aCA9IHRoZW1lICYmIHRoZW1lLnRvb2x0aXAgPyBIZWxwZXJzLmV2YWx1YXRlUHJvcCh0aGVtZS50b29sdGlwLnBvaW50ZXJMZW5ndGgpIDogMTA7XG4gICAgY29uc3QgbGVnZW5kUHJvcHMgPSBnZXRMZWdlbmRUb29sdGlwRGF0YVByb3BzKGxlZ2VuZENvbXBvbmVudC5wcm9wcyk7XG4gICAgY29uc3QgdmlzaWJsZUxlZ2VuZERhdGEgPSBnZXRMZWdlbmRUb29sdGlwVmlzaWJsZURhdGEoe1xuICAgICAgICBhY3RpdmVQb2ludHMsXG4gICAgICAgIGNvbG9yU2NhbGU6IGxlZ2VuZFByb3BzLmNvbG9yU2NhbGUsXG4gICAgICAgIGxlZ2VuZERhdGEsXG4gICAgICAgIHRleHQsXG4gICAgICAgIHRoZW1lXG4gICAgfSk7XG4gICAgLy8gQ29tcG9uZW50IG9mZnNldHNcbiAgICBjb25zdCBsZWdlbmRPZmZzZXRYID0gMDtcbiAgICBjb25zdCBsZWdlbmRPZmZzZXRZID0gdGl0bGUgPyA1IDogLTEwO1xuICAgIGNvbnN0IHRpdGxlT2Zmc2V0WCA9IDEwO1xuICAgIGNvbnN0IHRpdGxlT2Zmc2V0WSA9IDA7XG4gICAgLy8gUmV0dXJucyB4IHBvc2l0aW9uIG9mIGZseW91dFxuICAgIGNvbnN0IGdldFggPSAoKSA9PiB7XG4gICAgICAgIGlmICghKGNlbnRlciB8fCBmbHlvdXRXaWR0aCB8fCB3aWR0aCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHggPSByZXN0Lng7XG4gICAgICAgICAgICByZXR1cm4geCA/IHggOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgX2ZseW91dFdpZHRoID0gSGVscGVycy5ldmFsdWF0ZVByb3AoZmx5b3V0V2lkdGgpO1xuICAgICAgICBpZiAod2lkdGggPiBjZW50ZXIueCArIF9mbHlvdXRXaWR0aCArIHBvaW50ZXJMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjZW50ZXIueCArIENoYXJ0TGVnZW5kVG9vbHRpcFN0eWxlcy5mbHlvdXQucGFkZGluZyAvIDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2VudGVyLnggPCBfZmx5b3V0V2lkdGggKyBwb2ludGVyTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gQ2hhcnRMZWdlbmRUb29sdGlwU3R5bGVzLmZseW91dC5wYWRkaW5nIC8gMiAtIHBvaW50ZXJMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY2VudGVyLnggLSBfZmx5b3V0V2lkdGg7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIFJldHVybnMgeSBwb3NpdGlvblxuICAgIGNvbnN0IGdldFkgPSAoKSA9PiB7XG4gICAgICAgIGlmICghKGNlbnRlciB8fCBmbHlvdXRIZWlnaHQgfHwgaGVpZ2h0KSkge1xuICAgICAgICAgICAgY29uc3QgeSA9IHJlc3QueTtcbiAgICAgICAgICAgIHJldHVybiB5ID8geSA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBfZmx5b3V0SGVpZ2h0ID0gSGVscGVycy5ldmFsdWF0ZVByb3AoZmx5b3V0SGVpZ2h0KTtcbiAgICAgICAgaWYgKGNlbnRlci55IDwgX2ZseW91dEhlaWdodCAvIDIpIHtcbiAgICAgICAgICAgIHJldHVybiBDaGFydExlZ2VuZFRvb2x0aXBTdHlsZXMuZmx5b3V0LnBhZGRpbmcgLyAyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNlbnRlci55ID4gaGVpZ2h0IC0gX2ZseW91dEhlaWdodCAvIDIpIHtcbiAgICAgICAgICAgIHJldHVybiBoZWlnaHQgLSBfZmx5b3V0SGVpZ2h0ICsgQ2hhcnRMZWdlbmRUb29sdGlwU3R5bGVzLmZseW91dC5wYWRkaW5nIC8gMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjZW50ZXIueSAtIF9mbHlvdXRIZWlnaHQgLyAyICsgQ2hhcnRMZWdlbmRUb29sdGlwU3R5bGVzLmZseW91dC5wYWRkaW5nIC8gMjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gTWluICYgbWF4IGRpbWVuc2lvbnMgZG8gbm90IGluY2x1ZGUgZmx5b3V0IHBhZGRpbmdcbiAgICBjb25zdCBtYXhMZWdlbmREaW1lbnNpb25zID0gZ2V0TGVnZW5kVG9vbHRpcFNpemUoe1xuICAgICAgICBsZWdlbmREYXRhOiB2aXNpYmxlTGVnZW5kRGF0YSxcbiAgICAgICAgbGVnZW5kUHJvcHMsXG4gICAgICAgIHRleHQ6IGdldExlZ2VuZFRvb2x0aXBWaXNpYmxlVGV4dCh7IGFjdGl2ZVBvaW50cywgbGVnZW5kRGF0YSwgdGV4dCB9KSxcbiAgICAgICAgdGhlbWVcbiAgICB9KTtcbiAgICBjb25zdCBtaW5MZWdlbmREaW1lbnNpb25zID0gZ2V0TGVnZW5kVG9vbHRpcFNpemUoe1xuICAgICAgICBsZWdlbmREYXRhOiBbeyBuYW1lOiAnJyB9XSxcbiAgICAgICAgbGVnZW5kUHJvcHMsXG4gICAgICAgIHRoZW1lXG4gICAgfSk7XG4gICAgLy8gUmV0dXJucyB0aGUgbGFiZWwgY29tcG9uZW50XG4gICAgY29uc3QgZ2V0TGFiZWxDb21wb25lbnQgPSAoKSA9PiBSZWFjdC5jbG9uZUVsZW1lbnQobGFiZWxDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oeyBkeDogbWF4TGVnZW5kRGltZW5zaW9ucy53aWR0aCAtIG1pbkxlZ2VuZERpbWVuc2lvbnMud2lkdGgsIGxlZ2VuZERhdGE6IHZpc2libGVMZWdlbmREYXRhIH0sIGxhYmVsQ29tcG9uZW50LnByb3BzKSk7XG4gICAgLy8gUmV0dXJucyB0aGUgdGl0bGUgY29tcG9uZW50XG4gICAgY29uc3QgZ2V0VGl0bGVDb21wb25lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IF90aXRsZSA9IHRpdGxlIGluc3RhbmNlb2YgRnVuY3Rpb24gPyB0aXRsZShkYXR1bSkgOiB0aXRsZTtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudCh0aXRsZUNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgZmlsbDogQ2hhcnRMZWdlbmRUb29sdGlwU3R5bGVzLmxhYmVsLmZpbGwsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogQ2hhcnRMZWdlbmRUb29sdGlwU3R5bGVzLmxhYmVsLmZvbnRXZWlnaHRcbiAgICAgICAgICAgIH0sIHRleHQ6IF90aXRsZSwgdGV4dEFuY2hvcjogJ3N0YXJ0JywgeDogZ2V0WCgpICsgdGl0bGVPZmZzZXRYICsgSGVscGVycy5ldmFsdWF0ZVByb3AoZHgpLCB5OiBnZXRZKCkgKyB0aXRsZU9mZnNldFkgKyBIZWxwZXJzLmV2YWx1YXRlUHJvcChkeSkgfSwgdGl0bGVDb21wb25lbnQucHJvcHMpKTtcbiAgICB9O1xuICAgIC8vIFJldHVybnMgdGhlIGxlZ2ViZCBjb21wb25lbnRcbiAgICBjb25zdCBnZXRMZWdlbmRDb21wb25lbnQgPSAoKSA9PiBSZWFjdC5jbG9uZUVsZW1lbnQobGVnZW5kQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKHsgZGF0YTogZ2V0TGVnZW5kVG9vbHRpcFZpc2libGVEYXRhKHtcbiAgICAgICAgICAgIGFjdGl2ZVBvaW50cyxcbiAgICAgICAgICAgIGNvbG9yU2NhbGU6IGxlZ2VuZFByb3BzLmNvbG9yU2NhbGUsXG4gICAgICAgICAgICBsZWdlbmREYXRhLFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHRleHRBc0xlZ2VuZERhdGE6IHRydWUsXG4gICAgICAgICAgICB0aGVtZVxuICAgICAgICB9KSwgbGFiZWxDb21wb25lbnQ6IGdldExhYmVsQ29tcG9uZW50KCksIHN0YW5kYWxvbmU6IGZhbHNlLCB0aGVtZSwgeDogZ2V0WCgpICsgbGVnZW5kT2Zmc2V0WCArIEhlbHBlcnMuZXZhbHVhdGVQcm9wKGR4KSwgeTogZ2V0WSgpICsgbGVnZW5kT2Zmc2V0WSArIEhlbHBlcnMuZXZhbHVhdGVQcm9wKGR5KSB9LCBsZWdlbmRQcm9wcykpO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgZ2V0VGl0bGVDb21wb25lbnQoKSxcbiAgICAgICAgZ2V0TGVnZW5kQ29tcG9uZW50KCkpKTtcbn07XG5DaGFydExlZ2VuZFRvb2x0aXBDb250ZW50LmRpc3BsYXlOYW1lID0gJ0NoYXJ0TGVnZW5kVG9vbHRpcENvbnRlbnQnO1xuLy8gTm90ZTogVmljdG9yeUxlZ2VuZC5yb2xlIG11c3QgYmUgaG9pc3RlZCwgYnV0IGdldEJhc2VQcm9wcyBjYXVzZXMgZXJyb3Igd2l0aCBDaGFydFZvcm9ub2lDb250YWluZXJcbmhvaXN0Tm9uUmVhY3RTdGF0aWNzKENoYXJ0TGVnZW5kVG9vbHRpcENvbnRlbnQsIFZpY3RvcnlMZWdlbmQsIHsgZ2V0QmFzZVByb3BzOiB0cnVlIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2hhcnRMZWdlbmRUb29sdGlwQ29udGVudC5qcy5tYXAiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBob2lzdE5vblJlYWN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSAndmljdG9yeS1jb3JlJztcbmltcG9ydCB7IFZpY3RvcnlUb29sdGlwIH0gZnJvbSAndmljdG9yeS10b29sdGlwJztcbmltcG9ydCB7IENoYXJ0Q3Vyc29yVG9vbHRpcCB9IGZyb20gJy4uL0NoYXJ0Q3Vyc29yVG9vbHRpcCc7XG5pbXBvcnQgeyBDaGFydExlZ2VuZFRvb2x0aXBDb250ZW50IH0gZnJvbSAnLi9DaGFydExlZ2VuZFRvb2x0aXBDb250ZW50JztcbmltcG9ydCB7IENoYXJ0TGVnZW5kVG9vbHRpcFN0eWxlcyB9IGZyb20gJy4uL0NoYXJ0VGhlbWUnO1xuaW1wb3J0IHsgQ2hhcnRUb29sdGlwIH0gZnJvbSAnLi4vQ2hhcnRUb29sdGlwJztcbmltcG9ydCB7IGdldExlZ2VuZFRvb2x0aXBEYXRhUHJvcHMsIGdldExlZ2VuZFRvb2x0aXBTaXplLCBnZXRMZWdlbmRUb29sdGlwVmlzaWJsZURhdGEsIGdldExlZ2VuZFRvb2x0aXBWaXNpYmxlVGV4dCwgZ2V0VGhlbWUgfSBmcm9tICcuLi9DaGFydFV0aWxzJztcbmV4cG9ydCBjb25zdCBDaGFydExlZ2VuZFRvb2x0aXAgPSAoX2EpID0+IHtcbiAgICB2YXIgeyBhY3RpdmVQb2ludHMsIGRhdHVtLCBjZW50ZXIgPSB7IHg6IDAsIHk6IDAgfSwgZmx5b3V0SGVpZ2h0LCBmbHlvdXRXaWR0aCwgaGVpZ2h0LCBpc0N1cnNvclRvb2x0aXAgPSB0cnVlLCBsYWJlbENvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRMZWdlbmRUb29sdGlwQ29udGVudCwgbnVsbCksIGxlZ2VuZERhdGEsIHRleHQsIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgdGl0bGUsIHdpZHRoLCBcbiAgICAvLyBkZXN0cnVjdHVyZSBsYXN0XG4gICAgdGhlbWUgPSBnZXRUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpIH0gPSBfYSwgcmVzdCA9IF9fcmVzdChfYSwgW1wiYWN0aXZlUG9pbnRzXCIsIFwiZGF0dW1cIiwgXCJjZW50ZXJcIiwgXCJmbHlvdXRIZWlnaHRcIiwgXCJmbHlvdXRXaWR0aFwiLCBcImhlaWdodFwiLCBcImlzQ3Vyc29yVG9vbHRpcFwiLCBcImxhYmVsQ29tcG9uZW50XCIsIFwibGVnZW5kRGF0YVwiLCBcInRleHRcIiwgXCJ0aGVtZUNvbG9yXCIsIFwidGhlbWVWYXJpYW50XCIsIFwidGl0bGVcIiwgXCJ3aWR0aFwiLCBcInRoZW1lXCJdKTtcbiAgICBjb25zdCBwb2ludGVyTGVuZ3RoID0gdGhlbWUgJiYgdGhlbWUudG9vbHRpcCA/IEhlbHBlcnMuZXZhbHVhdGVQcm9wKHRoZW1lLnRvb2x0aXAucG9pbnRlckxlbmd0aCkgOiAxMDtcbiAgICBjb25zdCBsZWdlbmRUb29sdGlwUHJvcHMgPSAoKSA9PiAoe1xuICAgICAgICBsZWdlbmREYXRhOiBnZXRMZWdlbmRUb29sdGlwVmlzaWJsZURhdGEoeyBhY3RpdmVQb2ludHMsIGxlZ2VuZERhdGEsIHRleHQsIHRoZW1lIH0pLFxuICAgICAgICBsZWdlbmRQcm9wczogZ2V0TGVnZW5kVG9vbHRpcERhdGFQcm9wcyhsYWJlbENvbXBvbmVudC5wcm9wcy5sZWdlbmRDb21wb25lbnQpLFxuICAgICAgICB0ZXh0OiBnZXRMZWdlbmRUb29sdGlwVmlzaWJsZVRleHQoeyBhY3RpdmVQb2ludHMsIGxlZ2VuZERhdGEsIHRleHQgfSksXG4gICAgICAgIHRoZW1lXG4gICAgfSk7XG4gICAgLy8gUmV0dXJucyBmbHlvdXQgaGVpZ2h0IGJhc2VkIG9uIGxlZ2VuZCBzaXplXG4gICAgY29uc3QgZ2V0Rmx5b3V0SGVpZ2h0ID0gKHsgaGVpZ2h0IH0pID0+IHtcbiAgICAgICAgY29uc3QgX2ZseW91dEhlaWdodCA9IGhlaWdodCArIENoYXJ0TGVnZW5kVG9vbHRpcFN0eWxlcy5mbHlvdXQucGFkZGluZztcbiAgICAgICAgcmV0dXJuIHRpdGxlID8gX2ZseW91dEhlaWdodCA6IF9mbHlvdXRIZWlnaHQgLSAxMDtcbiAgICB9O1xuICAgIC8vIFJldHVybnMgZmx5b3V0IHdpZHRoIGJhc2VkIG9uIGxlZ2VuZCBzaXplXG4gICAgY29uc3QgZ2V0Rmx5b3V0V2lkdGggPSAoeyB3aWR0aCB9KSA9PiB3aWR0aCArIENoYXJ0TGVnZW5kVG9vbHRpcFN0eWxlcy5mbHlvdXQucGFkZGluZztcbiAgICAvLyBSZXR1cm5zIHRoZSB0b29sdGlwIGNvbnRlbnQgY29tcG9uZW50XG4gICAgY29uc3QgZ2V0VG9vbHRpcENvbnRlbnRDb21wb25lbnQgPSAocHJvcHMpID0+IFJlYWN0LmNsb25lRWxlbWVudChsYWJlbENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7IGNlbnRlciwgZmx5b3V0SGVpZ2h0OiBmbHlvdXRIZWlnaHQgfHwgZ2V0Rmx5b3V0SGVpZ2h0KHByb3BzKSwgZmx5b3V0V2lkdGg6IGZseW91dFdpZHRoIHx8IGdldEZseW91dFdpZHRoKHByb3BzKSwgaGVpZ2h0LFxuICAgICAgICBsZWdlbmREYXRhLFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgd2lkdGggfSwgbGFiZWxDb21wb25lbnQucHJvcHMpKTtcbiAgICAvLyBSZXR1cm5zIHRoZSB0b29sdGlwIGNvbXBvbmVudFxuICAgIGNvbnN0IGdldFRvb2x0aXBDb21wb25lbnQgPSAoKSA9PiB7XG4gICAgICAgIC8vIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGFjdGl2ZSwgdmlzaWJsZSBpdGVtIG9yIGVsc2UgdGhpcyB3aWxsIHJldHVybiB6ZXJvIGZvciBoZWlnaHQgJiB3aWR0aC5cbiAgICAgICAgY29uc3QgbGVnZW5kU2l6ZSA9IGdldExlZ2VuZFRvb2x0aXBTaXplKGxlZ2VuZFRvb2x0aXBQcm9wcygpKTtcbiAgICAgICAgaWYgKGxlZ2VuZFNpemUuaGVpZ2h0ID09PSAwICYmIGxlZ2VuZFNpemUud2lkdGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IF9mbHlvdXRXaWR0aCA9IGdldEZseW91dFdpZHRoKGxlZ2VuZFNpemUpO1xuICAgICAgICBjb25zdCB0b29sdGlwQ29tcG9uZW50ID0gaXNDdXJzb3JUb29sdGlwID8gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydEN1cnNvclRvb2x0aXAsIG51bGwpIDogUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydFRvb2x0aXAsIG51bGwpO1xuICAgICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KHRvb2x0aXBDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgYWN0aXZlUG9pbnRzLFxuICAgICAgICAgICAgY2VudGVyLFxuICAgICAgICAgICAgZGF0dW0sIGZseW91dEhlaWdodDogZmx5b3V0SGVpZ2h0IHx8IGdldEZseW91dEhlaWdodChsZWdlbmRTaXplKSwgZmx5b3V0V2lkdGg6IGZseW91dFdpZHRoIHx8IGdldEZseW91dFdpZHRoKGxlZ2VuZFNpemUpLCBoZWlnaHQsIGxhYmVsQ29tcG9uZW50OiBnZXRUb29sdGlwQ29udGVudENvbXBvbmVudChsZWdlbmRTaXplKSB9LCAoZmx5b3V0V2lkdGggPT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgICAgICBzaG93UG9pbnRlcjogd2lkdGggPiBfZmx5b3V0V2lkdGggKyBjZW50ZXIueCArIHBvaW50ZXJMZW5ndGggfHwgY2VudGVyLnggPiBfZmx5b3V0V2lkdGggKyBwb2ludGVyTGVuZ3RoXG4gICAgICAgIH0pKSwgeyB0ZXh0LFxuICAgICAgICAgICAgdGhlbWUsXG4gICAgICAgICAgICB3aWR0aCB9KSwgcmVzdCkpO1xuICAgIH07XG4gICAgcmV0dXJuIGdldFRvb2x0aXBDb21wb25lbnQoKTtcbn07XG5DaGFydExlZ2VuZFRvb2x0aXAuZGlzcGxheU5hbWUgPSAnQ2hhcnRMZWdlbmRUb29sdGlwJztcbi8vIE5vdGU6IFZpY3RvcnlUb29sdGlwLmRlZmF1bHRFdmVudHMgbXVzdCBiZSBob2lzdGVkXG5ob2lzdE5vblJlYWN0U3RhdGljcyhDaGFydExlZ2VuZFRvb2x0aXAsIFZpY3RvcnlUb29sdGlwKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJ0TGVnZW5kVG9vbHRpcC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tICcuL0NoYXJ0TGVnZW5kVG9vbHRpcCc7XG5leHBvcnQgKiBmcm9tICcuL0NoYXJ0TGVnZW5kVG9vbHRpcENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFydExlZ2VuZFRvb2x0aXBMYWJlbCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgX2lzTmlsIGZyb20gXCJsb2Rhc2gvaXNOaWxcIjtcbmltcG9ydCBfYXNzaWduIGZyb20gXCJsb2Rhc2gvYXNzaWduXCI7XG5pbXBvcnQgeyBIZWxwZXJzLCBMYWJlbEhlbHBlcnMsIERhdGEsIERvbWFpbiwgU2NhbGUgfSBmcm9tIFwidmljdG9yeS1jb3JlXCI7XG5cbnZhciBnZXRDYWxjdWxhdGVkVmFsdWVzID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciBkYXRhID0gRGF0YS5nZXREYXRhKHByb3BzKTtcblxuICBpZiAoZGF0YS5sZW5ndGggPCAyKSB7XG4gICAgZGF0YSA9IFtdO1xuICB9XG5cbiAgdmFyIHJhbmdlID0ge1xuICAgIHg6IEhlbHBlcnMuZ2V0UmFuZ2UocHJvcHMsIFwieFwiKSxcbiAgICB5OiBIZWxwZXJzLmdldFJhbmdlKHByb3BzLCBcInlcIilcbiAgfTtcbiAgdmFyIGRvbWFpbiA9IHtcbiAgICB4OiBEb21haW4uZ2V0RG9tYWluKHByb3BzLCBcInhcIiksXG4gICAgeTogRG9tYWluLmdldERvbWFpbihwcm9wcywgXCJ5XCIpXG4gIH07XG4gIHZhciBzY2FsZSA9IHtcbiAgICB4OiBTY2FsZS5nZXRCYXNlU2NhbGUocHJvcHMsIFwieFwiKS5kb21haW4oZG9tYWluLngpLnJhbmdlKHByb3BzLmhvcml6b250YWwgPyByYW5nZS55IDogcmFuZ2UueCksXG4gICAgeTogU2NhbGUuZ2V0QmFzZVNjYWxlKHByb3BzLCBcInlcIikuZG9tYWluKGRvbWFpbi55KS5yYW5nZShwcm9wcy5ob3Jpem9udGFsID8gcmFuZ2UueCA6IHJhbmdlLnkpXG4gIH07XG4gIHZhciBvcmlnaW4gPSBwcm9wcy5wb2xhciA/IHByb3BzLm9yaWdpbiB8fCBIZWxwZXJzLmdldFBvbGFyT3JpZ2luKHByb3BzKSA6IHVuZGVmaW5lZDtcbiAgdmFyIGRlZmF1bHRTdHlsZXMgPSBIZWxwZXJzLmdldERlZmF1bHRTdHlsZXMocHJvcHMsIFwibGluZVwiKTtcbiAgdmFyIHN0eWxlID0gSGVscGVycy5nZXRTdHlsZXMocHJvcHMuc3R5bGUsIGRlZmF1bHRTdHlsZXMpO1xuICByZXR1cm4ge1xuICAgIGRvbWFpbjogZG9tYWluLFxuICAgIGRhdGE6IGRhdGEsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBvcmlnaW46IG9yaWdpblxuICB9O1xufTtcblxuZXhwb3J0IHZhciBnZXRCYXNlUHJvcHMgPSBmdW5jdGlvbiAocHJvcHMsIGZhbGxiYWNrUHJvcHMpIHtcbiAgdmFyIG1vZGlmaWVkUHJvcHMgPSBIZWxwZXJzLm1vZGlmeVByb3BzKHByb3BzLCBmYWxsYmFja1Byb3BzLCBcImxpbmVcIik7XG4gIHByb3BzID0gX2Fzc2lnbih7fSwgbW9kaWZpZWRQcm9wcywgZ2V0Q2FsY3VsYXRlZFZhbHVlcyhtb2RpZmllZFByb3BzKSk7XG4gIHZhciBfcHJvcHMgPSBwcm9wcyxcbiAgICAgIGRhdGEgPSBfcHJvcHMuZGF0YSxcbiAgICAgIGRvbWFpbiA9IF9wcm9wcy5kb21haW4sXG4gICAgICBldmVudHMgPSBfcHJvcHMuZXZlbnRzLFxuICAgICAgZ3JvdXBDb21wb25lbnQgPSBfcHJvcHMuZ3JvdXBDb21wb25lbnQsXG4gICAgICBoZWlnaHQgPSBfcHJvcHMuaGVpZ2h0LFxuICAgICAgaG9yaXpvbnRhbCA9IF9wcm9wcy5ob3Jpem9udGFsLFxuICAgICAgaW50ZXJwb2xhdGlvbiA9IF9wcm9wcy5pbnRlcnBvbGF0aW9uLFxuICAgICAgb3JpZ2luID0gX3Byb3BzLm9yaWdpbixcbiAgICAgIHBhZGRpbmcgPSBfcHJvcHMucGFkZGluZyxcbiAgICAgIHBvbGFyID0gX3Byb3BzLnBvbGFyLFxuICAgICAgc2NhbGUgPSBfcHJvcHMuc2NhbGUsXG4gICAgICBzaGFyZWRFdmVudHMgPSBfcHJvcHMuc2hhcmVkRXZlbnRzLFxuICAgICAgc3RhbmRhbG9uZSA9IF9wcm9wcy5zdGFuZGFsb25lLFxuICAgICAgc3R5bGUgPSBfcHJvcHMuc3R5bGUsXG4gICAgICB0aGVtZSA9IF9wcm9wcy50aGVtZSxcbiAgICAgIHdpZHRoID0gX3Byb3BzLndpZHRoLFxuICAgICAgbGFiZWxzID0gX3Byb3BzLmxhYmVscyxcbiAgICAgIG5hbWUgPSBfcHJvcHMubmFtZSxcbiAgICAgIGRpc2FibGVJbmxpbmVTdHlsZXMgPSBfcHJvcHMuZGlzYWJsZUlubGluZVN0eWxlcztcbiAgdmFyIGluaXRpYWxDaGlsZFByb3BzID0ge1xuICAgIHBhcmVudDoge1xuICAgICAgc3R5bGU6IHN0eWxlLnBhcmVudCxcbiAgICAgIHNjYWxlOiBzY2FsZSxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICBkb21haW46IGRvbWFpbixcbiAgICAgIHN0YW5kYWxvbmU6IHN0YW5kYWxvbmUsXG4gICAgICBwb2xhcjogcG9sYXIsXG4gICAgICBvcmlnaW46IG9yaWdpbixcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBob3Jpem9udGFsOiBob3Jpem9udGFsXG4gICAgfSxcbiAgICBhbGw6IHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgaG9yaXpvbnRhbDogaG9yaXpvbnRhbCxcbiAgICAgICAgcG9sYXI6IHBvbGFyLFxuICAgICAgICBvcmlnaW46IG9yaWdpbixcbiAgICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBpbnRlcnBvbGF0aW9uOiBpbnRlcnBvbGF0aW9uLFxuICAgICAgICBncm91cENvbXBvbmVudDogZ3JvdXBDb21wb25lbnQsXG4gICAgICAgIHN0eWxlOiBkaXNhYmxlSW5saW5lU3R5bGVzID8ge30gOiBzdHlsZS5kYXRhLFxuICAgICAgICB0aGVtZTogdGhlbWUsXG4gICAgICAgIGRpc2FibGVJbmxpbmVTdHlsZXM6IGRpc2FibGVJbmxpbmVTdHlsZXNcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBkYXRhLnJlZHVjZShmdW5jdGlvbiAoY2hpbGRQcm9wcywgZGF0dW0sIGluZGV4KSB7XG4gICAgdmFyIHRleHQgPSBMYWJlbEhlbHBlcnMuZ2V0VGV4dChwcm9wcywgZGF0dW0sIGluZGV4KTtcblxuICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQgJiYgdGV4dCAhPT0gbnVsbCB8fCBsYWJlbHMgJiYgKGV2ZW50cyB8fCBzaGFyZWRFdmVudHMpKSB7XG4gICAgICB2YXIgZXZlbnRLZXkgPSAhX2lzTmlsKGRhdHVtLmV2ZW50S2V5KSA/IGRhdHVtLmV2ZW50S2V5IDogaW5kZXg7XG4gICAgICBjaGlsZFByb3BzW2V2ZW50S2V5XSA9IHtcbiAgICAgICAgbGFiZWxzOiBMYWJlbEhlbHBlcnMuZ2V0UHJvcHMocHJvcHMsIGluZGV4KVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hpbGRQcm9wcztcbiAgfSwgaW5pdGlhbENoaWxkUHJvcHMpO1xufTsiLCJpbXBvcnQgKiBhcyBkM1NoYXBlIGZyb20gXCJkMy1zaGFwZVwiO1xuXG52YXIgZGVmaW5lZCA9IGZ1bmN0aW9uIChkKSB7XG4gIHZhciB5ID0gZC5feTEgIT09IHVuZGVmaW5lZCA/IGQuX3kxIDogZC5feTtcbiAgcmV0dXJuIHkgIT09IG51bGwgJiYgeSAhPT0gdW5kZWZpbmVkICYmIGQuX3kwICE9PSBudWxsO1xufTtcblxudmFyIGdldFhBY2Nlc3NvciA9IGZ1bmN0aW9uIChzY2FsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGQpIHtcbiAgICByZXR1cm4gc2NhbGUueChkLl94MSAhPT0gdW5kZWZpbmVkID8gZC5feDEgOiBkLl94KTtcbiAgfTtcbn07XG5cbnZhciBnZXRZQWNjZXNzb3IgPSBmdW5jdGlvbiAoc2NhbGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChkKSB7XG4gICAgcmV0dXJuIHNjYWxlLnkoZC5feTEgIT09IHVuZGVmaW5lZCA/IGQuX3kxIDogZC5feSk7XG4gIH07XG59O1xuXG52YXIgZ2V0QW5nbGVBY2Nlc3NvciA9IGZ1bmN0aW9uIChzY2FsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGQpIHtcbiAgICB2YXIgeCA9IHNjYWxlLngoZC5feDEgIT09IHVuZGVmaW5lZCA/IGQuX3gxIDogZC5feCk7XG4gICAgcmV0dXJuIC0xICogeCArIE1hdGguUEkgLyAyO1xuICB9O1xufTtcblxudmFyIHRvTmV3TmFtZSA9IGZ1bmN0aW9uIChpbnRlcnBvbGF0aW9uKSB7XG4gIC8vIGQzIHNoYXBlIGNoYW5nZWQgdGhlIG5hbWluZyBzY2hlbWUgZm9yIGludGVycG9sYXRvcnMgZnJvbSBcImJhc2lzXCIgLT4gXCJjdXJ2ZUJhc2lzXCIgZXRjLlxuICB2YXIgY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIHMgJiYgc1swXS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKTtcbiAgfTtcblxuICByZXR1cm4gXCJjdXJ2ZVwiLmNvbmNhdChjYXBpdGFsaXplKGludGVycG9sYXRpb24pKTtcbn07XG5cbmV4cG9ydCB2YXIgZ2V0TGluZUZ1bmN0aW9uID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHZhciBwb2xhciA9IHByb3BzLnBvbGFyLFxuICAgICAgc2NhbGUgPSBwcm9wcy5zY2FsZSxcbiAgICAgIGhvcml6b250YWwgPSBwcm9wcy5ob3Jpem9udGFsO1xuICB2YXIgZGVmYXVsdE9wZW5DdXJ2ZSA9IHBvbGFyID8gZmFsc2UgOiB0cnVlO1xuICB2YXIgb3BlbkN1cnZlID0gcHJvcHMub3BlbkN1cnZlID09PSB1bmRlZmluZWQgPyBkZWZhdWx0T3BlbkN1cnZlIDogcHJvcHMub3BlbkN1cnZlO1xuICB2YXIgaW50ZXJwb2xhdGlvbkZ1bmN0aW9uID0gdHlwZW9mIHByb3BzLmludGVycG9sYXRpb24gPT09IFwiZnVuY3Rpb25cIiAmJiBwcm9wcy5pbnRlcnBvbGF0aW9uO1xuICB2YXIgaW50ZXJwb2xhdGlvbk5hbWUgPSB0eXBlb2YgcHJvcHMuaW50ZXJwb2xhdGlvbiA9PT0gXCJzdHJpbmdcIiAmJiAoIW9wZW5DdXJ2ZSA/IFwiXCIuY29uY2F0KHRvTmV3TmFtZShwcm9wcy5pbnRlcnBvbGF0aW9uKSwgXCJDbG9zZWRcIikgOiB0b05ld05hbWUocHJvcHMuaW50ZXJwb2xhdGlvbikpO1xuICByZXR1cm4gcG9sYXIgPyBkM1NoYXBlLmxpbmVSYWRpYWwoKS5kZWZpbmVkKGRlZmluZWQpLmN1cnZlKGludGVycG9sYXRpb25GdW5jdGlvbiB8fCBkM1NoYXBlW2ludGVycG9sYXRpb25OYW1lXSkuYW5nbGUoZ2V0QW5nbGVBY2Nlc3NvcihzY2FsZSkpLnJhZGl1cyhnZXRZQWNjZXNzb3Ioc2NhbGUpKSA6IGQzU2hhcGUubGluZSgpLmRlZmluZWQoZGVmaW5lZCkuY3VydmUoaW50ZXJwb2xhdGlvbkZ1bmN0aW9uIHx8IGQzU2hhcGVbaW50ZXJwb2xhdGlvbk5hbWVdKS54KGhvcml6b250YWwgPyBnZXRZQWNjZXNzb3Ioc2NhbGUpIDogZ2V0WEFjY2Vzc29yKHNjYWxlKSkueShob3Jpem9udGFsID8gZ2V0WEFjY2Vzc29yKHNjYWxlKSA6IGdldFlBY2Nlc3NvcihzY2FsZSkpO1xufTsiLCJpbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHsgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTsgfSkpOyB9IG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbi8qZXNsaW50IG5vLW1hZ2ljLW51bWJlcnM6IFtcImVycm9yXCIsIHsgXCJpZ25vcmVcIjogWy0xLCAwLCAxLCAyXSB9XSovXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgeyBIZWxwZXJzLCBDb21tb25Qcm9wcywgUGF0aCwgTGluZUhlbHBlcnMgfSBmcm9tIFwidmljdG9yeS1jb3JlXCI7XG5cbnZhciBldmFsdWF0ZVByb3BzID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIC8qKlxuICAgKiBQb3RlbnRpYWwgZXZhbHVhdGVkIHByb3BzIGFyZTpcbiAgICogYGFyaWFMYWJlbGBcbiAgICogYGlkYFxuICAgKiBgc3R5bGVgXG4gICAqIGB0YWJJbmRleGBcbiAgICovXG4gIHZhciBhcmlhTGFiZWwgPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy5hcmlhTGFiZWwsIHByb3BzKTtcbiAgdmFyIGlkID0gSGVscGVycy5ldmFsdWF0ZVByb3AocHJvcHMuaWQsIHByb3BzKTtcbiAgdmFyIHN0eWxlID0gSGVscGVycy5ldmFsdWF0ZVN0eWxlKF9hc3NpZ24oe1xuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHN0cm9rZTogXCJibGFja1wiXG4gIH0sIHByb3BzLnN0eWxlKSwgcHJvcHMpO1xuICB2YXIgdGFiSW5kZXggPSBIZWxwZXJzLmV2YWx1YXRlUHJvcChwcm9wcy50YWJJbmRleCwgcHJvcHMpO1xuICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBhcmlhTGFiZWw6IGFyaWFMYWJlbCxcbiAgICBpZDogaWQsXG4gICAgc3R5bGU6IHN0eWxlLFxuICAgIHRhYkluZGV4OiB0YWJJbmRleFxuICB9KTtcbn07XG5cbnZhciBDdXJ2ZSA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBwcm9wcyA9IGV2YWx1YXRlUHJvcHMocHJvcHMpO1xuICB2YXIgX3Byb3BzID0gcHJvcHMsXG4gICAgICBwb2xhciA9IF9wcm9wcy5wb2xhcixcbiAgICAgIG9yaWdpbiA9IF9wcm9wcy5vcmlnaW47XG4gIHZhciBsaW5lRnVuY3Rpb24gPSBMaW5lSGVscGVycy5nZXRMaW5lRnVuY3Rpb24ocHJvcHMpO1xuICB2YXIgZGVmYXVsdFRyYW5zZm9ybSA9IHBvbGFyICYmIG9yaWdpbiA/IFwidHJhbnNsYXRlKFwiLmNvbmNhdChvcmlnaW4ueCwgXCIsIFwiKS5jb25jYXQob3JpZ2luLnksIFwiKVwiKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChwcm9wcy5wYXRoQ29tcG9uZW50LCBfb2JqZWN0U3ByZWFkKHt9LCBwcm9wcy5ldmVudHMsIHtcbiAgICBcImFyaWEtbGFiZWxcIjogcHJvcHMuYXJpYUxhYmVsLFxuICAgIGQ6IGxpbmVGdW5jdGlvbihwcm9wcy5kYXRhKSxcbiAgICBzdHlsZTogcHJvcHMuc3R5bGUsXG4gICAgdHJhbnNmb3JtOiBwcm9wcy50cmFuc2Zvcm0gfHwgZGVmYXVsdFRyYW5zZm9ybSxcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICByb2xlOiBwcm9wcy5yb2xlLFxuICAgIHNoYXBlUmVuZGVyaW5nOiBwcm9wcy5zaGFwZVJlbmRlcmluZyxcbiAgICBjbGlwUGF0aDogcHJvcHMuY2xpcFBhdGgsXG4gICAgdGFiSW5kZXg6IHByb3BzLnRhYkluZGV4XG4gIH0pKTtcbn07XG5cbkN1cnZlLnByb3BUeXBlcyA9IF9vYmplY3RTcHJlYWQoe30sIENvbW1vblByb3BzLnByaW1pdGl2ZVByb3BzLCB7XG4gIGludGVycG9sYXRpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jXSksXG4gIG9wZW5DdXJ2ZTogUHJvcFR5cGVzLmJvb2wsXG4gIG9yaWdpbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgcGF0aENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gIHBvbGFyOiBQcm9wVHlwZXMuYm9vbFxufSk7XG5DdXJ2ZS5kZWZhdWx0UHJvcHMgPSB7XG4gIHBhdGhDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUGF0aCwgbnVsbCksXG4gIHJvbGU6IFwicHJlc2VudGF0aW9uXCIsXG4gIHNoYXBlUmVuZGVyaW5nOiBcImF1dG9cIlxufTtcbmV4cG9ydCBkZWZhdWx0IEN1cnZlOyIsImZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBnZXRCYXNlUHJvcHMgfSBmcm9tIFwiLi9oZWxwZXItbWV0aG9kc1wiO1xuaW1wb3J0IEN1cnZlIGZyb20gXCIuL2N1cnZlXCI7XG5pbXBvcnQgeyBQcm9wVHlwZXMgYXMgQ3VzdG9tUHJvcFR5cGVzLCBIZWxwZXJzLCBWaWN0b3J5TGFiZWwsIGFkZEV2ZW50cywgVmljdG9yeUNvbnRhaW5lciwgVmljdG9yeVRoZW1lLCBEZWZhdWx0VHJhbnNpdGlvbnMsIFZpY3RvcnlDbGlwQ29udGFpbmVyLCBEYXRhLCBEb21haW4sIENvbW1vblByb3BzIH0gZnJvbSBcInZpY3RvcnktY29yZVwiO1xudmFyIGZhbGxiYWNrUHJvcHMgPSB7XG4gIHdpZHRoOiA0NTAsXG4gIGhlaWdodDogMzAwLFxuICBwYWRkaW5nOiA1MCxcbiAgaW50ZXJwb2xhdGlvbjogXCJsaW5lYXJcIlxufTtcbnZhciBvcHRpb25zID0ge1xuICBjb21wb25lbnRzOiBbe1xuICAgIG5hbWU6IFwicGFyZW50XCIsXG4gICAgaW5kZXg6IFwicGFyZW50XCJcbiAgfSwge1xuICAgIG5hbWU6IFwiZGF0YVwiLFxuICAgIGluZGV4OiBcImFsbFwiXG4gIH0sIHtcbiAgICBuYW1lOiBcImxhYmVsc1wiXG4gIH1dXG59O1xuXG52YXIgVmljdG9yeUxpbmUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFZpY3RvcnlMaW5lLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBWaWN0b3J5TGluZSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmljdG9yeUxpbmUpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChWaWN0b3J5TGluZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFZpY3RvcnlMaW5lKSkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVmljdG9yeUxpbmUsIFt7XG4gICAga2V5OiBcInNob3VsZEFuaW1hdGVcIixcbiAgICAvLyBPdmVycmlkZGVuIGluIG5hdGl2ZSB2ZXJzaW9uc1xuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRBbmltYXRlKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5wcm9wcy5hbmltYXRlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIGFuaW1hdGlvbldoaXRlbGlzdCA9IFZpY3RvcnlMaW5lLmFuaW1hdGlvbldoaXRlbGlzdCxcbiAgICAgICAgICByb2xlID0gVmljdG9yeUxpbmUucm9sZTtcbiAgICAgIHZhciBwcm9wcyA9IEhlbHBlcnMubW9kaWZ5UHJvcHModGhpcy5wcm9wcywgZmFsbGJhY2tQcm9wcywgcm9sZSk7XG5cbiAgICAgIGlmICh0aGlzLnNob3VsZEFuaW1hdGUoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmltYXRlQ29tcG9uZW50KHByb3BzLCBhbmltYXRpb25XaGl0ZWxpc3QpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnJlbmRlckNvbnRpbnVvdXNEYXRhKHByb3BzKTtcbiAgICAgIHJldHVybiBwcm9wcy5zdGFuZGFsb25lID8gdGhpcy5yZW5kZXJDb250YWluZXIocHJvcHMuY29udGFpbmVyQ29tcG9uZW50LCBjaGlsZHJlbikgOiBjaGlsZHJlbjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVmljdG9yeUxpbmU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5TGluZSwgXCJhbmltYXRpb25XaGl0ZWxpc3RcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogW1wiZGF0YVwiLCBcImRvbWFpblwiLCBcImhlaWdodFwiLCBcInBhZGRpbmdcIiwgXCJzYW1wbGVzXCIsIFwic3R5bGVcIiwgXCJ3aWR0aFwiXVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUxpbmUsIFwiZGlzcGxheU5hbWVcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogXCJWaWN0b3J5TGluZVwiXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5TGluZSwgXCJyb2xlXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IFwibGluZVwiXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5TGluZSwgXCJkZWZhdWx0VHJhbnNpdGlvbnNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogRGVmYXVsdFRyYW5zaXRpb25zLmNvbnRpbnVvdXNUcmFuc2l0aW9ucygpXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5TGluZSwgXCJkZWZhdWx0UG9sYXJUcmFuc2l0aW9uc1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBEZWZhdWx0VHJhbnNpdGlvbnMuY29udGludW91c1BvbGFyVHJhbnNpdGlvbnMoKVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUxpbmUsIFwiY29udGludW91c1wiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5TGluZSwgXCJwcm9wVHlwZXNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogX29iamVjdFNwcmVhZCh7fSwgQ29tbW9uUHJvcHMuYmFzZVByb3BzLCBDb21tb25Qcm9wcy5kYXRhUHJvcHMsIHtcbiAgICBpbnRlcnBvbGF0aW9uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub25lT2YoW1wiYmFzaXNcIiwgXCJidW5kbGVcIiwgXCJjYXJkaW5hbFwiLCBcImNhdG11bGxSb21cIiwgXCJsaW5lYXJcIiwgXCJtb25vdG9uZVhcIiwgXCJtb25vdG9uZVlcIiwgXCJuYXR1cmFsXCIsIFwic3RlcFwiLCBcInN0ZXBBZnRlclwiLCBcInN0ZXBCZWZvcmVcIl0pLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIGxhYmVsOiBDdXN0b21Qcm9wVHlwZXMuZGVwcmVjYXRlZChQcm9wVHlwZXMuc3RyaW5nLCBcIlVzZSBgbGFiZWxzYCBpbnN0ZWFkIGZvciBpbmRpdmlkdWFsIGRhdGEgbGFiZWxzXCIpXG4gIH0pXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5TGluZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZToge1xuICAgIGNvbnRhaW5lckNvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5Q29udGFpbmVyLCBudWxsKSxcbiAgICBkYXRhQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KEN1cnZlLCBudWxsKSxcbiAgICBsYWJlbENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5TGFiZWwsIHtcbiAgICAgIHJlbmRlckluUG9ydGFsOiB0cnVlXG4gICAgfSksXG4gICAgZ3JvdXBDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUNsaXBDb250YWluZXIsIG51bGwpLFxuICAgIHNhbXBsZXM6IDUwLFxuICAgIHNvcnRLZXk6IFwieFwiLFxuICAgIHNvcnRPcmRlcjogXCJhc2NlbmRpbmdcIixcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRoZW1lOiBWaWN0b3J5VGhlbWUuZ3JheXNjYWxlXG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpY3RvcnlMaW5lLCBcImdldERvbWFpblwiLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIHZhbHVlOiBEb21haW4uZ2V0RG9tYWluXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5TGluZSwgXCJnZXREYXRhXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IERhdGEuZ2V0RGF0YVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVmljdG9yeUxpbmUsIFwiZ2V0QmFzZVByb3BzXCIsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgdmFsdWU6IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHJldHVybiBnZXRCYXNlUHJvcHMocHJvcHMsIGZhbGxiYWNrUHJvcHMpO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWN0b3J5TGluZSwgXCJleHBlY3RlZENvbXBvbmVudHNcIiwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICB2YWx1ZTogW1wiZGF0YUNvbXBvbmVudFwiLCBcImxhYmVsQ29tcG9uZW50XCIsIFwiZ3JvdXBDb21wb25lbnRcIiwgXCJjb250YWluZXJDb21wb25lbnRcIl1cbn0pO1xuZXhwb3J0IGRlZmF1bHQgYWRkRXZlbnRzKFZpY3RvcnlMaW5lLCBvcHRpb25zKTsiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBob2lzdE5vblJlYWN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgeyBWaWN0b3J5TGluZSB9IGZyb20gJ3ZpY3RvcnktbGluZSc7XG5pbXBvcnQgeyBDaGFydENvbnRhaW5lciB9IGZyb20gJy4uL0NoYXJ0Q29udGFpbmVyJztcbmltcG9ydCB7IGdldFRoZW1lIH0gZnJvbSAnLi4vQ2hhcnRVdGlscyc7XG5leHBvcnQgdmFyIENoYXJ0TGluZVNvcnRPcmRlcjtcbihmdW5jdGlvbiAoQ2hhcnRMaW5lU29ydE9yZGVyKSB7XG4gICAgQ2hhcnRMaW5lU29ydE9yZGVyW1wiYXNjZW5kaW5nXCJdID0gXCJhc2NlbmRpbmdcIjtcbiAgICBDaGFydExpbmVTb3J0T3JkZXJbXCJkZXNjZW5kaW5nXCJdID0gXCJkZXNjZW5kaW5nXCI7XG59KShDaGFydExpbmVTb3J0T3JkZXIgfHwgKENoYXJ0TGluZVNvcnRPcmRlciA9IHt9KSk7XG5leHBvcnQgY29uc3QgQ2hhcnRMaW5lID0gKF9hKSA9PiB7XG4gICAgdmFyIHsgY29udGFpbmVyQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydENvbnRhaW5lciwgbnVsbCksIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgXG4gICAgLy8gZGVzdHJ1Y3R1cmUgbGFzdFxuICAgIHRoZW1lID0gZ2V0VGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSB9ID0gX2EsIHJlc3QgPSBfX3Jlc3QoX2EsIFtcImNvbnRhaW5lckNvbXBvbmVudFwiLCBcInRoZW1lQ29sb3JcIiwgXCJ0aGVtZVZhcmlhbnRcIiwgXCJ0aGVtZVwiXSk7XG4gICAgLy8gQ2xvbmUgc28gdXNlcnMgY2FuIG92ZXJyaWRlIGNvbnRhaW5lciBwcm9wc1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IFJlYWN0LmNsb25lRWxlbWVudChjb250YWluZXJDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oeyB0aGVtZSB9LCBjb250YWluZXJDb21wb25lbnQucHJvcHMpKTtcbiAgICAvLyBOb3RlOiBjb250YWluZXJDb21wb25lbnQgaXMgcmVxdWlyZWQgZm9yIHRoZW1lXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeUxpbmUsIE9iamVjdC5hc3NpZ24oeyBjb250YWluZXJDb21wb25lbnQ6IGNvbnRhaW5lciwgdGhlbWU6IHRoZW1lIH0sIHJlc3QpKTtcbn07XG5DaGFydExpbmUuZGlzcGxheU5hbWUgPSAnQ2hhcnRMaW5lJztcbi8vIE5vdGU6IFZpY3RvcnlMaW5lLnJvbGUgbXVzdCBiZSBob2lzdGVkXG5ob2lzdE5vblJlYWN0U3RhdGljcyhDaGFydExpbmUsIFZpY3RvcnlMaW5lKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJ0TGluZS5qcy5tYXAiLCJleHBvcnQgKiBmcm9tICcuL0NoYXJ0TGluZSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tICcuL0NoYXJ0UGllJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImV4cG9ydCAqIGZyb20gJy4vQ2hhcnRQb2ludCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tICcuL0NoYXJ0U2NhdHRlcic7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgX29yZGVyQnkgZnJvbSBcImxvZGFzaC9vcmRlckJ5XCI7XG5pbXBvcnQgX2tleXMgZnJvbSBcImxvZGFzaC9rZXlzXCI7XG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBIZWxwZXJzLCBTY2FsZSwgV3JhcHBlciB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJyZWFjdC1mYXN0LWNvbXBhcmVcIjtcbnZhciBmYWxsYmFja1Byb3BzID0ge1xuICB3aWR0aDogNDUwLFxuICBoZWlnaHQ6IDMwMCxcbiAgcGFkZGluZzogNTBcbn07IC8vIEFzc3VtZXMgZGF0YSBpbiBgZGF0YXNldHNgIGlzIHNvcnRlZCBieSBgRGF0YS5nZXREYXRhYC5cblxuZnVuY3Rpb24gZmlsbERhdGEocHJvcHMsIGRhdGFzZXRzKSB7XG4gIHZhciBmaWxsSW5NaXNzaW5nRGF0YSA9IHByb3BzLmZpbGxJbk1pc3NpbmdEYXRhO1xuICB2YXIgeE1hcCA9IGRhdGFzZXRzLnJlZHVjZShmdW5jdGlvbiAocHJldiwgZGF0YXNldCkge1xuICAgIGRhdGFzZXQuZm9yRWFjaChmdW5jdGlvbiAoZGF0dW0pIHtcbiAgICAgIHByZXZbZGF0dW0uX3ggaW5zdGFuY2VvZiBEYXRlID8gZGF0dW0uX3guZ2V0VGltZSgpIDogZGF0dW0uX3hdID0gdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJldjtcbiAgfSwge30pO1xuXG4gIHZhciB4S2V5cyA9IF9rZXlzKHhNYXApLm1hcChmdW5jdGlvbiAoaykge1xuICAgIHJldHVybiAraztcbiAgfSk7XG5cbiAgdmFyIHhBcnIgPSBfb3JkZXJCeSh4S2V5cyk7XG5cbiAgcmV0dXJuIGRhdGFzZXRzLm1hcChmdW5jdGlvbiAoZGF0YXNldCkge1xuICAgIHZhciBpbmRleE9mZnNldCA9IDA7XG4gICAgdmFyIGlzRGF0ZSA9IGRhdGFzZXRbMF0gJiYgZGF0YXNldFswXS5feCBpbnN0YW5jZW9mIERhdGU7XG4gICAgdmFyIGZpbGxlZEluRGF0YSA9IHhBcnIubWFwKGZ1bmN0aW9uICh4LCBpbmRleCkge1xuICAgICAgeCA9ICt4O1xuICAgICAgdmFyIGRhdHVtID0gZGF0YXNldFtpbmRleCAtIGluZGV4T2Zmc2V0XTtcblxuICAgICAgaWYgKGRhdHVtKSB7XG4gICAgICAgIHZhciB4MSA9IGlzRGF0ZSA/IGRhdHVtLl94LmdldFRpbWUoKSA6IGRhdHVtLl94O1xuXG4gICAgICAgIGlmICh4MSA9PT0geCkge1xuICAgICAgICAgIHJldHVybiBkYXR1bTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmRleE9mZnNldCsrO1xuICAgICAgICAgIHZhciB5ID0gZmlsbEluTWlzc2luZ0RhdGEgPyAwIDogbnVsbDtcbiAgICAgICAgICB4ID0gaXNEYXRlID8gbmV3IERhdGUoeCkgOiB4O1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiB4LFxuICAgICAgICAgICAgeTogeSxcbiAgICAgICAgICAgIF94OiB4LFxuICAgICAgICAgICAgX3k6IHlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX3kgPSBmaWxsSW5NaXNzaW5nRGF0YSA/IDAgOiBudWxsO1xuXG4gICAgICAgIHggPSBpc0RhdGUgPyBuZXcgRGF0ZSh4KSA6IHg7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiBfeSxcbiAgICAgICAgICBfeDogeCxcbiAgICAgICAgICBfeTogX3lcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmlsbGVkSW5EYXRhO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0WTAoZGF0dW0sIGluZGV4LCBkYXRhc2V0cykge1xuICBpZiAoZGF0dW0ueTApIHtcbiAgICByZXR1cm4gZGF0dW0ueTA7XG4gIH1cblxuICB2YXIgeSA9IGRhdHVtLl95O1xuICB2YXIgZ3JvdXAgPSBkYXR1bS5fZ3JvdXA7XG4gIHZhciBmaXJzdERhdGFzZXRCYXNlbGluZSA9IGRhdGFzZXRzWzBdLm1hcChmdW5jdGlvbiAoZCkge1xuICAgIHJldHVybiBkLnkwO1xuICB9KTtcbiAgdmFyIHByZXZpb3VzRGF0YXNldHMgPSBkYXRhc2V0cy5zbGljZSgwLCBpbmRleCk7XG4gIHZhciBwcmV2aW91c1BvaW50cyA9IHByZXZpb3VzRGF0YXNldHMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBkYXRhc2V0KSB7XG4gICAgcmV0dXJuIHByZXYuY29uY2F0KGRhdGFzZXQuZmlsdGVyKGZ1bmN0aW9uIChwcmV2aW91c0RhdHVtKSB7XG4gICAgICByZXR1cm4gZGF0dW0uX3ggaW5zdGFuY2VvZiBEYXRlID8gcHJldmlvdXNEYXR1bS5feC5nZXRUaW1lKCkgPT09IGRhdHVtLl94LmdldFRpbWUoKSA6IHByZXZpb3VzRGF0dW0uX3ggPT09IGRhdHVtLl94O1xuICAgIH0pLm1hcChmdW5jdGlvbiAocHJldmlvdXNEYXR1bSkge1xuICAgICAgcmV0dXJuIHByZXZpb3VzRGF0dW0uX3kgfHwgMDtcbiAgICB9KSk7XG4gIH0sIFtdKTtcbiAgdmFyIHkwID0gcHJldmlvdXNQb2ludHMubGVuZ3RoICYmIHByZXZpb3VzUG9pbnRzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgdmFsdWUpIHtcbiAgICB2YXIgc2FtZVNpZ24gPSB5IDwgMCAmJiB2YWx1ZSA8IDAgfHwgeSA+PSAwICYmIHZhbHVlID49IDA7XG4gICAgcmV0dXJuIHNhbWVTaWduID8gK3ZhbHVlICsgbWVtbyA6IG1lbW87XG4gIH0sIGZpcnN0RGF0YXNldEJhc2VsaW5lW2dyb3VwXSB8fCAwKTtcbiAgcmV0dXJuIHByZXZpb3VzUG9pbnRzLnNvbWUoZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgcmV0dXJuIHBvaW50IGluc3RhbmNlb2YgRGF0ZTtcbiAgfSkgPyBuZXcgRGF0ZSh5MCkgOiB5MDtcbn1cbi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG5cblxuZnVuY3Rpb24gYWRkTGF5b3V0RGF0YShwcm9wcywgZGF0YXNldHMsIGluZGV4KSB7XG4gIHZhciB4T2Zmc2V0ID0gcHJvcHMueE9mZnNldCB8fCAwO1xuICByZXR1cm4gZGF0YXNldHNbaW5kZXhdLm1hcChmdW5jdGlvbiAoZGF0dW0pIHtcbiAgICB2YXIgeU9mZnNldCA9IGdldFkwKGRhdHVtLCBpbmRleCwgZGF0YXNldHMpIHx8IDA7XG4gICAgcmV0dXJuIF9hc3NpZ24oe30sIGRhdHVtLCB7XG4gICAgICBfeTA6ICEoZGF0dW0uX3kgaW5zdGFuY2VvZiBEYXRlKSA/IHlPZmZzZXQgOiB5T2Zmc2V0ID8gbmV3IERhdGUoeU9mZnNldCkgOiBkYXR1bS5feSxcbiAgICAgIF95MTogZGF0dW0uX3kgPT09IG51bGwgPyBudWxsIDogZGF0dW0uX3kgaW5zdGFuY2VvZiBEYXRlID8gbmV3IERhdGUoK2RhdHVtLl95ICsgK3lPZmZzZXQpIDogZGF0dW0uX3kgKyB5T2Zmc2V0LFxuICAgICAgX3gxOiBkYXR1bS5feCA9PT0gbnVsbCA/IG51bGwgOiBkYXR1bS5feCBpbnN0YW5jZW9mIERhdGUgPyBuZXcgRGF0ZSgrZGF0dW0uX3ggKyAreE9mZnNldCkgOiBkYXR1bS5feCArIHhPZmZzZXRcbiAgICB9KTtcbiAgfSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG5cblxuZnVuY3Rpb24gc3RhY2tEYXRhKHByb3BzLCBjaGlsZENvbXBvbmVudHMpIHtcbiAgdmFyIGRhdGFGcm9tQ2hpbGRyZW4gPSBXcmFwcGVyLmdldERhdGFGcm9tQ2hpbGRyZW4ocHJvcHMsIGNoaWxkQ29tcG9uZW50cyk7XG4gIHZhciBmaWx0ZXJOdWxsQ2hpbGREYXRhID0gZGF0YUZyb21DaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGRhdGFzZXQpIHtcbiAgICByZXR1cm4gZGF0YXNldC5maWx0ZXIoZnVuY3Rpb24gKGRhdHVtKSB7XG4gICAgICByZXR1cm4gZGF0dW0uX3ggIT09IG51bGwgJiYgZGF0dW0uX3kgIT09IG51bGw7XG4gICAgfSk7XG4gIH0pO1xuICB2YXIgZGF0YXNldHMgPSBmaWxsRGF0YShwcm9wcywgZmlsdGVyTnVsbENoaWxkRGF0YSk7XG4gIHJldHVybiBkYXRhc2V0cy5tYXAoZnVuY3Rpb24gKGQsIGkpIHtcbiAgICByZXR1cm4gYWRkTGF5b3V0RGF0YShwcm9wcywgZGF0YXNldHMsIGkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENhbGN1bGF0ZWRQcm9wcyhwcm9wcywgY2hpbGRDb21wb25lbnRzKSB7XG4gIGNoaWxkQ29tcG9uZW50cyA9IGNoaWxkQ29tcG9uZW50cyB8fCBSZWFjdC5DaGlsZHJlbi50b0FycmF5KHByb3BzLmNoaWxkcmVuKTtcbiAgdmFyIHJvbGUgPSBcInN0YWNrXCI7XG4gIHByb3BzID0gSGVscGVycy5tb2RpZnlQcm9wcyhwcm9wcywgZmFsbGJhY2tQcm9wcywgcm9sZSk7XG4gIHZhciBzdHlsZSA9IFdyYXBwZXIuZ2V0U3R5bGUocHJvcHMudGhlbWUsIHByb3BzLnN0eWxlLCByb2xlKTtcbiAgdmFyIGNhdGVnb3JpZXMgPSBwcm9wcy5jYXRlZ29yaWVzIHx8IFdyYXBwZXIuZ2V0Q2F0ZWdvcmllcyhwcm9wcywgY2hpbGRDb21wb25lbnRzKTtcbiAgdmFyIGRhdGFzZXRzID0gcHJvcHMuZGF0YXNldHMgfHwgc3RhY2tEYXRhKHByb3BzLCBjaGlsZENvbXBvbmVudHMpO1xuICB2YXIgY2hpbGRyZW4gPSBjaGlsZENvbXBvbmVudHMubWFwKGZ1bmN0aW9uIChjLCBpKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChjLCB7XG4gICAgICBkYXRhOiBkYXRhc2V0c1tpXVxuICAgIH0pO1xuICB9KTtcbiAgdmFyIGRvbWFpbiA9IHtcbiAgICB4OiBXcmFwcGVyLmdldERvbWFpbihfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgY2F0ZWdvcmllczogY2F0ZWdvcmllc1xuICAgIH0pLCBcInhcIiwgY2hpbGRyZW4pLFxuICAgIHk6IFdyYXBwZXIuZ2V0RG9tYWluKF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICBjYXRlZ29yaWVzOiBjYXRlZ29yaWVzXG4gICAgfSksIFwieVwiLCBjaGlsZHJlbilcbiAgfTtcbiAgdmFyIHJhbmdlID0gcHJvcHMucmFuZ2UgfHwge1xuICAgIHg6IEhlbHBlcnMuZ2V0UmFuZ2UocHJvcHMsIFwieFwiKSxcbiAgICB5OiBIZWxwZXJzLmdldFJhbmdlKHByb3BzLCBcInlcIilcbiAgfTtcbiAgdmFyIGJhc2VTY2FsZSA9IHtcbiAgICB4OiBTY2FsZS5nZXRTY2FsZUZyb21Qcm9wcyhwcm9wcywgXCJ4XCIpIHx8IFdyYXBwZXIuZ2V0U2NhbGUocHJvcHMsIFwieFwiKSxcbiAgICB5OiBTY2FsZS5nZXRTY2FsZUZyb21Qcm9wcyhwcm9wcywgXCJ5XCIpIHx8IFdyYXBwZXIuZ2V0U2NhbGUocHJvcHMsIFwieVwiKVxuICB9O1xuICB2YXIgc2NhbGUgPSB7XG4gICAgeDogYmFzZVNjYWxlLnguZG9tYWluKGRvbWFpbi54KS5yYW5nZShwcm9wcy5ob3Jpem9udGFsID8gcmFuZ2UueSA6IHJhbmdlLngpLFxuICAgIHk6IGJhc2VTY2FsZS55LmRvbWFpbihkb21haW4ueSkucmFuZ2UocHJvcHMuaG9yaXpvbnRhbCA/IHJhbmdlLnggOiByYW5nZS55KVxuICB9O1xuICB2YXIgX3Byb3BzID0gcHJvcHMsXG4gICAgICBjb2xvclNjYWxlID0gX3Byb3BzLmNvbG9yU2NhbGUsXG4gICAgICBob3Jpem9udGFsID0gX3Byb3BzLmhvcml6b250YWw7XG4gIHJldHVybiB7XG4gICAgZGF0YXNldHM6IGRhdGFzZXRzLFxuICAgIGNhdGVnb3JpZXM6IGNhdGVnb3JpZXMsXG4gICAgcmFuZ2U6IHJhbmdlLFxuICAgIGRvbWFpbjogZG9tYWluLFxuICAgIGhvcml6b250YWw6IGhvcml6b250YWwsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBjb2xvclNjYWxlOiBjb2xvclNjYWxlLFxuICAgIHJvbGU6IHJvbGVcbiAgfTtcbn0gLy8gV2UgbmVlZCB0byByZW1vdmUgc2hhcmVkRXZlbnRzIGluIG9yZGVyIHRvIG1lbW9pemUgdGhlIGNhbGN1bGF0ZWQgZGF0YVxuLy8gV2l0aCBzaGFyZWQgZXZlbnRzLCB0aGUgcHJvcHMgY2hhbmdlIG9uIGV2ZXJ5IGV2ZW50LCBhbmQgZXZlcnkgdmFsdWUgaXMgcmUtY2FsY3VsYXRlZFxuXG52YXIgd2l0aG91dFNoYXJlZEV2ZW50cyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgdmFyIG1vZGlmaWVkQ2hpbGRyZW4gPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKS5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIGNoaWxkLCB7XG4gICAgICBwcm9wczogSGVscGVycy5vbWl0KGNoaWxkLnByb3BzLCBbXCJzaGFyZWRFdmVudHNcIl0pXG4gICAgfSk7XG4gIH0pO1xuICBwcm9wcy5jaGlsZHJlbiA9IG1vZGlmaWVkQ2hpbGRyZW47XG4gIHJldHVybiBwcm9wcztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VNZW1vaXplZFByb3BzKGluaXRpYWxQcm9wcykge1xuICB2YXIgbW9kaWZpZWRQcm9wcyA9IHdpdGhvdXRTaGFyZWRFdmVudHMoaW5pdGlhbFByb3BzKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUobW9kaWZpZWRQcm9wcyksXG4gICAgICBfUmVhY3QkdXNlU3RhdGUyID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlLCAyKSxcbiAgICAgIHByb3BzID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICAgIHNldFByb3BzID0gX1JlYWN0JHVzZVN0YXRlMlsxXTsgLy8gUmVhY3QubWVtbyB1c2VzIHNoYWxsb3cgZXF1YWxpdHkgdG8gY29tcGFyZSBvYmplY3RzLiBUaGlzIHdheSBwcm9wc1xuICAvLyB3aWxsIG9ubHkgYmUgcmUtY2FsY3VsYXRlZCB3aGVuIHRoZXkgY2hhbmdlLlxuXG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWlzRXF1YWwobW9kaWZpZWRQcm9wcywgcHJvcHMpKSB7XG4gICAgICBzZXRQcm9wcyhtb2RpZmllZFByb3BzKTtcbiAgICB9XG4gIH0sIFtwcm9wcywgc2V0UHJvcHMsIG1vZGlmaWVkUHJvcHNdKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRDYWxjdWxhdGVkUHJvcHMocHJvcHMsIHByb3BzLmNoaWxkcmVuKTtcbiAgfSwgW3Byb3BzXSk7XG59XG5cbmZ1bmN0aW9uIGdldExhYmVscyhwcm9wcywgZGF0YXNldHMsIGluZGV4KSB7XG4gIGlmICghcHJvcHMubGFiZWxzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBkYXRhc2V0cy5sZW5ndGggPT09IGluZGV4ICsgMSA/IHByb3BzLmxhYmVscyA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENoaWxkUHJvcHMocHJvcHMsIGNhbGN1bGF0ZWRQcm9wcykge1xuICB2YXIgY2F0ZWdvcmllcyA9IGNhbGN1bGF0ZWRQcm9wcy5jYXRlZ29yaWVzLFxuICAgICAgZG9tYWluID0gY2FsY3VsYXRlZFByb3BzLmRvbWFpbixcbiAgICAgIHJhbmdlID0gY2FsY3VsYXRlZFByb3BzLnJhbmdlLFxuICAgICAgc2NhbGUgPSBjYWxjdWxhdGVkUHJvcHMuc2NhbGUsXG4gICAgICBob3Jpem9udGFsID0gY2FsY3VsYXRlZFByb3BzLmhvcml6b250YWw7XG4gIHJldHVybiB7XG4gICAgaGVpZ2h0OiBwcm9wcy5oZWlnaHQsXG4gICAgd2lkdGg6IHByb3BzLndpZHRoLFxuICAgIHBhZGRpbmc6IEhlbHBlcnMuZ2V0UGFkZGluZyhwcm9wcyksXG4gICAgc3RhbmRhbG9uZTogZmFsc2UsXG4gICAgdGhlbWU6IHByb3BzLnRoZW1lLFxuICAgIGNhdGVnb3JpZXM6IGNhdGVnb3JpZXMsXG4gICAgZG9tYWluOiBkb21haW4sXG4gICAgcmFuZ2U6IHJhbmdlLFxuICAgIHNjYWxlOiBzY2FsZSxcbiAgICBob3Jpem9udGFsOiBob3Jpem9udGFsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldENvbG9yU2NhbGUocHJvcHMsIGNoaWxkKSB7XG4gIHZhciByb2xlID0gY2hpbGQudHlwZSAmJiBjaGlsZC50eXBlLnJvbGU7XG4gIHZhciBjb2xvclNjYWxlT3B0aW9ucyA9IGNoaWxkLnByb3BzLmNvbG9yU2NhbGUgfHwgcHJvcHMuY29sb3JTY2FsZTtcblxuICBpZiAocm9sZSAhPT0gXCJncm91cFwiICYmIHJvbGUgIT09IFwic3RhY2tcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gcHJvcHMudGhlbWUgPyBjb2xvclNjYWxlT3B0aW9ucyB8fCBwcm9wcy50aGVtZS5wcm9wcy5jb2xvclNjYWxlIDogY29sb3JTY2FsZU9wdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGlsZHJlbihwcm9wcywgY2hpbGRDb21wb25lbnRzLCBjYWxjdWxhdGVkUHJvcHMpIHtcbiAgcHJvcHMgPSBIZWxwZXJzLm1vZGlmeVByb3BzKHByb3BzLCBmYWxsYmFja1Byb3BzLCBcInN0YWNrXCIpO1xuICBjaGlsZENvbXBvbmVudHMgPSBjaGlsZENvbXBvbmVudHMgfHwgUmVhY3QuQ2hpbGRyZW4udG9BcnJheShwcm9wcy5jaGlsZHJlbik7XG4gIGNhbGN1bGF0ZWRQcm9wcyA9IGNhbGN1bGF0ZWRQcm9wcyB8fCBnZXRDYWxjdWxhdGVkUHJvcHMocHJvcHMsIGNoaWxkQ29tcG9uZW50cyk7XG4gIHZhciBfY2FsY3VsYXRlZFByb3BzID0gY2FsY3VsYXRlZFByb3BzLFxuICAgICAgZGF0YXNldHMgPSBfY2FsY3VsYXRlZFByb3BzLmRhdGFzZXRzO1xuICB2YXIgY2hpbGRQcm9wcyA9IGdldENoaWxkUHJvcHMocHJvcHMsIGNhbGN1bGF0ZWRQcm9wcyk7XG4gIHZhciBwYXJlbnROYW1lID0gcHJvcHMubmFtZSB8fCBcInN0YWNrXCI7XG4gIHJldHVybiBjaGlsZENvbXBvbmVudHMubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICB2YXIgcm9sZSA9IGNoaWxkLnR5cGUgJiYgY2hpbGQudHlwZS5yb2xlO1xuICAgIHZhciBkYXRhID0gZGF0YXNldHNbaW5kZXhdO1xuICAgIHZhciBzdHlsZSA9IFdyYXBwZXIuZ2V0Q2hpbGRTdHlsZShjaGlsZCwgaW5kZXgsIGNhbGN1bGF0ZWRQcm9wcyk7XG4gICAgdmFyIGxhYmVscyA9IHByb3BzLmxhYmVscyA/IGdldExhYmVscyhwcm9wcywgZGF0YXNldHMsIGluZGV4KSA6IGNoaWxkLnByb3BzLmxhYmVscztcbiAgICB2YXIgbmFtZSA9IGNoaWxkLnByb3BzLm5hbWUgfHwgXCJcIi5jb25jYXQocGFyZW50TmFtZSwgXCItXCIpLmNvbmNhdChyb2xlLCBcIi1cIikuY29uY2F0KGluZGV4KTtcbiAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkLCBfYXNzaWduKHtcbiAgICAgIGtleTogXCJcIi5jb25jYXQobmFtZSwgXCIta2V5LVwiKS5jb25jYXQoaW5kZXgpLFxuICAgICAgbGFiZWxzOiBsYWJlbHMsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgZG9tYWluUGFkZGluZzogY2hpbGQucHJvcHMuZG9tYWluUGFkZGluZyB8fCBwcm9wcy5kb21haW5QYWRkaW5nLFxuICAgICAgdGhlbWU6IHByb3BzLnRoZW1lLFxuICAgICAgbGFiZWxDb21wb25lbnQ6IHByb3BzLmxhYmVsQ29tcG9uZW50IHx8IGNoaWxkLnByb3BzLmxhYmVsQ29tcG9uZW50LFxuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgY29sb3JTY2FsZTogZ2V0Q29sb3JTY2FsZShwcm9wcywgY2hpbGQpLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIHBvbGFyOiBwcm9wcy5wb2xhclxuICAgIH0sIGNoaWxkUHJvcHMpKTtcbiAgfSk7XG59IiwiaW1wb3J0IF9pc0VtcHR5IGZyb20gXCJsb2Rhc2gvaXNFbXB0eVwiO1xuaW1wb3J0IF9kZWZhdWx0cyBmcm9tIFwibG9kYXNoL2RlZmF1bHRzXCI7XG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHsgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTsgfSkpOyB9IG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IEhlbHBlcnMsIFZpY3RvcnlDb250YWluZXIsIFZpY3RvcnlUaGVtZSwgQ29tbW9uUHJvcHMsIFdyYXBwZXIsIFByb3BUeXBlcyBhcyBDdXN0b21Qcm9wVHlwZXMsIEhvb2tzIH0gZnJvbSBcInZpY3RvcnktY29yZVwiO1xuaW1wb3J0IHsgVmljdG9yeVNoYXJlZEV2ZW50cyB9IGZyb20gXCJ2aWN0b3J5LXNoYXJlZC1ldmVudHNcIjtcbmltcG9ydCB7IGdldENoaWxkcmVuLCB1c2VNZW1vaXplZFByb3BzIH0gZnJvbSBcIi4vaGVscGVyLW1ldGhvZHNcIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJyZWFjdC1mYXN0LWNvbXBhcmVcIjtcbnZhciBmYWxsYmFja1Byb3BzID0ge1xuICB3aWR0aDogNDUwLFxuICBoZWlnaHQ6IDMwMCxcbiAgcGFkZGluZzogNTBcbn07XG5cbnZhciBWaWN0b3J5U3RhY2sgPSBmdW5jdGlvbiAoaW5pdGlhbFByb3BzKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICB2YXIgcm9sZSA9IFZpY3RvcnlTdGFja01lbW8ucm9sZTtcblxuICB2YXIgX0hvb2tzJHVzZUFuaW1hdGlvblN0ID0gSG9va3MudXNlQW5pbWF0aW9uU3RhdGUoKSxcbiAgICAgIHNldEFuaW1hdGlvblN0YXRlID0gX0hvb2tzJHVzZUFuaW1hdGlvblN0LnNldEFuaW1hdGlvblN0YXRlLFxuICAgICAgZ2V0QW5pbWF0aW9uUHJvcHMgPSBfSG9va3MkdXNlQW5pbWF0aW9uU3QuZ2V0QW5pbWF0aW9uUHJvcHMsXG4gICAgICBnZXRQcm9wcyA9IF9Ib29rcyR1c2VBbmltYXRpb25TdC5nZXRQcm9wcztcblxuICB2YXIgcHJvcHMgPSBnZXRQcm9wcyhpbml0aWFsUHJvcHMpO1xuICB2YXIgbW9kaWZpZWRQcm9wcyA9IEhlbHBlcnMubW9kaWZ5UHJvcHMocHJvcHMsIGZhbGxiYWNrUHJvcHMsIHJvbGUpO1xuICB2YXIgZXZlbnRLZXkgPSBtb2RpZmllZFByb3BzLmV2ZW50S2V5LFxuICAgICAgY29udGFpbmVyQ29tcG9uZW50ID0gbW9kaWZpZWRQcm9wcy5jb250YWluZXJDb21wb25lbnQsXG4gICAgICBzdGFuZGFsb25lID0gbW9kaWZpZWRQcm9wcy5zdGFuZGFsb25lLFxuICAgICAgZ3JvdXBDb21wb25lbnQgPSBtb2RpZmllZFByb3BzLmdyb3VwQ29tcG9uZW50LFxuICAgICAgZXh0ZXJuYWxFdmVudE11dGF0aW9ucyA9IG1vZGlmaWVkUHJvcHMuZXh0ZXJuYWxFdmVudE11dGF0aW9ucyxcbiAgICAgIHdpZHRoID0gbW9kaWZpZWRQcm9wcy53aWR0aCxcbiAgICAgIGhlaWdodCA9IG1vZGlmaWVkUHJvcHMuaGVpZ2h0LFxuICAgICAgdGhlbWUgPSBtb2RpZmllZFByb3BzLnRoZW1lLFxuICAgICAgcG9sYXIgPSBtb2RpZmllZFByb3BzLnBvbGFyLFxuICAgICAgaG9yaXpvbnRhbCA9IG1vZGlmaWVkUHJvcHMuaG9yaXpvbnRhbCxcbiAgICAgIG5hbWUgPSBtb2RpZmllZFByb3BzLm5hbWU7XG4gIHZhciBjaGlsZENvbXBvbmVudHMgPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KG1vZGlmaWVkUHJvcHMuY2hpbGRyZW4pO1xuICB2YXIgY2FsY3VsYXRlZFByb3BzID0gdXNlTWVtb2l6ZWRQcm9wcyhtb2RpZmllZFByb3BzKTtcbiAgdmFyIGRvbWFpbiA9IGNhbGN1bGF0ZWRQcm9wcy5kb21haW4sXG4gICAgICBzY2FsZSA9IGNhbGN1bGF0ZWRQcm9wcy5zY2FsZSxcbiAgICAgIHN0eWxlID0gY2FsY3VsYXRlZFByb3BzLnN0eWxlLFxuICAgICAgb3JpZ2luID0gY2FsY3VsYXRlZFByb3BzLm9yaWdpbjtcbiAgdmFyIG5ld0NoaWxkcmVuID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocHJvcHMsIGNoaWxkQ29tcG9uZW50cywgY2FsY3VsYXRlZFByb3BzKTtcbiAgICB2YXIgb3JkZXJlZENoaWxkcmVuID0gY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICAgIHZhciBjaGlsZFByb3BzID0gX2Fzc2lnbih7XG4gICAgICAgIGFuaW1hdGU6IGdldEFuaW1hdGlvblByb3BzKHByb3BzLCBjaGlsZCwgaW5kZXgsIFwidmljdG9yeS1zdGFja1wiKVxuICAgICAgfSwgY2hpbGQucHJvcHMpO1xuXG4gICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkLCBjaGlsZFByb3BzKTtcbiAgICB9KTtcbiAgICAvKlxuICAgICAgcmV2ZXJzZSByZW5kZXIgb3JkZXIgZm9yIGNoaWxkcmVuIG9mIGBWaWN0b3J5U3RhY2tgIHNvIHRoYXQgaGlnaGVyIGNoaWxkcmVuIGluIHRoZSBzdGFja1xuICAgICAgYXJlIHJlbmRlcmVkIGJlaGluZCBsb3dlciBjaGlsZHJlbi4gVGhpcyBsb29rcyBuaWNlciBmb3Igc3RhY2tlZCBiYXJzIHdpdGggY29ybmVyUmFkaXVzLCBhbmRcbiAgICAgIGFyZWFzIHdpdGggc3Ryb2tlc1xuICAgICovXG5cbiAgICByZXR1cm4gb3JkZXJlZENoaWxkcmVuLnJldmVyc2UoKTtcbiAgfSwgW3Byb3BzLCBjaGlsZENvbXBvbmVudHMsIGNhbGN1bGF0ZWRQcm9wcywgZ2V0QW5pbWF0aW9uUHJvcHNdKTtcbiAgdmFyIGNvbnRhaW5lclByb3BzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHN0YW5kYWxvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbWFpbjogZG9tYWluLFxuICAgICAgICBzY2FsZTogc2NhbGUsXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIHN0YW5kYWxvbmU6IHN0YW5kYWxvbmUsXG4gICAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgICAgc3R5bGU6IHN0eWxlLnBhcmVudCxcbiAgICAgICAgaG9yaXpvbnRhbDogaG9yaXpvbnRhbCxcbiAgICAgICAgcG9sYXI6IHBvbGFyLFxuICAgICAgICBvcmlnaW46IG9yaWdpbixcbiAgICAgICAgbmFtZTogbmFtZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH0sIFtzdGFuZGFsb25lLCBkb21haW4sIHNjYWxlLCB3aWR0aCwgaGVpZ2h0LCB0aGVtZSwgc3R5bGUsIGhvcml6b250YWwsIHBvbGFyLCBvcmlnaW4sIG5hbWVdKTtcbiAgdmFyIGNvbnRhaW5lciA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChzdGFuZGFsb25lKSB7XG4gICAgICB2YXIgZGVmYXVsdENvbnRhaW5lclByb3BzID0gX2RlZmF1bHRzKHt9LCBjb250YWluZXJDb21wb25lbnQucHJvcHMsIGNvbnRhaW5lclByb3BzKTtcblxuICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChjb250YWluZXJDb21wb25lbnQsIGRlZmF1bHRDb250YWluZXJQcm9wcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyb3VwQ29tcG9uZW50O1xuICB9LCBbZ3JvdXBDb21wb25lbnQsIHN0YW5kYWxvbmUsIGNvbnRhaW5lckNvbXBvbmVudCwgY29udGFpbmVyUHJvcHNdKTtcbiAgdmFyIGV2ZW50cyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBXcmFwcGVyLmdldEFsbEV2ZW50cyhwcm9wcyk7XG4gIH0sIFtwcm9wc10pO1xuICB2YXIgcHJldmlvdXNQcm9wcyA9IEhvb2tzLnVzZVByZXZpb3VzUHJvcHMoaW5pdGlhbFByb3BzKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgZGlzbW91bnQgdG8ga2VlcCBzdGF0ZSBpbiBzeW5jXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpbml0aWFsUHJvcHMuYW5pbWF0ZSkge1xuICAgICAgICBzZXRBbmltYXRpb25TdGF0ZShwcmV2aW91c1Byb3BzLCBpbml0aWFsUHJvcHMpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtzZXRBbmltYXRpb25TdGF0ZSwgcHJldmlvdXNQcm9wcywgaW5pdGlhbFByb3BzXSk7XG5cbiAgaWYgKCFfaXNFbXB0eShldmVudHMpKSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeVNoYXJlZEV2ZW50cywge1xuICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgICBldmVudEtleTogZXZlbnRLZXksXG4gICAgICBldmVudHM6IGV2ZW50cyxcbiAgICAgIGV4dGVybmFsRXZlbnRNdXRhdGlvbnM6IGV4dGVybmFsRXZlbnRNdXRhdGlvbnNcbiAgICB9LCBuZXdDaGlsZHJlbik7XG4gIH1cblxuICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNvbnRhaW5lciwgY29udGFpbmVyLnByb3BzLCBuZXdDaGlsZHJlbik7XG59O1xuXG5WaWN0b3J5U3RhY2sucHJvcFR5cGVzID0gX29iamVjdFNwcmVhZCh7fSwgQ29tbW9uUHJvcHMuYmFzZVByb3BzLCB7XG4gIGJpbnM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vbmVPZlR5cGUoW0N1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZSwgUHJvcFR5cGVzLmluc3RhbmNlT2YoRGF0ZSldKSksIEN1c3RvbVByb3BUeXBlcy5ub25OZWdhdGl2ZV0pLFxuICBjYXRlZ29yaWVzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICB4OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSxcbiAgICB5OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKVxuICB9KV0pLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm5vZGUpLCBQcm9wVHlwZXMubm9kZV0pLFxuICBjb2xvclNjYWxlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSwgUHJvcFR5cGVzLm9uZU9mKFtcImdyYXlzY2FsZVwiLCBcInF1YWxpdGF0aXZlXCIsIFwiaGVhdG1hcFwiLCBcIndhcm1cIiwgXCJjb29sXCIsIFwicmVkXCIsIFwiZ3JlZW5cIiwgXCJibHVlXCJdKV0pLFxuICBmaWxsSW5NaXNzaW5nRGF0YTogUHJvcFR5cGVzLmJvb2wsXG4gIGhvcml6b250YWw6IFByb3BUeXBlcy5ib29sLFxuICBsYWJlbENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gIGxhYmVsczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5hcnJheV0pLFxuICBzdHlsZTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBwYXJlbnQ6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGF0YTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBsYWJlbHM6IFByb3BUeXBlcy5vYmplY3RcbiAgfSksXG4gIHhPZmZzZXQ6IFByb3BUeXBlcy5udW1iZXJcbn0pO1xuVmljdG9yeVN0YWNrLmRlZmF1bHRQcm9wcyA9IHtcbiAgY29udGFpbmVyQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KFZpY3RvcnlDb250YWluZXIsIG51bGwpLFxuICBncm91cENvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwgbnVsbCksXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRoZW1lOiBWaWN0b3J5VGhlbWUuZ3JheXNjYWxlLFxuICBmaWxsSW5NaXNzaW5nRGF0YTogdHJ1ZVxufTtcbnZhciBWaWN0b3J5U3RhY2tNZW1vID0gUmVhY3QubWVtbyhWaWN0b3J5U3RhY2ssIGlzRXF1YWwpO1xuVmljdG9yeVN0YWNrTWVtby5kaXNwbGF5TmFtZSA9IFwiVmljdG9yeVN0YWNrXCI7XG5WaWN0b3J5U3RhY2tNZW1vLnJvbGUgPSBcInN0YWNrXCI7XG5WaWN0b3J5U3RhY2tNZW1vLmV4cGVjdGVkQ29tcG9uZW50cyA9IFtcImdyb3VwQ29tcG9uZW50XCIsIFwiY29udGFpbmVyQ29tcG9uZW50XCIsIFwibGFiZWxDb21wb25lbnRcIl07XG5WaWN0b3J5U3RhY2tNZW1vLmdldENoaWxkcmVuID0gZ2V0Q2hpbGRyZW47XG5leHBvcnQgZGVmYXVsdCBWaWN0b3J5U3RhY2tNZW1vOyIsImltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGhvaXN0Tm9uUmVhY3RTdGF0aWNzIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJztcbmltcG9ydCB7IFZpY3RvcnlTdGFjayB9IGZyb20gJ3ZpY3Rvcnktc3RhY2snO1xuaW1wb3J0IHsgQ2hhcnRDb250YWluZXIgfSBmcm9tICcuLi9DaGFydENvbnRhaW5lcic7XG5pbXBvcnQgeyBnZXRDbGFzc05hbWUsIGdldFRoZW1lIH0gZnJvbSAnLi4vQ2hhcnRVdGlscyc7XG5leHBvcnQgY29uc3QgQ2hhcnRTdGFjayA9IChfYSkgPT4ge1xuICAgIHZhciB7IGFyaWFEZXNjLCBhcmlhVGl0bGUsIGNoaWxkcmVuLCBjb250YWluZXJDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0Q29udGFpbmVyLCBudWxsKSwgdGhlbWVDb2xvciwgdGhlbWVWYXJpYW50LCBcbiAgICAvLyBkZXN0cnVjdHVyZSBsYXN0XG4gICAgdGhlbWUgPSBnZXRUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpIH0gPSBfYSwgcmVzdCA9IF9fcmVzdChfYSwgW1wiYXJpYURlc2NcIiwgXCJhcmlhVGl0bGVcIiwgXCJjaGlsZHJlblwiLCBcImNvbnRhaW5lckNvbXBvbmVudFwiLCBcInRoZW1lQ29sb3JcIiwgXCJ0aGVtZVZhcmlhbnRcIiwgXCJ0aGVtZVwiXSk7XG4gICAgLy8gQ2xvbmUgc28gdXNlcnMgY2FuIG92ZXJyaWRlIGNvbnRhaW5lciBwcm9wc1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IFJlYWN0LmNsb25lRWxlbWVudChjb250YWluZXJDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IGRlc2M6IGFyaWFEZXNjLCB0aXRsZTogYXJpYVRpdGxlLCB0aGVtZSB9LCBjb250YWluZXJDb21wb25lbnQucHJvcHMpLCB7IGNsYXNzTmFtZTogZ2V0Q2xhc3NOYW1lKHsgY2xhc3NOYW1lOiBjb250YWluZXJDb21wb25lbnQucHJvcHMuY2xhc3NOYW1lIH0pIC8vIE92ZXJyaWRlIFZpY3RvcnlDb250YWluZXIgY2xhc3MgbmFtZVxuICAgICB9KSk7XG4gICAgLy8gTm90ZTogY29udGFpbmVyQ29tcG9uZW50IGlzIHJlcXVpcmVkIGZvciB0aGVtZVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5U3RhY2ssIE9iamVjdC5hc3NpZ24oeyBjb250YWluZXJDb21wb25lbnQ6IGNvbnRhaW5lciwgdGhlbWU6IHRoZW1lIH0sIHJlc3QpLCBjaGlsZHJlbikpO1xufTtcbkNoYXJ0U3RhY2suZGlzcGxheU5hbWUgPSAnQ2hhcnRTdGFjayc7XG4vLyBOb3RlOiBWaWN0b3J5U3RhY2suZ2V0Q2hpbGRyZW4gJiBWaWN0b3J5U3RhY2sucm9sZSBtdXN0IGJlIGhvaXN0ZWRcbmhvaXN0Tm9uUmVhY3RTdGF0aWNzKENoYXJ0U3RhY2ssIFZpY3RvcnlTdGFjayk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFydFN0YWNrLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gJy4vQ2hhcnRTdGFjayc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tICcuL0NoYXJ0VGhlbWUnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFydFN0eWxlcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBob2lzdE5vblJlYWN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC9jbG9uZURlZXAnO1xuaW1wb3J0IHsgVmljdG9yeUxpbmUgfSBmcm9tICd2aWN0b3J5LWxpbmUnO1xuaW1wb3J0IHsgQ2hhcnRMaW5lIH0gZnJvbSAnLi4vQ2hhcnRMaW5lJztcbmltcG9ydCB7IGdldFRocmVzaG9sZFRoZW1lIH0gZnJvbSAnLi4vQ2hhcnRVdGlscyc7XG5leHBvcnQgY29uc3QgQ2hhcnRUaHJlc2hvbGQgPSAoX2EpID0+IHtcbiAgICB2YXIgeyBzdHlsZSA9IHt9LCB0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQsIFxuICAgIC8vIGRlc3RydWN0dXJlIGxhc3RcbiAgICB0aGVtZSA9IGdldFRocmVzaG9sZFRoZW1lKHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCkgfSA9IF9hLCByZXN0ID0gX19yZXN0KF9hLCBbXCJzdHlsZVwiLCBcInRoZW1lQ29sb3JcIiwgXCJ0aGVtZVZhcmlhbnRcIiwgXCJ0aGVtZVwiXSk7XG4gICAgLy8gUmV0dXJuZWQgc3R5bGUgcHJvcCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZGVmYXVsdCB0aGVtZVxuICAgIGNvbnN0IGdldFN0cm9rZURhc2hhcnJheSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHN0eWxlICYmIHN0eWxlLmRhdGEgJiYgc3R5bGUuZGF0YS5zdHJva2VEYXNoYXJyYXkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHlsZS5kYXRhLnN0cm9rZURhc2hhcnJheTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0VGhyZXNob2xkVGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KS5saW5lLnN0eWxlLmRhdGEuc3Ryb2tlRGFzaGFycmF5O1xuICAgIH07XG4gICAgY29uc3QgZ2V0U3Ryb2tlV2lkdGggPSAoKSA9PiB7XG4gICAgICAgIGlmIChzdHlsZSAmJiBzdHlsZS5kYXRhICYmIHN0eWxlLmRhdGEuc3Ryb2tlV2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHlsZS5kYXRhLnN0cm9rZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRUaHJlc2hvbGRUaGVtZSh0aGVtZUNvbG9yLCB0aGVtZVZhcmlhbnQpLmxpbmUuc3R5bGUuZGF0YS5zdHJva2VXaWR0aDtcbiAgICB9O1xuICAgIC8vIENsb25lIHN0eWxlIGFuZCBhcHBseSBzdHJva2VEYXNoYXJyYXkgcHJvcFxuICAgIGNvbnN0IHRocmVzaG9sZFN0eWxlID0gY2xvbmVEZWVwKHN0eWxlKTtcbiAgICBpZiAodGhyZXNob2xkU3R5bGUuZGF0YSkge1xuICAgICAgICB0aHJlc2hvbGRTdHlsZS5kYXRhLnN0cm9rZURhc2hhcnJheSA9IGdldFN0cm9rZURhc2hhcnJheSgpO1xuICAgICAgICB0aHJlc2hvbGRTdHlsZS5kYXRhLnN0cm9rZVdpZHRoID0gZ2V0U3Ryb2tlV2lkdGgoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocmVzaG9sZFN0eWxlLmRhdGEgPSB7XG4gICAgICAgICAgICBzdHJva2VEYXNoYXJyYXk6IGdldFN0cm9rZURhc2hhcnJheSgpLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGdldFN0cm9rZVdpZHRoKClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRMaW5lLCBPYmplY3QuYXNzaWduKHsgc3R5bGU6IHRocmVzaG9sZFN0eWxlLCB0aGVtZTogdGhlbWUgfSwgcmVzdCkpO1xufTtcbkNoYXJ0VGhyZXNob2xkLmRpc3BsYXlOYW1lID0gJ0NoYXJ0VGhyZXNob2xkJztcbi8vIE5vdGU6IFZpY3RvcnlMaW5lLnJvbGUgbXVzdCBiZSBob2lzdGVkXG5ob2lzdE5vblJlYWN0U3RhdGljcyhDaGFydFRocmVzaG9sZCwgVmljdG9yeUxpbmUpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2hhcnRUaHJlc2hvbGQuanMubWFwIiwiZXhwb3J0ICogZnJvbSAnLi9DaGFydFRocmVzaG9sZCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tICcuL0NoYXJ0VG9vbHRpcCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgX2lzUmVnRXhwIGZyb20gXCJsb2Rhc2gvaXNSZWdFeHBcIjtcbmltcG9ydCBfaXNTdHJpbmcgZnJvbSBcImxvZGFzaC9pc1N0cmluZ1wiO1xuaW1wb3J0IF9pbmNsdWRlcyBmcm9tIFwibG9kYXNoL2luY2x1ZGVzXCI7XG5pbXBvcnQgX2lzRW1wdHkgZnJvbSBcImxvZGFzaC9pc0VtcHR5XCI7XG5pbXBvcnQgX2lzRnVuY3Rpb24gZnJvbSBcImxvZGFzaC9pc0Z1bmN0aW9uXCI7XG5pbXBvcnQgX3Rocm90dGxlIGZyb20gXCJsb2Rhc2gvdGhyb3R0bGVcIjtcbmltcG9ydCBfYXNzaWduIGZyb20gXCJsb2Rhc2gvYXNzaWduXCI7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbmltcG9ydCB7IENvbGxlY3Rpb24sIFNlbGVjdGlvbiwgRGF0YSwgSGVscGVycyB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJyZWFjdC1mYXN0LWNvbXBhcmVcIjtcbmltcG9ydCBEZWxhdW5heSBmcm9tIFwiZGVsYXVuYXktZmluZC9saWIvaW5kZXguanNcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBWb3Jvbm9pSGVscGVycyA9IHtcbiAgd2l0aGluQm91bmRzOiBmdW5jdGlvbiAocHJvcHMsIHBvaW50KSB7XG4gICAgdmFyIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICAgICAgcG9sYXIgPSBwcm9wcy5wb2xhcixcbiAgICAgICAgb3JpZ2luID0gcHJvcHMub3JpZ2luLFxuICAgICAgICBzY2FsZSA9IHByb3BzLnNjYWxlO1xuICAgIHZhciBwYWRkaW5nID0gSGVscGVycy5nZXRQYWRkaW5nKHByb3BzLCBcInZvcm9ub2lQYWRkaW5nXCIpO1xuICAgIHZhciB4ID0gcG9pbnQueCxcbiAgICAgICAgeSA9IHBvaW50Lnk7XG5cbiAgICBpZiAocG9sYXIpIHtcbiAgICAgIHZhciBkaXN0YW5jZVNxdWFyZWQgPSBNYXRoLnBvdyh4IC0gb3JpZ2luLngsIDIpICsgTWF0aC5wb3coeSAtIG9yaWdpbi55LCAyKTtcbiAgICAgIHZhciByYWRpdXMgPSBNYXRoLm1heC5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkoc2NhbGUueS5yYW5nZSgpKSk7XG4gICAgICByZXR1cm4gZGlzdGFuY2VTcXVhcmVkIDwgTWF0aC5wb3cocmFkaXVzLCAyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHggPj0gcGFkZGluZy5sZWZ0ICYmIHggPD0gd2lkdGggLSBwYWRkaW5nLnJpZ2h0ICYmIHkgPj0gcGFkZGluZy50b3AgJiYgeSA8PSBoZWlnaHQgLSBwYWRkaW5nLmJvdHRvbTtcbiAgICB9XG4gIH0sXG4gIGdldERhdGFzZXRzOiBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICB2YXIgbWluRG9tYWluID0ge1xuICAgICAgeDogQ29sbGVjdGlvbi5nZXRNaW5WYWx1ZShwcm9wcy5kb21haW4ueCksXG4gICAgICB5OiBDb2xsZWN0aW9uLmdldE1pblZhbHVlKHByb3BzLmRvbWFpbi55KVxuICAgIH07XG4gICAgdmFyIGNoaWxkcmVuID0gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShwcm9wcy5jaGlsZHJlbik7XG5cbiAgICB2YXIgYWRkTWV0YSA9IGZ1bmN0aW9uIChkYXRhLCBuYW1lLCBjaGlsZCkge1xuICAgICAgdmFyIGNvbnRpbnVvdXMgPSBjaGlsZCAmJiBjaGlsZC50eXBlICYmIGNoaWxkLnR5cGUuY29udGludW91cztcbiAgICAgIHZhciBzdHlsZSA9IGNoaWxkID8gY2hpbGQucHJvcHMgJiYgY2hpbGQucHJvcHMuc3R5bGUgOiBwcm9wcy5zdHlsZTtcbiAgICAgIHJldHVybiBkYXRhLm1hcChmdW5jdGlvbiAoZGF0dW0sIGluZGV4KSB7XG4gICAgICAgIHZhciBfSGVscGVycyRnZXRQb2ludCA9IEhlbHBlcnMuZ2V0UG9pbnQoZGF0dW0pLFxuICAgICAgICAgICAgeCA9IF9IZWxwZXJzJGdldFBvaW50LngsXG4gICAgICAgICAgICB5ID0gX0hlbHBlcnMkZ2V0UG9pbnQueSxcbiAgICAgICAgICAgIHkwID0gX0hlbHBlcnMkZ2V0UG9pbnQueTAsXG4gICAgICAgICAgICB4MCA9IF9IZWxwZXJzJGdldFBvaW50LngwO1xuXG4gICAgICAgIHZhciB2b3Jvbm9pWCA9ICgreCArICt4MCkgLyAyO1xuICAgICAgICB2YXIgdm9yb25vaVkgPSAoK3kgKyAreTApIC8gMjtcbiAgICAgICAgcmV0dXJuIF9hc3NpZ24oe1xuICAgICAgICAgIF92b3Jvbm9pWDogcHJvcHMudm9yb25vaURpbWVuc2lvbiA9PT0gXCJ5XCIgPyBtaW5Eb21haW4ueCA6IHZvcm9ub2lYLFxuICAgICAgICAgIF92b3Jvbm9pWTogcHJvcHMudm9yb25vaURpbWVuc2lvbiA9PT0gXCJ4XCIgPyBtaW5Eb21haW4ueSA6IHZvcm9ub2lZLFxuICAgICAgICAgIGV2ZW50S2V5OiBpbmRleCxcbiAgICAgICAgICBjaGlsZE5hbWU6IG5hbWUsXG4gICAgICAgICAgY29udGludW91czogY29udGludW91cyxcbiAgICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgICAgfSwgZGF0dW0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmIChwcm9wcy5kYXRhKSB7XG4gICAgICByZXR1cm4gYWRkTWV0YShwcm9wcy5kYXRhKTtcbiAgICB9XG5cbiAgICB2YXIgZ2V0RGF0YSA9IGZ1bmN0aW9uIChjaGlsZFByb3BzKSB7XG4gICAgICB2YXIgZGF0YSA9IERhdGEuZ2V0RGF0YShjaGlsZFByb3BzKTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEubGVuZ3RoID4gMCA/IGRhdGEgOiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIHZhciBpdGVyYXRlZSA9IGZ1bmN0aW9uIChjaGlsZCwgY2hpbGROYW1lKSB7XG4gICAgICB2YXIgY2hpbGRQcm9wcyA9IGNoaWxkLnByb3BzIHx8IHt9O1xuICAgICAgdmFyIG5hbWUgPSBjaGlsZFByb3BzLm5hbWUgfHwgY2hpbGROYW1lO1xuICAgICAgdmFyIGJsYWNrbGlzdCA9IHByb3BzLnZvcm9ub2lCbGFja2xpc3QgfHwgW107XG4gICAgICB2YXIgYmxhY2tsaXN0U3RyID0gYmxhY2tsaXN0LmZpbHRlcihfaXNTdHJpbmcpO1xuICAgICAgdmFyIGJsYWNrbGlzdFJlZ0V4cCA9IGJsYWNrbGlzdC5maWx0ZXIoX2lzUmVnRXhwKTtcbiAgICAgIHZhciBpc1JlZ0V4cE1hdGNoID0gYmxhY2tsaXN0UmVnRXhwLnNvbWUoZnVuY3Rpb24gKHJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gcmVnRXhwLnRlc3QobmFtZSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFEYXRhLmlzRGF0YUNvbXBvbmVudChjaGlsZCkgfHwgX2luY2x1ZGVzKGJsYWNrbGlzdFN0ciwgbmFtZSkgfHwgaXNSZWdFeHBNYXRjaCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGdldENoaWxkRGF0YSA9IGNoaWxkLnR5cGUgJiYgX2lzRnVuY3Rpb24oY2hpbGQudHlwZS5nZXREYXRhKSA/IGNoaWxkLnR5cGUuZ2V0RGF0YSA6IGdldERhdGE7XG4gICAgICB2YXIgY2hpbGREYXRhID0gZ2V0Q2hpbGREYXRhKGNoaWxkLnByb3BzKTtcbiAgICAgIHJldHVybiBjaGlsZERhdGEgPyBhZGRNZXRhKGNoaWxkRGF0YSwgbmFtZSwgY2hpbGQpIDogbnVsbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEhlbHBlcnMucmVkdWNlQ2hpbGRyZW4oY2hpbGRyZW4sIGl0ZXJhdGVlLCBwcm9wcyk7XG4gIH0sXG4gIGZpbmRQb2ludHM6IGZ1bmN0aW9uIChkYXRhc2V0cywgcG9pbnQpIHtcbiAgICByZXR1cm4gZGF0YXNldHMuZmlsdGVyKGZ1bmN0aW9uIChkKSB7XG4gICAgICByZXR1cm4gcG9pbnQuX3Zvcm9ub2lYID09PSBkLl92b3Jvbm9pWCAmJiBwb2ludC5fdm9yb25vaVkgPT09IGQuX3Zvcm9ub2lZO1xuICAgIH0pO1xuICB9LFxuICB3aXRoaW5SYWRpdXM6IGZ1bmN0aW9uIChwb2ludCwgbW91c2VQb3NpdGlvbiwgcmFkaXVzKSB7XG4gICAgaWYgKCFwb2ludCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghcmFkaXVzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgeCA9IG1vdXNlUG9zaXRpb24ueCxcbiAgICAgICAgeSA9IG1vdXNlUG9zaXRpb24ueTtcbiAgICB2YXIgZGlzdGFuY2VTcXVhcmVkID0gTWF0aC5wb3coeCAtIHBvaW50WzBdLCAyKSArIE1hdGgucG93KHkgLSBwb2ludFsxXSwgMik7XG4gICAgcmV0dXJuIGRpc3RhbmNlU3F1YXJlZCA8IE1hdGgucG93KHJhZGl1cywgMik7XG4gIH0sXG4gIGdldFZvcm9ub2lQb2ludHM6IGZ1bmN0aW9uIChwcm9wcywgbW91c2VQb3NpdGlvbikge1xuICAgIHZhciBkYXRhc2V0cyA9IHRoaXMuZ2V0RGF0YXNldHMocHJvcHMpO1xuICAgIHZhciBzY2FsZWREYXRhID0gZGF0YXNldHMubWFwKGZ1bmN0aW9uIChkKSB7XG4gICAgICB2YXIgX0hlbHBlcnMkc2NhbGVQb2ludCA9IEhlbHBlcnMuc2NhbGVQb2ludChwcm9wcywgZCksXG4gICAgICAgICAgeCA9IF9IZWxwZXJzJHNjYWxlUG9pbnQueCxcbiAgICAgICAgICB5ID0gX0hlbHBlcnMkc2NhbGVQb2ludC55O1xuXG4gICAgICByZXR1cm4gW3gsIHldO1xuICAgIH0pO1xuICAgIHZhciBkZWxhdW5heSA9IERlbGF1bmF5LmZyb20oc2NhbGVkRGF0YSk7XG4gICAgdmFyIGluZGV4ID0gZGVsYXVuYXkuZmluZChtb3VzZVBvc2l0aW9uLngsIG1vdXNlUG9zaXRpb24ueSk7XG4gICAgdmFyIHdpdGhpblJhZGl1cyA9IHRoaXMud2l0aGluUmFkaXVzKHNjYWxlZERhdGFbaW5kZXhdLCBtb3VzZVBvc2l0aW9uLCBwcm9wcy5yYWRpdXMpO1xuICAgIHZhciBwb2ludHMgPSB3aXRoaW5SYWRpdXMgPyB0aGlzLmZpbmRQb2ludHMoZGF0YXNldHMsIGRhdGFzZXRzW2luZGV4XSkgOiBbXTtcbiAgICByZXR1cm4ge1xuICAgICAgcG9pbnRzOiBwb2ludHMsXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICB9LFxuICBnZXRBY3RpdmVNdXRhdGlvbnM6IGZ1bmN0aW9uIChwcm9wcywgcG9pbnQpIHtcbiAgICB2YXIgY2hpbGROYW1lID0gcG9pbnQuY2hpbGROYW1lLFxuICAgICAgICBjb250aW51b3VzID0gcG9pbnQuY29udGludW91cztcbiAgICB2YXIgYWN0aXZhdGVEYXRhID0gcHJvcHMuYWN0aXZhdGVEYXRhLFxuICAgICAgICBhY3RpdmF0ZUxhYmVscyA9IHByb3BzLmFjdGl2YXRlTGFiZWxzLFxuICAgICAgICBsYWJlbHMgPSBwcm9wcy5sYWJlbHM7XG5cbiAgICBpZiAoIWFjdGl2YXRlRGF0YSAmJiAhYWN0aXZhdGVMYWJlbHMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFRhcmdldCA9IGFjdGl2YXRlRGF0YSA/IFtcImRhdGFcIl0gOiBbXTtcbiAgICB2YXIgdGFyZ2V0cyA9IGxhYmVscyAmJiAhYWN0aXZhdGVMYWJlbHMgPyBkZWZhdWx0VGFyZ2V0IDogZGVmYXVsdFRhcmdldC5jb25jYXQoXCJsYWJlbHNcIik7XG5cbiAgICBpZiAoX2lzRW1wdHkodGFyZ2V0cykpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgdmFyIGV2ZW50S2V5ID0gY29udGludW91cyA9PT0gdHJ1ZSAmJiB0YXJnZXQgPT09IFwiZGF0YVwiID8gXCJhbGxcIiA6IHBvaW50LmV2ZW50S2V5O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hpbGROYW1lOiBjaGlsZE5hbWUsXG4gICAgICAgIGV2ZW50S2V5OiBldmVudEtleSxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIG11dGF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH0sXG4gIGdldEluYWN0aXZlTXV0YXRpb25zOiBmdW5jdGlvbiAocHJvcHMsIHBvaW50KSB7XG4gICAgdmFyIGNoaWxkTmFtZSA9IHBvaW50LmNoaWxkTmFtZSxcbiAgICAgICAgY29udGludW91cyA9IHBvaW50LmNvbnRpbnVvdXM7XG4gICAgdmFyIGFjdGl2YXRlRGF0YSA9IHByb3BzLmFjdGl2YXRlRGF0YSxcbiAgICAgICAgYWN0aXZhdGVMYWJlbHMgPSBwcm9wcy5hY3RpdmF0ZUxhYmVscyxcbiAgICAgICAgbGFiZWxzID0gcHJvcHMubGFiZWxzO1xuXG4gICAgaWYgKCFhY3RpdmF0ZURhdGEgJiYgIWFjdGl2YXRlTGFiZWxzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRUYXJnZXQgPSBhY3RpdmF0ZURhdGEgPyBbXCJkYXRhXCJdIDogW107XG4gICAgdmFyIHRhcmdldHMgPSBsYWJlbHMgJiYgIWFjdGl2YXRlTGFiZWxzID8gZGVmYXVsdFRhcmdldCA6IGRlZmF1bHRUYXJnZXQuY29uY2F0KFwibGFiZWxzXCIpO1xuXG4gICAgaWYgKF9pc0VtcHR5KHRhcmdldHMpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldHMubWFwKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIHZhciBldmVudEtleSA9IGNvbnRpbnVvdXMgJiYgdGFyZ2V0ID09PSBcImRhdGFcIiA/IFwiYWxsXCIgOiBwb2ludC5ldmVudEtleTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoaWxkTmFtZTogY2hpbGROYW1lLFxuICAgICAgICBldmVudEtleTogZXZlbnRLZXksXG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICBtdXRhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuICBnZXRQYXJlbnRNdXRhdGlvbjogZnVuY3Rpb24gKGFjdGl2ZVBvaW50cywgbW91c2VQb3NpdGlvbiwgcGFyZW50U1ZHLCB2SW5kZXgpIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIHRhcmdldDogXCJwYXJlbnRcIixcbiAgICAgIGV2ZW50S2V5OiBcInBhcmVudFwiLFxuICAgICAgbXV0YXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhY3RpdmVQb2ludHM6IGFjdGl2ZVBvaW50cyxcbiAgICAgICAgICBtb3VzZVBvc2l0aW9uOiBtb3VzZVBvc2l0aW9uLFxuICAgICAgICAgIHBhcmVudFNWRzogcGFyZW50U1ZHLFxuICAgICAgICAgIHZJbmRleDogdkluZGV4XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfV07XG4gIH0sXG4gIG9uQWN0aXZhdGVkOiBmdW5jdGlvbiAocHJvcHMsIHBvaW50cykge1xuICAgIGlmIChfaXNGdW5jdGlvbihwcm9wcy5vbkFjdGl2YXRlZCkpIHtcbiAgICAgIHByb3BzLm9uQWN0aXZhdGVkKHBvaW50cywgcHJvcHMpO1xuICAgIH1cbiAgfSxcbiAgb25EZWFjdGl2YXRlZDogZnVuY3Rpb24gKHByb3BzLCBwb2ludHMpIHtcbiAgICBpZiAoX2lzRnVuY3Rpb24ocHJvcHMub25EZWFjdGl2YXRlZCkpIHtcbiAgICAgIHByb3BzLm9uRGVhY3RpdmF0ZWQocG9pbnRzLCBwcm9wcyk7XG4gICAgfVxuICB9LFxuICBvbk1vdXNlTGVhdmU6IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcyxcbiAgICAgICAgX2dldFBhcmVudE11dGF0aW9uO1xuXG4gICAgdmFyIGFjdGl2ZVBvaW50cyA9IHRhcmdldFByb3BzLmFjdGl2ZVBvaW50cyB8fCBbXTtcbiAgICB0aGlzLm9uRGVhY3RpdmF0ZWQodGFyZ2V0UHJvcHMsIGFjdGl2ZVBvaW50cyk7XG4gICAgdmFyIGluYWN0aXZlTXV0YXRpb25zID0gYWN0aXZlUG9pbnRzLmxlbmd0aCA/IGFjdGl2ZVBvaW50cy5tYXAoZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgICByZXR1cm4gX3RoaXMuZ2V0SW5hY3RpdmVNdXRhdGlvbnModGFyZ2V0UHJvcHMsIHBvaW50KTtcbiAgICB9KSA6IFtdO1xuICAgIHJldHVybiAoX2dldFBhcmVudE11dGF0aW9uID0gdGhpcy5nZXRQYXJlbnRNdXRhdGlvbihbXSkpLmNvbmNhdC5hcHBseShfZ2V0UGFyZW50TXV0YXRpb24sIF90b0NvbnN1bWFibGVBcnJheShpbmFjdGl2ZU11dGF0aW9ucykpO1xuICB9LFxuICBvbk1vdXNlTW92ZTogZnVuY3Rpb24gKGV2dCwgdGFyZ2V0UHJvcHMpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbWF4LXN0YXRlbWVudHNcbiAgICB2YXIgYWN0aXZlUG9pbnRzID0gdGFyZ2V0UHJvcHMuYWN0aXZlUG9pbnRzIHx8IFtdO1xuICAgIHZhciBwYXJlbnRTVkcgPSB0YXJnZXRQcm9wcy5wYXJlbnRTVkcgfHwgU2VsZWN0aW9uLmdldFBhcmVudFNWRyhldnQpO1xuICAgIHZhciBtb3VzZVBvc2l0aW9uID0gU2VsZWN0aW9uLmdldFNWR0V2ZW50Q29vcmRpbmF0ZXMoZXZ0LCBwYXJlbnRTVkcpO1xuXG4gICAgaWYgKCF0aGlzLndpdGhpbkJvdW5kcyh0YXJnZXRQcm9wcywgbW91c2VQb3NpdGlvbikpIHtcbiAgICAgIHZhciBfZ2V0UGFyZW50TXV0YXRpb24yO1xuXG4gICAgICB0aGlzLm9uRGVhY3RpdmF0ZWQodGFyZ2V0UHJvcHMsIGFjdGl2ZVBvaW50cyk7XG4gICAgICB2YXIgaW5hY3RpdmVNdXRhdGlvbnMgPSBhY3RpdmVQb2ludHMubGVuZ3RoID8gYWN0aXZlUG9pbnRzLm1hcChmdW5jdGlvbiAocG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5nZXRJbmFjdGl2ZU11dGF0aW9ucyh0YXJnZXRQcm9wcywgcG9pbnQpO1xuICAgICAgfSkgOiBbXTtcbiAgICAgIHJldHVybiAoX2dldFBhcmVudE11dGF0aW9uMiA9IHRoaXMuZ2V0UGFyZW50TXV0YXRpb24oW10sIG1vdXNlUG9zaXRpb24sIHBhcmVudFNWRykpLmNvbmNhdC5hcHBseShfZ2V0UGFyZW50TXV0YXRpb24yLCBfdG9Db25zdW1hYmxlQXJyYXkoaW5hY3RpdmVNdXRhdGlvbnMpKTtcbiAgICB9XG5cbiAgICB2YXIgX2dldFZvcm9ub2lQb2ludHMgPSB0aGlzLmdldFZvcm9ub2lQb2ludHModGFyZ2V0UHJvcHMsIG1vdXNlUG9zaXRpb24pLFxuICAgICAgICBfZ2V0Vm9yb25vaVBvaW50cyRwb2kgPSBfZ2V0Vm9yb25vaVBvaW50cy5wb2ludHMsXG4gICAgICAgIHBvaW50cyA9IF9nZXRWb3Jvbm9pUG9pbnRzJHBvaSA9PT0gdm9pZCAwID8gW10gOiBfZ2V0Vm9yb25vaVBvaW50cyRwb2ksXG4gICAgICAgIGluZGV4ID0gX2dldFZvcm9ub2lQb2ludHMuaW5kZXg7XG5cbiAgICB2YXIgcGFyZW50TXV0YXRpb25zID0gdGhpcy5nZXRQYXJlbnRNdXRhdGlvbihwb2ludHMsIG1vdXNlUG9zaXRpb24sIHBhcmVudFNWRywgaW5kZXgpO1xuXG4gICAgaWYgKGFjdGl2ZVBvaW50cy5sZW5ndGggJiYgaXNFcXVhbChwb2ludHMsIGFjdGl2ZVBvaW50cykpIHtcbiAgICAgIHJldHVybiBwYXJlbnRNdXRhdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25BY3RpdmF0ZWQodGFyZ2V0UHJvcHMsIHBvaW50cyk7XG4gICAgICB0aGlzLm9uRGVhY3RpdmF0ZWQodGFyZ2V0UHJvcHMsIGFjdGl2ZVBvaW50cyk7XG4gICAgICB2YXIgYWN0aXZlTXV0YXRpb25zID0gcG9pbnRzLmxlbmd0aCA/IHBvaW50cy5tYXAoZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuZ2V0QWN0aXZlTXV0YXRpb25zKHRhcmdldFByb3BzLCBwb2ludCk7XG4gICAgICB9KSA6IFtdO1xuXG4gICAgICB2YXIgX2luYWN0aXZlTXV0YXRpb25zID0gYWN0aXZlUG9pbnRzLmxlbmd0aCA/IGFjdGl2ZVBvaW50cy5tYXAoZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuZ2V0SW5hY3RpdmVNdXRhdGlvbnModGFyZ2V0UHJvcHMsIHBvaW50KTtcbiAgICAgIH0pIDogW107XG5cbiAgICAgIHJldHVybiBwYXJlbnRNdXRhdGlvbnMuY29uY2F0LmFwcGx5KHBhcmVudE11dGF0aW9ucywgX3RvQ29uc3VtYWJsZUFycmF5KF9pbmFjdGl2ZU11dGF0aW9ucykuY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhY3RpdmVNdXRhdGlvbnMpKSk7XG4gICAgfVxuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQge1xuICBvbk1vdXNlTGVhdmU6IFZvcm9ub2lIZWxwZXJzLm9uTW91c2VMZWF2ZS5iaW5kKFZvcm9ub2lIZWxwZXJzKSxcbiAgb25Nb3VzZU1vdmU6IF90aHJvdHRsZShWb3Jvbm9pSGVscGVycy5vbk1vdXNlTW92ZS5iaW5kKFZvcm9ub2lIZWxwZXJzKSwgMzIsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICB7XG4gICAgbGVhZGluZzogdHJ1ZSxcbiAgICB0cmFpbGluZzogZmFsc2VcbiAgfSlcbn07IiwiaW1wb3J0IF9waWNrIGZyb20gXCJsb2Rhc2gvcGlja1wiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gvaXNGdW5jdGlvblwiO1xuaW1wb3J0IF9kZWZhdWx0cyBmcm9tIFwibG9kYXNoL2RlZmF1bHRzXCI7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFZpY3RvcnlUb29sdGlwIH0gZnJvbSBcInZpY3RvcnktdG9vbHRpcFwiO1xuaW1wb3J0IHsgVmljdG9yeUNvbnRhaW5lciwgSGVscGVycywgUHJvcFR5cGVzIGFzIEN1c3RvbVByb3BUeXBlcyB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbmltcG9ydCBWb3Jvbm9pSGVscGVycyBmcm9tIFwiLi92b3Jvbm9pLWhlbHBlcnNcIjtcbmV4cG9ydCB2YXIgdm9yb25vaUNvbnRhaW5lck1peGluID0gZnVuY3Rpb24gKGJhc2UpIHtcbiAgdmFyIF9jbGFzcywgX3RlbXA7XG5cbiAgcmV0dXJuIF90ZW1wID0gX2NsYXNzID1cbiAgLyojX19QVVJFX18qL1xuICBmdW5jdGlvbiAoX2Jhc2UpIHtcbiAgICBfaW5oZXJpdHMoVmljdG9yeVZvcm9ub2lDb250YWluZXIsIF9iYXNlKTtcblxuICAgIGZ1bmN0aW9uIFZpY3RvcnlWb3Jvbm9pQ29udGFpbmVyKCkge1xuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFZpY3RvcnlWb3Jvbm9pQ29udGFpbmVyKTtcblxuICAgICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChWaWN0b3J5Vm9yb25vaUNvbnRhaW5lci5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFZpY3RvcnlWb3Jvbm9pQ29udGFpbmVyKSkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKFZpY3RvcnlWb3Jvbm9pQ29udGFpbmVyLCBbe1xuICAgICAga2V5OiBcImdldERpbWVuc2lvblwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldERpbWVuc2lvbihwcm9wcykge1xuICAgICAgICB2YXIgaG9yaXpvbnRhbCA9IHByb3BzLmhvcml6b250YWwsXG4gICAgICAgICAgICB2b3Jvbm9pRGltZW5zaW9uID0gcHJvcHMudm9yb25vaURpbWVuc2lvbjtcblxuICAgICAgICBpZiAoIWhvcml6b250YWwgfHwgIXZvcm9ub2lEaW1lbnNpb24pIHtcbiAgICAgICAgICByZXR1cm4gdm9yb25vaURpbWVuc2lvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2b3Jvbm9pRGltZW5zaW9uID09PSBcInhcIiA/IFwieVwiIDogXCJ4XCI7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImdldFBvaW50XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UG9pbnQocG9pbnQpIHtcbiAgICAgICAgdmFyIHdoaXRlbGlzdCA9IFtcIl94XCIsIFwiX3gxXCIsIFwiX3gwXCIsIFwiX3lcIiwgXCJfeTFcIiwgXCJfeTBcIl07XG4gICAgICAgIHJldHVybiBfcGljayhwb2ludCwgd2hpdGVsaXN0KTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiZ2V0TGFiZWxQb3NpdGlvblwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldExhYmVsUG9zaXRpb24ocHJvcHMsIGxhYmVsUHJvcHMsIHBvaW50cykge1xuICAgICAgICB2YXIgbW91c2VQb3NpdGlvbiA9IHByb3BzLm1vdXNlUG9zaXRpb24sXG4gICAgICAgICAgICBtb3VzZUZvbGxvd1Rvb2x0aXBzID0gcHJvcHMubW91c2VGb2xsb3dUb29sdGlwcztcbiAgICAgICAgdmFyIHZvcm9ub2lEaW1lbnNpb24gPSB0aGlzLmdldERpbWVuc2lvbihwcm9wcyk7XG4gICAgICAgIHZhciBwb2ludCA9IHRoaXMuZ2V0UG9pbnQocG9pbnRzWzBdKTtcbiAgICAgICAgdmFyIGJhc2VQb3NpdGlvbiA9IEhlbHBlcnMuc2NhbGVQb2ludChwcm9wcywgcG9pbnQpO1xuICAgICAgICB2YXIgY2VudGVyID0gbW91c2VGb2xsb3dUb29sdGlwcyA/IG1vdXNlUG9zaXRpb24gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKCF2b3Jvbm9pRGltZW5zaW9uIHx8IHBvaW50cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIGJhc2VQb3NpdGlvbiwge1xuICAgICAgICAgICAgY2VudGVyOiBfZGVmYXVsdHMoe30sIGxhYmVsUHJvcHMuY2VudGVyLCBjZW50ZXIpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgeCA9IHZvcm9ub2lEaW1lbnNpb24gPT09IFwieVwiID8gbW91c2VQb3NpdGlvbi54IDogYmFzZVBvc2l0aW9uLng7XG4gICAgICAgIHZhciB5ID0gdm9yb25vaURpbWVuc2lvbiA9PT0gXCJ4XCIgPyBtb3VzZVBvc2l0aW9uLnkgOiBiYXNlUG9zaXRpb24ueTtcbiAgICAgICAgY2VudGVyID0gbW91c2VGb2xsb3dUb29sdGlwcyA/IG1vdXNlUG9zaXRpb24gOiB7XG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiB5XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiB5LFxuICAgICAgICAgIGNlbnRlcjogX2RlZmF1bHRzKHt9LCBsYWJlbFByb3BzLmNlbnRlciwgY2VudGVyKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJnZXRTdHlsZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFN0eWxlKHByb3BzLCBwb2ludHMsIHR5cGUpIHtcbiAgICAgICAgdmFyIGxhYmVscyA9IHByb3BzLmxhYmVscyxcbiAgICAgICAgICAgIGxhYmVsQ29tcG9uZW50ID0gcHJvcHMubGFiZWxDb21wb25lbnQsXG4gICAgICAgICAgICB0aGVtZSA9IHByb3BzLnRoZW1lO1xuICAgICAgICB2YXIgY29tcG9uZW50UHJvcHMgPSBsYWJlbENvbXBvbmVudC5wcm9wcyB8fCB7fTtcbiAgICAgICAgdmFyIHRoZW1lU3R5bGVzID0gdGhlbWUgJiYgdGhlbWUudm9yb25vaSAmJiB0aGVtZS52b3Jvbm9pLnN0eWxlID8gdGhlbWUudm9yb25vaS5zdHlsZSA6IHt9O1xuICAgICAgICB2YXIgY29tcG9uZW50U3R5bGVBcnJheSA9IHR5cGUgPT09IFwiZmx5b3V0XCIgPyBjb21wb25lbnRQcm9wcy5mbHlvdXRTdHlsZSA6IGNvbXBvbmVudFByb3BzLnN0eWxlO1xuICAgICAgICByZXR1cm4gcG9pbnRzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgZGF0dW0sIGluZGV4KSB7XG4gICAgICAgICAgdmFyIGxhYmVsUHJvcHMgPSBfZGVmYXVsdHMoe30sIGNvbXBvbmVudFByb3BzLCB7XG4gICAgICAgICAgICBkYXR1bTogZGF0dW0sXG4gICAgICAgICAgICBhY3RpdmU6IHRydWVcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZhciB0ZXh0ID0gX2lzRnVuY3Rpb24obGFiZWxzKSA/IGxhYmVscyhsYWJlbFByb3BzKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICB2YXIgdGV4dEFycmF5ID0gdGV4dCAhPT0gdW5kZWZpbmVkID8gXCJcIi5jb25jYXQodGV4dCkuc3BsaXQoXCJcXG5cIikgOiBbXTtcbiAgICAgICAgICB2YXIgYmFzZVN0eWxlID0gZGF0dW0uc3R5bGUgJiYgZGF0dW0uc3R5bGVbdHlwZV0gfHwge307XG4gICAgICAgICAgdmFyIGNvbXBvbmVudFN0eWxlID0gQXJyYXkuaXNBcnJheShjb21wb25lbnRTdHlsZUFycmF5KSA/IGNvbXBvbmVudFN0eWxlQXJyYXlbaW5kZXhdIDogY29tcG9uZW50U3R5bGVBcnJheTtcbiAgICAgICAgICB2YXIgc3R5bGUgPSBIZWxwZXJzLmV2YWx1YXRlU3R5bGUoX2RlZmF1bHRzKHt9LCBjb21wb25lbnRTdHlsZSwgYmFzZVN0eWxlLCB0aGVtZVN0eWxlc1t0eXBlXSksIGxhYmVsUHJvcHMpO1xuICAgICAgICAgIHZhciBzdHlsZUFycmF5ID0gdGV4dEFycmF5Lmxlbmd0aCA/IHRleHRBcnJheS5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICAgIH0pIDogW3N0eWxlXTtcbiAgICAgICAgICBtZW1vID0gbWVtby5jb25jYXQoc3R5bGVBcnJheSk7XG4gICAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICAgIH0sIFtdKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiZ2V0RGVmYXVsdExhYmVsUHJvcHNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZWZhdWx0TGFiZWxQcm9wcyhwcm9wcywgcG9pbnRzKSB7XG4gICAgICAgIHZhciB2b3Jvbm9pRGltZW5zaW9uID0gcHJvcHMudm9yb25vaURpbWVuc2lvbixcbiAgICAgICAgICAgIGhvcml6b250YWwgPSBwcm9wcy5ob3Jpem9udGFsLFxuICAgICAgICAgICAgbW91c2VGb2xsb3dUb29sdGlwcyA9IHByb3BzLm1vdXNlRm9sbG93VG9vbHRpcHM7XG4gICAgICAgIHZhciBwb2ludCA9IHRoaXMuZ2V0UG9pbnQocG9pbnRzWzBdKTtcbiAgICAgICAgdmFyIG11bHRpUG9pbnQgPSB2b3Jvbm9pRGltZW5zaW9uICYmIHBvaW50cy5sZW5ndGggPiAxO1xuICAgICAgICB2YXIgeSA9IHBvaW50Ll95MSAhPT0gdW5kZWZpbmVkID8gcG9pbnQuX3kxIDogcG9pbnQuX3k7XG4gICAgICAgIHZhciBkZWZhdWx0SG9yaXpvbnRhbE9yaWVudGF0aW9uID0geSA8IDAgPyBcImxlZnRcIiA6IFwicmlnaHRcIjtcbiAgICAgICAgdmFyIGRlZmF1bHRPcmllbnRhdGlvbiA9IHkgPCAwID8gXCJib3R0b21cIiA6IFwidG9wXCI7XG4gICAgICAgIHZhciBsYWJlbE9yaWVudGF0aW9uID0gaG9yaXpvbnRhbCA/IGRlZmF1bHRIb3Jpem9udGFsT3JpZW50YXRpb24gOiBkZWZhdWx0T3JpZW50YXRpb247XG4gICAgICAgIHZhciBvcmllbnRhdGlvbiA9IG1vdXNlRm9sbG93VG9vbHRpcHMgPyB1bmRlZmluZWQgOiBsYWJlbE9yaWVudGF0aW9uO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9yaWVudGF0aW9uOiBvcmllbnRhdGlvbixcbiAgICAgICAgICBwb2ludGVyTGVuZ3RoOiBtdWx0aVBvaW50ID8gMCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjb25zdHJhaW5Ub1Zpc2libGVBcmVhOiBtdWx0aVBvaW50IHx8IG1vdXNlRm9sbG93VG9vbHRpcHMgPyB0cnVlIDogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImdldExhYmVsUHJvcHNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRMYWJlbFByb3BzKHByb3BzLCBwb2ludHMpIHtcbiAgICAgICAgdmFyIGxhYmVscyA9IHByb3BzLmxhYmVscyxcbiAgICAgICAgICAgIHNjYWxlID0gcHJvcHMuc2NhbGUsXG4gICAgICAgICAgICBsYWJlbENvbXBvbmVudCA9IHByb3BzLmxhYmVsQ29tcG9uZW50LFxuICAgICAgICAgICAgdGhlbWUgPSBwcm9wcy50aGVtZSxcbiAgICAgICAgICAgIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQgPSBwcm9wcy5oZWlnaHQ7XG4gICAgICAgIHZhciBjb21wb25lbnRQcm9wcyA9IGxhYmVsQ29tcG9uZW50LnByb3BzIHx8IHt9O1xuICAgICAgICB2YXIgdGV4dCA9IHBvaW50cy5yZWR1Y2UoZnVuY3Rpb24gKG1lbW8sIGRhdHVtKSB7XG4gICAgICAgICAgdmFyIGxhYmVsUHJvcHMgPSBfZGVmYXVsdHMoe30sIGNvbXBvbmVudFByb3BzLCB7XG4gICAgICAgICAgICBkYXR1bTogZGF0dW0sXG4gICAgICAgICAgICBhY3RpdmU6IHRydWVcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZhciB0ID0gX2lzRnVuY3Rpb24obGFiZWxzKSA/IGxhYmVscyhsYWJlbFByb3BzKSA6IG51bGw7XG5cbiAgICAgICAgICBpZiAodCA9PT0gbnVsbCB8fCB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1lbW8gPSBtZW1vLmNvbmNhdChcIlwiLmNvbmNhdCh0KS5zcGxpdChcIlxcblwiKSk7XG4gICAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICAgIH0sIFtdKTsgLy8gcmVtb3ZlIHByb3BlcnRpZXMgZnJvbSBmaXJzdCBwb2ludCB0byBtYWtlIGRhdHVtXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuXG4gICAgICAgIHZhciBfcG9pbnRzJCA9IHBvaW50c1swXSxcbiAgICAgICAgICAgIGNoaWxkTmFtZSA9IF9wb2ludHMkLmNoaWxkTmFtZSxcbiAgICAgICAgICAgIGV2ZW50S2V5ID0gX3BvaW50cyQuZXZlbnRLZXksXG4gICAgICAgICAgICBzdHlsZSA9IF9wb2ludHMkLnN0eWxlLFxuICAgICAgICAgICAgY29udGludW91cyA9IF9wb2ludHMkLmNvbnRpbnVvdXMsXG4gICAgICAgICAgICBkYXR1bSA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcG9pbnRzJCwgW1wiY2hpbGROYW1lXCIsIFwiZXZlbnRLZXlcIiwgXCJzdHlsZVwiLCBcImNvbnRpbnVvdXNcIl0pO1xuXG4gICAgICAgIHZhciBuYW1lID0gcHJvcHMubmFtZSA9PT0gY2hpbGROYW1lID8gY2hpbGROYW1lIDogXCJcIi5jb25jYXQocHJvcHMubmFtZSwgXCItXCIpLmNvbmNhdChjaGlsZE5hbWUpO1xuXG4gICAgICAgIHZhciBsYWJlbFByb3BzID0gX2RlZmF1bHRzKHtcbiAgICAgICAgICBrZXk6IFwiXCIuY29uY2F0KG5hbWUsIFwiLVwiKS5jb25jYXQoZXZlbnRLZXksIFwiLXZvcm9ub2ktdG9vbHRpcFwiKSxcbiAgICAgICAgICBpZDogXCJcIi5jb25jYXQobmFtZSwgXCItXCIpLmNvbmNhdChldmVudEtleSwgXCItdm9yb25vaS10b29sdGlwXCIpLFxuICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICByZW5kZXJJblBvcnRhbDogZmFsc2UsXG4gICAgICAgICAgYWN0aXZlUG9pbnRzOiBwb2ludHMsXG4gICAgICAgICAgZGF0dW06IGRhdHVtLFxuICAgICAgICAgIHNjYWxlOiBzY2FsZSxcbiAgICAgICAgICB0aGVtZTogdGhlbWVcbiAgICAgICAgfSwgY29tcG9uZW50UHJvcHMsIHtcbiAgICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICBzdHlsZTogdGhpcy5nZXRTdHlsZShwcm9wcywgcG9pbnRzLCBcImxhYmVsc1wiKSxcbiAgICAgICAgICBmbHlvdXRTdHlsZTogdGhpcy5nZXRTdHlsZShwcm9wcywgcG9pbnRzLCBcImZseW91dFwiKVswXVxuICAgICAgICB9LCB0aGlzLmdldERlZmF1bHRMYWJlbFByb3BzKHByb3BzLCBwb2ludHMpKTtcblxuICAgICAgICB2YXIgbGFiZWxQb3NpdGlvbiA9IHRoaXMuZ2V0TGFiZWxQb3NpdGlvbihwcm9wcywgbGFiZWxQcm9wcywgcG9pbnRzKTtcbiAgICAgICAgcmV0dXJuIF9kZWZhdWx0cyh7fSwgbGFiZWxQb3NpdGlvbiwgbGFiZWxQcm9wcyk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImdldFRvb2x0aXBcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUb29sdGlwKHByb3BzKSB7XG4gICAgICAgIHZhciBsYWJlbHMgPSBwcm9wcy5sYWJlbHMsXG4gICAgICAgICAgICBhY3RpdmVQb2ludHMgPSBwcm9wcy5hY3RpdmVQb2ludHMsXG4gICAgICAgICAgICBsYWJlbENvbXBvbmVudCA9IHByb3BzLmxhYmVsQ29tcG9uZW50O1xuXG4gICAgICAgIGlmICghbGFiZWxzKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhY3RpdmVQb2ludHMpICYmIGFjdGl2ZVBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgbGFiZWxQcm9wcyA9IHRoaXMuZ2V0TGFiZWxQcm9wcyhwcm9wcywgYWN0aXZlUG9pbnRzKTtcbiAgICAgICAgICB2YXIgdGV4dCA9IGxhYmVsUHJvcHMudGV4dDtcbiAgICAgICAgICB2YXIgc2hvd0xhYmVsID0gQXJyYXkuaXNBcnJheSh0ZXh0KSA/IHRleHQuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aCA6IHRleHQ7XG4gICAgICAgICAgcmV0dXJuIHNob3dMYWJlbCA/IFJlYWN0LmNsb25lRWxlbWVudChsYWJlbENvbXBvbmVudCwgbGFiZWxQcm9wcykgOiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9IC8vIE92ZXJyaWRlcyBtZXRob2QgaW4gVmljdG9yeUNvbnRhaW5lclxuXG4gICAgfSwge1xuICAgICAga2V5OiBcImdldENoaWxkcmVuXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2hpbGRyZW4ocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIF90b0NvbnN1bWFibGVBcnJheShSZWFjdC5DaGlsZHJlbi50b0FycmF5KHByb3BzLmNoaWxkcmVuKSkuY29uY2F0KFt0aGlzLmdldFRvb2x0aXAocHJvcHMpXSk7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFZpY3RvcnlWb3Jvbm9pQ29udGFpbmVyO1xuICB9KGJhc2UpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcImRpc3BsYXlOYW1lXCIsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogXCJWaWN0b3J5Vm9yb25vaUNvbnRhaW5lclwiXG4gIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcInByb3BUeXBlc1wiLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IF9vYmplY3RTcHJlYWQoe30sIFZpY3RvcnlDb250YWluZXIucHJvcFR5cGVzLCB7XG4gICAgICBhY3RpdmF0ZURhdGE6IFByb3BUeXBlcy5ib29sLFxuICAgICAgYWN0aXZhdGVMYWJlbHM6IFByb3BUeXBlcy5ib29sLFxuICAgICAgZGlzYWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgICBsYWJlbENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG4gICAgICBsYWJlbHM6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgbW91c2VGb2xsb3dUb29sdGlwczogUHJvcFR5cGVzLmJvb2wsXG4gICAgICBvbkFjdGl2YXRlZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBvbkRlYWN0aXZhdGVkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIHJhZGl1czogUHJvcFR5cGVzLm51bWJlcixcbiAgICAgIHZvcm9ub2lCbGFja2xpc3Q6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIEN1c3RvbVByb3BUeXBlcy5yZWdFeHBdKSksXG4gICAgICB2b3Jvbm9pRGltZW5zaW9uOiBQcm9wVHlwZXMub25lT2YoW1wieFwiLCBcInlcIl0pLFxuICAgICAgdm9yb25vaVBhZGRpbmc6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIHRvcDogUHJvcFR5cGVzLm51bWJlcixcbiAgICAgICAgYm90dG9tOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgICBsZWZ0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgICByaWdodDogUHJvcFR5cGVzLm51bWJlclxuICAgICAgfSldKVxuICAgIH0pXG4gIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IF9vYmplY3RTcHJlYWQoe30sIFZpY3RvcnlDb250YWluZXIuZGVmYXVsdFByb3BzLCB7XG4gICAgICBhY3RpdmF0ZURhdGE6IHRydWUsXG4gICAgICBhY3RpdmF0ZUxhYmVsczogdHJ1ZSxcbiAgICAgIGxhYmVsQ29tcG9uZW50OiBSZWFjdC5jcmVhdGVFbGVtZW50KFZpY3RvcnlUb29sdGlwLCBudWxsKSxcbiAgICAgIHZvcm9ub2lQYWRkaW5nOiA1XG4gICAgfSlcbiAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwiZGVmYXVsdEV2ZW50c1wiLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgcmV0dXJuIFt7XG4gICAgICAgIHRhcmdldDogXCJwYXJlbnRcIixcbiAgICAgICAgZXZlbnRIYW5kbGVyczoge1xuICAgICAgICAgIG9uTW91c2VMZWF2ZTogZnVuY3Rpb24gKGV2dCwgdGFyZ2V0UHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5kaXNhYmxlID8ge30gOiBWb3Jvbm9pSGVscGVycy5vbk1vdXNlTGVhdmUoZXZ0LCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblRvdWNoQ2FuY2VsOiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzLmRpc2FibGUgPyB7fSA6IFZvcm9ub2lIZWxwZXJzLm9uTW91c2VMZWF2ZShldnQsIHRhcmdldFByb3BzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uTW91c2VNb3ZlOiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzLmRpc2FibGUgPyB7fSA6IFZvcm9ub2lIZWxwZXJzLm9uTW91c2VNb3ZlKGV2dCwgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Ub3VjaE1vdmU6IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHMuZGlzYWJsZSA/IHt9IDogVm9yb25vaUhlbHBlcnMub25Nb3VzZU1vdmUoZXZ0LCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIHRhcmdldDogXCJkYXRhXCIsXG4gICAgICAgIGV2ZW50SGFuZGxlcnM6IHByb3BzLmRpc2FibGUgPyB7fSA6IHtcbiAgICAgICAgICBvbk1vdXNlT3ZlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1vdXNlT3V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uTW91c2VNb3ZlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1dO1xuICAgIH1cbiAgfSksIF90ZW1wO1xufTtcbmV4cG9ydCBkZWZhdWx0IHZvcm9ub2lDb250YWluZXJNaXhpbihWaWN0b3J5Q29udGFpbmVyKTsiLCJpbXBvcnQgX2RlbGF5IGZyb20gXCJsb2Rhc2gvZGVsYXlcIjtcbmltcG9ydCBfZGVmYXVsdHMgZnJvbSBcImxvZGFzaC9kZWZhdWx0c1wiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gvaXNGdW5jdGlvblwiO1xuaW1wb3J0IF90aHJvdHRsZSBmcm9tIFwibG9kYXNoL3Rocm90dGxlXCI7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG4vKmVzbGludCBuby1tYWdpYy1udW1iZXJzOiBbXCJlcnJvclwiLCB7IFwiaWdub3JlXCI6IFstMSwgMCwgMSwgMiwgMTAwMF0gfV0qL1xuaW1wb3J0IHsgQ2hpbGRyZW4gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFNlbGVjdGlvbiwgQ29sbGVjdGlvbiwgV3JhcHBlciB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbnZhciBSYXdab29tSGVscGVycyA9IHtcbiAgY2hlY2tEb21haW5FcXVhbGl0eTogZnVuY3Rpb24gKGEsIGIpIHtcbiAgICB2YXIgY2hlY2tEaW1lbnNpb24gPSBmdW5jdGlvbiAoZGltKSB7XG4gICAgICB2YXIgdmFsMSA9IGEgJiYgYVtkaW1dO1xuICAgICAgdmFyIHZhbDIgPSBiICYmIGJbZGltXTtcblxuICAgICAgaWYgKCF2YWwxICYmICF2YWwyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmICghdmFsMSB8fCAhdmFsMikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiArdmFsMVswXSA9PT0gK3ZhbDJbMF0gJiYgK3ZhbDFbMV0gPT09ICt2YWwyWzFdO1xuICAgIH07XG5cbiAgICByZXR1cm4gY2hlY2tEaW1lbnNpb24oXCJ4XCIpICYmIGNoZWNrRGltZW5zaW9uKFwieVwiKTtcbiAgfSxcblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgbmV3IGRvbWFpbiBzY2FsZWQgYnkgZmFjdG9yIGFuZCBjb25zdHJhaW5lZCBieSB0aGUgb3JpZ2luYWwgZG9tYWluLlxuICAgKiBAcGFyYW0gIHtbTnVtYmVyLCBOdW1iZXJdfSBjdXJyZW50RG9tYWluICBUaGUgZG9tYWluIHRvIGJlIHNjYWxlZC5cbiAgICogQHBhcmFtICB7T2JqZWN0fSBldnQgdGhlIGV2ZW50IG9iamVjdFxuICAgKiBAcGFyYW0gIHtPYmplY3R9IHByb3BzIHRoZSBwcm9wcyBvZiB0aGUgdGFyZ2V0ZWQgY29tcG9uZW50XG4gICAqIEBwYXJhbSAge1N0cmluZ30gYXhpcyB0aGUgZGVzaXJlZCBkaW1lbnNpb24gKGVpdGhlciB4IG9yIHkpXG4gICAqIEByZXR1cm4ge1tOdW1iZXIsIE51bWJlcl19ICAgICAgICAgICAgICAgIFRoZSBzY2FsZSBkb21haW5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG4gIHNjYWxlOiBmdW5jdGlvbiAoY3VycmVudERvbWFpbiwgZXZ0LCBwcm9wcywgYXhpcykge1xuICAgIHZhciBfY3VycmVudERvbWFpbiA9IF9zbGljZWRUb0FycmF5KGN1cnJlbnREb21haW4sIDIpLFxuICAgICAgICBmcm9tID0gX2N1cnJlbnREb21haW5bMF0sXG4gICAgICAgIHRvID0gX2N1cnJlbnREb21haW5bMV07XG5cbiAgICB2YXIgcmFuZ2UgPSBNYXRoLmFicyh0byAtIGZyb20pO1xuICAgIHZhciBtaW5pbXVtWm9vbSA9IHByb3BzLm1pbmltdW1ab29tICYmIHByb3BzLm1pbmltdW1ab29tW2F4aXNdO1xuICAgIHZhciBmYWN0b3IgPSB0aGlzLmdldFNjYWxlRmFjdG9yKGV2dCk7XG5cbiAgICBpZiAobWluaW11bVpvb20gJiYgcmFuZ2UgPD0gbWluaW11bVpvb20gJiYgZmFjdG9yIDwgMSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnREb21haW47XG4gICAgfVxuXG4gICAgdmFyIF9nZXREb21haW4kYXhpcyA9IF9zbGljZWRUb0FycmF5KHRoaXMuZ2V0RG9tYWluKHByb3BzKVtheGlzXSwgMiksXG4gICAgICAgIGZyb21Cb3VuZCA9IF9nZXREb21haW4kYXhpc1swXSxcbiAgICAgICAgdG9Cb3VuZCA9IF9nZXREb21haW4kYXhpc1sxXTtcblxuICAgIHZhciBwZXJjZW50ID0gdGhpcy5nZXRTY2FsZVBlcmNlbnQoZXZ0LCBwcm9wcywgYXhpcyk7XG4gICAgdmFyIHBvaW50ID0gZmFjdG9yICogZnJvbSArIHBlcmNlbnQgKiAoZmFjdG9yICogcmFuZ2UpO1xuICAgIHZhciBtaW5Eb21haW4gPSB0aGlzLmdldE1pbmltdW1Eb21haW4ocG9pbnQsIHByb3BzLCBheGlzKTtcblxuICAgIHZhciBfZ2V0U2NhbGVkRG9tYWluID0gdGhpcy5nZXRTY2FsZWREb21haW4oY3VycmVudERvbWFpbiwgZmFjdG9yLCBwZXJjZW50KSxcbiAgICAgICAgX2dldFNjYWxlZERvbWFpbjIgPSBfc2xpY2VkVG9BcnJheShfZ2V0U2NhbGVkRG9tYWluLCAyKSxcbiAgICAgICAgbmV3TWluID0gX2dldFNjYWxlZERvbWFpbjJbMF0sXG4gICAgICAgIG5ld01heCA9IF9nZXRTY2FsZWREb21haW4yWzFdO1xuXG4gICAgdmFyIG5ld0RvbWFpbiA9IFtuZXdNaW4gPiBmcm9tQm91bmQgJiYgbmV3TWluIDwgdG9Cb3VuZCA/IG5ld01pbiA6IGZyb21Cb3VuZCwgbmV3TWF4IDwgdG9Cb3VuZCAmJiBuZXdNYXggPiBmcm9tQm91bmQgPyBuZXdNYXggOiB0b0JvdW5kXTtcbiAgICB2YXIgZG9tYWluID0gTWF0aC5hYnMobWluRG9tYWluWzFdIC0gbWluRG9tYWluWzBdKSA+IE1hdGguYWJzKG5ld0RvbWFpblsxXSAtIG5ld0RvbWFpblswXSkgPyBtaW5Eb21haW4gOiBuZXdEb21haW47XG4gICAgcmV0dXJuIENvbGxlY3Rpb24uY29udGFpbnNEYXRlcyhbZnJvbUJvdW5kLCB0b0JvdW5kXSkgPyBbbmV3IERhdGUoZG9tYWluWzBdKSwgbmV3IERhdGUoZG9tYWluWzFdKV0gOiBkb21haW47XG4gIH0sXG4gIGdldFNjYWxlZERvbWFpbjogZnVuY3Rpb24gKGN1cnJlbnREb21haW4sIGZhY3RvciwgcGVyY2VudCkge1xuICAgIHZhciBfY3VycmVudERvbWFpbjIgPSBfc2xpY2VkVG9BcnJheShjdXJyZW50RG9tYWluLCAyKSxcbiAgICAgICAgZnJvbSA9IF9jdXJyZW50RG9tYWluMlswXSxcbiAgICAgICAgdG8gPSBfY3VycmVudERvbWFpbjJbMV07XG5cbiAgICB2YXIgcmFuZ2UgPSBNYXRoLmFicyh0byAtIGZyb20pO1xuICAgIHZhciBkaWZmID0gcmFuZ2UgLSByYW5nZSAqIGZhY3RvcjtcbiAgICB2YXIgbmV3TWluID0gK2Zyb20gKyBkaWZmICogcGVyY2VudDtcbiAgICB2YXIgbmV3TWF4ID0gK3RvIC0gZGlmZiAqICgxIC0gcGVyY2VudCk7XG4gICAgcmV0dXJuIFtNYXRoLm1pbihuZXdNaW4sIG5ld01heCksIE1hdGgubWF4KG5ld01pbiwgbmV3TWF4KV07XG4gIH0sXG4gIGdldE1pbmltdW1Eb21haW46IGZ1bmN0aW9uIChwb2ludCwgcHJvcHMsIGF4aXMpIHtcbiAgICB2YXIgbWluaW11bVpvb20gPSBwcm9wcy5taW5pbXVtWm9vbTtcbiAgICB2YXIgb3JpZ2luYWxEb21haW4gPSB0aGlzLmdldERvbWFpbihwcm9wcylbYXhpc107XG5cbiAgICB2YXIgX29yaWdpbmFsRG9tYWluID0gX3NsaWNlZFRvQXJyYXkob3JpZ2luYWxEb21haW4sIDIpLFxuICAgICAgICBmcm9tID0gX29yaWdpbmFsRG9tYWluWzBdLFxuICAgICAgICB0byA9IF9vcmlnaW5hbERvbWFpblsxXTtcblxuICAgIHZhciBkZWZhdWx0TWluID0gTWF0aC5hYnMoZnJvbSAtIHRvKSAvIDEwMDA7XG4gICAgdmFyIGV4dGVudCA9IG1pbmltdW1ab29tID8gbWluaW11bVpvb21bYXhpc10gfHwgZGVmYXVsdE1pbiA6IGRlZmF1bHRNaW47XG4gICAgdmFyIG1pbkV4dGVudCA9IHBvaW50IC0gZXh0ZW50IC8gMjtcbiAgICB2YXIgbWF4RXh0ZW50ID0gcG9pbnQgKyBleHRlbnQgLyAyO1xuICAgIHJldHVybiBbbWluRXh0ZW50ID4gZnJvbSAmJiBtaW5FeHRlbnQgPCB0byA/IG1pbkV4dGVudCA6IGZyb20sIG1heEV4dGVudCA8IHRvICYmIG1heEV4dGVudCA+IGZyb20gPyBtYXhFeHRlbnQgOiArZnJvbSArIGV4dGVudCAvIDJdO1xuICB9LFxuICB6b29tbWluZ091dDogZnVuY3Rpb24gKGV2dCkge1xuICAgIHJldHVybiBldnQuZGVsdGFZID4gMDtcbiAgfSxcbiAgZ2V0U2NhbGVGYWN0b3I6IGZ1bmN0aW9uIChldnQpIHtcbiAgICB2YXIgc2lnbiA9IHRoaXMuem9vbW1pbmdPdXQoZXZ0KSA/IDEgOiAtMTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcblxuICAgIHZhciBkZWx0YSA9IE1hdGgubWluKE1hdGguYWJzKGV2dC5kZWx0YVkgLyAzMDApLCAwLjUpOyAvLyBUT0RPOiBDaGVjayBzY2FsZSBmYWN0b3JcblxuICAgIHJldHVybiBNYXRoLmFicygxICsgc2lnbiAqIGRlbHRhKTtcbiAgfSxcbiAgZ2V0U2NhbGVQZXJjZW50OiBmdW5jdGlvbiAoZXZ0LCBwcm9wcywgYXhpcykge1xuICAgIHZhciBvcmlnaW5hbERvbWFpbiA9IHRoaXMuZ2V0RG9tYWluKHByb3BzKTtcblxuICAgIHZhciBfb3JpZ2luYWxEb21haW4kYXhpcyA9IF9zbGljZWRUb0FycmF5KG9yaWdpbmFsRG9tYWluW2F4aXNdLCAyKSxcbiAgICAgICAgZnJvbSA9IF9vcmlnaW5hbERvbWFpbiRheGlzWzBdLFxuICAgICAgICB0byA9IF9vcmlnaW5hbERvbWFpbiRheGlzWzFdO1xuXG4gICAgdmFyIHBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbihldnQsIHByb3BzLCBvcmlnaW5hbERvbWFpbik7XG4gICAgcmV0dXJuIChwb3NpdGlvbltheGlzXSAtIGZyb20pIC8gTWF0aC5hYnModG8gLSBmcm9tKTtcbiAgfSxcbiAgZ2V0UG9zaXRpb246IGZ1bmN0aW9uIChldnQsIHByb3BzLCBvcmlnaW5hbERvbWFpbikge1xuICAgIHZhciBfU2VsZWN0aW9uJGdldFNWR0V2ZW4gPSBTZWxlY3Rpb24uZ2V0U1ZHRXZlbnRDb29yZGluYXRlcyhldnQpLFxuICAgICAgICB4ID0gX1NlbGVjdGlvbiRnZXRTVkdFdmVuLngsXG4gICAgICAgIHkgPSBfU2VsZWN0aW9uJGdldFNWR0V2ZW4ueTtcblxuICAgIHZhciBvcmlnaW5hbFNjYWxlID0ge1xuICAgICAgeDogcHJvcHMuc2NhbGUueC5kb21haW4ob3JpZ2luYWxEb21haW4ueCksXG4gICAgICB5OiBwcm9wcy5zY2FsZS55LmRvbWFpbihvcmlnaW5hbERvbWFpbi55KVxuICAgIH07XG4gICAgcmV0dXJuIFNlbGVjdGlvbi5nZXREYXRhQ29vcmRpbmF0ZXMocHJvcHMsIG9yaWdpbmFsU2NhbGUsIHgsIHkpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIG5ldyBkb21haW4gdHJhbnNsYXRlZCBieSB0aGUgZGVsdGEgYW5kIGNvbnN0cmFpbmVkIGJ5IHRoZSBvcmlnaW5hbCBkb21haW4uXG4gICAqIEBwYXJhbSAge1tOdW1iZXIsIE51bWJlcl19IGN1cnJlbnREb21haW4gIFRoZSBkb21haW4gdG8gYmUgdHJhbnNsYXRlZC5cbiAgICogQHBhcmFtICB7W051bWJlciwgTnVtYmVyXX0gb3JpZ2luYWxEb21haW4gVGhlIG9yaWdpbmFsIGRvbWFpbiBmb3IgdGhlIGRhdGEgc2V0LlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9ICAgICAgICAgICBkZWx0YSAgICAgICAgICBUaGUgZGVsdGEgdG8gdHJhbnNsYXRlIGJ5XG4gICAqIEByZXR1cm4ge1tOdW1iZXIsIE51bWJlcl19ICAgICAgICAgICAgICAgIFRoZSB0cmFuc2xhdGVkIGRvbWFpblxuICAgKi9cbiAgcGFuOiBmdW5jdGlvbiAoY3VycmVudERvbWFpbiwgb3JpZ2luYWxEb21haW4sIGRlbHRhKSB7XG4gICAgdmFyIF9jdXJyZW50RG9tYWluJG1hcCA9IGN1cnJlbnREb21haW4ubWFwKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiArdmFsO1xuICAgIH0pLFxuICAgICAgICBfY3VycmVudERvbWFpbiRtYXAyID0gX3NsaWNlZFRvQXJyYXkoX2N1cnJlbnREb21haW4kbWFwLCAyKSxcbiAgICAgICAgZnJvbUN1cnJlbnQgPSBfY3VycmVudERvbWFpbiRtYXAyWzBdLFxuICAgICAgICB0b0N1cnJlbnQgPSBfY3VycmVudERvbWFpbiRtYXAyWzFdO1xuXG4gICAgdmFyIF9vcmlnaW5hbERvbWFpbiRtYXAgPSBvcmlnaW5hbERvbWFpbi5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcmV0dXJuICt2YWw7XG4gICAgfSksXG4gICAgICAgIF9vcmlnaW5hbERvbWFpbiRtYXAyID0gX3NsaWNlZFRvQXJyYXkoX29yaWdpbmFsRG9tYWluJG1hcCwgMiksXG4gICAgICAgIGZyb21PcmlnaW5hbCA9IF9vcmlnaW5hbERvbWFpbiRtYXAyWzBdLFxuICAgICAgICB0b09yaWdpbmFsID0gX29yaWdpbmFsRG9tYWluJG1hcDJbMV07XG5cbiAgICB2YXIgbG93ZXJCb3VuZCA9IGZyb21DdXJyZW50ICsgZGVsdGE7XG4gICAgdmFyIHVwcGVyQm91bmQgPSB0b0N1cnJlbnQgKyBkZWx0YTtcbiAgICB2YXIgbmV3RG9tYWluO1xuXG4gICAgaWYgKGxvd2VyQm91bmQgPiBmcm9tT3JpZ2luYWwgJiYgdXBwZXJCb3VuZCA8IHRvT3JpZ2luYWwpIHtcbiAgICAgIG5ld0RvbWFpbiA9IFtsb3dlckJvdW5kLCB1cHBlckJvdW5kXTtcbiAgICB9IGVsc2UgaWYgKGxvd2VyQm91bmQgPCBmcm9tT3JpZ2luYWwpIHtcbiAgICAgIC8vIENsYW1wIHRvIGxvd2VyIGxpbWl0XG4gICAgICB2YXIgZHggPSB0b0N1cnJlbnQgLSBmcm9tQ3VycmVudDtcbiAgICAgIG5ld0RvbWFpbiA9IFtmcm9tT3JpZ2luYWwsIGZyb21PcmlnaW5hbCArIGR4XTtcbiAgICB9IGVsc2UgaWYgKHVwcGVyQm91bmQgPiB0b09yaWdpbmFsKSB7XG4gICAgICAvLyBDbGFtcCB0byB1cHBlciBsaW1pdFxuICAgICAgdmFyIF9keCA9IHRvQ3VycmVudCAtIGZyb21DdXJyZW50O1xuXG4gICAgICBuZXdEb21haW4gPSBbdG9PcmlnaW5hbCAtIF9keCwgdG9PcmlnaW5hbF07XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0RvbWFpbiA9IGN1cnJlbnREb21haW47XG4gICAgfVxuXG4gICAgcmV0dXJuIENvbGxlY3Rpb24uY29udGFpbnNEYXRlcyhjdXJyZW50RG9tYWluKSB8fCBDb2xsZWN0aW9uLmNvbnRhaW5zRGF0ZXMob3JpZ2luYWxEb21haW4pID8gbmV3RG9tYWluLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsKTtcbiAgICB9KSA6IG5ld0RvbWFpbjtcbiAgfSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcbiAgZ2V0RG9tYWluU2NhbGU6IGZ1bmN0aW9uIChkb21haW4sIHNjYWxlLCBheGlzLCBob3Jpem9udGFsKSB7XG4gICAgdmFyIGF4aXNEb21haW4gPSBBcnJheS5pc0FycmF5KGRvbWFpbikgPyBkb21haW4gOiBkb21haW5bYXhpc107XG5cbiAgICB2YXIgX2F4aXNEb21haW4gPSBfc2xpY2VkVG9BcnJheShheGlzRG9tYWluLCAyKSxcbiAgICAgICAgZnJvbSA9IF9heGlzRG9tYWluWzBdLFxuICAgICAgICB0byA9IF9heGlzRG9tYWluWzFdO1xuXG4gICAgdmFyIG90aGVyQXhpcyA9IGF4aXMgPT09IFwieFwiID8gXCJ5XCIgOiBcInhcIjtcbiAgICB2YXIgcmFuZ2UgPSBob3Jpem9udGFsID8gc2NhbGVbb3RoZXJBeGlzXS5yYW5nZSgpIDogc2NhbGVbYXhpc10ucmFuZ2UoKTtcbiAgICB2YXIgcGxvdHRhYmxlV2lkdGggPSBNYXRoLmFicyhyYW5nZVswXSAtIHJhbmdlWzFdKTtcbiAgICByZXR1cm4gcGxvdHRhYmxlV2lkdGggLyAodG8gLSBmcm9tKTtcbiAgfSxcbiAgaGFuZGxlQW5pbWF0aW9uOiBmdW5jdGlvbiAoY3R4KSB7XG4gICAgdmFyIGFuaW1hdGlvblRpbWVyID0gY3R4LmNvbnRleHQuYW5pbWF0aW9uVGltZXI7XG4gICAgdmFyIHRyYW5zaXRpb25UaW1lciA9IGN0eC5jb250ZXh0LnRyYW5zaXRpb25UaW1lcjtcbiAgICB0cmFuc2l0aW9uVGltZXIuYnlwYXNzQW5pbWF0aW9uKCk7XG4gICAgYW5pbWF0aW9uVGltZXIuYnlwYXNzQW5pbWF0aW9uKCk7XG5cbiAgICB2YXIgcmVzdW1lQW5pbWF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgYW5pbWF0aW9uVGltZXIucmVzdW1lQW5pbWF0aW9uKCk7XG4gICAgICB0cmFuc2l0aW9uVGltZXIucmVzdW1lQW5pbWF0aW9uKCk7XG4gICAgfTsgLy8gZGVsYXkgdGhlIGNhbGxiYWNrIHRoYXQgcmVzdW1lcyBhbmltYXRpb24gYnkgfjEgZnJhbWUgc28gdGhhdCBhbmltYXRpb24gZG9lcyBub3QgaW50ZXJmZXJlIHdpdGggd2hlZWwgZXZlbnRzXG5cblxuICAgIHJldHVybiBfZGVsYXkocmVzdW1lQW5pbWF0aW9uLCAxNik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICB9LFxuICBnZXRMYXN0RG9tYWluOiBmdW5jdGlvbiAodGFyZ2V0UHJvcHMsIG9yaWdpbmFsRG9tYWluKSB7XG4gICAgdmFyIHpvb21Eb21haW4gPSB0YXJnZXRQcm9wcy56b29tRG9tYWluLFxuICAgICAgICBjYWNoZWRab29tRG9tYWluID0gdGFyZ2V0UHJvcHMuY2FjaGVkWm9vbURvbWFpbixcbiAgICAgICAgY3VycmVudERvbWFpbiA9IHRhcmdldFByb3BzLmN1cnJlbnREb21haW4sXG4gICAgICAgIGRvbWFpbiA9IHRhcmdldFByb3BzLmRvbWFpbjtcblxuICAgIGlmICh6b29tRG9tYWluICYmICF0aGlzLmNoZWNrRG9tYWluRXF1YWxpdHkoem9vbURvbWFpbiwgY2FjaGVkWm9vbURvbWFpbikpIHtcbiAgICAgIHJldHVybiBfZGVmYXVsdHMoe30sIHpvb21Eb21haW4sIGRvbWFpbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9kZWZhdWx0cyh7fSwgY3VycmVudERvbWFpbiB8fCB6b29tRG9tYWluIHx8IG9yaWdpbmFsRG9tYWluLCBkb21haW4pO1xuICB9LFxuICBnZXREb21haW46IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHZhciBvcmlnaW5hbERvbWFpbiA9IHByb3BzLm9yaWdpbmFsRG9tYWluLFxuICAgICAgICBkb21haW4gPSBwcm9wcy5kb21haW4sXG4gICAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHpvb21EaW1lbnNpb24gPSBwcm9wcy56b29tRGltZW5zaW9uO1xuICAgIHZhciBjaGlsZENvbXBvbmVudHMgPSBDaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKTtcbiAgICB2YXIgY2hpbGRyZW5Eb21haW4gPSB7fTtcblxuICAgIGlmIChjaGlsZENvbXBvbmVudHMubGVuZ3RoKSB7XG4gICAgICBjaGlsZHJlbkRvbWFpbiA9IHpvb21EaW1lbnNpb24gPyBfZGVmaW5lUHJvcGVydHkoe30sIHpvb21EaW1lbnNpb24sIFdyYXBwZXIuZ2V0RG9tYWluRnJvbUNoaWxkcmVuKHByb3BzLCB6b29tRGltZW5zaW9uLCBjaGlsZENvbXBvbmVudHMpKSA6IHtcbiAgICAgICAgeDogV3JhcHBlci5nZXREb21haW5Gcm9tQ2hpbGRyZW4ocHJvcHMsIFwieFwiLCBjaGlsZENvbXBvbmVudHMpLFxuICAgICAgICB5OiBXcmFwcGVyLmdldERvbWFpbkZyb21DaGlsZHJlbihwcm9wcywgXCJ5XCIsIGNoaWxkQ29tcG9uZW50cylcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIF9kZWZhdWx0cyh7fSwgY2hpbGRyZW5Eb21haW4sIG9yaWdpbmFsRG9tYWluLCBkb21haW4pO1xuICB9LFxuICBvbk1vdXNlRG93bjogZnVuY3Rpb24gKGV2dCwgdGFyZ2V0UHJvcHMpIHtcbiAgICBldnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICghdGFyZ2V0UHJvcHMuYWxsb3dQYW4pIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdmFyIHBhcmVudFNWRyA9IHRhcmdldFByb3BzLnBhcmVudFNWRyB8fCBTZWxlY3Rpb24uZ2V0UGFyZW50U1ZHKGV2dCk7XG5cbiAgICB2YXIgX1NlbGVjdGlvbiRnZXRTVkdFdmVuMiA9IFNlbGVjdGlvbi5nZXRTVkdFdmVudENvb3JkaW5hdGVzKGV2dCwgcGFyZW50U1ZHKSxcbiAgICAgICAgeCA9IF9TZWxlY3Rpb24kZ2V0U1ZHRXZlbjIueCxcbiAgICAgICAgeSA9IF9TZWxlY3Rpb24kZ2V0U1ZHRXZlbjIueTtcblxuICAgIHJldHVybiBbe1xuICAgICAgdGFyZ2V0OiBcInBhcmVudFwiLFxuICAgICAgbXV0YXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydFg6IHgsXG4gICAgICAgICAgc3RhcnRZOiB5LFxuICAgICAgICAgIHBhbm5pbmc6IHRydWUsXG4gICAgICAgICAgcGFyZW50U1ZHOiBwYXJlbnRTVkcsXG4gICAgICAgICAgcGFyZW50Q29udHJvbGxlZFByb3BzOiBbXCJkb21haW5cIl1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XTtcbiAgfSxcbiAgb25Nb3VzZVVwOiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcykge1xuICAgIGlmICghdGFyZ2V0UHJvcHMuYWxsb3dQYW4pIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIFt7XG4gICAgICB0YXJnZXQ6IFwicGFyZW50XCIsXG4gICAgICBtdXRhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBhbm5pbmc6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfV07XG4gIH0sXG4gIG9uTW91c2VMZWF2ZTogZnVuY3Rpb24gKGV2dCwgdGFyZ2V0UHJvcHMpIHtcbiAgICBpZiAoIXRhcmdldFByb3BzLmFsbG93UGFuKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBbe1xuICAgICAgdGFyZ2V0OiBcInBhcmVudFwiLFxuICAgICAgbXV0YXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwYW5uaW5nOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1dO1xuICB9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtcywgbWF4LXN0YXRlbWVudHNcbiAgb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzLCBldmVudEtleSwgY3R4KSB7XG4gICAgaWYgKHRhcmdldFByb3BzLnBhbm5pbmcgJiYgdGFyZ2V0UHJvcHMuYWxsb3dQYW4pIHtcbiAgICAgIHZhciBzY2FsZSA9IHRhcmdldFByb3BzLnNjYWxlLFxuICAgICAgICAgIHN0YXJ0WCA9IHRhcmdldFByb3BzLnN0YXJ0WCxcbiAgICAgICAgICBzdGFydFkgPSB0YXJnZXRQcm9wcy5zdGFydFksXG4gICAgICAgICAgb25ab29tRG9tYWluQ2hhbmdlID0gdGFyZ2V0UHJvcHMub25ab29tRG9tYWluQ2hhbmdlLFxuICAgICAgICAgIHpvb21Eb21haW4gPSB0YXJnZXRQcm9wcy56b29tRG9tYWluLFxuICAgICAgICAgIHpvb21EaW1lbnNpb24gPSB0YXJnZXRQcm9wcy56b29tRGltZW5zaW9uLFxuICAgICAgICAgIGhvcml6b250YWwgPSB0YXJnZXRQcm9wcy5ob3Jpem9udGFsO1xuICAgICAgdmFyIHBhcmVudFNWRyA9IHRhcmdldFByb3BzLnBhcmVudFNWRyB8fCBTZWxlY3Rpb24uZ2V0UGFyZW50U1ZHKGV2dCk7XG5cbiAgICAgIHZhciBfU2VsZWN0aW9uJGdldFNWR0V2ZW4zID0gU2VsZWN0aW9uLmdldFNWR0V2ZW50Q29vcmRpbmF0ZXMoZXZ0LCBwYXJlbnRTVkcpLFxuICAgICAgICAgIHggPSBfU2VsZWN0aW9uJGdldFNWR0V2ZW4zLngsXG4gICAgICAgICAgeSA9IF9TZWxlY3Rpb24kZ2V0U1ZHRXZlbjMueTtcblxuICAgICAgdmFyIG9yaWdpbmFsRG9tYWluID0gdGhpcy5nZXREb21haW4odGFyZ2V0UHJvcHMpO1xuICAgICAgdmFyIGxhc3REb21haW4gPSB0aGlzLmdldExhc3REb21haW4odGFyZ2V0UHJvcHMsIG9yaWdpbmFsRG9tYWluKTtcbiAgICAgIHZhciBkZWx0YVggPSBob3Jpem9udGFsID8geSAtIHN0YXJ0WSA6IHN0YXJ0WCAtIHg7XG4gICAgICB2YXIgZGVsdGFZID0gaG9yaXpvbnRhbCA/IHN0YXJ0WCAtIHggOiB5IC0gc3RhcnRZO1xuICAgICAgdmFyIGR4ID0gZGVsdGFYIC8gdGhpcy5nZXREb21haW5TY2FsZShsYXN0RG9tYWluLCBzY2FsZSwgXCJ4XCIsIGhvcml6b250YWwpO1xuICAgICAgdmFyIGR5ID0gZGVsdGFZIC8gdGhpcy5nZXREb21haW5TY2FsZShsYXN0RG9tYWluLCBzY2FsZSwgXCJ5XCIsIGhvcml6b250YWwpO1xuICAgICAgdmFyIGN1cnJlbnREb21haW4gPSB7XG4gICAgICAgIHg6IHpvb21EaW1lbnNpb24gPT09IFwieVwiID8gb3JpZ2luYWxEb21haW4ueCA6IHRoaXMucGFuKGxhc3REb21haW4ueCwgb3JpZ2luYWxEb21haW4ueCwgZHgpLFxuICAgICAgICB5OiB6b29tRGltZW5zaW9uID09PSBcInhcIiA/IG9yaWdpbmFsRG9tYWluLnkgOiB0aGlzLnBhbihsYXN0RG9tYWluLnksIG9yaWdpbmFsRG9tYWluLnksIGR5KVxuICAgICAgfTtcbiAgICAgIHZhciByZXN1bWVBbmltYXRpb24gPSB0aGlzLmhhbmRsZUFuaW1hdGlvbihjdHgpO1xuICAgICAgdmFyIHpvb21BY3RpdmUgPSAhdGhpcy5jaGVja0RvbWFpbkVxdWFsaXR5KG9yaWdpbmFsRG9tYWluLCBsYXN0RG9tYWluKTtcbiAgICAgIHZhciBtdXRhdGVkUHJvcHMgPSB7XG4gICAgICAgIHBhcmVudENvbnRyb2xsZWRQcm9wczogW1wiZG9tYWluXCJdLFxuICAgICAgICBzdGFydFg6IHgsXG4gICAgICAgIHN0YXJ0WTogeSxcbiAgICAgICAgcGFyZW50U1ZHOiBwYXJlbnRTVkcsXG4gICAgICAgIGN1cnJlbnREb21haW46IGN1cnJlbnREb21haW4sXG4gICAgICAgIG9yaWdpbmFsRG9tYWluOiBvcmlnaW5hbERvbWFpbixcbiAgICAgICAgY2FjaGVkWm9vbURvbWFpbjogem9vbURvbWFpbixcbiAgICAgICAgem9vbUFjdGl2ZTogem9vbUFjdGl2ZVxuICAgICAgfTtcblxuICAgICAgaWYgKF9pc0Z1bmN0aW9uKG9uWm9vbURvbWFpbkNoYW5nZSkpIHtcbiAgICAgICAgb25ab29tRG9tYWluQ2hhbmdlKGN1cnJlbnREb21haW4sIF9kZWZhdWx0cyh7fSwgbXV0YXRlZFByb3BzLCB0YXJnZXRQcm9wcykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgdGFyZ2V0OiBcInBhcmVudFwiLFxuICAgICAgICBjYWxsYmFjazogcmVzdW1lQW5pbWF0aW9uLFxuICAgICAgICBtdXRhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBtdXRhdGVkUHJvcHM7XG4gICAgICAgIH1cbiAgICAgIH1dO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG4gIG9uV2hlZWw6IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzLCBldmVudEtleSwgY3R4KSB7XG4gICAgaWYgKCF0YXJnZXRQcm9wcy5hbGxvd1pvb20pIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdmFyIG9uWm9vbURvbWFpbkNoYW5nZSA9IHRhcmdldFByb3BzLm9uWm9vbURvbWFpbkNoYW5nZSxcbiAgICAgICAgem9vbURpbWVuc2lvbiA9IHRhcmdldFByb3BzLnpvb21EaW1lbnNpb24sXG4gICAgICAgIHpvb21Eb21haW4gPSB0YXJnZXRQcm9wcy56b29tRG9tYWluO1xuICAgIHZhciBvcmlnaW5hbERvbWFpbiA9IHRoaXMuZ2V0RG9tYWluKHRhcmdldFByb3BzKTtcbiAgICB2YXIgbGFzdERvbWFpbiA9IHRoaXMuZ2V0TGFzdERvbWFpbih0YXJnZXRQcm9wcywgb3JpZ2luYWxEb21haW4pO1xuICAgIHZhciB4ID0gbGFzdERvbWFpbi54LFxuICAgICAgICB5ID0gbGFzdERvbWFpbi55O1xuICAgIHZhciBjdXJyZW50RG9tYWluID0ge1xuICAgICAgeDogem9vbURpbWVuc2lvbiA9PT0gXCJ5XCIgPyBsYXN0RG9tYWluLnggOiB0aGlzLnNjYWxlKHgsIGV2dCwgdGFyZ2V0UHJvcHMsIFwieFwiKSxcbiAgICAgIHk6IHpvb21EaW1lbnNpb24gPT09IFwieFwiID8gbGFzdERvbWFpbi55IDogdGhpcy5zY2FsZSh5LCBldnQsIHRhcmdldFByb3BzLCBcInlcIilcbiAgICB9O1xuICAgIHZhciByZXN1bWVBbmltYXRpb24gPSB0aGlzLmhhbmRsZUFuaW1hdGlvbihjdHgpO1xuICAgIHZhciB6b29tQWN0aXZlID0gIXRoaXMuem9vbW1pbmdPdXQoZXZ0KSB8fCAvLyBpZiB6b29tbWluZyBpbiBvclxuICAgIC8vICAgaWYgem9vbUFjdGl2ZSBpcyBhbHJlYWR5IHNldCBBTkQgdXNlciBoYXNuJ3Qgem9vbW1lZCBvdXQgYWxsIHRoZSB3YXlcbiAgICB0YXJnZXRQcm9wcy56b29tQWN0aXZlICYmICF0aGlzLmNoZWNrRG9tYWluRXF1YWxpdHkob3JpZ2luYWxEb21haW4sIGxhc3REb21haW4pO1xuICAgIHZhciBtdXRhdGVkUHJvcHMgPSB7XG4gICAgICBjdXJyZW50RG9tYWluOiBjdXJyZW50RG9tYWluLFxuICAgICAgb3JpZ2luYWxEb21haW46IG9yaWdpbmFsRG9tYWluLFxuICAgICAgY2FjaGVkWm9vbURvbWFpbjogem9vbURvbWFpbixcbiAgICAgIHBhcmVudENvbnRyb2xsZWRQcm9wczogW1wiZG9tYWluXCJdLFxuICAgICAgcGFubmluZzogZmFsc2UsXG4gICAgICB6b29tQWN0aXZlOiB6b29tQWN0aXZlXG4gICAgfTtcblxuICAgIGlmIChfaXNGdW5jdGlvbihvblpvb21Eb21haW5DaGFuZ2UpKSB7XG4gICAgICBvblpvb21Eb21haW5DaGFuZ2UoY3VycmVudERvbWFpbiwgX2RlZmF1bHRzKHt9LCBtdXRhdGVkUHJvcHMsIHRhcmdldFByb3BzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFt7XG4gICAgICB0YXJnZXQ6IFwicGFyZW50XCIsXG4gICAgICBjYWxsYmFjazogcmVzdW1lQW5pbWF0aW9uLFxuICAgICAgbXV0YXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG11dGF0ZWRQcm9wcztcbiAgICAgIH1cbiAgICB9XTtcbiAgfVxufTtcbmV4cG9ydCB7IFJhd1pvb21IZWxwZXJzIH07IC8vIGFsbG93IHZpY3RvcnktbmF0aXZlIHRvIGV4dGVuZCB0aGVzZSBoZWxwZXJzXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY2hlY2tEb21haW5FcXVhbGl0eTogUmF3Wm9vbUhlbHBlcnMuY2hlY2tEb21haW5FcXVhbGl0eS5iaW5kKFJhd1pvb21IZWxwZXJzKSxcbiAgb25Nb3VzZURvd246IFJhd1pvb21IZWxwZXJzLm9uTW91c2VEb3duLmJpbmQoUmF3Wm9vbUhlbHBlcnMpLFxuICBvbk1vdXNlVXA6IFJhd1pvb21IZWxwZXJzLm9uTW91c2VVcC5iaW5kKFJhd1pvb21IZWxwZXJzKSxcbiAgb25Nb3VzZUxlYXZlOiBSYXdab29tSGVscGVycy5vbk1vdXNlTGVhdmUuYmluZChSYXdab29tSGVscGVycyksXG4gIG9uTW91c2VNb3ZlOiBfdGhyb3R0bGUoUmF3Wm9vbUhlbHBlcnMub25Nb3VzZU1vdmUuYmluZChSYXdab29tSGVscGVycyksIDE2LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAge1xuICAgIGxlYWRpbmc6IHRydWUsXG4gICAgdHJhaWxpbmc6IGZhbHNlXG4gIH0pLFxuICBvbldoZWVsOiBfdGhyb3R0bGUoUmF3Wm9vbUhlbHBlcnMub25XaGVlbC5iaW5kKFJhd1pvb21IZWxwZXJzKSwgMTYsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICB7XG4gICAgbGVhZGluZzogdHJ1ZSxcbiAgICB0cmFpbGluZzogZmFsc2VcbiAgfSlcbn07IiwiaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gvaXNGdW5jdGlvblwiO1xuaW1wb3J0IF9kZWZhdWx0cyBmcm9tIFwibG9kYXNoL2RlZmF1bHRzXCI7XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgWm9vbUhlbHBlcnMgZnJvbSBcIi4vem9vbS1oZWxwZXJzXCI7XG5pbXBvcnQgeyBWaWN0b3J5Q29udGFpbmVyLCBWaWN0b3J5Q2xpcENvbnRhaW5lciwgRGF0YSwgUHJvcFR5cGVzIGFzIEN1c3RvbVByb3BUeXBlcyB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbnZhciBERUZBVUxUX0RPV05TQU1QTEUgPSAxNTA7XG5leHBvcnQgdmFyIHpvb21Db250YWluZXJNaXhpbiA9IGZ1bmN0aW9uIChiYXNlKSB7XG4gIHZhciBfY2xhc3MsIF90ZW1wO1xuXG4gIHJldHVybiBfdGVtcCA9IF9jbGFzcyA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKF9iYXNlKSB7XG4gICAgX2luaGVyaXRzKFZpY3Rvcnlab29tQ29udGFpbmVyLCBfYmFzZSk7XG5cbiAgICBmdW5jdGlvbiBWaWN0b3J5Wm9vbUNvbnRhaW5lcigpIHtcbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBWaWN0b3J5Wm9vbUNvbnRhaW5lcik7XG5cbiAgICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoVmljdG9yeVpvb21Db250YWluZXIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihWaWN0b3J5Wm9vbUNvbnRhaW5lcikpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhWaWN0b3J5Wm9vbUNvbnRhaW5lciwgW3tcbiAgICAgIGtleTogXCJjbGlwRGF0YUNvbXBvbmVudHNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbGlwRGF0YUNvbXBvbmVudHMoY2hpbGRyZW4sIHByb3BzKSB7XG4gICAgICAgIHZhciBzY2FsZSA9IHByb3BzLnNjYWxlLFxuICAgICAgICAgICAgY2xpcENvbnRhaW5lckNvbXBvbmVudCA9IHByb3BzLmNsaXBDb250YWluZXJDb21wb25lbnQsXG4gICAgICAgICAgICBwb2xhciA9IHByb3BzLnBvbGFyLFxuICAgICAgICAgICAgb3JpZ2luID0gcHJvcHMub3JpZ2luLFxuICAgICAgICAgICAgaG9yaXpvbnRhbCA9IHByb3BzLmhvcml6b250YWw7XG4gICAgICAgIHZhciByYW5nZVggPSBob3Jpem9udGFsID8gc2NhbGUueS5yYW5nZSgpIDogc2NhbGUueC5yYW5nZSgpO1xuICAgICAgICB2YXIgcmFuZ2VZID0gaG9yaXpvbnRhbCA/IHNjYWxlLngucmFuZ2UoKSA6IHNjYWxlLnkucmFuZ2UoKTtcbiAgICAgICAgdmFyIHBsb3R0YWJsZVdpZHRoID0gTWF0aC5hYnMocmFuZ2VYWzBdIC0gcmFuZ2VYWzFdKTtcbiAgICAgICAgdmFyIHBsb3R0YWJsZUhlaWdodCA9IE1hdGguYWJzKHJhbmdlWVswXSAtIHJhbmdlWVsxXSk7XG4gICAgICAgIHZhciByYWRpdXMgPSBNYXRoLm1heC5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkocmFuZ2VZKSk7XG4gICAgICAgIHZhciBncm91cENvbXBvbmVudCA9IFJlYWN0LmNsb25lRWxlbWVudChjbGlwQ29udGFpbmVyQ29tcG9uZW50LCBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICBjbGlwV2lkdGg6IHBsb3R0YWJsZVdpZHRoLFxuICAgICAgICAgIGNsaXBIZWlnaHQ6IHBsb3R0YWJsZUhlaWdodCxcbiAgICAgICAgICB0cmFuc2xhdGVYOiBNYXRoLm1pbi5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkocmFuZ2VYKSksXG4gICAgICAgICAgdHJhbnNsYXRlWTogTWF0aC5taW4uYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KHJhbmdlWSkpLFxuICAgICAgICAgIHBvbGFyOiBwb2xhcixcbiAgICAgICAgICBvcmlnaW46IHBvbGFyID8gb3JpZ2luIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHJhZGl1czogcG9sYXIgPyByYWRpdXMgOiB1bmRlZmluZWRcbiAgICAgICAgfSwgY2xpcENvbnRhaW5lckNvbXBvbmVudC5wcm9wcykpO1xuICAgICAgICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbikubWFwKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgIGlmICghRGF0YS5pc0RhdGFDb21wb25lbnQoY2hpbGQpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgICAgICAgICAgZ3JvdXBDb21wb25lbnQ6IGdyb3VwQ29tcG9uZW50XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJtb2RpZnlQb2xhckRvbWFpblwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIG1vZGlmeVBvbGFyRG9tYWluKGRvbWFpbiwgb3JpZ2luYWxEb21haW4pIHtcbiAgICAgICAgLy8gT25seSB6b29tIHRoZSByYWRpdXMgb2YgcG9sYXIgY2hhcnRzLiBab29taW5nIGFuZ2xlcyBpcyB2ZXJ5IGNvbmZ1c2luZ1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IG9yaWdpbmFsRG9tYWluLngsXG4gICAgICAgICAgeTogWzAsIGRvbWFpbi55WzFdXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJkb3duc2FtcGxlWm9vbURhdGFcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBkb3duc2FtcGxlWm9vbURhdGEocHJvcHMsIGNoaWxkLCBkb21haW4pIHtcbiAgICAgICAgdmFyIGRvd25zYW1wbGUgPSBwcm9wcy5kb3duc2FtcGxlO1xuXG4gICAgICAgIHZhciBnZXREYXRhID0gZnVuY3Rpb24gKGNoaWxkUHJvcHMpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGNoaWxkUHJvcHMuZGF0YSxcbiAgICAgICAgICAgICAgeCA9IGNoaWxkUHJvcHMueCxcbiAgICAgICAgICAgICAgeSA9IGNoaWxkUHJvcHMueTtcbiAgICAgICAgICB2YXIgZGVmYXVsdEdldERhdGEgPSBjaGlsZC50eXBlICYmIF9pc0Z1bmN0aW9uKGNoaWxkLnR5cGUuZ2V0RGF0YSkgPyBjaGlsZC50eXBlLmdldERhdGEgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH07IC8vIHNraXAgY29zdGx5IGRhdGEgZm9ybWF0dGluZyBpZiB4IGFuZCB5IGFjY2Vzc29ycyBhcmUgbm90IHByZXNlbnRcblxuICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRhdGEpICYmICF4ICYmICF5ID8gZGF0YSA6IGRlZmF1bHRHZXREYXRhKGNoaWxkUHJvcHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBkYXRhID0gZ2V0RGF0YShjaGlsZC5wcm9wcyk7IC8vIHJldHVybiB1bmRlZmluZWQgaWYgZG93bnNhbXBsZSBpcyBub3QgcnVuLCB0aGVuIGRlZmF1bHQoKSB3aWxsIHJlcGxhY2Ugd2l0aCBjaGlsZC5wcm9wcy5kYXRhXG5cbiAgICAgICAgaWYgKCFkb3duc2FtcGxlIHx8ICFkb21haW4gfHwgIWRhdGEpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1heFBvaW50cyA9IGRvd25zYW1wbGUgPT09IHRydWUgPyBERUZBVUxUX0RPV05TQU1QTEUgOiBkb3duc2FtcGxlO1xuICAgICAgICB2YXIgZGltZW5zaW9uID0gcHJvcHMuem9vbURpbWVuc2lvbiB8fCBcInhcIjsgLy8gaW1wb3J0YW50OiBhc3N1bWVzIGRhdGEgaXMgb3JkZXJlZCBieSBkaW1lbnNpb25cbiAgICAgICAgLy8gZ2V0IHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBkYXRhIHRoYXQgaXMgaW4gdGhlIGN1cnJlbnQgdmlzaWJsZSBkb21haW5cblxuICAgICAgICB2YXIgc3RhcnRJbmRleCA9IGRhdGEuZmluZEluZGV4KGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgcmV0dXJuIGRbZGltZW5zaW9uXSA+PSBkb21haW5bZGltZW5zaW9uXVswXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBlbmRJbmRleCA9IGRhdGEuZmluZEluZGV4KGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgcmV0dXJuIGRbZGltZW5zaW9uXSA+IGRvbWFpbltkaW1lbnNpb25dWzFdO1xuICAgICAgICB9KTsgLy8gcGljayBvbmUgbW9yZSBwb2ludCAoaWYgYXZhaWxhYmxlKSBhdCBlYWNoIGVuZCBzbyB0aGF0IFZpY3RvcnlMaW5lLCBWaWN0b3J5QXJlYSBjb25uZWN0XG5cbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggIT09IDApIHtcbiAgICAgICAgICBzdGFydEluZGV4IC09IDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgZW5kSW5kZXggKz0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2aXNpYmxlRGF0YSA9IGRhdGEuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICByZXR1cm4gRGF0YS5kb3duc2FtcGxlKHZpc2libGVEYXRhLCBtYXhQb2ludHMsIHN0YXJ0SW5kZXgpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJtb2RpZnlDaGlsZHJlblwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIG1vZGlmeUNoaWxkcmVuKHByb3BzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgdmFyIGNoaWxkQ29tcG9uZW50cyA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkocHJvcHMuY2hpbGRyZW4pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHNcblxuICAgICAgICByZXR1cm4gY2hpbGRDb21wb25lbnRzLm1hcChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICB2YXIgcm9sZSA9IGNoaWxkLnR5cGUgJiYgY2hpbGQudHlwZS5yb2xlO1xuICAgICAgICAgIHZhciBpc0RhdGFDb21wb25lbnQgPSBEYXRhLmlzRGF0YUNvbXBvbmVudChjaGlsZCk7XG4gICAgICAgICAgdmFyIGN1cnJlbnREb21haW4gPSBwcm9wcy5jdXJyZW50RG9tYWluLFxuICAgICAgICAgICAgICB6b29tQWN0aXZlID0gcHJvcHMuem9vbUFjdGl2ZSxcbiAgICAgICAgICAgICAgYWxsb3dab29tID0gcHJvcHMuYWxsb3dab29tO1xuXG4gICAgICAgICAgdmFyIG9yaWdpbmFsRG9tYWluID0gX2RlZmF1bHRzKHt9LCBwcm9wcy5vcmlnaW5hbERvbWFpbiwgcHJvcHMuZG9tYWluKTtcblxuICAgICAgICAgIHZhciB6b29tRG9tYWluID0gX2RlZmF1bHRzKHt9LCBwcm9wcy56b29tRG9tYWluLCBwcm9wcy5kb21haW4pO1xuXG4gICAgICAgICAgdmFyIGNhY2hlZFpvb21Eb21haW4gPSBfZGVmYXVsdHMoe30sIHByb3BzLmNhY2hlZFpvb21Eb21haW4sIHByb3BzLmRvbWFpbik7XG5cbiAgICAgICAgICB2YXIgZG9tYWluO1xuXG4gICAgICAgICAgaWYgKCFab29tSGVscGVycy5jaGVja0RvbWFpbkVxdWFsaXR5KHpvb21Eb21haW4sIGNhY2hlZFpvb21Eb21haW4pKSB7XG4gICAgICAgICAgICAvLyBpZiB6b29tRG9tYWluIGhhcyBiZWVuIGNoYW5nZWQsIHVzZSBpdFxuICAgICAgICAgICAgZG9tYWluID0gem9vbURvbWFpbjtcbiAgICAgICAgICB9IGVsc2UgaWYgKGFsbG93Wm9vbSAmJiAhem9vbUFjdGl2ZSkge1xuICAgICAgICAgICAgLy8gaWYgdXNlciBoYXMgem9vbWVkIGFsbCB0aGUgd2F5IG91dCwgdXNlIHRoZSBjaGlsZCBkb21haW5cbiAgICAgICAgICAgIGRvbWFpbiA9IGNoaWxkLnByb3BzLmRvbWFpbjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGVmYXVsdDogdXNlIGN1cnJlbnREb21haW4sIHNldCBieSB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgICAgIGRvbWFpbiA9IF9kZWZhdWx0cyh7fSwgY3VycmVudERvbWFpbiwgb3JpZ2luYWxEb21haW4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuZXdEb21haW4gPSBwcm9wcy5wb2xhciA/IF90aGlzLm1vZGlmeVBvbGFyRG9tYWluKGRvbWFpbiwgb3JpZ2luYWxEb21haW4pIDogZG9tYWluO1xuXG4gICAgICAgICAgaWYgKG5ld0RvbWFpbiAmJiBwcm9wcy56b29tRGltZW5zaW9uKSB7XG4gICAgICAgICAgICAvLyBpZiB6b29taW5nIGlzIHJlc3RyaWN0ZWQgdG8gYSBkaW1lbnNpb24sIGRvbid0IHNxdWFzaCBjaGFuZ2VzIHRvIHpvb21Eb21haW4gaW4gb3RoZXIgZGltXG4gICAgICAgICAgICBuZXdEb21haW4gPSBfb2JqZWN0U3ByZWFkKHt9LCB6b29tRG9tYWluLCBfZGVmaW5lUHJvcGVydHkoe30sIHByb3BzLnpvb21EaW1lbnNpb24sIG5ld0RvbWFpbltwcm9wcy56b29tRGltZW5zaW9uXSkpO1xuICAgICAgICAgIH0gLy8gZG9uJ3QgZG93bnNhbXBsZSBzdGFja2VkIGRhdGFcblxuXG4gICAgICAgICAgdmFyIG5ld1Byb3BzID0gaXNEYXRhQ29tcG9uZW50ICYmIHJvbGUgIT09IFwic3RhY2tcIiA/IHtcbiAgICAgICAgICAgIGRvbWFpbjogbmV3RG9tYWluLFxuICAgICAgICAgICAgZGF0YTogX3RoaXMuZG93bnNhbXBsZVpvb21EYXRhKHByb3BzLCBjaGlsZCwgbmV3RG9tYWluKVxuICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICBkb21haW46IG5ld0RvbWFpblxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChjaGlsZCwgX2RlZmF1bHRzKG5ld1Byb3BzLCBjaGlsZC5wcm9wcykpO1xuICAgICAgICB9KTtcbiAgICAgIH0gLy8gT3ZlcnJpZGVzIG1ldGhvZCBpbiBWaWN0b3J5Q29udGFpbmVyXG5cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiZ2V0Q2hpbGRyZW5cIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDaGlsZHJlbihwcm9wcykge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLm1vZGlmeUNoaWxkcmVuKHByb3BzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpcERhdGFDb21wb25lbnRzKGNoaWxkcmVuLCBwcm9wcyk7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFZpY3Rvcnlab29tQ29udGFpbmVyO1xuICB9KGJhc2UpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcImRpc3BsYXlOYW1lXCIsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogXCJWaWN0b3J5Wm9vbUNvbnRhaW5lclwiXG4gIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcInByb3BUeXBlc1wiLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IF9vYmplY3RTcHJlYWQoe30sIFZpY3RvcnlDb250YWluZXIucHJvcFR5cGVzLCB7XG4gICAgICBhbGxvd1BhbjogUHJvcFR5cGVzLmJvb2wsXG4gICAgICBhbGxvd1pvb206IFByb3BUeXBlcy5ib29sLFxuICAgICAgY2xpcENvbnRhaW5lckNvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQuaXNSZXF1aXJlZCxcbiAgICAgIGRpc2FibGU6IFByb3BUeXBlcy5ib29sLFxuICAgICAgZG93bnNhbXBsZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5udW1iZXJdKSxcbiAgICAgIG1pbmltdW1ab29tOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICB4OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgICB5OiBQcm9wVHlwZXMubnVtYmVyXG4gICAgICB9KSxcbiAgICAgIG9uWm9vbURvbWFpbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICB6b29tRGltZW5zaW9uOiBQcm9wVHlwZXMub25lT2YoW1wieFwiLCBcInlcIl0pLFxuICAgICAgem9vbURvbWFpbjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgICAgeDogQ3VzdG9tUHJvcFR5cGVzLmRvbWFpbixcbiAgICAgICAgeTogQ3VzdG9tUHJvcFR5cGVzLmRvbWFpblxuICAgICAgfSlcbiAgICB9KVxuICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzcywgXCJkZWZhdWx0UHJvcHNcIiwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiBfb2JqZWN0U3ByZWFkKHt9LCBWaWN0b3J5Q29udGFpbmVyLmRlZmF1bHRQcm9wcywge1xuICAgICAgY2xpcENvbnRhaW5lckNvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChWaWN0b3J5Q2xpcENvbnRhaW5lciwgbnVsbCksXG4gICAgICBhbGxvd1BhbjogdHJ1ZSxcbiAgICAgIGFsbG93Wm9vbTogdHJ1ZSxcbiAgICAgIHpvb21BY3RpdmU6IGZhbHNlXG4gICAgfSlcbiAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwiZGVmYXVsdEV2ZW50c1wiLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgcmV0dXJuIFt7XG4gICAgICAgIHRhcmdldDogXCJwYXJlbnRcIixcbiAgICAgICAgZXZlbnRIYW5kbGVyczogX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHMuZGlzYWJsZSA/IHt9IDogWm9vbUhlbHBlcnMub25Nb3VzZURvd24oZXZ0LCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblRvdWNoU3RhcnQ6IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHMuZGlzYWJsZSA/IHt9IDogWm9vbUhlbHBlcnMub25Nb3VzZURvd24oZXZ0LCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1vdXNlVXA6IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHMuZGlzYWJsZSA/IHt9IDogWm9vbUhlbHBlcnMub25Nb3VzZVVwKGV2dCwgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Ub3VjaEVuZDogZnVuY3Rpb24gKGV2dCwgdGFyZ2V0UHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5kaXNhYmxlID8ge30gOiBab29tSGVscGVycy5vbk1vdXNlVXAoZXZ0LCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1vdXNlTGVhdmU6IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHMuZGlzYWJsZSA/IHt9IDogWm9vbUhlbHBlcnMub25Nb3VzZUxlYXZlKGV2dCwgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Ub3VjaENhbmNlbDogZnVuY3Rpb24gKGV2dCwgdGFyZ2V0UHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5kaXNhYmxlID8ge30gOiBab29tSGVscGVycy5vbk1vdXNlTGVhdmUoZXZ0LCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuICAgICAgICAgIG9uTW91c2VNb3ZlOiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcywgZXZlbnRLZXksIGN0eCkge1xuICAgICAgICAgICAgaWYgKHByb3BzLmRpc2FibGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gWm9vbUhlbHBlcnMub25Nb3VzZU1vdmUoZXZ0LCB0YXJnZXRQcm9wcywgZXZlbnRLZXksIGN0eCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuICAgICAgICAgIG9uVG91Y2hNb3ZlOiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcywgZXZlbnRLZXksIGN0eCkge1xuICAgICAgICAgICAgaWYgKHByb3BzLmRpc2FibGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBab29tSGVscGVycy5vbk1vdXNlTW92ZShldnQsIHRhcmdldFByb3BzLCBldmVudEtleSwgY3R4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHByb3BzLmRpc2FibGUgfHwgIXByb3BzLmFsbG93Wm9vbSA/IHt9IDoge1xuICAgICAgICAgIG9uV2hlZWw6IFpvb21IZWxwZXJzLm9uV2hlZWxcbiAgICAgICAgfSlcbiAgICAgIH1dO1xuICAgIH1cbiAgfSksIF90ZW1wO1xufTtcbmV4cG9ydCBkZWZhdWx0IHpvb21Db250YWluZXJNaXhpbihWaWN0b3J5Q29udGFpbmVyKTsiLCJpbXBvcnQgX2luY2x1ZGVzIGZyb20gXCJsb2Rhc2gvaW5jbHVkZXNcIjtcbmltcG9ydCBfaXNGdW5jdGlvbiBmcm9tIFwibG9kYXNoL2lzRnVuY3Rpb25cIjtcbmltcG9ydCBfdGhyb3R0bGUgZnJvbSBcImxvZGFzaC90aHJvdHRsZVwiO1xuaW1wb3J0IF9kZWZhdWx0cyBmcm9tIFwibG9kYXNoL2RlZmF1bHRzXCI7XG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHsgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTsgfSkpOyB9IG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbmltcG9ydCB7IFNlbGVjdGlvbiwgRGF0YSwgSGVscGVycyB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTZWxlY3Rpb25IZWxwZXJzID0ge1xuICBnZXREaW1lbnNpb246IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHZhciBob3Jpem9udGFsID0gcHJvcHMuaG9yaXpvbnRhbCxcbiAgICAgICAgc2VsZWN0aW9uRGltZW5zaW9uID0gcHJvcHMuc2VsZWN0aW9uRGltZW5zaW9uO1xuXG4gICAgaWYgKCFob3Jpem9udGFsIHx8ICFzZWxlY3Rpb25EaW1lbnNpb24pIHtcbiAgICAgIHJldHVybiBzZWxlY3Rpb25EaW1lbnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdGlvbkRpbWVuc2lvbiA9PT0gXCJ4XCIgPyBcInlcIiA6IFwieFwiO1xuICB9LFxuICBnZXREYXRhc2V0czogZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgaWYgKHByb3BzLmRhdGEpIHtcbiAgICAgIHJldHVybiBbe1xuICAgICAgICBkYXRhOiBwcm9wcy5kYXRhXG4gICAgICB9XTtcbiAgICB9XG5cbiAgICB2YXIgZ2V0RGF0YSA9IGZ1bmN0aW9uIChjaGlsZFByb3BzKSB7XG4gICAgICB2YXIgZGF0YSA9IERhdGEuZ2V0RGF0YShjaGlsZFByb3BzKTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEubGVuZ3RoID4gMCA/IGRhdGEgOiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIHZhciBpdGVyYXRlZSA9IGZ1bmN0aW9uIChjaGlsZCwgY2hpbGROYW1lLCBwYXJlbnQpIHtcbiAgICAgIHZhciBibGFja2xpc3QgPSBwcm9wcy5zZWxlY3Rpb25CbGFja2xpc3QgfHwgW107XG5cbiAgICAgIGlmICghRGF0YS5pc0RhdGFDb21wb25lbnQoY2hpbGQpIHx8IF9pbmNsdWRlcyhibGFja2xpc3QsIGNoaWxkTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkLnR5cGUgJiYgX2lzRnVuY3Rpb24oY2hpbGQudHlwZS5nZXREYXRhKSkge1xuICAgICAgICBjaGlsZCA9IHBhcmVudCA/IFJlYWN0LmNsb25lRWxlbWVudChjaGlsZCwgcGFyZW50LnByb3BzKSA6IGNoaWxkO1xuICAgICAgICB2YXIgY2hpbGREYXRhID0gY2hpbGQucHJvcHMgJiYgY2hpbGQudHlwZS5nZXREYXRhKGNoaWxkLnByb3BzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkRGF0YSA/IHtcbiAgICAgICAgICBjaGlsZE5hbWU6IGNoaWxkTmFtZSxcbiAgICAgICAgICBkYXRhOiBjaGlsZERhdGFcbiAgICAgICAgfSA6IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX2NoaWxkRGF0YSA9IGdldERhdGEoY2hpbGQucHJvcHMpO1xuXG4gICAgICAgIHJldHVybiBfY2hpbGREYXRhID8ge1xuICAgICAgICAgIGNoaWxkTmFtZTogY2hpbGROYW1lLFxuICAgICAgICAgIGRhdGE6IF9jaGlsZERhdGFcbiAgICAgICAgfSA6IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBIZWxwZXJzLnJlZHVjZUNoaWxkcmVuKFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkocHJvcHMuY2hpbGRyZW4pLCBpdGVyYXRlZSwgcHJvcHMpO1xuICB9LFxuICBmaWx0ZXJEYXRhc2V0czogZnVuY3Rpb24gKHByb3BzLCBkYXRhc2V0cywgYm91bmRzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBmaWx0ZXJlZCA9IGRhdGFzZXRzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgZGF0YXNldCkge1xuICAgICAgdmFyIHNlbGVjdGVkRGF0YSA9IF90aGlzLmdldFNlbGVjdGVkRGF0YShwcm9wcywgZGF0YXNldC5kYXRhLCBib3VuZHMpO1xuXG4gICAgICBtZW1vID0gc2VsZWN0ZWREYXRhID8gbWVtby5jb25jYXQoe1xuICAgICAgICBjaGlsZE5hbWU6IGRhdGFzZXQuY2hpbGROYW1lLFxuICAgICAgICBldmVudEtleTogc2VsZWN0ZWREYXRhLmV2ZW50S2V5LFxuICAgICAgICBkYXRhOiBzZWxlY3RlZERhdGEuZGF0YVxuICAgICAgfSkgOiBtZW1vO1xuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfSwgW10pO1xuICAgIHJldHVybiBmaWx0ZXJlZC5sZW5ndGggPyBmaWx0ZXJlZCA6IG51bGw7XG4gIH0sXG4gIGdldFNlbGVjdGVkRGF0YTogZnVuY3Rpb24gKHByb3BzLCBkYXRhc2V0KSB7XG4gICAgdmFyIHgxID0gcHJvcHMueDEsXG4gICAgICAgIHkxID0gcHJvcHMueTEsXG4gICAgICAgIHgyID0gcHJvcHMueDIsXG4gICAgICAgIHkyID0gcHJvcHMueTI7XG5cbiAgICB2YXIgd2l0aGluQm91bmRzID0gZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhciBzY2FsZWRQb2ludCA9IEhlbHBlcnMuc2NhbGVQb2ludChwcm9wcywgZCk7XG4gICAgICByZXR1cm4gc2NhbGVkUG9pbnQueCA+PSBNYXRoLm1pbih4MSwgeDIpICYmIHNjYWxlZFBvaW50LnggPD0gTWF0aC5tYXgoeDEsIHgyKSAmJiBzY2FsZWRQb2ludC55ID49IE1hdGgubWluKHkxLCB5MikgJiYgc2NhbGVkUG9pbnQueSA8PSBNYXRoLm1heCh5MSwgeTIpO1xuICAgIH07XG5cbiAgICB2YXIgZXZlbnRLZXkgPSBbXTtcbiAgICB2YXIgZGF0YSA9IFtdO1xuICAgIHZhciBjb3VudCA9IDA7XG5cbiAgICBmb3IgKHZhciBpbmRleCA9IDAsIGxlbiA9IGRhdGFzZXQubGVuZ3RoOyBpbmRleCA8IGxlbjsgaW5kZXgrKykge1xuICAgICAgdmFyIGRhdHVtID0gZGF0YXNldFtpbmRleF07XG5cbiAgICAgIGlmICh3aXRoaW5Cb3VuZHMoZGF0dW0pKSB7XG4gICAgICAgIGRhdGFbY291bnRdID0gZGF0dW07XG4gICAgICAgIGV2ZW50S2V5W2NvdW50XSA9IGRhdHVtLmV2ZW50S2V5ID09PSB1bmRlZmluZWQgPyBpbmRleCA6IGRhdHVtLmV2ZW50S2V5O1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3VudCA+IDAgPyB7XG4gICAgICBldmVudEtleTogZXZlbnRLZXksXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSA6IG51bGw7XG4gIH0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5LCBtYXgtc3RhdGVtZW50c1xuICBvbk1vdXNlRG93bjogZnVuY3Rpb24gKGV2dCwgdGFyZ2V0UHJvcHMpIHtcbiAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB2YXIgYWN0aXZhdGVTZWxlY3RlZERhdGEgPSB0YXJnZXRQcm9wcy5hY3RpdmF0ZVNlbGVjdGVkRGF0YSxcbiAgICAgICAgYWxsb3dTZWxlY3Rpb24gPSB0YXJnZXRQcm9wcy5hbGxvd1NlbGVjdGlvbixcbiAgICAgICAgcG9sYXIgPSB0YXJnZXRQcm9wcy5wb2xhcixcbiAgICAgICAgc2VsZWN0ZWREYXRhID0gdGFyZ2V0UHJvcHMuc2VsZWN0ZWREYXRhO1xuXG4gICAgaWYgKCFhbGxvd1NlbGVjdGlvbikge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLmdldERpbWVuc2lvbih0YXJnZXRQcm9wcyk7XG4gICAgdmFyIHBhcmVudFNWRyA9IHRhcmdldFByb3BzLnBhcmVudFNWRyB8fCBTZWxlY3Rpb24uZ2V0UGFyZW50U1ZHKGV2dCk7XG5cbiAgICB2YXIgX1NlbGVjdGlvbiRnZXRTVkdFdmVuID0gU2VsZWN0aW9uLmdldFNWR0V2ZW50Q29vcmRpbmF0ZXMoZXZ0LCBwYXJlbnRTVkcpLFxuICAgICAgICB4ID0gX1NlbGVjdGlvbiRnZXRTVkdFdmVuLngsXG4gICAgICAgIHkgPSBfU2VsZWN0aW9uJGdldFNWR0V2ZW4ueTtcblxuICAgIHZhciB4MSA9IHBvbGFyIHx8IGRpbWVuc2lvbiAhPT0gXCJ5XCIgPyB4IDogU2VsZWN0aW9uLmdldERvbWFpbkNvb3JkaW5hdGVzKHRhcmdldFByb3BzKS54WzBdO1xuICAgIHZhciB5MSA9IHBvbGFyIHx8IGRpbWVuc2lvbiAhPT0gXCJ4XCIgPyB5IDogU2VsZWN0aW9uLmdldERvbWFpbkNvb3JkaW5hdGVzKHRhcmdldFByb3BzKS55WzBdO1xuICAgIHZhciB4MiA9IHBvbGFyIHx8IGRpbWVuc2lvbiAhPT0gXCJ5XCIgPyB4IDogU2VsZWN0aW9uLmdldERvbWFpbkNvb3JkaW5hdGVzKHRhcmdldFByb3BzKS54WzFdO1xuICAgIHZhciB5MiA9IHBvbGFyIHx8IGRpbWVuc2lvbiAhPT0gXCJ4XCIgPyB5IDogU2VsZWN0aW9uLmdldERvbWFpbkNvb3JkaW5hdGVzKHRhcmdldFByb3BzKS55WzFdO1xuICAgIHZhciBtdXRhdGVkUHJvcHMgPSB7XG4gICAgICB4MTogeDEsXG4gICAgICB5MTogeTEsXG4gICAgICBzZWxlY3Q6IHRydWUsXG4gICAgICB4MjogeDIsXG4gICAgICB5MjogeTIsXG4gICAgICBwYXJlbnRTVkc6IHBhcmVudFNWR1xuICAgIH07XG5cbiAgICBpZiAoc2VsZWN0ZWREYXRhICYmIF9pc0Z1bmN0aW9uKHRhcmdldFByb3BzLm9uU2VsZWN0aW9uQ2xlYXJlZCkpIHtcbiAgICAgIHRhcmdldFByb3BzLm9uU2VsZWN0aW9uQ2xlYXJlZChfZGVmYXVsdHMoe30sIG11dGF0ZWRQcm9wcywgdGFyZ2V0UHJvcHMpKTtcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50TXV0YXRpb24gPSBbe1xuICAgICAgdGFyZ2V0OiBcInBhcmVudFwiLFxuICAgICAgbXV0YXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG11dGF0ZWRQcm9wcztcbiAgICAgIH1cbiAgICB9XTtcbiAgICB2YXIgZGF0YU11dGF0aW9uID0gc2VsZWN0ZWREYXRhICYmIGFjdGl2YXRlU2VsZWN0ZWREYXRhID8gc2VsZWN0ZWREYXRhLm1hcChmdW5jdGlvbiAoZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hpbGROYW1lOiBkLmNoaWxkTmFtZSxcbiAgICAgICAgZXZlbnRLZXk6IGQuZXZlbnRLZXksXG4gICAgICAgIHRhcmdldDogXCJkYXRhXCIsXG4gICAgICAgIG11dGF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSkgOiBbXTtcbiAgICByZXR1cm4gcGFyZW50TXV0YXRpb24uY29uY2F0LmFwcGx5KHBhcmVudE11dGF0aW9uLCBfdG9Db25zdW1hYmxlQXJyYXkoZGF0YU11dGF0aW9uKSk7XG4gIH0sXG4gIG9uTW91c2VNb3ZlOiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcykge1xuICAgIHZhciBhbGxvd1NlbGVjdGlvbiA9IHRhcmdldFByb3BzLmFsbG93U2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3QgPSB0YXJnZXRQcm9wcy5zZWxlY3QsXG4gICAgICAgIHBvbGFyID0gdGFyZ2V0UHJvcHMucG9sYXI7XG4gICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuZ2V0RGltZW5zaW9uKHRhcmdldFByb3BzKTtcblxuICAgIGlmICghYWxsb3dTZWxlY3Rpb24gfHwgIXNlbGVjdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwYXJlbnRTVkcgPSB0YXJnZXRQcm9wcy5wYXJlbnRTVkcgfHwgU2VsZWN0aW9uLmdldFBhcmVudFNWRyhldnQpO1xuXG4gICAgICB2YXIgX1NlbGVjdGlvbiRnZXRTVkdFdmVuMiA9IFNlbGVjdGlvbi5nZXRTVkdFdmVudENvb3JkaW5hdGVzKGV2dCwgcGFyZW50U1ZHKSxcbiAgICAgICAgICB4ID0gX1NlbGVjdGlvbiRnZXRTVkdFdmVuMi54LFxuICAgICAgICAgIHkgPSBfU2VsZWN0aW9uJGdldFNWR0V2ZW4yLnk7XG5cbiAgICAgIHZhciB4MiA9IHBvbGFyIHx8IGRpbWVuc2lvbiAhPT0gXCJ5XCIgPyB4IDogU2VsZWN0aW9uLmdldERvbWFpbkNvb3JkaW5hdGVzKHRhcmdldFByb3BzKS54WzFdO1xuICAgICAgdmFyIHkyID0gcG9sYXIgfHwgZGltZW5zaW9uICE9PSBcInhcIiA/IHkgOiBTZWxlY3Rpb24uZ2V0RG9tYWluQ29vcmRpbmF0ZXModGFyZ2V0UHJvcHMpLnlbMV07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IFwicGFyZW50XCIsXG4gICAgICAgIG11dGF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHgyOiB4MixcbiAgICAgICAgICAgIHkyOiB5MixcbiAgICAgICAgICAgIHBhcmVudFNWRzogcGFyZW50U1ZHXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0sXG4gIG9uTW91c2VVcDogZnVuY3Rpb24gKGV2dCwgdGFyZ2V0UHJvcHMpIHtcbiAgICB2YXIgYWN0aXZhdGVTZWxlY3RlZERhdGEgPSB0YXJnZXRQcm9wcy5hY3RpdmF0ZVNlbGVjdGVkRGF0YSxcbiAgICAgICAgYWxsb3dTZWxlY3Rpb24gPSB0YXJnZXRQcm9wcy5hbGxvd1NlbGVjdGlvbixcbiAgICAgICAgeDIgPSB0YXJnZXRQcm9wcy54MixcbiAgICAgICAgeTIgPSB0YXJnZXRQcm9wcy55MjtcblxuICAgIGlmICghYWxsb3dTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICgheDIgfHwgIXkyKSB7XG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgdGFyZ2V0OiBcInBhcmVudFwiLFxuICAgICAgICBtdXRhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZWxlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgeDE6IG51bGwsXG4gICAgICAgICAgICB4MjogbnVsbCxcbiAgICAgICAgICAgIHkxOiBudWxsLFxuICAgICAgICAgICAgeTI6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XTtcbiAgICB9XG5cbiAgICB2YXIgZGF0YXNldHMgPSB0aGlzLmdldERhdGFzZXRzKHRhcmdldFByb3BzKTtcbiAgICB2YXIgYm91bmRzID0gU2VsZWN0aW9uLmdldEJvdW5kcyh0YXJnZXRQcm9wcyk7XG4gICAgdmFyIHNlbGVjdGVkRGF0YSA9IHRoaXMuZmlsdGVyRGF0YXNldHModGFyZ2V0UHJvcHMsIGRhdGFzZXRzLCBib3VuZHMpO1xuICAgIHZhciBtdXRhdGVkUHJvcHMgPSB7XG4gICAgICBzZWxlY3RlZERhdGE6IHNlbGVjdGVkRGF0YSxcbiAgICAgIGRhdGFzZXRzOiBkYXRhc2V0cyxcbiAgICAgIHNlbGVjdDogZmFsc2UsXG4gICAgICB4MTogbnVsbCxcbiAgICAgIHgyOiBudWxsLFxuICAgICAgeTE6IG51bGwsXG4gICAgICB5MjogbnVsbFxuICAgIH07XG4gICAgdmFyIGNhbGxiYWNrTXV0YXRpb24gPSBzZWxlY3RlZERhdGEgJiYgX2lzRnVuY3Rpb24odGFyZ2V0UHJvcHMub25TZWxlY3Rpb24pID8gdGFyZ2V0UHJvcHMub25TZWxlY3Rpb24oc2VsZWN0ZWREYXRhLCBib3VuZHMsIF9kZWZhdWx0cyh7fSwgbXV0YXRlZFByb3BzLCB0YXJnZXRQcm9wcykpIDoge307XG4gICAgdmFyIHBhcmVudE11dGF0aW9uID0gW3tcbiAgICAgIHRhcmdldDogXCJwYXJlbnRcIixcbiAgICAgIG11dGF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBtdXRhdGVkUHJvcHM7XG4gICAgICB9XG4gICAgfV07XG4gICAgdmFyIGRhdGFNdXRhdGlvbiA9IHNlbGVjdGVkRGF0YSAmJiBhY3RpdmF0ZVNlbGVjdGVkRGF0YSA/IHNlbGVjdGVkRGF0YS5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoaWxkTmFtZTogZC5jaGlsZE5hbWUsXG4gICAgICAgIGV2ZW50S2V5OiBkLmV2ZW50S2V5LFxuICAgICAgICB0YXJnZXQ6IFwiZGF0YVwiLFxuICAgICAgICBtdXRhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfYXNzaWduKHtcbiAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZVxuICAgICAgICAgIH0sIGNhbGxiYWNrTXV0YXRpb24pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pIDogW107XG4gICAgcmV0dXJuIHBhcmVudE11dGF0aW9uLmNvbmNhdChkYXRhTXV0YXRpb24pO1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgX29iamVjdFNwcmVhZCh7fSwgU2VsZWN0aW9uSGVscGVycywge1xuICBvbk1vdXNlRG93bjogU2VsZWN0aW9uSGVscGVycy5vbk1vdXNlRG93bi5iaW5kKFNlbGVjdGlvbkhlbHBlcnMpLFxuICBvbk1vdXNlVXA6IFNlbGVjdGlvbkhlbHBlcnMub25Nb3VzZVVwLmJpbmQoU2VsZWN0aW9uSGVscGVycyksXG4gIG9uTW91c2VNb3ZlOiBfdGhyb3R0bGUoU2VsZWN0aW9uSGVscGVycy5vbk1vdXNlTW92ZS5iaW5kKFNlbGVjdGlvbkhlbHBlcnMpLCAxNiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gIHtcbiAgICBsZWFkaW5nOiB0cnVlLFxuICAgIHRyYWlsaW5nOiBmYWxzZVxuICB9KVxufSk7IiwiZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7IG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7IH0pKTsgfSBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFZpY3RvcnlDb250YWluZXIsIFJlY3QgfSBmcm9tIFwidmljdG9yeS1jb3JlXCI7XG5pbXBvcnQgU2VsZWN0aW9uSGVscGVycyBmcm9tIFwiLi9zZWxlY3Rpb24taGVscGVyc1wiO1xuZXhwb3J0IHZhciBzZWxlY3Rpb25Db250YWluZXJNaXhpbiA9IGZ1bmN0aW9uIChiYXNlKSB7XG4gIHZhciBfY2xhc3MsIF90ZW1wO1xuXG4gIHJldHVybiBfdGVtcCA9IF9jbGFzcyA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKF9iYXNlKSB7XG4gICAgX2luaGVyaXRzKFZpY3RvcnlTZWxlY3Rpb25Db250YWluZXIsIF9iYXNlKTtcblxuICAgIGZ1bmN0aW9uIFZpY3RvcnlTZWxlY3Rpb25Db250YWluZXIoKSB7XG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmljdG9yeVNlbGVjdGlvbkNvbnRhaW5lcik7XG5cbiAgICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoVmljdG9yeVNlbGVjdGlvbkNvbnRhaW5lci5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFZpY3RvcnlTZWxlY3Rpb25Db250YWluZXIpKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoVmljdG9yeVNlbGVjdGlvbkNvbnRhaW5lciwgW3tcbiAgICAgIGtleTogXCJnZXRSZWN0XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVjdChwcm9wcykge1xuICAgICAgICB2YXIgeDEgPSBwcm9wcy54MSxcbiAgICAgICAgICAgIHgyID0gcHJvcHMueDIsXG4gICAgICAgICAgICB5MSA9IHByb3BzLnkxLFxuICAgICAgICAgICAgeTIgPSBwcm9wcy55MixcbiAgICAgICAgICAgIHNlbGVjdGlvblN0eWxlID0gcHJvcHMuc2VsZWN0aW9uU3R5bGUsXG4gICAgICAgICAgICBzZWxlY3Rpb25Db21wb25lbnQgPSBwcm9wcy5zZWxlY3Rpb25Db21wb25lbnQsXG4gICAgICAgICAgICBuYW1lID0gcHJvcHMubmFtZTtcbiAgICAgICAgdmFyIHdpZHRoID0gTWF0aC5hYnMoeDIgLSB4MSkgfHwgMTtcbiAgICAgICAgdmFyIGhlaWdodCA9IE1hdGguYWJzKHkyIC0geTEpIHx8IDE7XG4gICAgICAgIHZhciB4ID0gTWF0aC5taW4oeDEsIHgyKTtcbiAgICAgICAgdmFyIHkgPSBNYXRoLm1pbih5MSwgeTIpO1xuICAgICAgICByZXR1cm4geTIgJiYgeDIgJiYgeDEgJiYgeTEgPyBSZWFjdC5jbG9uZUVsZW1lbnQoc2VsZWN0aW9uQ29tcG9uZW50LCB7XG4gICAgICAgICAga2V5OiBcIlwiLmNvbmNhdChuYW1lLCBcIi1zZWxlY3Rpb25cIiksXG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiB5LFxuICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICBzdHlsZTogc2VsZWN0aW9uU3R5bGVcbiAgICAgICAgfSkgOiBudWxsO1xuICAgICAgfSAvLyBPdmVycmlkZXMgbWV0aG9kIGluIFZpY3RvcnlDb250YWluZXJcblxuICAgIH0sIHtcbiAgICAgIGtleTogXCJnZXRDaGlsZHJlblwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldENoaWxkcmVuKHByb3BzKSB7XG4gICAgICAgIHJldHVybiBfdG9Db25zdW1hYmxlQXJyYXkoUmVhY3QuQ2hpbGRyZW4udG9BcnJheShwcm9wcy5jaGlsZHJlbikpLmNvbmNhdChbdGhpcy5nZXRSZWN0KHByb3BzKV0pO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBWaWN0b3J5U2VsZWN0aW9uQ29udGFpbmVyO1xuICB9KGJhc2UpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcImRpc3BsYXlOYW1lXCIsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogXCJWaWN0b3J5U2VsZWN0aW9uQ29udGFpbmVyXCJcbiAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwicHJvcFR5cGVzXCIsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogX29iamVjdFNwcmVhZCh7fSwgVmljdG9yeUNvbnRhaW5lci5wcm9wVHlwZXMsIHtcbiAgICAgIGFjdGl2YXRlU2VsZWN0ZWREYXRhOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGFsbG93U2VsZWN0aW9uOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGRpc2FibGU6IFByb3BUeXBlcy5ib29sLFxuICAgICAgb25TZWxlY3Rpb246IFByb3BUeXBlcy5mdW5jLFxuICAgICAgb25TZWxlY3Rpb25DbGVhcmVkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIHNlbGVjdGlvbkJsYWNrbGlzdDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gICAgICBzZWxlY3Rpb25Db21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50LFxuICAgICAgc2VsZWN0aW9uRGltZW5zaW9uOiBQcm9wVHlwZXMub25lT2YoW1wieFwiLCBcInlcIl0pLFxuICAgICAgc2VsZWN0aW9uU3R5bGU6IFByb3BUeXBlcy5vYmplY3RcbiAgICB9KVxuICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzcywgXCJkZWZhdWx0UHJvcHNcIiwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiBfb2JqZWN0U3ByZWFkKHt9LCBWaWN0b3J5Q29udGFpbmVyLmRlZmF1bHRQcm9wcywge1xuICAgICAgYWN0aXZhdGVTZWxlY3RlZERhdGE6IHRydWUsXG4gICAgICBhbGxvd1NlbGVjdGlvbjogdHJ1ZSxcbiAgICAgIHNlbGVjdGlvbkNvbXBvbmVudDogUmVhY3QuY3JlYXRlRWxlbWVudChSZWN0LCBudWxsKSxcbiAgICAgIHNlbGVjdGlvblN0eWxlOiB7XG4gICAgICAgIHN0cm9rZTogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBmaWxsOiBcImJsYWNrXCIsXG4gICAgICAgIGZpbGxPcGFjaXR5OiAwLjFcbiAgICAgIH1cbiAgICB9KVxuICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzcywgXCJkZWZhdWx0RXZlbnRzXCIsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgdGFyZ2V0OiBcInBhcmVudFwiLFxuICAgICAgICBldmVudEhhbmRsZXJzOiB7XG4gICAgICAgICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHMuZGlzYWJsZSA/IHt9IDogU2VsZWN0aW9uSGVscGVycy5vbk1vdXNlRG93bihldnQsIHRhcmdldFByb3BzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uVG91Y2hTdGFydDogZnVuY3Rpb24gKGV2dCwgdGFyZ2V0UHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5kaXNhYmxlID8ge30gOiBTZWxlY3Rpb25IZWxwZXJzLm9uTW91c2VEb3duKGV2dCwgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Nb3VzZU1vdmU6IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHMuZGlzYWJsZSA/IHt9IDogU2VsZWN0aW9uSGVscGVycy5vbk1vdXNlTW92ZShldnQsIHRhcmdldFByb3BzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uVG91Y2hNb3ZlOiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzLmRpc2FibGUgPyB7fSA6IFNlbGVjdGlvbkhlbHBlcnMub25Nb3VzZU1vdmUoZXZ0LCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1vdXNlVXA6IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHMuZGlzYWJsZSA/IHt9IDogU2VsZWN0aW9uSGVscGVycy5vbk1vdXNlVXAoZXZ0LCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblRvdWNoRW5kOiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzLmRpc2FibGUgPyB7fSA6IFNlbGVjdGlvbkhlbHBlcnMub25Nb3VzZVVwKGV2dCwgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfV07XG4gICAgfVxuICB9KSwgX3RlbXA7XG59O1xuZXhwb3J0IGRlZmF1bHQgc2VsZWN0aW9uQ29udGFpbmVyTWl4aW4oVmljdG9yeUNvbnRhaW5lcik7IiwiaW1wb3J0IF9tYXBWYWx1ZXMgZnJvbSBcImxvZGFzaC9tYXBWYWx1ZXNcIjtcbmltcG9ydCBfZGVmYXVsdHMgZnJvbSBcImxvZGFzaC9kZWZhdWx0c1wiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gvaXNGdW5jdGlvblwiO1xuaW1wb3J0IF90aHJvdHRsZSBmcm9tIFwibG9kYXNoL3Rocm90dGxlXCI7XG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHsgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTsgfSkpOyB9IG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbmltcG9ydCB7IFNlbGVjdGlvbiB9IGZyb20gXCJ2aWN0b3J5LWNvcmVcIjtcbmltcG9ydCBpc0VxdWFsIGZyb20gXCJyZWFjdC1mYXN0LWNvbXBhcmVcIjtcbnZhciBIZWxwZXJzID0ge1xuICBnZXREaW1lbnNpb246IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHZhciBob3Jpem9udGFsID0gcHJvcHMuaG9yaXpvbnRhbCxcbiAgICAgICAgYnJ1c2hEaW1lbnNpb24gPSBwcm9wcy5icnVzaERpbWVuc2lvbjtcblxuICAgIGlmICghaG9yaXpvbnRhbCB8fCAhYnJ1c2hEaW1lbnNpb24pIHtcbiAgICAgIHJldHVybiBicnVzaERpbWVuc2lvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gYnJ1c2hEaW1lbnNpb24gPT09IFwieFwiID8gXCJ5XCIgOiBcInhcIjtcbiAgfSxcbiAgd2l0aGluQm91bmRzOiBmdW5jdGlvbiAocG9pbnQsIGJvdW5kcywgcGFkZGluZykge1xuICAgIHZhciBfbWFwVmFsdWVzMiA9IF9tYXBWYWx1ZXMoYm91bmRzLCBOdW1iZXIpLFxuICAgICAgICB4MSA9IF9tYXBWYWx1ZXMyLngxLFxuICAgICAgICB4MiA9IF9tYXBWYWx1ZXMyLngyLFxuICAgICAgICB5MSA9IF9tYXBWYWx1ZXMyLnkxLFxuICAgICAgICB5MiA9IF9tYXBWYWx1ZXMyLnkyO1xuXG4gICAgdmFyIF9tYXBWYWx1ZXMzID0gX21hcFZhbHVlcyhwb2ludCwgTnVtYmVyKSxcbiAgICAgICAgeCA9IF9tYXBWYWx1ZXMzLngsXG4gICAgICAgIHkgPSBfbWFwVmFsdWVzMy55O1xuXG4gICAgcGFkZGluZyA9IHBhZGRpbmcgPyBwYWRkaW5nIC8gMiA6IDA7XG4gICAgcmV0dXJuIHggKyBwYWRkaW5nID49IE1hdGgubWluKHgxLCB4MikgJiYgeCAtIHBhZGRpbmcgPD0gTWF0aC5tYXgoeDEsIHgyKSAmJiB5ICsgcGFkZGluZyA+PSBNYXRoLm1pbih5MSwgeTIpICYmIHkgLSBwYWRkaW5nIDw9IE1hdGgubWF4KHkxLCB5Mik7XG4gIH0sXG4gIGdldERvbWFpbkJveDogZnVuY3Rpb24gKHByb3BzLCBmdWxsRG9tYWluLCBzZWxlY3RlZERvbWFpbikge1xuICAgIHZhciBicnVzaERpbWVuc2lvbiA9IHRoaXMuZ2V0RGltZW5zaW9uKHByb3BzKTtcbiAgICBmdWxsRG9tYWluID0gX2RlZmF1bHRzKHt9LCBmdWxsRG9tYWluLCBwcm9wcy5kb21haW4pO1xuICAgIHNlbGVjdGVkRG9tYWluID0gX2RlZmF1bHRzKHt9LCBzZWxlY3RlZERvbWFpbiwgZnVsbERvbWFpbik7XG4gICAgdmFyIGZ1bGxDb29yZHMgPSBTZWxlY3Rpb24uZ2V0RG9tYWluQ29vcmRpbmF0ZXMocHJvcHMsIGZ1bGxEb21haW4pO1xuICAgIHZhciBzZWxlY3RlZENvb3JkcyA9IFNlbGVjdGlvbi5nZXREb21haW5Db29yZGluYXRlcyhwcm9wcywgc2VsZWN0ZWREb21haW4pO1xuICAgIHJldHVybiB7XG4gICAgICB4MTogYnJ1c2hEaW1lbnNpb24gIT09IFwieVwiID8gTWF0aC5taW4uYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KHNlbGVjdGVkQ29vcmRzLngpKSA6IE1hdGgubWluLmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheShmdWxsQ29vcmRzLngpKSxcbiAgICAgIHgyOiBicnVzaERpbWVuc2lvbiAhPT0gXCJ5XCIgPyBNYXRoLm1heC5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkoc2VsZWN0ZWRDb29yZHMueCkpIDogTWF0aC5tYXguYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KGZ1bGxDb29yZHMueCkpLFxuICAgICAgeTE6IGJydXNoRGltZW5zaW9uICE9PSBcInhcIiA/IE1hdGgubWluLmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheShzZWxlY3RlZENvb3Jkcy55KSkgOiBNYXRoLm1pbi5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkoZnVsbENvb3Jkcy55KSksXG4gICAgICB5MjogYnJ1c2hEaW1lbnNpb24gIT09IFwieFwiID8gTWF0aC5tYXguYXBwbHkoTWF0aCwgX3RvQ29uc3VtYWJsZUFycmF5KHNlbGVjdGVkQ29vcmRzLnkpKSA6IE1hdGgubWF4LmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheShmdWxsQ29vcmRzLnkpKVxuICAgIH07XG4gIH0sXG4gIGdldEhhbmRsZXM6IGZ1bmN0aW9uIChwcm9wcywgZG9tYWluQm94KSB7XG4gICAgdmFyIGJydXNoRGltZW5zaW9uID0gdGhpcy5nZXREaW1lbnNpb24ocHJvcHMpO1xuICAgIHZhciB4MSA9IGRvbWFpbkJveC54MSxcbiAgICAgICAgeDIgPSBkb21haW5Cb3gueDIsXG4gICAgICAgIHkxID0gZG9tYWluQm94LnkxLFxuICAgICAgICB5MiA9IGRvbWFpbkJveC55MjtcbiAgICB2YXIgbWluWCA9IE1hdGgubWluKHgxLCB4Mik7XG4gICAgdmFyIG1heFggPSBNYXRoLm1heCh4MSwgeDIpO1xuICAgIHZhciBtaW5ZID0gTWF0aC5taW4oeTEsIHkyKTtcbiAgICB2YXIgbWF4WSA9IE1hdGgubWF4KHkxLCB5Mik7XG4gICAgdmFyIGhhbmRsZVdpZHRoID0gcHJvcHMuaGFuZGxlV2lkdGggLyAyO1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiBicnVzaERpbWVuc2lvbiAhPT0gXCJ5XCIgJiYge1xuICAgICAgICB4MTogbWluWCAtIGhhbmRsZVdpZHRoLFxuICAgICAgICB4MjogbWluWCArIGhhbmRsZVdpZHRoLFxuICAgICAgICB5MTogeTEsXG4gICAgICAgIHkyOiB5MlxuICAgICAgfSxcbiAgICAgIHJpZ2h0OiBicnVzaERpbWVuc2lvbiAhPT0gXCJ5XCIgJiYge1xuICAgICAgICB4MTogbWF4WCAtIGhhbmRsZVdpZHRoLFxuICAgICAgICB4MjogbWF4WCArIGhhbmRsZVdpZHRoLFxuICAgICAgICB5MTogeTEsXG4gICAgICAgIHkyOiB5MlxuICAgICAgfSxcbiAgICAgIHRvcDogYnJ1c2hEaW1lbnNpb24gIT09IFwieFwiICYmIHtcbiAgICAgICAgeDE6IHgxLFxuICAgICAgICB4MjogeDIsXG4gICAgICAgIHkxOiBtaW5ZIC0gaGFuZGxlV2lkdGgsXG4gICAgICAgIHkyOiBtaW5ZICsgaGFuZGxlV2lkdGhcbiAgICAgIH0sXG4gICAgICBib3R0b206IGJydXNoRGltZW5zaW9uICE9PSBcInhcIiAmJiB7XG4gICAgICAgIHgxOiB4MSxcbiAgICAgICAgeDI6IHgyLFxuICAgICAgICB5MTogbWF4WSAtIGhhbmRsZVdpZHRoLFxuICAgICAgICB5MjogbWF4WSArIGhhbmRsZVdpZHRoXG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgZ2V0QWN0aXZlSGFuZGxlczogZnVuY3Rpb24gKHBvaW50LCBwcm9wcywgZG9tYWluQm94KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBoYW5kbGVzID0gdGhpcy5nZXRIYW5kbGVzKHByb3BzLCBkb21haW5Cb3gpO1xuICAgIHZhciBhY3RpdmVIYW5kbGVzID0gW1widG9wXCIsIFwiYm90dG9tXCIsIFwibGVmdFwiLCBcInJpZ2h0XCJdLnJlZHVjZShmdW5jdGlvbiAobWVtbywgb3B0KSB7XG4gICAgICBtZW1vID0gaGFuZGxlc1tvcHRdICYmIF90aGlzLndpdGhpbkJvdW5kcyhwb2ludCwgaGFuZGxlc1tvcHRdKSA/IG1lbW8uY29uY2F0KG9wdCkgOiBtZW1vO1xuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfSwgW10pO1xuICAgIHJldHVybiBhY3RpdmVIYW5kbGVzLmxlbmd0aCAmJiBhY3RpdmVIYW5kbGVzO1xuICB9LFxuICBnZXRSZXNpemVNdXRhdGlvbjogZnVuY3Rpb24gKGJveCwgaGFuZGxlcykge1xuICAgIHZhciB4MSA9IGJveC54MSxcbiAgICAgICAgeTEgPSBib3gueTEsXG4gICAgICAgIHgyID0gYm94LngyLFxuICAgICAgICB5MiA9IGJveC55MjtcbiAgICB2YXIgbXV0YXRpb25zID0ge1xuICAgICAgbGVmdDoge1xuICAgICAgICB4MTogTWF0aC5tYXgoeDEsIHgyKSxcbiAgICAgICAgeDI6IE1hdGgubWluKHgxLCB4MiksXG4gICAgICAgIHkxOiB5MSxcbiAgICAgICAgeTI6IHkyXG4gICAgICB9LFxuICAgICAgcmlnaHQ6IHtcbiAgICAgICAgeDE6IE1hdGgubWluKHgxLCB4MiksXG4gICAgICAgIHgyOiBNYXRoLm1heCh4MSwgeDIpLFxuICAgICAgICB5MTogeTEsXG4gICAgICAgIHkyOiB5MlxuICAgICAgfSxcbiAgICAgIHRvcDoge1xuICAgICAgICB5MTogTWF0aC5tYXgoeTEsIHkyKSxcbiAgICAgICAgeTI6IE1hdGgubWluKHkxLCB5MiksXG4gICAgICAgIHgxOiB4MSxcbiAgICAgICAgeDI6IHgyXG4gICAgICB9LFxuICAgICAgYm90dG9tOiB7XG4gICAgICAgIHkxOiBNYXRoLm1pbih5MSwgeTIpLFxuICAgICAgICB5MjogTWF0aC5tYXgoeTEsIHkyKSxcbiAgICAgICAgeDE6IHgxLFxuICAgICAgICB4MjogeDJcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBoYW5kbGVzLnJlZHVjZShmdW5jdGlvbiAobWVtbywgY3VycmVudCkge1xuICAgICAgcmV0dXJuIF9hc3NpZ24obWVtbywgbXV0YXRpb25zW2N1cnJlbnRdKTtcbiAgICB9LCB7fSk7XG4gIH0sXG4gIGdldE1pbmltdW1Eb21haW46IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogWzAsIDEgLyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUl0sXG4gICAgICB5OiBbMCwgMSAvIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXVxuICAgIH07XG4gIH0sXG4gIGdldERlZmF1bHRCcnVzaEFyZWE6IGZ1bmN0aW9uICh0YXJnZXRQcm9wcywgY2FjaGVkRG9tYWluLCBldnQpIHtcbiAgICB2YXIgZG9tYWluID0gdGFyZ2V0UHJvcHMuZG9tYWluLFxuICAgICAgICBmdWxsRG9tYWluID0gdGFyZ2V0UHJvcHMuZnVsbERvbWFpbixcbiAgICAgICAgc2NhbGUgPSB0YXJnZXRQcm9wcy5zY2FsZSxcbiAgICAgICAgaG9yaXpvbnRhbCA9IHRhcmdldFByb3BzLmhvcml6b250YWwsXG4gICAgICAgIGFsbG93UmVzaXplID0gdGFyZ2V0UHJvcHMuYWxsb3dSZXNpemU7XG4gICAgdmFyIGRlZmF1bHRCcnVzaEFyZWEgPSAhYWxsb3dSZXNpemUgJiYgIXRhcmdldFByb3BzLmRlZmF1bHRCcnVzaEFyZWEgPyBcIm1vdmVcIiA6IHRhcmdldFByb3BzLmRlZmF1bHRCcnVzaEFyZWE7XG5cbiAgICBpZiAoZGVmYXVsdEJydXNoQXJlYSA9PT0gXCJub25lXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1pbmltdW1Eb21haW4oKTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRCcnVzaEFyZWEgPT09IFwiZGlzYWJsZVwiKSB7XG4gICAgICByZXR1cm4gY2FjaGVkRG9tYWluO1xuICAgIH0gZWxzZSBpZiAoZGVmYXVsdEJydXNoQXJlYSA9PT0gXCJtb3ZlXCIpIHtcbiAgICAgIHZhciBicnVzaEJveCA9IHRoaXMuZ2V0RG9tYWluQm94KHRhcmdldFByb3BzLCBmdWxsRG9tYWluLCBjYWNoZWREb21haW4pO1xuICAgICAgdmFyIHBhcmVudFNWRyA9IHRhcmdldFByb3BzLnBhcmVudFNWRyB8fCBTZWxlY3Rpb24uZ2V0UGFyZW50U1ZHKGV2dCk7XG4gICAgICB2YXIgcGFubmVkQm94ID0gdGhpcy5wYW5Cb3goX29iamVjdFNwcmVhZCh7fSwgdGFyZ2V0UHJvcHMsIGJydXNoQm94LCB7XG4gICAgICAgIGJydXNoRG9tYWluOiBjYWNoZWREb21haW4sXG4gICAgICAgIHN0YXJ0WDogKGJydXNoQm94LngxICsgYnJ1c2hCb3gueDIpIC8gMixcbiAgICAgICAgc3RhcnRZOiAoYnJ1c2hCb3gueTEgKyBicnVzaEJveC55MikgLyAyXG4gICAgICB9KSwgU2VsZWN0aW9uLmdldFNWR0V2ZW50Q29vcmRpbmF0ZXMoZXZ0LCBwYXJlbnRTVkcpKTtcbiAgICAgIHZhciBmdWxsRG9tYWluQm94ID0gdGFyZ2V0UHJvcHMuZnVsbERvbWFpbkJveCB8fCB0aGlzLmdldERvbWFpbkJveCh0YXJnZXRQcm9wcywgZnVsbERvbWFpbik7XG4gICAgICB2YXIgY29uc3RyYWluZWRCb3ggPSB0aGlzLmNvbnN0cmFpbkJveChwYW5uZWRCb3gsIGZ1bGxEb21haW5Cb3gpO1xuICAgICAgcmV0dXJuIFNlbGVjdGlvbi5nZXRCb3VuZHMoX29iamVjdFNwcmVhZCh7fSwgY29uc3RyYWluZWRCb3gsIHtcbiAgICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgICBob3Jpem9udGFsOiBob3Jpem9udGFsXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkb21haW47XG4gICAgfVxuICB9LFxuICBnZXRTZWxlY3Rpb25NdXRhdGlvbjogZnVuY3Rpb24gKHBvaW50LCBib3gsIGJydXNoRGltZW5zaW9uKSB7XG4gICAgdmFyIHggPSBwb2ludC54LFxuICAgICAgICB5ID0gcG9pbnQueTtcbiAgICB2YXIgeDEgPSBib3gueDEsXG4gICAgICAgIHgyID0gYm94LngyLFxuICAgICAgICB5MSA9IGJveC55MSxcbiAgICAgICAgeTIgPSBib3gueTI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgxOiBicnVzaERpbWVuc2lvbiAhPT0gXCJ5XCIgPyB4IDogeDEsXG4gICAgICB5MTogYnJ1c2hEaW1lbnNpb24gIT09IFwieFwiID8geSA6IHkxLFxuICAgICAgeDI6IGJydXNoRGltZW5zaW9uICE9PSBcInlcIiA/IHggOiB4MixcbiAgICAgIHkyOiBicnVzaERpbWVuc2lvbiAhPT0gXCJ4XCIgPyB5IDogeTJcbiAgICB9O1xuICB9LFxuICBwYW5Cb3g6IGZ1bmN0aW9uIChwcm9wcywgcG9pbnQpIHtcbiAgICB2YXIgZG9tYWluID0gcHJvcHMuZG9tYWluLFxuICAgICAgICBzdGFydFggPSBwcm9wcy5zdGFydFgsXG4gICAgICAgIHN0YXJ0WSA9IHByb3BzLnN0YXJ0WTtcbiAgICB2YXIgYnJ1c2hEaW1lbnNpb24gPSB0aGlzLmdldERpbWVuc2lvbihwcm9wcyk7XG5cbiAgICB2YXIgYnJ1c2hEb21haW4gPSBfZGVmYXVsdHMoe30sIHByb3BzLmJydXNoRG9tYWluLCBkb21haW4pO1xuXG4gICAgdmFyIGZ1bGxEb21haW4gPSBfZGVmYXVsdHMoe30sIHByb3BzLmZ1bGxEb21haW4sIGRvbWFpbik7XG5cbiAgICB2YXIgX3JlZiA9IHByb3BzLngxID8gcHJvcHMgOiB0aGlzLmdldERvbWFpbkJveChwcm9wcywgZnVsbERvbWFpbiwgYnJ1c2hEb21haW4pLFxuICAgICAgICB4MSA9IF9yZWYueDEsXG4gICAgICAgIHgyID0gX3JlZi54MixcbiAgICAgICAgeTEgPSBfcmVmLnkxLFxuICAgICAgICB5MiA9IF9yZWYueTI7XG5cbiAgICB2YXIgeCA9IHBvaW50LngsXG4gICAgICAgIHkgPSBwb2ludC55O1xuICAgIHZhciBkZWx0YSA9IHtcbiAgICAgIHg6IHN0YXJ0WCA/IHN0YXJ0WCAtIHggOiAwLFxuICAgICAgeTogc3RhcnRZID8gc3RhcnRZIC0geSA6IDBcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICB4MTogYnJ1c2hEaW1lbnNpb24gIT09IFwieVwiID8gTWF0aC5taW4oeDEsIHgyKSAtIGRlbHRhLnggOiBNYXRoLm1pbih4MSwgeDIpLFxuICAgICAgeDI6IGJydXNoRGltZW5zaW9uICE9PSBcInlcIiA/IE1hdGgubWF4KHgxLCB4MikgLSBkZWx0YS54IDogTWF0aC5tYXgoeDEsIHgyKSxcbiAgICAgIHkxOiBicnVzaERpbWVuc2lvbiAhPT0gXCJ4XCIgPyBNYXRoLm1pbih5MSwgeTIpIC0gZGVsdGEueSA6IE1hdGgubWluKHkxLCB5MiksXG4gICAgICB5MjogYnJ1c2hEaW1lbnNpb24gIT09IFwieFwiID8gTWF0aC5tYXgoeTEsIHkyKSAtIGRlbHRhLnkgOiBNYXRoLm1heCh5MSwgeTIpXG4gICAgfTtcbiAgfSxcbiAgY29uc3RyYWluQm94OiBmdW5jdGlvbiAoYm94LCBmdWxsRG9tYWluQm94KSB7XG4gICAgdmFyIF9tYXBWYWx1ZXM0ID0gX21hcFZhbHVlcyhmdWxsRG9tYWluQm94LCBOdW1iZXIpLFxuICAgICAgICB4MSA9IF9tYXBWYWx1ZXM0LngxLFxuICAgICAgICB5MSA9IF9tYXBWYWx1ZXM0LnkxLFxuICAgICAgICB4MiA9IF9tYXBWYWx1ZXM0LngyLFxuICAgICAgICB5MiA9IF9tYXBWYWx1ZXM0LnkyO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHgxOiBib3gueDIgPiB4MiA/IHgyIC0gTWF0aC5hYnMoYm94LngyIC0gYm94LngxKSA6IE1hdGgubWF4KGJveC54MSwgeDEpLFxuICAgICAgeTE6IGJveC55MiA+IHkyID8geTIgLSBNYXRoLmFicyhib3gueTIgLSBib3gueTEpIDogTWF0aC5tYXgoYm94LnkxLCB5MSksXG4gICAgICB4MjogYm94LngxIDwgeDEgPyB4MSArIE1hdGguYWJzKGJveC54MiAtIGJveC54MSkgOiBNYXRoLm1pbihib3gueDIsIHgyKSxcbiAgICAgIHkyOiBib3gueTEgPCB5MSA/IHkxICsgTWF0aC5hYnMoYm94LnkyIC0gYm94LnkxKSA6IE1hdGgubWluKGJveC55MiwgeTIpXG4gICAgfTtcbiAgfSxcbiAgY29uc3RyYWluUG9pbnQ6IGZ1bmN0aW9uIChwb2ludCwgZnVsbERvbWFpbkJveCkge1xuICAgIHZhciBfbWFwVmFsdWVzNSA9IF9tYXBWYWx1ZXMoZnVsbERvbWFpbkJveCwgTnVtYmVyKSxcbiAgICAgICAgeDEgPSBfbWFwVmFsdWVzNS54MSxcbiAgICAgICAgeTEgPSBfbWFwVmFsdWVzNS55MSxcbiAgICAgICAgeDIgPSBfbWFwVmFsdWVzNS54MixcbiAgICAgICAgeTIgPSBfbWFwVmFsdWVzNS55MjtcblxuICAgIHJldHVybiB7XG4gICAgICB4OiBNYXRoLm1pbihNYXRoLm1heChwb2ludC54LCB4MSksIHgyKSxcbiAgICAgIHk6IE1hdGgubWluKE1hdGgubWF4KHBvaW50LnksIHkxKSwgeTIpXG4gICAgfTtcbiAgfSxcbiAgaGFzTW92ZWQ6IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHZhciB4MSA9IHByb3BzLngxLFxuICAgICAgICB4MiA9IHByb3BzLngyLFxuICAgICAgICB5MSA9IHByb3BzLnkxLFxuICAgICAgICB5MiA9IHByb3BzLnkyLFxuICAgICAgICBtb3VzZU1vdmVUaHJlc2hvbGQgPSBwcm9wcy5tb3VzZU1vdmVUaHJlc2hvbGQ7XG4gICAgdmFyIGJydXNoRGltZW5zaW9uID0gdGhpcy5nZXREaW1lbnNpb24ocHJvcHMpO1xuICAgIHZhciB4TW92ZWQgPSBNYXRoLmFicyh4MSAtIHgyKSA+PSBtb3VzZU1vdmVUaHJlc2hvbGQ7XG4gICAgdmFyIHlNb3ZlZCA9IE1hdGguYWJzKHkxIC0geTIpID49IG1vdXNlTW92ZVRocmVzaG9sZDtcblxuICAgIHN3aXRjaCAoYnJ1c2hEaW1lbnNpb24pIHtcbiAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgIHJldHVybiB4TW92ZWQ7XG5cbiAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgIHJldHVybiB5TW92ZWQ7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4TW92ZWQgfHwgeU1vdmVkO1xuICAgIH1cbiAgfSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzLCBjb21wbGV4aXR5XG4gIG9uTW91c2VEb3duOiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcykge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIGhhbmRsZVdpZHRoID0gdGFyZ2V0UHJvcHMuaGFuZGxlV2lkdGgsXG4gICAgICAgIGNhY2hlZEJydXNoRG9tYWluID0gdGFyZ2V0UHJvcHMuY2FjaGVkQnJ1c2hEb21haW4sXG4gICAgICAgIGRvbWFpbiA9IHRhcmdldFByb3BzLmRvbWFpbixcbiAgICAgICAgYWxsb3dSZXNpemUgPSB0YXJnZXRQcm9wcy5hbGxvd1Jlc2l6ZSxcbiAgICAgICAgYWxsb3dEcmFnID0gdGFyZ2V0UHJvcHMuYWxsb3dEcmFnLFxuICAgICAgICBhbGxvd0RyYXcgPSB0YXJnZXRQcm9wcy5hbGxvd0RyYXc7XG4gICAgdmFyIGJydXNoRGltZW5zaW9uID0gdGhpcy5nZXREaW1lbnNpb24odGFyZ2V0UHJvcHMpO1xuICAgIHZhciBkZWZhdWx0QnJ1c2hBcmVhID0gIWFsbG93UmVzaXplICYmICF0YXJnZXRQcm9wcy5kZWZhdWx0QnJ1c2hBcmVhID8gXCJtb3ZlXCIgOiB0YXJnZXRQcm9wcy5kZWZhdWx0QnJ1c2hBcmVhOyAvLyBEb24ndCB0cmlnZ2VyIGV2ZW50cyBmb3Igc3RhdGljIGJydXNoZXNcblxuICAgIGlmICghYWxsb3dSZXNpemUgJiYgIWFsbG93RHJhZykge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHZhciBmdWxsRG9tYWluQm94ID0gdGFyZ2V0UHJvcHMuZnVsbERvbWFpbkJveCB8fCB0aGlzLmdldERvbWFpbkJveCh0YXJnZXRQcm9wcywgZG9tYWluKTtcbiAgICB2YXIgcGFyZW50U1ZHID0gdGFyZ2V0UHJvcHMucGFyZW50U1ZHIHx8IFNlbGVjdGlvbi5nZXRQYXJlbnRTVkcoZXZ0KTtcblxuICAgIHZhciBfU2VsZWN0aW9uJGdldFNWR0V2ZW4gPSBTZWxlY3Rpb24uZ2V0U1ZHRXZlbnRDb29yZGluYXRlcyhldnQsIHBhcmVudFNWRyksXG4gICAgICAgIHggPSBfU2VsZWN0aW9uJGdldFNWR0V2ZW4ueCxcbiAgICAgICAgeSA9IF9TZWxlY3Rpb24kZ2V0U1ZHRXZlbi55OyAvLyBJZ25vcmUgZXZlbnRzIHRoYXQgb2NjdXIgb3V0c2lkZSBvZiB0aGUgbWF4aW11bSBkb21haW4gcmVnaW9uXG5cblxuICAgIGlmICghdGhpcy53aXRoaW5Cb3VuZHMoe1xuICAgICAgeDogeCxcbiAgICAgIHk6IHlcbiAgICB9LCBmdWxsRG9tYWluQm94LCBoYW5kbGVXaWR0aCkpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICB2YXIgYnJ1c2hEb21haW4gPSBfZGVmYXVsdHMoe30sIHRhcmdldFByb3BzLmJydXNoRG9tYWluLCBkb21haW4pO1xuXG4gICAgdmFyIGN1cnJlbnREb21haW4gPSBpc0VxdWFsKGJydXNoRG9tYWluLCBjYWNoZWRCcnVzaERvbWFpbikgPyB0YXJnZXRQcm9wcy5jdXJyZW50RG9tYWluIHx8IGJydXNoRG9tYWluIHx8IGRvbWFpbiA6IGJydXNoRG9tYWluIHx8IGRvbWFpbjtcbiAgICB2YXIgZG9tYWluQm94ID0gdGhpcy5nZXREb21haW5Cb3godGFyZ2V0UHJvcHMsIGRvbWFpbiwgY3VycmVudERvbWFpbik7XG4gICAgdmFyIGFjdGl2ZUhhbmRsZXMgPSBhbGxvd1Jlc2l6ZSAmJiB0aGlzLmdldEFjdGl2ZUhhbmRsZXMoe1xuICAgICAgeDogeCxcbiAgICAgIHk6IHlcbiAgICB9LCB0YXJnZXRQcm9wcywgZG9tYWluQm94KTsgLy8gSWYgdGhlIGV2ZW50IG9jY3VycyBpbiBhbnkgb2YgdGhlIGhhbmRsZSByZWdpb25zLCBzdGFydCBhIHJlc2l6ZVxuXG4gICAgaWYgKGFjdGl2ZUhhbmRsZXMpIHtcbiAgICAgIHJldHVybiBbe1xuICAgICAgICB0YXJnZXQ6IFwicGFyZW50XCIsXG4gICAgICAgIG11dGF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgICAgaXNTZWxlY3Rpbmc6IHRydWUsXG4gICAgICAgICAgICBkb21haW5Cb3g6IGRvbWFpbkJveCxcbiAgICAgICAgICAgIGZ1bGxEb21haW5Cb3g6IGZ1bGxEb21haW5Cb3gsXG4gICAgICAgICAgICBjYWNoZWRCcnVzaERvbWFpbjogYnJ1c2hEb21haW4sXG4gICAgICAgICAgICBjdXJyZW50RG9tYWluOiBjdXJyZW50RG9tYWluLFxuICAgICAgICAgICAgcGFyZW50U1ZHOiBwYXJlbnRTVkdcbiAgICAgICAgICB9LCBfdGhpczIuZ2V0UmVzaXplTXV0YXRpb24oZG9tYWluQm94LCBhY3RpdmVIYW5kbGVzKSk7XG4gICAgICAgIH1cbiAgICAgIH1dO1xuICAgIH0gZWxzZSBpZiAodGhpcy53aXRoaW5Cb3VuZHMoe1xuICAgICAgeDogeCxcbiAgICAgIHk6IHlcbiAgICB9LCBkb21haW5Cb3gpICYmICFpc0VxdWFsKGRvbWFpbiwgY3VycmVudERvbWFpbikpIHtcbiAgICAgIC8vIGlmIHRoZSBldmVudCBvY2N1cnMgd2l0aGluIGEgc2VsZWN0ZWQgcmVnaW9uIHN0YXJ0IGEgcGFubmluZyBldmVudCwgdW5sZXNzIHRoZSB3aG9sZVxuICAgICAgLy8gZG9tYWluIGlzIHNlbGVjdGVkXG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgdGFyZ2V0OiBcInBhcmVudFwiLFxuICAgICAgICBtdXRhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICAgIGlzUGFubmluZzogYWxsb3dEcmFnLFxuICAgICAgICAgICAgc3RhcnRYOiB4LFxuICAgICAgICAgICAgc3RhcnRZOiB5LFxuICAgICAgICAgICAgZG9tYWluQm94OiBkb21haW5Cb3gsXG4gICAgICAgICAgICBmdWxsRG9tYWluQm94OiBmdWxsRG9tYWluQm94LFxuICAgICAgICAgICAgY3VycmVudERvbWFpbjogY3VycmVudERvbWFpbixcbiAgICAgICAgICAgIGNhY2hlZEJydXNoRG9tYWluOiBicnVzaERvbWFpbixcbiAgICAgICAgICAgIHBhcmVudFNWRzogcGFyZW50U1ZHXG4gICAgICAgICAgfSwgZG9tYWluQm94KTtcbiAgICAgICAgfVxuICAgICAgfV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIHRoZSBldmVudCBvY2N1cnMgb3V0c2lkZSB0aGUgcmVnaW9uLCBvciBpZiB0aGUgd2hvbGUgZG9tYWluIGlzIHNlbGVjdGVkLFxuICAgICAgLy8gc3RhcnQgYSBuZXcgc2VsZWN0aW9uXG4gICAgICByZXR1cm4gYWxsb3dEcmF3ID8gW3tcbiAgICAgICAgdGFyZ2V0OiBcInBhcmVudFwiLFxuICAgICAgICBtdXRhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICAgIGlzU2VsZWN0aW5nOiBhbGxvd1Jlc2l6ZSB8fCBkZWZhdWx0QnJ1c2hBcmVhID09PSBcIm1vdmVcIixcbiAgICAgICAgICAgIGRvbWFpbkJveDogZG9tYWluQm94LFxuICAgICAgICAgICAgZnVsbERvbWFpbkJveDogZnVsbERvbWFpbkJveCxcbiAgICAgICAgICAgIHBhcmVudFNWRzogcGFyZW50U1ZHLFxuICAgICAgICAgICAgY2FjaGVkQnJ1c2hEb21haW46IGJydXNoRG9tYWluLFxuICAgICAgICAgICAgY2FjaGVkQ3VycmVudERvbWFpbjogY3VycmVudERvbWFpbixcbiAgICAgICAgICAgIGN1cnJlbnREb21haW46IF90aGlzMi5nZXRNaW5pbXVtRG9tYWluKClcbiAgICAgICAgICB9LCBfdGhpczIuZ2V0U2VsZWN0aW9uTXV0YXRpb24oe1xuICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgIHk6IHlcbiAgICAgICAgICB9LCBkb21haW5Cb3gsIGJydXNoRGltZW5zaW9uKSk7XG4gICAgICAgIH1cbiAgICAgIH1dIDoge307XG4gICAgfVxuICB9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHMsIGNvbXBsZXhpdHlcbiAgb25HbG9iYWxNb3VzZU1vdmU6IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzKSB7XG4gICAgdmFyIHNjYWxlID0gdGFyZ2V0UHJvcHMuc2NhbGUsXG4gICAgICAgIGlzUGFubmluZyA9IHRhcmdldFByb3BzLmlzUGFubmluZyxcbiAgICAgICAgaXNTZWxlY3RpbmcgPSB0YXJnZXRQcm9wcy5pc1NlbGVjdGluZyxcbiAgICAgICAgZnVsbERvbWFpbkJveCA9IHRhcmdldFByb3BzLmZ1bGxEb21haW5Cb3gsXG4gICAgICAgIG9uQnJ1c2hEb21haW5DaGFuZ2UgPSB0YXJnZXRQcm9wcy5vbkJydXNoRG9tYWluQ2hhbmdlLFxuICAgICAgICBhbGxvd1Jlc2l6ZSA9IHRhcmdldFByb3BzLmFsbG93UmVzaXplLFxuICAgICAgICBhbGxvd0RyYWcgPSB0YXJnZXRQcm9wcy5hbGxvd0RyYWcsXG4gICAgICAgIGhvcml6b250YWwgPSB0YXJnZXRQcm9wcy5ob3Jpem9udGFsLFxuICAgICAgICBtb3VzZU1vdmVUaHJlc2hvbGQgPSB0YXJnZXRQcm9wcy5tb3VzZU1vdmVUaHJlc2hvbGQsXG4gICAgICAgIHBhcmVudFNWRyA9IHRhcmdldFByb3BzLnBhcmVudFNWRztcbiAgICB2YXIgYnJ1c2hEaW1lbnNpb24gPSB0aGlzLmdldERpbWVuc2lvbih0YXJnZXRQcm9wcyk7XG5cbiAgICB2YXIgX1NlbGVjdGlvbiRnZXRTVkdFdmVuMiA9IFNlbGVjdGlvbi5nZXRTVkdFdmVudENvb3JkaW5hdGVzKGV2dCwgcGFyZW50U1ZHKSxcbiAgICAgICAgeCA9IF9TZWxlY3Rpb24kZ2V0U1ZHRXZlbjIueCxcbiAgICAgICAgeSA9IF9TZWxlY3Rpb24kZ2V0U1ZHRXZlbjIueTtcblxuICAgIGlmICghYWxsb3dSZXNpemUgJiYgIWFsbG93RHJhZyB8fCBtb3VzZU1vdmVUaHJlc2hvbGQgPiAwICYmICF0aGlzLmhhc01vdmVkKF9vYmplY3RTcHJlYWQoe30sIHRhcmdldFByb3BzLCB7XG4gICAgICB4MjogeCxcbiAgICAgIHkyOiB5XG4gICAgfSkpKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgaWYgKGFsbG93RHJhZyAmJiBpc1Bhbm5pbmcpIHtcbiAgICAgIHZhciBzdGFydFggPSB0YXJnZXRQcm9wcy5zdGFydFgsXG4gICAgICAgICAgc3RhcnRZID0gdGFyZ2V0UHJvcHMuc3RhcnRZO1xuICAgICAgdmFyIHBhbm5lZEJveCA9IHRoaXMucGFuQm94KHRhcmdldFByb3BzLCB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHlcbiAgICAgIH0pO1xuICAgICAgdmFyIGNvbnN0cmFpbmVkQm94ID0gdGhpcy5jb25zdHJhaW5Cb3gocGFubmVkQm94LCBmdWxsRG9tYWluQm94KTtcbiAgICAgIHZhciBjdXJyZW50RG9tYWluID0gU2VsZWN0aW9uLmdldEJvdW5kcyhfb2JqZWN0U3ByZWFkKHt9LCBjb25zdHJhaW5lZEJveCwge1xuICAgICAgICBzY2FsZTogc2NhbGUsXG4gICAgICAgIGhvcml6b250YWw6IGhvcml6b250YWxcbiAgICAgIH0pKTtcblxuICAgICAgdmFyIG11dGF0ZWRQcm9wcyA9IF9vYmplY3RTcHJlYWQoe1xuICAgICAgICBjdXJyZW50RG9tYWluOiBjdXJyZW50RG9tYWluLFxuICAgICAgICBwYXJlbnRTVkc6IHBhcmVudFNWRyxcbiAgICAgICAgc3RhcnRYOiBwYW5uZWRCb3gueDIgPj0gZnVsbERvbWFpbkJveC54MiB8fCBwYW5uZWRCb3gueDEgPD0gZnVsbERvbWFpbkJveC54MSA/IHN0YXJ0WCA6IHgsXG4gICAgICAgIHN0YXJ0WTogcGFubmVkQm94LnkyID49IGZ1bGxEb21haW5Cb3gueTIgfHwgcGFubmVkQm94LnkxIDw9IGZ1bGxEb21haW5Cb3gueTEgPyBzdGFydFkgOiB5XG4gICAgICB9LCBjb25zdHJhaW5lZEJveCk7XG5cbiAgICAgIGlmIChfaXNGdW5jdGlvbihvbkJydXNoRG9tYWluQ2hhbmdlKSkge1xuICAgICAgICBvbkJydXNoRG9tYWluQ2hhbmdlKGN1cnJlbnREb21haW4sIF9kZWZhdWx0cyh7fSwgbXV0YXRlZFByb3BzLCB0YXJnZXRQcm9wcykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgdGFyZ2V0OiBcInBhcmVudFwiLFxuICAgICAgICBtdXRhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBtdXRhdGVkUHJvcHM7XG4gICAgICAgIH1cbiAgICAgIH1dO1xuICAgIH0gZWxzZSBpZiAoYWxsb3dSZXNpemUgJiYgaXNTZWxlY3RpbmcpIHtcbiAgICAgIHZhciBfY29uc3RyYWluUG9pbnQgPSB0aGlzLmNvbnN0cmFpblBvaW50KHtcbiAgICAgICAgeDogYnJ1c2hEaW1lbnNpb24gIT09IFwieVwiID8geCA6IHRhcmdldFByb3BzLngyLFxuICAgICAgICB5OiBicnVzaERpbWVuc2lvbiAhPT0gXCJ4XCIgPyB5IDogdGFyZ2V0UHJvcHMueTJcbiAgICAgIH0sIGZ1bGxEb21haW5Cb3gpLFxuICAgICAgICAgIHgyID0gX2NvbnN0cmFpblBvaW50LngsXG4gICAgICAgICAgeTIgPSBfY29uc3RyYWluUG9pbnQueTtcblxuICAgICAgdmFyIF9jdXJyZW50RG9tYWluID0gU2VsZWN0aW9uLmdldEJvdW5kcyh7XG4gICAgICAgIHgyOiB4MixcbiAgICAgICAgeTI6IHkyLFxuICAgICAgICB4MTogdGFyZ2V0UHJvcHMueDEsXG4gICAgICAgIHkxOiB0YXJnZXRQcm9wcy55MSxcbiAgICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgICBob3Jpem9udGFsOiBob3Jpem9udGFsXG4gICAgICB9KTtcblxuICAgICAgdmFyIF9tdXRhdGVkUHJvcHMgPSB7XG4gICAgICAgIHgyOiB4MixcbiAgICAgICAgeTI6IHkyLFxuICAgICAgICBjdXJyZW50RG9tYWluOiBfY3VycmVudERvbWFpbixcbiAgICAgICAgcGFyZW50U1ZHOiBwYXJlbnRTVkdcbiAgICAgIH07XG5cbiAgICAgIGlmIChfaXNGdW5jdGlvbihvbkJydXNoRG9tYWluQ2hhbmdlKSkge1xuICAgICAgICBvbkJydXNoRG9tYWluQ2hhbmdlKF9jdXJyZW50RG9tYWluLCBfZGVmYXVsdHMoe30sIF9tdXRhdGVkUHJvcHMsIHRhcmdldFByb3BzKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbe1xuICAgICAgICB0YXJnZXQ6IFwicGFyZW50XCIsXG4gICAgICAgIG11dGF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF9tdXRhdGVkUHJvcHM7XG4gICAgICAgIH1cbiAgICAgIH1dO1xuICAgIH1cblxuICAgIHJldHVybiB7fTtcbiAgfSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgb25HbG9iYWxNb3VzZVVwOiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcykge1xuICAgIC8vIGlmIGEgcGFubmluZyBvciBzZWxlY3Rpb24gaGFzIG5vdCBiZWVuIHN0YXJ0ZWQsIGlnbm9yZSB0aGUgZXZlbnRcbiAgICBpZiAoIXRhcmdldFByb3BzLmlzUGFubmluZyAmJiAhdGFyZ2V0UHJvcHMuaXNTZWxlY3RpbmcpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbWF4LXN0YXRlbWVudHMsIGNvbXBsZXhpdHlcblxuXG4gICAgdmFyIHgxID0gdGFyZ2V0UHJvcHMueDEsXG4gICAgICAgIHkxID0gdGFyZ2V0UHJvcHMueTEsXG4gICAgICAgIHgyID0gdGFyZ2V0UHJvcHMueDIsXG4gICAgICAgIHkyID0gdGFyZ2V0UHJvcHMueTIsXG4gICAgICAgIGlzUGFubmluZyA9IHRhcmdldFByb3BzLmlzUGFubmluZyxcbiAgICAgICAgaXNTZWxlY3RpbmcgPSB0YXJnZXRQcm9wcy5pc1NlbGVjdGluZyxcbiAgICAgICAgb25CcnVzaERvbWFpbkNoYW5nZSA9IHRhcmdldFByb3BzLm9uQnJ1c2hEb21haW5DaGFuZ2UsXG4gICAgICAgIG9uQnJ1c2hEb21haW5DaGFuZ2VFbmQgPSB0YXJnZXRQcm9wcy5vbkJydXNoRG9tYWluQ2hhbmdlRW5kLFxuICAgICAgICBvbkJydXNoQ2xlYXJlZCA9IHRhcmdldFByb3BzLm9uQnJ1c2hDbGVhcmVkLFxuICAgICAgICBjdXJyZW50RG9tYWluID0gdGFyZ2V0UHJvcHMuY3VycmVudERvbWFpbixcbiAgICAgICAgYWxsb3dSZXNpemUgPSB0YXJnZXRQcm9wcy5hbGxvd1Jlc2l6ZSxcbiAgICAgICAgYWxsb3dEcmFnID0gdGFyZ2V0UHJvcHMuYWxsb3dEcmFnO1xuICAgIHZhciBkZWZhdWx0QnJ1c2hBcmVhID0gIWFsbG93UmVzaXplICYmICF0YXJnZXRQcm9wcy5kZWZhdWx0QnJ1c2hBcmVhID8gXCJtb3ZlXCIgOiB0YXJnZXRQcm9wcy5kZWZhdWx0QnJ1c2hBcmVhO1xuICAgIHZhciBkZWZhdWx0QnJ1c2hIYXNBcmVhID0gZGVmYXVsdEJydXNoQXJlYSAhPT0gdW5kZWZpbmVkICYmIGRlZmF1bHRCcnVzaEFyZWEgIT09IFwibm9uZVwiO1xuICAgIHZhciBtdXRhdGVkUHJvcHMgPSB7XG4gICAgICBpc1Bhbm5pbmc6IGZhbHNlLFxuICAgICAgaXNTZWxlY3Rpbmc6IGZhbHNlXG4gICAgfTsgLy8gaWYgdGhlIG1vdXNlIGhhc24ndCBtb3ZlZCBzaW5jZSBhIG1vdXNlRG93biBldmVudCwgc2VsZWN0IHRoZSBkZWZhdWx0IGJydXNoIGFyZWFcblxuICAgIGlmICgoYWxsb3dSZXNpemUgfHwgZGVmYXVsdEJydXNoSGFzQXJlYSkgJiYgKHgxID09PSB4MiB8fCB5MSA9PT0geTIpKSB7XG4gICAgICB2YXIgY2FjaGVkRG9tYWluID0gdGFyZ2V0UHJvcHMuY2FjaGVkQ3VycmVudERvbWFpbiB8fCBjdXJyZW50RG9tYWluO1xuICAgICAgdmFyIGRlZmF1bHREb21haW4gPSB0aGlzLmdldERlZmF1bHRCcnVzaEFyZWEodGFyZ2V0UHJvcHMsIGNhY2hlZERvbWFpbiwgZXZ0KTtcbiAgICAgIG11dGF0ZWRQcm9wcy5jdXJyZW50RG9tYWluID0gZGVmYXVsdERvbWFpbjtcblxuICAgICAgaWYgKF9pc0Z1bmN0aW9uKG9uQnJ1c2hEb21haW5DaGFuZ2UpKSB7XG4gICAgICAgIG9uQnJ1c2hEb21haW5DaGFuZ2UoZGVmYXVsdERvbWFpbiwgX2RlZmF1bHRzKHt9LCBtdXRhdGVkUHJvcHMsIHRhcmdldFByb3BzKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfaXNGdW5jdGlvbihvbkJydXNoRG9tYWluQ2hhbmdlRW5kKSkge1xuICAgICAgICBvbkJydXNoRG9tYWluQ2hhbmdlRW5kKGRlZmF1bHREb21haW4sIF9kZWZhdWx0cyh7fSwgbXV0YXRlZFByb3BzLCB0YXJnZXRQcm9wcykpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX2lzRnVuY3Rpb24ob25CcnVzaENsZWFyZWQpKSB7XG4gICAgICAgIG9uQnJ1c2hDbGVhcmVkKGRlZmF1bHREb21haW4sIF9kZWZhdWx0cyh7fSwgbXV0YXRlZFByb3BzLCB0YXJnZXRQcm9wcykpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWxsb3dEcmFnICYmIGlzUGFubmluZyB8fCBhbGxvd1Jlc2l6ZSAmJiBpc1NlbGVjdGluZykge1xuICAgICAgaWYgKF9pc0Z1bmN0aW9uKG9uQnJ1c2hEb21haW5DaGFuZ2VFbmQpKSB7XG4gICAgICAgIG9uQnJ1c2hEb21haW5DaGFuZ2VFbmQoY3VycmVudERvbWFpbiwgX2RlZmF1bHRzKHt9LCBtdXRhdGVkUHJvcHMsIHRhcmdldFByb3BzKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFt7XG4gICAgICB0YXJnZXQ6IFwicGFyZW50XCIsXG4gICAgICBtdXRhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbXV0YXRlZFByb3BzO1xuICAgICAgfVxuICAgIH1dO1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgX29iamVjdFNwcmVhZCh7fSwgSGVscGVycywge1xuICBvbk1vdXNlRG93bjogSGVscGVycy5vbk1vdXNlRG93bi5iaW5kKEhlbHBlcnMpLFxuICBvbkdsb2JhbE1vdXNlVXA6IEhlbHBlcnMub25HbG9iYWxNb3VzZVVwLmJpbmQoSGVscGVycyksXG4gIG9uR2xvYmFsTW91c2VNb3ZlOiBfdGhyb3R0bGUoSGVscGVycy5vbkdsb2JhbE1vdXNlTW92ZS5iaW5kKEhlbHBlcnMpLCAxNiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gIHtcbiAgICBsZWFkaW5nOiB0cnVlLFxuICAgIHRyYWlsaW5nOiBmYWxzZVxuICB9KVxufSk7IiwiaW1wb3J0IF9kZWZhdWx0cyBmcm9tIFwibG9kYXNoL2RlZmF1bHRzXCI7XG5pbXBvcnQgX2Fzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHsgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTsgfSkpOyB9IG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgVmljdG9yeUNvbnRhaW5lciwgU2VsZWN0aW9uLCBSZWN0IH0gZnJvbSBcInZpY3RvcnktY29yZVwiO1xuaW1wb3J0IEJydXNoSGVscGVycyBmcm9tIFwiLi9icnVzaC1oZWxwZXJzXCI7XG5pbXBvcnQgaXNFcXVhbCBmcm9tIFwicmVhY3QtZmFzdC1jb21wYXJlXCI7XG5leHBvcnQgdmFyIGJydXNoQ29udGFpbmVyTWl4aW4gPSBmdW5jdGlvbiAoYmFzZSkge1xuICB2YXIgX2NsYXNzLCBfdGVtcDtcblxuICByZXR1cm4gX3RlbXAgPSBfY2xhc3MgPVxuICAvKiNfX1BVUkVfXyovXG4gIGZ1bmN0aW9uIChfYmFzZSkge1xuICAgIF9pbmhlcml0cyhWaWN0b3J5QnJ1c2hDb250YWluZXIsIF9iYXNlKTtcblxuICAgIGZ1bmN0aW9uIFZpY3RvcnlCcnVzaENvbnRhaW5lcigpIHtcbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBWaWN0b3J5QnJ1c2hDb250YWluZXIpO1xuXG4gICAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKFZpY3RvcnlCcnVzaENvbnRhaW5lci5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFZpY3RvcnlCcnVzaENvbnRhaW5lcikpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhWaWN0b3J5QnJ1c2hDb250YWluZXIsIFt7XG4gICAgICBrZXk6IFwiZ2V0U2VsZWN0Qm94XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2VsZWN0Qm94KHByb3BzLCBjb29yZGluYXRlcykge1xuICAgICAgICB2YXIgeCA9IGNvb3JkaW5hdGVzLngsXG4gICAgICAgICAgICB5ID0gY29vcmRpbmF0ZXMueTtcbiAgICAgICAgdmFyIGJydXNoU3R5bGUgPSBwcm9wcy5icnVzaFN0eWxlLFxuICAgICAgICAgICAgYnJ1c2hDb21wb25lbnQgPSBwcm9wcy5icnVzaENvbXBvbmVudCxcbiAgICAgICAgICAgIG5hbWUgPSBwcm9wcy5uYW1lO1xuICAgICAgICB2YXIgYnJ1c2hDb21wb25lbnRTdHlsZSA9IGJydXNoQ29tcG9uZW50LnByb3BzICYmIGJydXNoQ29tcG9uZW50LnByb3BzLnN0eWxlO1xuICAgICAgICB2YXIgY3Vyc29yID0gIXByb3BzLmFsbG93RHJhZyAmJiAhcHJvcHMuYWxsb3dSZXNpemUgPyBcImF1dG9cIiA6IFwibW92ZVwiO1xuICAgICAgICByZXR1cm4geFswXSAhPT0geFsxXSAmJiB5WzBdICE9PSB5WzFdID8gUmVhY3QuY2xvbmVFbGVtZW50KGJydXNoQ29tcG9uZW50LCB7XG4gICAgICAgICAga2V5OiBcIlwiLmNvbmNhdChuYW1lLCBcIi1icnVzaFwiKSxcbiAgICAgICAgICB3aWR0aDogTWF0aC5hYnMoeFsxXSAtIHhbMF0pIHx8IDEsXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyh5WzFdIC0geVswXSkgfHwgMSxcbiAgICAgICAgICB4OiBNYXRoLm1pbih4WzBdLCB4WzFdKSxcbiAgICAgICAgICB5OiBNYXRoLm1pbih5WzBdLCB5WzFdKSxcbiAgICAgICAgICBjdXJzb3I6IGN1cnNvcixcbiAgICAgICAgICBzdHlsZTogX2RlZmF1bHRzKHt9LCBicnVzaENvbXBvbmVudFN0eWxlLCBicnVzaFN0eWxlKVxuICAgICAgICB9KSA6IG51bGw7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImdldEN1cnNvclBvaW50ZXJzXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3Vyc29yUG9pbnRlcnMocHJvcHMpIHtcbiAgICAgICAgdmFyIGN1cnNvcnMgPSB7XG4gICAgICAgICAgeVByb3BzOiBcIm5zLXJlc2l6ZVwiLFxuICAgICAgICAgIHhQcm9wczogXCJldy1yZXNpemVcIlxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghcHJvcHMuYWxsb3dSZXNpemUgJiYgcHJvcHMuYWxsb3dEcmFnKSB7XG4gICAgICAgICAgY3Vyc29ycy54UHJvcHMgPSBcIm1vdmVcIjtcbiAgICAgICAgICBjdXJzb3JzLnlQcm9wcyA9IFwibW92ZVwiO1xuICAgICAgICB9IGVsc2UgaWYgKCFwcm9wcy5hbGxvd1Jlc2l6ZSAmJiAhcHJvcHMuYWxsb3dEcmFnKSB7XG4gICAgICAgICAgY3Vyc29ycy54UHJvcHMgPSBcImF1dG9cIjtcbiAgICAgICAgICBjdXJzb3JzLnlQcm9wcyA9IFwiYXV0b1wiO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnNvcnM7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImdldEhhbmRsZXNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRIYW5kbGVzKHByb3BzLCBkb21haW4pIHtcbiAgICAgICAgdmFyIGhhbmRsZVdpZHRoID0gcHJvcHMuaGFuZGxlV2lkdGgsXG4gICAgICAgICAgICBoYW5kbGVTdHlsZSA9IHByb3BzLmhhbmRsZVN0eWxlLFxuICAgICAgICAgICAgaGFuZGxlQ29tcG9uZW50ID0gcHJvcHMuaGFuZGxlQ29tcG9uZW50LFxuICAgICAgICAgICAgbmFtZSA9IHByb3BzLm5hbWU7XG4gICAgICAgIHZhciBkb21haW5Cb3ggPSBCcnVzaEhlbHBlcnMuZ2V0RG9tYWluQm94KHByb3BzLCBkb21haW4pO1xuICAgICAgICB2YXIgeDEgPSBkb21haW5Cb3gueDEsXG4gICAgICAgICAgICB4MiA9IGRvbWFpbkJveC54MixcbiAgICAgICAgICAgIHkxID0gZG9tYWluQm94LnkxLFxuICAgICAgICAgICAgeTIgPSBkb21haW5Cb3gueTI7XG5cbiAgICAgICAgdmFyIF9CcnVzaEhlbHBlcnMkZ2V0SGFuZCA9IEJydXNoSGVscGVycy5nZXRIYW5kbGVzKHByb3BzLCBkb21haW5Cb3gpLFxuICAgICAgICAgICAgdG9wID0gX0JydXNoSGVscGVycyRnZXRIYW5kLnRvcCxcbiAgICAgICAgICAgIGJvdHRvbSA9IF9CcnVzaEhlbHBlcnMkZ2V0SGFuZC5ib3R0b20sXG4gICAgICAgICAgICBsZWZ0ID0gX0JydXNoSGVscGVycyRnZXRIYW5kLmxlZnQsXG4gICAgICAgICAgICByaWdodCA9IF9CcnVzaEhlbHBlcnMkZ2V0SGFuZC5yaWdodDtcblxuICAgICAgICB2YXIgd2lkdGggPSBNYXRoLmFicyh4MiAtIHgxKSB8fCAxO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gTWF0aC5hYnMoeTIgLSB5MSkgfHwgMTtcbiAgICAgICAgdmFyIGhhbmRsZUNvbXBvbmVudFN0eWxlID0gaGFuZGxlQ29tcG9uZW50LnByb3BzICYmIGhhbmRsZUNvbXBvbmVudC5wcm9wcy5zdHlsZSB8fCB7fTtcblxuICAgICAgICB2YXIgc3R5bGUgPSBfZGVmYXVsdHMoe30sIGhhbmRsZUNvbXBvbmVudFN0eWxlLCBoYW5kbGVTdHlsZSk7XG5cbiAgICAgICAgdmFyIGN1cnNvcnMgPSB0aGlzLmdldEN1cnNvclBvaW50ZXJzKHByb3BzKTtcbiAgICAgICAgdmFyIHlQcm9wcyA9IHtcbiAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgIGhlaWdodDogaGFuZGxlV2lkdGgsXG4gICAgICAgICAgY3Vyc29yOiBjdXJzb3JzLnlQcm9wc1xuICAgICAgICB9O1xuICAgICAgICB2YXIgeFByb3BzID0ge1xuICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICB3aWR0aDogaGFuZGxlV2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgY3Vyc29yOiBjdXJzb3JzLnhQcm9wc1xuICAgICAgICB9O1xuICAgICAgICB2YXIgaGFuZGxlUHJvcHMgPSB7XG4gICAgICAgICAgdG9wOiB0b3AgJiYgX2Fzc2lnbih7XG4gICAgICAgICAgICB4OiB0b3AueDEsXG4gICAgICAgICAgICB5OiB0b3AueTFcbiAgICAgICAgICB9LCB5UHJvcHMpLFxuICAgICAgICAgIGJvdHRvbTogYm90dG9tICYmIF9hc3NpZ24oe1xuICAgICAgICAgICAgeDogYm90dG9tLngxLFxuICAgICAgICAgICAgeTogYm90dG9tLnkxXG4gICAgICAgICAgfSwgeVByb3BzKSxcbiAgICAgICAgICBsZWZ0OiBsZWZ0ICYmIF9hc3NpZ24oe1xuICAgICAgICAgICAgeTogbGVmdC55MSxcbiAgICAgICAgICAgIHg6IGxlZnQueDFcbiAgICAgICAgICB9LCB4UHJvcHMpLFxuICAgICAgICAgIHJpZ2h0OiByaWdodCAmJiBfYXNzaWduKHtcbiAgICAgICAgICAgIHk6IHJpZ2h0LnkxLFxuICAgICAgICAgICAgeDogcmlnaHQueDFcbiAgICAgICAgICB9LCB4UHJvcHMpXG4gICAgICAgIH07XG4gICAgICAgIHZhciBoYW5kbGVzID0gW1widG9wXCIsIFwiYm90dG9tXCIsIFwibGVmdFwiLCBcInJpZ2h0XCJdLnJlZHVjZShmdW5jdGlvbiAobWVtbywgY3Vycikge1xuICAgICAgICAgIG1lbW8gPSBoYW5kbGVQcm9wc1tjdXJyXSA/IG1lbW8uY29uY2F0KFJlYWN0LmNsb25lRWxlbWVudChoYW5kbGVDb21wb25lbnQsIF9hc3NpZ24oe1xuICAgICAgICAgICAga2V5OiBcIlwiLmNvbmNhdChuYW1lLCBcIi1oYW5kbGUtXCIpLmNvbmNhdChjdXJyKVxuICAgICAgICAgIH0sIGhhbmRsZVByb3BzW2N1cnJdKSkpIDogbWVtbztcbiAgICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgICAgfSwgW10pO1xuICAgICAgICByZXR1cm4gaGFuZGxlcy5sZW5ndGggPyBoYW5kbGVzIDogbnVsbDtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiZ2V0UmVjdFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJlY3QocHJvcHMpIHtcbiAgICAgICAgdmFyIGN1cnJlbnREb21haW4gPSBwcm9wcy5jdXJyZW50RG9tYWluLFxuICAgICAgICAgICAgY2FjaGVkQnJ1c2hEb21haW4gPSBwcm9wcy5jYWNoZWRCcnVzaERvbWFpbjtcblxuICAgICAgICB2YXIgYnJ1c2hEb21haW4gPSBfZGVmYXVsdHMoe30sIHByb3BzLmJydXNoRG9tYWluLCBwcm9wcy5kb21haW4pO1xuXG4gICAgICAgIHZhciBkb21haW4gPSBpc0VxdWFsKGJydXNoRG9tYWluLCBjYWNoZWRCcnVzaERvbWFpbikgPyBfZGVmYXVsdHMoe30sIGN1cnJlbnREb21haW4sIGJydXNoRG9tYWluKSA6IGJydXNoRG9tYWluO1xuICAgICAgICB2YXIgY29vcmRpbmF0ZXMgPSBTZWxlY3Rpb24uZ2V0RG9tYWluQ29vcmRpbmF0ZXMocHJvcHMsIGRvbWFpbik7XG4gICAgICAgIHZhciBzZWxlY3RCb3ggPSB0aGlzLmdldFNlbGVjdEJveChwcm9wcywgY29vcmRpbmF0ZXMpO1xuICAgICAgICByZXR1cm4gc2VsZWN0Qm94ID8gW3NlbGVjdEJveCwgdGhpcy5nZXRIYW5kbGVzKHByb3BzLCBkb21haW4pXSA6IFtdO1xuICAgICAgfSAvLyBPdmVycmlkZXMgbWV0aG9kIGluIFZpY3RvcnlDb250YWluZXJcblxuICAgIH0sIHtcbiAgICAgIGtleTogXCJnZXRDaGlsZHJlblwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldENoaWxkcmVuKHByb3BzKSB7XG4gICAgICAgIHJldHVybiBfdG9Db25zdW1hYmxlQXJyYXkoUmVhY3QuQ2hpbGRyZW4udG9BcnJheShwcm9wcy5jaGlsZHJlbikpLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkodGhpcy5nZXRSZWN0KHByb3BzKSkpO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBWaWN0b3J5QnJ1c2hDb250YWluZXI7XG4gIH0oYmFzZSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwiZGlzcGxheU5hbWVcIiwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiBcIlZpY3RvcnlCcnVzaENvbnRhaW5lclwiXG4gIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcInByb3BUeXBlc1wiLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IF9vYmplY3RTcHJlYWQoe30sIFZpY3RvcnlDb250YWluZXIucHJvcFR5cGVzLCB7XG4gICAgICBhbGxvd0RyYWc6IFByb3BUeXBlcy5ib29sLFxuICAgICAgYWxsb3dEcmF3OiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGFsbG93UmVzaXplOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGJydXNoQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgICAgIGJydXNoRGltZW5zaW9uOiBQcm9wVHlwZXMub25lT2YoW1wieFwiLCBcInlcIl0pLFxuICAgICAgYnJ1c2hEb21haW46IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIHg6IFByb3BUeXBlcy5hcnJheSxcbiAgICAgICAgeTogUHJvcFR5cGVzLmFycmF5XG4gICAgICB9KSxcbiAgICAgIGJydXNoU3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICBkZWZhdWx0QnJ1c2hBcmVhOiBQcm9wVHlwZXMub25lT2YoW1wiYWxsXCIsIFwiZGlzYWJsZVwiLCBcIm5vbmVcIiwgXCJtb3ZlXCJdKSxcbiAgICAgIGRpc2FibGU6IFByb3BUeXBlcy5ib29sLFxuICAgICAgaGFuZGxlQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcbiAgICAgIGhhbmRsZVN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgaGFuZGxlV2lkdGg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICBvbkJydXNoQ2xlYXJlZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBvbkJydXNoRG9tYWluQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIG9uQnJ1c2hEb21haW5DaGFuZ2VFbmQ6IFByb3BUeXBlcy5mdW5jXG4gICAgfSlcbiAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwiZGVmYXVsdFByb3BzXCIsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogX29iamVjdFNwcmVhZCh7fSwgVmljdG9yeUNvbnRhaW5lci5kZWZhdWx0UHJvcHMsIHtcbiAgICAgIGFsbG93RHJhZzogdHJ1ZSxcbiAgICAgIGFsbG93RHJhdzogdHJ1ZSxcbiAgICAgIGFsbG93UmVzaXplOiB0cnVlLFxuICAgICAgYnJ1c2hDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVjdCwgbnVsbCksXG4gICAgICBicnVzaFN0eWxlOiB7XG4gICAgICAgIHN0cm9rZTogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBmaWxsOiBcImJsYWNrXCIsXG4gICAgICAgIGZpbGxPcGFjaXR5OiAwLjFcbiAgICAgIH0sXG4gICAgICBoYW5kbGVDb21wb25lbnQ6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVjdCwgbnVsbCksXG4gICAgICBoYW5kbGVTdHlsZToge1xuICAgICAgICBzdHJva2U6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgZmlsbDogXCJ0cmFuc3BhcmVudFwiXG4gICAgICB9LFxuICAgICAgaGFuZGxlV2lkdGg6IDgsXG4gICAgICBtb3VzZU1vdmVUaHJlc2hvbGQ6IDBcbiAgICB9KVxuICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzcywgXCJkZWZhdWx0RXZlbnRzXCIsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICByZXR1cm4gW3tcbiAgICAgICAgdGFyZ2V0OiBcInBhcmVudFwiLFxuICAgICAgICBldmVudEhhbmRsZXJzOiB7XG4gICAgICAgICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIChldnQsIHRhcmdldFByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHMuZGlzYWJsZSA/IHt9IDogQnJ1c2hIZWxwZXJzLm9uTW91c2VEb3duKGV2dCwgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Ub3VjaFN0YXJ0OiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzLmRpc2FibGUgPyB7fSA6IEJydXNoSGVscGVycy5vbk1vdXNlRG93bihldnQsIHRhcmdldFByb3BzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uR2xvYmFsTW91c2VNb3ZlOiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzLmRpc2FibGUgfHwgIXRhcmdldFByb3BzLmlzUGFubmluZyAmJiAhdGFyZ2V0UHJvcHMuaXNTZWxlY3RpbmcgPyB7fSA6IEJydXNoSGVscGVycy5vbkdsb2JhbE1vdXNlTW92ZShldnQsIHRhcmdldFByb3BzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uR2xvYmFsVG91Y2hNb3ZlOiBmdW5jdGlvbiAoZXZ0LCB0YXJnZXRQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzLmRpc2FibGUgfHwgIXRhcmdldFByb3BzLmlzUGFubmluZyAmJiAhdGFyZ2V0UHJvcHMuaXNTZWxlY3RpbmcgPyB7fSA6IEJydXNoSGVscGVycy5vbkdsb2JhbE1vdXNlTW92ZShldnQsIHRhcmdldFByb3BzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uR2xvYmFsTW91c2VVcDogZnVuY3Rpb24gKGV2dCwgdGFyZ2V0UHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5kaXNhYmxlID8ge30gOiBCcnVzaEhlbHBlcnMub25HbG9iYWxNb3VzZVVwKGV2dCwgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25HbG9iYWxUb3VjaEVuZDogZnVuY3Rpb24gKGV2dCwgdGFyZ2V0UHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5kaXNhYmxlID8ge30gOiBCcnVzaEhlbHBlcnMub25HbG9iYWxNb3VzZVVwKGV2dCwgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25HbG9iYWxUb3VjaENhbmNlbDogZnVuY3Rpb24gKGV2dCwgdGFyZ2V0UHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5kaXNhYmxlID8ge30gOiBCcnVzaEhlbHBlcnMub25HbG9iYWxNb3VzZVVwKGV2dCwgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfV07XG4gICAgfVxuICB9KSwgX3RlbXA7XG59O1xuZXhwb3J0IGRlZmF1bHQgYnJ1c2hDb250YWluZXJNaXhpbihWaWN0b3J5Q29udGFpbmVyKTsiLCJpbXBvcnQgX2tleXMgZnJvbSBcImxvZGFzaC9rZXlzXCI7XG5pbXBvcnQgX2lzRnVuY3Rpb24gZnJvbSBcImxvZGFzaC9pc0Z1bmN0aW9uXCI7XG5pbXBvcnQgX2lzRW1wdHkgZnJvbSBcImxvZGFzaC9pc0VtcHR5XCI7XG5pbXBvcnQgX2Zsb3cgZnJvbSBcImxvZGFzaC9mbG93XCI7XG5pbXBvcnQgX2luY2x1ZGVzIGZyb20gXCJsb2Rhc2gvaW5jbHVkZXNcIjtcbmltcG9ydCBfZm9yT3duIGZyb20gXCJsb2Rhc2gvZm9yT3duXCI7XG5pbXBvcnQgX2dyb3VwQnkgZnJvbSBcImxvZGFzaC9ncm91cEJ5XCI7XG5pbXBvcnQgX3RvUGFpcnMgZnJvbSBcImxvZGFzaC90b1BhaXJzXCI7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykgeyBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlOyB9KSk7IH0gb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuaW1wb3J0IHsgVmljdG9yeUNvbnRhaW5lciwgTG9nIH0gZnJvbSBcInZpY3RvcnktY29yZVwiO1xuaW1wb3J0IHsgdm9yb25vaUNvbnRhaW5lck1peGluIH0gZnJvbSBcInZpY3Rvcnktdm9yb25vaS1jb250YWluZXJcIjtcbmltcG9ydCB7IHpvb21Db250YWluZXJNaXhpbiB9IGZyb20gXCJ2aWN0b3J5LXpvb20tY29udGFpbmVyXCI7XG5pbXBvcnQgeyBzZWxlY3Rpb25Db250YWluZXJNaXhpbiB9IGZyb20gXCJ2aWN0b3J5LXNlbGVjdGlvbi1jb250YWluZXJcIjtcbmltcG9ydCB7IGJydXNoQ29udGFpbmVyTWl4aW4gfSBmcm9tIFwidmljdG9yeS1icnVzaC1jb250YWluZXJcIjtcbmltcG9ydCB7IGN1cnNvckNvbnRhaW5lck1peGluIH0gZnJvbSBcInZpY3RvcnktY3Vyc29yLWNvbnRhaW5lclwiO1xuXG52YXIgZW5zdXJlQXJyYXkgPSBmdW5jdGlvbiAodGhpbmcpIHtcbiAgaWYgKCF0aGluZykge1xuICAgIHJldHVybiBbXTtcbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheSh0aGluZykpIHtcbiAgICByZXR1cm4gW3RoaW5nXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpbmc7XG4gIH1cbn07XG5cbnZhciBjb21iaW5lRXZlbnRIYW5kbGVycyA9IGZ1bmN0aW9uIChldmVudEhhbmRsZXJzQXJyYXkpIHtcbiAgLy8gdGFrZXMgYW4gYXJyYXkgb2YgZXZlbnQgaGFuZGxlciBvYmplY3RzIGFuZCBwcm9kdWNlcyBvbmUgZXZlbnRIYW5kbGVycyBvYmplY3RcbiAgLy8gY3JlYXRlcyBhIGN1c3RvbSBjb21iaW5lZEhhbmRsZXIoKSBmb3IgZXZlbnRzIHdpdGggbXVsdGlwbGUgY29uZmxpY3RpbmcgaGFuZGxlcnNcbiAgcmV0dXJuIGV2ZW50SGFuZGxlcnNBcnJheS5yZWR1Y2UoZnVuY3Rpb24gKGxvY2FsSGFuZGxlcnMsIGZpbmFsSGFuZGxlcnMpIHtcbiAgICBfZm9yT3duKGxvY2FsSGFuZGxlcnMsIGZ1bmN0aW9uIChsb2NhbEhhbmRsZXIsIGV2ZW50TmFtZSkge1xuICAgICAgdmFyIGV4aXN0aW5nSGFuZGxlciA9IGZpbmFsSGFuZGxlcnNbZXZlbnROYW1lXTtcblxuICAgICAgaWYgKGV4aXN0aW5nSGFuZGxlcikge1xuICAgICAgICAvLyBjcmVhdGUgbmV3IGhhbmRsZXIgZm9yIGV2ZW50IHRoYXQgY29uY2F0cyB0aGUgZXhpc3RpbmcgaGFuZGxlcidzIG11dGF0aW9ucyB3aXRoIG5ldyBvbmVzXG4gICAgICAgIGZpbmFsSGFuZGxlcnNbZXZlbnROYW1lXSA9IGZ1bmN0aW9uIGNvbWJpbmVkSGFuZGxlcigpIHtcbiAgICAgICAgICAvLyBuYW1lZCBmb3IgZGVidWcgY2xhcml0eVxuICAgICAgICAgIC8vIHNvbWV0aW1lcyBoYW5kbGVycyByZXR1cm4gdW5kZWZpbmVkOyB1c2UgZW1wdHkgYXJyYXkgaW5zdGVhZCwgZm9yIGNvbmNhdCgpXG4gICAgICAgICAgdmFyIGV4aXN0aW5nTXV0YXRpb25zID0gZW5zdXJlQXJyYXkoZXhpc3RpbmdIYW5kbGVyLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKSk7XG4gICAgICAgICAgdmFyIGxvY2FsTXV0YXRpb25zID0gZW5zdXJlQXJyYXkobG9jYWxIYW5kbGVyLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKSk7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nTXV0YXRpb25zLmNvbmNhdChsb2NhbE11dGF0aW9ucyk7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaW5hbEhhbmRsZXJzW2V2ZW50TmFtZV0gPSBsb2NhbEhhbmRsZXI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmluYWxIYW5kbGVycztcbiAgfSk7XG59O1xuXG52YXIgY29tYmluZURlZmF1bHRFdmVudHMgPSBmdW5jdGlvbiAoZGVmYXVsdEV2ZW50cykge1xuICAvLyB0YWtlcyBhIGRlZmF1bHRFdmVudHMgYXJyYXkgYW5kIHJldHVybnMgb25lIGVxdWFsIG9yIGxlc3NlciBsZW5ndGgsXG4gIC8vIGJ5IGNvbWJpbmluZyBhbnkgZXZlbnRzIHRoYXQgaGF2ZSB0aGUgc2FtZSB0YXJnZXRcbiAgdmFyIGV2ZW50c0J5VGFyZ2V0ID0gX2dyb3VwQnkoZGVmYXVsdEV2ZW50cywgXCJ0YXJnZXRcIik7XG5cbiAgdmFyIGV2ZW50cyA9IF90b1BhaXJzKGV2ZW50c0J5VGFyZ2V0KS5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKSxcbiAgICAgICAgdGFyZ2V0ID0gX3JlZjJbMF0sXG4gICAgICAgIGV2ZW50c0FycmF5ID0gX3JlZjJbMV07XG5cbiAgICBldmVudHNBcnJheSA9IGV2ZW50c0FycmF5LmZpbHRlcihCb29sZWFuKTtcbiAgICByZXR1cm4gX2lzRW1wdHkoZXZlbnRzQXJyYXkpID8gbnVsbCA6IHtcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgZXZlbnRIYW5kbGVyczogY29tYmluZUV2ZW50SGFuZGxlcnMoZXZlbnRzQXJyYXkubWFwKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICByZXR1cm4gZXZlbnQuZXZlbnRIYW5kbGVycztcbiAgICAgIH0pKSAvLyBub3RlOiBkb2VzIG5vdCBjdXJyZW50bHkgaGFuZGxlIGV2ZW50S2V5IG9yIGNoaWxkTmFtZVxuXG4gICAgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIGV2ZW50cy5maWx0ZXIoQm9vbGVhbik7XG59O1xuXG52YXIgY29tYmluZUNvbnRhaW5lck1peGlucyA9IGZ1bmN0aW9uIChtaXhpbnMsIENvbnRhaW5lcikge1xuICB2YXIgX2NsYXNzLCBfdGVtcDtcblxuICAvLyBzaW1pbGFyIHRvIE9iamVjdC5hc3NpZ24oQSwgQiksIHRoaXMgZnVuY3Rpb24gd2lsbCBkZWNpZGUgY29uZmxpY3RzIGluIGZhdm9yIG1peGluQi5cbiAgLy8gdGhpcyBhcHBsaWVzIHRvIHByb3BUeXBlcyBhbmQgZGVmYXVsdFByb3BzLlxuICAvLyBnZXRDaGlsZHJlbiB3aWxsIGNhbGwgQSdzIGdldENoaWxkcmVuKCkgYW5kIHBhc3MgdGhlIHJlc3VsdGluZyBjaGlsZHJlbiB0byBCJ3MuXG4gIC8vIGRlZmF1bHRFdmVudHMgYXR0ZW1wdHMgdG8gcmVzb2x2ZSBhbnkgY29uZmxpY3RzIGJldHdlZW4gQSBhbmQgQidzIGRlZmF1bHRFdmVudHMuXG4gIHZhciBDbGFzc2VzID0gbWl4aW5zLm1hcChmdW5jdGlvbiAobWl4aW4pIHtcbiAgICByZXR1cm4gbWl4aW4oQ29udGFpbmVyKTtcbiAgfSk7XG4gIHZhciBpbnN0YW5jZXMgPSBDbGFzc2VzLm1hcChmdW5jdGlvbiAoQ2xhc3MpIHtcbiAgICByZXR1cm4gbmV3IENsYXNzKCk7XG4gIH0pO1xuXG4gIHZhciBOYWl2ZUNvbWJpbmVkQ29udGFpbmVyID0gX2Zsb3cobWl4aW5zKShDb250YWluZXIpO1xuXG4gIHZhciBkaXNwbGF5VHlwZSA9IENsYXNzZXMubWFwKGZ1bmN0aW9uIChDbGFzcykge1xuICAgIHZhciBtYXRjaCA9IENsYXNzLmRpc3BsYXlOYW1lLm1hdGNoKC9WaWN0b3J5KC4qKUNvbnRhaW5lci8pO1xuICAgIHJldHVybiBtYXRjaFsxXSB8fCBcIlwiO1xuICB9KS5qb2luKFwiXCIpO1xuICByZXR1cm4gX3RlbXAgPSBfY2xhc3MgPVxuICAvKiNfX1BVUkVfXyovXG4gIGZ1bmN0aW9uIChfTmFpdmVDb21iaW5lZENvbnRhaW4pIHtcbiAgICBfaW5oZXJpdHMoVmljdG9yeUNvbWJpbmVkQ29udGFpbmVyLCBfTmFpdmVDb21iaW5lZENvbnRhaW4pO1xuXG4gICAgZnVuY3Rpb24gVmljdG9yeUNvbWJpbmVkQ29udGFpbmVyKCkge1xuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFZpY3RvcnlDb21iaW5lZENvbnRhaW5lcik7XG5cbiAgICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoVmljdG9yeUNvbWJpbmVkQ29udGFpbmVyLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoVmljdG9yeUNvbWJpbmVkQ29udGFpbmVyKSkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKFZpY3RvcnlDb21iaW5lZENvbnRhaW5lciwgW3tcbiAgICAgIGtleTogXCJnZXRDaGlsZHJlblwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldENoaWxkcmVuKHByb3BzKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZXMucmVkdWNlKGZ1bmN0aW9uIChjaGlsZHJlbiwgaW5zdGFuY2UpIHtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuZ2V0Q2hpbGRyZW4oX29iamVjdFNwcmVhZCh7fSwgcHJvcHMsIHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSwgcHJvcHMuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBWaWN0b3J5Q29tYmluZWRDb250YWluZXI7XG4gIH0oTmFpdmVDb21iaW5lZENvbnRhaW5lciksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwiZGlzcGxheU5hbWVcIiwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiBcIlZpY3RvcnlcIi5jb25jYXQoZGlzcGxheVR5cGUsIFwiQ29udGFpbmVyXCIpXG4gIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcInByb3BUeXBlc1wiLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IENsYXNzZXMucmVkdWNlKGZ1bmN0aW9uIChwcm9wVHlwZXMsIENsYXNzKSB7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgcHJvcFR5cGVzLCBDbGFzcy5wcm9wVHlwZXMpO1xuICAgIH0sIHt9KVxuICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9jbGFzcywgXCJkZWZhdWx0UHJvcHNcIiwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiBDbGFzc2VzLnJlZHVjZShmdW5jdGlvbiAoZGVmYXVsdFByb3BzLCBDbGFzcykge1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRQcm9wcywgQ2xhc3MuZGVmYXVsdFByb3BzKTtcbiAgICB9LCB7fSlcbiAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwiZGVmYXVsdEV2ZW50c1wiLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgcmV0dXJuIGNvbWJpbmVEZWZhdWx0RXZlbnRzKENsYXNzZXMucmVkdWNlKGZ1bmN0aW9uIChkZWZhdWx0RXZlbnRzLCBDbGFzcykge1xuICAgICAgICB2YXIgZXZlbnRzID0gX2lzRnVuY3Rpb24oQ2xhc3MuZGVmYXVsdEV2ZW50cykgPyBDbGFzcy5kZWZhdWx0RXZlbnRzKHByb3BzKSA6IENsYXNzLmRlZmF1bHRFdmVudHM7XG4gICAgICAgIHJldHVybiBfdG9Db25zdW1hYmxlQXJyYXkoZGVmYXVsdEV2ZW50cykuY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShldmVudHMpKTtcbiAgICAgIH0sIFtdKSk7XG4gICAgfVxuICB9KSwgX3RlbXA7XG59O1xuXG52YXIgY2hlY2tCZWhhdmlvck5hbWUgPSBmdW5jdGlvbiAoYmVoYXZpb3IsIGJlaGF2aW9ycykge1xuICBpZiAoYmVoYXZpb3IgJiYgIV9pbmNsdWRlcyhiZWhhdmlvcnMsIGJlaGF2aW9yKSkge1xuICAgIExvZy53YXJuKFwiXFxcIlwiLmNvbmNhdChiZWhhdmlvciwgXCJcXFwiIGlzIG5vdCBhIHZhbGlkIGJlaGF2aW9yLiBDaG9vc2UgZnJvbSBbXCIpLmNvbmNhdChiZWhhdmlvcnMuam9pbihcIiwgXCIpLCBcIl0uXCIpKTtcbiAgfVxufTtcblxudmFyIG1ha2VDcmVhdGVDb250YWluZXJGdW5jdGlvbiA9IGZ1bmN0aW9uIChtaXhpbk1hcCwgQ29udGFpbmVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYmVoYXZpb3JBLCBiZWhhdmlvckIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgdmFyIGJlaGF2aW9ycyA9IF9rZXlzKG1peGluTWFwKTtcblxuICAgIGNoZWNrQmVoYXZpb3JOYW1lKGJlaGF2aW9yQSwgYmVoYXZpb3JzKTtcbiAgICBjaGVja0JlaGF2aW9yTmFtZShiZWhhdmlvckIsIGJlaGF2aW9ycyk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAyID8gMCA6IGFyZ3VtZW50cy5sZW5ndGggLSAyKSB7XG4gICAgICBMb2cud2FybihcInRvbyBtYW55IGFyZ3VtZW50cyBnaXZlbiB0byBjcmVhdGVDb250YWluZXIgKG1heGltdW0gYWNjZXB0ZWQ6IDIpLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgZmlyc3RNaXhpbnMgPSBtaXhpbk1hcFtiZWhhdmlvckFdO1xuICAgIHZhciBzZWNvbmRNaXhpbnMgPSBtaXhpbk1hcFtiZWhhdmlvckJdIHx8IFtdO1xuXG4gICAgaWYgKCFmaXJzdE1peGlucykge1xuICAgICAgcmV0dXJuIENvbnRhaW5lcjtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tYmluZUNvbnRhaW5lck1peGlucyhfdG9Db25zdW1hYmxlQXJyYXkoZmlyc3RNaXhpbnMpLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoc2Vjb25kTWl4aW5zKSksIENvbnRhaW5lcik7XG4gIH07XG59O1xuXG52YXIgY3JlYXRlQ29udGFpbmVyID0gbWFrZUNyZWF0ZUNvbnRhaW5lckZ1bmN0aW9uKHtcbiAgem9vbTogW3pvb21Db250YWluZXJNaXhpbl0sXG4gIHZvcm9ub2k6IFt2b3Jvbm9pQ29udGFpbmVyTWl4aW5dLFxuICBzZWxlY3Rpb246IFtzZWxlY3Rpb25Db250YWluZXJNaXhpbl0sXG4gIGN1cnNvcjogW2N1cnNvckNvbnRhaW5lck1peGluXSxcbiAgYnJ1c2g6IFticnVzaENvbnRhaW5lck1peGluXVxufSwgVmljdG9yeUNvbnRhaW5lcik7XG5leHBvcnQgeyBjcmVhdGVDb250YWluZXIsIG1ha2VDcmVhdGVDb250YWluZXJGdW5jdGlvbiwgY29tYmluZUNvbnRhaW5lck1peGlucyB9OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZUNvbnRhaW5lciBhcyB2aWN0b3J5Q3JlYXRlQ29udGFpbmVyIH0gZnJvbSAndmljdG9yeS1jcmVhdGUtY29udGFpbmVyJztcbmltcG9ydCB7IENoYXJ0Q3Vyc29yVG9vbHRpcCB9IGZyb20gJy4uL0NoYXJ0Q3Vyc29yVG9vbHRpcCc7XG5pbXBvcnQgeyBDaGFydExhYmVsIH0gZnJvbSAnLi4vQ2hhcnRMYWJlbCc7XG4vKipcbiAqIE1ha2VzIGEgY29udGFpbmVyIGNvbXBvbmVudCB3aXRoIG11bHRpcGxlIGJlaGF2aW9ycy4gSXQgYWxsb3dzIHlvdSB0byBlZmZlY3RpdmVseSBjb21iaW5lIGFueSB0d29cbiAqIGNvbnRhaW5lcnMgb2YgdHlwZSAnYnJ1c2gnLCAnY3Vyc29yJywgJ3NlbGVjdGlvbicsICd2b3Jvbm9pJywgb3IgJ3pvb20nLiBEZWZhdWx0IGNvbnRhaW5lciBwcm9wcyBhcmUgYXBwbGllZCB0b1xuICogc3VwcG9ydCB0aGUgUGF0dGVybkZseSB0aGVtZS5cbiAqXG4gKiBFYWNoIGJlaGF2aW9yIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5nczogJ2JydXNoJywgJ2N1cnNvcicsICdzZWxlY3Rpb24nLCAndm9yb25vaScsIGFuZCAnem9vbScuIFRoZVxuICogcmVzdWx0aW5nIGNvbnRhaW5lciB1c2VzIHRoZSBldmVudHMgZnJvbSBib3RoIGJlaGF2aW9ycy4gRm9yIGV4YW1wbGUsIGlmIGJvdGggYmVoYXZpb3JzIHVzZSB0aGUgY2xpY2sgZXZlbnQgKGxpa2VcbiAqIHpvb20gYW5kIHNlbGVjdGlvbikgdGhlIGNvbWJpbmVkIGNvbnRhaW5lciB3aWxsIHRyaWdnZXIgYm90aCBiZWhhdmlvcnMnIGV2ZW50cyBvbiBlYWNoIGNsaWNrLlxuICpcbiAqIE5vdGU6IE9yZGVyIG9mIHRoZSBiZWhhdmlvcnMgbWF0dGVycyBpbiBhIGZldyBjYXNlcy4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlICd6b29tJyBiZWZvcmUgYW55IG90aGVyIGJlaGF2aW9yczogZm9yXG4gKiBleGFtcGxlLCBjcmVhdGVDb250YWluZXIoJ3pvb20nLCAndm9yb25vaScpIGluc3RlYWQgb2YgY3JlYXRlQ29udGFpbmVyKCd2b3Jvbm9pJywgJ3pvb20nKS5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9mb3JtaWRhYmxlLmNvbS9vcGVuLXNvdXJjZS92aWN0b3J5L2RvY3MvY3JlYXRlLWNvbnRhaW5lclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiZWhhdmlvckEgJ2JydXNoJywgJ2N1cnNvcicsICdzZWxlY3Rpb24nLCAndm9yb25vaScsIG9yICd6b29tJ1xuICogQHBhcmFtIHtzdHJpbmd9IGJlaGF2aW9yQiAnYnJ1c2gnLCAnY3Vyc29yJywgJ3NlbGVjdGlvbicsICd2b3Jvbm9pJywgb3IgJ3pvb20nXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVDb250YWluZXIgPSAoYmVoYXZpb3JBLCBiZWhhdmlvckIpID0+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSB2aWN0b3J5Q3JlYXRlQ29udGFpbmVyKGJlaGF2aW9yQSwgYmVoYXZpb3JCKTtcbiAgICBjb25zdCBpc0N1cnNvciA9IGJlaGF2aW9yQSA9PT0gJ2N1cnNvcicgfHwgYmVoYXZpb3JCID09PSAnY3Vyc29yJztcbiAgICBjb25zdCBpc1Zvcm9ub2kgPSBiZWhhdmlvckEgPT09ICd2b3Jvbm9pJyB8fCBiZWhhdmlvckIgPT09ICd2b3Jvbm9pJztcbiAgICBpZiAoaXNDdXJzb3IpIHtcbiAgICAgICAgY29udGFpbmVyLmRlZmF1bHRQcm9wcy5jdXJzb3JMYWJlbENvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRMYWJlbCwgeyB0ZXh0QW5jaG9yOiBcInN0YXJ0XCIgfSk7XG4gICAgfVxuICAgIGlmIChpc1Zvcm9ub2kpIHtcbiAgICAgICAgY29udGFpbmVyLmRlZmF1bHRQcm9wcy5sYWJlbENvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhcnRDdXJzb3JUb29sdGlwLCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGFydC1jb250YWluZXIuanMubWFwIiwiLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5pbXBvcnQgY2hhcnRfYXJlYV9PcGFjaXR5IGZyb20gJ0BwYXR0ZXJuZmx5L3JlYWN0LXRva2Vucy9kaXN0L2VzbS9jaGFydF9hcmVhX09wYWNpdHknO1xuaW1wb3J0IGNoYXJ0X2NvbG9yX2JsYWNrXzUwMCBmcm9tICdAcGF0dGVybmZseS9yZWFjdC10b2tlbnMvZGlzdC9lc20vY2hhcnRfY29sb3JfYmxhY2tfNTAwJztcbi8vIFJldHVybnMgY2hpbGQgbmFtZXMgZm9yIGVhY2ggc2VyaWVzLCBleGNlcHQgZ2l2ZW4gSUQgaW5kZXhcbmNvbnN0IGdldENoaWxkTmFtZXMgPSAoeyBjaGFydE5hbWVzLCBvbWl0SW5kZXggfSkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNoYXJ0TmFtZXMubWFwKChjaGFydE5hbWUsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleCAhPT0gb21pdEluZGV4KSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGFydE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgY2hhcnROYW1lLmZvckVhY2gobmFtZSA9PiByZXN1bHQucHVzaChuYW1lKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGFydE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG4vLyBSZXR1cm5zIGV2ZW50cyBmb3IgYW4gaW50ZXJhY3RpdmUgbGVnZW5kXG5leHBvcnQgY29uc3QgZ2V0SW50ZXJhY3RpdmVMZWdlbmRFdmVudHMgPSAocHJvcHMpID0+IFtcbiAgICAuLi5nZXRJbnRlcmFjdGl2ZUxlZ2VuZFRhcmdldEV2ZW50cyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSwgeyB0YXJnZXQ6ICdkYXRhJyB9KSksXG4gICAgLi4uZ2V0SW50ZXJhY3RpdmVMZWdlbmRUYXJnZXRFdmVudHMoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9wcyksIHsgdGFyZ2V0OiAnbGFiZWxzJyB9KSlcbl07XG4vLyBSZXR1cm5zIGxlZ2VuZCBpdGVtcywgZXhjZXB0IGdpdmVuIElEIGluZGV4XG5jb25zdCBnZXRJbnRlcmFjdGl2ZUxlZ2VuZEl0ZW1zID0gKHsgY2hhcnROYW1lcywgb21pdEluZGV4IH0pID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjaGFydE5hbWVzLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4ICE9PSBvbWl0SW5kZXgpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuLy8gUmV0dXJucyBzdHlsZXMgZm9yIGludGVyYWN0aXZlIGxlZ2VuZCBpdGVtc1xuZXhwb3J0IGNvbnN0IGdldEludGVyYWN0aXZlTGVnZW5kSXRlbVN0eWxlcyA9IChoaWRkZW4gPSBmYWxzZSkgPT4gIWhpZGRlblxuICAgID8ge31cbiAgICA6IHtcbiAgICAgICAgbGFiZWxzOiB7XG4gICAgICAgICAgICBmaWxsOiBjaGFydF9jb2xvcl9ibGFja181MDAudmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgc3ltYm9sOiB7XG4gICAgICAgICAgICBmaWxsOiBjaGFydF9jb2xvcl9ibGFja181MDAudmFsdWUsXG4gICAgICAgICAgICB0eXBlOiAnZXllU2xhc2gnXG4gICAgICAgIH1cbiAgICB9O1xuLy8gUmV0dXJucyB0YXJnZXRlZCBldmVudHMgZm9yIGxlZ2VuZCAnZGF0YScgb3IgJ2xhYmVscydcbmNvbnN0IGdldEludGVyYWN0aXZlTGVnZW5kVGFyZ2V0RXZlbnRzID0gKHsgY2hhcnROYW1lcywgaXNEYXRhSGlkZGVuID0gKCkgPT4gZmFsc2UsIGlzSGlkZGVuID0gKCkgPT4gZmFsc2UsIGxlZ2VuZE5hbWUsIG9uTGVnZW5kQ2xpY2sgPSAoKSA9PiBudWxsLCB0YXJnZXQgfSkgPT4ge1xuICAgIGlmIChjaGFydE5hbWVzID09PSB1bmRlZmluZWQgfHwgbGVnZW5kTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2dldEludGVyYWN0aXZlTGVnZW5kVGFyZ2V0RXZlbnRzOicsICdyZXF1aXJlcyBjaGFydE5hbWVzIGFuZCBsZWdlbmROYW1lIHRvIGJlIHNwZWNpZmllZCcpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBjaGFydE5hbWVzLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgLy8gR2V0IElEcyB0byBhdHRhY2ggZXZlbnRzIHRvLCBleGNlcHQgdGhlIElEcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGlmIHRoZSBjdXJyZW50IGV2ZW50IGtleSBpcyAwLCB3ZSBuZWVkIElEcyBhc3NvY2lhdGVkIHdpdGggZXZlbnRzIDEgYW5kIDIuIElmIHRoZSBjdXJyZW50IGV2ZW50XG4gICAgICAgIC8vIGtleSBpcyAxLCB3ZSBuZWVkIElEcyBhc3NvY2lhdGVkIHdpdGggZXZlbnRzIDAgYW5kIDIuIEFuZCBzbyBvbi4uLlxuICAgICAgICBjb25zdCBjaGlsZE5hbWVzID0gZ2V0Q2hpbGROYW1lcyh7IGNoYXJ0TmFtZXMsIGxlZ2VuZE5hbWUsIG9taXRJbmRleDogaW5kZXggfSk7XG4gICAgICAgIGNvbnN0IGxlZ2VuZEl0ZW1zID0gZ2V0SW50ZXJhY3RpdmVMZWdlbmRJdGVtcyh7IGNoYXJ0TmFtZXMsIGxlZ2VuZE5hbWUsIG9taXRJbmRleDogaW5kZXggfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGlsZE5hbWU6IGxlZ2VuZE5hbWUsXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBldmVudEtleTogaW5kZXgsXG4gICAgICAgICAgICBldmVudEhhbmRsZXJzOiB7XG4gICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIaWRlIGVhY2ggZGF0YSBzZXJpZXMgaW5kaXZpZHVhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdkYXRhJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0aW9uOiAocHJvcHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkxlZ2VuZENsaWNrKHByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgb25Nb3VzZU92ZXI6ICgpID0+IGlzSGlkZGVuKGluZGV4KVxuICAgICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTXV0ZSBhbGwgZGF0YSBzZXJpZXMsIGV4Y2VwdCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTmFtZTogY2hpbGROYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdkYXRhJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudEtleTogJ2FsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRpb246IChwcm9wcykgPT4gaXNEYXRhSGlkZGVuKHByb3BzLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogcHJvcHMucGFkQW5nbGUgIT09IHVuZGVmaW5lZCAvLyBTdXBwb3J0IGZvciBwaWUgY2hhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMuc3R5bGUpLCAoaW5kZXggIT09IHByb3BzLmluZGV4ICYmIHsgb3BhY2l0eTogY2hhcnRfYXJlYV9PcGFjaXR5LnZhbHVlIH0pKSA6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMuc3R5bGUpLCB7IG9wYWNpdHk6IGNoYXJ0X2FyZWFfT3BhY2l0eS52YWx1ZSB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE11dGUgYWxsIGxlZ2VuZCBpdGVtIHN5bWJvbHMsIGV4Y2VwdCB0aGUgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGROYW1lOiBsZWdlbmROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2RhdGEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50S2V5OiBsZWdlbmRJdGVtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGlvbjogKHByb3BzKSA9PiBpc0hpZGRlbihwcm9wcy5pbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzLnN0eWxlKSwgeyBvcGFjaXR5OiBjaGFydF9hcmVhX09wYWNpdHkudmFsdWUgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNdXRlIGFsbCBsZWdlbmQgaXRlbSBsYWJlbHMsIGV4Y2VwdCB0aGUgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE5hbWU6IGxlZ2VuZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnbGFiZWxzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudEtleTogbGVnZW5kSXRlbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRpb246IChwcm9wcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSBwcm9wcy5kYXR1bSAmJiBwcm9wcy5kYXR1bS5jb2x1bW4gPyBwcm9wcy5kYXR1bS5jb2x1bW4gOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNIaWRkZW4oY29sdW1uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzLnN0eWxlKSwgeyBvcGFjaXR5OiBjaGFydF9hcmVhX09wYWNpdHkudmFsdWUgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIG9uTW91c2VPdXQ6ICgpID0+IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBhbGwgZGF0YSBzZXJpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTmFtZTogJ2FsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdkYXRhJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50S2V5OiAnYWxsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0aW9uOiAoKSA9PiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgYWxsIGxlZ2VuZCBpdGVtIHN5bWJvbHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTmFtZTogJ2xlZ2VuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdkYXRhJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50S2V5OiBsZWdlbmRJdGVtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0aW9uOiAoKSA9PiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgYWxsIGxlZ2VuZCBpdGVtIGxhYmVscyBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGROYW1lOiAnbGVnZW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2xhYmVscycsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudEtleTogbGVnZW5kSXRlbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGlvbjogKCkgPT4gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNoYXJ0LWludGVyYWN0aXZlLWxlZ2VuZC5qcy5tYXAiLCJpbXBvcnQgeyBjYW5Vc2VET00gfSBmcm9tICcuL2NoYXJ0LWhlbHBlcnMnO1xuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBSZXNpemVPYnNlcnZlciB1c2VkIHRvIGhhbmRsZSByZXNpemUgZXZlbnRzIGZvciB0aGUgZ2l2ZW4gY29udGFpbmVyUmVmLiBJZiBSZXNpemVPYnNlcnZlclxuICogb3IgdGhlIGdpdmVuIGNvbnRhaW5lclJlZiBhcmUgbm90IGF2YWlsYWJsZSwgYSB3aW5kb3cgcmVzaXplIGV2ZW50IGxpc3RlbmVyIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAqXG4gKiBFeGFtcGxlIDE6XG4gKlxuICogcHJpdmF0ZSBjb250YWluZXJSZWYgPSBSZWFjdC5jcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG4gKiBwcml2YXRlIG9ic2VydmVyOiBhbnkgPSAoKSA9PiB7fTtcbiAqXG4gKiBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gKiAgIHRoaXMub2JzZXJ2ZXIgPSBnZXRSZXNpemVPYnNlcnZlcih0aGlzLmNvbnRhaW5lclJlZi5jdXJyZW50LCB0aGlzLmhhbmRsZVJlc2l6ZSk7XG4gKiB9XG4gKlxuICogcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICogICB0aGlzLm9ic2VydmVyKCk7XG4gKiB9XG4gKlxuICogcHJpdmF0ZSBoYW5kbGVSZXNpemUgPSAoKSA9PiB7XG4gKiAgIGlmICh0aGlzLmNvbnRhaW5lclJlZi5jdXJyZW50ICYmIHRoaXMuY29udGFpbmVyUmVmLmN1cnJlbnQuY2xpZW50V2lkdGgpIHtcbiAqICAgICB0aGlzLnNldFN0YXRlKHsgd2lkdGg6IHRoaXMuY29udGFpbmVyUmVmLmN1cnJlbnQuY2xpZW50V2lkdGggfSk7XG4gKiAgIH1cbiAqIH07XG4gKlxuICogcHVibGljIHJlbmRlcigpIHtcbiAqICAgcmV0dXJuIChcbiAqICAgICA8ZGl2IHJlZj17dGhpcy5jb250YWluZXJSZWZ9ID5cbiAqICAgICAgIDxDaGFydCB3aWR0aD17dGhpcy5zdGF0ZS53aWR0aH0gLi4uIC8+XG4gKiAgICAgPC9kaXY+XG4gKiAgICk7XG4gKiB9XG4gKlxuICogRXhhbXBsZSAyOlxuICpcbiAqIHByaXZhdGUgaW5wdXRSZWYgPSBSZWFjdC5jcmVhdGVSZWY8SFRNTElucHV0RWxlbWVudD4oKTtcbiAqIHByaXZhdGUgb2JzZXJ2ZXI6IGFueSA9ICgpID0+IHt9O1xuICpcbiAqIHB1YmxpYyBjb21wb25lbnREaWRNb3VudCgpIHtcbiAqICAgdGhpcy5vYnNlcnZlciA9IGdldFJlc2l6ZU9ic2VydmVyKHRoaXMuaW5wdXRSZWYuY3VycmVudCwgdGhpcy5oYW5kbGVSZXNpemUpO1xuICogfVxuICpcbiAqIHB1YmxpYyBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAqICAgdGhpcy5vYnNlcnZlcigpO1xuICogfVxuICpcbiAqIHByaXZhdGUgaGFuZGxlUmVzaXplID0gKCkgPT4ge1xuICogICBpZiAodGhpcy5pbnB1dFJlZi5jdXJyZW50KSB7XG4gKiAgICAgdHJpbUxlZnQoaW5wdXRSZWYuY3VycmVudCwgU3RyaW5nKHRoaXMucHJvcHMudmFsdWUpKTtcbiAqICAgfVxuICogfTtcbiAqXG4gKiBwdWJsaWMgcmVuZGVyKCkge1xuICogICByZXR1cm4gKFxuICogICAgIDxpbnB1dCByZWY9e3RoaXMuaW5wdXRSZWZ9IC4uLiAvPlxuICogICApO1xuICogfVxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gY29udGFpbmVyUmVmRWxlbWVudCBUaGUgY29udGFpbmVyIHJlZmVyZW5jZSB0byBvYnNlcnZlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVSZXNpemUgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIHJlc2l6ZSBldmVudHNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgZnVuY3Rpb24gdXNlZCB0byB1bm9ic2VydmUgcmVzaXplIGV2ZW50c1xuICovXG5leHBvcnQgY29uc3QgZ2V0UmVzaXplT2JzZXJ2ZXIgPSAoY29udGFpbmVyUmVmRWxlbWVudCwgaGFuZGxlUmVzaXplKSA9PiB7XG4gICAgbGV0IHVub2JzZXJ2ZTtcbiAgICBpZiAoY2FuVXNlRE9NKSB7XG4gICAgICAgIGNvbnN0IHsgUmVzaXplT2JzZXJ2ZXIgfSA9IHdpbmRvdztcbiAgICAgICAgaWYgKGNvbnRhaW5lclJlZkVsZW1lbnQgJiYgUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV3JhcCByZXNpemUgZnVuY3Rpb24gaW4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHRvIGF2b2lkIFwiUmVzaXplT2JzZXJ2ZXIgbG9vcCBsaW1pdCBleGNlZWRlZFwiIGVycm9yc1xuICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyaWVzKSAmJiBlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVJlc2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyUmVmRWxlbWVudCk7XG4gICAgICAgICAgICB1bm9ic2VydmUgPSAoKSA9PiByZXNpemVPYnNlcnZlci51bm9ic2VydmUoY29udGFpbmVyUmVmRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaGFuZGxlUmVzaXplKTtcbiAgICAgICAgICAgIHVub2JzZXJ2ZSA9ICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBoYW5kbGVSZXNpemUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmICh1bm9ic2VydmUpIHtcbiAgICAgICAgICAgIHVub2JzZXJ2ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGFydC1yZXNpemUuanMubWFwIiwiZXhwb3J0ICogZnJvbSAnLi9jaGFydC1jb250YWluZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jaGFydC1kb21haW4nO1xuZXhwb3J0ICogZnJvbSAnLi9jaGFydC1oZWxwZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vY2hhcnQtaW50ZXJhY3RpdmUtbGVnZW5kJztcbmV4cG9ydCAqIGZyb20gJy4vY2hhcnQtbGFiZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9jaGFydC1sZWdlbmQnO1xuZXhwb3J0ICogZnJvbSAnLi9jaGFydC1vcmlnaW4nO1xuZXhwb3J0ICogZnJvbSAnLi9jaGFydC1wYWRkaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vY2hhcnQtcmVzaXplJztcbmV4cG9ydCAqIGZyb20gJy4vY2hhcnQtdGhlbWUnO1xuZXhwb3J0ICogZnJvbSAnLi9jaGFydC10b29sdGlwJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGhvaXN0Tm9uUmVhY3RTdGF0aWNzIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJztcbmltcG9ydCB7IFZpY3RvcnlWb3Jvbm9pQ29udGFpbmVyIH0gZnJvbSAndmljdG9yeS12b3Jvbm9pLWNvbnRhaW5lcic7XG5pbXBvcnQgeyBDaGFydFRvb2x0aXAgfSBmcm9tICcuLi9DaGFydFRvb2x0aXAnO1xuaW1wb3J0IHsgZ2V0Q2xhc3NOYW1lLCBnZXRUaGVtZSB9IGZyb20gJy4uL0NoYXJ0VXRpbHMnO1xuZXhwb3J0IHZhciBDaGFydFZvcm9ub2lEaW1lbnNpb247XG4oZnVuY3Rpb24gKENoYXJ0Vm9yb25vaURpbWVuc2lvbikge1xuICAgIENoYXJ0Vm9yb25vaURpbWVuc2lvbltcInhcIl0gPSBcInhcIjtcbiAgICBDaGFydFZvcm9ub2lEaW1lbnNpb25bXCJ5XCJdID0gXCJ5XCI7XG59KShDaGFydFZvcm9ub2lEaW1lbnNpb24gfHwgKENoYXJ0Vm9yb25vaURpbWVuc2lvbiA9IHt9KSk7XG5leHBvcnQgY29uc3QgQ2hhcnRWb3Jvbm9pQ29udGFpbmVyID0gKF9hKSA9PiB7XG4gICAgdmFyIHsgY2xhc3NOYW1lLCBjb25zdHJhaW5Ub1Zpc2libGVBcmVhID0gZmFsc2UsIHRoZW1lQ29sb3IsIHRoZW1lVmFyaWFudCwgXG4gICAgLy8gZGVzdHJ1Y3R1cmUgbGFzdFxuICAgIHRoZW1lID0gZ2V0VGhlbWUodGhlbWVDb2xvciwgdGhlbWVWYXJpYW50KSwgbGFiZWxDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0VG9vbHRpcCwgbnVsbCkgfSA9IF9hLCAvLyBOb3RlIHRoYXQgVmljdG9yeSBwcm92aWRlcyBpdHMgb3duIHRvb2x0aXAgY29tcG9uZW50IGhlcmVcbiAgICByZXN0ID0gX19yZXN0KF9hLCBbXCJjbGFzc05hbWVcIiwgXCJjb25zdHJhaW5Ub1Zpc2libGVBcmVhXCIsIFwidGhlbWVDb2xvclwiLCBcInRoZW1lVmFyaWFudFwiLCBcInRoZW1lXCIsIFwibGFiZWxDb21wb25lbnRcIl0pO1xuICAgIGNvbnN0IGNoYXJ0Q2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKHsgY2xhc3NOYW1lIH0pO1xuICAgIGNvbnN0IGNoYXJ0TGFiZWxDb21wb25lbnQgPSBSZWFjdC5jbG9uZUVsZW1lbnQobGFiZWxDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oeyBjb25zdHJhaW5Ub1Zpc2libGVBcmVhLFxuICAgICAgICB0aGVtZSB9LCBsYWJlbENvbXBvbmVudC5wcm9wcykpO1xuICAgIC8vIE5vdGU6IHRoZW1lIGlzIHJlcXVpcmVkIGJ5IHZvcm9ub2lDb250YWluZXJNaXhpblxuICAgIHJldHVybiAoXG4gICAgLy8gTm90ZTogY2xhc3NOYW1lIGlzIHZhbGlkLCBidXQgVmljdG9yeSBpcyBtaXNzaW5nIGEgdHlwZVxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmljdG9yeVZvcm9ub2lDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBjbGFzc05hbWU6IGNoYXJ0Q2xhc3NOYW1lLCBsYWJlbENvbXBvbmVudDogY2hhcnRMYWJlbENvbXBvbmVudCwgdGhlbWU6IHRoZW1lIH0sIHJlc3QpKSk7XG59O1xuQ2hhcnRWb3Jvbm9pQ29udGFpbmVyLmRpc3BsYXlOYW1lID0gJ0NoYXJ0Vm9yb25vaUNvbnRhaW5lcic7XG5DaGFydFZvcm9ub2lDb250YWluZXIuZGVmYXVsdFByb3BzID0gVmljdG9yeVZvcm9ub2lDb250YWluZXIuZGVmYXVsdFByb3BzO1xuLy8gTm90ZTogVmljdG9yeVZvcm9ub2lDb250YWluZXIuZGVmYXVsdEV2ZW50cyAmIFZpY3RvcnlDb250YWluZXIucm9sZSBtdXN0IGJlIGhvaXN0ZWRcbmhvaXN0Tm9uUmVhY3RTdGF0aWNzKENoYXJ0Vm9yb25vaUNvbnRhaW5lciwgVmljdG9yeVZvcm9ub2lDb250YWluZXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2hhcnRWb3Jvbm9pQ29udGFpbmVyLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gJy4vQ2hhcnRWb3Jvbm9pQ29udGFpbmVyJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qKiBLZWVwIGFscGhhYmV0aWNhbGx5IHNvcnRlZCAqL1xuZXhwb3J0ICogZnJvbSAnLi9DaGFydCc7XG5leHBvcnQgKiBmcm9tICcuL0NoYXJ0QXJlYSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYXJ0QXhpcyc7XG5leHBvcnQgKiBmcm9tICcuL0NoYXJ0QmFyJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhcnRCdWxsZXQnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFydENvbnRhaW5lcic7XG5leHBvcnQgKiBmcm9tICcuL0NoYXJ0Q3Vyc29yQ29udGFpbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhcnRDdXJzb3JUb29sdGlwJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhcnREb251dCc7XG5leHBvcnQgKiBmcm9tICcuL0NoYXJ0RG9udXRVdGlsaXphdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL0NoYXJ0R3JvdXAnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFydExhYmVsJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhcnRMZWdlbmQnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFydExlZ2VuZFRvb2x0aXAnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFydExpbmUnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFydFBpZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYXJ0UG9pbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFydFNjYXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFydFN0YWNrJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhcnRUaGVtZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYXJ0VGhyZXNob2xkJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhcnRUb29sdGlwJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhcnRVdGlscyc7XG5leHBvcnQgKiBmcm9tICcuL0NoYXJ0Vm9yb25vaUNvbnRhaW5lcic7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5685\n')},2004:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n "ASTERISK": () => (/* reexport */ ASTERISK),\n "AboutModal": () => (/* reexport */ AboutModal),\n "Accordion": () => (/* reexport */ Accordion),\n "AccordionContent": () => (/* reexport */ AccordionContent),\n "AccordionExpandedContentBody": () => (/* reexport */ AccordionExpandedContentBody),\n "AccordionItem": () => (/* reexport */ AccordionItem),\n "AccordionToggle": () => (/* reexport */ AccordionToggle),\n "ActionGroup": () => (/* reexport */ ActionGroup),\n "ActionList": () => (/* reexport */ ActionList),\n "ActionListGroup": () => (/* reexport */ ActionListGroup),\n "ActionListItem": () => (/* reexport */ ActionListItem),\n "Alert": () => (/* reexport */ Alert),\n "AlertActionCloseButton": () => (/* reexport */ AlertActionCloseButton),\n "AlertActionLink": () => (/* reexport */ AlertActionLink),\n "AlertContext": () => (/* reexport */ AlertContext),\n "AlertGroup": () => (/* reexport */ AlertGroup),\n "AlertVariant": () => (/* reexport */ AlertVariant),\n "ApplicationLauncher": () => (/* reexport */ ApplicationLauncher),\n "ApplicationLauncherContent": () => (/* reexport */ ApplicationLauncherContent),\n "ApplicationLauncherContext": () => (/* reexport */ ApplicationLauncherContext),\n "ApplicationLauncherGroup": () => (/* reexport */ ApplicationLauncherGroup),\n "ApplicationLauncherIcon": () => (/* reexport */ ApplicationLauncherIcon),\n "ApplicationLauncherItem": () => (/* reexport */ ApplicationLauncherItem),\n "ApplicationLauncherItemContext": () => (/* reexport */ ApplicationLauncherItemContext),\n "ApplicationLauncherSeparator": () => (/* reexport */ ApplicationLauncherSeparator),\n "ApplicationLauncherText": () => (/* reexport */ ApplicationLauncherText),\n "Avatar": () => (/* reexport */ Avatar),\n "BackToTop": () => (/* reexport */ BackToTop),\n "Backdrop": () => (/* reexport */ Backdrop),\n "BackgroundImage": () => (/* reexport */ BackgroundImage),\n "Badge": () => (/* reexport */ Badge),\n "BadgeToggle": () => (/* reexport */ BadgeToggle),\n "Banner": () => (/* reexport */ Banner),\n "BaseSizes": () => (/* reexport */ BaseSizes),\n "Brand": () => (/* reexport */ Brand),\n "Breadcrumb": () => (/* reexport */ Breadcrumb),\n "BreadcrumbHeading": () => (/* reexport */ BreadcrumbHeading),\n "BreadcrumbItem": () => (/* reexport */ BreadcrumbItem),\n "Bullseye": () => (/* reexport */ Bullseye),\n "Button": () => (/* reexport */ Button),\n "ButtonType": () => (/* reexport */ ButtonType),\n "ButtonVariant": () => (/* reexport */ ButtonVariant),\n "CalendarMonth": () => (/* reexport */ CalendarMonth),\n "Card": () => (/* reexport */ Card),\n "CardActions": () => (/* reexport */ CardActions),\n "CardBody": () => (/* reexport */ CardBody),\n "CardContext": () => (/* reexport */ CardContext),\n "CardExpandableContent": () => (/* reexport */ CardExpandableContent),\n "CardFooter": () => (/* reexport */ CardFooter),\n "CardHeader": () => (/* reexport */ CardHeader),\n "CardHeaderMain": () => (/* reexport */ CardHeaderMain),\n "CardTitle": () => (/* reexport */ CardTitle),\n "Checkbox": () => (/* reexport */ Checkbox),\n "Chip": () => (/* reexport */ Chip),\n "ChipGroup": () => (/* reexport */ ChipGroup),\n "ClipboardCopy": () => (/* reexport */ ClipboardCopy),\n "ClipboardCopyAction": () => (/* reexport */ ClipboardCopyAction),\n "ClipboardCopyButton": () => (/* reexport */ ClipboardCopyButton),\n "ClipboardCopyVariant": () => (/* reexport */ ClipboardCopyVariant),\n "CodeBlock": () => (/* reexport */ CodeBlock),\n "CodeBlockAction": () => (/* reexport */ CodeBlockAction),\n "CodeBlockCode": () => (/* reexport */ CodeBlockCode),\n "ContextSelector": () => (/* reexport */ ContextSelector),\n "ContextSelectorFooter": () => (/* reexport */ ContextSelectorFooter),\n "ContextSelectorItem": () => (/* reexport */ ContextSelectorItem),\n "DataList": () => (/* reexport */ DataList),\n "DataListAction": () => (/* reexport */ DataListAction),\n "DataListCell": () => (/* reexport */ DataListCell),\n "DataListCheck": () => (/* reexport */ DataListCheck),\n "DataListContent": () => (/* reexport */ DataListContent),\n "DataListContext": () => (/* reexport */ DataListContext),\n "DataListControl": () => (/* reexport */ DataListControl),\n "DataListDragButton": () => (/* reexport */ DataListDragButton),\n "DataListItem": () => (/* reexport */ DataListItem),\n "DataListItemCells": () => (/* reexport */ DataListItemCells),\n "DataListItemRow": () => (/* reexport */ DataListItemRow),\n "DataListText": () => (/* reexport */ DataListText),\n "DataListToggle": () => (/* reexport */ DataListToggle),\n "DataListWrapModifier": () => (/* reexport */ DataListWrapModifier),\n "DatePicker": () => (/* reexport */ DatePicker),\n "DescriptionList": () => (/* reexport */ DescriptionList),\n "DescriptionListDescription": () => (/* reexport */ DescriptionListDescription),\n "DescriptionListGroup": () => (/* reexport */ DescriptionListGroup),\n "DescriptionListTerm": () => (/* reexport */ DescriptionListTerm),\n "DescriptionListTermHelpText": () => (/* reexport */ DescriptionListTermHelpText),\n "DescriptionListTermHelpTextButton": () => (/* reexport */ DescriptionListTermHelpTextButton),\n "DeviceSizes": () => (/* reexport */ DeviceSizes),\n "Divider": () => (/* reexport */ Divider),\n "DividerVariant": () => (/* reexport */ DividerVariant),\n "DragDrop": () => (/* reexport */ DragDrop),\n "DragDropContext": () => (/* reexport */ DragDropContext),\n "Draggable": () => (/* reexport */ Draggable),\n "Drawer": () => (/* reexport */ Drawer),\n "DrawerActions": () => (/* reexport */ DrawerActions),\n "DrawerCloseButton": () => (/* reexport */ DrawerCloseButton),\n "DrawerColorVariant": () => (/* reexport */ DrawerColorVariant),\n "DrawerContent": () => (/* reexport */ DrawerContent),\n "DrawerContentBody": () => (/* reexport */ DrawerContentBody),\n "DrawerContext": () => (/* reexport */ DrawerContext),\n "DrawerHead": () => (/* reexport */ DrawerHead),\n "DrawerPanelBody": () => (/* reexport */ DrawerPanelBody),\n "DrawerPanelContent": () => (/* reexport */ DrawerPanelContent),\n "DrawerSection": () => (/* reexport */ DrawerSection),\n "DrilldownMenu": () => (/* reexport */ DrilldownMenu),\n "Dropdown": () => (/* reexport */ Dropdown),\n "DropdownArrowContext": () => (/* reexport */ DropdownArrowContext),\n "DropdownContext": () => (/* reexport */ DropdownContext),\n "DropdownDirection": () => (/* reexport */ DropdownDirection),\n "DropdownGroup": () => (/* reexport */ DropdownGroup),\n "DropdownItem": () => (/* reexport */ DropdownItem),\n "DropdownMenu": () => (/* reexport */ DropdownMenu),\n "DropdownPosition": () => (/* reexport */ DropdownPosition),\n "DropdownSeparator": () => (/* reexport */ DropdownSeparator),\n "DropdownToggle": () => (/* reexport */ DropdownToggle),\n "DropdownToggleAction": () => (/* reexport */ DropdownToggleAction),\n "DropdownToggleCheckbox": () => (/* reexport */ DropdownToggleCheckbox),\n "DropdownWithContext": () => (/* reexport */ DropdownWithContext),\n "Droppable": () => (/* reexport */ Droppable),\n "DualListSelector": () => (/* reexport */ DualListSelector),\n "DualListSelectorControl": () => (/* reexport */ DualListSelectorControl),\n "DualListSelectorControlBase": () => (/* reexport */ DualListSelectorControlBase),\n "DualListSelectorControlsWrapper": () => (/* reexport */ DualListSelectorControlsWrapper),\n "DualListSelectorControlsWrapperBase": () => (/* reexport */ DualListSelectorControlsWrapperBase),\n "DualListSelectorList": () => (/* reexport */ DualListSelectorList),\n "DualListSelectorListItem": () => (/* reexport */ DualListSelectorListItem),\n "DualListSelectorListItemBase": () => (/* reexport */ DualListSelectorListItemBase),\n "DualListSelectorPane": () => (/* reexport */ DualListSelectorPane),\n "DualListSelectorTree": () => (/* reexport */ DualListSelectorTree),\n "EmptyState": () => (/* reexport */ EmptyState),\n "EmptyStateBody": () => (/* reexport */ EmptyStateBody),\n "EmptyStateIcon": () => (/* reexport */ EmptyStateIcon),\n "EmptyStatePrimary": () => (/* reexport */ EmptyStatePrimary),\n "EmptyStateSecondaryActions": () => (/* reexport */ EmptyStateSecondaryActions),\n "EmptyStateVariant": () => (/* reexport */ EmptyStateVariant),\n "ExpandableSection": () => (/* reexport */ ExpandableSection),\n "ExpandableSectionToggle": () => (/* reexport */ ExpandableSectionToggle),\n "FileUpload": () => (/* reexport */ FileUpload),\n "FileUploadField": () => (/* reexport */ FileUploadField),\n "Flex": () => (/* reexport */ Flex),\n "FlexItem": () => (/* reexport */ FlexItem),\n "FocusTrap": () => (/* reexport */ FocusTrap),\n "Form": () => (/* reexport */ Form),\n "FormAlert": () => (/* reexport */ FormAlert),\n "FormFieldGroup": () => (/* reexport */ FormFieldGroup),\n "FormFieldGroupExpandable": () => (/* reexport */ FormFieldGroupExpandable),\n "FormFieldGroupHeader": () => (/* reexport */ FormFieldGroupHeader),\n "FormGroup": () => (/* reexport */ FormGroup),\n "FormHelperText": () => (/* reexport */ FormHelperText),\n "FormSection": () => (/* reexport */ FormSection),\n "FormSelect": () => (/* reexport */ FormSelect),\n "FormSelectOption": () => (/* reexport */ FormSelectOption),\n "FormSelectOptionGroup": () => (/* reexport */ FormSelectOptionGroup),\n "Gallery": () => (/* reexport */ Gallery),\n "GalleryItem": () => (/* reexport */ GalleryItem),\n "GenerateId": () => (/* reexport */ GenerateId),\n "Grid": () => (/* reexport */ Grid),\n "GridItem": () => (/* reexport */ GridItem),\n "HelperText": () => (/* reexport */ HelperText),\n "HelperTextItem": () => (/* reexport */ HelperTextItem),\n "Hint": () => (/* reexport */ Hint),\n "HintBody": () => (/* reexport */ HintBody),\n "HintFooter": () => (/* reexport */ HintFooter),\n "HintTitle": () => (/* reexport */ HintTitle),\n "InputGroup": () => (/* reexport */ InputGroup),\n "InputGroupText": () => (/* reexport */ InputGroupText),\n "InputGroupTextVariant": () => (/* reexport */ InputGroupTextVariant),\n "JumpLinks": () => (/* reexport */ JumpLinks),\n "JumpLinksItem": () => (/* reexport */ JumpLinksItem),\n "JumpLinksList": () => (/* reexport */ JumpLinksList),\n "KEYHANDLER_DIRECTION": () => (/* reexport */ KEYHANDLER_DIRECTION),\n "KEY_CODES": () => (/* reexport */ KEY_CODES),\n "KebabToggle": () => (/* reexport */ KebabToggle),\n "KeyTypes": () => (/* reexport */ KeyTypes),\n "KeyboardHandler": () => (/* reexport */ KeyboardHandler),\n "Label": () => (/* reexport */ Label),\n "LabelGroup": () => (/* reexport */ LabelGroup),\n "Level": () => (/* reexport */ Level),\n "LevelItem": () => (/* reexport */ LevelItem),\n "List": () => (/* reexport */ List),\n "ListComponent": () => (/* reexport */ ListComponent),\n "ListItem": () => (/* reexport */ ListItem),\n "ListVariant": () => (/* reexport */ ListVariant),\n "Login": () => (/* reexport */ Login),\n "LoginFooter": () => (/* reexport */ LoginFooter),\n "LoginFooterItem": () => (/* reexport */ LoginFooterItem),\n "LoginForm": () => (/* reexport */ LoginForm),\n "LoginHeader": () => (/* reexport */ LoginHeader),\n "LoginMainBody": () => (/* reexport */ LoginMainBody),\n "LoginMainFooter": () => (/* reexport */ LoginMainFooter),\n "LoginMainFooterBandItem": () => (/* reexport */ LoginMainFooterBandItem),\n "LoginMainFooterLinksItem": () => (/* reexport */ LoginMainFooterLinksItem),\n "LoginMainHeader": () => (/* reexport */ LoginMainHeader),\n "LoginPage": () => (/* reexport */ LoginPage),\n "Masthead": () => (/* reexport */ Masthead),\n "MastheadBrand": () => (/* reexport */ MastheadBrand),\n "MastheadContent": () => (/* reexport */ MastheadContent),\n "MastheadMain": () => (/* reexport */ MastheadMain),\n "MastheadToggle": () => (/* reexport */ MastheadToggle),\n "Menu": () => (/* reexport */ Menu),\n "MenuBreadcrumb": () => (/* reexport */ MenuBreadcrumb),\n "MenuContent": () => (/* reexport */ MenuContent),\n "MenuFooter": () => (/* reexport */ MenuFooter),\n "MenuGroup": () => (/* reexport */ MenuGroup),\n "MenuInput": () => (/* reexport */ MenuInput),\n "MenuItem": () => (/* reexport */ MenuItem),\n "MenuItemAction": () => (/* reexport */ MenuItemAction),\n "MenuList": () => (/* reexport */ MenuList),\n "MenuToggle": () => (/* reexport */ MenuToggle),\n "MenuToggleBase": () => (/* reexport */ MenuToggleBase),\n "Modal": () => (/* reexport */ Modal),\n "ModalBox": () => (/* reexport */ ModalBox),\n "ModalBoxBody": () => (/* reexport */ ModalBoxBody),\n "ModalBoxCloseButton": () => (/* reexport */ ModalBoxCloseButton),\n "ModalBoxFooter": () => (/* reexport */ ModalBoxFooter),\n "ModalBoxHeader": () => (/* reexport */ ModalBoxHeader),\n "ModalContent": () => (/* reexport */ ModalContent),\n "ModalVariant": () => (/* reexport */ ModalVariant),\n "MultipleFileUpload": () => (/* reexport */ MultipleFileUpload),\n "MultipleFileUploadContext": () => (/* reexport */ MultipleFileUploadContext),\n "MultipleFileUploadMain": () => (/* reexport */ MultipleFileUploadMain),\n "MultipleFileUploadStatus": () => (/* reexport */ MultipleFileUploadStatus),\n "MultipleFileUploadStatusItem": () => (/* reexport */ MultipleFileUploadStatusItem),\n "Nav": () => (/* reexport */ Nav),\n "NavContext": () => (/* reexport */ NavContext),\n "NavExpandable": () => (/* reexport */ NavExpandable),\n "NavGroup": () => (/* reexport */ NavGroup),\n "NavItem": () => (/* reexport */ NavItem),\n "NavItemSeparator": () => (/* reexport */ NavItemSeparator),\n "NavList": () => (/* reexport */ NavList),\n "NotificationBadge": () => (/* reexport */ NotificationBadge),\n "NotificationBadgeVariant": () => (/* reexport */ NotificationBadgeVariant),\n "NotificationDrawer": () => (/* reexport */ NotificationDrawer),\n "NotificationDrawerBody": () => (/* reexport */ NotificationDrawerBody),\n "NotificationDrawerGroup": () => (/* reexport */ NotificationDrawerGroup),\n "NotificationDrawerGroupList": () => (/* reexport */ NotificationDrawerGroupList),\n "NotificationDrawerHeader": () => (/* reexport */ NotificationDrawerHeader),\n "NotificationDrawerList": () => (/* reexport */ NotificationDrawerList),\n "NotificationDrawerListItem": () => (/* reexport */ NotificationDrawerListItem),\n "NotificationDrawerListItemBody": () => (/* reexport */ NotificationDrawerListItemBody),\n "NotificationDrawerListItemHeader": () => (/* reexport */ NotificationDrawerListItemHeader),\n "NumberInput": () => (/* reexport */ NumberInput),\n "OptionsMenu": () => (/* reexport */ OptionsMenu),\n "OptionsMenuDirection": () => (/* reexport */ OptionsMenuDirection),\n "OptionsMenuItem": () => (/* reexport */ OptionsMenuItem),\n "OptionsMenuItemGroup": () => (/* reexport */ OptionsMenuItemGroup),\n "OptionsMenuPosition": () => (/* reexport */ OptionsMenuPosition),\n "OptionsMenuSeparator": () => (/* reexport */ OptionsMenuSeparator),\n "OptionsMenuToggle": () => (/* reexport */ OptionsMenuToggle),\n "OptionsMenuToggleWithText": () => (/* reexport */ OptionsMenuToggleWithText),\n "OrderType": () => (/* reexport */ OrderType),\n "OverflowMenu": () => (/* reexport */ OverflowMenu),\n "OverflowMenuContent": () => (/* reexport */ OverflowMenuContent),\n "OverflowMenuControl": () => (/* reexport */ OverflowMenuControl),\n "OverflowMenuDropdownItem": () => (/* reexport */ OverflowMenuDropdownItem),\n "OverflowMenuGroup": () => (/* reexport */ OverflowMenuGroup),\n "OverflowMenuItem": () => (/* reexport */ OverflowMenuItem),\n "Page": () => (/* reexport */ Page),\n "PageBreadcrumb": () => (/* reexport */ PageBreadcrumb),\n "PageContext": () => (/* reexport */ PageContext),\n "PageContextConsumer": () => (/* reexport */ PageContextConsumer),\n "PageContextProvider": () => (/* reexport */ PageContextProvider),\n "PageGroup": () => (/* reexport */ PageGroup),\n "PageHeader": () => (/* reexport */ PageHeader),\n "PageHeaderTools": () => (/* reexport */ PageHeaderTools),\n "PageHeaderToolsGroup": () => (/* reexport */ PageHeaderToolsGroup),\n "PageHeaderToolsItem": () => (/* reexport */ PageHeaderToolsItem),\n "PageLayouts": () => (/* reexport */ PageLayouts),\n "PageNavigation": () => (/* reexport */ PageNavigation),\n "PageSection": () => (/* reexport */ PageSection),\n "PageSectionTypes": () => (/* reexport */ PageSectionTypes),\n "PageSectionVariants": () => (/* reexport */ PageSectionVariants),\n "PageSidebar": () => (/* reexport */ PageSidebar),\n "PageSidebarContext": () => (/* reexport */ PageSidebarContext),\n "PageToggleButton": () => (/* reexport */ PageToggleButton),\n "Pagination": () => (/* reexport */ Pagination),\n "PaginationVariant": () => (/* reexport */ PaginationVariant),\n "Panel": () => (/* reexport */ Panel),\n "PanelFooter": () => (/* reexport */ PanelFooter),\n "PanelHeader": () => (/* reexport */ PanelHeader),\n "PanelMain": () => (/* reexport */ PanelMain),\n "PanelMainBody": () => (/* reexport */ PanelMainBody),\n "Popover": () => (/* reexport */ Popover),\n "PopoverPosition": () => (/* reexport */ PopoverPosition),\n "Popper": () => (/* reexport */ Popper),\n "Progress": () => (/* reexport */ Progress),\n "ProgressBar": () => (/* reexport */ ProgressBar),\n "ProgressContainer": () => (/* reexport */ ProgressContainer),\n "ProgressMeasureLocation": () => (/* reexport */ ProgressMeasureLocation),\n "ProgressSize": () => (/* reexport */ ProgressSize),\n "ProgressStep": () => (/* reexport */ ProgressStep),\n "ProgressStepper": () => (/* reexport */ ProgressStepper),\n "ProgressVariant": () => (/* reexport */ ProgressVariant),\n "Radio": () => (/* reexport */ Radio),\n "SIDE": () => (/* reexport */ SIDE),\n "SearchInput": () => (/* reexport */ SearchInput),\n "Select": () => (/* reexport */ Select),\n "SelectConsumer": () => (/* reexport */ SelectConsumer),\n "SelectContext": () => (/* reexport */ SelectContext),\n "SelectDirection": () => (/* reexport */ SelectDirection),\n "SelectFooterTabbableItems": () => (/* reexport */ SelectFooterTabbableItems),\n "SelectGroup": () => (/* reexport */ SelectGroup),\n "SelectOption": () => (/* reexport */ SelectOption),\n "SelectPosition": () => (/* reexport */ SelectPosition),\n "SelectProvider": () => (/* reexport */ SelectProvider),\n "SelectVariant": () => (/* reexport */ SelectVariant),\n "Sidebar": () => (/* reexport */ Sidebar),\n "SidebarContent": () => (/* reexport */ SidebarContent),\n "SidebarPanel": () => (/* reexport */ SidebarPanel),\n "SimpleList": () => (/* reexport */ SimpleList),\n "SimpleListContext": () => (/* reexport */ SimpleListContext),\n "SimpleListGroup": () => (/* reexport */ SimpleListGroup),\n "SimpleListItem": () => (/* reexport */ SimpleListItem),\n "Skeleton": () => (/* reexport */ Skeleton),\n "SkipToContent": () => (/* reexport */ SkipToContent),\n "Slider": () => (/* reexport */ Slider),\n "Spinner": () => (/* reexport */ Spinner),\n "Split": () => (/* reexport */ Split),\n "SplitItem": () => (/* reexport */ SplitItem),\n "Stack": () => (/* reexport */ Stack),\n "StackItem": () => (/* reexport */ StackItem),\n "Switch": () => (/* reexport */ Switch),\n "Tab": () => (/* reexport */ Tab),\n "TabContent": () => (/* reexport */ TabContent),\n "TabContentBody": () => (/* reexport */ TabContentBody),\n "TabTitleIcon": () => (/* reexport */ TabTitleIcon),\n "TabTitleText": () => (/* reexport */ TabTitleText),\n "Tabs": () => (/* reexport */ Tabs),\n "TabsComponent": () => (/* reexport */ TabsComponent),\n "TabsContext": () => (/* reexport */ TabsContext),\n "TabsContextConsumer": () => (/* reexport */ TabsContextConsumer),\n "TabsContextProvider": () => (/* reexport */ TabsContextProvider),\n "Text": () => (/* reexport */ Text),\n "TextAreResizeOrientation": () => (/* reexport */ TextAreResizeOrientation),\n "TextArea": () => (/* reexport */ TextArea),\n "TextAreaBase": () => (/* reexport */ TextAreaBase),\n "TextContent": () => (/* reexport */ TextContent),\n "TextInput": () => (/* reexport */ TextInput),\n "TextInputBase": () => (/* reexport */ TextInputBase),\n "TextInputGroup": () => (/* reexport */ TextInputGroup),\n "TextInputGroupContext": () => (/* reexport */ TextInputGroupContext),\n "TextInputGroupMain": () => (/* reexport */ TextInputGroupMain),\n "TextInputGroupUtilities": () => (/* reexport */ TextInputGroupUtilities),\n "TextInputTypes": () => (/* reexport */ TextInputTypes),\n "TextList": () => (/* reexport */ TextList),\n "TextListItem": () => (/* reexport */ TextListItem),\n "TextListItemVariants": () => (/* reexport */ TextListItemVariants),\n "TextListVariants": () => (/* reexport */ TextListVariants),\n "TextVariants": () => (/* reexport */ TextVariants),\n "Tile": () => (/* reexport */ Tile),\n "TimePicker": () => (/* reexport */ TimePicker),\n "Title": () => (/* reexport */ Title),\n "TitleSizes": () => (/* reexport */ TitleSizes),\n "ToggleGroup": () => (/* reexport */ ToggleGroup),\n "ToggleGroupItem": () => (/* reexport */ ToggleGroupItem),\n "ToggleTemplate": () => (/* reexport */ ToggleTemplate),\n "Toolbar": () => (/* reexport */ Toolbar),\n "ToolbarContent": () => (/* reexport */ ToolbarContent),\n "ToolbarContentContext": () => (/* reexport */ ToolbarContentContext),\n "ToolbarContext": () => (/* reexport */ ToolbarContext),\n "ToolbarExpandIconWrapper": () => (/* reexport */ ToolbarExpandIconWrapper),\n "ToolbarFilter": () => (/* reexport */ ToolbarFilter),\n "ToolbarGroup": () => (/* reexport */ ToolbarGroup),\n "ToolbarGroupVariant": () => (/* reexport */ ToolbarGroupVariant),\n "ToolbarItem": () => (/* reexport */ ToolbarItem),\n "ToolbarItemVariant": () => (/* reexport */ ToolbarItemVariant),\n "ToolbarToggleGroup": () => (/* reexport */ ToolbarToggleGroup),\n "Tooltip": () => (/* reexport */ Tooltip),\n "TooltipPosition": () => (/* reexport */ TooltipPosition),\n "TreeView": () => (/* reexport */ TreeView),\n "TreeViewSearch": () => (/* reexport */ TreeViewSearch),\n "Truncate": () => (/* reexport */ Truncate),\n "TruncatePosition": () => (/* reexport */ TruncatePosition),\n "ValidatedOptions": () => (/* reexport */ ValidatedOptions),\n "Weekday": () => (/* reexport */ Weekday),\n "Wizard": () => (/* reexport */ Wizard),\n "WizardBody": () => (/* reexport */ WizardBody),\n "WizardContext": () => (/* reexport */ WizardContext),\n "WizardContextConsumer": () => (/* reexport */ WizardContextConsumer),\n "WizardContextProvider": () => (/* reexport */ WizardContextProvider),\n "WizardFooter": () => (/* reexport */ WizardFooter),\n "WizardHeader": () => (/* reexport */ WizardHeader),\n "WizardNav": () => (/* reexport */ WizardNav),\n "WizardNavItem": () => (/* reexport */ WizardNavItem),\n "WizardToggle": () => (/* reexport */ WizardToggle),\n "canUseDOM": () => (/* reexport */ canUseDOM),\n "capitalize": () => (/* reexport */ capitalize),\n "clipboardCopyFunc": () => (/* reexport */ clipboardCopyFunc),\n "debounce": () => (/* reexport */ debounce),\n "fillTemplate": () => (/* reexport */ fillTemplate),\n "findTabbableElements": () => (/* reexport */ findTabbableElements),\n "formatBreakpointMods": () => (/* reexport */ formatBreakpointMods),\n "getBreakpoint": () => (/* reexport */ getBreakpoint),\n "getDefaultOUIAId": () => (/* reexport */ getDefaultOUIAId),\n "getNextIndex": () => (/* reexport */ getNextIndex),\n "getOUIAProps": () => (/* reexport */ getOUIAProps),\n "getOpacityTransition": () => (/* reexport */ getOpacityTransition),\n "getResizeObserver": () => (/* reexport */ getResizeObserver),\n "getTextWidth": () => (/* reexport */ getTextWidth),\n "getUniqueId": () => (/* reexport */ getUniqueId),\n "globalBreakpoints": () => (/* reexport */ globalBreakpoints),\n "handleArrows": () => (/* reexport */ handleArrows),\n "innerDimensions": () => (/* reexport */ innerDimensions),\n "isElementInView": () => (/* reexport */ isElementInView),\n "isValidDate": () => (/* reexport */ isValidDate),\n "keyHandler": () => (/* reexport */ keyHandler),\n "navContextDefaults": () => (/* reexport */ navContextDefaults),\n "pageContextDefaults": () => (/* reexport */ pageContextDefaults),\n "pageSidebarContextDefaults": () => (/* reexport */ pageSidebarContextDefaults),\n "pluralize": () => (/* reexport */ pluralize),\n "preventedEvents": () => (/* reexport */ preventedEvents),\n "setBreakpointCssVars": () => (/* reexport */ setBreakpointCssVars),\n "setTabIndex": () => (/* reexport */ setTabIndex),\n "sideElementIsOutOfView": () => (/* reexport */ sideElementIsOutOfView),\n "spinnerSize": () => (/* reexport */ spinnerSize),\n "toCamel": () => (/* reexport */ toCamel),\n "trimLeft": () => (/* reexport */ trimLeft),\n "useIsomorphicLayoutEffect": () => (/* reexport */ useIsomorphicLayoutEffect),\n "useOUIAId": () => (/* reexport */ useOUIAId),\n "useOUIAProps": () => (/* reexport */ useOUIAProps),\n "variantIcons": () => (/* reexport */ NotificationDrawerListItemHeader_variantIcons),\n "yyyyMMddFormat": () => (/* reexport */ yyyyMMddFormat)\n});\n\n// EXTERNAL MODULE: ./node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(655);\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(7294);\n// EXTERNAL MODULE: ./node_modules/react-dom/index.js\nvar react_dom = __webpack_require__(3935);\n// EXTERNAL MODULE: ./node_modules/@patternfly/react-styles/dist/esm/index.js\nvar esm = __webpack_require__(8296);\n// EXTERNAL MODULE: ./node_modules/@patternfly/react-styles/css/components/Backdrop/backdrop.js\nvar backdrop = __webpack_require__(792);\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-core/dist/esm/helpers/constants.js\nconst KEY_CODES = { ARROW_UP: 38, ARROW_DOWN: 40, ESCAPE_KEY: 27, TAB: 9, ENTER: 13, SPACE: 32 };\nconst SIDE = { RIGHT: \'right\', LEFT: \'left\', BOTH: \'both\', NONE: \'none\' };\nconst KEYHANDLER_DIRECTION = { UP: \'up\', DOWN: \'down\', RIGHT: \'right\', LEFT: \'left\' };\nvar ValidatedOptions;\n(function (ValidatedOptions) {\n ValidatedOptions["success"] = "success";\n ValidatedOptions["error"] = "error";\n ValidatedOptions["warning"] = "warning";\n ValidatedOptions["default"] = "default";\n})(ValidatedOptions || (ValidatedOptions = {}));\nconst KeyTypes = {\n Tab: \'Tab\',\n Space: \' \',\n Escape: \'Escape\',\n Enter: \'Enter\',\n ArrowUp: \'ArrowUp\',\n ArrowDown: \'ArrowDown\',\n ArrowLeft: \'ArrowLeft\',\n ArrowRight: \'ArrowRight\'\n};\n//# sourceMappingURL=constants.js.map\n;// CONCATENATED MODULE: ./node_modules/@patternfly/react-core/dist/esm/helpers/util.js\n\n\n/**\n * @param {string} input - String to capitalize first letter\n */\nfunction capitalize(input) {\n return input[0].toUpperCase() + input.substring(1);\n}\n/**\n * @param {string} prefix - String to prefix ID with\n */\nfunction getUniqueId(prefix = \'pf\') {\n const uid = new Date().getTime() +\n Math.random()\n .toString(36)\n .slice(2);\n return `${prefix}-${uid}`;\n}\n/**\n * @param { any } this - "This" reference\n * @param { Function } func - Function to debounce\n * @param { number } wait - Debounce amount\n */\nfunction debounce(func, wait) {\n let timeout;\n return (...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func.apply(this, args), wait);\n };\n}\n/** This function returns whether or not an element is within the viewable area of a container. If partial is true,\n * then this function will return true even if only part of the element is in view.\n *\n * @param {HTMLElement} container The container to check if the element is in view of.\n * @param {HTMLElement} element The element to check if it is view\n * @param {boolean} partial true if partial view is allowed\n * @param {boolean} strict true if strict mode is set, never consider the container width and element width\n *\n * @returns { boolean } True if the component is in View.\n */\nfunction isElementInView(container, element, partial, strict = false) {\n if (!container || !element) {\n return false;\n }\n const containerBounds = container.getBoundingClientRect();\n const elementBounds = element.getBoundingClientRect();\n const containerBoundsLeft = Math.ceil(containerBounds.left);\n const containerBoundsRight = Math.floor(containerBounds.right);\n const elementBoundsLeft = Math.ceil(elementBounds.left);\n const elementBoundsRight = Math.floor(elementBounds.right);\n // Check if in view\n const isTotallyInView = elementBoundsLeft >= containerBoundsLeft && elementBoundsRight <= containerBoundsRight;\n const isPartiallyInView = (partial || (!strict && containerBounds.width < elementBounds.width)) &&\n ((elementBoundsLeft < containerBoundsLeft && elementBoundsRight > containerBoundsLeft) ||\n (elementBoundsRight > containerBoundsRight && elementBoundsLeft < containerBoundsRight));\n // Return outcome\n return isTotallyInView || isPartiallyInView;\n}\n/** This function returns the side the element is out of view on (right, left or both)\n *\n * @param {HTMLElement} container The container to check if the element is in view of.\n * @param {HTMLElement} element The element to check if it is view\n *\n * @returns {string} right if the element is of the right, left if element is off the left or both if it is off on both sides.\n */\nfunction sideElementIsOutOfView(container, element) {\n const containerBounds = container.getBoundingClientRect();\n const elementBounds = element.getBoundingClientRect();\n const containerBoundsLeft = Math.floor(containerBounds.left);\n const containerBoundsRight = Math.floor(containerBounds.right);\n const elementBoundsLeft = Math.floor(elementBounds.left);\n const elementBoundsRight = Math.floor(elementBounds.right);\n // Check if in view\n const isOffLeft = elementBoundsLeft < containerBoundsLeft;\n const isOffRight = elementBoundsRight > containerBoundsRight;\n let side = SIDE.NONE;\n if (isOffRight && isOffLeft) {\n side = SIDE.BOTH;\n }\n else if (isOffRight) {\n side = SIDE.RIGHT;\n }\n else if (isOffLeft) {\n side = SIDE.LEFT;\n }\n // Return outcome\n return side;\n}\n/** Interpolates a parameterized templateString using values from a templateVars object.\n * The templateVars object should have keys and values which match the templateString\'s parameters.\n * Example:\n * const templateString: \'My name is ${firstName} ${lastName}\';\n * const templateVars: {\n * firstName: \'Jon\'\n * lastName: \'Dough\'\n * };\n * const result = fillTemplate(templateString, templateVars);\n * // "My name is Jon Dough"\n *\n * @param {string} templateString The string passed by the consumer\n * @param {object} templateVars The variables passed to the string\n *\n * @returns {string} The template string literal result\n */\nfunction fillTemplate(templateString, templateVars) {\n return templateString.replace(/\\${(.*?)}/g, (_, match) => templateVars[match] || \'\');\n}\n/**\n * This function allows for keyboard navigation through dropdowns. The custom argument is optional.\n *\n * @param {number} index The index of the element you\'re on\n * @param {number} innerIndex Inner index number\n * @param {string} position The orientation of the dropdown\n * @param {string[]} refsCollection Array of refs to the items in the dropdown\n * @param {object[]} kids Array of items in the dropdown\n * @param {boolean} [custom] Allows for handling of flexible content\n */\nfunction keyHandler(index, innerIndex, position, refsCollection, kids, custom = false) {\n if (!Array.isArray(kids)) {\n return;\n }\n const isMultiDimensional = refsCollection.filter(ref => ref)[0].constructor === Array;\n let nextIndex = index;\n let nextInnerIndex = innerIndex;\n if (position === \'up\') {\n if (index === 0) {\n // loop back to end\n nextIndex = kids.length - 1;\n }\n else {\n nextIndex = index - 1;\n }\n }\n else if (position === \'down\') {\n if (index === kids.length - 1) {\n // loop back to beginning\n nextIndex = 0;\n }\n else {\n nextIndex = index + 1;\n }\n }\n else if (position === \'left\') {\n if (innerIndex === 0) {\n nextInnerIndex = refsCollection[index].length - 1;\n }\n else {\n nextInnerIndex = innerIndex - 1;\n }\n }\n else if (position === \'right\') {\n if (innerIndex === refsCollection[index].length - 1) {\n nextInnerIndex = 0;\n }\n else {\n nextInnerIndex = innerIndex + 1;\n }\n }\n if (refsCollection[nextIndex] === null ||\n refsCollection[nextIndex] === undefined ||\n (isMultiDimensional &&\n (refsCollection[nextIndex][nextInnerIndex] === null || refsCollection[nextIndex][nextInnerIndex] === undefined))) {\n keyHandler(nextIndex, nextInnerIndex, position, refsCollection, kids, custom);\n }\n else if (custom) {\n if (refsCollection[nextIndex].focus) {\n refsCollection[nextIndex].focus();\n }\n // eslint-disable-next-line react/no-find-dom-node\n const element = react_dom.findDOMNode(refsCollection[nextIndex]);\n element.focus();\n }\n else if (position !== \'tab\') {\n if (isMultiDimensional) {\n refsCollection[nextIndex][nextInnerIndex].focus();\n }\n else {\n refsCollection[nextIndex].focus();\n }\n }\n}\n/** This function returns a list of tabbable items in a container\n *\n * @param {any} containerRef to the container\n * @param {string} tababbleSelectors CSS selector string of tabbable items\n */\nfunction findTabbableElements(containerRef, tababbleSelectors) {\n const tabbable = containerRef.current.querySelectorAll(tababbleSelectors);\n const list = Array.prototype.filter.call(tabbable, function (item) {\n return item.tabIndex >= \'0\';\n });\n return list;\n}\n/** This function is a helper for keyboard navigation through dropdowns.\n *\n * @param {number} index The index of the element you\'re on\n * @param {string} position The orientation of the dropdown\n * @param {string[]} collection Array of refs to the items in the dropdown\n */\nfunction getNextIndex(index, position, collection) {\n let nextIndex;\n if (position === \'up\') {\n if (index === 0) {\n // loop back to end\n nextIndex = collection.length - 1;\n }\n else {\n nextIndex = index - 1;\n }\n }\n else if (index === collection.length - 1) {\n // loop back to beginning\n nextIndex = 0;\n }\n else {\n nextIndex = index + 1;\n }\n if (collection[nextIndex] === undefined || collection[nextIndex][0] === null) {\n return getNextIndex(nextIndex, position, collection);\n }\n else {\n return nextIndex;\n }\n}\n/** This function is a helper for pluralizing strings.\n *\n * @param {number} i The quantity of the string you want to pluralize\n * @param {string} singular The singular version of the string\n * @param {string} plural The change to the string that should occur if the quantity is not equal to 1.\n * Defaults to adding an \'s\'.\n */\nfunction pluralize(i, singular, plural) {\n if (!plural) {\n plural = `${singular}s`;\n }\n return `${i || 0} ${i === 1 ? singular : plural}`;\n}\n/**\n * This function is a helper for turning arrays of breakpointMod objects for flex and grid into style object\n *\n * @param {object} mods The modifiers object\n * @param {string} css-variable The appropriate css variable for the component\n */\nconst setBreakpointCssVars = (mods, cssVar) => Object.entries(mods || {}).reduce((acc, [breakpoint, value]) => breakpoint === \'default\' ? Object.assign(Object.assign({}, acc), { [cssVar]: value }) : Object.assign(Object.assign({}, acc), { [`${cssVar}-on-${breakpoint}`]: value }), {});\n/**\n * This function is a helper for turning arrays of breakpointMod objects for data toolbar and flex into classes\n *\n * @param {object} mods The modifiers object\n * @param {any} styles The appropriate styles object for the component\n */\nconst formatBreakpointMods = (mods, styles, stylePrefix = \'\', breakpoint) => {\n if (!mods) {\n return \'\';\n }\n if (breakpoint) {\n if (breakpoint in mods) {\n return styles.modifiers[toCamel(`${stylePrefix}${mods[breakpoint]}`)];\n }\n // the current breakpoint is not specified in mods, so we try to find the next nearest\n const breakpointsOrder = [\'2xl\', \'xl\', \'lg\', \'md\', \'sm\', \'default\'];\n const breakpointsIndex = breakpointsOrder.indexOf(breakpoint);\n for (let i = breakpointsIndex; i < breakpointsOrder.length; i++) {\n if (breakpointsOrder[i] in mods) {\n return styles.modifiers[toCamel(`${stylePrefix}${mods[breakpointsOrder[i]]}`)];\n }\n }\n return \'\';\n }\n return Object.entries(mods || {})\n .map(([breakpoint, mod]) => `${stylePrefix}${mod}${breakpoint !== \'default\' ? `-on-${breakpoint}` : \'\'}`)\n .map(toCamel)\n .map(mod => mod.replace(/-?(\\dxl)/gi, (_res, group) => `_${group}`))\n .map(modifierKey => styles.modifiers[modifierKey])\n .filter(Boolean)\n .join(\' \');\n};\n/**\n * Return the breakpoint for the given width\n *\n * @param {number | null} width The width to check\n * @returns {\'default\' | \'sm\' | \'md\' | \'lg\' | \'xl\' | \'2xl\'} The breakpoint\n */\nconst getBreakpoint = (width) => {\n if (width === null) {\n return null;\n }\n if (width >= 1450) {\n return \'2xl\';\n }\n if (width >= 1200) {\n return \'xl\';\n }\n if (width >= 992) {\n return \'lg\';\n }\n if (width >= 768) {\n return \'md\';\n }\n if (width >= 576) {\n return \'sm\';\n }\n return \'default\';\n};\nconst camelize = (s) => s\n .toUpperCase()\n .replace(\'-\', \'\')\n .replace(\'_\', \'\');\n/**\n *\n * @param {string} s string to make camelCased\n */\nconst toCamel = (s) => s.replace(/([-_][a-z])/gi, camelize);\n/**\n * Copied from exenv\n */\nconst canUseDOM = !!(typeof window !== \'undefined\' && window.document && window.document.createElement);\n/**\n * Calculate the width of the text\n * Example:\n * getTextWidth(\'my text\', node)\n *\n * @param {string} text The text to calculate the width for\n * @param {HTMLElement} node The HTML element\n */\nconst getTextWidth = (text, node) => {\n const computedStyle = getComputedStyle(node);\n // Firefox returns the empty string for .font, so this function creates the .font property manually\n const getFontFromComputedStyle = () => {\n let computedFont = \'\';\n // Firefox uses percentages for font-stretch, but Canvas does not accept percentages\n // so convert to keywords, as listed at:\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font-stretch\n const fontStretchLookupTable = {\n \'50%\': \'ultra-condensed\',\n \'62.5%\': \'extra-condensed\',\n \'75%\': \'condensed\',\n \'87.5%\': \'semi-condensed\',\n \'100%\': \'normal\',\n \'112.5%\': \'semi-expanded\',\n \'125%\': \'expanded\',\n \'150%\': \'extra-expanded\',\n \'200%\': \'ultra-expanded\'\n };\n // If the retrieved font-stretch percentage isn\'t found in the lookup table, use\n // \'normal\' as a last resort.\n let fontStretch;\n if (computedStyle.fontStretch in fontStretchLookupTable) {\n fontStretch = fontStretchLookupTable[computedStyle.fontStretch];\n }\n else {\n fontStretch = \'normal\';\n }\n computedFont =\n computedStyle.fontStyle +\n \' \' +\n computedStyle.fontVariant +\n \' \' +\n computedStyle.fontWeight +\n \' \' +\n fontStretch +\n \' \' +\n computedStyle.fontSize +\n \'/\' +\n computedStyle.lineHeight +\n \' \' +\n computedStyle.fontFamily;\n return computedFont;\n };\n const canvas = document.createElement(\'canvas\');\n const context = canvas.getContext(\'2d\');\n context.font = computedStyle.font || getFontFromComputedStyle();\n return context.measureText(text).width;\n};\n/**\n * Get the inner dimensions of an element\n *\n * @param {HTMLElement} node HTML element to calculate the inner dimensions for\n */\nconst innerDimensions = (node) => {\n const computedStyle = getComputedStyle(node);\n let width = node.clientWidth; // width with padding\n let height = node.clientHeight; // height with padding\n height -= parseFloat(computedStyle.paddingTop) + parseFloat(computedStyle.paddingBottom);\n width -= parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight);\n return { height, width };\n};\n/**\n * This function is a helper for truncating text content on the left, leaving the right side of the content in view\n *\n * @param {HTMLElement} node HTML element\n * @param {string} value The original text value\n */\nconst trimLeft = (node, value) => {\n const availableWidth = innerDimensions(node).width;\n let newValue = value;\n if (getTextWidth(value, node) > availableWidth) {\n // we have text overflow, trim the text to the left and add ... in the front until it fits\n while (getTextWidth(`...${newValue}`, node) > availableWidth) {\n newValue = newValue.substring(1);\n }\n // replace text with our truncated text\n if (node.value) {\n node.value = `...${newValue}`;\n }\n else {\n node.innerText = `...${newValue}`;\n }\n }\n else {\n if (node.value) {\n node.value = value;\n }\n else {\n node.innerText = value;\n }\n }\n};\n/**\n * @param {string[]} events - Operations to prevent when disabled\n */\nconst preventedEvents = (events) => events.reduce((handlers, eventToPrevent) => (Object.assign(Object.assign({}, handlers), { [eventToPrevent]: (event) => {\n event.preventDefault();\n } })), {});\n//# sourceMappingURL=util.js.map\n// EXTERNAL MODULE: ./node_modules/@patternfly/react-styles/css/layouts/Bullseye/bullseye.js\nvar bullseye = __webpack_require__(5687);\n;// CONCATENATED MODULE: ./node_modules/tabbable/dist/index.esm.js\n/*!\n* tabbable 5.2.1\n* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE\n*/\nvar candidateSelectors = [\'input\', \'select\', \'textarea\', \'a[href]\', \'button\', \'[tabindex]\', \'audio[controls]\', \'video[controls]\', \'[contenteditable]:not([contenteditable="false"])\', \'details>summary:first-of-type\', \'details\'];\nvar candidateSelector = /* #__PURE__ */candidateSelectors.join(\',\');\nvar matches = typeof Element === \'undefined\' ? function () {} : Element.prototype.matches || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n\nvar getCandidates = function getCandidates(el, includeContainer, filter) {\n var candidates = Array.prototype.slice.apply(el.querySelectorAll(candidateSelector));\n\n if (includeContainer && matches.call(el, candidateSelector)) {\n candidates.unshift(el);\n }\n\n candidates = candidates.filter(filter);\n return candidates;\n};\n\nvar isContentEditable = function isContentEditable(node) {\n return node.contentEditable === \'true\';\n};\n\nvar getTabindex = function getTabindex(node) {\n var tabindexAttr = parseInt(node.getAttribute(\'tabindex\'), 10);\n\n if (!isNaN(tabindexAttr)) {\n return tabindexAttr;\n } // Browsers do not return `tabIndex` correctly for contentEditable nodes;\n // so if they don\'t have a tabindex attribute specifically set, assume it\'s 0.\n\n\n if (isContentEditable(node)) {\n return 0;\n } // in Chrome,
,