@dynamic-labs-wallet/svm 0.0.46 → 0.0.47

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
@@ -5,6 +5,17 @@ var bs58 = require('bs58');
5
5
  var web3_js = require('@solana/web3.js');
6
6
  require('@dynamic-labs-wallet/core');
7
7
 
8
+ function _extends() {
9
+ _extends = Object.assign || function assign(target) {
10
+ for(var i = 1; i < arguments.length; i++){
11
+ var source = arguments[i];
12
+ for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];
13
+ }
14
+ return target;
15
+ };
16
+ return _extends.apply(this, arguments);
17
+ }
18
+
8
19
  const addSignatureToTransaction = ({ transaction, signature, signerPublicKey })=>{
9
20
  try {
10
21
  transaction.addSignature(signerPublicKey, Buffer.from(signature));
@@ -15,6 +26,8 @@ const addSignatureToTransaction = ({ transaction, signature, signerPublicKey })=
15
26
  }
16
27
  };
17
28
 
29
+ const ERROR_CREATE_WALLET_ACCOUNT = 'Error creating svm wallet account';
30
+
18
31
  class DynamicSvmWalletClient extends browser.DynamicWalletClient {
19
32
  /**
20
33
  * Creates a wallet account on the Solana chain
@@ -22,49 +35,38 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
22
35
  * @param thresholdSignatureScheme The threshold signature scheme to use
23
36
  * @returns The account address, public key hex, raw public key, and client key shares
24
37
  */ async createWalletAccount({ thresholdSignatureScheme, password = undefined }) {
25
- let ceremonyCompleted = false;
26
38
  try {
27
39
  const { rawPublicKey, clientKeyShares } = await this.keyGen({
28
40
  chainName: this.chainName,
29
41
  thresholdSignatureScheme,
30
- onCeremonyComplete: ()=>{
31
- ceremonyCompleted = true;
42
+ onCeremonyComplete: (accountAddress, walletId)=>{
43
+ // update wallet map
44
+ this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
45
+ accountAddress,
46
+ walletId,
47
+ chainName: this.chainName,
48
+ thresholdSignatureScheme,
49
+ clientKeySharesBackupInfo: browser.getClientKeyShareBackupInfo()
50
+ });
32
51
  }
33
52
  });
34
- // Wait for the ceremony to complete, timeout after 5 seconds
35
- await Promise.race([
36
- (async ()=>{
37
- while(!ceremonyCompleted){
38
- await new Promise((resolve)=>setTimeout(resolve, 100));
39
- }
40
- })(),
41
- browser.timeoutPromise({
42
- timeInMs: 5000,
43
- activity: 'Ceremony'
44
- })
45
- ]);
46
53
  if (!rawPublicKey || !(rawPublicKey instanceof Uint8Array)) {
47
54
  throw new Error('Raw public key is not a Uint8Array');
48
55
  }
49
56
  if (!clientKeyShares) {
50
57
  throw new Error('Error creating wallet account');
51
58
  }
52
- // Get EVM address from public key
53
59
  const { accountAddress } = await this.deriveAccountAddress(rawPublicKey);
54
- const refreshedUser = await this.apiClient.refreshUser();
55
- const newWallet = refreshedUser.user.verifiedCredentials.find((wallet)=>wallet.address === accountAddress);
56
- console.log('newWallet', newWallet);
57
- const newWalletId = newWallet.id;
58
- this.walletMap[accountAddress] = {
59
- accountAddress,
60
- walletId: newWalletId,
61
- chainName: this.chainName,
62
- clientKeyShares: clientKeyShares,
63
- thresholdSignatureScheme,
64
- clientKeySharesBackupInfo: browser.getClientKeyShareBackupInfo()
65
- };
66
- await this.storeEncryptedBackupByWallet({
60
+ // Update client key shares in wallet map
61
+ // warning: this might result in race condition if `onCeremonyComplete` executes at the same time
62
+ // TODO: remove this once iframe handling for secret shares is implemented
63
+ this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
64
+ clientKeyShares
65
+ });
66
+ // Backup the new wallet without waiting for the promise to resolve
67
+ void this.storeEncryptedBackupByWalletWithRetry({
67
68
  accountAddress,
69
+ clientKeyShares,
68
70
  password
69
71
  });
70
72
  return {
@@ -73,8 +75,8 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
73
75
  clientKeyShares
74
76
  };
75
77
  } catch (error) {
76
- console.error(`Error creating ${this.chainName} wallet account`, error);
77
- throw new Error(`Error creating ${this.chainName} wallet account`);
78
+ this.logger.error(ERROR_CREATE_WALLET_ACCOUNT, error);
79
+ throw new Error(ERROR_CREATE_WALLET_ACCOUNT);
78
80
  }
79
81
  }
