@bitgo/sdk-coin-avaxp 5.2.13 → 5.2.15

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.
Files changed (133) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/package.json +6 -6
  3. package/LICENSE +0 -191
  4. package/dist/src/avaxp.d.ts +0 -91
  5. package/dist/src/avaxp.d.ts.map +0 -1
  6. package/dist/src/avaxp.js +0 -343
  7. package/dist/src/iface.d.ts +0 -42
  8. package/dist/src/iface.d.ts.map +0 -1
  9. package/dist/src/iface.js +0 -3
  10. package/dist/src/index.d.ts +0 -6
  11. package/dist/src/index.d.ts.map +0 -1
  12. package/dist/src/index.js +0 -45
  13. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +0 -21
  14. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +0 -1
  15. package/dist/src/lib/atomicInCTransactionBuilder.js +0 -49
  16. package/dist/src/lib/atomicTransactionBuilder.d.ts +0 -38
  17. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +0 -1
  18. package/dist/src/lib/atomicTransactionBuilder.js +0 -129
  19. package/dist/src/lib/delegatorTxBuilder.d.ts +0 -95
  20. package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
  21. package/dist/src/lib/delegatorTxBuilder.js +0 -285
  22. package/dist/src/lib/deprecatedTransaction.d.ts +0 -98
  23. package/dist/src/lib/deprecatedTransaction.d.ts.map +0 -1
  24. package/dist/src/lib/deprecatedTransaction.js +0 -344
  25. package/dist/src/lib/deprecatedTransactionBuilder.d.ts +0 -114
  26. package/dist/src/lib/deprecatedTransactionBuilder.d.ts.map +0 -1
  27. package/dist/src/lib/deprecatedTransactionBuilder.js +0 -210
  28. package/dist/src/lib/errors.d.ts +0 -8
  29. package/dist/src/lib/errors.d.ts.map +0 -1
  30. package/dist/src/lib/errors.js +0 -19
  31. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -55
  32. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  33. package/dist/src/lib/exportInCTxBuilder.js +0 -159
  34. package/dist/src/lib/exportTxBuilder.d.ts +0 -33
  35. package/dist/src/lib/exportTxBuilder.d.ts.map +0 -1
  36. package/dist/src/lib/exportTxBuilder.js +0 -88
  37. package/dist/src/lib/iface.d.ts +0 -68
  38. package/dist/src/lib/iface.d.ts.map +0 -1
  39. package/dist/src/lib/iface.js +0 -20
  40. package/dist/src/lib/importInCTxBuilder.d.ts +0 -44
  41. package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
  42. package/dist/src/lib/importInCTxBuilder.js +0 -131
  43. package/dist/src/lib/importTxBuilder.d.ts +0 -18
  44. package/dist/src/lib/importTxBuilder.d.ts.map +0 -1
  45. package/dist/src/lib/importTxBuilder.js +0 -67
  46. package/dist/src/lib/index.d.ts +0 -11
  47. package/dist/src/lib/index.d.ts.map +0 -1
  48. package/dist/src/lib/index.js +0 -37
  49. package/dist/src/lib/keyPair.d.ts +0 -58
  50. package/dist/src/lib/keyPair.d.ts.map +0 -1
  51. package/dist/src/lib/keyPair.js +0 -150
  52. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +0 -154
  53. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +0 -1
  54. package/dist/src/lib/permissionlessValidatorTxBuilder.js +0 -452
  55. package/dist/src/lib/transaction.d.ts +0 -78
  56. package/dist/src/lib/transaction.d.ts.map +0 -1
  57. package/dist/src/lib/transaction.js +0 -254
  58. package/dist/src/lib/transactionBuilder.d.ts +0 -71
  59. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  60. package/dist/src/lib/transactionBuilder.js +0 -138
  61. package/dist/src/lib/transactionBuilderFactory.d.ts +0 -57
  62. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  63. package/dist/src/lib/transactionBuilderFactory.js +0 -178
  64. package/dist/src/lib/utils.d.ts +0 -184
  65. package/dist/src/lib/utils.d.ts.map +0 -1
  66. package/dist/src/lib/utils.js +0 -378
  67. package/dist/src/lib/utxoEngine.d.ts +0 -53
  68. package/dist/src/lib/utxoEngine.d.ts.map +0 -1
  69. package/dist/src/lib/utxoEngine.js +0 -112
  70. package/dist/src/lib/validatorTxBuilder.d.ts +0 -37
  71. package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
  72. package/dist/src/lib/validatorTxBuilder.js +0 -69
  73. package/dist/src/register.d.ts +0 -3
  74. package/dist/src/register.d.ts.map +0 -1
  75. package/dist/src/register.js +0 -11
  76. package/dist/src/tavaxp.d.ts +0 -9
  77. package/dist/src/tavaxp.d.ts.map +0 -1
  78. package/dist/src/tavaxp.js +0 -14
  79. package/dist/test/resources/avaxp.d.ts +0 -259
  80. package/dist/test/resources/avaxp.d.ts.map +0 -1
  81. package/dist/test/resources/avaxp.js +0 -1093
  82. package/dist/test/resources/errors.d.ts +0 -19
  83. package/dist/test/resources/errors.d.ts.map +0 -1
  84. package/dist/test/resources/errors.js +0 -22
  85. package/dist/test/resources/keychains.d.ts +0 -18
  86. package/dist/test/resources/keychains.d.ts.map +0 -1
  87. package/dist/test/resources/keychains.js +0 -30
  88. package/dist/test/resources/tx/exportC.d.ts +0 -14
  89. package/dist/test/resources/tx/exportC.d.ts.map +0 -1
  90. package/dist/test/resources/tx/exportC.js +0 -21
  91. package/dist/test/resources/tx/importC.d.ts +0 -29
  92. package/dist/test/resources/tx/importC.d.ts.map +0 -1
  93. package/dist/test/resources/tx/importC.js +0 -42
  94. package/dist/test/resources/tx/importP.d.ts +0 -29
  95. package/dist/test/resources/tx/importP.d.ts.map +0 -1
  96. package/dist/test/resources/tx/importP.js +0 -42
  97. package/dist/test/unit/avaxp.d.ts +0 -2
  98. package/dist/test/unit/avaxp.d.ts.map +0 -1
  99. package/dist/test/unit/avaxp.js +0 -732
  100. package/dist/test/unit/lib/exportC2PTxBuilder.d.ts +0 -2
  101. package/dist/test/unit/lib/exportC2PTxBuilder.d.ts.map +0 -1
  102. package/dist/test/unit/lib/exportC2PTxBuilder.js +0 -125
  103. package/dist/test/unit/lib/exportP2CTxBuilder.d.ts +0 -2
  104. package/dist/test/unit/lib/exportP2CTxBuilder.d.ts.map +0 -1
  105. package/dist/test/unit/lib/exportP2CTxBuilder.js +0 -183
  106. package/dist/test/unit/lib/importC2PTxBuilder.d.ts +0 -2
  107. package/dist/test/unit/lib/importC2PTxBuilder.d.ts.map +0 -1
  108. package/dist/test/unit/lib/importC2PTxBuilder.js +0 -99
  109. package/dist/test/unit/lib/importP2CTxBuilder.d.ts +0 -2
  110. package/dist/test/unit/lib/importP2CTxBuilder.d.ts.map +0 -1
  111. package/dist/test/unit/lib/importP2CTxBuilder.js +0 -137
  112. package/dist/test/unit/lib/keyPair.d.ts +0 -2
  113. package/dist/test/unit/lib/keyPair.d.ts.map +0 -1
  114. package/dist/test/unit/lib/keyPair.js +0 -186
  115. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts +0 -2
  116. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts.map +0 -1
  117. package/dist/test/unit/lib/permissionlessValidatorTxBuilder.js +0 -341
  118. package/dist/test/unit/lib/signFlowTestSuit.d.ts +0 -20
  119. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +0 -1
  120. package/dist/test/unit/lib/signFlowTestSuit.js +0 -80
  121. package/dist/test/unit/lib/transactionBuilderFactory.d.ts +0 -2
  122. package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +0 -1
  123. package/dist/test/unit/lib/transactionBuilderFactory.js +0 -179
  124. package/dist/test/unit/lib/utils.d.ts +0 -2
  125. package/dist/test/unit/lib/utils.d.ts.map +0 -1
  126. package/dist/test/unit/lib/utils.js +0 -83
  127. package/dist/test/unit/lib/utxoEngine.d.ts +0 -2
  128. package/dist/test/unit/lib/utxoEngine.d.ts.map +0 -1
  129. package/dist/test/unit/lib/utxoEngine.js +0 -168
  130. package/dist/test/unit/lib/validateTxBuilder.d.ts +0 -2
  131. package/dist/test/unit/lib/validateTxBuilder.d.ts.map +0 -1
  132. package/dist/test/unit/lib/validateTxBuilder.js +0 -327
  133. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,452 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.PermissionlessValidatorTxBuilder = void 0;
