@bitgo-beta/sdk-lib-mpc 8.2.1-alpha.460 → 8.2.1-alpha.462
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/tss/eddsa-mps/derive.d.ts +18 -0
- package/dist/src/tss/eddsa-mps/derive.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/derive.js +51 -0
- package/dist/src/tss/eddsa-mps/dsg.d.ts +2 -0
- package/dist/src/tss/eddsa-mps/dsg.d.ts.map +1 -1
- package/dist/src/tss/eddsa-mps/dsg.js +7 -1
- package/dist/src/tss/eddsa-mps/index.d.ts +1 -0
- package/dist/src/tss/eddsa-mps/index.d.ts.map +1 -1
- package/dist/src/tss/eddsa-mps/index.js +4 -2
- package/dist/src/tss/eddsa-mps/util.d.ts +15 -0
- package/dist/src/tss/eddsa-mps/util.d.ts.map +1 -1
- package/dist/src/tss/eddsa-mps/util.js +35 -1
- package/dist/src/tss/index.d.ts +1 -0
- package/dist/src/tss/index.d.ts.map +1 -1
- package/dist/src/tss/index.js +2 -1
- package/dist/src/tss/schnorr-dkls/dsg.d.ts +118 -0
- package/dist/src/tss/schnorr-dkls/dsg.d.ts.map +1 -0
- package/dist/src/tss/schnorr-dkls/dsg.js +374 -0
- package/dist/src/tss/schnorr-dkls/index.d.ts +4 -0
- package/dist/src/tss/schnorr-dkls/index.d.ts.map +1 -0
- package/dist/src/tss/schnorr-dkls/index.js +40 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Two-party BIP-340 Schnorr threshold signing (SchnorrDsg).
|
|
4
|
+
*
|
|
5
|
+
* Works with the Shamir keyshares produced by `DklsDkg` (DKLS23 key generation).
|
|
6
|
+
* No new WASM is required: key material is read directly from the CBOR-encoded
|
|
7
|
+
* keyshare, Lagrange interpolation is computed in TypeScript, and BIP-340 Schnorr
|
|
8
|
+
* algebra is performed with `@noble/curves/secp256k1`.
|
|
9
|
+
*
|
|
10
|
+
* Protocol (2 broadcast rounds):
|
|
11
|
+
*
|
|
12
|
+
* Round 1 init()
|
|
13
|
+
* • Each party generates a random nonce scalar k_i.
|
|
14
|
+
* • Broadcasts the nonce point R_i = k_i * G (33-byte compressed).
|
|
15
|
+
*
|
|
16
|
+
* Round 2 handleIncomingMessages([R_j])
|
|
17
|
+
* • Compute combined nonce R = R_i + R_j.
|
|
18
|
+
* • If R.y is odd, negate k_i (BIP-340 requires even-y R).
|
|
19
|
+
* • Compute BIP-340 challenge e = H("BIP0340/challenge", R.x ‖ P.x ‖ msg).
|
|
20
|
+
* • Compute partial signature s_i = k_i + e · λ_i · priv_i (mod n).
|
|
21
|
+
* • Broadcasts s_i as 32-byte big-endian scalar.
|
|
22
|
+
*
|
|
23
|
+
* Combine handleIncomingMessages([s_j])
|
|
24
|
+
* • s = s_i + s_j mod n.
|
|
25
|
+
* • signature = Buffer.concat([R.x_32, s_32]) — 64-byte BIP-340 Schnorr.
|
|
26
|
+
*
|
|
27
|
+
* BIP-32 non-hardened derivation is supported. For path `m/a/b/...`, the total
|
|
28
|
+
* IL scalar (sum of per-level HMAC-SHA512 left halves) is computed from the
|
|
29
|
+
* shared public key / chaincode. The party with the smallest index in
|
|
30
|
+
* `signingPartyIndices` absorbs the entire IL adjustment so that Lagrange
|
|
31
|
+
* interpolation still reconstructs the correct child private key.
|
|
32
|
+
*
|
|
33
|
+
* References:
|
|
34
|
+
* BIP-340 https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
|
|
35
|
+
* FROST https://eprint.iacr.org/2020/852
|
|
36
|
+
*/
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.SchnorrDsg = exports.SchnorrDsgState = void 0;
|
|
39
|
+
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
40
|
+
const crypto_1 = require("crypto");
|
|
41
|
+
const cbor_x_1 = require("cbor-x");
|
|
42
|
+
// ── Curve constants ────────────────────────────────────────────────────────────
|
|
43
|
+
const N = secp256k1_1.secp256k1.CURVE.n; // secp256k1 order
|
|
44
|
+
const G = secp256k1_1.secp256k1.ProjectivePoint.BASE;
|
|
45
|
+
// ── Scalar arithmetic helpers ──────────────────────────────────────────────────
|
|
46
|
+
/** Reduce `x` into [0, N). */
|
|
47
|
+
function scalarMod(x) {
|
|
48
|
+
return ((x % N) + N) % N;
|
|
49
|
+
}
|
|
50
|
+
/** Modular inverse via extended Euclidean algorithm. */
|
|
51
|
+
function scalarInvert(a) {
|
|
52
|
+
let [r, rp] = [N, scalarMod(a)];
|
|
53
|
+
let [s, sp] = [BigInt(0), BigInt(1)];
|
|
54
|
+
while (rp !== BigInt(0)) {
|
|
55
|
+
const q = r / rp;
|
|
56
|
+
[r, rp] = [rp, r - q * rp];
|
|
57
|
+
[s, sp] = [sp, s - q * sp];
|
|
58
|
+
}
|
|
59
|
+
if (r !== BigInt(1))
|
|
60
|
+
throw new Error('scalarInvert: input has no inverse mod N');
|
|
61
|
+
return scalarMod(s);
|
|
62
|
+
}
|
|
63
|
+
/** Big-endian `Buffer | Uint8Array` → `bigint`. */
|
|
64
|
+
function bigFromBuf(b) {
|
|
65
|
+
const hex = Buffer.from(b).toString('hex');
|
|
66
|
+
return hex ? BigInt('0x' + hex) : BigInt(0);
|
|
67
|
+
}
|
|
68
|
+
/** `bigint` → 32-byte big-endian `Buffer`. */
|
|
69
|
+
function buf32(n) {
|
|
70
|
+
return Buffer.from(scalarMod(n).toString(16).padStart(64, '0'), 'hex');
|
|
71
|
+
}
|
|
72
|
+
// ── BIP-340 tagged hash ────────────────────────────────────────────────────────
|
|
73
|
+
/**
|
|
74
|
+
* H_tag(data...) = SHA256( SHA256(tag) ‖ SHA256(tag) ‖ data... )
|
|
75
|
+
* as specified in BIP-340.
|
|
76
|
+
*/
|
|
77
|
+
function taggedHash(tag, ...data) {
|
|
78
|
+
const tagHash = (0, crypto_1.createHash)('sha256').update(tag).digest();
|
|
79
|
+
const h = (0, crypto_1.createHash)('sha256');
|
|
80
|
+
h.update(tagHash);
|
|
81
|
+
h.update(tagHash);
|
|
82
|
+
for (const d of data)
|
|
83
|
+
h.update(d);
|
|
84
|
+
return h.digest();
|
|
85
|
+
}
|
|
86
|
+
// ── Lagrange coefficient ────────────────────────────────────────────────────────
|
|
87
|
+
/**
|
|
88
|
+
* Compute the Lagrange coefficient λ_i for party `partyIdx` evaluated at x=0,
|
|
89
|
+
* using only the x-coordinates of the parties in `signingPartyIndices`.
|
|
90
|
+
*
|
|
91
|
+
* λ_i = ∏_{j≠i, j∈S} x_j / (x_j − x_i) mod N
|
|
92
|
+
*
|
|
93
|
+
* @param xList Full `x_i_list` from the DKLS keyshare (one 32-byte array per party).
|
|
94
|
+
* @param partyIdx This party's index (0-based in the global party list).
|
|
95
|
+
* @param signingPartyIndices Indices of ALL parties participating in this signing session.
|
|
96
|
+
*/
|
|
97
|
+
function computeLagrangeCoeff(xList, partyIdx, signingPartyIndices) {
|
|
98
|
+
const xi = bigFromBuf(Buffer.from(xList[partyIdx]));
|
|
99
|
+
let num = BigInt(1);
|
|
100
|
+
let den = BigInt(1);
|
|
101
|
+
for (const j of signingPartyIndices) {
|
|
102
|
+
if (j === partyIdx)
|
|
103
|
+
continue;
|
|
104
|
+
const xj = bigFromBuf(Buffer.from(xList[j]));
|
|
105
|
+
num = scalarMod(num * xj);
|
|
106
|
+
den = scalarMod(den * scalarMod(xj - xi));
|
|
107
|
+
}
|
|
108
|
+
return scalarMod(num * scalarInvert(den));
|
|
109
|
+
}
|
|
110
|
+
// ── BIP-32 non-hardened derivation ─────────────────────────────────────────────
|
|
111
|
+
/**
|
|
112
|
+
* Parse a derivation path string (`'m/0/1/2'`) into an array of child indices.
|
|
113
|
+
* Hardened paths (`'m/44'/0'`) are not supported.
|
|
114
|
+
*/
|
|
115
|
+
function parsePath(path) {
|
|
116
|
+
if (path === 'm' || path === '')
|
|
117
|
+
return [];
|
|
118
|
+
const parts = path.replace(/^m\/?/, '').split('/');
|
|
119
|
+
return parts.map((p) => {
|
|
120
|
+
if (p.endsWith("'"))
|
|
121
|
+
throw new Error('Hardened derivation is not supported for Schnorr threshold signing.');
|
|
122
|
+
const idx = parseInt(p, 10);
|
|
123
|
+
if (isNaN(idx) || idx < 0 || idx >= 0x80000000)
|
|
124
|
+
throw new Error(`Invalid path component: ${p}`);
|
|
125
|
+
return idx;
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Derive the total IL scalar and final chaincode for a non-hardened BIP-32 path.
|
|
130
|
+
*
|
|
131
|
+
* BIP-32 non-hardened child key update:
|
|
132
|
+
* I = HMAC-SHA512(key=chainCode, data=compressedPubKey ‖ ser32(index))
|
|
133
|
+
* childPriv = parentPriv + IL (mod N)
|
|
134
|
+
* childPubKey = parentPubKey + IL * G
|
|
135
|
+
* childChainCode = IR
|
|
136
|
+
*
|
|
137
|
+
* For threshold signing, the IL scalars are additive, so the total private-key
|
|
138
|
+
* adjustment is `totalIL = Σ IL_k`. The caller is responsible for applying this
|
|
139
|
+
* to the right party's share.
|
|
140
|
+
*
|
|
141
|
+
* @returns `{ totalIL, finalChainCode, finalPubKey }` for the derived child.
|
|
142
|
+
*/
|
|
143
|
+
function derivePath(rootPubKey, rootChainCode, path) {
|
|
144
|
+
let pub = rootPubKey; // 33-byte compressed
|
|
145
|
+
let cc = rootChainCode; // 32-byte chaincode
|
|
146
|
+
let totalIL = BigInt(0);
|
|
147
|
+
for (const index of path) {
|
|
148
|
+
const indexBuf = Buffer.alloc(4);
|
|
149
|
+
indexBuf.writeUInt32BE(index, 0);
|
|
150
|
+
const I = Buffer.from((0, crypto_1.createHmac)('sha512', cc).update(pub).update(indexBuf).digest());
|
|
151
|
+
const IL = bigFromBuf(I.slice(0, 32));
|
|
152
|
+
const IR = I.slice(32);
|
|
153
|
+
if (IL >= N)
|
|
154
|
+
throw new Error('BIP-32 derived IL >= N; this path is invalid (astronomically unlikely).');
|
|
155
|
+
totalIL = scalarMod(totalIL + IL);
|
|
156
|
+
cc = IR;
|
|
157
|
+
// Advance the public key to the child level.
|
|
158
|
+
const pubPoint = secp256k1_1.secp256k1.ProjectivePoint.fromHex(pub.toString('hex'));
|
|
159
|
+
const childPoint = pubPoint.add(G.multiply(IL));
|
|
160
|
+
pub = Buffer.from(childPoint.toRawBytes(true));
|
|
161
|
+
}
|
|
162
|
+
return { totalIL, finalChainCode: cc, finalPubKey: pub };
|
|
163
|
+
}
|
|
164
|
+
var SchnorrDsgState;
|
|
165
|
+
(function (SchnorrDsgState) {
|
|
166
|
+
SchnorrDsgState[SchnorrDsgState["Uninitialized"] = 0] = "Uninitialized";
|
|
167
|
+
SchnorrDsgState[SchnorrDsgState["Round1"] = 1] = "Round1";
|
|
168
|
+
SchnorrDsgState[SchnorrDsgState["Round2"] = 2] = "Round2";
|
|
169
|
+
SchnorrDsgState[SchnorrDsgState["Complete"] = 3] = "Complete";
|
|
170
|
+
})(SchnorrDsgState || (exports.SchnorrDsgState = SchnorrDsgState = {}));
|
|
171
|
+
// ── SchnorrDsg ─────────────────────────────────────────────────────────────────
|
|
172
|
+
/**
|
|
173
|
+
* Two-party BIP-340 Schnorr threshold signing session.
|
|
174
|
+
*
|
|
175
|
+
* Compatible with keyshares produced by `DklsDkg.Dkg` (DKLS23 key generation).
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* ```ts
|
|
179
|
+
* // Party 0 (HSM / BitGo) and party 1 (user), 2-of-2 DKG keyshares.
|
|
180
|
+
* const party0 = new SchnorrDsg(ks0, 0, [0, 1], 'm/0', hash32);
|
|
181
|
+
* const party1 = new SchnorrDsg(ks1, 1, [0, 1], 'm/0', hash32);
|
|
182
|
+
*
|
|
183
|
+
* const r0 = await party0.init(); // Round 1
|
|
184
|
+
* const r1 = await party1.init();
|
|
185
|
+
*
|
|
186
|
+
* const s0 = party0.handleIncomingMessages({ broadcastMessages: [r1], p2pMessages: [] }); // Round 2
|
|
187
|
+
* const s1 = party1.handleIncomingMessages({ broadcastMessages: [r0], p2pMessages: [] });
|
|
188
|
+
*
|
|
189
|
+
* party0.handleIncomingMessages({ broadcastMessages: s1.broadcastMessages, p2pMessages: [] }); // Combine
|
|
190
|
+
* // party0.signature ← 64-byte BIP-340 Schnorr sig
|
|
191
|
+
* ```
|
|
192
|
+
*/
|
|
193
|
+
class SchnorrDsg {
|
|
194
|
+
/**
|
|
195
|
+
* @param keyShare CBOR-encoded DKLS keyshare (full or reduced format).
|
|
196
|
+
* @param partyIdx This party's index in the DKG (0-based, must be in `signingPartyIndices`).
|
|
197
|
+
* @param signingPartyIndices Indices of ALL parties participating in this signing session.
|
|
198
|
+
* Must contain `partyIdx`. The Lagrange coefficients are computed
|
|
199
|
+
* for this subset.
|
|
200
|
+
* @param derivationPath BIP-32 non-hardened path (e.g. `'m/0'`). Defaults to root `'m'`.
|
|
201
|
+
* @param messageHash 32-byte message hash to sign.
|
|
202
|
+
*/
|
|
203
|
+
constructor(keyShare, partyIdx, signingPartyIndices, derivationPath, messageHash) {
|
|
204
|
+
this.state = SchnorrDsgState.Uninitialized;
|
|
205
|
+
// Set in init()
|
|
206
|
+
this.ki = BigInt(0); // ephemeral nonce scalar
|
|
207
|
+
this.si = BigInt(0); // partial signature scalar
|
|
208
|
+
if (messageHash.length !== 32) {
|
|
209
|
+
throw new Error(`messageHash must be 32 bytes, got ${messageHash.length}`);
|
|
210
|
+
}
|
|
211
|
+
if (!signingPartyIndices.includes(partyIdx)) {
|
|
212
|
+
throw new Error(`partyIdx ${partyIdx} must be included in signingPartyIndices`);
|
|
213
|
+
}
|
|
214
|
+
if (signingPartyIndices.length < 2) {
|
|
215
|
+
throw new Error('signingPartyIndices must contain at least 2 parties');
|
|
216
|
+
}
|
|
217
|
+
this.partyIdx = partyIdx;
|
|
218
|
+
this.signingPartyIndices = signingPartyIndices;
|
|
219
|
+
this.messageHash = messageHash;
|
|
220
|
+
this.derivationPath = derivationPath;
|
|
221
|
+
const ks = (0, cbor_x_1.decode)(keyShare);
|
|
222
|
+
// Support both full keyshare (s_i / x_i_list / public_key / root_chain_code)
|
|
223
|
+
// and reduced keyshare (prv / xList / pub) as produced by Dkg.getReducedKeyShare().
|
|
224
|
+
const privBytes = ks.s_i ?? ks.prv;
|
|
225
|
+
const pubBytes = ks.public_key ?? ks.pub;
|
|
226
|
+
const ccBytes = ks.root_chain_code ?? ks.rootChainCode;
|
|
227
|
+
const xList = ks.x_i_list ?? ks.xList;
|
|
228
|
+
const si = bigFromBuf(Buffer.from(privBytes));
|
|
229
|
+
const rootPub = Buffer.from(pubBytes); // 33-byte compressed
|
|
230
|
+
const rootCC = Buffer.from(ccBytes); // 32-byte chaincode
|
|
231
|
+
// ── BIP-32 derivation ──────────────────────────────────────────────────
|
|
232
|
+
const path = parsePath(derivationPath);
|
|
233
|
+
let finalPubKey = rootPub;
|
|
234
|
+
let totalIL = BigInt(0);
|
|
235
|
+
if (path.length > 0) {
|
|
236
|
+
const derived = derivePath(rootPub, rootCC, path);
|
|
237
|
+
totalIL = derived.totalIL;
|
|
238
|
+
finalPubKey = derived.finalPubKey;
|
|
239
|
+
}
|
|
240
|
+
// ── Lagrange coefficient ───────────────────────────────────────────────
|
|
241
|
+
const li = computeLagrangeCoeff(xList, partyIdx, signingPartyIndices);
|
|
242
|
+
// ── BIP-340 public key parity adjustment ───────────────────────────────
|
|
243
|
+
// BIP-340 uses the x-only public key; the "canonical" key has even y.
|
|
244
|
+
// If the final derived public key has odd y, negate the private key.
|
|
245
|
+
const pYIsOdd = finalPubKey[0] === 0x03;
|
|
246
|
+
this.pubKeyX = finalPubKey.slice(1); // 32-byte x-only
|
|
247
|
+
// ── Effective private share ────────────────────────────────────────────
|
|
248
|
+
// Base share contribution: λ_i · s_i
|
|
249
|
+
let eff = scalarMod(li * si);
|
|
250
|
+
// BIP-32 IL adjustment: the party with the smallest index in the signing
|
|
251
|
+
// set absorbs the entire totalIL so that Lagrange interpolation over the
|
|
252
|
+
// adjusted shares reconstructs the correct child private key.
|
|
253
|
+
//
|
|
254
|
+
// sum_{k∈S} λ_k · s_k_adj = d_root + totalIL (= d_child)
|
|
255
|
+
//
|
|
256
|
+
// where s_min_adj = s_min + totalIL · λ_min^{-1}, s_k_adj = s_k (k≠min).
|
|
257
|
+
//
|
|
258
|
+
// From this party's perspective, the effective contribution is:
|
|
259
|
+
// if this is the min party: λ_min · s_min_adj = λ_min·s_min + totalIL
|
|
260
|
+
// otherwise: λ_k · s_k (unchanged)
|
|
261
|
+
const isMinParty = partyIdx === Math.min(...signingPartyIndices);
|
|
262
|
+
if (isMinParty && totalIL !== BigInt(0)) {
|
|
263
|
+
eff = scalarMod(eff + totalIL);
|
|
264
|
+
}
|
|
265
|
+
// If P.y is odd, negate the effective contribution.
|
|
266
|
+
if (pYIsOdd) {
|
|
267
|
+
eff = scalarMod(N - eff);
|
|
268
|
+
}
|
|
269
|
+
this.effectivePriv = eff;
|
|
270
|
+
}
|
|
271
|
+
/** The combined 64-byte BIP-340 Schnorr signature `(R.x_32 ‖ s_32)`. Available after `Complete`. */
|
|
272
|
+
get signature() {
|
|
273
|
+
if (!this._signature) {
|
|
274
|
+
throw new Error('Signature not produced yet.');
|
|
275
|
+
}
|
|
276
|
+
return this._signature;
|
|
277
|
+
}
|
|
278
|
+
get dsgState() {
|
|
279
|
+
return this.state;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Round 1: generate a fresh ephemeral nonce and broadcast the nonce point R_i.
|
|
283
|
+
* @returns Broadcast message containing the 33-byte compressed nonce point.
|
|
284
|
+
*/
|
|
285
|
+
async init() {
|
|
286
|
+
if (this.state !== SchnorrDsgState.Uninitialized) {
|
|
287
|
+
throw new Error('SchnorrDsg session already initialized.');
|
|
288
|
+
}
|
|
289
|
+
// Sample a random nonce scalar k_i in [1, N).
|
|
290
|
+
let kiBuf;
|
|
291
|
+
do {
|
|
292
|
+
kiBuf = Buffer.from((0, crypto_1.randomBytes)(32));
|
|
293
|
+
this.ki = bigFromBuf(kiBuf);
|
|
294
|
+
} while (this.ki === BigInt(0) || this.ki >= N);
|
|
295
|
+
this.Ri = G.multiply(this.ki);
|
|
296
|
+
this.state = SchnorrDsgState.Round1;
|
|
297
|
+
return {
|
|
298
|
+
payload: new Uint8Array(Buffer.from(this.Ri.toRawBytes(true))), // 33 bytes compressed
|
|
299
|
+
from: this.partyIdx,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Process incoming messages for the current round:
|
|
304
|
+
*
|
|
305
|
+
* - Round 1 → receives nonce point `R_j` → returns partial scalar `s_i`.
|
|
306
|
+
* - Round 2 → receives partial scalar `s_j` → produces final signature.
|
|
307
|
+
*/
|
|
308
|
+
handleIncomingMessages(messages) {
|
|
309
|
+
if (this.state === SchnorrDsgState.Round1) {
|
|
310
|
+
return this._handleRound1(messages);
|
|
311
|
+
}
|
|
312
|
+
if (this.state === SchnorrDsgState.Round2) {
|
|
313
|
+
return this._handleRound2(messages);
|
|
314
|
+
}
|
|
315
|
+
throw new Error(`handleIncomingMessages called in unexpected state: ${SchnorrDsgState[this.state]}`);
|
|
316
|
+
}
|
|
317
|
+
// ── Private round handlers ────────────────────────────────────────────────────
|
|
318
|
+
/**
|
|
319
|
+
* Round 1: receive R_j, compute combined R, apply BIP-340 parity, compute s_i.
|
|
320
|
+
*/
|
|
321
|
+
_handleRound1(messages) {
|
|
322
|
+
if (messages.broadcastMessages.length !== 1) {
|
|
323
|
+
throw new Error(`Round 1: expected 1 broadcast message (R_j), got ${messages.broadcastMessages.length}`);
|
|
324
|
+
}
|
|
325
|
+
if (!this.Ri)
|
|
326
|
+
throw new Error('Nonce point not set — call init() first.');
|
|
327
|
+
const Rj = secp256k1_1.secp256k1.ProjectivePoint.fromHex(Buffer.from(messages.broadcastMessages[0].payload).toString('hex'));
|
|
328
|
+
// Combine: R = R_i + R_j
|
|
329
|
+
const R_raw = this.Ri.add(Rj);
|
|
330
|
+
// BIP-340: R.y must be even. If odd, negate k_i (both parties will agree on
|
|
331
|
+
// the sign since they both see the same R = R_i + R_j).
|
|
332
|
+
const R_yIsOdd = R_raw.y % BigInt(2) === BigInt(1);
|
|
333
|
+
if (R_yIsOdd) {
|
|
334
|
+
this.ki = scalarMod(N - this.ki);
|
|
335
|
+
}
|
|
336
|
+
// Store the parity-normalised R (even y).
|
|
337
|
+
this.R_combined = R_yIsOdd ? R_raw.negate() : R_raw;
|
|
338
|
+
// BIP-340 challenge: e = H_tag("BIP0340/challenge", R.x_32 ‖ P.x_32 ‖ msg)
|
|
339
|
+
const Rx = buf32(this.R_combined.x);
|
|
340
|
+
const e = bigFromBuf(taggedHash('BIP0340/challenge', Rx, this.pubKeyX, this.messageHash));
|
|
341
|
+
// Partial signature: s_i = k_i + e · effectivePriv_i (mod N)
|
|
342
|
+
this.si = scalarMod(this.ki + scalarMod(e * this.effectivePriv));
|
|
343
|
+
this.state = SchnorrDsgState.Round2;
|
|
344
|
+
return {
|
|
345
|
+
broadcastMessages: [
|
|
346
|
+
{
|
|
347
|
+
payload: new Uint8Array(buf32(this.si)), // 32 bytes
|
|
348
|
+
from: this.partyIdx,
|
|
349
|
+
},
|
|
350
|
+
],
|
|
351
|
+
p2pMessages: [],
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Round 2 (combine): receive s_j, produce the final BIP-340 Schnorr signature.
|
|
356
|
+
*/
|
|
357
|
+
_handleRound2(messages) {
|
|
358
|
+
if (messages.broadcastMessages.length !== 1) {
|
|
359
|
+
throw new Error(`Round 2: expected 1 broadcast message (s_j), got ${messages.broadcastMessages.length}`);
|
|
360
|
+
}
|
|
361
|
+
if (!this.R_combined)
|
|
362
|
+
throw new Error('R_combined not set — handleRound1 must run first.');
|
|
363
|
+
const sj = bigFromBuf(Buffer.from(messages.broadcastMessages[0].payload));
|
|
364
|
+
const s = scalarMod(this.si + sj);
|
|
365
|
+
this._signature = {
|
|
366
|
+
R: new Uint8Array(buf32(this.R_combined.x)),
|
|
367
|
+
S: new Uint8Array(buf32(s)),
|
|
368
|
+
};
|
|
369
|
+
this.state = SchnorrDsgState.Complete;
|
|
370
|
+
return { broadcastMessages: [], p2pMessages: [] };
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
exports.SchnorrDsg = SchnorrDsg;
|
|
374
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHNnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9zY2hub3JyLWRrbHMvZHNnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDRzs7O0FBRUgsdURBQWlFO0FBQ2pFLG1DQUE2RDtBQUM3RCxtQ0FBZ0M7QUFHaEMsa0ZBQWtGO0FBRWxGLE1BQU0sQ0FBQyxHQUFHLHFCQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQjtBQUMvQyxNQUFNLENBQUMsR0FBRyxxQkFBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7QUFFekMsa0ZBQWtGO0FBRWxGLDhCQUE4QjtBQUM5QixTQUFTLFNBQVMsQ0FBQyxDQUFTO0lBQzFCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVELHdEQUF3RDtBQUN4RCxTQUFTLFlBQVksQ0FBQyxDQUFTO0lBQzdCLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxPQUFPLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFBSSxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUNqRixPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixDQUFDO0FBRUQsbURBQW1EO0FBQ25ELFNBQVMsVUFBVSxDQUFDLENBQXNCO0lBQ3hDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVELDhDQUE4QztBQUM5QyxTQUFTLEtBQUssQ0FBQyxDQUFTO0lBQ3RCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELGtGQUFrRjtBQUVsRjs7O0dBR0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFjO0lBQ2hELE1BQU0sT0FBTyxHQUFHLElBQUEsbUJBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDMUQsTUFBTSxDQUFDLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUk7UUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxtRkFBbUY7QUFFbkY7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxLQUFpQixFQUFFLFFBQWdCLEVBQUUsbUJBQTZCO0lBQzlGLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixLQUFLLE1BQU0sQ0FBQyxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssUUFBUTtZQUFFLFNBQVM7UUFDN0IsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMxQixHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQsa0ZBQWtGO0FBRWxGOzs7R0FHRztBQUNILFNBQVMsU0FBUyxDQUFDLElBQVk7SUFDN0IsSUFBSSxJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksS0FBSyxFQUFFO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ3JCLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDNUcsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxVQUFVO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoRyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxVQUFVLENBQ2pCLFVBQWtCLEVBQ2xCLGFBQXFCLEVBQ3JCLElBQWM7SUFFZCxJQUFJLEdBQUcsR0FBRyxVQUFVLENBQUMsQ0FBQyxxQkFBcUI7SUFDM0MsSUFBSSxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUMsb0JBQW9CO0lBQzVDLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV4QixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFakMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RixNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXZCLElBQUksRUFBRSxJQUFJLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxDQUFDLENBQUM7UUFFeEcsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUVSLDZDQUE2QztRQUM3QyxNQUFNLFFBQVEsR0FBRyxxQkFBUyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUMzRCxDQUFDO0FBWUQsSUFBWSxlQUtYO0FBTEQsV0FBWSxlQUFlO0lBQ3pCLHVFQUFpQixDQUFBO0lBQ2pCLHlEQUFNLENBQUE7SUFDTix5REFBTSxDQUFBO0lBQ04sNkRBQVEsQ0FBQTtBQUNWLENBQUMsRUFMVyxlQUFlLCtCQUFmLGVBQWUsUUFLMUI7QUFFRCxrRkFBa0Y7QUFFbEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBYSxVQUFVO0lBb0JyQjs7Ozs7Ozs7T0FRRztJQUNILFlBQ0UsUUFBZ0IsRUFDaEIsUUFBZ0IsRUFDaEIsbUJBQTZCLEVBQzdCLGNBQXNCLEVBQ3RCLFdBQW1CO1FBN0JiLFVBQUssR0FBb0IsZUFBZSxDQUFDLGFBQWEsQ0FBQztRQU8vRCxnQkFBZ0I7UUFDUixPQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQXlCO1FBS3pDLE9BQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywyQkFBMkI7UUFrQmpELElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxRQUFRLDBDQUEwQyxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELElBQUksbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBQy9DLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBRXJDLE1BQU0sRUFBRSxHQUFHLElBQUEsZUFBTSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVCLDZFQUE2RTtRQUM3RSxvRkFBb0Y7UUFDcEYsTUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQzdDLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQztRQUNuRCxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDakUsTUFBTSxLQUFLLEdBQWUsRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO1FBRWxELE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtRQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsb0JBQW9CO1FBRXpELDBFQUEwRTtRQUMxRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkMsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDO1FBQzFCLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4QixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEIsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDMUIsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDcEMsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSxNQUFNLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFFdEUsMEVBQTBFO1FBQzFFLHNFQUFzRTtRQUN0RSxxRUFBcUU7UUFDckUsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUI7UUFFdEQsMEVBQTBFO1FBQzFFLHFDQUFxQztRQUNyQyxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRTdCLHlFQUF5RTtRQUN6RSx5RUFBeUU7UUFDekUsOERBQThEO1FBQzlELEVBQUU7UUFDRiw0REFBNEQ7UUFDNUQsRUFBRTtRQUNGLDJFQUEyRTtRQUMzRSxFQUFFO1FBQ0YsZ0VBQWdFO1FBQ2hFLHdFQUF3RTtRQUN4RSw0REFBNEQ7UUFDNUQsTUFBTSxVQUFVLEdBQUcsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2pFLElBQUksVUFBVSxJQUFJLE9BQU8sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsb0RBQW9EO1FBQ3BELElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7SUFDM0IsQ0FBQztJQUVELG9HQUFvRztJQUNwRyxJQUFJLFNBQVM7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxJQUFJO1FBQ1IsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUVELDhDQUE4QztRQUM5QyxJQUFJLEtBQWEsQ0FBQztRQUNsQixHQUFHLENBQUM7WUFDRixLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFBLG9CQUFXLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUU7UUFFaEQsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFFcEMsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxzQkFBc0I7WUFDdEYsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3BCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxzQkFBc0IsQ0FBQyxRQUE4QjtRQUNuRCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFFRCxpRkFBaUY7SUFFakY7O09BRUc7SUFDSyxhQUFhLENBQUMsUUFBOEI7UUFDbEQsSUFBSSxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzNHLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFFMUUsTUFBTSxFQUFFLEdBQUcscUJBQVMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWpILHlCQUF5QjtRQUN6QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU5Qiw2RUFBNkU7UUFDN0Usd0RBQXdEO1FBQ3hELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUVwRCwyRUFBMkU7UUFDM0UsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUUxRiw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQztRQUVwQyxPQUFPO1lBQ0wsaUJBQWlCLEVBQUU7Z0JBQ2pCO29CQUNFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsV0FBVztvQkFDcEQsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRO2lCQUNwQjthQUNGO1lBQ0QsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLGFBQWEsQ0FBQyxRQUE4QjtRQUNsRCxJQUFJLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDM0csQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUUzRixNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMxRSxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUVsQyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQyxDQUFDLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVCLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUM7UUFFdEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBck9ELGdDQXFPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHdvLXBhcnR5IEJJUC0zNDAgU2Nobm9yciB0aHJlc2hvbGQgc2lnbmluZyAoU2Nobm9yckRzZykuXG4gKlxuICogV29ya3Mgd2l0aCB0aGUgU2hhbWlyIGtleXNoYXJlcyBwcm9kdWNlZCBieSBgRGtsc0RrZ2AgKERLTFMyMyBrZXkgZ2VuZXJhdGlvbikuXG4gKiBObyBuZXcgV0FTTSBpcyByZXF1aXJlZDoga2V5IG1hdGVyaWFsIGlzIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgQ0JPUi1lbmNvZGVkXG4gKiBrZXlzaGFyZSwgTGFncmFuZ2UgaW50ZXJwb2xhdGlvbiBpcyBjb21wdXRlZCBpbiBUeXBlU2NyaXB0LCBhbmQgQklQLTM0MCBTY2hub3JyXG4gKiBhbGdlYnJhIGlzIHBlcmZvcm1lZCB3aXRoIGBAbm9ibGUvY3VydmVzL3NlY3AyNTZrMWAuXG4gKlxuICogUHJvdG9jb2wgKDIgYnJvYWRjYXN0IHJvdW5kcyk6XG4gKlxuICogICBSb3VuZCAxICBpbml0KClcbiAqICAgICDigKIgRWFjaCBwYXJ0eSBnZW5lcmF0ZXMgYSByYW5kb20gbm9uY2Ugc2NhbGFyIGtfaS5cbiAqICAgICDigKIgQnJvYWRjYXN0cyB0aGUgbm9uY2UgcG9pbnQgUl9pID0ga19pICogRyAgKDMzLWJ5dGUgY29tcHJlc3NlZCkuXG4gKlxuICogICBSb3VuZCAyICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFtSX2pdKVxuICogICAgIOKAoiBDb21wdXRlIGNvbWJpbmVkIG5vbmNlIFIgPSBSX2kgKyBSX2ouXG4gKiAgICAg4oCiIElmIFIueSBpcyBvZGQsIG5lZ2F0ZSBrX2kgIChCSVAtMzQwIHJlcXVpcmVzIGV2ZW4teSBSKS5cbiAqICAgICDigKIgQ29tcHV0ZSBCSVAtMzQwIGNoYWxsZW5nZSAgZSA9IEgoXCJCSVAwMzQwL2NoYWxsZW5nZVwiLCBSLngg4oCWIFAueCDigJYgbXNnKS5cbiAqICAgICDigKIgQ29tcHV0ZSBwYXJ0aWFsIHNpZ25hdHVyZSAgc19pID0ga19pICsgZSDCtyDOu19pIMK3IHByaXZfaSAgIChtb2QgbikuXG4gKiAgICAg4oCiIEJyb2FkY2FzdHMgc19pIGFzIDMyLWJ5dGUgYmlnLWVuZGlhbiBzY2FsYXIuXG4gKlxuICogICBDb21iaW5lICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFtzX2pdKVxuICogICAgIOKAoiBzID0gc19pICsgc19qICBtb2Qgbi5cbiAqICAgICDigKIgc2lnbmF0dXJlID0gQnVmZmVyLmNvbmNhdChbUi54XzMyLCBzXzMyXSkgIOKAlCA2NC1ieXRlIEJJUC0zNDAgU2Nobm9yci5cbiAqXG4gKiBCSVAtMzIgbm9uLWhhcmRlbmVkIGRlcml2YXRpb24gaXMgc3VwcG9ydGVkLiAgRm9yIHBhdGggYG0vYS9iLy4uLmAsIHRoZSB0b3RhbFxuICogSUwgc2NhbGFyIChzdW0gb2YgcGVyLWxldmVsIEhNQUMtU0hBNTEyIGxlZnQgaGFsdmVzKSBpcyBjb21wdXRlZCBmcm9tIHRoZVxuICogc2hhcmVkIHB1YmxpYyBrZXkgLyBjaGFpbmNvZGUuICBUaGUgcGFydHkgd2l0aCB0aGUgc21hbGxlc3QgaW5kZXggaW5cbiAqIGBzaWduaW5nUGFydHlJbmRpY2VzYCBhYnNvcmJzIHRoZSBlbnRpcmUgSUwgYWRqdXN0bWVudCBzbyB0aGF0IExhZ3JhbmdlXG4gKiBpbnRlcnBvbGF0aW9uIHN0aWxsIHJlY29uc3RydWN0cyB0aGUgY29ycmVjdCBjaGlsZCBwcml2YXRlIGtleS5cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICogICBCSVAtMzQwICBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzQwLm1lZGlhd2lraVxuICogICBGUk9TVCAgICBodHRwczovL2VwcmludC5pYWNyLm9yZy8yMDIwLzg1MlxuICovXG5cbmltcG9ydCB7IHNlY3AyNTZrMSBhcyBub2JsZVNlY3AgfSBmcm9tICdAbm9ibGUvY3VydmVzL3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBjcmVhdGVIbWFjLCByYW5kb21CeXRlcywgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkQnJvYWRjYXN0TWVzc2FnZSwgRGVzZXJpYWxpemVkTWVzc2FnZXMgfSBmcm9tICcuLi9lY2RzYS1ka2xzL3R5cGVzJztcblxuLy8g4pSA4pSAIEN1cnZlIGNvbnN0YW50cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuY29uc3QgTiA9IG5vYmxlU2VjcC5DVVJWRS5uOyAvLyBzZWNwMjU2azEgb3JkZXJcbmNvbnN0IEcgPSBub2JsZVNlY3AuUHJvamVjdGl2ZVBvaW50LkJBU0U7XG5cbi8vIOKUgOKUgCBTY2FsYXIgYXJpdGhtZXRpYyBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogUmVkdWNlIGB4YCBpbnRvIFswLCBOKS4gKi9cbmZ1bmN0aW9uIHNjYWxhck1vZCh4OiBiaWdpbnQpOiBiaWdpbnQge1xuICByZXR1cm4gKCh4ICUgTikgKyBOKSAlIE47XG59XG5cbi8qKiBNb2R1bGFyIGludmVyc2UgdmlhIGV4dGVuZGVkIEV1Y2xpZGVhbiBhbGdvcml0aG0uICovXG5mdW5jdGlvbiBzY2FsYXJJbnZlcnQoYTogYmlnaW50KTogYmlnaW50IHtcbiAgbGV0IFtyLCBycF0gPSBbTiwgc2NhbGFyTW9kKGEpXTtcbiAgbGV0IFtzLCBzcF0gPSBbQmlnSW50KDApLCBCaWdJbnQoMSldO1xuICB3aGlsZSAocnAgIT09IEJpZ0ludCgwKSkge1xuICAgIGNvbnN0IHEgPSByIC8gcnA7XG4gICAgW3IsIHJwXSA9IFtycCwgciAtIHEgKiBycF07XG4gICAgW3MsIHNwXSA9IFtzcCwgcyAtIHEgKiBzcF07XG4gIH1cbiAgaWYgKHIgIT09IEJpZ0ludCgxKSkgdGhyb3cgbmV3IEVycm9yKCdzY2FsYXJJbnZlcnQ6IGlucHV0IGhhcyBubyBpbnZlcnNlIG1vZCBOJyk7XG4gIHJldHVybiBzY2FsYXJNb2Qocyk7XG59XG5cbi8qKiBCaWctZW5kaWFuIGBCdWZmZXIgfCBVaW50OEFycmF5YCDihpIgYGJpZ2ludGAuICovXG5mdW5jdGlvbiBiaWdGcm9tQnVmKGI6IEJ1ZmZlciB8IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICBjb25zdCBoZXggPSBCdWZmZXIuZnJvbShiKS50b1N0cmluZygnaGV4Jyk7XG4gIHJldHVybiBoZXggPyBCaWdJbnQoJzB4JyArIGhleCkgOiBCaWdJbnQoMCk7XG59XG5cbi8qKiBgYmlnaW50YCDihpIgMzItYnl0ZSBiaWctZW5kaWFuIGBCdWZmZXJgLiAqL1xuZnVuY3Rpb24gYnVmMzIobjogYmlnaW50KTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNjYWxhck1vZChuKS50b1N0cmluZygxNikucGFkU3RhcnQoNjQsICcwJyksICdoZXgnKTtcbn1cblxuLy8g4pSA4pSAIEJJUC0zNDAgdGFnZ2VkIGhhc2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogSF90YWcoZGF0YS4uLikgPSBTSEEyNTYoIFNIQTI1Nih0YWcpIOKAliBTSEEyNTYodGFnKSDigJYgZGF0YS4uLiApXG4gKiBhcyBzcGVjaWZpZWQgaW4gQklQLTM0MC5cbiAqL1xuZnVuY3Rpb24gdGFnZ2VkSGFzaCh0YWc6IHN0cmluZywgLi4uZGF0YTogQnVmZmVyW10pOiBCdWZmZXIge1xuICBjb25zdCB0YWdIYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHRhZykuZGlnZXN0KCk7XG4gIGNvbnN0IGggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcbiAgaC51cGRhdGUodGFnSGFzaCk7XG4gIGgudXBkYXRlKHRhZ0hhc2gpO1xuICBmb3IgKGNvbnN0IGQgb2YgZGF0YSkgaC51cGRhdGUoZCk7XG4gIHJldHVybiBoLmRpZ2VzdCgpO1xufVxuXG4vLyDilIDilIAgTGFncmFuZ2UgY29lZmZpY2llbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgTGFncmFuZ2UgY29lZmZpY2llbnQgzrtfaSBmb3IgcGFydHkgYHBhcnR5SWR4YCBldmFsdWF0ZWQgYXQgeD0wLFxuICogdXNpbmcgb25seSB0aGUgeC1jb29yZGluYXRlcyBvZiB0aGUgcGFydGllcyBpbiBgc2lnbmluZ1BhcnR5SW5kaWNlc2AuXG4gKlxuICogzrtfaSA9IOKIj197auKJoGksIGriiIhTfSAgeF9qIC8gKHhfaiDiiJIgeF9pKSAgIG1vZCBOXG4gKlxuICogQHBhcmFtIHhMaXN0ICAgICAgIEZ1bGwgYHhfaV9saXN0YCBmcm9tIHRoZSBES0xTIGtleXNoYXJlIChvbmUgMzItYnl0ZSBhcnJheSBwZXIgcGFydHkpLlxuICogQHBhcmFtIHBhcnR5SWR4ICAgIFRoaXMgcGFydHkncyBpbmRleCAoMC1iYXNlZCBpbiB0aGUgZ2xvYmFsIHBhcnR5IGxpc3QpLlxuICogQHBhcmFtIHNpZ25pbmdQYXJ0eUluZGljZXMgIEluZGljZXMgb2YgQUxMIHBhcnRpZXMgcGFydGljaXBhdGluZyBpbiB0aGlzIHNpZ25pbmcgc2Vzc2lvbi5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUxhZ3JhbmdlQ29lZmYoeExpc3Q6IG51bWJlcltdW10sIHBhcnR5SWR4OiBudW1iZXIsIHNpZ25pbmdQYXJ0eUluZGljZXM6IG51bWJlcltdKTogYmlnaW50IHtcbiAgY29uc3QgeGkgPSBiaWdGcm9tQnVmKEJ1ZmZlci5mcm9tKHhMaXN0W3BhcnR5SWR4XSkpO1xuICBsZXQgbnVtID0gQmlnSW50KDEpO1xuICBsZXQgZGVuID0gQmlnSW50KDEpO1xuICBmb3IgKGNvbnN0IGogb2Ygc2lnbmluZ1BhcnR5SW5kaWNlcykge1xuICAgIGlmIChqID09PSBwYXJ0eUlkeCkgY29udGludWU7XG4gICAgY29uc3QgeGogPSBiaWdGcm9tQnVmKEJ1ZmZlci5mcm9tKHhMaXN0W2pdKSk7XG4gICAgbnVtID0gc2NhbGFyTW9kKG51bSAqIHhqKTtcbiAgICBkZW4gPSBzY2FsYXJNb2QoZGVuICogc2NhbGFyTW9kKHhqIC0geGkpKTtcbiAgfVxuICByZXR1cm4gc2NhbGFyTW9kKG51bSAqIHNjYWxhckludmVydChkZW4pKTtcbn1cblxuLy8g4pSA4pSAIEJJUC0zMiBub24taGFyZGVuZWQgZGVyaXZhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBQYXJzZSBhIGRlcml2YXRpb24gcGF0aCBzdHJpbmcgKGAnbS8wLzEvMidgKSBpbnRvIGFuIGFycmF5IG9mIGNoaWxkIGluZGljZXMuXG4gKiBIYXJkZW5lZCBwYXRocyAoYCdtLzQ0Jy8wJ2ApIGFyZSBub3Qgc3VwcG9ydGVkLlxuICovXG5mdW5jdGlvbiBwYXJzZVBhdGgocGF0aDogc3RyaW5nKTogbnVtYmVyW10ge1xuICBpZiAocGF0aCA9PT0gJ20nIHx8IHBhdGggPT09ICcnKSByZXR1cm4gW107XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5yZXBsYWNlKC9ebVxcLz8vLCAnJykuc3BsaXQoJy8nKTtcbiAgcmV0dXJuIHBhcnRzLm1hcCgocCkgPT4ge1xuICAgIGlmIChwLmVuZHNXaXRoKFwiJ1wiKSkgdGhyb3cgbmV3IEVycm9yKCdIYXJkZW5lZCBkZXJpdmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNjaG5vcnIgdGhyZXNob2xkIHNpZ25pbmcuJyk7XG4gICAgY29uc3QgaWR4ID0gcGFyc2VJbnQocCwgMTApO1xuICAgIGlmIChpc05hTihpZHgpIHx8IGlkeCA8IDAgfHwgaWR4ID49IDB4ODAwMDAwMDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXRoIGNvbXBvbmVudDogJHtwfWApO1xuICAgIHJldHVybiBpZHg7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlcml2ZSB0aGUgdG90YWwgSUwgc2NhbGFyIGFuZCBmaW5hbCBjaGFpbmNvZGUgZm9yIGEgbm9uLWhhcmRlbmVkIEJJUC0zMiBwYXRoLlxuICpcbiAqIEJJUC0zMiBub24taGFyZGVuZWQgY2hpbGQga2V5IHVwZGF0ZTpcbiAqICAgSSA9IEhNQUMtU0hBNTEyKGtleT1jaGFpbkNvZGUsIGRhdGE9Y29tcHJlc3NlZFB1YktleSDigJYgc2VyMzIoaW5kZXgpKVxuICogICBjaGlsZFByaXYgICAgPSBwYXJlbnRQcml2ICsgSUwgICAobW9kIE4pXG4gKiAgIGNoaWxkUHViS2V5ICA9IHBhcmVudFB1YktleSArIElMICogR1xuICogICBjaGlsZENoYWluQ29kZSA9IElSXG4gKlxuICogRm9yIHRocmVzaG9sZCBzaWduaW5nLCB0aGUgSUwgc2NhbGFycyBhcmUgYWRkaXRpdmUsIHNvIHRoZSB0b3RhbCBwcml2YXRlLWtleVxuICogYWRqdXN0bWVudCBpcyBgdG90YWxJTCA9IM6jIElMX2tgLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYXBwbHlpbmcgdGhpc1xuICogdG8gdGhlIHJpZ2h0IHBhcnR5J3Mgc2hhcmUuXG4gKlxuICogQHJldHVybnMgYHsgdG90YWxJTCwgZmluYWxDaGFpbkNvZGUsIGZpbmFsUHViS2V5IH1gIGZvciB0aGUgZGVyaXZlZCBjaGlsZC5cbiAqL1xuZnVuY3Rpb24gZGVyaXZlUGF0aChcbiAgcm9vdFB1YktleTogQnVmZmVyLFxuICByb290Q2hhaW5Db2RlOiBCdWZmZXIsXG4gIHBhdGg6IG51bWJlcltdXG4pOiB7IHRvdGFsSUw6IGJpZ2ludDsgZmluYWxDaGFpbkNvZGU6IEJ1ZmZlcjsgZmluYWxQdWJLZXk6IEJ1ZmZlciB9IHtcbiAgbGV0IHB1YiA9IHJvb3RQdWJLZXk7IC8vIDMzLWJ5dGUgY29tcHJlc3NlZFxuICBsZXQgY2MgPSByb290Q2hhaW5Db2RlOyAvLyAzMi1ieXRlIGNoYWluY29kZVxuICBsZXQgdG90YWxJTCA9IEJpZ0ludCgwKTtcblxuICBmb3IgKGNvbnN0IGluZGV4IG9mIHBhdGgpIHtcbiAgICBjb25zdCBpbmRleEJ1ZiA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBpbmRleEJ1Zi53cml0ZVVJbnQzMkJFKGluZGV4LCAwKTtcblxuICAgIGNvbnN0IEkgPSBCdWZmZXIuZnJvbShjcmVhdGVIbWFjKCdzaGE1MTInLCBjYykudXBkYXRlKHB1YikudXBkYXRlKGluZGV4QnVmKS5kaWdlc3QoKSk7XG4gICAgY29uc3QgSUwgPSBiaWdGcm9tQnVmKEkuc2xpY2UoMCwgMzIpKTtcbiAgICBjb25zdCBJUiA9IEkuc2xpY2UoMzIpO1xuXG4gICAgaWYgKElMID49IE4pIHRocm93IG5ldyBFcnJvcignQklQLTMyIGRlcml2ZWQgSUwgPj0gTjsgdGhpcyBwYXRoIGlzIGludmFsaWQgKGFzdHJvbm9taWNhbGx5IHVubGlrZWx5KS4nKTtcblxuICAgIHRvdGFsSUwgPSBzY2FsYXJNb2QodG90YWxJTCArIElMKTtcbiAgICBjYyA9IElSO1xuXG4gICAgLy8gQWR2YW5jZSB0aGUgcHVibGljIGtleSB0byB0aGUgY2hpbGQgbGV2ZWwuXG4gICAgY29uc3QgcHViUG9pbnQgPSBub2JsZVNlY3AuUHJvamVjdGl2ZVBvaW50LmZyb21IZXgocHViLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgY29uc3QgY2hpbGRQb2ludCA9IHB1YlBvaW50LmFkZChHLm11bHRpcGx5KElMKSk7XG4gICAgcHViID0gQnVmZmVyLmZyb20oY2hpbGRQb2ludC50b1Jhd0J5dGVzKHRydWUpKTtcbiAgfVxuXG4gIHJldHVybiB7IHRvdGFsSUwsIGZpbmFsQ2hhaW5Db2RlOiBjYywgZmluYWxQdWJLZXk6IHB1YiB9O1xufVxuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiA2NC1ieXRlIEJJUC0zNDAgU2Nobm9yciBzaWduYXR1cmUgYChSLnhfMzIg4oCWIHNfMzIpYC4gKi9cbmV4cG9ydCB0eXBlIFNjaG5vcnJEa2xzU2lnbmF0dXJlID0ge1xuICAvKiogMzItYnl0ZSB4LWNvb3JkaW5hdGUgb2YgdGhlIG5vbmNlIHBvaW50IFIuICovXG4gIFI6IFVpbnQ4QXJyYXk7XG4gIC8qKiAzMi1ieXRlIFNjaG5vcnIgc2NhbGFyIHMuICovXG4gIFM6IFVpbnQ4QXJyYXk7XG59O1xuXG5leHBvcnQgZW51bSBTY2hub3JyRHNnU3RhdGUge1xuICBVbmluaXRpYWxpemVkID0gMCxcbiAgUm91bmQxLCAvLyB3YWl0aW5nIHRvIHJlY2VpdmUgdGhlIG90aGVyIHBhcnR5J3Mgbm9uY2UgcG9pbnQgUl9qXG4gIFJvdW5kMiwgLy8gd2FpdGluZyB0byByZWNlaXZlIHRoZSBvdGhlciBwYXJ0eSdzIHBhcnRpYWwgc2NhbGFyIHNfalxuICBDb21wbGV0ZSxcbn1cblxuLy8g4pSA4pSAIFNjaG5vcnJEc2cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVHdvLXBhcnR5IEJJUC0zNDAgU2Nobm9yciB0aHJlc2hvbGQgc2lnbmluZyBzZXNzaW9uLlxuICpcbiAqIENvbXBhdGlibGUgd2l0aCBrZXlzaGFyZXMgcHJvZHVjZWQgYnkgYERrbHNEa2cuRGtnYCAoREtMUzIzIGtleSBnZW5lcmF0aW9uKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIFBhcnR5IDAgKEhTTSAvIEJpdEdvKSBhbmQgcGFydHkgMSAodXNlciksIDItb2YtMiBES0cga2V5c2hhcmVzLlxuICogY29uc3QgcGFydHkwID0gbmV3IFNjaG5vcnJEc2coa3MwLCAwLCBbMCwgMV0sICdtLzAnLCBoYXNoMzIpO1xuICogY29uc3QgcGFydHkxID0gbmV3IFNjaG5vcnJEc2coa3MxLCAxLCBbMCwgMV0sICdtLzAnLCBoYXNoMzIpO1xuICpcbiAqIGNvbnN0IHIwID0gYXdhaXQgcGFydHkwLmluaXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUm91bmQgMVxuICogY29uc3QgcjEgPSBhd2FpdCBwYXJ0eTEuaW5pdCgpO1xuICpcbiAqIGNvbnN0IHMwID0gcGFydHkwLmhhbmRsZUluY29taW5nTWVzc2FnZXMoeyBicm9hZGNhc3RNZXNzYWdlczogW3IxXSwgcDJwTWVzc2FnZXM6IFtdIH0pOyAvLyBSb3VuZCAyXG4gKiBjb25zdCBzMSA9IHBhcnR5MS5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtyMF0sIHAycE1lc3NhZ2VzOiBbXSB9KTtcbiAqXG4gKiBwYXJ0eTAuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7IGJyb2FkY2FzdE1lc3NhZ2VzOiBzMS5icm9hZGNhc3RNZXNzYWdlcywgcDJwTWVzc2FnZXM6IFtdIH0pOyAvLyBDb21iaW5lXG4gKiAvLyBwYXJ0eTAuc2lnbmF0dXJlICDihpAgNjQtYnl0ZSBCSVAtMzQwIFNjaG5vcnIgc2lnXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNjaG5vcnJEc2cge1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcnR5SWR4OiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2lnbmluZ1BhcnR5SW5kaWNlczogbnVtYmVyW107XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZUhhc2g6IEJ1ZmZlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXJpdmF0aW9uUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHN0YXRlOiBTY2hub3JyRHNnU3RhdGUgPSBTY2hub3JyRHNnU3RhdGUuVW5pbml0aWFsaXplZDtcbiAgcHJpdmF0ZSBfc2lnbmF0dXJlOiBTY2hub3JyRGtsc1NpZ25hdHVyZSB8IHVuZGVmaW5lZDtcblxuICAvLyBDb21wdXRlZCBpbiBjb25zdHJ1Y3RvclxuICBwcml2YXRlIHJlYWRvbmx5IGVmZmVjdGl2ZVByaXY6IGJpZ2ludDsgLy8gzrtfaSDCtyBwcml2X2kgKHBhcml0eS1hZGp1c3RlZCwgZGVyaXZhdGlvbi1hZGp1c3RlZClcbiAgcHJpdmF0ZSByZWFkb25seSBwdWJLZXlYOiBCdWZmZXI7IC8vIDMyLWJ5dGUgeC1vbmx5IGZpbmFsIHB1YmxpYyBrZXkgKGZvciBjaGFsbGVuZ2UgaGFzaClcblxuICAvLyBTZXQgaW4gaW5pdCgpXG4gIHByaXZhdGUga2kgPSBCaWdJbnQoMCk7IC8vIGVwaGVtZXJhbCBub25jZSBzY2FsYXJcbiAgcHJpdmF0ZSBSaTogUmV0dXJuVHlwZTx0eXBlb2Ygbm9ibGVTZWNwLlByb2plY3RpdmVQb2ludC5mcm9tSGV4PiB8IHVuZGVmaW5lZDtcblxuICAvLyBTZXQgaW4gcm91bmQtMSBoYW5kbGVyXG4gIHByaXZhdGUgUl9jb21iaW5lZDogUmV0dXJuVHlwZTx0eXBlb2Ygbm9ibGVTZWNwLlByb2plY3RpdmVQb2ludC5mcm9tSGV4PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzaSA9IEJpZ0ludCgwKTsgLy8gcGFydGlhbCBzaWduYXR1cmUgc2NhbGFyXG5cbiAgLyoqXG4gICAqIEBwYXJhbSBrZXlTaGFyZSAgICAgICAgICAgIENCT1ItZW5jb2RlZCBES0xTIGtleXNoYXJlIChmdWxsIG9yIHJlZHVjZWQgZm9ybWF0KS5cbiAgICogQHBhcmFtIHBhcnR5SWR4ICAgICAgICAgICAgVGhpcyBwYXJ0eSdzIGluZGV4IGluIHRoZSBES0cgKDAtYmFzZWQsIG11c3QgYmUgaW4gYHNpZ25pbmdQYXJ0eUluZGljZXNgKS5cbiAgICogQHBhcmFtIHNpZ25pbmdQYXJ0eUluZGljZXMgSW5kaWNlcyBvZiBBTEwgcGFydGllcyBwYXJ0aWNpcGF0aW5nIGluIHRoaXMgc2lnbmluZyBzZXNzaW9uLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGNvbnRhaW4gYHBhcnR5SWR4YC4gIFRoZSBMYWdyYW5nZSBjb2VmZmljaWVudHMgYXJlIGNvbXB1dGVkXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIHN1YnNldC5cbiAgICogQHBhcmFtIGRlcml2YXRpb25QYXRoICAgICAgQklQLTMyIG5vbi1oYXJkZW5lZCBwYXRoIChlLmcuIGAnbS8wJ2ApLiAgRGVmYXVsdHMgdG8gcm9vdCBgJ20nYC5cbiAgICogQHBhcmFtIG1lc3NhZ2VIYXNoICAgICAgICAgMzItYnl0ZSBtZXNzYWdlIGhhc2ggdG8gc2lnbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGtleVNoYXJlOiBCdWZmZXIsXG4gICAgcGFydHlJZHg6IG51bWJlcixcbiAgICBzaWduaW5nUGFydHlJbmRpY2VzOiBudW1iZXJbXSxcbiAgICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIG1lc3NhZ2VIYXNoOiBCdWZmZXJcbiAgKSB7XG4gICAgaWYgKG1lc3NhZ2VIYXNoLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbWVzc2FnZUhhc2ggbXVzdCBiZSAzMiBieXRlcywgZ290ICR7bWVzc2FnZUhhc2gubGVuZ3RofWApO1xuICAgIH1cbiAgICBpZiAoIXNpZ25pbmdQYXJ0eUluZGljZXMuaW5jbHVkZXMocGFydHlJZHgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHBhcnR5SWR4ICR7cGFydHlJZHh9IG11c3QgYmUgaW5jbHVkZWQgaW4gc2lnbmluZ1BhcnR5SW5kaWNlc2ApO1xuICAgIH1cbiAgICBpZiAoc2lnbmluZ1BhcnR5SW5kaWNlcy5sZW5ndGggPCAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25pbmdQYXJ0eUluZGljZXMgbXVzdCBjb250YWluIGF0IGxlYXN0IDIgcGFydGllcycpO1xuICAgIH1cblxuICAgIHRoaXMucGFydHlJZHggPSBwYXJ0eUlkeDtcbiAgICB0aGlzLnNpZ25pbmdQYXJ0eUluZGljZXMgPSBzaWduaW5nUGFydHlJbmRpY2VzO1xuICAgIHRoaXMubWVzc2FnZUhhc2ggPSBtZXNzYWdlSGFzaDtcbiAgICB0aGlzLmRlcml2YXRpb25QYXRoID0gZGVyaXZhdGlvblBhdGg7XG5cbiAgICBjb25zdCBrcyA9IGRlY29kZShrZXlTaGFyZSk7XG5cbiAgICAvLyBTdXBwb3J0IGJvdGggZnVsbCBrZXlzaGFyZSAoc19pIC8geF9pX2xpc3QgLyBwdWJsaWNfa2V5IC8gcm9vdF9jaGFpbl9jb2RlKVxuICAgIC8vIGFuZCByZWR1Y2VkIGtleXNoYXJlIChwcnYgLyB4TGlzdCAvIHB1YikgYXMgcHJvZHVjZWQgYnkgRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpLlxuICAgIGNvbnN0IHByaXZCeXRlczogbnVtYmVyW10gPSBrcy5zX2kgPz8ga3MucHJ2O1xuICAgIGNvbnN0IHB1YkJ5dGVzOiBudW1iZXJbXSA9IGtzLnB1YmxpY19rZXkgPz8ga3MucHViO1xuICAgIGNvbnN0IGNjQnl0ZXM6IG51bWJlcltdID0ga3Mucm9vdF9jaGFpbl9jb2RlID8/IGtzLnJvb3RDaGFpbkNvZGU7XG4gICAgY29uc3QgeExpc3Q6IG51bWJlcltdW10gPSBrcy54X2lfbGlzdCA/PyBrcy54TGlzdDtcblxuICAgIGNvbnN0IHNpID0gYmlnRnJvbUJ1ZihCdWZmZXIuZnJvbShwcml2Qnl0ZXMpKTtcbiAgICBjb25zdCByb290UHViID0gQnVmZmVyLmZyb20ocHViQnl0ZXMpOyAvLyAzMy1ieXRlIGNvbXByZXNzZWRcbiAgICBjb25zdCByb290Q0MgPSBCdWZmZXIuZnJvbShjY0J5dGVzKTsgLy8gMzItYnl0ZSBjaGFpbmNvZGVcblxuICAgIC8vIOKUgOKUgCBCSVAtMzIgZGVyaXZhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBwYXRoID0gcGFyc2VQYXRoKGRlcml2YXRpb25QYXRoKTtcbiAgICBsZXQgZmluYWxQdWJLZXkgPSByb290UHViO1xuICAgIGxldCB0b3RhbElMID0gQmlnSW50KDApO1xuXG4gICAgaWYgKHBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGVyaXZlZCA9IGRlcml2ZVBhdGgocm9vdFB1Yiwgcm9vdENDLCBwYXRoKTtcbiAgICAgIHRvdGFsSUwgPSBkZXJpdmVkLnRvdGFsSUw7XG4gICAgICBmaW5hbFB1YktleSA9IGRlcml2ZWQuZmluYWxQdWJLZXk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIExhZ3JhbmdlIGNvZWZmaWNpZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGNvbnN0IGxpID0gY29tcHV0ZUxhZ3JhbmdlQ29lZmYoeExpc3QsIHBhcnR5SWR4LCBzaWduaW5nUGFydHlJbmRpY2VzKTtcblxuICAgIC8vIOKUgOKUgCBCSVAtMzQwIHB1YmxpYyBrZXkgcGFyaXR5IGFkanVzdG1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgLy8gQklQLTM0MCB1c2VzIHRoZSB4LW9ubHkgcHVibGljIGtleTsgdGhlIFwiY2Fub25pY2FsXCIga2V5IGhhcyBldmVuIHkuXG4gICAgLy8gSWYgdGhlIGZpbmFsIGRlcml2ZWQgcHVibGljIGtleSBoYXMgb2RkIHksIG5lZ2F0ZSB0aGUgcHJpdmF0ZSBrZXkuXG4gICAgY29uc3QgcFlJc09kZCA9IGZpbmFsUHViS2V5WzBdID09PSAweDAzO1xuICAgIHRoaXMucHViS2V5WCA9IGZpbmFsUHViS2V5LnNsaWNlKDEpOyAvLyAzMi1ieXRlIHgtb25seVxuXG4gICAgLy8g4pSA4pSAIEVmZmVjdGl2ZSBwcml2YXRlIHNoYXJlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIC8vIEJhc2Ugc2hhcmUgY29udHJpYnV0aW9uOiDOu19pIMK3IHNfaVxuICAgIGxldCBlZmYgPSBzY2FsYXJNb2QobGkgKiBzaSk7XG5cbiAgICAvLyBCSVAtMzIgSUwgYWRqdXN0bWVudDogdGhlIHBhcnR5IHdpdGggdGhlIHNtYWxsZXN0IGluZGV4IGluIHRoZSBzaWduaW5nXG4gICAgLy8gc2V0IGFic29yYnMgdGhlIGVudGlyZSB0b3RhbElMIHNvIHRoYXQgTGFncmFuZ2UgaW50ZXJwb2xhdGlvbiBvdmVyIHRoZVxuICAgIC8vIGFkanVzdGVkIHNoYXJlcyByZWNvbnN0cnVjdHMgdGhlIGNvcnJlY3QgY2hpbGQgcHJpdmF0ZSBrZXkuXG4gICAgLy9cbiAgICAvLyAgIHN1bV97a+KIiFN9IM67X2sgwrcgc19rX2FkaiA9IGRfcm9vdCArIHRvdGFsSUwgICg9IGRfY2hpbGQpXG4gICAgLy9cbiAgICAvLyB3aGVyZSBzX21pbl9hZGogPSBzX21pbiArIHRvdGFsSUwgwrcgzrtfbWluXnstMX0sICBzX2tfYWRqID0gc19rICAoa+KJoG1pbikuXG4gICAgLy9cbiAgICAvLyBGcm9tIHRoaXMgcGFydHkncyBwZXJzcGVjdGl2ZSwgdGhlIGVmZmVjdGl2ZSBjb250cmlidXRpb24gaXM6XG4gICAgLy8gICBpZiB0aGlzIGlzIHRoZSBtaW4gcGFydHk6IM67X21pbiDCtyBzX21pbl9hZGogPSDOu19taW7Ct3NfbWluICsgdG90YWxJTFxuICAgIC8vICAgb3RoZXJ3aXNlOiAgICAgICAgICAgICAgICDOu19rIMK3IHNfayAgICAgICAgICh1bmNoYW5nZWQpXG4gICAgY29uc3QgaXNNaW5QYXJ0eSA9IHBhcnR5SWR4ID09PSBNYXRoLm1pbiguLi5zaWduaW5nUGFydHlJbmRpY2VzKTtcbiAgICBpZiAoaXNNaW5QYXJ0eSAmJiB0b3RhbElMICE9PSBCaWdJbnQoMCkpIHtcbiAgICAgIGVmZiA9IHNjYWxhck1vZChlZmYgKyB0b3RhbElMKTtcbiAgICB9XG5cbiAgICAvLyBJZiBQLnkgaXMgb2RkLCBuZWdhdGUgdGhlIGVmZmVjdGl2ZSBjb250cmlidXRpb24uXG4gICAgaWYgKHBZSXNPZGQpIHtcbiAgICAgIGVmZiA9IHNjYWxhck1vZChOIC0gZWZmKTtcbiAgICB9XG5cbiAgICB0aGlzLmVmZmVjdGl2ZVByaXYgPSBlZmY7XG4gIH1cblxuICAvKiogVGhlIGNvbWJpbmVkIDY0LWJ5dGUgQklQLTM0MCBTY2hub3JyIHNpZ25hdHVyZSBgKFIueF8zMiDigJYgc18zMilgLiBBdmFpbGFibGUgYWZ0ZXIgYENvbXBsZXRlYC4gKi9cbiAgZ2V0IHNpZ25hdHVyZSgpOiBTY2hub3JyRGtsc1NpZ25hdHVyZSB7XG4gICAgaWYgKCF0aGlzLl9zaWduYXR1cmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2lnbmF0dXJlIG5vdCBwcm9kdWNlZCB5ZXQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmU7XG4gIH1cblxuICBnZXQgZHNnU3RhdGUoKTogU2Nobm9yckRzZ1N0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3VuZCAxOiBnZW5lcmF0ZSBhIGZyZXNoIGVwaGVtZXJhbCBub25jZSBhbmQgYnJvYWRjYXN0IHRoZSBub25jZSBwb2ludCBSX2kuXG4gICAqIEByZXR1cm5zIEJyb2FkY2FzdCBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIDMzLWJ5dGUgY29tcHJlc3NlZCBub25jZSBwb2ludC5cbiAgICovXG4gIGFzeW5jIGluaXQoKTogUHJvbWlzZTxEZXNlcmlhbGl6ZWRCcm9hZGNhc3RNZXNzYWdlPiB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IFNjaG5vcnJEc2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NjaG5vcnJEc2cgc2Vzc2lvbiBhbHJlYWR5IGluaXRpYWxpemVkLicpO1xuICAgIH1cblxuICAgIC8vIFNhbXBsZSBhIHJhbmRvbSBub25jZSBzY2FsYXIga19pIGluIFsxLCBOKS5cbiAgICBsZXQga2lCdWY6IEJ1ZmZlcjtcbiAgICBkbyB7XG4gICAgICBraUJ1ZiA9IEJ1ZmZlci5mcm9tKHJhbmRvbUJ5dGVzKDMyKSk7XG4gICAgICB0aGlzLmtpID0gYmlnRnJvbUJ1ZihraUJ1Zik7XG4gICAgfSB3aGlsZSAodGhpcy5raSA9PT0gQmlnSW50KDApIHx8IHRoaXMua2kgPj0gTik7XG5cbiAgICB0aGlzLlJpID0gRy5tdWx0aXBseSh0aGlzLmtpKTtcbiAgICB0aGlzLnN0YXRlID0gU2Nobm9yckRzZ1N0YXRlLlJvdW5kMTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh0aGlzLlJpLnRvUmF3Qnl0ZXModHJ1ZSkpKSwgLy8gMzMgYnl0ZXMgY29tcHJlc3NlZFxuICAgICAgZnJvbTogdGhpcy5wYXJ0eUlkeCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgaW5jb21pbmcgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IHJvdW5kOlxuICAgKlxuICAgKiAtIFJvdW5kIDEg4oaSIHJlY2VpdmVzIG5vbmNlIHBvaW50IGBSX2pgIOKGkiByZXR1cm5zIHBhcnRpYWwgc2NhbGFyIGBzX2lgLlxuICAgKiAtIFJvdW5kIDIg4oaSIHJlY2VpdmVzIHBhcnRpYWwgc2NhbGFyIGBzX2pgIOKGkiBwcm9kdWNlcyBmaW5hbCBzaWduYXR1cmUuXG4gICAqL1xuICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2VzOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyk6IERlc2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gU2Nobm9yckRzZ1N0YXRlLlJvdW5kMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZVJvdW5kMShtZXNzYWdlcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlID09PSBTY2hub3JyRHNnU3RhdGUuUm91bmQyKSB7XG4gICAgICByZXR1cm4gdGhpcy5faGFuZGxlUm91bmQyKG1lc3NhZ2VzKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzIGNhbGxlZCBpbiB1bmV4cGVjdGVkIHN0YXRlOiAke1NjaG5vcnJEc2dTdGF0ZVt0aGlzLnN0YXRlXX1gKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcml2YXRlIHJvdW5kIGhhbmRsZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSb3VuZCAxOiByZWNlaXZlIFJfaiwgY29tcHV0ZSBjb21iaW5lZCBSLCBhcHBseSBCSVAtMzQwIHBhcml0eSwgY29tcHV0ZSBzX2kuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVSb3VuZDEobWVzc2FnZXM6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICAgIGlmIChtZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUm91bmQgMTogZXhwZWN0ZWQgMSBicm9hZGNhc3QgbWVzc2FnZSAoUl9qKSwgZ290ICR7bWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubGVuZ3RofWApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuUmkpIHRocm93IG5ldyBFcnJvcignTm9uY2UgcG9pbnQgbm90IHNldCDigJQgY2FsbCBpbml0KCkgZmlyc3QuJyk7XG5cbiAgICBjb25zdCBSaiA9IG5vYmxlU2VjcC5Qcm9qZWN0aXZlUG9pbnQuZnJvbUhleChCdWZmZXIuZnJvbShtZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlc1swXS5wYXlsb2FkKS50b1N0cmluZygnaGV4JykpO1xuXG4gICAgLy8gQ29tYmluZTogUiA9IFJfaSArIFJfalxuICAgIGNvbnN0IFJfcmF3ID0gdGhpcy5SaS5hZGQoUmopO1xuXG4gICAgLy8gQklQLTM0MDogUi55IG11c3QgYmUgZXZlbi4gSWYgb2RkLCBuZWdhdGUga19pICAoYm90aCBwYXJ0aWVzIHdpbGwgYWdyZWUgb25cbiAgICAvLyB0aGUgc2lnbiBzaW5jZSB0aGV5IGJvdGggc2VlIHRoZSBzYW1lIFIgPSBSX2kgKyBSX2opLlxuICAgIGNvbnN0IFJfeUlzT2RkID0gUl9yYXcueSAlIEJpZ0ludCgyKSA9PT0gQmlnSW50KDEpO1xuICAgIGlmIChSX3lJc09kZCkge1xuICAgICAgdGhpcy5raSA9IHNjYWxhck1vZChOIC0gdGhpcy5raSk7XG4gICAgfVxuICAgIC8vIFN0b3JlIHRoZSBwYXJpdHktbm9ybWFsaXNlZCBSIChldmVuIHkpLlxuICAgIHRoaXMuUl9jb21iaW5lZCA9IFJfeUlzT2RkID8gUl9yYXcubmVnYXRlKCkgOiBSX3JhdztcblxuICAgIC8vIEJJUC0zNDAgY2hhbGxlbmdlOiBlID0gSF90YWcoXCJCSVAwMzQwL2NoYWxsZW5nZVwiLCBSLnhfMzIg4oCWIFAueF8zMiDigJYgbXNnKVxuICAgIGNvbnN0IFJ4ID0gYnVmMzIodGhpcy5SX2NvbWJpbmVkLngpO1xuICAgIGNvbnN0IGUgPSBiaWdGcm9tQnVmKHRhZ2dlZEhhc2goJ0JJUDAzNDAvY2hhbGxlbmdlJywgUngsIHRoaXMucHViS2V5WCwgdGhpcy5tZXNzYWdlSGFzaCkpO1xuXG4gICAgLy8gUGFydGlhbCBzaWduYXR1cmU6IHNfaSA9IGtfaSArIGUgwrcgZWZmZWN0aXZlUHJpdl9pICAobW9kIE4pXG4gICAgdGhpcy5zaSA9IHNjYWxhck1vZCh0aGlzLmtpICsgc2NhbGFyTW9kKGUgKiB0aGlzLmVmZmVjdGl2ZVByaXYpKTtcbiAgICB0aGlzLnN0YXRlID0gU2Nobm9yckRzZ1N0YXRlLlJvdW5kMjtcblxuICAgIHJldHVybiB7XG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW1xuICAgICAgICB7XG4gICAgICAgICAgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkoYnVmMzIodGhpcy5zaSkpLCAvLyAzMiBieXRlc1xuICAgICAgICAgIGZyb206IHRoaXMucGFydHlJZHgsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUm91bmQgMiAoY29tYmluZSk6IHJlY2VpdmUgc19qLCBwcm9kdWNlIHRoZSBmaW5hbCBCSVAtMzQwIFNjaG5vcnIgc2lnbmF0dXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlUm91bmQyKG1lc3NhZ2VzOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyk6IERlc2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgICBpZiAobWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdW5kIDI6IGV4cGVjdGVkIDEgYnJvYWRjYXN0IG1lc3NhZ2UgKHNfaiksIGdvdCAke21lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLlJfY29tYmluZWQpIHRocm93IG5ldyBFcnJvcignUl9jb21iaW5lZCBub3Qgc2V0IOKAlCBoYW5kbGVSb3VuZDEgbXVzdCBydW4gZmlyc3QuJyk7XG5cbiAgICBjb25zdCBzaiA9IGJpZ0Zyb21CdWYoQnVmZmVyLmZyb20obWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZCkpO1xuICAgIGNvbnN0IHMgPSBzY2FsYXJNb2QodGhpcy5zaSArIHNqKTtcblxuICAgIHRoaXMuX3NpZ25hdHVyZSA9IHtcbiAgICAgIFI6IG5ldyBVaW50OEFycmF5KGJ1ZjMyKHRoaXMuUl9jb21iaW5lZC54KSksXG4gICAgICBTOiBuZXcgVWludDhBcnJheShidWYzMihzKSksXG4gICAgfTtcbiAgICB0aGlzLnN0YXRlID0gU2Nobm9yckRzZ1N0YXRlLkNvbXBsZXRlO1xuXG4gICAgcmV0dXJuIHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW10gfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/schnorr-dkls/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AACxC,YAAY,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SchnorrDsgState = exports.SchnorrDsg = void 0;
|
|
37
|
+
exports.SchnorrDsg = __importStar(require("./dsg"));
|
|
38
|
+
var dsg_1 = require("./dsg");
|
|
39
|
+
Object.defineProperty(exports, "SchnorrDsgState", { enumerable: true, get: function () { return dsg_1.SchnorrDsgState; } });
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL3NjaG5vcnItZGtscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBb0M7QUFDcEMsNkJBQXdDO0FBQS9CLHNHQUFBLGVBQWUsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGFzIFNjaG5vcnJEc2cgZnJvbSAnLi9kc2cnO1xuZXhwb3J0IHsgU2Nobm9yckRzZ1N0YXRlIH0gZnJvbSAnLi9kc2cnO1xuZXhwb3J0IHR5cGUgeyBTY2hub3JyRGtsc1NpZ25hdHVyZSB9IGZyb20gJy4vZHNnJztcbiJdfQ==
|