@dynamic-labs-wallet/svm 0.0.72 → 0.0.73

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/index.cjs.js CHANGED
@@ -15,6 +15,11 @@ function _extends() {
15
15
  return _extends.apply(this, arguments);
16
16
  }
17
17
 
18
+ const addSignatureToTransaction = ({ transaction, signature, signerPublicKey })=>{
19
+ transaction.addSignature(signerPublicKey, Buffer.from(signature));
20
+ return transaction;
21
+ };
22
+
18
23
  const ERROR_CREATE_WALLET_ACCOUNT = 'Error creating svm wallet account';
19
24
 
20
25
  class DynamicSvmWalletClient extends browser.DynamicWalletClient {
@@ -47,6 +52,8 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
47
52
  }
48
53
  const { accountAddress } = await this.deriveAccountAddress(rawPublicKey);
49
54
  // Update client key shares in wallet map
55
+ // warning: this might result in race condition if `onCeremonyComplete` executes at the same time
56
+ // TODO: remove this once iframe handling for secret shares is implemented
50
57
  await this.setClientKeySharesToLocalStorage({
51
58
  accountAddress,
52
59
  clientKeyShares,
@@ -60,7 +67,8 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
60
67
  });
61
68
  return {
62
69
  accountAddress,
63
- rawPublicKey
70
+ rawPublicKey: rawPublicKey,
71
+ clientKeyShares
64
72
  };
65
73
  } catch (error) {
66
74
  this.logger.error(ERROR_CREATE_WALLET_ACCOUNT, error);
@@ -110,8 +118,18 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
110
118
  walletOperation: browser.WalletOperation.SIGN_TRANSACTION
111
119
  });
