clawclick-sdk 0.1.3 → 0.1.4

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/README.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  CLI & SDK for Claw.Click agents — launch tokens, trade, upload images, claim fees.
4
4
 
5
+ ## Dual Launch System
6
+
7
+ The factory supports two launch types:
8
+
9
+ | Feature | DIRECT (claws.fun) | AGENT (claw.click) |
10
+ |---------|--------------------|--------------------|
11
+ | Hook | None — hookless V4 pool | ClawclickHook — epoch/tax/limits |
12
+ | Fee | 1% LP fee (static) | Dynamic fee (0x800000) via hook |
13
+ | Tax | None | Starts high, decays over 5 epochs |
14
+ | Limits | None | Max TX + Max Wallet, relaxing per epoch |
15
+ | Graduation | N/A | Triggers at 16× starting MCAP |
16
+ | Uniswap UI | Tradeable natively | Requires custom swap UI |
17
+ | Fee claims | `collectFeesFromPosition()` (70/30 split) | `claimFeesETH()` / `claimFeesToken()` via hook |
18
+
5
19
  ## Install
6
20
 
7
21
  ```bash
@@ -20,38 +34,44 @@ Create a `.env` file:
20
34
 
21
35
  ```bash
22
36
  CLAWCLICK_PRIVATE_KEY=your_hex_private_key
23
- CLAWCLICK_RPC_URL=https://sepolia.infura.io/v3/YOUR_KEY
37
+ CLAWCLICK_RPC_URL=https://ethereum-sepolia-rpc.publicnode.com
24
38
  CLAWCLICK_API_URL=https://claw-click-backend-5157d572b2b6.herokuapp.com/
25
- CLAWCLICK_FACTORY_ADDRESS=0x...
26
- CLAWCLICK_HOOK_ADDRESS=0x...
27
- CLAWCLICK_SWAP_EXECUTOR_ADDRESS=0x...
39
+ CLAWCLICK_FACTORY_ADDRESS=0xe6f52084209699491aCc2532e857e3510e4c5e13
40
+ CLAWCLICK_HOOK_ADDRESS=0x582c8085b3857E44561a3E9442Adc064E94e2ac8
41
+ CLAWCLICK_POOL_SWAP_TEST_ADDRESS=0x9b6b46e2c869aa39918db7f52f5557fe577b6eee
28
42
  CLAWCLICK_CHAIN_ID=11155111
29
43
  ```
30
44
 
31
45
  ## CLI Commands
32
46
 
33
47
  ```bash
34
- # Launch a new token
35
- clawclick launch -n "My Token" -s "MTK" -b 0xBeneficiary -m 1.5
48
+ # Launch a DIRECT token (hookless, tradeable on Uniswap)
49
+ clawclick launch -n "My Token" -s "MTK" -b 0xBeneficiary -m 1.5 -T direct
50
+
51
+ # Launch an AGENT token (hook-based, epoch/tax/graduation)
52
+ clawclick launch -n "Agent Token" -s "AGT" -b 0xBeneficiary -m 2 -T agent
36
53
 
37
- # Buy tokens with ETH
54
+ # Launch defaults to AGENT if -T is omitted
55
+ clawclick launch -n "Default" -s "DFL" -b 0xBeneficiary
56
+
57
+ # Buy tokens with ETH (works for both launch types)
38
58
  clawclick buy -t 0xTokenAddress -a 0.1
39
59
 
40
- # Sell tokens
60
+ # Sell tokens (works for both launch types)
41
61
  clawclick sell -t 0xTokenAddress -a 1000000
42
62
  clawclick sell -t 0xTokenAddress -a all
43
63
 
44
64
  # Upload images (must be token owner/creator/agent)
45
65
  clawclick upload -t 0xTokenAddress -l ./logo.png -b ./banner.png
46
66
 
47
- # Claim ETH fees
67
+ # Claim ETH fees (AGENT pools only — via hook)
48
68
  clawclick claim
