@kepler.gl/duckdb 3.1.0 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,15 +1,38 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
8
+ exports.SUPPORTED_DUCKDB_DROP_EXTENSIONS = void 0;
9
+ exports.checkIsSelectQuery = checkIsSelectQuery;
10
+ exports.constructST_asWKBQuery = constructST_asWKBQuery;
11
+ exports.dropTableIfExists = void 0;
12
+ exports.getDuckDBColumnTypes = getDuckDBColumnTypes;
13
+ exports.getDuckDBColumnTypesMap = getDuckDBColumnTypesMap;
14
+ exports.getGeometryColumns = getGeometryColumns;
6
15
  exports.isGeoArrowLineString = isGeoArrowLineString;
7
16
  exports.isGeoArrowMultiLineString = isGeoArrowMultiLineString;
8
17
  exports.isGeoArrowMultiPoint = isGeoArrowMultiPoint;
9
18
  exports.isGeoArrowMultiPolygon = isGeoArrowMultiPolygon;
10
19
  exports.isGeoArrowPoint = isGeoArrowPoint;
11
20
  exports.isGeoArrowPolygon = isGeoArrowPolygon;
21
+ exports.removeSQLComments = removeSQLComments;
22
+ exports.restoreUnsupportedExtensions = exports.restoreArrowTable = exports.removeUnsupportedExtensions = void 0;
23
+ exports.sanitizeDuckDBTableName = sanitizeDuckDBTableName;
24
+ exports.setGeoArrowWKBExtension = setGeoArrowWKBExtension;
25
+ exports.splitSqlStatements = splitSqlStatements;
26
+ exports.tableFromFile = tableFromFile;
27
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
28
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
29
+ var arrow = _interopRequireWildcard(require("apache-arrow"));
12
30
  var _type = require("apache-arrow/type");
31
+ var _duckdbWasm = require("@duckdb/duckdb-wasm");
32
+ var _constants = require("@kepler.gl/constants");
33
+ var _utils = require("@kepler.gl/utils");
34
+ 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); }
35
+ 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; }
13
36
  // SPDX-License-Identifier: MIT
14
37
  // Copyright contributors to the kepler.gl project
15
38
 
@@ -19,7 +42,148 @@ var _type = require("apache-arrow/type");
19
42
 
20
43
  // Copied from loaders.gl/geoarrow
21
44
 
22
- // TODO: Remove once Kepler.gl is upgraded to loaders.gl 4.4+
45
+ // TODO: Remove isGeoArrow* once Kepler.gl is upgraded to loaders.gl 4.4+
46
+
47
+ var SUPPORTED_DUCKDB_DROP_EXTENSIONS = exports.SUPPORTED_DUCKDB_DROP_EXTENSIONS = ['arrow', 'csv', 'geojson', 'json', 'parquet'];
48
+ /**
49
+ * Queries a DuckDB table for the schema description.
50
+ * @param connection An active DuckDB connection.
51
+ * @param tableName A name of DuckDB table to query.
52
+ * @returns An array of column names and DuckDB types.
53
+ */
54
+ function getDuckDBColumnTypes(_x, _x2) {
55
+ return _getDuckDBColumnTypes.apply(this, arguments);
56
+ }
57
+ /**
58
+ * Generates a mapping of column names to their corresponding DuckDB data types.
59
+ * @param columns An array of column descriptions from DuckDB. Check getDuckDBColumnTypes.
60
+ * @returns A record where keys are column names and values are their data types.
61
+ */
62
+ function _getDuckDBColumnTypes() {
63
+ _getDuckDBColumnTypes = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(connection, tableName) {
64
+ var resDescribe, duckDbTypes, numRows, i, _resDescribe$getChild, _resDescribe$getChild2, columnName, columnType;
65
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
66
+ while (1) switch (_context2.prev = _context2.next) {
67
+ case 0:
68
+ _context2.next = 2;
69
+ return connection.query("DESCRIBE \"".concat(tableName, "\""));
70
+ case 2:
71
+ resDescribe = _context2.sent;
72
+ duckDbTypes = [];
73
+ numRows = resDescribe.numRows;
74
+ for (i = 0; i < numRows; ++i) {
75
+ columnName = (_resDescribe$getChild = resDescribe.getChildAt(0)) === null || _resDescribe$getChild === void 0 ? void 0 : _resDescribe$getChild.get(i);
76
+ columnType = (_resDescribe$getChild2 = resDescribe.getChildAt(1)) === null || _resDescribe$getChild2 === void 0 ? void 0 : _resDescribe$getChild2.get(i);
77
+ duckDbTypes.push({
78
+ name: columnName,
79
+ type: columnType
80
+ });
81
+ }
82
+ return _context2.abrupt("return", duckDbTypes);
83
+ case 7:
84
+ case "end":
85
+ return _context2.stop();
86
+ }
87
+ }, _callee2);
88
+ }));
89
+ return _getDuckDBColumnTypes.apply(this, arguments);
90
+ }
91
+ function getDuckDBColumnTypesMap(columns) {
92
+ return columns.reduce(function (acc, value) {
93
+ acc[value.name] = value.type;
94
+ return acc;
95
+ }, {});
96
+ }
97
+
98
+ /**
99
+ * Constructs an SQL query to select all columns from a given table,
100
+ * converting specified columns to Well-Known Binary (WKB) format using ST_AsWKB.
101
+ * @param tableName The name of the table from which to select data.
102
+ * @param columnsToConvertToWKB An array of column names that should be converted to WKB format.
103
+ * @returns The constructed SQL query.
104
+ */
105
+ function constructST_asWKBQuery(tableName, columnsToConvertToWKB) {
106
+ var exclude = columnsToConvertToWKB.length > 0 ? "EXCLUDE ".concat(columnsToConvertToWKB.join(', ')) : '';
107
+ var asWKB = columnsToConvertToWKB.length > 0 ? ", ".concat(columnsToConvertToWKB.map(function (column) {
108
+ return "ST_AsWKB(".concat(column, ") as ").concat(column);
109
+ }).join(', ')) : '';
110
+ return "SELECT * ".concat(exclude, " ").concat(asWKB, " FROM '").concat(tableName, "'");
111
+ }
112
+
113
+ /**
114
+ * Finds the names of columns that have a GEOMETRY type.
115
+ * @param columns An array of column descriptors from a DuckDB table.
116
+ * @returns An array of column names that are of type GEOMETRY.
117
+ */
118
+ function getGeometryColumns(columns) {
119
+ return columns.filter(function (column) {
120
+ return column.type === 'GEOMETRY';
121
+ }).map(function (column) {
122
+ return column.name;
123
+ });
124
+ }
125
+
126
+ /**
127
+ * Sets the GeoArrow WKB extension metadata for columns of type GEOMETRY in an Arrow table.
128
+ * @param table The Apache Arrow table whose schema fields will be modified.
129
+ * @param columns An array of column descriptors from a DuckDB table.
130
+ */
131
+ function setGeoArrowWKBExtension(table, columns) {
132
+ table.schema.fields.forEach(function (field) {
133
+ var info = columns.find(function (t) {
134
+ return t.name === field.name;
135
+ });
136
+ if ((info === null || info === void 0 ? void 0 : info.type) === 'GEOMETRY') {
137
+ field.metadata.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.WKB);
138
+ }
139
+ });
140
+ }
141
+
142
+ /**
143
+ * Creates an arrow table from an array of arrow vectors and fields.
144
+ * @param columns An array of arrow vectors.
145
+ * @param fields An array of fields per arrow vector.
146
+ * @param arrowSchema Optional arrow table schema when available.
147
+ * @returns An arrow table.
148
+ */
149
+ var restoreArrowTable = exports.restoreArrowTable = function restoreArrowTable(columns, fields, arrowSchema) {
150
+ var creaOpts = {};
151
+ fields.map(function (field, index) {
152
+ creaOpts[field.name] = columns[index];
153
+ });
154
+ return arrowSchema ? new arrow.Table(arrowSchema, creaOpts) : new arrow.Table(creaOpts);
155
+ };
156
+
157
+ /**
158
+ * DuckDb throws when geoarrow extensions are present in metadata.
159
+ * @param table An arrow table to clear from extensions.
160
+ * @returns A map of removed per field geoarrow extensions.
161
+ */
162
+ var removeUnsupportedExtensions = exports.removeUnsupportedExtensions = function removeUnsupportedExtensions(table) {
163
+ var removedMetadata = {};
164
+ table.schema.fields.forEach(function (field) {
165
+ var extension = field.metadata.get(_constants.GEOARROW_METADATA_KEY);
166
+ if (extension !== null && extension !== void 0 && extension.startsWith('geoarrow')) {
167
+ removedMetadata[field.name] = extension;
168
+ field.metadata["delete"](_constants.GEOARROW_METADATA_KEY);
169
+ }
170
+ });
171
+ return removedMetadata;
172
+ };
173
+
174
+ /**
175
+ * Restore removed metadata extensions after a call to removeUnsupportedExtensions.
176
+ * @param table An arrow table to restore geoarrow extensions.
177
+ * @param removedExtensions A map of per field geoarrow extensions to restore.
178
+ */
179
+ var restoreUnsupportedExtensions = exports.restoreUnsupportedExtensions = function restoreUnsupportedExtensions(table, removedExtensions) {
180
+ table.schema.fields.forEach(function (field) {
181
+ var extension = removedExtensions[field.name];
182
+ if (extension) {
183
+ field.metadata.set(_constants.GEOARROW_METADATA_KEY, extension);
184
+ }
185
+ });
186
+ };
23
187
 
24
188
  /** Checks whether the given Apache Arrow JS type is a Point data type */
25
189
  function isGeoArrowPoint(type) {
@@ -107,4 +271,337 @@ function isGeoArrowMultiPolygon(type) {
107
271
  }
108
272
  return true;
109
273
  }
