kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
209 lines (206 loc) • 38.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
exports.getDatasetAttributesFromRasterTile = getDatasetAttributesFromRasterTile;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
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 _commonUtils = require("@kepler.gl/common-utils");
var _constants = require("@kepler.gl/constants");
var _table = require("@kepler.gl/table");
var _utils = require("@kepler.gl/utils");
var _useFetchRasterTileMetadata = _interopRequireDefault(require("../../hooks/use-fetch-raster-tile-metadata"));
var _common = require("../../common");
var _icons = require("../../common/icons");
var _templateObject, _templateObject2, _templateObject3, _templateObject4; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var TilesetInputContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: grid;\n grid-template-rows: repeat(3, 1fr);\n row-gap: 0px;\n font-size: 12px;\n"])));
var TilesetInputDescription = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n text-align: center;\n color: ", ";\n font-size: 11px;\n"])), function (props) {
return props.theme.AZURE200;
});
var LabelRow = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n"])));
function getDatasetAttributesFromRasterTile(_ref) {
var name = _ref.name,
metadataUrl = _ref.metadataUrl,
rasterTileServerUrls = _ref.rasterTileServerUrls;
var appConfig = (0, _utils.getApplicationConfig)();
return {
name: name,
type: _constants.DatasetType.RASTER_TILE,
metadata: _objectSpread(_objectSpread({
metadataUrl: metadataUrl
}, rasterTileServerUrls ? {
rasterTileServerUrls: rasterTileServerUrls
} : {}), {}, {
// Persist raster server-related application config with the layer
rasterServerUseLatestTitiler: appConfig.rasterServerUseLatestTitiler,
rasterServerSupportsElevation: appConfig.rasterServerSupportsElevation,
rasterServerMaxRetries: appConfig.rasterServerMaxRetries,
rasterServerRetryDelay: appConfig.rasterServerRetryDelay,
rasterServerServerErrorsToRetry: appConfig.rasterServerServerErrorsToRetry,
rasterServerMaxPerServerRequests: appConfig.rasterServerMaxPerServerRequests
})
};
}
var InfoIconLink = _styledComponents["default"].a(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: 4px;\n color: ", ";\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n line-height: 0;\n vertical-align: middle;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n\n svg {\n display: block;\n }\n"])), function (props) {
return props.theme.labelColor;
});
var RASTER_TILE_DOCUMENTATION_URL = 'https://docs.kepler.gl/docs/user-guides/c-types-of-layers/n-raster-tile-layer';
var parseMetadataAllowCollections = function parseMetadataAllowCollections(metadata, _ref2) {
var metadataUrl = _ref2.metadataUrl,
rasterTileType = _ref2.rasterTileType;
return rasterTileType === _constants.RasterTileType.PMTILES ? (0, _table.parseVectorMetadata)(metadata, {
tileUrl: metadataUrl
}) : (0, _table.parseRasterMetadata)(metadata, {
allowCollections: true
});
};
var RasterTileForm = function RasterTileForm(_ref3) {
var setResponse = _ref3.setResponse;
var _useState = (0, _react.useState)(''),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
tileName = _useState2[0],
setTileName = _useState2[1];
var _useState3 = (0, _react.useState)(false),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
tileNameWasModified = _useState4[0],
setTileNameWasModified = _useState4[1];
var _useState5 = (0, _react.useState)(''),
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
metadataUrl = _useState6[0],
setMetadataUrl = _useState6[1];
var _useState7 = (0, _react.useState)(((0, _utils.getApplicationConfig)().rasterServerUrls || []).join(',')),
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
rasterTileServerUrls = _useState8[0],
setRasterTileServerUrls = _useState8[1];
// Remove trailing slash to prevent issues with raster tile servers
var clearedMetadataUrl = metadataUrl.endsWith('/') ? metadataUrl.slice(0, -1) : metadataUrl;
var onTileNameChange = (0, _react.useCallback)(function (event) {
event.preventDefault();
setTileNameWasModified(true);
setTileName(event.target.value);
}, [setTileName]);
var onMetadataUrlChange = (0, _react.useCallback)(function (event) {
event.preventDefault();
var value = event.target.value;
setMetadataUrl(value);
if (!tileNameWasModified) {
setTileName(value.split('/').filter(Boolean).pop() || '');
}
}, [tileNameWasModified]);
var onRasterTileServerUrlsChange = (0, _react.useCallback)(function (event) {
event.preventDefault();
setRasterTileServerUrls(event.target.value);
}, [setRasterTileServerUrls]);
var _useFetchJson = (0, _useFetchRasterTileMetadata["default"])({
url: clearedMetadataUrl,
rasterTileType: (0, _commonUtils.isPMTilesUrl)(clearedMetadataUrl) ? _constants.RasterTileType.PMTILES : _constants.RasterTileType.STAC,
process: parseMetadataAllowCollections
}),
metadata = _useFetchJson.data,
loading = _useFetchJson.loading,
metaError = _useFetchJson.error;
(0, _react.useEffect)(function () {
if (tileName && clearedMetadataUrl) {
var pmtilesType = metadata === null || metadata === void 0 ? void 0 : metadata.pmtilesType;
if (pmtilesType === _constants.PMTilesType.MVT) {
return setResponse({
metadata: metadata,
dataset: null,
loading: loading,
error: new Error('For .pmtiles in mvt format, please use the Vector Tile form.')
});
}
var error = metaError;
// check for raster tile servers for STAC items and collections
var rasterTileServers;
if (!error
// We still need raster tile servers for PMTiles when we plan to use elevation
) {
rasterTileServers = rasterTileServerUrls.split(',').map(function (server) {
return server.trim();
}).filter(function (server) {
return server;
});
if (rasterTileServers.length < 1 || !rasterTileServers.every(function (server) {
return (0, _commonUtils.validateUrl)(server);
})) {
if (pmtilesType) {
// For raster tiles elevation support is optional
// TODO display a warning, but not a blocking error
rasterTileServers = [];
} else {
error = new Error('Provide valid raster tile server urls to support STAC and elevations.');
}
}
}
var dataset = getDatasetAttributesFromRasterTile({
name: tileName,
metadataUrl: clearedMetadataUrl,
rasterTileServerUrls: rasterTileServers
});
setResponse({
metadata: metadata,
dataset: dataset,
loading: loading,
error: error
});
} else {
setResponse({
metadata: metadata,
dataset: null,
loading: loading,
error: metaError
});
}
}, [metadata, loading, metaError, tileName, clearedMetadataUrl, rasterTileServerUrls, setResponse]);
var showServerInput = (0, _utils.getApplicationConfig)().rasterServerShowServerInput;
return /*#__PURE__*/_react["default"].createElement(TilesetInputContainer, null, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", {
htmlFor: "tileset-name"
}, "Name"), /*#__PURE__*/_react["default"].createElement(_common.InputLight, {
id: "tileset-name",
placeholder: "Name your tileset",
value: tileName,
onChange: onTileNameChange
})), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(LabelRow, null, /*#__PURE__*/_react["default"].createElement("label", {
htmlFor: "tile-metadata"
}, "Tileset metadata URL"), /*#__PURE__*/_react["default"].createElement(InfoIconLink, {
href: RASTER_TILE_DOCUMENTATION_URL,
target: "_blank",
rel: "noopener noreferrer",
"aria-label": "Open Raster Tile Layer documentation"
}, /*#__PURE__*/_react["default"].createElement(_icons.Help, {
height: "16px"
}))), /*#__PURE__*/_react["default"].createElement(_common.InputLight, {
id: "tile-metadata",
placeholder: "Tileset metadata URL",
value: metadataUrl !== null && metadataUrl !== void 0 ? metadataUrl : undefined,
onChange: onMetadataUrlChange
}), /*#__PURE__*/_react["default"].createElement(TilesetInputDescription, null, "Supports raster .pmtiles. Limited support for STAC Items and Collections.")), showServerInput && /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(LabelRow, null, /*#__PURE__*/_react["default"].createElement("label", {
htmlFor: "tileset-raster-servers"
}, "Raster tile servers"), /*#__PURE__*/_react["default"].createElement(InfoIconLink, {
href: RASTER_TILE_DOCUMENTATION_URL,
target: "_blank",
rel: "noopener noreferrer",
"aria-label": "Open Raster Tile Layer documentation"
}, /*#__PURE__*/_react["default"].createElement(_icons.Help, {
height: "16px"
}))), /*#__PURE__*/_react["default"].createElement(_common.InputLight, {
id: "tileset-raster-servers",
placeholder: "Raster tile servers (separated by commas)",
value: rasterTileServerUrls,
onChange: onRasterTileServerUrlsChange
}), /*#__PURE__*/_react["default"].createElement(TilesetInputDescription, null, "Raster tile server URLs for Cloud Optimized GeoTIFF tilesets and elevation.")));
};
var _default = exports["default"] = RasterTileForm;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29tbW9uVXRpbHMiLCJfY29uc3RhbnRzIiwiX3RhYmxlIiwiX3V0aWxzIiwiX3VzZUZldGNoUmFzdGVyVGlsZU1ldGFkYXRhIiwiX2NvbW1vbiIsIl9pY29ucyIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX3RlbXBsYXRlT2JqZWN0NCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIlRpbGVzZXRJbnB1dENvbnRhaW5lciIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiVGlsZXNldElucHV0RGVzY3JpcHRpb24iLCJwcm9wcyIsInRoZW1lIiwiQVpVUkUyMDAiLCJMYWJlbFJvdyIsImdldERhdGFzZXRBdHRyaWJ1dGVzRnJvbVJhc3RlclRpbGUiLCJfcmVmIiwibmFtZSIsIm1ldGFkYXRhVXJsIiwicmFzdGVyVGlsZVNlcnZlclVybHMiLCJhcHBDb25maWciLCJnZXRBcHBsaWNhdGlvbkNvbmZpZyIsInR5cGUiLCJEYXRhc2V0VHlwZSIsIlJBU1RFUl9USUxFIiwibWV0YWRhdGEiLCJyYXN0ZXJTZXJ2ZXJVc2VMYXRlc3RUaXRpbGVyIiwicmFzdGVyU2VydmVyU3VwcG9ydHNFbGV2YXRpb24iLCJyYXN0ZXJTZXJ2ZXJNYXhSZXRyaWVzIiwicmFzdGVyU2VydmVyUmV0cnlEZWxheSIsInJhc3RlclNlcnZlclNlcnZlckVycm9yc1RvUmV0cnkiLCJyYXN0ZXJTZXJ2ZXJNYXhQZXJTZXJ2ZXJSZXF1ZXN0cyIsIkluZm9JY29uTGluayIsImxhYmVsQ29sb3IiLCJSQVNURVJfVElMRV9ET0NVTUVOVEFUSU9OX1VSTCIsInBhcnNlTWV0YWRhdGFBbGxvd0NvbGxlY3Rpb25zIiwiX3JlZjIiLCJyYXN0ZXJUaWxlVHlwZSIsIlJhc3RlclRpbGVUeXBlIiwiUE1USUxFUyIsInBhcnNlVmVjdG9yTWV0YWRhdGEiLCJ0aWxlVXJsIiwicGFyc2VSYXN0ZXJNZXRhZGF0YSIsImFsbG93Q29sbGVjdGlvbnMiLCJSYXN0ZXJUaWxlRm9ybSIsIl9yZWYzIiwic2V0UmVzcG9uc2UiLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJ0aWxlTmFtZSIsInNldFRpbGVOYW1lIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJ0aWxlTmFtZVdhc01vZGlmaWVkIiwic2V0VGlsZU5hbWVXYXNNb2RpZmllZCIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2Iiwic2V0TWV0YWRhdGFVcmwiLCJfdXNlU3RhdGU3IiwicmFzdGVyU2VydmVyVXJscyIsImpvaW4iLCJfdXNlU3RhdGU4Iiwic2V0UmFzdGVyVGlsZVNlcnZlclVybHMiLCJjbGVhcmVkTWV0YWRhdGFVcmwiLCJlbmRzV2l0aCIsInNsaWNlIiwib25UaWxlTmFtZUNoYW5nZSIsInVzZUNhbGxiYWNrIiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsInRhcmdldCIsInZhbHVlIiwib25NZXRhZGF0YVVybENoYW5nZSIsInNwbGl0IiwiQm9vbGVhbiIsInBvcCIsIm9uUmFzdGVyVGlsZVNlcnZlclVybHNDaGFuZ2UiLCJfdXNlRmV0Y2hKc29uIiwidXNlRmV0Y2hKc29uIiwidXJsIiwiaXNQTVRpbGVzVXJsIiwiU1RBQyIsInByb2Nlc3MiLCJkYXRhIiwibG9hZGluZyIsIm1ldGFFcnJvciIsImVycm9yIiwidXNlRWZmZWN0IiwicG10aWxlc1R5cGUiLCJQTVRpbGVzVHlwZSIsIk1WVCIsImRhdGFzZXQiLCJFcnJvciIsInJhc3RlclRpbGVTZXJ2ZXJzIiwibWFwIiwic2VydmVyIiwidHJpbSIsImV2ZXJ5IiwidmFsaWRhdGVVcmwiLCJzaG93U2VydmVySW5wdXQiLCJyYXN0ZXJTZXJ2ZXJTaG93U2VydmVySW5wdXQiLCJjcmVhdGVFbGVtZW50IiwiaHRtbEZvciIsIklucHV0TGlnaHQiLCJpZCIsInBsYWNlaG9sZGVyIiwib25DaGFuZ2UiLCJocmVmIiwicmVsIiwiSGVscCIsImhlaWdodCIsInVuZGVmaW5lZCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RhbHMvdGlsZXNldHMtbW9kYWxzL3RpbGVzZXQtcmFzdGVyLWZvcm0udHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IHtQTVRpbGVzTWV0YWRhdGF9IGZyb20gJ0Bsb2FkZXJzLmdsL3BtdGlsZXMnO1xuXG5pbXBvcnQge2lzUE1UaWxlc1VybCwgdmFsaWRhdGVVcmx9IGZyb20gJ0BrZXBsZXIuZ2wvY29tbW9uLXV0aWxzJztcbmltcG9ydCB7RGF0YXNldFR5cGUsIFJhc3RlclRpbGVUeXBlLCBQTVRpbGVzVHlwZX0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtKc29uT2JqZWN0T3JBcnJheX0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge3BhcnNlUmFzdGVyTWV0YWRhdGEsIHBhcnNlVmVjdG9yTWV0YWRhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtnZXRBcHBsaWNhdGlvbkNvbmZpZ30gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7ZGVmYXVsdCBhcyB1c2VGZXRjaEpzb259IGZyb20gJy4uLy4uL2hvb2tzL3VzZS1mZXRjaC1yYXN0ZXItdGlsZS1tZXRhZGF0YSc7XG5pbXBvcnQge0RhdGFzZXRDcmVhdGlvbkF0dHJpYnV0ZXMsIE1ldGFSZXNwb25zZX0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHtJbnB1dExpZ2h0fSBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHtIZWxwfSBmcm9tICcuLi8uLi9jb21tb24vaWNvbnMnO1xuXG5jb25zdCBUaWxlc2V0SW5wdXRDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCgzLCAxZnIpO1xuICByb3ctZ2FwOiAwcHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbmA7XG5cbmNvbnN0IFRpbGVzZXRJbnB1dERlc2NyaXB0aW9uID0gc3R5bGVkLmRpdmBcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5BWlVSRTIwMH07XG4gIGZvbnQtc2l6ZTogMTFweDtcbmA7XG5cbmNvbnN0IExhYmVsUm93ID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbmA7XG5cbmV4cG9ydCB0eXBlIFJhc3RlclRpbGVzZXRNZXRhID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIG1ldGFkYXRhVXJsOiBzdHJpbmc7XG4gIHJhc3RlclRpbGVTZXJ2ZXJVcmxzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YXNldEF0dHJpYnV0ZXNGcm9tUmFzdGVyVGlsZSh7XG4gIG5hbWUsXG4gIG1ldGFkYXRhVXJsLFxuICByYXN0ZXJUaWxlU2VydmVyVXJsc1xufTogUmFzdGVyVGlsZXNldE1ldGEpOiBEYXRhc2V0Q3JlYXRpb25BdHRyaWJ1dGVzIHtcbiAgY29uc3QgYXBwQ29uZmlnID0gZ2V0QXBwbGljYXRpb25Db25maWcoKTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHR5cGU6IERhdGFzZXRUeXBlLlJBU1RFUl9USUxFLFxuICAgIG1ldGFkYXRhOiB7XG4gICAgICBtZXRhZGF0YVVybCxcbiAgICAgIC4uLihyYXN0ZXJUaWxlU2VydmVyVXJscyA/IHtyYXN0ZXJUaWxlU2VydmVyVXJsc30gOiB7fSksXG4gICAgICAvLyBQZXJzaXN0IHJhc3RlciBzZXJ2ZXItcmVsYXRlZCBhcHBsaWNhdGlvbiBjb25maWcgd2l0aCB0aGUgbGF5ZXJcbiAgICAgIHJhc3RlclNlcnZlclVzZUxhdGVzdFRpdGlsZXI6IGFwcENvbmZpZy5yYXN0ZXJTZXJ2ZXJVc2VMYXRlc3RUaXRpbGVyLFxuICAgICAgcmFzdGVyU2VydmVyU3VwcG9ydHNFbGV2YXRpb246IGFwcENvbmZpZy5yYXN0ZXJTZXJ2ZXJTdXBwb3J0c0VsZXZhdGlvbixcbiAgICAgIHJhc3RlclNlcnZlck1heFJldHJpZXM6IGFwcENvbmZpZy5yYXN0ZXJTZXJ2ZXJNYXhSZXRyaWVzLFxuICAgICAgcmFzdGVyU2VydmVyUmV0cnlEZWxheTogYXBwQ29uZmlnLnJhc3RlclNlcnZlclJldHJ5RGVsYXksXG4gICAgICByYXN0ZXJTZXJ2ZXJTZXJ2ZXJFcnJvcnNUb1JldHJ5OiBhcHBDb25maWcucmFzdGVyU2VydmVyU2VydmVyRXJyb3JzVG9SZXRyeSxcbiAgICAgIHJhc3RlclNlcnZlck1heFBlclNlcnZlclJlcXVlc3RzOiBhcHBDb25maWcucmFzdGVyU2VydmVyTWF4UGVyU2VydmVyUmVxdWVzdHNcbiAgICB9XG4gIH07XG59XG5cbnR5cGUgUmFzdGVyVGlsZUZvcm1Qcm9wcyA9IHtcbiAgc2V0UmVzcG9uc2U6IChyZXNwb25zZTogTWV0YVJlc3BvbnNlKSA9PiB2b2lkO1xufTtcblxuY29uc3QgSW5mb0ljb25MaW5rID0gc3R5bGVkLmFgXG4gIG1hcmdpbi1sZWZ0OiA0cHg7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxhYmVsQ29sb3J9O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBsaW5lLWhlaWdodDogMDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgb3BhY2l0eTogMC43O1xuXG4gICY6aG92ZXIge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cblxuICBzdmcge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5gO1xuXG5jb25zdCBSQVNURVJfVElMRV9ET0NVTUVOVEFUSU9OX1VSTCA9XG4gICdodHRwczovL2RvY3Mua2VwbGVyLmdsL2RvY3MvdXNlci1ndWlkZXMvYy10eXBlcy1vZi1sYXllcnMvbi1yYXN0ZXItdGlsZS1sYXllcic7XG5cbmNvbnN0IHBhcnNlTWV0YWRhdGFBbGxvd0NvbGxlY3Rpb25zID0gKFxuICBtZXRhZGF0YTogSnNvbk9iamVjdE9yQXJyYXkgfCBQTVRpbGVzTWV0YWRhdGEsXG4gIHttZXRhZGF0YVVybCwgcmFzdGVyVGlsZVR5cGV9OiB7bWV0YWRhdGFVcmw6IHN0cmluZzsgcmFzdGVyVGlsZVR5cGU6IFJhc3RlclRpbGVUeXBlfVxuKSA9PiB7XG4gIHJldHVybiByYXN0ZXJUaWxlVHlwZSA9PT0gUmFzdGVyVGlsZVR5cGUuUE1USUxFU1xuICAgID8gcGFyc2VWZWN0b3JNZXRhZGF0YShtZXRhZGF0YSBhcyBQTVRpbGVzTWV0YWRhdGEsIHtcbiAgICAgICAgdGlsZVVybDogbWV0YWRhdGFVcmxcbiAgICAgIH0pXG4gICAgOiBwYXJzZVJhc3Rlck1ldGFkYXRhKG1ldGFkYXRhIGFzIEpzb25PYmplY3RPckFycmF5LCB7YWxsb3dDb2xsZWN0aW9uczogdHJ1ZX0pO1xufTtcblxuY29uc3QgUmFzdGVyVGlsZUZvcm06IFJlYWN0LkZDPFJhc3RlclRpbGVGb3JtUHJvcHM+ID0gKHtzZXRSZXNwb25zZX0pID0+IHtcbiAgY29uc3QgW3RpbGVOYW1lLCBzZXRUaWxlTmFtZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KCcnKTtcbiAgY29uc3QgW3RpbGVOYW1lV2FzTW9kaWZpZWQsIHNldFRpbGVOYW1lV2FzTW9kaWZpZWRdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbbWV0YWRhdGFVcmwsIHNldE1ldGFkYXRhVXJsXSA9IHVzZVN0YXRlPHN0cmluZz4oJycpO1xuICBjb25zdCBbcmFzdGVyVGlsZVNlcnZlclVybHMsIHNldFJhc3RlclRpbGVTZXJ2ZXJVcmxzXSA9IHVzZVN0YXRlPHN0cmluZz4oXG4gICAgKGdldEFwcGxpY2F0aW9uQ29uZmlnKCkucmFzdGVyU2VydmVyVXJscyB8fCBbXSkuam9pbignLCcpXG4gICk7XG5cbiAgLy8gUmVtb3ZlIHRyYWlsaW5nIHNsYXNoIHRvIHByZXZlbnQgaXNzdWVzIHdpdGggcmFzdGVyIHRpbGUgc2VydmVyc1xuICBjb25zdCBjbGVhcmVkTWV0YWRhdGFVcmwgPSBtZXRhZGF0YVVybC5lbmRzV2l0aCgnLycpID8gbWV0YWRhdGFVcmwuc2xpY2UoMCwgLTEpIDogbWV0YWRhdGFVcmw7XG5cbiAgY29uc3Qgb25UaWxlTmFtZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRUaWxlTmFtZVdhc01vZGlmaWVkKHRydWUpO1xuICAgICAgc2V0VGlsZU5hbWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9LFxuICAgIFtzZXRUaWxlTmFtZV1cbiAgKTtcblxuICBjb25zdCBvbk1ldGFkYXRhVXJsQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHt2YWx1ZX0gPSBldmVudC50YXJnZXQ7XG4gICAgICBzZXRNZXRhZGF0YVVybCh2YWx1ZSk7XG5cbiAgICAgIGlmICghdGlsZU5hbWVXYXNNb2RpZmllZCkge1xuICAgICAgICBzZXRUaWxlTmFtZSh2YWx1ZS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKSB8fCAnJyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbdGlsZU5hbWVXYXNNb2RpZmllZF1cbiAgKTtcblxuICBjb25zdCBvblJhc3RlclRpbGVTZXJ2ZXJVcmxzQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNldFJhc3RlclRpbGVTZXJ2ZXJVcmxzKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfSxcbiAgICBbc2V0UmFzdGVyVGlsZVNlcnZlclVybHNdXG4gICk7XG5cbiAgY29uc3Qge1xuICAgIGRhdGE6IG1ldGFkYXRhLFxuICAgIGxvYWRpbmcsXG4gICAgZXJyb3I6IG1ldGFFcnJvclxuICB9ID0gdXNlRmV0Y2hKc29uKHtcbiAgICB1cmw6IGNsZWFyZWRNZXRhZGF0YVVybCxcbiAgICByYXN0ZXJUaWxlVHlwZTogaXNQTVRpbGVzVXJsKGNsZWFyZWRNZXRhZGF0YVVybCkgPyBSYXN0ZXJUaWxlVHlwZS5QTVRJTEVTIDogUmFzdGVyVGlsZVR5cGUuU1RBQyxcbiAgICBwcm9jZXNzOiBwYXJzZU1ldGFkYXRhQWxsb3dDb2xsZWN0aW9uc1xuICB9KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0aWxlTmFtZSAmJiBjbGVhcmVkTWV0YWRhdGFVcmwpIHtcbiAgICAgIGNvbnN0IHBtdGlsZXNUeXBlID0gbWV0YWRhdGE/LnBtdGlsZXNUeXBlO1xuXG4gICAgICBpZiAocG10aWxlc1R5cGUgPT09IFBNVGlsZXNUeXBlLk1WVCkge1xuICAgICAgICByZXR1cm4gc2V0UmVzcG9uc2Uoe1xuICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgIGRhdGFzZXQ6IG51bGwsXG4gICAgICAgICAgbG9hZGluZyxcbiAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKCdGb3IgLnBtdGlsZXMgaW4gbXZ0IGZvcm1hdCwgcGxlYXNlIHVzZSB0aGUgVmVjdG9yIFRpbGUgZm9ybS4nKVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbGV0IGVycm9yID0gbWV0YUVycm9yO1xuXG4gICAgICAvLyBjaGVjayBmb3IgcmFzdGVyIHRpbGUgc2VydmVycyBmb3IgU1RBQyBpdGVtcyBhbmQgY29sbGVjdGlvbnNcbiAgICAgIGxldCByYXN0ZXJUaWxlU2VydmVycztcbiAgICAgIGlmIChcbiAgICAgICAgIWVycm9yXG4gICAgICAgIC8vIFdlIHN0aWxsIG5lZWQgcmFzdGVyIHRpbGUgc2VydmVycyBmb3IgUE1UaWxlcyB3aGVuIHdlIHBsYW4gdG8gdXNlIGVsZXZhdGlvblxuICAgICAgKSB7XG4gICAgICAgIHJhc3RlclRpbGVTZXJ2ZXJzID0gcmFzdGVyVGlsZVNlcnZlclVybHNcbiAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgIC5tYXAoc2VydmVyID0+IHNlcnZlci50cmltKCkpXG4gICAgICAgICAgLmZpbHRlcihzZXJ2ZXIgPT4gc2VydmVyKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJhc3RlclRpbGVTZXJ2ZXJzLmxlbmd0aCA8IDEgfHxcbiAgICAgICAgICAhcmFzdGVyVGlsZVNlcnZlcnMuZXZlcnkoc2VydmVyID0+IHZhbGlkYXRlVXJsKHNlcnZlcikpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChwbXRpbGVzVHlwZSkge1xuICAgICAgICAgICAgLy8gRm9yIHJhc3RlciB0aWxlcyBlbGV2YXRpb24gc3VwcG9ydCBpcyBvcHRpb25hbFxuICAgICAgICAgICAgLy8gVE9ETyBkaXNwbGF5IGEgd2FybmluZywgYnV0IG5vdCBhIGJsb2NraW5nIGVycm9yXG4gICAgICAgICAgICByYXN0ZXJUaWxlU2VydmVycyA9IFtdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ1Byb3ZpZGUgdmFsaWQgcmFzdGVyIHRpbGUgc2VydmVyIHVybHMgdG8gc3VwcG9ydCBTVEFDIGFuZCBlbGV2YXRpb25zLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXQgPSBnZXREYXRhc2V0QXR0cmlidXRlc0Zyb21SYXN0ZXJUaWxlKHtcbiAgICAgICAgbmFtZTogdGlsZU5hbWUsXG4gICAgICAgIG1ldGFkYXRhVXJsOiBjbGVhcmVkTWV0YWRhdGFVcmwsXG4gICAgICAgIHJhc3RlclRpbGVTZXJ2ZXJVcmxzOiByYXN0ZXJUaWxlU2VydmVyc1xuICAgICAgfSk7XG5cbiAgICAgIHNldFJlc3BvbnNlKHtcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGRhdGFzZXQsXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIGVycm9yXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0UmVzcG9uc2Uoe1xuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgZGF0YXNldDogbnVsbCxcbiAgICAgICAgbG9hZGluZyxcbiAgICAgICAgZXJyb3I6IG1ldGFFcnJvclxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbXG4gICAgbWV0YWRhdGEsXG4gICAgbG9hZGluZyxcbiAgICBtZXRhRXJyb3IsXG4gICAgdGlsZU5hbWUsXG4gICAgY2xlYXJlZE1ldGFkYXRhVXJsLFxuICAgIHJhc3RlclRpbGVTZXJ2ZXJVcmxzLFxuICAgIHNldFJlc3BvbnNlXG4gIF0pO1xuXG4gIGNvbnN0IHNob3dTZXJ2ZXJJbnB1dCA9IGdldEFwcGxpY2F0aW9uQ29uZmlnKCkucmFzdGVyU2VydmVyU2hvd1NlcnZlcklucHV0O1xuXG4gIHJldHVybiAoXG4gICAgPFRpbGVzZXRJbnB1dENvbnRhaW5lcj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxsYWJlbCBodG1sRm9yPVwidGlsZXNldC1uYW1lXCI+TmFtZTwvbGFiZWw+XG4gICAgICAgIDxJbnB1dExpZ2h0XG4gICAgICAgICAgaWQ9XCJ0aWxlc2V0LW5hbWVcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTmFtZSB5b3VyIHRpbGVzZXRcIlxuICAgICAgICAgIHZhbHVlPXt0aWxlTmFtZX1cbiAgICAgICAgICBvbkNoYW5nZT17b25UaWxlTmFtZUNoYW5nZX1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPExhYmVsUm93PlxuICAgICAgICAgIDxsYWJlbCBodG1sRm9yPVwidGlsZS1tZXRhZGF0YVwiPlRpbGVzZXQgbWV0YWRhdGEgVVJMPC9sYWJlbD5cbiAgICAgICAgICA8SW5mb0ljb25MaW5rXG4gICAgICAgICAgICBocmVmPXtSQVNURVJfVElMRV9ET0NVTUVOVEFUSU9OX1VSTH1cbiAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJPcGVuIFJhc3RlciBUaWxlIExheWVyIGRvY3VtZW50YXRpb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxIZWxwIGhlaWdodD1cIjE2cHhcIiAvPlxuICAgICAgICAgIDwvSW5mb0ljb25MaW5rPlxuICAgICAgICA8L0xhYmVsUm93PlxuICAgICAgICA8SW5wdXRMaWdodFxuICAgICAgICAgIGlkPVwidGlsZS1tZXRhZGF0YVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJUaWxlc2V0IG1ldGFkYXRhIFVSTFwiXG4gICAgICAgICAgdmFsdWU9e21ldGFkYXRhVXJsID8/IHVuZGVmaW5lZH1cbiAgICAgICAgICBvbkNoYW5nZT17b25NZXRhZGF0YVVybENoYW5nZX1cbiAgICAgICAgLz5cbiAgICAgICAgPFRpbGVzZXRJbnB1dERlc2NyaXB0aW9uPlxuICAgICAgICAgIFN1cHBvcnRzIHJhc3RlciAucG10aWxlcy4gTGltaXRlZCBzdXBwb3J0IGZvciBTVEFDIEl0ZW1zIGFuZCBDb2xsZWN0aW9ucy5cbiAgICAgICAgPC9UaWxlc2V0SW5wdXREZXNjcmlwdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgICAge3Nob3dTZXJ2ZXJJbnB1dCAmJiAoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPExhYmVsUm93PlxuICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJ0aWxlc2V0LXJhc3Rlci1zZXJ2ZXJzXCI+UmFzdGVyIHRpbGUgc2VydmVyczwvbGFiZWw+XG4gICAgICAgICAgICA8SW5mb0ljb25MaW5rXG4gICAgICAgICAgICAgIGhyZWY9e1JBU1RFUl9USUxFX0RPQ1VNRU5UQVRJT05fVVJMfVxuICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk9wZW4gUmFzdGVyIFRpbGUgTGF5ZXIgZG9jdW1lbnRhdGlvblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxIZWxwIGhlaWdodD1cIjE2cHhcIiAvPlxuICAgICAgICAgICAgPC9JbmZvSWNvbkxpbms+XG4gICAgICAgICAgPC9MYWJlbFJvdz5cbiAgICAgICAgICA8SW5wdXRMaWdodFxuICAgICAgICAgICAgaWQ9XCJ0aWxlc2V0LXJhc3Rlci1zZXJ2ZXJzXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUmFzdGVyIHRpbGUgc2VydmVycyAoc2VwYXJhdGVkIGJ5IGNvbW1hcylcIlxuICAgICAgICAgICAgdmFsdWU9e3Jhc3RlclRpbGVTZXJ2ZXJVcmxzfVxuICAgICAgICAgICAgb25DaGFuZ2U9e29uUmFzdGVyVGlsZVNlcnZlclVybHNDaGFuZ2V9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8VGlsZXNldElucHV0RGVzY3JpcHRpb24+XG4gICAgICAgICAgICBSYXN0ZXIgdGlsZSBzZXJ2ZXIgVVJMcyBmb3IgQ2xvdWQgT3B0aW1pemVkIEdlb1RJRkYgdGlsZXNldHMgYW5kIGVsZXZhdGlvbi5cbiAgICAgICAgICA8L1RpbGVzZXRJbnB1dERlc2NyaXB0aW9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9UaWxlc2V0SW5wdXRDb250YWluZXI+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSYXN0ZXJUaWxlRm9ybTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUlBLElBQUFHLFlBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFVBQUEsR0FBQUosT0FBQTtBQUVBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE1BQUEsR0FBQU4sT0FBQTtBQUVBLElBQUFPLDJCQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBUSxPQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxNQUFBLEdBQUFULE9BQUE7QUFBd0MsSUFBQVUsZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQWpCeEM7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxD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