utxo-lib 1.0.7 → 1.0.9
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/src/base_crypto.d.ts +14 -0
- package/dist/src/base_crypto.d.ts.map +1 -0
- package/dist/src/base_crypto.js +215 -0
- package/dist/src/bitgo/Musig2.js +2 -3
- package/dist/src/bitgo/UtxoPsbt.js +12 -20
- package/dist/src/bitgo/UtxoTransaction.js +2 -2
- package/dist/src/bitgo/outputScripts.js +3 -3
- package/dist/src/bitgo/parseInput.js +2 -2
- package/dist/src/bitgo/psbt/scriptTypes.js +3 -3
- package/dist/src/bitgo/wallet/chains.d.ts +1 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.js +2 -3
- package/dist/src/bitgo/zcash/ZcashTransaction.js +2 -2
- package/dist/src/musig.d.ts +391 -0
- package/dist/src/musig.d.ts.map +1 -0
- package/dist/src/musig.js +461 -0
- package/dist/src/noble_ecc.d.ts +1 -1
- package/dist/src/noble_ecc.d.ts.map +1 -1
- package/dist/src/noble_ecc.js +5 -5
- package/dist/src/payments/p2tr.js +9 -13
- package/dist/src/payments/p2tr_ns.js +2 -3
- package/dist/src/taproot.js +2 -3
- package/dist/src/transaction_builder.js +2 -2
- package/package.json +1 -2
@@ -0,0 +1,461 @@
|
|
1
|
+
"use strict";
|
2
|
+
/*! musig-js - MIT License (c) 2022 Brandon Black */
|
3
|
+
// https://github.com/ElementsProject/secp256k1-zkp/blob/master/doc/musig-spec.mediawiki
|
4
|
+
// Roughly based on the secp256k1-zkp implementation
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.MuSigFactory = void 0;
|
7
|
+
const TAGS = {
|
8
|
+
challenge: 'BIP0340/challenge',
|
9
|
+
keyagg_list: 'KeyAgg list',
|
10
|
+
keyagg_coef: 'KeyAgg coefficient',
|
11
|
+
musig_aux: 'MuSig/aux',
|
12
|
+
musig_nonce: 'MuSig/nonce',
|
13
|
+
musig_deterministic_nonce: 'MuSig/deterministic/nonce',
|
14
|
+
musig_noncecoef: 'MuSig/noncecoef',
|
15
|
+
};
|
16
|
+
/**
|
17
|
+
* Compares two 32-byte Uint8Arrays in byte order.
|
18
|
+
* @returns < 0, 0, > 0 if a is < b, === b or > b respectively
|
19
|
+
*/
|
20
|
+
function compare32b(a, b) {
|
21
|
+
if (a.length !== 32 || b.length !== 32)
|
22
|
+
throw new Error('Invalid array');
|
23
|
+
const aD = new DataView(a.buffer, a.byteOffset, a.length);
|
24
|
+
const bD = new DataView(b.buffer, b.byteOffset, b.length);
|
25
|
+
for (let i = 0; i < 8; i++) {
|
26
|
+
const cmp = aD.getUint32(i * 4) - bD.getUint32(i * 4);
|
27
|
+
if (cmp !== 0)
|
28
|
+
return cmp;
|
29
|
+
}
|
30
|
+
return 0;
|
31
|
+
}
|
32
|
+
/**
|
33
|
+
* Compares two 33-byte Uint8Arrays in byte order.
|
34
|
+
* @returns < 0, 0, > 0 if a is < b, === b or > b respectively
|
35
|
+
*/
|
36
|
+
function compare33b(a, b) {
|
37
|
+
if (a.length !== 33 || b.length !== 33)
|
38
|
+
throw new Error('Invalid array');
|
39
|
+
const cmp = a[0] - b[0];
|
40
|
+
if (cmp !== 0)
|
41
|
+
return cmp;
|
42
|
+
return compare32b(a.subarray(1), b.subarray(1));
|
43
|
+
}
|
44
|
+
const makeSessionId = typeof self === 'object' && (self.crypto || self.msCrypto)
|
45
|
+
? () => (self.crypto || self.msCrypto).getRandomValues(new Uint8Array(32)) // Browsers
|
46
|
+
: () => require('crypto').randomBytes(32); // Node
|
47
|
+
const _keyAggCache = new WeakMap();
|
48
|
+
// Caches coefficients associated with an array of public keys
|
49
|
+
const _coefCache = new WeakMap();
|
50
|
+
// Caches secret nonces. We do this internally to help users ensure that they
|
51
|
+
// do not reuse a secret nonce.
|
52
|
+
const _nonceCache = new WeakMap();
|
53
|
+
// Caches signing sessions. We do this internally to help users ensure that
|
54
|
+
// these session values were generated on the signer, and are not accepted from
|
55
|
+
// an untrusted third party.
|
56
|
+
const _sessionCache = new WeakMap();
|
57
|
+
function MuSigFactory(ecc) {
|
58
|
+
const CPOINT_INF = new Uint8Array(33);
|
59
|
+
const SCALAR_0 = new Uint8Array(32);
|
60
|
+
const SCALAR_1 = new Uint8Array(32);
|
61
|
+
SCALAR_1[31] = 1;
|
62
|
+
const SCALAR_MINUS_1 = ecc.scalarNegate(SCALAR_1);
|
63
|
+
function keyAggCoeff(publicKeys, publicKey) {
|
64
|
+
let coefCache = _coefCache.get(publicKeys);
|
65
|
+
if (coefCache === undefined) {
|
66
|
+
coefCache = new Map();
|
67
|
+
_coefCache.set(publicKeys, coefCache);
|
68
|
+
}
|
69
|
+
let coefficient = coefCache.get(publicKey);
|
70
|
+
if (coefficient)
|
71
|
+
return coefficient;
|
72
|
+
coefficient = SCALAR_1;
|
73
|
+
let secondPublicKey;
|
74
|
+
let publicKeyHash;
|
75
|
+
let keyAggCache = _keyAggCache.get(publicKeys);
|
76
|
+
if (keyAggCache === undefined) {
|
77
|
+
// Index of the first occurrence of the second unique public key.
|
78
|
+
const pkIdx2 = publicKeys.findIndex((pk) => compare33b(pk, publicKeys[0]) !== 0);
|
79
|
+
secondPublicKey = publicKeys[pkIdx2]; // undefined if pkIdx2 === -1
|
80
|
+
publicKeyHash = ecc.taggedHash(TAGS.keyagg_list, ...publicKeys);
|
81
|
+
keyAggCache = { publicKeyHash, secondPublicKey };
|
82
|
+
_keyAggCache.set(publicKeys, keyAggCache);
|
83
|
+
}
|
84
|
+
else {
|
85
|
+
({ publicKeyHash, secondPublicKey } = keyAggCache);
|
86
|
+
}
|
87
|
+
if (secondPublicKey === undefined || compare33b(publicKey, secondPublicKey) !== 0)
|
88
|
+
coefficient = ecc.taggedHash(TAGS.keyagg_coef, publicKeyHash, publicKey);
|
89
|
+
coefCache.set(publicKey, coefficient);
|
90
|
+
return coefficient;
|
91
|
+
}
|
92
|
+
function addTweak(ctx, t) {
|
93
|
+
const tweak = 'tweak' in t ? t : { tweak: t };
|
94
|
+
if (!ecc.isScalar(tweak.tweak))
|
95
|
+
throw new TypeError('Expected tweak to be a valid scalar with curve order');
|
96
|
+
let { gacc, tacc } = ctx;
|
97
|
+
let aggPublicKey = ctx.aggPublicKey;
|
98
|
+
if (!ecc.hasEvenY(aggPublicKey) && tweak.xOnly) {
|
99
|
+
// g = -1
|
100
|
+
gacc = ecc.scalarNegate(gacc); // g * gacc mod n
|
101
|
+
tacc = ecc.scalarNegate(tacc); // g * tacc mod n
|
102
|
+
aggPublicKey = ecc.pointNegate(aggPublicKey); // g * Q
|
103
|
+
}
|
104
|
+
aggPublicKey = ecc.pointAddTweak(aggPublicKey, tweak.tweak, false); // g * Q + t * G
|
105
|
+
if (aggPublicKey === null)
|
106
|
+
throw new Error('Unexpected point at infinity during tweaking');
|
107
|
+
tacc = ecc.scalarAdd(tweak.tweak, tacc); // t + g * tacc mod n
|
108
|
+
return { aggPublicKey, gacc, tacc };
|
109
|
+
}
|
110
|
+
function keyAgg(publicKeys, ...tweaks) {
|
111
|
+
checkArgs({ publicKeys });
|
112
|
+
const multipliedPublicKeys = publicKeys.map((publicKey) => {
|
113
|
+
const coefficient = keyAggCoeff(publicKeys, publicKey);
|
114
|
+
let multipliedPublicKey;
|
115
|
+
if (compare32b(coefficient, SCALAR_1) === 0) {
|
116
|
+
multipliedPublicKey = publicKey;
|
117
|
+
}
|
118
|
+
else {
|
119
|
+
multipliedPublicKey = ecc.pointMultiplyUnsafe(publicKey, coefficient, false);
|
120
|
+
}
|
121
|
+
if (multipliedPublicKey === null)
|
122
|
+
throw new Error('Point at infinity during aggregation');
|
123
|
+
return multipliedPublicKey;
|
124
|
+
});
|
125
|
+
const aggPublicKey = multipliedPublicKeys.reduce((a, b) => {
|
126
|
+
const next = ecc.pointAdd(a, b, false);
|
127
|
+
if (next === null)
|
128
|
+
throw new Error('Point at infinity during aggregation');
|
129
|
+
return next;
|
130
|
+
});
|
131
|
+
return tweaks.reduce((ctx, tweak) => addTweak(ctx, tweak), {
|
132
|
+
aggPublicKey,
|
133
|
+
gacc: SCALAR_1,
|
134
|
+
tacc: SCALAR_0,
|
135
|
+
});
|
136
|
+
}
|
137
|
+
function getSessionValues(sessionKey) {
|
138
|
+
const sessionValues = _sessionCache.get(sessionKey);
|
139
|
+
if (!sessionValues)
|
140
|
+
throw new Error('Invalid session key, please call `startSigningSession`');
|
141
|
+
return sessionValues;
|
142
|
+
}
|
143
|
+
function nonceAgg(publicNonces) {
|
144
|
+
checkArgs({ publicNonces });
|
145
|
+
const aggNonces = [
|
146
|
+
publicNonces[0].subarray(0, 33),
|
147
|
+
publicNonces[0].subarray(33),
|
148
|
+
];
|
149
|
+
for (let i = 1; i < publicNonces.length; i++) {
|
150
|
+
if (aggNonces[0] !== null)
|
151
|
+
aggNonces[0] = ecc.pointAdd(aggNonces[0], publicNonces[i].subarray(0, 33), false);
|
152
|
+
if (aggNonces[1] !== null)
|
153
|
+
aggNonces[1] = ecc.pointAdd(aggNonces[1], publicNonces[i].subarray(33), false);
|
154
|
+
}
|
155
|
+
const aggNonce = new Uint8Array(66);
|
156
|
+
if (aggNonces[0] !== null)
|
157
|
+
aggNonce.set(ecc.pointCompress(aggNonces[0]), 0);
|
158
|
+
if (aggNonces[1] !== null)
|
159
|
+
aggNonce.set(ecc.pointCompress(aggNonces[1]), 33);
|
160
|
+
return aggNonce;
|
161
|
+
}
|
162
|
+
function startSigningSessionInner(aggNonce, msg, publicKeys, ctx) {
|
163
|
+
const pubKeyX = ecc.pointX(ctx.aggPublicKey);
|
164
|
+
const coefficient = ecc.taggedHash(TAGS.musig_noncecoef, aggNonce, pubKeyX, msg);
|
165
|
+
const aggNonces = [aggNonce.subarray(0, 33), aggNonce.subarray(33)];
|
166
|
+
// This is kinda ugly, but crypto.pointAdd doesn't work on 0-coded infinity
|
167
|
+
let r = null;
|
168
|
+
if (compare33b(aggNonces[1], CPOINT_INF) !== 0 && compare33b(aggNonces[0], CPOINT_INF) !== 0) {
|
169
|
+
r = ecc.pointMultiplyAndAddUnsafe(aggNonces[1], coefficient, aggNonces[0], false);
|
170
|
+
}
|
171
|
+
else if (compare33b(aggNonces[0], CPOINT_INF) !== 0) {
|
172
|
+
r = ecc.pointCompress(aggNonces[0], false);
|
173
|
+
}
|
174
|
+
else if (compare33b(aggNonces[1], CPOINT_INF) !== 0) {
|
175
|
+
r = ecc.pointMultiplyUnsafe(aggNonces[1], coefficient, false);
|
176
|
+
}
|
177
|
+
if (r === null)
|
178
|
+
r = ecc.getPublicKey(SCALAR_1, false);
|
179
|
+
if (r === null)
|
180
|
+
throw new Error('Failed to get G');
|
181
|
+
const challenge = ecc.scalarMod(ecc.taggedHash(TAGS.challenge, ecc.pointX(r), pubKeyX, msg));
|
182
|
+
const key = { publicKey: ctx.aggPublicKey, aggNonce, msg };
|
183
|
+
_sessionCache.set(key, { ...ctx, coefficient, challenge, finalNonce: r, publicKeys });
|
184
|
+
return key;
|
185
|
+
}
|
186
|
+
function partialVerifyInner({ sig, publicKey, publicNonces, sessionKey, }) {
|
187
|
+
const { msg } = sessionKey;
|
188
|
+
const { aggPublicKey, gacc, challenge, coefficient, finalNonce, publicKeys } = getSessionValues(sessionKey);
|
189
|
+
const rePrime = ecc.pointMultiplyAndAddUnsafe(publicNonces[1], coefficient, publicNonces[0], false);
|
190
|
+
if (rePrime === null)
|
191
|
+
throw new Error('Unexpected public nonce at infinity');
|
192
|
+
const re = ecc.hasEvenY(finalNonce) ? rePrime : ecc.pointNegate(rePrime);
|
193
|
+
const a = keyAggCoeff(publicKeys, publicKey);
|
194
|
+
const g = ecc.hasEvenY(aggPublicKey) ? gacc : ecc.scalarNegate(gacc);
|
195
|
+
const ea = ecc.scalarMultiply(challenge, a);
|
196
|
+
const eag = ecc.scalarMultiply(ea, g);
|
197
|
+
const ver = ecc.pointMultiplyAndAddUnsafe(publicKey, eag, re, true);
|
198
|
+
if (ver === null)
|
199
|
+
throw new Error('Unexpected verification point at infinity');
|
200
|
+
const sG = ecc.getPublicKey(sig, true);
|
201
|
+
if (sG === null)
|
202
|
+
throw new Error('Unexpected signature point at infinity');
|
203
|
+
return compare33b(ver, sG) === 0;
|
204
|
+
}
|
205
|
+
function partialSignInner({ secretKey, publicKey, secretNonces, sessionKey, }) {
|
206
|
+
const { msg } = sessionKey;
|
207
|
+
const { aggPublicKey, gacc, challenge, coefficient, finalNonce, publicKeys } = getSessionValues(sessionKey);
|
208
|
+
const [k1, k2] = secretNonces.map((k) => (ecc.hasEvenY(finalNonce) ? k : ecc.scalarNegate(k)));
|
209
|
+
const a = keyAggCoeff(publicKeys, publicKey);
|
210
|
+
const g = ecc.hasEvenY(aggPublicKey) ? gacc : ecc.scalarNegate(gacc);
|
211
|
+
const d = ecc.scalarMultiply(g, secretKey);
|
212
|
+
const bk2 = ecc.scalarMultiply(coefficient, k2);
|
213
|
+
const k1bk2 = ecc.scalarAdd(k1, bk2);
|
214
|
+
const ea = ecc.scalarMultiply(challenge, a);
|
215
|
+
const ead = ecc.scalarMultiply(ea, d);
|
216
|
+
const sig = ecc.scalarAdd(k1bk2, ead);
|
217
|
+
return sig;
|
218
|
+
}
|
219
|
+
function partialSign({ secretKey, publicNonce, sessionKey, verify = true, }) {
|
220
|
+
checkArgs({ publicNonce, secretKey });
|
221
|
+
const secretNonce = _nonceCache.get(publicNonce);
|
222
|
+
if (secretNonce === undefined)
|
223
|
+
throw new Error('No secret nonce found for specified public nonce');
|
224
|
+
_nonceCache.delete(publicNonce);
|
225
|
+
const publicKey = ecc.getPublicKey(secretKey, true);
|
226
|
+
if (publicKey === null)
|
227
|
+
throw new Error('Invalid secret key, no corresponding public key');
|
228
|
+
if (compare33b(publicKey, secretNonce.subarray(64)) !== 0)
|
229
|
+
throw new Error('Secret nonce pubkey mismatch');
|
230
|
+
const secretNonces = [
|
231
|
+
secretNonce.subarray(0, 32),
|
232
|
+
secretNonce.subarray(32, 64),
|
233
|
+
];
|
234
|
+
const sig = partialSignInner({
|
235
|
+
secretKey,
|
236
|
+
publicKey,
|
237
|
+
secretNonces,
|
238
|
+
sessionKey,
|
239
|
+
});
|
240
|
+
if (verify) {
|
241
|
+
const publicNonces = [
|
242
|
+
publicNonce.subarray(0, 33),
|
243
|
+
publicNonce.subarray(33),
|
244
|
+
];
|
245
|
+
const valid = partialVerifyInner({
|
246
|
+
sig,
|
247
|
+
publicKey,
|
248
|
+
publicNonces,
|
249
|
+
sessionKey,
|
250
|
+
});
|
251
|
+
if (!valid)
|
252
|
+
throw new Error('Partial signature failed verification');
|
253
|
+
}
|
254
|
+
return sig;
|
255
|
+
}
|
256
|
+
function deterministicSign({ secretKey, aggOtherNonce, publicKeys, tweaks = [], msg, rand, verify = true, nonceOnly = false, }) {
|
257
|
+
// No need to check msg, its max size is larger than JS typed array limit
|
258
|
+
checkArgs({ rand, secretKey, aggOtherNonce });
|
259
|
+
const publicKey = ecc.getPublicKey(secretKey, true);
|
260
|
+
if (publicKey === null)
|
261
|
+
throw new Error('Secret key has no corresponding public key');
|
262
|
+
let secretKeyPrime;
|
263
|
+
if (rand !== undefined) {
|
264
|
+
secretKeyPrime = ecc.taggedHash(TAGS.musig_aux, rand);
|
265
|
+
for (let i = 0; i < 32; i++) {
|
266
|
+
secretKeyPrime[i] = secretKeyPrime[i] ^ secretKey[i];
|
267
|
+
}
|
268
|
+
}
|
269
|
+
else {
|
270
|
+
secretKeyPrime = secretKey;
|
271
|
+
}
|
272
|
+
const ctx = keyAgg(publicKeys, ...tweaks);
|
273
|
+
const aggPublicKey = ecc.pointX(ctx.aggPublicKey);
|
274
|
+
const mLength = new Uint8Array(8);
|
275
|
+
new DataView(mLength.buffer).setBigUint64(0, BigInt(msg.length));
|
276
|
+
const secretNonce = new Uint8Array(97);
|
277
|
+
const publicNonce = new Uint8Array(66);
|
278
|
+
for (let i = 0; i < 2; i++) {
|
279
|
+
const kH = ecc.taggedHash(TAGS.musig_deterministic_nonce, ...[secretKeyPrime, aggOtherNonce, aggPublicKey, mLength, msg, Uint8Array.of(i)]);
|
280
|
+
const k = ecc.scalarMod(kH);
|
281
|
+
if (compare32b(SCALAR_0, k) === 0)
|
282
|
+
throw new Error('0 secret nonce');
|
283
|
+
const pub = ecc.getPublicKey(k, true);
|
284
|
+
if (pub === null)
|
285
|
+
throw new Error('Secret nonce has no corresponding public nonce');
|
286
|
+
secretNonce.set(k, i * 32);
|
287
|
+
publicNonce.set(pub, i * 33);
|
288
|
+
}
|
289
|
+
secretNonce.set(publicKey, 64);
|
290
|
+
if (nonceOnly)
|
291
|
+
return { publicNonce };
|
292
|
+
_nonceCache.set(publicNonce, secretNonce);
|
293
|
+
const aggNonce = nonceAgg([aggOtherNonce, publicNonce]);
|
294
|
+
const sessionKey = startSigningSessionInner(aggNonce, msg, publicKeys, ctx);
|
295
|
+
const sig = partialSign({
|
296
|
+
secretKey,
|
297
|
+
publicNonce,
|
298
|
+
sessionKey,
|
299
|
+
verify,
|
300
|
+
});
|
301
|
+
return { sig, sessionKey, publicNonce };
|
302
|
+
}
|
303
|
+
// TODO: Improve arg checking now that we have startSigningSession
|
304
|
+
const pubKeyArgs = ['publicKey', 'publicKeys'];
|
305
|
+
const scalarArgs = ['tweak', 'sig', 'sigs', 'tacc', 'gacc'];
|
306
|
+
const otherArgs32b = ['xOnlyPublicKey', 'rand', 'sessionId'];
|
307
|
+
const args32b = ['secretKey', ...scalarArgs, ...otherArgs32b];
|
308
|
+
const pubNonceArgs = [
|
309
|
+
'publicNonce',
|
310
|
+
'publicNonces',
|
311
|
+
'aggNonce',
|
312
|
+
'aggOtherNonce',
|
313
|
+
'finalNonce',
|
314
|
+
];
|
315
|
+
const otherArgs = ['aggPublicKey', 'secretNonce'];
|
316
|
+
const argLengths = new Map();
|
317
|
+
args32b.forEach((a) => argLengths.set(a, 32));
|
318
|
+
pubKeyArgs.forEach((a) => argLengths.set(a, 33));
|
319
|
+
pubNonceArgs.forEach((a) => argLengths.set(a, 66));
|
320
|
+
argLengths.set('secretNonce', 97);
|
321
|
+
argLengths.set('aggPublicKey', 65);
|
322
|
+
const scalarNames = new Set();
|
323
|
+
scalarArgs.forEach((n) => scalarNames.add(n));
|
324
|
+
function checkArgs(args) {
|
325
|
+
for (let [name, values] of Object.entries(args)) {
|
326
|
+
if (values === undefined)
|
327
|
+
continue;
|
328
|
+
values = Array.isArray(values) ? values : [values];
|
329
|
+
if (values.length === 0)
|
330
|
+
throw new TypeError(`0-length ${name}s not supported`);
|
331
|
+
for (const value of values) {
|
332
|
+
if (argLengths.get(name) !== value.length)
|
333
|
+
throw new TypeError(`Invalid ${name} length (${value.length})`);
|
334
|
+
if (name === 'secretKey') {
|
335
|
+
if (!ecc.isSecret(value))
|
336
|
+
throw new TypeError(`Invalid secretKey`);
|
337
|
+
}
|
338
|
+
else if (name === 'secretNonce') {
|
339
|
+
for (let i = 0; i < 64; i += 32)
|
340
|
+
if (!ecc.isSecret(value.subarray(i, i + 32)))
|
341
|
+
throw new TypeError(`Invalid secretNonce`);
|
342
|
+
}
|
343
|
+
else if (scalarNames.has(name)) {
|
344
|
+
for (let i = 0; i < value.length; i += 32)
|
345
|
+
if (!ecc.isScalar(value.subarray(i, i + 32)))
|
346
|
+
throw new TypeError(`Invalid ${name}`);
|
347
|
+
}
|
348
|
+
// No need for a public key x-to-curve check. They're liftX'd for use any way.
|
349
|
+
}
|
350
|
+
}
|
351
|
+
}
|
352
|
+
return {
|
353
|
+
getXOnlyPubkey: (ctx) => {
|
354
|
+
if ('aggPublicKey' in ctx)
|
355
|
+
return ecc.pointX(ctx.aggPublicKey);
|
356
|
+
return ecc.pointX(getSessionValues(ctx).aggPublicKey);
|
357
|
+
},
|
358
|
+
getPlainPubkey: (ctx) => {
|
359
|
+
if ('aggPublicKey' in ctx)
|
360
|
+
return ecc.pointCompress(ctx.aggPublicKey);
|
361
|
+
return ecc.pointCompress(getSessionValues(ctx).aggPublicKey);
|
362
|
+
},
|
363
|
+
keySort: (publicKeys) => {
|
364
|
+
checkArgs({ publicKeys });
|
365
|
+
// do not modify the original array
|
366
|
+
return [...publicKeys].sort((a, b) => compare33b(a, b));
|
367
|
+
},
|
368
|
+
keyAgg,
|
369
|
+
addTweaks: (ctx, ...tweaks) => {
|
370
|
+
checkArgs(ctx);
|
371
|
+
return tweaks.reduce((c, tweak) => addTweak(c, tweak), ctx);
|
372
|
+
},
|
373
|
+
nonceGen: ({ sessionId = makeSessionId(), secretKey, publicKey, xOnlyPublicKey, msg, extraInput, }) => {
|
374
|
+
if (extraInput !== undefined && extraInput.length > Math.pow(2, 32) - 1)
|
375
|
+
throw new TypeError('extraInput is limited to 2^32-1 bytes');
|
376
|
+
// No need to check msg, its max size is larger than JS typed array limit
|
377
|
+
checkArgs({ sessionId, secretKey, publicKey, xOnlyPublicKey });
|
378
|
+
let rand;
|
379
|
+
if (secretKey !== undefined) {
|
380
|
+
rand = ecc.taggedHash(TAGS.musig_aux, sessionId);
|
381
|
+
for (let i = 0; i < 32; i++) {
|
382
|
+
rand[i] = rand[i] ^ secretKey[i];
|
383
|
+
}
|
384
|
+
}
|
385
|
+
else {
|
386
|
+
rand = sessionId;
|
387
|
+
}
|
388
|
+
if (xOnlyPublicKey === undefined)
|
389
|
+
xOnlyPublicKey = new Uint8Array();
|
390
|
+
const mPrefixed = [Uint8Array.of(0)];
|
391
|
+
if (msg !== undefined) {
|
392
|
+
mPrefixed[0][0] = 1;
|
393
|
+
mPrefixed.push(new Uint8Array(8));
|
394
|
+
new DataView(mPrefixed[1].buffer).setBigUint64(0, BigInt(msg.length));
|
395
|
+
mPrefixed.push(msg);
|
396
|
+
}
|
397
|
+
if (extraInput === undefined)
|
398
|
+
extraInput = new Uint8Array();
|
399
|
+
const eLength = new Uint8Array(4);
|
400
|
+
new DataView(eLength.buffer).setUint32(0, extraInput.length);
|
401
|
+
const secretNonce = new Uint8Array(97);
|
402
|
+
const publicNonce = new Uint8Array(66);
|
403
|
+
for (let i = 0; i < 2; i++) {
|
404
|
+
const kH = ecc.taggedHash(TAGS.musig_nonce, rand, Uint8Array.of(publicKey.length), publicKey, Uint8Array.of(xOnlyPublicKey.length), xOnlyPublicKey, ...mPrefixed, eLength, extraInput, Uint8Array.of(i));
|
405
|
+
const k = ecc.scalarMod(kH);
|
406
|
+
if (compare32b(SCALAR_0, k) === 0)
|
407
|
+
throw new Error('0 secret nonce');
|
408
|
+
const pub = ecc.getPublicKey(k, true);
|
409
|
+
if (pub === null)
|
410
|
+
throw new Error('Secret nonce has no corresponding public nonce');
|
411
|
+
secretNonce.set(k, i * 32);
|
412
|
+
publicNonce.set(pub, i * 33);
|
413
|
+
}
|
414
|
+
secretNonce.set(publicKey, 64);
|
415
|
+
_nonceCache.set(publicNonce, secretNonce);
|
416
|
+
return publicNonce;
|
417
|
+
},
|
418
|
+
addExternalNonce: (publicNonce, secretNonce) => {
|
419
|
+
checkArgs({ publicNonce, secretNonce });
|
420
|
+
_nonceCache.set(publicNonce, secretNonce);
|
421
|
+
},
|
422
|
+
deterministicNonceGen: (args) => deterministicSign({ ...args, nonceOnly: true }),
|
423
|
+
deterministicSign,
|
424
|
+
nonceAgg,
|
425
|
+
startSigningSession: (aggNonce, msg, publicKeys, ...tweaks) => {
|
426
|
+
checkArgs({ aggNonce });
|
427
|
+
const ctx = keyAgg(publicKeys, ...tweaks);
|
428
|
+
return startSigningSessionInner(aggNonce, msg, publicKeys, ctx);
|
429
|
+
},
|
430
|
+
partialSign,
|
431
|
+
partialVerify: ({ sig, publicKey, publicNonce, sessionKey, }) => {
|
432
|
+
checkArgs({ sig, publicKey, publicNonce });
|
433
|
+
const publicNonces = [
|
434
|
+
publicNonce.subarray(0, 33),
|
435
|
+
publicNonce.subarray(33),
|
436
|
+
];
|
437
|
+
const valid = partialVerifyInner({
|
438
|
+
sig,
|
439
|
+
publicKey,
|
440
|
+
publicNonces,
|
441
|
+
sessionKey,
|
442
|
+
});
|
443
|
+
return valid;
|
444
|
+
},
|
445
|
+
signAgg: (sigs, sessionKey) => {
|
446
|
+
checkArgs({ sigs });
|
447
|
+
const { aggPublicKey, tacc, challenge, finalNonce } = getSessionValues(sessionKey);
|
448
|
+
let sPart = ecc.scalarMultiply(challenge, tacc);
|
449
|
+
if (!ecc.hasEvenY(aggPublicKey)) {
|
450
|
+
sPart = ecc.scalarNegate(sPart);
|
451
|
+
}
|
452
|
+
const aggS = sigs.reduce((a, b) => ecc.scalarAdd(a, b), sPart);
|
453
|
+
const sig = new Uint8Array(64);
|
454
|
+
sig.set(ecc.pointX(finalNonce), 0);
|
455
|
+
sig.set(aggS, 32);
|
456
|
+
return sig;
|
457
|
+
},
|
458
|
+
};
|
459
|
+
}
|
460
|
+
exports.MuSigFactory = MuSigFactory;
|
461
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVzaWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXVzaWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9EQUFvRDtBQUNwRCx3RkFBd0Y7QUFDeEYsb0RBQW9EOzs7QUE0YnBELE1BQU0sSUFBSSxHQUFHO0lBQ1gsU0FBUyxFQUFFLG1CQUFtQjtJQUM5QixXQUFXLEVBQUUsYUFBYTtJQUMxQixXQUFXLEVBQUUsb0JBQW9CO0lBQ2pDLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLHlCQUF5QixFQUFFLDJCQUEyQjtJQUN0RCxlQUFlLEVBQUUsaUJBQWlCO0NBQzFCLENBQUM7QUFFWDs7O0dBR0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxDQUFhLEVBQUUsQ0FBYTtJQUM5QyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssRUFBRTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDekUsTUFBTSxFQUFFLEdBQUcsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxRCxNQUFNLEVBQUUsR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUIsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEQsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUFF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Q0FBQyxDQUFDO1FBRTVCLE1BQU0sU0FBUyxHQUE2QjtZQUMxQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0IsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7U0FDN0IsQ0FBQztRQUNGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUk7Z0JBQ3ZCLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRixJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJO2dCQUN2QixTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNsRjtRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUk7WUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSTtZQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxD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SSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQy9CLEtBQUssR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2pDO1lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9ELE1BQU0sR0FBRyxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsQixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQWhqQkQsb0NBZ2pCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qISBtdXNpZy1qcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIEJyYW5kb24gQmxhY2sgKi9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9FbGVtZW50c1Byb2plY3Qvc2VjcDI1NmsxLXprcC9ibG9iL21hc3Rlci9kb2MvbXVzaWctc3BlYy5tZWRpYXdpa2lcbi8vIFJvdWdobHkgYmFzZWQgb24gdGhlIHNlY3AyNTZrMS16a3AgaW1wbGVtZW50YXRpb25cblxuZXhwb3J0IGludGVyZmFjZSBNdVNpZyB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBYLW9ubHkgcHVibGljIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0gY3R4IHRoZSBrZXkgZ2VuIGNvbnRleHQgb3IgYSBzaWduaW5nIHNlc3Npb24ga2V5XG4gICAqIEByZXR1cm5zIHRoZSBYLW9ubHkgcHVibGljIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZXh0XG4gICAqL1xuICBnZXRYT25seVB1YmtleShjdHg6IEtleUdlbkNvbnRleHQgfCBTZXNzaW9uS2V5KTogVWludDhBcnJheTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgcGxhaW4gcHVibGljIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0gY3R4IHRoZSBrZXkgZ2VuIGNvbnRleHQgb3IgYSBzaWduaW5nIHNlc3Npb24ga2V5XG4gICAqIEByZXR1cm5zIHBsYWluIHB1YmxpYyBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dCBpbiBjb21wcmVzc2VkIERFUiBmb3JtYXRcbiAgICovXG4gIGdldFBsYWluUHVia2V5KGN0eDogS2V5R2VuQ29udGV4dCB8IFNlc3Npb25LZXkpOiBVaW50OEFycmF5O1xuXG4gIC8qKlxuICAgKiBTb3J0cyBjb21wcmVzc2VkIERFUiBmb3JtYXQgcHVibGljIGtleXMgbGV4aWNvZ3JhcGhpY2FsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBwdWJsaWNLZXlzIGFycmF5IG9mIGNvbXByZXNzZWQgREVSIGVuY29kZWQgcHVibGljIGtleXMgdG8gYWdncmVnYXRlXG4gICAqIEByZXR1cm5zIHNvcnRlZCBwdWJsaWMga2V5cyAoaW4gYSBuZXcgYXJyYXkpXG4gICAqL1xuICBrZXlTb3J0KHB1YmxpY0tleXM6IFVpbnQ4QXJyYXlbXSk6IFVpbnQ4QXJyYXlbXTtcblxuICAvKipcbiAgICogUGVyZm9ybXMgTXVTaWcga2V5IGFnZ3JlZ2F0aW9uIG9uIDErIHgtb25seSBwdWJsaWMga2V5cy5cbiAgICpcbiAgICogQHBhcmFtIHB1YmxpY0tleXMgYXJyYXkgb2YgY29tcHJlc3NlZCBERVIgZW5jb2RlZCBwdWJsaWMga2V5cyB0byBhZ2dyZWdhdGVcbiAgICogQHBhcmFtIHR3ZWFrcyB0d2Vha3MgKDAgPCB0d2VhayA8IG4pIHRvIGFwcGx5IHRvIHRoZSBhZ2dyZWdhdGUga2V5LFxuICAgKiBhbmQgb3B0aW9uYWxseSBib29sZWFucyB0byBpbmRpY2F0ZSB4LW9ubHkgdHdlYWtpbmdcbiAgICogQHJldHVybnMgYW4gb3BhcXVlIGtleSBnZW4gY29udGV4dCBmb3IgdXNlIHdpdGggb3RoZXIgTXVTaWcgb3BlcmF0aW9uc1xuICAgKi9cbiAga2V5QWdnKHB1YmxpY0tleXM6IFVpbnQ4QXJyYXlbXSwgLi4udHdlYWtzOiBUd2Vha1tdKTogS2V5R2VuQ29udGV4dDtcblxuICAvKipcbiAgICogQXBwbHkgb25lIG9yIG1vcmUgeC1vbmx5IG9yIG9yZGluYXJ5IHR3ZWFrcyB0byBhbiBhZ2dyZWdhdGUgcHVibGljIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGN0eCB0aGUga2V5IGdlbmVyYXRpb24gY29udGV4dCwgYXMgcmV0dXJuZWQgZnJvbSBga2V5QWdnYC5cbiAgICogQHBhcmFtIHR3ZWFrcyB0d2Vha3MgKDAgPCB0d2VhayA8IG4pIHRvIGFwcGx5IHRvIHRoZSBhZ2dyZWdhdGUga2V5LFxuICAgKiBhbmQgb3B0aW9uYWxseSBib29sZWFucyB0byBpbmRpY2F0ZSB4LW9ubHkgdHdlYWtpbmdcbiAgICogQHJldHVybnMgYW4gb3BhcXVlIGtleSBnZW4gY29udGV4dCBmb3IgdXNlIHdpdGggb3RoZXIgTXVTaWcgb3BlcmF0aW9uc1xuICAgKi9cbiAgYWRkVHdlYWtzKGN0eDogS2V5R2VuQ29udGV4dCwgLi4udHdlYWtzOiBUd2Vha1tdKTogS2V5R2VuQ29udGV4dDtcblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBNdVNpZyBub25jZSBwYWlyIGJhc2VkIG9uIHRoZSBwcm92aWRlZCB2YWx1ZXMuXG4gICAqXG4gICAqIFRoZSBjYWxsZXIgbXVzdCBub3QgdXNlIHRoZSBzYW1lIHNlc3Npb25JZCBmb3IgbXVsdGlwbGUgY2FsbHMgdG8gbm9uY2VHZW5cbiAgICogd2l0aCBvdGhlciBwYXJhbWV0ZXJzIGhlbGQgY29uc3RhbnQuXG4gICAqXG4gICAqIFRoZSBzZWNyZXQgbm9uY2UgKDk3IGJ5dGVzKSBpcyBjYWNoZWQgaW50ZXJuYWxseSwgYW5kIHdpbGwgYmUgZGVsZXRlZFxuICAgKiBmcm9tIHRoZSBjYWNoZSBwcmlvciB0byB1c2UgaW4gYSBzaWduYXR1cmUuIFRoZSBzZWNyZXQgbm9uY2Ugd2lsbCBhbHNvIGJlXG4gICAqIGRlbGV0ZWQgaWYgdGhlIHJldHVybmVkIHB1YmxpYyBub25jZSBpcyBkZWxldGVkLlxuICAgKlxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIGlmIG5vIHNlY3JldCBrZXkgaXMgcHJvdmlkZWQsIHVuaWZvcm1seSAzMi1ieXRlcyBvZlxuICAgKiByYW5kb20gZGF0YSwgb3RoZXJ3aXNlIGEgdmFsdWUgZ3VhcmFudGVlZCBub3QgdG8gcmVwZWF0IGZvciB0aGUgc2VjcmV0XG4gICAqIGtleS4gSWYgbm8gc2Vzc2lvbklkIGlzIHByb3ZpZGVkIGEgcmVhc29uYWJseSBoaWdoIHF1YWxpdHkgcmFuZG9tIG9uZSB3aWxsXG4gICAqIGJlIGdlbmVyYXRlZC5cbiAgICogQHBhcmFtIHNlY3JldEtleSB0aGUgc2VjcmV0IGtleSB3aGljaCB3aWxsIGV2ZW50dWFsbHkgc2lnbiB3aXRoIHRoaXMgbm9uY2VcbiAgICogQHBhcmFtIHB1YmxpY0tleSB0aGUgcHVibGljIGtleSBmb3Igd2hpY2ggdGhpcyBub25jZSB3aWxsIGJlIHNpZ25lZCAocmVxdWlyZWQpXG4gICAqIEBwYXJhbSB4T25seVB1YmxpY0tleSB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBhZ2dyZWdhdGUgcHVibGljIGtleSB0aGF0IHRoaXNcbiAgICogbm9uY2Ugd2lsbCBiZSBzaWduaW5nIGEgcGFydCBvZlxuICAgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlIHdoaWNoIHdpbGwgZXZlbnR1YWxseSBiZSBzaWduZWQgd2l0aCB0aGlzIG5vbmNlXG4gICAqIChhbnkgcG9zc2libGUgVWludDhBcnJheSBsZW5ndGgpXG4gICAqIEBwYXJhbSBleHRyYUlucHV0IGFkZGl0aW9uYWwgaW5wdXQgd2hpY2ggd2lsbCBjb250cmlidXRlIHRvIHRoZSBnZW5lcmF0ZWRcbiAgICogbm9uY2UgKDAgPD0gZXh0cmFJbnB1dC5sZW5ndGggPD0gMl4zMi0xKVxuICAgKiBAcmV0dXJuIHRoZSBnZW5lcmF0ZWQgcHVibGljIG5vbmNlICg2NiBieXRlcylcbiAgICovXG4gIG5vbmNlR2VuKGFyZ3M6IHtcbiAgICBzZXNzaW9uSWQ/OiBVaW50OEFycmF5O1xuICAgIHNlY3JldEtleT86IFVpbnQ4QXJyYXk7XG4gICAgcHVibGljS2V5OiBVaW50OEFycmF5O1xuICAgIHhPbmx5UHVibGljS2V5PzogVWludDhBcnJheTtcbiAgICBtc2c/OiBVaW50OEFycmF5O1xuICAgIGV4dHJhSW5wdXQ/OiBVaW50OEFycmF5O1xuICB9KTogVWludDhBcnJheTtcblxuICAvKipcbiAgICogQWRkIGFuIGV4dGVybmFsbHkgZ2VuZXJhdGVkIG5vbmNlIHRvIHRoZSBjYWNoZS5cbiAgICpcbiAgICogTk9UIFJFQ09NTUVOREVELCBidXQgdXNlZnVsIGluIHRlc3RpbmcgYXQgbGVhc3QuXG4gICAqIEBwYXJhbSBwdWJsaWNOb25jZSA2Ni1ieXRlIHB1YmxpYyBub25jZSAoMiBwb2ludHMgaW4gY29tcHJlc3NlZCBERVIpXG4gICAqIEBwYXJhbSBzZWNyZXROb25jZSA5Ny1ieXRlIHNlY3JldCBub25jZSAoMiAzMi1ieXRlIHNjYWxhcnMsIGFuZCB0aGUgcHVibGljXG4gICAqIGtleSB3aGljaCB3aWxsIHNpZ24gZm9yIHRoaXMgbm9uY2UgaW4gY29tcHJlc3NlZCBERVIpXG4gICAqL1xuICBhZGRFeHRlcm5hbE5vbmNlKHB1YmxpY05vbmNlOiBVaW50OEFycmF5LCBzZWNyZXROb25jZTogVWludDhBcnJheSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvbWJpbmUgcHVibGljIG5vbmNlcyBmcm9tIGFsbCBzaWduZXJzIGludG8gYSBzaW5nbGUgYWdncmVnYXRlIHB1YmxpYyBub25jZS5cbiAgICpcbiAgICogUGVyIHRoZSBzcGVjLCB0aGlzIGZ1bmN0aW9uIHByZWZlcnMgdG8gc3VjY2VlZCB3aXRoIGFuIGludmFsaWQgbm9uY2UgYXRcbiAgICogaW5maW5pdHkgdGhhbiB0byBmYWlsLCB0byBlbmFibGUgYSBkaXNob25lc3Qgc2lnbmVyIHRvIGJlIGRldGVjdGVkIGxhdGVyLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSBydW4gYnkgYW4gdW50cnVzdGVkIG5vZGUgd2l0aG91dCBicmVha2luZyB0aGUgc2VjdXJpdHkgb2YgdGhlXG4gICAqIHByb3RvY29sLiBBbiB1bnRydXN0ZWQgYWdncmVnYXRvciBjYW4gY2F1c2UgdGhlIHByb3RvY29sIHRvIGZhaWwsIGJ1dCBub3RcbiAgICogZm9yZ2UgYSBzaWduYXR1cmUuXG4gICAqXG4gICAqIEBwYXJhbSBub25jZXMgbi1zaWduZXJzIHB1YmxpYyBub25jZXMgKDY2LWJ5dGVzIGVhY2gpXG4gICAqIEByZXR1cm4gdGhlIGFnZ3JlZ2F0ZSBwdWJsaWMgbm9uY2UgKDY2LWJ5dGVzKVxuICAgKi9cbiAgbm9uY2VBZ2cobm9uY2VzOiBVaW50OEFycmF5W10pOiBVaW50OEFycmF5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIG9wYXF1ZSBzaWduaW5nIHNlc3Npb24gZm9yIHVzZWQgaW4gcGFydGlhbCBzaWduaW5nLCBwYXJ0aWFsXG4gICAqIHZlcmlmaWNhdGlvbiwgb3Igc2lnbmF0dXJlIGFnZ3JlZ2F0aW9uLiBUaGlzIG1heSBiZSBzYXZlZCBieSBhXG4gICAqIHBhcnRpY2lwYW50LCBidXQgbWF5IG5vdCBiZSBwcm92aWRlZCBieSBhbiB1bnRydXN0ZWQgcGFydHkuXG4gICAqXG4gICAqIEBwYXJhbSBhZ2dOb25jZSB0aGlzIHNpZ25pbmcgc2Vzc2lvbidzIGFnZ3JlZ2F0ZSBub25jZVxuICAgKiBAcGFyYW0gbXNnIHRoZSAzMi1ieXRlIG1lc3NhZ2UgdG8gc2lnbiBmb3IsIG1vc3QgY29tbW9ubHkgYSB0cmFuc2FjdGlvbiBoYXNoLlxuICAgKiBAcGFyYW0gcHVibGljS2V5cyBhcnJheSBvZiBjb21wcmVzc2VkIERFUiBlbmNvZGVkIHB1YmxpYyBrZXlzIHRvIGFnZ3JlZ2F0ZVxuICAgKiBAcGFyYW0gdHdlYWtzIHR3ZWFrcyAoMCA8IHR3ZWFrIDwgbikgdG8gYXBwbHkgdG8gdGhlIGFnZ3JlZ2F0ZSBrZXksXG4gICAqIGFuZCBvcHRpb25hbGx5IGJvb2xlYW5zIHRvIGluZGljYXRlIHgtb25seSB0d2Vha2luZ1xuICAgKiBAcmV0dXJuIHNlc3Npb24ga2V5IGZvciBgcGFydGlhbFNpZ25gLCBgcGFydGlhbFZlcmlmeWAgYW5kIGBzaWduQWdnYFxuICAgKi9cbiAgc3RhcnRTaWduaW5nU2Vzc2lvbihcbiAgICBhZ2dOb25jZTogVWludDhBcnJheSxcbiAgICBtc2c6IFVpbnQ4QXJyYXksXG4gICAgcHVibGljS2V5czogVWludDhBcnJheVtdLFxuICAgIC4uLnR3ZWFrczogVHdlYWtbXVxuICApOiBTZXNzaW9uS2V5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgTXVTaWcgcGFydGlhbCBzaWduYXR1cmUgZm9yIHRoZSBnaXZlbiB2YWx1ZXMuXG4gICAqXG4gICAqIFZlcmlmaWVzIHRoZSByZXN1bHRpbmcgcGFydGlhbCBzaWduYXR1cmUgYnkgZGVmYXVsdCwgYXMgcmVjb21tZW5kZWQgaW4gdGhlXG4gICAqIHNwZWNpZmljYXRpb24uXG4gICAqXG4gICAqIE5vdGU6IENhbGxpbmcgYHBhcnRpYWxTaWduYCB3aXRoIHRoZSBzYW1lIGBwdWJsaWNOb25jZWAgbW9yZSB0aGFuIG9uY2VcbiAgICogd2lsbCBub3Qgd29yaywgYXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VjcmV0IG5vbmNlIGlzIGRlbGV0ZWQuIEdlbmVyYXRlIGFcbiAgICogbmV3IHB1YmxpYyBub25jZSBhbmQgdHJ5IGFnYWluLlxuICAgKlxuICAgKiBAcGFyYW0gc2VjcmV0S2V5IHNpZ25lcidzIHNlY3JldCBrZXlcbiAgICogQHBhcmFtIHB1YmxpY05vbmNlIHNpZ25lcidzIHB1YmxpYyBub25jZVxuICAgKiBAcGFyYW0gc2Vzc2lvbktleSBzaWduaW5nIHNlc3Npb24ga2V5IChmcm9tIHN0YXJ0U2lnbmluZ1Nlc3Npb24pXG4gICAqIEBwYXJhbSB2ZXJpZnkgaWYgZmFsc2UsIGRvbid0IHZlcmlmeSBwYXJ0aWFsIHNpZ25hdHVyZVxuICAgKiBAcmV0dXJuIHJlc3VsdGluZyBzaWduYXR1cmVcbiAgICovXG4gIHBhcnRpYWxTaWduKGFyZ3M6IHtcbiAgICBzZWNyZXRLZXk6IFVpbnQ4QXJyYXk7XG4gICAgcHVibGljTm9uY2U6IFVpbnQ4QXJyYXk7XG4gICAgc2Vzc2lvbktleTogU2Vzc2lvbktleTtcbiAgICB2ZXJpZnk/OiBib29sZWFuO1xuICB9KTogVWludDhBcnJheTtcblxuICAvKipcbiAgICogVmVyaWZpZXMgYSBNdVNpZyBwYXJ0aWFsIHNpZ25hdHVyZSBmb3IgdGhlIGdpdmVuIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHNpZyB0aGUgMzItYnl0ZSBNdVNpZyBwYXJ0aWFsIHNpZ25hdHVyZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIG1zZyB0aGUgMzItYnl0ZSBtZXNzYWdlIHRvIHNpZ24gZm9yLCBtb3N0IGNvbW1vbmx5IGEgdHJhbnNhY3Rpb24gaGFzaFxuICAgKiBAcGFyYW0gcHVibGljS2V5IHNpZ25lcidzIHB1YmxpYyBrZXlcbiAgICogQHBhcmFtIHB1YmxpY05vbmNlIHNpZ25lcidzIHB1YmxpYyBub25jZVxuICAgKiBAcGFyYW0gYWdnTm9uY2UgdGhpcyBzaWduaW5nIHNlc3Npb24ncyBhZ2dyZWdhdGUgbm9uY2VcbiAgICogQHBhcmFtIHNlc3Npb25LZXkgc2lnbmluZyBzZXNzaW9uIGtleSAoZnJvbSBzdGFydFNpZ25pbmdTZXNzaW9uKVxuICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcnRpYWwgc2lnbmF0dXJlIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2VcbiAgICovXG4gIHBhcnRpYWxWZXJpZnkoYXJnczoge1xuICAgIHNpZzogVWludDhBcnJheTtcbiAgICBwdWJsaWNLZXk6IFVpbnQ4QXJyYXk7XG4gICAgcHVibGljTm9uY2U6IFVpbnQ4QXJyYXk7XG4gICAgc2Vzc2lvbktleTogU2Vzc2lvbktleTtcbiAgfSk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFnZ3JlZ2F0ZXMgTXVTaWcgcGFydGlhbCBzaWduYXR1cmVzLiBNYXkgYmUgcnVuIGJ5IGFuIHVudHJ1c3RlZCBwYXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHNpZ3MgYXJyYXkgb2YgMzItYnl0ZXMgTXVTaWcgcGFydGlhbCBzaWduYXR1cmVzLlxuICAgKiBAcGFyYW0gc2Vzc2lvbktleSBzaWduaW5nIHNlc3Npb24ga2V5IChmcm9tIHN0YXJ0U2lnbmluZ1Nlc3Npb24pXG4gICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBhZ2dyZWdhdGUgc2lnbmF0dXJlLlxuICAgKi9cbiAgc2lnbkFnZyhzaWdzOiBVaW50OEFycmF5W10sIHNlc3Npb25LZXk6IFNlc3Npb25LZXkpOiBVaW50OEFycmF5O1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmlzdGljYWxseSBnZW5lcmF0ZSBub25jZXMgYW5kIHBhcnRpYWxseSBzaWduIGZvciBhIE11U2lnIGtleS5cbiAgICogVGhlIHNlY3VyaXR5IG9mIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24gaXRzIGJlaW5nIHJ1biBhZnRlciBhbGwgb3RoZXJcbiAgICogcGFydGllcyBoYXZlIHByb3ZpZGVkIHRoZWlyIG5vbmNlcy5cbiAgICpcbiAgICogQHBhcmFtIHNlY3JldEtleSBzaWduZXIncyBzZWNyZXQga2V5XG4gICAqIEBwYXJhbSBhZ2dPdGhlck5vbmNlIHRoZSByZXN1bHQgb2YgY2FsbGluZyBgbm9uY2VBZ2dgIG9uIGFsbCBvdGhlciBzaWduaW5nXG4gICAqIHBhcnRpZXMnIG5vbmNlc1xuICAgKiBAcGFyYW0gcHVibGljS2V5cyBhcnJheSBvZiBjb21wcmVzc2VkIERFUiBlbmNvZGVkIHB1YmxpYyBrZXlzIHRvIGFnZ3JlZ2F0ZVxuICAgKiBAcGFyYW0gdHdlYWtzIHR3ZWFrcyAoMCA8IHR3ZWFrIDwgbikgdG8gYXBwbHkgdG8gdGhlIGFnZ3JlZ2F0ZSBrZXksXG4gICAqIGFuZCBvcHRpb25hbGx5IGJvb2xlYW5zIHRvIGluZGljYXRlIHgtb25seSB0d2Vha2luZ1xuICAgKiBAcGFyYW0gbXNnIHRoZSAzMi1ieXRlIG1lc3NhZ2UgdG8gc2lnbiBmb3IsIG1vc3QgY29tbW9ubHkgYSB0cmFuc2FjdGlvbiBoYXNoLlxuICAgKiBAcGFyYW0gcmFuZCBvcHRpb25hbCBhZGRpdGlvbmFsIHJhbmRvbW5lc3MgZm9yIG5vbmNlIGdlbmVyYXRpb25cbiAgICogQHBhcmFtIHZlcmlmeSBpZiBmYWxzZSwgZG9uJ3QgdmVyaWZ5IHBhcnRpYWwgc2lnbmF0dXJlXG4gICAqIEByZXR1cm4gcmVzdWx0aW5nIHNpZ25hdHVyZSwgc2Vzc2lvbiBrZXkgKGZvciBzaWduYXR1cmUgYWdncmVnYXRpb24pLCBhbmRcbiAgICogcHVibGljIG5vbmNlIChmb3IgcGFydGlhbCB2ZXJpZmljYXRpb24pXG4gICAqL1xuICBkZXRlcm1pbmlzdGljU2lnbihhcmdzOiB7XG4gICAgc2VjcmV0S2V5OiBVaW50OEFycmF5O1xuICAgIGFnZ090aGVyTm9uY2U6IFVpbnQ4QXJyYXk7XG4gICAgcHVibGljS2V5czogVWludDhBcnJheVtdO1xuICAgIHR3ZWFrcz86IFR3ZWFrW107XG4gICAgbXNnOiBVaW50OEFycmF5O1xuICAgIHJhbmQ/OiBVaW50OEFycmF5O1xuICAgIHZlcmlmeT86IGJvb2xlYW47XG4gIH0pOiB7XG4gICAgc2lnOiBVaW50OEFycmF5O1xuICAgIHNlc3Npb25LZXk6IFNlc3Npb25LZXk7XG4gICAgcHVibGljTm9uY2U6IFVpbnQ4QXJyYXk7XG4gIH07XG5cbiAgLyoqXG4gICAqIERldGVybWluaXN0aWNhbGx5IGdlbmVyYXRlIG5vbmNlcy4gVGhpcyBpcyBpZGVudGljYWwgdG8gZGV0ZXJtaW5pc3RpY1NpZ24sXG4gICAqIGV4Y2VwdCB0aGF0IGl0IGFib3J0cyBhZnRlciBub25jZSBnZW5lcmF0aW9uIGFuZCBiZWZvcmUgc2lnbmluZywgYW5kXG4gICAqIHJldHVybnMgb25seSB0aGUgcHVibGljIG5vbmNlLiBUaGlzIHNlY3VyaXR5IG9mIHRoaXMgbWV0aG9kIG9mIG5vbmNlXG4gICAqIGdlbmVyYXRpb24gZGVwZW5kcyBvbiBpdHMgYmVpbmcgcnVuIGFmdGVyIGFsbCBvdGhlciBwYXJ0aWVzIGhhdmUgcHJvdmlkZWRcbiAgICogdGhlaXIgbm9uY2VzLlxuICAgKlxuICAgKiBBIHB1YmxpYyBub25jZSBnZW5lcmF0ZWQgaW4gdGhpcyB3YXkgY2Fubm90IGJlIGRpcmVjdGx5IHVzZWQgZm9yIHNpZ25pbmdcbiAgICogKG5vIHNlY3JldCBub25jZSBpcyBzYXZlZCksIGJ1dCBhIG1hdGNoaW5nIHBhcnRpYWwgc2lnbmF0dXJlIGNhbiBiZVxuICAgKiBnZW5lcmF0ZWQgYnkgc3Vic2VxdWVudGx5IGNhbGxpbmcgZGV0ZXJtaW5pc3RpY1NpZ24gd2l0aCB0aGUgc2FtZVxuICAgKiBhcmd1bWVudHMgYXMgdGhlIGNhbGwgdG8gZGV0ZXJtaW5pc3RpY05vbmNlR2VuLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgaW4gYSBjYXNlIHdoZXJlIGEgc3RhdGVsZXNzIHNpZ25lciBvbmx5IHdhbnRzIHRvXG4gICAqIHByb3ZpZGUgaXRzIHBhcnRpYWwgc2lnbmF0dXJlIGFmdGVyIHNlZWluZyB2YWxpZCBwYXJ0aWFsIHNpZ25hdHVyZXMgZnJvbVxuICAgKiBvdGhlciBwYXJ0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0gc2VjcmV0S2V5IHNpZ25lcidzIHNlY3JldCBrZXlcbiAgICogQHBhcmFtIGFnZ090aGVyTm9uY2UgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGBub25jZUFnZ2Agb24gYWxsIG90aGVyIHNpZ25pbmdcbiAgICogcGFydGllcycgbm9uY2VzXG4gICAqIEBwYXJhbSBwdWJsaWNLZXlzIGFycmF5IG9mIGNvbXByZXNzZWQgREVSIGVuY29kZWQgcHVibGljIGtleXMgdG8gYWdncmVnYXRlXG4gICAqIEBwYXJhbSB0d2Vha3MgdHdlYWtzICgwIDwgdHdlYWsgPCBuKSB0byBhcHBseSB0byB0aGUgYWdncmVnYXRlIGtleSxcbiAgICogYW5kIG9wdGlvbmFsbHkgYm9vbGVhbnMgdG8gaW5kaWNhdGUgeC1vbmx5IHR3ZWFraW5nXG4gICAqIEBwYXJhbSBtc2cgdGhlIDMyLWJ5dGUgbWVzc2FnZSB0byBzaWduIGZvciwgbW9zdCBjb21tb25seSBhIHRyYW5zYWN0aW9uIGhhc2guXG4gICAqIEBwYXJhbSByYW5kIG9wdGlvbmFsIGFkZGl0aW9uYWwgcmFuZG9tbmVzcyBmb3Igbm9uY2UgZ2VuZXJhdGlvblxuICAgKiBAcGFyYW0gdmVyaWZ5IGlmIGZhbHNlLCBkb24ndCB2ZXJpZnkgcGFydGlhbCBzaWduYXR1cmVcbiAgICogQHJldHVybiBwdWJsaWMgbm9uY2VcbiAgICovXG4gIGRldGVybWluaXN0aWNOb25jZUdlbihhcmdzOiB7XG4gICAgc2VjcmV0S2V5OiBVaW50OEFycmF5O1xuICAgIGFnZ090aGVyTm9uY2U6IFVpbnQ4QXJyYXk7XG4gICAgcHVibGljS2V5czogVWludDhBcnJheVtdO1xuICAgIHR3ZWFrcz86IFR3ZWFrW107XG4gICAgbXNnOiBVaW50OEFycmF5O1xuICAgIHJhbmQ/OiBVaW50OEFycmF5O1xuICB9KTogeyBwdWJsaWNOb25jZTogVWludDhBcnJheSB9O1xuICAvLyBUT0RPOiBEaXNjdXNzIHdpdGggSFNNIHRlYW0gdGhlIGdlbmVyYXRpb24gb2YgYWxsIHRoZSBub25jZXMgYW5kIGFueVxuICAvLyBwb3RlbnRpYWwgc2NhbGluZyBjb25jZXJucyAoM3ggdGhlIHRvdGFsIGNvc3Qgb2Ygc2Nobm9yciBzaWduaW5nKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyeXB0byB7XG4gIC8qKlxuICAgKiBBZGRzIGEgdHdlYWsgdG8gYSBwb2ludC5cbiAgICpcbiAgICogQHBhcmFtIHAgQSBwb2ludCwgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWRcbiAgICogQHBhcmFtIHQgQSB0d2VhaywgMCA8IHQgPCBuXG4gICAqIEBwYXJhbSBjb21wcmVzc2VkIFdoZXRoZXIgdGhlIHJlc3VsdGluZyBwb2ludCBzaG91bGQgYmUgY29tcHJlc3NlZC5cbiAgICogQHJldHVybnMgVGhlIHR3ZWFrZWQgcG9pbnQsIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkLCBudWxsIGlmIHRoZSByZXN1bHRcbiAgICogaXMgdGhlIHBvaW50IGF0IGluZmluaXR5LlxuICAgKi9cbiAgcG9pbnRBZGRUd2VhayhwOiBVaW50OEFycmF5LCB0OiBVaW50OEFycmF5LCBjb21wcmVzc2VkOiBib29sZWFuKTogVWludDhBcnJheSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFkZHMgdHdvIHBvaW50cy5cbiAgICpcbiAgICogQHBhcmFtIGEgQW4gYWRkZW5kIHBvaW50LCBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZFxuICAgKiBAcGFyYW0gYiBBbiBhZGRlbmQgcG9pbnQsIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkXG4gICAqIEBwYXJhbSBjb21wcmVzc2VkIFdoZXRoZXIgdGhlIHJlc3VsdGluZyBwb2ludCBzaG91bGQgYmUgY29tcHJlc3NlZC5cbiAgICogQHJldHVybnMgVGhlIHN1bSBwb2ludCwgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWQsIG51bGwgaWYgdGhlIHJlc3VsdCBpc1xuICAgKiB0aGUgcG9pbnQgYXQgaW5maW5pdHkuXG4gICAqL1xuICBwb2ludEFkZChhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5LCBjb21wcmVzc2VkOiBib29sZWFuKTogVWludDhBcnJheSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE11bHRpcGxpZXMgYSBwb2ludCBieSBhIHNjYWxhci5cbiAgICogVGhpcyBmdW5jdGlvbiBtYXkgdXNlIG5vbi1jb25zdGFudCB0aW1lIG9wZXJhdGlvbnMsIGFzIG5vIHNlY3JldFxuICAgKiBpbmZvcm1hdGlvbiBpcyBwcm9jZXNzZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwIEEgcG9pbnQgbXVsdGlwbGljYW5kLCBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZFxuICAgKiBAcGFyYW0gYSBUaGUgbXVsdGlwbGllciwgMCA8IGEgPCBuXG4gICAqIEBwYXJhbSBjb21wcmVzc2VkIFdoZXRoZXIgdGhlIHJlc3VsdGluZyBwb2ludCBzaG91bGQgYmUgY29tcHJlc3NlZC5cbiAgICogQHJldHVybnMgVGhlIHByb2R1Y3QgcG9pbnQsIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkLCBudWxsIGlmIHRoZSByZXN1bHRcbiAgICogaXMgdGhlIHBvaW50IGF0IGluZmluaXR5LlxuICAgKi9cbiAgcG9pbnRNdWx0aXBseVVuc2FmZShwOiBVaW50OEFycmF5LCBhOiBVaW50OEFycmF5LCBjb21wcmVzc2VkOiBib29sZWFuKTogVWludDhBcnJheSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE11bHRpcGxpZXMgcG9pbnQgMSBieSBhIHNjYWxhciBhbmQgYWRkcyBpdCB0byBwb2ludCAyLlxuICAgKiBUaGlzIGZ1bmN0aW9uIG1heSB1c2Ugbm9uLWNvbnN0YW50IHRpbWUgb3BlcmF0aW9ucywgYXMgbm8gc2VjcmV0XG4gICAqIGluZm9ybWF0aW9uIGlzIHByb2Nlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHAxIHBvaW50IG11bHRpcGxpY2FuZCwgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWRcbiAgICogQHBhcmFtIGEgVGhlIG11bHRpcGxpZXIsIDAgPCBhIDwgblxuICAgKiBAcGFyYW0gcDIgcG9pbnQgYWRkZW5kLCBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZFxuICAgKiBAcGFyYW0gY29tcHJlc3NlZCBXaGV0aGVyIHRoZSByZXN1bHRpbmcgcG9pbnQgc2hvdWxkIGJlIGNvbXByZXNzZWQuXG4gICAqIEByZXR1cm5zIFRoZSBwcm9kdWN0L3N1bSBwb2ludCwgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWQsIG51bGwgaWYgdGhlXG4gICAqIHJlc3VsdCBpcyB0aGUgcG9pbnQgYXQgaW5maW5pdHkuXG4gICAqL1xuICBwb2ludE11bHRpcGx5QW5kQWRkVW5zYWZlKFxuICAgIHAxOiBVaW50OEFycmF5LFxuICAgIGE6IFVpbnQ4QXJyYXksXG4gICAgcDI6IFVpbnQ4QXJyYXksXG4gICAgY29tcHJlc3NlZDogYm9vbGVhblxuICApOiBVaW50OEFycmF5IHwgbnVsbDtcblxuICAvKipcbiAgICogTmVnYXRlcyBhIHBvaW50LCBpZS4gcmV0dXJucyB0aGUgcG9pbnQgd2l0aCB0aGUgb3Bwb3NpdGUgcGFyaXR5LlxuICAgKlxuICAgKiBAcGFyYW0gcCBBIHBvaW50IHRvIG5lZ2F0ZSwgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWRcbiAgICogQHJldHVybnMgVGhlIG5lZ2F0ZWQgcG9pbnQsIHdpdGggc2FtZSBjb21wcmVzc2lvbiBhcyBpbnB1dC5cbiAgICovXG4gIHBvaW50TmVnYXRlKHA6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5O1xuXG4gIC8qKlxuICAgKiBDb21wcmVzc2VzIGEgcG9pbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwIEEgcG9pbnQsIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkXG4gICAqIEBwYXJhbSBjb21wcmVzcyBbZGVmYXVsdD10cnVlXSBpZiBmYWxzZSwgdW5jb21wcmVzcyB0aGUgcG9pbnRcbiAgICogQHJldHVybnMgVGhlIHBvaW50LCBjb21wcmVzc2VkIGlmIGNvbXByZXNzIGlzIHRydWUsIG9yIHVuY29tcHJlc3NlZCBpZiBmYWxzZS5cbiAgICovXG4gIHBvaW50Q29tcHJlc3MocDogVWludDhBcnJheSwgY29tcHJlc3M/OiBib29sZWFuKTogVWludDhBcnJheTtcblxuICAvKipcbiAgICogQWRkcyBvbmUgdmFsdWUgdG8gYW5vdGhlciwgbW9kIG4uXG4gICAqXG4gICAqIEBwYXJhbSBhIEFuIGFkZGVuZCwgMCA8PSBhIDwgblxuICAgKiBAcGFyYW0gYiBBbiBhZGRlbmQsIDAgPD0gYiA8IG5cbiAgICogQHJldHVybnMgVGhlIHN1bSwgMCA8PSBzdW0gPCBuXG4gICAqL1xuICBzY2FsYXJBZGQoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSk6IFVpbnQ4QXJyYXk7XG5cbiAgLyoqXG4gICAqIE11bHRpcGx5IG9uZSB2YWx1ZSBieSBhbm90aGVyLCBtb2Qgbi5cbiAgICpcbiAgICogQHBhcmFtIGEgVGhlIG11bHRpcGxpY2FuZCwgMCA8PSBhIDwgblxuICAgKiBAcGFyYW0gYiBUaGUgbXVsdGlwbGllciwgMCA8PSBiIDwgblxuICAgKiBAcmV0dXJucyBUaGUgcHJvZHVjdCwgMCA8PSBwcm9kdWN0IDwgblxuICAgKi9cbiAgc2NhbGFyTXVsdGlwbHkoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSk6IFVpbnQ4QXJyYXk7XG5cbiAgLyoqXG4gICAqIE5lZ2F0ZXMgYSB2YWx1ZSwgbW9kIG4uXG4gICAqXG4gICAqIEBwYXJhbSBhIFRoZSB2YWx1ZSB0byBuZWdhdGUsIDAgPD0gYSA8IG5cbiAgICogQHJldHVybnMgVGhlIG5lZ2F0ZWQgdmFsdWUsIDAgPD0gbmVnYXRlZCA8IG5cbiAgICovXG4gIHNjYWxhck5lZ2F0ZShhOiBVaW50OEFycmF5KTogVWludDhBcnJheTtcblxuICAvKipcbiAgICogQHBhcmFtIGEgVGhlIHZhbHVlIHRvIHJlZHVjZVxuICAgKiBAcmV0dXJucyBhIG1vZCBuXG4gICAqL1xuICBzY2FsYXJNb2QoYTogVWludDhBcnJheSk6IFVpbnQ4QXJyYXk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzIEEgYnVmZmVyIHRvIGNoZWNrIGFnYWluc3QgdGhlIGN1cnZlIG9yZGVyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgcyBpcyBhIDMyLWJ5dGUgYXJyYXkgMCA8PSBzIDwgblxuICAgKi9cbiAgaXNTY2FsYXIoczogVWludDhBcnJheSk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzIEEgYnVmZmVyIHRvIGNoZWNrIGFnYWluc3QgdGhlIGN1cnZlIG9yZGVyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgcyBpcyBhIDMyLWJ5dGUgYXJyYXkgMCA8IHMgPCBuXG4gICAqL1xuICBpc1NlY3JldChzOiBVaW50OEFycmF5KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHBhcmFtIHAgQSBidWZmZXIgdG8gY2hlY2sgYWdhaW5zdCB0aGUgY3VydmUgZXF1YXRpb24sIGNvbXByZXNzZWQgb3JcbiAgICogdW5jb21wcmVzc2VkLlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHAgaXMgYSB2YWxpZCBwb2ludCBvbiBzZWNwMjU2azEsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgaXNQb2ludChwOiBVaW50OEFycmF5KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHBhcmFtIHAgQSBidWZmZXIgdG8gY2hlY2sgYWdhaW5zdCB0aGUgY3VydmUgZXF1YXRpb24uXG4gICAqIEByZXR1cm5zIHRydWUgaWYgcCBpcyB0aGUgeCBjb29yZGluYXRlIG9mIGEgdmFsaWQgcG9pbnQgb24gc2VjcDI1NmsxLFxuICAgKiBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGlzWE9ubHlQb2ludChwOiBVaW50OEFycmF5KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHBhcmFtIHAgYW4geCBjb29yZGluYXRlXG4gICAqIEByZXR1cm5zIHRoZSB4eSwgdW5jb21wcmVzc2VkIHBvaW50IGlmIHAgaXMgb24gdGhlIGN1cnZlLCBvdGhlcndpc2UgbnVsbC5cbiAgICovXG4gIGxpZnRYKHA6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHwgbnVsbDtcblxuICAvKipcbiAgICogQHBhcmFtIHAgeC1vbmx5LCBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZFxuICAgKiBAcmV0dXJucyB0aGUgeCBjb29yZGluYXRlIG9mIHBcbiAgICovXG4gIHBvaW50WChwOiBVaW50OEFycmF5KTogVWludDhBcnJheTtcblxuICAvKipcbiAgICogQHBhcmFtIHAgYSBwb2ludCwgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWRcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBwIGhhcyBhbiBldmVuIHkgY29vcmRpbmF0ZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBoYXNFdmVuWShwOiBVaW50OEFycmF5KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogR2V0cyBhIHB1YmxpYyBrZXkgZm9yIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBzIFNlY3JldCBrZXlcbiAgICogQHBhcmFtIGNvbXByZXNzZWQgV2hldGhlciB0aGUgcmVzdWx0aW5nIHBvaW50IHNob3VsZCBiZSBjb21wcmVzc2VkLlxuICAgKiBAcmV0dXJucyBUaGUgcHVibGljIGtleSwgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWRcbiAgICovXG4gIGdldFB1YmxpY0tleShzOiBVaW50OEFycmF5LCBjb21wcmVzc2VkOiBib29sZWFuKTogVWludDhBcnJheSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgQklQMzQwLXN0eWxlIHRhZ2dlZCBoYXNoLlxuICAgKlxuICAgKiBAcGFyYW0gdGFnXG4gICAqIEBwYXJhbSBtZXNzYWdlcyBBcnJheSBvZiBkYXRhIHRvIGhhc2guXG4gICAqIEByZXR1cm4gVGhlIDMyLWJ5dGUgQklQMzQwLXN0eWxlIHRhZ2dlZCBoYXNoLlxuICAgKi9cbiAgdGFnZ2VkSGFzaCh0YWc6IHN0cmluZywgLi4ubWVzc2FnZXM6IFVpbnQ4QXJyYXlbXSk6IFVpbnQ4QXJyYXk7XG5cbiAgLyoqXG4gICAqIFNIQTI1NiBoYXNoLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZXMgQXJyYXkgb2YgZGF0YSB0byBoYXNoLlxuICAgKiBAcmV0dXJuIFRoZSAzMi1ieXRlIFNIQTI1NiBkaWdlc3QuXG4gICAqL1xuICBzaGEyNTYoLi4ubWVzc2FnZXM6IFVpbnQ4QXJyYXlbXSk6IFVpbnQ4QXJyYXk7XG59XG5cbmV4cG9ydCB0eXBlIFR3ZWFrID0gVHlwZWRUd2VhayB8IFVpbnQ4QXJyYXk7XG5leHBvcnQgaW50ZXJmYWNlIFR5cGVkVHdlYWsge1xuICB0d2VhazogVWludDhBcnJheTtcbiAgeE9ubHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtleUdlbkNvbnRleHQge1xuICBhZ2dQdWJsaWNLZXk6IFVpbnQ4QXJyYXk7IC8vIGEgcG9pbnQgb24gdGhlIGN1cnZlXG4gIGdhY2M6IFVpbnQ4QXJyYXk7IC8vIGFjY3VtdWxhdGVkIG5lZ2F0aW9uIGZhY3RvciBmcm9tIFgtb25seSB0d2Vha2luZ1xuICB0YWNjOiBVaW50OEFycmF5OyAvLyAzMi1ieXRlIGFjY3VtdWxhdGVkIHR3ZWFrIChtb2Qgbilcbn1cblxuaW50ZXJmYWNlIFNlc3Npb25WYWx1ZXMgZXh0ZW5kcyBLZXlHZW5Db250ZXh0IHtcbiAgY29lZmZpY2llbnQ6IFVpbnQ4QXJyYXk7IC8vIDMyLWJ5dGUgbm9uY2UgY29lZmZpY2llbnQgKG1vZCBuKVxuICBmaW5hbE5vbmNlOiBVaW50OEFycmF5OyAvLyBhIHBvaW50IG9uIHRoZSBjdXJ2ZVxuICBjaGFsbGVuZ2U6IFVpbnQ4QXJyYXk7IC8vIDMyLWJ5dGUgY2hhbGxlbmdlIChtb2QgbilcbiAgcHVibGljS2V5czogVWludDhBcnJheVtdOyAvLyBpbmRpdmlkdWFsIHB1YmxpYyBrZXlzIGluIGNvbXByZXNzZWQgREVSIGZvcm1hdFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb25LZXkge1xuICBwdWJsaWNLZXk6IFVpbnQ4QXJyYXk7XG4gIGFnZ05vbmNlOiBVaW50OEFycmF5O1xuICBtc2c6IFVpbnQ4QXJyYXk7XG59XG5cbmNvbnN0IFRBR1MgPSB7XG4gIGNoYWxsZW5nZTogJ0JJUDAzNDAvY2hhbGxlbmdlJyxcbiAga2V5YWdnX2xpc3Q6ICdLZXlBZ2cgbGlzdCcsXG4gIGtleWFnZ19jb2VmOiAnS2V5QWdnIGNvZWZmaWNpZW50JyxcbiAgbXVzaWdfYXV4OiAnTXVTaWcvYXV4JyxcbiAgbXVzaWdfbm9uY2U6ICdNdVNpZy9ub25jZScsXG4gIG11c2lnX2RldGVybWluaXN0aWNfbm9uY2U6ICdNdVNpZy9kZXRlcm1pbmlzdGljL25vbmNlJyxcbiAgbXVzaWdfbm9uY2Vjb2VmOiAnTXVTaWcvbm9uY2Vjb2VmJyxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIDMyLWJ5dGUgVWludDhBcnJheXMgaW4gYnl0ZSBvcmRlci5cbiAqIEByZXR1cm5zIDwgMCwgMCwgPiAwIGlmIGEgaXMgPCBiLCA9PT0gYiBvciA+IGIgcmVzcGVjdGl2ZWx5XG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmUzMmIoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSk6IG51bWJlciB7XG4gIGlmIChhLmxlbmd0aCAhPT0gMzIgfHwgYi5sZW5ndGggIT09IDMyKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJyYXknKTtcbiAgY29uc3QgYUQgPSBuZXcgRGF0YVZpZXcoYS5idWZmZXIsIGEuYnl0ZU9mZnNldCwgYS5sZW5ndGgpO1xuICBjb25zdCBiRCA9IG5ldyBEYXRhVmlldyhiLmJ1ZmZlciwgYi5ieXRlT2Zmc2V0LCBiLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgODsgaSsrKSB7XG4gICAgY29uc3QgY21wID0gYUQuZ2V0VWludDMyKGkgKiA0KSAtIGJELmdldFVpbnQzMihpICogNCk7XG4gICAgaWYgKGNtcCAhPT0gMCkgcmV0dXJuIGNtcDtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gMzMtYnl0ZSBVaW50OEFycmF5cyBpbiBieXRlIG9yZGVyLlxuICogQHJldHVybnMgPCAwLCAwLCA+IDAgaWYgYSBpcyA8IGIsID09PSBiIG9yID4gYiByZXNwZWN0aXZlbHlcbiAqL1xuZnVuY3Rpb24gY29tcGFyZTMzYihhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgaWYgKGEubGVuZ3RoICE9PSAzMyB8fCBiLmxlbmd0aCAhPT0gMzMpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcnJheScpO1xuICBjb25zdCBjbXAgPSBhWzBdIC0gYlswXTtcbiAgaWYgKGNtcCAhPT0gMCkgcmV0dXJuIGNtcDtcbiAgcmV0dXJuIGNvbXBhcmUzMmIoYS5zdWJhcnJheSgxKSwgYi5zdWJhcnJheSgxKSk7XG59XG5cbmRlY2xhcmUgY29uc3Qgc2VsZjogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbmNvbnN0IG1ha2VTZXNzaW9uSWQgPVxuICB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgKHNlbGYuY3J5cHRvIHx8IHNlbGYubXNDcnlwdG8pXG4gICAgPyAoKSA9PiAoc2VsZi5jcnlwdG8gfHwgc2VsZi5tc0NyeXB0bykuZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDMyKSkgLy8gQnJvd3NlcnNcbiAgICA6ICgpID0+IHJlcXVpcmUoJ2NyeXB0bycpLnJhbmRvbUJ5dGVzKDMyKTsgLy8gTm9kZVxuXG4vLyBDYWNoZXMgdmFsdWVzIG5lZWRlZCB0byBjb21wdXRlIGtleSBhZ2cgY29lZmZpY2llbnRzIGZvciBhbiBhcnJheSBvZiBwdWJsaWMga2V5c1xuaW50ZXJmYWNlIEtleUFnZ0NhY2hlIHtcbiAgcHVibGljS2V5SGFzaDogVWludDhBcnJheTtcbiAgc2Vjb25kUHVibGljS2V5PzogVWludDhBcnJheTtcbn1cbmNvbnN0IF9rZXlBZ2dDYWNoZSA9IG5ldyBXZWFrTWFwPFVpbnQ4QXJyYXlbXSwgS2V5QWdnQ2FjaGU+KCk7XG5cbi8vIENhY2hlcyBjb2VmZmljaWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIGFycmF5IG9mIHB1YmxpYyBrZXlzXG5jb25zdCBfY29lZkNhY2hlID0gbmV3IFdlYWtNYXA8VWludDhBcnJheVtdLCBNYXA8VWludDhBcnJheSwgVWludDhBcnJheT4+KCk7XG5cbi8vIENhY2hlcyBzZWNyZXQgbm9uY2VzLiBXZSBkbyB0aGlzIGludGVybmFsbHkgdG8gaGVscCB1c2VycyBlbnN1cmUgdGhhdCB0aGV5XG4vLyBkbyBub3QgcmV1c2UgYSBzZWNyZXQgbm9uY2UuXG5jb25zdCBfbm9uY2VDYWNoZSA9IG5ldyBXZWFrTWFwPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXk+KCk7XG5cbi8vIENhY2hlcyBzaWduaW5nIHNlc3Npb25zLiBXZSBkbyB0aGlzIGludGVybmFsbHkgdG8gaGVscCB1c2VycyBlbnN1cmUgdGhhdFxuLy8gdGhlc2Ugc2Vzc2lvbiB2YWx1ZXMgd2VyZSBnZW5lcmF0ZWQgb24gdGhlIHNpZ25lciwgYW5kIGFyZSBub3QgYWNjZXB0ZWQgZnJvbVxuLy8gYW4gdW50cnVzdGVkIHRoaXJkIHBhcnR5LlxuY29uc3QgX3Nlc3Npb25DYWNoZSA9IG5ldyBXZWFrTWFwPFNlc3Npb25LZXksIFNlc3Npb25WYWx1ZXM+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBNdVNpZ0ZhY3RvcnkoZWNjOiBDcnlwdG8pOiBNdVNpZyB7XG4gIGNvbnN0IENQT0lOVF9JTkYgPSBuZXcgVWludDhBcnJheSgzMyk7XG4gIGNvbnN0IFNDQUxBUl8wID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICBjb25zdCBTQ0FMQVJfMSA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgU0NBTEFSXzFbMzFdID0gMTtcbiAgY29uc3QgU0NBTEFSX01JTlVTXzEgPSBlY2Muc2NhbGFyTmVnYXRlKFNDQUxBUl8xKTtcblxuICBmdW5jdGlvbiBrZXlBZ2dDb2VmZihwdWJsaWNLZXlzOiBVaW50OEFycmF5W10sIHB1YmxpY0tleTogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgIGxldCBjb2VmQ2FjaGUgPSBfY29lZkNhY2hlLmdldChwdWJsaWNLZXlzKTtcbiAgICBpZiAoY29lZkNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvZWZDYWNoZSA9IG5ldyBNYXA8VWludDhBcnJheSwgVWludDhBcnJheT4oKTtcbiAgICAgIF9jb2VmQ2FjaGUuc2V0KHB1YmxpY0tleXMsIGNvZWZDYWNoZSk7XG4gICAgfVxuICAgIGxldCBjb2VmZmljaWVudCA9IGNvZWZDYWNoZS5nZXQocHVibGljS2V5KTtcbiAgICBpZiAoY29lZmZpY2llbnQpIHJldHVybiBjb2VmZmljaWVudDtcblxuICAgIGNvZWZmaWNpZW50ID0gU0NBTEFSXzE7XG4gICAgbGV0IHNlY29uZFB1YmxpY0tleTtcbiAgICBsZXQgcHVibGljS2V5SGFzaDtcbiAgICBsZXQga2V5QWdnQ2FjaGUgPSBfa2V5QWdnQ2FjaGUuZ2V0KHB1YmxpY0tleXMpO1xuICAgIGlmIChrZXlBZ2dDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBJbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc2Vjb25kIHVuaXF1ZSBwdWJsaWMga2V5LlxuICAgICAgY29uc3QgcGtJZHgyID0gcHVibGljS2V5cy5maW5kSW5kZXgoKHBrKSA9PiBjb21wYXJlMzNiKHBrLCBwdWJsaWNLZXlzWzBdKSAhPT0gMCk7XG4gICAgICBzZWNvbmRQdWJsaWNLZXkgPSBwdWJsaWNLZXlzW3BrSWR4Ml07IC8vIHVuZGVmaW5lZCBpZiBwa0lkeDIgPT09IC0xXG4gICAgICBwdWJsaWNLZXlIYXNoID0gZWNjLnRhZ2dlZEhhc2goVEFHUy5rZXlhZ2dfbGlzdCwgLi4ucHVibGljS2V5cyk7XG4gICAgICBrZXlBZ2dDYWNoZSA9IHsgcHVibGljS2V5SGFzaCwgc2Vjb25kUHVibGljS2V5IH07XG4gICAgICBfa2V5QWdnQ2FjaGUuc2V0KHB1YmxpY0tleXMsIGtleUFnZ0NhY2hlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgcHVibGljS2V5SGFzaCwgc2Vjb25kUHVibGljS2V5IH0gPSBrZXlBZ2dDYWNoZSk7XG4gICAgfVxuICAgIGlmIChzZWNvbmRQdWJsaWNLZXkgPT09IHVuZGVmaW5lZCB8fCBjb21wYXJlMzNiKHB1YmxpY0tleSwgc2Vjb25kUHVibGljS2V5KSAhPT0gMClcbiAgICAgIGNvZWZmaWNpZW50ID0gZWNjLnRhZ2dlZEhhc2goVEFHUy5rZXlhZ2dfY29lZiwgcHVibGljS2V5SGFzaCwgcHVibGljS2V5KTtcbiAgICBjb2VmQ2FjaGUuc2V0KHB1YmxpY0tleSwgY29lZmZpY2llbnQpO1xuICAgIHJldHVybiBjb2VmZmljaWVudDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFR3ZWFrKGN0eDogS2V5R2VuQ29udGV4dCwgdDogVHdlYWspOiBLZXlHZW5Db250ZXh0IHtcbiAgICBjb25zdCB0d2VhayA9ICd0d2VhaycgaW4gdCA/IHQgOiB7IHR3ZWFrOiB0IH07XG4gICAgaWYgKCFlY2MuaXNTY2FsYXIodHdlYWsudHdlYWspKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgdHdlYWsgdG8gYmUgYSB2YWxpZCBzY2FsYXIgd2l0aCBjdXJ2ZSBvcmRlcicpO1xuICAgIGxldCB7IGdhY2MsIHRhY2MgfSA9IGN0eDtcbiAgICBsZXQgYWdnUHVibGljS2V5OiBVaW50OEFycmF5IHwgbnVsbCA9IGN0eC5hZ2dQdWJsaWNLZXk7XG5cbiAgICBpZiAoIWVjYy5oYXNFdmVuWShhZ2dQdWJsaWNLZXkpICYmIHR3ZWFrLnhPbmx5KSB7XG4gICAgICAvLyBnID0gLTFcbiAgICAgIGdhY2MgPSBlY2Muc2NhbGFyTmVnYXRlKGdhY2MpOyAvLyBnICogZ2FjYyBtb2QgblxuICAgICAgdGFjYyA9IGVjYy5zY2FsYXJOZWdhdGUodGFjYyk7IC8vIGcgKiB0YWNjIG1vZCBuXG4gICAgICBhZ2dQdWJsaWNLZXkgPSBlY2MucG9pbnROZWdhdGUoYWdnUHVibGljS2V5KTsgLy8gZyAqIFFcbiAgICB9XG4gICAgYWdnUHVibGljS2V5ID0gZWNjLnBvaW50QWRkVHdlYWsoYWdnUHVibGljS2V5LCB0d2Vhay50d2VhaywgZmFsc2UpOyAvLyBnICogUSArIHQgKiBHXG4gICAgaWYgKGFnZ1B1YmxpY0tleSA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHBvaW50IGF0IGluZmluaXR5IGR1cmluZyB0d2Vha2luZycpO1xuICAgIHRhY2MgPSBlY2Muc2NhbGFyQWRkKHR3ZWFrLnR3ZWFrLCB0YWNjKTsgLy8gdCArIGcgKiB0YWNjIG1vZCBuXG5cbiAgICByZXR1cm4geyBhZ2dQdWJsaWNLZXksIGdhY2MsIHRhY2MgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGtleUFnZyhwdWJsaWNLZXlzOiBVaW50OEFycmF5W10sIC4uLnR3ZWFrczogVHdlYWtbXSk6IEtleUdlbkNvbnRleHQge1xuICAgIGNoZWNrQXJncyh7IHB1YmxpY0tleXMgfSk7XG4gICAgY29uc3QgbXVsdGlwbGllZFB1YmxpY0tleXMgPSBwdWJsaWNLZXlzLm1hcCgocHVibGljS2V5KSA9PiB7XG4gICAgICBjb25zdCBjb2VmZmljaWVudCA9IGtleUFnZ0NvZWZmKHB1YmxpY0tleXMsIHB1YmxpY0tleSk7XG4gICAgICBsZXQgbXVsdGlwbGllZFB1YmxpY0tleTogVWludDhBcnJheSB8IG51bGw7XG4gICAgICBpZiAoY29tcGFyZTMyYihjb2VmZmljaWVudCwgU0NBTEFSXzEpID09PSAwKSB7XG4gICAgICAgIG11bHRpcGxpZWRQdWJsaWNLZXkgPSBwdWJsaWNLZXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdWx0aXBsaWVkUHVibGljS2V5ID0gZWNjLnBvaW50TXVsdGlwbHlVbnNhZmUocHVibGljS2V5LCBjb2VmZmljaWVudCwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKG11bHRpcGxpZWRQdWJsaWNLZXkgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcignUG9pbnQgYXQgaW5maW5pdHkgZHVyaW5nIGFnZ3JlZ2F0aW9uJyk7XG4gICAgICByZXR1cm4gbXVsdGlwbGllZFB1YmxpY0tleTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGFnZ1B1YmxpY0tleSA9IG11bHRpcGxpZWRQdWJsaWNLZXlzLnJlZHVjZSgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgbmV4dCA9IGVjYy5wb2ludEFkZChhLCBiLCBmYWxzZSk7XG4gICAgICBpZiAobmV4dCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdQb2ludCBhdCBpbmZpbml0eSBkdXJpbmcgYWdncmVnYXRpb24nKTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHR3ZWFrcy5yZWR1Y2UoKGN0eCwgdHdlYWspID0+IGFkZFR3ZWFrKGN0eCwgdHdlYWspLCB7XG4gICAgICBhZ2dQdWJsaWNLZXksXG4gICAgICBnYWNjOiBTQ0FMQVJfMSxcbiAgICAgIHRhY2M6IFNDQUxBUl8wLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2Vzc2lvblZhbHVlcyhzZXNzaW9uS2V5OiBTZXNzaW9uS2V5KTogU2Vzc2lvblZhbHVlcyB7XG4gICAgY29uc3Qgc2Vzc2lvblZhbHVlcyA9IF9zZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25LZXkpO1xuICAgIGlmICghc2Vzc2lvblZhbHVlcykgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNlc3Npb24ga2V5LCBwbGVhc2UgY2FsbCBgc3RhcnRTaWduaW5nU2Vzc2lvbmAnKTtcbiAgICByZXR1cm4gc2Vzc2lvblZhbHVlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vbmNlQWdnKHB1YmxpY05vbmNlczogVWludDhBcnJheVtdKTogVWludDhBcnJheSB7XG4gICAgY2hlY2tBcmdzKHsgcHVibGljTm9uY2VzIH0pO1xuXG4gICAgY29uc3QgYWdnTm9uY2VzOiBBcnJheTxVaW50OEFycmF5IHwgbnVsbD4gPSBbXG4gICAgICBwdWJsaWNOb25jZXNbMF0uc3ViYXJyYXkoMCwgMzMpLFxuICAgICAgcHVibGljTm9uY2VzWzBdLnN1YmFycmF5KDMzKSxcbiAgICBdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcHVibGljTm9uY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYWdnTm9uY2VzWzBdICE9PSBudWxsKVxuICAgICAgICBhZ2dOb25jZXNbMF0gPSBlY2MucG9pbnRBZGQoYWdnTm9uY2VzWzBdLCBwdWJsaWNOb25jZXNbaV0uc3ViYXJyYXkoMCwgMzMpLCBmYWxzZSk7XG4gICAgICBpZiAoYWdnTm9uY2VzWzFdICE9PSBudWxsKVxuICAgICAgICBhZ2dOb25jZXNbMV0gPSBlY2MucG9pbnRBZGQoYWdnTm9uY2VzWzFdLCBwdWJsaWNOb25jZXNbaV0uc3ViYXJyYXkoMzMpLCBmYWxzZSk7XG4gICAgfVxuICAgIGNvbnN0IGFnZ05vbmNlID0gbmV3IFVpbnQ4QXJyYXkoNjYpO1xuICAgIGlmIChhZ2dOb25jZXNbMF0gIT09IG51bGwpIGFnZ05vbmNlLnNldChlY2MucG9pbnRDb21wcmVzcyhhZ2dOb25jZXNbMF0pLCAwKTtcbiAgICBpZiAoYWdnTm9uY2VzWzFdICE9PSBudWxsKSBhZ2dOb25jZS5zZXQoZWNjLnBvaW50Q29tcHJlc3MoYWdnTm9uY2VzWzFdKSwgMzMpO1xuICAgIHJldHVybiBhZ2dOb25jZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0U2lnbmluZ1Nlc3Npb25Jbm5lcihcbiAgICBhZ2dOb25jZTogVWludDhBcnJheSxcbiAgICBtc2c6IFVpbnQ4QXJyYXksXG4gICAgcHVibGljS2V5czogVWludDhBcnJheVtdLFxuICAgIGN0eDogS2V5R2VuQ29udGV4dFxuICApOiBTZXNzaW9uS2V5IHtcbiAgICBjb25zdCBwdWJLZXlYID0gZWNjLnBvaW50WChjdHguYWdnUHVibGljS2V5KTtcblxuICAgIGNvbnN0IGNvZWZmaWNpZW50ID0gZWNjLnRhZ2dlZEhhc2goVEFHUy5tdXNpZ19ub25jZWNvZWYsIGFnZ05vbmNlLCBwdWJLZXlYLCBtc2cpO1xuXG4gICAgY29uc3QgYWdnTm9uY2VzID0gW2FnZ05vbmNlLnN1YmFycmF5KDAsIDMzKSwgYWdnTm9uY2Uuc3ViYXJyYXkoMzMpXTtcblxuICAgIC8vIFRoaXMgaXMga2luZGEgdWdseSwgYnV0IGNyeXB0by5wb2ludEFkZCBkb2Vzbid0IHdvcmsgb24gMC1jb2RlZCBpbmZpbml0eVxuICAgIGxldCByOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGNvbXBhcmUzM2IoYWdnTm9uY2VzWzFdLCBDUE9JTlRfSU5GKSAhPT0gMCAmJiBjb21wYXJlMzNiKGFnZ05vbmNlc1swXSwgQ1BPSU5UX0lORikgIT09IDApIHtcbiAgICAgIHIgPSBlY2MucG9pbnRNdWx0aXBseUFuZEFkZFVuc2FmZShhZ2dOb25jZXNbMV0sIGNvZWZmaWNpZW50LCBhZ2dOb25jZXNbMF0sIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKGNvbXBhcmUzM2IoYWdnTm9uY2VzWzBdLCBDUE9JTlRfSU5GKSAhPT0gMCkge1xuICAgICAgciA9IGVjYy5wb2ludENvbXByZXNzKGFnZ05vbmNlc1swXSwgZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAoY29tcGFyZTMzYihhZ2dOb25jZXNbMV0sIENQT0lOVF9JTkYpICE9PSAwKSB7XG4gICAgICByID0gZWNjLnBvaW50TXVsdGlwbHlVbnNhZmUoYWdnTm9uY2VzWzFdLCBjb2VmZmljaWVudCwgZmFsc2UpO1xuICAgIH1cbiAgICBpZiAociA9PT0gbnVsbCkgciA9IGVjYy5nZXRQdWJsaWNLZXkoU0NBTEFSXzEsIGZhbHNlKTtcbiAgICBpZiAociA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IEcnKTtcblxuICAgIGNvbnN0IGNoYWxsZW5nZSA9IGVjYy5zY2FsYXJNb2QoZWNjLnRhZ2dlZEhhc2goVEFHUy5jaGFsbGVuZ2UsIGVjYy5wb2ludFgociksIHB1YktleVgsIG1zZykpO1xuXG4gICAgY29uc3Qga2V5ID0geyBwdWJsaWNLZXk6IGN0eC5hZ2dQdWJsaWNLZXksIGFnZ05vbmNlLCBtc2cgfTtcbiAgICBfc2Vzc2lvbkNhY2hlLnNldChrZXksIHsgLi4uY3R4LCBjb2VmZmljaWVudCwgY2hhbGxlbmdlLCBmaW5hbE5vbmNlOiByLCBwdWJsaWNLZXlzIH0pO1xuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJ0aWFsVmVyaWZ5SW5uZXIoe1xuICAgIHNpZyxcbiAgICBwdWJsaWNLZXksXG4gICAgcHVibGljTm9uY2VzLFxuICAgIHNlc3Npb25LZXksXG4gIH06IHtcbiAgICBzaWc6IFVpbnQ4QXJyYXk7XG4gICAgcHVibGljS2V5OiBVaW50OEFycmF5O1xuICAgIHB1YmxpY05vbmNlczogW1VpbnQ4QXJyYXksIFVpbnQ4QXJyYXldO1xuICAgIHNlc3Npb25LZXk6IFNlc3Npb25LZXk7XG4gIH0pOiBib29sZWFuIHtcbiAgICBjb25zdCB7IG1zZyB9ID0gc2Vzc2lvbktleTtcbiAgICBjb25zdCB7IGFnZ1B1YmxpY0tleSwgZ2FjYywgY2hhbGxlbmdlLCBjb2VmZmljaWVudCwgZmluYWxOb25jZSwgcHVibGljS2V5cyB9ID1cbiAgICAgIGdldFNlc3Npb25WYWx1ZXMoc2Vzc2lvbktleSk7XG5cbiAgICBjb25zdCByZVByaW1lID0gZWNjLnBvaW50TXVsdGlwbHlBbmRBZGRVbnNhZmUoXG4gICAgICBwdWJsaWNOb25jZXNbMV0sXG4gICAgICBjb2VmZmljaWVudCxcbiAgICAgIHB1YmxpY05vbmNlc1swXSxcbiAgICAgIGZhbHNlXG4gICAgKTtcbiAgICBpZiAocmVQcmltZSA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHB1YmxpYyBub25jZSBhdCBpbmZpbml0eScpO1xuICAgIGNvbnN0IHJlID0gZWNjLmhhc0V2ZW5ZKGZpbmFsTm9uY2UpID8gcmVQcmltZSA6IGVjYy5wb2ludE5lZ2F0ZShyZVByaW1lKTtcblxuICAgIGNvbnN0IGEgPSBrZXlBZ2dDb2VmZihwdWJsaWNLZXlzLCBwdWJsaWNLZXkpO1xuXG4gICAgY29uc3QgZyA9IGVjYy5oYXNFdmVuWShhZ2dQdWJsaWNLZXkpID8gZ2FjYyA6IGVjYy5zY2FsYXJOZWdhdGUoZ2FjYyk7XG5cbiAgICBjb25zdCBlYSA9IGVjYy5zY2FsYXJNdWx0aXBseShjaGFsbGVuZ2UsIGEpO1xuICAgIGNvbnN0IGVhZyA9IGVjYy5zY2FsYXJNdWx0aXBseShlYSwgZyk7XG4gICAgY29uc3QgdmVyID0gZWNjLnBvaW50TXVsdGlwbHlBbmRBZGRVbnNhZmUocHVibGljS2V5LCBlYWcsIHJlLCB0cnVlKTtcbiAgICBpZiAodmVyID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdmVyaWZpY2F0aW9uIHBvaW50IGF0IGluZmluaXR5Jyk7XG5cbiAgICBjb25zdCBzRyA9IGVjYy5nZXRQdWJsaWNLZXkoc2lnLCB0cnVlKTtcbiAgICBpZiAoc0cgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgcG9pbnQgYXQgaW5maW5pdHknKTtcblxuICAgIHJldHVybiBjb21wYXJlMzNiKHZlciwgc0cpID09PSAwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFydGlhbFNpZ25Jbm5lcih7XG4gICAgc2VjcmV0S2V5LFxuICAgIHB1YmxpY0tleSxcbiAgICBzZWNyZXROb25jZXMsXG4gICAgc2Vzc2lvbktleSxcbiAgfToge1xuICAgIHNlY3JldEtleTogVWludDhBcnJheTtcbiAgICBwdWJsaWNLZXk6IFVpbnQ4QXJyYXk7XG4gICAgc2VjcmV0Tm9uY2VzOiBbVWludDhBcnJheSwgVWludDhBcnJheV07XG4gICAgc2Vzc2lvbktleTogU2Vzc2lvbktleTtcbiAgfSk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IHsgbXNnIH0gPSBzZXNzaW9uS2V5O1xuICAgIGNvbnN0IHsgYWdnUHVibGljS2V5LCBnYWNjLCBjaGFsbGVuZ2UsIGNvZWZmaWNpZW50LCBmaW5hbE5vbmNlLCBwdWJsaWNLZXlzIH0gPVxuICAgICAgZ2V0U2Vzc2lvblZhbHVlcyhzZXNzaW9uS2V5KTtcblxuICAgIGNvbnN0IFtrMSwgazJdID0gc2VjcmV0Tm9uY2VzLm1hcCgoaykgPT4gKGVjYy5oYXNFdmVuWShmaW5hbE5vbmNlKSA/IGsgOiBlY2Muc2NhbGFyTmVnYXRlKGspKSk7XG5cbiAgICBjb25zdCBhID0ga2V5QWdnQ29lZmYocHVibGljS2V5cywgcHVibGljS2V5KTtcblxuICAgIGNvbnN0IGcgPSBlY2MuaGFzRXZlblkoYWdnUHVibGljS2V5KSA/IGdhY2MgOiBlY2Muc2NhbGFyTmVnYXRlKGdhY2MpO1xuICAgIGNvbnN0IGQgPSBlY2Muc2NhbGFyTXVsdGlwbHkoZywgc2VjcmV0S2V5KTtcblxuICAgIGNvbnN0IGJrMiA9IGVjYy5zY2FsYXJNdWx0aXBseShjb2VmZmljaWVudCwgazIpO1xuICAgIGNvbnN0IGsxYmsyID0gZWNjLnNjYWxhckFkZChrMSwgYmsyKTtcblxuICAgIGNvbnN0IGVhID0gZWNjLnNjYWxhck11bHRpcGx5KGNoYWxsZW5nZSwgYSk7XG4gICAgY29uc3QgZWFkID0gZWNjLnNjYWxhck11bHRpcGx5KGVhLCBkKTtcblxuICAgIGNvbnN0IHNpZyA9IGVjYy5zY2FsYXJBZGQoazFiazIsIGVhZCk7XG5cbiAgICByZXR1cm4gc2lnO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFydGlhbFNpZ24oe1xuICAgIHNlY3JldEtleSxcbiAgICBwdWJsaWNOb25jZSxcbiAgICBzZXNzaW9uS2V5LFxuICAgIHZlcmlmeSA9IHRydWUsXG4gIH06IHtcbiAgICBzZWNyZXRLZXk6IFVpbnQ4QXJyYXk7XG4gICAgcHVibGljTm9uY2U6IFVpbnQ4QXJyYXk7XG4gICAgc2Vzc2lvbktleTogU2Vzc2lvbktleTtcbiAgICB2ZXJpZnk6IGJvb2xlYW47XG4gIH0pOiBVaW50OEFycmF5IHtcbiAgICBjaGVja0FyZ3MoeyBwdWJsaWNOb25jZSwgc2VjcmV0S2V5IH0pO1xuXG4gICAgY29uc3Qgc2VjcmV0Tm9uY2UgPSBfbm9uY2VDYWNoZS5nZXQocHVibGljTm9uY2UpO1xuICAgIGlmIChzZWNyZXROb25jZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzZWNyZXQgbm9uY2UgZm91bmQgZm9yIHNwZWNpZmllZCBwdWJsaWMgbm9uY2UnKTtcbiAgICBfbm9uY2VDYWNoZS5kZWxldGUocHVibGljTm9uY2UpO1xuXG4gICAgY29uc3QgcHVibGljS2V5ID0gZWNjLmdldFB1YmxpY0tleShzZWNyZXRLZXksIHRydWUpO1xuICAgIGlmIChwdWJsaWNLZXkgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzZWNyZXQga2V5LCBubyBjb3JyZXNwb25kaW5nIHB1YmxpYyBrZXknKTtcbiAgICBpZiAoY29tcGFyZTMzYihwdWJsaWNLZXksIHNlY3JldE5vbmNlLnN1YmFycmF5KDY0KSkgIT09IDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3JldCBub25jZSBwdWJrZXkgbWlzbWF0Y2gnKTtcbiAgICBjb25zdCBzZWNyZXROb25jZXM6IFtVaW50OEFycmF5LCBVaW50OEFycmF5XSA9IFtcbiAgICAgIHNlY3JldE5vbmNlLnN1YmFycmF5KDAsIDMyKSxcbiAgICAgIHNlY3JldE5vbmNlLnN1YmFycmF5KDMyLCA2NCksXG4gICAgXTtcbiAgICBjb25zdCBzaWcgPSBwYXJ0aWFsU2lnbklubmVyKHtcbiAgICAgIHNlY3JldEtleSxcbiAgICAgIHB1YmxpY0tleSxcbiAgICAgIHNlY3JldE5vbmNlcyxcbiAgICAgIHNlc3Npb25LZXksXG4gICAgfSk7XG5cbiAgICBpZiAodmVyaWZ5KSB7XG4gICAgICBjb25zdCBwdWJsaWNOb25jZXM6IFtVaW50OEFycmF5LCBVaW50OEFycmF5XSA9IFtcbiAgICAgICAgcHVibGljTm9uY2Uuc3ViYXJyYXkoMCwgMzMpLFxuICAgICAgICBwdWJsaWNOb25jZS5zdWJhcnJheSgzMyksXG4gICAgICBdO1xuICAgICAgY29uc3QgdmFsaWQgPSBwYXJ0aWFsVmVyaWZ5SW5uZXIoe1xuICAgICAgICBzaWcsXG4gICAgICAgIHB1YmxpY0tleSxcbiAgICAgICAgcHVibGljTm9uY2VzLFxuICAgICAgICBzZXNzaW9uS2V5LFxuICAgICAgfSk7XG4gICAgICBpZiAoIXZhbGlkKSB0aHJvdyBuZXcgRXJyb3IoJ1BhcnRpYWwgc2lnbmF0dXJlIGZhaWxlZCB2ZXJpZmljYXRpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpZztcbiAgfVxuXG4gIGludGVyZmFjZSBEZXRlcm1pbmlzdGljU2lnbkFyZ3NCYXNlIHtcbiAgICBzZWNyZXRLZXk6IFVpbnQ4QXJyYXk7XG4gICAgYWdnT3RoZXJOb25jZTogVWludDhBcnJheTtcbiAgICBwdWJsaWNLZXlzOiBVaW50OEFycmF5W107XG4gICAgdHdlYWtzPzogVHdlYWtbXTtcbiAgICBtc2c6IFVpbnQ4QXJyYXk7XG4gICAgcmFuZD86IFVpbnQ4QXJyYXk7XG4gIH1cbiAgaW50ZXJmYWNlIERldGVybWluaXN0aWNTaWduQXJncyBleHRlbmRzIERldGVybWluaXN0aWNTaWduQXJnc0Jhc2Uge1xuICAgIHZlcmlmeT86IGJvb2xlYW47XG4gICAgbm9uY2VPbmx5PzogYm9vbGVhbjtcbiAgfVxuICBpbnRlcmZhY2UgRGV0ZXJtaW5pc3RpY1NpZ25BcmdzU2lnbiBleHRlbmRzIERldGVybWluaXN0aWNTaWduQXJnc0Jhc2Uge1xuICAgIHZlcmlmeTogYm9vbGVhbjtcbiAgfVxuICBpbnRlcmZhY2UgRGV0ZXJtaW5pc3RpY1NpZ25BcmdzTm9uY2VPbmx5IGV4dGVuZHMgRGV0ZXJtaW5pc3RpY1NpZ25BcmdzQmFzZSB7XG4gICAgbm9uY2VPbmx5OiB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIGRldGVybWluaXN0aWNTaWduKGFyZ3M6IERldGVybWluaXN0aWNTaWduQXJnc1NpZ24pOiB7XG4gICAgc2lnOiBVaW50OEFycmF5O1xuICAgIHNlc3Npb25LZXk6IFNlc3Npb25LZXk7XG4gICAgcHVibGljTm9uY2U6IFVpbnQ4QXJyYXk7XG4gIH07XG4gIGZ1bmN0aW9uIGRldGVybWluaXN0aWNTaWduKGFyZ3M6IERldGVybWluaXN0aWNTaWduQXJnc05vbmNlT25seSk6IHsgcHVibGljTm9uY2U6IFVpbnQ4QXJyYXkgfTtcbiAgZnVuY3Rpb24gZGV0ZXJtaW5pc3RpY1NpZ24oe1xuICAgIHNlY3JldEtleSxcbiAgICBhZ2dPdGhlck5vbmNlLFxuICAgIHB1YmxpY0tleXMsXG4gICAgdHdlYWtzID0gW10sXG4gICAgbXNnLFxuICAgIHJhbmQsXG4gICAgdmVyaWZ5ID0gdHJ1ZSxcbiAgICBub25jZU9ubHkgPSBmYWxzZSxcbiAgfTogRGV0ZXJtaW5pc3RpY1NpZ25BcmdzKToge1xuICAgIHNpZz86IFVpbnQ4QXJyYXk7XG4gICAgc2Vzc2lvbktleT86IFNlc3Npb25LZXk7XG4gICAgcHVibGljTm9uY2U6IFVpbnQ4QXJyYXk7XG4gIH0ge1xuICAgIC8vIE5vIG5lZWQgdG8gY2hlY2sgbXNnLCBpdHMgbWF4IHNpemUgaXMgbGFyZ2VyIHRoYW4gSlMgdHlwZWQgYXJyYXkgbGltaXRcbiAgICBjaGVja0FyZ3MoeyByYW5kLCBzZWNyZXRLZXksIGFnZ090aGVyTm9uY2UgfSk7XG4gICAgY29uc3QgcHVibGljS2V5ID0gZWNjLmdldFB1YmxpY0tleShzZWNyZXRLZXksIHRydWUpO1xuICAgIGlmIChwdWJsaWNLZXkgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcignU2VjcmV0IGtleSBoYXMgbm8gY29ycmVzcG9uZGluZyBwdWJsaWMga2V5Jyk7XG5cbiAgICBsZXQgc2VjcmV0S2V5UHJpbWU7XG4gICAgaWYgKHJhbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VjcmV0S2V5UHJpbWUgPSBlY2MudGFnZ2VkSGFzaChUQUdTLm11c2lnX2F1eCwgcmFuZCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICAgICAgc2VjcmV0S2V5UHJpbWVbaV0gPSBzZWNyZXRLZXlQcmltZVtpXSBeIHNlY3JldEtleVtpXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VjcmV0S2V5UHJpbWUgPSBzZWNyZXRLZXk7XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IGtleUFnZyhwdWJsaWNLZXlzLCAuLi50d2Vha3MpO1xuICAgIGNvbnN0IGFnZ1B1YmxpY0tleSA9IGVjYy5wb2ludFgoY3R4LmFnZ1B1YmxpY0tleSk7XG5cbiAgICBjb25zdCBtTGVuZ3RoID0gbmV3IFVpbnQ4QXJyYXkoOCk7XG4gICAgbmV3IERhdGFWaWV3KG1MZW5ndGguYnVmZmVyKS5zZXRCaWdVaW50NjQoMCwgQmlnSW50KG1zZy5sZW5ndGgpKTtcblxuICAgIGNvbnN0IHNlY3JldE5vbmNlID0gbmV3IFVpbnQ4QXJyYXkoOTcpO1xuICAgIGNvbnN0IHB1YmxpY05vbmNlID0gbmV3IFVpbnQ4QXJyYXkoNjYpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgICBjb25zdCBrSCA9IGVjYy50YWdnZWRIYXNoKFxuICAgICAgICBUQUdTLm11c2lnX2RldGVybWluaXN0aWNfbm9uY2UsXG4gICAgICAgIC4uLltzZWNyZXRLZXlQcmltZSwgYWdnT3RoZXJOb25jZSwgYWdnUHVibGljS2V5LCBtTGVuZ3RoLCBtc2csIFVpbnQ4QXJyYXkub2YoaSldXG4gICAgICApO1xuICAgICAgY29uc3QgayA9IGVjYy5zY2FsYXJNb2Qoa0gpO1xuICAgICAgaWYgKGNvbXBhcmUzMmIoU0NBTEFSXzAsIGspID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoJzAgc2VjcmV0IG5vbmNlJyk7XG4gICAgICBjb25zdCBwdWIgPSBlY2MuZ2V0UHVibGljS2V5KGssIHRydWUpO1xuICAgICAgaWYgKHB1YiA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdTZWNyZXQgbm9uY2UgaGFzIG5vIGNvcnJlc3BvbmRpbmcgcHVibGljIG5vbmNlJyk7XG5cbiAgICAgIHNlY3JldE5vbmNlLnNldChrLCBpICogMzIpO1xuICAgICAgcHVibGljTm9uY2Uuc2V0KHB1YiwgaSAqIDMzKTtcbiAgICB9XG4gICAgc2VjcmV0Tm9uY2Uuc2V0KHB1YmxpY0tleSwgNjQpO1xuXG4gICAgaWYgKG5vbmNlT25seSkgcmV0dXJuIHsgcHVibGljTm9uY2UgfTtcblxuICAgIF9ub25jZUNhY2hlLnNldChwdWJsaWNOb25jZSwgc2VjcmV0Tm9uY2UpO1xuICAgIGNvbnN0IGFnZ05vbmNlID0gbm9uY2VBZ2coW2FnZ090aGVyTm9uY2UsIHB1YmxpY05vbmNlXSk7XG4gICAgY29uc3Qgc2Vzc2lvbktleSA9IHN0YXJ0U2lnbmluZ1Nlc3Npb25Jbm5lcihhZ2dOb25jZSwgbXNnLCBwdWJsaWNLZXlzLCBjdHgpO1xuICAgIGNvbnN0IHNpZyA9IHBhcnRpYWxTaWduKHtcbiAgICAgIHNlY3JldEtleSxcbiAgICAgIHB1YmxpY05vbmNlLFxuICAgICAgc2Vzc2lvbktleSxcbiAgICAgIHZlcmlmeSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHNpZywgc2Vzc2lvbktleSwgcHVibGljTm9uY2UgfTtcbiAgfVxuXG4gIC8vIFRPRE86IEltcHJvdmUgYXJnIGNoZWNraW5nIG5vdyB0aGF0IHdlIGhhdmUgc3RhcnRTaWduaW5nU2Vzc2lvblxuICBjb25zdCBwdWJLZXlBcmdzID0gWydwdWJsaWNLZXknLCAncHVibGljS2V5cyddIGFzIGNvbnN0O1xuICBjb25zdCBzY2FsYXJBcmdzID0gWyd0d2VhaycsICdzaWcnLCAnc2lncycsICd0YWNjJywgJ2dhY2MnXSBhcyBjb25zdDtcbiAgY29uc3Qgb3RoZXJBcmdzMzJiID0gWyd4T25seVB1YmxpY0tleScsICdyYW5kJywgJ3Nlc3Npb25JZCddIGFzIGNvbnN0O1xuICBjb25zdCBhcmdzMzJiID0gWydzZWNyZXRLZXknLCAuLi5zY2FsYXJBcmdzLCAuLi5vdGhlckFyZ3MzMmJdIGFzIGNvbnN0O1xuICBjb25zdCBwdWJOb25jZUFyZ3MgPSBbXG4gICAgJ3B1YmxpY05vbmNlJyxcbiAgICAncHVibGljTm9uY2VzJyxcbiAgICAnYWdnTm9uY2UnLFxuICAgICdhZ2dPdGhlck5vbmNlJyxcbiAgICAnZmluYWxOb25jZScsXG4gIF0gYXMgY29uc3Q7XG4gIGNvbnN0IG90aGVyQXJncyA9IFsnYWdnUHVibGljS2V5JywgJ3NlY3JldE5vbmNlJ10gYXMgY29uc3Q7XG4gIHR5cGUgQXJnTmFtZSA9XG4gICAgfCAodHlwZW9mIHB1YktleUFyZ3MpW251bWJlcl1cbiAgICB8ICh0eXBlb2YgYXJnczMyYilbbnVtYmVyXVxuICAgIHwgKHR5cGVvZiBwdWJOb25jZUFyZ3MpW251bWJlcl1cbiAgICB8ICh0eXBlb2Ygb3RoZXJBcmdzKVtudW1iZXJdO1xuICB0eXBlIEFyZ3MgPSB7IFtBIGluIEFyZ05hbWVdPzogVWludDhBcnJheSB8IFVpbnQ4QXJyYXlbXSB9O1xuXG4gIGNvbnN0IGFyZ0xlbmd0aHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBhcmdzMzJiLmZvckVhY2goKGEpID0+IGFyZ0xlbmd0aHMuc2V0KGEsIDMyKSk7XG4gIHB1YktleUFyZ3MuZm9yRWFjaCgoYSkgPT4gYXJnTGVuZ3Rocy5zZXQoYSwgMzMpKTtcbiAgcHViTm9uY2VBcmdzLmZvckVhY2goKGEpID0+IGFyZ0xlbmd0aHMuc2V0KGEsIDY2KSk7XG4gIGFyZ0xlbmd0aHMuc2V0KCdzZWNyZXROb25jZScsIDk3KTtcbiAgYXJnTGVuZ3Rocy5zZXQoJ2FnZ1B1YmxpY0tleScsIDY1KTtcbiAgY29uc3Qgc2NhbGFyTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgc2NhbGFyQXJncy5mb3JFYWNoKChuKSA9PiBzY2FsYXJOYW1lcy5hZGQobikpO1xuXG4gIGZ1bmN0aW9uIGNoZWNrQXJncyhhcmdzOiBBcmdzKTogdm9pZCB7XG4gICAgZm9yIChsZXQgW25hbWUsIHZhbHVlc10gb2YgT2JqZWN0LmVudHJpZXMoYXJncykpIHtcbiAgICAgIGlmICh2YWx1ZXMgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlcykgPyB2YWx1ZXMgOiBbdmFsdWVzXTtcbiAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKGAwLWxlbmd0aCAke25hbWV9cyBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICBpZiAoYXJnTGVuZ3Rocy5nZXQobmFtZSkgIT09IHZhbHVlLmxlbmd0aClcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkICR7bmFtZX0gbGVuZ3RoICgke3ZhbHVlLmxlbmd0aH0pYCk7XG4gICAgICAgIGlmIChuYW1lID09PSAnc2VjcmV0S2V5Jykge1xuICAgICAgICAgIGlmICghZWNjLmlzU2VjcmV0KHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBzZWNyZXRLZXlgKTtcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lID09PSAnc2VjcmV0Tm9uY2UnKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2NDsgaSArPSAzMilcbiAgICAgICAgICAgIGlmICghZWNjLmlzU2VjcmV0KHZhbHVlLnN1YmFycmF5KGksIGkgKyAzMikpKVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHNlY3JldE5vbmNlYCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NhbGFyTmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkgKz0gMzIpXG4gICAgICAgICAgICBpZiAoIWVjYy5pc1NjYWxhcih2YWx1ZS5zdWJhcnJheShpLCBpICsgMzIpKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCAke25hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gbmVlZCBmb3IgYSBwdWJsaWMga2V5IHgtdG8tY3VydmUgY2hlY2suIFRoZXkncmUgbGlmdFgnZCBmb3IgdXNlIGFueSB3YXkuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBnZXRYT25seVB1YmtleTogKGN0eDogS2V5R2VuQ29udGV4dCB8IFNlc3Npb25LZXkpOiBVaW50OEFycmF5ID0+IHtcbiAgICAgIGlmICgnYWdnUHVibGljS2V5JyBpbiBjdHgpIHJldHVybiBlY2MucG9pbnRYKGN0eC5hZ2dQdWJsaWNLZXkpO1xuICAgICAgcmV0dXJuIGVjYy5wb2ludFgoZ2V0U2Vzc2lvblZhbHVlcyhjdHgpLmFnZ1B1YmxpY0tleSk7XG4gICAgfSxcbiAgICBnZXRQbGFpblB1YmtleTogKGN0eDogS2V5R2VuQ29udGV4dCB8IFNlc3Npb25LZXkpOiBVaW50OEFycmF5ID0+IHtcbiAgICAgIGlmICgnYWdnUHVibGljS2V5JyBpbiBjdHgpIHJldHVybiBlY2MucG9pbnRDb21wcmVzcyhjdHguYWdnUHVibGljS2V5KTtcbiAgICAgIHJldHVybiBlY2MucG9pbnRDb21wcmVzcyhnZXRTZXNzaW9uVmFsdWVzKGN0eCkuYWdnUHVibGljS2V5KTtcbiAgICB9LFxuICAgIGtleVNvcnQ6IChwdWJsaWNLZXlzOiBVaW50OEFycmF5W10pOiBVaW50OEFycmF5W10gPT4ge1xuICAgICAgY2hlY2tBcmdzKHsgcHVibGljS2V5cyB9KTtcbiAgICAgIC8vIGRvIG5vdCBtb2RpZnkgdGhlIG9yaWdpbmFsIGFycmF5XG4gICAgICByZXR1cm4gWy4uLnB1YmxpY0tleXNdLnNvcnQoKGEsIGIpID0+IGNvbXBhcmUzM2IoYSwgYikpO1xuICAgIH0sXG4gICAga2V5QWdnLFxuICAgIGFkZFR3ZWFrczogKGN0eDogS2V5R2VuQ29udGV4dCwgLi4udHdlYWtzOiBUd2Vha1tdKTogS2V5R2VuQ29udGV4dCA9PiB7XG4gICAgICBjaGVja0FyZ3MoY3R4KTtcbiAgICAgIHJldHVybiB0d2Vha3MucmVkdWNlKChjLCB0d2VhaykgPT4gYWRkVHdlYWsoYywgdHdlYWspLCBjdHgpO1xuICAgIH0sXG5cbiAgICBub25jZUdlbjogKHtcbiAgICAgIHNlc3Npb25JZCA9IG1ha2VTZXNzaW9uSWQoKSxcbiAgICAgIHNlY3JldEtleSxcbiAgICAgIHB1YmxpY0tleSxcbiAgICAgIHhPbmx5UHVibGljS2V5LFxuICAgICAgbXNnLFxuICAgICAgZXh0cmFJbnB1dCxcbiAgICB9OiB7XG4gICAgICBzZXNzaW9uSWQ6IFVpbnQ4QXJyYXk7XG4gICAgICBzZWNyZXRLZXk/OiBVaW50OEFycmF5O1xuICAgICAgcHVibGljS2V5OiBVaW50OEFycmF5O1xuICAgICAgeE9ubHlQdWJsaWNLZXk/OiBVaW50OEFycmF5O1xuICAgICAgbXNnPzogVWludDhBcnJheTtcbiAgICAgIGV4dHJhSW5wdXQ/OiBVaW50OEFycmF5O1xuICAgIH0pOiBVaW50OEFycmF5ID0+IHtcbiAgICAgIGlmIChleHRyYUlucHV0ICE9PSB1bmRlZmluZWQgJiYgZXh0cmFJbnB1dC5sZW5ndGggPiBNYXRoLnBvdygyLCAzMikgLSAxKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleHRyYUlucHV0IGlzIGxpbWl0ZWQgdG8gMl4zMi0xIGJ5dGVzJyk7XG4gICAgICAvLyBObyBuZWVkIHRvIGNoZWNrIG1zZywgaXRzIG1heCBzaXplIGlzIGxhcmdlciB0aGFuIEpTIHR5cGVkIGFycmF5IGxpbWl0XG4gICAgICBjaGVja0FyZ3MoeyBzZXNzaW9uSWQsIHNlY3JldEtleSwgcHVibGljS2V5LCB4T25seVB1YmxpY0tleSB9KTtcbiAgICAgIGxldCByYW5kOiBVaW50OEFycmF5O1xuICAgICAgaWYgKHNlY3JldEtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJhbmQgPSBlY2MudGFnZ2VkSGFzaChUQUdTLm11c2lnX2F1eCwgc2Vzc2lvbklkKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7XG4gICAgICAgICAgcmFuZFtpXSA9IHJhbmRbaV0gXiBzZWNyZXRLZXlbaV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhbmQgPSBzZXNzaW9uSWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh4T25seVB1YmxpY0tleSA9PT0gdW5kZWZpbmVkKSB4T25seVB1YmxpY0tleSA9IG5ldyBVaW50OEFycmF5KCk7XG5cbiAgICAgIGNvbnN0IG1QcmVmaXhlZCA9IFtVaW50OEFycmF5Lm9mKDApXTtcbiAgICAgIGlmIChtc2cgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtUHJlZml4ZWRbMF1bMF0gPSAxO1xuICAgICAgICBtUHJlZml4ZWQucHVzaChuZXcgVWludDhBcnJheSg4KSk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhtUHJlZml4ZWRbMV0uYnVmZmVyKS5zZXRCaWdVaW50NjQoMCwgQmlnSW50KG1zZy5sZW5ndGgpKTtcbiAgICAgICAgbVByZWZpeGVkLnB1c2gobXNnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4dHJhSW5wdXQgPT09IHVuZGVmaW5lZCkgZXh0cmFJbnB1dCA9IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICBjb25zdCBlTGVuZ3RoID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICBuZXcgRGF0YVZpZXcoZUxlbmd0aC5idWZmZXIpLnNldFVpbnQzMigwLCBleHRyYUlucHV0Lmxlbmd0aCk7XG5cbiAgICAgIGNvbnN0IHNlY3JldE5vbmNlID0gbmV3IFVpbnQ4QXJyYXkoOTcpO1xuICAgICAgY29uc3QgcHVibGljTm9uY2UgPSBuZXcgVWludDhBcnJheSg2Nik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgICBjb25zdCBrSCA9IGVjYy50YWdnZWRIYXNoKFxuICAgICAgICAgIFRBR1MubXVzaWdfbm9uY2UsXG4gICAgICAgICAgcmFuZCxcbiAgICAgICAgICBVaW50OEFycmF5Lm9mKHB1YmxpY0tleS5sZW5ndGgpLFxuICAgICAgICAgIHB1YmxpY0tleSxcbiAgICAgICAgICBVaW50OEFycmF5Lm9mKHhPbmx5UHVibGljS2V5Lmxlbmd0aCksXG4gICAgICAgICAgeE9ubHlQdWJsaWNLZXksXG4gICAgICAgICAgLi4ubVByZWZpeGVkLFxuICAgICAgICAgIGVMZW5ndGgsXG4gICAgICAgICAgZXh0cmFJbnB1dCxcbiAgICAgICAgICBVaW50OEFycmF5Lm9mKGkpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGsgPSBlY2Muc2NhbGFyTW9kKGtIKTtcbiAgICAgICAgaWYgKGNvbXBhcmUzMmIoU0NBTEFSXzAsIGspID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoJzAgc2VjcmV0IG5vbmNlJyk7XG4gICAgICAgIGNvbnN0IHB1YiA9IGVjYy5nZXRQdWJsaWNLZXkoaywgdHJ1ZSk7XG4gICAgICAgIGlmIChwdWIgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcignU2VjcmV0IG5vbmNlIGhhcyBubyBjb3JyZXNwb25kaW5nIHB1YmxpYyBub25jZScpO1xuXG4gICAgICAgIHNlY3JldE5vbmNlLnNldChrLCBpICogMzIpO1xuICAgICAgICBwdWJsaWNOb25jZS5zZXQocHViLCBpICogMzMpO1xuICAgICAgfVxuICAgICAgc2VjcmV0Tm9uY2Uuc2V0KHB1YmxpY0tleSwgNjQpO1xuICAgICAgX25vbmNlQ2FjaGUuc2V0KHB1YmxpY05vbmNlLCBzZWNyZXROb25jZSk7XG4gICAgICByZXR1cm4gcHVibGljTm9uY2U7XG4gICAgfSxcblxuICAgIGFkZEV4dGVybmFsTm9uY2U6IChwdWJsaWNOb25jZTogVWludDhBcnJheSwgc2VjcmV0Tm9uY2U6IFVpbnQ4QXJyYXkpOiB2b2lkID0+IHtcbiAgICAgIGNoZWNrQXJncyh7IHB1YmxpY05vbmNlLCBzZWNyZXROb25jZSB9KTtcbiAgICAgIF9ub25jZUNhY2hlLnNldChwdWJsaWNOb25jZSwgc2VjcmV0Tm9uY2UpO1xuICAgIH0sXG5cbiAgICBkZXRlcm1pbmlzdGljTm9uY2VHZW46IChhcmdzOiBEZXRlcm1pbmlzdGljU2lnbkFyZ3NCYXNlKTogeyBwdWJsaWNOb25jZTogVWludDhBcnJheSB9ID0+XG4gICAgICBkZXRlcm1pbmlzdGljU2lnbih7IC4uLmFyZ3MsIG5vbmNlT25seTogdHJ1ZSB9KSxcblxuICAgIGRldGVybWluaXN0aWNTaWduLFxuXG4gICAgbm9uY2VBZ2csXG5cbiAgICBzdGFydFNpZ25pbmdTZXNzaW9uOiAoXG4gICAgICBhZ2dOb25jZTogVWludDhBcnJheSxcbiAgICAgIG1zZzogVWludDhBcnJheSxcbiAgICAgIHB1YmxpY0tleXM6IFVpbnQ4QXJyYXlbXSxcbiAgICAgIC4uLnR3ZWFrczogVHdlYWtbXVxuICAgICk6IFNlc3Npb25LZXkgPT4ge1xuICAgICAgY2hlY2tBcmdzKHsgYWdnTm9uY2UgfSk7XG4gICAgICBjb25zdCBjdHggPSBrZXlBZ2cocHVibGljS2V5cywgLi4udHdlYWtzKTtcbiAgICAgIHJldHVybiBzdGFydFNpZ25pbmdTZXNzaW9uSW5uZXIoYWdnTm9uY2UsIG1zZywgcHVibGljS2V5cywgY3R4KTtcbiAgICB9LFxuXG4gICAgcGFydGlhbFNpZ24sXG5cbiAgICBwYXJ0aWFsVmVyaWZ5OiAoe1xuICAgICAgc2lnLFxuICAgICAgcHVibGljS2V5LFxuICAgICAgcHVibGljTm9uY2UsXG4gICAgICBzZXNzaW9uS2V5LFxuICAgIH06IHtcbiAgICAgIHNpZzogVWludDhBcnJheTtcbiAgICAgIHB1YmxpY0tleTogVWludDhBcnJheTtcbiAgICAgIHB1YmxpY05vbmNlOiBVaW50OEFycmF5O1xuICAgICAgc2Vzc2lvbktleTogU2Vzc2lvbktleTtcbiAgICB9KTogYm9vbGVhbiA9PiB7XG4gICAgICBjaGVja0FyZ3MoeyBzaWcsIHB1YmxpY0tleSwgcHVibGljTm9uY2UgfSk7XG5cbiAgICAgIGNvbnN0IHB1YmxpY05vbmNlczogW1VpbnQ4QXJyYXksIFVpbnQ4QXJyYXldID0gW1xuICAgICAgICBwdWJsaWNOb25jZS5zdWJhcnJheSgwLCAzMyksXG4gICAgICAgIHB1YmxpY05vbmNlLnN1YmFycmF5KDMzKSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHZhbGlkID0gcGFydGlhbFZlcmlmeUlubmVyKHtcbiAgICAgICAgc2lnLFxuICAgICAgICBwdWJsaWNLZXksXG4gICAgICAgIHB1YmxpY05vbmNlcyxcbiAgICAgICAgc2Vzc2lvbktleSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbGlkO1xuICAgIH0sXG5cbiAgICBzaWduQWdnOiAoc2lnczogVWludDhBcnJheVtdLCBzZXNzaW9uS2V5OiBTZXNzaW9uS2V5KTogVWludDhBcnJheSA9PiB7XG4gICAgICBjaGVja0FyZ3MoeyBzaWdzIH0pO1xuXG4gICAgICBjb25zdCB7IGFnZ1B1YmxpY0tleSwgdGFjYywgY2hhbGxlbmdlLCBmaW5hbE5vbmNlIH0gPSBnZXRTZXNzaW9uVmFsdWVzKHNlc3Npb25LZXkpO1xuICAgICAgbGV0IHNQYXJ0OiBVaW50OEFycmF5ID0gZWNjLnNjYWxhck11bHRpcGx5KGNoYWxsZW5nZSwgdGFjYyk7XG4gICAgICBpZiAoIWVjYy5oYXNFdmVuWShhZ2dQdWJsaWNLZXkpKSB7XG4gICAgICAgIHNQYXJ0ID0gZWNjLnNjYWxhck5lZ2F0ZShzUGFydCk7XG4gICAgICB9XG4gICAgICBjb25zdCBhZ2dTID0gc2lncy5yZWR1Y2UoKGEsIGIpID0+IGVjYy5zY2FsYXJBZGQoYSwgYiksIHNQYXJ0KTtcbiAgICAgIGNvbnN0IHNpZyA9IG5ldyBVaW50OEFycmF5KDY0KTtcbiAgICAgIHNpZy5zZXQoZWNjLnBvaW50WChmaW5hbE5vbmNlKSwgMCk7XG4gICAgICBzaWcuc2V0KGFnZ1MsIDMyKTtcbiAgICAgIHJldHVybiBzaWc7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
|
package/dist/src/noble_ecc.d.ts
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
import { ECPairAPI, ECPairInterface } from 'ecpair';
|
2
2
|
import { BIP32API, BIP32Interface } from 'bip32';
|
3
|
-
import { MuSig } from '
|
3
|
+
import { MuSig } from './musig';
|
4
4
|
declare const ecc: {
|
5
5
|
isPoint: (p: Uint8Array) => boolean;
|
6
6
|
isPrivate: (d: Uint8Array) => boolean;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"noble_ecc.d.ts","sourceRoot":"","sources":["../../src/noble_ecc.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAiB,eAAe,EAAE,MAAM,QAAQ,CAAC;AAEnE,OAAO,EAAE,QAAQ,EAAgB,cAAc,EAAE,MAAM,OAAO,CAAC;AAI/D,OAAO,EAAE,KAAK,EAAgB,MAAM,
|
1
|
+
{"version":3,"file":"noble_ecc.d.ts","sourceRoot":"","sources":["../../src/noble_ecc.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAiB,eAAe,EAAE,MAAM,QAAQ,CAAC;AAEnE,OAAO,EAAE,QAAQ,EAAgB,cAAc,EAAE,MAAM,OAAO,CAAC;AAI/D,OAAO,EAAE,KAAK,EAAgB,MAAM,SAAS,CAAC;AAqC9C,QAAA,MAAM,GAAG;iBACM,UAAU,KAAG,OAAO;mBAClB,UAAU,KAAG,OAAO;sBACjB,UAAU,KAAG,OAAO;4BAEd,UAAU,SAAS,UAAU,KAAG;QAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;QAAC,WAAW,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI;0BAOnF,UAAU,uCAAyB,UAAU,GAAG,IAAI;uBAGvD,UAAU,uCAAyB,UAAU;uBAI7C,UAAU,SAAS,UAAU,uCAAyB,UAAU,GAAG,IAAI;kBAG5E,UAAU,KAAK,UAAU,uCAAyB,UAAU,GAAG,IAAI;wBAO7D,UAAU,SAAS,UAAU,uCAAyB,UAAU,GAAG,IAAI;oBAG3E,UAAU,SAAS,UAAU,KAAG,UAAU,GAAG,IAAI;uBAS9C,UAAU,KAAG,UAAU;cAEhC,UAAU,KAAK,UAAU,iCAAmB,UAAU;qBAI/C,UAAU,KAAK,UAAU,MAAK,UAAU,KAA4B,UAAU;gBAInF,UAAU,KAAK,UAAU,aAAa,UAAU,mCAAqB,OAAO;uBAIrE,UAAU,KAAK,UAAU,aAAa,UAAU,KAAG,OAAO;CAG9E,CAAC;AAkEF,QAAA,MAAM,MAAM,EAAE,SAA8B,CAAC;AAC7C,QAAA,MAAM,KAAK,EAAE,QAA4B,CAAC;AAC1C,QAAA,MAAM,KAAK,EAAE,KAA4B,CAAC;AAE1C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC"}
|