kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
383 lines (323 loc) • 39.3 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.MapPopover = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _classnames = _interopRequireDefault(require("classnames"));
var _styledComponents2 = require("../common/styled-components");
var _icons = require("../common/icons");
var _defaultSettings = require("../../constants/default-settings");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _templateObject3() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 12px;\n letter-spacing: 0.43px;\n text-transform: capitalize;\n padding-left: 14px;\n margin-top: 12px;\n\n svg {\n margin-right: 4px;\n }\n"]);
_templateObject3 = function _templateObject3() {
return data;
};
return data;
}
function _templateObject2() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n left: 50%;\n transform: rotate(30deg);\n top: 10px;\n color: ", ";\n\n :hover {\n cursor: pointer;\n color: ", ";\n }\n"]);
_templateObject2 = function _templateObject2() {
return data;
};
return data;
}
function _templateObject() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n ", "\n font-size: 11px;\n font-weight: 500;\n background-color: ", ";\n color: ", ";\n z-index: 1001;\n position: absolute;\n overflow-x: auto;\n\n .gutter {\n height: 6px;\n }\n\n table {\n margin: 2px 12px 12px 12px;\n width: auto;\n\n tbody {\n border-top: transparent;\n border-bottom: transparent;\n }\n\n td {\n border-color: transparent;\n padding: 4px;\n color: ", ";\n }\n\n td.row__value {\n text-align: right;\n font-weight: 500;\n color: ", ";\n }\n }\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var MAX_WIDTH = 400;
var MAX_HEIGHT = 600;
var StyledMapPopover = _styledComponents["default"].div(_templateObject(), function (props) {
return props.theme.scrollBar;
}, function (props) {
return props.theme.panelBackground;
}, function (props) {
return props.theme.textColor;
}, function (props) {
return props.theme.textColor;
}, function (props) {
return props.theme.textColorHl;
});
var StyledPin = _styledComponents["default"].div(_templateObject2(), function (props) {
return props.theme.primaryBtnBgd;
}, function (props) {
return props.theme.linkBtnColor;
});
var StyledLayerName = _styledComponents2.CenterFlexbox.extend(_templateObject3(), function (props) {
return props.theme.textColorHl;
});
var MapPopover =
/*#__PURE__*/
function (_Component) {
(0, _inherits2["default"])(MapPopover, _Component);
function MapPopover(props) {
var _this;
(0, _classCallCheck2["default"])(this, MapPopover);
_this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(MapPopover).call(this, props));
_this.state = {
isMouseOver: false,
width: 380,
height: 160
};
return _this;
}
(0, _createClass2["default"])(MapPopover, [{
key: "componentDidMount",
value: function componentDidMount() {
this._setContainerSize();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
this._setContainerSize();
}
}, {
key: "_setContainerSize",
value: function _setContainerSize() {
var node = this.popover;
if (!node) {
return;
}
var width = Math.min(node.scrollWidth, MAX_WIDTH);
var height = Math.min(node.scrollHeight, MAX_HEIGHT);
if (width !== this.state.width || height !== this.state.height) {
this.setState({
width: width,
height: height
});
}
}
}, {
key: "_getPosition",
value: function _getPosition(x, y) {
var topOffset = 30;
var leftOffset = 30;
var mapState = this.props.mapState;
var _this$state = this.state,
width = _this$state.width,
height = _this$state.height;
var pos = {};
if (x + leftOffset + width > mapState.width) {
pos.right = mapState.width - x + leftOffset;
} else {
pos.left = x + leftOffset;
}
if (y + topOffset + height > mapState.height) {
pos.bottom = 10;
} else {
pos.top = y + topOffset;
}
return pos;
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var _this$props = this.props,
x = _this$props.x,
y = _this$props.y,
isVisible = _this$props.isVisible,
data = _this$props.data,
layer = _this$props.layer,
freezed = _this$props.freezed,
fields = _this$props.fields,
_this$props$fieldsToS = _this$props.fieldsToShow,
fieldsToShow = _this$props$fieldsToS === void 0 ? [] : _this$props$fieldsToS;
var hidden = !isVisible && !this.state.isMouseOver;
var width = this.state.width;
if (!data || !layer || !fieldsToShow.length) {
return null;
}
var infoProps = {
data: data,
layer: layer,
fieldsToShow: fieldsToShow,
fields: fields
};
var style = Number.isFinite(x) && Number.isFinite(y) ? this._getPosition(x, y) : {};
return _react["default"].createElement(StyledMapPopover, {
innerRef: function innerRef(comp) {
_this2.popover = comp;
},
className: (0, _classnames["default"])('map-popover', {
hidden: hidden
}),
style: _objectSpread({}, style, {
maxWidth: width
}),
onMouseEnter: function onMouseEnter() {
_this2.setState({
isMouseOver: true
});
},
onMouseLeave: function onMouseLeave() {
_this2.setState({
isMouseOver: false
});
}
}, freezed ? _react["default"].createElement("div", {
className: "map-popover__top"
}, _react["default"].createElement("div", {
className: "gutter"
}), _react["default"].createElement(StyledPin, {
className: "popover-pin",
onClick: this.props.onClose
}, _react["default"].createElement(_icons.Pin, {
height: "16px"
}))) : null, _react["default"].createElement(StyledLayerName, {
className: "map-popover__layer-name"
}, _react["default"].createElement(_icons.Layers, {
height: "12px"
}), layer.config.label), _react["default"].createElement("table", {
className: "map-popover__table"
}, layer.isAggregated ? layer.type === 'boundary' || layer.type === 'pincode' ? _react["default"].createElement(CellInfoBoundary, infoProps) : _react["default"].createElement(CellInfo, infoProps) : _react["default"].createElement(EntryInfo, infoProps)));
}
}]);
return MapPopover;
}(_react.Component);
exports.MapPopover = MapPopover;
(0, _defineProperty2["default"])(MapPopover, "propTypes", {
fields: _propTypes["default"].arrayOf(_propTypes["default"].any),
fieldsToShow: _propTypes["default"].arrayOf(_propTypes["default"].any),
isVisible: _propTypes["default"].bool,
layer: _propTypes["default"].object,
data: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].any), _propTypes["default"].object]),
freezed: _propTypes["default"].bool,
x: _propTypes["default"].number,
y: _propTypes["default"].number,
onClose: _propTypes["default"].func,
mapState: _propTypes["default"].object.isRequired
});
var Row = function Row(_ref) {
var name = _ref.name,
value = _ref.value,
url = _ref.url;
// Set 'url' to 'value' if it looks like a url
if (!url && value && typeof value === 'string' && value.match(/^http/)) {
url = value;
}
var asImg = /<img>/.test(name);
return _react["default"].createElement("tr", {
className: "row",
key: name
}, _react["default"].createElement("td", {
className: "row__name"
}, name), _react["default"].createElement("td", {
className: "row__value"
}, asImg ? _react["default"].createElement("img", {
src: value
}) : url ? _react["default"].createElement("a", {
target: "_blank",
rel: "noopener noreferrer",
href: url
}, value) : value));
};
var EntryInfo = function EntryInfo(_ref2) {
var fieldsToShow = _ref2.fieldsToShow,
fields = _ref2.fields,
data = _ref2.data;
return _react["default"].createElement("tbody", null, fieldsToShow.map(function (name) {
return _react["default"].createElement(EntryInfoRow, {
key: name,
name: name,
fields: fields,
data: data
});
}));
};
var EntryInfoRow = function EntryInfoRow(_ref3) {
var name = _ref3.name,
fields = _ref3.fields,
data = _ref3.data;
var field = fields.find(function (f) {
return f.name === name;
});
if (!field) {
return null;
}
var valueIdx = field.tableFieldIndex - 1;
var format = _getCellFormat(field.type);
return _react["default"].createElement(Row, {
name: name,
value: format ? format(data[valueIdx]) : data[valueIdx]
});
};
var CellInfo = function CellInfo(_ref4) {
var data = _ref4.data,
layer = _ref4.layer;
var _layer$config = layer.config,
colorField = _layer$config.colorField,
sizeField = _layer$config.sizeField;
return _react["default"].createElement("tbody", null, _react["default"].createElement(Row, {
name: 'total points',
key: "count",
value: data.points && data.points.length
}), colorField && layer.visualChannels.color ? _react["default"].createElement(Row, {
name: layer.getVisualChannelDescription('color').measure,
key: "color",
value: data.colorValue || 'N/A'
}) : null, sizeField && layer.visualChannels.size ? _react["default"].createElement(Row, {
name: layer.getVisualChannelDescription('size').measure,
key: "size",
value: data.elevationValue || 'N/A'
}) : null);
};
var CellInfoBoundary = function CellInfoBoundary(_ref5) {
var data = _ref5.data,
layer = _ref5.layer;
var _layer$config2 = layer.config,
colorField = _layer$config2.colorField,
heightField = _layer$config2.heightField;
var enable3d = layer.config.visConfig.enable3d;
var dataKeys = Object.keys(data.properties);
dataKeys = dataKeys.filter(function (d) {
if (d !== 'aggregatedData' && d !== 'count' && d !== 'values' && d != 'heightAggregatedData') {
return d;
}
});
return _react["default"].createElement("tbody", null, _react["default"].createElement(Row, {
name: 'total points',
key: "count",
value: data.properties.count
}), colorField && layer.visualChannels.color ? _react["default"].createElement(Row, {
name: layer.getVisualChannelDescription('color').measure,
key: "color",
value: data.properties.aggregatedData || 'N/A'
}) : null, heightField && enable3d && layer.visualChannels.height ? _react["default"].createElement(Row, {
name: layer.getVisualChannelDescription('height').measure,
key: "height",
value: data.properties.heightAggregatedData || 'N/A'
}) : null, dataKeys.map(function (d) {
return _react["default"].createElement(Row, {
name: d,
key: d,
value: data.properties[d]
});
}));
};
function _getCellFormat(type) {
return _defaultSettings.FIELD_DISPLAY_FORMAT[type];
}
var MapPopoverFactory = function MapPopoverFactory() {
return MapPopover;
};
var _default = MapPopoverFactory;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21hcC9tYXAtcG9wb3Zlci5qcyJdLCJuYW1lcyI6WyJNQVhfV0lEVEgiLCJNQVhfSEVJR0hUIiwiU3R5bGVkTWFwUG9wb3ZlciIsInN0eWxlZCIsImRpdiIsInByb3BzIiwidGhlbWUiLCJzY3JvbGxCYXIiLCJwYW5lbEJhY2tncm91bmQiLCJ0ZXh0Q29sb3IiLCJ0ZXh0Q29sb3JIbCIsIlN0eWxlZFBpbiIsInByaW1hcnlCdG5CZ2QiLCJsaW5rQnRuQ29sb3IiLCJTdHlsZWRMYXllck5hbWUiLCJDZW50ZXJGbGV4Ym94IiwiZXh0ZW5kIiwiTWFwUG9wb3ZlciIsInN0YXRlIiwiaXNNb3VzZU92ZXIiLCJ3aWR0aCIsImhlaWdodCIsIl9zZXRDb250YWluZXJTaXplIiwibm9kZSIsInBvcG92ZXIiLCJNYXRoIiwibWluIiwic2Nyb2xsV2lkdGgiLCJzY3JvbGxIZWlnaHQiLCJzZXRTdGF0ZSIsIngiLCJ5IiwidG9wT2Zmc2V0IiwibGVmdE9mZnNldCIsIm1hcFN0YXRlIiwicG9zIiwicmlnaHQiLCJsZWZ0IiwiYm90dG9tIiwidG9wIiwiaXNWaXNpYmxlIiwiZGF0YSIsImxheWVyIiwiZnJlZXplZCIsImZpZWxkcyIsImZpZWxkc1RvU2hvdyIsImhpZGRlbiIsImxlbmd0aCIsImluZm9Qcm9wcyIsInN0eWxlIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJfZ2V0UG9zaXRpb24iLCJjb21wIiwibWF4V2lkdGgiLCJvbkNsb3NlIiwiY29uZmlnIiwibGFiZWwiLCJpc0FnZ3JlZ2F0ZWQiLCJ0eXBlIiwiQ29tcG9uZW50IiwiUHJvcFR5cGVzIiwiYXJyYXlPZiIsImFueSIsImJvb2wiLCJvYmplY3QiLCJvbmVPZlR5cGUiLCJudW1iZXIiLCJmdW5jIiwiaXNSZXF1aXJlZCIsIlJvdyIsIm5hbWUiLCJ2YWx1ZSIsInVybCIsIm1hdGNoIiwiYXNJbWciLCJ0ZXN0IiwiRW50cnlJbmZvIiwibWFwIiwiRW50cnlJbmZvUm93IiwiZmllbGQiLCJmaW5kIiwiZiIsInZhbHVlSWR4IiwidGFibGVGaWVsZEluZGV4IiwiZm9ybWF0IiwiX2dldENlbGxGb3JtYXQiLCJDZWxsSW5mbyIsImNvbG9yRmllbGQiLCJzaXplRmllbGQiLCJwb2ludHMiLCJ2aXN1YWxDaGFubmVscyIsImNvbG9yIiwiZ2V0VmlzdWFsQ2hhbm5lbERlc2NyaXB0aW9uIiwibWVhc3VyZSIsImNvbG9yVmFsdWUiLCJzaXplIiwiZWxldmF0aW9uVmFsdWUiLCJDZWxsSW5mb0JvdW5kYXJ5IiwiaGVpZ2h0RmllbGQiLCJlbmFibGUzZCIsInZpc0NvbmZpZyIsImRhdGFLZXlzIiwiT2JqZWN0Iiwia2V5cyIsInByb3BlcnRpZXMiLCJmaWx0ZXIiLCJkIiwiY291bnQiLCJhZ2dyZWdhdGVkRGF0YSIsImhlaWdodEFnZ3JlZ2F0ZWREYXRhIiwiRklFTERfRElTUExBWV9GT1JNQVQiLCJNYXBQb3BvdmVyRmFjdG9yeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEsU0FBUyxHQUFHLEdBQWxCO0FBQ0EsSUFBTUMsVUFBVSxHQUFHLEdBQW5COztBQUVBLElBQU1DLGdCQUFnQixHQUFHQyw2QkFBT0MsR0FBVixvQkFDbEIsVUFBQUMsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZQyxTQUFoQjtBQUFBLENBRGEsRUFJQSxVQUFBRixLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlFLGVBQWhCO0FBQUEsQ0FKTCxFQUtYLFVBQUFILEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUcsU0FBaEI7QUFBQSxDQUxNLEVBMEJQLFVBQUFKLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUcsU0FBaEI7QUFBQSxDQTFCRSxFQWdDUCxVQUFBSixLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlJLFdBQWhCO0FBQUEsQ0FoQ0UsQ0FBdEI7O0FBcUNBLElBQU1DLFNBQVMsR0FBR1IsNkJBQU9DLEdBQVYscUJBS0osVUFBQUMsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZTSxhQUFoQjtBQUFBLENBTEQsRUFTRixVQUFBUCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlPLFlBQWhCO0FBQUEsQ0FUSCxDQUFmOztBQWFBLElBQU1DLGVBQWUsR0FBR0MsaUNBQWNDLE1BQWpCLHFCQUNWLFVBQUFYLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUksV0FBaEI7QUFBQSxDQURLLENBQXJCOztJQWFhTyxVOzs7OztBQWlCWCxzQkFBWVosS0FBWixFQUFtQjtBQUFBOztBQUFBO0FBQ2pCLHNIQUFNQSxLQUFOO0FBQ0EsVUFBS2EsS0FBTCxHQUFhO0FBQ1hDLE1BQUFBLFdBQVcsRUFBRSxLQURGO0FBRVhDLE1BQUFBLEtBQUssRUFBRSxHQUZJO0FBR1hDLE1BQUFBLE1BQU0sRUFBRTtBQUhHLEtBQWI7QUFGaUI7QUFPbEI7Ozs7d0NBRW1CO0FBQ2xCLFdBQUtDLGlCQUFMO0FBQ0Q7Ozt5Q0FFb0I7QUFDbkIsV0FBS0EsaUJBQUw7QUFDRDs7O3dDQUVtQjtBQUNsQixVQUFNQyxJQUFJLEdBQUcsS0FBS0MsT0FBbEI7O0FBQ0EsVUFBSSxDQUFDRCxJQUFMLEVBQVc7QUFDVDtBQUNEOztBQUVELFVBQU1ILEtBQUssR0FBR0ssSUFBSSxDQUFDQyxHQUFMLENBQVNILElBQUksQ0FBQ0ksV0FBZCxFQUEyQjNCLFNBQTNCLENBQWQ7QUFDQSxVQUFNcUIsTUFBTSxHQUFHSSxJQUFJLENBQUNDLEdBQUwsQ0FBU0gsSUFBSSxDQUFDSyxZQUFkLEVBQTRCM0IsVUFBNUIsQ0FBZjs7QUFFQSxVQUFJbUIsS0FBSyxLQUFLLEtBQUtGLEtBQUwsQ0FBV0UsS0FBckIsSUFBOEJDLE1BQU0sS0FBSyxLQUFLSCxLQUFMLENBQVdHLE1BQXhELEVBQWdFO0FBQzlELGFBQUtRLFFBQUwsQ0FBYztBQUFDVCxVQUFBQSxLQUFLLEVBQUxBLEtBQUQ7QUFBUUMsVUFBQUEsTUFBTSxFQUFOQTtBQUFSLFNBQWQ7QUFDRDtBQUNGOzs7aUNBRVlTLEMsRUFBR0MsQyxFQUFHO0FBQ2pCLFVBQU1DLFNBQVMsR0FBRyxFQUFsQjtBQUNBLFVBQU1DLFVBQVUsR0FBRyxFQUFuQjtBQUZpQixVQUdWQyxRQUhVLEdBR0UsS0FBSzdCLEtBSFAsQ0FHVjZCLFFBSFU7QUFBQSx3QkFJTyxLQUFLaEIsS0FKWjtBQUFBLFVBSVZFLEtBSlUsZUFJVkEsS0FKVTtBQUFBLFVBSUhDLE1BSkcsZUFJSEEsTUFKRztBQUtqQixVQUFNYyxHQUFHLEdBQUcsRUFBWjs7QUFDQSxVQUFJTCxDQUFDLEdBQUdHLFVBQUosR0FBaUJiLEtBQWpCLEdBQXlCYyxRQUFRLENBQUNkLEtBQXRDLEVBQTZDO0FBQzNDZSxRQUFBQSxHQUFHLENBQUNDLEtBQUosR0FBWUYsUUFBUSxDQUFDZCxLQUFULEdBQWlCVSxDQUFqQixHQUFxQkcsVUFBakM7QUFDRCxPQUZELE1BRU87QUFDTEUsUUFBQUEsR0FBRyxDQUFDRSxJQUFKLEdBQVdQLENBQUMsR0FBR0csVUFBZjtBQUNEOztBQUVELFVBQUlGLENBQUMsR0FBR0MsU0FBSixHQUFnQlgsTUFBaEIsR0FBeUJhLFFBQVEsQ0FBQ2IsTUFBdEMsRUFBOEM7QUFDNUNjLFFBQUFBLEdBQUcsQ0FBQ0csTUFBSixHQUFhLEVBQWI7QUFDRCxPQUZELE1BRU87QUFDTEgsUUFBQUEsR0FBRyxDQUFDSSxHQUFKLEdBQVVSLENBQUMsR0FBR0MsU0FBZDtBQUNEOztBQUVELGFBQU9HLEdBQVA7QUFDRDs7OzZCQUVRO0FBQUE7O0FBQUEsd0JBVUgsS0FBSzlCLEtBVkY7QUFBQSxVQUVMeUIsQ0FGSyxlQUVMQSxDQUZLO0FBQUEsVUFHTEMsQ0FISyxlQUdMQSxDQUhLO0FBQUEsVUFJTFMsU0FKSyxlQUlMQSxTQUpLO0FBQUEsVUFLTEMsSUFMSyxlQUtMQSxJQUxLO0FBQUEsVUFNTEMsS0FOSyxlQU1MQSxLQU5LO0FBQUEsVUFPTEMsT0FQSyxlQU9MQSxPQVBLO0FBQUEsVUFRTEMsTUFSSyxlQVFMQSxNQVJLO0FBQUEsOENBU0xDLFlBVEs7QUFBQSxVQVNMQSxZQVRLLHNDQVNVLEVBVFY7QUFXUCxVQUFNQyxNQUFNLEdBQUcsQ0FBQ04sU0FBRCxJQUFjLENBQUMsS0FBS3RCLEtBQUwsQ0FBV0MsV0FBekM7QUFYTyxVQVlBQyxLQVpBLEdBWVMsS0FBS0YsS0FaZCxDQVlBRSxLQVpBOztBQWNQLFVBQUksQ0FBQ3FCLElBQUQsSUFBUyxDQUFDQyxLQUFWLElBQW1CLENBQUNHLFlBQVksQ0FBQ0UsTUFBckMsRUFBNkM7QUFDM0MsZUFBTyxJQUFQO0FBQ0Q7O0FBRUQsVUFBTUMsU0FBUyxHQUFHO0FBQUNQLFFBQUFBLElBQUksRUFBSkEsSUFBRDtBQUFPQyxRQUFBQSxLQUFLLEVBQUxBLEtBQVA7QUFBY0csUUFBQUEsWUFBWSxFQUFaQSxZQUFkO0FBQTRCRCxRQUFBQSxNQUFNLEVBQU5BO0FBQTVCLE9BQWxCO0FBRUEsVUFBTUssS0FBSyxHQUNUQyxNQUFNLENBQUNDLFFBQVAsQ0FBZ0JyQixDQUFoQixLQUFzQm9CLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQnBCLENBQWhCLENBQXRCLEdBQTJDLEtBQUtxQixZQUFMLENBQWtCdEIsQ0FBbEIsRUFBcUJDLENBQXJCLENBQTNDLEdBQXFFLEVBRHZFO0FBR0EsYUFDRSxnQ0FBQyxnQkFBRDtBQUNFLFFBQUEsUUFBUSxFQUFFLGtCQUFBc0IsSUFBSSxFQUFJO0FBQ2hCLFVBQUEsTUFBSSxDQUFDN0IsT0FBTCxHQUFlNkIsSUFBZjtBQUNELFNBSEg7QUFJRSxRQUFBLFNBQVMsRUFBRSw0QkFBVyxhQUFYLEVBQTBCO0FBQUNQLFVBQUFBLE1BQU0sRUFBTkE7QUFBRCxTQUExQixDQUpiO0FBS0UsUUFBQSxLQUFLLG9CQUNBRyxLQURBO0FBRUhLLFVBQUFBLFFBQVEsRUFBRWxDO0FBRlAsVUFMUDtBQVNFLFFBQUEsWUFBWSxFQUFFLHdCQUFNO0FBQ2xCLFVBQUEsTUFBSSxDQUFDUyxRQUFMLENBQWM7QUFBQ1YsWUFBQUEsV0FBVyxFQUFFO0FBQWQsV0FBZDtBQUNELFNBWEg7QUFZRSxRQUFBLFlBQVksRUFBRSx3QkFBTTtBQUNsQixVQUFBLE1BQUksQ0FBQ1UsUUFBTCxDQUFjO0FBQUNWLFlBQUFBLFdBQVcsRUFBRTtBQUFkLFdBQWQ7QUFDRDtBQWRILFNBZ0JHd0IsT0FBTyxHQUNOO0FBQUssUUFBQSxTQUFTLEVBQUM7QUFBZixTQUNFO0FBQUssUUFBQSxTQUFTLEVBQUM7QUFBZixRQURGLEVBRUUsZ0NBQUMsU0FBRDtBQUFXLFFBQUEsU0FBUyxFQUFDLGFBQXJCO0FBQW1DLFFBQUEsT0FBTyxFQUFFLEtBQUt0QyxLQUFMLENBQVdrRDtBQUF2RCxTQUNFLGdDQUFDLFVBQUQ7QUFBSyxRQUFBLE1BQU0sRUFBQztBQUFaLFFBREYsQ0FGRixDQURNLEdBT0osSUF2Qk4sRUF3QkUsZ0NBQUMsZUFBRDtBQUFpQixRQUFBLFNBQVMsRUFBQztBQUEzQixTQUNFLGdDQUFDLGFBQUQ7QUFBUSxRQUFBLE1BQU0sRUFBQztBQUFmLFFBREYsRUFFR2IsS0FBSyxDQUFDYyxNQUFOLENBQWFDLEtBRmhCLENBeEJGLEVBNEJFO0FBQU8sUUFBQSxTQUFTLEVBQUM7QUFBakIsU0FDR2YsS0FBSyxDQUFDZ0IsWUFBTixHQUNDaEIsS0FBSyxDQUFDaUIsSUFBTixLQUFlLFVBQWYsSUFBNkJqQixLQUFLLENBQUNpQixJQUFOLEtBQWUsU0FBNUMsR0FDRSxnQ0FBQyxnQkFBRCxFQUFzQlgsU0FBdEIsQ0FERixHQUdFLGdDQUFDLFFBQUQsRUFBY0EsU0FBZCxDQUpILEdBT0MsZ0NBQUMsU0FBRCxFQUFlQSxTQUFmLENBUkosQ0E1QkYsQ0FERjtBQTBDRDs7O0VBdEk2QlksZ0I7OztpQ0FBbkIzQyxVLGVBQ1E7QUFDakIyQixFQUFBQSxNQUFNLEVBQUVpQixzQkFBVUMsT0FBVixDQUFrQkQsc0JBQVVFLEdBQTVCLENBRFM7QUFFakJsQixFQUFBQSxZQUFZLEVBQUVnQixzQkFBVUMsT0FBVixDQUFrQkQsc0JBQVVFLEdBQTVCLENBRkc7QUFHakJ2QixFQUFBQSxTQUFTLEVBQUVxQixzQkFBVUcsSUFISjtBQUlqQnRCLEVBQUFBLEtBQUssRUFBRW1CLHNCQUFVSSxNQUpBO0FBS2pCeEIsRUFBQUEsSUFBSSxFQUFFb0Isc0JBQVVLLFNBQVYsQ0FBb0IsQ0FDeEJMLHNCQUFVQyxPQUFWLENBQWtCRCxzQkFBVUUsR0FBNUIsQ0FEd0IsRUFFeEJGLHNCQUFVSSxNQUZjLENBQXBCLENBTFc7QUFTakJ0QixFQUFBQSxPQUFPLEVBQUVrQixzQkFBVUcsSUFURjtBQVVqQmxDLEVBQUFBLENBQUMsRUFBRStCLHNCQUFVTSxNQVZJO0FBV2pCcEMsRUFBQUEsQ0FBQyxFQUFFOEIsc0JBQVVNLE1BWEk7QUFZakJaLEVBQUFBLE9BQU8sRUFBRU0sc0JBQVVPLElBWkY7QUFhakJsQyxFQUFBQSxRQUFRLEVBQUUyQixzQkFBVUksTUFBVixDQUFpQkk7QUFiVixDOztBQXdJckIsSUFBTUMsR0FBRyxHQUFHLFNBQU5BLEdBQU0sT0FBd0I7QUFBQSxNQUF0QkMsSUFBc0IsUUFBdEJBLElBQXNCO0FBQUEsTUFBaEJDLEtBQWdCLFFBQWhCQSxLQUFnQjtBQUFBLE1BQVRDLEdBQVMsUUFBVEEsR0FBUzs7QUFDbEM7QUFDQSxNQUFJLENBQUNBLEdBQUQsSUFBUUQsS0FBUixJQUFpQixPQUFPQSxLQUFQLEtBQWlCLFFBQWxDLElBQThDQSxLQUFLLENBQUNFLEtBQU4sQ0FBWSxPQUFaLENBQWxELEVBQXdFO0FBQ3RFRCxJQUFBQSxHQUFHLEdBQUdELEtBQU47QUFDRDs7QUFFRCxNQUFNRyxLQUFLLEdBQUcsUUFBUUMsSUFBUixDQUFhTCxJQUFiLENBQWQ7QUFDQSxTQUNFO0FBQUksSUFBQSxTQUFTLEVBQUMsS0FBZDtBQUFvQixJQUFBLEdBQUcsRUFBRUE7QUFBekIsS0FDRTtBQUFJLElBQUEsU0FBUyxFQUFDO0FBQWQsS0FBMkJBLElBQTNCLENBREYsRUFFRTtBQUFJLElBQUEsU0FBUyxFQUFDO0FBQWQsS0FDR0ksS0FBSyxHQUNKO0FBQUssSUFBQSxHQUFHLEVBQUVIO0FBQVYsSUFESSxHQUVGQyxHQUFHLEdBQ0w7QUFBRyxJQUFBLE1BQU0sRUFBQyxRQUFWO0FBQW1CLElBQUEsR0FBRyxFQUFDLHFCQUF2QjtBQUE2QyxJQUFBLElBQUksRUFBRUE7QUFBbkQsS0FDR0QsS0FESCxDQURLLEdBS0xBLEtBUkosQ0FGRixDQURGO0FBZ0JELENBdkJEOztBQXlCQSxJQUFNSyxTQUFTLEdBQUcsU0FBWkEsU0FBWTtBQUFBLE1BQUVoQyxZQUFGLFNBQUVBLFlBQUY7QUFBQSxNQUFnQkQsTUFBaEIsU0FBZ0JBLE1BQWhCO0FBQUEsTUFBd0JILElBQXhCLFNBQXdCQSxJQUF4QjtBQUFBLFNBQ2hCLCtDQUNHSSxZQUFZLENBQUNpQyxHQUFiLENBQWlCLFVBQUFQLElBQUk7QUFBQSxXQUNwQixnQ0FBQyxZQUFEO0FBQWMsTUFBQSxHQUFHLEVBQUVBLElBQW5CO0FBQXlCLE1BQUEsSUFBSSxFQUFFQSxJQUEvQjtBQUFxQyxNQUFBLE1BQU0sRUFBRTNCLE1BQTdDO0FBQXFELE1BQUEsSUFBSSxFQUFFSDtBQUEzRCxNQURvQjtBQUFBLEdBQXJCLENBREgsQ0FEZ0I7QUFBQSxDQUFsQjs7QUFRQSxJQUFNc0MsWUFBWSxHQUFHLFNBQWZBLFlBQWUsUUFBMEI7QUFBQSxNQUF4QlIsSUFBd0IsU0FBeEJBLElBQXdCO0FBQUEsTUFBbEIzQixNQUFrQixTQUFsQkEsTUFBa0I7QUFBQSxNQUFWSCxJQUFVLFNBQVZBLElBQVU7QUFDN0MsTUFBTXVDLEtBQUssR0FBR3BDLE1BQU0sQ0FBQ3FDLElBQVAsQ0FBWSxVQUFBQyxDQUFDO0FBQUEsV0FBSUEsQ0FBQyxDQUFDWCxJQUFGLEtBQVdBLElBQWY7QUFBQSxHQUFiLENBQWQ7O0FBQ0EsTUFBSSxDQUFDUyxLQUFMLEVBQVk7QUFDVixXQUFPLElBQVA7QUFDRDs7QUFFRCxNQUFNRyxRQUFRLEdBQUdILEtBQUssQ0FBQ0ksZUFBTixHQUF3QixDQUF6Qzs7QUFDQSxNQUFNQyxNQUFNLEdBQUdDLGNBQWMsQ0FBQ04sS0FBSyxDQUFDckIsSUFBUCxDQUE3Qjs7QUFFQSxTQUNFLGdDQUFDLEdBQUQ7QUFBSyxJQUFBLElBQUksRUFBRVksSUFBWDtBQUFpQixJQUFBLEtBQUssRUFBRWMsTUFBTSxHQUFHQSxNQUFNLENBQUM1QyxJQUFJLENBQUMwQyxRQUFELENBQUwsQ0FBVCxHQUE0QjFDLElBQUksQ0FBQzBDLFFBQUQ7QUFBOUQsSUFERjtBQUdELENBWkQ7O0FBY0EsSUFBTUksUUFBUSxHQUFHLFNBQVhBLFFBQVcsUUFBbUI7QUFBQSxNQUFqQjlDLElBQWlCLFNBQWpCQSxJQUFpQjtBQUFBLE1BQVhDLEtBQVcsU0FBWEEsS0FBVztBQUFBLHNCQUNGQSxLQUFLLENBQUNjLE1BREo7QUFBQSxNQUMzQmdDLFVBRDJCLGlCQUMzQkEsVUFEMkI7QUFBQSxNQUNmQyxTQURlLGlCQUNmQSxTQURlO0FBR2xDLFNBQ0UsK0NBQ0UsZ0NBQUMsR0FBRDtBQUNFLElBQUEsSUFBSSxFQUFFLGNBRFI7QUFFRSxJQUFBLEdBQUcsRUFBQyxPQUZOO0FBR0UsSUFBQSxLQUFLLEVBQUVoRCxJQUFJLENBQUNpRCxNQUFMLElBQWVqRCxJQUFJLENBQUNpRCxNQUFMLENBQVkzQztBQUhwQyxJQURGLEVBTUd5QyxVQUFVLElBQUk5QyxLQUFLLENBQUNpRCxjQUFOLENBQXFCQyxLQUFuQyxHQUNDLGdDQUFDLEdBQUQ7QUFDRSxJQUFBLElBQUksRUFBRWxELEtBQUssQ0FBQ21ELDJCQUFOLENBQWtDLE9BQWxDLEVBQTJDQyxPQURuRDtBQUVFLElBQUEsR0FBRyxFQUFDLE9BRk47QUFHRSxJQUFBLEtBQUssRUFBRXJELElBQUksQ0FBQ3NELFVBQUwsSUFBbUI7QUFINUIsSUFERCxHQU1HLElBWk4sRUFhR04sU0FBUyxJQUFJL0MsS0FBSyxDQUFDaUQsY0FBTixDQUFxQkssSUFBbEMsR0FDQyxnQ0FBQyxHQUFEO0FBQ0UsSUFBQSxJQUFJLEVBQUV0RCxLQUFLLENBQUNtRCwyQkFBTixDQUFrQyxNQUFsQyxFQUEwQ0MsT0FEbEQ7QUFFRSxJQUFBLEdBQUcsRUFBQyxNQUZOO0FBR0UsSUFBQSxLQUFLLEVBQUVyRCxJQUFJLENBQUN3RCxjQUFMLElBQXVCO0FBSGhDLElBREQsR0FNRyxJQW5CTixDQURGO0FBdUJELENBMUJEOztBQTRCQSxJQUFNQyxnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQW1CLFFBQW1CO0FBQUEsTUFBakJ6RCxJQUFpQixTQUFqQkEsSUFBaUI7QUFBQSxNQUFYQyxLQUFXLFNBQVhBLEtBQVc7QUFBQSx1QkFDUkEsS0FBSyxDQUFDYyxNQURFO0FBQUEsTUFDbkNnQyxVQURtQyxrQkFDbkNBLFVBRG1DO0FBQUEsTUFDdkJXLFdBRHVCLGtCQUN2QkEsV0FEdUI7QUFBQSxNQUVuQ0MsUUFGbUMsR0FFdkIxRCxLQUFLLENBQUNjLE1BQU4sQ0FBYTZDLFNBRlUsQ0FFbkNELFFBRm1DO0FBRzFDLE1BQUlFLFFBQVEsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVkvRCxJQUFJLENBQUNnRSxVQUFqQixDQUFmO0FBQ0FILEVBQUFBLFFBQVEsR0FBR0EsUUFBUSxDQUFDSSxNQUFULENBQWdCLFVBQUFDLENBQUMsRUFBSTtBQUM5QixRQUNFQSxDQUFDLEtBQUssZ0JBQU4sSUFDQUEsQ0FBQyxLQUFLLE9BRE4sSUFFQUEsQ0FBQyxLQUFLLFFBRk4sSUFHQUEsQ0FBQyxJQUFJLHNCQUpQLEVBS0U7QUFDQSxhQUFPQSxDQUFQO0FBQ0Q7QUFDRixHQVRVLENBQVg7QUFVQSxTQUNFLCtDQUNFLGdDQUFDLEdBQUQ7QUFBSyxJQUFBLElBQUksRUFBRSxjQUFYO0FBQTJCLElBQUEsR0FBRyxFQUFDLE9BQS9CO0FBQXVDLElBQUEsS0FBSyxFQUFFbEUsSUFBSSxDQUFDZ0UsVUFBTCxDQUFnQkc7QUFBOUQsSUFERixFQU9HcEIsVUFBVSxJQUFJOUMsS0FBSyxDQUFDaUQsY0FBTixDQUFxQkMsS0FBbkMsR0FDQyxnQ0FBQyxHQUFEO0FBQ0UsSUFBQSxJQUFJLEVBQUVsRCxLQUFLLENBQUNtRCwyQkFBTixDQUFrQyxPQUFsQyxFQUEyQ0MsT0FEbkQ7QUFFRSxJQUFBLEdBQUcsRUFBQyxPQUZOO0FBR0UsSUFBQSxLQUFLLEVBQUVyRCxJQUFJLENBQUNnRSxVQUFMLENBQWdCSSxjQUFoQixJQUFrQztBQUgzQyxJQURELEdBTUcsSUFiTixFQWNHVixXQUFXLElBQUlDLFFBQWYsSUFBMkIxRCxLQUFLLENBQUNpRCxjQUFOLENBQXFCdEUsTUFBaEQsR0FDQyxnQ0FBQyxHQUFEO0FBQ0UsSUFBQSxJQUFJLEVBQUVxQixLQUFLLENBQUNtRCwyQkFBTixDQUFrQyxRQUFsQyxFQUE0Q0MsT0FEcEQ7QUFFRSxJQUFBLEdBQUcsRUFBQyxRQUZOO0FBR0UsSUFBQSxLQUFLLEVBQUVyRCxJQUFJLENBQUNnRSxVQUFMLENBQWdCSyxvQkFBaEIsSUFBd0M7QUFIakQsSUFERCxHQU1HLElBcEJOLEVBcUJHUixRQUFRLENBQUN4QixHQUFULENBQWEsVUFBQTZCLENBQUM7QUFBQSxXQUNiLGdDQUFDLEdBQUQ7QUFBSyxNQUFBLElBQUksRUFBRUEsQ0FBWDtBQUFjLE1BQUEsR0FBRyxFQUFFQSxDQUFuQjtBQUFzQixNQUFBLEtBQUssRUFBRWxFLElBQUksQ0FBQ2dFLFVBQUwsQ0FBZ0JFLENBQWhCO0FBQTdCLE1BRGE7QUFBQSxHQUFkLENBckJILENBREY7QUEyQkQsQ0F6Q0Q7O0FBMkNBLFNBQVNyQixjQUFULENBQXdCM0IsSUFBeEIsRUFBOEI7QUFDNUIsU0FBT29ELHNDQUFxQnBELElBQXJCLENBQVA7QUFDRDs7QUFFRCxJQUFNcUQsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFvQjtBQUFBLFNBQU0vRixVQUFOO0FBQUEsQ0FBMUI7O2VBQ2UrRixpQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxOSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQge0NlbnRlckZsZXhib3h9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7UGluLCBMYXllcnN9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2ljb25zJztcbmltcG9ydCB7RklFTERfRElTUExBWV9GT1JNQVR9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuY29uc3QgTUFYX1dJRFRIID0gNDAwO1xuY29uc3QgTUFYX0hFSUdIVCA9IDYwMDtcblxuY29uc3QgU3R5bGVkTWFwUG9wb3ZlciA9IHN0eWxlZC5kaXZgXG4gICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2Nyb2xsQmFyfVxuICBmb250LXNpemU6IDExcHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kfTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbiAgei1pbmRleDogMTAwMTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBvdmVyZmxvdy14OiBhdXRvO1xuXG4gIC5ndXR0ZXIge1xuICAgIGhlaWdodDogNnB4O1xuICB9XG5cbiAgdGFibGUge1xuICAgIG1hcmdpbjogMnB4IDEycHggMTJweCAxMnB4O1xuICAgIHdpZHRoOiBhdXRvO1xuXG4gICAgdGJvZHkge1xuICAgICAgYm9yZGVyLXRvcDogdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXItYm90dG9tOiB0cmFuc3BhcmVudDtcbiAgICB9XG5cbiAgICB0ZCB7XG4gICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgcGFkZGluZzogNHB4O1xuICAgICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbiAgICB9XG5cbiAgICB0ZC5yb3dfX3ZhbHVlIHtcbiAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckhsfTtcbiAgICB9XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZFBpbiA9IHN0eWxlZC5kaXZgXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgzMGRlZyk7XG4gIHRvcDogMTBweDtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucHJpbWFyeUJ0bkJnZH07XG5cbiAgOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubGlua0J0bkNvbG9yfTtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkTGF5ZXJOYW1lID0gQ2VudGVyRmxleGJveC5leHRlbmRgXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckhsfTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsZXR0ZXItc3BhY2luZzogMC40M3B4O1xuICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcbiAgcGFkZGluZy1sZWZ0OiAxNHB4O1xuICBtYXJnaW4tdG9wOiAxMnB4O1xuXG4gIHN2ZyB7XG4gICAgbWFyZ2luLXJpZ2h0OiA0cHg7XG4gIH1cbmA7XG5cbmV4cG9ydCBjbGFzcyBNYXBQb3BvdmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBmaWVsZHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLFxuICAgIGZpZWxkc1RvU2hvdzogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSksXG4gICAgaXNWaXNpYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBsYXllcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkYXRhOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgIFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLFxuICAgICAgUHJvcFR5cGVzLm9iamVjdFxuICAgIF0pLFxuICAgIGZyZWV6ZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIHg6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgeTogUHJvcFR5cGVzLm51bWJlcixcbiAgICBvbkNsb3NlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBtYXBTdGF0ZTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGlzTW91c2VPdmVyOiBmYWxzZSxcbiAgICAgIHdpZHRoOiAzODAsXG4gICAgICBoZWlnaHQ6IDE2MFxuICAgIH07XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLl9zZXRDb250YWluZXJTaXplKCk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgdGhpcy5fc2V0Q29udGFpbmVyU2l6ZSgpO1xuICB9XG5cbiAgX3NldENvbnRhaW5lclNpemUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMucG9wb3ZlcjtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWluKG5vZGUuc2Nyb2xsV2lkdGgsIE1BWF9XSURUSCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5taW4obm9kZS5zY3JvbGxIZWlnaHQsIE1BWF9IRUlHSFQpO1xuXG4gICAgaWYgKHdpZHRoICE9PSB0aGlzLnN0YXRlLndpZHRoIHx8IGhlaWdodCAhPT0gdGhpcy5zdGF0ZS5oZWlnaHQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe3dpZHRoLCBoZWlnaHR9KTtcbiAgICB9XG4gIH1cblxuICBfZ2V0UG9zaXRpb24oeCwgeSkge1xuICAgIGNvbnN0IHRvcE9mZnNldCA9IDMwO1xuICAgIGNvbnN0IGxlZnRPZmZzZXQgPSAzMDtcbiAgICBjb25zdCB7bWFwU3RhdGV9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHBvcyA9IHt9O1xuICAgIGlmICh4ICsgbGVmdE9mZnNldCArIHdpZHRoID4gbWFwU3RhdGUud2lkdGgpIHtcbiAgICAgIHBvcy5yaWdodCA9IG1hcFN0YXRlLndpZHRoIC0geCArIGxlZnRPZmZzZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcy5sZWZ0ID0geCArIGxlZnRPZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKHkgKyB0b3BPZmZzZXQgKyBoZWlnaHQgPiBtYXBTdGF0ZS5oZWlnaHQpIHtcbiAgICAgIHBvcy5ib3R0b20gPSAxMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9zLnRvcCA9IHkgKyB0b3BPZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvcztcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIGlzVmlzaWJsZSxcbiAgICAgIGRhdGEsXG4gICAgICBsYXllcixcbiAgICAgIGZyZWV6ZWQsXG4gICAgICBmaWVsZHMsXG4gICAgICBmaWVsZHNUb1Nob3cgPSBbXVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGhpZGRlbiA9ICFpc1Zpc2libGUgJiYgIXRoaXMuc3RhdGUuaXNNb3VzZU92ZXI7XG4gICAgY29uc3Qge3dpZHRofSA9IHRoaXMuc3RhdGU7XG5cbiAgICBpZiAoIWRhdGEgfHwgIWxheWVyIHx8ICFmaWVsZHNUb1Nob3cubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBpbmZvUHJvcHMgPSB7ZGF0YSwgbGF5ZXIsIGZpZWxkc1RvU2hvdywgZmllbGRzfTtcblxuICAgIGNvbnN0IHN0eWxlID1cbiAgICAgIE51bWJlci5pc0Zpbml0ZSh4KSAmJiBOdW1iZXIuaXNGaW5pdGUoeSkgPyB0aGlzLl9nZXRQb3NpdGlvbih4LCB5KSA6IHt9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRNYXBQb3BvdmVyXG4gICAgICAgIGlubmVyUmVmPXtjb21wID0+IHtcbiAgICAgICAgICB0aGlzLnBvcG92ZXIgPSBjb21wO1xuICAgICAgICB9fVxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoJ21hcC1wb3BvdmVyJywge2hpZGRlbn0pfVxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgIG1heFdpZHRoOiB3aWR0aFxuICAgICAgICB9fVxuICAgICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtpc01vdXNlT3ZlcjogdHJ1ZX0pO1xuICAgICAgICB9fVxuICAgICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtpc01vdXNlT3ZlcjogZmFsc2V9KTtcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge2ZyZWV6ZWQgPyAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYXAtcG9wb3Zlcl9fdG9wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImd1dHRlclwiIC8+XG4gICAgICAgICAgICA8U3R5bGVkUGluIGNsYXNzTmFtZT1cInBvcG92ZXItcGluXCIgb25DbGljaz17dGhpcy5wcm9wcy5vbkNsb3NlfT5cbiAgICAgICAgICAgICAgPFBpbiBoZWlnaHQ9XCIxNnB4XCIgLz5cbiAgICAgICAgICAgIDwvU3R5bGVkUGluPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPFN0eWxlZExheWVyTmFtZSBjbGFzc05hbWU9XCJtYXAtcG9wb3Zlcl9fbGF5ZXItbmFtZVwiPlxuICAgICAgICAgIDxMYXllcnMgaGVpZ2h0PVwiMTJweFwiIC8+XG4gICAgICAgICAge2xheWVyLmNvbmZpZy5sYWJlbH1cbiAgICAgICAgPC9TdHlsZWRMYXllck5hbWU+XG4gICAgICAgIDx0YWJsZSBjbGFzc05hbWU9XCJtYXAtcG9wb3Zlcl9fdGFibGVcIj5cbiAgICAgICAgICB7bGF5ZXIuaXNBZ2dyZWdhdGVkID8gKFxuICAgICAgICAgICAgbGF5ZXIudHlwZSA9PT0gJ2JvdW5kYXJ5JyB8fCBsYXllci50eXBlID09PSAncGluY29kZScgPyAoXG4gICAgICAgICAgICAgIDxDZWxsSW5mb0JvdW5kYXJ5IHsuLi5pbmZvUHJvcHN9IC8+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8Q2VsbEluZm8gey4uLmluZm9Qcm9wc30gLz5cbiAgICAgICAgICAgIClcbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPEVudHJ5SW5mbyB7Li4uaW5mb1Byb3BzfSAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L1N0eWxlZE1hcFBvcG92ZXI+XG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBSb3cgPSAoe25hbWUsIHZhbHVlLCB1cmx9KSA9PiB7XG4gIC8vIFNldCAndXJsJyB0byAndmFsdWUnIGlmIGl0IGxvb2tzIGxpa2UgYSB1cmxcbiAgaWYgKCF1cmwgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5tYXRjaCgvXmh0dHAvKSkge1xuICAgIHVybCA9IHZhbHVlO1xuICB9XG5cbiAgY29uc3QgYXNJbWcgPSAvPGltZz4vLnRlc3QobmFtZSk7XG4gIHJldHVybiAoXG4gICAgPHRyIGNsYXNzTmFtZT1cInJvd1wiIGtleT17bmFtZX0+XG4gICAgICA8dGQgY2xhc3NOYW1lPVwicm93X19uYW1lXCI+e25hbWV9PC90ZD5cbiAgICAgIDx0ZCBjbGFzc05hbWU9XCJyb3dfX3ZhbHVlXCI+XG4gICAgICAgIHthc0ltZyA/IChcbiAgICAgICAgICA8aW1nIHNyYz17dmFsdWV9IC8+XG4gICAgICAgICkgOiB1cmwgPyAoXG4gICAgICAgICAgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIGhyZWY9e3VybH0+XG4gICAgICAgICAgICB7dmFsdWV9XG4gICAgICAgICAgPC9hPlxuICAgICAgICApIDogKFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgICl9XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICk7XG59O1xuXG5jb25zdCBFbnRyeUluZm8gPSAoe2ZpZWxkc1RvU2hvdywgZmllbGRzLCBkYXRhfSkgPT4gKFxuICA8dGJvZHk+XG4gICAge2ZpZWxkc1RvU2hvdy5tYXAobmFtZSA9PiAoXG4gICAgICA8RW50cnlJbmZvUm93IGtleT17bmFtZX0gbmFtZT17bmFtZX0gZmllbGRzPXtmaWVsZHN9IGRhdGE9e2RhdGF9IC8+XG4gICAgKSl9XG4gIDwvdGJvZHk+XG4pO1xuXG5jb25zdCBFbnRyeUluZm9Sb3cgPSAoe25hbWUsIGZpZWxkcywgZGF0YX0pID0+IHtcbiAgY29uc3QgZmllbGQgPSBmaWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gbmFtZSk7XG4gIGlmICghZmllbGQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlSWR4ID0gZmllbGQudGFibGVGaWVsZEluZGV4IC0gMTtcbiAgY29uc3QgZm9ybWF0ID0gX2dldENlbGxGb3JtYXQoZmllbGQudHlwZSk7XG5cbiAgcmV0dXJuIChcbiAgICA8Um93IG5hbWU9e25hbWV9IHZhbHVlPXtmb3JtYXQgPyBmb3JtYXQoZGF0YVt2YWx1ZUlkeF0pIDogZGF0YVt2YWx1ZUlkeF19IC8+XG4gICk7XG59O1xuXG5jb25zdCBDZWxsSW5mbyA9ICh7ZGF0YSwgbGF5ZXJ9KSA9PiB7XG4gIGNvbnN0IHtjb2xvckZpZWxkLCBzaXplRmllbGR9ID0gbGF5ZXIuY29uZmlnO1xuXG4gIHJldHVybiAoXG4gICAgPHRib2R5PlxuICAgICAgPFJvd1xuICAgICAgICBuYW1lPXsndG90YWwgcG9pbnRzJ31cbiAgICAgICAga2V5PVwiY291bnRcIlxuICAgICAgICB2YWx1ZT17ZGF0YS5wb2ludHMgJiYgZGF0YS5wb2ludHMubGVuZ3RofVxuICAgICAgLz5cbiAgICAgIHtjb2xvckZpZWxkICYmIGxheWVyLnZpc3VhbENoYW5uZWxzLmNvbG9yID8gKFxuICAgICAgICA8Um93XG4gICAgICAgICAgbmFtZT17bGF5ZXIuZ2V0VmlzdWFsQ2hhbm5lbERlc2NyaXB0aW9uKCdjb2xvcicpLm1lYXN1cmV9XG4gICAgICAgICAga2V5PVwiY29sb3JcIlxuICAgICAgICAgIHZhbHVlPXtkYXRhLmNvbG9yVmFsdWUgfHwgJ04vQSd9XG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIHtzaXplRmllbGQgJiYgbGF5ZXIudmlzdWFsQ2hhbm5lbHMuc2l6ZSA/IChcbiAgICAgICAgPFJvd1xuICAgICAgICAgIG5hbWU9e2xheWVyLmdldFZpc3VhbENoYW5uZWxEZXNjcmlwdGlvbignc2l6ZScpLm1lYXN1cmV9XG4gICAgICAgICAga2V5PVwic2l6ZVwiXG4gICAgICAgICAgdmFsdWU9e2RhdGEuZWxldmF0aW9uVmFsdWUgfHwgJ04vQSd9XG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICA8L3Rib2R5PlxuICApO1xufTtcblxuY29uc3QgQ2VsbEluZm9Cb3VuZGFyeSA9ICh7ZGF0YSwgbGF5ZXJ9KSA9PiB7XG4gIGNvbnN0IHtjb2xvckZpZWxkLCBoZWlnaHRGaWVsZH0gPSBsYXllci5jb25maWc7XG4gIGNvbnN0IHtlbmFibGUzZH0gPSBsYXllci5jb25maWcudmlzQ29uZmlnO1xuICB2YXIgZGF0YUtleXMgPSBPYmplY3Qua2V5cyhkYXRhLnByb3BlcnRpZXMpO1xuICBkYXRhS2V5cyA9IGRhdGFLZXlzLmZpbHRlcihkID0+IHtcbiAgICBpZiAoXG4gICAgICBkICE9PSAnYWdncmVnYXRlZERhdGEnICYmXG4gICAgICBkICE9PSAnY291bnQnICYmXG4gICAgICBkICE9PSAndmFsdWVzJyAmJlxuICAgICAgZCAhPSAnaGVpZ2h0QWdncmVnYXRlZERhdGEnXG4gICAgKSB7XG4gICAgICByZXR1cm4gZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gKFxuICAgIDx0Ym9keT5cbiAgICAgIDxSb3cgbmFtZT17J3RvdGFsIHBvaW50cyd9IGtleT1cImNvdW50XCIgdmFsdWU9e2RhdGEucHJvcGVydGllcy5jb3VudH0gLz5cbiAgICAgIHsvKiA8Um93XG4gICAgICAgIG5hbWU9eyd0b3RhbCBwb2ludHMnfVxuICAgICAgICBrZXk9XCJjb3VudFwiXG4gICAgICAgIHZhbHVlPXtkYXRhLnByb3BlcnRpZXMubG9jYWxpdHlfbmFtZX1cbiAgICAgIC8+ICovfVxuICAgICAge2NvbG9yRmllbGQgJiYgbGF5ZXIudmlzdWFsQ2hhbm5lbHMuY29sb3IgPyAoXG4gICAgICAgIDxSb3dcbiAgICAgICAgICBuYW1lPXtsYXllci5nZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24oJ2NvbG9yJykubWVhc3VyZX1cbiAgICAgICAgICBrZXk9XCJjb2xvclwiXG4gICAgICAgICAgdmFsdWU9e2RhdGEucHJvcGVydGllcy5hZ2dyZWdhdGVkRGF0YSB8fCAnTi9BJ31cbiAgICAgICAgLz5cbiAgICAgICkgOiBudWxsfVxuICAgICAge2hlaWdodEZpZWxkICYmIGVuYWJsZTNkICYmIGxheWVyLnZpc3VhbENoYW5uZWxzLmhlaWdodCA/IChcbiAgICAgICAgPFJvd1xuICAgICAgICAgIG5hbWU9e2xheWVyLmdldFZpc3VhbENoYW5uZWxEZXNjcmlwdGlvbignaGVpZ2h0JykubWVhc3VyZX1cbiAgICAgICAgICBrZXk9XCJoZWlnaHRcIlxuICAgICAgICAgIHZhbHVlPXtkYXRhLnByb3BlcnRpZXMuaGVpZ2h0QWdncmVnYXRlZERhdGEgfHwgJ04vQSd9XG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIHtkYXRhS2V5cy5tYXAoZCA9PiAoXG4gICAgICAgIDxSb3cgbmFtZT17ZH0ga2V5PXtkfSB2YWx1ZT17ZGF0YS5wcm9wZXJ0aWVzW2RdfSAvPlxuICAgICAgKSl9XG4gICAgPC90Ym9keT5cbiAgKTtcbn07XG5cbmZ1bmN0aW9uIF9nZXRDZWxsRm9ybWF0KHR5cGUpIHtcbiAgcmV0dXJuIEZJRUxEX0RJU1BMQVlfRk9STUFUW3R5cGVdO1xufVxuXG5jb25zdCBNYXBQb3BvdmVyRmFjdG9yeSA9ICgpID0+IE1hcFBvcG92ZXI7XG5leHBvcnQgZGVmYXVsdCBNYXBQb3BvdmVyRmFjdG9yeTtcbiJdfQ==