@kaspacom/kcc20-tx-builder 0.1.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 (234) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +104 -0
  3. package/artifacts/KCC20.placeholder.json +77479 -0
  4. package/artifacts/KCC20FeeTicket.placeholder.json +16846 -0
  5. package/artifacts/KCC20Orderbook.placeholder.json +78001 -0
  6. package/artifacts/KCC20Vesting.placeholder.json +4298 -0
  7. package/artifacts/KCC20Wrapper.placeholder.json +12246 -0
  8. package/dist/abi.d.ts +44 -0
  9. package/dist/abi.d.ts.map +1 -0
  10. package/dist/abi.js +336 -0
  11. package/dist/abi.js.map +1 -0
  12. package/dist/action-source-resolver.d.ts +80 -0
  13. package/dist/action-source-resolver.d.ts.map +1 -0
  14. package/dist/action-source-resolver.js +412 -0
  15. package/dist/action-source-resolver.js.map +1 -0
  16. package/dist/artifacts.d.ts +14 -0
  17. package/dist/artifacts.d.ts.map +1 -0
  18. package/dist/artifacts.js +44 -0
  19. package/dist/artifacts.js.map +1 -0
  20. package/dist/builder.d.ts +12 -0
  21. package/dist/builder.d.ts.map +1 -0
  22. package/dist/builder.js +18 -0
  23. package/dist/builder.js.map +1 -0
  24. package/dist/cjs/abi.d.ts +43 -0
  25. package/dist/cjs/abi.js +361 -0
  26. package/dist/cjs/abi.js.map +1 -0
  27. package/dist/cjs/action-source-resolver.d.ts +79 -0
  28. package/dist/cjs/action-source-resolver.js +435 -0
  29. package/dist/cjs/action-source-resolver.js.map +1 -0
  30. package/dist/cjs/artifacts.d.ts +13 -0
  31. package/dist/cjs/artifacts.js +51 -0
  32. package/dist/cjs/artifacts.js.map +1 -0
  33. package/dist/cjs/builder.d.ts +11 -0
  34. package/dist/cjs/builder.js +22 -0
  35. package/dist/cjs/builder.js.map +1 -0
  36. package/dist/cjs/deploy-operation.d.ts +103 -0
  37. package/dist/cjs/deploy-operation.js +335 -0
  38. package/dist/cjs/deploy-operation.js.map +1 -0
  39. package/dist/cjs/encoding.d.ts +5 -0
  40. package/dist/cjs/encoding.js +51 -0
  41. package/dist/cjs/encoding.js.map +1 -0
  42. package/dist/cjs/engine.d.ts +40 -0
  43. package/dist/cjs/engine.js +8972 -0
  44. package/dist/cjs/engine.js.map +1 -0
  45. package/dist/cjs/errors.d.ts +7 -0
  46. package/dist/cjs/errors.js +23 -0
  47. package/dist/cjs/errors.js.map +1 -0
  48. package/dist/cjs/fee-ticket-operation.d.ts +204 -0
  49. package/dist/cjs/fee-ticket-operation.js +327 -0
  50. package/dist/cjs/fee-ticket-operation.js.map +1 -0
  51. package/dist/cjs/index.d.ts +27 -0
  52. package/dist/cjs/index.js +45 -0
  53. package/dist/cjs/index.js.map +1 -0
  54. package/dist/cjs/ladder-limit-orders.d.ts +41 -0
  55. package/dist/cjs/ladder-limit-orders.js +129 -0
  56. package/dist/cjs/ladder-limit-orders.js.map +1 -0
  57. package/dist/cjs/mint-availability-operation.d.ts +56 -0
  58. package/dist/cjs/mint-availability-operation.js +95 -0
  59. package/dist/cjs/mint-availability-operation.js.map +1 -0
  60. package/dist/cjs/models.d.ts +90 -0
  61. package/dist/cjs/models.js +6 -0
  62. package/dist/cjs/models.js.map +1 -0
  63. package/dist/cjs/operations.d.ts +6 -0
  64. package/dist/cjs/operations.js +41 -0
  65. package/dist/cjs/operations.js.map +1 -0
  66. package/dist/cjs/package.json +1 -0
  67. package/dist/cjs/paid-mint-amount.d.ts +69 -0
  68. package/dist/cjs/paid-mint-amount.js +281 -0
  69. package/dist/cjs/paid-mint-amount.js.map +1 -0
  70. package/dist/cjs/protocol.d.ts +21 -0
  71. package/dist/cjs/protocol.js +25 -0
  72. package/dist/cjs/protocol.js.map +1 -0
  73. package/dist/cjs/runtime.d.ts +27 -0
  74. package/dist/cjs/runtime.js +3 -0
  75. package/dist/cjs/runtime.js.map +1 -0
  76. package/dist/cjs/sale-common.d.ts +287 -0
  77. package/dist/cjs/sale-common.js +928 -0
  78. package/dist/cjs/sale-common.js.map +1 -0
  79. package/dist/cjs/source-provider.d.ts +11 -0
  80. package/dist/cjs/source-provider.js +3 -0
  81. package/dist/cjs/source-provider.js.map +1 -0
  82. package/dist/cjs/source-validation.d.ts +9 -0
  83. package/dist/cjs/source-validation.js +33 -0
  84. package/dist/cjs/source-validation.js.map +1 -0
  85. package/dist/cjs/token-amount.d.ts +31 -0
  86. package/dist/cjs/token-amount.js +252 -0
  87. package/dist/cjs/token-amount.js.map +1 -0
  88. package/dist/cjs/token-operation.d.ts +135 -0
  89. package/dist/cjs/token-operation.js +236 -0
  90. package/dist/cjs/token-operation.js.map +1 -0
  91. package/dist/cjs/trade-fee.d.ts +60 -0
  92. package/dist/cjs/trade-fee.js +185 -0
  93. package/dist/cjs/trade-fee.js.map +1 -0
  94. package/dist/cjs/trading-operation.d.ts +212 -0
  95. package/dist/cjs/trading-operation.js +587 -0
  96. package/dist/cjs/trading-operation.js.map +1 -0
  97. package/dist/cjs/verify-operation.d.ts +79 -0
  98. package/dist/cjs/verify-operation.js +246 -0
  99. package/dist/cjs/verify-operation.js.map +1 -0
  100. package/dist/cjs/wallet-operation.d.ts +52 -0
  101. package/dist/cjs/wallet-operation.js +58 -0
  102. package/dist/cjs/wallet-operation.js.map +1 -0
  103. package/dist/cjs/wasm-provider.d.ts +15 -0
  104. package/dist/cjs/wasm-provider.js +20 -0
  105. package/dist/cjs/wasm-provider.js.map +1 -0
  106. package/dist/cjs/wrapper-operation.d.ts +196 -0
  107. package/dist/cjs/wrapper-operation.js +317 -0
  108. package/dist/cjs/wrapper-operation.js.map +1 -0
  109. package/dist/deploy-operation.d.ts +104 -0
  110. package/dist/deploy-operation.d.ts.map +1 -0
  111. package/dist/deploy-operation.js +327 -0
  112. package/dist/deploy-operation.js.map +1 -0
  113. package/dist/encoding.d.ts +6 -0
  114. package/dist/encoding.d.ts.map +1 -0
  115. package/dist/encoding.js +44 -0
  116. package/dist/encoding.js.map +1 -0
  117. package/dist/engine.d.ts +41 -0
  118. package/dist/engine.d.ts.map +1 -0
  119. package/dist/engine.js +8969 -0
  120. package/dist/engine.js.map +1 -0
  121. package/dist/errors.d.ts +8 -0
  122. package/dist/errors.d.ts.map +1 -0
  123. package/dist/errors.js +18 -0
  124. package/dist/errors.js.map +1 -0
  125. package/dist/fee-ticket-operation.d.ts +205 -0
  126. package/dist/fee-ticket-operation.d.ts.map +1 -0
  127. package/dist/fee-ticket-operation.js +320 -0
  128. package/dist/fee-ticket-operation.js.map +1 -0
  129. package/dist/index.d.ts +28 -0
  130. package/dist/index.d.ts.map +1 -0
  131. package/dist/index.js +28 -0
  132. package/dist/index.js.map +1 -0
  133. package/dist/ladder-limit-orders.d.ts +42 -0
  134. package/dist/ladder-limit-orders.d.ts.map +1 -0
  135. package/dist/ladder-limit-orders.js +121 -0
  136. package/dist/ladder-limit-orders.js.map +1 -0
  137. package/dist/mint-availability-operation.d.ts +57 -0
  138. package/dist/mint-availability-operation.d.ts.map +1 -0
  139. package/dist/mint-availability-operation.js +91 -0
  140. package/dist/mint-availability-operation.js.map +1 -0
  141. package/dist/models.d.ts +91 -0
  142. package/dist/models.d.ts.map +1 -0
  143. package/dist/models.js +3 -0
  144. package/dist/models.js.map +1 -0
  145. package/dist/operations.d.ts +7 -0
  146. package/dist/operations.d.ts.map +1 -0
  147. package/dist/operations.js +36 -0
  148. package/dist/operations.js.map +1 -0
  149. package/dist/paid-mint-amount.d.ts +70 -0
  150. package/dist/paid-mint-amount.d.ts.map +1 -0
  151. package/dist/paid-mint-amount.js +268 -0
  152. package/dist/paid-mint-amount.js.map +1 -0
  153. package/dist/protocol.d.ts +22 -0
  154. package/dist/protocol.d.ts.map +1 -0
  155. package/dist/protocol.js +22 -0
  156. package/dist/protocol.js.map +1 -0
  157. package/dist/runtime.d.ts +28 -0
  158. package/dist/runtime.d.ts.map +1 -0
  159. package/dist/runtime.js +2 -0
  160. package/dist/runtime.js.map +1 -0
  161. package/dist/sale-common.d.ts +288 -0
  162. package/dist/sale-common.d.ts.map +1 -0
  163. package/dist/sale-common.js +844 -0
  164. package/dist/sale-common.js.map +1 -0
  165. package/dist/source-provider.d.ts +12 -0
  166. package/dist/source-provider.d.ts.map +1 -0
  167. package/dist/source-provider.js +2 -0
  168. package/dist/source-provider.js.map +1 -0
  169. package/dist/source-validation.d.ts +10 -0
  170. package/dist/source-validation.d.ts.map +1 -0
  171. package/dist/source-validation.js +28 -0
  172. package/dist/source-validation.js.map +1 -0
  173. package/dist/token-amount.d.ts +32 -0
  174. package/dist/token-amount.d.ts.map +1 -0
  175. package/dist/token-amount.js +237 -0
  176. package/dist/token-amount.js.map +1 -0
  177. package/dist/token-operation.d.ts +136 -0
  178. package/dist/token-operation.d.ts.map +1 -0
  179. package/dist/token-operation.js +231 -0
  180. package/dist/token-operation.js.map +1 -0
  181. package/dist/trade-fee.d.ts +61 -0
  182. package/dist/trade-fee.d.ts.map +1 -0
  183. package/dist/trade-fee.js +173 -0
  184. package/dist/trade-fee.js.map +1 -0
  185. package/dist/trading-operation.d.ts +213 -0
  186. package/dist/trading-operation.d.ts.map +1 -0
  187. package/dist/trading-operation.js +580 -0
  188. package/dist/trading-operation.js.map +1 -0
  189. package/dist/verify-operation.d.ts +80 -0
  190. package/dist/verify-operation.d.ts.map +1 -0
  191. package/dist/verify-operation.js +243 -0
  192. package/dist/verify-operation.js.map +1 -0
  193. package/dist/wallet-operation.d.ts +53 -0
  194. package/dist/wallet-operation.d.ts.map +1 -0
  195. package/dist/wallet-operation.js +55 -0
  196. package/dist/wallet-operation.js.map +1 -0
  197. package/dist/wasm-provider.d.ts +16 -0
  198. package/dist/wasm-provider.d.ts.map +1 -0
  199. package/dist/wasm-provider.js +17 -0
  200. package/dist/wasm-provider.js.map +1 -0
  201. package/dist/wrapper-operation.d.ts +197 -0
  202. package/dist/wrapper-operation.d.ts.map +1 -0
  203. package/dist/wrapper-operation.js +311 -0
  204. package/dist/wrapper-operation.js.map +1 -0
  205. package/index.d.ts +1 -0
  206. package/package.json +84 -0
  207. package/src/abi.ts +493 -0
  208. package/src/action-source-resolver.ts +660 -0
  209. package/src/artifacts.ts +87 -0
  210. package/src/builder.ts +37 -0
  211. package/src/deploy-operation.ts +458 -0
  212. package/src/encoding.ts +58 -0
  213. package/src/engine.ts +13226 -0
  214. package/src/errors.ts +35 -0
  215. package/src/fee-ticket-operation.ts +518 -0
  216. package/src/index.ts +27 -0
  217. package/src/ladder-limit-orders.ts +184 -0
  218. package/src/mint-availability-operation.ts +146 -0
  219. package/src/models.ts +103 -0
  220. package/src/operations.ts +46 -0
  221. package/src/paid-mint-amount.ts +402 -0
  222. package/src/protocol.ts +28 -0
  223. package/src/runtime.ts +29 -0
  224. package/src/sale-common.ts +1238 -0
  225. package/src/source-provider.ts +12 -0
  226. package/src/source-validation.ts +47 -0
  227. package/src/token-amount.ts +302 -0
  228. package/src/token-operation.ts +384 -0
  229. package/src/trade-fee.ts +264 -0
  230. package/src/trading-operation.ts +842 -0
  231. package/src/verify-operation.ts +400 -0
  232. package/src/wallet-operation.ts +86 -0
  233. package/src/wasm-provider.ts +32 -0
  234. package/src/wrapper-operation.ts +531 -0