80
82
  // Function to properly derive account address
@@ -237,7 +239,6 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
237
239
  * @param password The password for encrypted backup shares
238
240
  * @returns The account address, raw public key, and client key shares
239
241
  */ async importPrivateKey({ privateKey, chainName, thresholdSignatureScheme, password = undefined, onError }) {
240
- let ceremonyCompleted = false;
241
242
  //get public key from private key
242
243
  const publicKey = this.getPublicKeyFromPrivateKey(privateKey);
243
244
  const formattedPrivateKey = await this.decodePrivateKeyForSolana(privateKey);
@@ -246,22 +247,17 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
246
247
  privateKey: formattedPrivateKey,
247
248
  thresholdSignatureScheme,
248
249
  onError,
249
- onCeremonyComplete: ()=>{
250
- ceremonyCompleted = true;
250
+ onCeremonyComplete: (accountAddress, walletId)=>{
251
+ // update wallet map
252
+ this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
253
+ accountAddress,
254
+ walletId,
255
+ chainName: this.chainName,
256
+ thresholdSignatureScheme,
257
+ clientKeySharesBackupInfo: browser.getClientKeyShareBackupInfo()
258
+ });
251
259
  }
252
260
  });
253
- // Wait for the ceremony to complete, timeout after 5 seconds
254
- await Promise.race([
255
- (async ()=>{
256
- while(!ceremonyCompleted){
257
- await new Promise((resolve)=>setTimeout(resolve, 100));
258
- }
259
- })(),
260
- browser.timeoutPromise({
261
- timeInMs: 5000,
262
- activity: 'Ceremony'
263
- })
264
- ]);
265
261
  if (!rawPublicKey || !clientKeyShares) {
266
262
  throw new Error('Error creating wallet account');
267
263
  }
