kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
331 lines (324 loc) • 40.9 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.ArrowDataContainer = void 0;
exports.arrowDataTypeToAnalyzerDataType = arrowDataTypeToAnalyzerDataType;
exports.arrowDataTypeToFieldType = arrowDataTypeToFieldType;
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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var arrow = _interopRequireWildcard(require("apache-arrow"));
var _window = require("global/window");
var _typeAnalyzer = require("type-analyzer");
var _constants = require("@kepler.gl/constants");
var _dataRow = require("./data-row");
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; }
var _marked = /*#__PURE__*/_regenerator["default"].mark(rowsIterator),
_marked2 = /*#__PURE__*/_regenerator["default"].mark(columnIterator); // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
/**
* @param dataContainer
* @param sharedRow
*/
function rowsIterator(dataContainer, sharedRow) {
var numRows, rowIndex;
return _regenerator["default"].wrap(function rowsIterator$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
numRows = dataContainer.numRows();
rowIndex = 0;
case 2:
if (!(rowIndex < numRows)) {
_context.next = 8;
break;
}
_context.next = 5;
return dataContainer.row(rowIndex, sharedRow);
case 5:
++rowIndex;
_context.next = 2;
break;
case 8:
case "end":
return _context.stop();
}
}, _marked);
}
/**
* @param dataContainer
* @param columnIndex
*/
function columnIterator(dataContainer, columnIndex) {
var numRows, rowIndex;
return _regenerator["default"].wrap(function columnIterator$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
numRows = dataContainer.numRows();
rowIndex = 0;
case 2:
if (!(rowIndex < numRows)) {
_context2.next = 8;
break;
}
_context2.next = 5;
return dataContainer.valueAt(rowIndex, columnIndex);
case 5:
++rowIndex;
_context2.next = 2;
break;
case 8:
case "end":
return _context2.stop();
}
}, _marked2);
}
/**
* A data container where all data is stored in raw Arrow table
*/
var ArrowDataContainer = exports.ArrowDataContainer = /*#__PURE__*/function () {
function ArrowDataContainer(data) {
(0, _classCallCheck2["default"])(this, ArrowDataContainer);
(0, _defineProperty2["default"])(this, "_cols", void 0);
(0, _defineProperty2["default"])(this, "_numColumns", void 0);
(0, _defineProperty2["default"])(this, "_numRows", void 0);
(0, _defineProperty2["default"])(this, "_fields", void 0);
(0, _defineProperty2["default"])(this, "_numChunks", void 0);
// cache column data to make valueAt() faster
// _colData: any[][];
/** An arrow table recreated from vectors */
(0, _defineProperty2["default"])(this, "_arrowTable", void 0);
if (!data.cols) {
throw Error('ArrowDataContainer: no columns provided');
}
if (!Array.isArray(data.cols)) {
throw Error("ArrowDataContainer: columns object isn't an array");
}
this._cols = data.cols;
this._numColumns = data.cols.length;
this._numRows = data.cols[0].length;
this._fields = data.fields || [];
this._numChunks = data.cols[0].data.length;
// this._colData = data.cols.map(c => c.toArray());
this._arrowTable = this._createTable();
}
/**
* Restores internal Arrow table from vectors.
* TODO: consider using original arrow table, as it could contain extra metadata, not passed to the fields.
*/
return (0, _createClass2["default"])(ArrowDataContainer, [{
key: "_createTable",
value: function _createTable() {
var _this = this;
var creaOpts = {};
this._fields.map(function (field, index) {
creaOpts[field.name] = _this._cols[index];
});
return new arrow.Table(creaOpts);
}
}, {
key: "getTable",
value: function getTable() {
return this._arrowTable;
}
}, {
key: "update",
value: function update(updateData) {
this._cols = updateData;
this._numColumns = this._cols.length;
this._numRows = this._cols[0].length;
this._numChunks = this._cols[0].data.length;
this._arrowTable = this._createTable();
// cache column data to make valueAt() faster
// this._colData = this._cols.map(c => c.toArray());
}
}, {
key: "numChunks",
value: function numChunks() {
return this._numChunks;
}
}, {
key: "numRows",
value: function numRows() {
return this._numRows;
}
}, {
key: "numColumns",
value: function numColumns() {
return this._numColumns;
}
}, {
key: "valueAt",
value: function valueAt(rowIndex, columnIndex) {
// return this._colData[columnIndex][rowIndex];
return this._cols[columnIndex].get(rowIndex);
}
}, {
key: "row",
value: function row(rowIndex, sharedRow) {
var tSharedRow = _dataRow.DataRow.createSharedRow(sharedRow);
if (tSharedRow) {
tSharedRow.setSource(this, rowIndex);
return tSharedRow;
}
return new _dataRow.DataRow(this, rowIndex);
}
}, {
key: "rowAsArray",
value: function rowAsArray(rowIndex) {
// return this._colData.map(col => col[rowIndex]);
return this._cols.map(function (col) {
return col.get(rowIndex);
});
}
}, {
key: "rows",
value: function rows(sharedRow) {
var tSharedRow = _dataRow.DataRow.createSharedRow(sharedRow);
return rowsIterator(this, tSharedRow);
}
}, {
key: "column",
value: function column(columnIndex) {
return columnIterator(this, columnIndex);
}
}, {
key: "getColumn",
value: function getColumn(columnIndex) {
return this._cols[columnIndex];
}
}, {
key: "getField",
value: function getField(columnIndex) {
return this._fields[columnIndex];
}
}, {
key: "flattenData",
value: function flattenData() {
var data = [];
for (var i = 0; i < this._numRows; ++i) {
data.push(this.rowAsArray(i));
}
return data;
}
}, {
key: "getPlainIndex",
value: function getPlainIndex() {
return (0, _toConsumableArray2["default"])(Array(this._numRows).keys());
}
}, {
key: "map",
value: function map(func, sharedRow) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var tSharedRow = _dataRow.DataRow.createSharedRow(sharedRow);
var _options$start = options.start,
start = _options$start === void 0 ? 0 : _options$start,
_options$end = options.end,
end = _options$end === void 0 ? this.numRows() : _options$end;
var endRow = Math.min(this.numRows(), end);
var out = [];
for (var rowIndex = start; rowIndex < endRow; ++rowIndex) {
var row = this.row(rowIndex, tSharedRow);
out.push(func(row, rowIndex));
}
return out;
}
}, {
key: "mapIndex",
value: function mapIndex(func) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var _options$start2 = options.start,
start = _options$start2 === void 0 ? 0 : _options$start2,
_options$end2 = options.end,
end = _options$end2 === void 0 ? this.numRows() : _options$end2;
var endRow = Math.min(this.numRows(), end);
var out = [];
for (var rowIndex = start; rowIndex < endRow; ++rowIndex) {
out.push(func({
index: rowIndex
}, this));
}
return out;
}
}, {
key: "find",
value: function find(func, sharedRow) {
var tSharedRow = _dataRow.DataRow.createSharedRow(sharedRow);
for (var rowIndex = 0; rowIndex < this._numRows; ++rowIndex) {
var row = this.row(rowIndex, tSharedRow);
if (func(row, rowIndex)) {
return row;
}
}
return undefined;
}
}, {
key: "reduce",
value: function reduce(func, initialValue, sharedRow) {
var tSharedRow = _dataRow.DataRow.createSharedRow(sharedRow);
for (var rowIndex = 0; rowIndex < this._numRows; ++rowIndex) {
var row = this.row(rowIndex, tSharedRow);
initialValue = func(initialValue, row, rowIndex);
}
return initialValue;
}
}]);
}();
/**
* Convert arrow data type to kepler.gl field types
*
* @param arrowType the arrow data type
* @returns corresponding type in `ALL_FIELD_TYPES`
*/
function arrowDataTypeToFieldType(arrowType) {
// Note: this function doesn't return ALL_FIELD_TYPES.geojson or ALL_FIELD_TYPES.array, which
// should be further detected by caller
if (arrow.DataType.isDate(arrowType)) {
return _constants.ALL_FIELD_TYPES.date;
} else if (arrow.DataType.isTimestamp(arrowType) || arrow.DataType.isTime(arrowType)) {
return _constants.ALL_FIELD_TYPES.timestamp;
} else if (arrow.DataType.isFloat(arrowType)) {
return _constants.ALL_FIELD_TYPES.real;
} else if (arrow.DataType.isInt(arrowType)) {
return _constants.ALL_FIELD_TYPES.integer;
} else if (arrow.DataType.isBool(arrowType)) {
return _constants.ALL_FIELD_TYPES["boolean"];
} else if (arrow.DataType.isUtf8(arrowType) || arrow.DataType.isNull(arrowType)) {
return _constants.ALL_FIELD_TYPES.string;
} else if (arrow.DataType.isBinary(arrowType) || arrow.DataType.isDictionary(arrowType) || arrow.DataType.isFixedSizeBinary(arrowType) || arrow.DataType.isFixedSizeList(arrowType) || arrow.DataType.isList(arrowType) || arrow.DataType.isMap(arrowType) || arrow.DataType.isStruct(arrowType)) {
return _constants.ALL_FIELD_TYPES.object;
}
_window.console.warn("Unsupported arrow type: ".concat(arrowType));
return _constants.ALL_FIELD_TYPES.string;
}
/**
* Convert arrow data type to analyzer type
*
* @param arrowType the arrow data type
* @returns corresponding type in `AnalyzerDATA_TYPES`
*/
function arrowDataTypeToAnalyzerDataType(arrowType) {
if (arrow.DataType.isDate(arrowType)) {
return _typeAnalyzer.DATA_TYPES.DATE;
} else if (arrow.DataType.isTimestamp(arrowType) || arrow.DataType.isTime(arrowType)) {
return _typeAnalyzer.DATA_TYPES.DATETIME;
} else if (arrow.DataType.isFloat(arrowType)) {
return _typeAnalyzer.DATA_TYPES.FLOAT;
} else if (arrow.DataType.isInt(arrowType)) {
return _typeAnalyzer.DATA_TYPES.INT;
} else if (arrow.DataType.isBool(arrowType)) {
return _typeAnalyzer.DATA_TYPES.BOOLEAN;
} else if (arrow.DataType.isUtf8(arrowType) || arrow.DataType.isNull(arrowType)) {
return _typeAnalyzer.DATA_TYPES.STRING;
} else if (arrow.DataType.isBinary(arrowType) || arrow.DataType.isDictionary(arrowType) || arrow.DataType.isFixedSizeBinary(arrowType) || arrow.DataType.isFixedSizeList(arrowType) || arrow.DataType.isList(arrowType) || arrow.DataType.isMap(arrowType) || arrow.DataType.isStruct(arrowType)) {
return _typeAnalyzer.DATA_TYPES.OBJECT;
}
_window.console.warn("Unsupported arrow type: ".concat(arrowType));
return _typeAnalyzer.DATA_TYPES.STRING;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhcnJvdyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl93aW5kb3ciLCJfdHlwZUFuYWx5emVyIiwiX2NvbnN0YW50cyIsIl9kYXRhUm93IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX21hcmtlZCIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJyb3dzSXRlcmF0b3IiLCJfbWFya2VkMiIsImNvbHVtbkl0ZXJhdG9yIiwiZGF0YUNvbnRhaW5lciIsInNoYXJlZFJvdyIsIm51bVJvd3MiLCJyb3dJbmRleCIsIndyYXAiLCJyb3dzSXRlcmF0b3IkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInJvdyIsInN0b3AiLCJjb2x1bW5JbmRleCIsImNvbHVtbkl0ZXJhdG9yJCIsIl9jb250ZXh0MiIsInZhbHVlQXQiLCJBcnJvd0RhdGFDb250YWluZXIiLCJleHBvcnRzIiwiZGF0YSIsIl9jbGFzc0NhbGxDaGVjazIiLCJfZGVmaW5lUHJvcGVydHkyIiwiY29scyIsIkVycm9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX2NvbHMiLCJfbnVtQ29sdW1ucyIsImxlbmd0aCIsIl9udW1Sb3dzIiwiX2ZpZWxkcyIsImZpZWxkcyIsIl9udW1DaHVua3MiLCJfYXJyb3dUYWJsZSIsIl9jcmVhdGVUYWJsZSIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsIl90aGlzIiwiY3JlYU9wdHMiLCJtYXAiLCJmaWVsZCIsImluZGV4IiwibmFtZSIsIlRhYmxlIiwiZ2V0VGFibGUiLCJ1cGRhdGUiLCJ1cGRhdGVEYXRhIiwibnVtQ2h1bmtzIiwibnVtQ29sdW1ucyIsInRTaGFyZWRSb3ciLCJEYXRhUm93IiwiY3JlYXRlU2hhcmVkUm93Iiwic2V0U291cmNlIiwicm93QXNBcnJheSIsImNvbCIsInJvd3MiLCJjb2x1bW4iLCJnZXRDb2x1bW4iLCJnZXRGaWVsZCIsImZsYXR0ZW5EYXRhIiwicHVzaCIsImdldFBsYWluSW5kZXgiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwia2V5cyIsImZ1bmMiLCJvcHRpb25zIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiX29wdGlvbnMkc3RhcnQiLCJzdGFydCIsIl9vcHRpb25zJGVuZCIsImVuZCIsImVuZFJvdyIsIk1hdGgiLCJtaW4iLCJvdXQiLCJtYXBJbmRleCIsIl9vcHRpb25zJHN0YXJ0MiIsIl9vcHRpb25zJGVuZDIiLCJmaW5kIiwicmVkdWNlIiwiaW5pdGlhbFZhbHVlIiwiYXJyb3dEYXRhVHlwZVRvRmllbGRUeXBlIiwiYXJyb3dUeXBlIiwiRGF0YVR5cGUiLCJpc0RhdGUiLCJBTExfRklFTERfVFlQRVMiLCJkYXRlIiwiaXNUaW1lc3RhbXAiLCJpc1RpbWUiLCJ0aW1lc3RhbXAiLCJpc0Zsb2F0IiwicmVhbCIsImlzSW50IiwiaW50ZWdlciIsImlzQm9vbCIsImlzVXRmOCIsImlzTnVsbCIsInN0cmluZyIsImlzQmluYXJ5IiwiaXNEaWN0aW9uYXJ5IiwiaXNGaXhlZFNpemVCaW5hcnkiLCJpc0ZpeGVkU2l6ZUxpc3QiLCJpc0xpc3QiLCJpc01hcCIsImlzU3RydWN0Iiwib2JqZWN0IiwiZ2xvYmFsQ29uc29sZSIsIndhcm4iLCJjb25jYXQiLCJhcnJvd0RhdGFUeXBlVG9BbmFseXplckRhdGFUeXBlIiwiQW5hbHl6ZXJEQVRBX1RZUEVTIiwiREFURSIsIkRBVEVUSU1FIiwiRkxPQVQiLCJJTlQiLCJCT09MRUFOIiwiU1RSSU5HIiwiT0JKRUNUIl0sInNvdXJjZXMiOlsiLi4vc3JjL2Fycm93LWRhdGEtY29udGFpbmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCAqIGFzIGFycm93IGZyb20gJ2FwYWNoZS1hcnJvdyc7XG5pbXBvcnQge2NvbnNvbGUgYXMgZ2xvYmFsQ29uc29sZX0gZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQge0RBVEFfVFlQRVMgYXMgQW5hbHl6ZXJEQVRBX1RZUEVTfSBmcm9tICd0eXBlLWFuYWx5emVyJztcbmltcG9ydCB7UHJvdG9EYXRhc2V0RmllbGR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtBTExfRklFTERfVFlQRVN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcblxuaW1wb3J0IHtEYXRhUm93LCBTaGFyZWRSb3dPcHRpb25zfSBmcm9tICcuL2RhdGEtcm93JztcbmltcG9ydCB7RGF0YUNvbnRhaW5lckludGVyZmFjZSwgUmFuZ2VPcHRpb25zfSBmcm9tICcuL2RhdGEtY29udGFpbmVyLWludGVyZmFjZSc7XG5cbnR5cGUgQXJyb3dEYXRhQ29udGFpbmVySW5wdXQgPSB7XG4gIGNvbHM6IGFycm93LlZlY3RvcltdO1xuICBmaWVsZHM/OiBQcm90b0RhdGFzZXRGaWVsZFtdO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gZGF0YUNvbnRhaW5lclxuICogQHBhcmFtIHNoYXJlZFJvd1xuICovXG5mdW5jdGlvbiogcm93c0l0ZXJhdG9yKGRhdGFDb250YWluZXI6IERhdGFDb250YWluZXJJbnRlcmZhY2UsIHNoYXJlZFJvdzogU2hhcmVkUm93T3B0aW9ucykge1xuICBjb25zdCBudW1Sb3dzID0gZGF0YUNvbnRhaW5lci5udW1Sb3dzKCk7XG4gIGZvciAobGV0IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCBudW1Sb3dzOyArK3Jvd0luZGV4KSB7XG4gICAgeWllbGQgZGF0YUNvbnRhaW5lci5yb3cocm93SW5kZXgsIHNoYXJlZFJvdyk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0gZGF0YUNvbnRhaW5lclxuICogQHBhcmFtIGNvbHVtbkluZGV4XG4gKi9cbmZ1bmN0aW9uKiBjb2x1bW5JdGVyYXRvcihkYXRhQ29udGFpbmVyOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlLCBjb2x1bW5JbmRleDogbnVtYmVyKSB7XG4gIGNvbnN0IG51bVJvd3MgPSBkYXRhQ29udGFpbmVyLm51bVJvd3MoKTtcbiAgZm9yIChsZXQgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IG51bVJvd3M7ICsrcm93SW5kZXgpIHtcbiAgICB5aWVsZCBkYXRhQ29udGFpbmVyLnZhbHVlQXQocm93SW5kZXgsIGNvbHVtbkluZGV4KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgZGF0YSBjb250YWluZXIgd2hlcmUgYWxsIGRhdGEgaXMgc3RvcmVkIGluIHJhdyBBcnJvdyB0YWJsZVxuICovXG5leHBvcnQgY2xhc3MgQXJyb3dEYXRhQ29udGFpbmVyIGltcGxlbWVudHMgRGF0YUNvbnRhaW5lckludGVyZmFjZSB7XG4gIF9jb2xzOiBhcnJvdy5WZWN0b3JbXTtcbiAgX251bUNvbHVtbnM6IG51bWJlcjtcbiAgX251bVJvd3M6IG51bWJlcjtcbiAgX2ZpZWxkczogUHJvdG9EYXRhc2V0RmllbGRbXTtcbiAgX251bUNodW5rczogbnVtYmVyO1xuICAvLyBjYWNoZSBjb2x1bW4gZGF0YSB0byBtYWtlIHZhbHVlQXQoKSBmYXN0ZXJcbiAgLy8gX2NvbERhdGE6IGFueVtdW107XG5cbiAgLyoqIEFuIGFycm93IHRhYmxlIHJlY3JlYXRlZCBmcm9tIHZlY3RvcnMgKi9cbiAgX2Fycm93VGFibGU6IGFycm93LlRhYmxlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IEFycm93RGF0YUNvbnRhaW5lcklucHV0KSB7XG4gICAgaWYgKCFkYXRhLmNvbHMpIHtcbiAgICAgIHRocm93IEVycm9yKCdBcnJvd0RhdGFDb250YWluZXI6IG5vIGNvbHVtbnMgcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5jb2xzKSkge1xuICAgICAgdGhyb3cgRXJyb3IoXCJBcnJvd0RhdGFDb250YWluZXI6IGNvbHVtbnMgb2JqZWN0IGlzbid0IGFuIGFycmF5XCIpO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbHMgPSBkYXRhLmNvbHM7XG4gICAgdGhpcy5fbnVtQ29sdW1ucyA9IGRhdGEuY29scy5sZW5ndGg7XG4gICAgdGhpcy5fbnVtUm93cyA9IGRhdGEuY29sc1swXS5sZW5ndGg7XG4gICAgdGhpcy5fZmllbGRzID0gZGF0YS5maWVsZHMgfHwgW107XG4gICAgdGhpcy5fbnVtQ2h1bmtzID0gZGF0YS5jb2xzWzBdLmRhdGEubGVuZ3RoO1xuICAgIC8vIHRoaXMuX2NvbERhdGEgPSBkYXRhLmNvbHMubWFwKGMgPT4gYy50b0FycmF5KCkpO1xuXG4gICAgdGhpcy5fYXJyb3dUYWJsZSA9IHRoaXMuX2NyZWF0ZVRhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZXMgaW50ZXJuYWwgQXJyb3cgdGFibGUgZnJvbSB2ZWN0b3JzLlxuICAgKiBUT0RPOiBjb25zaWRlciB1c2luZyBvcmlnaW5hbCBhcnJvdyB0YWJsZSwgYXMgaXQgY291bGQgY29udGFpbiBleHRyYSBtZXRhZGF0YSwgbm90IHBhc3NlZCB0byB0aGUgZmllbGRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlVGFibGUoKSB7XG4gICAgY29uc3QgY3JlYU9wdHMgPSB7fTtcbiAgICB0aGlzLl9maWVsZHMubWFwKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgIGNyZWFPcHRzW2ZpZWxkLm5hbWVdID0gdGhpcy5fY29sc1tpbmRleF07XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBhcnJvdy5UYWJsZShjcmVhT3B0cyk7XG4gIH1cblxuICBnZXRUYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJyb3dUYWJsZTtcbiAgfVxuXG4gIHVwZGF0ZSh1cGRhdGVEYXRhOiBhcnJvdy5WZWN0b3I8YW55PltdKSB7XG4gICAgdGhpcy5fY29scyA9IHVwZGF0ZURhdGE7XG4gICAgdGhpcy5fbnVtQ29sdW1ucyA9IHRoaXMuX2NvbHMubGVuZ3RoO1xuICAgIHRoaXMuX251bVJvd3MgPSB0aGlzLl9jb2xzWzBdLmxlbmd0aDtcbiAgICB0aGlzLl9udW1DaHVua3MgPSB0aGlzLl9jb2xzWzBdLmRhdGEubGVuZ3RoO1xuXG4gICAgdGhpcy5fYXJyb3dUYWJsZSA9IHRoaXMuX2NyZWF0ZVRhYmxlKCk7XG5cbiAgICAvLyBjYWNoZSBjb2x1bW4gZGF0YSB0byBtYWtlIHZhbHVlQXQoKSBmYXN0ZXJcbiAgICAvLyB0aGlzLl9jb2xEYXRhID0gdGhpcy5fY29scy5tYXAoYyA9PiBjLnRvQXJyYXkoKSk7XG4gIH1cblxuICBudW1DaHVua3MoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtQ2h1bmtzO1xuICB9XG5cbiAgbnVtUm93cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9udW1Sb3dzO1xuICB9XG5cbiAgbnVtQ29sdW1ucygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9udW1Db2x1bW5zO1xuICB9XG5cbiAgdmFsdWVBdChyb3dJbmRleDogbnVtYmVyLCBjb2x1bW5JbmRleDogbnVtYmVyKTogYW55IHtcbiAgICAvLyByZXR1cm4gdGhpcy5fY29sRGF0YVtjb2x1bW5JbmRleF1bcm93SW5kZXhdO1xuICAgIHJldHVybiB0aGlzLl9jb2xzW2NvbHVtbkluZGV4XS5nZXQocm93SW5kZXgpO1xuICB9XG5cbiAgcm93KHJvd0luZGV4OiBudW1iZXIsIHNoYXJlZFJvdz86IFNoYXJlZFJvd09wdGlvbnMpOiBEYXRhUm93IHtcbiAgICBjb25zdCB0U2hhcmVkUm93ID0gRGF0YVJvdy5jcmVhdGVTaGFyZWRSb3coc2hhcmVkUm93KTtcbiAgICBpZiAodFNoYXJlZFJvdykge1xuICAgICAgdFNoYXJlZFJvdy5zZXRTb3VyY2UodGhpcywgcm93SW5kZXgpO1xuICAgICAgcmV0dXJuIHRTaGFyZWRSb3c7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEYXRhUm93KHRoaXMsIHJvd0luZGV4KTtcbiAgfVxuXG4gIHJvd0FzQXJyYXkocm93SW5kZXg6IG51bWJlcik6IGFueVtdIHtcbiAgICAvLyByZXR1cm4gdGhpcy5fY29sRGF0YS5tYXAoY29sID0+IGNvbFtyb3dJbmRleF0pO1xuICAgIHJldHVybiB0aGlzLl9jb2xzLm1hcChjb2wgPT4gY29sLmdldChyb3dJbmRleCkpO1xuICB9XG5cbiAgcm93cyhzaGFyZWRSb3c6IFNoYXJlZFJvd09wdGlvbnMpIHtcbiAgICBjb25zdCB0U2hhcmVkUm93ID0gRGF0YVJvdy5jcmVhdGVTaGFyZWRSb3coc2hhcmVkUm93KTtcbiAgICByZXR1cm4gcm93c0l0ZXJhdG9yKHRoaXMsIHRTaGFyZWRSb3cpO1xuICB9XG5cbiAgY29sdW1uKGNvbHVtbkluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gY29sdW1uSXRlcmF0b3IodGhpcywgY29sdW1uSW5kZXgpO1xuICB9XG5cbiAgZ2V0Q29sdW1uKGNvbHVtbkluZGV4OiBudW1iZXIpOiBhcnJvdy5WZWN0b3Ige1xuICAgIHJldHVybiB0aGlzLl9jb2xzW2NvbHVtbkluZGV4XTtcbiAgfVxuXG4gIGdldEZpZWxkKGNvbHVtbkluZGV4OiBudW1iZXIpOiBQcm90b0RhdGFzZXRGaWVsZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkc1tjb2x1bW5JbmRleF07XG4gIH1cblxuICBmbGF0dGVuRGF0YSgpOiBhbnlbXVtdIHtcbiAgICBjb25zdCBkYXRhOiBhbnlbXVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9udW1Sb3dzOyArK2kpIHtcbiAgICAgIGRhdGEucHVzaCh0aGlzLnJvd0FzQXJyYXkoaSkpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGdldFBsYWluSW5kZXgoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiBbLi4uQXJyYXkodGhpcy5fbnVtUm93cykua2V5cygpXTtcbiAgfVxuXG4gIG1hcDxUPihcbiAgICBmdW5jOiAocm93OiBEYXRhUm93LCBpbmRleDogbnVtYmVyKSA9PiBULFxuICAgIHNoYXJlZFJvdz86IFNoYXJlZFJvd09wdGlvbnMsXG4gICAgb3B0aW9uczogUmFuZ2VPcHRpb25zID0ge31cbiAgKTogVFtdIHtcbiAgICBjb25zdCB0U2hhcmVkUm93ID0gRGF0YVJvdy5jcmVhdGVTaGFyZWRSb3coc2hhcmVkUm93KTtcblxuICAgIGNvbnN0IHtzdGFydCA9IDAsIGVuZCA9IHRoaXMubnVtUm93cygpfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgZW5kUm93ID0gTWF0aC5taW4odGhpcy5udW1Sb3dzKCksIGVuZCk7XG5cbiAgICBjb25zdCBvdXQ6IFRbXSA9IFtdO1xuICAgIGZvciAobGV0IHJvd0luZGV4ID0gc3RhcnQ7IHJvd0luZGV4IDwgZW5kUm93OyArK3Jvd0luZGV4KSB7XG4gICAgICBjb25zdCByb3cgPSB0aGlzLnJvdyhyb3dJbmRleCwgdFNoYXJlZFJvdyk7XG4gICAgICBvdXQucHVzaChmdW5jKHJvdywgcm93SW5kZXgpKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIG1hcEluZGV4PFQ+KGZ1bmM6ICh7aW5kZXh9LCBkYzogRGF0YUNvbnRhaW5lckludGVyZmFjZSkgPT4gVCwgb3B0aW9uczogUmFuZ2VPcHRpb25zID0ge30pOiBUW10ge1xuICAgIGNvbnN0IHtzdGFydCA9IDAsIGVuZCA9IHRoaXMubnVtUm93cygpfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgZW5kUm93ID0gTWF0aC5taW4odGhpcy5udW1Sb3dzKCksIGVuZCk7XG5cbiAgICBjb25zdCBvdXQ6IFRbXSA9IFtdO1xuICAgIGZvciAobGV0IHJvd0luZGV4ID0gc3RhcnQ7IHJvd0luZGV4IDwgZW5kUm93OyArK3Jvd0luZGV4KSB7XG4gICAgICBvdXQucHVzaChmdW5jKHtpbmRleDogcm93SW5kZXh9LCB0aGlzKSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBmaW5kKFxuICAgIGZ1bmM6IChyb3c6IERhdGFSb3csIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4gICAgc2hhcmVkUm93PzogU2hhcmVkUm93T3B0aW9uc1xuICApOiBEYXRhUm93IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB0U2hhcmVkUm93ID0gRGF0YVJvdy5jcmVhdGVTaGFyZWRSb3coc2hhcmVkUm93KTtcblxuICAgIGZvciAobGV0IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCB0aGlzLl9udW1Sb3dzOyArK3Jvd0luZGV4KSB7XG4gICAgICBjb25zdCByb3cgPSB0aGlzLnJvdyhyb3dJbmRleCwgdFNoYXJlZFJvdyk7XG4gICAgICBpZiAoZnVuYyhyb3csIHJvd0luZGV4KSkge1xuICAgICAgICByZXR1cm4gcm93O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmVkdWNlPFQ+KFxuICAgIGZ1bmM6IChhY2M6IFQsIHJvdzogRGF0YVJvdywgaW5kZXg6IG51bWJlcikgPT4gVCxcbiAgICBpbml0aWFsVmFsdWU6IFQsXG4gICAgc2hhcmVkUm93PzogU2hhcmVkUm93T3B0aW9uc1xuICApOiBUIHtcbiAgICBjb25zdCB0U2hhcmVkUm93ID0gRGF0YVJvdy5jcmVhdGVTaGFyZWRSb3coc2hhcmVkUm93KTtcblxuICAgIGZvciAobGV0IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCB0aGlzLl9udW1Sb3dzOyArK3Jvd0luZGV4KSB7XG4gICAgICBjb25zdCByb3cgPSB0aGlzLnJvdyhyb3dJbmRleCwgdFNoYXJlZFJvdyk7XG4gICAgICBpbml0aWFsVmFsdWUgPSBmdW5jKGluaXRpYWxWYWx1ZSwgcm93LCByb3dJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBpbml0aWFsVmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFycm93IGRhdGEgdHlwZSB0byBrZXBsZXIuZ2wgZmllbGQgdHlwZXNcbiAqXG4gKiBAcGFyYW0gYXJyb3dUeXBlIHRoZSBhcnJvdyBkYXRhIHR5cGVcbiAqIEByZXR1cm5zIGNvcnJlc3BvbmRpbmcgdHlwZSBpbiBgQUxMX0ZJRUxEX1RZUEVTYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyb3dEYXRhVHlwZVRvRmllbGRUeXBlKGFycm93VHlwZTogYXJyb3cuRGF0YVR5cGUpOiBzdHJpbmcge1xuICAvLyBOb3RlOiB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmV0dXJuIEFMTF9GSUVMRF9UWVBFUy5nZW9qc29uIG9yIEFMTF9GSUVMRF9UWVBFUy5hcnJheSwgd2hpY2hcbiAgLy8gc2hvdWxkIGJlIGZ1cnRoZXIgZGV0ZWN0ZWQgYnkgY2FsbGVyXG4gIGlmIChhcnJvdy5EYXRhVHlwZS5pc0RhdGUoYXJyb3dUeXBlKSkge1xuICAgIHJldHVybiBBTExfRklFTERfVFlQRVMuZGF0ZTtcbiAgfSBlbHNlIGlmIChhcnJvdy5EYXRhVHlwZS5pc1RpbWVzdGFtcChhcnJvd1R5cGUpIHx8IGFycm93LkRhdGFUeXBlLmlzVGltZShhcnJvd1R5cGUpKSB7XG4gICAgcmV0dXJuIEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXA7XG4gIH0gZWxzZSBpZiAoYXJyb3cuRGF0YVR5cGUuaXNGbG9hdChhcnJvd1R5cGUpKSB7XG4gICAgcmV0dXJuIEFMTF9GSUVMRF9UWVBFUy5yZWFsO1xuICB9IGVsc2UgaWYgKGFycm93LkRhdGFUeXBlLmlzSW50KGFycm93VHlwZSkpIHtcbiAgICByZXR1cm4gQUxMX0ZJRUxEX1RZUEVTLmludGVnZXI7XG4gIH0gZWxzZSBpZiAoYXJyb3cuRGF0YVR5cGUuaXNCb29sKGFycm93VHlwZSkpIHtcbiAgICByZXR1cm4gQUxMX0ZJRUxEX1RZUEVTLmJvb2xlYW47XG4gIH0gZWxzZSBpZiAoYXJyb3cuRGF0YVR5cGUuaXNVdGY4KGFycm93VHlwZSkgfHwgYXJyb3cuRGF0YVR5cGUuaXNOdWxsKGFycm93VHlwZSkpIHtcbiAgICByZXR1cm4gQUxMX0ZJRUxEX1RZUEVTLnN0cmluZztcbiAgfSBlbHNlIGlmIChcbiAgICBhcnJvdy5EYXRhVHlwZS5pc0JpbmFyeShhcnJvd1R5cGUpIHx8XG4gICAgYXJyb3cuRGF0YVR5cGUuaXNEaWN0aW9uYXJ5KGFycm93VHlwZSkgfHxcbiAgICBhcnJvdy5EYXRhVHlwZS5pc0ZpeGVkU2l6ZUJpbmFyeShhcnJvd1R5cGUpIHx8XG4gICAgYXJyb3cuRGF0YVR5cGUuaXNGaXhlZFNpemVMaXN0KGFycm93VHlwZSkgfHxcbiAgICBhcnJvdy5EYXRhVHlwZS5pc0xpc3QoYXJyb3dUeXBlKSB8fFxuICAgIGFycm93LkRhdGFUeXBlLmlzTWFwKGFycm93VHlwZSkgfHxcbiAgICBhcnJvdy5EYXRhVHlwZS5pc1N0cnVjdChhcnJvd1R5cGUpXG4gICkge1xuICAgIHJldHVybiBBTExfRklFTERfVFlQRVMub2JqZWN0O1xuICB9XG4gIGdsb2JhbENvbnNvbGUud2FybihgVW5zdXBwb3J0ZWQgYXJyb3cgdHlwZTogJHthcnJvd1R5cGV9YCk7XG4gIHJldHVybiBBTExfRklFTERfVFlQRVMuc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYXJyb3cgZGF0YSB0eXBlIHRvIGFuYWx5emVyIHR5cGVcbiAqXG4gKiBAcGFyYW0gYXJyb3dUeXBlIHRoZSBhcnJvdyBkYXRhIHR5cGVcbiAqIEByZXR1cm5zIGNvcnJlc3BvbmRpbmcgdHlwZSBpbiBgQW5hbHl6ZXJEQVRBX1RZUEVTYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyb3dEYXRhVHlwZVRvQW5hbHl6ZXJEYXRhVHlwZShcbiAgYXJyb3dUeXBlOiBhcnJvdy5EYXRhVHlwZVxuKTogdHlwZW9mIEFuYWx5emVyREFUQV9UWVBFUyB7XG4gIGlmIChhcnJvdy5EYXRhVHlwZS5pc0RhdGUoYXJyb3dUeXBlKSkge1xuICAgIHJldHVybiBBbmFseXplckRBVEFfVFlQRVMuREFURTtcbiAgfSBlbHNlIGlmIChhcnJvdy5EYXRhVHlwZS5pc1RpbWVzdGFtcChhcnJvd1R5cGUpIHx8IGFycm93LkRhdGFUeXBlLmlzVGltZShhcnJvd1R5cGUpKSB7XG4gICAgcmV0dXJuIEFuYWx5emVyREFUQV9UWVBFUy5EQVRFVElNRTtcbiAgfSBlbHNlIGlmIChhcnJvdy5EYXRhVHlwZS5pc0Zsb2F0KGFycm93VHlwZSkpIHtcbiAgICByZXR1cm4gQW5hbHl6ZXJEQVRBX1RZUEVTLkZMT0FUO1xuICB9IGVsc2UgaWYgKGFycm93LkRhdGFUeXBlLmlzSW50KGFycm93VHlwZSkpIHtcbiAgICByZXR1cm4gQW5hbHl6ZXJEQVRBX1RZUEVTLklOVDtcbiAgfSBlbHNlIGlmIChhcnJvdy5EYXRhVHlwZS5pc0Jvb2woYXJyb3dUeXBlKSkge1xuICAgIHJldHVybiBBbmFseXplckRBVEFfVFlQRVMuQk9PTEVBTjtcbiAgfSBlbHNlIGlmIChhcnJvdy5EYXRhVHlwZS5pc1V0ZjgoYXJyb3dUeXBlKSB8fCBhcnJvdy5EYXRhVHlwZS5pc051bGwoYXJyb3dUeXBlKSkge1xuICAgIHJldHVybiBBbmFseXplckRBVEFfVFlQRVMuU1RSSU5HO1xuICB9IGVsc2UgaWYgKFxuICAgIGFycm93LkRhdGFUeXBlLmlzQmluYXJ5KGFycm93VHlwZSkgfHxcbiAgICBhcnJvdy5EYXRhVHlwZS5pc0RpY3Rpb25hcnkoYXJyb3dUeXBlKSB8fFxuICAgIGFycm93LkRhdGFUeXBlLmlzRml4ZWRTaXplQmluYXJ5KGFycm93VHlwZSkgfHxcbiAgICBhcnJvdy5EYXRhVHlwZS5pc0ZpeGVkU2l6ZUxpc3QoYXJyb3dUeXBlKSB8fFxuICAgIGFycm93LkRhdGFUeXBlLmlzTGlzdChhcnJvd1R5cGUpIHx8XG4gICAgYXJyb3cuRGF0YVR5cGUuaXNNYXAoYXJyb3dUeXBlKSB8fFxuICAgIGFycm93LkRhdGFUeXBlLmlzU3RydWN0KGFycm93VHlwZSlcbiAgKSB7XG4gICAgcmV0dXJuIEFuYWx5emVyREFUQV9UWVBFUy5PQkpFQ1Q7XG4gIH1cbiAgZ2xvYmFsQ29uc29sZS53YXJuKGBVbnN1cHBvcnRlZCBhcnJvdyB0eXBlOiAke2Fycm93VHlwZX1gKTtcbiAgcmV0dXJuIEFuYWx5emVyREFUQV9UWVBFUy5TVFJJTkc7XG59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