@ledgerhq/hw-app-exchange 0.16.0 → 0.17.0-nightly.0

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.
Files changed (42) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/package.json +6 -6
  3. package/lib/Exchange.integ.test.d.ts +0 -2
  4. package/lib/Exchange.integ.test.d.ts.map +0 -1
  5. package/lib/Exchange.integ.test.js +0 -458
  6. package/lib/Exchange.integ.test.js.map +0 -1
  7. package/lib/Exchange.test.d.ts +0 -2
  8. package/lib/Exchange.test.d.ts.map +0 -1
  9. package/lib/Exchange.test.js +0 -341
  10. package/lib/Exchange.test.js.map +0 -1
  11. package/lib/ReturnCode.test.d.ts +0 -2
  12. package/lib/ReturnCode.test.d.ts.map +0 -1
  13. package/lib/ReturnCode.test.js +0 -21
  14. package/lib/ReturnCode.test.js.map +0 -1
  15. package/lib/SellUtils.test.d.ts +0 -2
  16. package/lib/SellUtils.test.d.ts.map +0 -1
  17. package/lib/SellUtils.test.js +0 -32
  18. package/lib/SellUtils.test.js.map +0 -1
  19. package/lib/SwapUtils.test.d.ts +0 -2
  20. package/lib/SwapUtils.test.d.ts.map +0 -1
  21. package/lib/SwapUtils.test.js +0 -34
  22. package/lib/SwapUtils.test.js.map +0 -1
  23. package/lib-es/Exchange.integ.test.d.ts +0 -2
  24. package/lib-es/Exchange.integ.test.d.ts.map +0 -1
  25. package/lib-es/Exchange.integ.test.js +0 -453
  26. package/lib-es/Exchange.integ.test.js.map +0 -1
  27. package/lib-es/Exchange.test.d.ts +0 -2
  28. package/lib-es/Exchange.test.d.ts.map +0 -1
  29. package/lib-es/Exchange.test.js +0 -313
  30. package/lib-es/Exchange.test.js.map +0 -1
  31. package/lib-es/ReturnCode.test.d.ts +0 -2
  32. package/lib-es/ReturnCode.test.d.ts.map +0 -1
  33. package/lib-es/ReturnCode.test.js +0 -19
  34. package/lib-es/ReturnCode.test.js.map +0 -1
  35. package/lib-es/SellUtils.test.d.ts +0 -2
  36. package/lib-es/SellUtils.test.d.ts.map +0 -1
  37. package/lib-es/SellUtils.test.js +0 -30
  38. package/lib-es/SellUtils.test.js.map +0 -1
  39. package/lib-es/SwapUtils.test.d.ts +0 -2
  40. package/lib-es/SwapUtils.test.d.ts.map +0 -1
  41. package/lib-es/SwapUtils.test.js +0 -32
  42. package/lib-es/SwapUtils.test.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @ledgerhq/hw-app-exchange
2
2
 
3
+ ## 0.17.0-nightly.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#12452](https://github.com/LedgerHQ/ledger-live/pull/12452) [`b386019`](https://github.com/LedgerHQ/ledger-live/commit/b3860190aedc7691250e0abacf07ee7dd2962c91) Thanks [@jiyuzhuang](https://github.com/jiyuzhuang)! - Update DMK, Signers and Transports versions
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies []:
12
+ - @ledgerhq/hw-transport@6.31.13-nightly.1
13
+
3
14
  ## 0.16.0
4
15
 
5
16
  ### Minor Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/hw-app-exchange",
3
- "version": "0.16.0",
3
+ "version": "0.17.0-nightly.0",
4
4
  "description": "Ledger Hardware Wallet Cosmos Application API",
