kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
384 lines (320 loc) • 43.8 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
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 _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
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 _window = require("global/window");
var _redux = require("redux");
var _d3Request = require("d3-request");
var _styledComponents = _interopRequireWildcard(require("styled-components"));
var _keplerglConnect = require("../connect/keplergl-connect");
var _mapboxGlStyleEditor = require("../utils/map-style-utils/mapbox-gl-style-editor");
var VisStateActions = _interopRequireWildcard(require("../actions/vis-state-actions"));
var MapStateActions = _interopRequireWildcard(require("../actions/map-state-actions"));
var MapStyleActions = _interopRequireWildcard(require("../actions/map-style-actions"));
var UIStateActions = _interopRequireWildcard(require("../actions/ui-state-actions"));
var _defaultSettings = require("../constants/default-settings");
var _sidePanel = _interopRequireDefault(require("./side-panel"));
var _mapContainer = _interopRequireDefault(require("./map-container"));
var _bottomWidget = _interopRequireDefault(require("./bottom-widget"));
var _modalContainer = _interopRequireDefault(require("./modal-container"));
var _plotContainer = _interopRequireDefault(require("./plot-container"));
var _notificationPanel = _interopRequireDefault(require("./notification-panel"));
var _utils = require("../utils/utils");
var _base = require("../styles/base");
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 _templateObject() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n font-family: ff-clan-web-pro, 'Helvetica Neue', Helvetica, sans-serif;\n font-weight: 400;\n font-size: 0.875em;\n line-height: 1.71429;\n\n *,\n *:before,\n *:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n }\n\n ul {\n margin: 0;\n padding: 0;\n }\n\n li {\n margin: 0;\n }\n\n a {\n text-decoration: none;\n color: ", ";\n }\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
// Maybe we should think about exporting this or creating a variable
// as part of the base.js theme
var GlobalStyle = _styledComponents["default"].div(_templateObject(), function (props) {
return props.theme.labelColor;
});
KeplerGlFactory.deps = [_bottomWidget["default"], _mapContainer["default"], _modalContainer["default"], _sidePanel["default"], _plotContainer["default"], _notificationPanel["default"]];
function KeplerGlFactory(BottomWidget, MapContainer, ModalWrapper, SidePanel, PlotContainer, NotificationPanel) {
var KeplerGL =
/*#__PURE__*/
function (_Component) {
(0, _inherits2["default"])(KeplerGL, _Component);
function KeplerGL() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2["default"])(this, KeplerGL);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = (0, _possibleConstructorReturn2["default"])(this, (_getPrototypeOf2 = (0, _getPrototypeOf3["default"])(KeplerGL)).call.apply(_getPrototypeOf2, [this].concat(args)));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_loadMapStyle", function () {
var defaultStyles = Object.values(_this.props.mapStyle.mapStyles); // add id to custom map styles if not given
var customeStyles = (_this.props.mapStyles || []).map(function (ms) {
return _objectSpread({}, ms, {
id: ms.id || (0, _utils.generateHashId)()
});
});
[].concat((0, _toConsumableArray2["default"])(customeStyles), (0, _toConsumableArray2["default"])(defaultStyles)).forEach(function (style) {
if (style.style) {
_this.props.mapStyleActions.loadMapStyles((0, _defineProperty2["default"])({}, style.id, style));
} else {
_this._requestMapStyle(style);
}
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_requestMapStyle", function (mapStyle) {
var url = mapStyle.url,
id = mapStyle.id;
var downloadUrl = (0, _mapboxGlStyleEditor.isValidStyleUrl)(url) ? (0, _mapboxGlStyleEditor.getStyleDownloadUrl)(url, _this.props.mapboxApiAccessToken) : url;
(0, _d3Request.json)(downloadUrl, function (error, result) {
if (error) {
_window.console.warn("Error loading map style ".concat(url));
} else {
_this.props.mapStyleActions.loadMapStyles((0, _defineProperty2["default"])({}, id, _objectSpread({}, mapStyle, {
style: result
})));
}
});
});
return _this;
}
(0, _createClass2["default"])(KeplerGL, [{
key: "componentWillMount",
value: function componentWillMount() {
this._loadMapStyle(this.props.mapStyles);
this._handleResize(this.props);
}
}, {
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(nextProps) {
if ( // if dimension props has changed
this.props.height !== nextProps.height || this.props.width !== nextProps.width || // react-map-gl will dispatch updateViewport after this._handleResize is called
// here we check if this.props.mapState.height is sync with props.height
nextProps.height !== this.props.mapState.height) {
this._handleResize(nextProps);
}
}
}, {
key: "_handleResize",
value: function _handleResize(_ref) {
var width = _ref.width,
height = _ref.height;
if (!Number.isFinite(width) || !Number.isFinite(height)) {
_window.console.warn('width and height is required');
return;
}
this.props.mapStateActions.updateMap({
width: width / (1 + Number(this.props.mapState.isSplit)),
height: height
});
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var _this$props = this.props,
id = _this$props.id,
appName = _this$props.appName,
version = _this$props.version,
onSaveMap = _this$props.onSaveMap,
width = _this$props.width,
height = _this$props.height,
mapboxApiAccessToken = _this$props.mapboxApiAccessToken,
mapStyle = _this$props.mapStyle,
mapState = _this$props.mapState,
uiState = _this$props.uiState,
visState = _this$props.visState,
visStateActions = _this$props.visStateActions,
mapStateActions = _this$props.mapStateActions,
mapStyleActions = _this$props.mapStyleActions,
uiStateActions = _this$props.uiStateActions;
var filters = visState.filters,
layers = visState.layers,
widgets = visState.widgets,
splitMaps = visState.splitMaps,
layerOrder = visState.layerOrder,
layerBlending = visState.layerBlending,
layerClasses = visState.layerClasses,
widgetOrder = visState.widgetOrder,
widgetClasses = visState.widgetClasses,
interactionConfig = visState.interactionConfig,
datasets = visState.datasets,
layerData = visState.layerData,
hoverInfo = visState.hoverInfo,
clicked = visState.clicked;
var notificationPanelFields = {
removeNotification: uiStateActions.removeNotification,
notifications: uiState.notifications
};
var sideFields = {
appName: appName,
version: version,
datasets: datasets,
filters: filters,
layers: layers,
layerOrder: layerOrder,
layerClasses: layerClasses,
widgets: widgets,
widgetOrder: widgetOrder,
widgetClasses: widgetClasses,
interactionConfig: interactionConfig,
mapStyle: mapStyle,
layerBlending: layerBlending,
onSaveMap: onSaveMap,
uiState: uiState,
mapState: mapState,
mapStyleActions: mapStyleActions,
visStateActions: visStateActions,
uiStateActions: uiStateActions,
width: _defaultSettings.DIMENSIONS.sidePanel.width
};
var mapFields = {
datasets: datasets,
mapboxApiAccessToken: mapboxApiAccessToken,
mapState: mapState,
mapStyle: mapStyle,
mapControls: uiState.mapControls,
layers: layers,
layerOrder: layerOrder,
layerData: layerData,
layerBlending: layerBlending,
interactionConfig: interactionConfig,
hoverInfo: hoverInfo,
clicked: clicked,
toggleMapControl: uiStateActions.toggleMapControl,
uiStateActions: uiStateActions,
visStateActions: visStateActions,
mapStateActions: mapStateActions
};
var isSplit = splitMaps && splitMaps.length > 1;
var containerW = mapState.width * (Number(isSplit) + 1);
var mapContainers = !isSplit ? [_react["default"].createElement(MapContainer, (0, _extends2["default"])({
key: 0,
index: 0
}, mapFields, {
mapLayers: isSplit ? splitMaps[0].layers : null
}))] : splitMaps.map(function (settings, index) {
return _react["default"].createElement(MapContainer, (0, _extends2["default"])({
key: index,
index: index
}, mapFields, {
mapLayers: splitMaps[index].layers
}));
});
var isExporting = uiState.currentModal === _defaultSettings.EXPORT_IMAGE_ID;
return _react["default"].createElement(_styledComponents.ThemeProvider, {
theme: _base.theme
}, _react["default"].createElement(GlobalStyle, {
style: {
position: 'relative',
width: "".concat(width, "px"),
height: "".concat(height, "px")
},
className: "kepler-gl",
id: "kepler-gl__".concat(id),
innerRef: function innerRef(node) {
_this2.root = node;
}
}, !uiState.readOnly && _react["default"].createElement(SidePanel, sideFields), _react["default"].createElement("div", {
className: "maps",
style: {
display: 'flex'
}
}, mapContainers), isExporting && _react["default"].createElement(PlotContainer, {
width: width,
height: height,
exportImageSetting: uiState.exportImage,
mapFields: mapFields,
startExportingImage: uiStateActions.startExportingImage,
setExportImageDataUri: uiStateActions.setExportImageDataUri
}), _react["default"].createElement(BottomWidget, {
filters: filters,
datasets: datasets,
uiState: uiState,
visStateActions: visStateActions,
sidePanelWidth: _defaultSettings.DIMENSIONS.sidePanel.width + _defaultSettings.DIMENSIONS.sidePanel.margin.left,
containerW: containerW
}), _react["default"].createElement(ModalWrapper, {
mapStyle: mapStyle,
visState: visState,
mapState: mapState,
uiState: uiState,
mapboxApiAccessToken: mapboxApiAccessToken,
visStateActions: visStateActions,
uiStateActions: uiStateActions,
mapStyleActions: mapStyleActions,
rootNode: this.root,
containerW: containerW,
containerH: mapState.height
})));
}
}]);
return KeplerGL;
}(_react.Component);
(0, _defineProperty2["default"])(KeplerGL, "defaultProps", {
mapStyles: [],
width: 800,
height: 800,
appName: _defaultSettings.KEPLER_GL_NAME,
version: _defaultSettings.KEPLER_GL_VERSION
});
return (0, _keplerglConnect.connect)(mapStateToProps, mapDispatchToProps)(KeplerGL);
}
function mapStateToProps(state, props) {
return _objectSpread({}, props, {
visState: state.visState,
mapStyle: state.mapStyle,
mapState: state.mapState,
uiState: state.uiState
});
}
function mapDispatchToProps(dispatch, ownProps) {
var userActions = ownProps.actions || {};
var _map = [VisStateActions, MapStateActions, MapStyleActions, UIStateActions].map(function (actions) {
return (0, _redux.bindActionCreators)(mergeActions(actions, userActions), dispatch);
}),
_map2 = (0, _slicedToArray2["default"])(_map, 4),
visStateActions = _map2[0],
mapStateActions = _map2[1],
mapStyleActions = _map2[2],
uiStateActions = _map2[3];
return {
visStateActions: visStateActions,
mapStateActions: mapStateActions,
mapStyleActions: mapStyleActions,
uiStateActions: uiStateActions,
dispatch: dispatch
};
}
/**
* Override default maps-gl actions with user defined actions using the same key
*/
function mergeActions(actions, userActions) {
var overrides = {};
for (var key in userActions) {
if (userActions.hasOwnProperty(key) && actions.hasOwnProperty(key)) {
overrides[key] = userActions[key];
}
}
return _objectSpread({}, actions, {}, overrides);
}
var _default = KeplerGlFactory;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2tlcGxlci1nbC5qcyJdLCJuYW1lcyI6WyJHbG9iYWxTdHlsZSIsInN0eWxlZCIsImRpdiIsInByb3BzIiwidGhlbWUiLCJsYWJlbENvbG9yIiwiS2VwbGVyR2xGYWN0b3J5IiwiZGVwcyIsIkJvdHRvbVdpZGdldEZhY3RvcnkiLCJNYXBDb250YWluZXJGYWN0b3J5IiwiTW9kYWxDb250YWluZXJGYWN0b3J5IiwiU2lkZVBhbmVsRmFjdG9yeSIsIlBsb3RDb250YWluZXJGYWN0b3J5IiwiTm90aWZpY2F0aW9uUGFuZWxGYWN0b3J5IiwiQm90dG9tV2lkZ2V0IiwiTWFwQ29udGFpbmVyIiwiTW9kYWxXcmFwcGVyIiwiU2lkZVBhbmVsIiwiUGxvdENvbnRhaW5lciIsIk5vdGlmaWNhdGlvblBhbmVsIiwiS2VwbGVyR0wiLCJkZWZhdWx0U3R5bGVzIiwiT2JqZWN0IiwidmFsdWVzIiwibWFwU3R5bGUiLCJtYXBTdHlsZXMiLCJjdXN0b21lU3R5bGVzIiwibWFwIiwibXMiLCJpZCIsImZvckVhY2giLCJzdHlsZSIsIm1hcFN0eWxlQWN0aW9ucyIsImxvYWRNYXBTdHlsZXMiLCJfcmVxdWVzdE1hcFN0eWxlIiwidXJsIiwiZG93bmxvYWRVcmwiLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiIsImVycm9yIiwicmVzdWx0IiwiQ29uc29sZSIsIndhcm4iLCJfbG9hZE1hcFN0eWxlIiwiX2hhbmRsZVJlc2l6ZSIsIm5leHRQcm9wcyIsImhlaWdodCIsIndpZHRoIiwibWFwU3RhdGUiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsIm1hcFN0YXRlQWN0aW9ucyIsInVwZGF0ZU1hcCIsImlzU3BsaXQiLCJhcHBOYW1lIiwidmVyc2lvbiIsIm9uU2F2ZU1hcCIsInVpU3RhdGUiLCJ2aXNTdGF0ZSIsInZpc1N0YXRlQWN0aW9ucyIsInVpU3RhdGVBY3Rpb25zIiwiZmlsdGVycyIsImxheWVycyIsIndpZGdldHMiLCJzcGxpdE1hcHMiLCJsYXllck9yZGVyIiwibGF5ZXJCbGVuZGluZyIsImxheWVyQ2xhc3NlcyIsIndpZGdldE9yZGVyIiwid2lkZ2V0Q2xhc3NlcyIsImludGVyYWN0aW9uQ29uZmlnIiwiZGF0YXNldHMiLCJsYXllckRhdGEiLCJob3ZlckluZm8iLCJjbGlja2VkIiwibm90aWZpY2F0aW9uUGFuZWxGaWVsZHMiLCJyZW1vdmVOb3RpZmljYXRpb24iLCJub3RpZmljYXRpb25zIiwic2lkZUZpZWxkcyIsIkRJTUVOU0lPTlMiLCJzaWRlUGFuZWwiLCJtYXBGaWVsZHMiLCJtYXBDb250cm9scyIsInRvZ2dsZU1hcENvbnRyb2wiLCJsZW5ndGgiLCJjb250YWluZXJXIiwibWFwQ29udGFpbmVycyIsInNldHRpbmdzIiwiaW5kZXgiLCJpc0V4cG9ydGluZyIsImN1cnJlbnRNb2RhbCIsIkVYUE9SVF9JTUFHRV9JRCIsInBvc2l0aW9uIiwibm9kZSIsInJvb3QiLCJyZWFkT25seSIsImRpc3BsYXkiLCJleHBvcnRJbWFnZSIsInN0YXJ0RXhwb3J0aW5nSW1hZ2UiLCJzZXRFeHBvcnRJbWFnZURhdGFVcmkiLCJtYXJnaW4iLCJsZWZ0IiwiQ29tcG9uZW50IiwiS0VQTEVSX0dMX05BTUUiLCJLRVBMRVJfR0xfVkVSU0lPTiIsIm1hcFN0YXRlVG9Qcm9wcyIsIm1hcERpc3BhdGNoVG9Qcm9wcyIsInN0YXRlIiwiZGlzcGF0Y2giLCJvd25Qcm9wcyIsInVzZXJBY3Rpb25zIiwiYWN0aW9ucyIsIlZpc1N0YXRlQWN0aW9ucyIsIk1hcFN0YXRlQWN0aW9ucyIsIk1hcFN0eWxlQWN0aW9ucyIsIlVJU3RhdGVBY3Rpb25zIiwibWVyZ2VBY3Rpb25zIiwib3ZlcnJpZGVzIiwia2V5IiwiaGFzT3duUHJvcGVydHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFPQTs7QUFDQTs7QUFD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MTkgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCB7YmluZEFjdGlvbkNyZWF0b3JzfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQge2pzb24gYXMgcmVxdWVzdEpzb259IGZyb20gJ2QzLXJlcXVlc3QnO1xuaW1wb3J0IHN0eWxlZCwge1RoZW1lUHJvdmlkZXJ9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7Y29ubmVjdCBhcyBrZXBsZXJHbENvbm5lY3R9IGZyb20gJ2Nvbm5lY3Qva2VwbGVyZ2wtY29ubmVjdCc7XG5pbXBvcnQge1xuICBpc1ZhbGlkU3R5bGVVcmwsXG4gIGdldFN0eWxlRG93bmxvYWRVcmxcbn0gZnJvbSAndXRpbHMvbWFwLXN0eWxlLXV0aWxzL21hcGJveC1nbC1zdHlsZS1lZGl0b3InO1xuXG5pbXBvcnQgKiBhcyBWaXNTdGF0ZUFjdGlvbnMgZnJvbSAnYWN0aW9ucy92aXMtc3RhdGUtYWN0aW9ucyc7XG5pbXBvcnQgKiBhcyBNYXBTdGF0ZUFjdGlvbnMgZnJvbSAnYWN0aW9ucy9tYXAtc3RhdGUtYWN0aW9ucyc7XG5pbXBvcnQgKiBhcyBNYXBTdHlsZUFjdGlvbnMgZnJvbSAnYWN0aW9ucy9tYXAtc3R5bGUtYWN0aW9ucyc7XG5pbXBvcnQgKiBhcyBVSVN0YXRlQWN0aW9ucyBmcm9tICdhY3Rpb25zL3VpLXN0YXRlLWFjdGlvbnMnO1xuXG5pbXBvcnQge1xuICBFWFBPUlRfSU1BR0VfSUQsXG4gIERJTUVOU0lPTlMsXG4gIEtFUExFUl9HTF9OQU1FLFxuICBLRVBMRVJfR0xfVkVSU0lPTlxufSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbmltcG9ydCBTaWRlUGFuZWxGYWN0b3J5IGZyb20gJy4vc2lkZS1wYW5lbCc7XG5pbXBvcnQgTWFwQ29udGFpbmVyRmFjdG9yeSBmcm9tICcuL21hcC1jb250YWluZXInO1xuaW1wb3J0IEJvdHRvbVdpZGdldEZhY3RvcnkgZnJvbSAnLi9ib3R0b20td2lkZ2V0JztcbmltcG9ydCBNb2RhbENvbnRhaW5lckZhY3RvcnkgZnJvbSAnLi9tb2RhbC1jb250YWluZXInO1xuaW1wb3J0IFBsb3RDb250YWluZXJGYWN0b3J5IGZyb20gJy4vcGxvdC1jb250YWluZXInO1xuaW1wb3J0IE5vdGlmaWNhdGlvblBhbmVsRmFjdG9yeSBmcm9tICcuL25vdGlmaWNhdGlvbi1wYW5lbCc7XG5cbmltcG9ydCB7Z2VuZXJhdGVIYXNoSWR9IGZyb20gJ3V0aWxzL3V0aWxzJztcblxuaW1wb3J0IHt0aGVtZX0gZnJvbSAnc3R5bGVzL2Jhc2UnO1xuXG4vLyBNYXliZSB3ZSBzaG91bGQgdGhpbmsgYWJvdXQgZXhwb3J0aW5nIHRoaXMgb3IgY3JlYXRpbmcgYSB2YXJpYWJsZVxuLy8gYXMgcGFydCBvZiB0aGUgYmFzZS5qcyB0aGVtZVxuY29uc3QgR2xvYmFsU3R5bGUgPSBzdHlsZWQuZGl2YFxuICBmb250LWZhbWlseTogZmYtY2xhbi13ZWItcHJvLCAnSGVsdmV0aWNhIE5ldWUnLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGZvbnQtc2l6ZTogMC44NzVlbTtcbiAgbGluZS1oZWlnaHQ6IDEuNzE0Mjk7XG5cbiAgKixcbiAgKjpiZWZvcmUsXG4gICo6YWZ0ZXIge1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgfVxuXG4gIHVsIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgfVxuXG4gIGxpIHtcbiAgICBtYXJnaW46IDA7XG4gIH1cblxuICBhIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubGFiZWxDb2xvcn07XG4gIH1cbmA7XG5cbktlcGxlckdsRmFjdG9yeS5kZXBzID0gW1xuICBCb3R0b21XaWRnZXRGYWN0b3J5LFxuICBNYXBDb250YWluZXJGYWN0b3J5LFxuICBNb2RhbENvbnRhaW5lckZhY3RvcnksXG4gIFNpZGVQYW5lbEZhY3RvcnksXG4gIFBsb3RDb250YWluZXJGYWN0b3J5LFxuICBOb3RpZmljYXRpb25QYW5lbEZhY3Rvcnlcbl07XG5cbmZ1bmN0aW9uIEtlcGxlckdsRmFjdG9yeShcbiAgQm90dG9tV2lkZ2V0LFxuICBNYXBDb250YWluZXIsXG4gIE1vZGFsV3JhcHBlcixcbiAgU2lkZVBhbmVsLFxuICBQbG90Q29udGFpbmVyLFxuICBOb3RpZmljYXRpb25QYW5lbFxuKSB7XG4gIGNsYXNzIEtlcGxlckdMIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgbWFwU3R5bGVzOiBbXSxcbiAgICAgIHdpZHRoOiA4MDAsXG4gICAgICBoZWlnaHQ6IDgwMCxcbiAgICAgIGFwcE5hbWU6IEtFUExFUl9HTF9OQU1FLFxuICAgICAgdmVyc2lvbjogS0VQTEVSX0dMX1ZFUlNJT05cbiAgICB9O1xuXG4gICAgY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgdGhpcy5fbG9hZE1hcFN0eWxlKHRoaXMucHJvcHMubWFwU3R5bGVzKTtcbiAgICAgIHRoaXMuX2hhbmRsZVJlc2l6ZSh0aGlzLnByb3BzKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgaWYgKFxuICAgICAgICAvLyBpZiBkaW1lbnNpb24gcHJvcHMgaGFzIGNoYW5nZWRcbiAgICAgICAgdGhpcy5wcm9wcy5oZWlnaHQgIT09IG5leHRQcm9wcy5oZWlnaHQgfHxcbiAgICAgICAgdGhpcy5wcm9wcy53aWR0aCAhPT0gbmV4dFByb3BzLndpZHRoIHx8XG4gICAgICAgIC8vIHJlYWN0LW1hcC1nbCB3aWxsIGRpc3BhdGNoIHVwZGF0ZVZpZXdwb3J0IGFmdGVyIHRoaXMuX2hhbmRsZVJlc2l6ZSBpcyBjYWxsZWRcbiAgICAgICAgLy8gaGVyZSB3ZSBjaGVjayBpZiB0aGlzLnByb3BzLm1hcFN0YXRlLmhlaWdodCBpcyBzeW5jIHdpdGggcHJvcHMuaGVpZ2h0XG4gICAgICAgIG5leHRQcm9wcy5oZWlnaHQgIT09IHRoaXMucHJvcHMubWFwU3RhdGUuaGVpZ2h0XG4gICAgICApIHtcbiAgICAgICAgdGhpcy5faGFuZGxlUmVzaXplKG5leHRQcm9wcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2hhbmRsZVJlc2l6ZSh7d2lkdGgsIGhlaWdodH0pIHtcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHdpZHRoKSB8fCAhTnVtYmVyLmlzRmluaXRlKGhlaWdodCkpIHtcbiAgICAgICAgQ29uc29sZS53YXJuKCd3aWR0aCBhbmQgaGVpZ2h0IGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJvcHMubWFwU3RhdGVBY3Rpb25zLnVwZGF0ZU1hcCh7XG4gICAgICAgIHdpZHRoOiB3aWR0aCAvICgxICsgTnVtYmVyKHRoaXMucHJvcHMubWFwU3RhdGUuaXNTcGxpdCkpLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIF9sb2FkTWFwU3R5bGUgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0U3R5bGVzID0gT2JqZWN0LnZhbHVlcyh0aGlzLnByb3BzLm1hcFN0eWxlLm1hcFN0eWxlcyk7XG4gICAgICAvLyBhZGQgaWQgdG8gY3VzdG9tIG1hcCBzdHlsZXMgaWYgbm90IGdpdmVuXG4gICAgICBjb25zdCBjdXN0b21lU3R5bGVzID0gKHRoaXMucHJvcHMubWFwU3R5bGVzIHx8IFtdKS5tYXAobXMgPT4gKHtcbiAgICAgICAgLi4ubXMsXG4gICAgICAgIGlkOiBtcy5pZCB8fCBnZW5lcmF0ZUhhc2hJZCgpXG4gICAgICB9KSk7XG5cbiAgICAgIFsuLi5jdXN0b21lU3R5bGVzLCAuLi5kZWZhdWx0U3R5bGVzXS5mb3JFYWNoKHN0eWxlID0+IHtcbiAgICAgICAgaWYgKHN0eWxlLnN0eWxlKSB7XG4gICAgICAgICAgdGhpcy5wcm9wcy5tYXBTdHlsZUFjdGlvbnMubG9hZE1hcFN0eWxlcyh7XG4gICAgICAgICAgICBbc3R5bGUuaWRdOiBzdHlsZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RNYXBTdHlsZShzdHlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfcmVxdWVzdE1hcFN0eWxlID0gbWFwU3R5bGUgPT4ge1xuICAgICAgY29uc3Qge3VybCwgaWR9ID0gbWFwU3R5bGU7XG5cbiAgICAgIGNvbnN0IGRvd25sb2FkVXJsID0gaXNWYWxpZFN0eWxlVXJsKHVybClcbiAgICAgICAgPyBnZXRTdHlsZURvd25sb2FkVXJsKHVybCwgdGhpcy5wcm9wcy5tYXBib3hBcGlBY2Nlc3NUb2tlbilcbiAgICAgICAgOiB1cmw7XG5cbiAgICAgIHJlcXVlc3RKc29uKGRvd25sb2FkVXJsLCAoZXJyb3IsIHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBDb25zb2xlLndhcm4oYEVycm9yIGxvYWRpbmcgbWFwIHN0eWxlICR7dXJsfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucHJvcHMubWFwU3R5bGVBY3Rpb25zLmxvYWRNYXBTdHlsZXMoe1xuICAgICAgICAgICAgW2lkXTogey4uLm1hcFN0eWxlLCBzdHlsZTogcmVzdWx0fVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICAvLyBwcm9wc1xuICAgICAgICBpZCxcbiAgICAgICAgYXBwTmFtZSxcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgb25TYXZlTWFwLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbixcblxuICAgICAgICAvLyByZWR1eCBzdGF0ZVxuICAgICAgICBtYXBTdHlsZSxcbiAgICAgICAgbWFwU3RhdGUsXG4gICAgICAgIHVpU3RhdGUsXG4gICAgICAgIHZpc1N0YXRlLFxuXG4gICAgICAgIC8vIGFjdGlvbnMsXG4gICAgICAgIHZpc1N0YXRlQWN0aW9ucyxcbiAgICAgICAgbWFwU3RhdGVBY3Rpb25zLFxuICAgICAgICBtYXBTdHlsZUFjdGlvbnMsXG4gICAgICAgIHVpU3RhdGVBY3Rpb25zXG4gICAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgY29uc3Qge1xuICAgICAgICBmaWx0ZXJzLFxuICAgICAgICBsYXllcnMsXG4gICAgICAgIHdpZGdldHMsXG4gICAgICAgIHNwbGl0TWFwcywgLy8gdGhpcyB3aWxsIHN0b3JlIHN1cHBvcnQgZm9yIHNwbGl0IG1hcCB2aWV3IGlzIG5lY2Vzc2FyeVxuICAgICAgICBsYXllck9yZGVyLFxuICAgICAgICBsYXllckJsZW5kaW5nLFxuICAgICAgICBsYXllckNsYXNzZXMsXG4gICAgICAgIHdpZGdldE9yZGVyLFxuICAgICAgICB3aWRnZXRDbGFzc2VzLFxuICAgICAgICBpbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAgICAgZGF0YXNldHMsXG4gICAgICAgIGxheWVyRGF0YSxcbiAgICAgICAgaG92ZXJJbmZvLFxuICAgICAgICBjbGlja2VkXG4gICAgICB9ID0gdmlzU3RhdGU7XG5cbiAgICAgIGNvbnN0IG5vdGlmaWNhdGlvblBhbmVsRmllbGRzID0ge1xuICAgICAgICByZW1vdmVOb3RpZmljYXRpb246IHVpU3RhdGVBY3Rpb25zLnJlbW92ZU5vdGlmaWNhdGlvbixcbiAgICAgICAgbm90aWZpY2F0aW9uczogdWlTdGF0ZS5ub3RpZmljYXRpb25zXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzaWRlRmllbGRzID0ge1xuICAgICAgICBhcHBOYW1lLFxuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICBkYXRhc2V0cyxcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgbGF5ZXJzLFxuICAgICAgICBsYXllck9yZGVyLFxuICAgICAgICBsYXllckNsYXNzZXMsXG4gICAgICAgIHdpZGdldHMsXG4gICAgICAgIHdpZGdldE9yZGVyLFxuICAgICAgICB3aWRnZXRDbGFzc2VzLFxuICAgICAgICBpbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAgICAgbWFwU3R5bGUsXG4gICAgICAgIGxheWVyQmxlbmRpbmcsXG4gICAgICAgIG9uU2F2ZU1hcCxcbiAgICAgICAgdWlTdGF0ZSxcbiAgICAgICAgbWFwU3RhdGUsXG4gICAgICAgIG1hcFN0eWxlQWN0aW9ucyxcbiAgICAgICAgdmlzU3RhdGVBY3Rpb25zLFxuICAgICAgICB1aVN0YXRlQWN0aW9ucyxcbiAgICAgICAgd2lkdGg6IERJTUVOU0lPTlMuc2lkZVBhbmVsLndpZHRoXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtYXBGaWVsZHMgPSB7XG4gICAgICAgIGRhdGFzZXRzLFxuICAgICAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbixcbiAgICAgICAgbWFwU3RhdGUsXG4gICAgICAgIG1hcFN0eWxlLFxuICAgICAgICBtYXBDb250cm9sczogdWlTdGF0ZS5tYXBDb250cm9scyxcbiAgICAgICAgbGF5ZXJzLFxuICAgICAgICBsYXllck9yZGVyLFxuICAgICAgICBsYXllckRhdGEsXG4gICAgICAgIGxheWVyQmxlbmRpbmcsXG4gICAgICAgIGludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgICBob3ZlckluZm8sXG4gICAgICAgIGNsaWNrZWQsXG4gICAgICAgIHRvZ2dsZU1hcENvbnRyb2w6IHVpU3RhdGVBY3Rpb25zLnRvZ2dsZU1hcENvbnRyb2wsXG4gICAgICAgIHVpU3RhdGVBY3Rpb25zLFxuICAgICAgICB2aXNTdGF0ZUFjdGlvbnMsXG4gICAgICAgIG1hcFN0YXRlQWN0aW9uc1xuICAgICAgfTtcblxuICAgICAgY29uc3QgaXNTcGxpdCA9IHNwbGl0TWFwcyAmJiBzcGxpdE1hcHMubGVuZ3RoID4gMTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lclcgPSBtYXBTdGF0ZS53aWR0aCAqIChOdW1iZXIoaXNTcGxpdCkgKyAxKTtcblxuICAgICAgY29uc3QgbWFwQ29udGFpbmVycyA9ICFpc1NwbGl0XG4gICAgICAgID8gW1xuICAgICAgICAgICAgPE1hcENvbnRhaW5lclxuICAgICAgICAgICAgICBrZXk9ezB9XG4gICAgICAgICAgICAgIGluZGV4PXswfVxuICAgICAgICAgICAgICB7Li4ubWFwRmllbGRzfVxuICAgICAgICAgICAgICBtYXBMYXllcnM9e2lzU3BsaXQgPyBzcGxpdE1hcHNbMF0ubGF5ZXJzIDogbnVsbH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgXVxuICAgICAgICA6IHNwbGl0TWFwcy5tYXAoKHNldHRpbmdzLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPE1hcENvbnRhaW5lclxuICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICBpbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgIHsuLi5tYXBGaWVsZHN9XG4gICAgICAgICAgICAgIG1hcExheWVycz17c3BsaXRNYXBzW2luZGV4XS5sYXllcnN9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpO1xuXG4gICAgICBjb25zdCBpc0V4cG9ydGluZyA9IHVpU3RhdGUuY3VycmVudE1vZGFsID09PSBFWFBPUlRfSU1BR0VfSUQ7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxUaGVtZVByb3ZpZGVyIHRoZW1lPXt0aGVtZX0+XG4gICAgICAgICAgPEdsb2JhbFN0eWxlXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgICAgd2lkdGg6IGAke3dpZHRofXB4YCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBgJHtoZWlnaHR9cHhgXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwia2VwbGVyLWdsXCJcbiAgICAgICAgICAgIGlkPXtga2VwbGVyLWdsX18ke2lkfWB9XG4gICAgICAgICAgICBpbm5lclJlZj17bm9kZSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucm9vdCA9IG5vZGU7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsvKiA8Tm90aWZpY2F0aW9uUGFuZWwgey4uLm5vdGlmaWNhdGlvblBhbmVsRmllbGRzfSAvPiAqL31cbiAgICAgICAgICAgIHshdWlTdGF0ZS5yZWFkT25seSAmJiA8U2lkZVBhbmVsIHsuLi5zaWRlRmllbGRzfSAvPn1cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWFwc1wiIHN0eWxlPXt7ZGlzcGxheTogJ2ZsZXgnfX0+XG4gICAgICAgICAgICAgIHttYXBDb250YWluZXJzfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7aXNFeHBvcnRpbmcgJiYgKFxuICAgICAgICAgICAgICA8UGxvdENvbnRhaW5lclxuICAgICAgICAgICAgICAgIHdpZHRoPXt3aWR0aH1cbiAgICAgICAgICAgICAgICBoZWlnaHQ9e2hlaWdodH1cbiAgICAgICAgICAgICAgICBleHBvcnRJbWFnZVNldHRpbmc9e3VpU3RhdGUuZXhwb3J0SW1hZ2V9XG4gICAgICAgICAgICAgICAgbWFwRmllbGRzPXttYXBGaWVsZHN9XG4gICAgICAgICAgICAgICAgc3RhcnRFeHBvcnRpbmdJbWFnZT17dWlTdGF0ZUFjdGlvbnMuc3RhcnRFeHBvcnRpbmdJbWFnZX1cbiAgICAgICAgICAgICAgICBzZXRFeHBvcnRJbWFnZURhdGFVcmk9e3VpU3RhdGVBY3Rpb25zLnNldEV4cG9ydEltYWdlRGF0YVVyaX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8Qm90dG9tV2lkZ2V0XG4gICAgICAgICAgICAgIGZpbHRlcnM9e2ZpbHRlcnN9XG4gICAgICAgICAgICAgIGRhdGFzZXRzPXtkYXRhc2V0c31cbiAgICAgICAgICAgICAgdWlTdGF0ZT17dWlTdGF0ZX1cbiAgICAgICAgICAgICAgdmlzU3RhdGVBY3Rpb25zPXt2aXNTdGF0ZUFjdGlvbnN9XG4gICAgICAgICAgICAgIHNpZGVQYW5lbFdpZHRoPXtcbiAgICAgICAgICAgICAgICBESU1FTlNJT05TLnNpZGVQYW5lbC53aWR0aCArIERJTUVOU0lPTlMuc2lkZVBhbmVsLm1hcmdpbi5sZWZ0XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udGFpbmVyVz17Y29udGFpbmVyV31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8TW9kYWxXcmFwcGVyXG4gICAgICAgICAgICAgIG1hcFN0eWxlPXttYXBTdHlsZX1cbiAgICAgICAgICAgICAgdmlzU3RhdGU9e3Zpc1N0YXRlfVxuICAgICAgICAgICAgICBtYXBTdGF0ZT17bWFwU3RhdGV9XG4gICAgICAgICAgICAgIHVpU3RhdGU9e3VpU3RhdGV9XG4gICAgICAgICAgICAgIG1hcGJveEFwaUFjY2Vzc1Rva2VuPXttYXBib3hBcGlBY2Nlc3NUb2tlbn1cbiAgICAgICAgICAgICAgdmlzU3RhdGVBY3Rpb25zPXt2aXNTdGF0ZUFjdGlvbnN9XG4gICAgICAgICAgICAgIHVpU3RhdGVBY3Rpb25zPXt1aVN0YXRlQWN0aW9uc31cbiAgICAgICAgICAgICAgbWFwU3R5bGVBY3Rpb25zPXttYXBTdHlsZUFjdGlvbnN9XG4gICAgICAgICAgICAgIHJvb3ROb2RlPXt0aGlzLnJvb3R9XG4gICAgICAgICAgICAgIGNvbnRhaW5lclc9e2NvbnRhaW5lcld9XG4gICAgICAgICAgICAgIGNvbnRhaW5lckg9e21hcFN0YXRlLmhlaWdodH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9HbG9iYWxTdHlsZT5cbiAgICAgICAgPC9UaGVtZVByb3ZpZGVyPlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ga2VwbGVyR2xDb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShLZXBsZXJHTCk7XG59XG5cbmZ1bmN0aW9uIG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgcHJvcHMpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5wcm9wcyxcbiAgICB2aXNTdGF0ZTogc3RhdGUudmlzU3RhdGUsXG4gICAgbWFwU3R5bGU6IHN0YXRlLm1hcFN0eWxlLFxuICAgIG1hcFN0YXRlOiBzdGF0ZS5tYXBTdGF0ZSxcbiAgICB1aVN0YXRlOiBzdGF0ZS51aVN0YXRlXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgY29uc3QgdXNlckFjdGlvbnMgPSBvd25Qcm9wcy5hY3Rpb25zIHx8IHt9O1xuXG4gIGNvbnN0IFt2aXNTdGF0ZUFjdGlvbnMsIG1hcFN0YXRlQWN0aW9ucywgbWFwU3R5bGVBY3Rpb25zLCB1aVN0YXRlQWN0aW9uc10gPSBbXG4gICAgVmlzU3RhdGVBY3Rpb25zLFxuICAgIE1hcFN0YXRlQWN0aW9ucyxcbiAgICBNYXBTdHlsZUFjdGlvbnMsXG4gICAgVUlTdGF0ZUFjdGlvbnNcbiAgXS5tYXAoYWN0aW9ucyA9PlxuICAgIGJpbmRBY3Rpb25DcmVhdG9ycyhtZXJnZUFjdGlvbnMoYWN0aW9ucywgdXNlckFjdGlvbnMpLCBkaXNwYXRjaClcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHZpc1N0YXRlQWN0aW9ucyxcbiAgICBtYXBTdGF0ZUFjdGlvbnMsXG4gICAgbWFwU3R5bGVBY3Rpb25zLFxuICAgIHVpU3RhdGVBY3Rpb25zLFxuICAgIGRpc3BhdGNoXG4gIH07XG59XG5cbi8qKlxuICogT3ZlcnJpZGUgZGVmYXVsdCBtYXBzLWdsIGFjdGlvbnMgd2l0aCB1c2VyIGRlZmluZWQgYWN0aW9ucyB1c2luZyB0aGUgc2FtZSBrZXlcbiAqL1xuZnVuY3Rpb24gbWVyZ2VBY3Rpb25zKGFjdGlvbnMsIHVzZXJBY3Rpb25zKSB7XG4gIGNvbnN0IG92ZXJyaWRlcyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiB1c2VyQWN0aW9ucykge1xuICAgIGlmICh1c2VyQWN0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGFjdGlvbnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgb3ZlcnJpZGVzW2tleV0gPSB1c2VyQWN0aW9uc1trZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7Li4uYWN0aW9ucywgLi4ub3ZlcnJpZGVzfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgS2VwbGVyR2xGYWN0b3J5O1xuIl19