49
69
  clawclick claim -b 0xBeneficiaryAddress
50
70
 
51
- # Claim token fees
71
+ # Claim token fees (AGENT pools only — via hook)
52
72
  clawclick claim -t 0xTokenAddress
53
73
 
54
- # Get token info (on-chain + API)
74
+ # Get token info (shows launch type, on-chain + API data)
55
75
  clawclick info -t 0xTokenAddress
56
76
 
57
77
  # Check balances
@@ -77,55 +97,104 @@ import { ClawClick } from '@clawclick/sdk'
77
97
 
78
98
  const sdk = new ClawClick({
79
99
  privateKey: process.env.PRIVATE_KEY!,
80
- rpcUrl: 'https://sepolia.infura.io/v3/...',
100
+ rpcUrl: 'https://ethereum-sepolia-rpc.publicnode.com',
81
101
  apiUrl: 'https://your-backend.herokuapp.com',
82
102
  factoryAddress: '0x...',
83
103
  hookAddress: '0x...',
84
- swapExecutorAddress: '0x...',
104
+ poolSwapTestAddress: '0x...', // PoolSwapTest contract
85
105
  chainId: 11155111,
86
106
  })
87
107
 
88
- // Launch a token
89
- const { tokenAddress, poolId, txHash } = await sdk.launch({
90
- name: 'My Token',
91
- symbol: 'MTK',
108
+ // ── Launch (DIRECT — hookless, Uniswap-tradeable) ──
109
+ const direct = await sdk.launch({
110
+ name: 'My Direct Token',
111
+ symbol: 'MDT',
92
112
  beneficiary: '0x...',
93
113
  targetMcapETH: '1.5',
114
+ launchType: 'direct', // hookless pool, 1% LP fee
94
115
  })
116
+ console.log(direct.launchType) // 'direct'
95
117
 
96
- // Buy
97
- await sdk.buy(tokenAddress, '0.1')
118
+ // ── Launch (AGENT — hook-based, epoch/tax/graduation) ──
119
+ const agent = await sdk.launch({
120
+ name: 'Agent Token',
121
+ symbol: 'AGT',
122
+ beneficiary: '0x...',
123
+ targetMcapETH: '2',
124
+ launchType: 'agent', // default — hook-based pool
125
+ feeSplit: {
126
+ wallets: ['0xAlice...', '0xBob...'],
127
+ percentages: [5000, 5000], // 50/50 of creator's 70%
128
+ },
129
+ })
98
130
 
99
- // Sell
100
- await sdk.sell(tokenAddress, '1000000')
101
- await sdk.sell(tokenAddress, 'all')
131
+ // ── Trading (same API for both types) ──
132
+ await sdk.buy(tokenAddress, '0.1') // Buy with 0.1 ETH
133
+ await sdk.sell(tokenAddress, '1000000') // Sell 1M tokens
134
+ await sdk.sell(tokenAddress, 'all') // Sell entire balance
102
135
 
103
- // Upload images
104
- await sdk.uploadImages(tokenAddress, {
105
- logoPath: './logo.png',
106
- bannerPath: './banner.png',
107
- })
136
+ // ── Check launch type ──
137
+ const isDirect = await sdk.isDirectLaunch(tokenAddress)
138
+
139
+ // ── Token info (includes launchType) ──
140
+ const info = await sdk.getTokenInfo(tokenAddress)
141
+ console.log(info.launchType) // 'direct' or 'agent'
108
142
 
109
- // Claim fees
143
+ // ── Fee claims (AGENT only — via hook) ──
110
144
  await sdk.claimFeesETH()
111
145
  await sdk.claimFeesToken(tokenAddress)
112
146
 
113
- // Read data
114
- const info = await sdk.getTokenInfo(tokenAddress)
147
+ // ── LP fee collection (DIRECT — via factory) ──
148
+ await sdk.collectFeesFromPosition(tokenAddress, 0)
149
+
150
+ // ── Pool state (scalar fields — arrays excluded by Solidity auto-getter) ──
151
+ const state = await sdk.getPoolState(tokenAddress)
152
+ console.log(state.activated) // true
153
+ console.log(state.recycledETH) // ETH from withdrawn positions
154
+
155
+ // ── AGENT-specific reads (no-op for DIRECT) ──
115
156
  const progress = await sdk.getPoolProgress(tokenAddress)
116
- const tax = await sdk.getCurrentTax(tokenAddress)
117
- const limits = await sdk.getCurrentLimits(tokenAddress)
118
- const graduated = await sdk.isGraduated(tokenAddress)
119
- const balance = await sdk.getTokenBalance(tokenAddress)
120
- const ethBalance = await sdk.getETHBalance()
157
+ const tax = await sdk.getCurrentTax(tokenAddress) // 0n for DIRECT
158
+ const limits = await sdk.getCurrentLimits(tokenAddress) // max uint for DIRECT
159
+ const graduated = await sdk.isGraduated(tokenAddress) // false for DIRECT
160
+
161
+ // ── Upload images ──
162
+ await sdk.uploadImages(tokenAddress, {
163
+ logoPath: './logo.png',
164
+ bannerPath: './banner.png',
165
+ })
121
166
 
122
- // API reads
167
+ // ── API reads ──
123
168
  const tokens = await sdk.listTokens({ sort: 'hot', limit: 10 })
124
169
  const trending = await sdk.getTrending()
125
170
  const stats = await sdk.getStats()
126
171
  const tokenData = await sdk.getTokenFromAPI(tokenAddress)
127
172
  ```
128
173
 
174
+ ## Architecture
175
+
176
+ ```
177
+ ┌──────────────┐ createLaunch(DIRECT) ┌──────────────────┐
178
+ │ │ ──────────────────────────► │ │
179
+ │ CLI / SDK │ │ ClawclickFactory │
180
+ │ │ ──────────────────────────► │ │
181
+ └──────┬───────┘ createLaunch(AGENT) └────────┬─────────┘
182
+ │ │
183
+ │ buy / sell │ AGENT only
184
+ ▼ ▼
185
+ ┌──────────────┐ ┌──────────────────┐
186
+ │ PoolSwapTest │ ─────── swap() ──────────► │ Uniswap V4 │
187
+ │ │ │ PoolManager │
188
+ └──────────────┘ └────────┬─────────┘
189
+
190
+ ┌────────┴─────────┐
191
+ │ ClawclickHook │
192
+ │ (AGENT pools) │
193
+ │ tax / limits / │
194
+ │ epoch / graduate │
195
+ └──────────────────┘
196
+ ```
197
+
129
198
  ## Building
130
199
 
131
200
  ```bash
@@ -137,5 +206,5 @@ npm run build
137
206
  ## Development
138
207
 
139
208
  ```bash
140
- npm run dev -- launch -n "Test" -s "TST" -b 0x...
209
+ npm run dev -- launch -n "Test" -s "TST" -b 0x... -T direct
141
210
  ```
package/dist/abi.d.ts CHANGED
@@ -1,3 +1,8 @@
1
+ /** LaunchType enum values matching the contract */
2
+ export declare const LaunchType: {
3
+ readonly DIRECT: 0;
4
+ readonly AGENT: 1;
5
+ };
1
6
  export declare const FACTORY_ABI: readonly [{
2
7
  readonly name: "createLaunch";
3
8
  readonly type: "function";
@@ -33,6 +38,9 @@ export declare const FACTORY_ABI: readonly [{
33
38
  readonly name: "count";
34
39
  readonly type: "uint8";
35
40
  }];
41
+ }, {
42
+ readonly name: "launchType";
43
+ readonly type: "uint8";
36
44
  }];
37
45
  }];
