@xpr-agents/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +165 -0
- package/dist/AgentRegistry.d.ts +182 -0
- package/dist/AgentRegistry.js +892 -0
- package/dist/EscrowRegistry.d.ts +253 -0
- package/dist/EscrowRegistry.js +731 -0
- package/dist/FeedbackRegistry.d.ts +83 -0
- package/dist/FeedbackRegistry.js +424 -0
- package/dist/ValidationRegistry.d.ts +115 -0
- package/dist/ValidationRegistry.js +638 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +59 -0
- package/dist/types.d.ts +345 -0
- package/dist/types.js +4 -0
- package/dist/utils.d.ts +79 -0
- package/dist/utils.js +235 -0
- package/package.json +65 -0
|
@@ -0,0 +1,638 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ValidationRegistry = void 0;
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
const DEFAULT_CONTRACT = 'agentvalid';
|
|
6
|
+
class ValidationRegistry {
|
|
7
|
+
constructor(rpc, session, contract) {
|
|
8
|
+
this.rpc = rpc;
|
|
9
|
+
this.session = session || null;
|
|
10
|
+
this.contract = contract || DEFAULT_CONTRACT;
|
|
11
|
+
}
|
|
12
|
+
// ============== READ OPERATIONS ==============
|
|
13
|
+
/**
|
|
14
|
+
* Get a validator by account
|
|
15
|
+
*/
|
|
16
|
+
async getValidator(account) {
|
|
17
|
+
const result = await this.rpc.get_table_rows({
|
|
18
|
+
json: true,
|
|
19
|
+
code: this.contract,
|
|
20
|
+
scope: this.contract,
|
|
21
|
+
table: 'validators',
|
|
22
|
+
lower_bound: account,
|
|
23
|
+
upper_bound: account,
|
|
24
|
+
limit: 1,
|
|
25
|
+
});
|
|
26
|
+
if (result.rows.length === 0)
|
|
27
|
+
return null;
|
|
28
|
+
return this.parseValidator(result.rows[0]);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* List all validators
|
|
32
|
+
*/
|
|
33
|
+
async listValidators(options = {}) {
|
|
34
|
+
const { limit = 100, active_only = true } = options;
|
|
35
|
+
const result = await this.rpc.get_table_rows({
|
|
36
|
+
json: true,
|
|
37
|
+
code: this.contract,
|
|
38
|
+
scope: this.contract,
|
|
39
|
+
table: 'validators',
|
|
40
|
+
limit,
|
|
41
|
+
});
|
|
42
|
+
let validators = result.rows.map((row) => this.parseValidator(row));
|
|
43
|
+
if (active_only) {
|
|
44
|
+
validators = validators.filter((v) => v.active);
|
|
45
|
+
}
|
|
46
|
+
if (options.min_stake !== undefined) {
|
|
47
|
+
validators = validators.filter((v) => v.stake >= options.min_stake);
|
|
48
|
+
}
|
|
49
|
+
if (options.min_accuracy !== undefined) {
|
|
50
|
+
validators = validators.filter((v) => v.accuracy_score >= options.min_accuracy);
|
|
51
|
+
}
|
|
52
|
+
if (options.specialization) {
|
|
53
|
+
validators = validators.filter((v) => v.specializations.includes(options.specialization));
|
|
54
|
+
}
|
|
55
|
+
return validators;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get validation by ID
|
|
59
|
+
*/
|
|
60
|
+
async getValidation(id) {
|
|
61
|
+
const result = await this.rpc.get_table_rows({
|
|
62
|
+
json: true,
|
|
63
|
+
code: this.contract,
|
|
64
|
+
scope: this.contract,
|
|
65
|
+
table: 'validations',
|
|
66
|
+
lower_bound: String(id),
|
|
67
|
+
upper_bound: String(id),
|
|
68
|
+
limit: 1,
|
|
69
|
+
});
|
|
70
|
+
if (result.rows.length === 0)
|
|
71
|
+
return null;
|
|
72
|
+
return this.parseValidation(result.rows[0]);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* List validations for an agent
|
|
76
|
+
*/
|
|
77
|
+
async listValidationsForAgent(agent, limit = 100) {
|
|
78
|
+
const result = await this.rpc.get_table_rows({
|
|
79
|
+
json: true,
|
|
80
|
+
code: this.contract,
|
|
81
|
+
scope: this.contract,
|
|
82
|
+
table: 'validations',
|
|
83
|
+
index_position: 2,
|
|
84
|
+
key_type: 'i64',
|
|
85
|
+
limit,
|
|
86
|
+
});
|
|
87
|
+
return result.rows
|
|
88
|
+
.filter((row) => row.agent === agent)
|
|
89
|
+
.map((row) => this.parseValidation(row));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* List validations by a validator
|
|
93
|
+
*/
|
|
94
|
+
async listValidationsByValidator(validator, limit = 100) {
|
|
95
|
+
const result = await this.rpc.get_table_rows({
|
|
96
|
+
json: true,
|
|
97
|
+
code: this.contract,
|
|
98
|
+
scope: this.contract,
|
|
99
|
+
table: 'validations',
|
|
100
|
+
index_position: 3,
|
|
101
|
+
key_type: 'i64',
|
|
102
|
+
limit,
|
|
103
|
+
});
|
|
104
|
+
return result.rows
|
|
105
|
+
.filter((row) => row.validator === validator)
|
|
106
|
+
.map((row) => this.parseValidation(row));
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get challenge by ID
|
|
110
|
+
*/
|
|
111
|
+
async getChallenge(id) {
|
|
112
|
+
const result = await this.rpc.get_table_rows({
|
|
113
|
+
json: true,
|
|
114
|
+
code: this.contract,
|
|
115
|
+
scope: this.contract,
|
|
116
|
+
table: 'challenges',
|
|
117
|
+
lower_bound: String(id),
|
|
118
|
+
upper_bound: String(id),
|
|
119
|
+
limit: 1,
|
|
120
|
+
});
|
|
121
|
+
if (result.rows.length === 0)
|
|
122
|
+
return null;
|
|
123
|
+
return this.parseChallenge(result.rows[0]);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get challenges for a validation
|
|
127
|
+
*/
|
|
128
|
+
async getChallengesForValidation(validationId) {
|
|
129
|
+
const result = await this.rpc.get_table_rows({
|
|
130
|
+
json: true,
|
|
131
|
+
code: this.contract,
|
|
132
|
+
scope: this.contract,
|
|
133
|
+
table: 'challenges',
|
|
134
|
+
index_position: 2,
|
|
135
|
+
key_type: 'i64',
|
|
136
|
+
limit: 100,
|
|
137
|
+
});
|
|
138
|
+
return result.rows
|
|
139
|
+
.filter((row) => row.validation_id === String(validationId))
|
|
140
|
+
.map((row) => this.parseChallenge(row));
|
|
141
|
+
}
|
|
142
|
+
// ============== WRITE OPERATIONS ==============
|
|
143
|
+
/**
|
|
144
|
+
* Register as a validator
|
|
145
|
+
*/
|
|
146
|
+
async registerValidator(method, specializations) {
|
|
147
|
+
this.requireSession();
|
|
148
|
+
return this.session.link.transact({
|
|
149
|
+
actions: [
|
|
150
|
+
{
|
|
151
|
+
account: this.contract,
|
|
152
|
+
name: 'regval',
|
|
153
|
+
authorization: [
|
|
154
|
+
{
|
|
155
|
+
actor: this.session.auth.actor,
|
|
156
|
+
permission: this.session.auth.permission,
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
data: {
|
|
160
|
+
account: this.session.auth.actor,
|
|
161
|
+
method,
|
|
162
|
+
specializations: JSON.stringify(specializations),
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Update validator info
|
|
170
|
+
*/
|
|
171
|
+
async updateValidator(method, specializations) {
|
|
172
|
+
this.requireSession();
|
|
173
|
+
return this.session.link.transact({
|
|
174
|
+
actions: [
|
|
175
|
+
{
|
|
176
|
+
account: this.contract,
|
|
177
|
+
name: 'updateval',
|
|
178
|
+
authorization: [
|
|
179
|
+
{
|
|
180
|
+
actor: this.session.auth.actor,
|
|
181
|
+
permission: this.session.auth.permission,
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
data: {
|
|
185
|
+
account: this.session.auth.actor,
|
|
186
|
+
method,
|
|
187
|
+
specializations: JSON.stringify(specializations),
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
],
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Stake XPR as validator
|
|
195
|
+
*/
|
|
196
|
+
async stake(amount) {
|
|
197
|
+
this.requireSession();
|
|
198
|
+
return this.session.link.transact({
|
|
199
|
+
actions: [
|
|
200
|
+
{
|
|
201
|
+
account: 'eosio.token',
|
|
202
|
+
name: 'transfer',
|
|
203
|
+
authorization: [
|
|
204
|
+
{
|
|
205
|
+
actor: this.session.auth.actor,
|
|
206
|
+
permission: this.session.auth.permission,
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
data: {
|
|
210
|
+
from: this.session.auth.actor,
|
|
211
|
+
to: this.contract,
|
|
212
|
+
quantity: amount,
|
|
213
|
+
memo: 'stake',
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
],
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Submit validation
|
|
221
|
+
*/
|
|
222
|
+
async validate(data) {
|
|
223
|
+
this.requireSession();
|
|
224
|
+
return this.session.link.transact({
|
|
225
|
+
actions: [
|
|
226
|
+
{
|
|
227
|
+
account: this.contract,
|
|
228
|
+
name: 'validate',
|
|
229
|
+
authorization: [
|
|
230
|
+
{
|
|
231
|
+
actor: this.session.auth.actor,
|
|
232
|
+
permission: this.session.auth.permission,
|
|
233
|
+
},
|
|
234
|
+
],
|
|
235
|
+
data: {
|
|
236
|
+
validator: this.session.auth.actor,
|
|
237
|
+
agent: data.agent,
|
|
238
|
+
job_hash: data.job_hash,
|
|
239
|
+
result: (0, utils_1.validationResultToNumber)(data.result),
|
|
240
|
+
confidence: data.confidence,
|
|
241
|
+
evidence_uri: data.evidence_uri || '',
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
],
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Challenge a validation
|
|
249
|
+
*/
|
|
250
|
+
async challenge(validationId, reason, evidenceUri) {
|
|
251
|
+
this.requireSession();
|
|
252
|
+
return this.session.link.transact({
|
|
253
|
+
actions: [
|
|
254
|
+
{
|
|
255
|
+
account: this.contract,
|
|
256
|
+
name: 'challenge',
|
|
257
|
+
authorization: [
|
|
258
|
+
{
|
|
259
|
+
actor: this.session.auth.actor,
|
|
260
|
+
permission: this.session.auth.permission,
|
|
261
|
+
},
|
|
262
|
+
],
|
|
263
|
+
data: {
|
|
264
|
+
challenger: this.session.auth.actor,
|
|
265
|
+
validation_id: validationId,
|
|
266
|
+
reason,
|
|
267
|
+
evidence_uri: evidenceUri || '',
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
],
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Stake for a challenge
|
|
275
|
+
*/
|
|
276
|
+
async stakeChallengeDeposit(challengeId, amount) {
|
|
277
|
+
this.requireSession();
|
|
278
|
+
return this.session.link.transact({
|
|
279
|
+
actions: [
|
|
280
|
+
{
|
|
281
|
+
account: 'eosio.token',
|
|
282
|
+
name: 'transfer',
|
|
283
|
+
authorization: [
|
|
284
|
+
{
|
|
285
|
+
actor: this.session.auth.actor,
|
|
286
|
+
permission: this.session.auth.permission,
|
|
287
|
+
},
|
|
288
|
+
],
|
|
289
|
+
data: {
|
|
290
|
+
from: this.session.auth.actor,
|
|
291
|
+
to: this.contract,
|
|
292
|
+
quantity: amount,
|
|
293
|
+
memo: `challenge:${challengeId}`,
|
|
294
|
+
},
|
|
295
|
+
},
|
|
296
|
+
],
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Set validator active status
|
|
301
|
+
*/
|
|
302
|
+
async setValidatorStatus(active) {
|
|
303
|
+
this.requireSession();
|
|
304
|
+
return this.session.link.transact({
|
|
305
|
+
actions: [
|
|
306
|
+
{
|
|
307
|
+
account: this.contract,
|
|
308
|
+
name: 'setvalstat',
|
|
309
|
+
authorization: [
|
|
310
|
+
{
|
|
311
|
+
actor: this.session.auth.actor,
|
|
312
|
+
permission: this.session.auth.permission,
|
|
313
|
+
},
|
|
314
|
+
],
|
|
315
|
+
data: {
|
|
316
|
+
account: this.session.auth.actor,
|
|
317
|
+
active,
|
|
318
|
+
},
|
|
319
|
+
},
|
|
320
|
+
],
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Request to unstake validator funds (time-delayed).
|
|
325
|
+
* Must be deactivated and have no pending challenges first.
|
|
326
|
+
*
|
|
327
|
+
* @param amount - Amount to unstake in smallest units
|
|
328
|
+
*/
|
|
329
|
+
async unstake(amount) {
|
|
330
|
+
this.requireSession();
|
|
331
|
+
return this.session.link.transact({
|
|
332
|
+
actions: [
|
|
333
|
+
{
|
|
334
|
+
account: this.contract,
|
|
335
|
+
name: 'unstake',
|
|
336
|
+
authorization: [
|
|
337
|
+
{
|
|
338
|
+
actor: this.session.auth.actor,
|
|
339
|
+
permission: this.session.auth.permission,
|
|
340
|
+
},
|
|
341
|
+
],
|
|
342
|
+
data: {
|
|
343
|
+
account: this.session.auth.actor,
|
|
344
|
+
amount,
|
|
345
|
+
},
|
|
346
|
+
},
|
|
347
|
+
],
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Withdraw unstaked validator funds (after delay period)
|
|
352
|
+
*
|
|
353
|
+
* @param unstakeId - The ID of the unstake request to withdraw
|
|
354
|
+
*/
|
|
355
|
+
async withdraw(unstakeId) {
|
|
356
|
+
this.requireSession();
|
|
357
|
+
return this.session.link.transact({
|
|
358
|
+
actions: [
|
|
359
|
+
{
|
|
360
|
+
account: this.contract,
|
|
361
|
+
name: 'withdraw',
|
|
362
|
+
authorization: [
|
|
363
|
+
{
|
|
364
|
+
actor: this.session.auth.actor,
|
|
365
|
+
permission: this.session.auth.permission,
|
|
366
|
+
},
|
|
367
|
+
],
|
|
368
|
+
data: {
|
|
369
|
+
account: this.session.auth.actor,
|
|
370
|
+
unstake_id: unstakeId,
|
|
371
|
+
},
|
|
372
|
+
},
|
|
373
|
+
],
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Cancel an unfunded challenge (within grace period or after deadline)
|
|
378
|
+
*/
|
|
379
|
+
async cancelChallenge(challengeId) {
|
|
380
|
+
this.requireSession();
|
|
381
|
+
return this.session.link.transact({
|
|
382
|
+
actions: [
|
|
383
|
+
{
|
|
384
|
+
account: this.contract,
|
|
385
|
+
name: 'cancelchal',
|
|
386
|
+
authorization: [
|
|
387
|
+
{
|
|
388
|
+
actor: this.session.auth.actor,
|
|
389
|
+
permission: this.session.auth.permission,
|
|
390
|
+
},
|
|
391
|
+
],
|
|
392
|
+
data: {
|
|
393
|
+
challenger: this.session.auth.actor,
|
|
394
|
+
challenge_id: challengeId,
|
|
395
|
+
},
|
|
396
|
+
},
|
|
397
|
+
],
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Resolve a validation challenge (owner only)
|
|
402
|
+
*/
|
|
403
|
+
async resolve(challengeId, upheld, resolutionNotes) {
|
|
404
|
+
this.requireSession();
|
|
405
|
+
return this.session.link.transact({
|
|
406
|
+
actions: [
|
|
407
|
+
{
|
|
408
|
+
account: this.contract,
|
|
409
|
+
name: 'resolve',
|
|
410
|
+
authorization: [
|
|
411
|
+
{
|
|
412
|
+
actor: this.session.auth.actor,
|
|
413
|
+
permission: this.session.auth.permission,
|
|
414
|
+
},
|
|
415
|
+
],
|
|
416
|
+
data: {
|
|
417
|
+
resolver: this.session.auth.actor,
|
|
418
|
+
challenge_id: challengeId,
|
|
419
|
+
upheld,
|
|
420
|
+
resolution_notes: resolutionNotes,
|
|
421
|
+
},
|
|
422
|
+
},
|
|
423
|
+
],
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Expire an unfunded challenge (permissionless cleanup)
|
|
428
|
+
*/
|
|
429
|
+
async expireUnfundedChallenge(challengeId) {
|
|
430
|
+
this.requireSession();
|
|
431
|
+
return this.session.link.transact({
|
|
432
|
+
actions: [
|
|
433
|
+
{
|
|
434
|
+
account: this.contract,
|
|
435
|
+
name: 'expireunfund',
|
|
436
|
+
authorization: [
|
|
437
|
+
{
|
|
438
|
+
actor: this.session.auth.actor,
|
|
439
|
+
permission: this.session.auth.permission,
|
|
440
|
+
},
|
|
441
|
+
],
|
|
442
|
+
data: {
|
|
443
|
+
challenge_id: challengeId,
|
|
444
|
+
},
|
|
445
|
+
},
|
|
446
|
+
],
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Expire a funded challenge that was not resolved within timeout (permissionless cleanup)
|
|
451
|
+
*/
|
|
452
|
+
async expireFundedChallenge(challengeId) {
|
|
453
|
+
this.requireSession();
|
|
454
|
+
return this.session.link.transact({
|
|
455
|
+
actions: [
|
|
456
|
+
{
|
|
457
|
+
account: this.contract,
|
|
458
|
+
name: 'expirefunded',
|
|
459
|
+
authorization: [
|
|
460
|
+
{
|
|
461
|
+
actor: this.session.auth.actor,
|
|
462
|
+
permission: this.session.auth.permission,
|
|
463
|
+
},
|
|
464
|
+
],
|
|
465
|
+
data: {
|
|
466
|
+
challenge_id: challengeId,
|
|
467
|
+
},
|
|
468
|
+
},
|
|
469
|
+
],
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Submit validation with fee in one transaction.
|
|
474
|
+
*
|
|
475
|
+
* @param data - Validation data
|
|
476
|
+
* @param amount - The validation fee (e.g., "1.0000 XPR")
|
|
477
|
+
*/
|
|
478
|
+
async validateWithFee(data, amount) {
|
|
479
|
+
this.requireSession();
|
|
480
|
+
const actor = this.session.auth.actor;
|
|
481
|
+
return this.session.link.transact({
|
|
482
|
+
actions: [
|
|
483
|
+
{
|
|
484
|
+
account: 'eosio.token',
|
|
485
|
+
name: 'transfer',
|
|
486
|
+
authorization: [{
|
|
487
|
+
actor,
|
|
488
|
+
permission: this.session.auth.permission,
|
|
489
|
+
}],
|
|
490
|
+
data: {
|
|
491
|
+
from: actor,
|
|
492
|
+
to: this.contract,
|
|
493
|
+
quantity: amount,
|
|
494
|
+
memo: `valfee:${actor}`,
|
|
495
|
+
},
|
|
496
|
+
},
|
|
497
|
+
{
|
|
498
|
+
account: this.contract,
|
|
499
|
+
name: 'validate',
|
|
500
|
+
authorization: [{
|
|
501
|
+
actor,
|
|
502
|
+
permission: this.session.auth.permission,
|
|
503
|
+
}],
|
|
504
|
+
data: {
|
|
505
|
+
validator: actor,
|
|
506
|
+
agent: data.agent,
|
|
507
|
+
job_hash: data.job_hash,
|
|
508
|
+
result: (0, utils_1.validationResultToNumber)(data.result),
|
|
509
|
+
confidence: data.confidence,
|
|
510
|
+
evidence_uri: data.evidence_uri || '',
|
|
511
|
+
},
|
|
512
|
+
},
|
|
513
|
+
],
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Clean up old validations (permissionless)
|
|
518
|
+
*/
|
|
519
|
+
async cleanValidations(agent, maxAge, maxDelete) {
|
|
520
|
+
this.requireSession();
|
|
521
|
+
return this.session.link.transact({
|
|
522
|
+
actions: [{
|
|
523
|
+
account: this.contract,
|
|
524
|
+
name: 'cleanvals',
|
|
525
|
+
authorization: [{
|
|
526
|
+
actor: this.session.auth.actor,
|
|
527
|
+
permission: this.session.auth.permission,
|
|
528
|
+
}],
|
|
529
|
+
data: {
|
|
530
|
+
agent,
|
|
531
|
+
max_age: maxAge,
|
|
532
|
+
max_delete: maxDelete,
|
|
533
|
+
},
|
|
534
|
+
}],
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Clean up resolved challenges (permissionless)
|
|
539
|
+
*/
|
|
540
|
+
async cleanChallenges(maxAge, maxDelete) {
|
|
541
|
+
this.requireSession();
|
|
542
|
+
return this.session.link.transact({
|
|
543
|
+
actions: [{
|
|
544
|
+
account: this.contract,
|
|
545
|
+
name: 'cleanchals',
|
|
546
|
+
authorization: [{
|
|
547
|
+
actor: this.session.auth.actor,
|
|
548
|
+
permission: this.session.auth.permission,
|
|
549
|
+
}],
|
|
550
|
+
data: {
|
|
551
|
+
max_age: maxAge,
|
|
552
|
+
max_delete: maxDelete,
|
|
553
|
+
},
|
|
554
|
+
}],
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Get validation contract configuration
|
|
559
|
+
*/
|
|
560
|
+
async getConfig() {
|
|
561
|
+
const result = await this.rpc.get_table_rows({
|
|
562
|
+
json: true,
|
|
563
|
+
code: this.contract,
|
|
564
|
+
scope: this.contract,
|
|
565
|
+
table: 'config',
|
|
566
|
+
limit: 1,
|
|
567
|
+
});
|
|
568
|
+
if (result.rows.length === 0) {
|
|
569
|
+
throw new Error('Contract not initialized');
|
|
570
|
+
}
|
|
571
|
+
const row = result.rows[0];
|
|
572
|
+
return {
|
|
573
|
+
owner: row.owner,
|
|
574
|
+
core_contract: row.core_contract,
|
|
575
|
+
min_stake: (0, utils_1.safeParseInt)(row.min_stake),
|
|
576
|
+
challenge_stake: (0, utils_1.safeParseInt)(row.challenge_stake),
|
|
577
|
+
unstake_delay: (0, utils_1.safeParseInt)(row.unstake_delay),
|
|
578
|
+
challenge_window: (0, utils_1.safeParseInt)(row.challenge_window),
|
|
579
|
+
slash_percent: (0, utils_1.safeParseInt)(row.slash_percent),
|
|
580
|
+
dispute_period: (0, utils_1.safeParseInt)(row.dispute_period),
|
|
581
|
+
funded_challenge_timeout: (0, utils_1.safeParseInt)(row.funded_challenge_timeout),
|
|
582
|
+
paused: row.paused === 1,
|
|
583
|
+
validation_fee: (0, utils_1.safeParseInt)(row.validation_fee),
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
// ============== HELPERS ==============
|
|
587
|
+
requireSession() {
|
|
588
|
+
if (!this.session) {
|
|
589
|
+
throw new Error('Session required for write operations');
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
parseValidator(raw) {
|
|
593
|
+
return {
|
|
594
|
+
account: raw.account,
|
|
595
|
+
stake: (0, utils_1.safeParseInt)(raw.stake),
|
|
596
|
+
method: raw.method,
|
|
597
|
+
specializations: (0, utils_1.parseSpecializations)(raw.specializations),
|
|
598
|
+
total_validations: (0, utils_1.safeParseInt)(raw.total_validations),
|
|
599
|
+
incorrect_validations: (0, utils_1.safeParseInt)(raw.incorrect_validations),
|
|
600
|
+
accuracy_score: (0, utils_1.safeParseInt)(raw.accuracy_score),
|
|
601
|
+
pending_challenges: (0, utils_1.safeParseInt)(raw.pending_challenges),
|
|
602
|
+
registered_at: (0, utils_1.safeParseInt)(raw.registered_at),
|
|
603
|
+
active: raw.active === 1,
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
parseValidation(raw) {
|
|
607
|
+
return {
|
|
608
|
+
id: (0, utils_1.safeParseInt)(raw.id),
|
|
609
|
+
validator: raw.validator,
|
|
610
|
+
agent: raw.agent,
|
|
611
|
+
job_hash: raw.job_hash,
|
|
612
|
+
result: (0, utils_1.validationResultFromNumber)(raw.result),
|
|
613
|
+
confidence: raw.confidence,
|
|
614
|
+
evidence_uri: raw.evidence_uri,
|
|
615
|
+
challenged: raw.challenged === 1,
|
|
616
|
+
timestamp: (0, utils_1.safeParseInt)(raw.timestamp),
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
parseChallenge(raw) {
|
|
620
|
+
return {
|
|
621
|
+
id: (0, utils_1.safeParseInt)(raw.id),
|
|
622
|
+
validation_id: (0, utils_1.safeParseInt)(raw.validation_id),
|
|
623
|
+
challenger: raw.challenger,
|
|
624
|
+
reason: raw.reason,
|
|
625
|
+
evidence_uri: raw.evidence_uri,
|
|
626
|
+
stake: (0, utils_1.safeParseInt)(raw.stake),
|
|
627
|
+
status: (0, utils_1.disputeStatusFromNumber)(raw.status),
|
|
628
|
+
resolver: raw.resolver,
|
|
629
|
+
resolution_notes: raw.resolution_notes,
|
|
630
|
+
created_at: (0, utils_1.safeParseInt)(raw.created_at),
|
|
631
|
+
resolved_at: (0, utils_1.safeParseInt)(raw.resolved_at),
|
|
632
|
+
funding_deadline: (0, utils_1.safeParseInt)(raw.funding_deadline),
|
|
633
|
+
funded_at: (0, utils_1.safeParseInt)(raw.funded_at),
|
|
634
|
+
};
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
exports.ValidationRegistry = ValidationRegistry;
|
|
638
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmFsaWRhdGlvblJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1ZhbGlkYXRpb25SZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFjQSxtQ0FNaUI7QUFFakIsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7QUFFdEMsTUFBYSxrQkFBa0I7SUFLN0IsWUFBWSxHQUFZLEVBQUUsT0FBdUIsRUFBRSxRQUFpQjtRQUNsRSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLElBQUksQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxnQkFBZ0IsQ0FBQztJQUMvQyxDQUFDO0lBRUQsZ0RBQWdEO0lBRWhEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFlO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQWU7WUFDekQsSUFBSSxFQUFFLElBQUk7WUFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3BCLEtBQUssRUFBRSxZQUFZO1lBQ25CLFdBQVcsRUFBRSxPQUFPO1lBQ3BCLFdBQVcsRUFBRSxPQUFPO1lBQ3BCLEtBQUssRUFBRSxDQUFDO1NBQ1QsQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUFDLFVBQWdDLEVBQUU7UUFDckQsTUFBTSxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsV0FBVyxHQUFH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LEdBQUcsQ0FBQyxVQUFVO1lBQzFCLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWTtZQUM5QixVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsS0FBSyxDQUFDO1lBQ2hDLFNBQVMsRUFBRSxJQUFBLG9CQUFZLEVBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztTQUN2QyxDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWMsQ0FBQyxHQWN0QjtRQUNDLE9BQU87WUFDTCxFQUFFLEVBQUUsSUFBQSxvQkFBWSxFQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsYUFBYSxFQUFFLElBQUEsb0JBQVksRUFBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1lBQzlDLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtZQUMxQixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07WUFDbEIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZO1lBQzlCLEtBQUssRUFBRSxJQUFBLG9CQUFZLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUM5QixNQUFNLEVBQUUsSUFBQSwrQkFBdUIsRUFBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQzNDLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtZQUN0QixnQkFBZ0IsRUFBRSxHQUFHLENBQUMsZ0JBQWdCO1lBQ3RDLFVBQVUsRUFBRSxJQUFBLG9CQUFZLEVBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUN4QyxXQUFXLEVBQUUsSUFBQSxvQkFBWSxFQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFDMUMsZ0JBQWdCLEVBQUUsSUFBQSxvQkFBWSxFQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNwRCxTQUFTLEVBQUUsSUFBQSxvQkFBWSxFQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7U0FDdkMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWx3QkQsZ0RBa3dCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFZhbGlkYXRvcixcbiAgVmFsaWRhdG9yUmF3LFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uUmF3LFxuICBWYWxpZGF0aW9uQ29uZmlnLFxuICBDaGFsbGVuZ2UsXG4gIFZhbGlkYXRvckxpc3RPcHRpb25zLFxuICBTdWJtaXRWYWxpZGF0aW9uRGF0YSxcbiAgVHJhbnNhY3Rpb25SZXN1bHQsXG4gIEpzb25ScGMsXG4gIFByb3RvblNlc3Npb24sXG4gIFZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgcGFyc2VTcGVjaWFsaXphdGlvbnMsXG4gIHZhbGlkYXRpb25SZXN1bHRGcm9tTnVtYmVyLFxuICB2YWxpZGF0aW9uUmVzdWx0VG9OdW1iZXIsXG4gIGRpc3B1dGVTdGF0dXNGcm9tTnVtYmVyLFxuICBzYWZlUGFyc2VJbnQsXG59IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBERUZBVUxUX0NPTlRSQUNUID0gJ2FnZW50dmFsaWQnO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvblJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBycGM6IEpzb25ScGM7XG4gIHByaXZhdGUgc2Vzc2lvbjogUHJvdG9uU2Vzc2lvbiB8IG51bGw7XG4gIHByaXZhdGUgY29udHJhY3Q6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihycGM6IEpzb25ScGMsIHNlc3Npb24/OiBQcm90b25TZXNzaW9uLCBjb250cmFjdD86IHN0cmluZykge1xuICAgIHRoaXMucnBjID0gcnBjO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb24gfHwgbnVsbDtcbiAgICB0aGlzLmNvbnRyYWN0ID0gY29udHJhY3QgfHwgREVGQVVMVF9DT05UUkFDVDtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09IFJFQUQgT1BFUkFUSU9OUyA9PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgYSB2YWxpZGF0b3IgYnkgYWNjb3VudFxuICAgKi9cbiAgYXN5bmMgZ2V0VmFsaWRhdG9yKGFjY291bnQ6IHN0cmluZyk6IFByb21pc2U8VmFsaWRhdG9yIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjLmdldF90YWJsZV9yb3dzPFZhbGlkYXRvclJhdz4oe1xuICAgICAganNvbjogdHJ1ZSxcbiAgICAgIGNvZGU6IHRoaXMuY29udHJhY3QsXG4gICAgICBzY29wZTogdGhpcy5jb250cmFjdCxcbiAgICAgIHRhYmxlOiAndmFsaWRhdG9ycycsXG4gICAgICBsb3dlcl9ib3VuZDogYWNjb3VudCxcbiAgICAgIHVwcGVyX2JvdW5kOiBhY2NvdW50LFxuICAgICAgbGltaXQ6IDEsXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0LnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVZhbGlkYXRvcihyZXN1bHQucm93c1swXSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgdmFsaWRhdG9yc1xuICAgKi9cbiAgYXN5bmMgbGlzdFZhbGlkYXRvcnMob3B0aW9uczogVmFsaWRhdG9yTGlzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VmFsaWRhdG9yW10+IHtcbiAgICBjb25zdCB7IGxpbWl0ID0gMTAwLCBhY3RpdmVfb25seSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJwYy5nZXRfdGFibGVfcm93czxWYWxpZGF0b3JSYXc+KHtcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBjb2RlOiB0aGlzLmNvbnRyYWN0LFxuICAgICAgc2NvcGU6IHRoaXMuY29udHJhY3QsXG4gICAgICB0YWJsZTogJ3ZhbGlkYXRvcnMnLFxuICAgICAgbGltaXQsXG4gICAgfSk7XG5cbiAgICBsZXQgdmFsaWRhdG9ycyA9IHJlc3VsdC5yb3dzLm1hcCgocm93KSA9PiB0aGlzLnBhcnNlVmFsaWRhdG9yKHJvdykpO1xuXG4gICAgaWYgKGFjdGl2ZV9vbmx5KSB7XG4gICAgICB2YWxpZGF0b3JzID0gdmFsaWRhdG9ycy5maWx0ZXIoKHYpID0+IHYuYWN0aXZlKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5taW5fc3Rha2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdG9ycyA9IHZhbGlkYXRvcnMuZmlsdGVyKCh2KSA9PiB2LnN0YWtlID49IG9wdGlvbnMubWluX3N0YWtlISk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubWluX2FjY3VyYWN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzLmZpbHRlcigodikgPT4gdi5hY2N1cmFjeV9zY29yZSA+PSBvcHRpb25zLm1pbl9hY2N1cmFjeSEpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNwZWNpYWxpemF0aW9uKSB7XG4gICAgICB2YWxpZGF0b3JzID0gdmFsaWRhdG9ycy5maWx0ZXIoKHYpID0+XG4gICAgICAgIHYuc3BlY2lhbGl6YXRpb25zLmluY2x1ZGVzKG9wdGlvbnMuc3BlY2lhbGl6YXRpb24hKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdmFsaWRhdGlvbiBieSBJRFxuICAgKi9cbiAgYXN5bmMgZ2V0VmFsaWRhdGlvbihpZDogbnVtYmVyKTogUHJvbWlzZTxWYWxpZGF0aW9uIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjLmdldF90YWJsZV9yb3dzPFZhbGlkYXRpb25SYXc+KHtcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBjb2RlOiB0aGlzLmNvbnRyYWN0LFxuICAgICAgc2NvcGU6IHRoaXMuY29udHJhY3QsXG4gICAgICB0YWJsZTogJ3ZhbGlkYXRpb25zJyxcbiAgICAgIGxvd2VyX2JvdW5kOiBTdHJpbmcoaWQpLFxuICAgICAgdXBwZXJfYm91bmQ6IFN0cmluZyhpZCksXG4gICAgICBsaW1pdDogMSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQucm93cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnBhcnNlVmFsaWRhdGlvbihyZXN1bHQucm93c1swXSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB2YWxpZGF0aW9ucyBmb3IgYW4gYWdlbnRcbiAgICovXG4gIGFzeW5jIGxpc3RWYWxpZGF0aW9uc0ZvckFnZW50KGFnZW50OiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAxMDApOiBQcm9taXNlPFZhbGlkYXRpb25bXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjLmdldF90YWJsZV9yb3dzPFZhbGlkYXRpb25SYXc+KHtcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBjb2RlOiB0aGlzLmNvbnRyYWN0LFxuICAgICAgc2NvcGU6IHRoaXMuY29udHJhY3QsXG4gICAgICB0YWJsZTogJ3ZhbGlkYXRpb25zJyxcbiAgICAgIGluZGV4X3Bvc2l0aW9uOiAyLFxuICAgICAga2V5X3R5cGU6ICdpNjQnLFxuICAgICAgbGltaXQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJvd3NcbiAgICAgIC5maWx0ZXIoKHJvdykgPT4gcm93LmFnZW50ID09PSBhZ2VudClcbiAgICAgIC5tYXAoKHJvdykgPT4gdGhpcy5wYXJzZVZhbGlkYXRpb24ocm93KSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB2YWxpZGF0aW9ucyBieSBhIHZhbGlkYXRvclxuICAgKi9cbiAgYXN5bmMgbGlzdFZhbGlkYXRpb25zQnlWYWxpZGF0b3IoXG4gICAgdmFsaWRhdG9yOiBzdHJpbmcsXG4gICAgbGltaXQ6IG51bWJlciA9IDEwMFxuICApOiBQcm9taXNlPFZhbGlkYXRpb25bXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjLmdldF90YWJsZV9yb3dzPFZhbGlkYXRpb25SYXc+KHtcbiAgICAgIGpzb246IHRydWUsXG4gICAgICBjb2RlOiB0aGlzLmNvbnRyYWN0LFxuICAgICAgc2NvcGU6IHRoaXMuY29udHJhY3QsXG4gICAgICB0YWJsZTogJ3ZhbGlkYXRpb25zJyxcbiAgICAgIGluZGV4X3Bvc2l0aW9uOiAzLFxuICAgICAga2V5X3R5cGU6ICdpNjQnLFxuICAgICAgbGltaXQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJvd3NcbiAgICAgIC5maWx0ZXIoKHJvdykgPT4gcm93LnZhbGlkYXRvciA9PT0gdmFsaWRhdG9yKVxuICAgICAgLm1hcCgocm93KSA9PiB0aGlzLnBhcnNlVmFsaWRhdGlvbihyb3cpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhbGxlbmdlIGJ5IElEXG4gICAqL1xuICBhc3luYyBnZXRDaGFsbGVuZ2UoaWQ6IG51bWJlcik6IFByb21pc2U8Q2hhbGxlbmdlIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjLmdldF90YWJsZV9yb3dzPHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICB2YWxpZGF0aW9uX2lkOiBzdHJpbmc7XG4gICAgICBjaGFsbGVuZ2VyOiBzdHJpbmc7XG4gICAgICByZWFzb246IHN0cmluZztcbiAgICAgIGV2aWRlbmNlX3VyaTogc3RyaW5nO1xuICAgICAgc3Rha2U6IHN0cmluZztcbiAgICAgIHN0YXR1czogbnVtYmVyO1xuICAgICAgcmVzb2x2ZXI6IHN0cmluZztcbiAgICAgIHJlc29sdXRpb25fbm90ZXM6IHN0cmluZztcbiAgICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAgIHJlc29sdmVkX2F0OiBzdHJpbmc7XG4gICAgICBmdW5kaW5nX2RlYWRsaW5lOiBzdHJpbmc7XG4gICAgICBmdW5kZWRfYXQ6IHN0cmluZztcbiAgICB9Pih7XG4gICAgICBqc29uOiB0cnVlLFxuICAgICAgY29kZTogdGhpcy5jb250cmFjdCxcbiAgICAgIHNjb3BlOiB0aGlzLmNvbnRyYWN0LFxuICAgICAgdGFibGU6ICdjaGFsbGVuZ2VzJyxcbiAgICAgIGxvd2VyX2JvdW5kOiBTdHJpbmcoaWQpLFxuICAgICAgdXBwZXJfYm91bmQ6IFN0cmluZyhpZCksXG4gICAgICBsaW1pdDogMSxcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQucm93cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnBhcnNlQ2hhbGxlbmdlKHJlc3VsdC5yb3dzWzBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhbGxlbmdlcyBmb3IgYSB2YWxpZGF0aW9uXG4gICAqL1xuICBhc3luYyBnZXRDaGFsbGVuZ2VzRm9yVmFsaWRhdGlvbih2YWxpZGF0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8Q2hhbGxlbmdlW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJwYy5nZXRfdGFibGVfcm93czx7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgdmFsaWRhdGlvbl9pZDogc3RyaW5nO1xuICAgICAgY2hhbGxlbmdlcjogc3RyaW5nO1xuICAgICAgcmVhc29uOiBzdHJpbmc7XG4gICAgICBldmlkZW5jZV91cmk6IHN0cmluZztcbiAgICAgIHN0YWtlOiBzdHJpbmc7XG4gICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgIHJlc29sdmVyOiBzdHJpbmc7XG4gICAgICByZXNvbHV0aW9uX25vdGVzOiBzdHJpbmc7XG4gICAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgICByZXNvbHZlZF9hdDogc3RyaW5nO1xuICAgICAgZnVuZGluZ19kZWFkbGluZTogc3RyaW5nO1xuICAgICAgZnVuZGVkX2F0OiBzdHJpbmc7XG4gICAgfT4oe1xuICAgICAganNvbjogdHJ1ZSxcbiAgICAgIGNvZGU6IHRoaXMuY29udHJhY3QsXG4gICAgICBzY29wZTogdGhpcy5jb250cmFjdCxcbiAgICAgIHRhYmxlOiAnY2hhbGxlbmdlcycsXG4gICAgICBpbmRleF9wb3NpdGlvbjogMixcbiAgICAgIGtleV90eXBlOiAnaTY0JyxcbiAgICAgIGxpbWl0OiAxMDAsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJvd3NcbiAgICAgIC5maWx0ZXIoKHJvdykgPT4gcm93LnZhbGlkYXRpb25faWQgPT09IFN0cmluZyh2YWxpZGF0aW9uSWQpKVxuICAgICAgLm1hcCgocm93KSA9PiB0aGlzLnBhcnNlQ2hhbGxlbmdlKHJvdykpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT0gV1JJVEUgT1BFUkFUSU9OUyA9PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhcyBhIHZhbGlkYXRvclxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJWYWxpZGF0b3IoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgc3BlY2lhbGl6YXRpb25zOiBzdHJpbmdbXVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlU2Vzc2lvbigpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbiEubGluay50cmFuc2FjdCh7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiB0aGlzLmNvbnRyYWN0LFxuICAgICAgICAgIG5hbWU6ICdyZWd2YWwnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWN0b3I6IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICAgICAgcGVybWlzc2lvbjogdGhpcy5zZXNzaW9uIS5hdXRoLnBlcm1pc3Npb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgYWNjb3VudDogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgc3BlY2lhbGl6YXRpb25zOiBKU09OLnN0cmluZ2lmeShzcGVjaWFsaXphdGlvbnMpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB2YWxpZGF0b3IgaW5mb1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlVmFsaWRhdG9yKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHNwZWNpYWxpemF0aW9uczogc3RyaW5nW11cbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgICBuYW1lOiAndXBkYXRldmFsJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFjdG9yOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICAgIHBlcm1pc3Npb246IHRoaXMuc2Vzc2lvbiEuYXV0aC5wZXJtaXNzaW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGFjY291bnQ6IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uczogSlNPTi5zdHJpbmdpZnkoc3BlY2lhbGl6YXRpb25zKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFrZSBYUFIgYXMgdmFsaWRhdG9yXG4gICAqL1xuICBhc3luYyBzdGFrZShhbW91bnQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICB0aGlzLnJlcXVpcmVTZXNzaW9uKCk7XG5cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uIS5saW5rLnRyYW5zYWN0KHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFjY291bnQ6ICdlb3Npby50b2tlbicsXG4gICAgICAgICAgbmFtZTogJ3RyYW5zZmVyJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFjdG9yOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICAgIHBlcm1pc3Npb246IHRoaXMuc2Vzc2lvbiEuYXV0aC5wZXJtaXNzaW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGZyb206IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICAgIHRvOiB0aGlzLmNvbnRyYWN0LFxuICAgICAgICAgICAgcXVhbnRpdHk6IGFtb3VudCxcbiAgICAgICAgICAgIG1lbW86ICdzdGFrZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0IHZhbGlkYXRpb25cbiAgICovXG4gIGFzeW5jIHZhbGlkYXRlKGRhdGE6IFN1Ym1pdFZhbGlkYXRpb25EYXRhKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgICBuYW1lOiAndmFsaWRhdGUnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWN0b3I6IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICAgICAgcGVybWlzc2lvbjogdGhpcy5zZXNzaW9uIS5hdXRoLnBlcm1pc3Npb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgdmFsaWRhdG9yOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICBhZ2VudDogZGF0YS5hZ2VudCxcbiAgICAgICAgICAgIGpvYl9oYXNoOiBkYXRhLmpvYl9oYXNoLFxuICAgICAgICAgICAgcmVzdWx0OiB2YWxpZGF0aW9uUmVzdWx0VG9OdW1iZXIoZGF0YS5yZXN1bHQpLFxuICAgICAgICAgICAgY29uZmlkZW5jZTogZGF0YS5jb25maWRlbmNlLFxuICAgICAgICAgICAgZXZpZGVuY2VfdXJpOiBkYXRhLmV2aWRlbmNlX3VyaSB8fCAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFsbGVuZ2UgYSB2YWxpZGF0aW9uXG4gICAqL1xuICBhc3luYyBjaGFsbGVuZ2UoXG4gICAgdmFsaWRhdGlvbklkOiBudW1iZXIsXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICAgZXZpZGVuY2VVcmk/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgICBuYW1lOiAnY2hhbGxlbmdlJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFjdG9yOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICAgIHBlcm1pc3Npb246IHRoaXMuc2Vzc2lvbiEuYXV0aC5wZXJtaXNzaW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGNoYWxsZW5nZXI6IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICAgIHZhbGlkYXRpb25faWQ6IHZhbGlkYXRpb25JZCxcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgIGV2aWRlbmNlX3VyaTogZXZpZGVuY2VVcmkgfHwgJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3Rha2UgZm9yIGEgY2hhbGxlbmdlXG4gICAqL1xuICBhc3luYyBzdGFrZUNoYWxsZW5nZURlcG9zaXQoXG4gICAgY2hhbGxlbmdlSWQ6IG51bWJlcixcbiAgICBhbW91bnQ6IHN0cmluZ1xuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlU2Vzc2lvbigpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbiEubGluay50cmFuc2FjdCh7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiAnZW9zaW8udG9rZW4nLFxuICAgICAgICAgIG5hbWU6ICd0cmFuc2ZlcicsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3RvcjogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBmcm9tOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICB0bzogdGhpcy5jb250cmFjdCxcbiAgICAgICAgICAgIHF1YW50aXR5OiBhbW91bnQsXG4gICAgICAgICAgICBtZW1vOiBgY2hhbGxlbmdlOiR7Y2hhbGxlbmdlSWR9YCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdmFsaWRhdG9yIGFjdGl2ZSBzdGF0dXNcbiAgICovXG4gIGFzeW5jIHNldFZhbGlkYXRvclN0YXR1cyhhY3RpdmU6IGJvb2xlYW4pOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlU2Vzc2lvbigpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbiEubGluay50cmFuc2FjdCh7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiB0aGlzLmNvbnRyYWN0LFxuICAgICAgICAgIG5hbWU6ICdzZXR2YWxzdGF0JyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFjdG9yOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICAgIHBlcm1pc3Npb246IHRoaXMuc2Vzc2lvbiEuYXV0aC5wZXJtaXNzaW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGFjY291bnQ6IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICAgIGFjdGl2ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRvIHVuc3Rha2UgdmFsaWRhdG9yIGZ1bmRzICh0aW1lLWRlbGF5ZWQpLlxuICAgKiBNdXN0IGJlIGRlYWN0aXZhdGVkIGFuZCBoYXZlIG5vIHBlbmRpbmcgY2hhbGxlbmdlcyBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIGFtb3VudCAtIEFtb3VudCB0byB1bnN0YWtlIGluIHNtYWxsZXN0IHVuaXRzXG4gICAqL1xuICBhc3luYyB1bnN0YWtlKGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgICBuYW1lOiAndW5zdGFrZScsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3RvcjogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBhY2NvdW50OiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2l0aGRyYXcgdW5zdGFrZWQgdmFsaWRhdG9yIGZ1bmRzIChhZnRlciBkZWxheSBwZXJpb2QpXG4gICAqXG4gICAqIEBwYXJhbSB1bnN0YWtlSWQgLSBUaGUgSUQgb2YgdGhlIHVuc3Rha2UgcmVxdWVzdCB0byB3aXRoZHJhd1xuICAgKi9cbiAgYXN5bmMgd2l0aGRyYXcodW5zdGFrZUlkOiBudW1iZXIpOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlU2Vzc2lvbigpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbiEubGluay50cmFuc2FjdCh7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiB0aGlzLmNvbnRyYWN0LFxuICAgICAgICAgIG5hbWU6ICd3aXRoZHJhdycsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3RvcjogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBhY2NvdW50OiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICB1bnN0YWtlX2lkOiB1bnN0YWtlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGFuIHVuZnVuZGVkIGNoYWxsZW5nZSAod2l0aGluIGdyYWNlIHBlcmlvZCBvciBhZnRlciBkZWFkbGluZSlcbiAgICovXG4gIGFzeW5jIGNhbmNlbENoYWxsZW5nZShjaGFsbGVuZ2VJZDogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgICBuYW1lOiAnY2FuY2VsY2hhbCcsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3RvcjogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBjaGFsbGVuZ2VyOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgICBjaGFsbGVuZ2VfaWQ6IGNoYWxsZW5nZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSB2YWxpZGF0aW9uIGNoYWxsZW5nZSAob3duZXIgb25seSlcbiAgICovXG4gIGFzeW5jIHJlc29sdmUoXG4gICAgY2hhbGxlbmdlSWQ6IG51bWJlcixcbiAgICB1cGhlbGQ6IGJvb2xlYW4sXG4gICAgcmVzb2x1dGlvbk5vdGVzOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgICBuYW1lOiAncmVzb2x2ZScsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3RvcjogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICByZXNvbHZlcjogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgY2hhbGxlbmdlX2lkOiBjaGFsbGVuZ2VJZCxcbiAgICAgICAgICAgIHVwaGVsZCxcbiAgICAgICAgICAgIHJlc29sdXRpb25fbm90ZXM6IHJlc29sdXRpb25Ob3RlcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBpcmUgYW4gdW5mdW5kZWQgY2hhbGxlbmdlIChwZXJtaXNzaW9ubGVzcyBjbGVhbnVwKVxuICAgKi9cbiAgYXN5bmMgZXhwaXJlVW5mdW5kZWRDaGFsbGVuZ2UoY2hhbGxlbmdlSWQ6IG51bWJlcik6IFByb21pc2U8VHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICB0aGlzLnJlcXVpcmVTZXNzaW9uKCk7XG5cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uIS5saW5rLnRyYW5zYWN0KHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFjY291bnQ6IHRoaXMuY29udHJhY3QsXG4gICAgICAgICAgbmFtZTogJ2V4cGlyZXVuZnVuZCcsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3RvcjogdGhpcy5zZXNzaW9uIS5hdXRoLmFjdG9yLFxuICAgICAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBjaGFsbGVuZ2VfaWQ6IGNoYWxsZW5nZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGlyZSBhIGZ1bmRlZCBjaGFsbGVuZ2UgdGhhdCB3YXMgbm90IHJlc29sdmVkIHdpdGhpbiB0aW1lb3V0IChwZXJtaXNzaW9ubGVzcyBjbGVhbnVwKVxuICAgKi9cbiAgYXN5bmMgZXhwaXJlRnVuZGVkQ2hhbGxlbmdlKGNoYWxsZW5nZUlkOiBudW1iZXIpOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgdGhpcy5yZXF1aXJlU2Vzc2lvbigpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbiEubGluay50cmFuc2FjdCh7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiB0aGlzLmNvbnRyYWN0LFxuICAgICAgICAgIG5hbWU6ICdleHBpcmVmdW5kZWQnLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWN0b3I6IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICAgICAgcGVybWlzc2lvbjogdGhpcy5zZXNzaW9uIS5hdXRoLnBlcm1pc3Npb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgY2hhbGxlbmdlX2lkOiBjaGFsbGVuZ2VJZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXQgdmFsaWRhdGlvbiB3aXRoIGZlZSBpbiBvbmUgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVmFsaWRhdGlvbiBkYXRhXG4gICAqIEBwYXJhbSBhbW91bnQgLSBUaGUgdmFsaWRhdGlvbiBmZWUgKGUuZy4sIFwiMS4wMDAwIFhQUlwiKVxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVXaXRoRmVlKGRhdGE6IFN1Ym1pdFZhbGlkYXRpb25EYXRhLCBhbW91bnQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICB0aGlzLnJlcXVpcmVTZXNzaW9uKCk7XG5cbiAgICBjb25zdCBhY3RvciA9IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcjtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogJ2Vvc2lvLnRva2VuJyxcbiAgICAgICAgICBuYW1lOiAndHJhbnNmZXInLFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IFt7XG4gICAgICAgICAgICBhY3RvcixcbiAgICAgICAgICAgIHBlcm1pc3Npb246IHRoaXMuc2Vzc2lvbiEuYXV0aC5wZXJtaXNzaW9uLFxuICAgICAgICAgIH1dLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGZyb206IGFjdG9yLFxuICAgICAgICAgICAgdG86IHRoaXMuY29udHJhY3QsXG4gICAgICAgICAgICBxdWFudGl0eTogYW1vdW50LFxuICAgICAgICAgICAgbWVtbzogYHZhbGZlZToke2FjdG9yfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGFjY291bnQ6IHRoaXMuY29udHJhY3QsXG4gICAgICAgICAgbmFtZTogJ3ZhbGlkYXRlJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBbe1xuICAgICAgICAgICAgYWN0b3IsXG4gICAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB2YWxpZGF0b3I6IGFjdG9yLFxuICAgICAgICAgICAgYWdlbnQ6IGRhdGEuYWdlbnQsXG4gICAgICAgICAgICBqb2JfaGFzaDogZGF0YS5qb2JfaGFzaCxcbiAgICAgICAgICAgIHJlc3VsdDogdmFsaWRhdGlvblJlc3VsdFRvTnVtYmVyKGRhdGEucmVzdWx0KSxcbiAgICAgICAgICAgIGNvbmZpZGVuY2U6IGRhdGEuY29uZmlkZW5jZSxcbiAgICAgICAgICAgIGV2aWRlbmNlX3VyaTogZGF0YS5ldmlkZW5jZV91cmkgfHwgJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgb2xkIHZhbGlkYXRpb25zIChwZXJtaXNzaW9ubGVzcylcbiAgICovXG4gIGFzeW5jIGNsZWFuVmFsaWRhdGlvbnMoYWdlbnQ6IHN0cmluZywgbWF4QWdlOiBudW1iZXIsIG1heERlbGV0ZTogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW3tcbiAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgbmFtZTogJ2NsZWFudmFscycsXG4gICAgICAgIGF1dGhvcml6YXRpb246IFt7XG4gICAgICAgICAgYWN0b3I6IHRoaXMuc2Vzc2lvbiEuYXV0aC5hY3RvcixcbiAgICAgICAgICBwZXJtaXNzaW9uOiB0aGlzLnNlc3Npb24hLmF1dGgucGVybWlzc2lvbixcbiAgICAgICAgfV0sXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICBtYXhfYWdlOiBtYXhBZ2UsXG4gICAgICAgICAgbWF4X2RlbGV0ZTogbWF4RGVsZXRlLFxuICAgICAgICB9LFxuICAgICAgfV0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgcmVzb2x2ZWQgY2hhbGxlbmdlcyAocGVybWlzc2lvbmxlc3MpXG4gICAqL1xuICBhc3luYyBjbGVhbkNoYWxsZW5nZXMobWF4QWdlOiBudW1iZXIsIG1heERlbGV0ZTogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZVNlc3Npb24oKTtcblxuICAgIHJldHVybiB0aGlzLnNlc3Npb24hLmxpbmsudHJhbnNhY3Qoe1xuICAgICAgYWN0aW9uczogW3tcbiAgICAgICAgYWNjb3VudDogdGhpcy5jb250cmFjdCxcbiAgICAgICAgbmFtZTogJ2NsZWFuY2hhbHMnLFxuICAgICAgICBhdXRob3JpemF0aW9uOiBbe1xuICAgICAgICAgIGFjdG9yOiB0aGlzLnNlc3Npb24hLmF1dGguYWN0b3IsXG4gICAgICAgICAgcGVybWlzc2lvbjogdGhpcy5zZXNzaW9uIS5hdXRoLnBlcm1pc3Npb24sXG4gICAgICAgIH1dLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgbWF4X2FnZTogbWF4QWdlLFxuICAgICAgICAgIG1heF9kZWxldGU6IG1heERlbGV0ZSxcbiAgICAgICAgfSxcbiAgICAgIH1dLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB2YWxpZGF0aW9uIGNvbnRyYWN0IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPFZhbGlkYXRpb25Db25maWc+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJwYy5nZXRfdGFibGVfcm93czx7XG4gICAgICBvd25lcjogc3RyaW5nO1xuICAgICAgY29yZV9jb250cmFjdDogc3RyaW5nO1xuICAgICAgbWluX3N0YWtlOiBzdHJpbmc7XG4gICAgICBjaGFsbGVuZ2Vfc3Rha2U6IHN0cmluZztcbiAgICAgIHVuc3Rha2VfZGVsYXk6IHN0cmluZztcbiAgICAgIGNoYWxsZW5nZV93aW5kb3c6IHN0cmluZztcbiAgICAgIHNsYXNoX3BlcmNlbnQ6IHN0cmluZztcbiAgICAgIGRpc3B1dGVfcGVyaW9kOiBzdHJpbmc7XG4gICAgICBmdW5kZWRfY2hhbGxlbmdlX3RpbWVvdXQ6IHN0cmluZztcbiAgICAgIHBhdXNlZDogbnVtYmVyO1xuICAgICAgdmFsaWRhdGlvbl9mZWU6IHN0cmluZztcbiAgICB9Pih7XG4gICAgICBqc29uOiB0cnVlLFxuICAgICAgY29kZTogdGhpcy5jb250cmFjdCxcbiAgICAgIHNjb3BlOiB0aGlzLmNvbnRyYWN0LFxuICAgICAgdGFibGU6ICdjb25maWcnLFxuICAgICAgbGltaXQ6IDEsXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0LnJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRyYWN0IG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvdyA9IHJlc3VsdC5yb3dzWzBdO1xuICAgIHJldHVybiB7XG4gICAgICBvd25lcjogcm93Lm93bmVyLFxuICAgICAgY29yZV9jb250cmFjdDogcm93LmNvcmVfY29udHJhY3QsXG4gICAgICBtaW5fc3Rha2U6IHNhZmVQYXJzZUludChyb3cubWluX3N0YWtlKSxcbiAgICAgIGNoYWxsZW5nZV9zdGFrZTogc2FmZVBhcnNlSW50KHJvdy5jaGFsbGVuZ2Vfc3Rha2UpLFxuICAgICAgdW5zdGFrZV9kZWxheTogc2FmZVBhcnNlSW50KHJvdy51bnN0YWtlX2RlbGF5KSxcbiAgICAgIGNoYWxsZW5nZV93aW5kb3c6IHNhZmVQYXJzZUludChyb3cuY2hhbGxlbmdlX3dpbmRvdyksXG4gICAgICBzbGFzaF9wZXJjZW50OiBzYWZlUGFyc2VJbnQocm93LnNsYXNoX3BlcmNlbnQpLFxuICAgICAgZGlzcHV0ZV9wZXJpb2Q6IHNhZmVQYXJzZUludChyb3cuZGlzcHV0ZV9wZXJpb2QpLFxuICAgICAgZnVuZGVkX2NoYWxsZW5nZV90aW1lb3V0OiBzYWZlUGFyc2VJbnQocm93LmZ1bmRlZF9jaGFsbGVuZ2VfdGltZW91dCksXG4gICAgICBwYXVzZWQ6IHJvdy5wYXVzZWQgPT09IDEsXG4gICAgICB2YWxpZGF0aW9uX2ZlZTogc2FmZVBhcnNlSW50KHJvdy52YWxpZGF0aW9uX2ZlZSksXG4gICAgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09IEhFTFBFUlMgPT09PT09PT09PT09PT1cblxuICBwcml2YXRlIHJlcXVpcmVTZXNzaW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZXNzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nlc3Npb24gcmVxdWlyZWQgZm9yIHdyaXRlIG9wZXJhdGlvbnMnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlVmFsaWRhdG9yKHJhdzogVmFsaWRhdG9yUmF3KTogVmFsaWRhdG9yIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudDogcmF3LmFjY291bnQsXG4gICAgICBzdGFrZTogc2FmZVBhcnNlSW50KHJhdy5zdGFrZSksXG4gICAgICBtZXRob2Q6IHJhdy5tZXRob2QsXG4gICAgICBzcGVjaWFsaXphdGlvbnM6IHBhcnNlU3BlY2lhbGl6YXRpb25zKHJhdy5zcGVjaWFsaXphdGlvbnMpLFxuICAgICAgdG90YWxfdmFsaWRhdGlvbnM6IHNhZmVQYXJzZUludChyYXcudG90YWxfdmFsaWRhdGlvbnMpLFxuICAgICAgaW5jb3JyZWN0X3ZhbGlkYXRpb25zOiBzYWZlUGFyc2VJbnQocmF3LmluY29ycmVjdF92YWxpZGF0aW9ucyksXG4gICAgICBhY2N1cmFjeV9zY29yZTogc2FmZVBhcnNlSW50KHJhdy5hY2N1cmFjeV9zY29yZSksXG4gICAgICBwZW5kaW5nX2NoYWxsZW5nZXM6IHNhZmVQYXJzZUludChyYXcucGVuZGluZ19jaGFsbGVuZ2VzKSxcbiAgICAgIHJlZ2lzdGVyZWRfYXQ6IHNhZmVQYXJzZUludChyYXcucmVnaXN0ZXJlZF9hdCksXG4gICAgICBhY3RpdmU6IHJhdy5hY3RpdmUgPT09IDEsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VWYWxpZGF0aW9uKHJhdzogVmFsaWRhdGlvblJhdyk6IFZhbGlkYXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogc2FmZVBhcnNlSW50KHJhdy5pZCksXG4gICAgICB2YWxpZGF0b3I6IHJhdy52YWxpZGF0b3IsXG4gICAgICBhZ2VudDogcmF3LmFnZW50LFxuICAgICAgam9iX2hhc2g6IHJhdy5qb2JfaGFzaCxcbiAgICAgIHJlc3VsdDogdmFsaWRhdGlvblJlc3VsdEZyb21OdW1iZXIocmF3LnJlc3VsdCksXG4gICAgICBjb25maWRlbmNlOiByYXcuY29uZmlkZW5jZSxcbiAgICAgIGV2aWRlbmNlX3VyaTogcmF3LmV2aWRlbmNlX3VyaSxcbiAgICAgIGNoYWxsZW5nZWQ6IHJhdy5jaGFsbGVuZ2VkID09PSAxLFxuICAgICAgdGltZXN0YW1wOiBzYWZlUGFyc2VJbnQocmF3LnRpbWVzdGFtcCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VDaGFsbGVuZ2UocmF3OiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB2YWxpZGF0aW9uX2lkOiBzdHJpbmc7XG4gICAgY2hhbGxlbmdlcjogc3RyaW5nO1xuICAgIHJlYXNvbjogc3RyaW5nO1xuICAgIGV2aWRlbmNlX3VyaTogc3RyaW5nO1xuICAgIHN0YWtlOiBzdHJpbmc7XG4gICAgc3RhdHVzOiBudW1iZXI7XG4gICAgcmVzb2x2ZXI6IHN0cmluZztcbiAgICByZXNvbHV0aW9uX25vdGVzOiBzdHJpbmc7XG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIHJlc29sdmVkX2F0OiBzdHJpbmc7XG4gICAgZnVuZGluZ19kZWFkbGluZTogc3RyaW5nO1xuICAgIGZ1bmRlZF9hdDogc3RyaW5nO1xuICB9KTogQ2hhbGxlbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHNhZmVQYXJzZUludChyYXcuaWQpLFxuICAgICAgdmFsaWRhdGlvbl9pZDogc2FmZVBhcnNlSW50KHJhdy52YWxpZGF0aW9uX2lkKSxcbiAgICAgIGNoYWxsZW5nZXI6IHJhdy5jaGFsbGVuZ2VyLFxuICAgICAgcmVhc29uOiByYXcucmVhc29uLFxuICAgICAgZXZpZGVuY2VfdXJpOiByYXcuZXZpZGVuY2VfdXJpLFxuICAgICAgc3Rha2U6IHNhZmVQYXJzZUludChyYXcuc3Rha2UpLFxuICAgICAgc3RhdHVzOiBkaXNwdXRlU3RhdHVzRnJvbU51bWJlcihyYXcuc3RhdHVzKSxcbiAgICAgIHJlc29sdmVyOiByYXcucmVzb2x2ZXIsXG4gICAgICByZXNvbHV0aW9uX25vdGVzOiByYXcucmVzb2x1dGlvbl9ub3RlcyxcbiAgICAgIGNyZWF0ZWRfYXQ6IHNhZmVQYXJzZUludChyYXcuY3JlYXRlZF9hdCksXG4gICAgICByZXNvbHZlZF9hdDogc2FmZVBhcnNlSW50KHJhdy5yZXNvbHZlZF9hdCksXG4gICAgICBmdW5kaW5nX2RlYWRsaW5lOiBzYWZlUGFyc2VJbnQocmF3LmZ1bmRpbmdfZGVhZGxpbmUpLFxuICAgICAgZnVuZGVkX2F0OiBzYWZlUGFyc2VJbnQocmF3LmZ1bmRlZF9hdCksXG4gICAgfTtcbiAgfVxufVxuIl19
|