@@ -269,19 +265,16 @@ class DynamicSvmWalletClient extends browser.DynamicWalletClient {
269
265
  if (accountAddress !== publicKey) {
270
266
  throw new Error(`Public key mismatch: derived address ${accountAddress} !== public key ${publicKey}`);
271
267
  }
272
- const refreshedUser = await this.apiClient.refreshUser();
273
- const newWallet = refreshedUser.user.verifiedCredentials.find((wallet)=>wallet.address === accountAddress);
274
- const newWalletId = newWallet.id;
275
- this.walletMap[accountAddress] = {
268
+ // Update client key shares in wallet map
269
+ // warning: this might result in race condition if `onCeremonyComplete` executes at the same time
270
+ // TODO: remove this once iframe handling for secret shares is implemented
271
+ this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
272
+ clientKeyShares
273
+ });
274
+ // Backup the new wallet without waiting for the promise to resolve
275
+ void this.storeEncryptedBackupByWalletWithRetry({
276
276
  accountAddress,
277
- walletId: newWalletId,
278
- chainName: this.chainName,
279
277
  clientKeyShares,
280
- thresholdSignatureScheme,
281
- clientKeySharesBackupInfo: browser.getClientKeyShareBackupInfo()
282
- };
283
- await this.storeEncryptedBackupByWallet({
284
- accountAddress,
285
278
  password
286
279
  });
287
280
  return {
package/index.esm.js CHANGED
@@ -1,8 +1,19 @@
1
- import { DynamicWalletClient, timeoutPromise, getClientKeyShareBackupInfo, WalletOperation } from '@dynamic-labs-wallet/browser';
1
+ import { DynamicWalletClient, getClientKeyShareBackupInfo, WalletOperation } from '@dynamic-labs-wallet/browser';
2
2
  import bs58 from 'bs58';
3
3
  import { VersionedTransaction, PublicKey, Keypair } from '@solana/web3.js';
4
4
  import '@dynamic-labs-wallet/core';
5
5
 
6
+ function _extends() {
7
+ _extends = Object.assign || function assign(target) {
8
+ for(var i = 1; i < arguments.length; i++){
9
+ var source = arguments[i];
10
+ for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];
11
+ }
12
+ return target;
13
+ };
14
+ return _extends.apply(this, arguments);
15
+ }
16
+
6
17
  const addSignatureToTransaction = ({ transaction, signature, signerPublicKey })=>{
7
18
  try {
8
19
  transaction.addSignature(signerPublicKey, Buffer.from(signature));
@@ -13,6 +24,8 @@ const addSignatureToTransaction = ({ transaction, signature, signerPublicKey })=
13
24
  }
14
25
  };
15
26
 
27
+ const ERROR_CREATE_WALLET_ACCOUNT = 'Error creating svm wallet account';
28
+
16
29
  class DynamicSvmWalletClient extends DynamicWalletClient {
17
30
  /**
18
31
  * Creates a wallet account on the Solana chain
@@ -20,49 +33,38 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
20
33
  * @param thresholdSignatureScheme The threshold signature scheme to use
21
34
  * @returns The account address, public key hex, raw public key, and client key shares
22
35
  */ async createWalletAccount({ thresholdSignatureScheme, password = undefined }) {
23
- let ceremonyCompleted = false;
24
36
  try {
25
37
  const { rawPublicKey, clientKeyShares } = await this.keyGen({
26
38
  chainName: this.chainName,
27
39
  thresholdSignatureScheme,
28
- onCeremonyComplete: ()=>{
29
- ceremonyCompleted = true;
40
+ onCeremonyComplete: (accountAddress, walletId)=>{
41
+ // update wallet map
42
+ this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
43
+ accountAddress,
44
+ walletId,
45
+ chainName: this.chainName,
46
+ thresholdSignatureScheme,
47
+ clientKeySharesBackupInfo: getClientKeyShareBackupInfo()
48
+ });
30
49
  }
31
50
  });
32
- // Wait for the ceremony to complete, timeout after 5 seconds
33
- await Promise.race([
34
- (async ()=>{
35
- while(!ceremonyCompleted){
36
- await new Promise((resolve)=>setTimeout(resolve, 100));
37
- }
38
- })(),
39
- timeoutPromise({
40
- timeInMs: 5000,
41
- activity: 'Ceremony'
42
- })
43
- ]);
44
51
  if (!rawPublicKey || !(rawPublicKey instanceof Uint8Array)) {
45
52
  throw new Error('Raw public key is not a Uint8Array');
46
53
  }
47
54
  if (!clientKeyShares) {
48
55
  throw new Error('Error creating wallet account');
49
56
  }
50
- // Get EVM address from public key
51
57
  const { accountAddress } = await this.deriveAccountAddress(rawPublicKey);
52
- const refreshedUser = await this.apiClient.refreshUser();
53
- const newWallet = refreshedUser.user.verifiedCredentials.find((wallet)=>wallet.address === accountAddress);
54
- console.log('newWallet', newWallet);
55
- const newWalletId = newWallet.id;
56
- this.walletMap[accountAddress] = {
57
- accountAddress,
58
- walletId: newWalletId,
59
- chainName: this.chainName,
60
- clientKeyShares: clientKeyShares,
61
- thresholdSignatureScheme,
62
- clientKeySharesBackupInfo: getClientKeyShareBackupInfo()
63
- };
64
- await this.storeEncryptedBackupByWallet({
58
+ // Update client key shares in wallet map
59
+ // warning: this might result in race condition if `onCeremonyComplete` executes at the same time
60
+ // TODO: remove this once iframe handling for secret shares is implemented
61
+ this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
62
+ clientKeyShares
63
+ });
64
+ // Backup the new wallet without waiting for the promise to resolve
65
+ void this.storeEncryptedBackupByWalletWithRetry({
65
66
  accountAddress,
67
+ clientKeyShares,
66
68
  password
67
69
  });
68
70
  return {
@@ -71,8 +73,8 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
71
73
  clientKeyShares
72
74
  };
73
75
  } catch (error) {
74
- console.error(`Error creating ${this.chainName} wallet account`, error);
75
- throw new Error(`Error creating ${this.chainName} wallet account`);
76
+ this.logger.error(ERROR_CREATE_WALLET_ACCOUNT, error);
77
+ throw new Error(ERROR_CREATE_WALLET_ACCOUNT);
76
78
  }
77
79
  }
78
80
  // Function to properly derive account address
@@ -235,7 +237,6 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
235
237
  * @param password The password for encrypted backup shares
236
238
  * @returns The account address, raw public key, and client key shares
237
239
  */ async importPrivateKey({ privateKey, chainName, thresholdSignatureScheme, password = undefined, onError }) {
238
- let ceremonyCompleted = false;
239
240
  //get public key from private key
240
241
  const publicKey = this.getPublicKeyFromPrivateKey(privateKey);
241
242
  const formattedPrivateKey = await this.decodePrivateKeyForSolana(privateKey);
@@ -244,22 +245,17 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
244
245
  privateKey: formattedPrivateKey,
245
246
  thresholdSignatureScheme,
246
247
  onError,
247
- onCeremonyComplete: ()=>{
248
- ceremonyCompleted = true;
248
+ onCeremonyComplete: (accountAddress, walletId)=>{
249
+ // update wallet map
250
+ this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
251
+ accountAddress,
252
+ walletId,
253
+ chainName: this.chainName,
254
+ thresholdSignatureScheme,
255
+ clientKeySharesBackupInfo: getClientKeyShareBackupInfo()
256
+ });
249
257
  }
250
258
  });
