@did-btcr2/keypair 0.10.0 → 0.11.1

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.
@@ -1,10 +1,15 @@
1
- import { BIP340_SECRET_KEY_MULTIBASE_PREFIX, BIP340_SECRET_KEY_MULTIBASE_PREFIX_HASH, CURVE, SecretKeyError } from '@did-btcr2/common';
1
+ import { SecretKeyError } from '@did-btcr2/common';
2
2
  import { sha256 } from '@noble/hashes/sha2';
3
- import { getRandomValues, randomBytes } from 'crypto';
4
- import { base58btc } from 'multiformats/bases/base58';
5
- import * as tinysecp from 'tiny-secp256k1';
6
- import { SchnorrKeyPair } from './pair.js';
3
+ import { bytesToHex } from '@noble/hashes/utils';
4
+ import { secp256k1, schnorr } from '@noble/curves/secp256k1.js';
5
+ import { randomBytes } from '@noble/hashes/utils';
6
+ import { base58 } from '@scure/base';
7
7
  import { CompressedSecp256k1PublicKey } from './public.js';
8
+ import { equalBytes } from '@noble/curves/utils.js';
9
+ /** Fixed secret key header bytes per the Data Integrity BIP340 Cryptosuite spec: [0x81, 0x26] */
10
+ const BIP340_SECRET_KEY_MULTIBASE_PREFIX = new Uint8Array([0x81, 0x26]);
11
+ /** Hash of the BIP-340 Multikey secret key prefix */
12
+ const BIP340_SECRET_KEY_MULTIBASE_PREFIX_HASH = bytesToHex(sha256(BIP340_SECRET_KEY_MULTIBASE_PREFIX));
8
13
  /**
9
14
  * Encapsulates a secp256k1 secret key
10
15
  * Provides get methods for different formats (raw, secret, point).
@@ -32,25 +37,35 @@ export class Secp256k1SecretKey {
32
37
  if (!isBytes && !isSecret) {
33
38
  throw new SecretKeyError('Invalid entropy: must be a valid byte array (32) or bigint', 'CONSTRUCTOR_ERROR');
34
39
  }
35
- // If bytes and bytes are not length 32
40
+ // If bytes and length is 32, defensive-copy and derive seed
36
41
  if (isBytes && entropy.length === 32) {
37
- this.#bytes = entropy;
38
- this.#seed = Secp256k1SecretKey.toSecret(entropy);
42
+ this.#bytes = new Uint8Array(entropy);
43
+ this.#seed = Secp256k1SecretKey.toSecret(this.#bytes);
39
44
  }
40
- // If secret and secret is not a valid bigint, throw error
41
- if (isSecret && !(entropy < 1n || entropy >= CURVE.n)) {
45
+ // If bigint in valid range [1, n), convert to bytes
46
+ if (isSecret && entropy >= 1n && entropy < secp256k1.Point.Fn.ORDER) {
42
47
  this.#bytes = Secp256k1SecretKey.toBytes(entropy);
43
48
  this.#seed = entropy;
44
49
  }
45
50
  if (!this.#bytes || this.#bytes.length !== 32) {
46
51
  throw new SecretKeyError('Invalid bytes: must be a valid 32-byte secret key', 'CONSTRUCTOR_ERROR');
47
52
  }
48
- if (!this.#seed || (this.#seed < 1n || this.#seed >= CURVE.n)) {
49
- throw new SecretKeyError('Invalid seed: must must be valid bigint', 'CONSTRUCTOR_ERROR');
53
+ if (!this.#seed || this.#seed < 1n || this.#seed >= secp256k1.Point.Fn.ORDER) {
54
+ throw new SecretKeyError('Invalid seed: must be valid bigint', 'CONSTRUCTOR_ERROR');
50
55
  }
51
56
  // Set the secret key multibase
52
57
  this.#multibase = this.encode();
53
58
  }
59
+ /**
60
+ * Zeros out secret key material from memory.
61
+ * The instance should not be used after calling this method.
62
+ */
63
+ destroy() {
64
+ if (this.#bytes)
65
+ this.#bytes.fill(0);
66
+ this.#seed = undefined;
67
+ this.#multibase = '';
68
+ }
54
69
  /**
55
70
  * Get the secret key entropy as a byte array.
56
71
  * @returns {KeyBytes} The secret key bytes as a Uint8Array
@@ -90,75 +105,71 @@ export class Secp256k1SecretKey {
90
105
  * @returns {string} The secret key in BIP340 multibase format.
91
106
  */
92
107
  encode() {
93
- // Convert Uint8Array bytes to an Array
94
108
  const secretKeyBytes = Array.from(this.bytes);
95
- if (secretKeyBytes.length !== 32) {
96
- throw new SecretKeyError('Invalid secret key: must be a valid 32-byte secret key', 'ENCODE_MULTIBASE_ERROR');
97
- }
98
- // Convert prefix to an array
99
109
  const mbaseBytes = Array.from(BIP340_SECRET_KEY_MULTIBASE_PREFIX);
100
- // Push the secret key bytes at the end of the prefix
101
110
  mbaseBytes.push(...secretKeyBytes);
102
- // Encode the bytes in base58btc format and return
103
- return base58btc.encode(Uint8Array.from(mbaseBytes));
111
+ return 'z' + base58.encode(Uint8Array.from(mbaseBytes));
104
112
  }
105
113
  /**
106
114
  * Checks if this secret key is equal to another.
107
- * @param {Secp256k1SecretKey} other The other secret key
115
+ * @param {SecretKey} other The other secret key
108
116
  * @returns {boolean} True if the private keys are equal, false otherwise
109
117
  */
110
118
  equals(other) {
111
- // Compare the hex strings of the private keys
112
- return this.hex === other.hex;
119
+ return equalBytes(this.bytes, other.bytes);
113
120
  }
114
121
  /**
115
122
  * Computes the public key from the secret key bytes.
116
123
  * @returns {CompressedSecp256k1PublicKey} The computed public key
117
124
  */
118
125
  computePublicKey() {
119
- // Derive the public key from the secret key
120
- const publicKeyBytes = tinysecp.pointFromScalar(this.bytes, true);
121
- // If no public key, throw error
122
- if (!publicKeyBytes) {
123
- throw new SecretKeyError('Invalid compute: failed to derive public key', 'COMPUTE_PUBLIC_KEY_ERROR');
124
- }
125
- // If public key is not compressed, throw error
126
- if (publicKeyBytes.length !== 33) {
127
- throw new SecretKeyError('Invalid compute: public key not compressed format', 'COMPUTE_PUBLIC_KEY_ERROR');
128
- }
129
- return new CompressedSecp256k1PublicKey(publicKeyBytes);
126
+ return new CompressedSecp256k1PublicKey(secp256k1.getPublicKey(this.bytes));
130
127
  }
131
128
  /**
132
- * Converts the secret key to a JSON object.
133
- * @returns {SecretKeyObject} The secret key as a JSON object
129
+ * Safe JSON representation. Does not expose secret material.
130
+ * Called implicitly by JSON.stringify(). Use exportJSON() for full serialization.
134
131
  */
135
132
  toJSON() {
133
+ return { type: 'Secp256k1SecretKey' };
134
+ }
135
+ /**
136
+ * Exports the secret key as a JSON object. Contains sensitive material.
137
+ * @returns {SecretKeyObject} The secret key as a JSON object
138
+ */
139
+ exportJSON() {
136
140
  return {
137
141
  bytes: Array.from(this.bytes),
138
142
  seed: this.seed.toString(),
139
143
  hex: this.hex,
140
144
  };
141
145
  }
146
+ /** @override Prevents secret material from appearing in console.log */
147
+ toString() {
148
+ return '[Secp256k1SecretKey]';
149
+ }
150
+ /** @override Prevents secret material from appearing in Node.js inspect */
151
+ [Symbol.for('nodejs.util.inspect.custom')]() {
152
+ return '[Secp256k1SecretKey]';
153
+ }
142
154
  /**
143
155
  * Checks if the secret key is valid.
144
156
  * @returns {boolean} True if the secret key is valid, false otherwise
145
157
  */
146
158
  isValid() {
147
- return tinysecp.isPrivate(this.bytes);
159
+ return secp256k1.utils.isValidSecretKey(this.bytes);
148
160
  }
149
161
  /**
150
162
  * Checks if the public key is a valid secp256k1 point.
151
163
  * @returns {boolean} True if the public key is valid, false otherwise
152
164
  */
153
165
  hasValidPublicKey() {
154
- // Compute the public key from the secret key and compress it
155
- const pk = this.computePublicKey();
156
- // If the public key is not valid, return false
157
- if (!tinysecp.isPoint(pk.compressed)) {
166
+ try {
167
+ this.computePublicKey();
168
+ return true;
169
+ }
170
+ catch {
158
171
  return false;
159
172
  }
160
- // Return true if the computed public key equals the provided public key
161
- return true;
162
173
  }
163
174
  /**
164
175
  * Produce a signature over arbitrary data using schnorr or ecdsa.
@@ -171,13 +182,11 @@ export class Secp256k1SecretKey {
171
182
  sign(data, opts) {
172
183
  // Set default options if not provided
173
184
  opts ??= { scheme: 'schnorr' };
174
- // Sign ecdsa and return
175
185
  if (opts.scheme === 'ecdsa') {
176
- return tinysecp.sign(data, this.bytes);
186
+ return secp256k1.sign(data, this.bytes);
177
187
  }
178
- // Sign schnorr and return
179
188
  if (opts.scheme === 'schnorr') {
180
- return tinysecp.signSchnorr(data, this.bytes, randomBytes(32));
189
+ return schnorr.sign(data, this.bytes);
181
190
  }
182
191
  throw new SecretKeyError(`Invalid scheme: ${opts.scheme}.`, 'SIGN_ERROR', opts);
183
192
  }
@@ -188,7 +197,7 @@ export class Secp256k1SecretKey {
188
197
  */
189
198
  static decode(multibase) {
190
199
  // Decode the public key multibase string
191
- const decoded = base58btc.decode(multibase);
200
+ const decoded = base58.decode(multibase.slice(1));
192
201
  // If the public key bytes are not 35 bytes, throw an error
193
202
  if (decoded.length !== 34) {
194
203
  throw new SecretKeyError('Invalid argument: must be 34 byte secretKeyMultibase', 'DECODE_MULTIBASE_ERROR');
@@ -212,20 +221,6 @@ export class Secp256k1SecretKey {
212
221
  static fromJSON(json) {
213
222
  return new Secp256k1SecretKey(new Uint8Array(json.bytes));
214
223
  }
215
- /**
216
- * Converts a Secp256k1SecretKey or KeyBytes to a SchnorrKeyPair.
217
- * @param {KeyBytes} bytes The secret key bytes
218
- * @returns {SchnorrKeyPair} The SchnorrKeyPair object containing the public and private keys
219
- * @throws {SecretKeyError} If the secret key is not valid
220
- */
221
- static toKeyPair(bytes) {
222
- // Create a new Secp256k1SecretKey from the bytes
223
- const secretKey = new Secp256k1SecretKey(bytes);
224
- // Compute the public key from the secret key
225
- const publicKey = secretKey.computePublicKey();
226
- // Create a new Pair from the public key and secret key
227
- return new SchnorrKeyPair({ publicKey, secretKey });
228
- }
229
224
  /**
230
225
  * Convert a bigint secret to secret key bytes.
231
226
  * @param {KeyBytes} bytes The secret key bytes
@@ -243,42 +238,30 @@ export class Secp256k1SecretKey {
243
238
  // Ensure it’s a valid 32-byte value in [1, n-1] and convert bigint to Uint8Array
244
239
  const bytes = Uint8Array.from({ length: 32 }, (_, i) => Number(secret >> BigInt(8 * (31 - i)) & BigInt(0xff)));
245
240
  // If bytes are not a valid secp256k1 secret key, throw error
246
- if (!tinysecp.isPrivate(bytes)) {
241
+ if (!secp256k1.utils.isValidSecretKey(bytes)) {
247
242
  throw new SecretKeyError('Invalid secret key: secret out of valid range', 'SET_PRIVATE_KEY_ERROR');
248
243
  }
249
244
  return new Uint8Array(bytes);
250
245
  }
251
- /**
252
- * Creates a new Secp256k1SecretKey object from random bytes.
253
- * @param {KeyBytes} bytes The secret key bytes
254
- * @returns {Secp256k1SecretKey} A new Secp256k1SecretKey object
255
- */
256
- static fromBytes(bytes) {
257
- // Return a new Secp256k1SecretKey object
258
- return new Secp256k1SecretKey(bytes);
259
- }
260
246
  /**
261
247
  * Creates a new Secp256k1SecretKey object from a bigint secret.
262
248
  * @param {bigint} bint The secret bigint
263
249
  * @returns {Secp256k1SecretKey} A new Secp256k1SecretKey object
264
250
  */
265
251
  static fromBigInt(bint) {
266
- // Convert the secret bigint to a hex string
267
- const hexsecret = bint.toString(16).padStart(64, '0');
268
- // Convert the hex string to a Uint8Array
269
- const bytes = new Uint8Array(hexsecret.match(/.{2}/g).map(byte => parseInt(byte, 16)));
270
- // Return a new Secp256k1SecretKey object
271
- return new Secp256k1SecretKey(bytes);
252
+ return new Secp256k1SecretKey(Secp256k1SecretKey.toBytes(bint));
272
253
  }
273
254
  /**
274
255
  * Generates random secret key bytes.
275
256
  * @returns {KeyBytes} Uint8Array of 32 random bytes.
276
257
  */
277
258
  static random() {
278
- // Generate empty 32-byte array
279
- const byteArray = new Uint8Array(32);
280
- // Use the getRandomValues function to fill the byteArray with random values
281
- return getRandomValues(byteArray);
259
+ let byteArray;
260
+ // Retry until bytes fall in valid scalar range [1, n)
261
+ do {
262
+ byteArray = randomBytes(32);
263
+ } while (!secp256k1.utils.isValidSecretKey(byteArray));
264
+ return byteArray;
282
265
  }
283
266
  /**
284
267
  * Creates a new Secp256k1SecretKey from random secret key bytes.
@@ -1 +1 @@
1
- {"version":3,"file":"secret.js","sourceRoot":"","sources":["../../src/secret.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"secret.js","sourceRoot":"","sources":["../../src/secret.ts"],"names":[],"mappings":"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"}
package/dist/esm/pair.js CHANGED
@@ -7,22 +7,8 @@ import { Secp256k1SecretKey } from './secret.js';
7
7
  * @type {SchnorrKeyPair}
8
8
  */
9
9
  export class SchnorrKeyPair {
10
- /**
11
- * The secret key objec
12
- */
13
10
  #secretKey;
14
- /**
15
- * The public key object
16
- */ ;
17
11
  #publicKey;
18
- /**
19
- * The public key in multibase forma
20
- */
21
- #publicKeyMultibase;
22
- /**
23
- * The secret key in multibase forma
24
- */
25
- #secretKeyMultibase;
26
12
  /**
27
13
  * Creates an instance of Keys. Must provide a at least a secret key.
28
14
  * Can optionally provide both a secret and public key, but must be a valid pair.
@@ -54,8 +40,13 @@ export class SchnorrKeyPair {
54
40
  else {
55
41
  this.#publicKey = this.#secretKey.computePublicKey();
56
42
  }
57
- this.#publicKeyMultibase = this.#publicKey.multibase.encoded;
58
- this.#secretKeyMultibase = this.#secretKey ? this.#secretKey.multibase : '';
43
+ // Validate that an explicitly provided public key matches the secret key
44
+ if (this.#secretKey && params.publicKey) {
45
+ const derived = this.#secretKey.computePublicKey();
46
+ if (!this.#publicKey.equals(derived)) {
47
+ throw new KeyPairError('Public key does not match secret key', 'CONSTRUCTOR_ERROR');
48
+ }
49
+ }
59
50
  }
60
51
  /**
61
52
  * Get the Secp256k1SecretKey.
@@ -81,26 +72,27 @@ export class SchnorrKeyPair {
81
72
  * @throws {KeyPairError} If the public key is not a valid pair with the secret key.
82
73
  */
83
74
  set publicKey(publicKey) {
84
- // If the public key is not a valid pair with the secret key, throw an error
85
- if (this.secretKey) {
86
- if (!this.secretKey.hasValidPublicKey()) {
87
- throw new KeyPairError('Secret key is not valid', 'SECRET_KEY_ERROR');
75
+ if (this.#secretKey) {
76
+ const derived = this.#secretKey.computePublicKey();
77
+ if (!publicKey.equals(derived)) {
78
+ throw new KeyPairError('Public key does not match secret key', 'PUBLIC_KEY_ERROR');
88
79
  }
89
- const cPk = this.secretKey.computePublicKey();
90
- if (!publicKey.equals(cPk))
91
- throw new KeyPairError('Public key is not a valid pair with the secret key', 'PUBLIC_KEY_ERROR');
92
80
  }
93
81
  this.#publicKey = publicKey;
94
- this.#publicKeyMultibase = publicKey.multibase.encoded;
95
- this.#secretKeyMultibase = this.#secretKey ? this.#secretKey.multibase : '';
96
82
  }
97
83
  /**
98
84
  * Get the CompressedSecp256k1PublicKey.
99
85
  * @returns {CompressedSecp256k1PublicKey} The CompressedSecp256k1PublicKey object
100
86
  */
101
87
  get publicKey() {
102
- const publicKey = this.#publicKey;
103
- return publicKey;
88
+ return this.#publicKey;
89
+ }
90
+ /**
91
+ * Whether this key pair contains a secret key.
92
+ * @returns {boolean} True if the secret key is present.
93
+ */
94
+ get hasSecretKey() {
95
+ return !!this.#secretKey;
104
96
  }
105
97
  /**
106
98
  * Get the `raw` bytes of each key in the SchnorrKeyPair.
@@ -109,7 +101,7 @@ export class SchnorrKeyPair {
109
101
  get raw() {
110
102
  return {
111
103
  public: this.publicKey.x,
112
- secret: this.secretKey ? this.secretKey.bytes : undefined
104
+ secret: this.#secretKey ? this.#secretKey.bytes : undefined
113
105
  };
114
106
  }
115
107
  /**
@@ -119,7 +111,7 @@ export class SchnorrKeyPair {
119
111
  get hex() {
120
112
  return {
121
113
  public: this.publicKey.hex,
122
- secret: this.#secretKey ? this.secretKey.hex : undefined
114
+ secret: this.#secretKey ? this.#secretKey.hex : undefined
123
115
  };
124
116
  }
125
117
  /**
@@ -128,20 +120,36 @@ export class SchnorrKeyPair {
128
120
  */
129
121
  get multibase() {
130
122
  return {
131
- publicKeyMultibase: this.#publicKeyMultibase,
132
- secretKeyMultibase: this.#secretKeyMultibase,
123
+ publicKeyMultibase: this.#publicKey.multibase.encoded,
124
+ secretKeyMultibase: this.#secretKey ? this.#secretKey.multibase : '',
133
125
  };
134
126
  }
135
127
  /**
136
- * JSON representation of a Keys.
137
- * @returns {SchnorrKeyPairObject} The Keys as a JSON object
128
+ * Safe JSON representation. Only includes the public key.
129
+ * Called implicitly by JSON.stringify(). Use exportJSON() for full serialization.
130
+ * @returns {{ publicKey: PublicKeyObject }} The JSON representation of the public key
138
131
  */
139
132
  toJSON() {
133
+ return { publicKey: this.publicKey.toJSON() };
134
+ }
135
+ /**
136
+ * Exports the full key pair as a JSON object. Contains sensitive material.
137
+ * @returns {SchnorrKeyPairObject} The key pair as a JSON object
138
+ * @throws {KeyPairError} If the secret key is not available
139
+ */
140
+ exportJSON() {
141
+ if (!this.#secretKey) {
142
+ throw new KeyPairError('Cannot export: secret key required. Use publicKey.toJSON() for public-key-only pairs.', 'SERIALIZE_ERROR');
143
+ }
140
144
  return {
141
- secretKey: this.secretKey.toJSON(),
145
+ secretKey: this.#secretKey.exportJSON(),
142
146
  publicKey: this.publicKey.toJSON()
143
147
  };
144
148
  }
149
+ /** @override Prevents secret material from appearing in Node.js inspect */
150
+ [Symbol.for('nodejs.util.inspect.custom')]() {
151
+ return `[SchnorrKeyPair ${this.publicKey.hex}]`;
152
+ }
145
153
  /**
146
154
  * Static method creates a new Keys from a JSON object.
147
155
  * @param {SchnorrKeyPairObject} keys The JSON object to initialize the Keys.
@@ -200,21 +208,7 @@ export class SchnorrKeyPair {
200
208
  * @returns {boolean} True if the public key and secret key are equal, false otherwise.
201
209
  */
202
210
  static equals(kp, otherKp) {
203
- // Deconstruct the public keys from the key pairs
204
- const pk = kp.publicKey;
205
- const otherPk = otherKp.publicKey;
206
- // If publicKeys present, use to compare as hex strings.
207
- if (pk && otherPk) {
208
- return pk.hex === otherPk.hex;
209
- }
210
- // Deconstruct the secret keys from the key pairs
211
- const sk = kp.secretKey;
212
- const otherSk = otherKp.secretKey;
213
- if (sk && otherSk) {
214
- // Get the public key hex strings for both key pair publicKeys
215
- return sk.hex === otherSk.hex;
216
- }
217
- throw new KeyPairError('Cannot compare invalid key pair(s)', 'KEYPAIR_EQUALS_ERROR');
211
+ return kp.publicKey.equals(otherKp.publicKey);
218
212
  }
219
213
  /**
220
214
  * Static method to generate a new random SchnorrKeyPair instance.
@@ -1 +1 @@
1
- {"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/pair.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,4BAA4B,EAAa,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAa,MAAM,aAAa,CAAC;AAoB5D;;;;GAIG;AACH,MAAM,OAAO,cAAc;IACzB;;QAEI;IACJ,UAAU,CAAsB;IAEhC;;OAEG,CAAA,CAAC;IACJ,UAAU,CAA+B;IAEzC;;QAEI;IACJ,mBAAmB,CAAS;IAE5B;;QAEI;IACJ,mBAAmB,CAAS;IAE5B;;;;;;;;OAQG;IACH,YAAY,SAA+B,EAAE;QAC3C,iDAAiD;QACjD,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC3C,MAAM,IAAI,YAAY,CAAC,qDAAqD,EAAE,mBAAmB,CAAC,CAAC;QACrG,CAAC;QAED,oBAAoB;QACpB,IAAG,MAAM,CAAC,SAAS,YAAY,UAAU,EAAE,CAAC;YAC1C,IAAI,CAAC,UAAU,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7D,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,YAAY,kBAAkB,EAAE,CAAC;YAC1D,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC;QACrC,CAAC;QAED,oBAAoB;QACpB,IAAG,MAAM,CAAC,SAAS,YAAY,4BAA4B,EAAE,CAAC;YAC5D,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC;QACrC,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,YAAY,UAAU,EAAE,CAAC;YAClD,IAAI,CAAC,UAAU,GAAG,IAAI,4BAA4B,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAW,CAAC,gBAAgB,EAAE,CAAC;QACxD,CAAC;QAED,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC;QAC7D,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,CAAC;IAED;;;;OAIG;IACH,IAAI,SAAS;QACX,qDAAqD;QACrD,IAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,YAAY,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,CAAC;QACzE,CAAC;QACD,iDAAiD;QACjD,IAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9B,MAAM,IAAI,YAAY,CAAC,yBAAyB,EAAE,kBAAkB,CAAC,CAAC;QACxE,CAAC;QACD,kCAAkC;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,IAAI,SAAS,CAAC,SAAuC;QACnD,4EAA4E;QAC5E,IAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,IAAG,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBACvC,MAAM,IAAI,YAAY,CAAC,yBAAyB,EAAE,kBAAkB,CAAC,CAAC;YACxE,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC;YAC9C,IAAG,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC;gBACvB,MAAM,IAAI,YAAY,CAAC,oDAAoD,EAAE,kBAAkB,CAAC,CAAC;QACrG,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC;QACvD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,CAAC;IAED;;;OAGG;IACH,IAAI,SAAS;QACX,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAI,GAAG;QACL,OAAO;YACL,MAAM,EAAG,IAAI,CAAC,SAAS,CAAC,CAAC;YACzB,MAAM,EAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SAC3D,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,IAAI,GAAG;QACL,OAAO;YACL,MAAM,EAAG,IAAI,CAAC,SAAS,CAAC,GAAG;YAC3B,MAAM,EAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;SAC1D,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,IAAI,SAAS;QACX,OAAO;YACL,kBAAkB,EAAG,IAAI,CAAC,mBAAmB;YAC7C,kBAAkB,EAAG,IAAI,CAAC,mBAAmB;SAC9C,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM;QACJ,OAAO;YACL,SAAS,EAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;YACnC,SAAS,EAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;SACpC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,IAA0B;QACxC,OAAO,IAAI,cAAc,CAAC;YACxB,SAAS,EAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;YACvD,SAAS,EAAG,4BAA4B,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;SAClE,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,IAA0B;QAE1C,8DAA8D;QAC9D,gDAAgD;QAChD,+BAA+B;QAC/B,MAAM,MAAM,GAAG,OAAO,IAAI,KAAK,QAAQ;YACrC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC;QAET,kBAAkB;QAClB,IAAG,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,YAAY,CAAC,yCAAyC,EAAE,uBAAuB,CAAC,CAAC;QAC7F,CAAC;QAED,4EAA4E;QAC5E,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAE/C,2BAA2B;QAC3B,OAAO,IAAI,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,IAAY;QAC5B,MAAM,SAAS,GAAG,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAC/C,OAAO,IAAI,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,QAAkB;QAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,EAAkB,EAAE,OAAuB;QACvD,iDAAiD;QACjD,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC;QACxB,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;QAElC,wDAAwD;QACxD,IAAG,EAAE,IAAI,OAAO,EAAE,CAAC;YACjB,OAAO,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC;QAChC,CAAC;QAED,iDAAiD;QACjD,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC;QACxB,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;QAClC,IAAG,EAAE,IAAI,OAAO,EAAE,CAAC;YACjB,8DAA8D;YAC9D,OAAO,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC;QAChC,CAAC;QAED,MAAM,IAAI,YAAY,CAAC,oCAAoC,EAAE,sBAAsB,CAAC,CAAC;IACvF,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,QAAQ;QACb,mCAAmC;QACnC,MAAM,EAAE,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC;QAEvC,4CAA4C;QAC5C,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAE7C,6CAA6C;QAC7C,MAAM,SAAS,GAAG,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAE/C,2BAA2B;QAC3B,OAAO,IAAI,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;CACF"}
1
+ {"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/pair.ts"],"names":[],"mappings":"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"}