@bitgo/sdk-coin-iota 1.5.0 → 1.6.1
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/dist/src/iota.d.ts +123 -27
- package/dist/src/iota.d.ts.map +1 -1
- package/dist/src/iota.js +219 -99
- package/dist/src/lib/constants.d.ts +50 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +68 -4
- package/dist/src/lib/iface.d.ts +143 -3
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/keyPair.d.ts +100 -6
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +103 -10
- package/dist/src/lib/transaction.d.ts +124 -15
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +215 -66
- package/dist/src/lib/transactionBuilder.d.ts +73 -34
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +90 -45
- package/dist/src/lib/transactionBuilderFactory.d.ts +89 -6
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +108 -16
- package/dist/src/lib/transferBuilder.d.ts +43 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +50 -5
- package/dist/src/lib/transferTransaction.d.ts +97 -1
- package/dist/src/lib/transferTransaction.d.ts.map +1 -1
- package/dist/src/lib/transferTransaction.js +223 -52
- package/dist/src/lib/utils.d.ts +108 -8
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +140 -21
- package/dist/test/resources/iota.d.ts +12 -0
- package/dist/test/resources/iota.d.ts.map +1 -1
- package/dist/test/resources/iota.js +21 -2
- package/dist/test/unit/helpers/testHelpers.d.ts +57 -0
- package/dist/test/unit/helpers/testHelpers.d.ts.map +1 -0
- package/dist/test/unit/helpers/testHelpers.js +176 -0
- package/dist/test/unit/iota.js +81 -158
- package/dist/test/unit/keyPair.js +34 -61
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +137 -255
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +43 -107
- package/dist/test/unit/transactionBuilder/transferBuilder.js +361 -234
- package/dist/test/unit/transferTransaction.js +147 -275
- package/dist/test/unit/utils.js +177 -167
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -68,12 +68,33 @@ class TransferTransaction extends transaction_1.Transaction {
|
|
|
68
68
|
this.paymentObjects = txData.paymentObjects;
|
|
69
69
|
this.updateIsSimulateTx();
|
|
70
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Parses a transfer transaction from its broadcast format (base64 or raw bytes).
|
|
73
|
+
* Extracts recipients, amounts, and payment objects from the transaction data.
|
|
74
|
+
*/
|
|
71
75
|
parseFromBroadcastTx(tx) {
|
|
72
76
|
const txData = transactions_1.Transaction.from(tx).getData();
|
|
73
|
-
|
|
77
|
+
this.validateTransferCommands(txData);
|
|
78
|
+
super.parseFromBroadcastTx(tx);
|
|
79
|
+
const { inputObjects, amounts, receivers } = this.parseTransactionInputs(txData);
|
|
80
|
+
this.validateAmountsMatchReceivers(amounts, receivers);
|
|
81
|
+
this.assignParsedObjects(inputObjects);
|
|
82
|
+
this.assignRecipients(receivers, amounts);
|
|
83
|
+
this.updateIsSimulateTx();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Validates that the transaction only contains supported transfer commands.
|
|
87
|
+
*/
|
|
88
|
+
validateTransferCommands(txData) {
|
|
89
|
+
const hasUnsupportedCommands = txData.commands.some((command) => !constants_1.TRANSFER_TRANSACTION_COMMANDS.includes(command.$kind));
|
|
90
|
+
if (hasUnsupportedCommands) {
|
|
74
91
|
throw new sdk_core_1.InvalidTransactionError('Unsupported commands in the transaction');
|
|
75
92
|
}
|
|
76
|
-
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Parses transaction inputs to extract objects, amounts, and receiver addresses.
|
|
96
|
+
*/
|
|
97
|
+
parseTransactionInputs(txData) {
|
|
77
98
|
const inputObjects = [];
|
|
78
99
|
const amounts = [];
|
|
79
100
|
const receivers = [];
|
|
@@ -92,82 +113,232 @@ class TransferTransaction extends transaction_1.Transaction {
|
|
|
92
113
|
}
|
|
93
114
|
}
|
|
94
115
|
});
|
|
116
|
+
return { inputObjects, amounts, receivers };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Validates that the number of amounts matches the number of receivers.
|
|
120
|
+
*/
|
|
121
|
+
validateAmountsMatchReceivers(amounts, receivers) {
|
|
95
122
|
if (amounts.length !== receivers.length) {
|
|
96
|
-
throw new sdk_core_1.InvalidTransactionError('
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
123
|
+
throw new sdk_core_1.InvalidTransactionError('Count of amounts does not match count of receivers');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Assigns parsed input objects to either gas payment objects or payment objects.
|
|
128
|
+
* If no gas objects exist and sender pays own gas, objects become gas objects.
|
|
129
|
+
* Otherwise, they become payment objects.
|
|
130
|
+
*/
|
|
131
|
+
assignParsedObjects(inputObjects) {
|
|
132
|
+
if (inputObjects.length === 0) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const noGasObjectsExist = !this.gasPaymentObjects || this.gasPaymentObjects.length === 0;
|
|
136
|
+
const senderPaysOwnGas = !this.gasSponsor || this.sender === this.gasSponsor;
|
|
137
|
+
if (noGasObjectsExist && senderPaysOwnGas) {
|
|
138
|
+
this.gasPaymentObjects = inputObjects;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
this._paymentObjects = inputObjects;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Creates and assigns recipients from parsed addresses and amounts.
|
|
146
|
+
*/
|
|
147
|
+
assignRecipients(receivers, amounts) {
|
|
148
|
+
this._recipients = receivers.map((address, index) => ({
|
|
149
|
+
address,
|
|
150
|
+
amount: amounts[index],
|
|
151
|
+
}));
|
|
107
152
|
}
|
|
108
153
|
messageWithIntent(message) {
|
|
109
154
|
return (0, cryptography_1.messageWithIntent)('TransactionData', message);
|
|
110
155
|
}
|
|
156
|
+
/**
|
|
157
|
+
* Populates the IOTA transaction with inputs and commands for the transfer.
|
|
158
|
+
* This determines which objects to use for payment (either payment objects or gas objects),
|
|
159
|
+
* consolidates them into a single coin, and then splits/transfers to recipients.
|
|
160
|
+
*/
|
|
111
161
|
populateTxInputsAndCommands() {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
162
|
+
const sourceCoin = this.getConsolidatedSourceCoin();
|
|
163
|
+
this.splitAndTransferToRecipients(sourceCoin);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Determines which objects to use as the payment source and consolidates them.
|
|
167
|
+
* If payment objects are provided, use those. Otherwise, if the sender is paying
|
|
168
|
+
* their own gas, use the gas objects for payment.
|
|
169
|
+
*/
|
|
170
|
+
getConsolidatedSourceCoin() {
|
|
171
|
+
if (this.hasPaymentObjects()) {
|
|
172
|
+
return this.consolidatePaymentObjects();
|
|
173
|
+
}
|
|
174
|
+
return this.consolidateGasObjects();
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Checks if payment objects exist and if gas objects should be used instead.
|
|
178
|
+
* Gas objects are used when: no payment objects exist AND sender pays their own gas.
|
|
179
|
+
*/
|
|
180
|
+
hasPaymentObjects() {
|
|
181
|
+
const hasPaymentObjects = this.paymentObjects && this.paymentObjects.length > 0;
|
|
182
|
+
if (hasPaymentObjects) {
|
|
183
|
+
return true;
|
|
127
184
|
}
|
|
185
|
+
// If no payment objects, only use gas objects if sender pays own gas
|
|
186
|
+
const senderPaysOwnGas = !this.gasSponsor || this.gasSponsor === this.sender;
|
|
187
|
+
return !senderPaysOwnGas;
|
|
128
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* Consolidates payment objects into a single coin object.
|
|
191
|
+
* If multiple payment objects exist, they are merged in batches.
|
|
192
|
+
*/
|
|
193
|
+
consolidatePaymentObjects() {
|
|
194
|
+
if (!this.paymentObjects || this.paymentObjects.length === 0) {
|
|
195
|
+
throw new sdk_core_1.InvalidTransactionError('Payment objects are required');
|
|
196
|
+
}
|
|
197
|
+
const firstObject = this._iotaTransaction.object(transactions_1.Inputs.ObjectRef(this.paymentObjects[0]));
|
|
198
|
+
// Single object doesn't need consolidation
|
|
199
|
+
if (this.paymentObjects.length === 1) {
|
|
200
|
+
return firstObject;
|
|
201
|
+
}
|
|
202
|
+
// Merge remaining objects into the first one
|
|
203
|
+
return this.mergeObjectsInBatches(firstObject, this.paymentObjects.slice(1), constants_1.MAX_INPUT_OBJECTS);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Consolidates gas payment objects into a single coin object.
|
|
207
|
+
* If the number of gas objects exceeds the maximum, they are merged in batches.
|
|
208
|
+
*/
|
|
209
|
+
consolidateGasObjects() {
|
|
210
|
+
if (!this.gasPaymentObjects || this.gasPaymentObjects.length === 0) {
|
|
211
|
+
throw new sdk_core_1.InvalidTransactionError('Gas payment objects are required');
|
|
212
|
+
}
|
|
213
|
+
const gasObject = this._iotaTransaction.gas;
|
|
214
|
+
// If within the limit, no consolidation needed
|
|
215
|
+
if (this.gasPaymentObjects.length <= constants_1.MAX_GAS_PAYMENT_OBJECTS) {
|
|
216
|
+
return gasObject;
|
|
217
|
+
}
|
|
218
|
+
// Merge excess gas objects to stay within limits
|
|
219
|
+
return this.mergeObjectsInBatches(gasObject, this.gasPaymentObjects, constants_1.MAX_INPUT_OBJECTS);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Merges multiple coin objects into a target coin in batches.
|
|
223
|
+
* This is necessary because IOTA has limits on the number of objects per merge command.
|
|
224
|
+
*
|
|
225
|
+
* @param targetCoin - The coin to merge into
|
|
226
|
+
* @param objectsToMerge - Array of objects to merge
|
|
227
|
+
* @param batchSize - Maximum number of objects to merge per batch
|
|
228
|
+
* @returns The consolidated coin object
|
|
229
|
+
*/
|
|
230
|
+
mergeObjectsInBatches(targetCoin, objectsToMerge, batchSize) {
|
|
231
|
+
let consolidatedCoin = targetCoin;
|
|
232
|
+
for (let startIndex = 0; startIndex < objectsToMerge.length; startIndex += batchSize) {
|
|
233
|
+
const batch = objectsToMerge.slice(startIndex, startIndex + batchSize);
|
|
234
|
+
const batchAsTransactionObjects = batch.map((obj) => this._iotaTransaction.object(transactions_1.Inputs.ObjectRef(obj)));
|
|
235
|
+
[consolidatedCoin] = this._iotaTransaction.mergeCoins(consolidatedCoin, batchAsTransactionObjects);
|
|
236
|
+
}
|
|
237
|
+
return consolidatedCoin;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Splits the source coin into the amounts needed for each recipient and transfers them.
|
|
241
|
+
* This creates split coin commands for all recipient amounts, then transfer commands
|
|
242
|
+
* to send each split coin to the corresponding recipient.
|
|
243
|
+
*/
|
|
244
|
+
splitAndTransferToRecipients(sourceCoin) {
|
|
245
|
+
const recipientAmounts = this._recipients.map((recipient) => recipient.amount);
|
|
246
|
+
const splitCoins = this._iotaTransaction.splitCoins(sourceCoin, recipientAmounts);
|
|
247
|
+
this._recipients.forEach((recipient, index) => {
|
|
248
|
+
this._iotaTransaction.transferObjects([splitCoins[index]], recipient.address);
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Validates all transfer transaction data before building.
|
|
253
|
+
* Checks recipients, payment objects, and ensures no duplicate object IDs.
|
|
254
|
+
*/
|
|
129
255
|
validateTxDataImplementation() {
|
|
130
|
-
|
|
256
|
+
this.validateRecipientsList();
|
|
257
|
+
this.validatePaymentObjectsExist();
|
|
258
|
+
this.validateNoDuplicateObjects();
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Validates that recipients exist and don't exceed the maximum allowed.
|
|
262
|
+
*/
|
|
263
|
+
validateRecipientsList() {
|
|
264
|
+
if (!this.recipients || this.recipients.length === 0) {
|
|
131
265
|
throw new sdk_core_1.InvalidTransactionError('Transaction recipients are required');
|
|
132
266
|
}
|
|
133
267
|
if (this.recipients.length > constants_1.MAX_RECIPIENTS) {
|
|
134
268
|
throw new sdk_core_1.InvalidTransactionError(`Recipients count (${this.recipients.length}) exceeds maximum allowed (${constants_1.MAX_RECIPIENTS})`);
|
|
135
269
|
}
|
|
136
|
-
|
|
137
|
-
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Validates that either payment objects or gas objects exist for funding the transfer.
|
|
273
|
+
* When a gas sponsor is used, payment objects are required.
|
|
274
|
+
* Otherwise, either payment objects or gas objects can be used.
|
|
275
|
+
*/
|
|
276
|
+
validatePaymentObjectsExist() {
|
|
277
|
+
const hasPaymentObjects = this.paymentObjects && this.paymentObjects.length > 0;
|
|
278
|
+
if (hasPaymentObjects) {
|
|
279
|
+
return; // Payment objects exist, validation passes
|
|
138
280
|
}
|
|
139
|
-
//
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
281
|
+
// No payment objects - check if gas objects can be used instead
|
|
282
|
+
const hasGasSponsor = this.gasSponsor && this.gasSponsor !== this.sender;
|
|
283
|
+
if (hasGasSponsor) {
|
|
284
|
+
throw new sdk_core_1.InvalidTransactionError('Payment objects are required when using a gas sponsor');
|
|
285
|
+
}
|
|
286
|
+
// No gas sponsor - gas objects must exist
|
|
287
|
+
const hasGasObjects = this.gasPaymentObjects && this.gasPaymentObjects.length > 0;
|
|
288
|
+
if (!hasGasObjects) {
|
|
289
|
+
throw new sdk_core_1.InvalidTransactionError('Payment or Gas objects are required');
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Validates that there are no duplicate object IDs within payment objects,
|
|
294
|
+
* gas payment objects, or between the two groups.
|
|
295
|
+
*/
|
|
296
|
+
validateNoDuplicateObjects() {
|
|
297
|
+
const paymentObjectIds = this.paymentObjects?.map((obj) => obj.objectId) ?? [];
|
|
298
|
+
// Check for duplicates within payment objects
|
|
299
|
+
this.checkForDuplicateIds(paymentObjectIds, 'payment objects');
|
|
300
|
+
if (!this.gasPaymentObjects || this.gasPaymentObjects.length === 0) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
const gasObjectIds = this.gasPaymentObjects.map((gas) => gas.objectId);
|
|
304
|
+
// Check for duplicates within gas payment objects
|
|
305
|
+
this.checkForDuplicateIds(gasObjectIds, 'gas payment objects');
|
|
306
|
+
// Check for overlaps between payment and gas objects
|
|
307
|
+
const overlappingIds = paymentObjectIds.filter((id) => gasObjectIds.includes(id));
|
|
308
|
+
if (overlappingIds.length > 0) {
|
|
309
|
+
throw new sdk_core_1.InvalidTransactionError('Payment objects cannot be the same as gas payment objects: ' + overlappingIds.join(', '));
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Helper to check for duplicate IDs in an array.
|
|
314
|
+
*/
|
|
315
|
+
checkForDuplicateIds(ids, objectType) {
|
|
316
|
+
const uniqueIds = new Set(ids);
|
|
317
|
+
if (uniqueIds.size !== ids.length) {
|
|
318
|
+
throw new sdk_core_1.InvalidTransactionError(`Duplicate object IDs found in ${objectType}`);
|
|
156
319
|
}
|
|
157
320
|
}
|
|
158
321
|
/**
|
|
159
322
|
* @inheritDoc
|
|
323
|
+
* Provides a human-readable explanation of the transfer transaction.
|
|
160
324
|
*/
|
|
161
|
-
explainTransactionImplementation(
|
|
325
|
+
explainTransactionImplementation(_json, explanationResult) {
|
|
162
326
|
const outputs = this.recipients.map((recipient) => recipient);
|
|
163
|
-
const
|
|
164
|
-
const outputAmount = outputAmountBN.toString();
|
|
327
|
+
const outputAmount = this.calculateTotalOutputAmount();
|
|
165
328
|
return {
|
|
166
329
|
...explanationResult,
|
|
167
330
|
outputAmount,
|
|
168
331
|
outputs,
|
|
169
332
|
};
|
|
170
333
|
}
|
|
334
|
+
/**
|
|
335
|
+
* Calculates the total amount being transferred to all recipients.
|
|
336
|
+
*/
|
|
337
|
+
calculateTotalOutputAmount() {
|
|
338
|
+
return this.recipients
|
|
339
|
+
.reduce((accumulator, current) => accumulator.plus(current.amount), new bignumber_js_1.default(0))
|
|
340
|
+
.toString();
|
|
341
|
+
}
|
|
171
342
|
}
|
|
172
343
|
exports.TransferTransaction = TransferTransaction;
|
|
173
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNmZXJUcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4Q0FBd0c7QUFFeEcsK0NBQTRDO0FBRTVDLDhEQUlxQztBQUNyQyxnREFBa0Q7QUFDbEQsOERBQXlGO0FBQ3pGLG1DQUFzQztBQUN0QywyQ0FBK0Y7QUFDL0Ysb0RBQTRCO0FBQzVCLGdFQUFxQztBQUVyQyxNQUFhLG1CQUFvQixTQUFRLHlCQUFXO0lBSWxELFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsMEJBQWUsQ0FBQyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsS0FBNkI7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxjQUFjLENBQUMsS0FBMkM7UUFDNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxX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QixDQUFDLG1EQUFtRCxDQUFDLENBQUM7WUFDekYsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxJQUFJLGtDQUF1QixDQUMvQiw2REFBNkQsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM3RyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxnQ0FBZ0MsQ0FDeEMsSUFBWSxFQUNaLGlCQUF5QztRQUV6QyxNQUFNLE9BQU8sR0FBMkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUMzQyxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUMxRCxJQUFJLHNCQUFTLENBQUMsQ0FBQyxDQUFDLENBQ2pCLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFL0MsT0FBTztZQUNMLEdBQUcsaUJBQWlCO1lBQ3BCLFlBQVk7WUFDWixPQUFPO1NBQ1IsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQW5NRCxrREFtTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciwgdG9IZXgsIFRyYW5zYWN0aW9uUmVjaXBpZW50LCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBUcmFuc2FjdGlvbk9iamVjdElucHV0LCBUcmFuc2ZlclR4RGF0YSwgVHhEYXRhIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQge1xuICBJbnB1dHMgYXMgSW90YUlucHV0cyxcbiAgVHJhbnNhY3Rpb25PYmplY3RBcmd1bWVudCxcbiAgVHJhbnNhY3Rpb24gYXMgSW90YVRyYW5zYWN0aW9uLFxufSBmcm9tICdAaW90YS9pb3RhLXNkay90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgZnJvbUJhc2U2NCB9IGZyb20gJ0Bpb3RhL2lvdGEtc2RrL3V0aWxzJztcbmltcG9ydCB7IG1lc3NhZ2VXaXRoSW50ZW50IGFzIGlvdGFNZXNzYWdlV2l0aEludGVudCB9IGZyb20gJ0Bpb3RhL2lvdGEtc2RrL2NyeXB0b2dyYXBoeSc7XG5pbXBvcnQgeyBCY3NSZWFkZXIgfSBmcm9tICdAaW90YS9iY3MnO1xuaW1wb3J0IHsgTUFYX0lOUFVUX09CSkVDVFMsIE1BWF9SRUNJUElFTlRTLCBUUkFOU0ZFUl9UUkFOU0FDVElPTl9DT01NQU5EUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zZmVyVHJhbnNhY3Rpb24gZXh0ZW5kcyBUcmFuc2FjdGlvbiB7XG4gIHByaXZhdGUgX3JlY2lwaWVudHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W107XG4gIHByaXZhdGUgX3BheW1lbnRPYmplY3RzPzogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdO1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fdHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgIHRoaXMuX2lucHV0cyA9IFtdO1xuICAgIHRoaXMuX291dHB1dHMgPSBbXTtcbiAgfVxuXG4gIGdldCByZWNpcGllbnRzKCk6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10ge1xuICAgIHJldHVybiB0aGlzLl9yZWNpcGllbnRzO1xuICB9XG5cbiAgc2V0IHJlY2lwaWVudHModmFsdWU6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10pIHtcbiAgICB0aGlzLl9yZWNpcGllbnRzID0gdmFsdWU7XG4gICAgdGhpcy5fcmVidWlsZFJlcXVpcmVkID0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBwYXltZW50T2JqZWN0cygpOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYXltZW50T2JqZWN0cztcbiAgfVxuXG4gIHNldCBwYXltZW50T2JqZWN0cyh2YWx1ZTogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcGF5bWVudE9iamVjdHMgPSB2YWx1ZTtcbiAgICB0aGlzLl9yZWJ1aWxkUmVxdWlyZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBhZGRJbnB1dHNBbmRPdXRwdXRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faW90YVRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRvdGFsQW1vdW50ID0gdGhpcy5yZWNpcGllbnRzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGFjY3VtdWxhdG9yICsgTnVtYmVyKGN1cnJlbnQuYW1vdW50KSwgMCk7XG4gICAgdGhpcy5fb3V0cHV0cyA9IHRoaXMucmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCwgaW5kZXgpID0+ICh7XG4gICAgICBhZGRyZXNzOiByZWNpcGllbnQuYWRkcmVzcyxcbiAgICAgIHZhbHVlOiByZWNpcGllbnQuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgfSkpO1xuICAgIHRoaXMuX2lucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdGhpcy5zZW5kZXIsXG4gICAgICAgIHZhbHVlOiB0b3RhbEFtb3VudC50b1N0cmluZygpLFxuICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICB0b0pzb24oKTogVHJhbnNmZXJUeERhdGEge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci50b0pzb24oKSxcbiAgICAgIHJlY2lwaWVudHM6IHRoaXMucmVjaXBpZW50cyxcbiAgICAgIHBheW1lbnRPYmplY3RzOiB0aGlzLnBheW1lbnRPYmplY3RzLFxuICAgIH07XG4gIH1cblxuICBwYXJzZUZyb21KU09OKHR4RGF0YTogVHJhbnNmZXJUeERhdGEpOiB2b2lkIHtcbiAgICBzdXBlci5wYXJzZUZyb21KU09OKHR4RGF0YSk7XG4gICAgdGhpcy5yZWNpcGllbnRzID0gdHhEYXRhLnJlY2lwaWVudHM7XG4gICAgdGhpcy5wYXltZW50T2JqZWN0cyA9IHR4RGF0YS5wYXltZW50T2JqZWN0cztcbiAgICB0aGlzLnVwZGF0ZUlzU2ltdWxhdGVUeCgpO1xuICB9XG5cbiAgcGFyc2VGcm9tQnJvYWRjYXN0VHgodHg6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiB2b2lkIHtcbiAgICBjb25zdCB0eERhdGEgPSBJb3RhVHJhbnNhY3Rpb24uZnJvbSh0eCkuZ2V0RGF0YSgpO1xuICAgIGlmICh0eERhdGEuY29tbWFuZHMuZmlsdGVyKChjb21tYW5kKSA9PiAhVFJBTlNGRVJfVFJBTlNBQ1RJT05fQ09NTUFORFMuaW5jbHVkZXMoY29tbWFuZC4ka2luZCkpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVW5zdXBwb3J0ZWQgY29tbWFuZHMgaW4gdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHN1cGVyLnBhcnNlRnJvbUJyb2FkY2FzdFR4KHR4KTtcbiAgICBjb25zdCBpbnB1dE9iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IGFtb3VudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVjZWl2ZXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHR4RGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChpbnB1dC4ka2luZCA9PT0gJ09iamVjdCcgJiYgJ0ltbU9yT3duZWRPYmplY3QnIGluIGlucHV0Lk9iamVjdCkge1xuICAgICAgICBpbnB1dE9iamVjdHMucHVzaChpbnB1dC5PYmplY3QuSW1tT3JPd25lZE9iamVjdCBhcyBUcmFuc2FjdGlvbk9iamVjdElucHV0KTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnB1dC4ka2luZCA9PT0gJ1B1cmUnICYmICdieXRlcycgaW4gaW5wdXQuUHVyZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGZyb21CYXNlNjQoaW5wdXQuUHVyZS5ieXRlcyk7XG4gICAgICAgIGNvbnN0IGhleFZhbHVlID0gJzB4JyArIHRvSGV4KHZhbHVlKTtcbiAgICAgICAgaWYgKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGhleFZhbHVlKSkge1xuICAgICAgICAgIHJlY2VpdmVycy5wdXNoKGhleFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhbW91bnRzLnB1c2gobmV3IEJjc1JlYWRlcih2YWx1ZSkucmVhZDY0KCkudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoYW1vdW50cy5sZW5ndGggIT09IHJlY2VpdmVycy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignY291bnQgb2YgYW1vdW50cyBkb2VzIG5vdCBtYXRjaCBjb3VudCBvZiByZWNlaXZlcnMnKTtcbiAgICB9XG4gICAgdGhpcy5fcGF5bWVudE9iamVjdHMgPSBpbnB1dE9iamVjdHM7XG4gICAgdGhpcy5yZWNpcGllbnRzID0gW107XG4gICAgcmVjZWl2ZXJzLmZvckVhY2goKHJlY2lwaWVudCwgaW5kZXgpID0+IHtcbiAgICAgIHRoaXMuX3JlY2lwaWVudHMucHVzaCh7XG4gICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudCxcbiAgICAgICAgYW1vdW50OiBhbW91bnRzW2luZGV4XSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlSXNTaW11bGF0ZVR4KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWVzc2FnZVdpdGhJbnRlbnQobWVzc2FnZTogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBpb3RhTWVzc2FnZVdpdGhJbnRlbnQoJ1RyYW5zYWN0aW9uRGF0YScsIG1lc3NhZ2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBvcHVsYXRlVHhJbnB1dHNBbmRDb21tYW5kcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXltZW50T2JqZWN0cykge1xuICAgICAgbGV0IGZpcnN0SW5wdXRPYmo6IFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQgPSB0aGlzLl9pb3RhVHJhbnNhY3Rpb24ub2JqZWN0KFxuICAgICAgICBJb3RhSW5wdXRzLk9iamVjdFJlZih0aGlzLnBheW1lbnRPYmplY3RzWzBdKVxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnBheW1lbnRPYmplY3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGV0IGlkeCA9IDE7XG4gICAgICAgIHdoaWxlIChpZHggPCB0aGlzLnBheW1lbnRPYmplY3RzLmxlbmd0aCkge1xuICAgICAgICAgIFtmaXJzdElucHV0T2JqXSA9IHRoaXMuX2lvdGFUcmFuc2FjdGlvbi5tZXJnZUNvaW5zKFxuICAgICAgICAgICAgZmlyc3RJbnB1dE9iaixcbiAgICAgICAgICAgIHRoaXMucGF5bWVudE9iamVjdHNcbiAgICAgICAgICAgICAgLnNsaWNlKGlkeCwgaWR4ICsgTUFYX0lOUFVUX09CSkVDVFMpXG4gICAgICAgICAgICAgIC5tYXAoKGlucHV0KSA9PiB0aGlzLl9pb3RhVHJhbnNhY3Rpb24ub2JqZWN0KElvdGFJbnB1dHMuT2JqZWN0UmVmKGlucHV0KSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZHggKz0gTUFYX0lOUFVUX09CSkVDVFM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY29pbnMgPSB0aGlzLl9pb3RhVHJhbnNhY3Rpb24uc3BsaXRDb2lucyhcbiAgICAgICAgZmlyc3RJbnB1dE9iaixcbiAgICAgICAgdGhpcy5fcmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4gcmVjaXBpZW50LmFtb3VudClcbiAgICAgICk7XG4gICAgICB0aGlzLl9yZWNpcGllbnRzLmZvckVhY2goKHJlY2lwaWVudCwgaWR4KSA9PiB7XG4gICAgICAgIHRoaXMuX2lvdGFUcmFuc2FjdGlvbi50cmFuc2Zlck9iamVjdHMoW2NvaW5zW2lkeF1dLCByZWNpcGllbnQuYWRkcmVzcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdmFsaWRhdGVUeERhdGFJbXBsZW1lbnRhdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVjaXBpZW50cyB8fCB0aGlzLnJlY2lwaWVudHM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiByZWNpcGllbnRzIGFyZSByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlY2lwaWVudHMubGVuZ3RoID4gTUFYX1JFQ0lQSUVOVFMpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYFJlY2lwaWVudHMgY291bnQgKCR7dGhpcy5yZWNpcGllbnRzLmxlbmd0aH0pIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkICgke01BWF9SRUNJUElFTlRTfSlgXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wYXltZW50T2JqZWN0cyB8fCB0aGlzLnBheW1lbnRPYmplY3RzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUGF5bWVudCBvYmplY3RzIGFyZSByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBkdXBsaWNhdGUgb2JqZWN0IElEcyBpbiBwYXltZW50IG9iamVjdHNcbiAgICBjb25zdCBwYXltZW50T2JqZWN0SWRzID0gdGhpcy5wYXltZW50T2JqZWN0cy5tYXAoKG9iaikgPT4gb2JqLm9iamVjdElkKTtcbiAgICBjb25zdCB1bmlxdWVQYXltZW50SWRzID0gbmV3IFNldChwYXltZW50T2JqZWN0SWRzKTtcbiAgICBpZiAodW5pcXVlUGF5bWVudElkcy5zaXplICE9PSBwYXltZW50T2JqZWN0SWRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdEdXBsaWNhdGUgb2JqZWN0IElEcyBmb3VuZCBpbiBwYXltZW50IG9iamVjdHMnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5nYXNQYXltZW50T2JqZWN0cyAmJiB0aGlzLmdhc1BheW1lbnRPYmplY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGdhc09iamVjdElkcyA9IHRoaXMuZ2FzUGF5bWVudE9iamVjdHMubWFwKChnYXMpID0+IGdhcy5vYmplY3RJZCk7XG5cbiAgICAgIC8vIENoZWNrIGZvciBkdXBsaWNhdGUgb2JqZWN0IElEcyBpbiBnYXMgcGF5bWVudCBvYmplY3RzXG4gICAgICBjb25zdCB1bmlxdWVHYXNJZHMgPSBuZXcgU2V0KGdhc09iamVjdElkcyk7XG4gICAgICBpZiAodW5pcXVlR2FzSWRzLnNpemUgIT09IGdhc09iamVjdElkcy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdEdXBsaWNhdGUgb2JqZWN0IElEcyBmb3VuZCBpbiBnYXMgcGF5bWVudCBvYmplY3RzJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGR1cGxpY2F0ZXMgPSB0aGlzLnBheW1lbnRPYmplY3RzLmZpbHRlcigocGF5bWVudCkgPT4gZ2FzT2JqZWN0SWRzLmluY2x1ZGVzKHBheW1lbnQub2JqZWN0SWQpKTtcbiAgICAgIGlmIChkdXBsaWNhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgICdQYXltZW50IG9iamVjdHMgY2Fubm90IGJlIHRoZSBzYW1lIGFzIGdhcyBwYXltZW50IG9iamVjdHM6ICcgKyBkdXBsaWNhdGVzLm1hcCgoZCkgPT4gZC5vYmplY3RJZCkuam9pbignLCAnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHJvdGVjdGVkIGV4cGxhaW5UcmFuc2FjdGlvbkltcGxlbWVudGF0aW9uKFxuICAgIGpzb246IFR4RGF0YSxcbiAgICBleHBsYW5hdGlvblJlc3VsdDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvblxuICApOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdID0gdGhpcy5yZWNpcGllbnRzLm1hcCgocmVjaXBpZW50KSA9PiByZWNpcGllbnQpO1xuICAgIGNvbnN0IG91dHB1dEFtb3VudEJOID0gdGhpcy5yZWNpcGllbnRzLnJlZHVjZShcbiAgICAgIChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3IucGx1cyhjdXJyZW50LmFtb3VudCksXG4gICAgICBuZXcgQmlnTnVtYmVyKDApXG4gICAgKTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSBvdXRwdXRBbW91bnRCTi50b1N0cmluZygpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgb3V0cHV0QW1vdW50LFxuICAgICAgb3V0cHV0cyxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
344
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNmZXJUcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4Q0FBd0c7QUFFeEcsK0NBQTRDO0FBRTVDLDhEQUlxQztBQUNyQyxnREFBa0Q7QUFDbEQsOERBQXlGO0FBQ3pGLG1DQUFzQztBQUN0QywyQ0FBd0g7QUFDeEgsb0RBQTRCO0FBQzVCLGdFQUFxQztBQUVyQyxNQUFhLG1CQUFvQixTQUFRLHlCQUFXO0lBSWxELFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsMEJBQWUsQ0FBQyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsS0FBNkI7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxjQUFjLENBQUMsS0FBMkM7UUFDNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxX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Q0ssMEJBQTBCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLFVBQVU7YUFDbkIsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxzQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BGLFFBQVEsRUFBRSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQWpaRCxrREFpWkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciwgdG9IZXgsIFRyYW5zYWN0aW9uUmVjaXBpZW50LCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBUcmFuc2FjdGlvbk9iamVjdElucHV0LCBUcmFuc2ZlclR4RGF0YSwgVHhEYXRhIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQge1xuICBJbnB1dHMgYXMgSW90YUlucHV0cyxcbiAgVHJhbnNhY3Rpb25PYmplY3RBcmd1bWVudCxcbiAgVHJhbnNhY3Rpb24gYXMgSW90YVRyYW5zYWN0aW9uLFxufSBmcm9tICdAaW90YS9pb3RhLXNkay90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgZnJvbUJhc2U2NCB9IGZyb20gJ0Bpb3RhL2lvdGEtc2RrL3V0aWxzJztcbmltcG9ydCB7IG1lc3NhZ2VXaXRoSW50ZW50IGFzIGlvdGFNZXNzYWdlV2l0aEludGVudCB9IGZyb20gJ0Bpb3RhL2lvdGEtc2RrL2NyeXB0b2dyYXBoeSc7XG5pbXBvcnQgeyBCY3NSZWFkZXIgfSBmcm9tICdAaW90YS9iY3MnO1xuaW1wb3J0IHsgTUFYX0dBU19QQVlNRU5UX09CSkVDVFMsIE1BWF9JTlBVVF9PQkpFQ1RTLCBNQVhfUkVDSVBJRU5UUywgVFJBTlNGRVJfVFJBTlNBQ1RJT05fQ09NTUFORFMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2ZlclRyYW5zYWN0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb24ge1xuICBwcml2YXRlIF9yZWNpcGllbnRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdO1xuICBwcml2YXRlIF9wYXltZW50T2JqZWN0cz86IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXTtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgICB0aGlzLl9pbnB1dHMgPSBbXTtcbiAgICB0aGlzLl9vdXRwdXRzID0gW107XG4gIH1cblxuICBnZXQgcmVjaXBpZW50cygpOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fcmVjaXBpZW50cztcbiAgfVxuXG4gIHNldCByZWNpcGllbnRzKHZhbHVlOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdKSB7XG4gICAgdGhpcy5fcmVjaXBpZW50cyA9IHZhbHVlO1xuICAgIHRoaXMuX3JlYnVpbGRSZXF1aXJlZCA9IHRydWU7XG4gIH1cblxuICBnZXQgcGF5bWVudE9iamVjdHMoKTogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGF5bWVudE9iamVjdHM7XG4gIH1cblxuICBzZXQgcGF5bWVudE9iamVjdHModmFsdWU6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BheW1lbnRPYmplY3RzID0gdmFsdWU7XG4gICAgdGhpcy5fcmVidWlsZFJlcXVpcmVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWRkSW5wdXRzQW5kT3V0cHV0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lvdGFUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b3RhbEFtb3VudCA9IHRoaXMucmVjaXBpZW50cy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiBhY2N1bXVsYXRvciArIE51bWJlcihjdXJyZW50LmFtb3VudCksIDApO1xuICAgIHRoaXMuX291dHB1dHMgPSB0aGlzLnJlY2lwaWVudHMubWFwKChyZWNpcGllbnQsIGluZGV4KSA9PiAoe1xuICAgICAgYWRkcmVzczogcmVjaXBpZW50LmFkZHJlc3MsXG4gICAgICB2YWx1ZTogcmVjaXBpZW50LmFtb3VudC50b1N0cmluZygpLFxuICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgIH0pKTtcbiAgICB0aGlzLl9pbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRoaXMuc2VuZGVyLFxuICAgICAgICB2YWx1ZTogdG90YWxBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgdG9Kc29uKCk6IFRyYW5zZmVyVHhEYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIudG9Kc29uKCksXG4gICAgICByZWNpcGllbnRzOiB0aGlzLnJlY2lwaWVudHMsXG4gICAgICBwYXltZW50T2JqZWN0czogdGhpcy5wYXltZW50T2JqZWN0cyxcbiAgICB9O1xuICB9XG5cbiAgcGFyc2VGcm9tSlNPTih0eERhdGE6IFRyYW5zZmVyVHhEYXRhKTogdm9pZCB7XG4gICAgc3VwZXIucGFyc2VGcm9tSlNPTih0eERhdGEpO1xuICAgIHRoaXMucmVjaXBpZW50cyA9IHR4RGF0YS5yZWNpcGllbnRzO1xuICAgIHRoaXMucGF5bWVudE9iamVjdHMgPSB0eERhdGEucGF5bWVudE9iamVjdHM7XG4gICAgdGhpcy51cGRhdGVJc1NpbXVsYXRlVHgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBmcm9tIGl0cyBicm9hZGNhc3QgZm9ybWF0IChiYXNlNjQgb3IgcmF3IGJ5dGVzKS5cbiAgICogRXh0cmFjdHMgcmVjaXBpZW50cywgYW1vdW50cywgYW5kIHBheW1lbnQgb2JqZWN0cyBmcm9tIHRoZSB0cmFuc2FjdGlvbiBkYXRhLlxuICAgKi9cbiAgcGFyc2VGcm9tQnJvYWRjYXN0VHgodHg6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiB2b2lkIHtcbiAgICBjb25zdCB0eERhdGEgPSBJb3RhVHJhbnNhY3Rpb24uZnJvbSh0eCkuZ2V0RGF0YSgpO1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2ZlckNvbW1hbmRzKHR4RGF0YSk7XG5cbiAgICBzdXBlci5wYXJzZUZyb21Ccm9hZGNhc3RUeCh0eCk7XG5cbiAgICBjb25zdCB7IGlucHV0T2JqZWN0cywgYW1vdW50cywgcmVjZWl2ZXJzIH0gPSB0aGlzLnBhcnNlVHJhbnNhY3Rpb25JbnB1dHModHhEYXRhKTtcbiAgICB0aGlzLnZhbGlkYXRlQW1vdW50c01hdGNoUmVjZWl2ZXJzKGFtb3VudHMsIHJlY2VpdmVycyk7XG4gICAgdGhpcy5hc3NpZ25QYXJzZWRPYmplY3RzKGlucHV0T2JqZWN0cyk7XG4gICAgdGhpcy5hc3NpZ25SZWNpcGllbnRzKHJlY2VpdmVycywgYW1vdW50cyk7XG4gICAgdGhpcy51cGRhdGVJc1NpbXVsYXRlVHgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb25seSBjb250YWlucyBzdXBwb3J0ZWQgdHJhbnNmZXIgY29tbWFuZHMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVHJhbnNmZXJDb21tYW5kcyh0eERhdGE6IFJldHVyblR5cGU8SW90YVRyYW5zYWN0aW9uWydnZXREYXRhJ10+KTogdm9pZCB7XG4gICAgY29uc3QgaGFzVW5zdXBwb3J0ZWRDb21tYW5kcyA9IHR4RGF0YS5jb21tYW5kcy5zb21lKFxuICAgICAgKGNvbW1hbmQpID0+ICFUUkFOU0ZFUl9UUkFOU0FDVElPTl9DT01NQU5EUy5pbmNsdWRlcyhjb21tYW5kLiRraW5kKVxuICAgICk7XG5cbiAgICBpZiAoaGFzVW5zdXBwb3J0ZWRDb21tYW5kcykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdVbnN1cHBvcnRlZCBjb21tYW5kcyBpbiB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRyYW5zYWN0aW9uIGlucHV0cyB0byBleHRyYWN0IG9iamVjdHMsIGFtb3VudHMsIGFuZCByZWNlaXZlciBhZGRyZXNzZXMuXG4gICAqL1xuICBwcml2YXRlIHBhcnNlVHJhbnNhY3Rpb25JbnB1dHModHhEYXRhOiBSZXR1cm5UeXBlPElvdGFUcmFuc2FjdGlvblsnZ2V0RGF0YSddPik6IHtcbiAgICBpbnB1dE9iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXTtcbiAgICBhbW91bnRzOiBzdHJpbmdbXTtcbiAgICByZWNlaXZlcnM6IHN0cmluZ1tdO1xuICB9IHtcbiAgICBjb25zdCBpbnB1dE9iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IGFtb3VudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVjZWl2ZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdHhEYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgICAgaWYgKGlucHV0LiRraW5kID09PSAnT2JqZWN0JyAmJiAnSW1tT3JPd25lZE9iamVjdCcgaW4gaW5wdXQuT2JqZWN0KSB7XG4gICAgICAgIGlucHV0T2JqZWN0cy5wdXNoKGlucHV0Lk9iamVjdC5JbW1Pck93bmVkT2JqZWN0IGFzIFRyYW5zYWN0aW9uT2JqZWN0SW5wdXQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5wdXQuJGtpbmQgPT09ICdQdXJlJyAmJiAnYnl0ZXMnIGluIGlucHV0LlB1cmUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmcm9tQmFzZTY0KGlucHV0LlB1cmUuYnl0ZXMpO1xuICAgICAgICBjb25zdCBoZXhWYWx1ZSA9ICcweCcgKyB0b0hleCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGhleFZhbHVlKSkge1xuICAgICAgICAgIHJlY2VpdmVycy5wdXNoKGhleFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhbW91bnRzLnB1c2gobmV3IEJjc1JlYWRlcih2YWx1ZSkucmVhZDY0KCkudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7IGlucHV0T2JqZWN0cywgYW1vdW50cywgcmVjZWl2ZXJzIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIG51bWJlciBvZiBhbW91bnRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiByZWNlaXZlcnMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlQW1vdW50c01hdGNoUmVjZWl2ZXJzKGFtb3VudHM6IHN0cmluZ1tdLCByZWNlaXZlcnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKGFtb3VudHMubGVuZ3RoICE9PSByZWNlaXZlcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0NvdW50IG9mIGFtb3VudHMgZG9lcyBub3QgbWF0Y2ggY291bnQgb2YgcmVjZWl2ZXJzJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFzc2lnbnMgcGFyc2VkIGlucHV0IG9iamVjdHMgdG8gZWl0aGVyIGdhcyBwYXltZW50IG9iamVjdHMgb3IgcGF5bWVudCBvYmplY3RzLlxuICAgKiBJZiBubyBnYXMgb2JqZWN0cyBleGlzdCBhbmQgc2VuZGVyIHBheXMgb3duIGdhcywgb2JqZWN0cyBiZWNvbWUgZ2FzIG9iamVjdHMuXG4gICAqIE90aGVyd2lzZSwgdGhleSBiZWNvbWUgcGF5bWVudCBvYmplY3RzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NpZ25QYXJzZWRPYmplY3RzKGlucHV0T2JqZWN0czogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdKTogdm9pZCB7XG4gICAgaWYgKGlucHV0T2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBub0dhc09iamVjdHNFeGlzdCA9ICF0aGlzLmdhc1BheW1lbnRPYmplY3RzIHx8IHRoaXMuZ2FzUGF5bWVudE9iamVjdHMubGVuZ3RoID09PSAwO1xuICAgIGNvbnN0IHNlbmRlclBheXNPd25HYXMgPSAhdGhpcy5nYXNTcG9uc29yIHx8IHRoaXMuc2VuZGVyID09PSB0aGlzLmdhc1Nwb25zb3I7XG5cbiAgICBpZiAobm9HYXNPYmplY3RzRXhpc3QgJiYgc2VuZGVyUGF5c093bkdhcykge1xuICAgICAgdGhpcy5nYXNQYXltZW50T2JqZWN0cyA9IGlucHV0T2JqZWN0cztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGF5bWVudE9iamVjdHMgPSBpbnB1dE9iamVjdHM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGFzc2lnbnMgcmVjaXBpZW50cyBmcm9tIHBhcnNlZCBhZGRyZXNzZXMgYW5kIGFtb3VudHMuXG4gICAqL1xuICBwcml2YXRlIGFzc2lnblJlY2lwaWVudHMocmVjZWl2ZXJzOiBzdHJpbmdbXSwgYW1vdW50czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLl9yZWNpcGllbnRzID0gcmVjZWl2ZXJzLm1hcCgoYWRkcmVzcywgaW5kZXgpID0+ICh7XG4gICAgICBhZGRyZXNzLFxuICAgICAgYW1vdW50OiBhbW91bnRzW2luZGV4XSxcbiAgICB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWVzc2FnZVdpdGhJbnRlbnQobWVzc2FnZTogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBpb3RhTWVzc2FnZVdpdGhJbnRlbnQoJ1RyYW5zYWN0aW9uRGF0YScsIG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvcHVsYXRlcyB0aGUgSU9UQSB0cmFuc2FjdGlvbiB3aXRoIGlucHV0cyBhbmQgY29tbWFuZHMgZm9yIHRoZSB0cmFuc2Zlci5cbiAgICogVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9iamVjdHMgdG8gdXNlIGZvciBwYXltZW50IChlaXRoZXIgcGF5bWVudCBvYmplY3RzIG9yIGdhcyBvYmplY3RzKSxcbiAgICogY29uc29saWRhdGVzIHRoZW0gaW50byBhIHNpbmdsZSBjb2luLCBhbmQgdGhlbiBzcGxpdHMvdHJhbnNmZXJzIHRvIHJlY2lwaWVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcG9wdWxhdGVUeElucHV0c0FuZENvbW1hbmRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZUNvaW4gPSB0aGlzLmdldENvbnNvbGlkYXRlZFNvdXJjZUNvaW4oKTtcbiAgICB0aGlzLnNwbGl0QW5kVHJhbnNmZXJUb1JlY2lwaWVudHMoc291cmNlQ29pbik7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGljaCBvYmplY3RzIHRvIHVzZSBhcyB0aGUgcGF5bWVudCBzb3VyY2UgYW5kIGNvbnNvbGlkYXRlcyB0aGVtLlxuICAgKiBJZiBwYXltZW50IG9iamVjdHMgYXJlIHByb3ZpZGVkLCB1c2UgdGhvc2UuIE90aGVyd2lzZSwgaWYgdGhlIHNlbmRlciBpcyBwYXlpbmdcbiAgICogdGhlaXIgb3duIGdhcywgdXNlIHRoZSBnYXMgb2JqZWN0cyBmb3IgcGF5bWVudC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q29uc29saWRhdGVkU291cmNlQ29pbigpOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50IHtcbiAgICBpZiAodGhpcy5oYXNQYXltZW50T2JqZWN0cygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25zb2xpZGF0ZVBheW1lbnRPYmplY3RzKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnNvbGlkYXRlR2FzT2JqZWN0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBwYXltZW50IG9iamVjdHMgZXhpc3QgYW5kIGlmIGdhcyBvYmplY3RzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gICAqIEdhcyBvYmplY3RzIGFyZSB1c2VkIHdoZW46IG5vIHBheW1lbnQgb2JqZWN0cyBleGlzdCBBTkQgc2VuZGVyIHBheXMgdGhlaXIgb3duIGdhcy5cbiAgICovXG4gIHByaXZhdGUgaGFzUGF5bWVudE9iamVjdHMoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGFzUGF5bWVudE9iamVjdHMgPSB0aGlzLnBheW1lbnRPYmplY3RzICYmIHRoaXMucGF5bWVudE9iamVjdHMubGVuZ3RoID4gMDtcbiAgICBpZiAoaGFzUGF5bWVudE9iamVjdHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIElmIG5vIHBheW1lbnQgb2JqZWN0cywgb25seSB1c2UgZ2FzIG9iamVjdHMgaWYgc2VuZGVyIHBheXMgb3duIGdhc1xuICAgIGNvbnN0IHNlbmRlclBheXNPd25HYXMgPSAhdGhpcy5nYXNTcG9uc29yIHx8IHRoaXMuZ2FzU3BvbnNvciA9PT0gdGhpcy5zZW5kZXI7XG4gICAgcmV0dXJuICFzZW5kZXJQYXlzT3duR2FzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlcyBwYXltZW50IG9iamVjdHMgaW50byBhIHNpbmdsZSBjb2luIG9iamVjdC5cbiAgICogSWYgbXVsdGlwbGUgcGF5bWVudCBvYmplY3RzIGV4aXN0LCB0aGV5IGFyZSBtZXJnZWQgaW4gYmF0Y2hlcy5cbiAgICovXG4gIHByaXZhdGUgY29uc29saWRhdGVQYXltZW50T2JqZWN0cygpOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50IHtcbiAgICBpZiAoIXRoaXMucGF5bWVudE9iamVjdHMgfHwgdGhpcy5wYXltZW50T2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUGF5bWVudCBvYmplY3RzIGFyZSByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0T2JqZWN0ID0gdGhpcy5faW90YVRyYW5zYWN0aW9uLm9iamVjdChJb3RhSW5wdXRzLk9iamVjdFJlZih0aGlzLnBheW1lbnRPYmplY3RzWzBdKSk7XG5cbiAgICAvLyBTaW5nbGUgb2JqZWN0IGRvZXNuJ3QgbmVlZCBjb25zb2xpZGF0aW9uXG4gICAgaWYgKHRoaXMucGF5bWVudE9iamVjdHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gZmlyc3RPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgcmVtYWluaW5nIG9iamVjdHMgaW50byB0aGUgZmlyc3Qgb25lXG4gICAgcmV0dXJuIHRoaXMubWVyZ2VPYmplY3RzSW5CYXRjaGVzKGZpcnN0T2JqZWN0LCB0aGlzLnBheW1lbnRPYmplY3RzLnNsaWNlKDEpLCBNQVhfSU5QVVRfT0JKRUNUUyk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGVzIGdhcyBwYXltZW50IG9iamVjdHMgaW50byBhIHNpbmdsZSBjb2luIG9iamVjdC5cbiAgICogSWYgdGhlIG51bWJlciBvZiBnYXMgb2JqZWN0cyBleGNlZWRzIHRoZSBtYXhpbXVtLCB0aGV5IGFyZSBtZXJnZWQgaW4gYmF0Y2hlcy5cbiAgICovXG4gIHByaXZhdGUgY29uc29saWRhdGVHYXNPYmplY3RzKCk6IFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQge1xuICAgIGlmICghdGhpcy5nYXNQYXltZW50T2JqZWN0cyB8fCB0aGlzLmdhc1BheW1lbnRPYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdHYXMgcGF5bWVudCBvYmplY3RzIGFyZSByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGdhc09iamVjdCA9IHRoaXMuX2lvdGFUcmFuc2FjdGlvbi5nYXM7XG5cbiAgICAvLyBJZiB3aXRoaW4gdGhlIGxpbWl0LCBubyBjb25zb2xpZGF0aW9uIG5lZWRlZFxuICAgIGlmICh0aGlzLmdhc1BheW1lbnRPYmplY3RzLmxlbmd0aCA8PSBNQVhfR0FTX1BBWU1FTlRfT0JKRUNUUykge1xuICAgICAgcmV0dXJuIGdhc09iamVjdDtcbiAgICB9XG5cbiAgICAvLyBNZXJnZSBleGNlc3MgZ2FzIG9iamVjdHMgdG8gc3RheSB3aXRoaW4gbGltaXRzXG4gICAgcmV0dXJuIHRoaXMubWVyZ2VPYmplY3RzSW5CYXRjaGVzKGdhc09iamVjdCwgdGhpcy5nYXNQYXltZW50T2JqZWN0cywgTUFYX0lOUFVUX09CSkVDVFMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlcyBtdWx0aXBsZSBjb2luIG9iamVjdHMgaW50byBhIHRhcmdldCBjb2luIGluIGJhdGNoZXMuXG4gICAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgSU9UQSBoYXMgbGltaXRzIG9uIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBwZXIgbWVyZ2UgY29tbWFuZC5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldENvaW4gLSBUaGUgY29pbiB0byBtZXJnZSBpbnRvXG4gICAqIEBwYXJhbSBvYmplY3RzVG9NZXJnZSAtIEFycmF5IG9mIG9iamVjdHMgdG8gbWVyZ2VcbiAgICogQHBhcmFtIGJhdGNoU2l6ZSAtIE1heGltdW0gbnVtYmVyIG9mIG9iamVjdHMgdG8gbWVyZ2UgcGVyIGJhdGNoXG4gICAqIEByZXR1cm5zIFRoZSBjb25zb2xpZGF0ZWQgY29pbiBvYmplY3RcbiAgICovXG4gIHByaXZhdGUgbWVyZ2VPYmplY3RzSW5CYXRjaGVzKFxuICAgIHRhcmdldENvaW46IFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQsXG4gICAgb2JqZWN0c1RvTWVyZ2U6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSxcbiAgICBiYXRjaFNpemU6IG51bWJlclxuICApOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50IHtcbiAgICBsZXQgY29uc29saWRhdGVkQ29pbiA9IHRhcmdldENvaW47XG5cbiAgICBmb3IgKGxldCBzdGFydEluZGV4ID0gMDsgc3RhcnRJbmRleCA8IG9iamVjdHNUb01lcmdlLmxlbmd0aDsgc3RhcnRJbmRleCArPSBiYXRjaFNpemUpIHtcbiAgICAgIGNvbnN0IGJhdGNoID0gb2JqZWN0c1RvTWVyZ2Uuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIGJhdGNoU2l6ZSk7XG4gICAgICBjb25zdCBiYXRjaEFzVHJhbnNhY3Rpb25PYmplY3RzID0gYmF0Y2gubWFwKChvYmopID0+IHRoaXMuX2lvdGFUcmFuc2FjdGlvbi5vYmplY3QoSW90YUlucHV0cy5PYmplY3RSZWYob2JqKSkpO1xuXG4gICAgICBbY29uc29saWRhdGVkQ29pbl0gPSB0aGlzLl9pb3RhVHJhbnNhY3Rpb24ubWVyZ2VDb2lucyhjb25zb2xpZGF0ZWRDb2luLCBiYXRjaEFzVHJhbnNhY3Rpb25PYmplY3RzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uc29saWRhdGVkQ29pbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgdGhlIHNvdXJjZSBjb2luIGludG8gdGhlIGFtb3VudHMgbmVlZGVkIGZvciBlYWNoIHJlY2lwaWVudCBhbmQgdHJhbnNmZXJzIHRoZW0uXG4gICAqIFRoaXMgY3JlYXRlcyBzcGxpdCBjb2luIGNvbW1hbmRzIGZvciBhbGwgcmVjaXBpZW50IGFtb3VudHMsIHRoZW4gdHJhbnNmZXIgY29tbWFuZHNcbiAgICogdG8gc2VuZCBlYWNoIHNwbGl0IGNvaW4gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmVjaXBpZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBzcGxpdEFuZFRyYW5zZmVyVG9SZWNpcGllbnRzKHNvdXJjZUNvaW46IFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCByZWNpcGllbnRBbW91bnRzID0gdGhpcy5fcmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4gcmVjaXBpZW50LmFtb3VudCk7XG4gICAgY29uc3Qgc3BsaXRDb2lucyA9IHRoaXMuX2lvdGFUcmFuc2FjdGlvbi5zcGxpdENvaW5zKHNvdXJjZUNvaW4sIHJlY2lwaWVudEFtb3VudHMpO1xuXG4gICAgdGhpcy5fcmVjaXBpZW50cy5mb3JFYWNoKChyZWNpcGllbnQsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLl9pb3RhVHJhbnNhY3Rpb24udHJhbnNmZXJPYmplY3RzKFtzcGxpdENvaW5zW2luZGV4XV0sIHJlY2lwaWVudC5hZGRyZXNzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYWxsIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGRhdGEgYmVmb3JlIGJ1aWxkaW5nLlxuICAgKiBDaGVja3MgcmVjaXBpZW50cywgcGF5bWVudCBvYmplY3RzLCBhbmQgZW5zdXJlcyBubyBkdXBsaWNhdGUgb2JqZWN0IElEcy5cbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0ZVR4RGF0YUltcGxlbWVudGF0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVSZWNpcGllbnRzTGlzdCgpO1xuICAgIHRoaXMudmFsaWRhdGVQYXltZW50T2JqZWN0c0V4aXN0KCk7XG4gICAgdGhpcy52YWxpZGF0ZU5vRHVwbGljYXRlT2JqZWN0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHJlY2lwaWVudHMgZXhpc3QgYW5kIGRvbid0IGV4Y2VlZCB0aGUgbWF4aW11bSBhbGxvd2VkLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJlY2lwaWVudHNMaXN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZWNpcGllbnRzIHx8IHRoaXMucmVjaXBpZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gcmVjaXBpZW50cyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWNpcGllbnRzLmxlbmd0aCA+IE1BWF9SRUNJUElFTlRTKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBSZWNpcGllbnRzIGNvdW50ICgke3RoaXMucmVjaXBpZW50cy5sZW5ndGh9KSBleGNlZWRzIG1heGltdW0gYWxsb3dlZCAoJHtNQVhfUkVDSVBJRU5UU30pYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgZWl0aGVyIHBheW1lbnQgb2JqZWN0cyBvciBnYXMgb2JqZWN0cyBleGlzdCBmb3IgZnVuZGluZyB0aGUgdHJhbnNmZXIuXG4gICAqIFdoZW4gYSBnYXMgc3BvbnNvciBpcyB1c2VkLCBwYXltZW50IG9iamVjdHMgYXJlIHJlcXVpcmVkLlxuICAgKiBPdGhlcndpc2UsIGVpdGhlciBwYXltZW50IG9iamVjdHMgb3IgZ2FzIG9iamVjdHMgY2FuIGJlIHVzZWQuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUGF5bWVudE9iamVjdHNFeGlzdCgpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNQYXltZW50T2JqZWN0cyA9IHRoaXMucGF5bWVudE9iamVjdHMgJiYgdGhpcy5wYXltZW50T2JqZWN0cy5sZW5ndGggPiAwO1xuICAgIGlmIChoYXNQYXltZW50T2JqZWN0cykge1xuICAgICAgcmV0dXJuOyAvLyBQYXltZW50IG9iamVjdHMgZXhpc3QsIHZhbGlkYXRpb24gcGFzc2VzXG4gICAgfVxuXG4gICAgLy8gTm8gcGF5bWVudCBvYmplY3RzIC0gY2hlY2sgaWYgZ2FzIG9iamVjdHMgY2FuIGJlIHVzZWQgaW5zdGVhZFxuICAgIGNvbnN0IGhhc0dhc1Nwb25zb3IgPSB0aGlzLmdhc1Nwb25zb3IgJiYgdGhpcy5nYXNTcG9uc29yICE9PSB0aGlzLnNlbmRlcjtcbiAgICBpZiAoaGFzR2FzU3BvbnNvcikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdQYXltZW50IG9iamVjdHMgYXJlIHJlcXVpcmVkIHdoZW4gdXNpbmcgYSBnYXMgc3BvbnNvcicpO1xuICAgIH1cblxuICAgIC8vIE5vIGdhcyBzcG9uc29yIC0gZ2FzIG9iamVjdHMgbXVzdCBleGlzdFxuICAgIGNvbnN0IGhhc0dhc09iamVjdHMgPSB0aGlzLmdhc1BheW1lbnRPYmplY3RzICYmIHRoaXMuZ2FzUGF5bWVudE9iamVjdHMubGVuZ3RoID4gMDtcbiAgICBpZiAoIWhhc0dhc09iamVjdHMpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUGF5bWVudCBvciBHYXMgb2JqZWN0cyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZSBvYmplY3QgSURzIHdpdGhpbiBwYXltZW50IG9iamVjdHMsXG4gICAqIGdhcyBwYXltZW50IG9iamVjdHMsIG9yIGJldHdlZW4gdGhlIHR3byBncm91cHMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTm9EdXBsaWNhdGVPYmplY3RzKCk6IHZvaWQge1xuICAgIGNvbnN0IHBheW1lbnRPYmplY3RJZHMgPSB0aGlzLnBheW1lbnRPYmplY3RzPy5tYXAoKG9iaikgPT4gb2JqLm9iamVjdElkKSA/PyBbXTtcblxuICAgIC8vIENoZWNrIGZvciBkdXBsaWNhdGVzIHdpdGhpbiBwYXltZW50IG9iamVjdHNcbiAgICB0aGlzLmNoZWNrRm9yRHVwbGljYXRlSWRzKHBheW1lbnRPYmplY3RJZHMsICdwYXltZW50IG9iamVjdHMnKTtcblxuICAgIGlmICghdGhpcy5nYXNQYXltZW50T2JqZWN0cyB8fCB0aGlzLmdhc1BheW1lbnRPYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGdhc09iamVjdElkcyA9IHRoaXMuZ2FzUGF5bWVudE9iamVjdHMubWFwKChnYXMpID0+IGdhcy5vYmplY3RJZCk7XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlcyB3aXRoaW4gZ2FzIHBheW1lbnQgb2JqZWN0c1xuICAgIHRoaXMuY2hlY2tGb3JEdXBsaWNhdGVJZHMoZ2FzT2JqZWN0SWRzLCAnZ2FzIHBheW1lbnQgb2JqZWN0cycpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIG92ZXJsYXBzIGJldHdlZW4gcGF5bWVudCBhbmQgZ2FzIG9iamVjdHNcbiAgICBjb25zdCBvdmVybGFwcGluZ0lkcyA9IHBheW1lbnRPYmplY3RJZHMuZmlsdGVyKChpZCkgPT4gZ2FzT2JqZWN0SWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgaWYgKG92ZXJsYXBwaW5nSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgJ1BheW1lbnQgb2JqZWN0cyBjYW5ub3QgYmUgdGhlIHNhbWUgYXMgZ2FzIHBheW1lbnQgb2JqZWN0czogJyArIG92ZXJsYXBwaW5nSWRzLmpvaW4oJywgJylcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBjaGVjayBmb3IgZHVwbGljYXRlIElEcyBpbiBhbiBhcnJheS5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tGb3JEdXBsaWNhdGVJZHMoaWRzOiBzdHJpbmdbXSwgb2JqZWN0VHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdW5pcXVlSWRzID0gbmV3IFNldChpZHMpO1xuICAgIGlmICh1bmlxdWVJZHMuc2l6ZSAhPT0gaWRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBEdXBsaWNhdGUgb2JqZWN0IElEcyBmb3VuZCBpbiAke29iamVjdFR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqIFByb3ZpZGVzIGEgaHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gb2YgdGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGV4cGxhaW5UcmFuc2FjdGlvbkltcGxlbWVudGF0aW9uKFxuICAgIF9qc29uOiBUeERhdGEsXG4gICAgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb25cbiAgKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3Qgb3V0cHV0cyA9IHRoaXMucmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4gcmVjaXBpZW50KTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSB0aGlzLmNhbGN1bGF0ZVRvdGFsT3V0cHV0QW1vdW50KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXhwbGFuYXRpb25SZXN1bHQsXG4gICAgICBvdXRwdXRBbW91bnQsXG4gICAgICBvdXRwdXRzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgdG90YWwgYW1vdW50IGJlaW5nIHRyYW5zZmVycmVkIHRvIGFsbCByZWNpcGllbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVUb3RhbE91dHB1dEFtb3VudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlY2lwaWVudHNcbiAgICAgIC5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiBhY2N1bXVsYXRvci5wbHVzKGN1cnJlbnQuYW1vdW50KSwgbmV3IEJpZ051bWJlcigwKSlcbiAgICAgIC50b1N0cmluZygpO1xuICB9XG59XG4iXX0=
|
package/dist/src/lib/utils.d.ts
CHANGED
|
@@ -1,21 +1,121 @@
|
|
|
1
1
|
import { BaseUtils } from '@bitgo/sdk-core';
|
|
2
|
+
/**
|
|
3
|
+
* Utility class for IOTA-specific validation and conversion operations.
|
|
4
|
+
* Implements the BaseUtils interface and provides methods for validating
|
|
5
|
+
* addresses, keys, signatures, and transaction data.
|
|
6
|
+
*/
|
|
2
7
|
export declare class Utils implements BaseUtils {
|
|
3
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* Validates an IOTA address format.
|
|
10
|
+
* IOTA addresses are 64-character hex strings prefixed with '0x'.
|
|
11
|
+
*
|
|
12
|
+
* @param address - The address to validate
|
|
13
|
+
* @returns true if the address is valid
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* utils.isValidAddress('0x1234...') // true
|
|
18
|
+
* utils.isValidAddress('invalid') // false
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
4
21
|
isValidAddress(address: string): boolean;
|
|
5
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Validates an IOTA block ID (digest).
|
|
24
|
+
* Block IDs are 32-byte base58-encoded strings.
|
|
25
|
+
*
|
|
26
|
+
* @param hash - The block ID to validate
|
|
27
|
+
* @returns true if the block ID is valid
|
|
28
|
+
*/
|
|
6
29
|
isValidBlockId(hash: string): boolean;
|
|
7
|
-
/**
|
|
30
|
+
/**
|
|
31
|
+
* Validates an IOTA transaction ID (digest).
|
|
32
|
+
* Transaction IDs are 32-byte base58-encoded strings.
|
|
33
|
+
*
|
|
34
|
+
* @param txId - The transaction ID to validate
|
|
35
|
+
* @returns true if the transaction ID is valid
|
|
36
|
+
*/
|
|
37
|
+
isValidTransactionId(txId: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Validates an Ed25519 private key format.
|
|
40
|
+
*
|
|
41
|
+
* @param key - The private key to validate (hex string)
|
|
42
|
+
* @returns true if the private key is valid
|
|
43
|
+
*/
|
|
8
44
|
isValidPrivateKey(key: string): boolean;
|
|
9
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* Validates an Ed25519 public key format.
|
|
47
|
+
*
|
|
48
|
+
* @param key - The public key to validate (hex string)
|
|
49
|
+
* @returns true if the public key is valid
|
|
50
|
+
*/
|
|
10
51
|
isValidPublicKey(key: string): boolean;
|
|
11
|
-
/**
|
|
52
|
+
/**
|
|
53
|
+
* Validates an IOTA signature format.
|
|
54
|
+
* Signatures must be base64-encoded and exactly 64 bytes when decoded.
|
|
55
|
+
*
|
|
56
|
+
* @param signature - The base64-encoded signature to validate
|
|
57
|
+
* @returns true if the signature is valid
|
|
58
|
+
*/
|
|
12
59
|
isValidSignature(signature: string): boolean;
|
|
13
|
-
/**
|
|
14
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Validates a raw IOTA transaction format.
|
|
62
|
+
* Attempts to parse the transaction using the IOTA SDK.
|
|
63
|
+
*
|
|
64
|
+
* @param rawTransaction - The raw transaction (base64 string or Uint8Array)
|
|
65
|
+
* @returns true if the transaction can be parsed
|
|
66
|
+
*/
|
|
67
|
+
isValidRawTransaction(rawTransaction: string | Uint8Array): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Validates a hex string with a specific length requirement.
|
|
70
|
+
* Checks for '0x' or '0X' prefix followed by the specified number of hex characters.
|
|
71
|
+
*
|
|
72
|
+
* @param value - The hex string to validate
|
|
73
|
+
* @param length - The required length (number of hex characters, excluding prefix)
|
|
74
|
+
* @returns true if the hex string matches the format and length
|
|
75
|
+
*/
|
|
15
76
|
isValidHex(value: string, length: number): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Converts a value to a base64-encoded string.
|
|
79
|
+
* Handles both Uint8Array and hex string inputs.
|
|
80
|
+
*
|
|
81
|
+
* @param value - The value to encode (Uint8Array or hex string)
|
|
82
|
+
* @returns Base64-encoded string
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* utils.getBase64String(new Uint8Array([1, 2, 3]))
|
|
87
|
+
* utils.getBase64String('0x010203')
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
getBase64String(value: string | Uint8Array): string;
|
|
91
|
+
/**
|
|
92
|
+
* Derives an IOTA address from an Ed25519 public key.
|
|
93
|
+
* Uses the IOTA SDK's address derivation algorithm.
|
|
94
|
+
*
|
|
95
|
+
* @param publicKey - The Ed25519 public key (hex string)
|
|
96
|
+
* @returns The derived IOTA address
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const address = utils.getAddressFromPublicKey('8c26e54e36c902c5...')
|
|
101
|
+
* // Returns: '0x9882188ba3e8070a...'
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
16
104
|
getAddressFromPublicKey(publicKey: string): string;
|
|
17
|
-
isValidRawTransaction(rawTransaction: string | Uint8Array): boolean;
|
|
18
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Singleton instance of the Utils class.
|
|
108
|
+
* Use this for all IOTA utility operations throughout the SDK.
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* import utils from './utils';
|
|
113
|
+
*
|
|
114
|
+
* if (utils.isValidAddress(address)) {
|
|
115
|
+
* // Process valid address
|
|
116
|
+
* }
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
19
119
|
declare const utils: Utils;
|
|
20
120
|
export default utils;
|
|
21
121
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8D,MAAM,iBAAiB,CAAC;AAWxG,qBAAa,KAAM,YAAW,SAAS;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8D,MAAM,iBAAiB,CAAC;AAWxG;;;;GAIG;AACH,qBAAa,KAAM,YAAW,SAAS;IAKrC;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC;;;;;;OAMG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC;;;;;;OAMG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQ3C;;;;;OAKG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC;;;;;OAKG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQtC;;;;;;OAMG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAU5C;;;;;;OAMG;IACH,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO;IAanE;;;;;;;OAOG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAKlD;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM;IAOnD;;;;;;;;;;;;OAYG;IACH,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAInD;AAED;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,KAAK,OAAc,CAAC;AAE1B,eAAe,KAAK,CAAC"}
|