@baozi.bet/mcp-server 4.0.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 (60) hide show
  1. package/README.md +294 -0
  2. package/dist/__tests__/full-test.d.ts +1 -0
  3. package/dist/__tests__/full-test.js +291 -0
  4. package/dist/builders/affiliate-transaction.d.ts +41 -0
  5. package/dist/builders/affiliate-transaction.js +123 -0
  6. package/dist/builders/bet-transaction.d.ts +70 -0
  7. package/dist/builders/bet-transaction.js +323 -0
  8. package/dist/builders/claim-transaction.d.ts +57 -0
  9. package/dist/builders/claim-transaction.js +196 -0
  10. package/dist/builders/creator-transaction.d.ts +49 -0
  11. package/dist/builders/creator-transaction.js +177 -0
  12. package/dist/builders/dispute-transaction.d.ts +81 -0
  13. package/dist/builders/dispute-transaction.js +215 -0
  14. package/dist/builders/index.d.ts +14 -0
  15. package/dist/builders/index.js +15 -0
  16. package/dist/builders/market-creation-tx.d.ts +65 -0
  17. package/dist/builders/market-creation-tx.js +362 -0
  18. package/dist/builders/market-management-transaction.d.ts +85 -0
  19. package/dist/builders/market-management-transaction.js +239 -0
  20. package/dist/builders/race-transaction.d.ts +67 -0
  21. package/dist/builders/race-transaction.js +242 -0
  22. package/dist/builders/resolution-transaction.d.ts +108 -0
  23. package/dist/builders/resolution-transaction.js +250 -0
  24. package/dist/builders/whitelist-transaction.d.ts +72 -0
  25. package/dist/builders/whitelist-transaction.js +179 -0
  26. package/dist/config.d.ts +138 -0
  27. package/dist/config.js +307 -0
  28. package/dist/handlers/agent-network.d.ts +81 -0
  29. package/dist/handlers/agent-network.js +332 -0
  30. package/dist/handlers/claims.d.ts +47 -0
  31. package/dist/handlers/claims.js +218 -0
  32. package/dist/handlers/market-creation.d.ts +154 -0
  33. package/dist/handlers/market-creation.js +290 -0
  34. package/dist/handlers/markets.d.ts +41 -0
  35. package/dist/handlers/markets.js +319 -0
  36. package/dist/handlers/positions.d.ts +40 -0
  37. package/dist/handlers/positions.js +244 -0
  38. package/dist/handlers/quote.d.ts +33 -0
  39. package/dist/handlers/quote.js +144 -0
  40. package/dist/handlers/race-markets.d.ts +54 -0
  41. package/dist/handlers/race-markets.js +308 -0
  42. package/dist/handlers/resolution.d.ts +43 -0
  43. package/dist/handlers/resolution.js +194 -0
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.js +109 -0
  46. package/dist/resources.d.ts +13 -0
  47. package/dist/resources.js +336 -0
  48. package/dist/tools.d.ts +3109 -0
  49. package/dist/tools.js +1956 -0
  50. package/dist/validation/bet-rules.d.ts +82 -0
  51. package/dist/validation/bet-rules.js +276 -0
  52. package/dist/validation/creation-rules.d.ts +69 -0
  53. package/dist/validation/creation-rules.js +302 -0
  54. package/dist/validation/index.d.ts +6 -0
  55. package/dist/validation/index.js +7 -0
  56. package/dist/validation/market-rules.d.ts +60 -0
  57. package/dist/validation/market-rules.js +237 -0
  58. package/dist/validation/parimutuel-rules.d.ts +117 -0
  59. package/dist/validation/parimutuel-rules.js +270 -0
  60. package/package.json +52 -0
