@bitgo-beta/sdk-coin-flrp 1.0.1-beta.67 → 1.0.1-beta.68
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/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/dist/src/flrp.d.ts +0 -91
- package/dist/src/flrp.d.ts.map +0 -1
- package/dist/src/flrp.js +0 -343
- package/dist/src/iface.d.ts +0 -25
- package/dist/src/iface.d.ts.map +0 -1
- package/dist/src/iface.js +0 -3
- package/dist/src/index.d.ts +0 -6
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -45
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +0 -26
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +0 -64
- package/dist/src/lib/atomicTransactionBuilder.d.ts +0 -96
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/atomicTransactionBuilder.js +0 -318
- package/dist/src/lib/constants.d.ts +0 -170
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -227
- package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/delegatorTxBuilder.js +0 -224
- package/dist/src/lib/errors.d.ts +0 -8
- package/dist/src/lib/errors.d.ts.map +0 -1
- package/dist/src/lib/errors.js +0 -19
- package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInCTxBuilder.js +0 -199
- package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
- package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInPTxBuilder.js +0 -120
- package/dist/src/lib/iface.d.ts +0 -119
- package/dist/src/lib/iface.d.ts.map +0 -1
- package/dist/src/lib/iface.js +0 -22
- package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
- package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInCTxBuilder.js +0 -403
- package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
- package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInPTxBuilder.js +0 -464
- package/dist/src/lib/index.d.ts +0 -12
- package/dist/src/lib/index.d.ts.map +0 -1
- package/dist/src/lib/index.js +0 -39
- package/dist/src/lib/keyPair.d.ts +0 -58
- package/dist/src/lib/keyPair.d.ts.map +0 -1
- package/dist/src/lib/keyPair.js +0 -142
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +0 -81
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +0 -248
- package/dist/src/lib/transaction.d.ts +0 -111
- package/dist/src/lib/transaction.d.ts.map +0 -1
- package/dist/src/lib/transaction.js +0 -322
- package/dist/src/lib/transactionBuilder.d.ts +0 -85
- package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilder.js +0 -167
- package/dist/src/lib/transactionBuilderFactory.d.ts +0 -37
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilderFactory.js +0 -91
- package/dist/src/lib/types.d.ts +0 -78
- package/dist/src/lib/types.d.ts.map +0 -1
- package/dist/src/lib/types.js +0 -5
- package/dist/src/lib/utils.d.ts +0 -217
- package/dist/src/lib/utils.d.ts.map +0 -1
- package/dist/src/lib/utils.js +0 -498
- package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
- package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/validatorTxBuilder.js +0 -180
- package/dist/src/register.d.ts +0 -3
- package/dist/src/register.d.ts.map +0 -1
- package/dist/src/register.js +0 -11
- package/dist/src/tflrp.d.ts +0 -8
- package/dist/src/tflrp.d.ts.map +0 -1
- package/dist/src/tflrp.js +0 -14
- package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
- package/dist/test/unit/flrp.d.ts +0 -2
- package/dist/test/unit/flrp.d.ts.map +0 -1
- package/dist/test/unit/flrp.js +0 -118
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportInCTxBuilder.js +0 -584
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportInPTxBuilder.js +0 -377
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/importInCTxBuilder.js +0 -257
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/importInPTxBuilder.js +0 -500
- package/dist/test/unit/lib/transaction.d.ts +0 -2
- package/dist/test/unit/lib/transaction.d.ts.map +0 -1
- package/dist/test/unit/lib/transaction.js +0 -460
- package/dist/test/unit/lib/utils.d.ts +0 -2
- package/dist/test/unit/lib/utils.d.ts.map +0 -1
- package/dist/test/unit/lib/utils.js +0 -286
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
- package/dist/test/unit/smoke.d.ts +0 -2
- package/dist/test/unit/smoke.d.ts.map +0 -1
- package/dist/test/unit/smoke.js +0 -23
- package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
- package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder.test.js +0 -114
- package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/validatorTxBuilder.test.js +0 -293
|
@@ -1,403 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.ImportInCTxBuilder = void 0;
|
|
40
|
-
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
41
|
-
const atomicInCTransactionBuilder_1 = require("./atomicInCTransactionBuilder");
|
|
42
|
-
const buffer_1 = require("buffer");
|
|
43
|
-
const utils_1 = __importStar(require("./utils"));
|
|
44
|
-
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
45
|
-
const constants_1 = require("./constants");
|
|
46
|
-
/**
|
|
47
|
-
* Flare P->C Import Transaction Builder
|
|
48
|
-
* Builds import transactions from P-chain to C-chain using FlareJS
|
|
49
|
-
*/
|
|
50
|
-
class ImportInCTxBuilder extends atomicInCTransactionBuilder_1.AtomicInCTransactionBuilder {
|
|
51
|
-
constructor(_coinConfig) {
|
|
52
|
-
super(_coinConfig);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* C-chain address who is target of the import.
|
|
56
|
-
* Address format is Ethereum-like for Flare C-chain
|
|
57
|
-
* @param {string} cAddress - C-chain address (hex format)
|
|
58
|
-
*/
|
|
59
|
-
to(cAddress) {
|
|
60
|
-
// Validate and normalize C-chain address
|
|
61
|
-
if (!utils_1.default.isValidAddress(cAddress)) {
|
|
62
|
-
throw new sdk_core_1.BuildTransactionError(`Invalid C-chain address: ${cAddress}`);
|
|
63
|
-
}
|
|
64
|
-
this.transaction._to = [cAddress];
|
|
65
|
-
return this;
|
|
66
|
-
}
|
|
67
|
-
get transactionType() {
|
|
68
|
-
return sdk_core_1.TransactionType.Import;
|
|
69
|
-
}
|
|
70
|
-
/** @inheritdoc */
|
|
71
|
-
initBuilder(tx) {
|
|
72
|
-
if (!tx) {
|
|
73
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_TRANSACTION_REQUIRED);
|
|
74
|
-
}
|
|
75
|
-
// Handle both UnsignedTx and signed transaction formats
|
|
76
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
77
|
-
const unsignedTx = tx.unsignedTx || tx;
|
|
78
|
-
try {
|
|
79
|
-
// Extract network and blockchain validation
|
|
80
|
-
if (unsignedTx.networkID !== undefined && unsignedTx.networkID !== this.transaction._networkID) {
|
|
81
|
-
throw new sdk_core_1.BuildTransactionError(`Network ID mismatch: expected ${this.transaction._networkID}, got ${unsignedTx.networkID}`);
|
|
82
|
-
}
|
|
83
|
-
if (unsignedTx.blockchainID && !unsignedTx.blockchainID.equals(this.transaction._blockchainID)) {
|
|
84
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_BLOCKCHAIN_ID_MISMATCH);
|
|
85
|
-
}
|
|
86
|
-
// Extract C-chain import transaction details
|
|
87
|
-
if (unsignedTx.importIns && Array.isArray(unsignedTx.importIns)) {
|
|
88
|
-
// Extract UTXOs from import inputs (typically from P-chain)
|
|
89
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
90
|
-
const utxos = unsignedTx.importIns.map((importIn) => ({
|
|
91
|
-
id: importIn.txID?.toString() || constants_1.EMPTY_STRING,
|
|
92
|
-
outputIndex: importIn.outputIndex || constants_1.FIRST_ARRAY_INDEX,
|
|
93
|
-
amount: importIn.input?.amount?.toString() || constants_1.AMOUNT_STRING_ZERO,
|
|
94
|
-
assetId: importIn.input?.assetID || buffer_1.Buffer.alloc(constants_1.ASSET_ID_LENGTH),
|
|
95
|
-
address: importIn.input?.addresses?.[constants_1.FIRST_ARRAY_INDEX] || constants_1.EMPTY_STRING,
|
|
96
|
-
threshold: importIn.input?.threshold || constants_1.DEFAULT_THRESHOLD,
|
|
97
|
-
locktime: importIn.input?.locktime || constants_1.DEFAULT_LOCKTIME,
|
|
98
|
-
}));
|
|
99
|
-
this.addUtxos(utxos);
|
|
100
|
-
}
|
|
101
|
-
// Extract outputs (C-chain destination)
|
|
102
|
-
if (unsignedTx.outs && Array.isArray(unsignedTx.outs)) {
|
|
103
|
-
const outputs = unsignedTx.outs;
|
|
104
|
-
if (outputs.length > constants_1.ZERO_NUMBER) {
|
|
105
|
-
const firstOutput = outputs[constants_1.FIRST_ARRAY_INDEX];
|
|
106
|
-
// C-chain uses Ethereum-style addresses
|
|
107
|
-
if (firstOutput.addresses && Array.isArray(firstOutput.addresses)) {
|
|
108
|
-
// Set the first address as the destination
|
|
109
|
-
if (firstOutput.addresses.length > constants_1.ZERO_NUMBER) {
|
|
110
|
-
this.to(firstOutput.addresses[constants_1.FIRST_ARRAY_INDEX]);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
// Extract amount if present
|
|
114
|
-
if (firstOutput.amount) {
|
|
115
|
-
// Store output amount for validation
|
|
116
|
-
this.transaction._outputAmount = firstOutput.amount.toString();
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
// Extract source chain (typically P-chain for C-chain imports)
|
|
121
|
-
if (unsignedTx.sourceChain) {
|
|
122
|
-
this._externalChainId = buffer_1.Buffer.isBuffer(unsignedTx.sourceChain)
|
|
123
|
-
? unsignedTx.sourceChain
|
|
124
|
-
: buffer_1.Buffer.from(unsignedTx.sourceChain, constants_1.HEX_ENCODING);
|
|
125
|
-
}
|
|
126
|
-
// Extract fee information
|
|
127
|
-
if (unsignedTx.fee !== undefined) {
|
|
128
|
-
this.transaction._fee.fee = unsignedTx.fee.toString();
|
|
129
|
-
}
|
|
130
|
-
// Extract memo if present
|
|
131
|
-
if (unsignedTx.memo && unsignedTx.memo.length > 0) {
|
|
132
|
-
// Store memo data for later use
|
|
133
|
-
this.transaction._memo = unsignedTx.memo;
|
|
134
|
-
}
|
|
135
|
-
// Set the transaction
|
|
136
|
-
this.transaction.setTransaction(tx);
|
|
137
|
-
// Validate transaction type
|
|
138
|
-
if (!this.verifyTxType(tx)) {
|
|
139
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_TRANSACTION_PARSE_FAILED);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
catch (error) {
|
|
143
|
-
if (error instanceof sdk_core_1.BuildTransactionError) {
|
|
144
|
-
throw error;
|
|
145
|
-
}
|
|
146
|
-
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_FAILED_INITIALIZE_BUILDER}: ${error}`);
|
|
147
|
-
}
|
|
148
|
-
return this;
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Verify transaction type for FlareJS import transactions
|
|
152
|
-
* @param {unknown} unsignedTx - FlareJS UnsignedTx
|
|
153
|
-
* @returns {boolean} - Whether transaction is valid import type
|
|
154
|
-
*/
|
|
155
|
-
static verifyTxType(unsignedTx) {
|
|
156
|
-
try {
|
|
157
|
-
// Check if transaction has the structure of an import transaction
|
|
158
|
-
const tx = unsignedTx;
|
|
159
|
-
// If transaction is null/undefined, return false
|
|
160
|
-
if (!tx || typeof tx !== constants_1.OBJECT_TYPE_STRING) {
|
|
161
|
-
return false;
|
|
162
|
-
}
|
|
163
|
-
// If it's a placeholder with type 'import', accept it (for testing)
|
|
164
|
-
if (tx.type === 'import') {
|
|
165
|
-
return true;
|
|
166
|
-
}
|
|
167
|
-
// Check for import transaction specific properties
|
|
168
|
-
// ImportTx should have sourceChain, importIns, and destination C-chain address
|
|
169
|
-
const hasImportIns = Boolean(tx.importIns && Array.isArray(tx.importIns));
|
|
170
|
-
const hasSourceChain = Boolean(tx.sourceChain && (buffer_1.Buffer.isBuffer(tx.sourceChain) || typeof tx.sourceChain === 'string'));
|
|
171
|
-
// For C-chain imports, check EVM-specific properties
|
|
172
|
-
const hasToAddress = Boolean(tx.to && (buffer_1.Buffer.isBuffer(tx.to) || typeof tx.to === 'string'));
|
|
173
|
-
// If it has all import transaction properties, it's valid
|
|
174
|
-
if (hasImportIns && hasSourceChain && hasToAddress) {
|
|
175
|
-
return true;
|
|
176
|
-
}
|
|
177
|
-
// For other cases (empty objects, different types), return false
|
|
178
|
-
return false;
|
|
179
|
-
}
|
|
180
|
-
catch (error) {
|
|
181
|
-
return false;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
verifyTxType(unsignedTx) {
|
|
185
|
-
return ImportInCTxBuilder.verifyTxType(unsignedTx);
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Build the import C-chain transaction using FlareJS evm.newImportTx
|
|
189
|
-
* @protected
|
|
190
|
-
*/
|
|
191
|
-
buildFlareTransaction() {
|
|
192
|
-
// if tx has credentials, tx shouldn't change
|
|
193
|
-
if (this.transaction.hasCredentials)
|
|
194
|
-
return;
|
|
195
|
-
if (this.transaction._to.length !== 1) {
|
|
196
|
-
throw new sdk_core_1.BuildTransactionError('C-chain destination address is required');
|
|
197
|
-
}
|
|
198
|
-
if (this._utxos.length === 0) {
|
|
199
|
-
throw new sdk_core_1.BuildTransactionError('UTXOs are required for import transaction');
|
|
200
|
-
}
|
|
201
|
-
try {
|
|
202
|
-
// Prepare parameters for FlareJS evm.newImportTx
|
|
203
|
-
const toAddress = new Uint8Array(buffer_1.Buffer.from(this.transaction._to[0].replace('0x', ''), 'hex'));
|
|
204
|
-
// Convert our UTXOs to FlareJS format
|
|
205
|
-
const flareUtxos = this._utxos.map((utxo) => ({
|
|
206
|
-
txID: utxo.txid,
|
|
207
|
-
outputIndex: parseInt(utxo.outputidx, 10),
|
|
208
|
-
output: {
|
|
209
|
-
amount: () => BigInt(utxo.amount),
|
|
210
|
-
assetID: buffer_1.Buffer.alloc(constants_1.ASSET_ID_LENGTH), // Default asset ID, should be extracted from UTXO in real implementation
|
|
211
|
-
addresses: utxo.addresses,
|
|
212
|
-
threshold: utxo.threshold,
|
|
213
|
-
locktime: 0n, // Default locktime, should be extracted from UTXO in real implementation
|
|
214
|
-
},
|
|
215
|
-
}));
|
|
216
|
-
// Get source chain ID (typically P-chain for C-chain imports)
|
|
217
|
-
const sourceChainId = this._externalChainId ? this._externalChainId.toString(constants_1.HEX_ENCODING) : constants_1.P_CHAIN_SHORT;
|
|
218
|
-
// Calculate fee
|
|
219
|
-
const fee = BigInt(this.transaction._fee.fee || constants_1.DEFAULT_EVM_GAS_FEE); // EVM-style gas fee
|
|
220
|
-
// Prepare source addresses from UTXOs for FlareJS
|
|
221
|
-
const fromAddresses = Array.from(new Set(this._utxos.flatMap((utxo) => utxo.addresses))).map((addr) => buffer_1.Buffer.from(addr, 'hex'));
|
|
222
|
-
// Enhanced implementation - prepare for FlareJS integration
|
|
223
|
-
// Create transaction structure compatible with FlareJS evm.newImportTx
|
|
224
|
-
const enhancedTx = {
|
|
225
|
-
networkID: this.transaction._networkID,
|
|
226
|
-
blockchainID: this.transaction._blockchainID,
|
|
227
|
-
sourceChain: sourceChainId,
|
|
228
|
-
importedInputs: flareUtxos.map((utxo) => ({
|
|
229
|
-
...utxo,
|
|
230
|
-
// Add FlareJS-compatible fields
|
|
231
|
-
utxoID: buffer_1.Buffer.from(utxo.txID + utxo.outputIndex.toString(16).padStart(constants_1.OUTPUT_INDEX_HEX_LENGTH, constants_1.AMOUNT_STRING_ZERO), constants_1.HEX_ENCODING),
|
|
232
|
-
assetID: utxo.output.assetID,
|
|
233
|
-
amount: utxo.output.amount(),
|
|
234
|
-
})),
|
|
235
|
-
outputs: [
|
|
236
|
-
{
|
|
237
|
-
address: toAddress,
|
|
238
|
-
amount: this.calculateTotalAmount(flareUtxos) - fee,
|
|
239
|
-
assetID: buffer_1.Buffer.alloc(constants_1.ASSET_ID_LENGTH), // Default asset ID for Flare native token
|
|
240
|
-
},
|
|
241
|
-
],
|
|
242
|
-
fee,
|
|
243
|
-
type: constants_1.IMPORT_C_TYPE,
|
|
244
|
-
fromAddresses: fromAddresses.map((addr) => addr.toString('hex')),
|
|
245
|
-
toAddress: buffer_1.Buffer.from(toAddress).toString('hex'),
|
|
246
|
-
// Add FlareJS-specific metadata for future integration
|
|
247
|
-
_flareJSReady: true,
|
|
248
|
-
};
|
|
249
|
-
this.transaction.setTransaction(enhancedTx);
|
|
250
|
-
}
|
|
251
|
-
catch (error) {
|
|
252
|
-
throw new sdk_core_1.BuildTransactionError(`Failed to build import transaction: ${error}`);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Calculate total amount from UTXOs
|
|
257
|
-
* @private
|
|
258
|
-
*/
|
|
259
|
-
calculateTotalAmount(utxos) {
|
|
260
|
-
return utxos.reduce((total, utxo) => {
|
|
261
|
-
const amount = typeof utxo.output.amount === 'function' ? utxo.output.amount() : BigInt(utxo.output.amount || 0);
|
|
262
|
-
return total + amount;
|
|
263
|
-
}, 0n);
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Create inputs for the import transaction from UTXOs
|
|
267
|
-
* @returns {Object} - Inputs, total amount, and credentials
|
|
268
|
-
* @protected
|
|
269
|
-
*/
|
|
270
|
-
createInputs() {
|
|
271
|
-
if (this._utxos.length === 0) {
|
|
272
|
-
throw new sdk_core_1.BuildTransactionError('No UTXOs available for import');
|
|
273
|
-
}
|
|
274
|
-
const inputs = [];
|
|
275
|
-
const credentials = [];
|
|
276
|
-
let totalAmount = new bignumber_js_1.default(0);
|
|
277
|
-
// Process each UTXO to create inputs
|
|
278
|
-
this._utxos.forEach((utxo) => {
|
|
279
|
-
// Convert UTXO to FlareJS-compatible TransferableInput format
|
|
280
|
-
const amount = new bignumber_js_1.default(utxo.amount);
|
|
281
|
-
totalAmount = totalAmount.plus(amount);
|
|
282
|
-
// Create enhanced input structure ready for FlareJS integration
|
|
283
|
-
const enhancedInput = {
|
|
284
|
-
// UTXO identification
|
|
285
|
-
txID: buffer_1.Buffer.from(utxo.txid, 'hex'),
|
|
286
|
-
outputIndex: parseInt(utxo.outputidx, 10),
|
|
287
|
-
// Asset information
|
|
288
|
-
assetID: buffer_1.Buffer.alloc(constants_1.ASSET_ID_LENGTH), // Should be extracted from UTXO in real implementation
|
|
289
|
-
// Transfer details
|
|
290
|
-
amount: amount.toString(),
|
|
291
|
-
locktime: BigInt(0),
|
|
292
|
-
threshold: utxo.threshold,
|
|
293
|
-
addresses: utxo.addresses.map((addr) => buffer_1.Buffer.from(addr, 'hex')),
|
|
294
|
-
// FlareJS compatibility markers
|
|
295
|
-
_flareJSReady: true,
|
|
296
|
-
_type: constants_1.TRANSFERABLE_INPUT_TYPE,
|
|
297
|
-
// Methods for FlareJS compatibility
|
|
298
|
-
getAmount: () => BigInt(amount.toString()),
|
|
299
|
-
getAssetID: () => buffer_1.Buffer.alloc(constants_1.ASSET_ID_LENGTH),
|
|
300
|
-
getUTXOID: () => buffer_1.Buffer.from(utxo.txid + utxo.outputidx.padStart(constants_1.OUTPUT_INDEX_HEX_LENGTH, constants_1.AMOUNT_STRING_ZERO), constants_1.HEX_ENCODING),
|
|
301
|
-
};
|
|
302
|
-
inputs.push(enhancedInput);
|
|
303
|
-
// Create enhanced credential structure ready for FlareJS integration
|
|
304
|
-
const enhancedCredential = {
|
|
305
|
-
// Signature management
|
|
306
|
-
signatureIndices: Array.from({ length: utxo.threshold }, (_, i) => i),
|
|
307
|
-
signatures: [], // Will be populated during signing
|
|
308
|
-
// FlareJS compatibility markers
|
|
309
|
-
_flareJSReady: true,
|
|
310
|
-
_type: constants_1.CREDENTIAL_TYPE,
|
|
311
|
-
// Methods for FlareJS compatibility
|
|
312
|
-
addSignature: (signature) => enhancedCredential.signatures.push(signature),
|
|
313
|
-
getSignatureIndices: () => enhancedCredential.signatureIndices,
|
|
314
|
-
serialize: () => buffer_1.Buffer.alloc(0),
|
|
315
|
-
};
|
|
316
|
-
credentials.push(enhancedCredential);
|
|
317
|
-
});
|
|
318
|
-
return {
|
|
319
|
-
inputs,
|
|
320
|
-
credentials,
|
|
321
|
-
amount: totalAmount,
|
|
322
|
-
};
|
|
323
|
-
}
|
|
324
|
-
/**
|
|
325
|
-
* Calculate import transaction fee using FlareJS
|
|
326
|
-
* @param {TransferableInput[]} inputs - Transaction inputs
|
|
327
|
-
* @returns {BigNumber} - Calculated fee amount
|
|
328
|
-
* @protected
|
|
329
|
-
*/
|
|
330
|
-
calculateImportFee(inputs) {
|
|
331
|
-
// Implement FlareJS-compatible fee calculation
|
|
332
|
-
// This follows FlareJS fee calculation patterns for C-chain imports
|
|
333
|
-
const baseFee = new bignumber_js_1.default(this.transaction._fee.feeRate || constants_1.DEFAULT_BASE_FEE); // 1M nanoFLR default
|
|
334
|
-
const inputCount = inputs.length;
|
|
335
|
-
const outputCount = 1; // Single C-chain output
|
|
336
|
-
// FlareJS-style fee calculation for import transactions
|
|
337
|
-
// Base fee covers transaction overhead
|
|
338
|
-
// Input fees cover UTXO processing
|
|
339
|
-
// Output fees cover result generation
|
|
340
|
-
const inputFee = new bignumber_js_1.default(constants_1.INPUT_FEE); // 100K nanoFLR per input (FlareJS standard)
|
|
341
|
-
const outputFee = new bignumber_js_1.default(constants_1.OUTPUT_FEE); // 50K nanoFLR per output (FlareJS standard)
|
|
342
|
-
// Calculate total fee: base + inputs + outputs
|
|
343
|
-
const totalFee = baseFee
|
|
344
|
-
.plus(new bignumber_js_1.default(inputCount).times(inputFee))
|
|
345
|
-
.plus(new bignumber_js_1.default(outputCount).times(outputFee));
|
|
346
|
-
// Add C-chain specific fees (EVM gas consideration)
|
|
347
|
-
const evmGasFee = new bignumber_js_1.default(constants_1.DEFAULT_EVM_GAS_FEE); // Standard EVM transfer gas
|
|
348
|
-
const finalFee = totalFee.plus(evmGasFee);
|
|
349
|
-
// Ensure minimum fee threshold
|
|
350
|
-
const minimumFee = new bignumber_js_1.default(constants_1.MINIMUM_FEE); // 1M nanoFLR minimum
|
|
351
|
-
return bignumber_js_1.default.max(finalFee, minimumFee);
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Add UTXOs to be used as inputs for the import transaction
|
|
355
|
-
* @param {DecodedUtxoObj[]} utxos - UTXOs from P-chain to import
|
|
356
|
-
*/
|
|
357
|
-
addUtxos(utxos) {
|
|
358
|
-
if (!Array.isArray(utxos)) {
|
|
359
|
-
throw new sdk_core_1.BuildTransactionError('UTXOs must be an array');
|
|
360
|
-
}
|
|
361
|
-
this._utxos = [...this._utxos, ...utxos];
|
|
362
|
-
return this;
|
|
363
|
-
}
|
|
364
|
-
/**
|
|
365
|
-
* Set the source chain for the import (typically P-chain)
|
|
366
|
-
* @param {string} chainId - Source chain ID
|
|
367
|
-
*/
|
|
368
|
-
sourceChain(chainId) {
|
|
369
|
-
// Validate and set source chain ID for C-chain imports
|
|
370
|
-
if (!chainId || typeof chainId !== 'string') {
|
|
371
|
-
throw new sdk_core_1.BuildTransactionError('Source chain ID must be a non-empty string');
|
|
372
|
-
}
|
|
373
|
-
// Valid source chains for C-chain imports in Flare network
|
|
374
|
-
const validSourceChains = constants_1.VALID_IMPORT_SOURCE_CHAINS;
|
|
375
|
-
const chainIdNormalized = chainId.replace('-chain', '').toUpperCase();
|
|
376
|
-
// Check if it's a predefined chain identifier
|
|
377
|
-
if (validSourceChains.some((chain) => chain.replace('-chain', '').toUpperCase() === chainIdNormalized)) {
|
|
378
|
-
// Store normalized chain ID (e.g., 'P' for P-chain)
|
|
379
|
-
this._externalChainId = buffer_1.Buffer.from(chainIdNormalized, constants_1.UTF8_ENCODING);
|
|
380
|
-
return this;
|
|
381
|
-
}
|
|
382
|
-
// Check if it's a hex-encoded chain ID (CHAIN_ID_HEX_LENGTH characters for FlareJS)
|
|
383
|
-
if ((0, utils_1.createHexRegex)(constants_1.CHAIN_ID_HEX_LENGTH).test(chainId)) {
|
|
384
|
-
this._externalChainId = buffer_1.Buffer.from(chainId, 'hex');
|
|
385
|
-
return this;
|
|
386
|
-
}
|
|
387
|
-
// Check if it's a CB58-encoded chain ID (FlareJS format)
|
|
388
|
-
if (utils_1.default.isValidAddress(chainId)) {
|
|
389
|
-
this._externalChainId = utils_1.default.cb58Decode(chainId);
|
|
390
|
-
return this;
|
|
391
|
-
}
|
|
392
|
-
// If none of the above, try to decode as hex or use as-is
|
|
393
|
-
try {
|
|
394
|
-
this._externalChainId = buffer_1.Buffer.from(chainId, 'hex');
|
|
395
|
-
}
|
|
396
|
-
catch (error) {
|
|
397
|
-
this._externalChainId = buffer_1.Buffer.from(chainId, constants_1.UTF8_ENCODING);
|
|
398
|
-
}
|
|
399
|
-
return this;
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
exports.ImportInCTxBuilder = ImportInCTxBuilder;
|
|
403
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbXBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsbURBQThFO0FBQzlFLCtFQUE0RTtBQUU1RSxtQ0FBZ0M7QUFDaEMsaURBQWdEO0FBRWhELGdFQUFxQztBQUVyQywyQ0EyQnFCO0FBRXJCOzs7R0FHRztBQUNILE1BQWEsa0JBQW1CLFNBQVEseURBQTJCO0lBQ2pFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsRUFBRSxDQUFDLFFBQWdCO1FBQ2pCLHlDQUF5QztRQUN6QyxJQUFJLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyw0QkFBNEIsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLFdBQVcsQ0FBQyxFQUFNO1FBQ2hCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNSLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxzQ0FBMEIsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsOERBQThEO1FBQzlELE1BQU0sVUFBVSxHQUFJLEVBQVUsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1FBRWhELElBQUksQ0FBQztZQUNILDRDQUE0QztZQUM1QyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDL0YsTUFBTSxJQUFJLGdDQUFxQixDQUM3QixpQ0FBaUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLFNBQVMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUM1RixDQUFDO1lBQ0osQ0FBQztZQUVELElBQUksVUFBVSxDQUFDLFlBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDL0YsTUFBTSxJQUFJLGdDQUFxQixDQUFDLHdDQUE0QixDQUFDLENBQUM7WUFDaEUsQ0FBQztZQUVELDZDQUE2QztZQUM3QyxJQUFJLFVBQVUsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDaEUsNERBQTREO2dCQUM1RCw4REFBOEQ7Z0JBQzlELE1BQU0sS0FBSyxHQUFxQixVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDM0UsRUFBRSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksd0JBQVk7b0JBQzdDLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxJQUFJLDZCQUFpQjtvQkFDdEQsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLDhCQUFrQjtvQkFDaEUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLGVBQU0sQ0FBQyxLQUFLLENBQUMsMkJBQWUsQ0FBQztvQkFDakUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsNkJBQWlCLENBQUMsSUFBSSx3QkFBWTtvQkFDdkUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxJQUFJLDZCQUFpQjtvQkFDekQsUUFBUSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxJQUFJLDRCQUFnQjtpQkFDdkQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0osSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QixDQUFDO1lBRUQsd0NBQXdDO1lBQ3hDLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO2dCQUNoQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsdUJBQVcsRUFBRSxDQUFDO29CQUNqQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsNkJBQWlCLENBQUMsQ0FBQztvQkFFL0Msd0NBQXdDO29CQUN4QyxJQUFJLFdBQVcsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQzt3QkFDbEUsMkNBQTJDO3dCQUMzQyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLHVCQUFXLEVBQUUsQ0FBQzs0QkFDL0MsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLDZCQUFpQixDQUFDLENBQUMsQ0FBQzt3QkFDcEQsQ0FBQztvQkFDSCxDQUFDO29CQUVELDRCQUE0QjtvQkFDNUIsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQ3ZCLHFDQUFxQzt3QkFDcEMsSUFBSSxDQUFDLFdBQXVDLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzlGLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFFRCwrREFBK0Q7WUFDL0QsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxlQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7b0JBQzdELENBQUMsQ0FBQyxVQUFVLENBQUMsV0FBVztvQkFDeEIsQ0FBQyxDQUFDLGVBQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSx3QkFBWSxDQUFDLENBQUM7WUFDeEQsQ0FBQztZQUVELDBCQUEwQjtZQUMxQixJQUFJLFVBQVUsQ0FBQyxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hELENBQUM7WUFFRCwwQkFBMEI7WUFDMUIsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNsRCxnQ0FBZ0M7Z0JBQy9CLElBQUksQ0FBQyxXQUF1QyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ3hFLENBQUM7WUFFRCxzQkFBc0I7WUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFcEMsNEJBQTRCO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQywwQ0FBOEIsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLGdDQUFxQixFQUFFLENBQUM7Z0JBQzNDLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUNELE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxHQUFHLDJDQUErQixLQUFLLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQW1CO1FBQ3JDLElBQUksQ0FBQztZQUNILGtFQUFrRTtZQUNsRSxNQUFNLEVBQUUsR0FBRyxVQUtWLENBQUM7WUFFRixpREFBaUQ7WUFDakQsSUFBSSxDQUFDLEVBQUUsSUFBSSxPQUFPLEVBQUUsS0FBSyw4QkFBa0IsRUFBRSxDQUFDO2dCQUM1QyxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCxvRUFBb0U7WUFDcEUsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN6QixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxtREFBbUQ7WUFDbkQsK0VBQStFO1lBQy9FLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDMUUsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUM1QixFQUFFLENBQUMsV0FBVyxJQUFJLENBQUMsZUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsV0FBVyxLQUFLLFFBQVEsQ0FBQyxDQUMxRixDQUFDO1lBRUYscURBQXFEO1lBQ3JELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFFN0YsMERBQTBEO1lBQzFELElBQUksWUFBWSxJQUFJLGNBQWMsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDbkQsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsaUVBQWlFO1lBQ2pFLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLFVBQW1CO1FBQzlCLE9BQU8sa0JBQWtCLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7O09BR0c7SUFDTyxxQkFBcUI7UUFDN0IsNkNBQTZDO1FBQzdDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjO1lBQUUsT0FBTztRQUU1QyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksZ0NBQXFCLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksZ0NBQXFCLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsaURBQWlEO1lBQ2pELE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLGVBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRWhHLHNDQUFzQztZQUN0QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLFdBQVcsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sRUFBRTtvQkFDTixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBQ2pDLE9BQU8sRUFBRSxlQUFNLENBQUMsS0FBSyxDQUFDLDJCQUFlLENBQUMsRUFBRSx5RUFBeUU7b0JBQ2pILFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO29CQUN6QixRQUFRLEVBQUUsRUFBRSxFQUFFLHlFQUF5RTtpQkFDeEY7YUFDRixDQUFDLENBQUMsQ0FBQztZQUVKLDhEQUE4RDtZQUM5RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsd0JBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBYSxDQUFDO1lBRTNHLGdCQUFnQjtZQUNoQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLCtCQUFtQixDQUFDLENBQUMsQ0FBQyxvQkFBb0I7WUFFMUYsa0RBQWtEO1lBQ2xELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDcEcsZUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQ3pCLENBQUM7WUFFRiw0REFBNEQ7WUFDNUQsdUVBQXVFO1lBQ3ZFLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVO2dCQUN0QyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhO2dCQUM1QyxXQUFXLEVBQUUsYUFBYTtnQkFDMUIsY0FBYyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ3hDLEdBQUcsSUFBSTtvQkFDUCxnQ0FBZ0M7b0JBQ2hDLE1BQU0sRUFBRSxlQUFNLENBQUMsSUFBSSxDQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxtQ0FBdUIsRUFBRSw4QkFBa0IsQ0FBQyxFQUMvRix3QkFBWSxDQUNiO29CQUNELE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87b0JBQzVCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtpQkFDN0IsQ0FBQyxDQUFDO2dCQUNILE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxPQUFPLEVBQUUsU0FBUzt3QkFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHO3dCQUNuRCxPQUFPLEVBQUUsZUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBZSxDQUFDLEVBQUUsMENBQTBDO3FCQUNuRjtpQkFDRjtnQkFDRCxHQUFHO2dCQUNILElBQUksRUFBRSx5QkFBYTtnQkFDbkIsYUFBYSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hFLFNBQVMsRUFBRSxlQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pELHVEQUF1RDtnQkFDdkQsYUFBYSxFQUFFLElBQUk7YUFDcEIsQ0FBQztZQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLGdDQUFxQixDQUFDLHVDQUF1QyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssb0JBQW9CLENBQUMsS0FBa0Q7UUFDN0UsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ2xDLE1BQU0sTUFBTSxHQUFHLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakgsT0FBTyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQ3hCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULENBQUM7SUFFRDs7OztPQUlHO0lBQ08sWUFBWTtRQUtwQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBd0IsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sV0FBVyxHQUFpQixFQUFFLENBQUM7UUFDckMsSUFBSSxXQUFXLEdBQUcsSUFBSSxzQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRW5DLHFDQUFxQztRQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQW9CLEVBQUUsRUFBRTtZQUMzQyw4REFBOEQ7WUFDOUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxzQkFBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxQyxXQUFXLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV2QyxnRUFBZ0U7WUFDaEUsTUFBTSxhQUFhLEdBQUc7Z0JBQ3BCLHNCQUFzQjtnQkFDdEIsSUFBSSxFQUFFLGVBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7Z0JBQ25DLFdBQVcsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBRXpDLG9CQUFvQjtnQkFDcEIsT0FBTyxFQUFFLGVBQU0sQ0FBQyxLQUFLLENBQUMsMkJBQWUsQ0FBQyxFQUFFLHVEQUF1RDtnQkFFL0YsbUJBQW1CO2dCQUNuQixNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDekIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxlQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFakUsZ0NBQWdDO2dCQUNoQyxhQUFhLEVBQUUsSUFBSTtnQkFDbkIsS0FBSyxFQUFFLG1DQUF1QjtnQkFFOUIsb0NBQW9DO2dCQUNwQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDMUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLGVBQU0sQ0FBQyxLQUFLLENBQUMsMkJBQWUsQ0FBQztnQkFDL0MsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUNkLGVBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxtQ0FBdUIsRUFBRSw4QkFBa0IsQ0FBQyxFQUFFLHdCQUFZLENBQUM7YUFDOUcsQ0FBQztZQUVGLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBNkMsQ0FBQyxDQUFDO1lBRTNELHFFQUFxRTtZQUNyRSxNQUFNLGtCQUFrQixHQUFHO2dCQUN6Qix1QkFBdUI7Z0JBQ3ZCLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNyRSxVQUFVLEVBQUUsRUFBYyxFQUFFLG1DQUFtQztnQkFFL0QsZ0NBQWdDO2dCQUNoQyxhQUFhLEVBQUUsSUFBSTtnQkFDbkIsS0FBSyxFQUFFLDJCQUFlO2dCQUV0QixvQ0FBb0M7Z0JBQ3BDLFlBQVksRUFBRSxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNsRixtQkFBbUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0I7Z0JBQzlELFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxlQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUNqQyxDQUFDO1lBRUYsV0FBVyxDQUFDLElBQUksQ0FBQyxrQkFBMkMsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLE1BQU07WUFDTixXQUFXO1lBQ1gsTUFBTSxFQUFFLFdBQVc7U0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLGtCQUFrQixDQUFDLE1BQTJCO1FBQ3RELCtDQUErQztRQUMvQyxvRUFBb0U7UUFFcEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxzQkFBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSw0QkFBZ0IsQ0FBQyxDQUFDLENBQUMscUJBQXFCO1FBQ3ZHLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDakMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsd0JBQXdCO1FBRS9DLHdEQUF3RDtRQUN4RCx1Q0FBdUM7UUFDdkMsbUNBQW1DO1FBQ25DLHNDQUFzQztRQUV0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLHNCQUFTLENBQUMscUJBQVMsQ0FBQyxDQUFDLENBQUMsNENBQTRDO1FBQ3ZGLE1BQU0sU0FBUyxHQUFHLElBQUksc0JBQVMsQ0FBQyxzQkFBVSxDQUFDLENBQUMsQ0FBQyw0Q0FBNEM7UUFFekYsK0NBQStDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLE9BQU87YUFDckIsSUFBSSxDQUFDLElBQUksc0JBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDL0MsSUFBSSxDQUFDLElBQUksc0JBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUVyRCxvREFBb0Q7UUFDcEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxzQkFBUyxDQUFDLCtCQUFtQixDQUFDLENBQUMsQ0FBQyw0QkFBNEI7UUFDbEYsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUxQywrQkFBK0I7UUFDL0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxzQkFBUyxDQUFDLHVCQUFXLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtRQUNwRSxPQUFPLHNCQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLEtBQXVCO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUN6QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLENBQUMsT0FBZTtRQUN6Qix1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksZ0NBQXFCLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNoRixDQUFDO1FBRUQsMkRBQTJEO1FBQzNELE1BQU0saUJBQWlCLEdBQUcsc0NBQTBCLENBQUM7UUFDckQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV0RSw4Q0FBOEM7UUFDOUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUN2RyxvREFBb0Q7WUFDcEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGVBQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUseUJBQWEsQ0FBQyxDQUFDO1lBQ3RFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELG9GQUFvRjtRQUNwRixJQUFJLElBQUEsc0JBQWMsRUFBQywrQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxlQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCx5REFBeUQ7UUFDekQsSUFBSSxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGVBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsMERBQTBEO1FBQzFELElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxlQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxlQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSx5QkFBYSxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBOWFELGdEQThhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQXRvbWljSW5DVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9hdG9taWNJbkNUcmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNmZXJhYmxlSW5wdXQsIENyZWRlbnRpYWwgfSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB1dGlscywgeyBjcmVhdGVIZXhSZWdleCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgVHgsIERlY29kZWRVdHhvT2JqIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0ZW5kZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgQVNTRVRfSURfTEVOR1RILFxuICBPVVRQVVRfSU5ERVhfSEVYX0xFTkdUSCxcbiAgQ0hBSU5fSURfSEVYX0xFTkdUSCxcbiAgREVGQVVMVF9CQVNFX0ZFRSxcbiAgREVGQVVMVF9FVk1fR0FTX0ZFRSxcbiAgSU5QVVRfRkVFLFxuICBPVVRQVVRfRkVFLFxuICBNSU5JTVVNX0ZFRSxcbiAgRU1QVFlfU1RSSU5HLFxuICBBTU9VTlRfU1RSSU5HX1pFUk8sXG4gIEZJUlNUX0FSUkFZX0lOREVYLFxuICBERUZBVUxUX1RIUkVTSE9MRCxcbiAgREVGQVVMVF9MT0NLVElNRSxcbiAgWkVST19OVU1CRVIsXG4gIEVSUk9SX1RSQU5TQUNUSU9OX1JFUVVJUkVELFxuICBFUlJPUl9CTE9DS0NIQUlOX0lEX01JU01BVENILFxuICBFUlJPUl9UUkFOU0FDVElPTl9QQVJTRV9GQUlMRUQsXG4gIEVSUk9SX0ZBSUxFRF9JTklUSUFMSVpFX0JVSUxERVIsXG4gIE9CSkVDVF9UWVBFX1NUUklORyxcbiAgSEVYX0VOQ09ESU5HLFxuICBWQUxJRF9JTVBPUlRfU09VUkNFX0NIQUlOUyxcbiAgUF9DSEFJTl9TSE9SVCxcbiAgVVRGOF9FTkNPRElORyxcbiAgSU1QT1JUX0NfVFlQRSxcbiAgVFJBTlNGRVJBQkxFX0lOUFVUX1RZUEUsXG4gIENSRURFTlRJQUxfVFlQRSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIEZsYXJlIFAtPkMgSW1wb3J0IFRyYW5zYWN0aW9uIEJ1aWxkZXJcbiAqIEJ1aWxkcyBpbXBvcnQgdHJhbnNhY3Rpb25zIGZyb20gUC1jaGFpbiB0byBDLWNoYWluIHVzaW5nIEZsYXJlSlNcbiAqL1xuZXhwb3J0IGNsYXNzIEltcG9ydEluQ1R4QnVpbGRlciBleHRlbmRzIEF0b21pY0luQ1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDLWNoYWluIGFkZHJlc3Mgd2hvIGlzIHRhcmdldCBvZiB0aGUgaW1wb3J0LlxuICAgKiBBZGRyZXNzIGZvcm1hdCBpcyBFdGhlcmV1bS1saWtlIGZvciBGbGFyZSBDLWNoYWluXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjQWRkcmVzcyAtIEMtY2hhaW4gYWRkcmVzcyAoaGV4IGZvcm1hdClcbiAgICovXG4gIHRvKGNBZGRyZXNzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAvLyBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIEMtY2hhaW4gYWRkcmVzc1xuICAgIGlmICghdXRpbHMuaXNWYWxpZEFkZHJlc3MoY0FkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIEMtY2hhaW4gYWRkcmVzczogJHtjQWRkcmVzc31gKTtcbiAgICB9XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdG8gPSBbY0FkZHJlc3NdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkltcG9ydDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpbml0QnVpbGRlcih0eDogVHgpOiB0aGlzIHtcbiAgICBpZiAoIXR4KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX1RSQU5TQUNUSU9OX1JFUVVJUkVEKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYm90aCBVbnNpZ25lZFR4IGFuZCBzaWduZWQgdHJhbnNhY3Rpb24gZm9ybWF0c1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgdW5zaWduZWRUeCA9ICh0eCBhcyBhbnkpLnVuc2lnbmVkVHggfHwgdHg7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRXh0cmFjdCBuZXR3b3JrIGFuZCBibG9ja2NoYWluIHZhbGlkYXRpb25cbiAgICAgIGlmICh1bnNpZ25lZFR4Lm5ldHdvcmtJRCAhPT0gdW5kZWZpbmVkICYmIHVuc2lnbmVkVHgubmV0d29ya0lEICE9PSB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrSUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICBgTmV0d29yayBJRCBtaXNtYXRjaDogZXhwZWN0ZWQgJHt0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrSUR9LCBnb3QgJHt1bnNpZ25lZFR4Lm5ldHdvcmtJRH1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh1bnNpZ25lZFR4LmJsb2NrY2hhaW5JRCAmJiAhdW5zaWduZWRUeC5ibG9ja2NoYWluSUQuZXF1YWxzKHRoaXMudHJhbnNhY3Rpb24uX2Jsb2NrY2hhaW5JRCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9CTE9DS0NIQUlOX0lEX01JU01BVENIKTtcbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBDLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvbiBkZXRhaWxzXG4gICAgICBpZiAodW5zaWduZWRUeC5pbXBvcnRJbnMgJiYgQXJyYXkuaXNBcnJheSh1bnNpZ25lZFR4LmltcG9ydElucykpIHtcbiAgICAgICAgLy8gRXh0cmFjdCBVVFhPcyBmcm9tIGltcG9ydCBpbnB1dHMgKHR5cGljYWxseSBmcm9tIFAtY2hhaW4pXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHV0eG9zOiBEZWNvZGVkVXR4b09ialtdID0gdW5zaWduZWRUeC5pbXBvcnRJbnMubWFwKChpbXBvcnRJbjogYW55KSA9PiAoe1xuICAgICAgICAgIGlkOiBpbXBvcnRJbi50eElEPy50b1N0cmluZygpIHx8IEVNUFRZX1NUUklORyxcbiAgICAgICAgICBvdXRwdXRJbmRleDogaW1wb3J0SW4ub3V0cHV0SW5kZXggfHwgRklSU1RfQVJSQVlfSU5ERVgsXG4gICAgICAgICAgYW1vdW50OiBpbXBvcnRJbi5pbnB1dD8uYW1vdW50Py50b1N0cmluZygpIHx8IEFNT1VOVF9TVFJJTkdfWkVSTyxcbiAgICAgICAgICBhc3NldElkOiBpbXBvcnRJbi5pbnB1dD8uYXNzZXRJRCB8fCBCdWZmZXIuYWxsb2MoQVNTRVRfSURfTEVOR1RIKSxcbiAgICAgICAgICBhZGRyZXNzOiBpbXBvcnRJbi5pbnB1dD8uYWRkcmVzc2VzPy5bRklSU1RfQVJSQVlfSU5ERVhdIHx8IEVNUFRZX1NUUklORyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IGltcG9ydEluLmlucHV0Py50aHJlc2hvbGQgfHwgREVGQVVMVF9USFJFU0hPTEQsXG4gICAgICAgICAgbG9ja3RpbWU6IGltcG9ydEluLmlucHV0Py5sb2NrdGltZSB8fCBERUZBVUxUX0xPQ0tUSU1FLFxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuYWRkVXR4b3ModXR4b3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBFeHRyYWN0IG91dHB1dHMgKEMtY2hhaW4gZGVzdGluYXRpb24pXG4gICAgICBpZiAodW5zaWduZWRUeC5vdXRzICYmIEFycmF5LmlzQXJyYXkodW5zaWduZWRUeC5vdXRzKSkge1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gdW5zaWduZWRUeC5vdXRzO1xuICAgICAgICBpZiAob3V0cHV0cy5sZW5ndGggPiBaRVJPX05VTUJFUikge1xuICAgICAgICAgIGNvbnN0IGZpcnN0T3V0cHV0ID0gb3V0cHV0c1tGSVJTVF9BUlJBWV9JTkRFWF07XG5cbiAgICAgICAgICAvLyBDLWNoYWluIHVzZXMgRXRoZXJldW0tc3R5bGUgYWRkcmVzc2VzXG4gICAgICAgICAgaWYgKGZpcnN0T3V0cHV0LmFkZHJlc3NlcyAmJiBBcnJheS5pc0FycmF5KGZpcnN0T3V0cHV0LmFkZHJlc3NlcykpIHtcbiAgICAgICAgICAgIC8vIFNldCB0aGUgZmlyc3QgYWRkcmVzcyBhcyB0aGUgZGVzdGluYXRpb25cbiAgICAgICAgICAgIGlmIChmaXJzdE91dHB1dC5hZGRyZXNzZXMubGVuZ3RoID4gWkVST19OVU1CRVIpIHtcbiAgICAgICAgICAgICAgdGhpcy50byhmaXJzdE91dHB1dC5hZGRyZXNzZXNbRklSU1RfQVJSQVlfSU5ERVhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IGFtb3VudCBpZiBwcmVzZW50XG4gICAgICAgICAgaWYgKGZpcnN0T3V0cHV0LmFtb3VudCkge1xuICAgICAgICAgICAgLy8gU3RvcmUgb3V0cHV0IGFtb3VudCBmb3IgdmFsaWRhdGlvblxuICAgICAgICAgICAgKHRoaXMudHJhbnNhY3Rpb24gYXMgQmFzZUV4dGVuZGVkVHJhbnNhY3Rpb24pLl9vdXRwdXRBbW91bnQgPSBmaXJzdE91dHB1dC5hbW91bnQudG9TdHJpbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBzb3VyY2UgY2hhaW4gKHR5cGljYWxseSBQLWNoYWluIGZvciBDLWNoYWluIGltcG9ydHMpXG4gICAgICBpZiAodW5zaWduZWRUeC5zb3VyY2VDaGFpbikge1xuICAgICAgICB0aGlzLl9leHRlcm5hbENoYWluSWQgPSBCdWZmZXIuaXNCdWZmZXIodW5zaWduZWRUeC5zb3VyY2VDaGFpbilcbiAgICAgICAgICA/IHVuc2lnbmVkVHguc291cmNlQ2hhaW5cbiAgICAgICAgICA6IEJ1ZmZlci5mcm9tKHVuc2lnbmVkVHguc291cmNlQ2hhaW4sIEhFWF9FTkNPRElORyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3QgZmVlIGluZm9ybWF0aW9uXG4gICAgICBpZiAodW5zaWduZWRUeC5mZWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlID0gdW5zaWduZWRUeC5mZWUudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBtZW1vIGlmIHByZXNlbnRcbiAgICAgIGlmICh1bnNpZ25lZFR4Lm1lbW8gJiYgdW5zaWduZWRUeC5tZW1vLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gU3RvcmUgbWVtbyBkYXRhIGZvciBsYXRlciB1c2VcbiAgICAgICAgKHRoaXMudHJhbnNhY3Rpb24gYXMgQmFzZUV4dGVuZGVkVHJhbnNhY3Rpb24pLl9tZW1vID0gdW5zaWduZWRUeC5tZW1vO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHRyYW5zYWN0aW9uXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKHR4KTtcblxuICAgICAgLy8gVmFsaWRhdGUgdHJhbnNhY3Rpb24gdHlwZVxuICAgICAgaWYgKCF0aGlzLnZlcmlmeVR4VHlwZSh0eCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9UUkFOU0FDVElPTl9QQVJTRV9GQUlMRUQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGAke0VSUk9SX0ZBSUxFRF9JTklUSUFMSVpFX0JVSUxERVJ9OiAke2Vycm9yfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0cmFuc2FjdGlvbiB0eXBlIGZvciBGbGFyZUpTIGltcG9ydCB0cmFuc2FjdGlvbnNcbiAgICogQHBhcmFtIHt1bmtub3dufSB1bnNpZ25lZFR4IC0gRmxhcmVKUyBVbnNpZ25lZFR4XG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdHJhbnNhY3Rpb24gaXMgdmFsaWQgaW1wb3J0IHR5cGVcbiAgICovXG4gIHN0YXRpYyB2ZXJpZnlUeFR5cGUodW5zaWduZWRUeDogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBpZiB0cmFuc2FjdGlvbiBoYXMgdGhlIHN0cnVjdHVyZSBvZiBhbiBpbXBvcnQgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IHR4ID0gdW5zaWduZWRUeCBhcyB7XG4gICAgICAgIGltcG9ydElucz86IHVua25vd25bXTtcbiAgICAgICAgc291cmNlQ2hhaW4/OiBCdWZmZXIgfCBzdHJpbmc7XG4gICAgICAgIHRvPzogQnVmZmVyIHwgc3RyaW5nO1xuICAgICAgICB0eXBlPzogc3RyaW5nO1xuICAgICAgfTtcblxuICAgICAgLy8gSWYgdHJhbnNhY3Rpb24gaXMgbnVsbC91bmRlZmluZWQsIHJldHVybiBmYWxzZVxuICAgICAgaWYgKCF0eCB8fCB0eXBlb2YgdHggIT09IE9CSkVDVF9UWVBFX1NUUklORykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSBwbGFjZWhvbGRlciB3aXRoIHR5cGUgJ2ltcG9ydCcsIGFjY2VwdCBpdCAoZm9yIHRlc3RpbmcpXG4gICAgICBpZiAodHgudHlwZSA9PT0gJ2ltcG9ydCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBpbXBvcnQgdHJhbnNhY3Rpb24gc3BlY2lmaWMgcHJvcGVydGllc1xuICAgICAgLy8gSW1wb3J0VHggc2hvdWxkIGhhdmUgc291cmNlQ2hhaW4sIGltcG9ydElucywgYW5kIGRlc3RpbmF0aW9uIEMtY2hhaW4gYWRkcmVzc1xuICAgICAgY29uc3QgaGFzSW1wb3J0SW5zID0gQm9vbGVhbih0eC5pbXBvcnRJbnMgJiYgQXJyYXkuaXNBcnJheSh0eC5pbXBvcnRJbnMpKTtcbiAgICAgIGNvbnN0IGhhc1NvdXJjZUNoYWluID0gQm9vbGVhbihcbiAgICAgICAgdHguc291cmNlQ2hhaW4gJiYgKEJ1ZmZlci5pc0J1ZmZlcih0eC5zb3VyY2VDaGFpbikgfHwgdHlwZW9mIHR4LnNvdXJjZUNoYWluID09PSAnc3RyaW5nJylcbiAgICAgICk7XG5cbiAgICAgIC8vIEZvciBDLWNoYWluIGltcG9ydHMsIGNoZWNrIEVWTS1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCBoYXNUb0FkZHJlc3MgPSBCb29sZWFuKHR4LnRvICYmIChCdWZmZXIuaXNCdWZmZXIodHgudG8pIHx8IHR5cGVvZiB0eC50byA9PT0gJ3N0cmluZycpKTtcblxuICAgICAgLy8gSWYgaXQgaGFzIGFsbCBpbXBvcnQgdHJhbnNhY3Rpb24gcHJvcGVydGllcywgaXQncyB2YWxpZFxuICAgICAgaWYgKGhhc0ltcG9ydElucyAmJiBoYXNTb3VyY2VDaGFpbiAmJiBoYXNUb0FkZHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBvdGhlciBjYXNlcyAoZW1wdHkgb2JqZWN0cywgZGlmZmVyZW50IHR5cGVzKSwgcmV0dXJuIGZhbHNlXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB2ZXJpZnlUeFR5cGUodW5zaWduZWRUeDogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBJbXBvcnRJbkNUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHVuc2lnbmVkVHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBpbXBvcnQgQy1jaGFpbiB0cmFuc2FjdGlvbiB1c2luZyBGbGFyZUpTIGV2bS5uZXdJbXBvcnRUeFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRGbGFyZVRyYW5zYWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIGlmIHR4IGhhcyBjcmVkZW50aWFscywgdHggc2hvdWxkbid0IGNoYW5nZVxuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLmhhc0NyZWRlbnRpYWxzKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5fdG8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdDLWNoYWluIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdXR4b3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdVVFhPcyBhcmUgcmVxdWlyZWQgZm9yIGltcG9ydCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBQcmVwYXJlIHBhcmFtZXRlcnMgZm9yIEZsYXJlSlMgZXZtLm5ld0ltcG9ydFR4XG4gICAgICBjb25zdCB0b0FkZHJlc3MgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl90b1swXS5yZXBsYWNlKCcweCcsICcnKSwgJ2hleCcpKTtcblxuICAgICAgLy8gQ29udmVydCBvdXIgVVRYT3MgdG8gRmxhcmVKUyBmb3JtYXRcbiAgICAgIGNvbnN0IGZsYXJlVXR4b3MgPSB0aGlzLl91dHhvcy5tYXAoKHV0eG8pID0+ICh7XG4gICAgICAgIHR4SUQ6IHV0eG8udHhpZCxcbiAgICAgICAgb3V0cHV0SW5kZXg6IHBhcnNlSW50KHV0eG8ub3V0cHV0aWR4LCAxMCksXG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIGFtb3VudDogKCkgPT4gQmlnSW50KHV0eG8uYW1vdW50KSxcbiAgICAgICAgICBhc3NldElEOiBCdWZmZXIuYWxsb2MoQVNTRVRfSURfTEVOR1RIKSwgLy8gRGVmYXVsdCBhc3NldCBJRCwgc2hvdWxkIGJlIGV4dHJhY3RlZCBmcm9tIFVUWE8gaW4gcmVhbCBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgIGFkZHJlc3NlczogdXR4by5hZGRyZXNzZXMsXG4gICAgICAgICAgdGhyZXNob2xkOiB1dHhvLnRocmVzaG9sZCxcbiAgICAgICAgICBsb2NrdGltZTogMG4sIC8vIERlZmF1bHQgbG9ja3RpbWUsIHNob3VsZCBiZSBleHRyYWN0ZWQgZnJvbSBVVFhPIGluIHJlYWwgaW1wbGVtZW50YXRpb25cbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgLy8gR2V0IHNvdXJjZSBjaGFpbiBJRCAodHlwaWNhbGx5IFAtY2hhaW4gZm9yIEMtY2hhaW4gaW1wb3J0cylcbiAgICAgIGNvbnN0IHNvdXJjZUNoYWluSWQgPSB0aGlzLl9leHRlcm5hbENoYWluSWQgPyB0aGlzLl9leHRlcm5hbENoYWluSWQudG9TdHJpbmcoSEVYX0VOQ09ESU5HKSA6IFBfQ0hBSU5fU0hPUlQ7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBmZWVcbiAgICAgIGNvbnN0IGZlZSA9IEJpZ0ludCh0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlIHx8IERFRkFVTFRfRVZNX0dBU19GRUUpOyAvLyBFVk0tc3R5bGUgZ2FzIGZlZVxuXG4gICAgICAvLyBQcmVwYXJlIHNvdXJjZSBhZGRyZXNzZXMgZnJvbSBVVFhPcyBmb3IgRmxhcmVKU1xuICAgICAgY29uc3QgZnJvbUFkZHJlc3NlcyA9IEFycmF5LmZyb20obmV3IFNldCh0aGlzLl91dHhvcy5mbGF0TWFwKCh1dHhvKSA9PiB1dHhvLmFkZHJlc3NlcykpKS5tYXAoKGFkZHIpID0+XG4gICAgICAgIEJ1ZmZlci5mcm9tKGFkZHIsICdoZXgnKVxuICAgICAgKTtcblxuICAgICAgLy8gRW5oYW5jZWQgaW1wbGVtZW50YXRpb24gLSBwcmVwYXJlIGZvciBGbGFyZUpTIGludGVncmF0aW9uXG4gICAgICAvLyBDcmVhdGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlIGNvbXBhdGlibGUgd2l0aCBGbGFyZUpTIGV2bS5uZXdJbXBvcnRUeFxuICAgICAgY29uc3QgZW5oYW5jZWRUeCA9IHtcbiAgICAgICAgbmV0d29ya0lEOiB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrSUQsXG4gICAgICAgIGJsb2NrY2hhaW5JRDogdGhpcy50cmFuc2FjdGlvbi5fYmxvY2tjaGFpbklELFxuICAgICAgICBzb3VyY2VDaGFpbjogc291cmNlQ2hhaW5JZCxcbiAgICAgICAgaW1wb3J0ZWRJbnB1dHM6IGZsYXJlVXR4b3MubWFwKCh1dHhvKSA9PiAoe1xuICAgICAgICAgIC4uLnV0eG8sXG4gICAgICAgICAgLy8gQWRkIEZsYXJlSlMtY29tcGF0aWJsZSBmaWVsZHNcbiAgICAgICAgICB1dHhvSUQ6IEJ1ZmZlci5mcm9tKFxuICAgICAgICAgICAgdXR4by50eElEICsgdXR4by5vdXRwdXRJbmRleC50b1N0cmluZygxNikucGFkU3RhcnQoT1VUUFVUX0lOREVYX0hFWF9MRU5HVEgsIEFNT1VOVF9TVFJJTkdfWkVSTyksXG4gICAgICAgICAgICBIRVhfRU5DT0RJTkdcbiAgICAgICAgICApLFxuICAgICAgICAgIGFzc2V0SUQ6IHV0eG8ub3V0cHV0LmFzc2V0SUQsXG4gICAgICAgICAgYW1vdW50OiB1dHhvLm91dHB1dC5hbW91bnQoKSxcbiAgICAgICAgfSkpLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdG9BZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50KGZsYXJlVXR4b3MpIC0gZmVlLFxuICAgICAgICAgICAgYXNzZXRJRDogQnVmZmVyLmFsbG9jKEFTU0VUX0lEX0xFTkdUSCksIC8vIERlZmF1bHQgYXNzZXQgSUQgZm9yIEZsYXJlIG5hdGl2ZSB0b2tlblxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZSxcbiAgICAgICAgdHlwZTogSU1QT1JUX0NfVFlQRSxcbiAgICAgICAgZnJvbUFkZHJlc3NlczogZnJvbUFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IGFkZHIudG9TdHJpbmcoJ2hleCcpKSxcbiAgICAgICAgdG9BZGRyZXNzOiBCdWZmZXIuZnJvbSh0b0FkZHJlc3MpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgLy8gQWRkIEZsYXJlSlMtc3BlY2lmaWMgbWV0YWRhdGEgZm9yIGZ1dHVyZSBpbnRlZ3JhdGlvblxuICAgICAgICBfZmxhcmVKU1JlYWR5OiB0cnVlLFxuICAgICAgfTtcblxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbihlbmhhbmNlZFR4KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgRmFpbGVkIHRvIGJ1aWxkIGltcG9ydCB0cmFuc2FjdGlvbjogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRvdGFsIGFtb3VudCBmcm9tIFVUWE9zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVRvdGFsQW1vdW50KHV0eG9zOiBBcnJheTx7IG91dHB1dDogeyBhbW91bnQ6ICgpID0+IGJpZ2ludCB9IH0+KTogYmlnaW50IHtcbiAgICByZXR1cm4gdXR4b3MucmVkdWNlKCh0b3RhbCwgdXR4bykgPT4ge1xuICAgICAgY29uc3QgYW1vdW50ID0gdHlwZW9mIHV0eG8ub3V0cHV0LmFtb3VudCA9PT0gJ2Z1bmN0aW9uJyA/IHV0eG8ub3V0cHV0LmFtb3VudCgpIDogQmlnSW50KHV0eG8ub3V0cHV0LmFtb3VudCB8fCAwKTtcbiAgICAgIHJldHVybiB0b3RhbCArIGFtb3VudDtcbiAgICB9LCAwbik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGlucHV0cyBmb3IgdGhlIGltcG9ydCB0cmFuc2FjdGlvbiBmcm9tIFVUWE9zXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IC0gSW5wdXRzLCB0b3RhbCBhbW91bnQsIGFuZCBjcmVkZW50aWFsc1xuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlSW5wdXRzKCk6IHtcbiAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgICBhbW91bnQ6IEJpZ051bWJlcjtcbiAgfSB7XG4gICAgaWYgKHRoaXMuX3V0eG9zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTm8gVVRYT3MgYXZhaWxhYmxlIGZvciBpbXBvcnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdID0gW107XG4gICAgbGV0IHRvdGFsQW1vdW50ID0gbmV3IEJpZ051bWJlcigwKTtcblxuICAgIC8vIFByb2Nlc3MgZWFjaCBVVFhPIHRvIGNyZWF0ZSBpbnB1dHNcbiAgICB0aGlzLl91dHhvcy5mb3JFYWNoKCh1dHhvOiBEZWNvZGVkVXR4b09iaikgPT4ge1xuICAgICAgLy8gQ29udmVydCBVVFhPIHRvIEZsYXJlSlMtY29tcGF0aWJsZSBUcmFuc2ZlcmFibGVJbnB1dCBmb3JtYXRcbiAgICAgIGNvbnN0IGFtb3VudCA9IG5ldyBCaWdOdW1iZXIodXR4by5hbW91bnQpO1xuICAgICAgdG90YWxBbW91bnQgPSB0b3RhbEFtb3VudC5wbHVzKGFtb3VudCk7XG5cbiAgICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBpbnB1dCBzdHJ1Y3R1cmUgcmVhZHkgZm9yIEZsYXJlSlMgaW50ZWdyYXRpb25cbiAgICAgIGNvbnN0IGVuaGFuY2VkSW5wdXQgPSB7XG4gICAgICAgIC8vIFVUWE8gaWRlbnRpZmljYXRpb25cbiAgICAgICAgdHhJRDogQnVmZmVyLmZyb20odXR4by50eGlkLCAnaGV4JyksXG4gICAgICAgIG91dHB1dEluZGV4OiBwYXJzZUludCh1dHhvLm91dHB1dGlkeCwgMTApLFxuXG4gICAgICAgIC8vIEFzc2V0IGluZm9ybWF0aW9uXG4gICAgICAgIGFzc2V0SUQ6IEJ1ZmZlci5hbGxvYyhBU1NFVF9JRF9MRU5HVEgpLCAvLyBTaG91bGQgYmUgZXh0cmFjdGVkIGZyb20gVVRYTyBpbiByZWFsIGltcGxlbWVudGF0aW9uXG5cbiAgICAgICAgLy8gVHJhbnNmZXIgZGV0YWlsc1xuICAgICAgICBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpLFxuICAgICAgICBsb2NrdGltZTogQmlnSW50KDApLFxuICAgICAgICB0aHJlc2hvbGQ6IHV0eG8udGhyZXNob2xkLFxuICAgICAgICBhZGRyZXNzZXM6IHV0eG8uYWRkcmVzc2VzLm1hcCgoYWRkcikgPT4gQnVmZmVyLmZyb20oYWRkciwgJ2hleCcpKSxcblxuICAgICAgICAvLyBGbGFyZUpTIGNvbXBhdGliaWxpdHkgbWFya2Vyc1xuICAgICAgICBfZmxhcmVKU1JlYWR5OiB0cnVlLFxuICAgICAgICBfdHlwZTogVFJBTlNGRVJBQkxFX0lOUFVUX1RZUEUsXG5cbiAgICAgICAgLy8gTWV0aG9kcyBmb3IgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAgICAgIGdldEFtb3VudDogKCkgPT4gQmlnSW50KGFtb3VudC50b1N0cmluZygpKSxcbiAgICAgICAgZ2V0QXNzZXRJRDogKCkgPT4gQnVmZmVyLmFsbG9jKEFTU0VUX0lEX0xFTkdUSCksXG4gICAgICAgIGdldFVUWE9JRDogKCkgPT5cbiAgICAgICAgICBCdWZmZXIuZnJvbSh1dHhvLnR4aWQgKyB1dHhvLm91dHB1dGlkeC5wYWRTdGFydChPVVRQVVRfSU5ERVhfSEVYX0xFTkdUSCwgQU1PVU5UX1NUUklOR19aRVJPKSwgSEVYX0VOQ09ESU5HKSxcbiAgICAgIH07XG5cbiAgICAgIGlucHV0cy5wdXNoKGVuaGFuY2VkSW5wdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVJbnB1dCk7XG5cbiAgICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBjcmVkZW50aWFsIHN0cnVjdHVyZSByZWFkeSBmb3IgRmxhcmVKUyBpbnRlZ3JhdGlvblxuICAgICAgY29uc3QgZW5oYW5jZWRDcmVkZW50aWFsID0ge1xuICAgICAgICAvLyBTaWduYXR1cmUgbWFuYWdlbWVudFxuICAgICAgICBzaWduYXR1cmVJbmRpY2VzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiB1dHhvLnRocmVzaG9sZCB9LCAoXywgaSkgPT4gaSksXG4gICAgICAgIHNpZ25hdHVyZXM6IFtdIGFzIEJ1ZmZlcltdLCAvLyBXaWxsIGJlIHBvcHVsYXRlZCBkdXJpbmcgc2lnbmluZ1xuXG4gICAgICAgIC8vIEZsYXJlSlMgY29tcGF0aWJpbGl0eSBtYXJrZXJzXG4gICAgICAgIF9mbGFyZUpTUmVhZHk6IHRydWUsXG4gICAgICAgIF90eXBlOiBDUkVERU5USUFMX1RZUEUsXG5cbiAgICAgICAgLy8gTWV0aG9kcyBmb3IgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAgICAgIGFkZFNpZ25hdHVyZTogKHNpZ25hdHVyZTogQnVmZmVyKSA9PiBlbmhhbmNlZENyZWRlbnRpYWwuc2lnbmF0dXJlcy5wdXNoKHNpZ25hdHVyZSksXG4gICAgICAgIGdldFNpZ25hdHVyZUluZGljZXM6ICgpID0+IGVuaGFuY2VkQ3JlZGVudGlhbC5zaWduYXR1cmVJbmRpY2VzLFxuICAgICAgICBzZXJpYWxpemU6ICgpID0+IEJ1ZmZlci5hbGxvYygwKSxcbiAgICAgIH07XG5cbiAgICAgIGNyZWRlbnRpYWxzLnB1c2goZW5oYW5jZWRDcmVkZW50aWFsIGFzIHVua25vd24gYXMgQ3JlZGVudGlhbCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXRzLFxuICAgICAgY3JlZGVudGlhbHMsXG4gICAgICBhbW91bnQ6IHRvdGFsQW1vdW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGltcG9ydCB0cmFuc2FjdGlvbiBmZWUgdXNpbmcgRmxhcmVKU1xuICAgKiBAcGFyYW0ge1RyYW5zZmVyYWJsZUlucHV0W119IGlucHV0cyAtIFRyYW5zYWN0aW9uIGlucHV0c1xuICAgKiBAcmV0dXJucyB7QmlnTnVtYmVyfSAtIENhbGN1bGF0ZWQgZmVlIGFtb3VudFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgY2FsY3VsYXRlSW1wb3J0RmVlKGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSk6IEJpZ051bWJlciB7XG4gICAgLy8gSW1wbGVtZW50IEZsYXJlSlMtY29tcGF0aWJsZSBmZWUgY2FsY3VsYXRpb25cbiAgICAvLyBUaGlzIGZvbGxvd3MgRmxhcmVKUyBmZWUgY2FsY3VsYXRpb24gcGF0dGVybnMgZm9yIEMtY2hhaW4gaW1wb3J0c1xuXG4gICAgY29uc3QgYmFzZUZlZSA9IG5ldyBCaWdOdW1iZXIodGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZVJhdGUgfHwgREVGQVVMVF9CQVNFX0ZFRSk7IC8vIDFNIG5hbm9GTFIgZGVmYXVsdFxuICAgIGNvbnN0IGlucHV0Q291bnQgPSBpbnB1dHMubGVuZ3RoO1xuICAgIGNvbnN0IG91dHB1dENvdW50ID0gMTsgLy8gU2luZ2xlIEMtY2hhaW4gb3V0cHV0XG5cbiAgICAvLyBGbGFyZUpTLXN0eWxlIGZlZSBjYWxjdWxhdGlvbiBmb3IgaW1wb3J0IHRyYW5zYWN0aW9uc1xuICAgIC8vIEJhc2UgZmVlIGNvdmVycyB0cmFuc2FjdGlvbiBvdmVyaGVhZFxuICAgIC8vIElucHV0IGZlZXMgY292ZXIgVVRYTyBwcm9jZXNzaW5nXG4gICAgLy8gT3V0cHV0IGZlZXMgY292ZXIgcmVzdWx0IGdlbmVyYXRpb25cblxuICAgIGNvbnN0IGlucHV0RmVlID0gbmV3IEJpZ051bWJlcihJTlBVVF9GRUUpOyAvLyAxMDBLIG5hbm9GTFIgcGVyIGlucHV0IChGbGFyZUpTIHN0YW5kYXJkKVxuICAgIGNvbnN0IG91dHB1dEZlZSA9IG5ldyBCaWdOdW1iZXIoT1VUUFVUX0ZFRSk7IC8vIDUwSyBuYW5vRkxSIHBlciBvdXRwdXQgKEZsYXJlSlMgc3RhbmRhcmQpXG5cbiAgICAvLyBDYWxjdWxhdGUgdG90YWwgZmVlOiBiYXNlICsgaW5wdXRzICsgb3V0cHV0c1xuICAgIGNvbnN0IHRvdGFsRmVlID0gYmFzZUZlZVxuICAgICAgLnBsdXMobmV3IEJpZ051bWJlcihpbnB1dENvdW50KS50aW1lcyhpbnB1dEZlZSkpXG4gICAgICAucGx1cyhuZXcgQmlnTnVtYmVyKG91dHB1dENvdW50KS50aW1lcyhvdXRwdXRGZWUpKTtcblxuICAgIC8vIEFkZCBDLWNoYWluIHNwZWNpZmljIGZlZXMgKEVWTSBnYXMgY29uc2lkZXJhdGlvbilcbiAgICBjb25zdCBldm1HYXNGZWUgPSBuZXcgQmlnTnVtYmVyKERFRkFVTFRfRVZNX0dBU19GRUUpOyAvLyBTdGFuZGFyZCBFVk0gdHJhbnNmZXIgZ2FzXG4gICAgY29uc3QgZmluYWxGZWUgPSB0b3RhbEZlZS5wbHVzKGV2bUdhc0ZlZSk7XG5cbiAgICAvLyBFbnN1cmUgbWluaW11bSBmZWUgdGhyZXNob2xkXG4gICAgY29uc3QgbWluaW11bUZlZSA9IG5ldyBCaWdOdW1iZXIoTUlOSU1VTV9GRUUpOyAvLyAxTSBuYW5vRkxSIG1pbmltdW1cbiAgICByZXR1cm4gQmlnTnVtYmVyLm1heChmaW5hbEZlZSwgbWluaW11bUZlZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIFVUWE9zIHRvIGJlIHVzZWQgYXMgaW5wdXRzIGZvciB0aGUgaW1wb3J0IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RGVjb2RlZFV0eG9PYmpbXX0gdXR4b3MgLSBVVFhPcyBmcm9tIFAtY2hhaW4gdG8gaW1wb3J0XG4gICAqL1xuICBhZGRVdHhvcyh1dHhvczogRGVjb2RlZFV0eG9PYmpbXSk6IHRoaXMge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh1dHhvcykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1VUWE9zIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICB0aGlzLl91dHhvcyA9IFsuLi50aGlzLl91dHhvcywgLi4udXR4b3NdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc291cmNlIGNoYWluIGZvciB0aGUgaW1wb3J0ICh0eXBpY2FsbHkgUC1jaGFpbilcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYWluSWQgLSBTb3VyY2UgY2hhaW4gSURcbiAgICovXG4gIHNvdXJjZUNoYWluKGNoYWluSWQ6IHN0cmluZyk6IHRoaXMge1xuICAgIC8vIFZhbGlkYXRlIGFuZCBzZXQgc291cmNlIGNoYWluIElEIGZvciBDLWNoYWluIGltcG9ydHNcbiAgICBpZiAoIWNoYWluSWQgfHwgdHlwZW9mIGNoYWluSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdTb3VyY2UgY2hhaW4gSUQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZCBzb3VyY2UgY2hhaW5zIGZvciBDLWNoYWluIGltcG9ydHMgaW4gRmxhcmUgbmV0d29ya1xuICAgIGNvbnN0IHZhbGlkU291cmNlQ2hhaW5zID0gVkFMSURfSU1QT1JUX1NPVVJDRV9DSEFJTlM7XG4gICAgY29uc3QgY2hhaW5JZE5vcm1hbGl6ZWQgPSBjaGFpbklkLnJlcGxhY2UoJy1jaGFpbicsICcnKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIHByZWRlZmluZWQgY2hhaW4gaWRlbnRpZmllclxuICAgIGlmICh2YWxpZFNvdXJjZUNoYWlucy5zb21lKChjaGFpbikgPT4gY2hhaW4ucmVwbGFjZSgnLWNoYWluJywgJycpLnRvVXBwZXJDYXNlKCkgPT09IGNoYWluSWROb3JtYWxpemVkKSkge1xuICAgICAgLy8gU3RvcmUgbm9ybWFsaXplZCBjaGFpbiBJRCAoZS5nLiwgJ1AnIGZvciBQLWNoYWluKVxuICAgICAgdGhpcy5fZXh0ZXJuYWxDaGFpbklkID0gQnVmZmVyLmZyb20oY2hhaW5JZE5vcm1hbGl6ZWQsIFVURjhfRU5DT0RJTkcpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGhleC1lbmNvZGVkIGNoYWluIElEIChDSEFJTl9JRF9IRVhfTEVOR1RIIGNoYXJhY3RlcnMgZm9yIEZsYXJlSlMpXG4gICAgaWYgKGNyZWF0ZUhleFJlZ2V4KENIQUlOX0lEX0hFWF9MRU5HVEgpLnRlc3QoY2hhaW5JZCkpIHtcbiAgICAgIHRoaXMuX2V4dGVybmFsQ2hhaW5JZCA9IEJ1ZmZlci5mcm9tKGNoYWluSWQsICdoZXgnKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBDQjU4LWVuY29kZWQgY2hhaW4gSUQgKEZsYXJlSlMgZm9ybWF0KVxuICAgIGlmICh1dGlscy5pc1ZhbGlkQWRkcmVzcyhjaGFpbklkKSkge1xuICAgICAgdGhpcy5fZXh0ZXJuYWxDaGFpbklkID0gdXRpbHMuY2I1OERlY29kZShjaGFpbklkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIG5vbmUgb2YgdGhlIGFib3ZlLCB0cnkgdG8gZGVjb2RlIGFzIGhleCBvciB1c2UgYXMtaXNcbiAgICB0cnkge1xuICAgICAgdGhpcy5fZXh0ZXJuYWxDaGFpbklkID0gQnVmZmVyLmZyb20oY2hhaW5JZCwgJ2hleCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9leHRlcm5hbENoYWluSWQgPSBCdWZmZXIuZnJvbShjaGFpbklkLCBVVEY4X0VOQ09ESU5HKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIl19
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
2
|
-
import { TransactionType } from '@bitgo-beta/sdk-core';
|
|
3
|
-
import { AtomicTransactionBuilder } from './atomicTransactionBuilder';
|
|
4
|
-
import { TransferableInput, TransferableOutput, Credential } from '@flarenetwork/flarejs';
|
|
5
|
-
import { Tx, DecodedUtxoObj } from './iface';
|
|
6
|
-
import BigNumber from 'bignumber.js';
|
|
7
|
-
/**
|
|
8
|
-
* Flare P-chain Import Transaction Builder
|
|
9
|
-
* Builds import transactions within P-chain (typically from C-chain to P-chain) using FlareJS
|
|
10
|
-
*/
|
|
11
|
-
export declare class ImportInPTxBuilder extends AtomicTransactionBuilder {
|
|
12
|
-
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
13
|
-
protected get transactionType(): TransactionType;
|
|
14
|
-
/**
|
|
15
|
-
* Initialize builder from existing FlareJS P-chain import transaction
|
|
16
|
-
* @param {Tx} tx - FlareJS UnsignedTx or signed transaction to initialize from
|
|
17
|
-
*/
|
|
18
|
-
initBuilder(tx: Tx): this;
|
|
19
|
-
/**
|
|
20
|
-
* Verify transaction type for FlareJS P-chain import transactions
|
|
21
|
-
* @param {unknown} unsignedTx - FlareJS UnsignedTx
|
|
22
|
-
* @returns {boolean} - Whether transaction is valid P-chain import type
|
|
23
|
-
*/
|
|
24
|
-
static verifyTxType(unsignedTx: unknown): boolean;
|
|
25
|
-
verifyTxType(unsignedTx: unknown): boolean;
|
|
26
|
-
/**
|
|
27
|
-
* Build the P-chain import transaction using FlareJS pvm.newImportTx
|
|
28
|
-
* @protected
|
|
29
|
-
*/
|
|
30
|
-
protected buildFlareTransaction(): void;
|
|
31
|
-
/**
|
|
32
|
-
* Calculate total amount from UTXOs
|
|
33
|
-
* @private
|
|
34
|
-
*/
|
|
35
|
-
private calculateTotalAmount;
|
|
36
|
-
/**
|
|
37
|
-
* Create inputs and outputs for P-chain import transaction
|
|
38
|
-
* @param {bigint} total - Total amount to import
|
|
39
|
-
* @returns {Object} - Inputs, outputs, and credentials
|
|
40
|
-
* @protected
|
|
41
|
-
*/
|
|
42
|
-
protected createInputOutput(total: bigint): {
|
|
43
|
-
inputs: TransferableInput[];
|
|
44
|
-
outputs: TransferableOutput[];
|
|
45
|
-
credentials: Credential[];
|
|
46
|
-
};
|
|
47
|
-
/**
|
|
48
|
-
* Add UTXOs to be used as inputs for the P-chain import transaction
|
|
49
|
-
* @param {DecodedUtxoObj[]} utxos - UTXOs from C-chain to import to P-chain
|
|
50
|
-
*/
|
|
51
|
-
addUtxos(utxos: DecodedUtxoObj[]): this;
|
|
52
|
-
/**
|
|
53
|
-
* Set the source chain for the import (typically C-chain)
|
|
54
|
-
* @param {string} chainId - Source chain ID
|
|
55
|
-
*/
|
|
56
|
-
sourceChain(chainId: string): this;
|
|
57
|
-
/**
|
|
58
|
-
* Set fee for the P-chain import transaction
|
|
59
|
-
* @param {string | number | BigNumber} fee - Fee amount in nanoFLR
|
|
60
|
-
*/
|
|
61
|
-
fee(fee: string | number | BigNumber): this;
|
|
62
|
-
/**
|
|
63
|
-
* Set locktime for the P-chain import transaction
|
|
64
|
-
* @param {number | bigint} locktime - Locktime value
|
|
65
|
-
*/
|
|
66
|
-
locktime(locktime: number | bigint): this;
|
|
67
|
-
/**
|
|
68
|
-
* Set threshold for the P-chain import transaction
|
|
69
|
-
* @param {number} threshold - Signature threshold
|
|
70
|
-
*/
|
|
71
|
-
threshold(threshold: number): this;
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=importInPTxBuilder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"importInPTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/importInPTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,EAA4B,iBAAiB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGpH,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,SAAS,MAAM,cAAc,CAAC;AAqBrC;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,wBAAwB;gBAClD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAW7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED;;;OAGG;IACH,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;IAyFzB;;;;OAIG;IACH,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO;IA2DjD,YAAY,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO;IAI1C;;;OAGG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAgGvC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;;;OAKG;IACH,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG;QAC1C,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,OAAO,EAAE,kBAAkB,EAAE,CAAC;QAC9B,WAAW,EAAE,UAAU,EAAE,CAAC;KAC3B;IAwFD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IASvC;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IA6ClC;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI;IAY3C;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKzC;;;OAGG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAQnC"}
|