@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.
- package/README.md +294 -0
- package/dist/__tests__/full-test.d.ts +1 -0
- package/dist/__tests__/full-test.js +291 -0
- package/dist/builders/affiliate-transaction.d.ts +41 -0
- package/dist/builders/affiliate-transaction.js +123 -0
- package/dist/builders/bet-transaction.d.ts +70 -0
- package/dist/builders/bet-transaction.js +323 -0
- package/dist/builders/claim-transaction.d.ts +57 -0
- package/dist/builders/claim-transaction.js +196 -0
- package/dist/builders/creator-transaction.d.ts +49 -0
- package/dist/builders/creator-transaction.js +177 -0
- package/dist/builders/dispute-transaction.d.ts +81 -0
- package/dist/builders/dispute-transaction.js +215 -0
- package/dist/builders/index.d.ts +14 -0
- package/dist/builders/index.js +15 -0
- package/dist/builders/market-creation-tx.d.ts +65 -0
- package/dist/builders/market-creation-tx.js +362 -0
- package/dist/builders/market-management-transaction.d.ts +85 -0
- package/dist/builders/market-management-transaction.js +239 -0
- package/dist/builders/race-transaction.d.ts +67 -0
- package/dist/builders/race-transaction.js +242 -0
- package/dist/builders/resolution-transaction.d.ts +108 -0
- package/dist/builders/resolution-transaction.js +250 -0
- package/dist/builders/whitelist-transaction.d.ts +72 -0
- package/dist/builders/whitelist-transaction.js +179 -0
- package/dist/config.d.ts +138 -0
- package/dist/config.js +307 -0
- package/dist/handlers/agent-network.d.ts +81 -0
- package/dist/handlers/agent-network.js +332 -0
- package/dist/handlers/claims.d.ts +47 -0
- package/dist/handlers/claims.js +218 -0
- package/dist/handlers/market-creation.d.ts +154 -0
- package/dist/handlers/market-creation.js +290 -0
- package/dist/handlers/markets.d.ts +41 -0
- package/dist/handlers/markets.js +319 -0
- package/dist/handlers/positions.d.ts +40 -0
- package/dist/handlers/positions.js +244 -0
- package/dist/handlers/quote.d.ts +33 -0
- package/dist/handlers/quote.js +144 -0
- package/dist/handlers/race-markets.d.ts +54 -0
- package/dist/handlers/race-markets.js +308 -0
- package/dist/handlers/resolution.d.ts +43 -0
- package/dist/handlers/resolution.js +194 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +109 -0
- package/dist/resources.d.ts +13 -0
- package/dist/resources.js +336 -0
- package/dist/tools.d.ts +3109 -0
- package/dist/tools.js +1956 -0
- package/dist/validation/bet-rules.d.ts +82 -0
- package/dist/validation/bet-rules.js +276 -0
- package/dist/validation/creation-rules.d.ts +69 -0
- package/dist/validation/creation-rules.js +302 -0
- package/dist/validation/index.d.ts +6 -0
- package/dist/validation/index.js +7 -0
- package/dist/validation/market-rules.d.ts +60 -0
- package/dist/validation/market-rules.js +237 -0
- package/dist/validation/parimutuel-rules.d.ts +117 -0
- package/dist/validation/parimutuel-rules.js +270 -0
- 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
|
+
};
|