@bitgo-beta/abstract-utxo 1.6.1-alpha.452 → 1.6.1-alpha.453

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 (187) hide show
  1. package/dist/cjs/src/abstractUtxoCoin.d.ts +10 -8
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
  3. package/dist/cjs/src/abstractUtxoCoin.js +8 -12
  4. package/dist/cjs/src/impl/bch/bch.d.ts +4 -2
  5. package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -1
  6. package/dist/cjs/src/impl/bch/bch.js +4 -3
  7. package/dist/cjs/src/impl/bch/tbch.d.ts +2 -0
  8. package/dist/cjs/src/impl/bch/tbch.d.ts.map +1 -1
  9. package/dist/cjs/src/impl/bch/tbch.js +3 -36
  10. package/dist/cjs/src/impl/bcha/bcha.d.ts +3 -2
  11. package/dist/cjs/src/impl/bcha/bcha.d.ts.map +1 -1
  12. package/dist/cjs/src/impl/bcha/bcha.js +4 -37
  13. package/dist/cjs/src/impl/bcha/tbcha.d.ts +2 -0
  14. package/dist/cjs/src/impl/bcha/tbcha.d.ts.map +1 -1
  15. package/dist/cjs/src/impl/bcha/tbcha.js +3 -36
  16. package/dist/cjs/src/impl/bsv/bsv.d.ts +3 -2
  17. package/dist/cjs/src/impl/bsv/bsv.d.ts.map +1 -1
  18. package/dist/cjs/src/impl/bsv/bsv.js +4 -37
  19. package/dist/cjs/src/impl/bsv/tbsv.d.ts +2 -0
  20. package/dist/cjs/src/impl/bsv/tbsv.d.ts.map +1 -1
  21. package/dist/cjs/src/impl/bsv/tbsv.js +3 -36
  22. package/dist/cjs/src/impl/btc/btc.d.ts +4 -2
  23. package/dist/cjs/src/impl/btc/btc.d.ts.map +1 -1
  24. package/dist/cjs/src/impl/btc/btc.js +4 -37
  25. package/dist/cjs/src/impl/btc/tbtc.d.ts +2 -0
  26. package/dist/cjs/src/impl/btc/tbtc.d.ts.map +1 -1
  27. package/dist/cjs/src/impl/btc/tbtc.js +3 -36
  28. package/dist/cjs/src/impl/btc/tbtc4.d.ts +2 -0
  29. package/dist/cjs/src/impl/btc/tbtc4.d.ts.map +1 -1
  30. package/dist/cjs/src/impl/btc/tbtc4.js +3 -36
  31. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts +2 -0
  32. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts.map +1 -1
  33. package/dist/cjs/src/impl/btc/tbtcbgsig.js +3 -36
  34. package/dist/cjs/src/impl/btc/tbtcsig.d.ts +2 -0
  35. package/dist/cjs/src/impl/btc/tbtcsig.d.ts.map +1 -1
  36. package/dist/cjs/src/impl/btc/tbtcsig.js +3 -36
  37. package/dist/cjs/src/impl/btg/btg.d.ts +4 -2
  38. package/dist/cjs/src/impl/btg/btg.d.ts.map +1 -1
  39. package/dist/cjs/src/impl/btg/btg.js +4 -37
  40. package/dist/cjs/src/impl/dash/dash.d.ts +4 -2
  41. package/dist/cjs/src/impl/dash/dash.d.ts.map +1 -1
  42. package/dist/cjs/src/impl/dash/dash.js +4 -37
  43. package/dist/cjs/src/impl/dash/tdash.d.ts +2 -0
  44. package/dist/cjs/src/impl/dash/tdash.d.ts.map +1 -1
  45. package/dist/cjs/src/impl/dash/tdash.js +3 -36
  46. package/dist/cjs/src/impl/doge/doge.d.ts +4 -2
  47. package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -1
  48. package/dist/cjs/src/impl/doge/doge.js +4 -4
  49. package/dist/cjs/src/impl/doge/tdoge.d.ts +2 -0
  50. package/dist/cjs/src/impl/doge/tdoge.d.ts.map +1 -1
  51. package/dist/cjs/src/impl/doge/tdoge.js +3 -36
  52. package/dist/cjs/src/impl/ltc/ltc.d.ts +4 -2
  53. package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -1
  54. package/dist/cjs/src/impl/ltc/ltc.js +4 -3
  55. package/dist/cjs/src/impl/ltc/tltc.d.ts +2 -0
  56. package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -1
  57. package/dist/cjs/src/impl/ltc/tltc.js +3 -2
  58. package/dist/cjs/src/impl/zec/tzec.d.ts +2 -0
  59. package/dist/cjs/src/impl/zec/tzec.d.ts.map +1 -1
  60. package/dist/cjs/src/impl/zec/tzec.js +3 -36
  61. package/dist/cjs/src/impl/zec/zec.d.ts +4 -2
  62. package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -1
  63. package/dist/cjs/src/impl/zec/zec.js +4 -37
  64. package/dist/cjs/src/names.d.ts +12 -4
  65. package/dist/cjs/src/names.d.ts.map +1 -1
  66. package/dist/cjs/src/names.js +66 -57
  67. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -1
  68. package/dist/cjs/src/recovery/backupKeyRecovery.js +32 -17
  69. package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -1
  70. package/dist/cjs/src/recovery/crossChainRecovery.js +25 -18
  71. package/dist/cjs/src/recovery/psbt.d.ts +6 -6
  72. package/dist/cjs/src/recovery/psbt.d.ts.map +1 -1
  73. package/dist/cjs/src/recovery/psbt.js +50 -36
  74. package/dist/cjs/src/tnumber.d.ts +4 -0
  75. package/dist/cjs/src/tnumber.d.ts.map +1 -0
  76. package/dist/cjs/src/tnumber.js +12 -0
  77. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts +1 -1
  78. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts.map +1 -1
  79. package/dist/cjs/src/transaction/fixedScript/SigningError.js +1 -1
  80. package/dist/cjs/src/transaction/fixedScript/{signPsbt.d.ts → signPsbtUtxolib.d.ts} +4 -13
  81. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -0
  82. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.js +157 -0
  83. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +2 -7
  84. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
  85. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +3 -17
  86. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +7 -0
  87. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -1
  88. package/dist/cjs/src/transaction/fixedScript/signTransaction.js +25 -6
  89. package/dist/cjs/src/wallet.js +2 -2
  90. package/dist/cjs/test/unit/coins.js +18 -1
  91. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +2 -2
  92. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.js +4 -6
  93. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  94. package/dist/esm/abstractUtxoCoin.d.ts +10 -8
  95. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
  96. package/dist/esm/abstractUtxoCoin.js +9 -13
  97. package/dist/esm/impl/bch/bch.d.ts +4 -2
  98. package/dist/esm/impl/bch/bch.d.ts.map +1 -1
  99. package/dist/esm/impl/bch/bch.js +4 -3
  100. package/dist/esm/impl/bch/tbch.d.ts +2 -0
  101. package/dist/esm/impl/bch/tbch.d.ts.map +1 -1
  102. package/dist/esm/impl/bch/tbch.js +3 -3
  103. package/dist/esm/impl/bcha/bcha.d.ts +3 -2
  104. package/dist/esm/impl/bcha/bcha.d.ts.map +1 -1
  105. package/dist/esm/impl/bcha/bcha.js +4 -4
  106. package/dist/esm/impl/bcha/tbcha.d.ts +2 -0
  107. package/dist/esm/impl/bcha/tbcha.d.ts.map +1 -1
  108. package/dist/esm/impl/bcha/tbcha.js +3 -3
  109. package/dist/esm/impl/bsv/bsv.d.ts +3 -2
  110. package/dist/esm/impl/bsv/bsv.d.ts.map +1 -1
  111. package/dist/esm/impl/bsv/bsv.js +4 -4
  112. package/dist/esm/impl/bsv/tbsv.d.ts +2 -0
  113. package/dist/esm/impl/bsv/tbsv.d.ts.map +1 -1
  114. package/dist/esm/impl/bsv/tbsv.js +3 -3
  115. package/dist/esm/impl/btc/btc.d.ts +4 -2
  116. package/dist/esm/impl/btc/btc.d.ts.map +1 -1
  117. package/dist/esm/impl/btc/btc.js +4 -4
  118. package/dist/esm/impl/btc/tbtc.d.ts +2 -0
  119. package/dist/esm/impl/btc/tbtc.d.ts.map +1 -1
  120. package/dist/esm/impl/btc/tbtc.js +3 -3
  121. package/dist/esm/impl/btc/tbtc4.d.ts +2 -0
  122. package/dist/esm/impl/btc/tbtc4.d.ts.map +1 -1
  123. package/dist/esm/impl/btc/tbtc4.js +3 -3
  124. package/dist/esm/impl/btc/tbtcbgsig.d.ts +2 -0
  125. package/dist/esm/impl/btc/tbtcbgsig.d.ts.map +1 -1
  126. package/dist/esm/impl/btc/tbtcbgsig.js +3 -3
  127. package/dist/esm/impl/btc/tbtcsig.d.ts +2 -0
  128. package/dist/esm/impl/btc/tbtcsig.d.ts.map +1 -1
  129. package/dist/esm/impl/btc/tbtcsig.js +3 -3
  130. package/dist/esm/impl/btg/btg.d.ts +4 -2
  131. package/dist/esm/impl/btg/btg.d.ts.map +1 -1
  132. package/dist/esm/impl/btg/btg.js +4 -4
  133. package/dist/esm/impl/dash/dash.d.ts +4 -2
  134. package/dist/esm/impl/dash/dash.d.ts.map +1 -1
  135. package/dist/esm/impl/dash/dash.js +4 -4
  136. package/dist/esm/impl/dash/tdash.d.ts +2 -0
  137. package/dist/esm/impl/dash/tdash.d.ts.map +1 -1
  138. package/dist/esm/impl/dash/tdash.js +3 -3
  139. package/dist/esm/impl/doge/doge.d.ts +4 -2
  140. package/dist/esm/impl/doge/doge.d.ts.map +1 -1
  141. package/dist/esm/impl/doge/doge.js +4 -4
  142. package/dist/esm/impl/doge/tdoge.d.ts +2 -0
  143. package/dist/esm/impl/doge/tdoge.d.ts.map +1 -1
  144. package/dist/esm/impl/doge/tdoge.js +3 -3
  145. package/dist/esm/impl/ltc/ltc.d.ts +4 -2
  146. package/dist/esm/impl/ltc/ltc.d.ts.map +1 -1
  147. package/dist/esm/impl/ltc/ltc.js +4 -3
  148. package/dist/esm/impl/ltc/tltc.d.ts +2 -0
  149. package/dist/esm/impl/ltc/tltc.d.ts.map +1 -1
  150. package/dist/esm/impl/ltc/tltc.js +3 -2
  151. package/dist/esm/impl/zec/tzec.d.ts +2 -0
  152. package/dist/esm/impl/zec/tzec.d.ts.map +1 -1
  153. package/dist/esm/impl/zec/tzec.js +3 -3
  154. package/dist/esm/impl/zec/zec.d.ts +4 -2
  155. package/dist/esm/impl/zec/zec.d.ts.map +1 -1
  156. package/dist/esm/impl/zec/zec.js +4 -4
  157. package/dist/esm/names.d.ts +12 -4
  158. package/dist/esm/names.d.ts.map +1 -1
  159. package/dist/esm/names.js +61 -54
  160. package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -1
  161. package/dist/esm/recovery/backupKeyRecovery.js +33 -18
  162. package/dist/esm/recovery/crossChainRecovery.d.ts.map +1 -1
  163. package/dist/esm/recovery/crossChainRecovery.js +26 -19
  164. package/dist/esm/recovery/psbt.d.ts +6 -6
  165. package/dist/esm/recovery/psbt.d.ts.map +1 -1
  166. package/dist/esm/recovery/psbt.js +50 -36
  167. package/dist/esm/tnumber.d.ts +4 -0
  168. package/dist/esm/tnumber.d.ts.map +1 -0
  169. package/dist/esm/tnumber.js +9 -0
  170. package/dist/esm/transaction/fixedScript/SigningError.d.ts +1 -1
  171. package/dist/esm/transaction/fixedScript/SigningError.d.ts.map +1 -1
  172. package/dist/esm/transaction/fixedScript/SigningError.js +1 -1
  173. package/dist/esm/transaction/fixedScript/{signPsbt.d.ts → signPsbtUtxolib.d.ts} +4 -13
  174. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -0
  175. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.js +117 -0
  176. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +2 -7
  177. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
  178. package/dist/esm/transaction/fixedScript/signPsbtWasm.js +3 -17
  179. package/dist/esm/transaction/fixedScript/signTransaction.d.ts +7 -0
  180. package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -1
  181. package/dist/esm/transaction/fixedScript/signTransaction.js +25 -7
  182. package/dist/esm/wallet.js +2 -2
  183. package/package.json +11 -11
  184. package/dist/cjs/src/transaction/fixedScript/signPsbt.d.ts.map +0 -1
  185. package/dist/cjs/src/transaction/fixedScript/signPsbt.js +0 -174
  186. package/dist/esm/transaction/fixedScript/signPsbt.d.ts.map +0 -1
  187. package/dist/esm/transaction/fixedScript/signPsbt.js +0 -134
@@ -1,5 +1,5 @@
1
1
  import * as utxolib from '@bitgo-beta/utxo-lib';
2
- import { fixedScriptWallet, utxolibCompat } from '@bitgo/wasm-utxo';
2
+ import { CoinName, fixedScriptWallet, utxolibCompat } from '@bitgo/wasm-utxo';
3
3
  type RootWalletKeys = utxolib.bitgo.RootWalletKeys;
4
4
  type WalletUnspent<TNumber extends number | bigint> = utxolib.bitgo.WalletUnspent<TNumber>;
5
5
  type ChainCode = utxolib.bitgo.ChainCode;