@@ -0,0 +1,580 @@
1
+ import { ownerWrappedHolderUtxos, selectConsolidationBatch, selectOwnerFeeTicketUtxos, selectOwnerWrappedHolderUtxo, selectWrappedOrderUtxo, selectWrappedRootUtxo, summarizeHolderUtxos, } from "./action-source-resolver.js";
2
+ import { buildCreateOrderFeeQuote, buildStandaloneFillFeeQuote, } from "./trade-fee.js";
3
+ import { kcc20DisplayScaleForDecimals, normalizeKcc20Decimals, parseKcc20DisplayAmountToBaseUnits, } from "./token-amount.js";
4
+ import { KCC20_ORDERBOOK_MAX_EXPANDED_SWEEP_BID_LEGS } from "./sale-common.js";
5
+ import { buildKcc20WalletOperationFromPlan } from "./wallet-operation.js";
6
+ export function buildKcc20OrderOperation(wallet, context, draft, options = {}) {
7
+ requireTradableWrapper(context.wrapper, draft.wrappedMarketId);
8
+ const canonicalId = contractCanonicalId(context);
9
+ const marketId = requireHex32(context.wrapper.marketId, "wrappedMarketId");
10
+ const amount = displayAmount(draft.tokenAmount, context.tokenDecimals);
11
+ const priceScale = priceScaleFor(context.tokenDecimals);
12
+ const feeTicketId = validatedWrapperFeeTicket(context.wrapper, draft.feeTicketId);
13
+ const root = draft.side === "buy"
14
+ ? selectWrappedRootUtxo(context.wrappedTokenUtxos, canonicalId)
15
+ : null;
16
+ const holders = draft.side === "sell"
17
+ ? ownerWrappedHolderUtxos(context.wrappedTokenUtxos, wallet.kcc20Owner, canonicalId)
18
+ : [];
19
+ const holder = draft.side === "sell"
20
+ ? selectOwnerWrappedHolderUtxo(context.wrappedTokenUtxos, wallet.kcc20Owner, amount, canonicalId, true)
21
+ : null;
22
+ const summary = draft.side === "sell" ? summarizeHolderUtxos(holders, amount) : null;
23
+ if (draft.side === "buy" && !root)
24
+ throw new Error("Wrapped market root UTXO is not available");
25
+ if (draft.side === "sell" && !holder) {
26
+ throw new Error(summary?.fragmented
27
+ ? "No single wrapped holder UTXO is large enough; consolidate the wrapped balance first"
28
+ : "Sell order requires a wrapped holder UTXO owned by this wallet");
29
+ }
30
+ const buying = draft.side === "buy";
31
+ return buildKcc20WalletOperationFromPlan(wallet, {
32
+ builderKey: buying
33
+ ? "kcc20orderbook.create-bid"
34
+ : "kcc20orderbook.create-ask",
35
+ operation: buying ? "create-buy-order" : "create-sell-order",
36
+ contract: "KCC20Orderbook",
37
+ action: buying ? "createBid" : "createAsk",
38
+ description: `Build a KCC20 DEX Orderbook V1 ${draft.side} order request.`,
39
+ params: {
40
+ canonicalCovenantId: canonicalId,
41
+ wrappedMarketId: marketId,
42
+ side: draft.side,
43
+ tokenAmount: amount,
44
+ unitPriceSompi: requireUnsigned(draft.unitPriceSompi, "unitPriceSompi"),
45
+ feeTicketId,
46
+ feeTicketSupported: Boolean(feeTicketId),
47
+ feeQuote: buildCreateOrderFeeQuote({
48
+ side: draft.side,
49
+ tokenAmount: amount,
50
+ unitPriceSompi: draft.unitPriceSompi,
51
+ priceScale,
52
+ temporaryKasDepositSompi: buying ? "200000000" : "0",
53
+ }),
54
+ ...(context.wrapper.activeCovenantId
55
+ ? { activeWrapperCovenantId: context.wrapper.activeCovenantId }
56
+ : {}),
57
+ activeWrappedRootUtxo: root,
58
+ activeWrappedHolderUtxo: holder,
59
+ },
60
+ sourceRequirements: buying
61
+ ? [
62
+ {
63
+ type: "kaspa-funding-utxo",
64
+ ownerAddress: wallet.walletAddress,
65
+ minimumGrossSompiExpression: "tokenAmount * unitPriceSompi / priceScale + temporary holder deposit + network fee",
66
+ },
67
+ {
68
+ type: "kcc20-orderbook-root-utxo",
69
+ covenantId: marketId,
70
+ outpoint: root?.outpoint,
71
+ amount: root?.state?.["amount"],
72
+ purpose: "authorize bid output creation",
73
+ },
74
+ ]
75
+ : [
76
+ {
77
+ type: "kcc20-orderbook-holder-utxo",
78
+ covenantId: marketId,
79
+ owner: wallet.kcc20Owner,
80
+ minimumTokenAmount: amount,
81
+ ...(summary ?? {}),
82
+ outpoint: holder?.outpoint,
83
+ amount: holder?.state?.["amount"],
84
+ },
85
+ ],
86
+ warnings: [
87
+ "Crossed orders are settled by the backend matcher after normal bid/ask creation.",
88
+ "Fee discount tickets apply only to supported fill paths.",
89
+ ],
90
+ }, options);
91
+ }
92
+ export function buildKcc20FillOperation(wallet, context, draft, options = {}) {
93
+ requireTradableWrapper(context.wrapper, draft.wrappedMarketId);
94
+ const canonicalId = contractCanonicalId(context);
95
+ const marketId = requireHex32(context.wrapper.marketId, "wrappedMarketId");
96
+ const amount = displayAmount(draft.tokenAmount, context.tokenDecimals);
97
+ const fillsAsk = draft.side === "buy";
98
+ const order = selectWrappedOrderUtxo(context.wrappedTokenUtxos, {
99
+ orderId: requireOrderId(draft.targetOrderId),
100
+ mode: fillsAsk ? 2 : 3,
101
+ canonicalTokenId: canonicalId,
102
+ requestedAmount: amount,
103
+ unitPriceSompi: requireUnsigned(draft.unitPriceSompi, "unitPriceSompi"),
104
+ });
105
+ if (!order)
106
+ throw new Error(`Selected ${fillsAsk ? "ask" : "bid"} order is not open or does not match fill terms`);
107
+ const holders = fillsAsk
108
+ ? []
109
+ : ownerWrappedHolderUtxos(context.wrappedTokenUtxos, wallet.kcc20Owner, canonicalId);
110
+ const holder = fillsAsk
111
+ ? null
112
+ : selectOwnerWrappedHolderUtxo(context.wrappedTokenUtxos, wallet.kcc20Owner, amount, canonicalId, true);
113
+ const summary = fillsAsk ? null : summarizeHolderUtxos(holders, amount);
114
+ if (!fillsAsk && !holder)
115
+ throw new Error("Fill bid requires a wrapped holder UTXO owned by the seller");
116
+ const requestedTicket = draft.useFeeTicket || draft.feeTicketId;
117
+ const orderTicketId = normalizeOptionalHex32(order.state?.["feeTicketId"]);
118
+ const feeTicketId = requestedTicket
119
+ ? validatedFillFeeTicket(context.wrapper, orderTicketId, draft.feeTicketId)
120
+ : null;
121
+ const ticket = feeTicketId
122
+ ? selectOwnerFeeTicketUtxos(context.feeTicketUtxos ?? [], wallet.kcc20Owner)[0]
123
+ : undefined;
124
+ if (feeTicketId && !ticket)
125
+ throw new Error("No active FeeTicket UTXO is available for this wallet");
126
+ const feeQuote = buildStandaloneFillFeeQuote({
127
+ side: draft.side,
128
+ tokenAmount: amount,
129
+ unitPriceSompi: draft.unitPriceSompi,
130
+ priceScale: String(order.state?.["priceScale"] ??
131
+ order.state?.["tokenDisplayScale"] ??
132
+ priceScaleFor(context.tokenDecimals)),
133
+ feeTicketApplied: Boolean(ticket),
134
+ });
135
+ const operation = fillsAsk ? "fill-ask-order" : "fill-bid-order";
136
+ return buildKcc20WalletOperationFromPlan(wallet, {
137
+ builderKey: fillsAsk
138
+ ? "kcc20orderbook.fill-ask"
139
+ : "kcc20orderbook.fill-bid",
140
+ operation,
141
+ contract: "KCC20Orderbook",
142
+ action: fillsAsk ? "fillAsk" : "fillBid",
143
+ description: `Build a KCC20 DEX Orderbook V1 ${draft.side} fill request.`,
144
+ params: {
145
+ canonicalCovenantId: canonicalId,
146
+ wrappedMarketId: marketId,
147
+ side: draft.side,
148
+ targetOrderId: draft.targetOrderId.toLowerCase(),
149
+ tokenAmount: amount,
150
+ unitPriceSompi: draft.unitPriceSompi,
151
+ feeTicketId,
152
+ feeTicketSupported: Boolean(feeTicketId),
153
+ feeQuote,
154
+ ...(context.wrapper.activeCovenantId
155
+ ? { activeWrapperCovenantId: context.wrapper.activeCovenantId }
156
+ : {}),
157
+ activeTargetOrderUtxo: order,
158
+ activeWrappedHolderUtxo: holder,
159
+ activeFeeTicketUtxo: ticket ?? null,
160
+ },
161
+ sourceRequirements: [
162
+ {
163
+ type: fillsAsk
164
+ ? "kcc20-orderbook-ask-order-utxo"
165
+ : "kcc20-orderbook-bid-order-utxo",
166
+ orderId: draft.targetOrderId,
167
+ covenantId: marketId,
168
+ outpoint: order.outpoint,
169
+ amount: order.state?.["amount"],
170
+ unitPriceSompi: order.state?.["unitPriceSompi"],
171
+ },
172
+ ...(fillsAsk
173
+ ? [
174
+ {
175
+ type: "kaspa-funding-utxo",
176
+ ownerAddress: wallet.walletAddress,
177
+ minimumGrossSompiExpression: "tokenAmount * unitPriceSompi / priceScale + protocol fee + network fee",
178
+ },
179
+ ]
180
+ : [
181
+ {
182
+ type: "kcc20-orderbook-holder-utxo",
183
+ covenantId: marketId,
184
+ owner: wallet.kcc20Owner,
185
+ minimumTokenAmount: amount,
186
+ ...(summary ?? {}),
187
+ outpoint: holder?.outpoint,
188
+ amount: holder?.state?.["amount"],
189
+ },
190
+ ]),
191
+ ...(ticket
192
+ ? [
193
+ {
194
+ type: "fee-ticket-utxo",
195
+ rootId: feeTicketId,
196
+ owner: wallet.kcc20Owner,
197
+ outpoint: ticket.outpoint,
198
+ amountSompi: ticket.amountSompi,
199
+ address: ticket.address,
200
+ purpose: "burn one FeeTicket for this standalone fill discount",
201
+ },
202
+ ]
203
+ : []),
204
+ ],
205
+ warnings: [
206
+ ticket
207
+ ? "This fill burns one selected FeeTicket UTXO for the protocol-fee discount."
208
+ : "No FeeTicket was selected; this fill pays the normal KAS protocol fee.",
209
+ ],
210
+ }, options);
211
+ }
212
+ export function buildKcc20SweepOperation(wallet, context, draft, options = {}) {
213
+ requireTradableWrapper(context.wrapper, draft.wrappedMarketId);
214
+ if (draft.expectedFills.length < 2)
215
+ throw new Error("Multi-order sweep requires at least two fill legs");
216
+ const canonicalId = contractCanonicalId(context);
217
+ const marketId = requireHex32(context.wrapper.marketId, "wrappedMarketId");
218
+ const tokenAmount = displayAmount(draft.tokenAmount, context.tokenDecimals);
219
+ const sweepsAsks = draft.side === "buy";
220
+ const orders = draft.expectedFills.flatMap((fill) => {
221
+ const selected = selectWrappedOrderUtxo(context.wrappedTokenUtxos, {
222
+ orderId: fill.orderId,
223
+ mode: sweepsAsks ? 2 : 3,
224
+ canonicalTokenId: canonicalId,
225
+ requestedAmount: fill.tokenAmount,
226
+ unitPriceSompi: fill.unitPriceSompi,
227
+ });
228
+ return selected ? [selected] : [];
229
+ });
230
+ if (orders.length !== draft.expectedFills.length)
231
+ throw new Error("One or more matched order UTXOs are no longer open");
232
+ const sweepAmount = draft.expectedFills.reduce((sum, fill) => sum + BigInt(fill.tokenAmount), 0n);
233
+ const holders = sweepsAsks
234
+ ? []
235
+ : ownerWrappedHolderUtxos(context.wrappedTokenUtxos, wallet.kcc20Owner, canonicalId);
236
+ const singleHolder = sweepsAsks
237
+ ? null
238
+ : selectOwnerWrappedHolderUtxo(context.wrappedTokenUtxos, wallet.kcc20Owner, sweepAmount.toString(), canonicalId);
239
+ const pairedHolders = [];
240
+ if (!sweepsAsks && !singleHolder) {
241
+ const used = new Set();
242
+ for (const fill of draft.expectedFills) {
243
+ const match = holders
244
+ .filter((candidate) => !used.has(candidate.outpoint))
245
+ .sort((a, b) => BigInt(String(a.state?.["amount"])) <
246
+ BigInt(String(b.state?.["amount"]))
247
+ ? -1
248
+ : 1)
249
+ .find((candidate) => BigInt(String(candidate.state?.["amount"])) >=
250
+ BigInt(fill.tokenAmount));
251
+ if (match) {
252
+ used.add(match.outpoint);
253
+ pairedHolders.push(match);
254
+ }
255
+ }
256
+ }
257
+ const hasSingleHolder = !sweepsAsks &&
258
+ draft.expectedFills.length <= KCC20_ORDERBOOK_MAX_EXPANDED_SWEEP_BID_LEGS &&
259
+ Boolean(singleHolder);
260
+ if (!sweepsAsks &&
261
+ !hasSingleHolder &&
262
+ pairedHolders.length !== draft.expectedFills.length) {
263
+ throw new Error("Sweep bid orders requires one holder covering the full amount or one distinct holder per bid leg");
264
+ }
265
+ const feeTicketId = draft.feeTicketId
266
+ ? requireHex32(draft.feeTicketId, "feeTicketId")
267
+ : null;
268
+ if (feeTicketId && context.wrapper.feeTicketId?.toLowerCase() !== feeTicketId)
269
+ throw new Error("Requested FeeTicket root does not match this wrapped market");
270
+ if (feeTicketId &&
271
+ orders.some((order) => normalizeOptionalHex32(order.state?.["feeTicketId"]) !== feeTicketId)) {
272
+ throw new Error("One or more sweep orders are not bound to the requested FeeTicket root");
273
+ }
274
+ const ticket = feeTicketId
275
+ ? selectOwnerFeeTicketUtxos(context.feeTicketUtxos ?? [], wallet.kcc20Owner)[0]
276
+ : undefined;
277
+ if (feeTicketId && !ticket)
278
+ throw new Error("FeeTicket sweep requires one active ticket UTXO");
279
+ const gross = requireUnsigned(draft.grossSompi, "grossSompi");
280
+ const protocolFee = ticket
281
+ ? "0"
282
+ : requireUnsigned(draft.protocolFeeSompi, "protocolFeeSompi");
283
+ const buyerPays = ticket
284
+ ? gross
285
+ : requireUnsigned(draft.buyerPaysSompi, "buyerPaysSompi");
286
+ const sellerReceives = ticket
287
+ ? gross
288
+ : requireUnsigned(draft.sellerReceivesSompi, "sellerReceivesSompi");
289
+ if (draft.maxBuyerPaysSompi &&
290
+ BigInt(buyerPays) > BigInt(draft.maxBuyerPaysSompi))
291
+ throw new Error("The market buy cost is higher than the approved quote");
292
+ if (draft.minSellerReceivesSompi &&
293
+ BigInt(sellerReceives) < BigInt(draft.minSellerReceivesSompi))
294
+ throw new Error("The market sell proceeds are lower than the approved quote");
295
+ const summary = sweepsAsks
296
+ ? null
297
+ : summarizeHolderUtxos(holders, sweepAmount.toString());
298
+ return buildKcc20WalletOperationFromPlan(wallet, {
299
+ builderKey: sweepsAsks
300
+ ? "kcc20orderbook.sweep-asks"
301
+ : "kcc20orderbook.sweep-bids",
302
+ operation: sweepsAsks ? "sweep-ask-orders" : "sweep-bid-orders",
303
+ contract: "KCC20Orderbook",
304
+ action: sweepsAsks ? "sweepAsks" : "sweepBids",
305
+ description: `Build a KCC20 DEX Orderbook V1 ${draft.side} multi-order sweep request.`,
306
+ params: {
307
+ canonicalCovenantId: canonicalId,
308
+ wrappedMarketId: marketId,
309
+ side: draft.side,
310
+ tokenAmount,
311
+ mode: draft.mode,
312
+ limitUnitPriceSompi: draft.limitUnitPriceSompi ?? null,
313
+ fills: draft.expectedFills,
314
+ grossSompi: gross,
315
+ protocolFeeSompi: protocolFee,
316
+ quotedProtocolFeeSompi: ticket ? draft.protocolFeeSompi : null,
317
+ buyerPaysSompi: buyerPays,
318
+ sellerReceivesSompi: sellerReceives,
319
+ averageUnitPriceSompi: draft.averageUnitPriceSompi ?? null,
320
+ feeTicketId,
321
+ activeFeeTicketUtxos: ticket ? [ticket] : [],
322
+ ...(context.wrapper.activeCovenantId
323
+ ? { activeWrapperCovenantId: context.wrapper.activeCovenantId }
324
+ : {}),
325
+ activeTargetOrderUtxos: orders,
326
+ activeWrappedHolderUtxo: singleHolder,
327
+ activeWrappedHolderUtxos: hasSingleHolder ? [] : pairedHolders,
328
+ },
329
+ sourceRequirements: [
330
+ ...draft.expectedFills.map((fill, index) => ({
331
+ type: sweepsAsks
332
+ ? "kcc20-orderbook-ask-order-utxo"
333
+ : "kcc20-orderbook-bid-order-utxo",
334
+ orderId: fill.orderId,
335
+ covenantId: marketId,
336
+ tokenAmount: fill.tokenAmount,
337
+ unitPriceSompi: fill.unitPriceSompi,
338
+ outpoint: orders[index]?.outpoint,
339
+ amount: orders[index]?.state?.["amount"],
340
+ })),
341
+ ...(!sweepsAsks && singleHolder
342
+ ? [
343
+ {
344
+ type: "kcc20-orderbook-holder-utxo",
345
+ covenantId: marketId,
346
+ owner: wallet.kcc20Owner,
347
+ minimumTokenAmount: sweepAmount.toString(),
348
+ outpoint: singleHolder.outpoint,
349
+ amount: singleHolder.state?.["amount"],
350
+ },
351
+ ]
352
+ : []),
353
+ ...(!sweepsAsks && !singleHolder
354
+ ? pairedHolders.map((holder, index) => ({
355
+ type: "kcc20-orderbook-holder-utxo",
356
+ covenantId: marketId,
357
+ owner: wallet.kcc20Owner,
358
+ legIndex: index,
359
+ minimumTokenAmount: draft.expectedFills[index]?.tokenAmount,
360
+ outpoint: holder.outpoint,
361
+ amount: holder.state?.["amount"],
362
+ }))
363
+ : []),
364
+ ...(ticket
365
+ ? [
366
+ {
367
+ type: "kcc20-fee-ticket-utxo",
368
+ covenantId: feeTicketId,
369
+ purpose: "burn one ticket for the sweep transaction",
370
+ outpoint: ticket.outpoint,
371
+ amountSompi: ticket.amountSompi,
372
+ },
373
+ ]
374
+ : []),
375
+ ...(!sweepsAsks
376
+ ? [
377
+ {
378
+ type: "kcc20-orderbook-holder-utxo-summary",
379
+ covenantId: marketId,
380
+ owner: wallet.kcc20Owner,
381
+ minimumTokenAmount: sweepAmount.toString(),
382
+ ...(summary ?? {}),
383
+ },
384
+ ]
385
+ : []),
386
+ {
387
+ type: "kaspa-funding-utxo",
388
+ ownerAddress: wallet.walletAddress,
389
+ purpose: "fund sweep settlement outputs and network fee",
390
+ },
391
+ ],
392
+ warnings: [
393
+ "This sweep spends multiple matched orders atomically in one transaction.",
394
+ ticket
395
+ ? "This sweep burns one FeeTicket UTXO."
396
+ : "This sweep pays the normal KAS protocol fee.",
397
+ ],
398
+ }, options);
399
+ }
400
+ export function buildKcc20CancelOperation(wallet, context, draft, options = {}) {
401
+ const canonicalId = contractCanonicalId(context);
402
+ const marketId = requireHex32(context.wrapper.marketId, "wrappedMarketId");
403
+ const orderId = requireOrderId(draft.targetOrderId);
404
+ const cancelsAsk = draft.side === "ask";
405
+ const order = selectWrappedOrderUtxo(context.wrappedTokenUtxos, {
406
+ orderId,
407
+ mode: cancelsAsk ? 2 : 3,
408
+ canonicalTokenId: canonicalId,
409
+ owner: wallet.kcc20Owner,
410
+ });
411
+ if (!order)
412
+ throw new Error(`Selected ${draft.side} order is not open or not owned by this wallet`);
413
+ return buildKcc20WalletOperationFromPlan(wallet, {
414
+ builderKey: cancelsAsk
415
+ ? "kcc20orderbook.cancel-ask"
416
+ : "kcc20orderbook.cancel-bid",
417
+ operation: cancelsAsk ? "cancel-ask-order" : "cancel-bid-order",
418
+ contract: "KCC20Orderbook",
419
+ action: cancelsAsk ? "cancelAsk" : "cancelBid",
420
+ description: `Build a KCC20 DEX Orderbook V1 ${draft.side} cancel request.`,
421
+ params: {
422
+ canonicalCovenantId: canonicalId,
423
+ wrappedMarketId: marketId,
424
+ side: draft.side,
425
+ targetOrderId: orderId,
426
+ ...(context.wrapper.activeCovenantId
427
+ ? { activeWrapperCovenantId: context.wrapper.activeCovenantId }
428
+ : {}),
429
+ activeTargetOrderUtxo: order,
430
+ },
431
+ sourceRequirements: [
432
+ {
433
+ type: cancelsAsk
434
+ ? "kcc20-orderbook-ask-order-utxo"
435
+ : "kcc20-orderbook-bid-order-utxo",
436
+ orderId,
437
+ covenantId: marketId,
438
+ owner: wallet.kcc20Owner,
439
+ outpoint: order.outpoint,
440
+ amount: order.state?.["amount"],
441
+ unitPriceSompi: order.state?.["unitPriceSompi"],
442
+ purpose: "consume the open order UTXO and return remaining assets to owner",
443
+ },
444
+ {
445
+ type: "kaspa-funding-utxo",
446
+ ownerAddress: wallet.walletAddress,
447
+ purpose: "fund output dust and network fee",
448
+ },
449
+ ],
450
+ warnings: [
451
+ "Cancel spends the selected open order UTXO and returns remaining assets to the order owner.",
452
+ "Indexer order status remains source of truth after broadcast.",
453
+ ],
454
+ }, options);
455
+ }
456
+ export function buildKcc20WrappedConsolidationOperation(wallet, context, sourceOutpoints, options = {}) {
457
+ const canonicalId = contractCanonicalId(context);
458
+ const marketId = requireHex32(context.wrapper.marketId, "wrappedMarketId");
459
+ const compatible = ownerWrappedHolderUtxos(context.wrappedTokenUtxos, wallet.kcc20Owner, canonicalId);
460
+ const selected = selectConsolidationBatch(compatible, sourceOutpoints, 8);
461
+ if (selected.length < 2)
462
+ throw new Error("at least two compatible wrapped holder UTXOs are required for consolidation");
463
+ const total = selected
464
+ .reduce((sum, utxo) => sum + BigInt(String(utxo.state?.["amount"] ?? "0")), 0n)
465
+ .toString();
466
+ const summary = summarizeHolderUtxos(compatible, "0");
467
+ return buildKcc20WalletOperationFromPlan(wallet, {
468
+ builderKey: "kcc20orderbook.consolidate-holders",
469
+ operation: "consolidate-orderbook-holders",
470
+ contract: "KCC20Orderbook",
471
+ action: "consolidate",
472
+ description: "Build a KCC20 DEX Orderbook V1 holder consolidation transaction request.",
473
+ params: {
474
+ canonicalCovenantId: canonicalId,
475
+ appCanonicalCovenantId: context.canonicalCovenantId.toLowerCase(),
476
+ wrappedMarketId: marketId,
477
+ activeWrapperCovenantId: context.wrapper.activeCovenantId,
478
+ tokenAmount: total,
479
+ activeWrappedHolderUtxos: selected,
480
+ },
481
+ sourceRequirements: [
482
+ {
483
+ type: "kcc20-orderbook-holder-utxo-batch",
484
+ covenantId: canonicalId,
485
+ wrappedMarketId: marketId,
486
+ activeWrapperCovenantId: context.wrapper.activeCovenantId,
487
+ owner: wallet.kcc20Owner,
488
+ selectedOutpoints: selected.map((utxo) => utxo.outpoint),
489
+ selectedAmounts: selected.map((utxo) => utxo.state?.["amount"]),
490
+ aggregateAmount: summary.aggregateAmount,
491
+ utxoCount: summary.utxoCount,
492
+ purpose: "merge wallet-owned KCC20 DEX Orderbook V1 holder outputs into one holder output",
493
+ },
494
+ {
495
+ type: "kaspa-funding-utxo",
496
+ ownerAddress: wallet.walletAddress,
497
+ purpose: "fund network fee for wrapped holder consolidation",
498
+ },
499
+ ],
500
+ warnings: [
501
+ "Consolidation merges between two and eight wallet-owned holder UTXOs into one larger holder UTXO.",
502
+ "Repeat consolidation when more compatible holder UTXOs remain.",
503
+ ],
504
+ }, options);
505
+ }
506
+ function contractCanonicalId(context) {
507
+ return requireHex32(context.wrapper.contractCanonicalTokenId ??
508
+ context.wrapper.canonicalTokenId ??
509
+ context.canonicalCovenantId, "canonicalCovenantId");
510
+ }
511
+ function requireTradableWrapper(wrapper, requestedMarketId) {
512
+ if (wrapper.enabled === false)
513
+ throw new Error("Wrapped trading is disabled for this market");
514
+ if (wrapper.marketId.toLowerCase() !== requestedMarketId.toLowerCase())
515
+ throw new Error("Requested wrapped market does not match the selected wrapper");
516
+ }
517
+ function validatedWrapperFeeTicket(wrapper, requested) {
518
+ const configured = normalizeOptionalHex32(wrapper.feeTicketId);
519
+ const normalized = normalizeOptionalHex32(requested);
520
+ if (requested && !normalized)
521
+ throw new Error("FeeTicket root id is invalid");
522
+ if (normalized && !configured)
523
+ throw new Error("FeeTicket is not enabled for this wrapped market");
524
+ if (normalized && configured !== normalized)
525
+ throw new Error("Requested FeeTicket root does not match this wrapped market");
526
+ if (wrapper.feeTicketSupported && !configured)
527
+ throw new Error("Wrapped market FeeTicket root is invalid");
528
+ return configured;
529
+ }
530
+ function validatedFillFeeTicket(wrapper, orderTicketId, requested) {
531
+ if (!orderTicketId)
532
+ throw new Error("Selected order is not bound to a FeeTicket root");
533
+ const explicit = requested
534
+ ? requireHex32(requested, "feeTicketId")
535
+ : orderTicketId;
536
+ if (explicit !== orderTicketId)
537
+ throw new Error("Selected order is not bound to the requested FeeTicket root");
538
+ const active = normalizeOptionalHex32(wrapper.feeTicketId);
539
+ if (!active || active !== explicit)
540
+ throw new Error("Selected order FeeTicket root is not the active platform root");
541
+ return explicit;
542
+ }
543
+ function displayAmount(value, decimals) {
544
+ return parseKcc20DisplayAmountToBaseUnits(value, normalizeKcc20Decimals(decimals), "tokenAmount");
545
+ }
546
+ function priceScaleFor(decimals) {
547
+ return kcc20DisplayScaleForDecimals(normalizeKcc20Decimals(decimals)).toString();
548
+ }
549
+ function requireHex32(value, field) {
550
+ const normalized = String(value ?? "")
551
+ .trim()
552
+ .toLowerCase()
553
+ .replace(/^0x/, "");
554
+ if (!/^[a-f0-9]{64}$/.test(normalized))
555
+ throw new Error(`${field} must be 64 hex characters`);
556
+ return normalized;
557
+ }
558
+ function normalizeOptionalHex32(value) {
559
+ if (value === undefined || value === null || value === "")
560
+ return null;
561
+ const normalized = String(value).trim().toLowerCase().replace(/^0x/, "");
562
+ return /^[a-f0-9]{64}$/.test(normalized) && !/^0{64}$/.test(normalized)
563
+ ? normalized
564
+ : null;
565
+ }
566
+ function requireUnsigned(value, field) {
567
+ const raw = String(value ?? "").trim();
568
+ if (!/^\d+$/.test(raw))
569
+ throw new Error(`${field} must be an unsigned integer string`);
570
+ return raw;
571
+ }
572
+ function requireOrderId(value) {
573
+ const normalized = String(value ?? "")
574
+ .trim()
575
+ .toLowerCase();
576
+ if (!/^[a-f0-9]{64}:\d+$/.test(normalized))
577
+ throw new Error("targetOrderId must be txid:vout");
578
+ return normalized;
579
+ }
580
+ //# sourceMappingURL=trading-operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trading-operation.js","sourceRoot":"","sources":["../src/trading-operation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,4BAA4B,EAC5B,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,GAGrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,EACtB,kCAAkC,GACnC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,2CAA2C,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,iCAAiC,EAAE,MAAM,uBAAuB,CAAC;AA6B1E,MAAM,UAAU,wBAAwB,CACtC,MAA8B,EAC9B,OAAqC,EACrC,KAAsB,EACtB,UAAwC,EAAE;IAE1C,sBAAsB,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,yBAAyB,CAC3C,OAAO,CAAC,OAAO,EACf,KAAK,CAAC,WAAW,CAClB,CAAC;IACF,MAAM,IAAI,GACR,KAAK,CAAC,IAAI,KAAK,KAAK;QAClB,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,iBAAiB,EAAE,WAAW,CAAC;QAC/D,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,OAAO,GACX,KAAK,CAAC,IAAI,KAAK,MAAM;QACnB,CAAC,CAAC,uBAAuB,CACrB,OAAO,CAAC,iBAAiB,EACzB,MAAM,CAAC,UAAU,EACjB,WAAW,CACZ;QACH,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,MAAM,GACV,KAAK,CAAC,IAAI,KAAK,MAAM;QACnB,CAAC,CAAC,4BAA4B,CAC1B,OAAO,CAAC,iBAAiB,EACzB,MAAM,CAAC,UAAU,EACjB,MAAM,EACN,WAAW,EACX,IAAI,CACL;QACH,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,OAAO,GACX,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI;QAC/B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,OAAO,EAAE,UAAU;YACjB,CAAC,CAAC,sFAAsF;YACxF,CAAC,CAAC,gEAAgE,CACrE,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;IACpC,OAAO,iCAAiC,CACtC,MAAM,EACN;QACE,UAAU,EAAE,MAAM;YAChB,CAAC,CAAC,2BAA2B;YAC7B,CAAC,CAAC,2BAA2B;QAC/B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,mBAAmB;QAC5D,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;QAC1C,WAAW,EAAE,kCAAkC,KAAK,CAAC,IAAI,iBAAiB;QAC1E,MAAM,EAAE;YACN,mBAAmB,EAAE,WAAW;YAChC,eAAe,EAAE,QAAQ;YACzB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,MAAM;YACnB,cAAc,EAAE,eAAe,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC;YACvE,WAAW;YACX,kBAAkB,EAAE,OAAO,CAAC,WAAW,CAAC;YACxC,QAAQ,EAAE,wBAAwB,CAAC;gBACjC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,MAAM;gBACnB,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,UAAU;gBACV,wBAAwB,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG;aACrD,CAAC;YACF,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB;gBAClC,CAAC,CAAC,EAAE,uBAAuB,EAAE,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBAC/D,CAAC,CAAC,EAAE,CAAC;YACP,qBAAqB,EAAE,IAAI;YAC3B,uBAAuB,EAAE,MAAM;SAChC;QACD,kBAAkB,EAAE,MAAM;YACxB,CAAC,CAAC;gBACE;oBACE,IAAI,EAAE,oBAAoB;oBAC1B,YAAY,EAAE,MAAM,CAAC,aAAa;oBAClC,2BAA2B,EACzB,oFAAoF;iBACvF;gBACD;oBACE,IAAI,EAAE,2BAA2B;oBACjC,UAAU,EAAE,QAAQ;oBACpB,QAAQ,EAAE,IAAI,EAAE,QAAQ;oBACxB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC;oBAC/B,OAAO,EAAE,+BAA+B;iBACzC;aACF;YACH,CAAC,CAAC;gBACE;oBACE,IAAI,EAAE,6BAA6B;oBACnC,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,MAAM,CAAC,UAAU;oBACxB,kBAAkB,EAAE,MAAM;oBAC1B,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;oBAClB,QAAQ,EAAE,MAAM,EAAE,QAAQ;oBAC1B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC;iBAClC;aACF;QACL,QAAQ,EAAE;YACR,kFAAkF;YAClF,0DAA0D;SAC3D;KACF,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,uBAAuB,CACrC,MAA8B,EAC9B,OAAqC,EACrC,KAAqB,EACrB,UAAwC,EAAE;IAE1C,sBAAsB,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;IACtC,MAAM,KAAK,GAAG,sBAAsB,CAAC,OAAO,CAAC,iBAAiB,EAAE;QAC9D,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC;QAC5C,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,gBAAgB,EAAE,WAAW;QAC7B,eAAe,EAAE,MAAM;QACvB,cAAc,EAAE,eAAe,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC;KACxE,CAAC,CAAC;IACH,IAAI,CAAC,KAAK;QACR,MAAM,IAAI,KAAK,CACb,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,iDAAiD,CACtF,CAAC;IACJ,MAAM,OAAO,GAAG,QAAQ;QACtB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,uBAAuB,CACrB,OAAO,CAAC,iBAAiB,EACzB,MAAM,CAAC,UAAU,EACjB,WAAW,CACZ,CAAC;IACN,MAAM,MAAM,GAAG,QAAQ;QACrB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,4BAA4B,CAC1B,OAAO,CAAC,iBAAiB,EACzB,MAAM,CAAC,UAAU,EACjB,MAAM,EACN,WAAW,EACX,IAAI,CACL,CAAC;IACN,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxE,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM;QACtB,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;IACJ,MAAM,eAAe,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,WAAW,CAAC;IAChE,MAAM,aAAa,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,eAAe;QACjC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC;QAC3E,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,MAAM,GAAG,WAAW;QACxB,CAAC,CAAC,yBAAyB,CACvB,OAAO,CAAC,cAAc,IAAI,EAAE,EAC5B,MAAM,CAAC,UAAU,CAClB,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,WAAW,IAAI,CAAC,MAAM;QACxB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,2BAA2B,CAAC;QAC3C,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,MAAM;QACnB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,UAAU,EAAE,MAAM,CAChB,KAAK,CAAC,KAAK,EAAE,CAAC,YAAY,CAAC;YACzB,KAAK,CAAC,KAAK,EAAE,CAAC,mBAAmB,CAAC;YAClC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,CACvC;QACD,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC;KAClC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IACjE,OAAO,iCAAiC,CACtC,MAAM,EACN;QACE,UAAU,EAAE,QAAQ;YAClB,CAAC,CAAC,yBAAyB;YAC3B,CAAC,CAAC,yBAAyB;QAC7B,SAAS;QACT,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACxC,WAAW,EAAE,kCAAkC,KAAK,CAAC,IAAI,gBAAgB;QACzE,MAAM,EAAE;YACN,mBAAmB,EAAE,WAAW;YAChC,eAAe,EAAE,QAAQ;YACzB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE;YAChD,WAAW,EAAE,MAAM;YACnB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,WAAW;YACX,kBAAkB,EAAE,OAAO,CAAC,WAAW,CAAC;YACxC,QAAQ;YACR,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB;gBAClC,CAAC,CAAC,EAAE,uBAAuB,EAAE,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBAC/D,CAAC,CAAC,EAAE,CAAC;YACP,qBAAqB,EAAE,KAAK;YAC5B,uBAAuB,EAAE,MAAM;YAC/B,mBAAmB,EAAE,MAAM,IAAI,IAAI;SACpC;QACD,kBAAkB,EAAE;YAClB;gBACE,IAAI,EAAE,QAAQ;oBACZ,CAAC,CAAC,gCAAgC;oBAClC,CAAC,CAAC,gCAAgC;gBACpC,OAAO,EAAE,KAAK,CAAC,aAAa;gBAC5B,UAAU,EAAE,QAAQ;gBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC;gBAC/B,cAAc,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,gBAAgB,CAAC;aAChD;YACD,GAAG,CAAC,QAAQ;gBACV,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,oBAAoB;wBAC1B,YAAY,EAAE,MAAM,CAAC,aAAa;wBAClC,2BAA2B,EACzB,wEAAwE;qBAC3E;iBACF;gBACH,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,6BAA6B;wBACnC,UAAU,EAAE,QAAQ;wBACpB,KAAK,EAAE,MAAM,CAAC,UAAU;wBACxB,kBAAkB,EAAE,MAAM;wBAC1B,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;wBAClB,QAAQ,EAAE,MAAM,EAAE,QAAQ;wBAC1B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC;qBAClC;iBACF,CAAC;YACN,GAAG,CAAC,MAAM;gBACR,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,iBAAiB;wBACvB,MAAM,EAAE,WAAW;wBACnB,KAAK,EAAE,MAAM,CAAC,UAAU;wBACxB,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,WAAW,EAAE,MAAM,CAAC,WAAW;wBAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,OAAO,EAAE,sDAAsD;qBAChE;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;SACR;QACD,QAAQ,EAAE;YACR,MAAM;gBACJ,CAAC,CAAC,4EAA4E;gBAC9E,CAAC,CAAC,wEAAwE;SAC7E;KACF,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AA4BD,MAAM,UAAU,wBAAwB,CACtC,MAA8B,EAC9B,OAAqC,EACrC,KAAsB,EACtB,UAAwC,EAAE;IAE1C,sBAAsB,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/D,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAClD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,iBAAiB,EAAE;YACjE,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxB,gBAAgB,EAAE,WAAW;YAC7B,eAAe,EAAE,IAAI,CAAC,WAAW;YACjC,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,CAAC,MAAM;QAC9C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAC5C,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAC7C,EAAE,CACH,CAAC;IACF,MAAM,OAAO,GAAG,UAAU;QACxB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,uBAAuB,CACrB,OAAO,CAAC,iBAAiB,EACzB,MAAM,CAAC,UAAU,EACjB,WAAW,CACZ,CAAC;IACN,MAAM,YAAY,GAAG,UAAU;QAC7B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,4BAA4B,CAC1B,OAAO,CAAC,iBAAiB,EACzB,MAAM,CAAC,UAAU,EACjB,WAAW,CAAC,QAAQ,EAAE,EACtB,WAAW,CACZ,CAAC;IACN,MAAM,aAAa,GAA+B,EAAE,CAAC;IACrD,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,OAAO;iBAClB,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAS,CAAC,CAAC;iBACrD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACb,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACnC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACjC,CAAC,CAAC,CAAC,CAAC;gBACJ,CAAC,CAAC,CAAC,CACN;iBACA,IAAI,CACH,CAAC,SAAS,EAAE,EAAE,CACZ,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAC3B,CAAC;YACJ,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAS,CAAC,CAAC;gBAC1B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,eAAe,GACnB,CAAC,UAAU;QACX,KAAK,CAAC,aAAa,CAAC,MAAM,IAAI,2CAA2C;QACzE,OAAO,CAAC,YAAY,CAAC,CAAC;IACxB,IACE,CAAC,UAAU;QACX,CAAC,eAAe;QAChB,aAAa,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,CAAC,MAAM,EACnD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW;QACnC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC;QAChD,CAAC,CAAC,IAAI,CAAC;IACT,IAAI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,WAAW;QAC3E,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;IACJ,IACE,WAAW;QACX,MAAM,CAAC,IAAI,CACT,CAAC,KAAK,EAAE,EAAE,CACR,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,CAAC,KAAK,WAAW,CACvE,EACD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,WAAW;QACxB,CAAC,CAAC,yBAAyB,CACvB,OAAO,CAAC,cAAc,IAAI,EAAE,EAC5B,MAAM,CAAC,UAAU,CAClB,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,WAAW,IAAI,CAAC,MAAM;QACxB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,MAAM;QACxB,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,MAAM;QACtB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAG,MAAM;QAC3B,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC;IACtE,IACE,KAAK,CAAC,iBAAiB;QACvB,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAEnD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,IACE,KAAK,CAAC,sBAAsB;QAC5B,MAAM,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC;QAE7D,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;IACJ,MAAM,OAAO,GAAG,UAAU;QACxB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1D,OAAO,iCAAiC,CACtC,MAAM,EACN;QACE,UAAU,EAAE,UAAU;YACpB,CAAC,CAAC,2BAA2B;YAC7B,CAAC,CAAC,2BAA2B;QAC/B,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,kBAAkB;QAC/D,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;QAC9C,WAAW,EAAE,kCAAkC,KAAK,CAAC,IAAI,6BAA6B;QACtF,MAAM,EAAE;YACN,mBAAmB,EAAE,WAAW;YAChC,eAAe,EAAE,QAAQ;YACzB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW;YACX,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,IAAI,IAAI;YACtD,KAAK,EAAE,KAAK,CAAC,aAAa;YAC1B,UAAU,EAAE,KAAK;YACjB,gBAAgB,EAAE,WAAW;YAC7B,sBAAsB,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI;YAC9D,cAAc,EAAE,SAAS;YACzB,mBAAmB,EAAE,cAAc;YACnC,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,IAAI,IAAI;YAC1D,WAAW;YACX,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;YAC5C,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB;gBAClC,CAAC,CAAC,EAAE,uBAAuB,EAAE,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBAC/D,CAAC,CAAC,EAAE,CAAC;YACP,sBAAsB,EAAE,MAAM;YAC9B,uBAAuB,EAAE,YAAY;YACrC,wBAAwB,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa;SAC/D;QACD,kBAAkB,EAAE;YAClB,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC3C,IAAI,EAAE,UAAU;oBACd,CAAC,CAAC,gCAAgC;oBAClC,CAAC,CAAC,gCAAgC;gBACpC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,UAAU,EAAE,QAAQ;gBACpB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ;gBACjC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC;aACzC,CAAC,CAAC;YACH,GAAG,CAAC,CAAC,UAAU,IAAI,YAAY;gBAC7B,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,6BAA6B;wBACnC,UAAU,EAAE,QAAQ;wBACpB,KAAK,EAAE,MAAM,CAAC,UAAU;wBACxB,kBAAkB,EAAE,WAAW,CAAC,QAAQ,EAAE;wBAC1C,QAAQ,EAAE,YAAY,CAAC,QAAQ;wBAC/B,MAAM,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC;qBACvC;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,YAAY;gBAC9B,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBACpC,IAAI,EAAE,6BAA6B;oBACnC,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,MAAM,CAAC,UAAU;oBACxB,QAAQ,EAAE,KAAK;oBACf,kBAAkB,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,WAAW;oBAC3D,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC;iBACjC,CAAC,CAAC;gBACL,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,MAAM;gBACR,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,uBAAuB;wBAC7B,UAAU,EAAE,WAAW;wBACvB,OAAO,EAAE,2CAA2C;wBACpD,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,WAAW,EAAE,MAAM,CAAC,WAAW;qBAChC;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,CAAC,UAAU;gBACb,CAAC,CAAC;oBACE;wBACE,IAAI,EAAE,qCAAqC;wBAC3C,UAAU,EAAE,QAAQ;wBACpB,KAAK,EAAE,MAAM,CAAC,UAAU;wBACxB,kBAAkB,EAAE,WAAW,CAAC,QAAQ,EAAE;wBAC1C,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;qBACnB;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;YACP;gBACE,IAAI,EAAE,oBAAoB;gBAC1B,YAAY,EAAE,MAAM,CAAC,aAAa;gBAClC,OAAO,EAAE,+CAA+C;aACzD;SACF;QACD,QAAQ,EAAE;YACR,0EAA0E;YAC1E,MAAM;gBACJ,CAAC,CAAC,sCAAsC;gBACxC,CAAC,CAAC,8CAA8C;SACnD;KACF,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,yBAAyB,CACvC,MAA8B,EAC9B,OAAqC,EACrC,KAAuB,EACvB,UAAwC,EAAE;IAE1C,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;IACxC,MAAM,KAAK,GAAG,sBAAsB,CAAC,OAAO,CAAC,iBAAiB,EAAE;QAC9D,OAAO;QACP,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,gBAAgB,EAAE,WAAW;QAC7B,KAAK,EAAE,MAAM,CAAC,UAAU;KACzB,CAAC,CAAC;IACH,IAAI,CAAC,KAAK;QACR,MAAM,IAAI,KAAK,CACb,YAAY,KAAK,CAAC,IAAI,gDAAgD,CACvE,CAAC;IACJ,OAAO,iCAAiC,CACtC,MAAM,EACN;QACE,UAAU,EAAE,UAAU;YACpB,CAAC,CAAC,2BAA2B;YAC7B,CAAC,CAAC,2BAA2B;QAC/B,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,kBAAkB;QAC/D,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;QAC9C,WAAW,EAAE,kCAAkC,KAAK,CAAC,IAAI,kBAAkB;QAC3E,MAAM,EAAE;YACN,mBAAmB,EAAE,WAAW;YAChC,eAAe,EAAE,QAAQ;YACzB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,aAAa,EAAE,OAAO;YACtB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB;gBAClC,CAAC,CAAC,EAAE,uBAAuB,EAAE,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBAC/D,CAAC,CAAC,EAAE,CAAC;YACP,qBAAqB,EAAE,KAAK;SAC7B;QACD,kBAAkB,EAAE;YAClB;gBACE,IAAI,EAAE,UAAU;oBACd,CAAC,CAAC,gCAAgC;oBAClC,CAAC,CAAC,gCAAgC;gBACpC,OAAO;gBACP,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,MAAM,CAAC,UAAU;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC;gBAC/B,cAAc,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,gBAAgB,CAAC;gBAC/C,OAAO,EACL,kEAAkE;aACrE;YACD;gBACE,IAAI,EAAE,oBAAoB;gBAC1B,YAAY,EAAE,MAAM,CAAC,aAAa;gBAClC,OAAO,EAAE,kCAAkC;aAC5C;SACF;QACD,QAAQ,EAAE;YACR,6FAA6F;YAC7F,+DAA+D;SAChE;KACF,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uCAAuC,CACrD,MAA8B,EAC9B,OAAqC,EACrC,eAAmC,EACnC,UAAwC,EAAE;IAE1C,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,uBAAuB,CACxC,OAAO,CAAC,iBAAiB,EACzB,MAAM,CAAC,UAAU,EACjB,WAAW,CACZ,CAAC;IACF,MAAM,QAAQ,GAAG,wBAAwB,CAAC,UAAU,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;IAC1E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,MAAM,KAAK,GAAG,QAAQ;SACnB,MAAM,CACL,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,EAClE,EAAE,CACH;SACA,QAAQ,EAAE,CAAC;IACd,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,iCAAiC,CACtC,MAAM,EACN;QACE,UAAU,EAAE,oCAAoC;QAChD,SAAS,EAAE,+BAA+B;QAC1C,QAAQ,EAAE,gBAAgB;QAC1B,MAAM,EAAE,aAAa;QACrB,WAAW,EACT,0EAA0E;QAC5E,MAAM,EAAE;YACN,mBAAmB,EAAE,WAAW;YAChC,sBAAsB,EAAE,OAAO,CAAC,mBAAmB,CAAC,WAAW,EAAE;YACjE,eAAe,EAAE,QAAQ;YACzB,uBAAuB,EAAE,OAAO,CAAC,OAAO,CAAC,gBAAgB;YACzD,WAAW,EAAE,KAAK;YAClB,wBAAwB,EAAE,QAAQ;SACnC;QACD,kBAAkB,EAAE;YAClB;gBACE,IAAI,EAAE,mCAAmC;gBACzC,UAAU,EAAE,WAAW;gBACvB,eAAe,EAAE,QAAQ;gBACzB,uBAAuB,EAAE,OAAO,CAAC,OAAO,CAAC,gBAAgB;gBACzD,KAAK,EAAE,MAAM,CAAC,UAAU;gBACxB,iBAAiB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACxD,eAAe,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC;gBAC/D,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,OAAO,EACL,iFAAiF;aACpF;YACD;gBACE,IAAI,EAAE,oBAAoB;gBAC1B,YAAY,EAAE,MAAM,CAAC,aAAa;gBAClC,OAAO,EAAE,mDAAmD;aAC7D;SACF;QACD,QAAQ,EAAE;YACR,mGAAmG;YACnG,gEAAgE;SACjE;KACF,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAqC;IAChE,OAAO,YAAY,CACjB,OAAO,CAAC,OAAO,CAAC,wBAAwB;QACtC,OAAO,CAAC,OAAO,CAAC,gBAAgB;QAChC,OAAO,CAAC,mBAAmB,EAC7B,qBAAqB,CACtB,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,OAA+B,EAC/B,iBAAyB;IAEzB,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK;QAC3B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,iBAAiB,CAAC,WAAW,EAAE;QACpE,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;AACN,CAAC;AAED,SAAS,yBAAyB,CAChC,OAA+B,EAC/B,SAAkB;IAElB,MAAM,UAAU,GAAG,sBAAsB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACrD,IAAI,SAAS,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC9E,IAAI,UAAU,IAAI,CAAC,UAAU;QAC3B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,IAAI,UAAU,IAAI,UAAU,KAAK,UAAU;QACzC,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;IACJ,IAAI,OAAO,CAAC,kBAAkB,IAAI,CAAC,UAAU;QAC3C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,sBAAsB,CAC7B,OAA+B,EAC/B,aAA4B,EAC5B,SAAkB;IAElB,IAAI,CAAC,aAAa;QAChB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,SAAS;QACxB,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC;QACxC,CAAC,CAAC,aAAa,CAAC;IAClB,IAAI,QAAQ,KAAK,aAAa;QAC5B,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;IACJ,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,QAAQ;QAChC,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;IACJ,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CACpB,KAAa,EACb,QAAmC;IAEnC,OAAO,kCAAkC,CACvC,KAAK,EACL,sBAAsB,CAAC,QAAQ,CAAC,EAChC,aAAa,CACd,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,QAAmC;IACxD,OAAO,4BAA4B,CACjC,sBAAsB,CAAC,QAAQ,CAAC,CACjC,CAAC,QAAQ,EAAE,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,KAAa;IACjD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SACnC,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,4BAA4B,CAAC,CAAC;IACxD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC5C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACvE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzE,OAAO,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;QACrE,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,KAAa;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,qCAAqC,CAAC,CAAC;IACjE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SACnC,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;IACjB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,OAAO,UAAU,CAAC;AACpB,CAAC"}