kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
248 lines (200 loc) • 24.2 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = undefined;
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _taggedTemplateLiteral2 = require('babel-runtime/helpers/taggedTemplateLiteral');
var _taggedTemplateLiteral3 = _interopRequireDefault(_taggedTemplateLiteral2);
var _class, _temp2;
var _templateObject = (0, _taggedTemplateLiteral3.default)(['\n .ui-sortable {\n display: block;\n position: relative;\n overflow: visible;\n user-select: none;\n\n :before {\n content: \' \';\n display: table;\n }\n\n :after {\n content: \' \';\n display: table;\n }\n }\n\n .ui-sortable-item.ui-sortable-dragging {\n position: absolute;\n z-index: 1688;\n cursor: move;\n }\n\n .ui-sortable-item.ui-sortable-dragging:hover {\n cursor: move;\n opacity: 0.5;\n }\n\n .ui-sortable-placeholder {\n display: none;\n }\n\n .ui-sortable-placeholder.visible {\n display: block;\n opacity: 0;\n z-index: -1;\n }\n'], ['\n .ui-sortable {\n display: block;\n position: relative;\n overflow: visible;\n user-select: none;\n\n :before {\n content: \' \';\n display: table;\n }\n\n :after {\n content: \' \';\n display: table;\n }\n }\n\n .ui-sortable-item.ui-sortable-dragging {\n position: absolute;\n z-index: 1688;\n cursor: move;\n }\n\n .ui-sortable-item.ui-sortable-dragging:hover {\n cursor: move;\n opacity: 0.5;\n }\n\n .ui-sortable-placeholder {\n display: none;\n }\n\n .ui-sortable-placeholder.visible {\n display: block;\n opacity: 0;\n z-index: -1;\n }\n']); // Copyright (c) 2018 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _reactAnythingSortable = require('react-anything-sortable');
var _reactAnythingSortable2 = _interopRequireDefault(_reactAnythingSortable);
var _styledComponents = require('styled-components');
var _styledComponents2 = _interopRequireDefault(_styledComponents);
var _reselect = require('reselect');
var _layerPanel = require('./layer-panel/layer-panel');
var _layerPanel2 = _interopRequireDefault(_layerPanel);
var _sourceDataCatalog = require('./source-data-catalog');
var _sourceDataCatalog2 = _interopRequireDefault(_sourceDataCatalog);
var _icons = require('../common/icons');
var _itemSelector = require('../common/item-selector/item-selector');
var _itemSelector2 = _interopRequireDefault(_itemSelector);
var _styledComponents3 = require('../common/styled-components');
var _defaultSettings = require('../../constants/default-settings');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var StyledSortable = _styledComponents2.default.div(_templateObject);
var LayerManager = (_temp2 = _class = function (_Component) {
(0, _inherits3.default)(LayerManager, _Component);
function LayerManager() {
var _ref;
var _temp, _this, _ret;
(0, _classCallCheck3.default)(this, LayerManager);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = LayerManager.__proto__ || Object.getPrototypeOf(LayerManager)).call.apply(_ref, [this].concat(args))), _this), _this.layerClassSelector = function (props) {
return props.layerClasses;
}, _this.layerTypeOptionsSelector = (0, _reselect.createSelector)(_this.layerClassSelector, function (layerClasses) {
return Object.keys(layerClasses).map(function (key) {
var layer = new layerClasses[key]();
return {
id: key,
label: layer.name,
icon: layer.layerIcon
};
});
}), _this._addEmptyNewLayer = function () {
_this.props.addLayer();
}, _this._handleSort = function (order) {
_this.props.updateLayerOrder(order);
}, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
}
(0, _createClass3.default)(LayerManager, [{
key: 'render',
value: function render() {
var _props = this.props,
layers = _props.layers,
datasets = _props.datasets,
layerOrder = _props.layerOrder,
openModal = _props.openModal;
var defaultDataset = Object.keys(datasets)[0];
var layerTypeOptions = this.layerTypeOptionsSelector(this.props);
var layerActions = {
layerConfigChange: this.props.layerConfigChange,
layerVisualChannelConfigChange: this.props.layerVisualChannelConfigChange,
layerTypeChange: this.props.layerTypeChange,
layerVisConfigChange: this.props.layerVisConfigChange,
removeLayer: this.props.removeLayer
};
var panelProps = { datasets: datasets, openModal: openModal, layerTypeOptions: layerTypeOptions };
return _react2.default.createElement(
StyledSortable,
{ className: 'layer-manager' },
_react2.default.createElement(_sourceDataCatalog2.default, {
datasets: datasets,
showDatasetTable: this.props.showDatasetTable,
removeDataset: this.props.removeDataset,
showDeleteDataset: true
}),
_react2.default.createElement(
_styledComponents3.Button,
{
onClick: this.props.showAddDataModal,
isInactive: !defaultDataset,
width: '105px',
secondary: true
},
_react2.default.createElement(_icons.Add, { height: '12px' }),
'Add Data'
),
_react2.default.createElement(_styledComponents3.SidePanelDivider, null),
_react2.default.createElement(
_styledComponents3.SidePanelSection,
null,
_react2.default.createElement(
_reactAnythingSortable2.default,
{
onSort: this._handleSort,
direction: 'vertical',
sortHandle: 'sort--handle',
dynamic: true
},
layerOrder.map(function (idx) {
return _react2.default.createElement(_layerPanel2.default, (0, _extends3.default)({}, panelProps, layerActions, {
sortData: idx,
key: layers[idx].id,
idx: idx,
layer: layers[idx]
}));
})
)
),
_react2.default.createElement(
_styledComponents3.SidePanelSection,
null,
defaultDataset ? _react2.default.createElement(
_styledComponents3.Button,
{ onClick: this._addEmptyNewLayer, width: '105px' },
_react2.default.createElement(_icons.Add, { height: '12px' }),
'Add Layer'
) : null
),
_react2.default.createElement(LayerBlendingSelector, {
layerBlending: this.props.layerBlending,
updateLayerBlending: this.props.updateLayerBlending
})
);
}
}]);
return LayerManager;
}(_react.Component), _class.propTypes = {
addLayer: _propTypes2.default.func.isRequired,
datasets: _propTypes2.default.object.isRequired,
layerBlending: _propTypes2.default.string.isRequired,
layerClasses: _propTypes2.default.object.isRequired,
layers: _propTypes2.default.arrayOf(_propTypes2.default.any).isRequired,
layerConfigChange: _propTypes2.default.func.isRequired,
layerVisualChannelConfigChange: _propTypes2.default.func.isRequired,
layerTypeChange: _propTypes2.default.func.isRequired,
layerVisConfigChange: _propTypes2.default.func.isRequired,
openModal: _propTypes2.default.func.isRequired,
removeLayer: _propTypes2.default.func.isRequired,
removeDataset: _propTypes2.default.func.isRequired,
showDatasetTable: _propTypes2.default.func.isRequired,
updateLayerBlending: _propTypes2.default.func.isRequired,
updateLayerOrder: _propTypes2.default.func.isRequired
}, _temp2);
exports.default = LayerManager;
var LayerBlendingSelector = function LayerBlendingSelector(_ref2) {
var layerBlending = _ref2.layerBlending,
updateLayerBlending = _ref2.updateLayerBlending;
return _react2.default.createElement(
_styledComponents3.SidePanelSection,
null,
_react2.default.createElement(
_styledComponents3.PanelLabel,
null,
'Layer Blending'
),
_react2.default.createElement(_itemSelector2.default, {
selectedItems: layerBlending,
options: Object.keys(_defaultSettings.LAYER_BLENDINGS),
multiSelect: false,
searchable: false,
onChange: updateLayerBlending
})
);
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvbGF5ZXItbWFuYWdlci5qcyJdLCJuYW1lcyI6WyJTdHlsZWRTb3J0YWJsZSIsInN0eWxlZCIsImRpdiIsIkxheWVyTWFuYWdlciIsImxheWVyQ2xhc3NTZWxlY3RvciIsInByb3BzIiwibGF5ZXJDbGFzc2VzIiwibGF5ZXJUeXBlT3B0aW9uc1NlbGVjdG9yIiwiT2JqZWN0Iiwia2V5cyIsIm1hcCIsImxheWVyIiwia2V5IiwiaWQiLCJsYWJlbCIsIm5hbWUiLCJpY29uIiwibGF5ZXJJY29uIiwiX2FkZEVtcHR5TmV3TGF5ZXIiLCJhZGRMYXllciIsIl9oYW5kbGVTb3J0IiwidXBkYXRlTGF5ZXJPcmRlciIsIm9yZGVyIiwibGF5ZXJzIiwiZGF0YXNldHMiLCJsYXllck9yZGVyIiwib3Blbk1vZGFsIiwiZGVmYXVsdERhdGFzZXQiLCJsYXllclR5cGVPcHRpb25zIiwibGF5ZXJBY3Rpb25zIiwibGF5ZXJDb25maWdDaGFuZ2UiLCJsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UiLCJsYXllclR5cGVDaGFuZ2UiLCJsYXllclZpc0NvbmZpZ0NoYW5nZSIsInJlbW92ZUxheWVyIiwicGFuZWxQcm9wcyIsInNob3dEYXRhc2V0VGFibGUiLCJyZW1vdmVEYXRhc2V0Iiwic2hvd0FkZERhdGFNb2RhbCIsImlkeCIsImxheWVyQmxlbmRpbmciLCJ1cGRhdGVMYXllckJsZW5kaW5nIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiZnVuYyIsImlzUmVxdWlyZWQiLCJvYmplY3QiLCJzdHJpbmciLCJhcnJheU9mIiwiYW55IiwiTGF5ZXJCbGVuZGluZ1NlbGVjdG9yIiwiTEFZRVJfQkxFTkRJTkdTIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NHlDQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QWVDO0FBZmhCLEM7a0JBREEzQyxZOzs7QUEwR3JCLElBQU1nRCx3QkFBd0IsU0FBeEJBLHFCQUF3QjtBQUFBLE1BQUVYLGFBQUYsU0FBRUEsYUFBRjtBQUFBLE1BQWlCQyxtQkFBakIsU0FBaUJBLG1CQUFqQjtBQUFBLFNBQzVCO0FBQUMsdUNBQUQ7QUFBQTtBQUNFO0FBQUMsbUNBQUQ7QUFBQTtBQUFBO0FBQUEsS0FERjtBQUVFLGtDQUFDLHNCQUFEO0FBQ0UscUJBQWVELGFBRGpCO0FBRUUsZUFBU2hDLE9BQU9DLElBQVAsQ0FBWTJDLGdDQUFaLENBRlg7QUFHRSxtQkFBYSxLQUhmO0FBSUUsa0JBQVksS0FKZDtBQUtFLGdCQUFVWDtBQUxaO0FBRkYsR0FENEI7QUFBQSxDQUE5QiIsImZpbGUiOiJsYXllci1tYW5hZ2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE4IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFNvcnRhYmxlIGZyb20gJ3JlYWN0LWFueXRoaW5nLXNvcnRhYmxlJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtjcmVhdGVTZWxlY3Rvcn0gZnJvbSAncmVzZWxlY3QnO1xuXG5pbXBvcnQgTGF5ZXJQYW5lbCBmcm9tICcuL2xheWVyLXBhbmVsL2xheWVyLXBhbmVsJztcbmltcG9ydCBTb3VyY2VEYXRhQ2F0YWxvZyBmcm9tICcuL3NvdXJjZS1kYXRhLWNhdGFsb2cnO1xuaW1wb3J0IHtBZGR9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2ljb25zJztcbmltcG9ydCBJdGVtU2VsZWN0b3IgZnJvbSAnY29tcG9uZW50cy9jb21tb24vaXRlbS1zZWxlY3Rvci9pdGVtLXNlbGVjdG9yJztcbmltcG9ydCB7XG4gIFBhbmVsTGFiZWwsXG4gIFNpZGVQYW5lbERpdmlkZXIsXG4gIFNpZGVQYW5lbFNlY3Rpb24sXG4gIEJ1dHRvblxufSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7TEFZRVJfQkxFTkRJTkdTfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbmNvbnN0IFN0eWxlZFNvcnRhYmxlID0gc3R5bGVkLmRpdmBcbiAgLnVpLXNvcnRhYmxlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG5cbiAgICA6YmVmb3JlIHtcbiAgICAgIGNvbnRlbnQ6ICcgJztcbiAgICAgIGRpc3BsYXk6IHRhYmxlO1xuICAgIH1cblxuICAgIDphZnRlciB7XG4gICAgICBjb250ZW50OiAnICc7XG4gICAgICBkaXNwbGF5OiB0YWJsZTtcbiAgICB9XG4gIH1cblxuICAudWktc29ydGFibGUtaXRlbS51aS1zb3J0YWJsZS1kcmFnZ2luZyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6IDE2ODg7XG4gICAgY3Vyc29yOiBtb3ZlO1xuICB9XG5cbiAgLnVpLXNvcnRhYmxlLWl0ZW0udWktc29ydGFibGUtZHJhZ2dpbmc6aG92ZXIge1xuICAgIGN1cnNvcjogbW92ZTtcbiAgICBvcGFjaXR5OiAwLjU7XG4gIH1cblxuICAudWktc29ydGFibGUtcGxhY2Vob2xkZXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAudWktc29ydGFibGUtcGxhY2Vob2xkZXIudmlzaWJsZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgb3BhY2l0eTogMDtcbiAgICB6LWluZGV4OiAtMTtcbiAgfVxuYDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGF5ZXJNYW5hZ2VyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBhZGRMYXllcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBkYXRhc2V0czogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIGxheWVyQmxlbmRpbmc6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICBsYXllckNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBsYXllcnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLmlzUmVxdWlyZWQsXG4gICAgbGF5ZXJDb25maWdDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgbGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIGxheWVyVHlwZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBsYXllclZpc0NvbmZpZ0NoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvcGVuTW9kYWw6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgcmVtb3ZlTGF5ZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgcmVtb3ZlRGF0YXNldDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBzaG93RGF0YXNldFRhYmxlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIHVwZGF0ZUxheWVyQmxlbmRpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgdXBkYXRlTGF5ZXJPcmRlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxuICB9O1xuXG4gIGxheWVyQ2xhc3NTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLmxheWVyQ2xhc3NlcztcbiAgbGF5ZXJUeXBlT3B0aW9uc1NlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgdGhpcy5sYXllckNsYXNzU2VsZWN0b3IsXG4gICAgbGF5ZXJDbGFzc2VzID0+IE9iamVjdC5rZXlzKGxheWVyQ2xhc3NlcykubWFwKGtleSA9PiB7XG4gICAgICBjb25zdCBsYXllciA9IG5ldyBsYXllckNsYXNzZXNba2V5XSgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGtleSxcbiAgICAgICAgbGFiZWw6IGxheWVyLm5hbWUsXG4gICAgICAgIGljb246IGxheWVyLmxheWVySWNvblxuICAgICAgfTtcbiAgfSkpO1xuXG4gIF9hZGRFbXB0eU5ld0xheWVyID0gKCkgPT4ge1xuICAgIHRoaXMucHJvcHMuYWRkTGF5ZXIoKTtcbiAgfTtcblxuICBfaGFuZGxlU29ydCA9IG9yZGVyID0+IHtcbiAgICB0aGlzLnByb3BzLnVwZGF0ZUxheWVyT3JkZXIob3JkZXIpO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7bGF5ZXJzLCBkYXRhc2V0cywgbGF5ZXJPcmRlciwgb3Blbk1vZGFsfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgZGVmYXVsdERhdGFzZXQgPSBPYmplY3Qua2V5cyhkYXRhc2V0cylbMF07XG4gICAgY29uc3QgbGF5ZXJUeXBlT3B0aW9ucyA9IHRoaXMubGF5ZXJUeXBlT3B0aW9uc1NlbGVjdG9yKHRoaXMucHJvcHMpO1xuXG4gICAgY29uc3QgbGF5ZXJBY3Rpb25zID0ge1xuICAgICAgbGF5ZXJDb25maWdDaGFuZ2U6IHRoaXMucHJvcHMubGF5ZXJDb25maWdDaGFuZ2UsXG4gICAgICBsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2U6IHRoaXMucHJvcHMubGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlLFxuICAgICAgbGF5ZXJUeXBlQ2hhbmdlOiB0aGlzLnByb3BzLmxheWVyVHlwZUNoYW5nZSxcbiAgICAgIGxheWVyVmlzQ29uZmlnQ2hhbmdlOiB0aGlzLnByb3BzLmxheWVyVmlzQ29uZmlnQ2hhbmdlLFxuICAgICAgcmVtb3ZlTGF5ZXI6IHRoaXMucHJvcHMucmVtb3ZlTGF5ZXJcbiAgICB9O1xuXG4gICAgY29uc3QgcGFuZWxQcm9wcyA9IHtkYXRhc2V0cywgb3Blbk1vZGFsLCBsYXllclR5cGVPcHRpb25zfTtcblxuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkU29ydGFibGUgY2xhc3NOYW1lPVwibGF5ZXItbWFuYWdlclwiPlxuICAgICAgICA8U291cmNlRGF0YUNhdGFsb2dcbiAgICAgICAgICBkYXRhc2V0cz17ZGF0YXNldHN9XG4gICAgICAgICAgc2hvd0RhdGFzZXRUYWJsZT17dGhpcy5wcm9wcy5zaG93RGF0YXNldFRhYmxlfVxuICAgICAgICAgIHJlbW92ZURhdGFzZXQ9e3RoaXMucHJvcHMucmVtb3ZlRGF0YXNldH1cbiAgICAgICAgICBzaG93RGVsZXRlRGF0YXNldFxuICAgICAgICAvPlxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy5zaG93QWRkRGF0YU1vZGFsfVxuICAgICAgICAgIGlzSW5hY3RpdmU9eyFkZWZhdWx0RGF0YXNldH1cbiAgICAgICAgICB3aWR0aD1cIjEwNXB4XCJcbiAgICAgICAgICBzZWNvbmRhcnlcbiAgICAgICAgPlxuICAgICAgICAgIDxBZGQgaGVpZ2h0PVwiMTJweFwiIC8+QWRkIERhdGFcbiAgICAgICAgPC9CdXR0b24+XG4gICAgICAgIDxTaWRlUGFuZWxEaXZpZGVyIC8+XG4gICAgICAgIDxTaWRlUGFuZWxTZWN0aW9uPlxuICAgICAgICAgIDxTb3J0YWJsZVxuICAgICAgICAgICAgb25Tb3J0PXt0aGlzLl9oYW5kbGVTb3J0fVxuICAgICAgICAgICAgZGlyZWN0aW9uPVwidmVydGljYWxcIlxuICAgICAgICAgICAgc29ydEhhbmRsZT1cInNvcnQtLWhhbmRsZVwiXG4gICAgICAgICAgICBkeW5hbWljXG4gICAgICAgICAgPlxuICAgICAgICAgICAge2xheWVyT3JkZXIubWFwKGlkeCA9PiAoXG4gICAgICAgICAgICAgIDxMYXllclBhbmVsXG4gICAgICAgICAgICAgICAgey4uLnBhbmVsUHJvcHN9XG4gICAgICAgICAgICAgICAgey4uLmxheWVyQWN0aW9uc31cbiAgICAgICAgICAgICAgICBzb3J0RGF0YT17aWR4fVxuICAgICAgICAgICAgICAgIGtleT17bGF5ZXJzW2lkeF0uaWR9XG4gICAgICAgICAgICAgICAgaWR4PXtpZHh9XG4gICAgICAgICAgICAgICAgbGF5ZXI9e2xheWVyc1tpZHhdfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9Tb3J0YWJsZT5cbiAgICAgICAgPC9TaWRlUGFuZWxTZWN0aW9uPlxuICAgICAgICA8U2lkZVBhbmVsU2VjdGlvbj5cbiAgICAgICAgICB7ZGVmYXVsdERhdGFzZXQgPyAoXG4gICAgICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9e3RoaXMuX2FkZEVtcHR5TmV3TGF5ZXJ9IHdpZHRoPVwiMTA1cHhcIj5cbiAgICAgICAgICAgICAgPEFkZCBoZWlnaHQ9XCIxMnB4XCIgLz5BZGQgTGF5ZXJcbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L1NpZGVQYW5lbFNlY3Rpb24+XG4gICAgICAgIDxMYXllckJsZW5kaW5nU2VsZWN0b3JcbiAgICAgICAgICBsYXllckJsZW5kaW5nPXt0aGlzLnByb3BzLmxheWVyQmxlbmRpbmd9XG4gICAgICAgICAgdXBkYXRlTGF5ZXJCbGVuZGluZz17dGhpcy5wcm9wcy51cGRhdGVMYXllckJsZW5kaW5nfVxuICAgICAgICAvPlxuICAgICAgPC9TdHlsZWRTb3J0YWJsZT5cbiAgICApO1xuICB9XG59XG5cbmNvbnN0IExheWVyQmxlbmRpbmdTZWxlY3RvciA9ICh7bGF5ZXJCbGVuZGluZywgdXBkYXRlTGF5ZXJCbGVuZGluZ30pID0+IChcbiAgPFNpZGVQYW5lbFNlY3Rpb24+XG4gICAgPFBhbmVsTGFiZWw+TGF5ZXIgQmxlbmRpbmc8L1BhbmVsTGFiZWw+XG4gICAgPEl0ZW1TZWxlY3RvclxuICAgICAgc2VsZWN0ZWRJdGVtcz17bGF5ZXJCbGVuZGluZ31cbiAgICAgIG9wdGlvbnM9e09iamVjdC5rZXlzKExBWUVSX0JMRU5ESU5HUyl9XG4gICAgICBtdWx0aVNlbGVjdD17ZmFsc2V9XG4gICAgICBzZWFyY2hhYmxlPXtmYWxzZX1cbiAgICAgIG9uQ2hhbmdlPXt1cGRhdGVMYXllckJsZW5kaW5nfVxuICAgIC8+XG4gIDwvU2lkZVBhbmVsU2VjdGlvbj5cbik7XG4iXX0=