251
- // Wait for the ceremony to complete, timeout after 5 seconds
252
- await Promise.race([
253
- (async ()=>{
254
- while(!ceremonyCompleted){
255
- await new Promise((resolve)=>setTimeout(resolve, 100));
256
- }
257
- })(),
258
- timeoutPromise({
259
- timeInMs: 5000,
260
- activity: 'Ceremony'
261
- })
262
- ]);
263
259
  if (!rawPublicKey || !clientKeyShares) {
264
260
  throw new Error('Error creating wallet account');
265
261
  }
@@ -267,19 +263,16 @@ class DynamicSvmWalletClient extends DynamicWalletClient {
267
263
  if (accountAddress !== publicKey) {
268
264
  throw new Error(`Public key mismatch: derived address ${accountAddress} !== public key ${publicKey}`);
269
265
  }
270
- const refreshedUser = await this.apiClient.refreshUser();
271
- const newWallet = refreshedUser.user.verifiedCredentials.find((wallet)=>wallet.address === accountAddress);
272
- const newWalletId = newWallet.id;
273
- this.walletMap[accountAddress] = {
266
+ // Update client key shares in wallet map
267
+ // warning: this might result in race condition if `onCeremonyComplete` executes at the same time
268
+ // TODO: remove this once iframe handling for secret shares is implemented
269
+ this.walletMap[accountAddress] = _extends({}, this.walletMap[accountAddress] || {}, {
270
+ clientKeyShares
271
+ });
272
+ // Backup the new wallet without waiting for the promise to resolve
273
+ void this.storeEncryptedBackupByWalletWithRetry({
274
274
  accountAddress,
275
- walletId: newWalletId,
276
- chainName: this.chainName,
277
275
  clientKeyShares,
278
- thresholdSignatureScheme,
279
- clientKeySharesBackupInfo: getClientKeyShareBackupInfo()
280
- };
281
- await this.storeEncryptedBackupByWallet({
282
- accountAddress,
283
276
  password
284
277
  });
285
278
  return {
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@dynamic-labs-wallet/svm",
3
- "version": "0.0.46",
3
+ "version": "0.0.47",
4
4
  "license": "MIT",
5
5
  "dependencies": {
6
- "@dynamic-labs-wallet/browser": "0.0.46",
7
- "@dynamic-labs-wallet/core": "0.0.46",
6
+ "@dynamic-labs-wallet/browser": "0.0.47",
7
+ "@dynamic-labs-wallet/core": "0.0.47",
8
8
  "@solana/web3.js": "^1.98.0",
9
9
  "bs58": "^6.0.0"
10
10
  },
@@ -0,0 +1,2 @@
1
+ export declare const ERROR_CREATE_WALLET_ACCOUNT = "Error creating svm wallet account";
2
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/svm/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,sCAAsC,CAAC"}
@@ -1 +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,EAIzB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAEL,WAAW,EACX,oBAAoB,EAErB,MAAM,iBAAiB,CAAC;AAGzB,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;IAmEI,oBAAoB,CAAC,YAAY,EAAE,UAAU;;;IAOnD;;;;;;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;IA6CK,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;IA4C/C;;;;;;OAMG;IACG,gBAAgB,CAAC,EACrB,cAAc,EACd,QAAoB,GACrB,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;;;IAaD;;;;;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;IAoEI,aAAa;CAOpB"}
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;IAyDI,oBAAoB,CAAC,YAAY,EAAE,UAAU;;;IAOnD;;;;;;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;IAiDK,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,QAAoB,GACrB,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;;;IAaD;;;;;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;IA4DI,aAAa;CAOpB"}