7
- const avalanchejs_1 = require("@bitgo-forks/avalanchejs");
8
- const sdk_core_1 = require("@bitgo/sdk-core");
9
- const avalanche_1 = require("avalanche");
10
- const iface_1 = require("./iface");
11
- const keyPair_1 = require("./keyPair");
12
- const transactionBuilder_1 = require("./transactionBuilder");
13
- const utils_1 = __importDefault(require("./utils"));
14
- const utxoEngine_1 = require("./utxoEngine");
15
- class PermissionlessValidatorTxBuilder extends transactionBuilder_1.TransactionBuilder {
16
- /**
17
- *
18
- * @param coinConfig
19
- */
20
- constructor(coinConfig) {
21
- super(coinConfig);
22
- this._signer = [];
23
- this.recoverSigner = false;
24
- this.transaction._fee.fee = this.transaction._network.txFee;
25
- }
26
- /**
27
- * get transaction type
28
- * @protected
29
- */
30
- get transactionType() {
31
- return sdk_core_1.TransactionType.AddPermissionlessValidator;
32
- }
33
- // region Validators
34
- /**
35
- * Validates locktime
36
- * @param locktime
37
- */
38
- validateLocktime(locktime) {
39
- if (locktime < BigInt(0)) {
40
- throw new sdk_core_1.BuildTransactionError('Invalid transaction: locktime must be 0 or higher');
41
- }
42
- }
43
- /**
44
- * Validate that the delegation fee is at least the minDelegationFee
45
- * @param delegationFeeRate number
46
- */
47
- validateDelegationFeeRate(delegationFeeRate) {
48
- if (delegationFeeRate < Number(this.transaction._network.minDelegationFee)) {
49
- throw new sdk_core_1.BuildTransactionError(`Delegation fee cannot be less than ${this.transaction._network.minDelegationFee}`);
50
- }
51
- }
52
- /**
53
- * Check the UTXO has expected fields.
54
- * @param UTXO
55
- */
56
- validateUtxo(value) {
57
- ['outputID', 'amount', 'txid', 'outputidx'].forEach((field) => {
58
- if (!value.hasOwnProperty(field))
59
- throw new sdk_core_1.BuildTransactionError(`Utxos required ${field}`);
60
- });
61
- }
62
- // endregion
63
- /**
64
- * Addresses where reward should be deposit
65
- * @param {string | string[]} address - single address or array of addresses to receive rewards
66
- */
67
- rewardAddresses(address) {
68
- const rewardAddresses = address instanceof Array ? address : [address];
69
- this.transaction._rewardAddresses = rewardAddresses.map(utils_1.default.parseAddress);
70
- return this;
71
- }
72
- /** @inheritdoc */
73
- fromImplementation(rawTransaction) {
74
- const manager = avalanchejs_1.utils.getManagerForVM('PVM');
75
- const [codec, rest] = manager.getCodecFromBuffer(avalanchejs_1.utils.hexToBuffer(rawTransaction));
76
- const tx = codec.UnpackPrefix(rest)[0];
77
- this.initBuilder(tx);
78
- return this.transaction;
79
- }
80
- /** @inheritdoc */
81
- async buildImplementation() {
82
- this.buildAvaxTransaction();
83
- this.transaction.setTransactionType(this.transactionType);
84
- if (this.hasSigner()) {
85
- for (const keyPair of this._signer) {
86
- await this.transaction.sign(keyPair);
87
- }
88
- }
89
- return this.transaction;
90
- }
91
- /**
92
- *
93
- * @param nodeID
94
- */
95
- nodeID(nodeID) {
96
- this.validateNodeID(nodeID);
97
- this._nodeID = nodeID;
98
- return this;
99
- }
100
- /**
101
- *
102
- * @param blsPublicKey
103
- */
104
- blsPublicKey(blsPublicKey) {
105
- (0, sdk_core_1.isValidBLSPublicKey)(blsPublicKey);
106
- this._blsPublicKey = blsPublicKey;
107
- return this;
108
- }
109
- /**
110
- *
111
- * @param blsSignature
112
- */
113
- blsSignature(blsSignature) {
114
- (0, sdk_core_1.isValidBLSSignature)(blsSignature);
115
- this._blsSignature = blsSignature;
116
- return this;
117
- }
118
- /**
119
- * Locktime is a long that contains the unix timestamp that this output can be spent after.
120
- * The unix timestamp is specific to the second.
121
- * @param value
122
- */
123
- locktime(value) {
124
- this.validateLocktime(BigInt(value));
125
- this._transaction._locktime = BigInt(value);
126
- return this;
127
- }
128
- /**
129
- * set the delegationFeeRate
130
- * @param value number
131
- */
132
- delegationFeeRate(value) {
133
- this.validateDelegationFeeRate(value);
134
- this._delegationFeeRate = value;
135
- return this;
136
- }
137
- /**
138
- * start time of staking period
139
- * @param value
140
- */
141
- startTime(value) {
142
- this._startTime = BigInt(value);
143
- return this;
144
- }
145
- /**
146
- * end time of staking period
147
- * @param value
148
- */
149
- endTime(value) {
150
- this._endTime = BigInt(value);
151
- return this;
152
- }
153
- /**
154
- *
155
- * @param value
156
- */
157
- stakeAmount(value) {
158
- const valueBigInt = typeof value === 'bigint' ? value : BigInt(value);
159
- this.validateStakeAmount(valueBigInt);
160
- this._stakeAmount = valueBigInt;
161
- return this;
162
- }
163
- // region Validators
164
- /**
165
- * validates a correct NodeID is used
166
- * @param nodeID
167
- */
168
- validateNodeID(nodeID) {
169
- if (!nodeID) {
170
- throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing nodeID');
171
- }
172
- if (nodeID.slice(0, 6) !== 'NodeID') {
173
- throw new sdk_core_1.BuildTransactionError('Invalid transaction: invalid NodeID tag');
174
- }
175
- if (!(avalanchejs_1.utils.base58.decode(nodeID.slice(7)).length === 24)) {
176
- throw new sdk_core_1.BuildTransactionError('Invalid transaction: NodeID is not in cb58 format');
177
- }
178
- }
179
- /**
180
- * Validate stake duration
181
- * @param startTime
182
- * @param endTime
183
- */
184
- validateStakeDuration(startTime, endTime) {
185
- if (endTime < startTime) {
186
- throw new sdk_core_1.BuildTransactionError('End date cannot be less than start date');
187
- }
188
- }
189
- /**
190
- * Validate stake amount
191
- * @param amount
192
- */
193
- validateStakeAmount(amount) {
194
- const minStake = BigInt(this.transaction._network.minStake);
195
- if (amount < minStake) {
196
- throw new sdk_core_1.BuildTransactionError('Minimum staking amount is ' + Number(minStake) / 1000000000 + ' AVAX.');
197
- }
198
- return;
199
- }
200
- // endregion
201
- /** @inheritdoc */
202
- initBuilder(tx) {
203
- super.initBuilder(tx);
204
- const permissionlessValidatorTx = tx.tx;
205
- if (!this.verifyTxType(permissionlessValidatorTx)) {
206
- throw new sdk_core_1.NotSupported('Transaction cannot be parsed or has an unsupported transaction type');
207
- }
208
- const outputs = permissionlessValidatorTx.baseTx.outputs;
209
- if (outputs.length !== 1) {
210
- throw new sdk_core_1.BuildTransactionError('Transaction can have one external output');
211
- }
212
- const output = outputs[0].output;
213
- if (outputs[0].getAssetId() !== this.transaction._assetId) {
214
- throw new Error('The Asset ID of the output does not match the transaction');
215
- }
216
- this.transaction._blsPublicKey = avalanchejs_1.utils.bufferToHex(permissionlessValidatorTx.signer.proof.publicKey);
217
- this._blsPublicKey = this.transaction._blsPublicKey;
218
- this.transaction._blsSignature = avalanchejs_1.utils.bufferToHex(permissionlessValidatorTx.signer.proof.signature);
219
- this._blsSignature = this.transaction._blsSignature;
220
- this.transaction._locktime = output.outputOwners.locktime.value();
221
- this.transaction._threshold = output.outputOwners.threshold.value();
222
- this.transaction._nodeID = permissionlessValidatorTx.subnetValidator.validator.nodeId.toString();
223
- this._nodeID = this.transaction._nodeID;
224
- this.transaction._startTime = permissionlessValidatorTx.subnetValidator.validator.startTime.value();
225
- this._startTime = this.transaction._startTime;
226
- this.transaction._endTime = permissionlessValidatorTx.subnetValidator.validator.endTime.value();
227
- this._endTime = this.transaction._endTime;
228
- this.transaction._fromAddresses = output.outputOwners.addrs.map((a) => a.toBytes());
229
- this.transaction._stakeAmount = permissionlessValidatorTx.stake[0].output.amount();
230
- this.stakeAmount(this.transaction._stakeAmount);
231
- this.transaction._utxos = (0, utxoEngine_1.recoverUtxos)(permissionlessValidatorTx.getInputs());
232
- // TODO(CR-1073): remove log
233
- console.log('utxos: ', this.transaction._utxos);
234
- console.log('fromAddresses: ', this.transaction.fromAddresses);
235
- return this;
236
- }
237
- static verifyTxType(type) {
238
- return type === avalanchejs_1.TypeSymbols.AddPermissionlessValidatorTx;
239
- }
240
- verifyTxType(tx) {
241
- return PermissionlessValidatorTxBuilder.verifyTxType(tx._type);
242
- }
243
- /**
244
- * Since addresses in outputs get reordered, we need to make sure signatures
245
- * are added in the correct position
246
- * To find the position, we use the output's addresses to create the
247
- * signatureIdx in the order needed (i.e. [user, bitgo, backup])
248
- * @protected
249
- */
250
- calculateUtxos() {
251
- const inputs = [];
252
- const stakeOutputs = [];
253
- const changeOutputs = [];
254
- const utxos = [];
255
- let currentTotal = BigInt(0);
256
- // staking tx requires fees after ACP-103
257
- // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/103-dynamic-fees/README.md
258
- const totalTarget = this._stakeAmount + BigInt(this.transaction._network.txFee);
259
- const credentials = this.transaction.credentials ?? [];
260
- // Convert fromAddresses to string
261
- // The order of fromAddresses is determined by the source of the data
262
- // When building from params, the order is [user, bitgo, backup]
263
- // The order from tx hex is [bitgo, backup, user]
264
- const bitgoAddresses = this.transaction._fromAddresses.map((b) => avalanchejs_1.utils.format(this.transaction._network.alias, this.transaction._network.hrp, b));
265
- // TODO(CR-1073): remove log
266
- console.log(`bitgoAddress: ${bitgoAddresses}`);
267
- // if we are in OVC, none of the utxos will have addresses since they come from
268
- // deserialized inputs (which don't have addresses), not the IMS
269
- const buildOutputs = this.transaction._utxos[0].addresses.length !== 0 || this.transaction._utxos[0].addressesIndex?.length !== 0;
270
- const assetId = avalanchejs_1.Id.fromString(this.transaction._assetId);
271
- this.transaction._utxos.forEach((utxo, index) => {
272
- // validate the utxos
273
- if (!utxo) {
274
- throw new sdk_core_1.BuildTransactionError('Utxo is undefined');
275
- }
276
- // addressesIndex should never have a mismatch
277
- if (utxo.addressesIndex?.includes(-1)) {
278
- throw new sdk_core_1.BuildTransactionError('Addresses are inconsistent');
279
- }
280
- if (utxo.threshold < this.transaction._threshold) {
281
- throw new sdk_core_1.BuildTransactionError('Threshold is inconsistent');
282
- }
283
- const bitgoIndexToOnChainIndex = new Map();
284
- // in WP, output.addressesIndex is empty, so fill it
285
- if (!utxo.addressesIndex || utxo.addressesIndex.length === 0) {
286
- utxo.addressesIndex = bitgoAddresses.map((a) => utxo.addresses.indexOf(a));
287
- }
288
- // utxo.addresses is null when build from raw
289
- // but utxo.addressesIndex has only 2 elements when build from raw
290
- // so the bitgoIndexToOnChainIndex map will be empty
291
- utxo.addresses.forEach((a) => {
292
- bitgoIndexToOnChainIndex.set(bitgoAddresses.indexOf(a), utxo.addresses.indexOf(a));
293
- });
294
- // TODO(CR-1073): remove log
295
- console.log(`utxo.addresses: ${utxo.addresses}`);
296
- console.log(`bitgoIndexToOnChainIndex: ${Array.from(bitgoIndexToOnChainIndex)}`);
297
- // in OVC, output.addressesIndex is defined correctly from the previous iteration
298
- if (utxo.outputID === iface_1.SECP256K1_Transfer_Output) {
299
- const utxoAmount = BigInt(utxo.amount);
300
- // either user (0) or recovery (2)
301
- // On regular mode: [user, bitgo] (i.e. [0, 1])
302
- // On recovery mode: [backup, bitgo] (i.e. [2, 1])
303
- const userOrBackupIndex = this.recoverSigner ? 2 : 0;
304
- const bitgoIndex = 1;
305
- currentTotal = currentTotal + utxoAmount;
306
- const utxoId = avalanchejs_1.avaxSerial.UTXOID.fromNative(utxo.txid, Number(utxo.outputidx));
307
- let addressesIndex = [];
308
- if (utxo.addressesIndex && bitgoIndexToOnChainIndex.size === 0) {
309
- addressesIndex = [...utxo.addressesIndex];
310
- }
311
- else {
312
- addressesIndex.push(bitgoIndexToOnChainIndex.get(userOrBackupIndex));
313
- addressesIndex.push(bitgoIndexToOnChainIndex.get(bitgoIndex));
314
- }
315
- const transferInputs = new avalanchejs_1.TransferInput(new avalanchejs_1.BigIntPr(utxoAmount), new avalanchejs_1.Input([...addressesIndex].sort().map((num) => new avalanchejs_1.Int(num))));
316
- // TODO(CR-1073): remove log
317
- console.log(`using addressesIndex sorted: ${[...addressesIndex].sort()}`);
318
- const input = new avalanchejs_1.avaxSerial.TransferableInput(utxoId, assetId, transferInputs);
319
- utxos.push(new avalanchejs_1.Utxo(utxoId, assetId, transferInputs));
320
- inputs.push(input);
321
- if (!this.transaction.credentials || this.transaction.credentials.length == 0) {
322
- if (buildOutputs) {
323
- // For the bitgo signature we create an empty signature
324
- // For the user/backup signature we store the address that matches the key
325
- // if bitgo address comes before < user/backup address
326
- // TODO(CR-1073): remove log
327
- console.log(`bitgo index on chain: ${utxo.addressesIndex[bitgoIndex]}`);
328
- console.log(`user Or Backup Index: ${utxo.addressesIndex[userOrBackupIndex]}`);
329
- if (utxo.addressesIndex[bitgoIndex] < utxo.addressesIndex[userOrBackupIndex]) {
330
- // TODO(CR-1073): remove log
331
- console.log(`user or backup credentials after bitgo`);
332
- credentials.push(new avalanchejs_1.Credential([
333
- utils_1.default.createNewSig(avalanche_1.Buffer.from('').toString('hex')),
334
- utils_1.default.createNewSig(avalanche_1.Buffer.from(this.transaction._fromAddresses[userOrBackupIndex]).toString('hex')),
335
- ]));
336
- }
337
- else {
338
- // TODO(CR-1073): remove log
339
- console.log(`user or backup credentials before bitgo`);
340
- credentials.push(new avalanchejs_1.Credential([
341
- utils_1.default.createNewSig(avalanche_1.Buffer.from(this.transaction._fromAddresses[userOrBackupIndex]).toString('hex')),
342
- utils_1.default.createNewSig(avalanche_1.Buffer.from('').toString('hex')),
343
- ]));
344
- }
345
- }
346
- else {
347
- // TODO(CR-1073): verify this else case for OVC
348
- credentials.push(new avalanchejs_1.Credential(addressesIndex.map((i) => utils_1.default.createNewSig(avalanche_1.Buffer.from(this.transaction._fromAddresses[i]).toString('hex')))));
349
- }
350
- }
351
- else {
352
- // TODO(CR-1073): remove log
353
- console.log(`reusing credentials from transaction`);
354
- }
355
- }
356
- });
357
- if (buildOutputs) {
358
- if (currentTotal < totalTarget) {
359
- throw new sdk_core_1.BuildTransactionError(`Utxo outputs get ${currentTotal.toString()} and ${totalTarget.toString()} is required`);
360
- }
361
- else if (currentTotal >= totalTarget) {
362
- const stakeOutput = new avalanchejs_1.avaxSerial.TransferableOutput(assetId, new avalanchejs_1.TransferOutput(new avalanchejs_1.BigIntPr(this._stakeAmount), new avalanchejs_1.OutputOwners(new avalanchejs_1.BigIntPr(this.transaction._locktime), new avalanchejs_1.Int(this.transaction._threshold), [...this.transaction._fromAddresses]
363
- .sort((a, b) => avalanchejs_1.utils.bytesCompare(a, b))
364
- .map((a) => avalanchejs_1.Address.fromBytes(a)[0]))));
365
- stakeOutputs.push(stakeOutput);
366
- if (currentTotal > totalTarget) {
367
- const changeOutput = new avalanchejs_1.avaxSerial.TransferableOutput(assetId, new avalanchejs_1.TransferOutput(new avalanchejs_1.BigIntPr(currentTotal - totalTarget), new avalanchejs_1.OutputOwners(new avalanchejs_1.BigIntPr(this.transaction._locktime), new avalanchejs_1.Int(this.transaction._threshold), [...this.transaction._fromAddresses]
368
- .sort((a, b) => avalanchejs_1.utils.bytesCompare(a, b))
369
- .map((a) => avalanchejs_1.Address.fromBytes(a)[0]))));
370
- changeOutputs.push(changeOutput);
371
- }
372
- }
373
- }
374
- inputs.sort((a, b) => {
375
- if (avalanchejs_1.utils.bytesEqual(a.utxoID.txID.toBytes(), b.utxoID.txID.toBytes())) {
376
- return a.utxoID.outputIdx.value() - b.utxoID.outputIdx.value();
377
- }
378
- return avalanchejs_1.utils.bytesCompare(a.utxoID.txID.toBytes(), b.utxoID.txID.toBytes());
379
- });
380
- return { inputs, stakeOutputs, changeOutputs, utxos, credentials };
381
- }
382
- /**
383
- * Build the add validator transaction
384
- * @protected
385
- */
386
- buildAvaxTransaction() {
387
- this.validateStakeDuration(this.transaction._startTime, this.transaction._endTime);
388
- const { inputs, stakeOutputs, changeOutputs, utxos, credentials } = this.calculateUtxos();
389
- const baseTx = avalanchejs_1.avaxSerial.BaseTx.fromNative(this.transaction._networkID, this.transaction._blockchainID, changeOutputs, inputs, new Uint8Array() // default empty memo
390
- );
391
- const subnetValidator = avalanchejs_1.pvmSerial.SubnetValidator.fromNative(this._nodeID, this._startTime, this._endTime, this._stakeAmount, avalanchejs_1.networkIDs.PrimaryNetworkID);
392
- const signer = new avalanchejs_1.pvmSerial.Signer(new avalanchejs_1.pvmSerial.ProofOfPossession(avalanchejs_1.utils.hexToBuffer(this._blsPublicKey), avalanchejs_1.utils.hexToBuffer(this._blsSignature)));
393
- const outputOwners = new avalanchejs_1.OutputOwners(new avalanchejs_1.BigIntPr(this.transaction._locktime), new avalanchejs_1.Int(this.transaction._threshold), [...this.transaction._fromAddresses]
394
- .sort((a, b) => avalanchejs_1.utils.bytesCompare(a, b))
395
- .map((a) => avalanchejs_1.Address.fromBytes(a)[0]));
396
- // TODO(CR-1073): check this value
397
- // Shares 10,000 times percentage of reward taken from delegators
398
- // https://docs.avax.network/reference/avalanchego/p-chain/txn-format#unsigned-add-validator-tx
399
- const shares = new avalanchejs_1.Int(1e4 * 2);
400
- const addressMaps = [...this.transaction._fromAddresses]
401
- .sort((a, b) => avalanchejs_1.utils.bytesCompare(a, b))
402
- .map((address) => new avalanchejs_1.utils.AddressMap([[new avalanchejs_1.Address(address), 0]]));
403
- this.transaction.setTransaction(new avalanchejs_1.UnsignedTx(new avalanchejs_1.pvmSerial.AddPermissionlessValidatorTx(baseTx, subnetValidator, signer, stakeOutputs, outputOwners, outputOwners, shares), utxos, new avalanchejs_1.utils.AddressMaps(addressMaps), credentials));
404
- }
405
- /** @inheritdoc */
406
- signImplementation({ key }) {
407
- this._signer.push(new keyPair_1.KeyPair({ prv: key }));
408
- return this.transaction;
409
- }
410
- /** @inheritdoc */
411
- validateAddress(address, addressFormat) {
412
- if (!utils_1.default.isValidAddress(address.address)) {
413
- throw new sdk_core_1.BuildTransactionError('Invalid address');
414
- }
415
- }
416
- /** @inheritdoc */
417
- get transaction() {
418
- return this._transaction;
419
- }
420
- set transaction(transaction) {
421
- this._transaction = transaction;
422
- }
423
- hasSigner() {
424
- return this._signer !== undefined && this._signer.length > 0;
425
- }
426
- /** @inheritdoc */
427
- validateKey({ key }) {
428
- if (!new keyPair_1.KeyPair({ prv: key })) {
429
- throw new sdk_core_1.BuildTransactionError('Invalid key');
430
- }
431
- }
432
- /**
433
- * Check the raw transaction has a valid format in the blockchain context, throw otherwise.
434
- *
435
- * @param rawTransaction Transaction in any format
436
- */
437
- validateRawTransaction(rawTransaction) {
438
- utils_1.default.validateRawTransaction(rawTransaction);
439
- }
440
- /** @inheritdoc */
441
- validateTransaction(transaction) {
442
- // throw new NotImplementedError('validateTransaction not implemented');
443
- }
444
- /** @inheritdoc */
445
- validateValue(value) {
446
- if (value.isLessThan(0)) {
447
- throw new sdk_core_1.BuildTransactionError('Value cannot be less than zero');
448
- }
449
- }
450
- }
451
- exports.PermissionlessValidatorTxBuilder = PermissionlessValidatorTxBuilder;
452
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Blcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBEQWtCa0M7QUFDbEMsOENBUXlCO0FBR3pCLHlDQUFpRDtBQUVqRCxtQ0FBd0U7QUFDeEUsdUNBQW9DO0FBRXBDLDZEQUEwRDtBQUMxRCxvREFBNEI7QUFDNUIsNkNBQTRDO0FBRTVDLE1BQWEsZ0NBQWlDLFNBQVEsdUNBQWtCO0lBV3RFOzs7T0FHRztJQUNILFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBZmIsWUFBTyxHQUFjLEVBQUUsQ0FBQztRQU9yQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQVM5QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQzlELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLDBCQUEwQixDQUFDO0lBQ3BELENBQUM7SUFFRCxvQkFBb0I7SUFDcEI7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsUUFBZ0I7UUFDL0IsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUFDdkYsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCx5QkFBeUIsQ0FBQyxpQkFBeUI7UUFDakQsSUFBSSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQzNFLE1BQU0sSUFBSSxnQ0FBcUIsQ0FDN0Is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QXFCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFjLFdBQVc7UUFDdkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFjLFdBQVcsQ0FBQyxXQUF3QjtRQUNoRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFXO1FBQzFCLElBQUksQ0FBQyxJQUFJLGlCQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxzQkFBc0IsQ0FBQyxjQUFzQjtRQUMzQyxlQUFLLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixtQkFBbUIsQ0FBQyxXQUF5QjtRQUMzQyx3RUFBd0U7SUFDMUUsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixhQUFhLENBQUMsS0FBZ0I7UUFDNUIsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXprQkQsNEVBeWtCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFkZHJlc3MsXG4gIGF2YXhTZXJpYWwsXG4gIHV0aWxzIGFzIEF2YXhVdGlscyxcbiAgQmlnSW50UHIsXG4gIENyZWRlbnRpYWwsXG4gIElkLFxuICBJbnB1dCxcbiAgSW50LFxuICBuZXR3b3JrSURzLFxuICBPdXRwdXRPd25lcnMsXG4gIHB2bVNlcmlhbCxcbiAgVHJhbnNmZXJJbnB1dCxcbiAgVHJhbnNmZXJPdXRwdXQsXG4gIFR5cGVTeW1ib2xzLFxuICBVbnNpZ25lZFR4LFxuICBVdHhvLFxuICB1dGlscyBhcyBhdmF4VXRpbHMsXG59IGZyb20gJ0BiaXRnby1mb3Jrcy9hdmFsYW5jaGVqcyc7XG5pbXBvcnQge1xuICBCYXNlQWRkcmVzcyxcbiAgQmFzZUtleSxcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBpc1ZhbGlkQkxTUHVibGljS2V5LFxuICBpc1ZhbGlkQkxTU2lnbmF0dXJlLFxuICBOb3RTdXBwb3J0ZWQsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IEJ1ZmZlciBhcyBCdWZmZXJBdmF4IH0gZnJvbSAnYXZhbGFuY2hlJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IERlY29kZWRVdHhvT2JqLCBTRUNQMjU2SzFfVHJhbnNmZXJfT3V0cHV0LCBUeCB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgcmVjb3ZlclV0eG9zIH0gZnJvbSAnLi91dHhvRW5naW5lJztcblxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHVibGljIF9zaWduZXI6IEtleVBhaXJbXSA9IFtdO1xuICBwcm90ZWN0ZWQgX25vZGVJRDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX2Jsc1B1YmxpY0tleTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX2Jsc1NpZ25hdHVyZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3N0YXJ0VGltZTogYmlnaW50O1xuICBwcm90ZWN0ZWQgX2VuZFRpbWU6IGJpZ2ludDtcbiAgcHJvdGVjdGVkIF9zdGFrZUFtb3VudDogYmlnaW50O1xuICBwcm90ZWN0ZWQgcmVjb3ZlclNpZ25lciA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX2RlbGVnYXRpb25GZWVSYXRlOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBjb2luQ29uZmlnXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgPSB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLnR4RmVlO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0cmFuc2FjdGlvbiB0eXBlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcjtcbiAgfVxuXG4gIC8vIHJlZ2lvbiBWYWxpZGF0b3JzXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgbG9ja3RpbWVcbiAgICogQHBhcmFtIGxvY2t0aW1lXG4gICAqL1xuICB2YWxpZGF0ZUxvY2t0aW1lKGxvY2t0aW1lOiBiaWdpbnQpOiB2b2lkIHtcbiAgICBpZiAobG9ja3RpbWUgPCBCaWdJbnQoMCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IGxvY2t0aW1lIG11c3QgYmUgMCBvciBoaWdoZXInKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCB0aGUgZGVsZWdhdGlvbiBmZWUgaXMgYXQgbGVhc3QgdGhlIG1pbkRlbGVnYXRpb25GZWVcbiAgICogQHBhcmFtIGRlbGVnYXRpb25GZWVSYXRlIG51bWJlclxuICAgKi9cbiAgdmFsaWRhdGVEZWxlZ2F0aW9uRmVlUmF0ZShkZWxlZ2F0aW9uRmVlUmF0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGRlbGVnYXRpb25GZWVSYXRlIDwgTnVtYmVyKHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsubWluRGVsZWdhdGlvbkZlZSkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBEZWxlZ2F0aW9uIGZlZSBjYW5ub3QgYmUgbGVzcyB0aGFuICR7dGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5taW5EZWxlZ2F0aW9uRmVlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoZSBVVFhPIGhhcyBleHBlY3RlZCBmaWVsZHMuXG4gICAqIEBwYXJhbSBVVFhPXG4gICAqL1xuICB2YWxpZGF0ZVV0eG8odmFsdWU6IERlY29kZWRVdHhvT2JqKTogdm9pZCB7XG4gICAgWydvdXRwdXRJRCcsICdhbW91bnQnLCAndHhpZCcsICdvdXRwdXRpZHgnXS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZS5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYFV0eG9zIHJlcXVpcmVkICR7ZmllbGR9YCk7XG4gICAgfSk7XG4gIH1cbiAgLy8gZW5kcmVnaW9uXG5cbiAgLyoqXG4gICAqIEFkZHJlc3NlcyB3aGVyZSByZXdhcmQgc2hvdWxkIGJlIGRlcG9zaXRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gYWRkcmVzcyAtIHNpbmdsZSBhZGRyZXNzIG9yIGFycmF5IG9mIGFkZHJlc3NlcyB0byByZWNlaXZlIHJld2FyZHNcbiAgICovXG4gIHJld2FyZEFkZHJlc3NlcyhhZGRyZXNzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHRoaXMge1xuICAgIGNvbnN0IHJld2FyZEFkZHJlc3NlcyA9IGFkZHJlc3MgaW5zdGFuY2VvZiBBcnJheSA/IGFkZHJlc3MgOiBbYWRkcmVzc107XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fcmV3YXJkQWRkcmVzc2VzID0gcmV3YXJkQWRkcmVzc2VzLm1hcCh1dGlscy5wYXJzZUFkZHJlc3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBmcm9tSW1wbGVtZW50YXRpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBtYW5hZ2VyID0gQXZheFV0aWxzLmdldE1hbmFnZXJGb3JWTSgnUFZNJyk7XG4gICAgY29uc3QgW2NvZGVjLCByZXN0XSA9IG1hbmFnZXIuZ2V0Q29kZWNGcm9tQnVmZmVyKEF2YXhVdGlscy5oZXhUb0J1ZmZlcihyYXdUcmFuc2FjdGlvbikpO1xuICAgIGNvbnN0IHR4ID0gY29kZWMuVW5wYWNrUHJlZml4PHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4PihyZXN0KVswXTtcbiAgICB0aGlzLmluaXRCdWlsZGVyKHR4KTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgdGhpcy5idWlsZEF2YXhUcmFuc2FjdGlvbigpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKHRoaXMudHJhbnNhY3Rpb25UeXBlKTtcbiAgICBpZiAodGhpcy5oYXNTaWduZXIoKSkge1xuICAgICAgZm9yIChjb25zdCBrZXlQYWlyIG9mIHRoaXMuX3NpZ25lcikge1xuICAgICAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uLnNpZ24oa2V5UGFpcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBub2RlSURcbiAgICovXG4gIG5vZGVJRChub2RlSUQ6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVOb2RlSUQobm9kZUlEKTtcbiAgICB0aGlzLl9ub2RlSUQgPSBub2RlSUQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGJsc1B1YmxpY0tleVxuICAgKi9cbiAgYmxzUHVibGljS2V5KGJsc1B1YmxpY0tleTogc3RyaW5nKTogdGhpcyB7XG4gICAgaXNWYWxpZEJMU1B1YmxpY0tleShibHNQdWJsaWNLZXkpO1xuICAgIHRoaXMuX2Jsc1B1YmxpY0tleSA9IGJsc1B1YmxpY0tleTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gYmxzU2lnbmF0dXJlXG4gICAqL1xuICBibHNTaWduYXR1cmUoYmxzU2lnbmF0dXJlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpc1ZhbGlkQkxTU2lnbmF0dXJlKGJsc1NpZ25hdHVyZSk7XG4gICAgdGhpcy5fYmxzU2lnbmF0dXJlID0gYmxzU2lnbmF0dXJlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2t0aW1lIGlzIGEgbG9uZyB0aGF0IGNvbnRhaW5zIHRoZSB1bml4IHRpbWVzdGFtcCB0aGF0IHRoaXMgb3V0cHV0IGNhbiBiZSBzcGVudCBhZnRlci5cbiAgICogVGhlIHVuaXggdGltZXN0YW1wIGlzIHNwZWNpZmljIHRvIHRoZSBzZWNvbmQuXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgbG9ja3RpbWUodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVMb2NrdGltZShCaWdJbnQodmFsdWUpKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5fbG9ja3RpbWUgPSBCaWdJbnQodmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIHNldCB0aGUgZGVsZWdhdGlvbkZlZVJhdGVcbiAgICogQHBhcmFtIHZhbHVlIG51bWJlclxuICAgKi9cbiAgZGVsZWdhdGlvbkZlZVJhdGUodmFsdWU6IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVEZWxlZ2F0aW9uRmVlUmF0ZSh2YWx1ZSk7XG4gICAgdGhpcy5fZGVsZWdhdGlvbkZlZVJhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBzdGFydCB0aW1lIG9mIHN0YWtpbmcgcGVyaW9kXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgc3RhcnRUaW1lKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSBCaWdJbnQodmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIGVuZCB0aW1lIG9mIHN0YWtpbmcgcGVyaW9kXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgZW5kVGltZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy5fZW5kVGltZSA9IEJpZ0ludCh2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBzdGFrZUFtb3VudCh2YWx1ZTogYmlnaW50IHwgc3RyaW5nKTogdGhpcyB7XG4gICAgY29uc3QgdmFsdWVCaWdJbnQgPSB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnID8gdmFsdWUgOiBCaWdJbnQodmFsdWUpO1xuICAgIHRoaXMudmFsaWRhdGVTdGFrZUFtb3VudCh2YWx1ZUJpZ0ludCk7XG4gICAgdGhpcy5fc3Rha2VBbW91bnQgPSB2YWx1ZUJpZ0ludDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHJlZ2lvbiBWYWxpZGF0b3JzXG4gIC8qKlxuICAgKiB2YWxpZGF0ZXMgYSBjb3JyZWN0IE5vZGVJRCBpcyB1c2VkXG4gICAqIEBwYXJhbSBub2RlSURcbiAgICovXG4gIHZhbGlkYXRlTm9kZUlEKG5vZGVJRDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFub2RlSUQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgbm9kZUlEJyk7XG4gICAgfVxuICAgIGlmIChub2RlSUQuc2xpY2UoMCwgNikgIT09ICdOb2RlSUQnKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBpbnZhbGlkIE5vZGVJRCB0YWcnKTtcbiAgICB9XG4gICAgaWYgKCEoQXZheFV0aWxzLmJhc2U1OC5kZWNvZGUobm9kZUlELnNsaWNlKDcpKS5sZW5ndGggPT09IDI0KSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogTm9kZUlEIGlzIG5vdCBpbiBjYjU4IGZvcm1hdCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBzdGFrZSBkdXJhdGlvblxuICAgKiBAcGFyYW0gc3RhcnRUaW1lXG4gICAqIEBwYXJhbSBlbmRUaW1lXG4gICAqL1xuICB2YWxpZGF0ZVN0YWtlRHVyYXRpb24oc3RhcnRUaW1lOiBiaWdpbnQsIGVuZFRpbWU6IGJpZ2ludCk6IHZvaWQge1xuICAgIGlmIChlbmRUaW1lIDwgc3RhcnRUaW1lKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdFbmQgZGF0ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHN0YXJ0IGRhdGUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgc3Rha2UgYW1vdW50XG4gICAqIEBwYXJhbSBhbW91bnRcbiAgICovXG4gIHZhbGlkYXRlU3Rha2VBbW91bnQoYW1vdW50OiBiaWdpbnQpOiB2b2lkIHtcbiAgICBjb25zdCBtaW5TdGFrZSA9IEJpZ0ludCh0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLm1pblN0YWtlKTtcbiAgICBpZiAoYW1vdW50IDwgbWluU3Rha2UpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ01pbmltdW0gc3Rha2luZyBhbW91bnQgaXMgJyArIE51bWJlcihtaW5TdGFrZSkgLyAxMDAwMDAwMDAwICsgJyBBVkFYLicpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBlbmRyZWdpb25cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaW5pdEJ1aWxkZXIodHg6IFR4KTogdGhpcyB7XG4gICAgc3VwZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHggPSAodHggYXMgVW5zaWduZWRUeCkudHggYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHg7XG4gICAgaWYgKCF0aGlzLnZlcmlmeVR4VHlwZShwZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4KSkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnVHJhbnNhY3Rpb24gY2Fubm90IGJlIHBhcnNlZCBvciBoYXMgYW4gdW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZScpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dHMgPSBwZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4LmJhc2VUeC5vdXRwdXRzO1xuICAgIGlmIChvdXRwdXRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gY2FuIGhhdmUgb25lIGV4dGVybmFsIG91dHB1dCcpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dCA9IG91dHB1dHNbMF0ub3V0cHV0IGFzIFRyYW5zZmVyT3V0cHV0O1xuICAgIGlmIChvdXRwdXRzWzBdLmdldEFzc2V0SWQoKSAhPT0gdGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQXNzZXQgSUQgb2YgdGhlIG91dHB1dCBkb2VzIG5vdCBtYXRjaCB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9ibHNQdWJsaWNLZXkgPSBBdmF4VXRpbHMuYnVmZmVyVG9IZXgoXG4gICAgICAocGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeC5zaWduZXIgYXMgcHZtU2VyaWFsLlNpZ25lcikucHJvb2YucHVibGljS2V5XG4gICAgKTtcbiAgICB0aGlzLl9ibHNQdWJsaWNLZXkgPSB0aGlzLnRyYW5zYWN0aW9uLl9ibHNQdWJsaWNLZXk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fYmxzU2lnbmF0dXJlID0gQXZheFV0aWxzLmJ1ZmZlclRvSGV4KFxuICAgICAgKHBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHguc2lnbmVyIGFzIHB2bVNlcmlhbC5TaWduZXIpLnByb29mLnNpZ25hdHVyZVxuICAgICk7XG4gICAgdGhpcy5fYmxzU2lnbmF0dXJlID0gdGhpcy50cmFuc2FjdGlvbi5fYmxzU2lnbmF0dXJlO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5fbG9ja3RpbWUgPSBvdXRwdXQub3V0cHV0T3duZXJzLmxvY2t0aW1lLnZhbHVlKCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkID0gb3V0cHV0Lm91dHB1dE93bmVycy50aHJlc2hvbGQudmFsdWUoKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9ub2RlSUQgPSBwZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4LnN1Ym5ldFZhbGlkYXRvci52YWxpZGF0b3Iubm9kZUlkLnRvU3RyaW5nKCk7XG4gICAgdGhpcy5fbm9kZUlEID0gdGhpcy50cmFuc2FjdGlvbi5fbm9kZUlEO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3N0YXJ0VGltZSA9IHBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHguc3VibmV0VmFsaWRhdG9yLnZhbGlkYXRvci5zdGFydFRpbWUudmFsdWUoKTtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSB0aGlzLnRyYW5zYWN0aW9uLl9zdGFydFRpbWU7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fZW5kVGltZSA9IHBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHguc3VibmV0VmFsaWRhdG9yLnZhbGlkYXRvci5lbmRUaW1lLnZhbHVlKCk7XG4gICAgdGhpcy5fZW5kVGltZSA9IHRoaXMudHJhbnNhY3Rpb24uX2VuZFRpbWU7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyA9IG91dHB1dC5vdXRwdXRPd25lcnMuYWRkcnMubWFwKChhKSA9PiBhLnRvQnl0ZXMoKSk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fc3Rha2VBbW91bnQgPSBwZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4LnN0YWtlWzBdLm91dHB1dC5hbW91bnQoKTtcbiAgICB0aGlzLnN0YWtlQW1vdW50KHRoaXMudHJhbnNhY3Rpb24uX3N0YWtlQW1vdW50KTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcyA9IHJlY292ZXJVdHhvcyhwZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4LmdldElucHV0cygpKTtcbiAgICAvLyBUT0RPKENSLTEwNzMpOiByZW1vdmUgbG9nXG4gICAgY29uc29sZS5sb2coJ3V0eG9zOiAnLCB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcyk7XG4gICAgY29uc29sZS5sb2coJ2Zyb21BZGRyZXNzZXM6ICcsIHRoaXMudHJhbnNhY3Rpb24uZnJvbUFkZHJlc3Nlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgdmVyaWZ5VHhUeXBlKHR5cGU6IFR5cGVTeW1ib2xzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGUgPT09IFR5cGVTeW1ib2xzLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHg7XG4gIH1cblxuICB2ZXJpZnlUeFR5cGUodHg6IFR4KTogdHggaXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgge1xuICAgIHJldHVybiBQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4QnVpbGRlci52ZXJpZnlUeFR5cGUoKHR4IGFzIHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4KS5fdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogU2luY2UgYWRkcmVzc2VzIGluIG91dHB1dHMgZ2V0IHJlb3JkZXJlZCwgd2UgbmVlZCB0byBtYWtlIHN1cmUgc2lnbmF0dXJlc1xuICAgKiBhcmUgYWRkZWQgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb25cbiAgICogVG8gZmluZCB0aGUgcG9zaXRpb24sIHdlIHVzZSB0aGUgb3V0cHV0J3MgYWRkcmVzc2VzIHRvIGNyZWF0ZSB0aGVcbiAgICogc2lnbmF0dXJlSWR4IGluIHRoZSBvcmRlciBuZWVkZWQgKGkuZS4gW3VzZXIsIGJpdGdvLCBiYWNrdXBdKVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgY2FsY3VsYXRlVXR4b3MoKToge1xuICAgIGlucHV0czogYXZheFNlcmlhbC5UcmFuc2ZlcmFibGVJbnB1dFtdO1xuICAgIHN0YWtlT3V0cHV0czogYXZheFNlcmlhbC5UcmFuc2ZlcmFibGVPdXRwdXRbXTtcbiAgICBjaGFuZ2VPdXRwdXRzOiBhdmF4U2VyaWFsLlRyYW5zZmVyYWJsZU91dHB1dFtdO1xuICAgIHV0eG9zOiBVdHhvW107XG4gICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgfSB7XG4gICAgY29uc3QgaW5wdXRzOiBhdmF4U2VyaWFsLlRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBzdGFrZU91dHB1dHM6IGF2YXhTZXJpYWwuVHJhbnNmZXJhYmxlT3V0cHV0W10gPSBbXTtcbiAgICBjb25zdCBjaGFuZ2VPdXRwdXRzOiBhdmF4U2VyaWFsLlRyYW5zZmVyYWJsZU91dHB1dFtdID0gW107XG4gICAgY29uc3QgdXR4b3M6IFV0eG9bXSA9IFtdO1xuXG4gICAgbGV0IGN1cnJlbnRUb3RhbCA9IEJpZ0ludCgwKTtcblxuICAgIC8vIHN0YWtpbmcgdHggcmVxdWlyZXMgZmVlcyBhZnRlciBBQ1AtMTAzXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F2YWxhbmNoZS1mb3VuZGF0aW9uL0FDUHMvYmxvYi9tYWluL0FDUHMvMTAzLWR5bmFtaWMtZmVlcy9SRUFETUUubWRcbiAgICBjb25zdCB0b3RhbFRhcmdldCA9IHRoaXMuX3N0YWtlQW1vdW50ICsgQmlnSW50KHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsudHhGZWUpO1xuXG4gICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXSA9IHRoaXMudHJhbnNhY3Rpb24uY3JlZGVudGlhbHMgPz8gW107XG4gICAgLy8gQ29udmVydCBmcm9tQWRkcmVzc2VzIHRvIHN0cmluZ1xuICAgIC8vIFRoZSBvcmRlciBvZiBmcm9tQWRkcmVzc2VzIGlzIGRldGVybWluZWQgYnkgdGhlIHNvdXJjZSBvZiB0aGUgZGF0YVxuICAgIC8vIFdoZW4gYnVpbGRpbmcgZnJvbSBwYXJhbXMsIHRoZSBvcmRlciBpcyBbdXNlciwgYml0Z28sIGJhY2t1cF1cbiAgICAvLyBUaGUgb3JkZXIgZnJvbSB0eCBoZXggaXMgW2JpdGdvLCBiYWNrdXAsIHVzZXJdXG4gICAgY29uc3QgYml0Z29BZGRyZXNzZXMgPSB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLm1hcCgoYikgPT5cbiAgICAgIGF2YXhVdGlscy5mb3JtYXQodGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5hbGlhcywgdGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5ocnAsIGIpXG4gICAgKTtcbiAgICAvLyBUT0RPKENSLTEwNzMpOiByZW1vdmUgbG9nXG4gICAgY29uc29sZS5sb2coYGJpdGdvQWRkcmVzczogJHtiaXRnb0FkZHJlc3Nlc31gKTtcblxuICAgIC8vIGlmIHdlIGFyZSBpbiBPVkMsIG5vbmUgb2YgdGhlIHV0eG9zIHdpbGwgaGF2ZSBhZGRyZXNzZXMgc2luY2UgdGhleSBjb21lIGZyb21cbiAgICAvLyBkZXNlcmlhbGl6ZWQgaW5wdXRzICh3aGljaCBkb24ndCBoYXZlIGFkZHJlc3NlcyksIG5vdCB0aGUgSU1TXG4gICAgY29uc3QgYnVpbGRPdXRwdXRzID1cbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zWzBdLmFkZHJlc3Nlcy5sZW5ndGggIT09IDAgfHwgdGhpcy50cmFuc2FjdGlvbi5fdXR4b3NbMF0uYWRkcmVzc2VzSW5kZXg/Lmxlbmd0aCAhPT0gMDtcblxuICAgIGNvbnN0IGFzc2V0SWQgPSBJZC5mcm9tU3RyaW5nKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zLmZvckVhY2goKHV0eG8sIGluZGV4KSA9PiB7XG4gICAgICAvLyB2YWxpZGF0ZSB0aGUgdXR4b3NcbiAgICAgIGlmICghdXR4bykge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdVdHhvIGlzIHVuZGVmaW5lZCcpO1xuICAgICAgfVxuICAgICAgLy8gYWRkcmVzc2VzSW5kZXggc2hvdWxkIG5ldmVyIGhhdmUgYSBtaXNtYXRjaFxuICAgICAgaWYgKHV0eG8uYWRkcmVzc2VzSW5kZXg/LmluY2x1ZGVzKC0xKSkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdBZGRyZXNzZXMgYXJlIGluY29uc2lzdGVudCcpO1xuICAgICAgfVxuICAgICAgaWYgKHV0eG8udGhyZXNob2xkIDwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1RocmVzaG9sZCBpcyBpbmNvbnNpc3RlbnQnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYml0Z29JbmRleFRvT25DaGFpbkluZGV4ID0gbmV3IE1hcCgpO1xuICAgICAgLy8gaW4gV1AsIG91dHB1dC5hZGRyZXNzZXNJbmRleCBpcyBlbXB0eSwgc28gZmlsbCBpdFxuICAgICAgaWYgKCF1dHhvLmFkZHJlc3Nlc0luZGV4IHx8IHV0eG8uYWRkcmVzc2VzSW5kZXgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHV0eG8uYWRkcmVzc2VzSW5kZXggPSBiaXRnb0FkZHJlc3Nlcy5tYXAoKGEpID0+IHV0eG8uYWRkcmVzc2VzLmluZGV4T2YoYSkpO1xuICAgICAgfVxuICAgICAgLy8gdXR4by5hZGRyZXNzZXMgaXMgbnVsbCB3aGVuIGJ1aWxkIGZyb20gcmF3XG4gICAgICAvLyBidXQgdXR4by5hZGRyZXNzZXNJbmRleCBoYXMgb25seSAyIGVsZW1lbnRzIHdoZW4gYnVpbGQgZnJvbSByYXdcbiAgICAgIC8vIHNvIHRoZSBiaXRnb0luZGV4VG9PbkNoYWluSW5kZXggbWFwIHdpbGwgYmUgZW1wdHlcbiAgICAgIHV0eG8uYWRkcmVzc2VzLmZvckVhY2goKGEpID0+IHtcbiAgICAgICAgYml0Z29JbmRleFRvT25DaGFpbkluZGV4LnNldChiaXRnb0FkZHJlc3Nlcy5pbmRleE9mKGEpLCB1dHhvLmFkZHJlc3Nlcy5pbmRleE9mKGEpKTtcbiAgICAgIH0pO1xuICAgICAgLy8gVE9ETyhDUi0xMDczKTogcmVtb3ZlIGxvZ1xuICAgICAgY29uc29sZS5sb2coYHV0eG8uYWRkcmVzc2VzOiAke3V0eG8uYWRkcmVzc2VzfWApO1xuICAgICAgY29uc29sZS5sb2coYGJpdGdvSW5kZXhUb09uQ2hhaW5JbmRleDogJHtBcnJheS5mcm9tKGJpdGdvSW5kZXhUb09uQ2hhaW5JbmRleCl9YCk7XG4gICAgICAvLyBpbiBPVkMsIG91dHB1dC5hZGRyZXNzZXNJbmRleCBpcyBkZWZpbmVkIGNvcnJlY3RseSBmcm9tIHRoZSBwcmV2aW91cyBpdGVyYXRpb25cblxuICAgICAgaWYgKHV0eG8ub3V0cHV0SUQgPT09IFNFQ1AyNTZLMV9UcmFuc2Zlcl9PdXRwdXQpIHtcbiAgICAgICAgY29uc3QgdXR4b0Ftb3VudCA9IEJpZ0ludCh1dHhvLmFtb3VudCk7XG4gICAgICAgIC8vIGVpdGhlciB1c2VyICgwKSBvciByZWNvdmVyeSAoMilcbiAgICAgICAgLy8gT24gcmVndWxhciBtb2RlOiBbdXNlciwgYml0Z29dIChpLmUuIFswLCAxXSlcbiAgICAgICAgLy8gT24gcmVjb3ZlcnkgbW9kZTogW2JhY2t1cCwgYml0Z29dIChpLmUuIFsyLCAxXSlcbiAgICAgICAgY29uc3QgdXNlck9yQmFja3VwSW5kZXggPSB0aGlzLnJlY292ZXJTaWduZXIgPyAyIDogMDtcbiAgICAgICAgY29uc3QgYml0Z29JbmRleCA9IDE7XG5cbiAgICAgICAgY3VycmVudFRvdGFsID0gY3VycmVudFRvdGFsICsgdXR4b0Ftb3VudDtcblxuICAgICAgICBjb25zdCB1dHhvSWQgPSBhdmF4U2VyaWFsLlVUWE9JRC5mcm9tTmF0aXZlKHV0eG8udHhpZCwgTnVtYmVyKHV0eG8ub3V0cHV0aWR4KSk7XG5cbiAgICAgICAgbGV0IGFkZHJlc3Nlc0luZGV4OiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBpZiAodXR4by5hZGRyZXNzZXNJbmRleCAmJiBiaXRnb0luZGV4VG9PbkNoYWluSW5kZXguc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIGFkZHJlc3Nlc0luZGV4ID0gWy4uLnV0eG8uYWRkcmVzc2VzSW5kZXhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFkZHJlc3Nlc0luZGV4LnB1c2goYml0Z29JbmRleFRvT25DaGFpbkluZGV4LmdldCh1c2VyT3JCYWNrdXBJbmRleCkpO1xuICAgICAgICAgIGFkZHJlc3Nlc0luZGV4LnB1c2goYml0Z29JbmRleFRvT25DaGFpbkluZGV4LmdldChiaXRnb0luZGV4KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2ZlcklucHV0cyA9IG5ldyBUcmFuc2ZlcklucHV0KFxuICAgICAgICAgIG5ldyBCaWdJbnRQcih1dHhvQW1vdW50KSxcbiAgICAgICAgICBuZXcgSW5wdXQoWy4uLmFkZHJlc3Nlc0luZGV4XS5zb3J0KCkubWFwKChudW0pID0+IG5ldyBJbnQobnVtKSkpXG4gICAgICAgICk7XG4gICAgICAgIC8vIFRPRE8oQ1ItMTA3Myk6IHJlbW92ZSBsb2dcbiAgICAgICAgY29uc29sZS5sb2coYHVzaW5nIGFkZHJlc3Nlc0luZGV4IHNvcnRlZDogJHtbLi4uYWRkcmVzc2VzSW5kZXhdLnNvcnQoKX1gKTtcblxuICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBhdmF4U2VyaWFsLlRyYW5zZmVyYWJsZUlucHV0KHV0eG9JZCwgYXNzZXRJZCwgdHJhbnNmZXJJbnB1dHMpO1xuICAgICAgICB1dHhvcy5wdXNoKG5ldyBVdHhvKHV0eG9JZCwgYXNzZXRJZCwgdHJhbnNmZXJJbnB1dHMpKTtcblxuICAgICAgICBpbnB1dHMucHVzaChpbnB1dCk7XG4gICAgICAgIGlmICghdGhpcy50cmFuc2FjdGlvbi5jcmVkZW50aWFscyB8fCB0aGlzLnRyYW5zYWN0aW9uLmNyZWRlbnRpYWxzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgaWYgKGJ1aWxkT3V0cHV0cykge1xuICAgICAgICAgICAgLy8gRm9yIHRoZSBiaXRnbyBzaWduYXR1cmUgd2UgY3JlYXRlIGFuIGVtcHR5IHNpZ25hdHVyZVxuICAgICAgICAgICAgLy8gRm9yIHRoZSB1c2VyL2JhY2t1cCBzaWduYXR1cmUgd2Ugc3RvcmUgdGhlIGFkZHJlc3MgdGhhdCBtYXRjaGVzIHRoZSBrZXlcbiAgICAgICAgICAgIC8vIGlmIGJpdGdvIGFkZHJlc3MgY29tZXMgYmVmb3JlICA8IHVzZXIvYmFja3VwIGFkZHJlc3NcblxuICAgICAgICAgICAgLy8gVE9ETyhDUi0xMDczKTogcmVtb3ZlIGxvZ1xuICAgICAgICAgICAgY29uc29sZS5sb2coYGJpdGdvIGluZGV4IG9uIGNoYWluOiAke3V0eG8uYWRkcmVzc2VzSW5kZXhbYml0Z29JbmRleF19YCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgdXNlciBPciBCYWNrdXAgSW5kZXg6ICR7dXR4by5hZGRyZXNzZXNJbmRleFt1c2VyT3JCYWNrdXBJbmRleF19YCk7XG4gICAgICAgICAgICBpZiAodXR4by5hZGRyZXNzZXNJbmRleFtiaXRnb0luZGV4XSA8IHV0eG8uYWRkcmVzc2VzSW5kZXhbdXNlck9yQmFja3VwSW5kZXhdKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE8oQ1ItMTA3Myk6IHJlbW92ZSBsb2dcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coYHVzZXIgb3IgYmFja3VwIGNyZWRlbnRpYWxzIGFmdGVyIGJpdGdvYCk7XG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IENyZWRlbnRpYWwoW1xuICAgICAgICAgICAgICAgICAgdXRpbHMuY3JlYXRlTmV3U2lnKEJ1ZmZlckF2YXguZnJvbSgnJykudG9TdHJpbmcoJ2hleCcpKSxcbiAgICAgICAgICAgICAgICAgIHV0aWxzLmNyZWF0ZU5ld1NpZyhcbiAgICAgICAgICAgICAgICAgICAgQnVmZmVyQXZheC5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXNbdXNlck9yQmFja3VwSW5kZXhdKS50b1N0cmluZygnaGV4JylcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRPRE8oQ1ItMTA3Myk6IHJlbW92ZSBsb2dcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coYHVzZXIgb3IgYmFja3VwIGNyZWRlbnRpYWxzIGJlZm9yZSBiaXRnb2ApO1xuICAgICAgICAgICAgICBjcmVkZW50aWFscy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBDcmVkZW50aWFsKFtcbiAgICAgICAgICAgICAgICAgIHV0aWxzLmNyZWF0ZU5ld1NpZyhcbiAgICAgICAgICAgICAgICAgICAgQnVmZmVyQXZheC5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXNbdXNlck9yQmFja3VwSW5kZXhdKS50b1N0cmluZygnaGV4JylcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICB1dGlscy5jcmVhdGVOZXdTaWcoQnVmZmVyQXZheC5mcm9tKCcnKS50b1N0cmluZygnaGV4JykpLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRPRE8oQ1ItMTA3Myk6IHZlcmlmeSB0aGlzIGVsc2UgY2FzZSBmb3IgT1ZDXG4gICAgICAgICAgICBjcmVkZW50aWFscy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgQ3JlZGVudGlhbChcbiAgICAgICAgICAgICAgICBhZGRyZXNzZXNJbmRleC5tYXAoKGkpID0+XG4gICAgICAgICAgICAgICAgICB1dGlscy5jcmVhdGVOZXdTaWcoQnVmZmVyQXZheC5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXNbaV0pLnRvU3RyaW5nKCdoZXgnKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRPRE8oQ1ItMTA3Myk6IHJlbW92ZSBsb2dcbiAgICAgICAgICBjb25zb2xlLmxvZyhgcmV1c2luZyBjcmVkZW50aWFscyBmcm9tIHRyYW5zYWN0aW9uYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChidWlsZE91dHB1dHMpIHtcbiAgICAgIGlmIChjdXJyZW50VG90YWwgPCB0b3RhbFRhcmdldCkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgIGBVdHhvIG91dHB1dHMgZ2V0ICR7Y3VycmVudFRvdGFsLnRvU3RyaW5nKCl9IGFuZCAke3RvdGFsVGFyZ2V0LnRvU3RyaW5nKCl9IGlzIHJlcXVpcmVkYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50VG90YWwgPj0gdG90YWxUYXJnZXQpIHtcbiAgICAgICAgY29uc3Qgc3Rha2VPdXRwdXQgPSBuZXcgYXZheFNlcmlhbC5UcmFuc2ZlcmFibGVPdXRwdXQoXG4gICAgICAgICAgYXNzZXRJZCxcbiAgICAgICAgICBuZXcgVHJhbnNmZXJPdXRwdXQoXG4gICAgICAgICAgICBuZXcgQmlnSW50UHIodGhpcy5fc3Rha2VBbW91bnQpLFxuICAgICAgICAgICAgbmV3IE91dHB1dE93bmVycyhcbiAgICAgICAgICAgICAgbmV3IEJpZ0ludFByKHRoaXMudHJhbnNhY3Rpb24uX2xvY2t0aW1lKSxcbiAgICAgICAgICAgICAgbmV3IEludCh0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQpLFxuICAgICAgICAgICAgICBbLi4udGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc11cbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYXZheFV0aWxzLmJ5dGVzQ29tcGFyZShhLCBiKSlcbiAgICAgICAgICAgICAgICAubWFwKChhKSA9PiBBZGRyZXNzLmZyb21CeXRlcyhhKVswXSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHN0YWtlT3V0cHV0cy5wdXNoKHN0YWtlT3V0cHV0KTtcblxuICAgICAgICBpZiAoY3VycmVudFRvdGFsID4gdG90YWxUYXJnZXQpIHtcbiAgICAgICAgICBjb25zdCBjaGFuZ2VPdXRwdXQgPSBuZXcgYXZheFNlcmlhbC5UcmFuc2ZlcmFibGVPdXRwdXQoXG4gICAgICAgICAgICBhc3NldElkLFxuICAgICAgICAgICAgbmV3IFRyYW5zZmVyT3V0cHV0KFxuICAgICAgICAgICAgICBuZXcgQmlnSW50UHIoY3VycmVudFRvdGFsIC0gdG90YWxUYXJnZXQpLFxuICAgICAgICAgICAgICBuZXcgT3V0cHV0T3duZXJzKFxuICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRQcih0aGlzLnRyYW5zYWN0aW9uLl9sb2NrdGltZSksXG4gICAgICAgICAgICAgICAgbmV3IEludCh0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQpLFxuICAgICAgICAgICAgICAgIFsuLi50aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzXVxuICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGF2YXhVdGlscy5ieXRlc0NvbXBhcmUoYSwgYikpXG4gICAgICAgICAgICAgICAgICAubWFwKChhKSA9PiBBZGRyZXNzLmZyb21CeXRlcyhhKVswXSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY2hhbmdlT3V0cHV0cy5wdXNoKGNoYW5nZU91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaW5wdXRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGlmIChhdmF4VXRpbHMuYnl0ZXNFcXVhbChhLnV0eG9JRC50eElELnRvQnl0ZXMoKSwgYi51dHhvSUQudHhJRC50b0J5dGVzKCkpKSB7XG4gICAgICAgIHJldHVybiBhLnV0eG9JRC5vdXRwdXRJZHgudmFsdWUoKSAtIGIudXR4b0lELm91dHB1dElkeC52YWx1ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF2YXhVdGlscy5ieXRlc0NvbXBhcmUoYS51dHhvSUQudHhJRC50b0J5dGVzKCksIGIudXR4b0lELnR4SUQudG9CeXRlcygpKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBpbnB1dHMsIHN0YWtlT3V0cHV0cywgY2hhbmdlT3V0cHV0cywgdXR4b3MsIGNyZWRlbnRpYWxzIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIGFkZCB2YWxpZGF0b3IgdHJhbnNhY3Rpb25cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkQXZheFRyYW5zYWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVTdGFrZUR1cmF0aW9uKHRoaXMudHJhbnNhY3Rpb24uX3N0YXJ0VGltZSwgdGhpcy50cmFuc2FjdGlvbi5fZW5kVGltZSk7XG4gICAgY29uc3QgeyBpbnB1dHMsIHN0YWtlT3V0cHV0cywgY2hhbmdlT3V0cHV0cywgdXR4b3MsIGNyZWRlbnRpYWxzIH0gPSB0aGlzLmNhbGN1bGF0ZVV0eG9zKCk7XG4gICAgY29uc3QgYmFzZVR4ID0gYXZheFNlcmlhbC5CYXNlVHguZnJvbU5hdGl2ZShcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmtJRCxcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX2Jsb2NrY2hhaW5JRCxcbiAgICAgIGNoYW5nZU91dHB1dHMsXG4gICAgICBpbnB1dHMsXG4gICAgICBuZXcgVWludDhBcnJheSgpIC8vIGRlZmF1bHQgZW1wdHkgbWVtb1xuICAgICk7XG5cbiAgICBjb25zdCBzdWJuZXRWYWxpZGF0b3IgPSBwdm1TZXJpYWwuU3VibmV0VmFsaWRhdG9yLmZyb21OYXRpdmUoXG4gICAgICB0aGlzLl9ub2RlSUQsXG4gICAgICB0aGlzLl9zdGFydFRpbWUsXG4gICAgICB0aGlzLl9lbmRUaW1lLFxuICAgICAgdGhpcy5fc3Rha2VBbW91bnQsXG4gICAgICBuZXR3b3JrSURzLlByaW1hcnlOZXR3b3JrSURcbiAgICApO1xuXG4gICAgY29uc3Qgc2lnbmVyID0gbmV3IHB2bVNlcmlhbC5TaWduZXIoXG4gICAgICBuZXcgcHZtU2VyaWFsLlByb29mT2ZQb3NzZXNzaW9uKFxuICAgICAgICBBdmF4VXRpbHMuaGV4VG9CdWZmZXIodGhpcy5fYmxzUHVibGljS2V5KSxcbiAgICAgICAgQXZheFV0aWxzLmhleFRvQnVmZmVyKHRoaXMuX2Jsc1NpZ25hdHVyZSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3Qgb3V0cHV0T3duZXJzID0gbmV3IE91dHB1dE93bmVycyhcbiAgICAgIG5ldyBCaWdJbnRQcih0aGlzLnRyYW5zYWN0aW9uLl9sb2NrdGltZSksXG4gICAgICBuZXcgSW50KHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCksXG4gICAgICBbLi4udGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc11cbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGF2YXhVdGlscy5ieXRlc0NvbXBhcmUoYSwgYikpXG4gICAgICAgIC5tYXAoKGEpID0+IEFkZHJlc3MuZnJvbUJ5dGVzKGEpWzBdKVxuICAgICk7XG5cbiAgICAvLyBUT0RPKENSLTEwNzMpOiBjaGVjayB0aGlzIHZhbHVlXG4gICAgLy8gIFNoYXJlcyAxMCwwMDAgdGltZXMgcGVyY2VudGFnZSBvZiByZXdhcmQgdGFrZW4gZnJvbSBkZWxlZ2F0b3JzXG4gICAgLy8gIGh0dHBzOi8vZG9jcy5hdmF4Lm5ldHdvcmsvcmVmZXJlbmNlL2F2YWxhbmNoZWdvL3AtY2hhaW4vdHhuLWZvcm1hdCN1bnNpZ25lZC1hZGQtdmFsaWRhdG9yLXR4XG4gICAgY29uc3Qgc2hhcmVzID0gbmV3IEludCgxZTQgKiAyKTtcblxuICAgIGNvbnN0IGFkZHJlc3NNYXBzID0gWy4uLnRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXNdXG4gICAgICAuc29ydCgoYSwgYikgPT4gYXZheFV0aWxzLmJ5dGVzQ29tcGFyZShhLCBiKSlcbiAgICAgIC5tYXAoKGFkZHJlc3MpID0+IG5ldyBBdmF4VXRpbHMuQWRkcmVzc01hcChbW25ldyBBZGRyZXNzKGFkZHJlc3MpLCAwXV0pKTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24oXG4gICAgICBuZXcgVW5zaWduZWRUeChcbiAgICAgICAgbmV3IHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4KFxuICAgICAgICAgIGJhc2VUeCxcbiAgICAgICAgICBzdWJuZXRWYWxpZGF0b3IsXG4gICAgICAgICAgc2lnbmVyLFxuICAgICAgICAgIHN0YWtlT3V0cHV0cyxcbiAgICAgICAgICBvdXRwdXRPd25lcnMsXG4gICAgICAgICAgb3V0cHV0T3duZXJzLFxuICAgICAgICAgIHNoYXJlc1xuICAgICAgICApLFxuICAgICAgICB1dHhvcyxcbiAgICAgICAgbmV3IEF2YXhVdGlscy5BZGRyZXNzTWFwcyhhZGRyZXNzTWFwcyksXG4gICAgICAgIGNyZWRlbnRpYWxzXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgc2lnbkltcGxlbWVudGF0aW9uKHsga2V5IH06IEJhc2VLZXkpOiBUcmFuc2FjdGlvbiB7XG4gICAgdGhpcy5fc2lnbmVyLnB1c2gobmV3IEtleVBhaXIoeyBwcnY6IGtleSB9KSk7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IEJhc2VBZGRyZXNzLCBhZGRyZXNzRm9ybWF0Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzLmFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGFkZHJlc3MnKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldCB0cmFuc2FjdGlvbih0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgaGFzU2lnbmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaWduZXIgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9zaWduZXIubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZUtleSh7IGtleSB9OiBCYXNlS2V5KTogdm9pZCB7XG4gICAgaWYgKCFuZXcgS2V5UGFpcih7IHBydjoga2V5IH0pKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGtleScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgcmF3IHRyYW5zYWN0aW9uIGhhcyBhIHZhbGlkIGZvcm1hdCBpbiB0aGUgYmxvY2tjaGFpbiBjb250ZXh0LCB0aHJvdyBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSByYXdUcmFuc2FjdGlvbiBUcmFuc2FjdGlvbiBpbiBhbnkgZm9ybWF0XG4gICAqL1xuICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB1dGlscy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uPzogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICAvLyB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigndmFsaWRhdGVUcmFuc2FjdGlvbiBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVZhbHVlKHZhbHVlOiBCaWdOdW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUuaXNMZXNzVGhhbigwKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,78 +0,0 @@
1
- import { avaxSerial, Credential } from '@bitgo-forks/avalanchejs';
2
- import { BaseKey, BaseTransaction, Entry, TransactionFee, TransactionType } from '@bitgo/sdk-core';
3
- import { AvalancheNetwork, BaseCoin as CoinConfig } from '@bitgo/statics';
4
- import { Buffer as BufferAvax } from 'avalanche';
5
- import { Buffer } from 'buffer';
6
- import { DecodedUtxoObj, TransactionExplanation, Tx, TxData } from './iface';
7
- import { KeyPair } from './keyPair';
8
- export declare class Transaction extends BaseTransaction {
9
- protected _avaxTransaction: Tx;
10
- _type: TransactionType;
11
- _network: AvalancheNetwork;
12
- _networkID: number;
13
- _assetId: string;
14
- _blockchainID: string;
15
- _nodeID: string;
16
- _startTime: bigint;
17
- _endTime: bigint;
18
- _stakeAmount: bigint;
19
- _threshold: number;
20
- _locktime: bigint;
21
- _fromAddresses: Uint8Array[];
22
- _rewardAddresses: BufferAvax[];
23
- _utxos: DecodedUtxoObj[];
24
- _to: BufferAvax[];
25
- _fee: Partial<TransactionFee>;
26
- _blsPublicKey: string;
27
- _blsSignature: string;
28
- constructor(coinConfig: Readonly<CoinConfig>);
29
- get avaxPTransaction(): avaxSerial.BaseTx;
30
- get signature(): string[];
31
- get credentials(): Credential[];
32
- get hasCredentials(): boolean;
33
- /** @inheritdoc */
34
- canSign({ key }: BaseKey): boolean;
35
- /**
36
- * Sign an avaxp transaction and update the transaction hex
37
- * @param {KeyPair} keyPair
38
- */
39
- sign(keyPair: KeyPair): Promise<void>;
40
- toHexString(byteArray: Uint8Array): string;
41
- /** @inheritdoc */
42
- /**
43
- * should be of signedTx doing this with baseTx
44
- */
45
- toBroadcastFormat(): string;
46
- toJson(): TxData;
47
- setTransaction(tx: Tx): void;
48
- /**
49
- * Set the transaction type
50
- *
51
- * @param {TransactionType} transactionType The transaction type to be set
52
- */
53
- setTransactionType(transactionType: TransactionType): void;
54
- /**
55
- * Returns the portion of the transaction that needs to be signed in Buffer format.
56
- * Only needed for coins that support adding signatures directly (e.g. TSS).
57
- */
58
- get signablePayload(): Buffer;
59
- get id(): string;
60
- get fromAddresses(): string[];
61
- get rewardAddresses(): string[];
62
- /**
63
- * Get the list of outputs. Amounts are expressed in absolute value.
64
- */
65
- get outputs(): Entry[];
66
- get fee(): TransactionFee;
67
- get changeOutputs(): Entry[];
68
- get inputs(): Entry[];
69
- /**
70
- * Avax wrapper to create signature and return it for credentials
71
- * @param prv
72
- * @return hexstring
73
- */
74
- createSignature(prv: Buffer): string;
75
- /** @inheritdoc */
76
- explainTransaction(): TransactionExplanation;
77
- }
78
- //# sourceMappingURL=transaction.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,UAAU,EAAoC,MAAM,0BAA0B,CAAC;AACxH,OAAO,EACL,OAAO,EACP,eAAe,EACf,KAAK,EAGL,cAAc,EACd,eAAe,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAM,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAqB,cAAc,EAAmB,sBAAsB,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwCpC,qBAAa,WAAY,SAAQ,eAAe;IAC9C,SAAS,CAAC,gBAAgB,EAAE,EAAE,CAAC;IACxB,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,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,gBAAgB,EAAE,UAAU,EAAE,CAAM;IACpC,MAAM,EAAE,cAAc,EAAE,CAAM;IAC9B,GAAG,EAAE,UAAU,EAAE,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,CAAM;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;gBAEjB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAQ5C,IAAI,gBAAgB,IAAI,UAAU,CAAC,MAAM,CAExC;IAED,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;IAKlC;;;OAGG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAuC3C,WAAW,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM;IAI1C,kBAAkB;IAClB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAQ3B,MAAM,IAAI,MAAM;IAiBhB,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;IAI5B;;;;OAIG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAO1D;;;OAGG;IACH,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;;OAEG;IACH,IAAI,OAAO,IAAI,KAAK,EAAE,CAgBrB;IAED,IAAI,GAAG,IAAI,cAAc,CAExB;IAED,IAAI,aAAa,IAAI,KAAK,EAAE,CAI3B;IAED,IAAI,MAAM,IAAI,KAAK,EAAE,CAgBpB;IAED;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IASpC,kBAAkB;IAClB,kBAAkB,IAAI,sBAAsB;CA0B7C"}