kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
256 lines (214 loc) • 25.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.scenegraphVisConfigs = exports.scenegraphRequiredColumns = exports.scenegraphPosResolver = exports.scenegraphPosAccessor = exports.scenegraphOptionalColumns = exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _meshLayers = require("@deck.gl/mesh-layers");
var _core = require("@loaders.gl/core");
var _addons = require("@luma.gl/addons");
var _baseLayer = _interopRequireDefault(require("../base-layer"));
var _lodash = _interopRequireDefault(require("lodash.memoize"));
var _scenegraphLayerIcon = _interopRequireDefault(require("./scenegraph-layer-icon"));
var _scenegraphInfoModal = _interopRequireDefault(require("./scenegraph-info-modal"));
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; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var scenegraphRequiredColumns = exports.scenegraphRequiredColumns = ['lat', 'lng'];
var scenegraphOptionalColumns = exports.scenegraphOptionalColumns = ['altitude'];
function fetch(url, _ref) {
var propName = _ref.propName,
layer = _ref.layer;
if (propName === 'scenegraph') {
return (0, _core.load)(url, _addons.GLTFScenegraphLoader, layer.getLoadOptions());
}
return fetch(url).then(function (response) {
return response.json();
});
}
var scenegraphPosAccessor = exports.scenegraphPosAccessor = function scenegraphPosAccessor(_ref2) {
var lat = _ref2.lat,
lng = _ref2.lng,
altitude = _ref2.altitude;
return function (d) {
return [// lng
d.data[lng.fieldIdx], // lat
d.data[lat.fieldIdx], // altitude
altitude && altitude.fieldIdx > -1 ? d.data[altitude.fieldIdx] : 0];
};
};
var scenegraphPosResolver = exports.scenegraphPosResolver = function scenegraphPosResolver(_ref3) {
var lat = _ref3.lat,
lng = _ref3.lng,
altitude = _ref3.altitude;
return "".concat(lat.fieldIdx, "-").concat(lng.fieldIdx, "-").concat(altitude ? altitude.fieldIdx : 'z');
};
var scenegraphVisConfigs = exports.scenegraphVisConfigs = {
opacity: 'opacity',
colorRange: 'colorRange',
//
sizeScale: 'sizeScale',
angleX: 'angleX',
angleY: 'angleY',
angleZ: 'angleZ'
};
var DEFAULT_MODEL = 'https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF-Binary/Duck.glb';
var DEFAULT_TRANSITION = [0, 0, 0];
var DEFAULT_SCALE = [1, 1, 1];
var DEFAULT_COLOR = [255, 255, 255, 255];
var ScenegraphLayer = exports["default"] = /*#__PURE__*/function (_Layer) {
(0, _inherits2["default"])(ScenegraphLayer, _Layer);
var _super = _createSuper(ScenegraphLayer);
function ScenegraphLayer(props) {
var _this;
(0, _classCallCheck2["default"])(this, ScenegraphLayer);
_this = _super.call(this, props);
_this.registerVisConfig(scenegraphVisConfigs);
_this.getPosition = (0, _lodash["default"])(scenegraphPosAccessor, scenegraphPosResolver); // prepare layer info modal
_this._layerInfoModal = (0, _scenegraphInfoModal["default"])();
return _this;
}
(0, _createClass2["default"])(ScenegraphLayer, [{
key: "type",
get: function get() {
return '3D';
}
}, {
key: "requiredLayerColumns",
get: function get() {
return scenegraphRequiredColumns;
}
}, {
key: "optionalColumns",
get: function get() {
return scenegraphOptionalColumns;
}
}, {
key: "columnPairs",
get: function get() {
return this.defaultPointColumnPairs;
}
}, {
key: "layerIcon",
get: function get() {
return _scenegraphLayerIcon["default"];
}
}, {
key: "layerInfoModal",
get: function get() {
return {
id: 'scenegraphInfo',
template: this._layerInfoModal,
modalProps: {
title: 'How to use Scenegraph'
}
};
}
}, {
key: "formatLayerData",
value: function formatLayerData(_, allData, filteredIndex, oldLayerData) {
var opt = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
var columns = this.config.columns;
var getPosition = this.getPosition(columns);
if (!oldLayerData || oldLayerData.getPosition !== getPosition) {
this.updateLayerMeta(allData, getPosition);
}
var data;
if (oldLayerData && oldLayerData.data && opt.sameData && oldLayerData.getPosition === getPosition) {
data = oldLayerData.data;
} else {
data = filteredIndex.reduce(function (accu, index) {
var pos = getPosition({
data: allData[index]
}); // if doesn't have point lat or lng, do not add the point
// deck.gl can't handle position = null
if (!pos.every(Number.isFinite)) {
return accu;
}
accu.push({
index: index,
data: allData[index]
});
return accu;
}, []);
}
return {
data: data,
getPosition: getPosition
};
}
}, {
key: "updateLayerMeta",
value: function updateLayerMeta(allData, getPosition) {
var bounds = this.getPointsBounds(allData, function (d) {
return getPosition({
data: d
});
});
this.updateMeta({
bounds: bounds
});
}
}, {
key: "renderLayer",
value: function renderLayer(_ref4) {
var data = _ref4.data,
idx = _ref4.idx,
objectHovered = _ref4.objectHovered,
mapState = _ref4.mapState,
interactionConfig = _ref4.interactionConfig,
layerInteraction = _ref4.layerInteraction;
var layerProps = _objectSpread({
radiusMinPixels: 1,
radiusScale: this.getRadiusScaleByZoom(mapState)
}, this.config.visConfig.fixedRadius ? {} : {
radiusMaxPixels: 500
});
var _this$config$visConfi = this.config.visConfig,
_this$config$visConfi2 = _this$config$visConfi.sizeScale,
sizeScale = _this$config$visConfi2 === void 0 ? 1 : _this$config$visConfi2,
_this$config$visConfi3 = _this$config$visConfi.angleX,
angleX = _this$config$visConfi3 === void 0 ? 0 : _this$config$visConfi3,
_this$config$visConfi4 = _this$config$visConfi.angleY,
angleY = _this$config$visConfi4 === void 0 ? 0 : _this$config$visConfi4,
_this$config$visConfi5 = _this$config$visConfi.angleZ,
angleZ = _this$config$visConfi5 === void 0 ? 90 : _this$config$visConfi5;
return [new _meshLayers.ScenegraphLayer(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, layerProps), data), layerInteraction), {}, {
id: this.id,
idx: idx,
opacity: this.config.visConfig.opacity,
fetch: fetch,
scenegraph: this.config.visConfig.scenegraph || DEFAULT_MODEL,
sizeScale: sizeScale,
getTranslation: DEFAULT_TRANSITION,
getScale: DEFAULT_SCALE,
getOrientation: [angleX, angleY, angleZ],
getColor: DEFAULT_COLOR,
// picking
pickable: true,
// parameters
parameters: {
depthTest: true,
blend: false
},
// update triggers
updateTriggers: {
getOrientation: {
angleX: angleX,
angleY: angleY,
angleZ: angleZ
}
}
}))];
}
}]);
return ScenegraphLayer;
}(_baseLayer["default"]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvc2NlbmVncmFwaC1sYXllci9zY2VuZWdyYXBoLWxheWVyLmpzIl0sIm5hbWVzIjpbInNjZW5lZ3JhcGhSZXF1aXJlZENvbHVtbnMiLCJzY2VuZWdyYXBoT3B0aW9uYWxDb2x1bW5zIiwiZmV0Y2giLCJ1cmwiLCJwcm9wTmFtZSIsImxheWVyIiwiR0xURlNjZW5lZ3JhcGhMb2FkZXIiLCJnZXRMb2FkT3B0aW9ucyIsInRoZW4iLCJyZXNwb25zZSIsImpzb24iLCJzY2VuZWdyYXBoUG9zQWNjZXNzb3IiLCJsYXQiLCJsbmciLCJhbHRpdHVkZSIsImQiLCJkYXRhIiwiZmllbGRJZHgiLCJzY2VuZWdyYXBoUG9zUmVzb2x2ZXIiLCJzY2VuZWdyYXBoVmlzQ29uZmlncyIsIm9wYWNpdHkiLCJjb2xvclJhbmdlIiwic2l6ZVNjYWxlIiwiYW5nbGVYIiwiYW5nbGVZIiwiYW5nbGVaIiwiREVGQVVMVF9NT0RFTCIsIkRFRkFVTFRfVFJBTlNJVElPTiIsIkRFRkFVTFRfU0NBTEUiLCJERUZBVUxUX0NPTE9SIiwiU2NlbmVncmFwaExheWVyIiwicHJvcHMiLCJyZWdpc3RlclZpc0NvbmZpZyIsImdldFBvc2l0aW9uIiwiX2xheWVySW5mb01vZGFsIiwiZGVmYXVsdFBvaW50Q29sdW1uUGFpcnMiLCJTY2VuZWdyYXBoTGF5ZXJJY29uIiwiaWQiLCJ0ZW1wbGF0ZSIsIm1vZGFsUHJvcHMiLCJ0aXRsZSIsIl8iLCJhbGxEYXRhIiwiZmlsdGVyZWRJbmRleCIsIm9sZExheWVyRGF0YSIsIm9wdCIsImNvbHVtbnMiLCJjb25maWciLCJ1cGRhdGVMYXllck1ldGEiLCJzYW1lRGF0YSIsInJlZHVjZSIsImFjY3UiLCJpbmRleCIsInBvcyIsImV2ZXJ5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJwdXNoIiwiYm91bmRzIiwiZ2V0UG9pbnRzQm91bmRzIiwidXBkYXRlTWV0YSIsImlkeCIsIm9iamVjdEhvdmVyZWQiLCJtYXBTdGF0ZSIsImludGVyYWN0aW9uQ29uZmlnIiwibGF5ZXJJbnRlcmFjdGlvbiIsImxheWVyUHJvcHMiLCJyYWRpdXNNaW5QaXhlbHMiLCJyYWRpdXNTY2FsZSIsImdldFJhZGl1c1NjYWxlQnlab29tIiwidmlzQ29uZmlnIiwiZml4ZWRSYWRpdXMiLCJyYWRpdXNNYXhQaXhlbHMiLCJEZWNrU2NlbmVncmFwaExheWVyIiwic2NlbmVncmFwaCIsImdldFRyYW5zbGF0aW9uIiwiZ2V0U2NhbGUiLCJnZXRPcmllbnRhdGlvbiIsImdldENvbG9yIiwicGlja2FibGUiLCJwYXJhbWV0ZXJzIiwiZGVwdGhUZXN0IiwiYmxlbmQiLCJ1cGRhdGVUcmlnZ2VycyIsIkxheWVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7QUFFTyxJQUFNQSx5QkFBeUIsdUNBQUcsQ0FBQyxLQUFELEVBQVEsS0FBUixDQUFsQztBQUNBLElBQU1DLHlCQUF5Qix1Q0FBRyxDQUFDLFVBQUQsQ0FBbEM7O0FBRVAsU0FBU0MsS0FBVCxDQUFlQyxHQUFmLFFBQXVDO0FBQUEsTUFBbEJDLFFBQWtCLFFBQWxCQSxRQUFrQjtBQUFBLE1BQVJDLEtBQVEsUUFBUkEsS0FBUTs7QUFDckMsTUFBSUQsUUFBUSxLQUFLLFlBQWpCLEVBQStCO0FBQzdCLFdBQU8sZ0JBQUtELEdBQUwsRUFBVUcsNEJBQVYsRUFBZ0NELEtBQUssQ0FBQ0UsY0FBTixFQUFoQyxDQUFQO0FBQ0Q7O0FBRUQsU0FBT0wsS0FBSyxDQUFDQyxHQUFELENBQUwsQ0FBV0ssSUFBWCxDQUFnQixVQUFBQyxRQUFRO0FBQUEsV0FBSUEsUUFBUSxDQUFDQyxJQUFULEVBQUo7QUFBQSxHQUF4QixDQUFQO0FBQ0Q7O0FBRU0sSUFBTUMscUJBQXFCLG1DQUFHLFNBQXhCQSxxQkFBd0I7QUFBQSxNQUFFQyxHQUFGLFNBQUVBLEdBQUY7QUFBQSxNQUFPQyxHQUFQLFNBQU9BLEdBQVA7QUFBQSxNQUFZQyxR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QVUsRUFBRSxLQUFLM0IsTUFBTCxDQUFZdUIsU0FBWixDQUFzQkksVUFBdEIsSUFBb0NoRCxhQVZsRDtBQVlFSixRQUFBQSxTQUFTLEVBQVRBLFNBWkY7QUFhRXFELFFBQUFBLGNBQWMsRUFBRWhELGtCQWJsQjtBQWNFaUQsUUFBQUEsUUFBUSxFQUFFaEQsYUFkWjtBQWVFaUQsUUFBQUEsY0FBYyxFQUFFLENBQUN0RCxNQUFELEVBQVNDLE1BQVQsRUFBaUJDLE1BQWpCLENBZmxCO0FBZ0JFcUQsUUFBQUEsUUFBUSxFQUFFakQsYUFoQlo7QUFrQkU7QUFDQWtELFFBQUFBLFFBQVEsRUFBRSxJQW5CWjtBQXFCRTtBQUNBQyxRQUFBQSxVQUFVLEVBQUU7QUFBQ0MsVUFBQUEsU0FBUyxFQUFFLElBQVo7QUFBa0JDLFVBQUFBLEtBQUssRUFBRTtBQUF6QixTQXRCZDtBQXdCRTtBQUNBQyxRQUFBQSxjQUFjLEVBQUU7QUFDZE4sVUFBQUEsY0FBYyxFQUFFO0FBQUN0RCxZQUFBQSxNQUFNLEVBQU5BLE1BQUQ7QUFBU0MsWUFBQUEsTUFBTSxFQUFOQSxNQUFUO0FBQWlCQyxZQUFBQSxNQUFNLEVBQU5BO0FBQWpCO0FBREY7QUF6QmxCLFNBREssQ0FBUDtBQStCRDs7O0VBekkwQzJELHFCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtTY2VuZWdyYXBoTGF5ZXIgYXMgRGVja1NjZW5lZ3JhcGhMYXllcn0gZnJvbSAnQGRlY2suZ2wvbWVzaC1sYXllcnMnO1xuaW1wb3J0IHtsb2FkfSBmcm9tICdAbG9hZGVycy5nbC9jb3JlJztcbmltcG9ydCB7R0xURlNjZW5lZ3JhcGhMb2FkZXJ9IGZyb20gJ0BsdW1hLmdsL2FkZG9ucyc7XG5cbmltcG9ydCBMYXllciBmcm9tICcuLi9iYXNlLWxheWVyJztcbmltcG9ydCBtZW1vaXplIGZyb20gJ2xvZGFzaC5tZW1vaXplJztcbmltcG9ydCBTY2VuZWdyYXBoTGF5ZXJJY29uIGZyb20gJy4vc2NlbmVncmFwaC1sYXllci1pY29uJztcbmltcG9ydCBTY2VuZWdyYXBoSW5mb01vZGFsRmFjdG9yeSBmcm9tICcuL3NjZW5lZ3JhcGgtaW5mby1tb2RhbCc7XG5cbmV4cG9ydCBjb25zdCBzY2VuZWdyYXBoUmVxdWlyZWRDb2x1bW5zID0gWydsYXQnLCAnbG5nJ107XG5leHBvcnQgY29uc3Qgc2NlbmVncmFwaE9wdGlvbmFsQ29sdW1ucyA9IFsnYWx0aXR1ZGUnXTtcblxuZnVuY3Rpb24gZmV0Y2godXJsLCB7cHJvcE5hbWUsIGxheWVyfSkge1xuICBpZiAocHJvcE5hbWUgPT09ICdzY2VuZWdyYXBoJykge1xuICAgIHJldHVybiBsb2FkKHVybCwgR0xURlNjZW5lZ3JhcGhMb2FkZXIsIGxheWVyLmdldExvYWRPcHRpb25zKCkpO1xuICB9XG5cbiAgcmV0dXJuIGZldGNoKHVybCkudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpO1xufVxuXG5leHBvcnQgY29uc3Qgc2NlbmVncmFwaFBvc0FjY2Vzc29yID0gKHtsYXQsIGxuZywgYWx0aXR1ZGV9KSA9PiBkID0+IFtcbiAgLy8gbG5nXG4gIGQuZGF0YVtsbmcuZmllbGRJZHhdLFxuICAvLyBsYXRcbiAgZC5kYXRhW2xhdC5maWVsZElkeF0sXG4gIC8vIGFsdGl0dWRlXG4gIGFsdGl0dWRlICYmIGFsdGl0dWRlLmZpZWxkSWR4ID4gLTEgPyBkLmRhdGFbYWx0aXR1ZGUuZmllbGRJZHhdIDogMFxuXTtcblxuZXhwb3J0IGNvbnN0IHNjZW5lZ3JhcGhQb3NSZXNvbHZlciA9ICh7bGF0LCBsbmcsIGFsdGl0dWRlfSkgPT5cbiAgYCR7bGF0LmZpZWxkSWR4fS0ke2xuZy5maWVsZElkeH0tJHthbHRpdHVkZSA/IGFsdGl0dWRlLmZpZWxkSWR4IDogJ3onfWA7XG5cbmV4cG9ydCBjb25zdCBzY2VuZWdyYXBoVmlzQ29uZmlncyA9IHtcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICBjb2xvclJhbmdlOiAnY29sb3JSYW5nZScsXG4gIC8vXG4gIHNpemVTY2FsZTogJ3NpemVTY2FsZScsXG4gIGFuZ2xlWDogJ2FuZ2xlWCcsXG4gIGFuZ2xlWTogJ2FuZ2xlWScsXG4gIGFuZ2xlWjogJ2FuZ2xlWidcbn07XG5cbmNvbnN0IERFRkFVTFRfTU9ERUwgPVxuICAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0tocm9ub3NHcm91cC9nbFRGLVNhbXBsZS1Nb2RlbHMvbWFzdGVyLzIuMC9EdWNrL2dsVEYtQmluYXJ5L0R1Y2suZ2xiJztcbmNvbnN0IERFRkFVTFRfVFJBTlNJVElPTiA9IFswLCAwLCAwXTtcbmNvbnN0IERFRkFVTFRfU0NBTEUgPSBbMSwgMSwgMV07XG5jb25zdCBERUZBVUxUX0NPTE9SID0gWzI1NSwgMjU1LCAyNTUsIDI1NV07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjZW5lZ3JhcGhMYXllciBleHRlbmRzIExheWVyIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyVmlzQ29uZmlnKHNjZW5lZ3JhcGhWaXNDb25maWdzKTtcbiAgICB0aGlzLmdldFBvc2l0aW9uID0gbWVtb2l6ZShzY2VuZWdyYXBoUG9zQWNjZXNzb3IsIHNjZW5lZ3JhcGhQb3NSZXNvbHZlcik7XG5cbiAgICAvLyBwcmVwYXJlIGxheWVyIGluZm8gbW9kYWxcbiAgICB0aGlzLl9sYXllckluZm9Nb2RhbCA9IFNjZW5lZ3JhcGhJbmZvTW9kYWxGYWN0b3J5KCk7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJzNEJztcbiAgfVxuXG4gIGdldCByZXF1aXJlZExheWVyQ29sdW1ucygpIHtcbiAgICByZXR1cm4gc2NlbmVncmFwaFJlcXVpcmVkQ29sdW1ucztcbiAgfVxuXG4gIGdldCBvcHRpb25hbENvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHNjZW5lZ3JhcGhPcHRpb25hbENvbHVtbnM7XG4gIH1cblxuICBnZXQgY29sdW1uUGFpcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFBvaW50Q29sdW1uUGFpcnM7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCkge1xuICAgIHJldHVybiBTY2VuZWdyYXBoTGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IGxheWVySW5mb01vZGFsKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogJ3NjZW5lZ3JhcGhJbmZvJyxcbiAgICAgIHRlbXBsYXRlOiB0aGlzLl9sYXllckluZm9Nb2RhbCxcbiAgICAgIG1vZGFsUHJvcHM6IHtcbiAgICAgICAgdGl0bGU6ICdIb3cgdG8gdXNlIFNjZW5lZ3JhcGgnXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZvcm1hdExheWVyRGF0YShfLCBhbGxEYXRhLCBmaWx0ZXJlZEluZGV4LCBvbGRMYXllckRhdGEsIG9wdCA9IHt9KSB7XG4gICAgY29uc3Qge2NvbHVtbnN9ID0gdGhpcy5jb25maWc7XG5cbiAgICBjb25zdCBnZXRQb3NpdGlvbiA9IHRoaXMuZ2V0UG9zaXRpb24oY29sdW1ucyk7XG5cbiAgICBpZiAoIW9sZExheWVyRGF0YSB8fCBvbGRMYXllckRhdGEuZ2V0UG9zaXRpb24gIT09IGdldFBvc2l0aW9uKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyTWV0YShhbGxEYXRhLCBnZXRQb3NpdGlvbik7XG4gICAgfVxuXG4gICAgbGV0IGRhdGE7XG4gICAgaWYgKFxuICAgICAgb2xkTGF5ZXJEYXRhICYmXG4gICAgICBvbGRMYXllckRhdGEuZGF0YSAmJlxuICAgICAgb3B0LnNhbWVEYXRhICYmXG4gICAgICBvbGRMYXllckRhdGEuZ2V0UG9zaXRpb24gPT09IGdldFBvc2l0aW9uXG4gICAgKSB7XG4gICAgICBkYXRhID0gb2xkTGF5ZXJEYXRhLmRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSBmaWx0ZXJlZEluZGV4LnJlZHVjZSgoYWNjdSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcG9zID0gZ2V0UG9zaXRpb24oe2RhdGE6IGFsbERhdGFbaW5kZXhdfSk7XG5cbiAgICAgICAgLy8gaWYgZG9lc24ndCBoYXZlIHBvaW50IGxhdCBvciBsbmcsIGRvIG5vdCBhZGQgdGhlIHBvaW50XG4gICAgICAgIC8vIGRlY2suZ2wgY2FuJ3QgaGFuZGxlIHBvc2l0aW9uID0gbnVsbFxuICAgICAgICBpZiAoIXBvcy5ldmVyeShOdW1iZXIuaXNGaW5pdGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGFjY3U7XG4gICAgICAgIH1cblxuICAgICAgICBhY2N1LnB1c2goe1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGRhdGE6IGFsbERhdGFbaW5kZXhdXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhY2N1O1xuICAgICAgfSwgW10pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhLFxuICAgICAgZ2V0UG9zaXRpb25cbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJNZXRhKGFsbERhdGEsIGdldFBvc2l0aW9uKSB7XG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRQb2ludHNCb3VuZHMoYWxsRGF0YSwgZCA9PiBnZXRQb3NpdGlvbih7ZGF0YTogZH0pKTtcbiAgICB0aGlzLnVwZGF0ZU1ldGEoe2JvdW5kc30pO1xuICB9XG5cbiAgcmVuZGVyTGF5ZXIoe1xuICAgIGRhdGEsXG4gICAgaWR4LFxuICAgIG9iamVjdEhvdmVyZWQsXG4gICAgbWFwU3RhdGUsXG4gICAgaW50ZXJhY3Rpb25Db25maWcsXG4gICAgbGF5ZXJJbnRlcmFjdGlvblxuICB9KSB7XG4gICAgY29uc3QgbGF5ZXJQcm9wcyA9IHtcbiAgICAgIHJhZGl1c01pblBpeGVsczogMSxcbiAgICAgIHJhZGl1c1NjYWxlOiB0aGlzLmdldFJhZGl1c1NjYWxlQnlab29tKG1hcFN0YXRlKSxcbiAgICAgIC4uLih0aGlzLmNvbmZpZy52aXNDb25maWcuZml4ZWRSYWRpdXMgPyB7fSA6IHtyYWRpdXNNYXhQaXhlbHM6IDUwMH0pXG4gICAgfTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHZpc0NvbmZpZzoge3NpemVTY2FsZSA9IDEsIGFuZ2xlWCA9IDAsIGFuZ2xlWSA9IDAsIGFuZ2xlWiA9IDkwfVxuICAgIH0gPSB0aGlzLmNvbmZpZztcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgRGVja1NjZW5lZ3JhcGhMYXllcih7XG4gICAgICAgIC4uLmxheWVyUHJvcHMsXG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIC4uLmxheWVySW50ZXJhY3Rpb24sXG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICBpZHgsXG4gICAgICAgIG9wYWNpdHk6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5vcGFjaXR5LFxuXG4gICAgICAgIGZldGNoLFxuXG4gICAgICAgIHNjZW5lZ3JhcGg6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5zY2VuZWdyYXBoIHx8IERFRkFVTFRfTU9ERUwsXG5cbiAgICAgICAgc2l6ZVNjYWxlLFxuICAgICAgICBnZXRUcmFuc2xhdGlvbjogREVGQVVMVF9UUkFOU0lUSU9OLFxuICAgICAgICBnZXRTY2FsZTogREVGQVVMVF9TQ0FMRSxcbiAgICAgICAgZ2V0T3JpZW50YXRpb246IFthbmdsZVgsIGFuZ2xlWSwgYW5nbGVaXSxcbiAgICAgICAgZ2V0Q29sb3I6IERFRkFVTFRfQ09MT1IsXG5cbiAgICAgICAgLy8gcGlja2luZ1xuICAgICAgICBwaWNrYWJsZTogdHJ1ZSxcblxuICAgICAgICAvLyBwYXJhbWV0ZXJzXG4gICAgICAgIHBhcmFtZXRlcnM6IHtkZXB0aFRlc3Q6IHRydWUsIGJsZW5kOiBmYWxzZX0sXG5cbiAgICAgICAgLy8gdXBkYXRlIHRyaWdnZXJzXG4gICAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7XG4gICAgICAgICAgZ2V0T3JpZW50YXRpb246IHthbmdsZVgsIGFuZ2xlWSwgYW5nbGVafVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIF07XG4gIH1cbn1cbiJdfQ==