@bitgo-beta/sdk-coin-flrp 1.0.1-beta.32 → 1.0.1-beta.321

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 (116) hide show
  1. package/dist/src/flrp.d.ts +9 -16
  2. package/dist/src/flrp.d.ts.map +1 -1
  3. package/dist/src/flrp.js +49 -75
  4. package/dist/src/index.d.ts +0 -1
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +1 -2
  7. package/dist/src/lib/ExportInCTxBuilder.d.ts +51 -0
  8. package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/ExportInCTxBuilder.js +188 -0
  10. package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
  11. package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/ExportInPTxBuilder.js +273 -0
  13. package/dist/src/lib/ImportInCTxBuilder.d.ts +48 -0
  14. package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/ImportInCTxBuilder.js +215 -0
  16. package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
  17. package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/ImportInPTxBuilder.js +180 -0
  19. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
  20. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
  21. package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
  22. package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -76
  23. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/atomicTransactionBuilder.js +141 -218
  25. package/dist/src/lib/iface.d.ts +38 -61
  26. package/dist/src/lib/iface.d.ts.map +1 -1
  27. package/dist/src/lib/iface.js +13 -14
  28. package/dist/src/lib/index.d.ts +5 -0
  29. package/dist/src/lib/index.d.ts.map +1 -1
  30. package/dist/src/lib/index.js +12 -2
  31. package/dist/src/lib/keyPair.d.ts +5 -5
  32. package/dist/src/lib/keyPair.d.ts.map +1 -1
  33. package/dist/src/lib/keyPair.js +17 -9
  34. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +43 -0
  35. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/permissionlessValidatorTxBuilder.js +132 -0
  37. package/dist/src/lib/transaction.d.ts +14 -69
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +258 -199
  40. package/dist/src/lib/transactionBuilder.d.ts +107 -0
  41. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  42. package/dist/src/lib/transactionBuilder.js +210 -0
  43. package/dist/src/lib/transactionBuilderFactory.d.ts +50 -30
  44. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  45. package/dist/src/lib/transactionBuilderFactory.js +129 -72
  46. package/dist/src/lib/utils.d.ts +74 -147
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +235 -324
  49. package/dist/test/resources/account.d.ts +51 -0
  50. package/dist/test/resources/account.d.ts.map +1 -0
  51. package/dist/test/resources/account.js +54 -0
  52. package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
  53. package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
  54. package/dist/test/resources/transactionData/exportInC.js +34 -0
  55. package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
  56. package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
  57. package/dist/test/resources/transactionData/exportInP.js +140 -0
  58. package/dist/test/resources/transactionData/importInC.d.ts +27 -0
  59. package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
  60. package/dist/test/resources/transactionData/importInC.js +44 -0
  61. package/dist/test/resources/transactionData/importInP.d.ts +35 -0
  62. package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
  63. package/dist/test/resources/transactionData/importInP.js +58 -0
  64. package/dist/test/unit/flrp.js +449 -68
  65. package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
  66. package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
  67. package/dist/test/unit/lib/exportInCTxBuilder.js +166 -0
  68. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
  69. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
  70. package/dist/test/unit/lib/exportInPTxBuilder.js +121 -0
  71. package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
  72. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
  73. package/dist/test/unit/lib/importInCTxBuilder.js +47 -0
  74. package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
  75. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
  76. package/dist/test/unit/lib/importInPTxBuilder.js +73 -0
  77. package/dist/test/unit/lib/keyPair.d.ts +2 -0
  78. package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
  79. package/dist/test/unit/lib/keyPair.js +158 -0
  80. package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
  81. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
  82. package/dist/test/unit/lib/signFlowTestSuit.js +89 -0
  83. package/dist/test/unit/lib/utils.js +507 -207
  84. package/dist/tsconfig.tsbuildinfo +1 -1
  85. package/package.json +18 -10
  86. package/.eslintignore +0 -5
  87. package/.eslintrc.json +0 -7
  88. package/.mocharc.yml +0 -8
  89. package/CHANGELOG.md +0 -0
  90. package/dist/src/iface.d.ts +0 -25
  91. package/dist/src/iface.d.ts.map +0 -1
  92. package/dist/src/iface.js +0 -3
  93. package/dist/src/lib/constants.d.ts +0 -11
  94. package/dist/src/lib/constants.d.ts.map +0 -1
  95. package/dist/src/lib/constants.js +0 -17
  96. package/dist/src/lib/errors.d.ts +0 -8
  97. package/dist/src/lib/errors.d.ts.map +0 -1
  98. package/dist/src/lib/errors.js +0 -19
  99. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  100. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  101. package/dist/src/lib/exportInCTxBuilder.js +0 -170
  102. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  103. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  104. package/dist/src/lib/exportInPTxBuilder.js +0 -56
  105. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
  106. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
  107. package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
  108. package/dist/test/unit/lib/exportTxBuilder.d.ts +0 -2
  109. package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
  110. package/dist/test/unit/lib/exportTxBuilder.js +0 -45
  111. package/dist/test/unit/lib/transaction.d.ts +0 -2
  112. package/dist/test/unit/lib/transaction.d.ts.map +0 -1
  113. package/dist/test/unit/lib/transaction.js +0 -460
  114. package/dist/test/unit/smoke.d.ts +0 -2
  115. package/dist/test/unit/smoke.d.ts.map +0 -1
  116. package/dist/test/unit/smoke.js +0 -23
