@gmod/bam 1.1.8 → 1.1.9
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/CHANGELOG.md +8 -0
- package/README.md +2 -3
- package/dist/bai.d.ts +2 -0
- package/dist/bai.js +300 -548
- package/dist/bai.js.map +1 -0
- package/dist/bamFile.d.ts +4 -6
- package/dist/bamFile.js +675 -1203
- package/dist/bamFile.js.map +1 -0
- package/dist/chunk.js +34 -69
- package/dist/chunk.js.map +1 -0
- package/dist/constants.js +27 -35
- package/dist/constants.js.map +1 -0
- package/dist/csi.js +317 -515
- package/dist/csi.js.map +1 -0
- package/dist/errors.js +64 -120
- package/dist/errors.js.map +1 -0
- package/dist/htsget.js +275 -396
- package/dist/htsget.js.map +1 -0
- package/dist/index.js +16 -54
- package/dist/index.js.map +1 -0
- package/dist/indexFile.d.ts +1 -2
- package/dist/indexFile.js +77 -163
- package/dist/indexFile.js.map +1 -0
- package/dist/record.js +496 -707
- package/dist/record.js.map +1 -0
- package/dist/sam.js +16 -49
- package/dist/sam.js.map +1 -0
- package/dist/util.d.ts +0 -1
- package/dist/util.js +115 -126
- package/dist/util.js.map +1 -0
- package/dist/virtualOffset.js +44 -77
- package/dist/virtualOffset.js.map +1 -0
- package/esm/bai.d.ts +26 -0
- package/esm/bai.js +191 -0
- package/esm/bai.js.map +1 -0
- package/esm/bamFile.d.ts +77 -0
- package/esm/bamFile.js +388 -0
- package/esm/bamFile.js.map +1 -0
- package/esm/chunk.d.ts +18 -0
- package/esm/chunk.js +33 -0
- package/esm/chunk.js.map +1 -0
- package/esm/constants.d.ts +15 -0
- package/esm/constants.js +27 -0
- package/esm/constants.js.map +1 -0
- package/esm/csi.d.ts +35 -0
- package/esm/csi.js +209 -0
- package/esm/csi.js.map +1 -0
- package/esm/errors.d.ts +23 -0
- package/esm/errors.js +24 -0
- package/esm/errors.js.map +1 -0
- package/esm/htsget.d.ts +33 -0
- package/esm/htsget.js +100 -0
- package/esm/htsget.js.map +1 -0
- package/esm/index.d.ts +6 -0
- package/esm/index.js +7 -0
- package/esm/index.js.map +1 -0
- package/esm/indexFile.d.ts +27 -0
- package/esm/indexFile.js +27 -0
- package/esm/indexFile.js.map +1 -0
- package/esm/record.d.ts +88 -0
- package/esm/record.js +534 -0
- package/esm/record.js.map +1 -0
- package/esm/sam.d.ts +7 -0
- package/esm/sam.js +16 -0
- package/esm/sam.js.map +1 -0
- package/esm/util.d.ts +35 -0
- package/esm/util.js +92 -0
- package/esm/util.js.map +1 -0
- package/esm/virtualOffset.d.ts +10 -0
- package/esm/virtualOffset.js +37 -0
- package/esm/virtualOffset.js.map +1 -0
- package/package.json +21 -29
- package/dist/declare.d.js +0 -2
package/dist/bamFile.js
CHANGED
|
@@ -1,1223 +1,695 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
exports.default = exports.BAM_MAGIC = void 0;
|
|
12
|
-
|
|
13
|
-
var _now = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/date/now"));
|
|
14
|
-
|
|
15
|
-
var _sort = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/sort"));
|
|
16
|
-
|
|
17
|
-
var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
|
|
18
|
-
|
|
19
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
|
|
20
|
-
|
|
21
|
-
var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
|
|
22
|
-
|
|
23
|
-
var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise"));
|
|
24
|
-
|
|
25
|
-
var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
|
|
26
|
-
|
|
27
|
-
var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));
|
|
28
|
-
|
|
29
|
-
var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
|
|
30
|
-
|
|
31
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));
|
|
32
|
-
|
|
33
|
-
var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
|
|
34
|
-
|
|
35
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));
|
|
36
|
-
|
|
37
|
-
var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));
|
|
38
|
-
|
|
39
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));
|
|
40
|
-
|
|
41
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));
|
|
42
|
-
|
|
43
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
|
|
44
|
-
|
|
45
|
-
var _wrapAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/wrapAsyncGenerator"));
|
|
46
|
-
|
|
47
|
-
var _awaitAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/awaitAsyncGenerator"));
|
|
48
|
-
|
|
49
|
-
var _asyncGeneratorDelegate2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncGeneratorDelegate"));
|
|
50
|
-
|
|
51
|
-
var _asyncIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncIterator"));
|
|
52
|
-
|
|
53
|
-
var _abortablePromiseCache = _interopRequireDefault(require("abortable-promise-cache"));
|
|
54
|
-
|
|
55
|
-
var _bai = _interopRequireDefault(require("./bai"));
|
|
56
|
-
|
|
57
|
-
var _csi = _interopRequireDefault(require("./csi"));
|
|
58
|
-
|
|
59
|
-
var _bufferCrc = _interopRequireDefault(require("buffer-crc32"));
|
|
60
|
-
|
|
61
|
-
var _bgzfFilehandle = require("@gmod/bgzf-filehandle");
|
|
62
|
-
|
|
63
|
-
var _object = _interopRequireDefault(require("object.entries-ponyfill"));
|
|
64
|
-
|
|
65
|
-
var _quickLru = _interopRequireDefault(require("quick-lru"));
|
|
66
|
-
|
|
67
|
-
var _genericFilehandle = require("generic-filehandle");
|
|
68
|
-
|
|
69
|
-
var _record = _interopRequireDefault(require("./record"));
|
|
70
|
-
|
|
71
|
-
var _sam = require("./sam");
|
|
72
|
-
|
|
73
|
-
var _util = require("./util");
|
|
74
|
-
|
|
75
|
-
var BAM_MAGIC = 21840194;
|
|
76
|
-
exports.BAM_MAGIC = BAM_MAGIC;
|
|
77
|
-
var blockLen = 1 << 16;
|
|
78
|
-
|
|
79
|
-
var BamFile = /*#__PURE__*/function () {
|
|
80
|
-
/**
|
|
81
|
-
* @param {object} args
|
|
82
|
-
* @param {string} [args.bamPath]
|
|
83
|
-
* @param {FileHandle} [args.bamFilehandle]
|
|
84
|
-
* @param {string} [args.baiPath]
|
|
85
|
-
* @param {FileHandle} [args.baiFilehandle]
|
|
86
|
-
*/
|
|
87
|
-
function BamFile(_ref) {
|
|
88
|
-
var _context;
|
|
89
|
-
|
|
90
|
-
var bamFilehandle = _ref.bamFilehandle,
|
|
91
|
-
bamPath = _ref.bamPath,
|
|
92
|
-
bamUrl = _ref.bamUrl,
|
|
93
|
-
baiPath = _ref.baiPath,
|
|
94
|
-
baiFilehandle = _ref.baiFilehandle,
|
|
95
|
-
baiUrl = _ref.baiUrl,
|
|
96
|
-
csiPath = _ref.csiPath,
|
|
97
|
-
csiFilehandle = _ref.csiFilehandle,
|
|
98
|
-
csiUrl = _ref.csiUrl,
|
|
99
|
-
cacheSize = _ref.cacheSize,
|
|
100
|
-
fetchSizeLimit = _ref.fetchSizeLimit,
|
|
101
|
-
chunkSizeLimit = _ref.chunkSizeLimit,
|
|
102
|
-
_ref$yieldThreadTime = _ref.yieldThreadTime,
|
|
103
|
-
yieldThreadTime = _ref$yieldThreadTime === void 0 ? 100 : _ref$yieldThreadTime,
|
|
104
|
-
_ref$renameRefSeqs = _ref.renameRefSeqs,
|
|
105
|
-
renameRefSeqs = _ref$renameRefSeqs === void 0 ? function (n) {
|
|
106
|
-
return n;
|
|
107
|
-
} : _ref$renameRefSeqs;
|
|
108
|
-
(0, _classCallCheck2.default)(this, BamFile);
|
|
109
|
-
(0, _defineProperty2.default)(this, "renameRefSeq", void 0);
|
|
110
|
-
(0, _defineProperty2.default)(this, "bam", void 0);
|
|
111
|
-
(0, _defineProperty2.default)(this, "index", void 0);
|
|
112
|
-
(0, _defineProperty2.default)(this, "chunkSizeLimit", void 0);
|
|
113
|
-
(0, _defineProperty2.default)(this, "fetchSizeLimit", void 0);
|
|
114
|
-
(0, _defineProperty2.default)(this, "header", void 0);
|
|
115
|
-
(0, _defineProperty2.default)(this, "featureCache", void 0);
|
|
116
|
-
(0, _defineProperty2.default)(this, "chrToIndex", void 0);
|
|
117
|
-
(0, _defineProperty2.default)(this, "indexToChr", void 0);
|
|
118
|
-
(0, _defineProperty2.default)(this, "yieldThreadTime", void 0);
|
|
119
|
-
this.renameRefSeq = renameRefSeqs;
|
|
120
|
-
|
|
121
|
-
if (bamFilehandle) {
|
|
122
|
-
this.bam = bamFilehandle;
|
|
123
|
-
} else if (bamPath) {
|
|
124
|
-
this.bam = new _genericFilehandle.LocalFile(bamPath);
|
|
125
|
-
} else if (bamUrl) {
|
|
126
|
-
this.bam = new _genericFilehandle.RemoteFile(bamUrl);
|
|
127
|
-
} else {
|
|
128
|
-
throw new Error('unable to initialize bam');
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
if (csiFilehandle) {
|
|
132
|
-
this.index = new _csi.default({
|
|
133
|
-
filehandle: csiFilehandle
|
|
134
|
-
});
|
|
135
|
-
} else if (csiPath) {
|
|
136
|
-
this.index = new _csi.default({
|
|
137
|
-
filehandle: new _genericFilehandle.LocalFile(csiPath)
|
|
138
|
-
});
|
|
139
|
-
} else if (csiUrl) {
|
|
140
|
-
this.index = new _csi.default({
|
|
141
|
-
filehandle: new _genericFilehandle.RemoteFile(csiUrl)
|
|
142
|
-
});
|
|
143
|
-
} else if (baiFilehandle) {
|
|
144
|
-
this.index = new _bai.default({
|
|
145
|
-
filehandle: baiFilehandle
|
|
146
|
-
});
|
|
147
|
-
} else if (baiPath) {
|
|
148
|
-
this.index = new _bai.default({
|
|
149
|
-
filehandle: new _genericFilehandle.LocalFile(baiPath)
|
|
150
|
-
});
|
|
151
|
-
} else if (baiUrl) {
|
|
152
|
-
this.index = new _bai.default({
|
|
153
|
-
filehandle: new _genericFilehandle.RemoteFile(baiUrl)
|
|
154
|
-
});
|
|
155
|
-
} else if (bamPath) {
|
|
156
|
-
this.index = new _bai.default({
|
|
157
|
-
filehandle: new _genericFilehandle.LocalFile("".concat(bamPath, ".bai"))
|
|
158
|
-
});
|
|
159
|
-
} else if (bamUrl) {
|
|
160
|
-
this.index = new _bai.default({
|
|
161
|
-
filehandle: new _genericFilehandle.RemoteFile("".concat(bamUrl, ".bai"))
|
|
162
|
-
});
|
|
163
|
-
} else {
|
|
164
|
-
throw new Error('unable to infer index format');
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
this.featureCache = new _abortablePromiseCache.default({
|
|
168
|
-
cache: new _quickLru.default({
|
|
169
|
-
maxSize: cacheSize !== undefined ? cacheSize : 50
|
|
170
|
-
}),
|
|
171
|
-
fill: (0, _bind.default)(_context = this._readChunk).call(_context, this)
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
172
9
|
});
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
indexToChr,
|
|
196
|
-
_args = arguments;
|
|
197
|
-
|
|
198
|
-
return _regenerator.default.wrap(function _callee$(_context2) {
|
|
199
|
-
while (1) {
|
|
200
|
-
switch (_context2.prev = _context2.next) {
|
|
201
|
-
case 0:
|
|
202
|
-
origOpts = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};
|
|
203
|
-
opts = (0, _util.makeOpts)(origOpts);
|
|
204
|
-
_context2.next = 4;
|
|
205
|
-
return this.index.parse(opts);
|
|
206
|
-
|
|
207
|
-
case 4:
|
|
208
|
-
indexData = _context2.sent;
|
|
209
|
-
ret = indexData.firstDataLine ? indexData.firstDataLine.blockPosition + 65535 : undefined;
|
|
210
|
-
|
|
211
|
-
if (!ret) {
|
|
212
|
-
_context2.next = 17;
|
|
213
|
-
break;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
_context2.next = 9;
|
|
217
|
-
return this.bam.read(Buffer.alloc(ret + blockLen), 0, ret + blockLen, 0, opts);
|
|
218
|
-
|
|
219
|
-
case 9:
|
|
220
|
-
res = _context2.sent;
|
|
221
|
-
bytesRead = res.bytesRead;
|
|
222
|
-
buffer = res.buffer;
|
|
223
|
-
|
|
224
|
-
if (bytesRead) {
|
|
225
|
-
_context2.next = 14;
|
|
226
|
-
break;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
throw new Error('Error reading header');
|
|
230
|
-
|
|
231
|
-
case 14:
|
|
232
|
-
if (bytesRead < ret) {
|
|
233
|
-
buffer = (0, _slice.default)(buffer).call(buffer, 0, bytesRead);
|
|
234
|
-
} else {
|
|
235
|
-
buffer = (0, _slice.default)(buffer).call(buffer, 0, ret);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
_context2.next = 20;
|
|
239
|
-
break;
|
|
240
|
-
|
|
241
|
-
case 17:
|
|
242
|
-
_context2.next = 19;
|
|
243
|
-
return this.bam.readFile(opts);
|
|
244
|
-
|
|
245
|
-
case 19:
|
|
246
|
-
buffer = _context2.sent;
|
|
247
|
-
|
|
248
|
-
case 20:
|
|
249
|
-
_context2.next = 22;
|
|
250
|
-
return (0, _bgzfFilehandle.unzip)(buffer);
|
|
251
|
-
|
|
252
|
-
case 22:
|
|
253
|
-
uncba = _context2.sent;
|
|
254
|
-
|
|
255
|
-
if (!(uncba.readInt32LE(0) !== BAM_MAGIC)) {
|
|
256
|
-
_context2.next = 25;
|
|
257
|
-
break;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
throw new Error('Not a BAM file');
|
|
261
|
-
|
|
262
|
-
case 25:
|
|
263
|
-
headLen = uncba.readInt32LE(4);
|
|
264
|
-
this.header = uncba.toString('utf8', 8, 8 + headLen);
|
|
265
|
-
_context2.next = 29;
|
|
266
|
-
return this._readRefSeqs(headLen + 8, 65535, opts);
|
|
267
|
-
|
|
268
|
-
case 29:
|
|
269
|
-
_yield$this$_readRefS = _context2.sent;
|
|
270
|
-
chrToIndex = _yield$this$_readRefS.chrToIndex;
|
|
271
|
-
indexToChr = _yield$this$_readRefS.indexToChr;
|
|
272
|
-
this.chrToIndex = chrToIndex;
|
|
273
|
-
this.indexToChr = indexToChr;
|
|
274
|
-
return _context2.abrupt("return", (0, _sam.parseHeaderText)(this.header));
|
|
275
|
-
|
|
276
|
-
case 35:
|
|
277
|
-
case "end":
|
|
278
|
-
return _context2.stop();
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
}, _callee, this);
|
|
282
|
-
}));
|
|
283
|
-
|
|
284
|
-
function getHeader() {
|
|
285
|
-
return _getHeader.apply(this, arguments);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
return getHeader;
|
|
289
|
-
}()
|
|
290
|
-
}, {
|
|
291
|
-
key: "getHeaderText",
|
|
292
|
-
value: function () {
|
|
293
|
-
var _getHeaderText = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
|
|
294
|
-
var opts,
|
|
295
|
-
_args2 = arguments;
|
|
296
|
-
return _regenerator.default.wrap(function _callee2$(_context3) {
|
|
297
|
-
while (1) {
|
|
298
|
-
switch (_context3.prev = _context3.next) {
|
|
299
|
-
case 0:
|
|
300
|
-
opts = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : {};
|
|
301
|
-
_context3.next = 3;
|
|
302
|
-
return this.getHeader(opts);
|
|
303
|
-
|
|
304
|
-
case 3:
|
|
305
|
-
return _context3.abrupt("return", this.header);
|
|
306
|
-
|
|
307
|
-
case 4:
|
|
308
|
-
case "end":
|
|
309
|
-
return _context3.stop();
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}, _callee2, this);
|
|
313
|
-
}));
|
|
314
|
-
|
|
315
|
-
function getHeaderText() {
|
|
316
|
-
return _getHeaderText.apply(this, arguments);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
return getHeaderText;
|
|
320
|
-
}() // the full length of the refseq block is not given in advance so this grabs a chunk and
|
|
321
|
-
// doubles it if all refseqs haven't been processed
|
|
322
|
-
|
|
323
|
-
}, {
|
|
324
|
-
key: "_readRefSeqs",
|
|
325
|
-
value: function () {
|
|
326
|
-
var _readRefSeqs2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(start, refSeqBytes) {
|
|
327
|
-
var opts,
|
|
328
|
-
res,
|
|
329
|
-
bytesRead,
|
|
330
|
-
buffer,
|
|
331
|
-
uncba,
|
|
332
|
-
nRef,
|
|
333
|
-
p,
|
|
334
|
-
chrToIndex,
|
|
335
|
-
indexToChr,
|
|
336
|
-
i,
|
|
337
|
-
lName,
|
|
338
|
-
refName,
|
|
339
|
-
lRef,
|
|
340
|
-
_args3 = arguments;
|
|
341
|
-
return _regenerator.default.wrap(function _callee3$(_context4) {
|
|
342
|
-
while (1) {
|
|
343
|
-
switch (_context4.prev = _context4.next) {
|
|
344
|
-
case 0:
|
|
345
|
-
opts = _args3.length > 2 && _args3[2] !== undefined ? _args3[2] : {};
|
|
346
|
-
|
|
347
|
-
if (!(start > refSeqBytes)) {
|
|
348
|
-
_context4.next = 3;
|
|
349
|
-
break;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
return _context4.abrupt("return", this._readRefSeqs(start, refSeqBytes * 2, opts));
|
|
353
|
-
|
|
354
|
-
case 3:
|
|
355
|
-
_context4.next = 5;
|
|
356
|
-
return this.bam.read(Buffer.alloc(refSeqBytes + blockLen), 0, refSeqBytes, 0, opts);
|
|
357
|
-
|
|
358
|
-
case 5:
|
|
359
|
-
res = _context4.sent;
|
|
360
|
-
bytesRead = res.bytesRead;
|
|
361
|
-
buffer = res.buffer;
|
|
362
|
-
|
|
363
|
-
if (bytesRead) {
|
|
364
|
-
_context4.next = 10;
|
|
365
|
-
break;
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
throw new Error('Error reading refseqs from header');
|
|
369
|
-
|
|
370
|
-
case 10:
|
|
371
|
-
if (bytesRead < refSeqBytes) {
|
|
372
|
-
buffer = (0, _slice.default)(buffer).call(buffer, 0, bytesRead);
|
|
373
|
-
} else {
|
|
374
|
-
buffer = (0, _slice.default)(buffer).call(buffer, 0, refSeqBytes);
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
_context4.next = 13;
|
|
378
|
-
return (0, _bgzfFilehandle.unzip)(buffer);
|
|
379
|
-
|
|
380
|
-
case 13:
|
|
381
|
-
uncba = _context4.sent;
|
|
382
|
-
nRef = uncba.readInt32LE(start);
|
|
383
|
-
p = start + 4;
|
|
384
|
-
chrToIndex = {};
|
|
385
|
-
indexToChr = [];
|
|
386
|
-
i = 0;
|
|
387
|
-
|
|
388
|
-
case 19:
|
|
389
|
-
if (!(i < nRef)) {
|
|
390
|
-
_context4.next = 35;
|
|
391
|
-
break;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
_context4.next = 22;
|
|
395
|
-
return (0, _util.abortBreakPoint)(opts.signal);
|
|
396
|
-
|
|
397
|
-
case 22:
|
|
398
|
-
lName = uncba.readInt32LE(p);
|
|
399
|
-
refName = uncba.toString('utf8', p + 4, p + 4 + lName - 1);
|
|
400
|
-
refName = this.renameRefSeq(refName);
|
|
401
|
-
lRef = uncba.readInt32LE(p + lName + 4);
|
|
402
|
-
chrToIndex[refName] = i;
|
|
403
|
-
indexToChr.push({
|
|
404
|
-
refName: refName,
|
|
405
|
-
length: lRef
|
|
406
|
-
});
|
|
407
|
-
p = p + 8 + lName;
|
|
408
|
-
|
|
409
|
-
if (!(p > uncba.length)) {
|
|
410
|
-
_context4.next = 32;
|
|
411
|
-
break;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
console.warn("BAM header is very big. Re-fetching ".concat(refSeqBytes, " bytes."));
|
|
415
|
-
return _context4.abrupt("return", this._readRefSeqs(start, refSeqBytes * 2, opts));
|
|
416
|
-
|
|
417
|
-
case 32:
|
|
418
|
-
i += 1;
|
|
419
|
-
_context4.next = 19;
|
|
420
|
-
break;
|
|
421
|
-
|
|
422
|
-
case 35:
|
|
423
|
-
return _context4.abrupt("return", {
|
|
424
|
-
chrToIndex: chrToIndex,
|
|
425
|
-
indexToChr: indexToChr
|
|
426
|
-
});
|
|
427
|
-
|
|
428
|
-
case 36:
|
|
429
|
-
case "end":
|
|
430
|
-
return _context4.stop();
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
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;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
431
32
|
}
|
|
432
|
-
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
return _context5.stop();
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
}, _callee4, this, [[4, 21, 25, 35], [26,, 30, 34]]);
|
|
545
|
-
}));
|
|
546
|
-
|
|
547
|
-
function getRecordsForRange(_x3, _x4, _x5) {
|
|
548
|
-
return _getRecordsForRange.apply(this, arguments);
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
return getRecordsForRange;
|
|
552
|
-
}()
|
|
553
|
-
}, {
|
|
554
|
-
key: "streamRecordsForRange",
|
|
555
|
-
value: function streamRecordsForRange(chr, min, max) {
|
|
556
|
-
var _this = this;
|
|
557
|
-
|
|
558
|
-
var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {
|
|
559
|
-
viewAsPairs: false,
|
|
560
|
-
pairAcrossChr: false,
|
|
561
|
-
maxInsertSize: 200000
|
|
562
|
-
};
|
|
563
|
-
return (0, _wrapAsyncGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {
|
|
564
|
-
var _context7;
|
|
565
|
-
|
|
566
|
-
var chrId, chunks, i, size, _context6, totalSize, _context8;
|
|
567
|
-
|
|
568
|
-
return _regenerator.default.wrap(function _callee5$(_context9) {
|
|
569
|
-
while (1) {
|
|
570
|
-
switch (_context9.prev = _context9.next) {
|
|
571
|
-
case 0:
|
|
572
|
-
// todo regularize refseq names
|
|
573
|
-
opts.viewAsPairs = opts.viewAsPairs || false;
|
|
574
|
-
opts.pairAcrossChr = opts.pairAcrossChr || false;
|
|
575
|
-
opts.maxInsertSize = opts.maxInsertSize !== undefined ? opts.maxInsertSize : 200000;
|
|
576
|
-
chrId = _this.chrToIndex && _this.chrToIndex[chr];
|
|
577
|
-
|
|
578
|
-
if (chrId >= 0) {
|
|
579
|
-
_context9.next = 8;
|
|
580
|
-
break;
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
chunks = [];
|
|
584
|
-
_context9.next = 13;
|
|
585
|
-
break;
|
|
586
|
-
|
|
587
|
-
case 8:
|
|
588
|
-
_context9.next = 10;
|
|
589
|
-
return (0, _awaitAsyncGenerator2.default)(_this.index.blocksForRange(chrId, min - 1, max, opts));
|
|
590
|
-
|
|
591
|
-
case 10:
|
|
592
|
-
chunks = _context9.sent;
|
|
593
|
-
|
|
594
|
-
if (chunks) {
|
|
595
|
-
_context9.next = 13;
|
|
596
|
-
break;
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
throw new Error('Error in index fetch');
|
|
600
|
-
|
|
601
|
-
case 13:
|
|
602
|
-
i = 0;
|
|
603
|
-
|
|
604
|
-
case 14:
|
|
605
|
-
if (!(i < chunks.length)) {
|
|
606
|
-
_context9.next = 23;
|
|
607
|
-
break;
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
_context9.next = 17;
|
|
611
|
-
return (0, _awaitAsyncGenerator2.default)((0, _util.abortBreakPoint)(opts.signal));
|
|
612
|
-
|
|
613
|
-
case 17:
|
|
614
|
-
size = chunks[i].fetchedSize();
|
|
615
|
-
|
|
616
|
-
if (!(size > _this.chunkSizeLimit)) {
|
|
617
|
-
_context9.next = 20;
|
|
618
|
-
break;
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
throw new Error((0, _concat.default)(_context6 = "Too many BAM features. BAM chunk size ".concat(size, " bytes exceeds chunkSizeLimit of ")).call(_context6, _this.chunkSizeLimit));
|
|
622
|
-
|
|
623
|
-
case 20:
|
|
624
|
-
i += 1;
|
|
625
|
-
_context9.next = 14;
|
|
626
|
-
break;
|
|
627
|
-
|
|
628
|
-
case 23:
|
|
629
|
-
totalSize = (0, _reduce.default)(_context7 = (0, _map.default)(chunks).call(chunks, function (s) {
|
|
630
|
-
return s.fetchedSize();
|
|
631
|
-
})).call(_context7, function (a, b) {
|
|
632
|
-
return a + b;
|
|
633
|
-
}, 0);
|
|
634
|
-
|
|
635
|
-
if (!(totalSize > _this.fetchSizeLimit)) {
|
|
636
|
-
_context9.next = 26;
|
|
637
|
-
break;
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
throw new Error((0, _concat.default)(_context8 = "data size of ".concat(totalSize.toLocaleString(), " bytes exceeded fetch size limit of ")).call(_context8, _this.fetchSizeLimit.toLocaleString(), " bytes"));
|
|
641
|
-
|
|
642
|
-
case 26:
|
|
643
|
-
return _context9.delegateYield((0, _asyncGeneratorDelegate2.default)((0, _asyncIterator2.default)(_this._fetchChunkFeatures(chunks, chrId, min, max, opts)), _awaitAsyncGenerator2.default), "t0", 27);
|
|
644
|
-
|
|
645
|
-
case 27:
|
|
646
|
-
case "end":
|
|
647
|
-
return _context9.stop();
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
}, _callee5);
|
|
651
|
-
}))();
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
39
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
40
|
+
var m = o[Symbol.asyncIterator], i;
|
|
41
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
42
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
43
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
44
|
+
};
|
|
45
|
+
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
|
|
46
|
+
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
|
|
47
|
+
var i, p;
|
|
48
|
+
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
|
|
49
|
+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
|
|
50
|
+
};
|
|
51
|
+
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
|
|
52
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
53
|
+
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
|
54
|
+
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
|
|
55
|
+
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
|
|
56
|
+
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
|
57
|
+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
|
58
|
+
function fulfill(value) { resume("next", value); }
|
|
59
|
+
function reject(value) { resume("throw", value); }
|
|
60
|
+
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
|
61
|
+
};
|
|
62
|
+
var __values = (this && this.__values) || function(o) {
|
|
63
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
64
|
+
if (m) return m.call(o);
|
|
65
|
+
if (o && typeof o.length === "number") return {
|
|
66
|
+
next: function () {
|
|
67
|
+
if (o && i >= o.length) o = void 0;
|
|
68
|
+
return { value: o && o[i++], done: !o };
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
72
|
+
};
|
|
73
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
74
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
75
|
+
};
|
|
76
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
77
|
+
exports.BAM_MAGIC = void 0;
|
|
78
|
+
var bai_1 = __importDefault(require("./bai"));
|
|
79
|
+
var csi_1 = __importDefault(require("./csi"));
|
|
80
|
+
var buffer_crc32_1 = __importDefault(require("buffer-crc32"));
|
|
81
|
+
var bgzf_filehandle_1 = require("@gmod/bgzf-filehandle");
|
|
82
|
+
var object_entries_ponyfill_1 = __importDefault(require("object.entries-ponyfill"));
|
|
83
|
+
var generic_filehandle_1 = require("generic-filehandle");
|
|
84
|
+
var record_1 = __importDefault(require("./record"));
|
|
85
|
+
var sam_1 = require("./sam");
|
|
86
|
+
var util_1 = require("./util");
|
|
87
|
+
exports.BAM_MAGIC = 21840194;
|
|
88
|
+
var blockLen = 1 << 16;
|
|
89
|
+
var BamFile = /** @class */ (function () {
|
|
90
|
+
/**
|
|
91
|
+
* @param {object} args
|
|
92
|
+
* @param {string} [args.bamPath]
|
|
93
|
+
* @param {FileHandle} [args.bamFilehandle]
|
|
94
|
+
* @param {string} [args.baiPath]
|
|
95
|
+
* @param {FileHandle} [args.baiFilehandle]
|
|
96
|
+
*/
|
|
97
|
+
function BamFile(_a) {
|
|
98
|
+
var bamFilehandle = _a.bamFilehandle, bamPath = _a.bamPath, bamUrl = _a.bamUrl, baiPath = _a.baiPath, baiFilehandle = _a.baiFilehandle, baiUrl = _a.baiUrl, csiPath = _a.csiPath, csiFilehandle = _a.csiFilehandle, csiUrl = _a.csiUrl, fetchSizeLimit = _a.fetchSizeLimit, chunkSizeLimit = _a.chunkSizeLimit, _b = _a.yieldThreadTime, yieldThreadTime = _b === void 0 ? 100 : _b, _c = _a.renameRefSeqs, renameRefSeqs = _c === void 0 ? function (n) { return n; } : _c;
|
|
99
|
+
this.renameRefSeq = renameRefSeqs;
|
|
100
|
+
if (bamFilehandle) {
|
|
101
|
+
this.bam = bamFilehandle;
|
|
102
|
+
}
|
|
103
|
+
else if (bamPath) {
|
|
104
|
+
this.bam = new generic_filehandle_1.LocalFile(bamPath);
|
|
105
|
+
}
|
|
106
|
+
else if (bamUrl) {
|
|
107
|
+
this.bam = new generic_filehandle_1.RemoteFile(bamUrl);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
throw new Error('unable to initialize bam');
|
|
111
|
+
}
|
|
112
|
+
if (csiFilehandle) {
|
|
113
|
+
this.index = new csi_1.default({ filehandle: csiFilehandle });
|
|
114
|
+
}
|
|
115
|
+
else if (csiPath) {
|
|
116
|
+
this.index = new csi_1.default({ filehandle: new generic_filehandle_1.LocalFile(csiPath) });
|
|
117
|
+
}
|
|
118
|
+
else if (csiUrl) {
|
|
119
|
+
this.index = new csi_1.default({ filehandle: new generic_filehandle_1.RemoteFile(csiUrl) });
|
|
120
|
+
}
|
|
121
|
+
else if (baiFilehandle) {
|
|
122
|
+
this.index = new bai_1.default({ filehandle: baiFilehandle });
|
|
123
|
+
}
|
|
124
|
+
else if (baiPath) {
|
|
125
|
+
this.index = new bai_1.default({ filehandle: new generic_filehandle_1.LocalFile(baiPath) });
|
|
126
|
+
}
|
|
127
|
+
else if (baiUrl) {
|
|
128
|
+
this.index = new bai_1.default({ filehandle: new generic_filehandle_1.RemoteFile(baiUrl) });
|
|
129
|
+
}
|
|
130
|
+
else if (bamPath) {
|
|
131
|
+
this.index = new bai_1.default({ filehandle: new generic_filehandle_1.LocalFile("".concat(bamPath, ".bai")) });
|
|
132
|
+
}
|
|
133
|
+
else if (bamUrl) {
|
|
134
|
+
this.index = new bai_1.default({ filehandle: new generic_filehandle_1.RemoteFile("".concat(bamUrl, ".bai")) });
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
throw new Error('unable to infer index format');
|
|
138
|
+
}
|
|
139
|
+
this.fetchSizeLimit = fetchSizeLimit || 500000000; // 500MB
|
|
140
|
+
this.chunkSizeLimit = chunkSizeLimit || 300000000; // 300MB
|
|
141
|
+
this.yieldThreadTime = yieldThreadTime;
|
|
652
142
|
}
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
143
|
+
BamFile.prototype.getHeader = function (origOpts) {
|
|
144
|
+
if (origOpts === void 0) { origOpts = {}; }
|
|
145
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
146
|
+
var opts, indexData, ret, buffer, res, bytesRead, uncba, headLen, _a, chrToIndex, indexToChr;
|
|
147
|
+
return __generator(this, function (_b) {
|
|
148
|
+
switch (_b.label) {
|
|
149
|
+
case 0:
|
|
150
|
+
opts = (0, util_1.makeOpts)(origOpts);
|
|
151
|
+
return [4 /*yield*/, this.index.parse(opts)];
|
|
152
|
+
case 1:
|
|
153
|
+
indexData = _b.sent();
|
|
154
|
+
ret = indexData.firstDataLine
|
|
155
|
+
? indexData.firstDataLine.blockPosition + 65535
|
|
156
|
+
: undefined;
|
|
157
|
+
if (!ret) return [3 /*break*/, 3];
|
|
158
|
+
return [4 /*yield*/, this.bam.read(Buffer.alloc(ret + blockLen), 0, ret + blockLen, 0, opts)];
|
|
159
|
+
case 2:
|
|
160
|
+
res = _b.sent();
|
|
161
|
+
bytesRead = res.bytesRead;
|
|
162
|
+
(buffer = res.buffer);
|
|
163
|
+
if (!bytesRead) {
|
|
164
|
+
throw new Error('Error reading header');
|
|
165
|
+
}
|
|
166
|
+
if (bytesRead < ret) {
|
|
167
|
+
buffer = buffer.slice(0, bytesRead);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
buffer = buffer.slice(0, ret);
|
|
171
|
+
}
|
|
172
|
+
return [3 /*break*/, 5];
|
|
173
|
+
case 3: return [4 /*yield*/, this.bam.readFile(opts)];
|
|
174
|
+
case 4:
|
|
175
|
+
buffer = (_b.sent());
|
|
176
|
+
_b.label = 5;
|
|
177
|
+
case 5: return [4 /*yield*/, (0, bgzf_filehandle_1.unzip)(buffer)];
|
|
178
|
+
case 6:
|
|
179
|
+
uncba = _b.sent();
|
|
180
|
+
if (uncba.readInt32LE(0) !== exports.BAM_MAGIC) {
|
|
181
|
+
throw new Error('Not a BAM file');
|
|
182
|
+
}
|
|
183
|
+
headLen = uncba.readInt32LE(4);
|
|
184
|
+
this.header = uncba.toString('utf8', 8, 8 + headLen);
|
|
185
|
+
return [4 /*yield*/, this._readRefSeqs(headLen + 8, 65535, opts)];
|
|
186
|
+
case 7:
|
|
187
|
+
_a = _b.sent(), chrToIndex = _a.chrToIndex, indexToChr = _a.indexToChr;
|
|
188
|
+
this.chrToIndex = chrToIndex;
|
|
189
|
+
this.indexToChr = indexToChr;
|
|
190
|
+
return [2 /*return*/, (0, sam_1.parseHeaderText)(this.header)];
|
|
673
191
|
}
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
dpositions = _yield$_awaitAsyncGen.dpositions;
|
|
687
|
-
chunk = _yield$_awaitAsyncGen.chunk;
|
|
688
|
-
promise = _this2.readBamFeatures(data, cpositions, dpositions, chunk).then(function (records) {
|
|
689
|
-
var recs = [];
|
|
690
|
-
|
|
691
|
-
for (var _i = 0; _i < records.length; _i += 1) {
|
|
692
|
-
var feature = records[_i];
|
|
693
|
-
|
|
694
|
-
if (feature.seq_id() === chrId) {
|
|
695
|
-
if (feature.get('start') >= max) {
|
|
696
|
-
// past end of range, can stop iterating
|
|
697
|
-
done = true;
|
|
698
|
-
break;
|
|
699
|
-
} else if (feature.get('end') >= min) {
|
|
700
|
-
// must be in range
|
|
701
|
-
recs.push(feature);
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
|
|
706
|
-
return recs;
|
|
707
|
-
});
|
|
708
|
-
featPromises.push(promise);
|
|
709
|
-
_context10.next = 16;
|
|
710
|
-
return (0, _awaitAsyncGenerator2.default)(promise);
|
|
711
|
-
|
|
712
|
-
case 16:
|
|
713
|
-
if (!done) {
|
|
714
|
-
_context10.next = 18;
|
|
715
|
-
break;
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
};
|
|
195
|
+
BamFile.prototype.getHeaderText = function (opts) {
|
|
196
|
+
if (opts === void 0) { opts = {}; }
|
|
197
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
198
|
+
return __generator(this, function (_a) {
|
|
199
|
+
switch (_a.label) {
|
|
200
|
+
case 0: return [4 /*yield*/, this.getHeader(opts)];
|
|
201
|
+
case 1:
|
|
202
|
+
_a.sent();
|
|
203
|
+
return [2 /*return*/, this.header];
|
|
716
204
|
}
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
};
|
|
208
|
+
// the full length of the refseq block is not given in advance so this grabs a chunk and
|
|
209
|
+
// doubles it if all refseqs haven't been processed
|
|
210
|
+
BamFile.prototype._readRefSeqs = function (start, refSeqBytes, opts) {
|
|
211
|
+
if (opts === void 0) { opts = {}; }
|
|
212
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
213
|
+
var res, bytesRead, buffer, uncba, nRef, p, chrToIndex, indexToChr, i, lName, refName, lRef;
|
|
214
|
+
return __generator(this, function (_a) {
|
|
215
|
+
switch (_a.label) {
|
|
216
|
+
case 0:
|
|
217
|
+
if (start > refSeqBytes) {
|
|
218
|
+
return [2 /*return*/, this._readRefSeqs(start, refSeqBytes * 2, opts)];
|
|
219
|
+
}
|
|
220
|
+
return [4 /*yield*/, this.bam.read(Buffer.alloc(refSeqBytes + blockLen), 0, refSeqBytes, 0, opts)];
|
|
221
|
+
case 1:
|
|
222
|
+
res = _a.sent();
|
|
223
|
+
bytesRead = res.bytesRead;
|
|
224
|
+
buffer = res.buffer;
|
|
225
|
+
if (!bytesRead) {
|
|
226
|
+
throw new Error('Error reading refseqs from header');
|
|
227
|
+
}
|
|
228
|
+
if (bytesRead < refSeqBytes) {
|
|
229
|
+
buffer = buffer.slice(0, bytesRead);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
buffer = buffer.slice(0, refSeqBytes);
|
|
233
|
+
}
|
|
234
|
+
return [4 /*yield*/, (0, bgzf_filehandle_1.unzip)(buffer)];
|
|
235
|
+
case 2:
|
|
236
|
+
uncba = _a.sent();
|
|
237
|
+
nRef = uncba.readInt32LE(start);
|
|
238
|
+
p = start + 4;
|
|
239
|
+
chrToIndex = {};
|
|
240
|
+
indexToChr = [];
|
|
241
|
+
i = 0;
|
|
242
|
+
_a.label = 3;
|
|
243
|
+
case 3:
|
|
244
|
+
if (!(i < nRef)) return [3 /*break*/, 6];
|
|
245
|
+
return [4 /*yield*/, (0, util_1.abortBreakPoint)(opts.signal)];
|
|
246
|
+
case 4:
|
|
247
|
+
_a.sent();
|
|
248
|
+
lName = uncba.readInt32LE(p);
|
|
249
|
+
refName = this.renameRefSeq(uncba.toString('utf8', p + 4, p + 4 + lName - 1));
|
|
250
|
+
lRef = uncba.readInt32LE(p + lName + 4);
|
|
251
|
+
chrToIndex[refName] = i;
|
|
252
|
+
indexToChr.push({ refName: refName, length: lRef });
|
|
253
|
+
p = p + 8 + lName;
|
|
254
|
+
if (p > uncba.length) {
|
|
255
|
+
console.warn("BAM header is very big. Re-fetching ".concat(refSeqBytes, " bytes."));
|
|
256
|
+
return [2 /*return*/, this._readRefSeqs(start, refSeqBytes * 2, opts)];
|
|
257
|
+
}
|
|
258
|
+
_a.label = 5;
|
|
259
|
+
case 5:
|
|
260
|
+
i += 1;
|
|
261
|
+
return [3 /*break*/, 3];
|
|
262
|
+
case 6: return [2 /*return*/, { chrToIndex: chrToIndex, indexToChr: indexToChr }];
|
|
733
263
|
}
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
};
|
|
267
|
+
BamFile.prototype.getRecordsForRange = function (chr, min, max, opts) {
|
|
268
|
+
var e_1, _a;
|
|
269
|
+
if (opts === void 0) { opts = {
|
|
270
|
+
viewAsPairs: false,
|
|
271
|
+
pairAcrossChr: false,
|
|
272
|
+
maxInsertSize: 200000,
|
|
273
|
+
}; }
|
|
274
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
275
|
+
var records, _b, _c, chunk, e_1_1;
|
|
276
|
+
return __generator(this, function (_d) {
|
|
277
|
+
switch (_d.label) {
|
|
278
|
+
case 0:
|
|
279
|
+
records = [];
|
|
280
|
+
_d.label = 1;
|
|
281
|
+
case 1:
|
|
282
|
+
_d.trys.push([1, 6, 7, 12]);
|
|
283
|
+
_b = __asyncValues(this.streamRecordsForRange(chr, min, max, opts));
|
|
284
|
+
_d.label = 2;
|
|
285
|
+
case 2: return [4 /*yield*/, _b.next()];
|
|
286
|
+
case 3:
|
|
287
|
+
if (!(_c = _d.sent(), !_c.done)) return [3 /*break*/, 5];
|
|
288
|
+
chunk = _c.value;
|
|
289
|
+
records = records.concat(chunk);
|
|
290
|
+
_d.label = 4;
|
|
291
|
+
case 4: return [3 /*break*/, 2];
|
|
292
|
+
case 5: return [3 /*break*/, 12];
|
|
293
|
+
case 6:
|
|
294
|
+
e_1_1 = _d.sent();
|
|
295
|
+
e_1 = { error: e_1_1 };
|
|
296
|
+
return [3 /*break*/, 12];
|
|
297
|
+
case 7:
|
|
298
|
+
_d.trys.push([7, , 10, 11]);
|
|
299
|
+
if (!(_c && !_c.done && (_a = _b.return))) return [3 /*break*/, 9];
|
|
300
|
+
return [4 /*yield*/, _a.call(_b)];
|
|
301
|
+
case 8:
|
|
302
|
+
_d.sent();
|
|
303
|
+
_d.label = 9;
|
|
304
|
+
case 9: return [3 /*break*/, 11];
|
|
305
|
+
case 10:
|
|
306
|
+
if (e_1) throw e_1.error;
|
|
307
|
+
return [7 /*endfinally*/];
|
|
308
|
+
case 11: return [7 /*endfinally*/];
|
|
309
|
+
case 12: return [2 /*return*/, records];
|
|
749
310
|
}
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
_context18.next = 4;
|
|
779
|
-
return _promise.default.all((0, _map.default)(featPromises).call(featPromises, /*#__PURE__*/function () {
|
|
780
|
-
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(f) {
|
|
781
|
-
var _context11;
|
|
782
|
-
|
|
783
|
-
var ret, readNames, i, name, id;
|
|
784
|
-
return _regenerator.default.wrap(function _callee7$(_context12) {
|
|
785
|
-
while (1) {
|
|
786
|
-
switch (_context12.prev = _context12.next) {
|
|
787
|
-
case 0:
|
|
788
|
-
_context12.next = 2;
|
|
789
|
-
return f;
|
|
790
|
-
|
|
791
|
-
case 2:
|
|
792
|
-
ret = _context12.sent;
|
|
793
|
-
readNames = {};
|
|
794
|
-
|
|
795
|
-
for (i = 0; i < ret.length; i++) {
|
|
796
|
-
name = ret[i].name();
|
|
797
|
-
id = ret[i].id();
|
|
798
|
-
|
|
799
|
-
if (!readNames[name]) {
|
|
800
|
-
readNames[name] = 0;
|
|
801
|
-
}
|
|
802
|
-
|
|
803
|
-
readNames[name]++;
|
|
804
|
-
readIds[id] = 1;
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
(0, _forEach.default)(_context11 = (0, _object.default)(readNames)).call(_context11, function (_ref3) {
|
|
808
|
-
var _ref4 = (0, _slicedToArray2.default)(_ref3, 2),
|
|
809
|
-
k = _ref4[0],
|
|
810
|
-
v = _ref4[1];
|
|
811
|
-
|
|
812
|
-
if (v === 1) {
|
|
813
|
-
unmatedPairs[k] = true;
|
|
814
|
-
}
|
|
815
|
-
});
|
|
816
|
-
|
|
817
|
-
case 6:
|
|
818
|
-
case "end":
|
|
819
|
-
return _context12.stop();
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
};
|
|
314
|
+
BamFile.prototype.streamRecordsForRange = function (chr, min, max, opts) {
|
|
315
|
+
if (opts === void 0) { opts = {
|
|
316
|
+
viewAsPairs: false,
|
|
317
|
+
pairAcrossChr: false,
|
|
318
|
+
maxInsertSize: 200000,
|
|
319
|
+
}; }
|
|
320
|
+
return __asyncGenerator(this, arguments, function streamRecordsForRange_1() {
|
|
321
|
+
var chrId, chunks, i, size, totalSize;
|
|
322
|
+
return __generator(this, function (_a) {
|
|
323
|
+
switch (_a.label) {
|
|
324
|
+
case 0:
|
|
325
|
+
// todo regularize refseq names
|
|
326
|
+
opts.viewAsPairs = opts.viewAsPairs || false;
|
|
327
|
+
opts.pairAcrossChr = opts.pairAcrossChr || false;
|
|
328
|
+
opts.maxInsertSize =
|
|
329
|
+
opts.maxInsertSize !== undefined ? opts.maxInsertSize : 200000;
|
|
330
|
+
chrId = this.chrToIndex && this.chrToIndex[chr];
|
|
331
|
+
if (!!(chrId >= 0)) return [3 /*break*/, 1];
|
|
332
|
+
chunks = [];
|
|
333
|
+
return [3 /*break*/, 3];
|
|
334
|
+
case 1: return [4 /*yield*/, __await(this.index.blocksForRange(chrId, min - 1, max, opts))];
|
|
335
|
+
case 2:
|
|
336
|
+
chunks = _a.sent();
|
|
337
|
+
if (!chunks) {
|
|
338
|
+
throw new Error('Error in index fetch');
|
|
820
339
|
}
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
return _promise.default.all((0, _map.default)(featPromises).call(featPromises, /*#__PURE__*/function () {
|
|
834
|
-
var _ref5 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(f) {
|
|
835
|
-
var ret, i, name;
|
|
836
|
-
return _regenerator.default.wrap(function _callee8$(_context13) {
|
|
837
|
-
while (1) {
|
|
838
|
-
switch (_context13.prev = _context13.next) {
|
|
839
|
-
case 0:
|
|
840
|
-
_context13.next = 2;
|
|
841
|
-
return f;
|
|
842
|
-
|
|
843
|
-
case 2:
|
|
844
|
-
ret = _context13.sent;
|
|
845
|
-
|
|
846
|
-
for (i = 0; i < ret.length; i++) {
|
|
847
|
-
name = ret[i].name();
|
|
848
|
-
|
|
849
|
-
if (unmatedPairs[name] && (opts.pairAcrossChr || ret[i]._next_refid() === chrId && Math.abs(ret[i].get('start') - ret[i]._next_pos()) < (opts.maxInsertSize || 200000))) {
|
|
850
|
-
matePromises.push(_this3.index.blocksForRange(ret[i]._next_refid(), ret[i]._next_pos(), ret[i]._next_pos() + 1, opts));
|
|
851
|
-
}
|
|
852
|
-
}
|
|
853
|
-
|
|
854
|
-
case 4:
|
|
855
|
-
case "end":
|
|
856
|
-
return _context13.stop();
|
|
340
|
+
_a.label = 3;
|
|
341
|
+
case 3:
|
|
342
|
+
i = 0;
|
|
343
|
+
_a.label = 4;
|
|
344
|
+
case 4:
|
|
345
|
+
if (!(i < chunks.length)) return [3 /*break*/, 7];
|
|
346
|
+
return [4 /*yield*/, __await((0, util_1.abortBreakPoint)(opts.signal))];
|
|
347
|
+
case 5:
|
|
348
|
+
_a.sent();
|
|
349
|
+
size = chunks[i].fetchedSize();
|
|
350
|
+
if (size > this.chunkSizeLimit) {
|
|
351
|
+
throw new Error("Too many BAM features. BAM chunk size ".concat(size, " bytes exceeds chunkSizeLimit of ").concat(this.chunkSizeLimit));
|
|
857
352
|
}
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
for (i = 0; i < mateBlocks.length; i++) {
|
|
876
|
-
mateChunks = (0, _concat.default)(mateChunks).call(mateChunks, mateBlocks[i]);
|
|
877
|
-
} // filter out duplicate chunks (the blocks are lists of chunks, blocks are concatenated, then filter dup chunks)
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
mateChunks = (0, _filter.default)(_context14 = (0, _sort.default)(mateChunks).call(mateChunks)).call(_context14, function (item, pos, ary) {
|
|
881
|
-
return !pos || item.toString() !== ary[pos - 1].toString();
|
|
882
|
-
});
|
|
883
|
-
mateTotalSize = (0, _reduce.default)(_context15 = (0, _map.default)(mateChunks).call(mateChunks, function (s) {
|
|
884
|
-
return s.fetchedSize();
|
|
885
|
-
})).call(_context15, function (a, b) {
|
|
886
|
-
return a + b;
|
|
887
|
-
}, 0);
|
|
888
|
-
|
|
889
|
-
if (!(mateTotalSize > this.fetchSizeLimit)) {
|
|
890
|
-
_context18.next = 16;
|
|
891
|
-
break;
|
|
353
|
+
_a.label = 6;
|
|
354
|
+
case 6:
|
|
355
|
+
i += 1;
|
|
356
|
+
return [3 /*break*/, 4];
|
|
357
|
+
case 7:
|
|
358
|
+
totalSize = chunks
|
|
359
|
+
.map(function (s) { return s.fetchedSize(); })
|
|
360
|
+
.reduce(function (a, b) { return a + b; }, 0);
|
|
361
|
+
if (totalSize > this.fetchSizeLimit) {
|
|
362
|
+
throw new Error("data size of ".concat(totalSize.toLocaleString(), " bytes exceeded fetch size limit of ").concat(this.fetchSizeLimit.toLocaleString(), " bytes"));
|
|
363
|
+
}
|
|
364
|
+
return [5 /*yield**/, __values(__asyncDelegator(__asyncValues(this._fetchChunkFeatures(chunks, chrId, min, max, opts))))];
|
|
365
|
+
case 8: return [4 /*yield*/, __await.apply(void 0, [_a.sent()])];
|
|
366
|
+
case 9:
|
|
367
|
+
_a.sent();
|
|
368
|
+
return [2 /*return*/];
|
|
892
369
|
}
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
}
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
};
|
|
373
|
+
BamFile.prototype._fetchChunkFeatures = function (chunks, chrId, min, max, opts) {
|
|
374
|
+
return __asyncGenerator(this, arguments, function _fetchChunkFeatures_1() {
|
|
375
|
+
var featPromises, done, i, _a, data, cpositions, dpositions, chunk, promise, i;
|
|
376
|
+
return __generator(this, function (_b) {
|
|
377
|
+
switch (_b.label) {
|
|
378
|
+
case 0:
|
|
379
|
+
featPromises = [];
|
|
380
|
+
done = false;
|
|
381
|
+
i = 0;
|
|
382
|
+
_b.label = 1;
|
|
383
|
+
case 1:
|
|
384
|
+
if (!(i < chunks.length)) return [3 /*break*/, 5];
|
|
385
|
+
return [4 /*yield*/, __await(this._readChunk({
|
|
386
|
+
chunk: chunks[i],
|
|
387
|
+
opts: opts,
|
|
388
|
+
}))];
|
|
389
|
+
case 2:
|
|
390
|
+
_a = _b.sent(), data = _a.data, cpositions = _a.cpositions, dpositions = _a.dpositions, chunk = _a.chunk;
|
|
391
|
+
promise = this.readBamFeatures(data, cpositions, dpositions, chunk).then(function (records) {
|
|
392
|
+
var recs = [];
|
|
393
|
+
for (var i_1 = 0; i_1 < records.length; i_1 += 1) {
|
|
394
|
+
var feature = records[i_1];
|
|
395
|
+
if (feature.seq_id() === chrId) {
|
|
396
|
+
if (feature.get('start') >= max) {
|
|
397
|
+
// past end of range, can stop iterating
|
|
398
|
+
done = true;
|
|
399
|
+
break;
|
|
400
|
+
}
|
|
401
|
+
else if (feature.get('end') >= min) {
|
|
402
|
+
// must be in range
|
|
403
|
+
recs.push(feature);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
930
406
|
}
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
407
|
+
return recs;
|
|
408
|
+
});
|
|
409
|
+
featPromises.push(promise);
|
|
410
|
+
return [4 /*yield*/, __await(promise)];
|
|
411
|
+
case 3:
|
|
412
|
+
_b.sent();
|
|
413
|
+
if (done) {
|
|
414
|
+
return [3 /*break*/, 5];
|
|
937
415
|
}
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
}
|
|
966
|
-
}
|
|
967
|
-
}, _callee10, this);
|
|
968
|
-
}));
|
|
969
|
-
|
|
970
|
-
function fetchPairs(_x6, _x7, _x8) {
|
|
971
|
-
return _fetchPairs.apply(this, arguments);
|
|
972
|
-
}
|
|
973
|
-
|
|
974
|
-
return fetchPairs;
|
|
975
|
-
}()
|
|
976
|
-
}, {
|
|
977
|
-
key: "_readChunk",
|
|
978
|
-
value: function () {
|
|
979
|
-
var _readChunk2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee11(_ref7, abortSignal) {
|
|
980
|
-
var chunk, opts, c, bufsize, res, bytesRead, buffer, _yield$unzipChunkSlic, data, cpositions, dpositions;
|
|
981
|
-
|
|
982
|
-
return _regenerator.default.wrap(function _callee11$(_context19) {
|
|
983
|
-
while (1) {
|
|
984
|
-
switch (_context19.prev = _context19.next) {
|
|
985
|
-
case 0:
|
|
986
|
-
chunk = _ref7.chunk, opts = _ref7.opts;
|
|
987
|
-
c = chunk;
|
|
988
|
-
bufsize = c.fetchedSize();
|
|
989
|
-
_context19.next = 5;
|
|
990
|
-
return this.bam.read(Buffer.alloc(bufsize), 0, bufsize, c.minv.blockPosition, opts);
|
|
991
|
-
|
|
992
|
-
case 5:
|
|
993
|
-
res = _context19.sent;
|
|
994
|
-
bytesRead = res.bytesRead;
|
|
995
|
-
buffer = res.buffer;
|
|
996
|
-
(0, _util.checkAbortSignal)(abortSignal);
|
|
997
|
-
|
|
998
|
-
if (bytesRead) {
|
|
999
|
-
_context19.next = 11;
|
|
1000
|
-
break;
|
|
416
|
+
_b.label = 4;
|
|
417
|
+
case 4:
|
|
418
|
+
i++;
|
|
419
|
+
return [3 /*break*/, 1];
|
|
420
|
+
case 5:
|
|
421
|
+
(0, util_1.checkAbortSignal)(opts.signal);
|
|
422
|
+
i = 0;
|
|
423
|
+
_b.label = 6;
|
|
424
|
+
case 6:
|
|
425
|
+
if (!(i < featPromises.length)) return [3 /*break*/, 10];
|
|
426
|
+
return [4 /*yield*/, __await(featPromises[i])];
|
|
427
|
+
case 7: return [4 /*yield*/, _b.sent()];
|
|
428
|
+
case 8:
|
|
429
|
+
_b.sent();
|
|
430
|
+
_b.label = 9;
|
|
431
|
+
case 9:
|
|
432
|
+
i++;
|
|
433
|
+
return [3 /*break*/, 6];
|
|
434
|
+
case 10:
|
|
435
|
+
(0, util_1.checkAbortSignal)(opts.signal);
|
|
436
|
+
if (!opts.viewAsPairs) return [3 /*break*/, 13];
|
|
437
|
+
return [4 /*yield*/, __await(this.fetchPairs(chrId, featPromises, opts))];
|
|
438
|
+
case 11: return [4 /*yield*/, _b.sent()];
|
|
439
|
+
case 12:
|
|
440
|
+
_b.sent();
|
|
441
|
+
_b.label = 13;
|
|
442
|
+
case 13: return [2 /*return*/];
|
|
1001
443
|
}
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
444
|
+
});
|
|
445
|
+
});
|
|
446
|
+
};
|
|
447
|
+
BamFile.prototype.fetchPairs = function (chrId, featPromises, opts) {
|
|
448
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
449
|
+
var unmatedPairs, readIds, matePromises, mateBlocks, mateChunks, i, mateTotalSize, mateFeatPromises, newMateFeats, featuresRet, newMates;
|
|
450
|
+
var _this = this;
|
|
451
|
+
return __generator(this, function (_a) {
|
|
452
|
+
switch (_a.label) {
|
|
453
|
+
case 0:
|
|
454
|
+
unmatedPairs = {};
|
|
455
|
+
readIds = {};
|
|
456
|
+
return [4 /*yield*/, Promise.all(featPromises.map(function (f) { return __awaiter(_this, void 0, void 0, function () {
|
|
457
|
+
var ret, readNames, i, name_1, id;
|
|
458
|
+
return __generator(this, function (_a) {
|
|
459
|
+
switch (_a.label) {
|
|
460
|
+
case 0: return [4 /*yield*/, f];
|
|
461
|
+
case 1:
|
|
462
|
+
ret = _a.sent();
|
|
463
|
+
readNames = {};
|
|
464
|
+
for (i = 0; i < ret.length; i++) {
|
|
465
|
+
name_1 = ret[i].name();
|
|
466
|
+
id = ret[i].id();
|
|
467
|
+
if (!readNames[name_1]) {
|
|
468
|
+
readNames[name_1] = 0;
|
|
469
|
+
}
|
|
470
|
+
readNames[name_1]++;
|
|
471
|
+
readIds[id] = 1;
|
|
472
|
+
}
|
|
473
|
+
(0, object_entries_ponyfill_1.default)(readNames).forEach(function (_a) {
|
|
474
|
+
var k = _a[0], v = _a[1];
|
|
475
|
+
if (v === 1) {
|
|
476
|
+
unmatedPairs[k] = true;
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
return [2 /*return*/];
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
}); }))];
|
|
483
|
+
case 1:
|
|
484
|
+
_a.sent();
|
|
485
|
+
matePromises = [];
|
|
486
|
+
return [4 /*yield*/, Promise.all(featPromises.map(function (f) { return __awaiter(_this, void 0, void 0, function () {
|
|
487
|
+
var ret, i, name_2;
|
|
488
|
+
return __generator(this, function (_a) {
|
|
489
|
+
switch (_a.label) {
|
|
490
|
+
case 0: return [4 /*yield*/, f];
|
|
491
|
+
case 1:
|
|
492
|
+
ret = _a.sent();
|
|
493
|
+
for (i = 0; i < ret.length; i++) {
|
|
494
|
+
name_2 = ret[i].name();
|
|
495
|
+
if (unmatedPairs[name_2] &&
|
|
496
|
+
(opts.pairAcrossChr ||
|
|
497
|
+
(ret[i]._next_refid() === chrId &&
|
|
498
|
+
Math.abs(ret[i].get('start') - ret[i]._next_pos()) <
|
|
499
|
+
(opts.maxInsertSize || 200000)))) {
|
|
500
|
+
matePromises.push(this.index.blocksForRange(ret[i]._next_refid(), ret[i]._next_pos(), ret[i]._next_pos() + 1, opts));
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
return [2 /*return*/];
|
|
504
|
+
}
|
|
505
|
+
});
|
|
506
|
+
}); }))];
|
|
507
|
+
case 2:
|
|
508
|
+
_a.sent();
|
|
509
|
+
return [4 /*yield*/, Promise.all(matePromises)];
|
|
510
|
+
case 3:
|
|
511
|
+
mateBlocks = _a.sent();
|
|
512
|
+
mateChunks = [];
|
|
513
|
+
for (i = 0; i < mateBlocks.length; i++) {
|
|
514
|
+
mateChunks = mateChunks.concat(mateBlocks[i]);
|
|
515
|
+
}
|
|
516
|
+
// filter out duplicate chunks (the blocks are lists of chunks, blocks are concatenated, then filter dup chunks)
|
|
517
|
+
mateChunks = mateChunks
|
|
518
|
+
.sort()
|
|
519
|
+
.filter(function (item, pos, ary) { return !pos || item.toString() !== ary[pos - 1].toString(); });
|
|
520
|
+
mateTotalSize = mateChunks
|
|
521
|
+
.map(function (s) { return s.fetchedSize(); })
|
|
522
|
+
.reduce(function (a, b) { return a + b; }, 0);
|
|
523
|
+
if (mateTotalSize > this.fetchSizeLimit) {
|
|
524
|
+
throw new Error("data size of ".concat(mateTotalSize.toLocaleString(), " bytes exceeded fetch size limit of ").concat(this.fetchSizeLimit.toLocaleString(), " bytes"));
|
|
525
|
+
}
|
|
526
|
+
mateFeatPromises = mateChunks.map(function (c) { return __awaiter(_this, void 0, void 0, function () {
|
|
527
|
+
var _a, data, cpositions, dpositions, chunk, feats, mateRecs, i, feature;
|
|
528
|
+
return __generator(this, function (_b) {
|
|
529
|
+
switch (_b.label) {
|
|
530
|
+
case 0: return [4 /*yield*/, this._readChunk({
|
|
531
|
+
chunk: c,
|
|
532
|
+
opts: opts,
|
|
533
|
+
})];
|
|
534
|
+
case 1:
|
|
535
|
+
_a = _b.sent(), data = _a.data, cpositions = _a.cpositions, dpositions = _a.dpositions, chunk = _a.chunk;
|
|
536
|
+
return [4 /*yield*/, this.readBamFeatures(data, cpositions, dpositions, chunk)];
|
|
537
|
+
case 2:
|
|
538
|
+
feats = _b.sent();
|
|
539
|
+
mateRecs = [];
|
|
540
|
+
for (i = 0; i < feats.length; i += 1) {
|
|
541
|
+
feature = feats[i];
|
|
542
|
+
if (unmatedPairs[feature.get('name')] && !readIds[feature.id()]) {
|
|
543
|
+
mateRecs.push(feature);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
return [2 /*return*/, mateRecs];
|
|
547
|
+
}
|
|
548
|
+
});
|
|
549
|
+
}); });
|
|
550
|
+
return [4 /*yield*/, Promise.all(mateFeatPromises)];
|
|
551
|
+
case 4:
|
|
552
|
+
newMateFeats = _a.sent();
|
|
553
|
+
featuresRet = [];
|
|
554
|
+
if (newMateFeats.length) {
|
|
555
|
+
newMates = newMateFeats.reduce(function (result, current) {
|
|
556
|
+
return result.concat(current);
|
|
557
|
+
});
|
|
558
|
+
featuresRet = featuresRet.concat(newMates);
|
|
559
|
+
}
|
|
560
|
+
return [2 /*return*/, featuresRet];
|
|
1060
561
|
}
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
562
|
+
});
|
|
563
|
+
});
|
|
564
|
+
};
|
|
565
|
+
BamFile.prototype._readChunk = function (_a) {
|
|
566
|
+
var chunk = _a.chunk, opts = _a.opts;
|
|
567
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
568
|
+
var signal, bufsize, res, bytesRead, buffer, _b, data, cpositions, dpositions;
|
|
569
|
+
return __generator(this, function (_c) {
|
|
570
|
+
switch (_c.label) {
|
|
571
|
+
case 0:
|
|
572
|
+
signal = opts.signal;
|
|
573
|
+
bufsize = chunk.fetchedSize();
|
|
574
|
+
return [4 /*yield*/, this.bam.read(Buffer.alloc(bufsize), 0, bufsize, chunk.minv.blockPosition, opts)];
|
|
575
|
+
case 1:
|
|
576
|
+
res = _c.sent();
|
|
577
|
+
bytesRead = res.bytesRead;
|
|
578
|
+
buffer = res.buffer;
|
|
579
|
+
(0, util_1.checkAbortSignal)(signal);
|
|
580
|
+
if (bytesRead < bufsize) {
|
|
581
|
+
buffer = buffer.slice(0, bytesRead);
|
|
582
|
+
}
|
|
583
|
+
else {
|
|
584
|
+
buffer = buffer.slice(0, bufsize);
|
|
585
|
+
}
|
|
586
|
+
return [4 /*yield*/, (0, bgzf_filehandle_1.unzipChunkSlice)(buffer, chunk)];
|
|
587
|
+
case 2:
|
|
588
|
+
_b = _c.sent(), data = _b.buffer, cpositions = _b.cpositions, dpositions = _b.dpositions;
|
|
589
|
+
(0, util_1.checkAbortSignal)(signal);
|
|
590
|
+
return [2 /*return*/, { data: data, cpositions: cpositions, dpositions: dpositions, chunk: chunk }];
|
|
1075
591
|
}
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
592
|
+
});
|
|
593
|
+
});
|
|
594
|
+
};
|
|
595
|
+
BamFile.prototype.readBamFeatures = function (ba, cpositions, dpositions, chunk) {
|
|
596
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
597
|
+
var blockStart, sink, pos, last, blockSize, blockEnd, feature;
|
|
598
|
+
return __generator(this, function (_a) {
|
|
599
|
+
switch (_a.label) {
|
|
600
|
+
case 0:
|
|
601
|
+
blockStart = 0;
|
|
602
|
+
sink = [];
|
|
603
|
+
pos = 0;
|
|
604
|
+
last = +Date.now();
|
|
605
|
+
_a.label = 1;
|
|
606
|
+
case 1:
|
|
607
|
+
if (!(blockStart + 4 < ba.length)) return [3 /*break*/, 4];
|
|
608
|
+
blockSize = ba.readInt32LE(blockStart);
|
|
609
|
+
blockEnd = blockStart + 4 + blockSize - 1;
|
|
610
|
+
// increment position to the current decompressed status
|
|
611
|
+
if (dpositions) {
|
|
612
|
+
while (blockStart + chunk.minv.dataPosition >= dpositions[pos++]) { }
|
|
613
|
+
pos--;
|
|
614
|
+
}
|
|
615
|
+
if (!(blockEnd < ba.length)) return [3 /*break*/, 3];
|
|
616
|
+
feature = new record_1.default({
|
|
617
|
+
bytes: {
|
|
618
|
+
byteArray: ba,
|
|
619
|
+
start: blockStart,
|
|
620
|
+
end: blockEnd,
|
|
621
|
+
},
|
|
622
|
+
// the below results in an automatically calculated file-offset based ID
|
|
623
|
+
// if the info for that is available, otherwise crc32 of the features
|
|
624
|
+
//
|
|
625
|
+
// cpositions[pos] refers to actual file offset of a bgzip block boundaries
|
|
626
|
+
//
|
|
627
|
+
// we multiply by (1 <<8) in order to make sure each block has a "unique"
|
|
628
|
+
// address space so that data in that block could never overlap
|
|
629
|
+
//
|
|
630
|
+
// then the blockStart-dpositions is an uncompressed file offset from
|
|
631
|
+
// that bgzip block boundary, and since the cpositions are multiplied by
|
|
632
|
+
// (1 << 8) these uncompressed offsets get a unique space
|
|
633
|
+
//
|
|
634
|
+
// this has an extra chunk.minv.dataPosition added on because it blockStart
|
|
635
|
+
// starts at 0 instead of chunk.minv.dataPosition
|
|
636
|
+
//
|
|
637
|
+
// the +1 is just to avoid any possible uniqueId 0 but this does not realistically happen
|
|
638
|
+
fileOffset: cpositions
|
|
639
|
+
? cpositions[pos] * (1 << 8) +
|
|
640
|
+
(blockStart - dpositions[pos]) +
|
|
641
|
+
chunk.minv.dataPosition +
|
|
642
|
+
1
|
|
643
|
+
: buffer_crc32_1.default.signed(ba.slice(blockStart, blockEnd)),
|
|
644
|
+
});
|
|
645
|
+
sink.push(feature);
|
|
646
|
+
if (!(this.yieldThreadTime && +Date.now() - last > this.yieldThreadTime)) return [3 /*break*/, 3];
|
|
647
|
+
return [4 /*yield*/, (0, util_1.timeout)(1)];
|
|
648
|
+
case 2:
|
|
649
|
+
_a.sent();
|
|
650
|
+
last = +Date.now();
|
|
651
|
+
_a.label = 3;
|
|
652
|
+
case 3:
|
|
653
|
+
blockStart = blockEnd + 1;
|
|
654
|
+
return [3 /*break*/, 1];
|
|
655
|
+
case 4: return [2 /*return*/, sink];
|
|
1106
656
|
}
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
case 15:
|
|
1115
|
-
blockStart = blockEnd + 1;
|
|
1116
|
-
_context20.next = 4;
|
|
1117
|
-
break;
|
|
1118
|
-
|
|
1119
|
-
case 18:
|
|
1120
|
-
return _context20.abrupt("return", sink);
|
|
1121
|
-
|
|
1122
|
-
case 19:
|
|
1123
|
-
case "end":
|
|
1124
|
-
return _context20.stop();
|
|
1125
|
-
}
|
|
1126
|
-
}
|
|
1127
|
-
}, _callee12, this);
|
|
1128
|
-
}));
|
|
1129
|
-
|
|
1130
|
-
function readBamFeatures(_x14, _x15, _x16, _x17) {
|
|
1131
|
-
return _readBamFeatures.apply(this, arguments);
|
|
1132
|
-
}
|
|
1133
|
-
|
|
1134
|
-
return readBamFeatures;
|
|
1135
|
-
}()
|
|
1136
|
-
}, {
|
|
1137
|
-
key: "hasRefSeq",
|
|
1138
|
-
value: function () {
|
|
1139
|
-
var _hasRefSeq = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee13(seqName) {
|
|
1140
|
-
var refId;
|
|
1141
|
-
return _regenerator.default.wrap(function _callee13$(_context21) {
|
|
1142
|
-
while (1) {
|
|
1143
|
-
switch (_context21.prev = _context21.next) {
|
|
1144
|
-
case 0:
|
|
657
|
+
});
|
|
658
|
+
});
|
|
659
|
+
};
|
|
660
|
+
BamFile.prototype.hasRefSeq = function (seqName) {
|
|
661
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
662
|
+
var refId;
|
|
663
|
+
return __generator(this, function (_a) {
|
|
1145
664
|
refId = this.chrToIndex && this.chrToIndex[seqName];
|
|
1146
|
-
return
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
}));
|
|
1155
|
-
|
|
1156
|
-
function hasRefSeq(_x18) {
|
|
1157
|
-
return _hasRefSeq.apply(this, arguments);
|
|
1158
|
-
}
|
|
1159
|
-
|
|
1160
|
-
return hasRefSeq;
|
|
1161
|
-
}()
|
|
1162
|
-
}, {
|
|
1163
|
-
key: "lineCount",
|
|
1164
|
-
value: function () {
|
|
1165
|
-
var _lineCount = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee14(seqName) {
|
|
1166
|
-
var refId;
|
|
1167
|
-
return _regenerator.default.wrap(function _callee14$(_context22) {
|
|
1168
|
-
while (1) {
|
|
1169
|
-
switch (_context22.prev = _context22.next) {
|
|
1170
|
-
case 0:
|
|
665
|
+
return [2 /*return*/, this.index.hasRefSeq(refId)];
|
|
666
|
+
});
|
|
667
|
+
});
|
|
668
|
+
};
|
|
669
|
+
BamFile.prototype.lineCount = function (seqName) {
|
|
670
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
671
|
+
var refId;
|
|
672
|
+
return __generator(this, function (_a) {
|
|
1171
673
|
refId = this.chrToIndex && this.chrToIndex[seqName];
|
|
1172
|
-
return
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
var seqId;
|
|
1193
|
-
return _regenerator.default.wrap(function _callee15$(_context23) {
|
|
1194
|
-
while (1) {
|
|
1195
|
-
switch (_context23.prev = _context23.next) {
|
|
1196
|
-
case 0:
|
|
1197
|
-
_context23.next = 2;
|
|
1198
|
-
return this.index.parse();
|
|
1199
|
-
|
|
1200
|
-
case 2:
|
|
1201
|
-
seqId = this.chrToIndex && this.chrToIndex[seqName];
|
|
1202
|
-
return _context23.abrupt("return", this.index.indexCov(seqId, start, end));
|
|
1203
|
-
|
|
1204
|
-
case 4:
|
|
1205
|
-
case "end":
|
|
1206
|
-
return _context23.stop();
|
|
1207
|
-
}
|
|
1208
|
-
}
|
|
1209
|
-
}, _callee15, this);
|
|
1210
|
-
}));
|
|
1211
|
-
|
|
1212
|
-
function indexCov(_x20, _x21, _x22) {
|
|
1213
|
-
return _indexCov.apply(this, arguments);
|
|
1214
|
-
}
|
|
1215
|
-
|
|
1216
|
-
return indexCov;
|
|
1217
|
-
}()
|
|
1218
|
-
}]);
|
|
1219
|
-
return BamFile;
|
|
1220
|
-
}();
|
|
1221
|
-
|
|
674
|
+
return [2 /*return*/, this.index.lineCount(refId)];
|
|
675
|
+
});
|
|
676
|
+
});
|
|
677
|
+
};
|
|
678
|
+
BamFile.prototype.indexCov = function (seqName, start, end) {
|
|
679
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
680
|
+
var seqId;
|
|
681
|
+
return __generator(this, function (_a) {
|
|
682
|
+
switch (_a.label) {
|
|
683
|
+
case 0: return [4 /*yield*/, this.index.parse()];
|
|
684
|
+
case 1:
|
|
685
|
+
_a.sent();
|
|
686
|
+
seqId = this.chrToIndex && this.chrToIndex[seqName];
|
|
687
|
+
return [2 /*return*/, this.index.indexCov(seqId, start, end)];
|
|
688
|
+
}
|
|
689
|
+
});
|
|
690
|
+
});
|
|
691
|
+
};
|
|
692
|
+
return BamFile;
|
|
693
|
+
}());
|
|
1222
694
|
exports.default = BamFile;
|
|
1223
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYW1GaWxlLnRzIl0sIm5hbWVzIjpbIkJBTV9NQUdJQyIsImJsb2NrTGVuIiwiQmFtRmlsZSIsImJhbUZpbGVoYW5kbGUiLCJiYW1QYXRoIiwiYmFtVXJsIiwiYmFpUGF0aCIsImJhaUZpbGVoYW5kbGUiLCJiYWlVcmwiLCJjc2lQYXRoIiwiY3NpRmlsZWhhbmRsZSIsImNzaVVybCIsImNhY2hlU2l6ZSIsImZldGNoU2l6ZUxpbWl0IiwiY2h1bmtTaXplTGltaXQiLCJ5aWVsZFRocmVhZFRpbWUiLCJyZW5hbWVSZWZTZXFzIiwibiIsInJlbmFtZVJlZlNlcSIsImJhbSIsIkxvY2FsRmlsZSIsIlJlbW90ZUZpbGUiLCJFcnJvciIsImluZGV4IiwiQ1NJIiwiZmlsZWhhbmRsZSIsIkJBSSIsImZlYXR1cmVDYWNoZSIsIkFib3J0YWJsZVByb21pc2VDYWNoZSIsImNhY2hlIiwiTFJVIiwibWF4U2l6ZSIsInVuZGVmaW5lZCIsImZpbGwiLCJfcmVhZENodW5rIiwib3JpZ09wdHMiLCJvcHRzIiwicGFyc2UiLCJpbmRleERhdGEiLCJyZXQiLCJmaXJzdERhdGFMaW5lIiwiYmxvY2tQb3NpdGlvbiIsInJlYWQiLCJCdWZmZXIiLCJhbGxvYyIsInJlcyIsImJ5dGVzUmVhZCIsImJ1ZmZlciIsInJlYWRGaWxlIiwidW5jYmEiLCJyZWFkSW50MzJMRSIsImhlYWRMZW4iLCJoZWFkZXIiLCJ0b1N0cmluZyIsIl9yZWFkUmVmU2VxcyIsImNoclRvSW5kZXgiLCJpbmRleFRvQ2hyIiwiZ2V0SGVhZGVyIiwic3RhcnQiLCJyZWZTZXFCeXRlcyIsIm5SZWYiLCJwIiwiaSIsInNpZ25hbCIsImxOYW1lIiwicmVmTmFtZSIsImxSZWYiLCJwdXNoIiwibGVuZ3RoIiwiY29uc29sZSIsIndhcm4iLCJjaHIiLCJtaW4iLCJtYXgiLCJ2aWV3QXNQYWlycyIsInBhaXJBY3Jvc3NDaHIiLCJtYXhJbnNlcnRTaXplIiwicmVjb3JkcyIsInN0cmVhbVJlY29yZHNGb3JSYW5nZSIsImNodW5rIiwiY2hySWQiLCJjaHVua3MiLCJibG9ja3NGb3JSYW5nZSIsInNpemUiLCJmZXRjaGVkU2l6ZSIsInRvdGFsU2l6ZSIsInMiLCJhIiwiYiIsInRvTG9jYWxlU3RyaW5nIiwiX2ZldGNoQ2h1bmtGZWF0dXJlcyIsImZlYXRQcm9taXNlcyIsImRvbmUiLCJjIiwiZ2V0IiwiZGF0YSIsImNwb3NpdGlvbnMiLCJkcG9zaXRpb25zIiwicHJvbWlzZSIsInJlYWRCYW1GZWF0dXJlcyIsInRoZW4iLCJyZWNzIiwiZmVhdHVyZSIsInNlcV9pZCIsImZldGNoUGFpcnMiLCJ1bm1hdGVkUGFpcnMiLCJyZWFkSWRzIiwiYWxsIiwiZiIsInJlYWROYW1lcyIsIm5hbWUiLCJpZCIsImsiLCJ2IiwibWF0ZVByb21pc2VzIiwiX25leHRfcmVmaWQiLCJNYXRoIiwiYWJzIiwiX25leHRfcG9zIiwibWF0ZUJsb2NrcyIsIm1hdGVDaHVua3MiLCJpdGVtIiwicG9zIiwiYXJ5IiwibWF0ZVRvdGFsU2l6ZSIsIm1hdGVGZWF0UHJvbWlzZXMiLCJmZWF0cyIsIm1hdGVSZWNzIiwibmV3TWF0ZUZlYXRzIiwiZmVhdHVyZXNSZXQiLCJuZXdNYXRlcyIsInJlc3VsdCIsImN1cnJlbnQiLCJhYm9ydFNpZ25hbCIsImJ1ZnNpemUiLCJtaW52IiwiYmEiLCJibG9ja1N0YXJ0Iiwic2luayIsImxhc3QiLCJibG9ja1NpemUiLCJibG9ja0VuZCIsImRhdGFQb3NpdGlvbiIsIkJBTUZlYXR1cmUiLCJieXRlcyIsImJ5dGVBcnJheSIsImVuZCIsImZpbGVPZmZzZXQiLCJjcmMzMiIsInNpZ25lZCIsInNlcU5hbWUiLCJyZWZJZCIsImhhc1JlZlNlcSIsImxpbmVDb3VudCIsInNlcUlkIiwiaW5kZXhDb3YiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFF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cm9taXNlLWNhY2hlJ1xuaW1wb3J0IEJBSSBmcm9tICcuL2JhaSdcbmltcG9ydCBDU0kgZnJvbSAnLi9jc2knXG5pbXBvcnQgQ2h1bmsgZnJvbSAnLi9jaHVuaydcbmltcG9ydCBjcmMzMiBmcm9tICdidWZmZXItY3JjMzInXG5cbmltcG9ydCB7IHVuemlwLCB1bnppcENodW5rU2xpY2UgfSBmcm9tICdAZ21vZC9iZ3pmLWZpbGVoYW5kbGUnXG5cbmltcG9ydCBlbnRyaWVzIGZyb20gJ29iamVjdC5lbnRyaWVzLXBvbnlmaWxsJ1xuaW1wb3J0IExSVSBmcm9tICdxdWljay1scnUnXG5pbXBvcnQgeyBMb2NhbEZpbGUsIFJlbW90ZUZpbGUsIEdlbmVyaWNGaWxlaGFuZGxlIH0gZnJvbSAnZ2VuZXJpYy1maWxlaGFuZGxlJ1xuaW1wb3J0IEJBTUZlYXR1cmUgZnJvbSAnLi9yZWNvcmQnXG5pbXBvcnQgSW5kZXhGaWxlIGZyb20gJy4vaW5kZXhGaWxlJ1xuaW1wb3J0IHsgcGFyc2VIZWFkZXJUZXh0IH0gZnJvbSAnLi9zYW0nXG5pbXBvcnQgeyBhYm9ydEJyZWFrUG9pbnQsIGNoZWNrQWJvcnRTaWduYWwsIHRpbWVvdXQsIG1ha2VPcHRzLCBCYW1PcHRzLCBCYXNlT3B0cyB9IGZyb20gJy4vdXRpbCdcblxuZXhwb3J0IGNvbnN0IEJBTV9NQUdJQyA9IDIxODQwMTk0XG5cbmNvbnN0IGJsb2NrTGVuID0gMSA8PCAxNlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYW1GaWxlIHtcbiAgcHJpdmF0ZSByZW5hbWVSZWZTZXE6IChhOiBzdHJpbmcpID0+IHN0cmluZ1xuICBwcml2YXRlIGJhbTogR2VuZXJpY0ZpbGVoYW5kbGVcbiAgcHJpdmF0ZSBpbmRleDogSW5kZXhGaWxlXG4gIHByaXZhdGUgY2h1bmtTaXplTGltaXQ6IG51bWJlclxuICBwcml2YXRlIGZldGNoU2l6ZUxpbWl0OiBudW1iZXJcbiAgcHJpdmF0ZSBoZWFkZXI6IGFueVxuICBwcm90ZWN0ZWQgZmVhdHVyZUNhY2hlOiBhbnlcbiAgcHJvdGVjdGVkIGNoclRvSW5kZXg6IGFueVxuICBwcm90ZWN0ZWQgaW5kZXhUb0NocjogYW55XG4gIHByaXZhdGUgeWllbGRUaHJlYWRUaW1lOiBudW1iZXJcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmJhbVBhdGhdXG4gICAqIEBwYXJhbSB7RmlsZUhhbmRsZX0gW2FyZ3MuYmFtRmlsZWhhbmRsZV1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmJhaVBhdGhdXG4gICAqIEBwYXJhbSB7RmlsZUhhbmRsZX0gW2FyZ3MuYmFpRmlsZWhhbmRsZV1cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBiYW1GaWxlaGFuZGxlLFxuICAgIGJhbVBhdGgsXG4gICAgYmFtVXJsLFxuICAgIGJhaVBhdGgsXG4gICAgYmFpRmlsZWhhbmRsZSxcbiAgICBiYWlVcmwsXG4gICAgY3NpUGF0aCxcbiAgICBjc2lGaWxlaGFuZGxlLFxuICAgIGNzaVVybCxcbiAgICBjYWNoZVNpemUsXG4gICAgZmV0Y2hTaXplTGltaXQsXG4gICAgY2h1bmtTaXplTGltaXQsXG4gICAgeWllbGRUaHJlYWRUaW1lID0gMTAwLFxuICAgIHJlbmFtZVJlZlNlcXMgPSBuID0+IG4sXG4gIH06IHtcbiAgICBiYW1GaWxlaGFuZGxlPzogR2VuZXJpY0ZpbGVoYW5kbGVcbiAgICBiYW1QYXRoPzogc3RyaW5nXG4gICAgYmFtVXJsPzogc3RyaW5nXG4gICAgYmFpUGF0aD86IHN0cmluZ1xuICAgIGJhaUZpbGVoYW5kbGU/OiBHZW5lcmljRmlsZWhhbmRsZVxuICAgIGJhaVVybD86IHN0cmluZ1xuICAgIGNzaVBhdGg/OiBzdHJpbmdcbiAgICBjc2lGaWxlaGFuZGxlPzogR2VuZXJpY0ZpbGVoYW5kbGVcbiAgICBjc2lVcmw/OiBzdHJpbmdcbiAgICBjYWNoZVNpemU/OiBudW1iZXJcbiAgICBmZXRjaFNpemVMaW1pdD86IG51bWJlclxuICAgIGNodW5rU2l6ZUxpbWl0PzogbnVtYmVyXG4gICAgcmVuYW1lUmVmU2Vxcz86IChhOiBzdHJpbmcpID0+IHN0cmluZ1xuICAgIHlpZWxkVGhyZWFkVGltZT86IG51bWJlclxuICB9KSB7XG4gICAgdGhpcy5yZW5hbWVSZWZTZXEgPSByZW5hbWVSZWZTZXFzXG5cbiAgICBpZiAoYmFtRmlsZWhhbmRsZSkge1xuICAgICAgdGhpcy5iYW0gPSBiYW1GaWxlaGFuZGxlXG4gICAgfSBlbHNlIGlmIChiYW1QYXRoKSB7XG4gICAgICB0aGlzLmJhbSA9IG5ldyBMb2NhbEZpbGUoYmFtUGF0aClcbiAgICB9IGVsc2UgaWYgKGJhbVVybCkge1xuICAgICAgdGhpcy5iYW0gPSBuZXcgUmVtb3RlRmlsZShiYW1VcmwpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGluaXRpYWxpemUgYmFtJylcbiAgICB9XG4gICAgaWYgKGNzaUZpbGVoYW5kbGUpIHtcbiAgICAgIHRoaXMuaW5kZXggPSBuZXcgQ1NJKHsgZmlsZWhhbmRsZTogY3NpRmlsZWhhbmRsZSB9KVxuICAgIH0gZWxzZSBpZiAoY3NpUGF0aCkge1xuICAgICAgdGhpcy5pbmRleCA9IG5ldyBDU0koeyBmaWxlaGFuZGxlOiBuZXcgTG9jYWxGaWxlKGNzaVBhdGgpIH0pXG4gICAgfSBlbHNlIGlmIChjc2lVcmwpIHtcbiAgICAgIHRoaXMuaW5kZXggPSBuZXcgQ1NJKHsgZmlsZWhhbmRsZTogbmV3IFJlbW90ZUZpbGUoY3NpVXJsKSB9KVxuICAgIH0gZWxzZSBpZiAoYmFpRmlsZWhhbmRsZSkge1xuICAgICAgdGhpcy5pbmRleCA9IG5ldyBCQUkoeyBmaWxlaGFuZGxlOiBiYWlGaWxlaGFuZGxlIH0pXG4gICAgfSBlbHNlIGlmIChiYWlQYXRoKSB7XG4gICAgICB0aGlzLmluZGV4ID0gbmV3IEJBSSh7IGZpbGVoYW5kbGU6IG5ldyBMb2NhbEZpbGUoYmFpUGF0aCkgfSlcbiAgICB9IGVsc2UgaWYgKGJhaVVybCkge1xuICAgICAgdGhpcy5pbmRleCA9IG5ldyBCQUkoeyBmaWxlaGFuZGxlOiBuZXcgUmVtb3RlRmlsZShiYWlVcmwpIH0pXG4gICAgfSBlbHNlIGlmIChiYW1QYXRoKSB7XG4gICAgICB0aGlzLmluZGV4ID0gbmV3IEJBSSh7IGZpbGVoYW5kbGU6IG5ldyBMb2NhbEZpbGUoYCR7YmFtUGF0aH0uYmFpYCkgfSlcbiAgICB9IGVsc2UgaWYgKGJhbVVybCkge1xuICAgICAgdGhpcy5pbmRleCA9IG5ldyBCQUkoeyBmaWxlaGFuZGxlOiBuZXcgUmVtb3RlRmlsZShgJHtiYW1Vcmx9LmJhaWApIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGluZmVyIGluZGV4IGZvcm1hdCcpXG4gICAgfVxuICAgIHRoaXMuZmVhdHVyZUNhY2hlID0gbmV3IEFib3J0YWJsZVByb21pc2VDYWNoZSh7XG4gICAgICBjYWNoZTogbmV3IExSVSh7XG4gICAgICAgIG1heFNpemU6IGNhY2hlU2l6ZSAhPT0gdW5kZWZpbmVkID8gY2FjaGVTaXplIDogNTAsXG4gICAgICB9KSxcbiAgICAgIGZpbGw6IHRoaXMuX3JlYWRDaHVuay5iaW5kKHRoaXMpLFxuICAgIH0pXG4gICAgdGhpcy5mZXRjaFNpemVMaW1pdCA9IGZldGNoU2l6ZUxpbWl0IHx8IDUwMDAwMDAwMCAvLyA1MDBNQlxuICAgIHRoaXMuY2h1bmtTaXplTGltaXQgPSBjaHVua1NpemVMaW1pdCB8fCAzMDAwMDAwMDAgLy8gMzAwTUJcbiAgICB0aGlzLnlpZWxkVGhyZWFkVGltZSA9IHlpZWxkVGhyZWFkVGltZVxuICB9XG5cbiAgYXN5bmMgZ2V0SGVhZGVyKG9yaWdPcHRzOiBBYm9ydFNpZ25hbCB8IEJhc2VPcHRzID0ge30pIHtcbiAgICBjb25zdCBvcHRzID0gbWFrZU9wdHMob3JpZ09wdHMpXG4gICAgY29uc3QgaW5kZXhEYXRhID0gYXdhaXQgdGhpcy5pbmRleC5wYXJzZShvcHRzKVxuICAgIGNvbnN0IHJldCA9IGluZGV4RGF0YS5maXJzdERhdGFMaW5lID8gaW5kZXhEYXRhLmZpcnN0RGF0YUxpbmUuYmxvY2tQb3NpdGlvbiArIDY1NTM1IDogdW5kZWZpbmVkXG4gICAgbGV0IGJ1ZmZlclxuICAgIGlmIChyZXQpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYmFtLnJlYWQoQnVmZmVyLmFsbG9jKHJldCArIGJsb2NrTGVuKSwgMCwgcmV0ICsgYmxvY2tMZW4sIDAsIG9wdHMpXG5cbiAgICAgIGNvbnN0IHsgYnl0ZXNSZWFkIH0gPSByZXNcbiAgICAgIDsoeyBidWZmZXIgfSA9IHJlcylcbiAgICAgIGlmICghYnl0ZXNSZWFkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgcmVhZGluZyBoZWFkZXInKVxuICAgICAgfVxuICAgICAgaWYgKGJ5dGVzUmVhZCA8IHJldCkge1xuICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoMCwgYnl0ZXNSZWFkKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKDAsIHJldClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyID0gKGF3YWl0IHRoaXMuYmFtLnJlYWRGaWxlKG9wdHMpKSBhcyBCdWZmZXJcbiAgICB9XG5cbiAgICBjb25zdCB1bmNiYSA9IGF3YWl0IHVuemlwKGJ1ZmZlcilcblxuICAgIGlmICh1bmNiYS5yZWFkSW50MzJMRSgwKSAhPT0gQkFNX01BR0lDKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIEJBTSBmaWxlJylcbiAgICB9XG4gICAgY29uc3QgaGVhZExlbiA9IHVuY2JhLnJlYWRJbnQzMkxFKDQpXG5cbiAgICB0aGlzLmhlYWRlciA9IHVuY2JhLnRvU3RyaW5nKCd1dGY4JywgOCwgOCArIGhlYWRMZW4pXG4gICAgY29uc3QgeyBjaHJUb0luZGV4LCBpbmRleFRvQ2hyIH0gPSBhd2FpdCB0aGlzLl9yZWFkUmVmU2VxcyhoZWFkTGVuICsgOCwgNjU1MzUsIG9wdHMpXG4gICAgdGhpcy5jaHJUb0luZGV4ID0gY2hyVG9JbmRleFxuICAgIHRoaXMuaW5kZXhUb0NociA9IGluZGV4VG9DaHJcblxuICAgIHJldHVybiBwYXJzZUhlYWRlclRleHQodGhpcy5oZWFkZXIpXG4gIH1cblxuICBhc3luYyBnZXRIZWFkZXJUZXh0KG9wdHM6IEJhc2VPcHRzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmdldEhlYWRlcihvcHRzKVxuICAgIHJldHVybiB0aGlzLmhlYWRlclxuICB9XG5cbiAgLy8gdGhlIGZ1bGwgbGVuZ3RoIG9mIHRoZSByZWZzZXEgYmxvY2sgaXMgbm90IGdpdmVuIGluIGFkdmFuY2Ugc28gdGhpcyBncmFicyBhIGNodW5rIGFuZFxuICAvLyBkb3VibGVzIGl0IGlmIGFsbCByZWZzZXFzIGhhdmVuJ3QgYmVlbiBwcm9jZXNzZWRcbiAgYXN5bmMgX3JlYWRSZWZTZXFzKFxuICAgIHN0YXJ0OiBudW1iZXIsXG4gICAgcmVmU2VxQnl0ZXM6IG51bWJlcixcbiAgICBvcHRzOiBCYXNlT3B0cyA9IHt9LFxuICApOiBQcm9taXNlPHtcbiAgICBjaHJUb0luZGV4OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9XG4gICAgaW5kZXhUb0NocjogeyByZWZOYW1lOiBzdHJpbmc7IGxlbmd0aDogbnVtYmVyIH1bXVxuICB9PiB7XG4gICAgaWYgKHN0YXJ0ID4gcmVmU2VxQnl0ZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkUmVmU2VxcyhzdGFydCwgcmVmU2VxQnl0ZXMgKiAyLCBvcHRzKVxuICAgIH1cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmJhbS5yZWFkKEJ1ZmZlci5hbGxvYyhyZWZTZXFCeXRlcyArIGJsb2NrTGVuKSwgMCwgcmVmU2VxQnl0ZXMsIDAsIG9wdHMpXG4gICAgY29uc3QgeyBieXRlc1JlYWQgfSA9IHJlc1xuICAgIGxldCB7IGJ1ZmZlciB9ID0gcmVzXG4gICAgaWYgKCFieXRlc1JlYWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgcmVhZGluZyByZWZzZXFzIGZyb20gaGVhZGVyJylcbiAgICB9XG4gICAgaWYgKGJ5dGVzUmVhZCA8IHJlZlNlcUJ5dGVzKSB7XG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoMCwgYnl0ZXNSZWFkKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoMCwgcmVmU2VxQnl0ZXMpXG4gICAgfVxuICAgIGNvbnN0IHVuY2JhID0gYXdhaXQgdW56aXAoYnVmZmVyKVxuICAgIGNvbnN0IG5SZWYgPSB1bmNiYS5yZWFkSW50MzJMRShzdGFydClcbiAgICBsZXQgcCA9IHN0YXJ0ICsgNFxuICAgIGNvbnN0IGNoclRvSW5kZXg6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fVxuICAgIGNvbnN0IGluZGV4VG9DaHI6IHsgcmVmTmFtZTogc3RyaW5nOyBsZW5ndGg6IG51bWJlciB9W10gPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJlZjsgaSArPSAxKSB7XG4gICAgICBhd2FpdCBhYm9ydEJyZWFrUG9pbnQob3B0cy5zaWduYWwpXG4gICAgICBjb25zdCBsTmFtZSA9IHVuY2JhLnJlYWRJbnQzMkxFKHApXG4gICAgICBsZXQgcmVmTmFtZSA9IHVuY2JhLnRvU3RyaW5nKCd1dGY4JywgcCArIDQsIHAgKyA0ICsgbE5hbWUgLSAxKVxuICAgICAgcmVmTmFtZSA9IHRoaXMucmVuYW1lUmVmU2VxKHJlZk5hbWUpXG4gICAgICBjb25zdCBsUmVmID0gdW5jYmEucmVhZEludDMyTEUocCArIGxOYW1lICsgNClcblxuICAgICAgY2hyVG9JbmRleFtyZWZOYW1lXSA9IGlcbiAgICAgIGluZGV4VG9DaHIucHVzaCh7IHJlZk5hbWUsIGxlbmd0aDogbFJlZiB9KVxuXG4gICAgICBwID0gcCArIDggKyBsTmFtZVxuICAgICAgaWYgKHAgPiB1bmNiYS5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBCQU0gaGVhZGVyIGlzIHZlcnkgYmlnLiAgUmUtZmV0Y2hpbmcgJHtyZWZTZXFCeXRlc30gYnl0ZXMuYClcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRSZWZTZXFzKHN0YXJ0LCByZWZTZXFCeXRlcyAqIDIsIG9wdHMpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNoclRvSW5kZXgsIGluZGV4VG9DaHIgfVxuICB9XG5cbiAgYXN5bmMgZ2V0UmVjb3Jkc0ZvclJhbmdlKFxuICAgIGNocjogc3RyaW5nLFxuICAgIG1pbjogbnVtYmVyLFxuICAgIG1heDogbnVtYmVyLFxuICAgIG9wdHM6IEJhbU9wdHMgPSB7IHZpZXdBc1BhaXJzOiBmYWxzZSwgcGFpckFjcm9zc0NocjogZmFsc2UsIG1heEluc2VydFNpemU6IDIwMDAwMCB9LFxuICApIHtcbiAgICBsZXQgcmVjb3JkczogQkFNRmVhdHVyZVtdID0gW11cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHRoaXMuc3RyZWFtUmVjb3Jkc0ZvclJhbmdlKGNociwgbWluLCBtYXgsIG9wdHMpKSB7XG4gICAgICByZWNvcmRzID0gcmVjb3Jkcy5jb25jYXQoY2h1bmspXG4gICAgfVxuICAgIHJldHVybiByZWNvcmRzXG4gIH1cblxuICBhc3luYyAqc3RyZWFtUmVjb3Jkc0ZvclJhbmdlKFxuICAgIGNocjogc3RyaW5nLFxuICAgIG1pbjogbnVtYmVyLFxuICAgIG1heDogbnVtYmVyLFxuICAgIG9wdHM6IEJhbU9wdHMgPSB7IHZpZXdBc1BhaXJzOiBmYWxzZSwgcGFpckFjcm9zc0NocjogZmFsc2UsIG1heEluc2VydFNpemU6IDIwMDAwMCB9LFxuICApIHtcbiAgICAvLyB0b2RvIHJlZ3VsYXJpemUgcmVmc2VxIG5hbWVzXG4gICAgb3B0cy52aWV3QXNQYWlycyA9IG9wdHMudmlld0FzUGFpcnMgfHwgZmFsc2VcbiAgICBvcHRzLnBhaXJBY3Jvc3NDaHIgPSBvcHRzLnBhaXJBY3Jvc3NDaHIgfHwgZmFsc2VcbiAgICBvcHRzLm1heEluc2VydFNpemUgPSBvcHRzLm1heEluc2VydFNpemUgIT09IHVuZGVmaW5lZCA/IG9wdHMubWF4SW5zZXJ0U2l6ZSA6IDIwMDAwMFxuICAgIGNvbnN0IGNocklkID0gdGhpcy5jaHJUb0luZGV4ICYmIHRoaXMuY2hyVG9JbmRleFtjaHJdXG4gICAgbGV0IGNodW5rczogQ2h1bmtbXVxuICAgIGlmICghKGNocklkID49IDApKSB7XG4gICAgICBjaHVua3MgPSBbXVxuICAgIH0gZWxzZSB7XG4gICAgICBjaHVua3MgPSBhd2FpdCB0aGlzLmluZGV4LmJsb2Nrc0ZvclJhbmdlKGNocklkLCBtaW4gLSAxLCBtYXgsIG9wdHMpXG5cbiAgICAgIGlmICghY2h1bmtzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgaW4gaW5kZXggZmV0Y2gnKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBhd2FpdCBhYm9ydEJyZWFrUG9pbnQob3B0cy5zaWduYWwpXG4gICAgICBjb25zdCBzaXplID0gY2h1bmtzW2ldLmZldGNoZWRTaXplKClcbiAgICAgIGlmIChzaXplID4gdGhpcy5jaHVua1NpemVMaW1pdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRvbyBtYW55IEJBTSBmZWF0dXJlcy4gQkFNIGNodW5rIHNpemUgJHtzaXplfSBieXRlcyBleGNlZWRzIGNodW5rU2l6ZUxpbWl0IG9mICR7dGhpcy5jaHVua1NpemVMaW1pdH1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdG90YWxTaXplID0gY2h1bmtzXG4gICAgICAubWFwKChzOiBDaHVuaykgPT4gcy5mZXRjaGVkU2l6ZSgpKVxuICAgICAgLnJlZHVjZSgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IGEgKyBiLCAwKVxuICAgIGlmICh0b3RhbFNpemUgPiB0aGlzLmZldGNoU2l6ZUxpbWl0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBkYXRhIHNpemUgb2YgJHt0b3RhbFNpemUudG9Mb2NhbGVTdHJpbmcoKX0gYnl0ZXMgZXhjZWVkZWQgZmV0Y2ggc2l6ZSBsaW1pdCBvZiAke3RoaXMuZmV0Y2hTaXplTGltaXQudG9Mb2NhbGVTdHJpbmcoKX0gYnl0ZXNgLFxuICAgICAgKVxuICAgIH1cbiAgICB5aWVsZCogdGhpcy5fZmV0Y2hDaHVua0ZlYXR1cmVzKGNodW5rcywgY2hySWQsIG1pbiwgbWF4LCBvcHRzKVxuICB9XG5cbiAgYXN5bmMgKl9mZXRjaENodW5rRmVhdHVyZXMoXG4gICAgY2h1bmtzOiBDaHVua1tdLFxuICAgIGNocklkOiBudW1iZXIsXG4gICAgbWluOiBudW1iZXIsXG4gICAgbWF4OiBudW1iZXIsXG4gICAgb3B0czogQmFtT3B0cyxcbiAgKSB7XG4gICAgY29uc3QgZmVhdFByb21pc2VzID0gW11cbiAgICBsZXQgZG9uZSA9IGZhbHNlXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNodW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYyA9IGNodW5rc1tpXVxuICAgICAgY29uc3QgeyBkYXRhLCBjcG9zaXRpb25zLCBkcG9zaXRpb25zLCBjaHVuayB9ID0gYXdhaXQgdGhpcy5mZWF0dXJlQ2FjaGUuZ2V0KFxuICAgICAgICBjLnRvU3RyaW5nKCksXG4gICAgICAgIHsgY2h1bms6IGMsIG9wdHMgfSxcbiAgICAgICAgb3B0cy5zaWduYWwsXG4gICAgICApXG4gICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5yZWFkQmFtRmVhdHVyZXMoZGF0YSwgY3Bvc2l0aW9ucywgZHBvc2l0aW9ucywgY2h1bmspLnRoZW4ocmVjb3JkcyA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3MgPSBbXVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBmZWF0dXJlID0gcmVjb3Jkc1tpXVxuICAgICAgICAgIGlmIChmZWF0dXJlLnNlcV9pZCgpID09PSBjaHJJZCkge1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUuZ2V0KCdzdGFydCcpID49IG1heCkge1xuICAgICAgICAgICAgICAvLyBwYXN0IGVuZCBvZiByYW5nZSwgY2FuIHN0b3AgaXRlcmF0aW5nXG4gICAgICAgICAgICAgIGRvbmUgPSB0cnVlXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZlYXR1cmUuZ2V0KCdlbmQnKSA+PSBtaW4pIHtcbiAgICAgICAgICAgICAgLy8gbXVzdCBiZSBpbiByYW5nZVxuICAgICAgICAgICAgICByZWNzLnB1c2goZmVhdHVyZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY3NcbiAgICAgIH0pXG4gICAgICBmZWF0UHJvbWlzZXMucHVzaChwcm9taXNlKVxuICAgICAgYXdhaXQgcHJvbWlzZVxuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVja0Fib3J0U2lnbmFsKG9wdHMuc2lnbmFsKVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZWF0UHJvbWlzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHlpZWxkIGZlYXRQcm9taXNlc1tpXVxuICAgIH1cbiAgICBjaGVja0Fib3J0U2lnbmFsKG9wdHMuc2lnbmFsKVxuICAgIGlmIChvcHRzLnZpZXdBc1BhaXJzKSB7XG4gICAgICB5aWVsZCB0aGlzLmZldGNoUGFpcnMoY2hySWQsIGZlYXRQcm9taXNlcywgb3B0cylcbiAgICB9XG4gIH1cblxuICBhc3luYyBmZXRjaFBhaXJzKGNocklkOiBudW1iZXIsIGZlYXRQcm9taXNlczogUHJvbWlzZTxCQU1GZWF0dXJlW10+W10sIG9wdHM6IEJhbU9wdHMpIHtcbiAgICBjb25zdCB1bm1hdGVkUGFpcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge31cbiAgICBjb25zdCByZWFkSWRzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge31cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZlYXRQcm9taXNlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IGZcbiAgICAgICAgY29uc3QgcmVhZE5hbWVzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge31cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gcmV0W2ldLm5hbWUoKVxuICAgICAgICAgIGNvbnN0IGlkID0gcmV0W2ldLmlkKClcbiAgICAgICAgICBpZiAoIXJlYWROYW1lc1tuYW1lXSkge1xuICAgICAgICAgICAgcmVhZE5hbWVzW25hbWVdID0gMFxuICAgICAgICAgIH1cbiAgICAgICAgICByZWFkTmFtZXNbbmFtZV0rK1xuICAgICAgICAgIHJlYWRJZHNbaWRdID0gMVxuICAgICAgICB9XG4gICAgICAgIGVudHJpZXMocmVhZE5hbWVzKS5mb3JFYWNoKChbaywgdl06IFtzdHJpbmcsIG51bWJlcl0pID0+IHtcbiAgICAgICAgICBpZiAodiA9PT0gMSkge1xuICAgICAgICAgICAgdW5tYXRlZFBhaXJzW2tdID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pLFxuICAgIClcblxuICAgIGNvbnN0IG1hdGVQcm9taXNlczogUHJvbWlzZTxDaHVua1tdPltdID0gW11cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZlYXRQcm9taXNlcy5tYXAoYXN5bmMgZiA9PiB7XG4gICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IGZcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gcmV0W2ldLm5hbWUoKVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHVubWF0ZWRQYWlyc1tuYW1lXSAmJlxuICAgICAgICAgICAgKG9wdHMucGFpckFjcm9zc0NociB8fFxuICAgICAgICAgICAgICAocmV0W2ldLl9uZXh0X3JlZmlkKCkgPT09IGNocklkICYmXG4gICAgICAgICAgICAgICAgTWF0aC5hYnMocmV0W2ldLmdldCgnc3RhcnQnKSAtIHJldFtpXS5fbmV4dF9wb3MoKSkgPFxuICAgICAgICAgICAgICAgICAgKG9wdHMubWF4SW5zZXJ0U2l6ZSB8fCAyMDAwMDApKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1hdGVQcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgICB0aGlzLmluZGV4LmJsb2Nrc0ZvclJhbmdlKFxuICAgICAgICAgICAgICAgIHJldFtpXS5fbmV4dF9yZWZpZCgpLFxuICAgICAgICAgICAgICAgIHJldFtpXS5fbmV4dF9wb3MoKSxcbiAgICAgICAgICAgICAgICByZXRbaV0uX25leHRfcG9zKCkgKyAxLFxuICAgICAgICAgICAgICAgIG9wdHMsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApXG5cbiAgICBjb25zdCBtYXRlQmxvY2tzID0gYXdhaXQgUHJvbWlzZS5hbGwobWF0ZVByb21pc2VzKVxuICAgIGxldCBtYXRlQ2h1bmtzOiBDaHVua1tdID0gW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGVCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIG1hdGVDaHVua3MgPSBtYXRlQ2h1bmtzLmNvbmNhdChtYXRlQmxvY2tzW2ldKVxuICAgIH1cbiAgICAvLyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZSBjaHVua3MgKHRoZSBibG9ja3MgYXJlIGxpc3RzIG9mIGNodW5rcywgYmxvY2tzIGFyZSBjb25jYXRlbmF0ZWQsIHRoZW4gZmlsdGVyIGR1cCBjaHVua3MpXG4gICAgbWF0ZUNodW5rcyA9IG1hdGVDaHVua3NcbiAgICAgIC5zb3J0KClcbiAgICAgIC5maWx0ZXIoKGl0ZW0sIHBvcywgYXJ5KSA9PiAhcG9zIHx8IGl0ZW0udG9TdHJpbmcoKSAhPT0gYXJ5W3BvcyAtIDFdLnRvU3RyaW5nKCkpXG5cbiAgICBjb25zdCBtYXRlVG90YWxTaXplID0gbWF0ZUNodW5rcy5tYXAocyA9PiBzLmZldGNoZWRTaXplKCkpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApXG4gICAgaWYgKG1hdGVUb3RhbFNpemUgPiB0aGlzLmZldGNoU2l6ZUxpbWl0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBkYXRhIHNpemUgb2YgJHttYXRlVG90YWxTaXplLnRvTG9jYWxlU3RyaW5nKCl9IGJ5dGVzIGV4Y2VlZGVkIGZldGNoIHNpemUgbGltaXQgb2YgJHt0aGlzLmZldGNoU2l6ZUxpbWl0LnRvTG9jYWxlU3RyaW5nKCl9IGJ5dGVzYCxcbiAgICAgIClcbiAgICB9XG4gICAgY29uc3QgbWF0ZUZlYXRQcm9taXNlcyA9IG1hdGVDaHVua3MubWFwKGFzeW5jIGMgPT4ge1xuICAgICAgY29uc3QgeyBkYXRhLCBjcG9zaXRpb25zLCBkcG9zaXRpb25zLCBjaHVuayB9ID0gYXdhaXQgdGhpcy5mZWF0dXJlQ2FjaGUuZ2V0KFxuICAgICAgICBjLnRvU3RyaW5nKCksXG4gICAgICAgIHsgY2h1bms6IGMsIG9wdHMgfSxcbiAgICAgICAgb3B0cy5zaWduYWwsXG4gICAgICApXG4gICAgICBjb25zdCBmZWF0cyA9IGF3YWl0IHRoaXMucmVhZEJhbUZlYXR1cmVzKGRhdGEsIGNwb3NpdGlvbnMsIGRwb3NpdGlvbnMsIGNodW5rKVxuICAgICAgY29uc3QgbWF0ZVJlY3MgPSBbXVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZWF0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBmZWF0dXJlID0gZmVhdHNbaV1cbiAgICAgICAgaWYgKHVubWF0ZWRQYWlyc1tmZWF0dXJlLmdldCgnbmFtZScpXSAmJiAhcmVhZElkc1tmZWF0dXJlLmlkKCldKSB7XG4gICAgICAgICAgbWF0ZVJlY3MucHVzaChmZWF0dXJlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0ZVJlY3NcbiAgICB9KVxuICAgIGNvbnN0IG5ld01hdGVGZWF0cyA9IGF3YWl0IFByb21pc2UuYWxsKG1hdGVGZWF0UHJvbWlzZXMpXG4gICAgbGV0IGZlYXR1cmVzUmV0OiBCQU1GZWF0dXJlW10gPSBbXVxuICAgIGlmIChuZXdNYXRlRmVhdHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBuZXdNYXRlcyA9IG5ld01hdGVGZWF0cy5yZWR1Y2UoKHJlc3VsdCwgY3VycmVudCkgPT4gcmVzdWx0LmNvbmNhdChjdXJyZW50KSlcbiAgICAgIGZlYXR1cmVzUmV0ID0gZmVhdHVyZXNSZXQuY29uY2F0KG5ld01hdGVzKVxuICAgIH1cbiAgICByZXR1cm4gZmVhdHVyZXNSZXRcbiAgfVxuXG4gIGFzeW5jIF9yZWFkQ2h1bmsoeyBjaHVuaywgb3B0cyB9OiB7IGNodW5rOiB1bmtub3duOyBvcHRzOiBCYXNlT3B0cyB9LCBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgYyA9IGNodW5rIGFzIENodW5rXG4gICAgY29uc3QgYnVmc2l6ZSA9IGMuZmV0Y2hlZFNpemUoKVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYmFtLnJlYWQoQnVmZmVyLmFsbG9jKGJ1ZnNpemUpLCAwLCBidWZzaXplLCBjLm1pbnYuYmxvY2tQb3NpdGlvbiwgb3B0cylcbiAgICBjb25zdCB7IGJ5dGVzUmVhZCB9ID0gcmVzXG4gICAgbGV0IHsgYnVmZmVyIH0gPSByZXNcbiAgICBjaGVja0Fib3J0U2lnbmFsKGFib3J0U2lnbmFsKVxuICAgIGlmICghYnl0ZXNSZWFkKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgaWYgKGJ5dGVzUmVhZCA8IGJ1ZnNpemUpIHtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgwLCBieXRlc1JlYWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgwLCBidWZzaXplKVxuICAgIH1cblxuICAgIGNvbnN0IHsgYnVmZmVyOiBkYXRhLCBjcG9zaXRpb25zLCBkcG9zaXRpb25zIH0gPSBhd2FpdCB1bnppcENodW5rU2xpY2UoYnVmZmVyLCBjaHVuaylcbiAgICBjaGVja0Fib3J0U2lnbmFsKGFib3J0U2lnbmFsKVxuICAgIHJldHVybiB7IGRhdGEsIGNwb3NpdGlvbnMsIGRwb3NpdGlvbnMsIGNodW5rIH1cbiAgfVxuXG4gIGFzeW5jIHJlYWRCYW1GZWF0dXJlcyhiYTogQnVmZmVyLCBjcG9zaXRpb25zOiBudW1iZXJbXSwgZHBvc2l0aW9uczogbnVtYmVyW10sIGNodW5rOiBDaHVuaykge1xuICAgIGxldCBibG9ja1N0YXJ0ID0gMFxuICAgIGNvbnN0IHNpbmsgPSBbXVxuICAgIGxldCBwb3MgPSAwXG4gICAgbGV0IGxhc3QgPSArRGF0ZS5ub3coKVxuXG4gICAgd2hpbGUgKGJsb2NrU3RhcnQgKyA0IDwgYmEubGVuZ3RoKSB7XG4gICAgICBjb25zdCBibG9ja1NpemUgPSBiYS5yZWFkSW50MzJMRShibG9ja1N0YXJ0KVxuICAgICAgY29uc3QgYmxvY2tFbmQgPSBibG9ja1N0YXJ0ICsgNCArIGJsb2NrU2l6ZSAtIDFcblxuICAgICAgLy8gaW5jcmVtZW50IHBvc2l0aW9uIHRvIHRoZSBjdXJyZW50IGRlY29tcHJlc3NlZCBzdGF0dXNcbiAgICAgIGlmIChkcG9zaXRpb25zKSB7XG4gICAgICAgIHdoaWxlIChibG9ja1N0YXJ0ICsgY2h1bmsubWludi5kYXRhUG9zaXRpb24gPj0gZHBvc2l0aW9uc1twb3MrK10pIHt9XG4gICAgICAgIHBvcy0tXG4gICAgICB9XG5cbiAgICAgIC8vIG9ubHkgdHJ5IHRvIHJlYWQgdGhlIGZlYXR1cmUgaWYgd2UgaGF2ZSBhbGwgdGhlIGJ5dGVzIGZvciBpdFxuICAgICAgaWYgKGJsb2NrRW5kIDwgYmEubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBuZXcgQkFNRmVhdHVyZSh7XG4gICAgICAgICAgYnl0ZXM6IHtcbiAgICAgICAgICAgIGJ5dGVBcnJheTogYmEsXG4gICAgICAgICAgICBzdGFydDogYmxvY2tTdGFydCxcbiAgICAgICAgICAgIGVuZDogYmxvY2tFbmQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyB0aGUgYmVsb3cgcmVzdWx0cyBpbiBhbiBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgZmlsZS1vZmZzZXQgYmFzZWQgSURcbiAgICAgICAgICAvLyBpZiB0aGUgaW5mbyBmb3IgdGhhdCBpcyBhdmFpbGFibGUsIG90aGVyd2lzZSBjcmMzMiBvZiB0aGUgZmVhdHVyZXNcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIGNwb3NpdGlvbnNbcG9zXSByZWZlcnMgdG8gYWN0dWFsIGZpbGUgb2Zmc2V0IG9mIGEgYmd6aXAgYmxvY2sgYm91bmRhcmllc1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gd2UgbXVsdGlwbHkgYnkgKDEgPDw4KSBpbiBvcmRlciB0byBtYWtlIHN1cmUgZWFjaCBibG9jayBoYXMgYSBcInVuaXF1ZVwiXG4gICAgICAgICAgLy8gYWRkcmVzcyBzcGFjZSBzbyB0aGF0IGRhdGEgaW4gdGhhdCBibG9jayBjb3VsZCBuZXZlciBvdmVybGFwXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyB0aGVuIHRoZSBibG9ja1N0YXJ0LWRwb3NpdGlvbnMgaXMgYW4gdW5jb21wcmVzc2VkIGZpbGUgb2Zmc2V0IGZyb21cbiAgICAgICAgICAvLyB0aGF0IGJnemlwIGJsb2NrIGJvdW5kYXJ5LCBhbmQgc2luY2UgdGhlIGNwb3NpdGlvbnMgYXJlIG11bHRpcGxpZWQgYnlcbiAgICAgICAgICAvLyAoMSA8PCA4KSB0aGVzZSB1bmNvbXByZXNzZWQgb2Zmc2V0cyBnZXQgYSB1bmlxdWUgc3BhY2VcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIHRoaXMgaGFzIGFuIGV4dHJhIGNodW5rLm1pbnYuZGF0YVBvc2l0aW9uIGFkZGVkIG9uIGJlY2F1c2UgaXQgYmxvY2tTdGFydFxuICAgICAgICAgIC8vIHN0YXJ0cyBhdCAwIGluc3RlYWQgb2YgY2h1bmsubWludi5kYXRhUG9zaXRpb25cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIHRoZSArMSBpcyBqdXN0IHRvIGF2b2lkIGFueSBwb3NzaWJsZSB1bmlxdWVJZCAwIGJ1dCB0aGlzIGRvZXMgbm90IHJlYWxpc3RpY2FsbHkgaGFwcGVuXG4gICAgICAgICAgZmlsZU9mZnNldDogY3Bvc2l0aW9uc1xuICAgICAgICAgICAgPyBjcG9zaXRpb25zW3Bvc10gKiAoMSA8PCA4KSArXG4gICAgICAgICAgICAgIChibG9ja1N0YXJ0IC0gZHBvc2l0aW9uc1twb3NdKSArXG4gICAgICAgICAgICAgIGNodW5rLm1pbnYuZGF0YVBvc2l0aW9uICtcbiAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgOiBjcmMzMi5zaWduZWQoYmEuc2xpY2UoYmxvY2tTdGFydCwgYmxvY2tFbmQpKSxcbiAgICAgICAgfSlcblxuICAgICAgICBzaW5rLnB1c2goZmVhdHVyZSlcbiAgICAgICAgaWYgKHRoaXMueWllbGRUaHJlYWRUaW1lICYmICtEYXRlLm5vdygpIC0gbGFzdCA+IHRoaXMueWllbGRUaHJlYWRUaW1lKSB7XG4gICAgICAgICAgYXdhaXQgdGltZW91dCgxKVxuICAgICAgICAgIGxhc3QgPSArRGF0ZS5ub3coKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGJsb2NrU3RhcnQgPSBibG9ja0VuZCArIDFcbiAgICB9XG4gICAgcmV0dXJuIHNpbmtcbiAgfVxuXG4gIGFzeW5jIGhhc1JlZlNlcShzZXFOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWZJZCA9IHRoaXMuY2hyVG9JbmRleCAmJiB0aGlzLmNoclRvSW5kZXhbc2VxTmFtZV1cbiAgICByZXR1cm4gdGhpcy5pbmRleC5oYXNSZWZTZXEocmVmSWQpXG4gIH1cblxuICBhc3luYyBsaW5lQ291bnQoc2VxTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVmSWQgPSB0aGlzLmNoclRvSW5kZXggJiYgdGhpcy5jaHJUb0luZGV4W3NlcU5hbWVdXG4gICAgcmV0dXJuIHRoaXMuaW5kZXgubGluZUNvdW50KHJlZklkKVxuICB9XG5cbiAgYXN5bmMgaW5kZXhDb3Yoc2VxTmFtZTogc3RyaW5nLCBzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKSB7XG4gICAgYXdhaXQgdGhpcy5pbmRleC5wYXJzZSgpXG4gICAgY29uc3Qgc2VxSWQgPSB0aGlzLmNoclRvSW5kZXggJiYgdGhpcy5jaHJUb0luZGV4W3NlcU5hbWVdXG4gICAgcmV0dXJuIHRoaXMuaW5kZXguaW5kZXhDb3Yoc2VxSWQsIHN0YXJ0LCBlbmQpXG4gIH1cbn1cbiJdfQ==
|
|
695
|
+
//# sourceMappingURL=bamFile.js.map
|