kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
677 lines (603 loc) • 75.3 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.geojsonVisConfigs = exports.geoJsonRequiredColumns = exports.featureResolver = exports.featureAccessor = exports["default"] = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
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 _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
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 _lodash = _interopRequireDefault(require("lodash.memoize"));
var _lodash2 = _interopRequireDefault(require("lodash.uniq"));
var _baseLayer = _interopRequireWildcard(require("../base-layer"));
var _deck = require("deck.gl");
var _colorUtils = require("../../utils/color-utils");
var _geojsonLayerIcon = _interopRequireDefault(require("./geojson-layer-icon"));
var _defaultSettings = require("../../constants/default-settings");
var _axios = _interopRequireDefault(require("axios"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
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; } }
// import {featureCollection} from '@turf/helpers';
// import {saveText} from '../boundary-layer/boundary-layer';
var geojsonVisConfigs = exports.geojsonVisConfigs = {
opacity: 'opacity',
thickness: {
type: 'number',
defaultValue: 0.5,
label: 'Stroke Width',
isRanged: false,
range: [0, 100],
step: 0.1,
group: 'stroke',
property: 'thickness'
},
strokeColor: 'strokeColor',
colorRange: 'colorRange',
strokeColorRange: 'strokeColorRange',
radius: 'radius',
sizeRange: 'strokeWidthRange',
radiusRange: 'radiusRange',
heightRange: 'elevationRange',
elevationScale: 'elevationScale',
stroked: 'stroked',
filled: 'filled',
enable3d: 'enable3d',
wireframe: 'wireframe'
};
var geoJsonRequiredColumns = exports.geoJsonRequiredColumns = ['geojson'];
var featureAccessor = exports.featureAccessor = function featureAccessor(_ref) {
var geojson = _ref.geojson;
return function (d) {
return d[geojson.fieldIdx];
};
};
var featureResolver = exports.featureResolver = function featureResolver(_ref2) {
var geojson = _ref2.geojson;
return geojson.fieldIdx;
};
var GeoJsonLayer = exports["default"] = /*#__PURE__*/function (_Layer) {
(0, _inherits2["default"])(GeoJsonLayer, _Layer);
var _super = _createSuper(GeoJsonLayer);
function GeoJsonLayer(props) {
var _this;
(0, _classCallCheck2["default"])(this, GeoJsonLayer);
_this = _super.call(this, props);
_this.dataToFeature = [];
_this.registerVisConfig(geojsonVisConfigs);
_this.getFeature = (0, _lodash["default"])(featureAccessor, featureResolver);
return _this;
}
(0, _createClass2["default"])(GeoJsonLayer, [{
key: "type",
get: function get() {
return 'backendGeojson';
}
}, {
key: "name",
get: function get() {
return 'Polygon';
}
}, {
key: "showLoader",
get: function get() {
return true;
}
}, {
key: "layerIcon",
get: function get() {
return _geojsonLayerIcon["default"];
}
}, {
key: "requiredLayerColumns",
get: function get() {
return geoJsonRequiredColumns;
}
}, {
key: "visualChannels",
get: function get() {
return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(GeoJsonLayer.prototype), "visualChannels", this)), {}, {
// strokeColor: {
// property: 'strokeColor',
// field: 'strokeColorField',
// scale: 'strokeColorScale',
// domain: 'strokeColorDomain',
// range: 'strokeColorRange',
// key: 'strokeColor',
// channelScaleType: CHANNEL_SCALES.color,
// condition: config => config.visConfig.stroked
// },
size: _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(GeoJsonLayer.prototype), "visualChannels", this).size), {}, {
property: 'stroke',
condition: function condition(config) {
return config.visConfig.stroked;
}
}),
height: {
property: 'height',
field: 'heightField',
scale: 'heightScale',
domain: 'heightDomain',
range: 'heightRange',
key: 'height',
channelScaleType: 'size',
condition: function condition(config) {
return config.visConfig.enable3d;
}
},
radius: {
property: 'radius',
field: 'radiusField',
scale: 'radiusScale',
domain: 'radiusDomain',
range: 'radiusRange',
key: 'radius',
channelScaleType: 'radius'
}
});
}
}, {
key: "shouldRenderColumnConfig",
value: function shouldRenderColumnConfig() {
return false;
}
}, {
key: "updateLayerConfig",
value: function updateLayerConfig(newConfig) {
if (Object.keys(newConfig).includes('colorField') || Object.keys(newConfig).includes('colorUI') || Object.keys(newConfig).includes('colorScale')) {
newConfig = _objectSpread(_objectSpread({}, newConfig), {
legendApiCallRequest: true
});
if (!newConfig.colorField && this.config.colorField) {
newConfig = _objectSpread(_objectSpread({}, newConfig), {
apiCallRequest: true
});
}
}
this.config = _objectSpread(_objectSpread({}, this.config), newConfig);
return this;
}
}, {
key: "axiosLegendAPICall",
value: function axiosLegendAPICall(datasets, filters, auth, project) {
var _this$config = this.config,
dataId = _this$config.dataId,
colorField = _this$config.colorField,
colorScale = _this$config.colorScale,
visConfig = _this$config.visConfig;
var colorRange = visConfig.colorRange;
var indexName = datasets[dataId].indexName;
var uid = auth.uid;
var isEdit = project.isEdit;
var noOfBreaks = colorRange.colors.length;
filters = filters.filter(function (f) {
return f.dataId.includes(dataId);
}); // const colorScale = 'quantile';
var legendAPIData = {
colorField: colorField.name,
userId: uid,
colorFieldType: colorField.type,
colorScale: colorScale,
permissionType: isEdit,
noOfBreaks: noOfBreaks,
indexName: indexName,
filters: filters
};
var legendConfig = {
headers: {
'Content-type': 'application/json'
}
};
var response = _axios["default"].post("".concat(_defaultSettings.ON_PREMESIS_URL, "/geoiqutilities/legend/v1.0/fetch"), legendAPIData, legendConfig).then(function (result) {
var breakPoints = result.data.data.Breakpoints;
breakPoints = breakPoints.reduce(function (accu, breakpoint, index) {
if (accu.length < noOfBreaks) {
accu.push({
x1: breakpoint,
x2: breakPoints[index + 1]
});
}
return accu;
}, []);
return breakPoints; // this.updateLayerConfig({
// legend: breakPoints,
// apiCallRequest: true,
// legendApiCallRequest: false
// });
}); // this.updateLayerConfig({
// apiCallRequest: true,
// legendApiCallRequest: false
// });
return response;
}
}, {
key: "axiosApiCall",
value: function axiosApiCall(datasets, viewport, zoom, filters, auth, project) {
var _this$config2 = this.config,
colorField = _this$config2.colorField,
dataId = _this$config2.dataId,
visConfig = _this$config2.visConfig;
var colorAggregation = visConfig.colorAggregation;
var indexName = datasets[dataId].indexName;
var isEdit = project.isEdit;
var uid = auth.uid;
filters = filters.filter(function (f) {
return f.dataId.includes(dataId);
});
var config = {
headers: {
'Content-Type': 'application/json'
}
}; // aggregation type
// filters
// viewport
// zoom
var data = {
colorField: colorField ? colorField.name : null,
colorAggregation: colorField ? colorAggregation : 'count',
colorFieldType: colorField ? colorField.type : null,
filters: JSON.stringify(filters),
indexName: indexName,
// indexName,
userId: uid,
viewport: JSON.stringify(viewport),
zoom: zoom,
permissionType: isEdit
}; // const url = 'https://app.geoiq.io/boundary/v1.0/boundary_query';
var response = _axios["default"].post("".concat(_defaultSettings.ON_PREMESIS_URL, "/geoiqlayers/polygonlayer/v1.0/fetch"), data, config).then(function (response) {
return response.data.data;
})["catch"](); // const response = geoHashData;
// var response = new Promise((resolve, reject) => {
// let name = 'Dave'
// if (name === 'Dave') {
// resolve(testGeojsonData);
// }
// else {
// reject(Error("Promise rejected"));
// }
// });
return response;
}
}, {
key: "getPositionAccessor",
value: function getPositionAccessor() {
return this.getFeature(this.config.columns);
} // static findDefaultLayerProps({label, fields = []}) {
// const geojsonColumns = fields
// .filter(f => f.type === 'geojson')
// .map(f => f.name);
// const defaultColumns = {
// geojson: uniq([...GEOJSON_FIELDS.geojson, ...geojsonColumns])
// };
// const foundColumns = this.findDefaultColumnField(defaultColumns, fields);
// if (!foundColumns || !foundColumns.length) {
// return {props: []};
// }
// return {
// props: foundColumns.map(columns => ({
// label:
// (typeof label === 'string' && label.replace(/\.[^/.]+$/, '')) ||
// this.type,
// columns,
// isVisible: true
// }))
// };
// }
}, {
key: "getDefaultLayerConfig",
value: function getDefaultLayerConfig() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(GeoJsonLayer.prototype), "getDefaultLayerConfig", this).call(this, props)), {}, {
apiCallRequest: true,
// add height visual channel
heightField: null,
heightDomain: [0, 1],
heightScale: 'linear',
// add radius visual channel
radiusField: null,
radiusDomain: [0, 1],
radiusScale: 'linear',
// add stroke color visual channel
strokeColorField: null,
strokeColorDomain: [0, 1],
strokeColorScale: 'quantile'
});
}
}, {
key: "getHoverData",
value: function getHoverData(object) {
// index of allData is saved to feature.properties
return object;
}
}, {
key: "getEncodedChannelValue",
value: function getEncodedChannelValue(scale, data, field) {
var defaultValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _defaultSettings.NO_VALUE_COLOR;
var type = field.type;
var value = data;
var attributeValue;
if (type === _defaultSettings.ALL_FIELD_TYPES.timestamp) {
// shouldn't need to convert here
// scale Function should take care of it
attributeValue = scale(new Date(value));
} else {
attributeValue = scale(value);
}
if (!attributeValue) {
attributeValue = defaultValue;
}
return attributeValue;
}
}, {
key: "getGeoJsonEncodedChannelValue",
value: function getGeoJsonEncodedChannelValue(legend, colorRange, colorField, data) {
var defaultValue = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _defaultSettings.NO_VALUE_COLOR;
var type = colorField.type;
var value = data;
var attributeValue;
if (type === _defaultSettings.ALL_FIELD_TYPES.string) {
attributeValue = defaultValue;
} else {
attributeValue = colorRange[legend.reduce(function (acc, breakpoint, index) {
if (value >= breakpoint.x1 && value <= breakpoint.x2) {
acc = index;
}
return acc;
}, null)];
}
return attributeValue;
} // TODO: fix complexity
/* eslint-disable complexity */
}, {
key: "formatLayerData",
value: function formatLayerData(_, allData, filteredIndex, oldLayerData, response) {
var _this2 = this;
var opt = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
var _this$config3 = this.config,
colorScale = _this$config3.colorScale,
colorField = _this$config3.colorField,
strokeColorField = _this$config3.strokeColorField,
strokeColorScale = _this$config3.strokeColorScale,
strokeColorDomain = _this$config3.strokeColorDomain,
color = _this$config3.color,
sizeScale = _this$config3.sizeScale,
sizeDomain = _this$config3.sizeDomain,
sizeField = _this$config3.sizeField,
heightField = _this$config3.heightField,
heightScale = _this$config3.heightScale,
radiusField = _this$config3.radiusField,
radiusDomain = _this$config3.radiusDomain,
radiusScale = _this$config3.radiusScale,
visConfig = _this$config3.visConfig,
legend = _this$config3.legend;
var _this$config4 = this.config,
heightDomain = _this$config4.heightDomain,
colorDomain = _this$config4.colorDomain;
var enable3d = visConfig.enable3d,
stroked = visConfig.stroked,
colorRange = visConfig.colorRange,
heightRange = visConfig.heightRange,
sizeRange = visConfig.sizeRange,
radiusRange = visConfig.radiusRange,
strokeColorRange = visConfig.strokeColorRange,
strokeColor = visConfig.strokeColor;
if (!oldLayerData) {
this.updateLayerMeta();
}
if (oldLayerData && oldLayerData.collected) {
var collected = oldLayerData.collected;
}
colorDomain = [];
if (response.polygons) {
collected = response.polygons; // if (collected) {
// saveText(JSON.stringify(featureCollection(collected)), 'filename.json');
// }
} // if (
// oldLayerData &&
// oldLayerData.data &&
// opt.sameData &&
// oldLayerData.getFeature === getFeature
// ) {
// // no need to create a new array of data
// // use updateTriggers to selectively re-calculate attributes
// geojsonData = oldLayerData.data;
// } else {
// // filteredIndex is a reference of index in allData which can map to feature
// geojsonData = filteredIndex
// .map(i => this.dataToFeature[i])
// .filter(d => d);
// }
Object.values(this.visualChannels).forEach(function (channel) {
var scale = channel.scale,
domain = channel.domain; // ordinal dommain is based on allData, if only filter changed
// no need to update ordinal domain
if (collected) {
var updateDomain = _this2.calculateLayerDomain({}, {
collected: collected
}, channel);
_this2.updateLayerConfig((0, _defineProperty2["default"])({}, domain, updateDomain));
}
}); // fill color
var cScale = colorField && this.getVisChannelScale(colorScale, colorDomain, colorRange.colors.map(_colorUtils.hexToRgb)); // stroke color
var scScale = strokeColorField && this.getVisChannelScale(strokeColorScale, strokeColorDomain, strokeColorRange.colors.map(_colorUtils.hexToRgb)); // calculate stroke scale - if stroked = true
var sScale = sizeField && stroked && this.getVisChannelScale(sizeScale, sizeDomain, sizeRange); // calculate elevation scale - if extruded = true
var eScale = heightField && enable3d && this.getVisChannelScale(heightScale, heightDomain, heightRange); // point radius
var rScale = radiusField && this.getVisChannelScale(radiusScale, radiusDomain, radiusRange);
return {
collected: collected,
// getFeature,
getFillColor: function getFillColor(d) {
return cScale && legend ? _this2.getGeoJsonEncodedChannelValue(legend, colorRange.colors.map(_colorUtils.hexToRgb), colorField, d.properties[colorField.name]) : d.properties.fillColor || color;
},
getLineColor: function getLineColor(d) {
return cScale && legend ? _this2.getGeoJsonEncodedChannelValue(legend, colorRange.colors.map(_colorUtils.hexToRgb), colorField, d.properties[colorField.name]) : d.properties.fillColor || color;
},
getLineWidth: function getLineWidth(d) {
return sScale ? _this2.getEncodedChannelValue(sScale, allData[d.properties.index], sizeField, 0) : d.properties.lineWidth || 1;
},
getElevation: function getElevation(d) {
return eScale ? _this2.getEncodedChannelValue(eScale, allData[d.properties.index], heightField, 0) : d.properties.elevation || 500;
},
getRadius: function getRadius(d) {
return rScale ? _this2.getEncodedChannelValue(rScale, allData[d.properties.index], radiusField, 0) : d.properties.radius || 1;
}
};
}
/* eslint-enable complexity */
}, {
key: "updateLayerMeta",
value: function updateLayerMeta(allData) {
// const getFeature = this.getPositionAccessor();
// this.dataToFeature = getGeojsonDataMaps(allData, getFeature);
// get bounds from features
// const bounds = getGeojsonBounds(this.dataToFeature);
// if any of the feature has properties.radius set to be true
// const fixedRadius = Boolean(
// this.dataToFeature.find(d => d && d.properties && d.properties.radius)
// );
// keep a record of what type of geometry the collection has
// const featureTypes = getGeojsonFeatureTypes(this.dataToFeature);
var bounds = {};
var fixedRadius = {};
var featureTypes = {
polygon: true
};
this.updateMeta({
bounds: bounds,
fixedRadius: fixedRadius,
featureTypes: featureTypes
});
}
}, {
key: "setInitialLayerConfig",
value: function setInitialLayerConfig(allData) {
this.updateLayerMeta(allData);
var featureTypes = this.meta.featureTypes; // default settings is stroke: true, filled: false
if (featureTypes && featureTypes.polygon) {
// set both fill and stroke to true
return this.updateLayerVisConfig({
filled: true,
stroked: true,
strokeColor: _baseLayer.colorMaker.next().value
});
} else if (featureTypes && featureTypes.point) {
// set fill to true if detect point
return this.updateLayerVisConfig({
filled: true,
stroked: false
});
}
return this;
}
}, {
key: "renderLayer",
value: function renderLayer(_ref3) {
var data = _ref3.data,
idx = _ref3.idx,
objectHovered = _ref3.objectHovered,
mapState = _ref3.mapState,
interactionConfig = _ref3.interactionConfig;
var fixedRadius = this.meta.fixedRadius;
var radiusScale = this.getRadiusScaleByZoom(mapState, fixedRadius);
var zoomFactor = this.getZoomFactor(mapState);
var visConfig = this.config.visConfig;
var layerProps = {
// multiplier applied just so it being consistent with previously saved maps
lineWidthScale: visConfig.thickness * zoomFactor * 8,
elevationScale: visConfig.elevationScale,
pointRadiusScale: radiusScale,
lineMiterLimit: 4
};
var updateTriggers = {
getElevation: {
heightField: this.config.heightField,
heightScale: this.config.heightScale,
heightRange: visConfig.heightRange
},
getFillColor: {
color: this.config.color,
// colorField: this.config.colorField,
colorRange: visConfig.colorRange // colorScale: this.config.colorScale
},
getLineColor: {
color: this.config.color,
// colorField: this.config.strokeColorField,
colorRange: visConfig.colorRange // colorScale: this.config.strokeColorScale,
// legend: this.config.legend
},
getLineWidth: {
sizeField: this.config.sizeField,
sizeRange: visConfig.sizeRange
},
getRadius: {
radiusField: this.config.radiusField,
radiusRange: visConfig.radiusRange
}
};
return [new _deck.GeoJsonLayer(_objectSpread(_objectSpread({}, layerProps), {}, {
id: this.id,
idx: idx,
data: data.collected,
getFillColor: data.getFillColor,
getLineColor: data.getLineColor,
getLineWidth: data.getLineWidth,
getRadius: data.getRadius,
getElevation: data.getElevation,
// highlight
pickable: true,
highlightColor: _defaultSettings.HIGHLIGH_COLOR_3D,
autoHighlight: visConfig.enable3d,
// parameters
parameters: {
depthTest: Boolean(visConfig.enable3d || mapState.dragRotate)
},
opacity: visConfig.opacity,
stroked: visConfig.stroked,
filled: visConfig.filled,
extruded: visConfig.enable3d,
wireframe: visConfig.wireframe,
lineMiterLimit: 2,
rounded: true,
updateTriggers: updateTriggers
}))].concat((0, _toConsumableArray2["default"])(this.isLayerHovered(objectHovered) && !visConfig.enable3d ? [new _deck.GeoJsonLayer(_objectSpread(_objectSpread({}, layerProps), {}, {
id: "".concat(this.id, "-hovered"),
data: [objectHovered.object],
getLineWidth: data.getLineWidth,
getRadius: data.getRadius,
getElevation: data.getElevation,
getLineColor: this.config.highlightColor,
getFillColor: this.config.highlightColor,
updateTriggers: updateTriggers,
stroked: true,
pickable: false,
filled: false
}))] : []));
}
}]);
return GeoJsonLayer;
}(_baseLayer["default"]); // legend API
// {
// colorField:colorField(fieldName)
// userId:UserID
// colorScale:'quantile',
// isEdit:true,
// noOfBreaks:6,
// }
// filter API
// {
// fieldName:'',
// userId:'',
// isEdit:'',
// fieldType:'',
// tableName:'string'
// }
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvYmFja2VuZC1nZW9qc29uLWxheWVyL2dlb2pzb24tbGF5ZXIuanMiXSwibmFtZXMiOlsiZ2VvanNvblZpc0NvbmZpZ3MiLCJvcGFjaXR5IiwidGhpY2tuZXNzIiwidHlwZSIsImRlZmF1bHRWYWx1ZSIsImxhYmVsIiwiaXNSYW5nZWQiLCJyYW5nZSIsInN0ZXAiLCJncm91cCIsInByb3BlcnR5Iiwic3Ryb2tlQ29sb3IiLCJjb2xvclJhbmdlIiwic3Ryb2tlQ29sb3JSYW5nZSIsInJhZGl1cyIsInNpemVSYW5nZSIsInJhZGl1c1JhbmdlIiwiaGVpZ2h0UmFuZ2UiLCJlbGV2YXRpb25TY2FsZSIsInN0cm9rZWQiLCJmaWxsZWQiLCJlbmFibGUzZCIsIndpcmVmcmFtZSIsImdlb0pzb25SZXF1aXJlZENvbHVtbnMiLCJmZWF0dXJlQWNjZXNzb3IiLCJnZW9qc29uIiwiZCIsImZpZWxkSWR4IiwiZmVhdHVyZVJlc29sdmVyIiwiR2VvSnNvbkxheWVyIiwicHJvcHMiLCJkYXRhVG9GZWF0dXJlIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRGZWF0dXJlIiwiR2VvanNvbkxheWVySWNvbiIsInNpemUiLCJjb25kaXRpb24iLCJjb25maWciLCJ2aXNDb25maWciLCJoZWlnaHQiLCJmaWVsZCIsInNjYWxlIiwiZG9tYWluIiwia2V5IiwiY2hhbm5lbFNjYWxlVHlwZSIsIm5ld0NvbmZpZyIsIk9iamVjdCIsImtleXMiLCJpbmNsdWRlcyIsImxlZ2VuZEFwaUNhbGxSZXF1ZXN0IiwiY29sb3JGaWVsZCIsImFwaUNhbGxSZXF1ZXN0IiwiZGF0YXNldHMiLCJmaWx0ZXJzIiwiYXV0aCIsInByb2plY3QiLCJkYXRhSWQiLCJjb2xvclNjYWxlIiwiaW5kZXhOYW1lIiwidWlkIiwiaXNFZGl0Iiwibm9PZkJyZWFrcyIsImNvbG9ycyIsImxlbmd0aCIsImZpbHRlciIsImYiLCJsZWdlbmRBUElEYXRhIiwibmFtZSIsInVzZXJJZCIsImNvbG9yRmllbGRUeXBlIiwicGVybWlzc2lvblR5cGUiLCJsZWdlbmRDb25maWciLCJoZWFkZXJzIiwicmVzcG9uc2UiLCJheGlvcyIsInBvc3QiLCJPTl9QUkVNRVNJU19VUkwiLCJ0aGVuIiwicmVzdWx0IiwiYnJlYWtQb2ludHMiLCJkYXRhIiwiQnJlYWtwb2ludHMiLCJyZWR1Y2UiLCJhY2N1IiwiYnJlYWtwb2ludCIsImluZGV4IiwicHVzaCIsIngxIiwieDIiLCJ2aWV3cG9ydCIsInpvb20iLCJjb2xvckFnZ3JlZ2F0aW9uIiwiSlNPTiIsInN0cmluZ2lmeSIsImNvbHVtbnMiLCJoZWlnaHRGaWVsZCIsImhlaWdodERvbWFpbiIsImhlaWdodFNjYWxlIiwicmFkaXVzRmllbGQiLCJyYWRpdXNEb21haW4iLCJyYWRpdXNTY2FsZSIsInN0cm9rZUNvbG9yRmllbGQiLCJzdHJva2VDb2xvckRvbWFpbiIsInN0cm9rZUNvbG9yU2NhbGUiLCJvYmplY3QiLCJOT19WQUxVRV9DT0xPUiIsInZhbHVlIiwiYXR0cmlidXRlVmFsdWUiLCJBTExfRklFTERfVFlQRVMiLCJ0aW1lc3RhbXAiLCJEYXRlIiwibGVnZW5kIiwic3RyaW5nIiwiYWNjIiwiXyIsImFsbERhdGEiLCJmaWx0ZXJlZEluZGV4Iiwib2xkTGF5ZXJEYXRhIiwib3B0IiwiY29sb3IiLCJzaXplU2NhbGUiLCJzaXplRG9tYWluIiwic2l6ZUZpZWxkIiwiY29sb3JEb21haW4iLCJ1cGRhdGVMYXllck1ldGEiLCJjb2xsZWN0ZWQiLCJwb2x5Z29ucyIsInZhbHVlcyIsInZpc3VhbENoYW5uZWxzIiwiZm9yRWFjaCIsImNoYW5uZWwiLCJ1cGRhdGVEb21haW4iLCJjYWxjdWxhdGVMYXllckRvbWFpbiIsInVwZGF0ZUxheWVyQ29uZmlnIiwiY1NjYWxlIiwiZ2V0VmlzQ2hhbm5lbFNjYWxlIiwibWFwIiwiaGV4VG9SZ2IiLCJzY1NjYWxlIiwic1NjYWxlIiwiZVNjYWxlIiwiclNjYWxlIiwiZ2V0RmlsbENvbG9yIiwiZ2V0R2VvSnNvbkVuY29kZWRDaGFubmVsVmFsdWUiLCJwcm9wZXJ0aWVzIiwiZmlsbENvbG9yIiwiZ2V0TGluZUNvbG9yIiwiZ2V0TGluZVdpZHRoIiwiZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSIsImxpbmVXaWR0aCIsImdldEVsZXZhdGlvbiIsImVsZXZhdGlvbiIsImdldFJhZGl1cyIsImJvdW5kcyIsImZpeGVkUmFkaXVzIiwiZmVhdHVyZVR5cGVzIiwicG9seWdvbiIsInVwZGF0ZU1ldGEiLCJtZXRhIiwidXBkYXRlTGF5ZXJWaXNDb25maWciLCJjb2xvck1ha2VyIiwibmV4dCIsInBvaW50IiwiaWR4Iiwib2JqZWN0SG92ZXJlZCIsIm1hcFN0YXRlIiwiaW50ZXJhY3Rpb25Db25maWciLCJnZXRSYWRpdXNTY2FsZUJ5Wm9vbSIsInpvb21GYWN0b3IiLCJnZXRab29tRmFjdG9yIiwibGF5ZXJQcm9wcyIsImxpbmVXaWR0aFNjYWxlIiwicG9pbnRSYWRpdXNTY2FsZSIsImxpbmVNaXRlckxpbWl0IiwidXBkYXRlVHJpZ2dlcnMiLCJEZWNrR0xHZW9Kc29uTGF5ZXIiLCJpZCIsInBpY2thYmxlIiwiaGlnaGxpZ2h0Q29sb3IiLCJISUdITElHSF9DT0xPUl8zRCIsImF1dG9IaWdobGlnaHQiLCJwYXJhbWV0ZXJzIiwiZGVwdGhUZXN0IiwiQm9vbGVhbiIsImRyYWdSb3RhdGUiLCJleHRydWRlZCIsInJvdW5kZWQiLCJpc0xheWVySG92ZXJlZCIsIkxheWVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBT0E7Ozs7Ozs7Ozs7Ozs7O0FBRUE7QUFDQTtBQUVPLElBQU1BLGlCQUFpQiwrQkFBRztBQUMvQkMsRUFBQUEsT0FBTyxFQUFFLFNBRHNCO0FBRS9CQyxFQUFBQSxTQUFTLEVBQUU7QUFDVEMsSUFBQUEsSUFBSSxFQUFFLFFBREc7QUFFVEMsSUFBQUEsWUFBWSxFQUFFLEdBRkw7QUFHVEMsSUFBQUEsS0FBSyxFQUFFLGNB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RUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBN