@bitgo-beta/sdk-lib-mpc 8.2.1-alpha.452 → 8.2.1-alpha.453

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.
@@ -0,0 +1,90 @@
1
+ import { DeserializedMessage, DeserializedMessages, DsgState } from './types';
2
+ /**
3
+ * EdDSA Distributed Sign Generation (DSG) implementation using @bitgo/wasm-mps.
4
+ *
5
+ * State is explicit: each WASM round function returns
6
+ * `{ msg, state }` bytes; the state bytes are stored between rounds and passed to the
7
+ * next round function (this is what a server would persist to a database between API
8
+ * rounds).
9
+ *
10
+ * The protocol is hard-coded 2-of-3: each signing party communicates with exactly one
11
+ * counterpart. `handleIncomingMessages` accepts both messages (own + counterpart), and
12
+ * filters own out internally.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const dsg = new DSG(0); // partyIdx 0
17
+ * dsg.initDsg(keyShare, message, 'm', 2); // counterpart is party 2
18
+ * const msg1 = dsg.getFirstMessage();
19
+ * const msg2 = dsg.handleIncomingMessages([msg1, peerMsg1]); // emits SignMsg2
20
+ * const msg3 = dsg.handleIncomingMessages([msg2[0], peerMsg2]); // emits SignMsg3
21
+ * dsg.handleIncomingMessages([msg3[0], peerMsg3]); // completes DSG
22
+ * const signature = dsg.getSignature(); // 64-byte Ed25519 signature
23
+ * ```
24
+ */
25
+ export declare class DSG {
26
+ protected partyIdx: number;
27
+ protected otherPartyIdx: number | null;
28
+ /** Opaque bincode-serialised Keyshare from a prior DKG */
29
+ private keyShare;
30
+ /** Raw message bytes to sign (Ed25519 hashes internally; no prehashing required) */
31
+ private message;
32
+ /** BIP-32-style derivation path, e.g. "m" or "m/0/1". Folded in via Keyshare::derive_with_offset */
33
+ private derivationPath;
34
+ /** Serialised round state bytes returned by the previous round function */
35
+ private dsgStateBytes;
36
+ /** Final 64-byte Ed25519 signature, available after WaitMsg3 -> Complete */
37
+ private signature;
38
+ protected dsgState: DsgState;
39
+ constructor(partyIdx: number);
40
+ getState(): DsgState;
41
+ /**
42
+ * Initialises the DSG session. The keyshare must come from a prior DKG run, and
43
+ * `otherPartyIdx` must be the single counterpart who will co-sign with this party.
44
+ *
45
+ * @param keyShare - Opaque bincode-serialised Keyshare bytes from `DKG.getKeyShare()`.
46
+ * @param message - Raw message bytes to sign (no prehashing).
47
+ * @param derivationPath - BIP-32-style derivation path. Use `"m"` for the root key.
48
+ * @param otherPartyIdx - Party index of the single counterpart in this signing session.
49
+ * Must differ from this party's own `partyIdx` and be in `[0, 2]`.
50
+ */
51
+ initDsg(keyShare: Buffer, message: Buffer, derivationPath: string, otherPartyIdx: number): void;
52
+ /**
53
+ * Runs round 0 of the DSG protocol. Returns this party's broadcast message
54
+ * (a `SignMsg1` containing the commitment to `R_i`). Stores the round state
55
+ * bytes internally for the next round.
56
+ */
57
+ getFirstMessage(): DeserializedMessage;
58
+ /**
59
+ * Handles incoming messages for the current round and advances the protocol.
60
+ *
61
+ * - In `WaitMsg1`: runs round 1, returns this party's `SignMsg2` broadcast.
62
+ * - In `WaitMsg2`: runs round 2 (which internally fuses two Silence Labs transitions),
63
+ * returns this party's `SignMsg3` broadcast (partial signature).
64
+ * - In `WaitMsg3`: runs round 3, completes DSG, returns `[]`.
65
+ *
66
+ * The caller passes both messages (own + counterpart) for symmetry with
67
+ * `DKG.handleIncomingMessages`. Own message is filtered out internally; only the
68
+ * counterpart's payload is forwarded to the WASM round function.
69
+ *
70
+ * @param messagesForIthRound - Both messages for this round (own + counterpart).
71
+ */
72
+ handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
73
+ /**
74
+ * Returns the final 64-byte Ed25519 signature produced by round 3.
75
+ * Only available once the protocol reaches `Complete`.
76
+ */
77
+ getSignature(): Buffer;
78
+ /**
79
+ * Exports the current session state as a JSON string for persistence.
80
+ * Includes the opaque round state bytes plus everything needed to re-enter the
81
+ * protocol after a restart (keyshare, message, derivation path, counterpart).
82
+ */
83
+ getSession(): string;
84
+ /**
85
+ * Restores a previously exported session. Allows the protocol to continue from
86
+ * where it left off, as if the round state was loaded from a database.
87
+ */
88
+ restoreSession(session: string): void;
89
+ }
90
+ //# sourceMappingURL=dsg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsg.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/dsg.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,GAAG;IACd,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9C,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAuB;IACvC,oFAAoF;IACpF,OAAO,CAAC,OAAO,CAAuB;IACtC,oGAAoG;IACpG,OAAO,CAAC,cAAc,CAAuB;IAE7C,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAuB;IAC5C,4EAA4E;IAC5E,OAAO,CAAC,SAAS,CAAuB;IAExC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAA0B;gBAE1C,QAAQ,EAAE,MAAM;IAI5B,QAAQ,IAAI,QAAQ;IAIpB;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAqB/F;;;;OAIG;IACH,eAAe,IAAI,mBAAmB;IAoBtC;;;;;;;;;;;;;OAaG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,oBAAoB,GAAG,oBAAoB;IAqEvF;;;OAGG;IACH,YAAY,IAAI,MAAM;IAOtB;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAqBpB;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CA2DtC"}
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DSG = void 0;
7
+ const assert_1 = __importDefault(require("assert"));
8
+ const wasm_mps_1 = require("@bitgo/wasm-mps");
9
+ const types_1 = require("./types");
10
+ /**
11
+ * EdDSA Distributed Sign Generation (DSG) implementation using @bitgo/wasm-mps.
12
+ *
13
+ * State is explicit: each WASM round function returns
14
+ * `{ msg, state }` bytes; the state bytes are stored between rounds and passed to the
15
+ * next round function (this is what a server would persist to a database between API
16
+ * rounds).
17
+ *
18
+ * The protocol is hard-coded 2-of-3: each signing party communicates with exactly one
19
+ * counterpart. `handleIncomingMessages` accepts both messages (own + counterpart), and
20
+ * filters own out internally.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const dsg = new DSG(0); // partyIdx 0
25
+ * dsg.initDsg(keyShare, message, 'm', 2); // counterpart is party 2
26
+ * const msg1 = dsg.getFirstMessage();
27
+ * const msg2 = dsg.handleIncomingMessages([msg1, peerMsg1]); // emits SignMsg2
28
+ * const msg3 = dsg.handleIncomingMessages([msg2[0], peerMsg2]); // emits SignMsg3
29
+ * dsg.handleIncomingMessages([msg3[0], peerMsg3]); // completes DSG
30
+ * const signature = dsg.getSignature(); // 64-byte Ed25519 signature
31
+ * ```
32
+ */
33
+ class DSG {
34
+ constructor(partyIdx) {
35
+ this.otherPartyIdx = null;
36
+ /** Opaque bincode-serialised Keyshare from a prior DKG */
37
+ this.keyShare = null;
38
+ /** Raw message bytes to sign (Ed25519 hashes internally; no prehashing required) */
39
+ this.message = null;
40
+ /** BIP-32-style derivation path, e.g. "m" or "m/0/1". Folded in via Keyshare::derive_with_offset */
41
+ this.derivationPath = null;
42
+ /** Serialised round state bytes returned by the previous round function */
43
+ this.dsgStateBytes = null;
44
+ /** Final 64-byte Ed25519 signature, available after WaitMsg3 -> Complete */
45
+ this.signature = null;
46
+ this.dsgState = types_1.DsgState.Uninitialized;
47
+ this.partyIdx = partyIdx;
48
+ }
49
+ getState() {
50
+ return this.dsgState;
51
+ }
52
+ /**
53
+ * Initialises the DSG session. The keyshare must come from a prior DKG run, and
54
+ * `otherPartyIdx` must be the single counterpart who will co-sign with this party.
55
+ *
56
+ * @param keyShare - Opaque bincode-serialised Keyshare bytes from `DKG.getKeyShare()`.
57
+ * @param message - Raw message bytes to sign (no prehashing).
58
+ * @param derivationPath - BIP-32-style derivation path. Use `"m"` for the root key.
59
+ * @param otherPartyIdx - Party index of the single counterpart in this signing session.
60
+ * Must differ from this party's own `partyIdx` and be in `[0, 2]`.
61
+ */
62
+ initDsg(keyShare, message, derivationPath, otherPartyIdx) {
63
+ if (!keyShare || keyShare.length === 0) {
64
+ throw Error('Missing or invalid keyShare');
65
+ }
66
+ if (!message || message.length === 0) {
67
+ throw Error('Missing or invalid message');
68
+ }
69
+ if (this.partyIdx < 0 || this.partyIdx > 2) {
70
+ throw Error(`Invalid partyIdx ${this.partyIdx}: must be in [0, 2]`);
71
+ }
72
+ if (otherPartyIdx < 0 || otherPartyIdx > 2 || otherPartyIdx === this.partyIdx) {
73
+ throw Error(`Invalid otherPartyIdx ${otherPartyIdx}: must be in [0, 2] and != partyIdx`);
74
+ }
75
+ this.keyShare = keyShare;
76
+ this.message = message;
77
+ this.derivationPath = derivationPath;
78
+ this.otherPartyIdx = otherPartyIdx;
79
+ this.dsgState = types_1.DsgState.Init;
80
+ }
81
+ /**
82
+ * Runs round 0 of the DSG protocol. Returns this party's broadcast message
83
+ * (a `SignMsg1` containing the commitment to `R_i`). Stores the round state
84
+ * bytes internally for the next round.
85
+ */
86
+ getFirstMessage() {
87
+ if (this.dsgState !== types_1.DsgState.Init) {
88
+ throw Error('DSG session not initialized');
89
+ }
90
+ (0, assert_1.default)(this.keyShare, 'keyShare must be set after initDsg');
91
+ (0, assert_1.default)(this.derivationPath !== null, 'derivationPath must be set after initDsg');
92
+ (0, assert_1.default)(this.message, 'message must be set after initDsg');
93
+ let result;
94
+ try {
95
+ result = (0, wasm_mps_1.ed25519_dsg_round0_process)(this.keyShare, this.derivationPath, this.message);
96
+ }
97
+ catch (err) {
98
+ throw new Error(`Error while creating the first message from party ${this.partyIdx}: ${err}`);
99
+ }
100
+ this.dsgStateBytes = Buffer.from(result.state);
101
+ this.dsgState = types_1.DsgState.WaitMsg1;
102
+ return { payload: new Uint8Array(result.msg), from: this.partyIdx };
103
+ }
104
+ /**
105
+ * Handles incoming messages for the current round and advances the protocol.
106
+ *
107
+ * - In `WaitMsg1`: runs round 1, returns this party's `SignMsg2` broadcast.
108
+ * - In `WaitMsg2`: runs round 2 (which internally fuses two Silence Labs transitions),
109
+ * returns this party's `SignMsg3` broadcast (partial signature).
110
+ * - In `WaitMsg3`: runs round 3, completes DSG, returns `[]`.
111
+ *
112
+ * The caller passes both messages (own + counterpart) for symmetry with
113
+ * `DKG.handleIncomingMessages`. Own message is filtered out internally; only the
114
+ * counterpart's payload is forwarded to the WASM round function.
115
+ *
116
+ * @param messagesForIthRound - Both messages for this round (own + counterpart).
117
+ */
118
+ handleIncomingMessages(messagesForIthRound) {
119
+ if (this.dsgState === types_1.DsgState.Complete) {
120
+ throw Error('DSG session already completed');
121
+ }
122
+ if (this.dsgState === types_1.DsgState.Uninitialized) {
123
+ throw Error('DSG session not initialized');
124
+ }
125
+ if (this.dsgState === types_1.DsgState.Init) {
126
+ throw Error('DSG session must call getFirstMessage() before handling incoming messages. Call getFirstMessage() first.');
127
+ }
128
+ if (messagesForIthRound.length !== 2) {
129
+ throw Error('Invalid number of messages for the round. Expected 2 messages (own + counterpart) for 2-of-3 DSG');
130
+ }
131
+ const peerMessages = messagesForIthRound.filter((m) => m.from !== this.partyIdx);
132
+ if (peerMessages.length !== 1) {
133
+ throw Error(`Expected exactly 1 counterpart message; got ${peerMessages.length}`);
134
+ }
135
+ const peerMsg = peerMessages[0];
136
+ if (peerMsg.from !== this.otherPartyIdx) {
137
+ throw Error(`Unexpected counterpart party index: got ${peerMsg.from}, expected ${this.otherPartyIdx}`);
138
+ }
139
+ const peerPayload = Buffer.from(peerMsg.payload);
140
+ if (this.dsgState === types_1.DsgState.WaitMsg1) {
141
+ (0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg1');
142
+ let result;
143
+ try {
144
+ result = (0, wasm_mps_1.ed25519_dsg_round1_process)(peerPayload, this.dsgStateBytes);
145
+ }
146
+ catch (err) {
147
+ throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
148
+ }
149
+ this.dsgStateBytes = Buffer.from(result.state);
150
+ this.dsgState = types_1.DsgState.WaitMsg2;
151
+ return [{ payload: new Uint8Array(result.msg), from: this.partyIdx }];
152
+ }
153
+ if (this.dsgState === types_1.DsgState.WaitMsg2) {
154
+ (0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg2');
155
+ let result;
156
+ try {
157
+ result = (0, wasm_mps_1.ed25519_dsg_round2_process)(peerPayload, this.dsgStateBytes);
158
+ }
159
+ catch (err) {
160
+ throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
161
+ }
162
+ this.dsgStateBytes = Buffer.from(result.state);
163
+ this.dsgState = types_1.DsgState.WaitMsg3;
164
+ return [{ payload: new Uint8Array(result.msg), from: this.partyIdx }];
165
+ }
166
+ if (this.dsgState === types_1.DsgState.WaitMsg3) {
167
+ (0, assert_1.default)(this.dsgStateBytes, 'dsgStateBytes must be set in WaitMsg3');
168
+ let sigBytes;
169
+ try {
170
+ sigBytes = (0, wasm_mps_1.ed25519_dsg_round3_process)(peerPayload, this.dsgStateBytes);
171
+ }
172
+ catch (err) {
173
+ throw new Error(`Error while creating messages from party ${this.partyIdx}, round ${this.dsgState}: ${err}`);
174
+ }
175
+ this.signature = Buffer.from(sigBytes);
176
+ this.dsgStateBytes = null;
177
+ this.dsgState = types_1.DsgState.Complete;
178
+ return [];
179
+ }
180
+ throw Error('Unexpected DSG state');
181
+ }
182
+ /**
183
+ * Returns the final 64-byte Ed25519 signature produced by round 3.
184
+ * Only available once the protocol reaches `Complete`.
185
+ */
186
+ getSignature() {
187
+ if (!this.signature) {
188
+ throw Error('DSG session has not produced a signature yet');
189
+ }
190
+ return this.signature;
191
+ }
192
+ /**
193
+ * Exports the current session state as a JSON string for persistence.
194
+ * Includes the opaque round state bytes plus everything needed to re-enter the
195
+ * protocol after a restart (keyshare, message, derivation path, counterpart).
196
+ */
197
+ getSession() {
198
+ if (this.dsgState === types_1.DsgState.Complete) {
199
+ throw Error('DSG session is complete. Exporting the session is not allowed.');
200
+ }
201
+ if (this.dsgState === types_1.DsgState.Uninitialized) {
202
+ throw Error('DSG session not initialized');
203
+ }
204
+ if (this.dsgState === types_1.DsgState.Init) {
205
+ throw Error('DSG session must produce its first message before exporting.');
206
+ }
207
+ return JSON.stringify({
208
+ dsgStateBytes: this.dsgStateBytes?.toString('base64') ?? null,
209
+ dsgRound: this.dsgState,
210
+ keyShare: this.keyShare?.toString('base64') ?? null,
211
+ message: this.message?.toString('base64') ?? null,
212
+ derivationPath: this.derivationPath,
213
+ partyIdx: this.partyIdx,
214
+ otherPartyIdx: this.otherPartyIdx,
215
+ });
216
+ }
217
+ /**
218
+ * Restores a previously exported session. Allows the protocol to continue from
219
+ * where it left off, as if the round state was loaded from a database.
220
+ */
221
+ restoreSession(session) {
222
+ const data = JSON.parse(session);
223
+ if (!Object.values(types_1.DsgState).includes(data.dsgRound)) {
224
+ throw Error(`Invalid dsgRound in session: ${data.dsgRound}`);
225
+ }
226
+ if (data.dsgRound === types_1.DsgState.Uninitialized || data.dsgRound === types_1.DsgState.Init) {
227
+ throw Error(`Cannot restore DSG session in state ${data.dsgRound}`);
228
+ }
229
+ if (data.dsgRound === types_1.DsgState.Complete) {
230
+ throw Error('DSG session is complete. Restoring the session is not allowed.');
231
+ }
232
+ if (typeof data.partyIdx !== 'number' || data.partyIdx < 0 || data.partyIdx > 2) {
233
+ throw Error(`Invalid partyIdx in session: ${data.partyIdx}`);
234
+ }
235
+ if (typeof data.otherPartyIdx !== 'number' ||
236
+ data.otherPartyIdx < 0 ||
237
+ data.otherPartyIdx > 2 ||
238
+ data.otherPartyIdx === data.partyIdx) {
239
+ throw Error(`Invalid otherPartyIdx in session: ${data.otherPartyIdx}`);
240
+ }
241
+ if (this.partyIdx !== data.partyIdx) {
242
+ throw Error(`Session partyIdx ${data.partyIdx} does not match instance ${this.partyIdx}`);
243
+ }
244
+ if (typeof data.dsgStateBytes !== 'string' || data.dsgStateBytes.length === 0) {
245
+ throw Error(`Round ${data.dsgRound} requires dsgStateBytes`);
246
+ }
247
+ if (typeof data.keyShare !== 'string' || data.keyShare.length === 0) {
248
+ throw Error('Restored session missing keyShare');
249
+ }
250
+ if (typeof data.message !== 'string' || data.message.length === 0) {
251
+ throw Error('Restored session missing message');
252
+ }
253
+ if (typeof data.derivationPath !== 'string') {
254
+ throw Error('Restored session missing derivationPath');
255
+ }
256
+ const dsgStateBytes = Buffer.from(data.dsgStateBytes, 'base64');
257
+ const keyShare = Buffer.from(data.keyShare, 'base64');
258
+ const message = Buffer.from(data.message, 'base64');
259
+ if (dsgStateBytes.length === 0) {
260
+ throw Error(`Round ${data.dsgRound} requires dsgStateBytes`);
261
+ }
262
+ if (keyShare.length === 0) {
263
+ throw Error('Restored session missing keyShare');
264
+ }
265
+ if (message.length === 0) {
266
+ throw Error('Restored session missing message');
267
+ }
268
+ this.dsgStateBytes = dsgStateBytes;
269
+ this.dsgState = data.dsgRound;
270
+ this.keyShare = keyShare;
271
+ this.message = message;
272
+ this.derivationPath = data.derivationPath;
273
+ this.partyIdx = data.partyIdx;
274
+ this.otherPartyIdx = data.otherPartyIdx;
275
+ }
276
+ }
277
+ exports.DSG = DSG;
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHNnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9lZGRzYS1tcHMvZHNnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qiw4Q0FLeUI7QUFDekIsbUNBQThFO0FBRTlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBYSxHQUFHO0lBa0JkLFlBQVksUUFBZ0I7UUFoQmxCLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUU5QywwREFBMEQ7UUFDbEQsYUFBUSxHQUFrQixJQUFJLENBQUM7UUFDdkMsb0ZBQW9GO1FBQzVFLFlBQU8sR0FBa0IsSUFBSSxDQUFDO1FBQ3RDLG9HQUFvRztRQUM1RixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFFN0MsMkVBQTJFO1FBQ25FLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUM1Qyw0RUFBNEU7UUFDcEUsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFFOUIsYUFBUSxHQUFhLGdCQUFRLENBQUMsYUFBYSxDQUFDO1FBR3BELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxPQUFPLENBQUMsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsY0FBc0IsRUFBRSxhQUFxQjtRQUN0RixJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxNQUFNLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFFBQVEscUJBQXFCLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsSUFBSSxhQUFhLEdBQUcsQ0FBQyxJQUFJLGFBQWEsR0FBRyxDQUFDLElBQUksYUFBYSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5RSxNQUFNLEtBQUssQ0FBQyx5QkFBeUIsYUFBYSxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzNGLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLGdCQUFRLENBQUMsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BDLE1BQU0sS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUEsZ0JBQU0sRUFBQyxJQUFJLENBQUMsUUFBUSxFQUFFLG9DQUFvQyxDQUFDLENBQUM7UUFDNUQsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxFQUFFLDBDQUEwQyxDQUFDLENBQUM7UUFDakYsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUUxRCxJQUFJLE1BQU0sQ0FBQztRQUNYLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxJQUFBLHFDQUEwQixFQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxJQUFJLENBQUMsUUFBUSxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBUSxDQUFDLFFBQVEsQ0FBQztRQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsc0JBQXNCLENBQUMsbUJBQXlDO1FBQzlELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdDLE1BQU0sS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BDLE1BQU0sS0FBSyxDQUNULDBHQUEwRyxDQUMzRyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksbUJBQW1CLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxDQUFDLGtHQUFrRyxDQUFDLENBQUM7UUFDbEgsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakYsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sS0FBSyxDQUFDLCtDQUErQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEMsTUFBTSxLQUFLLENBQUMsMkNBQTJDLE9BQU8sQ0FBQyxJQUFJLGNBQWMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWpELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLElBQUEsZ0JBQU0sRUFBQyxJQUFJLENBQUMsYUFBYSxFQUFFLHVDQUF1QyxDQUFDLENBQUM7WUFDcEUsSUFBSSxNQUFNLENBQUM7WUFDWCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxHQUFHLElBQUEscUNBQTBCLEVBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2RSxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxJQUFJLENBQUMsUUFBUSxXQUFXLElBQUksQ0FBQyxRQUFRLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMvRyxDQUFDO1lBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLGdCQUFRLENBQUMsUUFBUSxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxJQUFBLGdCQUFNLEVBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSx1Q0FBdUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksTUFBTSxDQUFDO1lBQ1gsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxJQUFBLHFDQUEwQixFQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdkUsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsSUFBSSxDQUFDLFFBQVEsV0FBVyxJQUFJLENBQUMsUUFBUSxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDL0csQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBUSxDQUFDLFFBQVEsQ0FBQztZQUNsQyxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEMsSUFBQSxnQkFBTSxFQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsdUNBQXVDLENBQUMsQ0FBQztZQUNwRSxJQUFJLFFBQVEsQ0FBQztZQUNiLElBQUksQ0FBQztnQkFDSCxRQUFRLEdBQUcsSUFBQSxxQ0FBMEIsRUFBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3pFLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLElBQUksQ0FBQyxRQUFRLFdBQVcsSUFBSSxDQUFDLFFBQVEsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQy9HLENBQUM7WUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBUSxDQUFDLFFBQVEsQ0FBQztZQUNsQyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxNQUFNLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZO1FBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixNQUFNLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEMsTUFBTSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztRQUNoRixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0MsTUFBTSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEMsTUFBTSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3BCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJO1lBQzdELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSTtZQUNuRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSTtZQUNqRCxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtTQUNsQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLE9BQWU7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3JELE1BQU0sS0FBSyxDQUFDLGdDQUFnQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGdCQUFRLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNoRixNQUFNLEtBQUssQ0FBQyx1Q0FBdUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxnQkFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hGLE1BQU0sS0FBSyxDQUFDLGdDQUFnQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFDRSxPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssUUFBUTtZQUN0QyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUM7WUFDdEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFDcEMsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDLHFDQUFxQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxNQUFNLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFFBQVEsNEJBQTRCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFDRCxJQUFJLE9BQU8sSUFBSSxDQUFDLGFBQWEsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUUsTUFBTSxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsUUFBUSx5QkFBeUIsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEUsTUFBTSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVDLE1BQU0sS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxRQUFRLHlCQUF5QixDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQixNQUFNLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzFDLENBQUM7Q0FDRjtBQXpRRCxrQkF5UUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge1xuICBlZDI1NTE5X2RzZ19yb3VuZDBfcHJvY2VzcyxcbiAgZWQyNTUxOV9kc2dfcm91bmQxX3Byb2Nlc3MsXG4gIGVkMjU1MTlfZHNnX3JvdW5kMl9wcm9jZXNzLFxuICBlZDI1NTE5X2RzZ19yb3VuZDNfcHJvY2Vzcyxcbn0gZnJvbSAnQGJpdGdvL3dhc20tbXBzJztcbmltcG9ydCB7IERlc2VyaWFsaXplZE1lc3NhZ2UsIERlc2VyaWFsaXplZE1lc3NhZ2VzLCBEc2dTdGF0ZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEVkRFNBIERpc3RyaWJ1dGVkIFNpZ24gR2VuZXJhdGlvbiAoRFNHKSBpbXBsZW1lbnRhdGlvbiB1c2luZyBAYml0Z28vd2FzbS1tcHMuXG4gKlxuICogU3RhdGUgaXMgZXhwbGljaXQ6IGVhY2ggV0FTTSByb3VuZCBmdW5jdGlvbiByZXR1cm5zXG4gKiBgeyBtc2csIHN0YXRlIH1gIGJ5dGVzOyB0aGUgc3RhdGUgYnl0ZXMgYXJlIHN0b3JlZCBiZXR3ZWVuIHJvdW5kcyBhbmQgcGFzc2VkIHRvIHRoZVxuICogbmV4dCByb3VuZCBmdW5jdGlvbiAodGhpcyBpcyB3aGF0IGEgc2VydmVyIHdvdWxkIHBlcnNpc3QgdG8gYSBkYXRhYmFzZSBiZXR3ZWVuIEFQSVxuICogcm91bmRzKS5cbiAqXG4gKiBUaGUgcHJvdG9jb2wgaXMgaGFyZC1jb2RlZCAyLW9mLTM6IGVhY2ggc2lnbmluZyBwYXJ0eSBjb21tdW5pY2F0ZXMgd2l0aCBleGFjdGx5IG9uZVxuICogY291bnRlcnBhcnQuIGBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzYCBhY2NlcHRzIGJvdGggbWVzc2FnZXMgKG93biArIGNvdW50ZXJwYXJ0KSwgYW5kXG4gKiBmaWx0ZXJzIG93biBvdXQgaW50ZXJuYWxseS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZHNnID0gbmV3IERTRygwKTsgIC8vIHBhcnR5SWR4IDBcbiAqIGRzZy5pbml0RHNnKGtleVNoYXJlLCBtZXNzYWdlLCAnbScsIDIpOyAgLy8gY291bnRlcnBhcnQgaXMgcGFydHkgMlxuICogY29uc3QgbXNnMSA9IGRzZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAqIGNvbnN0IG1zZzIgPSBkc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbbXNnMSwgcGVlck1zZzFdKTsgIC8vIGVtaXRzIFNpZ25Nc2cyXG4gKiBjb25zdCBtc2czID0gZHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW21zZzJbMF0sIHBlZXJNc2cyXSk7ICAvLyBlbWl0cyBTaWduTXNnM1xuICogZHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW21zZzNbMF0sIHBlZXJNc2czXSk7ICAvLyBjb21wbGV0ZXMgRFNHXG4gKiBjb25zdCBzaWduYXR1cmUgPSBkc2cuZ2V0U2lnbmF0dXJlKCk7ICAvLyA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIERTRyB7XG4gIHByb3RlY3RlZCBwYXJ0eUlkeDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgb3RoZXJQYXJ0eUlkeDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQgS2V5c2hhcmUgZnJvbSBhIHByaW9yIERLRyAqL1xuICBwcml2YXRlIGtleVNoYXJlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFJhdyBtZXNzYWdlIGJ5dGVzIHRvIHNpZ24gKEVkMjU1MTkgaGFzaGVzIGludGVybmFsbHk7IG5vIHByZWhhc2hpbmcgcmVxdWlyZWQpICovXG4gIHByaXZhdGUgbWVzc2FnZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCSVAtMzItc3R5bGUgZGVyaXZhdGlvbiBwYXRoLCBlLmcuIFwibVwiIG9yIFwibS8wLzFcIi4gRm9sZGVkIGluIHZpYSBLZXlzaGFyZTo6ZGVyaXZlX3dpdGhfb2Zmc2V0ICovXG4gIHByaXZhdGUgZGVyaXZhdGlvblBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBTZXJpYWxpc2VkIHJvdW5kIHN0YXRlIGJ5dGVzIHJldHVybmVkIGJ5IHRoZSBwcmV2aW91cyByb3VuZCBmdW5jdGlvbiAqL1xuICBwcml2YXRlIGRzZ1N0YXRlQnl0ZXM6IEJ1ZmZlciB8IG51bGwgPSBudWxsO1xuICAvKiogRmluYWwgNjQtYnl0ZSBFZDI1NTE5IHNpZ25hdHVyZSwgYXZhaWxhYmxlIGFmdGVyIFdhaXRNc2czIC0+IENvbXBsZXRlICovXG4gIHByaXZhdGUgc2lnbmF0dXJlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgZHNnU3RhdGU6IERzZ1N0YXRlID0gRHNnU3RhdGUuVW5pbml0aWFsaXplZDtcblxuICBjb25zdHJ1Y3RvcihwYXJ0eUlkeDogbnVtYmVyKSB7XG4gICAgdGhpcy5wYXJ0eUlkeCA9IHBhcnR5SWR4O1xuICB9XG5cbiAgZ2V0U3RhdGUoKTogRHNnU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmRzZ1N0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpc2VzIHRoZSBEU0cgc2Vzc2lvbi4gVGhlIGtleXNoYXJlIG11c3QgY29tZSBmcm9tIGEgcHJpb3IgREtHIHJ1biwgYW5kXG4gICAqIGBvdGhlclBhcnR5SWR4YCBtdXN0IGJlIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgd2hvIHdpbGwgY28tc2lnbiB3aXRoIHRoaXMgcGFydHkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXlTaGFyZSAtIE9wYXF1ZSBiaW5jb2RlLXNlcmlhbGlzZWQgS2V5c2hhcmUgYnl0ZXMgZnJvbSBgREtHLmdldEtleVNoYXJlKClgLlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFJhdyBtZXNzYWdlIGJ5dGVzIHRvIHNpZ24gKG5vIHByZWhhc2hpbmcpLlxuICAgKiBAcGFyYW0gZGVyaXZhdGlvblBhdGggLSBCSVAtMzItc3R5bGUgZGVyaXZhdGlvbiBwYXRoLiBVc2UgYFwibVwiYCBmb3IgdGhlIHJvb3Qga2V5LlxuICAgKiBAcGFyYW0gb3RoZXJQYXJ0eUlkeCAtIFBhcnR5IGluZGV4IG9mIHRoZSBzaW5nbGUgY291bnRlcnBhcnQgaW4gdGhpcyBzaWduaW5nIHNlc3Npb24uXG4gICAqICAgTXVzdCBkaWZmZXIgZnJvbSB0aGlzIHBhcnR5J3Mgb3duIGBwYXJ0eUlkeGAgYW5kIGJlIGluIGBbMCwgMl1gLlxuICAgKi9cbiAgaW5pdERzZyhrZXlTaGFyZTogQnVmZmVyLCBtZXNzYWdlOiBCdWZmZXIsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsIG90aGVyUGFydHlJZHg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICgha2V5U2hhcmUgfHwga2V5U2hhcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBvciBpbnZhbGlkIGtleVNoYXJlJyk7XG4gICAgfVxuICAgIGlmICghbWVzc2FnZSB8fCBtZXNzYWdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBtZXNzYWdlJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcnR5SWR4IDwgMCB8fCB0aGlzLnBhcnR5SWR4ID4gMikge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgcGFydHlJZHggJHt0aGlzLnBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl1gKTtcbiAgICB9XG4gICAgaWYgKG90aGVyUGFydHlJZHggPCAwIHx8IG90aGVyUGFydHlJZHggPiAyIHx8IG90aGVyUGFydHlJZHggPT09IHRoaXMucGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIG90aGVyUGFydHlJZHggJHtvdGhlclBhcnR5SWR4fTogbXVzdCBiZSBpbiBbMCwgMl0gYW5kICE9IHBhcnR5SWR4YCk7XG4gICAgfVxuXG4gICAgdGhpcy5rZXlTaGFyZSA9IGtleVNoYXJlO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5kZXJpdmF0aW9uUGF0aCA9IGRlcml2YXRpb25QYXRoO1xuICAgIHRoaXMub3RoZXJQYXJ0eUlkeCA9IG90aGVyUGFydHlJZHg7XG4gICAgdGhpcy5kc2dTdGF0ZSA9IERzZ1N0YXRlLkluaXQ7XG4gIH1cblxuICAvKipcbiAgICogUnVucyByb3VuZCAwIG9mIHRoZSBEU0cgcHJvdG9jb2wuIFJldHVybnMgdGhpcyBwYXJ0eSdzIGJyb2FkY2FzdCBtZXNzYWdlXG4gICAqIChhIGBTaWduTXNnMWAgY29udGFpbmluZyB0aGUgY29tbWl0bWVudCB0byBgUl9pYCkuIFN0b3JlcyB0aGUgcm91bmQgc3RhdGVcbiAgICogYnl0ZXMgaW50ZXJuYWxseSBmb3IgdGhlIG5leHQgcm91bmQuXG4gICAqL1xuICBnZXRGaXJzdE1lc3NhZ2UoKTogRGVzZXJpYWxpemVkTWVzc2FnZSB7XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgIT09IERzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgYXNzZXJ0KHRoaXMua2V5U2hhcmUsICdrZXlTaGFyZSBtdXN0IGJlIHNldCBhZnRlciBpbml0RHNnJyk7XG4gICAgYXNzZXJ0KHRoaXMuZGVyaXZhdGlvblBhdGggIT09IG51bGwsICdkZXJpdmF0aW9uUGF0aCBtdXN0IGJlIHNldCBhZnRlciBpbml0RHNnJyk7XG4gICAgYXNzZXJ0KHRoaXMubWVzc2FnZSwgJ21lc3NhZ2UgbXVzdCBiZSBzZXQgYWZ0ZXIgaW5pdERzZycpO1xuXG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZWQyNTUxOV9kc2dfcm91bmQwX3Byb2Nlc3ModGhpcy5rZXlTaGFyZSwgdGhpcy5kZXJpdmF0aW9uUGF0aCwgdGhpcy5tZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGZpcnN0IG1lc3NhZ2UgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9OiAke2Vycn1gKTtcbiAgICB9XG5cbiAgICB0aGlzLmRzZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RhdGUpO1xuICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5XYWl0TXNnMTtcbiAgICByZXR1cm4geyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW5jb21pbmcgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IHJvdW5kIGFuZCBhZHZhbmNlcyB0aGUgcHJvdG9jb2wuXG4gICAqXG4gICAqIC0gSW4gYFdhaXRNc2cxYDogcnVucyByb3VuZCAxLCByZXR1cm5zIHRoaXMgcGFydHkncyBgU2lnbk1zZzJgIGJyb2FkY2FzdC5cbiAgICogLSBJbiBgV2FpdE1zZzJgOiBydW5zIHJvdW5kIDIgKHdoaWNoIGludGVybmFsbHkgZnVzZXMgdHdvIFNpbGVuY2UgTGFicyB0cmFuc2l0aW9ucyksXG4gICAqICAgcmV0dXJucyB0aGlzIHBhcnR5J3MgYFNpZ25Nc2czYCBicm9hZGNhc3QgKHBhcnRpYWwgc2lnbmF0dXJlKS5cbiAgICogLSBJbiBgV2FpdE1zZzNgOiBydW5zIHJvdW5kIDMsIGNvbXBsZXRlcyBEU0csIHJldHVybnMgYFtdYC5cbiAgICpcbiAgICogVGhlIGNhbGxlciBwYXNzZXMgYm90aCBtZXNzYWdlcyAob3duICsgY291bnRlcnBhcnQpIGZvciBzeW1tZXRyeSB3aXRoXG4gICAqIGBES0cuaGFuZGxlSW5jb21pbmdNZXNzYWdlc2AuIE93biBtZXNzYWdlIGlzIGZpbHRlcmVkIG91dCBpbnRlcm5hbGx5OyBvbmx5IHRoZVxuICAgKiBjb3VudGVycGFydCdzIHBheWxvYWQgaXMgZm9yd2FyZGVkIHRvIHRoZSBXQVNNIHJvdW5kIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZXNGb3JJdGhSb3VuZCAtIEJvdGggbWVzc2FnZXMgZm9yIHRoaXMgcm91bmQgKG93biArIGNvdW50ZXJwYXJ0KS5cbiAgICovXG4gIGhhbmRsZUluY29taW5nTWVzc2FnZXMobWVzc2FnZXNGb3JJdGhSb3VuZDogRGVzZXJpYWxpemVkTWVzc2FnZXMpOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyB7XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IERzZ1N0YXRlLkNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gYWxyZWFkeSBjb21wbGV0ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IERzZ1N0YXRlLlVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHNnU3RhdGUgPT09IERzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAnRFNHIHNlc3Npb24gbXVzdCBjYWxsIGdldEZpcnN0TWVzc2FnZSgpIGJlZm9yZSBoYW5kbGluZyBpbmNvbWluZyBtZXNzYWdlcy4gQ2FsbCBnZXRGaXJzdE1lc3NhZ2UoKSBmaXJzdC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZXNGb3JJdGhSb3VuZC5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIG51bWJlciBvZiBtZXNzYWdlcyBmb3IgdGhlIHJvdW5kLiBFeHBlY3RlZCAyIG1lc3NhZ2VzIChvd24gKyBjb3VudGVycGFydCkgZm9yIDItb2YtMyBEU0cnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwZWVyTWVzc2FnZXMgPSBtZXNzYWdlc0Zvckl0aFJvdW5kLmZpbHRlcigobSkgPT4gbS5mcm9tICE9PSB0aGlzLnBhcnR5SWR4KTtcbiAgICBpZiAocGVlck1lc3NhZ2VzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgMSBjb3VudGVycGFydCBtZXNzYWdlOyBnb3QgJHtwZWVyTWVzc2FnZXMubGVuZ3RofWApO1xuICAgIH1cbiAgICBjb25zdCBwZWVyTXNnID0gcGVlck1lc3NhZ2VzWzBdO1xuICAgIGlmIChwZWVyTXNnLmZyb20gIT09IHRoaXMub3RoZXJQYXJ0eUlkeCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFVuZXhwZWN0ZWQgY291bnRlcnBhcnQgcGFydHkgaW5kZXg6IGdvdCAke3BlZXJNc2cuZnJvbX0sIGV4cGVjdGVkICR7dGhpcy5vdGhlclBhcnR5SWR4fWApO1xuICAgIH1cbiAgICBjb25zdCBwZWVyUGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHBlZXJNc2cucGF5bG9hZCk7XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuV2FpdE1zZzEpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2cxJyk7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZWQyNTUxOV9kc2dfcm91bmQxX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMuZHNnU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5kc2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5XYWl0TXNnMjtcbiAgICAgIHJldHVybiBbeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuV2FpdE1zZzIpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2cyJyk7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZWQyNTUxOV9kc2dfcm91bmQyX3Byb2Nlc3MocGVlclBheWxvYWQsIHRoaXMuZHNnU3RhdGVCeXRlcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBjcmVhdGluZyBtZXNzYWdlcyBmcm9tIHBhcnR5ICR7dGhpcy5wYXJ0eUlkeH0sIHJvdW5kICR7dGhpcy5kc2dTdGF0ZX06ICR7ZXJyfWApO1xuICAgICAgfVxuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gQnVmZmVyLmZyb20ocmVzdWx0LnN0YXRlKTtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5XYWl0TXNnMztcbiAgICAgIHJldHVybiBbeyBwYXlsb2FkOiBuZXcgVWludDhBcnJheShyZXN1bHQubXNnKSwgZnJvbTogdGhpcy5wYXJ0eUlkeCB9XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kc2dTdGF0ZSA9PT0gRHNnU3RhdGUuV2FpdE1zZzMpIHtcbiAgICAgIGFzc2VydCh0aGlzLmRzZ1N0YXRlQnl0ZXMsICdkc2dTdGF0ZUJ5dGVzIG11c3QgYmUgc2V0IGluIFdhaXRNc2czJyk7XG4gICAgICBsZXQgc2lnQnl0ZXM7XG4gICAgICB0cnkge1xuICAgICAgICBzaWdCeXRlcyA9IGVkMjU1MTlfZHNnX3JvdW5kM19wcm9jZXNzKHBlZXJQYXlsb2FkLCB0aGlzLmRzZ1N0YXRlQnl0ZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgY3JlYXRpbmcgbWVzc2FnZXMgZnJvbSBwYXJ0eSAke3RoaXMucGFydHlJZHh9LCByb3VuZCAke3RoaXMuZHNnU3RhdGV9OiAke2Vycn1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2lnbmF0dXJlID0gQnVmZmVyLmZyb20oc2lnQnl0ZXMpO1xuICAgICAgdGhpcy5kc2dTdGF0ZUJ5dGVzID0gbnVsbDtcbiAgICAgIHRoaXMuZHNnU3RhdGUgPSBEc2dTdGF0ZS5Db21wbGV0ZTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB0aHJvdyBFcnJvcignVW5leHBlY3RlZCBEU0cgc3RhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaW5hbCA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlIHByb2R1Y2VkIGJ5IHJvdW5kIDMuXG4gICAqIE9ubHkgYXZhaWxhYmxlIG9uY2UgdGhlIHByb3RvY29sIHJlYWNoZXMgYENvbXBsZXRlYC5cbiAgICovXG4gIGdldFNpZ25hdHVyZSgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5zaWduYXR1cmUpIHtcbiAgICAgIHRocm93IEVycm9yKCdEU0cgc2Vzc2lvbiBoYXMgbm90IHByb2R1Y2VkIGEgc2lnbmF0dXJlIHlldCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaWduYXR1cmU7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgY3VycmVudCBzZXNzaW9uIHN0YXRlIGFzIGEgSlNPTiBzdHJpbmcgZm9yIHBlcnNpc3RlbmNlLlxuICAgKiBJbmNsdWRlcyB0aGUgb3BhcXVlIHJvdW5kIHN0YXRlIGJ5dGVzIHBsdXMgZXZlcnl0aGluZyBuZWVkZWQgdG8gcmUtZW50ZXIgdGhlXG4gICAqIHByb3RvY29sIGFmdGVyIGEgcmVzdGFydCAoa2V5c2hhcmUsIG1lc3NhZ2UsIGRlcml2YXRpb24gcGF0aCwgY291bnRlcnBhcnQpLlxuICAgKi9cbiAgZ2V0U2Vzc2lvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIGlzIGNvbXBsZXRlLiBFeHBvcnRpbmcgdGhlIHNlc3Npb24gaXMgbm90IGFsbG93ZWQuJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRzZ1N0YXRlID09PSBEc2dTdGF0ZS5Jbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcignRFNHIHNlc3Npb24gbXVzdCBwcm9kdWNlIGl0cyBmaXJzdCBtZXNzYWdlIGJlZm9yZSBleHBvcnRpbmcuJyk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBkc2dTdGF0ZUJ5dGVzOiB0aGlzLmRzZ1N0YXRlQnl0ZXM/LnRvU3RyaW5nKCdiYXNlNjQnKSA/PyBudWxsLFxuICAgICAgZHNnUm91bmQ6IHRoaXMuZHNnU3RhdGUsXG4gICAgICBrZXlTaGFyZTogdGhpcy5rZXlTaGFyZT8udG9TdHJpbmcoJ2Jhc2U2NCcpID8/IG51bGwsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2U/LnRvU3RyaW5nKCdiYXNlNjQnKSA/PyBudWxsLFxuICAgICAgZGVyaXZhdGlvblBhdGg6IHRoaXMuZGVyaXZhdGlvblBhdGgsXG4gICAgICBwYXJ0eUlkeDogdGhpcy5wYXJ0eUlkeCxcbiAgICAgIG90aGVyUGFydHlJZHg6IHRoaXMub3RoZXJQYXJ0eUlkeCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyBhIHByZXZpb3VzbHkgZXhwb3J0ZWQgc2Vzc2lvbi4gQWxsb3dzIHRoZSBwcm90b2NvbCB0byBjb250aW51ZSBmcm9tXG4gICAqIHdoZXJlIGl0IGxlZnQgb2ZmLCBhcyBpZiB0aGUgcm91bmQgc3RhdGUgd2FzIGxvYWRlZCBmcm9tIGEgZGF0YWJhc2UuXG4gICAqL1xuICByZXN0b3JlU2Vzc2lvbihzZXNzaW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShzZXNzaW9uKTtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoRHNnU3RhdGUpLmluY2x1ZGVzKGRhdGEuZHNnUm91bmQpKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBkc2dSb3VuZCBpbiBzZXNzaW9uOiAke2RhdGEuZHNnUm91bmR9YCk7XG4gICAgfVxuICAgIGlmIChkYXRhLmRzZ1JvdW5kID09PSBEc2dTdGF0ZS5VbmluaXRpYWxpemVkIHx8IGRhdGEuZHNnUm91bmQgPT09IERzZ1N0YXRlLkluaXQpIHtcbiAgICAgIHRocm93IEVycm9yKGBDYW5ub3QgcmVzdG9yZSBEU0cgc2Vzc2lvbiBpbiBzdGF0ZSAke2RhdGEuZHNnUm91bmR9YCk7XG4gICAgfVxuICAgIGlmIChkYXRhLmRzZ1JvdW5kID09PSBEc2dTdGF0ZS5Db21wbGV0ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0RTRyBzZXNzaW9uIGlzIGNvbXBsZXRlLiBSZXN0b3JpbmcgdGhlIHNlc3Npb24gaXMgbm90IGFsbG93ZWQuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YS5wYXJ0eUlkeCAhPT0gJ251bWJlcicgfHwgZGF0YS5wYXJ0eUlkeCA8IDAgfHwgZGF0YS5wYXJ0eUlkeCA+IDIpIHtcbiAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIHBhcnR5SWR4IGluIHNlc3Npb246ICR7ZGF0YS5wYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEub3RoZXJQYXJ0eUlkeCAhPT0gJ251bWJlcicgfHxcbiAgICAgIGRhdGEub3RoZXJQYXJ0eUlkeCA8IDAgfHxcbiAgICAgIGRhdGEub3RoZXJQYXJ0eUlkeCA+IDIgfHxcbiAgICAgIGRhdGEub3RoZXJQYXJ0eUlkeCA9PT0gZGF0YS5wYXJ0eUlkeFxuICAgICkge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgb3RoZXJQYXJ0eUlkeCBpbiBzZXNzaW9uOiAke2RhdGEub3RoZXJQYXJ0eUlkeH1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFydHlJZHggIT09IGRhdGEucGFydHlJZHgpIHtcbiAgICAgIHRocm93IEVycm9yKGBTZXNzaW9uIHBhcnR5SWR4ICR7ZGF0YS5wYXJ0eUlkeH0gZG9lcyBub3QgbWF0Y2ggaW5zdGFuY2UgJHt0aGlzLnBhcnR5SWR4fWApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEuZHNnU3RhdGVCeXRlcyAhPT0gJ3N0cmluZycgfHwgZGF0YS5kc2dTdGF0ZUJ5dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFJvdW5kICR7ZGF0YS5kc2dSb3VuZH0gcmVxdWlyZXMgZHNnU3RhdGVCeXRlc2ApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEua2V5U2hhcmUgIT09ICdzdHJpbmcnIHx8IGRhdGEua2V5U2hhcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVzdG9yZWQgc2Vzc2lvbiBtaXNzaW5nIGtleVNoYXJlJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YS5tZXNzYWdlICE9PSAnc3RyaW5nJyB8fCBkYXRhLm1lc3NhZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVzdG9yZWQgc2Vzc2lvbiBtaXNzaW5nIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhLmRlcml2YXRpb25QYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Jlc3RvcmVkIHNlc3Npb24gbWlzc2luZyBkZXJpdmF0aW9uUGF0aCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGRzZ1N0YXRlQnl0ZXMgPSBCdWZmZXIuZnJvbShkYXRhLmRzZ1N0YXRlQnl0ZXMsICdiYXNlNjQnKTtcbiAgICBjb25zdCBrZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKGRhdGEua2V5U2hhcmUsICdiYXNlNjQnKTtcbiAgICBjb25zdCBtZXNzYWdlID0gQnVmZmVyLmZyb20oZGF0YS5tZXNzYWdlLCAnYmFzZTY0Jyk7XG4gICAgaWYgKGRzZ1N0YXRlQnl0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcihgUm91bmQgJHtkYXRhLmRzZ1JvdW5kfSByZXF1aXJlcyBkc2dTdGF0ZUJ5dGVzYCk7XG4gICAgfVxuICAgIGlmIChrZXlTaGFyZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXN0b3JlZCBzZXNzaW9uIG1pc3Npbmcga2V5U2hhcmUnKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignUmVzdG9yZWQgc2Vzc2lvbiBtaXNzaW5nIG1lc3NhZ2UnKTtcbiAgICB9XG5cbiAgICB0aGlzLmRzZ1N0YXRlQnl0ZXMgPSBkc2dTdGF0ZUJ5dGVzO1xuICAgIHRoaXMuZHNnU3RhdGUgPSBkYXRhLmRzZ1JvdW5kO1xuICAgIHRoaXMua2V5U2hhcmUgPSBrZXlTaGFyZTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuZGVyaXZhdGlvblBhdGggPSBkYXRhLmRlcml2YXRpb25QYXRoO1xuICAgIHRoaXMucGFydHlJZHggPSBkYXRhLnBhcnR5SWR4O1xuICAgIHRoaXMub3RoZXJQYXJ0eUlkeCA9IGRhdGEub3RoZXJQYXJ0eUlkeDtcbiAgfVxufVxuIl19
@@ -1,4 +1,5 @@
1
1
  export * as EddsaMPSDkg from './dkg';
2
+ export * as EddsaMPSDsg from './dsg';
2
3
  export * as MPSUtil from './util';
3
4
  export * as MPSTypes from './types';
4
5
  export * as MPSComms from './commsLayer';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,QAAQ,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,WAAW,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,QAAQ,MAAM,cAAc,CAAC"}
@@ -33,9 +33,10 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.MPSComms = exports.MPSTypes = exports.MPSUtil = exports.EddsaMPSDkg = void 0;
36
+ exports.MPSComms = exports.MPSTypes = exports.MPSUtil = exports.EddsaMPSDsg = exports.EddsaMPSDkg = void 0;
37
37
  exports.EddsaMPSDkg = __importStar(require("./dkg"));
38
+ exports.EddsaMPSDsg = __importStar(require("./dsg"));
38
39
  exports.MPSUtil = __importStar(require("./util"));
39
40
  exports.MPSTypes = __importStar(require("./types"));
40
41
  exports.MPSComms = __importStar(require("./commsLayer"));
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2VkZHNhLW1wcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBcUM7QUFDckMsa0RBQWtDO0FBQ2xDLG9EQUFvQztBQUNwQyx5REFBeUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBhcyBFZGRzYU1QU0RrZyBmcm9tICcuL2RrZyc7XG5leHBvcnQgKiBhcyBNUFNVdGlsIGZyb20gJy4vdXRpbCc7XG5leHBvcnQgKiBhcyBNUFNUeXBlcyBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCAqIGFzIE1QU0NvbW1zIGZyb20gJy4vY29tbXNMYXllcic7XG4iXX0=
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2VkZHNhLW1wcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBcUM7QUFDckMscURBQXFDO0FBQ3JDLGtEQUFrQztBQUNsQyxvREFBb0M7QUFDcEMseURBQXlDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogYXMgRWRkc2FNUFNEa2cgZnJvbSAnLi9ka2cnO1xuZXhwb3J0ICogYXMgRWRkc2FNUFNEc2cgZnJvbSAnLi9kc2cnO1xuZXhwb3J0ICogYXMgTVBTVXRpbCBmcm9tICcuL3V0aWwnO1xuZXhwb3J0ICogYXMgTVBTVHlwZXMgZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgKiBhcyBNUFNDb21tcyBmcm9tICcuL2NvbW1zTGF5ZXInO1xuIl19
@@ -20,6 +20,23 @@ export declare enum DkgState {
20
20
  /** DKG session has completed successfully and key shares are available */
21
21
  Complete = "Complete"
22
22
  }
23
+ /**
24
+ * Represents the state of a DSG (Distributed Sign Generation) session.
25
+ */
26
+ export declare enum DsgState {
27
+ /** DSG session has not been initialized */
28
+ Uninitialized = "Uninitialized",
29
+ /** initDsg() has been called; ready for getFirstMessage() */
30
+ Init = "Init",
31
+ /** R0 broadcast emitted; waiting for counterpart's R0 broadcast (SignMsg1) */
32
+ WaitMsg1 = "WaitMsg1",
33
+ /** R1 broadcast emitted; waiting for counterpart's R1 broadcast (SignMsg2) */
34
+ WaitMsg2 = "WaitMsg2",
35
+ /** R2 broadcast emitted; waiting for counterpart's R2 broadcast (SignMsg3, the partial sig) */
36
+ WaitMsg3 = "WaitMsg3",
37
+ /** Final 64-byte Ed25519 signature is available via getSignature() */
38
+ Complete = "Complete"
39
+ }
23
40
  export interface Message<T> {
24
41
  payload: T;
25
42
  from: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAE3B,eAAO,MAAM,mBAAmB;;EAE9B,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAExE;;GAEG;AACH,oBAAY,QAAQ;IAClB,2CAA2C;IAC3C,aAAa,kBAAkB;IAC/B,4DAA4D;IAC5D,IAAI,SAAS;IACb,wEAAwE;IACxE,QAAQ,aAAa;IACrB,yEAAyE;IACzE,QAAQ,aAAa;IACrB,iEAAiE;IACjE,KAAK,UAAU;IACf,0EAA0E;IAC1E,QAAQ,aAAa;CACtB;AAED,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAEhD,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AAEnD,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtD,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;AAEzD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,GAAG,iBAAiB,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,mBAAmB,CAE9E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,oBAAoB,GAAG,kBAAkB,CAEhF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,oBAAoB,CAElF;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CAAC,eAAe,EAAE,MAAM,GAAG,UAAU,GAAG,oBAAoB,CAMpG"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tss/eddsa-mps/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAE3B,eAAO,MAAM,mBAAmB;;EAE9B,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAExE;;GAEG;AACH,oBAAY,QAAQ;IAClB,2CAA2C;IAC3C,aAAa,kBAAkB;IAC/B,4DAA4D;IAC5D,IAAI,SAAS;IACb,wEAAwE;IACxE,QAAQ,aAAa;IACrB,yEAAyE;IACzE,QAAQ,aAAa;IACrB,iEAAiE;IACjE,KAAK,UAAU;IACf,0EAA0E;IAC1E,QAAQ,aAAa;CACtB;AAED;;GAEG;AACH,oBAAY,QAAQ;IAClB,2CAA2C;IAC3C,aAAa,kBAAkB;IAC/B,6DAA6D;IAC7D,IAAI,SAAS;IACb,8EAA8E;IAC9E,QAAQ,aAAa;IACrB,8EAA8E;IAC9E,QAAQ,aAAa;IACrB,+FAA+F;IAC/F,QAAQ,aAAa;IACrB,sEAAsE;IACtE,QAAQ,aAAa;CACtB;AAED,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAEhD,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AAEnD,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtD,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;AAEzD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,GAAG,iBAAiB,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,mBAAmB,CAE9E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,oBAAoB,GAAG,kBAAkB,CAEhF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,GAAG,oBAAoB,CAElF;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CAAC,eAAe,EAAE,MAAM,GAAG,UAAU,GAAG,oBAAoB,CAMpG"}
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.DkgState = exports.ReducedKeyShareType = void 0;
36
+ exports.DsgState = exports.DkgState = exports.ReducedKeyShareType = void 0;
37
37
  exports.serializeMessage = serializeMessage;
38
38
  exports.deserializeMessage = deserializeMessage;
39
39
  exports.serializeMessages = serializeMessages;
@@ -63,6 +63,24 @@ var DkgState;
63
63
  /** DKG session has completed successfully and key shares are available */
64
64
  DkgState["Complete"] = "Complete";
65
65
  })(DkgState || (exports.DkgState = DkgState = {}));
66
+ /**
67
+ * Represents the state of a DSG (Distributed Sign Generation) session.
68
+ */
69
+ var DsgState;
70
+ (function (DsgState) {
71
+ /** DSG session has not been initialized */
72
+ DsgState["Uninitialized"] = "Uninitialized";
73
+ /** initDsg() has been called; ready for getFirstMessage() */
74
+ DsgState["Init"] = "Init";
75
+ /** R0 broadcast emitted; waiting for counterpart's R0 broadcast (SignMsg1) */
76
+ DsgState["WaitMsg1"] = "WaitMsg1";
77
+ /** R1 broadcast emitted; waiting for counterpart's R1 broadcast (SignMsg2) */
78
+ DsgState["WaitMsg2"] = "WaitMsg2";
79
+ /** R2 broadcast emitted; waiting for counterpart's R2 broadcast (SignMsg3, the partial sig) */
80
+ DsgState["WaitMsg3"] = "WaitMsg3";
81
+ /** Final 64-byte Ed25519 signature is available via getSignature() */
82
+ DsgState["Complete"] = "Complete";
83
+ })(DsgState || (exports.DsgState = DsgState = {}));
66
84
  function serializeMessage(msg) {
67
85
  return { from: msg.from, payload: Buffer.from(msg.payload).toString('base64') };
68
86
  }
