@bitgo-beta/utxo-lib 8.0.3-beta.9 → 8.0.3-beta.900

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 (217) hide show
  1. package/README.md +19 -16
  2. package/dist/src/address.d.ts +0 -1
  3. package/dist/src/address.d.ts.map +1 -1
  4. package/dist/src/address.js +10 -10
  5. package/dist/src/addressFormat.d.ts +1 -2
  6. package/dist/src/addressFormat.d.ts.map +1 -1
  7. package/dist/src/addressFormat.js +21 -26
  8. package/dist/src/bitgo/Musig2.d.ts +5 -11
  9. package/dist/src/bitgo/Musig2.d.ts.map +1 -1
  10. package/dist/src/bitgo/Musig2.js +63 -88
  11. package/dist/src/bitgo/PsbtUtil.d.ts +70 -0
  12. package/dist/src/bitgo/PsbtUtil.d.ts.map +1 -0
  13. package/dist/src/bitgo/PsbtUtil.js +132 -0
  14. package/dist/src/bitgo/Unspent.d.ts +2 -3
  15. package/dist/src/bitgo/Unspent.d.ts.map +1 -1
  16. package/dist/src/bitgo/Unspent.js +14 -15
  17. package/dist/src/bitgo/UtxoPsbt.d.ts +26 -40
  18. package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
  19. package/dist/src/bitgo/UtxoPsbt.js +221 -206
  20. package/dist/src/bitgo/UtxoTransaction.d.ts +0 -1
  21. package/dist/src/bitgo/UtxoTransaction.d.ts.map +1 -1
  22. package/dist/src/bitgo/UtxoTransaction.js +12 -12
  23. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts +0 -1
  24. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts.map +1 -1
  25. package/dist/src/bitgo/UtxoTransactionBuilder.js +1 -1
  26. package/dist/src/bitgo/bitcoincash/address.d.ts +0 -1
  27. package/dist/src/bitgo/bitcoincash/address.d.ts.map +1 -1
  28. package/dist/src/bitgo/bitcoincash/address.js +11 -12
  29. package/dist/src/bitgo/bitcoincash/index.js +6 -2
  30. package/dist/src/bitgo/dash/DashPsbt.d.ts +1 -1
  31. package/dist/src/bitgo/dash/DashPsbt.d.ts.map +1 -1
  32. package/dist/src/bitgo/dash/DashPsbt.js +4 -1
  33. package/dist/src/bitgo/dash/DashTransaction.d.ts +0 -1
  34. package/dist/src/bitgo/dash/DashTransaction.d.ts.map +1 -1
  35. package/dist/src/bitgo/dash/DashTransaction.js +3 -3
  36. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts +0 -1
  37. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts.map +1 -1
  38. package/dist/src/bitgo/dash/DashTransactionBuilder.js +1 -1
  39. package/dist/src/bitgo/dash/index.js +6 -2
  40. package/dist/src/bitgo/index.d.ts +10 -0
  41. package/dist/src/bitgo/index.d.ts.map +1 -1
  42. package/dist/src/bitgo/index.js +10 -3
  43. package/dist/src/bitgo/keyutil.d.ts +9 -1
  44. package/dist/src/bitgo/keyutil.d.ts.map +1 -1
  45. package/dist/src/bitgo/keyutil.js +25 -4
  46. package/dist/src/bitgo/legacysafe/index.d.ts +14 -0
  47. package/dist/src/bitgo/legacysafe/index.d.ts.map +1 -0
  48. package/dist/src/bitgo/legacysafe/index.js +60 -0
  49. package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts +1 -1
  50. package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts.map +1 -1
  51. package/dist/src/bitgo/litecoin/LitecoinPsbt.js +4 -1
  52. package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts +1 -2
  53. package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts.map +1 -1
  54. package/dist/src/bitgo/litecoin/LitecoinTransaction.js +2 -2
  55. package/dist/src/bitgo/litecoin/index.js +6 -2
  56. package/dist/src/bitgo/nonStandardHalfSigned.js +2 -3
  57. package/dist/src/bitgo/outputScripts.d.ts +8 -8
  58. package/dist/src/bitgo/outputScripts.d.ts.map +1 -1
  59. package/dist/src/bitgo/outputScripts.js +56 -39
  60. package/dist/src/bitgo/parseInput.d.ts +7 -8
  61. package/dist/src/bitgo/parseInput.d.ts.map +1 -1
  62. package/dist/src/bitgo/parseInput.js +15 -16
  63. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts +0 -1
  64. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +1 -1
  65. package/dist/src/bitgo/psbt/fromHalfSigned.js +7 -8
  66. package/dist/src/bitgo/psbt/scriptTypes.d.ts +0 -1
  67. package/dist/src/bitgo/psbt/scriptTypes.d.ts.map +1 -1
  68. package/dist/src/bitgo/psbt/scriptTypes.js +7 -8
  69. package/dist/src/bitgo/signature.d.ts +4 -5
  70. package/dist/src/bitgo/signature.d.ts.map +1 -1
  71. package/dist/src/bitgo/signature.js +32 -18
  72. package/dist/src/bitgo/tnumber.js +2 -3
  73. package/dist/src/bitgo/transaction.d.ts +31 -4
  74. package/dist/src/bitgo/transaction.d.ts.map +1 -1
  75. package/dist/src/bitgo/transaction.js +55 -27
  76. package/dist/src/bitgo/transactionAmounts.d.ts +9 -0
  77. package/dist/src/bitgo/transactionAmounts.d.ts.map +1 -0
  78. package/dist/src/bitgo/transactionAmounts.js +32 -0
  79. package/dist/src/bitgo/types.d.ts +8 -2
  80. package/dist/src/bitgo/types.d.ts.map +1 -1
  81. package/dist/src/bitgo/types.js +12 -4
  82. package/dist/src/bitgo/wallet/Psbt.d.ts +90 -27
  83. package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
  84. package/dist/src/bitgo/wallet/Psbt.js +246 -108
  85. package/dist/src/bitgo/wallet/ScriptId.d.ts +14 -0
  86. package/dist/src/bitgo/wallet/ScriptId.d.ts.map +1 -0
  87. package/dist/src/bitgo/wallet/ScriptId.js +28 -0
  88. package/dist/src/bitgo/wallet/Unspent.d.ts +43 -10
  89. package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
  90. package/dist/src/bitgo/wallet/Unspent.js +174 -81
  91. package/dist/src/bitgo/wallet/WalletKeys.d.ts +1 -2
  92. package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +1 -1
  93. package/dist/src/bitgo/wallet/WalletKeys.js +3 -3
  94. package/dist/src/bitgo/wallet/WalletOutput.d.ts +70 -2
  95. package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -1
  96. package/dist/src/bitgo/wallet/WalletOutput.js +179 -43
  97. package/dist/src/bitgo/wallet/WalletScripts.js +4 -5
  98. package/dist/src/bitgo/wallet/WalletUnspentSigner.js +7 -7
  99. package/dist/src/bitgo/wallet/chains.d.ts +2 -2
  100. package/dist/src/bitgo/wallet/chains.d.ts.map +1 -1
  101. package/dist/src/bitgo/wallet/chains.js +10 -10
  102. package/dist/src/bitgo/wallet/index.d.ts +3 -0
  103. package/dist/src/bitgo/wallet/index.d.ts.map +1 -1
  104. package/dist/src/bitgo/wallet/index.js +9 -2
  105. package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts +50 -0
  106. package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts.map +1 -0
  107. package/dist/src/bitgo/wallet/psbt/PsbtOutputs.js +85 -0
  108. package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts +32 -0
  109. package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts.map +1 -0
  110. package/dist/src/bitgo/wallet/psbt/RootNodes.js +123 -0
  111. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts +1 -2
  112. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts.map +1 -1
  113. package/dist/src/bitgo/zcash/ZcashBufferutils.js +15 -15
  114. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +1 -2
  115. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
  116. package/dist/src/bitgo/zcash/ZcashPsbt.js +15 -19
  117. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +3 -2
  118. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +1 -1
  119. package/dist/src/bitgo/zcash/ZcashTransaction.js +31 -21
  120. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts +0 -1
  121. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts.map +1 -1
  122. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +6 -4
  123. package/dist/src/bitgo/zcash/address.d.ts +0 -1
  124. package/dist/src/bitgo/zcash/address.d.ts.map +1 -1
  125. package/dist/src/bitgo/zcash/address.js +7 -8
  126. package/dist/src/bitgo/zcash/hashZip0244.d.ts +1 -2
  127. package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +1 -1
  128. package/dist/src/bitgo/zcash/hashZip0244.js +9 -10
  129. package/dist/src/bitgo/zcash/index.js +6 -2
  130. package/dist/src/classify.d.ts +0 -1
  131. package/dist/src/classify.d.ts.map +1 -1
  132. package/dist/src/classify.js +5 -5
  133. package/dist/src/index.js +6 -2
  134. package/dist/src/networks.d.ts +2 -2
  135. package/dist/src/networks.d.ts.map +1 -1
  136. package/dist/src/networks.js +67 -21
  137. package/dist/src/noble_ecc.d.ts +7 -7
  138. package/dist/src/noble_ecc.d.ts.map +1 -1
  139. package/dist/src/noble_ecc.js +5 -5
  140. package/dist/src/payments/p2tr.js +13 -18
  141. package/dist/src/payments/p2tr_ns.js +3 -5
  142. package/dist/src/taproot.d.ts +1 -2
  143. package/dist/src/taproot.d.ts.map +1 -1
  144. package/dist/src/taproot.js +21 -22
  145. package/dist/src/templates/multisig/input.d.ts +0 -1
  146. package/dist/src/templates/multisig/input.d.ts.map +1 -1
  147. package/dist/src/templates/multisig/input.js +2 -3
  148. package/dist/src/templates/multisig/output.d.ts +0 -1
  149. package/dist/src/templates/multisig/output.d.ts.map +1 -1
  150. package/dist/src/templates/multisig/output.js +2 -3
  151. package/dist/src/templates/nulldata.d.ts +0 -1
  152. package/dist/src/templates/nulldata.d.ts.map +1 -1
  153. package/dist/src/templates/nulldata.js +3 -3
  154. package/dist/src/templates/pubkey/input.d.ts +0 -1
  155. package/dist/src/templates/pubkey/input.d.ts.map +1 -1
  156. package/dist/src/templates/pubkey/input.js +2 -3
  157. package/dist/src/templates/pubkey/output.d.ts +0 -1
  158. package/dist/src/templates/pubkey/output.d.ts.map +1 -1
  159. package/dist/src/templates/pubkey/output.js +2 -3
  160. package/dist/src/templates/pubkeyhash/input.d.ts +0 -1
  161. package/dist/src/templates/pubkeyhash/input.d.ts.map +1 -1
  162. package/dist/src/templates/pubkeyhash/input.js +2 -3
  163. package/dist/src/templates/pubkeyhash/output.d.ts +0 -1
  164. package/dist/src/templates/pubkeyhash/output.d.ts.map +1 -1
  165. package/dist/src/templates/pubkeyhash/output.js +2 -3
  166. package/dist/src/templates/scripthash/input.d.ts +0 -1
  167. package/dist/src/templates/scripthash/input.d.ts.map +1 -1
  168. package/dist/src/templates/scripthash/input.js +2 -3
  169. package/dist/src/templates/scripthash/output.d.ts +0 -1
  170. package/dist/src/templates/scripthash/output.d.ts.map +1 -1
  171. package/dist/src/templates/scripthash/output.js +2 -3
  172. package/dist/src/templates/taproot/input.d.ts +0 -1
  173. package/dist/src/templates/taproot/input.d.ts.map +1 -1
  174. package/dist/src/templates/taproot/input.js +2 -3
  175. package/dist/src/templates/taproot/output.d.ts +0 -1
  176. package/dist/src/templates/taproot/output.d.ts.map +1 -1
  177. package/dist/src/templates/taproot/output.js +2 -3
  178. package/dist/src/templates/taprootnofn/input.d.ts +0 -1
  179. package/dist/src/templates/taprootnofn/input.d.ts.map +1 -1
  180. package/dist/src/templates/taprootnofn/input.js +2 -3
  181. package/dist/src/templates/taprootnofn/output.d.ts +0 -1
  182. package/dist/src/templates/taprootnofn/output.d.ts.map +1 -1
  183. package/dist/src/templates/taprootnofn/output.js +2 -3
  184. package/dist/src/templates/witnesscommitment/output.d.ts +0 -1
  185. package/dist/src/templates/witnesscommitment/output.d.ts.map +1 -1
  186. package/dist/src/templates/witnesscommitment/output.js +4 -5
  187. package/dist/src/templates/witnesspubkeyhash/input.d.ts +0 -1
  188. package/dist/src/templates/witnesspubkeyhash/input.d.ts.map +1 -1
  189. package/dist/src/templates/witnesspubkeyhash/input.js +2 -3
  190. package/dist/src/templates/witnesspubkeyhash/output.d.ts +0 -1
  191. package/dist/src/templates/witnesspubkeyhash/output.d.ts.map +1 -1
  192. package/dist/src/templates/witnesspubkeyhash/output.js +2 -3
  193. package/dist/src/templates/witnessscripthash/input.d.ts +0 -1
  194. package/dist/src/templates/witnessscripthash/input.d.ts.map +1 -1
  195. package/dist/src/templates/witnessscripthash/input.js +2 -3
  196. package/dist/src/templates/witnessscripthash/output.d.ts +0 -1
  197. package/dist/src/templates/witnessscripthash/output.d.ts.map +1 -1
  198. package/dist/src/templates/witnessscripthash/output.js +2 -3
  199. package/dist/src/testutil/index.d.ts +1 -0
  200. package/dist/src/testutil/index.d.ts.map +1 -1
  201. package/dist/src/testutil/index.js +7 -2
  202. package/dist/src/testutil/keys.d.ts +6 -3
  203. package/dist/src/testutil/keys.d.ts.map +1 -1
  204. package/dist/src/testutil/keys.js +24 -10
  205. package/dist/src/testutil/mock.d.ts +2 -3
  206. package/dist/src/testutil/mock.d.ts.map +1 -1
  207. package/dist/src/testutil/mock.js +31 -23
  208. package/dist/src/testutil/psbt.d.ts +40 -16
  209. package/dist/src/testutil/psbt.d.ts.map +1 -1
  210. package/dist/src/testutil/psbt.js +54 -39
  211. package/dist/src/testutil/transaction.d.ts +18 -7
  212. package/dist/src/testutil/transaction.d.ts.map +1 -1
  213. package/dist/src/testutil/transaction.js +33 -26
  214. package/dist/src/transaction_builder.d.ts +0 -1
  215. package/dist/src/transaction_builder.d.ts.map +1 -1
  216. package/dist/src/transaction_builder.js +13 -18
  217. package/package.json +10 -12
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UtxoPsbt = exports.ProprietaryKeySubtype = exports.PSBT_PROPRIETARY_IDENTIFIER = void 0;
3
+ exports.UtxoPsbt = void 0;
4
+ const assert = require("assert");
4
5
  const bip174_1 = require("bip174");
5
6
  const utils_1 = require("bip174/src/lib/utils");
6
7
  const bufferutils_1 = require("bitcoinjs-lib/src/bufferutils");
@@ -17,20 +18,36 @@ const parseInput_1 = require("./parseInput");
17
18
  const Musig2_1 = require("./Musig2");
18
19
  const types_1 = require("./types");
19
20
  const taproot_1 = require("../taproot");