package/dist/config.js ADDED
@@ -0,0 +1,307 @@
1
+ /**
2
+ * Baozi MCP Server Configuration
3
+ * Mainnet-ready configuration for V4.7.6
4
+ */
5
+ import { PublicKey } from '@solana/web3.js';
6
+ // =============================================================================
7
+ // NETWORK CONFIGURATION
8
+ // =============================================================================
9
+ export const NETWORK = (process.env.SOLANA_NETWORK || 'mainnet-beta');
10
+ export const IS_MAINNET = NETWORK === 'mainnet-beta';
11
+ // Program ID (V4.7.6 - Mainnet)
12
+ export const PROGRAM_ID = new PublicKey(process.env.BAOZI_PROGRAM_ID || 'DW4o8AoSXnSudjZhwo4ixkmVUw2Bnv5FDPYF9LgsS5YY');
13
+ // RPC Endpoints
14
+ // Priority: HELIUS_RPC_URL > SOLANA_RPC_URL > public endpoint
15
+ export const RPC_ENDPOINT = process.env.HELIUS_RPC_URL
16
+ || process.env.SOLANA_RPC_URL
17
+ || (IS_MAINNET
18
+ ? 'https://api.mainnet-beta.solana.com'
19
+ : 'https://api.devnet.solana.com');
20
+ // =============================================================================
21
+ // PDA SEEDS
22
+ // =============================================================================
23
+ export const SEEDS = {
24
+ CONFIG: Buffer.from('config'),
25
+ MARKET: Buffer.from('market'),
26
+ POSITION: Buffer.from('position'),
27
+ RACE: Buffer.from('race'),
28
+ RACE_POSITION: Buffer.from('race_position'),
29
+ WHITELIST: Buffer.from('whitelist'),
30
+ RACE_WHITELIST: Buffer.from('race_whitelist'),
31
+ AFFILIATE: Buffer.from('affiliate'),
32
+ CREATOR_PROFILE: Buffer.from('creator_profile'),
33
+ SOL_TREASURY: Buffer.from('sol_treasury'),
34
+ REVENUE_CONFIG: Buffer.from('revenue_config'),
35
+ DISPUTE_META: Buffer.from('dispute_meta'),
36
+ };
37
+ // Derive Config PDA
38
+ const [derivedConfigPda] = PublicKey.findProgramAddressSync([SEEDS.CONFIG], PROGRAM_ID);
39
+ export const CONFIG_PDA = derivedConfigPda;
40
+ // Derive Sol Treasury PDA
41
+ const [derivedSolTreasuryPda] = PublicKey.findProgramAddressSync([SEEDS.SOL_TREASURY], PROGRAM_ID);
42
+ export const SOL_TREASURY_PDA = derivedSolTreasuryPda;
43
+ // =============================================================================
44
+ // ACCOUNT DISCRIMINATORS (first 8 bytes of sha256 hash)
45
+ // =============================================================================
46
+ export const DISCRIMINATORS = {
47
+ // Boolean Market
48
+ MARKET: Buffer.from([219, 190, 213, 55, 0, 227, 198, 154]),
49
+ MARKET_BASE58: 'FcJn7zePJQ1',
50
+ // User Position (Boolean)
51
+ USER_POSITION: Buffer.from([251, 248, 209, 245, 83, 234, 17, 27]),
52
+ USER_POSITION_BASE58: 'j9SjDYAWesU',
53
+ // Race Market
54
+ RACE_MARKET: Buffer.from([149, 8, 156, 202, 160, 252, 176, 217]),
55
+ // Race Position
56
+ RACE_POSITION: Buffer.from([44, 182, 16, 1, 230, 14, 174, 46]),
57
+ RACE_POSITION_BASE58: '8Ukm3FYuL6H',
58
+ // Global Config
59
+ GLOBAL_CONFIG: Buffer.from([149, 8, 156, 202, 160, 252, 176, 217]),
60
+ // Creator Profile
61
+ CREATOR_PROFILE: Buffer.from([83, 210, 28, 6, 46, 183, 224, 219]),
62
+ // Affiliate
63
+ AFFILIATE: Buffer.from([24, 240, 16, 245, 33, 46, 77, 168]),
64
+ // Referred User (for affiliate tracking)
65
+ REFERRED_USER: Buffer.from([188, 210, 247, 185, 105, 204, 220, 46]),
66
+ // Dispute Meta
67
+ DISPUTE_META: Buffer.from([62, 14, 221, 64, 175, 241, 48, 165]),
68
+ };
69
+ // =============================================================================
70
+ // FEE CONFIGURATION
71
+ // =============================================================================
72
+ export const FEES = {
73
+ // Platform fees by layer (bps = basis points, 100 bps = 1%)
74
+ OFFICIAL_PLATFORM_FEE_BPS: 250, // 2.5%
75
+ LAB_PLATFORM_FEE_BPS: 300, // 3%
76
+ PRIVATE_PLATFORM_FEE_BPS: 200, // 2%
77
+ // Creation fees (in lamports)
78
+ OFFICIAL_CREATION_FEE: 100_000_000, // 0.1 SOL
79
+ LAB_CREATION_FEE: 40_000_000, // 0.04 SOL
80
+ PRIVATE_CREATION_FEE: 40_000_000, // 0.04 SOL
81
+ // Fee split (within platform fee)
82
+ AFFILIATE_FEE_BPS: 100, // 1%
83
+ CREATOR_FEE_BPS: 50, // 0.5% (default, can vary)
84
+ BPS_DENOMINATOR: 10000,
85
+ };
86
+ // =============================================================================
87
+ // BET LIMITS
88
+ // =============================================================================
89
+ export const BET_LIMITS = {
90
+ MIN_BET_SOL: 0.01,
91
+ MAX_BET_SOL: 100,
92
+ MIN_BET_LAMPORTS: 10_000_000, // 0.01 SOL
93
+ MAX_BET_LAMPORTS: 100_000_000_000, // 100 SOL
94
+ };
95
+ // =============================================================================
96
+ // TIMING CONSTANTS
97
+ // =============================================================================
98
+ export const TIMING = {
99
+ // Betting freeze before close (seconds)
100
+ BETTING_FREEZE_SECONDS: 300, // 5 minutes
101
+ // Minimum buffer between closing time and event (hours)
102
+ MIN_EVENT_BUFFER_HOURS: 12,
103
+ RECOMMENDED_EVENT_BUFFER_HOURS: 24,
104
+ // Maximum market duration
105
+ MAX_MARKET_DURATION_DAYS: 365,
106
+ // Resolution timing
107
+ MIN_RESOLUTION_BUFFER_SECONDS: 600, // 10 minutes
108
+ MAX_RESOLUTION_BUFFER_SECONDS: 604800, // 7 days
109
+ // Dispute window
110
+ DISPUTE_WINDOW_SECONDS: 86400, // 24 hours
111
+ };
112
+ // =============================================================================
113
+ // MARKET STATUS & OUTCOME ENUMS
114
+ // =============================================================================
115
+ export const MARKET_STATUS = {
116
+ ACTIVE: 0,
117
+ CLOSED: 1,
118
+ RESOLVED: 2,
119
+ CANCELLED: 3,
120
+ PAUSED: 4,
121
+ RESOLVED_PENDING: 5,
122
+ DISPUTED: 6,
123
+ };
124
+ export const MARKET_STATUS_NAMES = {
125
+ 0: 'Active',
126
+ 1: 'Closed',
127
+ 2: 'Resolved',
128
+ 3: 'Cancelled',
129
+ 4: 'Paused',
130
+ 5: 'ResolvedPending',
131
+ 6: 'Disputed',
132
+ };
133
+ export const MARKET_OUTCOME = {
134
+ UNDECIDED: 0,
135
+ INVALID: 1,
136
+ YES: 2,
137
+ NO: 3,
138
+ };
139
+ export const MARKET_OUTCOME_NAMES = {
140
+ 0: 'Undecided',
141
+ 1: 'Invalid',
142
+ 2: 'Yes',
143
+ 3: 'No',
144
+ };
145
+ export const MARKET_LAYER = {
146
+ OFFICIAL: 0,
147
+ LAB: 1,
148
+ PRIVATE: 2,
149
+ };
150
+ export const MARKET_LAYER_NAMES = {
151
+ 0: 'Official',
152
+ 1: 'Lab',
153
+ 2: 'Private',
154
+ };
155
+ export const MARKET_TYPE = {
156
+ EVENT: 0, // Event-based (Rule A)
157
+ MEASUREMENT: 1, // Measurement-period (Rule B)
158
+ };
159
+ export const MARKET_TYPE_NAMES = {
160
+ 0: 'Event',
161
+ 1: 'Measurement',
162
+ };
163
+ export const ACCESS_GATE = {
164
+ PUBLIC: 0,
165
+ WHITELIST: 1,
166
+ };
167
+ // =============================================================================
168
+ // CURRENCY TYPES
169
+ // =============================================================================
170
+ export const CURRENCY_TYPE = {
171
+ SOL: 0,
172
+ USDC: 1,
173
+ };
174
+ export const CURRENCY_TYPE_NAMES = {
175
+ 0: 'Sol',
176
+ 1: 'Usdc',
177
+ };
178
+ // =============================================================================
179
+ // ERROR CODES (from IDL)
180
+ // =============================================================================
181
+ export const ERROR_CODES = {
182
+ 6000: 'NotExpectedAdmin',
183
+ 6001: 'NotAdmin',
184
+ 6002: 'NotAdminOrGuardian',
185
+ 6003: 'InvalidUsdcMint',
186
+ 6004: 'InvalidTreasury',
187
+ 6005: 'InvalidVault',
188
+ 6006: 'ProtocolPaused',
189
+ 6007: 'MarketPaused',
190
+ 6008: 'QuestionTooLong',
191
+ 6009: 'ClosingTimeInPast',
192
+ 6010: 'ClosingTimeTooFar',
193
+ 6011: 'EventStartTimeInPast',
194
+ 6012: 'EventStartTimeTooFar',
195
+ 6013: 'InvalidAutoStopBuffer',
196
+ 6014: 'InvalidResolutionBuffer',
197
+ 6015: 'MarketNotOpen',
198
+ 6016: 'MarketNotClosed',
199
+ 6017: 'MarketNotResolved',
200
+ 6018: 'BettingClosed',
201
+ 6019: 'EventStarted',
202
+ 6020: 'BetTooSmall',
203
+ 6021: 'SlippageExceeded',
204
+ 6022: 'FeeOnTransferNotSupported',
205
+ 6023: 'SnapshotTooEarly',
206
+ 6024: 'SnapshotAlreadyTaken',
207
+ 6025: 'SnapshotNotTaken',
208
+ 6026: 'CloseTooEarly',
209
+ 6027: 'ResolutionDeadlinePassed',
210
+ 6028: 'InvalidOutcome',
211
+ 6029: 'AlreadyResolved',
212
+ 6030: 'EmergencyResolveTooEarly',
213
+ 6031: 'WrongCurrency',
214
+ 6032: 'AlreadyClaimed',
215
+ 6033: 'NothingToClaim',
216
+ 6034: 'MathOverflow',
217
+ 6035: 'TooEarlyToResolve',
218
+ 6036: 'FeeTooHigh',
219
+ 6037: 'InsufficientVaultBalance',
220
+ 6038: 'InvalidPosition',
221
+ 6039: 'InvalidTokenAccount',
222
+ 6040: 'BettingFrozen',
223
+ 6041: 'BetTooLarge',
224
+ 6042: 'InsufficientMarketBalance',
225
+ };
226
+ // =============================================================================
227
+ // SYSTEM PROGRAM IDS
228
+ // =============================================================================
229
+ export const SYSTEM_PROGRAM_ID = new PublicKey('11111111111111111111111111111111');
230
+ export const TOKEN_PROGRAM_ID = new PublicKey('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA');
231
+ export const ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey('ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL');
232
+ // =============================================================================
233
+ // HELPER FUNCTIONS
234
+ // =============================================================================
235
+ /**
236
+ * Get lamports from SOL
237
+ */
238
+ export function solToLamports(sol) {
239
+ return BigInt(Math.floor(sol * 1_000_000_000));
240
+ }
241
+ /**
242
+ * Get SOL from lamports
243
+ */
244
+ export function lamportsToSol(lamports) {
245
+ return Number(lamports) / 1_000_000_000;
246
+ }
247
+ /**
248
+ * Derive market PDA from market ID
249
+ */
250
+ export function deriveMarketPda(marketId) {
251
+ const marketIdBuffer = Buffer.alloc(8);
252
+ marketIdBuffer.writeBigUInt64LE(BigInt(marketId));
253
+ return PublicKey.findProgramAddressSync([SEEDS.MARKET, marketIdBuffer], PROGRAM_ID);
254
+ }
255
+ /**
256
+ * Derive position PDA from market ID and user wallet
257
+ */
258
+ export function derivePositionPda(marketId, user) {
259
+ const marketIdBuffer = Buffer.alloc(8);
260
+ marketIdBuffer.writeBigUInt64LE(BigInt(marketId));
261
+ return PublicKey.findProgramAddressSync([SEEDS.POSITION, marketIdBuffer, user.toBuffer()], PROGRAM_ID);
262
+ }
263
+ /**
264
+ * Derive race position PDA from market ID and user wallet
265
+ */
266
+ export function deriveRacePositionPda(marketId, user) {
267
+ const marketIdBuffer = Buffer.alloc(8);
268
+ marketIdBuffer.writeBigUInt64LE(BigInt(marketId));
269
+ return PublicKey.findProgramAddressSync([SEEDS.RACE_POSITION, marketIdBuffer, user.toBuffer()], PROGRAM_ID);
270
+ }
271
+ /**
272
+ * Derive affiliate PDA from referral code
273
+ */
274
+ export function deriveAffiliatePda(referralCode) {
275
+ return PublicKey.findProgramAddressSync([SEEDS.AFFILIATE, Buffer.from(referralCode)], PROGRAM_ID);
276
+ }
277
+ /**
278
+ * Get platform fee for a layer
279
+ */
280
+ export function getPlatformFeeForLayer(layer) {
281
+ switch (layer) {
282
+ case MARKET_LAYER.OFFICIAL:
283
+ return FEES.OFFICIAL_PLATFORM_FEE_BPS;
284
+ case MARKET_LAYER.LAB:
285
+ return FEES.LAB_PLATFORM_FEE_BPS;
286
+ case MARKET_LAYER.PRIVATE:
287
+ return FEES.PRIVATE_PLATFORM_FEE_BPS;
288
+ default:
289
+ return FEES.LAB_PLATFORM_FEE_BPS;
290
+ }
291
+ }
292
+ /**
293
+ * Get creation fee for a layer (in lamports)
294
+ */
295
+ export function getCreationFeeForLayer(layer) {
296
+ switch (layer) {
297
+ case MARKET_LAYER.OFFICIAL:
298
+ return FEES.OFFICIAL_CREATION_FEE;
299
+ case MARKET_LAYER.LAB:
300
+ return FEES.LAB_CREATION_FEE;
301
+ case MARKET_LAYER.PRIVATE:
302
+ return FEES.PRIVATE_CREATION_FEE;
303
+ default:
304
+ return FEES.LAB_CREATION_FEE;
305
+ }
306
+ }
307
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFNUMsZ0ZBQWdGO0FBQ2hGLHdCQUF3QjtBQUN4QixnRkFBZ0Y7QUFFaEYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLElBQUksY0FBYyxDQUE4QixDQUFDO0FBQ25HLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxPQUFPLEtBQUssY0FBYyxDQUFDO0FBRXJELGdDQUFnQztBQUNoQyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxTQUFTLENBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLElBQUksOENBQThDLENBQy9FLENBQUM7QUFFRixnQkFBZ0I7QUFDaEIsOERBQThEO0FBQzlELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWM7T0FDakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjO09BQzFCLENBQUMsVUFBVTtRQUNaLENBQUMsQ0FBQyxxQ0FBcUM7UUFDdkMsQ0FBQyxDQUFDLCtCQUErQixDQUFDLENBQUM7QUFFdkMsZ0ZBQWdGO0FBQ2hGLFlBQVk7QUFDWixnRkFBZ0Y7QUFFaEYsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHO0lBQ25CLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM3QixNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDN0IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ2pDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN6QixhQUFhLEVBQUUsTUFBTSxDQUFDLElB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SCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsS0FBYTtJQUNsRCxRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ2QsS0FBSyxZQUFZLENBQUMsUUFBUTtZQUN4QixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUNwQyxLQUFLLFlBQVksQ0FBQyxHQUFHO1lBQ25CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQy9CLEtBQUssWUFBWSxDQUFDLE9BQU87WUFDdkIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDbkM7WUFDRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUNqQyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFvemkgTUNQIFNlcnZlciBDb25maWd1cmF0aW9uXG4gKiBNYWlubmV0LXJlYWR5IGNvbmZpZ3VyYXRpb24gZm9yIFY0LjcuNlxuICovXG5pbXBvcnQgeyBQdWJsaWNLZXkgfSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTkVUV09SSyBDT05GSUdVUkFUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgTkVUV09SSyA9IChwcm9jZXNzLmVudi5TT0xBTkFfTkVUV09SSyB8fCAnbWFpbm5ldC1iZXRhJykgYXMgJ21haW5uZXQtYmV0YScgfCAnZGV2bmV0JztcbmV4cG9ydCBjb25zdCBJU19NQUlOTkVUID0gTkVUV09SSyA9PT0gJ21haW5uZXQtYmV0YSc7XG5cbi8vIFByb2dyYW0gSUQgKFY0LjcuNiAtIE1haW5uZXQpXG5leHBvcnQgY29uc3QgUFJPR1JBTV9JRCA9IG5ldyBQdWJsaWNLZXkoXG4gIHByb2Nlc3MuZW52LkJBT1pJX1BST0dSQU1fSUQgfHwgJ0RXNG84QW9TWG5TdWRqWmh3bzRpeGttVlV3MkJudjVGRFBZRjlMZ3NTNVlZJ1xuKTtcblxuLy8gUlBDIEVuZHBvaW50c1xuLy8gUHJpb3JpdHk6IEhFTElVU19SUENfVVJMID4gU09MQU5BX1JQQ19VUkwgPiBwdWJsaWMgZW5kcG9pbnRcbmV4cG9ydCBjb25zdCBSUENfRU5EUE9JTlQgPSBwcm9jZXNzLmVudi5IRUxJVVNfUlBDX1VSTFxuICB8fCBwcm9jZXNzLmVudi5TT0xBTkFfUlBDX1VSTFxuICB8fCAoSVNfTUFJTk5FVFxuICAgID8gJ2h0dHBzOi8vYXBpLm1haW5uZXQtYmV0YS5zb2xhbmEuY29tJ1xuICAgIDogJ2h0dHBzOi8vYXBpLmRldm5ldC5zb2xhbmEuY29tJyk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQREEgU0VFRFNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBTRUVEUyA9IHtcbiAgQ09ORklHOiBCdWZmZXIuZnJvbSgnY29uZmlnJyksXG4gIE1BUktFVDogQnVmZmVyLmZyb20oJ21hcmtldCcpLFxuICBQT1NJVElPTjogQnVmZmVyLmZyb20oJ3Bvc2l0aW9uJyksXG4gIFJBQ0U6IEJ1ZmZlci5mcm9tKCdyYWNlJyksXG4gIFJBQ0VfUE9TSVRJT046IEJ1ZmZlci5mcm9tKCdyYWNlX3Bvc2l0aW9uJyksXG4gIFdISVRFTElTVDogQnVmZmVyLmZyb20oJ3doaXRlbGlzdCcpLFxuICBSQUNFX1dISVRFTElTVDogQnVmZmVyLmZyb20oJ3JhY2Vfd2hpdGVsaXN0JyksXG4gIEFGRklMSUFURTogQnVmZmVyLmZyb20oJ2FmZmlsaWF0ZScpLFxuICBDUkVBVE9SX1BST0ZJTEU6IEJ1ZmZlci5mcm9tKCdjcmVhdG9yX3Byb2ZpbGUnKSxcbiAgU09MX1RSRUFTVVJZOiBCdWZmZXIuZnJvbSgnc29sX3RyZWFzdXJ5JyksXG4gIFJFVkVOVUVfQ09ORklHOiBCdWZmZXIuZnJvbSgncmV2ZW51ZV9jb25maWcnKSxcbiAgRElTUFVURV9NRVRBOiBCdWZmZXIuZnJvbSgnZGlzcHV0ZV9tZXRhJyksXG59IGFzIGNvbnN0O1xuXG4vLyBEZXJpdmUgQ29uZmlnIFBEQVxuY29uc3QgW2Rlcml2ZWRDb25maWdQZGFdID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gIFtTRUVEUy5DT05GSUddLFxuICBQUk9HUkFNX0lEXG4pO1xuZXhwb3J0IGNvbnN0IENPTkZJR19QREEgPSBkZXJpdmVkQ29uZmlnUGRhO1xuXG4vLyBEZXJpdmUgU29sIFRyZWFzdXJ5IFBEQVxuY29uc3QgW2Rlcml2ZWRTb2xUcmVhc3VyeVBkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgW1NFRURTLlNPTF9UUkVBU1VSWV0sXG4gIFBST0dSQU1fSURcbik7XG5leHBvcnQgY29uc3QgU09MX1RSRUFTVVJZX1BEQSA9IGRlcml2ZWRTb2xUcmVhc3VyeVBkYTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFDQ09VTlQgRElTQ1JJTUlOQVRPUlMgKGZpcnN0IDggYnl0ZXMgb2Ygc2hhMjU2IGhhc2gpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgRElTQ1JJTUlOQVRPUlMgPSB7XG4gIC8vIEJvb2xlYW4gTWFya2V0XG4gIE1BUktFVDogQnVmZmVyLmZyb20oWzIxOSwgMTkwLCAyMTMsIDU1LCAwLCAyMjcsIDE5OCwgMTU0XSksXG4gIE1BUktFVF9CQVNFNTg6ICdGY0puN3plUEpRMScsXG5cbiAgLy8gVXNlciBQb3NpdGlvbiAoQm9vbGVhbilcbiAgVVNFUl9QT1NJVElPTjogQnVmZmVyLmZyb20oWzI1MSwgMjQ4LCAyMDksIDI0NSwgODMsIDIzNCwgMTcsIDI3XSksXG4gIFVTRVJfUE9TSVRJT05fQkFTRTU4OiAnajlTakRZQVdlc1UnLFxuXG4gIC8vIFJhY2UgTWFya2V0XG4gIFJBQ0VfTUFSS0VUOiBCdWZmZXIuZnJvbShbMTQ5LCA4LCAxNTYsIDIwMiwgMTYwLCAyNTIsIDE3NiwgMjE3XSksXG5cbiAgLy8gUmFjZSBQb3NpdGlvblxuICBSQUNFX1BPU0lUSU9OOiBCdWZmZXIuZnJvbShbNDQsIDE4MiwgMTYsIDEsIDIzMCwgMTQsIDE3NCwgNDZdKSxcbiAgUkFDRV9QT1NJVElPTl9CQVNFNTg6ICc4VWttM0ZZdUw2SCcsXG5cbiAgLy8gR2xvYmFsIENvbmZpZ1xuICBHTE9CQUxfQ09ORklHOiBCdWZmZXIuZnJvbShbMTQ5LCA4LCAxNTYsIDIwMiwgMTYwLCAyNTIsIDE3NiwgMjE3XSksXG5cbiAgLy8gQ3JlYXRvciBQcm9maWxlXG4gIENSRUFUT1JfUFJPRklMRTogQnVmZmVyLmZyb20oWzgzLCAyMTAsIDI4LCA2LCA0NiwgMTgzLCAyMjQsIDIxOV0pLFxuXG4gIC8vIEFmZmlsaWF0ZVxuICBBRkZJTElBVEU6IEJ1ZmZlci5mcm9tKFsyNCwgMjQwLCAxNiwgMjQ1LCAzMywgNDYsIDc3LCAxNjhdKSxcblxuICAvLyBSZWZlcnJlZCBVc2VyIChmb3IgYWZmaWxpYXRlIHRyYWNraW5nKVxuICBSRUZFUlJFRF9VU0VSOiBCdWZmZXIuZnJvbShbMTg4LCAyMTAsIDI0NywgMTg1LCAxMDUsIDIwNCwgMjIwLCA0Nl0pLFxuXG4gIC8vIERpc3B1dGUgTWV0YVxuICBESVNQVVRFX01FVEE6IEJ1ZmZlci5mcm9tKFs2MiwgMTQsIDIyMSwgNjQsIDE3NSwgMjQxLCA0OCwgMTY1XSksXG59IGFzIGNvbnN0O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRkVFIENPTkZJR1VSQVRJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBGRUVTID0ge1xuICAvLyBQbGF0Zm9ybSBmZWVzIGJ5IGxheWVyIChicHMgPSBiYXNpcyBwb2ludHMsIDEwMCBicHMgPSAxJSlcbiAgT0ZGSUNJQUxfUExBVEZPUk1fRkVFX0JQUzogMjUwLCAvLyAyLjUlXG4gIExBQl9QTEFURk9STV9GRUVfQlBTOiAzMDAsICAgICAgLy8gMyVcbiAgUFJJVkFURV9QTEFURk9STV9GRUVfQlBTOiAyMDAsICAvLyAyJVxuXG4gIC8vIENyZWF0aW9uIGZlZXMgKGluIGxhbXBvcnRzKVxuICBPRkZJQ0lBTF9DUkVBVElPTl9GRUU6IDEwMF8wMDBfMDAwLCAvLyAwLjEgU09MXG4gIExBQl9DUkVBVElPTl9GRUU6IDQwXzAwMF8wMDAsICAgICAgIC8vIDAuMDQgU09MXG4gIFBSSVZBVEVfQ1JFQVRJT05fRkVFOiA0MF8wMDBfMDAwLCAgIC8vIDAuMDQgU09MXG5cbiAgLy8gRmVlIHNwbGl0ICh3aXRoaW4gcGxhdGZvcm0gZmVlKVxuICBBRkZJTElBVEVfRkVFX0JQUzogMTAwLCAgLy8gMSVcbiAgQ1JFQVRPUl9GRUVfQlBTOiA1MCwgICAgIC8vIDAuNSUgKGRlZmF1bHQsIGNhbiB2YXJ5KVxuXG4gIEJQU19ERU5PTUlOQVRPUjogMTAwMDAsXG59IGFzIGNvbnN0O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQkVUIExJTUlUU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IEJFVF9MSU1JVFMgPSB7XG4gIE1JTl9CRVRfU09MOiAwLjAxLFxuICBNQVhfQkVUX1NPTDogMTAwLFxuICBNSU5fQkVUX0xBTVBPUlRTOiAxMF8wMDBfMDAwLCAgIC8vIDAuMDEgU09MXG4gIE1BWF9CRVRfTEFNUE9SVFM6IDEwMF8wMDBfMDAwXzAwMCwgLy8gMTAwIFNPTFxufSBhcyBjb25zdDtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRJTUlORyBDT05TVEFOVFNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBUSU1JTkcgPSB7XG4gIC8vIEJldHRpbmcgZnJlZXplIGJlZm9yZSBjbG9zZSAoc2Vjb25kcylcbiAgQkVUVElOR19GUkVFWkVfU0VDT05EUzogMzAwLCAvLyA1IG1pbnV0ZXNcblxuICAvLyBNaW5pbXVtIGJ1ZmZlciBiZXR3ZWVuIGNsb3NpbmcgdGltZSBhbmQgZXZlbnQgKGhvdXJzKVxuICBNSU5fRVZFTlRfQlVGRkVSX0hPVVJTOiAxMixcbiAgUkVDT01NRU5ERURfRVZFTlRfQlVGRkVSX0hPVVJTOiAyNCxcblxuICAvLyBNYXhpbXVtIG1hcmtldCBkdXJhdGlvblxuICBNQVhfTUFSS0VUX0RVUkFUSU9OX0RBWVM6IDM2NSxcblxuICAvLyBSZXNvbHV0aW9uIHRpbWluZ1xuICBNSU5fUkVTT0xVVElPTl9CVUZGRVJfU0VDT05EUzogNjAwLCAgLy8gMTAgbWludXRlc1xuICBNQVhfUkVTT0xVVElPTl9CVUZGRVJfU0VDT05EUzogNjA0ODAwLCAvLyA3IGRheXNcblxuICAvLyBEaXNwdXRlIHdpbmRvd1xuICBESVNQVVRFX1dJTkRPV19TRUNPTkRTOiA4NjQwMCwgLy8gMjQgaG91cnNcbn0gYXMgY29uc3Q7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNQVJLRVQgU1RBVFVTICYgT1VUQ09NRSBFTlVNU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IE1BUktFVF9TVEFUVVMgPSB7XG4gIEFDVElWRTogMCxcbiAgQ0xPU0VEOiAxLFxuICBSRVNPTFZFRDogMixcbiAgQ0FOQ0VMTEVEOiAzLFxuICBQQVVTRUQ6IDQsXG4gIFJFU09MVkVEX1BFTkRJTkc6IDUsXG4gIERJU1BVVEVEOiA2LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IE1BUktFVF9TVEFUVVNfTkFNRVM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gIDA6ICdBY3RpdmUnLFxuICAxOiAnQ2xvc2VkJyxcbiAgMjogJ1Jlc29sdmVkJyxcbiAgMzogJ0NhbmNlbGxlZCcsXG4gIDQ6ICdQYXVzZWQnLFxuICA1OiAnUmVzb2x2ZWRQZW5kaW5nJyxcbiAgNjogJ0Rpc3B1dGVkJyxcbn07XG5cbmV4cG9ydCBjb25zdCBNQVJLRVRfT1VUQ09NRSA9IHtcbiAgVU5ERUNJREVEOiAwLFxuICBJTlZBTElEOiAxLFxuICBZRVM6IDIsXG4gIE5POiAzLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IE1BUktFVF9PVVRDT01FX05BTUVTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICAwOiAnVW5kZWNpZGVkJyxcbiAgMTogJ0ludmFsaWQnLFxuICAyOiAnWWVzJyxcbiAgMzogJ05vJyxcbn07XG5cbmV4cG9ydCBjb25zdCBNQVJLRVRfTEFZRVIgPSB7XG4gIE9GRklDSUFMOiAwLFxuICBMQUI6IDEsXG4gIFBSSVZBVEU6IDIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgTUFSS0VUX0xBWUVSX05BTUVTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICAwOiAnT2ZmaWNpYWwnLFxuICAxOiAnTGFiJyxcbiAgMjogJ1ByaXZhdGUnLFxufTtcblxuZXhwb3J0IGNvbnN0IE1BUktFVF9UWVBFID0ge1xuICBFVkVOVDogMCwgICAgICAvLyBFdmVudC1iYXNlZCAoUnVsZSBBKVxuICBNRUFTVVJFTUVOVDogMSwgLy8gTWVhc3VyZW1lbnQtcGVyaW9kIChSdWxlIEIpXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgTUFSS0VUX1RZUEVfTkFNRVM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gIDA6ICdFdmVudCcsXG4gIDE6ICdNZWFzdXJlbWVudCcsXG59O1xuXG5leHBvcnQgY29uc3QgQUNDRVNTX0dBVEUgPSB7XG4gIFBVQkxJQzogMCxcbiAgV0hJVEVMSVNUOiAxLFxufSBhcyBjb25zdDtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENVUlJFTkNZIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgQ1VSUkVOQ1lfVFlQRSA9IHtcbiAgU09MOiAwLFxuICBVU0RDOiAxLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IENVUlJFTkNZX1RZUEVfTkFNRVM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gIDA6ICdTb2wnLFxuICAxOiAnVXNkYycsXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRVJST1IgQ09ERVMgKGZyb20gSURMKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IEVSUk9SX0NPREVTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICA2MDAwOiAnTm90RXhwZWN0ZWRBZG1pbicsXG4gIDYwMDE6ICdOb3RBZG1pbicsXG4gIDYwMDI6ICdOb3RBZG1pbk9yR3VhcmRpYW4nLFxuICA2MDAzOiAnSW52YWxpZFVzZGNNaW50JyxcbiAgNjAwNDogJ0ludmFsaWRUcmVhc3VyeScsXG4gIDYwMDU6ICdJbnZhbGlkVmF1bHQnLFxuICA2MDA2OiAnUHJvdG9jb2xQYXVzZWQnLFxuICA2MDA3OiAnTWFya2V0UGF1c2VkJyxcbiAgNjAwODogJ1F1ZXN0aW9uVG9vTG9uZycsXG4gIDYwMDk6ICdDbG9zaW5nVGltZUluUGFzdCcsXG4gIDYwMTA6ICdDbG9zaW5nVGltZVRvb0ZhcicsXG4gIDYwMTE6ICdFdmVudFN0YXJ0VGltZUluUGFzdCcsXG4gIDYwMTI6ICdFdmVudFN0YXJ0VGltZVRvb0ZhcicsXG4gIDYwMTM6ICdJbnZhbGlkQXV0b1N0b3BCdWZmZXInLFxuICA2MDE0OiAnSW52YWxpZFJlc29sdXRpb25CdWZmZXInLFxuICA2MDE1OiAnTWFya2V0Tm90T3BlbicsXG4gIDYwMTY6ICdNYXJrZXROb3RDbG9zZWQnLFxuICA2MDE3OiAnTWFya2V0Tm90UmVzb2x2ZWQnLFxuICA2MDE4OiAnQmV0dGluZ0Nsb3NlZCcsXG4gIDYwMTk6ICdFdmVudFN0YXJ0ZWQnLFxuICA2MDIwOiAnQmV0VG9vU21hbGwnLFxuICA2MDIxOiAnU2xpcHBhZ2VFeGNlZWRlZCcsXG4gIDYwMjI6ICdGZWVPblRyYW5zZmVyTm90U3VwcG9ydGVkJyxcbiAgNjAyMzogJ1NuYXBzaG90VG9vRWFybHknLFxuICA2MDI0OiAnU25hcHNob3RBbHJlYWR5VGFrZW4nLFxuICA2MDI1OiAnU25hcHNob3ROb3RUYWtlbicsXG4gIDYwMjY6ICdDbG9zZVRvb0Vhcmx5JyxcbiAgNjAyNzogJ1Jlc29sdXRpb25EZWFkbGluZVBhc3NlZCcsXG4gIDYwMjg6ICdJbnZhbGlkT3V0Y29tZScsXG4gIDYwMjk6ICdBbHJlYWR5UmVzb2x2ZWQnLFxuICA2MDMwOiAnRW1lcmdlbmN5UmVzb2x2ZVRvb0Vhcmx5JyxcbiAgNjAzMTogJ1dyb25nQ3VycmVuY3knLFxuICA2MDMyOiAnQWxyZWFkeUNsYWltZWQnLFxuICA2MDMzOiAnTm90aGluZ1RvQ2xhaW0nLFxuICA2MDM0OiAnTWF0aE92ZXJmbG93JyxcbiAgNjAzNTogJ1Rvb0Vhcmx5VG9SZXNvbHZlJyxcbiAgNjAzNjogJ0ZlZVRvb0hpZ2gnLFxuICA2MDM3OiAnSW5zdWZmaWNpZW50VmF1bHRCYWxhbmNlJyxcbiAgNjAzODogJ0ludmFsaWRQb3NpdGlvbicsXG4gIDYwMzk6ICdJbnZhbGlkVG9rZW5BY2NvdW50JyxcbiAgNjA0MDogJ0JldHRpbmdGcm96ZW4nLFxuICA2MDQxOiAnQmV0VG9vTGFyZ2UnLFxuICA2MDQyOiAnSW5zdWZmaWNpZW50TWFya2V0QmFsYW5jZScsXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU1lTVEVNIFBST0dSQU0gSURTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgU1lTVEVNX1BST0dSQU1fSUQgPSBuZXcgUHVibGljS2V5KCcxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMScpO1xuZXhwb3J0IGNvbnN0IFRPS0VOX1BST0dSQU1fSUQgPSBuZXcgUHVibGljS2V5KCdUb2tlbmtlZ1FmZVp5aU53QUpiTmJHS1BGWENXdUJ2ZjlTczYyM1ZRNURBJyk7XG5leHBvcnQgY29uc3QgQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lEID0gbmV3IFB1YmxpY0tleSgnQVRva2VuR1B2YmRHVnhyMWIyaHZaYnNpcVc1eFdIMjVlZlROc0xKQThrbkwnKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IGxhbXBvcnRzIGZyb20gU09MXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb2xUb0xhbXBvcnRzKHNvbDogbnVtYmVyKTogYmlnaW50IHtcbiAgcmV0dXJuIEJpZ0ludChNYXRoLmZsb29yKHNvbCAqIDFfMDAwXzAwMF8wMDApKTtcbn1cblxuLyoqXG4gKiBHZXQgU09MIGZyb20gbGFtcG9ydHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhbXBvcnRzVG9Tb2wobGFtcG9ydHM6IGJpZ2ludCB8IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBOdW1iZXIobGFtcG9ydHMpIC8gMV8wMDBfMDAwXzAwMDtcbn1cblxuLyoqXG4gKiBEZXJpdmUgbWFya2V0IFBEQSBmcm9tIG1hcmtldCBJRFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlTWFya2V0UGRhKG1hcmtldElkOiBudW1iZXIgfCBiaWdpbnQpOiBbUHVibGljS2V5LCBudW1iZXJdIHtcbiAgY29uc3QgbWFya2V0SWRCdWZmZXIgPSBCdWZmZXIuYWxsb2MoOCk7XG4gIG1hcmtldElkQnVmZmVyLndyaXRlQmlnVUludDY0TEUoQmlnSW50KG1hcmtldElkKSk7XG4gIHJldHVybiBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbU0VFRFMuTUFSS0VULCBtYXJrZXRJZEJ1ZmZlcl0sXG4gICAgUFJPR1JBTV9JRFxuICApO1xufVxuXG4vKipcbiAqIERlcml2ZSBwb3NpdGlvbiBQREEgZnJvbSBtYXJrZXQgSUQgYW5kIHVzZXIgd2FsbGV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVQb3NpdGlvblBkYShtYXJrZXRJZDogbnVtYmVyIHwgYmlnaW50LCB1c2VyOiBQdWJsaWNLZXkpOiBbUHVibGljS2V5LCBudW1iZXJdIHtcbiAgY29uc3QgbWFya2V0SWRCdWZmZXIgPSBCdWZmZXIuYWxsb2MoOCk7XG4gIG1hcmtldElkQnVmZmVyLndyaXRlQmlnVUludDY0TEUoQmlnSW50KG1hcmtldElkKSk7XG4gIHJldHVybiBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbU0VFRFMuUE9TSVRJT04sIG1hcmtldElkQnVmZmVyLCB1c2VyLnRvQnVmZmVyKCldLFxuICAgIFBST0dSQU1fSURcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgcmFjZSBwb3NpdGlvbiBQREEgZnJvbSBtYXJrZXQgSUQgYW5kIHVzZXIgd2FsbGV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVSYWNlUG9zaXRpb25QZGEobWFya2V0SWQ6IG51bWJlciB8IGJpZ2ludCwgdXNlcjogUHVibGljS2V5KTogW1B1YmxpY0tleSwgbnVtYmVyXSB7XG4gIGNvbnN0IG1hcmtldElkQnVmZmVyID0gQnVmZmVyLmFsbG9jKDgpO1xuICBtYXJrZXRJZEJ1ZmZlci53cml0ZUJpZ1VJbnQ2NExFKEJpZ0ludChtYXJrZXRJZCkpO1xuICByZXR1cm4gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW1NFRURTLlJBQ0VfUE9TSVRJT04sIG1hcmtldElkQnVmZmVyLCB1c2VyLnRvQnVmZmVyKCldLFxuICAgIFBST0dSQU1fSURcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYWZmaWxpYXRlIFBEQSBmcm9tIHJlZmVycmFsIGNvZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZUFmZmlsaWF0ZVBkYShyZWZlcnJhbENvZGU6IHN0cmluZyk6IFtQdWJsaWNLZXksIG51bWJlcl0ge1xuICByZXR1cm4gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW1NFRURTLkFGRklMSUFURSwgQnVmZmVyLmZyb20ocmVmZXJyYWxDb2RlKV0sXG4gICAgUFJPR1JBTV9JRFxuICApO1xufVxuXG4vKipcbiAqIEdldCBwbGF0Zm9ybSBmZWUgZm9yIGEgbGF5ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBsYXRmb3JtRmVlRm9yTGF5ZXIobGF5ZXI6IG51bWJlcik6IG51bWJlciB7XG4gIHN3aXRjaCAobGF5ZXIpIHtcbiAgICBjYXNlIE1BUktFVF9MQVlFUi5PRkZJQ0lBTDpcbiAgICAgIHJldHVybiBGRUVTLk9GRklDSUFMX1BMQVRGT1JNX0ZFRV9CUFM7XG4gICAgY2FzZSBNQVJLRVRfTEFZRVIuTEFCOlxuICAgICAgcmV0dXJuIEZFRVMuTEFCX1BMQVRGT1JNX0ZFRV9CUFM7XG4gICAgY2FzZSBNQVJLRVRfTEFZRVIuUFJJVkFURTpcbiAgICAgIHJldHVybiBGRUVTLlBSSVZBVEVfUExBVEZPUk1fRkVFX0JQUztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEZFRVMuTEFCX1BMQVRGT1JNX0ZFRV9CUFM7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgY3JlYXRpb24gZmVlIGZvciBhIGxheWVyIChpbiBsYW1wb3J0cylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0aW9uRmVlRm9yTGF5ZXIobGF5ZXI6IG51bWJlcik6IG51bWJlciB7XG4gIHN3aXRjaCAobGF5ZXIpIHtcbiAgICBjYXNlIE1BUktFVF9MQVlFUi5PRkZJQ0lBTDpcbiAgICAgIHJldHVybiBGRUVTLk9GRklDSUFMX0NSRUFUSU9OX0ZFRTtcbiAgICBjYXNlIE1BUktFVF9MQVlFUi5MQUI6XG4gICAgICByZXR1cm4gRkVFUy5MQUJfQ1JFQVRJT05fRkVFO1xuICAgIGNhc2UgTUFSS0VUX0xBWUVSLlBSSVZBVEU6XG4gICAgICByZXR1cm4gRkVFUy5QUklWQVRFX0NSRUFUSU9OX0ZFRTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEZFRVMuTEFCX0NSRUFUSU9OX0ZFRTtcbiAgfVxufVxuIl19
@@ -0,0 +1,81 @@
1
+ export interface AgentAffiliateProfile {
2
+ affiliatePda: string;
3
+ ownerWallet: string;
4
+ affiliateCode: string;
5
+ isActive: boolean;
6
+ isVerified: boolean;
7
+ totalEarnedSol: number;
8
+ unclaimedSol: number;
9
+ totalClaimedSol: number;
10
+ totalReferrals: number;
11
+ activeReferrals: number;
12
+ agentName?: string;
13
+ agentType?: string;
14
+ registeredAt?: string;
15
+ }
16
+ export interface ReferralInfo {
17
+ referredUserPda: string;
18
+ userWallet: string;
19
+ affiliateCode: string;
20
+ totalBetsSol: number;
21
+ totalCommissionSol: number;
22
+ firstBetAt: string;
23
+ lastBetAt: string;
24
+ }
25
+ export interface AgentNetworkStats {
26
+ totalAgentAffiliates: number;
27
+ totalNetworkEarningsSol: number;
28
+ totalReferrals: number;
29
+ topAgents: AgentAffiliateProfile[];
30
+ }
31
+ export interface AffiliateCodeSuggestion {
32
+ code: string;
33
+ available: boolean;
34
+ reason?: string;
35
+ }
36
+ /**
37
+ * Check if an affiliate code is available
38
+ */
39
+ export declare function isAffiliateCodeAvailable(code: string): Promise<boolean>;
40
+ /**
41
+ * Generate suggested affiliate codes for an agent
42
+ */
43
+ export declare function suggestAffiliateCodes(agentName: string, count?: number): Promise<AffiliateCodeSuggestion[]>;
44
+ /**
45
+ * Get affiliate profile by code
46
+ */
47
+ export declare function getAffiliateByCode(code: string): Promise<AgentAffiliateProfile | null>;
48
+ /**
49
+ * Get affiliate profile(s) by owner wallet
50
+ */
51
+ export declare function getAffiliatesByOwner(walletAddress: string): Promise<AgentAffiliateProfile[]>;
52
+ /**
53
+ * Get all users referred by an affiliate
54
+ */
55
+ export declare function getReferralsByAffiliate(affiliateCode: string): Promise<ReferralInfo[]>;
56
+ /**
57
+ * Get overall agent affiliate network statistics
58
+ */
59
+ export declare function getAgentNetworkStats(): Promise<AgentNetworkStats>;
60
+ /**
61
+ * Format affiliate link for sharing between agents
62
+ */
63
+ export declare function formatAffiliateLink(affiliateCode: string, marketPda?: string): string;
64
+ /**
65
+ * Parse affiliate code from a referral link
66
+ */
67
+ export declare function parseAffiliateCode(url: string): string | null;
68
+ /**
69
+ * Get recommended affiliate code for an agent to use
70
+ * Prefers verified/high-reputation affiliates
71
+ */
72
+ export declare function getRecommendedAffiliate(): Promise<AgentAffiliateProfile | null>;
73
+ /**
74
+ * Commission structure info for agents
75
+ */
76
+ export declare function getCommissionInfo(): {
77
+ affiliateFeeBps: number;
78
+ affiliateFeePercent: string;
79
+ description: string;
80
+ example: string;
81
+ };