viem 2.47.5 → 2.47.10

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 (203) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/_cjs/actions/public/verifyHash.js +16 -6
  3. package/_cjs/actions/public/verifyHash.js.map +1 -1
  4. package/_cjs/actions/wallet/prepareTransactionRequest.js +14 -1
  5. package/_cjs/actions/wallet/prepareTransactionRequest.js.map +1 -1
  6. package/_cjs/actions/wallet/sendTransaction.js +2 -2
  7. package/_cjs/actions/wallet/sendTransaction.js.map +1 -1
  8. package/_cjs/actions/wallet/waitForCallsStatus.js.map +1 -1
  9. package/_cjs/chains/definitions/battlechainTestnet.js +26 -0
  10. package/_cjs/chains/definitions/battlechainTestnet.js.map +1 -0
  11. package/_cjs/chains/definitions/eden.js +32 -0
  12. package/_cjs/chains/definitions/eden.js.map +1 -0
  13. package/_cjs/chains/definitions/gensyn.js +29 -0
  14. package/_cjs/chains/definitions/gensyn.js.map +1 -0
  15. package/_cjs/chains/definitions/igra.js +26 -0
  16. package/_cjs/chains/definitions/igra.js.map +1 -0
  17. package/_cjs/chains/definitions/katana.js +6 -0
  18. package/_cjs/chains/definitions/katana.js.map +1 -1
  19. package/_cjs/chains/definitions/megaeth.js +25 -3
  20. package/_cjs/chains/definitions/megaeth.js.map +1 -1
  21. package/_cjs/chains/definitions/mezo.js +23 -0
  22. package/_cjs/chains/definitions/mezo.js.map +1 -0
  23. package/_cjs/chains/definitions/mezoTestnet.js +30 -0
  24. package/_cjs/chains/definitions/mezoTestnet.js.map +1 -0
  25. package/_cjs/chains/definitions/radius.js +22 -0
  26. package/_cjs/chains/definitions/radius.js.map +1 -0
  27. package/_cjs/chains/definitions/radiusTestnet.js +22 -0
  28. package/_cjs/chains/definitions/radiusTestnet.js.map +1 -0
  29. package/_cjs/chains/definitions/tempoDevnet.js +1 -0
  30. package/_cjs/chains/definitions/tempoDevnet.js.map +1 -1
  31. package/_cjs/chains/definitions/tempoLocalnet.js +1 -0
  32. package/_cjs/chains/definitions/tempoLocalnet.js.map +1 -1
  33. package/_cjs/chains/definitions/tempoModerato.js +1 -1
  34. package/_cjs/chains/definitions/tempoModerato.js.map +1 -1
  35. package/_cjs/chains/index.js +32 -17
  36. package/_cjs/chains/index.js.map +1 -1
  37. package/_cjs/errors/version.js +1 -1
  38. package/_cjs/errors/version.js.map +1 -1
  39. package/_cjs/tempo/Abis.js +45 -0
  40. package/_cjs/tempo/Abis.js.map +1 -1
  41. package/_cjs/tempo/Account.js +1 -3
  42. package/_cjs/tempo/Account.js.map +1 -1
  43. package/_cjs/tempo/Hardfork.js +18 -0
  44. package/_cjs/tempo/Hardfork.js.map +1 -0
  45. package/_cjs/tempo/Transaction.js +1 -0
  46. package/_cjs/tempo/Transaction.js.map +1 -1
  47. package/_cjs/tempo/actions/accessKey.js +26 -2
  48. package/_cjs/tempo/actions/accessKey.js.map +1 -1
  49. package/_cjs/tempo/actions/token.js +2 -1
  50. package/_cjs/tempo/actions/token.js.map +1 -1
  51. package/_cjs/tempo/chainConfig.js +44 -8
  52. package/_cjs/tempo/chainConfig.js.map +1 -1
  53. package/_cjs/tempo/index.js +2 -1
  54. package/_cjs/tempo/index.js.map +1 -1
  55. package/_cjs/utils/rpc/http.js +3 -0
  56. package/_cjs/utils/rpc/http.js.map +1 -1
  57. package/_esm/actions/public/verifyHash.js +17 -7
  58. package/_esm/actions/public/verifyHash.js.map +1 -1
  59. package/_esm/actions/wallet/prepareTransactionRequest.js +14 -1
  60. package/_esm/actions/wallet/prepareTransactionRequest.js.map +1 -1
  61. package/_esm/actions/wallet/sendTransaction.js +2 -2
  62. package/_esm/actions/wallet/sendTransaction.js.map +1 -1
  63. package/_esm/actions/wallet/waitForCallsStatus.js.map +1 -1
  64. package/_esm/chains/definitions/battlechainTestnet.js +23 -0
  65. package/_esm/chains/definitions/battlechainTestnet.js.map +1 -0
  66. package/_esm/chains/definitions/eden.js +29 -0
  67. package/_esm/chains/definitions/eden.js.map +1 -0
  68. package/_esm/chains/definitions/gensyn.js +26 -0
  69. package/_esm/chains/definitions/gensyn.js.map +1 -0
  70. package/_esm/chains/definitions/igra.js +23 -0
  71. package/_esm/chains/definitions/igra.js.map +1 -0
  72. package/_esm/chains/definitions/katana.js +6 -0
  73. package/_esm/chains/definitions/katana.js.map +1 -1
  74. package/_esm/chains/definitions/megaeth.js +25 -3
  75. package/_esm/chains/definitions/megaeth.js.map +1 -1
  76. package/_esm/chains/definitions/mezo.js +20 -0
  77. package/_esm/chains/definitions/mezo.js.map +1 -0
  78. package/_esm/chains/definitions/mezoTestnet.js +27 -0
  79. package/_esm/chains/definitions/mezoTestnet.js.map +1 -0
  80. package/_esm/chains/definitions/radius.js +19 -0
  81. package/_esm/chains/definitions/radius.js.map +1 -0
  82. package/_esm/chains/definitions/radiusTestnet.js +19 -0
  83. package/_esm/chains/definitions/radiusTestnet.js.map +1 -0
  84. package/_esm/chains/definitions/tempoDevnet.js +1 -0
  85. package/_esm/chains/definitions/tempoDevnet.js.map +1 -1
  86. package/_esm/chains/definitions/tempoLocalnet.js +1 -0
  87. package/_esm/chains/definitions/tempoLocalnet.js.map +1 -1
  88. package/_esm/chains/definitions/tempoModerato.js +1 -1
  89. package/_esm/chains/definitions/tempoModerato.js.map +1 -1
  90. package/_esm/chains/index.js +10 -7
  91. package/_esm/chains/index.js.map +1 -1
  92. package/_esm/errors/version.js +1 -1
  93. package/_esm/errors/version.js.map +1 -1
  94. package/_esm/tempo/Abis.js +45 -0
  95. package/_esm/tempo/Abis.js.map +1 -1
  96. package/_esm/tempo/Account.js +1 -5
  97. package/_esm/tempo/Account.js.map +1 -1
  98. package/_esm/tempo/Hardfork.js +15 -0
  99. package/_esm/tempo/Hardfork.js.map +1 -0
  100. package/_esm/tempo/Transaction.js +1 -0
  101. package/_esm/tempo/Transaction.js.map +1 -1
  102. package/_esm/tempo/actions/accessKey.js +34 -3
  103. package/_esm/tempo/actions/accessKey.js.map +1 -1
  104. package/_esm/tempo/actions/token.js +2 -1
  105. package/_esm/tempo/actions/token.js.map +1 -1
  106. package/_esm/tempo/chainConfig.js +52 -11
  107. package/_esm/tempo/chainConfig.js.map +1 -1
  108. package/_esm/tempo/index.js +1 -0
  109. package/_esm/tempo/index.js.map +1 -1
  110. package/_esm/utils/rpc/http.js +5 -0
  111. package/_esm/utils/rpc/http.js.map +1 -1
  112. package/_types/actions/public/verifyHash.d.ts +2 -0
  113. package/_types/actions/public/verifyHash.d.ts.map +1 -1
  114. package/_types/actions/wallet/prepareTransactionRequest.d.ts.map +1 -1
  115. package/_types/chains/definitions/battlechainTestnet.d.ts +441 -0
  116. package/_types/chains/definitions/battlechainTestnet.d.ts.map +1 -0
  117. package/_types/chains/definitions/eden.d.ts +46 -0
  118. package/_types/chains/definitions/eden.d.ts.map +1 -0
  119. package/_types/chains/definitions/gensyn.d.ts +45 -0
  120. package/_types/chains/definitions/gensyn.d.ts.map +1 -0
  121. package/_types/chains/definitions/igra.d.ts +48 -0
  122. package/_types/chains/definitions/igra.d.ts.map +1 -0
  123. package/_types/chains/definitions/katana.d.ts +6 -9
  124. package/_types/chains/definitions/katana.d.ts.map +1 -1
  125. package/_types/chains/definitions/megaeth.d.ts +274 -6
  126. package/_types/chains/definitions/megaeth.d.ts.map +1 -1
  127. package/_types/chains/definitions/mezo.d.ts +48 -0
  128. package/_types/chains/definitions/mezo.d.ts.map +1 -0
  129. package/_types/chains/definitions/mezoTestnet.d.ts +45 -0
  130. package/_types/chains/definitions/mezoTestnet.d.ts.map +1 -0
  131. package/_types/chains/definitions/radius.d.ts +48 -0
  132. package/_types/chains/definitions/radius.d.ts.map +1 -0
  133. package/_types/chains/definitions/radiusTestnet.d.ts +48 -0
  134. package/_types/chains/definitions/radiusTestnet.d.ts.map +1 -0
  135. package/_types/chains/definitions/tempo.d.ts +35 -32
  136. package/_types/chains/definitions/tempo.d.ts.map +1 -1
  137. package/_types/chains/definitions/tempoDevnet.d.ts +37 -32
  138. package/_types/chains/definitions/tempoDevnet.d.ts.map +1 -1
  139. package/_types/chains/definitions/tempoLocalnet.d.ts +37 -32
  140. package/_types/chains/definitions/tempoLocalnet.d.ts.map +1 -1
  141. package/_types/chains/definitions/tempoModerato.d.ts +37 -34
  142. package/_types/chains/definitions/tempoModerato.d.ts.map +1 -1
  143. package/_types/chains/index.d.ts +10 -7
  144. package/_types/chains/index.d.ts.map +1 -1
  145. package/_types/errors/version.d.ts +1 -1
  146. package/_types/errors/version.d.ts.map +1 -1
  147. package/_types/tempo/Abis.d.ts +75 -0
  148. package/_types/tempo/Abis.d.ts.map +1 -1
  149. package/_types/tempo/Account.d.ts.map +1 -1
  150. package/_types/tempo/Decorator.d.ts +2 -2
  151. package/_types/tempo/Hardfork.d.ts +5 -0
  152. package/_types/tempo/Hardfork.d.ts.map +1 -0
  153. package/_types/tempo/Transaction.d.ts +7 -6
  154. package/_types/tempo/Transaction.d.ts.map +1 -1
  155. package/_types/tempo/actions/accessKey.d.ts +106 -3
  156. package/_types/tempo/actions/accessKey.d.ts.map +1 -1
  157. package/_types/tempo/actions/reward.d.ts +108 -0
  158. package/_types/tempo/actions/reward.d.ts.map +1 -1
  159. package/_types/tempo/actions/token.d.ts +828 -18
  160. package/_types/tempo/actions/token.d.ts.map +1 -1
  161. package/_types/tempo/chainConfig.d.ts +18 -16
  162. package/_types/tempo/chainConfig.d.ts.map +1 -1
  163. package/_types/tempo/index.d.ts +1 -0
  164. package/_types/tempo/index.d.ts.map +1 -1
  165. package/_types/utils/rpc/http.d.ts.map +1 -1
  166. package/actions/public/verifyHash.ts +23 -9
  167. package/actions/wallet/prepareTransactionRequest.ts +14 -1
  168. package/actions/wallet/sendTransaction.ts +2 -2
  169. package/actions/wallet/waitForCallsStatus.ts +1 -1
  170. package/chains/definitions/battlechainTestnet.ts +24 -0
  171. package/chains/definitions/eden.ts +29 -0
  172. package/chains/definitions/gensyn.ts +26 -0
  173. package/chains/definitions/igra.ts +23 -0
  174. package/chains/definitions/katana.ts +6 -0
  175. package/chains/definitions/megaeth.ts +26 -3
  176. package/chains/definitions/mezo.ts +20 -0
  177. package/chains/definitions/mezoTestnet.ts +27 -0
  178. package/chains/definitions/radius.ts +19 -0
  179. package/chains/definitions/radiusTestnet.ts +19 -0
  180. package/chains/definitions/tempoDevnet.ts +1 -0
  181. package/chains/definitions/tempoLocalnet.ts +1 -0
  182. package/chains/definitions/tempoModerato.ts +1 -1
  183. package/chains/index.ts +13 -8
  184. package/errors/version.ts +1 -1
  185. package/package.json +2 -2
  186. package/tempo/Abis.ts +45 -0
  187. package/tempo/Account.ts +1 -4
  188. package/tempo/Decorator.ts +2 -2
  189. package/tempo/Hardfork.ts +17 -0
  190. package/tempo/Transaction.ts +8 -7
  191. package/tempo/actions/accessKey.ts +40 -9
  192. package/tempo/actions/token.ts +2 -1
  193. package/tempo/chainConfig.ts +59 -15
  194. package/tempo/index.ts +1 -0
  195. package/tsconfig.json +1 -1
  196. package/utils/rpc/http.ts +8 -0
  197. package/_cjs/chains/definitions/tempoAndantino.js +0 -28
  198. package/_cjs/chains/definitions/tempoAndantino.js.map +0 -1
  199. package/_esm/chains/definitions/tempoAndantino.js +0 -25
  200. package/_esm/chains/definitions/tempoAndantino.js.map +0 -1
  201. package/_types/chains/definitions/tempoAndantino.d.ts +0 -918
  202. package/_types/chains/definitions/tempoAndantino.d.ts.map +0 -1
  203. package/chains/definitions/tempoAndantino.ts +0 -25