@@ -82,4 +100,4 @@ function getDecodedReducedKeyShare(reducedKeyShare) {
82
100
  }
83
101
  return decoded.right;
84
102
  }
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2VkZHNhLW1wcy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5Q0EsNENBRUM7QUFFRCxnREFFQztBQUVELDhDQUVDO0FBRUQsa0RBRUM7QUFXRCw4REFNQztBQXhFRCxtQ0FBZ0M7QUFDaEMseUNBQXNDO0FBQ3RDLHlDQUEyQjtBQUVkLFFBQUEsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4QyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0NBQ3ZCLENBQUMsQ0FBQztBQUlIOztHQUVHO0FBQ0gsSUFBWSxRQWFYO0FBYkQsV0FBWSxRQUFRO0lBQ2xCLDJDQUEyQztJQUMzQywyQ0FBK0IsQ0FBQTtJQUMvQiw0REFBNEQ7SUFDNUQseUJBQWEsQ0FBQTtJQUNiLHdFQUF3RTtJQUN4RSxpQ0FBcUIsQ0FBQTtJQUNyQix5RUFBeUU7SUFDekUsaUNBQXFCLENBQUE7SUFDckIsaUVBQWlFO0lBQ2pFLDJCQUFlLENBQUE7SUFDZiwwRUFBMEU7SUFDMUUsaUNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQWJXLFFBQVEsd0JBQVIsUUFBUSxRQWFuQjtBQWVELFNBQWdCLGdCQUFnQixDQUFDLEdBQXdCO0lBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFDbEYsQ0FBQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLEdBQXNCO0lBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFDekUsQ0FBQztBQUVELFNBQWdCLGlCQUFpQixDQUFDLElBQTBCO0lBQzFELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxTQUFnQixtQkFBbUIsQ0FBQyxJQUF3QjtJQUMxRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBV0QsU0FBZ0IseUJBQXlCLENBQUMsZUFBb0M7SUFDNUUsTUFBTSxPQUFPLEdBQUcsMkJBQW1CLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBTSxFQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDcEUsSUFBSSxJQUFBLGVBQU0sRUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlY29kZSB9IGZyb20gJ2Nib3IteCc7XG5pbXBvcnQgeyBpc0xlZnQgfSBmcm9tICdmcC10cy9FaXRoZXInO1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5cbmV4cG9ydCBjb25zdCBSZWR1Y2VkS2V5U2hhcmVUeXBlID0gdC50eXBlKHtcbiAgcHViOiB0LmFycmF5KHQubnVtYmVyKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBFZGRzYVJlZHVjZWRLZXlTaGFyZSA9IHQuVHlwZU9mPHR5cGVvZiBSZWR1Y2VkS2V5U2hhcmVUeXBlPjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBhIERLRyAoRGlzdHJpYnV0ZWQgS2V5IEdlbmVyYXRpb24pIHNlc3Npb25cbiAqL1xuZXhwb3J0IGVudW0gRGtnU3RhdGUge1xuICAvKiogREtHIHNlc3Npb24gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkICovXG4gIFVuaW5pdGlhbGl6ZWQgPSAnVW5pbml0aWFsaXplZCcsXG4gIC8qKiBES0cgc2Vzc2lvbiBoYXMgYmVlbiBpbml0aWFsaXplZCAoSW5pdCBzdGF0ZSBpbiBXQVNNKSAqL1xuICBJbml0ID0gJ0luaXQnLFxuICAvKiogREtHIHNlc3Npb24gaXMgd2FpdGluZyBmb3IgZmlyc3QgbWVzc2FnZSAoV2FpdE1zZzEgc3RhdGUgaW4gV0FTTSkgKi9cbiAgV2FpdE1zZzEgPSAnV2FpdE1zZzEnLFxuICAvKiogREtHIHNlc3Npb24gaXMgd2FpdGluZyBmb3Igc2Vjb25kIG1lc3NhZ2UgKFdhaXRNc2cyIHN0YXRlIGluIFdBU00pICovXG4gIFdhaXRNc2cyID0gJ1dhaXRNc2cyJyxcbiAgLyoqIERLRyBzZXNzaW9uIGhhcyBnZW5lcmF0ZWQga2V5IHNoYXJlcyAoU2hhcmUgc3RhdGUgaW4gV0FTTSkgKi9cbiAgU2hhcmUgPSAnU2hhcmUnLFxuICAvKiogREtHIHNlc3Npb24gaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYW5kIGtleSBzaGFyZXMgYXJlIGF2YWlsYWJsZSAqL1xuICBDb21wbGV0ZSA9ICdDb21wbGV0ZScsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZTxUPiB7XG4gIHBheWxvYWQ6IFQ7XG4gIGZyb206IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZE1lc3NhZ2UgPSBNZXNzYWdlPHN0cmluZz47XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRNZXNzYWdlcyA9IE1lc3NhZ2U8c3RyaW5nPltdO1xuXG5leHBvcnQgdHlwZSBEZXNlcmlhbGl6ZWRNZXNzYWdlID0gTWVzc2FnZTxVaW50OEFycmF5PjtcblxuZXhwb3J0IHR5cGUgRGVzZXJpYWxpemVkTWVzc2FnZXMgPSBNZXNzYWdlPFVpbnQ4QXJyYXk+W107XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVNZXNzYWdlKG1zZzogRGVzZXJpYWxpemVkTWVzc2FnZSk6IFNlcmlhbGl6ZWRNZXNzYWdlIHtcbiAgcmV0dXJuIHsgZnJvbTogbXNnLmZyb20sIHBheWxvYWQ6IEJ1ZmZlci5mcm9tKG1zZy5wYXlsb2FkKS50b1N0cmluZygnYmFzZTY0JykgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplTWVzc2FnZShtc2c6IFNlcmlhbGl6ZWRNZXNzYWdlKTogRGVzZXJpYWxpemVkTWVzc2FnZSB7XG4gIHJldHVybiB7IGZyb206IG1zZy5mcm9tLCBwYXlsb2FkOiBCdWZmZXIuZnJvbShtc2cucGF5bG9hZCwgJ2Jhc2U2NCcpIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVNZXNzYWdlcyhtc2dzOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyk6IFNlcmlhbGl6ZWRNZXNzYWdlcyB7XG4gIHJldHVybiBtc2dzLm1hcChzZXJpYWxpemVNZXNzYWdlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplTWVzc2FnZXMobXNnczogU2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICByZXR1cm4gbXNncy5tYXAoZGVzZXJpYWxpemVNZXNzYWdlKTtcbn1cblxuLyoqIEEgUEdQIGRldGFjaGVkLXNpZ25lZCBtZXNzYWdlIGJ5IGEgcGFydHkuXG4gKiBgbWVzc2FnZWAgaXMgdGhlIHJhdyBwYXlsb2FkIGVuY29kZWQgYXMgYmFzZTY0LlxuICogYHNpZ25hdHVyZWAgaXMgYW4gYXJtb3JlZCBQR1AgZGV0YWNoZWQgc2lnbmF0dXJlIG92ZXIgdGhvc2UgYnl0ZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTVBTU2lnbmVkTWVzc2FnZSB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc2lnbmF0dXJlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWNvZGVkUmVkdWNlZEtleVNoYXJlKHJlZHVjZWRLZXlTaGFyZTogQnVmZmVyIHwgVWludDhBcnJheSk6IEVkZHNhUmVkdWNlZEtleVNoYXJlIHtcbiAgY29uc3QgZGVjb2RlZCA9IFJlZHVjZWRLZXlTaGFyZVR5cGUuZGVjb2RlKGRlY29kZShyZWR1Y2VkS2V5U2hhcmUpKTtcbiAgaWYgKGlzTGVmdChkZWNvZGVkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIHJlZHVjZWRLZXlTaGFyZTogJHtkZWNvZGVkLmxlZnR9YCk7XG4gIH1cbiAgcmV0dXJuIGRlY29kZWQucmlnaHQ7XG59XG4iXX0=
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2VkZHNhLW1wcy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyREEsNENBRUM7QUFFRCxnREFFQztBQUVELDhDQUVDO0FBRUQsa0RBRUM7QUFXRCw4REFNQztBQTFGRCxtQ0FBZ0M7QUFDaEMseUNBQXNDO0FBQ3RDLHlDQUEyQjtBQUVkLFFBQUEsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4QyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0NBQ3ZCLENBQUMsQ0FBQztBQUlIOztHQUVHO0FBQ0gsSUFBWSxRQWFYO0FBYkQsV0FBWSxRQUFRO0lBQ2xCLDJDQUEyQztJQUMzQywyQ0FBK0IsQ0FBQTtJQUMvQiw0REFBNEQ7SUFDNUQseUJBQWEsQ0FBQTtJQUNiLHdFQUF3RTtJQUN4RSxpQ0FBcUIsQ0FBQTtJQUNyQix5RUFBeUU7SUFDekUsaUNBQXFCLENBQUE7SUFDckIsaUVBQWlFO0lBQ2pFLDJCQUFlLENBQUE7SUFDZiwwRUFBMEU7SUFDMUUsaUNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQWJXLFFBQVEsd0JBQVIsUUFBUSxRQWFuQjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxRQWFYO0FBYkQsV0FBWSxRQUFRO0lBQ2xCLDJDQUEyQztJQUMzQywyQ0FBK0IsQ0FBQTtJQUMvQiw2REFBNkQ7SUFDN0QseUJBQWEsQ0FBQTtJQUNiLDhFQUE4RTtJQUM5RSxpQ0FBcUIsQ0FBQTtJQUNyQiw4RUFBOEU7SUFDOUUsaUNBQXFCLENBQUE7SUFDckIsK0ZBQStGO0lBQy9GLGlDQUFxQixDQUFBO0lBQ3JCLHNFQUFzRTtJQUN0RSxpQ0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBYlcsUUFBUSx3QkFBUixRQUFRLFFBYW5CO0FBZUQsU0FBZ0IsZ0JBQWdCLENBQUMsR0FBd0I7SUFDdkQsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztBQUNsRixDQUFDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsR0FBc0I7SUFDdkQsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQztBQUN6RSxDQUFDO0FBRUQsU0FBZ0IsaUJBQWlCLENBQUMsSUFBMEI7SUFDMUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLElBQXdCO0lBQzFELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQ3RDLENBQUM7QUFXRCxTQUFnQix5QkFBeUIsQ0FBQyxlQUFvQztJQUM1RSxNQUFNLE9BQU8sR0FBRywyQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFNLEVBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUNwRSxJQUFJLElBQUEsZUFBTSxFQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVjb2RlIH0gZnJvbSAnY2Jvci14JztcbmltcG9ydCB7IGlzTGVmdCB9IGZyb20gJ2ZwLXRzL0VpdGhlcic7XG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcblxuZXhwb3J0IGNvbnN0IFJlZHVjZWRLZXlTaGFyZVR5cGUgPSB0LnR5cGUoe1xuICBwdWI6IHQuYXJyYXkodC5udW1iZXIpLFxufSk7XG5cbmV4cG9ydCB0eXBlIEVkZHNhUmVkdWNlZEtleVNoYXJlID0gdC5UeXBlT2Y8dHlwZW9mIFJlZHVjZWRLZXlTaGFyZVR5cGU+O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGEgREtHIChEaXN0cmlidXRlZCBLZXkgR2VuZXJhdGlvbikgc2Vzc2lvblxuICovXG5leHBvcnQgZW51bSBEa2dTdGF0ZSB7XG4gIC8qKiBES0cgc2Vzc2lvbiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi9cbiAgVW5pbml0aWFsaXplZCA9ICdVbmluaXRpYWxpemVkJyxcbiAgLyoqIERLRyBzZXNzaW9uIGhhcyBiZWVuIGluaXRpYWxpemVkIChJbml0IHN0YXRlIGluIFdBU00pICovXG4gIEluaXQgPSAnSW5pdCcsXG4gIC8qKiBES0cgc2Vzc2lvbiBpcyB3YWl0aW5nIGZvciBmaXJzdCBtZXNzYWdlIChXYWl0TXNnMSBzdGF0ZSBpbiBXQVNNKSAqL1xuICBXYWl0TXNnMSA9ICdXYWl0TXNnMScsXG4gIC8qKiBES0cgc2Vzc2lvbiBpcyB3YWl0aW5nIGZvciBzZWNvbmQgbWVzc2FnZSAoV2FpdE1zZzIgc3RhdGUgaW4gV0FTTSkgKi9cbiAgV2FpdE1zZzIgPSAnV2FpdE1zZzInLFxuICAvKiogREtHIHNlc3Npb24gaGFzIGdlbmVyYXRlZCBrZXkgc2hhcmVzIChTaGFyZSBzdGF0ZSBpbiBXQVNNKSAqL1xuICBTaGFyZSA9ICdTaGFyZScsXG4gIC8qKiBES0cgc2Vzc2lvbiBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhbmQga2V5IHNoYXJlcyBhcmUgYXZhaWxhYmxlICovXG4gIENvbXBsZXRlID0gJ0NvbXBsZXRlJyxcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBhIERTRyAoRGlzdHJpYnV0ZWQgU2lnbiBHZW5lcmF0aW9uKSBzZXNzaW9uLlxuICovXG5leHBvcnQgZW51bSBEc2dTdGF0ZSB7XG4gIC8qKiBEU0cgc2Vzc2lvbiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi9cbiAgVW5pbml0aWFsaXplZCA9ICdVbmluaXRpYWxpemVkJyxcbiAgLyoqIGluaXREc2coKSBoYXMgYmVlbiBjYWxsZWQ7IHJlYWR5IGZvciBnZXRGaXJzdE1lc3NhZ2UoKSAqL1xuICBJbml0ID0gJ0luaXQnLFxuICAvKiogUjAgYnJvYWRjYXN0IGVtaXR0ZWQ7IHdhaXRpbmcgZm9yIGNvdW50ZXJwYXJ0J3MgUjAgYnJvYWRjYXN0IChTaWduTXNnMSkgKi9cbiAgV2FpdE1zZzEgPSAnV2FpdE1zZzEnLFxuICAvKiogUjEgYnJvYWRjYXN0IGVtaXR0ZWQ7IHdhaXRpbmcgZm9yIGNvdW50ZXJwYXJ0J3MgUjEgYnJvYWRjYXN0IChTaWduTXNnMikgKi9cbiAgV2FpdE1zZzIgPSAnV2FpdE1zZzInLFxuICAvKiogUjIgYnJvYWRjYXN0IGVtaXR0ZWQ7IHdhaXRpbmcgZm9yIGNvdW50ZXJwYXJ0J3MgUjIgYnJvYWRjYXN0IChTaWduTXNnMywgdGhlIHBhcnRpYWwgc2lnKSAqL1xuICBXYWl0TXNnMyA9ICdXYWl0TXNnMycsXG4gIC8qKiBGaW5hbCA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlIGlzIGF2YWlsYWJsZSB2aWEgZ2V0U2lnbmF0dXJlKCkgKi9cbiAgQ29tcGxldGUgPSAnQ29tcGxldGUnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2U8VD4ge1xuICBwYXlsb2FkOiBUO1xuICBmcm9tOiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRNZXNzYWdlID0gTWVzc2FnZTxzdHJpbmc+O1xuXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkTWVzc2FnZXMgPSBNZXNzYWdlPHN0cmluZz5bXTtcblxuZXhwb3J0IHR5cGUgRGVzZXJpYWxpemVkTWVzc2FnZSA9IE1lc3NhZ2U8VWludDhBcnJheT47XG5cbmV4cG9ydCB0eXBlIERlc2VyaWFsaXplZE1lc3NhZ2VzID0gTWVzc2FnZTxVaW50OEFycmF5PltdO1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTWVzc2FnZShtc2c6IERlc2VyaWFsaXplZE1lc3NhZ2UpOiBTZXJpYWxpemVkTWVzc2FnZSB7XG4gIHJldHVybiB7IGZyb206IG1zZy5mcm9tLCBwYXlsb2FkOiBCdWZmZXIuZnJvbShtc2cucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZU1lc3NhZ2UobXNnOiBTZXJpYWxpemVkTWVzc2FnZSk6IERlc2VyaWFsaXplZE1lc3NhZ2Uge1xuICByZXR1cm4geyBmcm9tOiBtc2cuZnJvbSwgcGF5bG9hZDogQnVmZmVyLmZyb20obXNnLnBheWxvYWQsICdiYXNlNjQnKSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTWVzc2FnZXMobXNnczogRGVzZXJpYWxpemVkTWVzc2FnZXMpOiBTZXJpYWxpemVkTWVzc2FnZXMge1xuICByZXR1cm4gbXNncy5tYXAoc2VyaWFsaXplTWVzc2FnZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZU1lc3NhZ2VzKG1zZ3M6IFNlcmlhbGl6ZWRNZXNzYWdlcyk6IERlc2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgcmV0dXJuIG1zZ3MubWFwKGRlc2VyaWFsaXplTWVzc2FnZSk7XG59XG5cbi8qKiBBIFBHUCBkZXRhY2hlZC1zaWduZWQgbWVzc2FnZSBieSBhIHBhcnR5LlxuICogYG1lc3NhZ2VgIGlzIHRoZSByYXcgcGF5bG9hZCBlbmNvZGVkIGFzIGJhc2U2NC5cbiAqIGBzaWduYXR1cmVgIGlzIGFuIGFybW9yZWQgUEdQIGRldGFjaGVkIHNpZ25hdHVyZSBvdmVyIHRob3NlIGJ5dGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1QU1NpZ25lZE1lc3NhZ2Uge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHNpZ25hdHVyZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVjb2RlZFJlZHVjZWRLZXlTaGFyZShyZWR1Y2VkS2V5U2hhcmU6IEJ1ZmZlciB8IFVpbnQ4QXJyYXkpOiBFZGRzYVJlZHVjZWRLZXlTaGFyZSB7XG4gIGNvbnN0IGRlY29kZWQgPSBSZWR1Y2VkS2V5U2hhcmVUeXBlLmRlY29kZShkZWNvZGUocmVkdWNlZEtleVNoYXJlKSk7XG4gIGlmIChpc0xlZnQoZGVjb2RlZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBwYXJzZSByZWR1Y2VkS2V5U2hhcmU6ICR7ZGVjb2RlZC5sZWZ0fWApO1xuICB9XG4gIHJldHVybiBkZWNvZGVkLnJpZ2h0O1xufVxuIl19