utxo-lib 1.1.5 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of utxo-lib might be problematic. Click here for more details.

Files changed (250) hide show
  1. package/index.js +47 -0
  2. package/package.json +6 -80
  3. package/LICENSE +0 -21
  4. package/README.md +0 -59
  5. package/dist/src/address.d.ts +0 -11
  6. package/dist/src/address.d.ts.map +0 -1
  7. package/dist/src/address.js +0 -37
  8. package/dist/src/addressFormat.d.ts +0 -53
  9. package/dist/src/addressFormat.d.ts.map +0 -1
  10. package/dist/src/addressFormat.js +0 -110
  11. package/dist/src/bitgo/Musig2.d.ts +0 -51
  12. package/dist/src/bitgo/Musig2.d.ts.map +0 -1
  13. package/dist/src/bitgo/Musig2.js +0 -175
  14. package/dist/src/bitgo/Unspent.d.ts +0 -95
  15. package/dist/src/bitgo/Unspent.d.ts.map +0 -1
  16. package/dist/src/bitgo/Unspent.js +0 -138
  17. package/dist/src/bitgo/UtxoPsbt.d.ts +0 -132
  18. package/dist/src/bitgo/UtxoPsbt.d.ts.map +0 -1
  19. package/dist/src/bitgo/UtxoPsbt.js +0 -469
  20. package/dist/src/bitgo/UtxoTransaction.d.ts +0 -22
  21. package/dist/src/bitgo/UtxoTransaction.d.ts.map +0 -1
  22. package/dist/src/bitgo/UtxoTransaction.js +0 -97
  23. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts +0 -26
  24. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts.map +0 -1
  25. package/dist/src/bitgo/UtxoTransactionBuilder.js +0 -67
  26. package/dist/src/bitgo/bbc/DashPsbt.d.ts +0 -12
  27. package/dist/src/bitgo/bbc/DashPsbt.d.ts.map +0 -1
  28. package/dist/src/bitgo/bbc/DashPsbt.js +0 -27
  29. package/dist/src/bitgo/bbc/DashTransaction.d.ts +0 -39
  30. package/dist/src/bitgo/bbc/DashTransaction.d.ts.map +0 -1
  31. package/dist/src/bitgo/bbc/DashTransaction.js +0 -109
  32. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts +0 -14
  33. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts.map +0 -1
  34. package/dist/src/bitgo/bbc/DashTransactionBuilder.js +0 -28
  35. package/dist/src/bitgo/bbc/index.d.ts +0 -4
  36. package/dist/src/bitgo/bbc/index.d.ts.map +0 -1
  37. package/dist/src/bitgo/bbc/index.js +0 -16
  38. package/dist/src/bitgo/bitcoincash/address.d.ts +0 -35
  39. package/dist/src/bitgo/bitcoincash/address.d.ts.map +0 -1
  40. package/dist/src/bitgo/bitcoincash/address.js +0 -151
  41. package/dist/src/bitgo/bitcoincash/index.d.ts +0 -2
  42. package/dist/src/bitgo/bitcoincash/index.d.ts.map +0 -1
  43. package/dist/src/bitgo/bitcoincash/index.js +0 -14
  44. package/dist/src/bitgo/dash/DashPsbt.d.ts +0 -12
  45. package/dist/src/bitgo/dash/DashPsbt.d.ts.map +0 -1
  46. package/dist/src/bitgo/dash/DashPsbt.js +0 -27
  47. package/dist/src/bitgo/dash/DashTransaction.d.ts +0 -39
  48. package/dist/src/bitgo/dash/DashTransaction.d.ts.map +0 -1
  49. package/dist/src/bitgo/dash/DashTransaction.js +0 -109
  50. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts +0 -14
  51. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts.map +0 -1
  52. package/dist/src/bitgo/dash/DashTransactionBuilder.js +0 -28
  53. package/dist/src/bitgo/dash/index.d.ts +0 -4
  54. package/dist/src/bitgo/dash/index.d.ts.map +0 -1
  55. package/dist/src/bitgo/dash/index.js +0 -16
  56. package/dist/src/bitgo/index.d.ts +0 -17
  57. package/dist/src/bitgo/index.d.ts.map +0 -1
  58. package/dist/src/bitgo/index.js +0 -30
  59. package/dist/src/bitgo/keyutil.d.ts +0 -17
  60. package/dist/src/bitgo/keyutil.d.ts.map +0 -1
  61. package/dist/src/bitgo/keyutil.js +0 -37
  62. package/dist/src/bitgo/nonStandardHalfSigned.d.ts +0 -7
  63. package/dist/src/bitgo/nonStandardHalfSigned.d.ts.map +0 -1
  64. package/dist/src/bitgo/nonStandardHalfSigned.js +0 -56
  65. package/dist/src/bitgo/outputScripts.d.ts +0 -84
  66. package/dist/src/bitgo/outputScripts.d.ts.map +0 -1
  67. package/dist/src/bitgo/outputScripts.js +0 -297
  68. package/dist/src/bitgo/parseInput.d.ts +0 -92
  69. package/dist/src/bitgo/parseInput.d.ts.map +0 -1
  70. package/dist/src/bitgo/parseInput.js +0 -344
  71. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts +0 -24
  72. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +0 -1
  73. package/dist/src/bitgo/psbt/fromHalfSigned.js +0 -91
  74. package/dist/src/bitgo/psbt/scriptTypes.d.ts +0 -6
  75. package/dist/src/bitgo/psbt/scriptTypes.d.ts.map +0 -1
  76. package/dist/src/bitgo/psbt/scriptTypes.js +0 -23
  77. package/dist/src/bitgo/signature.d.ts +0 -84
  78. package/dist/src/bitgo/signature.d.ts.map +0 -1
  79. package/dist/src/bitgo/signature.js +0 -222
  80. package/dist/src/bitgo/tnumber.d.ts +0 -9
  81. package/dist/src/bitgo/tnumber.d.ts.map +0 -1
  82. package/dist/src/bitgo/tnumber.js +0 -31
  83. package/dist/src/bitgo/transaction.d.ts +0 -29
  84. package/dist/src/bitgo/transaction.d.ts.map +0 -1
  85. package/dist/src/bitgo/transaction.js +0 -231
  86. package/dist/src/bitgo/types.d.ts +0 -5
  87. package/dist/src/bitgo/types.d.ts.map +0 -1
  88. package/dist/src/bitgo/types.js +0 -12
  89. package/dist/src/bitgo/wallet/Psbt.d.ts +0 -47
  90. package/dist/src/bitgo/wallet/Psbt.d.ts.map +0 -1
  91. package/dist/src/bitgo/wallet/Psbt.js +0 -232
  92. package/dist/src/bitgo/wallet/Unspent.d.ts +0 -47
  93. package/dist/src/bitgo/wallet/Unspent.d.ts.map +0 -1
  94. package/dist/src/bitgo/wallet/Unspent.js +0 -154
  95. package/dist/src/bitgo/wallet/WalletKeys.d.ts +0 -72
  96. package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +0 -1
  97. package/dist/src/bitgo/wallet/WalletKeys.js +0 -104
  98. package/dist/src/bitgo/wallet/WalletOutput.d.ts +0 -18
  99. package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +0 -1
  100. package/dist/src/bitgo/wallet/WalletOutput.js +0 -69
  101. package/dist/src/bitgo/wallet/WalletScripts.d.ts +0 -7
  102. package/dist/src/bitgo/wallet/WalletScripts.d.ts.map +0 -1
  103. package/dist/src/bitgo/wallet/WalletScripts.js +0 -15
  104. package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts +0 -19
  105. package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts.map +0 -1
  106. package/dist/src/bitgo/wallet/WalletUnspentSigner.js +0 -47
  107. package/dist/src/bitgo/wallet/chains.d.ts +0 -57
  108. package/dist/src/bitgo/wallet/chains.d.ts.map +0 -1
  109. package/dist/src/bitgo/wallet/chains.js +0 -106
  110. package/dist/src/bitgo/wallet/index.d.ts +0 -8
  111. package/dist/src/bitgo/wallet/index.d.ts.map +0 -1
  112. package/dist/src/bitgo/wallet/index.js +0 -20
  113. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts +0 -26
  114. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts.map +0 -1
  115. package/dist/src/bitgo/zcash/ZcashBufferutils.js +0 -157
  116. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +0 -36
  117. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +0 -1
  118. package/dist/src/bitgo/zcash/ZcashPsbt.js +0 -146
  119. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +0 -61
  120. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +0 -1
  121. package/dist/src/bitgo/zcash/ZcashTransaction.js +0 -341
  122. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts +0 -21
  123. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts.map +0 -1
  124. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +0 -105
  125. package/dist/src/bitgo/zcash/address.d.ts +0 -8
  126. package/dist/src/bitgo/zcash/address.d.ts.map +0 -1
  127. package/dist/src/bitgo/zcash/address.js +0 -57
  128. package/dist/src/bitgo/zcash/hashZip0244.d.ts +0 -27
  129. package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +0 -1
  130. package/dist/src/bitgo/zcash/hashZip0244.js +0 -184
  131. package/dist/src/bitgo/zcash/index.d.ts +0 -4
  132. package/dist/src/bitgo/zcash/index.d.ts.map +0 -1
  133. package/dist/src/bitgo/zcash/index.js +0 -16
  134. package/dist/src/classify.d.ts +0 -19
  135. package/dist/src/classify.d.ts.map +0 -1
  136. package/dist/src/classify.js +0 -89
  137. package/dist/src/index.d.ts +0 -13
  138. package/dist/src/index.d.ts.map +0 -1
  139. package/dist/src/index.js +0 -36
  140. package/dist/src/networks.d.ts +0 -115
  141. package/dist/src/networks.d.ts.map +0 -1
  142. package/dist/src/networks.js +0 -458
  143. package/dist/src/noble_ecc.d.ts +0 -28
  144. package/dist/src/noble_ecc.d.ts.map +0 -1
  145. package/dist/src/noble_ecc.js +0 -168
  146. package/dist/src/payments/index.d.ts +0 -4
  147. package/dist/src/payments/index.d.ts.map +0 -1
  148. package/dist/src/payments/index.js +0 -8
  149. package/dist/src/payments/p2tr.d.ts +0 -3
  150. package/dist/src/payments/p2tr.d.ts.map +0 -1
  151. package/dist/src/payments/p2tr.js +0 -348
  152. package/dist/src/payments/p2tr_ns.d.ts +0 -3
  153. package/dist/src/payments/p2tr_ns.d.ts.map +0 -1
  154. package/dist/src/payments/p2tr_ns.js +0 -134
  155. package/dist/src/taproot.d.ts +0 -141
  156. package/dist/src/taproot.d.ts.map +0 -1
  157. package/dist/src/taproot.js +0 -384
  158. package/dist/src/templates/multisig/index.d.ts +0 -4
  159. package/dist/src/templates/multisig/index.d.ts.map +0 -1
  160. package/dist/src/templates/multisig/index.js +0 -8
  161. package/dist/src/templates/multisig/input.d.ts +0 -7
  162. package/dist/src/templates/multisig/input.d.ts.map +0 -1
  163. package/dist/src/templates/multisig/input.js +0 -25
  164. package/dist/src/templates/multisig/output.d.ts +0 -7
  165. package/dist/src/templates/multisig/output.d.ts.map +0 -1
  166. package/dist/src/templates/multisig/output.js +0 -38
  167. package/dist/src/templates/nulldata.d.ts +0 -10
  168. package/dist/src/templates/nulldata.d.ts.map +0 -1
  169. package/dist/src/templates/nulldata.js +0 -17
  170. package/dist/src/templates/pubkey/index.d.ts +0 -4
  171. package/dist/src/templates/pubkey/index.d.ts.map +0 -1
  172. package/dist/src/templates/pubkey/index.js +0 -8
  173. package/dist/src/templates/pubkey/input.d.ts +0 -7
  174. package/dist/src/templates/pubkey/input.d.ts.map +0 -1
  175. package/dist/src/templates/pubkey/input.js +0 -14
  176. package/dist/src/templates/pubkey/output.d.ts +0 -7
  177. package/dist/src/templates/pubkey/output.d.ts.map +0 -1
  178. package/dist/src/templates/pubkey/output.js +0 -15
  179. package/dist/src/templates/pubkeyhash/index.d.ts +0 -4
  180. package/dist/src/templates/pubkeyhash/index.d.ts.map +0 -1
  181. package/dist/src/templates/pubkeyhash/index.js +0 -8
  182. package/dist/src/templates/pubkeyhash/input.d.ts +0 -7
  183. package/dist/src/templates/pubkeyhash/input.d.ts.map +0 -1
  184. package/dist/src/templates/pubkeyhash/input.js +0 -16
  185. package/dist/src/templates/pubkeyhash/output.d.ts +0 -6
  186. package/dist/src/templates/pubkeyhash/output.d.ts.map +0 -1
  187. package/dist/src/templates/pubkeyhash/output.js +0 -20
  188. package/dist/src/templates/scripthash/index.d.ts +0 -4
  189. package/dist/src/templates/scripthash/index.d.ts.map +0 -1
  190. package/dist/src/templates/scripthash/index.js +0 -8
  191. package/dist/src/templates/scripthash/input.d.ts +0 -6
  192. package/dist/src/templates/scripthash/input.d.ts.map +0 -1
  193. package/dist/src/templates/scripthash/input.js +0 -43
  194. package/dist/src/templates/scripthash/output.d.ts +0 -6
  195. package/dist/src/templates/scripthash/output.d.ts.map +0 -1
  196. package/dist/src/templates/scripthash/output.js +0 -15
  197. package/dist/src/templates/taproot/index.d.ts +0 -4
  198. package/dist/src/templates/taproot/index.d.ts.map +0 -1
  199. package/dist/src/templates/taproot/index.js +0 -8
  200. package/dist/src/templates/taproot/input.d.ts +0 -6
  201. package/dist/src/templates/taproot/input.d.ts.map +0 -1
  202. package/dist/src/templates/taproot/input.js +0 -23
  203. package/dist/src/templates/taproot/output.d.ts +0 -6
  204. package/dist/src/templates/taproot/output.d.ts.map +0 -1
  205. package/dist/src/templates/taproot/output.js +0 -15
  206. package/dist/src/templates/taprootnofn/index.d.ts +0 -4
  207. package/dist/src/templates/taprootnofn/index.d.ts.map +0 -1
  208. package/dist/src/templates/taprootnofn/index.js +0 -8
  209. package/dist/src/templates/taprootnofn/input.d.ts +0 -7
  210. package/dist/src/templates/taprootnofn/input.d.ts.map +0 -1
  211. package/dist/src/templates/taprootnofn/input.js +0 -24
  212. package/dist/src/templates/taprootnofn/output.d.ts +0 -7
  213. package/dist/src/templates/taprootnofn/output.d.ts.map +0 -1
  214. package/dist/src/templates/taprootnofn/output.js +0 -28
  215. package/dist/src/templates/witnesscommitment/index.d.ts +0 -3
  216. package/dist/src/templates/witnesscommitment/index.d.ts.map +0 -1
  217. package/dist/src/templates/witnesscommitment/index.js +0 -6
  218. package/dist/src/templates/witnesscommitment/output.d.ts +0 -8
  219. package/dist/src/templates/witnesscommitment/output.d.ts.map +0 -1
  220. package/dist/src/templates/witnesscommitment/output.js +0 -31
  221. package/dist/src/templates/witnesspubkeyhash/index.d.ts +0 -4
  222. package/dist/src/templates/witnesspubkeyhash/index.d.ts.map +0 -1
  223. package/dist/src/templates/witnesspubkeyhash/index.js +0 -8
  224. package/dist/src/templates/witnesspubkeyhash/input.d.ts +0 -7
  225. package/dist/src/templates/witnesspubkeyhash/input.d.ts.map +0 -1
  226. package/dist/src/templates/witnesspubkeyhash/input.js +0 -19
  227. package/dist/src/templates/witnesspubkeyhash/output.d.ts +0 -6
  228. package/dist/src/templates/witnesspubkeyhash/output.d.ts.map +0 -1
  229. package/dist/src/templates/witnesspubkeyhash/output.js +0 -15
  230. package/dist/src/templates/witnessscripthash/index.d.ts +0 -4
  231. package/dist/src/templates/witnessscripthash/index.d.ts.map +0 -1
  232. package/dist/src/templates/witnessscripthash/index.js +0 -8
  233. package/dist/src/templates/witnessscripthash/input.d.ts +0 -6
  234. package/dist/src/templates/witnessscripthash/input.d.ts.map +0 -1
  235. package/dist/src/templates/witnessscripthash/input.js +0 -35
  236. package/dist/src/templates/witnessscripthash/output.d.ts +0 -6
  237. package/dist/src/templates/witnessscripthash/output.d.ts.map +0 -1
  238. package/dist/src/templates/witnessscripthash/output.js +0 -15
  239. package/dist/src/testutil/index.d.ts +0 -3
  240. package/dist/src/testutil/index.d.ts.map +0 -1
  241. package/dist/src/testutil/index.js +0 -15
  242. package/dist/src/testutil/keys.d.ts +0 -10
  243. package/dist/src/testutil/keys.d.ts.map +0 -1
  244. package/dist/src/testutil/keys.js +0 -40
  245. package/dist/src/testutil/mock.d.ts +0 -21
  246. package/dist/src/testutil/mock.d.ts.map +0 -1
  247. package/dist/src/testutil/mock.js +0 -86
  248. package/dist/src/transaction_builder.d.ts +0 -47
  249. package/dist/src/transaction_builder.d.ts.map +0 -1
  250. package/dist/src/transaction_builder.js +0 -1084