@@ -1,3 +1,6 @@
1
+ import * as Address from 'ox/Address'
2
+ import * as Hex from 'ox/Hex'
3
+ import * as PublicKey from 'ox/PublicKey'
1
4
  import { SignatureEnvelope, type TokenId } from 'ox/tempo'
2
5
  import { getCode } from '../actions/public/getCode.js'
3
6
  import { verifyHash } from '../actions/public/verifyHash.js'
@@ -8,9 +11,12 @@ import { defineTransaction } from '../utils/formatters/transaction.js'
8
11
  import { defineTransactionReceipt } from '../utils/formatters/transactionReceipt.js'
9
12
  import { defineTransactionRequest } from '../utils/formatters/transactionRequest.js'
10
13
  import { getAction } from '../utils/getAction.js'
14
+ import { keccak256 } from '../utils/hash/keccak256.js'
11
15
  import type { SerializeTransactionFn } from '../utils/transaction/serializeTransaction.js'
12
16
  import type { Account } from './Account.js'
17
+ import { getMetadata } from './actions/accessKey.js'
13
18
  import * as Formatters from './Formatters.js'
19
+ import type { Hardfork } from './Hardfork.js'
14
20
  import * as Concurrent from './internal/concurrent.js'
15
21
  import * as Transaction from './Transaction.js'
