@bsv/sdk 1.1.22 → 1.1.24
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/cjs/package.json +1 -1
- package/dist/cjs/src/compat/BSM.js +10 -3
- package/dist/cjs/src/compat/BSM.js.map +1 -1
- package/dist/cjs/src/primitives/Curve.js +7 -7
- package/dist/cjs/src/primitives/Curve.js.map +1 -1
- package/dist/cjs/src/primitives/ECDSA.js +394 -71
- package/dist/cjs/src/primitives/ECDSA.js.map +1 -1
- package/dist/cjs/src/primitives/Point.js +103 -23
- package/dist/cjs/src/primitives/Point.js.map +1 -1
- package/dist/cjs/src/primitives/TransactionSignature.js +4 -3
- package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/cjs/src/primitives/utils.js +53 -16
- package/dist/cjs/src/primitives/utils.js.map +1 -1
- package/dist/cjs/src/script/Spend.js +6 -43
- package/dist/cjs/src/script/Spend.js.map +1 -1
- package/dist/cjs/src/script/templates/P2PKH.js +2 -2
- package/dist/cjs/src/script/templates/P2PKH.js.map +1 -1
- package/dist/cjs/src/script/templates/RPuzzle.js +2 -2
- package/dist/cjs/src/script/templates/RPuzzle.js.map +1 -1
- package/dist/cjs/src/transaction/Transaction.js +79 -65
- package/dist/cjs/src/transaction/Transaction.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/src/compat/BSM.js +10 -3
- package/dist/esm/src/compat/BSM.js.map +1 -1
- package/dist/esm/src/primitives/Curve.js +7 -7
- package/dist/esm/src/primitives/Curve.js.map +1 -1
- package/dist/esm/src/primitives/ECDSA.js +394 -71
- package/dist/esm/src/primitives/ECDSA.js.map +1 -1
- package/dist/esm/src/primitives/Point.js +103 -23
- package/dist/esm/src/primitives/Point.js.map +1 -1
- package/dist/esm/src/primitives/TransactionSignature.js +4 -3
- package/dist/esm/src/primitives/TransactionSignature.js.map +1 -1
- package/dist/esm/src/primitives/utils.js +51 -15
- package/dist/esm/src/primitives/utils.js.map +1 -1
- package/dist/esm/src/script/Spend.js +5 -42
- package/dist/esm/src/script/Spend.js.map +1 -1
- package/dist/esm/src/script/templates/P2PKH.js +2 -2
- package/dist/esm/src/script/templates/P2PKH.js.map +1 -1
- package/dist/esm/src/script/templates/RPuzzle.js +2 -2
- package/dist/esm/src/script/templates/RPuzzle.js.map +1 -1
- package/dist/esm/src/transaction/Transaction.js +79 -65
- package/dist/esm/src/transaction/Transaction.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/types/src/compat/BSM.d.ts +3 -2
- package/dist/types/src/compat/BSM.d.ts.map +1 -1
- package/dist/types/src/primitives/ECDSA.d.ts.map +1 -1
- package/dist/types/src/primitives/Point.d.ts +5 -0
- package/dist/types/src/primitives/Point.d.ts.map +1 -1
- package/dist/types/src/primitives/TransactionSignature.d.ts.map +1 -1
- package/dist/types/src/primitives/utils.d.ts +1 -0
- package/dist/types/src/primitives/utils.d.ts.map +1 -1
- package/dist/types/src/script/Spend.d.ts.map +1 -1
- package/dist/types/src/script/templates/P2PKH.d.ts +1 -1
- package/dist/types/src/script/templates/P2PKH.d.ts.map +1 -1
- package/dist/types/src/script/templates/RPuzzle.d.ts +1 -1
- package/dist/types/src/script/templates/RPuzzle.d.ts.map +1 -1
- package/dist/types/src/transaction/Transaction.d.ts.map +1 -1
- package/dist/types/src/transaction/TransactionInput.d.ts +1 -1
- package/dist/types/src/transaction/TransactionInput.d.ts.map +1 -1
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/docs/compat.md +10 -4
- package/docs/primitives.md +48 -12
- package/docs/script.md +4 -4
- package/docs/transaction.md +2 -1
- package/package.json +1 -1
- package/src/compat/BSM.ts +10 -3
- package/src/compat/__tests/BSM.test.ts +7 -2
- package/src/primitives/Curve.ts +7 -7
- package/src/primitives/ECDSA.ts +485 -75
- package/src/primitives/Point.ts +110 -25
- package/src/primitives/TransactionSignature.ts +4 -3
- package/src/primitives/utils.ts +58 -11
- package/src/script/Spend.ts +5 -48
- package/src/script/templates/P2PKH.ts +7 -7
- package/src/script/templates/RPuzzle.ts +8 -8
- package/src/transaction/Transaction.ts +93 -68
- package/src/transaction/TransactionInput.ts +1 -1
- package/src/transaction/__tests/Transaction.benchmarks.test.ts +222 -0
|
@@ -27,11 +27,10 @@ const DRBG_js_1 = __importDefault(require("./DRBG.js"));
|
|
|
27
27
|
* let msg = new BigNumber('1234567890abcdef', 16);
|
|
28
28
|
* let truncatedMsg = truncateToN(msg);
|
|
29
29
|
*/
|
|
30
|
-
function truncateToN(msg, truncOnly) {
|
|
31
|
-
const curve = new Curve_js_1.default();
|
|
30
|
+
function truncateToN(msg, truncOnly, curve = new Curve_js_1.default()) {
|
|
32
31
|
const delta = msg.byteLength() * 8 - curve.n.bitLength();
|
|
33
32
|
if (delta > 0) {
|
|
34
|
-
msg
|
|
33
|
+
msg.iushrn(delta);
|
|
35
34
|
}
|
|
36
35
|
if (!truncOnly && msg.cmp(curve.n) >= 0) {
|
|
37
36
|
return msg.sub(curve.n);
|
|
@@ -56,67 +55,250 @@ function truncateToN(msg, truncOnly) {
|
|
|
56
55
|
* const signature = sign(msg, key)
|
|
57
56
|
*/
|
|
58
57
|
const sign = (msg, key, forceLowS = false, customK) => {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
58
|
+
if (typeof BigInt === 'function') {
|
|
59
|
+
// Curve parameters for secp256k1
|
|
60
|
+
const zero = BigInt(0);
|
|
61
|
+
const one = BigInt(1);
|
|
62
|
+
const two = BigInt(2);
|
|
63
|
+
const n = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141'); // Order of the curve
|
|
64
|
+
const p = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F'); // Field prime
|
|
65
|
+
const Gx = BigInt('0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798');
|
|
66
|
+
const Gy = BigInt('0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8');
|
|
67
|
+
const G = { x: Gx, y: Gy };
|
|
68
|
+
// Convert msg and key to BigInt
|
|
69
|
+
const z = BigInt('0x' + msg.toString(16));
|
|
70
|
+
const d = BigInt('0x' + key.toString(16));
|
|
71
|
+
// Validate private key
|
|
72
|
+
if (d <= zero || d >= n) {
|
|
73
|
+
throw new Error('Invalid private key');
|
|
74
|
+
}
|
|
75
|
+
// Helper function to convert BigInt to byte array
|
|
76
|
+
function bigIntToBytes(value, length) {
|
|
77
|
+
const hex = value.toString(16).padStart(length * 2, '0');
|
|
78
|
+
const bytes = new Uint8Array(length);
|
|
79
|
+
for (let i = 0; i < length; i++) {
|
|
80
|
+
bytes[i] = parseInt(hex.substr(i * 2, 2), 16);
|
|
81
|
+
}
|
|
82
|
+
return bytes;
|
|
83
|
+
}
|
|
84
|
+
// Zero-extend key to provide enough entropy
|
|
85
|
+
const bytes = 32; // Assuming 256-bit curve
|
|
86
|
+
const bkey = bigIntToBytes(d, bytes); // 'd' is the private key BigInt
|
|
87
|
+
// Zero-extend nonce to have the same byte size as N
|
|
88
|
+
const nonce = bigIntToBytes(z, bytes); // 'z' is the message hash BigInt
|
|
89
|
+
// Instantiate Hmac_DRBG
|
|
90
|
+
const drbg = new DRBG_js_1.default(Array.from(bkey), Array.from(nonce));
|
|
91
|
+
// Number of bytes to generate
|
|
92
|
+
const ns1 = n - one;
|
|
93
|
+
let iter = 0;
|
|
94
|
+
// Truncate to N function for BigInt
|
|
95
|
+
function truncateToN(k, n, truncOnly = true) {
|
|
96
|
+
const kBitLength = k.toString(2).length;
|
|
97
|
+
const nBitLength = n.toString(2).length;
|
|
98
|
+
const delta = kBitLength - nBitLength;
|
|
99
|
+
if (delta > 0) {
|
|
100
|
+
k = k >> BigInt(delta);
|
|
101
|
+
}
|
|
102
|
+
if (!truncOnly && k >= n) {
|
|
103
|
+
return k - n;
|
|
81
104
|
}
|
|
82
105
|
else {
|
|
83
|
-
|
|
106
|
+
return k;
|
|
84
107
|
}
|
|
85
108
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
109
|
+
function generateK() {
|
|
110
|
+
if (typeof customK === 'function') {
|
|
111
|
+
// Call customK function to get k as BigNumber
|
|
112
|
+
const k_bn = customK(iter);
|
|
113
|
+
// Convert k_bn (BigNumber) to BigInt
|
|
114
|
+
const k_str = k_bn.toString(16);
|
|
115
|
+
return BigInt('0x' + k_str);
|
|
116
|
+
}
|
|
117
|
+
else if (BigNumber_js_1.default.isBN(customK)) {
|
|
118
|
+
// Use customK provided, convert to BigInt
|
|
119
|
+
const k_str = customK.toString(16);
|
|
120
|
+
return BigInt('0x' + k_str);
|
|
90
121
|
}
|
|
91
122
|
else {
|
|
92
|
-
|
|
123
|
+
// Use DRBG to generate k
|
|
124
|
+
const k_hex = drbg.generate(bytes); // Generate hex string
|
|
125
|
+
return BigInt('0x' + k_hex);
|
|
93
126
|
}
|
|
94
127
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
128
|
+
// Modular arithmetic functions
|
|
129
|
+
function mod(a, m) {
|
|
130
|
+
return ((a % m) + m) % m;
|
|
131
|
+
}
|
|
132
|
+
function modInv(a, m) {
|
|
133
|
+
let lm = one;
|
|
134
|
+
let hm = zero;
|
|
135
|
+
let low = mod(a, m);
|
|
136
|
+
let high = m;
|
|
137
|
+
while (low > one) {
|
|
138
|
+
const r = high / low;
|
|
139
|
+
const nm = hm - lm * r;
|
|
140
|
+
const neww = high - low * r;
|
|
141
|
+
hm = lm;
|
|
142
|
+
lm = nm;
|
|
143
|
+
high = low;
|
|
144
|
+
low = neww;
|
|
145
|
+
}
|
|
146
|
+
return mod(lm, m);
|
|
147
|
+
}
|
|
148
|
+
function pointAdd(P, Q) {
|
|
149
|
+
if (P === null)
|
|
150
|
+
return Q;
|
|
151
|
+
if (Q === null)
|
|
152
|
+
return P;
|
|
153
|
+
if (P.x === Q.x && P.y === mod(-Q.y, p)) {
|
|
154
|
+
return null; // Point at infinity
|
|
155
|
+
}
|
|
156
|
+
let m;
|
|
157
|
+
if (P.x === Q.x && P.y === Q.y) {
|
|
158
|
+
// Point doubling
|
|
159
|
+
if (P.y === zero) {
|
|
160
|
+
return null; // Point at infinity
|
|
161
|
+
}
|
|
162
|
+
const numerator = mod(BigInt(3) * P.x * P.x, p); // 3 * x^2
|
|
163
|
+
const denominator = modInv(two * P.y, p);
|
|
164
|
+
m = mod(numerator * denominator, p);
|
|
100
165
|
}
|
|
101
166
|
else {
|
|
102
|
-
|
|
167
|
+
const numerator = mod(Q.y - P.y, p);
|
|
168
|
+
const denominator = modInv(Q.x - P.x, p);
|
|
169
|
+
m = mod(numerator * denominator, p);
|
|
103
170
|
}
|
|
171
|
+
const xR = mod(m * m - P.x - Q.x, p);
|
|
172
|
+
const yR = mod(m * (P.x - xR) - P.y, p);
|
|
173
|
+
return { x: xR, y: yR };
|
|
104
174
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
175
|
+
function scalarMul(k, P) {
|
|
176
|
+
let N = P;
|
|
177
|
+
let Q = null; // Point at infinity
|
|
178
|
+
while (k > zero) {
|
|
179
|
+
if (k % two === one) {
|
|
180
|
+
Q = pointAdd(Q, N);
|
|
181
|
+
}
|
|
182
|
+
N = pointAdd(N, N);
|
|
183
|
+
k >>= one;
|
|
110
184
|
}
|
|
111
|
-
|
|
112
|
-
|
|
185
|
+
return Q;
|
|
186
|
+
}
|
|
187
|
+
while (true) {
|
|
188
|
+
let k = generateK();
|
|
189
|
+
iter += 1;
|
|
190
|
+
// Truncate k to n bits
|
|
191
|
+
k = truncateToN(k, n, true);
|
|
192
|
+
if (k <= one || k >= ns1) {
|
|
193
|
+
if (customK instanceof BigNumber_js_1.default) {
|
|
194
|
+
throw new Error('Invalid fixed custom K value (must be more than 1 and less than N-1)');
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const R = scalarMul(k, G);
|
|
201
|
+
if (R === null) {
|
|
202
|
+
if (customK instanceof BigNumber_js_1.default) {
|
|
203
|
+
throw new Error('Invalid fixed custom K value (must not create a point at infinity when multiplied by the generator point)');
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const r = mod(R.x, n);
|
|
210
|
+
if (r === zero) {
|
|
211
|
+
if (customK instanceof BigNumber_js_1.default) {
|
|
212
|
+
throw new Error('Invalid fixed custom K value (when multiplied by G, the resulting x coordinate mod N must not be zero)');
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const kInv = modInv(k, n);
|
|
219
|
+
const rd = mod(r * d, n);
|
|
220
|
+
let s = mod(kInv * (z + rd), n);
|
|
221
|
+
if (s === zero) {
|
|
222
|
+
if (customK instanceof BigNumber_js_1.default) {
|
|
223
|
+
throw new Error('Invalid fixed custom K value (when used with the key, it cannot create a zero value for S)');
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
113
228
|
}
|
|
229
|
+
// Use complement of `s` if it is > n / 2
|
|
230
|
+
if (forceLowS && s > n / two) {
|
|
231
|
+
s = n - s;
|
|
232
|
+
}
|
|
233
|
+
// Return signature as BigNumbers
|
|
234
|
+
const r_bn = new BigNumber_js_1.default(r.toString(16), 16);
|
|
235
|
+
const s_bn = new BigNumber_js_1.default(s.toString(16), 16);
|
|
236
|
+
return new Signature_js_1.default(r_bn, s_bn);
|
|
114
237
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
const curve = new Curve_js_1.default();
|
|
241
|
+
msg = truncateToN(msg);
|
|
242
|
+
// Zero-extend key to provide enough entropy
|
|
243
|
+
const bytes = curve.n.byteLength();
|
|
244
|
+
const bkey = key.toArray('be', bytes);
|
|
245
|
+
// Zero-extend nonce to have the same byte size as N
|
|
246
|
+
const nonce = msg.toArray('be', bytes);
|
|
247
|
+
// Instantiate Hmac_DRBG
|
|
248
|
+
const drbg = new DRBG_js_1.default(bkey, nonce);
|
|
249
|
+
// Number of bytes to generate
|
|
250
|
+
const ns1 = curve.n.subn(1);
|
|
251
|
+
for (let iter = 0;; iter++) {
|
|
252
|
+
// Compute the k-value
|
|
253
|
+
let k = typeof customK === 'function'
|
|
254
|
+
? customK(iter)
|
|
255
|
+
: BigNumber_js_1.default.isBN(customK)
|
|
256
|
+
? customK
|
|
257
|
+
: new BigNumber_js_1.default(drbg.generate(bytes), 16);
|
|
258
|
+
k = truncateToN(k, true);
|
|
259
|
+
if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0) {
|
|
260
|
+
if (BigNumber_js_1.default.isBN(customK)) {
|
|
261
|
+
throw new Error('Invalid fixed custom K value (must be more than 1 and less than N-1)');
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
const kp = curve.g.mul(k);
|
|
268
|
+
if (kp.isInfinity()) {
|
|
269
|
+
if (BigNumber_js_1.default.isBN(customK)) {
|
|
270
|
+
throw new Error('Invalid fixed custom K value (must not create a point at infinity when multiplied by the generator point)');
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const kpX = kp.getX();
|
|
277
|
+
const r = kpX.umod(curve.n);
|
|
278
|
+
if (r.cmpn(0) === 0) {
|
|
279
|
+
if (BigNumber_js_1.default.isBN(customK)) {
|
|
280
|
+
throw new Error('Invalid fixed custom K value (when multiplied by G, the resulting x coordinate mod N must not be zero)');
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
let s = k.invm(curve.n).mul(r.mul(key).iadd(msg));
|
|
287
|
+
s = s.umod(curve.n);
|
|
288
|
+
if (s.cmpn(0) === 0) {
|
|
289
|
+
if (BigNumber_js_1.default.isBN(customK)) {
|
|
290
|
+
throw new Error('Invalid fixed custom K value (when used with the key, it cannot create a zero value for S)');
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Use complement of `s`, if it is > `n / 2`
|
|
297
|
+
if (forceLowS && s.cmp(curve.n.ushrn(1)) > 0) {
|
|
298
|
+
s = curve.n.sub(s);
|
|
299
|
+
}
|
|
300
|
+
return new Signature_js_1.default(r, s);
|
|
118
301
|
}
|
|
119
|
-
return new Signature_js_1.default(r, s);
|
|
120
302
|
}
|
|
121
303
|
};
|
|
122
304
|
exports.sign = sign;
|
|
@@ -139,31 +321,172 @@ exports.sign = sign;
|
|
|
139
321
|
* const isVerified = verify(msg, sig, key)
|
|
140
322
|
*/
|
|
141
323
|
const verify = (msg, sig, key) => {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
324
|
+
// Use BigInt for verification opportunistically
|
|
325
|
+
if (typeof BigInt === 'function') {
|
|
326
|
+
// Curve parameters for secp256k1
|
|
327
|
+
const zero = BigInt(0);
|
|
328
|
+
const one = BigInt(1);
|
|
329
|
+
const two = BigInt(2);
|
|
330
|
+
const three = BigInt(3);
|
|
331
|
+
const p = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F'); // Field prime
|
|
332
|
+
const n = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141'); // Order of the curve
|
|
333
|
+
const G = {
|
|
334
|
+
x: BigInt('0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798'),
|
|
335
|
+
y: BigInt('0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8')
|
|
336
|
+
};
|
|
337
|
+
// Modular arithmetic functions
|
|
338
|
+
const mod = (a, m) => ((a % m) + m) % m;
|
|
339
|
+
const modInv = (a, m) => {
|
|
340
|
+
// Extended Euclidean Algorithm for modular inverse
|
|
341
|
+
let [old_r, r] = [a, m];
|
|
342
|
+
let [old_s, s] = [BigInt(1), BigInt(0)];
|
|
343
|
+
while (r !== zero) {
|
|
344
|
+
const q = old_r / r;
|
|
345
|
+
[old_r, r] = [r, old_r - q * r];
|
|
346
|
+
[old_s, s] = [s, old_s - q * s];
|
|
347
|
+
}
|
|
348
|
+
if (old_r > one)
|
|
349
|
+
return zero; // No inverse
|
|
350
|
+
return mod(old_s, m);
|
|
351
|
+
};
|
|
352
|
+
const modMul = (a, b, m) => mod(a * b, m);
|
|
353
|
+
const modSub = (a, b, m) => mod(a - b, m);
|
|
354
|
+
const modAdd = (a, b, m) => mod(a + b, m);
|
|
355
|
+
// Define constants
|
|
356
|
+
const four = BigInt(4);
|
|
357
|
+
const eight = BigInt(8);
|
|
358
|
+
// Point Doubling
|
|
359
|
+
const pointDouble = (P) => {
|
|
360
|
+
const { X: X1, Y: Y1, Z: Z1 } = P;
|
|
361
|
+
if (Y1 === zero) {
|
|
362
|
+
return { X: zero, Y: one, Z: zero }; // Point at infinity
|
|
363
|
+
}
|
|
364
|
+
const Y1_sq = modMul(Y1, Y1, p); // Y1^2
|
|
365
|
+
const S = modMul(four, modMul(X1, Y1_sq, p), p); // S = 4 * X1 * Y1^2
|
|
366
|
+
const M = modMul(three, modMul(X1, X1, p), p); // M = 3 * X1^2
|
|
367
|
+
const X3 = modSub(modMul(M, M, p), modMul(two, S, p), p); // X3 = M^2 - 2 * S
|
|
368
|
+
const Y3 = modSub(modMul(M, modSub(S, X3, p), p), modMul(eight, modMul(Y1_sq, Y1_sq, p), p), p); // Y3 = M * (S - X3) - 8 * Y1^4
|
|
369
|
+
const Z3 = modMul(two, modMul(Y1, Z1, p), p); // Z3 = 2 * Y1 * Z1
|
|
370
|
+
return { X: X3, Y: Y3, Z: Z3 };
|
|
371
|
+
};
|
|
372
|
+
// Point Addition
|
|
373
|
+
const pointAdd = (P, Q) => {
|
|
374
|
+
if (P.Z === zero)
|
|
375
|
+
return Q;
|
|
376
|
+
if (Q.Z === zero)
|
|
377
|
+
return P;
|
|
378
|
+
const Z1Z1 = modMul(P.Z, P.Z, p);
|
|
379
|
+
const Z2Z2 = modMul(Q.Z, Q.Z, p);
|
|
380
|
+
const U1 = modMul(P.X, Z2Z2, p);
|
|
381
|
+
const U2 = modMul(Q.X, Z1Z1, p);
|
|
382
|
+
const S1 = modMul(P.Y, modMul(Z2Z2, Q.Z, p), p);
|
|
383
|
+
const S2 = modMul(Q.Y, modMul(Z1Z1, P.Z, p), p);
|
|
384
|
+
const H = modSub(U2, U1, p);
|
|
385
|
+
const r = modSub(S2, S1, p);
|
|
386
|
+
if (H === zero) {
|
|
387
|
+
if (r === zero) {
|
|
388
|
+
// P == Q
|
|
389
|
+
return pointDouble(P);
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
// Point at infinity
|
|
393
|
+
return { X: zero, Y: one, Z: zero };
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
const HH = modMul(H, H, p);
|
|
397
|
+
const HHH = modMul(H, HH, p);
|
|
398
|
+
const V = modMul(U1, HH, p);
|
|
399
|
+
const X3 = modSub(modSub(modMul(r, r, p), HHH, p), modMul(two, V, p), p);
|
|
400
|
+
const Y3 = modSub(modMul(r, modSub(V, X3, p), p), modMul(S1, HHH, p), p);
|
|
401
|
+
const Z3 = modMul(H, modMul(P.Z, Q.Z, p), p);
|
|
402
|
+
return { X: X3, Y: Y3, Z: Z3 };
|
|
403
|
+
};
|
|
404
|
+
// Scalar Multiplication
|
|
405
|
+
const scalarMultiply = (k, P) => {
|
|
406
|
+
const N = { X: P.x, Y: P.y, Z: one };
|
|
407
|
+
let Q = { X: zero, Y: one, Z: zero }; // Point at infinity
|
|
408
|
+
const kBin = k.toString(2);
|
|
409
|
+
for (let i = 0; i < kBin.length; i++) {
|
|
410
|
+
Q = pointDouble(Q);
|
|
411
|
+
if (kBin[i] === '1') {
|
|
412
|
+
Q = pointAdd(Q, N);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return Q;
|
|
416
|
+
};
|
|
417
|
+
// Verify Function Using Jacobian Coordinates
|
|
418
|
+
const verifyECDSA = (hash, publicKey, signature) => {
|
|
419
|
+
const { r, s } = signature;
|
|
420
|
+
const z = hash;
|
|
421
|
+
// Check r and s are in [1, n - 1]
|
|
422
|
+
if (r <= zero || r >= n || s <= zero || s >= n) {
|
|
423
|
+
return false;
|
|
424
|
+
}
|
|
425
|
+
const w = modInv(s, n); // w = s^-1 mod n
|
|
426
|
+
if (w === zero) {
|
|
427
|
+
return false; // No inverse exists
|
|
428
|
+
}
|
|
429
|
+
const u1 = modMul(z, w, n);
|
|
430
|
+
const u2 = modMul(r, w, n);
|
|
431
|
+
// Compute point R = u1 * G + u2 * Q
|
|
432
|
+
const RG = scalarMultiply(u1, G);
|
|
433
|
+
const RQ = scalarMultiply(u2, publicKey);
|
|
434
|
+
const R = pointAdd(RG, RQ);
|
|
435
|
+
if (R.Z === zero) {
|
|
436
|
+
// Point at infinity
|
|
437
|
+
return false;
|
|
438
|
+
}
|
|
439
|
+
// Compute affine x-coordinate x1 = X / Z^2 mod p
|
|
440
|
+
const ZInv = modInv(R.Z, p);
|
|
441
|
+
if (ZInv === zero) {
|
|
442
|
+
return false; // No inverse exists
|
|
443
|
+
}
|
|
444
|
+
const ZInv2 = modMul(ZInv, ZInv, p);
|
|
445
|
+
const x1_affine = modMul(R.X, ZInv2, p);
|
|
446
|
+
// Compute v = x1_affine mod n
|
|
447
|
+
const v = mod(x1_affine, n);
|
|
448
|
+
// Signature is valid if v == r mod n
|
|
449
|
+
return v === r;
|
|
450
|
+
};
|
|
451
|
+
// Convert inputs to BigInt
|
|
452
|
+
const hash = BigInt('0x' + msg.toString(16));
|
|
453
|
+
const publicKey = {
|
|
454
|
+
x: BigInt('0x' + key.x.toString(16)),
|
|
455
|
+
y: BigInt('0x' + key.y.toString(16))
|
|
456
|
+
};
|
|
457
|
+
const signature = {
|
|
458
|
+
r: BigInt('0x' + sig.r.toString(16)),
|
|
459
|
+
s: BigInt('0x' + sig.s.toString(16))
|
|
460
|
+
};
|
|
461
|
+
return verifyECDSA(hash, publicKey, signature);
|
|
152
462
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
463
|
+
else {
|
|
464
|
+
const curve = new Curve_js_1.default();
|
|
465
|
+
msg = truncateToN(msg);
|
|
466
|
+
// Perform primitive values validation
|
|
467
|
+
const r = sig.r;
|
|
468
|
+
const s = sig.s;
|
|
469
|
+
if (r.cmpn(1) < 0 || r.cmp(curve.n) >= 0) {
|
|
470
|
+
return false;
|
|
471
|
+
}
|
|
472
|
+
if (s.cmpn(1) < 0 || s.cmp(curve.n) >= 0) {
|
|
473
|
+
return false;
|
|
474
|
+
}
|
|
475
|
+
// Validate signature
|
|
476
|
+
const sinv = s.invm(curve.n);
|
|
477
|
+
const u1 = sinv.mul(msg).umod(curve.n);
|
|
478
|
+
const u2 = sinv.mul(r).umod(curve.n);
|
|
479
|
+
// NOTE: Greg Maxwell's trick, inspired by:
|
|
480
|
+
// https://git.io/vad3K
|
|
481
|
+
const p = curve.g.jmulAdd(u1, key, u2);
|
|
482
|
+
if (p.isInfinity()) {
|
|
483
|
+
return false;
|
|
484
|
+
}
|
|
485
|
+
// Compare `p.x` of Jacobian point with `r`,
|
|
486
|
+
// this will do `p.x == r * p.z^2` instead of multiplying `p.x` by the
|
|
487
|
+
// inverse of `p.z^2`
|
|
488
|
+
return p.eqXToP(r);
|
|
162
489
|
}
|
|
163
|
-
// Compare `p.x` of Jacobian point with `r`,
|
|
164
|
-
// this will do `p.x == r * p.z^2` instead of multiplying `p.x` by the
|
|
165
|
-
// inverse of `p.z^2`
|
|
166
|
-
return p.eqXToP(r);
|
|
167
490
|
};
|
|
168
491
|
exports.verify = verify;
|
|
169
492
|
//# sourceMappingURL=ECDSA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ECDSA.js","sourceRoot":"","sources":["../../../../src/primitives/ECDSA.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ECDSA.js","sourceRoot":"","sources":["../../../../src/primitives/ECDSA.ts"],"names":[],"mappings":";;;;;;AAAA,kEAAsC;AACtC,kEAAsC;AACtC,0DAA8B;AAE9B,wDAA4B;AAE5B;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,WAAW,CAAE,GAAc,EAAE,SAAmB,EAAE,KAAK,GAAG,IAAI,kBAAK,EAAE;IAC5E,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;IACxD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAAC,CAAC;IACpC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACI,MAAM,IAAI,GAAG,CAAC,GAAc,EAAE,GAAc,EAAE,YAAqB,KAAK,EAAE,OAA8B,EAAa,EAAE;IAC5H,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,iCAAiC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACtB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,CAAC,GAAG,MAAM,CACd,oEAAoE,CACrE,CAAA,CAAC,qBAAqB;QACvB,MAAM,CAAC,GAAG,MAAM,CACd,oEAAoE,CACrE,CAAA,CAAC,cAAc;QAChB,MAAM,EAAE,GAAG,MAAM,CACf,oEAAoE,CACrE,CAAA;QACD,MAAM,EAAE,GAAG,MAAM,CACf,oEAAoE,CACrE,CAAA;QACD,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;QAE1B,gCAAgC;QAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;QACzC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;QAEzC,uBAAuB;QACvB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACxC,CAAC;QAED,kDAAkD;QAClD,SAAS,aAAa,CAAE,KAAa,EAAE,MAAc;YACnD,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;YACxD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YAC/C,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;QAED,4CAA4C;QAC5C,MAAM,KAAK,GAAG,EAAE,CAAA,CAAC,yBAAyB;QAC1C,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA,CAAC,gCAAgC;QAErE,oDAAoD;QACpD,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA,CAAC,iCAAiC;QAEvE,wBAAwB;QACxB,MAAM,IAAI,GAAG,IAAI,iBAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAE1D,8BAA8B;QAC9B,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA;QAEnB,IAAI,IAAI,GAAG,CAAC,CAAA;QAEZ,oCAAoC;QACpC,SAAS,WAAW,CAAE,CAAS,EAAE,CAAS,EAAE,YAAqB,IAAI;YACnE,MAAM,UAAU,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;YACvC,MAAM,UAAU,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;YACvC,MAAM,KAAK,GAAG,UAAU,GAAG,UAAU,CAAA;YACrC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAA;YACxB,CAAC;YACD,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,CAAA;YACd,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,CAAA;YACV,CAAC;QACH,CAAC;QAED,SAAS,SAAS;YAChB,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;gBAClC,8CAA8C;gBAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;gBAC1B,qCAAqC;gBACrC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;gBAC/B,OAAO,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,CAAA;YAC7B,CAAC;iBAAM,IAAI,sBAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,0CAA0C;gBAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;gBAClC,OAAO,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,CAAA;YAC7B,CAAC;iBAAM,CAAC;gBACN,yBAAyB;gBACzB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA,CAAC,sBAAsB;gBACzD,OAAO,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,SAAS,GAAG,CAAE,CAAS,EAAE,CAAS;YAChC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;QAED,SAAS,MAAM,CAAE,CAAS,EAAE,CAAS;YACnC,IAAI,EAAE,GAAG,GAAG,CAAA;YACZ,IAAI,EAAE,GAAG,IAAI,CAAA;YACb,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACnB,IAAI,IAAI,GAAG,CAAC,CAAA;YACZ,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;gBACjB,MAAM,CAAC,GAAG,IAAI,GAAG,GAAG,CAAA;gBACpB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;gBACtB,MAAM,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,CAAA;gBAC3B,EAAE,GAAG,EAAE,CAAA;gBACP,EAAE,GAAG,EAAE,CAAA;gBACP,IAAI,GAAG,GAAG,CAAA;gBACV,GAAG,GAAG,IAAI,CAAA;YACZ,CAAC;YACD,OAAO,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QACnB,CAAC;QAED,SAAS,QAAQ,CACf,CAAkC,EAClC,CAAkC;YAElC,IAAI,CAAC,KAAK,IAAI;gBAAE,OAAO,CAAC,CAAA;YACxB,IAAI,CAAC,KAAK,IAAI;gBAAE,OAAO,CAAC,CAAA;YAExB,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAA,CAAC,oBAAoB;YAClC,CAAC;YAED,IAAI,CAAS,CAAA;YACb,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/B,iBAAiB;gBACjB,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;oBACjB,OAAO,IAAI,CAAA,CAAC,oBAAoB;gBAClC,CAAC;gBACD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAC,UAAU;gBAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBACxC,CAAC,GAAG,GAAG,CAAC,SAAS,GAAG,WAAW,EAAE,CAAC,CAAC,CAAA;YACrC,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBACnC,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBACxC,CAAC,GAAG,GAAG,CAAC,SAAS,GAAG,WAAW,EAAE,CAAC,CAAC,CAAA;YACrC,CAAC;YAED,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACpC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAEvC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;QACzB,CAAC;QAED,SAAS,SAAS,CAChB,CAAS,EACT,CAA2B;YAE3B,IAAI,CAAC,GAAG,CAAC,CAAA;YACT,IAAI,CAAC,GAAG,IAAI,CAAA,CAAC,oBAAoB;YAEjC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;gBAChB,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,EAAE,CAAC;oBACpB,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBACpB,CAAC;gBACD,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAClB,CAAC,KAAK,GAAG,CAAA;YACX,CAAC;YACD,OAAO,CAAC,CAAA;QACV,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,GAAG,SAAS,EAAE,CAAA;YACnB,IAAI,IAAI,CAAC,CAAA;YAET,uBAAuB;YACvB,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;YAE3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;gBACzB,IAAI,OAAO,YAAY,sBAAS,EAAE,CAAC;oBACjC,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,SAAQ;gBACV,CAAC;YACH,CAAC;YAED,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACzB,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACf,IAAI,OAAO,YAAY,sBAAS,EAAE,CAAC;oBACjC,MAAM,IAAI,KAAK,CACb,2GAA2G,CAC5G,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,SAAQ;gBACV,CAAC;YACH,CAAC;YAED,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACrB,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACf,IAAI,OAAO,YAAY,sBAAS,EAAE,CAAC;oBACjC,MAAM,IAAI,KAAK,CACb,wGAAwG,CACzG,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,SAAQ;gBACV,CAAC;YACH,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACzB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;YACxB,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAC/B,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACf,IAAI,OAAO,YAAY,sBAAS,EAAE,CAAC;oBACjC,MAAM,IAAI,KAAK,CACb,4FAA4F,CAC7F,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,SAAQ;gBACV,CAAC;YACH,CAAC;YAED,yCAAyC;YACzC,IAAI,SAAS,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;gBAC7B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACX,CAAC;YAED,iCAAiC;YACjC,MAAM,IAAI,GAAG,IAAI,sBAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YAC9C,MAAM,IAAI,GAAG,IAAI,sBAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YAC9C,OAAO,IAAI,sBAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,IAAI,kBAAK,EAAE,CAAA;QACzB,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;QAEtB,4CAA4C;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QAClC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAErC,oDAAoD;QACpD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAEtC,wBAAwB;QACxB,MAAM,IAAI,GAAG,IAAI,iBAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAElC,8BAA8B;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAE3B,KAAK,IAAI,IAAI,GAAG,CAAC,GAAI,IAAI,EAAE,EAAE,CAAC;YAC5B,sBAAsB;YACtB,IAAI,CAAC,GAAG,OAAO,OAAO,KAAK,UAAU;gBACnC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;gBACf,CAAC,CAAC,sBAAS,CAAC,IAAI,CAAC,OAAO,CAAC;oBACvB,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,IAAI,sBAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;YAC7C,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YACxB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,IAAI,sBAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5B,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAA;gBACzF,CAAC;qBAAM,CAAC;oBACN,SAAQ;gBACV,CAAC;YACH,CAAC;YAED,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACzB,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC;gBACpB,IAAI,sBAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5B,MAAM,IAAI,KAAK,CAAC,2GAA2G,CAAC,CAAA;gBAC9H,CAAC;qBAAM,CAAC;oBACN,SAAQ;gBACV,CAAC;YACH,CAAC;YAED,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,CAAA;YACrB,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAC3B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpB,IAAI,sBAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5B,MAAM,IAAI,KAAK,CAAC,wGAAwG,CAAC,CAAA;gBAC3H,CAAC;qBAAM,CAAC;oBACN,SAAQ;gBACV,CAAC;YACH,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;YACjD,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACnB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpB,IAAI,sBAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5B,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAA;gBAC/G,CAAC;qBAAM,CAAC;oBACN,SAAQ;gBACV,CAAC;YACH,CAAC;YAED,4CAA4C;YAC5C,IAAI,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7C,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACpB,CAAC;YACD,OAAO,IAAI,sBAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAjSY,QAAA,IAAI,QAiShB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACI,MAAM,MAAM,GAAG,CAAC,GAAc,EAAE,GAAc,EAAE,GAAU,EAAW,EAAE;IAC5E,gDAAgD;IAChD,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,iCAAiC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACtB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACvB,MAAM,CAAC,GAAG,MAAM,CACd,oEAAoE,CACrE,CAAA,CAAC,cAAc;QAChB,MAAM,CAAC,GAAG,MAAM,CACd,oEAAoE,CACrE,CAAA,CAAC,qBAAqB;QACvB,MAAM,CAAC,GAAG;YACR,CAAC,EAAE,MAAM,CACP,oEAAoE,CACrE;YACD,CAAC,EAAE,MAAM,CACP,oEAAoE,CACrE;SACF,CAAA;QAED,+BAA+B;QAC/B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QAC/D,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE;YAC9C,mDAAmD;YACnD,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACvB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;YACvC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;gBAClB,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;gBACpB,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;YACjC,CAAC;YACD,IAAI,KAAK,GAAG,GAAG;gBAAE,OAAO,IAAI,CAAA,CAAC,aAAa;YAC1C,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QACtB,CAAC,CAAA;QACD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAU,EAAE,CACzD,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QACf,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAU,EAAE,CACzD,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QACf,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAU,EAAE,CACzD,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QAEf,mBAAmB;QACnB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACtB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QASvB,iBAAiB;QACjB,MAAM,WAAW,GAAG,CAAC,CAAgB,EAAiB,EAAE;YACtD,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;YAEjC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAChB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAA,CAAC,oBAAoB;YAC1D,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA,CAAC,OAAO;YACvC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAC,oBAAoB;YACpE,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAC,eAAe;YAC7D,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAC,mBAAmB;YAC5E,MAAM,EAAE,GAAG,MAAM,CACf,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9B,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EACzC,CAAC,CACF,CAAA,CAAC,+BAA+B;YACjC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAC,mBAAmB;YAEhE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;QAChC,CAAC,CAAA;QAED,iBAAiB;QACjB,MAAM,QAAQ,GAAG,CAAC,CAAgB,EAAE,CAAgB,EAAiB,EAAE;YACrE,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,OAAO,CAAC,CAAA;YAC1B,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,OAAO,CAAC,CAAA;YAE1B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAChC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAChC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAE/C,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;YAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;YAE3B,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;oBACf,SAAS;oBACT,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;gBACvB,CAAC;qBAAM,CAAC;oBACN,oBAAoB;oBACpB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAA;gBACrC,CAAC;YACH,CAAC;YAED,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;YAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;YAE3B,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACxE,MAAM,EAAE,GAAG,MAAM,CACf,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9B,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAClB,CAAC,CACF,CAAA;YACD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAE5C,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;QAChC,CAAC,CAAA;QAED,wBAAwB;QACxB,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,CAA2B,EAAiB,EAAE;YAC/E,MAAM,CAAC,GAAkB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAA;YACnD,IAAI,CAAC,GAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAA,CAAC,oBAAoB;YAExE,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;gBAClB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACpB,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBACpB,CAAC;YACH,CAAC;YACD,OAAO,CAAC,CAAA;QACV,CAAC,CAAA;QAED,6CAA6C;QAC7C,MAAM,WAAW,GAAG,CAClB,IAAY,EACZ,SAAmC,EACnC,SAAmC,EAC1B,EAAE;YACX,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,SAAS,CAAA;YAC1B,MAAM,CAAC,GAAG,IAAI,CAAA;YAEd,kCAAkC;YAClC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C,OAAO,KAAK,CAAA;YACd,CAAC;YAED,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAC,iBAAiB;YACxC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACf,OAAO,KAAK,CAAA,CAAC,oBAAoB;YACnC,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAE1B,oCAAoC;YACpC,MAAM,EAAE,GAAG,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;YAChC,MAAM,EAAE,GAAG,cAAc,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA;YACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;YAE1B,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACjB,oBAAoB;gBACpB,OAAO,KAAK,CAAA;YACd,CAAC;YAED,iDAAiD;YACjD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAC3B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,OAAO,KAAK,CAAA,CAAC,oBAAoB;YACnC,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YACnC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;YAEvC,8BAA8B;YAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;YAE3B,qCAAqC;YACrC,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC,CAAA;QAED,2BAA2B;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;QAC5C,MAAM,SAAS,GAAG;YAChB,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACpC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SACrC,CAAA;QACD,MAAM,SAAS,GAAG;YAChB,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACpC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SACrC,CAAA;QAED,OAAO,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;IAChD,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,IAAI,kBAAK,EAAE,CAAA;QACzB,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;QACtB,sCAAsC;QACtC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;QACf,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;QACf,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,OAAO,KAAK,CAAA;QAAC,CAAC;QAC1D,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,OAAO,KAAK,CAAA;QAAC,CAAC;QAE1D,qBAAqB;QACrB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAEpC,2CAA2C;QAC3C,uBAAuB;QACvB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QACtC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC;YAAC,OAAO,KAAK,CAAA;QAAC,CAAC;QAEpC,4CAA4C;QAC5C,sEAAsE;QACtE,qBAAqB;QACrB,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;AACH,CAAC,CAAA;AAtNY,QAAA,MAAM,UAsNlB"}
|