UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

275 lines (272 loc) 57.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.StyledColorSelectorWrapper = exports.PanelLabelWrapper = void 0; exports["default"] = EffectConfiguratorFactory; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components")); var _reactIntl = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react-intl"); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/constants/src"); var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src"); var _rangeSlider = _interopRequireDefault(require("../common/range-slider")); var _icons = require("../common/icons"); var _effectTimeConfigurator = _interopRequireDefault(require("./effect-time-configurator")); var _compactColorPicker = _interopRequireDefault(require("./compact-color-picker")); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var StyledEffectConfigurator = _styledComponents["default"].div.attrs({ className: 'effect-panel__config' })(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n margin: ", ";\n padding: ", ";\n"])), function (props) { return props.theme.effectConfiguratorMargin; }, function (props) { return props.theme.effectConfiguratorPadding; }); var PanelLabelWrapper = exports.PanelLabelWrapper = _styledComponents["default"].div.attrs({ className: 'side-panel-panel__label-wrapper' })(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: self-start;\n margin-bottom: 11px;\n\n .side-panel-panel__label {\n margin-top: 2px;\n margin-bottom: 0px;\n }\n"]))); var StyledColorSelectorWrapper = exports.StyledColorSelectorWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-right: 5px;\n margin-left: 5px;\n margin-bottom: 6px;\n margin-top: 2px;\n"]))); var StyledVerticalSeparator = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n height: 1px;\n background-color: ", ";\n margin-top: 20px;\n margin-bottom: 20px;\n margin-left: -20px;\n"])), function (props) { return props.theme.inputBgd; }); var StyledWrapper = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: ", "px;\n"])), function (props) { var _props$marginBottom; return (_props$marginBottom = props.marginBottom) !== null && _props$marginBottom !== void 0 ? _props$marginBottom : 9; }); var StyledConfigSection = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n"]))); var SectionTitle = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: ", ";\n color: ", ";\n margin-bottom: 5px;\n text-transform: capitalize;\n"])), function (props) { return props.theme.inputFontSize; }, function (props) { return props.theme.effectPanelTextSecondary1; }); var SectionSubTitle = _styledComponents["default"].div(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: ", ";\n color: ", ";\n margin-bottom: 8px;\n margin-left: 6px;\n"])), function (props) { return props.theme.inputFontSize; }, function (props) { return props.theme.effectPanelTextSecondary2; }); var StyleSliderWrapper = _styledComponents["default"].div(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["\n align-self: flex-start;\n width: 199px;\n height: 32px;\n display: flex;\n align-items: center;\n .kg-range-slider__input {\n height: 32px;\n text-align: center;\n padding: 3px 6px;\n }\n .kg-slider {\n padding-left: 6px;\n }\n .kg-range-slider {\n padding: 0px !important;\n }\n"]))); var RegularOuterWrapper = _styledComponents["default"].div.attrs({ className: 'effect-configurator__pp-section' })(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 8px;\n"]))); var RegularSectionTitleWrapper = _styledComponents["default"].div.attrs({ className: 'effect-configurator__pp-section-title' })(_templateObject11 || (_templateObject11 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: ", ";\n color: ", ";\n text-transform: capitalize;\n margin-bottom: -3px;\n"])), function (props) { return props.theme.inputFontSize; }, function (props) { return props.theme.effectPanelTextSecondary1; }); var RegularSliderWrapper = _styledComponents["default"].div.attrs({ className: 'effect-configurator__pp-section-control' })(_templateObject12 || (_templateObject12 = (0, _taggedTemplateLiteral2["default"])(["\n height: 32px;\n .kg-range-slider__input {\n height: 32px;\n text-align: center;\n padding: 3px 6px;\n }\n .kg-slider {\n padding-left: 6px;\n }\n .kg-range-slider {\n padding: 0px !important;\n }\n"]))); var COMMON_SLIDER_PROPS = { showInput: true, isRanged: false, step: 0.001, label: 'value' }; EffectConfiguratorFactory.deps = [_rangeSlider["default"], _effectTimeConfigurator["default"]]; function EffectConfiguratorFactory(RangeSlider, EffectTimeConfigurator) { var ShadowEffectConfigurator = function ShadowEffectConfigurator(_ref) { var effect = _ref.effect, updateEffectConfig = _ref.updateEffectConfig; var parameters = effect.parameters, id = effect.id; var sliderProps = (0, _react.useMemo)(function () { var propNames = ['shadowIntensity', 'ambientLightIntensity', 'sunLightIntensity']; return propNames.map(function (propName) { return { value1: parameters[propName], range: [0, 1], value0: 0, onChange: function onChange(value, event) { updateEffectConfig(event, id, { parameters: (0, _defineProperty2["default"])({}, propName, value[1]) }); } }; }); }, [id, parameters, updateEffectConfig]); var onTimeParametersChanged = (0, _react.useCallback)(function (parameters) { updateEffectConfig(null, id, { parameters: _objectSpread(_objectSpread(_objectSpread({}, parameters.timestamp ? { timestamp: parameters.timestamp } : null), parameters.timezone ? { timezone: parameters.timezone } : null), parameters.timeMode ? { timeMode: parameters.timeMode } : null) }); }, [id, updateEffectConfig]); var colorPickerProps = (0, _react.useMemo)(function () { var propNames = ['ambientLightColor', 'sunLightColor', 'shadowColor']; return propNames.map(function (propName) { return { colorSets: [{ selectedColor: parameters[propName], setColor: function setColor(v) { return updateEffectConfig(null, id, { parameters: (0, _defineProperty2["default"])({}, propName, v) }); } }] }; }); }, [id, parameters, updateEffectConfig]); return /*#__PURE__*/_react["default"].createElement(StyledEffectConfigurator, { key: effect.id }, /*#__PURE__*/_react["default"].createElement(PanelLabelWrapper, null, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, 'Date & Time')), /*#__PURE__*/_react["default"].createElement(EffectTimeConfigurator, { timestamp: parameters.timestamp, timezone: parameters.timezone, timeMode: parameters.timeMode, onChange: onTimeParametersChanged }), /*#__PURE__*/_react["default"].createElement(StyledVerticalSeparator, null), /*#__PURE__*/_react["default"].createElement(StyledWrapper, { marginBottom: 0 }, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, 'Shadow')), /*#__PURE__*/_react["default"].createElement(StyledWrapper, { marginBottom: 16 }, /*#__PURE__*/_react["default"].createElement(_compactColorPicker["default"], { label: 'Color', color: colorPickerProps[2].colorSets[0].selectedColor, onSetColor: colorPickerProps[2].colorSets[0].setColor, Icon: _icons.ArrowDownSmall }), /*#__PURE__*/_react["default"].createElement(StyledConfigSection, null, /*#__PURE__*/_react["default"].createElement(SectionSubTitle, null, "Intensity"), /*#__PURE__*/_react["default"].createElement(StyleSliderWrapper, null, /*#__PURE__*/_react["default"].createElement(RangeSlider, (0, _extends2["default"])({}, COMMON_SLIDER_PROPS, sliderProps[0]))))), /*#__PURE__*/_react["default"].createElement(StyledWrapper, { marginBottom: 0 }, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, 'Ambient light')), /*#__PURE__*/_react["default"].createElement(StyledWrapper, { marginBottom: 16 }, /*#__PURE__*/_react["default"].createElement(_compactColorPicker["default"], { label: 'Color', color: colorPickerProps[0].colorSets[0].selectedColor, onSetColor: colorPickerProps[0].colorSets[0].setColor, Icon: _icons.ArrowDownSmall }), /*#__PURE__*/_react["default"].createElement(StyledConfigSection, null, /*#__PURE__*/_react["default"].createElement(SectionSubTitle, null, "Intensity"), /*#__PURE__*/_react["default"].createElement(StyleSliderWrapper, null, /*#__PURE__*/_react["default"].createElement(RangeSlider, (0, _extends2["default"])({}, COMMON_SLIDER_PROPS, sliderProps[1]))))), /*#__PURE__*/_react["default"].createElement(StyledWrapper, { marginBottom: 0 }, /*#__PURE__*/_react["default"].createElement(SectionTitle, null, 'Sun light')), /*#__PURE__*/_react["default"].createElement(StyledWrapper, { marginBottom: 0 }, /*#__PURE__*/_react["default"].createElement(_compactColorPicker["default"], { label: 'Color', color: colorPickerProps[1].colorSets[0].selectedColor, onSetColor: colorPickerProps[1].colorSets[0].setColor, Icon: _icons.ArrowDownSmall }), /*#__PURE__*/_react["default"].createElement(StyledConfigSection, null, /*#__PURE__*/_react["default"].createElement(SectionSubTitle, null, "Intensity"), /*#__PURE__*/_react["default"].createElement(StyleSliderWrapper, null, /*#__PURE__*/_react["default"].createElement(RangeSlider, (0, _extends2["default"])({}, COMMON_SLIDER_PROPS, sliderProps[2])))))); }; var defaultUniforms = {}; var PostProcessingEffectConfigurator = function PostProcessingEffectConfigurator(_ref2) { var _effect$deckEffect; var effect = _ref2.effect, updateEffectConfig = _ref2.updateEffectConfig; var uniforms = ((_effect$deckEffect = effect.deckEffect) === null || _effect$deckEffect === void 0 ? void 0 : _effect$deckEffect.module.uniforms) || defaultUniforms; var parameterDescriptions = effect.getParameterDescriptions(); var parameters = effect.parameters, id = effect.id; var flatParameterDescriptions = (0, _react.useMemo)(function () { return parameterDescriptions.reduce(function (acc, description) { if (description.type === 'array') { // split arrays of controls into a separate controls for each component if (Array.isArray(description.defaultValue)) { description.defaultValue.forEach(function (_, index) { var _description$label; acc.push(_objectSpread(_objectSpread({}, description), {}, { index: index, label: (_description$label = description.label) === null || _description$label === void 0 ? void 0 : _description$label[index] })); }); } } else { acc.push(description); } return acc; }, []); }, [parameterDescriptions]); var controls = (0, _react.useMemo)(function () { return flatParameterDescriptions.map(function (desc) { var paramName = desc.name; var uniform = uniforms[desc.name]; if (!uniform && uniform !== 0 || uniform["private"]) { return null; } var prevValue = parameters[paramName]; var label = desc.label === false ? false : desc.label || desc.name; // the uniform is [number, number] array if (uniform.length === 2) { return { label: label, value1: prevValue[desc.index || 0] || 0, range: [0, 1], value0: 0, onChange: function onChange(newValue, event) { updateEffectConfig(event, id, { parameters: (0, _defineProperty2["default"])({}, paramName, desc.index === 0 ? [newValue[1], prevValue[1]] : [prevValue[0], newValue[1]]) }); } }; } // the uniform is a plain number without any description else if ((0, _src2.isNumber)(uniform)) { var _desc$min, _desc$max, _desc$min2; return { label: label, value1: prevValue !== null && prevValue !== void 0 ? prevValue : 0, range: [(_desc$min = desc.min) !== null && _desc$min !== void 0 ? _desc$min : 0, (_desc$max = desc.max) !== null && _desc$max !== void 0 ? _desc$max : 500], value0: (_desc$min2 = desc.min) !== null && _desc$min2 !== void 0 ? _desc$min2 : 0, onChange: function onChange(newValue, event) { updateEffectConfig(event, id, { parameters: (0, _defineProperty2["default"])({}, paramName, newValue[1]) }); } }; } // the uniform description is {value: 0, min: 0, max: 1, ...} else if ((0, _src2.isNumber)(uniform.value)) { var _ref3, _ref4, _desc$min3, _ref5, _ref6, _desc$max2, _ref7, _ref8, _desc$min4; return { label: label, value1: prevValue || 0, range: [(_ref3 = (_ref4 = (_desc$min3 = desc.min) !== null && _desc$min3 !== void 0 ? _desc$min3 : uniform.min) !== null && _ref4 !== void 0 ? _ref4 : uniform.softMin) !== null && _ref3 !== void 0 ? _ref3 : 0, (_ref5 = (_ref6 = (_desc$max2 = desc.max) !== null && _desc$max2 !== void 0 ? _desc$max2 : uniform.max) !== null && _ref6 !== void 0 ? _ref6 : uniform.softMax) !== null && _ref5 !== void 0 ? _ref5 : 1], value0: (_ref7 = (_ref8 = (_desc$min4 = desc.min) !== null && _desc$min4 !== void 0 ? _desc$min4 : uniform.min) !== null && _ref8 !== void 0 ? _ref8 : uniform.softMin) !== null && _ref7 !== void 0 ? _ref7 : 0, onChange: function onChange(newValue, event) { updateEffectConfig(event, id, { parameters: (0, _defineProperty2["default"])({}, paramName, newValue[1]) }); } }; } // ignore everything else for now return null; }); }, [flatParameterDescriptions, id, parameters, updateEffectConfig, uniforms]); return /*#__PURE__*/_react["default"].createElement(StyledEffectConfigurator, { key: effect.id }, flatParameterDescriptions.map(function (desc, parameterIndex) { var control = controls[parameterIndex]; if (!control) { return null; } return /*#__PURE__*/_react["default"].createElement(RegularOuterWrapper, { key: "".concat(effect.id, "-").concat(parameterIndex) }, control.label ? /*#__PURE__*/_react["default"].createElement(RegularSectionTitleWrapper, null, control.label) : null, /*#__PURE__*/_react["default"].createElement(RegularSliderWrapper, null, /*#__PURE__*/_react["default"].createElement(RangeSlider, (0, _extends2["default"])({ key: parameterIndex }, COMMON_SLIDER_PROPS, control)))); })); }; var EffectConfigurator = function EffectConfigurator(_ref9) { var effect = _ref9.effect, updateEffectConfig = _ref9.updateEffectConfig; return effect.type === _src.LIGHT_AND_SHADOW_EFFECT.type ? /*#__PURE__*/_react["default"].createElement(ShadowEffectConfigurator, { effect: effect, updateEffectConfig: updateEffectConfig }) : /*#__PURE__*/_react["default"].createElement(PostProcessingEffectConfigurator, { effect: effect, updateEffectConfig: updateEffectConfig }); }; return (0, _reactIntl.injectIntl)(EffectConfigurator); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3RJbnRsIiwiX3NyYyIsIl9zcmMyIiwiX3JhbmdlU2xpZGVyIiwiX2ljb25zIiwiX2VmZmVjdFRpbWVDb25maWd1cmF0b3IiLCJfY29tcGFjdENvbG9yUGlja2VyIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfdGVtcGxhdGVPYmplY3Q0IiwiX3RlbXBsYXRlT2JqZWN0NSIsIl90ZW1wbGF0ZU9iamVjdDYiLCJfdGVtcGxhdGVPYmplY3Q3IiwiX3RlbXBsYXRlT2JqZWN0OCIsIl90ZW1wbGF0ZU9iamVjdDkiLCJfdGVtcGxhdGVPYmplY3QxMCIsIl90ZW1wbGF0ZU9iamVjdDExIiwiX3RlbXBsYXRlT2JqZWN0MTIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJTdHlsZWRFZmZlY3RDb25maWd1cmF0b3IiLCJzdHlsZWQiLCJkaXYiLCJhdHRycyIsImNsYXNzTmFtZSIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJ0aGVtZSIsImVmZmVjdENvbmZpZ3VyYXRvck1hcmdpbiIsImVmZmVjdENvbmZpZ3VyYXRvclBhZGRpbmciLCJQYW5lbExhYmVsV3JhcHBlciIsImV4cG9ydHMiLCJTdHlsZWRDb2xvclNlbGVjdG9yV3JhcHBlciIsIlN0eWxlZFZlcnRpY2FsU2VwYXJhdG9yIiwiaW5wdXRCZ2QiLCJTdHlsZWRXcmFwcGVyIiwiX3Byb3BzJG1hcmdpbkJvdHRvbSIsIm1hcmdpbkJvdHRvbSIsIlN0eWxlZENvbmZpZ1NlY3Rpb24iLCJTZWN0aW9uVGl0bGUiLCJpbnB1dEZvbnRTaXplIiwiZWZmZWN0UGFuZWxUZXh0U2Vjb25kYXJ5MSIsIlNlY3Rpb25TdWJUaXRsZSIsImVmZmVjdFBhbmVsVGV4dFNlY29uZGFyeTIiLCJTdHlsZVNsaWRlcldyYXBwZXIiLCJSZWd1bGFyT3V0ZXJXcmFwcGVyIiwiUmVndWxhclNlY3Rpb25UaXRsZVdyYXBwZXIiLCJSZWd1bGFyU2xpZGVyV3JhcHBlciIsIkNPTU1PTl9TTElERVJfUFJPUFMiLCJzaG93SW5wdXQiLCJpc1JhbmdlZCIsInN0ZXAiLCJsYWJlbCIsIkVmZmVjdENvbmZpZ3VyYXRvckZhY3RvcnkiLCJkZXBzIiwiUmFuZ2VTbGlkZXJGYWN0b3J5IiwiRWZmZWN0VGltZUNvbmZpZ3VyYXRvckZhY3RvcnkiLCJSYW5nZVNsaWRlciIsIkVmZmVjdFRpbWVDb25maWd1cmF0b3IiLCJTaGFkb3dFZmZlY3RDb25maWd1cmF0b3IiLCJfcmVmIiwiZWZmZWN0IiwidXBkYXRlRWZmZWN0Q29uZmlnIiwicGFyYW1ldGVycyIsImlkIiwic2xpZGVyUHJvcHMiLCJ1c2VNZW1vIiwicHJvcE5hbWVzIiwibWFwIiwicHJvcE5hbWUiLCJ2YWx1ZTEiLCJyYW5nZSIsInZhbHVlMCIsIm9uQ2hhbmdlIiwidmFsdWUiLCJldmVudCIsIm9uVGltZVBhcmFtZXRlcnNDaGFuZ2VkIiwidXNlQ2FsbGJhY2siLCJ0aW1lc3RhbXAiLCJ0aW1lem9uZSIsInRpbWVNb2RlIiwiY29sb3JQaWNrZXJQcm9wcyIsImNvbG9yU2V0cyIsInNlbGVjdGVkQ29sb3IiLCJzZXRDb2xvciIsInYiLCJjcmVhdGVFbGVtZW50Iiwia2V5IiwiY29sb3IiLCJvblNldENvbG9yIiwiSWNvbiIsIkFycm93RG93blNtYWxsIiwiX2V4dGVuZHMyIiwiZGVmYXVsdFVuaWZvcm1zIiwiUG9zdFByb2Nlc3NpbmdFZmZlY3RDb25maWd1cmF0b3IiLCJfcmVmMiIsIl9lZmZlY3QkZGVja0VmZmVjdCIsInVuaWZvcm1zIiwiZGVja0VmZmVjdCIsIm1vZHVsZSIsInBhcmFtZXRlckRlc2NyaXB0aW9ucyIsImdldFBhcmFtZXRlckRlc2NyaXB0aW9ucyIsImZsYXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMiLCJyZWR1Y2UiLCJhY2MiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJBcnJheSIsImlzQXJyYXkiLCJkZWZhdWx0VmFsdWUiLCJfIiwiaW5kZXgiLCJfZGVzY3JpcHRpb24kbGFiZWwiLCJjb250cm9scyIsImRlc2MiLCJwYXJhbU5hbWUiLCJuYW1lIiwidW5pZm9ybSIsInByZXZWYWx1ZSIsIm5ld1ZhbHVlIiwiaXNOdW1iZXIiLCJfZGVzYyRtaW4iLCJfZGVzYyRtYXgiLCJfZGVzYyRtaW4yIiwibWluIiwibWF4IiwiX3JlZjMiLCJfcmVmNCIsIl9kZXNjJG1pbjMiLCJfcmVmNSIsIl9yZWY2IiwiX2Rlc2MkbWF4MiIsIl9yZWY3IiwiX3JlZjgiLCJfZGVzYyRtaW40Iiwic29mdE1pbiIsInNvZnRNYXgiLCJwYXJhbWV0ZXJJbmRleCIsImNvbnRyb2wiLCJjb25jYXQiLCJFZmZlY3RDb25maWd1cmF0b3IiLCJfcmVmOSIsIkxJR0hUX0FORF9TSEFET1dfRUZGRUNUIiwiaW5qZWN0SW50bCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NyYy9lZmZlY3RzL2VmZmVjdC1jb25maWd1cmF0b3IudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7aW5qZWN0SW50bCwgSW50bFNoYXBlfSBmcm9tICdyZWFjdC1pbnRsJztcblxuaW1wb3J0IHtMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVH0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtpc051bWJlcn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge0VmZmVjdCwgRWZmZWN0VXBkYXRlUHJvcHN9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5pbXBvcnQgUmFuZ2VTbGlkZXJGYWN0b3J5IGZyb20gJy4uL2NvbW1vbi9yYW5nZS1zbGlkZXInO1xuaW1wb3J0IHtBcnJvd0Rvd25TbWFsbH0gZnJvbSAnLi4vY29tbW9uL2ljb25zJztcbmltcG9ydCBFZmZlY3RUaW1lQ29uZmlndXJhdG9yRmFjdG9yeSBmcm9tICcuL2VmZmVjdC10aW1lLWNvbmZpZ3VyYXRvcic7XG5pbXBvcnQgQ29tcGFjdENvbG9yUGlja2VyIGZyb20gJy4vY29tcGFjdC1jb2xvci1waWNrZXInO1xuXG5leHBvcnQgdHlwZSBFZmZlY3RDb25maWd1cmF0b3JQcm9wcyA9IHtcbiAgZWZmZWN0OiBFZmZlY3Q7XG4gIHVwZGF0ZUVmZmVjdENvbmZpZzogKFxuICAgIGU6IEV2ZW50IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGNvbmZpZzogUGFydGlhbDxFZmZlY3RVcGRhdGVQcm9wcz5cbiAgKSA9PiB2b2lkO1xufTtcblxuY29uc3QgU3R5bGVkRWZmZWN0Q29uZmlndXJhdG9yID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ2VmZmVjdC1wYW5lbF9fY29uZmlnJ1xufSlgXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWFyZ2luOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmVmZmVjdENvbmZpZ3VyYXRvck1hcmdpbn07XG4gIHBhZGRpbmc6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZWZmZWN0Q29uZmlndXJhdG9yUGFkZGluZ307XG5gO1xuXG5leHBvcnQgY29uc3QgUGFuZWxMYWJlbFdyYXBwZXIgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnc2lkZS1wYW5lbC1wYW5lbF9fbGFiZWwtd3JhcHBlcidcbn0pYFxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogc2VsZi1zdGFydDtcbiAgbWFyZ2luLWJvdHRvbTogMTFweDtcblxuICAuc2lkZS1wYW5lbC1wYW5lbF9fbGFiZWwge1xuICAgIG1hcmdpbi10b3A6IDJweDtcbiAgICBtYXJnaW4tYm90dG9tOiAwcHg7XG4gIH1cbmA7XG5cbmV4cG9ydCBjb25zdCBTdHlsZWRDb2xvclNlbGVjdG9yV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIG1hcmdpbi1yaWdodDogNXB4O1xuICBtYXJnaW4tbGVmdDogNXB4O1xuICBtYXJnaW4tYm90dG9tOiA2cHg7XG4gIG1hcmdpbi10b3A6IDJweDtcbmA7XG5cbmNvbnN0IFN0eWxlZFZlcnRpY2FsU2VwYXJhdG9yID0gc3R5bGVkLmRpdmBcbiAgaGVpZ2h0OiAxcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuaW5wdXRCZ2R9O1xuICBtYXJnaW4tdG9wOiAyMHB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBtYXJnaW4tbGVmdDogLTIwcHg7XG5gO1xuXG50eXBlIFN0eWxlZFdyYXBwZXJQcm9wcyA9IHtcbiAgbWFyZ2luQm90dG9tPzogbnVtYmVyO1xufTtcbmNvbnN0IFN0eWxlZFdyYXBwZXIgPSBzdHlsZWQuZGl2PFN0eWxlZFdyYXBwZXJQcm9wcz5gXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgbWFyZ2luLWJvdHRvbTogJHtwcm9wcyA9PiBwcm9wcy5tYXJnaW5Cb3R0b20gPz8gOX1weDtcbmA7XG5cbmNvbnN0IFN0eWxlZENvbmZpZ1NlY3Rpb24gPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuYDtcblxuY29uc3QgU2VjdGlvblRpdGxlID0gc3R5bGVkLmRpdmBcbiAgZm9udC1zaXplOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmlucHV0Rm9udFNpemV9O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5lZmZlY3RQYW5lbFRleHRTZWNvbmRhcnkxfTtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xuICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcbmA7XG5cbmNvbnN0IFNlY3Rpb25TdWJUaXRsZSA9IHN0eWxlZC5kaXZgXG4gIGZvbnQtc2l6ZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5pbnB1dEZvbnRTaXplfTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZWZmZWN0UGFuZWxUZXh0U2Vjb25kYXJ5Mn07XG4gIG1hcmdpbi1ib3R0b206IDhweDtcbiAgbWFyZ2luLWxlZnQ6IDZweDtcbmA7XG5cbmNvbnN0IFN0eWxlU2xpZGVyV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG4gIHdpZHRoOiAxOTlweDtcbiAgaGVpZ2h0OiAzMnB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAua2ctcmFuZ2Utc2xpZGVyX19pbnB1dCB7XG4gICAgaGVpZ2h0OiAzMnB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBwYWRkaW5nOiAzcHggNnB4O1xuICB9XG4gIC5rZy1zbGlkZXIge1xuICAgIHBhZGRpbmctbGVmdDogNnB4O1xuICB9XG4gIC5rZy1yYW5nZS1zbGlkZXIge1xuICAgIHBhZGRpbmc6IDBweCAhaW1wb3J0YW50O1xuICB9XG5gO1xuXG5jb25zdCBSZWd1bGFyT3V0ZXJXcmFwcGVyID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ2VmZmVjdC1jb25maWd1cmF0b3JfX3BwLXNlY3Rpb24nXG59KWBcbiAgbWFyZ2luLWJvdHRvbTogOHB4O1xuYDtcblxuY29uc3QgUmVndWxhclNlY3Rpb25UaXRsZVdyYXBwZXIgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnZWZmZWN0LWNvbmZpZ3VyYXRvcl9fcHAtc2VjdGlvbi10aXRsZSdcbn0pYFxuICBmb250LXNpemU6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuaW5wdXRGb250U2l6ZX07XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmVmZmVjdFBhbmVsVGV4dFNlY29uZGFyeTF9O1xuICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcbiAgbWFyZ2luLWJvdHRvbTogLTNweDtcbmA7XG5cbmNvbnN0IFJlZ3VsYXJTbGlkZXJXcmFwcGVyID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ2VmZmVjdC1jb25maWd1cmF0b3JfX3BwLXNlY3Rpb24tY29udHJvbCdcbn0pYFxuICBoZWlnaHQ6IDMycHg7XG4gIC5rZy1yYW5nZS1zbGlkZXJfX2lucHV0IHtcbiAgICBoZWlnaHQ6IDMycHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHBhZGRpbmc6IDNweCA2cHg7XG4gIH1cbiAgLmtnLXNsaWRlciB7XG4gICAgcGFkZGluZy1sZWZ0OiA2cHg7XG4gIH1cbiAgLmtnLXJhbmdlLXNsaWRlciB7XG4gICAgcGFkZGluZzogMHB4ICFpbXBvcnRhbnQ7XG4gIH1cbmA7XG5cbmNvbnN0IENPTU1PTl9TTElERVJfUFJPUFMgPSB7XG4gIHNob3dJbnB1dDogdHJ1ZSxcbiAgaXNSYW5nZWQ6IGZhbHNlLFxuICBzdGVwOiAwLjAwMSxcbiAgbGFiZWw6ICd2YWx1ZSdcbn07XG5cbnR5cGUgRWZmZWN0UGFyYW1ldGVyRGVzY3JpcHRpb25GbGF0dGVuZWQgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmcgfCBmYWxzZSB8IChzdHJpbmcgfCBmYWxzZSlbXTtcbiAgbWluOiBudW1iZXI7XG4gIG1heDogbnVtYmVyO1xuICBpbmRleD86IG51bWJlcjtcbn07XG5cbkVmZmVjdENvbmZpZ3VyYXRvckZhY3RvcnkuZGVwcyA9IFtSYW5nZVNsaWRlckZhY3RvcnksIEVmZmVjdFRpbWVDb25maWd1cmF0b3JGYWN0b3J5XTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gRWZmZWN0Q29uZmlndXJhdG9yRmFjdG9yeShcbiAgUmFuZ2VTbGlkZXI6IFJldHVyblR5cGU8dHlwZW9mIFJhbmdlU2xpZGVyRmFjdG9yeT4sXG4gIEVmZmVjdFRpbWVDb25maWd1cmF0b3I6IFJldHVyblR5cGU8dHlwZW9mIEVmZmVjdFRpbWVDb25maWd1cmF0b3JGYWN0b3J5PlxuKTogUmVhY3QuRkM8RWZmZWN0Q29uZmlndXJhdG9yUHJvcHM+IHtcbiAgY29uc3QgU2hhZG93RWZmZWN0Q29uZmlndXJhdG9yOiBSZWFjdC5GQzxFZmZlY3RDb25maWd1cmF0b3JQcm9wcz4gPSAoe1xuICAgIGVmZmVjdCxcbiAgICB1cGRhdGVFZmZlY3RDb25maWdcbiAgfSkgPT4ge1xuICAgIGNvbnN0IHtwYXJhbWV0ZXJzLCBpZH0gPSBlZmZlY3Q7XG5cbiAgICBjb25zdCBzbGlkZXJQcm9wcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcE5hbWVzID0gWydzaGFkb3dJbnRlbnNpdHknLCAnYW1iaWVudExpZ2h0SW50ZW5zaXR5JywgJ3N1bkxpZ2h0SW50ZW5zaXR5J107XG4gICAgICByZXR1cm4gcHJvcE5hbWVzLm1hcChwcm9wTmFtZSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWUxOiBwYXJhbWV0ZXJzW3Byb3BOYW1lXSxcbiAgICAgICAgICByYW5nZTogWzAsIDFdLFxuICAgICAgICAgIHZhbHVlMDogMCxcbiAgICAgICAgICBvbkNoYW5nZTogKHZhbHVlOiBudW1iZXJbXSwgZXZlbnQ/OiBFdmVudCB8IG51bGwpID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZUVmZmVjdENvbmZpZyhldmVudCwgaWQsIHtwYXJhbWV0ZXJzOiB7W3Byb3BOYW1lXTogdmFsdWVbMV19fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfSwgW2lkLCBwYXJhbWV0ZXJzLCB1cGRhdGVFZmZlY3RDb25maWddKTtcblxuICAgIGNvbnN0IG9uVGltZVBhcmFtZXRlcnNDaGFuZ2VkID0gdXNlQ2FsbGJhY2soXG4gICAgICBwYXJhbWV0ZXJzID0+IHtcbiAgICAgICAgdXBkYXRlRWZmZWN0Q29uZmlnKG51bGwsIGlkLCB7XG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgLi4uKHBhcmFtZXRlcnMudGltZXN0YW1wID8ge3RpbWVzdGFtcDogcGFyYW1ldGVycy50aW1lc3RhbXB9IDogbnVsbCksXG4gICAgICAgICAgICAuLi4ocGFyYW1ldGVycy50aW1lem9uZSA/IHt0aW1lem9uZTogcGFyYW1ldGVycy50aW1lem9uZX0gOiBudWxsKSxcbiAgICAgICAgICAgIC4uLihwYXJhbWV0ZXJzLnRpbWVNb2RlID8ge3RpbWVNb2RlOiBwYXJhbWV0ZXJzLnRpbWVNb2RlfSA6IG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBbaWQsIHVwZGF0ZUVmZmVjdENvbmZpZ11cbiAgICApO1xuXG4gICAgY29uc3QgY29sb3JQaWNrZXJQcm9wcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcE5hbWVzID0gWydhbWJpZW50TGlnaHRDb2xvcicsICdzdW5MaWdodENvbG9yJywgJ3NoYWRvd0NvbG9yJ107XG4gICAgICByZXR1cm4gcHJvcE5hbWVzLm1hcChwcm9wTmFtZSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29sb3JTZXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkQ29sb3I6IHBhcmFtZXRlcnNbcHJvcE5hbWVdLFxuICAgICAgICAgICAgICBzZXRDb2xvcjogdiA9PiB1cGRhdGVFZmZlY3RDb25maWcobnVsbCwgaWQsIHtwYXJhbWV0ZXJzOiB7W3Byb3BOYW1lXTogdn19KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0sIFtpZCwgcGFyYW1ldGVycywgdXBkYXRlRWZmZWN0Q29uZmlnXSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZEVmZmVjdENvbmZpZ3VyYXRvciBrZXk9e2VmZmVjdC5pZH0+XG4gICAgICAgIDxQYW5lbExhYmVsV3JhcHBlcj5cbiAgICAgICAgICA8U2VjdGlvblRpdGxlPnsnRGF0ZSAmIFRpbWUnfTwvU2VjdGlvblRpdGxlPlxuICAgICAgICA8L1BhbmVsTGFiZWxXcmFwcGVyPlxuICAgICAgICA8RWZmZWN0VGltZUNvbmZpZ3VyYXRvclxuICAgICAgICAgIHRpbWVzdGFtcD17cGFyYW1ldGVycy50aW1lc3RhbXB9XG4gICAgICAgICAgdGltZXpvbmU9e3BhcmFtZXRlcnMudGltZXpvbmV9XG4gICAgICAgICAgdGltZU1vZGU9e3BhcmFtZXRlcnMudGltZU1vZGV9XG4gICAgICAgICAgb25DaGFuZ2U9e29uVGltZVBhcmFtZXRlcnNDaGFuZ2VkfVxuICAgICAgICAvPlxuXG4gICAgICAgIDxTdHlsZWRWZXJ0aWNhbFNlcGFyYXRvciAvPlxuXG4gICAgICAgIDxTdHlsZWRXcmFwcGVyIG1hcmdpbkJvdHRvbT17MH0+XG4gICAgICAgICAgPFNlY3Rpb25UaXRsZT57J1NoYWRvdyd9PC9TZWN0aW9uVGl0bGU+XG4gICAgICAgIDwvU3R5bGVkV3JhcHBlcj5cbiAgICAgICAgPFN0eWxlZFdyYXBwZXIgbWFyZ2luQm90dG9tPXsxNn0+XG4gICAgICAgICAgPENvbXBhY3RDb2xvclBpY2tlclxuICAgICAgICAgICAgbGFiZWw9eydDb2xvcid9XG4gICAgICAgICAgICBjb2xvcj17Y29sb3JQaWNrZXJQcm9wc1syXS5jb2xvclNldHNbMF0uc2VsZWN0ZWRDb2xvcn1cbiAgICAgICAgICAgIG9uU2V0Q29sb3I9e2NvbG9yUGlja2VyUHJvcHNbMl0uY29sb3JTZXRzWzBdLnNldENvbG9yfVxuICAgICAgICAgICAgSWNvbj17QXJyb3dEb3duU21hbGx9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8U3R5bGVkQ29uZmlnU2VjdGlvbj5cbiAgICAgICAgICAgIDxTZWN0aW9uU3ViVGl0bGU+SW50ZW5zaXR5PC9TZWN0aW9uU3ViVGl0bGU+XG4gICAgICAgICAgICA8U3R5bGVTbGlkZXJXcmFwcGVyPlxuICAgICAgICAgICAgICA8UmFuZ2VTbGlkZXIgey4uLkNPTU1PTl9TTElERVJfUFJPUFN9IHsuLi5zbGlkZXJQcm9wc1swXX0gLz5cbiAgICAgICAgICAgIDwvU3R5bGVTbGlkZXJXcmFwcGVyPlxuICAgICAgICAgIDwvU3R5bGVkQ29uZmlnU2VjdGlvbj5cbiAgICAgICAgPC9TdHlsZWRXcmFwcGVyPlxuXG4gICAgICAgIDxTdHlsZWRXcmFwcGVyIG1hcmdpbkJvdHRvbT17MH0+XG4gICAgICAgICAgPFNlY3Rpb25UaXRsZT57J0FtYmllbnQgbGlnaHQnfTwvU2VjdGlvblRpdGxlPlxuICAgICAgICA8L1N0eWxlZFdyYXBwZXI+XG4gICAgICAgIDxTdHlsZWRXcmFwcGVyIG1hcmdpbkJvdHRvbT17MTZ9PlxuICAgICAgICAgIDxDb21wYWN0Q29sb3JQaWNrZXJcbiAgICAgICAgICAgIGxhYmVsPXsnQ29sb3InfVxuICAgICAgICAgICAgY29sb3I9e2NvbG9yUGlja2VyUHJvcHNbMF0uY29sb3JTZXRzWzBdLnNlbGVjdGVkQ29sb3J9XG4gICAgICAgICAgICBvblNldENvbG9yPXtjb2xvclBpY2tlclByb3BzWzBdLmNvbG9yU2V0c1swXS5zZXRDb2xvcn1cbiAgICAgICAgICAgIEljb249e0Fycm93RG93blNtYWxsfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPFN0eWxlZENvbmZpZ1NlY3Rpb24+XG4gICAgICAgICAgICA8U2VjdGlvblN1YlRpdGxlPkludGVuc2l0eTwvU2VjdGlvblN1YlRpdGxlPlxuICAgICAgICAgICAgPFN0eWxlU2xpZGVyV3JhcHBlcj5cbiAgICAgICAgICAgICAgPFJhbmdlU2xpZGVyIHsuLi5DT01NT05fU0xJREVSX1BST1BTfSB7Li4uc2xpZGVyUHJvcHNbMV19IC8+XG4gICAgICAgICAgICA8L1N0eWxlU2xpZGVyV3JhcHBlcj5cbiAgICAgICAgICA8L1N0eWxlZENvbmZpZ1NlY3Rpb24+XG4gICAgICAgIDwvU3R5bGVkV3JhcHBlcj5cblxuICAgICAgICA8U3R5bGVkV3JhcHBlciBtYXJnaW5Cb3R0b209ezB9PlxuICAgICAgICAgIDxTZWN0aW9uVGl0bGU+eydTdW4gbGlnaHQnfTwvU2VjdGlvblRpdGxlPlxuICAgICAgICA8L1N0eWxlZFdyYXBwZXI+XG4gICAgICAgIDxTdHlsZWRXcmFwcGVyIG1hcmdpbkJvdHRvbT17MH0+XG4gICAgICAgICAgPENvbXBhY3RDb2xvclBpY2tlclxuICAgICAgICAgICAgbGFiZWw9eydDb2xvcid9XG4gICAgICAgICAgICBjb2xvcj17Y29sb3JQaWNrZXJQcm9wc1sxXS5jb2xvclNldHNbMF0uc2VsZWN0ZWRDb2xvcn1cbiAgICAgICAgICAgIG9uU2V0Q29sb3I9e2NvbG9yUGlja2VyUHJvcHNbMV0uY29sb3JTZXRzWzBdLnNldENvbG9yfVxuICAgICAgICAgICAgSWNvbj17QXJyb3dEb3duU21hbGx9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8U3R5bGVkQ29uZmlnU2VjdGlvbj5cbiAgICAgICAgICAgIDxTZWN0aW9uU3ViVGl0bGU+SW50ZW5zaXR5PC9TZWN0aW9uU3ViVGl0bGU+XG4gICAgICAgICAgICA8U3R5bGVTbGlkZXJXcmFwcGVyPlxuICAgICAgICAgICAgICA8UmFuZ2VTbGlkZXIgey4uLkNPTU1PTl9TTElERVJfUFJPUFN9IHsuLi5zbGlkZXJQcm9wc1syXX0gLz5cbiAgICAgICAgICAgIDwvU3R5bGVTbGlkZXJXcmFwcGVyPlxuICAgICAgICAgIDwvU3R5bGVkQ29uZmlnU2VjdGlvbj5cbiAgICAgICAgPC9TdHlsZWRXcmFwcGVyPlxuICAgICAgPC9TdHlsZWRFZmZlY3RDb25maWd1cmF0b3I+XG4gICAgKTtcbiAgfTtcbiAgY29uc3QgZGVmYXVsdFVuaWZvcm1zID0ge307XG5cbiAgY29uc3QgUG9zdFByb2Nlc3NpbmdFZmZlY3RDb25maWd1cmF0b3I6IFJlYWN0LkZDPEVmZmVjdENvbmZpZ3VyYXRvclByb3BzPiA9ICh7XG4gICAgZWZmZWN0LFxuICAgIHVwZGF0ZUVmZmVjdENvbmZpZ1xuICB9KSA9PiB7XG4gICAgY29uc3QgdW5pZm9ybXMgPSBlZmZlY3QuZGVja0VmZmVjdD8ubW9kdWxlLnVuaWZvcm1zIHx8IGRlZmF1bHRVbmlmb3JtcztcbiAgICBjb25zdCBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMgPSBlZmZlY3QuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7XG4gICAgY29uc3Qge3BhcmFtZXRlcnMsIGlkfSA9IGVmZmVjdDtcbiAgICBjb25zdCBmbGF0UGFyYW1ldGVyRGVzY3JpcHRpb25zID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICByZXR1cm4gcGFyYW1ldGVyRGVzY3JpcHRpb25zLnJlZHVjZSgoYWNjLCBkZXNjcmlwdGlvbikgPT4ge1xuICAgICAgICBpZiAoZGVzY3JpcHRpb24udHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgIC8vIHNwbGl0IGFycmF5cyBvZiBjb250cm9scyBpbnRvIGEgc2VwYXJhdGUgY29udHJvbHMgZm9yIGVhY2ggY29tcG9uZW50XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVzY3JpcHRpb24uZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24uZGVmYXVsdFZhbHVlLmZvckVhY2goKF8sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIGFjYy5wdXNoKHtcbiAgICAgICAgICAgICAgICAuLi5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICBsYWJlbDogZGVzY3JpcHRpb24ubGFiZWw/LltpbmRleF1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjLnB1c2goZGVzY3JpcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIFtdIGFzIEVmZmVjdFBhcmFtZXRlckRlc2NyaXB0aW9uRmxhdHRlbmVkW10pO1xuICAgIH0sIFtwYXJhbWV0ZXJEZXNjcmlwdGlvbnNdKTtcblxuICAgIGNvbnN0IGNvbnRyb2xzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICByZXR1cm4gZmxhdFBhcmFtZXRlckRlc2NyaXB0aW9ucy5tYXAoZGVzYyA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IGRlc2MubmFtZTtcblxuICAgICAgICBjb25zdCB1bmlmb3JtID0gdW5pZm9ybXNbZGVzYy5uYW1lXTtcbiAgICAgICAgaWYgKCghdW5pZm9ybSAmJiB1bmlmb3JtICE9PSAwKSB8fCB1bmlmb3JtLnByaXZhdGUpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IHBhcmFtZXRlcnNbcGFyYW1OYW1lXTtcblxuICAgICAgICBjb25zdCBsYWJlbCA9IGRlc2MubGFiZWwgPT09IGZhbHNlID8gZmFsc2UgOiBkZXNjLmxhYmVsIHx8IGRlc2MubmFtZTtcblxuICAgICAgICAvLyB0aGUgdW5pZm9ybSBpcyBbbnVtYmVyLCBudW1iZXJdIGFycmF5XG4gICAgICAgIGlmICh1bmlmb3JtLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIHZhbHVlMTogcHJldlZhbHVlW2Rlc2MuaW5kZXggfHwgMF0gfHwgMCxcbiAgICAgICAgICAgIHJhbmdlOiBbMCwgMV0sXG4gICAgICAgICAgICB2YWx1ZTA6IDAsXG4gICAgICAgICAgICBvbkNoYW5nZTogKG5ld1ZhbHVlOiBudW1iZXJbXSwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgdXBkYXRlRWZmZWN0Q29uZmlnKGV2ZW50LCBpZCwge1xuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgIFtwYXJhbU5hbWVdOlxuICAgICAgICAgICAgICAgICAgICBkZXNjLmluZGV4ID09PSAwID8gW25ld1ZhbHVlWzFdLCBwcmV2VmFsdWVbMV1dIDogW3ByZXZWYWx1ZVswXSwgbmV3VmFsdWVbMV1dXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIHRoZSB1bmlmb3JtIGlzIGEgcGxhaW4gbnVtYmVyIHdpdGhvdXQgYW55IGRlc2NyaXB0aW9uXG4gICAgICAgIGVsc2UgaWYgKGlzTnVtYmVyKHVuaWZvcm0pKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgdmFsdWUxOiBwcmV2VmFsdWUgPz8gMCxcbiAgICAgICAgICAgIHJhbmdlOiBbZGVzYy5taW4gPz8gMCwgZGVzYy5tYXggPz8gNTAwXSxcbiAgICAgICAgICAgIHZhbHVlMDogZGVzYy5taW4gPz8gMCxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAobmV3VmFsdWU6IG51bWJlcltdLCBldmVudCkgPT4ge1xuICAgICAgICAgICAgICB1cGRhdGVFZmZlY3RDb25maWcoZXZlbnQsIGlkLCB7cGFyYW1ldGVyczoge1twYXJhbU5hbWVdOiBuZXdWYWx1ZVsxXX19KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIHRoZSB1bmlmb3JtIGRlc2NyaXB0aW9uIGlzIHt2YWx1ZTogMCwgbWluOiAwLCBtYXg6IDEsIC4uLn1cbiAgICAgICAgZWxzZSBpZiAoaXNOdW1iZXIodW5pZm9ybS52YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB2YWx1ZTE6IHByZXZWYWx1ZSB8fCAwLFxuICAgICAgICAgICAgcmFuZ2U6IFtcbiAgICAgICAgICAgICAgZGVzYy5taW4gPz8gdW5pZm9ybS5taW4gPz8gdW5pZm9ybS5zb2Z0TWluID8/IDAsXG4gICAgICAgICAgICAgIGRlc2MubWF4ID8/IHVuaWZvcm0ubWF4ID8/IHVuaWZvcm0uc29mdE1heCA/PyAxXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgdmFsdWUwOiBkZXNjLm1pbiA/PyB1bmlmb3JtLm1pbiA/PyB1bmlmb3JtLnNvZnRNaW4gPz8gMCxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAobmV3VmFsdWU6IG51bWJlcltdLCBldmVudCkgPT4ge1xuICAgICAgICAgICAgICB1cGRhdGVFZmZlY3RDb25maWcoZXZlbnQsIGlkLCB7cGFyYW1ldGVyczoge1twYXJhbU5hbWVdOiBuZXdWYWx1ZVsxXX19KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWdub3JlIGV2ZXJ5dGhpbmcgZWxzZSBmb3Igbm93XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgfSwgW2ZsYXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMsIGlkLCBwYXJhbWV0ZXJzLCB1cGRhdGVFZmZlY3RDb25maWcsIHVuaWZvcm1zXSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZEVmZmVjdENvbmZpZ3VyYXRvciBrZXk9e2VmZmVjdC5pZH0+XG4gICAgICAgIHtmbGF0UGFyYW1ldGVyRGVzY3JpcHRpb25zLm1hcCgoZGVzYywgcGFyYW1ldGVySW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBjb250cm9sID0gY29udHJvbHNbcGFyYW1ldGVySW5kZXhdO1xuICAgICAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxSZWd1bGFyT3V0ZXJXcmFwcGVyIGtleT17YCR7ZWZmZWN0LmlkfS0ke3BhcmFtZXRlckluZGV4fWB9PlxuICAgICAgICAgICAgICB7Y29udHJvbC5sYWJlbCA/IChcbiAgICAgICAgICAgICAgICA8UmVndWxhclNlY3Rpb25UaXRsZVdyYXBwZXI+e2NvbnRyb2wubGFiZWx9PC9SZWd1bGFyU2VjdGlvblRpdGxlV3JhcHBlcj5cbiAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgIDxSZWd1bGFyU2xpZGVyV3JhcHBlcj5cbiAgICAgICAgICAgICAgICA8UmFuZ2VTbGlkZXIga2V5PXtwYXJhbWV0ZXJJbmRleH0gey4uLkNPTU1PTl9TTElERVJfUFJPUFN9IHsuLi5jb250cm9sfSAvPlxuICAgICAgICAgICAgICA8L1JlZ3VsYXJTbGlkZXJXcmFwcGVyPlxuICAgICAgICAgICAgPC9SZWd1bGFyT3V0ZXJXcmFwcGVyPlxuICAgICAgICAgICk7XG4gICAgICAgIH0pfVxuICAgICAgPC9TdHlsZWRFZmZlY3RDb25maWd1cmF0b3I+XG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBFZmZlY3RDb25maWd1cmF0b3IgPSAoe1xuICAgIGVmZmVjdCxcbiAgICB1cGRhdGVFZmZlY3RDb25maWdcbiAgfTogRWZmZWN0Q29uZmlndXJhdG9yUHJvcHMgJiB7aW50bDogSW50bFNoYXBlfSkgPT4ge1xuICAgIHJldHVybiBlZmZlY3QudHlwZSA9PT0gTElHSFRfQU5EX1NIQURPV19FRkZFQ1QudHlwZSA/IChcbiAgICAgIDxTaGFkb3dFZmZlY3RDb25maWd1cmF0b3IgZWZmZWN0PXtlZmZlY3R9IHVwZGF0ZUVmZmVjdENvbmZpZz17dXBkYXRlRWZmZWN0Q29uZmlnfSAvPlxuICAgICkgOiAoXG4gICAgICA8UG9zdFByb2Nlc3NpbmdFZmZlY3RDb25maWd1cmF0b3IgZWZmZWN0PXtlZmZlY3R9IHVwZGF0ZUVmZmVjdENvbmZpZz17dXBkYXRlRWZmZWN0Q29uZmlnfSAvPlxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIGluamVjdEludGwoRWZmZWN0Q29uZmlndXJhdG9yKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQUVBLElBQUFJLElBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLEtBQUEsR0FBQUwsT0FBQTtBQUdBLElBQUFNLFlBQUEsR0FBQUosc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFPLE1BQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLHVCQUFBLEdBQUFOLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUyxtQkFBQSxHQUFBUCxzQkFBQSxDQUFBRixPQUFBO0FBQXdELElBQUFVLGVBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsaUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMsaUJBQUEsRUFkeEQ7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFB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