kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
335 lines (325 loc) • 51.3 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.addLayerToLayerOrder = addLayerToLayerOrder;
exports.areAnyDeckLayersLoading = areAnyDeckLayersLoading;
exports.bindLayerCallbacks = bindLayerCallbacks;
exports.calculateLayerData = calculateLayerData;
exports.computeDeckLayers = computeDeckLayers;
exports.findDefaultLayer = findDefaultLayer;
exports.getCustomDeckLayers = getCustomDeckLayers;
exports.getLayerHoverProp = getLayerHoverProp;
exports.getLayerHoverPropValue = getLayerHoverPropValue;
exports.getLayerOrderFromLayers = getLayerOrderFromLayers;
exports.isLayerRenderable = isLayerRenderable;
exports.isLayerVisible = isLayerVisible;
exports.prepareLayersForDeck = prepareLayersForDeck;
exports.prepareLayersToRender = prepareLayersToRender;
exports.renderDeckGlLayer = renderDeckGlLayer;
exports.reorderLayerOrder = reorderLayerOrder;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _console = _interopRequireDefault(require("global/console"));
var _constants = require("@kepler.gl/constants");
var _layers = require("@kepler.gl/layers");
var _utils = require("@kepler.gl/utils");
var _commonUtils = require("@kepler.gl/common-utils");
var _deckglLayers = require("@kepler.gl/deckgl-layers");
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; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
/**
* Find default layers from fields
*/
function findDefaultLayer(dataset, layerClasses) {
if (!dataset) {
return [];
}
var layerProps = Object.keys(layerClasses).reduce(function (previous, lc) {
var result = typeof layerClasses[lc].findDefaultLayerProps === 'function' ? layerClasses[lc].findDefaultLayerProps(dataset, previous) : {
props: []
};
var props = Array.isArray(result) ? result : result.props || [];
var foundLayers = result.foundLayers || previous;
return foundLayers.concat(props.map(function (p) {
return _objectSpread(_objectSpread({}, p), {}, {
type: lc,
dataId: dataset.id
}, lc === 'arc' || lc === 'line' ? {
isVisible: false
} : {});
}));
}, []);
// go through all layerProps to create layer
return layerProps.map(function (props) {
var layer = new layerClasses[props.type](props);
return typeof layer.setInitialLayerConfig === 'function' && dataset.dataContainer ? layer.setInitialLayerConfig(dataset) : layer;
});
}
/**
* Calculate layer data based on layer type, col Config,
* return updated layer if colorDomain, dataMap has changed.
* Also, returns updated layer in case the input layer was in invalid state.
* Adds an error message to the layer in case of an exception.
*/
function calculateLayerData(layer, state, oldLayerData) {
var layerData;
try {
// Make sure the layer updates data after an error
if (!layer.isValid) {
layer._oldDataUpdateTriggers = undefined;
}
if (!layer.type || !layer.hasAllColumns() || !layer.config.dataId) {
return {
layer: layer,
layerData: {}
};
}
layerData = layer.formatLayerData(state.datasets, oldLayerData);
// At this point the data for the layer is updated without errors
if (!layer.isValid) {
// Switch to visible after an error
layer = layer.updateLayerConfig({
isVisible: true
});
}
layer.isValid = true;
layer.errorMessage = null;
} catch (err) {
_console["default"].error(err);
layer = layer.updateLayerConfig({
isVisible: false
});
layer.isValid = false;
layer.errorMessage = err instanceof Error && err.message ? err.message.substring(0, 100) : 'Unknown error';
layerData = {};
}
return {
layer: layer,
layerData: layerData
};
}
/**
* Calculate props passed to LayerHoverInfo
*/
function getLayerHoverProp(_ref) {
var animationConfig = _ref.animationConfig,
interactionConfig = _ref.interactionConfig,
hoverInfo = _ref.hoverInfo,
layers = _ref.layers,
layersToRender = _ref.layersToRender,
datasets = _ref.datasets;
if (interactionConfig.tooltip.enabled && hoverInfo && hoverInfo.picked) {
// if anything hovered
var object = hoverInfo.object,
overlay = hoverInfo.layer;
// deckgl layer to kepler-gl layer
var layer = layers[overlay.props.idx];
// NOTE: for binary format GeojsonLayer, deck will return object=null but hoverInfo.index >= 0
if ((object || hoverInfo.index >= 0) && layer && layer.getHoverData && layersToRender[layer.id]) {
// if layer is visible and have hovered data
var dataId = layer.config.dataId;
if (!dataId) {
return null;
}
var _datasets$dataId = datasets[dataId],
dataContainer = _datasets$dataId.dataContainer,
fields = _datasets$dataId.fields;
var data = layer.getHoverData(object || hoverInfo.index, dataContainer, fields, animationConfig, hoverInfo);
if (!data) {
return null;
}
var fieldsToShow = interactionConfig.tooltip.config.fieldsToShow[dataId];
return {
data: data,
fields: fields,
fieldsToShow: fieldsToShow,
layer: layer,
currentTime: animationConfig.currentTime
};
}
}
return null;
}
function renderDeckGlLayer(props, layerCallbacks) {
var datasets = props.datasets,
layer = props.layer,
layerIndex = props.layerIndex,
data = props.data,
hoverInfo = props.hoverInfo,
clicked = props.clicked,
mapState = props.mapState,
interactionConfig = props.interactionConfig,
animationConfig = props.animationConfig,
mapLayers = props.mapLayers,
experimentalContext = props.experimentalContext;
var dataset = datasets[layer.config.dataId];
var _ref2 = dataset || {},
gpuFilter = _ref2.gpuFilter;
var objectHovered = clicked || hoverInfo;
var visible = !mapLayers || mapLayers && mapLayers[layer.id];
// Layer is Layer class
return layer.renderLayer({
data: data,
gpuFilter: gpuFilter,
idx: layerIndex,
interactionConfig: interactionConfig,
layerCallbacks: layerCallbacks,
mapState: mapState,
animationConfig: animationConfig,
objectHovered: objectHovered,
visible: visible,
dataset: dataset,
experimentalContext: experimentalContext
});
}
function isLayerRenderable(layer, layerData) {
return layer.id !== _constants.GEOCODER_LAYER_ID && layer.shouldRenderLayer(layerData);
}
function isLayerVisible(layer, mapLayers) {
return layer.config.isVisible && (
// if layer.id is not in mapLayers, don't render it
!mapLayers || mapLayers && mapLayers[layer.id]);
}
// Prepare a dict of layers rendered by the deck.gl
// Note, isVisible: false layer is passed to deck.gl here
// return {[id]: true \ false}
function prepareLayersForDeck(layers, layerData) {
return layers.reduce(function (accu, layer, idx) {
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.id, isLayerRenderable(layer, layerData[idx]) && layer.overlayType === _layers.OVERLAY_TYPE_CONST.deckgl));
}, {});
}
// Prepare a dict of rendered layers rendered in the map
// This includes only the visibile layers for single map view and split map view
// return {[id]: true \ false}
function prepareLayersToRender(layers, layerData, mapLayers) {
return layers.reduce(function (accu, layer, idx) {
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.id, isLayerRenderable(layer, layerData[idx]) && isLayerVisible(layer, mapLayers)));
}, {});
}
function getCustomDeckLayers(deckGlProps) {
var bottomDeckLayers = Array.isArray(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers : (0, _utils.isFunction)(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers() : [];
var topDeckLayers = Array.isArray(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers : (0, _utils.isFunction)(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers() : [];
return [bottomDeckLayers, topDeckLayers];
}
function bindLayerCallbacks() {
var layerCallbacks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var idx = arguments.length > 1 ? arguments[1] : undefined;
return Object.keys(layerCallbacks).reduce(function (accu, key) {
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, function (val) {
return layerCallbacks[key](idx, val);
}));
}, {});
}
// eslint-disable-next-line complexity
function computeDeckLayers(_ref3, options, layerCallbacks, deckGlProps) {
var visState = _ref3.visState,
mapState = _ref3.mapState,
mapStyle = _ref3.mapStyle;
var datasets = visState.datasets,
effects = visState.effects,
layers = visState.layers,
layerOrder = visState.layerOrder,
layerData = visState.layerData,
hoverInfo = visState.hoverInfo,
clicked = visState.clicked,
interactionConfig = visState.interactionConfig,
animationConfig = visState.animationConfig,
splitMaps = visState.splitMaps;
var _ref4 = options || {},
mapIndex = _ref4.mapIndex,
mapboxApiAccessToken = _ref4.mapboxApiAccessToken,
mapboxApiUrl = _ref4.mapboxApiUrl,
primaryMap = _ref4.primaryMap,
layersForDeck = _ref4.layersForDeck,
editorInfo = _ref4.editorInfo;
var dataLayers = [];
var hasShadowEffect = effects.some(function (effect) {
return effect.type === _constants.LIGHT_AND_SHADOW_EFFECT.type;
});
if (layerData && layerData.length) {
var mapLayers = (0, _utils.getMapLayersFromSplitMaps)(splitMaps, mapIndex || 0);
var currentLayersForDeck = layersForDeck || prepareLayersForDeck(layers, layerData);
dataLayers = layerOrder.slice().reverse().filter(function (id) {
return currentLayersForDeck[id];
}).reduce(function (overlays, layerId) {
var layerIndex = layers.findIndex(function (_ref5) {
var id = _ref5.id;
return id === layerId;
});
var bindedLayerCallbacks = layerCallbacks ? bindLayerCallbacks(layerCallbacks, layerIndex) : {};
var layer = layers[layerIndex];
var data = layerData[layerIndex];
var layerOverlay = renderDeckGlLayer({
datasets: datasets,
layer: layer,
layerIndex: layerIndex,
data: data,
hoverInfo: hoverInfo,
clicked: clicked,
mapState: mapState,
interactionConfig: interactionConfig,
animationConfig: animationConfig,
mapLayers: mapLayers,
experimentalContext: {
hasShadowEffect: hasShadowEffect
}
}, bindedLayerCallbacks);
return overlays.concat(layerOverlay || []);
}, []);
}
if (!primaryMap) {
return dataLayers;
}
if (mapStyle !== null && mapStyle !== void 0 && mapStyle.visibleLayerGroups['3d building'] && primaryMap && mapboxApiAccessToken && mapboxApiUrl) {
dataLayers.push(new _deckglLayers.ThreeDBuildingLayer({
id: '_keplergl_3d-building',
mapboxApiAccessToken: mapboxApiAccessToken,
mapboxApiUrl: mapboxApiUrl,
threeDBuildingColor: mapStyle.threeDBuildingColor,
updateTriggers: {
getFillColor: mapStyle.threeDBuildingColor
}
}));
}
var _getCustomDeckLayers = getCustomDeckLayers(deckGlProps),
_getCustomDeckLayers2 = (0, _slicedToArray2["default"])(_getCustomDeckLayers, 2),
customBottomDeckLayers = _getCustomDeckLayers2[0],
customTopDeckLayers = _getCustomDeckLayers2[1];
var editorLayer = [];
if (editorInfo) {
editorLayer.push((0, _layers.getEditorLayer)(_objectSpread({}, editorInfo)));
}
return [].concat((0, _toConsumableArray2["default"])(customBottomDeckLayers), (0, _toConsumableArray2["default"])(dataLayers), (0, _toConsumableArray2["default"])(customTopDeckLayers), editorLayer);
}
function getLayerOrderFromLayers(layers) {
return layers.map(function (_ref6) {
var id = _ref6.id;
return id;
});
}
function reorderLayerOrder(layerOrder, originLayerId, destinationLayerId) {
var activeIndex = layerOrder.indexOf(originLayerId);
var overIndex = layerOrder.indexOf(destinationLayerId);
return (0, _commonUtils.arrayMove)(layerOrder, activeIndex, overIndex);
}
function addLayerToLayerOrder(layerOrder, layerId) {
return [layerId].concat((0, _toConsumableArray2["default"])(layerOrder));
}
function getLayerHoverPropValue(data, fieldIndex) {
if (!data) return undefined;
if (data instanceof _utils.DataRow) return data.valueAt(fieldIndex);
return data[fieldIndex];
}
/** Checks if any Deck layers are in the process of loading. */
function areAnyDeckLayersLoading(layers) {
return layers.some(
// layer.isLoaded changes frequently in Deck (even on hover) so we check additional properties
function (layer) {
return layer.internalState && !layer.isLoaded;
});
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc29sZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2NvbnN0YW50cyIsIl9sYXllcnMiLCJfdXRpbHMiLCJfY29tbW9uVXRpbHMiLCJfZGVja2dsTGF5ZXJzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJmaW5kRGVmYXVsdExheWVyIiwiZGF0YXNldCIsImxheWVyQ2xhc3NlcyIsImxheWVyUHJvcHMiLCJyZWR1Y2UiLCJwcmV2aW91cyIsImxjIiwicmVzdWx0IiwiZmluZERlZmF1bHRMYXllclByb3BzIiwicHJvcHMiLCJBcnJheSIsImlzQXJyYXkiLCJmb3VuZExheWVycyIsImNvbmNhdCIsIm1hcCIsInAiLCJ0eXBlIiwiZGF0YUlkIiwiaWQiLCJpc1Zpc2libGUiLCJsYXllciIsInNldEluaXRpYWxMYXllckNvbmZpZyIsImRhdGFDb250YWluZXIiLCJjYWxjdWxhdGVMYXllckRhdGEiLCJzdGF0ZSIsIm9sZExheWVyRGF0YSIsImxheWVyRGF0YSIsImlzVmFsaWQiLCJfb2xkRGF0YVVwZGF0ZVRyaWdnZXJzIiwidW5kZWZpbmVkIiwiaGFzQWxsQ29sdW1ucyIsImNvbmZpZyIsImZvcm1hdExheWVyRGF0YSIsImRhdGFzZXRzIiwidXBkYXRlTGF5ZXJDb25maWciLCJlcnJvck1lc3NhZ2UiLCJlcnIiLCJDb25zb2xlIiwiZXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJzdWJzdHJpbmciLCJnZXRMYXllckhvdmVyUHJvcCIsIl9yZWYiLCJhbmltYXRpb25Db25maWciLCJpbnRlcmFjdGlvbkNvbmZpZyIsImhvdmVySW5mbyIsImxheWVycyIsImxheWVyc1RvUmVuZGVyIiwidG9vbHRpcCIsImVuYWJsZWQiLCJwaWNrZWQiLCJvYmplY3QiLCJvdmVybGF5IiwiaWR4IiwiaW5kZXgiLCJnZXRIb3ZlckRhdGEiLCJfZGF0YXNldHMkZGF0YUlkIiwiZmllbGRzIiwiZGF0YSIsImZpZWxkc1RvU2hvdyIsImN1cnJlbnRUaW1lIiwicmVuZGVyRGVja0dsTGF5ZXIiLCJsYXllckNhbGxiYWNrcyIsImxheWVySW5kZXgiLCJjbGlja2VkIiwibWFwU3RhdGUiLCJtYXBMYXllcnMiLCJleHBlcmltZW50YWxDb250ZXh0IiwiX3JlZjIiLCJncHVGaWx0ZXIiLCJvYmplY3RIb3ZlcmVkIiwidmlzaWJsZSIsInJlbmRlckxheWVyIiwiaXNMYXllclJlbmRlcmFibGUiLCJHRU9DT0RFUl9MQVlFUl9JRCIsInNob3VsZFJlbmRlckxheWVyIiwiaXNMYXllclZpc2libGUiLCJwcmVwYXJlTGF5ZXJzRm9yRGVjayIsImFjY3UiLCJvdmVybGF5VHlwZSIsIk9WRVJMQVlfVFlQRV9DT05TVCIsImRlY2tnbCIsInByZXBhcmVMYXllcnNUb1JlbmRlciIsImdldEN1c3RvbURlY2tMYXllcnMiLCJkZWNrR2xQcm9wcyIsImJvdHRvbURlY2tMYXllcnMiLCJpc0Z1bmN0aW9uIiwidG9wRGVja0xheWVycyIsInRvcExheWVycyIsImJpbmRMYXllckNhbGxiYWNrcyIsImtleSIsInZhbCIsImNvbXB1dGVEZWNrTGF5ZXJzIiwiX3JlZjMiLCJvcHRpb25zIiwidmlzU3RhdGUiLCJtYXBTdHlsZSIsImVmZmVjdHMiLCJsYXllck9yZGVyIiwic3BsaXRNYXBzIiwiX3JlZjQiLCJtYXBJbmRleCIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwibWFwYm94QXBpVXJsIiwicHJpbWFyeU1hcCIsImxheWVyc0ZvckRlY2siLCJlZGl0b3JJbmZvIiwiZGF0YUxheWVycyIsImhhc1NoYWRvd0VmZmVjdCIsInNvbWUiLCJlZmZlY3QiLCJMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVCIsImdldE1hcExheWVyc0Zyb21TcGxpdE1hcHMiLCJjdXJyZW50TGF5ZXJzRm9yRGVjayIsInNsaWNlIiwicmV2ZXJzZSIsIm92ZXJsYXlzIiwibGF5ZXJJZCIsImZpbmRJbmRleCIsIl9yZWY1IiwiYmluZGVkTGF5ZXJDYWxsYmFja3MiLCJsYXllck92ZXJsYXkiLCJ2aXNpYmxlTGF5ZXJHcm91cHMiLCJUaHJlZURCdWlsZGluZ0xheWVyIiwidGhyZWVEQnVpbGRpbmdDb2xvciIsInVwZGF0ZVRyaWdnZXJzIiwiZ2V0RmlsbENvbG9yIiwiX2dldEN1c3RvbURlY2tMYXllcnMiLCJfZ2V0Q3VzdG9tRGVja0xheWVyczIiLCJfc2xpY2VkVG9BcnJheTIiLCJjdXN0b21Cb3R0b21EZWNrTGF5ZXJzIiwiY3VzdG9tVG9wRGVja0xheWVycyIsImVkaXRvckxheWVyIiwiZ2V0RWRpdG9yTGF5ZXIiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMiLCJfcmVmNiIsInJlb3JkZXJMYXllck9yZGVyIiwib3JpZ2luTGF5ZXJJZCIsImRlc3RpbmF0aW9uTGF5ZXJJZCIsImFjdGl2ZUluZGV4IiwiaW5kZXhPZiIsIm92ZXJJbmRleCIsImFycmF5TW92ZSIsImFkZExheWVyVG9MYXllck9yZGVyIiwiZ2V0TGF5ZXJIb3ZlclByb3BWYWx1ZSIsImZpZWxkSW5kZXgiLCJEYXRhUm93IiwidmFsdWVBdCIsImFyZUFueURlY2tMYXllcnNMb2FkaW5nIiwiaW50ZXJuYWxTdGF0ZSIsImlzTG9hZGVkIl0sInNvdXJjZXMiOlsiLi4vc3JjL2xheWVyLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBDb25zb2xlIGZyb20gJ2dsb2JhbC9jb25zb2xlJztcblxuaW1wb3J0IHtHRU9DT0RFUl9MQVlFUl9JRCwgTElHSFRfQU5EX1NIQURPV19FRkZFQ1R9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7TGF5ZXIgYXMgRGVja0xheWVyLCBMYXllclByb3BzIGFzIERlY2tMYXllclByb3BzfSBmcm9tICdAZGVjay5nbC9jb3JlL3R5cGVkJztcbmltcG9ydCB7XG4gIEZpZWxkLFxuICBUb29sdGlwRmllbGQsXG4gIENvbXBhcmVUeXBlLFxuICBTcGxpdE1hcExheWVycyxcbiAgRWRpdG9yLFxuICBGZWF0dXJlLFxuICBGZWF0dXJlU2VsZWN0aW9uQ29udGV4dCxcbiAgQmluZGVkTGF5ZXJDYWxsYmFja3MsXG4gIExheWVyQ2FsbGJhY2tzLFxuICBWaWV3cG9ydFxufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7XG4gIEZpbmREZWZhdWx0TGF5ZXJQcm9wc1JldHVyblZhbHVlLFxuICBGaW5kRGVmYXVsdExheWVyUHJvcHMsXG4gIExheWVyLFxuICBMYXllckNsYXNzZXNUeXBlLFxuICBPVkVSTEFZX1RZUEVfQ09OU1QsXG4gIGdldEVkaXRvckxheWVyXG59IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcblxuaW1wb3J0IEtlcGxlclRhYmxlIGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtWaXNTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC9zY2hlbWFzJztcbmltcG9ydCB7aXNGdW5jdGlvbiwgZ2V0TWFwTGF5ZXJzRnJvbVNwbGl0TWFwcywgRGF0YVJvd30gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge2FycmF5TW92ZX0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuXG5pbXBvcnQge1RocmVlREJ1aWxkaW5nTGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvZGVja2dsLWxheWVycyc7XG5cbmV4cG9ydCB0eXBlIExheWVyc1RvUmVuZGVyID0ge1xuICBbbGF5ZXJJZDogc3RyaW5nXTogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uTGF5ZXJIb3ZlckRhdGEgPSB7XG4gIHBvaW50czogYW55W107XG4gIGNvbG9yVmFsdWU/OiBhbnk7XG4gIGVsZXZhdGlvblZhbHVlPzogYW55O1xuICBhZ2dyZWdhdGVkRGF0YT86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgbWVhc3VyZTogc3RyaW5nO1xuICAgICAgdmFsdWU/OiBhbnk7XG4gICAgfVxuICA+O1xufTtcblxuZXhwb3J0IHR5cGUgTGF5ZXJIb3ZlclByb3AgPSB7XG4gIGRhdGE6IERhdGFSb3cgfCBBZ2dyZWdhdGlvbkxheWVySG92ZXJEYXRhIHwgbnVsbDtcbiAgZmllbGRzOiBGaWVsZFtdO1xuICBmaWVsZHNUb1Nob3c6IFRvb2x0aXBGaWVsZFtdO1xuICBsYXllcjogTGF5ZXI7XG4gIHByaW1hcnlEYXRhPzogRGF0YVJvdyB8IEFnZ3JlZ2F0aW9uTGF5ZXJIb3ZlckRhdGEgfCBudWxsO1xuICBjb21wYXJlVHlwZT86IENvbXBhcmVUeXBlO1xuICBjdXJyZW50VGltZT86IFZpc1N0YXRlWydhbmltYXRpb25Db25maWcnXVsnY3VycmVudFRpbWUnXTtcbn07XG5cbi8qKlxuICogRmluZCBkZWZhdWx0IGxheWVycyBmcm9tIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZERlZmF1bHRMYXllcihkYXRhc2V0OiBLZXBsZXJUYWJsZSwgbGF5ZXJDbGFzc2VzOiBMYXllckNsYXNzZXNUeXBlKTogTGF5ZXJbXSB7XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGxheWVyUHJvcHMgPSAoT2JqZWN0LmtleXMobGF5ZXJDbGFzc2VzKSBhcyBBcnJheTxrZXlvZiBMYXllckNsYXNzZXNUeXBlPikucmVkdWNlKFxuICAgIChwcmV2aW91cywgbGMpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdDogRmluZERlZmF1bHRMYXllclByb3BzUmV0dXJuVmFsdWUgPVxuICAgICAgICB0eXBlb2YgbGF5ZXJDbGFzc2VzW2xjXS5maW5kRGVmYXVsdExheWVyUHJvcHMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IGxheWVyQ2xhc3Nlc1tsY10uZmluZERlZmF1bHRMYXllclByb3BzKGRhdGFzZXQsIHByZXZpb3VzKVxuICAgICAgICAgIDoge3Byb3BzOiBbXX07XG5cbiAgICAgIGNvbnN0IHByb3BzID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogcmVzdWx0LnByb3BzIHx8IFtdO1xuICAgICAgY29uc3QgZm91bmRMYXllcnMgPSByZXN1bHQuZm91bmRMYXllcnMgfHwgcHJldmlvdXM7XG5cbiAgICAgIHJldHVybiBmb3VuZExheWVycy5jb25jYXQoXG4gICAgICAgIHByb3BzLm1hcChwID0+ICh7XG4gICAgICAgICAgLi4ucCxcbiAgICAgICAgICB0eXBlOiBsYyxcbiAgICAgICAgICBkYXRhSWQ6IGRhdGFzZXQuaWQsXG4gICAgICAgICAgLy8gc2V0IGFyYyBsYXllciBpbml0aWFsIHZpc2libGl0eSB0byBmYWxzZSwgYmVjYXVzZSBhcmNzIHRlbmQgdG8gYmUgdG9vIG11c3lcbiAgICAgICAgICAuLi4obGMgPT09ICdhcmMnIHx8IGxjID09PSAnbGluZScgPyB7aXNWaXNpYmxlOiBmYWxzZX0gOiB7fSlcbiAgICAgICAgfSkpXG4gICAgICApO1xuICAgIH0sXG4gICAgW10gYXMgKEZpbmREZWZhdWx0TGF5ZXJQcm9wcyAmIHt0eXBlOiBzdHJpbmd9KVtdXG4gICk7XG5cbiAgLy8gZ28gdGhyb3VnaCBhbGwgbGF5ZXJQcm9wcyB0byBjcmVhdGUgbGF5ZXJcbiAgcmV0dXJuIGxheWVyUHJvcHMubWFwKHByb3BzID0+IHtcbiAgICBjb25zdCBsYXllciA9IG5ldyBsYXllckNsYXNzZXNbcHJvcHMudHlwZV0ocHJvcHMpO1xuICAgIHJldHVybiB0eXBlb2YgbGF5ZXIuc2V0SW5pdGlhbExheWVyQ29uZmlnID09PSAnZnVuY3Rpb24nICYmIGRhdGFzZXQuZGF0YUNvbnRhaW5lclxuICAgICAgPyBsYXllci5zZXRJbml0aWFsTGF5ZXJDb25maWcoZGF0YXNldClcbiAgICAgIDogbGF5ZXI7XG4gIH0pO1xufVxuXG50eXBlIE1pblZpc1N0YXRlRm9yTGF5ZXJEYXRhID0ge1xuICBkYXRhc2V0czogVmlzU3RhdGVbJ2RhdGFzZXRzJ107XG4gIGFuaW1hdGlvbkNvbmZpZzogVmlzU3RhdGVbJ2FuaW1hdGlvbkNvbmZpZyddO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgbGF5ZXIgZGF0YSBiYXNlZCBvbiBsYXllciB0eXBlLCBjb2wgQ29uZmlnLFxuICogcmV0dXJuIHVwZGF0ZWQgbGF5ZXIgaWYgY29sb3JEb21haW4sIGRhdGFNYXAgaGFzIGNoYW5nZWQuXG4gKiBBbHNvLCByZXR1cm5zIHVwZGF0ZWQgbGF5ZXIgaW4gY2FzZSB0aGUgaW5wdXQgbGF5ZXIgd2FzIGluIGludmFsaWQgc3RhdGUuXG4gKiBBZGRzIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGxheWVyIGluIGNhc2Ugb2YgYW4gZXhjZXB0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlTGF5ZXJEYXRhPFMgZXh0ZW5kcyBNaW5WaXNTdGF0ZUZvckxheWVyRGF0YT4oXG4gIGxheWVyOiBMYXllcixcbiAgc3RhdGU6IFMsXG4gIG9sZExheWVyRGF0YT86IGFueVxuKToge1xuICBsYXllckRhdGE6IGFueTtcbiAgbGF5ZXI6IExheWVyO1xufSB7XG4gIGxldCBsYXllckRhdGE7XG4gIHRyeSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBsYXllciB1cGRhdGVzIGRhdGEgYWZ0ZXIgYW4gZXJyb3JcbiAgICBpZiAoIWxheWVyLmlzVmFsaWQpIHtcbiAgICAgIGxheWVyLl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFsYXllci50eXBlIHx8ICFsYXllci5oYXNBbGxDb2x1bW5zKCkgfHwgIWxheWVyLmNvbmZpZy5kYXRhSWQpIHtcbiAgICAgIHJldHVybiB7bGF5ZXIsIGxheWVyRGF0YToge319O1xuICAgIH1cblxuICAgIGxheWVyRGF0YSA9IGxheWVyLmZvcm1hdExheWVyRGF0YShzdGF0ZS5kYXRhc2V0cywgb2xkTGF5ZXJEYXRhKTtcblxuICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIGRhdGEgZm9yIHRoZSBsYXllciBpcyB1cGRhdGVkIHdpdGhvdXQgZXJyb3JzXG4gICAgaWYgKCFsYXllci5pc1ZhbGlkKSB7XG4gICAgICAvLyBTd2l0Y2ggdG8gdmlzaWJsZSBhZnRlciBhbiBlcnJvclxuICAgICAgbGF5ZXIgPSBsYXllci51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICAgIGlzVmlzaWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGxheWVyLmlzVmFsaWQgPSB0cnVlO1xuICAgIGxheWVyLmVycm9yTWVzc2FnZSA9IG51bGw7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIENvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICBsYXllciA9IGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgIGlzVmlzaWJsZTogZmFsc2VcbiAgICB9KTtcbiAgICBsYXllci5pc1ZhbGlkID0gZmFsc2U7XG5cbiAgICBsYXllci5lcnJvck1lc3NhZ2UgPVxuICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyLm1lc3NhZ2UgPyBlcnIubWVzc2FnZS5zdWJzdHJpbmcoMCwgMTAwKSA6ICdVbmtub3duIGVycm9yJztcblxuICAgIGxheWVyRGF0YSA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBsYXllcixcbiAgICBsYXllckRhdGFcbiAgfTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgcHJvcHMgcGFzc2VkIHRvIExheWVySG92ZXJJbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXllckhvdmVyUHJvcCh7XG4gIGFuaW1hdGlvbkNvbmZpZyxcbiAgaW50ZXJhY3Rpb25Db25maWcsXG4gIGhvdmVySW5mbyxcbiAgbGF5ZXJzLFxuICBsYXllcnNUb1JlbmRlcixcbiAgZGF0YXNldHNcbn06IHtcbiAgaW50ZXJhY3Rpb25Db25maWc6IFZpc1N0YXRlWydpbnRlcmFjdGlvbkNvbmZpZyddO1xuICBhbmltYXRpb25Db25maWc6IFZpc1N0YXRlWydhbmltYXRpb25Db25maWcnXTtcbiAgaG92ZXJJbmZvOiBWaXNTdGF0ZVsnaG92ZXJJbmZvJ107XG4gIGxheWVyczogVmlzU3RhdGVbJ2xheWVycyddO1xuICBsYXllcnNUb1JlbmRlcjogTGF5ZXJzVG9SZW5kZXI7XG4gIGRhdGFzZXRzOiBWaXNTdGF0ZVsnZGF0YXNldHMnXTtcbn0pOiBMYXllckhvdmVyUHJvcCB8IG51bGwge1xuICBpZiAoaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcC5lbmFibGVkICYmIGhvdmVySW5mbyAmJiBob3ZlckluZm8ucGlja2VkKSB7XG4gICAgLy8gaWYgYW55dGhpbmcgaG92ZXJlZFxuICAgIGNvbnN0IHtvYmplY3QsIGxheWVyOiBvdmVybGF5fSA9IGhvdmVySW5mbztcblxuICAgIC8vIGRlY2tnbCBsYXllciB0byBrZXBsZXItZ2wgbGF5ZXJcbiAgICBjb25zdCBsYXllciA9IGxheWVyc1tvdmVybGF5LnByb3BzLmlkeF07XG5cbiAgICAvLyBOT1RFOiBmb3IgYmluYXJ5IGZvcm1hdCBHZW9qc29uTGF5ZXIsIGRlY2sgd2lsbCByZXR1cm4gb2JqZWN0PW51bGwgYnV0IGhvdmVySW5mby5pbmRleCA+PSAwXG4gICAgaWYgKFxuICAgICAgKG9iamVjdCB8fCBob3ZlckluZm8uaW5kZXggPj0gMCkgJiZcbiAgICAgIGxheWVyICYmXG4gICAgICBsYXllci5nZXRIb3ZlckRhdGEgJiZcbiAgICAgIGxheWVyc1RvUmVuZGVyW2xheWVyLmlkXVxuICAgICkge1xuICAgICAgLy8gaWYgbGF5ZXIgaXMgdmlzaWJsZSBhbmQgaGF2ZSBob3ZlcmVkIGRhdGFcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY29uZmlnOiB7ZGF0YUlkfVxuICAgICAgfSA9IGxheWVyO1xuICAgICAgaWYgKCFkYXRhSWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB7ZGF0YUNvbnRhaW5lciwgZmllbGRzfSA9IGRhdGFzZXRzW2RhdGFJZF07XG4gICAgICBjb25zdCBkYXRhOiBEYXRhUm93IHwgbnVsbCA9IGxheWVyLmdldEhvdmVyRGF0YShcbiAgICAgICAgb2JqZWN0IHx8IGhvdmVySW5mby5pbmRleCxcbiAgICAgICAgZGF0YUNvbnRhaW5lcixcbiAgICAgICAgZmllbGRzLFxuICAgICAgICBhbmltYXRpb25Db25maWcsXG4gICAgICAgIGhvdmVySW5mb1xuICAgICAgKTtcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpZWxkc1RvU2hvdyA9IGludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAuY29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhLFxuICAgICAgICBmaWVsZHMsXG4gICAgICAgIGZpZWxkc1RvU2hvdyxcbiAgICAgICAgbGF5ZXIsXG4gICAgICAgIGN1cnJlbnRUaW1lOiBhbmltYXRpb25Db25maWcuY3VycmVudFRpbWVcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJEZWNrR2xMYXllcihwcm9wczogYW55LCBsYXllckNhbGxiYWNrczoge1trZXk6IHN0cmluZ106IGFueX0pIHtcbiAgY29uc3Qge1xuICAgIGRhdGFzZXRzLFxuICAgIGxheWVyLFxuICAgIGxheWVySW5kZXgsXG4gICAgZGF0YSxcbiAgICBob3ZlckluZm8sXG4gICAgY2xpY2tlZCxcbiAgICBtYXBTdGF0ZSxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZyxcbiAgICBhbmltYXRpb25Db25maWcsXG4gICAgbWFwTGF5ZXJzLFxuICAgIGV4cGVyaW1lbnRhbENvbnRleHRcbiAgfSA9IHByb3BzO1xuICBjb25zdCBkYXRhc2V0ID0gZGF0YXNldHNbbGF5ZXIuY29uZmlnLmRhdGFJZF07XG4gIGNvbnN0IHtncHVGaWx0ZXJ9ID0gZGF0YXNldCB8fCB7fTtcbiAgY29uc3Qgb2JqZWN0SG92ZXJlZCA9IGNsaWNrZWQgfHwgaG92ZXJJbmZvO1xuICBjb25zdCB2aXNpYmxlID0gIW1hcExheWVycyB8fCAobWFwTGF5ZXJzICYmIG1hcExheWVyc1tsYXllci5pZF0pO1xuICAvLyBMYXllciBpcyBMYXllciBjbGFzc1xuICByZXR1cm4gbGF5ZXIucmVuZGVyTGF5ZXIoe1xuICAgIGRhdGEsXG4gICAgZ3B1RmlsdGVyLFxuICAgIGlkeDogbGF5ZXJJbmRleCxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZyxcbiAgICBsYXllckNhbGxiYWNrcyxcbiAgICBtYXBTdGF0ZSxcbiAgICBhbmltYXRpb25Db25maWcsXG4gICAgb2JqZWN0SG92ZXJlZCxcbiAgICB2aXNpYmxlLFxuICAgIGRhdGFzZXQsXG4gICAgZXhwZXJpbWVudGFsQ29udGV4dFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTGF5ZXJSZW5kZXJhYmxlKGxheWVyOiBMYXllciwgbGF5ZXJEYXRhKSB7XG4gIHJldHVybiBsYXllci5pZCAhPT0gR0VPQ09ERVJfTEFZRVJfSUQgJiYgbGF5ZXIuc2hvdWxkUmVuZGVyTGF5ZXIobGF5ZXJEYXRhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTGF5ZXJWaXNpYmxlKGxheWVyLCBtYXBMYXllcnMpIHtcbiAgcmV0dXJuIChcbiAgICBsYXllci5jb25maWcuaXNWaXNpYmxlICYmXG4gICAgLy8gaWYgbGF5ZXIuaWQgaXMgbm90IGluIG1hcExheWVycywgZG9uJ3QgcmVuZGVyIGl0XG4gICAgKCFtYXBMYXllcnMgfHwgKG1hcExheWVycyAmJiBtYXBMYXllcnNbbGF5ZXIuaWRdKSlcbiAgKTtcbn1cblxuLy8gUHJlcGFyZSBhIGRpY3Qgb2YgbGF5ZXJzIHJlbmRlcmVkIGJ5IHRoZSBkZWNrLmdsXG4vLyBOb3RlLCBpc1Zpc2libGU6IGZhbHNlIGxheWVyIGlzIHBhc3NlZCB0byBkZWNrLmdsIGhlcmVcbi8vIHJldHVybiB7W2lkXTogdHJ1ZSBcXCBmYWxzZX1cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlTGF5ZXJzRm9yRGVjayhcbiAgbGF5ZXJzOiBMYXllcltdLFxuICBsYXllckRhdGE6IFZpc1N0YXRlWydsYXllckRhdGEnXVxuKToge1xuICBba2V5OiBzdHJpbmddOiBib29sZWFuO1xufSB7XG4gIHJldHVybiBsYXllcnMucmVkdWNlKFxuICAgIChhY2N1LCBsYXllciwgaWR4KSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIFtsYXllci5pZF06XG4gICAgICAgIGlzTGF5ZXJSZW5kZXJhYmxlKGxheWVyLCBsYXllckRhdGFbaWR4XSkgJiYgbGF5ZXIub3ZlcmxheVR5cGUgPT09IE9WRVJMQVlfVFlQRV9DT05TVC5kZWNrZ2xcbiAgICB9KSxcbiAgICB7fVxuICApO1xufVxuXG4vLyBQcmVwYXJlIGEgZGljdCBvZiByZW5kZXJlZCBsYXllcnMgcmVuZGVyZWQgaW4gdGhlIG1hcFxuLy8gVGhpcyBpbmNsdWRlcyBvbmx5IHRoZSB2aXNpYmlsZSBsYXllcnMgZm9yIHNpbmdsZSBtYXAgdmlldyBhbmQgc3BsaXQgbWFwIHZpZXdcbi8vIHJldHVybiB7W2lkXTogdHJ1ZSBcXCBmYWxzZX1cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlTGF5ZXJzVG9SZW5kZXIoXG4gIGxheWVyczogTGF5ZXJbXSxcbiAgbGF5ZXJEYXRhOiBWaXNTdGF0ZVsnbGF5ZXJEYXRhJ10sXG4gIG1hcExheWVycz86IFNwbGl0TWFwTGF5ZXJzIHwgdW5kZWZpbmVkIHwgbnVsbFxuKTogTGF5ZXJzVG9SZW5kZXIge1xuICByZXR1cm4gbGF5ZXJzLnJlZHVjZShcbiAgICAoYWNjdSwgbGF5ZXIsIGlkeCkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICBbbGF5ZXIuaWRdOiBpc0xheWVyUmVuZGVyYWJsZShsYXllciwgbGF5ZXJEYXRhW2lkeF0pICYmIGlzTGF5ZXJWaXNpYmxlKGxheWVyLCBtYXBMYXllcnMpXG4gICAgfSksXG4gICAge31cbiAgKTtcbn1cblxudHlwZSBDdXN0b21EZWNrTGF5ZXIgPSBEZWNrTGF5ZXI8RGVja0xheWVyUHJvcHM+O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VzdG9tRGVja0xheWVycyhkZWNrR2xQcm9wcz86IGFueSk6IFtDdXN0b21EZWNrTGF5ZXJbXSwgQ3VzdG9tRGVja0xheWVyW11dIHtcbiAgY29uc3QgYm90dG9tRGVja0xheWVycyA9IEFycmF5LmlzQXJyYXkoZGVja0dsUHJvcHM/LmxheWVycylcbiAgICA/IGRlY2tHbFByb3BzPy5sYXllcnNcbiAgICA6IGlzRnVuY3Rpb24oZGVja0dsUHJvcHM/LmxheWVycylcbiAgICA/IGRlY2tHbFByb3BzPy5sYXllcnMoKVxuICAgIDogW107XG4gIGNvbnN0IHRvcERlY2tMYXllcnMgPSBBcnJheS5pc0FycmF5KGRlY2tHbFByb3BzPy50b3BMYXllcnMpXG4gICAgPyBkZWNrR2xQcm9wcz8udG9wTGF5ZXJzXG4gICAgOiBpc0Z1bmN0aW9uKGRlY2tHbFByb3BzPy50b3BMYXllcnMpXG4gICAgPyBkZWNrR2xQcm9wcz8udG9wTGF5ZXJzKClcbiAgICA6IFtdO1xuXG4gIHJldHVybiBbYm90dG9tRGVja0xheWVycywgdG9wRGVja0xheWVyc107XG59XG5cbmV4cG9ydCB0eXBlIENvbXB1dGVEZWNrTGF5ZXJzUHJvcHMgPSB7XG4gIG1hcEluZGV4PzogbnVtYmVyO1xuICBtYXBib3hBcGlBY2Nlc3NUb2tlbj86IHN0cmluZztcbiAgbWFwYm94QXBpVXJsPzogc3RyaW5nO1xuICBwcmltYXJ5TWFwPzogYm9vbGVhbjtcbiAgbGF5ZXJzRm9yRGVjaz86IHtba2V5OiBzdHJpbmddOiBib29sZWFufTtcbiAgZWRpdG9ySW5mbz86IHtcbiAgICBlZGl0b3I6IEVkaXRvcjtcbiAgICBlZGl0b3JNZW51QWN0aXZlOiBib29sZWFuO1xuICAgIG9uU2V0RmVhdHVyZXM6IChmZWF0dXJlczogRmVhdHVyZVtdKSA9PiBhbnk7XG4gICAgc2V0U2VsZWN0ZWRGZWF0dXJlOiAoXG4gICAgICBmZWF0dXJlOiBGZWF0dXJlIHwgbnVsbCxcbiAgICAgIHNlbGVjdGlvbkNvbnRleHQ/OiBGZWF0dXJlU2VsZWN0aW9uQ29udGV4dFxuICAgICkgPT4gYW55O1xuICAgIGZlYXR1cmVDb2xsZWN0aW9uOiB7XG4gICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICBmZWF0dXJlczogRmVhdHVyZVtdO1xuICAgIH07XG4gICAgc2VsZWN0ZWRGZWF0dXJlSW5kZXhlczogbnVtYmVyW107XG4gICAgdmlld3BvcnQ6IFZpZXdwb3J0O1xuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRMYXllckNhbGxiYWNrcyhcbiAgbGF5ZXJDYWxsYmFja3M6IExheWVyQ2FsbGJhY2tzID0ge30sXG4gIGlkeDogbnVtYmVyXG4pOiBCaW5kZWRMYXllckNhbGxiYWNrcyB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhsYXllckNhbGxiYWNrcykucmVkdWNlKFxuICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgW2tleV06IHZhbCA9PiBsYXllckNhbGxiYWNrc1trZXldKGlkeCwgdmFsKVxuICAgIH0pLFxuICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsICh2YWw6IHVua25vd24pID0+IHZvaWQ+XG4gICk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZURlY2tMYXllcnMoXG4gIHt2aXNTdGF0ZSwgbWFwU3RhdGUsIG1hcFN0eWxlfTogYW55LFxuICBvcHRpb25zPzogQ29tcHV0ZURlY2tMYXllcnNQcm9wcyxcbiAgbGF5ZXJDYWxsYmFja3M/OiBMYXllckNhbGxiYWNrcyxcbiAgZGVja0dsUHJvcHM/OiBhbnlcbik6IExheWVyW10ge1xuICBjb25zdCB7XG4gICAgZGF0YXNldHMsXG4gICAgZWZmZWN0cyxcbiAgICBsYXllcnMsXG4gICAgbGF5ZXJPcmRlcixcbiAgICBsYXllckRhdGEsXG4gICAgaG92ZXJJbmZvLFxuICAgIGNsaWNrZWQsXG4gICAgaW50ZXJhY3Rpb25Db25maWcsXG4gICAgYW5pbWF0aW9uQ29uZmlnLFxuICAgIHNwbGl0TWFwc1xuICB9ID0gdmlzU3RhdGU7XG5cbiAgY29uc3Qge21hcEluZGV4LCBtYXBib3hBcGlBY2Nlc3NUb2tlbiwgbWFwYm94QXBpVXJsLCBwcmltYXJ5TWFwLCBsYXllcnNGb3JEZWNrLCBlZGl0b3JJbmZvfSA9XG4gICAgb3B0aW9ucyB8fCB7fTtcblxuICBsZXQgZGF0YUxheWVyczogYW55W10gPSBbXTtcblxuICBjb25zdCBoYXNTaGFkb3dFZmZlY3QgPSBlZmZlY3RzLnNvbWUoZWZmZWN0ID0+IHtcbiAgICByZXR1cm4gZWZmZWN0LnR5cGUgPT09IExJR0hUX0FORF9TSEFET1dfRUZGRUNULnR5cGU7XG4gIH0pO1xuXG4gIGlmIChsYXllckRhdGEgJiYgbGF5ZXJEYXRhLmxlbmd0aCkge1xuICAgIGNvbnN0IG1hcExheWVycyA9IGdldE1hcExheWVyc0Zyb21TcGxpdE1hcHMoc3BsaXRNYXBzLCBtYXBJbmRleCB8fCAwKTtcblxuICAgIGNvbnN0IGN1cnJlbnRMYXllcnNGb3JEZWNrID0gbGF5ZXJzRm9yRGVjayB8fCBwcmVwYXJlTGF5ZXJzRm9yRGVjayhsYXllcnMsIGxheWVyRGF0YSk7XG5cbiAgICBkYXRhTGF5ZXJzID0gbGF5ZXJPcmRlclxuICAgICAgLnNsaWNlKClcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5maWx0ZXIoaWQgPT4gY3VycmVudExheWVyc0ZvckRlY2tbaWRdKVxuICAgICAgLnJlZHVjZSgob3ZlcmxheXMsIGxheWVySWQpID0+IHtcbiAgICAgICAgY29uc3QgbGF5ZXJJbmRleCA9IGxheWVycy5maW5kSW5kZXgoKHtpZH0pID0+IGlkID09PSBsYXllcklkKTtcbiAgICAgICAgY29uc3QgYmluZGVkTGF5ZXJDYWxsYmFja3MgPSBsYXllckNhbGxiYWNrc1xuICAgICAgICAgID8gYmluZExheWVyQ2FsbGJhY2tzKGxheWVyQ2FsbGJhY2tzLCBsYXllckluZGV4KVxuICAgICAgICAgIDoge307XG4gICAgICAgIGNvbnN0IGxheWVyID0gbGF5ZXJzW2xheWVySW5kZXhdO1xuICAgICAgICBjb25zdCBkYXRhID0gbGF5ZXJEYXRhW2xheWVySW5kZXhdO1xuICAgICAgICBjb25zdCBsYXllck92ZXJsYXkgPSByZW5kZXJEZWNrR2xMYXllcihcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkYXRhc2V0cyxcbiAgICAgICAgICAgIGxheWVyLFxuICAgICAgICAgICAgbGF5ZXJJbmRleCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBob3ZlckluZm8sXG4gICAgICAgICAgICBjbGlja2VkLFxuICAgICAgICAgICAgbWFwU3RhdGUsXG4gICAgICAgICAgICBpbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAgICAgICAgIGFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgICAgIG1hcExheWVycyxcbiAgICAgICAgICAgIGV4cGVyaW1lbnRhbENvbnRleHQ6IHtcbiAgICAgICAgICAgICAgaGFzU2hhZG93RWZmZWN0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBiaW5kZWRMYXllckNhbGxiYWNrc1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gb3ZlcmxheXMuY29uY2F0KGxheWVyT3ZlcmxheSB8fCBbXSk7XG4gICAgICB9LCBbXSk7XG4gIH1cblxuICBpZiAoIXByaW1hcnlNYXApIHtcbiAgICByZXR1cm4gZGF0YUxheWVycztcbiAgfVxuXG4gIGlmIChcbiAgICBtYXBTdHlsZT8udmlzaWJsZUxheWVyR3JvdXBzWyczZCBidWlsZGluZyddICYmXG4gICAgcHJpbWFyeU1hcCAmJlxuICAgIG1hcGJveEFwaUFjY2Vzc1Rva2VuICYmXG4gICAgbWFwYm94QXBpVXJsXG4gICkge1xuICAgIGRhdGFMYXllcnMucHVzaChcbiAgICAgIG5ldyBUaHJlZURCdWlsZGluZ0xheWVyKHtcbiAgICAgICAgaWQ6ICdfa2VwbGVyZ2xfM2QtYnVpbGRpbmcnLFxuICAgICAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbixcbiAgICAgICAgbWFwYm94QXBpVXJsLFxuICAgICAgICB0aHJlZURCdWlsZGluZ0NvbG9yOiBtYXBTdHlsZS50aHJlZURCdWlsZGluZ0NvbG9yLFxuICAgICAgICB1cGRhdGVUcmlnZ2Vyczoge1xuICAgICAgICAgIGdldEZpbGxDb2xvcjogbWFwU3R5bGUudGhyZWVEQnVpbGRpbmdDb2xvclxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjb25zdCBbY3VzdG9tQm90dG9tRGVja0xheWVycywgY3VzdG9tVG9wRGVja0xheWVyc10gPSBnZXRDdXN0b21EZWNrTGF5ZXJzKGRlY2tHbFByb3BzKTtcblxuICBjb25zdCBlZGl0b3JMYXllcjogYW55W10gPSBbXTtcbiAgaWYgKGVkaXRvckluZm8pIHtcbiAgICBlZGl0b3JMYXllci5wdXNoKFxuICAgICAgZ2V0RWRpdG9yTGF5ZXIoe1xuICAgICAgICAuLi5lZGl0b3JJbmZvXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gWy4uLmN1c3RvbUJvdHRvbURlY2tMYXllcnMsIC4uLmRhdGFMYXllcnMsIC4uLmN1c3RvbVRvcERlY2tMYXllcnMsIC4uLmVkaXRvckxheWVyXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExheWVyT3JkZXJGcm9tTGF5ZXJzPFQgZXh0ZW5kcyB7aWQ6IHN0cmluZ30+KGxheWVyczogVFtdKTogc3RyaW5nW10ge1xuICByZXR1cm4gbGF5ZXJzLm1hcCgoe2lkfSkgPT4gaWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVvcmRlckxheWVyT3JkZXIoXG4gIGxheWVyT3JkZXI6IFZpc1N0YXRlWydsYXllck9yZGVyJ10sXG4gIG9yaWdpbkxheWVySWQ6IHN0cmluZyxcbiAgZGVzdGluYXRpb25MYXllcklkOiBzdHJpbmdcbik6IFZpc1N0YXRlWydsYXllck9yZGVyJ10ge1xuICBjb25zdCBhY3RpdmVJbmRleCA9IGxheWVyT3JkZXIuaW5kZXhPZihvcmlnaW5MYXllcklkKTtcbiAgY29uc3Qgb3ZlckluZGV4ID0gbGF5ZXJPcmRlci5pbmRleE9mKGRlc3RpbmF0aW9uTGF5ZXJJZCk7XG5cbiAgcmV0dXJuIGFycmF5TW92ZShsYXllck9yZGVyLCBhY3RpdmVJbmRleCwgb3ZlckluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZExheWVyVG9MYXllck9yZGVyKFxuICBsYXllck9yZGVyOiBWaXNTdGF0ZVsnbGF5ZXJPcmRlciddLFxuICBsYXllcklkOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtsYXllcklkLCAuLi5sYXllck9yZGVyXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExheWVySG92ZXJQcm9wVmFsdWUoXG4gIGRhdGE6IERhdGFSb3cgfCBBZ2dyZWdhdGlvbkxheWVySG92ZXJEYXRhIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgZmllbGRJbmRleDogbnVtYmVyXG4pIHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGFSb3cpIHJldHVybiBkYXRhLnZhbHVlQXQoZmllbGRJbmRleCk7XG4gIHJldHVybiBkYXRhW2ZpZWxkSW5kZXhdO1xufVxuXG4vKiogQ2hlY2tzIGlmIGFueSBEZWNrIGxheWVycyBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgbG9hZGluZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcmVBbnlEZWNrTGF5ZXJzTG9hZGluZyhsYXllcnM6IERlY2tMYXllcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBsYXllcnMuc29tZShcbiAgICAvLyBsYXllci5pc0xvYWRlZCBjaGFuZ2VzIGZyZXF1ZW50bHkgaW4gRGVjayAoZXZlbiBvbiBob3Zlcikgc28gd2UgY2hlY2sgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG4gICAgbGF5ZXIgPT4gbGF5ZXIuaW50ZXJuYWxTdGF0ZSAmJiAhbGF5ZXIuaXNMb2FkZWRcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLFFBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQWNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQVdBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFlBQUEsR0FBQUosT0FBQTtBQUVBLElBQUFLLGFBQUEsR0FBQUwsT0FBQTtBQUE2RCxTQUFBTSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxDQUFBLFFBQUFlLGdCQUFBLGFBQUFoQixDQUFBLEVBQUFD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