kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
243 lines (207 loc) • 28.1 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
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 _baseWidget = _interopRequireDefault(require("../base-widget"));
var _aggregateUtils = require("../../utils/aggregate-utils");
var _functionWidgetIcon = _interopRequireDefault(require("./function-widget-icon"));
var _geoViewport = _interopRequireDefault(require("@mapbox/geo-viewport"));
var _viewportMercatorProject = _interopRequireDefault(require("viewport-mercator-project"));
var _fileHandler = require("../../processors/file-handler");
var _booleanDisjoint = _interopRequireDefault(require("@turf/boolean-disjoint"));
var _helpers = require("@turf/helpers");
var _simplifyGeojson = _interopRequireDefault(require("simplify-geojson"));
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var FunctionWidget =
/*#__PURE__*/
function (_Widget) {
(0, _inherits2["default"])(FunctionWidget, _Widget);
function FunctionWidget(props) {
(0, _classCallCheck2["default"])(this, FunctionWidget);
return (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(FunctionWidget).call(this, props));
}
(0, _createClass2["default"])(FunctionWidget, [{
key: "calculateAggregationData",
value: function calculateAggregationData(newWidget, state, mapState) {
var latRange, lngRange;
var _newWidget$config = newWidget.config,
dataId = _newWidget$config.dataId,
aggregationType = _newWidget$config.aggregationType,
bounds = _newWidget$config.bounds;
var boundingBox;
var cUL, cUR, cLL, cLR;
var _state$datasets$dataI = state.datasets[dataId],
data = _state$datasets$dataI.data,
label = _state$datasets$dataI.label;
if (!newWidget.config.selectedLayer) {
return newWidget;
}
var idx = state.layers.findIndex(function (l) {
return l.id === newWidget.config.selectedLayer.id;
});
var fields = state.datasets[dataId].fields;
if (mapState && bounds) {
var longitude = mapState.longitude,
latitude = mapState.latitude,
height = mapState.height,
width = mapState.width,
zoom = mapState.zoom,
pitch = mapState.pitch,
bearing = mapState.bearing;
boundingBox = _geoViewport["default"].bounds([longitude, latitude], zoom, [width, height]);
var viewport = new _viewportMercatorProject["default"]({
width: width,
height: height,
longitude: longitude,
latitude: latitude,
zoom: zoom,
pitch: pitch,
bearing: bearing
});
cUL = viewport.unproject([0, 0]);
cUR = viewport.unproject([width, 0]);
cLR = viewport.unproject([width, height]);
cLL = viewport.unproject([0, height]);
latRange = (0, _toConsumableArray2["default"])(new Set([cLL[1], cUR[1], cLR[1], cUL[1]])).sort(function (a, b) {
return a - b;
});
lngRange = (0, _toConsumableArray2["default"])(new Set([cLL[0], cUR[0], cLR[0], cUL[0]])).sort(function (a, b) {
return a - b;
});
var boundingPolygon = {
type: 'Polygon',
coordinates: [[cUL, cUR, cLR, cLL]],
crs: {
type: 'name',
properties: {
name: 'EPSG:4326'
}
}
};
if ((0, _fileHandler.getFileType)(label) !== 'json' && boundingBox) {
var latIdx = state.layers[idx].config.columns.lat.fieldIdx;
var lngIdx = state.layers[idx].config.columns.lng.fieldIdx;
data = data.filter(function (d) {
return pitch || bearing ? !(0, _booleanDisjoint["default"])((0, _helpers.point)([d[lngIdx], d[latIdx]]), boundingPolygon) : d[latIdx] > latRange[0] && d[latIdx] < latRange[1] && d[lngIdx] > lngRange[0] && d[lngIdx] < lngRange[1];
});
} else if (boundingBox) {
if (!state.datasets[dataId].simplifiedGeoJSON || data.length !== state.datasets[dataId].simplifiedGeoJSON.length) {
state = _objectSpread({}, state, {
datasets: _objectSpread({}, state.datasets, (0, _defineProperty2["default"])({}, dataId, _objectSpread({}, state.datasets[dataId], {
simplifiedGeoJSON: data.map(function (d) {
return [].concat((0, _toConsumableArray2["default"])(d), [d[0] = (0, _simplifyGeojson["default"])(d[0], 0.01)]);
})
})))
});
} //commented part is using viewport to tell which point is in the viewport and faster than turf.js
// console.log('state inside geojson aggregation ', state);
// data = state.d atasets[dataId].simplifiedGeoJSON.filter(d =>
// d.geometry.coordinates.reduce((accu, val) => {
// var pointInsideBounds = false;
// if (accu) return accu;
// var i = 0;
// const flatVal = flatValToPoint(val);
// // if (val[i].length > 2) {
// // flatVal = val.flat();
// // }
// do {
// const p = flatVal[i];
// // console.log('point inside do while loop', p);
// if (
// viewport.project([p[0], p[1]])[0] > 0 &&
// viewport.project([p[0], p[1]])[0] < width &&
// viewport.project([p[0], p[1]])[1] > 0 &&
// viewport.project([p[0], p[1]])[1] < height
// ) {
// pointInsideBounds = true;
// }
// i++;
// } while (!pointInsideBounds && i < val.length);
// return pointInsideBounds;
// }, false)
// );
data = state.datasets[dataId].simplifiedGeoJSON.filter(function (d) {
return !(0, _booleanDisjoint["default"])(d[0], boundingPolygon);
}); // console.log(
// viewport.project([0, 0])[0] > 0 && viewport.project([0, 0])[0] < width
// );
// console.log(data.length);
// data = state.datasets[dataId].simplifiedGeoJSON.filter(
// d => !booleanDisjoint(d, boundingPolygon)
// );
// console.log(data.length);
// data = data.map(d => {
// console.log(d[0]);
// console.log();
// });
}
}
if (aggregationType === 'count') {
newWidget.config.aggregatedData = data.length;
} else {
var fieldName = newWidget.config.fieldName;
var fieldIdx = fields.findIndex(function (f) {
return f.name === fieldName;
});
if (fieldName) {
var fieldData = data.map(function (d) {
if (d.data) {
return d.data[fieldIdx];
} else {
return d[fieldIdx];
}
});
var aggregatedData = (0, _aggregateUtils.aggregate)(fieldData, aggregationType);
if (typeof aggregatedData === 'number') {
newWidget.config.aggregatedData = +aggregatedData.toFixed(2);
} else {
newWidget.config.aggregatedData = aggregatedData;
}
newWidget.config.aggregatedData;
}
} // console.log(
// 'newWidget and state inside calculateAggregationData',
// newWidget,
// state
// );
newWidget.config.isCalculating = false;
return {
newWidget: newWidget,
updatedState: state
};
}
}, {
key: "type",
get: function get() {
return 'Function';
}
}, {
key: "isAggregated",
get: function get() {
return false;
}
}, {
key: "widgetIcon",
get: function get() {
return _functionWidgetIcon["default"];
}
}, {
key: "widgetAggregatedData",
get: function get() {
return null;
}
}]);
return FunctionWidget;
}(_baseWidget["default"]);
exports["default"] = FunctionWidget;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93aWRnZXRzL2Z1bmN0aW9uLXdpZGdldC9mdW5jdGlvbi13aWRnZXQuanMiXSwibmFtZXMiOlsiRnVuY3Rpb25XaWRnZXQiLCJwcm9wcyIsIm5ld1dpZGdldCIsInN0YXRlIiwibWFwU3RhdGUiLCJsYXRSYW5nZSIsImxuZ1JhbmdlIiwiY29uZmlnIiwiZGF0YUlkIiwiYWdncmVnYXRpb25UeXBlIiwiYm91bmRzIiwiYm91bmRpbmdCb3giLCJjVUwiLCJjVVIiLCJjTEwiLCJjTFIiLCJkYXRhc2V0cyIsImRhdGEiLCJsYWJlbCIsInNlbGVjdGVkTGF5ZXIiLCJpZHgiLCJsYXllcnMiLCJmaW5kSW5kZXgiLCJsIiwiaWQiLCJmaWVsZHMiLCJsb25naXR1ZGUiLCJsYXRpdHVkZSIsImhlaWdodCIsIndpZHRoIiwiem9vbSIsInBpdGNoIiwiYmVhcmluZyIsImdlb1ZpZXdwb3J0Iiwidmlld3BvcnQiLCJXZWJNZXJjYXRvclZpZXdwb3J0IiwidW5wcm9qZWN0IiwiU2V0Iiwic29ydCIsImEiLCJiIiwiYm91bmRpbmdQb2x5Z29uIiwidHlwZSIsImNvb3JkaW5hdGVzIiwiY3JzIiwicHJvcGVydGllcyIsIm5hbWUiLCJsYXRJZHgiLCJjb2x1bW5zIiwibGF0IiwiZmllbGRJZHgiLCJsbmdJZHgiLCJsbmciLCJmaWx0ZXIiLCJkIiwic2ltcGxpZmllZEdlb0pTT04iLCJsZW5ndGgiLCJtYXAiLCJhZ2dyZWdhdGVkRGF0YSIsImZpZWxkTmFtZSIsImYiLCJmaWVsZERhdGEiLCJ0b0ZpeGVkIiwiaXNDYWxjdWxhdGluZyIsInVwZGF0ZWRTdGF0ZSIsIkZ1bmN0aW9uV2lkZ2V0SWNvbiIsIldpZGdldCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7Ozs7OztJQUVxQkEsYzs7Ozs7QUFDbkIsMEJBQVlDLEtBQVosRUFBbUI7QUFBQTtBQUFBLHlIQUNYQSxLQURXO0FBRWxCOzs7OzZDQWN3QkMsUyxFQUFXQyxLLEVBQU9DLFEsRUFBVTtBQUNuRCxVQUFJQyxRQUFKLEVBQWNDLFFBQWQ7QUFEbUQsOEJBR1RKLFNBQVMsQ0FBQ0ssTUFIRDtBQUFBLFVBRzVDQyxNQUg0QyxxQkFHNUNBLE1BSDRDO0FBQUEsVUFHcENDLGVBSG9DLHFCQUdwQ0EsZUFIb0M7QUFBQSxVQUduQkMsTUFIbUIscUJBR25CQSxNQUhtQjtBQUluRCxVQUFJQyxXQUFKO0FBQ0EsVUFBSUMsR0FBSixFQUFTQyxHQUFULEVBQWNDLEdBQWQsRUFBbUJDLEdBQW5CO0FBTG1ELGtDQU0vQlosS0FBSyxDQUFDYSxRQUFOLENBQWVSLE1BQWYsQ0FOK0I7QUFBQSxVQU05Q1MsSUFOOEMseUJBTTlDQSxJQU44QztBQUFBLFVBTXhDQyxLQU53Qyx5QkFNeENBLEtBTndDOztBQVFuRCxVQUFJLENBQUNoQixTQUFTLENBQUNLLE1BQVYsQ0FBaUJZLGFBQXRCLEVBQXFDO0FBQ25DLGVBQU9qQixTQUFQO0FBQ0Q7O0FBRUQsVUFBTWtCLEdBQUcsR0FBR2pCLEtBQUssQ0FBQ2tCLE1BQU4sQ0FBYUMsU0FBYixDQUNWLFVBQUFDLENBQUM7QUFBQSxlQUFJQSxDQUFDLENBQUNDLEVBQUYsS0FBU3RCLFNBQVMsQ0FBQ0ssTUFBVixDQUFpQlksYUFBakIsQ0FBK0JLLEVBQTVDO0FBQUEsT0FEUyxDQUFaO0FBWm1ELFVBZ0I1Q0MsTUFoQjRDLEdBZ0JsQ3RCLEtBQUssQ0FBQ2EsUUFBTixDQUFlUixNQUFmLENBaEJrQyxDQWdCNUNpQixNQWhCNEM7O0FBa0JuRCxVQUFJckIsUUFBUSxJQUFJTSxNQUFoQixFQUF3QjtBQUFBLFlBRXBCZ0IsU0FGb0IsR0FTbEJ0QixRQVRrQixDQUVwQnNCLFNBRm9CO0FBQUEsWUFHcEJDLFFBSG9CLEdBU2xCdkIsUUFUa0IsQ0FHcEJ1QixRQUhvQjtBQUFBLFlBSXBCQyxNQUpvQixHQVNsQnhCLFFBVGtCLENBSXBCd0IsTUFKb0I7QUFBQSxZQUtwQkMsS0FMb0IsR0FTbEJ6QixRQVRrQixDQUtwQnlCLEtBTG9CO0FBQUEsWUFNcEJDLElBTm9CLEdBU2xCMUIsUUFUa0IsQ0FNcEIwQixJQU5vQjtBQUFBLFlBT3BCQyxLQVBvQixHQVNsQjNCLFFBVGtCLENBT3BCMkIsS0FQb0I7QUFBQSxZQVFwQkMsT0FSb0IsR0FTbEI1QixRQVRrQixDQVFwQjRCLE9BUm9CO0FBV3RCckIsUUFBQUEsV0FBVyxHQUFHc0Isd0JBQVl2QixNQUFaLENBQW1CLENBQUNnQixTQUFELEVBQVlDLFFBQVosQ0FBbkIsRUFBMENHLElBQTFDLEVBQWdELENBQzVERCxLQUQ0RCxFQUU1REQsTUFGNEQsQ0FBaEQsQ0FBZDtBQUtBLFlBQU1NLFFBQVEsR0FBRyxJQUFJQyxtQ0FBSixDQUF3QjtBQUN2Q04sVUFBQUEsS0FBSyxFQUFFQSxLQURnQztBQUV2Q0QsVUFBQUEsTUFBTSxFQUFFQSxNQUYrQjtBQUd2Q0YsVUFBQUEsU0FBUyxFQUFFQSxTQUg0QjtBQUl2Q0MsVUFBQUEsUUFBUSxFQUFFQSxRQUo2QjtBQUt2Q0csVUFBQUEsSUFBSSxFQUFFQSxJQUxpQztBQU12Q0MsVUFBQUEsS0FBSyxFQUFFQSxLQU5nQztBQU92Q0MsVUFBQUEsT0FBTyxFQUFFQTtBQVA4QixTQUF4QixDQUFqQjtBQVNBcEIsUUFBQUEsR0FBRyxHQUFHc0IsUUFBUSxDQUFDRSxTQUFULENBQW1CLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBbkIsQ0FBTjtBQUNBdkIsUUFBQUEsR0FBRyxHQUFHcUIsUUFBUSxDQUFDRSxTQUFULENBQW1CLENBQUNQLEtBQUQsRUFBUSxDQUFSLENBQW5CLENBQU47QUFDQWQsUUFBQUEsR0FBRyxHQUFHbUIsUUFBUSxDQUFDRSxTQUFULENBQW1CLENBQUNQLEtBQUQsRUFBUUQsTUFBUixDQUFuQixDQUFOO0FBQ0FkLFFBQUFBLEdBQUcsR0FBR29CLFFBQVEsQ0FBQ0UsU0FBVCxDQUFtQixDQUFDLENBQUQsRUFBSVIsTUFBSixDQUFuQixDQUFOO0FBRUF2QixRQUFBQSxRQUFRLEdBQUcsb0NBQUksSUFBSWdDLEdBQUosQ0FBUSxDQUFDdkIsR0FBRyxDQUFDLENBQUQsQ0FBSixFQUFTRCxHQUFHLENBQUMsQ0FBRCxDQUFaLEVBQWlCRSxHQUFHLENBQUMsQ0FBRCxDQUFwQixFQUF5QkgsR0FBRyxDQUFDLENBQUQsQ0FBNUIsQ0FBUixDQUFKLEVBQStDMEIsSUFBL0MsQ0FDVCxVQUFDQyxDQUFELEVBQUlDLENBQUo7QUFBQSxpQkFBVUQsQ0FBQyxHQUFHQyxDQUFkO0FBQUEsU0FEUyxDQUFYO0FBR0FsQyxRQUFBQSxRQUFRLEdBQUcsb0NBQUksSUFBSStCLEdBQUosQ0FBUSxDQUFDdkIsR0FBRyxDQUFDLENBQUQsQ0FBSixFQUFTRCxHQUFHLENBQUMsQ0FBRCxDQUFaLEVBQWlCRSxHQUFHLENBQUMsQ0FBRCxDQUFwQixFQUF5QkgsR0FBRyxDQUFDLENBQUQsQ0FBNUIsQ0FBUixDQUFKLEVBQStDMEIsSUFBL0MsQ0FDVCxVQUFDQyxDQUFELEVBQUlDLENBQUo7QUFBQSxpQkFBVUQsQ0FBQyxHQUFHQyxDQUFkO0FBQUEsU0FEUyxDQUFYO0FBSUEsWUFBTUMsZUFBZSxHQUFHO0FBQ3RCQyxVQUFBQSxJQUFJLEVBQUUsU0FEZ0I7QUFFdEJDLFVBQUFBLFdBQVcsRUFBRSxDQUFDLENBQUMvQixHQUFELEVBQU1DLEdBQU4sRUFBV0UsR0FBWCxFQUFnQkQsR0FBaEIsQ0FBRCxDQUZTO0FBR3RCOEIsVUFBQUEsR0FBRyxFQUFFO0FBQ0hGLFlBQUFBLElBQUksRUFBRSxNQURIO0FBRUhHLFlBQUFBLFVBQVUsRUFBRTtBQUNWQyxjQUFBQSxJQUFJLEVBQUU7QUFESTtBQUZUO0FBSGlCLFNBQXhCOztBQVdBLFlBQUksOEJBQVk1QixLQUFaLE1BQXVCLE1BQXZCLElBQWlDUCxXQUFyQyxFQUFrRDtBQUNoRCxjQUFNb0MsTUFBTSxHQUFHNUMsS0FBSyxDQUFDa0IsTUFBTixDQUFhRCxHQUFiLEVBQWtCYixNQUFsQixDQUF5QnlDLE9BQXpCLENBQWlDQyxHQUFqQyxDQUFxQ0MsUUFBcEQ7QUFDQSxjQUFNQyxNQUFNLEdBQUdoRCxLQUFLLENBQUNrQixNQUFOLENBQWFELEdBQWIsRUFBa0JiLE1BQWxCLENBQXlCeUMsT0FBekIsQ0FBaUNJLEdBQWpDLENBQXFDRixRQUFwRDtBQUNBakMsVUFBQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNvQyxNQUFMLENBQVksVUFBQUMsQ0FBQztBQUFBLG1CQUNsQnZCLEtBQUssSUFBSUMsT0FBVCxHQUNJLENBQUMsaUNBQWdCLG9CQUFNLENBQUNzQixDQUFDLENBQUNILE1BQUQsQ0FBRixFQUFZRyxDQUFDLENBQUNQLE1BQUQsQ0FBYixDQUFOLENBQWhCLEVBQStDTixlQUEvQyxDQURMLEdBRUlhLENBQUMsQ0FBQ1AsTUFBRCxDQUFELEdBQVkxQyxRQUFRLENBQUMsQ0FBRCxDQUFwQixJQUNBaUQsQ0FBQyxDQUFDUCxNQUFELENBQUQsR0FBWTFDLFFBQVEsQ0FBQyxDQUFELENBRHBCLElBRUFpRCxDQUFDLENBQUNILE1BQUQsQ0FBRCxHQUFZN0MsUUFBUSxDQUFDLENBQUQsQ0FGcEIsSUFHQWdELENBQUMsQ0FBQ0gsTUFBRCxDQUFELEdBQVk3QyxRQUFRLENBQUMsQ0FBRCxDQU5OO0FBQUEsV0FBYixDQUFQO0FBUUQsU0FYRCxNQVdPLElBQUlLLFdBQUosRUFBaUI7QUFDdEIsY0FDRSxDQUFDUixLQUFLLENBQUNhLFFBQU4sQ0FBZVIsTUFBZixFQUF1QitDLGlCQUF4QixJQUNBdEMsSUFBSSxDQUFDdUMsTUFBTCxLQUFnQnJELEtBQUssQ0FBQ2EsUUFBTixDQUFlUixNQUFmLEVBQXVCK0MsaUJBQXZCLENBQXlDQyxNQUYzRCxFQUdFO0FBQ0FyRCxZQUFBQSxLQUFLLHFCQUNBQSxLQURBO0FBRUhhLGNBQUFBLFFBQVEsb0JBQ0hiLEtBQUssQ0FBQ2EsUUFESCx1Q0FFTFIsTUFGSyxvQkFHREwsS0FBSyxDQUFDYSxRQUFOLENBQWVSLE1BQWYsQ0FIQztBQUlKK0MsZ0JBQUFBLGlCQUFpQixFQUFFdEMsSUFBSSxDQUFDd0MsR0FBTCxDQUFTLFVBQUFILENBQUM7QUFBQSx1RUFDeEJBLENBRHdCLElBRTFCQSxDQUFDLENBQUMsQ0FBRCxDQUFELEdBQU8saUNBQVNBLENBQUMsQ0FBQyxDQUFELENBQVYsRUFBZSxJQUFmLENBRm1CO0FBQUEsaUJBQVY7QUFKZjtBQUZMLGNBQUw7QUFhRCxXQWxCcUIsQ0FvQnRCO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0FyQyxVQUFBQSxJQUFJLEdBQUdkLEtBQUssQ0FBQ2EsUUFBTixDQUFlUixNQUFmLEVBQXVCK0MsaUJBQXZCLENBQXlDRixNQUF6QyxDQUNMLFVBQUFDLENBQUM7QUFBQSxtQkFBSSxDQUFDLGlDQUFnQkEsQ0FBQyxDQUFDLENBQUQsQ0FBakIsRUFBc0JiLGVBQXRCLENBQUw7QUFBQSxXQURJLENBQVAsQ0FoRHNCLENBb0R0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDRDtBQUNGOztBQUVELFVBQUloQyxlQUFlLEtBQUssT0FBeEIsRUFBaUM7QUFDL0JQLFFBQUFBLFNBQVMsQ0FBQ0ssTUFBVixDQUFpQm1ELGNBQWpCLEdBQWtDekMsSUFBSSxDQUFDdUMsTUFBdkM7QUFDRCxPQUZELE1BRU87QUFDTCxZQUFNRyxTQUFTLEdBQUd6RCxTQUFTLENBQUNLLE1BQVYsQ0FBaUJvRCxTQUFuQztBQUNBLFlBQU1ULFFBQVEsR0FBR3pCLE1BQU0sQ0FBQ0gsU0FBUCxDQUFpQixVQUFBc0MsQ0FBQztBQUFBLGlCQUFJQSxDQUFDLENBQUNkLElBQUYsS0FBV2EsU0FBZjtBQUFBLFNBQWxCLENBQWpCOztBQUNBLFlBQUlBLFNBQUosRUFBZTtBQUNiLGNBQUlFLFNBQVMsR0FBRzVDLElBQUksQ0FBQ3dDLEdBQUwsQ0FBUyxVQUFBSCxDQUFDLEVBQUk7QUFDNUIsZ0JBQUlBLENBQUMsQ0FBQ3JDLElBQU4sRUFBWTtBQUNWLHFCQUFPcUMsQ0FBQyxDQUFDckMsSUFBRixDQUFPaUMsUUFBUCxDQUFQO0FBQ0QsYUFGRCxNQUVPO0FBQ0wscUJBQU9JLENBQUMsQ0FBQ0osUUFBRCxDQUFSO0FBQ0Q7QUFDRixXQU5lLENBQWhCO0FBT0EsY0FBTVEsY0FBYyxHQUFHLCtCQUFVRyxTQUFWLEVBQXFCcEQsZUFBckIsQ0FBdkI7O0FBQ0EsY0FBSSxPQUFPaUQsY0FBUCxLQUEwQixRQUE5QixFQUF3QztBQUN0Q3hELFlBQUFBLFNBQVMsQ0FBQ0ssTUFBVixDQUFpQm1ELGNBQWpCLEdBQWtDLENBQUNBLGNBQWMsQ0FBQ0ksT0FBZixDQUF1QixDQUF2QixDQUFuQztBQUNELFdBRkQsTUFFTztBQUNMNUQsWUFBQUEsU0FBUyxDQUFDSyxNQUFWLENBQWlCbUQsY0FBakIsR0FBa0NBLGNBQWxDO0FBQ0Q7O0FBQ0R4RCxVQUFBQSxTQUFTLENBQUNLLE1BQVYsQ0FBaUJtRCxjQUFqQjtBQUNEO0FBQ0YsT0F0S2tELENBdUtuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQXhELE1BQUFBLFNBQVMsQ0FBQ0ssTUFBVixDQUFpQndELGFBQWpCLEdBQWlDLEtBQWpDO0FBQ0EsYUFBTztBQUFDN0QsUUFBQUEsU0FBUyxFQUFUQSxTQUFEO0FBQVk4RCxRQUFBQSxZQUFZLEVBQUU3RDtBQUExQixPQUFQO0FBQ0Q7Ozt3QkEzTFU7QUFDVCxhQUFPLFVBQVA7QUFDRDs7O3dCQUNrQjtBQUNqQixhQUFPLEtBQVA7QUFDRDs7O3dCQUNnQjtBQUNmLGFBQU84RCw4QkFBUDtBQUNEOzs7d0JBQzBCO0FBQ3pCLGFBQU8sSUFBUDtBQUNEOzs7RUFmeUNDLHNCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFdpZGdldCBmcm9tICcuLi9iYXNlLXdpZGdldCc7XG5pbXBvcnQge2FnZ3JlZ2F0ZX0gZnJvbSAnLi4vLi4vdXRpbHMvYWdncmVnYXRlLXV0aWxzJztcbmltcG9ydCBGdW5jdGlvbldpZGdldEljb24gZnJvbSAnLi9mdW5jdGlvbi13aWRnZXQtaWNvbic7XG5pbXBvcnQgZ2VvVmlld3BvcnQgZnJvbSAnQG1hcGJveC9nZW8tdmlld3BvcnQnO1xuaW1wb3J0IFdlYk1lcmNhdG9yVmlld3BvcnQgZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5pbXBvcnQge2dldEZpbGVUeXBlfSBmcm9tICdwcm9jZXNzb3JzL2ZpbGUtaGFuZGxlcic7XG5pbXBvcnQgYm9vbGVhbkRpc2pvaW50IGZyb20gJ0B0dXJmL2Jvb2xlYW4tZGlzam9pbnQnO1xuaW1wb3J0IHtwb2ludCwgcG9seWdvbn0gZnJvbSAnQHR1cmYvaGVscGVycyc7XG4vLyBpbXBvcnQgc2ltcGxpZnkgZnJvbSAnQHR1cmYvc2ltcGxpZnknO1xuaW1wb3J0IHNpbXBsaWZ5IGZyb20gJ3NpbXBsaWZ5LWdlb2pzb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGdW5jdGlvbldpZGdldCBleHRlbmRzIFdpZGdldCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAnRnVuY3Rpb24nO1xuICB9XG4gIGdldCBpc0FnZ3JlZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCB3aWRnZXRJY29uKCkge1xuICAgIHJldHVybiBGdW5jdGlvbldpZGdldEljb247XG4gIH1cbiAgZ2V0IHdpZGdldEFnZ3JlZ2F0ZWREYXRhKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY2FsY3VsYXRlQWdncmVnYXRpb25EYXRhKG5ld1dpZGdldCwgc3RhdGUsIG1hcFN0YXRlKSB7XG4gICAgbGV0IGxhdFJhbmdlLCBsbmdSYW5nZTtcblxuICAgIGNvbnN0IHtkYXRhSWQsIGFnZ3JlZ2F0aW9uVHlwZSwgYm91bmRzfSA9IG5ld1dpZGdldC5jb25maWc7XG4gICAgbGV0IGJvdW5kaW5nQm94O1xuICAgIGxldCBjVUwsIGNVUiwgY0xMLCBjTFI7XG4gICAgdmFyIHtkYXRhLCBsYWJlbH0gPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuXG4gICAgaWYgKCFuZXdXaWRnZXQuY29uZmlnLnNlbGVjdGVkTGF5ZXIpIHtcbiAgICAgIHJldHVybiBuZXdXaWRnZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChcbiAgICAgIGwgPT4gbC5pZCA9PT0gbmV3V2lkZ2V0LmNvbmZpZy5zZWxlY3RlZExheWVyLmlkXG4gICAgKTtcblxuICAgIGNvbnN0IHtmaWVsZHN9ID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXTtcblxuICAgIGlmIChtYXBTdGF0ZSAmJiBib3VuZHMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbG9uZ2l0dWRlLFxuICAgICAgICBsYXRpdHVkZSxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgem9vbSxcbiAgICAgICAgcGl0Y2gsXG4gICAgICAgIGJlYXJpbmdcbiAgICAgIH0gPSBtYXBTdGF0ZTtcblxuICAgICAgYm91bmRpbmdCb3ggPSBnZW9WaWV3cG9ydC5ib3VuZHMoW2xvbmdpdHVkZSwgbGF0aXR1ZGVdLCB6b29tLCBbXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCB2aWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICAgICAgem9vbTogem9vbSxcbiAgICAgICAgcGl0Y2g6IHBpdGNoLFxuICAgICAgICBiZWFyaW5nOiBiZWFyaW5nXG4gICAgICB9KTtcbiAgICAgIGNVTCA9IHZpZXdwb3J0LnVucHJvamVjdChbMCwgMF0pO1xuICAgICAgY1VSID0gdmlld3BvcnQudW5wcm9qZWN0KFt3aWR0aCwgMF0pO1xuICAgICAgY0xSID0gdmlld3BvcnQudW5wcm9qZWN0KFt3aWR0aCwgaGVpZ2h0XSk7XG4gICAgICBjTEwgPSB2aWV3cG9ydC51bnByb2plY3QoWzAsIGhlaWdodF0pO1xuXG4gICAgICBsYXRSYW5nZSA9IFsuLi5uZXcgU2V0KFtjTExbMV0sIGNVUlsxXSwgY0xSWzFdLCBjVUxbMV1dKV0uc29ydChcbiAgICAgICAgKGEsIGIpID0+IGEgLSBiXG4gICAgICApO1xuICAgICAgbG5nUmFuZ2UgPSBbLi4ubmV3IFNldChbY0xMWzBdLCBjVVJbMF0sIGNMUlswXSwgY1VMWzBdXSldLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBhIC0gYlxuICAgICAgKTtcblxuICAgICAgY29uc3QgYm91bmRpbmdQb2x5Z29uID0ge1xuICAgICAgICB0eXBlOiAnUG9seWdvbicsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBbW2NVTCwgY1VSLCBjTFIsIGNMTF1dLFxuICAgICAgICBjcnM6IHtcbiAgICAgICAgICB0eXBlOiAnbmFtZScsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgbmFtZTogJ0VQU0c6NDMyNidcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChnZXRGaWxlVHlwZShsYWJlbCkgIT09ICdqc29uJyAmJiBib3VuZGluZ0JveCkge1xuICAgICAgICBjb25zdCBsYXRJZHggPSBzdGF0ZS5sYXllcnNbaWR4XS5jb25maWcuY29sdW1ucy5sYXQuZmllbGRJZHg7XG4gICAgICAgIGNvbnN0IGxuZ0lkeCA9IHN0YXRlLmxheWVyc1tpZHhdLmNvbmZpZy5jb2x1bW5zLmxuZy5maWVsZElkeDtcbiAgICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKGQgPT5cbiAgICAgICAgICBwaXRjaCB8fCBiZWFyaW5nXG4gICAgICAgICAgICA/ICFib29sZWFuRGlzam9pbnQocG9pbnQoW2RbbG5nSWR4XSwgZFtsYXRJZHhdXSksIGJvdW5kaW5nUG9seWdvbilcbiAgICAgICAgICAgIDogZFtsYXRJZHhdID4gbGF0UmFuZ2VbMF0gJiZcbiAgICAgICAgICAgICAgZFtsYXRJZHhdIDwgbGF0UmFuZ2VbMV0gJiZcbiAgICAgICAgICAgICAgZFtsbmdJZHhdID4gbG5nUmFuZ2VbMF0gJiZcbiAgICAgICAgICAgICAgZFtsbmdJZHhdIDwgbG5nUmFuZ2VbMV1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoYm91bmRpbmdCb3gpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLnNpbXBsaWZpZWRHZW9KU09OIHx8XG4gICAgICAgICAgZGF0YS5sZW5ndGggIT09IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF0uc2ltcGxpZmllZEdlb0pTT04ubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBkYXRhc2V0czoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5kYXRhc2V0cyxcbiAgICAgICAgICAgICAgW2RhdGFJZF06IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLFxuICAgICAgICAgICAgICAgIHNpbXBsaWZpZWRHZW9KU09OOiBkYXRhLm1hcChkID0+IFtcbiAgICAgICAgICAgICAgICAgIC4uLmQsXG4gICAgICAgICAgICAgICAgICAoZFswXSA9IHNpbXBsaWZ5KGRbMF0sIDAuMDEpKVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21tZW50ZWQgcGFydCBpcyB1c2luZyB2aWV3cG9ydCB0byB0ZWxsIHdoaWNoIHBvaW50IGlzIGluIHRoZSB2aWV3cG9ydCBhbmQgZmFzdGVyIHRoYW4gdHVyZi5qc1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzdGF0ZSBpbnNpZGUgZ2VvanNvbiBhZ2dyZWdhdGlvbiAnLCBzdGF0ZSk7XG4gICAgICAgIC8vIGRhdGEgPSBzdGF0ZS5kIGF0YXNldHNbZGF0YUlkXS5zaW1wbGlmaWVkR2VvSlNPTi5maWx0ZXIoZCA9PlxuICAgICAgICAvLyAgIGQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMucmVkdWNlKChhY2N1LCB2YWwpID0+IHtcbiAgICAgICAgLy8gICAgIHZhciBwb2ludEluc2lkZUJvdW5kcyA9IGZhbHNlO1xuICAgICAgICAvLyAgICAgaWYgKGFjY3UpIHJldHVybiBhY2N1O1xuICAgICAgICAvLyAgICAgdmFyIGkgPSAwO1xuICAgICAgICAvLyAgICAgY29uc3QgZmxhdFZhbCA9IGZsYXRWYWxUb1BvaW50KHZhbCk7XG4gICAgICAgIC8vICAgICAvLyBpZiAodmFsW2ldLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgLy8gICAgIC8vICAgZmxhdFZhbCA9IHZhbC5mbGF0KCk7XG4gICAgICAgIC8vICAgICAvLyB9XG4gICAgICAgIC8vICAgICBkbyB7XG4gICAgICAgIC8vICAgICAgIGNvbnN0IHAgPSBmbGF0VmFsW2ldO1xuICAgICAgICAvLyAgICAgICAvLyBjb25zb2xlLmxvZygncG9pbnQgaW5zaWRlIGRvIHdoaWxlIGxvb3AnLCBwKTtcbiAgICAgICAgLy8gICAgICAgaWYgKFxuICAgICAgICAvLyAgICAgICAgIHZpZXdwb3J0LnByb2plY3QoW3BbMF0sIHBbMV1dKVswXSA+IDAgJiZcbiAgICAgICAgLy8gICAgICAgICB2aWV3cG9ydC5wcm9qZWN0KFtwWzBdLCBwWzFdXSlbMF0gPCB3aWR0aCAmJlxuICAgICAgICAvLyAgICAgICAgIHZpZXdwb3J0LnByb2plY3QoW3BbMF0sIHBbMV1dKVsxXSA+IDAgJiZcbiAgICAgICAgLy8gICAgICAgICB2aWV3cG9ydC5wcm9qZWN0KFtwWzBdLCBwWzFdXSlbMV0gPCBoZWlnaHRcbiAgICAgICAgLy8gICAgICAgKSB7XG4gICAgICAgIC8vICAgICAgICAgcG9pbnRJbnNpZGVCb3VuZHMgPSB0cnVlO1xuICAgICAgICAvLyAgICAgICB9XG4gICAgICAgIC8vICAgICAgIGkrKztcbiAgICAgICAgLy8gICAgIH0gd2hpbGUgKCFwb2ludEluc2lkZUJvdW5kcyAmJiBpIDwgdmFsLmxlbmd0aCk7XG4gICAgICAgIC8vICAgICByZXR1cm4gcG9pbnRJbnNpZGVCb3VuZHM7XG4gICAgICAgIC8vICAgfSwgZmFsc2UpXG4gICAgICAgIC8vICk7XG4gICAgICAgIGRhdGEgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLnNpbXBsaWZpZWRHZW9KU09OLmZpbHRlcihcbiAgICAgICAgICBkID0+ICFib29sZWFuRGlzam9pbnQoZFswXSwgYm91bmRpbmdQb2x5Z29uKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIHZpZXdwb3J0LnByb2plY3QoWzAsIDBdKVswXSA+IDAgJiYgdmlld3BvcnQucHJvamVjdChbMCwgMF0pWzBdIDwgd2lkdGhcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coZGF0YS5sZW5ndGgpO1xuICAgICAgICAvLyBkYXRhID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXS5zaW1wbGlmaWVkR2VvSlNPTi5maWx0ZXIoXG4gICAgICAgIC8vICAgZCA9PiAhYm9vbGVhbkRpc2pvaW50KGQsIGJvdW5kaW5nUG9seWdvbilcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coZGF0YS5sZW5ndGgpO1xuXG4gICAgICAgIC8vIGRhdGEgPSBkYXRhLm1hcChkID0+IHtcbiAgICAgICAgLy8gICBjb25zb2xlLmxvZyhkWzBdKTtcbiAgICAgICAgLy8gICBjb25zb2xlLmxvZygpO1xuICAgICAgICAvLyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWdncmVnYXRpb25UeXBlID09PSAnY291bnQnKSB7XG4gICAgICBuZXdXaWRnZXQuY29uZmlnLmFnZ3JlZ2F0ZWREYXRhID0gZGF0YS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IG5ld1dpZGdldC5jb25maWcuZmllbGROYW1lO1xuICAgICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KGYgPT4gZi5uYW1lID09PSBmaWVsZE5hbWUpO1xuICAgICAgaWYgKGZpZWxkTmFtZSkge1xuICAgICAgICBsZXQgZmllbGREYXRhID0gZGF0YS5tYXAoZCA9PiB7XG4gICAgICAgICAgaWYgKGQuZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIGQuZGF0YVtmaWVsZElkeF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkW2ZpZWxkSWR4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBhZ2dyZWdhdGVkRGF0YSA9IGFnZ3JlZ2F0ZShmaWVsZERhdGEsIGFnZ3JlZ2F0aW9uVHlwZSk7XG4gICAgICAgIGlmICh0eXBlb2YgYWdncmVnYXRlZERhdGEgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbmV3V2lkZ2V0LmNvbmZpZy5hZ2dyZWdhdGVkRGF0YSA9ICthZ2dyZWdhdGVkRGF0YS50b0ZpeGVkKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1dpZGdldC5jb25maWcuYWdncmVnYXRlZERhdGEgPSBhZ2dyZWdhdGVkRGF0YTtcbiAgICAgICAgfVxuICAgICAgICBuZXdXaWRnZXQuY29uZmlnLmFnZ3JlZ2F0ZWREYXRhO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgICduZXdXaWRnZXQgYW5kIHN0YXRlIGluc2lkZSBjYWxjdWxhdGVBZ2dyZWdhdGlvbkRhdGEnLFxuICAgIC8vICAgbmV3V2lkZ2V0LFxuICAgIC8vICAgc3RhdGVcbiAgICAvLyApO1xuICAgIG5ld1dpZGdldC5jb25maWcuaXNDYWxjdWxhdGluZyA9IGZhbHNlO1xuICAgIHJldHVybiB7bmV3V2lkZ2V0LCB1cGRhdGVkU3RhdGU6IHN0YXRlfTtcbiAgfVxufVxuIl19