tedious 20.3.2 → 20.3.4
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/LICENSE +1 -1
- package/README.md +11 -21
- package/lib/connection.js +8 -1
- package/lib/connection.js.map +1 -1
- package/lib/data-types/plp-stream.d.ts +1 -1
- package/lib/data-types/plp-stream.js +12 -9
- package/lib/data-types/plp-stream.js.map +1 -1
- package/lib/data-types/varchar.js +9 -14
- package/lib/data-types/varchar.js.map +1 -1
- package/lib/metadata-parser.d.ts +1 -3
- package/lib/metadata-parser.js +1 -22
- package/lib/metadata-parser.js.map +1 -1
- package/lib/request.d.ts +4 -5
- package/lib/request.js +5 -6
- package/lib/request.js.map +1 -1
- package/lib/token/colmetadata-token-parser.d.ts +11 -3
- package/lib/token/colmetadata-token-parser.js +29 -42
- package/lib/token/colmetadata-token-parser.js.map +1 -1
- package/lib/token/nbcrow-token-parser.d.ts +11 -3
- package/lib/token/nbcrow-token-parser.js +22 -89
- package/lib/token/nbcrow-token-parser.js.map +1 -1
- package/lib/token/returnvalue-token-parser.d.ts +19 -3
- package/lib/token/returnvalue-token-parser.js +67 -73
- package/lib/token/returnvalue-token-parser.js.map +1 -1
- package/lib/token/row-token-parser.d.ts +33 -3
- package/lib/token/row-token-parser.js +62 -60
- package/lib/token/row-token-parser.js.map +1 -1
- package/lib/token/stream-parser.d.ts +59 -27
- package/lib/token/stream-parser.js +157 -325
- package/lib/token/stream-parser.js.map +1 -1
- package/lib/token/token-stream-parser.d.ts +12 -5
- package/lib/token/token-stream-parser.js +46 -17
- package/lib/token/token-stream-parser.js.map +1 -1
- package/lib/value-parser.d.ts +19 -2
- package/lib/value-parser.js +73 -30
- package/lib/value-parser.js.map +1 -1
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _token = require("./token");
|
|
8
8
|
var _colinfoTokenParser = _interopRequireDefault(require("./colinfo-token-parser"));
|
|
9
|
-
var _colmetadataTokenParser =
|
|
9
|
+
var _colmetadataTokenParser = require("./colmetadata-token-parser");
|
|
10
10
|
var _doneTokenParser = require("./done-token-parser");
|
|
11
11
|
var _envChangeTokenParser = _interopRequireDefault(require("./env-change-token-parser"));
|
|
12
12
|
var _infoerrorTokenParser = require("./infoerror-token-parser");
|
|
@@ -15,367 +15,199 @@ var _featureExtAckParser = _interopRequireDefault(require("./feature-ext-ack-par
|
|
|
15
15
|
var _loginackTokenParser = _interopRequireDefault(require("./loginack-token-parser"));
|
|
16
16
|
var _orderTokenParser = _interopRequireDefault(require("./order-token-parser"));
|
|
17
17
|
var _returnstatusTokenParser = _interopRequireDefault(require("./returnstatus-token-parser"));
|
|
18
|
-
var _returnvalueTokenParser =
|
|
19
|
-
var _rowTokenParser =
|
|
20
|
-
var _nbcrowTokenParser =
|
|
18
|
+
var _returnvalueTokenParser = require("./returnvalue-token-parser");
|
|
19
|
+
var _rowTokenParser = require("./row-token-parser");
|
|
20
|
+
var _nbcrowTokenParser = require("./nbcrow-token-parser");
|
|
21
21
|
var _sspiTokenParser = _interopRequireDefault(require("./sspi-token-parser"));
|
|
22
22
|
var _tabnameTokenParser = _interopRequireDefault(require("./tabname-token-parser"));
|
|
23
23
|
var _helpers = require("./helpers");
|
|
24
24
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
25
|
+
/**
|
|
26
|
+
* Parses a token that is short enough to simply be parsed again from its
|
|
27
|
+
* start if it is not fully available yet.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Parses a token that can grow arbitrarily large, and thus needs to be parsed
|
|
32
|
+
* incrementally.
|
|
33
|
+
*
|
|
34
|
+
* The reader starts parsing right after the token's type byte and keeps its
|
|
35
|
+
* progress across calls: if `read` throws a `NotEnoughDataError`, it is
|
|
36
|
+
* called again once more data has arrived.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A push-based parser for the tokens contained in a TDS token stream.
|
|
41
|
+
*
|
|
42
|
+
* Data is pushed into the parser as it arrives via `write`, and parsed tokens
|
|
43
|
+
* are pulled out via `read`. Tokens are parsed lazily, one at a time, so any
|
|
44
|
+
* effects of handling a token (e.g. the TDS version negotiated via the
|
|
45
|
+
* `LOGINACK` token) apply to the parsing of all tokens that follow it.
|
|
46
|
+
*/
|
|
25
47
|
class Parser {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
48
|
+
// The data that is currently being parsed, and the position of the first
|
|
49
|
+
// byte in it that has not been consumed yet.
|
|
50
|
+
|
|
51
|
+
// Chunks that were written, but not yet appended to `buffer`.
|
|
52
|
+
|
|
53
|
+
// The number of unconsumed bytes required for parsing to make progress.
|
|
54
|
+
//
|
|
55
|
+
// Incomplete data is not appended to `buffer` until at least this many
|
|
56
|
+
// bytes are available, so that a large token arriving across many chunks is
|
|
57
|
+
// not parsed again (and copied again) for every chunk.
|
|
58
|
+
|
|
59
|
+
// The reader of an incrementally parsed token that is not complete yet.
|
|
60
|
+
|
|
61
|
+
constructor(options, colMetadata = []) {
|
|
62
|
+
this.options = options;
|
|
63
|
+
this.colMetadata = colMetadata;
|
|
64
|
+
this.buffer = Buffer.alloc(0);
|
|
65
|
+
this.position = 0;
|
|
66
|
+
this.pending = [];
|
|
67
|
+
this.pendingLength = 0;
|
|
68
|
+
this.bytesNeeded = 1;
|
|
69
|
+
this.tokenReader = undefined;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Parse all tokens from the given chunks of data.
|
|
74
|
+
*/
|
|
75
|
+
static async *parseTokens(iterable, options, colMetadata) {
|
|
76
|
+
const parser = new Parser(options, colMetadata);
|
|
77
|
+
for await (const chunk of iterable) {
|
|
78
|
+
parser.write(chunk);
|
|
79
|
+
let token;
|
|
80
|
+
while ((token = parser.read()) !== undefined) {
|
|
81
|
+
yield token;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
parser.end();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Add a chunk of data to be parsed.
|
|
89
|
+
*/
|
|
90
|
+
write(chunk) {
|
|
91
|
+
this.pending.push(chunk);
|
|
92
|
+
this.pendingLength += chunk.length;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Parse the next token, or return `undefined` if more data needs to be
|
|
97
|
+
* written first.
|
|
98
|
+
*/
|
|
99
|
+
read() {
|
|
35
100
|
while (true) {
|
|
101
|
+
if (this.buffer.length - this.position < this.bytesNeeded && !this.appendPending()) {
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
let token;
|
|
36
105
|
try {
|
|
37
|
-
|
|
106
|
+
token = this.tokenReader !== undefined ? this.tokenReader.read(this) : this.readToken();
|
|
38
107
|
} catch (err) {
|
|
39
|
-
if (
|
|
40
|
-
|
|
108
|
+
if (err instanceof _helpers.NotEnoughDataError) {
|
|
109
|
+
// Always wait for at least one more byte, so parsing never retries
|
|
110
|
+
// without new data.
|
|
111
|
+
this.bytesNeeded = Math.max(err.byteCount, this.buffer.length + 1) - this.position;
|
|
112
|
+
continue;
|
|
41
113
|
}
|
|
42
114
|
throw err;
|
|
43
115
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
116
|
+
this.tokenReader = undefined;
|
|
117
|
+
this.bytesNeeded = 1;
|
|
118
|
+
|
|
119
|
+
// Some tokens (e.g. unknown `ENVCHANGE` types) are skipped.
|
|
120
|
+
if (token !== undefined) {
|
|
121
|
+
return token;
|
|
51
122
|
}
|
|
52
123
|
}
|
|
53
124
|
}
|
|
54
|
-
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Signal that all data was written.
|
|
128
|
+
*
|
|
129
|
+
* Throws if the data ended in the middle of a token.
|
|
130
|
+
*/
|
|
131
|
+
end() {
|
|
132
|
+
if (this.tokenReader !== undefined || this.position < this.buffer.length || this.pendingLength > 0) {
|
|
133
|
+
throw new Error('unexpected end of data');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Append the pending chunks to the unconsumed data, if that makes enough
|
|
139
|
+
* data available for parsing to make progress.
|
|
140
|
+
*/
|
|
141
|
+
appendPending() {
|
|
142
|
+
const remaining = this.buffer.length - this.position;
|
|
143
|
+
if (remaining + this.pendingLength < this.bytesNeeded) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
if (remaining === 0 && this.pending.length === 1) {
|
|
147
|
+
this.buffer = this.pending[0];
|
|
148
|
+
} else {
|
|
149
|
+
this.pending.unshift(this.buffer.subarray(this.position));
|
|
150
|
+
this.buffer = Buffer.concat(this.pending, remaining + this.pendingLength);
|
|
151
|
+
}
|
|
152
|
+
this.position = 0;
|
|
153
|
+
this.pending = [];
|
|
154
|
+
this.pendingLength = 0;
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
readToken() {
|
|
158
|
+
const type = this.buffer[this.position];
|
|
55
159
|
switch (type) {
|
|
56
160
|
case _token.TYPE.DONE:
|
|
57
|
-
|
|
58
|
-
return this.readDoneToken();
|
|
59
|
-
}
|
|
161
|
+
return this.parseToken(_doneTokenParser.doneParser);
|
|
60
162
|
case _token.TYPE.DONEPROC:
|
|
61
|
-
|
|
62
|
-
return this.readDoneProcToken();
|
|
63
|
-
}
|
|
163
|
+
return this.parseToken(_doneTokenParser.doneProcParser);
|
|
64
164
|
case _token.TYPE.DONEINPROC:
|
|
65
|
-
|
|
66
|
-
return this.readDoneInProcToken();
|
|
67
|
-
}
|
|
165
|
+
return this.parseToken(_doneTokenParser.doneInProcParser);
|
|
68
166
|
case _token.TYPE.ERROR:
|
|
69
|
-
|
|
70
|
-
return this.readErrorToken();
|
|
71
|
-
}
|
|
167
|
+
return this.parseToken(_infoerrorTokenParser.errorParser);
|
|
72
168
|
case _token.TYPE.INFO:
|
|
73
|
-
|
|
74
|
-
return this.readInfoToken();
|
|
75
|
-
}
|
|
169
|
+
return this.parseToken(_infoerrorTokenParser.infoParser);
|
|
76
170
|
case _token.TYPE.ENVCHANGE:
|
|
77
|
-
|
|
78
|
-
return this.readEnvChangeToken();
|
|
79
|
-
}
|
|
171
|
+
return this.parseToken(_envChangeTokenParser.default);
|
|
80
172
|
case _token.TYPE.LOGINACK:
|
|
81
|
-
|
|
82
|
-
return this.readLoginAckToken();
|
|
83
|
-
}
|
|
173
|
+
return this.parseToken(_loginackTokenParser.default);
|
|
84
174
|
case _token.TYPE.RETURNSTATUS:
|
|
85
|
-
|
|
86
|
-
return this.readReturnStatusToken();
|
|
87
|
-
}
|
|
175
|
+
return this.parseToken(_returnstatusTokenParser.default);
|
|
88
176
|
case _token.TYPE.ORDER:
|
|
89
|
-
|
|
90
|
-
return this.readOrderToken();
|
|
91
|
-
}
|
|
177
|
+
return this.parseToken(_orderTokenParser.default);
|
|
92
178
|
case _token.TYPE.FEDAUTHINFO:
|
|
93
|
-
|
|
94
|
-
return this.readFedAuthInfoToken();
|
|
95
|
-
}
|
|
179
|
+
return this.parseToken(_fedauthInfoParser.default);
|
|
96
180
|
case _token.TYPE.SSPI:
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
181
|
+
return this.parseToken(_sspiTokenParser.default);
|
|
182
|
+
case _token.TYPE.FEATUREEXTACK:
|
|
183
|
+
return this.parseToken(_featureExtAckParser.default);
|
|
184
|
+
case _token.TYPE.TABNAME:
|
|
185
|
+
return this.parseToken(_tabnameTokenParser.default);
|
|
186
|
+
case _token.TYPE.COLINFO:
|
|
187
|
+
return this.parseToken(_colinfoTokenParser.default);
|
|
100
188
|
case _token.TYPE.COLMETADATA:
|
|
101
|
-
|
|
102
|
-
return this.readColMetadataToken();
|
|
103
|
-
}
|
|
189
|
+
return this.startTokenReader(new _colmetadataTokenParser.ColMetadataTokenReader());
|
|
104
190
|
case _token.TYPE.RETURNVALUE:
|
|
105
|
-
|
|
106
|
-
return this.readReturnValueToken();
|
|
107
|
-
}
|
|
191
|
+
return this.startTokenReader(new _returnvalueTokenParser.ReturnValueTokenReader());
|
|
108
192
|
case _token.TYPE.ROW:
|
|
109
|
-
|
|
110
|
-
return this.readRowToken();
|
|
111
|
-
}
|
|
193
|
+
return this.startTokenReader(new _rowTokenParser.RowTokenReader());
|
|
112
194
|
case _token.TYPE.NBCROW:
|
|
113
|
-
|
|
114
|
-
return this.readNbcRowToken();
|
|
115
|
-
}
|
|
116
|
-
case _token.TYPE.FEATUREEXTACK:
|
|
117
|
-
{
|
|
118
|
-
return this.readFeatureExtAckToken();
|
|
119
|
-
}
|
|
120
|
-
case _token.TYPE.TABNAME:
|
|
121
|
-
{
|
|
122
|
-
return this.readTabNameToken();
|
|
123
|
-
}
|
|
124
|
-
case _token.TYPE.COLINFO:
|
|
125
|
-
{
|
|
126
|
-
return this.readColInfoToken();
|
|
127
|
-
}
|
|
195
|
+
return this.startTokenReader(new _nbcrowTokenParser.NBCRowTokenReader());
|
|
128
196
|
default:
|
|
129
|
-
|
|
130
|
-
throw new Error('Unknown type: ' + type);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
readFeatureExtAckToken() {
|
|
135
|
-
let result;
|
|
136
|
-
try {
|
|
137
|
-
result = (0, _featureExtAckParser.default)(this.buffer, this.position, this.options);
|
|
138
|
-
} catch (err) {
|
|
139
|
-
if (err instanceof _helpers.NotEnoughDataError) {
|
|
140
|
-
return this.waitForChunk().then(() => {
|
|
141
|
-
return this.readFeatureExtAckToken();
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
throw err;
|
|
145
|
-
}
|
|
146
|
-
this.position = result.offset;
|
|
147
|
-
return result.value;
|
|
148
|
-
}
|
|
149
|
-
readTabNameToken() {
|
|
150
|
-
let result;
|
|
151
|
-
try {
|
|
152
|
-
result = (0, _tabnameTokenParser.default)(this.buffer, this.position, this.options);
|
|
153
|
-
} catch (err) {
|
|
154
|
-
if (err instanceof _helpers.NotEnoughDataError) {
|
|
155
|
-
return this.waitForChunk().then(() => {
|
|
156
|
-
return this.readTabNameToken();
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
throw err;
|
|
160
|
-
}
|
|
161
|
-
this.position = result.offset;
|
|
162
|
-
return result.value;
|
|
163
|
-
}
|
|
164
|
-
readColInfoToken() {
|
|
165
|
-
let result;
|
|
166
|
-
try {
|
|
167
|
-
result = (0, _colinfoTokenParser.default)(this.buffer, this.position, this.options);
|
|
168
|
-
} catch (err) {
|
|
169
|
-
if (err instanceof _helpers.NotEnoughDataError) {
|
|
170
|
-
return this.waitForChunk().then(() => {
|
|
171
|
-
return this.readColInfoToken();
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
throw err;
|
|
197
|
+
throw new Error('Unknown type: ' + type);
|
|
175
198
|
}
|
|
176
|
-
this.position = result.offset;
|
|
177
|
-
return result.value;
|
|
178
|
-
}
|
|
179
|
-
async readNbcRowToken() {
|
|
180
|
-
return await (0, _nbcrowTokenParser.default)(this);
|
|
181
|
-
}
|
|
182
|
-
async readReturnValueToken() {
|
|
183
|
-
return await (0, _returnvalueTokenParser.default)(this);
|
|
184
|
-
}
|
|
185
|
-
async readColMetadataToken() {
|
|
186
|
-
const token = await (0, _colmetadataTokenParser.default)(this);
|
|
187
|
-
this.colMetadata = token.columns;
|
|
188
|
-
return token;
|
|
189
|
-
}
|
|
190
|
-
readSSPIToken() {
|
|
191
|
-
let result;
|
|
192
|
-
try {
|
|
193
|
-
result = (0, _sspiTokenParser.default)(this.buffer, this.position, this.options);
|
|
194
|
-
} catch (err) {
|
|
195
|
-
if (err instanceof _helpers.NotEnoughDataError) {
|
|
196
|
-
return this.waitForChunk().then(() => {
|
|
197
|
-
return this.readSSPIToken();
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
throw err;
|
|
201
|
-
}
|
|
202
|
-
this.position = result.offset;
|
|
203
|
-
return result.value;
|
|
204
|
-
}
|
|
205
|
-
readFedAuthInfoToken() {
|
|
206
|
-
let result;
|
|
207
|
-
try {
|
|
208
|
-
result = (0, _fedauthInfoParser.default)(this.buffer, this.position, this.options);
|
|
209
|
-
} catch (err) {
|
|
210
|
-
if (err instanceof _helpers.NotEnoughDataError) {
|
|
211
|
-
return this.waitForChunk().then(() => {
|
|
212
|
-
return this.readFedAuthInfoToken();
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
throw err;
|
|
216
|
-
}
|
|
217
|
-
this.position = result.offset;
|
|
218
|
-
return result.value;
|
|
219
|
-
}
|
|
220
|
-
readOrderToken() {
|
|
221
|
-
let result;
|
|
222
|
-
try {
|
|
223
|
-
result = (0, _orderTokenParser.default)(this.buffer, this.position, this.options);
|
|
224
|
-
} catch (err) {
|
|
225
|
-
if (err instanceof _helpers.NotEnoughDataError) {
|
|
226
|
-
return this.waitForChunk().then(() => {
|
|
227
|
-
return this.readOrderToken();
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
throw err;
|
|
231
|
-
}
|
|
232
|
-
this.position = result.offset;
|
|
233
|
-
return result.value;
|
|
234
199
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
try {
|
|
238
|
-
result = (0, _returnstatusTokenParser.default)(this.buffer, this.position, this.options);
|
|
239
|
-
} catch (err) {
|
|
240
|
-
if (err instanceof _helpers.NotEnoughDataError) {
|
|
241
|
-
return this.waitForChunk().then(() => {
|
|
242
|
-
return this.readReturnStatusToken();
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
throw err;
|
|
246
|
-
}
|
|
200
|
+
parseToken(parser) {
|
|
201
|
+
const result = parser(this.buffer, this.position + 1, this.options);
|
|
247
202
|
this.position = result.offset;
|
|
248
203
|
return result.value;
|
|
249
204
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
} catch (err) {
|
|
255
|
-
if (err instanceof _helpers.NotEnoughDataError) {
|
|
256
|
-
return this.waitForChunk().then(() => {
|
|
257
|
-
return this.readLoginAckToken();
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
throw err;
|
|
261
|
-
}
|
|
262
|
-
this.position = result.offset;
|
|
263
|
-
return result.value;
|
|
264
|
-
}
|
|
265
|
-
readEnvChangeToken() {
|
|
266
|
-
let result;
|
|
267
|
-
try {
|
|
268
|
-
result = (0, _envChangeTokenParser.default)(this.buffer, this.position, this.options);
|
|
269
|
-
} catch (err) {
|
|
270
|
-
if (err instanceof _helpers.NotEnoughDataError) {
|
|
271
|
-
return this.waitForChunk().then(() => {
|
|
272
|
-
return this.readEnvChangeToken();
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
throw err;
|
|
276
|
-
}
|
|
277
|
-
this.position = result.offset;
|
|
278
|
-
return result.value;
|
|
279
|
-
}
|
|
280
|
-
readRowToken() {
|
|
281
|
-
return (0, _rowTokenParser.default)(this);
|
|
282
|
-
}
|
|
283
|
-
readInfoToken() {
|
|
284
|
-
let result;
|
|
285
|
-
try {
|
|
286
|
-
result = (0, _infoerrorTokenParser.infoParser)(this.buffer, this.position, this.options);
|
|
287
|
-
} catch (err) {
|
|
288
|
-
if (err instanceof _helpers.NotEnoughDataError) {
|
|
289
|
-
return this.waitForChunk().then(() => {
|
|
290
|
-
return this.readInfoToken();
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
throw err;
|
|
294
|
-
}
|
|
295
|
-
this.position = result.offset;
|
|
296
|
-
return result.value;
|
|
297
|
-
}
|
|
298
|
-
readErrorToken() {
|
|
299
|
-
let result;
|
|
300
|
-
try {
|
|
301
|
-
result = (0, _infoerrorTokenParser.errorParser)(this.buffer, this.position, this.options);
|
|
302
|
-
} catch (err) {
|
|
303
|
-
if (err instanceof _helpers.NotEnoughDataError) {
|
|
304
|
-
return this.waitForChunk().then(() => {
|
|
305
|
-
return this.readErrorToken();
|
|
306
|
-
});
|
|
307
|
-
}
|
|
308
|
-
throw err;
|
|
309
|
-
}
|
|
310
|
-
this.position = result.offset;
|
|
311
|
-
return result.value;
|
|
312
|
-
}
|
|
313
|
-
readDoneInProcToken() {
|
|
314
|
-
let result;
|
|
315
|
-
try {
|
|
316
|
-
result = (0, _doneTokenParser.doneInProcParser)(this.buffer, this.position, this.options);
|
|
317
|
-
} catch (err) {
|
|
318
|
-
if (err instanceof _helpers.NotEnoughDataError) {
|
|
319
|
-
return this.waitForChunk().then(() => {
|
|
320
|
-
return this.readDoneInProcToken();
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
throw err;
|
|
324
|
-
}
|
|
325
|
-
this.position = result.offset;
|
|
326
|
-
return result.value;
|
|
327
|
-
}
|
|
328
|
-
readDoneProcToken() {
|
|
329
|
-
let result;
|
|
330
|
-
try {
|
|
331
|
-
result = (0, _doneTokenParser.doneProcParser)(this.buffer, this.position, this.options);
|
|
332
|
-
} catch (err) {
|
|
333
|
-
if (err instanceof _helpers.NotEnoughDataError) {
|
|
334
|
-
return this.waitForChunk().then(() => {
|
|
335
|
-
return this.readDoneProcToken();
|
|
336
|
-
});
|
|
337
|
-
}
|
|
338
|
-
throw err;
|
|
339
|
-
}
|
|
340
|
-
this.position = result.offset;
|
|
341
|
-
return result.value;
|
|
342
|
-
}
|
|
343
|
-
readDoneToken() {
|
|
344
|
-
let result;
|
|
345
|
-
try {
|
|
346
|
-
result = (0, _doneTokenParser.doneParser)(this.buffer, this.position, this.options);
|
|
347
|
-
} catch (err) {
|
|
348
|
-
if (err instanceof _helpers.NotEnoughDataError) {
|
|
349
|
-
return this.waitForChunk().then(() => {
|
|
350
|
-
return this.readDoneToken();
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
throw err;
|
|
354
|
-
}
|
|
355
|
-
this.position = result.offset;
|
|
356
|
-
return result.value;
|
|
357
|
-
}
|
|
358
|
-
constructor(iterable, debug, options) {
|
|
359
|
-
this.debug = debug;
|
|
360
|
-
this.colMetadata = [];
|
|
361
|
-
this.options = options;
|
|
362
|
-
this.iterator = (iterable[Symbol.asyncIterator] || iterable[Symbol.iterator]).call(iterable);
|
|
363
|
-
this.buffer = Buffer.alloc(0);
|
|
364
|
-
this.position = 0;
|
|
365
|
-
}
|
|
366
|
-
async waitForChunk() {
|
|
367
|
-
const result = await this.iterator.next();
|
|
368
|
-
if (result.done) {
|
|
369
|
-
throw new Error('unexpected end of data');
|
|
370
|
-
}
|
|
371
|
-
if (this.position === this.buffer.length) {
|
|
372
|
-
this.buffer = result.value;
|
|
373
|
-
} else {
|
|
374
|
-
this.buffer = Buffer.concat([this.buffer.slice(this.position), result.value]);
|
|
375
|
-
}
|
|
376
|
-
this.position = 0;
|
|
205
|
+
startTokenReader(reader) {
|
|
206
|
+
this.position += 1;
|
|
207
|
+
this.tokenReader = reader;
|
|
208
|
+
return reader.read(this);
|
|
377
209
|
}
|
|
378
210
|
}
|
|
379
211
|
var _default = exports.default = Parser;
|
|
380
212
|
module.exports = Parser;
|
|
381
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdG9rZW4iLCJyZXF1aXJlIiwiX2NvbGluZm9Ub2tlblBhcnNlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29sbWV0YWRhdGFUb2tlblBhcnNlciIsIl9kb25lVG9rZW5QYXJzZXIiLCJfZW52Q2hhbmdlVG9rZW5QYXJzZXIiLCJfaW5mb2Vycm9yVG9rZW5QYXJzZXIiLCJfZmVkYXV0aEluZm9QYXJzZXIiLCJfZmVhdHVyZUV4dEFja1BhcnNlciIsIl9sb2dpbmFja1Rva2VuUGFyc2VyIiwiX29yZGVyVG9rZW5QYXJzZXIiLCJfcmV0dXJuc3RhdHVzVG9rZW5QYXJzZXIiLCJfcmV0dXJudmFsdWVUb2tlblBhcnNlciIsIl9yb3dUb2tlblBhcnNlciIsIl9uYmNyb3dUb2tlblBhcnNlciIsIl9zc3BpVG9rZW5QYXJzZXIiLCJfdGFibmFtZVRva2VuUGFyc2VyIiwiX2hlbHBlcnMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJQYXJzZXIiLCJkZWJ1ZyIsImNvbE1ldGFkYXRhIiwib3B0aW9ucyIsIml0ZXJhdG9yIiwiYnVmZmVyIiwicG9zaXRpb24iLCJwYXJzZVRva2VucyIsIml0ZXJhYmxlIiwicGFyc2VyIiwid2FpdEZvckNodW5rIiwiZXJyIiwibGVuZ3RoIiwidHlwZSIsInJlYWRVSW50OCIsInRva2VuIiwicmVhZFRva2VuIiwidW5kZWZpbmVkIiwiVFlQRSIsIkRPTkUiLCJyZWFkRG9uZVRva2VuIiwiRE9ORVBST0MiLCJyZWFkRG9uZVByb2NUb2tlbiIsIkRPTkVJTlBST0MiLCJyZWFkRG9uZUluUHJvY1Rva2VuIiwiRVJST1IiLCJyZWFkRXJyb3JUb2tlbiIsIklORk8iLCJyZWFkSW5mb1Rva2VuIiwiRU5WQ0hBTkdFIiwicmVhZEVudkNoYW5nZVRva2VuIiwiTE9HSU5BQ0siLCJyZWFkTG9naW5BY2tUb2tlbiIsIlJFVFVSTlNUQVRVUyIsInJlYWRSZXR1cm5TdGF0dXNUb2tlbiIsIk9SREVSIiwicmVhZE9yZGVyVG9rZW4iLCJGRURBVVRISU5GTyIsInJlYWRGZWRBdXRoSW5mb1Rva2VuIiwiU1NQSSIsInJlYWRTU1BJVG9rZW4iLCJDT0xNRVRBREFUQSIsInJlYWRDb2xNZXRhZGF0YVRva2VuIiwiUkVUVVJOVkFMVUUiLCJyZWFkUmV0dXJuVmFsdWVUb2tlbiIsIlJPVyIsInJlYWRSb3dUb2tlbiIsIk5CQ1JPVyIsInJlYWROYmNSb3dUb2tlbiIsIkZFQVRVUkVFWFRBQ0siLCJyZWFkRmVhdHVyZUV4dEFja1Rva2VuIiwiVEFCTkFNRSIsInJlYWRUYWJOYW1lVG9rZW4iLCJDT0xJTkZPIiwicmVhZENvbEluZm9Ub2tlbiIsIkVycm9yIiwicmVzdWx0IiwiZmVhdHVyZUV4dEFja1BhcnNlciIsIk5vdEVub3VnaERhdGFFcnJvciIsInRoZW4iLCJvZmZzZXQiLCJ2YWx1ZSIsInRhYk5hbWVQYXJzZXIiLCJjb2xJbmZvUGFyc2VyIiwibmJjUm93UGFyc2VyIiwicmV0dXJuVmFsdWVQYXJzZXIiLCJjb2xNZXRhZGF0YVBhcnNlciIsImNvbHVtbnMiLCJzc3BpUGFyc2VyIiwiZmVkQXV0aEluZm9QYXJzZXIiLCJvcmRlclBhcnNlciIsInJldHVyblN0YXR1c1BhcnNlciIsImxvZ2luQWNrUGFyc2VyIiwiZW52Q2hhbmdlUGFyc2VyIiwicm93UGFyc2VyIiwiaW5mb1BhcnNlciIsImVycm9yUGFyc2VyIiwiZG9uZUluUHJvY1BhcnNlciIsImRvbmVQcm9jUGFyc2VyIiwiZG9uZVBhcnNlciIsImNvbnN0cnVjdG9yIiwiU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsImNhbGwiLCJCdWZmZXIiLCJhbGxvYyIsIm5leHQiLCJkb25lIiwiY29uY2F0Iiwic2xpY2UiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJtb2R1bGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9rZW4vc3RyZWFtLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGVidWcgZnJvbSAnLi4vZGVidWcnO1xuaW1wb3J0IHsgdHlwZSBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5cbmltcG9ydCB7IFRZUEUsIENvbEluZm9Ub2tlbiwgQ29sTWV0YWRhdGFUb2tlbiwgRG9uZVByb2NUb2tlbiwgRG9uZVRva2VuLCBEb25lSW5Qcm9jVG9rZW4sIEVycm9yTWVzc2FnZVRva2VuLCBJbmZvTWVzc2FnZVRva2VuLCBSb3dUb2tlbiwgdHlwZSBFbnZDaGFuZ2VUb2tlbiwgTG9naW5BY2tUb2tlbiwgUmV0dXJuU3RhdHVzVG9rZW4sIE9yZGVyVG9rZW4sIEZlZEF1dGhJbmZvVG9rZW4sIFNTUElUb2tlbiwgUmV0dXJuVmFsdWVUb2tlbiwgTkJDUm93VG9rZW4sIEZlYXR1cmVFeHRBY2tUb2tlbiwgVGFiTmFtZVRva2VuLCBUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuXG5pbXBvcnQgY29sSW5mb1BhcnNlciBmcm9tICcuL2NvbGluZm8tdG9rZW4tcGFyc2VyJztcbmltcG9ydCBjb2xNZXRhZGF0YVBhcnNlciwgeyB0eXBlIENvbHVtbk1ldGFkYXRhIH0gZnJvbSAnLi9jb2xtZXRhZGF0YS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHsgZG9uZVBhcnNlciwgZG9uZUluUHJvY1BhcnNlciwgZG9uZVByb2NQYXJzZXIgfSBmcm9tICcuL2RvbmUtdG9rZW4tcGFyc2VyJztcbmltcG9ydCBlbnZDaGFuZ2VQYXJzZXIgZnJvbSAnLi9lbnYtY2hhbmdlLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgeyBlcnJvclBhcnNlciwgaW5mb1BhcnNlciB9IGZyb20gJy4vaW5mb2Vycm9yLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgZmVkQXV0aEluZm9QYXJzZXIgZnJvbSAnLi9mZWRhdXRoLWluZm8tcGFyc2VyJztcbmltcG9ydCBmZWF0dXJlRXh0QWNrUGFyc2VyIGZyb20gJy4vZmVhdHVyZS1leHQtYWNrLXBhcnNlcic7XG5pbXBvcnQgbG9naW5BY2tQYXJzZXIgZnJvbSAnLi9sb2dpbmFjay10b2tlbi1wYXJzZXInO1xuaW1wb3J0IG9yZGVyUGFyc2VyIGZyb20gJy4vb3JkZXItdG9rZW4tcGFyc2VyJztcbmltcG9ydCByZXR1cm5TdGF0dXNQYXJzZXIgZnJvbSAnLi9yZXR1cm5zdGF0dXMtdG9rZW4tcGFyc2VyJztcbmltcG9ydCByZXR1cm5WYWx1ZVBhcnNlciBmcm9tICcuL3JldHVybnZhbHVlLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgcm93UGFyc2VyIGZyb20gJy4vcm93LXRva2VuLXBhcnNlcic7XG5pbXBvcnQgbmJjUm93UGFyc2VyIGZyb20gJy4vbmJjcm93LXRva2VuLXBhcnNlcic7XG5pbXBvcnQgc3NwaVBhcnNlciBmcm9tICcuL3NzcGktdG9rZW4tcGFyc2VyJztcbmltcG9ydCB0YWJOYW1lUGFyc2VyIGZyb20gJy4vdGFibmFtZS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHsgTm90RW5vdWdoRGF0YUVycm9yIH0gZnJvbSAnLi9oZWxwZXJzJztcblxuZXhwb3J0IHR5cGUgUGFyc2VyT3B0aW9ucyA9IFBpY2s8SW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucywgJ3VzZVVUQycgfCAnbG93ZXJDYXNlR3VpZHMnIHwgJ3Rkc1ZlcnNpb24nIHwgJ3VzZUNvbHVtbk5hbWVzJyB8ICdjb2x1bW5OYW1lUmVwbGFjZXInIHwgJ2NhbWVsQ2FzZUNvbHVtbnMnPjtcblxuY2xhc3MgUGFyc2VyIHtcbiAgZGVidWc6IERlYnVnO1xuICBjb2xNZXRhZGF0YTogQ29sdW1uTWV0YWRhdGFbXTtcbiAgb3B0aW9uczogUGFyc2VyT3B0aW9ucztcblxuICBpdGVyYXRvcjogQXN5bmNJdGVyYXRvcjxCdWZmZXIsIGFueSwgdW5kZWZpbmVkPiB8IEl0ZXJhdG9yPEJ1ZmZlciwgYW55LCB1bmRlZmluZWQ+O1xuICBidWZmZXI6IEJ1ZmZlcjtcbiAgcG9zaXRpb246IG51bWJlcjtcblxuICBzdGF0aWMgYXN5bmMgKnBhcnNlVG9rZW5zKGl0ZXJhYmxlOiBBc3luY0l0ZXJhYmxlPEJ1ZmZlcj4gfCBJdGVyYWJsZTxCdWZmZXI+LCBkZWJ1ZzogRGVidWcsIG9wdGlvbnM6IFBhcnNlck9wdGlvbnMsIGNvbE1ldGFkYXRhOiBDb2x1bW5NZXRhZGF0YVtdID0gW10pIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGl0ZXJhYmxlLCBkZWJ1Zywgb3B0aW9ucyk7XG4gICAgcGFyc2VyLmNvbE1ldGFkYXRhID0gY29sTWV0YWRhdGE7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcGFyc2VyLndhaXRGb3JDaHVuaygpO1xuICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgIGlmIChwYXJzZXIucG9zaXRpb24gPT09IHBhcnNlci5idWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocGFyc2VyLmJ1ZmZlci5sZW5ndGggPj0gcGFyc2VyLnBvc2l0aW9uICsgMSkge1xuICAgICAgICBjb25zdCB0eXBlID0gcGFyc2VyLmJ1ZmZlci5yZWFkVUludDgocGFyc2VyLnBvc2l0aW9uKTtcbiAgICAgICAgcGFyc2VyLnBvc2l0aW9uICs9IDE7XG5cbiAgICAgICAgY29uc3QgdG9rZW4gPSBwYXJzZXIucmVhZFRva2VuKHR5cGUpO1xuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVhZFRva2VuKHR5cGU6IG51bWJlcik6IFRva2VuIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxUb2tlbiB8IHVuZGVmaW5lZD4ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUWVBFLkRPTkU6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZERvbmVUb2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuRE9ORVBST0M6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZERvbmVQcm9jVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLkRPTkVJTlBST0M6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZERvbmVJblByb2NUb2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuRVJST1I6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEVycm9yVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLklORk86IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEluZm9Ub2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuRU5WQ0hBTkdFOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRFbnZDaGFuZ2VUb2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuTE9HSU5BQ0s6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZExvZ2luQWNrVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLlJFVFVSTlNUQVRVUzoge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkUmV0dXJuU3RhdHVzVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLk9SREVSOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRPcmRlclRva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVFlQRS5GRURBVVRISU5GTzoge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmVkQXV0aEluZm9Ub2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuU1NQSToge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkU1NQSVRva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVFlQRS5DT0xNRVRBREFUQToge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkQ29sTWV0YWRhdGFUb2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuUkVUVVJOVkFMVUU6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFJldHVyblZhbHVlVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLlJPVzoge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkUm93VG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLk5CQ1JPVzoge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkTmJjUm93VG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLkZFQVRVUkVFWFRBQ0s6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEZlYXR1cmVFeHRBY2tUb2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuVEFCTkFNRToge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkVGFiTmFtZVRva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVFlQRS5DT0xJTkZPOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRDb2xJbmZvVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdHlwZTogJyArIHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlYWRGZWF0dXJlRXh0QWNrVG9rZW4oKTogRmVhdHVyZUV4dEFja1Rva2VuIHwgUHJvbWlzZTxGZWF0dXJlRXh0QWNrVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGZlYXR1cmVFeHRBY2tQYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RFbm91Z2hEYXRhRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdEZvckNodW5rKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEZlYXR1cmVFeHRBY2tUb2tlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICByZWFkVGFiTmFtZVRva2VuKCk6IFRhYk5hbWVUb2tlbiB8IFByb21pc2U8VGFiTmFtZVRva2VuPiB7XG4gICAgbGV0IHJlc3VsdDtcblxuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSB0YWJOYW1lUGFyc2VyKHRoaXMuYnVmZmVyLCB0aGlzLnBvc2l0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JDaHVuaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRUYWJOYW1lVG9rZW4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gcmVzdWx0Lm9mZnNldDtcbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG5cbiAgcmVhZENvbEluZm9Ub2tlbigpOiBDb2xJbmZvVG9rZW4gfCBQcm9taXNlPENvbEluZm9Ub2tlbj4ge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gY29sSW5mb1BhcnNlcih0aGlzLmJ1ZmZlciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yQ2h1bmsoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkQ29sSW5mb1Rva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIGFzeW5jIHJlYWROYmNSb3dUb2tlbigpOiBQcm9taXNlPE5CQ1Jvd1Rva2VuPiB7XG4gICAgcmV0dXJuIGF3YWl0IG5iY1Jvd1BhcnNlcih0aGlzKTtcbiAgfVxuXG4gIGFzeW5jIHJlYWRSZXR1cm5WYWx1ZVRva2VuKCk6IFByb21pc2U8UmV0dXJuVmFsdWVUb2tlbj4ge1xuICAgIHJldHVybiBhd2FpdCByZXR1cm5WYWx1ZVBhcnNlcih0aGlzKTtcbiAgfVxuXG4gIGFzeW5jIHJlYWRDb2xNZXRhZGF0YVRva2VuKCk6IFByb21pc2U8Q29sTWV0YWRhdGFUb2tlbj4ge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgY29sTWV0YWRhdGFQYXJzZXIodGhpcyk7XG4gICAgdGhpcy5jb2xNZXRhZGF0YSA9IHRva2VuLmNvbHVtbnM7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgcmVhZFNTUElUb2tlbigpOiBTU1BJVG9rZW4gfCBQcm9taXNlPFNTUElUb2tlbj4ge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gc3NwaVBhcnNlcih0aGlzLmJ1ZmZlciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yQ2h1bmsoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkU1NQSVRva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWRGZWRBdXRoSW5mb1Rva2VuKCk6IEZlZEF1dGhJbmZvVG9rZW4gfCBQcm9taXNlPEZlZEF1dGhJbmZvVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGZlZEF1dGhJbmZvUGFyc2VyKHRoaXMuYnVmZmVyLCB0aGlzLnBvc2l0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JDaHVuaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRGZWRBdXRoSW5mb1Rva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWRPcmRlclRva2VuKCk6IE9yZGVyVG9rZW4gfCBQcm9taXNlPE9yZGVyVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IG9yZGVyUGFyc2VyKHRoaXMuYnVmZmVyLCB0aGlzLnBvc2l0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JDaHVuaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRPcmRlclRva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWRSZXR1cm5TdGF0dXNUb2tlbigpOiBSZXR1cm5TdGF0dXNUb2tlbiB8IFByb21pc2U8UmV0dXJuU3RhdHVzVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IHJldHVyblN0YXR1c1BhcnNlcih0aGlzLmJ1ZmZlciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yQ2h1bmsoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkUmV0dXJuU3RhdHVzVG9rZW4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gcmVzdWx0Lm9mZnNldDtcbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG5cbiAgcmVhZExvZ2luQWNrVG9rZW4oKTogTG9naW5BY2tUb2tlbiB8IFByb21pc2U8TG9naW5BY2tUb2tlbj4ge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gbG9naW5BY2tQYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RFbm91Z2hEYXRhRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdEZvckNodW5rKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVhZExvZ2luQWNrVG9rZW4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gcmVzdWx0Lm9mZnNldDtcbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG5cbiAgcmVhZEVudkNoYW5nZVRva2VuKCk6IEVudkNoYW5nZVRva2VuIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxFbnZDaGFuZ2VUb2tlbiB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZW52Q2hhbmdlUGFyc2VyKHRoaXMuYnVmZmVyLCB0aGlzLnBvc2l0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JDaHVuaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRFbnZDaGFuZ2VUb2tlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICByZWFkUm93VG9rZW4oKTogUm93VG9rZW4gfCBQcm9taXNlPFJvd1Rva2VuPiB7XG4gICAgcmV0dXJuIHJvd1BhcnNlcih0aGlzKTtcbiAgfVxuXG4gIHJlYWRJbmZvVG9rZW4oKTogSW5mb01lc3NhZ2VUb2tlbiB8IFByb21pc2U8SW5mb01lc3NhZ2VUb2tlbj4ge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gaW5mb1BhcnNlcih0aGlzLmJ1ZmZlciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yQ2h1bmsoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkSW5mb1Rva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWRFcnJvclRva2VuKCk6IEVycm9yTWVzc2FnZVRva2VuIHwgUHJvbWlzZTxFcnJvck1lc3NhZ2VUb2tlbj4ge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZXJyb3JQYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RFbm91Z2hEYXRhRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdEZvckNodW5rKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEVycm9yVG9rZW4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gcmVzdWx0Lm9mZnNldDtcbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG5cbiAgcmVhZERvbmVJblByb2NUb2tlbigpOiBEb25lSW5Qcm9jVG9rZW4gfCBQcm9taXNlPERvbmVJblByb2NUb2tlbj4ge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZG9uZUluUHJvY1BhcnNlcih0aGlzLmJ1ZmZlciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yQ2h1bmsoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkRG9uZUluUHJvY1Rva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWREb25lUHJvY1Rva2VuKCk6IERvbmVQcm9jVG9rZW4gfCBQcm9taXNlPERvbmVQcm9jVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGRvbmVQcm9jUGFyc2VyKHRoaXMuYnVmZmVyLCB0aGlzLnBvc2l0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JDaHVuaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlYWREb25lUHJvY1Rva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWREb25lVG9rZW4oKTogRG9uZVRva2VuIHwgUHJvbWlzZTxEb25lVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGRvbmVQYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RFbm91Z2hEYXRhRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdEZvckNodW5rKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVhZERvbmVUb2tlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihpdGVyYWJsZTogQXN5bmNJdGVyYWJsZTxCdWZmZXI+IHwgSXRlcmFibGU8QnVmZmVyPiwgZGVidWc6IERlYnVnLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zKSB7XG4gICAgdGhpcy5kZWJ1ZyA9IGRlYnVnO1xuICAgIHRoaXMuY29sTWV0YWRhdGEgPSBbXTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgdGhpcy5pdGVyYXRvciA9ICgoaXRlcmFibGUgYXMgQXN5bmNJdGVyYWJsZTxCdWZmZXI+KVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gfHwgKGl0ZXJhYmxlIGFzIEl0ZXJhYmxlPEJ1ZmZlcj4pW1N5bWJvbC5pdGVyYXRvcl0pLmNhbGwoaXRlcmFibGUpO1xuXG4gICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgdGhpcy5wb3NpdGlvbiA9IDA7XG4gIH1cblxuICBhc3luYyB3YWl0Rm9yQ2h1bmsoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5pdGVyYXRvci5uZXh0KCk7XG4gICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgZW5kIG9mIGRhdGEnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wb3NpdGlvbiA9PT0gdGhpcy5idWZmZXIubGVuZ3RoKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IHJlc3VsdC52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmJ1ZmZlci5zbGljZSh0aGlzLnBvc2l0aW9uKSwgcmVzdWx0LnZhbHVlXSk7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IDA7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGFyc2VyO1xubW9kdWxlLmV4cG9ydHMgPSBQYXJzZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLG1CQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyx1QkFBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksZ0JBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLHFCQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTSxxQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sa0JBQUEsR0FBQUwsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFRLG9CQUFBLEdBQUFOLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUyxvQkFBQSxHQUFBUCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVUsaUJBQUEsR0FBQVIsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFXLHdCQUFBLEdBQUFULHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBWSx1QkFBQSxHQUFBVixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQWEsZUFBQSxHQUFBWCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQWMsa0JBQUEsR0FBQVosc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFlLGdCQUFBLEdBQUFiLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBZ0IsbUJBQUEsR0FBQWQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFpQixRQUFBLEdBQUFqQixPQUFBO0FBQStDLFNBQUFFLHVCQUFBZ0IsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FB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
|
|
213
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdG9rZW4iLCJyZXF1aXJlIiwiX2NvbGluZm9Ub2tlblBhcnNlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29sbWV0YWRhdGFUb2tlblBhcnNlciIsIl9kb25lVG9rZW5QYXJzZXIiLCJfZW52Q2hhbmdlVG9rZW5QYXJzZXIiLCJfaW5mb2Vycm9yVG9rZW5QYXJzZXIiLCJfZmVkYXV0aEluZm9QYXJzZXIiLCJfZmVhdHVyZUV4dEFja1BhcnNlciIsIl9sb2dpbmFja1Rva2VuUGFyc2VyIiwiX29yZGVyVG9rZW5QYXJzZXIiLCJfcmV0dXJuc3RhdHVzVG9rZW5QYXJzZXIiLCJfcmV0dXJudmFsdWVUb2tlblBhcnNlciIsIl9yb3dUb2tlblBhcnNlciIsIl9uYmNyb3dUb2tlblBhcnNlciIsIl9zc3BpVG9rZW5QYXJzZXIiLCJfdGFibmFtZVRva2VuUGFyc2VyIiwiX2hlbHBlcnMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJQYXJzZXIiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjb2xNZXRhZGF0YSIsImJ1ZmZlciIsIkJ1ZmZlciIsImFsbG9jIiwicG9zaXRpb24iLCJwZW5kaW5nIiwicGVuZGluZ0xlbmd0aCIsImJ5dGVzTmVlZGVkIiwidG9rZW5SZWFkZXIiLCJ1bmRlZmluZWQiLCJwYXJzZVRva2VucyIsIml0ZXJhYmxlIiwicGFyc2VyIiwiY2h1bmsiLCJ3cml0ZSIsInRva2VuIiwicmVhZCIsImVuZCIsInB1c2giLCJsZW5ndGgiLCJhcHBlbmRQZW5kaW5nIiwicmVhZFRva2VuIiwiZXJyIiwiTm90RW5vdWdoRGF0YUVycm9yIiwiTWF0aCIsIm1heCIsImJ5dGVDb3VudCIsIkVycm9yIiwicmVtYWluaW5nIiwidW5zaGlmdCIsInN1YmFycmF5IiwiY29uY2F0IiwidHlwZSIsIlRZUEUiLCJET05FIiwicGFyc2VUb2tlbiIsImRvbmVQYXJzZXIiLCJET05FUFJPQyIsImRvbmVQcm9jUGFyc2VyIiwiRE9ORUlOUFJPQyIsImRvbmVJblByb2NQYXJzZXIiLCJFUlJPUiIsImVycm9yUGFyc2VyIiwiSU5GTyIsImluZm9QYXJzZXIiLCJFTlZDSEFOR0UiLCJlbnZDaGFuZ2VQYXJzZXIiLCJMT0dJTkFDSyIsImxvZ2luQWNrUGFyc2VyIiwiUkVUVVJOU1RBVFVTIiwicmV0dXJuU3RhdHVzUGFyc2VyIiwiT1JERVIiLCJvcmRlclBhcnNlciIsIkZFREFVVEhJTkZPIiwiZmVkQXV0aEluZm9QYXJzZXIiLCJTU1BJIiwic3NwaVBhcnNlciIsIkZFQVRVUkVFWFRBQ0siLCJmZWF0dXJlRXh0QWNrUGFyc2VyIiwiVEFCTkFNRSIsInRhYk5hbWVQYXJzZXIiLCJDT0xJTkZPIiwiY29sSW5mb1BhcnNlciIsIkNPTE1FVEFEQVRBIiwic3RhcnRUb2tlblJlYWRlciIsIkNvbE1ldGFkYXRhVG9rZW5SZWFkZXIiLCJSRVRVUk5WQUxVRSIsIlJldHVyblZhbHVlVG9rZW5SZWFkZXIiLCJST1ciLCJSb3dUb2tlblJlYWRlciIsIk5CQ1JPVyIsIk5CQ1Jvd1Rva2VuUmVhZGVyIiwicmVzdWx0Iiwib2Zmc2V0IiwidmFsdWUiLCJyZWFkZXIiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJtb2R1bGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9rZW4vc3RyZWFtLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMgfSBmcm9tICcuLi9jb25uZWN0aW9uJztcblxuaW1wb3J0IHsgVFlQRSwgdHlwZSBUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuXG5pbXBvcnQgY29sSW5mb1BhcnNlciBmcm9tICcuL2NvbGluZm8tdG9rZW4tcGFyc2VyJztcbmltcG9ydCB7IENvbE1ldGFkYXRhVG9rZW5SZWFkZXIsIHR5cGUgQ29sdW1uTWV0YWRhdGEgfSBmcm9tICcuL2NvbG1ldGFkYXRhLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgeyBkb25lUGFyc2VyLCBkb25lSW5Qcm9jUGFyc2VyLCBkb25lUHJvY1BhcnNlciB9IGZyb20gJy4vZG9uZS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IGVudkNoYW5nZVBhcnNlciBmcm9tICcuL2Vudi1jaGFuZ2UtdG9rZW4tcGFyc2VyJztcbmltcG9ydCB7IGVycm9yUGFyc2VyLCBpbmZvUGFyc2VyIH0gZnJvbSAnLi9pbmZvZXJyb3ItdG9rZW4tcGFyc2VyJztcbmltcG9ydCBmZWRBdXRoSW5mb1BhcnNlciBmcm9tICcuL2ZlZGF1dGgtaW5mby1wYXJzZXInO1xuaW1wb3J0IGZlYXR1cmVFeHRBY2tQYXJzZXIgZnJvbSAnLi9mZWF0dXJlLWV4dC1hY2stcGFyc2VyJztcbmltcG9ydCBsb2dpbkFja1BhcnNlciBmcm9tICcuL2xvZ2luYWNrLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgb3JkZXJQYXJzZXIgZnJvbSAnLi9vcmRlci10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHJldHVyblN0YXR1c1BhcnNlciBmcm9tICcuL3JldHVybnN0YXR1cy10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHsgUmV0dXJuVmFsdWVUb2tlblJlYWRlciB9IGZyb20gJy4vcmV0dXJudmFsdWUtdG9rZW4tcGFyc2VyJztcbmltcG9ydCB7IFJvd1Rva2VuUmVhZGVyIH0gZnJvbSAnLi9yb3ctdG9rZW4tcGFyc2VyJztcbmltcG9ydCB7IE5CQ1Jvd1Rva2VuUmVhZGVyIH0gZnJvbSAnLi9uYmNyb3ctdG9rZW4tcGFyc2VyJztcbmltcG9ydCBzc3BpUGFyc2VyIGZyb20gJy4vc3NwaS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHRhYk5hbWVQYXJzZXIgZnJvbSAnLi90YWJuYW1lLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgeyBOb3RFbm91Z2hEYXRhRXJyb3IsIHR5cGUgUmVzdWx0IH0gZnJvbSAnLi9oZWxwZXJzJztcblxuZXhwb3J0IHR5cGUgUGFyc2VyT3B0aW9ucyA9IFBpY2s8SW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucywgJ3VzZVVUQycgfCAnbG93ZXJDYXNlR3VpZHMnIHwgJ3Rkc1ZlcnNpb24nIHwgJ3VzZUNvbHVtbk5hbWVzJyB8ICdjb2x1bW5OYW1lUmVwbGFjZXInIHwgJ2NhbWVsQ2FzZUNvbHVtbnMnPjtcblxuLyoqXG4gKiBQYXJzZXMgYSB0b2tlbiB0aGF0IGlzIHNob3J0IGVub3VnaCB0byBzaW1wbHkgYmUgcGFyc2VkIGFnYWluIGZyb20gaXRzXG4gKiBzdGFydCBpZiBpdCBpcyBub3QgZnVsbHkgYXZhaWxhYmxlIHlldC5cbiAqL1xudHlwZSBUb2tlblBhcnNlciA9IChidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIG9wdGlvbnM6IFBhcnNlck9wdGlvbnMpID0+IFJlc3VsdDxUb2tlbiB8IHVuZGVmaW5lZD47XG5cbi8qKlxuICogUGFyc2VzIGEgdG9rZW4gdGhhdCBjYW4gZ3JvdyBhcmJpdHJhcmlseSBsYXJnZSwgYW5kIHRodXMgbmVlZHMgdG8gYmUgcGFyc2VkXG4gKiBpbmNyZW1lbnRhbGx5LlxuICpcbiAqIFRoZSByZWFkZXIgc3RhcnRzIHBhcnNpbmcgcmlnaHQgYWZ0ZXIgdGhlIHRva2VuJ3MgdHlwZSBieXRlIGFuZCBrZWVwcyBpdHNcbiAqIHByb2dyZXNzIGFjcm9zcyBjYWxsczogaWYgYHJlYWRgIHRocm93cyBhIGBOb3RFbm91Z2hEYXRhRXJyb3JgLCBpdCBpc1xuICogY2FsbGVkIGFnYWluIG9uY2UgbW9yZSBkYXRhIGhhcyBhcnJpdmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUmVhZGVyIHtcbiAgcmVhZChwYXJzZXI6IFBhcnNlcik6IFRva2VuO1xufVxuXG4vKipcbiAqIEEgcHVzaC1iYXNlZCBwYXJzZXIgZm9yIHRoZSB0b2tlbnMgY29udGFpbmVkIGluIGEgVERTIHRva2VuIHN0cmVhbS5cbiAqXG4gKiBEYXRhIGlzIHB1c2hlZCBpbnRvIHRoZSBwYXJzZXIgYXMgaXQgYXJyaXZlcyB2aWEgYHdyaXRlYCwgYW5kIHBhcnNlZCB0b2tlbnNcbiAqIGFyZSBwdWxsZWQgb3V0IHZpYSBgcmVhZGAuIFRva2VucyBhcmUgcGFyc2VkIGxhemlseSwgb25lIGF0IGEgdGltZSwgc28gYW55XG4gKiBlZmZlY3RzIG9mIGhhbmRsaW5nIGEgdG9rZW4gKGUuZy4gdGhlIFREUyB2ZXJzaW9uIG5lZ290aWF0ZWQgdmlhIHRoZVxuICogYExPR0lOQUNLYCB0b2tlbikgYXBwbHkgdG8gdGhlIHBhcnNpbmcgb2YgYWxsIHRva2VucyB0aGF0IGZvbGxvdyBpdC5cbiAqL1xuY2xhc3MgUGFyc2VyIHtcbiAgZGVjbGFyZSBvcHRpb25zOiBQYXJzZXJPcHRpb25zO1xuICBkZWNsYXJlIGNvbE1ldGFkYXRhOiBDb2x1bW5NZXRhZGF0YVtdO1xuXG4gIC8vIFRoZSBkYXRhIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHBhcnNlZCwgYW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3RcbiAgLy8gYnl0ZSBpbiBpdCB0aGF0IGhhcyBub3QgYmVlbiBjb25zdW1lZCB5ZXQuXG4gIGRlY2xhcmUgYnVmZmVyOiBCdWZmZXI7XG4gIGRlY2xhcmUgcG9zaXRpb246IG51bWJlcjtcblxuICAvLyBDaHVua3MgdGhhdCB3ZXJlIHdyaXR0ZW4sIGJ1dCBub3QgeWV0IGFwcGVuZGVkIHRvIGBidWZmZXJgLlxuICBkZWNsYXJlIHBlbmRpbmc6IEJ1ZmZlcltdO1xuICBkZWNsYXJlIHBlbmRpbmdMZW5ndGg6IG51bWJlcjtcblxuICAvLyBUaGUgbnVtYmVyIG9mIHVuY29uc3VtZWQgYnl0ZXMgcmVxdWlyZWQgZm9yIHBhcnNpbmcgdG8gbWFrZSBwcm9ncmVzcy5cbiAgLy9cbiAgLy8gSW5jb21wbGV0ZSBkYXRhIGlzIG5vdCBhcHBlbmRlZCB0byBgYnVmZmVyYCB1bnRpbCBhdCBsZWFzdCB0aGlzIG1hbnlcbiAgLy8gYnl0ZXMgYXJlIGF2YWlsYWJsZSwgc28gdGhhdCBhIGxhcmdlIHRva2VuIGFycml2aW5nIGFjcm9zcyBtYW55IGNodW5rcyBpc1xuICAvLyBub3QgcGFyc2VkIGFnYWluIChhbmQgY29waWVkIGFnYWluKSBmb3IgZXZlcnkgY2h1bmsuXG4gIGRlY2xhcmUgYnl0ZXNOZWVkZWQ6IG51bWJlcjtcblxuICAvLyBUaGUgcmVhZGVyIG9mIGFuIGluY3JlbWVudGFsbHkgcGFyc2VkIHRva2VuIHRoYXQgaXMgbm90IGNvbXBsZXRlIHlldC5cbiAgZGVjbGFyZSB0b2tlblJlYWRlcjogVG9rZW5SZWFkZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUGFyc2VyT3B0aW9ucywgY29sTWV0YWRhdGE6IENvbHVtbk1ldGFkYXRhW10gPSBbXSkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5jb2xNZXRhZGF0YSA9IGNvbE1ldGFkYXRhO1xuXG4gICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgdGhpcy5wb3NpdGlvbiA9IDA7XG5cbiAgICB0aGlzLnBlbmRpbmcgPSBbXTtcbiAgICB0aGlzLnBlbmRpbmdMZW5ndGggPSAwO1xuXG4gICAgdGhpcy5ieXRlc05lZWRlZCA9IDE7XG4gICAgdGhpcy50b2tlblJlYWRlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbGwgdG9rZW5zIGZyb20gdGhlIGdpdmVuIGNodW5rcyBvZiBkYXRhLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jICpwYXJzZVRva2VucyhpdGVyYWJsZTogQXN5bmNJdGVyYWJsZTxCdWZmZXI+IHwgSXRlcmFibGU8QnVmZmVyPiwgb3B0aW9uczogUGFyc2VyT3B0aW9ucywgY29sTWV0YWRhdGE/OiBDb2x1bW5NZXRhZGF0YVtdKTogQXN5bmNHZW5lcmF0b3I8VG9rZW4sIHZvaWQsIHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIob3B0aW9ucywgY29sTWV0YWRhdGEpO1xuXG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBpdGVyYWJsZSkge1xuICAgICAgcGFyc2VyLndyaXRlKGNodW5rKTtcblxuICAgICAgbGV0IHRva2VuO1xuICAgICAgd2hpbGUgKCh0b2tlbiA9IHBhcnNlci5yZWFkKCkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgeWllbGQgdG9rZW47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VyLmVuZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNodW5rIG9mIGRhdGEgdG8gYmUgcGFyc2VkLlxuICAgKi9cbiAgd3JpdGUoY2h1bms6IEJ1ZmZlcikge1xuICAgIHRoaXMucGVuZGluZy5wdXNoKGNodW5rKTtcbiAgICB0aGlzLnBlbmRpbmdMZW5ndGggKz0gY2h1bmsubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSBuZXh0IHRva2VuLCBvciByZXR1cm4gYHVuZGVmaW5lZGAgaWYgbW9yZSBkYXRhIG5lZWRzIHRvIGJlXG4gICAqIHdyaXR0ZW4gZmlyc3QuXG4gICAqL1xuICByZWFkKCk6IFRva2VuIHwgdW5kZWZpbmVkIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCAtIHRoaXMucG9zaXRpb24gPCB0aGlzLmJ5dGVzTmVlZGVkICYmICF0aGlzLmFwcGVuZFBlbmRpbmcoKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBsZXQgdG9rZW47XG4gICAgICB0cnkge1xuICAgICAgICB0b2tlbiA9IHRoaXMudG9rZW5SZWFkZXIgIT09IHVuZGVmaW5lZCA/IHRoaXMudG9rZW5SZWFkZXIucmVhZCh0aGlzKSA6IHRoaXMucmVhZFRva2VuKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICAgIC8vIEFsd2F5cyB3YWl0IGZvciBhdCBsZWFzdCBvbmUgbW9yZSBieXRlLCBzbyBwYXJzaW5nIG5ldmVyIHJldHJpZXNcbiAgICAgICAgICAvLyB3aXRob3V0IG5ldyBkYXRhLlxuICAgICAgICAgIHRoaXMuYnl0ZXNOZWVkZWQgPSBNYXRoLm1heChlcnIuYnl0ZUNvdW50LCB0aGlzLmJ1ZmZlci5sZW5ndGggKyAxKSAtIHRoaXMucG9zaXRpb247XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudG9rZW5SZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmJ5dGVzTmVlZGVkID0gMTtcblxuICAgICAgLy8gU29tZSB0b2tlbnMgKGUuZy4gdW5rbm93biBgRU5WQ0hBTkdFYCB0eXBlcykgYXJlIHNraXBwZWQuXG4gICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25hbCB0aGF0IGFsbCBkYXRhIHdhcyB3cml0dGVuLlxuICAgKlxuICAgKiBUaHJvd3MgaWYgdGhlIGRhdGEgZW5kZWQgaW4gdGhlIG1pZGRsZSBvZiBhIHRva2VuLlxuICAgKi9cbiAgZW5kKCkge1xuICAgIGlmICh0aGlzLnRva2VuUmVhZGVyICE9PSB1bmRlZmluZWQgfHwgdGhpcy5wb3NpdGlvbiA8IHRoaXMuYnVmZmVyLmxlbmd0aCB8fCB0aGlzLnBlbmRpbmdMZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgZW5kIG9mIGRhdGEnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kIHRoZSBwZW5kaW5nIGNodW5rcyB0byB0aGUgdW5jb25zdW1lZCBkYXRhLCBpZiB0aGF0IG1ha2VzIGVub3VnaFxuICAgKiBkYXRhIGF2YWlsYWJsZSBmb3IgcGFyc2luZyB0byBtYWtlIHByb2dyZXNzLlxuICAgKi9cbiAgYXBwZW5kUGVuZGluZygpOiBib29sZWFuIHtcbiAgICBjb25zdCByZW1haW5pbmcgPSB0aGlzLmJ1ZmZlci5sZW5ndGggLSB0aGlzLnBvc2l0aW9uO1xuICAgIGlmIChyZW1haW5pbmcgKyB0aGlzLnBlbmRpbmdMZW5ndGggPCB0aGlzLmJ5dGVzTmVlZGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHJlbWFpbmluZyA9PT0gMCAmJiB0aGlzLnBlbmRpbmcubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMucGVuZGluZ1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wZW5kaW5nLnVuc2hpZnQodGhpcy5idWZmZXIuc3ViYXJyYXkodGhpcy5wb3NpdGlvbikpO1xuICAgICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuY29uY2F0KHRoaXMucGVuZGluZywgcmVtYWluaW5nICsgdGhpcy5wZW5kaW5nTGVuZ3RoKTtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICB0aGlzLnBlbmRpbmcgPSBbXTtcbiAgICB0aGlzLnBlbmRpbmdMZW5ndGggPSAwO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZWFkVG9rZW4oKTogVG9rZW4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uXTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUWVBFLkRPTkU6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVG9rZW4oZG9uZVBhcnNlcik7XG5cbiAgICAgIGNhc2UgVFlQRS5ET05FUFJPQzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUb2tlbihkb25lUHJvY1BhcnNlcik7XG5cbiAgICAgIGNhc2UgVFlQRS5ET05FSU5QUk9DOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVRva2VuKGRvbmVJblByb2NQYXJzZXIpO1xuXG4gICAgICBjYXNlIFRZUEUuRVJST1I6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVG9rZW4oZXJyb3JQYXJzZXIpO1xuXG4gICAgICBjYXNlIFRZUEUuSU5GTzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUb2tlbihpbmZvUGFyc2VyKTtcblxuICAgICAgY2FzZSBUWVBFLkVOVkNIQU5HRTpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUb2tlbihlbnZDaGFuZ2VQYXJzZXIpO1xuXG4gICAgICBjYXNlIFRZUEUuTE9HSU5BQ0s6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVG9rZW4obG9naW5BY2tQYXJzZXIpO1xuXG4gICAgICBjYXNlIFRZUEUuUkVUVVJOU1RBVFVTOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVRva2VuKHJldHVyblN0YXR1c1BhcnNlcik7XG5cbiAgICAgIGNhc2UgVFlQRS5PUkRFUjpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUb2tlbihvcmRlclBhcnNlcik7XG5cbiAgICAgIGNhc2UgVFlQRS5GRURBVVRISU5GTzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUb2tlbihmZWRBdXRoSW5mb1BhcnNlcik7XG5cbiAgICAgIGNhc2UgVFlQRS5TU1BJOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVRva2VuKHNzcGlQYXJzZXIpO1xuXG4gICAgICBjYXNlIFRZUEUuRkVBVFVSRUVYVEFDSzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUb2tlbihmZWF0dXJlRXh0QWNrUGFyc2VyKTtcblxuICAgICAgY2FzZSBUWVBFLlRBQk5BTUU6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVG9rZW4odGFiTmFtZVBhcnNlcik7XG5cbiAgICAgIGNhc2UgVFlQRS5DT0xJTkZPOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVRva2VuKGNvbEluZm9QYXJzZXIpO1xuXG4gICAgICBjYXNlIFRZUEUuQ09MTUVUQURBVEE6XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0VG9rZW5SZWFkZXIobmV3IENvbE1ldGFkYXRhVG9rZW5SZWFkZXIoKSk7XG5cbiAgICAgIGNhc2UgVFlQRS5SRVRVUk5WQUxVRTpcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRUb2tlblJlYWRlcihuZXcgUmV0dXJuVmFsdWVUb2tlblJlYWRlcigpKTtcblxuICAgICAgY2FzZSBUWVBFLlJPVzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRUb2tlblJlYWRlcihuZXcgUm93VG9rZW5SZWFkZXIoKSk7XG5cbiAgICAgIGNhc2UgVFlQRS5OQkNST1c6XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0VG9rZW5SZWFkZXIobmV3IE5CQ1Jvd1Rva2VuUmVhZGVyKCkpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdHlwZTogJyArIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlVG9rZW4ocGFyc2VyOiBUb2tlblBhcnNlcik6IFRva2VuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24gKyAxLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICBzdGFydFRva2VuUmVhZGVyKHJlYWRlcjogVG9rZW5SZWFkZXIpOiBUb2tlbiB7XG4gICAgdGhpcy5wb3NpdGlvbiArPSAxO1xuICAgIHRoaXMudG9rZW5SZWFkZXIgPSByZWFkZXI7XG4gICAgcmV0dXJuIHJlYWRlci5yZWFkKHRoaXMpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhcnNlcjtcbm1vZHVsZS5leHBvcnRzID0gUGFyc2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxtQkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsdUJBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGdCQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxxQkFBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU0scUJBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGtCQUFBLEdBQUFMLHNC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
|