@bitgo-beta/sdk-coin-flrp 1.0.1-beta.277 → 1.0.1-beta.279
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/lib/ExportInPTxBuilder.d.ts +15 -4
- package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/ExportInPTxBuilder.js +245 -43
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +68 -11
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +6 -1
- package/dist/src/lib/utils.d.ts +12 -0
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +26 -1
- package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
- package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInP.js +140 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInPTxBuilder.js +121 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts +0 -1
- package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -1
- package/dist/test/unit/lib/signFlowTestSuit.js +6 -3
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
2
2
|
import { TransactionType } from '@bitgo-beta/sdk-core';
|
|
3
3
|
import { AtomicTransactionBuilder } from './atomicTransactionBuilder';
|
|
4
|
-
import { TransferableOutput } from '@flarenetwork/flarejs';
|
|
4
|
+
import { TransferableInput, TransferableOutput, Credential } from '@flarenetwork/flarejs';
|
|
5
5
|
import { Tx } from './iface';
|
|
6
6
|
export declare class ExportInPTxBuilder extends AtomicTransactionBuilder {
|
|
7
7
|
private _amount;
|
|
@@ -12,14 +12,25 @@ export declare class ExportInPTxBuilder extends AtomicTransactionBuilder {
|
|
|
12
12
|
* @param {bigint | string} amount The withdrawal amount
|
|
13
13
|
*/
|
|
14
14
|
amount(value: bigint | string): this;
|
|
15
|
-
initBuilder(tx: Tx): this;
|
|
15
|
+
initBuilder(tx: Tx, rawBytes?: Buffer): this;
|
|
16
16
|
static verifyTxType(txnType: string): boolean;
|
|
17
17
|
verifyTxType(txnType: string): boolean;
|
|
18
18
|
/**
|
|
19
|
-
* Build the export transaction
|
|
19
|
+
* Build the export transaction for P-chain
|
|
20
20
|
* @protected
|
|
21
21
|
*/
|
|
22
22
|
protected buildFlareTransaction(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Create inputs from UTXOs for P-chain export
|
|
25
|
+
* Only selects enough UTXOs to cover the target amount (amount + fee)
|
|
26
|
+
* @returns inputs, change outputs, credentials, and total amount
|
|
27
|
+
*/
|
|
28
|
+
protected createExportInputs(): {
|
|
29
|
+
inputs: TransferableInput[];
|
|
30
|
+
changeOutputs: TransferableOutput[];
|
|
31
|
+
credentials: Credential[];
|
|
32
|
+
totalAmount: bigint;
|
|
33
|
+
};
|
|
23
34
|
/**
|
|
24
35
|
* Create the ExportedOutputs where the recipient address are the sender.
|
|
25
36
|
* Later an importTx should complete the operations signing with the same keys.
|
|
@@ -28,7 +39,7 @@ export declare class ExportInPTxBuilder extends AtomicTransactionBuilder {
|
|
|
28
39
|
protected exportedOutputs(): TransferableOutput[];
|
|
29
40
|
/**
|
|
30
41
|
* Recover UTXOs from inputs
|
|
31
|
-
* @param inputs Array of
|
|
42
|
+
* @param inputs Array of TransferableInput
|
|
32
43
|
* @returns Array of decoded UTXO objects
|
|
33
44
|
*/
|
|
34
45
|
private recoverUtxos;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExportInPTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/ExportInPTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAuC,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,
|
|
1
|
+
{"version":3,"file":"ExportInPTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/ExportInPTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAuC,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAOL,iBAAiB,EACjB,kBAAkB,EAMlB,UAAU,EAEX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAmE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE9F,qBAAa,kBAAmB,SAAQ,wBAAwB;IAC9D,OAAO,CAAC,OAAO,CAAS;gBAEZ,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAY7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOpC,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IA6J5C,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7C,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItC;;;OAGG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAoDvC;;;;OAIG;IACH,SAAS,CAAC,kBAAkB,IAAI;QAC9B,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,aAAa,EAAE,kBAAkB,EAAE,CAAC;QACpC,WAAW,EAAE,UAAU,EAAE,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;KACrB;IAwGD;;;;OAIG;IACH,SAAS,CAAC,eAAe,IAAI,kBAAkB,EAAE;IAgBjD;;;;OAIG;IACH,OAAO,CAAC,YAAY;CAkBrB"}
|
|
@@ -12,7 +12,12 @@ const iface_1 = require("./iface");
|
|
|
12
12
|
class ExportInPTxBuilder extends atomicTransactionBuilder_1.AtomicTransactionBuilder {
|
|
13
13
|
constructor(_coinConfig) {
|
|
14
14
|
super(_coinConfig);
|
|
15
|
+
// For Export FROM P-chain:
|
|
16
|
+
// - external chain (destination) is C-chain
|
|
17
|
+
// - blockchain ID (source) is P-chain
|
|
15
18
|
this._externalChainId = utils_1.default.cb58Decode(this.transaction._network.cChainBlockchainID);
|
|
19
|
+
// P-chain blockchain ID (from network config - decode from cb58 to hex)
|
|
20
|
+
this.transaction._blockchainID = Buffer.from(utils_1.default.cb58Decode(this.transaction._network.blockchainID)).toString('hex');
|
|
16
21
|
}
|
|
17
22
|
get transactionType() {
|
|
18
23
|
return sdk_core_1.TransactionType.Export;
|
|
@@ -27,36 +32,137 @@ class ExportInPTxBuilder extends atomicTransactionBuilder_1.AtomicTransactionBui
|
|
|
27
32
|
this._amount = valueBigInt;
|
|
28
33
|
return this;
|
|
29
34
|
}
|
|
30
|
-
initBuilder(tx) {
|
|
31
|
-
const
|
|
32
|
-
if (!this.verifyTxType(
|
|
35
|
+
initBuilder(tx, rawBytes) {
|
|
36
|
+
const exportTx = tx;
|
|
37
|
+
if (!this.verifyTxType(exportTx._type)) {
|
|
33
38
|
throw new sdk_core_1.NotSupported('Transaction cannot be parsed or has an unsupported transaction type');
|
|
34
39
|
}
|
|
35
40
|
// The exportedOutputs is a TransferableOutput array.
|
|
36
41
|
// It's expected to have only one output with the addresses of the sender.
|
|
37
|
-
const outputs =
|
|
42
|
+
const outputs = exportTx.outs;
|
|
38
43
|
if (outputs.length !== 1) {
|
|
39
44
|
throw new sdk_core_1.BuildTransactionError('Transaction can have one external output');
|
|
40
45
|
}
|
|
41
46
|
const output = outputs[0];
|
|
42
47
|
const outputTransfer = output.output;
|
|
43
48
|
const assetId = output.assetId.toBytes();
|
|
44
|
-
if (Buffer.compare(assetId, Buffer.from(this.transaction._assetId)) !== 0) {
|
|
49
|
+
if (Buffer.compare(Buffer.from(assetId), Buffer.from(this.transaction._assetId, 'hex')) !== 0) {
|
|
45
50
|
throw new Error('The Asset ID of the output does not match the transaction');
|
|
46
51
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
const outputOwners = outputTransfer.outputOwners;
|
|
53
|
+
// Set locktime from output
|
|
54
|
+
this.transaction._locktime = outputOwners.locktime.value();
|
|
55
|
+
// Set threshold from output
|
|
56
|
+
this.transaction._threshold = outputOwners.threshold.value();
|
|
57
|
+
// Convert output addresses to buffers and set as fromAddresses
|
|
53
58
|
this.transaction._fromAddresses = outputOwners.addrs.map((addr) => Buffer.from(addr.toBytes()));
|
|
54
59
|
// Set external chain ID from the destination chain
|
|
55
|
-
this._externalChainId = Buffer.from(
|
|
56
|
-
// Set amount from output
|
|
60
|
+
this._externalChainId = Buffer.from(exportTx.destination.toBytes());
|
|
61
|
+
// Set amount from exported output
|
|
57
62
|
this._amount = outputTransfer.amount();
|
|
58
|
-
// Recover UTXOs from inputs
|
|
59
|
-
this.transaction._utxos = this.recoverUtxos(baseTx.
|
|
63
|
+
// Recover UTXOs from base tx inputs
|
|
64
|
+
this.transaction._utxos = this.recoverUtxos([...exportTx.baseTx.inputs]);
|
|
65
|
+
// Calculate and set fee from input/output difference
|
|
66
|
+
const totalInputAmount = exportTx.baseTx.inputs.reduce((sum, input) => sum + input.amount(), BigInt(0));
|
|
67
|
+
const changeOutputAmount = exportTx.baseTx.outputs.reduce((sum, out) => {
|
|
68
|
+
const transferOut = out.output;
|
|
69
|
+
return sum + transferOut.amount();
|
|
70
|
+
}, BigInt(0));
|
|
71
|
+
const fee = totalInputAmount - changeOutputAmount - this._amount;
|
|
72
|
+
this.transaction._fee.fee = fee.toString();
|
|
73
|
+
// Extract credentials from raw bytes
|
|
74
|
+
let hasCredentials = false;
|
|
75
|
+
let credentials = [];
|
|
76
|
+
if (rawBytes) {
|
|
77
|
+
// Try standard extraction first
|
|
78
|
+
const result = utils_1.default.extractCredentialsFromRawBytes(rawBytes, exportTx, 'PVM');
|
|
79
|
+
hasCredentials = result.hasCredentials;
|
|
80
|
+
credentials = result.credentials;
|
|
81
|
+
// If extraction failed but raw bytes are longer, try parsing credentials at known offset
|
|
82
|
+
if ((!hasCredentials || credentials.length === 0) && rawBytes.length > 300) {
|
|
83
|
+
const codec = flarejs_1.utils.getManagerForVM('PVM').getDefaultCodec();
|
|
84
|
+
const txBytesLength = exportTx.toBytes(codec).length;
|
|
85
|
+
if (rawBytes.length > txBytesLength) {
|
|
86
|
+
hasCredentials = true;
|
|
87
|
+
const credResult = utils_1.default.parseCredentialsAtOffset(rawBytes, txBytesLength);
|
|
88
|
+
if (credResult.length > 0) {
|
|
89
|
+
credentials = credResult;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// If we have parsed credentials with the correct number of credentials for the inputs,
|
|
95
|
+
// use them directly (preserves existing signatures)
|
|
96
|
+
const numInputs = exportTx.baseTx.inputs.length;
|
|
97
|
+
const useDirectCredentials = hasCredentials && credentials.length === numInputs;
|
|
98
|
+
// If there are credentials in raw bytes, store the original bytes to preserve exact format
|
|
99
|
+
if (rawBytes && hasCredentials) {
|
|
100
|
+
this.transaction._rawSignedBytes = rawBytes;
|
|
101
|
+
}
|
|
102
|
+
// Create proper UnsignedTx wrapper with credentials
|
|
103
|
+
const sortedAddresses = [...this.transaction._fromAddresses].sort((a, b) => Buffer.compare(a, b));
|
|
104
|
+
// Helper function to check if a signature is empty (contains no real signature data)
|
|
105
|
+
// A real ECDSA signature will never start with 45 bytes of zeros
|
|
106
|
+
const isSignatureEmpty = (sig) => {
|
|
107
|
+
if (!sig)
|
|
108
|
+
return true;
|
|
109
|
+
const cleanSig = utils_1.default.removeHexPrefix(sig);
|
|
110
|
+
if (cleanSig.length === 0)
|
|
111
|
+
return true;
|
|
112
|
+
// Check if the first 90 hex chars (45 bytes) are all zeros
|
|
113
|
+
// Real signatures from secp256k1 will never have this pattern
|
|
114
|
+
const first90Chars = cleanSig.substring(0, 90);
|
|
115
|
+
return first90Chars === '0'.repeat(90) || first90Chars === '0'.repeat(first90Chars.length);
|
|
116
|
+
};
|
|
117
|
+
// Build txCredentials - either use direct credentials or reconstruct with embedded addresses
|
|
118
|
+
let txCredentials;
|
|
119
|
+
if (useDirectCredentials) {
|
|
120
|
+
// Use the extracted credentials directly - they already have the correct signatures
|
|
121
|
+
// Just ensure empty slots have embedded addresses for signing identification
|
|
122
|
+
txCredentials = credentials;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// Reconstruct credentials from scratch with embedded addresses
|
|
126
|
+
txCredentials = exportTx.baseTx.inputs.map((input, idx) => {
|
|
127
|
+
const transferInput = input.input;
|
|
128
|
+
const inputThreshold = transferInput.sigIndicies().length || this.transaction._threshold;
|
|
129
|
+
// Get existing signatures from parsed credentials if available
|
|
130
|
+
const existingSigs = [];
|
|
131
|
+
if (idx < credentials.length) {
|
|
132
|
+
const existingCred = credentials[idx];
|
|
133
|
+
existingSigs.push(...existingCred.getSignatures());
|
|
134
|
+
}
|
|
135
|
+
// Create credential with correct number of slots, preserving existing signatures
|
|
136
|
+
// Empty slots get embedded addresses for slot identification
|
|
137
|
+
const sigSlots = [];
|
|
138
|
+
for (let i = 0; i < inputThreshold; i++) {
|
|
139
|
+
const existingSig = i < existingSigs.length ? existingSigs[i] : null;
|
|
140
|
+
if (existingSig && !isSignatureEmpty(existingSig)) {
|
|
141
|
+
// Use existing non-empty signature (real signature from signing)
|
|
142
|
+
const sigHex = utils_1.default.removeHexPrefix(existingSig);
|
|
143
|
+
sigSlots.push(utils_1.default.createNewSig(sigHex));
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// Empty slot - create with embedded address for slot identification
|
|
147
|
+
const addrHex = Buffer.from(sortedAddresses[i]).toString('hex');
|
|
148
|
+
sigSlots.push(utils_1.default.createEmptySigWithAddress(addrHex));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return new flarejs_1.Credential(sigSlots);
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// Create address maps for signing - one per input/credential
|
|
155
|
+
// Each address map contains all addresses mapped to their indices
|
|
156
|
+
const addressMaps = txCredentials.map(() => {
|
|
157
|
+
const addressMap = new flarejs_1.utils.AddressMap();
|
|
158
|
+
sortedAddresses.forEach((addr, i) => {
|
|
159
|
+
addressMap.set(new flarejs_1.Address(addr), i);
|
|
160
|
+
});
|
|
161
|
+
return addressMap;
|
|
162
|
+
});
|
|
163
|
+
// Always create a new UnsignedTx with properly structured credentials
|
|
164
|
+
const unsignedTx = new flarejs_1.UnsignedTx(exportTx, [], new flarejs_1.utils.AddressMaps(addressMaps), txCredentials);
|
|
165
|
+
this.transaction.setTransaction(unsignedTx);
|
|
60
166
|
return this;
|
|
61
167
|
}
|
|
62
168
|
static verifyTxType(txnType) {
|
|
@@ -66,30 +172,125 @@ class ExportInPTxBuilder extends atomicTransactionBuilder_1.AtomicTransactionBui
|
|
|
66
172
|
return ExportInPTxBuilder.verifyTxType(txnType);
|
|
67
173
|
}
|
|
68
174
|
/**
|
|
69
|
-
* Build the export transaction
|
|
175
|
+
* Build the export transaction for P-chain
|
|
70
176
|
* @protected
|
|
71
177
|
*/
|
|
72
178
|
buildFlareTransaction() {
|
|
73
179
|
// if tx has credentials, tx shouldn't change
|
|
74
180
|
if (this.transaction.hasCredentials)
|
|
75
181
|
return;
|
|
76
|
-
const { inputs, credentials } = this.
|
|
77
|
-
//
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
);
|
|
182
|
+
const { inputs, changeOutputs, credentials, totalAmount } = this.createExportInputs();
|
|
183
|
+
// Calculate fee from transaction fee settings
|
|
184
|
+
const fee = BigInt(this.transaction.fee.fee);
|
|
185
|
+
const targetAmount = this._amount + fee;
|
|
186
|
+
// Verify we have enough funds
|
|
187
|
+
if (totalAmount < targetAmount) {
|
|
188
|
+
throw new sdk_core_1.BuildTransactionError(`Insufficient funds: have ${totalAmount}, need ${targetAmount}`);
|
|
189
|
+
}
|
|
190
|
+
// Create the BaseTx for the P-chain export transaction
|
|
191
|
+
const baseTx = new flarejs_1.avaxSerial.BaseTx(new flarejs_1.Int(this.transaction._networkID), new flarejs_1.Id(Buffer.from(this.transaction._blockchainID, 'hex')), changeOutputs, // change outputs
|
|
192
|
+
inputs, // inputs
|
|
193
|
+
new flarejs_1.Bytes(new Uint8Array(0)) // empty memo
|
|
194
|
+
);
|
|
195
|
+
// Create the P-chain export transaction using pvmSerial.ExportTx
|
|
196
|
+
const exportTx = new flarejs_1.pvmSerial.ExportTx(baseTx, new flarejs_1.Id(this._externalChainId), // destinationChain (C-chain)
|
|
197
|
+
this.exportedOutputs() // exportedOutputs
|
|
198
|
+
);
|
|
199
|
+
// Create address maps for signing - one per input/credential
|
|
200
|
+
const sortedAddresses = [...this.transaction._fromAddresses].sort((a, b) => Buffer.compare(a, b));
|
|
201
|
+
const addressMaps = credentials.map(() => {
|
|
202
|
+
const addressMap = new flarejs_1.utils.AddressMap();
|
|
203
|
+
sortedAddresses.forEach((addr, i) => {
|
|
204
|
+
addressMap.set(new flarejs_1.Address(addr), i);
|
|
205
|
+
});
|
|
206
|
+
return addressMap;
|
|
83
207
|
});
|
|
84
|
-
// Create
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
const addressMap = new flarejs_1.utils.AddressMap([[new flarejs_1.Address(this.transaction._fromAddresses[0]), 0]]);
|
|
88
|
-
const addressMaps = new flarejs_1.utils.AddressMaps([addressMap]);
|
|
89
|
-
const unsignedTx = new flarejs_1.UnsignedTx(exportTx, [], // Empty UTXOs array, will be filled during processing
|
|
90
|
-
addressMaps, credentials);
|
|
208
|
+
// Create unsigned transaction
|
|
209
|
+
const unsignedTx = new flarejs_1.UnsignedTx(exportTx, [], // Empty UTXOs array
|
|
210
|
+
new flarejs_1.utils.AddressMaps(addressMaps), credentials);
|
|
91
211
|
this.transaction.setTransaction(unsignedTx);
|
|
92
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* Create inputs from UTXOs for P-chain export
|
|
215
|
+
* Only selects enough UTXOs to cover the target amount (amount + fee)
|
|
216
|
+
* @returns inputs, change outputs, credentials, and total amount
|
|
217
|
+
*/
|
|
218
|
+
createExportInputs() {
|
|
219
|
+
const sender = [...this.transaction._fromAddresses];
|
|
220
|
+
if (this.recoverSigner) {
|
|
221
|
+
// switch first and last signer
|
|
222
|
+
const tmp = sender.pop();
|
|
223
|
+
sender.push(sender[0]);
|
|
224
|
+
if (tmp) {
|
|
225
|
+
sender[0] = tmp;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const fee = BigInt(this.transaction.fee.fee);
|
|
229
|
+
const targetAmount = this._amount + fee;
|
|
230
|
+
let totalAmount = BigInt(0);
|
|
231
|
+
const inputs = [];
|
|
232
|
+
const credentials = [];
|
|
233
|
+
// Change output threshold is always 1 (matching Flare protocol behavior)
|
|
234
|
+
// This allows easier spending of change while maintaining security for export outputs
|
|
235
|
+
const changeOutputThreshold = 1;
|
|
236
|
+
// Only consume enough UTXOs to cover the target amount (in array order)
|
|
237
|
+
// Inputs will be sorted after selection
|
|
238
|
+
for (const utxo of this.transaction._utxos) {
|
|
239
|
+
// Stop if we already have enough
|
|
240
|
+
if (totalAmount >= targetAmount) {
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
const amount = BigInt(utxo.amount);
|
|
244
|
+
totalAmount += amount;
|
|
245
|
+
// Use the UTXO's own threshold for signature indices
|
|
246
|
+
const utxoThreshold = utxo.threshold || this.transaction._threshold;
|
|
247
|
+
// Create signature indices for the UTXO's threshold
|
|
248
|
+
const sigIndices = [];
|
|
249
|
+
for (let i = 0; i < utxoThreshold; i++) {
|
|
250
|
+
sigIndices.push(i);
|
|
251
|
+
}
|
|
252
|
+
// Use fromNative to create TransferableInput
|
|
253
|
+
const txIdCb58 = utxo.txid; // Already cb58 encoded
|
|
254
|
+
const assetIdCb58 = utils_1.default.cb58Encode(Buffer.from(this.transaction._assetId, 'hex'));
|
|
255
|
+
const transferableInput = flarejs_1.TransferableInput.fromNative(txIdCb58, Number(utxo.outputidx), assetIdCb58, amount, sigIndices);
|
|
256
|
+
inputs.push(transferableInput);
|
|
257
|
+
// Create credential with empty signatures that have embedded addresses for slot identification
|
|
258
|
+
// This allows the signing logic to determine which slot belongs to which address
|
|
259
|
+
const sortedAddrs = [...this.transaction._fromAddresses].sort((a, b) => Buffer.compare(a, b));
|
|
260
|
+
const emptySignatures = sigIndices.map((idx) => {
|
|
261
|
+
const addrHex = Buffer.from(sortedAddrs[idx]).toString('hex');
|
|
262
|
+
return utils_1.default.createEmptySigWithAddress(addrHex);
|
|
263
|
+
});
|
|
264
|
+
credentials.push(new flarejs_1.Credential(emptySignatures));
|
|
265
|
+
}
|
|
266
|
+
// Create change output if there is remaining amount after export and fee
|
|
267
|
+
const changeOutputs = [];
|
|
268
|
+
const changeAmount = totalAmount - this._amount - fee;
|
|
269
|
+
if (changeAmount > BigInt(0)) {
|
|
270
|
+
const assetIdBytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
|
|
271
|
+
// Create OutputOwners with the P-chain addresses (sorted by byte value as per AVAX protocol)
|
|
272
|
+
// Use threshold=1 for change outputs (matching Flare protocol behavior)
|
|
273
|
+
const sortedAddresses = [...this.transaction._fromAddresses].sort((a, b) => Buffer.compare(a, b));
|
|
274
|
+
const outputOwners = new flarejs_1.OutputOwners(new flarejs_1.BigIntPr(this.transaction._locktime), new flarejs_1.Int(changeOutputThreshold), sortedAddresses.map((addr) => new flarejs_1.Address(addr)));
|
|
275
|
+
const transferOutput = new flarejs_1.TransferOutput(new flarejs_1.BigIntPr(changeAmount), outputOwners);
|
|
276
|
+
const changeOutput = new flarejs_1.TransferableOutput(new flarejs_1.Id(assetIdBytes), transferOutput);
|
|
277
|
+
changeOutputs.push(changeOutput);
|
|
278
|
+
}
|
|
279
|
+
// Sort inputs lexicographically by txid (Avalanche protocol requirement)
|
|
280
|
+
const sortedInputsWithCredentials = inputs
|
|
281
|
+
.map((input, i) => ({ input, credential: credentials[i] }))
|
|
282
|
+
.sort((a, b) => {
|
|
283
|
+
const aTxId = Buffer.from(a.input.utxoID.txID.toBytes());
|
|
284
|
+
const bTxId = Buffer.from(b.input.utxoID.txID.toBytes());
|
|
285
|
+
return Buffer.compare(aTxId, bTxId);
|
|
286
|
+
});
|
|
287
|
+
return {
|
|
288
|
+
inputs: sortedInputsWithCredentials.map((x) => x.input),
|
|
289
|
+
changeOutputs,
|
|
290
|
+
credentials: sortedInputsWithCredentials.map((x) => x.credential),
|
|
291
|
+
totalAmount,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
93
294
|
/**
|
|
94
295
|
* Create the ExportedOutputs where the recipient address are the sender.
|
|
95
296
|
* Later an importTx should complete the operations signing with the same keys.
|
|
@@ -97,32 +298,33 @@ class ExportInPTxBuilder extends atomicTransactionBuilder_1.AtomicTransactionBui
|
|
|
97
298
|
*/
|
|
98
299
|
exportedOutputs() {
|
|
99
300
|
const assetIdBytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
301
|
+
// Create OutputOwners with sorted addresses
|
|
302
|
+
const sortedAddresses = [...this.transaction._fromAddresses].sort((a, b) => Buffer.compare(a, b));
|
|
303
|
+
const outputOwners = new flarejs_1.OutputOwners(new flarejs_1.BigIntPr(this.transaction._locktime), new flarejs_1.Int(this.transaction._threshold), sortedAddresses.map((addr) => new flarejs_1.Address(addr)));
|
|
103
304
|
const output = new flarejs_1.TransferOutput(new flarejs_1.BigIntPr(this._amount), outputOwners);
|
|
104
305
|
return [new flarejs_1.TransferableOutput(new flarejs_1.Id(assetIdBytes), output)];
|
|
105
306
|
}
|
|
106
307
|
/**
|
|
107
308
|
* Recover UTXOs from inputs
|
|
108
|
-
* @param inputs Array of
|
|
309
|
+
* @param inputs Array of TransferableInput
|
|
109
310
|
* @returns Array of decoded UTXO objects
|
|
110
311
|
*/
|
|
111
312
|
recoverUtxos(inputs) {
|
|
112
313
|
return inputs.map((input) => {
|
|
113
|
-
const
|
|
314
|
+
const utxoId = input.utxoID;
|
|
315
|
+
// Get the threshold from the input's sigIndices length
|
|
316
|
+
const transferInput = input.input;
|
|
317
|
+
const inputThreshold = transferInput.sigIndicies().length;
|
|
114
318
|
return {
|
|
115
319
|
outputID: iface_1.SECP256K1_Transfer_Output,
|
|
116
|
-
amount: input.amount.toString(),
|
|
117
|
-
txid: utils_1.default.cb58Encode(Buffer.from(
|
|
118
|
-
outputidx:
|
|
119
|
-
threshold: this.transaction._threshold,
|
|
120
|
-
addresses:
|
|
121
|
-
utils_1.default.addressToString(this.transaction._network.hrp, this.transaction._network.alias, Buffer.from(input.address.toBytes())),
|
|
122
|
-
],
|
|
320
|
+
amount: input.amount().toString(),
|
|
321
|
+
txid: utils_1.default.cb58Encode(Buffer.from(utxoId.txID.toBytes())),
|
|
322
|
+
outputidx: utxoId.outputIdx.value().toString(),
|
|
323
|
+
threshold: inputThreshold || this.transaction._threshold,
|
|
324
|
+
addresses: this.transaction._fromAddresses.map((addr) => utils_1.default.addressToString(this.transaction._network.hrp, this.transaction._network.alias, Buffer.from(addr))),
|
|
123
325
|
};
|
|
124
326
|
});
|
|
125
327
|
}
|
|
126
328
|
}
|
|
127
329
|
exports.ExportInPTxBuilder = ExportInPTxBuilder;
|
|
128
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwb3J0SW5QVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9FeHBvcnRJblBUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsbURBQTRGO0FBQzVGLHlFQUFzRTtBQUN0RSxtREFXK0I7QUFDL0Isb0RBQTRCO0FBQzVCLG1DQUE4RjtBQUU5RixNQUFhLGtCQUFtQixTQUFRLG1EQUF3QjtJQUc5RCxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZUFBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEtBQXNCO1FBQzNCLE1BQU0sV0FBVyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQztRQUMzQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBTTtRQUNoQixNQUFNLE1BQU0sR0FBRyxFQUF3QixDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSx1QkFBWSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUVELHFEQUFxRDtRQUNyRCwwRUFBMEU7UUFDMUUsTUFBTSxP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RyxFQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUNyQztpQkFDRjthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQS9KRCxnREErSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIE5vdFN1cHBvcnRlZCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHtcbiAgZXZtU2VyaWFsLFxuICBVbnNpZ25lZFR4LFxuICBCaWdJbnRQcixcbiAgSW50LFxuICBJZCxcbiAgVHJhbnNmZXJhYmxlT3V0cHV0LFxuICBBZGRyZXNzLFxuICB1dGlscyBhcyBGbGFyZVV0aWxzLFxuICBUcmFuc2Zlck91dHB1dCxcbiAgT3V0cHV0T3duZXJzLFxufSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgRGVjb2RlZFV0eG9PYmosIFNFQ1AyNTZLMV9UcmFuc2Zlcl9PdXRwdXQsIEZsYXJlVHJhbnNhY3Rpb25UeXBlLCBUeCB9IGZyb20gJy4vaWZhY2UnO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0SW5QVHhCdWlsZGVyIGV4dGVuZHMgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJpdmF0ZSBfYW1vdW50OiBiaWdpbnQ7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX2V4dGVybmFsQ2hhaW5JZCA9IHV0aWxzLmNiNThEZWNvZGUodGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5jQ2hhaW5CbG9ja2NoYWluSUQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkV4cG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbW91bnQgaXMgYSBiaWdpbnQgdGhhdCBzcGVjaWZpZXMgdGhlIHF1YW50aXR5IG9mIHRoZSBhc3NldCB0aGF0IHRoaXMgb3V0cHV0IG93bnMuIE11c3QgYmUgcG9zaXRpdmUuXG4gICAqIEBwYXJhbSB7YmlnaW50IHwgc3RyaW5nfSBhbW91bnQgVGhlIHdpdGhkcmF3YWwgYW1vdW50XG4gICAqL1xuICBhbW91bnQodmFsdWU6IGJpZ2ludCB8IHN0cmluZyk6IHRoaXMge1xuICAgIGNvbnN0IHZhbHVlQmlnSW50ID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IEJpZ0ludCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB0aGlzLnZhbGlkYXRlQW1vdW50KHZhbHVlQmlnSW50KTtcbiAgICB0aGlzLl9hbW91bnQgPSB2YWx1ZUJpZ0ludDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGluaXRCdWlsZGVyKHR4OiBUeCk6IHRoaXMge1xuICAgIGNvbnN0IGJhc2VUeCA9IHR4IGFzIGV2bVNlcmlhbC5FeHBvcnRUeDtcbiAgICBpZiAoIXRoaXMudmVyaWZ5VHhUeXBlKGJhc2VUeC5fdHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ1RyYW5zYWN0aW9uIGNhbm5vdCBiZSBwYXJzZWQgb3IgaGFzIGFuIHVuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHR5cGUnKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhwb3J0ZWRPdXRwdXRzIGlzIGEgVHJhbnNmZXJhYmxlT3V0cHV0IGFycmF5LlxuICAgIC8vIEl0J3MgZXhwZWN0ZWQgdG8gaGF2ZSBvbmx5IG9uZSBvdXRwdXQgd2l0aCB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzZW5kZXIuXG4gICAgY29uc3Qgb3V0cHV0cyA9IGJhc2VUeC5leHBvcnRlZE91dHB1dHM7XG4gICAgaWYgKG91dHB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBjYW4gaGF2ZSBvbmUgZXh0ZXJuYWwgb3V0cHV0Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1swXTtcbiAgICBjb25zdCBvdXRwdXRUcmFuc2ZlciA9IG91dHB1dC5vdXRwdXQgYXMgVHJhbnNmZXJPdXRwdXQ7XG4gICAgY29uc3QgYXNzZXRJZCA9IG91dHB1dC5hc3NldElkLnRvQnl0ZXMoKTtcbiAgICBpZiAoQnVmZmVyLmNvbXBhcmUoYXNzZXRJZCwgQnVmZmVyLmZyb20odGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZCkpICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBBc3NldCBJRCBvZiB0aGUgb3V0cHV0IGRvZXMgbm90IG1hdGNoIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIC8vIFNldCBsb2NrdGltZSB0byAwIHNpbmNlIGl0J3Mgbm90IHVzZWQgaW4gRVZNIG91dHB1dHNcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9sb2NrdGltZSA9IEJpZ0ludCgwKTtcblxuICAgIC8vIFNldCB0aHJlc2hvbGQgdG8gMSBzaW5jZSBFVk0gb3V0cHV0cyBvbmx5IGhhdmUgb25lIGFkZHJlc3NcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQgPSAxO1xuXG4gICAgLy8gQ29udmVydCBvdXRwdXQgYWRkcmVzcyB0byBidWZmZXIgYW5kIHNldCBhcyBmcm9tQWRkcmVzc1xuICAgIGNvbnN0IG91dHB1dE93bmVycyA9IG91dHB1dFRyYW5zZmVyIGFzIHVua25vd24gYXMgT3V0cHV0T3duZXJzO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMgPSBvdXRwdXRPd25lcnMuYWRkcnMubWFwKChhZGRyKSA9PiBCdWZmZXIuZnJvbShhZGRyLnRvQnl0ZXMoKSkpO1xuXG4gICAgLy8gU2V0IGV4dGVybmFsIGNoYWluIElEIGZyb20gdGhlIGRlc3RpbmF0aW9uIGNoYWluXG4gICAgdGhpcy5fZXh0ZXJuYWxDaGFpbklkID0gQnVmZmVyLmZyb20oYmFzZVR4LmRlc3RpbmF0aW9uQ2hhaW4udG9TdHJpbmcoKSk7XG5cbiAgICAvLyBTZXQgYW1vdW50IGZyb20gb3V0cHV0XG4gICAgdGhpcy5fYW1vdW50ID0gb3V0cHV0VHJhbnNmZXIuYW1vdW50KCk7XG5cbiAgICAvLyBSZWNvdmVyIFVUWE9zIGZyb20gaW5wdXRzXG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdXR4b3MgPSB0aGlzLnJlY292ZXJVdHhvcyhiYXNlVHguaW5zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0YXRpYyB2ZXJpZnlUeFR5cGUodHhuVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR4blR5cGUgPT09IEZsYXJlVHJhbnNhY3Rpb25UeXBlLlB2bUV4cG9ydFR4O1xuICB9XG5cbiAgdmVyaWZ5VHhUeXBlKHR4blR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBFeHBvcnRJblBUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHR4blR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBleHBvcnQgdHJhbnNhY3Rpb25cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpOiB2b2lkIHtcbiAgICAvLyBpZiB0eCBoYXMgY3JlZGVudGlhbHMsIHR4IHNob3VsZG4ndCBjaGFuZ2VcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5oYXNDcmVkZW50aWFscykgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBpbnB1dHMsIGNyZWRlbnRpYWxzIH0gPSB0aGlzLmNyZWF0ZUlucHV0T3V0cHV0KHRoaXMuX2Ftb3VudCArIEJpZ0ludCh0aGlzLnRyYW5zYWN0aW9uLmZlZS5mZWUpKTtcblxuICAgIC8vIENvbnZlcnQgVHJhbnNmZXJhYmxlSW5wdXRzIHRvIEVWTSBJbnB1dHNcbiAgICBjb25zdCB0cmFuc2ZlcmFibGVJbnB1dHM6IGV2bVNlcmlhbC5JbnB1dFtdID0gaW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IGFzc2V0SWRCeXRlcyA9IGlucHV0LmFzc2V0SWQudG9CeXRlcygpO1xuICAgICAgY29uc3QgaW5wdXRPd25lcnMgPSBpbnB1dCBhcyB1bmtub3duIGFzIE91dHB1dE93bmVycztcbiAgICAgIHJldHVybiBuZXcgZXZtU2VyaWFsLklucHV0KFxuICAgICAgICBpbnB1dE93bmVycy5hZGRyc1swXSxcbiAgICAgICAgbmV3IEJpZ0ludFByKGlucHV0LmFtb3VudCgpKSxcbiAgICAgICAgbmV3IElkKGFzc2V0SWRCeXRlcyksXG4gICAgICAgIG5ldyBCaWdJbnRQcihCaWdJbnQoMCkpIC8vIG5vbmNlIGlzIDAgZm9yIG5vbi1FVk0gaW5wdXRzXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBleHBvcnQgdHJhbnNhY3Rpb25cbiAgICBjb25zdCBleHBvcnRUeCA9IG5ldyBldm1TZXJpYWwuRXhwb3J0VHgoXG4gICAgICBuZXcgSW50KHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmtJRCksXG4gICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odGhpcy50cmFuc2FjdGlvbi5fYmxvY2tjaGFpbklELCAnaGV4JykpKSxcbiAgICAgIG5ldyBJZChuZXcgVWludDhBcnJheSh0aGlzLl9leHRlcm5hbENoYWluSWQpKSxcbiAgICAgIHRyYW5zZmVyYWJsZUlucHV0cyxcbiAgICAgIHRoaXMuZXhwb3J0ZWRPdXRwdXRzKClcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIHVuc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGggcHJvcGVyIGFkZHJlc3MgbWFwc1xuICAgIGNvbnN0IGFkZHJlc3NNYXAgPSBuZXcgRmxhcmVVdGlscy5BZGRyZXNzTWFwKFtbbmV3IEFkZHJlc3ModGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc1swXSksIDBdXSk7XG4gICAgY29uc3QgYWRkcmVzc01hcHMgPSBuZXcgRmxhcmVVdGlscy5BZGRyZXNzTWFwcyhbYWRkcmVzc01hcF0pO1xuXG4gICAgY29uc3QgdW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KFxuICAgICAgZXhwb3J0VHgsXG4gICAgICBbXSwgLy8gRW1wdHkgVVRYT3MgYXJyYXksIHdpbGwgYmUgZmlsbGVkIGR1cmluZyBwcm9jZXNzaW5nXG4gICAgICBhZGRyZXNzTWFwcyxcbiAgICAgIGNyZWRlbnRpYWxzXG4gICAgKTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24odW5zaWduZWRUeCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBFeHBvcnRlZE91dHB1dHMgd2hlcmUgdGhlIHJlY2lwaWVudCBhZGRyZXNzIGFyZSB0aGUgc2VuZGVyLlxuICAgKiBMYXRlciBhbiBpbXBvcnRUeCBzaG91bGQgY29tcGxldGUgdGhlIG9wZXJhdGlvbnMgc2lnbmluZyB3aXRoIHRoZSBzYW1lIGtleXMuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBleHBvcnRlZE91dHB1dHMoKTogVHJhbnNmZXJhYmxlT3V0cHV0W10ge1xuICAgIGNvbnN0IGFzc2V0SWRCeXRlcyA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQsICdoZXgnKSk7XG4gICAgY29uc3Qgb3V0cHV0T3duZXJzID0gbmV3IE91dHB1dE93bmVycyhcbiAgICAgIG5ldyBCaWdJbnRQcihCaWdJbnQoMCkpLCAvLyBsb2NrdGltZVxuICAgICAgbmV3IEludCgxKSwgLy8gdGhyZXNob2xkXG4gICAgICBbbmV3IEFkZHJlc3ModGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc1swXSldXG4gICAgKTtcblxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBUcmFuc2Zlck91dHB1dChuZXcgQmlnSW50UHIodGhpcy5fYW1vdW50KSwgb3V0cHV0T3duZXJzKTtcblxuICAgIHJldHVybiBbbmV3IFRyYW5zZmVyYWJsZU91dHB1dChuZXcgSWQoYXNzZXRJZEJ5dGVzKSwgb3V0cHV0KV07XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlciBVVFhPcyBmcm9tIGlucHV0c1xuICAgKiBAcGFyYW0gaW5wdXRzIEFycmF5IG9mIGlucHV0c1xuICAgKiBAcmV0dXJucyBBcnJheSBvZiBkZWNvZGVkIFVUWE8gb2JqZWN0c1xuICAgKi9cbiAgcHJpdmF0ZSByZWNvdmVyVXR4b3MoaW5wdXRzOiBldm1TZXJpYWwuSW5wdXRbXSk6IERlY29kZWRVdHhvT2JqW10ge1xuICAgIHJldHVybiBpbnB1dHMubWFwKChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgdHhpZCA9IEJ1ZmZlci5mcm9tKGlucHV0LmFzc2V0SWQudG9CeXRlcygpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvdXRwdXRJRDogU0VDUDI1NksxX1RyYW5zZmVyX091dHB1dCxcbiAgICAgICAgYW1vdW50OiBpbnB1dC5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgdHhpZDogdXRpbHMuY2I1OEVuY29kZShCdWZmZXIuZnJvbSh0eGlkLCAnaGV4JykpLFxuICAgICAgICBvdXRwdXRpZHg6ICcwJywgLy8gU2luY2UgRVZNIGlucHV0cyBkb24ndCBoYXZlIG91dHB1dCBpbmRpY2VzXG4gICAgICAgIHRocmVzaG9sZDogdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkLFxuICAgICAgICBhZGRyZXNzZXM6IFtcbiAgICAgICAgICB1dGlscy5hZGRyZXNzVG9TdHJpbmcoXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLmhycCxcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsuYWxpYXMsXG4gICAgICAgICAgICBCdWZmZXIuZnJvbShpbnB1dC5hZGRyZXNzLnRvQnl0ZXMoKSlcbiAgICAgICAgICApLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
330
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwb3J0SW5QVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9FeHBvcnRJblBUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsbURBQTRGO0FBQzVGLHlFQUFzRTtBQUN0RSxtREFnQitCO0FBQy9CLG9EQUE0QjtBQUM1QixtQ0FBOEY7QUFFOUYsTUFBYSxrQkFBbUIsU0FBUSxtREFBd0I7SUFHOUQsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkIsMkJBQTJCO1FBQzNCLDRDQUE0QztRQUM1QyxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGVBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN2Rix3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUM3RyxLQUFLLENBQ04sQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEtBQXNCO1FBQzNCLE1BQU0sV0FBVyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQztRQUMzQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxX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QUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRCxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Z0JBQzlDLFNBQVMsRUFBRSxjQUFjLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVO2dCQUN4RCxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDdEQsZUFBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDekc7YUFDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF6WkQsZ0RBeVpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBOb3RTdXBwb3J0ZWQsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7XG4gIHB2bVNlcmlhbCxcbiAgYXZheFNlcmlhbCxcbiAgVW5zaWduZWRUeCxcbiAgQmlnSW50UHIsXG4gIEludCxcbiAgSWQsXG4gIFRyYW5zZmVyYWJsZUlucHV0LFxuICBUcmFuc2ZlcmFibGVPdXRwdXQsXG4gIFRyYW5zZmVySW5wdXQsXG4gIEFkZHJlc3MsXG4gIHV0aWxzIGFzIEZsYXJlVXRpbHMsXG4gIFRyYW5zZmVyT3V0cHV0LFxuICBPdXRwdXRPd25lcnMsXG4gIENyZWRlbnRpYWwsXG4gIEJ5dGVzLFxufSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgRGVjb2RlZFV0eG9PYmosIFNFQ1AyNTZLMV9UcmFuc2Zlcl9PdXRwdXQsIEZsYXJlVHJhbnNhY3Rpb25UeXBlLCBUeCB9IGZyb20gJy4vaWZhY2UnO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0SW5QVHhCdWlsZGVyIGV4dGVuZHMgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJpdmF0ZSBfYW1vdW50OiBiaWdpbnQ7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIC8vIEZvciBFeHBvcnQgRlJPTSBQLWNoYWluOlxuICAgIC8vIC0gZXh0ZXJuYWwgY2hhaW4gKGRlc3RpbmF0aW9uKSBpcyBDLWNoYWluXG4gICAgLy8gLSBibG9ja2NoYWluIElEIChzb3VyY2UpIGlzIFAtY2hhaW5cbiAgICB0aGlzLl9leHRlcm5hbENoYWluSWQgPSB1dGlscy5jYjU4RGVjb2RlKHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsuY0NoYWluQmxvY2tjaGFpbklEKTtcbiAgICAvLyBQLWNoYWluIGJsb2NrY2hhaW4gSUQgKGZyb20gbmV0d29yayBjb25maWcgLSBkZWNvZGUgZnJvbSBjYjU4IHRvIGhleClcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9ibG9ja2NoYWluSUQgPSBCdWZmZXIuZnJvbSh1dGlscy5jYjU4RGVjb2RlKHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsuYmxvY2tjaGFpbklEKSkudG9TdHJpbmcoXG4gICAgICAnaGV4J1xuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuRXhwb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFtb3VudCBpcyBhIGJpZ2ludCB0aGF0IHNwZWNpZmllcyB0aGUgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IHRoYXQgdGhpcyBvdXRwdXQgb3ducy4gTXVzdCBiZSBwb3NpdGl2ZS5cbiAgICogQHBhcmFtIHtiaWdpbnQgfCBzdHJpbmd9IGFtb3VudCBUaGUgd2l0aGRyYXdhbCBhbW91bnRcbiAgICovXG4gIGFtb3VudCh2YWx1ZTogYmlnaW50IHwgc3RyaW5nKTogdGhpcyB7XG4gICAgY29uc3QgdmFsdWVCaWdJbnQgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gQmlnSW50KHZhbHVlKSA6IHZhbHVlO1xuICAgIHRoaXMudmFsaWRhdGVBbW91bnQodmFsdWVCaWdJbnQpO1xuICAgIHRoaXMuX2Ftb3VudCA9IHZhbHVlQmlnSW50O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaW5pdEJ1aWxkZXIodHg6IFR4LCByYXdCeXRlcz86IEJ1ZmZlcik6IHRoaXMge1xuICAgIGNvbnN0IGV4cG9ydFR4ID0gdHggYXMgcHZtU2VyaWFsLkV4cG9ydFR4O1xuXG4gICAgaWYgKCF0aGlzLnZlcmlmeVR4VHlwZShleHBvcnRUeC5fdHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ1RyYW5zYWN0aW9uIGNhbm5vdCBiZSBwYXJzZWQgb3IgaGFzIGFuIHVuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHR5cGUnKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhwb3J0ZWRPdXRwdXRzIGlzIGEgVHJhbnNmZXJhYmxlT3V0cHV0IGFycmF5LlxuICAgIC8vIEl0J3MgZXhwZWN0ZWQgdG8gaGF2ZSBvbmx5IG9uZSBvdXRwdXQgd2l0aCB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzZW5kZXIuXG4gICAgY29uc3Qgb3V0cHV0cyA9IGV4cG9ydFR4Lm91dHM7XG4gICAgaWYgKG91dHB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBjYW4gaGF2ZSBvbmUgZXh0ZXJuYWwgb3V0cHV0Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1swXTtcbiAgICBjb25zdCBvdXRwdXRUcmFuc2ZlciA9IG91dHB1dC5vdXRwdXQgYXMgVHJhbnNmZXJPdXRwdXQ7XG4gICAgY29uc3QgYXNzZXRJZCA9IG91dHB1dC5hc3NldElkLnRvQnl0ZXMoKTtcbiAgICBpZiAoQnVmZmVyLmNvbXBhcmUoQnVmZmVyLmZyb20oYXNzZXRJZCksIEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQsICdoZXgnKSkgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIEFzc2V0IElEIG9mIHRoZSBvdXRwdXQgZG9lcyBub3QgbWF0Y2ggdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0T3duZXJzID0gb3V0cHV0VHJhbnNmZXIub3V0cHV0T3duZXJzO1xuXG4gICAgLy8gU2V0IGxvY2t0aW1lIGZyb20gb3V0cHV0XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fbG9ja3RpbWUgPSBvdXRwdXRPd25lcnMubG9ja3RpbWUudmFsdWUoKTtcblxuICAgIC8vIFNldCB0aHJlc2hvbGQgZnJvbSBvdXRwdXRcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQgPSBvdXRwdXRPd25lcnMudGhyZXNob2xkLnZhbHVlKCk7XG5cbiAgICAvLyBDb252ZXJ0IG91dHB1dCBhZGRyZXNzZXMgdG8gYnVmZmVycyBhbmQgc2V0IGFzIGZyb21BZGRyZXNzZXNcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzID0gb3V0cHV0T3duZXJzLmFkZHJzLm1hcCgoYWRkcikgPT4gQnVmZmVyLmZyb20oYWRkci50b0J5dGVzKCkpKTtcblxuICAgIC8vIFNldCBleHRlcm5hbCBjaGFpbiBJRCBmcm9tIHRoZSBkZXN0aW5hdGlvbiBjaGFpblxuICAgIHRoaXMuX2V4dGVybmFsQ2hhaW5JZCA9IEJ1ZmZlci5mcm9tKGV4cG9ydFR4LmRlc3RpbmF0aW9uLnRvQnl0ZXMoKSk7XG5cbiAgICAvLyBTZXQgYW1vdW50IGZyb20gZXhwb3J0ZWQgb3V0cHV0XG4gICAgdGhpcy5fYW1vdW50ID0gb3V0cHV0VHJhbnNmZXIuYW1vdW50KCk7XG5cbiAgICAvLyBSZWNvdmVyIFVUWE9zIGZyb20gYmFzZSB0eCBpbnB1dHNcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcyA9IHRoaXMucmVjb3ZlclV0eG9zKFsuLi5leHBvcnRUeC5iYXNlVHguaW5wdXRzXSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgYW5kIHNldCBmZWUgZnJvbSBpbnB1dC9vdXRwdXQgZGlmZmVyZW5jZVxuICAgIGNvbnN0IHRvdGFsSW5wdXRBbW91bnQgPSBleHBvcnRUeC5iYXNlVHguaW5wdXRzLnJlZHVjZSgoc3VtLCBpbnB1dCkgPT4gc3VtICsgaW5wdXQuYW1vdW50KCksIEJpZ0ludCgwKSk7XG4gICAgY29uc3QgY2hhbmdlT3V0cHV0QW1vdW50ID0gZXhwb3J0VHguYmFzZVR4Lm91dHB1dHMucmVkdWNlKChzdW0sIG91dCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJPdXQgPSBvdXQub3V0cHV0IGFzIFRyYW5zZmVyT3V0cHV0O1xuICAgICAgcmV0dXJuIHN1bSArIHRyYW5zZmVyT3V0LmFtb3VudCgpO1xuICAgIH0sIEJpZ0ludCgwKSk7XG4gICAgY29uc3QgZmVlID0gdG90YWxJbnB1dEFtb3VudCAtIGNoYW5nZU91dHB1dEFtb3VudCAtIHRoaXMuX2Ftb3VudDtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlID0gZmVlLnRvU3RyaW5nKCk7XG5cbiAgICAvLyBFeHRyYWN0IGNyZWRlbnRpYWxzIGZyb20gcmF3IGJ5dGVzXG4gICAgbGV0IGhhc0NyZWRlbnRpYWxzID0gZmFsc2U7XG4gICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcblxuICAgIGlmIChyYXdCeXRlcykge1xuICAgICAgLy8gVHJ5IHN0YW5kYXJkIGV4dHJhY3Rpb24gZmlyc3RcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHV0aWxzLmV4dHJhY3RDcmVkZW50aWFsc0Zyb21SYXdCeXRlcyhyYXdCeXRlcywgZXhwb3J0VHgsICdQVk0nKTtcbiAgICAgIGhhc0NyZWRlbnRpYWxzID0gcmVzdWx0Lmhhc0NyZWRlbnRpYWxzO1xuICAgICAgY3JlZGVudGlhbHMgPSByZXN1bHQuY3JlZGVudGlhbHM7XG5cbiAgICAgIC8vIElmIGV4dHJhY3Rpb24gZmFpbGVkIGJ1dCByYXcgYnl0ZXMgYXJlIGxvbmdlciwgdHJ5IHBhcnNpbmcgY3JlZGVudGlhbHMgYXQga25vd24gb2Zmc2V0XG4gICAgICBpZiAoKCFoYXNDcmVkZW50aWFscyB8fCBjcmVkZW50aWFscy5sZW5ndGggPT09IDApICYmIHJhd0J5dGVzLmxlbmd0aCA+IDMwMCkge1xuICAgICAgICBjb25zdCBjb2RlYyA9IEZsYXJlVXRpbHMuZ2V0TWFuYWdlckZvclZNKCdQVk0nKS5nZXREZWZhdWx0Q29kZWMoKTtcbiAgICAgICAgY29uc3QgdHhCeXRlc0xlbmd0aCA9IGV4cG9ydFR4LnRvQnl0ZXMoY29kZWMpLmxlbmd0aDtcblxuICAgICAgICBpZiAocmF3Qnl0ZXMubGVuZ3RoID4gdHhCeXRlc0xlbmd0aCkge1xuICAgICAgICAgIGhhc0NyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCBjcmVkUmVzdWx0ID0gdXRpbHMucGFyc2VDcmVkZW50aWFsc0F0T2Zmc2V0KHJhd0J5dGVzLCB0eEJ5dGVzTGVuZ3RoKTtcbiAgICAgICAgICBpZiAoY3JlZFJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjcmVkZW50aWFscyA9IGNyZWRSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBwYXJzZWQgY3JlZGVudGlhbHMgd2l0aCB0aGUgY29ycmVjdCBudW1iZXIgb2YgY3JlZGVudGlhbHMgZm9yIHRoZSBpbnB1dHMsXG4gICAgLy8gdXNlIHRoZW0gZGlyZWN0bHkgKHByZXNlcnZlcyBleGlzdGluZyBzaWduYXR1cmVzKVxuICAgIGNvbnN0IG51bUlucHV0cyA9IGV4cG9ydFR4LmJhc2VUeC5pbnB1dHMubGVuZ3RoO1xuICAgIGNvbnN0IHVzZURpcmVjdENyZWRlbnRpYWxzID0gaGFzQ3JlZGVudGlhbHMgJiYgY3JlZGVudGlhbHMubGVuZ3RoID09PSBudW1JbnB1dHM7XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgY3JlZGVudGlhbHMgaW4gcmF3IGJ5dGVzLCBzdG9yZSB0aGUgb3JpZ2luYWwgYnl0ZXMgdG8gcHJlc2VydmUgZXhhY3QgZm9ybWF0XG4gICAgaWYgKHJhd0J5dGVzICYmIGhhc0NyZWRlbnRpYWxzKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9yYXdTaWduZWRCeXRlcyA9IHJhd0J5dGVzO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBwcm9wZXIgVW5zaWduZWRUeCB3cmFwcGVyIHdpdGggY3JlZGVudGlhbHNcbiAgICBjb25zdCBzb3J0ZWRBZGRyZXNzZXMgPSBbLi4udGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc10uc29ydCgoYSwgYikgPT4gQnVmZmVyLmNvbXBhcmUoYSwgYikpO1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgc2lnbmF0dXJlIGlzIGVtcHR5IChjb250YWlucyBubyByZWFsIHNpZ25hdHVyZSBkYXRhKVxuICAgIC8vIEEgcmVhbCBFQ0RTQSBzaWduYXR1cmUgd2lsbCBuZXZlciBzdGFydCB3aXRoIDQ1IGJ5dGVzIG9mIHplcm9zXG4gICAgY29uc3QgaXNTaWduYXR1cmVFbXB0eSA9IChzaWc6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgaWYgKCFzaWcpIHJldHVybiB0cnVlO1xuICAgICAgY29uc3QgY2xlYW5TaWcgPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoc2lnKTtcbiAgICAgIGlmIChjbGVhblNpZy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpcnN0IDkwIGhleCBjaGFycyAoNDUgYnl0ZXMpIGFyZSBhbGwgemVyb3NcbiAgICAgIC8vIFJlYWwgc2lnbmF0dXJlcyBmcm9tIHNlY3AyNTZrMSB3aWxsIG5ldmVyIGhhdmUgdGhpcyBwYXR0ZXJuXG4gICAgICBjb25zdCBmaXJzdDkwQ2hhcnMgPSBjbGVhblNpZy5zdWJzdHJpbmcoMCwgOTApO1xuICAgICAgcmV0dXJuIGZpcnN0OTBDaGFycyA9PT0gJzAnLnJlcGVhdCg5MCkgfHwgZmlyc3Q5MENoYXJzID09PSAnMCcucmVwZWF0KGZpcnN0OTBDaGFycy5sZW5ndGgpO1xuICAgIH07XG5cbiAgICAvLyBCdWlsZCB0eENyZWRlbnRpYWxzIC0gZWl0aGVyIHVzZSBkaXJlY3QgY3JlZGVudGlhbHMgb3IgcmVjb25zdHJ1Y3Qgd2l0aCBlbWJlZGRlZCBhZGRyZXNzZXNcbiAgICBsZXQgdHhDcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuXG4gICAgaWYgKHVzZURpcmVjdENyZWRlbnRpYWxzKSB7XG4gICAgICAvLyBVc2UgdGhlIGV4dHJhY3RlZCBjcmVkZW50aWFscyBkaXJlY3RseSAtIHRoZXkgYWxyZWFkeSBoYXZlIHRoZSBjb3JyZWN0IHNpZ25hdHVyZXNcbiAgICAgIC8vIEp1c3QgZW5zdXJlIGVtcHR5IHNsb3RzIGhhdmUgZW1iZWRkZWQgYWRkcmVzc2VzIGZvciBzaWduaW5nIGlkZW50aWZpY2F0aW9uXG4gICAgICB0eENyZWRlbnRpYWxzID0gY3JlZGVudGlhbHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlY29uc3RydWN0IGNyZWRlbnRpYWxzIGZyb20gc2NyYXRjaCB3aXRoIGVtYmVkZGVkIGFkZHJlc3Nlc1xuICAgICAgdHhDcmVkZW50aWFscyA9IGV4cG9ydFR4LmJhc2VUeC5pbnB1dHMubWFwKChpbnB1dCwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVySW5wdXQgPSBpbnB1dC5pbnB1dCBhcyBUcmFuc2ZlcklucHV0O1xuICAgICAgICBjb25zdCBpbnB1dFRocmVzaG9sZCA9IHRyYW5zZmVySW5wdXQuc2lnSW5kaWNpZXMoKS5sZW5ndGggfHwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkO1xuXG4gICAgICAgIC8vIEdldCBleGlzdGluZyBzaWduYXR1cmVzIGZyb20gcGFyc2VkIGNyZWRlbnRpYWxzIGlmIGF2YWlsYWJsZVxuICAgICAgICBjb25zdCBleGlzdGluZ1NpZ3M6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChpZHggPCBjcmVkZW50aWFscy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0NyZWQgPSBjcmVkZW50aWFsc1tpZHhdO1xuICAgICAgICAgIGV4aXN0aW5nU2lncy5wdXNoKC4uLmV4aXN0aW5nQ3JlZC5nZXRTaWduYXR1cmVzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNyZWRlbnRpYWwgd2l0aCBjb3JyZWN0IG51bWJlciBvZiBzbG90cywgcHJlc2VydmluZyBleGlzdGluZyBzaWduYXR1cmVzXG4gICAgICAgIC8vIEVtcHR5IHNsb3RzIGdldCBlbWJlZGRlZCBhZGRyZXNzZXMgZm9yIHNsb3QgaWRlbnRpZmljYXRpb25cbiAgICAgICAgY29uc3Qgc2lnU2xvdHM6IFJldHVyblR5cGU8dHlwZW9mIHV0aWxzLmNyZWF0ZU5ld1NpZz5bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0VGhyZXNob2xkOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1NpZyA9IGkgPCBleGlzdGluZ1NpZ3MubGVuZ3RoID8gZXhpc3RpbmdTaWdzW2ldIDogbnVsbDtcblxuICAgICAgICAgIGlmIChleGlzdGluZ1NpZyAmJiAhaXNTaWduYXR1cmVFbXB0eShleGlzdGluZ1NpZykpIHtcbiAgICAgICAgICAgIC8vIFVzZSBleGlzdGluZyBub24tZW1wdHkgc2lnbmF0dXJlIChyZWFsIHNpZ25hdHVyZSBmcm9tIHNpZ25pbmcpXG4gICAgICAgICAgICBjb25zdCBzaWdIZXggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoZXhpc3RpbmdTaWcpO1xuICAgICAgICAgICAgc2lnU2xvdHMucHVzaCh1dGlscy5jcmVhdGVOZXdTaWcoc2lnSGV4KSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEVtcHR5IHNsb3QgLSBjcmVhdGUgd2l0aCBlbWJlZGRlZCBhZGRyZXNzIGZvciBzbG90IGlkZW50aWZpY2F0aW9uXG4gICAgICAgICAgICBjb25zdCBhZGRySGV4ID0gQnVmZmVyLmZyb20oc29ydGVkQWRkcmVzc2VzW2ldKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgICAgICBzaWdTbG90cy5wdXNoKHV0aWxzLmNyZWF0ZUVtcHR5U2lnV2l0aEFkZHJlc3MoYWRkckhleCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENyZWRlbnRpYWwoc2lnU2xvdHMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFkZHJlc3MgbWFwcyBmb3Igc2lnbmluZyAtIG9uZSBwZXIgaW5wdXQvY3JlZGVudGlhbFxuICAgIC8vIEVhY2ggYWRkcmVzcyBtYXAgY29udGFpbnMgYWxsIGFkZHJlc3NlcyBtYXBwZWQgdG8gdGhlaXIgaW5kaWNlc1xuICAgIGNvbnN0IGFkZHJlc3NNYXBzID0gdHhDcmVkZW50aWFscy5tYXAoKCkgPT4ge1xuICAgICAgY29uc3QgYWRkcmVzc01hcCA9IG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXAoKTtcbiAgICAgIHNvcnRlZEFkZHJlc3Nlcy5mb3JFYWNoKChhZGRyLCBpKSA9PiB7XG4gICAgICAgIGFkZHJlc3NNYXAuc2V0KG5ldyBBZGRyZXNzKGFkZHIpLCBpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFkZHJlc3NNYXA7XG4gICAgfSk7XG5cbiAgICAvLyBBbHdheXMgY3JlYXRlIGEgbmV3IFVuc2lnbmVkVHggd2l0aCBwcm9wZXJseSBzdHJ1Y3R1cmVkIGNyZWRlbnRpYWxzXG4gICAgY29uc3QgdW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KGV4cG9ydFR4LCBbXSwgbmV3IEZsYXJlVXRpbHMuQWRkcmVzc01hcHMoYWRkcmVzc01hcHMpLCB0eENyZWRlbnRpYWxzKTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24odW5zaWduZWRUeCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgdmVyaWZ5VHhUeXBlKHR4blR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eG5UeXBlID09PSBGbGFyZVRyYW5zYWN0aW9uVHlwZS5Qdm1FeHBvcnRUeDtcbiAgfVxuXG4gIHZlcmlmeVR4VHlwZSh0eG5UeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gRXhwb3J0SW5QVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSh0eG5UeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgZXhwb3J0IHRyYW5zYWN0aW9uIGZvciBQLWNoYWluXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZEZsYXJlVHJhbnNhY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gaWYgdHggaGFzIGNyZWRlbnRpYWxzLCB0eCBzaG91bGRuJ3QgY2hhbmdlXG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uaGFzQ3JlZGVudGlhbHMpIHJldHVybjtcblxuICAgIGNvbnN0IHsgaW5wdXRzLCBjaGFuZ2VPdXRwdXRzLCBjcmVkZW50aWFscywgdG90YWxBbW91bnQgfSA9IHRoaXMuY3JlYXRlRXhwb3J0SW5wdXRzKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgZmVlIGZyb20gdHJhbnNhY3Rpb24gZmVlIHNldHRpbmdzXG4gICAgY29uc3QgZmVlID0gQmlnSW50KHRoaXMudHJhbnNhY3Rpb24uZmVlLmZlZSk7XG4gICAgY29uc3QgdGFyZ2V0QW1vdW50ID0gdGhpcy5fYW1vdW50ICsgZmVlO1xuXG4gICAgLy8gVmVyaWZ5IHdlIGhhdmUgZW5vdWdoIGZ1bmRzXG4gICAgaWYgKHRvdGFsQW1vdW50IDwgdGFyZ2V0QW1vdW50KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnN1ZmZpY2llbnQgZnVuZHM6IGhhdmUgJHt0b3RhbEFtb3VudH0sIG5lZWQgJHt0YXJnZXRBbW91bnR9YCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBCYXNlVHggZm9yIHRoZSBQLWNoYWluIGV4cG9ydCB0cmFuc2FjdGlvblxuICAgIGNvbnN0IGJhc2VUeCA9IG5ldyBhdmF4U2VyaWFsLkJhc2VUeChcbiAgICAgIG5ldyBJbnQodGhpcy50cmFuc2FjdGlvbi5fbmV0d29ya0lEKSxcbiAgICAgIG5ldyBJZChCdWZmZXIuZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl9ibG9ja2NoYWluSUQsICdoZXgnKSksXG4gICAgICBjaGFuZ2VPdXRwdXRzLCAvLyBjaGFuZ2Ugb3V0cHV0c1xuICAgICAgaW5wdXRzLCAvLyBpbnB1dHNcbiAgICAgIG5ldyBCeXRlcyhuZXcgVWludDhBcnJheSgwKSkgLy8gZW1wdHkgbWVtb1xuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIFAtY2hhaW4gZXhwb3J0IHRyYW5zYWN0aW9uIHVzaW5nIHB2bVNlcmlhbC5FeHBvcnRUeFxuICAgIGNvbnN0IGV4cG9ydFR4ID0gbmV3IHB2bVNlcmlhbC5FeHBvcnRUeChcbiAgICAgIGJhc2VUeCxcbiAgICAgIG5ldyBJZCh0aGlzLl9leHRlcm5hbENoYWluSWQpLCAvLyBkZXN0aW5hdGlvbkNoYWluIChDLWNoYWluKVxuICAgICAgdGhpcy5leHBvcnRlZE91dHB1dHMoKSAvLyBleHBvcnRlZE91dHB1dHNcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGFkZHJlc3MgbWFwcyBmb3Igc2lnbmluZyAtIG9uZSBwZXIgaW5wdXQvY3JlZGVudGlhbFxuICAgIGNvbnN0IHNvcnRlZEFkZHJlc3NlcyA9IFsuLi50aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzXS5zb3J0KChhLCBiKSA9PiBCdWZmZXIuY29tcGFyZShhLCBiKSk7XG4gICAgY29uc3QgYWRkcmVzc01hcHMgPSBjcmVkZW50aWFscy5tYXAoKCkgPT4ge1xuICAgICAgY29uc3QgYWRkcmVzc01hcCA9IG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXAoKTtcbiAgICAgIHNvcnRlZEFkZHJlc3Nlcy5mb3JFYWNoKChhZGRyLCBpKSA9PiB7XG4gICAgICAgIGFkZHJlc3NNYXAuc2V0KG5ldyBBZGRyZXNzKGFkZHIpLCBpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFkZHJlc3NNYXA7XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgdW5zaWduZWQgdHJhbnNhY3Rpb25cbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gbmV3IFVuc2lnbmVkVHgoXG4gICAgICBleHBvcnRUeCxcbiAgICAgIFtdLCAvLyBFbXB0eSBVVFhPcyBhcnJheVxuICAgICAgbmV3IEZsYXJlVXRpbHMuQWRkcmVzc01hcHMoYWRkcmVzc01hcHMpLFxuICAgICAgY3JlZGVudGlhbHNcbiAgICApO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbih1bnNpZ25lZFR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgaW5wdXRzIGZyb20gVVRYT3MgZm9yIFAtY2hhaW4gZXhwb3J0XG4gICAqIE9ubHkgc2VsZWN0cyBlbm91Z2ggVVRYT3MgdG8gY292ZXIgdGhlIHRhcmdldCBhbW91bnQgKGFtb3VudCArIGZlZSlcbiAgICogQHJldHVybnMgaW5wdXRzLCBjaGFuZ2Ugb3V0cHV0cywgY3JlZGVudGlhbHMsIGFuZCB0b3RhbCBhbW91bnRcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVFeHBvcnRJbnB1dHMoKToge1xuICAgIGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICBjaGFuZ2VPdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXTtcbiAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICAgIHRvdGFsQW1vdW50OiBiaWdpbnQ7XG4gIH0ge1xuICAgIGNvbnN0IHNlbmRlciA9IFsuLi50aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzXTtcbiAgICBpZiAodGhpcy5yZWNvdmVyU2lnbmVyKSB7XG4gICAgICAvLyBzd2l0Y2ggZmlyc3QgYW5kIGxhc3Qgc2lnbmVyXG4gICAgICBjb25zdCB0bXAgPSBzZW5kZXIucG9wKCk7XG4gICAgICBzZW5kZXIucHVzaChzZW5kZXJbMF0pO1xuICAgICAgaWYgKHRtcCkge1xuICAgICAgICBzZW5kZXJbMF0gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZmVlID0gQmlnSW50KHRoaXMudHJhbnNhY3Rpb24uZmVlLmZlZSk7XG4gICAgY29uc3QgdGFyZ2V0QW1vdW50ID0gdGhpcy5fYW1vdW50ICsgZmVlO1xuXG4gICAgbGV0IHRvdGFsQW1vdW50ID0gQmlnSW50KDApO1xuICAgIGNvbnN0IGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcblxuICAgIC8vIENoYW5nZSBvdXRwdXQgdGhyZXNob2xkIGlzIGFsd2F5cyAxIChtYXRjaGluZyBGbGFyZSBwcm90b2NvbCBiZWhhdmlvcilcbiAgICAvLyBUaGlzIGFsbG93cyBlYXNpZXIgc3BlbmRpbmcgb2YgY2hhbmdlIHdoaWxlIG1haW50YWluaW5nIHNlY3VyaXR5IGZvciBleHBvcnQgb3V0cHV0c1xuICAgIGNvbnN0IGNoYW5nZU91dHB1dFRocmVzaG9sZCA9IDE7XG5cbiAgICAvLyBPbmx5IGNvbnN1bWUgZW5vdWdoIFVUWE9zIHRvIGNvdmVyIHRoZSB0YXJnZXQgYW1vdW50IChpbiBhcnJheSBvcmRlcilcbiAgICAvLyBJbnB1dHMgd2lsbCBiZSBzb3J0ZWQgYWZ0ZXIgc2VsZWN0aW9uXG4gICAgZm9yIChjb25zdCB1dHhvIG9mIHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zKSB7XG4gICAgICAvLyBTdG9wIGlmIHdlIGFscmVhZHkgaGF2ZSBlbm91Z2hcbiAgICAgIGlmICh0b3RhbEFtb3VudCA+PSB0YXJnZXRBbW91bnQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFtb3VudCA9IEJpZ0ludCh1dHhvLmFtb3VudCk7XG4gICAgICB0b3RhbEFtb3VudCArPSBhbW91bnQ7XG5cbiAgICAgIC8vIFVzZSB0aGUgVVRYTydzIG93biB0aHJlc2hvbGQgZm9yIHNpZ25hdHVyZSBpbmRpY2VzXG4gICAgICBjb25zdCB1dHhvVGhyZXNob2xkID0gdXR4by50aHJlc2hvbGQgfHwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkO1xuXG4gICAgICAvLyBDcmVhdGUgc2lnbmF0dXJlIGluZGljZXMgZm9yIHRoZSBVVFhPJ3MgdGhyZXNob2xkXG4gICAgICBjb25zdCBzaWdJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1dHhvVGhyZXNob2xkOyBpKyspIHtcbiAgICAgICAgc2lnSW5kaWNlcy5wdXNoKGkpO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgZnJvbU5hdGl2ZSB0byBjcmVhdGUgVHJhbnNmZXJhYmxlSW5wdXRcbiAgICAgIGNvbnN0IHR4SWRDYjU4ID0gdXR4by50eGlkOyAvLyBBbHJlYWR5IGNiNTggZW5jb2RlZFxuICAgICAgY29uc3QgYXNzZXRJZENiNTggPSB1dGlscy5jYjU4RW5jb2RlKEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQsICdoZXgnKSk7XG5cbiAgICAgIGNvbnN0IHRyYW5zZmVyYWJsZUlucHV0ID0gVHJhbnNmZXJhYmxlSW5wdXQuZnJvbU5hdGl2ZShcbiAgICAgICAgdHhJZENiNTgsXG4gICAgICAgIE51bWJlcih1dHhvLm91dHB1dGlkeCksXG4gICAgICAgIGFzc2V0SWRDYjU4LFxuICAgICAgICBhbW91bnQsXG4gICAgICAgIHNpZ0luZGljZXNcbiAgICAgICk7XG5cbiAgICAgIGlucHV0cy5wdXNoKHRyYW5zZmVyYWJsZUlucHV0KTtcblxuICAgICAgLy8gQ3JlYXRlIGNyZWRlbnRpYWwgd2l0aCBlbXB0eSBzaWduYXR1cmVzIHRoYXQgaGF2ZSBlbWJlZGRlZCBhZGRyZXNzZXMgZm9yIHNsb3QgaWRlbnRpZmljYXRpb25cbiAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBzaWduaW5nIGxvZ2ljIHRvIGRldGVybWluZSB3aGljaCBzbG90IGJlbG9uZ3MgdG8gd2hpY2ggYWRkcmVzc1xuICAgICAgY29uc3Qgc29ydGVkQWRkcnMgPSBbLi4udGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc10uc29ydCgoYSwgYikgPT4gQnVmZmVyLmNvbXBhcmUoYSwgYikpO1xuICAgICAgY29uc3QgZW1wdHlTaWduYXR1cmVzID0gc2lnSW5kaWNlcy5tYXAoKGlkeCkgPT4ge1xuICAgICAgICBjb25zdCBhZGRySGV4ID0gQnVmZmVyLmZyb20oc29ydGVkQWRkcnNbaWR4XSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICByZXR1cm4gdXRpbHMuY3JlYXRlRW1wdHlTaWdXaXRoQWRkcmVzcyhhZGRySGV4KTtcbiAgICAgIH0pO1xuICAgICAgY3JlZGVudGlhbHMucHVzaChuZXcgQ3JlZGVudGlhbChlbXB0eVNpZ25hdHVyZXMpKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY2hhbmdlIG91dHB1dCBpZiB0aGVyZSBpcyByZW1haW5pbmcgYW1vdW50IGFmdGVyIGV4cG9ydCBhbmQgZmVlXG4gICAgY29uc3QgY2hhbmdlT3V0cHV0czogVHJhbnNmZXJhYmxlT3V0cHV0W10gPSBbXTtcbiAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSB0b3RhbEFtb3VudCAtIHRoaXMuX2Ftb3VudCAtIGZlZTtcblxuICAgIGlmIChjaGFuZ2VBbW91bnQgPiBCaWdJbnQoMCkpIHtcbiAgICAgIGNvbnN0IGFzc2V0SWRCeXRlcyA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQsICdoZXgnKSk7XG5cbiAgICAgIC8vIENyZWF0ZSBPdXRwdXRPd25lcnMgd2l0aCB0aGUgUC1jaGFpbiBhZGRyZXNzZXMgKHNvcnRlZCBieSBieXRlIHZhbHVlIGFzIHBlciBBVkFYIHByb3RvY29sKVxuICAgICAgLy8gVXNlIHRocmVzaG9sZD0xIGZvciBjaGFuZ2Ugb3V0cHV0cyAobWF0Y2hpbmcgRmxhcmUgcHJvdG9jb2wgYmVoYXZpb3IpXG4gICAgICBjb25zdCBzb3J0ZWRBZGRyZXNzZXMgPSBbLi4udGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc10uc29ydCgoYSwgYikgPT4gQnVmZmVyLmNvbXBhcmUoYSwgYikpO1xuICAgICAgY29uc3Qgb3V0cHV0T3duZXJzID0gbmV3IE91dHB1dE93bmVycyhcbiAgICAgICAgbmV3IEJpZ0ludFByKHRoaXMudHJhbnNhY3Rpb24uX2xvY2t0aW1lKSxcbiAgICAgICAgbmV3IEludChjaGFuZ2VPdXRwdXRUaHJlc2hvbGQpLFxuICAgICAgICBzb3J0ZWRBZGRyZXNzZXMubWFwKChhZGRyKSA9PiBuZXcgQWRkcmVzcyhhZGRyKSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHRyYW5zZmVyT3V0cHV0ID0gbmV3IFRyYW5zZmVyT3V0cHV0KG5ldyBCaWdJbnRQcihjaGFuZ2VBbW91bnQpLCBvdXRwdXRPd25lcnMpO1xuICAgICAgY29uc3QgY2hhbmdlT3V0cHV0ID0gbmV3IFRyYW5zZmVyYWJsZU91dHB1dChuZXcgSWQoYXNzZXRJZEJ5dGVzKSwgdHJhbnNmZXJPdXRwdXQpO1xuICAgICAgY2hhbmdlT3V0cHV0cy5wdXNoKGNoYW5nZU91dHB1dCk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBpbnB1dHMgbGV4aWNvZ3JhcGhpY2FsbHkgYnkgdHhpZCAoQXZhbGFuY2hlIHByb3RvY29sIHJlcXVpcmVtZW50KVxuICAgIGNvbnN0IHNvcnRlZElucHV0c1dpdGhDcmVkZW50aWFscyA9IGlucHV0c1xuICAgICAgLm1hcCgoaW5wdXQsIGkpID0+ICh7IGlucHV0LCBjcmVkZW50aWFsOiBjcmVkZW50aWFsc1tpXSB9KSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFUeElkID0gQnVmZmVyLmZyb20oYS5pbnB1dC51dHhvSUQudHhJRC50b0J5dGVzKCkpO1xuICAgICAgICBjb25zdCBiVHhJZCA9IEJ1ZmZlci5mcm9tKGIuaW5wdXQudXR4b0lELnR4SUQudG9CeXRlcygpKTtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKGFUeElkLCBiVHhJZCk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHM6IHNvcnRlZElucHV0c1dpdGhDcmVkZW50aWFscy5tYXAoKHgpID0+IHguaW5wdXQpLFxuICAgICAgY2hhbmdlT3V0cHV0cyxcbiAgICAgIGNyZWRlbnRpYWxzOiBzb3J0ZWRJbnB1dHNXaXRoQ3JlZGVudGlhbHMubWFwKCh4KSA9PiB4LmNyZWRlbnRpYWwpLFxuICAgICAgdG90YWxBbW91bnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIEV4cG9ydGVkT3V0cHV0cyB3aGVyZSB0aGUgcmVjaXBpZW50IGFkZHJlc3MgYXJlIHRoZSBzZW5kZXIuXG4gICAqIExhdGVyIGFuIGltcG9ydFR4IHNob3VsZCBjb21wbGV0ZSB0aGUgb3BlcmF0aW9ucyBzaWduaW5nIHdpdGggdGhlIHNhbWUga2V5cy5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGV4cG9ydGVkT3V0cHV0cygpOiBUcmFuc2ZlcmFibGVPdXRwdXRbXSB7XG4gICAgY29uc3QgYXNzZXRJZEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZCwgJ2hleCcpKTtcblxuICAgIC8vIENyZWF0ZSBPdXRwdXRPd25lcnMgd2l0aCBzb3J0ZWQgYWRkcmVzc2VzXG4gICAgY29uc3Qgc29ydGVkQWRkcmVzc2VzID0gWy4uLnRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXNdLnNvcnQoKGEsIGIpID0+IEJ1ZmZlci5jb21wYXJlKGEsIGIpKTtcbiAgICBjb25zdCBvdXRwdXRPd25lcnMgPSBuZXcgT3V0cHV0T3duZXJzKFxuICAgICAgbmV3IEJpZ0ludFByKHRoaXMudHJhbnNhY3Rpb24uX2xvY2t0aW1lKSxcbiAgICAgIG5ldyBJbnQodGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkKSxcbiAgICAgIHNvcnRlZEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IG5ldyBBZGRyZXNzKGFkZHIpKVxuICAgICk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBuZXcgVHJhbnNmZXJPdXRwdXQobmV3IEJpZ0ludFByKHRoaXMuX2Ftb3VudCksIG91dHB1dE93bmVycyk7XG5cbiAgICByZXR1cm4gW25ldyBUcmFuc2ZlcmFibGVPdXRwdXQobmV3IElkKGFzc2V0SWRCeXRlcyksIG91dHB1dCldO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY292ZXIgVVRYT3MgZnJvbSBpbnB1dHNcbiAgICogQHBhcmFtIGlucHV0cyBBcnJheSBvZiBUcmFuc2ZlcmFibGVJbnB1dFxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBkZWNvZGVkIFVUWE8gb2JqZWN0c1xuICAgKi9cbiAgcHJpdmF0ZSByZWNvdmVyVXR4b3MoaW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdKTogRGVjb2RlZFV0eG9PYmpbXSB7XG4gICAgcmV0dXJuIGlucHV0cy5tYXAoKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCB1dHhvSWQgPSBpbnB1dC51dHhvSUQ7XG4gICAgICAvLyBHZXQgdGhlIHRocmVzaG9sZCBmcm9tIHRoZSBpbnB1dCdzIHNpZ0luZGljZXMgbGVuZ3RoXG4gICAgICBjb25zdCB0cmFuc2ZlcklucHV0ID0gaW5wdXQuaW5wdXQgYXMgVHJhbnNmZXJJbnB1dDtcbiAgICAgIGNvbnN0IGlucHV0VGhyZXNob2xkID0gdHJhbnNmZXJJbnB1dC5zaWdJbmRpY2llcygpLmxlbmd0aDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG91dHB1dElEOiBTRUNQMjU2SzFfVHJhbnNmZXJfT3V0cHV0LFxuICAgICAgICBhbW91bnQ6IGlucHV0LmFtb3VudCgpLnRvU3RyaW5nKCksXG4gICAgICAgIHR4aWQ6IHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyLmZyb20odXR4b0lkLnR4SUQudG9CeXRlcygpKSksXG4gICAgICAgIG91dHB1dGlkeDogdXR4b0lkLm91dHB1dElkeC52YWx1ZSgpLnRvU3RyaW5nKCksXG4gICAgICAgIHRocmVzaG9sZDogaW5wdXRUaHJlc2hvbGQgfHwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkLFxuICAgICAgICBhZGRyZXNzZXM6IHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMubWFwKChhZGRyKSA9PlxuICAgICAgICAgIHV0aWxzLmFkZHJlc3NUb1N0cmluZyh0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLmhycCwgdGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5hbGlhcywgQnVmZmVyLmZyb20oYWRkcikpXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EACL,OAAO,EACP,eAAe,EACf,KAAK,EAGL,eAAe,EACf,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,UAAU,EAMX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EACL,OAAO,EACP,eAAe,EACf,KAAK,EAGL,eAAe,EACf,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,UAAU,EAMX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgEpC,qBAAa,WAAY,SAAQ,eAAe;IAC9C,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC;IACzB,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,SAAK;IACf,SAAS,SAAa;IACtB,cAAc,EAAE,UAAU,EAAE,CAAM;IAClC,GAAG,EAAE,UAAU,EAAE,CAAM;IACvB,gBAAgB,EAAE,UAAU,EAAE,CAAM;IACpC,MAAM,EAAE,cAAc,EAAE,CAAM;IAC9B,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,CAAM;IAEnC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;gBAE/B,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAS5C,IAAI,SAAS,IAAI,MAAM,EAAE,CAKxB;IAED,IAAI,WAAW,IAAI,UAAU,EAAE,CAE9B;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,kBAAkB;IAClB,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,OAAO;IAI5B,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAqE3C,iBAAiB,IAAI,MAAM;IAkB3B,MAAM,IAAI,MAAM;IAiBhB,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;IAI5B,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAO1D,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,EAAE,IAAI,MAAM,CAGf;IAED,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED,IAAI,eAAe,IAAI,MAAM,EAAE,CAE9B;IAED,IAAI,GAAG,IAAI,cAAc,CAExB;IAED,IAAI,OAAO,IAAI,KAAK,EAAE,CAgBrB;IAED,IAAI,aAAa,IAAI,KAAK,EAAE,CAI3B;IAED,kBAAkB,IAAI,sBAAsB;CA0B7C"}
|