110
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZSIsInJlcXVpcmUiLCJpc0dlb0Fycm93UG9pbnQiLCJ0eXBlIiwiRGF0YVR5cGUiLCJpc0ZpeGVkU2l6ZUxpc3QiLCJpbmNsdWRlcyIsImxpc3RTaXplIiwiaXNGbG9hdCIsImNoaWxkcmVuIiwiaXNHZW9BcnJvd0xpbmVTdHJpbmciLCJpc0xpc3QiLCJpc0dlb0Fycm93UG9seWdvbiIsImlzR2VvQXJyb3dNdWx0aVBvaW50IiwiaXNHZW9BcnJvd011bHRpTGluZVN0cmluZyIsImlzR2VvQXJyb3dNdWx0aVBvbHlnb24iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGFibGUvZHVja2RiLXRhYmxlLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8vIGxvYWRlcnMuZ2xcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCAoYykgdmlzLmdsIGNvbnRyaWJ1dG9yc1xuXG4vLyBDb3BpZWQgZnJvbSBsb2FkZXJzLmdsL2dlb2Fycm93XG5cbi8vIFRPRE86IFJlbW92ZSBvbmNlIEtlcGxlci5nbCBpcyB1cGdyYWRlZCB0byBsb2FkZXJzLmdsIDQuNCtcblxuaW1wb3J0IHtEYXRhVHlwZX0gZnJvbSAnYXBhY2hlLWFycm93L3R5cGUnO1xuXG4vKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIEFwYWNoZSBBcnJvdyBKUyB0eXBlIGlzIGEgUG9pbnQgZGF0YSB0eXBlICovXG5leHBvcnQgZnVuY3Rpb24gaXNHZW9BcnJvd1BvaW50KHR5cGU6IERhdGFUeXBlKSB7XG4gIGlmIChEYXRhVHlwZS5pc0ZpeGVkU2l6ZUxpc3QodHlwZSkpIHtcbiAgICAvLyBDaGVjayBsaXN0IHNpemVcbiAgICBpZiAoIVsyLCAzLCA0XS5pbmNsdWRlcyh0eXBlLmxpc3RTaXplKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGNoaWxkIG9mIEZpeGVkU2l6ZUxpc3QgaXMgZmxvYXRpbmcgdHlwZVxuICAgIGlmICghRGF0YVR5cGUuaXNGbG9hdCh0eXBlLmNoaWxkcmVuWzBdKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIEFwYWNoZSBBcnJvdyBKUyB0eXBlIGlzIGEgUG9pbnQgZGF0YSB0eXBlICovXG5leHBvcnQgZnVuY3Rpb24gaXNHZW9BcnJvd0xpbmVTdHJpbmcodHlwZTogRGF0YVR5cGUpIHtcbiAgLy8gQ2hlY2sgdGhlIG91dGVyIHR5cGUgaXMgYSBMaXN0XG4gIGlmICghRGF0YVR5cGUuaXNMaXN0KHR5cGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgdGhlIGNoaWxkIGlzIGEgcG9pbnQgdHlwZVxuICBpZiAoIWlzR2VvQXJyb3dQb2ludCh0eXBlLmNoaWxkcmVuWzBdLnR5cGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gQXBhY2hlIEFycm93IEpTIHR5cGUgaXMgYSBQb2x5Z29uIGRhdGEgdHlwZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2VvQXJyb3dQb2x5Z29uKHR5cGU6IERhdGFUeXBlKSB7XG4gIC8vIENoZWNrIHRoZSBvdXRlciB2ZWN0b3IgaXMgYSBMaXN0XG4gIGlmICghRGF0YVR5cGUuaXNMaXN0KHR5cGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgdGhlIGNoaWxkIGlzIGEgbGluZXN0cmluZyB2ZWN0b3JcbiAgaWYgKCFpc0dlb0Fycm93TGluZVN0cmluZyh0eXBlLmNoaWxkcmVuWzBdLnR5cGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gQXBhY2hlIEFycm93IEpTIHR5cGUgaXMgYSBQb2x5Z29uIGRhdGEgdHlwZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2VvQXJyb3dNdWx0aVBvaW50KHR5cGU6IERhdGFUeXBlKSB7XG4gIC8vIENoZWNrIHRoZSBvdXRlciB2ZWN0b3IgaXMgYSBMaXN0XG4gIGlmICghRGF0YVR5cGUuaXNMaXN0KHR5cGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgdGhlIGNoaWxkIGlzIGEgcG9pbnQgdmVjdG9yXG4gIGlmICghaXNHZW9BcnJvd1BvaW50KHR5cGUuY2hpbGRyZW5bMF0udHlwZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBBcGFjaGUgQXJyb3cgSlMgdHlwZSBpcyBhIFBvbHlnb24gZGF0YSB0eXBlICovXG5leHBvcnQgZnVuY3Rpb24gaXNHZW9BcnJvd011bHRpTGluZVN0cmluZyh0eXBlOiBEYXRhVHlwZSkge1xuICAvLyBDaGVjayB0aGUgb3V0ZXIgdmVjdG9yIGlzIGEgTGlzdFxuICBpZiAoIURhdGFUeXBlLmlzTGlzdCh0eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIHRoZSBjaGlsZCBpcyBhIGxpbmVzdHJpbmcgdmVjdG9yXG4gIGlmICghaXNHZW9BcnJvd0xpbmVTdHJpbmcodHlwZS5jaGlsZHJlblswXS50eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIEFwYWNoZSBBcnJvdyBKUyB0eXBlIGlzIGEgUG9seWdvbiBkYXRhIHR5cGUgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dlb0Fycm93TXVsdGlQb2x5Z29uKHR5cGU6IERhdGFUeXBlKSB7XG4gIC8vIENoZWNrIHRoZSBvdXRlciB2ZWN0b3IgaXMgYSBMaXN0XG4gIGlmICghRGF0YVR5cGUuaXNMaXN0KHR5cGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgdGhlIGNoaWxkIGlzIGEgcG9seWdvbiB2ZWN0b3JcbiAgaWYgKCFpc0dlb0Fycm93UG9seWdvbih0eXBlLmNoaWxkcmVuWzBdLnR5cGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBV0EsSUFBQUEsS0FBQSxHQUFBQyxPQUFBO0FBWEE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBSUE7QUFDTyxTQUFTQyxlQUFlQSxDQUFDQyxJQUFjLEVBQUU7RUFDOUMsSUFBSUMsY0FBUSxDQUFDQyxlQUFlLENBQUNGLElBQUksQ0FBQyxFQUFFO0lBQ2xDO0lBQ0EsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQ0csUUFBUSxDQUFDSCxJQUFJLENBQUNJLFFBQVEsQ0FBQyxFQUFFO01BQ3RDLE9BQU8sS0FBSztJQUNkOztJQUVBO0lBQ0EsSUFBSSxDQUFDSCxjQUFRLENBQUNJLE9BQU8sQ0FBQ0wsSUFBSSxDQUFDTSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUN2QyxPQUFPLEtBQUs7SUFDZDtJQUVBLE9BQU8sSUFBSTtFQUNiO0VBRUEsT0FBTyxLQUFLO0FBQ2Q7O0FBRUE7QUFDTyxTQUFTQyxvQkFBb0JBLENBQUNQLElBQWMsRUFBRTtFQUNuRDtFQUNBLElBQUksQ0FBQ0MsY0FBUSxDQUFDTyxNQUFNLENBQUNSLElBQUksQ0FBQyxFQUFFO0lBQzFCLE9BQU8sS0FBSztFQUNkOztFQUVBO0VBQ0EsSUFBSSxDQUFDRCxlQUFlLENBQUNDLElBQUksQ0FBQ00sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDTixJQUFJLENBQUMsRUFBRTtJQUMzQyxPQUFPLEtBQUs7RUFDZDtFQUVBLE9BQU8sSUFBSTtBQUNiOztBQUVBO0FBQ08sU0FBU1MsaUJBQWlCQSxDQUFDVCxJQUFjLEVBQUU7RUFDaEQ7RUFDQSxJQUFJLENBQUNDLGNBQVEsQ0FBQ08sTUFBTSxDQUFDUixJQUFJLENBQUMsRUFBRTtJQUMxQixPQUFPLEtBQUs7RUFDZDs7RUFFQTtFQUNBLElBQUksQ0FBQ08sb0JBQW9CLENBQUNQLElBQUksQ0FBQ00sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDTixJQUFJLENBQUMsRUFBRTtJQUNoRCxPQUFPLEtBQUs7RUFDZDtFQUVBLE9BQU8sSUFBSTtBQUNiOztBQUVBO0FBQ08sU0FBU1Usb0JBQW9CQSxDQUFDVixJQUFjLEVBQUU7RUFDbkQ7RUFDQSxJQUFJLENBQUNDLGNBQVEsQ0FBQ08sTUFBTSxDQUFDUixJQUFJLENBQUMsRUFBRTtJQUMxQixPQUFPLEtBQUs7RUFDZDs7RUFFQTtFQUNBLElBQUksQ0FBQ0QsZUFBZSxDQUFDQyxJQUFJLENBQUNNLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQ04sSUFBSSxDQUFDLEVBQUU7SUFDM0MsT0FBTyxLQUFLO0VBQ2Q7RUFFQSxPQUFPLElBQUk7QUFDYjs7QUFFQTtBQUNPLFNBQVNXLHlCQUF5QkEsQ0FBQ1gsSUFBYyxFQUFFO0VBQ3hEO0VBQ0EsSUFBSSxDQUFDQyxjQUFRLENBQUNPLE1BQU0sQ0FBQ1IsSUFBSSxDQUFDLEVBQUU7SUFDMUIsT0FBTyxLQUFLO0VBQ2Q7O0VBRUE7RUFDQSxJQUFJLENBQUNPLG9CQUFvQixDQUFDUCxJQUFJLENBQUNNLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQ04sSUFBSSxDQUFDLEVBQUU7SUFDaEQsT0FBTyxLQUFLO0VBQ2Q7RUFFQSxPQUFPLElBQUk7QUFDYjs7QUFFQTtBQUNPLFNBQVNZLHNCQUFzQkEsQ0FBQ1osSUFBYyxFQUFFO0VBQ3JEO0VBQ0EsSUFBSSxDQUFDQyxjQUFRLENBQUNPLE1BQU0sQ0FBQ1IsSUFBSSxDQUFDLEVBQUU7SUFDMUIsT0FBTyxLQUFLO0VBQ2Q7O0VBRUE7RUFDQSxJQUFJLENBQUNTLGlCQUFpQixDQUFDVCxJQUFJLENBQUNNLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQ04sSUFBSSxDQUFDLEVBQUU7SUFDN0MsT0FBTyxLQUFLO0VBQ2Q7RUFFQSxPQUFPLElBQUk7QUFDYiIsImlnbm9yZUxpc3QiOltdfQ==
274
+
275
+ /**
276
+ * Checks if the given SQL query is a SELECT query by using the EXPLAIN command.
277
+ * @param connection The DuckDB connection instance.
278
+ * @param query The SQL query to check.
279
+ * @returns Resolves to `true` if the query is a SELECT statement, otherwise `false`.
280
+ */
281
+ function checkIsSelectQuery(_x3, _x4) {
282
+ return _checkIsSelectQuery.apply(this, arguments);
283
+ }
284
+ /**
285
+ * Split a string with potentially multiple SQL queries (separated as usual by ';') into an array of queries.
286
+ * This implementation:
287
+ * - Handles single and double quoted strings with proper escaping
288
+ * - Ignores semicolons in line comments (--) and block comments (slash asterisk)
289
+ * - Trims whitespace from queries
290
+ * - Handles SQL-style escaped quotes ('' inside strings)
291
+ * - Returns only non-empty queries
292
+ * @param input A string with potentially multiple SQL queries.
293
+ * @returns An array of queries.
294
+ */
295
+ function _checkIsSelectQuery() {
296
+ _checkIsSelectQuery = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(connection, query) {
297
+ var result;
298
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
299
+ while (1) switch (_context3.prev = _context3.next) {
300
+ case 0:
301
+ _context3.prev = 0;
302
+ _context3.next = 3;
303
+ return connection.query("EXPLAIN (".concat(query, ")"));
304
+ case 3:
305
+ result = _context3.sent;
306
+ return _context3.abrupt("return", result.numRows > 0);
307
+ case 7:
308
+ _context3.prev = 7;
309
+ _context3.t0 = _context3["catch"](0);
310
+ return _context3.abrupt("return", false);
311
+ case 10:
312
+ case "end":
313
+ return _context3.stop();
314
+ }
315
+ }, _callee3, null, [[0, 7]]);
316
+ }));
317
+ return _checkIsSelectQuery.apply(this, arguments);
318
+ }
319
+ function splitSqlStatements(input) {
320
+ var queries = [];
321
+ var currentQuery = '';
322
+ var inSingleQuote = false;
323
+ var inDoubleQuote = false;
324
+ var inLineComment = false;
325
+ var inBlockComment = false;
326
+ for (var i = 0; i < input.length; i++) {
327
+ var _char = input[i];
328
+ if (inLineComment) {
329
+ currentQuery += _char;
330
+ if (_char === '\n') {
331
+ inLineComment = false;
332
+ }
333
+ continue;
334
+ }
335
+ if (inBlockComment) {
336
+ currentQuery += _char;
337
+ if (_char === '*' && input[i + 1] === '/') {
338
+ inBlockComment = false;
339
+ currentQuery += input[++i]; // Consume '/'
340
+ }
341
+ continue;
342
+ }
343
+ if (inSingleQuote) {
344
+ currentQuery += _char;
345
+ if (_char === "'") {
346
+ // Handle escaped single quotes in SQL
347
+ if (i + 1 < input.length && input[i + 1] === "'") {
348
+ currentQuery += input[++i];
349
+ } else {
350
+ inSingleQuote = false;
351
+ }
352
+ }
353
+ continue;
354
+ }
355
+ if (inDoubleQuote) {
356
+ currentQuery += _char;
357
+ if (_char === '"') {
358
+ // Handle escaped double quotes
359
+ if (i + 1 < input.length && input[i + 1] === '"') {
360
+ currentQuery += input[++i];
361
+ } else {
362
+ inDoubleQuote = false;
363
+ }
364
+ }
365
+ continue;
366
+ }
367
+
368
+ // Check for comment starts
369
+ if (_char === '-' && input[i + 1] === '-') {
370
+ inLineComment = true;
371
+ currentQuery += _char + input[++i];
372
+ continue;
373
+ }
374
+ if (_char === '/' && input[i + 1] === '*') {
375
+ inBlockComment = true;
376
+ currentQuery += _char + input[++i];
377
+ continue;
378
+ }
379
+
380
+ // Check for quote starts
381
+ if (_char === "'") {
382
+ inSingleQuote = true;
383
+ currentQuery += _char;
384
+ continue;
385
+ }
386
+ if (_char === '"') {
387
+ inDoubleQuote = true;
388
+ currentQuery += _char;
389
+ continue;
390
+ }
391
+
392
+ // Handle query separator
393
+ if (_char === ';') {
394
+ var _trimmed = currentQuery.trim();
395
+ if (_trimmed.length > 0) {
396
+ queries.push(_trimmed);
397
+ }
398
+ currentQuery = '';
399
+ continue;
400
+ }
401
+ currentQuery += _char;
402
+ }
403
+
404
+ // Add the final query
405
+ var trimmed = currentQuery.trim();
406
+ if (trimmed.length > 0) {
407
+ queries.push(trimmed);
408
+ }
409
+ return queries;
410
+ }
411
+
412
+ /**
413
+ * Removes SQL comments from a given SQL string.
414
+ * @param sql The SQL query string from which comments should be removed.
415
+ * @returns The cleaned SQL string without comments.
416
+ */
417
+ function removeSQLComments(sql) {
418
+ // Remove multi-line comments (/* ... */)
419
+ sql = sql.replace(/\/\*[\s\S]*?\*\//g, '');
420
+ // Remove single-line comments (-- ...)
421
+ sql = sql.replace(/--.*$/gm, '');
422
+ return sql.trim();
423
+ }
424
+
425
+ /**
426
+ * Drops a table if it exists in the DuckDB database.
427
+ * @param connection The DuckDB connection instance.
428
+ * @param tableName The name of the table to drop.
429
+ * @returns A promise that resolves when the operation is complete.
430
+ * @throws Logs an error if the table drop operation fails.
431
+ */
432
+ var dropTableIfExists = exports.dropTableIfExists = /*#__PURE__*/function () {
433
+ var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(connection, tableName) {
434
+ return _regenerator["default"].wrap(function _callee$(_context) {
435
+ while (1) switch (_context.prev = _context.next) {
436
+ case 0:
437
+ _context.prev = 0;
438
+ _context.next = 3;
439
+ return connection.query("DROP TABLE IF EXISTS \"".concat(tableName, "\";"));
440
+ case 3:
441
+ _context.next = 8;
442
+ break;
443
+ case 5:
444
+ _context.prev = 5;
445
+ _context.t0 = _context["catch"](0);
446
+ console.error('Dropping table failed', tableName, _context.t0);
447
+ case 8:
448
+ case "end":
449
+ return _context.stop();
450
+ }
451
+ }, _callee, null, [[0, 5]]);
452
+ }));
453
+ return function dropTableIfExists(_x5, _x6) {
454
+ return _ref.apply(this, arguments);
455
+ };
456
+ }();
457
+
458
+ /**
459
+ * Imports a file into DuckDB as a table, supporting multiple formats from SUPPORTED_DUCKDB_DROP_EXTENSIONS.
460
+ * @param file The file to be imported.
461
+ * @returns A promise that resolves when the file has been processed into a DuckDB table.
462
+ */
463
+ function tableFromFile(_x7) {
464
+ return _tableFromFile.apply(this, arguments);
465
+ }
466
+ /**
467
+ * Sanitizes a file name to be a valid DuckDB table name.
468
+ * @param fileName The input file name to be sanitized.
469
+ * @returns A valid DuckDB table name.
470
+ */
471
+ function _tableFromFile() {
472
+ _tableFromFile = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(file) {
473
+ var fileExt, db, c, error, tableName, sourceName, arrayBuffer, uint8Array, arrowTable, message;
474
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
475
+ while (1) switch (_context4.prev = _context4.next) {
476
+ case 0:
477
+ if (file) {
478
+ _context4.next = 2;
479
+ break;
480
+ }
481
+ return _context4.abrupt("return", new Error('File Drag & Drop: No file'));
482
+ case 2:
483
+ fileExt = SUPPORTED_DUCKDB_DROP_EXTENSIONS.find(function (ext) {
484
+ return file.name.endsWith(ext);
485
+ });
486
+ if (fileExt) {
487
+ _context4.next = 5;
488
+ break;
489
+ }
490
+ return _context4.abrupt("return", new Error("File Drag & Drop: File extension isn't supported"));
491
+ case 5:
492
+ _context4.next = 7;
493
+ return (0, _utils.getApplicationConfig)().database;
494
+ case 7:
495
+ db = _context4.sent;
496
+ if (db) {
497
+ _context4.next = 10;
498
+ break;
499
+ }
500
+ return _context4.abrupt("return", new Error('The database is not configured properly.'));
501
+ case 10:
502
+ _context4.next = 12;
503
+ return db.connect();
504
+ case 12:
505
+ c = _context4.sent;
506
+ error = null;
507
+ _context4.prev = 14;
508
+ tableName = sanitizeDuckDBTableName(file.name);
509
+ sourceName = 'temp_file_handle';
510
+ c.query("install spatial;\n load spatial;");
511
+ if (!(fileExt === 'arrow')) {
512
+ _context4.next = 28;
513
+ break;
514
+ }
515
+ _context4.next = 21;
516
+ return file.arrayBuffer();
517
+ case 21:
518
+ arrayBuffer = _context4.sent;
519
+ uint8Array = new Uint8Array(arrayBuffer);
520
+ arrowTable = arrow.tableFromIPC(uint8Array);
521
+ _context4.next = 26;
522
+ return c.insertArrowTable(arrowTable, {
523
+ name: tableName
524
+ });
525
+ case 26:
526
+ _context4.next = 48;
527
+ break;
528
+ case 28:
529
+ _context4.next = 30;
530
+ return db.registerFileHandle(sourceName, file, _duckdbWasm.DuckDBDataProtocol.BROWSER_FILEREADER, true);
531
+ case 30:
532
+ if (!(fileExt === 'csv')) {
533
+ _context4.next = 35;
534
+ break;
535
+ }
536
+ _context4.next = 33;
537
+ return c.query("\n CREATE TABLE '".concat(tableName, "' AS\n SELECT *\n FROM read_csv('").concat(sourceName, "', header = true, auto_detect = true, sample_size = -1);\n "));
538
+ case 33:
539
+ _context4.next = 48;
540
+ break;
541
+ case 35:
542
+ if (!(fileExt === 'json')) {
543
+ _context4.next = 40;
544
+ break;
545
+ }
546
+ _context4.next = 38;
547
+ return c.query("\n CREATE TABLE '".concat(tableName, "' AS\n SELECT *\n FROM read_json_auto('").concat(sourceName, "');\n "));
548
+ case 38:
549
+ _context4.next = 48;
550
+ break;
551
+ case 40:
552
+ if (!(fileExt === 'geojson')) {
553
+ _context4.next = 45;
554
+ break;
555
+ }
556
+ _context4.next = 43;
557
+ return c.query("\n CREATE TABLE '".concat(tableName, "' AS\n SELECT *\n FROM ST_READ('").concat(sourceName, "', keep_wkb = TRUE);\n "));
558
+ case 43:
559
+ _context4.next = 48;
560
+ break;
561
+ case 45:
562
+ if (!(fileExt === 'parquet')) {
563
+ _context4.next = 48;
564
+ break;
565
+ }
566
+ _context4.next = 48;
567
+ return c.query("\n CREATE TABLE '".concat(tableName, "' AS\n SELECT *\n FROM read_parquet('").concat(sourceName, "')\n "));
568
+ case 48:
569
+ _context4.next = 54;
570
+ break;
571
+ case 50:
572
+ _context4.prev = 50;
573
+ _context4.t0 = _context4["catch"](14);
574
+ if (_context4.t0 instanceof Error) {
575
+ message = _context4.t0.message || ''; // output more readable errors for known issues
576
+ if (message.includes('Arrow Type with extension name: geoarrow')) {
577
+ error = new Error('The GeoArrow extensions are not implemented in the connected DuckDB version.');
578
+ } else if (message.includes("Geoparquet column 'geometry' does not have geometry types")) {
579
+ error = new Error("Invalid Input Error: Geoparquet column 'geometry' does not have geometry types.\nPossible reasons:\n - Old .parquet files that don't match the Parquet format specification.\n - Unsupported compression.");
580
+ }
581
+ }
582
+ if (!error) {
583
+ error = _context4.t0;
584
+ }
585
+ case 54:
586
+ _context4.next = 56;
587
+ return c.close();
588
+ case 56:
589
+ return _context4.abrupt("return", error);
590
+ case 57:
591
+ case "end":
592
+ return _context4.stop();
593
+ }
594
+ }, _callee4, null, [[14, 50]]);
595
+ }));
596
+ return _tableFromFile.apply(this, arguments);
597
+ }
598
+ function sanitizeDuckDBTableName(fileName) {
599
+ // Replace invalid characters with underscores
600
+ var name = fileName.replace(/[^a-zA-Z0-9_]/g, '_');
601
+ // Ensure it doesn't start with a digit
602
+ if (/^\d/.test(name)) {
603
+ name = "t_".concat(name);
604
+ }
605
+ return name || 'default_table';
606
+ }
607
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhcnJvdyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl90eXBlIiwiX2R1Y2tkYldhc20iLCJfY29uc3RhbnRzIiwiX3V0aWxzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiU1VQUE9SVEVEX0RVQ0tEQl9EUk9QX0VYVEVOU0lPTlMiLCJleHBvcnRzIiwiZ2V0RHVja0RCQ29sdW1uVHlwZXMiLCJfeCIsIl94MiIsIl9nZXREdWNrREJDb2x1bW5UeXBlcyIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUyIiwiY29ubmVjdGlvbiIsInRhYmxlTmFtZSIsInJlc0Rlc2NyaWJlIiwiZHVja0RiVHlwZXMiLCJudW1Sb3dzIiwiX3Jlc0Rlc2NyaWJlJGdldENoaWxkIiwiX3Jlc0Rlc2NyaWJlJGdldENoaWxkMiIsImNvbHVtbk5hbWUiLCJjb2x1bW5UeXBlIiwid3JhcCIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsInByZXYiLCJuZXh0IiwicXVlcnkiLCJjb25jYXQiLCJzZW50IiwiZ2V0Q2hpbGRBdCIsInB1c2giLCJuYW1lIiwidHlwZSIsImFicnVwdCIsInN0b3AiLCJnZXREdWNrREJDb2x1bW5UeXBlc01hcCIsImNvbHVtbnMiLCJyZWR1Y2UiLCJhY2MiLCJ2YWx1ZSIsImNvbnN0cnVjdFNUX2FzV0tCUXVlcnkiLCJjb2x1bW5zVG9Db252ZXJ0VG9XS0IiLCJleGNsdWRlIiwibGVuZ3RoIiwiam9pbiIsImFzV0tCIiwibWFwIiwiY29sdW1uIiwiZ2V0R2VvbWV0cnlDb2x1bW5zIiwiZmlsdGVyIiwic2V0R2VvQXJyb3dXS0JFeHRlbnNpb24iLCJ0YWJsZSIsInNjaGVtYSIsImZpZWxkcyIsImZvckVhY2giLCJmaWVsZCIsImluZm8iLCJmaW5kIiwibWV0YWRhdGEiLCJHRU9BUlJPV19NRVRBREFUQV9LRVkiLCJHRU9BUlJPV19FWFRFTlNJT05TIiwiV0tCIiwicmVzdG9yZUFycm93VGFibGUiLCJhcnJvd1NjaGVtYSIsImNyZWFPcHRzIiwiaW5kZXgiLCJUYWJsZSIsInJlbW92ZVVuc3VwcG9ydGVkRXh0ZW5zaW9ucyIsInJlbW92ZWRNZXRhZGF0YSIsImV4dGVuc2lvbiIsInN0YXJ0c1dpdGgiLCJyZXN0b3JlVW5zdXBwb3J0ZWRFeHRlbnNpb25zIiwicmVtb3ZlZEV4dGVuc2lvbnMiLCJpc0dlb0Fycm93UG9pbnQiLCJEYXRhVHlwZSIsImlzRml4ZWRTaXplTGlzdCIsImluY2x1ZGVzIiwibGlzdFNpemUiLCJpc0Zsb2F0IiwiY2hpbGRyZW4iLCJpc0dlb0Fycm93TGluZVN0cmluZyIsImlzTGlzdCIsImlzR2VvQXJyb3dQb2x5Z29uIiwiaXNHZW9BcnJvd011bHRpUG9pbnQiLCJpc0dlb0Fycm93TXVsdGlMaW5lU3RyaW5nIiwiaXNHZW9BcnJvd011bHRpUG9seWdvbiIsImNoZWNrSXNTZWxlY3RRdWVyeSIsIl94MyIsIl94NCIsIl9jaGVja0lzU2VsZWN0UXVlcnkiLCJfY2FsbGVlMyIsInJlc3VsdCIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsInQwIiwic3BsaXRTcWxTdGF0ZW1lbnRzIiwiaW5wdXQiLCJxdWVyaWVzIiwiY3VycmVudFF1ZXJ5IiwiaW5TaW5nbGVRdW90ZSIsImluRG91YmxlUXVvdGUiLCJpbkxpbmVDb21tZW50IiwiaW5CbG9ja0NvbW1lbnQiLCJjaGFyIiwidHJpbW1lZCIsInRyaW0iLCJyZW1vdmVTUUxDb21tZW50cyIsInNxbCIsInJlcGxhY2UiLCJkcm9wVGFibGVJZkV4aXN0cyIsIl9yZWYiLCJfY2FsbGVlIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsImNvbnNvbGUiLCJlcnJvciIsIl94NSIsIl94NiIsInRhYmxlRnJvbUZpbGUiLCJfeDciLCJfdGFibGVGcm9tRmlsZSIsIl9jYWxsZWU0IiwiZmlsZSIsImZpbGVFeHQiLCJkYiIsImMiLCJzb3VyY2VOYW1lIiwiYXJyYXlCdWZmZXIiLCJ1aW50OEFycmF5IiwiYXJyb3dUYWJsZSIsIm1lc3NhZ2UiLCJfY2FsbGVlNCQiLCJfY29udGV4dDQiLCJFcnJvciIsImV4dCIsImVuZHNXaXRoIiwiZ2V0QXBwbGljYXRpb25Db25maWciLCJkYXRhYmFzZSIsImNvbm5lY3QiLCJzYW5pdGl6ZUR1Y2tEQlRhYmxlTmFtZSIsIlVpbnQ4QXJyYXkiLCJ0YWJsZUZyb21JUEMiLCJpbnNlcnRBcnJvd1RhYmxlIiwicmVnaXN0ZXJGaWxlSGFuZGxlIiwiRHVja0RCRGF0YVByb3RvY29sIiwiQlJPV1NFUl9GSUxFUkVBREVSIiwiY2xvc2UiLCJmaWxlTmFtZSIsInRlc3QiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGFibGUvZHVja2RiLXRhYmxlLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8vIGxvYWRlcnMuZ2xcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCAoYykgdmlzLmdsIGNvbnRyaWJ1dG9yc1xuXG4vLyBDb3BpZWQgZnJvbSBsb2FkZXJzLmdsL2dlb2Fycm93XG5cbi8vIFRPRE86IFJlbW92ZSBpc0dlb0Fycm93KiBvbmNlIEtlcGxlci5nbCBpcyB1cGdyYWRlZCB0byBsb2FkZXJzLmdsIDQuNCtcblxuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCB7RGF0YVR5cGV9IGZyb20gJ2FwYWNoZS1hcnJvdy90eXBlJztcbmltcG9ydCB7RHVja0RCRGF0YVByb3RvY29sfSBmcm9tICdAZHVja2RiL2R1Y2tkYi13YXNtJztcblxuaW1wb3J0IHtHRU9BUlJPV19FWFRFTlNJT05TLCBHRU9BUlJPV19NRVRBREFUQV9LRVl9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7UHJvdG9EYXRhc2V0RmllbGR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtEYXRhYmFzZUNvbm5lY3Rpb24sIGdldEFwcGxpY2F0aW9uQ29uZmlnfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IFNVUFBPUlRFRF9EVUNLREJfRFJPUF9FWFRFTlNJT05TID0gWydhcnJvdycsICdjc3YnLCAnZ2VvanNvbicsICdqc29uJywgJ3BhcnF1ZXQnXTtcblxuZXhwb3J0IHR5cGUgRHVja0RCQ29sdW1uRGVzYyA9IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZ307XG5cbi8qKlxuICogUXVlcmllcyBhIER1Y2tEQiB0YWJsZSBmb3IgdGhlIHNjaGVtYSBkZXNjcmlwdGlvbi5cbiAqIEBwYXJhbSBjb25uZWN0aW9uIEFuIGFjdGl2ZSBEdWNrREIgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSB0YWJsZU5hbWUgQSBuYW1lIG9mIER1Y2tEQiB0YWJsZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGNvbHVtbiBuYW1lcyBhbmQgRHVja0RCIHR5cGVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RHVja0RCQ29sdW1uVHlwZXMoXG4gIGNvbm5lY3Rpb246IERhdGFiYXNlQ29ubmVjdGlvbixcbiAgdGFibGVOYW1lOiBzdHJpbmdcbik6IFByb21pc2U8RHVja0RCQ29sdW1uRGVzY1tdPiB7XG4gIGNvbnN0IHJlc0Rlc2NyaWJlID0gYXdhaXQgY29ubmVjdGlvbi5xdWVyeShgREVTQ1JJQkUgXCIke3RhYmxlTmFtZX1cImApO1xuXG4gIGNvbnN0IGR1Y2tEYlR5cGVzOiBEdWNrREJDb2x1bW5EZXNjW10gPSBbXTtcbiAgY29uc3QgbnVtUm93cyA9IHJlc0Rlc2NyaWJlLm51bVJvd3M7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUm93czsgKytpKSB7XG4gICAgY29uc3QgY29sdW1uTmFtZSA9IHJlc0Rlc2NyaWJlLmdldENoaWxkQXQoMCk/LmdldChpKTtcbiAgICBjb25zdCBjb2x1bW5UeXBlID0gcmVzRGVzY3JpYmUuZ2V0Q2hpbGRBdCgxKT8uZ2V0KGkpO1xuXG4gICAgZHVja0RiVHlwZXMucHVzaCh7XG4gICAgICBuYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgdHlwZTogY29sdW1uVHlwZVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGR1Y2tEYlR5cGVzO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1hcHBpbmcgb2YgY29sdW1uIG5hbWVzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgRHVja0RCIGRhdGEgdHlwZXMuXG4gKiBAcGFyYW0gY29sdW1ucyBBbiBhcnJheSBvZiBjb2x1bW4gZGVzY3JpcHRpb25zIGZyb20gRHVja0RCLiBDaGVjayBnZXREdWNrREJDb2x1bW5UeXBlcy5cbiAqIEByZXR1cm5zIEEgcmVjb3JkIHdoZXJlIGtleXMgYXJlIGNvbHVtbiBuYW1lcyBhbmQgdmFsdWVzIGFyZSB0aGVpciBkYXRhIHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHVja0RCQ29sdW1uVHlwZXNNYXAoY29sdW1uczogRHVja0RCQ29sdW1uRGVzY1tdKSB7XG4gIHJldHVybiBjb2x1bW5zLnJlZHVjZSgoYWNjLCB2YWx1ZSkgPT4ge1xuICAgIGFjY1t2YWx1ZS5uYW1lXSA9IHZhbHVlLnR5cGU7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPik7XG59XG5cbi8qKlxuICogQ29uc3RydWN0cyBhbiBTUUwgcXVlcnkgdG8gc2VsZWN0IGFsbCBjb2x1bW5zIGZyb20gYSBnaXZlbiB0YWJsZSxcbiAqIGNvbnZlcnRpbmcgc3BlY2lmaWVkIGNvbHVtbnMgdG8gV2VsbC1Lbm93biBCaW5hcnkgKFdLQikgZm9ybWF0IHVzaW5nIFNUX0FzV0tCLlxuICogQHBhcmFtIHRhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgZnJvbSB3aGljaCB0byBzZWxlY3QgZGF0YS5cbiAqIEBwYXJhbSBjb2x1bW5zVG9Db252ZXJ0VG9XS0IgQW4gYXJyYXkgb2YgY29sdW1uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBXS0IgZm9ybWF0LlxuICogQHJldHVybnMgVGhlIGNvbnN0cnVjdGVkIFNRTCBxdWVyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdFNUX2FzV0tCUXVlcnkodGFibGVOYW1lOiBzdHJpbmcsIGNvbHVtbnNUb0NvbnZlcnRUb1dLQjogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBleGNsdWRlID1cbiAgICBjb2x1bW5zVG9Db252ZXJ0VG9XS0IubGVuZ3RoID4gMCA/IGBFWENMVURFICR7Y29sdW1uc1RvQ29udmVydFRvV0tCLmpvaW4oJywgJyl9YCA6ICcnO1xuICBjb25zdCBhc1dLQiA9XG4gICAgY29sdW1uc1RvQ29udmVydFRvV0tCLmxlbmd0aCA+IDBcbiAgICAgID8gYCwgJHtjb2x1bW5zVG9Db252ZXJ0VG9XS0IubWFwKGNvbHVtbiA9PiBgU1RfQXNXS0IoJHtjb2x1bW59KSBhcyAke2NvbHVtbn1gKS5qb2luKCcsICcpfWBcbiAgICAgIDogJyc7XG4gIHJldHVybiBgU0VMRUNUICogJHtleGNsdWRlfSAke2FzV0tCfSBGUk9NICcke3RhYmxlTmFtZX0nYDtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgbmFtZXMgb2YgY29sdW1ucyB0aGF0IGhhdmUgYSBHRU9NRVRSWSB0eXBlLlxuICogQHBhcmFtIGNvbHVtbnMgQW4gYXJyYXkgb2YgY29sdW1uIGRlc2NyaXB0b3JzIGZyb20gYSBEdWNrREIgdGFibGUuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBjb2x1bW4gbmFtZXMgdGhhdCBhcmUgb2YgdHlwZSBHRU9NRVRSWS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdlb21ldHJ5Q29sdW1ucyhjb2x1bW5zOiBEdWNrREJDb2x1bW5EZXNjW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBjb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnR5cGUgPT09ICdHRU9NRVRSWScpLm1hcChjb2x1bW4gPT4gY29sdW1uLm5hbWUpO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIEdlb0Fycm93IFdLQiBleHRlbnNpb24gbWV0YWRhdGEgZm9yIGNvbHVtbnMgb2YgdHlwZSBHRU9NRVRSWSBpbiBhbiBBcnJvdyB0YWJsZS5cbiAqIEBwYXJhbSB0YWJsZSBUaGUgQXBhY2hlIEFycm93IHRhYmxlIHdob3NlIHNjaGVtYSBmaWVsZHMgd2lsbCBiZSBtb2RpZmllZC5cbiAqIEBwYXJhbSBjb2x1bW5zIEFuIGFycmF5IG9mIGNvbHVtbiBkZXNjcmlwdG9ycyBmcm9tIGEgRHVja0RCIHRhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0R2VvQXJyb3dXS0JFeHRlbnNpb24odGFibGU6IGFycm93LlRhYmxlLCBjb2x1bW5zOiBEdWNrREJDb2x1bW5EZXNjW10pIHtcbiAgdGFibGUuc2NoZW1hLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICBjb25zdCBpbmZvID0gY29sdW1ucy5maW5kKHQgPT4gdC5uYW1lID09PSBmaWVsZC5uYW1lKTtcbiAgICBpZiAoaW5mbz8udHlwZSA9PT0gJ0dFT01FVFJZJykge1xuICAgICAgZmllbGQubWV0YWRhdGEuc2V0KEdFT0FSUk9XX01FVEFEQVRBX0tFWSwgR0VPQVJST1dfRVhURU5TSU9OUy5XS0IpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJvdyB0YWJsZSBmcm9tIGFuIGFycmF5IG9mIGFycm93IHZlY3RvcnMgYW5kIGZpZWxkcy5cbiAqIEBwYXJhbSBjb2x1bW5zIEFuIGFycmF5IG9mIGFycm93IHZlY3RvcnMuXG4gKiBAcGFyYW0gZmllbGRzIEFuIGFycmF5IG9mIGZpZWxkcyBwZXIgYXJyb3cgdmVjdG9yLlxuICogQHBhcmFtIGFycm93U2NoZW1hIE9wdGlvbmFsIGFycm93IHRhYmxlIHNjaGVtYSB3aGVuIGF2YWlsYWJsZS5cbiAqIEByZXR1cm5zIEFuIGFycm93IHRhYmxlLlxuICovXG5leHBvcnQgY29uc3QgcmVzdG9yZUFycm93VGFibGUgPSAoXG4gIGNvbHVtbnM6IGFycm93LlZlY3RvcltdLFxuICBmaWVsZHM6IFByb3RvRGF0YXNldEZpZWxkW10sXG4gIGFycm93U2NoZW1hPzogYXJyb3cuU2NoZW1hXG4pID0+IHtcbiAgY29uc3QgY3JlYU9wdHMgPSB7fTtcbiAgZmllbGRzLm1hcCgoZmllbGQsIGluZGV4KSA9PiB7XG4gICAgY3JlYU9wdHNbZmllbGQubmFtZV0gPSBjb2x1bW5zW2luZGV4XTtcbiAgfSk7XG5cbiAgcmV0dXJuIGFycm93U2NoZW1hID8gbmV3IGFycm93LlRhYmxlKGFycm93U2NoZW1hLCBjcmVhT3B0cykgOiBuZXcgYXJyb3cuVGFibGUoY3JlYU9wdHMpO1xufTtcblxuLyoqXG4gKiBEdWNrRGIgdGhyb3dzIHdoZW4gZ2VvYXJyb3cgZXh0ZW5zaW9ucyBhcmUgcHJlc2VudCBpbiBtZXRhZGF0YS5cbiAqIEBwYXJhbSB0YWJsZSBBbiBhcnJvdyB0YWJsZSB0byBjbGVhciBmcm9tIGV4dGVuc2lvbnMuXG4gKiBAcmV0dXJucyBBIG1hcCBvZiByZW1vdmVkIHBlciBmaWVsZCBnZW9hcnJvdyBleHRlbnNpb25zLlxuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlVW5zdXBwb3J0ZWRFeHRlbnNpb25zID0gKHRhYmxlOiBhcnJvdy5UYWJsZSk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4ge1xuICBjb25zdCByZW1vdmVkTWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgdGFibGUuc2NoZW1hLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBmaWVsZC5tZXRhZGF0YS5nZXQoR0VPQVJST1dfTUVUQURBVEFfS0VZKTtcbiAgICBpZiAoZXh0ZW5zaW9uPy5zdGFydHNXaXRoKCdnZW9hcnJvdycpKSB7XG4gICAgICByZW1vdmVkTWV0YWRhdGFbZmllbGQubmFtZV0gPSBleHRlbnNpb247XG4gICAgICBmaWVsZC5tZXRhZGF0YS5kZWxldGUoR0VPQVJST1dfTUVUQURBVEFfS0VZKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVtb3ZlZE1ldGFkYXRhO1xufTtcblxuLyoqXG4gKiBSZXN0b3JlIHJlbW92ZWQgbWV0YWRhdGEgZXh0ZW5zaW9ucyBhZnRlciBhIGNhbGwgdG8gcmVtb3ZlVW5zdXBwb3J0ZWRFeHRlbnNpb25zLlxuICogQHBhcmFtIHRhYmxlIEFuIGFycm93IHRhYmxlIHRvIHJlc3RvcmUgZ2VvYXJyb3cgZXh0ZW5zaW9ucy5cbiAqIEBwYXJhbSByZW1vdmVkRXh0ZW5zaW9ucyBBIG1hcCBvZiBwZXIgZmllbGQgZ2VvYXJyb3cgZXh0ZW5zaW9ucyB0byByZXN0b3JlLlxuICovXG5leHBvcnQgY29uc3QgcmVzdG9yZVVuc3VwcG9ydGVkRXh0ZW5zaW9ucyA9IChcbiAgdGFibGU6IGFycm93LlRhYmxlLFxuICByZW1vdmVkRXh0ZW5zaW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuKSA9PiB7XG4gIHRhYmxlLnNjaGVtYS5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gcmVtb3ZlZEV4dGVuc2lvbnNbZmllbGQubmFtZV07XG4gICAgaWYgKGV4dGVuc2lvbikge1xuICAgICAgZmllbGQubWV0YWRhdGEuc2V0KEdFT0FSUk9XX01FVEFEQVRBX0tFWSwgZXh0ZW5zaW9uKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBBcGFjaGUgQXJyb3cgSlMgdHlwZSBpcyBhIFBvaW50IGRhdGEgdHlwZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2VvQXJyb3dQb2ludCh0eXBlOiBEYXRhVHlwZSkge1xuICBpZiAoRGF0YVR5cGUuaXNGaXhlZFNpemVMaXN0KHR5cGUpKSB7XG4gICAgLy8gQ2hlY2sgbGlzdCBzaXplXG4gICAgaWYgKCFbMiwgMywgNF0uaW5jbHVkZXModHlwZS5saXN0U2l6ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBjaGlsZCBvZiBGaXhlZFNpemVMaXN0IGlzIGZsb2F0aW5nIHR5cGVcbiAgICBpZiAoIURhdGFUeXBlLmlzRmxvYXQodHlwZS5jaGlsZHJlblswXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBBcGFjaGUgQXJyb3cgSlMgdHlwZSBpcyBhIFBvaW50IGRhdGEgdHlwZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2VvQXJyb3dMaW5lU3RyaW5nKHR5cGU6IERhdGFUeXBlKSB7XG4gIC8vIENoZWNrIHRoZSBvdXRlciB0eXBlIGlzIGEgTGlzdFxuICBpZiAoIURhdGFUeXBlLmlzTGlzdCh0eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIHRoZSBjaGlsZCBpcyBhIHBvaW50IHR5cGVcbiAgaWYgKCFpc0dlb0Fycm93UG9pbnQodHlwZS5jaGlsZHJlblswXS50eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIEFwYWNoZSBBcnJvdyBKUyB0eXBlIGlzIGEgUG9seWdvbiBkYXRhIHR5cGUgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dlb0Fycm93UG9seWdvbih0eXBlOiBEYXRhVHlwZSkge1xuICAvLyBDaGVjayB0aGUgb3V0ZXIgdmVjdG9yIGlzIGEgTGlzdFxuICBpZiAoIURhdGFUeXBlLmlzTGlzdCh0eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIHRoZSBjaGlsZCBpcyBhIGxpbmVzdHJpbmcgdmVjdG9yXG4gIGlmICghaXNHZW9BcnJvd0xpbmVTdHJpbmcodHlwZS5jaGlsZHJlblswXS50eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIEFwYWNoZSBBcnJvdyBKUyB0eXBlIGlzIGEgUG9seWdvbiBkYXRhIHR5cGUgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dlb0Fycm93TXVsdGlQb2ludCh0eXBlOiBEYXRhVHlwZSkge1xuICAvLyBDaGVjayB0aGUgb3V0ZXIgdmVjdG9yIGlzIGEgTGlzdFxuICBpZiAoIURhdGFUeXBlLmlzTGlzdCh0eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIHRoZSBjaGlsZCBpcyBhIHBvaW50IHZlY3RvclxuICBpZiAoIWlzR2VvQXJyb3dQb2ludCh0eXBlLmNoaWxkcmVuWzBdLnR5cGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gQXBhY2hlIEFycm93IEpTIHR5cGUgaXMgYSBQb2x5Z29uIGRhdGEgdHlwZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2VvQXJyb3dNdWx0aUxpbmVTdHJpbmcodHlwZTogRGF0YVR5cGUpIHtcbiAgLy8gQ2hlY2sgdGhlIG91dGVyIHZlY3RvciBpcyBhIExpc3RcbiAgaWYgKCFEYXRhVHlwZS5pc0xpc3QodHlwZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayB0aGUgY2hpbGQgaXMgYSBsaW5lc3RyaW5nIHZlY3RvclxuICBpZiAoIWlzR2VvQXJyb3dMaW5lU3RyaW5nKHR5cGUuY2hpbGRyZW5bMF0udHlwZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBBcGFjaGUgQXJyb3cgSlMgdHlwZSBpcyBhIFBvbHlnb24gZGF0YSB0eXBlICovXG5leHBvcnQgZnVuY3Rpb24gaXNHZW9BcnJvd011bHRpUG9seWdvbih0eXBlOiBEYXRhVHlwZSkge1xuICAvLyBDaGVjayB0aGUgb3V0ZXIgdmVjdG9yIGlzIGEgTGlzdFxuICBpZiAoIURhdGFUeXBlLmlzTGlzdCh0eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIHRoZSBjaGlsZCBpcyBhIHBvbHlnb24gdmVjdG9yXG4gIGlmICghaXNHZW9BcnJvd1BvbHlnb24odHlwZS5jaGlsZHJlblswXS50eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gU1FMIHF1ZXJ5IGlzIGEgU0VMRUNUIHF1ZXJ5IGJ5IHVzaW5nIHRoZSBFWFBMQUlOIGNvbW1hbmQuXG4gKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgRHVja0RCIGNvbm5lY3Rpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcXVlcnkgVGhlIFNRTCBxdWVyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFJlc29sdmVzIHRvIGB0cnVlYCBpZiB0aGUgcXVlcnkgaXMgYSBTRUxFQ1Qgc3RhdGVtZW50LCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrSXNTZWxlY3RRdWVyeShcbiAgY29ubmVjdGlvbjogRGF0YWJhc2VDb25uZWN0aW9uLFxuICBxdWVyeTogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb25uZWN0aW9uLnF1ZXJ5KGBFWFBMQUlOICgke3F1ZXJ5fSlgKTtcbiAgICByZXR1cm4gcmVzdWx0Lm51bVJvd3MgPiAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFNwbGl0IGEgc3RyaW5nIHdpdGggcG90ZW50aWFsbHkgbXVsdGlwbGUgU1FMIHF1ZXJpZXMgKHNlcGFyYXRlZCBhcyB1c3VhbCBieSAnOycpIGludG8gYW4gYXJyYXkgb2YgcXVlcmllcy5cbiAqIFRoaXMgaW1wbGVtZW50YXRpb246XG4gKiAgLSBIYW5kbGVzIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlZCBzdHJpbmdzIHdpdGggcHJvcGVyIGVzY2FwaW5nXG4gKiAgLSBJZ25vcmVzIHNlbWljb2xvbnMgaW4gbGluZSBjb21tZW50cyAoLS0pIGFuZCBibG9jayBjb21tZW50cyAoc2xhc2ggYXN0ZXJpc2spXG4gKiAgLSBUcmltcyB3aGl0ZXNwYWNlIGZyb20gcXVlcmllc1xuICogIC0gSGFuZGxlcyBTUUwtc3R5bGUgZXNjYXBlZCBxdW90ZXMgKCcnIGluc2lkZSBzdHJpbmdzKVxuICogIC0gUmV0dXJucyBvbmx5IG5vbi1lbXB0eSBxdWVyaWVzXG4gKiBAcGFyYW0gaW5wdXQgQSBzdHJpbmcgd2l0aCBwb3RlbnRpYWxseSBtdWx0aXBsZSBTUUwgcXVlcmllcy5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFNxbFN0YXRlbWVudHMoaW5wdXQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcXVlcmllczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1cnJlbnRRdWVyeSA9ICcnO1xuICBsZXQgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICBsZXQgaW5Eb3VibGVRdW90ZSA9IGZhbHNlO1xuICBsZXQgaW5MaW5lQ29tbWVudCA9IGZhbHNlO1xuICBsZXQgaW5CbG9ja0NvbW1lbnQgPSBmYWxzZTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhciA9IGlucHV0W2ldO1xuXG4gICAgaWYgKGluTGluZUNvbW1lbnQpIHtcbiAgICAgIGN1cnJlbnRRdWVyeSArPSBjaGFyO1xuICAgICAgaWYgKGNoYXIgPT09ICdcXG4nKSB7XG4gICAgICAgIGluTGluZUNvbW1lbnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpbkJsb2NrQ29tbWVudCkge1xuICAgICAgY3VycmVudFF1ZXJ5ICs9IGNoYXI7XG4gICAgICBpZiAoY2hhciA9PT0gJyonICYmIGlucHV0W2kgKyAxXSA9PT0gJy8nKSB7XG4gICAgICAgIGluQmxvY2tDb21tZW50ID0gZmFsc2U7XG4gICAgICAgIGN1cnJlbnRRdWVyeSArPSBpbnB1dFsrK2ldOyAvLyBDb25zdW1lICcvJ1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGluU2luZ2xlUXVvdGUpIHtcbiAgICAgIGN1cnJlbnRRdWVyeSArPSBjaGFyO1xuICAgICAgaWYgKGNoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgIC8vIEhhbmRsZSBlc2NhcGVkIHNpbmdsZSBxdW90ZXMgaW4gU1FMXG4gICAgICAgIGlmIChpICsgMSA8IGlucHV0Lmxlbmd0aCAmJiBpbnB1dFtpICsgMV0gPT09IFwiJ1wiKSB7XG4gICAgICAgICAgY3VycmVudFF1ZXJ5ICs9IGlucHV0WysraV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaW5Eb3VibGVRdW90ZSkge1xuICAgICAgY3VycmVudFF1ZXJ5ICs9IGNoYXI7XG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICAvLyBIYW5kbGUgZXNjYXBlZCBkb3VibGUgcXVvdGVzXG4gICAgICAgIGlmIChpICsgMSA8IGlucHV0Lmxlbmd0aCAmJiBpbnB1dFtpICsgMV0gPT09ICdcIicpIHtcbiAgICAgICAgICBjdXJyZW50UXVlcnkgKz0gaW5wdXRbKytpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbkRvdWJsZVF1b3RlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBjb21tZW50IHN0YXJ0c1xuICAgIGlmIChjaGFyID09PSAnLScgJiYgaW5wdXRbaSArIDFdID09PSAnLScpIHtcbiAgICAgIGluTGluZUNvbW1lbnQgPSB0cnVlO1xuICAgICAgY3VycmVudFF1ZXJ5ICs9IGNoYXIgKyBpbnB1dFsrK2ldO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09ICcvJyAmJiBpbnB1dFtpICsgMV0gPT09ICcqJykge1xuICAgICAgaW5CbG9ja0NvbW1lbnQgPSB0cnVlO1xuICAgICAgY3VycmVudFF1ZXJ5ICs9IGNoYXIgKyBpbnB1dFsrK2ldO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHF1b3RlIHN0YXJ0c1xuICAgIGlmIChjaGFyID09PSBcIidcIikge1xuICAgICAgaW5TaW5nbGVRdW90ZSA9IHRydWU7XG4gICAgICBjdXJyZW50UXVlcnkgKz0gY2hhcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSAnXCInKSB7XG4gICAgICBpbkRvdWJsZVF1b3RlID0gdHJ1ZTtcbiAgICAgIGN1cnJlbnRRdWVyeSArPSBjaGFyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHF1ZXJ5IHNlcGFyYXRvclxuICAgIGlmIChjaGFyID09PSAnOycpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBjdXJyZW50UXVlcnkudHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBxdWVyaWVzLnB1c2godHJpbW1lZCk7XG4gICAgICB9XG4gICAgICBjdXJyZW50UXVlcnkgPSAnJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGN1cnJlbnRRdWVyeSArPSBjaGFyO1xuICB9XG5cbiAgLy8gQWRkIHRoZSBmaW5hbCBxdWVyeVxuICBjb25zdCB0cmltbWVkID0gY3VycmVudFF1ZXJ5LnRyaW0oKTtcbiAgaWYgKHRyaW1tZWQubGVuZ3RoID4gMCkge1xuICAgIHF1ZXJpZXMucHVzaCh0cmltbWVkKTtcbiAgfVxuXG4gIHJldHVybiBxdWVyaWVzO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgU1FMIGNvbW1lbnRzIGZyb20gYSBnaXZlbiBTUUwgc3RyaW5nLlxuICogQHBhcmFtIHNxbCBUaGUgU1FMIHF1ZXJ5IHN0cmluZyBmcm9tIHdoaWNoIGNvbW1lbnRzIHNob3VsZCBiZSByZW1vdmVkLlxuICogQHJldHVybnMgVGhlIGNsZWFuZWQgU1FMIHN0cmluZyB3aXRob3V0IGNvbW1lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlU1FMQ29tbWVudHMoc3FsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZW1vdmUgbXVsdGktbGluZSBjb21tZW50cyAoLyogLi4uICovKVxuICBzcWwgPSBzcWwucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJyk7XG4gIC8vIFJlbW92ZSBzaW5nbGUtbGluZSBjb21tZW50cyAoLS0gLi4uKVxuICBzcWwgPSBzcWwucmVwbGFjZSgvLS0uKiQvZ20sICcnKTtcbiAgcmV0dXJuIHNxbC50cmltKCk7XG59XG5cbi8qKlxuICogRHJvcHMgYSB0YWJsZSBpZiBpdCBleGlzdHMgaW4gdGhlIER1Y2tEQiBkYXRhYmFzZS5cbiAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSBEdWNrREIgY29ubmVjdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSB0YWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGRyb3AuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUuXG4gKiBAdGhyb3dzIExvZ3MgYW4gZXJyb3IgaWYgdGhlIHRhYmxlIGRyb3Agb3BlcmF0aW9uIGZhaWxzLlxuICovXG5leHBvcnQgY29uc3QgZHJvcFRhYmxlSWZFeGlzdHMgPSBhc3luYyAoY29ubmVjdGlvbjogRGF0YWJhc2VDb25uZWN0aW9uLCB0YWJsZU5hbWU6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIGF3YWl0IGNvbm5lY3Rpb24ucXVlcnkoYERST1AgVEFCTEUgSUYgRVhJU1RTIFwiJHt0YWJsZU5hbWV9XCI7YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRHJvcHBpbmcgdGFibGUgZmFpbGVkJywgdGFibGVOYW1lLCBlcnJvcik7XG4gIH1cbn07XG5cbi8qKlxuICogSW1wb3J0cyBhIGZpbGUgaW50byBEdWNrREIgYXMgYSB0YWJsZSwgc3VwcG9ydGluZyBtdWx0aXBsZSBmb3JtYXRzIGZyb20gU1VQUE9SVEVEX0RVQ0tEQl9EUk9QX0VYVEVOU0lPTlMuXG4gKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBiZSBpbXBvcnRlZC5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkIGludG8gYSBEdWNrREIgdGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0YWJsZUZyb21GaWxlKGZpbGU6IEZpbGUgfCBudWxsKTogUHJvbWlzZTxudWxsIHwgRXJyb3I+IHtcbiAgaWYgKCFmaWxlKSByZXR1cm4gbmV3IEVycm9yKCdGaWxlIERyYWcgJiBEcm9wOiBObyBmaWxlJyk7XG5cbiAgY29uc3QgZmlsZUV4dCA9IFNVUFBPUlRFRF9EVUNLREJfRFJPUF9FWFRFTlNJT05TLmZpbmQoZXh0ID0+IGZpbGUubmFtZS5lbmRzV2l0aChleHQpKTtcbiAgaWYgKCFmaWxlRXh0KSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcIkZpbGUgRHJhZyAmIERyb3A6IEZpbGUgZXh0ZW5zaW9uIGlzbid0IHN1cHBvcnRlZFwiKTtcbiAgfVxuXG4gIGNvbnN0IGRiID0gYXdhaXQgZ2V0QXBwbGljYXRpb25Db25maWcoKS5kYXRhYmFzZTtcbiAgaWYgKCFkYikge1xuICAgIHJldHVybiBuZXcgRXJyb3IoJ1RoZSBkYXRhYmFzZSBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseS4nKTtcbiAgfVxuICBjb25zdCBjID0gYXdhaXQgZGIuY29ubmVjdCgpO1xuXG4gIGxldCBlcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbDtcblxuICB0cnkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHNhbml0aXplRHVja0RCVGFibGVOYW1lKGZpbGUubmFtZSk7XG4gICAgY29uc3Qgc291cmNlTmFtZSA9ICd0ZW1wX2ZpbGVfaGFuZGxlJztcblxuICAgIGMucXVlcnkoYGluc3RhbGwgc3BhdGlhbDtcbiAgICAgIGxvYWQgc3BhdGlhbDtgKTtcblxuICAgIGlmIChmaWxlRXh0ID09PSAnYXJyb3cnKSB7XG4gICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKTtcbiAgICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICBjb25zdCBhcnJvd1RhYmxlID0gYXJyb3cudGFibGVGcm9tSVBDKHVpbnQ4QXJyYXkpO1xuXG4gICAgICBhd2FpdCBjLmluc2VydEFycm93VGFibGUoYXJyb3dUYWJsZSwge25hbWU6IHRhYmxlTmFtZX0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBkYi5yZWdpc3RlckZpbGVIYW5kbGUoc291cmNlTmFtZSwgZmlsZSwgRHVja0RCRGF0YVByb3RvY29sLkJST1dTRVJfRklMRVJFQURFUiwgdHJ1ZSk7XG5cbiAgICAgIGlmIChmaWxlRXh0ID09PSAnY3N2Jykge1xuICAgICAgICBhd2FpdCBjLnF1ZXJ5KGBcbiAgICAgICAgICAgIENSRUFURSBUQUJMRSAnJHt0YWJsZU5hbWV9JyBBU1xuICAgICAgICAgICAgU0VMRUNUICpcbiAgICAgICAgICAgIEZST00gcmVhZF9jc3YoJyR7c291cmNlTmFtZX0nLCBoZWFkZXIgPSB0cnVlLCBhdXRvX2RldGVjdCA9IHRydWUsIHNhbXBsZV9zaXplID0gLTEpO1xuICAgICAgICAgIGApO1xuICAgICAgfSBlbHNlIGlmIChmaWxlRXh0ID09PSAnanNvbicpIHtcbiAgICAgICAgYXdhaXQgYy5xdWVyeShgXG4gICAgICAgICAgICBDUkVBVEUgVEFCTEUgJyR7dGFibGVOYW1lfScgQVNcbiAgICAgICAgICAgIFNFTEVDVCAqXG4gICAgICAgICAgICBGUk9NIHJlYWRfanNvbl9hdXRvKCcke3NvdXJjZU5hbWV9Jyk7XG4gICAgICAgICAgYCk7XG4gICAgICB9IGVsc2UgaWYgKGZpbGVFeHQgPT09ICdnZW9qc29uJykge1xuICAgICAgICBhd2FpdCBjLnF1ZXJ5KGBcbiAgICAgICAgICAgIENSRUFURSBUQUJMRSAnJHt0YWJsZU5hbWV9JyBBU1xuICAgICAgICAgICAgU0VMRUNUICpcbiAgICAgICAgICAgIEZST00gU1RfUkVBRCgnJHtzb3VyY2VOYW1lfScsIGtlZXBfd2tiID0gVFJVRSk7XG4gICAgICAgICAgYCk7XG4gICAgICB9IGVsc2UgaWYgKGZpbGVFeHQgPT09ICdwYXJxdWV0Jykge1xuICAgICAgICBhd2FpdCBjLnF1ZXJ5KGBcbiAgICAgICAgICAgIENSRUFURSBUQUJMRSAnJHt0YWJsZU5hbWV9JyBBU1xuICAgICAgICAgICAgU0VMRUNUICpcbiAgICAgICAgICAgIEZST00gcmVhZF9wYXJxdWV0KCcke3NvdXJjZU5hbWV9JylcbiAgICAgICAgICBgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yRGF0YSkge1xuICAgIGlmIChlcnJvckRhdGEgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yRGF0YS5tZXNzYWdlIHx8ICcnO1xuICAgICAgLy8gb3V0cHV0IG1vcmUgcmVhZGFibGUgZXJyb3JzIGZvciBrbm93biBpc3N1ZXNcbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdBcnJvdyBUeXBlIHdpdGggZXh0ZW5zaW9uIG5hbWU6IGdlb2Fycm93JykpIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1RoZSBHZW9BcnJvdyBleHRlbnNpb25zIGFyZSBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGNvbm5lY3RlZCBEdWNrREIgdmVyc2lvbi4nXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCJHZW9wYXJxdWV0IGNvbHVtbiAnZ2VvbWV0cnknIGRvZXMgbm90IGhhdmUgZ2VvbWV0cnkgdHlwZXNcIikpIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgSW5wdXQgRXJyb3I6IEdlb3BhcnF1ZXQgY29sdW1uICdnZW9tZXRyeScgZG9lcyBub3QgaGF2ZSBnZW9tZXRyeSB0eXBlcy5cblBvc3NpYmxlIHJlYXNvbnM6XG4gIC0gT2xkIC5wYXJxdWV0IGZpbGVzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIFBhcnF1ZXQgZm9ybWF0IHNwZWNpZmljYXRpb24uXG4gIC0gVW5zdXBwb3J0ZWQgY29tcHJlc3Npb24uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZXJyb3IpIHtcbiAgICAgIGVycm9yID0gZXJyb3JEYXRhIGFzIEVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IGMuY2xvc2UoKTtcblxuICByZXR1cm4gZXJyb3I7XG59XG5cbi8qKlxuICogU2FuaXRpemVzIGEgZmlsZSBuYW1lIHRvIGJlIGEgdmFsaWQgRHVja0RCIHRhYmxlIG5hbWUuXG4gKiBAcGFyYW0gZmlsZU5hbWUgVGhlIGlucHV0IGZpbGUgbmFtZSB0byBiZSBzYW5pdGl6ZWQuXG4gKiBAcmV0dXJucyBBIHZhbGlkIER1Y2tEQiB0YWJsZSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVEdWNrREJUYWJsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFJlcGxhY2UgaW52YWxpZCBjaGFyYWN0ZXJzIHdpdGggdW5kZXJzY29yZXNcbiAgbGV0IG5hbWUgPSBmaWxlTmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csICdfJyk7XG4gIC8vIEVuc3VyZSBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggYSBkaWdpdFxuICBpZiAoL15cXGQvLnRlc3QobmFtZSkpIHtcbiAgICBuYW1lID0gYHRfJHtuYW1lfWA7XG4gIH1cbiAgcmV0dXJuIG5hbWUgfHwgJ2RlZmF1bHRfdGFibGUnO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0EsSUFBQUEsS0FBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsV0FBQSxHQUFBRixPQUFBO0FBRUEsSUFBQUcsVUFBQSxHQUFBSCxPQUFBO0FBRUEsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBQTBFLFNBQUFLLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBUCx3QkFBQU8sQ0FBQSxFQUFBRSxDQUFBLFNBQUFBLENBQUEsSUFBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFJLFVBQUEsU0FBQUosQ0FBQSxlQUFBQSxDQUFBLGdCQUFBSyxPQUFBLENBQUFMLENBQUEsMEJBQUFBLENBQUEsc0JBQUFBLENBQUEsUUFBQUcsQ0FBQSxHQUFBSix3QkFBQSxDQUFBRyxDQUFBLE9BQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBRyxHQUFBLENBQUFOLENBQUEsVUFBQUcsQ0FBQSxDQUFBSSxHQUFB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QTNHLElBQUE7VUFBQSxPQUN4Qm9HLENBQUMsQ0FBQ25HLEtBQUssZ0NBQUFDLE1BQUEsQ0FDT2QsU0FBUyxpRUFBQWMsTUFBQSxDQUVKbUcsVUFBVSxtQkFDaEMsQ0FBQztRQUFBO1VBQUFNLFNBQUEsQ0FBQTNHLElBQUE7VUFBQTtRQUFBO1VBQUEyRyxTQUFBLENBQUE1RyxJQUFBO1VBQUE0RyxTQUFBLENBQUF0QyxFQUFBLEdBQUFzQyxTQUFBO1VBSVIsSUFBSUEsU0FBQSxDQUFBdEMsRUFBQSxZQUFxQnVDLEtBQUssRUFBRTtZQUN4QkgsT0FBTyxHQUFHRSxTQUFBLENBQUF0QyxFQUFBLENBQVVvQyxPQUFPLElBQUksRUFBRSxFQUN2QztZQUNBLElBQUlBLE9BQU8sQ0FBQ3RELFFBQVEsQ0FBQywwQ0FBMEMsQ0FBQyxFQUFFO2NBQ2hFdUMsS0FBSyxHQUFHLElBQUlrQixLQUFLLENBQ2YsOEVBQ0YsQ0FBQztZQUNILENBQUMsTUFBTSxJQUFJSCxPQUFPLENBQUN0RCxRQUFRLENBQUMsMkRBQTJELENBQUMsRUFBRTtjQUN4RnVDLEtBQUssR0FBRyxJQUFJa0IsS0FBSyw4TUFLakIsQ0FBQztZQUNIO1VBQ0Y7VUFFQSxJQUFJLENBQUNsQixLQUFLLEVBQUU7WUFDVkEsS0FBSyxHQUFBaUIsU0FBQSxDQUFBdEMsRUFBcUI7VUFDNUI7UUFBQztVQUFBc0MsU0FBQSxDQUFBM0csSUFBQTtVQUFBLE9BR0dvRyxDQUFDLENBQUNxQixLQUFLLENBQUMsQ0FBQztRQUFBO1VBQUEsT0FBQWQsU0FBQSxDQUFBbkcsTUFBQSxXQUVSa0YsS0FBSztRQUFBO1FBQUE7VUFBQSxPQUFBaUIsU0FBQSxDQUFBbEcsSUFBQTtNQUFBO0lBQUEsR0FBQXVGLFFBQUE7RUFBQSxDQUNiO0VBQUEsT0FBQUQsY0FBQSxDQUFBbEgsS0FBQSxPQUFBQyxTQUFBO0FBQUE7QUFPTSxTQUFTb0ksdUJBQXVCQSxDQUFDUSxRQUFnQixFQUFVO0VBQ2hFO0VBQ0EsSUFBSXBILElBQUksR0FBR29ILFFBQVEsQ0FBQ3ZDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUM7RUFDbEQ7RUFDQSxJQUFJLEtBQUssQ0FBQ3dDLElBQUksQ0FBQ3JILElBQUksQ0FBQyxFQUFFO0lBQ3BCQSxJQUFJLFFBQUFKLE1BQUEsQ0FBUUksSUFBSSxDQUFFO0VBQ3BCO0VBQ0EsT0FBT0EsSUFBSSxJQUFJLGVBQWU7QUFDaEMiLCJpZ25vcmVMaXN0IjpbXX0=