@mutinylabs/slip 0.2.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 (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +99 -0
  3. package/dist/ai.d.ts +70 -0
  4. package/dist/ai.d.ts.map +1 -0
  5. package/dist/ai.js +448 -0
  6. package/dist/ai.js.map +1 -0
  7. package/dist/anchor.d.ts +15 -0
  8. package/dist/anchor.d.ts.map +1 -0
  9. package/dist/anchor.js +15 -0
  10. package/dist/anchor.js.map +1 -0
  11. package/dist/client.d.ts +90 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/client.js +161 -0
  14. package/dist/client.js.map +1 -0
  15. package/dist/evidence.d.ts +13 -0
  16. package/dist/evidence.d.ts.map +1 -0
  17. package/dist/evidence.js +34 -0
  18. package/dist/evidence.js.map +1 -0
  19. package/dist/generated/accounts/index.d.ts +10 -0
  20. package/dist/generated/accounts/index.d.ts.map +1 -0
  21. package/dist/generated/accounts/index.js +10 -0
  22. package/dist/generated/accounts/index.js.map +1 -0
  23. package/dist/generated/accounts/market.d.ts +73 -0
  24. package/dist/generated/accounts/market.d.ts.map +1 -0
  25. package/dist/generated/accounts/market.js +105 -0
  26. package/dist/generated/accounts/market.js.map +1 -0
  27. package/dist/generated/accounts/marketTicket.d.ts +43 -0
  28. package/dist/generated/accounts/marketTicket.d.ts.map +1 -0
  29. package/dist/generated/accounts/marketTicket.js +69 -0
  30. package/dist/generated/accounts/marketTicket.js.map +1 -0
  31. package/dist/generated/errors/index.d.ts +9 -0
  32. package/dist/generated/errors/index.d.ts.map +1 -0
  33. package/dist/generated/errors/index.js +9 -0
  34. package/dist/generated/errors/index.js.map +1 -0
  35. package/dist/generated/errors/slip.d.ts +68 -0
  36. package/dist/generated/errors/slip.d.ts.map +1 -0
  37. package/dist/generated/errors/slip.js +96 -0
  38. package/dist/generated/errors/slip.js.map +1 -0
  39. package/dist/generated/index.d.ts +14 -0
  40. package/dist/generated/index.d.ts.map +1 -0
  41. package/dist/generated/index.js +14 -0
  42. package/dist/generated/index.js.map +1 -0
  43. package/dist/generated/instructions/buyTicket.d.ts +80 -0
  44. package/dist/generated/instructions/buyTicket.d.ts.map +1 -0
  45. package/dist/generated/instructions/buyTicket.js +149 -0
  46. package/dist/generated/instructions/buyTicket.js.map +1 -0
  47. package/dist/generated/instructions/claimTicket.d.ts +55 -0
  48. package/dist/generated/instructions/claimTicket.d.ts.map +1 -0
  49. package/dist/generated/instructions/claimTicket.js +87 -0
  50. package/dist/generated/instructions/claimTicket.js.map +1 -0
  51. package/dist/generated/instructions/createMarket.d.ts +105 -0
  52. package/dist/generated/instructions/createMarket.d.ts.map +1 -0
  53. package/dist/generated/instructions/createMarket.js +195 -0
  54. package/dist/generated/instructions/createMarket.js.map +1 -0
  55. package/dist/generated/instructions/index.d.ts +14 -0
  56. package/dist/generated/instructions/index.d.ts.map +1 -0
  57. package/dist/generated/instructions/index.js +14 -0
  58. package/dist/generated/instructions/index.js.map +1 -0
  59. package/dist/generated/instructions/resolveMarket.d.ts +75 -0
  60. package/dist/generated/instructions/resolveMarket.d.ts.map +1 -0
  61. package/dist/generated/instructions/resolveMarket.js +107 -0
  62. package/dist/generated/instructions/resolveMarket.js.map +1 -0
  63. package/dist/generated/instructions/resolveMarketV3.d.ts +78 -0
  64. package/dist/generated/instructions/resolveMarketV3.d.ts.map +1 -0
  65. package/dist/generated/instructions/resolveMarketV3.js +109 -0
  66. package/dist/generated/instructions/resolveMarketV3.js.map +1 -0
  67. package/dist/generated/instructions/voidMarket.d.ts +40 -0
  68. package/dist/generated/instructions/voidMarket.d.ts.map +1 -0
  69. package/dist/generated/instructions/voidMarket.js +64 -0
  70. package/dist/generated/instructions/voidMarket.js.map +1 -0
  71. package/dist/generated/pdas/index.d.ts +10 -0
  72. package/dist/generated/pdas/index.d.ts.map +1 -0
  73. package/dist/generated/pdas/index.js +10 -0
  74. package/dist/generated/pdas/index.js.map +1 -0
  75. package/dist/generated/pdas/market.d.ts +16 -0
  76. package/dist/generated/pdas/market.d.ts.map +1 -0
  77. package/dist/generated/pdas/market.js +20 -0
  78. package/dist/generated/pdas/market.js.map +1 -0
  79. package/dist/generated/pdas/ticket.d.ts +17 -0
  80. package/dist/generated/pdas/ticket.d.ts.map +1 -0
  81. package/dist/generated/pdas/ticket.js +21 -0
  82. package/dist/generated/pdas/ticket.js.map +1 -0
  83. package/dist/generated/programs/index.d.ts +9 -0
  84. package/dist/generated/programs/index.d.ts.map +1 -0
  85. package/dist/generated/programs/index.js +9 -0
  86. package/dist/generated/programs/index.js.map +1 -0
  87. package/dist/generated/programs/slip.d.ts +43 -0
  88. package/dist/generated/programs/slip.d.ts.map +1 -0
  89. package/dist/generated/programs/slip.js +106 -0
  90. package/dist/generated/programs/slip.js.map +1 -0
  91. package/dist/generated/shared/index.d.ts +50 -0
  92. package/dist/generated/shared/index.d.ts.map +1 -0
  93. package/dist/generated/shared/index.js +87 -0
  94. package/dist/generated/shared/index.js.map +1 -0
  95. package/dist/generated/types/binaryOp.d.ts +18 -0
  96. package/dist/generated/types/binaryOp.d.ts.map +1 -0
  97. package/dist/generated/types/binaryOp.js +24 -0
  98. package/dist/generated/types/binaryOp.js.map +1 -0
  99. package/dist/generated/types/index.d.ts +19 -0
  100. package/dist/generated/types/index.d.ts.map +1 -0
  101. package/dist/generated/types/index.js +19 -0
  102. package/dist/generated/types/index.js.map +1 -0
  103. package/dist/generated/types/marketExpression.d.ts +34 -0
  104. package/dist/generated/types/marketExpression.d.ts.map +1 -0
  105. package/dist/generated/types/marketExpression.js +37 -0
  106. package/dist/generated/types/marketExpression.js.map +1 -0
  107. package/dist/generated/types/marketState.d.ts +18 -0
  108. package/dist/generated/types/marketState.d.ts.map +1 -0
  109. package/dist/generated/types/marketState.js +24 -0
  110. package/dist/generated/types/marketState.js.map +1 -0
  111. package/dist/generated/types/multiProof.d.ts +28 -0
  112. package/dist/generated/types/multiProof.d.ts.map +1 -0
  113. package/dist/generated/types/multiProof.js +25 -0
  114. package/dist/generated/types/multiProof.js.map +1 -0
  115. package/dist/generated/types/outcomeBand.d.ts +26 -0
  116. package/dist/generated/types/outcomeBand.d.ts.map +1 -0
  117. package/dist/generated/types/outcomeBand.js +26 -0
  118. package/dist/generated/types/outcomeBand.js.map +1 -0
  119. package/dist/generated/types/proofNode.d.ts +17 -0
  120. package/dist/generated/types/proofNode.d.ts.map +1 -0
  121. package/dist/generated/types/proofNode.js +24 -0
  122. package/dist/generated/types/proofNode.js.map +1 -0
  123. package/dist/generated/types/provenStat.d.ts +21 -0
  124. package/dist/generated/types/provenStat.d.ts.map +1 -0
  125. package/dist/generated/types/provenStat.js +25 -0
  126. package/dist/generated/types/provenStat.js.map +1 -0
  127. package/dist/generated/types/scoreStatInput.d.ts +18 -0
  128. package/dist/generated/types/scoreStatInput.d.ts.map +1 -0
  129. package/dist/generated/types/scoreStatInput.js +26 -0
  130. package/dist/generated/types/scoreStatInput.js.map +1 -0
  131. package/dist/generated/types/settlementMode.d.ts +16 -0
  132. package/dist/generated/types/settlementMode.d.ts.map +1 -0
  133. package/dist/generated/types/settlementMode.js +22 -0
  134. package/dist/generated/types/settlementMode.js.map +1 -0
  135. package/dist/generated/types/sideSelector.d.ts +18 -0
  136. package/dist/generated/types/sideSelector.d.ts.map +1 -0
  137. package/dist/generated/types/sideSelector.js +24 -0
  138. package/dist/generated/types/sideSelector.js.map +1 -0
  139. package/dist/generated/types/summaryInput.d.ts +26 -0
  140. package/dist/generated/types/summaryInput.d.ts.map +1 -0
  141. package/dist/generated/types/summaryInput.js +30 -0
  142. package/dist/generated/types/summaryInput.js.map +1 -0
  143. package/dist/idl/slip.json +2418 -0
  144. package/dist/index.d.ts +9 -0
  145. package/dist/index.d.ts.map +1 -0
  146. package/dist/index.js +9 -0
  147. package/dist/index.js.map +1 -0
  148. package/dist/market-reference.d.ts +9 -0
  149. package/dist/market-reference.d.ts.map +1 -0
  150. package/dist/market-reference.js +38 -0
  151. package/dist/market-reference.js.map +1 -0
  152. package/dist/market.d.ts +42 -0
  153. package/dist/market.d.ts.map +1 -0
  154. package/dist/market.js +267 -0
  155. package/dist/market.js.map +1 -0
  156. package/dist/merkle.d.ts +48 -0
  157. package/dist/merkle.d.ts.map +1 -0
  158. package/dist/merkle.js +67 -0
  159. package/dist/merkle.js.map +1 -0
  160. package/dist/pda.d.ts +12 -0
  161. package/dist/pda.d.ts.map +1 -0
  162. package/dist/pda.js +30 -0
  163. package/dist/pda.js.map +1 -0
  164. package/dist/proof.d.ts +40 -0
  165. package/dist/proof.d.ts.map +1 -0
  166. package/dist/proof.js +106 -0
  167. package/dist/proof.js.map +1 -0
  168. package/dist/public-client.d.ts +60 -0
  169. package/dist/public-client.d.ts.map +1 -0
  170. package/dist/public-client.js +487 -0
  171. package/dist/public-client.js.map +1 -0
  172. package/dist/public-math.d.ts +17 -0
  173. package/dist/public-math.d.ts.map +1 -0
  174. package/dist/public-math.js +57 -0
  175. package/dist/public-math.js.map +1 -0
  176. package/dist/public-types.d.ts +151 -0
  177. package/dist/public-types.d.ts.map +1 -0
  178. package/dist/public-types.js +2 -0
  179. package/dist/public-types.js.map +1 -0
  180. package/dist/rulebook-skills.d.ts +15 -0
  181. package/dist/rulebook-skills.d.ts.map +1 -0
  182. package/dist/rulebook-skills.js +155 -0
  183. package/dist/rulebook-skills.js.map +1 -0
  184. package/dist/rulebook.d.ts +17 -0
  185. package/dist/rulebook.d.ts.map +1 -0
  186. package/dist/rulebook.js +42 -0
  187. package/dist/rulebook.js.map +1 -0
  188. package/dist/transaction.d.ts +23 -0
  189. package/dist/transaction.d.ts.map +1 -0
  190. package/dist/transaction.js +51 -0
  191. package/dist/transaction.js.map +1 -0
  192. package/dist/txline.d.ts +55 -0
  193. package/dist/txline.d.ts.map +1 -0
  194. package/dist/txline.js +238 -0
  195. package/dist/txline.js.map +1 -0
  196. package/dist/types.d.ts +149 -0
  197. package/dist/types.d.ts.map +1 -0
  198. package/dist/types.js +10 -0
  199. package/dist/types.js.map +1 -0
  200. package/package.json +123 -0
@@ -0,0 +1,151 @@
1
+ import type { Address, Instruction, ReadonlyUint8Array } from "@solana/kit";
2
+ export type SlipNetwork = "localnet" | "devnet" | "mainnet-beta";
3
+ export interface SlipClientConfig {
4
+ rpcUrl: string;
5
+ websocketUrl?: string;
6
+ programAddress: Address;
7
+ settlementMint: Address;
8
+ compilerOrigin?: string;
9
+ network: SlipNetwork;
10
+ commitment?: "confirmed" | "finalized";
11
+ }
12
+ export interface MarketReferenceV1 {
13
+ version: 1;
14
+ network: SlipNetwork;
15
+ program: string;
16
+ mint: string;
17
+ market: string;
18
+ fixtureId: string;
19
+ rulebookHash: string;
20
+ creationSignature: string;
21
+ }
22
+ export interface RulebookExpression {
23
+ fixtureId: number;
24
+ settlementMode: "Terminal";
25
+ period: number;
26
+ statAKey: number;
27
+ statASide: "Home" | "Away" | "Total";
28
+ statBKey: number | null;
29
+ statBSide: "Home" | "Away" | "Total" | null;
30
+ op: "Add" | "Sub" | "Min" | null;
31
+ }
32
+ export interface RulebookBand {
33
+ lowerInclusive: bigint | null;
34
+ upperExclusive: bigint | null;
35
+ outcomeIndex: number;
36
+ }
37
+ export interface CompiledRulebook {
38
+ version: 1;
39
+ fixtureId: string;
40
+ question: string;
41
+ outcomeLabels: string[];
42
+ sentence: string;
43
+ expression: RulebookExpression;
44
+ bands: RulebookBand[];
45
+ entryDeadline: number;
46
+ resolveAt: number;
47
+ voidAt: number;
48
+ feeBps: number;
49
+ tipBps: number;
50
+ hash: string;
51
+ }
52
+ export type MarketStatus = "open" | "resolved" | "voided";
53
+ export interface MarketSnapshot {
54
+ address: Address;
55
+ id: bigint;
56
+ creator: Address;
57
+ mint: Address;
58
+ expression: RulebookExpression;
59
+ outcomeLabels: string[];
60
+ bands: RulebookBand[];
61
+ pools: bigint[];
62
+ entryDeadline: number;
63
+ resolveAt: number;
64
+ voidAt: number;
65
+ feeBps: number;
66
+ tipBps: number;
67
+ status: MarketStatus;
68
+ winningOutcome: number | null;
69
+ resolutionEvidenceHash: ReadonlyUint8Array | null;
70
+ createdAt: number;
71
+ resolvedAt: number | null;
72
+ ticketCount: number;
73
+ claimedStake: bigint;
74
+ }
75
+ export interface TicketSnapshot {
76
+ address: Address;
77
+ market: Address;
78
+ owner: Address;
79
+ nonce: bigint;
80
+ outcomeIndex: number;
81
+ stake: bigint;
82
+ claimed: boolean;
83
+ }
84
+ export interface CreateMarketRequest {
85
+ id: bigint;
86
+ creator: Address;
87
+ rulebook: CompiledRulebook;
88
+ }
89
+ export interface BuyTicketRequest {
90
+ market: Address;
91
+ buyer: Address;
92
+ outcomeIndex: number;
93
+ amount: bigint;
94
+ nonce: bigint;
95
+ }
96
+ export interface MarketInstructions {
97
+ instructions: readonly Instruction[];
98
+ market: Address;
99
+ }
100
+ export interface TicketInstructions {
101
+ instructions: readonly Instruction[];
102
+ ticket: Address;
103
+ }
104
+ export interface CompileRulebookRequest {
105
+ fixtureId: string;
106
+ question: string;
107
+ /** Optional exact labels. Omit them to let the Rulebook compiler derive 2–5 outcomes from natural language. */
108
+ outcomeLabels?: string[];
109
+ /** Authenticated consumer fixture projection used for names and kickoff context; settlement still proves fixtureId stats on-chain. */
110
+ fixture?: {
111
+ competition: string;
112
+ home: string;
113
+ away: string;
114
+ kickoff: number;
115
+ gameState?: number;
116
+ };
117
+ }
118
+ export interface TxlineProofNodeV3 {
119
+ hash: readonly number[];
120
+ isRightSibling: boolean;
121
+ }
122
+ export interface TxlineStatV3 {
123
+ key: number;
124
+ value: number;
125
+ period: number;
126
+ }
127
+ /** Exact JSON shape returned by TxLINE's archived stat-validation-v3 endpoint. */
128
+ export interface ArchivedTxlineScoresProofV3 {
129
+ ts: number | bigint;
130
+ eventStatRoot: readonly number[];
131
+ statsToProve: readonly {
132
+ stat: TxlineStatV3;
133
+ statProof: readonly TxlineProofNodeV3[];
134
+ }[];
135
+ multiproof: {
136
+ hashes: readonly TxlineProofNodeV3[];
137
+ indices: readonly number[];
138
+ };
139
+ summary: {
140
+ fixtureId: number | bigint;
141
+ updateStats: {
142
+ updateCount: number;
143
+ minTimestamp: number | bigint;
144
+ maxTimestamp: number | bigint;
145
+ };
146
+ eventStatsSubTreeRoot: readonly number[];
147
+ };
148
+ subTreeProof: readonly TxlineProofNodeV3[];
149
+ mainTreeProof: readonly TxlineProofNodeV3[];
150
+ }
151
+ //# sourceMappingURL=public-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-types.d.ts","sourceRoot":"","sources":["../src/public-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=public-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-types.js","sourceRoot":"","sources":["../src/public-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ export interface RulebookPromptSkill {
2
+ name: string;
3
+ purpose: string;
4
+ guidance: readonly string[];
5
+ }
6
+ export interface RulebookPromptExample {
7
+ request: string;
8
+ output: Record<string, unknown>;
9
+ }
10
+ /** Small, composable knowledge blocks used by every Rulebook model provider. */
11
+ export declare const RULEBOOK_PROMPT_SKILLS: readonly RulebookPromptSkill[];
12
+ /** Diverse demonstrations teach the IR shape without creating a phrase-matching parser. */
13
+ export declare const RULEBOOK_PROMPT_EXAMPLES: readonly RulebookPromptExample[];
14
+ export declare function buildRulebookSystemPrompt(): string;
15
+ //# sourceMappingURL=rulebook-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulebook-skills.d.ts","sourceRoot":"","sources":["../src/rulebook-skills.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,gFAAgF;AAChF,eAAO,MAAM,sBAAsB,EAAE,SAAS,mBAAmB,EA4CvD,CAAC;AAEX,2FAA2F;AAC3F,eAAO,MAAM,wBAAwB,EAAE,SAAS,qBAAqB,EAmF3D,CAAC;AAcX,wBAAgB,yBAAyB,IAAI,MAAM,CAWlD"}
@@ -0,0 +1,155 @@
1
+ /** Small, composable knowledge blocks used by every Rulebook model provider. */
2
+ export const RULEBOOK_PROMPT_SKILLS = [
3
+ {
4
+ name: "txline-stat-selection",
5
+ purpose: "Select only a score statistic and period that the TxLINE proof surface can settle.",
6
+ guidance: [
7
+ "The only concepts are goals, yellowCards, redCards, and corners.",
8
+ "The periods are match, first_half, halftime, second_half, extra_time_first_half, extra_time_second_half, penalties, and extra_time.",
9
+ "Player props and all other statistics are unsupported because no proof leaf exists for them.",
10
+ "First-event questions are unsupported because the aggregate stat proof does not provide a canonical event-order or zero/non-membership witness.",
11
+ "First-player questions are also unsupported because player identity is not committed in the aggregate stat leaf.",
12
+ ],
13
+ },
14
+ {
15
+ name: "expression-selection",
16
+ purpose: "Translate football meaning into one verifiable integer expression.",
17
+ guidance: [
18
+ "team_stat selects one home or away value; side is required.",
19
+ "team_total adds the two team values; team_difference subtracts away from home; team_minimum takes their minimum.",
20
+ "Match result and handicap language uses team_difference goals. Both-teams-to-score uses team_minimum goals.",
21
+ "An aggregate event without a named team, such as any red card or total corners, uses team_total.",
22
+ "Two-team expressions always use side=null.",
23
+ ],
24
+ },
25
+ {
26
+ name: "outcome-partition",
27
+ purpose: "Turn natural outcome language into a complete, canonical integer partition.",
28
+ guidance: [
29
+ "Produce two to five unique labels and no more than eight half-open bands.",
30
+ "The first lowerInclusive and last upperExclusive are null. Adjacent bounds are equal, so every integer belongs to exactly one outcome.",
31
+ "Use one band for each contiguous requested range. Seven or fewer is [null,8); 8-9 is [8,10); 14 plus is [14,null).",
32
+ "Over N begins at N+1. Under N ends at N. A physical statistic being non-negative does not remove the negative-infinity coverage band.",
33
+ ],
34
+ },
35
+ {
36
+ name: "settlement-safety",
37
+ purpose: "Keep interpretation separate from trusted market and settlement inputs.",
38
+ guidance: [
39
+ "Never choose or repeat fixture IDs, stat keys, stakes, fees, deadlines, proof values, or match results.",
40
+ "If the request is ambiguous or not provable from the supported team statistics, return supported=false with a precise reason and null market fields.",
41
+ "A vague request such as 'make something exciting' has no explicit market meaning and must be rejected; never invent a statistic, threshold, period, or outcomes.",
42
+ "When requiredOutcomeLabels is supplied, copy that array exactly and treat each outcomeIndex as an index into that immutable ordered array.",
43
+ "The sentence names the supplied fixture, period, expression meaning, and every outcome; it does not claim a result.",
44
+ ],
45
+ },
46
+ ];
47
+ /** Diverse demonstrations teach the IR shape without creating a phrase-matching parser. */
48
+ export const RULEBOOK_PROMPT_EXAMPLES = [
49
+ {
50
+ request: "Split first-half total corners into seven or fewer, 8-9, 10-11, 12-13, and fourteen plus.",
51
+ output: {
52
+ supported: true,
53
+ rejectionReason: null,
54
+ expression: { kind: "team_total", concept: "corners", side: null, period: "first_half" },
55
+ outcomeLabels: ["7 or fewer", "8-9", "10-11", "12-13", "14 plus"],
56
+ bands: [
57
+ { lowerInclusive: null, upperExclusive: 8, outcomeIndex: 0 },
58
+ { lowerInclusive: 8, upperExclusive: 10, outcomeIndex: 1 },
59
+ { lowerInclusive: 10, upperExclusive: 12, outcomeIndex: 2 },
60
+ { lowerInclusive: 12, upperExclusive: 14, outcomeIndex: 3 },
61
+ { lowerInclusive: 14, upperExclusive: null, outcomeIndex: 4 },
62
+ ],
63
+ sentence: "Example FC vs Sample United first-half total corners: 7 or fewer, 8-9, 10-11, 12-13, or 14 plus.",
64
+ },
65
+ },
66
+ {
67
+ request: "Will both sides score at least once? Yes or no.",
68
+ output: {
69
+ supported: true,
70
+ rejectionReason: null,
71
+ expression: { kind: "team_minimum", concept: "goals", side: null, period: "match" },
72
+ outcomeLabels: ["No", "Yes"],
73
+ bands: [
74
+ { lowerInclusive: null, upperExclusive: 1, outcomeIndex: 0 },
75
+ { lowerInclusive: 1, upperExclusive: null, outcomeIndex: 1 },
76
+ ],
77
+ sentence: "Example FC vs Sample United both teams to score: No or Yes over the full match.",
78
+ },
79
+ },
80
+ {
81
+ request: "Home win, draw, or away win.",
82
+ output: {
83
+ supported: true,
84
+ rejectionReason: null,
85
+ expression: { kind: "team_difference", concept: "goals", side: null, period: "match" },
86
+ outcomeLabels: ["Away win", "Draw", "Home win"],
87
+ bands: [
88
+ { lowerInclusive: null, upperExclusive: 0, outcomeIndex: 0 },
89
+ { lowerInclusive: 0, upperExclusive: 1, outcomeIndex: 1 },
90
+ { lowerInclusive: 1, upperExclusive: null, outcomeIndex: 2 },
91
+ ],
92
+ sentence: "Example FC vs Sample United full-match result: Away win, Draw, or Home win.",
93
+ },
94
+ },
95
+ {
96
+ request: "Will there be any red card in the second half? Yes or no.",
97
+ output: {
98
+ supported: true,
99
+ rejectionReason: null,
100
+ expression: { kind: "team_total", concept: "redCards", side: null, period: "second_half" },
101
+ outcomeLabels: ["No", "Yes"],
102
+ bands: [
103
+ { lowerInclusive: null, upperExclusive: 1, outcomeIndex: 0 },
104
+ { lowerInclusive: 1, upperExclusive: null, outcomeIndex: 1 },
105
+ ],
106
+ sentence: "Example FC vs Sample United second-half total red cards: none or at least one.",
107
+ },
108
+ },
109
+ {
110
+ request: "Will a named striker record three shots on target?",
111
+ output: {
112
+ supported: false,
113
+ rejectionReason: "Player shots are not present in the TxLINE team score-stat proof surface.",
114
+ expression: null,
115
+ outcomeLabels: null,
116
+ bands: null,
117
+ sentence: null,
118
+ },
119
+ },
120
+ {
121
+ request: "Who scores first? Required outcomes: Example FC, Sample United.",
122
+ output: {
123
+ supported: false,
124
+ rejectionReason: "First-event ordering is not provable from TxLINE's aggregate stat proof surface.",
125
+ expression: null,
126
+ outcomeLabels: null,
127
+ bands: null,
128
+ sentence: null,
129
+ },
130
+ },
131
+ ];
132
+ const OUTPUT_CONTRACT = `Return exactly these keys and never rename, add, or omit them:
133
+ {
134
+ "supported": boolean,
135
+ "rejectionReason": string | null,
136
+ "expression": { "kind": "team_stat" | "team_total" | "team_difference" | "team_minimum", "concept": "goals" | "yellowCards" | "redCards" | "corners", "side": "home" | "away" | null, "period": "match" | "first_half" | "halftime" | "second_half" | "extra_time_first_half" | "extra_time_second_half" | "penalties" | "extra_time" } | null,
137
+ "outcomeLabels": string[] | null,
138
+ "bands": { "lowerInclusive": integer | null, "upperExclusive": integer | null, "outcomeIndex": integer }[] | null,
139
+ "sentence": string | null
140
+ }
141
+ When supported=true, rejectionReason is null and every other field is non-null. When supported=false,
142
+ rejectionReason explains why and expression, outcomeLabels, bands, and sentence are all null.`;
143
+ export function buildRulebookSystemPrompt() {
144
+ const skills = RULEBOOK_PROMPT_SKILLS.map((skill) => [
145
+ `Skill: ${skill.name}`,
146
+ `Purpose: ${skill.purpose}`,
147
+ ...skill.guidance.map((line) => `- ${line}`),
148
+ ].join("\n")).join("\n\n");
149
+ const examples = RULEBOOK_PROMPT_EXAMPLES.map((example, index) => [
150
+ `Example ${index + 1} request: ${example.request}`,
151
+ `Example ${index + 1} output: ${JSON.stringify(example.output)}`,
152
+ ].join("\n")).join("\n\n");
153
+ return `You compile a user's football market request into Slip's canonical market IR.\n\n${OUTPUT_CONTRACT}\n\n${skills}\n\nWorked examples:\n${examples}`;
154
+ }
155
+ //# sourceMappingURL=rulebook-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulebook-skills.js","sourceRoot":"","sources":["../src/rulebook-skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { CompiledRulebook, MarketSnapshot, RulebookBand, RulebookExpression } from "./public-types.js";
2
+ interface HashableRulebook {
3
+ fixtureId: string;
4
+ expression: RulebookExpression;
5
+ outcomeLabels: string[];
6
+ bands: RulebookBand[];
7
+ entryDeadline: number;
8
+ resolveAt: number;
9
+ voidAt: number;
10
+ feeBps: number;
11
+ tipBps: number;
12
+ }
13
+ export declare function calculateRulebookHash(value: HashableRulebook): Promise<string>;
14
+ export declare function verifyCompiledRulebookHash(value: CompiledRulebook): Promise<void>;
15
+ export declare function calculateMarketRulebookHash(value: MarketSnapshot): Promise<string>;
16
+ export {};
17
+ //# sourceMappingURL=rulebook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulebook.d.ts","sourceRoot":"","sources":["../src/rulebook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5G,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAoBD,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAIpF;AAED,wBAAsB,0BAA0B,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvF;AAED,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAYxF"}
@@ -0,0 +1,42 @@
1
+ function canonical(value) {
2
+ return JSON.stringify({
3
+ fixtureId: value.fixtureId,
4
+ expression: value.expression,
5
+ outcomeLabels: value.outcomeLabels,
6
+ bands: value.bands.map((band) => ({
7
+ lowerInclusive: band.lowerInclusive?.toString() ?? null,
8
+ upperExclusive: band.upperExclusive?.toString() ?? null,
9
+ outcomeIndex: band.outcomeIndex,
10
+ })),
11
+ entryDeadline: value.entryDeadline,
12
+ resolveAt: value.resolveAt,
13
+ voidAt: value.voidAt,
14
+ feeBps: value.feeBps,
15
+ tipBps: value.tipBps,
16
+ });
17
+ }
18
+ export async function calculateRulebookHash(value) {
19
+ if (!globalThis.crypto?.subtle)
20
+ throw new Error("Web Crypto SHA-256 is unavailable in this runtime");
21
+ const digest = await globalThis.crypto.subtle.digest("SHA-256", new TextEncoder().encode(canonical(value)));
22
+ return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
23
+ }
24
+ export async function verifyCompiledRulebookHash(value) {
25
+ const expected = await calculateRulebookHash(value);
26
+ if (expected !== value.hash)
27
+ throw new Error("Compiled Rulebook hash does not match its canonical market terms");
28
+ }
29
+ export async function calculateMarketRulebookHash(value) {
30
+ return calculateRulebookHash({
31
+ fixtureId: String(value.expression.fixtureId),
32
+ expression: value.expression,
33
+ outcomeLabels: value.outcomeLabels,
34
+ bands: value.bands,
35
+ entryDeadline: value.entryDeadline,
36
+ resolveAt: value.resolveAt,
37
+ voidAt: value.voidAt,
38
+ feeBps: value.feeBps,
39
+ tipBps: value.tipBps,
40
+ });
41
+ }
42
+ //# sourceMappingURL=rulebook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulebook.js","sourceRoot":"","sources":["../src/rulebook.ts"],"names":[],"mappings":"AAcA,SAAS,SAAS,CAAC,KAAuB;IACxC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAChC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,IAAI;YACvD,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,IAAI;YACvD,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC,CAAC;QACH,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAuB;IACjE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACrG,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5G,OAAO,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,KAAuB;IACtE,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACpD,IAAI,QAAQ,KAAK,KAAK,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;AACnH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,KAAqB;IACrE,OAAO,qBAAqB,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;QAC7C,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { Commitment, Connection, Keypair, PublicKey, Transaction, type SendOptions, type Signer, type TransactionInstruction } from "@solana/web3.js";
2
+ export interface TransactionAuthority {
3
+ publicKey: PublicKey;
4
+ signTransaction(transaction: Transaction): Promise<Transaction>;
5
+ }
6
+ export interface ExecuteInstructionsOptions {
7
+ connection: Connection;
8
+ authority: TransactionAuthority;
9
+ instructions: TransactionInstruction[];
10
+ additionalSigners?: Signer[];
11
+ commitment?: Commitment;
12
+ computeUnitLimit?: number;
13
+ sendOptions?: SendOptions;
14
+ }
15
+ export interface TransactionExecution {
16
+ signature: string;
17
+ unitsConsumed: number | null;
18
+ slot: number;
19
+ }
20
+ export declare function keypairAuthority(keypair: Keypair): TransactionAuthority;
21
+ /** Build, sign, simulate, submit, and blockheight-confirm one real Solana transaction. */
22
+ export declare function executeInstructions(options: ExecuteInstructionsOptions): Promise<TransactionExecution>;
23
+ //# sourceMappingURL=transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAEV,UAAU,EACV,OAAO,EACP,SAAS,EACT,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,sBAAsB,EAC5B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,oBAAoB,CAAC;IAChC,YAAY,EAAE,sBAAsB,EAAE,CAAC;IACvC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,oBAAoB,CAQvE;AAQD,0FAA0F;AAC1F,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA4B5G"}
@@ -0,0 +1,51 @@
1
+ import { ComputeBudgetProgram, Transaction, } from "@solana/web3.js";
2
+ export function keypairAuthority(keypair) {
3
+ return {
4
+ publicKey: keypair.publicKey,
5
+ async signTransaction(transaction) {
6
+ transaction.partialSign(keypair);
7
+ return transaction;
8
+ },
9
+ };
10
+ }
11
+ function simulationFailure(error, logs) {
12
+ const detail = typeof error === "string" ? error : JSON.stringify(error);
13
+ const tail = logs?.slice(-8).join(" | ");
14
+ return new Error(`Slip transaction simulation failed: ${detail}${tail ? ` · ${tail}` : ""}`);
15
+ }
16
+ /** Build, sign, simulate, submit, and blockheight-confirm one real Solana transaction. */
17
+ export async function executeInstructions(options) {
18
+ if (options.instructions.length === 0)
19
+ throw new Error("at least one instruction is required");
20
+ const commitment = options.commitment ?? "confirmed";
21
+ const lifetime = await options.connection.getLatestBlockhash(commitment);
22
+ const transaction = new Transaction({
23
+ feePayer: options.authority.publicKey,
24
+ recentBlockhash: lifetime.blockhash,
25
+ });
26
+ if (options.computeUnitLimit !== undefined) {
27
+ if (!Number.isSafeInteger(options.computeUnitLimit) || options.computeUnitLimit <= 0)
28
+ throw new Error("computeUnitLimit must be a positive safe integer");
29
+ transaction.add(ComputeBudgetProgram.setComputeUnitLimit({ units: options.computeUnitLimit }));
30
+ }
31
+ transaction.add(...options.instructions);
32
+ if (options.additionalSigners?.length)
33
+ transaction.partialSign(...options.additionalSigners);
34
+ const signed = await options.authority.signTransaction(transaction);
35
+ if (!signed.signatures.some((signature) => signature.publicKey.equals(options.authority.publicKey) && signature.signature !== null)) {
36
+ throw new Error("transaction authority did not sign the transaction");
37
+ }
38
+ const simulation = await options.connection.simulateTransaction(signed, undefined, false);
39
+ if (simulation.value.err)
40
+ throw simulationFailure(simulation.value.err, simulation.value.logs);
41
+ const signature = await options.connection.sendRawTransaction(signed.serialize(), {
42
+ maxRetries: 3,
43
+ skipPreflight: false,
44
+ ...options.sendOptions,
45
+ });
46
+ const confirmation = await options.connection.confirmTransaction({ signature, ...lifetime }, commitment);
47
+ if (confirmation.value.err)
48
+ throw new Error(`Slip transaction ${signature} failed: ${JSON.stringify(confirmation.value.err)}`);
49
+ return { signature, unitsConsumed: simulation.value.unitsConsumed ?? null, slot: confirmation.context.slot };
50
+ }
51
+ //# sourceMappingURL=transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { MarketExpression, Fixture } from "./types.js";
2
+ import { type FetchedProof, type HttpLike } from "./proof.js";
3
+ export { latestScoreUpdate } from "./proof.js";
4
+ export declare class TxlineError extends Error {
5
+ readonly status?: number | undefined;
6
+ constructor(message: string, status?: number | undefined, options?: ErrorOptions);
7
+ }
8
+ export interface TxlineClientOptions {
9
+ origin?: string;
10
+ apiToken?: string;
11
+ timeoutMs?: number;
12
+ fetch?: typeof globalThis.fetch;
13
+ }
14
+ export interface TxlineActivationOptions {
15
+ /** Submit the real TxLINE `subscribe` transaction and return its confirmed signature. */
16
+ subscribe(): Promise<string>;
17
+ /** Sign the exact activation preimage with the wallet that submitted `subscribe`. */
18
+ signMessage(message: Uint8Array): Promise<Uint8Array>;
19
+ leagues?: number[];
20
+ }
21
+ export interface ScoreSnapshot {
22
+ fixtureId: number;
23
+ seq: number;
24
+ period: number | null;
25
+ gameState: number | string | null;
26
+ raw: unknown;
27
+ }
28
+ export declare function parseTxlineFixture(value: unknown): Fixture;
29
+ /** Authenticated, browser-safe TxLINE client with one-time JWT renewal on HTTP 401. */
30
+ export declare class TxlineClient implements HttpLike {
31
+ readonly origin: string;
32
+ private apiTokenValue;
33
+ private readonly timeoutMs;
34
+ private readonly fetchImpl;
35
+ private jwt;
36
+ private jwtRequest;
37
+ constructor(options?: TxlineClientOptions);
38
+ get apiToken(): string | undefined;
39
+ private guest;
40
+ private requireApiToken;
41
+ private request;
42
+ /** Axios-compatible surface used by the proof helpers and keeper. */
43
+ get(path: string, config?: {
44
+ params?: Record<string, unknown>;
45
+ }): Promise<{
46
+ data: unknown;
47
+ }>;
48
+ activate(options: TxlineActivationOptions): Promise<string>;
49
+ listFixtures(startEpochDay?: number): Promise<Fixture[]>;
50
+ getFixture(fixtureId: number, referenceEpochSeconds?: number): Promise<Fixture>;
51
+ scoreSnapshot(fixtureId: number): Promise<ScoreSnapshot>;
52
+ latestSeq(fixtureId: number): Promise<number>;
53
+ proofForMarket(expression: MarketExpression, seq?: number): Promise<FetchedProof>;
54
+ }
55
+ //# sourceMappingURL=txline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txline.d.ts","sourceRoot":"","sources":["../src/txline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAA0C,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtG,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAK/C,qBAAa,WAAY,SAAQ,KAAK;IACP,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;gBAAzC,OAAO,EAAE,MAAM,EAAW,MAAM,CAAC,EAAE,MAAM,YAAA,EAAE,OAAO,CAAC,EAAE,YAAY;CAI9E;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,uBAAuB;IACtC,yFAAyF;IACzF,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,qFAAqF;IACrF,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClC,GAAG,EAAE,OAAO,CAAC;CACd;AA+BD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAkB1D;AAMD,uFAAuF;AACvF,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,GAAG,CAAuB;IAClC,OAAO,CAAC,UAAU,CAAgC;gBAEtC,OAAO,GAAE,mBAAwB;IAS7C,IAAI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAA+B;YAEnD,KAAK;IAyBnB,OAAO,CAAC,eAAe;YAKT,OAAO;IAoBrB,qEAAqE;IAC/D,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IAQ5F,QAAQ,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B3D,YAAY,CAAC,aAAa,SAAsC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAOrF,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,qBAAqB,SAAgC,GAAG,OAAO,CAAC,OAAO,CAAC;IAStG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAqBxD,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAE7C,cAAc,CAAC,UAAU,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAGxF"}