kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
191 lines (188 loc) • 29 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.pointColResolver = exports.mapboxRequiredColumns = exports["default"] = exports.COLUMN_MODE_POINTS = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _baseLayer = _interopRequireWildcard(require("./base-layer"));
var _reselect = require("reselect");
var _mapboxUtils = require("./mapbox-utils");
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; }
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
var COLUMN_MODE_POINTS = exports.COLUMN_MODE_POINTS = 'points';
var mapboxRequiredColumns = exports.mapboxRequiredColumns = ['lat', 'lng'];
var SUPPORTED_COLUMN_MODES = [{
key: COLUMN_MODE_POINTS,
label: 'Points',
requiredColumns: mapboxRequiredColumns
}];
var pointColResolver = exports.pointColResolver = function pointColResolver(_ref, columnMode) {
var lat = _ref.lat,
lng = _ref.lng,
geoarrow = _ref.geoarrow;
return "".concat(columnMode, "-").concat(lat.fieldIdx, "-").concat(lng.fieldIdx, "-").concat(geoarrow === null || geoarrow === void 0 ? void 0 : geoarrow.fieldIdx);
};
var MapboxLayerGL = /*#__PURE__*/function (_Layer) {
function MapboxLayerGL() {
var _this;
(0, _classCallCheck2["default"])(this, MapboxLayerGL);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _callSuper(this, MapboxLayerGL, [].concat(args));
(0, _defineProperty2["default"])(_this, "datasetSelector", function (config) {
return config.dataId;
});
(0, _defineProperty2["default"])(_this, "gpuFilterSelector", function (config, datasets) {
return (config.dataId && datasets[config.dataId] || {}).gpuFilter;
});
(0, _defineProperty2["default"])(_this, "columnsSelector", function (config) {
return pointColResolver(config.columns, config.columnMode);
});
(0, _defineProperty2["default"])(_this, "sourceSelector", (0, _reselect.createSelector)(_this.datasetSelector, _this.columnsSelector, function (datasetId, columns) {
return "".concat(datasetId, "-").concat(columns);
}));
(0, _defineProperty2["default"])(_this, "filterSelector", (0, _reselect.createSelector)(_this.gpuFilterSelector, function (gpuFilter) {
return (0, _mapboxUtils.gpuFilterToMapboxFilter)(gpuFilter);
}));
return _this;
}
(0, _inherits2["default"])(MapboxLayerGL, _Layer);
return (0, _createClass2["default"])(MapboxLayerGL, [{
key: "overlayType",
get: function get() {
return _baseLayer.OVERLAY_TYPE_CONST.mapboxgl;
}
}, {
key: "type",
get: function get() {
return null;
}
}, {
key: "isAggregated",
get: function get() {
return true;
}
}, {
key: "supportedColumnModes",
get: function get() {
return SUPPORTED_COLUMN_MODES;
}
}, {
key: "columnPairs",
get: function get() {
return this.defaultPointColumnPairs;
}
}, {
key: "noneLayerDataAffectingProps",
get: function get() {
return [];
}
}, {
key: "visualChannels",
get: function get() {
return {};
}
}, {
key: "isValidFilter",
value: function isValidFilter(filter) {
// mapbox will crash if filter is not an array or empty
return Array.isArray(filter) && filter.length;
}
}, {
key: "getDataUpdateTriggers",
value: function getDataUpdateTriggers(_ref2) {
var _this2 = this;
var filteredIndex = _ref2.filteredIndex,
gpuFilter = _ref2.gpuFilter,
id = _ref2.id;
var columns = this.config.columns;
var visualChannelFields = Object.values(this.visualChannels).reduce(function (accu, v) {
return _objectSpread(_objectSpread({}, accu), _this2.config[v.field] ? (0, _defineProperty2["default"])({}, v.field, _this2.config[v.field].name) : {});
}, {});
var updateTriggers = {
getData: _objectSpread(_objectSpread({
datasetId: id,
columns: columns,
filteredIndex: filteredIndex
}, visualChannelFields), gpuFilter.filterValueUpdateTriggers),
getMeta: {
datasetId: id,
columns: columns
}
};
return updateTriggers;
}
}, {
key: "getGeometry",
value: function getGeometry(position) {
return position.every(Number.isFinite) ? {
type: 'Point',
coordinates: position
} : null;
}
}, {
key: "calculateDataAttribute",
value: function calculateDataAttribute(_ref4, getPosition) {
var _this3 = this;
var dataContainer = _ref4.dataContainer,
filteredIndex = _ref4.filteredIndex,
gpuFilter = _ref4.gpuFilter;
var getGeometry = function getGeometry(d) {
return _this3.getGeometry(getPosition(d));
};
var vcFields = Object.values(this.visualChannels).map(function (v) {
return _this3.config[v.field];
}).filter(function (v) {
return v;
});
var getPropertyFromVisualChanel = vcFields.length ? function (d) {
return vcFields.reduce(function (accu, field) {
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, field.name, field.valueAccessor(d)));
}, {});
} : function () {
return {};
};
var filterValueUpdateTriggers = gpuFilter.filterValueUpdateTriggers,
filterValueAccessor = gpuFilter.filterValueAccessor;
// gpuField To property
var hasFilter = Object.values(filterValueUpdateTriggers).filter(function (d) {
return d;
}).length;
var valueAccessor = filterValueAccessor(dataContainer)();
var getPropertyFromFilter = hasFilter ? function (d) {
var filterValue = valueAccessor(d);
return Object.values(filterValueUpdateTriggers).reduce(function (accu, gpu, i) {
return _objectSpread(_objectSpread({}, accu), gpu !== null && gpu !== void 0 && gpu.name ? (0, _defineProperty2["default"])({}, (0, _mapboxUtils.prefixGpuField)(gpu.name), filterValue[i]) : {});
}, {});
} : function () {
return {};
};
var getProperties = function getProperties(d) {
return _objectSpread(_objectSpread({}, getPropertyFromVisualChanel(d)), getPropertyFromFilter(d));
};
return (0, _mapboxUtils.geoJsonFromData)(filteredIndex, getGeometry, getProperties);
}
// this layer is rendered at mapbox level
// todo: maybe need to find a better solution for this one
}, {
key: "shouldRenderLayer",
value: function shouldRenderLayer() {
return typeof this.type === 'string' && this.config.isVisible && this.hasAllColumns();
}
}]);
}(_baseLayer["default"]);
var _default = exports["default"] = MapboxLayerGL;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYmFzZUxheWVyIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJyZXF1aXJlIiwiX3Jlc2VsZWN0IiwiX21hcGJveFV0aWxzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJDT0xVTU5fTU9ERV9QT0lOVFMiLCJleHBvcnRzIiwibWFwYm94UmVxdWlyZWRDb2x1bW5zIiwiU1VQUE9SVEVEX0NPTFVNTl9NT0RFUyIsImtleSIsImxhYmVsIiwicmVxdWlyZWRDb2x1bW5zIiwicG9pbnRDb2xSZXNvbHZlciIsIl9yZWYiLCJjb2x1bW5Nb2RlIiwibGF0IiwibG5nIiwiZ2VvYXJyb3ciLCJjb25jYXQiLCJmaWVsZElkeCIsIk1hcGJveExheWVyR0wiLCJfTGF5ZXIiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNvbmZpZyIsImRhdGFJZCIsImRhdGFzZXRzIiwiZ3B1RmlsdGVyIiwiY29sdW1ucyIsImNyZWF0ZVNlbGVjdG9yIiwiZGF0YXNldFNlbGVjdG9yIiwiY29sdW1uc1NlbGVjdG9yIiwiZGF0YXNldElkIiwiZ3B1RmlsdGVyU2VsZWN0b3IiLCJncHVGaWx0ZXJUb01hcGJveEZpbHRlciIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwiT1ZFUkxBWV9UWVBFX0NPTlNUIiwibWFwYm94Z2wiLCJkZWZhdWx0UG9pbnRDb2x1bW5QYWlycyIsInZhbHVlIiwiaXNWYWxpZEZpbHRlciIsImlzQXJyYXkiLCJnZXREYXRhVXBkYXRlVHJpZ2dlcnMiLCJfcmVmMiIsIl90aGlzMiIsImZpbHRlcmVkSW5kZXgiLCJpZCIsInZpc3VhbENoYW5uZWxGaWVsZHMiLCJ2YWx1ZXMiLCJ2aXN1YWxDaGFubmVscyIsInJlZHVjZSIsImFjY3UiLCJ2IiwiZmllbGQiLCJuYW1lIiwidXBkYXRlVHJpZ2dlcnMiLCJnZXREYXRhIiwiZmlsdGVyVmFsdWVVcGRhdGVUcmlnZ2VycyIsImdldE1ldGEiLCJnZXRHZW9tZXRyeSIsInBvc2l0aW9uIiwiZXZlcnkiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsInR5cGUiLCJjb29yZGluYXRlcyIsImNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUiLCJfcmVmNCIsImdldFBvc2l0aW9uIiwiX3RoaXMzIiwiZGF0YUNvbnRhaW5lciIsImQiLCJ2Y0ZpZWxkcyIsIm1hcCIsImdldFByb3BlcnR5RnJvbVZpc3VhbENoYW5lbCIsInZhbHVlQWNjZXNzb3IiLCJmaWx0ZXJWYWx1ZUFjY2Vzc29yIiwiaGFzRmlsdGVyIiwiZ2V0UHJvcGVydHlGcm9tRmlsdGVyIiwiZmlsdGVyVmFsdWUiLCJncHUiLCJwcmVmaXhHcHVGaWVsZCIsImdldFByb3BlcnRpZXMiLCJnZW9Kc29uRnJvbURhdGEiLCJzaG91bGRSZW5kZXJMYXllciIsImlzVmlzaWJsZSIsImhhc0FsbENvbHVtbnMiLCJMYXllciIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vc3JjL21hcGJveGdsLWxheWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBMYXllciwge0xheWVyQmFzZUNvbmZpZywgT1ZFUkxBWV9UWVBFX0NPTlNULCBWaXN1YWxDaGFubmVsc30gZnJvbSAnLi9iYXNlLWxheWVyJztcbmltcG9ydCB7Y3JlYXRlU2VsZWN0b3J9IGZyb20gJ3Jlc2VsZWN0JztcblxuaW1wb3J0IHtnZW9Kc29uRnJvbURhdGEsIHByZWZpeEdwdUZpZWxkLCBncHVGaWx0ZXJUb01hcGJveEZpbHRlcn0gZnJvbSAnLi9tYXBib3gtdXRpbHMnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIEtlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7TWVyZ2UsIExheWVyQ29sdW1ufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxudHlwZSBNYXBib3hMYXllckdMQ29sdW1ucyA9IHtcbiAgbGF0OiBMYXllckNvbHVtbjtcbiAgbG5nOiBMYXllckNvbHVtbjtcblxuICAvLyBDT0xVTU5fTU9ERV9HRU9BUlJPV1xuICBnZW9hcnJvdz86IExheWVyQ29sdW1uO1xufTtcblxuZXhwb3J0IHR5cGUgTWFwYm94TGF5ZXJHTENvbmZpZyA9IE1lcmdlPExheWVyQmFzZUNvbmZpZywge2NvbHVtbnM6IE1hcGJveExheWVyR0xDb2x1bW5zfT47XG5cbmV4cG9ydCBjb25zdCBDT0xVTU5fTU9ERV9QT0lOVFMgPSAncG9pbnRzJztcbmV4cG9ydCBjb25zdCBtYXBib3hSZXF1aXJlZENvbHVtbnMgPSBbJ2xhdCcsICdsbmcnXTtcbmNvbnN0IFNVUFBPUlRFRF9DT0xVTU5fTU9ERVMgPSBbXG4gIHtcbiAgICBrZXk6IENPTFVNTl9NT0RFX1BPSU5UUyxcbiAgICBsYWJlbDogJ1BvaW50cycsXG4gICAgcmVxdWlyZWRDb2x1bW5zOiBtYXBib3hSZXF1aXJlZENvbHVtbnNcbiAgfVxuXTtcblxuZXhwb3J0IGNvbnN0IHBvaW50Q29sUmVzb2x2ZXIgPSAoe2xhdCwgbG5nLCBnZW9hcnJvd306IE1hcGJveExheWVyR0xDb2x1bW5zLCBjb2x1bW5Nb2RlPzogc3RyaW5nKSA9PlxuICBgJHtjb2x1bW5Nb2RlfS0ke2xhdC5maWVsZElkeH0tJHtsbmcuZmllbGRJZHh9LSR7Z2VvYXJyb3c/LmZpZWxkSWR4fWA7XG5cbmNsYXNzIE1hcGJveExheWVyR0wgZXh0ZW5kcyBMYXllciB7XG4gIGRlY2xhcmUgY29uZmlnOiBNYXBib3hMYXllckdMQ29uZmlnO1xuXG4gIGdldCBvdmVybGF5VHlwZSgpIHtcbiAgICByZXR1cm4gT1ZFUkxBWV9UWVBFX0NPTlNULm1hcGJveGdsO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgaXNBZ2dyZWdhdGVkKCk6IHRydWUge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0IHN1cHBvcnRlZENvbHVtbk1vZGVzKCkge1xuICAgIHJldHVybiBTVVBQT1JURURfQ09MVU1OX01PREVTO1xuICB9XG5cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRQb2ludENvbHVtblBhaXJzO1xuICB9XG5cbiAgZ2V0IG5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcygpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgdmlzdWFsQ2hhbm5lbHMoKTogVmlzdWFsQ2hhbm5lbHMge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBkYXRhc2V0U2VsZWN0b3IgPSAoY29uZmlnOiBNYXBib3hMYXllckdMQ29uZmlnKSA9PiBjb25maWcuZGF0YUlkO1xuICBncHVGaWx0ZXJTZWxlY3RvciA9IChjb25maWc6IE1hcGJveExheWVyR0xDb25maWcsIGRhdGFzZXRzKSA9PlxuICAgICgoY29uZmlnLmRhdGFJZCAmJiBkYXRhc2V0c1tjb25maWcuZGF0YUlkXSkgfHwge30pLmdwdUZpbHRlcjtcbiAgY29sdW1uc1NlbGVjdG9yID0gKGNvbmZpZzogTWFwYm94TGF5ZXJHTENvbmZpZykgPT5cbiAgICBwb2ludENvbFJlc29sdmVyKGNvbmZpZy5jb2x1bW5zLCBjb25maWcuY29sdW1uTW9kZSk7XG5cbiAgc291cmNlU2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLmRhdGFzZXRTZWxlY3RvcixcbiAgICB0aGlzLmNvbHVtbnNTZWxlY3RvcixcbiAgICAoZGF0YXNldElkLCBjb2x1bW5zKSA9PiBgJHtkYXRhc2V0SWR9LSR7Y29sdW1uc31gXG4gICk7XG5cbiAgZmlsdGVyU2VsZWN0b3IgPSBjcmVhdGVTZWxlY3Rvcih0aGlzLmdwdUZpbHRlclNlbGVjdG9yLCBncHVGaWx0ZXIgPT5cbiAgICBncHVGaWx0ZXJUb01hcGJveEZpbHRlcihncHVGaWx0ZXIpXG4gICk7XG5cbiAgaXNWYWxpZEZpbHRlcihmaWx0ZXIpIHtcbiAgICAvLyBtYXBib3ggd2lsbCBjcmFzaCBpZiBmaWx0ZXIgaXMgbm90IGFuIGFycmF5IG9yIGVtcHR5XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZmlsdGVyKSAmJiBmaWx0ZXIubGVuZ3RoO1xuICB9XG5cbiAgZ2V0RGF0YVVwZGF0ZVRyaWdnZXJzKHtmaWx0ZXJlZEluZGV4LCBncHVGaWx0ZXIsIGlkfTogS2VwbGVyVGFibGUpOiBhbnkge1xuICAgIGNvbnN0IHtjb2x1bW5zfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgY29uc3QgdmlzdWFsQ2hhbm5lbEZpZWxkcyA9IE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscykucmVkdWNlKFxuICAgICAgKGFjY3UsIHYpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIC4uLih0aGlzLmNvbmZpZ1t2LmZpZWxkXSA/IHtbdi5maWVsZF06IHRoaXMuY29uZmlnW3YuZmllbGRdLm5hbWV9IDoge30pXG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZVRyaWdnZXJzID0ge1xuICAgICAgZ2V0RGF0YToge1xuICAgICAgICBkYXRhc2V0SWQ6IGlkLFxuICAgICAgICBjb2x1bW5zLFxuICAgICAgICBmaWx0ZXJlZEluZGV4LFxuICAgICAgICAuLi52aXN1YWxDaGFubmVsRmllbGRzLFxuICAgICAgICAuLi5ncHVGaWx0ZXIuZmlsdGVyVmFsdWVVcGRhdGVUcmlnZ2Vyc1xuICAgICAgfSxcbiAgICAgIGdldE1ldGE6IHtkYXRhc2V0SWQ6IGlkLCBjb2x1bW5zfVxuICAgIH07XG5cbiAgICByZXR1cm4gdXBkYXRlVHJpZ2dlcnM7XG4gIH1cblxuICBnZXRHZW9tZXRyeShwb3NpdGlvbikge1xuICAgIHJldHVybiBwb3NpdGlvbi5ldmVyeShOdW1iZXIuaXNGaW5pdGUpXG4gICAgICA/IHtcbiAgICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICAgIGNvb3JkaW5hdGVzOiBwb3NpdGlvblxuICAgICAgICB9XG4gICAgICA6IG51bGw7XG4gIH1cblxuICBjYWxjdWxhdGVEYXRhQXR0cmlidXRlKHtkYXRhQ29udGFpbmVyLCBmaWx0ZXJlZEluZGV4LCBncHVGaWx0ZXJ9OiBLZXBsZXJUYWJsZSwgZ2V0UG9zaXRpb24pIHtcbiAgICBjb25zdCBnZXRHZW9tZXRyeSA9IGQgPT4gdGhpcy5nZXRHZW9tZXRyeShnZXRQb3NpdGlvbihkKSk7XG5cbiAgICBjb25zdCB2Y0ZpZWxkcyA9IE9iamVjdC52YWx1ZXModGhpcy52aXN1YWxDaGFubmVscylcbiAgICAgIC5tYXAodiA9PiB0aGlzLmNvbmZpZ1t2LmZpZWxkXSlcbiAgICAgIC5maWx0ZXIodiA9PiB2KTtcblxuICAgIGNvbnN0IGdldFByb3BlcnR5RnJvbVZpc3VhbENoYW5lbCA9IHZjRmllbGRzLmxlbmd0aFxuICAgICAgPyBkID0+XG4gICAgICAgICAgdmNGaWVsZHMucmVkdWNlKFxuICAgICAgICAgICAgKGFjY3UsIGZpZWxkKSA9PiAoe1xuICAgICAgICAgICAgICAuLi5hY2N1LFxuICAgICAgICAgICAgICBbZmllbGQubmFtZV06IGZpZWxkLnZhbHVlQWNjZXNzb3IoZClcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAge31cbiAgICAgICAgICApXG4gICAgICA6ICgpID0+ICh7fSk7XG5cbiAgICBjb25zdCB7ZmlsdGVyVmFsdWVVcGRhdGVUcmlnZ2VycywgZmlsdGVyVmFsdWVBY2Nlc3Nvcn0gPSBncHVGaWx0ZXI7XG5cbiAgICAvLyBncHVGaWVsZCBUbyBwcm9wZXJ0eVxuICAgIGNvbnN0IGhhc0ZpbHRlciA9IE9iamVjdC52YWx1ZXMoZmlsdGVyVmFsdWVVcGRhdGVUcmlnZ2VycykuZmlsdGVyKGQgPT4gZCkubGVuZ3RoO1xuICAgIGNvbnN0IHZhbHVlQWNjZXNzb3IgPSBmaWx0ZXJWYWx1ZUFjY2Vzc29yKGRhdGFDb250YWluZXIpKCk7XG5cbiAgICBjb25zdCBnZXRQcm9wZXJ0eUZyb21GaWx0ZXIgPSBoYXNGaWx0ZXJcbiAgICAgID8gZCA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZUFjY2Vzc29yKGQpO1xuICAgICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnMpLnJlZHVjZShcbiAgICAgICAgICAgIChhY2N1OiBhbnksIGdwdTogYW55LCBpKSA9PiAoe1xuICAgICAgICAgICAgICAuLi5hY2N1LFxuICAgICAgICAgICAgICAuLi4oZ3B1Py5uYW1lID8ge1twcmVmaXhHcHVGaWVsZChncHUubmFtZSldOiBmaWx0ZXJWYWx1ZVtpXX0gOiB7fSlcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAge30gYXMge1tpZDogc3RyaW5nXTogbnVtYmVyIHwgbnVtYmVyW119XG4gICAgICAgICAgKSBhcyBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBudW1iZXJbXT47XG4gICAgICAgIH1cbiAgICAgIDogKCkgPT4gKHt9IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlciB8IG51bWJlcltdPik7XG5cbiAgICBjb25zdCBnZXRQcm9wZXJ0aWVzID0gZCA9PiAoe1xuICAgICAgLi4uZ2V0UHJvcGVydHlGcm9tVmlzdWFsQ2hhbmVsKGQpLFxuICAgICAgLi4uZ2V0UHJvcGVydHlGcm9tRmlsdGVyKGQpXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ2VvSnNvbkZyb21EYXRhKGZpbHRlcmVkSW5kZXgsIGdldEdlb21ldHJ5LCBnZXRQcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8vIHRoaXMgbGF5ZXIgaXMgcmVuZGVyZWQgYXQgbWFwYm94IGxldmVsXG4gIC8vIHRvZG86IG1heWJlIG5lZWQgdG8gZmluZCBhIGJldHRlciBzb2x1dGlvbiBmb3IgdGhpcyBvbmVcbiAgc2hvdWxkUmVuZGVyTGF5ZXIoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLnR5cGUgPT09ICdzdHJpbmcnICYmIHRoaXMuY29uZmlnLmlzVmlzaWJsZSAmJiB0aGlzLmhhc0FsbENvbHVtbnMoKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXBib3hMYXllckdMO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLFVBQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLFlBQUEsR0FBQUYsT0FBQTtBQUF3RixTQUFBRyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQUwsd0JBQUFLLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLENBQUEsSUFBQWQsQ0FBQSxvQkFBQWMsQ0FBQSxPQUFBQyxjQUFBLENBQUFDLElBQUEsQ0FBQWhCLENBQUEsRUFBQWMsQ0FBQSxTQUFBRyxDQUFBLEdBQUFQLENBQUEsR0FBQUMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBYixDQUFBLEVBQUFjLENBQUEsVUFBQUcsQ0FBQSxLQUFBQSxDQUFBLENBQUFWLEdBQUEsSUFBQVUsQ0FBQSxDQUFBQyxHQUFBLElBQUFQLE1BQUEsQ0FBQUMsY0FBQSxDQUFBSixDQUFBLEVBQUFNLENBQUEsRUFBQUcsQ0FBQSxJQUFBVCxDQUFBLENBQUFNLENBQUEsSUFBQWQsQ0FBQSxDQUFBYyxDQUFBLFlBQUFOLENBQUEsY0FBQVIsQ0FBQSxFQUFBRyxDQUFBLElBQUFBLENBQUEsQ0FBQWUsR0FBQSxDQUFBbEIsQ0FBQSxFQUFBUSxDQUFBLEdBQUFBLENBQUE7QUFBQSxTQUFBVyxRQUFBbkIsQ0FBQSxFQUFBRSxDQUFBLFFBQUFDLENBQUEsR0FBQVEsTUFBQSxDQUFBUyxJQUFBLENBQUFwQixDQUFBLE9BQUFXLE1BQUEsQ0FBQVUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBWCxNQUFBLENBQUFVLHFCQUFBLENBQUFyQixDQUFBLEdBQUFFLENBQUEsS0FBQW9CLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFyQixDQUFBLFdBQUFTLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQWIsQ0FBQSxFQUFBRSxDQUFBLEVBQUFzQixVQUFBLE9BQUFyQixDQUFBLENBQUFzQixJQUFBLENBQUFDLEtBQUEsQ0FBQXZCLENBQUEsRUFBQW1CLENBQUEsWUFBQW5CLENBQUE7QUFBQSxTQUFBd0IsY0FBQTNCLENBQUEsYUFBQUUsQ0FBQSxNQUFBQSxDQUFBLEdBQUEwQixTQUFBLENBQUFDLE1BQUEsRUFBQTNCLENBQUEsVUFBQUMsQ0FBQSxXQUFBeUIsU0FBQSxDQUFBMUIsQ0FBQSxJQUFBMEIsU0FBQSxDQUFBMUIsQ0FBQSxRQUFBQSxDQUFBLE9BQUFpQixPQUFBLENBQUFSLE1BQUEsQ0FBQVIsQ0FBQSxPQUFBMkIsT0FBQSxXQUFBNUIsQ0FBQSxRQUFBNkIsZ0JBQUEsYUFBQS9CLENBQUEsRUFBQUUsQ0FBQSxFQUFBQyxDQUFBLENBQUFELENBQUEsU0FBQVMsTUFBQSxDQUFBcUIseUJBQUEsR0FBQXJCLE1BQUEsQ0FBQXNCLGdCQUFBLENBQUFqQyxDQUFBLEVBQUFXLE1BQUEsQ0FBQXFCLHlCQUFBLENBQUE3QixDQUFBLEtBQUFnQixPQUFBLENBQUFSLE1BQUEsQ0FBQVIsQ0FBQSxHQUFBMkIsT0FBQSxXQUFBNUIsQ0FBQSxJQUFBUyxNQUFBLENBQUFDLGNBQUEsQ0FBQVosQ0FBQSxFQUFBRSxDQUFBLEVBQUFTLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQVYsQ0FBQSxFQUFBRCxDQUFBLGlCQUFBRixDQUFBO0FBQUEsU0FBQWtDLFdBQUEvQixDQUFBLEVBQUFtQixDQUFBLEVBQUF0QixDQUFBLFdBQUFzQixDQUFBLE9BQUFhLGdCQUFBLGFBQUFiLENBQUEsT0FBQWMsMkJBQUEsYUFBQWpDLENBQUEsRUFBQWtDLHlCQUFBLEtBQUFDLE9BQUEsQ0FBQUMsU0FBQSxDQUFBakIsQ0FBQSxFQUFBdEIsQ0FBQSxZQUFBbUMsZ0JBQUEsYUFBQWhDLENBQUEsRUFBQXFDLFdBQUEsSUFBQWxCLENBQUEsQ0FBQUksS0FBQSxDQUFBdkIsQ0FBQSxFQUFBSCxDQUFBO0FBQUEsU0FBQXFDLDBCQUFBLGNBQUFsQyxDQUFBLElBQUFzQyxPQUFBLENBQUFDLFNBQUEsQ0FBQUMsT0FBQSxDQUFBM0IsSUFBQSxDQUFBc0IsT0FBQSxDQUFBQyxTQUFBLENBQUFFLE9BQUEsaUNBQUF0QyxDQUFBLGFBQUFrQyx5QkFBQSxZQUFBQSwwQkFBQSxhQUFBbEMsQ0FBQSxVQU54RjtBQUNBO0FBbUJPLElBQU15QyxrQkFBa0IsR0FBQUMsT0FBQSxDQUFBRCxrQkFBQSxHQUFHLFFBQVE7QUFDbkMsSUFBTUUscUJBQXFCLEdBQUFELE9BQUEsQ0FBQUMscUJBQUEsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7QUFDbkQsSUFBTUMsc0JBQXNCLEdBQUcsQ0FDN0I7RUFDRUMsR0FBRyxFQUFFSixrQkFBa0I7RUFDdkJLLEtBQUssRUFBRSxRQUFRO0VBQ2ZDLGVBQWUsRUFBRUo7QUFDbkIsQ0FBQyxDQUNGO0FBRU0sSUFBTUssZ0JBQWdCLEdBQUFOLE9BQUEsQ0FBQU0sZ0JBQUEsR0FBRyxTQUFuQkEsZ0JBQWdCQSxDQUFBQyxJQUFBLEVBQWdEQyxVQUFtQjtFQUFBLElBQTlEQyxHQUFHLEdBQUFGLElBQUEsQ0FBSEUsR0FBRztJQUFFQyxHQUFHLEdBQUFILElBQUEsQ0FBSEcsR0FBRztJQUFFQyxRQUFRLEdBQUFKLElBQUEsQ0FBUkksUUFBUTtFQUFBLFVBQUFDLE1BQUEsQ0FDL0NKLFVBQVUsT0FBQUksTUFBQSxDQUFJSCxHQUFHLENBQUNJLFFBQVEsT0FBQUQsTUFBQSxDQUFJRixHQUFHLENBQUNHLFFBQVEsT0FBQUQsTUFBQSxDQUFJRCxRQUFRLGFBQVJBLFFBQVEsdUJBQVJBLFFBQVEsQ0FBRUUsUUFBUTtBQUFBLENBQUU7QUFBQyxJQUVsRUMsYUFBYSwwQkFBQUMsTUFBQTtFQUFBLFNBQUFELGNBQUE7SUFBQSxJQUFBRSxLQUFBO0lBQUEsSUFBQUMsZ0JBQUEsbUJBQUFILGFBQUE7SUFBQSxTQUFBSSxJQUFBLEdBQUFuQyxTQUFBLENBQUFDLE1BQUEsRUFBQW1DLElBQUEsT0FBQUMsS0FBQSxDQUFBRixJQUFBLEdBQUFHLElBQUEsTUFBQUEsSUFBQSxHQUFBSCxJQUFBLEVBQUFHLElBQUE7TUFBQUYsSUFBQSxDQUFBRSxJQUFBLElBQUF0QyxTQUFBLENBQUFzQyxJQUFBO0lBQUE7SUFBQUwsS0FBQSxHQUFBM0IsVUFBQSxPQUFBeUIsYUFBQSxLQUFBRixNQUFBLENBQUFPLElBQUE7SUFBQSxJQUFBakMsZ0JBQUEsYUFBQThCLEtBQUEscUJBOEJDLFVBQUNNLE1BQTJCO01BQUEsT0FBS0EsTUFBTSxDQUFDQyxNQUFNO0lBQUE7SUFBQSxJQUFBckMsZ0JBQUEsYUFBQThCLEtBQUEsdUJBQzVDLFVBQUNNLE1BQTJCLEVBQUVFLFFBQVE7TUFBQSxPQUN4RCxDQUFFRixNQUFNLENBQUNDLE1BQU0sSUFBSUMsUUFBUSxDQUFDRixNQUFNLENBQUNDLE1BQU0sQ0FBQyxJQUFLLENBQUMsQ0FBQyxFQUFFRSxTQUFTO0lBQUE7SUFBQSxJQUFBdkMsZ0JBQUEsYUFBQThCLEtBQUEscUJBQzVDLFVBQUNNLE1BQTJCO01BQUEsT0FDNUNoQixnQkFBZ0IsQ0FBQ2dCLE1BQU0sQ0FBQ0ksT0FBTyxFQUFFSixNQUFNLENBQUNkLFVBQVUsQ0FBQztJQUFBO0lBQUEsSUFBQXRCLGdCQUFBLGFBQUE4QixLQUFBLG9CQUVwQyxJQUFBVyx3QkFBYyxFQUM3QlgsS0FBQSxDQUFLWSxlQUFlLEVBQ3BCWixLQUFBLENBQUthLGVBQWUsRUFDcEIsVUFBQ0MsU0FBUyxFQUFFSixPQUFPO01BQUEsVUFBQWQsTUFBQSxDQUFRa0IsU0FBUyxPQUFBbEIsTUFBQSxDQUFJYyxPQUFPO0lBQUEsQ0FDakQsQ0FBQztJQUFBLElBQUF4QyxnQkFBQSxhQUFBOEIsS0FBQSxvQkFFZ0IsSUFBQVcsd0JBQWMsRUFBQ1gsS0FBQSxDQUFLZSxpQkFBaUIsRUFBRSxVQUFBTixTQUFTO01BQUEsT0FDL0QsSUFBQU8sb0NBQXVCLEVBQUNQLFNBQVMsQ0FBQztJQUFBLENBQ3BDLENBQUM7SUFBQSxPQUFBVCxLQUFBO0VBQUE7RUFBQSxJQUFBaUIsVUFBQSxhQUFBbkIsYUFBQSxFQUFBQyxNQUFBO0VBQUEsV0FBQW1CLGFBQUEsYUFBQXBCLGFBQUE7SUFBQVgsR0FBQTtJQUFBekMsR0FBQSxFQXpDRCxTQUFBQSxJQUFBLEVBQWtCO01BQ2hCLE9BQU95RSw2QkFBa0IsQ0FBQ0MsUUFBUTtJQUNwQztFQUFDO0lBQUFqQyxHQUFBO0lBQUF6QyxHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUEwQjtNQUN4QixPQUFPLElBQUk7SUFDYjtFQUFDO0lBQUF5QyxHQUFBO0lBQUF6QyxHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUF5QjtNQUN2QixPQUFPLElBQUk7SUFDYjtFQUFDO0lBQUF5QyxHQUFBO0lBQUF6QyxHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUEyQjtNQUN6QixPQUFPd0Msc0JBQXNCO0lBQy9CO0VBQUM7SUFBQUMsR0FBQTtJQUFBekMsR0FBQSxFQUVELFNBQUFBLElBQUEsRUFBa0I7TUFDaEIsT0FBTyxJQUFJLENBQUMyRSx1QkFBdUI7SUFDckM7RUFBQztJQUFBbEMsR0FBQTtJQUFBekMsR0FBQSxFQUVELFNBQUFBLElBQUEsRUFBa0M7TUFDaEMsT0FBTyxFQUFFO0lBQ1g7RUFBQztJQUFBeUMsR0FBQTtJQUFBekMsR0FBQSxFQUVELFNBQUFBLElBQUEsRUFBcUM7TUFDbkMsT0FBTyxDQUFDLENBQUM7SUFDWDtFQUFDO0lBQUF5QyxHQUFBO0lBQUFtQyxLQUFBLEVBaUJELFNBQUFDLGFBQWFBLENBQUM3RCxNQUFNLEVBQUU7TUFDcEI7TUFDQSxPQUFPMEMsS0FBSyxDQUFDb0IsT0FBTyxDQUFDOUQsTUFBTSxDQUFDLElBQUlBLE1BQU0sQ0FBQ00sTUFBTTtJQUMvQztFQUFDO0lBQUFtQixHQUFBO0lBQUFtQyxLQUFBLEVBRUQsU0FBQUcscUJBQXFCQSxDQUFBQyxLQUFBLEVBQW1EO01BQUEsSUFBQUMsTUFBQTtNQUFBLElBQWpEQyxhQUFhLEdBQUFGLEtBQUEsQ0FBYkUsYUFBYTtRQUFFbkIsU0FBUyxHQUFBaUIsS0FBQSxDQUFUakIsU0FBUztRQUFFb0IsRUFBRSxHQUFBSCxLQUFBLENBQUZHLEVBQUU7TUFDakQsSUFBT25CLE9BQU8sR0FBSSxJQUFJLENBQUNKLE1BQU0sQ0FBdEJJLE9BQU87TUFFZCxJQUFNb0IsbUJBQW1CLEdBQUdoRixNQUFNLENBQUNpRixNQUFNLENBQUMsSUFBSSxDQUFDQyxjQUFjLENBQUMsQ0FBQ0MsTUFBTSxDQUNuRSxVQUFDQyxJQUFJLEVBQUVDLENBQUM7UUFBQSxPQUFBckUsYUFBQSxDQUFBQSxhQUFBLEtBQ0hvRSxJQUFJLEdBQ0hQLE1BQUksQ0FBQ3JCLE1BQU0sQ0FBQzZCLENBQUMsQ0FBQ0MsS0FBSyxDQUFDLE9BQUFsRSxnQkFBQSxpQkFBS2lFLENBQUMsQ0FBQ0MsS0FBSyxFQUFHVCxNQUFJLENBQUNyQixNQUFNLENBQUM2QixDQUFDLENBQUNDLEtBQUssQ0FBQyxDQUFDQyxJQUFJLElBQUksQ0FBQyxDQUFDO01BQUEsQ0FDdEUsRUFDRixDQUFDLENBQ0gsQ0FBQztNQUVELElBQU1DLGNBQWMsR0FBRztRQUNyQkMsT0FBTyxFQUFBekUsYUFBQSxDQUFBQSxhQUFBO1VBQ0xnRCxTQUFTLEVBQUVlLEVBQUU7VUFDYm5CLE9BQU8sRUFBUEEsT0FBTztVQUNQa0IsYUFBYSxFQUFiQTtRQUFhLEdBQ1ZFLG1CQUFtQixHQUNuQnJCLFNBQVMsQ0FBQytCLHlCQUF5QixDQUN2QztRQUNEQyxPQUFPLEVBQUU7VUFBQzNCLFNBQVMsRUFBRWUsRUFBRTtVQUFFbkIsT0FBTyxFQUFQQTtRQUFPO01BQ2xDLENBQUM7TUFFRCxPQUFPNEIsY0FBYztJQUN2QjtFQUFDO0lBQUFuRCxHQUFBO0lBQUFtQyxLQUFBLEVBRUQsU0FBQW9CLFdBQVdBLENBQUNDLFFBQVEsRUFBRTtNQUNwQixPQUFPQSxRQUFRLENBQUNDLEtBQUssQ0FBQ0MsTUFBTSxDQUFDQyxRQUFRLENBQUMsR0FDbEM7UUFDRUMsSUFBSSxFQUFFLE9BQU87UUFDYkMsV0FBVyxFQUFFTDtNQUNmLENBQUMsR0FDRCxJQUFJO0lBQ1Y7RUFBQztJQUFBeEQsR0FBQTtJQUFBbUMsS0FBQSxFQUVELFNBQUEyQixzQkFBc0JBLENBQUFDLEtBQUEsRUFBeURDLFdBQVcsRUFBRTtNQUFBLElBQUFDLE1BQUE7TUFBQSxJQUFwRUMsYUFBYSxHQUFBSCxLQUFBLENBQWJHLGFBQWE7UUFBRXpCLGFBQWEsR0FBQXNCLEtBQUEsQ0FBYnRCLGFBQWE7UUFBRW5CLFNBQVMsR0FBQXlDLEtBQUEsQ0FBVHpDLFNBQVM7TUFDN0QsSUFBTWlDLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFHWSxDQUFDO1FBQUEsT0FBSUYsTUFBSSxDQUFDVixXQUFXLENBQUNTLFdBQVcsQ0FBQ0csQ0FBQyxDQUFDLENBQUM7TUFBQTtNQUV6RCxJQUFNQyxRQUFRLEdBQUd6RyxNQUFNLENBQUNpRixNQUFNLENBQUMsSUFBSSxDQUFDQyxjQUFjLENBQUMsQ0FDaER3QixHQUFHLENBQUMsVUFBQXJCLENBQUM7UUFBQSxPQUFJaUIsTUFBSSxDQUFDOUMsTUFBTSxDQUFDNkIsQ0FBQyxDQUFDQyxLQUFLLENBQUM7TUFBQSxFQUFDLENBQzlCMUUsTUFBTSxDQUFDLFVBQUF5RSxDQUFDO1FBQUEsT0FBSUEsQ0FBQztNQUFBLEVBQUM7TUFFakIsSUFBTXNCLDJCQUEyQixHQUFHRixRQUFRLENBQUN2RixNQUFNLEdBQy9DLFVBQUFzRixDQUFDO1FBQUEsT0FDQ0MsUUFBUSxDQUFDdEIsTUFBTSxDQUNiLFVBQUNDLElBQUksRUFBRUUsS0FBSztVQUFBLE9BQUF0RSxhQUFBLENBQUFBLGFBQUEsS0FDUG9FLElBQUksV0FBQWhFLGdCQUFBLGlCQUNOa0UsS0FBSyxDQUFDQyxJQUFJLEVBQUdELEtBQUssQ0FBQ3NCLGFBQWEsQ0FBQ0osQ0FBQyxDQUFDO1FBQUEsQ0FDcEMsRUFDRixDQUFDLENBQ0gsQ0FBQztNQUFBLElBQ0g7UUFBQSxPQUFPLENBQUMsQ0FBQztNQUFBLENBQUM7TUFFZCxJQUFPZCx5QkFBeUIsR0FBeUIvQixTQUFTLENBQTNEK0IseUJBQXlCO1FBQUVtQixtQkFBbUIsR0FBSWxELFNBQVMsQ0FBaENrRCxtQkFBbUI7O01BRXJEO01BQ0EsSUFBTUMsU0FBUyxHQUFHOUcsTUFBTSxDQUFDaUYsTUFBTSxDQUFDUyx5QkFBeUIsQ0FBQyxDQUFDOUUsTUFBTSxDQUFDLFVBQUE0RixDQUFDO1FBQUEsT0FBSUEsQ0FBQztNQUFBLEVBQUMsQ0FBQ3RGLE1BQU07TUFDaEYsSUFBTTBGLGFBQWEsR0FBR0MsbUJBQW1CLENBQUNOLGFBQWEsQ0FBQyxDQUFDLENBQUM7TUFFMUQsSUFBTVEscUJBQXFCLEdBQUdELFNBQVMsR0FDbkMsVUFBQU4sQ0FBQyxFQUFJO1FBQ0gsSUFBTVEsV0FBVyxHQUFHSixhQUFhLENBQUNKLENBQUMsQ0FBQztRQUNwQyxPQUFPeEcsTUFBTSxDQUFDaUYsTUFBTSxDQUFDUyx5QkFBeUIsQ0FBQyxDQUFDUCxNQUFNLENBQ3BELFVBQUNDLElBQVMsRUFBRTZCLEdBQVEsRUFBRTNHLENBQUM7VUFBQSxPQUFBVSxhQUFBLENBQUFBLGFBQUEsS0FDbEJvRSxJQUFJLEdBQ0g2QixHQUFHLGFBQUhBLEdBQUcsZUFBSEEsR0FBRyxDQUFFMUIsSUFBSSxPQUFBbkUsZ0JBQUEsaUJBQUssSUFBQThGLDJCQUFjLEVBQUNELEdBQUcsQ0FBQzFCLElBQUksQ0FBQyxFQUFHeUIsV0FBVyxDQUFDMUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQUEsQ0FDakUsRUFDRixDQUFDLENBQ0gsQ0FBQztNQUNILENBQUMsR0FDRDtRQUFBLE9BQU8sQ0FBQyxDQUFDO01BQUEsQ0FBc0M7TUFFbkQsSUFBTTZHLGFBQWEsR0FBRyxTQUFoQkEsYUFBYUEsQ0FBR1gsQ0FBQztRQUFBLE9BQUF4RixhQUFBLENBQUFBLGFBQUEsS0FDbEIyRiwyQkFBMkIsQ0FBQ0gsQ0FBQyxDQUFDLEdBQzlCTyxxQkFBcUIsQ0FBQ1AsQ0FBQyxDQUFDO01BQUEsQ0FDM0I7TUFFRixPQUFPLElBQUFZLDRCQUFlLEVBQUN0QyxhQUFhLEVBQUVjLFdBQVcsRUFBRXVCLGFBQWEsQ0FBQztJQUNuRTs7SUFFQTtJQUNBO0VBQUE7SUFBQTlFLEdBQUE7SUFBQW1DLEtBQUEsRUFDQSxTQUFBNkMsaUJBQWlCQSxDQUFBLEVBQUc7TUFDbEIsT0FBTyxPQUFPLElBQUksQ0FBQ3BCLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDekMsTUFBTSxDQUFDOEQsU0FBUyxJQUFJLElBQUksQ0FBQ0MsYUFBYSxDQUFDLENBQUM7SUFDdkY7RUFBQztBQUFBLEVBdEl5QkMscUJBQUs7QUFBQSxJQUFBQyxRQUFBLEdBQUF2RixPQUFBLGNBeUlsQmMsYUFBYSIsImlnbm9yZUxpc3QiOltdfQ==
;