20
- exports.PSBT_PROPRIETARY_IDENTIFIER = 'BITGO';
21
- var ProprietaryKeySubtype;
22
- (function (ProprietaryKeySubtype) {
23
- ProprietaryKeySubtype[ProprietaryKeySubtype["ZEC_CONSENSUS_BRANCH_ID"] = 0] = "ZEC_CONSENSUS_BRANCH_ID";
24
- ProprietaryKeySubtype[ProprietaryKeySubtype["MUSIG2_PARTICIPANT_PUB_KEYS"] = 1] = "MUSIG2_PARTICIPANT_PUB_KEYS";
25
- ProprietaryKeySubtype[ProprietaryKeySubtype["MUSIG2_PUB_NONCE"] = 2] = "MUSIG2_PUB_NONCE";
26
- ProprietaryKeySubtype[ProprietaryKeySubtype["MUSIG2_PARTIAL_SIG"] = 3] = "MUSIG2_PARTIAL_SIG";
27
- })(ProprietaryKeySubtype = exports.ProprietaryKeySubtype || (exports.ProprietaryKeySubtype = {}));
28
- const defaultSignatureParams = {
29
- deterministic: false,
30
- sighashTypes: [__1.Transaction.SIGHASH_DEFAULT, __1.Transaction.SIGHASH_ALL],
31
- };
32
- function toSignatureParams(v) {
33
- return Array.isArray(v) ? toSignatureParams({ sighashTypes: v }) : { ...defaultSignatureParams, ...v };
21
+ const PsbtUtil_1 = require("./PsbtUtil");
22
+ function defaultSighashTypes() {
23
+ return [__1.Transaction.SIGHASH_DEFAULT, __1.Transaction.SIGHASH_ALL];
24
+ }
25
+ function addForkIdToSighashesIfNeeded(network, sighashTypes) {
26
+ switch ((0, __1.getMainnet)(network)) {
27
+ case __1.networks.bitcoincash:
28
+ case __1.networks.bitcoinsv:
29
+ case __1.networks.bitcoingold:
30
+ case __1.networks.ecash:
31
+ return [...sighashTypes, ...sighashTypes.map((s) => s | UtxoTransaction_1.UtxoTransaction.SIGHASH_FORKID)];
32
+ default:
33
+ return sighashTypes;
34
+ }
35
+ }
36
+ function toSignatureParams(network, v) {
37
+ if (Array.isArray(v))
38
+ return toSignatureParams(network, { sighashTypes: v });
39
+ const defaultSignatureParams = { deterministic: false, sighashTypes: defaultSighashTypes() };
40
+ const ret = { ...defaultSignatureParams, ...v };
41
+ ret.sighashTypes = addForkIdToSighashesIfNeeded(network, ret.sighashTypes);
42
+ return ret;
43
+ }
44
+ /**
45
+ * @param a
46
+ * @param b
47
+ * @returns true if the two public keys are equal ignoring the y coordinate.
48
+ */
49
+ function equalPublicKeyIgnoreY(a, b) {
50
+ return (0, outputScripts_1.toXOnlyPublicKey)(a).equals((0, outputScripts_1.toXOnlyPublicKey)(b));
34
51
  }
35
52
  // TODO: upstream does `checkInputsForPartialSigs` before doing things like
36
53
  // `setVersion`. Our inputs could have tapscriptsigs (or in future tapkeysigs)
@@ -64,10 +81,11 @@ class UtxoPsbt extends __1.Psbt {
64
81
  /**
65
82
  * @param parent - Parent key. Matched with `bip32Derivations` using `fingerprint` property.
66
83
  * @param bip32Derivations - possible derivations for input or output
84
+ * @param ignoreY - when true, ignore the y coordinate when matching public keys
67
85
  * @return derived bip32 node if matching derivation is found, undefined if none is found
68
86
  * @throws Error if more than one match is found
69
87
  */
70
- static deriveKeyPair(parent, bip32Derivations) {
88
+ static deriveKeyPair(parent, bip32Derivations, { ignoreY }) {
71
89
  const matchingDerivations = bip32Derivations.filter((bipDv) => {
72
90
  return bipDv.masterFingerprint.equals(parent.fingerprint);
73
91
  });
@@ -80,11 +98,20 @@ class UtxoPsbt extends __1.Psbt {
80
98
  }
81
99
  const [derivation] = matchingDerivations;
82
100
  const node = parent.derivePath(derivation.path);
83
- if (!derivation.pubkey.equals(node.publicKey) && !derivation.pubkey.equals(outputScripts_1.toXOnlyPublicKey(node.publicKey))) {
84
- throw new Error('pubkey did not match bip32Derivation');
101
+ if (!node.publicKey.equals(derivation.pubkey)) {
102
+ if (!ignoreY || !equalPublicKeyIgnoreY(node.publicKey, derivation.pubkey)) {
103
+ throw new Error('pubkey did not match bip32Derivation');
104
+ }
85
105
  }
86
106
  return node;
87
107
  }
108
+ static deriveKeyPairForInput(bip32, input) {
109
+ return input.tapBip32Derivation?.length
110
+ ? UtxoPsbt.deriveKeyPair(bip32, input.tapBip32Derivation, { ignoreY: true })?.publicKey
111
+ : input.bip32Derivation?.length
112
+ ? UtxoPsbt.deriveKeyPair(bip32, input.bip32Derivation, { ignoreY: false })?.publicKey
113
+ : bip32?.publicKey;
114
+ }
88
115
  get network() {
89
116
  return this.tx.network;
90
117
  }
@@ -92,24 +119,14 @@ class UtxoPsbt extends __1.Psbt {
92
119
  return this.toBuffer().toString('hex');
93
120
  }
94
121
  /**
95
- * @return true iff PSBT input is finalized
122
+ * It is expensive to attempt to compute every output address using psbt.txOutputs[outputIndex]
123
+ * to then just get the script. Here, we are doing the same thing as what txOutputs() does in
124
+ * bitcoinjs-lib, but without iterating over each output.
125
+ * @param outputIndex
126
+ * @returns output script at the given index
96
127
  */
97
- isInputFinalized(inputIndex) {
98
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
99
- return Buffer.isBuffer(input.finalScriptSig) || Buffer.isBuffer(input.finalScriptWitness);
100
- }
101
- /**
102
- * @return partialSig/tapScriptSig count iff input is not finalized
103
- */
104
- getSignatureCount(inputIndex) {
105
- if (this.isInputFinalized(inputIndex)) {
106
- throw new Error('Input is already finalized');
107
- }
108
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
109
- return Math.max(Array.isArray(input.partialSig) ? input.partialSig.length : 0, Array.isArray(input.tapScriptSig) ? input.tapScriptSig.length : 0, this.getProprietaryKeyVals(inputIndex, {
110
- identifier: exports.PSBT_PROPRIETARY_IDENTIFIER,
111
- subtype: ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
112
- }).length);
128
+ getOutputScript(outputIndex) {
129
+ return this.__CACHE.__TX.outs[outputIndex].script;
113
130
  }
114
131
  getNonWitnessPreviousTxids() {
115
132
  const txInputs = this.txInputs; // These are somewhat costly to extract
@@ -118,8 +135,8 @@ class UtxoPsbt extends __1.Psbt {
118
135
  if (!input.witnessUtxo) {
119
136
  throw new Error('Must have witness UTXO for all inputs');
120
137
  }
121
- if (!scriptTypes_1.isSegwit(input.witnessUtxo.script, input.redeemScript)) {
122
- txidSet.add(Unspent_1.getOutputIdForInput(txInputs[index]).txid);
138
+ if (!(0, scriptTypes_1.isSegwit)(input.witnessUtxo.script, input.redeemScript)) {
139
+ txidSet.add((0, Unspent_1.getOutputIdForInput)(txInputs[index]).txid);
123
140
  }
124
141
  });
125
142
  return [...txidSet];
@@ -130,8 +147,8 @@ class UtxoPsbt extends __1.Psbt {
130
147
  if (!input.witnessUtxo) {
131
148
  throw new Error('Must have witness UTXO for all inputs');
132
149
  }
133
- if (!scriptTypes_1.isSegwit(input.witnessUtxo.script, input.redeemScript)) {
134
- const { txid } = Unspent_1.getOutputIdForInput(txInputs[index]);
150
+ if (!(0, scriptTypes_1.isSegwit)(input.witnessUtxo.script, input.redeemScript)) {
151
+ const { txid } = (0, Unspent_1.getOutputIdForInput)(txInputs[index]);
135
152
  if (txBufs[txid] === undefined) {
136
153
  throw new Error('Not all required previous transactions provided');
137
154
  }
@@ -145,7 +162,7 @@ class UtxoPsbt extends __1.Psbt {
145
162
  throw new Error(`Transaction has ${transaction.ins.length} inputs, but ${prevOutputs.length} previous outputs provided`);
146
163
  }
147
164
  const clonedTransaction = transaction.clone();
148
- const updates = fromHalfSigned_1.unsign(clonedTransaction, prevOutputs);
165
+ const updates = (0, fromHalfSigned_1.unsign)(clonedTransaction, prevOutputs);
149
166
  const psbtBase = new bip174_1.Psbt(new __1.PsbtTransaction({ tx: clonedTransaction }));
150
167
  clonedTransaction.ins.forEach(() => psbtBase.inputs.push({ unknownKeyVals: [] }));
151
168
  clonedTransaction.outs.forEach(() => psbtBase.outputs.push({ unknownKeyVals: [] }));
@@ -167,9 +184,8 @@ class UtxoPsbt extends __1.Psbt {
167
184
  }
168
185
  checkForSignatures(propName) {
169
186
  this.data.inputs.forEach((input) => {
170
- var _a, _b;
171
- if (((_a = input.tapScriptSig) === null || _a === void 0 ? void 0 : _a.length) || input.tapKeySig || ((_b = input.partialSig) === null || _b === void 0 ? void 0 : _b.length)) {
172
- throw new Error(`Cannot modify ${propName !== null && propName !== void 0 ? propName : 'transaction'} - signatures exist.`);
187
+ if (input.tapScriptSig?.length || input.tapKeySig || input.partialSig?.length) {
188
+ throw new Error(`Cannot modify ${propName ?? 'transaction'} - signatures exist.`);
173
189
  }
174
190
  });
175
191
  }
@@ -178,44 +194,41 @@ class UtxoPsbt extends __1.Psbt {
178
194
  * Checks for presence of minimum required key path input fields and absence of any script path only input fields.
179
195
  */
180
196
  isTaprootKeyPathInput(inputIndex) {
181
- var _a, _b, _c;
182
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
197
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
183
198
  return (!!input.tapInternalKey &&
184
199
  !!input.tapMerkleRoot &&
185
- !(((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) ||
186
- ((_b = input.tapScriptSig) === null || _b === void 0 ? void 0 : _b.length) ||
187
- ((_c = input.tapBip32Derivation) === null || _c === void 0 ? void 0 : _c.some((v) => v.leafHashes.length))));
200
+ !(input.tapLeafScript?.length ||
201
+ input.tapScriptSig?.length ||
202
+ input.tapBip32Derivation?.some((v) => v.leafHashes.length)));
188
203
  }
189
204
  /**
190
205
  * @returns true if the input at inputIndex is a taproot script path.
191
206
  * Checks for presence of minimum required script path input fields and absence of any key path only input fields.
192
207
  */
193
208
  isTaprootScriptPathInput(inputIndex) {
194
- var _a;
195
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
196
- return (!!((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) &&
209
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
210
+ return (!!input.tapLeafScript?.length &&
197
211
  !(this.getProprietaryKeyVals(inputIndex, {
198
- identifier: exports.PSBT_PROPRIETARY_IDENTIFIER,
199
- subtype: ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
212
+ identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
213
+ subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
200
214
  }).length ||
201
215
  this.getProprietaryKeyVals(inputIndex, {
202
- identifier: exports.PSBT_PROPRIETARY_IDENTIFIER,
203
- subtype: ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
216
+ identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
217
+ subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
204
218
  }).length ||
205
219
  this.getProprietaryKeyVals(inputIndex, {
206
- identifier: exports.PSBT_PROPRIETARY_IDENTIFIER,
207
- subtype: ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
220
+ identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
221
+ subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
208
222
  }).length));
209
223
  }
210
224
  /**
211
225
  * @returns true if the input at inputIndex is a taproot
212
226
  */
213
227
  isTaprootInput(inputIndex) {
214
- var _a, _b, _c;
215
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
228
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
216
229
  const isP2TR = (script) => {
217
230
  try {
218
- taproot_1.getTaprootOutputKey(script);
231
+ (0, taproot_1.getTaprootOutputKey)(script);
219
232
  return true;
220
233
  }
221
234
  catch (e) {
@@ -224,41 +237,40 @@ class UtxoPsbt extends __1.Psbt {
224
237
  };
225
238
  return !!(input.tapInternalKey ||
226
239
  input.tapMerkleRoot ||
227
- ((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) ||
228
- ((_b = input.tapBip32Derivation) === null || _b === void 0 ? void 0 : _b.length) ||
229
- ((_c = input.tapScriptSig) === null || _c === void 0 ? void 0 : _c.length) ||
240
+ input.tapLeafScript?.length ||
241
+ input.tapBip32Derivation?.length ||
242
+ input.tapScriptSig?.length ||
230
243
  this.getProprietaryKeyVals(inputIndex, {
231
- identifier: exports.PSBT_PROPRIETARY_IDENTIFIER,
232
- subtype: ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
244
+ identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
245
+ subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
233
246
  }).length ||
234
247
  this.getProprietaryKeyVals(inputIndex, {
235
- identifier: exports.PSBT_PROPRIETARY_IDENTIFIER,
236
- subtype: ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
248
+ identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
249
+ subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
237
250
  }).length ||
238
251
  this.getProprietaryKeyVals(inputIndex, {
239
- identifier: exports.PSBT_PROPRIETARY_IDENTIFIER,
240
- subtype: ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
252
+ identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
253
+ subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
241
254
  }).length ||
242
255
  (input.witnessUtxo && isP2TR(input.witnessUtxo.script)));
243
256
  }
257
+ isMultisigTaprootScript(script) {
258
+ try {
259
+ (0, parseInput_1.parsePubScript2Of3)(script, 'taprootScriptPathSpend');
260
+ return true;
261
+ }
262
+ catch (e) {
263
+ return false;
264
+ }
265
+ }
244
266
  /**
245
267
  * Mostly copied from bitcoinjs-lib/ts_src/psbt.ts
246
268
  */
247
269
  finalizeAllInputs() {
248
- const isMultisigTaprootScript = (script) => {
249
- try {
250
- parseInput_1.parsePubScript2Of3(script, 'taprootScriptPathSpend');
251
- return true;
252
- }
253
- catch (e) {
254
- return false;
255
- }
256
- };
257
- utils_1.checkForInput(this.data.inputs, 0); // making sure we have at least one
270
+ (0, utils_1.checkForInput)(this.data.inputs, 0); // making sure we have at least one
258
271
  this.data.inputs.map((input, idx) => {
259
- var _a;
260
- if ((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) {
261
- return isMultisigTaprootScript(input.tapLeafScript[0].script)
272
+ if (input.tapLeafScript?.length) {
273
+ return this.isMultisigTaprootScript(input.tapLeafScript[0].script)
262
274
  ? this.finalizeTaprootInput(idx)
263
275
  : this.finalizeTapInputWithSingleLeafScriptAndSignature(idx);
264
276
  }
@@ -270,21 +282,27 @@ class UtxoPsbt extends __1.Psbt {
270
282
  return this;
271
283
  }
272
284
  finalizeTaprootInput(inputIndex) {
273
- var _a, _b;
274
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
285
+ const sanitizeSignature = (sig) => {
286
+ const sighashType = sig.length === 64 ? __1.Transaction.SIGHASH_DEFAULT : sig.readUInt8(sig.length - 1);
287
+ const inputSighashType = input.sighashType === undefined ? __1.Transaction.SIGHASH_DEFAULT : input.sighashType;
288
+ assert(sighashType === inputSighashType, 'signature sighash does not match input sighash type');
289
+ // TODO BTC-663 This should be fixed in platform. This is just a workaround fix.
290
+ return sighashType === __1.Transaction.SIGHASH_DEFAULT && sig.length === 65 ? sig.slice(0, 64) : sig;
291
+ };
292
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
275
293
  // witness = control-block script first-sig second-sig
276
- if (((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) !== 1) {
294
+ if (input.tapLeafScript?.length !== 1) {
277
295
  throw new Error('Only one leaf script supported for finalizing');
278
296
  }
279
297
  const { controlBlock, script } = input.tapLeafScript[0];
280
298
  const witness = [script, controlBlock];
281
- const [pubkey1, pubkey2] = parseInput_1.parsePubScript2Of3(script, 'taprootScriptPathSpend').publicKeys;
299
+ const [pubkey1, pubkey2] = (0, parseInput_1.parsePubScript2Of3)(script, 'taprootScriptPathSpend').publicKeys;
282
300
  for (const pk of [pubkey1, pubkey2]) {
283
- const sig = (_b = input.tapScriptSig) === null || _b === void 0 ? void 0 : _b.find(({ pubkey }) => pubkey.equals(pk));
301
+ const sig = input.tapScriptSig?.find(({ pubkey }) => equalPublicKeyIgnoreY(pk, pubkey));
284
302
  if (!sig) {
285
303
  throw new Error('Could not find signatures in Script Sig.');
286
304
  }
287
- witness.unshift(sig.signature);
305
+ witness.unshift(sanitizeSignature(sig.signature));
288
306
  }
289
307
  const witnessLength = witness.reduce((s, b) => s + b.length + bufferutils_1.varuint.encodingLength(b.length), 1);
290
308
  const bufferWriter = bufferutils_1.BufferWriter.withCapacity(witnessLength);
@@ -299,13 +317,14 @@ class UtxoPsbt extends __1.Psbt {
299
317
  * IMPORTANT: Always call validate* function before finalizing.
300
318
  */
301
319
  finalizeTaprootMusig2Input(inputIndex) {
302
- const partialSigs = Musig2_1.parsePsbtMusig2PartialSigs(this, inputIndex);
303
- if ((partialSigs === null || partialSigs === void 0 ? void 0 : partialSigs.length) !== 2) {
320
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
321
+ const partialSigs = (0, Musig2_1.parsePsbtMusig2PartialSigs)(input);
322
+ if (partialSigs?.length !== 2) {
304
323
  throw new Error(`invalid number of partial signatures ${partialSigs ? partialSigs.length : 0} to finalize`);
305
324
  }
306
- const { partialSigs: pSigs, sigHashType } = Musig2_1.getSigHashTypeFromSigs(partialSigs);
325
+ const { partialSigs: pSigs, sigHashType } = (0, Musig2_1.getSigHashTypeFromSigs)(partialSigs);
307
326
  const { sessionKey } = this.getMusig2SessionKey(inputIndex, sigHashType);
308
- const aggSig = Musig2_1.musig2AggregateSigs(pSigs.map((pSig) => pSig.partialSig), sessionKey);
327
+ const aggSig = (0, Musig2_1.musig2AggregateSigs)(pSigs.map((pSig) => pSig.partialSig), sessionKey);
309
328
  const sig = sigHashType === __1.Transaction.SIGHASH_DEFAULT ? aggSig : Buffer.concat([aggSig, Buffer.of(sigHashType)]);
310
329
  // single signature with 64/65 bytes size is script witness for key path spend
311
330
  const bufferWriter = bufferutils_1.BufferWriter.withCapacity(1 + bufferutils_1.varuint.encodingLength(sig.length) + sig.length);
@@ -314,16 +333,15 @@ class UtxoPsbt extends __1.Psbt {
314
333
  this.data.updateInput(inputIndex, { finalScriptWitness });
315
334
  this.data.clearFinalizedInput(inputIndex);
316
335
  // deleting only BitGo proprietary key values.
317
- this.deleteProprietaryKeyVals(inputIndex, { identifier: exports.PSBT_PROPRIETARY_IDENTIFIER });
336
+ this.deleteProprietaryKeyVals(inputIndex, { identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER });
318
337
  return this;
319
338
  }
320
339
  finalizeTapInputWithSingleLeafScriptAndSignature(inputIndex) {
321
- var _a, _b;
322
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
323
- if (((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) !== 1) {
340
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
341
+ if (input.tapLeafScript?.length !== 1) {
324
342
  throw new Error('Only one leaf script supported for finalizing');
325
343
  }
326
- if (((_b = input.tapScriptSig) === null || _b === void 0 ? void 0 : _b.length) !== 1) {
344
+ if (input.tapScriptSig?.length !== 1) {
327
345
  throw new Error('Could not find signatures in Script Sig.');
328
346
  }
329
347
  const { controlBlock, script } = input.tapLeafScript[0];
@@ -344,7 +362,7 @@ class UtxoPsbt extends __1.Psbt {
344
362
  * validator.
345
363
  */
346
364
  validateSignaturesOfAllInputs() {
347
- utils_1.checkForInput(this.data.inputs, 0); // making sure we have at least one
365
+ (0, utils_1.checkForInput)(this.data.inputs, 0); // making sure we have at least one
348
366
  const results = this.data.inputs.map((input, idx) => {
349
367
  return this.validateSignaturesOfInputCommon(idx);
350
368
  });
@@ -354,13 +372,8 @@ class UtxoPsbt extends __1.Psbt {
354
372
  * @returns true iff any matching valid signature is found for a derived pub key from given HD key pair.
355
373
  */
356
374
  validateSignaturesOfInputHD(inputIndex, hdKeyPair) {
357
- var _a, _b, _c, _d;
358
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
359
- const pubKey = ((_a = input.tapBip32Derivation) === null || _a === void 0 ? void 0 : _a.length)
360
- ? (_b = UtxoPsbt.deriveKeyPair(hdKeyPair, input.tapBip32Derivation)) === null || _b === void 0 ? void 0 : _b.publicKey
361
- : ((_c = input.bip32Derivation) === null || _c === void 0 ? void 0 : _c.length)
362
- ? (_d = UtxoPsbt.deriveKeyPair(hdKeyPair, input.bip32Derivation)) === null || _d === void 0 ? void 0 : _d.publicKey
363
- : undefined;
375
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
376
+ const pubKey = UtxoPsbt.deriveKeyPairForInput(hdKeyPair, input);
364
377
  if (!pubKey) {
365
378
  throw new Error('can not derive from HD key pair');
366
379
  }
@@ -388,14 +401,14 @@ class UtxoPsbt extends __1.Psbt {
388
401
  }
389
402
  }
390
403
  getMusig2SessionKey(inputIndex, sigHashType) {
391
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
404
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
392
405
  if (!input.tapInternalKey || !input.tapMerkleRoot) {
393
406
  throw new Error('both tapInternalKey and tapMerkleRoot are required');
394
407
  }
395
408
  const participants = this.getMusig2Participants(inputIndex, input.tapInternalKey, input.tapMerkleRoot);
396
409
  const nonces = this.getMusig2Nonces(inputIndex, participants);
397
410
  const { hash } = this.getTaprootHashForSig(inputIndex, [sigHashType]);
398
- const sessionKey = Musig2_1.createMusig2SigningSession({
411
+ const sessionKey = (0, Musig2_1.createMusig2SigningSession)({
399
412
  pubNonces: [nonces[0].pubNonce, nonces[1].pubNonce],
400
413
  pubKeys: participants.participantPubKeys,
401
414
  txHash: hash,
@@ -406,40 +419,40 @@ class UtxoPsbt extends __1.Psbt {
406
419
  }
407
420
  /**
408
421
  * @returns true for following cases.
409
- * If valid musig2 partial signatures exists for both 2 keys, it will also verifies aggregated sig
422
+ * If valid musig2 partial signatures exists for both 2 keys, it will also verify aggregated sig
410
423
  * for aggregated tweaked key (output key), otherwise only verifies partial sig.
411
424
  * If pubkey is passed in input, it will check sig only for that pubkey,
412
425
  * if no sig exits for such key, throws error.
413
426
  * For invalid state of input data, it will throw errors.
414
427
  */
415
428
  validateTaprootMusig2SignaturesOfInput(inputIndex, pubkey) {
416
- const partialSigs = Musig2_1.parsePsbtMusig2PartialSigs(this, inputIndex);
429
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
430
+ const partialSigs = (0, Musig2_1.parsePsbtMusig2PartialSigs)(input);
417
431
  if (!partialSigs) {
418
432
  throw new Error(`No signatures to validate`);
419
433
  }
420
434
  let myPartialSigs = partialSigs;
421
435
  if (pubkey) {
422
- outputScripts_1.checkPlainPublicKey(pubkey);
423
- myPartialSigs = partialSigs.filter((kv) => kv.participantPubKey.equals(pubkey));
424
- if ((myPartialSigs === null || myPartialSigs === void 0 ? void 0 : myPartialSigs.length) < 1) {
436
+ myPartialSigs = partialSigs.filter((kv) => equalPublicKeyIgnoreY(kv.participantPubKey, pubkey));
437
+ if (myPartialSigs?.length < 1) {
425
438
  throw new Error('No signatures for this pubkey');
426
439
  }
427
440
  }
428
- const { partialSigs: mySigs, sigHashType } = Musig2_1.getSigHashTypeFromSigs(myPartialSigs);
441
+ const { partialSigs: mySigs, sigHashType } = (0, Musig2_1.getSigHashTypeFromSigs)(myPartialSigs);
429
442
  const { participants, nonces, hash, sessionKey } = this.getMusig2SessionKey(inputIndex, sigHashType);
430
443
  const results = mySigs.map((mySig) => {
431
- const myNonce = nonces.find((kv) => kv.participantPubKey.equals(mySig.participantPubKey));
444
+ const myNonce = nonces.find((kv) => equalPublicKeyIgnoreY(kv.participantPubKey, mySig.participantPubKey));
432
445
  if (!myNonce) {
433
446
  throw new Error('Found no pub nonce for pubkey');
434
447
  }
435
- return Musig2_1.musig2PartialSigVerify(mySig.partialSig, mySig.participantPubKey, myNonce.pubNonce, sessionKey);
448
+ return (0, Musig2_1.musig2PartialSigVerify)(mySig.partialSig, mySig.participantPubKey, myNonce.pubNonce, sessionKey);
436
449
  });
437
450
  // For valid single sig or 1 or 2 failure sigs, no need to validate aggregated sig. So skip.
438
451
  const result = results.every((res) => res);
439
452
  if (!result || mySigs.length < 2) {
440
453
  return result;
441
454
  }
442
- const aggSig = Musig2_1.musig2AggregateSigs(mySigs.map((mySig) => mySig.partialSig), sessionKey);
455
+ const aggSig = (0, Musig2_1.musig2AggregateSigs)(mySigs.map((mySig) => mySig.partialSig), sessionKey);
443
456
  return __1.ecc.verifySchnorr(hash, participants.tapOutputKey, aggSig);
444
457
  }
445
458
  validateTaprootSignaturesOfInput(inputIndex, pubkey) {
@@ -450,8 +463,7 @@ class UtxoPsbt extends __1.Psbt {
450
463
  }
451
464
  let mySigs;
452
465
  if (pubkey) {
453
- const xOnlyPubkey = outputScripts_1.toXOnlyPublicKey(pubkey);
454
- mySigs = tapSigs.filter((sig) => sig.pubkey.equals(xOnlyPubkey));
466
+ mySigs = tapSigs.filter((sig) => equalPublicKeyIgnoreY(sig.pubkey, pubkey));
455
467
  if (mySigs.length < 1) {
456
468
  throw new Error('No signatures for this pubkey');
457
469
  }
@@ -460,8 +472,16 @@ class UtxoPsbt extends __1.Psbt {
460
472
  mySigs = tapSigs;
461
473
  }
462
474
  const results = [];
475
+ assert(input.tapLeafScript?.length === 1, `single tapLeafScript is expected. Got ${input.tapLeafScript?.length}`);
476
+ const [tapLeafScript] = input.tapLeafScript;
477
+ const pubKeys = this.isMultisigTaprootScript(tapLeafScript.script)
478
+ ? (0, parseInput_1.parsePubScript2Of3)(tapLeafScript.script, 'taprootScriptPathSpend').publicKeys
479
+ : undefined;
463
480
  for (const pSig of mySigs) {
464
481
  const { signature, leafHash, pubkey } = pSig;
482
+ if (pubKeys) {
483
+ assert(pubKeys.find((pk) => pubkey.equals(pk)), 'public key not found in tap leaf script');
484
+ }
465
485
  let sigHashType;
466
486
  let sig;
467
487
  if (signature.length === 65) {
@@ -478,26 +498,29 @@ class UtxoPsbt extends __1.Psbt {
478
498
  return results.every((res) => res);
479
499
  }
480
500
  /**
501
+ * @param inputIndex
502
+ * @param rootNodes optional input root bip32 nodes to verify with. If it is not provided, globalXpub will be used.
481
503
  * @return array of boolean values. True when corresponding index in `publicKeys` has signed the transaction.
482
504
  * If no signature in the tx or no public key matching signature, the validation is considered as false.
505
+ * If rootNodes are not explicitly passed in, the return array will be unordered.
506
+ * Use getSortedRootNodes() instead if ordering is important.
483
507
  */
484
- getSignatureValidationArray(inputIndex) {
485
- var _a;
486
- if (((_a = this.data.globalMap.globalXpub) === null || _a === void 0 ? void 0 : _a.length) !== 3) {
508
+ getSignatureValidationArray(inputIndex, { rootNodes }) {
509
+ if (!rootNodes && (!this.data.globalMap.globalXpub?.length || !(0, types_1.isTriple)(this.data.globalMap.globalXpub))) {
487
510
  throw new Error('Cannot get signature validation array without 3 global xpubs');
488
511
  }
489
- if (!this.getSignatureCount(inputIndex)) {
512
+ const bip32s = rootNodes
513
+ ? rootNodes
514
+ : this.data.globalMap.globalXpub?.map((xpub) => (0, bip32_1.BIP32Factory)(__1.ecc).fromBase58(bs58check.encode(xpub.extendedPubkey)));
515
+ if (!bip32s) {
516
+ throw new Error('either globalMap or rootNodes is required');
517
+ }
518
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
519
+ if (!(0, PsbtUtil_1.getPsbtInputSignatureCount)(input)) {
490
520
  return [false, false, false];
491
521
  }
492
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
493
- return this.data.globalMap.globalXpub.map((xpub) => {
494
- var _a, _b, _c, _d;
495
- const bip32 = bip32_1.BIP32Factory(__1.ecc).fromBase58(bs58check.encode(xpub.extendedPubkey));
496
- const pubKey = ((_a = input.tapBip32Derivation) === null || _a === void 0 ? void 0 : _a.length)
497
- ? (_b = UtxoPsbt.deriveKeyPair(bip32, input.tapBip32Derivation)) === null || _b === void 0 ? void 0 : _b.publicKey
498
- : ((_c = input.bip32Derivation) === null || _c === void 0 ? void 0 : _c.length)
499
- ? (_d = UtxoPsbt.deriveKeyPair(bip32, input.bip32Derivation)) === null || _d === void 0 ? void 0 : _d.publicKey
500
- : bip32 === null || bip32 === void 0 ? void 0 : bip32.publicKey;
522
+ return bip32s.map((bip32) => {
523
+ const pubKey = UtxoPsbt.deriveKeyPairForInput(bip32, input);
501
524
  if (!pubKey) {
502
525
  return false;
503
526
  }
@@ -516,11 +539,11 @@ class UtxoPsbt extends __1.Psbt {
516
539
  /**
517
540
  * Mostly copied from bitcoinjs-lib/ts_src/psbt.ts
518
541
  */
519
- signAllInputsHD(hdKeyPair, params = defaultSignatureParams) {
542
+ signAllInputsHD(hdKeyPair, params) {
520
543
  if (!hdKeyPair || !hdKeyPair.publicKey || !hdKeyPair.fingerprint) {
521
544
  throw new Error('Need HDSigner to sign input');
522
545
  }
523
- const { sighashTypes, deterministic } = toSignatureParams(params);
546
+ const { sighashTypes, deterministic } = toSignatureParams(this.network, params);
524
547
  const results = [];
525
548
  for (let i = 0; i < this.data.inputs.length; i++) {
526
549
  try {
@@ -540,14 +563,13 @@ class UtxoPsbt extends __1.Psbt {
540
563
  * Mostly copied from bitcoinjs-lib/ts_src/psbt.ts:signInputHD
541
564
  */
542
565
  signTaprootInputHD(inputIndex, hdKeyPair, { sighashTypes = [__1.Transaction.SIGHASH_DEFAULT, __1.Transaction.SIGHASH_ALL], deterministic = false } = {}) {
543
- var _a, _b;
544
566
  if (!this.isTaprootInput(inputIndex)) {
545
567
  throw new Error('not a taproot input');
546
568
  }
547
569
  if (!hdKeyPair || !hdKeyPair.publicKey || !hdKeyPair.fingerprint) {
548
570
  throw new Error('Need HDSigner to sign input');
549
571
  }
550
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
572
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
551
573
  if (!input.tapBip32Derivation || input.tapBip32Derivation.length === 0) {
552
574
  throw new Error('Need tapBip32Derivation to sign Taproot with HD');
553
575
  }
@@ -563,12 +585,12 @@ class UtxoPsbt extends __1.Psbt {
563
585
  }
564
586
  function getDerivedNode(bipDv) {
565
587
  const node = hdKeyPair.derivePath(bipDv.path);
566
- if (!bipDv.pubkey.equals(node.publicKey.slice(1))) {
588
+ if (!equalPublicKeyIgnoreY(bipDv.pubkey, node.publicKey)) {
567
589
  throw new Error('pubkey did not match tapBip32Derivation');
568
590
  }
569
591
  return node;
570
592
  }
571
- if ((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) {
593
+ if (input.tapLeafScript?.length) {
572
594
  const signers = myDerivations.map((bipDv) => {
573
595
  const signer = getDerivedNode(bipDv);
574
596
  if (!('signSchnorr' in signer)) {
@@ -578,7 +600,7 @@ class UtxoPsbt extends __1.Psbt {
578
600
  });
579
601
  signers.forEach(({ signer, leafHashes }) => this.signTaprootInput(inputIndex, signer, leafHashes, sighashTypes));
580
602
  }
581
- else if ((_b = input.tapInternalKey) === null || _b === void 0 ? void 0 : _b.length) {
603
+ else if (input.tapInternalKey?.length) {
582
604
  const signers = myDerivations.map((bipDv) => {
583
605
  const signer = getDerivedNode(bipDv);
584
606
  if (!('privateKey' in signer) || !signer.privateKey) {
@@ -590,8 +612,12 @@ class UtxoPsbt extends __1.Psbt {
590
612
  }
591
613
  return this;
592
614
  }
593
- signInputHD(inputIndex, hdKeyPair, params = defaultSignatureParams) {
594
- const { sighashTypes, deterministic } = toSignatureParams(params);
615
+ signInput(inputIndex, keyPair, sighashTypes) {
616
+ const { sighashTypes: sighashForNetwork } = toSignatureParams(this.network, sighashTypes);
617
+ return super.signInput(inputIndex, keyPair, sighashForNetwork);
618
+ }
619
+ signInputHD(inputIndex, hdKeyPair, params) {
620
+ const { sighashTypes, deterministic } = toSignatureParams(this.network, params);
595
621
  if (this.isTaprootInput(inputIndex)) {
596
622
  return this.signTaprootInputHD(inputIndex, hdKeyPair, { sighashTypes, deterministic });
597
623
  }
@@ -600,19 +626,19 @@ class UtxoPsbt extends __1.Psbt {
600
626
  }
601
627
  }
602
628
  getMusig2Participants(inputIndex, tapInternalKey, tapMerkleRoot) {
603
- const participantsKeyValData = Musig2_1.parsePsbtMusig2Participants(this, inputIndex);
629
+ const participantsKeyValData = (0, Musig2_1.parsePsbtMusig2Participants)(this.data.inputs[inputIndex]);
604
630
  if (!participantsKeyValData) {
605
631
  throw new Error(`Found 0 matching participant key value instead of 1`);
606
632
  }
607
- Musig2_1.assertPsbtMusig2Participants(participantsKeyValData, tapInternalKey, tapMerkleRoot);
633
+ (0, Musig2_1.assertPsbtMusig2Participants)(participantsKeyValData, tapInternalKey, tapMerkleRoot);
608
634
  return participantsKeyValData;
609
635
  }
610
636
  getMusig2Nonces(inputIndex, participantsKeyValData) {
611
- const noncesKeyValsData = Musig2_1.parsePsbtMusig2Nonces(this, inputIndex);
612
- if (!noncesKeyValsData || !types_1.isTuple(noncesKeyValsData)) {
613
- throw new Error(`Found ${(noncesKeyValsData === null || noncesKeyValsData === void 0 ? void 0 : noncesKeyValsData.length) ? noncesKeyValsData.length : 0} matching nonce key value instead of 2`);
637
+ const noncesKeyValsData = (0, Musig2_1.parsePsbtMusig2Nonces)(this.data.inputs[inputIndex]);
638
+ if (!noncesKeyValsData || !(0, types_1.isTuple)(noncesKeyValsData)) {
639
+ throw new Error(`Found ${noncesKeyValsData?.length ? noncesKeyValsData.length : 0} matching nonce key value instead of 2`);
614
640
  }
615
- Musig2_1.assertPsbtMusig2Nonces(noncesKeyValsData, participantsKeyValData);
641
+ (0, Musig2_1.assertPsbtMusig2Nonces)(noncesKeyValsData, participantsKeyValData);
616
642
  return noncesKeyValsData;
617
643
  }
618
644
  /**
@@ -635,7 +661,7 @@ class UtxoPsbt extends __1.Psbt {
635
661
  // Retrieve and check that we have two participant nonces
636
662
  const participants = this.getMusig2Participants(inputIndex, input.tapInternalKey, input.tapMerkleRoot);
637
663
  const { tapOutputKey, participantPubKeys } = participants;
638
- const signerPubKey = participantPubKeys.find((pubKey) => pubKey.equals(signer.publicKey));
664
+ const signerPubKey = participantPubKeys.find((pubKey) => equalPublicKeyIgnoreY(pubKey, signer.publicKey));
639
665
  if (!signerPubKey) {
640
666
  throw new Error('signer pub key should match one of participant pub keys');
641
667
  }
@@ -643,14 +669,14 @@ class UtxoPsbt extends __1.Psbt {
643
669
  const { hash, sighashType } = this.getTaprootHashForSig(inputIndex, sighashTypes);
644
670
  let partialSig;
645
671
  if (deterministic) {
646
- if (!signerPubKey.equals(participantPubKeys[1])) {
672
+ if (!equalPublicKeyIgnoreY(signerPubKey, participantPubKeys[1])) {
647
673
  throw new Error('can only add a deterministic signature on the cosigner');
648
674
  }
649
- const firstSignerNonce = nonces.find((n) => n.participantPubKey.equals(participantPubKeys[0]));
675
+ const firstSignerNonce = nonces.find((n) => equalPublicKeyIgnoreY(n.participantPubKey, participantPubKeys[0]));
650
676
  if (!firstSignerNonce) {
651
677
  throw new Error('could not find the user nonce');
652
678
  }
653
- partialSig = Musig2_1.musig2DeterministicSign({
679
+ partialSig = (0, Musig2_1.musig2DeterministicSign)({
654
680
  privateKey: signer.privateKey,
655
681
  otherNonce: firstSignerNonce.pubNonce,
656
682
  publicKeys: participantPubKeys,
@@ -660,23 +686,23 @@ class UtxoPsbt extends __1.Psbt {
660
686
  }).sig;
661
687
  }
662
688
  else {
663
- const sessionKey = Musig2_1.createMusig2SigningSession({
689
+ const sessionKey = (0, Musig2_1.createMusig2SigningSession)({
664
690
  pubNonces: [nonces[0].pubNonce, nonces[1].pubNonce],
665
691
  pubKeys: participantPubKeys,
666
692
  txHash: hash,
667
693
  internalPubKey: input.tapInternalKey,
668
694
  tapTreeRoot: input.tapMerkleRoot,
669
695
  });
670
- const signerNonce = nonces.find((kv) => kv.participantPubKey.equals(signerPubKey));
696
+ const signerNonce = nonces.find((kv) => equalPublicKeyIgnoreY(kv.participantPubKey, signerPubKey));
671
697
  if (!signerNonce) {
672
698
  throw new Error('pubNonce is missing. retry signing process');
673
699
  }
674
- partialSig = Musig2_1.musig2PartialSign(signer.privateKey, signerNonce.pubNonce, sessionKey, this.nonceStore);
700
+ partialSig = (0, Musig2_1.musig2PartialSign)(signer.privateKey, signerNonce.pubNonce, sessionKey, this.nonceStore);
675
701
  }
676
702
  if (sighashType !== __1.Transaction.SIGHASH_DEFAULT) {
677
703
  partialSig = Buffer.concat([partialSig, Buffer.of(sighashType)]);
678
704
  }
679
- const sig = Musig2_1.encodePsbtMusig2PartialSig({
705
+ const sig = (0, Musig2_1.encodePsbtMusig2PartialSig)({
680
706
  participantPubKey: signerPubKey,
681
707
  tapOutputKey,
682
708
  partialSig: partialSig,
@@ -685,17 +711,20 @@ class UtxoPsbt extends __1.Psbt {
685
711
  return this;
686
712
  }
687
713
  signTaprootInput(inputIndex, signer, leafHashes, sighashTypes = [__1.Transaction.SIGHASH_DEFAULT, __1.Transaction.SIGHASH_ALL]) {
688
- var _a;
689
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
714
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
690
715
  // Figure out if this is script path or not, if not, tweak the private key
691
- if (!((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length)) {
716
+ if (!input.tapLeafScript?.length) {
692
717
  throw new Error('tapLeafScript is required for p2tr script path');
693
718
  }
694
- const pubkey = outputScripts_1.toXOnlyPublicKey(signer.publicKey);
719
+ const pubkey = (0, outputScripts_1.toXOnlyPublicKey)(signer.publicKey);
695
720
  if (input.tapLeafScript.length !== 1) {
696
721
  throw new Error('Only one leaf script supported for signing');
697
722
  }
698
- const tapLeafScript = input.tapLeafScript[0];
723
+ const [tapLeafScript] = input.tapLeafScript;
724
+ if (this.isMultisigTaprootScript(tapLeafScript.script)) {
725
+ const pubKeys = (0, parseInput_1.parsePubScript2Of3)(tapLeafScript.script, 'taprootScriptPathSpend').publicKeys;
726
+ assert(pubKeys.find((pk) => pubkey.equals(pk)), 'public key not found in tap leaf script');
727
+ }
699
728
  const parsedControlBlock = __1.taproot.parseControlBlock(__1.ecc, tapLeafScript.controlBlock);
700
729
  const { leafVersion } = parsedControlBlock;
701
730
  if (leafVersion !== tapLeafScript.leafVersion) {
@@ -722,9 +751,8 @@ class UtxoPsbt extends __1.Psbt {
722
751
  return this;
723
752
  }
724
753
  getTaprootOutputScript(inputIndex) {
725
- var _a;
726
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
727
- if ((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) {
754
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
755
+ if (input.tapLeafScript?.length) {
728
756
  return __1.taproot.createTaprootOutputScript({
729
757
  controlBlock: input.tapLeafScript[0].controlBlock,
730
758
  leafScript: input.tapLeafScript[0].script,
@@ -786,7 +814,7 @@ class UtxoPsbt extends __1.Psbt {
786
814
  */
787
815
  addProprietaryKeyValToInput(inputIndex, keyValueData) {
788
816
  return this.addUnknownKeyValToInput(inputIndex, {
789
- key: proprietaryKeyVal_1.encodeProprietaryKey(keyValueData.key),
817
+ key: (0, proprietaryKeyVal_1.encodeProprietaryKey)(keyValueData.key),
790
818
  value: keyValueData.value,
791
819
  });
792
820
  }
@@ -795,11 +823,10 @@ class UtxoPsbt extends __1.Psbt {
795
823
  * Default identifierEncoding is utf-8 for identifier.
796
824
  */
797
825
  addOrUpdateProprietaryKeyValToInput(inputIndex, keyValueData) {
798
- var _a;
799
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
800
- const key = proprietaryKeyVal_1.encodeProprietaryKey(keyValueData.key);
826
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
827
+ const key = (0, proprietaryKeyVal_1.encodeProprietaryKey)(keyValueData.key);
801
828
  const { value } = keyValueData;
802
- if ((_a = input.unknownKeyVals) === null || _a === void 0 ? void 0 : _a.length) {
829
+ if (input.unknownKeyVals?.length) {
803
830
  const ukvIndex = input.unknownKeyVals.findIndex((ukv) => ukv.key.equals(key));
804
831
  if (ukvIndex > -1) {
805
832
  input.unknownKeyVals[ukvIndex] = { key, value };
@@ -817,40 +844,23 @@ class UtxoPsbt extends __1.Psbt {
817
844
  * Default identifierEncoding is utf-8 for identifier.
818
845
  */
819
846
  getProprietaryKeyVals(inputIndex, keySearch) {
820
- var _a;
821
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
822
- if (!((_a = input.unknownKeyVals) === null || _a === void 0 ? void 0 : _a.length)) {
823
- return [];
824
- }
825
- if (keySearch && keySearch.subtype === undefined && Buffer.isBuffer(keySearch.keydata)) {
826
- throw new Error('invalid proprietary key search filter combination. subtype is required');
827
- }
828
- const keyVals = input.unknownKeyVals.map(({ key, value }, i) => {
829
- return { key: proprietaryKeyVal_1.decodeProprietaryKey(key), value };
830
- });
831
- return keyVals.filter((keyVal) => {
832
- return (keySearch === undefined ||
833
- (keySearch.identifier === keyVal.key.identifier &&
834
- (keySearch.subtype === undefined ||
835
- (keySearch.subtype === keyVal.key.subtype &&
836
- (!Buffer.isBuffer(keySearch.keydata) || keySearch.keydata.equals(keyVal.key.keydata))))));
837
- });
847
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
848
+ return (0, PsbtUtil_1.getPsbtInputProprietaryKeyVals)(input, keySearch);
838
849
  }
839
850
  /**
840
851
  * To delete any data from proprietary key value.
841
852
  * Default identifierEncoding is utf-8 for identifier.
842
853
  */
843
854
  deleteProprietaryKeyVals(inputIndex, keysToDelete) {
844
- var _a;
845
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
846
- if (!((_a = input.unknownKeyVals) === null || _a === void 0 ? void 0 : _a.length)) {
855
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
856
+ if (!input.unknownKeyVals?.length) {
847
857
  return this;
848
858
  }
849
859
  if (keysToDelete && keysToDelete.subtype === undefined && Buffer.isBuffer(keysToDelete.keydata)) {
850
860
  throw new Error('invalid proprietary key search filter combination. subtype is required');
851
861
  }
852
862
  input.unknownKeyVals = input.unknownKeyVals.filter((keyValue, i) => {
853
- const key = proprietaryKeyVal_1.decodeProprietaryKey(keyValue.key);
863
+ const key = (0, proprietaryKeyVal_1.decodeProprietaryKey)(keyValue.key);
854
864
  return !(keysToDelete === undefined ||
855
865
  (keysToDelete.identifier === key.identifier &&
856
866
  (keysToDelete.subtype === undefined ||
@@ -868,11 +878,10 @@ class UtxoPsbt extends __1.Psbt {
868
878
  throw new Error('tapMerkleRoot is required to create nonce');
869
879
  }
870
880
  const getDerivedKeyPair = () => {
871
- var _a;
872
- if (!((_a = input.tapBip32Derivation) === null || _a === void 0 ? void 0 : _a.length)) {
881
+ if (!input.tapBip32Derivation?.length) {
873
882
  throw new Error('tapBip32Derivation is required to create nonce');
874
883
  }
875
- const derived = UtxoPsbt.deriveKeyPair(keyPair, input.tapBip32Derivation);
884
+ const derived = UtxoPsbt.deriveKeyPair(keyPair, input.tapBip32Derivation, { ignoreY: true });
876
885
  if (!derived) {
877
886
  throw new Error('No bip32Derivation masterFingerprint matched the HD keyPair fingerprint');
878
887
  }
@@ -882,13 +891,13 @@ class UtxoPsbt extends __1.Psbt {
882
891
  if (!derivedKeyPair.privateKey) {
883
892
  throw new Error('privateKey is required to create nonce');
884
893
  }
885
- const participants = Musig2_1.parsePsbtMusig2Participants(this, inputIndex);
894
+ const participants = (0, Musig2_1.parsePsbtMusig2Participants)(input);
886
895
  if (!participants) {
887
896
  throw new Error(`Found 0 matching participant key value instead of 1`);
888
897
  }
889
- Musig2_1.assertPsbtMusig2Participants(participants, input.tapInternalKey, input.tapMerkleRoot);
898
+ (0, Musig2_1.assertPsbtMusig2Participants)(participants, input.tapInternalKey, input.tapMerkleRoot);
890
899
  const { tapOutputKey, participantPubKeys } = participants;
891
- const participantPubKey = participantPubKeys.find((pubKey) => pubKey.equals(derivedKeyPair.publicKey));
900
+ const participantPubKey = participantPubKeys.find((pubKey) => equalPublicKeyIgnoreY(pubKey, derivedKeyPair.publicKey));
892
901
  if (!Buffer.isBuffer(participantPubKey)) {
893
902
  throw new Error('participant plain pub key should match one bip32Derivation plain pub key');
894
903
  }
@@ -899,21 +908,21 @@ class UtxoPsbt extends __1.Psbt {
899
908
  throw new Error('Cannot add extra entropy when generating a deterministic nonce');
900
909
  }
901
910
  // There must be only 2 participant pubKeys if it got to this point
902
- if (!participantPubKey.equals(participantPubKeys[1])) {
911
+ if (!equalPublicKeyIgnoreY(participantPubKey, participantPubKeys[1])) {
903
912
  throw new Error(`Only the cosigner's nonce can be set deterministically`);
904
913
  }
905
- const nonces = Musig2_1.parsePsbtMusig2Nonces(this, inputIndex);
914
+ const nonces = (0, Musig2_1.parsePsbtMusig2Nonces)(input);
906
915
  if (!nonces) {
907
916
  throw new Error(`No nonces found on input #${inputIndex}`);
908
917
  }
909
918
  if (nonces.length > 2) {
910
919
  throw new Error(`Cannot have more than 2 nonces`);
911
920
  }
912
- const firstSignerNonce = nonces.find((kv) => kv.participantPubKey.equals(participantPubKeys[0]));
921
+ const firstSignerNonce = nonces.find((kv) => equalPublicKeyIgnoreY(kv.participantPubKey, participantPubKeys[0]));
913
922
  if (!firstSignerNonce) {
914
923
  throw new Error('signer nonce must be set if cosigner nonce is to be derived deterministically');
915
924
  }
916
- pubNonce = Musig2_1.createMusig2DeterministicNonce({
925
+ pubNonce = (0, Musig2_1.createMusig2DeterministicNonce)({
917
926
  privateKey: derivedKeyPair.privateKey,
918
927
  otherNonce: firstSignerNonce.pubNonce,
919
928
  publicKeys: participantPubKeys,
@@ -934,13 +943,13 @@ class UtxoPsbt extends __1.Psbt {
934
943
  if (Buffer.isBuffer(params.sessionId) && params.sessionId.length !== 32) {
935
944
  throw new Error(`Invalid sessionId size ${params.sessionId.length}`);
936
945
  }
937
- const inputs = inputIndex === undefined ? this.data.inputs : [utils_1.checkForInput(this.data.inputs, inputIndex)];
938
- inputs.forEach((input, index) => {
946
+ const inputIndexes = inputIndex === undefined ? [...Array(this.inputCount).keys()] : [inputIndex];
947
+ inputIndexes.forEach((index) => {
939
948
  if (!this.isTaprootKeyPathInput(index)) {
940
949
  return;
941
950
  }
942
951
  const nonce = this.createMusig2NonceForInput(index, keyPair, keyType, params);
943
- this.addOrUpdateProprietaryKeyValToInput(index, Musig2_1.encodePsbtMusig2PubNonce(nonce));
952
+ this.addOrUpdateProprietaryKeyValToInput(index, (0, Musig2_1.encodePsbtMusig2PubNonce)(nonce));
944
953
  });
945
954
  return this;
946
955
  }
@@ -955,7 +964,6 @@ class UtxoPsbt extends __1.Psbt {
955
964
  * @param deterministic If true, set the cosigner nonce deterministically
956
965
  */
957
966
  setInputMusig2Nonce(inputIndex, derivedKeyPair, params = { deterministic: false }) {
958
- // TODO: This should take an inputIndex and only apply to that input with this derived key.
959
967
  return this.setMusig2NoncesInner(derivedKeyPair, 'derived', inputIndex, params);
960
968
  }
961
969
  /**
@@ -969,7 +977,7 @@ class UtxoPsbt extends __1.Psbt {
969
977
  * @param deterministic If true, set the cosigner nonce deterministically
970
978
  */
971
979
  setInputMusig2NonceHD(inputIndex, keyPair, params = { deterministic: false }) {
972
- utils_1.checkForInput(this.data.inputs, inputIndex);
980
+ (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
973
981
  return this.setMusig2NoncesInner(keyPair, 'root', inputIndex, params);
974
982
  }
975
983
  /**
@@ -995,8 +1003,15 @@ class UtxoPsbt extends __1.Psbt {
995
1003
  return this.setMusig2NoncesInner(keyPair, 'root', undefined, params);
996
1004
  }
997
1005
  clone() {
998
- return super.clone();
1006
+ return UtxoPsbt.fromBuffer(this.toBuffer(), { network: this.network });
1007
+ }
1008
+ extractTransaction(disableFeeCheck = true) {
1009
+ const tx = super.extractTransaction(disableFeeCheck);
1010
+ if (tx instanceof UtxoTransaction_1.UtxoTransaction) {
1011
+ return tx;
1012
+ }
1013
+ throw new Error('extractTransaction did not return instace of UtxoTransaction');
999
1014
  }
1000
1015
  }
1001
1016
  exports.UtxoPsbt = UtxoPsbt;
1002
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXR4b1BzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYml0Z28vVXR4b1BzYnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQTBDO0FBTzFDLGdEQUFxRDtBQUNyRCwrREFBc0U7QUFFdEUsaUNBQXFEO0FBQ3JELHVDQUF1QztBQUN2Qyx3RUFBOEc7QUFFOUcsMEJBQTZHO0FBQzdHLHVEQUFvRDtBQUNwRCx1Q0FBZ0Q7QUFDaEQsb0RBQThDO0FBQzlDLDBEQUErQztBQUMvQyxtREFBd0U7QUFDeEUsNkNBQWtEO0FBQ2xELHFDQWtCa0I7QUFDbEIsbUNBQWlEO0FBQ2pELHdDQUFpRDtBQUVwQyxRQUFBLDJCQUEyQixHQUFHLE9BQU8sQ0FBQztBQUVuRCxJQUFZLHFCQUtYO0FBTEQsV0FBWSxxQkFBcUI7SUFDL0IsdUdBQThCLENBQUE7SUFDOUIsK0dBQWtDLENBQUE7SUFDbEMseUZBQXVCLENBQUE7SUFDdkIsNkZBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQUxXLHFCQUFxQixHQUFyQiw2QkFBcUIsS0FBckIsNkJBQXFCLFFBS2hDO0FBWUQsTUFBTSxzQkFBc0IsR0FBRztJQUM3QixhQUFhLEVBQUUsS0FBSztJQUNwQixZQUFZLEVBQUUsQ0FBQyxlQUFXLENBQUMsZUFBZSxFQUFFLGVBQVcsQ0FBQyxXQUFXLENBQUM7Q0FDckUsQ0FBQztBQUVGLFNBQVMsaUJBQWlCLENBQUMsQ0FBc0M7SUFDL0QsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUN6RyxDQUFDO0FBeUVELDJFQUEyRTtBQUMzRSw4RUFBOEU7QUFDOUUsaUVBQWlFO0FBQ2pFLE1BQWEsUUFBdUUsU0FBUSxRQUFJO0lB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RSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCx1QkFBdUIsQ0FDckIsT0FBdUIsRUFDdkIsU0FBMEQsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFO1FBRWxGLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gseUJBQXlCLENBQ3ZCLE9BQXVCLEVBQ3ZCLFNBQTBELEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRTtRQUVsRixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sS0FBSyxDQUFDLEtBQUssRUFBVSxDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQWhuQ0QsNEJBZ25DQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBzYnQgYXMgUHNidEJhc2UgfSBmcm9tICdiaXAxNzQnO1xuaW1wb3J0IHtcbiAgQmlwMzJEZXJpdmF0aW9uLFxuICBUYXBCaXAzMkRlcml2YXRpb24sXG4gIFRyYW5zYWN0aW9uIGFzIElUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25Gcm9tQnVmZmVyLFxufSBmcm9tICdiaXAxNzQvc3JjL2xpYi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGNoZWNrRm9ySW5wdXQgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBCdWZmZXJXcml0ZXIsIHZhcnVpbnQgfSBmcm9tICdiaXRjb2luanMtbGliL3NyYy9idWZmZXJ1dGlscyc7XG5pbXBvcnQgeyBTZXNzaW9uS2V5IH0gZnJvbSAnQGJyYW5kb25ibGFjay9tdXNpZyc7XG5pbXBvcnQgeyBCSVAzMkZhY3RvcnksIEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnYmlwMzInO1xuaW1wb3J0ICogYXMgYnM1OGNoZWNrIGZyb20gJ2JzNThjaGVjayc7XG5pbXBvcnQgeyBkZWNvZGVQcm9wcmlldGFyeUtleSwgZW5jb2RlUHJvcHJpZXRhcnlLZXksIFByb3ByaWV0YXJ5S2V5IH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvcHJvcHJpZXRhcnlLZXlWYWwnO1xuXG5pbXBvcnQgeyB0YXByb290LCBIRFNpZ25lciwgUHNidCwgUHNidFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbiwgVHhPdXRwdXQsIE5ldHdvcmssIGVjYyBhcyBlY2NMaWIgfSBmcm9tICcuLic7XG5pbXBvcnQgeyBVdHhvVHJhbnNhY3Rpb24gfSBmcm9tICcuL1V0eG9UcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBnZXRPdXRwdXRJZEZvcklucHV0IH0gZnJvbSAnLi9VbnNwZW50JztcbmltcG9ydCB7IGlzU2Vnd2l0IH0gZnJvbSAnLi9wc2J0L3NjcmlwdFR5cGVzJztcbmltcG9ydCB7IHVuc2lnbiB9IGZyb20gJy4vcHNidC9mcm9tSGFsZlNpZ25lZCc7XG5pbXBvcnQgeyBjaGVja1BsYWluUHVibGljS2V5LCB0b1hPbmx5UHVibGljS2V5IH0gZnJvbSAnLi9vdXRwdXRTY3JpcHRzJztcbmltcG9ydCB7IHBhcnNlUHViU2NyaXB0Mk9mMyB9IGZyb20gJy4vcGFyc2VJbnB1dCc7XG5pbXBvcnQge1xuICBjcmVhdGVNdXNpZzJTaWduaW5nU2Vzc2lvbixcbiAgZW5jb2RlUHNidE11c2lnMlBhcnRpYWxTaWcsXG4gIGVuY29kZVBzYnRNdXNpZzJQdWJOb25jZSxcbiAgbXVzaWcyUGFydGlhbFNpZ24sXG4gIHBhcnNlUHNidE11c2lnMk5vbmNlcyxcbiAgcGFyc2VQc2J0TXVzaWcyUGFydGljaXBhbnRzLFxuICBQc2J0TXVzaWcyUGFydGljaXBhbnRzLFxuICBhc3NlcnRQc2J0TXVzaWcyTm9uY2VzLFxuICBhc3NlcnRQc2J0TXVzaWcyUGFydGljaXBhbnRzLFxuICBNdXNpZzJOb25jZVN0b3JlLFxuICBQc2J0TXVzaWcyUHViTm9uY2UsXG4gIHBhcnNlUHNidE11c2lnMlBhcnRpYWxTaWdzLFxuICBtdXNpZzJQYXJ0aWFsU2lnVmVyaWZ5LFxuICBtdXNpZzJBZ2dyZWdhdGVTaWdzLFxuICBnZXRTaWdIYXNoVHlwZUZyb21TaWdzLFxuICBtdXNpZzJEZXRlcm1pbmlzdGljU2lnbixcbiAgY3JlYXRlTXVzaWcyRGV0ZXJtaW5pc3RpY05vbmNlLFxufSBmcm9tICcuL011c2lnMic7XG5pbXBvcnQgeyBpc1R1cGxlLCBUcmlwbGUsIFR1cGxlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRUYXByb290T3V0cHV0S2V5IH0gZnJvbSAnLi4vdGFwcm9vdCc7XG5cbmV4cG9ydCBjb25zdCBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIgPSAnQklUR08nO1xuXG5leHBvcnQgZW51bSBQcm9wcmlldGFyeUtleVN1YnR5cGUge1xuICBaRUNfQ09OU0VOU1VTX0JSQU5DSF9JRCA9IDB4MDAsXG4gIE1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZUyA9IDB4MDEsXG4gIE1VU0lHMl9QVUJfTk9OQ0UgPSAweDAyLFxuICBNVVNJRzJfUEFSVElBTF9TSUcgPSAweDAzLFxufVxuXG50eXBlIFNpZ25hdHVyZVBhcmFtcyA9IHtcbiAgLyoqIFdoZW4gdHJ1ZSwgYW5kIGFkZCB0aGUgc2Vjb25kIChsYXN0KSBub25jZSBhbmQgc2lnbmF0dXJlIGZvciBhIHRhcHJvb3Qga2V5XG4gICAqIHBhdGggc3BlbmQgZGV0ZXJtaW5pc3RpY2FsbHkuIFRocm93cyBhbiBlcnJvciBpZiBkb25lIGZvciB0aGUgZmlyc3Qgbm9uY2Uvc2lnbmF0dXJlXG4gICAqIG9mIGEgdGFwcm9vdCBrZXlwYXRoIHNwZW5kLiBJZ25vcmUgZm9yIGFsbCBvdGhlciBpbnB1dCB0eXBlcy5cbiAgICovXG4gIGRldGVybWluaXN0aWM6IGJvb2xlYW47XG4gIC8qKiBBbGxvd2VkIHNpZ2hhc2ggdHlwZXMgKi9cbiAgc2lnaGFzaFR5cGVzOiBudW1iZXJbXTtcbn07XG5cbmNvbnN0IGRlZmF1bHRTaWduYXR1cmVQYXJhbXMgPSB7XG4gIGRldGVybWluaXN0aWM6IGZhbHNlLFxuICBzaWdoYXNoVHlwZXM6IFtUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQsIFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMXSxcbn07XG5cbmZ1bmN0aW9uIHRvU2lnbmF0dXJlUGFyYW1zKHY6IFBhcnRpYWw8U2lnbmF0dXJlUGFyYW1zPiB8IG51bWJlcltdKTogU2lnbmF0dXJlUGFyYW1zIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodikgPyB0b1NpZ25hdHVyZVBhcmFtcyh7IHNpZ2hhc2hUeXBlczogdiB9KSA6IHsgLi4uZGVmYXVsdFNpZ25hdHVyZVBhcmFtcywgLi4udiB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhEVGFwcm9vdFNpZ25lciBleHRlbmRzIEhEU2lnbmVyIHtcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHN0cmluZyBtdXN0IG1hdGNoIC9ebShcXC9cXGQrJz8pKyQvXG4gICAqIGV4LiBtLzQ0Jy8wJy8wJy8xLzIzIGxldmVscyB3aXRoICcgbXVzdCBiZSBoYXJkIGRlcml2YXRpb25zXG4gICAqL1xuICBkZXJpdmVQYXRoKHBhdGg6IHN0cmluZyk6IEhEVGFwcm9vdFNpZ25lcjtcbiAgLyoqXG4gICAqIElucHV0IGhhc2ggKHRoZSBcIm1lc3NhZ2UgZGlnZXN0XCIpIGZvciB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobVxuICAgKiBSZXR1cm4gYSA2NCBieXRlIHNpZ25hdHVyZSAoMzIgYnl0ZSByIGFuZCAzMiBieXRlIHMgaW4gdGhhdCBvcmRlcilcbiAgICovXG4gIHNpZ25TY2hub3JyKGhhc2g6IEJ1ZmZlcik6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiBIRCBzaWduZXIgb2JqZWN0IGZvciB0YXByb290IHAydHIgbXVzaWcyIGtleSBwYXRoIHNpZ25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIRFRhcHJvb3RNdXNpZzJTaWduZXIgZXh0ZW5kcyBIRFNpZ25lciB7XG4gIC8qKlxuICAgKiBNdXNpZzIgcmVxdWlyZXMgc2lnbmVyJ3MgMzItYnl0ZXMgcHJpdmF0ZSBrZXkgdG8gYmUgcGFzc2VkIHRvIGl0LlxuICAgKi9cbiAgcHJpdmF0ZUtleTogQnVmZmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBzdHJpbmcgbXVzdCBtYXRjaCAvXm0oXFwvXFxkKyc/KSskL1xuICAgKiBleC4gbS80NCcvMCcvMCcvMS8yMyBsZXZlbHMgd2l0aCAnIG11c3QgYmUgaGFyZCBkZXJpdmF0aW9uc1xuICAgKi9cbiAgZGVyaXZlUGF0aChwYXRoOiBzdHJpbmcpOiBIRFRhcHJvb3RNdXNpZzJTaWduZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nobm9yclNpZ25lciB7XG4gIHB1YmxpY0tleTogQnVmZmVyO1xuICBzaWduU2Nobm9ycihoYXNoOiBCdWZmZXIpOiBCdWZmZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVzaWcyU2lnbmVyIHtcbiAgcHVibGljS2V5OiBCdWZmZXI7XG4gIHByaXZhdGVLZXk6IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYXByb290U2lnbmVyIHtcbiAgbGVhZkhhc2hlczogQnVmZmVyW107XG4gIHNpZ25lcjogU2Nobm9yclNpZ25lcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQc2J0T3B0cyB7XG4gIG5ldHdvcms6IE5ldHdvcms7XG4gIG1heGltdW1GZWVSYXRlPzogbnVtYmVyOyAvLyBbc2F0L2J5dGVdXG4gIGJpcDMyUGF0aHNBYnNvbHV0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXlkYXRhIG9iamVjdC5cbiAqIDxjb21wYWN0IHNpemUgdWludCBpZGVudGlmaWVyIGxlbmd0aD4gPGJ5dGVzIGlkZW50aWZpZXI+IDxjb21wYWN0IHNpemUgdWludCBzdWJ0eXBlPiA8Ynl0ZXMgc3Via2V5ZGF0YT5cbiAqID0+IDxieXRlcyB2YWx1ZWRhdGE+XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcHJpZXRhcnlLZXlWYWx1ZSB7XG4gIGtleTogUHJvcHJpZXRhcnlLZXk7XG4gIHZhbHVlOiBCdWZmZXI7XG59XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXlkYXRhIG9iamVjdCBzZWFyY2ggZmllbGRzLlxuICogPGNvbXBhY3Qgc2l6ZSB1aW50IGlkZW50aWZpZXIgbGVuZ3RoPiA8Ynl0ZXMgaWRlbnRpZmllcj4gPGNvbXBhY3Qgc2l6ZSB1aW50IHN1YnR5cGU+IDxieXRlcyBzdWJrZXlkYXRhPlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3ByaWV0YXJ5S2V5U2VhcmNoIHtcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICBzdWJ0eXBlPzogbnVtYmVyO1xuICBrZXlkYXRhPzogQnVmZmVyO1xuICBpZGVudGlmaWVyRW5jb2Rpbmc/OiBCdWZmZXJFbmNvZGluZztcbn1cblxuLy8gVE9ETzogdXBzdHJlYW0gZG9lcyBgY2hlY2tJbnB1dHNGb3JQYXJ0aWFsU2lnc2AgYmVmb3JlIGRvaW5nIHRoaW5ncyBsaWtlXG4vLyBgc2V0VmVyc2lvbmAuIE91ciBpbnB1dHMgY291bGQgaGF2ZSB0YXBzY3JpcHRzaWdzIChvciBpbiBmdXR1cmUgdGFwa2V5c2lncylcbi8vIGFuZCBub3QgZmFpbCB0aGF0IGNoZWNrLiBEbyB3ZSB3YW50IHRvIGRvIGFueXRoaW5nIGFib3V0IHRoYXQ/XG5leHBvcnQgY2xhc3MgVXR4b1BzYnQ8VHggZXh0ZW5kcyBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiA9IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+PiBleHRlbmRzIFBzYnQge1xuICBwcml2YXRlIG5vbmNlU3RvcmUgPSBuZXcgTXVzaWcyTm9uY2VTdG9yZSgpO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyKGJ1ZmZlcjogQnVmZmVyLCBuZXR3b3JrOiBOZXR3b3JrKTogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICAgIHJldHVybiBVdHhvVHJhbnNhY3Rpb24uZnJvbUJ1ZmZlcjxiaWdpbnQ+KGJ1ZmZlciwgZmFsc2UsICdiaWdpbnQnLCBuZXR3b3JrKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQc2J0KG9wdHM6IFBzYnRPcHRzLCBkYXRhPzogUHNidEJhc2UpOiBVdHhvUHNidCB7XG4gICAgcmV0dXJuIG5ldyBVdHhvUHNidChcbiAgICAgIG9wdHMsXG4gICAgICBkYXRhIHx8IG5ldyBQc2J0QmFzZShuZXcgUHNidFRyYW5zYWN0aW9uKHsgdHg6IG5ldyBVdHhvVHJhbnNhY3Rpb248YmlnaW50PihvcHRzLm5ldHdvcmspIH0pKVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUJ1ZmZlcihidWZmZXI6IEJ1ZmZlciwgb3B0czogUHNidE9wdHMpOiBVdHhvUHNidCB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyOiBUcmFuc2FjdGlvbkZyb21CdWZmZXIgPSAoYnVmZmVyOiBCdWZmZXIpOiBJVHJhbnNhY3Rpb24gPT4ge1xuICAgICAgY29uc3QgdHggPSB0aGlzLnRyYW5zYWN0aW9uRnJvbUJ1ZmZlcihidWZmZXIsIG9wdHMubmV0d29yayk7XG4gICAgICByZXR1cm4gbmV3IFBzYnRUcmFuc2FjdGlvbih7IHR4IH0pO1xuICAgIH07XG4gICAgY29uc3QgcHNidEJhc2UgPSBQc2J0QmFzZS5mcm9tQnVmZmVyKGJ1ZmZlciwgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyLCB7XG4gICAgICBiaXAzMlBhdGhzQWJzb2x1dGU6IG9wdHMuYmlwMzJQYXRoc0Fic29sdXRlLFxuICAgIH0pO1xuICAgIGNvbnN0IHBzYnQgPSB0aGlzLmNyZWF0ZVBzYnQob3B0cywgcHNidEJhc2UpO1xuICAgIC8vIFVwc3RyZWFtIGNoZWNrcyBmb3IgZHVwbGljYXRlIGlucHV0cyBoZXJlLCBidXQgaXQgc2VlbXMgdG8gYmUgb2YgZHViaW91cyB2YWx1ZS5cbiAgICByZXR1cm4gcHNidDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSGV4KGRhdGE6IHN0cmluZywgb3B0czogUHNidE9wdHMpOiBVdHhvUHNidCB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUJ1ZmZlcihCdWZmZXIuZnJvbShkYXRhLCAnaGV4JyksIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXJlbnQgLSBQYXJlbnQga2V5LiBNYXRjaGVkIHdpdGggYGJpcDMyRGVyaXZhdGlvbnNgIHVzaW5nIGBmaW5nZXJwcmludGAgcHJvcGVydHkuXG4gICAqIEBwYXJhbSBiaXAzMkRlcml2YXRpb25zIC0gcG9zc2libGUgZGVyaXZhdGlvbnMgZm9yIGlucHV0IG9yIG91dHB1dFxuICAgKiBAcmV0dXJuIGRlcml2ZWQgYmlwMzIgbm9kZSBpZiBtYXRjaGluZyBkZXJpdmF0aW9uIGlzIGZvdW5kLCB1bmRlZmluZWQgaWYgbm9uZSBpcyBmb3VuZFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggaXMgZm91bmRcbiAgICovXG4gIHN0YXRpYyBkZXJpdmVLZXlQYWlyKHBhcmVudDogQklQMzJJbnRlcmZhY2UsIGJpcDMyRGVyaXZhdGlvbnM6IEJpcDMyRGVyaXZhdGlvbltdKTogQklQMzJJbnRlcmZhY2UgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1hdGNoaW5nRGVyaXZhdGlvbnMgPSBiaXAzMkRlcml2YXRpb25zLmZpbHRlcigoYmlwRHYpID0+IHtcbiAgICAgIHJldHVybiBiaXBEdi5tYXN0ZXJGaW5nZXJwcmludC5lcXVhbHMocGFyZW50LmZpbmdlcnByaW50KTtcbiAgICB9KTtcblxuICAgIGlmICghbWF0Y2hpbmdEZXJpdmF0aW9ucy5sZW5ndGgpIHtcbiAgICAgIC8vIE5vIGZpbmdlcnByaW50IG1hdGNoXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChtYXRjaGluZ0Rlcml2YXRpb25zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbW9yZSB0aGFuIG9uZSBtYXRjaGluZyBkZXJpdmF0aW9uIGZvciBmaW5nZXJwcmludCAke3BhcmVudC5maW5nZXJwcmludC50b1N0cmluZygnaGV4Jyl9OiAke1xuICAgICAgICAgIG1hdGNoaW5nRGVyaXZhdGlvbnMubGVuZ3RoXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IFtkZXJpdmF0aW9uXSA9IG1hdGNoaW5nRGVyaXZhdGlvbnM7XG4gICAgY29uc3Qgbm9kZSA9IHBhcmVudC5kZXJpdmVQYXRoKGRlcml2YXRpb24ucGF0aCk7XG5cbiAgICBpZiAoIWRlcml2YXRpb24ucHVia2V5LmVxdWFscyhub2RlLnB1YmxpY0tleSkgJiYgIWRlcml2YXRpb24ucHVia2V5LmVxdWFscyh0b1hPbmx5UHVibGljS2V5KG5vZGUucHVibGljS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHVia2V5IGRpZCBub3QgbWF0Y2ggYmlwMzJEZXJpdmF0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBnZXQgbmV0d29yaygpOiBOZXR3b3JrIHtcbiAgICByZXR1cm4gdGhpcy50eC5uZXR3b3JrO1xuICB9XG5cbiAgdG9IZXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHRydWUgaWZmIFBTQlQgaW5wdXQgaXMgZmluYWxpemVkXG4gICAqL1xuICBpc0lucHV0RmluYWxpemVkKGlucHV0SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKGlucHV0LmZpbmFsU2NyaXB0U2lnKSB8fCBCdWZmZXIuaXNCdWZmZXIoaW5wdXQuZmluYWxTY3JpcHRXaXRuZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHBhcnRpYWxTaWcvdGFwU2NyaXB0U2lnIGNvdW50IGlmZiBpbnB1dCBpcyBub3QgZmluYWxpemVkXG4gICAqL1xuICBnZXRTaWduYXR1cmVDb3VudChpbnB1dEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmlzSW5wdXRGaW5hbGl6ZWQoaW5wdXRJbmRleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgaXMgYWxyZWFkeSBmaW5hbGl6ZWQnKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIHJldHVybiBNYXRoLm1heChcbiAgICAgIEFycmF5LmlzQXJyYXkoaW5wdXQucGFydGlhbFNpZykgPyBpbnB1dC5wYXJ0aWFsU2lnLmxlbmd0aCA6IDAsXG4gICAgICBBcnJheS5pc0FycmF5KGlucHV0LnRhcFNjcmlwdFNpZykgPyBpbnB1dC50YXBTY3JpcHRTaWcubGVuZ3RoIDogMCxcbiAgICAgIHRoaXMuZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHtcbiAgICAgICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQUxfU0lHLFxuICAgICAgfSkubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIGdldE5vbldpdG5lc3NQcmV2aW91c1R4aWRzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB0eElucHV0cyA9IHRoaXMudHhJbnB1dHM7IC8vIFRoZXNlIGFyZSBzb21ld2hhdCBjb3N0bHkgdG8gZXh0cmFjdFxuICAgIGNvbnN0IHR4aWRTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFpbnB1dC53aXRuZXNzVXR4bykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgaGF2ZSB3aXRuZXNzIFVUWE8gZm9yIGFsbCBpbnB1dHMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNTZWd3aXQoaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0LCBpbnB1dC5yZWRlZW1TY3JpcHQpKSB7XG4gICAgICAgIHR4aWRTZXQuYWRkKGdldE91dHB1dElkRm9ySW5wdXQodHhJbnB1dHNbaW5kZXhdKS50eGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gWy4uLnR4aWRTZXRdO1xuICB9XG5cbiAgYWRkTm9uV2l0bmVzc1V0eG9zKHR4QnVmczogUmVjb3JkPHN0cmluZywgQnVmZmVyPik6IHRoaXMge1xuICAgIGNvbnN0IHR4SW5wdXRzID0gdGhpcy50eElucHV0czsgLy8gVGhlc2UgYXJlIHNvbWV3aGF0IGNvc3RseSB0byBleHRyYWN0XG4gICAgdGhpcy5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGhhdmUgd2l0bmVzcyBVVFhPIGZvciBhbGwgaW5wdXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2Vnd2l0KGlucHV0LndpdG5lc3NVdHhvLnNjcmlwdCwgaW5wdXQucmVkZWVtU2NyaXB0KSkge1xuICAgICAgICBjb25zdCB7IHR4aWQgfSA9IGdldE91dHB1dElkRm9ySW5wdXQodHhJbnB1dHNbaW5kZXhdKTtcbiAgICAgICAgaWYgKHR4QnVmc1t0eGlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYWxsIHJlcXVpcmVkIHByZXZpb3VzIHRyYW5zYWN0aW9ucyBwcm92aWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlSW5wdXQoaW5kZXgsIHsgbm9uV2l0bmVzc1V0eG86IHR4QnVmc1t0eGlkXSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+LCBwcmV2T3V0cHV0czogVHhPdXRwdXQ8YmlnaW50PltdKTogVXR4b1BzYnQge1xuICAgIGlmIChwcmV2T3V0cHV0cy5sZW5ndGggIT09IHRyYW5zYWN0aW9uLmlucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyYW5zYWN0aW9uIGhhcyAke3RyYW5zYWN0aW9uLmlucy5sZW5ndGh9IGlucHV0cywgYnV0ICR7cHJldk91dHB1dHMubGVuZ3RofSBwcmV2aW91cyBvdXRwdXRzIHByb3ZpZGVkYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgY2xvbmVkVHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbi5jbG9uZSgpO1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB1bnNpZ24oY2xvbmVkVHJhbnNhY3Rpb24sIHByZXZPdXRwdXRzKTtcblxuICAgIGNvbnN0IHBzYnRCYXNlID0gbmV3IFBzYnRCYXNlKG5ldyBQc2J0VHJhbnNhY3Rpb24oeyB0eDogY2xvbmVkVHJhbnNhY3Rpb24gfSkpO1xuICAgIGNsb25lZFRyYW5zYWN0aW9uLmlucy5mb3JFYWNoKCgpID0+IHBzYnRCYXNlLmlucHV0cy5wdXNoKHsgdW5rbm93bktleVZhbHM6IFtdIH0pKTtcbiAgICBjbG9uZWRUcmFuc2FjdGlvbi5vdXRzLmZvckVhY2goKCkgPT4gcHNidEJhc2Uub3V0cHV0cy5wdXNoKHsgdW5rbm93bktleVZhbHM6IFtdIH0pKTtcbiAgICBjb25zdCBwc2J0ID0gdGhpcy5jcmVhdGVQc2J0KHsgbmV0d29yazogdHJhbnNhY3Rpb24ubmV0d29yayB9LCBwc2J0QmFzZSk7XG5cbiAgICB1cGRhdGVzLmZvckVhY2goKHVwZGF0ZSwgaW5kZXgpID0+IHtcbiAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5kZXgsIHVwZGF0ZSk7XG4gICAgICBwc2J0LnVwZGF0ZUlucHV0KGluZGV4LCB7IHdpdG5lc3NVdHhvOiB7IHNjcmlwdDogcHJldk91dHB1dHNbaW5kZXhdLnNjcmlwdCwgdmFsdWU6IHByZXZPdXRwdXRzW2luZGV4XS52YWx1ZSB9IH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBzYnQ7XG4gIH1cblxuICBnZXRVbnNpZ25lZFR4KCk6IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgICByZXR1cm4gdGhpcy50eC5jbG9uZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBuZXdUcmFuc2FjdGlvbihuZXR3b3JrOiBOZXR3b3JrKTogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICAgIHJldHVybiBuZXcgVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4obmV0d29yayk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHR4KCk6IFR4IHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YS5nbG9iYWxNYXAudW5zaWduZWRUeCBhcyBQc2J0VHJhbnNhY3Rpb24pLnR4IGFzIFR4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrRm9yU2lnbmF0dXJlcyhwcm9wTmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChpbnB1dC50YXBTY3JpcHRTaWc/Lmxlbmd0aCB8fCBpbnB1dC50YXBLZXlTaWcgfHwgaW5wdXQucGFydGlhbFNpZz8ubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1vZGlmeSAke3Byb3BOYW1lID8/ICd0cmFuc2FjdGlvbid9IC0gc2lnbmF0dXJlcyBleGlzdC5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBhdCBpbnB1dEluZGV4IGlzIGEgdGFwcm9vdCBrZXkgcGF0aC5cbiAgICogQ2hlY2tzIGZvciBwcmVzZW5jZSBvZiBtaW5pbXVtIHJlcXVpcmVkIGtleSBwYXRoIGlucHV0IGZpZWxkcyBhbmQgYWJzZW5jZSBvZiBhbnkgc2NyaXB0IHBhdGggb25seSBpbnB1dCBmaWVsZHMuXG4gICAqL1xuICBpc1RhcHJvb3RLZXlQYXRoSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIHJldHVybiAoXG4gICAgICAhIWlucHV0LnRhcEludGVybmFsS2V5ICYmXG4gICAgICAhIWlucHV0LnRhcE1lcmtsZVJvb3QgJiZcbiAgICAgICEoXG4gICAgICAgIGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCB8fFxuICAgICAgICBpbnB1dC50YXBTY3JpcHRTaWc/Lmxlbmd0aCB8fFxuICAgICAgICBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24/LnNvbWUoKHYpID0+IHYubGVhZkhhc2hlcy5sZW5ndGgpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBhdCBpbnB1dEluZGV4IGlzIGEgdGFwcm9vdCBzY3JpcHQgcGF0aC5cbiAgICogQ2hlY2tzIGZvciBwcmVzZW5jZSBvZiBtaW5pbXVtIHJlcXVpcmVkIHNjcmlwdCBwYXRoIGlucHV0IGZpZWxkcyBhbmQgYWJzZW5jZSBvZiBhbnkga2V5IHBhdGggb25seSBpbnB1dCBmaWVsZHMuXG4gICAqL1xuICBpc1RhcHJvb3RTY3JpcHRQYXRoSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIHJldHVybiAoXG4gICAgICAhIWlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCAmJlxuICAgICAgIShcbiAgICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICAgICAgICB9KS5sZW5ndGggfHxcbiAgICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BVQl9OT05DRSxcbiAgICAgICAgfSkubGVuZ3RoIHx8XG4gICAgICAgIHRoaXMuZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHtcbiAgICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJRyxcbiAgICAgICAgfSkubGVuZ3RoXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBhdCBpbnB1dEluZGV4IGlzIGEgdGFwcm9vdFxuICAgKi9cbiAgaXNUYXByb290SW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGNvbnN0IGlzUDJUUiA9IChzY3JpcHQ6IEJ1ZmZlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZ2V0VGFwcm9vdE91dHB1dEtleShzY3JpcHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuICEhKFxuICAgICAgaW5wdXQudGFwSW50ZXJuYWxLZXkgfHxcbiAgICAgIGlucHV0LnRhcE1lcmtsZVJvb3QgfHxcbiAgICAgIGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCB8fFxuICAgICAgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uPy5sZW5ndGggfHxcbiAgICAgIGlucHV0LnRhcFNjcmlwdFNpZz8ubGVuZ3RoIHx8XG4gICAgICB0aGlzLmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZUyxcbiAgICAgIH0pLmxlbmd0aCB8fFxuICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUFVCX05PTkNFLFxuICAgICAgfSkubGVuZ3RoIHx8XG4gICAgICB0aGlzLmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJRyxcbiAgICAgIH0pLmxlbmd0aCB8fFxuICAgICAgKGlucHV0LndpdG5lc3NVdHhvICYmIGlzUDJUUihpbnB1dC53aXRuZXNzVXR4by5zY3JpcHQpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IGNvcGllZCBmcm9tIGJpdGNvaW5qcy1saWIvdHNfc3JjL3BzYnQudHNcbiAgICovXG4gIGZpbmFsaXplQWxsSW5wdXRzKCk6IHRoaXMge1xuICAgIGNvbnN0IGlzTXVsdGlzaWdUYXByb290U2NyaXB0ID0gKHNjcmlwdDogQnVmZmVyKTogYm9vbGVhbiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZVB1YlNjcmlwdDJPZjMoc2NyaXB0LCAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gICAgY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCAwKTsgLy8gbWFraW5nIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmVcbiAgICB0aGlzLmRhdGEuaW5wdXRzLm1hcCgoaW5wdXQsIGlkeCkgPT4ge1xuICAgICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gaXNNdWx0aXNpZ1RhcHJvb3RTY3JpcHQoaW5wdXQudGFwTGVhZlNjcmlwdFswXS5zY3JpcHQpXG4gICAgICAgICAgPyB0aGlzLmZpbmFsaXplVGFwcm9vdElucHV0KGlkeClcbiAgICAgICAgICA6IHRoaXMuZmluYWxpemVUYXBJbnB1dFdpdGhTaW5nbGVMZWFmU2NyaXB0QW5kU2lnbmF0dXJlKGlkeCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUYXByb290S2V5UGF0aElucHV0KGlkeCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemVUYXByb290TXVzaWcySW5wdXQoaWR4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplSW5wdXQoaWR4KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZpbmFsaXplVGFwcm9vdElucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICAvLyB3aXRuZXNzID0gY29udHJvbC1ibG9jayBzY3JpcHQgZmlyc3Qtc2lnIHNlY29uZC1zaWdcbiAgICBpZiAoaW5wdXQudGFwTGVhZlNjcmlwdD8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgb25lIGxlYWYgc2NyaXB0IHN1cHBvcnRlZCBmb3IgZmluYWxpemluZycpO1xuICAgIH1cbiAgICBjb25zdCB7IGNvbnRyb2xCbG9jaywgc2NyaXB0IH0gPSBpbnB1dC50YXBMZWFmU2NyaXB0WzBdO1xuICAgIGNvbnN0IHdpdG5lc3M6IEJ1ZmZlcltdID0gW3NjcmlwdCwgY29udHJvbEJsb2NrXTtcbiAgICBjb25zdCBbcHVia2V5MSwgcHVia2V5Ml0gPSBwYXJzZVB1YlNjcmlwdDJPZjMoc2NyaXB0LCAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpLnB1YmxpY0tleXM7XG4gICAgZm9yIChjb25zdCBwayBvZiBbcHVia2V5MSwgcHVia2V5Ml0pIHtcbiAgICAgIGNvbnN0IHNpZyA9IGlucHV0LnRhcFNjcmlwdFNpZz8uZmluZCgoeyBwdWJrZXkgfSkgPT4gcHVia2V5LmVxdWFscyhwaykpO1xuICAgICAgaWYgKCFzaWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBzaWduYXR1cmVzIGluIFNjcmlwdCBTaWcuJyk7XG4gICAgICB9XG4gICAgICB3aXRuZXNzLnVuc2hpZnQoc2lnLnNpZ25hdHVyZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2l0bmVzc0xlbmd0aCA9IHdpdG5lc3MucmVkdWNlKChzLCBiKSA9PiBzICsgYi5sZW5ndGggKyB2YXJ1aW50LmVuY29kaW5nTGVuZ3RoKGIubGVuZ3RoKSwgMSk7XG5cbiAgICBjb25zdCBidWZmZXJXcml0ZXIgPSBCdWZmZXJXcml0ZXIud2l0aENhcGFjaXR5KHdpdG5lc3NMZW5ndGgpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVZlY3Rvcih3aXRuZXNzKTtcbiAgICBjb25zdCBmaW5hbFNjcmlwdFdpdG5lc3MgPSBidWZmZXJXcml0ZXIuZW5kKCk7XG5cbiAgICB0aGlzLmRhdGEudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyBmaW5hbFNjcmlwdFdpdG5lc3MgfSk7XG4gICAgdGhpcy5kYXRhLmNsZWFyRmluYWxpemVkSW5wdXQoaW5wdXRJbmRleCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5hbGl6ZXMgYSB0YXByb290IG11c2lnMiBpbnB1dCBieSBhZ2dyZWdhdGluZyBhbGwgcGFydGlhbCBzaWdzLlxuICAgKiBJTVBPUlRBTlQ6IEFsd2F5cyBjYWxsIHZhbGlkYXRlKiBmdW5jdGlvbiBiZWZvcmUgZmluYWxpemluZy5cbiAgICovXG4gIGZpbmFsaXplVGFwcm9vdE11c2lnMklucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IHRoaXMge1xuICAgIGNvbnN0IHBhcnRpYWxTaWdzID0gcGFyc2VQc2J0TXVzaWcyUGFydGlhbFNpZ3ModGhpcywgaW5wdXRJbmRleCk7XG4gICAgaWYgKHBhcnRpYWxTaWdzPy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBudW1iZXIgb2YgcGFydGlhbCBzaWduYXR1cmVzICR7cGFydGlhbFNpZ3MgPyBwYXJ0aWFsU2lncy5sZW5ndGggOiAwfSB0byBmaW5hbGl6ZWApO1xuICAgIH1cbiAgICBjb25zdCB7IHBhcnRpYWxTaWdzOiBwU2lncywgc2lnSGFzaFR5cGUgfSA9IGdldFNpZ0hhc2hUeXBlRnJvbVNpZ3MocGFydGlhbFNpZ3MpO1xuICAgIGNvbnN0IHsgc2Vzc2lvbktleSB9ID0gdGhpcy5nZXRNdXNpZzJTZXNzaW9uS2V5KGlucHV0SW5kZXgsIHNpZ0hhc2hUeXBlKTtcblxuICAgIGNvbnN0IGFnZ1NpZyA9IG11c2lnMkFnZ3JlZ2F0ZVNpZ3MoXG4gICAgICBwU2lncy5tYXAoKHBTaWcpID0+IHBTaWcucGFydGlhbFNpZyksXG4gICAgICBzZXNzaW9uS2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHNpZyA9IHNpZ0hhc2hUeXBlID09PSBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQgPyBhZ2dTaWcgOiBCdWZmZXIuY29uY2F0KFthZ2dTaWcsIEJ1ZmZlci5vZihzaWdIYXNoVHlwZSldKTtcblxuICAgIC8vIHNpbmdsZSBzaWduYXR1cmUgd2l0aCA2NC82NSBieXRlcyBzaXplIGlzIHNjcmlwdCB3aXRuZXNzIGZvciBrZXkgcGF0aCBzcGVuZFxuICAgIGNvbnN0IGJ1ZmZlcldyaXRlciA9IEJ1ZmZlcldyaXRlci53aXRoQ2FwYWNpdHkoMSArIHZhcnVpbnQuZW5jb2RpbmdMZW5ndGgoc2lnLmxlbmd0aCkgKyBzaWcubGVuZ3RoKTtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVWZWN0b3IoW3NpZ10pO1xuICAgIGNvbnN0IGZpbmFsU2NyaXB0V2l0bmVzcyA9IGJ1ZmZlcldyaXRlci5lbmQoKTtcblxuICAgIHRoaXMuZGF0YS51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IGZpbmFsU2NyaXB0V2l0bmVzcyB9KTtcbiAgICB0aGlzLmRhdGEuY2xlYXJGaW5hbGl6ZWRJbnB1dChpbnB1dEluZGV4KTtcbiAgICAvLyBkZWxldGluZyBvbmx5IEJpdEdvIHByb3ByaWV0YXJ5IGtleSB2YWx1ZXMuXG4gICAgdGhpcy5kZWxldGVQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwgeyBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmaW5hbGl6ZVRhcElucHV0V2l0aFNpbmdsZUxlYWZTY3JpcHRBbmRTaWduYXR1cmUoaW5wdXRJbmRleDogbnVtYmVyKTogdGhpcyB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT25seSBvbmUgbGVhZiBzY3JpcHQgc3VwcG9ydGVkIGZvciBmaW5hbGl6aW5nJyk7XG4gICAgfVxuICAgIGlmIChpbnB1dC50YXBTY3JpcHRTaWc/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBzaWduYXR1cmVzIGluIFNjcmlwdCBTaWcuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb250cm9sQmxvY2ssIHNjcmlwdCB9ID0gaW5wdXQudGFwTGVhZlNjcmlwdFswXTtcbiAgICBjb25zdCB3aXRuZXNzOiBCdWZmZXJbXSA9IFtpbnB1dC50YXBTY3JpcHRTaWdbMF0uc2lnbmF0dXJlLCBzY3JpcHQsIGNvbnRyb2xCbG9ja107XG4gICAgY29uc3Qgd2l0bmVzc0xlbmd0aCA9IHdpdG5lc3MucmVkdWNlKChzLCBiKSA9PiBzICsgYi5sZW5ndGggKyB2YXJ1aW50LmVuY29kaW5nTGVuZ3RoKGIubGVuZ3RoKSwgMSk7XG5cbiAgICBjb25zdCBidWZmZXJXcml0ZXIgPSBCdWZmZXJXcml0ZXIud2l0aENhcGFjaXR5KHdpdG5lc3NMZW5ndGgpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVZlY3Rvcih3aXRuZXNzKTtcbiAgICBjb25zdCBmaW5hbFNjcmlwdFdpdG5lc3MgPSBidWZmZXJXcml0ZXIuZW5kKCk7XG5cbiAgICB0aGlzLmRhdGEudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyBmaW5hbFNjcmlwdFdpdG5lc3MgfSk7XG4gICAgdGhpcy5kYXRhLmNsZWFyRmluYWxpemVkSW5wdXQoaW5wdXRJbmRleCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3N0bHkgY29waWVkIGZyb20gYml0Y29pbmpzLWxpYi90c19zcmMvcHNidC50c1xuICAgKlxuICAgKiBVbmxpa2UgdGhlIGZ1bmN0aW9uIGl0IG92ZXJyaWRlcywgdGhpcyBkb2VzIG5vdCB0YWtlIGEgdmFsaWRhdG9yLiBJbiBCaXRHb1xuICAgKiBjb250ZXh0LCB3ZSBrbm93IGhvdyB3ZSB3YW50IHRvIHZhbGlkYXRlIHNvIHdlIGp1c3QgaGFyZCBjb2RlIHRoZSByaWdodFxuICAgKiB2YWxpZGF0b3IuXG4gICAqL1xuICB2YWxpZGF0ZVNpZ25hdHVyZXNPZkFsbElucHV0cygpOiBib29sZWFuIHtcbiAgICBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIDApOyAvLyBtYWtpbmcgc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZVxuICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmRhdGEuaW5wdXRzLm1hcCgoaW5wdXQsIGlkeCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dENvbW1vbihpZHgpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHRzLnJlZHVjZSgoZmluYWwsIHJlcykgPT4gcmVzICYmIGZpbmFsLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmZiBhbnkgbWF0Y2hpbmcgdmFsaWQgc2lnbmF0dXJlIGlzIGZvdW5kIGZvciBhIGRlcml2ZWQgcHViIGtleSBmcm9tIGdpdmVuIEhEIGtleSBwYWlyLlxuICAgKi9cbiAgdmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dEhEKGlucHV0SW5kZXg6IG51bWJlciwgaGRLZXlQYWlyOiBCSVAzMkludGVyZmFjZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBjb25zdCBwdWJLZXkgPSBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24/Lmxlbmd0aFxuICAgICAgPyBVdHhvUHNidC5kZXJpdmVLZXlQYWlyKGhkS2V5UGFpciwgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uKT8ucHVibGljS2V5XG4gICAgICA6IGlucHV0LmJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoXG4gICAgICA/IFV0eG9Qc2J0LmRlcml2ZUtleVBhaXIoaGRLZXlQYWlyLCBpbnB1dC5iaXAzMkRlcml2YXRpb24pPy5wdWJsaWNLZXlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICghcHViS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgZGVyaXZlIGZyb20gSEQga2V5IHBhaXInKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dENvbW1vbihpbnB1dEluZGV4LCBwdWJLZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRydWUgaWZmIGFueSB2YWxpZCBzaWduYXR1cmUocykgYXJlIGZvdW5kIGZyb20gYmlwMzIgZGF0YSBvZiBQU0JUIG9yIGZvciBnaXZlbiBwdWIga2V5LlxuICAgKi9cbiAgdmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dENvbW1vbihpbnB1dEluZGV4OiBudW1iZXIsIHB1YmtleT86IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5pc1RhcHJvb3RTY3JpcHRQYXRoSW5wdXQoaW5wdXRJbmRleCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVUYXByb290U2lnbmF0dXJlc09mSW5wdXQoaW5wdXRJbmRleCwgcHVia2V5KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1RhcHJvb3RLZXlQYXRoSW5wdXQoaW5wdXRJbmRleCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVUYXByb290TXVzaWcyU2lnbmF0dXJlc09mSW5wdXQoaW5wdXRJbmRleCwgcHVia2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlU2lnbmF0dXJlc09mSW5wdXQoaW5wdXRJbmRleCwgKHAsIG0sIHMpID0+IGVjY0xpYi52ZXJpZnkobSwgcCwgcywgdHJ1ZSksIHB1YmtleSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBOb3QgYW4gZWxlZ2FudCBzb2x1dGlvbi4gTWlnaHQgbmVlZCB1cHN0cmVhbSBjaGFuZ2VzIGxpa2UgY3VzdG9tIGVycm9yIHR5cGVzLlxuICAgICAgaWYgKGVyci5tZXNzYWdlID09PSAnTm8gc2lnbmF0dXJlcyBmb3IgdGhpcyBwdWJrZXknKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE11c2lnMlNlc3Npb25LZXkoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHNpZ0hhc2hUeXBlOiBudW1iZXJcbiAgKToge1xuICAgIHBhcnRpY2lwYW50czogUHNidE11c2lnMlBhcnRpY2lwYW50cztcbiAgICBub25jZXM6IFR1cGxlPFBzYnRNdXNpZzJQdWJOb25jZT47XG4gICAgaGFzaDogQnVmZmVyO1xuICAgIHNlc3Npb25LZXk6IFNlc3Npb25LZXk7XG4gIH0ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWlucHV0LnRhcEludGVybmFsS2V5IHx8ICFpbnB1dC50YXBNZXJrbGVSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JvdGggdGFwSW50ZXJuYWxLZXkgYW5kIHRhcE1lcmtsZVJvb3QgYXJlIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydGljaXBhbnRzID0gdGhpcy5nZXRNdXNpZzJQYXJ0aWNpcGFudHMoaW5wdXRJbmRleCwgaW5wdXQudGFwSW50ZXJuYWxLZXksIGlucHV0LnRhcE1lcmtsZVJvb3QpO1xuICAgIGNvbnN0IG5vbmNlcyA9IHRoaXMuZ2V0TXVzaWcyTm9uY2VzKGlucHV0SW5kZXgsIHBhcnRpY2lwYW50cyk7XG5cbiAgICBjb25zdCB7IGhhc2ggfSA9IHRoaXMuZ2V0VGFwcm9vdEhhc2hGb3JTaWcoaW5wdXRJbmRleCwgW3NpZ0hhc2hUeXBlXSk7XG5cbiAgICBjb25zdCBzZXNzaW9uS2V5ID0gY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24oe1xuICAgICAgcHViTm9uY2VzOiBbbm9uY2VzWzBdLnB1Yk5vbmNlLCBub25jZXNbMV0ucHViTm9uY2VdLFxuICAgICAgcHViS2V5czogcGFydGljaXBhbnRzLnBhcnRpY2lwYW50UHViS2V5cyxcbiAgICAgIHR4SGFzaDogaGFzaCxcbiAgICAgIGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSxcbiAgICAgIHRhcFRyZWVSb290OiBpbnB1dC50YXBNZXJrbGVSb290LFxuICAgIH0pO1xuICAgIHJldHVybiB7IHBhcnRpY2lwYW50cywgbm9uY2VzLCBoYXNoLCBzZXNzaW9uS2V5IH07XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBmb3IgZm9sbG93aW5nIGNhc2VzLlxuICAgKiBJZiB2YWxpZCBtdXNpZzIgcGFydGlhbCBzaWduYXR1cmVzIGV4aXN0cyBmb3IgYm90aCAyIGtleXMsIGl0IHdpbGwgYWxzbyB2ZXJpZmllcyBhZ2dyZWdhdGVkIHNpZ1xuICAgKiBmb3IgYWdncmVnYXRlZCB0d2Vha2VkIGtleSAob3V0cHV0IGtleSksIG90aGVyd2lzZSBvbmx5IHZlcmlmaWVzIHBhcnRpYWwgc2lnLlxuICAgKiBJZiBwdWJrZXkgaXMgcGFzc2VkIGluIGlucHV0LCBpdCB3aWxsIGNoZWNrIHNpZyBvbmx5IGZvciB0aGF0IHB1YmtleSxcbiAgICogaWYgbm8gc2lnIGV4aXRzIGZvciBzdWNoIGtleSwgdGhyb3dzIGVycm9yLlxuICAgKiBGb3IgaW52YWxpZCBzdGF0ZSBvZiBpbnB1dCBkYXRhLCBpdCB3aWxsIHRocm93IGVycm9ycy5cbiAgICovXG4gIHZhbGlkYXRlVGFwcm9vdE11c2lnMlNpZ25hdHVyZXNPZklucHV0KGlucHV0SW5kZXg6IG51bWJlciwgcHVia2V5PzogQnVmZmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFydGlhbFNpZ3MgPSBwYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyh0aGlzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIXBhcnRpYWxTaWdzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNpZ25hdHVyZXMgdG8gdmFsaWRhdGVgKTtcbiAgICB9XG5cbiAgICBsZXQgbXlQYXJ0aWFsU2lncyA9IHBhcnRpYWxTaWdzO1xuICAgIGlmIChwdWJrZXkpIHtcbiAgICAgIGNoZWNrUGxhaW5QdWJsaWNLZXkocHVia2V5KTtcbiAgICAgIG15UGFydGlhbFNpZ3MgPSBwYXJ0aWFsU2lncy5maWx0ZXIoKGt2KSA9PiBrdi5wYXJ0aWNpcGFudFB1YktleS5lcXVhbHMocHVia2V5KSk7XG4gICAgICBpZiAobXlQYXJ0aWFsU2lncz8ubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNpZ25hdHVyZXMgZm9yIHRoaXMgcHVia2V5Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBwYXJ0aWFsU2lnczogbXlTaWdzLCBzaWdIYXNoVHlwZSB9ID0gZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyhteVBhcnRpYWxTaWdzKTtcbiAgICBjb25zdCB7IHBhcnRpY2lwYW50cywgbm9uY2VzLCBoYXNoLCBzZXNzaW9uS2V5IH0gPSB0aGlzLmdldE11c2lnMlNlc3Npb25LZXkoaW5wdXRJbmRleCwgc2lnSGFzaFR5cGUpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IG15U2lncy5tYXAoKG15U2lnKSA9PiB7XG4gICAgICBjb25zdCBteU5vbmNlID0gbm9uY2VzLmZpbmQoKGt2KSA9PiBrdi5wYXJ0aWNpcGFudFB1YktleS5lcXVhbHMobXlTaWcucGFydGljaXBhbnRQdWJLZXkpKTtcbiAgICAgIGlmICghbXlOb25jZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIG5vIHB1YiBub25jZSBmb3IgcHVia2V5Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbXVzaWcyUGFydGlhbFNpZ1ZlcmlmeShteVNpZy5wYXJ0aWFsU2lnLCBteVNpZy5wYXJ0aWNpcGFudFB1YktleSwgbXlOb25jZS5wdWJOb25jZSwgc2Vzc2lvbktleSk7XG4gICAgfSk7XG5cbiAgICAvLyBGb3IgdmFsaWQgc2luZ2xlIHNpZyBvciAxIG9yIDIgZmFpbHVyZSBzaWdzLCBubyBuZWVkIHRvIHZhbGlkYXRlIGFnZ3JlZ2F0ZWQgc2lnLiBTbyBza2lwLlxuICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHMuZXZlcnkoKHJlcykgPT4gcmVzKTtcbiAgICBpZiAoIXJlc3VsdCB8fCBteVNpZ3MubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBhZ2dTaWcgPSBtdXNpZzJBZ2dyZWdhdGVTaWdzKFxuICAgICAgbXlTaWdzLm1hcCgobXlTaWcpID0+IG15U2lnLnBhcnRpYWxTaWcpLFxuICAgICAgc2Vzc2lvbktleVxuICAgICk7XG5cbiAgICByZXR1cm4gZWNjTGliLnZlcmlmeVNjaG5vcnIoaGFzaCwgcGFydGljaXBhbnRzLnRhcE91dHB1dEtleSwgYWdnU2lnKTtcbiAgfVxuXG4gIHZhbGlkYXRlVGFwcm9vdFNpZ25hdHVyZXNPZklucHV0KGlucHV0SW5kZXg6IG51bWJlciwgcHVia2V5PzogQnVmZmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuICAgIGNvbnN0IHRhcFNpZ3MgPSAoaW5wdXQgfHwge30pLnRhcFNjcmlwdFNpZztcbiAgICBpZiAoIWlucHV0IHx8ICF0YXBTaWdzIHx8IHRhcFNpZ3MubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzaWduYXR1cmVzIHRvIHZhbGlkYXRlJyk7XG4gICAgfVxuICAgIGxldCBteVNpZ3M7XG4gICAgaWYgKHB1YmtleSkge1xuICAgICAgY29uc3QgeE9ubHlQdWJrZXkgPSB0b1hPbmx5UHVibGljS2V5KHB1YmtleSk7XG4gICAgICBteVNpZ3MgPSB0YXBTaWdzLmZpbHRlcigoc2lnKSA9PiBzaWcucHVia2V5LmVxdWFscyh4T25seVB1YmtleSkpO1xuICAgICAgaWYgKG15U2lncy5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2lnbmF0dXJlcyBmb3IgdGhpcyBwdWJrZXknKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbXlTaWdzID0gdGFwU2lncztcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0czogYm9vbGVhbltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHBTaWcgb2YgbXlTaWdzKSB7XG4gICAgICBjb25zdCB7IHNpZ25hdHVyZSwgbGVhZkhhc2gsIHB1YmtleSB9ID0gcFNpZztcbiAgICAgIGxldCBzaWdIYXNoVHlwZTogbnVtYmVyO1xuICAgICAgbGV0IHNpZzogQnVmZmVyO1xuICAgICAgaWYgKHNpZ25hdHVyZS5sZW5ndGggPT09IDY1KSB7XG4gICAgICAgIHNpZ0hhc2hUeXBlID0gc2lnbmF0dXJlWzY0XTtcbiAgICAgICAgc2lnID0gc2lnbmF0dXJlLnNsaWNlKDAsIDY0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpZ0hhc2hUeXBlID0gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUO1xuICAgICAgICBzaWcgPSBzaWduYXR1cmU7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGhhc2ggfSA9IHRoaXMuZ2V0VGFwcm9vdEhhc2hGb3JTaWcoaW5wdXRJbmRleCwgW3NpZ0hhc2hUeXBlXSwgbGVhZkhhc2gpO1xuICAgICAgcmVzdWx0cy5wdXNoKGVjY0xpYi52ZXJpZnlTY2hub3JyKGhhc2gsIHB1YmtleSwgc2lnKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzLmV2ZXJ5KChyZXMpID0+IHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBhcnJheSBvZiBib29sZWFuIHZhbHVlcy4gVHJ1ZSB3aGVuIGNvcnJlc3BvbmRpbmcgaW5kZXggaW4gYHB1YmxpY0tleXNgIGhhcyBzaWduZWQgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBJZiBubyBzaWduYXR1cmUgaW4gdGhlIHR4IG9yIG5vIHB1YmxpYyBrZXkgbWF0Y2hpbmcgc2lnbmF0dXJlLCB0aGUgdmFsaWRhdGlvbiBpcyBjb25zaWRlcmVkIGFzIGZhbHNlLlxuICAgKi9cbiAgZ2V0U2lnbmF0dXJlVmFsaWRhdGlvbkFycmF5KGlucHV0SW5kZXg6IG51bWJlcik6IFRyaXBsZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuZGF0YS5nbG9iYWxNYXAuZ2xvYmFsWHB1Yj8ubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgc2lnbmF0dXJlIHZhbGlkYXRpb24gYXJyYXkgd2l0aG91dCAzIGdsb2JhbCB4cHVicycpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZ2V0U2lnbmF0dXJlQ291bnQoaW5wdXRJbmRleCkpIHtcbiAgICAgIHJldHVybiBbZmFsc2UsIGZhbHNlLCBmYWxzZV07XG4gICAgfVxuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmdsb2JhbE1hcC5nbG9iYWxYcHViLm1hcCgoeHB1YikgPT4ge1xuICAgICAgY29uc3QgYmlwMzIgPSBCSVAzMkZhY3RvcnkoZWNjTGliKS5mcm9tQmFzZTU4KGJzNThjaGVjay5lbmNvZGUoeHB1Yi5leHRlbmRlZFB1YmtleSkpO1xuICAgICAgY29uc3QgcHViS2V5ID0gaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uPy5sZW5ndGhcbiAgICAgICAgPyBVdHhvUHNidC5kZXJpdmVLZXlQYWlyKGJpcDMyLCBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24pPy5wdWJsaWNLZXlcbiAgICAgICAgOiBpbnB1dC5iaXAzMkRlcml2YXRpb24/Lmxlbmd0aFxuICAgICAgICA/IFV0eG9Qc2J0LmRlcml2ZUtleVBhaXIoYmlwMzIsIGlucHV0LmJpcDMyRGVyaXZhdGlvbik/LnB1YmxpY0tleVxuICAgICAgICA6IGJpcDMyPy5wdWJsaWNLZXk7XG4gICAgICBpZiAoIXB1YktleSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGlucHV0SW5kZXgsIHB1YktleSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gTm90IGFuIGVsZWdhbnQgc29sdXRpb24uIE1pZ2h0IG5lZWQgdXBzdHJlYW0gY2hhbmdlcyBsaWtlIGN1c3RvbSBlcnJvciB0eXBlcy5cbiAgICAgICAgaWYgKGVyci5tZXNzYWdlID09PSAnTm8gc2lnbmF0dXJlcyBmb3IgdGhpcyBwdWJrZXknKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9KSBhcyBUcmlwbGU8Ym9vbGVhbj47XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IGNvcGllZCBmcm9tIGJpdGNvaW5qcy1saWIvdHNfc3JjL3BzYnQudHNcbiAgICovXG4gIHNpZ25BbGxJbnB1dHNIRChcbiAgICBoZEtleVBhaXI6IEhEVGFwcm9vdFNpZ25lciB8IEhEVGFwcm9vdE11c2lnMlNpZ25lcixcbiAgICBwYXJhbXM6IG51bWJlcltdIHwgUGFydGlhbDxTaWduYXR1cmVQYXJhbXM+ID0gZGVmYXVsdFNpZ25hdHVyZVBhcmFtc1xuICApOiB0aGlzIHtcbiAgICBpZiAoIWhkS2V5UGFpciB8fCAhaGRLZXlQYWlyLnB1YmxpY0tleSB8fCAhaGRLZXlQYWlyLmZpbmdlcnByaW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgSERTaWduZXIgdG8gc2lnbiBpbnB1dCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHNpZ2hhc2hUeXBlcywgZGV0ZXJtaW5pc3RpYyB9ID0gdG9TaWduYXR1cmVQYXJhbXMocGFyYW1zKTtcblxuICAgIGNvbnN0IHJlc3VsdHM6IGJvb2xlYW5bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kYXRhLmlucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zaWduSW5wdXRIRChpLCBoZEtleVBhaXIsIHsgc2lnaGFzaFR5cGVzLCBkZXRlcm1pbmlzdGljIH0pO1xuICAgICAgICByZXN1bHRzLnB1c2godHJ1ZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlc3VsdHMuZXZlcnkoKHYpID0+ICF2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBpbnB1dHMgd2VyZSBzaWduZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IGNvcGllZCBmcm9tIGJpdGNvaW5qcy1saWIvdHNfc3JjL3BzYnQudHM6c2lnbklucHV0SERcbiAgICovXG4gIHNpZ25UYXByb290SW5wdXRIRChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgaGRLZXlQYWlyOiBIRFRhcHJvb3RTaWduZXIgfCBIRFRhcHJvb3RNdXNpZzJTaWduZXIsXG4gICAgeyBzaWdoYXNoVHlwZXMgPSBbVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxULCBUcmFuc2FjdGlvbi5TSUdIQVNIX0FMTF0sIGRldGVybWluaXN0aWMgPSBmYWxzZSB9ID0ge31cbiAgKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLmlzVGFwcm9vdElucHV0KGlucHV0SW5kZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIHRhcHJvb3QgaW5wdXQnKTtcbiAgICB9XG4gICAgaWYgKCFoZEtleVBhaXIgfHwgIWhkS2V5UGFpci5wdWJsaWNLZXkgfHwgIWhkS2V5UGFpci5maW5nZXJwcmludCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIEhEU2lnbmVyIHRvIHNpZ24gaW5wdXQnKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGlmICghaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uIHx8IGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCB0YXBCaXAzMkRlcml2YXRpb24gdG8gc2lnbiBUYXByb290IHdpdGggSEQnKTtcbiAgICB9XG4gICAgY29uc3QgbXlEZXJpdmF0aW9ucyA9IGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvblxuICAgICAgLm1hcCgoYmlwRHYpID0+IHtcbiAgICAgICAgaWYgKGJpcER2Lm1hc3RlckZpbmdlcnByaW50LmVxdWFscyhoZEtleVBhaXIuZmluZ2VycHJpbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIGJpcER2O1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigodikgPT4gISF2KSBhcyBUYXBCaXAzMkRlcml2YXRpb25bXTtcbiAgICBpZiAobXlEZXJpdmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCBvbmUgdGFwQmlwMzJEZXJpdmF0aW9uIG1hc3RlckZpbmdlcnByaW50IHRvIG1hdGNoIHRoZSBIRFNpZ25lciBmaW5nZXJwcmludCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERlcml2ZWROb2RlKGJpcER2OiBUYXBCaXAzMkRlcml2YXRpb24pOiBIRFRhcHJvb3RNdXNpZzJTaWduZXIgfCBIRFRhcHJvb3RTaWduZXIge1xuICAgICAgY29uc3Qgbm9kZSA9IGhkS2V5UGFpci5kZXJpdmVQYXRoKGJpcER2LnBhdGgpO1xuICAgICAgaWYgKCFiaXBEdi5wdWJrZXkuZXF1YWxzKG5vZGUucHVibGljS2V5LnNsaWNlKDEpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1YmtleSBkaWQgbm90IG1hdGNoIHRhcEJpcDMyRGVyaXZhdGlvbicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgY29uc3Qgc2lnbmVyczogVGFwcm9vdFNpZ25lcltdID0gbXlEZXJpdmF0aW9ucy5tYXAoKGJpcER2KSA9PiB7XG4gICAgICAgIGNvbnN0IHNpZ25lciA9IGdldERlcml2ZWROb2RlKGJpcER2KTtcbiAgICAgICAgaWYgKCEoJ3NpZ25TY2hub3JyJyBpbiBzaWduZXIpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduU2Nobm9yciBmdW5jdGlvbiBpcyByZXF1aXJlZCB0byBzaWduIHAydHInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzaWduZXIsIGxlYWZIYXNoZXM6IGJpcER2LmxlYWZIYXNoZXMgfTtcbiAgICAgIH0pO1xuICAgICAgc2lnbmVycy5mb3JFYWNoKCh7IHNpZ25lciwgbGVhZkhhc2hlcyB9KSA9PiB0aGlzLnNpZ25UYXByb290SW5wdXQoaW5wdXRJbmRleCwgc2lnbmVyLCBsZWFmSGFzaGVzLCBzaWdoYXNoVHlwZXMpKTtcbiAgICB9IGVsc2UgaWYgKGlucHV0LnRhcEludGVybmFsS2V5Py5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNpZ25lcnM6IE11c2lnMlNpZ25lcltdID0gbXlEZXJpdmF0aW9ucy5tYXAoKGJpcER2KSA9PiB7XG4gICAgICAgIGNvbnN0IHNpZ25lciA9IGdldERlcml2ZWROb2RlKGJpcER2KTtcbiAgICAgICAgaWYgKCEoJ3ByaXZhdGVLZXknIGluIHNpZ25lcikgfHwgIXNpZ25lci5wcml2YXRlS2V5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcml2YXRlS2V5IGlzIHJlcXVpcmVkIHRvIHNpZ24gcDJ0ciBtdXNpZzInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2lnbmVyO1xuICAgICAgfSk7XG4gICAgICBzaWduZXJzLmZvckVhY2goKHNpZ25lcikgPT4gdGhpcy5zaWduVGFwcm9vdE11c2lnMklucHV0KGlucHV0SW5kZXgsIHNpZ25lciwgeyBzaWdoYXNoVHlwZXMsIGRldGVybWluaXN0aWMgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNpZ25JbnB1dEhEKFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBoZEtleVBhaXI6IEhEVGFwcm9vdFNpZ25lciB8IEhEVGFwcm9vdE11c2lnMlNpZ25lcixcbiAgICBwYXJhbXM6IG51bWJlcltdIHwgUGFydGlhbDxTaWduYXR1cmVQYXJhbXM+ID0gZGVmYXVsdFNpZ25hdHVyZVBhcmFtc1xuICApOiB0aGlzIHtcbiAgICBjb25zdCB7IHNpZ2hhc2hUeXBlcywgZGV0ZXJtaW5pc3RpYyB9ID0gdG9TaWduYXR1cmVQYXJhbXMocGFyYW1zKTtcbiAgICBpZiAodGhpcy5pc1RhcHJvb3RJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2lnblRhcHJvb3RJbnB1dEhEKGlucHV0SW5kZXgsIGhkS2V5UGFpciwgeyBzaWdoYXNoVHlwZXMsIGRldGVybWluaXN0aWMgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdXBlci5zaWduSW5wdXRIRChpbnB1dEluZGV4LCBoZEtleVBhaXIsIHNpZ2hhc2hUeXBlcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRNdXNpZzJQYXJ0aWNpcGFudHMoaW5wdXRJbmRleDogbnVtYmVyLCB0YXBJbnRlcm5hbEtleTogQnVmZmVyLCB0YXBNZXJrbGVSb290OiBCdWZmZXIpIHtcbiAgICBjb25zdCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhID0gcGFyc2VQc2J0TXVzaWcyUGFydGljaXBhbnRzKHRoaXMsIGlucHV0SW5kZXgpO1xuICAgIGlmICghcGFydGljaXBhbnRzS2V5VmFsRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCAwIG1hdGNoaW5nIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDFgKTtcbiAgICB9XG4gICAgYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudHNLZXlWYWxEYXRhLCB0YXBJbnRlcm5hbEtleSwgdGFwTWVya2xlUm9vdCk7XG4gICAgcmV0dXJuIHBhcnRpY2lwYW50c0tleVZhbERhdGE7XG4gIH1cblxuICBwcml2YXRlIGdldE11c2lnMk5vbmNlcyhpbnB1dEluZGV4OiBudW1iZXIsIHBhcnRpY2lwYW50c0tleVZhbERhdGE6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMpIHtcbiAgICBjb25zdCBub25jZXNLZXlWYWxzRGF0YSA9IHBhcnNlUHNidE11c2lnMk5vbmNlcyh0aGlzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIW5vbmNlc0tleVZhbHNEYXRhIHx8ICFpc1R1cGxlKG5vbmNlc0tleVZhbHNEYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRm91bmQgJHtub25jZXNLZXlWYWxzRGF0YT8ubGVuZ3RoID8gbm9uY2VzS2V5VmFsc0RhdGEubGVuZ3RoIDogMH0gbWF0Y2hpbmcgbm9uY2Uga2V5IHZhbHVlIGluc3RlYWQgb2YgMmBcbiAgICAgICk7XG4gICAgfVxuICAgIGFzc2VydFBzYnRNdXNpZzJOb25jZXMobm9uY2VzS2V5VmFsc0RhdGEsIHBhcnRpY2lwYW50c0tleVZhbERhdGEpO1xuICAgIHJldHVybiBub25jZXNLZXlWYWxzRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBwMnRyIG11c2lnMiBrZXkgcGF0aCBpbnB1dCB3aXRoIDIgYWdncmVnYXRlZCBrZXlzLlxuICAgKlxuICAgKiBOb3RlOiBPbmx5IGNhbiBzaWduIGRldGVybWluaXN0aWNhbGx5IGFzIHRoZSBjb3NpZ25lclxuICAgKiBAcGFyYW0gaW5wdXRJbmRleFxuICAgKiBAcGFyYW0gc2lnbmVyIC0gWFkgcHVibGljIGtleSBhbmQgcHJpdmF0ZSBrZXkgYXJlIHJlcXVpcmVkXG4gICAqIEBwYXJhbSBzaWdoYXNoVHlwZXNcbiAgICogQHBhcmFtIGRldGVybWluaXN0aWMgSWYgdHJ1ZSwgc2lnbiB0aGUgbXVzaWcgaW5wdXQgZGV0ZXJtaW5pc3RpY2FsbHlcbiAgICovXG4gIHNpZ25UYXByb290TXVzaWcySW5wdXQoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHNpZ25lcjogTXVzaWcyU2lnbmVyLFxuICAgIHsgc2lnaGFzaFR5cGVzID0gW1RyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCwgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTExdLCBkZXRlcm1pbmlzdGljID0gZmFsc2UgfSA9IHt9XG4gICk6IHRoaXMge1xuICAgIGlmICghdGhpcy5pc1RhcHJvb3RLZXlQYXRoSW5wdXQoaW5wdXRJbmRleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGEgdGFwcm9vdCBtdXNpZzIgaW5wdXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuZGF0YS5pbnB1dHNbaW5wdXRJbmRleF07XG5cbiAgICBpZiAoIWlucHV0LnRhcEludGVybmFsS2V5IHx8ICFpbnB1dC50YXBNZXJrbGVSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgaW5wdXQgZGF0YScpO1xuICAgIH1cblxuICAgIC8vIFJldHJpZXZlIGFuZCBjaGVjayB0aGF0IHdlIGhhdmUgdHdvIHBhcnRpY2lwYW50IG5vbmNlc1xuICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IHRoaXMuZ2V0TXVzaWcyUGFydGljaXBhbnRzKGlucHV0SW5kZXgsIGlucHV0LnRhcEludGVybmFsS2V5LCBpbnB1dC50YXBNZXJrbGVSb290KTtcbiAgICBjb25zdCB7IHRhcE91dHB1dEtleSwgcGFydGljaXBhbnRQdWJLZXlzIH0gPSBwYXJ0aWNpcGFudHM7XG4gICAgY29uc3Qgc2lnbmVyUHViS2V5ID0gcGFydGljaXBhbnRQdWJLZXlzLmZpbmQoKHB1YktleSkgPT4gcHViS2V5LmVxdWFscyhzaWduZXIucHVibGljS2V5KSk7XG4gICAgaWYgKCFzaWduZXJQdWJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVyIHB1YiBrZXkgc2hvdWxkIG1hdGNoIG9uZSBvZiBwYXJ0aWNpcGFudCBwdWIga2V5cycpO1xuICAgIH1cblxuICAgIGNvbnN0IG5vbmNlcyA9IHRoaXMuZ2V0TXVzaWcyTm9uY2VzKGlucHV0SW5kZXgsIHBhcnRpY2lwYW50cyk7XG4gICAgY29uc3QgeyBoYXNoLCBzaWdoYXNoVHlwZSB9ID0gdGhpcy5nZXRUYXByb290SGFzaEZvclNpZyhpbnB1dEluZGV4LCBzaWdoYXNoVHlwZXMpO1xuXG4gICAgbGV0IHBhcnRpYWxTaWc6IEJ1ZmZlcjtcbiAgICBpZiAoZGV0ZXJtaW5pc3RpYykge1xuICAgICAgaWYgKCFzaWduZXJQdWJLZXkuZXF1YWxzKHBhcnRpY2lwYW50UHViS2V5c1sxXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW4gb25seSBhZGQgYSBkZXRlcm1pbmlzdGljIHNpZ25hdHVyZSBvbiB0aGUgY29zaWduZXInKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3RTaWduZXJOb25jZSA9IG5vbmNlcy5maW5kKChuKSA9PiBuLnBhcnRpY2lwYW50UHViS2V5LmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMF0pKTtcbiAgICAgIGlmICghZmlyc3RTaWduZXJOb25jZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCBmaW5kIHRoZSB1c2VyIG5vbmNlJyk7XG4gICAgICB9XG5cbiAgICAgIHBhcnRpYWxTaWcgPSBtdXNpZzJEZXRlcm1pbmlzdGljU2lnbih7XG4gICAgICAgIHByaXZhdGVLZXk6IHNpZ25lci5wcml2YXRlS2V5LFxuICAgICAgICBvdGhlck5vbmNlOiBmaXJzdFNpZ25lck5vbmNlLnB1Yk5vbmNlLFxuICAgICAgICBwdWJsaWNLZXlzOiBwYXJ0aWNpcGFudFB1YktleXMsXG4gICAgICAgIGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSxcbiAgICAgICAgdGFwVHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgICAgIGhhc2gsXG4gICAgICB9KS5zaWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNlc3Npb25LZXkgPSBjcmVhdGVNdXNpZzJTaWduaW5nU2Vzc2lvbih7XG4gICAgICAgIHB1Yk5vbmNlczogW25vbmNlc1swXS5wdWJOb25jZSwgbm9uY2VzWzFdLnB1Yk5vbmNlXSxcbiAgICAgICAgcHViS2V5czogcGFydGljaXBhbnRQdWJLZXlzLFxuICAgICAgICB0eEhhc2g6IGhhc2gsXG4gICAgICAgIGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSxcbiAgICAgICAgdGFwVHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2lnbmVyTm9uY2UgPSBub25jZXMuZmluZCgoa3YpID0+IGt2LnBhcnRpY2lwYW50UHViS2V5LmVxdWFscyhzaWduZXJQdWJLZXkpKTtcbiAgICAgIGlmICghc2lnbmVyTm9uY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdWJOb25jZSBpcyBtaXNzaW5nLiByZXRyeSBzaWduaW5nIHByb2Nlc3MnKTtcbiAgICAgIH1cbiAgICAgIHBhcnRpYWxTaWcgPSBtdXNpZzJQYXJ0aWFsU2lnbihzaWduZXIucHJpdmF0ZUtleSwgc2lnbmVyTm9uY2UucHViTm9uY2UsIHNlc3Npb25LZXksIHRoaXMubm9uY2VTdG9yZSk7XG4gICAgfVxuXG4gICAgaWYgKHNpZ2hhc2hUeXBlICE9PSBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQpIHtcbiAgICAgIHBhcnRpYWxTaWcgPSBCdWZmZXIuY29uY2F0KFtwYXJ0aWFsU2lnLCBCdWZmZXIub2Yoc2lnaGFzaFR5cGUpXSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnID0gZW5jb2RlUHNidE11c2lnMlBhcnRpYWxTaWcoe1xuICAgICAgcGFydGljaXBhbnRQdWJLZXk6IHNpZ25lclB1YktleSxcbiAgICAgIHRhcE91dHB1dEtleSxcbiAgICAgIHBhcnRpYWxTaWc6IHBhcnRpYWxTaWcsXG4gICAgfSk7XG4gICAgdGhpcy5hZGRQcm9wcmlldGFyeUtleVZhbFRvSW5wdXQoaW5wdXRJbmRleCwgc2lnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNpZ25UYXByb290SW5wdXQoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHNpZ25lcjogU2Nobm9yclNpZ25lcixcbiAgICBsZWFmSGFzaGVzOiBCdWZmZXJbXSxcbiAgICBzaWdoYXNoVHlwZXM6IG51bWJlcltdID0gW1RyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCwgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTExdXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICAvLyBGaWd1cmUgb3V0IGlmIHRoaXMgaXMgc2NyaXB0IHBhdGggb3Igbm90LCBpZiBub3QsIHR3ZWFrIHRoZSBwcml2YXRlIGtleVxuICAgIGlmICghaW5wdXQudGFwTGVhZlNjcmlwdD8ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcExlYWZTY3JpcHQgaXMgcmVxdWlyZWQgZm9yIHAydHIgc2NyaXB0IHBhdGgnKTtcbiAgICB9XG4gICAgY29uc3QgcHVia2V5ID0gdG9YT25seVB1YmxpY0tleShzaWduZXIucHVibGljS2V5KTtcbiAgICBpZiAoaW5wdXQudGFwTGVhZlNjcmlwdC5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT25seSBvbmUgbGVhZiBzY3JpcHQgc3VwcG9ydGVkIGZvciBzaWduaW5nJyk7XG4gICAgfVxuICAgIGNvbnN0IHRhcExlYWZTY3JpcHQgPSBpbnB1dC50YXBMZWFmU2NyaXB0WzBdO1xuICAgIGNvbnN0IHBhcnNlZENvbnRyb2xCbG9jayA9IHRhcHJvb3QucGFyc2VDb250cm9sQmxvY2soZWNjTGliLCB0YXBMZWFmU2NyaXB0LmNvbnRyb2xCbG9jayk7XG4gICAgY29uc3QgeyBsZWFmVmVyc2lvbiB9ID0gcGFyc2VkQ29udHJvbEJsb2NrO1xuICAgIGlmIChsZWFmVmVyc2lvbiAhPT0gdGFwTGVhZlNjcmlwdC5sZWFmVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYXAgc2NyaXB0IGxlYWYgdmVyc2lvbiBtaXNtYXRjaCB3aXRoIGNvbnRyb2wgYmxvY2snKTtcbiAgICB9XG4gICAgY29uc3QgbGVhZkhhc2ggPSB0YXByb290LmdldFRhcGxlYWZIYXNoKGVjY0xpYiwgcGFyc2VkQ29udHJvbEJsb2NrLCB0YXBMZWFmU2NyaXB0LnNjcmlwdCk7XG4gICAgaWYgKCFsZWFmSGFzaGVzLmZpbmQoKGwpID0+IGwuZXF1YWxzKGxlYWZIYXNoKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2lnbmVyIGNhbm5vdCBzaWduIGZvciBsZWFmIGhhc2ggJHtsZWFmSGFzaC50b1N0cmluZygnaGV4Jyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IHsgaGFzaCwgc2lnaGFzaFR5cGUgfSA9IHRoaXMuZ2V0VGFwcm9vdEhhc2hGb3JTaWcoaW5wdXRJbmRleCwgc2lnaGFzaFR5cGVzLCBsZWFmSGFzaCk7XG4gICAgbGV0IHNpZ25hdHVyZSA9IHNpZ25lci5zaWduU2Nobm9ycihoYXNoKTtcbiAgICBpZiAoc2lnaGFzaFR5cGUgIT09IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCkge1xuICAgICAgc2lnbmF0dXJlID0gQnVmZmVyLmNvbmNhdChbc2lnbmF0dXJlLCBCdWZmZXIub2Yoc2lnaGFzaFR5cGUpXSk7XG4gICAgfVxuICAgIHRoaXMuZGF0YS51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICB0YXBTY3JpcHRTaWc6IFtcbiAgICAgICAge1xuICAgICAgICAgIHB1YmtleSxcbiAgICAgICAgICBzaWduYXR1cmUsXG4gICAgICAgICAgbGVhZkhhc2gsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYXByb290T3V0cHV0U2NyaXB0KGlucHV0SW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoaW5wdXQudGFwTGVhZlNjcmlwdD8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGFwcm9vdC5jcmVhdGVUYXByb290T3V0cHV0U2NyaXB0KHtcbiAgICAgICAgY29udHJvbEJsb2NrOiBpbnB1dC50YXBMZWFmU2NyaXB0WzBdLmNvbnRyb2xCbG9jayxcbiAgICAgICAgbGVhZlNjcmlwdDogaW5wdXQudGFwTGVhZlNjcmlwdFswXS5zY3JpcHQsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlucHV0LnRhcEludGVybmFsS2V5ICYmIGlucHV0LnRhcE1lcmtsZVJvb3QpIHtcbiAgICAgIHJldHVybiB0YXByb290LmNyZWF0ZVRhcHJvb3RPdXRwdXRTY3JpcHQoe1xuICAgICAgICBpbnRlcm5hbFB1YktleTogaW5wdXQudGFwSW50ZXJuYWxLZXksXG4gICAgICAgIHRhcHRyZWVSb290OiBpbnB1dC50YXBNZXJrbGVSb290LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignbm90IGEgdGFwcm9vdCBpbnB1dCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYXByb290SGFzaEZvclNpZyhcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgc2lnaGFzaFR5cGVzPzogbnVtYmVyW10sXG4gICAgbGVhZkhhc2g/OiBCdWZmZXJcbiAgKToge1xuICAgIGhhc2g6IEJ1ZmZlcjtcbiAgICBzaWdoYXNoVHlwZTogbnVtYmVyO1xuICB9IHtcbiAgICBpZiAoIXRoaXMuaXNUYXByb290SW5wdXQoaW5wdXRJbmRleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGEgdGFwcm9vdCBpbnB1dCcpO1xuICAgIH1cbiAgICBjb25zdCBzaWdoYXNoVHlwZSA9IHRoaXMuZGF0YS5pbnB1dHNbaW5wdXRJbmRleF0uc2lnaGFzaFR5cGUgfHwgVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUO1xuICAgIGlmIChzaWdoYXNoVHlwZXMgJiYgc2lnaGFzaFR5cGVzLmluZGV4T2Yoc2lnaGFzaFR5cGUpIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU2lnaGFzaCB0eXBlIGlzIG5vdCBhbGxvd2VkLiBSZXRyeSB0aGUgc2lnbiBtZXRob2QgcGFzc2luZyB0aGUgYCArXG4gICAgICAgICAgYHNpZ2hhc2hUeXBlcyBhcnJheSBvZiB3aGl0ZWxpc3RlZCB0eXBlcy4gU2lnaGFzaCB0eXBlOiAke3NpZ2hhc2hUeXBlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHR4SW5wdXRzID0gdGhpcy50eElucHV0czsgLy8gVGhlc2UgYXJlIHNvbWV3aGF0IGNvc3RseSB0byBleHRyYWN0XG4gICAgY29uc3QgcHJldm91dFNjcmlwdHM6IEJ1ZmZlcltdID0gW107XG4gICAgY29uc3QgcHJldm91dFZhbHVlczogYmlnaW50W10gPSBbXTtcblxuICAgIHRoaXMuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGkpID0+IHtcbiAgICAgIGxldCBwcmV2b3V0O1xuICAgICAgaWYgKGlucHV0Lm5vbldpdG5lc3NVdHhvKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY291bGQgYmUgY29zdGx5LCBlaXRoZXIgY2FjaGUgaXQgaGVyZSwgb3IgZmluZCBhIHdheSB0byBzaGFyZSB3aXRoIHN1cGVyXG4gICAgICAgIGNvbnN0IG5vbldpdG5lc3NVdHhvVHggPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgVXR4b1BzYnQpLnRyYW5zYWN0aW9uRnJvbUJ1ZmZlcihcbiAgICAgICAgICBpbnB1dC5ub25XaXRuZXNzVXR4byxcbiAgICAgICAgICB0aGlzLnR4Lm5ldHdvcmtcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBwcmV2b3V0SGFzaCA9IHR4SW5wdXRzW2ldLmhhc2g7XG4gICAgICAgIGNvbnN0IHV0eG9IYXNoID0gbm9uV2l0bmVzc1V0eG9UeC5nZXRIYXNoKCk7XG5cbiAgICAgICAgLy8gSWYgYSBub24td2l0bmVzcyBVVFhPIGlzIHByb3ZpZGVkLCBpdHMgaGFzaCBtdXN0IG1hdGNoIHRoZSBoYXNoIHNwZWNpZmllZCBpbiB0aGUgcHJldm91dFxuICAgICAgICBpZiAoIXByZXZvdXRIYXNoLmVxdWFscyh1dHhvSGFzaCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vbi13aXRuZXNzIFVUWE8gaGFzaCBmb3IgaW5wdXQgIyR7aX0gZG9lc24ndCBtYXRjaCB0aGUgaGFzaCBzcGVjaWZpZWQgaW4gdGhlIHByZXZvdXRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZvdXRJbmRleCA9IHR4SW5wdXRzW2ldLmluZGV4O1xuICAgICAgICBwcmV2b3V0ID0gbm9uV2l0bmVzc1V0eG9UeC5vdXRzW3ByZXZvdXRJbmRleF07XG4gICAgICB9IGVsc2UgaWYgKGlucHV0LndpdG5lc3NVdHhvKSB7XG4gICAgICAgIHByZXZvdXQgPSBpbnB1dC53aXRuZXNzVXR4bztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCBhIFV0eG8gaW5wdXQgaXRlbSBmb3Igc2lnbmluZycpO1xuICAgICAgfVxuICAgICAgcHJldm91dFNjcmlwdHMucHVzaChwcmV2b3V0LnNjcmlwdCk7XG4gICAgICBwcmV2b3V0VmFsdWVzLnB1c2gocHJldm91dC52YWx1ZSk7XG4gICAgfSk7XG4gICAgY29uc3Qgb3V0cHV0U2NyaXB0ID0gdGhpcy5nZXRUYXByb290T3V0cHV0U2NyaXB0KGlucHV0SW5kZXgpO1xuICAgIGlmICghb3V0cHV0U2NyaXB0LmVxdWFscyhwcmV2b3V0U2NyaXB0c1tpbnB1dEluZGV4XSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2l0bmVzcyBzY3JpcHQgZm9yIGlucHV0ICMke2lucHV0SW5kZXh9IGRvZXNuJ3QgbWF0Y2ggdGhlIHNjcmlwdFB1YktleSBpbiB0aGUgcHJldm91dGApO1xuICAgIH1cbiAgICBjb25zdCBoYXNoID0gdGhpcy50eC5oYXNoRm9yV2l0bmVzc1YxKGlucHV0SW5kZXgsIHByZXZvdXRTY3JpcHRzLCBwcmV2b3V0VmFsdWVzLCBzaWdoYXNoVHlwZSwgbGVhZkhhc2gpO1xuICAgIHJldHVybiB7IGhhc2gsIHNpZ2hhc2hUeXBlIH07XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBwcm9wcmlldGFyeSBrZXkgdmFsdWUgcGFpciB0byBQU0JUIGlucHV0LlxuICAgKiBEZWZhdWx0IGlkZW50aWZpZXJFbmNvZGluZyBpcyB1dGYtOCBmb3IgaWRlbnRpZmllci5cbiAgICovXG4gIGFkZFByb3ByaWV0YXJ5S2V5VmFsVG9JbnB1dChpbnB1dEluZGV4OiBudW1iZXIsIGtleVZhbHVlRGF0YTogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZFVua25vd25LZXlWYWxUb0lucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIGtleTogZW5jb2RlUHJvcHJpZXRhcnlLZXkoa2V5VmFsdWVEYXRhLmtleSksXG4gICAgICB2YWx1ZToga2V5VmFsdWVEYXRhLnZhbHVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgb3IgdXBkYXRlcyAoaWYgZXhpc3RzKSBwcm9wcmlldGFyeSBrZXkgdmFsdWUgcGFpciB0byBQU0JUIGlucHV0LlxuICAgKiBEZWZhdWx0IGlkZW50aWZpZXJFbmNvZGluZyBpcyB1dGYtOCBmb3IgaWRlbnRpZmllci5cbiAgICovXG4gIGFkZE9yVXBkYXRlUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGlucHV0SW5kZXg6IG51bWJlciwga2V5VmFsdWVEYXRhOiBQcm9wcmlldGFyeUtleVZhbHVlKTogdGhpcyB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGNvbnN0IGtleSA9IGVuY29kZVByb3ByaWV0YXJ5S2V5KGtleVZhbHVlRGF0YS5rZXkpO1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IGtleVZhbHVlRGF0YTtcbiAgICBpZiAoaW5wdXQudW5rbm93bktleVZhbHM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgdWt2SW5kZXggPSBpbnB1dC51bmtub3duS2V5VmFscy5maW5kSW5kZXgoKHVrdikgPT4gdWt2LmtleS5lcXVhbHMoa2V5KSk7XG4gICAgICBpZiAodWt2SW5kZXggPiAtMSkge1xuICAgICAgICBpbnB1dC51bmtub3duS2V5VmFsc1t1a3ZJbmRleF0gPSB7IGtleSwgdmFsdWUgfTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkVW5rbm93bktleVZhbFRvSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAga2V5LFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVG8gc2VhcmNoIGFueSBkYXRhIGZyb20gcHJvcHJpZXRhcnkga2V5IHZhbHVlIGFnYWluc3Qga2V5ZGF0YS5cbiAgICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gICAqL1xuICBnZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleDogbnVtYmVyLCBrZXlTZWFyY2g/OiBQcm9wcmlldGFyeUtleVNlYXJjaCk6IFByb3ByaWV0YXJ5S2V5VmFsdWVbXSB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGlmICghaW5wdXQudW5rbm93bktleVZhbHM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoa2V5U2VhcmNoICYmIGtleVNlYXJjaC5zdWJ0eXBlID09PSB1bmRlZmluZWQgJiYgQnVmZmVyLmlzQnVmZmVyKGtleVNlYXJjaC5rZXlkYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByb3ByaWV0YXJ5IGtleSBzZWFyY2ggZmlsdGVyIGNvbWJpbmF0aW9uLiBzdWJ0eXBlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IGtleVZhbHMgPSBpbnB1dC51bmtub3duS2V5VmFscy5tYXAoKHsga2V5LCB2YWx1ZSB9LCBpKSA9PiB7XG4gICAgICByZXR1cm4geyBrZXk6IGRlY29kZVByb3ByaWV0YXJ5S2V5KGtleSksIHZhbHVlIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIGtleVZhbHMuZmlsdGVyKChrZXlWYWwpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGtleVNlYXJjaCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIChrZXlTZWFyY2guaWRlbnRpZmllciA9PT0ga2V5VmFsLmtleS5pZGVudGlmaWVyICYmXG4gICAgICAgICAgKGtleVNlYXJjaC5zdWJ0eXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChrZXlTZWFyY2guc3VidHlwZSA9PT0ga2V5VmFsLmtleS5zdWJ0eXBlICYmXG4gICAgICAgICAgICAgICghQnVmZmVyLmlzQnVmZmVyKGtleVNlYXJjaC5rZXlkYXRhKSB8fCBrZXlTZWFyY2gua2V5ZGF0YS5lcXVhbHMoa2V5VmFsLmtleS5rZXlkYXRhKSkpKSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVG8gZGVsZXRlIGFueSBkYXRhIGZyb20gcHJvcHJpZXRhcnkga2V5IHZhbHVlLlxuICAgKiBEZWZhdWx0IGlkZW50aWZpZXJFbmNvZGluZyBpcyB1dGYtOCBmb3IgaWRlbnRpZmllci5cbiAgICovXG4gIGRlbGV0ZVByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4OiBudW1iZXIsIGtleXNUb0RlbGV0ZT86IFByb3ByaWV0YXJ5S2V5U2VhcmNoKTogdGhpcyB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGlmICghaW5wdXQudW5rbm93bktleVZhbHM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmIChrZXlzVG9EZWxldGUgJiYga2V5c1RvRGVsZXRlLnN1YnR5cGUgPT09IHVuZGVmaW5lZCAmJiBCdWZmZXIuaXNCdWZmZXIoa2V5c1RvRGVsZXRlLmtleWRhdGEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJvcHJpZXRhcnkga2V5IHNlYXJjaCBmaWx0ZXIgY29tYmluYXRpb24uIHN1YnR5cGUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaW5wdXQudW5rbm93bktleVZhbHMgPSBpbnB1dC51bmtub3duS2V5VmFscy5maWx0ZXIoKGtleVZhbHVlLCBpKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBkZWNvZGVQcm9wcmlldGFyeUtleShrZXlWYWx1ZS5rZXkpO1xuICAgICAgcmV0dXJuICEoXG4gICAgICAgIGtleXNUb0RlbGV0ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIChrZXlzVG9EZWxldGUuaWRlbnRpZmllciA9PT0ga2V5LmlkZW50aWZpZXIgJiZcbiAgICAgICAgICAoa2V5c1RvRGVsZXRlLnN1YnR5cGUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKGtleXNUb0RlbGV0ZS5zdWJ0eXBlID09PSBrZXkuc3VidHlwZSAmJlxuICAgICAgICAgICAgICAoIUJ1ZmZlci5pc0J1ZmZlcihrZXlzVG9EZWxldGUua2V5ZGF0YSkgfHwga2V5c1RvRGVsZXRlLmtleWRhdGEuZXF1YWxzKGtleS5rZXlkYXRhKSkpKSlcbiAgICAgICk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU11c2lnMk5vbmNlRm9ySW5wdXQoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIGtleVR5cGU6ICdyb290JyB8ICdkZXJpdmVkJyxcbiAgICBwYXJhbXM6IHsgc2Vzc2lvbklkPzogQnVmZmVyOyBkZXRlcm1pbmlzdGljPzogYm9vbGVhbiB9ID0geyBkZXRlcm1pbmlzdGljOiBmYWxzZSB9XG4gICk6IFBzYnRNdXNpZzJQdWJOb25jZSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuICAgIGlmICghaW5wdXQudGFwSW50ZXJuYWxLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGFwSW50ZXJuYWxLZXkgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIG5vbmNlJyk7XG4gICAgfVxuICAgIGlmICghaW5wdXQudGFwTWVya2xlUm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXBNZXJrbGVSb290IGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBub25jZScpO1xuICAgIH1cbiAgICBjb25zdCBnZXREZXJpdmVkS2V5UGFpciA9ICgpOiBCSVAzMkludGVyZmFjZSA9PiB7XG4gICAgICBpZiAoIWlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGFwQmlwMzJEZXJpdmF0aW9uIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBub25jZScpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVyaXZlZCA9IFV0eG9Qc2J0LmRlcml2ZUtleVBhaXIoa2V5UGFpciwgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uKTtcbiAgICAgIGlmICghZGVyaXZlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJpcDMyRGVyaXZhdGlvbiBtYXN0ZXJGaW5nZXJwcmludCBtYXRjaGVkIHRoZSBIRCBrZXlQYWlyIGZpbmdlcnByaW50Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVyaXZlZDtcbiAgICB9O1xuICAgIGNvbnN0IGRlcml2ZWRLZXlQYWlyID0ga2V5VHlwZSA9PT0gJ3Jvb3QnID8gZ2V0RGVyaXZlZEtleVBhaXIoKSA6IGtleVBhaXI7XG4gICAgaWYgKCFkZXJpdmVkS2V5UGFpci5wcml2YXRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaXZhdGVLZXkgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIG5vbmNlJyk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IHBhcnNlUHNidE11c2lnMlBhcnRpY2lwYW50cyh0aGlzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIXBhcnRpY2lwYW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCAwIG1hdGNoaW5nIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDFgKTtcbiAgICB9XG4gICAgYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudHMsIGlucHV0LnRhcEludGVybmFsS2V5LCBpbnB1dC50YXBNZXJrbGVSb290KTtcbiAgICBjb25zdCB7IHRhcE91dHB1dEtleSwgcGFydGljaXBhbnRQdWJLZXlzIH0gPSBwYXJ0aWNpcGFudHM7XG5cbiAgICBjb25zdCBwYXJ0aWNpcGFudFB1YktleSA9IHBhcnRpY2lwYW50UHViS2V5cy5maW5kKChwdWJLZXkpID0+IHB1YktleS5lcXVhbHMoZGVyaXZlZEtleVBhaXIucHVibGljS2V5KSk7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIocGFydGljaXBhbnRQdWJLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcnRpY2lwYW50IHBsYWluIHB1YiBrZXkgc2hvdWxkIG1hdGNoIG9uZSBiaXAzMkRlcml2YXRpb24gcGxhaW4gcHViIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaGFzaCB9ID0gdGhpcy5nZXRUYXByb290SGFzaEZvclNpZyhpbnB1dEluZGV4KTtcblxuICAgIGxldCBwdWJOb25jZTogQnVmZmVyO1xuICAgIGlmIChwYXJhbXMuZGV0ZXJtaW5pc3RpYykge1xuICAgICAgaWYgKHBhcmFtcy5zZXNzaW9uSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGV4dHJhIGVudHJvcHkgd2hlbiBnZW5lcmF0aW5nIGEgZGV0ZXJtaW5pc3RpYyBub25jZScpO1xuICAgICAgfVxuICAgICAgLy8gVGhlcmUgbXVzdCBiZSBvbmx5IDIgcGFydGljaXBhbnQgcHViS2V5cyBpZiBpdCBnb3QgdG8gdGhpcyBwb2ludFxuICAgICAgaWYgKCFwYXJ0aWNpcGFudFB1YktleS5lcXVhbHMocGFydGljaXBhbnRQdWJLZXlzWzFdKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgdGhlIGNvc2lnbmVyJ3Mgbm9uY2UgY2FuIGJlIHNldCBkZXRlcm1pbmlzdGljYWxseWApO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9uY2VzID0gcGFyc2VQc2J0TXVzaWcyTm9uY2VzKHRoaXMsIGlucHV0SW5kZXgpO1xuICAgICAgaWYgKCFub25jZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBub25jZXMgZm91bmQgb24gaW5wdXQgIyR7aW5wdXRJbmRleH1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChub25jZXMubGVuZ3RoID4gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBoYXZlIG1vcmUgdGhhbiAyIG5vbmNlc2ApO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlyc3RTaWduZXJOb25jZSA9IG5vbmNlcy5maW5kKChrdikgPT4ga3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKHBhcnRpY2lwYW50UHViS2V5c1swXSkpO1xuICAgICAgaWYgKCFmaXJzdFNpZ25lck5vbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVyIG5vbmNlIG11c3QgYmUgc2V0IGlmIGNvc2lnbmVyIG5vbmNlIGlzIHRvIGJlIGRlcml2ZWQgZGV0ZXJtaW5pc3RpY2FsbHknKTtcbiAgICAgIH1cblxuICAgICAgcHViTm9uY2UgPSBjcmVhdGVNdXNpZzJEZXRlcm1pbmlzdGljTm9uY2Uoe1xuICAgICAgICBwcml2YXRlS2V5OiBkZXJpdmVkS2V5UGFpci5wcml2YXRlS2V5LFxuICAgICAgICBvdGhlck5vbmNlOiBmaXJzdFNpZ25lck5vbmNlLnB1Yk5vbmNlLFxuICAgICAgICBwdWJsaWNLZXlzOiBwYXJ0aWNpcGFudFB1YktleXMsXG4gICAgICAgIGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSxcbiAgICAgICAgdGFwVHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgICAgIGhhc2gsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHViTm9uY2UgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgdGhpcy5ub25jZVN0b3JlLmNyZWF0ZU11c2lnMk5vbmNlKFxuICAgICAgICAgIGRlcml2ZWRLZXlQYWlyLnByaXZhdGVLZXksXG4gICAgICAgICAgcGFydGljaXBhbnRQdWJLZXksXG4gICAgICAgICAgdGFwT3V0cHV0S2V5LFxuICAgICAgICAgIGhhc2gsXG4gICAgICAgICAgcGFyYW1zLnNlc3Npb25JZFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7IHRhcE91dHB1dEtleSwgcGFydGljaXBhbnRQdWJLZXksIHB1Yk5vbmNlIH07XG4gIH1cblxuICBwcml2YXRlIHNldE11c2lnMk5vbmNlc0lubmVyKFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIGtleVR5cGU6ICdyb290JyB8ICdkZXJpdmVkJyxcbiAgICBpbnB1dEluZGV4PzogbnVtYmVyLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgaWYgKGtleVBhaXIuaXNOZXV0ZXJlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaXZhdGUga2V5IGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIG5vbmNlJyk7XG4gICAgfVxuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIocGFyYW1zLnNlc3Npb25JZCkgJiYgcGFyYW1zLnNlc3Npb25JZC5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2Vzc2lvbklkIHNpemUgJHtwYXJhbXMuc2Vzc2lvbklkLmxlbmd0aH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dHMgPSBpbnB1dEluZGV4ID09PSB1bmRlZmluZWQgPyB0aGlzLmRhdGEuaW5wdXRzIDogW2NoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCldO1xuICAgIGlucHV0cy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghdGhpcy5pc1RhcHJvb3RLZXlQYXRoSW5wdXQoaW5kZXgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vbmNlID0gdGhpcy5jcmVhdGVNdXNpZzJOb25jZUZvcklucHV0KGluZGV4LCBrZXlQYWlyLCBrZXlUeXBlLCBwYXJhbXMpO1xuICAgICAgdGhpcy5hZGRPclVwZGF0ZVByb3ByaWV0YXJ5S2V5VmFsVG9JbnB1dChpbmRleCwgZW5jb2RlUHNidE11c2lnMlB1Yk5vbmNlKG5vbmNlKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFuZCBzZXRzIE11U2lnMiBub25jZSB0byB0YXByb290IGtleSBwYXRoIGlucHV0IGF0IGlucHV0SW5kZXguXG4gICAqIElmIGlucHV0IGlzIG5vdCBhIHRhcHJvb3Qga2V5IHBhdGgsIG5vIGFjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0SW5kZXggaW5wdXQgaW5kZXhcbiAgICogQHBhcmFtIGtleVBhaXIgZGVyaXZlZCBrZXkgcGFpclxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIE9wdGlvbmFsIGV4dHJhIGVudHJvcHkuIElmIHByb3ZpZGVkIGl0IG11c3QgZWl0aGVyIGJlIGEgY291bnRlciB1bmlxdWUgdG8gdGhpcyBzZWNyZXQga2V5LFxuICAgKiAoY29udmVydGVkIHRvIGFuIGFycmF5IG9mIDMyIGJ5dGVzKSwgb3IgMzIgdW5pZm9ybWx5IHJhbmRvbSBieXRlcy5cbiAgICogQHBhcmFtIGRldGVybWluaXN0aWMgSWYgdHJ1ZSwgc2V0IHRoZSBjb3NpZ25lciBub25jZSBkZXRlcm1pbmlzdGljYWxseVxuICAgKi9cbiAgc2V0SW5wdXRNdXNpZzJOb25jZShcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgZGVyaXZlZEtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgLy8gVE9ETzogVGhpcyBzaG91bGQgdGFrZSBhbiBpbnB1dEluZGV4IGFuZCBvbmx5IGFwcGx5IHRvIHRoYXQgaW5wdXQgd2l0aCB0aGlzIGRlcml2ZWQga2V5LlxuICAgIHJldHVybiB0aGlzLnNldE11c2lnMk5vbmNlc0lubmVyKGRlcml2ZWRLZXlQYWlyLCAnZGVyaXZlZCcsIGlucHV0SW5kZXgsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFuZCBzZXRzIE11U2lnMiBub25jZSB0byB0YXByb290IGtleSBwYXRoIGlucHV0IGF0IGlucHV0SW5kZXguXG4gICAqIElmIGlucHV0IGlzIG5vdCBhIHRhcHJvb3Qga2V5IHBhdGgsIG5vIGFjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0SW5kZXggaW5wdXQgaW5kZXhcbiAgICogQHBhcmFtIGtleVBhaXIgSEQgcm9vdCBrZXkgcGFpclxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIE9wdGlvbmFsIGV4dHJhIGVudHJvcHkuIElmIHByb3ZpZGVkIGl0IG11c3QgZWl0aGVyIGJlIGEgY291bnRlciB1bmlxdWUgdG8gdGhpcyBzZWNyZXQga2V5LFxuICAgKiAoY29udmVydGVkIHRvIGFuIGFycmF5IG9mIDMyIGJ5dGVzKSwgb3IgMzIgdW5pZm9ybWx5IHJhbmRvbSBieXRlcy5cbiAgICogQHBhcmFtIGRldGVybWluaXN0aWMgSWYgdHJ1ZSwgc2V0IHRoZSBjb3NpZ25lciBub25jZSBkZXRlcm1pbmlzdGljYWxseVxuICAgKi9cbiAgc2V0SW5wdXRNdXNpZzJOb25jZUhEKFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBrZXlQYWlyOiBCSVAzMkludGVyZmFjZSxcbiAgICBwYXJhbXM6IHsgc2Vzc2lvbklkPzogQnVmZmVyOyBkZXRlcm1pbmlzdGljPzogYm9vbGVhbiB9ID0geyBkZXRlcm1pbmlzdGljOiBmYWxzZSB9XG4gICk6IHRoaXMge1xuICAgIGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgcmV0dXJuIHRoaXMuc2V0TXVzaWcyTm9uY2VzSW5uZXIoa2V5UGFpciwgJ3Jvb3QnLCBpbnB1dEluZGV4LCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbmQgc2V0cyBNdVNpZzIgbm9uY2UgdG8gYWxsIHRhcHJvb3Qga2V5IHBhdGggaW5wdXRzLiBPdGhlciBpbnB1dHMgd2lsbCBiZSBza2lwcGVkLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRJbmRleCBpbnB1dCBpbmRleFxuICAgKiBAcGFyYW0ga2V5UGFpciBkZXJpdmVkIGtleSBwYWlyXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgT3B0aW9uYWwgZXh0cmEgZW50cm9weS4gSWYgcHJvdmlkZWQgaXQgbXVzdCBlaXRoZXIgYmUgYSBjb3VudGVyIHVuaXF1ZSB0byB0aGlzIHNlY3JldCBrZXksXG4gICAqIChjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb2YgMzIgYnl0ZXMpLCBvciAzMiB1bmlmb3JtbHkgcmFuZG9tIGJ5dGVzLlxuICAgKi9cbiAgc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2UoXG4gICAga2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5zZXRNdXNpZzJOb25jZXNJbm5lcihrZXlQYWlyLCAnZGVyaXZlZCcsIHVuZGVmaW5lZCwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW5kIHNldHMgTXVTaWcyIG5vbmNlIHRvIGFsbCB0YXByb290IGtleSBwYXRoIGlucHV0cy4gT3RoZXIgaW5wdXRzIHdpbGwgYmUgc2tpcHBlZC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0SW5kZXggaW5wdXQgaW5kZXhcbiAgICogQHBhcmFtIGtleVBhaXIgSEQgcm9vdCBrZXkgcGFpclxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIE9wdGlvbmFsIGV4dHJhIGVudHJvcHkuIElmIHByb3ZpZGVkIGl0IG11c3QgZWl0aGVyIGJlIGEgY291bnRlciB1bmlxdWUgdG8gdGhpcyBzZWNyZXQga2V5LFxuICAgKiAoY29udmVydGVkIHRvIGFuIGFycmF5IG9mIDMyIGJ5dGVzKSwgb3IgMzIgdW5pZm9ybWx5IHJhbmRvbSBieXRlcy5cbiAgICovXG4gIHNldEFsbElucHV0c011c2lnMk5vbmNlSEQoXG4gICAga2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5zZXRNdXNpZzJOb25jZXNJbm5lcihrZXlQYWlyLCAncm9vdCcsIHVuZGVmaW5lZCwgcGFyYW1zKTtcbiAgfVxuXG4gIGNsb25lKCk6IHRoaXMge1xuICAgIHJldHVybiBzdXBlci5jbG9uZSgpIGFzIHRoaXM7XG4gIH1cbn1cbiJdfQ==
1017
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXR4b1BzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYml0Z28vVXR4b1BzYnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQWlDO0FBQ2pDLG1DQUEwQztBQVExQyxnREFBcUQ7QUFDckQsK0RBQXNFO0FBRXRFLGlDQUFxRDtBQUNyRCx1Q0FBdUM7QUFDdkMsd0VBQThGO0FBRTlGLDBCQVlZO0FBQ1osdURBQW9EO0FBQ3BELHVDQUFnRDtBQUNoRCxvREFBOEM7QUFDOUMsMERBQStDO0FBQy9DLG1EQUFtRDtBQUNuRCw2Q0FBa0Q7QUFDbEQscUNBa0JrQjtBQUNsQixtQ0FBMkQ7QUFDM0Qsd0NBQWlEO0FBQ2pELHlDQU9vQjtBQVlwQixTQUFTLG1CQUFtQjtJQUMxQixPQUFPLENBQUMsZUFBVyxDQUFDLGVBQWUsRUFBRSxlQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQUMsT0FBZ0IsRUFBRSxZQUFzQjtJQUM1RSxRQUFRLElBQUEsY0FBVSxFQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDNUIsS0FBSyxZQUFRLENBQUMsV0FBVyxDQUFDO1FBQzFCLEtBQUssWUFBUSxDQUFDLFNBQVMsQ0FBQztRQUN4QixLQUFLLFlBQVEsQ0FBQyxXQUFXLENBQUM7UUFDMUIsS0FBSyxZQUFRLENBQUMsS0FBSztZQUNqQixPQUFPLENBQUMsR0FBRyxZQUFZLEVBQUUsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsaUNBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQzNGO1lBQ0UsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE9BQWdCLEVBQUUsQ0FBdUM7SUFDbEYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUFF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QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILHVCQUF1QixDQUNyQixPQUF1QixFQUN2QixTQUEwRCxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUU7UUFFbEYsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCx5QkFBeUIsQ0FDdkIsT0FBdUIsRUFDdkIsU0FBMEQsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFO1FBRWxGLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQVMsQ0FBQztJQUNqRixDQUFDO0lBRUQsa0JBQWtCLENBQUMsZUFBZSxHQUFHLElBQUk7UUFDdkMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3JELElBQUksRUFBRSxZQUFZLGlDQUFlLEVBQUUsQ0FBQztZQUNsQyxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7SUFDbEYsQ0FBQztDQUNGO0FBcHBDRCw0QkFvcENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBQc2J0IGFzIFBzYnRCYXNlIH0gZnJvbSAnYmlwMTc0JztcbmltcG9ydCB7XG4gIEJpcDMyRGVyaXZhdGlvbixcbiAgUHNidElucHV0LFxuICBUYXBCaXAzMkRlcml2YXRpb24sXG4gIFRyYW5zYWN0aW9uIGFzIElUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25Gcm9tQnVmZmVyLFxufSBmcm9tICdiaXAxNzQvc3JjL2xpYi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGNoZWNrRm9ySW5wdXQgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBCdWZmZXJXcml0ZXIsIHZhcnVpbnQgfSBmcm9tICdiaXRjb2luanMtbGliL3NyYy9idWZmZXJ1dGlscyc7XG5pbXBvcnQgeyBTZXNzaW9uS2V5IH0gZnJvbSAnQGJyYW5kb25ibGFjay9tdXNpZyc7XG5pbXBvcnQgeyBCSVAzMkZhY3RvcnksIEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnYmlwMzInO1xuaW1wb3J0ICogYXMgYnM1OGNoZWNrIGZyb20gJ2JzNThjaGVjayc7XG5pbXBvcnQgeyBkZWNvZGVQcm9wcmlldGFyeUtleSwgZW5jb2RlUHJvcHJpZXRhcnlLZXkgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi9wcm9wcmlldGFyeUtleVZhbCc7XG5cbmltcG9ydCB7XG4gIHRhcHJvb3QsXG4gIEhEU2lnbmVyLFxuICBTaWduZXIsXG4gIFBzYnQsXG4gIFBzYnRUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb24sXG4gIFR4T3V0cHV0LFxuICBOZXR3b3JrLFxuICBlY2MgYXMgZWNjTGliLFxuICBnZXRNYWlubmV0LFxuICBuZXR3b3Jrcyxcbn0gZnJvbSAnLi4nO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uIH0gZnJvbSAnLi9VdHhvVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgZ2V0T3V0cHV0SWRGb3JJbnB1dCB9IGZyb20gJy4vVW5zcGVudCc7XG5pbXBvcnQgeyBpc1NlZ3dpdCB9IGZyb20gJy4vcHNidC9zY3JpcHRUeXBlcyc7XG5pbXBvcnQgeyB1bnNpZ24gfSBmcm9tICcuL3BzYnQvZnJvbUhhbGZTaWduZWQnO1xuaW1wb3J0IHsgdG9YT25seVB1YmxpY0tleSB9IGZyb20gJy4vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyBwYXJzZVB1YlNjcmlwdDJPZjMgfSBmcm9tICcuL3BhcnNlSW5wdXQnO1xuaW1wb3J0IHtcbiAgY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24sXG4gIGVuY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnLFxuICBlbmNvZGVQc2J0TXVzaWcyUHViTm9uY2UsXG4gIG11c2lnMlBhcnRpYWxTaWduLFxuICBwYXJzZVBzYnRNdXNpZzJOb25jZXMsXG4gIHBhcnNlUHNidE11c2lnMlBhcnRpY2lwYW50cyxcbiAgUHNidE11c2lnMlBhcnRpY2lwYW50cyxcbiAgYXNzZXJ0UHNidE11c2lnMk5vbmNlcyxcbiAgYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50cyxcbiAgTXVzaWcyTm9uY2VTdG9yZSxcbiAgUHNidE11c2lnMlB1Yk5vbmNlLFxuICBwYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyxcbiAgbXVzaWcyUGFydGlhbFNpZ1ZlcmlmeSxcbiAgbXVzaWcyQWdncmVnYXRlU2lncyxcbiAgZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyxcbiAgbXVzaWcyRGV0ZXJtaW5pc3RpY1NpZ24sXG4gIGNyZWF0ZU11c2lnMkRldGVybWluaXN0aWNOb25jZSxcbn0gZnJvbSAnLi9NdXNpZzInO1xuaW1wb3J0IHsgaXNUcmlwbGUsIGlzVHVwbGUsIFRyaXBsZSwgVHVwbGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldFRhcHJvb3RPdXRwdXRLZXkgfSBmcm9tICcuLi90YXByb290JztcbmltcG9ydCB7XG4gIGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyxcbiAgZ2V0UHNidElucHV0U2lnbmF0dXJlQ291bnQsXG4gIFByb3ByaWV0YXJ5S2V5U2VhcmNoLFxuICBQcm9wcmlldGFyeUtleVN1YnR5cGUsXG4gIFByb3ByaWV0YXJ5S2V5VmFsdWUsXG4gIFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbn0gZnJvbSAnLi9Qc2J0VXRpbCc7XG5cbnR5cGUgU2lnbmF0dXJlUGFyYW1zID0ge1xuICAvKiogV2hlbiB0cnVlLCBhbmQgYWRkIHRoZSBzZWNvbmQgKGxhc3QpIG5vbmNlIGFuZCBzaWduYXR1cmUgZm9yIGEgdGFwcm9vdCBrZXlcbiAgICogcGF0aCBzcGVuZCBkZXRlcm1pbmlzdGljYWxseS4gVGhyb3dzIGFuIGVycm9yIGlmIGRvbmUgZm9yIHRoZSBmaXJzdCBub25jZS9zaWduYXR1cmVcbiAgICogb2YgYSB0YXByb290IGtleXBhdGggc3BlbmQuIElnbm9yZSBmb3IgYWxsIG90aGVyIGlucHV0IHR5cGVzLlxuICAgKi9cbiAgZGV0ZXJtaW5pc3RpYzogYm9vbGVhbjtcbiAgLyoqIEFsbG93ZWQgc2lnaGFzaCB0eXBlcyAqL1xuICBzaWdoYXNoVHlwZXM6IG51bWJlcltdO1xufTtcblxuZnVuY3Rpb24gZGVmYXVsdFNpZ2hhc2hUeXBlcygpOiBudW1iZXJbXSB7XG4gIHJldHVybiBbVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxULCBUcmFuc2FjdGlvbi5TSUdIQVNIX0FMTF07XG59XG5cbmZ1bmN0aW9uIGFkZEZvcmtJZFRvU2lnaGFzaGVzSWZOZWVkZWQobmV0d29yazogTmV0d29yaywgc2lnaGFzaFR5cGVzOiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgc3dpdGNoIChnZXRNYWlubmV0KG5ldHdvcmspKSB7XG4gICAgY2FzZSBuZXR3b3Jrcy5iaXRjb2luY2FzaDpcbiAgICBjYXNlIG5ldHdvcmtzLmJpdGNvaW5zdjpcbiAgICBjYXNlIG5ldHdvcmtzLmJpdGNvaW5nb2xkOlxuICAgIGNhc2UgbmV0d29ya3MuZWNhc2g6XG4gICAgICByZXR1cm4gWy4uLnNpZ2hhc2hUeXBlcywgLi4uc2lnaGFzaFR5cGVzLm1hcCgocykgPT4gcyB8IFV0eG9UcmFuc2FjdGlvbi5TSUdIQVNIX0ZPUktJRCldO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc2lnaGFzaFR5cGVzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvU2lnbmF0dXJlUGFyYW1zKG5ldHdvcms6IE5ldHdvcmssIHY/OiBQYXJ0aWFsPFNpZ25hdHVyZVBhcmFtcz4gfCBudW1iZXJbXSk6IFNpZ25hdHVyZVBhcmFtcyB7XG4gIGlmIChBcnJheS5pc0FycmF5KHYpKSByZXR1cm4gdG9TaWduYXR1cmVQYXJhbXMobmV0d29yaywgeyBzaWdoYXNoVHlwZXM6IHYgfSk7XG4gIGNvbnN0IGRlZmF1bHRTaWduYXR1cmVQYXJhbXMgPSB7IGRldGVybWluaXN0aWM6IGZhbHNlLCBzaWdoYXNoVHlwZXM6IGRlZmF1bHRTaWdoYXNoVHlwZXMoKSB9O1xuICBjb25zdCByZXQgPSB7IC4uLmRlZmF1bHRTaWduYXR1cmVQYXJhbXMsIC4uLnYgfTtcbiAgcmV0LnNpZ2hhc2hUeXBlcyA9IGFkZEZvcmtJZFRvU2lnaGFzaGVzSWZOZWVkZWQobmV0d29yaywgcmV0LnNpZ2hhc2hUeXBlcyk7XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogQHBhcmFtIGFcbiAqIEBwYXJhbSBiXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gcHVibGljIGtleXMgYXJlIGVxdWFsIGlnbm9yaW5nIHRoZSB5IGNvb3JkaW5hdGUuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsUHVibGljS2V5SWdub3JlWShhOiBCdWZmZXIsIGI6IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9YT25seVB1YmxpY0tleShhKS5lcXVhbHModG9YT25seVB1YmxpY0tleShiKSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSERUYXByb290U2lnbmVyIGV4dGVuZHMgSERTaWduZXIge1xuICAvKipcbiAgICogVGhlIHBhdGggc3RyaW5nIG11c3QgbWF0Y2ggL15tKFxcL1xcZCsnPykrJC9cbiAgICogZXguIG0vNDQnLzAnLzAnLzEvMjMgbGV2ZWxzIHdpdGggJyBtdXN0IGJlIGhhcmQgZGVyaXZhdGlvbnNcbiAgICovXG4gIGRlcml2ZVBhdGgocGF0aDogc3RyaW5nKTogSERUYXByb290U2lnbmVyO1xuICAvKipcbiAgICogSW5wdXQgaGFzaCAodGhlIFwibWVzc2FnZSBkaWdlc3RcIikgZm9yIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtXG4gICAqIFJldHVybiBhIDY0IGJ5dGUgc2lnbmF0dXJlICgzMiBieXRlIHIgYW5kIDMyIGJ5dGUgcyBpbiB0aGF0IG9yZGVyKVxuICAgKi9cbiAgc2lnblNjaG5vcnIoaGFzaDogQnVmZmVyKTogQnVmZmVyO1xufVxuXG4vKipcbiAqIEhEIHNpZ25lciBvYmplY3QgZm9yIHRhcHJvb3QgcDJ0ciBtdXNpZzIga2V5IHBhdGggc2lnblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhEVGFwcm9vdE11c2lnMlNpZ25lciBleHRlbmRzIEhEU2lnbmVyIHtcbiAgLyoqXG4gICAqIE11c2lnMiByZXF1aXJlcyBzaWduZXIncyAzMi1ieXRlcyBwcml2YXRlIGtleSB0byBiZSBwYXNzZWQgdG8gaXQuXG4gICAqL1xuICBwcml2YXRlS2V5OiBCdWZmZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHN0cmluZyBtdXN0IG1hdGNoIC9ebShcXC9cXGQrJz8pKyQvXG4gICAqIGV4LiBtLzQ0Jy8wJy8wJy8xLzIzIGxldmVscyB3aXRoICcgbXVzdCBiZSBoYXJkIGRlcml2YXRpb25zXG4gICAqL1xuICBkZXJpdmVQYXRoKHBhdGg6IHN0cmluZyk6IEhEVGFwcm9vdE11c2lnMlNpZ25lcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hub3JyU2lnbmVyIHtcbiAgcHVibGljS2V5OiBCdWZmZXI7XG4gIHNpZ25TY2hub3JyKGhhc2g6IEJ1ZmZlcik6IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNdXNpZzJTaWduZXIge1xuICBwdWJsaWNLZXk6IEJ1ZmZlcjtcbiAgcHJpdmF0ZUtleTogQnVmZmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhcHJvb3RTaWduZXIge1xuICBsZWFmSGFzaGVzOiBCdWZmZXJbXTtcbiAgc2lnbmVyOiBTY2hub3JyU2lnbmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRPcHRzIHtcbiAgbmV0d29yazogTmV0d29yaztcbiAgbWF4aW11bUZlZVJhdGU/OiBudW1iZXI7IC8vIFtzYXQvYnl0ZV1cbiAgYmlwMzJQYXRoc0Fic29sdXRlPzogYm9vbGVhbjtcbn1cblxuLy8gVE9ETzogdXBzdHJlYW0gZG9lcyBgY2hlY2tJbnB1dHNGb3JQYXJ0aWFsU2lnc2AgYmVmb3JlIGRvaW5nIHRoaW5ncyBsaWtlXG4vLyBgc2V0VmVyc2lvbmAuIE91ciBpbnB1dHMgY291bGQgaGF2ZSB0YXBzY3JpcHRzaWdzIChvciBpbiBmdXR1cmUgdGFwa2V5c2lncylcbi8vIGFuZCBub3QgZmFpbCB0aGF0IGNoZWNrLiBEbyB3ZSB3YW50IHRvIGRvIGFueXRoaW5nIGFib3V0IHRoYXQ/XG5leHBvcnQgY2xhc3MgVXR4b1BzYnQ8VHggZXh0ZW5kcyBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiA9IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+PiBleHRlbmRzIFBzYnQge1xuICBwcml2YXRlIG5vbmNlU3RvcmUgPSBuZXcgTXVzaWcyTm9uY2VTdG9yZSgpO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyKGJ1ZmZlcjogQnVmZmVyLCBuZXR3b3JrOiBOZXR3b3JrKTogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICAgIHJldHVybiBVdHhvVHJhbnNhY3Rpb24uZnJvbUJ1ZmZlcjxiaWdpbnQ+KGJ1ZmZlciwgZmFsc2UsICdiaWdpbnQnLCBuZXR3b3JrKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQc2J0KG9wdHM6IFBzYnRPcHRzLCBkYXRhPzogUHNidEJhc2UpOiBVdHhvUHNidCB7XG4gICAgcmV0dXJuIG5ldyBVdHhvUHNidChcbiAgICAgIG9wdHMsXG4gICAgICBkYXRhIHx8IG5ldyBQc2J0QmFzZShuZXcgUHNidFRyYW5zYWN0aW9uKHsgdHg6IG5ldyBVdHhvVHJhbnNhY3Rpb248YmlnaW50PihvcHRzLm5ldHdvcmspIH0pKVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUJ1ZmZlcihidWZmZXI6IEJ1ZmZlciwgb3B0czogUHNidE9wdHMpOiBVdHhvUHNidCB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyOiBUcmFuc2FjdGlvbkZyb21CdWZmZXIgPSAoYnVmZmVyOiBCdWZmZXIpOiBJVHJhbnNhY3Rpb24gPT4ge1xuICAgICAgY29uc3QgdHggPSB0aGlzLnRyYW5zYWN0aW9uRnJvbUJ1ZmZlcihidWZmZXIsIG9wdHMubmV0d29yayk7XG4gICAgICByZXR1cm4gbmV3IFBzYnRUcmFuc2FjdGlvbih7IHR4IH0pO1xuICAgIH07XG4gICAgY29uc3QgcHNidEJhc2UgPSBQc2J0QmFzZS5mcm9tQnVmZmVyKGJ1ZmZlciwgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyLCB7XG4gICAgICBiaXAzMlBhdGhzQWJzb2x1dGU6IG9wdHMuYmlwMzJQYXRoc0Fic29sdXRlLFxuICAgIH0pO1xuICAgIGNvbnN0IHBzYnQgPSB0aGlzLmNyZWF0ZVBzYnQob3B0cywgcHNidEJhc2UpO1xuICAgIC8vIFVwc3RyZWFtIGNoZWNrcyBmb3IgZHVwbGljYXRlIGlucHV0cyBoZXJlLCBidXQgaXQgc2VlbXMgdG8gYmUgb2YgZHViaW91cyB2YWx1ZS5cbiAgICByZXR1cm4gcHNidDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSGV4KGRhdGE6IHN0cmluZywgb3B0czogUHNidE9wdHMpOiBVdHhvUHNidCB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUJ1ZmZlcihCdWZmZXIuZnJvbShkYXRhLCAnaGV4JyksIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXJlbnQgLSBQYXJlbnQga2V5LiBNYXRjaGVkIHdpdGggYGJpcDMyRGVyaXZhdGlvbnNgIHVzaW5nIGBmaW5nZXJwcmludGAgcHJvcGVydHkuXG4gICAqIEBwYXJhbSBiaXAzMkRlcml2YXRpb25zIC0gcG9zc2libGUgZGVyaXZhdGlvbnMgZm9yIGlucHV0IG9yIG91dHB1dFxuICAgKiBAcGFyYW0gaWdub3JlWSAtIHdoZW4gdHJ1ZSwgaWdub3JlIHRoZSB5IGNvb3JkaW5hdGUgd2hlbiBtYXRjaGluZyBwdWJsaWMga2V5c1xuICAgKiBAcmV0dXJuIGRlcml2ZWQgYmlwMzIgbm9kZSBpZiBtYXRjaGluZyBkZXJpdmF0aW9uIGlzIGZvdW5kLCB1bmRlZmluZWQgaWYgbm9uZSBpcyBmb3VuZFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggaXMgZm91bmRcbiAgICovXG4gIHN0YXRpYyBkZXJpdmVLZXlQYWlyKFxuICAgIHBhcmVudDogQklQMzJJbnRlcmZhY2UsXG4gICAgYmlwMzJEZXJpdmF0aW9uczogQmlwMzJEZXJpdmF0aW9uW10sXG4gICAgeyBpZ25vcmVZIH06IHsgaWdub3JlWTogYm9vbGVhbiB9XG4gICk6IEJJUDMySW50ZXJmYWNlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtYXRjaGluZ0Rlcml2YXRpb25zID0gYmlwMzJEZXJpdmF0aW9ucy5maWx0ZXIoKGJpcER2KSA9PiB7XG4gICAgICByZXR1cm4gYmlwRHYubWFzdGVyRmluZ2VycHJpbnQuZXF1YWxzKHBhcmVudC5maW5nZXJwcmludCk7XG4gICAgfSk7XG5cbiAgICBpZiAoIW1hdGNoaW5nRGVyaXZhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAvLyBObyBmaW5nZXJwcmludCBtYXRjaFxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2hpbmdEZXJpdmF0aW9ucy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYG1vcmUgdGhhbiBvbmUgbWF0Y2hpbmcgZGVyaXZhdGlvbiBmb3IgZmluZ2VycHJpbnQgJHtwYXJlbnQuZmluZ2VycHJpbnQudG9TdHJpbmcoJ2hleCcpfTogJHtcbiAgICAgICAgICBtYXRjaGluZ0Rlcml2YXRpb25zLmxlbmd0aFxuICAgICAgICB9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBbZGVyaXZhdGlvbl0gPSBtYXRjaGluZ0Rlcml2YXRpb25zO1xuICAgIGNvbnN0IG5vZGUgPSBwYXJlbnQuZGVyaXZlUGF0aChkZXJpdmF0aW9uLnBhdGgpO1xuXG4gICAgaWYgKCFub2RlLnB1YmxpY0tleS5lcXVhbHMoZGVyaXZhdGlvbi5wdWJrZXkpKSB7XG4gICAgICBpZiAoIWlnbm9yZVkgfHwgIWVxdWFsUHVibGljS2V5SWdub3JlWShub2RlLnB1YmxpY0tleSwgZGVyaXZhdGlvbi5wdWJrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncHVia2V5IGRpZCBub3QgbWF0Y2ggYmlwMzJEZXJpdmF0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBzdGF0aWMgZGVyaXZlS2V5UGFpckZvcklucHV0KGJpcDMyOiBCSVAzMkludGVyZmFjZSwgaW5wdXQ6IFBzYnRJbnB1dCk6IEJ1ZmZlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoXG4gICAgICA/IFV0eG9Qc2J0LmRlcml2ZUtleVBhaXIoYmlwMzIsIGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbiwgeyBpZ25vcmVZOiB0cnVlIH0pPy5wdWJsaWNLZXlcbiAgICAgIDogaW5wdXQuYmlwMzJEZXJpdmF0aW9uPy5sZW5ndGhcbiAgICAgID8gVXR4b1BzYnQuZGVyaXZlS2V5UGFpcihiaXAzMiwgaW5wdXQuYmlwMzJEZXJpdmF0aW9uLCB7IGlnbm9yZVk6IGZhbHNlIH0pPy5wdWJsaWNLZXlcbiAgICAgIDogYmlwMzI/LnB1YmxpY0tleTtcbiAgfVxuXG4gIGdldCBuZXR3b3JrKCk6IE5ldHdvcmsge1xuICAgIHJldHVybiB0aGlzLnR4Lm5ldHdvcms7XG4gIH1cblxuICB0b0hleCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IGlzIGV4cGVuc2l2ZSB0byBhdHRlbXB0IHRvIGNvbXB1dGUgZXZlcnkgb3V0cHV0IGFkZHJlc3MgdXNpbmcgcHNidC50eE91dHB1dHNbb3V0cHV0SW5kZXhdXG4gICAqIHRvIHRoZW4ganVzdCBnZXQgdGhlIHNjcmlwdC4gSGVyZSwgd2UgYXJlIGRvaW5nIHRoZSBzYW1lIHRoaW5nIGFzIHdoYXQgdHhPdXRwdXRzKCkgZG9lcyBpblxuICAgKiBiaXRjb2luanMtbGliLCBidXQgd2l0aG91dCBpdGVyYXRpbmcgb3ZlciBlYWNoIG91dHB1dC5cbiAgICogQHBhcmFtIG91dHB1dEluZGV4XG4gICAqIEByZXR1cm5zIG91dHB1dCBzY3JpcHQgYXQgdGhlIGdpdmVuIGluZGV4XG4gICAqL1xuICBnZXRPdXRwdXRTY3JpcHQob3V0cHV0SW5kZXg6IG51bWJlcik6IEJ1ZmZlciB7XG4gICAgcmV0dXJuICh0aGlzIGFzIGFueSkuX19DQUNIRS5fX1RYLm91dHNbb3V0cHV0SW5kZXhdLnNjcmlwdCBhcyBCdWZmZXI7XG4gIH1cblxuICBnZXROb25XaXRuZXNzUHJldmlvdXNUeGlkcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdHhJbnB1dHMgPSB0aGlzLnR4SW5wdXRzOyAvLyBUaGVzZSBhcmUgc29tZXdoYXQgY29zdGx5IHRvIGV4dHJhY3RcbiAgICBjb25zdCB0eGlkU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdGhpcy5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGhhdmUgd2l0bmVzcyBVVFhPIGZvciBhbGwgaW5wdXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2Vnd2l0KGlucHV0LndpdG5lc3NVdHhvLnNjcmlwdCwgaW5wdXQucmVkZWVtU2NyaXB0KSkge1xuICAgICAgICB0eGlkU2V0LmFkZChnZXRPdXRwdXRJZEZvcklucHV0KHR4SW5wdXRzW2luZGV4XSkudHhpZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIFsuLi50eGlkU2V0XTtcbiAgfVxuXG4gIGFkZE5vbldpdG5lc3NVdHhvcyh0eEJ1ZnM6IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4pOiB0aGlzIHtcbiAgICBjb25zdCB0eElucHV0cyA9IHRoaXMudHhJbnB1dHM7IC8vIFRoZXNlIGFyZSBzb21ld2hhdCBjb3N0bHkgdG8gZXh0cmFjdFxuICAgIHRoaXMuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIWlucHV0LndpdG5lc3NVdHhvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBoYXZlIHdpdG5lc3MgVVRYTyBmb3IgYWxsIGlucHV0cycpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1NlZ3dpdChpbnB1dC53aXRuZXNzVXR4by5zY3JpcHQsIGlucHV0LnJlZGVlbVNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgeyB0eGlkIH0gPSBnZXRPdXRwdXRJZEZvcklucHV0KHR4SW5wdXRzW2luZGV4XSk7XG4gICAgICAgIGlmICh0eEJ1ZnNbdHhpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGFsbCByZXF1aXJlZCBwcmV2aW91cyB0cmFuc2FjdGlvbnMgcHJvdmlkZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUlucHV0KGluZGV4LCB7IG5vbldpdG5lc3NVdHhvOiB0eEJ1ZnNbdHhpZF0gfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgZnJvbVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiwgcHJldk91dHB1dHM6IFR4T3V0cHV0PGJpZ2ludD5bXSk6IFV0eG9Qc2J0IHtcbiAgICBpZiAocHJldk91dHB1dHMubGVuZ3RoICE9PSB0cmFuc2FjdGlvbi5pbnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmFuc2FjdGlvbiBoYXMgJHt0cmFuc2FjdGlvbi5pbnMubGVuZ3RofSBpbnB1dHMsIGJ1dCAke3ByZXZPdXRwdXRzLmxlbmd0aH0gcHJldmlvdXMgb3V0cHV0cyBwcm92aWRlZGBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGNsb25lZFRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24uY2xvbmUoKTtcbiAgICBjb25zdCB1cGRhdGVzID0gdW5zaWduKGNsb25lZFRyYW5zYWN0aW9uLCBwcmV2T3V0cHV0cyk7XG5cbiAgICBjb25zdCBwc2J0QmFzZSA9IG5ldyBQc2J0QmFzZShuZXcgUHNidFRyYW5zYWN0aW9uKHsgdHg6IGNsb25lZFRyYW5zYWN0aW9uIH0pKTtcbiAgICBjbG9uZWRUcmFuc2FjdGlvbi5pbnMuZm9yRWFjaCgoKSA9PiBwc2J0QmFzZS5pbnB1dHMucHVzaCh7IHVua25vd25LZXlWYWxzOiBbXSB9KSk7XG4gICAgY2xvbmVkVHJhbnNhY3Rpb24ub3V0cy5mb3JFYWNoKCgpID0+IHBzYnRCYXNlLm91dHB1dHMucHVzaCh7IHVua25vd25LZXlWYWxzOiBbXSB9KSk7XG4gICAgY29uc3QgcHNidCA9IHRoaXMuY3JlYXRlUHNidCh7IG5ldHdvcms6IHRyYW5zYWN0aW9uLm5ldHdvcmsgfSwgcHNidEJhc2UpO1xuXG4gICAgdXBkYXRlcy5mb3JFYWNoKCh1cGRhdGUsIGluZGV4KSA9PiB7XG4gICAgICBwc2J0LnVwZGF0ZUlucHV0KGluZGV4LCB1cGRhdGUpO1xuICAgICAgcHNidC51cGRhdGVJbnB1dChpbmRleCwgeyB3aXRuZXNzVXR4bzogeyBzY3JpcHQ6IHByZXZPdXRwdXRzW2luZGV4XS5zY3JpcHQsIHZhbHVlOiBwcmV2T3V0cHV0c1tpbmRleF0udmFsdWUgfSB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwc2J0O1xuICB9XG5cbiAgZ2V0VW5zaWduZWRUeCgpOiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiB7XG4gICAgcmV0dXJuIHRoaXMudHguY2xvbmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgbmV3VHJhbnNhY3Rpb24obmV0d29yazogTmV0d29yayk6IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgICByZXR1cm4gbmV3IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+KG5ldHdvcmspO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0eCgpOiBUeCB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGEuZ2xvYmFsTWFwLnVuc2lnbmVkVHggYXMgUHNidFRyYW5zYWN0aW9uKS50eCBhcyBUeDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0ZvclNpZ25hdHVyZXMocHJvcE5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBpZiAoaW5wdXQudGFwU2NyaXB0U2lnPy5sZW5ndGggfHwgaW5wdXQudGFwS2V5U2lnIHx8IGlucHV0LnBhcnRpYWxTaWc/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtb2RpZnkgJHtwcm9wTmFtZSA/PyAndHJhbnNhY3Rpb24nfSAtIHNpZ25hdHVyZXMgZXhpc3QuYCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgYXQgaW5wdXRJbmRleCBpcyBhIHRhcHJvb3Qga2V5IHBhdGguXG4gICAqIENoZWNrcyBmb3IgcHJlc2VuY2Ugb2YgbWluaW11bSByZXF1aXJlZCBrZXkgcGF0aCBpbnB1dCBmaWVsZHMgYW5kIGFic2VuY2Ugb2YgYW55IHNjcmlwdCBwYXRoIG9ubHkgaW5wdXQgZmllbGRzLlxuICAgKi9cbiAgaXNUYXByb290S2V5UGF0aElucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICByZXR1cm4gKFxuICAgICAgISFpbnB1dC50YXBJbnRlcm5hbEtleSAmJlxuICAgICAgISFpbnB1dC50YXBNZXJrbGVSb290ICYmXG4gICAgICAhKFxuICAgICAgICBpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGggfHxcbiAgICAgICAgaW5wdXQudGFwU2NyaXB0U2lnPy5sZW5ndGggfHxcbiAgICAgICAgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uPy5zb21lKCh2KSA9PiB2LmxlYWZIYXNoZXMubGVuZ3RoKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgYXQgaW5wdXRJbmRleCBpcyBhIHRhcHJvb3Qgc2NyaXB0IHBhdGguXG4gICAqIENoZWNrcyBmb3IgcHJlc2VuY2Ugb2YgbWluaW11bSByZXF1aXJlZCBzY3JpcHQgcGF0aCBpbnB1dCBmaWVsZHMgYW5kIGFic2VuY2Ugb2YgYW55IGtleSBwYXRoIG9ubHkgaW5wdXQgZmllbGRzLlxuICAgKi9cbiAgaXNUYXByb290U2NyaXB0UGF0aElucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICByZXR1cm4gKFxuICAgICAgISFpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGggJiZcbiAgICAgICEoXG4gICAgICAgIHRoaXMuZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHtcbiAgICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZUyxcbiAgICAgICAgfSkubGVuZ3RoIHx8XG4gICAgICAgIHRoaXMuZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHtcbiAgICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gICAgICAgIH0pLmxlbmd0aCB8fFxuICAgICAgICB0aGlzLmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgICAgICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElBTF9TSUcsXG4gICAgICAgIH0pLmxlbmd0aFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgYXQgaW5wdXRJbmRleCBpcyBhIHRhcHJvb3RcbiAgICovXG4gIGlzVGFwcm9vdElucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBjb25zdCBpc1AyVFIgPSAoc2NyaXB0OiBCdWZmZXIpOiBib29sZWFuID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGdldFRhcHJvb3RPdXRwdXRLZXkoc2NyaXB0KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiAhIShcbiAgICAgIGlucHV0LnRhcEludGVybmFsS2V5IHx8XG4gICAgICBpbnB1dC50YXBNZXJrbGVSb290IHx8XG4gICAgICBpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGggfHxcbiAgICAgIGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoIHx8XG4gICAgICBpbnB1dC50YXBTY3JpcHRTaWc/Lmxlbmd0aCB8fFxuICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElDSVBBTlRfUFVCX0tFWVMsXG4gICAgICB9KS5sZW5ndGggfHxcbiAgICAgIHRoaXMuZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHtcbiAgICAgICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BVQl9OT05DRSxcbiAgICAgIH0pLmxlbmd0aCB8fFxuICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElBTF9TSUcsXG4gICAgICB9KS5sZW5ndGggfHxcbiAgICAgIChpbnB1dC53aXRuZXNzVXR4byAmJiBpc1AyVFIoaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0KSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc011bHRpc2lnVGFwcm9vdFNjcmlwdChzY3JpcHQ6IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBwYXJzZVB1YlNjcmlwdDJPZjMoc2NyaXB0LCAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3N0bHkgY29waWVkIGZyb20gYml0Y29pbmpzLWxpYi90c19zcmMvcHNidC50c1xuICAgKi9cbiAgZmluYWxpemVBbGxJbnB1dHMoKTogdGhpcyB7XG4gICAgY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCAwKTsgLy8gbWFraW5nIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmVcbiAgICB0aGlzLmRhdGEuaW5wdXRzLm1hcCgoaW5wdXQsIGlkeCkgPT4ge1xuICAgICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc011bHRpc2lnVGFwcm9vdFNjcmlwdChpbnB1dC50YXBMZWFmU2NyaXB0WzBdLnNjcmlwdClcbiAgICAgICAgICA/IHRoaXMuZmluYWxpemVUYXByb290SW5wdXQoaWR4KVxuICAgICAgICAgIDogdGhpcy5maW5hbGl6ZVRhcElucHV0V2l0aFNpbmdsZUxlYWZTY3JpcHRBbmRTaWduYXR1cmUoaWR4KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1RhcHJvb3RLZXlQYXRoSW5wdXQoaWR4KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZVRhcHJvb3RNdXNpZzJJbnB1dChpZHgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemVJbnB1dChpZHgpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZmluYWxpemVUYXByb290SW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogdGhpcyB7XG4gICAgY29uc3Qgc2FuaXRpemVTaWduYXR1cmUgPSAoc2lnOiBCdWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IHNpZ2hhc2hUeXBlID0gc2lnLmxlbmd0aCA9PT0gNjQgPyBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQgOiBzaWcucmVhZFVJbnQ4KHNpZy5sZW5ndGggLSAxKTtcbiAgICAgIGNvbnN0IGlucHV0U2lnaGFzaFR5cGUgPSBpbnB1dC5zaWdoYXNoVHlwZSA9PT0gdW5kZWZpbmVkID8gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUIDogaW5wdXQuc2lnaGFzaFR5cGU7XG4gICAgICBhc3NlcnQoc2lnaGFzaFR5cGUgPT09IGlucHV0U2lnaGFzaFR5cGUsICdzaWduYXR1cmUgc2lnaGFzaCBkb2VzIG5vdCBtYXRjaCBpbnB1dCBzaWdoYXNoIHR5cGUnKTtcbiAgICAgIC8vIFRPRE8gQlRDLTY2MyBUaGlzIHNob3VsZCBiZSBmaXhlZCBpbiBwbGF0Zm9ybS4gVGhpcyBpcyBqdXN0IGEgd29ya2Fyb3VuZCBmaXguXG4gICAgICByZXR1cm4gc2lnaGFzaFR5cGUgPT09IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCAmJiBzaWcubGVuZ3RoID09PSA2NSA/IHNpZy5zbGljZSgwLCA2NCkgOiBzaWc7XG4gICAgfTtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgLy8gd2l0bmVzcyA9IGNvbnRyb2wtYmxvY2sgc2NyaXB0IGZpcnN0LXNpZyBzZWNvbmQtc2lnXG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IG9uZSBsZWFmIHNjcmlwdCBzdXBwb3J0ZWQgZm9yIGZpbmFsaXppbmcnKTtcbiAgICB9XG4gICAgY29uc3QgeyBjb250cm9sQmxvY2ssIHNjcmlwdCB9ID0gaW5wdXQudGFwTGVhZlNjcmlwdFswXTtcbiAgICBjb25zdCB3aXRuZXNzOiBCdWZmZXJbXSA9IFtzY3JpcHQsIGNvbnRyb2xCbG9ja107XG4gICAgY29uc3QgW3B1YmtleTEsIHB1YmtleTJdID0gcGFyc2VQdWJTY3JpcHQyT2YzKHNjcmlwdCwgJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnKS5wdWJsaWNLZXlzO1xuICAgIGZvciAoY29uc3QgcGsgb2YgW3B1YmtleTEsIHB1YmtleTJdKSB7XG4gICAgICBjb25zdCBzaWcgPSBpbnB1dC50YXBTY3JpcHRTaWc/LmZpbmQoKHsgcHVia2V5IH0pID0+IGVxdWFsUHVibGljS2V5SWdub3JlWShwaywgcHVia2V5KSk7XG4gICAgICBpZiAoIXNpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHNpZ25hdHVyZXMgaW4gU2NyaXB0IFNpZy4nKTtcbiAgICAgIH1cbiAgICAgIHdpdG5lc3MudW5zaGlmdChzYW5pdGl6ZVNpZ25hdHVyZShzaWcuc2lnbmF0dXJlKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2l0bmVzc0xlbmd0aCA9IHdpdG5lc3MucmVkdWNlKChzLCBiKSA9PiBzICsgYi5sZW5ndGggKyB2YXJ1aW50LmVuY29kaW5nTGVuZ3RoKGIubGVuZ3RoKSwgMSk7XG5cbiAgICBjb25zdCBidWZmZXJXcml0ZXIgPSBCdWZmZXJXcml0ZXIud2l0aENhcGFjaXR5KHdpdG5lc3NMZW5ndGgpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVZlY3Rvcih3aXRuZXNzKTtcbiAgICBjb25zdCBmaW5hbFNjcmlwdFdpdG5lc3MgPSBidWZmZXJXcml0ZXIuZW5kKCk7XG5cbiAgICB0aGlzLmRhdGEudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyBmaW5hbFNjcmlwdFdpdG5lc3MgfSk7XG4gICAgdGhpcy5kYXRhLmNsZWFyRmluYWxpemVkSW5wdXQoaW5wdXRJbmRleCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5hbGl6ZXMgYSB0YXByb290IG11c2lnMiBpbnB1dCBieSBhZ2dyZWdhdGluZyBhbGwgcGFydGlhbCBzaWdzLlxuICAgKiBJTVBPUlRBTlQ6IEFsd2F5cyBjYWxsIHZhbGlkYXRlKiBmdW5jdGlvbiBiZWZvcmUgZmluYWxpemluZy5cbiAgICovXG4gIGZpbmFsaXplVGFwcm9vdE11c2lnMklucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBjb25zdCBwYXJ0aWFsU2lncyA9IHBhcnNlUHNidE11c2lnMlBhcnRpYWxTaWdzKGlucHV0KTtcbiAgICBpZiAocGFydGlhbFNpZ3M/Lmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG51bWJlciBvZiBwYXJ0aWFsIHNpZ25hdHVyZXMgJHtwYXJ0aWFsU2lncyA/IHBhcnRpYWxTaWdzLmxlbmd0aCA6IDB9IHRvIGZpbmFsaXplYCk7XG4gICAgfVxuICAgIGNvbnN0IHsgcGFydGlhbFNpZ3M6IHBTaWdzLCBzaWdIYXNoVHlwZSB9ID0gZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyhwYXJ0aWFsU2lncyk7XG4gICAgY29uc3QgeyBzZXNzaW9uS2V5IH0gPSB0aGlzLmdldE11c2lnMlNlc3Npb25LZXkoaW5wdXRJbmRleCwgc2lnSGFzaFR5cGUpO1xuXG4gICAgY29uc3QgYWdnU2lnID0gbXVzaWcyQWdncmVnYXRlU2lncyhcbiAgICAgIHBTaWdzLm1hcCgocFNpZykgPT4gcFNpZy5wYXJ0aWFsU2lnKSxcbiAgICAgIHNlc3Npb25LZXlcbiAgICApO1xuXG4gICAgY29uc3Qgc2lnID0gc2lnSGFzaFR5cGUgPT09IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCA/IGFnZ1NpZyA6IEJ1ZmZlci5jb25jYXQoW2FnZ1NpZywgQnVmZmVyLm9mKHNpZ0hhc2hUeXBlKV0pO1xuXG4gICAgLy8gc2luZ2xlIHNpZ25hdHVyZSB3aXRoIDY0LzY1IGJ5dGVzIHNpemUgaXMgc2NyaXB0IHdpdG5lc3MgZm9yIGtleSBwYXRoIHNwZW5kXG4gICAgY29uc3QgYnVmZmVyV3JpdGVyID0gQnVmZmVyV3JpdGVyLndpdGhDYXBhY2l0eSgxICsgdmFydWludC5lbmNvZGluZ0xlbmd0aChzaWcubGVuZ3RoKSArIHNpZy5sZW5ndGgpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVZlY3Rvcihbc2lnXSk7XG4gICAgY29uc3QgZmluYWxTY3JpcHRXaXRuZXNzID0gYnVmZmVyV3JpdGVyLmVuZCgpO1xuXG4gICAgdGhpcy5kYXRhLnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgZmluYWxTY3JpcHRXaXRuZXNzIH0pO1xuICAgIHRoaXMuZGF0YS5jbGVhckZpbmFsaXplZElucHV0KGlucHV0SW5kZXgpO1xuICAgIC8vIGRlbGV0aW5nIG9ubHkgQml0R28gcHJvcHJpZXRhcnkga2V5IHZhbHVlcy5cbiAgICB0aGlzLmRlbGV0ZVByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7IGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZpbmFsaXplVGFwSW5wdXRXaXRoU2luZ2xlTGVhZlNjcmlwdEFuZFNpZ25hdHVyZShpbnB1dEluZGV4OiBudW1iZXIpOiB0aGlzIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IG9uZSBsZWFmIHNjcmlwdCBzdXBwb3J0ZWQgZm9yIGZpbmFsaXppbmcnKTtcbiAgICB9XG4gICAgaWYgKGlucHV0LnRhcFNjcmlwdFNpZz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHNpZ25hdHVyZXMgaW4gU2NyaXB0IFNpZy4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvbnRyb2xCbG9jaywgc2NyaXB0IH0gPSBpbnB1dC50YXBMZWFmU2NyaXB0WzBdO1xuICAgIGNvbnN0IHdpdG5lc3M6IEJ1ZmZlcltdID0gW2lucHV0LnRhcFNjcmlwdFNpZ1swXS5zaWduYXR1cmUsIHNjcmlwdCwgY29udHJvbEJsb2NrXTtcbiAgICBjb25zdCB3aXRuZXNzTGVuZ3RoID0gd2l0bmVzcy5yZWR1Y2UoKHMsIGIpID0+IHMgKyBiLmxlbmd0aCArIHZhcnVpbnQuZW5jb2RpbmdMZW5ndGgoYi5sZW5ndGgpLCAxKTtcblxuICAgIGNvbnN0IGJ1ZmZlcldyaXRlciA9IEJ1ZmZlcldyaXRlci53aXRoQ2FwYWNpdHkod2l0bmVzc0xlbmd0aCk7XG4gICAgYnVmZmVyV3JpdGVyLndyaXRlVmVjdG9yKHdpdG5lc3MpO1xuICAgIGNvbnN0IGZpbmFsU2NyaXB0V2l0bmVzcyA9IGJ1ZmZlcldyaXRlci5lbmQoKTtcblxuICAgIHRoaXMuZGF0YS51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IGZpbmFsU2NyaXB0V2l0bmVzcyB9KTtcbiAgICB0aGlzLmRhdGEuY2xlYXJGaW5hbGl6ZWRJbnB1dChpbnB1dEluZGV4KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBjb3BpZWQgZnJvbSBiaXRjb2luanMtbGliL3RzX3NyYy9wc2J0LnRzXG4gICAqXG4gICAqIFVubGlrZSB0aGUgZnVuY3Rpb24gaXQgb3ZlcnJpZGVzLCB0aGlzIGRvZXMgbm90IHRha2UgYSB2YWxpZGF0b3IuIEluIEJpdEdvXG4gICAqIGNvbnRleHQsIHdlIGtub3cgaG93IHdlIHdhbnQgdG8gdmFsaWRhdGUgc28gd2UganVzdCBoYXJkIGNvZGUgdGhlIHJpZ2h0XG4gICAqIHZhbGlkYXRvci5cbiAgICovXG4gIHZhbGlkYXRlU2lnbmF0dXJlc09mQWxsSW5wdXRzKCk6IGJvb2xlYW4ge1xuICAgIGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgMCk7IC8vIG1ha2luZyBzdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb25lXG4gICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZGF0YS5pbnB1dHMubWFwKChpbnB1dCwgaWR4KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGlkeCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdHMucmVkdWNlKChmaW5hbCwgcmVzKSA9PiByZXMgJiYgZmluYWwsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRydWUgaWZmIGFueSBtYXRjaGluZyB2YWxpZCBzaWduYXR1cmUgaXMgZm91bmQgZm9yIGEgZGVyaXZlZCBwdWIga2V5IGZyb20gZ2l2ZW4gSEQga2V5IHBhaXIuXG4gICAqL1xuICB2YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0SEQoaW5wdXRJbmRleDogbnVtYmVyLCBoZEtleVBhaXI6IEJJUDMySW50ZXJmYWNlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGNvbnN0IHB1YktleSA9IFV0eG9Qc2J0LmRlcml2ZUtleVBhaXJGb3JJbnB1dChoZEtleVBhaXIsIGlucHV0KTtcbiAgICBpZiAoIXB1YktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW4gbm90IGRlcml2ZSBmcm9tIEhEIGtleSBwYWlyJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlU2lnbmF0dXJlc09mSW5wdXRDb21tb24oaW5wdXRJbmRleCwgcHViS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmZiBhbnkgdmFsaWQgc2lnbmF0dXJlKHMpIGFyZSBmb3VuZCBmcm9tIGJpcDMyIGRhdGEgb2YgUFNCVCBvciBmb3IgZ2l2ZW4gcHViIGtleS5cbiAgICovXG4gIHZhbGlkYXRlU2lnbmF0dXJlc09mSW5wdXRDb21tb24oaW5wdXRJbmRleDogbnVtYmVyLCBwdWJrZXk/OiBCdWZmZXIpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuaXNUYXByb290U2NyaXB0UGF0aElucHV0KGlucHV0SW5kZXgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVGFwcm9vdFNpZ25hdHVyZXNPZklucHV0KGlucHV0SW5kZXgsIHB1YmtleSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUYXByb290S2V5UGF0aElucHV0KGlucHV0SW5kZXgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVGFwcm9vdE11c2lnMlNpZ25hdHVyZXNPZklucHV0KGlucHV0SW5kZXgsIHB1YmtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0KGlucHV0SW5kZXgsIChwLCBtLCBzKSA9PiBlY2NMaWIudmVyaWZ5KG0sIHAsIHMsIHRydWUpLCBwdWJrZXkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gTm90IGFuIGVsZWdhbnQgc29sdXRpb24uIE1pZ2h0IG5lZWQgdXBzdHJlYW0gY2hhbmdlcyBsaWtlIGN1c3RvbSBlcnJvciB0eXBlcy5cbiAgICAgIGlmIChlcnIubWVzc2FnZSA9PT0gJ05vIHNpZ25hdHVyZXMgZm9yIHRoaXMgcHVia2V5Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRNdXNpZzJTZXNzaW9uS2V5KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBzaWdIYXNoVHlwZTogbnVtYmVyXG4gICk6IHtcbiAgICBwYXJ0aWNpcGFudHM6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHM7XG4gICAgbm9uY2VzOiBUdXBsZTxQc2J0TXVzaWcyUHViTm9uY2U+O1xuICAgIGhhc2g6IEJ1ZmZlcjtcbiAgICBzZXNzaW9uS2V5OiBTZXNzaW9uS2V5O1xuICB9IHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgaWYgKCFpbnB1dC50YXBJbnRlcm5hbEtleSB8fCAhaW5wdXQudGFwTWVya2xlUm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdib3RoIHRhcEludGVybmFsS2V5IGFuZCB0YXBNZXJrbGVSb290IGFyZSByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IHRoaXMuZ2V0TXVzaWcyUGFydGljaXBhbnRzKGlucHV0SW5kZXgsIGlucHV0LnRhcEludGVybmFsS2V5LCBpbnB1dC50YXBNZXJrbGVSb290KTtcbiAgICBjb25zdCBub25jZXMgPSB0aGlzLmdldE11c2lnMk5vbmNlcyhpbnB1dEluZGV4LCBwYXJ0aWNpcGFudHMpO1xuXG4gICAgY29uc3QgeyBoYXNoIH0gPSB0aGlzLmdldFRhcHJvb3RIYXNoRm9yU2lnKGlucHV0SW5kZXgsIFtzaWdIYXNoVHlwZV0pO1xuXG4gICAgY29uc3Qgc2Vzc2lvbktleSA9IGNyZWF0ZU11c2lnMlNpZ25pbmdTZXNzaW9uKHtcbiAgICAgIHB1Yk5vbmNlczogW25vbmNlc1swXS5wdWJOb25jZSwgbm9uY2VzWzFdLnB1Yk5vbmNlXSxcbiAgICAgIHB1YktleXM6IHBhcnRpY2lwYW50cy5wYXJ0aWNpcGFudFB1YktleXMsXG4gICAgICB0eEhhc2g6IGhhc2gsXG4gICAgICBpbnRlcm5hbFB1YktleTogaW5wdXQudGFwSW50ZXJuYWxLZXksXG4gICAgICB0YXBUcmVlUm9vdDogaW5wdXQudGFwTWVya2xlUm9vdCxcbiAgICB9KTtcbiAgICByZXR1cm4geyBwYXJ0aWNpcGFudHMsIG5vbmNlcywgaGFzaCwgc2Vzc2lvbktleSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRydWUgZm9yIGZvbGxvd2luZyBjYXNlcy5cbiAgICogSWYgdmFsaWQgbXVzaWcyIHBhcnRpYWwgc2lnbmF0dXJlcyBleGlzdHMgZm9yIGJvdGggMiBrZXlzLCBpdCB3aWxsIGFsc28gdmVyaWZ5IGFnZ3JlZ2F0ZWQgc2lnXG4gICAqIGZvciBhZ2dyZWdhdGVkIHR3ZWFrZWQga2V5IChvdXRwdXQga2V5KSwgb3RoZXJ3aXNlIG9ubHkgdmVyaWZpZXMgcGFydGlhbCBzaWcuXG4gICAqIElmIHB1YmtleSBpcyBwYXNzZWQgaW4gaW5wdXQsIGl0IHdpbGwgY2hlY2sgc2lnIG9ubHkgZm9yIHRoYXQgcHVia2V5LFxuICAgKiBpZiBubyBzaWcgZXhpdHMgZm9yIHN1Y2gga2V5LCB0aHJvd3MgZXJyb3IuXG4gICAqIEZvciBpbnZhbGlkIHN0YXRlIG9mIGlucHV0IGRhdGEsIGl0IHdpbGwgdGhyb3cgZXJyb3JzLlxuICAgKi9cbiAgdmFsaWRhdGVUYXByb290TXVzaWcyU2lnbmF0dXJlc09mSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyLCBwdWJrZXk/OiBCdWZmZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgY29uc3QgcGFydGlhbFNpZ3MgPSBwYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyhpbnB1dCk7XG4gICAgaWYgKCFwYXJ0aWFsU2lncykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzaWduYXR1cmVzIHRvIHZhbGlkYXRlYCk7XG4gICAgfVxuXG4gICAgbGV0IG15UGFydGlhbFNpZ3MgPSBwYXJ0aWFsU2lncztcbiAgICBpZiAocHVia2V5KSB7XG4gICAgICBteVBhcnRpYWxTaWdzID0gcGFydGlhbFNpZ3MuZmlsdGVyKChrdikgPT4gZXF1YWxQdWJsaWNLZXlJZ25vcmVZKGt2LnBhcnRpY2lwYW50UHViS2V5LCBwdWJrZXkpKTtcbiAgICAgIGlmIChteVBhcnRpYWxTaWdzPy5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2lnbmF0dXJlcyBmb3IgdGhpcyBwdWJrZXknKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7IHBhcnRpYWxTaWdzOiBteVNpZ3MsIHNpZ0hhc2hUeXBlIH0gPSBnZXRTaWdIYXNoVHlwZUZyb21TaWdzKG15UGFydGlhbFNpZ3MpO1xuICAgIGNvbnN0IHsgcGFydGljaXBhbnRzLCBub25jZXMsIGhhc2gsIHNlc3Npb25LZXkgfSA9IHRoaXMuZ2V0TXVzaWcyU2Vzc2lvbktleShpbnB1dEluZGV4LCBzaWdIYXNoVHlwZSk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gbXlTaWdzLm1hcCgobXlTaWcpID0+IHtcbiAgICAgIGNvbnN0IG15Tm9uY2UgPSBub25jZXMuZmluZCgoa3YpID0+IGVxdWFsUHVibGljS2V5SWdub3JlWShrdi5wYXJ0aWNpcGFudFB1YktleSwgbXlTaWcucGFydGljaXBhbnRQdWJLZXkpKTtcbiAgICAgIGlmICghbXlOb25jZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIG5vIHB1YiBub25jZSBmb3IgcHVia2V5Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbXVzaWcyUGFydGlhbFNpZ1ZlcmlmeShteVNpZy5wYXJ0aWFsU2lnLCBteVNpZy5wYXJ0aWNpcGFudFB1YktleSwgbXlOb25jZS5wdWJOb25jZSwgc2Vzc2lvbktleSk7XG4gICAgfSk7XG5cbiAgICAvLyBGb3IgdmFsaWQgc2luZ2xlIHNpZyBvciAxIG9yIDIgZmFpbHVyZSBzaWdzLCBubyBuZWVkIHRvIHZhbGlkYXRlIGFnZ3JlZ2F0ZWQgc2lnLiBTbyBza2lwLlxuICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHMuZXZlcnkoKHJlcykgPT4gcmVzKTtcbiAgICBpZiAoIXJlc3VsdCB8fCBteVNpZ3MubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBhZ2dTaWcgPSBtdXNpZzJBZ2dyZWdhdGVTaWdzKFxuICAgICAgbXlTaWdzLm1hcCgobXlTaWcpID0+IG15U2lnLnBhcnRpYWxTaWcpLFxuICAgICAgc2Vzc2lvbktleVxuICAgICk7XG5cbiAgICByZXR1cm4gZWNjTGliLnZlcmlmeVNjaG5vcnIoaGFzaCwgcGFydGljaXBhbnRzLnRhcE91dHB1dEtleSwgYWdnU2lnKTtcbiAgfVxuXG4gIHZhbGlkYXRlVGFwcm9vdFNpZ25hdHVyZXNPZklucHV0KGlucHV0SW5kZXg6IG51bWJlciwgcHVia2V5PzogQnVmZmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuICAgIGNvbnN0IHRhcFNpZ3MgPSAoaW5wdXQgfHwge30pLnRhcFNjcmlwdFNpZztcbiAgICBpZiAoIWlucHV0IHx8ICF0YXBTaWdzIHx8IHRhcFNpZ3MubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzaWduYXR1cmVzIHRvIHZhbGlkYXRlJyk7XG4gICAgfVxuICAgIGxldCBteVNpZ3M7XG4gICAgaWYgKHB1YmtleSkge1xuICAgICAgbXlTaWdzID0gdGFwU2lncy5maWx0ZXIoKHNpZykgPT4gZXF1YWxQdWJsaWNLZXlJZ25vcmVZKHNpZy5wdWJrZXksIHB1YmtleSkpO1xuICAgICAgaWYgKG15U2lncy5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2lnbmF0dXJlcyBmb3IgdGhpcyBwdWJrZXknKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbXlTaWdzID0gdGFwU2lncztcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0czogYm9vbGVhbltdID0gW107XG5cbiAgICBhc3NlcnQoaW5wdXQudGFwTGVhZlNjcmlwdD8ubGVuZ3RoID09PSAxLCBgc2luZ2xlIHRhcExlYWZTY3JpcHQgaXMgZXhwZWN0ZWQuIEdvdCAke2lucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aH1gKTtcbiAgICBjb25zdCBbdGFwTGVhZlNjcmlwdF0gPSBpbnB1dC50YXBMZWFmU2NyaXB0O1xuICAgIGNvbnN0IHB1YktleXMgPSB0aGlzLmlzTXVsdGlzaWdUYXByb290U2NyaXB0KHRhcExlYWZTY3JpcHQuc2NyaXB0KVxuICAgICAgPyBwYXJzZVB1YlNjcmlwdDJPZjModGFwTGVhZlNjcmlwdC5zY3JpcHQsICd0YXByb290U2NyaXB0UGF0aFNwZW5kJykucHVibGljS2V5c1xuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGNvbnN0IHBTaWcgb2YgbXlTaWdzKSB7XG4gICAgICBjb25zdCB7IHNpZ25hdHVyZSwgbGVhZkhhc2gsIHB1YmtleSB9ID0gcFNpZztcbiAgICAgIGlmIChwdWJLZXlzKSB7XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICBwdWJLZXlzLmZpbmQoKHBrKSA9PiBwdWJrZXkuZXF1YWxzKHBrKSksXG4gICAgICAgICAgJ3B1YmxpYyBrZXkgbm90IGZvdW5kIGluIHRhcCBsZWFmIHNjcmlwdCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxldCBzaWdIYXNoVHlwZTogbnVtYmVyO1xuICAgICAgbGV0IHNpZzogQnVmZmVyO1xuICAgICAgaWYgKHNpZ25hdHVyZS5sZW5ndGggPT09IDY1KSB7XG4gICAgICAgIHNpZ0hhc2hUeXBlID0gc2lnbmF0dXJlWzY0XTtcbiAgICAgICAgc2lnID0gc2lnbmF0dXJlLnNsaWNlKDAsIDY0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpZ0hhc2hUeXBlID0gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUO1xuICAgICAgICBzaWcgPSBzaWduYXR1cmU7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGhhc2ggfSA9IHRoaXMuZ2V0VGFwcm9vdEhhc2hGb3JTaWcoaW5wdXRJbmRleCwgW3NpZ0hhc2hUeXBlXSwgbGVhZkhhc2gpO1xuICAgICAgcmVzdWx0cy5wdXNoKGVjY0xpYi52ZXJpZnlTY2hub3JyKGhhc2gsIHB1YmtleSwgc2lnKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzLmV2ZXJ5KChyZXMpID0+IHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGlucHV0SW5kZXhcbiAgICogQHBhcmFtIHJvb3ROb2RlcyBvcHRpb25hbCBpbnB1dCByb290IGJpcDMyIG5vZGVzIHRvIHZlcmlmeSB3aXRoLiBJZiBpdCBpcyBub3QgcHJvdmlkZWQsIGdsb2JhbFhwdWIgd2lsbCBiZSB1c2VkLlxuICAgKiBAcmV0dXJuIGFycmF5IG9mIGJvb2xlYW4gdmFsdWVzLiBUcnVlIHdoZW4gY29ycmVzcG9uZGluZyBpbmRleCBpbiBgcHVibGljS2V5c2AgaGFzIHNpZ25lZCB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIElmIG5vIHNpZ25hdHVyZSBpbiB0aGUgdHggb3Igbm8gcHVibGljIGtleSBtYXRjaGluZyBzaWduYXR1cmUsIHRoZSB2YWxpZGF0aW9uIGlzIGNvbnNpZGVyZWQgYXMgZmFsc2UuXG4gICAqIElmIHJvb3ROb2RlcyBhcmUgbm90IGV4cGxpY2l0bHkgcGFzc2VkIGluLCB0aGUgcmV0dXJuIGFycmF5IHdpbGwgYmUgdW5vcmRlcmVkLlxuICAgKiBVc2UgZ2V0U29ydGVkUm9vdE5vZGVzKCkgaW5zdGVhZCBpZiBvcmRlcmluZyBpcyBpbXBvcnRhbnQuXG4gICAqL1xuICBnZXRTaWduYXR1cmVWYWxpZGF0aW9uQXJyYXkoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHsgcm9vdE5vZGVzIH06IHsgcm9vdE5vZGVzOiBUcmlwbGU8QklQMzJJbnRlcmZhY2U+IHwgdW5kZWZpbmVkIH1cbiAgKTogVHJpcGxlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXJvb3ROb2RlcyAmJiAoIXRoaXMuZGF0YS5nbG9iYWxNYXAuZ2xvYmFsWHB1Yj8ubGVuZ3RoIHx8ICFpc1RyaXBsZSh0aGlzLmRhdGEuZ2xvYmFsTWFwLmdsb2JhbFhwdWIpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IHNpZ25hdHVyZSB2YWxpZGF0aW9uIGFycmF5IHdpdGhvdXQgMyBnbG9iYWwgeHB1YnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXAzMnMgPSByb290Tm9kZXNcbiAgICAgID8gcm9vdE5vZGVzXG4gICAgICA6IHRoaXMuZGF0YS5nbG9iYWxNYXAuZ2xvYmFsWHB1Yj8ubWFwKCh4cHViKSA9PlxuICAgICAgICAgIEJJUDMyRmFjdG9yeShlY2NMaWIpLmZyb21CYXNlNTgoYnM1OGNoZWNrLmVuY29kZSh4cHViLmV4dGVuZGVkUHVia2V5KSlcbiAgICAgICAgKTtcblxuICAgIGlmICghYmlwMzJzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VpdGhlciBnbG9iYWxNYXAgb3Igcm9vdE5vZGVzIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGlmICghZ2V0UHNidElucHV0U2lnbmF0dXJlQ291bnQoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gW2ZhbHNlLCBmYWxzZSwgZmFsc2VdO1xuICAgIH1cblxuICAgIHJldHVybiBiaXAzMnMubWFwKChiaXAzMikgPT4ge1xuICAgICAgY29uc3QgcHViS2V5ID0gVXR4b1BzYnQuZGVyaXZlS2V5UGFpckZvcklucHV0KGJpcDMyLCBpbnB1dCk7XG4gICAgICBpZiAoIXB1YktleSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGlucHV0SW5kZXgsIHB1YktleSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gTm90IGFuIGVsZWdhbnQgc29sdXRpb24uIE1pZ2h0IG5lZWQgdXBzdHJlYW0gY2hhbmdlcyBsaWtlIGN1c3RvbSBlcnJvciB0eXBlcy5cbiAgICAgICAgaWYgKGVyci5tZXNzYWdlID09PSAnTm8gc2lnbmF0dXJlcyBmb3IgdGhpcyBwdWJrZXknKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9KSBhcyBUcmlwbGU8Ym9vbGVhbj47XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IGNvcGllZCBmcm9tIGJpdGNvaW5qcy1saWIvdHNfc3JjL3BzYnQudHNcbiAgICovXG4gIHNpZ25BbGxJbnB1dHNIRChcbiAgICBoZEtleVBhaXI6IEhEVGFwcm9vdFNpZ25lciB8IEhEVGFwcm9vdE11c2lnMlNpZ25lcixcbiAgICBwYXJhbXM/OiBudW1iZXJbXSB8IFBhcnRpYWw8U2lnbmF0dXJlUGFyYW1zPlxuICApOiB0aGlzIHtcbiAgICBpZiAoIWhkS2V5UGFpciB8fCAhaGRLZXlQYWlyLnB1YmxpY0tleSB8fCAhaGRLZXlQYWlyLmZpbmdlcnByaW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgSERTaWduZXIgdG8gc2lnbiBpbnB1dCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHNpZ2hhc2hUeXBlcywgZGV0ZXJtaW5pc3RpYyB9ID0gdG9TaWduYXR1cmVQYXJhbXModGhpcy5uZXR3b3JrLCBwYXJhbXMpO1xuXG4gICAgY29uc3QgcmVzdWx0czogYm9vbGVhbltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGEuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnNpZ25JbnB1dEhEKGksIGhkS2V5UGFpciwgeyBzaWdoYXNoVHlwZXMsIGRldGVybWluaXN0aWMgfSk7XG4gICAgICAgIHJlc3VsdHMucHVzaCh0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXN1bHRzLnB1c2goZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVzdWx0cy5ldmVyeSgodikgPT4gIXYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGlucHV0cyB3ZXJlIHNpZ25lZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3N0bHkgY29waWVkIGZyb20gYml0Y29pbmpzLWxpYi90c19zcmMvcHNidC50czpzaWduSW5wdXRIRFxuICAgKi9cbiAgc2lnblRhcHJvb3RJbnB1dEhEKFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBoZEtleVBhaXI6IEhEVGFwcm9vdFNpZ25lciB8IEhEVGFwcm9vdE11c2lnMlNpZ25lcixcbiAgICB7IHNpZ2hhc2hUeXBlcyA9IFtUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQsIFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMXSwgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlIH0gPSB7fVxuICApOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMuaXNUYXByb290SW5wdXQoaW5wdXRJbmRleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGEgdGFwcm9vdCBpbnB1dCcpO1xuICAgIH1cbiAgICBpZiAoIWhkS2V5UGFpciB8fCAhaGRLZXlQYWlyLnB1YmxpY0tleSB8fCAhaGRLZXlQYWlyLmZpbmdlcnByaW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgSERTaWduZXIgdG8gc2lnbiBpbnB1dCcpO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgaWYgKCFpbnB1dC50YXBCaXAzMkRlcml2YXRpb24gfHwgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIHRhcEJpcDMyRGVyaXZhdGlvbiB0byBzaWduIFRhcHJvb3Qgd2l0aCBIRCcpO1xuICAgIH1cbiAgICBjb25zdCBteURlcml2YXRpb25zID0gaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uXG4gICAgICAubWFwKChiaXBEdikgPT4ge1xuICAgICAgICBpZiAoYmlwRHYubWFzdGVyRmluZ2VycHJpbnQuZXF1YWxzKGhkS2V5UGFpci5maW5nZXJwcmludCkpIHtcbiAgICAgICAgICByZXR1cm4gYmlwRHY7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKCh2KSA9PiAhIXYpIGFzIFRhcEJpcDMyRGVyaXZhdGlvbltdO1xuICAgIGlmIChteURlcml2YXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIG9uZSB0YXBCaXAzMkRlcml2YXRpb24gbWFzdGVyRmluZ2VycHJpbnQgdG8gbWF0Y2ggdGhlIEhEU2lnbmVyIGZpbmdlcnByaW50Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGVyaXZlZE5vZGUoYmlwRHY6IFRhcEJpcDMyRGVyaXZhdGlvbik6IEhEVGFwcm9vdE11c2lnMlNpZ25lciB8IEhEVGFwcm9vdFNpZ25lciB7XG4gICAgICBjb25zdCBub2RlID0gaGRLZXlQYWlyLmRlcml2ZVBhdGgoYmlwRHYucGF0aCk7XG4gICAgICBpZiAoIWVxdWFsUHVibGljS2V5SWdub3JlWShiaXBEdi5wdWJrZXksIG5vZGUucHVibGljS2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1YmtleSBkaWQgbm90IG1hdGNoIHRhcEJpcDMyRGVyaXZhdGlvbicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgY29uc3Qgc2lnbmVyczogVGFwcm9vdFNpZ25lcltdID0gbXlEZXJpdmF0aW9ucy5tYXAoKGJpcER2KSA9PiB7XG4gICAgICAgIGNvbnN0IHNpZ25lciA9IGdldERlcml2ZWROb2RlKGJpcER2KTtcbiAgICAgICAgaWYgKCEoJ3NpZ25TY2hub3JyJyBpbiBzaWduZXIpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduU2Nobm9yciBmdW5jdGlvbiBpcyByZXF1aXJlZCB0byBzaWduIHAydHInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzaWduZXIsIGxlYWZIYXNoZXM6IGJpcER2LmxlYWZIYXNoZXMgfTtcbiAgICAgIH0pO1xuICAgICAgc2lnbmVycy5mb3JFYWNoKCh7IHNpZ25lciwgbGVhZkhhc2hlcyB9KSA9PiB0aGlzLnNpZ25UYXByb290SW5wdXQoaW5wdXRJbmRleCwgc2lnbmVyLCBsZWFmSGFzaGVzLCBzaWdoYXNoVHlwZXMpKTtcbiAgICB9IGVsc2UgaWYgKGlucHV0LnRhcEludGVybmFsS2V5Py5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNpZ25lcnM6IE11c2lnMlNpZ25lcltdID0gbXlEZXJpdmF0aW9ucy5tYXAoKGJpcER2KSA9PiB7XG4gICAgICAgIGNvbnN0IHNpZ25lciA9IGdldERlcml2ZWROb2RlKGJpcER2KTtcbiAgICAgICAgaWYgKCEoJ3ByaXZhdGVLZXknIGluIHNpZ25lcikgfHwgIXNpZ25lci5wcml2YXRlS2V5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcml2YXRlS2V5IGlzIHJlcXVpcmVkIHRvIHNpZ24gcDJ0ciBtdXNpZzInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2lnbmVyO1xuICAgICAgfSk7XG4gICAgICBzaWduZXJzLmZvckVhY2goKHNpZ25lcikgPT4gdGhpcy5zaWduVGFwcm9vdE11c2lnMklucHV0KGlucHV0SW5kZXgsIHNpZ25lciwgeyBzaWdoYXNoVHlwZXMsIGRldGVybWluaXN0aWMgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNpZ25JbnB1dChpbnB1dEluZGV4OiBudW1iZXIsIGtleVBhaXI6IFNpZ25lciwgc2lnaGFzaFR5cGVzPzogbnVtYmVyW10pOiB0aGlzIHtcbiAgICBjb25zdCB7IHNpZ2hhc2hUeXBlczogc2lnaGFzaEZvck5ldHdvcmsgfSA9IHRvU2lnbmF0dXJlUGFyYW1zKHRoaXMubmV0d29yaywgc2lnaGFzaFR5cGVzKTtcbiAgICByZXR1cm4gc3VwZXIuc2lnbklucHV0KGlucHV0SW5kZXgsIGtleVBhaXIsIHNpZ2hhc2hGb3JOZXR3b3JrKTtcbiAgfVxuXG4gIHNpZ25JbnB1dEhEKFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBoZEtleVBhaXI6IEhEVGFwcm9vdFNpZ25lciB8IEhEVGFwcm9vdE11c2lnMlNpZ25lcixcbiAgICBwYXJhbXM/OiBudW1iZXJbXSB8IFBhcnRpYWw8U2lnbmF0dXJlUGFyYW1zPlxuICApOiB0aGlzIHtcbiAgICBjb25zdCB7IHNpZ2hhc2hUeXBlcywgZGV0ZXJtaW5pc3RpYyB9ID0gdG9TaWduYXR1cmVQYXJhbXModGhpcy5uZXR3b3JrLCBwYXJhbXMpO1xuICAgIGlmICh0aGlzLmlzVGFwcm9vdElucHV0KGlucHV0SW5kZXgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduVGFwcm9vdElucHV0SEQoaW5wdXRJbmRleCwgaGRLZXlQYWlyLCB7IHNpZ2hhc2hUeXBlcywgZGV0ZXJtaW5pc3RpYyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN1cGVyLnNpZ25JbnB1dEhEKGlucHV0SW5kZXgsIGhkS2V5UGFpciwgc2lnaGFzaFR5cGVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE11c2lnMlBhcnRpY2lwYW50cyhpbnB1dEluZGV4OiBudW1iZXIsIHRhcEludGVybmFsS2V5OiBCdWZmZXIsIHRhcE1lcmtsZVJvb3Q6IEJ1ZmZlcikge1xuICAgIGNvbnN0IHBhcnRpY2lwYW50c0tleVZhbERhdGEgPSBwYXJzZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHModGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XSk7XG4gICAgaWYgKCFwYXJ0aWNpcGFudHNLZXlWYWxEYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIDAgbWF0Y2hpbmcgcGFydGljaXBhbnQga2V5IHZhbHVlIGluc3RlYWQgb2YgMWApO1xuICAgIH1cbiAgICBhc3NlcnRQc2J0TXVzaWcyUGFydGljaXBhbnRzKHBhcnRpY2lwYW50c0tleVZhbERhdGEsIHRhcEludGVybmFsS2V5LCB0YXBNZXJrbGVSb290KTtcbiAgICByZXR1cm4gcGFydGljaXBhbnRzS2V5VmFsRGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TXVzaWcyTm9uY2VzKGlucHV0SW5kZXg6IG51bWJlciwgcGFydGljaXBhbnRzS2V5VmFsRGF0YTogUHNidE11c2lnMlBhcnRpY2lwYW50cykge1xuICAgIGNvbnN0IG5vbmNlc0tleVZhbHNEYXRhID0gcGFyc2VQc2J0TXVzaWcyTm9uY2VzKHRoaXMuZGF0YS5pbnB1dHNbaW5wdXRJbmRleF0pO1xuICAgIGlmICghbm9uY2VzS2V5VmFsc0RhdGEgfHwgIWlzVHVwbGUobm9uY2VzS2V5VmFsc0RhdGEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGb3VuZCAke25vbmNlc0tleVZhbHNEYXRhPy5sZW5ndGggPyBub25jZXNLZXlWYWxzRGF0YS5sZW5ndGggOiAwfSBtYXRjaGluZyBub25jZSBrZXkgdmFsdWUgaW5zdGVhZCBvZiAyYFxuICAgICAgKTtcbiAgICB9XG4gICAgYXNzZXJ0UHNidE11c2lnMk5vbmNlcyhub25jZXNLZXlWYWxzRGF0YSwgcGFydGljaXBhbnRzS2V5VmFsRGF0YSk7XG4gICAgcmV0dXJuIG5vbmNlc0tleVZhbHNEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHAydHIgbXVzaWcyIGtleSBwYXRoIGlucHV0IHdpdGggMiBhZ2dyZWdhdGVkIGtleXMuXG4gICAqXG4gICAqIE5vdGU6IE9ubHkgY2FuIHNpZ24gZGV0ZXJtaW5pc3RpY2FsbHkgYXMgdGhlIGNvc2lnbmVyXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4XG4gICAqIEBwYXJhbSBzaWduZXIgLSBYWSBwdWJsaWMga2V5IGFuZCBwcml2YXRlIGtleSBhcmUgcmVxdWlyZWRcbiAgICogQHBhcmFtIHNpZ2hhc2hUeXBlc1xuICAgKiBAcGFyYW0gZGV0ZXJtaW5pc3RpYyBJZiB0cnVlLCBzaWduIHRoZSBtdXNpZyBpbnB1dCBkZXRlcm1pbmlzdGljYWxseVxuICAgKi9cbiAgc2lnblRhcHJvb3RNdXNpZzJJbnB1dChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgc2lnbmVyOiBNdXNpZzJTaWduZXIsXG4gICAgeyBzaWdoYXNoVHlwZXMgPSBbVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxULCBUcmFuc2FjdGlvbi5TSUdIQVNIX0FMTF0sIGRldGVybWluaXN0aWMgPSBmYWxzZSB9ID0ge31cbiAgKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLmlzVGFwcm9vdEtleVBhdGhJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgYSB0YXByb290IG11c2lnMiBpbnB1dCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcblxuICAgIGlmICghaW5wdXQudGFwSW50ZXJuYWxLZXkgfHwgIWlucHV0LnRhcE1lcmtsZVJvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBpbnB1dCBkYXRhJyk7XG4gICAgfVxuXG4gICAgLy8gUmV0cmlldmUgYW5kIGNoZWNrIHRoYXQgd2UgaGF2ZSB0d28gcGFydGljaXBhbnQgbm9uY2VzXG4gICAgY29uc3QgcGFydGljaXBhbnRzID0gdGhpcy5nZXRNdXNpZzJQYXJ0aWNpcGFudHMoaW5wdXRJbmRleCwgaW5wdXQudGFwSW50ZXJuYWxLZXksIGlucHV0LnRhcE1lcmtsZVJvb3QpO1xuICAgIGNvbnN0IHsgdGFwT3V0cHV0S2V5LCBwYXJ0aWNpcGFudFB1YktleXMgfSA9IHBhcnRpY2lwYW50cztcbiAgICBjb25zdCBzaWduZXJQdWJLZXkgPSBwYXJ0aWNpcGFudFB1YktleXMuZmluZCgocHViS2V5KSA9PiBlcXVhbFB1YmxpY0tleUlnbm9yZVkocHViS2V5LCBzaWduZXIucHVibGljS2V5KSk7XG4gICAgaWYgKCFzaWduZXJQdWJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVyIHB1YiBrZXkgc2hvdWxkIG1hdGNoIG9uZSBvZiBwYXJ0aWNpcGFudCBwdWIga2V5cycpO1xuICAgIH1cblxuICAgIGNvbnN0IG5vbmNlcyA9IHRoaXMuZ2V0TXVzaWcyTm9uY2VzKGlucHV0SW5kZXgsIHBhcnRpY2lwYW50cyk7XG4gICAgY29uc3QgeyBoYXNoLCBzaWdoYXNoVHlwZSB9ID0gdGhpcy5nZXRUYXByb290SGFzaEZvclNpZyhpbnB1dEluZGV4LCBzaWdoYXNoVHlwZXMpO1xuXG4gICAgbGV0IHBhcnRpYWxTaWc6IEJ1ZmZlcjtcbiAgICBpZiAoZGV0ZXJtaW5pc3RpYykge1xuICAgICAgaWYgKCFlcXVhbFB1YmxpY0tleUlnbm9yZVkoc2lnbmVyUHViS2V5LCBwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG9ubHkgYWRkIGEgZGV0ZXJtaW5pc3RpYyBzaWduYXR1cmUgb24gdGhlIGNvc2lnbmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0U2lnbmVyTm9uY2UgPSBub25jZXMuZmluZCgobikgPT4gZXF1YWxQdWJsaWNLZXlJZ25vcmVZKG4ucGFydGljaXBhbnRQdWJLZXksIHBhcnRpY2lwYW50UHViS2V5c1swXSkpO1xuICAgICAgaWYgKCFmaXJzdFNpZ25lck5vbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGZpbmQgdGhlIHVzZXIgbm9uY2UnKTtcbiAgICAgIH1cblxuICAgICAgcGFydGlhbFNpZyA9IG11c2lnMkRldGVybWluaXN0aWNTaWduKHtcbiAgICAgICAgcHJpdmF0ZUtleTogc2lnbmVyLnByaXZhdGVLZXksXG4gICAgICAgIG90aGVyTm9uY2U6IGZpcnN0U2lnbmVyTm9uY2UucHViTm9uY2UsXG4gICAgICAgIHB1YmxpY0tleXM6IHBhcnRpY2lwYW50UHViS2V5cyxcbiAgICAgICAgaW50ZXJuYWxQdWJLZXk6IGlucHV0LnRhcEludGVybmFsS2V5LFxuICAgICAgICB0YXBUcmVlUm9vdDogaW5wdXQudGFwTWVya2xlUm9vdCxcbiAgICAgICAgaGFzaCxcbiAgICAgIH0pLnNpZztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2Vzc2lvbktleSA9IGNyZWF0ZU11c2lnMlNpZ25pbmdTZXNzaW9uKHtcbiAgICAgICAgcHViTm9uY2VzOiBbbm9uY2VzWzBdLnB1Yk5vbmNlLCBub25jZXNbMV0ucHViTm9uY2VdLFxuICAgICAgICBwdWJLZXlzOiBwYXJ0aWNpcGFudFB1YktleXMsXG4gICAgICAgIHR4SGFzaDogaGFzaCxcbiAgICAgICAgaW50ZXJuYWxQdWJLZXk6IGlucHV0LnRhcEludGVybmFsS2V5LFxuICAgICAgICB0YXBUcmVlUm9vdDogaW5wdXQudGFwTWVya2xlUm9vdCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzaWduZXJOb25jZSA9IG5vbmNlcy5maW5kKChrdikgPT4gZXF1YWxQdWJsaWNLZXlJZ25vcmVZKGt2LnBhcnRpY2lwYW50UHViS2V5LCBzaWduZXJQdWJLZXkpKTtcbiAgICAgIGlmICghc2lnbmVyTm9uY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdWJOb25jZSBpcyBtaXNzaW5nLiByZXRyeSBzaWduaW5nIHByb2Nlc3MnKTtcbiAgICAgIH1cbiAgICAgIHBhcnRpYWxTaWcgPSBtdXNpZzJQYXJ0aWFsU2lnbihzaWduZXIucHJpdmF0ZUtleSwgc2lnbmVyTm9uY2UucHViTm9uY2UsIHNlc3Npb25LZXksIHRoaXMubm9uY2VTdG9yZSk7XG4gICAgfVxuXG4gICAgaWYgKHNpZ2hhc2hUeXBlICE9PSBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQpIHtcbiAgICAgIHBhcnRpYWxTaWcgPSBCdWZmZXIuY29uY2F0KFtwYXJ0aWFsU2lnLCBCdWZmZXIub2Yoc2lnaGFzaFR5cGUpXSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnID0gZW5jb2RlUHNidE11c2lnMlBhcnRpYWxTaWcoe1xuICAgICAgcGFydGljaXBhbnRQdWJLZXk6IHNpZ25lclB1YktleSxcbiAgICAgIHRhcE91dHB1dEtleSxcbiAgICAgIHBhcnRpYWxTaWc6IHBhcnRpYWxTaWcsXG4gICAgfSk7XG4gICAgdGhpcy5hZGRQcm9wcmlldGFyeUtleVZhbFRvSW5wdXQoaW5wdXRJbmRleCwgc2lnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNpZ25UYXByb290SW5wdXQoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHNpZ25lcjogU2Nobm9yclNpZ25lcixcbiAgICBsZWFmSGFzaGVzOiBCdWZmZXJbXSxcbiAgICBzaWdoYXNoVHlwZXM6IG51bWJlcltdID0gW1RyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCwgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTExdXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICAvLyBGaWd1cmUgb3V0IGlmIHRoaXMgaXMgc2NyaXB0IHBhdGggb3Igbm90LCBpZiBub3QsIHR3ZWFrIHRoZSBwcml2YXRlIGtleVxuICAgIGlmICghaW5wdXQudGFwTGVhZlNjcmlwdD8ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcExlYWZTY3JpcHQgaXMgcmVxdWlyZWQgZm9yIHAydHIgc2NyaXB0IHBhdGgnKTtcbiAgICB9XG4gICAgY29uc3QgcHVia2V5ID0gdG9YT25seVB1YmxpY0tleShzaWduZXIucHVibGljS2V5KTtcbiAgICBpZiAoaW5wdXQudGFwTGVhZlNjcmlwdC5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT25seSBvbmUgbGVhZiBzY3JpcHQgc3VwcG9ydGVkIGZvciBzaWduaW5nJyk7XG4gICAgfVxuICAgIGNvbnN0IFt0YXBMZWFmU2NyaXB0XSA9IGlucHV0LnRhcExlYWZTY3JpcHQ7XG5cbiAgICBpZiAodGhpcy5pc011bHRpc2lnVGFwcm9vdFNjcmlwdCh0YXBMZWFmU2NyaXB0LnNjcmlwdCkpIHtcbiAgICAgIGNvbnN0IHB1YktleXMgPSBwYXJzZVB1YlNjcmlwdDJPZjModGFwTGVhZlNjcmlwdC5zY3JpcHQsICd0YXByb290U2NyaXB0UGF0aFNwZW5kJykucHVibGljS2V5cztcbiAgICAgIGFzc2VydChcbiAgICAgICAgcHViS2V5cy5maW5kKChwaykgPT4gcHVia2V5LmVxdWFscyhwaykpLFxuICAgICAgICAncHVibGljIGtleSBub3QgZm91bmQgaW4gdGFwIGxlYWYgc2NyaXB0J1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWRDb250cm9sQmxvY2sgPSB0YXByb290LnBhcnNlQ29udHJvbEJsb2NrKGVjY0xpYiwgdGFwTGVhZlNjcmlwdC5jb250cm9sQmxvY2spO1xuICAgIGNvbnN0IHsgbGVhZlZlcnNpb24gfSA9IHBhcnNlZENvbnRyb2xCbG9jaztcbiAgICBpZiAobGVhZlZlcnNpb24gIT09IHRhcExlYWZTY3JpcHQubGVhZlZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFwIHNjcmlwdCBsZWFmIHZlcnNpb24gbWlzbWF0Y2ggd2l0aCBjb250cm9sIGJsb2NrJyk7XG4gICAgfVxuICAgIGNvbnN0IGxlYWZIYXNoID0gdGFwcm9vdC5nZXRUYXBsZWFmSGFzaChlY2NMaWIsIHBhcnNlZENvbnRyb2xCbG9jaywgdGFwTGVhZlNjcmlwdC5zY3JpcHQpO1xuICAgIGlmICghbGVhZkhhc2hlcy5maW5kKChsKSA9PiBsLmVxdWFscyhsZWFmSGFzaCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZ25lciBjYW5ub3Qgc2lnbiBmb3IgbGVhZiBoYXNoICR7bGVhZkhhc2gudG9TdHJpbmcoJ2hleCcpfWApO1xuICAgIH1cbiAgICBjb25zdCB7IGhhc2gsIHNpZ2hhc2hUeXBlIH0gPSB0aGlzLmdldFRhcHJvb3RIYXNoRm9yU2lnKGlucHV0SW5kZXgsIHNpZ2hhc2hUeXBlcywgbGVhZkhhc2gpO1xuICAgIGxldCBzaWduYXR1cmUgPSBzaWduZXIuc2lnblNjaG5vcnIoaGFzaCk7XG4gICAgaWYgKHNpZ2hhc2hUeXBlICE9PSBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQpIHtcbiAgICAgIHNpZ25hdHVyZSA9IEJ1ZmZlci5jb25jYXQoW3NpZ25hdHVyZSwgQnVmZmVyLm9mKHNpZ2hhc2hUeXBlKV0pO1xuICAgIH1cbiAgICB0aGlzLmRhdGEudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgdGFwU2NyaXB0U2lnOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwdWJrZXksXG4gICAgICAgICAgc2lnbmF0dXJlLFxuICAgICAgICAgIGxlYWZIYXNoLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFwcm9vdE91dHB1dFNjcmlwdChpbnB1dEluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRhcHJvb3QuY3JlYXRlVGFwcm9vdE91dHB1dFNjcmlwdCh7XG4gICAgICAgIGNvbnRyb2xCbG9jazogaW5wdXQudGFwTGVhZlNjcmlwdFswXS5jb250cm9sQmxvY2ssXG4gICAgICAgIGxlYWZTY3JpcHQ6IGlucHV0LnRhcExlYWZTY3JpcHRbMF0uc2NyaXB0LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpbnB1dC50YXBJbnRlcm5hbEtleSAmJiBpbnB1dC50YXBNZXJrbGVSb290KSB7XG4gICAgICByZXR1cm4gdGFwcm9vdC5jcmVhdGVUYXByb290T3V0cHV0U2NyaXB0KHtcbiAgICAgICAgaW50ZXJuYWxQdWJLZXk6IGlucHV0LnRhcEludGVybmFsS2V5LFxuICAgICAgICB0YXB0cmVlUm9vdDogaW5wdXQudGFwTWVya2xlUm9vdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIHRhcHJvb3QgaW5wdXQnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFwcm9vdEhhc2hGb3JTaWcoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHNpZ2hhc2hUeXBlcz86IG51bWJlcltdLFxuICAgIGxlYWZIYXNoPzogQnVmZmVyXG4gICk6IHtcbiAgICBoYXNoOiBCdWZmZXI7XG4gICAgc2lnaGFzaFR5cGU6IG51bWJlcjtcbiAgfSB7XG4gICAgaWYgKCF0aGlzLmlzVGFwcm9vdElucHV0KGlucHV0SW5kZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIHRhcHJvb3QgaW5wdXQnKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnaGFzaFR5cGUgPSB0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdLnNpZ2hhc2hUeXBlIHx8IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVDtcbiAgICBpZiAoc2lnaGFzaFR5cGVzICYmIHNpZ2hhc2hUeXBlcy5pbmRleE9mKHNpZ2hhc2hUeXBlKSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNpZ2hhc2ggdHlwZSBpcyBub3QgYWxsb3dlZC4gUmV0cnkgdGhlIHNpZ24gbWV0aG9kIHBhc3NpbmcgdGhlIGAgK1xuICAgICAgICAgIGBzaWdoYXNoVHlwZXMgYXJyYXkgb2Ygd2hpdGVsaXN0ZWQgdHlwZXMuIFNpZ2hhc2ggdHlwZTogJHtzaWdoYXNoVHlwZX1gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB0eElucHV0cyA9IHRoaXMudHhJbnB1dHM7IC8vIFRoZXNlIGFyZSBzb21ld2hhdCBjb3N0bHkgdG8gZXh0cmFjdFxuICAgIGNvbnN0IHByZXZvdXRTY3JpcHRzOiBCdWZmZXJbXSA9IFtdO1xuICAgIGNvbnN0IHByZXZvdXRWYWx1ZXM6IGJpZ2ludFtdID0gW107XG5cbiAgICB0aGlzLmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpKSA9PiB7XG4gICAgICBsZXQgcHJldm91dDtcbiAgICAgIGlmIChpbnB1dC5ub25XaXRuZXNzVXR4bykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNvdWxkIGJlIGNvc3RseSwgZWl0aGVyIGNhY2hlIGl0IGhlcmUsIG9yIGZpbmQgYSB3YXkgdG8gc2hhcmUgd2l0aCBzdXBlclxuICAgICAgICBjb25zdCBub25XaXRuZXNzVXR4b1R4ID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFV0eG9Qc2J0KS50cmFuc2FjdGlvbkZyb21CdWZmZXIoXG4gICAgICAgICAgaW5wdXQubm9uV2l0bmVzc1V0eG8sXG4gICAgICAgICAgdGhpcy50eC5uZXR3b3JrXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcHJldm91dEhhc2ggPSB0eElucHV0c1tpXS5oYXNoO1xuICAgICAgICBjb25zdCB1dHhvSGFzaCA9IG5vbldpdG5lc3NVdHhvVHguZ2V0SGFzaCgpO1xuXG4gICAgICAgIC8vIElmIGEgbm9uLXdpdG5lc3MgVVRYTyBpcyBwcm92aWRlZCwgaXRzIGhhc2ggbXVzdCBtYXRjaCB0aGUgaGFzaCBzcGVjaWZpZWQgaW4gdGhlIHByZXZvdXRcbiAgICAgICAgaWYgKCFwcmV2b3V0SGFzaC5lcXVhbHModXR4b0hhc2gpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb24td2l0bmVzcyBVVFhPIGhhc2ggZm9yIGlucHV0ICMke2l9IGRvZXNuJ3QgbWF0Y2ggdGhlIGhhc2ggc3BlY2lmaWVkIGluIHRoZSBwcmV2b3V0YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2b3V0SW5kZXggPSB0eElucHV0c1tpXS5pbmRleDtcbiAgICAgICAgcHJldm91dCA9IG5vbldpdG5lc3NVdHhvVHgub3V0c1twcmV2b3V0SW5kZXhdO1xuICAgICAgfSBlbHNlIGlmIChpbnB1dC53aXRuZXNzVXR4bykge1xuICAgICAgICBwcmV2b3V0ID0gaW5wdXQud2l0bmVzc1V0eG87XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgYSBVdHhvIGlucHV0IGl0ZW0gZm9yIHNpZ25pbmcnKTtcbiAgICAgIH1cbiAgICAgIHByZXZvdXRTY3JpcHRzLnB1c2gocHJldm91dC5zY3JpcHQpO1xuICAgICAgcHJldm91dFZhbHVlcy5wdXNoKHByZXZvdXQudmFsdWUpO1xuICAgIH0pO1xuICAgIGNvbnN0IG91dHB1dFNjcmlwdCA9IHRoaXMuZ2V0VGFwcm9vdE91dHB1dFNjcmlwdChpbnB1dEluZGV4KTtcbiAgICBpZiAoIW91dHB1dFNjcmlwdC5lcXVhbHMocHJldm91dFNjcmlwdHNbaW5wdXRJbmRleF0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdpdG5lc3Mgc2NyaXB0IGZvciBpbnB1dCAjJHtpbnB1dEluZGV4fSBkb2Vzbid0IG1hdGNoIHRoZSBzY3JpcHRQdWJLZXkgaW4gdGhlIHByZXZvdXRgKTtcbiAgICB9XG4gICAgY29uc3QgaGFzaCA9IHRoaXMudHguaGFzaEZvcldpdG5lc3NWMShpbnB1dEluZGV4LCBwcmV2b3V0U2NyaXB0cywgcHJldm91dFZhbHVlcywgc2lnaGFzaFR5cGUsIGxlYWZIYXNoKTtcbiAgICByZXR1cm4geyBoYXNoLCBzaWdoYXNoVHlwZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIHBhaXIgdG8gUFNCVCBpbnB1dC5cbiAgICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gICAqL1xuICBhZGRQcm9wcmlldGFyeUtleVZhbFRvSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyLCBrZXlWYWx1ZURhdGE6IFByb3ByaWV0YXJ5S2V5VmFsdWUpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRVbmtub3duS2V5VmFsVG9JbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICBrZXk6IGVuY29kZVByb3ByaWV0YXJ5S2V5KGtleVZhbHVlRGF0YS5rZXkpLFxuICAgICAgdmFsdWU6IGtleVZhbHVlRGF0YS52YWx1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG9yIHVwZGF0ZXMgKGlmIGV4aXN0cykgcHJvcHJpZXRhcnkga2V5IHZhbHVlIHBhaXIgdG8gUFNCVCBpbnB1dC5cbiAgICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gICAqL1xuICBhZGRPclVwZGF0ZVByb3ByaWV0YXJ5S2V5VmFsVG9JbnB1dChpbnB1dEluZGV4OiBudW1iZXIsIGtleVZhbHVlRGF0YTogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBjb25zdCBrZXkgPSBlbmNvZGVQcm9wcmlldGFyeUtleShrZXlWYWx1ZURhdGEua2V5KTtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBrZXlWYWx1ZURhdGE7XG4gICAgaWYgKGlucHV0LnVua25vd25LZXlWYWxzPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVrdkluZGV4ID0gaW5wdXQudW5rbm93bktleVZhbHMuZmluZEluZGV4KCh1a3YpID0+IHVrdi5rZXkuZXF1YWxzKGtleSkpO1xuICAgICAgaWYgKHVrdkluZGV4ID4gLTEpIHtcbiAgICAgICAgaW5wdXQudW5rbm93bktleVZhbHNbdWt2SW5kZXhdID0geyBrZXksIHZhbHVlIH07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFkZFVua25vd25LZXlWYWxUb0lucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIHNlYXJjaCBhbnkgZGF0YSBmcm9tIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSBhZ2FpbnN0IGtleWRhdGEuXG4gICAqIERlZmF1bHQgaWRlbnRpZmllckVuY29kaW5nIGlzIHV0Zi04IGZvciBpZGVudGlmaWVyLlxuICAgKi9cbiAgZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXg6IG51bWJlciwga2V5U2VhcmNoPzogUHJvcHJpZXRhcnlLZXlTZWFyY2gpOiBQcm9wcmlldGFyeUtleVZhbHVlW10ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICByZXR1cm4gZ2V0UHNidElucHV0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0LCBrZXlTZWFyY2gpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIGRlbGV0ZSBhbnkgZGF0YSBmcm9tIHByb3ByaWV0YXJ5IGtleSB2YWx1ZS5cbiAgICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gICAqL1xuICBkZWxldGVQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleDogbnVtYmVyLCBrZXlzVG9EZWxldGU/OiBQcm9wcmlldGFyeUtleVNlYXJjaCk6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWlucHV0LnVua25vd25LZXlWYWxzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoa2V5c1RvRGVsZXRlICYmIGtleXNUb0RlbGV0ZS5zdWJ0eXBlID09PSB1bmRlZmluZWQgJiYgQnVmZmVyLmlzQnVmZmVyKGtleXNUb0RlbGV0ZS5rZXlkYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByb3ByaWV0YXJ5IGtleSBzZWFyY2ggZmlsdGVyIGNvbWJpbmF0aW9uLiBzdWJ0eXBlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlucHV0LnVua25vd25LZXlWYWxzID0gaW5wdXQudW5rbm93bktleVZhbHMuZmlsdGVyKChrZXlWYWx1ZSwgaSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZGVjb2RlUHJvcHJpZXRhcnlLZXkoa2V5VmFsdWUua2V5KTtcbiAgICAgIHJldHVybiAhKFxuICAgICAgICBrZXlzVG9EZWxldGUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAoa2V5c1RvRGVsZXRlLmlkZW50aWZpZXIgPT09IGtleS5pZGVudGlmaWVyICYmXG4gICAgICAgICAgKGtleXNUb0RlbGV0ZS5zdWJ0eXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChrZXlzVG9EZWxldGUuc3VidHlwZSA9PT0ga2V5LnN1YnR5cGUgJiZcbiAgICAgICAgICAgICAgKCFCdWZmZXIuaXNCdWZmZXIoa2V5c1RvRGVsZXRlLmtleWRhdGEpIHx8IGtleXNUb0RlbGV0ZS5rZXlkYXRhLmVxdWFscyhrZXkua2V5ZGF0YSkpKSkpXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNdXNpZzJOb25jZUZvcklucHV0KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBrZXlQYWlyOiBCSVAzMkludGVyZmFjZSxcbiAgICBrZXlUeXBlOiAncm9vdCcgfCAnZGVyaXZlZCcsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiBQc2J0TXVzaWcyUHViTm9uY2Uge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcbiAgICBpZiAoIWlucHV0LnRhcEludGVybmFsS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcEludGVybmFsS2V5IGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBub25jZScpO1xuICAgIH1cbiAgICBpZiAoIWlucHV0LnRhcE1lcmtsZVJvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGFwTWVya2xlUm9vdCBpcyByZXF1aXJlZCB0byBjcmVhdGUgbm9uY2UnKTtcbiAgICB9XG4gICAgY29uc3QgZ2V0RGVyaXZlZEtleVBhaXIgPSAoKTogQklQMzJJbnRlcmZhY2UgPT4ge1xuICAgICAgaWYgKCFpbnB1dC50YXBCaXAzMkRlcml2YXRpb24/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcEJpcDMyRGVyaXZhdGlvbiBpcyByZXF1aXJlZCB0byBjcmVhdGUgbm9uY2UnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlcml2ZWQgPSBVdHhvUHNidC5kZXJpdmVLZXlQYWlyKGtleVBhaXIsIGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbiwgeyBpZ25vcmVZOiB0cnVlIH0pO1xuICAgICAgaWYgKCFkZXJpdmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gYmlwMzJEZXJpdmF0aW9uIG1hc3RlckZpbmdlcnByaW50IG1hdGNoZWQgdGhlIEhEIGtleVBhaXIgZmluZ2VycHJpbnQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZXJpdmVkO1xuICAgIH07XG4gICAgY29uc3QgZGVyaXZlZEtleVBhaXIgPSBrZXlUeXBlID09PSAncm9vdCcgPyBnZXREZXJpdmVkS2V5UGFpcigpIDoga2V5UGFpcjtcbiAgICBpZiAoIWRlcml2ZWRLZXlQYWlyLnByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJpdmF0ZUtleSBpcyByZXF1aXJlZCB0byBjcmVhdGUgbm9uY2UnKTtcbiAgICB9XG4gICAgY29uc3QgcGFydGljaXBhbnRzID0gcGFyc2VQc2J0TXVzaWcyUGFydGljaXBhbnRzKGlucHV0KTtcbiAgICBpZiAoIXBhcnRpY2lwYW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCAwIG1hdGNoaW5nIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDFgKTtcbiAgICB9XG4gICAgYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudHMsIGlucHV0LnRhcEludGVybmFsS2V5LCBpbnB1dC50YXBNZXJrbGVSb290KTtcbiAgICBjb25zdCB7IHRhcE91dHB1dEtleSwgcGFydGljaXBhbnRQdWJLZXlzIH0gPSBwYXJ0aWNpcGFudHM7XG5cbiAgICBjb25zdCBwYXJ0aWNpcGFudFB1YktleSA9IHBhcnRpY2lwYW50UHViS2V5cy5maW5kKChwdWJLZXkpID0+XG4gICAgICBlcXVhbFB1YmxpY0tleUlnbm9yZVkocHViS2V5LCBkZXJpdmVkS2V5UGFpci5wdWJsaWNLZXkpXG4gICAgKTtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihwYXJ0aWNpcGFudFB1YktleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFydGljaXBhbnQgcGxhaW4gcHViIGtleSBzaG91bGQgbWF0Y2ggb25lIGJpcDMyRGVyaXZhdGlvbiBwbGFpbiBwdWIga2V5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBoYXNoIH0gPSB0aGlzLmdldFRhcHJvb3RIYXNoRm9yU2lnKGlucHV0SW5kZXgpO1xuXG4gICAgbGV0IHB1Yk5vbmNlOiBCdWZmZXI7XG4gICAgaWYgKHBhcmFtcy5kZXRlcm1pbmlzdGljKSB7XG4gICAgICBpZiAocGFyYW1zLnNlc3Npb25JZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgZXh0cmEgZW50cm9weSB3aGVuIGdlbmVyYXRpbmcgYSBkZXRlcm1pbmlzdGljIG5vbmNlJyk7XG4gICAgICB9XG4gICAgICAvLyBUaGVyZSBtdXN0IGJlIG9ubHkgMiBwYXJ0aWNpcGFudCBwdWJLZXlzIGlmIGl0IGdvdCB0byB0aGlzIHBvaW50XG4gICAgICBpZiAoIWVxdWFsUHVibGljS2V5SWdub3JlWShwYXJ0aWNpcGFudFB1YktleSwgcGFydGljaXBhbnRQdWJLZXlzWzFdKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgdGhlIGNvc2lnbmVyJ3Mgbm9uY2UgY2FuIGJlIHNldCBkZXRlcm1pbmlzdGljYWxseWApO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9uY2VzID0gcGFyc2VQc2J0TXVzaWcyTm9uY2VzKGlucHV0KTtcbiAgICAgIGlmICghbm9uY2VzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gbm9uY2VzIGZvdW5kIG9uIGlucHV0ICMke2lucHV0SW5kZXh9YCk7XG4gICAgICB9XG4gICAgICBpZiAobm9uY2VzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaGF2ZSBtb3JlIHRoYW4gMiBub25jZXNgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpcnN0U2lnbmVyTm9uY2UgPSBub25jZXMuZmluZCgoa3YpID0+IGVxdWFsUHVibGljS2V5SWdub3JlWShrdi5wYXJ0aWNpcGFudFB1YktleSwgcGFydGljaXBhbnRQdWJLZXlzWzBdKSk7XG4gICAgICBpZiAoIWZpcnN0U2lnbmVyTm9uY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZXIgbm9uY2UgbXVzdCBiZSBzZXQgaWYgY29zaWduZXIgbm9uY2UgaXMgdG8gYmUgZGVyaXZlZCBkZXRlcm1pbmlzdGljYWxseScpO1xuICAgICAgfVxuXG4gICAgICBwdWJOb25jZSA9IGNyZWF0ZU11c2lnMkRldGVybWluaXN0aWNOb25jZSh7XG4gICAgICAgIHByaXZhdGVLZXk6IGRlcml2ZWRLZXlQYWlyLnByaXZhdGVLZXksXG4gICAgICAgIG90aGVyTm9uY2U6IGZpcnN0U2lnbmVyTm9uY2UucHViTm9uY2UsXG4gICAgICAgIHB1YmxpY0tleXM6IHBhcnRpY2lwYW50UHViS2V5cyxcbiAgICAgICAgaW50ZXJuYWxQdWJLZXk6IGlucHV0LnRhcEludGVybmFsS2V5LFxuICAgICAgICB0YXBUcmVlUm9vdDogaW5wdXQudGFwTWVya2xlUm9vdCxcbiAgICAgICAgaGFzaCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwdWJOb25jZSA9IEJ1ZmZlci5mcm9tKFxuICAgICAgICB0aGlzLm5vbmNlU3RvcmUuY3JlYXRlTXVzaWcyTm9uY2UoXG4gICAgICAgICAgZGVyaXZlZEtleVBhaXIucHJpdmF0ZUtleSxcbiAgICAgICAgICBwYXJ0aWNpcGFudFB1YktleSxcbiAgICAgICAgICB0YXBPdXRwdXRLZXksXG4gICAgICAgICAgaGFzaCxcbiAgICAgICAgICBwYXJhbXMuc2Vzc2lvbklkXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdGFwT3V0cHV0S2V5LCBwYXJ0aWNpcGFudFB1YktleSwgcHViTm9uY2UgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TXVzaWcyTm9uY2VzSW5uZXIoXG4gICAga2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAga2V5VHlwZTogJ3Jvb3QnIHwgJ2Rlcml2ZWQnLFxuICAgIGlucHV0SW5kZXg/OiBudW1iZXIsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiB0aGlzIHtcbiAgICBpZiAoa2V5UGFpci5pc05ldXRlcmVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJpdmF0ZSBrZXkgaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgbm9uY2UnKTtcbiAgICB9XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihwYXJhbXMuc2Vzc2lvbklkKSAmJiBwYXJhbXMuc2Vzc2lvbklkLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZXNzaW9uSWQgc2l6ZSAke3BhcmFtcy5zZXNzaW9uSWQubGVuZ3RofWApO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0SW5kZXhlcyA9IGlucHV0SW5kZXggPT09IHVuZGVmaW5lZCA/IFsuLi5BcnJheSh0aGlzLmlucHV0Q291bnQpLmtleXMoKV0gOiBbaW5wdXRJbmRleF07XG4gICAgaW5wdXRJbmRleGVzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNUYXByb290S2V5UGF0aElucHV0KGluZGV4KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBub25jZSA9IHRoaXMuY3JlYXRlTXVzaWcyTm9uY2VGb3JJbnB1dChpbmRleCwga2V5UGFpciwga2V5VHlwZSwgcGFyYW1zKTtcbiAgICAgIHRoaXMuYWRkT3JVcGRhdGVQcm9wcmlldGFyeUtleVZhbFRvSW5wdXQoaW5kZXgsIGVuY29kZVBzYnRNdXNpZzJQdWJOb25jZShub25jZSkpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbmQgc2V0cyBNdVNpZzIgbm9uY2UgdG8gdGFwcm9vdCBrZXkgcGF0aCBpbnB1dCBhdCBpbnB1dEluZGV4LlxuICAgKiBJZiBpbnB1dCBpcyBub3QgYSB0YXByb290IGtleSBwYXRoLCBubyBhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4IGlucHV0IGluZGV4XG4gICAqIEBwYXJhbSBrZXlQYWlyIGRlcml2ZWQga2V5IHBhaXJcbiAgICogQHBhcmFtIHNlc3Npb25JZCBPcHRpb25hbCBleHRyYSBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqIEBwYXJhbSBkZXRlcm1pbmlzdGljIElmIHRydWUsIHNldCB0aGUgY29zaWduZXIgbm9uY2UgZGV0ZXJtaW5pc3RpY2FsbHlcbiAgICovXG4gIHNldElucHV0TXVzaWcyTm9uY2UoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIGRlcml2ZWRLZXlQYWlyOiBCSVAzMkludGVyZmFjZSxcbiAgICBwYXJhbXM6IHsgc2Vzc2lvbklkPzogQnVmZmVyOyBkZXRlcm1pbmlzdGljPzogYm9vbGVhbiB9ID0geyBkZXRlcm1pbmlzdGljOiBmYWxzZSB9XG4gICk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLnNldE11c2lnMk5vbmNlc0lubmVyKGRlcml2ZWRLZXlQYWlyLCAnZGVyaXZlZCcsIGlucHV0SW5kZXgsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFuZCBzZXRzIE11U2lnMiBub25jZSB0byB0YXByb290IGtleSBwYXRoIGlucHV0IGF0IGlucHV0SW5kZXguXG4gICAqIElmIGlucHV0IGlzIG5vdCBhIHRhcHJvb3Qga2V5IHBhdGgsIG5vIGFjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0SW5kZXggaW5wdXQgaW5kZXhcbiAgICogQHBhcmFtIGtleVBhaXIgSEQgcm9vdCBrZXkgcGFpclxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIE9wdGlvbmFsIGV4dHJhIGVudHJvcHkuIElmIHByb3ZpZGVkIGl0IG11c3QgZWl0aGVyIGJlIGEgY291bnRlciB1bmlxdWUgdG8gdGhpcyBzZWNyZXQga2V5LFxuICAgKiAoY29udmVydGVkIHRvIGFuIGFycmF5IG9mIDMyIGJ5dGVzKSwgb3IgMzIgdW5pZm9ybWx5IHJhbmRvbSBieXRlcy5cbiAgICogQHBhcmFtIGRldGVybWluaXN0aWMgSWYgdHJ1ZSwgc2V0IHRoZSBjb3NpZ25lciBub25jZSBkZXRlcm1pbmlzdGljYWxseVxuICAgKi9cbiAgc2V0SW5wdXRNdXNpZzJOb25jZUhEKFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBrZXlQYWlyOiBCSVAzMkludGVyZmFjZSxcbiAgICBwYXJhbXM6IHsgc2Vzc2lvbklkPzogQnVmZmVyOyBkZXRlcm1pbmlzdGljPzogYm9vbGVhbiB9ID0geyBkZXRlcm1pbmlzdGljOiBmYWxzZSB9XG4gICk6IHRoaXMge1xuICAgIGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgcmV0dXJuIHRoaXMuc2V0TXVzaWcyTm9uY2VzSW5uZXIoa2V5UGFpciwgJ3Jvb3QnLCBpbnB1dEluZGV4LCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbmQgc2V0cyBNdVNpZzIgbm9uY2UgdG8gYWxsIHRhcHJvb3Qga2V5IHBhdGggaW5wdXRzLiBPdGhlciBpbnB1dHMgd2lsbCBiZSBza2lwcGVkLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRJbmRleCBpbnB1dCBpbmRleFxuICAgKiBAcGFyYW0ga2V5UGFpciBkZXJpdmVkIGtleSBwYWlyXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgT3B0aW9uYWwgZXh0cmEgZW50cm9weS4gSWYgcHJvdmlkZWQgaXQgbXVzdCBlaXRoZXIgYmUgYSBjb3VudGVyIHVuaXF1ZSB0byB0aGlzIHNlY3JldCBrZXksXG4gICAqIChjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb2YgMzIgYnl0ZXMpLCBvciAzMiB1bmlmb3JtbHkgcmFuZG9tIGJ5dGVzLlxuICAgKi9cbiAgc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2UoXG4gICAga2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5zZXRNdXNpZzJOb25jZXNJbm5lcihrZXlQYWlyLCAnZGVyaXZlZCcsIHVuZGVmaW5lZCwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW5kIHNldHMgTXVTaWcyIG5vbmNlIHRvIGFsbCB0YXByb290IGtleSBwYXRoIGlucHV0cy4gT3RoZXIgaW5wdXRzIHdpbGwgYmUgc2tpcHBlZC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0SW5kZXggaW5wdXQgaW5kZXhcbiAgICogQHBhcmFtIGtleVBhaXIgSEQgcm9vdCBrZXkgcGFpclxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIE9wdGlvbmFsIGV4dHJhIGVudHJvcHkuIElmIHByb3ZpZGVkIGl0IG11c3QgZWl0aGVyIGJlIGEgY291bnRlciB1bmlxdWUgdG8gdGhpcyBzZWNyZXQga2V5LFxuICAgKiAoY29udmVydGVkIHRvIGFuIGFycmF5IG9mIDMyIGJ5dGVzKSwgb3IgMzIgdW5pZm9ybWx5IHJhbmRvbSBieXRlcy5cbiAgICovXG4gIHNldEFsbElucHV0c011c2lnMk5vbmNlSEQoXG4gICAga2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5zZXRNdXNpZzJOb25jZXNJbm5lcihrZXlQYWlyLCAncm9vdCcsIHVuZGVmaW5lZCwgcGFyYW1zKTtcbiAgfVxuXG4gIGNsb25lKCk6IHRoaXMge1xuICAgIHJldHVybiBVdHhvUHNidC5mcm9tQnVmZmVyKHRoaXMudG9CdWZmZXIoKSwgeyBuZXR3b3JrOiB0aGlzLm5ldHdvcmsgfSkgYXMgdGhpcztcbiAgfVxuXG4gIGV4dHJhY3RUcmFuc2FjdGlvbihkaXNhYmxlRmVlQ2hlY2sgPSB0cnVlKTogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICAgIGNvbnN0IHR4ID0gc3VwZXIuZXh0cmFjdFRyYW5zYWN0aW9uKGRpc2FibGVGZWVDaGVjayk7XG4gICAgaWYgKHR4IGluc3RhbmNlb2YgVXR4b1RyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm4gdHg7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignZXh0cmFjdFRyYW5zYWN0aW9uIGRpZCBub3QgcmV0dXJuIGluc3RhY2Ugb2YgVXR4b1RyYW5zYWN0aW9uJyk7XG4gIH1cbn1cbiJdfQ==