@@ -1,146 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ZcashPsbt = void 0;
4
- const UtxoPsbt_1 = require("../UtxoPsbt");
5
- const ZcashTransaction_1 = require("./ZcashTransaction");
6
- const __1 = require("../../");
7
- const bip174_1 = require("bip174");
8
- const types = require("bitcoinjs-lib/src/types");
9
- const typeforce = require('typeforce');
10
- const CONSENSUS_BRANCH_ID_KEY = Buffer.concat([
11
- Buffer.of(0xfc),
12
- Buffer.of(0x05),
13
- Buffer.from(UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER),
14
- Buffer.of(UtxoPsbt_1.ProprietaryKeySubtype.ZEC_CONSENSUS_BRANCH_ID),
15
- ]);
16
- class ZcashPsbt extends UtxoPsbt_1.UtxoPsbt {
17
- static transactionFromBuffer(buffer, network) {
18
- return ZcashTransaction_1.ZcashTransaction.fromBuffer(buffer, false, 'bigint', network);
19
- }
20
- static createPsbt(opts, data) {
21
- return new ZcashPsbt(opts, data || new bip174_1.Psbt(new __1.PsbtTransaction({ tx: new ZcashTransaction_1.ZcashTransaction(opts.network) })));
22
- }
23
- /**
24
- * In version < 5 of Zcash transactions, the consensus branch ID is not serialized in the transaction
25
- * whereas in version 5 it is. If the transaction is less than a version 5, set the consensus branch id
26
- * in the global map in the psbt. If it is a version 5 transaction, throw an error if the consensus
27
- * branch id is set in the psbt (because it should be on the transaction already).
28
- * @param buffer Psbt buffer
29
- * @param opts options
30
- */
31
- static fromBuffer(buffer, opts) {
32
- var _a;
33
- const psbt = super.fromBuffer(buffer, opts);
34
- // Read `consensusBranchId` from the global-map
35
- let consensusBranchId = undefined;
36
- (_a = psbt.data.globalMap.unknownKeyVals) === null || _a === void 0 ? void 0 : _a.forEach(({ key, value }, i) => {
37
- if (key.equals(CONSENSUS_BRANCH_ID_KEY)) {
38
- consensusBranchId = value.readUint32LE();
39
- }
40
- });
41
- switch (psbt.tx.version) {
42
- case 4:
43
- case ZcashTransaction_1.ZcashTransaction.VERSION4_BRANCH_CANOPY:
44
- case ZcashTransaction_1.ZcashTransaction.VERSION4_BRANCH_NU5:
45
- if (!consensusBranchId || !psbt.data.globalMap.unknownKeyVals) {
46
- throw new Error('Could not find consensus branch id on psbt for version 4 Zcash transaction');
47
- }
48
- psbt.tx.consensusBranchId = consensusBranchId;
49
- psbt.data.globalMap.unknownKeyVals = psbt.data.globalMap.unknownKeyVals.filter(({ key }) => key !== CONSENSUS_BRANCH_ID_KEY);
50
- // Delete consensusBranchId from globalMap so that if we were to serialize the psbt again
51
- // we would not add a duplicate key into the global map
52
- psbt.data.globalMap.unknownKeyVals.pop();
53
- return psbt;
54
- case 5:
55
- case ZcashTransaction_1.ZcashTransaction.VERSION5_BRANCH_NU5:
56
- if (consensusBranchId) {
57
- throw new Error('Found consensus branch id in psbt global-map for version 5 Zcash transaction');
58
- }
59
- return psbt;
60
- default:
61
- throw new Error(`Unsupported transaction version ${psbt.tx.version}`);
62
- }
63
- }
64
- /**
65
- * If it is a version 4 transaction, add the consensus branch id to
66
- * the global map. If it is a version 5 transaction, just return the
67
- * buffer because the consensus branch id is already serialized in
68
- * the transaction.
69
- */
70
- toBuffer() {
71
- if (this.tx.version === 5 || this.tx.version === ZcashTransaction_1.ZcashTransaction.VERSION5_BRANCH_NU5) {
72
- return super.toBuffer();
73
- }
74
- const value = Buffer.alloc(4);
75
- value.writeUint32LE(this.tx.consensusBranchId);
76
- this.addUnknownKeyValToGlobal({ key: CONSENSUS_BRANCH_ID_KEY, value });
77
- if (!this.data.globalMap.unknownKeyVals) {
78
- throw new Error('Failed adding consensus branch id to unknownKeyVals');
79
- }
80
- const buff = super.toBuffer();
81
- this.data.globalMap.unknownKeyVals.pop();
82
- return buff;
83
- }
84
- setVersion(version, overwinter = true) {
85
- typeforce(types.UInt32, version);
86
- this.tx.overwintered = overwinter ? 1 : 0;
87
- this.tx.version = version;
88
- return this;
89
- }
90
- setDefaultsForVersion(network, version) {
91
- switch (version) {
92
- case 4:
93
- case ZcashTransaction_1.ZcashTransaction.VERSION4_BRANCH_CANOPY:
94
- case ZcashTransaction_1.ZcashTransaction.VERSION4_BRANCH_NU5:
95
- this.setVersion(4);
96
- break;
97
- case 5:
98
- case ZcashTransaction_1.ZcashTransaction.VERSION5_BRANCH_NU5:
99
- this.setVersion(5);
100
- break;
101
- default:
102
- throw new Error(`invalid version ${version}`);
103
- }
104
- this.tx.versionGroupId = ZcashTransaction_1.getDefaultVersionGroupIdForVersion(version);
105
- this.tx.consensusBranchId = ZcashTransaction_1.getDefaultConsensusBranchIdForVersion(network, version);
106
- }
107
- // For Zcash transactions, we do not have to have non-witness UTXO data for non-segwit
108
- // transactions because zcash hashes the value directly. Thus, it is unnecessary to have
109
- // the previous transaction hash on the unspent.
110
- signInput(inputIndex, keyPair, sighashTypes) {
111
- return this.withUnsafeSignNonSegwitTrue(super.signInput.bind(this, inputIndex, keyPair, sighashTypes));
112
- }
113
- validateSignaturesOfInput(inputIndex, validator, pubkey) {
114
- return this.withUnsafeSignNonSegwitTrue(super.validateSignaturesOfInput.bind(this, inputIndex, validator, pubkey));
115
- }
116
- withUnsafeSignNonSegwitTrue(fn) {
117
- this.__CACHE.__UNSAFE_SIGN_NONSEGWIT = true;
118
- try {
119
- return fn();
120
- }
121
- finally {
122
- this.__CACHE.__UNSAFE_SIGN_NONSEGWIT = false;
123
- }
124
- }
125
- setPropertyCheckSignatures(propName, value) {
126
- if (this.tx[propName] === value) {
127
- return;
128
- }
129
- this.checkForSignatures(propName);
130
- this.tx[propName] = value;
131
- }
132
- setConsensusBranchId(consensusBranchId) {
133
- typeforce(types.UInt32, consensusBranchId);
134
- this.setPropertyCheckSignatures('consensusBranchId', consensusBranchId);
135
- }
136
- setVersionGroupId(versionGroupId) {
137
- typeforce(types.UInt32, versionGroupId);
138
- this.setPropertyCheckSignatures('versionGroupId', versionGroupId);
139
- }
140
- setExpiryHeight(expiryHeight) {
141
- typeforce(types.UInt32, expiryHeight);
142
- this.setPropertyCheckSignatures('expiryHeight', expiryHeight);
143
- }
144
- }
145
- exports.ZcashPsbt = ZcashPsbt;
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmNhc2hQc2J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3pjYXNoL1pjYXNoUHNidC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwwQ0FBcUc7QUFDckcseURBSTRCO0FBQzVCLDhCQUEwRDtBQUMxRCxtQ0FBMEM7QUFDMUMsaURBQWlEO0FBRWpELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV2QyxNQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDNUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDZixNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0NBQTJCLENBQUM7SUFDeEMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxnQ0FBcUIsQ0FBQyx1QkFBdUIsQ0FBQztDQUN6RCxDQUFDLENBQUM7QUFFSCxNQUFhLFNBQVUsU0FBUSxtQkFBa0M7SUFDckQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLE1BQWMsRUFBRSxPQUFnQjtRQUNyRSxPQUFPLG1DQUFnQixDQUFDLFVBQVUsQ0FBUyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFjLEVBQUUsSUFBZTtRQUMvQyxPQUFPLElBQUksU0FBUyxDQUNsQixJQUFJLEVBQ0osSUFBSSxJQUFJLElBQUksYUFBUSxDQUFDLElBQUksbUJBQWUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLG1DQUFnQixDQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDOUYsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFjLEVBQUUsSUFBYzs7UUFDOUMsTUFBTSxJQUFJLEdB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QU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsMEJBQTBCLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7Q0FDRjtBQWxKRCw4QkFrSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsIFBzYnRPcHRzLCBQcm9wcmlldGFyeUtleVN1YnR5cGUsIFV0eG9Qc2J0IH0gZnJvbSAnLi4vVXR4b1BzYnQnO1xuaW1wb3J0IHtcbiAgZ2V0RGVmYXVsdENvbnNlbnN1c0JyYW5jaElkRm9yVmVyc2lvbixcbiAgZ2V0RGVmYXVsdFZlcnNpb25Hcm91cElkRm9yVmVyc2lvbixcbiAgWmNhc2hUcmFuc2FjdGlvbixcbn0gZnJvbSAnLi9aY2FzaFRyYW5zYWN0aW9uJztcbmltcG9ydCB7IE5ldHdvcmssIFBzYnRUcmFuc2FjdGlvbiwgU2lnbmVyIH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB7IFBzYnQgYXMgUHNidEJhc2UgfSBmcm9tICdiaXAxNzQnO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnYml0Y29pbmpzLWxpYi9zcmMvdHlwZXMnO1xuaW1wb3J0IHsgVmFsaWRhdGVTaWdGdW5jdGlvbiB9IGZyb20gJ2JpdGNvaW5qcy1saWIvc3JjL3BzYnQnO1xuY29uc3QgdHlwZWZvcmNlID0gcmVxdWlyZSgndHlwZWZvcmNlJyk7XG5cbmNvbnN0IENPTlNFTlNVU19CUkFOQ0hfSURfS0VZID0gQnVmZmVyLmNvbmNhdChbXG4gIEJ1ZmZlci5vZigweGZjKSxcbiAgQnVmZmVyLm9mKDB4MDUpLFxuICBCdWZmZXIuZnJvbShQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIpLFxuICBCdWZmZXIub2YoUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLlpFQ19DT05TRU5TVVNfQlJBTkNIX0lEKSxcbl0pO1xuXG5leHBvcnQgY2xhc3MgWmNhc2hQc2J0IGV4dGVuZHMgVXR4b1BzYnQ8WmNhc2hUcmFuc2FjdGlvbjxiaWdpbnQ+PiB7XG4gIHByb3RlY3RlZCBzdGF0aWMgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyKGJ1ZmZlcjogQnVmZmVyLCBuZXR3b3JrOiBOZXR3b3JrKTogWmNhc2hUcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgICByZXR1cm4gWmNhc2hUcmFuc2FjdGlvbi5mcm9tQnVmZmVyPGJpZ2ludD4oYnVmZmVyLCBmYWxzZSwgJ2JpZ2ludCcsIG5ldHdvcmspO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVBzYnQob3B0czogUHNidE9wdHMsIGRhdGE/OiBQc2J0QmFzZSk6IFpjYXNoUHNidCB7XG4gICAgcmV0dXJuIG5ldyBaY2FzaFBzYnQoXG4gICAgICBvcHRzLFxuICAgICAgZGF0YSB8fCBuZXcgUHNidEJhc2UobmV3IFBzYnRUcmFuc2FjdGlvbih7IHR4OiBuZXcgWmNhc2hUcmFuc2FjdGlvbjxiaWdpbnQ+KG9wdHMubmV0d29yaykgfSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiB2ZXJzaW9uIDwgNSBvZiBaY2FzaCB0cmFuc2FjdGlvbnMsIHRoZSBjb25zZW5zdXMgYnJhbmNoIElEIGlzIG5vdCBzZXJpYWxpemVkIGluIHRoZSB0cmFuc2FjdGlvblxuICAgKiB3aGVyZWFzIGluIHZlcnNpb24gNSBpdCBpcy4gSWYgdGhlIHRyYW5zYWN0aW9uIGlzIGxlc3MgdGhhbiBhIHZlcnNpb24gNSwgc2V0IHRoZSBjb25zZW5zdXMgYnJhbmNoIGlkXG4gICAqIGluIHRoZSBnbG9iYWwgbWFwIGluIHRoZSBwc2J0LiBJZiBpdCBpcyBhIHZlcnNpb24gNSB0cmFuc2FjdGlvbiwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGNvbnNlbnN1c1xuICAgKiBicmFuY2ggaWQgaXMgc2V0IGluIHRoZSBwc2J0IChiZWNhdXNlIGl0IHNob3VsZCBiZSBvbiB0aGUgdHJhbnNhY3Rpb24gYWxyZWFkeSkuXG4gICAqIEBwYXJhbSBidWZmZXIgUHNidCBidWZmZXJcbiAgICogQHBhcmFtIG9wdHMgb3B0aW9uc1xuICAgKi9cbiAgc3RhdGljIGZyb21CdWZmZXIoYnVmZmVyOiBCdWZmZXIsIG9wdHM6IFBzYnRPcHRzKTogVXR4b1BzYnQ8WmNhc2hUcmFuc2FjdGlvbjxiaWdpbnQ+PiB7XG4gICAgY29uc3QgcHNidCA9IHN1cGVyLmZyb21CdWZmZXIoYnVmZmVyLCBvcHRzKSBhcyBaY2FzaFBzYnQ7XG5cbiAgICAvLyBSZWFkIGBjb25zZW5zdXNCcmFuY2hJZGAgZnJvbSB0aGUgZ2xvYmFsLW1hcFxuICAgIGxldCBjb25zZW5zdXNCcmFuY2hJZDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHBzYnQuZGF0YS5nbG9iYWxNYXAudW5rbm93bktleVZhbHM/LmZvckVhY2goKHsga2V5LCB2YWx1ZSB9LCBpKSA9PiB7XG4gICAgICBpZiAoa2V5LmVxdWFscyhDT05TRU5TVVNfQlJBTkNIX0lEX0tFWSkpIHtcbiAgICAgICAgY29uc2Vuc3VzQnJhbmNoSWQgPSB2YWx1ZS5yZWFkVWludDMyTEUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzd2l0Y2ggKHBzYnQudHgudmVyc2lvbikge1xuICAgICAgY2FzZSA0OlxuICAgICAgY2FzZSBaY2FzaFRyYW5zYWN0aW9uLlZFUlNJT040X0JSQU5DSF9DQU5PUFk6XG4gICAgICBjYXNlIFpjYXNoVHJhbnNhY3Rpb24uVkVSU0lPTjRfQlJBTkNIX05VNTpcbiAgICAgICAgaWYgKCFjb25zZW5zdXNCcmFuY2hJZCB8fCAhcHNidC5kYXRhLmdsb2JhbE1hcC51bmtub3duS2V5VmFscykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgY29uc2Vuc3VzIGJyYW5jaCBpZCBvbiBwc2J0IGZvciB2ZXJzaW9uIDQgWmNhc2ggdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBwc2J0LnR4LmNvbnNlbnN1c0JyYW5jaElkID0gY29uc2Vuc3VzQnJhbmNoSWQ7XG4gICAgICAgIHBzYnQuZGF0YS5nbG9iYWxNYXAudW5rbm93bktleVZhbHMgPSBwc2J0LmRhdGEuZ2xvYmFsTWFwLnVua25vd25LZXlWYWxzLmZpbHRlcihcbiAgICAgICAgICAoeyBrZXkgfSkgPT4ga2V5ICE9PSBDT05TRU5TVVNfQlJBTkNIX0lEX0tFWVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERlbGV0ZSBjb25zZW5zdXNCcmFuY2hJZCBmcm9tIGdsb2JhbE1hcCBzbyB0aGF0IGlmIHdlIHdlcmUgdG8gc2VyaWFsaXplIHRoZSBwc2J0IGFnYWluXG4gICAgICAgIC8vIHdlIHdvdWxkIG5vdCBhZGQgYSBkdXBsaWNhdGUga2V5IGludG8gdGhlIGdsb2JhbCBtYXBcbiAgICAgICAgcHNidC5kYXRhLmdsb2JhbE1hcC51bmtub3duS2V5VmFscy5wb3AoKTtcbiAgICAgICAgcmV0dXJuIHBzYnQ7XG4gICAgICBjYXNlIDU6XG4gICAgICBjYXNlIFpjYXNoVHJhbnNhY3Rpb24uVkVSU0lPTjVfQlJBTkNIX05VNTpcbiAgICAgICAgaWYgKGNvbnNlbnN1c0JyYW5jaElkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBjb25zZW5zdXMgYnJhbmNoIGlkIGluIHBzYnQgZ2xvYmFsLW1hcCBmb3IgdmVyc2lvbiA1IFpjYXNoIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBzYnQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHZlcnNpb24gJHtwc2J0LnR4LnZlcnNpb259YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIGl0IGlzIGEgdmVyc2lvbiA0IHRyYW5zYWN0aW9uLCBhZGQgdGhlIGNvbnNlbnN1cyBicmFuY2ggaWQgdG9cbiAgICogdGhlIGdsb2JhbCBtYXAuIElmIGl0IGlzIGEgdmVyc2lvbiA1IHRyYW5zYWN0aW9uLCBqdXN0IHJldHVybiB0aGVcbiAgICogYnVmZmVyIGJlY2F1c2UgdGhlIGNvbnNlbnN1cyBicmFuY2ggaWQgaXMgYWxyZWFkeSBzZXJpYWxpemVkIGluXG4gICAqIHRoZSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIHRvQnVmZmVyKCk6IEJ1ZmZlciB7XG4gICAgaWYgKHRoaXMudHgudmVyc2lvbiA9PT0gNSB8fCB0aGlzLnR4LnZlcnNpb24gPT09IFpjYXNoVHJhbnNhY3Rpb24uVkVSU0lPTjVfQlJBTkNIX05VNSkge1xuICAgICAgcmV0dXJuIHN1cGVyLnRvQnVmZmVyKCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIHZhbHVlLndyaXRlVWludDMyTEUodGhpcy50eC5jb25zZW5zdXNCcmFuY2hJZCk7XG4gICAgdGhpcy5hZGRVbmtub3duS2V5VmFsVG9HbG9iYWwoeyBrZXk6IENPTlNFTlNVU19CUkFOQ0hfSURfS0VZLCB2YWx1ZSB9KTtcbiAgICBpZiAoIXRoaXMuZGF0YS5nbG9iYWxNYXAudW5rbm93bktleVZhbHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIGFkZGluZyBjb25zZW5zdXMgYnJhbmNoIGlkIHRvIHVua25vd25LZXlWYWxzJyk7XG4gICAgfVxuICAgIGNvbnN0IGJ1ZmYgPSBzdXBlci50b0J1ZmZlcigpO1xuICAgIHRoaXMuZGF0YS5nbG9iYWxNYXAudW5rbm93bktleVZhbHMucG9wKCk7XG4gICAgcmV0dXJuIGJ1ZmY7XG4gIH1cblxuICBzZXRWZXJzaW9uKHZlcnNpb246IG51bWJlciwgb3ZlcndpbnRlciA9IHRydWUpOiB0aGlzIHtcbiAgICB0eXBlZm9yY2UodHlwZXMuVUludDMyLCB2ZXJzaW9uKTtcbiAgICB0aGlzLnR4Lm92ZXJ3aW50ZXJlZCA9IG92ZXJ3aW50ZXIgPyAxIDogMDtcbiAgICB0aGlzLnR4LnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGVmYXVsdHNGb3JWZXJzaW9uKG5ldHdvcms6IE5ldHdvcmssIHZlcnNpb246IG51bWJlcik6IHZvaWQge1xuICAgIHN3aXRjaCAodmVyc2lvbikge1xuICAgICAgY2FzZSA0OlxuICAgICAgY2FzZSBaY2FzaFRyYW5zYWN0aW9uLlZFUlNJT040X0JSQU5DSF9DQU5PUFk6XG4gICAgICBjYXNlIFpjYXNoVHJhbnNhY3Rpb24uVkVSU0lPTjRfQlJBTkNIX05VNTpcbiAgICAgICAgdGhpcy5zZXRWZXJzaW9uKDQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTpcbiAgICAgIGNhc2UgWmNhc2hUcmFuc2FjdGlvbi5WRVJTSU9ONV9CUkFOQ0hfTlU1OlxuICAgICAgICB0aGlzLnNldFZlcnNpb24oNSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHZlcnNpb24gJHt2ZXJzaW9ufWApO1xuICAgIH1cblxuICAgIHRoaXMudHgudmVyc2lvbkdyb3VwSWQgPSBnZXREZWZhdWx0VmVyc2lvbkdyb3VwSWRGb3JWZXJzaW9uKHZlcnNpb24pO1xuICAgIHRoaXMudHguY29uc2Vuc3VzQnJhbmNoSWQgPSBnZXREZWZhdWx0Q29uc2Vuc3VzQnJhbmNoSWRGb3JWZXJzaW9uKG5ldHdvcmssIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gRm9yIFpjYXNoIHRyYW5zYWN0aW9ucywgd2UgZG8gbm90IGhhdmUgdG8gaGF2ZSBub24td2l0bmVzcyBVVFhPIGRhdGEgZm9yIG5vbi1zZWd3aXRcbiAgLy8gdHJhbnNhY3Rpb25zIGJlY2F1c2UgemNhc2ggaGFzaGVzIHRoZSB2YWx1ZSBkaXJlY3RseS4gVGh1cywgaXQgaXMgdW5uZWNlc3NhcnkgdG8gaGF2ZVxuICAvLyB0aGUgcHJldmlvdXMgdHJhbnNhY3Rpb24gaGFzaCBvbiB0aGUgdW5zcGVudC5cbiAgc2lnbklucHV0KGlucHV0SW5kZXg6IG51bWJlciwga2V5UGFpcjogU2lnbmVyLCBzaWdoYXNoVHlwZXM/OiBudW1iZXJbXSk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLndpdGhVbnNhZmVTaWduTm9uU2Vnd2l0VHJ1ZShzdXBlci5zaWduSW5wdXQuYmluZCh0aGlzLCBpbnB1dEluZGV4LCBrZXlQYWlyLCBzaWdoYXNoVHlwZXMpKTtcbiAgfVxuXG4gIHZhbGlkYXRlU2lnbmF0dXJlc09mSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyLCB2YWxpZGF0b3I6IFZhbGlkYXRlU2lnRnVuY3Rpb24sIHB1YmtleT86IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLndpdGhVbnNhZmVTaWduTm9uU2Vnd2l0VHJ1ZShzdXBlci52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0LmJpbmQodGhpcywgaW5wdXRJbmRleCwgdmFsaWRhdG9yLCBwdWJrZXkpKTtcbiAgfVxuXG4gIHByaXZhdGUgd2l0aFVuc2FmZVNpZ25Ob25TZWd3aXRUcnVlPFQ+KGZuOiAoKSA9PiBUKTogVCB7XG4gICAgKHRoaXMgYXMgYW55KS5fX0NBQ0hFLl9fVU5TQUZFX1NJR05fTk9OU0VHV0lUID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICh0aGlzIGFzIGFueSkuX19DQUNIRS5fX1VOU0FGRV9TSUdOX05PTlNFR1dJVCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0UHJvcGVydHlDaGVja1NpZ25hdHVyZXMocHJvcE5hbWU6IGtleW9mIFpjYXNoVHJhbnNhY3Rpb248YmlnaW50PiwgdmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAodGhpcy50eFtwcm9wTmFtZV0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2hlY2tGb3JTaWduYXR1cmVzKHByb3BOYW1lKTtcbiAgICB0aGlzLnR4W3Byb3BOYW1lXSA9IHZhbHVlIGFzIGFueTtcbiAgfVxuXG4gIHNldENvbnNlbnN1c0JyYW5jaElkKGNvbnNlbnN1c0JyYW5jaElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0eXBlZm9yY2UodHlwZXMuVUludDMyLCBjb25zZW5zdXNCcmFuY2hJZCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eUNoZWNrU2lnbmF0dXJlcygnY29uc2Vuc3VzQnJhbmNoSWQnLCBjb25zZW5zdXNCcmFuY2hJZCk7XG4gIH1cblxuICBzZXRWZXJzaW9uR3JvdXBJZCh2ZXJzaW9uR3JvdXBJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdHlwZWZvcmNlKHR5cGVzLlVJbnQzMiwgdmVyc2lvbkdyb3VwSWQpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlDaGVja1NpZ25hdHVyZXMoJ3ZlcnNpb25Hcm91cElkJywgdmVyc2lvbkdyb3VwSWQpO1xuICB9XG5cbiAgc2V0RXhwaXJ5SGVpZ2h0KGV4cGlyeUhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgdHlwZWZvcmNlKHR5cGVzLlVJbnQzMiwgZXhwaXJ5SGVpZ2h0KTtcbiAgICB0aGlzLnNldFByb3BlcnR5Q2hlY2tTaWduYXR1cmVzKCdleHBpcnlIZWlnaHQnLCBleHBpcnlIZWlnaHQpO1xuICB9XG59XG4iXX0=
@@ -1,61 +0,0 @@
1
- /// <reference types="node" />
2
- import { networks } from '../../networks';
3
- import { UtxoTransaction } from '../UtxoTransaction';
4
- export declare type ZcashNetwork = typeof networks.zcash | typeof networks.zcashTest;
5
- export declare class UnsupportedTransactionError extends Error {
6
- constructor(message: string);
7
- }
8
- export declare function getDefaultVersionGroupIdForVersion(version: number): number;
9
- export declare function getDefaultConsensusBranchIdForVersion(network: ZcashNetwork, version: number): number;
10
- export declare class ZcashTransaction<TNumber extends number | bigint = number> extends UtxoTransaction<TNumber> {
11
- network: ZcashNetwork;
12
- static VERSION_JOINSPLITS_SUPPORT: number;
13
- static VERSION_OVERWINTER: number;
14
- static VERSION_SAPLING: number;
15
- static VERSION4_BRANCH_CANOPY: number;
16
- static VERSION4_BRANCH_NU5: number;
17
- static VERSION5_BRANCH_NU5: number;
18
- overwintered: number;
19
- versionGroupId: number;
20
- expiryHeight: number;
21
- consensusBranchId: number;
22
- constructor(network: ZcashNetwork, tx?: ZcashTransaction<bigint | number>, amountType?: 'bigint' | 'number');
23
- static fromBuffer<TNumber extends number | bigint = number>(buffer: Buffer, __noStrict: boolean, amountType?: 'number' | 'bigint', network?: ZcashNetwork): ZcashTransaction<TNumber>;
24
- static fromBufferWithVersion<TNumber extends number | bigint>(buf: Buffer, network: ZcashNetwork, version?: number, amountType?: 'number' | 'bigint'): ZcashTransaction<TNumber>;
25
- byteLength(): number;
26
- isSaplingCompatible(): boolean;
27
- isOverwinterCompatible(): boolean;
28
- supportsJoinSplits(): boolean;
29
- /**
30
- * Build a hash for all or none of the transaction inputs depending on the hashtype
31
- * @param hashType
32
- * @returns Buffer - BLAKE2b hash or 256-bit zero if doesn't apply
33
- */
34
- getPrevoutHash(hashType: number): Buffer;
35
- /**
36
- * Build a hash for all or none of the transactions inputs sequence numbers depending on the hashtype
37
- * @param hashType
38
- * @returns Buffer BLAKE2b hash or 256-bit zero if doesn't apply
39
- */
40
- getSequenceHash(hashType: number): Buffer;
41
- /**
42
- * Build a hash for one, all or none of the transaction outputs depending on the hashtype
43
- * @param hashType
44
- * @param inIndex
45
- * @returns Buffer BLAKE2b hash or 256-bit zero if doesn't apply
46
- */
47
- getOutputsHash(hashType: number, inIndex: number): Buffer;
48
- /**
49
- * Hash transaction for signing a transparent transaction in Zcash. Protected transactions are not supported.
50
- * @param inIndex
51
- * @param prevOutScript
52
- * @param value
53
- * @param hashType
54
- * @returns Buffer BLAKE2b hash
55
- */
56
- hashForSignatureByNetwork(inIndex: number | undefined, prevOutScript: Buffer, value: bigint | number | undefined, hashType: number): Buffer;
57
- toBuffer(buffer?: Buffer, initialOffset?: number): Buffer;
58
- getHash(forWitness?: boolean): Buffer;
59
- clone<TN2 extends number | bigint = TNumber>(amountType?: 'bigint' | 'number'): ZcashTransaction<TN2>;
60
- }
61
- //# sourceMappingURL=ZcashTransaction.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ZcashTransaction.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/zcash/ZcashTransaction.ts"],"names":[],"mappings":";AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAgB,MAAM,oBAAoB,CAAC;AAMnE,oBAAY,YAAY,GAAG,OAAO,QAAQ,CAAC,KAAK,GAAG,OAAO,QAAQ,CAAC,SAAS,CAAC;AAY7E,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM;CAG5B;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAS1E;AAED,wBAAgB,qCAAqC,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAkBpG;AAED,qBAAa,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IAiBnF,OAAO,EAAE,YAAY;IAhBxC,MAAM,CAAC,0BAA0B,SAAK;IACtC,MAAM,CAAC,kBAAkB,SAAK;IAC9B,MAAM,CAAC,eAAe,SAAK;IAE3B,MAAM,CAAC,sBAAsB,SAAO;IACpC,MAAM,CAAC,mBAAmB,SAAO;IACjC,MAAM,CAAC,mBAAmB,SAAO;IAGjC,YAAY,SAAK;IAEjB,cAAc,SAAK;IAEnB,YAAY,SAAK;IACjB,iBAAiB,EAAE,MAAM,CAAC;gBAEP,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,gBAAgB,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ;IAgBlH,MAAM,CAAC,UAAU,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EACxD,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,OAAO,EACnB,UAAU,GAAE,QAAQ,GAAG,QAAmB,EAC1C,OAAO,CAAC,EAAE,YAAY,GACrB,gBAAgB,CAAC,OAAO,CAAC;IAmC5B,MAAM,CAAC,qBAAqB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAC1D,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,GAAE,QAAQ,GAAG,QAAmB,GACzC,gBAAgB,CAAC,OAAO,CAAC;IAQ5B,UAAU,IAAI,MAAM;IA8BpB,mBAAmB,IAAI,OAAO;IAI9B,sBAAsB,IAAI,OAAO;IAIjC,kBAAkB,IAAI,OAAO;IAI7B;;;;OAIG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAcxC;;;;OAIG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAiBzC;;;;;OAKG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IA4BzD;;;;;;;OAOG;IACH,yBAAyB,CACvB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EAClC,QAAQ,EAAE,MAAM,GACf,MAAM;IAsFT,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,SAAI,GAAG,MAAM;IAyBpD,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM;IAUrC,KAAK,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC;CAGtG"}
@@ -1,341 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ZcashTransaction = exports.getDefaultConsensusBranchIdForVersion = exports.getDefaultVersionGroupIdForVersion = exports.UnsupportedTransactionError = void 0;
4
- const bitcoinjs_lib_1 = require("bitcoinjs-lib");
5
- const types = require("bitcoinjs-lib/src/types");
6
- const bufferutils_1 = require("bitcoinjs-lib/src/bufferutils");
7
- const varuint = require('varuint-bitcoin');
8
- const typeforce = require('typeforce');
9
- const UtxoTransaction_1 = require("../UtxoTransaction");
10
- const ZcashBufferutils_1 = require("./ZcashBufferutils");
11
- const hashZip0244_1 = require("./hashZip0244");
12
- const ZERO = Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex');
13
- // https://github.com/zcash/zcash/blob/v4.7.0/src/primitives/transaction.h#L40
14
- const SAPLING_VERSION_GROUP_ID = 0x892f2085;
15
- // https://github.com/zcash/zcash/blob/v4.7.0/src/primitives/transaction.h#L52
16
- const ZIP225_VERSION_GROUP_ID = 0x26a7270a;
17
- // https://github.com/zcash/zcash/blob/v4.7.0/src/consensus/upgrades.cpp#L11
18
- const OVERWINTER_BRANCH_ID = 0x5ba81b19;
19
- const CANOPY_BRANCH_ID = 0xe9ff75a6;
20
- const NU5_BRANCH_ID = 0xc2d6d0b4;
21
- class UnsupportedTransactionError extends Error {
22
- constructor(message) {
23
- super(message);
24
- }
25
- }
26
- exports.UnsupportedTransactionError = UnsupportedTransactionError;
27
- function getDefaultVersionGroupIdForVersion(version) {
28
- switch (version) {
29
- case 400:
30
- case 450:
31
- return SAPLING_VERSION_GROUP_ID;
32
- case 500:
33
- return ZIP225_VERSION_GROUP_ID;
34
- }
35
- throw new Error(`no value for version ${version}`);
36
- }
37
- exports.getDefaultVersionGroupIdForVersion = getDefaultVersionGroupIdForVersion;
38
- function getDefaultConsensusBranchIdForVersion(network, version) {
39
- switch (version) {
40
- case 1:
41
- case 2:
42
- return 0;
43
- case 3:
44
- return OVERWINTER_BRANCH_ID;
45
- case ZcashTransaction.VERSION4_BRANCH_CANOPY:
46
- // https://zips.z.cash/zip-0251
47
- return CANOPY_BRANCH_ID;
48
- case 4:
49
- case 5:
50
- case ZcashTransaction.VERSION4_BRANCH_NU5:
51
- case ZcashTransaction.VERSION5_BRANCH_NU5:
52
- // https://zips.z.cash/zip-0252
53
- return NU5_BRANCH_ID;
54
- }
55
- throw new Error(`no value for version ${version}`);
56
- }
57
- exports.getDefaultConsensusBranchIdForVersion = getDefaultConsensusBranchIdForVersion;
58
- class ZcashTransaction extends UtxoTransaction_1.UtxoTransaction {
59
- constructor(network, tx, amountType) {
60
- super(network, tx, amountType);
61
- this.network = network;
62
- // 1 if the transaction is post overwinter upgrade, 0 otherwise
63
- this.overwintered = 0;
64
- // 0x03C48270 (63210096) for overwinter and 0x892F2085 (2301567109) for sapling
65
- this.versionGroupId = 0;
66
- // Block height after which this transactions will expire, or 0 to disable expiry
67
- this.expiryHeight = 0;
68
- let consensusBranchId;
69
- if (tx) {
70
- this.overwintered = tx.overwintered;
71
- this.versionGroupId = tx.versionGroupId;
72
- this.expiryHeight = tx.expiryHeight;
73
- if (tx.consensusBranchId !== undefined) {
74
- consensusBranchId = tx.consensusBranchId;
75
- }
76
- }
77
- this.consensusBranchId = consensusBranchId !== null && consensusBranchId !== void 0 ? consensusBranchId : getDefaultConsensusBranchIdForVersion(network, this.version);
78
- }
79
- static fromBuffer(buffer, __noStrict, amountType = 'number', network) {
80
- /* istanbul ignore next */
81
- if (!network) {
82
- throw new Error(`must provide network`);
83
- }
84
- const bufferReader = new bufferutils_1.BufferReader(buffer);
85
- const tx = new ZcashTransaction(network);
86
- tx.version = bufferReader.readInt32();
87
- // Split the header into fOverwintered and nVersion
88
- // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L772
89
- tx.overwintered = tx.version >>> 31; // Must be 1 for version 3 and up
90
- tx.version = tx.version & 0x07fffffff; // 3 for overwinter
91
- tx.consensusBranchId = getDefaultConsensusBranchIdForVersion(network, tx.version);
92
- if (tx.isOverwinterCompatible()) {
93
- tx.versionGroupId = bufferReader.readUInt32();
94
- }
95
- if (tx.version === 5) {
96
- ZcashBufferutils_1.fromBufferV5(bufferReader, tx, amountType);
97
- }
98
- else {
99
- ZcashBufferutils_1.fromBufferV4(bufferReader, tx, amountType);
100
- }
101
- if (__noStrict)
102
- return tx;
103
- if (bufferReader.offset !== buffer.length) {
104
- const trailing = buffer.slice(bufferReader.offset);
105
- throw new Error(`Unexpected trailing bytes: ${trailing.toString('hex')}`);
106
- }
107
- return tx;
108
- }
109
- static fromBufferWithVersion(buf, network, version, amountType = 'number') {
110
- const tx = ZcashTransaction.fromBuffer(buf, false, amountType, network);
111
- if (version) {
112
- tx.consensusBranchId = getDefaultConsensusBranchIdForVersion(network, version);
113
- }
114
- return tx;
115
- }
116
- byteLength() {
117
- let byteLength = super.byteLength();
118
- if (this.isOverwinterCompatible()) {
119
- byteLength += 4; // nVersionGroupId
120
- }
121
- if (this.isOverwinterCompatible()) {
122
- byteLength += 4; // nExpiryHeight
123
- }
124
- const emptyVectorLength = varuint.encodingLength(0);
125
- if (this.version === 5) {
126
- // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L822
127
- byteLength += 4; // consensusBranchId
128
- byteLength += emptyVectorLength; // saplingBundle inputs
129
- byteLength += emptyVectorLength; // saplingBundle outputs
130
- byteLength += 1; // orchardBundle (empty)
131
- }
132
- else {
133
- if (this.isSaplingCompatible()) {
134
- // https://github.com/zcash/zcash/blob/v4.5.1/src/primitives/transaction.h#L862
135
- byteLength += 8; // valueBalance (uint64)
136
- byteLength += emptyVectorLength; // inputs
137
- byteLength += emptyVectorLength; // outputs
138
- }
139
- if (this.supportsJoinSplits()) {
140
- //
141
- byteLength += emptyVectorLength; // joinsplits
142
- }
143
- }
144
- return byteLength;
145
- }
146
- isSaplingCompatible() {
147
- return !!this.overwintered && this.version >= ZcashTransaction.VERSION_SAPLING;
148
- }
149
- isOverwinterCompatible() {
150
- return !!this.overwintered && this.version >= ZcashTransaction.VERSION_OVERWINTER;
151
- }
152
- supportsJoinSplits() {
153
- return !!this.overwintered && this.version >= ZcashTransaction.VERSION_JOINSPLITS_SUPPORT;
154
- }
155
- /**
156
- * Build a hash for all or none of the transaction inputs depending on the hashtype
157
- * @param hashType
158
- * @returns Buffer - BLAKE2b hash or 256-bit zero if doesn't apply
159
- */
160
- getPrevoutHash(hashType) {
161
- if (!(hashType & bitcoinjs_lib_1.Transaction.SIGHASH_ANYONECANPAY)) {
162
- const bufferWriter = new bufferutils_1.BufferWriter(Buffer.allocUnsafe(36 * this.ins.length));
163
- this.ins.forEach(function (txIn) {
164
- bufferWriter.writeSlice(txIn.hash);
165
- bufferWriter.writeUInt32(txIn.index);
166
- });
167
- return hashZip0244_1.getBlake2bHash(bufferWriter.buffer, 'ZcashPrevoutHash');
168
- }
169
- return ZERO;
170
- }
171
- /**
172
- * Build a hash for all or none of the transactions inputs sequence numbers depending on the hashtype
173
- * @param hashType
174
- * @returns Buffer BLAKE2b hash or 256-bit zero if doesn't apply
175
- */
176
- getSequenceHash(hashType) {
177
- if (!(hashType & bitcoinjs_lib_1.Transaction.SIGHASH_ANYONECANPAY) &&
178
- (hashType & 0x1f) !== bitcoinjs_lib_1.Transaction.SIGHASH_SINGLE &&
179
- (hashType & 0x1f) !== bitcoinjs_lib_1.Transaction.SIGHASH_NONE) {
180
- const bufferWriter = new bufferutils_1.BufferWriter(Buffer.allocUnsafe(4 * this.ins.length));
181
- this.ins.forEach(function (txIn) {
182
- bufferWriter.writeUInt32(txIn.sequence);
183
- });
184
- return hashZip0244_1.getBlake2bHash(bufferWriter.buffer, 'ZcashSequencHash');
185
- }
186
- return ZERO;
187
- }
188
- /**
189
- * Build a hash for one, all or none of the transaction outputs depending on the hashtype
190
- * @param hashType
191
- * @param inIndex
192
- * @returns Buffer BLAKE2b hash or 256-bit zero if doesn't apply
193
- */
194
- getOutputsHash(hashType, inIndex) {
195
- if ((hashType & 0x1f) !== bitcoinjs_lib_1.Transaction.SIGHASH_SINGLE && (hashType & 0x1f) !== bitcoinjs_lib_1.Transaction.SIGHASH_NONE) {
196
- // Find out the size of the outputs and write them
197
- const txOutsSize = this.outs.reduce(function (sum, output) {
198
- return sum + 8 + UtxoTransaction_1.varSliceSize(output.script);
199
- }, 0);
200
- const bufferWriter = new bufferutils_1.BufferWriter(Buffer.allocUnsafe(txOutsSize));
201
- this.outs.forEach(function (out) {
202
- bufferWriter.writeUInt64(out.value);
203
- bufferWriter.writeVarSlice(out.script);
204
- });
205
- return hashZip0244_1.getBlake2bHash(bufferWriter.buffer, 'ZcashOutputsHash');
206
- }
207
- else if ((hashType & 0x1f) === bitcoinjs_lib_1.Transaction.SIGHASH_SINGLE && inIndex < this.outs.length) {
208
- // Write only the output specified in inIndex
209
- const output = this.outs[inIndex];
210
- const bufferWriter = new bufferutils_1.BufferWriter(Buffer.allocUnsafe(8 + UtxoTransaction_1.varSliceSize(output.script)));
211
- bufferWriter.writeUInt64(output.value);
212
- bufferWriter.writeVarSlice(output.script);
213
- return hashZip0244_1.getBlake2bHash(bufferWriter.buffer, 'ZcashOutputsHash');
214
- }
215
- return ZERO;
216
- }
217
- /**
218
- * Hash transaction for signing a transparent transaction in Zcash. Protected transactions are not supported.
219
- * @param inIndex
220
- * @param prevOutScript
221
- * @param value
222
- * @param hashType
223
- * @returns Buffer BLAKE2b hash
224
- */
225
- hashForSignatureByNetwork(inIndex, prevOutScript, value, hashType) {
226
- if (value === undefined) {
227
- throw new Error(`must provide value`);
228
- }
229
- // https://github.com/zcash/zcash/blob/v4.5.1/src/script/interpreter.cpp#L1175
230
- if (this.version === 5) {
231
- return hashZip0244_1.getSignatureDigest(this, inIndex, prevOutScript, value, hashType);
232
- }
233
- // ZCash amounts are always within Number.MAX_SAFE_INTEGER
234
- value = typeof value === 'bigint' ? Number(value) : value;
235
- typeforce(types.tuple(types.UInt32, types.Buffer, types.Number), [inIndex, prevOutScript, value]);
236
- if (inIndex === undefined) {
237
- throw new Error(`invalid inIndex`);
238
- }
239
- /* istanbul ignore next */
240
- if (inIndex >= this.ins.length) {
241
- throw new Error('Input index is out of range');
242
- }
243
- /* istanbul ignore next */
244
- if (!this.isOverwinterCompatible()) {
245
- throw new Error(`unsupported version ${this.version}`);
246
- }
247
- const hashPrevouts = this.getPrevoutHash(hashType);
248
- const hashSequence = this.getSequenceHash(hashType);
249
- const hashOutputs = this.getOutputsHash(hashType, inIndex);
250
- const hashJoinSplits = ZERO;
251
- const hashShieldedSpends = ZERO;
252
- const hashShieldedOutputs = ZERO;
253
- let baseBufferSize = 0;
254
- baseBufferSize += 4 * 5; // header, nVersionGroupId, lock_time, nExpiryHeight, hashType
255
- baseBufferSize += 32 * 4; // 256 hashes: hashPrevouts, hashSequence, hashOutputs, hashJoinSplits
256
- baseBufferSize += 4 * 2; // input.index, input.sequence
257
- baseBufferSize += 8; // value
258
- baseBufferSize += 32; // input.hash
259
- baseBufferSize += UtxoTransaction_1.varSliceSize(prevOutScript); // prevOutScript
260
- if (this.isSaplingCompatible()) {
261
- baseBufferSize += 32 * 2; // hashShieldedSpends and hashShieldedOutputs
262
- baseBufferSize += 8; // valueBalance
263
- }
264
- const mask = this.overwintered ? 1 : 0;
265
- const header = this.version | (mask << 31);
266
- const bufferWriter = new bufferutils_1.BufferWriter(Buffer.alloc(baseBufferSize));
267
- bufferWriter.writeInt32(header);
268
- bufferWriter.writeUInt32(this.versionGroupId);
269
- bufferWriter.writeSlice(hashPrevouts);
270
- bufferWriter.writeSlice(hashSequence);
271
- bufferWriter.writeSlice(hashOutputs);
272
- bufferWriter.writeSlice(hashJoinSplits);
273
- if (this.isSaplingCompatible()) {
274
- bufferWriter.writeSlice(hashShieldedSpends);
275
- bufferWriter.writeSlice(hashShieldedOutputs);
276
- }
277
- bufferWriter.writeUInt32(this.locktime);
278
- bufferWriter.writeUInt32(this.expiryHeight);
279
- if (this.isSaplingCompatible()) {
280
- bufferWriter.writeSlice(ZcashBufferutils_1.VALUE_INT64_ZERO);
281
- }
282
- bufferWriter.writeInt32(hashType);
283
- // The input being signed (replacing the scriptSig with scriptCode + amount)
284
- // The prevout may already be contained in hashPrevout, and the nSequence
285
- // may already be contained in hashSequence.
286
- const input = this.ins[inIndex];
287
- bufferWriter.writeSlice(input.hash);
288
- bufferWriter.writeUInt32(input.index);
289
- bufferWriter.writeVarSlice(prevOutScript);
290
- bufferWriter.writeUInt64(value);
291
- bufferWriter.writeUInt32(input.sequence);
292
- const personalization = Buffer.alloc(16);
293
- const prefix = 'ZcashSigHash';
294
- personalization.write(prefix);
295
- personalization.writeUInt32LE(this.consensusBranchId, prefix.length);
296
- return hashZip0244_1.getBlake2bHash(bufferWriter.buffer, personalization);
297
- }
298
- toBuffer(buffer, initialOffset = 0) {
299
- if (!buffer)
300
- buffer = Buffer.allocUnsafe(this.byteLength());
301
- const bufferWriter = new bufferutils_1.BufferWriter(buffer, initialOffset);
302
- if (this.isOverwinterCompatible()) {
303
- const mask = this.overwintered ? 1 : 0;
304
- bufferWriter.writeInt32(this.version | (mask << 31)); // Set overwinter bit
305
- bufferWriter.writeUInt32(this.versionGroupId);
306
- }
307
- else {
308
- bufferWriter.writeInt32(this.version);
309
- }
310
- if (this.version === 5) {
311
- ZcashBufferutils_1.toBufferV5(bufferWriter, this);
312
- }
313
- else {
314
- ZcashBufferutils_1.toBufferV4(bufferWriter, this);
315
- }
316
- if (initialOffset !== undefined) {
317
- return buffer.slice(initialOffset, bufferWriter.offset);
318
- }
319
- return buffer;
320
- }
321
- getHash(forWitness) {
322
- if (forWitness) {
323
- throw new Error(`invalid argument`);
324
- }
325
- if (this.version === 5) {
326
- return hashZip0244_1.getTxidDigest(this);
327
- }
328
- return bitcoinjs_lib_1.crypto.hash256(this.toBuffer());
329
- }
330
- clone(amountType) {
331
- return new ZcashTransaction(this.network, this, amountType);
332
- }
333
- }
334
- exports.ZcashTransaction = ZcashTransaction;
335
- ZcashTransaction.VERSION_JOINSPLITS_SUPPORT = 2;
336
- ZcashTransaction.VERSION_OVERWINTER = 3;
337
- ZcashTransaction.VERSION_SAPLING = 4;
338
- ZcashTransaction.VERSION4_BRANCH_CANOPY = 400;
339
- ZcashTransaction.VERSION4_BRANCH_NU5 = 450;
340
- ZcashTransaction.VERSION5_BRANCH_NU5 = 500;
341
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmNhc2hUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby96Y2FzaC9aY2FzaFRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUFvRDtBQUNwRCxpREFBaUQ7QUFDakQsK0RBQTJFO0FBRTNFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzNDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUd2Qyx3REFBbUU7QUFDbkUseURBQTBHO0FBQzFHLCtDQUFrRjtBQUVsRixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBSXBHLDhFQUE4RTtBQUM5RSxNQUFNLHdCQUF3QixHQUFHLFVBQVUsQ0FBQztBQUM1Qyw4RUFBOEU7QUFDOUUsTUFBTSx1QkFBdUIsR0FBRyxVQUFVLENBQUM7QUFFM0MsNEVBQTRFO0FBQzVFLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDO0FBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO0FBQ3BDLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQztBQUVqQyxNQUFhLDJCQUE0QixTQUFRLEtBQUs7SUFDcEQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQixDQUFDO0NBQ0Y7QUFKRCxrRUFJQztBQUVELFNBQWdCLGtDQUFrQyxDQUFDLE9BQWU7SUFDaEUsUUFBUSxPQUFPLEVBQUU7UUFDZixLQUFLLEdBQUcsQ0FBQztRQUNULEtBQUssR0FBRztZQUNOLE9BQU8sd0JBQXdCLENBQUM7UUFDbEMsS0FBSyxHQUFHO1lBQ04sT0FBTyx1QkFBdUIsQ0FBQztLQUNsQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDckQsQ0FB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bUNBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZCLGdDQUFlLEdBQUcsQ0FBQyxDQUFDO0FBRXBCLHVDQUFzQixHQUFHLEdBQUcsQ0FBQztBQUM3QixvQ0FBbUIsR0FBRyxHQUFHLENBQUM7QUFDMUIsb0NBQW1CLEdBQUcsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNhY3Rpb24sIGNyeXB0byB9IGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnYml0Y29pbmpzLWxpYi9zcmMvdHlwZXMnO1xuaW1wb3J0IHsgQnVmZmVyUmVhZGVyLCBCdWZmZXJXcml0ZXIgfSBmcm9tICdiaXRjb2luanMtbGliL3NyYy9idWZmZXJ1dGlscyc7XG5cbmNvbnN0IHZhcnVpbnQgPSByZXF1aXJlKCd2YXJ1aW50LWJpdGNvaW4nKTtcbmNvbnN0IHR5cGVmb3JjZSA9IHJlcXVpcmUoJ3R5cGVmb3JjZScpO1xuXG5pbXBvcnQgeyBuZXR3b3JrcyB9IGZyb20gJy4uLy4uL25ldHdvcmtzJztcbmltcG9ydCB7IFV0eG9UcmFuc2FjdGlvbiwgdmFyU2xpY2VTaXplIH0gZnJvbSAnLi4vVXR4b1RyYW5zYWN0aW9uJztcbmltcG9ydCB7IGZyb21CdWZmZXJWNCwgZnJvbUJ1ZmZlclY1LCB0b0J1ZmZlclY0LCB0b0J1ZmZlclY1LCBWQUxVRV9JTlQ2NF9aRVJPIH0gZnJvbSAnLi9aY2FzaEJ1ZmZlcnV0aWxzJztcbmltcG9ydCB7IGdldEJsYWtlMmJIYXNoLCBnZXRTaWduYXR1cmVEaWdlc3QsIGdldFR4aWREaWdlc3QgfSBmcm9tICcuL2hhc2haaXAwMjQ0JztcblxuY29uc3QgWkVSTyA9IEJ1ZmZlci5mcm9tKCcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJywgJ2hleCcpO1xuXG5leHBvcnQgdHlwZSBaY2FzaE5ldHdvcmsgPSB0eXBlb2YgbmV0d29ya3MuemNhc2ggfCB0eXBlb2YgbmV0d29ya3MuemNhc2hUZXN0O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemNhc2gvemNhc2gvYmxvYi92NC43LjAvc3JjL3ByaW1pdGl2ZXMvdHJhbnNhY3Rpb24uaCNMNDBcbmNvbnN0IFNBUExJTkdfVkVSU0lPTl9HUk9VUF9JRCA9IDB4ODkyZjIwODU7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vemNhc2gvemNhc2gvYmxvYi92NC43LjAvc3JjL3ByaW1pdGl2ZXMvdHJhbnNhY3Rpb24uaCNMNTJcbmNvbnN0IFpJUDIyNV9WRVJTSU9OX0dST1VQX0lEID0gMHgyNmE3MjcwYTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3pjYXNoL3pjYXNoL2Jsb2IvdjQuNy4wL3NyYy9jb25zZW5zdXMvdXBncmFkZXMuY3BwI0wxMVxuY29uc3QgT1ZFUldJTlRFUl9CUkFOQ0hfSUQgPSAweDViYTgxYjE5O1xuY29uc3QgQ0FOT1BZX0JSQU5DSF9JRCA9IDB4ZTlmZjc1YTY7XG5jb25zdCBOVTVfQlJBTkNIX0lEID0gMHhjMmQ2ZDBiNDtcblxuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkVHJhbnNhY3Rpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRWZXJzaW9uR3JvdXBJZEZvclZlcnNpb24odmVyc2lvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgc3dpdGNoICh2ZXJzaW9uKSB7XG4gICAgY2FzZSA0MDA6XG4gICAgY2FzZSA0NTA6XG4gICAgICByZXR1cm4gU0FQTElOR19WRVJTSU9OX0dST1VQX0lEO1xuICAgIGNhc2UgNTAwOlxuICAgICAgcmV0dXJuIFpJUDIyNV9WRVJTSU9OX0dST1VQX0lEO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgbm8gdmFsdWUgZm9yIHZlcnNpb24gJHt2ZXJzaW9ufWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdENvbnNlbnN1c0JyYW5jaElkRm9yVmVyc2lvbihuZXR3b3JrOiBaY2FzaE5ldHdvcmssIHZlcnNpb246IG51bWJlcik6IG51bWJlciB7XG4gIHN3aXRjaCAodmVyc2lvbikge1xuICAgIGNhc2UgMTpcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gMDtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gT1ZFUldJTlRFUl9CUkFOQ0hfSUQ7XG4gICAgY2FzZSBaY2FzaFRyYW5zYWN0aW9uLlZFUlNJT040X0JSQU5DSF9DQU5PUFk6XG4gICAgICAvLyBodHRwczovL3ppcHMuei5jYXNoL3ppcC0wMjUxXG4gICAgICByZXR1cm4gQ0FOT1BZX0JSQU5DSF9JRDtcbiAgICBjYXNlIDQ6XG4gICAgY2FzZSA1OlxuICAgIGNhc2UgWmNhc2hUcmFuc2FjdGlvbi5WRVJTSU9ONF9CUkFOQ0hfTlU1OlxuICAgIGNhc2UgWmNhc2hUcmFuc2FjdGlvbi5WRVJTSU9ONV9CUkFOQ0hfTlU1OlxuICAgICAgLy8gaHR0cHM6Ly96aXBzLnouY2FzaC96aXAtMDI1MlxuICAgICAgcmV0dXJuIE5VNV9CUkFOQ0hfSUQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBubyB2YWx1ZSBmb3IgdmVyc2lvbiAke3ZlcnNpb259YCk7XG59XG5cbmV4cG9ydCBjbGFzcyBaY2FzaFRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IGV4dGVuZHMgVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgc3RhdGljIFZFUlNJT05fSk9JTlNQTElUU19TVVBQT1JUID0gMjtcbiAgc3RhdGljIFZFUlNJT05fT1ZFUldJTlRFUiA9IDM7XG4gIHN0YXRpYyBWRVJTSU9OX1NBUExJTkcgPSA0O1xuXG4gIHN0YXRpYyBWRVJTSU9ONF9CUkFOQ0hfQ0FOT1BZID0gNDAwO1xuICBzdGF0aWMgVkVSU0lPTjRfQlJBTkNIX05VNSA9IDQ1MDtcbiAgc3RhdGljIFZFUlNJT041X0JSQU5DSF9OVTUgPSA1MDA7XG5cbiAgLy8gMSBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgcG9zdCBvdmVyd2ludGVyIHVwZ3JhZGUsIDAgb3RoZXJ3aXNlXG4gIG92ZXJ3aW50ZXJlZCA9IDA7XG4gIC8vIDB4MDNDNDgyNzAgKDYzMjEwMDk2KSBmb3Igb3ZlcndpbnRlciBhbmQgMHg4OTJGMjA4NSAoMjMwMTU2NzEwOSkgZm9yIHNhcGxpbmdcbiAgdmVyc2lvbkdyb3VwSWQgPSAwO1xuICAvLyBCbG9jayBoZWlnaHQgYWZ0ZXIgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbnMgd2lsbCBleHBpcmUsIG9yIDAgdG8gZGlzYWJsZSBleHBpcnlcbiAgZXhwaXJ5SGVpZ2h0ID0gMDtcbiAgY29uc2Vuc3VzQnJhbmNoSWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmV0d29yazogWmNhc2hOZXR3b3JrLCB0eD86IFpjYXNoVHJhbnNhY3Rpb248YmlnaW50IHwgbnVtYmVyPiwgYW1vdW50VHlwZT86ICdiaWdpbnQnIHwgJ251bWJlcicpIHtcbiAgICBzdXBlcihuZXR3b3JrLCB0eCwgYW1vdW50VHlwZSk7XG5cbiAgICBsZXQgY29uc2Vuc3VzQnJhbmNoSWQ7XG4gICAgaWYgKHR4KSB7XG4gICAgICB0aGlzLm92ZXJ3aW50ZXJlZCA9IHR4Lm92ZXJ3aW50ZXJlZDtcbiAgICAgIHRoaXMudmVyc2lvbkdyb3VwSWQgPSB0eC52ZXJzaW9uR3JvdXBJZDtcbiAgICAgIHRoaXMuZXhwaXJ5SGVpZ2h0ID0gdHguZXhwaXJ5SGVpZ2h0O1xuXG4gICAgICBpZiAodHguY29uc2Vuc3VzQnJhbmNoSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zZW5zdXNCcmFuY2hJZCA9IHR4LmNvbnNlbnN1c0JyYW5jaElkO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbnNlbnN1c0JyYW5jaElkID0gY29uc2Vuc3VzQnJhbmNoSWQgPz8gZ2V0RGVmYXVsdENvbnNlbnN1c0JyYW5jaElkRm9yVmVyc2lvbihuZXR3b3JrLCB0aGlzLnZlcnNpb24pO1xuICB9XG5cbiAgc3RhdGljIGZyb21CdWZmZXI8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgYnVmZmVyOiBCdWZmZXIsXG4gICAgX19ub1N0cmljdDogYm9vbGVhbixcbiAgICBhbW91bnRUeXBlOiAnbnVtYmVyJyB8ICdiaWdpbnQnID0gJ251bWJlcicsXG4gICAgbmV0d29yaz86IFpjYXNoTmV0d29ya1xuICApOiBaY2FzaFRyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICghbmV0d29yaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHByb3ZpZGUgbmV0d29ya2ApO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlclJlYWRlciA9IG5ldyBCdWZmZXJSZWFkZXIoYnVmZmVyKTtcbiAgICBjb25zdCB0eCA9IG5ldyBaY2FzaFRyYW5zYWN0aW9uPFROdW1iZXI+KG5ldHdvcmspO1xuICAgIHR4LnZlcnNpb24gPSBidWZmZXJSZWFkZXIucmVhZEludDMyKCk7XG5cbiAgICAvLyBTcGxpdCB0aGUgaGVhZGVyIGludG8gZk92ZXJ3aW50ZXJlZCBhbmQgblZlcnNpb25cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemNhc2gvemNhc2gvYmxvYi92NC41LjEvc3JjL3ByaW1pdGl2ZXMvdHJhbnNhY3Rpb24uaCNMNzcyXG4gICAgdHgub3ZlcndpbnRlcmVkID0gdHgudmVyc2lvbiA+Pj4gMzE7IC8vIE11c3QgYmUgMSBmb3IgdmVyc2lvbiAzIGFuZCB1cFxuICAgIHR4LnZlcnNpb24gPSB0eC52ZXJzaW9uICYgMHgwN2ZmZmZmZmY7IC8vIDMgZm9yIG92ZXJ3aW50ZXJcbiAgICB0eC5jb25zZW5zdXNCcmFuY2hJZCA9IGdldERlZmF1bHRDb25zZW5zdXNCcmFuY2hJZEZvclZlcnNpb24obmV0d29yaywgdHgudmVyc2lvbik7XG5cbiAgICBpZiAodHguaXNPdmVyd2ludGVyQ29tcGF0aWJsZSgpKSB7XG4gICAgICB0eC52ZXJzaW9uR3JvdXBJZCA9IGJ1ZmZlclJlYWRlci5yZWFkVUludDMyKCk7XG4gICAgfVxuXG4gICAgaWYgKHR4LnZlcnNpb24gPT09IDUpIHtcbiAgICAgIGZyb21CdWZmZXJWNShidWZmZXJSZWFkZXIsIHR4LCBhbW91bnRUeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJvbUJ1ZmZlclY0KGJ1ZmZlclJlYWRlciwgdHgsIGFtb3VudFR5cGUpO1xuICAgIH1cblxuICAgIGlmIChfX25vU3RyaWN0KSByZXR1cm4gdHg7XG4gICAgaWYgKGJ1ZmZlclJlYWRlci5vZmZzZXQgIT09IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHRyYWlsaW5nID0gYnVmZmVyLnNsaWNlKGJ1ZmZlclJlYWRlci5vZmZzZXQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHRyYWlsaW5nIGJ5dGVzOiAke3RyYWlsaW5nLnRvU3RyaW5nKCdoZXgnKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICBzdGF0aWMgZnJvbUJ1ZmZlcldpdGhWZXJzaW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICAgIGJ1ZjogQnVmZmVyLFxuICAgIG5ldHdvcms6IFpjYXNoTmV0d29yayxcbiAgICB2ZXJzaW9uPzogbnVtYmVyLFxuICAgIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcgPSAnbnVtYmVyJ1xuICApOiBaY2FzaFRyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgICBjb25zdCB0eCA9IFpjYXNoVHJhbnNhY3Rpb24uZnJvbUJ1ZmZlcjxUTnVtYmVyPihidWYsIGZhbHNlLCBhbW91bnRUeXBlLCBuZXR3b3JrKTtcbiAgICBpZiAodmVyc2lvbikge1xuICAgICAgdHguY29uc2Vuc3VzQnJhbmNoSWQgPSBnZXREZWZhdWx0Q29uc2Vuc3VzQnJhbmNoSWRGb3JWZXJzaW9uKG5ldHdvcmssIHZlcnNpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICBieXRlTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgbGV0IGJ5dGVMZW5ndGggPSBzdXBlci5ieXRlTGVuZ3RoKCk7XG4gICAgaWYgKHRoaXMuaXNPdmVyd2ludGVyQ29tcGF0aWJsZSgpKSB7XG4gICAgICBieXRlTGVuZ3RoICs9IDQ7IC8vIG5WZXJzaW9uR3JvdXBJZFxuICAgIH1cbiAgICBpZiAodGhpcy5pc092ZXJ3aW50ZXJDb21wYXRpYmxlKCkpIHtcbiAgICAgIGJ5dGVMZW5ndGggKz0gNDsgLy8gbkV4cGlyeUhlaWdodFxuICAgIH1cbiAgICBjb25zdCBlbXB0eVZlY3Rvckxlbmd0aCA9IHZhcnVpbnQuZW5jb2RpbmdMZW5ndGgoMCk7XG4gICAgaWYgKHRoaXMudmVyc2lvbiA9PT0gNSkge1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3pjYXNoL3pjYXNoL2Jsb2IvdjQuNS4xL3NyYy9wcmltaXRpdmVzL3RyYW5zYWN0aW9uLmgjTDgyMlxuICAgICAgYnl0ZUxlbmd0aCArPSA0OyAvLyBjb25zZW5zdXNCcmFuY2hJZFxuICAgICAgYnl0ZUxlbmd0aCArPSBlbXB0eVZlY3Rvckxlbmd0aDsgLy8gc2FwbGluZ0J1bmRsZSBpbnB1dHNcbiAgICAgIGJ5dGVMZW5ndGggKz0gZW1wdHlWZWN0b3JMZW5ndGg7IC8vIHNhcGxpbmdCdW5kbGUgb3V0cHV0c1xuICAgICAgYnl0ZUxlbmd0aCArPSAxOyAvLyBvcmNoYXJkQnVuZGxlIChlbXB0eSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuaXNTYXBsaW5nQ29tcGF0aWJsZSgpKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96Y2FzaC96Y2FzaC9ibG9iL3Y0LjUuMS9zcmMvcHJpbWl0aXZlcy90cmFuc2FjdGlvbi5oI0w4NjJcbiAgICAgICAgYnl0ZUxlbmd0aCArPSA4OyAvLyB2YWx1ZUJhbGFuY2UgKHVpbnQ2NClcbiAgICAgICAgYnl0ZUxlbmd0aCArPSBlbXB0eVZlY3Rvckxlbmd0aDsgLy8gaW5wdXRzXG4gICAgICAgIGJ5dGVMZW5ndGggKz0gZW1wdHlWZWN0b3JMZW5ndGg7IC8vIG91dHB1dHNcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN1cHBvcnRzSm9pblNwbGl0cygpKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGJ5dGVMZW5ndGggKz0gZW1wdHlWZWN0b3JMZW5ndGg7IC8vIGpvaW5zcGxpdHNcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVMZW5ndGg7XG4gIH1cblxuICBpc1NhcGxpbmdDb21wYXRpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMub3ZlcndpbnRlcmVkICYmIHRoaXMudmVyc2lvbiA+PSBaY2FzaFRyYW5zYWN0aW9uLlZFUlNJT05fU0FQTElORztcbiAgfVxuXG4gIGlzT3ZlcndpbnRlckNvbXBhdGlibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5vdmVyd2ludGVyZWQgJiYgdGhpcy52ZXJzaW9uID49IFpjYXNoVHJhbnNhY3Rpb24uVkVSU0lPTl9PVkVSV0lOVEVSO1xuICB9XG5cbiAgc3VwcG9ydHNKb2luU3BsaXRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMub3ZlcndpbnRlcmVkICYmIHRoaXMudmVyc2lvbiA+PSBaY2FzaFRyYW5zYWN0aW9uLlZFUlNJT05fSk9JTlNQTElUU19TVVBQT1JUO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgaGFzaCBmb3IgYWxsIG9yIG5vbmUgb2YgdGhlIHRyYW5zYWN0aW9uIGlucHV0cyBkZXBlbmRpbmcgb24gdGhlIGhhc2h0eXBlXG4gICAqIEBwYXJhbSBoYXNoVHlwZVxuICAgKiBAcmV0dXJucyBCdWZmZXIgLSBCTEFLRTJiIGhhc2ggb3IgMjU2LWJpdCB6ZXJvIGlmIGRvZXNuJ3QgYXBwbHlcbiAgICovXG4gIGdldFByZXZvdXRIYXNoKGhhc2hUeXBlOiBudW1iZXIpOiBCdWZmZXIge1xuICAgIGlmICghKGhhc2hUeXBlICYgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTllPTkVDQU5QQVkpKSB7XG4gICAgICBjb25zdCBidWZmZXJXcml0ZXIgPSBuZXcgQnVmZmVyV3JpdGVyKEJ1ZmZlci5hbGxvY1Vuc2FmZSgzNiAqIHRoaXMuaW5zLmxlbmd0aCkpO1xuXG4gICAgICB0aGlzLmlucy5mb3JFYWNoKGZ1bmN0aW9uICh0eEluKSB7XG4gICAgICAgIGJ1ZmZlcldyaXRlci53cml0ZVNsaWNlKHR4SW4uaGFzaCk7XG4gICAgICAgIGJ1ZmZlcldyaXRlci53cml0ZVVJbnQzMih0eEluLmluZGV4KTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZ2V0Qmxha2UyYkhhc2goYnVmZmVyV3JpdGVyLmJ1ZmZlciwgJ1pjYXNoUHJldm91dEhhc2gnKTtcbiAgICB9XG4gICAgcmV0dXJuIFpFUk87XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBoYXNoIGZvciBhbGwgb3Igbm9uZSBvZiB0aGUgdHJhbnNhY3Rpb25zIGlucHV0cyBzZXF1ZW5jZSBudW1iZXJzIGRlcGVuZGluZyBvbiB0aGUgaGFzaHR5cGVcbiAgICogQHBhcmFtIGhhc2hUeXBlXG4gICAqIEByZXR1cm5zIEJ1ZmZlciBCTEFLRTJiIGhhc2ggb3IgMjU2LWJpdCB6ZXJvIGlmIGRvZXNuJ3QgYXBwbHlcbiAgICovXG4gIGdldFNlcXVlbmNlSGFzaChoYXNoVHlwZTogbnVtYmVyKTogQnVmZmVyIHtcbiAgICBpZiAoXG4gICAgICAhKGhhc2hUeXBlICYgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTllPTkVDQU5QQVkpICYmXG4gICAgICAoaGFzaFR5cGUgJiAweDFmKSAhPT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9TSU5HTEUgJiZcbiAgICAgIChoYXNoVHlwZSAmIDB4MWYpICE9PSBUcmFuc2FjdGlvbi5TSUdIQVNIX05PTkVcbiAgICApIHtcbiAgICAgIGNvbnN0IGJ1ZmZlcldyaXRlciA9IG5ldyBCdWZmZXJXcml0ZXIoQnVmZmVyLmFsbG9jVW5zYWZlKDQgKiB0aGlzLmlucy5sZW5ndGgpKTtcblxuICAgICAgdGhpcy5pbnMuZm9yRWFjaChmdW5jdGlvbiAodHhJbikge1xuICAgICAgICBidWZmZXJXcml0ZXIud3JpdGVVSW50MzIodHhJbi5zZXF1ZW5jZSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGdldEJsYWtlMmJIYXNoKGJ1ZmZlcldyaXRlci5idWZmZXIsICdaY2FzaFNlcXVlbmNIYXNoJyk7XG4gICAgfVxuICAgIHJldHVybiBaRVJPO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgaGFzaCBmb3Igb25lLCBhbGwgb3Igbm9uZSBvZiB0aGUgdHJhbnNhY3Rpb24gb3V0cHV0cyBkZXBlbmRpbmcgb24gdGhlIGhhc2h0eXBlXG4gICAqIEBwYXJhbSBoYXNoVHlwZVxuICAgKiBAcGFyYW0gaW5JbmRleFxuICAgKiBAcmV0dXJucyBCdWZmZXIgQkxBS0UyYiBoYXNoIG9yIDI1Ni1iaXQgemVybyBpZiBkb2Vzbid0IGFwcGx5XG4gICAqL1xuICBnZXRPdXRwdXRzSGFzaChoYXNoVHlwZTogbnVtYmVyLCBpbkluZGV4OiBudW1iZXIpOiBCdWZmZXIge1xuICAgIGlmICgoaGFzaFR5cGUgJiAweDFmKSAhPT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9TSU5HTEUgJiYgKGhhc2hUeXBlICYgMHgxZikgIT09IFRyYW5zYWN0aW9uLlNJR0hBU0hfTk9ORSkge1xuICAgICAgLy8gRmluZCBvdXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dHMgYW5kIHdyaXRlIHRoZW1cbiAgICAgIGNvbnN0IHR4T3V0c1NpemUgPSB0aGlzLm91dHMucmVkdWNlKGZ1bmN0aW9uIChzdW0sIG91dHB1dCkge1xuICAgICAgICByZXR1cm4gc3VtICsgOCArIHZhclNsaWNlU2l6ZShvdXRwdXQuc2NyaXB0KTtcbiAgICAgIH0sIDApO1xuXG4gICAgICBjb25zdCBidWZmZXJXcml0ZXIgPSBuZXcgQnVmZmVyV3JpdGVyKEJ1ZmZlci5hbGxvY1Vuc2FmZSh0eE91dHNTaXplKSk7XG5cbiAgICAgIHRoaXMub3V0cy5mb3JFYWNoKGZ1bmN0aW9uIChvdXQpIHtcbiAgICAgICAgYnVmZmVyV3JpdGVyLndyaXRlVUludDY0KG91dC52YWx1ZSk7XG4gICAgICAgIGJ1ZmZlcldyaXRlci53cml0ZVZhclNsaWNlKG91dC5zY3JpcHQpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBnZXRCbGFrZTJiSGFzaChidWZmZXJXcml0ZXIuYnVmZmVyLCAnWmNhc2hPdXRwdXRzSGFzaCcpO1xuICAgIH0gZWxzZSBpZiAoKGhhc2hUeXBlICYgMHgxZikgPT09IFRyYW5zYWN0aW9uLlNJR0hBU0hfU0lOR0xFICYmIGluSW5kZXggPCB0aGlzLm91dHMubGVuZ3RoKSB7XG4gICAgICAvLyBXcml0ZSBvbmx5IHRoZSBvdXRwdXQgc3BlY2lmaWVkIGluIGluSW5kZXhcbiAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMub3V0c1tpbkluZGV4XTtcblxuICAgICAgY29uc3QgYnVmZmVyV3JpdGVyID0gbmV3IEJ1ZmZlcldyaXRlcihCdWZmZXIuYWxsb2NVbnNhZmUoOCArIHZhclNsaWNlU2l6ZShvdXRwdXQuc2NyaXB0KSkpO1xuICAgICAgYnVmZmVyV3JpdGVyLndyaXRlVUludDY0KG91dHB1dC52YWx1ZSk7XG4gICAgICBidWZmZXJXcml0ZXIud3JpdGVWYXJTbGljZShvdXRwdXQuc2NyaXB0KTtcblxuICAgICAgcmV0dXJuIGdldEJsYWtlMmJIYXNoKGJ1ZmZlcldyaXRlci5idWZmZXIsICdaY2FzaE91dHB1dHNIYXNoJyk7XG4gICAgfVxuICAgIHJldHVybiBaRVJPO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhc2ggdHJhbnNhY3Rpb24gZm9yIHNpZ25pbmcgYSB0cmFuc3BhcmVudCB0cmFuc2FjdGlvbiBpbiBaY2FzaC4gUHJvdGVjdGVkIHRyYW5zYWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICogQHBhcmFtIGluSW5kZXhcbiAgICogQHBhcmFtIHByZXZPdXRTY3JpcHRcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSBoYXNoVHlwZVxuICAgKiBAcmV0dXJucyBCdWZmZXIgQkxBS0UyYiBoYXNoXG4gICAqL1xuICBoYXNoRm9yU2lnbmF0dXJlQnlOZXR3b3JrKFxuICAgIGluSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBwcmV2T3V0U2NyaXB0OiBCdWZmZXIsXG4gICAgdmFsdWU6IGJpZ2ludCB8IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBoYXNoVHlwZTogbnVtYmVyXG4gICk6IEJ1ZmZlciB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIHZhbHVlYCk7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3pjYXNoL3pjYXNoL2Jsb2IvdjQuNS4xL3NyYy9zY3JpcHQvaW50ZXJwcmV0ZXIuY3BwI0wxMTc1XG4gICAgaWYgKHRoaXMudmVyc2lvbiA9PT0gNSkge1xuICAgICAgcmV0dXJuIGdldFNpZ25hdHVyZURpZ2VzdCh0aGlzLCBpbkluZGV4LCBwcmV2T3V0U2NyaXB0LCB2YWx1ZSwgaGFzaFR5cGUpO1xuICAgIH1cblxuICAgIC8vIFpDYXNoIGFtb3VudHMgYXJlIGFsd2F5cyB3aXRoaW4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbiAgICB2YWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgPyBOdW1iZXIodmFsdWUpIDogdmFsdWU7XG4gICAgdHlwZWZvcmNlKHR5cGVzLnR1cGxlKHR5cGVzLlVJbnQzMiwgdHlwZXMuQnVmZmVyLCB0eXBlcy5OdW1iZXIpLCBbaW5JbmRleCwgcHJldk91dFNjcmlwdCwgdmFsdWVdKTtcblxuICAgIGlmIChpbkluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpbkluZGV4YCk7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoaW5JbmRleCA+PSB0aGlzLmlucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgaW5kZXggaXMgb3V0IG9mIHJhbmdlJyk7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoIXRoaXMuaXNPdmVyd2ludGVyQ29tcGF0aWJsZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZlcnNpb24gJHt0aGlzLnZlcnNpb259YCk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzaFByZXZvdXRzID0gdGhpcy5nZXRQcmV2b3V0SGFzaChoYXNoVHlwZSk7XG4gICAgY29uc3QgaGFzaFNlcXVlbmNlID0gdGhpcy5nZXRTZXF1ZW5jZUhhc2goaGFzaFR5cGUpO1xuICAgIGNvbnN0IGhhc2hPdXRwdXRzID0gdGhpcy5nZXRPdXRwdXRzSGFzaChoYXNoVHlwZSwgaW5JbmRleCk7XG4gICAgY29uc3QgaGFzaEpvaW5TcGxpdHMgPSBaRVJPO1xuICAgIGNvbnN0IGhhc2hTaGllbGRlZFNwZW5kcyA9IFpFUk87XG4gICAgY29uc3QgaGFzaFNoaWVsZGVkT3V0cHV0cyA9IFpFUk87XG5cbiAgICBsZXQgYmFzZUJ1ZmZlclNpemUgPSAwO1xuICAgIGJhc2VCdWZmZXJTaXplICs9IDQgKiA1OyAvLyBoZWFkZXIsIG5WZXJzaW9uR3JvdXBJZCwgbG9ja190aW1lLCBuRXhwaXJ5SGVpZ2h0LCBoYXNoVHlwZVxuICAgIGJhc2VCdWZmZXJTaXplICs9IDMyICogNDsgLy8gMjU2IGhhc2hlczogaGFzaFByZXZvdXRzLCBoYXNoU2VxdWVuY2UsIGhhc2hPdXRwdXRzLCBoYXNoSm9pblNwbGl0c1xuICAgIGJhc2VCdWZmZXJTaXplICs9IDQgKiAyOyAvLyBpbnB1dC5pbmRleCwgaW5wdXQuc2VxdWVuY2VcbiAgICBiYXNlQnVmZmVyU2l6ZSArPSA4OyAvLyB2YWx1ZVxuICAgIGJhc2VCdWZmZXJTaXplICs9IDMyOyAvLyBpbnB1dC5oYXNoXG4gICAgYmFzZUJ1ZmZlclNpemUgKz0gdmFyU2xpY2VTaXplKHByZXZPdXRTY3JpcHQpOyAvLyBwcmV2T3V0U2NyaXB0XG4gICAgaWYgKHRoaXMuaXNTYXBsaW5nQ29tcGF0aWJsZSgpKSB7XG4gICAgICBiYXNlQnVmZmVyU2l6ZSArPSAzMiAqIDI7IC8vIGhhc2hTaGllbGRlZFNwZW5kcyBhbmQgaGFzaFNoaWVsZGVkT3V0cHV0c1xuICAgICAgYmFzZUJ1ZmZlclNpemUgKz0gODsgLy8gdmFsdWVCYWxhbmNlXG4gICAgfVxuXG4gICAgY29uc3QgbWFzayA9IHRoaXMub3ZlcndpbnRlcmVkID8gMSA6IDA7XG4gICAgY29uc3QgaGVhZGVyID0gdGhpcy52ZXJzaW9uIHwgKG1hc2sgPDwgMzEpO1xuXG4gICAgY29uc3QgYnVmZmVyV3JpdGVyID0gbmV3IEJ1ZmZlcldyaXRlcihCdWZmZXIuYWxsb2MoYmFzZUJ1ZmZlclNpemUpKTtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVJbnQzMihoZWFkZXIpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVVJbnQzMih0aGlzLnZlcnNpb25Hcm91cElkKTtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVTbGljZShoYXNoUHJldm91dHMpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVNsaWNlKGhhc2hTZXF1ZW5jZSk7XG4gICAgYnVmZmVyV3JpdGVyLndyaXRlU2xpY2UoaGFzaE91dHB1dHMpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVNsaWNlKGhhc2hKb2luU3BsaXRzKTtcbiAgICBpZiAodGhpcy5pc1NhcGxpbmdDb21wYXRpYmxlKCkpIHtcbiAgICAgIGJ1ZmZlcldyaXRlci53cml0ZVNsaWNlKGhhc2hTaGllbGRlZFNwZW5kcyk7XG4gICAgICBidWZmZXJXcml0ZXIud3JpdGVTbGljZShoYXNoU2hpZWxkZWRPdXRwdXRzKTtcbiAgICB9XG4gICAgYnVmZmVyV3JpdGVyLndyaXRlVUludDMyKHRoaXMubG9ja3RpbWUpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVVJbnQzMih0aGlzLmV4cGlyeUhlaWdodCk7XG4gICAgaWYgKHRoaXMuaXNTYXBsaW5nQ29tcGF0aWJsZSgpKSB7XG4gICAgICBidWZmZXJXcml0ZXIud3JpdGVTbGljZShWQUxVRV9JTlQ2NF9aRVJPKTtcbiAgICB9XG4gICAgYnVmZmVyV3JpdGVyLndyaXRlSW50MzIoaGFzaFR5cGUpO1xuXG4gICAgLy8gVGhlIGlucHV0IGJlaW5nIHNpZ25lZCAocmVwbGFjaW5nIHRoZSBzY3JpcHRTaWcgd2l0aCBzY3JpcHRDb2RlICsgYW1vdW50KVxuICAgIC8vIFRoZSBwcmV2b3V0IG1heSBhbHJlYWR5IGJlIGNvbnRhaW5lZCBpbiBoYXNoUHJldm91dCwgYW5kIHRoZSBuU2VxdWVuY2VcbiAgICAvLyBtYXkgYWxyZWFkeSBiZSBjb250YWluZWQgaW4gaGFzaFNlcXVlbmNlLlxuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnNbaW5JbmRleF07XG4gICAgYnVmZmVyV3JpdGVyLndyaXRlU2xpY2UoaW5wdXQuaGFzaCk7XG4gICAgYnVmZmVyV3JpdGVyLndyaXRlVUludDMyKGlucHV0LmluZGV4KTtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVWYXJTbGljZShwcmV2T3V0U2NyaXB0KTtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVVSW50NjQodmFsdWUpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVVJbnQzMihpbnB1dC5zZXF1ZW5jZSk7XG5cbiAgICBjb25zdCBwZXJzb25hbGl6YXRpb24gPSBCdWZmZXIuYWxsb2MoMTYpO1xuICAgIGNvbnN0IHByZWZpeCA9ICdaY2FzaFNpZ0hhc2gnO1xuICAgIHBlcnNvbmFsaXphdGlvbi53cml0ZShwcmVmaXgpO1xuICAgIHBlcnNvbmFsaXphdGlvbi53cml0ZVVJbnQzMkxFKHRoaXMuY29uc2Vuc3VzQnJhbmNoSWQsIHByZWZpeC5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIGdldEJsYWtlMmJIYXNoKGJ1ZmZlcldyaXRlci5idWZmZXIsIHBlcnNvbmFsaXphdGlvbik7XG4gIH1cblxuICB0b0J1ZmZlcihidWZmZXI/OiBCdWZmZXIsIGluaXRpYWxPZmZzZXQgPSAwKTogQnVmZmVyIHtcbiAgICBpZiAoIWJ1ZmZlcikgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKHRoaXMuYnl0ZUxlbmd0aCgpKTtcblxuICAgIGNvbnN0IGJ1ZmZlcldyaXRlciA9IG5ldyBCdWZmZXJXcml0ZXIoYnVmZmVyLCBpbml0aWFsT2Zmc2V0KTtcblxuICAgIGlmICh0aGlzLmlzT3ZlcndpbnRlckNvbXBhdGlibGUoKSkge1xuICAgICAgY29uc3QgbWFzayA9IHRoaXMub3ZlcndpbnRlcmVkID8gMSA6IDA7XG4gICAgICBidWZmZXJXcml0ZXIud3JpdGVJbnQzMih0aGlzLnZlcnNpb24gfCAobWFzayA8PCAzMSkpOyAvLyBTZXQgb3ZlcndpbnRlciBiaXRcbiAgICAgIGJ1ZmZlcldyaXRlci53cml0ZVVJbnQzMih0aGlzLnZlcnNpb25Hcm91cElkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyV3JpdGVyLndyaXRlSW50MzIodGhpcy52ZXJzaW9uKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52ZXJzaW9uID09PSA1KSB7XG4gICAgICB0b0J1ZmZlclY1KGJ1ZmZlcldyaXRlciwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvQnVmZmVyVjQoYnVmZmVyV3JpdGVyLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAoaW5pdGlhbE9mZnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYnVmZmVyLnNsaWNlKGluaXRpYWxPZmZzZXQsIGJ1ZmZlcldyaXRlci5vZmZzZXQpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyO1xuICB9XG5cbiAgZ2V0SGFzaChmb3JXaXRuZXNzPzogYm9vbGVhbik6IEJ1ZmZlciB7XG4gICAgaWYgKGZvcldpdG5lc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBhcmd1bWVudGApO1xuICAgIH1cbiAgICBpZiAodGhpcy52ZXJzaW9uID09PSA1KSB7XG4gICAgICByZXR1cm4gZ2V0VHhpZERpZ2VzdCh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyeXB0by5oYXNoMjU2KHRoaXMudG9CdWZmZXIoKSk7XG4gIH1cblxuICBjbG9uZTxUTjIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBUTnVtYmVyPihhbW91bnRUeXBlPzogJ2JpZ2ludCcgfCAnbnVtYmVyJyk6IFpjYXNoVHJhbnNhY3Rpb248VE4yPiB7XG4gICAgcmV0dXJuIG5ldyBaY2FzaFRyYW5zYWN0aW9uPFROMj4odGhpcy5uZXR3b3JrLCB0aGlzLCBhbW91bnRUeXBlKTtcbiAgfVxufVxuIl19