16
22
 
@@ -20,6 +26,7 @@ export const chainConfig = {
20
26
  blockTime: 1_000,
21
27
  extendSchema: extendSchema<{
22
28
  feeToken?: TokenId.TokenIdOrAddress | undefined
29
+ hardfork?: Hardfork | undefined
23
30
  }>(),
24
31
  formatters: {
25
32
  transaction: defineTransaction({
@@ -42,13 +49,15 @@ export const chainConfig = {
42
49
  | undefined
43
50
  }
44
51
 
45
- // FIXME: node does not account for fee payer + key authorization combinartion; bump gas for now.
52
+ // FIXME: node estimates gas with secp256k1 dummy sig + null feePayerSignature.
53
+ // Actual tx has larger keychain/webAuthn sigs + real fee payer sig, costing more intrinsic gas.
46
54
  if (phase === 'afterFillParameters') {
47
- if (
48
- request.feePayer &&
49
- request.keyAuthorization?.signature.type === 'webAuthn'
50
- )
51
- request.gas = (request.gas ?? 0n) + 20_000n
55
+ if (request.feePayer) {
56
+ if (request.keyAuthorization?.signature.type === 'webAuthn')
57
+ request.gas = (request.gas ?? 0n) + 20_000n
58
+ else if (request.account?.source === 'accessKey')
59
+ request.gas = (request.gas ?? 0n) + 10_000n
60
+ }
52
61
  return request as unknown as typeof r
53
62
  }
54
63
 
@@ -89,18 +98,53 @@ export const chainConfig = {
89
98
  Transaction.serialize(transaction, signature)) as SerializeTransactionFn,
90
99
  },
91
100
  async verifyHash(client, parameters) {
92
- const { address, hash, signature } = parameters
101
+ const { address, hash, signature, mode } = parameters
102
+
103
+ const envelope = (() => {
104
+ if (typeof signature !== 'string') return
105
+ try {
106
+ return SignatureEnvelope.deserialize(signature)
107
+ } catch {
108
+ return undefined
109
+ }
110
+ })()
93
111
 
94
112
  // `verifyHash` supports "signature envelopes" (a Tempo proposal) to natively verify arbitrary
95
113
  // envelope-compatible (WebAuthn, P256, etc.) signatures.
96
- // We can directly verify stateless, non-keychain signature envelopes without a
97
- // network request to the chain.
98
- if (
99
- typeof signature === 'string' &&
100
- signature.endsWith(SignatureEnvelope.magicBytes.slice(2))
101
- ) {
102
- const envelope = SignatureEnvelope.deserialize(signature)
103
- if (envelope.type !== 'keychain') {
114
+ if (envelope) {
115
+ // Access key (keychain) signature verification: check the key is
116
+ // authorized, not expired, and not revoked on the AccountKeychain.
117
+ if (envelope?.type === 'keychain' && mode === 'allowAccessKey') {
118
+ const accessKeyAddress = Address.fromPublicKey(
119
+ PublicKey.from(envelope.inner.publicKey as PublicKey.PublicKey),
120
+ )
121
+
122
+ const keyInfo = await getMetadata(client, {
123
+ account: address,
124
+ accessKey: accessKeyAddress,
125
+ blockNumber: parameters.blockNumber,
126
+ blockTag: parameters.blockTag,
127
+ } as never)
128
+
129
+ if (keyInfo.isRevoked) return false
130
+ if (keyInfo.expiry <= BigInt(Math.floor(Date.now() / 1000)))
131
+ return false
132
+
133
+ // For v2 keychain envelopes, the inner signature signs
134
+ // keccak256(0x04 || hash || userAddress).
135
+ const innerPayload =
136
+ envelope.version === 'v2'
137
+ ? keccak256(Hex.concat('0x04', hash, address))
138
+ : hash
139
+ return SignatureEnvelope.verify(envelope.inner, {
140
+ address: accessKeyAddress,
141
+ payload: innerPayload,
142
+ })
143
+ }
144
+
145
+ // Stateless, non-keychain signature envelopes (P256, WebAuthn) can be
146
+ // verified directly without a network request.
147
+ if (envelope.type === 'p256' || envelope.type === 'webAuthn') {
104
148
  const code = await getCode(client, {
105
149
  address,
106
150
  blockNumber: parameters.blockNumber,
package/tempo/index.ts CHANGED
@@ -21,6 +21,7 @@ export {
21
21
  decorator as tempoActions,
22
22
  } from './Decorator.js'
23
23
  export * as Formatters from './Formatters.js'
24
+ export * as Hardfork from './Hardfork.js'
24
25
  export * as P256 from './P256.js'
25
26
  export * as Secp256k1 from './Secp256k1.js'
26
27
  export * as TokenIds from './TokenIds.js'
package/tsconfig.json CHANGED
@@ -5,6 +5,6 @@
5
5
  "compilerOptions": {
6
6
  "composite": true,
7
7
  "noEmit": true,
8
- "baseUrl": ".",
8
+ "types": ["node"]
9
9
  }
10
10
  }
package/utils/rpc/http.ts CHANGED
@@ -155,6 +155,14 @@ export function getHttpRpcClient(
155
155
  }
156
156
 
157
157
  if (!response.ok) {
158
+ // If the response body contains a valid JSON-RPC error, return it
159
+ // so it flows through the normal RPC error handling pipeline.
160
+ if (
161
+ typeof data.error?.code === 'number' &&
162
+ typeof data.error?.message === 'string'
163
+ )
164
+ return data
165
+
158
166
  throw new HttpRequestError({
159
167
  body,
160
168
  details: stringify(data.error) || response.statusText,
@@ -1,28 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.tempoAndantino = void 0;
4
- const chainConfig_js_1 = require("../../tempo/chainConfig.js");
5
- const defineChain_js_1 = require("../../utils/chain/defineChain.js");
6
- exports.tempoAndantino = (0, defineChain_js_1.defineChain)({
7
- ...chainConfig_js_1.chainConfig,
8
- id: 42429,
9
- blockExplorers: {
10
- default: {
11
- name: 'Tempo Explorer',
12
- url: 'https://explore.testnet.tempo.xyz',
13
- },
14
- },
15
- name: 'Tempo Testnet (Andantino)',
16
- nativeCurrency: {
17
- name: 'USD',
18
- symbol: 'USD',
19
- decimals: 6,
20
- },
21
- rpcUrls: {
22
- default: {
23
- http: ['https://rpc.testnet.tempo.xyz'],
24
- webSocket: ['wss://rpc.testnet.tempo.xyz'],
25
- },
26
- },
27
- });
28
- //# sourceMappingURL=tempoAndantino.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tempoAndantino.js","sourceRoot":"","sources":["../../../chains/definitions/tempoAndantino.ts"],"names":[],"mappings":";;;AAAA,+DAAwD;AACxD,qEAA8D;AAEjD,QAAA,cAAc,GAAiB,IAAA,4BAAW,EAAC;IACtD,GAAG,4BAAW;IACd,EAAE,EAAE,KAAK;IACT,cAAc,EAAE;QACd,OAAO,EAAE;YACP,IAAI,EAAE,gBAAgB;YACtB,GAAG,EAAE,mCAAmC;SACzC;KACF;IACD,IAAI,EAAE,2BAA2B;IACjC,cAAc,EAAE;QACd,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,CAAC;KACZ;IACD,OAAO,EAAE;QACP,OAAO,EAAE;YACP,IAAI,EAAE,CAAC,+BAA+B,CAAC;YACvC,SAAS,EAAE,CAAC,6BAA6B,CAAC;SAC3C;KACF;CACF,CAAC,CAAA"}
@@ -1,25 +0,0 @@
1
- import { chainConfig } from '../../tempo/chainConfig.js';
2
- import { defineChain } from '../../utils/chain/defineChain.js';
3
- export const tempoAndantino = /*#__PURE__*/ defineChain({
4
- ...chainConfig,
5
- id: 42429,
6
- blockExplorers: {
7
- default: {
8
- name: 'Tempo Explorer',
9
- url: 'https://explore.testnet.tempo.xyz',
10
- },
11
- },
12
- name: 'Tempo Testnet (Andantino)',
13
- nativeCurrency: {
14
- name: 'USD',
15
- symbol: 'USD',
16
- decimals: 6,
17
- },
18
- rpcUrls: {
19
- default: {
20
- http: ['https://rpc.testnet.tempo.xyz'],
21
- webSocket: ['wss://rpc.testnet.tempo.xyz'],
22
- },
23
- },
24
- });
25
- //# sourceMappingURL=tempoAndantino.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tempoAndantino.js","sourceRoot":"","sources":["../../../chains/definitions/tempoAndantino.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAE9D,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC,WAAW,CAAC;IACtD,GAAG,WAAW;IACd,EAAE,EAAE,KAAK;IACT,cAAc,EAAE;QACd,OAAO,EAAE;YACP,IAAI,EAAE,gBAAgB;YACtB,GAAG,EAAE,mCAAmC;SACzC;KACF;IACD,IAAI,EAAE,2BAA2B;IACjC,cAAc,EAAE;QACd,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,CAAC;KACZ;IACD,OAAO,EAAE;QACP,OAAO,EAAE;YACP,IAAI,EAAE,CAAC,+BAA+B,CAAC;YACvC,SAAS,EAAE,CAAC,6BAA6B,CAAC;SAC3C;KACF;CACF,CAAC,CAAA"}