@bitgo-beta/sdk-coin-flrp 1.0.1-beta.266 → 1.0.1-beta.267
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/flrp.d.ts +6 -75
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +13 -298
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -2
- package/dist/src/lib/ExportInCTxBuilder.d.ts +50 -0
- package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInCTxBuilder.js +163 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts +36 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInPTxBuilder.js +128 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts +47 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInCTxBuilder.js +213 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts +23 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInPTxBuilder.js +101 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
- package/dist/src/lib/atomicTransactionBuilder.d.ts +34 -84
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +119 -288
- package/dist/src/lib/iface.d.ts +50 -51
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +22 -10
- package/dist/src/lib/index.d.ts +2 -3
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +5 -6
- package/dist/src/lib/keyPair.d.ts +1 -1
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +9 -5
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +32 -67
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +91 -205
- package/dist/src/lib/transaction.d.ts +8 -74
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +61 -210
- package/dist/src/lib/transactionBuilder.d.ts +56 -34
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +112 -69
- package/dist/src/lib/transactionBuilderFactory.d.ts +27 -30
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +69 -75
- package/dist/src/lib/utils.d.ts +58 -157
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +134 -399
- package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
- package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInC.js +30 -0
- package/dist/test/unit/lib/exportInCTxBuilder.js +92 -513
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -11
- 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/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/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/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/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/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/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 -258
- 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 -501
- 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 -365
- 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,318 +1,149 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AtomicTransactionBuilder = void 0;
|
|
4
|
-
const
|
|
4
|
+
const transactionBuilder_1 = require("./transactionBuilder");
|
|
5
|
+
const transaction_1 = require("./transaction");
|
|
5
6
|
const flarejs_1 = require("@flarenetwork/flarejs");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* credential handling using FlareJS Credential and Signature classes.
|
|
12
|
-
*/
|
|
13
|
-
class AtomicTransactionBuilder {
|
|
14
|
-
constructor(coinConfig) {
|
|
15
|
-
this._utxos = [];
|
|
16
|
-
this.transaction = {
|
|
17
|
-
_network: {},
|
|
18
|
-
_networkID: constants_1.DEFAULT_NETWORK_ID,
|
|
19
|
-
_blockchainID: Buffer.alloc(constants_1.EMPTY_BUFFER_SIZE),
|
|
20
|
-
_assetId: Buffer.alloc(constants_1.EMPTY_BUFFER_SIZE),
|
|
21
|
-
_fromAddresses: [],
|
|
22
|
-
_to: [],
|
|
23
|
-
_locktime: constants_1.DEFAULT_LOCKTIME,
|
|
24
|
-
_threshold: constants_1.DEFAULT_THRESHOLD,
|
|
25
|
-
_fee: { fee: constants_1.AMOUNT_STRING_ZERO },
|
|
26
|
-
hasCredentials: false,
|
|
27
|
-
setTransaction: function (_tx) {
|
|
28
|
-
this._tx = _tx;
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
this._coinConfig = coinConfig;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Get the asset ID for Flare network transactions
|
|
35
|
-
* @returns Buffer containing the asset ID
|
|
36
|
-
*/
|
|
37
|
-
getAssetId() {
|
|
38
|
-
// Use the asset ID from transaction if already set
|
|
39
|
-
if (this.transaction._assetId && this.transaction._assetId.length > 0) {
|
|
40
|
-
return this.transaction._assetId;
|
|
41
|
-
}
|
|
42
|
-
// For native FLR transactions, return zero-filled buffer as placeholder
|
|
43
|
-
// In a real implementation, this would be obtained from the network configuration
|
|
44
|
-
// or FlareJS API to get the actual native asset ID
|
|
45
|
-
return Buffer.alloc(constants_1.ASSET_ID_LENGTH);
|
|
46
|
-
}
|
|
47
|
-
validateAmount(amount) {
|
|
48
|
-
if (amount <= constants_1.ZERO_BIGINT) {
|
|
49
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_AMOUNT_POSITIVE);
|
|
50
|
-
}
|
|
7
|
+
class AtomicTransactionBuilder extends transactionBuilder_1.TransactionBuilder {
|
|
8
|
+
constructor(_coinConfig) {
|
|
9
|
+
super(_coinConfig);
|
|
10
|
+
this.recoverSigner = false;
|
|
11
|
+
this.transaction = new transaction_1.Transaction(_coinConfig);
|
|
51
12
|
}
|
|
52
13
|
/**
|
|
53
|
-
*
|
|
54
|
-
* @param
|
|
14
|
+
* Create inputs and outputs from UTXOs
|
|
15
|
+
* @param {bigint} amount Amount to transfer
|
|
16
|
+
* @return {
|
|
17
|
+
* inputs: TransferableInput[];
|
|
18
|
+
* outputs: TransferableInput[];
|
|
19
|
+
* credentials: Credential[];
|
|
20
|
+
* }
|
|
21
|
+
* @protected
|
|
55
22
|
*/
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
23
|
+
createInputOutput(amount) {
|
|
24
|
+
const sender = this.transaction._fromAddresses.slice();
|
|
25
|
+
if (this.recoverSigner) {
|
|
26
|
+
// switch first and last signer
|
|
27
|
+
const tmp = sender.pop();
|
|
28
|
+
sender.push(sender[0]);
|
|
29
|
+
if (tmp) {
|
|
30
|
+
sender[0] = tmp;
|
|
63
31
|
}
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Creates inputs, outputs, and credentials for Flare P-chain atomic transactions.
|
|
68
|
-
* Based on AVAX P-chain implementation adapted for FlareJS.
|
|
69
|
-
*
|
|
70
|
-
* Note: This is a simplified implementation that creates the core structure.
|
|
71
|
-
* The FlareJS type system integration will be refined in future iterations.
|
|
72
|
-
*
|
|
73
|
-
* @param total - Total amount needed including fees
|
|
74
|
-
* @returns Object containing TransferableInput[], TransferableOutput[], and Credential[]
|
|
75
|
-
*/
|
|
76
|
-
createInputOutput(total) {
|
|
77
|
-
if (!this._utxos || this._utxos.length === constants_1.ZERO_NUMBER) {
|
|
78
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_UTXOS_REQUIRED);
|
|
79
32
|
}
|
|
33
|
+
let totalAmount = BigInt(0);
|
|
80
34
|
const inputs = [];
|
|
81
35
|
const outputs = [];
|
|
82
36
|
const credentials = [];
|
|
83
|
-
|
|
84
|
-
const addressIndices = {};
|
|
85
|
-
let nextAddressIndex = 0;
|
|
86
|
-
// Sort UTXOs by amount in descending order for optimal coin selection
|
|
87
|
-
const sortedUtxos = [...this._utxos].sort((a, b) => {
|
|
88
|
-
const amountA = BigInt(a.amount);
|
|
89
|
-
const amountB = BigInt(b.amount);
|
|
90
|
-
if (amountA > amountB)
|
|
91
|
-
return -1;
|
|
92
|
-
if (amountA < amountB)
|
|
93
|
-
return 1;
|
|
94
|
-
return 0;
|
|
95
|
-
});
|
|
96
|
-
// Process UTXOs to create inputs and credentials
|
|
97
|
-
for (const utxo of sortedUtxos) {
|
|
37
|
+
this.transaction._utxos.forEach((utxo) => {
|
|
98
38
|
const utxoAmount = BigInt(utxo.amount);
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
// Create TransferableInput for atomic transactions
|
|
115
|
-
const transferableInput = {
|
|
116
|
-
txID: Buffer.from(utxo.txid || constants_1.AMOUNT_STRING_ZERO.repeat(constants_1.TRANSACTION_ID_HEX_LENGTH), constants_1.HEX_ENCODING),
|
|
117
|
-
outputIndex: parseInt(utxo.outputidx || constants_1.AMOUNT_STRING_ZERO, constants_1.DECIMAL_RADIX),
|
|
118
|
-
assetID: this.getAssetId(),
|
|
119
|
-
input: {
|
|
120
|
-
amount: utxoAmount,
|
|
121
|
-
addressIndices: addressIndexArray,
|
|
122
|
-
threshold: utxo.threshold,
|
|
39
|
+
totalAmount += utxoAmount;
|
|
40
|
+
// Create input
|
|
41
|
+
const input = {
|
|
42
|
+
_type: flarejs_1.TypeSymbols.Input,
|
|
43
|
+
amount: () => utxoAmount,
|
|
44
|
+
sigIndices: sender.map((_, i) => i),
|
|
45
|
+
toBytes: () => new Uint8Array(),
|
|
46
|
+
};
|
|
47
|
+
// Create asset with Amounter interface
|
|
48
|
+
const assetId = {
|
|
49
|
+
_type: flarejs_1.TypeSymbols.BaseTx,
|
|
50
|
+
amount: () => utxoAmount,
|
|
51
|
+
toBytes: () => {
|
|
52
|
+
const bytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
|
|
53
|
+
return bytes;
|
|
123
54
|
},
|
|
124
55
|
};
|
|
125
|
-
//
|
|
56
|
+
// Create TransferableInput
|
|
57
|
+
const transferableInput = new flarejs_1.TransferableInput({
|
|
58
|
+
_type: flarejs_1.TypeSymbols.UTXOID,
|
|
59
|
+
txID: new flarejs_1.Id(new Uint8Array(Buffer.from(utxo.txid, 'hex'))),
|
|
60
|
+
outputIdx: new flarejs_1.Int(Number(utxo.outputidx)),
|
|
61
|
+
ID: () => utxo.txid,
|
|
62
|
+
toBytes: () => {
|
|
63
|
+
const txIdBytes = new Uint8Array(Buffer.from(utxo.txid, 'hex'));
|
|
64
|
+
const outputIdxBytes = new Uint8Array(4);
|
|
65
|
+
new DataView(outputIdxBytes.buffer).setInt32(0, Number(utxo.outputidx), true);
|
|
66
|
+
return Buffer.concat([txIdBytes, outputIdxBytes]);
|
|
67
|
+
},
|
|
68
|
+
}, new flarejs_1.Id(new Uint8Array(Buffer.from(utxo.outputidx.toString()))), assetId);
|
|
69
|
+
// Set input properties
|
|
70
|
+
Object.assign(transferableInput, { input });
|
|
126
71
|
inputs.push(transferableInput);
|
|
127
|
-
// Create credential
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
72
|
+
// Create empty credential for each input
|
|
73
|
+
const emptySignatures = sender.map(() => Buffer.alloc(0));
|
|
74
|
+
credentials.push({ signatures: emptySignatures });
|
|
75
|
+
});
|
|
76
|
+
// Create output if there is change
|
|
77
|
+
if (totalAmount > amount) {
|
|
78
|
+
const changeAmount = totalAmount - amount;
|
|
79
|
+
const output = {
|
|
80
|
+
_type: flarejs_1.TypeSymbols.BaseTx,
|
|
81
|
+
amount: () => changeAmount,
|
|
82
|
+
addresses: sender,
|
|
83
|
+
locktime: this.transaction._locktime,
|
|
84
|
+
threshold: this.transaction._threshold,
|
|
85
|
+
toBytes: () => new Uint8Array(),
|
|
86
|
+
};
|
|
87
|
+
// Create asset with Amounter interface
|
|
88
|
+
const assetId = {
|
|
89
|
+
_type: flarejs_1.TypeSymbols.BaseTx,
|
|
90
|
+
amount: () => changeAmount,
|
|
91
|
+
toBytes: () => {
|
|
92
|
+
const bytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
|
|
93
|
+
return bytes;
|
|
148
94
|
},
|
|
149
95
|
};
|
|
150
|
-
//
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
* @returns Credential instance
|
|
172
|
-
*/
|
|
173
|
-
createFlareCredential(_credentialId, signatures) {
|
|
174
|
-
if (!Array.isArray(signatures)) {
|
|
175
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_SIGNATURES_ARRAY);
|
|
176
|
-
}
|
|
177
|
-
if (signatures.length === constants_1.ZERO_NUMBER) {
|
|
178
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_SIGNATURES_EMPTY);
|
|
179
|
-
}
|
|
180
|
-
const sigs = signatures.map((sig, index) => {
|
|
181
|
-
// Handle empty/placeholder signatures
|
|
182
|
-
if (!sig || sig.length === 0) {
|
|
183
|
-
return new flarejs_1.Signature(new Uint8Array(constants_1.SECP256K1_SIGNATURE_LENGTH));
|
|
184
|
-
}
|
|
185
|
-
// Validate hex string format
|
|
186
|
-
const cleanSig = sig.startsWith(constants_1.HEX_PREFIX) ? sig.slice(constants_1.HEX_PREFIX_LENGTH) : sig;
|
|
187
|
-
if (!(0, utils_1.createFlexibleHexRegex)().test(cleanSig)) {
|
|
188
|
-
throw new sdk_core_1.BuildTransactionError(`Invalid hex signature at index ${index}: contains non-hex characters`);
|
|
189
|
-
}
|
|
190
|
-
// Convert to buffer and validate length
|
|
191
|
-
const sigBuffer = Buffer.from(cleanSig, constants_1.HEX_ENCODING);
|
|
192
|
-
if (sigBuffer.length > constants_1.SECP256K1_SIGNATURE_LENGTH) {
|
|
193
|
-
throw new sdk_core_1.BuildTransactionError(`Signature too long at index ${index}: ${sigBuffer.length} bytes (max ${constants_1.SECP256K1_SIGNATURE_LENGTH})`);
|
|
194
|
-
}
|
|
195
|
-
// Create fixed-length buffer and copy signature data
|
|
196
|
-
const fixedLengthBuffer = Buffer.alloc(constants_1.SECP256K1_SIGNATURE_LENGTH);
|
|
197
|
-
sigBuffer.copy(fixedLengthBuffer);
|
|
198
|
-
try {
|
|
199
|
-
return new flarejs_1.Signature(new Uint8Array(fixedLengthBuffer));
|
|
200
|
-
}
|
|
201
|
-
catch (error) {
|
|
202
|
-
throw new sdk_core_1.BuildTransactionError(`Failed to create signature at index ${index}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
try {
|
|
206
|
-
return new flarejs_1.Credential(sigs);
|
|
207
|
-
}
|
|
208
|
-
catch (error) {
|
|
209
|
-
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_CREATE_CREDENTIAL_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Base initBuilder used by concrete builders. For now just returns this so fluent API works.
|
|
214
|
-
*/
|
|
215
|
-
initBuilder(_tx) {
|
|
216
|
-
return this;
|
|
96
|
+
// Create TransferableOutput
|
|
97
|
+
const transferableOutput = new flarejs_1.TransferableInput({
|
|
98
|
+
_type: flarejs_1.TypeSymbols.UTXOID,
|
|
99
|
+
txID: new flarejs_1.Id(new Uint8Array(32)),
|
|
100
|
+
outputIdx: new flarejs_1.Int(0),
|
|
101
|
+
ID: () => '',
|
|
102
|
+
toBytes: () => {
|
|
103
|
+
const txIdBytes = new Uint8Array(32);
|
|
104
|
+
const outputIdxBytes = new Uint8Array(4);
|
|
105
|
+
return Buffer.concat([txIdBytes, outputIdxBytes]);
|
|
106
|
+
},
|
|
107
|
+
}, new flarejs_1.Id(new Uint8Array([0])), assetId);
|
|
108
|
+
// Set output properties
|
|
109
|
+
Object.assign(transferableOutput, { output });
|
|
110
|
+
outputs.push(transferableOutput);
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
inputs,
|
|
114
|
+
outputs,
|
|
115
|
+
credentials,
|
|
116
|
+
};
|
|
217
117
|
}
|
|
218
|
-
/**
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_INVALID_PRIVATE_KEY);
|
|
118
|
+
/** @inheritdoc */
|
|
119
|
+
async buildImplementation() {
|
|
120
|
+
this.buildFlareTransaction();
|
|
121
|
+
this.setTransactionType(this.transactionType);
|
|
122
|
+
if (this.hasSigner()) {
|
|
123
|
+
// Sign sequentially to ensure proper order
|
|
124
|
+
for (const keyPair of this._signer) {
|
|
125
|
+
await this.transaction.sign(keyPair);
|
|
227
126
|
}
|
|
228
|
-
// Create signature structure
|
|
229
|
-
const signature = {
|
|
230
|
-
privateKey: params.key,
|
|
231
|
-
signingMethod: constants_1.SIGNING_METHOD,
|
|
232
|
-
};
|
|
233
|
-
// Store signature for FlareJS compatibility
|
|
234
|
-
this.transaction._signature = signature;
|
|
235
|
-
this.transaction.hasCredentials = true;
|
|
236
|
-
return this;
|
|
237
|
-
}
|
|
238
|
-
catch (error) {
|
|
239
|
-
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_FLAREJS_SIGNING_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
240
127
|
}
|
|
128
|
+
return this.transaction;
|
|
241
129
|
}
|
|
242
130
|
/**
|
|
243
|
-
*
|
|
131
|
+
* Fee is fix for AVM atomic tx.
|
|
132
|
+
*
|
|
133
|
+
* @returns network.txFee
|
|
134
|
+
* @protected
|
|
244
135
|
*/
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
try {
|
|
248
|
-
// Validate transaction requirements
|
|
249
|
-
if (!this._utxos || this._utxos.length === 0) {
|
|
250
|
-
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_UTXOS_REQUIRED_BUILD);
|
|
251
|
-
}
|
|
252
|
-
// Create FlareJS transaction structure with atomic support
|
|
253
|
-
const transaction = {
|
|
254
|
-
_id: `${constants_1.TRANSACTION_ID_PREFIX}${Date.now()}`,
|
|
255
|
-
_inputs: [],
|
|
256
|
-
_outputs: [],
|
|
257
|
-
_type: this.transactionType,
|
|
258
|
-
signature: [],
|
|
259
|
-
fromAddresses: this.transaction._fromAddresses,
|
|
260
|
-
validationErrors: [],
|
|
261
|
-
// FlareJS methods with atomic support
|
|
262
|
-
toBroadcastFormat: () => `${constants_1.TRANSACTION_ID_PREFIX}${Date.now()}`,
|
|
263
|
-
toJson: () => ({
|
|
264
|
-
type: this.transactionType,
|
|
265
|
-
}),
|
|
266
|
-
explainTransaction: () => ({
|
|
267
|
-
type: this.transactionType,
|
|
268
|
-
inputs: [],
|
|
269
|
-
outputs: [],
|
|
270
|
-
outputAmount: constants_1.AMOUNT_STRING_ZERO,
|
|
271
|
-
rewardAddresses: [],
|
|
272
|
-
id: `${constants_1.FLARE_ATOMIC_PREFIX}${Date.now()}`,
|
|
273
|
-
changeOutputs: [],
|
|
274
|
-
changeAmount: constants_1.AMOUNT_STRING_ZERO,
|
|
275
|
-
fee: { fee: this.transaction._fee.fee },
|
|
276
|
-
}),
|
|
277
|
-
isTransactionForCChain: false,
|
|
278
|
-
loadInputsAndOutputs: () => {
|
|
279
|
-
/* FlareJS atomic transaction loading */
|
|
280
|
-
},
|
|
281
|
-
inputs: () => [],
|
|
282
|
-
outputs: () => [],
|
|
283
|
-
fee: () => ({ fee: this.transaction._fee.fee }),
|
|
284
|
-
feeRate: () => 0,
|
|
285
|
-
id: () => `${constants_1.FLARE_ATOMIC_PREFIX}${Date.now()}`,
|
|
286
|
-
type: this.transactionType,
|
|
287
|
-
};
|
|
288
|
-
return transaction;
|
|
289
|
-
}
|
|
290
|
-
catch (error) {
|
|
291
|
-
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_ENHANCED_BUILD_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
292
|
-
}
|
|
136
|
+
get fixedFee() {
|
|
137
|
+
return this.transaction._network.txFee;
|
|
293
138
|
}
|
|
294
139
|
/**
|
|
295
|
-
*
|
|
140
|
+
* Set the transaction type
|
|
141
|
+
*
|
|
142
|
+
* @param {TransactionType} transactionType The transaction type to be set
|
|
296
143
|
*/
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
try {
|
|
300
|
-
return {
|
|
301
|
-
type: this.transactionType,
|
|
302
|
-
inputs: [],
|
|
303
|
-
outputs: [],
|
|
304
|
-
outputAmount: constants_1.AMOUNT_STRING_ZERO,
|
|
305
|
-
rewardAddresses: [],
|
|
306
|
-
id: `${constants_1.FLARE_ATOMIC_PARSED_PREFIX}${Date.now()}`,
|
|
307
|
-
changeOutputs: [],
|
|
308
|
-
changeAmount: constants_1.AMOUNT_STRING_ZERO,
|
|
309
|
-
fee: { fee: this.transaction._fee.fee },
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
catch (error) {
|
|
313
|
-
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_ENHANCED_PARSE_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
314
|
-
}
|
|
144
|
+
setTransactionType(transactionType) {
|
|
145
|
+
this.transaction._type = transactionType;
|
|
315
146
|
}
|
|
316
147
|
}
|
|
317
148
|
exports.AtomicTransactionBuilder = AtomicTransactionBuilder;
|
|
318
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQStGO0FBQy9GLG1EQUFxRztBQUVyRywyQ0FnQ3FCO0FBQ3JCLG1DQUFpRDtBQUVqRDs7OztHQUlHO0FBQ0gsTUFBc0Isd0JBQXdCO0lBcUM1QyxZQUFZLFVBQWdDO1FBaENsQyxXQUFNLEdBQXFCLEVBQUUsQ0FBQztRQUU5QixnQkFBVyxHQWNqQjtZQUNGLFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLDhCQUFrQjtZQUM5QixhQUFhLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQztZQUM5QyxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQztZQUN6QyxjQUFjLEVBQUUsRUFBRTtZQUNsQixHQUFHLEVBQUUsRUFBRTtZQUNQLFNBQVMsRUFBRSw0QkFBZ0I7WUFDM0IsVUFBVSxFQUFFLDZCQUFpQjtZQUM3QixJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsOEJBQWtCLEVBQUU7WUFDakMsY0FBYyxFQUFFLEtBQUs7WUFDckIsY0FBYyxFQUFFLFVBQVUsR0FBWTtnQkFDcEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDakIsQ0FBQztTQUNGLENBQUM7UUFHQSxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBSUQ7OztPQUdHO0lBQ08sVUFBVTtRQUNsQixtREFBbUQ7UUFDbkQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUNuQyxDQUFD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QUUsOEJBQWtCO2dCQUNoQyxlQUFlLEVBQUUsRUFBRTtnQkFDbkIsRUFBRSxFQUFFLEdBQUcsc0NBQTBCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNoRCxhQUFhLEVBQUUsRUFBRTtnQkFDakIsWUFBWSxFQUFFLDhCQUFrQjtnQkFDaEMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTthQUN4QyxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksZ0NBQXFCLENBQzdCLEdBQUcsdUNBQTJCLEtBQUssS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMseUJBQWEsRUFBRSxDQUM1RixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQTFYRCw0REEwWEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSwgQmFzZVRyYW5zYWN0aW9uIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQ3JlZGVudGlhbCwgU2lnbmF0dXJlLCBUcmFuc2ZlcmFibGVJbnB1dCwgVHJhbnNmZXJhYmxlT3V0cHV0IH0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIERlY29kZWRVdHhvT2JqIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQge1xuICBBU1NFVF9JRF9MRU5HVEgsXG4gIFRSQU5TQUNUSU9OX0lEX0hFWF9MRU5HVEgsXG4gIFBSSVZBVEVfS0VZX0hFWF9MRU5HVEgsXG4gIFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RILFxuICBUUkFOU0FDVElPTl9JRF9QUkVGSVgsXG4gIERFRkFVTFRfTkVUV09SS19JRCxcbiAgRU1QVFlfQlVGRkVSX1NJWkUsXG4gIEhFWF9QUkVGSVgsXG4gIEhFWF9QUkVGSVhfTEVOR1RILFxuICBERUNJTUFMX1JBRElYLFxuICBTSUdOSU5HX01FVEhPRCxcbiAgQU1PVU5UX1NUUklOR19aRVJPLFxuICBERUZBVUxUX0xPQ0tUSU1FLFxuICBERUZBVUxUX1RIUkVTSE9MRCxcbiAgWkVST19CSUdJTlQsXG4gIFpFUk9fTlVNQkVSLFxuICBFUlJPUl9BTU9VTlRfUE9TSVRJVkUsXG4gIEVSUk9SX0NSRURFTlRJQUxTX0FSUkFZLFxuICBFUlJPUl9VVFhPU19SRVFVSVJFRCxcbiAgRVJST1JfU0lHTkFUVVJFU19BUlJBWSxcbiAgRVJST1JfU0lHTkFUVVJFU19FTVBUWSxcbiAgRVJST1JfSU5WQUxJRF9QUklWQVRFX0tFWSxcbiAgRVJST1JfVVRYT1NfUkVRVUlSRURfQlVJTEQsXG4gIEVSUk9SX0VOSEFOQ0VEX0JVSUxEX0ZBSUxFRCxcbiAgRVJST1JfRU5IQU5DRURfUEFSU0VfRkFJTEVELFxuICBFUlJPUl9GTEFSRUpTX1NJR05JTkdfRkFJTEVELFxuICBFUlJPUl9DUkVBVEVfQ1JFREVOVElBTF9GQUlMRUQsXG4gIEVSUk9SX1VOS05PV04sXG4gIEZMQVJFX0FUT01JQ19QUkVGSVgsXG4gIEZMQVJFX0FUT01JQ19QQVJTRURfUFJFRklYLFxuICBIRVhfRU5DT0RJTkcsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGNyZWF0ZUZsZXhpYmxlSGV4UmVnZXggfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBGbGFyZSBQLWNoYWluIGF0b21pYyB0cmFuc2FjdGlvbiBidWlsZGVyIHdpdGggRmxhcmVKUyBjcmVkZW50aWFsIHN1cHBvcnQuXG4gKiBUaGlzIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBidWlsZGluZyBGbGFyZSBQLWNoYWluIHRyYW5zYWN0aW9ucyB3aXRoIHByb3BlclxuICogY3JlZGVudGlhbCBoYW5kbGluZyB1c2luZyBGbGFyZUpTIENyZWRlbnRpYWwgYW5kIFNpZ25hdHVyZSBjbGFzc2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPjtcbiAgLy8gRXh0ZXJuYWwgY2hhaW4gaWQgKGRlc3RpbmF0aW9uKSBmb3IgZXhwb3J0IHRyYW5zYWN0aW9uc1xuICBwcm90ZWN0ZWQgX2V4dGVybmFsQ2hhaW5JZDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBfdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IHtcbiAgICBfbmV0d29yazogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgX25ldHdvcmtJRDogbnVtYmVyO1xuICAgIF9ibG9ja2NoYWluSUQ6IEJ1ZmZlcjtcbiAgICBfYXNzZXRJZDogQnVmZmVyO1xuICAgIF9mcm9tQWRkcmVzc2VzOiBzdHJpbmdbXTtcbiAgICBfdG86IHN0cmluZ1tdO1xuICAgIF9sb2NrdGltZTogYmlnaW50O1xuICAgIF90aHJlc2hvbGQ6IG51bWJlcjtcbiAgICBfZmVlOiB7IGZlZTogc3RyaW5nOyBmZWVSYXRlPzogc3RyaW5nOyBzaXplPzogbnVtYmVyIH07XG4gICAgaGFzQ3JlZGVudGlhbHM6IGJvb2xlYW47XG4gICAgX3R4PzogdW5rbm93bjtcbiAgICBfc2lnbmF0dXJlPzogdW5rbm93bjtcbiAgICBzZXRUcmFuc2FjdGlvbjogKHR4OiB1bmtub3duKSA9PiB2b2lkO1xuICB9ID0ge1xuICAgIF9uZXR3b3JrOiB7fSxcbiAgICBfbmV0d29ya0lEOiBERUZBVUxUX05FVFdPUktfSUQsXG4gICAgX2Jsb2NrY2hhaW5JRDogQnVmZmVyLmFsbG9jKEVNUFRZX0JVRkZFUl9TSVpFKSxcbiAgICBfYXNzZXRJZDogQnVmZmVyLmFsbG9jKEVNUFRZX0JVRkZFUl9TSVpFKSxcbiAgICBfZnJvbUFkZHJlc3NlczogW10sXG4gICAgX3RvOiBbXSxcbiAgICBfbG9ja3RpbWU6IERFRkFVTFRfTE9DS1RJTUUsXG4gICAgX3RocmVzaG9sZDogREVGQVVMVF9USFJFU0hPTEQsXG4gICAgX2ZlZTogeyBmZWU6IEFNT1VOVF9TVFJJTkdfWkVSTyB9LFxuICAgIGhhc0NyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICBzZXRUcmFuc2FjdGlvbjogZnVuY3Rpb24gKF90eDogdW5rbm93bikge1xuICAgICAgdGhpcy5fdHggPSBfdHg7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHRoaXMuX2NvaW5Db25maWcgPSBjb2luQ29uZmlnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFzc2V0IElEIGZvciBGbGFyZSBuZXR3b3JrIHRyYW5zYWN0aW9uc1xuICAgKiBAcmV0dXJucyBCdWZmZXIgY29udGFpbmluZyB0aGUgYXNzZXQgSURcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBc3NldElkKCk6IEJ1ZmZlciB7XG4gICAgLy8gVXNlIHRoZSBhc3NldCBJRCBmcm9tIHRyYW5zYWN0aW9uIGlmIGFscmVhZHkgc2V0XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQgJiYgdGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZDtcbiAgICB9XG5cbiAgICAvLyBGb3IgbmF0aXZlIEZMUiB0cmFuc2FjdGlvbnMsIHJldHVybiB6ZXJvLWZpbGxlZCBidWZmZXIgYXMgcGxhY2Vob2xkZXJcbiAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoaXMgd291bGQgYmUgb2J0YWluZWQgZnJvbSB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uXG4gICAgLy8gb3IgRmxhcmVKUyBBUEkgdG8gZ2V0IHRoZSBhY3R1YWwgbmF0aXZlIGFzc2V0IElEXG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYyhBU1NFVF9JRF9MRU5HVEgpO1xuICB9XG5cbiAgdmFsaWRhdGVBbW91bnQoYW1vdW50OiBiaWdpbnQpOiB2b2lkIHtcbiAgICBpZiAoYW1vdW50IDw9IFpFUk9fQklHSU5UKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX0FNT1VOVF9QT1NJVElWRSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IGNyZWRlbnRpYWxzIGFycmF5IGlzIHByb3Blcmx5IGZvcm1lZFxuICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgLSBBcnJheSBvZiBjcmVkZW50aWFscyB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlQ3JlZGVudGlhbHMoY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXSk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShjcmVkZW50aWFscykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfQ1JFREVOVElBTFNfQVJSQVkpO1xuICAgIH1cblxuICAgIGNyZWRlbnRpYWxzLmZvckVhY2goKGNyZWRlbnRpYWwsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIShjcmVkZW50aWFsIGluc3RhbmNlb2YgQ3JlZGVudGlhbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBjcmVkZW50aWFsIGF0IGluZGV4ICR7aW5kZXh9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBpbnB1dHMsIG91dHB1dHMsIGFuZCBjcmVkZW50aWFscyBmb3IgRmxhcmUgUC1jaGFpbiBhdG9taWMgdHJhbnNhY3Rpb25zLlxuICAgKiBCYXNlZCBvbiBBVkFYIFAtY2hhaW4gaW1wbGVtZW50YXRpb24gYWRhcHRlZCBmb3IgRmxhcmVKUy5cbiAgICpcbiAgICogTm90ZTogVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW1wbGVtZW50YXRpb24gdGhhdCBjcmVhdGVzIHRoZSBjb3JlIHN0cnVjdHVyZS5cbiAgICogVGhlIEZsYXJlSlMgdHlwZSBzeXN0ZW0gaW50ZWdyYXRpb24gd2lsbCBiZSByZWZpbmVkIGluIGZ1dHVyZSBpdGVyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gdG90YWwgLSBUb3RhbCBhbW91bnQgbmVlZGVkIGluY2x1ZGluZyBmZWVzXG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIFRyYW5zZmVyYWJsZUlucHV0W10sIFRyYW5zZmVyYWJsZU91dHB1dFtdLCBhbmQgQ3JlZGVudGlhbFtdXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlSW5wdXRPdXRwdXQodG90YWw6IGJpZ2ludCk6IHtcbiAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgb3V0cHV0czogVHJhbnNmZXJhYmxlT3V0cHV0W107XG4gICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgfSB7XG4gICAgaWYgKCF0aGlzLl91dHhvcyB8fCB0aGlzLl91dHhvcy5sZW5ndGggPT09IFpFUk9fTlVNQkVSKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX1VUWE9TX1JFUVVJUkVEKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXSA9IFtdO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcblxuICAgIGxldCBpbnB1dFN1bSA9IDBuO1xuICAgIGNvbnN0IGFkZHJlc3NJbmRpY2VzOiB7IFthZGRyZXNzOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgIGxldCBuZXh0QWRkcmVzc0luZGV4ID0gMDtcblxuICAgIC8vIFNvcnQgVVRYT3MgYnkgYW1vdW50IGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yIG9wdGltYWwgY29pbiBzZWxlY3Rpb25cbiAgICBjb25zdCBzb3J0ZWRVdHhvcyA9IFsuLi50aGlzLl91dHhvc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYW1vdW50QSA9IEJpZ0ludChhLmFtb3VudCk7XG4gICAgICBjb25zdCBhbW91bnRCID0gQmlnSW50KGIuYW1vdW50KTtcbiAgICAgIGlmIChhbW91bnRBID4gYW1vdW50QikgcmV0dXJuIC0xO1xuICAgICAgaWYgKGFtb3VudEEgPCBhbW91bnRCKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBVVFhPcyB0byBjcmVhdGUgaW5wdXRzIGFuZCBjcmVkZW50aWFsc1xuICAgIGZvciAoY29uc3QgdXR4byBvZiBzb3J0ZWRVdHhvcykge1xuICAgICAgY29uc3QgdXR4b0Ftb3VudCA9IEJpZ0ludCh1dHhvLmFtb3VudCk7XG5cbiAgICAgIGlmIChpbnB1dFN1bSA+PSB0b3RhbCkge1xuICAgICAgICBicmVhazsgLy8gV2UgaGF2ZSBlbm91Z2ggaW5wdXRzXG4gICAgICB9XG5cbiAgICAgIC8vIFRyYWNrIGlucHV0IHN1bVxuICAgICAgaW5wdXRTdW0gKz0gdXR4b0Ftb3VudDtcblxuICAgICAgLy8gVHJhY2sgYWRkcmVzcyBpbmRpY2VzIGZvciBzaWduYXR1cmUgb3JkZXJpbmcgKG1pbWljcyBBVkFYIHBhdHRlcm4pXG4gICAgICBjb25zdCBhZGRyZXNzSW5kZXhBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiB1dHhvLmFkZHJlc3Nlcykge1xuICAgICAgICBpZiAoIShhZGRyZXNzIGluIGFkZHJlc3NJbmRpY2VzKSkge1xuICAgICAgICAgIGFkZHJlc3NJbmRpY2VzW2FkZHJlc3NdID0gbmV4dEFkZHJlc3NJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGFkZHJlc3NJbmRleEFycmF5LnB1c2goYWRkcmVzc0luZGljZXNbYWRkcmVzc10pO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSBhZGRyZXNzIGluZGljZXMgb24gdGhlIFVUWE8gZm9yIGNyZWRlbnRpYWwgY3JlYXRpb25cbiAgICAgIHV0eG8uYWRkcmVzc2VzSW5kZXggPSBhZGRyZXNzSW5kZXhBcnJheTtcblxuICAgICAgLy8gQ3JlYXRlIFRyYW5zZmVyYWJsZUlucHV0IGZvciBhdG9taWMgdHJhbnNhY3Rpb25zXG4gICAgICBjb25zdCB0cmFuc2ZlcmFibGVJbnB1dCA9IHtcbiAgICAgICAgdHhJRDogQnVmZmVyLmZyb20odXR4by50eGlkIHx8IEFNT1VOVF9TVFJJTkdfWkVSTy5yZXBlYXQoVFJBTlNBQ1RJT05fSURfSEVYX0xFTkdUSCksIEhFWF9FTkNPRElORyksXG4gICAgICAgIG91dHB1dEluZGV4OiBwYXJzZUludCh1dHhvLm91dHB1dGlkeCB8fCBBTU9VTlRfU1RSSU5HX1pFUk8sIERFQ0lNQUxfUkFESVgpLFxuICAgICAgICBhc3NldElEOiB0aGlzLmdldEFzc2V0SWQoKSxcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBhbW91bnQ6IHV0eG9BbW91bnQsXG4gICAgICAgICAgYWRkcmVzc0luZGljZXM6IGFkZHJlc3NJbmRleEFycmF5LFxuICAgICAgICAgIHRocmVzaG9sZDogdXR4by50aHJlc2hvbGQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSB0aGUgaW5wdXQgKHR5cGUgYXNzZXJ0aW9uIGZvciBjb21wYXRpYmlsaXR5KVxuICAgICAgaW5wdXRzLnB1c2godHJhbnNmZXJhYmxlSW5wdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVJbnB1dCk7XG5cbiAgICAgIC8vIENyZWF0ZSBjcmVkZW50aWFsIHdpdGggcGxhY2Vob2xkZXIgc2lnbmF0dXJlc1xuICAgICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB0aGVzZSB3b3VsZCBiZSBhY3R1YWwgc2lnbmF0dXJlc1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHV0eG8udGhyZXNob2xkIH0sICgpID0+ICcnKTtcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSB0aGlzLmNyZWF0ZUZsYXJlQ3JlZGVudGlhbCgwLCBzaWduYXR1cmVzKTtcbiAgICAgIGNyZWRlbnRpYWxzLnB1c2goY3JlZGVudGlhbCk7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IHdlIGhhdmUgZW5vdWdoIGlucHV0c1xuICAgIGlmIChpbnB1dFN1bSA8IHRvdGFsKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnN1ZmZpY2llbnQgZnVuZHM6IG5lZWQgJHt0b3RhbH0sIGhhdmUgJHtpbnB1dFN1bX1gKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY2hhbmdlIG91dHB1dCBpZiB3ZSBoYXZlIGV4Y2VzcyBpbnB1dCBhbW91bnRcbiAgICBpZiAoaW5wdXRTdW0gPiB0b3RhbCkge1xuICAgICAgY29uc3QgY2hhbmdlQW1vdW50ID0gaW5wdXRTdW0gLSB0b3RhbDtcblxuICAgICAgLy8gQ3JlYXRlIGNoYW5nZSBvdXRwdXQgZm9yIGF0b21pYyB0cmFuc2FjdGlvbnNcbiAgICAgIGNvbnN0IGNoYW5nZU91dHB1dCA9IHtcbiAgICAgICAgYXNzZXRJRDogdGhpcy5nZXRBc3NldElkKCksXG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIGFtb3VudDogY2hhbmdlQW1vdW50LFxuICAgICAgICAgIGFkZHJlc3NlczogdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgbG9ja3RpbWU6IDBuLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgLy8gQWRkIHRoZSBjaGFuZ2Ugb3V0cHV0ICh0eXBlIGFzc2VydGlvbiBmb3IgY29tcGF0aWJpbGl0eSlcbiAgICAgIG91dHB1dHMucHVzaChjaGFuZ2VPdXRwdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVPdXRwdXQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgVVRYT3MgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBpcyByZXF1aXJlZCBmb3IgY3JlYXRpbmcgaW5wdXRzIGFuZCBvdXRwdXRzLlxuICAgKlxuICAgKiBAcGFyYW0gdXR4b3MgLSBBcnJheSBvZiBkZWNvZGVkIFVUWE8gb2JqZWN0c1xuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICB1dHhvcyh1dHhvczogRGVjb2RlZFV0eG9PYmpbXSk6IHRoaXMge1xuICAgIHRoaXMuX3V0eG9zID0gdXR4b3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRmxhcmUgZXF1aXZhbGVudCBvZiBBdmFsYW5jaGUncyBTZWxlY3RDcmVkZW50aWFsQ2xhc3NcbiAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgd2l0aCB0aGUgcHJvdmlkZWQgc2lnbmF0dXJlc1xuICAgKlxuICAgKiBAcGFyYW0gY3JlZGVudGlhbElkIC0gVGhlIGNyZWRlbnRpYWwgSUQgKG5vdCB1c2VkIGluIEZsYXJlSlMgYnV0IGtlcHQgZm9yIGNvbXBhdGliaWxpdHkpXG4gICAqIEBwYXJhbSBzaWduYXR1cmVzIC0gQXJyYXkgb2Ygc2lnbmF0dXJlIGhleCBzdHJpbmdzIG9yIGVtcHR5IHN0cmluZ3MgZm9yIHBsYWNlaG9sZGVyc1xuICAgKiBAcmV0dXJucyBDcmVkZW50aWFsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRmxhcmVDcmVkZW50aWFsKF9jcmVkZW50aWFsSWQ6IG51bWJlciwgc2lnbmF0dXJlczogc3RyaW5nW10pOiBDcmVkZW50aWFsIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2lnbmF0dXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfU0lHTkFUVVJFU19BUlJBWSk7XG4gICAgfVxuXG4gICAgaWYgKHNpZ25hdHVyZXMubGVuZ3RoID09PSBaRVJPX05VTUJFUikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9TSUdOQVRVUkVTX0VNUFRZKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWdzID0gc2lnbmF0dXJlcy5tYXAoKHNpZywgaW5kZXgpID0+IHtcbiAgICAgIC8vIEhhbmRsZSBlbXB0eS9wbGFjZWhvbGRlciBzaWduYXR1cmVzXG4gICAgICBpZiAoIXNpZyB8fCBzaWcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKG5ldyBVaW50OEFycmF5KFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGhleCBzdHJpbmcgZm9ybWF0XG4gICAgICBjb25zdCBjbGVhblNpZyA9IHNpZy5zdGFydHNXaXRoKEhFWF9QUkVGSVgpID8gc2lnLnNsaWNlKEhFWF9QUkVGSVhfTEVOR1RIKSA6IHNpZztcbiAgICAgIGlmICghY3JlYXRlRmxleGlibGVIZXhSZWdleCgpLnRlc3QoY2xlYW5TaWcpKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgaGV4IHNpZ25hdHVyZSBhdCBpbmRleCAke2luZGV4fTogY29udGFpbnMgbm9uLWhleCBjaGFyYWN0ZXJzYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgdG8gYnVmZmVyIGFuZCB2YWxpZGF0ZSBsZW5ndGhcbiAgICAgIGNvbnN0IHNpZ0J1ZmZlciA9IEJ1ZmZlci5mcm9tKGNsZWFuU2lnLCBIRVhfRU5DT0RJTkcpO1xuICAgICAgaWYgKHNpZ0J1ZmZlci5sZW5ndGggPiBTRUNQMjU2SzFfU0lHTkFUVVJFX0xFTkdUSCkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgIGBTaWduYXR1cmUgdG9vIGxvbmcgYXQgaW5kZXggJHtpbmRleH06ICR7c2lnQnVmZmVyLmxlbmd0aH0gYnl0ZXMgKG1heCAke1NFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIfSlgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBmaXhlZC1sZW5ndGggYnVmZmVyIGFuZCBjb3B5IHNpZ25hdHVyZSBkYXRhXG4gICAgICBjb25zdCBmaXhlZExlbmd0aEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhTRUNQMjU2SzFfU0lHTkFUVVJFX0xFTkdUSCk7XG4gICAgICBzaWdCdWZmZXIuY29weShmaXhlZExlbmd0aEJ1ZmZlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKG5ldyBVaW50OEFycmF5KGZpeGVkTGVuZ3RoQnVmZmVyKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIHNpZ25hdHVyZSBhdCBpbmRleCAke2luZGV4fTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgQ3JlZGVudGlhbChzaWdzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfQ1JFQVRFX0NSRURFTlRJQUxfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmFzZSBpbml0QnVpbGRlciB1c2VkIGJ5IGNvbmNyZXRlIGJ1aWxkZXJzLiBGb3Igbm93IGp1c3QgcmV0dXJucyB0aGlzIHNvIGZsdWVudCBBUEkgd29ya3MuXG4gICAqL1xuICBpbml0QnVpbGRlcihfdHg6IHVua25vd24pOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIHRyYW5zYWN0aW9uIHdpdGggcHJpdmF0ZSBrZXkgdXNpbmcgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBzaWduKHBhcmFtczogeyBrZXk6IHN0cmluZyB9KTogdGhpcyB7XG4gICAgLy8gRmxhcmVKUyBzaWduaW5nIGltcGxlbWVudGF0aW9uIHdpdGggYXRvbWljIHRyYW5zYWN0aW9uIHN1cHBvcnRcbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgcHJpdmF0ZSBrZXkgZm9ybWF0IChwbGFjZWhvbGRlciBpbXBsZW1lbnRhdGlvbilcbiAgICAgIGlmICghcGFyYW1zLmtleSB8fCBwYXJhbXMua2V5Lmxlbmd0aCA8IFBSSVZBVEVfS0VZX0hFWF9MRU5HVEgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9JTlZBTElEX1BSSVZBVEVfS0VZKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHNpZ25hdHVyZSBzdHJ1Y3R1cmVcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHtcbiAgICAgICAgcHJpdmF0ZUtleTogcGFyYW1zLmtleSxcbiAgICAgICAgc2lnbmluZ01ldGhvZDogU0lHTklOR19NRVRIT0QsXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSBzaWduYXR1cmUgZm9yIEZsYXJlSlMgY29tcGF0aWJpbGl0eVxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5oYXNDcmVkZW50aWFscyA9IHRydWU7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgJHtFUlJPUl9GTEFSRUpTX1NJR05JTkdfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHRyYW5zYWN0aW9uIHVzaW5nIEZsYXJlSlMgY29tcGF0aWJpbGl0eVxuICAgKi9cbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTxCYXNlVHJhbnNhY3Rpb24+IHtcbiAgICAvLyBGbGFyZUpTIFVuc2lnbmVkVHggY3JlYXRpb24gd2l0aCBhdG9taWMgdHJhbnNhY3Rpb24gc3VwcG9ydFxuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSB0cmFuc2FjdGlvbiByZXF1aXJlbWVudHNcbiAgICAgIGlmICghdGhpcy5fdXR4b3MgfHwgdGhpcy5fdXR4b3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfVVRYT1NfUkVRVUlSRURfQlVJTEQpO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgRmxhcmVKUyB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUgd2l0aCBhdG9taWMgc3VwcG9ydFxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB7XG4gICAgICAgIF9pZDogYCR7VFJBTlNBQ1RJT05fSURfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICBfaW5wdXRzOiBbXSxcbiAgICAgICAgX291dHB1dHM6IFtdLFxuICAgICAgICBfdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICAgIHNpZ25hdHVyZTogW10gYXMgc3RyaW5nW10sXG5cbiAgICAgICAgZnJvbUFkZHJlc3NlczogdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyxcbiAgICAgICAgdmFsaWRhdGlvbkVycm9yczogW10sXG5cbiAgICAgICAgLy8gRmxhcmVKUyBtZXRob2RzIHdpdGggYXRvbWljIHN1cHBvcnRcbiAgICAgICAgdG9Ccm9hZGNhc3RGb3JtYXQ6ICgpID0+IGAke1RSQU5TQUNUSU9OX0lEX1BSRUZJWH0ke0RhdGUubm93KCl9YCxcbiAgICAgICAgdG9Kc29uOiAoKSA9PiAoe1xuICAgICAgICAgIHR5cGU6IHRoaXMudHJhbnNhY3Rpb25UeXBlLFxuICAgICAgICB9KSxcblxuICAgICAgICBleHBsYWluVHJhbnNhY3Rpb246ICgpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0+ICh7XG4gICAgICAgICAgdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgICBvdXRwdXRBbW91bnQ6IEFNT1VOVF9TVFJJTkdfWkVSTyxcbiAgICAgICAgICByZXdhcmRBZGRyZXNzZXM6IFtdLFxuICAgICAgICAgIGlkOiBgJHtGTEFSRV9BVE9NSUNfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICAgIGNoYW5nZUFtb3VudDogQU1PVU5UX1NUUklOR19aRVJPLFxuICAgICAgICAgIGZlZTogeyBmZWU6IHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgfSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgaXNUcmFuc2FjdGlvbkZvckNDaGFpbjogZmFsc2UsXG4gICAgICAgIGxvYWRJbnB1dHNBbmRPdXRwdXRzOiAoKSA9PiB7XG4gICAgICAgICAgLyogRmxhcmVKUyBhdG9taWMgdHJhbnNhY3Rpb24gbG9hZGluZyAqL1xuICAgICAgICB9LFxuICAgICAgICBpbnB1dHM6ICgpID0+IFtdLFxuICAgICAgICBvdXRwdXRzOiAoKSA9PiBbXSxcbiAgICAgICAgZmVlOiAoKSA9PiAoeyBmZWU6IHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgfSksXG4gICAgICAgIGZlZVJhdGU6ICgpID0+IDAsXG4gICAgICAgIGlkOiAoKSA9PiBgJHtGTEFSRV9BVE9NSUNfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICB0eXBlOiB0aGlzLnRyYW5zYWN0aW9uVHlwZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBCYXNlVHJhbnNhY3Rpb247XG5cbiAgICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfRU5IQU5DRURfQlVJTERfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYW5kIGV4cGxhaW4gYSB0cmFuc2FjdGlvbiBmcm9tIGhleCB1c2luZyBGbGFyZUpTIGNvbXBhdGliaWxpdHlcbiAgICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICAvLyBGbGFyZUpTIHRyYW5zYWN0aW9uIHBhcnNpbmcgd2l0aCBhdG9taWMgc3VwcG9ydFxuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiB0aGlzLnRyYW5zYWN0aW9uVHlwZSxcbiAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgIG91dHB1dEFtb3VudDogQU1PVU5UX1NUUklOR19aRVJPLFxuICAgICAgICByZXdhcmRBZGRyZXNzZXM6IFtdLFxuICAgICAgICBpZDogYCR7RkxBUkVfQVRPTUlDX1BBUlNFRF9QUkVGSVh9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6IEFNT1VOVF9TVFJJTkdfWkVSTyxcbiAgICAgICAgZmVlOiB7IGZlZTogdGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSB9LFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfRU5IQU5DRURfUEFSU0VfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsNkRBQTBEO0FBQzFELCtDQUE0QztBQUM1QyxtREFBZ0Y7QUFVaEYsTUFBc0Isd0JBQXlCLFNBQVEsdUNBQWtCO0lBSXZFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBSFgsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFJOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHlCQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNPLGlCQUFpQixDQUFDLE1BQWM7UUFLeEMsTUFBTSxNQUFNLEdBQUksSUFBSSxDQUFDLFdBQTJCLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hFLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLCtCQUErQjtZQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsTUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBd0IsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sV0FBVyxHQUFVLEVBQUUsQ0FBQztRQUU3QixJQUFJLENBQUMsV0FBMkIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMs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TEQsNERBaUxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zZmVyYWJsZUlucHV0LCBJbnQsIElkLCBUeXBlU3ltYm9scyB9IGZyb20gJ0BmbGFyZW5ldHdvcmsvZmxhcmVqcyc7XG5pbXBvcnQgeyBEZWNvZGVkVXR4b09iaiB9IGZyb20gJy4vaWZhY2UnO1xuXG4vLyBJbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCBjYW4gcHJvdmlkZSBhbiBhbW91bnRcbmludGVyZmFjZSBBbW91bnRlciB7XG4gIF90eXBlOiBUeXBlU3ltYm9scztcbiAgYW1vdW50OiAoKSA9PiBiaWdpbnQ7XG4gIHRvQnl0ZXM6ICgpID0+IFVpbnQ4QXJyYXk7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgX2V4dGVybmFsQ2hhaW5JZDogQnVmZmVyO1xuICBwcm90ZWN0ZWQgcmVjb3ZlclNpZ25lciA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgaW5wdXRzIGFuZCBvdXRwdXRzIGZyb20gVVRYT3NcbiAgICogQHBhcmFtIHtiaWdpbnR9IGFtb3VudCBBbW91bnQgdG8gdHJhbnNmZXJcbiAgICogQHJldHVybiB7XG4gICAqICAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAqICAgICBvdXRwdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdO1xuICAgKiAgICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgICogfVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlSW5wdXRPdXRwdXQoYW1vdW50OiBiaWdpbnQpOiB7XG4gICAgaW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdO1xuICAgIG91dHB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgY3JlZGVudGlhbHM6IGFueVtdO1xuICB9IHtcbiAgICBjb25zdCBzZW5kZXIgPSAodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX2Zyb21BZGRyZXNzZXMuc2xpY2UoKTtcbiAgICBpZiAodGhpcy5yZWNvdmVyU2lnbmVyKSB7XG4gICAgICAvLyBzd2l0Y2ggZmlyc3QgYW5kIGxhc3Qgc2lnbmVyXG4gICAgICBjb25zdCB0bXAgPSBzZW5kZXIucG9wKCk7XG4gICAgICBzZW5kZXIucHVzaChzZW5kZXJbMF0pO1xuICAgICAgaWYgKHRtcCkge1xuICAgICAgICBzZW5kZXJbMF0gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRvdGFsQW1vdW50ID0gQmlnSW50KDApO1xuICAgIGNvbnN0IGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBjcmVkZW50aWFsczogYW55W10gPSBbXTtcblxuICAgICh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fdXR4b3MuZm9yRWFjaCgodXR4bzogRGVjb2RlZFV0eG9PYmopID0+IHtcbiAgICAgIGNvbnN0IHV0eG9BbW91bnQgPSBCaWdJbnQodXR4by5hbW91bnQpO1xuICAgICAgdG90YWxBbW91bnQgKz0gdXR4b0Ftb3VudDtcblxuICAgICAgLy8gQ3JlYXRlIGlucHV0XG4gICAgICBjb25zdCBpbnB1dCA9IHtcbiAgICAgICAgX3R5cGU6IFR5cGVTeW1ib2xzLklucHV0LFxuICAgICAgICBhbW91bnQ6ICgpID0+IHV0eG9BbW91bnQsXG4gICAgICAgIHNpZ0luZGljZXM6IHNlbmRlci5tYXAoKF8sIGkpID0+IGkpLFxuICAgICAgICB0b0J5dGVzOiAoKSA9PiBuZXcgVWludDhBcnJheSgpLFxuICAgICAgfTtcblxuICAgICAgLy8gQ3JlYXRlIGFzc2V0IHdpdGggQW1vdW50ZXIgaW50ZXJmYWNlXG4gICAgICBjb25zdCBhc3NldElkOiBBbW91bnRlciA9IHtcbiAgICAgICAgX3R5cGU6IFR5cGVTeW1ib2xzLkJhc2VUeCxcbiAgICAgICAgYW1vdW50OiAoKSA9PiB1dHhvQW1vdW50LFxuICAgICAgICB0b0J5dGVzOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSgodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX2Fzc2V0SWQsICdoZXgnKSk7XG4gICAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgLy8gQ3JlYXRlIFRyYW5zZmVyYWJsZUlucHV0XG4gICAgICBjb25zdCB0cmFuc2ZlcmFibGVJbnB1dCA9IG5ldyBUcmFuc2ZlcmFibGVJbnB1dChcbiAgICAgICAge1xuICAgICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5VVFhPSUQsXG4gICAgICAgICAgdHhJRDogbmV3IElkKG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHV0eG8udHhpZCwgJ2hleCcpKSksXG4gICAgICAgICAgb3V0cHV0SWR4OiBuZXcgSW50KE51bWJlcih1dHhvLm91dHB1dGlkeCkpLFxuICAgICAgICAgIElEOiAoKSA9PiB1dHhvLnR4aWQsXG4gICAgICAgICAgdG9CeXRlczogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHhJZEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odXR4by50eGlkLCAnaGV4JykpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0SWR4Qnl0ZXMgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgICAgIG5ldyBEYXRhVmlldyhvdXRwdXRJZHhCeXRlcy5idWZmZXIpLnNldEludDMyKDAsIE51bWJlcih1dHhvLm91dHB1dGlkeCksIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW3R4SWRCeXRlcywgb3V0cHV0SWR4Qnl0ZXNdKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odXR4by5vdXRwdXRpZHgudG9TdHJpbmcoKSkpKSxcbiAgICAgICAgYXNzZXRJZFxuICAgICAgKTtcblxuICAgICAgLy8gU2V0IGlucHV0IHByb3BlcnRpZXNcbiAgICAgIE9iamVjdC5hc3NpZ24odHJhbnNmZXJhYmxlSW5wdXQsIHsgaW5wdXQgfSk7XG4gICAgICBpbnB1dHMucHVzaCh0cmFuc2ZlcmFibGVJbnB1dCk7XG5cbiAgICAgIC8vIENyZWF0ZSBlbXB0eSBjcmVkZW50aWFsIGZvciBlYWNoIGlucHV0XG4gICAgICBjb25zdCBlbXB0eVNpZ25hdHVyZXMgPSBzZW5kZXIubWFwKCgpID0+IEJ1ZmZlci5hbGxvYygwKSk7XG4gICAgICBjcmVkZW50aWFscy5wdXNoKHsgc2lnbmF0dXJlczogZW1wdHlTaWduYXR1cmVzIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIG91dHB1dCBpZiB0aGVyZSBpcyBjaGFuZ2VcbiAgICBpZiAodG90YWxBbW91bnQgPiBhbW91bnQpIHtcbiAgICAgIGNvbnN0IGNoYW5nZUFtb3VudCA9IHRvdGFsQW1vdW50IC0gYW1vdW50O1xuICAgICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgICBfdHlwZTogVHlwZVN5bWJvbHMuQmFzZVR4LFxuICAgICAgICBhbW91bnQ6ICgpID0+IGNoYW5nZUFtb3VudCxcbiAgICAgICAgYWRkcmVzc2VzOiBzZW5kZXIsXG4gICAgICAgIGxvY2t0aW1lOiAodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX2xvY2t0aW1lLFxuICAgICAgICB0aHJlc2hvbGQ6ICh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fdGhyZXNob2xkLFxuICAgICAgICB0b0J5dGVzOiAoKSA9PiBuZXcgVWludDhBcnJheSgpLFxuICAgICAgfTtcblxuICAgICAgLy8gQ3JlYXRlIGFzc2V0IHdpdGggQW1vdW50ZXIgaW50ZXJmYWNlXG4gICAgICBjb25zdCBhc3NldElkOiBBbW91bnRlciA9IHtcbiAgICAgICAgX3R5cGU6IFR5cGVTeW1ib2xzLkJhc2VUeCxcbiAgICAgICAgYW1vdW50OiAoKSA9PiBjaGFuZ2VBbW91bnQsXG4gICAgICAgIHRvQnl0ZXM6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKCh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fYXNzZXRJZCwgJ2hleCcpKTtcbiAgICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBDcmVhdGUgVHJhbnNmZXJhYmxlT3V0cHV0XG4gICAgICBjb25zdCB0cmFuc2ZlcmFibGVPdXRwdXQgPSBuZXcgVHJhbnNmZXJhYmxlSW5wdXQoXG4gICAgICAgIHtcbiAgICAgICAgICBfdHlwZTogVHlwZVN5bWJvbHMuVVRYT0lELFxuICAgICAgICAgIHR4SUQ6IG5ldyBJZChuZXcgVWludDhBcnJheSgzMikpLFxuICAgICAgICAgIG91dHB1dElkeDogbmV3IEludCgwKSxcbiAgICAgICAgICBJRDogKCkgPT4gJycsXG4gICAgICAgICAgdG9CeXRlczogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHhJZEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0SWR4Qnl0ZXMgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFt0eElkQnl0ZXMsIG91dHB1dElkeEJ5dGVzXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbmV3IElkKG5ldyBVaW50OEFycmF5KFswXSkpLFxuICAgICAgICBhc3NldElkXG4gICAgICApO1xuXG4gICAgICAvLyBTZXQgb3V0cHV0IHByb3BlcnRpZXNcbiAgICAgIE9iamVjdC5hc3NpZ24odHJhbnNmZXJhYmxlT3V0cHV0LCB7IG91dHB1dCB9KTtcbiAgICAgIG91dHB1dHMucHVzaCh0cmFuc2ZlcmFibGVPdXRwdXQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHMsXG4gICAgICBvdXRwdXRzLFxuICAgICAgY3JlZGVudGlhbHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgdGhpcy5idWlsZEZsYXJlVHJhbnNhY3Rpb24oKTtcbiAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZSh0aGlzLnRyYW5zYWN0aW9uVHlwZSk7XG4gICAgaWYgKHRoaXMuaGFzU2lnbmVyKCkpIHtcbiAgICAgIC8vIFNpZ24gc2VxdWVudGlhbGx5IHRvIGVuc3VyZSBwcm9wZXIgb3JkZXJcbiAgICAgIGZvciAoY29uc3Qga2V5UGFpciBvZiB0aGlzLl9zaWduZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy50cmFuc2FjdGlvbi5zaWduKGtleVBhaXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGF2YXggdHJhbnNhY3Rpb24uIHRyYW5zYWN0aW9uIGZpZWxkIGlzIGNoYW5nZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnVpbGRGbGFyZVRyYW5zYWN0aW9uKCk6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBGZWUgaXMgZml4IGZvciBBVk0gYXRvbWljIHR4LlxuICAgKlxuICAgKiBAcmV0dXJucyBuZXR3b3JrLnR4RmVlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgZml4ZWRGZWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay50eEZlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXRcbiAgICovXG4gIHNldFRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cbn1cbiJdfQ==
|