kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
198 lines (188 loc) • 24.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.RasterLayerResources = void 0;
exports.bandIndexesToURLParams = bandIndexesToURLParams;
exports.getMeshMaxError = getMeshMaxError;
exports.getSingleCOGUrlParams = getSingleCOGUrlParams;
exports.getStacApiUrlParams = getStacApiUrlParams;
exports.getTerrainUrl = getTerrainUrl;
exports.getTitilerPathMapping = getTitilerPathMapping;
exports.getTitilerUrl = getTitilerUrl;
var _utils = require("@kepler.gl/utils");
var _config = require("./config");
// SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
/* Utilities for creating request urls */
/* global URLSearchParams */
var TILE_SIZE = 256;
var STAC_SEARCH_DATA = {
// Commenting out Microsoft for now
// microsoft: {
// sentinelCollectionName: ['sentinel-2-l2a'],
// stacSearchUrl: 'https://planetarycomputer.microsoft.com/api/stac/v1/search'
// },
'earth-search': {
sentinelCollectionName: ['sentinel-s2-l2a-cogs'],
stacSearchUrl: 'https://earth-search.aws.element84.com/v0/search'
}
};
/**
* Construct query parameters to be sent to STAC API instance
*/
function constructStacApiQuery(options) {
var _STAC_SEARCH_DATA$sta;
var stac = options.stac,
startDate = options.startDate,
endDate = options.endDate,
stacSearchProvider = options.stacSearchProvider;
// This is a quick hack to support the same Sentinel 2 STAC object for searching both microsoft
// and AWS
var collections = ((_STAC_SEARCH_DATA$sta = STAC_SEARCH_DATA[stacSearchProvider]) === null || _STAC_SEARCH_DATA$sta === void 0 ? void 0 : _STAC_SEARCH_DATA$sta.sentinelCollectionName) || [stac.id];
return {
collections: collections,
datetime: "".concat(startDate, "T00:00:00Z/").concat(endDate, "T23:59:59Z")
};
}
/**
* Perform lookup to find url of desired STAC search provider
*/
function getStacApiUrl(stacSearchProvider) {
return STAC_SEARCH_DATA[stacSearchProvider].stacSearchUrl;
}
function getStacApiUrlParams(options) {
var stac = options.stac,
loadAssetIds = options.loadAssetIds,
stacSearchProvider = options.stacSearchProvider,
_options$mask = options.mask,
mask = _options$mask === void 0 ? false : _options$mask;
var query = options._stacQuery || JSON.stringify(constructStacApiQuery(options));
var searchUrl = getStacApiUrl(stacSearchProvider);
if (!searchUrl) {
return null;
}
var bandIndexAssets = loadAssetIds.map(function (assetId) {
var mapping = _config.DEFAULT_BAND_MAPPINGS[stac.id];
if (!mapping) {
// TODO provide a UI to setup custom band mapping
return assetId;
}
var bandIndex = mapping[assetId];
if (bandIndex) {
return bandIndex;
}
// This is most likely incorrect as BXX is expected, not common name
return assetId;
});
return new URLSearchParams({
assets: bandIndexAssets.join(','),
return_mask: String(mask),
url: searchUrl,
query: query
});
}
function bandIndexesToURLParams(urlParams, bandIndexes, useNewFormat) {
if (useNewFormat) {
// for newer titiler versions
bandIndexes.forEach(function (bandIndex) {
urlParams.append('bidx', String(bandIndex + 1));
});
} else {
// The parameter in titiler is `bands` for landsat/sentinel and `bidx` for COG
// GDAL/Rasterio/rio-tiler start band indexing at one
// older titiler versions
urlParams.append('bidx', bandIndexes.map(function (val) {
return val + 1;
}).join(','));
}
return urlParams;
}
function getSingleCOGUrlParams(options) {
var _stac$rasterServerUse;
var stac = options.stac,
loadAssetId = options.loadAssetId,
loadBandIndexes = options.loadBandIndexes,
_options$mask2 = options.mask,
mask = _options$mask2 === void 0 ? false : _options$mask2;
var url = stac.assets[loadAssetId].href;
if (!url) {
return null;
}
var urlParams = new URLSearchParams({
return_mask: String(mask),
url: url
});
return bandIndexesToURLParams(urlParams, loadBandIndexes, Boolean((_stac$rasterServerUse = stac.rasterServerUseLatestTitiler) !== null && _stac$rasterServerUse !== void 0 ? _stac$rasterServerUse : (0, _utils.getApplicationConfig)().rasterServerUseLatestTitiler));
}
/**
* Construct full URL to load tile from a Titiler-based backend
*/
function getTitilerUrl(options) {
var _stac$rasterTileServe;
// mask Set to false for mosaics because entire image is assumed to be valid
var stac = options.stac,
useSTACSearching = options.useSTACSearching,
x = options.x,
y = options.y,
z = options.z;
if (!((_stac$rasterTileServe = stac.rasterTileServerUrls) !== null && _stac$rasterTileServe !== void 0 && _stac$rasterTileServe.length)) {
throw new Error('No raster tile servers');
}
var pathStem = getTitilerPathMapping(stac, useSTACSearching);
var scale = TILE_SIZE === 512 ? '@2x' : '';
var domain = chooseDomain(stac.rasterTileServerUrls, x, y);
return {
url: "".concat(domain, "/").concat(pathStem, "/tiles/WebMercatorQuad/").concat(z, "/").concat(x, "/").concat(y).concat(scale, ".npy"),
rasterServerUrl: domain
};
}
function getTitilerPathMapping(stac) {
var useSTACSearching = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
if (useSTACSearching) {
return 'stac/mosaic';
}
return 'cog';
}
/**
* Choose from available domains to load images from
*
* @param x x tile index
* @param y y tile index
*
* @return domain
*/
function chooseDomain(domains, x, y) {
var index = Math.abs(x + y) % domains.length;
return domains[index];
}
function getTerrainUrl(rasterTileServerUrls, x, y, z, meshMaxError) {
var scale = TILE_SIZE === 512 ? '@2x' : '';
var params = new URLSearchParams({
url: 'terrarium',
mesh_max_error: meshMaxError.toFixed(2)
});
var domain = chooseDomain(rasterTileServerUrls, x, y);
var baseUrl = "".concat(domain, "/mesh/tiles/").concat(z, "/").concat(x, "/").concat(y).concat(scale, ".terrain?");
return {
url: baseUrl + params.toString(),
rasterServerUrl: domain
};
}
/**
* get mesh max error for z value
* @param z mercator tile z coord
* @param multiplier multipler applied to default error
*
* Uses suggestion from here
* https://www.linkedin.com/pulse/fast-cesium-terrain-rendering-new-quantized-mesh-output-alvaro-huarte/
*/
function getMeshMaxError(z, multiplier) {
return 77067.34 / (1 << z) * multiplier;
}
var RasterLayerResources = exports.RasterLayerResources = {
rasterColorMap: function rasterColorMap(colormapId) {
return "".concat((0, _utils.getApplicationConfig)().cdnUrl, "/raster/colormaps/").concat(colormapId, ".png");
}
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdXRpbHMiLCJyZXF1aXJlIiwiX2NvbmZpZyIsIlRJTEVfU0laRSIsIlNUQUNfU0VBUkNIX0RBVEEiLCJzZW50aW5lbENvbGxlY3Rpb25OYW1lIiwic3RhY1NlYXJjaFVybCIsImNvbnN0cnVjdFN0YWNBcGlRdWVyeSIsIm9wdGlvbnMiLCJfU1RBQ19TRUFSQ0hfREFUQSRzdGEiLCJzdGFjIiwic3RhcnREYXRlIiwiZW5kRGF0ZSIsInN0YWNTZWFyY2hQcm92aWRlciIsImNvbGxlY3Rpb25zIiwiaWQiLCJkYXRldGltZSIsImNvbmNhdCIsImdldFN0YWNBcGlVcmwiLCJnZXRTdGFjQXBpVXJsUGFyYW1zIiwibG9hZEFzc2V0SWRzIiwiX29wdGlvbnMkbWFzayIsIm1hc2siLCJxdWVyeSIsIl9zdGFjUXVlcnkiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VhcmNoVXJsIiwiYmFuZEluZGV4QXNzZXRzIiwibWFwIiwiYXNzZXRJZCIsIm1hcHBpbmciLCJERUZBVUxUX0JBTkRfTUFQUElOR1MiLCJiYW5kSW5kZXgiLCJVUkxTZWFyY2hQYXJhbXMiLCJhc3NldHMiLCJqb2luIiwicmV0dXJuX21hc2siLCJTdHJpbmciLCJ1cmwiLCJiYW5kSW5kZXhlc1RvVVJMUGFyYW1zIiwidXJsUGFyYW1zIiwiYmFuZEluZGV4ZXMiLCJ1c2VOZXdGb3JtYXQiLCJmb3JFYWNoIiwiYXBwZW5kIiwidmFsIiwiZ2V0U2luZ2xlQ09HVXJsUGFyYW1zIiwiX3N0YWMkcmFzdGVyU2VydmVyVXNlIiwibG9hZEFzc2V0SWQiLCJsb2FkQmFuZEluZGV4ZXMiLCJfb3B0aW9ucyRtYXNrMiIsImhyZWYiLCJCb29sZWFuIiwicmFzdGVyU2VydmVyVXNlTGF0ZXN0VGl0aWxlciIsImdldEFwcGxpY2F0aW9uQ29uZmlnIiwiZ2V0VGl0aWxlclVybCIsIl9zdGFjJHJhc3RlclRpbGVTZXJ2ZSIsInVzZVNUQUNTZWFyY2hpbmciLCJ4IiwieSIsInoiLCJyYXN0ZXJUaWxlU2VydmVyVXJscyIsImxlbmd0aCIsIkVycm9yIiwicGF0aFN0ZW0iLCJnZXRUaXRpbGVyUGF0aE1hcHBpbmciLCJzY2FsZSIsImRvbWFpbiIsImNob29zZURvbWFpbiIsInJhc3RlclNlcnZlclVybCIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsImRvbWFpbnMiLCJpbmRleCIsIk1hdGgiLCJhYnMiLCJnZXRUZXJyYWluVXJsIiwibWVzaE1heEVycm9yIiwicGFyYW1zIiwibWVzaF9tYXhfZXJyb3IiLCJ0b0ZpeGVkIiwiYmFzZVVybCIsInRvU3RyaW5nIiwiZ2V0TWVzaE1heEVycm9yIiwibXVsdGlwbGllciIsIlJhc3RlckxheWVyUmVzb3VyY2VzIiwiZXhwb3J0cyIsInJhc3RlckNvbG9yTWFwIiwiY29sb3JtYXBJZCIsImNkblVybCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yYXN0ZXItdGlsZS91cmwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLyogVXRpbGl0aWVzIGZvciBjcmVhdGluZyByZXF1ZXN0IHVybHMgKi9cbi8qIGdsb2JhbCBVUkxTZWFyY2hQYXJhbXMgKi9cblxuaW1wb3J0IHtTdGFjVHlwZXN9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtnZXRBcHBsaWNhdGlvbkNvbmZpZ30gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7REVGQVVMVF9CQU5EX01BUFBJTkdTfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQge1xuICBBc3NldElkcyxcbiAgQmFuZEluZGV4ZXMsXG4gIENvbXBsZXRlU1RBQ0l0ZW0sXG4gIENvbXBsZXRlU1RBQ0NvbGxlY3Rpb24sXG4gIEdldFRpbGVEYXRhUHJvcHNcbn0gZnJvbSAnLi90eXBlcyc7XG5cbnR5cGUgSXRlbSA9IFN0YWNUeXBlcy5TVEFDSXRlbTtcbnR5cGUgQ29sbGVjdGlvbiA9IFN0YWNUeXBlcy5TVEFDQ29sbGVjdGlvbjtcblxuY29uc3QgVElMRV9TSVpFOiAyNTYgfCA1MTIgPSAyNTY7XG5cbmludGVyZmFjZSBTdGFjU2VhcmNoSW5mbyB7XG4gIHNlbnRpbmVsQ29sbGVjdGlvbk5hbWU6IHN0cmluZ1tdO1xuICBzdGFjU2VhcmNoVXJsOiBzdHJpbmc7XG59XG5cbmNvbnN0IFNUQUNfU0VBUkNIX0RBVEE6IFJlY29yZDxzdHJpbmcsIFN0YWNTZWFyY2hJbmZvPiA9IHtcbiAgLy8gQ29tbWVudGluZyBvdXQgTWljcm9zb2Z0IGZvciBub3dcbiAgLy8gbWljcm9zb2Z0OiB7XG4gIC8vICAgc2VudGluZWxDb2xsZWN0aW9uTmFtZTogWydzZW50aW5lbC0yLWwyYSddLFxuICAvLyAgIHN0YWNTZWFyY2hVcmw6ICdodHRwczovL3BsYW5ldGFyeWNvbXB1dGVyLm1pY3Jvc29mdC5jb20vYXBpL3N0YWMvdjEvc2VhcmNoJ1xuICAvLyB9LFxuICAnZWFydGgtc2VhcmNoJzoge1xuICAgIHNlbnRpbmVsQ29sbGVjdGlvbk5hbWU6IFsnc2VudGluZWwtczItbDJhLWNvZ3MnXSxcbiAgICBzdGFjU2VhcmNoVXJsOiAnaHR0cHM6Ly9lYXJ0aC1zZWFyY2guYXdzLmVsZW1lbnQ4NC5jb20vdjAvc2VhcmNoJ1xuICB9XG59O1xuXG4vKipcbiAqIENvbnN0cnVjdCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGJlIHNlbnQgdG8gU1RBQyBBUEkgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gY29uc3RydWN0U3RhY0FwaVF1ZXJ5KG9wdGlvbnM6IHtcbiAgc3RhYzogSXRlbSB8IENvbGxlY3Rpb247XG4gIHN0YXJ0RGF0ZTogc3RyaW5nO1xuICBlbmREYXRlOiBzdHJpbmc7XG4gIHN0YWNTZWFyY2hQcm92aWRlcjogc3RyaW5nO1xufSk6IHtjb2xsZWN0aW9uczogc3RyaW5nW107IGRhdGV0aW1lOiBzdHJpbmd9IHtcbiAgY29uc3Qge3N0YWMsIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgc3RhY1NlYXJjaFByb3ZpZGVyfSA9IG9wdGlvbnM7XG5cbiAgLy8gVGhpcyBpcyBhIHF1aWNrIGhhY2sgdG8gc3VwcG9ydCB0aGUgc2FtZSBTZW50aW5lbCAyIFNUQUMgb2JqZWN0IGZvciBzZWFyY2hpbmcgYm90aCBtaWNyb3NvZnRcbiAgLy8gYW5kIEFXU1xuICBjb25zdCBjb2xsZWN0aW9ucyA9IFNUQUNfU0VBUkNIX0RBVEFbc3RhY1NlYXJjaFByb3ZpZGVyXT8uc2VudGluZWxDb2xsZWN0aW9uTmFtZSB8fCBbc3RhYy5pZF07XG5cbiAgcmV0dXJuIHtcbiAgICBjb2xsZWN0aW9ucyxcbiAgICBkYXRldGltZTogYCR7c3RhcnREYXRlfVQwMDowMDowMFovJHtlbmREYXRlfVQyMzo1OTo1OVpgXG4gIH07XG59XG5cbi8qKlxuICogUGVyZm9ybSBsb29rdXAgdG8gZmluZCB1cmwgb2YgZGVzaXJlZCBTVEFDIHNlYXJjaCBwcm92aWRlclxuICovXG5mdW5jdGlvbiBnZXRTdGFjQXBpVXJsKHN0YWNTZWFyY2hQcm92aWRlcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFNUQUNfU0VBUkNIX0RBVEFbc3RhY1NlYXJjaFByb3ZpZGVyXS5zdGFjU2VhcmNoVXJsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhY0FwaVVybFBhcmFtcyhvcHRpb25zOiB7XG4gIHN0YWM6IENvbXBsZXRlU1RBQ0NvbGxlY3Rpb247XG4gIHN0YWNTZWFyY2hQcm92aWRlcjogc3RyaW5nO1xuICBzdGFydERhdGU6IHN0cmluZztcbiAgZW5kRGF0ZTogc3RyaW5nO1xuICBtYXNrPzogYm9vbGVhbjtcbiAgbG9hZEFzc2V0SWRzOiBBc3NldElkcztcbiAgX3N0YWNRdWVyeT86IHN0cmluZztcbn0pOiBVUkxTZWFyY2hQYXJhbXMgfCBudWxsIHtcbiAgY29uc3Qge3N0YWMsIGxvYWRBc3NldElkcywgc3RhY1NlYXJjaFByb3ZpZGVyLCBtYXNrID0gZmFsc2V9ID0gb3B0aW9ucztcbiAgY29uc3QgcXVlcnkgPSBvcHRpb25zLl9zdGFjUXVlcnkgfHwgSlNPTi5zdHJpbmdpZnkoY29uc3RydWN0U3RhY0FwaVF1ZXJ5KG9wdGlvbnMpKTtcbiAgY29uc3Qgc2VhcmNoVXJsID0gZ2V0U3RhY0FwaVVybChzdGFjU2VhcmNoUHJvdmlkZXIpO1xuXG4gIGlmICghc2VhcmNoVXJsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBiYW5kSW5kZXhBc3NldHMgPSBsb2FkQXNzZXRJZHMubWFwKGFzc2V0SWQgPT4ge1xuICAgIGNvbnN0IG1hcHBpbmcgPSBERUZBVUxUX0JBTkRfTUFQUElOR1Nbc3RhYy5pZF07XG4gICAgaWYgKCFtYXBwaW5nKSB7XG4gICAgICAvLyBUT0RPIHByb3ZpZGUgYSBVSSB0byBzZXR1cCBjdXN0b20gYmFuZCBtYXBwaW5nXG4gICAgICByZXR1cm4gYXNzZXRJZDtcbiAgICB9XG5cbiAgICBjb25zdCBiYW5kSW5kZXggPSBtYXBwaW5nW2Fzc2V0SWRdO1xuICAgIGlmIChiYW5kSW5kZXgpIHtcbiAgICAgIHJldHVybiBiYW5kSW5kZXg7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBtb3N0IGxpa2VseSBpbmNvcnJlY3QgYXMgQlhYIGlzIGV4cGVjdGVkLCBub3QgY29tbW9uIG5hbWVcbiAgICByZXR1cm4gYXNzZXRJZDtcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgIGFzc2V0czogYmFuZEluZGV4QXNzZXRzLmpvaW4oJywnKSxcbiAgICByZXR1cm5fbWFzazogU3RyaW5nKG1hc2spLFxuICAgIHVybDogc2VhcmNoVXJsLFxuICAgIHF1ZXJ5XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmFuZEluZGV4ZXNUb1VSTFBhcmFtcyhcbiAgdXJsUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXMsXG4gIGJhbmRJbmRleGVzOiBCYW5kSW5kZXhlcyxcbiAgdXNlTmV3Rm9ybWF0OiBib29sZWFuXG4pOiBVUkxTZWFyY2hQYXJhbXMge1xuICBpZiAodXNlTmV3Rm9ybWF0KSB7XG4gICAgLy8gZm9yIG5ld2VyIHRpdGlsZXIgdmVyc2lvbnNcbiAgICBiYW5kSW5kZXhlcy5mb3JFYWNoKGJhbmRJbmRleCA9PiB7XG4gICAgICB1cmxQYXJhbXMuYXBwZW5kKCdiaWR4JywgU3RyaW5nKGJhbmRJbmRleCArIDEpKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGUgcGFyYW1ldGVyIGluIHRpdGlsZXIgaXMgYGJhbmRzYCBmb3IgbGFuZHNhdC9zZW50aW5lbCBhbmQgYGJpZHhgIGZvciBDT0dcbiAgICAvLyBHREFML1Jhc3RlcmlvL3Jpby10aWxlciBzdGFydCBiYW5kIGluZGV4aW5nIGF0IG9uZVxuICAgIC8vIG9sZGVyIHRpdGlsZXIgdmVyc2lvbnNcbiAgICB1cmxQYXJhbXMuYXBwZW5kKCdiaWR4JywgYmFuZEluZGV4ZXMubWFwKHZhbCA9PiB2YWwgKyAxKS5qb2luKCcsJykpO1xuICB9XG5cbiAgcmV0dXJuIHVybFBhcmFtcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpbmdsZUNPR1VybFBhcmFtcyhvcHRpb25zOiB7XG4gIHN0YWM6IENvbXBsZXRlU1RBQ0l0ZW07XG4gIGxvYWRBc3NldElkOiBzdHJpbmc7XG4gIGxvYWRCYW5kSW5kZXhlczogQmFuZEluZGV4ZXM7XG4gIG1hc2s/OiBib29sZWFuO1xufSk6IFVSTFNlYXJjaFBhcmFtcyB8IG51bGwge1xuICBjb25zdCB7c3RhYywgbG9hZEFzc2V0SWQsIGxvYWRCYW5kSW5kZXhlcywgbWFzayA9IGZhbHNlfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHVybCA9IHN0YWMuYXNzZXRzW2xvYWRBc3NldElkXS5ocmVmO1xuXG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICByZXR1cm5fbWFzazogU3RyaW5nKG1hc2spLFxuICAgIHVybFxuICB9KTtcbiAgcmV0dXJuIGJhbmRJbmRleGVzVG9VUkxQYXJhbXMoXG4gICAgdXJsUGFyYW1zLFxuICAgIGxvYWRCYW5kSW5kZXhlcyxcbiAgICBCb29sZWFuKFxuICAgICAgc3RhYy5yYXN0ZXJTZXJ2ZXJVc2VMYXRlc3RUaXRpbGVyID8/IGdldEFwcGxpY2F0aW9uQ29uZmlnKCkucmFzdGVyU2VydmVyVXNlTGF0ZXN0VGl0aWxlclxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgZnVsbCBVUkwgdG8gbG9hZCB0aWxlIGZyb20gYSBUaXRpbGVyLWJhc2VkIGJhY2tlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRpdGlsZXJVcmwob3B0aW9uczoge1xuICBzdGFjOiBHZXRUaWxlRGF0YVByb3BzWydzdGFjJ107XG4gIHVzZVNUQUNTZWFyY2hpbmc6IGJvb2xlYW47XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG59KToge3VybDogc3RyaW5nOyByYXN0ZXJTZXJ2ZXJVcmw6IHN0cmluZ30ge1xuICAvLyBtYXNrIFNldCB0byBmYWxzZSBmb3IgbW9zYWljcyBiZWNhdXNlIGVudGlyZSBpbWFnZSBpcyBhc3N1bWVkIHRvIGJlIHZhbGlkXG4gIGNvbnN0IHtzdGFjLCB1c2VTVEFDU2VhcmNoaW5nLCB4LCB5LCB6fSA9IG9wdGlvbnM7XG5cbiAgaWYgKCFzdGFjLnJhc3RlclRpbGVTZXJ2ZXJVcmxzPy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJhc3RlciB0aWxlIHNlcnZlcnMnKTtcbiAgfVxuXG4gIGNvbnN0IHBhdGhTdGVtID0gZ2V0VGl0aWxlclBhdGhNYXBwaW5nKHN0YWMsIHVzZVNUQUNTZWFyY2hpbmcpO1xuICBjb25zdCBzY2FsZSA9IFRJTEVfU0laRSA9PT0gNTEyID8gJ0AyeCcgOiAnJztcbiAgY29uc3QgZG9tYWluID0gY2hvb3NlRG9tYWluKHN0YWMucmFzdGVyVGlsZVNlcnZlclVybHMsIHgsIHkpO1xuICByZXR1cm4ge1xuICAgIHVybDogYCR7ZG9tYWlufS8ke3BhdGhTdGVtfS90aWxlcy9XZWJNZXJjYXRvclF1YWQvJHt6fS8ke3h9LyR7eX0ke3NjYWxlfS5ucHlgLFxuICAgIHJhc3RlclNlcnZlclVybDogZG9tYWluXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaXRpbGVyUGF0aE1hcHBpbmcoXG4gIHN0YWM6IEdldFRpbGVEYXRhUHJvcHNbJ3N0YWMnXSxcbiAgdXNlU1RBQ1NlYXJjaGluZyA9IGZhbHNlXG4pOiBzdHJpbmcge1xuICBpZiAodXNlU1RBQ1NlYXJjaGluZykge1xuICAgIHJldHVybiAnc3RhYy9tb3NhaWMnO1xuICB9XG5cbiAgcmV0dXJuICdjb2cnO1xufVxuXG4vKipcbiAqIENob29zZSBmcm9tIGF2YWlsYWJsZSBkb21haW5zIHRvIGxvYWQgaW1hZ2VzIGZyb21cbiAqXG4gKiBAcGFyYW0geCAgeCB0aWxlIGluZGV4XG4gKiBAcGFyYW0geSAgeSB0aWxlIGluZGV4XG4gKlxuICogQHJldHVybiBkb21haW5cbiAqL1xuZnVuY3Rpb24gY2hvb3NlRG9tYWluKGRvbWFpbnM6IHN0cmluZ1tdLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGluZGV4ID0gTWF0aC5hYnMoeCArIHkpICUgZG9tYWlucy5sZW5ndGg7XG4gIHJldHVybiBkb21haW5zW2luZGV4XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRlcnJhaW5VcmwoXG4gIHJhc3RlclRpbGVTZXJ2ZXJVcmxzOiBzdHJpbmdbXSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIHo6IG51bWJlcixcbiAgbWVzaE1heEVycm9yOiBudW1iZXJcbik6IHt1cmw6IHN0cmluZzsgcmFzdGVyU2VydmVyVXJsOiBzdHJpbmd9IHtcbiAgY29uc3Qgc2NhbGUgPSBUSUxFX1NJWkUgPT09IDUxMiA/ICdAMngnIDogJyc7XG5cbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgdXJsOiAndGVycmFyaXVtJyxcbiAgICBtZXNoX21heF9lcnJvcjogbWVzaE1heEVycm9yLnRvRml4ZWQoMilcbiAgfSk7XG4gIGNvbnN0IGRvbWFpbiA9IGNob29zZURvbWFpbihyYXN0ZXJUaWxlU2VydmVyVXJscywgeCwgeSk7XG4gIGNvbnN0IGJhc2VVcmwgPSBgJHtkb21haW59L21lc2gvdGlsZXMvJHt6fS8ke3h9LyR7eX0ke3NjYWxlfS50ZXJyYWluP2A7XG4gIHJldHVybiB7dXJsOiBiYXNlVXJsICsgcGFyYW1zLnRvU3RyaW5nKCksIHJhc3RlclNlcnZlclVybDogZG9tYWlufTtcbn1cblxuLyoqXG4gKiBnZXQgbWVzaCBtYXggZXJyb3IgZm9yIHogdmFsdWVcbiAqIEBwYXJhbSB6IG1lcmNhdG9yIHRpbGUgeiBjb29yZFxuICogQHBhcmFtIG11bHRpcGxpZXIgbXVsdGlwbGVyIGFwcGxpZWQgdG8gZGVmYXVsdCBlcnJvclxuICpcbiAqIFVzZXMgc3VnZ2VzdGlvbiBmcm9tIGhlcmVcbiAqIGh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9wdWxzZS9mYXN0LWNlc2l1bS10ZXJyYWluLXJlbmRlcmluZy1uZXctcXVhbnRpemVkLW1lc2gtb3V0cHV0LWFsdmFyby1odWFydGUvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZXNoTWF4RXJyb3IoejogbnVtYmVyLCBtdWx0aXBsaWVyOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gKDc3MDY3LjM0IC8gKDEgPDwgeikpICogbXVsdGlwbGllcjtcbn1cblxuZXhwb3J0IGNvbnN0IFJhc3RlckxheWVyUmVzb3VyY2VzID0ge1xuICByYXN0ZXJDb2xvck1hcDogKGNvbG9ybWFwSWQ6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBgJHtnZXRBcHBsaWNhdGlvbkNvbmZpZygpLmNkblVybH0vcmFzdGVyL2NvbG9ybWFwcy8ke2NvbG9ybWFwSWR9LnBuZ2A7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFPQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFU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