112
120
  try {
121
+ let messageToSign;
122
+ if (transaction instanceof web3_js.VersionedTransaction) {
123
+ // For versioned transactions, we need to sign the message directly
124
+ const messageBytes = transaction.message.serialize();
125
+ messageToSign = Buffer.from(messageBytes).toString('hex');
126
+ } else {
127
+ // For legacy transactions, serialize the message
128
+ const messageBytes = transaction.serializeMessage();
129
+ messageToSign = Buffer.from(messageBytes).toString('hex');
130
+ }
113
131
  const signatureEd25519 = await this.sign({
114
- message: transaction,
132
+ message: messageToSign,
115
133
  accountAddress: senderAddress,
116
134
  chainName: this.chainName,
117
135
  password
@@ -119,7 +137,13 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
119
137
  if (!signatureEd25519) {
120
138
  throw new Error('Signature is undefined');
121
139
  }
122
- return Buffer.from(signatureEd25519).toString('hex');
140
+ const senderPublicKey = new web3_js.PublicKey(senderAddress);
141
+ const signedTransaction = addSignatureToTransaction({
142
+ transaction,
143
+ signature: signatureEd25519,
144
+ signerPublicKey: senderPublicKey
145
+ });
146
+ return signedTransaction;
123
147
  } catch (error) {
124
148
  this.logger.error('Error in signTransaction:', error);
125
149
  if (error instanceof Error) {
@@ -134,7 +158,8 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
134
158
  * @param accountAddress The account address to export the private key for
135
159
  * @param password The password for encrypted backup shares
136
160
  * @returns The private key
137
- */ async exportPrivateKey({ accountAddress, password = undefined }) {
161
+ */ async exportPrivateKey({ accountAddress, displayContainer, password = undefined }) {
162
+ var _derivedPrivateKey_match;
138
163
  await this.verifyPassword({
139
164
  accountAddress,
140
165
  password,
@@ -148,7 +173,13 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
148
173
  if (!derivedPrivateKey) {
149
174
  throw new Error('Derived private key is undefined');
150
175
  }
151
- return derivedPrivateKey;
176
+ // Convert hex string to Uint8Array
177
+ const privateKeyBytes = new Uint8Array(((_derivedPrivateKey_match = derivedPrivateKey.match(/.{1,2}/g)) == null ? void 0 : _derivedPrivateKey_match.map((byte)=>parseInt(byte, 16))) || []);
178
+ // Display the private key in the container via iframe
179
+ const { iframeDisplay } = await this.initializeIframeDisplayForContainer({
180
+ container: displayContainer
181
+ });
182
+ iframeDisplay.displayPrivateKey(JSON.stringify(Array.from(privateKeyBytes)));
152
183
  }
153
184
  /**
154
185
  * Exports the private key for a given account address
@@ -195,7 +226,7 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
195
226
  */ async importPrivateKey({ privateKey, chainName, thresholdSignatureScheme, password = undefined, onError }) {
196
227
  //get public key from private key
197
228
  const publicKey = this.getPublicKeyFromPrivateKey(privateKey);
198
- const formattedPrivateKey = this.decodePrivateKeyForSolana(privateKey);
229
+ const formattedPrivateKey = await this.decodePrivateKeyForSolana(privateKey);
199
230
  const { rawPublicKey, clientKeyShares } = await this.importRawPrivateKey({
200
231
  chainName,
201
232
  privateKey: formattedPrivateKey,
@@ -220,6 +251,8 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
220
251
  throw new Error(`Public key mismatch: derived address ${accountAddress} !== public key ${publicKey}`);
221
252
  }
222
253
  // Update client key shares in wallet map
254
+ // warning: this might result in race condition if `onCeremonyComplete` executes at the same time
255
+ // TODO: remove this once iframe handling for secret shares is implemented
223
256
  await this.setClientKeySharesToLocalStorage({
224
257
  accountAddress,
225
258
  clientKeyShares,
@@ -233,7 +266,8 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
233
266
  });
234
267
  return {
235
268
  accountAddress,
236
- rawPublicKey: rawPublicKey
269
+ rawPublicKey: rawPublicKey,
270
+ clientKeyShares
237
271
  };
238
272
  }
239
273
  async getSvmWallets() {
package/index.esm.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { DynamicWalletClient, getClientKeyShareBackupInfo, WalletOperation } from '@dynamic-labs-wallet/browser';
2
2
  import bs58 from 'bs58';
3
- import { Keypair } from '@solana/web3.js';
3
+ import { VersionedTransaction, PublicKey, Keypair } from '@solana/web3.js';
4
4
 
5
5
  function _extends() {
6
6
  _extends = Object.assign || function assign(target) {
@@ -13,6 +13,11 @@ function _extends() {
13
13
  return _extends.apply(this, arguments);
14
14
  }
15
15
 
16
+ const addSignatureToTransaction = ({ transaction, signature, signerPublicKey })=>{
17
+ transaction.addSignature(signerPublicKey, Buffer.from(signature));
18
+ return transaction;
19
+ };
20
+
16
21
  const ERROR_CREATE_WALLET_ACCOUNT = 'Error creating svm wallet account';
17
22
 
18
23
  class DynamicSvmWalletClient extends DynamicWalletClient {
@@ -45,6 +50,8 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
45
50
  }
46
51
  const { accountAddress } = await this.deriveAccountAddress(rawPublicKey);
47
52
  // Update client key shares in wallet map
53
+ // warning: this might result in race condition if `onCeremonyComplete` executes at the same time
54
+ // TODO: remove this once iframe handling for secret shares is implemented
48
55
  await this.setClientKeySharesToLocalStorage({
49
56
  accountAddress,
50
57
  clientKeyShares,
@@ -58,7 +65,8 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
58
65
  });
59
66
  return {
60
67
  accountAddress,
61
- rawPublicKey
68
+ rawPublicKey: rawPublicKey,
69
+ clientKeyShares
62
70
  };
63
71
  } catch (error) {
64
72
  this.logger.error(ERROR_CREATE_WALLET_ACCOUNT, error);
@@ -108,8 +116,18 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
108
116
  walletOperation: WalletOperation.SIGN_TRANSACTION
109
117
  });
110
118
  try {
119
+ let messageToSign;
120
+ if (transaction instanceof VersionedTransaction) {
121
+ // For versioned transactions, we need to sign the message directly
122
+ const messageBytes = transaction.message.serialize();
123
+ messageToSign = Buffer.from(messageBytes).toString('hex');
124
+ } else {
125
+ // For legacy transactions, serialize the message
126
+ const messageBytes = transaction.serializeMessage();
127
+ messageToSign = Buffer.from(messageBytes).toString('hex');
128
+ }
111
129
  const signatureEd25519 = await this.sign({
112
- message: transaction,
130
+ message: messageToSign,
113
131
  accountAddress: senderAddress,
114
132
  chainName: this.chainName,
115
133
  password
@@ -117,7 +135,13 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
117
135
  if (!signatureEd25519) {
118
136
  throw new Error('Signature is undefined');
119
137
  }
120
- return Buffer.from(signatureEd25519).toString('hex');
138
+ const senderPublicKey = new PublicKey(senderAddress);
139
+ const signedTransaction = addSignatureToTransaction({
140
+ transaction,
141
+ signature: signatureEd25519,
142
+ signerPublicKey: senderPublicKey
143
+ });
144
+ return signedTransaction;
121
145
  } catch (error) {
122
146
  this.logger.error('Error in signTransaction:', error);
123
147
  if (error instanceof Error) {
@@ -132,7 +156,8 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
132
156
  * @param accountAddress The account address to export the private key for
133
157
  * @param password The password for encrypted backup shares
134
158
  * @returns The private key
135
- */ async exportPrivateKey({ accountAddress, password = undefined }) {
159
+ */ async exportPrivateKey({ accountAddress, displayContainer, password = undefined }) {
160
+ var _derivedPrivateKey_match;
136
161
  await this.verifyPassword({
137
162
  accountAddress,
138
163
  password,
@@ -146,7 +171,13 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
146
171
  if (!derivedPrivateKey) {
147
172
  throw new Error('Derived private key is undefined');
148
173
  }
149
- return derivedPrivateKey;
174
+ // Convert hex string to Uint8Array
175
+ const privateKeyBytes = new Uint8Array(((_derivedPrivateKey_match = derivedPrivateKey.match(/.{1,2}/g)) == null ? void 0 : _derivedPrivateKey_match.map((byte)=>parseInt(byte, 16))) || []);
176
+ // Display the private key in the container via iframe
177
+ const { iframeDisplay } = await this.initializeIframeDisplayForContainer({
178
+ container: displayContainer
179
+ });
180
+ iframeDisplay.displayPrivateKey(JSON.stringify(Array.from(privateKeyBytes)));
150
181
  }
151
182
  /**
152
183
  * Exports the private key for a given account address
@@ -193,7 +224,7 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
193
224
  */ async importPrivateKey({ privateKey, chainName, thresholdSignatureScheme, password = undefined, onError }) {
194
225
  //get public key from private key
195
226
  const publicKey = this.getPublicKeyFromPrivateKey(privateKey);
196
- const formattedPrivateKey = this.decodePrivateKeyForSolana(privateKey);
227
+ const formattedPrivateKey = await this.decodePrivateKeyForSolana(privateKey);
197
228
  const { rawPublicKey, clientKeyShares } = await this.importRawPrivateKey({
198
229
  chainName,
199
230
  privateKey: formattedPrivateKey,
@@ -218,6 +249,8 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
218
249
  throw new Error(`Public key mismatch: derived address ${accountAddress} !== public key ${publicKey}`);
219
250
  }
220
251
  // Update client key shares in wallet map
252
+ // warning: this might result in race condition if `onCeremonyComplete` executes at the same time
253
+ // TODO: remove this once iframe handling for secret shares is implemented
221
254
  await this.setClientKeySharesToLocalStorage({
222
255
  accountAddress,
223
256
  clientKeyShares,
@@ -231,7 +264,8 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
231
264
  });
232
265
  return {
233
266
  accountAddress,
234
- rawPublicKey: rawPublicKey
267
+ rawPublicKey: rawPublicKey,
268
+ clientKeyShares
235
269
  };
236
270
  }
237
271
  async getSvmWallets() {
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@dynamic-labs-wallet/svm",
3
- "version": "0.0.72",
3
+ "version": "0.0.73",
4
4
  "license": "MIT",
5
5
  "dependencies": {
6
- "@dynamic-labs-wallet/browser": "0.0.72",
6
+ "@dynamic-labs-wallet/browser": "0.0.73",
7
7
  "@solana/web3.js": "^1.98.2",
8
8
  "bs58": "^6.0.0"
9
9
  },
@@ -1,2 +1,2 @@
1
- export * from './client';
1
+ export * from './svm';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/svm/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/svm/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC"}
@@ -1,4 +1,5 @@
1
- import { DynamicWalletClient, Ed25519KeygenResult, ThresholdSignatureScheme } from '@dynamic-labs-wallet/browser';
1
+ import { ClientKeyShare, DynamicWalletClient, Ed25519KeygenResult, ThresholdSignatureScheme } from '@dynamic-labs-wallet/browser';
2
+ import { Transaction, VersionedTransaction } from '@solana/web3.js';
2
3
  export declare class DynamicSvmWalletClient extends DynamicWalletClient {
3
4
  readonly chainName = "SOL";
4
5
  accountAddress?: string;
@@ -19,7 +20,8 @@ export declare class DynamicSvmWalletClient extends DynamicWalletClient {
19
20
  password?: string;
20
21
  }): Promise<{
21
22
  accountAddress: string;
22
- rawPublicKey: Uint8Array | string;
23
+ rawPublicKey: Uint8Array;
24
+ clientKeyShares: ClientKeyShare[];
23
25
  }>;
24
26
  deriveAccountAddress(rawPublicKey: string | Uint8Array): Promise<{
25
27
  accountAddress: string;
@@ -38,9 +40,9 @@ export declare class DynamicSvmWalletClient extends DynamicWalletClient {
38
40
  }): Promise<string>;
39
41
  signTransaction({ senderAddress, transaction, password, }: {
40
42
  senderAddress: string;
41
- transaction: string;
43
+ transaction: VersionedTransaction | Transaction;
42
44
  password?: string;
43
- }): Promise<string>;
45
+ }): Promise<VersionedTransaction | Transaction>;
44
46
  /**
45
47
  * Exports the private key for a given account address
46
48
  *
@@ -48,10 +50,11 @@ export declare class DynamicSvmWalletClient extends DynamicWalletClient {
48
50
  * @param password The password for encrypted backup shares
49
51
  * @returns The private key
50
52
  */
51
- exportPrivateKey({ accountAddress, password, }: {
53
+ exportPrivateKey({ accountAddress, displayContainer, password, }: {
52
54
  accountAddress: string;
55
+ displayContainer: HTMLElement;
53
56
  password?: string;
54
- }): Promise<string>;
57
+ }): Promise<void>;
55
58
  /**
56
59
  * Exports the private key for a given account address
57
60
  *
@@ -91,7 +94,8 @@ export declare class DynamicSvmWalletClient extends DynamicWalletClient {
91
94
  }): Promise<{
92
95
  accountAddress: string;
93
96
  rawPublicKey: Uint8Array | undefined;
97
+ clientKeyShares: ClientKeyShare[];
94
98
  }>;
95
99
  getSvmWallets(): Promise<any>;
96
100
  }
97
- //# sourceMappingURL=client.d.ts.map
101
+ //# sourceMappingURL=svm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svm.d.ts","sourceRoot":"","sources":["../../src/svm/svm.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EAGzB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAEL,WAAW,EACX,oBAAoB,EAErB,MAAM,iBAAiB,CAAC;AAIzB,qBAAa,sBAAuB,SAAQ,mBAAmB;IAC7D,QAAQ,CAAC,SAAS,SAAS;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;gBAEZ,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,kBAAkB,GACnB,EAAE;QACD,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B;IASD;;;;;OAKG;IACG,mBAAmB,CAAC,EACxB,wBAAwB,EACxB,QAAoB,GACrB,EAAE;QACD,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,UAAU,CAAC;QACzB,eAAe,EAAE,cAAc,EAAE,CAAC;KACnC,CAAC;IAgEI,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU;;;IAY5D;;;;;;OAMG;IACG,WAAW,CAAC,EAChB,OAAO,EACP,cAAc,EACd,QAAoB,GACrB,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IA2BK,eAAe,CAAC,EACpB,aAAa,EACb,WAAW,EACX,QAAoB,GACrB,EAAE;QACD,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,oBAAoB,GAAG,WAAW,CAAC;QAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,oBAAoB,GAAG,WAAW,CAAC;IAgD/C;;;;;;OAMG;IACG,gBAAgB,CAAC,EACrB,cAAc,EACd,gBAAgB,EAChB,QAAoB,GACrB,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,WAAW,CAAC;QAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IA8BD;;;;;OAKG;IACG,uBAAuB,CAAC,EAC5B,SAAS,EACT,cAAc,GACf,EAAE;QACD,SAAS,EAAE,mBAAmB,EAAE,CAAC;QACjC,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB;;;IASD;;;;;OAKG;IACH,yBAAyB,CAAC,UAAU,EAAE,MAAM;IAM5C,0BAA0B,CAAC,UAAU,EAAE,MAAM;IAQ7C,eAAe,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM;IAI9C;;;;;;;;OAQG;IACG,gBAAgB,CAAC,EACrB,UAAU,EACV,SAAS,EACT,wBAAwB,EACxB,QAAoB,EACpB,OAAO,GACR,EAAE;QACD,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;KAClC,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,UAAU,GAAG,SAAS,CAAC;QACrC,eAAe,EAAE,cAAc,EAAE,CAAC;KACnC,CAAC;IA6DI,aAAa;CAOpB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/svm/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EAGzB,MAAM,8BAA8B,CAAC;AAKtC,qBAAa,sBAAuB,SAAQ,mBAAmB;IAC7D,QAAQ,CAAC,SAAS,SAAS;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;gBAEZ,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,kBAAkB,GACnB,EAAE;QACD,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B;IASD;;;;;OAKG;IACG,mBAAmB,CAAC,EACxB,wBAAwB,EACxB,QAAoB,GACrB,EAAE;QACD,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,UAAU,GAAG,MAAM,CAAC;KACnC,CAAC;IA2DI,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU;;;IAY5D;;;;;;OAMG;IACG,WAAW,CAAC,EAChB,OAAO,EACP,cAAc,EACd,QAAoB,GACrB,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IA2BK,eAAe,CAAC,EACpB,aAAa,EACb,WAAW,EACX,QAAoB,GACrB,EAAE;QACD,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,MAAM,CAAC;IA6BnB;;;;;;OAMG;IACG,gBAAgB,CAAC,EACrB,cAAc,EACd,QAAoB,GACrB,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBnB;;;;;OAKG;IACG,uBAAuB,CAAC,EAC5B,SAAS,EACT,cAAc,GACf,EAAE;QACD,SAAS,EAAE,mBAAmB,EAAE,CAAC;QACjC,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB;;;IASD;;;;;OAKG;IACH,yBAAyB,CAAC,UAAU,EAAE,MAAM;IAM5C,0BAA0B,CAAC,UAAU,EAAE,MAAM;IAQ7C,eAAe,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM;IAI9C;;;;;;;;OAQG;IACG,gBAAgB,CAAC,EACrB,UAAU,EACV,SAAS,EACT,wBAAwB,EACxB,QAAoB,EACpB,OAAO,GACR,EAAE;QACD,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;KAClC,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,UAAU,GAAG,SAAS,CAAC;KACtC,CAAC;IAwDI,aAAa;CAOpB"}