@gmod/bbi 1.0.27 → 1.0.31

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.
package/dist/bigbed.js CHANGED
@@ -1,173 +1,162 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.filterUndef = filterUndef;
9
- exports.BigBed = void 0;
10
-
11
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
12
-
13
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
14
-
15
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
16
-
17
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
18
-
19
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
20
-
21
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
22
-
23
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
24
-
25
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
26
-
27
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
28
-
29
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
30
-
31
- var _binaryParser = require("@gmod/binary-parser");
32
-
33
- var _rxjs = require("rxjs");
34
-
35
- var _operators = require("rxjs/operators");
36
-
37
- var _bbi = require("./bbi");
38
-
39
- 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; }
40
-
41
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
42
-
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
28
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
29
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
30
+ return new (P || (P = Promise))(function (resolve, reject) {
31
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
32
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
33
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
34
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
35
+ });
36
+ };
37
+ var __generator = (this && this.__generator) || function (thisArg, body) {
38
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
39
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
40
+ function verb(n) { return function (v) { return step([n, v]); }; }
41
+ function step(op) {
42
+ if (f) throw new TypeError("Generator is already executing.");
43
+ while (_) try {
44
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
45
+ if (y = 0, t) op = [op[0] & 2, t.value];
46
+ switch (op[0]) {
47
+ case 0: case 1: t = op; break;
48
+ case 4: _.label++; return { value: op[1], done: false };
49
+ case 5: _.label++; y = op[1]; op = [0]; continue;
50
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
51
+ default:
52
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
53
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
54
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
55
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
56
+ if (t[2]) _.ops.pop();
57
+ _.trys.pop(); continue;
58
+ }
59
+ op = body.call(thisArg, _);
60
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
61
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
62
+ }
63
+ };
64
+ var __importDefault = (this && this.__importDefault) || function (mod) {
65
+ return (mod && mod.__esModule) ? mod : { "default": mod };
66
+ };
67
+ Object.defineProperty(exports, "__esModule", { value: true });
68
+ exports.BigBed = exports.filterUndef = void 0;
69
+ var binary_parser_1 = require("@gmod/binary-parser");
70
+ var rxjs_1 = require("rxjs");
71
+ var operators_1 = require("rxjs/operators");
72
+ var abortable_promise_cache_1 = __importDefault(require("abortable-promise-cache"));
73
+ var quick_lru_1 = __importDefault(require("quick-lru"));
74
+ var bbi_1 = require("./bbi");
43
75
  function filterUndef(ts) {
44
- return ts.filter(function (t) {
45
- return !!t;
46
- });
76
+ return ts.filter(function (t) { return !!t; });
47
77
  }
48
-
49
- var BigBed =
50
- /*#__PURE__*/
51
- function (_BBI) {
52
- (0, _inherits2.default)(BigBed, _BBI);
53
-
54
- function BigBed(opts) {
55
- var _this;
56
-
57
- (0, _classCallCheck2.default)(this, BigBed);
58
- _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(BigBed).call(this, opts));
59
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "readIndices", void 0);
60
- _this.readIndices = _this.headerCache.abortableMemoize(_this._readIndices.bind((0, _assertThisInitialized2.default)(_this)));
61
- return _this;
62
- }
63
- /*
64
- * retrieve unzoomed view for any scale
65
- * @param scale - unused
66
- * @param abortSignal - an optional AbortSignal to kill operation
67
- * @return promise for a BlockView
68
- */
69
-
70
-
71
- (0, _createClass2.default)(BigBed, [{
72
- key: "getView",
73
- value: function () {
74
- var _getView = (0, _asyncToGenerator2.default)(
75
- /*#__PURE__*/
76
- _regenerator.default.mark(function _callee(scale, abortSignal) {
77
- return _regenerator.default.wrap(function _callee$(_context) {
78
- while (1) {
79
- switch (_context.prev = _context.next) {
80
- case 0:
81
- return _context.abrupt("return", this.getUnzoomedView(abortSignal));
82
-
83
- case 1:
84
- case "end":
85
- return _context.stop();
86
- }
87
- }
88
- }, _callee, this);
89
- }));
90
-
91
- function getView(_x, _x2) {
92
- return _getView.apply(this, arguments);
93
- }
94
-
95
- return getView;
96
- }()
78
+ exports.filterUndef = filterUndef;
79
+ var BigBed = /** @class */ (function (_super) {
80
+ __extends(BigBed, _super);
81
+ function BigBed(opts) {
82
+ var _this = _super.call(this, opts) || this;
83
+ _this.readIndicesCache = new abortable_promise_cache_1.default({
84
+ cache: new quick_lru_1.default({ maxSize: 1 }),
85
+ fill: function (args, signal) { return __awaiter(_this, void 0, void 0, function () {
86
+ return __generator(this, function (_a) {
87
+ return [2 /*return*/, this._readIndices(__assign(__assign({}, args), { signal: signal }))];
88
+ });
89
+ }); },
90
+ });
91
+ return _this;
92
+ }
93
+ BigBed.prototype.readIndices = function (opts) {
94
+ if (opts === void 0) { opts = {}; }
95
+ var options = 'aborted' in opts ? { signal: opts } : opts;
96
+ return this.readIndicesCache.get(JSON.stringify(options), options, options.signal);
97
+ };
98
+ /*
99
+ * retrieve unzoomed view for any scale
100
+ * @param scale - unused
101
+ * @param abortSignal - an optional AbortSignal to kill operation
102
+ * @return promise for a BlockView
103
+ */
104
+ BigBed.prototype.getView = function (scale, opts) {
105
+ return __awaiter(this, void 0, void 0, function () {
106
+ return __generator(this, function (_a) {
107
+ return [2 /*return*/, this.getUnzoomedView(opts)];
108
+ });
109
+ });
110
+ };
97
111
  /*
98
112
  * parse the bigbed extraIndex fields
99
113
  * @param abortSignal to abort operation
100
114
  * @return a Promise for an array of Index data structure since there can be multiple extraIndexes in a bigbed, see bedToBigBed documentation
101
115
  */
102
-
103
- }, {
104
- key: "_readIndices",
105
- value: function () {
106
- var _readIndices2 = (0, _asyncToGenerator2.default)(
107
- /*#__PURE__*/
108
- _regenerator.default.mark(function _callee2(abortSignal) {
109
- var _ref, extHeaderOffset, isBigEndian, _ref2, data, le, ret, count, offset, blocklen, len, _ref3, buffer, extParser, indices, i;
110
-
111
- return _regenerator.default.wrap(function _callee2$(_context2) {
112
- while (1) {
113
- switch (_context2.prev = _context2.next) {
114
- case 0:
115
- _context2.next = 2;
116
- return this.getHeader(abortSignal);
117
-
118
- case 2:
119
- _ref = _context2.sent;
120
- extHeaderOffset = _ref.extHeaderOffset;
121
- isBigEndian = _ref.isBigEndian;
122
- _context2.next = 7;
123
- return this.bbi.read(Buffer.alloc(64), 0, 64, extHeaderOffset);
124
-
125
- case 7:
126
- _ref2 = _context2.sent;
127
- data = _ref2.buffer;
128
- le = isBigEndian ? 'big' : 'little';
129
- ret = new _binaryParser.Parser().endianess(le).uint16('size').uint16('count').uint64('offset').parse(data).result;
130
- count = ret.count, offset = ret.offset; // no extra index is defined if count==0
131
-
132
- if (!(count === 0)) {
133
- _context2.next = 14;
134
- break;
135
- }
136
-
137
- return _context2.abrupt("return", []);
138
-
139
- case 14:
140
- blocklen = 20;
141
- len = blocklen * count;
142
- _context2.next = 18;
143
- return this.bbi.read(Buffer.alloc(len), 0, len, offset);
144
-
145
- case 18:
146
- _ref3 = _context2.sent;
147
- buffer = _ref3.buffer;
148
- extParser = new _binaryParser.Parser().endianess(le).int16('type').int16('fieldcount').uint64('offset').skip(4).int16('field');
149
- indices = [];
150
-
151
- for (i = 0; i < count; i += 1) {
152
- indices.push(extParser.parse(buffer.slice(i * blocklen)).result);
116
+ BigBed.prototype._readIndices = function (opts) {
117
+ return __awaiter(this, void 0, void 0, function () {
118
+ var _a, extHeaderOffset, isBigEndian, data, le, ret, count, offset, blocklen, len, buffer, extParser, indices, i;
119
+ return __generator(this, function (_b) {
120
+ switch (_b.label) {
121
+ case 0: return [4 /*yield*/, this.getHeader(opts)];
122
+ case 1:
123
+ _a = _b.sent(), extHeaderOffset = _a.extHeaderOffset, isBigEndian = _a.isBigEndian;
124
+ return [4 /*yield*/, this.bbi.read(Buffer.alloc(64), 0, 64, extHeaderOffset)];
125
+ case 2:
126
+ data = (_b.sent()).buffer;
127
+ le = isBigEndian ? 'big' : 'little';
128
+ ret = new binary_parser_1.Parser()
129
+ .endianess(le)
130
+ .uint16('size')
131
+ .uint16('count')
132
+ .uint64('offset')
133
+ .parse(data).result;
134
+ count = ret.count, offset = ret.offset;
135
+ // no extra index is defined if count==0
136
+ if (count === 0) {
137
+ return [2 /*return*/, []];
138
+ }
139
+ blocklen = 20;
140
+ len = blocklen * count;
141
+ return [4 /*yield*/, this.bbi.read(Buffer.alloc(len), 0, len, offset)];
142
+ case 3:
143
+ buffer = (_b.sent()).buffer;
144
+ extParser = new binary_parser_1.Parser()
145
+ .endianess(le)
146
+ .int16('type')
147
+ .int16('fieldcount')
148
+ .uint64('offset')
149
+ .skip(4)
150
+ .int16('field');
151
+ indices = [];
152
+ for (i = 0; i < count; i += 1) {
153
+ indices.push(extParser.parse(buffer.slice(i * blocklen)).result);
154
+ }
155
+ return [2 /*return*/, indices];
153
156
  }
154
-
155
- return _context2.abrupt("return", indices);
156
-
157
- case 24:
158
- case "end":
159
- return _context2.stop();
160
- }
161
- }
162
- }, _callee2, this);
163
- }));
164
-
165
- function _readIndices(_x3) {
166
- return _readIndices2.apply(this, arguments);
167
- }
168
-
169
- return _readIndices;
170
- }()
157
+ });
158
+ });
159
+ };
171
160
  /*
172
161
  * perform a search in the bigbed extraIndex to find which blocks in the bigbed data to look for the
173
162
  * actual feature data
@@ -176,224 +165,106 @@ function (_BBI) {
176
165
  * @param opts - a SearchOptions argument with optional signal
177
166
  * @return a Promise for an array of bigbed block Loc entries
178
167
  */
179
-
180
- }, {
181
- key: "searchExtraIndexBlocks",
182
- value: function () {
183
- var _searchExtraIndexBlocks = (0, _asyncToGenerator2.default)(
184
- /*#__PURE__*/
185
- _regenerator.default.mark(function _callee5(name) {
186
- var _this2 = this;
187
-
188
- var opts,
189
- signal,
190
- _ref4,
191
- isBigEndian,
192
- indices,
193
- locs,
194
- _args5 = arguments;
195
-
196
- return _regenerator.default.wrap(function _callee5$(_context5) {
197
- while (1) {
198
- switch (_context5.prev = _context5.next) {
199
- case 0:
200
- opts = _args5.length > 1 && _args5[1] !== undefined ? _args5[1] : {};
201
- signal = opts.signal;
202
- _context5.next = 4;
203
- return this.getHeader(signal);
204
-
205
- case 4:
206
- _ref4 = _context5.sent;
207
- isBigEndian = _ref4.isBigEndian;
208
- _context5.next = 8;
209
- return this.readIndices(signal);
210
-
211
- case 8:
212
- indices = _context5.sent;
213
-
214
- if (indices.length) {
215
- _context5.next = 11;
216
- break;
217
- }
218
-
219
- return _context5.abrupt("return", []);
220
-
221
- case 11:
222
- locs = indices.map(
223
- /*#__PURE__*/
224
- function () {
225
- var _ref5 = (0, _asyncToGenerator2.default)(
226
- /*#__PURE__*/
227
- _regenerator.default.mark(function _callee4(index) {
228
- var offset, field, _ref6, data, p, _p$parse$result, blockSize, keySize, valSize, bpt, bptReadNode, rootNodeOffset;
229
-
230
- return _regenerator.default.wrap(function _callee4$(_context4) {
231
- while (1) {
232
- switch (_context4.prev = _context4.next) {
233
- case 0:
234
- offset = index.offset, field = index.field;
235
- _context4.next = 3;
236
- return _this2.bbi.read(Buffer.alloc(32), 0, 32, offset, {
237
- signal: signal
238
- });
239
-
240
- case 3:
241
- _ref6 = _context4.sent;
242
- data = _ref6.buffer;
243
- p = new _binaryParser.Parser().endianess(isBigEndian ? 'big' : 'little').int32('magic').int32('blockSize').int32('keySize').int32('valSize').uint64('itemCount');
244
- _p$parse$result = p.parse(data).result, blockSize = _p$parse$result.blockSize, keySize = _p$parse$result.keySize, valSize = _p$parse$result.valSize;
245
- bpt = new _binaryParser.Parser().endianess(isBigEndian ? 'big' : 'little').int8('nodeType').skip(1).int16('cnt').choice({
246
- tag: 'nodeType',
247
- choices: {
248
- 0: new _binaryParser.Parser().array('leafkeys', {
249
- length: 'cnt',
250
- type: new _binaryParser.Parser().string('key', {
251
- length: keySize,
252
- stripNull: true
253
- }).uint64('offset')
254
- }),
255
- 1: new _binaryParser.Parser().array('keys', {
256
- length: 'cnt',
257
- type: new _binaryParser.Parser().string('key', {
258
- length: keySize,
259
- stripNull: true
260
- }).uint64('offset').uint32('length').uint32('reserved')
261
- })
262
- }
263
- });
264
-
265
- bptReadNode =
266
- /*#__PURE__*/
267
- function () {
268
- var _ref7 = (0, _asyncToGenerator2.default)(
269
- /*#__PURE__*/
270
- _regenerator.default.mark(function _callee3(nodeOffset) {
271
- var len, _ref8, buffer, node, lastOffset, i, key, _i;
272
-
273
- return _regenerator.default.wrap(function _callee3$(_context3) {
274
- while (1) {
275
- switch (_context3.prev = _context3.next) {
276
- case 0:
277
- len = 4 + blockSize * (keySize + valSize);
278
- _context3.next = 3;
279
- return _this2.bbi.read(Buffer.alloc(len), 0, len, nodeOffset, {
280
- signal: signal
281
- });
282
-
283
- case 3:
284
- _ref8 = _context3.sent;
285
- buffer = _ref8.buffer;
286
- node = bpt.parse(buffer).result;
287
-
288
- if (!node.leafkeys) {
289
- _context3.next = 17;
290
- break;
291
- }
292
-
293
- i = 0;
294
-
295
- case 8:
296
- if (!(i < node.leafkeys.length)) {
297
- _context3.next = 16;
298
- break;
299
- }
300
-
301
- key = node.leafkeys[i].key;
302
-
303
- if (!(name.localeCompare(key) < 0 && lastOffset)) {
304
- _context3.next = 12;
305
- break;
306
- }
307
-
308
- return _context3.abrupt("return", bptReadNode(lastOffset));
309
-
310
- case 12:
311
- lastOffset = node.leafkeys[i].offset;
312
-
313
- case 13:
314
- i += 1;
315
- _context3.next = 8;
316
- break;
317
-
318
- case 16:
319
- return _context3.abrupt("return", bptReadNode(lastOffset));
320
-
321
- case 17:
322
- _i = 0;
323
-
324
- case 18:
325
- if (!(_i < node.keys.length)) {
326
- _context3.next = 24;
327
- break;
328
- }
329
-
330
- if (!(node.keys[_i].key === name)) {
331
- _context3.next = 21;
332
- break;
333
- }
334
-
335
- return _context3.abrupt("return", _objectSpread({}, node.keys[_i], {
336
- field: field
337
- }));
338
-
339
- case 21:
340
- _i += 1;
341
- _context3.next = 18;
342
- break;
343
-
344
- case 24:
345
- return _context3.abrupt("return", undefined);
346
-
347
- case 25:
348
- case "end":
349
- return _context3.stop();
350
- }
351
- }
352
- }, _callee3);
353
- }));
354
-
355
- return function bptReadNode(_x6) {
356
- return _ref7.apply(this, arguments);
357
- };
358
- }();
359
-
360
- rootNodeOffset = 32;
361
- return _context4.abrupt("return", bptReadNode(offset + rootNodeOffset));
362
-
363
- case 11:
364
- case "end":
365
- return _context4.stop();
168
+ BigBed.prototype.searchExtraIndexBlocks = function (name, opts) {
169
+ if (opts === void 0) { opts = {}; }
170
+ return __awaiter(this, void 0, void 0, function () {
171
+ var isBigEndian, indices, locs, _a;
172
+ var _this = this;
173
+ return __generator(this, function (_b) {
174
+ switch (_b.label) {
175
+ case 0: return [4 /*yield*/, this.getHeader(opts)];
176
+ case 1:
177
+ isBigEndian = (_b.sent()).isBigEndian;
178
+ return [4 /*yield*/, this.readIndices(opts)];
179
+ case 2:
180
+ indices = _b.sent();
181
+ if (!indices.length) {
182
+ return [2 /*return*/, []];
366
183
  }
367
- }
368
- }, _callee4);
369
- }));
370
-
371
- return function (_x5) {
372
- return _ref5.apply(this, arguments);
373
- };
374
- }());
375
- _context5.t0 = filterUndef;
376
- _context5.next = 15;
377
- return Promise.all(locs);
378
-
379
- case 15:
380
- _context5.t1 = _context5.sent;
381
- return _context5.abrupt("return", (0, _context5.t0)(_context5.t1));
382
-
383
- case 17:
384
- case "end":
385
- return _context5.stop();
386
- }
387
- }
388
- }, _callee5, this);
389
- }));
390
-
391
- function searchExtraIndexBlocks(_x4) {
392
- return _searchExtraIndexBlocks.apply(this, arguments);
393
- }
394
-
395
- return searchExtraIndexBlocks;
396
- }()
184
+ locs = indices.map(function (index) { return __awaiter(_this, void 0, void 0, function () {
185
+ var offset, field, data, p, _a, blockSize, keySize, valSize, bpt, bptReadNode, rootNodeOffset;
186
+ var _this = this;
187
+ return __generator(this, function (_b) {
188
+ switch (_b.label) {
189
+ case 0:
190
+ offset = index.offset, field = index.field;
191
+ return [4 /*yield*/, this.bbi.read(Buffer.alloc(32), 0, 32, offset, opts)];
192
+ case 1:
193
+ data = (_b.sent()).buffer;
194
+ p = new binary_parser_1.Parser()
195
+ .endianess(isBigEndian ? 'big' : 'little')
196
+ .int32('magic')
197
+ .int32('blockSize')
198
+ .int32('keySize')
199
+ .int32('valSize')
200
+ .uint64('itemCount');
201
+ _a = p.parse(data).result, blockSize = _a.blockSize, keySize = _a.keySize, valSize = _a.valSize;
202
+ bpt = new binary_parser_1.Parser()
203
+ .endianess(isBigEndian ? 'big' : 'little')
204
+ .int8('nodeType')
205
+ .skip(1)
206
+ .int16('cnt')
207
+ .choice({
208
+ tag: 'nodeType',
209
+ choices: {
210
+ 0: new binary_parser_1.Parser().array('leafkeys', {
211
+ length: 'cnt',
212
+ type: new binary_parser_1.Parser()
213
+ .string('key', { length: keySize, stripNull: true })
214
+ .uint64('offset'),
215
+ }),
216
+ 1: new binary_parser_1.Parser().array('keys', {
217
+ length: 'cnt',
218
+ type: new binary_parser_1.Parser()
219
+ .string('key', { length: keySize, stripNull: true })
220
+ .uint64('offset')
221
+ .uint32('length')
222
+ .uint32('reserved'),
223
+ }),
224
+ },
225
+ });
226
+ bptReadNode = function (nodeOffset) { return __awaiter(_this, void 0, void 0, function () {
227
+ var len, buffer, node, lastOffset, i, key, i;
228
+ return __generator(this, function (_a) {
229
+ switch (_a.label) {
230
+ case 0:
231
+ len = 4 + blockSize * (keySize + valSize);
232
+ return [4 /*yield*/, this.bbi.read(Buffer.alloc(len), 0, len, nodeOffset, opts)];
233
+ case 1:
234
+ buffer = (_a.sent()).buffer;
235
+ node = bpt.parse(buffer).result;
236
+ if (node.leafkeys) {
237
+ lastOffset = void 0;
238
+ for (i = 0; i < node.leafkeys.length; i += 1) {
239
+ key = node.leafkeys[i].key;
240
+ if (name.localeCompare(key) < 0 && lastOffset) {
241
+ return [2 /*return*/, bptReadNode(lastOffset)];
242
+ }
243
+ lastOffset = node.leafkeys[i].offset;
244
+ }
245
+ return [2 /*return*/, bptReadNode(lastOffset)];
246
+ }
247
+ for (i = 0; i < node.keys.length; i += 1) {
248
+ if (node.keys[i].key === name) {
249
+ return [2 /*return*/, __assign(__assign({}, node.keys[i]), { field: field })];
250
+ }
251
+ }
252
+ return [2 /*return*/, undefined];
253
+ }
254
+ });
255
+ }); };
256
+ rootNodeOffset = 32;
257
+ return [2 /*return*/, bptReadNode(offset + rootNodeOffset)];
258
+ }
259
+ });
260
+ }); });
261
+ _a = filterUndef;
262
+ return [4 /*yield*/, Promise.all(locs)];
263
+ case 3: return [2 /*return*/, _a.apply(void 0, [_b.sent()])];
264
+ }
265
+ });
266
+ });
267
+ };
397
268
  /*
398
269
  * retrieve the features from the bigbed data that were found through the lookup of the extraIndex
399
270
  * note that there can be multiple extraIndex, see the BigBed specification and the -extraIndex argument to bedToBigBed
@@ -402,82 +273,41 @@ function (_BBI) {
402
273
  * @param opts - a SearchOptions argument with optional signal
403
274
  * @return a Promise for an array of Feature
404
275
  */
405
-
406
- }, {
407
- key: "searchExtraIndex",
408
- value: function () {
409
- var _searchExtraIndex = (0, _asyncToGenerator2.default)(
410
- /*#__PURE__*/
411
- _regenerator.default.mark(function _callee6(name) {
412
- var opts,
413
- blocks,
414
- view,
415
- res,
416
- ret,
417
- _args6 = arguments;
418
- return _regenerator.default.wrap(function _callee6$(_context6) {
419
- while (1) {
420
- switch (_context6.prev = _context6.next) {
421
- case 0:
422
- opts = _args6.length > 1 && _args6[1] !== undefined ? _args6[1] : {};
423
- _context6.next = 3;
424
- return this.searchExtraIndexBlocks(name, opts);
425
-
426
- case 3:
427
- blocks = _context6.sent;
428
-
429
- if (blocks.length) {
430
- _context6.next = 6;
431
- break;
276
+ BigBed.prototype.searchExtraIndex = function (name, opts) {
277
+ if (opts === void 0) { opts = {}; }
278
+ return __awaiter(this, void 0, void 0, function () {
279
+ var blocks, view, res, ret;
280
+ return __generator(this, function (_a) {
281
+ switch (_a.label) {
282
+ case 0: return [4 /*yield*/, this.searchExtraIndexBlocks(name, opts)];
283
+ case 1:
284
+ blocks = _a.sent();
285
+ if (!blocks.length) {
286
+ return [2 /*return*/, []];
287
+ }
288
+ return [4 /*yield*/, this.getUnzoomedView(opts)];
289
+ case 2:
290
+ view = _a.sent();
291
+ res = blocks.map(function (block) {
292
+ return new rxjs_1.Observable(function (observer) {
293
+ view.readFeatures(observer, [block], opts);
294
+ }).pipe((0, operators_1.reduce)(function (acc, curr) { return acc.concat(curr); }), (0, operators_1.map)(function (x) {
295
+ for (var i = 0; i < x.length; i += 1) {
296
+ x[i].field = block.field;
297
+ }
298
+ return x;
299
+ }));
300
+ });
301
+ return [4 /*yield*/, rxjs_1.merge.apply(void 0, res).toPromise()];
302
+ case 3:
303
+ ret = _a.sent();
304
+ return [2 /*return*/, ret.filter(function (f) {
305
+ return f.rest.split('\t')[f.field - 3] === name;
306
+ })];
432
307
  }
433
-
434
- return _context6.abrupt("return", []);
435
-
436
- case 6:
437
- _context6.next = 8;
438
- return this.getUnzoomedView();
439
-
440
- case 8:
441
- view = _context6.sent;
442
- res = blocks.map(function (block) {
443
- return new _rxjs.Observable(function (observer) {
444
- view.readFeatures(observer, [block], opts);
445
- }).pipe((0, _operators.reduce)(function (acc, curr) {
446
- return acc.concat(curr);
447
- }), (0, _operators.map)(function (x) {
448
- for (var i = 0; i < x.length; i += 1) {
449
- x[i].field = block.field; // eslint-disable-line
450
- }
451
-
452
- return x;
453
- }));
454
- });
455
- _context6.next = 12;
456
- return _rxjs.merge.apply(void 0, (0, _toConsumableArray2.default)(res)).toPromise();
457
-
458
- case 12:
459
- ret = _context6.sent;
460
- return _context6.abrupt("return", ret.filter(function (f) {
461
- return f.rest.split('\t')[f.field - 3] === name;
462
- }));
463
-
464
- case 14:
465
- case "end":
466
- return _context6.stop();
467
- }
468
- }
469
- }, _callee6, this);
470
- }));
471
-
472
- function searchExtraIndex(_x7) {
473
- return _searchExtraIndex.apply(this, arguments);
474
- }
475
-
476
- return searchExtraIndex;
477
- }()
478
- }]);
479
- return BigBed;
480
- }(_bbi.BBI);
481
-
308
+ });
309
+ });
310
+ };
311
+ return BigBed;
312
+ }(bbi_1.BBI));
482
313
  exports.BigBed = BigBed;
483
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iaWdiZWQudHMiXSwibmFtZXMiOlsiZmlsdGVyVW5kZWYiLCJ0cyIsImZpbHRlciIsInQiLCJCaWdCZWQiLCJvcHRzIiwicmVhZEluZGljZXMiLCJoZWFkZXJDYWNoZSIsImFib3J0YWJsZU1lbW9pemUiLCJfcmVhZEluZGljZXMiLCJiaW5kIiwic2NhbGUiLCJhYm9ydFNpZ25hbCIsImdldFVuem9vbWVkVmlldyIsImdldEhlYWRlciIsImV4dEhlYWRlck9mZnNldCIsImlzQmlnRW5kaWFuIiwiYmJpIiwicmVhZCIsIkJ1ZmZlciIsImFsbG9jIiwiZGF0YSIsImJ1ZmZlciIsImxlIiwicmV0IiwiUGFyc2VyIiwiZW5kaWFuZXNzIiwidWludDE2IiwidWludDY0IiwicGFyc2UiLCJyZXN1bHQiLCJjb3VudCIsIm9mZnNldCIsImJsb2NrbGVuIiwibGVuIiwiZXh0UGFyc2VyIiwiaW50MTYiLCJza2lwIiwiaW5kaWNlcyIsImkiLCJwdXNoIiwic2xpY2UiLCJuYW1lIiwic2lnbmFsIiwibGVuZ3RoIiwibG9jcyIsIm1hcCIsImluZGV4IiwiZmllbGQiLCJwIiwiaW50MzIiLCJibG9ja1NpemUiLCJrZXlTaXplIiwidmFsU2l6ZSIsImJwdCIsImludDgiLCJjaG9pY2UiLCJ0YWciLCJjaG9pY2VzIiwiYXJyYXkiLCJ0eXBlIiwic3RyaW5nIiwic3RyaXBOdWxsIiwidWludDMyIiwiYnB0UmVhZE5vZGUiLCJub2RlT2Zmc2V0Iiwibm9kZSIsImxlYWZrZXlzIiwia2V5IiwibG9jYWxlQ29tcGFyZSIsImxhc3RPZmZzZXQiLCJrZXlzIiwidW5kZWZpbmVkIiwicm9vdE5vZGVPZmZzZXQiLCJQcm9taXNlIiwiYWxsIiwic2VhcmNoRXh0cmFJbmRleEJsb2NrcyIsImJsb2NrcyIsInZpZXciLCJyZXMiLCJibG9jayIsIk9ic2VydmFibGUiLCJvYnNlcnZlciIsInJlYWRGZWF0dXJlcyIsInBpcGUiLCJhY2MiLCJjdXJyIiwiY29uY2F0IiwieCIsIm1l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QyxHQUFELEVBQU1DLElBQU47QUFBQSwyQkFBZUQsR0FBRyxDQUFDRSxNQUFKLENBQVdELElBQVgsQ0FBZjtBQUFBLG1CQUFQLENBSEssRUFJTCxvQkFBSSxVQUFBRSxDQUFDLEVBQUk7QUFDUCx5QkFBSyxJQUFJakQsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR2lELENBQUMsQ0FBQzVDLE1BQXRCLEVBQThCTCxDQUFDLElBQUksQ0FBbkMsRUFBc0M7QUFDbkNpRCxzQkFBQUEsQ0FBQyxDQUFDakQsQ0FBRCxDQUFELENBQUtTLEtBQUwsR0FBYWdDLEtBQUssQ0FBQ2hDLEtBQW5CLENBRG1DLENBQ1Y7QUFDM0I7O0FBQ0QsMkJBQU93QyxDQUFQO0FBQ0QsbUJBTEQsQ0FKSyxDQUFQO0FBV0QsaUJBWlcsQzs7dUJBYU1DLDJEQUFTVixHQUFULEdBQWNXLFNBQWQsRTs7O0FBQVpsRSxnQkFBQUEsRztrREFDQ0EsR0FBRyxDQUFDdEIsTUFBSixDQUFXLFVBQUN5RixDQUFELEVBQVk7QUFDNUIseUJBQU9BLENBQUMsQ0FBQ0MsSUFBRixDQUFPQyxLQUFQLENBQWEsSUFBYixFQUFtQkYsQ0FBQyxDQUFDM0MsS0FBRixHQUFVLENBQTdCLE1BQW9DTixJQUEzQztBQUNELGlCQUZNLEM7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXJLaUJvRCxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFyc2VyIH0gZnJvbSAnQGdtb2QvYmluYXJ5LXBhcnNlcidcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyLCBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAsIHJlZHVjZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuXG5pbXBvcnQgeyBCQkksIEZlYXR1cmUgfSBmcm9tICcuL2JiaSdcbmltcG9ydCB7IEJsb2NrVmlldyB9IGZyb20gJy4vYmxvY2tWaWV3J1xuXG5pbnRlcmZhY2UgTG9jIHtcbiAga2V5OiBzdHJpbmdcbiAgb2Zmc2V0OiBudW1iZXJcbiAgbGVuZ3RoOiBudW1iZXJcbiAgZmllbGQ/OiBudW1iZXJcbn1cbmludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWxcbn1cbmludGVyZmFjZSBJbmRleCB7XG4gIHR5cGU6IG51bWJlclxuICBmaWVsZGNvdW50OiBudW1iZXJcbiAgb2Zmc2V0OiBudW1iZXJcbiAgZmllbGQ6IG51bWJlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyVW5kZWY8VD4odHM6IChUIHwgdW5kZWZpbmVkKVtdKTogVFtdIHtcbiAgcmV0dXJuIHRzLmZpbHRlcigodDogVCB8IHVuZGVmaW5lZCk6IHQgaXMgVCA9PiAhIXQpXG59XG5cbmV4cG9ydCBjbGFzcyBCaWdCZWQgZXh0ZW5kcyBCQkkge1xuICBwdWJsaWMgcmVhZEluZGljZXM6IChhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPEluZGV4W10+XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdHM6IGFueSkge1xuICAgIHN1cGVyKG9wdHMpXG4gICAgdGhpcy5yZWFkSW5kaWNlcyA9IHRoaXMuaGVhZGVyQ2FjaGUuYWJvcnRhYmxlTWVtb2l6ZSh0aGlzLl9yZWFkSW5kaWNlcy5iaW5kKHRoaXMpKVxuICB9XG5cbiAgLypcbiAgICogcmV0cmlldmUgdW56b29tZWQgdmlldyBmb3IgYW55IHNjYWxlXG4gICAqIEBwYXJhbSBzY2FsZSAtIHVudXNlZFxuICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBhbiBvcHRpb25hbCBBYm9ydFNpZ25hbCB0byBraWxsIG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIHByb21pc2UgZm9yIGEgQmxvY2tWaWV3XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VmlldyhzY2FsZTogbnVtYmVyLCBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPEJsb2NrVmlldz4ge1xuICAgIHJldHVybiB0aGlzLmdldFVuem9vbWVkVmlldyhhYm9ydFNpZ25hbClcbiAgfVxuXG4gIC8qXG4gICAqIHBhcnNlIHRoZSBiaWdiZWQgZXh0cmFJbmRleCBmaWVsZHNcbiAgICogQHBhcmFtIGFib3J0U2lnbmFsIHRvIGFib3J0IG9wZXJhdGlvblxuICAgKiBAcmV0dXJuIGEgUHJvbWlzZSBmb3IgYW4gYXJyYXkgb2YgSW5kZXggZGF0YSBzdHJ1Y3R1cmUgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGV4dHJhSW5kZXhlcyBpbiBhIGJpZ2JlZCwgc2VlIGJlZFRvQmlnQmVkIGRvY3VtZW50YXRpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBfcmVhZEluZGljZXMoYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8SW5kZXhbXT4ge1xuICAgIGNvbnN0IHsgZXh0SGVhZGVyT2Zmc2V0LCBpc0JpZ0VuZGlhbiB9ID0gYXdhaXQgdGhpcy5nZXRIZWFkZXIoYWJvcnRTaWduYWwpXG4gICAgY29uc3QgeyBidWZmZXI6IGRhdGEgfSA9IGF3YWl0IHRoaXMuYmJpLnJlYWQoQnVmZmVyLmFsbG9jKDY0KSwgMCwgNjQsIGV4dEhlYWRlck9mZnNldClcbiAgICBjb25zdCBsZSA9IGlzQmlnRW5kaWFuID8gJ2JpZycgOiAnbGl0dGxlJ1xuICAgIGNvbnN0IHJldCA9IG5ldyBQYXJzZXIoKVxuICAgICAgLmVuZGlhbmVzcyhsZSlcbiAgICAgIC51aW50MTYoJ3NpemUnKVxuICAgICAgLnVpbnQxNignY291bnQnKVxuICAgICAgLnVpbnQ2NCgnb2Zmc2V0JylcbiAgICAgIC5wYXJzZShkYXRhKS5yZXN1bHRcbiAgICBjb25zdCB7IGNvdW50LCBvZmZzZXQgfSA9IHJldFxuXG4gICAgLy8gbm8gZXh0cmEgaW5kZXggaXMgZGVmaW5lZCBpZiBjb3VudD09MFxuICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgY29uc3QgYmxvY2tsZW4gPSAyMFxuICAgIGNvbnN0IGxlbiA9IGJsb2NrbGVuICogY291bnRcbiAgICBjb25zdCB7IGJ1ZmZlciB9ID0gYXdhaXQgdGhpcy5iYmkucmVhZChCdWZmZXIuYWxsb2MobGVuKSwgMCwgbGVuLCBvZmZzZXQpXG4gICAgY29uc3QgZXh0UGFyc2VyID0gbmV3IFBhcnNlcigpXG4gICAgICAuZW5kaWFuZXNzKGxlKVxuICAgICAgLmludDE2KCd0eXBlJylcbiAgICAgIC5pbnQxNignZmllbGRjb3VudCcpXG4gICAgICAudWludDY0KCdvZmZzZXQnKVxuICAgICAgLnNraXAoNClcbiAgICAgIC5pbnQxNignZmllbGQnKVxuICAgIGNvbnN0IGluZGljZXMgPSBbXVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSArPSAxKSB7XG4gICAgICBpbmRpY2VzLnB1c2goZXh0UGFyc2VyLnBhcnNlKGJ1ZmZlci5zbGljZShpICogYmxvY2tsZW4pKS5yZXN1bHQpXG4gICAgfVxuICAgIHJldHVybiBpbmRpY2VzXG4gIH1cblxuICAvKlxuICAgKiBwZXJmb3JtIGEgc2VhcmNoIGluIHRoZSBiaWdiZWQgZXh0cmFJbmRleCB0byBmaW5kIHdoaWNoIGJsb2NrcyBpbiB0aGUgYmlnYmVkIGRhdGEgdG8gbG9vayBmb3IgdGhlXG4gICAqIGFjdHVhbCBmZWF0dXJlIGRhdGFcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSB0aGUgbmFtZSB0byBzZWFyY2ggZm9yXG4gICAqIEBwYXJhbSBvcHRzIC0gYSBTZWFyY2hPcHRpb25zIGFyZ3VtZW50IHdpdGggb3B0aW9uYWwgc2lnbmFsXG4gICAqIEByZXR1cm4gYSBQcm9taXNlIGZvciBhbiBhcnJheSBvZiBiaWdiZWQgYmxvY2sgTG9jIGVudHJpZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VhcmNoRXh0cmFJbmRleEJsb2NrcyhuYW1lOiBzdHJpbmcsIG9wdHM6IFNlYXJjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8TG9jW10+IHtcbiAgICBjb25zdCB7IHNpZ25hbCB9ID0gb3B0c1xuICAgIGNvbnN0IHsgaXNCaWdFbmRpYW4gfSA9IGF3YWl0IHRoaXMuZ2V0SGVhZGVyKHNpZ25hbClcbiAgICBjb25zdCBpbmRpY2VzID0gYXdhaXQgdGhpcy5yZWFkSW5kaWNlcyhzaWduYWwpXG4gICAgaWYgKCFpbmRpY2VzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICAgIGNvbnN0IGxvY3MgPSBpbmRpY2VzLm1hcChcbiAgICAgIGFzeW5jIChpbmRleCk6IFByb21pc2U8TG9jIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgIGNvbnN0IHsgb2Zmc2V0LCBmaWVsZCB9ID0gaW5kZXhcbiAgICAgICAgY29uc3QgeyBidWZmZXI6IGRhdGEgfSA9IGF3YWl0IHRoaXMuYmJpLnJlYWQoQnVmZmVyLmFsbG9jKDMyKSwgMCwgMzIsIG9mZnNldCwgeyBzaWduYWwgfSlcbiAgICAgICAgY29uc3QgcCA9IG5ldyBQYXJzZXIoKVxuICAgICAgICAgIC5lbmRpYW5lc3MoaXNCaWdFbmRpYW4gPyAnYmlnJyA6ICdsaXR0bGUnKVxuICAgICAgICAgIC5pbnQzMignbWFnaWMnKVxuICAgICAgICAgIC5pbnQzMignYmxvY2tTaXplJylcbiAgICAgICAgICAuaW50MzIoJ2tleVNpemUnKVxuICAgICAgICAgIC5pbnQzMigndmFsU2l6ZScpXG4gICAgICAgICAgLnVpbnQ2NCgnaXRlbUNvdW50JylcblxuICAgICAgICBjb25zdCB7IGJsb2NrU2l6ZSwga2V5U2l6ZSwgdmFsU2l6ZSB9ID0gcC5wYXJzZShkYXRhKS5yZXN1bHRcbiAgICAgICAgY29uc3QgYnB0ID0gbmV3IFBhcnNlcigpXG4gICAgICAgICAgLmVuZGlhbmVzcyhpc0JpZ0VuZGlhbiA/ICdiaWcnIDogJ2xpdHRsZScpXG4gICAgICAgICAgLmludDgoJ25vZGVUeXBlJylcbiAgICAgICAgICAuc2tpcCgxKVxuICAgICAgICAgIC5pbnQxNignY250JylcbiAgICAgICAgICAuY2hvaWNlKHtcbiAgICAgICAgICAgIHRhZzogJ25vZGVUeXBlJyxcbiAgICAgICAgICAgIGNob2ljZXM6IHtcbiAgICAgICAgICAgICAgMDogbmV3IFBhcnNlcigpLmFycmF5KCdsZWFma2V5cycsIHtcbiAgICAgICAgICAgICAgICBsZW5ndGg6ICdjbnQnLFxuICAgICAgICAgICAgICAgIHR5cGU6IG5ldyBQYXJzZXIoKS5zdHJpbmcoJ2tleScsIHsgbGVuZ3RoOiBrZXlTaXplLCBzdHJpcE51bGw6IHRydWUgfSkudWludDY0KCdvZmZzZXQnKSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIDE6IG5ldyBQYXJzZXIoKS5hcnJheSgna2V5cycsIHtcbiAgICAgICAgICAgICAgICBsZW5ndGg6ICdjbnQnLFxuICAgICAgICAgICAgICAgIHR5cGU6IG5ldyBQYXJzZXIoKVxuICAgICAgICAgICAgICAgICAgLnN0cmluZygna2V5JywgeyBsZW5ndGg6IGtleVNpemUsIHN0cmlwTnVsbDogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgICAgLnVpbnQ2NCgnb2Zmc2V0JylcbiAgICAgICAgICAgICAgICAgIC51aW50MzIoJ2xlbmd0aCcpXG4gICAgICAgICAgICAgICAgICAudWludDMyKCdyZXNlcnZlZCcpLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBicHRSZWFkTm9kZSA9IGFzeW5jIChub2RlT2Zmc2V0OiBudW1iZXIpOiBQcm9taXNlPExvYyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICAgIGNvbnN0IGxlbiA9IDQgKyBibG9ja1NpemUgKiAoa2V5U2l6ZSArIHZhbFNpemUpXG4gICAgICAgICAgY29uc3QgeyBidWZmZXIgfSA9IGF3YWl0IHRoaXMuYmJpLnJlYWQoQnVmZmVyLmFsbG9jKGxlbiksIDAsIGxlbiwgbm9kZU9mZnNldCwgeyBzaWduYWwgfSlcbiAgICAgICAgICBjb25zdCBub2RlID0gYnB0LnBhcnNlKGJ1ZmZlcikucmVzdWx0XG4gICAgICAgICAgaWYgKG5vZGUubGVhZmtleXMpIHtcbiAgICAgICAgICAgIGxldCBsYXN0T2Zmc2V0XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUubGVhZmtleXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBrZXkgfSA9IG5vZGUubGVhZmtleXNbaV1cbiAgICAgICAgICAgICAgaWYgKG5hbWUubG9jYWxlQ29tcGFyZShrZXkpIDwgMCAmJiBsYXN0T2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJwdFJlYWROb2RlKGxhc3RPZmZzZXQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGFzdE9mZnNldCA9IG5vZGUubGVhZmtleXNbaV0ub2Zmc2V0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYnB0UmVhZE5vZGUobGFzdE9mZnNldClcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmtleXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmtleXNbaV0ua2V5ID09PSBuYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLm5vZGUua2V5c1tpXSwgZmllbGQgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb290Tm9kZU9mZnNldCA9IDMyXG4gICAgICAgIHJldHVybiBicHRSZWFkTm9kZShvZmZzZXQgKyByb290Tm9kZU9mZnNldClcbiAgICAgIH0sXG4gICAgKVxuICAgIHJldHVybiBmaWx0ZXJVbmRlZihhd2FpdCBQcm9taXNlLmFsbChsb2NzKSlcbiAgfVxuXG4gIC8qXG4gICAqIHJldHJpZXZlIHRoZSBmZWF0dXJlcyBmcm9tIHRoZSBiaWdiZWQgZGF0YSB0aGF0IHdlcmUgZm91bmQgdGhyb3VnaCB0aGUgbG9va3VwIG9mIHRoZSBleHRyYUluZGV4XG4gICAqIG5vdGUgdGhhdCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgZXh0cmFJbmRleCwgc2VlIHRoZSBCaWdCZWQgc3BlY2lmaWNhdGlvbiBhbmQgdGhlIC1leHRyYUluZGV4IGFyZ3VtZW50IHRvIGJlZFRvQmlnQmVkXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gdGhlIG5hbWUgdG8gc2VhcmNoIGZvclxuICAgKiBAcGFyYW0gb3B0cyAtIGEgU2VhcmNoT3B0aW9ucyBhcmd1bWVudCB3aXRoIG9wdGlvbmFsIHNpZ25hbFxuICAgKiBAcmV0dXJuIGEgUHJvbWlzZSBmb3IgYW4gYXJyYXkgb2YgRmVhdHVyZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlYXJjaEV4dHJhSW5kZXgobmFtZTogc3RyaW5nLCBvcHRzOiBTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPEZlYXR1cmVbXT4ge1xuICAgIGNvbnN0IGJsb2NrcyA9IGF3YWl0IHRoaXMuc2VhcmNoRXh0cmFJbmRleEJsb2NrcyhuYW1lLCBvcHRzKVxuICAgIGlmICghYmxvY2tzLmxlbmd0aCkgcmV0dXJuIFtdXG4gICAgY29uc3QgdmlldyA9IGF3YWl0IHRoaXMuZ2V0VW56b29tZWRWaWV3KClcbiAgICBjb25zdCByZXMgPSBibG9ja3MubWFwKGJsb2NrID0+IHtcbiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPEZlYXR1cmVbXT4pID0+IHtcbiAgICAgICAgdmlldy5yZWFkRmVhdHVyZXMob2JzZXJ2ZXIsIFtibG9ja10sIG9wdHMpXG4gICAgICB9KS5waXBlKFxuICAgICAgICByZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjLmNvbmNhdChjdXJyKSksXG4gICAgICAgIG1hcCh4ID0+IHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICB4W2ldLmZpZWxkID0gYmxvY2suZmllbGQgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4geFxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICB9KVxuICAgIGNvbnN0IHJldCA9IGF3YWl0IG1lcmdlKC4uLnJlcykudG9Qcm9taXNlKClcbiAgICByZXR1cm4gcmV0LmZpbHRlcigoZjogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZi5yZXN0LnNwbGl0KCdcXHQnKVtmLmZpZWxkIC0gM10gPT09IG5hbWVcbiAgICB9KVxuICB9XG59XG4iXX0=