kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
295 lines (294 loc) • 40.5 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.s2RequiredColumns = exports.defaultLineWidth = exports.defaultElevation = exports["default"] = exports.S2_TOKEN_FIELDS = exports.S2VisConfigs = exports.S2TokenAccessor = 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 _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _geoLayers = require("@deck.gl/geo-layers");
var _constants = require("@kepler.gl/constants");
var _baseLayer = _interopRequireDefault(require("../base-layer"));
var _s2LayerIcon = _interopRequireDefault(require("./s2-layer-icon"));
var _s2Utils = require("./s2-utils");
var _utils = require("@kepler.gl/utils");
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; })(); }
function _superPropGet(t, e, r, o) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & o ? t.prototype : t), e, r); return 2 & o ? function (t) { return p.apply(r, t); } : p; }
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
var zoomFactorValue = 8;
var S2_TOKEN_FIELDS = exports.S2_TOKEN_FIELDS = {
token: ['s2', 's2_token']
};
var s2RequiredColumns = exports.s2RequiredColumns = ['token'];
var S2TokenAccessor = exports.S2TokenAccessor = function S2TokenAccessor(_ref) {
var token = _ref.token;
return function (dc) {
return function (d) {
return dc.valueAt(d.index, token.fieldIdx);
};
};
};
var defaultElevation = exports.defaultElevation = 500;
var defaultLineWidth = exports.defaultLineWidth = 1;
var S2VisConfigs = exports.S2VisConfigs = {
// Filled color
opacity: 'opacity',
colorRange: 'colorRange',
filled: _objectSpread(_objectSpread({}, _constants.LAYER_VIS_CONFIGS.filled), {}, {
type: 'boolean',
label: 'Fill Color',
defaultValue: true,
property: 'filled'
}),
// stroke
thickness: _objectSpread(_objectSpread({}, _constants.LAYER_VIS_CONFIGS.thickness), {}, {
defaultValue: 0.5
}),
strokeColor: 'strokeColor',
strokeColorRange: 'strokeColorRange',
sizeRange: 'strokeWidthRange',
stroked: 'stroked',
// height
enable3d: 'enable3d',
elevationScale: 'elevationScale',
enableElevationZoomFactor: 'enableElevationZoomFactor',
fixedHeight: 'fixedHeight',
heightRange: 'elevationRange',
// wireframe
wireframe: 'wireframe'
};
var S2GeometryLayer = exports["default"] = /*#__PURE__*/function (_Layer) {
function S2GeometryLayer(props) {
var _this;
(0, _classCallCheck2["default"])(this, S2GeometryLayer);
_this = _callSuper(this, S2GeometryLayer, [props]);
(0, _defineProperty2["default"])(_this, "dataToFeature", void 0);
_this.registerVisConfig(S2VisConfigs);
_this.getPositionAccessor = function (dataContainer) {
return S2TokenAccessor(_this.config.columns)(dataContainer);
};
return _this;
}
(0, _inherits2["default"])(S2GeometryLayer, _Layer);
return (0, _createClass2["default"])(S2GeometryLayer, [{
key: "type",
get: function get() {
return 's2';
}
}, {
key: "name",
get: function get() {
return 'S2';
}
}, {
key: "requiredLayerColumns",
get: function get() {
return s2RequiredColumns;
}
}, {
key: "layerIcon",
get: function get() {
return _s2LayerIcon["default"];
}
}, {
key: "visualChannels",
get: function get() {
var visualChannels = _superPropGet(S2GeometryLayer, "visualChannels", this, 1);
return {
color: _objectSpread(_objectSpread({}, visualChannels.color), {}, {
accessor: 'getFillColor'
}),
size: _objectSpread(_objectSpread({}, visualChannels.size), {}, {
property: 'stroke',
accessor: 'getLineWidth',
condition: function condition(config) {
return config.visConfig.stroked;
},
defaultValue: defaultLineWidth
}),
strokeColor: {
property: 'strokeColor',
field: 'strokeColorField',
scale: 'strokeColorScale',
domain: 'strokeColorDomain',
range: 'strokeColorRange',
key: 'strokeColor',
channelScaleType: _constants.CHANNEL_SCALES.color,
accessor: 'getLineColor',
condition: function condition(config) {
return config.visConfig.stroked;
},
nullValue: visualChannels.color.nullValue,
defaultValue: function defaultValue(config) {
return config.visConfig.strokeColor || config.color;
}
},
height: {
property: 'height',
field: 'heightField',
scale: 'heightScale',
domain: 'heightDomain',
range: 'heightRange',
key: 'height',
channelScaleType: _constants.CHANNEL_SCALES.size,
accessor: 'getElevation',
condition: function condition(config) {
return config.visConfig.enable3d;
},
nullValue: 0,
defaultValue: defaultElevation
}
};
}
}, {
key: "getDefaultLayerConfig",
value: function getDefaultLayerConfig(props) {
var defaultLayerConfig = _superPropGet(S2GeometryLayer, "getDefaultLayerConfig", this, 3)([props !== null && props !== void 0 ? props : {}]);
return _objectSpread(_objectSpread({}, defaultLayerConfig), {}, {
// add height visual channel
heightField: null,
heightDomain: [0, 1],
heightScale: 'linear',
// add stroke color visual channel
strokeColorField: null,
strokeColorDomain: [0, 1],
strokeColorScale: 'quantile',
colorUI: _objectSpread(_objectSpread({}, defaultLayerConfig.colorUI), {}, {
strokeColorRange: _constants.DEFAULT_COLOR_UI
})
});
}
}, {
key: "calculateDataAttribute",
value: function calculateDataAttribute(_ref2, getS2Token) {
var filteredIndex = _ref2.filteredIndex;
var data = [];
for (var i = 0; i < filteredIndex.length; i++) {
var index = filteredIndex[i];
var token = getS2Token({
index: index
});
if ((0, _s2Utils.validS2Token)(token)) {
data.push({
index: index,
token: token
});
}
}
return data;
}
}, {
key: "updateLayerMeta",
value: function updateLayerMeta(dataset, getS2Token) {
var dataContainer = dataset.dataContainer;
// add safe row flag
var centroids = dataContainer.reduce(function (acc, entry, index) {
var s2Token = getS2Token({
index: index
});
if ((0, _s2Utils.validS2Token)(s2Token)) {
acc.push((0, _s2Utils.getS2Center)(s2Token));
}
return acc;
}, [], true);
var centroidsDataContainer = (0, _utils.createDataContainer)(centroids);
var bounds = this.getPointsBounds(centroidsDataContainer, function (d, dc) {
return [dc.valueAt(d.index, 0), dc.valueAt(d.index, 1)];
});
this.dataToFeature = {
centroids: centroids
};
this.updateMeta({
bounds: bounds
});
}
}, {
key: "formatLayerData",
value: function formatLayerData(datasets, oldLayerData) {
if (this.config.dataId === null) {
return {};
}
var _datasets$this$config = datasets[this.config.dataId],
gpuFilter = _datasets$this$config.gpuFilter,
dataContainer = _datasets$this$config.dataContainer;
var getS2Token = this.getPositionAccessor(dataContainer);
var _this$updateData = this.updateData(datasets, oldLayerData),
data = _this$updateData.data;
var accessors = this.getAttributeAccessors({
dataContainer: dataContainer
});
return _objectSpread({
data: data,
getS2Token: getS2Token,
getFilterValue: gpuFilter.filterValueAccessor(dataContainer)()
}, accessors);
}
}, {
key: "renderLayer",
value: function renderLayer(opts) {
var data = opts.data,
gpuFilter = opts.gpuFilter,
interactionConfig = opts.interactionConfig,
mapState = opts.mapState;
var defaultLayerProps = this.getDefaultDeckLayerProps(opts);
var eleZoomFactor = this.getElevationZoomFactor(mapState);
var zoomFactor = this.getZoomFactor(mapState);
var config = this.config;
var visConfig = config.visConfig;
var updateTriggers = _objectSpread(_objectSpread({}, this.getVisualChannelUpdateTriggers()), {}, {
getFilterValue: gpuFilter.filterValueUpdateTriggers
});
return [new _geoLayers.S2Layer(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, defaultLayerProps), interactionConfig), data), {}, {
getS2Token: function getS2Token(d) {
return d.token;
},
autoHighlight: visConfig.enable3d,
highlightColor: _constants.HIGHLIGH_COLOR_3D,
// stroke
lineWidthScale: visConfig.thickness * zoomFactor * zoomFactorValue,
stroked: visConfig.stroked,
lineMiterLimit: 2,
// Filled color
filled: visConfig.filled,
opacity: visConfig.opacity,
wrapLongitude: false,
// Elevation
elevationScale: visConfig.elevationScale * eleZoomFactor,
extruded: visConfig.enable3d,
wireframe: visConfig.wireframe,
pickable: true,
updateTriggers: updateTriggers
}))];
}
}], [{
key: "findDefaultLayerProps",
value: function findDefaultLayerProps(_ref3) {
var _ref3$fields = _ref3.fields,
fields = _ref3$fields === void 0 ? [] : _ref3$fields;
var foundColumns = this.findDefaultColumnField(S2_TOKEN_FIELDS, fields);
if (!foundColumns || !foundColumns.length) {
return {
props: []
};
}
return {
props: foundColumns.map(function (columns) {
return {
isVisible: true,
label: 'S2',
columns: columns
};
})
};
}
}]);
}(_baseLayer["default"]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ2VvTGF5ZXJzIiwicmVxdWlyZSIsIl9jb25zdGFudHMiLCJfYmFzZUxheWVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9zMkxheWVySWNvbiIsIl9zMlV0aWxzIiwiX3V0aWxzIiwiX2NhbGxTdXBlciIsInQiLCJvIiwiZSIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiYXBwbHkiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsImNhbGwiLCJfc3VwZXJQcm9wR2V0IiwiciIsInAiLCJfZ2V0MiIsIm93bktleXMiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5Iiwiem9vbUZhY3RvclZhbHVlIiwiUzJfVE9LRU5fRklFTERTIiwiZXhwb3J0cyIsInRva2VuIiwiczJSZXF1aXJlZENvbHVtbnMiLCJTMlRva2VuQWNjZXNzb3IiLCJfcmVmIiwiZGMiLCJkIiwidmFsdWVBdCIsImluZGV4IiwiZmllbGRJZHgiLCJkZWZhdWx0RWxldmF0aW9uIiwiZGVmYXVsdExpbmVXaWR0aCIsIlMyVmlzQ29uZmlncyIsIm9wYWNpdHkiLCJjb2xvclJhbmdlIiwiZmlsbGVkIiwiTEFZRVJfVklTX0NPTkZJR1MiLCJ0eXBlIiwibGFiZWwiLCJkZWZhdWx0VmFsdWUiLCJwcm9wZXJ0eSIsInRoaWNrbmVzcyIsInN0cm9rZUNvbG9yIiwic3Ryb2tlQ29sb3JSYW5nZSIsInNpemVSYW5nZSIsInN0cm9rZWQiLCJlbmFibGUzZCIsImVsZXZhdGlvblNjYWxlIiwiZW5hYmxlRWxldmF0aW9uWm9vbUZhY3RvciIsImZpeGVkSGVpZ2h0IiwiaGVpZ2h0UmFuZ2UiLCJ3aXJlZnJhbWUiLCJTMkdlb21ldHJ5TGF5ZXIiLCJfTGF5ZXIiLCJwcm9wcyIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsInJlZ2lzdGVyVmlzQ29uZmlnIiwiZ2V0UG9zaXRpb25BY2Nlc3NvciIsImRhdGFDb250YWluZXIiLCJjb25maWciLCJjb2x1bW5zIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJnZXQiLCJTMkxheWVySWNvbiIsInZpc3VhbENoYW5uZWxzIiwiY29sb3IiLCJhY2Nlc3NvciIsInNpemUiLCJjb25kaXRpb24iLCJ2aXNDb25maWciLCJmaWVsZCIsInNjYWxlIiwiZG9tYWluIiwicmFuZ2UiLCJjaGFubmVsU2NhbGVUeXBlIiwiQ0hBTk5FTF9TQ0FMRVMiLCJudWxsVmFsdWUiLCJoZWlnaHQiLCJ2YWx1ZSIsImdldERlZmF1bHRMYXllckNvbmZpZyIsImRlZmF1bHRMYXllckNvbmZpZyIsImhlaWdodEZpZWxkIiwiaGVpZ2h0RG9tYWluIiwiaGVpZ2h0U2NhbGUiLCJzdHJva2VDb2xvckZpZWxkIiwic3Ryb2tlQ29sb3JEb21haW4iLCJzdHJva2VDb2xvclNjYWxlIiwiY29sb3JVSSIsIkRFRkFVTFRfQ09MT1JfVUkiLCJjYWxjdWxhdGVEYXRhQXR0cmlidXRlIiwiX3JlZjIiLCJnZXRTMlRva2VuIiwiZmlsdGVyZWRJbmRleCIsImRhdGEiLCJpIiwidmFsaWRTMlRva2VuIiwidXBkYXRlTGF5ZXJNZXRhIiwiZGF0YXNldCIsImNlbnRyb2lkcyIsInJlZHVjZSIsImFjYyIsImVudHJ5IiwiczJUb2tlbiIsImdldFMyQ2VudGVyIiwiY2VudHJvaWRzRGF0YUNvbnRhaW5lciIsImNyZWF0ZURhdGFDb250YWluZXIiLCJib3VuZHMiLCJnZXRQb2ludHNCb3VuZHMiLCJkYXRhVG9GZWF0dXJlIiwidXBkYXRlTWV0YSIsImZvcm1hdExheWVyRGF0YSIsImRhdGFzZXRzIiwib2xkTGF5ZXJEYXRhIiwiZGF0YUlkIiwiX2RhdGFzZXRzJHRoaXMkY29uZmlnIiwiZ3B1RmlsdGVyIiwiX3RoaXMkdXBkYXRlRGF0YSIsInVwZGF0ZURhdGEiLCJhY2Nlc3NvcnMiLCJnZXRBdHRyaWJ1dGVBY2Nlc3NvcnMiLCJnZXRGaWx0ZXJWYWx1ZSIsImZpbHRlclZhbHVlQWNjZXNzb3IiLCJyZW5kZXJMYXllciIsIm9wdHMiLCJpbnRlcmFjdGlvbkNvbmZpZyIsIm1hcFN0YXRlIiwiZGVmYXVsdExheWVyUHJvcHMiLCJnZXREZWZhdWx0RGVja0xheWVyUHJvcHMiLCJlbGVab29tRmFjdG9yIiwiZ2V0RWxldmF0aW9uWm9vbUZhY3RvciIsInpvb21GYWN0b3IiLCJnZXRab29tRmFjdG9yIiwidXBkYXRlVHJpZ2dlcnMiLCJnZXRWaXN1YWxDaGFubmVsVXBkYXRlVHJpZ2dlcnMiLCJmaWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzIiwiUzJMYXllciIsImF1dG9IaWdobGlnaHQiLCJoaWdobGlnaHRDb2xvciIsIkhJR0hMSUdIX0NPTE9SXzNEIiwibGluZVdpZHRoU2NhbGUiLCJsaW5lTWl0ZXJMaW1pdCIsIndyYXBMb25naXR1ZGUiLCJleHRydWRlZCIsInBpY2thYmxlIiwiZmluZERlZmF1bHRMYXllclByb3BzIiwiX3JlZjMiLCJfcmVmMyRmaWVsZHMiLCJmaWVsZHMiLCJmb3VuZENvbHVtbnMiLCJmaW5kRGVmYXVsdENvbHVtbkZpZWxkIiwibWFwIiwiaXNWaXNpYmxlIiwiTGF5ZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvczItZ2VvbWV0cnktbGF5ZXIvczItZ2VvbWV0cnktbGF5ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtTMkxheWVyfSBmcm9tICdAZGVjay5nbC9nZW8tbGF5ZXJzJztcbmltcG9ydCB7XG4gIEhJR0hMSUdIX0NPTE9SXzNELFxuICBDSEFOTkVMX1NDQUxFUyxcbiAgTEFZRVJfVklTX0NPTkZJR1MsXG4gIERFRkFVTFRfQ09MT1JfVUlcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIEtlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCBMYXllciwge1xuICBMYXllckJhc2VDb25maWcsXG4gIExheWVyQmFzZUNvbmZpZ1BhcnRpYWwsXG4gIExheWVyQ29sb3JDb25maWcsXG4gIExheWVyU2l6ZUNvbmZpZyxcbiAgTGF5ZXJTdHJva2VDb2xvckNvbmZpZyxcbiAgTGF5ZXJIZWlnaHRDb25maWdcbn0gZnJvbSAnLi4vYmFzZS1sYXllcic7XG5pbXBvcnQge1xuICBDb2xvclJhbmdlLFxuICBNZXJnZSxcbiAgUkdCQ29sb3IsXG4gIFZpc0NvbmZpZ0Jvb2xlYW4sXG4gIFZpc0NvbmZpZ0NvbG9yUmFuZ2UsXG4gIFZpc0NvbmZpZ0NvbG9yU2VsZWN0LFxuICBWaXNDb25maWdOdW1iZXIsXG4gIFZpc0NvbmZpZ1JhbmdlLFxuICBMYXllckNvbHVtblxufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCBTMkxheWVySWNvbiBmcm9tICcuL3MyLWxheWVyLWljb24nO1xuaW1wb3J0IHtnZXRTMkNlbnRlciwgdmFsaWRTMlRva2VufSBmcm9tICcuL3MyLXV0aWxzJztcbmltcG9ydCB7RGF0YUNvbnRhaW5lckludGVyZmFjZSwgY3JlYXRlRGF0YUNvbnRhaW5lcn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmV4cG9ydCB0eXBlIFMyR2VvbWV0cnlMYXllclZpc0NvbmZpZ1NldHRpbmdzID0ge1xuICBvcGFjaXR5OiBWaXNDb25maWdOdW1iZXI7XG4gIGNvbG9yUmFuZ2U6IFZpc0NvbmZpZ0NvbG9yUmFuZ2U7XG4gIGZpbGxlZDogVmlzQ29uZmlnQm9vbGVhbjtcbiAgdGhpY2tuZXNzOiBWaXNDb25maWdOdW1iZXI7XG4gIHN0cm9rZUNvbG9yOiBWaXNDb25maWdDb2xvclNlbGVjdDtcbiAgc3Ryb2tlQ29sb3JSYW5nZTogVmlzQ29uZmlnQ29sb3JSYW5nZTtcbiAgc2l6ZVJhbmdlOiBWaXNDb25maWdSYW5nZTtcbiAgc3Ryb2tlZDogVmlzQ29uZmlnQm9vbGVhbjtcbiAgZW5hYmxlM2Q6IFZpc0NvbmZpZ0Jvb2xlYW47XG4gIGVsZXZhdGlvblNjYWxlOiBWaXNDb25maWdOdW1iZXI7XG4gIGVuYWJsZUVsZXZhdGlvblpvb21GYWN0b3I6IFZpc0NvbmZpZ0Jvb2xlYW47XG4gIGhlaWdodFJhbmdlOiBWaXNDb25maWdSYW5nZTtcbiAgd2lyZWZyYW1lOiBWaXNDb25maWdCb29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgUzJHZW9tZXRyeUxheWVyQ29sdW1uc0NvbmZpZyA9IHtcbiAgdG9rZW46IExheWVyQ29sdW1uO1xufTtcblxuZXhwb3J0IHR5cGUgUzJHZW9tZXRyeUxheWVyVmlzQ29uZmlnID0ge1xuICBvcGFjaXR5OiBudW1iZXI7XG4gIGNvbG9yUmFuZ2U6IENvbG9yUmFuZ2U7XG4gIGZpbGxlZDogYm9vbGVhbjtcbiAgdGhpY2tuZXNzOiBudW1iZXI7XG4gIHN0cm9rZUNvbG9yOiBSR0JDb2xvcjtcbiAgc3Ryb2tlQ29sb3JSYW5nZTogQ29sb3JSYW5nZTtcbiAgc2l6ZVJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuICBzdHJva2VkOiBib29sZWFuO1xuICBlbmFibGUzZDogYm9vbGVhbjtcbiAgZWxldmF0aW9uU2NhbGU6IG51bWJlcjtcbiAgZW5hYmxlRWxldmF0aW9uWm9vbUZhY3RvcjogYm9vbGVhbjtcbiAgaGVpZ2h0UmFuZ2U6IFtudW1iZXIsIG51bWJlcl07XG4gIHdpcmVmcmFtZTogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFMyR2VvbWV0cnlMYXllclZpc3VhbENoYW5uZWxDb25maWcgPSBMYXllckNvbG9yQ29uZmlnICZcbiAgTGF5ZXJTaXplQ29uZmlnICZcbiAgTGF5ZXJTdHJva2VDb2xvckNvbmZpZyAmXG4gIExheWVySGVpZ2h0Q29uZmlnO1xuZXhwb3J0IHR5cGUgUzJHZW9tZXRyeUxheWVyQ29uZmlnID0gTWVyZ2U8XG4gIExheWVyQmFzZUNvbmZpZyxcbiAge2NvbHVtbnM6IFMyR2VvbWV0cnlMYXllckNvbHVtbnNDb25maWc7IHZpc0NvbmZpZzogUzJHZW9tZXRyeUxheWVyVmlzQ29uZmlnfVxuPiAmXG4gIFMyR2VvbWV0cnlMYXllclZpc3VhbENoYW5uZWxDb25maWc7XG5cbmV4cG9ydCB0eXBlIFMyR2VvbWV0cnlMYXllckRhdGEgPSB7XG4gIGluZGV4OiBudW1iZXI7XG4gIHRva2VuOiBhbnk7XG59O1xuXG5jb25zdCB6b29tRmFjdG9yVmFsdWUgPSA4O1xuXG5leHBvcnQgY29uc3QgUzJfVE9LRU5fRklFTERTOiB7XG4gIHRva2VuOiBbJ3MyJywgJ3MyX3Rva2VuJ107XG59ID0ge1xuICB0b2tlbjogWydzMicsICdzMl90b2tlbiddXG59O1xuXG5leHBvcnQgY29uc3QgczJSZXF1aXJlZENvbHVtbnM6IFsndG9rZW4nXSA9IFsndG9rZW4nXTtcbmV4cG9ydCBjb25zdCBTMlRva2VuQWNjZXNzb3IgPVxuICAoe3Rva2VufTogUzJHZW9tZXRyeUxheWVyQ29sdW1uc0NvbmZpZykgPT5cbiAgKGRjOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlKSA9PlxuICBkID0+XG4gICAgZGMudmFsdWVBdChkLmluZGV4LCB0b2tlbi5maWVsZElkeCk7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0RWxldmF0aW9uID0gNTAwO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRMaW5lV2lkdGggPSAxO1xuXG5leHBvcnQgY29uc3QgUzJWaXNDb25maWdzOiB7XG4gIC8vIEZpbGxlZCBjb2xvclxuICBvcGFjaXR5OiAnb3BhY2l0eSc7XG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJztcbiAgZmlsbGVkOiBWaXNDb25maWdCb29sZWFuO1xuXG4gIC8vIHN0cm9rZVxuICB0aGlja25lc3M6IFZpc0NvbmZpZ051bWJlcjtcbiAgc3Ryb2tlQ29sb3I6ICdzdHJva2VDb2xvcic7XG4gIHN0cm9rZUNvbG9yUmFuZ2U6ICdzdHJva2VDb2xvclJhbmdlJztcbiAgc2l6ZVJhbmdlOiAnc3Ryb2tlV2lkdGhSYW5nZSc7XG4gIHN0cm9rZWQ6ICdzdHJva2VkJztcblxuICAvLyBoZWlnaHRcbiAgZW5hYmxlM2Q6ICdlbmFibGUzZCc7XG4gIGVsZXZhdGlvblNjYWxlOiAnZWxldmF0aW9uU2NhbGUnO1xuICBlbmFibGVFbGV2YXRpb25ab29tRmFjdG9yOiAnZW5hYmxlRWxldmF0aW9uWm9vbUZhY3Rvcic7XG4gIGZpeGVkSGVpZ2h0OiAnZml4ZWRIZWlnaHQnO1xuICBoZWlnaHRSYW5nZTogJ2VsZXZhdGlvblJhbmdlJztcblxuICAvLyB3aXJlZnJhbWVcbiAgd2lyZWZyYW1lOiAnd2lyZWZyYW1lJztcbn0gPSB7XG4gIC8vIEZpbGxlZCBjb2xvclxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJyxcbiAgZmlsbGVkOiB7XG4gICAgLi4uTEFZRVJfVklTX0NPTkZJR1MuZmlsbGVkLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBsYWJlbDogJ0ZpbGwgQ29sb3InLFxuICAgIGRlZmF1bHRWYWx1ZTogdHJ1ZSxcbiAgICBwcm9wZXJ0eTogJ2ZpbGxlZCdcbiAgfSxcblxuICAvLyBzdHJva2VcbiAgdGhpY2tuZXNzOiB7XG4gICAgLi4uTEFZRVJfVklTX0NPTkZJR1MudGhpY2tuZXNzLFxuICAgIGRlZmF1bHRWYWx1ZTogMC41XG4gIH0sXG4gIHN0cm9rZUNvbG9yOiAnc3Ryb2tlQ29sb3InLFxuICBzdHJva2VDb2xvclJhbmdlOiAnc3Ryb2tlQ29sb3JSYW5nZScsXG4gIHNpemVSYW5nZTogJ3N0cm9rZVdpZHRoUmFuZ2UnLFxuICBzdHJva2VkOiAnc3Ryb2tlZCcsXG5cbiAgLy8gaGVpZ2h0XG4gIGVuYWJsZTNkOiAnZW5hYmxlM2QnLFxuICBlbGV2YXRpb25TY2FsZTogJ2VsZXZhdGlvblNjYWxlJyxcbiAgZW5hYmxlRWxldmF0aW9uWm9vbUZhY3RvcjogJ2VuYWJsZUVsZXZhdGlvblpvb21GYWN0b3InLFxuICBmaXhlZEhlaWdodDogJ2ZpeGVkSGVpZ2h0JyxcbiAgaGVpZ2h0UmFuZ2U6ICdlbGV2YXRpb25SYW5nZScsXG5cbiAgLy8gd2lyZWZyYW1lXG4gIHdpcmVmcmFtZTogJ3dpcmVmcmFtZSdcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFMyR2VvbWV0cnlMYXllciBleHRlbmRzIExheWVyIHtcbiAgZGF0YVRvRmVhdHVyZTogYW55O1xuICBkZWNsYXJlIHZpc0NvbmZpZ1NldHRpbmdzOiBTMkdlb21ldHJ5TGF5ZXJWaXNDb25maWdTZXR0aW5ncztcbiAgZGVjbGFyZSBjb25maWc6IFMyR2VvbWV0cnlMYXllckNvbmZpZztcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5yZWdpc3RlclZpc0NvbmZpZyhTMlZpc0NvbmZpZ3MpO1xuICAgIHRoaXMuZ2V0UG9zaXRpb25BY2Nlc3NvciA9IChkYXRhQ29udGFpbmVyOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlKSA9PlxuICAgICAgUzJUb2tlbkFjY2Vzc29yKHRoaXMuY29uZmlnLmNvbHVtbnMpKGRhdGFDb250YWluZXIpO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogJ3MyJyB7XG4gICAgcmV0dXJuICdzMic7XG4gIH1cblxuICBnZXQgbmFtZSgpOiAnUzInIHtcbiAgICByZXR1cm4gJ1MyJztcbiAgfVxuXG4gIGdldCByZXF1aXJlZExheWVyQ29sdW1ucygpIHtcbiAgICByZXR1cm4gczJSZXF1aXJlZENvbHVtbnM7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCkge1xuICAgIHJldHVybiBTMkxheWVySWNvbjtcbiAgfVxuXG4gIGdldCB2aXN1YWxDaGFubmVscygpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVscyA9IHN1cGVyLnZpc3VhbENoYW5uZWxzO1xuICAgIHJldHVybiB7XG4gICAgICBjb2xvcjoge1xuICAgICAgICAuLi52aXN1YWxDaGFubmVscy5jb2xvcixcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICAuLi52aXN1YWxDaGFubmVscy5zaXplLFxuICAgICAgICBwcm9wZXJ0eTogJ3N0cm9rZScsXG4gICAgICAgIGFjY2Vzc29yOiAnZ2V0TGluZVdpZHRoJyxcbiAgICAgICAgY29uZGl0aW9uOiBjb25maWcgPT4gY29uZmlnLnZpc0NvbmZpZy5zdHJva2VkLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRMaW5lV2lkdGhcbiAgICAgIH0sXG4gICAgICBzdHJva2VDb2xvcjoge1xuICAgICAgICBwcm9wZXJ0eTogJ3N0cm9rZUNvbG9yJyxcbiAgICAgICAgZmllbGQ6ICdzdHJva2VDb2xvckZpZWxkJyxcbiAgICAgICAgc2NhbGU6ICdzdHJva2VDb2xvclNjYWxlJyxcbiAgICAgICAgZG9tYWluOiAnc3Ryb2tlQ29sb3JEb21haW4nLFxuICAgICAgICByYW5nZTogJ3N0cm9rZUNvbG9yUmFuZ2UnLFxuICAgICAgICBrZXk6ICdzdHJva2VDb2xvcicsXG4gICAgICAgIGNoYW5uZWxTY2FsZVR5cGU6IENIQU5ORUxfU0NBTEVTLmNvbG9yLFxuICAgICAgICBhY2Nlc3NvcjogJ2dldExpbmVDb2xvcicsXG4gICAgICAgIGNvbmRpdGlvbjogY29uZmlnID0+IGNvbmZpZy52aXNDb25maWcuc3Ryb2tlZCxcbiAgICAgICAgbnVsbFZhbHVlOiB2aXN1YWxDaGFubmVscy5jb2xvci5udWxsVmFsdWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogY29uZmlnID0+IGNvbmZpZy52aXNDb25maWcuc3Ryb2tlQ29sb3IgfHwgY29uZmlnLmNvbG9yXG4gICAgICB9LFxuICAgICAgaGVpZ2h0OiB7XG4gICAgICAgIHByb3BlcnR5OiAnaGVpZ2h0JyxcbiAgICAgICAgZmllbGQ6ICdoZWlnaHRGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnaGVpZ2h0U2NhbGUnLFxuICAgICAgICBkb21haW46ICdoZWlnaHREb21haW4nLFxuICAgICAgICByYW5nZTogJ2hlaWdodFJhbmdlJyxcbiAgICAgICAga2V5OiAnaGVpZ2h0JyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMuc2l6ZSxcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRFbGV2YXRpb24nLFxuICAgICAgICBjb25kaXRpb246IGNvbmZpZyA9PiBjb25maWcudmlzQ29uZmlnLmVuYWJsZTNkLFxuICAgICAgICBudWxsVmFsdWU6IDAsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdEVsZXZhdGlvblxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBnZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHM6IExheWVyQmFzZUNvbmZpZ1BhcnRpYWwpIHtcbiAgICBjb25zdCBkZWZhdWx0TGF5ZXJDb25maWcgPSBzdXBlci5nZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHMgPz8ge30pO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZhdWx0TGF5ZXJDb25maWcsXG5cbiAgICAgIC8vIGFkZCBoZWlnaHQgdmlzdWFsIGNoYW5uZWxcbiAgICAgIGhlaWdodEZpZWxkOiBudWxsLFxuICAgICAgaGVpZ2h0RG9tYWluOiBbMCwgMV0sXG4gICAgICBoZWlnaHRTY2FsZTogJ2xpbmVhcicsXG5cbiAgICAgIC8vIGFkZCBzdHJva2UgY29sb3IgdmlzdWFsIGNoYW5uZWxcbiAgICAgIHN0cm9rZUNvbG9yRmllbGQ6IG51bGwsXG4gICAgICBzdHJva2VDb2xvckRvbWFpbjogWzAsIDFdLFxuICAgICAgc3Ryb2tlQ29sb3JTY2FsZTogJ3F1YW50aWxlJyxcbiAgICAgIGNvbG9yVUk6IHtcbiAgICAgICAgLi4uZGVmYXVsdExheWVyQ29uZmlnLmNvbG9yVUksXG4gICAgICAgIHN0cm9rZUNvbG9yUmFuZ2U6IERFRkFVTFRfQ09MT1JfVUlcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGZpbmREZWZhdWx0TGF5ZXJQcm9wcyh7ZmllbGRzID0gW119OiBLZXBsZXJUYWJsZSkge1xuICAgIGNvbnN0IGZvdW5kQ29sdW1ucyA9IHRoaXMuZmluZERlZmF1bHRDb2x1bW5GaWVsZChTMl9UT0tFTl9GSUVMRFMsIGZpZWxkcyk7XG4gICAgaWYgKCFmb3VuZENvbHVtbnMgfHwgIWZvdW5kQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7cHJvcHM6IFtdfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvcHM6IGZvdW5kQ29sdW1ucy5tYXAoY29sdW1ucyA9PiAoe1xuICAgICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICAgIGxhYmVsOiAnUzInLFxuICAgICAgICBjb2x1bW5zXG4gICAgICB9KSlcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlRGF0YUF0dHJpYnV0ZSh7ZmlsdGVyZWRJbmRleH06IEtlcGxlclRhYmxlLCBnZXRTMlRva2VuKSB7XG4gICAgY29uc3QgZGF0YTogUzJHZW9tZXRyeUxheWVyRGF0YVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWx0ZXJlZEluZGV4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGZpbHRlcmVkSW5kZXhbaV07XG4gICAgICBjb25zdCB0b2tlbiA9IGdldFMyVG9rZW4oe2luZGV4fSk7XG4gICAgICBpZiAodmFsaWRTMlRva2VuKHRva2VuKSkge1xuICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIHRva2VuXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyTWV0YShkYXRhc2V0OiBLZXBsZXJUYWJsZSwgZ2V0UzJUb2tlbikge1xuICAgIGNvbnN0IHtkYXRhQ29udGFpbmVyfSA9IGRhdGFzZXQ7XG4gICAgLy8gYWRkIHNhZmUgcm93IGZsYWdcbiAgICBjb25zdCBjZW50cm9pZHMgPSBkYXRhQ29udGFpbmVyLnJlZHVjZShcbiAgICAgIChhY2MsIGVudHJ5LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBzMlRva2VuID0gZ2V0UzJUb2tlbih7aW5kZXh9KTtcbiAgICAgICAgaWYgKHZhbGlkUzJUb2tlbihzMlRva2VuKSkge1xuICAgICAgICAgIGFjYy5wdXNoKGdldFMyQ2VudGVyKHMyVG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAgW10sXG4gICAgICB0cnVlXG4gICAgKTtcblxuICAgIGNvbnN0IGNlbnRyb2lkc0RhdGFDb250YWluZXIgPSBjcmVhdGVEYXRhQ29udGFpbmVyKGNlbnRyb2lkcyk7XG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRQb2ludHNCb3VuZHMoY2VudHJvaWRzRGF0YUNvbnRhaW5lciwgKGQsIGRjKSA9PiBbXG4gICAgICBkYy52YWx1ZUF0KGQuaW5kZXgsIDApLFxuICAgICAgZGMudmFsdWVBdChkLmluZGV4LCAxKVxuICAgIF0pO1xuICAgIHRoaXMuZGF0YVRvRmVhdHVyZSA9IHtjZW50cm9pZHN9O1xuICAgIHRoaXMudXBkYXRlTWV0YSh7Ym91bmRzfSk7XG4gIH1cblxuICBmb3JtYXRMYXllckRhdGEoZGF0YXNldHMsIG9sZExheWVyRGF0YSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5kYXRhSWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3Qge2dwdUZpbHRlciwgZGF0YUNvbnRhaW5lcn0gPSBkYXRhc2V0c1t0aGlzLmNvbmZpZy5kYXRhSWRdO1xuICAgIGNvbnN0IGdldFMyVG9rZW4gPSB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IoZGF0YUNvbnRhaW5lcik7XG4gICAgY29uc3Qge2RhdGF9ID0gdGhpcy51cGRhdGVEYXRhKGRhdGFzZXRzLCBvbGRMYXllckRhdGEpO1xuXG4gICAgY29uc3QgYWNjZXNzb3JzID0gdGhpcy5nZXRBdHRyaWJ1dGVBY2Nlc3NvcnMoe2RhdGFDb250YWluZXJ9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhLFxuICAgICAgZ2V0UzJUb2tlbixcbiAgICAgIGdldEZpbHRlclZhbHVlOiBncHVGaWx0ZXIuZmlsdGVyVmFsdWVBY2Nlc3NvcihkYXRhQ29udGFpbmVyKSgpLFxuICAgICAgLi4uYWNjZXNzb3JzXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlckxheWVyKG9wdHMpIHtcbiAgICBjb25zdCB7ZGF0YSwgZ3B1RmlsdGVyLCBpbnRlcmFjdGlvbkNvbmZpZywgbWFwU3RhdGV9ID0gb3B0cztcblxuICAgIGNvbnN0IGRlZmF1bHRMYXllclByb3BzID0gdGhpcy5nZXREZWZhdWx0RGVja0xheWVyUHJvcHMob3B0cyk7XG5cbiAgICBjb25zdCBlbGVab29tRmFjdG9yID0gdGhpcy5nZXRFbGV2YXRpb25ab29tRmFjdG9yKG1hcFN0YXRlKTtcbiAgICBjb25zdCB6b29tRmFjdG9yID0gdGhpcy5nZXRab29tRmFjdG9yKG1hcFN0YXRlKTtcbiAgICBjb25zdCB7Y29uZmlnfSA9IHRoaXM7XG4gICAgY29uc3Qge3Zpc0NvbmZpZ30gPSBjb25maWc7XG5cbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHtcbiAgICAgIC4uLnRoaXMuZ2V0VmlzdWFsQ2hhbm5lbFVwZGF0ZVRyaWdnZXJzKCksXG4gICAgICBnZXRGaWx0ZXJWYWx1ZTogZ3B1RmlsdGVyLmZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnNcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBTMkxheWVyKHtcbiAgICAgICAgLi4uZGVmYXVsdExheWVyUHJvcHMsXG4gICAgICAgIC4uLmludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgICAuLi5kYXRhLFxuICAgICAgICBnZXRTMlRva2VuOiAoZDogYW55KSA9PiBkLnRva2VuLFxuXG4gICAgICAgIGF1dG9IaWdobGlnaHQ6IHZpc0NvbmZpZy5lbmFibGUzZCxcbiAgICAgICAgaGlnaGxpZ2h0Q29sb3I6IEhJR0hMSUdIX0NPTE9SXzNELFxuXG4gICAgICAgIC8vIHN0cm9rZVxuICAgICAgICBsaW5lV2lkdGhTY2FsZTogdmlzQ29uZmlnLnRoaWNrbmVzcyAqIHpvb21GYWN0b3IgKiB6b29tRmFjdG9yVmFsdWUsXG4gICAgICAgIHN0cm9rZWQ6IHZpc0NvbmZpZy5zdHJva2VkLFxuICAgICAgICBsaW5lTWl0ZXJMaW1pdDogMixcblxuICAgICAgICAvLyBGaWxsZWQgY29sb3JcbiAgICAgICAgZmlsbGVkOiB2aXNDb25maWcuZmlsbGVkLFxuICAgICAgICBvcGFjaXR5OiB2aXNDb25maWcub3BhY2l0eSxcbiAgICAgICAgd3JhcExvbmdpdHVkZTogZmFsc2UsXG5cbiAgICAgICAgLy8gRWxldmF0aW9uXG4gICAgICAgIGVsZXZhdGlvblNjYWxlOiB2aXNDb25maWcuZWxldmF0aW9uU2NhbGUgKiBlbGVab29tRmFjdG9yLFxuICAgICAgICBleHRydWRlZDogdmlzQ29uZmlnLmVuYWJsZTNkLFxuXG4gICAgICAgIHdpcmVmcmFtZTogdmlzQ29uZmlnLndpcmVmcmFtZSxcblxuICAgICAgICBwaWNrYWJsZTogdHJ1ZSxcblxuICAgICAgICB1cGRhdGVUcmlnZ2Vyc1xuICAgICAgfSlcbiAgICBdO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBRCxPQUFBO0FBT0EsSUFBQUUsVUFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBbUJBLElBQUFJLFlBQUEsR0FBQUQsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE1BQUEsR0FBQU4sT0FBQTtBQUE2RSxT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
;