@@ -41,7 +41,7 @@ export interface CreateEmptyWasmPsbtOptions {
41
41
  * @param options - Optional settings (e.g., blockHeight for Zcash)
42
42
  * @returns A wasm-utxo BitGoPsbt instance
43
43
  */
44
- export declare function createEmptyWasmPsbt(network: utxolib.Network, rootWalletKeys: RootWalletKeys, options?: CreateEmptyWasmPsbtOptions): fixedScriptWallet.BitGoPsbt;
44
+ export declare function createEmptyWasmPsbt(coinName: CoinName, rootWalletKeys: RootWalletKeys, options?: CreateEmptyWasmPsbtOptions): fixedScriptWallet.BitGoPsbt;
45
45
  /**
46
46
  * Add wallet inputs from unspents to a wasm-utxo BitGoPsbt.
47
47
  * Handles taproot inputs by setting the appropriate signPath.
@@ -60,7 +60,7 @@ export declare function addWalletInputsToWasmPsbt(wasmPsbt: fixedScriptWallet.Bi
60
60
  * @param network - The network (used to convert address to script)
61
61
  * @returns The output index
62
62
  */
63
- export declare function addOutputToWasmPsbt(wasmPsbt: fixedScriptWallet.BitGoPsbt, address: string, value: bigint, network: utxolib.Network): number;
63
+ export declare function addOutputToWasmPsbt(wasmPsbt: fixedScriptWallet.BitGoPsbt, address: string, value: bigint, coinName: CoinName): number;
64
64
  /**
65
65
  * Convert a wasm-utxo BitGoPsbt to a utxolib UtxoPsbt.
66
66
  *
@@ -68,7 +68,7 @@ export declare function addOutputToWasmPsbt(wasmPsbt: fixedScriptWallet.BitGoPsb
68
68
  * @param network - The network
69
69
  * @returns A utxolib UtxoPsbt
70
70
  */
71
- export declare function wasmPsbtToUtxolibPsbt(wasmPsbt: fixedScriptWallet.BitGoPsbt, network: utxolib.Network): utxolib.bitgo.UtxoPsbt;
71
+ export declare function toPsbtToUtxolibPsbt(wasmPsbt: fixedScriptWallet.BitGoPsbt | utxolib.bitgo.UtxoPsbt, coinName: CoinName): utxolib.bitgo.UtxoPsbt;
72
72
  /**
73
73
  * Create a backup key recovery PSBT.
74
74
  *
@@ -78,7 +78,7 @@ export declare function wasmPsbtToUtxolibPsbt(wasmPsbt: fixedScriptWallet.BitGoP
78
78
  * @param options - Options for creating the PSBT
79
79
  * @param backend - Which backend to use for PSBT creation (default: 'wasm-utxo')
80
80
  */
81
- export declare function createBackupKeyRecoveryPsbt(network: utxolib.Network, rootWalletKeys: RootWalletKeys, unspents: WalletUnspent<bigint>[], options: CreateBackupKeyRecoveryPsbtOptions, backend?: PsbtBackend): utxolib.bitgo.UtxoPsbt;
82
- export declare function getRecoveryAmount(psbt: utxolib.bitgo.UtxoPsbt, address: string): bigint;
81
+ export declare function createBackupKeyRecoveryPsbt(coinName: CoinName, rootWalletKeys: RootWalletKeys, unspents: WalletUnspent<bigint>[], options: CreateBackupKeyRecoveryPsbtOptions, backend?: PsbtBackend): utxolib.bitgo.UtxoPsbt | fixedScriptWallet.BitGoPsbt;
82
+ export declare function getRecoveryAmount(psbt: utxolib.bitgo.UtxoPsbt | fixedScriptWallet.BitGoPsbt, walletKeys: RootWalletKeys, address: string): bigint;
83
83
  export {};
84
84
  //# sourceMappingURL=psbt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"psbt.d.ts","sourceRoot":"","sources":["../../../../src/recovery/psbt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEpE,KAAK,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;AACnD,KAAK,aAAa,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAI3F,KAAK,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;AAEzC;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AAElD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAIxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,aAAa,CAAC,WAAW,CAMjF;AAmBD,UAAU,kCAAkC;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4BAA4B,EAAE,MAAM,GAAG,SAAS,CAAC;IACjD,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAoED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,cAAc,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE,0BAA0B,GACnC,iBAAiB,CAAC,SAAS,CAY7B;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,EACrC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EACjC,cAAc,EAAE,cAAc,GAC7B,IAAI,CAwBN;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,EACrC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,CAAC,OAAO,GACvB,MAAM,CAGR;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,EACrC,OAAO,EAAE,OAAO,CAAC,OAAO,GACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAExB;AA+CD;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EACjC,OAAO,EAAE,kCAAkC,EAC3C,OAAO,GAAE,WAAyB,GACjC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAUxB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAOvF"}
1
+ {"version":3,"file":"psbt.d.ts","sourceRoot":"","sources":["../../../../src/recovery/psbt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAA0B,MAAM,kBAAkB,CAAC;AAItG,KAAK,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;AACnD,KAAK,aAAa,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAI3F,KAAK,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;AAEzC;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AAElD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAIxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,aAAa,CAAC,WAAW,CAMjF;AAmBD,UAAU,kCAAkC;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4BAA4B,EAAE,MAAM,GAAG,SAAS,CAAC;IACjD,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAqED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE,0BAA0B,GACnC,iBAAiB,CAAC,SAAS,CAU7B;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,EACrC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EACjC,cAAc,EAAE,cAAc,GAC7B,IAAI,CAwBN;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,EACrC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,GACjB,MAAM,CAGR;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,EAC9D,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAMxB;AA6CD;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EACjC,OAAO,EAAE,kCAAkC,EAC3C,OAAO,GAAE,WAAyB,GACjC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAUtD;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,iBAAiB,CAAC,SAAS,EAC1D,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,MAAM,GACd,MAAM,CAkBR"}
@@ -38,12 +38,13 @@ exports.toNetworkName = toNetworkName;
38
38
  exports.createEmptyWasmPsbt = createEmptyWasmPsbt;
39
39
  exports.addWalletInputsToWasmPsbt = addWalletInputsToWasmPsbt;
40
40
  exports.addOutputToWasmPsbt = addOutputToWasmPsbt;
41
- exports.wasmPsbtToUtxolibPsbt = wasmPsbtToUtxolibPsbt;
41
+ exports.toPsbtToUtxolibPsbt = toPsbtToUtxolibPsbt;
42
42
  exports.createBackupKeyRecoveryPsbt = createBackupKeyRecoveryPsbt;
43
43
  exports.getRecoveryAmount = getRecoveryAmount;
44
44
  const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
45
45
  const unspents_1 = require("@bitgo-beta/unspents");
46
46
  const wasm_utxo_1 = require("@bitgo/wasm-utxo");
47
+ const names_1 = require("../names");
47
48
  const { chainCodesP2tr, chainCodesP2trMusig2 } = utxolib.bitgo;
48
49
  /**
49
50
  * Check if a chain code is for a taproot script type
@@ -77,7 +78,8 @@ class InsufficientFundsError extends Error {
77
78
  /**
78
79
  * Create a backup key recovery PSBT using utxolib (legacy implementation)
79
80
  */
80
- function createBackupKeyRecoveryPsbtUtxolib(network, rootWalletKeys, unspents, options) {
81
+ function createBackupKeyRecoveryPsbtUtxolib(coinName, rootWalletKeys, unspents, options) {
82
+ const network = (0, names_1.getNetworkFromCoinName)(coinName);
81
83
  const { feeRateSatVB, recoveryDestination, keyRecoveryServiceFee, keyRecoveryServiceFeeAddress } = options;
82
84
  const psbt = utxolib.bitgo.createPsbtForNetwork({ network });
83
85
  utxolib.bitgo.addXpubsToPsbt(psbt, rootWalletKeys);
@@ -108,8 +110,8 @@ function createBackupKeyRecoveryPsbtUtxolib(network, rootWalletKeys, unspents, o
108
110
  /**
109
111
  * Check if the network is a Zcash network
110
112
  */
111
- function isZcashNetwork(networkName) {
112
- return networkName === 'zcash' || networkName === 'zcashTest';
113
+ function isZcash(coinName) {
114
+ return coinName === 'zec' || coinName === 'tzec';
113
115
  }
114
116
  /**
115
117
  * Default block heights for Zcash networks if not provided.
@@ -117,8 +119,8 @@ function isZcashNetwork(networkName) {
117
119
  * TODO(BTC-2901): get the height from blockchair API instead of hardcoding.
118
120
  */
119
121
  const ZCASH_DEFAULT_BLOCK_HEIGHTS = {
120
- zcash: 3146400,
121
- zcashTest: 3536500,
122
+ zec: 3146400,
123
+ tzec: 3536500,
122
124
  };
123
125
  /**
124
126
  * Create an empty wasm-utxo BitGoPsbt for a given network.
@@ -129,16 +131,15 @@ const ZCASH_DEFAULT_BLOCK_HEIGHTS = {
129
131
  * @param options - Optional settings (e.g., blockHeight for Zcash)
130
132
  * @returns A wasm-utxo BitGoPsbt instance
131
133
  */
132
- function createEmptyWasmPsbt(network, rootWalletKeys, options) {
133
- const networkName = toNetworkName(network);
134
- if (isZcashNetwork(networkName)) {
134
+ function createEmptyWasmPsbt(coinName, rootWalletKeys, options) {
135
+ if (isZcash(coinName)) {
135
136
  // For Zcash, use ZcashBitGoPsbt which requires block height to determine consensus branch ID
136
- const blockHeight = options?.blockHeight ?? ZCASH_DEFAULT_BLOCK_HEIGHTS[networkName];
137
- return wasm_utxo_1.fixedScriptWallet.ZcashBitGoPsbt.createEmpty(networkName, rootWalletKeys, {
137
+ const blockHeight = options?.blockHeight ?? ZCASH_DEFAULT_BLOCK_HEIGHTS[coinName];
138
+ return wasm_utxo_1.fixedScriptWallet.ZcashBitGoPsbt.createEmpty(coinName, rootWalletKeys, {
138
139
  blockHeight,
139
140
  });
140
141
  }
141
- return wasm_utxo_1.fixedScriptWallet.BitGoPsbt.createEmpty(networkName, rootWalletKeys);
142
+ return wasm_utxo_1.fixedScriptWallet.BitGoPsbt.createEmpty(coinName, rootWalletKeys);
142
143
  }
143
144
  /**
144
145
  * Add wallet inputs from unspents to a wasm-utxo BitGoPsbt.
@@ -176,9 +177,9 @@ function addWalletInputsToWasmPsbt(wasmPsbt, unspents, rootWalletKeys) {
176
177
  * @param network - The network (used to convert address to script)
177
178
  * @returns The output index
178
179
  */
179
- function addOutputToWasmPsbt(wasmPsbt, address, value, network) {
180
- const script = utxolib.address.toOutputScript(address, network);
181
- return wasmPsbt.addOutput({ script: new Uint8Array(script), value });
180
+ function addOutputToWasmPsbt(wasmPsbt, address, value, coinName) {
181
+ const script = wasm_utxo_1.address.toOutputScriptWithCoin(address, coinName);
182
+ return wasmPsbt.addOutput({ script, value });
182
183
  }
183
184
  /**
184
185
  * Convert a wasm-utxo BitGoPsbt to a utxolib UtxoPsbt.
@@ -187,23 +188,25 @@ function addOutputToWasmPsbt(wasmPsbt, address, value, network) {
187
188
  * @param network - The network
188
189
  * @returns A utxolib UtxoPsbt
189
190
  */
190
- function wasmPsbtToUtxolibPsbt(wasmPsbt, network) {
191
- return utxolib.bitgo.createPsbtFromBuffer(Buffer.from(wasmPsbt.serialize()), network);
191
+ function toPsbtToUtxolibPsbt(wasmPsbt, coinName) {
192
+ if (wasmPsbt instanceof wasm_utxo_1.fixedScriptWallet.BitGoPsbt) {
193
+ const network = (0, names_1.getNetworkFromCoinName)(coinName);
194
+ return utxolib.bitgo.createPsbtFromBuffer(Buffer.from(wasmPsbt.serialize()), network);
195
+ }
196
+ return wasmPsbt;
192
197
  }
193
198
  /**
194
199
  * Create a backup key recovery PSBT using wasm-utxo
195
200
  */
196
- function createBackupKeyRecoveryPsbtWasm(network, rootWalletKeys, unspents, options) {
201
+ function createBackupKeyRecoveryPsbtWasm(coinName, rootWalletKeys, unspents, options) {
197
202
  const { feeRateSatVB, recoveryDestination, keyRecoveryServiceFee, keyRecoveryServiceFeeAddress } = options;
198
203
  // Create PSBT with wasm-utxo and add wallet inputs using shared utilities
199
- const wasmPsbt = createEmptyWasmPsbt(network, rootWalletKeys, { blockHeight: options.blockHeight });
204
+ const wasmPsbt = createEmptyWasmPsbt(coinName, rootWalletKeys, { blockHeight: options.blockHeight });
200
205
  addWalletInputsToWasmPsbt(wasmPsbt, unspents, rootWalletKeys);
201
206
  // Calculate dimensions using wasm-utxo Dimensions
202
- const recoveryOutputScript = utxolib.address.toOutputScript(recoveryDestination, network);
203
- let dimensions = wasm_utxo_1.fixedScriptWallet.Dimensions.fromPsbt(wasmPsbt).plus(wasm_utxo_1.fixedScriptWallet.Dimensions.fromOutput(new Uint8Array(recoveryOutputScript)));
207
+ let dimensions = wasm_utxo_1.fixedScriptWallet.Dimensions.fromPsbt(wasmPsbt).plus(wasm_utxo_1.fixedScriptWallet.Dimensions.fromOutput(recoveryDestination, coinName));
204
208
  if (keyRecoveryServiceFeeAddress) {
205
- const krsOutputScript = utxolib.address.toOutputScript(keyRecoveryServiceFeeAddress, network);
206
- dimensions = dimensions.plus(wasm_utxo_1.fixedScriptWallet.Dimensions.fromOutput(new Uint8Array(krsOutputScript)));
209
+ dimensions = dimensions.plus(wasm_utxo_1.fixedScriptWallet.Dimensions.fromOutput(keyRecoveryServiceFeeAddress, coinName));
207
210
  }
208
211
  const approximateFee = BigInt(dimensions.getVSize() * feeRateSatVB);
209
212
  const totalInputAmount = utxolib.bitgo.unspentSum(unspents, 'bigint');
@@ -212,12 +215,12 @@ function createBackupKeyRecoveryPsbtWasm(network, rootWalletKeys, unspents, opti
212
215
  throw new InsufficientFundsError(totalInputAmount, approximateFee, keyRecoveryServiceFee, recoveryAmount);
213
216
  }
214
217
  // Add outputs to wasm PSBT
215
- addOutputToWasmPsbt(wasmPsbt, recoveryDestination, recoveryAmount, network);
218
+ addOutputToWasmPsbt(wasmPsbt, recoveryDestination, recoveryAmount, coinName);
216
219
  if (keyRecoveryServiceFeeAddress) {
217
- addOutputToWasmPsbt(wasmPsbt, keyRecoveryServiceFeeAddress, keyRecoveryServiceFee, network);
220
+ addOutputToWasmPsbt(wasmPsbt, keyRecoveryServiceFeeAddress, keyRecoveryServiceFee, coinName);
218
221
  }
219
222
  // Convert to utxolib PSBT for signing and return
220
- return wasmPsbtToUtxolibPsbt(wasmPsbt, network);
223
+ return wasmPsbt;
221
224
  }
222
225
  /**
223
226
  * Create a backup key recovery PSBT.
@@ -228,23 +231,34 @@ function createBackupKeyRecoveryPsbtWasm(network, rootWalletKeys, unspents, opti
228
231
  * @param options - Options for creating the PSBT
229
232
  * @param backend - Which backend to use for PSBT creation (default: 'wasm-utxo')
230
233
  */
231
- function createBackupKeyRecoveryPsbt(network, rootWalletKeys, unspents, options, backend = 'wasm-utxo') {
234
+ function createBackupKeyRecoveryPsbt(coinName, rootWalletKeys, unspents, options, backend = 'wasm-utxo') {
232
235
  if (options.keyRecoveryServiceFee > 0 && !options.keyRecoveryServiceFeeAddress) {
233
236
  throw new Error('keyRecoveryServiceFeeAddress is required when keyRecoveryServiceFee is provided');
234
237
  }
235
238
  if (backend === 'wasm-utxo') {
236
- return createBackupKeyRecoveryPsbtWasm(network, rootWalletKeys, unspents, options);
239
+ return createBackupKeyRecoveryPsbtWasm(coinName, rootWalletKeys, unspents, options);
237
240
  }
238
241
  else {
239
- return createBackupKeyRecoveryPsbtUtxolib(network, rootWalletKeys, unspents, options);
242
+ return createBackupKeyRecoveryPsbtUtxolib(coinName, rootWalletKeys, unspents, options);
240
243
  }
241
244
  }
242
- function getRecoveryAmount(psbt, address) {
243
- const recoveryOutputScript = utxolib.address.toOutputScript(address, psbt.network);
244
- const output = psbt.txOutputs.find((o) => o.script.equals(recoveryOutputScript));
245
- if (!output) {
246
- throw new Error(`Recovery destination output not found in PSBT: ${address}`);
245
+ function getRecoveryAmount(psbt, walletKeys, address) {
246
+ if (psbt instanceof utxolib.bitgo.UtxoPsbt) {
247
+ const recoveryOutputScript = utxolib.address.toOutputScript(address, psbt.network);
248
+ const output = psbt.txOutputs.find((o) => o.script.equals(recoveryOutputScript));
249
+ if (!output) {
250
+ throw new Error(`Recovery destination output not found in PSBT: ${address}`);
251
+ }
252
+ return output.value;
253
+ }
254
+ if (psbt instanceof wasm_utxo_1.fixedScriptWallet.BitGoPsbt) {
255
+ const parsedOutputs = psbt.parseOutputsWithWalletKeys(walletKeys);
256
+ const recoveryOutput = parsedOutputs.find((o) => o.address === address);
257
+ if (!recoveryOutput) {
258
+ throw new Error(`Recovery destination output not found in PSBT: ${address}`);
259
+ }
260
+ return recoveryOutput.value;
247
261
  }
248
- return output.value;
262
+ throw new Error('Invalid PSBT type');
249
263
  }
250
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9yZWNvdmVyeS9wc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLHdDQUlDO0FBS0Qsc0NBTUM7QUErR0Qsa0RBZ0JDO0FBVUQsOERBNEJDO0FBV0Qsa0RBUUM7QUFTRCxzREFLQztBQXdERCxrRUFnQkM7QUFFRCw4Q0FPQztBQTNURCw4REFBZ0Q7QUFDaEQsbURBQWtEO0FBQ2xELGdEQUFvRTtBQUtwRSxNQUFNLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQVcvRDs7R0FFRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxLQUFnQjtJQUM3QyxPQUFPLENBQ0osY0FBb0MsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUssb0JBQTBDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUNySCxDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsYUFBYSxDQUFDLE9BQXdCO0lBQ3BELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sc0JBQXVCLFNBQVEsS0FBSztJQUN4QyxZQUNTLGdCQUF3QixFQUN4QixjQUFzQixFQUN0QixNQUFjLEVBQ2QsY0FBc0I7UUFFN0IsS0FBSyxDQUNILGlGQUFpRjtZQUMvRSwrQkFBK0IsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUk7WUFDOUQsdURBQXVELGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNsRixtQkFBbUIsTUFBTSxD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QUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBEaW1lbnNpb25zIH0gZnJvbSAnQGJpdGdvLWJldGEvdW5zcGVudHMnO1xuaW1wb3J0IHsgZml4ZWRTY3JpcHRXYWxsZXQsIHV0eG9saWJDb21wYXQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxudHlwZSBSb290V2FsbGV0S2V5cyA9IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXM7XG50eXBlIFdhbGxldFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4gPSB1dHhvbGliLmJpdGdvLldhbGxldFVuc3BlbnQ8VE51bWJlcj47XG5cbmNvbnN0IHsgY2hhaW5Db2Rlc1AydHIsIGNoYWluQ29kZXNQMnRyTXVzaWcyIH0gPSB1dHhvbGliLmJpdGdvO1xuXG50eXBlIENoYWluQ29kZSA9IHV0eG9saWIuYml0Z28uQ2hhaW5Db2RlO1xuXG4vKipcbiAqIEJhY2tlbmQgdG8gdXNlIGZvciBQU0JUIGNyZWF0aW9uLlxuICogLSAnd2FzbS11dHhvJzogVXNlIHdhc20tdXR4byBmb3IgUFNCVCBjcmVhdGlvbiAoZGVmYXVsdClcbiAqIC0gJ3V0eG9saWInOiBVc2UgdXR4b2xpYiBmb3IgUFNCVCBjcmVhdGlvbiAobGVnYWN5KVxuICovXG5leHBvcnQgdHlwZSBQc2J0QmFja2VuZCA9ICd3YXNtLXV0eG8nIHwgJ3V0eG9saWInO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgY2hhaW4gY29kZSBpcyBmb3IgYSB0YXByb290IHNjcmlwdCB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RhcHJvb3RDaGFpbihjaGFpbjogQ2hhaW5Db2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgKGNoYWluQ29kZXNQMnRyIGFzIHJlYWRvbmx5IG51bWJlcltdKS5pbmNsdWRlcyhjaGFpbikgfHwgKGNoYWluQ29kZXNQMnRyTXVzaWcyIGFzIHJlYWRvbmx5IG51bWJlcltdKS5pbmNsdWRlcyhjaGFpbilcbiAgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHV0eG9saWIgTmV0d29yayB0byB3YXNtLXV0eG8gbmV0d29yayBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b05ldHdvcmtOYW1lKG5ldHdvcms6IHV0eG9saWIuTmV0d29yayk6IHV0eG9saWJDb21wYXQuVXR4b2xpYk5hbWUge1xuICBjb25zdCBuZXR3b3JrTmFtZSA9IHV0eG9saWIuZ2V0TmV0d29ya05hbWUobmV0d29yayk7XG4gIGlmICghbmV0d29ya05hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmV0d29ya2ApO1xuICB9XG4gIHJldHVybiBuZXR3b3JrTmFtZTtcbn1cblxuY2xhc3MgSW5zdWZmaWNpZW50RnVuZHNFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRvdGFsSW5wdXRBbW91bnQ6IGJpZ2ludCxcbiAgICBwdWJsaWMgYXBwcm94aW1hdGVGZWU6IGJpZ2ludCxcbiAgICBwdWJsaWMga3JzRmVlOiBiaWdpbnQsXG4gICAgcHVibGljIHJlY292ZXJ5QW1vdW50OiBiaWdpbnRcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVGhpcyB3YWxsZXQncyBiYWxhbmNlIGlzIHRvbyBsb3cgdG8gcGF5IHRoZSBmZWVzIHNwZWNpZmllZCBieSB0aGUgS1JTIHByb3ZpZGVyLmAgK1xuICAgICAgICBgRXhpc3RpbmcgYmFsYW5jZSBvbiB3YWxsZXQ6ICR7dG90YWxJbnB1dEFtb3VudC50b1N0cmluZygpfS4gYCArXG4gICAgICAgIGBFc3RpbWF0ZWQgbmV0d29yayBmZWUgZm9yIHRoZSByZWNvdmVyeSB0cmFuc2FjdGlvbjogJHthcHByb3hpbWF0ZUZlZS50b1N0cmluZygpfWAgK1xuICAgICAgICBgS1JTIGZlZSB0byBwYXk6ICR7a3JzRmVlLnRvU3RyaW5nKCl9LiBgICtcbiAgICAgICAgYEFmdGVyIGRlZHVjdGluZyBmZWVzLCB5b3VyIHRvdGFsIHJlY292ZXJhYmxlIGJhbGFuY2UgaXMgJHtyZWNvdmVyeUFtb3VudC50b1N0cmluZygpfWBcbiAgICApO1xuICB9XG59XG5cbmludGVyZmFjZSBDcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRPcHRpb25zIHtcbiAgZmVlUmF0ZVNhdFZCOiBudW1iZXI7XG4gIHJlY292ZXJ5RGVzdGluYXRpb246IHN0cmluZztcbiAga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlOiBiaWdpbnQ7XG4gIGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3M6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIEJsb2NrIGhlaWdodCBmb3IgWmNhc2ggbmV0d29ya3MgKHJlcXVpcmVkIHRvIGRldGVybWluZSBjb25zZW5zdXMgYnJhbmNoIElEKSAqL1xuICBibG9ja0hlaWdodD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBiYWNrdXAga2V5IHJlY292ZXJ5IFBTQlQgdXNpbmcgdXR4b2xpYiAobGVnYWN5IGltcGxlbWVudGF0aW9uKVxuICovXG5mdW5jdGlvbiBjcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRVdHhvbGliKFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmssXG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyxcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdLFxuICBvcHRpb25zOiBDcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRPcHRpb25zXG4pOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHtcbiAgY29uc3QgeyBmZWVSYXRlU2F0VkIsIHJlY292ZXJ5RGVzdGluYXRpb24sIGtleVJlY292ZXJ5U2VydmljZUZlZSwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcyB9ID0gb3B0aW9ucztcblxuICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7IG5ldHdvcmsgfSk7XG4gIHV0eG9saWIuYml0Z28uYWRkWHB1YnNUb1BzYnQocHNidCwgcm9vdFdhbGxldEtleXMpO1xuICB1bnNwZW50cy5mb3JFYWNoKCh1bnNwZW50KSA9PiB7XG4gICAgdXR4b2xpYi5iaXRnby5hZGRXYWxsZXRVbnNwZW50VG9Qc2J0KHBzYnQsIHVuc3BlbnQsIHJvb3RXYWxsZXRLZXlzLCAndXNlcicsICdiYWNrdXAnKTtcbiAgfSk7XG5cbiAgbGV0IGRpbWVuc2lvbnMgPSBEaW1lbnNpb25zLmZyb21Qc2J0KHBzYnQpLnBsdXMoXG4gICAgRGltZW5zaW9ucy5mcm9tT3V0cHV0KHsgc2NyaXB0OiB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQocmVjb3ZlcnlEZXN0aW5hdGlvbiwgbmV0d29yaykgfSlcbiAgKTtcblxuICBpZiAoa2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcykge1xuICAgIGRpbWVuc2lvbnMgPSBkaW1lbnNpb25zLnBsdXMoXG4gICAgICBEaW1lbnNpb25zLmZyb21PdXRwdXQoe1xuICAgICAgICBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzLCBuZXR3b3JrKSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGFwcHJveGltYXRlRmVlID0gQmlnSW50KGRpbWVuc2lvbnMuZ2V0VlNpemUoKSAqIGZlZVJhdGVTYXRWQik7XG4gIGNvbnN0IHRvdGFsSW5wdXRBbW91bnQgPSB1dHhvbGliLmJpdGdvLnVuc3BlbnRTdW0odW5zcGVudHMsICdiaWdpbnQnKTtcbiAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB0b3RhbElucHV0QW1vdW50IC0gYXBwcm94aW1hdGVGZWUgLSBrZXlSZWNvdmVyeVNlcnZpY2VGZWU7XG5cbiAgaWYgKHJlY292ZXJ5QW1vdW50IDwgQmlnSW50KDApKSB7XG4gICAgdGhyb3cgbmV3IEluc3VmZmljaWVudEZ1bmRzRXJyb3IodG90YWxJbnB1dEFtb3VudCwgYXBwcm94aW1hdGVGZWUsIGtleVJlY292ZXJ5U2VydmljZUZlZSwgcmVjb3ZlcnlBbW91bnQpO1xuICB9XG5cbiAgcHNidC5hZGRPdXRwdXQoeyBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChyZWNvdmVyeURlc3RpbmF0aW9uLCBuZXR3b3JrKSwgdmFsdWU6IHJlY292ZXJ5QW1vdW50IH0pO1xuXG4gIGlmIChrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzKSB7XG4gICAgcHNidC5hZGRPdXRwdXQoe1xuICAgICAgc2NyaXB0OiB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoa2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcywgbmV0d29yayksXG4gICAgICB2YWx1ZToga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHBzYnQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIG5ldHdvcmsgaXMgYSBaY2FzaCBuZXR3b3JrXG4gKi9cbmZ1bmN0aW9uIGlzWmNhc2hOZXR3b3JrKG5ldHdvcmtOYW1lOiB1dHhvbGliQ29tcGF0LlV0eG9saWJOYW1lKTogYm9vbGVhbiB7XG4gIHJldHVybiBuZXR3b3JrTmFtZSA9PT0gJ3pjYXNoJyB8fCBuZXR3b3JrTmFtZSA9PT0gJ3pjYXNoVGVzdCc7XG59XG5cbi8qKlxuICogRGVmYXVsdCBibG9jayBoZWlnaHRzIGZvciBaY2FzaCBuZXR3b3JrcyBpZiBub3QgcHJvdmlkZWQuXG4gKiBUaGVzZSBzaG91bGQgYmUgc2V0IHRvIGEgaGVpZ2h0IGFmdGVyIHRoZSBsYXRlc3QgbmV0d29yayB1cGdyYWRlLlxuICogVE9ETyhCVEMtMjkwMSk6IGdldCB0aGUgaGVpZ2h0IGZyb20gYmxvY2tjaGFpciBBUEkgaW5zdGVhZCBvZiBoYXJkY29kaW5nLlxuICovXG5jb25zdCBaQ0FTSF9ERUZBVUxUX0JMT0NLX0hFSUdIVFM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gIHpjYXNoOiAzMTQ2NDAwLFxuICB6Y2FzaFRlc3Q6IDM1MzY1MDAsXG59O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuIGVtcHR5IHdhc20tdXR4byBQU0JUXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRW1wdHlXYXNtUHNidE9wdGlvbnMge1xuICAvKiogQmxvY2sgaGVpZ2h0IGZvciBaY2FzaCBuZXR3b3JrcyAocmVxdWlyZWQgdG8gZGV0ZXJtaW5lIGNvbnNlbnN1cyBicmFuY2ggSUQpICovXG4gIGJsb2NrSGVpZ2h0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbXB0eSB3YXNtLXV0eG8gQml0R29Qc2J0IGZvciBhIGdpdmVuIG5ldHdvcmsuXG4gKiBIYW5kbGVzIFpjYXNoIG5ldHdvcmtzIHNwZWNpYWxseSBieSB1c2luZyBaY2FzaEJpdEdvUHNidC5cbiAqXG4gKiBAcGFyYW0gbmV0d29yayAtIFRoZSBuZXR3b3JrIGZvciB0aGUgUFNCVFxuICogQHBhcmFtIHJvb3RXYWxsZXRLZXlzIC0gVGhlIHdhbGxldCBrZXlzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHNldHRpbmdzIChlLmcuLCBibG9ja0hlaWdodCBmb3IgWmNhc2gpXG4gKiBAcmV0dXJucyBBIHdhc20tdXR4byBCaXRHb1BzYnQgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVtcHR5V2FzbVBzYnQoXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICBvcHRpb25zPzogQ3JlYXRlRW1wdHlXYXNtUHNidE9wdGlvbnNcbik6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCB7XG4gIGNvbnN0IG5ldHdvcmtOYW1lID0gdG9OZXR3b3JrTmFtZShuZXR3b3JrKTtcblxuICBpZiAoaXNaY2FzaE5ldHdvcmsobmV0d29ya05hbWUpKSB7XG4gICAgLy8gRm9yIFpjYXNoLCB1c2UgWmNhc2hCaXRHb1BzYnQgd2hpY2ggcmVxdWlyZXMgYmxvY2sgaGVpZ2h0IHRvIGRldGVybWluZSBjb25zZW5zdXMgYnJhbmNoIElEXG4gICAgY29uc3QgYmxvY2tIZWlnaHQgPSBvcHRpb25zPy5ibG9ja0hlaWdodCA/PyBaQ0FTSF9ERUZBVUxUX0JMT0NLX0hFSUdIVFNbbmV0d29ya05hbWVdO1xuICAgIHJldHVybiBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaEJpdEdvUHNidC5jcmVhdGVFbXB0eShuZXR3b3JrTmFtZSBhcyAnemNhc2gnIHwgJ3pjYXNoVGVzdCcsIHJvb3RXYWxsZXRLZXlzLCB7XG4gICAgICBibG9ja0hlaWdodCxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQuY3JlYXRlRW1wdHkobmV0d29ya05hbWUsIHJvb3RXYWxsZXRLZXlzKTtcbn1cblxuLyoqXG4gKiBBZGQgd2FsbGV0IGlucHV0cyBmcm9tIHVuc3BlbnRzIHRvIGEgd2FzbS11dHhvIEJpdEdvUHNidC5cbiAqIEhhbmRsZXMgdGFwcm9vdCBpbnB1dHMgYnkgc2V0dGluZyB0aGUgYXBwcm9wcmlhdGUgc2lnblBhdGguXG4gKlxuICogQHBhcmFtIHdhc21Qc2J0IC0gVGhlIHdhc20tdXR4byBCaXRHb1BzYnQgdG8gYWRkIGlucHV0cyB0b1xuICogQHBhcmFtIHVuc3BlbnRzIC0gVGhlIHdhbGxldCB1bnNwZW50cyB0byBhZGQgYXMgaW5wdXRzXG4gKiBAcGFyYW0gcm9vdFdhbGxldEtleXMgLSBUaGUgd2FsbGV0IGtleXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFdhbGxldElucHV0c1RvV2FzbVBzYnQoXG4gIHdhc21Qc2J0OiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQsXG4gIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PGJpZ2ludD5bXSxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzXG4pOiB2b2lkIHtcbiAgdW5zcGVudHMuZm9yRWFjaCgodW5zcGVudCkgPT4ge1xuICAgIGNvbnN0IHsgdHhpZCwgdm91dCB9ID0gdXR4b2xpYi5iaXRnby5wYXJzZU91dHB1dElkKHVuc3BlbnQuaWQpO1xuICAgIGNvbnN0IHNpZ25QYXRoOiBmaXhlZFNjcmlwdFdhbGxldC5TaWduUGF0aCB8IHVuZGVmaW5lZCA9IGlzVGFwcm9vdENoYWluKHVuc3BlbnQuY2hhaW4pXG4gICAgICA/IHsgc2lnbmVyOiAndXNlcicsIGNvc2lnbmVyOiAnYmFja3VwJyB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIHByZXZUeCBtYXkgYmUgYWRkZWQgZHluYW1pY2FsbHkgaW4gYmFja3VwS2V5UmVjb3ZlcnkgZm9yIG5vbi1zZWd3aXQgaW5wdXRzXG4gICAgY29uc3QgcHJldlR4ID0gKHVuc3BlbnQgYXMgV2FsbGV0VW5zcGVudDxiaWdpbnQ+ICYgeyBwcmV2VHg/OiBCdWZmZXIgfSkucHJldlR4O1xuXG4gICAgd2FzbVBzYnQuYWRkV2FsbGV0SW5wdXQoXG4gICAgICB7XG4gICAgICAgIHR4aWQsXG4gICAgICAgIHZvdXQsXG4gICAgICAgIHZhbHVlOiB1bnNwZW50LnZhbHVlLFxuICAgICAgICBwcmV2VHg6IHByZXZUeCxcbiAgICAgIH0sXG4gICAgICByb290V2FsbGV0S2V5cyxcbiAgICAgIHtcbiAgICAgICAgc2NyaXB0SWQ6IHsgY2hhaW46IHVuc3BlbnQuY2hhaW4sIGluZGV4OiB1bnNwZW50LmluZGV4IH0sXG4gICAgICAgIHNpZ25QYXRoLFxuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEFkZCBhbiBvdXRwdXQgdG8gYSB3YXNtLXV0eG8gQml0R29Qc2J0LlxuICpcbiAqIEBwYXJhbSB3YXNtUHNidCAtIFRoZSB3YXNtLXV0eG8gQml0R29Qc2J0IHRvIGFkZCB0aGUgb3V0cHV0IHRvXG4gKiBAcGFyYW0gYWRkcmVzcyAtIFRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgb3V0cHV0IHZhbHVlIGluIHNhdG9zaGlzXG4gKiBAcGFyYW0gbmV0d29yayAtIFRoZSBuZXR3b3JrICh1c2VkIHRvIGNvbnZlcnQgYWRkcmVzcyB0byBzY3JpcHQpXG4gKiBAcmV0dXJucyBUaGUgb3V0cHV0IGluZGV4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRPdXRwdXRUb1dhc21Qc2J0KFxuICB3YXNtUHNidDogZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0LFxuICBhZGRyZXNzOiBzdHJpbmcsXG4gIHZhbHVlOiBiaWdpbnQsXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29ya1xuKTogbnVtYmVyIHtcbiAgY29uc3Qgc2NyaXB0ID0gdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGFkZHJlc3MsIG5ldHdvcmspO1xuICByZXR1cm4gd2FzbVBzYnQuYWRkT3V0cHV0KHsgc2NyaXB0OiBuZXcgVWludDhBcnJheShzY3JpcHQpLCB2YWx1ZSB9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgd2FzbS11dHhvIEJpdEdvUHNidCB0byBhIHV0eG9saWIgVXR4b1BzYnQuXG4gKlxuICogQHBhcmFtIHdhc21Qc2J0IC0gVGhlIHdhc20tdXR4byBCaXRHb1BzYnQgdG8gY29udmVydFxuICogQHBhcmFtIG5ldHdvcmsgLSBUaGUgbmV0d29ya1xuICogQHJldHVybnMgQSB1dHhvbGliIFV0eG9Qc2J0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXNtUHNidFRvVXR4b2xpYlBzYnQoXG4gIHdhc21Qc2J0OiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQsXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29ya1xuKTogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB7XG4gIHJldHVybiB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKHdhc21Qc2J0LnNlcmlhbGl6ZSgpKSwgbmV0d29yayk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYmFja3VwIGtleSByZWNvdmVyeSBQU0JUIHVzaW5nIHdhc20tdXR4b1xuICovXG5mdW5jdGlvbiBjcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRXYXNtKFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmssXG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyxcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdLFxuICBvcHRpb25zOiBDcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRPcHRpb25zXG4pOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHtcbiAgY29uc3QgeyBmZWVSYXRlU2F0VkIsIHJlY292ZXJ5RGVzdGluYXRpb24sIGtleVJlY292ZXJ5U2VydmljZUZlZSwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcyB9ID0gb3B0aW9ucztcblxuICAvLyBDcmVhdGUgUFNCVCB3aXRoIHdhc20tdXR4byBhbmQgYWRkIHdhbGxldCBpbnB1dHMgdXNpbmcgc2hhcmVkIHV0aWxpdGllc1xuICBjb25zdCB3YXNtUHNidCA9IGNyZWF0ZUVtcHR5V2FzbVBzYnQobmV0d29yaywgcm9vdFdhbGxldEtleXMsIHsgYmxvY2tIZWlnaHQ6IG9wdGlvbnMuYmxvY2tIZWlnaHQgfSk7XG4gIGFkZFdhbGxldElucHV0c1RvV2FzbVBzYnQod2FzbVBzYnQsIHVuc3BlbnRzLCByb290V2FsbGV0S2V5cyk7XG5cbiAgLy8gQ2FsY3VsYXRlIGRpbWVuc2lvbnMgdXNpbmcgd2FzbS11dHhvIERpbWVuc2lvbnNcbiAgY29uc3QgcmVjb3ZlcnlPdXRwdXRTY3JpcHQgPSB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQocmVjb3ZlcnlEZXN0aW5hdGlvbiwgbmV0d29yayk7XG4gIGxldCBkaW1lbnNpb25zID0gZml4ZWRTY3JpcHRXYWxsZXQuRGltZW5zaW9ucy5mcm9tUHNidCh3YXNtUHNidCkucGx1cyhcbiAgICBmaXhlZFNjcmlwdFdhbGxldC5EaW1lbnNpb25zLmZyb21PdXRwdXQobmV3IFVpbnQ4QXJyYXkocmVjb3ZlcnlPdXRwdXRTY3JpcHQpKVxuICApO1xuXG4gIGlmIChrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzKSB7XG4gICAgY29uc3Qga3JzT3V0cHV0U2NyaXB0ID0gdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MsIG5ldHdvcmspO1xuICAgIGRpbWVuc2lvbnMgPSBkaW1lbnNpb25zLnBsdXMoZml4ZWRTY3JpcHRXYWxsZXQuRGltZW5zaW9ucy5mcm9tT3V0cHV0KG5ldyBVaW50OEFycmF5KGtyc091dHB1dFNjcmlwdCkpKTtcbiAgfVxuXG4gIGNvbnN0IGFwcHJveGltYXRlRmVlID0gQmlnSW50KGRpbWVuc2lvbnMuZ2V0VlNpemUoKSAqIGZlZVJhdGVTYXRWQik7XG4gIGNvbnN0IHRvdGFsSW5wdXRBbW91bnQgPSB1dHhvbGliLmJpdGdvLnVuc3BlbnRTdW0odW5zcGVudHMsICdiaWdpbnQnKTtcbiAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB0b3RhbElucHV0QW1vdW50IC0gYXBwcm94aW1hdGVGZWUgLSBrZXlSZWNvdmVyeVNlcnZpY2VGZWU7XG5cbiAgaWYgKHJlY292ZXJ5QW1vdW50IDwgQmlnSW50KDApKSB7XG4gICAgdGhyb3cgbmV3IEluc3VmZmljaWVudEZ1bmRzRXJyb3IodG90YWxJbnB1dEFtb3VudCwgYXBwcm94aW1hdGVGZWUsIGtleVJlY292ZXJ5U2VydmljZUZlZSwgcmVjb3ZlcnlBbW91bnQpO1xuICB9XG5cbiAgLy8gQWRkIG91dHB1dHMgdG8gd2FzbSBQU0JUXG4gIGFkZE91dHB1dFRvV2FzbVBzYnQod2FzbVBzYnQsIHJlY292ZXJ5RGVzdGluYXRpb24sIHJlY292ZXJ5QW1vdW50LCBuZXR3b3JrKTtcblxuICBpZiAoa2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcykge1xuICAgIGFkZE91dHB1dFRvV2FzbVBzYnQod2FzbVBzYnQsIGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MsIGtleVJlY292ZXJ5U2VydmljZUZlZSwgbmV0d29yayk7XG4gIH1cblxuICAvLyBDb252ZXJ0IHRvIHV0eG9saWIgUFNCVCBmb3Igc2lnbmluZyBhbmQgcmV0dXJuXG4gIHJldHVybiB3YXNtUHNidFRvVXR4b2xpYlBzYnQod2FzbVBzYnQsIG5ldHdvcmspO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJhY2t1cCBrZXkgcmVjb3ZlcnkgUFNCVC5cbiAqXG4gKiBAcGFyYW0gbmV0d29yayAtIFRoZSBuZXR3b3JrIGZvciB0aGUgUFNCVFxuICogQHBhcmFtIHJvb3RXYWxsZXRLZXlzIC0gVGhlIHdhbGxldCBrZXlzXG4gKiBAcGFyYW0gdW5zcGVudHMgLSBUaGUgdW5zcGVudHMgdG8gaW5jbHVkZSBpbiB0aGUgUFNCVFxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciBjcmVhdGluZyB0aGUgUFNCVFxuICogQHBhcmFtIGJhY2tlbmQgLSBXaGljaCBiYWNrZW5kIHRvIHVzZSBmb3IgUFNCVCBjcmVhdGlvbiAoZGVmYXVsdDogJ3dhc20tdXR4bycpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnQoXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10sXG4gIG9wdGlvbnM6IENyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidE9wdGlvbnMsXG4gIGJhY2tlbmQ6IFBzYnRCYWNrZW5kID0gJ3dhc20tdXR4bydcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBpZiAob3B0aW9ucy5rZXlSZWNvdmVyeVNlcnZpY2VGZWUgPiAwICYmICFvcHRpb25zLmtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MgaXMgcmVxdWlyZWQgd2hlbiBrZXlSZWNvdmVyeVNlcnZpY2VGZWUgaXMgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGlmIChiYWNrZW5kID09PSAnd2FzbS11dHhvJykge1xuICAgIHJldHVybiBjcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRXYXNtKG5ldHdvcmssIHJvb3RXYWxsZXRLZXlzLCB1bnNwZW50cywgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidFV0eG9saWIobmV0d29yaywgcm9vdFdhbGxldEtleXMsIHVuc3BlbnRzLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjb3ZlcnlBbW91bnQocHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCwgYWRkcmVzczogc3RyaW5nKTogYmlnaW50IHtcbiAgY29uc3QgcmVjb3ZlcnlPdXRwdXRTY3JpcHQgPSB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgcHNidC5uZXR3b3JrKTtcbiAgY29uc3Qgb3V0cHV0ID0gcHNidC50eE91dHB1dHMuZmluZCgobykgPT4gby5zY3JpcHQuZXF1YWxzKHJlY292ZXJ5T3V0cHV0U2NyaXB0KSk7XG4gIGlmICghb3V0cHV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZWNvdmVyeSBkZXN0aW5hdGlvbiBvdXRwdXQgbm90IGZvdW5kIGluIFBTQlQ6ICR7YWRkcmVzc31gKTtcbiAgfVxuICByZXR1cm4gb3V0cHV0LnZhbHVlO1xufVxuIl19
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9yZWNvdmVyeS9wc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBLHdDQUlDO0FBS0Qsc0NBTUM7QUFnSEQsa0RBY0M7QUFVRCw4REE0QkM7QUFXRCxrREFRQztBQVNELGtEQVNDO0FBc0RELGtFQWdCQztBQUVELDhDQXNCQztBQTdVRCw4REFBZ0Q7QUFDaEQsbURBQWtEO0FBQ2xELGdEQUFzRztBQUV0RyxvQ0FBa0Q7QUFLbEQsTUFBTSxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFXL0Q7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQUMsS0FBZ0I7SUFDN0MsT0FBTyxDQUNKLGNBQW9DLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFLLG9CQUEwQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDckgsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxPQUF3QjtJQUNwRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLHNCQUF1QixTQUFRLEtBQUs7SUFDeEMsWUFDUyxnQkFBd0IsRUFDeEIsY0FBc0IsRUFDdEIsTUFBYyxFQUNkLGNBQXNCO1FBRTdCLEtBQUssQ0FDSCxpRkFBaUY7WUFDL0UsK0JBQStCLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJO1lBQzlELHVEQUF1RCxjQUFjLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDbEYs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QyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxJQUFJLFlBQVksNkJBQWlCLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDaEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IERpbWVuc2lvbnMgfSBmcm9tICdAYml0Z28tYmV0YS91bnNwZW50cyc7XG5pbXBvcnQgeyBDb2luTmFtZSwgZml4ZWRTY3JpcHRXYWxsZXQsIHV0eG9saWJDb21wYXQsIGFkZHJlc3MgYXMgd2FzbUFkZHJlc3MgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxuaW1wb3J0IHsgZ2V0TmV0d29ya0Zyb21Db2luTmFtZSB9IGZyb20gJy4uL25hbWVzJztcblxudHlwZSBSb290V2FsbGV0S2V5cyA9IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXM7XG50eXBlIFdhbGxldFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4gPSB1dHhvbGliLmJpdGdvLldhbGxldFVuc3BlbnQ8VE51bWJlcj47XG5cbmNvbnN0IHsgY2hhaW5Db2Rlc1AydHIsIGNoYWluQ29kZXNQMnRyTXVzaWcyIH0gPSB1dHhvbGliLmJpdGdvO1xuXG50eXBlIENoYWluQ29kZSA9IHV0eG9saWIuYml0Z28uQ2hhaW5Db2RlO1xuXG4vKipcbiAqIEJhY2tlbmQgdG8gdXNlIGZvciBQU0JUIGNyZWF0aW9uLlxuICogLSAnd2FzbS11dHhvJzogVXNlIHdhc20tdXR4byBmb3IgUFNCVCBjcmVhdGlvbiAoZGVmYXVsdClcbiAqIC0gJ3V0eG9saWInOiBVc2UgdXR4b2xpYiBmb3IgUFNCVCBjcmVhdGlvbiAobGVnYWN5KVxuICovXG5leHBvcnQgdHlwZSBQc2J0QmFja2VuZCA9ICd3YXNtLXV0eG8nIHwgJ3V0eG9saWInO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgY2hhaW4gY29kZSBpcyBmb3IgYSB0YXByb290IHNjcmlwdCB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RhcHJvb3RDaGFpbihjaGFpbjogQ2hhaW5Db2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgKGNoYWluQ29kZXNQMnRyIGFzIHJlYWRvbmx5IG51bWJlcltdKS5pbmNsdWRlcyhjaGFpbikgfHwgKGNoYWluQ29kZXNQMnRyTXVzaWcyIGFzIHJlYWRvbmx5IG51bWJlcltdKS5pbmNsdWRlcyhjaGFpbilcbiAgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHV0eG9saWIgTmV0d29yayB0byB3YXNtLXV0eG8gbmV0d29yayBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b05ldHdvcmtOYW1lKG5ldHdvcms6IHV0eG9saWIuTmV0d29yayk6IHV0eG9saWJDb21wYXQuVXR4b2xpYk5hbWUge1xuICBjb25zdCBuZXR3b3JrTmFtZSA9IHV0eG9saWIuZ2V0TmV0d29ya05hbWUobmV0d29yayk7XG4gIGlmICghbmV0d29ya05hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmV0d29ya2ApO1xuICB9XG4gIHJldHVybiBuZXR3b3JrTmFtZTtcbn1cblxuY2xhc3MgSW5zdWZmaWNpZW50RnVuZHNFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRvdGFsSW5wdXRBbW91bnQ6IGJpZ2ludCxcbiAgICBwdWJsaWMgYXBwcm94aW1hdGVGZWU6IGJpZ2ludCxcbiAgICBwdWJsaWMga3JzRmVlOiBiaWdpbnQsXG4gICAgcHVibGljIHJlY292ZXJ5QW1vdW50OiBiaWdpbnRcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVGhpcyB3YWxsZXQncyBiYWxhbmNlIGlzIHRvbyBsb3cgdG8gcGF5IHRoZSBmZWVzIHNwZWNpZmllZCBieSB0aGUgS1JTIHByb3ZpZGVyLmAgK1xuICAgICAgICBgRXhpc3RpbmcgYmFsYW5jZSBvbiB3YWxsZXQ6ICR7dG90YWxJbnB1dEFtb3VudC50b1N0cmluZygpfS4gYCArXG4gICAgICAgIGBFc3RpbWF0ZWQgbmV0d29yayBmZWUgZm9yIHRoZSByZWNvdmVyeSB0cmFuc2FjdGlvbjogJHthcHByb3hpbWF0ZUZlZS50b1N0cmluZygpfWAgK1xuICAgICAgICBgS1JTIGZlZSB0byBwYXk6ICR7a3JzRmVlLnRvU3RyaW5nKCl9LiBgICtcbiAgICAgICAgYEFmdGVyIGRlZHVjdGluZyBmZWVzLCB5b3VyIHRvdGFsIHJlY292ZXJhYmxlIGJhbGFuY2UgaXMgJHtyZWNvdmVyeUFtb3VudC50b1N0cmluZygpfWBcbiAgICApO1xuICB9XG59XG5cbmludGVyZmFjZSBDcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRPcHRpb25zIHtcbiAgZmVlUmF0ZVNhdFZCOiBudW1iZXI7XG4gIHJlY292ZXJ5RGVzdGluYXRpb246IHN0cmluZztcbiAga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlOiBiaWdpbnQ7XG4gIGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3M6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIEJsb2NrIGhlaWdodCBmb3IgWmNhc2ggbmV0d29ya3MgKHJlcXVpcmVkIHRvIGRldGVybWluZSBjb25zZW5zdXMgYnJhbmNoIElEKSAqL1xuICBibG9ja0hlaWdodD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBiYWNrdXAga2V5IHJlY292ZXJ5IFBTQlQgdXNpbmcgdXR4b2xpYiAobGVnYWN5IGltcGxlbWVudGF0aW9uKVxuICovXG5mdW5jdGlvbiBjcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRVdHhvbGliKFxuICBjb2luTmFtZTogQ29pbk5hbWUsXG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyxcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdLFxuICBvcHRpb25zOiBDcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRPcHRpb25zXG4pOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHtcbiAgY29uc3QgbmV0d29yayA9IGdldE5ldHdvcmtGcm9tQ29pbk5hbWUoY29pbk5hbWUpO1xuICBjb25zdCB7IGZlZVJhdGVTYXRWQiwgcmVjb3ZlcnlEZXN0aW5hdGlvbiwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yayB9KTtcbiAgdXR4b2xpYi5iaXRnby5hZGRYcHVic1RvUHNidChwc2J0LCByb290V2FsbGV0S2V5cyk7XG4gIHVuc3BlbnRzLmZvckVhY2goKHVuc3BlbnQpID0+IHtcbiAgICB1dHhvbGliLmJpdGdvLmFkZFdhbGxldFVuc3BlbnRUb1BzYnQocHNidCwgdW5zcGVudCwgcm9vdFdhbGxldEtleXMsICd1c2VyJywgJ2JhY2t1cCcpO1xuICB9KTtcblxuICBsZXQgZGltZW5zaW9ucyA9IERpbWVuc2lvbnMuZnJvbVBzYnQocHNidCkucGx1cyhcbiAgICBEaW1lbnNpb25zLmZyb21PdXRwdXQoeyBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChyZWNvdmVyeURlc3RpbmF0aW9uLCBuZXR3b3JrKSB9KVxuICApO1xuXG4gIGlmIChrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzKSB7XG4gICAgZGltZW5zaW9ucyA9IGRpbWVuc2lvbnMucGx1cyhcbiAgICAgIERpbWVuc2lvbnMuZnJvbU91dHB1dCh7XG4gICAgICAgIHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MsIG5ldHdvcmspLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgY29uc3QgYXBwcm94aW1hdGVGZWUgPSBCaWdJbnQoZGltZW5zaW9ucy5nZXRWU2l6ZSgpICogZmVlUmF0ZVNhdFZCKTtcbiAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IHV0eG9saWIuYml0Z28udW5zcGVudFN1bSh1bnNwZW50cywgJ2JpZ2ludCcpO1xuICBjb25zdCByZWNvdmVyeUFtb3VudCA9IHRvdGFsSW5wdXRBbW91bnQgLSBhcHByb3hpbWF0ZUZlZSAtIGtleVJlY292ZXJ5U2VydmljZUZlZTtcblxuICBpZiAocmVjb3ZlcnlBbW91bnQgPCBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgSW5zdWZmaWNpZW50RnVuZHNFcnJvcih0b3RhbElucHV0QW1vdW50LCBhcHByb3hpbWF0ZUZlZSwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlLCByZWNvdmVyeUFtb3VudCk7XG4gIH1cblxuICBwc2J0LmFkZE91dHB1dCh7IHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHJlY292ZXJ5RGVzdGluYXRpb24sIG5ldHdvcmspLCB2YWx1ZTogcmVjb3ZlcnlBbW91bnQgfSk7XG5cbiAgaWYgKGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MpIHtcbiAgICBwc2J0LmFkZE91dHB1dCh7XG4gICAgICBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzLCBuZXR3b3JrKSxcbiAgICAgIHZhbHVlOiBrZXlSZWNvdmVyeVNlcnZpY2VGZWUsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHNidDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgbmV0d29yayBpcyBhIFpjYXNoIG5ldHdvcmtcbiAqL1xuZnVuY3Rpb24gaXNaY2FzaChjb2luTmFtZTogQ29pbk5hbWUpOiBjb2luTmFtZSBpcyAnemVjJyB8ICd0emVjJyB7XG4gIHJldHVybiBjb2luTmFtZSA9PT0gJ3plYycgfHwgY29pbk5hbWUgPT09ICd0emVjJztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGJsb2NrIGhlaWdodHMgZm9yIFpjYXNoIG5ldHdvcmtzIGlmIG5vdCBwcm92aWRlZC5cbiAqIFRoZXNlIHNob3VsZCBiZSBzZXQgdG8gYSBoZWlnaHQgYWZ0ZXIgdGhlIGxhdGVzdCBuZXR3b3JrIHVwZ3JhZGUuXG4gKiBUT0RPKEJUQy0yOTAxKTogZ2V0IHRoZSBoZWlnaHQgZnJvbSBibG9ja2NoYWlyIEFQSSBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcuXG4gKi9cbmNvbnN0IFpDQVNIX0RFRkFVTFRfQkxPQ0tfSEVJR0hUUzogUmVjb3JkPCd6ZWMnIHwgJ3R6ZWMnLCBudW1iZXI+ID0ge1xuICB6ZWM6IDMxNDY0MDAsXG4gIHR6ZWM6IDM1MzY1MDAsXG59O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuIGVtcHR5IHdhc20tdXR4byBQU0JUXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRW1wdHlXYXNtUHNidE9wdGlvbnMge1xuICAvKiogQmxvY2sgaGVpZ2h0IGZvciBaY2FzaCBuZXR3b3JrcyAocmVxdWlyZWQgdG8gZGV0ZXJtaW5lIGNvbnNlbnN1cyBicmFuY2ggSUQpICovXG4gIGJsb2NrSGVpZ2h0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbXB0eSB3YXNtLXV0eG8gQml0R29Qc2J0IGZvciBhIGdpdmVuIG5ldHdvcmsuXG4gKiBIYW5kbGVzIFpjYXNoIG5ldHdvcmtzIHNwZWNpYWxseSBieSB1c2luZyBaY2FzaEJpdEdvUHNidC5cbiAqXG4gKiBAcGFyYW0gbmV0d29yayAtIFRoZSBuZXR3b3JrIGZvciB0aGUgUFNCVFxuICogQHBhcmFtIHJvb3RXYWxsZXRLZXlzIC0gVGhlIHdhbGxldCBrZXlzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHNldHRpbmdzIChlLmcuLCBibG9ja0hlaWdodCBmb3IgWmNhc2gpXG4gKiBAcmV0dXJucyBBIHdhc20tdXR4byBCaXRHb1BzYnQgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVtcHR5V2FzbVBzYnQoXG4gIGNvaW5OYW1lOiBDb2luTmFtZSxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICBvcHRpb25zPzogQ3JlYXRlRW1wdHlXYXNtUHNidE9wdGlvbnNcbik6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCB7XG4gIGlmIChpc1pjYXNoKGNvaW5OYW1lKSkge1xuICAgIC8vIEZvciBaY2FzaCwgdXNlIFpjYXNoQml0R29Qc2J0IHdoaWNoIHJlcXVpcmVzIGJsb2NrIGhlaWdodCB0byBkZXRlcm1pbmUgY29uc2Vuc3VzIGJyYW5jaCBJRFxuICAgIGNvbnN0IGJsb2NrSGVpZ2h0ID0gb3B0aW9ucz8uYmxvY2tIZWlnaHQgPz8gWkNBU0hfREVGQVVMVF9CTE9DS19IRUlHSFRTW2NvaW5OYW1lXTtcbiAgICByZXR1cm4gZml4ZWRTY3JpcHRXYWxsZXQuWmNhc2hCaXRHb1BzYnQuY3JlYXRlRW1wdHkoY29pbk5hbWUsIHJvb3RXYWxsZXRLZXlzLCB7XG4gICAgICBibG9ja0hlaWdodCxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQuY3JlYXRlRW1wdHkoY29pbk5hbWUsIHJvb3RXYWxsZXRLZXlzKTtcbn1cblxuLyoqXG4gKiBBZGQgd2FsbGV0IGlucHV0cyBmcm9tIHVuc3BlbnRzIHRvIGEgd2FzbS11dHhvIEJpdEdvUHNidC5cbiAqIEhhbmRsZXMgdGFwcm9vdCBpbnB1dHMgYnkgc2V0dGluZyB0aGUgYXBwcm9wcmlhdGUgc2lnblBhdGguXG4gKlxuICogQHBhcmFtIHdhc21Qc2J0IC0gVGhlIHdhc20tdXR4byBCaXRHb1BzYnQgdG8gYWRkIGlucHV0cyB0b1xuICogQHBhcmFtIHVuc3BlbnRzIC0gVGhlIHdhbGxldCB1bnNwZW50cyB0byBhZGQgYXMgaW5wdXRzXG4gKiBAcGFyYW0gcm9vdFdhbGxldEtleXMgLSBUaGUgd2FsbGV0IGtleXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFdhbGxldElucHV0c1RvV2FzbVBzYnQoXG4gIHdhc21Qc2J0OiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQsXG4gIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PGJpZ2ludD5bXSxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzXG4pOiB2b2lkIHtcbiAgdW5zcGVudHMuZm9yRWFjaCgodW5zcGVudCkgPT4ge1xuICAgIGNvbnN0IHsgdHhpZCwgdm91dCB9ID0gdXR4b2xpYi5iaXRnby5wYXJzZU91dHB1dElkKHVuc3BlbnQuaWQpO1xuICAgIGNvbnN0IHNpZ25QYXRoOiBmaXhlZFNjcmlwdFdhbGxldC5TaWduUGF0aCB8IHVuZGVmaW5lZCA9IGlzVGFwcm9vdENoYWluKHVuc3BlbnQuY2hhaW4pXG4gICAgICA/IHsgc2lnbmVyOiAndXNlcicsIGNvc2lnbmVyOiAnYmFja3VwJyB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIHByZXZUeCBtYXkgYmUgYWRkZWQgZHluYW1pY2FsbHkgaW4gYmFja3VwS2V5UmVjb3ZlcnkgZm9yIG5vbi1zZWd3aXQgaW5wdXRzXG4gICAgY29uc3QgcHJldlR4ID0gKHVuc3BlbnQgYXMgV2FsbGV0VW5zcGVudDxiaWdpbnQ+ICYgeyBwcmV2VHg/OiBCdWZmZXIgfSkucHJldlR4O1xuXG4gICAgd2FzbVBzYnQuYWRkV2FsbGV0SW5wdXQoXG4gICAgICB7XG4gICAgICAgIHR4aWQsXG4gICAgICAgIHZvdXQsXG4gICAgICAgIHZhbHVlOiB1bnNwZW50LnZhbHVlLFxuICAgICAgICBwcmV2VHg6IHByZXZUeCxcbiAgICAgIH0sXG4gICAgICByb290V2FsbGV0S2V5cyxcbiAgICAgIHtcbiAgICAgICAgc2NyaXB0SWQ6IHsgY2hhaW46IHVuc3BlbnQuY2hhaW4sIGluZGV4OiB1bnNwZW50LmluZGV4IH0sXG4gICAgICAgIHNpZ25QYXRoLFxuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEFkZCBhbiBvdXRwdXQgdG8gYSB3YXNtLXV0eG8gQml0R29Qc2J0LlxuICpcbiAqIEBwYXJhbSB3YXNtUHNidCAtIFRoZSB3YXNtLXV0eG8gQml0R29Qc2J0IHRvIGFkZCB0aGUgb3V0cHV0IHRvXG4gKiBAcGFyYW0gYWRkcmVzcyAtIFRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgb3V0cHV0IHZhbHVlIGluIHNhdG9zaGlzXG4gKiBAcGFyYW0gbmV0d29yayAtIFRoZSBuZXR3b3JrICh1c2VkIHRvIGNvbnZlcnQgYWRkcmVzcyB0byBzY3JpcHQpXG4gKiBAcmV0dXJucyBUaGUgb3V0cHV0IGluZGV4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRPdXRwdXRUb1dhc21Qc2J0KFxuICB3YXNtUHNidDogZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0LFxuICBhZGRyZXNzOiBzdHJpbmcsXG4gIHZhbHVlOiBiaWdpbnQsXG4gIGNvaW5OYW1lOiBDb2luTmFtZVxuKTogbnVtYmVyIHtcbiAgY29uc3Qgc2NyaXB0ID0gd2FzbUFkZHJlc3MudG9PdXRwdXRTY3JpcHRXaXRoQ29pbihhZGRyZXNzLCBjb2luTmFtZSk7XG4gIHJldHVybiB3YXNtUHNidC5hZGRPdXRwdXQoeyBzY3JpcHQsIHZhbHVlIH0pO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSB3YXNtLXV0eG8gQml0R29Qc2J0IHRvIGEgdXR4b2xpYiBVdHhvUHNidC5cbiAqXG4gKiBAcGFyYW0gd2FzbVBzYnQgLSBUaGUgd2FzbS11dHhvIEJpdEdvUHNidCB0byBjb252ZXJ0XG4gKiBAcGFyYW0gbmV0d29yayAtIFRoZSBuZXR3b3JrXG4gKiBAcmV0dXJucyBBIHV0eG9saWIgVXR4b1BzYnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHNidFRvVXR4b2xpYlBzYnQoXG4gIHdhc21Qc2J0OiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQgfCB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0LFxuICBjb2luTmFtZTogQ29pbk5hbWVcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBpZiAod2FzbVBzYnQgaW5zdGFuY2VvZiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQpIHtcbiAgICBjb25zdCBuZXR3b3JrID0gZ2V0TmV0d29ya0Zyb21Db2luTmFtZShjb2luTmFtZSk7XG4gICAgcmV0dXJuIHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21CdWZmZXIoQnVmZmVyLmZyb20od2FzbVBzYnQuc2VyaWFsaXplKCkpLCBuZXR3b3JrKTtcbiAgfVxuICByZXR1cm4gd2FzbVBzYnQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYmFja3VwIGtleSByZWNvdmVyeSBQU0JUIHVzaW5nIHdhc20tdXR4b1xuICovXG5mdW5jdGlvbiBjcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRXYXNtKFxuICBjb2luTmFtZTogQ29pbk5hbWUsXG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyxcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdLFxuICBvcHRpb25zOiBDcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRPcHRpb25zXG4pOiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQge1xuICBjb25zdCB7IGZlZVJhdGVTYXRWQiwgcmVjb3ZlcnlEZXN0aW5hdGlvbiwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzIH0gPSBvcHRpb25zO1xuXG4gIC8vIENyZWF0ZSBQU0JUIHdpdGggd2FzbS11dHhvIGFuZCBhZGQgd2FsbGV0IGlucHV0cyB1c2luZyBzaGFyZWQgdXRpbGl0aWVzXG4gIGNvbnN0IHdhc21Qc2J0ID0gY3JlYXRlRW1wdHlXYXNtUHNidChjb2luTmFtZSwgcm9vdFdhbGxldEtleXMsIHsgYmxvY2tIZWlnaHQ6IG9wdGlvbnMuYmxvY2tIZWlnaHQgfSk7XG4gIGFkZFdhbGxldElucHV0c1RvV2FzbVBzYnQod2FzbVBzYnQsIHVuc3BlbnRzLCByb290V2FsbGV0S2V5cyk7XG5cbiAgLy8gQ2FsY3VsYXRlIGRpbWVuc2lvbnMgdXNpbmcgd2FzbS11dHhvIERpbWVuc2lvbnNcbiAgbGV0IGRpbWVuc2lvbnMgPSBmaXhlZFNjcmlwdFdhbGxldC5EaW1lbnNpb25zLmZyb21Qc2J0KHdhc21Qc2J0KS5wbHVzKFxuICAgIGZpeGVkU2NyaXB0V2FsbGV0LkRpbWVuc2lvbnMuZnJvbU91dHB1dChyZWNvdmVyeURlc3RpbmF0aW9uLCBjb2luTmFtZSlcbiAgKTtcblxuICBpZiAoa2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcykge1xuICAgIGRpbWVuc2lvbnMgPSBkaW1lbnNpb25zLnBsdXMoZml4ZWRTY3JpcHRXYWxsZXQuRGltZW5zaW9ucy5mcm9tT3V0cHV0KGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MsIGNvaW5OYW1lKSk7XG4gIH1cblxuICBjb25zdCBhcHByb3hpbWF0ZUZlZSA9IEJpZ0ludChkaW1lbnNpb25zLmdldFZTaXplKCkgKiBmZWVSYXRlU2F0VkIpO1xuICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gdXR4b2xpYi5iaXRnby51bnNwZW50U3VtKHVuc3BlbnRzLCAnYmlnaW50Jyk7XG4gIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gdG90YWxJbnB1dEFtb3VudCAtIGFwcHJveGltYXRlRmVlIC0ga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlO1xuXG4gIGlmIChyZWNvdmVyeUFtb3VudCA8IEJpZ0ludCgwKSkge1xuICAgIHRocm93IG5ldyBJbnN1ZmZpY2llbnRGdW5kc0Vycm9yKHRvdGFsSW5wdXRBbW91bnQsIGFwcHJveGltYXRlRmVlLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWUsIHJlY292ZXJ5QW1vdW50KTtcbiAgfVxuXG4gIC8vIEFkZCBvdXRwdXRzIHRvIHdhc20gUFNCVFxuICBhZGRPdXRwdXRUb1dhc21Qc2J0KHdhc21Qc2J0LCByZWNvdmVyeURlc3RpbmF0aW9uLCByZWNvdmVyeUFtb3VudCwgY29pbk5hbWUpO1xuXG4gIGlmIChrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzKSB7XG4gICAgYWRkT3V0cHV0VG9XYXNtUHNidCh3YXNtUHNidCwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcywga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlLCBjb2luTmFtZSk7XG4gIH1cblxuICAvLyBDb252ZXJ0IHRvIHV0eG9saWIgUFNCVCBmb3Igc2lnbmluZyBhbmQgcmV0dXJuXG4gIHJldHVybiB3YXNtUHNidDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBiYWNrdXAga2V5IHJlY292ZXJ5IFBTQlQuXG4gKlxuICogQHBhcmFtIG5ldHdvcmsgLSBUaGUgbmV0d29yayBmb3IgdGhlIFBTQlRcbiAqIEBwYXJhbSByb290V2FsbGV0S2V5cyAtIFRoZSB3YWxsZXQga2V5c1xuICogQHBhcmFtIHVuc3BlbnRzIC0gVGhlIHVuc3BlbnRzIHRvIGluY2x1ZGUgaW4gdGhlIFBTQlRcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhlIFBTQlRcbiAqIEBwYXJhbSBiYWNrZW5kIC0gV2hpY2ggYmFja2VuZCB0byB1c2UgZm9yIFBTQlQgY3JlYXRpb24gKGRlZmF1bHQ6ICd3YXNtLXV0eG8nKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmFja3VwS2V5UmVjb3ZlcnlQc2J0KFxuICBjb2luTmFtZTogQ29pbk5hbWUsXG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyxcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdLFxuICBvcHRpb25zOiBDcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRPcHRpb25zLFxuICBiYWNrZW5kOiBQc2J0QmFja2VuZCA9ICd3YXNtLXV0eG8nXG4pOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHwgZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0IHtcbiAgaWYgKG9wdGlvbnMua2V5UmVjb3ZlcnlTZXJ2aWNlRmVlID4gMCAmJiAhb3B0aW9ucy5rZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzIGlzIHJlcXVpcmVkIHdoZW4ga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlIGlzIHByb3ZpZGVkJyk7XG4gIH1cblxuICBpZiAoYmFja2VuZCA9PT0gJ3dhc20tdXR4bycpIHtcbiAgICByZXR1cm4gY3JlYXRlQmFja3VwS2V5UmVjb3ZlcnlQc2J0V2FzbShjb2luTmFtZSwgcm9vdFdhbGxldEtleXMsIHVuc3BlbnRzLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlQmFja3VwS2V5UmVjb3ZlcnlQc2J0VXR4b2xpYihjb2luTmFtZSwgcm9vdFdhbGxldEtleXMsIHVuc3BlbnRzLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjb3ZlcnlBbW91bnQoXG4gIHBzYnQ6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQgfCBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQsXG4gIHdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICBhZGRyZXNzOiBzdHJpbmdcbik6IGJpZ2ludCB7XG4gIGlmIChwc2J0IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidCkge1xuICAgIGNvbnN0IHJlY292ZXJ5T3V0cHV0U2NyaXB0ID0gdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGFkZHJlc3MsIHBzYnQubmV0d29yayk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcHNidC50eE91dHB1dHMuZmluZCgobykgPT4gby5zY3JpcHQuZXF1YWxzKHJlY292ZXJ5T3V0cHV0U2NyaXB0KSk7XG4gICAgaWYgKCFvdXRwdXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjb3ZlcnkgZGVzdGluYXRpb24gb3V0cHV0IG5vdCBmb3VuZCBpbiBQU0JUOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQudmFsdWU7XG4gIH1cbiAgaWYgKHBzYnQgaW5zdGFuY2VvZiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQpIHtcbiAgICBjb25zdCBwYXJzZWRPdXRwdXRzID0gcHNidC5wYXJzZU91dHB1dHNXaXRoV2FsbGV0S2V5cyh3YWxsZXRLZXlzKTtcbiAgICBjb25zdCByZWNvdmVyeU91dHB1dCA9IHBhcnNlZE91dHB1dHMuZmluZCgobykgPT4gby5hZGRyZXNzID09PSBhZGRyZXNzKTtcbiAgICBpZiAoIXJlY292ZXJ5T3V0cHV0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlY292ZXJ5IGRlc3RpbmF0aW9uIG91dHB1dCBub3QgZm91bmQgaW4gUFNCVDogJHthZGRyZXNzfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVjb3ZlcnlPdXRwdXQudmFsdWU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBTQlQgdHlwZScpO1xufVxuIl19
@@ -0,0 +1,4 @@
1
+ export declare function toTNumber(value: number | bigint, amountType: 'number'): number;
2
+ export declare function toTNumber(value: number | bigint, amountType: 'bigint'): bigint;
3
+ export declare function toTNumber(value: number | bigint, amountType: 'number' | 'bigint'): number | bigint;
4
+ //# sourceMappingURL=tnumber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tnumber.d.ts","sourceRoot":"","sources":["../../../src/tnumber.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAC;AAChF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAC;AAChF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toTNumber = toTNumber;
4
+ function toTNumber(value, amountType) {
5
+ switch (amountType) {
6
+ case 'number':
7
+ return Number(value);
8
+ case 'bigint':
9
+ return BigInt(value);
10
+ }
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG51bWJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90bnVtYmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsOEJBT0M7QUFQRCxTQUFnQixTQUFTLENBQUMsS0FBc0IsRUFBRSxVQUErQjtJQUMvRSxRQUFRLFVBQVUsRUFBRSxDQUFDO1FBQ25CLEtBQUssUUFBUTtZQUNYLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLEtBQUssUUFBUTtZQUNYLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHRvVE51bWJlcih2YWx1ZTogbnVtYmVyIHwgYmlnaW50LCBhbW91bnRUeXBlOiAnbnVtYmVyJyk6IG51bWJlcjtcbmV4cG9ydCBmdW5jdGlvbiB0b1ROdW1iZXIodmFsdWU6IG51bWJlciB8IGJpZ2ludCwgYW1vdW50VHlwZTogJ2JpZ2ludCcpOiBiaWdpbnQ7XG5leHBvcnQgZnVuY3Rpb24gdG9UTnVtYmVyKHZhbHVlOiBudW1iZXIgfCBiaWdpbnQsIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcpOiBudW1iZXIgfCBiaWdpbnQ7XG5leHBvcnQgZnVuY3Rpb24gdG9UTnVtYmVyKHZhbHVlOiBudW1iZXIgfCBiaWdpbnQsIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcpOiBudW1iZXIgfCBiaWdpbnQge1xuICBzd2l0Y2ggKGFtb3VudFR5cGUpIHtcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gICAgY2FzZSAnYmlnaW50JzpcbiAgICAgIHJldHVybiBCaWdJbnQodmFsdWUpO1xuICB9XG59XG4iXX0=
@@ -1,5 +1,5 @@
1
1
  import * as utxolib from '@bitgo-beta/utxo-lib';
2
- import type { PsbtParsedScriptType } from './signPsbt';
2
+ import type { PsbtParsedScriptType } from './signPsbtUtxolib';
3
3
  type Unspent<TNumber extends number | bigint = number> = utxolib.bitgo.Unspent<TNumber>;
4
4
  export declare class InputSigningError<TNumber extends number | bigint = number> extends Error {
5
5
  inputIndex: number;
@@ -1 +1 @@
1
- {"version":3,"file":"SigningError.d.ts","sourceRoot":"","sources":["../../../../../src/transaction/fixedScript/SigningError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,KAAK,OAAO,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAExF,qBAAa,iBAAiB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAE,SAAQ,KAAK;IAe3E,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,oBAAoB,GAAG,IAAI;IACtC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE;IAC1C,MAAM,EAAE,KAAK,GAAG,MAAM;IAjB/B,MAAM,CAAC,qBAAqB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAC1D,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,oBAAoB,GAAG,IAAI,EAAE,qCAAqC;IAC7E,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GACzC,iBAAiB,CAAC,OAAO,CAAC;gBAUpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,oBAAoB,GAAG,IAAI,EAAE,qCAAqC;IAC7E,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,EAC1C,MAAM,EAAE,KAAK,GAAG,MAAM;CAIhC;AAED,qBAAa,uBAAuB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAE,SAAQ,KAAK;gBAC9E,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE;CAMhG"}
1
+ {"version":3,"file":"SigningError.d.ts","sourceRoot":"","sources":["../../../../../src/transaction/fixedScript/SigningError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,KAAK,OAAO,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAExF,qBAAa,iBAAiB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAE,SAAQ,KAAK;IAe3E,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,oBAAoB,GAAG,IAAI;IACtC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE;IAC1C,MAAM,EAAE,KAAK,GAAG,MAAM;IAjB/B,MAAM,CAAC,qBAAqB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAC1D,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,oBAAoB,GAAG,IAAI,EAAE,qCAAqC;IAC7E,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GACzC,iBAAiB,CAAC,OAAO,CAAC;gBAUpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,oBAAoB,GAAG,IAAI,EAAE,qCAAqC;IAC7E,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,EAC1C,MAAM,EAAE,KAAK,GAAG,MAAM;CAIhC;AAED,qBAAa,uBAAuB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAE,SAAQ,KAAK;gBAC9E,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE;CAMhG"}
@@ -23,4 +23,4 @@ class TransactionSigningError extends Error {
23
23
  }
24
24
  }
25
25
  exports.TransactionSigningError = TransactionSigningError;
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbmluZ0Vycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L1NpZ25pbmdFcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNQSxNQUFhLGlCQUE0RCxTQUFRLEtBQUs7SUFDcEYsTUFBTSxDQUFDLHFCQUFxQixDQUMxQixVQUFrQixFQUNsQixTQUFzQyxFQUFFLHFDQUFxQztJQUM3RSxPQUEwQztRQUUxQyxPQUFPLElBQUksaUJBQWlCLENBQzFCLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLHVEQUF1RCxDQUN4RCxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQ1MsVUFBa0IsRUFDbEIsU0FBc0MsRUFBRSxxQ0FBcUM7SUFDN0UsT0FBMEMsRUFDMUMsTUFBc0I7UUFFN0IsS0FBSyxDQUFDLDBCQUEwQixVQUFVLFVBQVUsU0FBUyxjQUFjLE9BQU8sQ0FBQyxFQUFFLEtBQUssTUFBTSxFQUFFLENBQUMsQ0FBQztRQUw3RixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLGNBQVMsR0FBVCxTQUFTLENBQTZCO1FBQ3RDLFlBQU8sR0FBUCxPQUFPLENBQW1DO1FBQzFDLFdBQU0sR0FBTixNQUFNLENBQWdCO0lBRy9CLENBQUM7Q0FDRjtBQXRCRCw4Q0FzQkM7QUFFRCxNQUFhLHVCQUFrRSxTQUFRLEtBQUs7SUFDMUYsWUFBWSxVQUF3QyxFQUFFLFdBQXlDO1FBQzdGLEtBQUssQ0FDSCwyQkFBMkIsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSztZQUNsRCw2QkFBNkIsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQzdFLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFQRCwwREFPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuXG5pbXBvcnQgdHlwZSB7IFBzYnRQYXJzZWRTY3JpcHRUeXBlIH0gZnJvbSAnLi9zaWduUHNidCc7XG5cbnR5cGUgVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IHV0eG9saWIuYml0Z28uVW5zcGVudDxUTnVtYmVyPjtcblxuZXhwb3J0IGNsYXNzIElucHV0U2lnbmluZ0Vycm9yPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IGV4dGVuZHMgRXJyb3Ige1xuICBzdGF0aWMgZXhwZWN0ZWRXYWxsZXRVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBpbnB1dFR5cGU6IFBzYnRQYXJzZWRTY3JpcHRUeXBlIHwgbnVsbCwgLy8gbnVsbCBmb3IgbGVnYWN5IHRyYW5zYWN0aW9uIGZvcm1hdFxuICAgIHVuc3BlbnQ6IFVuc3BlbnQ8VE51bWJlcj4gfCB7IGlkOiBzdHJpbmcgfVxuICApOiBJbnB1dFNpZ25pbmdFcnJvcjxUTnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dFNpZ25pbmdFcnJvcihcbiAgICAgIGlucHV0SW5kZXgsXG4gICAgICBpbnB1dFR5cGUsXG4gICAgICB1bnNwZW50LFxuICAgICAgYG5vdCBhIHdhbGxldCB1bnNwZW50LCBub3QgYSByZXBsYXkgcHJvdGVjdGlvbiB1bnNwZW50YFxuICAgICk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHB1YmxpYyBpbnB1dFR5cGU6IFBzYnRQYXJzZWRTY3JpcHRUeXBlIHwgbnVsbCwgLy8gbnVsbCBmb3IgbGVnYWN5IHRyYW5zYWN0aW9uIGZvcm1hdFxuICAgIHB1YmxpYyB1bnNwZW50OiBVbnNwZW50PFROdW1iZXI+IHwgeyBpZDogc3RyaW5nIH0sXG4gICAgcHVibGljIHJlYXNvbjogRXJyb3IgfCBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoYHNpZ25pbmcgZXJyb3IgYXQgaW5wdXQgJHtpbnB1dEluZGV4fTogdHlwZT0ke2lucHV0VHlwZX0gdW5zcGVudElkPSR7dW5zcGVudC5pZH06ICR7cmVhc29ufWApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvblNpZ25pbmdFcnJvcjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3Ioc2lnbkVycm9yczogSW5wdXRTaWduaW5nRXJyb3I8VE51bWJlcj5bXSwgdmVyaWZ5RXJyb3I6IElucHV0U2lnbmluZ0Vycm9yPFROdW1iZXI+W10pIHtcbiAgICBzdXBlcihcbiAgICAgIGBzaWduIGVycm9ycyBhdCBpbnB1dHM6IFske3NpZ25FcnJvcnMuam9pbignLCcpfV0sIGAgK1xuICAgICAgICBgdmVyaWZ5IGVycm9ycyBhdCBpbnB1dHM6IFske3ZlcmlmeUVycm9yLmpvaW4oJywnKX1dLCBzZWUgbG9nIGZvciBkZXRhaWxzYFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbmluZ0Vycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L1NpZ25pbmdFcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNQSxNQUFhLGlCQUE0RCxTQUFRLEtBQUs7SUFDcEYsTUFBTSxDQUFDLHFCQUFxQixDQUMxQixVQUFrQixFQUNsQixTQUFzQyxFQUFFLHFDQUFxQztJQUM3RSxPQUEwQztRQUUxQyxPQUFPLElBQUksaUJBQWlCLENBQzFCLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLHVEQUF1RCxDQUN4RCxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQ1MsVUFBa0IsRUFDbEIsU0FBc0MsRUFBRSxxQ0FBcUM7SUFDN0UsT0FBMEMsRUFDMUMsTUFBc0I7UUFFN0IsS0FBSyxDQUFDLDBCQUEwQixVQUFVLFVBQVUsU0FBUyxjQUFjLE9BQU8sQ0FBQyxFQUFFLEtBQUssTUFBTSxFQUFFLENBQUMsQ0FBQztRQUw3RixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLGNBQVMsR0FBVCxTQUFTLENBQTZCO1FBQ3RDLFlBQU8sR0FBUCxPQUFPLENBQW1DO1FBQzFDLFdBQU0sR0FBTixNQUFNLENBQWdCO0lBRy9CLENBQUM7Q0FDRjtBQXRCRCw4Q0FzQkM7QUFFRCxNQUFhLHVCQUFrRSxTQUFRLEtBQUs7SUFDMUYsWUFBWSxVQUF3QyxFQUFFLFdBQXlDO1FBQzdGLEtBQUssQ0FDSCwyQkFBMkIsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSztZQUNsRCw2QkFBNkIsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQzdFLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFQRCwwREFPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuXG5pbXBvcnQgdHlwZSB7IFBzYnRQYXJzZWRTY3JpcHRUeXBlIH0gZnJvbSAnLi9zaWduUHNidFV0eG9saWInO1xuXG50eXBlIFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSB1dHhvbGliLmJpdGdvLlVuc3BlbnQ8VE51bWJlcj47XG5cbmV4cG9ydCBjbGFzcyBJbnB1dFNpZ25pbmdFcnJvcjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIEVycm9yIHtcbiAgc3RhdGljIGV4cGVjdGVkV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgaW5wdXRUeXBlOiBQc2J0UGFyc2VkU2NyaXB0VHlwZSB8IG51bGwsIC8vIG51bGwgZm9yIGxlZ2FjeSB0cmFuc2FjdGlvbiBmb3JtYXRcbiAgICB1bnNwZW50OiBVbnNwZW50PFROdW1iZXI+IHwgeyBpZDogc3RyaW5nIH1cbiAgKTogSW5wdXRTaWduaW5nRXJyb3I8VE51bWJlcj4ge1xuICAgIHJldHVybiBuZXcgSW5wdXRTaWduaW5nRXJyb3IoXG4gICAgICBpbnB1dEluZGV4LFxuICAgICAgaW5wdXRUeXBlLFxuICAgICAgdW5zcGVudCxcbiAgICAgIGBub3QgYSB3YWxsZXQgdW5zcGVudCwgbm90IGEgcmVwbGF5IHByb3RlY3Rpb24gdW5zcGVudGBcbiAgICApO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBwdWJsaWMgaW5wdXRUeXBlOiBQc2J0UGFyc2VkU2NyaXB0VHlwZSB8IG51bGwsIC8vIG51bGwgZm9yIGxlZ2FjeSB0cmFuc2FjdGlvbiBmb3JtYXRcbiAgICBwdWJsaWMgdW5zcGVudDogVW5zcGVudDxUTnVtYmVyPiB8IHsgaWQ6IHN0cmluZyB9LFxuICAgIHB1YmxpYyByZWFzb246IEVycm9yIHwgc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKGBzaWduaW5nIGVycm9yIGF0IGlucHV0ICR7aW5wdXRJbmRleH06IHR5cGU9JHtpbnB1dFR5cGV9IHVuc3BlbnRJZD0ke3Vuc3BlbnQuaWR9OiAke3JlYXNvbn1gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25TaWduaW5nRXJyb3I8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHNpZ25FcnJvcnM6IElucHV0U2lnbmluZ0Vycm9yPFROdW1iZXI+W10sIHZlcmlmeUVycm9yOiBJbnB1dFNpZ25pbmdFcnJvcjxUTnVtYmVyPltdKSB7XG4gICAgc3VwZXIoXG4gICAgICBgc2lnbiBlcnJvcnMgYXQgaW5wdXRzOiBbJHtzaWduRXJyb3JzLmpvaW4oJywnKX1dLCBgICtcbiAgICAgICAgYHZlcmlmeSBlcnJvcnMgYXQgaW5wdXRzOiBbJHt2ZXJpZnlFcnJvci5qb2luKCcsJyl9XSwgc2VlIGxvZyBmb3IgZGV0YWlsc2BcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -7,24 +7,15 @@ export type PsbtParsedScriptType = 'p2sh' | 'p2wsh' | 'p2shP2wsh' | 'p2shP2pk' |
7
7
  * Collects and logs signing errors and verification errors, throws error in the end if any of them
8
8
  * failed.
9
9
  *
10
- * If it is the last signature, finalize and extract the transaction from the psbt.
11
- *
12
10
  * This function mirrors signAndVerifyWalletTransaction, but is used for signing PSBTs instead of
13
11
  * using TransactionBuilder
14
12
  *
15
13
  * @param psbt
16
14
  * @param signerKeychain
17
- * @param isLastSignature
18
15
  */
19
- export declare function signAndVerifyPsbt(psbt: utxolib.bitgo.UtxoPsbt, signerKeychain: utxolib.BIP32Interface, { isLastSignature,
20
- /** deprecated */
21
- allowNonSegwitSigningWithoutPrevTx, }: {
22
- isLastSignature: boolean;
23
- allowNonSegwitSigningWithoutPrevTx?: boolean;
24
- }): utxolib.bitgo.UtxoPsbt | utxolib.bitgo.UtxoTransaction<bigint>;
25
- export declare function signPsbtWithMusig2Participant(coin: Musig2Participant<utxolib.bitgo.UtxoPsbt>, tx: utxolib.bitgo.UtxoPsbt, signerKeychain: BIP32Interface | undefined, params: {
26
- isLastSignature: boolean;
16
+ export declare function signAndVerifyPsbt(psbt: utxolib.bitgo.UtxoPsbt, signerKeychain: utxolib.BIP32Interface): utxolib.bitgo.UtxoPsbt;
17
+ export declare function signPsbtWithMusig2ParticipantUtxolib(coin: Musig2Participant<utxolib.bitgo.UtxoPsbt>, tx: utxolib.bitgo.UtxoPsbt, signerKeychain: BIP32Interface | undefined, params: {
27
18
  signingStep: 'signerNonce' | 'cosignerNonce' | 'signerSignature' | undefined;
28
19
  walletId: string | undefined;
29
- }): Promise<utxolib.bitgo.UtxoPsbt | utxolib.bitgo.UtxoTransaction<bigint>>;
30
- //# sourceMappingURL=signPsbt.d.ts.map
20
+ }): Promise<utxolib.bitgo.UtxoPsbt>;
21
+ //# sourceMappingURL=signPsbtUtxolib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signPsbtUtxolib.d.ts","sourceRoot":"","sources":["../../../../../src/transaction/fixedScript/signPsbtUtxolib.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAI7C,MAAM,MAAM,oBAAoB,GAC5B,MAAM,GACN,OAAO,GACP,WAAW,GACX,UAAU,GACV,qBAAqB,GACrB,wBAAwB,GAExB,YAAY,GACZ,sBAAsB,GACtB,mBAAmB,CAAC;AAExB;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAC5B,cAAc,EAAE,OAAO,CAAC,cAAc,GACrC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAwDxB;AAYD,wBAAsB,oCAAoC,CACxD,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAC/C,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAC1B,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,MAAM,EAAE;IACN,WAAW,EAAE,aAAa,GAAG,eAAe,GAAG,iBAAiB,GAAG,SAAS,CAAC;IAC7E,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,GACA,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CA6CjC"}
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.signAndVerifyPsbt = signAndVerifyPsbt;
40
+ exports.signPsbtWithMusig2ParticipantUtxolib = signPsbtWithMusig2ParticipantUtxolib;
41
+ const assert_1 = __importDefault(require("assert"));
42
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
43
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
44
+ const debug_1 = __importDefault(require("debug"));
45
+ const SigningError_1 = require("./SigningError");
46
+ const debug = (0, debug_1.default)('bitgo:v2:utxo');
47
+ /**
48
+ * Sign all inputs of a psbt and verify signatures after signing.
49
+ * Collects and logs signing errors and verification errors, throws error in the end if any of them
50
+ * failed.
51
+ *
52
+ * This function mirrors signAndVerifyWalletTransaction, but is used for signing PSBTs instead of
53
+ * using TransactionBuilder
54
+ *
55
+ * @param psbt
56
+ * @param signerKeychain
57
+ */
58
+ function signAndVerifyPsbt(psbt, signerKeychain) {
59
+ const txInputs = psbt.txInputs;
60
+ const outputIds = [];
61
+ const scriptTypes = [];
62
+ const signErrors = psbt.data.inputs
63
+ .map((input, inputIndex) => {
64
+ const outputId = utxolib.bitgo.formatOutputId(utxolib.bitgo.getOutputIdForInput(txInputs[inputIndex]));
65
+ outputIds.push(outputId);
66
+ const { scriptType } = utxolib.bitgo.parsePsbtInput(input);
67
+ scriptTypes.push(scriptType);
68
+ if (scriptType === 'p2shP2pk') {
69
+ debug('Skipping signature for input %d of %d (RP input?)', inputIndex + 1, psbt.data.inputs.length);
70
+ return;
71
+ }
72
+ try {
73
+ psbt.signInputHD(inputIndex, signerKeychain);
74
+ debug('Successfully signed input %d of %d', inputIndex + 1, psbt.data.inputs.length);
75
+ }
76
+ catch (e) {
77
+ return new SigningError_1.InputSigningError(inputIndex, scriptType, { id: outputId }, e);
78
+ }
79
+ })
80
+ .filter((e) => e !== undefined);
81
+ const verifyErrors = psbt.data.inputs
82
+ .map((input, inputIndex) => {
83
+ const scriptType = scriptTypes[inputIndex];
84
+ if (scriptType === 'p2shP2pk') {
85
+ debug('Skipping input signature %d of %d (unspent from replay protection address which is platform signed only)', inputIndex + 1, psbt.data.inputs.length);
86
+ return;
87
+ }
88
+ const outputId = outputIds[inputIndex];
89
+ try {
90
+ if (!psbt.validateSignaturesOfInputHD(inputIndex, signerKeychain)) {
91
+ return new SigningError_1.InputSigningError(inputIndex, scriptType, { id: outputId }, new Error(`invalid signature`));
92
+ }
93
+ }
94
+ catch (e) {
95
+ debug('Invalid signature');
96
+ return new SigningError_1.InputSigningError(inputIndex, scriptType, { id: outputId }, e);
97
+ }
98
+ })
99
+ .filter((e) => e !== undefined);
100
+ if (signErrors.length || verifyErrors.length) {
101
+ throw new SigningError_1.TransactionSigningError(signErrors, verifyErrors);
102
+ }
103
+ return psbt;
104
+ }
105
+ /**
106
+ * Key Value: Unsigned tx id => PSBT
107
+ * It is used to cache PSBTs with taproot key path (MuSig2) inputs during external express signer is activated.
108
+ * Reason: MuSig2 signer secure nonce is cached in the UtxoPsbt object. It will be required during the signing step.
109
+ * For more info, check SignTransactionOptions.signingStep
110
+ *
111
+ * TODO BTC-276: This cache may need to be done with LRU like memory safe caching if memory issues comes up.
112
+ */
113
+ const PSBT_CACHE = new Map();
114
+ async function signPsbtWithMusig2ParticipantUtxolib(coin, tx, signerKeychain, params) {
115
+ if (utxo_lib_1.bitgo.isTransactionWithKeyPathSpendInput(tx)) {
116
+ switch (params.signingStep) {
117
+ case 'signerNonce':
118
+ (0, assert_1.default)(signerKeychain);
119
+ tx.setAllInputsMusig2NonceHD(signerKeychain);
120
+ PSBT_CACHE.set(tx.getUnsignedTx().getId(), tx);
121
+ return tx;
122
+ case 'cosignerNonce':
123
+ (0, assert_1.default)(params.walletId, 'walletId is required for MuSig2 bitgo nonce');
124
+ return await coin.getMusig2Nonces(tx, params.walletId);
125
+ case 'signerSignature':
126
+ const txId = tx.getUnsignedTx().getId();
127
+ const psbt = PSBT_CACHE.get(txId);
128
+ (0, assert_1.default)(psbt, `Psbt is missing from txCache (cache size ${PSBT_CACHE.size}).
129
+ This may be due to the request being routed to a different BitGo-Express instance that for signing step 'signerNonce'.`);
130
+ PSBT_CACHE.delete(txId);
131
+ tx = psbt.combine(tx);
132
+ break;
133
+ default:
134
+ // this instance is not an external signer
135
+ (0, assert_1.default)(params.walletId, 'walletId is required for MuSig2 bitgo nonce');
136
+ (0, assert_1.default)(signerKeychain);
137
+ tx.setAllInputsMusig2NonceHD(signerKeychain);
138
+ const response = await coin.getMusig2Nonces(tx, params.walletId);
139
+ tx = tx.combine(response);
140
+ break;
141
+ }
142
+ }
143
+ else {
144
+ switch (params.signingStep) {
145
+ case 'signerNonce':
146
+ case 'cosignerNonce':
147
+ /**
148
+ * In certain cases, the caller of this method may not know whether the txHex contains a psbt with taproot key path spend input(s).
149
+ * Instead of throwing error, no-op and return the txHex. So that the caller can call this method in the same sequence.
150
+ */
151
+ return tx;
152
+ }
153
+ }
154
+ (0, assert_1.default)(signerKeychain);
155
+ return signAndVerifyPsbt(tx, signerKeychain);
156
+ }
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnblBzYnRVdHhvbGliLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3NpZ25Qc2J0VXR4b2xpYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1DQSw4Q0EyREM7QUFZRCxvRkFxREM7QUEvSkQsb0RBQTRCO0FBRTVCLDhEQUFnRDtBQUVoRCxtREFBNkM7QUFDN0Msa0RBQTZCO0FBRTdCLGlEQUE0RTtBQUc1RSxNQUFNLEtBQUssR0FBRyxJQUFBLGVBQVEsRUFBQyxlQUFlLENBQUMsQ0FBQztBQWN4Qzs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLElBQTRCLEVBQzVCLGNBQXNDO0lBRXRDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDL0IsTUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFDO0lBQy9CLE1BQU0sV0FBVyxHQUEyQixFQUFFLENBQUM7SUFFL0MsTUFBTSxVQUFVLEdBQWdDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtTQUM3RCxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBa0IsRUFBRSxFQUFFO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXpCLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRCxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTdCLElBQUksVUFBVSxLQUFLLFVBQVUsRUFB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M0IsS0FBSyxhQUFhLENBQUM7WUFDbkIsS0FBSyxlQUFlO2dCQUNsQjs7O21CQUdHO2dCQUNILE9BQU8sRUFBRSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFBLGdCQUFNLEVBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkIsT0FBTyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBCSVAzMkludGVyZmFjZSB9IGZyb20gJ0BiaXRnby1iZXRhL3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBiaXRnbyB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCBkZWJ1Z0xpYiBmcm9tICdkZWJ1Zyc7XG5cbmltcG9ydCB7IElucHV0U2lnbmluZ0Vycm9yLCBUcmFuc2FjdGlvblNpZ25pbmdFcnJvciB9IGZyb20gJy4vU2lnbmluZ0Vycm9yJztcbmltcG9ydCB7IE11c2lnMlBhcnRpY2lwYW50IH0gZnJvbSAnLi9tdXNpZzInO1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnTGliKCdiaXRnbzp2Mjp1dHhvJyk7XG5cbmV4cG9ydCB0eXBlIFBzYnRQYXJzZWRTY3JpcHRUeXBlID1cbiAgfCAncDJzaCdcbiAgfCAncDJ3c2gnXG4gIHwgJ3Ayc2hQMndzaCdcbiAgfCAncDJzaFAycGsnXG4gIHwgJ3RhcHJvb3RLZXlQYXRoU3BlbmQnXG4gIHwgJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnXG4gIC8vIHdhc20tdXR4byB0eXBlc1xuICB8ICdwMnRyTGVnYWN5J1xuICB8ICdwMnRyTXVzaWcyU2NyaXB0UGF0aCdcbiAgfCAncDJ0ck11c2lnMktleVBhdGgnO1xuXG4vKipcbiAqIFNpZ24gYWxsIGlucHV0cyBvZiBhIHBzYnQgYW5kIHZlcmlmeSBzaWduYXR1cmVzIGFmdGVyIHNpZ25pbmcuXG4gKiBDb2xsZWN0cyBhbmQgbG9ncyBzaWduaW5nIGVycm9ycyBhbmQgdmVyaWZpY2F0aW9uIGVycm9ycywgdGhyb3dzIGVycm9yIGluIHRoZSBlbmQgaWYgYW55IG9mIHRoZW1cbiAqIGZhaWxlZC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIG1pcnJvcnMgc2lnbkFuZFZlcmlmeVdhbGxldFRyYW5zYWN0aW9uLCBidXQgaXMgdXNlZCBmb3Igc2lnbmluZyBQU0JUcyBpbnN0ZWFkIG9mXG4gKiB1c2luZyBUcmFuc2FjdGlvbkJ1aWxkZXJcbiAqXG4gKiBAcGFyYW0gcHNidFxuICogQHBhcmFtIHNpZ25lcktleWNoYWluXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduQW5kVmVyaWZ5UHNidChcbiAgcHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCxcbiAgc2lnbmVyS2V5Y2hhaW46IHV0eG9saWIuQklQMzJJbnRlcmZhY2Vcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBjb25zdCB0eElucHV0cyA9IHBzYnQudHhJbnB1dHM7XG4gIGNvbnN0IG91dHB1dElkczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2NyaXB0VHlwZXM6IFBzYnRQYXJzZWRTY3JpcHRUeXBlW10gPSBbXTtcblxuICBjb25zdCBzaWduRXJyb3JzOiBJbnB1dFNpZ25pbmdFcnJvcjxiaWdpbnQ+W10gPSBwc2J0LmRhdGEuaW5wdXRzXG4gICAgLm1hcCgoaW5wdXQsIGlucHV0SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0SWQgPSB1dHhvbGliLmJpdGdvLmZvcm1hdE91dHB1dElkKHV0eG9saWIuYml0Z28uZ2V0T3V0cHV0SWRGb3JJbnB1dCh0eElucHV0c1tpbnB1dEluZGV4XSkpO1xuICAgICAgb3V0cHV0SWRzLnB1c2gob3V0cHV0SWQpO1xuXG4gICAgICBjb25zdCB7IHNjcmlwdFR5cGUgfSA9IHV0eG9saWIuYml0Z28ucGFyc2VQc2J0SW5wdXQoaW5wdXQpO1xuICAgICAgc2NyaXB0VHlwZXMucHVzaChzY3JpcHRUeXBlKTtcblxuICAgICAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnNoUDJwaycpIHtcbiAgICAgICAgZGVidWcoJ1NraXBwaW5nIHNpZ25hdHVyZSBmb3IgaW5wdXQgJWQgb2YgJWQgKFJQIGlucHV0PyknLCBpbnB1dEluZGV4ICsgMSwgcHNidC5kYXRhLmlucHV0cy5sZW5ndGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHBzYnQuc2lnbklucHV0SEQoaW5wdXRJbmRleCwgc2lnbmVyS2V5Y2hhaW4pO1xuICAgICAgICBkZWJ1ZygnU3VjY2Vzc2Z1bGx5IHNpZ25lZCBpbnB1dCAlZCBvZiAlZCcsIGlucHV0SW5kZXggKyAxLCBwc2J0LmRhdGEuaW5wdXRzLmxlbmd0aCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5wdXRTaWduaW5nRXJyb3I8YmlnaW50PihpbnB1dEluZGV4LCBzY3JpcHRUeXBlLCB7IGlkOiBvdXRwdXRJZCB9LCBlKTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC5maWx0ZXIoKGUpOiBlIGlzIElucHV0U2lnbmluZ0Vycm9yPGJpZ2ludD4gPT4gZSAhPT0gdW5kZWZpbmVkKTtcblxuICBjb25zdCB2ZXJpZnlFcnJvcnM6IElucHV0U2lnbmluZ0Vycm9yPGJpZ2ludD5bXSA9IHBzYnQuZGF0YS5pbnB1dHNcbiAgICAubWFwKChpbnB1dCwgaW5wdXRJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc2NyaXB0VHlwZSA9IHNjcmlwdFR5cGVzW2lucHV0SW5kZXhdO1xuICAgICAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnNoUDJwaycpIHtcbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgJ1NraXBwaW5nIGlucHV0IHNpZ25hdHVyZSAlZCBvZiAlZCAodW5zcGVudCBmcm9tIHJlcGxheSBwcm90ZWN0aW9uIGFkZHJlc3Mgd2hpY2ggaXMgcGxhdGZvcm0gc2lnbmVkIG9ubHkpJyxcbiAgICAgICAgICBpbnB1dEluZGV4ICsgMSxcbiAgICAgICAgICBwc2J0LmRhdGEuaW5wdXRzLmxlbmd0aFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG91dHB1dElkID0gb3V0cHV0SWRzW2lucHV0SW5kZXhdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFwc2J0LnZhbGlkYXRlU2lnbmF0dXJlc09mSW5wdXRIRChpbnB1dEluZGV4LCBzaWduZXJLZXljaGFpbikpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IElucHV0U2lnbmluZ0Vycm9yKGlucHV0SW5kZXgsIHNjcmlwdFR5cGUsIHsgaWQ6IG91dHB1dElkIH0sIG5ldyBFcnJvcihgaW52YWxpZCBzaWduYXR1cmVgKSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZGVidWcoJ0ludmFsaWQgc2lnbmF0dXJlJyk7XG4gICAgICAgIHJldHVybiBuZXcgSW5wdXRTaWduaW5nRXJyb3I8YmlnaW50PihpbnB1dEluZGV4LCBzY3JpcHRUeXBlLCB7IGlkOiBvdXRwdXRJZCB9LCBlKTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC5maWx0ZXIoKGUpOiBlIGlzIElucHV0U2lnbmluZ0Vycm9yPGJpZ2ludD4gPT4gZSAhPT0gdW5kZWZpbmVkKTtcblxuICBpZiAoc2lnbkVycm9ycy5sZW5ndGggfHwgdmVyaWZ5RXJyb3JzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBUcmFuc2FjdGlvblNpZ25pbmdFcnJvcihzaWduRXJyb3JzLCB2ZXJpZnlFcnJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIHBzYnQ7XG59XG5cbi8qKlxuICogS2V5IFZhbHVlOiBVbnNpZ25lZCB0eCBpZCA9PiBQU0JUXG4gKiBJdCBpcyB1c2VkIHRvIGNhY2hlIFBTQlRzIHdpdGggdGFwcm9vdCBrZXkgcGF0aCAoTXVTaWcyKSBpbnB1dHMgZHVyaW5nIGV4dGVybmFsIGV4cHJlc3Mgc2lnbmVyIGlzIGFjdGl2YXRlZC5cbiAqIFJlYXNvbjogTXVTaWcyIHNpZ25lciBzZWN1cmUgbm9uY2UgaXMgY2FjaGVkIGluIHRoZSBVdHhvUHNidCBvYmplY3QuIEl0IHdpbGwgYmUgcmVxdWlyZWQgZHVyaW5nIHRoZSBzaWduaW5nIHN0ZXAuXG4gKiBGb3IgbW9yZSBpbmZvLCBjaGVjayBTaWduVHJhbnNhY3Rpb25PcHRpb25zLnNpZ25pbmdTdGVwXG4gKlxuICogVE9ETyBCVEMtMjc2OiBUaGlzIGNhY2hlIG1heSBuZWVkIHRvIGJlIGRvbmUgd2l0aCBMUlUgbGlrZSBtZW1vcnkgc2FmZSBjYWNoaW5nIGlmIG1lbW9yeSBpc3N1ZXMgY29tZXMgdXAuXG4gKi9cbmNvbnN0IFBTQlRfQ0FDSEUgPSBuZXcgTWFwPHN0cmluZywgdXR4b2xpYi5iaXRnby5VdHhvUHNidD4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25Qc2J0V2l0aE11c2lnMlBhcnRpY2lwYW50VXR4b2xpYihcbiAgY29pbjogTXVzaWcyUGFydGljaXBhbnQ8dXR4b2xpYi5iaXRnby5VdHhvUHNidD4sXG4gIHR4OiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0LFxuICBzaWduZXJLZXljaGFpbjogQklQMzJJbnRlcmZhY2UgfCB1bmRlZmluZWQsXG4gIHBhcmFtczoge1xuICAgIHNpZ25pbmdTdGVwOiAnc2lnbmVyTm9uY2UnIHwgJ2Nvc2lnbmVyTm9uY2UnIHwgJ3NpZ25lclNpZ25hdHVyZScgfCB1bmRlZmluZWQ7XG4gICAgd2FsbGV0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgfVxuKTogUHJvbWlzZTx1dHhvbGliLmJpdGdvLlV0eG9Qc2J0PiB7XG4gIGlmIChiaXRnby5pc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZElucHV0KHR4KSkge1xuICAgIHN3aXRjaCAocGFyYW1zLnNpZ25pbmdTdGVwKSB7XG4gICAgICBjYXNlICdzaWduZXJOb25jZSc6XG4gICAgICAgIGFzc2VydChzaWduZXJLZXljaGFpbik7XG4gICAgICAgIHR4LnNldEFsbElucHV0c011c2lnMk5vbmNlSEQoc2lnbmVyS2V5Y2hhaW4pO1xuICAgICAgICBQU0JUX0NBQ0hFLnNldCh0eC5nZXRVbnNpZ25lZFR4KCkuZ2V0SWQoKSwgdHgpO1xuICAgICAgICByZXR1cm4gdHg7XG4gICAgICBjYXNlICdjb3NpZ25lck5vbmNlJzpcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy53YWxsZXRJZCwgJ3dhbGxldElkIGlzIHJlcXVpcmVkIGZvciBNdVNpZzIgYml0Z28gbm9uY2UnKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNvaW4uZ2V0TXVzaWcyTm9uY2VzKHR4LCBwYXJhbXMud2FsbGV0SWQpO1xuICAgICAgY2FzZSAnc2lnbmVyU2lnbmF0dXJlJzpcbiAgICAgICAgY29uc3QgdHhJZCA9IHR4LmdldFVuc2lnbmVkVHgoKS5nZXRJZCgpO1xuICAgICAgICBjb25zdCBwc2J0ID0gUFNCVF9DQUNIRS5nZXQodHhJZCk7XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICBwc2J0LFxuICAgICAgICAgIGBQc2J0IGlzIG1pc3NpbmcgZnJvbSB0eENhY2hlIChjYWNoZSBzaXplICR7UFNCVF9DQUNIRS5zaXplfSkuXG4gICAgICAgICAgICBUaGlzIG1heSBiZSBkdWUgdG8gdGhlIHJlcXVlc3QgYmVpbmcgcm91dGVkIHRvIGEgZGlmZmVyZW50IEJpdEdvLUV4cHJlc3MgaW5zdGFuY2UgdGhhdCBmb3Igc2lnbmluZyBzdGVwICdzaWduZXJOb25jZScuYFxuICAgICAgICApO1xuICAgICAgICBQU0JUX0NBQ0hFLmRlbGV0ZSh0eElkKTtcbiAgICAgICAgdHggPSBwc2J0LmNvbWJpbmUodHgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIHRoaXMgaW5zdGFuY2UgaXMgbm90IGFuIGV4dGVybmFsIHNpZ25lclxuICAgICAgICBhc3NlcnQocGFyYW1zLndhbGxldElkLCAnd2FsbGV0SWQgaXMgcmVxdWlyZWQgZm9yIE11U2lnMiBiaXRnbyBub25jZScpO1xuICAgICAgICBhc3NlcnQoc2lnbmVyS2V5Y2hhaW4pO1xuICAgICAgICB0eC5zZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKHNpZ25lcktleWNoYWluKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb2luLmdldE11c2lnMk5vbmNlcyh0eCwgcGFyYW1zLndhbGxldElkKTtcbiAgICAgICAgdHggPSB0eC5jb21iaW5lKHJlc3BvbnNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAocGFyYW1zLnNpZ25pbmdTdGVwKSB7XG4gICAgICBjYXNlICdzaWduZXJOb25jZSc6XG4gICAgICBjYXNlICdjb3NpZ25lck5vbmNlJzpcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIGNlcnRhaW4gY2FzZXMsIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgbWF5IG5vdCBrbm93IHdoZXRoZXIgdGhlIHR4SGV4IGNvbnRhaW5zIGEgcHNidCB3aXRoIHRhcHJvb3Qga2V5IHBhdGggc3BlbmQgaW5wdXQocykuXG4gICAgICAgICAqIEluc3RlYWQgb2YgdGhyb3dpbmcgZXJyb3IsIG5vLW9wIGFuZCByZXR1cm4gdGhlIHR4SGV4LiBTbyB0aGF0IHRoZSBjYWxsZXIgY2FuIGNhbGwgdGhpcyBtZXRob2QgaW4gdGhlIHNhbWUgc2VxdWVuY2UuXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4gdHg7XG4gICAgfVxuICB9XG5cbiAgYXNzZXJ0KHNpZ25lcktleWNoYWluKTtcbiAgcmV0dXJuIHNpZ25BbmRWZXJpZnlQc2J0KHR4LCBzaWduZXJLZXljaGFpbik7XG59XG4iXX0=