@@ -0,0 +1,48 @@
1
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
2
+ import { TransactionType } from '@bitgo-beta/sdk-core';
3
+ import { AtomicInCTransactionBuilder } from './atomicInCTransactionBuilder';
4
+ import { Credential, TransferableInput } from '@flarenetwork/flarejs';
5
+ import { Tx } from './iface';
6
+ export declare class ImportInCTxBuilder extends AtomicInCTransactionBuilder {
7
+ constructor(_coinConfig: Readonly<CoinConfig>);
8
+ /**
9
+ * C-chain address who is target of the import.
10
+ * Address format is eth like
11
+ * @param {string} cAddress
12
+ */
13
+ to(cAddress: string): this;
14
+ protected get transactionType(): TransactionType;
15
+ initBuilder(tx: Tx, rawBytes?: Buffer, parsedCredentials?: Credential[]): this;
16
+ static verifyTxType(txnType: string): boolean;
17
+ verifyTxType(txnType: string): boolean;
18
+ /**
19
+ * Build the import in C-chain transaction
20
+ * @protected
21
+ */
22
+ protected buildFlareTransaction(): void;
23
+ /**
24
+ * Create inputs from UTXOs
25
+ * @return {
26
+ * inputs: TransferableInput[];
27
+ * credentials: Credential[];
28
+ * amount: bigint;
29
+ * }
30
+ */
31
+ protected createInputs(): {
32
+ inputs: TransferableInput[];
33
+ credentials: Credential[];
34
+ amount: bigint;
35
+ };
36
+ /**
37
+ * Calculate the fee size for the transaction
38
+ * For C-chain imports, the feeRate is treated as an absolute fee value
39
+ */
40
+ private calculateFeeSize;
41
+ /**
42
+ * Recover UTXOs from imported inputs
43
+ * @param importedInputs Array of transferable inputs
44
+ * @returns Array of decoded UTXO objects
45
+ */
46
+ private recoverUtxos;
47
+ }
48
+ //# sourceMappingURL=ImportInCTxBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImportInCTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/ImportInCTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAuC,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAGL,UAAU,EAIV,iBAAiB,EAIlB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAmE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE9F,qBAAa,kBAAmB,SAAQ,2BAA2B;gBACrD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C;;;;OAIG;IACH,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK1B,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI;IA4E9E,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7C,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItC;;;OAGG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAsDvC;;;;;;;OAOG;IACH,SAAS,CAAC,YAAY,IAAI;QACxB,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,WAAW,EAAE,UAAU,EAAE,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC;KAChB;IAqDD;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;;;OAIG;IACH,OAAO,CAAC,YAAY;CAiBrB"}
@@ -0,0 +1,215 @@
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.ImportInCTxBuilder = void 0;
7
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const atomicInCTransactionBuilder_1 = require("./atomicInCTransactionBuilder");
9
+ const flarejs_1 = require("@flarenetwork/flarejs");
10
+ const utils_1 = __importDefault(require("./utils"));
11
+ const iface_1 = require("./iface");
12
+ class ImportInCTxBuilder extends atomicInCTransactionBuilder_1.AtomicInCTransactionBuilder {
13
+ constructor(_coinConfig) {
14
+ super(_coinConfig);
15
+ }
16
+ /**
17
+ * C-chain address who is target of the import.
18
+ * Address format is eth like
19
+ * @param {string} cAddress
20
+ */
21
+ to(cAddress) {
22
+ this.transaction._to = [utils_1.default.parseAddress(cAddress)];
23
+ return this;
24
+ }
25
+ get transactionType() {
26
+ return sdk_core_1.TransactionType.Import;
27
+ }
28
+ initBuilder(tx, rawBytes, parsedCredentials) {
29
+ const baseTx = tx;
30
+ if (!this.verifyTxType(baseTx._type)) {
31
+ throw new sdk_core_1.NotSupported('Transaction cannot be parsed or has an unsupported transaction type');
32
+ }
33
+ // The outputs is a single C-Chain address result.
34
+ // It's expected to have only one output to the destination C-Chain address.
35
+ const outputs = baseTx.Outs;
36
+ if (outputs.length !== 1) {
37
+ throw new sdk_core_1.BuildTransactionError('Transaction can have one output');
38
+ }
39
+ const output = outputs[0];
40
+ if (Buffer.from(output.assetId.toBytes()).toString('hex') !== this.transaction._assetId) {
41
+ throw new Error('AssetID are not equals');
42
+ }
43
+ this.transaction._to = [Buffer.from(output.address.toBytes())];
44
+ const inputs = baseTx.importedInputs;
45
+ this.transaction._utxos = this.recoverUtxos(inputs);
46
+ // Calculate total input and output amounts
47
+ const totalInputAmount = inputs.reduce((t, i) => t + i.amount(), BigInt(0));
48
+ const totalOutputAmount = output.amount.value();
49
+ // Calculate fee based on input/output difference
50
+ const fee = totalInputAmount - totalOutputAmount;
51
+ const feeSize = this.calculateFeeSize(baseTx);
52
+ // Use integer division to ensure feeRate can be converted back to BigInt
53
+ const feeRate = Math.floor(Number(fee) / feeSize);
54
+ this.transaction._fee = {
55
+ fee: fee.toString(),
56
+ feeRate: feeRate,
57
+ size: feeSize,
58
+ };
59
+ // Use credentials passed from TransactionBuilderFactory (properly extracted using codec)
60
+ const credentials = parsedCredentials || [];
61
+ const hasCredentials = credentials.length > 0;
62
+ // If it's a signed transaction, store the original raw bytes to preserve exact format
63
+ if (hasCredentials && rawBytes) {
64
+ this.transaction._rawSignedBytes = rawBytes;
65
+ }
66
+ // Extract threshold from first input's sigIndicies (number of required signatures)
67
+ const firstInput = inputs[0];
68
+ const inputThreshold = firstInput.sigIndicies().length || this.transaction._threshold;
69
+ this.transaction._threshold = inputThreshold;
70
+ // Create proper UnsignedTx wrapper with credentials
71
+ const toAddress = new flarejs_1.Address(output.address.toBytes());
72
+ const addressMap = new flarejs_1.utils.AddressMap([[toAddress, 0]]);
73
+ const addressMaps = new flarejs_1.utils.AddressMaps([addressMap]);
74
+ // When credentials were extracted, use them directly to preserve existing signatures
75
+ let txCredentials;
76
+ if (credentials.length > 0) {
77
+ txCredentials = credentials;
78
+ }
79
+ else {
80
+ // Create empty credential with threshold number of signature slots
81
+ const emptySignatures = [];
82
+ for (let i = 0; i < inputThreshold; i++) {
83
+ emptySignatures.push(utils_1.default.createNewSig(''));
84
+ }
85
+ txCredentials = [new flarejs_1.Credential(emptySignatures)];
86
+ }
87
+ const unsignedTx = new flarejs_1.UnsignedTx(baseTx, [], addressMaps, txCredentials);
88
+ this.transaction.setTransaction(unsignedTx);
89
+ return this;
90
+ }
91
+ static verifyTxType(txnType) {
92
+ return txnType === iface_1.FlareTransactionType.EvmImportTx;
93
+ }
94
+ verifyTxType(txnType) {
95
+ return ImportInCTxBuilder.verifyTxType(txnType);
96
+ }
97
+ /**
98
+ * Build the import in C-chain transaction
99
+ * @protected
100
+ */
101
+ buildFlareTransaction() {
102
+ // if tx has credentials or was already recovered from raw, tx shouldn't change
103
+ if (this.transaction.hasCredentials)
104
+ return;
105
+ // If fee is already calculated (from initBuilder), the transaction is already built
106
+ if (this.transaction._fee.fee)
107
+ return;
108
+ if (this.transaction._to.length !== 1) {
109
+ throw new Error('to is required');
110
+ }
111
+ if (!this.transaction._fee.feeRate) {
112
+ throw new Error('fee rate is required');
113
+ }
114
+ const { inputs, amount, credentials } = this.createInputs();
115
+ // Calculate fee
116
+ const feeRate = BigInt(this.transaction._fee.feeRate);
117
+ const feeSize = this.calculateFeeSize();
118
+ const fee = feeRate * BigInt(feeSize);
119
+ this.transaction._fee.fee = fee.toString();
120
+ this.transaction._fee.size = feeSize;
121
+ // Create EVM output using proper FlareJS class
122
+ const output = new flarejs_1.evmSerial.Output(new flarejs_1.Address(this.transaction._to[0]), new flarejs_1.BigIntPr(amount - fee), new flarejs_1.Id(new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'))));
123
+ // Create the import transaction
124
+ const importTx = new flarejs_1.evmSerial.ImportTx(new flarejs_1.Int(this.transaction._networkID), new flarejs_1.Id(new Uint8Array(Buffer.from(this.transaction._blockchainID, 'hex'))), new flarejs_1.Id(new Uint8Array(this._externalChainId)), inputs, [output]);
125
+ // Create unsigned transaction with all potential signers in address map
126
+ const addressMap = new flarejs_1.utils.AddressMap();
127
+ this.transaction._fromAddresses.forEach((addr, i) => {
128
+ addressMap.set(new flarejs_1.Address(addr), i);
129
+ });
130
+ const addressMaps = new flarejs_1.utils.AddressMaps([addressMap]);
131
+ const unsignedTx = new flarejs_1.UnsignedTx(importTx, [], // Empty UTXOs array, will be filled during processing
132
+ addressMaps, credentials);
133
+ this.transaction.setTransaction(unsignedTx);
134
+ }
135
+ /**
136
+ * Create inputs from UTXOs
137
+ * @return {
138
+ * inputs: TransferableInput[];
139
+ * credentials: Credential[];
140
+ * amount: bigint;
141
+ * }
142
+ */
143
+ createInputs() {
144
+ const sender = this.transaction._fromAddresses.slice();
145
+ if (this.recoverSigner) {
146
+ // switch first and last signer
147
+ const tmp = sender.pop();
148
+ sender.push(sender[0]);
149
+ if (tmp) {
150
+ sender[0] = tmp;
151
+ }
152
+ }
153
+ let totalAmount = BigInt(0);
154
+ const inputs = [];
155
+ const credentials = [];
156
+ this.transaction._utxos.forEach((utxo) => {
157
+ const amount = BigInt(utxo.amount);
158
+ totalAmount += amount;
159
+ // Create signature indices for threshold
160
+ const sigIndices = [];
161
+ for (let i = 0; i < this.transaction._threshold; i++) {
162
+ sigIndices.push(i);
163
+ }
164
+ // Use fromNative to create TransferableInput (same pattern as ImportInPTxBuilder)
165
+ // fromNative expects cb58-encoded strings for txId and assetId
166
+ const txIdCb58 = utxo.txid; // Already cb58 encoded
167
+ const assetIdCb58 = utils_1.default.cb58Encode(Buffer.from(this.transaction._assetId, 'hex'));
168
+ const transferableInput = flarejs_1.TransferableInput.fromNative(txIdCb58, Number(utxo.outputidx), assetIdCb58, amount, sigIndices);
169
+ inputs.push(transferableInput);
170
+ // Create empty credential for each input with threshold signers
171
+ const emptySignatures = sigIndices.map(() => utils_1.default.createNewSig(''));
172
+ const credential = new flarejs_1.Credential(emptySignatures);
173
+ credentials.push(credential);
174
+ });
175
+ return {
176
+ inputs,
177
+ credentials,
178
+ amount: totalAmount,
179
+ };
180
+ }
181
+ /**
182
+ * Calculate the fee size for the transaction
183
+ * For C-chain imports, the feeRate is treated as an absolute fee value
184
+ */
185
+ calculateFeeSize(tx) {
186
+ // If tx is provided, calculate based on actual transaction size
187
+ if (tx) {
188
+ const codec = flarejs_1.avmSerial.getAVMManager().getDefaultCodec();
189
+ return tx.toBytes(codec).length;
190
+ }
191
+ // For C-chain imports, treat feeRate as the absolute fee (multiplier of 1)
192
+ return 1;
193
+ }
194
+ /**
195
+ * Recover UTXOs from imported inputs
196
+ * @param importedInputs Array of transferable inputs
197
+ * @returns Array of decoded UTXO objects
198
+ */
199
+ recoverUtxos(importedInputs) {
200
+ return importedInputs.map((input) => {
201
+ const txid = input.utxoID.toString();
202
+ const outputidx = input.utxoID.outputIdx.toString();
203
+ return {
204
+ outputID: iface_1.SECP256K1_Transfer_Output,
205
+ amount: input.amount().toString(),
206
+ txid: utils_1.default.cb58Encode(Buffer.from(txid, 'hex')),
207
+ outputidx: outputidx,
208
+ threshold: this.transaction._threshold,
209
+ addresses: this.transaction._fromAddresses.map((addr) => utils_1.default.addressToString(this.transaction._network.hrp, this.transaction._network.alias, Buffer.from(addr))),
210
+ };
211
+ });
212
+ }
213
+ }
214
+ exports.ImportInCTxBuilder = ImportInCTxBuilder;
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1wb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9JbXBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsbURBQTRGO0FBQzVGLCtFQUE0RTtBQUM1RSxtREFXK0I7QUFDL0Isb0RBQTRCO0FBQzVCLG1DQUE4RjtBQUU5RixNQUFhLGtCQUFtQixTQUFRLHlEQUEyQjtJQUNqRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEVBQUUsQ0FBQyxRQUFnQjtRQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDLGVBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQU0sRUFBRSxRQUFpQixFQUFFLGlCQUFnQztRQUNyRSxNQUFNLE1BQU0sR0FBRyxFQUF3QixDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSx1QkFBWSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCw0RUFBNEU7UUFDNUUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM1QixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENB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LElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3RELGVBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ3pHO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBdlFELGdEQXVRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgTm90U3VwcG9ydGVkLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBBdG9taWNJbkNUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2F0b21pY0luQ1RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQge1xuICBldm1TZXJpYWwsXG4gIFVuc2lnbmVkVHgsXG4gIENyZWRlbnRpYWwsXG4gIEJpZ0ludFByLFxuICBJbnQsXG4gIElkLFxuICBUcmFuc2ZlcmFibGVJbnB1dCxcbiAgQWRkcmVzcyxcbiAgdXRpbHMgYXMgRmxhcmVVdGlscyxcbiAgYXZtU2VyaWFsLFxufSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgRGVjb2RlZFV0eG9PYmosIEZsYXJlVHJhbnNhY3Rpb25UeXBlLCBTRUNQMjU2SzFfVHJhbnNmZXJfT3V0cHV0LCBUeCB9IGZyb20gJy4vaWZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSW1wb3J0SW5DVHhCdWlsZGVyIGV4dGVuZHMgQXRvbWljSW5DVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEMtY2hhaW4gYWRkcmVzcyB3aG8gaXMgdGFyZ2V0IG9mIHRoZSBpbXBvcnQuXG4gICAqIEFkZHJlc3MgZm9ybWF0IGlzIGV0aCBsaWtlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjQWRkcmVzc1xuICAgKi9cbiAgdG8oY0FkZHJlc3M6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3RvID0gW3V0aWxzLnBhcnNlQWRkcmVzcyhjQWRkcmVzcyldO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkltcG9ydDtcbiAgfVxuXG4gIGluaXRCdWlsZGVyKHR4OiBUeCwgcmF3Qnl0ZXM/OiBCdWZmZXIsIHBhcnNlZENyZWRlbnRpYWxzPzogQ3JlZGVudGlhbFtdKTogdGhpcyB7XG4gICAgY29uc3QgYmFzZVR4ID0gdHggYXMgZXZtU2VyaWFsLkltcG9ydFR4O1xuICAgIGlmICghdGhpcy52ZXJpZnlUeFR5cGUoYmFzZVR4Ll90eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnVHJhbnNhY3Rpb24gY2Fubm90IGJlIHBhcnNlZCBvciBoYXMgYW4gdW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZScpO1xuICAgIH1cblxuICAgIC8vIFRoZSBvdXRwdXRzIGlzIGEgc2luZ2xlIEMtQ2hhaW4gYWRkcmVzcyByZXN1bHQuXG4gICAgLy8gSXQncyBleHBlY3RlZCB0byBoYXZlIG9ubHkgb25lIG91dHB1dCB0byB0aGUgZGVzdGluYXRpb24gQy1DaGFpbiBhZGRyZXNzLlxuICAgIGNvbnN0IG91dHB1dHMgPSBiYXNlVHguT3V0cztcbiAgICBpZiAob3V0cHV0cy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIGNhbiBoYXZlIG9uZSBvdXRwdXQnKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1swXTtcblxuICAgIGlmIChCdWZmZXIuZnJvbShvdXRwdXQuYXNzZXRJZC50b0J5dGVzKCkpLnRvU3RyaW5nKCdoZXgnKSAhPT0gdGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3NldElEIGFyZSBub3QgZXF1YWxzJyk7XG4gICAgfVxuICAgIHRoaXMudHJhbnNhY3Rpb24uX3RvID0gW0J1ZmZlci5mcm9tKG91dHB1dC5hZGRyZXNzLnRvQnl0ZXMoKSldO1xuXG4gICAgY29uc3QgaW5wdXRzID0gYmFzZVR4LmltcG9ydGVkSW5wdXRzO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zID0gdGhpcy5yZWNvdmVyVXR4b3MoaW5wdXRzKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBpbnB1dCBhbmQgb3V0cHV0IGFtb3VudHNcbiAgICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gaW5wdXRzLnJlZHVjZSgodCwgaSkgPT4gdCArIGkuYW1vdW50KCksIEJpZ0ludCgwKSk7XG4gICAgY29uc3QgdG90YWxPdXRwdXRBbW91bnQgPSBvdXRwdXQuYW1vdW50LnZhbHVlKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgZmVlIGJhc2VkIG9uIGlucHV0L291dHB1dCBkaWZmZXJlbmNlXG4gICAgY29uc3QgZmVlID0gdG90YWxJbnB1dEFtb3VudCAtIHRvdGFsT3V0cHV0QW1vdW50O1xuICAgIGNvbnN0IGZlZVNpemUgPSB0aGlzLmNhbGN1bGF0ZUZlZVNpemUoYmFzZVR4KTtcbiAgICAvLyBVc2UgaW50ZWdlciBkaXZpc2lvbiB0byBlbnN1cmUgZmVlUmF0ZSBjYW4gYmUgY29udmVydGVkIGJhY2sgdG8gQmlnSW50XG4gICAgY29uc3QgZmVlUmF0ZSA9IE1hdGguZmxvb3IoTnVtYmVyKGZlZSkgLyBmZWVTaXplKTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb24uX2ZlZSA9IHtcbiAgICAgIGZlZTogZmVlLnRvU3RyaW5nKCksXG4gICAgICBmZWVSYXRlOiBmZWVSYXRlLFxuICAgICAgc2l6ZTogZmVlU2l6ZSxcbiAgICB9O1xuXG4gICAgLy8gVXNlIGNyZWRlbnRpYWxzIHBhc3NlZCBmcm9tIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgKHByb3Blcmx5IGV4dHJhY3RlZCB1c2luZyBjb2RlYylcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHBhcnNlZENyZWRlbnRpYWxzIHx8IFtdO1xuICAgIGNvbnN0IGhhc0NyZWRlbnRpYWxzID0gY3JlZGVudGlhbHMubGVuZ3RoID4gMDtcblxuICAgIC8vIElmIGl0J3MgYSBzaWduZWQgdHJhbnNhY3Rpb24sIHN0b3JlIHRoZSBvcmlnaW5hbCByYXcgYnl0ZXMgdG8gcHJlc2VydmUgZXhhY3QgZm9ybWF0XG4gICAgaWYgKGhhc0NyZWRlbnRpYWxzICYmIHJhd0J5dGVzKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9yYXdTaWduZWRCeXRlcyA9IHJhd0J5dGVzO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgdGhyZXNob2xkIGZyb20gZmlyc3QgaW5wdXQncyBzaWdJbmRpY2llcyAobnVtYmVyIG9mIHJlcXVpcmVkIHNpZ25hdHVyZXMpXG4gICAgY29uc3QgZmlyc3RJbnB1dCA9IGlucHV0c1swXTtcbiAgICBjb25zdCBpbnB1dFRocmVzaG9sZCA9IGZpcnN0SW5wdXQuc2lnSW5kaWNpZXMoKS5sZW5ndGggfHwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCA9IGlucHV0VGhyZXNob2xkO1xuXG4gICAgLy8gQ3JlYXRlIHByb3BlciBVbnNpZ25lZFR4IHdyYXBwZXIgd2l0aCBjcmVkZW50aWFsc1xuICAgIGNvbnN0IHRvQWRkcmVzcyA9IG5ldyBBZGRyZXNzKG91dHB1dC5hZGRyZXNzLnRvQnl0ZXMoKSk7XG4gICAgY29uc3QgYWRkcmVzc01hcCA9IG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXAoW1t0b0FkZHJlc3MsIDBdXSk7XG4gICAgY29uc3QgYWRkcmVzc01hcHMgPSBuZXcgRmxhcmVVdGlscy5BZGRyZXNzTWFwcyhbYWRkcmVzc01hcF0pO1xuXG4gICAgLy8gV2hlbiBjcmVkZW50aWFscyB3ZXJlIGV4dHJhY3RlZCwgdXNlIHRoZW0gZGlyZWN0bHkgdG8gcHJlc2VydmUgZXhpc3Rpbmcgc2lnbmF0dXJlc1xuICAgIGxldCB0eENyZWRlbnRpYWxzOiBDcmVkZW50aWFsW107XG4gICAgaWYgKGNyZWRlbnRpYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHR4Q3JlZGVudGlhbHMgPSBjcmVkZW50aWFscztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIGVtcHR5IGNyZWRlbnRpYWwgd2l0aCB0aHJlc2hvbGQgbnVtYmVyIG9mIHNpZ25hdHVyZSBzbG90c1xuICAgICAgY29uc3QgZW1wdHlTaWduYXR1cmVzOiBSZXR1cm5UeXBlPHR5cGVvZiB1dGlscy5jcmVhdGVOZXdTaWc+W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRUaHJlc2hvbGQ7IGkrKykge1xuICAgICAgICBlbXB0eVNpZ25hdHVyZXMucHVzaCh1dGlscy5jcmVhdGVOZXdTaWcoJycpKTtcbiAgICAgIH1cbiAgICAgIHR4Q3JlZGVudGlhbHMgPSBbbmV3IENyZWRlbnRpYWwoZW1wdHlTaWduYXR1cmVzKV07XG4gICAgfVxuXG4gICAgY29uc3QgdW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KGJhc2VUeCwgW10sIGFkZHJlc3NNYXBzLCB0eENyZWRlbnRpYWxzKTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24odW5zaWduZWRUeCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgdmVyaWZ5VHhUeXBlKHR4blR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eG5UeXBlID09PSBGbGFyZVRyYW5zYWN0aW9uVHlwZS5Fdm1JbXBvcnRUeDtcbiAgfVxuXG4gIHZlcmlmeVR4VHlwZSh0eG5UeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gSW1wb3J0SW5DVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSh0eG5UeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgaW1wb3J0IGluIEMtY2hhaW4gdHJhbnNhY3Rpb25cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpOiB2b2lkIHtcbiAgICAvLyBpZiB0eCBoYXMgY3JlZGVudGlhbHMgb3Igd2FzIGFscmVhZHkgcmVjb3ZlcmVkIGZyb20gcmF3LCB0eCBzaG91bGRuJ3QgY2hhbmdlXG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uaGFzQ3JlZGVudGlhbHMpIHJldHVybjtcbiAgICAvLyBJZiBmZWUgaXMgYWxyZWFkeSBjYWxjdWxhdGVkIChmcm9tIGluaXRCdWlsZGVyKSwgdGhlIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgYnVpbHRcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLl90by5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndG8gaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlUmF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmZWUgcmF0ZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaW5wdXRzLCBhbW91bnQsIGNyZWRlbnRpYWxzIH0gPSB0aGlzLmNyZWF0ZUlucHV0cygpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGZlZVxuICAgIGNvbnN0IGZlZVJhdGUgPSBCaWdJbnQodGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZVJhdGUpO1xuICAgIGNvbnN0IGZlZVNpemUgPSB0aGlzLmNhbGN1bGF0ZUZlZVNpemUoKTtcbiAgICBjb25zdCBmZWUgPSBmZWVSYXRlICogQmlnSW50KGZlZVNpemUpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgPSBmZWUudG9TdHJpbmcoKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuc2l6ZSA9IGZlZVNpemU7XG5cbiAgICAvLyBDcmVhdGUgRVZNIG91dHB1dCB1c2luZyBwcm9wZXIgRmxhcmVKUyBjbGFzc1xuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBldm1TZXJpYWwuT3V0cHV0KFxuICAgICAgbmV3IEFkZHJlc3ModGhpcy50cmFuc2FjdGlvbi5fdG9bMF0pLFxuICAgICAgbmV3IEJpZ0ludFByKGFtb3VudCAtIGZlZSksXG4gICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZCwgJ2hleCcpKSlcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBpbXBvcnQgdHJhbnNhY3Rpb25cbiAgICBjb25zdCBpbXBvcnRUeCA9IG5ldyBldm1TZXJpYWwuSW1wb3J0VHgoXG4gICAgICBuZXcgSW50KHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmtJRCksXG4gICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odGhpcy50cmFuc2FjdGlvbi5fYmxvY2tjaGFpbklELCAnaGV4JykpKSxcbiAgICAgIG5ldyBJZChuZXcgVWludDhBcnJheSh0aGlzLl9leHRlcm5hbENoYWluSWQpKSxcbiAgICAgIGlucHV0cyxcbiAgICAgIFtvdXRwdXRdXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSB1bnNpZ25lZCB0cmFuc2FjdGlvbiB3aXRoIGFsbCBwb3RlbnRpYWwgc2lnbmVycyBpbiBhZGRyZXNzIG1hcFxuICAgIGNvbnN0IGFkZHJlc3NNYXAgPSBuZXcgRmxhcmVVdGlscy5BZGRyZXNzTWFwKCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5mb3JFYWNoKChhZGRyLCBpKSA9PiB7XG4gICAgICBhZGRyZXNzTWFwLnNldChuZXcgQWRkcmVzcyhhZGRyKSwgaSk7XG4gICAgfSk7XG4gICAgY29uc3QgYWRkcmVzc01hcHMgPSBuZXcgRmxhcmVVdGlscy5BZGRyZXNzTWFwcyhbYWRkcmVzc01hcF0pO1xuXG4gICAgY29uc3QgdW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KFxuICAgICAgaW1wb3J0VHgsXG4gICAgICBbXSwgLy8gRW1wdHkgVVRYT3MgYXJyYXksIHdpbGwgYmUgZmlsbGVkIGR1cmluZyBwcm9jZXNzaW5nXG4gICAgICBhZGRyZXNzTWFwcyxcbiAgICAgIGNyZWRlbnRpYWxzXG4gICAgKTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24odW5zaWduZWRUeCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGlucHV0cyBmcm9tIFVUWE9zXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICAgaW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdO1xuICAgKiAgICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgICogICAgIGFtb3VudDogYmlnaW50O1xuICAgKiB9XG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlSW5wdXRzKCk6IHtcbiAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgICBhbW91bnQ6IGJpZ2ludDtcbiAgfSB7XG4gICAgY29uc3Qgc2VuZGVyID0gdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5zbGljZSgpO1xuICAgIGlmICh0aGlzLnJlY292ZXJTaWduZXIpIHtcbiAgICAgIC8vIHN3aXRjaCBmaXJzdCBhbmQgbGFzdCBzaWduZXJcbiAgICAgIGNvbnN0IHRtcCA9IHNlbmRlci5wb3AoKTtcbiAgICAgIHNlbmRlci5wdXNoKHNlbmRlclswXSk7XG4gICAgICBpZiAodG1wKSB7XG4gICAgICAgIHNlbmRlclswXSA9IHRtcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdG90YWxBbW91bnQgPSBCaWdJbnQoMCk7XG4gICAgY29uc3QgaW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdID0gW107XG4gICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXSA9IFtdO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdXR4b3MuZm9yRWFjaCgodXR4bykgPT4ge1xuICAgICAgY29uc3QgYW1vdW50ID0gQmlnSW50KHV0eG8uYW1vdW50KTtcbiAgICAgIHRvdGFsQW1vdW50ICs9IGFtb3VudDtcblxuICAgICAgLy8gQ3JlYXRlIHNpZ25hdHVyZSBpbmRpY2VzIGZvciB0aHJlc2hvbGRcbiAgICAgIGNvbnN0IHNpZ0luZGljZXM6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZDsgaSsrKSB7XG4gICAgICAgIHNpZ0luZGljZXMucHVzaChpKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIGZyb21OYXRpdmUgdG8gY3JlYXRlIFRyYW5zZmVyYWJsZUlucHV0IChzYW1lIHBhdHRlcm4gYXMgSW1wb3J0SW5QVHhCdWlsZGVyKVxuICAgICAgLy8gZnJvbU5hdGl2ZSBleHBlY3RzIGNiNTgtZW5jb2RlZCBzdHJpbmdzIGZvciB0eElkIGFuZCBhc3NldElkXG4gICAgICBjb25zdCB0eElkQ2I1OCA9IHV0eG8udHhpZDsgLy8gQWxyZWFkeSBjYjU4IGVuY29kZWRcbiAgICAgIGNvbnN0IGFzc2V0SWRDYjU4ID0gdXRpbHMuY2I1OEVuY29kZShCdWZmZXIuZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl9hc3NldElkLCAnaGV4JykpO1xuXG4gICAgICBjb25zdCB0cmFuc2ZlcmFibGVJbnB1dCA9IFRyYW5zZmVyYWJsZUlucHV0LmZyb21OYXRpdmUoXG4gICAgICAgIHR4SWRDYjU4LFxuICAgICAgICBOdW1iZXIodXR4by5vdXRwdXRpZHgpLFxuICAgICAgICBhc3NldElkQ2I1OCxcbiAgICAgICAgYW1vdW50LFxuICAgICAgICBzaWdJbmRpY2VzXG4gICAgICApO1xuXG4gICAgICBpbnB1dHMucHVzaCh0cmFuc2ZlcmFibGVJbnB1dCk7XG5cbiAgICAgIC8vIENyZWF0ZSBlbXB0eSBjcmVkZW50aWFsIGZvciBlYWNoIGlucHV0IHdpdGggdGhyZXNob2xkIHNpZ25lcnNcbiAgICAgIGNvbnN0IGVtcHR5U2lnbmF0dXJlcyA9IHNpZ0luZGljZXMubWFwKCgpID0+IHV0aWxzLmNyZWF0ZU5ld1NpZygnJykpO1xuICAgICAgY29uc3QgY3JlZGVudGlhbCA9IG5ldyBDcmVkZW50aWFsKGVtcHR5U2lnbmF0dXJlcyk7XG4gICAgICBjcmVkZW50aWFscy5wdXNoKGNyZWRlbnRpYWwpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0cyxcbiAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgYW1vdW50OiB0b3RhbEFtb3VudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgZmVlIHNpemUgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBGb3IgQy1jaGFpbiBpbXBvcnRzLCB0aGUgZmVlUmF0ZSBpcyB0cmVhdGVkIGFzIGFuIGFic29sdXRlIGZlZSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVGZWVTaXplKHR4PzogZXZtU2VyaWFsLkltcG9ydFR4KTogbnVtYmVyIHtcbiAgICAvLyBJZiB0eCBpcyBwcm92aWRlZCwgY2FsY3VsYXRlIGJhc2VkIG9uIGFjdHVhbCB0cmFuc2FjdGlvbiBzaXplXG4gICAgaWYgKHR4KSB7XG4gICAgICBjb25zdCBjb2RlYyA9IGF2bVNlcmlhbC5nZXRBVk1NYW5hZ2VyKCkuZ2V0RGVmYXVsdENvZGVjKCk7XG4gICAgICByZXR1cm4gdHgudG9CeXRlcyhjb2RlYykubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIEZvciBDLWNoYWluIGltcG9ydHMsIHRyZWF0IGZlZVJhdGUgYXMgdGhlIGFic29sdXRlIGZlZSAobXVsdGlwbGllciBvZiAxKVxuICAgIHJldHVybiAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY292ZXIgVVRYT3MgZnJvbSBpbXBvcnRlZCBpbnB1dHNcbiAgICogQHBhcmFtIGltcG9ydGVkSW5wdXRzIEFycmF5IG9mIHRyYW5zZmVyYWJsZSBpbnB1dHNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgZGVjb2RlZCBVVFhPIG9iamVjdHNcbiAgICovXG4gIHByaXZhdGUgcmVjb3ZlclV0eG9zKGltcG9ydGVkSW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdKTogRGVjb2RlZFV0eG9PYmpbXSB7XG4gICAgcmV0dXJuIGltcG9ydGVkSW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHR4aWQgPSBpbnB1dC51dHhvSUQudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IG91dHB1dGlkeCA9IGlucHV0LnV0eG9JRC5vdXRwdXRJZHgudG9TdHJpbmcoKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3V0cHV0SUQ6IFNFQ1AyNTZLMV9UcmFuc2Zlcl9PdXRwdXQsXG4gICAgICAgIGFtb3VudDogaW5wdXQuYW1vdW50KCkudG9TdHJpbmcoKSxcbiAgICAgICAgdHhpZDogdXRpbHMuY2I1OEVuY29kZShCdWZmZXIuZnJvbSh0eGlkLCAnaGV4JykpLFxuICAgICAgICBvdXRwdXRpZHg6IG91dHB1dGlkeCxcbiAgICAgICAgdGhyZXNob2xkOiB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQsXG4gICAgICAgIGFkZHJlc3NlczogdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+XG4gICAgICAgICAgdXRpbHMuYWRkcmVzc1RvU3RyaW5nKHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsuaHJwLCB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLmFsaWFzLCBCdWZmZXIuZnJvbShhZGRyKSlcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,33 @@
1
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
2
+ import { TransactionType } from '@bitgo-beta/sdk-core';
3
+ import { AtomicTransactionBuilder } from './atomicTransactionBuilder';
4
+ import { TransferableInput, Credential } from '@flarenetwork/flarejs';
5
+ import { Tx } from './iface';
6
+ export declare class ImportInPTxBuilder extends AtomicTransactionBuilder {
7
+ constructor(_coinConfig: Readonly<CoinConfig>);
8
+ protected get transactionType(): TransactionType;
9
+ initBuilder(tx: Tx, rawBytes?: Buffer, parsedCredentials?: Credential[]): this;
10
+ static verifyTxType(txnType: string): boolean;
11
+ verifyTxType(txnType: string): boolean;
12
+ /**
13
+ * Build the import transaction for P-chain
14
+ * @protected
15
+ */
16
+ protected buildFlareTransaction(): void;
17
+ /**
18
+ * Create inputs from UTXOs for P-chain import
19
+ * @returns inputs, credentials, and total amount
20
+ */
21
+ protected createImportInputs(): {
22
+ inputs: TransferableInput[];
23
+ credentials: Credential[];
24
+ totalAmount: bigint;
25
+ };
26
+ /**
27
+ * Recover UTXOs from imported inputs
28
+ * @param importedInputs Array of transferable inputs
29
+ * @returns Array of decoded UTXO objects
30
+ */
31
+ private recoverUtxos;
32
+ }
33
+ //# sourceMappingURL=ImportInPTxBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImportInPTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/ImportInPTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAuC,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAML,iBAAiB,EAQjB,UAAU,EAEX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAmE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE9F,qBAAa,kBAAmB,SAAQ,wBAAwB;gBAClD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAY7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI;IAqE9E,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7C,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItC;;;OAGG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAsDvC;;;OAGG;IACH,SAAS,CAAC,kBAAkB,IAAI;QAC9B,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,WAAW,EAAE,UAAU,EAAE,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;KACrB;IAoDD;;;;OAIG;IACH,OAAO,CAAC,YAAY;CAiBrB"}
@@ -0,0 +1,180 @@
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.ImportInPTxBuilder = void 0;
7
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const atomicTransactionBuilder_1 = require("./atomicTransactionBuilder");
9
+ const flarejs_1 = require("@flarenetwork/flarejs");
10
+ const utils_1 = __importDefault(require("./utils"));
11
+ const iface_1 = require("./iface");
12
+ class ImportInPTxBuilder extends atomicTransactionBuilder_1.AtomicTransactionBuilder {
13
+ constructor(_coinConfig) {
14
+ super(_coinConfig);
15
+ // For Import INTO P-chain:
16
+ // - external chain (source) is C-chain
17
+ // - blockchain ID (destination) is P-chain
18
+ this._externalChainId = utils_1.default.cb58Decode(this.transaction._network.cChainBlockchainID);
19
+ // P-chain blockchain ID (from network config - typically all zeros for primary network)
20
+ this.transaction._blockchainID = Buffer.from(utils_1.default.cb58Decode(this.transaction._network.blockchainID)).toString('hex');
21
+ }
22
+ get transactionType() {
23
+ return sdk_core_1.TransactionType.Import;
24
+ }
25
+ initBuilder(tx, rawBytes, parsedCredentials) {
26
+ const importTx = tx;
27
+ if (!this.verifyTxType(importTx._type)) {
28
+ throw new sdk_core_1.NotSupported('Transaction cannot be parsed or has an unsupported transaction type');
29
+ }
30
+ // The regular change output is the tx output in Import tx.
31
+ // It's expected to have only one output with the addresses of the sender.
32
+ const outputs = importTx.baseTx.outputs;
33
+ if (outputs.length !== 1) {
34
+ throw new sdk_core_1.BuildTransactionError('Transaction can have one external output');
35
+ }
36
+ const output = outputs[0];
37
+ const assetId = output.assetId.toBytes();
38
+ if (Buffer.compare(assetId, Buffer.from(this.transaction._assetId, 'hex')) !== 0) {
39
+ throw new Error('The Asset ID of the output does not match the transaction');
40
+ }
41
+ const transferOutput = output.output;
42
+ const outputOwners = transferOutput.outputOwners;
43
+ // Set locktime from output
44
+ this.transaction._locktime = outputOwners.locktime.value();
45
+ // Set threshold from output
46
+ this.transaction._threshold = outputOwners.threshold.value();
47
+ // Convert output addresses to buffers and set as fromAddresses
48
+ this.transaction._fromAddresses = outputOwners.addrs.map((addr) => Buffer.from(addr.toBytes()));
49
+ // Set external chain ID from the source chain
50
+ this._externalChainId = Buffer.from(importTx.sourceChain.toBytes());
51
+ // Recover UTXOs from imported inputs
52
+ this.transaction._utxos = this.recoverUtxos(importTx.ins);
53
+ // Calculate and set fee from input/output difference
54
+ const totalInputAmount = importTx.ins.reduce((sum, input) => sum + input.amount(), BigInt(0));
55
+ const outputAmount = transferOutput.amount();
56
+ const fee = totalInputAmount - outputAmount;
57
+ this.transaction._fee.fee = fee.toString();
58
+ // Use credentials passed from TransactionBuilderFactory (properly extracted using codec)
59
+ const credentials = parsedCredentials || [];
60
+ const hasCredentials = credentials.length > 0;
61
+ // If there are credentials, store the original bytes to preserve exact format
62
+ if (rawBytes && hasCredentials) {
63
+ this.transaction._rawSignedBytes = rawBytes;
64
+ }
65
+ // Create proper UnsignedTx wrapper with credentials
66
+ const sortedAddresses = [...this.transaction._fromAddresses].sort((a, b) => Buffer.compare(a, b));
67
+ const addressMaps = sortedAddresses.map((a, i) => new flarejs_1.utils.AddressMap([[new flarejs_1.Address(a), i]]));
68
+ // When credentials were extracted, use them directly to preserve existing signatures
69
+ const txCredentials = credentials.length > 0
70
+ ? credentials
71
+ : [new flarejs_1.Credential(sortedAddresses.slice(0, this.transaction._threshold).map(() => utils_1.default.createNewSig('')))];
72
+ const unsignedTx = new flarejs_1.UnsignedTx(importTx, [], new flarejs_1.utils.AddressMaps(addressMaps), txCredentials);
73
+ this.transaction.setTransaction(unsignedTx);
74
+ return this;
75
+ }
76
+ static verifyTxType(txnType) {
77
+ return txnType === iface_1.FlareTransactionType.PvmImportTx;
78
+ }
79
+ verifyTxType(txnType) {
80
+ return ImportInPTxBuilder.verifyTxType(txnType);
81
+ }
82
+ /**
83
+ * Build the import transaction for P-chain
84
+ * @protected
85
+ */
86
+ buildFlareTransaction() {
87
+ // if tx has credentials, tx shouldn't change
88
+ if (this.transaction.hasCredentials)
89
+ return;
90
+ const { inputs, credentials, totalAmount } = this.createImportInputs();
91
+ // Calculate fee from transaction fee settings
92
+ const fee = BigInt(this.transaction.fee.fee);
93
+ const outputAmount = totalAmount - fee;
94
+ // Create the output for P-chain (TransferableOutput with TransferOutput)
95
+ const assetIdBytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
96
+ // Create OutputOwners with the P-chain addresses (sorted by byte value as per AVAX protocol)
97
+ const sortedAddresses = [...this.transaction._fromAddresses].sort((a, b) => Buffer.compare(a, b));
98
+ const outputOwners = new flarejs_1.OutputOwners(new flarejs_1.BigIntPr(this.transaction._locktime), new flarejs_1.Int(this.transaction._threshold), sortedAddresses.map((addr) => new flarejs_1.Address(addr)));
99
+ const transferOutput = new flarejs_1.TransferOutput(new flarejs_1.BigIntPr(outputAmount), outputOwners);
100
+ const output = new flarejs_1.TransferableOutput(new flarejs_1.Id(assetIdBytes), transferOutput);
101
+ // Create the BaseTx for the P-chain import transaction
102
+ const baseTx = new flarejs_1.avaxSerial.BaseTx(new flarejs_1.Int(this.transaction._networkID), new flarejs_1.Id(Buffer.from(this.transaction._blockchainID, 'hex')), [output], // outputs
103
+ [], // inputs (empty for import - inputs come from importedInputs)
104
+ new flarejs_1.Bytes(new Uint8Array(0)) // empty memo
105
+ );
106
+ // Create the P-chain import transaction using pvmSerial.ImportTx
107
+ const importTx = new flarejs_1.pvmSerial.ImportTx(baseTx, new flarejs_1.Id(this._externalChainId), // sourceChain (C-chain)
108
+ inputs // importedInputs (ins)
109
+ );
110
+ // Create address maps for signing
111
+ const addressMaps = this.transaction._fromAddresses.map((a, i) => new flarejs_1.utils.AddressMap([[new flarejs_1.Address(a), i]]));
112
+ // Create unsigned transaction
113
+ const unsignedTx = new flarejs_1.UnsignedTx(importTx, [], // Empty UTXOs array
114
+ new flarejs_1.utils.AddressMaps(addressMaps), credentials);
115
+ this.transaction.setTransaction(unsignedTx);
116
+ }
117
+ /**
118
+ * Create inputs from UTXOs for P-chain import
119
+ * @returns inputs, credentials, and total amount
120
+ */
121
+ createImportInputs() {
122
+ const sender = this.transaction._fromAddresses.slice();
123
+ if (this.recoverSigner) {
124
+ // switch first and last signer
125
+ const tmp = sender.pop();
126
+ sender.push(sender[0]);
127
+ if (tmp) {
128
+ sender[0] = tmp;
129
+ }
130
+ }
131
+ let totalAmount = BigInt(0);
132
+ const inputs = [];
133
+ const credentials = [];
134
+ this.transaction._utxos.forEach((utxo) => {
135
+ const amount = BigInt(utxo.amount);
136
+ totalAmount += amount;
137
+ // Create signature indices for threshold
138
+ const sigIndices = [];
139
+ for (let i = 0; i < this.transaction._threshold; i++) {
140
+ sigIndices.push(i);
141
+ }
142
+ // Use fromNative to create TransferableInput
143
+ // fromNative expects cb58-encoded strings for txId and assetId
144
+ const txIdCb58 = utxo.txid; // Already cb58 encoded
145
+ const assetIdCb58 = utils_1.default.cb58Encode(Buffer.from(this.transaction._assetId, 'hex'));
146
+ const transferableInput = flarejs_1.TransferableInput.fromNative(txIdCb58, Number(utxo.outputidx), assetIdCb58, amount, sigIndices);
147
+ inputs.push(transferableInput);
148
+ // Create credential with empty signatures for threshold signers
149
+ const emptySignatures = sigIndices.map(() => utils_1.default.createNewSig(''));
150
+ credentials.push(new flarejs_1.Credential(emptySignatures));
151
+ });
152
+ return {
153
+ inputs,
154
+ credentials,
155
+ totalAmount,
156
+ };
157
+ }
158
+ /**
159
+ * Recover UTXOs from imported inputs
160
+ * @param importedInputs Array of transferable inputs
161
+ * @returns Array of decoded UTXO objects
162
+ */
163
+ recoverUtxos(importedInputs) {
164
+ return importedInputs.map((input) => {
165
+ const utxoId = input.utxoID;
166
+ const transferInput = input.input;
167
+ const utxo = {
168
+ outputID: iface_1.SECP256K1_Transfer_Output,
169
+ amount: transferInput.amount().toString(),
170
+ txid: utils_1.default.cb58Encode(Buffer.from(utxoId.txID.toBytes())),
171
+ outputidx: utxoId.outputIdx.value().toString(),
172
+ threshold: this.transaction._threshold,
173
+ addresses: this.transaction._fromAddresses.map((addr) => utils_1.default.addressToString(this.transaction._network.hrp, this.transaction._network.alias, Buffer.from(addr))),
174
+ };
175
+ return utxo;
176
+ });
177
+ }
178
+ }
179
+ exports.ImportInPTxBuilder = ImportInPTxBuilder;
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1wb3J0SW5QVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9JbXBvcnRJblBUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsbURBQTRGO0FBQzVGLHlFQUFzRTtBQUN0RSxtREFnQitCO0FBQy9CLG9EQUE0QjtBQUM1QixtQ0FBOEY7QUFFOUYsTUFBYSxrQkFBbUIsU0FBUSxtREFBd0I7SUFDOUQsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkIsMkJBQTJCO1FBQzNCLHVDQUF1QztRQUN2QywyQ0FBMkM7UUFDM0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGVBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN2Rix3RkFBd0Y7UUFDeEYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUM3RyxLQUFLLENBQ04sQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQU0sRUFBRSxRQUFpQixFQUFFLGlCQUFnQztRQUNyRSxNQUFNLFFBQVEsR0FBRyxFQUF3QixDQUFDO1FBRTFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSx1QkFBWSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUVELDJEQUEyRDtRQUMzRCwwRUFBMEU7UUFDMUUsTUFBTSxPQUFPLEdBQUcsUUFBUSxD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RCxlQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN6RzthQUNGLENBQUM7WUFDRixPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBMU9ELGdEQTBPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgTm90U3VwcG9ydGVkLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBBdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2F0b21pY1RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQge1xuICBwdm1TZXJpYWwsXG4gIGF2YXhTZXJpYWwsXG4gIFVuc2lnbmVkVHgsXG4gIEludCxcbiAgSWQsXG4gIFRyYW5zZmVyYWJsZUlucHV0LFxuICBUcmFuc2ZlcmFibGVPdXRwdXQsXG4gIFRyYW5zZmVyT3V0cHV0LFxuICBUcmFuc2ZlcklucHV0LFxuICBPdXRwdXRPd25lcnMsXG4gIHV0aWxzIGFzIEZsYXJlVXRpbHMsXG4gIEFkZHJlc3MsXG4gIEJpZ0ludFByLFxuICBDcmVkZW50aWFsLFxuICBCeXRlcyxcbn0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IERlY29kZWRVdHhvT2JqLCBGbGFyZVRyYW5zYWN0aW9uVHlwZSwgU0VDUDI1NksxX1RyYW5zZmVyX091dHB1dCwgVHggfSBmcm9tICcuL2lmYWNlJztcblxuZXhwb3J0IGNsYXNzIEltcG9ydEluUFR4QnVpbGRlciBleHRlbmRzIEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICAvLyBGb3IgSW1wb3J0IElOVE8gUC1jaGFpbjpcbiAgICAvLyAtIGV4dGVybmFsIGNoYWluIChzb3VyY2UpIGlzIEMtY2hhaW5cbiAgICAvLyAtIGJsb2NrY2hhaW4gSUQgKGRlc3RpbmF0aW9uKSBpcyBQLWNoYWluXG4gICAgdGhpcy5fZXh0ZXJuYWxDaGFpbklkID0gdXRpbHMuY2I1OERlY29kZSh0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRCk7XG4gICAgLy8gUC1jaGFpbiBibG9ja2NoYWluIElEIChmcm9tIG5ldHdvcmsgY29uZmlnIC0gdHlwaWNhbGx5IGFsbCB6ZXJvcyBmb3IgcHJpbWFyeSBuZXR3b3JrKVxuICAgIHRoaXMudHJhbnNhY3Rpb24uX2Jsb2NrY2hhaW5JRCA9IEJ1ZmZlci5mcm9tKHV0aWxzLmNiNThEZWNvZGUodGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5ibG9ja2NoYWluSUQpKS50b1N0cmluZyhcbiAgICAgICdoZXgnXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ7XG4gIH1cblxuICBpbml0QnVpbGRlcih0eDogVHgsIHJhd0J5dGVzPzogQnVmZmVyLCBwYXJzZWRDcmVkZW50aWFscz86IENyZWRlbnRpYWxbXSk6IHRoaXMge1xuICAgIGNvbnN0IGltcG9ydFR4ID0gdHggYXMgcHZtU2VyaWFsLkltcG9ydFR4O1xuXG4gICAgaWYgKCF0aGlzLnZlcmlmeVR4VHlwZShpbXBvcnRUeC5fdHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ1RyYW5zYWN0aW9uIGNhbm5vdCBiZSBwYXJzZWQgb3IgaGFzIGFuIHVuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHR5cGUnKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVndWxhciBjaGFuZ2Ugb3V0cHV0IGlzIHRoZSB0eCBvdXRwdXQgaW4gSW1wb3J0IHR4LlxuICAgIC8vIEl0J3MgZXhwZWN0ZWQgdG8gaGF2ZSBvbmx5IG9uZSBvdXRwdXQgd2l0aCB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzZW5kZXIuXG4gICAgY29uc3Qgb3V0cHV0cyA9IGltcG9ydFR4LmJhc2VUeC5vdXRwdXRzO1xuICAgIGlmIChvdXRwdXRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gY2FuIGhhdmUgb25lIGV4dGVybmFsIG91dHB1dCcpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dCA9IG91dHB1dHNbMF07XG4gICAgY29uc3QgYXNzZXRJZCA9IG91dHB1dC5hc3NldElkLnRvQnl0ZXMoKTtcbiAgICBpZiAoQnVmZmVyLmNvbXBhcmUoYXNzZXRJZCwgQnVmZmVyLmZyb20odGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZCwgJ2hleCcpKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQXNzZXQgSUQgb2YgdGhlIG91dHB1dCBkb2VzIG5vdCBtYXRjaCB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2Zlck91dHB1dCA9IG91dHB1dC5vdXRwdXQgYXMgVHJhbnNmZXJPdXRwdXQ7XG4gICAgY29uc3Qgb3V0cHV0T3duZXJzID0gdHJhbnNmZXJPdXRwdXQub3V0cHV0T3duZXJzO1xuXG4gICAgLy8gU2V0IGxvY2t0aW1lIGZyb20gb3V0cHV0XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fbG9ja3RpbWUgPSBvdXRwdXRPd25lcnMubG9ja3RpbWUudmFsdWUoKTtcblxuICAgIC8vIFNldCB0aHJlc2hvbGQgZnJvbSBvdXRwdXRcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQgPSBvdXRwdXRPd25lcnMudGhyZXNob2xkLnZhbHVlKCk7XG5cbiAgICAvLyBDb252ZXJ0IG91dHB1dCBhZGRyZXNzZXMgdG8gYnVmZmVycyBhbmQgc2V0IGFzIGZyb21BZGRyZXNzZXNcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzID0gb3V0cHV0T3duZXJzLmFkZHJzLm1hcCgoYWRkcikgPT4gQnVmZmVyLmZyb20oYWRkci50b0J5dGVzKCkpKTtcblxuICAgIC8vIFNldCBleHRlcm5hbCBjaGFpbiBJRCBmcm9tIHRoZSBzb3VyY2UgY2hhaW5cbiAgICB0aGlzLl9leHRlcm5hbENoYWluSWQgPSBCdWZmZXIuZnJvbShpbXBvcnRUeC5zb3VyY2VDaGFpbi50b0J5dGVzKCkpO1xuXG4gICAgLy8gUmVjb3ZlciBVVFhPcyBmcm9tIGltcG9ydGVkIGlucHV0c1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zID0gdGhpcy5yZWNvdmVyVXR4b3MoaW1wb3J0VHguaW5zKTtcblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgc2V0IGZlZSBmcm9tIGlucHV0L291dHB1dCBkaWZmZXJlbmNlXG4gICAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IGltcG9ydFR4Lmlucy5yZWR1Y2UoKHN1bSwgaW5wdXQpID0+IHN1bSArIGlucHV0LmFtb3VudCgpLCBCaWdJbnQoMCkpO1xuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IHRyYW5zZmVyT3V0cHV0LmFtb3VudCgpO1xuICAgIGNvbnN0IGZlZSA9IHRvdGFsSW5wdXRBbW91bnQgLSBvdXRwdXRBbW91bnQ7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSA9IGZlZS50b1N0cmluZygpO1xuXG4gICAgLy8gVXNlIGNyZWRlbnRpYWxzIHBhc3NlZCBmcm9tIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgKHByb3Blcmx5IGV4dHJhY3RlZCB1c2luZyBjb2RlYylcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHBhcnNlZENyZWRlbnRpYWxzIHx8IFtdO1xuICAgIGNvbnN0IGhhc0NyZWRlbnRpYWxzID0gY3JlZGVudGlhbHMubGVuZ3RoID4gMDtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBjcmVkZW50aWFscywgc3RvcmUgdGhlIG9yaWdpbmFsIGJ5dGVzIHRvIHByZXNlcnZlIGV4YWN0IGZvcm1hdFxuICAgIGlmIChyYXdCeXRlcyAmJiBoYXNDcmVkZW50aWFscykge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fcmF3U2lnbmVkQnl0ZXMgPSByYXdCeXRlcztcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcHJvcGVyIFVuc2lnbmVkVHggd3JhcHBlciB3aXRoIGNyZWRlbnRpYWxzXG4gICAgY29uc3Qgc29ydGVkQWRkcmVzc2VzID0gWy4uLnRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXNdLnNvcnQoKGEsIGIpID0+IEJ1ZmZlci5jb21wYXJlKGEsIGIpKTtcbiAgICBjb25zdCBhZGRyZXNzTWFwcyA9IHNvcnRlZEFkZHJlc3Nlcy5tYXAoKGEsIGkpID0+IG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXAoW1tuZXcgQWRkcmVzcyhhKSwgaV1dKSk7XG5cbiAgICAvLyBXaGVuIGNyZWRlbnRpYWxzIHdlcmUgZXh0cmFjdGVkLCB1c2UgdGhlbSBkaXJlY3RseSB0byBwcmVzZXJ2ZSBleGlzdGluZyBzaWduYXR1cmVzXG4gICAgY29uc3QgdHhDcmVkZW50aWFscyA9XG4gICAgICBjcmVkZW50aWFscy5sZW5ndGggPiAwXG4gICAgICAgID8gY3JlZGVudGlhbHNcbiAgICAgICAgOiBbbmV3IENyZWRlbnRpYWwoc29ydGVkQWRkcmVzc2VzLnNsaWNlKDAsIHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCkubWFwKCgpID0+IHV0aWxzLmNyZWF0ZU5ld1NpZygnJykpKV07XG5cbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gbmV3IFVuc2lnbmVkVHgoaW1wb3J0VHgsIFtdLCBuZXcgRmxhcmVVdGlscy5BZGRyZXNzTWFwcyhhZGRyZXNzTWFwcyksIHR4Q3JlZGVudGlhbHMpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbih1bnNpZ25lZFR4KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0YXRpYyB2ZXJpZnlUeFR5cGUodHhuVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR4blR5cGUgPT09IEZsYXJlVHJhbnNhY3Rpb25UeXBlLlB2bUltcG9ydFR4O1xuICB9XG5cbiAgdmVyaWZ5VHhUeXBlKHR4blR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBJbXBvcnRJblBUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHR4blR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBpbXBvcnQgdHJhbnNhY3Rpb24gZm9yIFAtY2hhaW5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpOiB2b2lkIHtcbiAgICAvLyBpZiB0eCBoYXMgY3JlZGVudGlhbHMsIHR4IHNob3VsZG4ndCBjaGFuZ2VcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5oYXNDcmVkZW50aWFscykgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBpbnB1dHMsIGNyZWRlbnRpYWxzLCB0b3RhbEFtb3VudCB9ID0gdGhpcy5jcmVhdGVJbXBvcnRJbnB1dHMoKTtcblxuICAgIC8vIENhbGN1bGF0ZSBmZWUgZnJvbSB0cmFuc2FjdGlvbiBmZWUgc2V0dGluZ3NcbiAgICBjb25zdCBmZWUgPSBCaWdJbnQodGhpcy50cmFuc2FjdGlvbi5mZWUuZmVlKTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSB0b3RhbEFtb3VudCAtIGZlZTtcblxuICAgIC8vIENyZWF0ZSB0aGUgb3V0cHV0IGZvciBQLWNoYWluIChUcmFuc2ZlcmFibGVPdXRwdXQgd2l0aCBUcmFuc2Zlck91dHB1dClcbiAgICBjb25zdCBhc3NldElkQnl0ZXMgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl9hc3NldElkLCAnaGV4JykpO1xuXG4gICAgLy8gQ3JlYXRlIE91dHB1dE93bmVycyB3aXRoIHRoZSBQLWNoYWluIGFkZHJlc3NlcyAoc29ydGVkIGJ5IGJ5dGUgdmFsdWUgYXMgcGVyIEFWQVggcHJvdG9jb2wpXG4gICAgY29uc3Qgc29ydGVkQWRkcmVzc2VzID0gWy4uLnRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXNdLnNvcnQoKGEsIGIpID0+IEJ1ZmZlci5jb21wYXJlKGEsIGIpKTtcbiAgICBjb25zdCBvdXRwdXRPd25lcnMgPSBuZXcgT3V0cHV0T3duZXJzKFxuICAgICAgbmV3IEJpZ0ludFByKHRoaXMudHJhbnNhY3Rpb24uX2xvY2t0aW1lKSxcbiAgICAgIG5ldyBJbnQodGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkKSxcbiAgICAgIHNvcnRlZEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IG5ldyBBZGRyZXNzKGFkZHIpKVxuICAgICk7XG5cbiAgICBjb25zdCB0cmFuc2Zlck91dHB1dCA9IG5ldyBUcmFuc2Zlck91dHB1dChuZXcgQmlnSW50UHIob3V0cHV0QW1vdW50KSwgb3V0cHV0T3duZXJzKTtcbiAgICBjb25zdCBvdXRwdXQgPSBuZXcgVHJhbnNmZXJhYmxlT3V0cHV0KG5ldyBJZChhc3NldElkQnl0ZXMpLCB0cmFuc2Zlck91dHB1dCk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIEJhc2VUeCBmb3IgdGhlIFAtY2hhaW4gaW1wb3J0IHRyYW5zYWN0aW9uXG4gICAgY29uc3QgYmFzZVR4ID0gbmV3IGF2YXhTZXJpYWwuQmFzZVR4KFxuICAgICAgbmV3IEludCh0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrSUQpLFxuICAgICAgbmV3IElkKEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Jsb2NrY2hhaW5JRCwgJ2hleCcpKSxcbiAgICAgIFtvdXRwdXRdLCAvLyBvdXRwdXRzXG4gICAgICBbXSwgLy8gaW5wdXRzIChlbXB0eSBmb3IgaW1wb3J0IC0gaW5wdXRzIGNvbWUgZnJvbSBpbXBvcnRlZElucHV0cylcbiAgICAgIG5ldyBCeXRlcyhuZXcgVWludDhBcnJheSgwKSkgLy8gZW1wdHkgbWVtb1xuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIFAtY2hhaW4gaW1wb3J0IHRyYW5zYWN0aW9uIHVzaW5nIHB2bVNlcmlhbC5JbXBvcnRUeFxuICAgIGNvbnN0IGltcG9ydFR4ID0gbmV3IHB2bVNlcmlhbC5JbXBvcnRUeChcbiAgICAgIGJhc2VUeCxcbiAgICAgIG5ldyBJZCh0aGlzLl9leHRlcm5hbENoYWluSWQpLCAvLyBzb3VyY2VDaGFpbiAoQy1jaGFpbilcbiAgICAgIGlucHV0cyAvLyBpbXBvcnRlZElucHV0cyAoaW5zKVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYWRkcmVzcyBtYXBzIGZvciBzaWduaW5nXG4gICAgY29uc3QgYWRkcmVzc01hcHMgPSB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLm1hcCgoYSwgaSkgPT4gbmV3IEZsYXJlVXRpbHMuQWRkcmVzc01hcChbW25ldyBBZGRyZXNzKGEpLCBpXV0pKTtcblxuICAgIC8vIENyZWF0ZSB1bnNpZ25lZCB0cmFuc2FjdGlvblxuICAgIGNvbnN0IHVuc2lnbmVkVHggPSBuZXcgVW5zaWduZWRUeChcbiAgICAgIGltcG9ydFR4LFxuICAgICAgW10sIC8vIEVtcHR5IFVUWE9zIGFycmF5XG4gICAgICBuZXcgRmxhcmVVdGlscy5BZGRyZXNzTWFwcyhhZGRyZXNzTWFwcyksXG4gICAgICBjcmVkZW50aWFsc1xuICAgICk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKHVuc2lnbmVkVHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBpbnB1dHMgZnJvbSBVVFhPcyBmb3IgUC1jaGFpbiBpbXBvcnRcbiAgICogQHJldHVybnMgaW5wdXRzLCBjcmVkZW50aWFscywgYW5kIHRvdGFsIGFtb3VudFxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUltcG9ydElucHV0cygpOiB7XG4gICAgaW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdO1xuICAgIGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW107XG4gICAgdG90YWxBbW91bnQ6IGJpZ2ludDtcbiAgfSB7XG4gICAgY29uc3Qgc2VuZGVyID0gdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5zbGljZSgpO1xuICAgIGlmICh0aGlzLnJlY292ZXJTaWduZXIpIHtcbiAgICAgIC8vIHN3aXRjaCBmaXJzdCBhbmQgbGFzdCBzaWduZXJcbiAgICAgIGNvbnN0IHRtcCA9IHNlbmRlci5wb3AoKTtcbiAgICAgIHNlbmRlci5wdXNoKHNlbmRlclswXSk7XG4gICAgICBpZiAodG1wKSB7XG4gICAgICAgIHNlbmRlclswXSA9IHRtcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdG90YWxBbW91bnQgPSBCaWdJbnQoMCk7XG4gICAgY29uc3QgaW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdID0gW107XG4gICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXSA9IFtdO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdXR4b3MuZm9yRWFjaCgodXR4bzogRGVjb2RlZFV0eG9PYmopID0+IHtcbiAgICAgIGNvbnN0IGFtb3VudCA9IEJpZ0ludCh1dHhvLmFtb3VudCk7XG4gICAgICB0b3RhbEFtb3VudCArPSBhbW91bnQ7XG5cbiAgICAgIC8vIENyZWF0ZSBzaWduYXR1cmUgaW5kaWNlcyBmb3IgdGhyZXNob2xkXG4gICAgICBjb25zdCBzaWdJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQ7IGkrKykge1xuICAgICAgICBzaWdJbmRpY2VzLnB1c2goaSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSBmcm9tTmF0aXZlIHRvIGNyZWF0ZSBUcmFuc2ZlcmFibGVJbnB1dFxuICAgICAgLy8gZnJvbU5hdGl2ZSBleHBlY3RzIGNiNTgtZW5jb2RlZCBzdHJpbmdzIGZvciB0eElkIGFuZCBhc3NldElkXG4gICAgICBjb25zdCB0eElkQ2I1OCA9IHV0eG8udHhpZDsgLy8gQWxyZWFkeSBjYjU4IGVuY29kZWRcbiAgICAgIGNvbnN0IGFzc2V0SWRDYjU4ID0gdXRpbHMuY2I1OEVuY29kZShCdWZmZXIuZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl9hc3NldElkLCAnaGV4JykpO1xuXG4gICAgICBjb25zdCB0cmFuc2ZlcmFibGVJbnB1dCA9IFRyYW5zZmVyYWJsZUlucHV0LmZyb21OYXRpdmUoXG4gICAgICAgIHR4SWRDYjU4LFxuICAgICAgICBOdW1iZXIodXR4by5vdXRwdXRpZHgpLFxuICAgICAgICBhc3NldElkQ2I1OCxcbiAgICAgICAgYW1vdW50LFxuICAgICAgICBzaWdJbmRpY2VzXG4gICAgICApO1xuXG4gICAgICBpbnB1dHMucHVzaCh0cmFuc2ZlcmFibGVJbnB1dCk7XG5cbiAgICAgIC8vIENyZWF0ZSBjcmVkZW50aWFsIHdpdGggZW1wdHkgc2lnbmF0dXJlcyBmb3IgdGhyZXNob2xkIHNpZ25lcnNcbiAgICAgIGNvbnN0IGVtcHR5U2lnbmF0dXJlcyA9IHNpZ0luZGljZXMubWFwKCgpID0+IHV0aWxzLmNyZWF0ZU5ld1NpZygnJykpO1xuICAgICAgY3JlZGVudGlhbHMucHVzaChuZXcgQ3JlZGVudGlhbChlbXB0eVNpZ25hdHVyZXMpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHMsXG4gICAgICBjcmVkZW50aWFscyxcbiAgICAgIHRvdGFsQW1vdW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlciBVVFhPcyBmcm9tIGltcG9ydGVkIGlucHV0c1xuICAgKiBAcGFyYW0gaW1wb3J0ZWRJbnB1dHMgQXJyYXkgb2YgdHJhbnNmZXJhYmxlIGlucHV0c1xuICAgKiBAcmV0dXJucyBBcnJheSBvZiBkZWNvZGVkIFVUWE8gb2JqZWN0c1xuICAgKi9cbiAgcHJpdmF0ZSByZWNvdmVyVXR4b3MoaW1wb3J0ZWRJbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10pOiBEZWNvZGVkVXR4b09ialtdIHtcbiAgICByZXR1cm4gaW1wb3J0ZWRJbnB1dHMubWFwKChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgdXR4b0lkID0gaW5wdXQudXR4b0lEO1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnB1dCA9IGlucHV0LmlucHV0IGFzIFRyYW5zZmVySW5wdXQ7XG4gICAgICBjb25zdCB1dHhvOiBEZWNvZGVkVXR4b09iaiA9IHtcbiAgICAgICAgb3V0cHV0SUQ6IFNFQ1AyNTZLMV9UcmFuc2Zlcl9PdXRwdXQsXG4gICAgICAgIGFtb3VudDogdHJhbnNmZXJJbnB1dC5hbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgICB0eGlkOiB1dGlscy5jYjU4RW5jb2RlKEJ1ZmZlci5mcm9tKHV0eG9JZC50eElELnRvQnl0ZXMoKSkpLFxuICAgICAgICBvdXRwdXRpZHg6IHV0eG9JZC5vdXRwdXRJZHgudmFsdWUoKS50b1N0cmluZygpLFxuICAgICAgICB0aHJlc2hvbGQ6IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCxcbiAgICAgICAgYWRkcmVzc2VzOiB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLm1hcCgoYWRkcikgPT5cbiAgICAgICAgICB1dGlscy5hZGRyZXNzVG9TdHJpbmcodGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5ocnAsIHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsuYWxpYXMsIEJ1ZmZlci5mcm9tKGFkZHIpKVxuICAgICAgICApLFxuICAgICAgfTtcbiAgICAgIHJldHVybiB1dHhvO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -1,26 +1,28 @@
1
1
  import { AtomicTransactionBuilder } from './atomicTransactionBuilder';
2
2
  import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
- /**
4
- * Flare P->C atomic import/export style builder (C-chain context). This adapts the AVAXP logic
5
- * removing direct Avalanche SDK dependencies. Network / chain ids are expected to be provided
6
- * in the transaction._network object by a higher-level factory once Flare network constants
7
- * are finalized. For now we CB58-decode placeholders if present and default to zero buffers.
8
- */
3
+ import { UnsignedTx } from '@flarenetwork/flarejs';
4
+ import { Transaction } from './transaction';
9
5
  export declare abstract class AtomicInCTransactionBuilder extends AtomicTransactionBuilder {
10
- protected fixedFee: bigint;
11
6
  constructor(_coinConfig: Readonly<CoinConfig>);
12
7
  /**
13
- * Set base fee (already scaled to Flare C-chain native decimals). Accept bigint | number | string.
8
+ * C-Chain base fee with decimal places converted from 18 to 9.
9
+ *
10
+ * @param {string | number} baseFee
14
11
  */
15
- feeRate(baseFee: bigint | number | string): this;
12
+ feeRate(baseFee: string | number): this;
13
+ /** @inheritdoc */
14
+ fromImplementation(rawTransaction: string): Transaction;
16
15
  /**
17
- * Recreate builder state from raw tx (hex). Flare C-chain support TBD; for now validate & stash.
16
+ * Check that fee is greater than 0.
17
+ * @param {bigint} fee
18
18
  */
19
- protected fromImplementation(rawTransaction: string): {
20
- _tx?: unknown;
21
- };
22
- private validateFee;
23
- private initializeChainIds;
24
- private setFeeRate;
19
+ validateFee(fee: bigint): void;
20
+ /**
21
+ * Initialize the transaction builder fields using the decoded transaction data
22
+ *
23
+ * @param {UnsignedTx} tx the transaction data
24
+ * @returns itself
25
+ */
26
+ initBuilder(tx: UnsignedTx): this;
25
27
  }
26
28
  //# sourceMappingURL=atomicInCTransactionBuilder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"atomicInCTransactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/atomicInCTransactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAe7D;;;;;GAKG;AACH,8BAAsB,2BAA4B,SAAQ,wBAAwB;IAEhF,SAAS,CAAC,QAAQ,SAAM;gBACZ,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI;IAOhD;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE;IASvE,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,UAAU;CAKnB"}
1
+ {"version":3,"file":"atomicInCTransactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/atomicInCTransactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAa,UAAU,EAA2C,MAAM,uBAAuB,CAAC;AAEvG,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,8BAAsB,2BAA4B,SAAQ,wBAAwB;gBACpE,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAU7C;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOvC,kBAAkB;IAClB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAYvD;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAM9B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI;CASlC"}