38
46
  readonly outputs: readonly [{
@@ -115,10 +123,13 @@ export declare const FACTORY_ABI: readonly [{
115
123
  readonly name: "count";
116
124
  readonly type: "uint8";
117
125
  }];
126
+ }, {
127
+ readonly name: "launchType";
128
+ readonly type: "uint8";
118
129
  }];
119
130
  }];
120
131
  }, {
121
- readonly name: "poolStates";
132
+ readonly name: "launchByPoolId";
122
133
  readonly type: "function";
123
134
  readonly stateMutability: "view";
124
135
  readonly inputs: readonly [{
@@ -135,34 +146,111 @@ export declare const FACTORY_ABI: readonly [{
135
146
  readonly name: "beneficiary";
136
147
  readonly type: "address";
137
148
  }, {
138
- readonly name: "startingMCAP";
139
- readonly type: "uint256";
149
+ readonly name: "agentWallet";
150
+ readonly type: "address";
140
151
  }, {
141
- readonly name: "graduationMCAP";
142
- readonly type: "uint256";
152
+ readonly name: "creator";
153
+ readonly type: "address";
143
154
  }, {
144
- readonly name: "totalSupply";
145
- readonly type: "uint256";
155
+ readonly name: "poolId";
156
+ readonly type: "bytes32";
146
157
  }, {
147
- readonly name: "positionTokenIds";
148
- readonly type: "uint256[5]";
158
+ readonly name: "poolKey";
159
+ readonly type: "tuple";
160
+ readonly components: readonly [{
161
+ readonly name: "currency0";
162
+ readonly type: "address";
163
+ }, {
164
+ readonly name: "currency1";
165
+ readonly type: "address";
166
+ }, {
167
+ readonly name: "fee";
168
+ readonly type: "uint24";
169
+ }, {
170
+ readonly name: "tickSpacing";
171
+ readonly type: "int24";
172
+ }, {
173
+ readonly name: "hooks";
174
+ readonly type: "address";
175
+ }];
149
176
  }, {
150
- readonly name: "positionMinted";
151
- readonly type: "bool[5]";
177
+ readonly name: "targetMcapETH";
178
+ readonly type: "uint256";
152
179
  }, {
153
- readonly name: "positionRetired";
154
- readonly type: "bool[5]";
180
+ readonly name: "createdAt";
181
+ readonly type: "uint256";
155
182
  }, {
156
- readonly name: "recycledETH";
183
+ readonly name: "createdBlock";
157
184
  readonly type: "uint256";
158
185
  }, {
159
- readonly name: "activated";
160
- readonly type: "bool";
186
+ readonly name: "name";
187
+ readonly type: "string";
161
188
  }, {
162
- readonly name: "graduated";
163
- readonly type: "bool";
189
+ readonly name: "symbol";
190
+ readonly type: "string";
191
+ }, {
192
+ readonly name: "feeSplit";
193
+ readonly type: "tuple";
194
+ readonly components: readonly [{
195
+ readonly name: "wallets";
196
+ readonly type: "address[5]";
197
+ }, {
198
+ readonly name: "percentages";
199
+ readonly type: "uint16[5]";
200
+ }, {
201
+ readonly name: "count";
202
+ readonly type: "uint8";
203
+ }];
204
+ }, {
205
+ readonly name: "launchType";
206
+ readonly type: "uint8";
164
207
  }];
165
208
  }];
209
+ }, {
210
+ readonly name: "poolStates";
211
+ readonly type: "function";
212
+ readonly stateMutability: "view";
213
+ readonly inputs: readonly [{
214
+ readonly name: "poolId";
215
+ readonly type: "bytes32";
216
+ }];
217
+ readonly outputs: readonly [{
218
+ readonly name: "token";
219
+ readonly type: "address";
220
+ }, {
221
+ readonly name: "beneficiary";
222
+ readonly type: "address";
223
+ }, {
224
+ readonly name: "startingMCAP";
225
+ readonly type: "uint256";
226
+ }, {
227
+ readonly name: "graduationMCAP";
228
+ readonly type: "uint256";
229
+ }, {
230
+ readonly name: "totalSupply";
231
+ readonly type: "uint256";
232
+ }, {
233
+ readonly name: "recycledETH";
234
+ readonly type: "uint256";
235
+ }, {
236
+ readonly name: "activated";
237
+ readonly type: "bool";
238
+ }, {
239
+ readonly name: "graduated";
240
+ readonly type: "bool";
241
+ }];
242
+ }, {
243
+ readonly name: "poolActivated";
244
+ readonly type: "function";
245
+ readonly stateMutability: "view";
246
+ readonly inputs: readonly [{
247
+ readonly name: "poolId";
248
+ readonly type: "bytes32";
249
+ }];
250
+ readonly outputs: readonly [{
251
+ readonly name: "";
252
+ readonly type: "bool";
253
+ }];
166
254
  }, {
167
255
  readonly name: "getTokenCount";
168
256
  readonly type: "function";
@@ -223,6 +311,24 @@ export declare const FACTORY_ABI: readonly [{
223
311
  readonly name: "";
224
312
  readonly type: "address";
225
313
  }];
314
+ }, {
315
+ readonly name: "config";
316
+ readonly type: "function";
317
+ readonly stateMutability: "view";
318
+ readonly inputs: readonly [];
319
+ readonly outputs: readonly [{
320
+ readonly name: "";
321
+ readonly type: "address";
322
+ }];
323
+ }, {
324
+ readonly name: "positionManager";
325
+ readonly type: "function";
326
+ readonly stateMutability: "view";
327
+ readonly inputs: readonly [];
328
+ readonly outputs: readonly [{
329
+ readonly name: "";
330
+ readonly type: "address";
331
+ }];
226
332
  }, {
227
333
  readonly name: "mintNextPosition";
228
334
  readonly type: "function";
@@ -235,6 +341,18 @@ export declare const FACTORY_ABI: readonly [{
235
341
  readonly type: "uint256";
236
342
  }];
237
343
  readonly outputs: readonly [];
344
+ }, {
345
+ readonly name: "retireOldPosition";
346
+ readonly type: "function";
347
+ readonly stateMutability: "nonpayable";
348
+ readonly inputs: readonly [{
349
+ readonly name: "poolId";
350
+ readonly type: "bytes32";
351
+ }, {
352
+ readonly name: "positionIndex";
353
+ readonly type: "uint256";
354
+ }];
355
+ readonly outputs: readonly [];
238
356
  }, {
239
357
  readonly name: "collectFeesFromPosition";
240
358
  readonly type: "function";
@@ -247,6 +365,15 @@ export declare const FACTORY_ABI: readonly [{
247
365
  readonly type: "uint256";
248
366
  }];
249
367
  readonly outputs: readonly [];
368
+ }, {
369
+ readonly name: "clearDevOverride";
370
+ readonly type: "function";
371
+ readonly stateMutability: "nonpayable";
372
+ readonly inputs: readonly [{
373
+ readonly name: "poolId";
374
+ readonly type: "bytes32";
375
+ }];
376
+ readonly outputs: readonly [];
250
377
  }];