5
5
  "keywords": [
6
6
  "Ledger",
@@ -25,13 +25,13 @@
25
25
  "types": "lib/index.d.ts",
26
26
  "license": "Apache-2.0",
27
27
  "dependencies": {
28
- "@ledgerhq/device-management-kit": "0.9.1",
28
+ "@ledgerhq/device-management-kit": "0.9.2",
29
29
  "bignumber.js": "^9.1.2",
30
30
  "invariant": "^2.2.2",
31
31
  "protobufjs": "7.2.5",
32
32
  "protobufjs-cli": "1.1.2",
33
- "@ledgerhq/errors": "^6.26.0",
34
- "@ledgerhq/hw-transport": "6.31.12"
33
+ "@ledgerhq/errors": "^6.27.0-nightly.0",
34
+ "@ledgerhq/hw-transport": "6.31.13-nightly.1"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@noble/curves": "1.9.7",
@@ -42,8 +42,8 @@
42
42
  "jest": "^29.7.0",
43
43
  "ts-jest": "^29.1.1",
44
44
  "ts-node": "^10.4.0",
45
- "@ledgerhq/hw-transport-mocker": "^6.29.12",
46
- "@ledgerhq/hw-transport-node-speculos-http": "^6.30.2"
45
+ "@ledgerhq/hw-transport-mocker": "^6.29.13-nightly.1",
46
+ "@ledgerhq/hw-transport-node-speculos-http": "^6.31.0-nightly.2"
47
47
  },
48
48
  "scripts": {
49
49
  "clean": "rimraf lib lib-es",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=Exchange.integ.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Exchange.integ.test.d.ts","sourceRoot":"","sources":["../src/Exchange.integ.test.ts"],"names":[],"mappings":""}
@@ -1,458 +0,0 @@
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
- const bip32_path_1 = __importDefault(require("bip32-path"));
7
- const hw_transport_node_speculos_http_1 = __importDefault(require("@ledgerhq/hw-transport-node-speculos-http"));
8
- const Exchange_1 = __importDefault(require("./Exchange"));
9
- const crypto_1 = require("crypto");
10
- const secp256k1_1 = require("@noble/curves/secp256k1");
11
- const protobufjs_1 = __importDefault(require("protobufjs"));
12
- const bignumber_js_1 = __importDefault(require("bignumber.js"));
13
- describe("Check Exchange until payload signature", () => {
14
- let transport;
15
- beforeAll(async () => {
16
- transport = await hw_transport_node_speculos_http_1.default.open({});
17
- });
18
- afterAll(async () => {
19
- transport.close();
20
- });
21
- describe("Check SWAP", () => {
22
- it("Legacy SWAP", async () => {
23
- // Given
24
- const exchange = new Exchange_1.default(transport, 0 /* ExchangeTypes.Swap */);
25
- // When
26
- const transactionId = await exchange.startNewTransaction();
27
- // Then
28
- expect(transactionId).toEqual(expect.any(String));
29
- expect(transactionId).toHaveLength(10);
30
- const { partnerInfo, partnerSigned, partnerPrivKey } = await appExchangeDatasetTest(legacySignFormat);
31
- await exchange.setPartnerKey(partnerInfo);
32
- await exchange.checkPartner(partnerSigned);
33
- const amount = new bignumber_js_1.default(100000);
34
- const amountToWallet = new bignumber_js_1.default(1000);
35
- const encodedPayload = await generateSwapPayloadProtobuf({
36
- payinAddress: "0xd692Cb1346262F584D17B4B470954501f6715a82",
37
- refundAddress: "0xDad77910DbDFdE764fC21FCD4E74D71bBACA6D8D",
38
- payoutAddress: "bc1qer57ma0fzhqys2cmydhuj9cprf9eg0nw922a8j",
39
- currencyFrom: "ETH",
40
- currencyTo: "BTC",
41
- amountToProvider: Buffer.from(amount.toString(16), "hex"),
42
- amountToWallet: Buffer.from(amountToWallet.toString(16), "hex"),
43
- deviceTransactionId: transactionId,
44
- });
45
- const estimatedFees = new bignumber_js_1.default(0);
46
- await exchange.processTransaction(encodedPayload, estimatedFees);
47
- const payloadSignature = await signMessage(encodedPayload, partnerPrivKey, "der");
48
- await exchange.checkTransactionSignature(payloadSignature);
49
- });
50
- it("NG SWAP", async () => {
51
- // Given
52
- const exchange = new Exchange_1.default(transport, 3 /* ExchangeTypes.SwapNg */);
53
- // When
54
- const transactionId = await exchange.startNewTransaction();
55
- // Then
56
- expect(transactionId).toEqual(expect.any(String));
57
- expect(transactionId).toHaveLength(64);
58
- const { partnerInfo, partnerSigned, partnerPrivKey } = await appExchangeDatasetTest(ngSignFormat);
59
- await exchange.setPartnerKey(partnerInfo);
60
- await exchange.checkPartner(partnerSigned);
61
- const amount = new bignumber_js_1.default(100_000);
62
- const amountToWallet = new bignumber_js_1.default(100_000_000_000);
63
- let encodedPayload = await generateSwapPayloadProtobuf({
64
- payinAddress: "0xd692Cb1346262F584D17B4B470954501f6715a82",
65
- refundAddress: "0xDad77910DbDFdE764fC21FCD4E74D71bBACA6D8D",
66
- payoutAddress: "bc1qer57ma0fzhqys2cmydhuj9cprf9eg0nw922a8j",
67
- currencyFrom: "ETH",
68
- currencyTo: "BTC",
69
- amountToProvider: Buffer.from(amount.toString(16), "hex"),
70
- amountToWallet: Buffer.from(amountToWallet.toString(16), "hex"),
71
- deviceTransactionIdNg: Buffer.from(transactionId.padStart(32, "0"), "hex"),
72
- });
73
- encodedPayload = convertToJWSPayload(encodedPayload);
74
- const estimatedFees = new bignumber_js_1.default(0);
75
- await exchange.processTransaction(encodedPayload, estimatedFees, "jws");
76
- const payloadSignature = await signMessage(encodedPayload, partnerPrivKey, "rs");
77
- await exchange.checkTransactionSignature(payloadSignature);
78
- });
79
- it("NG SWAP with more than 255 bytes in process transaction", async () => {
80
- // Given
81
- const exchange = new Exchange_1.default(transport, 3 /* ExchangeTypes.SwapNg */);
82
- // When
83
- const transactionId = await exchange.startNewTransaction();
84
- // Then
85
- expect(transactionId).toEqual(expect.any(String));
86
- expect(transactionId).toHaveLength(64);
87
- const { partnerInfo, partnerSigned, partnerPrivKey } = await appExchangeDatasetTest(ngSignFormat);
88
- await exchange.setPartnerKey(partnerInfo);
89
- await exchange.checkPartner(partnerSigned);
90
- const amount = new bignumber_js_1.default(100_000);
91
- const amountToWallet = new bignumber_js_1.default(100_000_000_000);
92
- // Extra properties have a limited size of 20 (i.e. app-exchange/src/proto/protocol.options)
93
- let encodedPayload = await generateSwapPayloadProtobuf({
94
- payinAddress: "0xd692Cb1346262F584D17B4B470954501f6715a82",
95
- payinExtraId: '{ extraInfo: "Go" }',
96
- refundAddress: "0xDad77910DbDFdE764fC21FCD4E74D71bBACA6D8D",
97
- refundExtraId: '{ extraInfo: "Go" }',
98
- payoutAddress: "bc1qer57ma0fzhqys2cmydhuj9cprf9eg0nw922a8j",
99
- payoutExtraId: "bc1qer57ma0fzhqys2c",
100
- currencyFrom: "ETH",
101
- currencyTo: "BTC",
102
- amountToProvider: Buffer.from(amount.toString(16), "hex"),
103
- amountToWallet: Buffer.from(amountToWallet.toString(16), "hex"),
104
- deviceTransactionIdNg: Buffer.from(transactionId.padStart(32, "0"), "hex"),
105
- });
106
- encodedPayload = convertToJWSPayload(encodedPayload);
107
- const estimatedFees = new bignumber_js_1.default(0);
108
- await exchange.processTransaction(encodedPayload, estimatedFees, "jws");
109
- console.log("DEBUG - SWAP partner encoded payload:", encodedPayload.toString("hex"));
110
- const payloadSignature = await signMessage(encodedPayload, partnerPrivKey, "rs");
111
- console.log("DEBUG - SWAP partner payload signature:", Buffer.from(payloadSignature).toString("hex"));
112
- await exchange.checkTransactionSignature(payloadSignature);
113
- });
114
- it("NG SWAP with prepared data", async () => {
115
- // Given
116
- const exchange = new Exchange_1.default(transport, 3 /* ExchangeTypes.SwapNg */);
117
- // When
118
- const transactionId = await exchange.startNewTransaction();
119
- // Then
120
- expect(transactionId).toEqual(expect.any(String));
121
- expect(transactionId).toHaveLength(64);
122
- const { partnerInfo, partnerSigned, apdu } = await appExchangeDataset(ngSignFormat);
123
- await exchange.setPartnerKey(partnerInfo);
124
- console.log("DEBUG - Swap partner APDU:", apdu.toString("hex"));
125
- console.log("DEBUG - Swap partner signed:", Buffer.from(partnerSigned).toString("hex"));
126
- await exchange.checkPartner(partnerSigned);
127
- const encodedPayload = Buffer.from(".CipiYzFxYXIwc3Jycjd4Zmt2eTVsNjQzbHlkbnc5cmU1OWd0enp3ZjVtZHEaKmJjMXFhcjBzcnJyN3hma3Z5NWw2NDNseWRudzlyZTU5Z3R6endmNHRlcSoqMHhiNzk0ZjVlYTBiYTM5NDk0Y2U4Mzk2MTNmZmZiYTc0Mjc5NTc5MjY4OgNCVENCA0JBVEoCBH5SBgV0-95gAGIgNQrqDJf3R_HQ92CBRhSkdSOAGxrrfQvLuqKk9Gv4GEs=");
128
- const estimatedFees = new bignumber_js_1.default(0);
129
- await exchange.processTransaction(encodedPayload, estimatedFees, "jws");
130
- console.log("DEBUG - SWAP partner encoded payload:", encodedPayload.toString("hex"));
131
- // const payloadSignature = await signMessage(encodedPayload, partnerPrivKey, "rs");
132
- const payloadSignature = Buffer.from("zGcNUYKM8sLxvT7zPU1C8vrMmanVlUroELnAeil4weo1LCk0zUBRse5-3Acv7I7II90xVTIxm26BnxRbZvVmTQ==", "base64url");
133
- console.log("DEBUG - SWAP partner payload signature:", Buffer.from(payloadSignature).toString("hex"));
134
- await exchange.checkTransactionSignature(payloadSignature);
135
- });
136
- it("NG SWAP with TON", async () => {
137
- // Given
138
- const exchange = new Exchange_1.default(transport, 3 /* ExchangeTypes.SwapNg */);
139
- // When
140
- const transactionId = await exchange.startNewTransaction();
141
- // Then
142
- expect(transactionId).toEqual(expect.any(String));
143
- expect(transactionId).toHaveLength(64);
144
- const { partnerInfo, partnerSigned, apdu, partnerPrivKey } = await appExchangeDatasetTest(ngSignFormat);
145
- await exchange.setPartnerKey(partnerInfo);
146
- console.log("DEBUG - Swap partner APDU:", apdu.toString("hex"));
147
- console.log("DEBUG - Swap partner signed:", Buffer.from(partnerSigned).toString("hex"));
148
- await exchange.checkPartner(partnerSigned);
149
- const amount = new bignumber_js_1.default(100);
150
- const amountToWallet = new bignumber_js_1.default(1_000);
151
- // Extra properties have a limited size of 20 (i.e. app-exchange/src/proto/protocol.options)
152
- let encodedPayload = await generateSwapPayloadProtobuf({
153
- payinAddress: "UQAbvs2tCnsTWxCZX7JW-dqlk0vM8x_m8aJqF4wwRWGtTEZD",
154
- refundAddress: "UQAbvs2tCnsTWxCZX7JW-dqlk0vM8x_m8aJqF4wwRWGtTEZD",
155
- payoutAddress: "0x66c4371aE8FFeD2ec1c2EBbbcCfb7E494181E1E3",
156
- // payinAddress: "UQCa_2bcwBt5eH9gOMgHC497nyfjgSl8hGpZ90O7B17WHA==",
157
- // refundAddress: "UQCa_2bcwBt5eH9gOMgHC497nyfjgSl8hGpZ90O7B17WHA==",
158
- // payoutAddress: "0xDad77910DbDFdE764fC21FCD4E74D71bBACA6D8D",
159
- currencyFrom: "TON",
160
- currencyTo: "ETH",
161
- amountToProvider: Buffer.from(amount.toString(16), "hex"),
162
- amountToWallet: Buffer.from(amountToWallet.toString(16), "hex"),
163
- deviceTransactionIdNg: Buffer.from(transactionId.padStart(32, "0"), "hex"),
164
- });
165
- encodedPayload = convertToJWSPayload(encodedPayload);
166
- const estimatedFees = new bignumber_js_1.default(0);
167
- await exchange.processTransaction(encodedPayload, estimatedFees, "jws");
168
- console.log("DEBUG - SWAP partner encoded payload:", encodedPayload.toString("hex"));
169
- const payloadSignature = await signMessage(encodedPayload, partnerPrivKey, "rs");
170
- console.log("DEBUG - SWAP partner payload signature:", Buffer.from(payloadSignature).toString("hex"));
171
- await exchange.checkTransactionSignature(payloadSignature);
172
- const configEth = {
173
- config: Buffer.from("0345544808457468657265756d050345544812", "hex"),
174
- signature: Buffer.from("3044022065d7931ab3144362d57e3fdcc5de921fb65024737d917f0ab1f8b173d1ed3c2e022027493568d112dc53c7177f8e5fc915d91a903780a067badf109085a73d360323", "hex"),
175
- };
176
- let addressParameters = bip32asBuffer("44'/60'/0'/0/0");
177
- await exchange.validatePayoutOrAsset(configEth.config, configEth.signature, addressParameters);
178
- const delay = (milliseconds) => {
179
- return new Promise(resolve => {
180
- setTimeout(resolve, milliseconds);
181
- });
182
- };
183
- await delay(500);
184
- const configTon = {
185
- config: Buffer.from("03544f4e03544f4e00", "hex"),
186
- signature: Buffer.from("3045022100b35be5d1ad0d71572b5f3d72b40766521d5492fad6ed54289a64488bec3344a902205b522b7b8c7c800826bcd0bda092e84db5d1c23f6061c8b57c8efb3641d243a7", "hex"),
187
- };
188
- addressParameters = bip32asBuffer("44'/607'/0'/0'/0'/0'");
189
- await exchange.checkRefundAddress(configTon.config, configTon.signature, addressParameters);
190
- });
191
- });
192
- describe("Check SELL", () => {
193
- it("NG Sell", async () => {
194
- // Given
195
- const exchange = new Exchange_1.default(transport, 4 /* ExchangeTypes.SellNg */);
196
- // When
197
- const transactionId = await exchange.startNewTransaction();
198
- // Then
199
- expect(transactionId).toEqual(expect.any(String));
200
- expect(transactionId).toHaveLength(64);
201
- const { partnerInfo, partnerSigned, partnerPrivKey, apdu } = await appExchangeSellDataset(ngSignFormat);
202
- await exchange.setPartnerKey(partnerInfo);
203
- console.log("DEBUG - Sell partner pubkey:", partnerInfo.publicKey.toString("hex"));
204
- console.log("DEBUG - Sell partner APDU:", apdu.toString("hex"));
205
- console.log("DEBUG - Sell partner signed:", Buffer.from(partnerSigned).toString("hex"));
206
- await exchange.checkPartner(partnerSigned);
207
- const amount = new bignumber_js_1.default(100_000);
208
- let encodedPayload = await generateSellPayloadProtobuf({
209
- traderEmail: "test@ledger.fr",
210
- inCurrency: "ETH",
211
- inAmount: Buffer.from(amount.toString(16), "hex"),
212
- inAddress: "0xd692Cb1346262F584D17B4B470954501f6715a82",
213
- outCurrency: "EUR",
214
- outAmount: {
215
- coefficient: Buffer.from("1", "hex"),
216
- exponent: 1,
217
- },
218
- deviceTransactionId: Buffer.from(transactionId.padStart(32, "0"), "hex"),
219
- });
220
- encodedPayload = convertToJWSPayload(encodedPayload);
221
- const estimatedFees = new bignumber_js_1.default(0);
222
- await exchange.processTransaction(encodedPayload, estimatedFees, "jws");
223
- console.log("DEBUG - SELL partner encoded payload:", encodedPayload.toString("hex"));
224
- const payloadSignature = await signMessage(encodedPayload, partnerPrivKey, "rs");
225
- console.log("DEBUG - SELL partner payload signature:", Buffer.from(payloadSignature).toString("hex"));
226
- await exchange.checkTransactionSignature(payloadSignature);
227
- });
228
- });
229
- });
230
- describe("Test internal sign and verification functionality", () => {
231
- describe("With Ledger keys", () => {
232
- const privKey = Buffer.from("b1ed47ef58f782e2bc4d5abe70ef66d9009c2957967017054470e0f3e10f5833", "hex");
233
- const pubKey = Buffer.from("0420da62003c0ce097e33644a10fe4c30454069a4454f0fa9d4e84f45091429b5220af9e35c0b2d9289380137307de4dd1d418428cf21a93b33561bb09d88fe579", "hex");
234
- test("simple signature", async () => {
235
- // Given
236
- const msg = "Something important to cipher";
237
- // When
238
- const sig = await signMessage(Buffer.from(msg), privKey, "rs");
239
- console.log("DEBUG - Test internal: message signature", Buffer.from(sig).toString("hex"));
240
- // Then
241
- const hashBuffer = await crypto_1.subtle.digest("SHA-256", Buffer.from(msg));
242
- const hash = new Uint8Array(hashBuffer);
243
- expect(secp256k1_1.secp256k1.verify(sig, hash, pubKey)).toBeTruthy();
244
- });
245
- test("APDU signature generated by this test suite", async () => {
246
- // Given
247
- const msg = "0953454c4c5f54455354000478d5facdae2305f48795d3ce7d9244f5060d2f800901da5746d1f4177ae8d7bbe63f3870efc0d36af8f91962811e1d8d9df91ce3b3ea2cd9f550c7d465f8b7b3";
248
- // When
249
- const sig = Buffer.from("30440220471b035b40dafa095d615998c82202b2bd00fb45670b828f1dda3b68e5b24cc3022022a1c64d02b8c14e1e4cc2d05b00234642c11db3d4461ff5366f5af337cf0ced", "hex");
250
- // Then
251
- const hashBuffer = await crypto_1.subtle.digest("SHA-256", Buffer.from(msg, "hex"));
252
- const hash = new Uint8Array(hashBuffer);
253
- expect(secp256k1_1.secp256k1.verify(convertSignatureFromDER(sig), hash, pubKey, { prehash: false })).toBeTruthy();
254
- });
255
- test("APDU signature generated by external tool", async () => {
256
- // Given
257
- // {"name":"TEST_PROVIDER","payloadSignatureComputedFormat":"jws","publicKey":{"curve":"secp256r1","data":"047c13debdb9e1afac5a82bbe78da6dca98a2e59af8a9a3f827acb8ed325c79a6c5749eff65d4e3470bd2995def771f45426c58eada7227d536feeffb58fa71c24"},"service":{"appVersion":2,"name":"swap"},"signature":"3045022072e6773318af531e478c40f53815d2fa0a1c06c49519bb693ff234662fb6558802210083ab26162da41d3c429dd10051f565440576193031eb0590a9ea200af987f062"}
258
- const msg = "0d544553545f50524f564944455201047c13debdb9e1afac5a82bbe78da6dca98a2e59af8a9a3f827acb8ed325c79a6c5749eff65d4e3470bd2995def771f45426c58eada7227d536feeffb58fa71c24";
259
- const apdu = ngSignFormat({
260
- name: "TEST_PROVIDER",
261
- curve: "secp256r1",
262
- publicKey: Buffer.from("047c13debdb9e1afac5a82bbe78da6dca98a2e59af8a9a3f827acb8ed325c79a6c5749eff65d4e3470bd2995def771f45426c58eada7227d536feeffb58fa71c24", "hex"),
263
- // signatureComputedFormat?: PayloadSignatureComputedFormat;
264
- });
265
- console.log("DEBUG - Test internal: expected APDU to sign\t", apdu.toString("hex"));
266
- console.log("DEBUG - Test internal: APDU to sign\t", msg);
267
- // When
268
- // const sig = Buffer.from(
269
- // "3045022068e5971fdad78583e7bb28adac09212108966fd2ed4f8ad206499bca59f0ad12022100aed715d306f772524b805dd4f91afc79b4bda1a14f91d90ea78739e05461d6c7",
270
- // "hex",
271
- // );
272
- const sig = await signMessage(Buffer.from(msg, "hex"), LEDGER_FAKE_PRIVATE_KEY, "der");
273
- console.log("DEBUG - Test internal: message signature", Buffer.from(sig).toString("hex"));
274
- // Then
275
- const hashBuffer = await crypto_1.subtle.digest("SHA-256", Buffer.from(msg, "hex"));
276
- const hash = new Uint8Array(hashBuffer);
277
- expect(secp256k1_1.secp256k1.verify(convertSignatureFromDER(sig), hash, pubKey, { prehash: false })).toBeTruthy();
278
- });
279
- test("APDU signature already validated", async () => {
280
- // Given
281
- const msg = legacySignFormat({
282
- name: "Coinify",
283
- curve: "secp256r1",
284
- publicKey: Buffer.from("044f22668f5f321d3784266c932a2a3141c3ec196ddd51f42cf975267eda23d3a8b02170e4c5c70536e7d03ba4e66ee3e1f9d65e772d3217871a830a7cf60da366", "hex"),
285
- // signatureComputedFormat?: PayloadSignatureComputedFormat;
286
- });
287
- console.log("DEBUG - Test internal: APDU to sign", msg.toString("hex"));
288
- // When
289
- const sig = Buffer.from("30450221008e8b2172ddd48e196dbff81ebe8aebc4ec0988f72de1b02da202f3a8d8f33f9c02205273c1d426aeb460fd36a27696aafda68bdff4139886f29e558895ea85527749", "hex");
290
- // const sig = await signMessage(Buffer.from(msg, "hex"), LEDGER_FAKE_PRIVATE_KEY, "der");
291
- console.log("DEBUG - Test internal: message signature", Buffer.from(sig).toString("hex"));
292
- // Then
293
- const hashBuffer = await crypto_1.subtle.digest("SHA-256", msg);
294
- const hash = new Uint8Array(hashBuffer);
295
- expect(secp256k1_1.secp256k1.verify(convertSignatureFromDER(sig), hash, pubKey, { prehash: false })).toBeTruthy();
296
- });
297
- });
298
- describe("With SELL keys", () => {
299
- const privKey = Buffer.from("308f6a5369aea611d89abf937d0ffaf0b43b457d42cbf0cf754786b3088f17ae", "hex");
300
- const pubKey = Buffer.from("0478d5facdae2305f48795d3ce7d9244f5060d2f800901da5746d1f4177ae8d7bbe63f3870efc0d36af8f91962811e1d8d9df91ce3b3ea2cd9f550c7d465f8b7b3", "hex");
301
- test("SELL private and public K1 key pair", async () => {
302
- // Given
303
- const msg = "Something important to cipher";
304
- // When
305
- const sig = await signMessage(Buffer.from(msg), privKey, "rs");
306
- console.log("DEBUG - Test internal: message signature", Buffer.from(sig).toString("hex"));
307
- // Then
308
- const hashBuffer = await crypto_1.subtle.digest("SHA-256", Buffer.from(msg));
309
- const hash = new Uint8Array(hashBuffer);
310
- expect(secp256k1_1.secp256k1.verify(sig, hash, pubKey)).toBeTruthy();
311
- });
312
- test("SELL verify payload signature", async () => {
313
- // Given
314
- const msg = "2e436735305a584e305147786c5a47646c6369356d636849445256524947674959616949714d48686b4e6a6b79513249784d7a51324d6a5979526a55344e4551784e304930516a51334d446b314e4455774d5759324e7a4531595467794b674e465656497942416f41454145364944554b366779583930667830506467675559557048556a674273613633304c79377169705052722d42684c";
315
- // When
316
- const sig = Buffer.from("348e938ce75c06da9a27652c2af6146b4581f948c600b4f7093743e8af256d172324131dcc852f068d0bd20afd0c8444bc635e9520d3a29cab7ff7c27dc8b782", "hex");
317
- console.log("DEBUG - Test internal: message signature", Buffer.from(sig).toString("hex"));
318
- // Then
319
- const hashBuffer = await crypto_1.subtle.digest("SHA-256", Buffer.from(msg, "hex"));
320
- const hash = new Uint8Array(hashBuffer);
321
- expect(secp256k1_1.secp256k1.verify(sig, hash, pubKey)).toBeTruthy();
322
- });
323
- });
324
- });
325
- // Those information comes from dataset test of app-exchange (i.e. check signing_authority.py file).
326
- // The public key is bundle with DEBUG version of app-exchange.
327
- const LEDGER_FAKE_PRIVATE_KEY = Buffer.from("b1ed47ef58f782e2bc4d5abe70ef66d9009c2957967017054470e0f3e10f5833", "hex");
328
- const legacySignFormat = (info) => {
329
- return Buffer.concat([
330
- Buffer.from([info.name.length]),
331
- Buffer.from(info.name, "ascii"),
332
- info.publicKey,
333
- ]);
334
- };
335
- const curves = {
336
- secp256k1: 0x00,
337
- secp256r1: 0x01,
338
- };
339
- const ngSignFormat = (info) => {
340
- return Buffer.concat([
341
- Buffer.from([info.name.length]),
342
- Buffer.from(info.name, "ascii"),
343
- Buffer.from([curves[info.curve]]),
344
- info.publicKey,
345
- ]);
346
- };
347
- async function appExchangeDatasetTest(signFormat) {
348
- // Generate random provider key
349
- let privKey;
350
- do {
351
- privKey = (0, crypto_1.randomBytes)(32);
352
- } while (!secp256k1_1.secp256k1.utils.isValidPrivateKey(privKey));
353
- // The expected public should not be compressed and be a full 64 length (with R and S)
354
- const isCompressed = false;
355
- const pubKey = secp256k1_1.secp256k1.getPublicKey(privKey, isCompressed);
356
- const partnerInfo = {
357
- name: "SWAP_TEST",
358
- curve: "secp256k1",
359
- publicKey: Buffer.from(pubKey),
360
- };
361
- const msg = signFormat(partnerInfo);
362
- const sig = await signMessage(msg, LEDGER_FAKE_PRIVATE_KEY, "der");
363
- return {
364
- partnerInfo,
365
- apdu: msg,
366
- partnerSigned: sig,
367
- partnerPrivKey: privKey,
368
- };
369
- }
370
- async function appExchangeDataset(signFormat) {
371
- const pubKey = Buffer.from("0478d5facdae2305f48795d3ce7d9244f5060d2f800901da5746d1f4177ae8d7bbe63f3870efc0d36af8f91962811e1d8d9df91ce3b3ea2cd9f550c7d465f8b7b3", "hex");
372
- // Verify public key by trying to create Point from it
373
- secp256k1_1.secp256k1.ProjectivePoint.fromHex(pubKey);
374
- const partnerInfo = {
375
- name: "SWAP_TEST",
376
- curve: "secp256k1",
377
- publicKey: Buffer.from(pubKey),
378
- };
379
- const msg = signFormat(partnerInfo);
380
- const sig = await signMessage(msg, LEDGER_FAKE_PRIVATE_KEY, "der");
381
- return {
382
- partnerInfo,
383
- apdu: msg,
384
- partnerSigned: sig,
385
- };
386
- }
387
- async function appExchangeSellDataset(signFormat) {
388
- const privKey = Buffer.from("308f6a5369aea611d89abf937d0ffaf0b43b457d42cbf0cf754786b3088f17ae", "hex");
389
- const pubKey = Buffer.from("0478d5facdae2305f48795d3ce7d9244f5060d2f800901da5746d1f4177ae8d7bbe63f3870efc0d36af8f91962811e1d8d9df91ce3b3ea2cd9f550c7d465f8b7b3", "hex");
390
- // Verify public key by trying to create Point from it
391
- secp256k1_1.secp256k1.ProjectivePoint.fromHex(pubKey);
392
- const partnerInfo = {
393
- name: "SELL_TEST",
394
- curve: "secp256k1",
395
- publicKey: pubKey,
396
- };
397
- const msg = signFormat(partnerInfo);
398
- const sig = await signMessage(msg, LEDGER_FAKE_PRIVATE_KEY, "der");
399
- return {
400
- partnerInfo,
401
- apdu: msg,
402
- partnerSigned: sig,
403
- partnerPrivKey: privKey,
404
- };
405
- }
406
- async function generateSwapPayloadProtobuf(payload) {
407
- const root = await protobufjs_1.default.load("protocol.proto");
408
- const TransactionResponse = root.lookupType("ledger_swap.NewTransactionResponse");
409
- const err = TransactionResponse.verify(payload);
410
- if (err) {
411
- throw Error(err);
412
- }
413
- const message = TransactionResponse.create(payload);
414
- const messageEncoded = TransactionResponse.encode(message).finish();
415
- return Buffer.from(messageEncoded);
416
- }
417
- async function generateSellPayloadProtobuf(payload) {
418
- const root = await protobufjs_1.default.load("protocol.proto");
419
- const SellResponse = root.lookupType("ledger_swap.NewSellResponse");
420
- const err = SellResponse.verify(payload);
421
- if (err) {
422
- throw Error(err);
423
- }
424
- const message = SellResponse.create(payload);
425
- const messageEncoded = SellResponse.encode(message).finish();
426
- return Buffer.from(messageEncoded);
427
- }
428
- // Sign message in ECDSA-SHA256 with secp256k1 curve and returnsa DER format signature
429
- async function signMessage(message, privKey, sigFormat) {
430
- const hashBuffer = await crypto_1.subtle.digest("SHA-256", message);
431
- const hash = new Uint8Array(hashBuffer);
432
- const signature = secp256k1_1.secp256k1.sign(hash, privKey, { prehash: false });
433
- const sig = signature.toCompactRawBytes();
434
- if (sigFormat === "der") {
435
- return convertSignatureToDER(sig);
436
- }
437
- return Buffer.from(sig);
438
- }
439
- function convertSignatureToDER(sig) {
440
- return Buffer.from(secp256k1_1.secp256k1.Signature.fromCompact(sig).toDERRawBytes());
441
- }
442
- // Convert raw buffer to a JWS compatible one: '.'+base64Url(raw)
443
- function convertToJWSPayload(raw) {
444
- return Buffer.from("." + raw.toString("base64url"));
445
- }
446
- function convertSignatureFromDER(sig) {
447
- return Buffer.from(secp256k1_1.secp256k1.Signature.fromDER(sig).toCompactRawBytes());
448
- }
449
- function bip32asBuffer(path) {
450
- const pathElements = !path ? [] : bip32_path_1.default.fromString(path).toPathArray();
451
- const buffer = Buffer.alloc(1 + pathElements.length * 4);
452
- buffer[0] = pathElements.length;
453
- pathElements.forEach((element, index) => {
454
- buffer.writeUInt32BE(element, 1 + 4 * index);
455
- });
456
- return buffer;
457
- }
458
- //# sourceMappingURL=Exchange.integ.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Exchange.integ.test.js","sourceRoot":"","sources":["../src/Exchange.integ.test.ts"],"names":[],"mappings":";;;;;AAAA,4DAAiC;AACjC,gHAA8E;AAC9E,0DAAqE;AAErE,mCAA6C;AAC7C,uDAAoD;AACpD,4DAAkC;AAClC,gEAAqC;AAErC,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,IAAI,SAAoB,CAAC;IAEzB,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,SAAS,GAAG,MAAM,yCAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,SAAS,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;YAC3B,QAAQ;YACR,MAAM,QAAQ,GAAG,IAAI,kBAAQ,CAAC,SAAS,6BAAqB,CAAC;YAE7D,OAAO;YACP,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YAE3D,OAAO;YACP,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAEvC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,GAClD,MAAM,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;YACjD,MAAM,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAE1C,MAAM,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,IAAI,sBAAS,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,cAAc,GAAG,IAAI,sBAAS,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,cAAc,GAAG,MAAM,2BAA2B,CAAC;gBACvD,YAAY,EAAE,4CAA4C;gBAC1D,aAAa,EAAE,4CAA4C;gBAC3D,aAAa,EAAE,4CAA4C;gBAC3D,YAAY,EAAE,KAAK;gBACnB,UAAU,EAAE,KAAK;gBACjB,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;gBACzD,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;gBAC/D,mBAAmB,EAAE,aAAa;aACnC,CAAC,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,sBAAS,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,QAAQ,CAAC,kBAAkB,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;YAEjE,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;YAClF,MAAM,QAAQ,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;YACvB,QAAQ;YACR,MAAM,QAAQ,GAAG,IAAI,kBAAQ,CAAC,SAAS,+BAAuB,CAAC;YAE/D,OAAO;YACP,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YAE3D,OAAO;YACP,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAEvC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,GAClD,MAAM,sBAAsB,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAE1C,MAAM,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,IAAI,sBAAS,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,cAAc,GAAG,IAAI,sBAAS,CAAC,eAAe,CAAC,CAAC;YACtD,IAAI,cAAc,GAAG,MAAM,2BAA2B,CAAC;gBACrD,YAAY,EAAE,4CAA4C;gBAC1D,aAAa,EAAE,4CAA4C;gBAC3D,aAAa,EAAE,4CAA4C;gBAC3D,YAAY,EAAE,KAAK;gBACnB,UAAU,EAAE,KAAK;gBACjB,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;gBACzD,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;gBAC/D,qBAAqB,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC;aAC3E,CAAC,CAAC;YACH,cAAc,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;YAErD,MAAM,aAAa,GAAG,IAAI,sBAAS,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,QAAQ,CAAC,kBAAkB,CAAC,cAAc,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;YAExE,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YACjF,MAAM,QAAQ,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,QAAQ;YACR,MAAM,QAAQ,GAAG,IAAI,kBAAQ,CAAC,SAAS,+BAAuB,CAAC;YAE/D,OAAO;YACP,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YAE3D,OAAO;YACP,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAEvC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,GAClD,MAAM,sBAAsB,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAE1C,MAAM,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,IAAI,sBAAS,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,cAAc,GAAG,IAAI,sBAAS,CAAC,eAAe,CAAC,CAAC;YACtD,4FAA4F;YAC5F,IAAI,cAAc,GAAG,MAAM,2BAA2B,CAAC;gBACrD,YAAY,EAAE,4CAA4C;gBAC1D,YAAY,EAAE,qBAAqB;gBACnC,aAAa,EAAE,4CAA4C;gBAC3D,aAAa,EAAE,qBAAqB;gBACpC,aAAa,EAAE,4CAA4C;gBAC3D,aAAa,EAAE,qBAAqB;gBACpC,YAAY,EAAE,KAAK;gBACnB,UAAU,EAAE,KAAK;gBACjB,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;gBACzD,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;gBAC/D,qBAAqB,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC;aAC3E,CAAC,CAAC;YACH,cAAc,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;YAErD,MAAM,aAAa,GAAG,IAAI,sBAAS,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,QAAQ,CAAC,kBAAkB,CAAC,cAAc,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAErF,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CACT,yCAAyC,EACzC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC9C,CAAC;YACF,MAAM,QAAQ,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC1C,QAAQ;YACR,MAAM,QAAQ,GAAG,IAAI,kBAAQ,CAAC,SAAS,+BAAuB,CAAC;YAE/D,OAAO;YACP,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YAE3D,OAAO;YACP,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAEvC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,CAAC;YACpF,MAAM,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAE1C,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAExF,MAAM,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAE3C,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAChC,+PAA+P,CAChQ,CAAC;YAEF,MAAM,aAAa,GAAG,IAAI,sBAAS,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,QAAQ,CAAC,kBAAkB,CAAC,cAAc,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAErF,oFAAoF;YACpF,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAClC,0FAA0F,EAC1F,WAAW,CACZ,CAAC;YACF,OAAO,CAAC,GAAG,CACT,yCAAyC,EACzC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC9C,CAAC;YACF,MAAM,QAAQ,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;YAChC,QAAQ;YACR,MAAM,QAAQ,GAAG,IAAI,kBAAQ,CAAC,SAAS,+BAAuB,CAAC;YAE/D,OAAO;YACP,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YAE3D,OAAO;YACP,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAEvC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,GACxD,MAAM,sBAAsB,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAE1C,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAExF,MAAM,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,IAAI,sBAAS,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,cAAc,GAAG,IAAI,sBAAS,CAAC,KAAK,CAAC,CAAC;YAC5C,4FAA4F;YAC5F,IAAI,cAAc,GAAG,MAAM,2BAA2B,CAAC;gBACrD,YAAY,EAAE,kDAAkD;gBAChE,aAAa,EAAE,kDAAkD;gBACjE,aAAa,EAAE,4CAA4C;gBAC3D,oEAAoE;gBACpE,qEAAqE;gBACrE,+DAA+D;gBAC/D,YAAY,EAAE,KAAK;gBACnB,UAAU,EAAE,KAAK;gBACjB,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;gBACzD,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;gBAC/D,qBAAqB,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC;aAC3E,CAAC,CAAC;YACH,cAAc,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;YAErD,MAAM,aAAa,GAAG,IAAI,sBAAS,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,QAAQ,CAAC,kBAAkB,CAAC,cAAc,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAErF,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CACT,yCAAyC,EACzC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC9C,CAAC;YACF,MAAM,QAAQ,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;YAE3D,MAAM,SAAS,GAAG;gBAChB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,KAAK,CAAC;gBACpE,SAAS,EAAE,MAAM,CAAC,IAAI,CACpB,8IAA8I,EAC9I,KAAK,CACN;aACF,CAAC;YACF,IAAI,iBAAiB,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;YACxD,MAAM,QAAQ,CAAC,qBAAqB,CAClC,SAAS,CAAC,MAAM,EAChB,SAAS,CAAC,SAAS,EACnB,iBAAiB,CAClB,CAAC;YAEF,MAAM,KAAK,GAAG,CAAC,YAAoB,EAAE,EAAE;gBACrC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;oBAC3B,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBACpC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;YACF,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YAEjB,MAAM,SAAS,GAAG;gBAChB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC;gBAChD,SAAS,EAAE,MAAM,CAAC,IAAI,CACpB,gJAAgJ,EAChJ,KAAK,CACN;aACF,CAAC;YACF,iBAAiB,GAAG,aAAa,CAAC,sBAAsB,CAAC,CAAC;YAC1D,MAAM,QAAQ,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;YACvB,QAAQ;YACR,MAAM,QAAQ,GAAG,IAAI,kBAAQ,CAAC,SAAS,+BAAuB,CAAC;YAE/D,OAAO;YACP,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YAE3D,OAAO;YACP,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAEvC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,GACxD,MAAM,sBAAsB,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YACnF,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAExF,MAAM,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,IAAI,sBAAS,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,cAAc,GAAG,MAAM,2BAA2B,CAAC;gBACrD,WAAW,EAAE,gBAAgB;gBAC7B,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;gBACjD,SAAS,EAAE,4CAA4C;gBACvD,WAAW,EAAE,KAAK;gBAClB,SAAS,EAAE;oBACT,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;oBACpC,QAAQ,EAAE,CAAC;iBACZ;gBACD,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC;aACzE,CAAC,CAAC;YACH,cAAc,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;YAErD,MAAM,aAAa,GAAG,IAAI,sBAAS,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,QAAQ,CAAC,kBAAkB,CAAC,cAAc,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAErF,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CACT,yCAAyC,EACzC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC9C,CAAC;YACF,MAAM,QAAQ,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IACjE,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CACzB,kEAAkE,EAClE,KAAK,CACN,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxB,oIAAoI,EACpI,KAAK,CACN,CAAC;QAEF,IAAI,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;YAClC,QAAQ;YACR,MAAM,GAAG,GAAG,+BAA+B,CAAC;YAE5C,OAAO;YACP,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,0CAA0C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAE1F,OAAO;YACP,MAAM,UAAU,GAAG,MAAM,eAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACpE,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,CAAC,qBAAS,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC7D,QAAQ;YACR,MAAM,GAAG,GACP,0JAA0J,CAAC;YAE7J,OAAO;YACP,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CACrB,8IAA8I,EAC9I,KAAK,CACN,CAAC;YAEF,OAAO;YACP,MAAM,UAAU,GAAG,MAAM,eAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,CACJ,qBAAS,CAAC,MAAM,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CACjF,CAAC,UAAU,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YAC3D,QAAQ;YACR,sbAAsb;YACtb,MAAM,GAAG,GACP,kKAAkK,CAAC;YACrK,MAAM,IAAI,GAAG,YAAY,CAAC;gBACxB,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,WAAW;gBAClB,SAAS,EAAE,MAAM,CAAC,IAAI,CACpB,oIAAoI,EACpI,KAAK,CACN;gBACD,4DAA4D;aAC7D,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,gDAAgD,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YACpF,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;YAE1D,OAAO;YACP,2BAA2B;YAC3B,sJAAsJ;YACtJ,WAAW;YACX,KAAK;YACL,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,uBAAuB,EAAE,KAAK,CAAC,CAAC;YACvF,OAAO,CAAC,GAAG,CAAC,0CAA0C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAE1F,OAAO;YACP,MAAM,UAAU,GAAG,MAAM,eAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,CACJ,qBAAS,CAAC,MAAM,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CACjF,CAAC,UAAU,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAClD,QAAQ;YACR,MAAM,GAAG,GAAG,gBAAgB,CAAC;gBAC3B,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,WAAW;gBAClB,SAAS,EAAE,MAAM,CAAC,IAAI,CACpB,oIAAoI,EACpI,KAAK,CACN;gBACD,4DAA4D;aAC7D,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAExE,OAAO;YACP,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CACrB,gJAAgJ,EAChJ,KAAK,CACN,CAAC;YACF,0FAA0F;YAC1F,OAAO,CAAC,GAAG,CAAC,0CAA0C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAE1F,OAAO;YACP,MAAM,UAAU,GAAG,MAAM,eAAM,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,CACJ,qBAAS,CAAC,MAAM,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CACjF,CAAC,UAAU,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CACzB,kEAAkE,EAClE,KAAK,CACN,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxB,oIAAoI,EACpI,KAAK,CACN,CAAC;QAEF,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACrD,QAAQ;YACR,MAAM,GAAG,GAAG,+BAA+B,CAAC;YAE5C,OAAO;YACP,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,0CAA0C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAE1F,OAAO;YACP,MAAM,UAAU,GAAG,MAAM,eAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACpE,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,CAAC,qBAAS,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC/C,QAAQ;YACR,MAAM,GAAG,GACP,oTAAoT,CAAC;YAEvT,OAAO;YACP,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CACrB,kIAAkI,EAClI,KAAK,CACN,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,0CAA0C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAE1F,OAAO;YACP,MAAM,UAAU,GAAG,MAAM,eAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,CAAC,qBAAS,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,oGAAoG;AACpG,+DAA+D;AAC/D,MAAM,uBAAuB,GAAG,MAAM,CAAC,IAAI,CACzC,kEAAkE,EAClE,KAAK,CACN,CAAC;AAGF,MAAM,gBAAgB,GAAsB,CAAC,IAAoB,EAAE,EAAE;IACnE,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;QAC/B,IAAI,CAAC,SAAS;KACf,CAAC,CAAC;AACL,CAAC,CAAC;AACF,MAAM,MAAM,GAAG;IACb,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;CAChB,CAAC;AACF,MAAM,YAAY,GAAsB,CAAC,IAAoB,EAAE,EAAE;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS;KACf,CAAC,CAAC;AACL,CAAC,CAAC;AACF,KAAK,UAAU,sBAAsB,CAAC,UAA6B;IACjE,+BAA+B;IAC/B,IAAI,OAAO,CAAC;IACZ,GAAG,CAAC;QACF,OAAO,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,QAAQ,CAAC,qBAAS,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;IACtD,sFAAsF;IACtF,MAAM,YAAY,GAAG,KAAK,CAAC;IAC3B,MAAM,MAAM,GAAG,qBAAS,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAE7D,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,WAAW;QAClB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;KAC/B,CAAC;IACF,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAEpC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAEnE,OAAO;QACL,WAAW;QACX,IAAI,EAAE,GAAG;QACT,aAAa,EAAE,GAAG;QAClB,cAAc,EAAE,OAAO;KACxB,CAAC;AACJ,CAAC;AACD,KAAK,UAAU,kBAAkB,CAAC,UAA6B;IAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxB,oIAAoI,EACpI,KAAK,CACN,CAAC;IACF,sDAAsD;IACtD,qBAAS,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1C,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,WAAW;QAClB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;KAC/B,CAAC;IACF,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAEpC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAEnE,OAAO;QACL,WAAW;QACX,IAAI,EAAE,GAAG;QACT,aAAa,EAAE,GAAG;KACnB,CAAC;AACJ,CAAC;AACD,KAAK,UAAU,sBAAsB,CAAC,UAA6B;IACjE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CACzB,kEAAkE,EAClE,KAAK,CACN,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxB,oIAAoI,EACpI,KAAK,CACN,CAAC;IACF,sDAAsD;IACtD,qBAAS,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1C,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,WAAW;QAClB,SAAS,EAAE,MAAM;KAClB,CAAC;IACF,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAEpC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAEnE,OAAO;QACL,WAAW;QACX,IAAI,EAAE,GAAG;QACT,aAAa,EAAE,GAAG;QAClB,cAAc,EAAE,OAAO;KACxB,CAAC;AACJ,CAAC;AAoBD,KAAK,UAAU,2BAA2B,CAAC,OAAoB;IAC7D,MAAM,IAAI,GAAG,MAAM,oBAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACnD,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,CAAC,oCAAoC,CAAC,CAAC;IAClF,MAAM,GAAG,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;IAEpE,OAAO,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACrC,CAAC;AAgBD,KAAK,UAAU,2BAA2B,CAAC,OAAoB;IAC7D,MAAM,IAAI,GAAG,MAAM,oBAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,6BAA6B,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;IAE7D,OAAO,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACrC,CAAC;AAGD,sFAAsF;AACtF,KAAK,UAAU,WAAW,CACxB,OAAe,EACf,OAAe,EACf,SAAoB;IAEpB,MAAM,UAAU,GAAG,MAAM,eAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;IAExC,MAAM,SAAS,GAAG,qBAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,SAAS,CAAC,iBAAiB,EAAE,CAAC;IAC1C,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAe;IAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,qBAAS,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,iEAAiE;AACjE,SAAS,mBAAmB,CAAC,GAAW;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAe;IAC9C,OAAO,MAAM,CAAC,IAAI,CAAC,qBAAS,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAEzE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzD,MAAM,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;IAChC,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QACtC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=Exchange.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Exchange.test.d.ts","sourceRoot":"","sources":["../src/Exchange.test.ts"],"names":[],"mappings":""}