kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
273 lines (272 loc) • 46.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.LegendColorDisplayFactory = LegendColorDisplayFactory;
exports.LegendRowEditorFactory = LegendRowEditorFactory;
exports.LegendRowFactory = LegendRowFactory;
exports.ResetColorLabelFactory = ResetColorLabelFactory;
exports["default"] = void 0;
exports.useLayerColorLegends = useLayerColorLegends;
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireWildcard(require("styled-components"));
var _constants = require("@kepler.gl/constants");
var _utils = require("@kepler.gl/utils");
var _icons = require("./icons");
var _styledComponents2 = require("./styled-components");
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6; // 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 _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
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 ROW_H = 15;
var GAP = 2;
var RECT_W = 20;
var stopClickPropagation = function stopClickPropagation(e) {
return e.stopPropagation();
};
var inputCss = (0, _styledComponents.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n input {\n pointer-events: none;\n }\n"])));
var StyledLegend = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n ", ";\n overflow-y: auto;\n overflow-x: hidden;\n margin-bottom: ", "px;\n display: grid;\n grid-row-gap: ", "px;\n padding: 2px 0;\n\n ", "\n"])), function (props) {
return props.theme.sidePanelScrollBar;
}, function (props) {
return props.isExpanded ? '' : "max-height: 156px;";
}, GAP, GAP, function (props) {
return props.disableEdit ? inputCss : '';
});
var StyledLegendRow = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n height: 20px;\n min-width: 0;\n"])));
function ResetColorLabelFactory() {
return (0, _styledComponents["default"])(_icons.Reset)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n cursor: pointer;\n flex-shrink: 0;\n margin-left: ", "px;\n\n &:hover {\n color: ", ";\n }\n "])), function (props) {
return props.theme.labelColorLT;
}, GAP, function (props) {
return props.theme.panelHeaderIconHover;
});
}
var StyleInlineInput = (0, _styledComponents["default"])(_styledComponents2.InlineInput)(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 9.5px;\n line-height: ", "px;\n height: ", "px;\n color: ", ";\n width: unset;\n padding: 2px;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin: 0 ", "px;\n :hover {\n height: ", "px;\n }\n"])), ROW_H, ROW_H, function (props) {
return props.theme.textColor;
}, GAP, ROW_H);
function LegendRowEditorFactory() {
var LegendRowEditor = function LegendRowEditor(_ref) {
var color = _ref.color,
label = _ref.label,
onEdit = _ref.onEdit,
_ref$disabled = _ref.disabled,
disabled = _ref$disabled === void 0 ? false : _ref$disabled;
var onChange = (0, _react.useCallback)(function (event) {
return onEdit(event.target.value);
}, [onEdit]);
return /*#__PURE__*/_react["default"].createElement(StyleInlineInput, {
type: "text",
className: "legend__label__title__editor",
value: label,
onClick: stopClickPropagation,
onChange: onChange,
disabled: disabled,
id: "".concat(color, ":input-legend-label")
});
};
LegendRowEditor.displayName = 'LegendRowEditor';
return LegendRowEditor;
}
var LegendRowStyle = {
width: "".concat(RECT_W, "px"),
height: "".concat(ROW_H, "px")
};
function LegendColorDisplayFactory() {
var LegendColorDisplay = function LegendColorDisplay(_ref2) {
var color = _ref2.color;
var style = (0, _react.useMemo)(function () {
return _objectSpread(_objectSpread({}, LegendRowStyle), {}, {
backgroundColor: color,
marginRight: "".concat(GAP, "px")
});
}, [color]);
return /*#__PURE__*/_react["default"].createElement("div", {
style: style,
className: "legend-row-color"
});
};
return LegendColorDisplay;
}
var StyledLabel = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: 10px;\n color: ", ";\n padding-left: 2px;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n"])), function (props) {
return props.theme.textColor;
});
LegendRowFactory.deps = [LegendColorDisplayFactory, LegendRowEditorFactory, ResetColorLabelFactory];
function LegendRowFactory(LegendColorDisplay, LegendRowEditor, ResetColorLabel) {
var LegendRow = function LegendRow(_ref3) {
var _ref3$label = _ref3.label,
label = _ref3$label === void 0 ? '' : _ref3$label,
displayLabel = _ref3.displayLabel,
color = _ref3.color,
onUpdateLabel = _ref3.onUpdateLabel,
onResetLabel = _ref3.onResetLabel;
var onEdit = (0, _react.useCallback)(function (newLabel) {
return onUpdateLabel && onUpdateLabel(color, newLabel);
}, [color, onUpdateLabel]);
var onReset = (0, _react.useCallback)(function () {
return onResetLabel && onResetLabel(color);
}, [color, onResetLabel]);
var value = displayLabel ? String(label !== null && label !== void 0 ? label : '') : '';
return /*#__PURE__*/_react["default"].createElement(StyledLegendRow, null, /*#__PURE__*/_react["default"].createElement(LegendColorDisplay, {
color: color
}), onUpdateLabel ? /*#__PURE__*/_react["default"].createElement(LegendRowEditor, {
disabled: !onUpdateLabel,
label: value,
color: color,
onEdit: onEdit
}) : /*#__PURE__*/_react["default"].createElement(StyledLabel, null, value), onResetLabel ? /*#__PURE__*/_react["default"].createElement(ResetColorLabel, {
onClick: onReset,
height: "16px"
}) : null);
};
LegendRow.displayName = 'LegendRow';
return LegendRow;
}
var overrideColorLegends = function overrideColorLegends(colorLegends, overrides) {
var data = overrides.data,
labels = overrides.labels;
var newColorLegends = (0, _toConsumableArray2["default"])(colorLegends);
data.forEach(function (datum, index) {
var currentIndex = colorLegends.findIndex(function (d) {
return d.data === datum;
});
if (currentIndex !== -1) {
newColorLegends[currentIndex] = {
label: labels[index],
data: datum,
override: true
};
newColorLegends[currentIndex].label = labels[index];
} else {
newColorLegends.push({
data: datum,
label: labels[index],
override: true
});
}
});
return newColorLegends;
};
/**
* Overrides legend labels with color legends.
* @param param0 Legend info and override parameters.
* @returns Original or overriden lenends.
*/
function overrideByCustomLegend(_ref4) {
var colorLegends = _ref4.colorLegends,
currentLegends = _ref4.currentLegends;
if (colorLegends && (0, _utils.isObject)(colorLegends)) {
// override labels with color legends
var data = Object.keys(colorLegends);
var labels = Object.values(colorLegends);
return overrideColorLegends(currentLegends, {
data: data,
labels: labels
});
}
return currentLegends;
}
function useLayerColorLegends(layer, scaleType, domain, range, isFixed, fieldType, labelFormat, mapState) {
var scale = (0, _react.useMemo)(function () {
return (0, _utils.getLayerColorScale)({
range: range,
domain: domain,
scaleType: scaleType,
isFixed: isFixed,
layer: layer
});
}, [range, domain, scaleType, isFixed, layer]);
var scaleByZoom = (0, _react.useMemo)(function () {
return (0, _utils.getVisualChannelScaleByZoom)({
scale: scale,
layer: layer,
mapState: mapState
});
}, [scale, layer, mapState]);
var currentLegends = (0, _react.useMemo)(function () {
if (scaleType === _constants.SCALE_TYPES.customOrdinal && range !== null && range !== void 0 && range.colorMap) {
var colorBreaks = (0, _utils.colorMapToCategoricalColorBreaks)(range.colorMap);
return colorBreaks === null || colorBreaks === void 0 ? void 0 : colorBreaks.map(function (cb) {
return {
data: cb.data,
label: Array.isArray(cb.label) ? cb.label.length > 5 ? "".concat(cb.label.length, " selected") : cb.label : cb.label || ''
};
});
}
return (0, _utils.getLegendOfScale)({
scale: scaleByZoom,
scaleType: scaleType,
labelFormat: labelFormat,
fieldType: fieldType
});
}, [range, scaleByZoom, scaleType, labelFormat, fieldType]);
var LegendsWithCustomLegends = (0, _react.useMemo)(function () {
return overrideByCustomLegend({
colorLegends: range === null || range === void 0 ? void 0 : range.colorLegends,
currentLegends: currentLegends
});
}, [range === null || range === void 0 ? void 0 : range.colorLegends, currentLegends]);
return LegendsWithCustomLegends || [];
}
ColorLegendFactory.deps = [LegendRowFactory];
function ColorLegendFactory(LegendRow) {
var ColorLegend = function ColorLegend(_ref5) {
var layer = _ref5.layer,
isFixed = _ref5.isFixed,
isExpanded = _ref5.isExpanded,
domain = _ref5.domain,
range = _ref5.range,
labelFormat = _ref5.labelFormat,
scaleType = _ref5.scaleType,
fieldType = _ref5.fieldType,
mapState = _ref5.mapState,
onUpdateColorLegend = _ref5.onUpdateColorLegend,
_ref5$displayLabel = _ref5.displayLabel,
displayLabel = _ref5$displayLabel === void 0 ? true : _ref5$displayLabel,
_ref5$disableEdit = _ref5.disableEdit,
disableEdit = _ref5$disableEdit === void 0 ? false : _ref5$disableEdit;
var _ref6 = range || {},
colorLegends = _ref6.colorLegends;
var legends = useLayerColorLegends(layer, scaleType, domain, range, isFixed, fieldType, labelFormat, mapState);
var onUpdateLabel = (0, _react.useCallback)(function (color, newValue) {
if (onUpdateColorLegend) {
onUpdateColorLegend(_objectSpread(_objectSpread({}, colorLegends), {}, (0, _defineProperty2["default"])({}, color, newValue)));
}
}, [onUpdateColorLegend, colorLegends]);
var onResetLabel = (0, _react.useCallback)(function (color) {
/* eslint-disable no-unused-vars */
// @ts-ignore
var _ = colorLegends[color],
rest = (0, _objectWithoutProperties2["default"])(colorLegends, [color].map(_toPropertyKey));
if (onUpdateColorLegend && rest) {
onUpdateColorLegend(rest);
}
/* eslint-enable no-unused-vars */
}, [onUpdateColorLegend, colorLegends]);
return /*#__PURE__*/_react["default"].createElement(StyledLegend, {
className: "styled-color-legend",
disableEdit: disableEdit,
isExpanded: isExpanded
}, legends.map(function (legend, i) {
return /*#__PURE__*/_react["default"].createElement(LegendRow, {
key: "".concat(legend.data, "-").concat(i),
label: legend.label,
displayLabel: displayLabel,
color: legend.data,
onUpdateLabel: !disableEdit ? onUpdateLabel : undefined,
onResetLabel: legend.override && !disableEdit ? onResetLabel : undefined
});
}));
};
return /*#__PURE__*/_react["default"].memo(ColorLegend);
}
var _default = exports["default"] = ColorLegendFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9jb25zdGFudHMiLCJfdXRpbHMiLCJfaWNvbnMiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfdGVtcGxhdGVPYmplY3Q1IiwiX3RlbXBsYXRlT2JqZWN0NiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl90b1Byb3BlcnR5S2V5IiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJST1dfSCIsIkdBUCIsIlJFQ1RfVyIsInN0b3BDbGlja1Byb3BhZ2F0aW9uIiwic3RvcFByb3BhZ2F0aW9uIiwiaW5wdXRDc3MiLCJjc3MiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIlN0eWxlZExlZ2VuZCIsInN0eWxlZCIsImRpdiIsInByb3BzIiwidGhlbWUiLCJzaWRlUGFuZWxTY3JvbGxCYXIiLCJpc0V4cGFuZGVkIiwiZGlzYWJsZUVkaXQiLCJTdHlsZWRMZWdlbmRSb3ciLCJSZXNldENvbG9yTGFiZWxGYWN0b3J5IiwiUmVzZXQiLCJsYWJlbENvbG9yTFQiLCJwYW5lbEhlYWRlckljb25Ib3ZlciIsIlN0eWxlSW5saW5lSW5wdXQiLCJJbmxpbmVJbnB1dCIsInRleHRDb2xvciIsIkxlZ2VuZFJvd0VkaXRvckZhY3RvcnkiLCJMZWdlbmRSb3dFZGl0b3IiLCJfcmVmIiwiY29sb3IiLCJsYWJlbCIsIm9uRWRpdCIsIl9yZWYkZGlzYWJsZWQiLCJkaXNhYmxlZCIsIm9uQ2hhbmdlIiwidXNlQ2FsbGJhY2siLCJldmVudCIsInRhcmdldCIsInZhbHVlIiwiY3JlYXRlRWxlbWVudCIsInR5cGUiLCJjbGFzc05hbWUiLCJvbkNsaWNrIiwiaWQiLCJjb25jYXQiLCJkaXNwbGF5TmFtZSIsIkxlZ2VuZFJvd1N0eWxlIiwid2lkdGgiLCJoZWlnaHQiLCJMZWdlbmRDb2xvckRpc3BsYXlGYWN0b3J5IiwiTGVnZW5kQ29sb3JEaXNwbGF5IiwiX3JlZjIiLCJzdHlsZSIsInVzZU1lbW8iLCJiYWNrZ3JvdW5kQ29sb3IiLCJtYXJnaW5SaWdodCIsIlN0eWxlZExhYmVsIiwiTGVnZW5kUm93RmFjdG9yeSIsImRlcHMiLCJSZXNldENvbG9yTGFiZWwiLCJMZWdlbmRSb3ciLCJfcmVmMyIsIl9yZWYzJGxhYmVsIiwiZGlzcGxheUxhYmVsIiwib25VcGRhdGVMYWJlbCIsIm9uUmVzZXRMYWJlbCIsIm5ld0xhYmVsIiwib25SZXNldCIsIm92ZXJyaWRlQ29sb3JMZWdlbmRzIiwiY29sb3JMZWdlbmRzIiwib3ZlcnJpZGVzIiwiZGF0YSIsImxhYmVscyIsIm5ld0NvbG9yTGVnZW5kcyIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJkYXR1bSIsImluZGV4IiwiY3VycmVudEluZGV4IiwiZmluZEluZGV4IiwiZCIsIm92ZXJyaWRlIiwib3ZlcnJpZGVCeUN1c3RvbUxlZ2VuZCIsIl9yZWY0IiwiY3VycmVudExlZ2VuZHMiLCJpc09iamVjdCIsInZhbHVlcyIsInVzZUxheWVyQ29sb3JMZWdlbmRzIiwibGF5ZXIiLCJzY2FsZVR5cGUiLCJkb21haW4iLCJyYW5nZSIsImlzRml4ZWQiLCJmaWVsZFR5cGUiLCJsYWJlbEZvcm1hdCIsIm1hcFN0YXRlIiwic2NhbGUiLCJnZXRMYXllckNvbG9yU2NhbGUiLCJzY2FsZUJ5Wm9vbSIsImdldFZpc3VhbENoYW5uZWxTY2FsZUJ5Wm9vbSIsIlNDQUxFX1RZUEVTIiwiY3VzdG9tT3JkaW5hbCIsImNvbG9yTWFwIiwiY29sb3JCcmVha3MiLCJjb2xvck1hcFRvQ2F0ZWdvcmljYWxDb2xvckJyZWFrcyIsIm1hcCIsImNiIiwiQXJyYXkiLCJpc0FycmF5IiwiZ2V0TGVnZW5kT2ZTY2FsZSIsIkxlZ2VuZHNXaXRoQ3VzdG9tTGVnZW5kcyIsIkNvbG9yTGVnZW5kRmFjdG9yeSIsIkNvbG9yTGVnZW5kIiwiX3JlZjUiLCJvblVwZGF0ZUNvbG9yTGVnZW5kIiwiX3JlZjUkZGlzcGxheUxhYmVsIiwiX3JlZjUkZGlzYWJsZUVkaXQiLCJfcmVmNiIsImxlZ2VuZHMiLCJuZXdWYWx1ZSIsIl8iLCJyZXN0IiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImxlZ2VuZCIsImtleSIsInVuZGVmaW5lZCIsIlJlYWN0IiwibWVtbyIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tb24vY29sb3ItbGVnZW5kLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlTWVtb30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCwge2Nzc30gZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQge1NDQUxFX1RZUEVTfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge0xheWVyfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge0NvbG9yUmFuZ2UsIEhleENvbG9yLCBNYXBTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1xuICBnZXRMYXllckNvbG9yU2NhbGUsXG4gIGdldExlZ2VuZE9mU2NhbGUsXG4gIGdldFZpc3VhbENoYW5uZWxTY2FsZUJ5Wm9vbSxcbiAgY29sb3JNYXBUb0NhdGVnb3JpY2FsQ29sb3JCcmVha3MsXG4gIGlzT2JqZWN0XG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbXBvcnQge1Jlc2V0fSBmcm9tICcuL2ljb25zJztcbmltcG9ydCB7SW5saW5lSW5wdXR9IGZyb20gJy4vc3R5bGVkLWNvbXBvbmVudHMnO1xuXG5jb25zdCBST1dfSCA9IDE1O1xuY29uc3QgR0FQID0gMjtcbmNvbnN0IFJFQ1RfVyA9IDIwO1xuXG5jb25zdCBzdG9wQ2xpY2tQcm9wYWdhdGlvbiA9IGUgPT4gZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuY29uc3QgaW5wdXRDc3MgPSBjc3NgXG4gIGlucHV0IHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuYDtcbmNvbnN0IFN0eWxlZExlZ2VuZCA9IHN0eWxlZC5kaXY8e2Rpc2FibGVFZGl0OiBib29sZWFuOyBpc0V4cGFuZGVkPzogYm9vbGVhbn0+YFxuICAke3Byb3BzID0+IHByb3BzLnRoZW1lLnNpZGVQYW5lbFNjcm9sbEJhcn07XG4gICR7cHJvcHMgPT4gKHByb3BzLmlzRXhwYW5kZWQgPyAnJyA6IGBtYXgtaGVpZ2h0OiAxNTZweDtgKX07XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgbWFyZ2luLWJvdHRvbTogJHtHQVB9cHg7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtcm93LWdhcDogJHtHQVB9cHg7XG4gIHBhZGRpbmc6IDJweCAwO1xuXG4gICR7cHJvcHMgPT4gKHByb3BzLmRpc2FibGVFZGl0ID8gaW5wdXRDc3MgOiAnJyl9XG5gO1xuXG5jb25zdCBTdHlsZWRMZWdlbmRSb3cgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBoZWlnaHQ6IDIwcHg7XG4gIG1pbi13aWR0aDogMDtcbmA7XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXNldENvbG9yTGFiZWxGYWN0b3J5KCkge1xuICByZXR1cm4gc3R5bGVkKFJlc2V0KWBcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5sYWJlbENvbG9yTFR9O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBmbGV4LXNocmluazogMDtcbiAgICBtYXJnaW4tbGVmdDogJHtHQVB9cHg7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsSGVhZGVySWNvbkhvdmVyfTtcbiAgICB9XG4gIGA7XG59XG5cbmNvbnN0IFN0eWxlSW5saW5lSW5wdXQgPSBzdHlsZWQoSW5saW5lSW5wdXQpYFxuICBmb250LXNpemU6IDkuNXB4O1xuICBsaW5lLWhlaWdodDogJHtST1dfSH1weDtcbiAgaGVpZ2h0OiAke1JPV19IfXB4O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3J9O1xuICB3aWR0aDogdW5zZXQ7XG4gIHBhZGRpbmc6IDJweDtcbiAgZmxleDogMTtcbiAgbWluLXdpZHRoOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgbWFyZ2luOiAwICR7R0FQfXB4O1xuICA6aG92ZXIge1xuICAgIGhlaWdodDogJHtST1dfSH1weDtcbiAgfVxuYDtcblxuZXhwb3J0IHR5cGUgTGVnZW5kUm93RWRpdG9yUHJvcHMgPSB7XG4gIGNvbG9yOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGN1c3RvbUxhYmVsPzogc3RyaW5nO1xuICBvbkVkaXQ6IChuZXdWYWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG59O1xuZXhwb3J0IGZ1bmN0aW9uIExlZ2VuZFJvd0VkaXRvckZhY3RvcnkoKSB7XG4gIGNvbnN0IExlZ2VuZFJvd0VkaXRvcjogUmVhY3QuRkM8TGVnZW5kUm93RWRpdG9yUHJvcHM+ID0gKHtcbiAgICBjb2xvcixcbiAgICBsYWJlbCxcbiAgICBvbkVkaXQsXG4gICAgZGlzYWJsZWQgPSBmYWxzZVxuICB9KSA9PiB7XG4gICAgY29uc3Qgb25DaGFuZ2UgPSB1c2VDYWxsYmFjayhldmVudCA9PiBvbkVkaXQoZXZlbnQudGFyZ2V0LnZhbHVlKSwgW29uRWRpdF0pO1xuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVJbmxpbmVJbnB1dFxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIGNsYXNzTmFtZT1cImxlZ2VuZF9fbGFiZWxfX3RpdGxlX19lZGl0b3JcIlxuICAgICAgICB2YWx1ZT17bGFiZWx9XG4gICAgICAgIG9uQ2xpY2s9e3N0b3BDbGlja1Byb3BhZ2F0aW9ufVxuICAgICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgaWQ9e2Ake2NvbG9yfTppbnB1dC1sZWdlbmQtbGFiZWxgfVxuICAgICAgLz5cbiAgICApO1xuICB9O1xuXG4gIExlZ2VuZFJvd0VkaXRvci5kaXNwbGF5TmFtZSA9ICdMZWdlbmRSb3dFZGl0b3InO1xuICByZXR1cm4gTGVnZW5kUm93RWRpdG9yO1xufVxuXG5jb25zdCBMZWdlbmRSb3dTdHlsZSA9IHtcbiAgd2lkdGg6IGAke1JFQ1RfV31weGAsXG4gIGhlaWdodDogYCR7Uk9XX0h9cHhgXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gTGVnZW5kQ29sb3JEaXNwbGF5RmFjdG9yeSgpIHtcbiAgY29uc3QgTGVnZW5kQ29sb3JEaXNwbGF5ID0gKHtjb2xvcn0pID0+IHtcbiAgICBjb25zdCBzdHlsZSA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiAoey4uLkxlZ2VuZFJvd1N0eWxlLCBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yLCBtYXJnaW5SaWdodDogYCR7R0FQfXB4YH0pLFxuICAgICAgW2NvbG9yXVxuICAgICk7XG4gICAgcmV0dXJuIDxkaXYgc3R5bGU9e3N0eWxlfSBjbGFzc05hbWU9XCJsZWdlbmQtcm93LWNvbG9yXCIgLz47XG4gIH07XG5cbiAgcmV0dXJuIExlZ2VuZENvbG9yRGlzcGxheTtcbn1cblxuY29uc3QgU3R5bGVkTGFiZWwgPSBzdHlsZWQuZGl2YFxuICBmb250LXNpemU6IDEwcHg7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvcn07XG4gIHBhZGRpbmctbGVmdDogMnB4O1xuICBmbGV4OiAxO1xuICBtaW4td2lkdGg6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuYDtcblxuZXhwb3J0IHR5cGUgTGVnZW5kUm93UHJvcHMgPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGN1c3RvbUxhYmVsPzogc3RyaW5nO1xuICBkaXNwbGF5TGFiZWw/OiBib29sZWFuO1xuICBjb2xvcjogc3RyaW5nO1xuICBvblVwZGF0ZUxhYmVsPzogKHNlbGVjdGVkQ29sb3I6IHN0cmluZywgbmV3TGFiZWw6IHN0cmluZykgPT4gdm9pZDtcbiAgb25SZXNldExhYmVsPzogKGNvbG9yOiBzdHJpbmcpID0+IHZvaWQ7XG4gIGRpc2FibGVFZGl0PzogYm9vbGVhbjtcbn07XG5cbkxlZ2VuZFJvd0ZhY3RvcnkuZGVwcyA9IFtMZWdlbmRDb2xvckRpc3BsYXlGYWN0b3J5LCBMZWdlbmRSb3dFZGl0b3JGYWN0b3J5LCBSZXNldENvbG9yTGFiZWxGYWN0b3J5XTtcbmV4cG9ydCBmdW5jdGlvbiBMZWdlbmRSb3dGYWN0b3J5KFxuICBMZWdlbmRDb2xvckRpc3BsYXk6IFJldHVyblR5cGU8dHlwZW9mIExlZ2VuZENvbG9yRGlzcGxheUZhY3Rvcnk+LFxuICBMZWdlbmRSb3dFZGl0b3I6IFJldHVyblR5cGU8dHlwZW9mIExlZ2VuZFJvd0VkaXRvckZhY3Rvcnk+LFxuICBSZXNldENvbG9yTGFiZWw6IFJldHVyblR5cGU8dHlwZW9mIFJlc2V0Q29sb3JMYWJlbEZhY3Rvcnk+XG4pIHtcbiAgY29uc3QgTGVnZW5kUm93OiBSZWFjdC5GQzxMZWdlbmRSb3dQcm9wcz4gPSAoe1xuICAgIGxhYmVsID0gJycsXG4gICAgZGlzcGxheUxhYmVsLFxuICAgIGNvbG9yLFxuICAgIG9uVXBkYXRlTGFiZWwsXG4gICAgb25SZXNldExhYmVsXG4gIH0pID0+IHtcbiAgICBjb25zdCBvbkVkaXQgPSB1c2VDYWxsYmFjayhcbiAgICAgIG5ld0xhYmVsID0+IG9uVXBkYXRlTGFiZWwgJiYgb25VcGRhdGVMYWJlbChjb2xvciwgbmV3TGFiZWwpLFxuICAgICAgW2NvbG9yLCBvblVwZGF0ZUxhYmVsXVxuICAgICk7XG4gICAgY29uc3Qgb25SZXNldCA9IHVzZUNhbGxiYWNrKCgpID0+IG9uUmVzZXRMYWJlbCAmJiBvblJlc2V0TGFiZWwoY29sb3IpLCBbY29sb3IsIG9uUmVzZXRMYWJlbF0pO1xuICAgIGNvbnN0IHZhbHVlID0gZGlzcGxheUxhYmVsID8gU3RyaW5nKGxhYmVsID8/ICcnKSA6ICcnO1xuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkTGVnZW5kUm93PlxuICAgICAgICA8TGVnZW5kQ29sb3JEaXNwbGF5IGNvbG9yPXtjb2xvcn0gLz5cbiAgICAgICAge29uVXBkYXRlTGFiZWwgPyAoXG4gICAgICAgICAgPExlZ2VuZFJvd0VkaXRvciBkaXNhYmxlZD17IW9uVXBkYXRlTGFiZWx9IGxhYmVsPXt2YWx1ZX0gY29sb3I9e2NvbG9yfSBvbkVkaXQ9e29uRWRpdH0gLz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8U3R5bGVkTGFiZWw+e3ZhbHVlfTwvU3R5bGVkTGFiZWw+XG4gICAgICAgICl9XG4gICAgICAgIHtvblJlc2V0TGFiZWwgPyA8UmVzZXRDb2xvckxhYmVsIG9uQ2xpY2s9e29uUmVzZXR9IGhlaWdodD1cIjE2cHhcIiAvPiA6IG51bGx9XG4gICAgICA8L1N0eWxlZExlZ2VuZFJvdz5cbiAgICApO1xuICB9O1xuICBMZWdlbmRSb3cuZGlzcGxheU5hbWUgPSAnTGVnZW5kUm93JztcbiAgcmV0dXJuIExlZ2VuZFJvdztcbn1cblxuY29uc3Qgb3ZlcnJpZGVDb2xvckxlZ2VuZHMgPSAoY29sb3JMZWdlbmRzLCBvdmVycmlkZXMpID0+IHtcbiAgY29uc3Qge2RhdGEsIGxhYmVsc30gPSBvdmVycmlkZXM7XG5cbiAgY29uc3QgbmV3Q29sb3JMZWdlbmRzID0gWy4uLmNvbG9yTGVnZW5kc107XG5cbiAgZGF0YS5mb3JFYWNoKChkYXR1bSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSBjb2xvckxlZ2VuZHMuZmluZEluZGV4KGQgPT4gZC5kYXRhID09PSBkYXR1bSk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgIG5ld0NvbG9yTGVnZW5kc1tjdXJyZW50SW5kZXhdID0ge1xuICAgICAgICBsYWJlbDogbGFiZWxzW2luZGV4XSxcbiAgICAgICAgZGF0YTogZGF0dW0sXG4gICAgICAgIG92ZXJyaWRlOiB0cnVlXG4gICAgICB9O1xuICAgICAgbmV3Q29sb3JMZWdlbmRzW2N1cnJlbnRJbmRleF0ubGFiZWwgPSBsYWJlbHNbaW5kZXhdO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdDb2xvckxlZ2VuZHMucHVzaCh7XG4gICAgICAgIGRhdGE6IGRhdHVtLFxuICAgICAgICBsYWJlbDogbGFiZWxzW2luZGV4XSxcbiAgICAgICAgb3ZlcnJpZGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG5ld0NvbG9yTGVnZW5kcztcbn07XG5cbnR5cGUgT3ZlcnJpZGVCeUN1c3RvbUxlZ2VuZE9wdGlvbnMgPSB7XG4gIC8qKlxuICAgKiBMZWdlbmQgcGFyYW1ldGVycyB0byBvdmVycmlkZVxuICAgKi9cbiAgY29sb3JMZWdlbmRzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgLyoqXG4gICAqIE9yaWdpbmFsIExlZ2VuZHNcbiAgICovXG4gIGN1cnJlbnRMZWdlbmRzPzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0TGVnZW5kT2ZTY2FsZT47XG59O1xuXG4vKipcbiAqIE92ZXJyaWRlcyBsZWdlbmQgbGFiZWxzIHdpdGggY29sb3IgbGVnZW5kcy5cbiAqIEBwYXJhbSBwYXJhbTAgTGVnZW5kIGluZm8gYW5kIG92ZXJyaWRlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBPcmlnaW5hbCBvciBvdmVycmlkZW4gbGVuZW5kcy5cbiAqL1xuZnVuY3Rpb24gb3ZlcnJpZGVCeUN1c3RvbUxlZ2VuZCh7Y29sb3JMZWdlbmRzLCBjdXJyZW50TGVnZW5kc306IE92ZXJyaWRlQnlDdXN0b21MZWdlbmRPcHRpb25zKSB7XG4gIGlmIChjb2xvckxlZ2VuZHMgJiYgaXNPYmplY3QoY29sb3JMZWdlbmRzKSkge1xuICAgIC8vIG92ZXJyaWRlIGxhYmVscyB3aXRoIGNvbG9yIGxlZ2VuZHNcbiAgICBjb25zdCBkYXRhID0gT2JqZWN0LmtleXMoY29sb3JMZWdlbmRzKTtcbiAgICBjb25zdCBsYWJlbHMgPSBPYmplY3QudmFsdWVzKGNvbG9yTGVnZW5kcyk7XG5cbiAgICByZXR1cm4gb3ZlcnJpZGVDb2xvckxlZ2VuZHMoY3VycmVudExlZ2VuZHMsIHtkYXRhLCBsYWJlbHN9KTtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50TGVnZW5kcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUxheWVyQ29sb3JMZWdlbmRzKFxuICBsYXllcjogQ29sb3JMZWdlbmRQcm9wc1snbGF5ZXInXSxcbiAgc2NhbGVUeXBlOiBDb2xvckxlZ2VuZFByb3BzWydzY2FsZVR5cGUnXSxcbiAgZG9tYWluOiBDb2xvckxlZ2VuZFByb3BzWydkb21haW4nXSxcbiAgcmFuZ2U6IENvbG9yTGVnZW5kUHJvcHNbJ3JhbmdlJ10sXG4gIGlzRml4ZWQ6IENvbG9yTGVnZW5kUHJvcHNbJ2lzRml4ZWQnXSxcbiAgZmllbGRUeXBlOiBDb2xvckxlZ2VuZFByb3BzWydmaWVsZFR5cGUnXSxcbiAgbGFiZWxGb3JtYXQ6IENvbG9yTGVnZW5kUHJvcHNbJ2xhYmVsRm9ybWF0J10sXG4gIG1hcFN0YXRlOiBDb2xvckxlZ2VuZFByb3BzWydtYXBTdGF0ZSddXG4pOiBMZWdlbmRbXSB7XG4gIGNvbnN0IHNjYWxlID0gdXNlTWVtbyhcbiAgICAoKSA9PiBnZXRMYXllckNvbG9yU2NhbGUoe3JhbmdlLCBkb21haW4sIHNjYWxlVHlwZSwgaXNGaXhlZCwgbGF5ZXJ9KSxcbiAgICBbcmFuZ2UsIGRvbWFpbiwgc2NhbGVUeXBlLCBpc0ZpeGVkLCBsYXllcl1cbiAgKTtcblxuICBjb25zdCBzY2FsZUJ5Wm9vbSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gZ2V0VmlzdWFsQ2hhbm5lbFNjYWxlQnlab29tKHtzY2FsZSwgbGF5ZXIsIG1hcFN0YXRlfSksXG4gICAgW3NjYWxlLCBsYXllciwgbWFwU3RhdGVdXG4gICk7XG5cbiAgY29uc3QgY3VycmVudExlZ2VuZHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoc2NhbGVUeXBlID09PSBTQ0FMRV9UWVBFUy5jdXN0b21PcmRpbmFsICYmIHJhbmdlPy5jb2xvck1hcCkge1xuICAgICAgY29uc3QgY29sb3JCcmVha3MgPSBjb2xvck1hcFRvQ2F0ZWdvcmljYWxDb2xvckJyZWFrcyhyYW5nZS5jb2xvck1hcCk7XG4gICAgICByZXR1cm4gY29sb3JCcmVha3M/Lm1hcChjYiA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogY2IuZGF0YSxcbiAgICAgICAgICBsYWJlbDogQXJyYXkuaXNBcnJheShjYi5sYWJlbClcbiAgICAgICAgICAgID8gY2IubGFiZWwubGVuZ3RoID4gNVxuICAgICAgICAgICAgICA/IGAke2NiLmxhYmVsLmxlbmd0aH0gc2VsZWN0ZWRgXG4gICAgICAgICAgICAgIDogY2IubGFiZWxcbiAgICAgICAgICAgIDogY2IubGFiZWwgfHwgJydcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0TGVnZW5kT2ZTY2FsZSh7c2NhbGU6IHNjYWxlQnlab29tLCBzY2FsZVR5cGUsIGxhYmVsRm9ybWF0LCBmaWVsZFR5cGV9KTtcbiAgfSwgW3JhbmdlLCBzY2FsZUJ5Wm9vbSwgc2NhbGVUeXBlLCBsYWJlbEZvcm1hdCwgZmllbGRUeXBlXSk7XG5cbiAgY29uc3QgTGVnZW5kc1dpdGhDdXN0b21MZWdlbmRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgb3ZlcnJpZGVCeUN1c3RvbUxlZ2VuZCh7XG4gICAgICAgIGNvbG9yTGVnZW5kczogcmFuZ2U/LmNvbG9yTGVnZW5kcyxcbiAgICAgICAgY3VycmVudExlZ2VuZHNcbiAgICAgIH0pLFxuICAgIFtyYW5nZT8uY29sb3JMZWdlbmRzLCBjdXJyZW50TGVnZW5kc11cbiAgKTtcblxuICByZXR1cm4gTGVnZW5kc1dpdGhDdXN0b21MZWdlbmRzIHx8IFtdO1xufVxuXG5leHBvcnQgdHlwZSBDb2xvckxlZ2VuZFByb3BzID0ge1xuICBsYXllcjogTGF5ZXI7XG4gIHNjYWxlVHlwZTogc3RyaW5nO1xuICBkb21haW46IG51bWJlcltdIHwgc3RyaW5nW107XG4gIGZpZWxkVHlwZT86IHN0cmluZyB8IG51bGw7XG4gIHJhbmdlPzogQ29sb3JSYW5nZSB8IG51bGw7XG4gIGxhYmVsRm9ybWF0PzogKG46IGFueSkgPT4gc3RyaW5nO1xuICBkaXNwbGF5TGFiZWw/OiBib29sZWFuO1xuICBkaXNhYmxlRWRpdD86IGJvb2xlYW47XG4gIG1hcFN0YXRlPzogTWFwU3RhdGU7XG4gIGlzRml4ZWQ/OiBib29sZWFuO1xuICBpc0V4cGFuZGVkPzogYm9vbGVhbjtcbiAgb25VcGRhdGVDb2xvckxlZ2VuZD86IChjb2xvckxlZ2VuZHM6IHtba2V5OiBIZXhDb2xvcl06IHN0cmluZ30pID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBMZWdlbmQgPSB7XG4gIGRhdGE6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgb3ZlcnJpZGU/OiBib29sZWFuO1xufTtcblxuQ29sb3JMZWdlbmRGYWN0b3J5LmRlcHMgPSBbTGVnZW5kUm93RmFjdG9yeV07XG5mdW5jdGlvbiBDb2xvckxlZ2VuZEZhY3RvcnkoTGVnZW5kUm93OiBSZXR1cm5UeXBlPHR5cGVvZiBMZWdlbmRSb3dGYWN0b3J5Pikge1xuICBjb25zdCBDb2xvckxlZ2VuZDogUmVhY3QuRkM8Q29sb3JMZWdlbmRQcm9wcz4gPSAoe1xuICAgIGxheWVyLFxuICAgIGlzRml4ZWQsXG4gICAgaXNFeHBhbmRlZCxcbiAgICBkb21haW4sXG4gICAgcmFuZ2UsXG4gICAgbGFiZWxGb3JtYXQsXG4gICAgc2NhbGVUeXBlLFxuICAgIGZpZWxkVHlwZSxcbiAgICBtYXBTdGF0ZSxcbiAgICBvblVwZGF0ZUNvbG9yTGVnZW5kLFxuICAgIGRpc3BsYXlMYWJlbCA9IHRydWUsXG4gICAgZGlzYWJsZUVkaXQgPSBmYWxzZVxuICB9KSA9PiB7XG4gICAgY29uc3Qge2NvbG9yTGVnZW5kc30gPSByYW5nZSB8fCB7fTtcblxuICAgIGNvbnN0IGxlZ2VuZHMgPSB1c2VMYXllckNvbG9yTGVnZW5kcyhcbiAgICAgIGxheWVyLFxuICAgICAgc2NhbGVUeXBlLFxuICAgICAgZG9tYWluLFxuICAgICAgcmFuZ2UsXG4gICAgICBpc0ZpeGVkLFxuICAgICAgZmllbGRUeXBlLFxuICAgICAgbGFiZWxGb3JtYXQsXG4gICAgICBtYXBTdGF0ZVxuICAgICk7XG5cbiAgICBjb25zdCBvblVwZGF0ZUxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgICAoY29sb3IsIG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChvblVwZGF0ZUNvbG9yTGVnZW5kKSB7XG4gICAgICAgICAgb25VcGRhdGVDb2xvckxlZ2VuZCh7XG4gICAgICAgICAgICAuLi5jb2xvckxlZ2VuZHMsXG4gICAgICAgICAgICBbY29sb3JdOiBuZXdWYWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW29uVXBkYXRlQ29sb3JMZWdlbmQsIGNvbG9yTGVnZW5kc11cbiAgICApO1xuXG4gICAgY29uc3Qgb25SZXNldExhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgICBjb2xvciA9PiB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3Qge1tjb2xvcl06IF8sIC4uLnJlc3R9ID0gY29sb3JMZWdlbmRzO1xuICAgICAgICBpZiAob25VcGRhdGVDb2xvckxlZ2VuZCAmJiByZXN0KSB7XG4gICAgICAgICAgb25VcGRhdGVDb2xvckxlZ2VuZChyZXN0KTtcbiAgICAgICAgfVxuICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXG4gICAgICB9LFxuICAgICAgW29uVXBkYXRlQ29sb3JMZWdlbmQsIGNvbG9yTGVnZW5kc11cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRMZWdlbmRcbiAgICAgICAgY2xhc3NOYW1lPVwic3R5bGVkLWNvbG9yLWxlZ2VuZFwiXG4gICAgICAgIGRpc2FibGVFZGl0PXtkaXNhYmxlRWRpdH1cbiAgICAgICAgaXNFeHBhbmRlZD17aXNFeHBhbmRlZH1cbiAgICAgID5cbiAgICAgICAge2xlZ2VuZHMubWFwKChsZWdlbmQsIGkpID0+IChcbiAgICAgICAgICA8TGVnZW5kUm93XG4gICAgICAgICAgICBrZXk9e2Ake2xlZ2VuZC5kYXRhfS0ke2l9YH1cbiAgICAgICAgICAgIGxhYmVsPXtsZWdlbmQubGFiZWx9XG4gICAgICAgICAgICBkaXNwbGF5TGFiZWw9e2Rpc3BsYXlMYWJlbH1cbiAgICAgICAgICAgIGNvbG9yPXtsZWdlbmQuZGF0YX1cbiAgICAgICAgICAgIG9uVXBkYXRlTGFiZWw9eyFkaXNhYmxlRWRpdCA/IG9uVXBkYXRlTGFiZWwgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICBvblJlc2V0TGFiZWw9e2xlZ2VuZC5vdmVycmlkZSAmJiAhZGlzYWJsZUVkaXQgPyBvblJlc2V0TGFiZWwgOiB1bmRlZmluZWR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSl9XG4gICAgICA8L1N0eWxlZExlZ2VuZD5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBSZWFjdC5tZW1vKENvbG9yTGVnZW5kKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29sb3JMZWdlbmRGYWN0b3J5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFGLHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBRSxVQUFBLEdBQUFGLE9BQUE7QUFHQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFRQSxJQUFBSSxNQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxrQkFBQSxHQUFBTCxPQUFBO0FBQWdELElBQUFNLGVBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUEsRUFsQmhEO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQWQsd0JBQUFjLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JB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