251
378
  export declare const HOOK_ABI: readonly [{
252
379
  readonly name: "launches";
@@ -412,8 +539,8 @@ export declare const HOOK_ABI: readonly [{
412
539
  readonly type: "uint256";
413
540
  }];
414
541
  }];
415
- export declare const SWAP_EXECUTOR_ABI: readonly [{
416
- readonly name: "executeBuy";
542
+ export declare const POOL_SWAP_TEST_ABI: readonly [{
543
+ readonly name: "swap";
417
544
  readonly type: "function";
418
545
  readonly stateMutability: "payable";
419
546
  readonly inputs: readonly [{
@@ -436,17 +563,42 @@ export declare const SWAP_EXECUTOR_ABI: readonly [{
436
563
  readonly type: "address";
437
564
  }];
438
565
  }, {
439
- readonly name: "amountIn";
440
- readonly type: "uint256";
566
+ readonly name: "params";
567
+ readonly type: "tuple";
568
+ readonly components: readonly [{
569
+ readonly name: "zeroForOne";
570
+ readonly type: "bool";
571
+ }, {
572
+ readonly name: "amountSpecified";
573
+ readonly type: "int256";
574
+ }, {
575
+ readonly name: "sqrtPriceLimitX96";
576
+ readonly type: "uint160";
577
+ }];
441
578
  }, {
442
- readonly name: "amountOutMin";
443
- readonly type: "uint256";
579
+ readonly name: "testSettings";
580
+ readonly type: "tuple";
581
+ readonly components: readonly [{
582
+ readonly name: "takeClaims";
583
+ readonly type: "bool";
584
+ }, {
585
+ readonly name: "settleUsingBurn";
586
+ readonly type: "bool";
587
+ }];
588
+ }, {
589
+ readonly name: "hookData";
590
+ readonly type: "bytes";
444
591
  }];
445
- readonly outputs: readonly [];
446
- }, {
447
- readonly name: "executeSell";
592
+ readonly outputs: readonly [{
593
+ readonly name: "delta";
594
+ readonly type: "int256";
595
+ }];
596
+ }];
597
+ /** @deprecated Use POOL_SWAP_TEST_ABI instead — SwapExecutor reverts on Sepolia */
598
+ export declare const SWAP_EXECUTOR_ABI: readonly [{
599
+ readonly name: "swap";
448
600
  readonly type: "function";
449
- readonly stateMutability: "nonpayable";
601
+ readonly stateMutability: "payable";
450
602
  readonly inputs: readonly [{
451
603
  readonly name: "key";
452
604
  readonly type: "tuple";
@@ -467,16 +619,36 @@ export declare const SWAP_EXECUTOR_ABI: readonly [{
467
619
  readonly type: "address";
468
620
  }];
469
621
  }, {
470
- readonly name: "token";
471
- readonly type: "address";
622
+ readonly name: "params";
623
+ readonly type: "tuple";
624
+ readonly components: readonly [{
625
+ readonly name: "zeroForOne";
626
+ readonly type: "bool";
627
+ }, {
628
+ readonly name: "amountSpecified";
629
+ readonly type: "int256";
630
+ }, {
631
+ readonly name: "sqrtPriceLimitX96";
632
+ readonly type: "uint160";
633
+ }];
472
634
  }, {
473
- readonly name: "amountIn";
474
- readonly type: "uint256";
635
+ readonly name: "testSettings";
636
+ readonly type: "tuple";
637
+ readonly components: readonly [{
638
+ readonly name: "takeClaims";
639
+ readonly type: "bool";
640
+ }, {
641
+ readonly name: "settleUsingBurn";
642
+ readonly type: "bool";
643
+ }];
475
644
  }, {
476
- readonly name: "amountOutMin";
477
- readonly type: "uint256";
645
+ readonly name: "hookData";
646
+ readonly type: "bytes";
647
+ }];
648
+ readonly outputs: readonly [{
649
+ readonly name: "delta";
650
+ readonly type: "int256";
478
651
  }];
479
- readonly outputs: readonly [];
480
652
  }];
481
653
  export declare const ERC20_ABI: readonly [{
482
654
  readonly name: "approve";
package/dist/abi.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"abi.d.ts","sourceRoot":"","sources":["../src/abi.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmKd,CAAA;AAKV,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwGX,CAAA;AAKV,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CpB,CAAA;AAKV,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CZ,CAAA"}
1
+ {"version":3,"file":"abi.d.ts","sourceRoot":"","sources":["../src/abi.ts"],"names":[],"mappings":"AAIA,mDAAmD;AACnD,eAAO,MAAM,UAAU;;;CAAmC,CAAA;AA8C1D,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuKd,CAAA;AAKV,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwGX,CAAA;AAKV,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCrB,CAAA;AAEV,mFAAmF;AACnF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAqB,CAAA;AAKnD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CZ,CAAA"}