@bitgo-beta/utxo-lib 8.0.3-beta.31 → 8.0.3-beta.310
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.
- package/README.md +19 -16
- package/dist/src/address.js +5 -5
- package/dist/src/addressFormat.js +9 -9
- package/dist/src/bitgo/Musig2.js +19 -19
- package/dist/src/bitgo/PsbtUtil.d.ts +8 -7
- package/dist/src/bitgo/PsbtUtil.d.ts.map +1 -1
- package/dist/src/bitgo/PsbtUtil.js +18 -3
- package/dist/src/bitgo/Unspent.js +3 -3
- package/dist/src/bitgo/UtxoPsbt.d.ts +19 -4
- package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoPsbt.js +174 -110
- package/dist/src/bitgo/UtxoTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoTransaction.js +9 -9
- package/dist/src/bitgo/bitcoincash/address.js +6 -6
- package/dist/src/bitgo/bitcoincash/index.js +6 -2
- package/dist/src/bitgo/dash/DashTransaction.js +3 -3
- package/dist/src/bitgo/dash/index.js +6 -2
- package/dist/src/bitgo/index.d.ts +9 -0
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +9 -3
- package/dist/src/bitgo/legacysafe/index.d.ts +15 -0
- package/dist/src/bitgo/legacysafe/index.d.ts.map +1 -0
- package/dist/src/bitgo/legacysafe/index.js +61 -0
- package/dist/src/bitgo/litecoin/LitecoinTransaction.js +2 -2
- package/dist/src/bitgo/litecoin/index.js +6 -2
- package/dist/src/bitgo/outputScripts.d.ts +1 -0
- package/dist/src/bitgo/outputScripts.d.ts.map +1 -1
- package/dist/src/bitgo/outputScripts.js +29 -14
- package/dist/src/bitgo/parseInput.js +6 -6
- package/dist/src/bitgo/psbt/fromHalfSigned.js +5 -5
- package/dist/src/bitgo/signature.d.ts +2 -2
- package/dist/src/bitgo/signature.d.ts.map +1 -1
- package/dist/src/bitgo/signature.js +24 -9
- package/dist/src/bitgo/transaction.d.ts +18 -3
- package/dist/src/bitgo/transaction.d.ts.map +1 -1
- package/dist/src/bitgo/transaction.js +18 -16
- package/dist/src/bitgo/transactionAmounts.d.ts +9 -0
- package/dist/src/bitgo/transactionAmounts.d.ts.map +1 -0
- package/dist/src/bitgo/transactionAmounts.js +33 -0
- package/dist/src/bitgo/types.d.ts +7 -0
- package/dist/src/bitgo/types.d.ts.map +1 -1
- package/dist/src/bitgo/types.js +11 -2
- package/dist/src/bitgo/wallet/Psbt.d.ts +28 -8
- package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Psbt.js +110 -29
- package/dist/src/bitgo/wallet/Unspent.d.ts +23 -13
- package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Unspent.js +62 -53
- package/dist/src/bitgo/wallet/WalletOutput.d.ts +17 -1
- package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/WalletOutput.js +68 -27
- package/dist/src/bitgo/wallet/WalletScripts.js +2 -2
- package/dist/src/bitgo/wallet/WalletUnspentSigner.js +4 -4
- package/dist/src/bitgo/wallet/index.js +6 -2
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts +50 -0
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.js +87 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts +26 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.js +116 -0
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +0 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.js +5 -14
- package/dist/src/bitgo/zcash/ZcashTransaction.js +15 -15
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +4 -4
- package/dist/src/bitgo/zcash/address.js +3 -3
- package/dist/src/bitgo/zcash/hashZip0244.js +3 -3
- package/dist/src/bitgo/zcash/index.js +6 -2
- package/dist/src/index.js +6 -2
- package/dist/src/noble_ecc.d.ts +7 -7
- package/dist/src/noble_ecc.d.ts.map +1 -1
- package/dist/src/noble_ecc.js +4 -4
- package/dist/src/testutil/index.js +6 -2
- package/dist/src/testutil/keys.d.ts +3 -0
- package/dist/src/testutil/keys.d.ts.map +1 -1
- package/dist/src/testutil/keys.js +18 -3
- package/dist/src/testutil/mock.d.ts.map +1 -1
- package/dist/src/testutil/mock.js +19 -17
- package/dist/src/testutil/psbt.d.ts +27 -6
- package/dist/src/testutil/psbt.d.ts.map +1 -1
- package/dist/src/testutil/psbt.js +40 -29
- package/dist/src/testutil/transaction.d.ts +14 -5
- package/dist/src/testutil/transaction.d.ts.map +1 -1
- package/dist/src/testutil/transaction.js +20 -20
- package/package.json +8 -8
|
@@ -3,12 +3,12 @@ import { PsbtInput } from 'bip174/src/lib/interfaces';
|
|
|
3
3
|
import { BIP32Interface } from 'bip32';
|
|
4
4
|
import { UtxoPsbt } from '../UtxoPsbt';
|
|
5
5
|
import { UtxoTransaction } from '../UtxoTransaction';
|
|
6
|
+
import { ScriptType2Of3 } from '../outputScripts';
|
|
6
7
|
import { RootWalletKeys } from './WalletKeys';
|
|
7
8
|
import { WalletUnspent } from './Unspent';
|
|
8
|
-
import { ParsedPubScriptP2ms, ParsedPubScriptTaprootScriptPath, ParsedPubScriptTaprootKeyPath, ParsedPubScriptP2shP2pk, ParsedScriptType } from '../parseInput';
|
|
9
|
+
import { ParsedPubScriptP2ms, ParsedPubScriptTaprootScriptPath, ParsedPubScriptTaprootKeyPath, ParsedPubScriptP2shP2pk, ParsedScriptType, ParsedScriptType2Of3 } from '../parseInput';
|
|
9
10
|
import { Triple } from '../types';
|
|
10
11
|
import { TxInput } from 'bitcoinjs-lib';
|
|
11
|
-
import { PsbtInputType } from '../PsbtUtil';
|
|
12
12
|
declare type BaseSignatureContainer<T> = {
|
|
13
13
|
signatures: T;
|
|
14
14
|
};
|
|
@@ -72,7 +72,7 @@ export declare function signWalletPsbt(psbt: UtxoPsbt, inputIndex: number, signe
|
|
|
72
72
|
/**
|
|
73
73
|
* @returns script type of the input
|
|
74
74
|
*/
|
|
75
|
-
export declare function getPsbtInputScriptType(input:
|
|
75
|
+
export declare function getPsbtInputScriptType(input: PsbtInput): ParsedScriptType;
|
|
76
76
|
/**
|
|
77
77
|
* @return psbt metadata are parsed as per below conditions.
|
|
78
78
|
* redeemScript/witnessScript/tapLeafScript matches BitGo.
|
|
@@ -86,25 +86,31 @@ export declare function getPsbtInputScriptType(input: PsbtInputType): ParsedScri
|
|
|
86
86
|
* P2TR MUSIG2 kep path => scriptType (taprootKeyPathSpend), pubScript (scriptPubKey), participant pub keys (signer),
|
|
87
87
|
* public key (tapOutputkey), signatures (partial signer sigs).
|
|
88
88
|
*/
|
|
89
|
-
export declare function parsePsbtInput(input:
|
|
89
|
+
export declare function parsePsbtInput(input: PsbtInput): ParsedPsbtP2ms | ParsedPsbtTaproot | ParsedPsbtP2shP2pk;
|
|
90
|
+
/**
|
|
91
|
+
* Converts a parsed script type into an array of script types.
|
|
92
|
+
* @param parsedScriptType - The parsed script type.
|
|
93
|
+
* @returns An array of ScriptType2Of3 values corresponding to the parsed script type.
|
|
94
|
+
*/
|
|
95
|
+
export declare function toScriptType2Of3s(parsedScriptType: ParsedScriptType2Of3): ScriptType2Of3[];
|
|
90
96
|
/**
|
|
91
97
|
* @returns strictly parse the input and get signature count.
|
|
92
98
|
* unsigned(0), half-signed(1) or fully-signed(2)
|
|
93
99
|
*/
|
|
94
|
-
export declare function getStrictSignatureCount(input: TxInput |
|
|
100
|
+
export declare function getStrictSignatureCount(input: TxInput | PsbtInput): 0 | 1 | 2;
|
|
95
101
|
/**
|
|
96
102
|
* @returns strictly parse input and get signature count for all inputs.
|
|
97
103
|
* 0=unsigned, 1=half-signed or 2=fully-signed
|
|
98
104
|
*/
|
|
99
|
-
export declare function getStrictSignatureCounts(tx: UtxoPsbt | UtxoTransaction<number | bigint> |
|
|
105
|
+
export declare function getStrictSignatureCounts(tx: UtxoPsbt | UtxoTransaction<number | bigint> | PsbtInput[] | TxInput[]): (0 | 1 | 2)[];
|
|
100
106
|
/**
|
|
101
107
|
* @return true iff inputs array is of PsbtInputType type
|
|
102
108
|
* */
|
|
103
|
-
export declare function isPsbtInputArray(inputs:
|
|
109
|
+
export declare function isPsbtInputArray(inputs: PsbtInput[] | TxInput[]): inputs is PsbtInput[];
|
|
104
110
|
/**
|
|
105
111
|
* @return true iff inputs array is of TxInput type
|
|
106
112
|
* */
|
|
107
|
-
export declare function isTxInputArray(inputs:
|
|
113
|
+
export declare function isTxInputArray(inputs: PsbtInput[] | TxInput[]): inputs is TxInput[];
|
|
108
114
|
/**
|
|
109
115
|
* @returns true iff given psbt/transaction/tx-input-array/psbt-input-array contains at least one taproot key path spend input
|
|
110
116
|
*/
|
|
@@ -122,5 +128,19 @@ export declare function addXpubsToPsbt(psbt: UtxoPsbt, rootWalletKeys: RootWalle
|
|
|
122
128
|
* For p2shP2pk input, [false, false, false] is returned since it is not a 2 of 3 sig input.
|
|
123
129
|
*/
|
|
124
130
|
export declare function getSignatureValidationArrayPsbt(psbt: UtxoPsbt, rootWalletKeys: RootWalletKeys): SignatureValidation[];
|
|
131
|
+
/**
|
|
132
|
+
* Extracts the half signed transaction from the psbt for p2ms based script types - p2sh, p2wsh, and p2shP2wsh.
|
|
133
|
+
* The purpose is to provide backward compatibility to keyternal (KRS) that only supports network transaction and p2ms script types.
|
|
134
|
+
*/
|
|
135
|
+
export declare function extractP2msOnlyHalfSignedTx(psbt: UtxoPsbt): UtxoTransaction<bigint>;
|
|
136
|
+
/**
|
|
137
|
+
* Clones the psbt without nonWitnessUtxo for non-segwit inputs and witnessUtxo is added instead.
|
|
138
|
+
* It is not BIP-174 compliant, so use it carefully.
|
|
139
|
+
*/
|
|
140
|
+
export declare function clonePsbtWithoutNonWitnessUtxo(psbt: UtxoPsbt): UtxoPsbt;
|
|
141
|
+
/**
|
|
142
|
+
* Deletes witnessUtxo for non-segwit inputs to make the PSBT BIP-174 compliant.
|
|
143
|
+
*/
|
|
144
|
+
export declare function deleteWitnessUtxoForNonSegwitInputs(psbt: UtxoPsbt): void;
|
|
125
145
|
export {};
|
|
126
146
|
//# sourceMappingURL=Psbt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Psbt.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/wallet/Psbt.ts"],"names":[],"mappings":";AAEA,OAAO,EAA0B,SAAS,EAAgB,MAAM,2BAA2B,CAAC;AAE5F,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"Psbt.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/wallet/Psbt.ts"],"names":[],"mappings":";AAEA,OAAO,EAA0B,SAAS,EAAgB,MAAM,2BAA2B,CAAC;AAE5F,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAGL,cAAc,EAGf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAqB,cAAc,EAAE,MAAM,cAAc,CAAC;AAGjE,OAAO,EAAmB,aAAa,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,EAIL,mBAAmB,EACnB,gCAAgC,EAGhC,6BAA6B,EAE7B,uBAAuB,EACvB,gBAAgB,EAGhB,oBAAoB,EACrB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAW,MAAM,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAqC,OAAO,EAAE,MAAM,eAAe,CAAC;AAK3E,aAAK,sBAAsB,CAAC,CAAC,IAAI;IAC/B,UAAU,EAAE,CAAC,CAAC;CACf,CAAC;AAEF,aAAK,0BAA0B,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;AACpE,aAAK,4BAA4B,GAAG,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACrE,aAAK,4BAA4B,GAAG,sBAAsB,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7E,aAAK,kBAAkB,GAAG,0BAA0B,GAAG,4BAA4B,GAAG,4BAA4B,CAAC;AAEnH;;;GAGG;AACH,aAAK,oCAAoC,CAAC,CAAC,IAAI;IAC7C,UAAU,EAAE,CAAC,CAAC;IACd,6DAA6D;IAC7D,qBAAqB,EAAE,CAAC,CAAC;CAC1B,CAAC;AAEF,aAAK,wCAAwC,GAAG,oCAAoC,CAAC,SAAS,CAAC,CAAC;AAChG,aAAK,0CAA0C,GAAG,oCAAoC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACjG,aAAK,0CAA0C,GAAG,oCAAoC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEzG,aAAK,gCAAgC,GACjC,wCAAwC,GACxC,0CAA0C,GAC1C,0CAA0C,CAAC;AAE/C;;GAEG;AACH,oBAAY,cAAc,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;AAEtE;;GAEG;AACH,oBAAY,wBAAwB,GAAG,6BAA6B,GAAG,gCAAgC,CAAC;AAExG;;GAEG;AACH,oBAAY,2BAA2B,GAAG,gCAAgC,GACxE,kBAAkB,GAAG;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEJ,oBAAY,iBAAiB,GAAG,wBAAwB,GAAG,2BAA2B,CAAC;AAEvF,aAAK,0BAA0B,GAAG,0BAA0B,GAAG,4BAA4B,CAAC;AAE5F,oBAAY,kBAAkB,GAAG,uBAAuB,GAAG,0BAA0B,CAAC;AAOtF;;GAEG;AACH,oBAAY,mBAAmB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AA4E9E;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,eAAe,CAAC,MAAM,CAAC,EAC3B,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EACjC,cAAc,EAAE,cAAc,GAC7B,QAAQ,CAYV;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAC7B,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,GAAG,gBAAgB,CAyCzE;AA4DD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,cAAc,GAAG,iBAAiB,GAAG,kBAAkB,CAoDxG;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,gBAAgB,EAAE,oBAAoB,GAAG,cAAc,EAAE,CAM1F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAoB7E;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,QAAQ,GAAG,eAAe,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,EAAE,GAAG,OAAO,EAAE,GACxE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAGf;AAED;;KAEK;AACL,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,IAAI,SAAS,EAAE,CAEvF;AAED;;KAEK;AACL,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,IAAI,OAAO,EAAE,CAGnF;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,QAAQ,GAAG,eAAe,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,EAAE,GAAG,OAAO,EAAE,GAC1E,OAAO,CAgBT;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI,CAcnF;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,GAAG,mBAAmB,EAAE,CAQrH;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAyCnF;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAgBvE;AAED;;GAEG;AACH,wBAAgB,mCAAmC,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAOxE"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getSignatureValidationArrayPsbt = exports.addXpubsToPsbt = exports.isTransactionWithKeyPathSpendInput = exports.isTxInputArray = exports.isPsbtInputArray = exports.getStrictSignatureCounts = exports.getStrictSignatureCount = exports.parsePsbtInput = exports.getPsbtInputScriptType = exports.signWalletPsbt = exports.toWalletPsbt = void 0;
|
|
3
|
+
exports.deleteWitnessUtxoForNonSegwitInputs = exports.clonePsbtWithoutNonWitnessUtxo = exports.extractP2msOnlyHalfSignedTx = exports.getSignatureValidationArrayPsbt = exports.addXpubsToPsbt = exports.isTransactionWithKeyPathSpendInput = exports.isTxInputArray = exports.isPsbtInputArray = exports.getStrictSignatureCounts = exports.getStrictSignatureCount = exports.toScriptType2Of3s = exports.parsePsbtInput = exports.getPsbtInputScriptType = exports.signWalletPsbt = exports.toWalletPsbt = void 0;
|
|
4
4
|
const assert = require("assert");
|
|
5
5
|
const utils_1 = require("bip174/src/lib/utils");
|
|
6
6
|
const bs58check = require("bs58check");
|
|
7
7
|
const UtxoPsbt_1 = require("../UtxoPsbt");
|
|
8
8
|
const UtxoTransaction_1 = require("../UtxoTransaction");
|
|
9
9
|
const outputScripts_1 = require("../outputScripts");
|
|
10
|
+
const WalletKeys_1 = require("./WalletKeys");
|
|
10
11
|
const Unspent_1 = require("../Unspent");
|
|
11
12
|
const transaction_1 = require("../transaction");
|
|
12
13
|
const Unspent_2 = require("./Unspent");
|
|
@@ -18,9 +19,9 @@ const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
|
18
19
|
const index_1 = require("../../index");
|
|
19
20
|
const PsbtUtil_1 = require("../PsbtUtil");
|
|
20
21
|
function getTaprootSigners(script, walletKeys) {
|
|
21
|
-
const parsedPublicKeys = parseInput_1.parsePubScript2Of3(script, 'taprootScriptPathSpend').publicKeys;
|
|
22
|
+
const parsedPublicKeys = (0, parseInput_1.parsePubScript2Of3)(script, 'taprootScriptPathSpend').publicKeys;
|
|
22
23
|
const walletSigners = parsedPublicKeys.map((publicKey) => {
|
|
23
|
-
const index = walletKeys.publicKeys.findIndex((walletPublicKey) => outputScripts_1.toXOnlyPublicKey(walletPublicKey).equals(publicKey));
|
|
24
|
+
const index = walletKeys.publicKeys.findIndex((walletPublicKey) => (0, outputScripts_1.toXOnlyPublicKey)(walletPublicKey).equals(publicKey));
|
|
24
25
|
if (index >= 0) {
|
|
25
26
|
return { walletKey: walletKeys.triple[index], rootKey: walletKeys.parent.triple[index] };
|
|
26
27
|
}
|
|
@@ -29,9 +30,9 @@ function getTaprootSigners(script, walletKeys) {
|
|
|
29
30
|
return [walletSigners[0], walletSigners[1]];
|
|
30
31
|
}
|
|
31
32
|
function updatePsbtInput(psbt, inputIndex, unspent, rootWalletKeys) {
|
|
32
|
-
const input = utils_1.checkForInput(psbt.data.inputs, inputIndex);
|
|
33
|
-
const signatureCount = PsbtUtil_1.getPsbtInputSignatureCount(input);
|
|
34
|
-
const scriptType = outputScripts_1.scriptTypeForChain(unspent.chain);
|
|
33
|
+
const input = (0, utils_1.checkForInput)(psbt.data.inputs, inputIndex);
|
|
34
|
+
const signatureCount = (0, PsbtUtil_1.getPsbtInputSignatureCount)(input);
|
|
35
|
+
const scriptType = (0, outputScripts_1.scriptTypeForChain)(unspent.chain);
|
|
35
36
|
if (signatureCount === 0 && scriptType === 'p2tr') {
|
|
36
37
|
return;
|
|
37
38
|
}
|
|
@@ -44,7 +45,7 @@ function updatePsbtInput(psbt, inputIndex, unspent, rootWalletKeys) {
|
|
|
44
45
|
throw new Error('Bitgo only supports a single tap leaf script per input');
|
|
45
46
|
}
|
|
46
47
|
const [signer, cosigner] = getTaprootSigners(input.tapLeafScript[0].script, walletKeys);
|
|
47
|
-
const leafHash = outputScripts_1.getLeafHash({
|
|
48
|
+
const leafHash = (0, outputScripts_1.getLeafHash)({
|
|
48
49
|
publicKeys: walletKeys.publicKeys,
|
|
49
50
|
signer: signer.walletKey.publicKey,
|
|
50
51
|
cosigner: cosigner.walletKey.publicKey,
|
|
@@ -52,7 +53,7 @@ function updatePsbtInput(psbt, inputIndex, unspent, rootWalletKeys) {
|
|
|
52
53
|
psbt.updateInput(inputIndex, {
|
|
53
54
|
tapBip32Derivation: [signer, cosigner].map((walletSigner) => ({
|
|
54
55
|
leafHashes: [leafHash],
|
|
55
|
-
pubkey: outputScripts_1.toXOnlyPublicKey(walletSigner.walletKey.publicKey),
|
|
56
|
+
pubkey: (0, outputScripts_1.toXOnlyPublicKey)(walletSigner.walletKey.publicKey),
|
|
56
57
|
path: rootWalletKeys.getDerivationPath(walletSigner.rootKey, unspent.chain, unspent.index),
|
|
57
58
|
masterFingerprint: walletSigner.rootKey.fingerprint,
|
|
58
59
|
})),
|
|
@@ -60,7 +61,7 @@ function updatePsbtInput(psbt, inputIndex, unspent, rootWalletKeys) {
|
|
|
60
61
|
}
|
|
61
62
|
else {
|
|
62
63
|
if (signatureCount === 0) {
|
|
63
|
-
const { witnessScript, redeemScript } = outputScripts_1.createOutputScript2of3(walletKeys.publicKeys, scriptType);
|
|
64
|
+
const { witnessScript, redeemScript } = (0, outputScripts_1.createOutputScript2of3)(walletKeys.publicKeys, scriptType);
|
|
64
65
|
if (witnessScript && psbt.data.inputs[inputIndex].witnessScript === undefined) {
|
|
65
66
|
psbt.updateInput(inputIndex, { witnessScript });
|
|
66
67
|
}
|
|
@@ -86,12 +87,12 @@ function updatePsbtInput(psbt, inputIndex, unspent, rootWalletKeys) {
|
|
|
86
87
|
*/
|
|
87
88
|
function toWalletPsbt(tx, unspents, rootWalletKeys) {
|
|
88
89
|
const prevOutputs = unspents.map((u) => {
|
|
89
|
-
assert.notStrictEqual(outputScripts_1.scriptTypeForChain(u.chain), 'p2trMusig2');
|
|
90
|
-
return Unspent_1.toPrevOutputWithPrevTx(u, tx.network);
|
|
90
|
+
assert.notStrictEqual((0, outputScripts_1.scriptTypeForChain)(u.chain), 'p2trMusig2');
|
|
91
|
+
return (0, Unspent_1.toPrevOutputWithPrevTx)(u, tx.network);
|
|
91
92
|
});
|
|
92
|
-
const psbt = transaction_1.createPsbtFromTransaction(tx, prevOutputs);
|
|
93
|
+
const psbt = (0, transaction_1.createPsbtFromTransaction)(tx, prevOutputs);
|
|
93
94
|
unspents.forEach((u, i) => {
|
|
94
|
-
if (Unspent_2.isWalletUnspent(u) && u.index !== undefined) {
|
|
95
|
+
if ((0, Unspent_2.isWalletUnspent)(u) && u.index !== undefined) {
|
|
95
96
|
updatePsbtInput(psbt, i, u, rootWalletKeys);
|
|
96
97
|
}
|
|
97
98
|
});
|
|
@@ -106,7 +107,7 @@ exports.toWalletPsbt = toWalletPsbt;
|
|
|
106
107
|
* @return signed PSBT with signer's key for unspent
|
|
107
108
|
*/
|
|
108
109
|
function signWalletPsbt(psbt, inputIndex, signer, unspent) {
|
|
109
|
-
const scriptType = outputScripts_1.scriptTypeForChain(unspent.chain);
|
|
110
|
+
const scriptType = (0, outputScripts_1.scriptTypeForChain)(unspent.chain);
|
|
110
111
|
if (scriptType === 'p2tr' || scriptType === 'p2trMusig2') {
|
|
111
112
|
psbt.signTaprootInputHD(inputIndex, signer);
|
|
112
113
|
}
|
|
@@ -163,13 +164,13 @@ function getPsbtInputScriptType(input) {
|
|
|
163
164
|
}
|
|
164
165
|
exports.getPsbtInputScriptType = getPsbtInputScriptType;
|
|
165
166
|
function parseTaprootKeyPathSignatures(input) {
|
|
166
|
-
const partialSigs = Musig2_1.parsePsbtMusig2PartialSigs(input);
|
|
167
|
+
const partialSigs = (0, Musig2_1.parsePsbtMusig2PartialSigs)(input);
|
|
167
168
|
if (!partialSigs) {
|
|
168
169
|
return { signatures: undefined, participantPublicKeys: undefined };
|
|
169
170
|
}
|
|
170
171
|
const signatures = partialSigs.map((pSig) => pSig.partialSig);
|
|
171
172
|
const participantPublicKeys = partialSigs.map((pSig) => pSig.participantPubKey);
|
|
172
|
-
return types_1.isTuple(signatures) && types_1.isTuple(participantPublicKeys)
|
|
173
|
+
return (0, types_1.isTuple)(signatures) && (0, types_1.isTuple)(participantPublicKeys)
|
|
173
174
|
? { signatures, participantPublicKeys }
|
|
174
175
|
: { signatures: [signatures[0]], participantPublicKeys: [participantPublicKeys[0]] };
|
|
175
176
|
}
|
|
@@ -181,7 +182,7 @@ function parsePartialOrTapScriptSignatures(sig) {
|
|
|
181
182
|
throw new Error('unexpected signature count');
|
|
182
183
|
}
|
|
183
184
|
const signatures = sig.map((tSig) => tSig.signature);
|
|
184
|
-
return types_1.isTuple(signatures) ? { signatures } : { signatures: [signatures[0]] };
|
|
185
|
+
return (0, types_1.isTuple)(signatures) ? { signatures } : { signatures: [signatures[0]] };
|
|
185
186
|
}
|
|
186
187
|
function parseSignatures(input, scriptType) {
|
|
187
188
|
return scriptType === 'taprootKeyPathSpend'
|
|
@@ -207,13 +208,13 @@ function parseScript(input, scriptType) {
|
|
|
207
208
|
pubScript = input.witnessUtxo.script;
|
|
208
209
|
}
|
|
209
210
|
else if (input.tapInternalKey && input.tapMerkleRoot) {
|
|
210
|
-
pubScript = taproot_1.createTaprootOutputScript({ internalPubKey: input.tapInternalKey, taptreeRoot: input.tapMerkleRoot });
|
|
211
|
+
pubScript = (0, taproot_1.createTaprootOutputScript)({ internalPubKey: input.tapInternalKey, taptreeRoot: input.tapMerkleRoot });
|
|
211
212
|
}
|
|
212
213
|
}
|
|
213
214
|
if (!pubScript) {
|
|
214
215
|
throw new Error(`Invalid PSBT state for ${scriptType}. Missing required fields.`);
|
|
215
216
|
}
|
|
216
|
-
return parseInput_1.parsePubScript(pubScript, scriptType);
|
|
217
|
+
return (0, parseInput_1.parsePubScript)(pubScript, scriptType);
|
|
217
218
|
}
|
|
218
219
|
/**
|
|
219
220
|
* @return psbt metadata are parsed as per below conditions.
|
|
@@ -229,7 +230,7 @@ function parseScript(input, scriptType) {
|
|
|
229
230
|
* public key (tapOutputkey), signatures (partial signer sigs).
|
|
230
231
|
*/
|
|
231
232
|
function parsePsbtInput(input) {
|
|
232
|
-
if (PsbtUtil_1.isPsbtInputFinalized(input)) {
|
|
233
|
+
if ((0, PsbtUtil_1.isPsbtInputFinalized)(input)) {
|
|
233
234
|
throw new Error('Finalized PSBT parsing is not supported');
|
|
234
235
|
}
|
|
235
236
|
const scriptType = getPsbtInputScriptType(input);
|
|
@@ -246,11 +247,11 @@ function parsePsbtInput(input) {
|
|
|
246
247
|
throw new Error('Invalid PSBT state for taprootScriptPathSpend. Missing required fields.');
|
|
247
248
|
}
|
|
248
249
|
const controlBlock = input.tapLeafScript[0].controlBlock;
|
|
249
|
-
if (!parseInput_1.isValidControlBock(controlBlock)) {
|
|
250
|
+
if (!(0, parseInput_1.isValidControlBock)(controlBlock)) {
|
|
250
251
|
throw new Error('Invalid PSBT taprootScriptPathSpend controlBlock.');
|
|
251
252
|
}
|
|
252
|
-
const scriptPathLevel = parseInput_1.calculateScriptPathLevel(controlBlock);
|
|
253
|
-
const leafVersion = parseInput_1.getLeafVersion(controlBlock);
|
|
253
|
+
const scriptPathLevel = (0, parseInput_1.calculateScriptPathLevel)(controlBlock);
|
|
254
|
+
const leafVersion = (0, parseInput_1.getLeafVersion)(controlBlock);
|
|
254
255
|
return {
|
|
255
256
|
...parsedPubScript,
|
|
256
257
|
...signatures,
|
|
@@ -270,7 +271,7 @@ function parsePsbtInput(input) {
|
|
|
270
271
|
...signatures,
|
|
271
272
|
};
|
|
272
273
|
}
|
|
273
|
-
if (parsedPubScript.scriptType === 'p2shP2pk' && (!signatures.signatures || !types_1.isTuple(signatures.signatures))) {
|
|
274
|
+
if (parsedPubScript.scriptType === 'p2shP2pk' && (!signatures.signatures || !(0, types_1.isTuple)(signatures.signatures))) {
|
|
274
275
|
return {
|
|
275
276
|
...parsedPubScript,
|
|
276
277
|
signatures: signatures.signatures,
|
|
@@ -279,6 +280,19 @@ function parsePsbtInput(input) {
|
|
|
279
280
|
throw new Error('invalid pub script');
|
|
280
281
|
}
|
|
281
282
|
exports.parsePsbtInput = parsePsbtInput;
|
|
283
|
+
/**
|
|
284
|
+
* Converts a parsed script type into an array of script types.
|
|
285
|
+
* @param parsedScriptType - The parsed script type.
|
|
286
|
+
* @returns An array of ScriptType2Of3 values corresponding to the parsed script type.
|
|
287
|
+
*/
|
|
288
|
+
function toScriptType2Of3s(parsedScriptType) {
|
|
289
|
+
return parsedScriptType === 'taprootScriptPathSpend'
|
|
290
|
+
? ['p2trMusig2', 'p2tr']
|
|
291
|
+
: parsedScriptType === 'taprootKeyPathSpend'
|
|
292
|
+
? ['p2trMusig2']
|
|
293
|
+
: [parsedScriptType];
|
|
294
|
+
}
|
|
295
|
+
exports.toScriptType2Of3s = toScriptType2Of3s;
|
|
282
296
|
/**
|
|
283
297
|
* @returns strictly parse the input and get signature count.
|
|
284
298
|
* unsigned(0), half-signed(1) or fully-signed(2)
|
|
@@ -286,7 +300,7 @@ exports.parsePsbtInput = parsePsbtInput;
|
|
|
286
300
|
function getStrictSignatureCount(input) {
|
|
287
301
|
var _a, _b;
|
|
288
302
|
const calculateSignatureCount = (signatures) => {
|
|
289
|
-
const count = signatures ? signatures.filter((s) => !parseInput_1.isPlaceholderSignature(s)).length : 0;
|
|
303
|
+
const count = signatures ? signatures.filter((s) => !(0, parseInput_1.isPlaceholderSignature)(s)).length : 0;
|
|
290
304
|
if (count === 0 || count === 1 || count === 2) {
|
|
291
305
|
return count;
|
|
292
306
|
}
|
|
@@ -294,7 +308,7 @@ function getStrictSignatureCount(input) {
|
|
|
294
308
|
};
|
|
295
309
|
if ('hash' in input) {
|
|
296
310
|
if (((_a = input.script) === null || _a === void 0 ? void 0 : _a.length) || ((_b = input.witness) === null || _b === void 0 ? void 0 : _b.length)) {
|
|
297
|
-
const parsedInput = parseInput_1.parseSignatureScript(input);
|
|
311
|
+
const parsedInput = (0, parseInput_1.parseSignatureScript)(input);
|
|
298
312
|
return parsedInput.scriptType === 'taprootKeyPathSpend' ? 2 : calculateSignatureCount(parsedInput.signatures);
|
|
299
313
|
}
|
|
300
314
|
return 0;
|
|
@@ -345,7 +359,7 @@ function isTransactionWithKeyPathSpendInput(data) {
|
|
|
345
359
|
if (getStrictSignatureCount(input) === 0) {
|
|
346
360
|
return false;
|
|
347
361
|
}
|
|
348
|
-
return parseInput_1.parseSignatureScript(input).scriptType === 'taprootKeyPathSpend';
|
|
362
|
+
return (0, parseInput_1.parseSignatureScript)(input).scriptType === 'taprootKeyPathSpend';
|
|
349
363
|
});
|
|
350
364
|
}
|
|
351
365
|
exports.isTransactionWithKeyPathSpendInput = isTransactionWithKeyPathSpendInput;
|
|
@@ -356,7 +370,8 @@ exports.isTransactionWithKeyPathSpendInput = isTransactionWithKeyPathSpendInput;
|
|
|
356
370
|
* extendedPubkey.
|
|
357
371
|
*/
|
|
358
372
|
function addXpubsToPsbt(psbt, rootWalletKeys) {
|
|
359
|
-
const
|
|
373
|
+
const safeRootWalletKeys = new WalletKeys_1.RootWalletKeys(rootWalletKeys.triple.map((bip32) => bip32.neutered()), rootWalletKeys.derivationPrefixes);
|
|
374
|
+
const xPubs = safeRootWalletKeys.triple.map((bip32) => ({
|
|
360
375
|
extendedPubkey: bs58check.decode(bip32.toBase58()),
|
|
361
376
|
masterFingerprint: bip32.fingerprint,
|
|
362
377
|
// TODO: BG-73797 - bip174 currently requires m prefix for this to be a valid globalXpub
|
|
@@ -379,4 +394,70 @@ function getSignatureValidationArrayPsbt(psbt, rootWalletKeys) {
|
|
|
379
394
|
});
|
|
380
395
|
}
|
|
381
396
|
exports.getSignatureValidationArrayPsbt = getSignatureValidationArrayPsbt;
|
|
382
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvUHNidC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpQ0FBaUM7QUFHakMsZ0RBQXFEO0FBRXJELHVDQUF1QztBQUN2QywwQ0FBdUM7QUFDdkMsd0RBQXFEO0FBQ3JELG9EQUE2RztBQUU3Ryx3Q0FBb0Q7QUFDcEQsZ0RBQTJEO0FBQzNELHVDQUEyRDtBQUUzRCw4Q0FjdUI7QUFDdkIsc0NBQXVEO0FBQ3ZELG9DQUEyQztBQUMzQywyQ0FBMEQ7QUFDMUQsaURBQTJEO0FBQzNELHVDQUFzQztBQUN0QywwQ0FBOEY7QUFxRTlGLFNBQVMsaUJBQWlCLENBQUMsTUFBYyxFQUFFLFVBQTZCO0lBQ3RFLE1BQU0sZ0JBQWdCLEdBQUcsK0JBQWtCLENBQUMsTUFBTSxFQUFFLHdCQUF3QixDQUFDLENBQUMsVUFBVSxDQUFDO0lBQ3pGLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FDaEUsZ0NBQWdCLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUNwRCxDQUFDO1FBQ0YsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQ2QsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1NBQzFGO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxh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QUUsbUJBQW1CLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFSRCwwRUFRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgeyBHbG9iYWxYcHViLCBQYXJ0aWFsU2lnLCBQc2J0SW5wdXQsIFRhcFNjcmlwdFNpZyB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgY2hlY2tGb3JJbnB1dCB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnYmlwMzInO1xuaW1wb3J0ICogYXMgYnM1OGNoZWNrIGZyb20gJ2JzNThjaGVjayc7XG5pbXBvcnQgeyBVdHhvUHNidCB9IGZyb20gJy4uL1V0eG9Qc2J0JztcbmltcG9ydCB7IFV0eG9UcmFuc2FjdGlvbiB9IGZyb20gJy4uL1V0eG9UcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBjcmVhdGVPdXRwdXRTY3JpcHQyb2YzLCBnZXRMZWFmSGFzaCwgc2NyaXB0VHlwZUZvckNoYWluLCB0b1hPbmx5UHVibGljS2V5IH0gZnJvbSAnLi4vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyBEZXJpdmVkV2FsbGV0S2V5cywgUm9vdFdhbGxldEtleXMgfSBmcm9tICcuL1dhbGxldEtleXMnO1xuaW1wb3J0IHsgdG9QcmV2T3V0cHV0V2l0aFByZXZUeCB9IGZyb20gJy4uL1Vuc3BlbnQnO1xuaW1wb3J0IHsgY3JlYXRlUHNidEZyb21UcmFuc2FjdGlvbiB9IGZyb20gJy4uL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IGlzV2FsbGV0VW5zcGVudCwgV2FsbGV0VW5zcGVudCB9IGZyb20gJy4vVW5zcGVudCc7XG5cbmltcG9ydCB7XG4gIGdldExlYWZWZXJzaW9uLFxuICBjYWxjdWxhdGVTY3JpcHRQYXRoTGV2ZWwsXG4gIGlzVmFsaWRDb250cm9sQm9jayxcbiAgUGFyc2VkUHViU2NyaXB0UDJtcyxcbiAgUGFyc2VkUHViU2NyaXB0VGFwcm9vdFNjcmlwdFBhdGgsXG4gIHBhcnNlUHViU2NyaXB0Mk9mMyxcbiAgUGFyc2VkUHViU2NyaXB0VGFwcm9vdCxcbiAgUGFyc2VkUHViU2NyaXB0VGFwcm9vdEtleVBhdGgsXG4gIHBhcnNlUHViU2NyaXB0LFxuICBQYXJzZWRQdWJTY3JpcHRQMnNoUDJwayxcbiAgUGFyc2VkU2NyaXB0VHlwZSxcbiAgaXNQbGFjZWhvbGRlclNpZ25hdHVyZSxcbiAgcGFyc2VTaWduYXR1cmVTY3JpcHQsXG59IGZyb20gJy4uL3BhcnNlSW5wdXQnO1xuaW1wb3J0IHsgcGFyc2VQc2J0TXVzaWcyUGFydGlhbFNpZ3MgfSBmcm9tICcuLi9NdXNpZzInO1xuaW1wb3J0IHsgaXNUdXBsZSwgVHJpcGxlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlVGFwcm9vdE91dHB1dFNjcmlwdCB9IGZyb20gJy4uLy4uL3RhcHJvb3QnO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQsIFR4SW5wdXQgfSBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCB7IG9wY29kZXMgfSBmcm9tICcuLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBnZXRQc2J0SW5wdXRTaWduYXR1cmVDb3VudCwgaXNQc2J0SW5wdXRGaW5hbGl6ZWQsIFBzYnRJbnB1dFR5cGUgfSBmcm9tICcuLi9Qc2J0VXRpbCc7XG5cbi8vIG9ubHkgdXNlZCBmb3IgYnVpbGRpbmcgYFNpZ25hdHVyZUNvbnRhaW5lcmBcbnR5cGUgQmFzZVNpZ25hdHVyZUNvbnRhaW5lcjxUPiA9IHtcbiAgc2lnbmF0dXJlczogVDtcbn07XG5cbnR5cGUgVW5zaWduZWRTaWduYXR1cmVDb250YWluZXIgPSBCYXNlU2lnbmF0dXJlQ29udGFpbmVyPHVuZGVmaW5lZD47XG50eXBlIEhhbGZTaWduZWRTaWduYXR1cmVDb250YWluZXIgPSBCYXNlU2lnbmF0dXJlQ29udGFpbmVyPFtCdWZmZXJdPjtcbnR5cGUgRnVsbFNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lciA9IEJhc2VTaWduYXR1cmVDb250YWluZXI8W0J1ZmZlciwgQnVmZmVyXT47XG5cbnR5cGUgU2lnbmF0dXJlQ29udGFpbmVyID0gVW5zaWduZWRTaWduYXR1cmVDb250YWluZXIgfCBIYWxmU2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyIHwgRnVsbFNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lcjtcblxuLyoqXG4gKiBDb250ZW50cyBvZiBhIHByZS1maW5hbGl6ZWQgUFNCVCBJbnB1dCBmb3IgcDJ0ck11c2lnMiBrZXkgcGF0aCBpbiB0aGUgbm9uLWZpbmFsaXplZCBzdGF0ZS5cbiAqIFQgaXMgW0J1ZmZlcl0gZm9yIGZpcnN0IHNpZ25hdHVyZSwgW0J1ZmZlciwgQnVmZmVyXSBmb3IgYm90aCBzaWduYXR1cmVzIGFuZCBgdW5kZWZpbmVkYCBmb3Igbm8gc2lnbmF0dXJlcy5cbiAqL1xudHlwZSBCYXNlVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI8VD4gPSB7XG4gIHNpZ25hdHVyZXM6IFQ7XG4gIC8qKiBPbmx5IGNvbnRhaW5zIHBhcnRpY2lwYW50cyB0aGF0IGhhdmUgYWRkZWQgYSBzaWduYXR1cmUgKi9cbiAgcGFydGljaXBhbnRQdWJsaWNLZXlzOiBUO1xufTtcblxudHlwZSBVbnNpZ25lZFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyID0gQmFzZVRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyPHVuZGVmaW5lZD47XG50eXBlIEhhbGZTaWduZWRUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lciA9IEJhc2VUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lcjxbQnVmZmVyXT47XG50eXBlIEZ1bGxTaWduZWRUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lciA9IEJhc2VUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lcjxbQnVmZmVyLCBCdWZmZXJdPjtcblxudHlwZSBUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lciA9XG4gIHwgVW5zaWduZWRUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lclxuICB8IEhhbGZTaWduZWRUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lclxuICB8IEZ1bGxTaWduZWRUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lcjtcblxuLyoqXG4gKiBUbyBob2xkIHBhcnNlZCBwc2J0IGRhdGEgZm9yIHAybXMgYmFzZWQgc2NyaXB0IHR5cGVzIC0gcDJzaCwgcDJ3c2gsIGFuZCBwMnNoUDJ3c2hcbiAqL1xuZXhwb3J0IHR5cGUgUGFyc2VkUHNidFAybXMgPSBQYXJzZWRQdWJTY3JpcHRQMm1zICYgU2lnbmF0dXJlQ29udGFpbmVyO1xuXG4vKipcbiAqIFRvIGhvbGQgcGFyc2VkIHBzYnQgZGF0YSBmb3IgVGFwcm9vdEtleVBhdGhTcGVuZCBzY3JpcHQgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyc2VkUHNidFRhcHJvb3RLZXlQYXRoID0gUGFyc2VkUHViU2NyaXB0VGFwcm9vdEtleVBhdGggJiBUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lcjtcblxuLyoqXG4gKiBUbyBob2xkIHBhcnNlZCBwc2J0IGRhdGEgZm9yIFRhcHJvb3RTY3JpcHRQYXRoU3BlbmQgc2NyaXB0IHBhdGggc2NyaXB0IHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlZFBzYnRUYXByb290U2NyaXB0UGF0aCA9IFBhcnNlZFB1YlNjcmlwdFRhcHJvb3RTY3JpcHRQYXRoICZcbiAgU2lnbmF0dXJlQ29udGFpbmVyICYge1xuICAgIGNvbnRyb2xCbG9jazogQnVmZmVyO1xuICAgIGxlYWZWZXJzaW9uOiBudW1iZXI7XG4gICAgLyoqIEluZGljYXRlcyB0aGUgbGV2ZWwgaW5zaWRlIHRoZSB0YXB0cmVlLiAqL1xuICAgIHNjcmlwdFBhdGhMZXZlbDogbnVtYmVyO1xuICB9O1xuXG5leHBvcnQgdHlwZSBQYXJzZWRQc2J0VGFwcm9vdCA9IFBhcnNlZFBzYnRUYXByb290S2V5UGF0aCB8IFBhcnNlZFBzYnRUYXByb290U2NyaXB0UGF0aDtcblxudHlwZSBQMnNoUDJwa1NpZ25hdHVyZUNvbnRhaW5lciA9IFVuc2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyIHwgSGFsZlNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lcjtcblxuZXhwb3J0IHR5cGUgUGFyc2VkUHNidFAyc2hQMnBrID0gUGFyc2VkUHViU2NyaXB0UDJzaFAycGsgJiBQMnNoUDJwa1NpZ25hdHVyZUNvbnRhaW5lcjtcblxuaW50ZXJmYWNlIFdhbGxldFNpZ25lciB7XG4gIHdhbGxldEtleTogQklQMzJJbnRlcmZhY2U7XG4gIHJvb3RLZXk6IEJJUDMySW50ZXJmYWNlO1xufVxuXG4vKipcbiAqIHBzYnQgaW5wdXQgaW5kZXggYW5kIGl0cyB1c2VyLCBiYWNrdXAsIGJpdGdvIHNpZ25hdHVyZXMgc3RhdHVzXG4gKi9cbmV4cG9ydCB0eXBlIFNpZ25hdHVyZVZhbGlkYXRpb24gPSBbaW5kZXg6IG51bWJlciwgc2lnVHJpcGxlOiBUcmlwbGU8Ym9vbGVhbj5dO1xuXG5mdW5jdGlvbiBnZXRUYXByb290U2lnbmVycyhzY3JpcHQ6IEJ1ZmZlciwgd2FsbGV0S2V5czogRGVyaXZlZFdhbGxldEtleXMpOiBbV2FsbGV0U2lnbmVyLCBXYWxsZXRTaWduZXJdIHtcbiAgY29uc3QgcGFyc2VkUHVibGljS2V5cyA9IHBhcnNlUHViU2NyaXB0Mk9mMyhzY3JpcHQsICd0YXByb290U2NyaXB0UGF0aFNwZW5kJykucHVibGljS2V5cztcbiAgY29uc3Qgd2FsbGV0U2lnbmVycyA9IHBhcnNlZFB1YmxpY0tleXMubWFwKChwdWJsaWNLZXkpID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHdhbGxldEtleXMucHVibGljS2V5cy5maW5kSW5kZXgoKHdhbGxldFB1YmxpY0tleSkgPT5cbiAgICAgIHRvWE9ubHlQdWJsaWNLZXkod2FsbGV0UHVibGljS2V5KS5lcXVhbHMocHVibGljS2V5KVxuICAgICk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHJldHVybiB7IHdhbGxldEtleTogd2FsbGV0S2V5cy50cmlwbGVbaW5kZXhdLCByb290S2V5OiB3YWxsZXRLZXlzLnBhcmVudC50cmlwbGVbaW5kZXhdIH07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignVGFwcm9vdCBwdWJsaWMga2V5IGlzIG5vdCBhIHdhbGxldCBwdWJsaWMga2V5Jyk7XG4gIH0pO1xuICByZXR1cm4gW3dhbGxldFNpZ25lcnNbMF0sIHdhbGxldFNpZ25lcnNbMV1dO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVQc2J0SW5wdXQoXG4gIHBzYnQ6IFV0eG9Qc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHVuc3BlbnQ6IFdhbGxldFVuc3BlbnQ8YmlnaW50PixcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzXG4pOiB2b2lkIHtcbiAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHBzYnQuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICBjb25zdCBzaWduYXR1cmVDb3VudCA9IGdldFBzYnRJbnB1dFNpZ25hdHVyZUNvdW50KGlucHV0KTtcbiAgY29uc3Qgc2NyaXB0VHlwZSA9IHNjcmlwdFR5cGVGb3JDaGFpbih1bnNwZW50LmNoYWluKTtcbiAgaWYgKHNpZ25hdHVyZUNvdW50ID09PSAwICYmIHNjcmlwdFR5cGUgPT09ICdwMnRyJykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB3YWxsZXRLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KTtcblxuICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHInKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0LnRhcExlYWZTY3JpcHQpIHx8IGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUFNCVCBzdGF0ZS4gTWlzc2luZyByZXF1aXJlZCBmaWVsZHMuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRnbyBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIHRhcCBsZWFmIHNjcmlwdCBwZXIgaW5wdXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBbc2lnbmVyLCBjb3NpZ25lcl0gPSBnZXRUYXByb290U2lnbmVycyhpbnB1dC50YXBMZWFmU2NyaXB0WzBdLnNjcmlwdCwgd2FsbGV0S2V5cyk7XG5cbiAgICBjb25zdCBsZWFmSGFzaCA9IGdldExlYWZIYXNoKHtcbiAgICAgIHB1YmxpY0tleXM6IHdhbGxldEtleXMucHVibGljS2V5cyxcbiAgICAgIHNpZ25lcjogc2lnbmVyLndhbGxldEtleS5wdWJsaWNLZXksXG4gICAgICBjb3NpZ25lcjogY29zaWduZXIud2FsbGV0S2V5LnB1YmxpY0tleSxcbiAgICB9KTtcblxuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgdGFwQmlwMzJEZXJpdmF0aW9uOiBbc2lnbmVyLCBjb3NpZ25lcl0ubWFwKCh3YWxsZXRTaWduZXIpID0+ICh7XG4gICAgICAgIGxlYWZIYXNoZXM6IFtsZWFmSGFzaF0sXG4gICAgICAgIHB1YmtleTogdG9YT25seVB1YmxpY0tleSh3YWxsZXRTaWduZXIud2FsbGV0S2V5LnB1YmxpY0tleSksXG4gICAgICAgIHBhdGg6IHJvb3RXYWxsZXRLZXlzLmdldERlcml2YXRpb25QYXRoKHdhbGxldFNpZ25lci5yb290S2V5LCB1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KSxcbiAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IHdhbGxldFNpZ25lci5yb290S2V5LmZpbmdlcnByaW50LFxuICAgICAgfSkpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGlmIChzaWduYXR1cmVDb3VudCA9PT0gMCkge1xuICAgICAgY29uc3QgeyB3aXRuZXNzU2NyaXB0LCByZWRlZW1TY3JpcHQgfSA9IGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMod2FsbGV0S2V5cy5wdWJsaWNLZXlzLCBzY3JpcHRUeXBlKTtcbiAgICAgIGlmICh3aXRuZXNzU2NyaXB0ICYmIHBzYnQuZGF0YS5pbnB1dHNbaW5wdXRJbmRleF0ud2l0bmVzc1NjcmlwdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyB3aXRuZXNzU2NyaXB0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlZGVlbVNjcmlwdCAmJiBwc2J0LmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdLnJlZGVlbVNjcmlwdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyByZWRlZW1TY3JpcHQgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICBiaXAzMkRlcml2YXRpb246IFswLCAxLCAyXS5tYXAoKGlkeCkgPT4gKHtcbiAgICAgICAgcHVia2V5OiB3YWxsZXRLZXlzLnRyaXBsZVtpZHhdLnB1YmxpY0tleSxcbiAgICAgICAgcGF0aDogd2FsbGV0S2V5cy5wYXRoc1tpZHhdLFxuICAgICAgICBtYXN0ZXJGaW5nZXJwcmludDogcm9vdFdhbGxldEtleXMudHJpcGxlW2lkeF0uZmluZ2VycHJpbnQsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcmV0dXJuIFBTQlQgZmlsbGVkIHdpdGggbWV0YXRkYXRhIGFzIHBlciBpbnB1dCBwYXJhbXMgdHgsIHVuc3BlbnRzIGFuZCByb290V2FsbGV0S2V5cy5cbiAqIFVuc2lnbmVkIFBTQlQgZm9yIHRhcHJvb3QgaW5wdXQgd2l0aCB3aXRuZXNzVXR4b1xuICogVW5zaWduZWQgUFNCVCBmb3Igb3RoZXIgaW5wdXQgd2l0aCB3aXRuZXNzVXR4by9ub25XaXRuZXNzVXR4bywgcmVkZWVtU2NyaXB0L3dpdG5lc3NTY3JpcHQsIGJpcDMyRGVyaXZhdGlvblxuICogU2lnbmVkIFBTQlQgZm9yIHRhcHJvb3QgaW5wdXQgd2l0aCB3aXRuZXNzVXR4bywgdGFwTGVhZlNjcmlwdCwgdGFwQmlwMzJEZXJpdmF0aW9uLCB0YXBTY3JpcHRTaWdcbiAqIFNpZ25lZCBQU0JUIGZvciBvdGhlciBpbnB1dCB3aXRoIHdpdG5lc3NVdHhvL25vbldpdG5lc3NVdHhvLCByZWRlZW1TY3JpcHQvd2l0bmVzc1NjcmlwdCwgYmlwMzJEZXJpdmF0aW9uLCBwYXJ0aWFsU2lnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1dhbGxldFBzYnQoXG4gIHR4OiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PixcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdLFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXNcbik6IFV0eG9Qc2J0IHtcbiAgY29uc3QgcHJldk91dHB1dHMgPSB1bnNwZW50cy5tYXAoKHUpID0+IHtcbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoc2NyaXB0VHlwZUZvckNoYWluKHUuY2hhaW4pLCAncDJ0ck11c2lnMicpO1xuICAgIHJldHVybiB0b1ByZXZPdXRwdXRXaXRoUHJldlR4KHUsIHR4Lm5ldHdvcmspO1xuICB9KTtcbiAgY29uc3QgcHNidCA9IGNyZWF0ZVBzYnRGcm9tVHJhbnNhY3Rpb24odHgsIHByZXZPdXRwdXRzKTtcbiAgdW5zcGVudHMuZm9yRWFjaCgodSwgaSkgPT4ge1xuICAgIGlmIChpc1dhbGxldFVuc3BlbnQodSkgJiYgdS5pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1cGRhdGVQc2J0SW5wdXQocHNidCwgaSwgdSwgcm9vdFdhbGxldEtleXMpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBwc2J0O1xufVxuXG4vKipcbiAqIEBwYXJhbSBwc2J0XG4gKiBAcGFyYW0gaW5wdXRJbmRleFxuICogQHBhcmFtIHNpZ25lclxuICogQHBhcmFtIHVuc3BlbnRcbiAqIEByZXR1cm4gc2lnbmVkIFBTQlQgd2l0aCBzaWduZXIncyBrZXkgZm9yIHVuc3BlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25XYWxsZXRQc2J0KFxuICBwc2J0OiBVdHhvUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICBzaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICB1bnNwZW50OiBXYWxsZXRVbnNwZW50PGJpZ2ludD5cbik6IHZvaWQge1xuICBjb25zdCBzY3JpcHRUeXBlID0gc2NyaXB0VHlwZUZvckNoYWluKHVuc3BlbnQuY2hhaW4pO1xuICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHInIHx8IHNjcmlwdFR5cGUgPT09ICdwMnRyTXVzaWcyJykge1xuICAgIHBzYnQuc2lnblRhcHJvb3RJbnB1dEhEKGlucHV0SW5kZXgsIHNpZ25lcik7XG4gIH0gZWxzZSB7XG4gICAgcHNidC5zaWduSW5wdXRIRChpbnB1dEluZGV4LCBzaWduZXIpO1xuICB9XG59XG5cbi8qKlxuICogQHJldHVybnMgc2NyaXB0IHR5cGUgb2YgdGhlIGlucHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQc2J0SW5wdXRTY3JpcHRUeXBlKGlucHV0OiBQc2J0SW5wdXRUeXBlKTogUGFyc2VkU2NyaXB0VHlwZSB7XG4gIGNvbnN0IGlzUDJwayA9IChzY3JpcHQ6IEJ1ZmZlcikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjaHVua3MgPSBic2NyaXB0LmRlY29tcGlsZShzY3JpcHQpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2h1bmtzPy5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgQnVmZmVyLmlzQnVmZmVyKGNodW5rc1swXSkgJiZcbiAgICAgICAgYnNjcmlwdC5pc0Nhbm9uaWNhbFB1YktleShjaHVua3NbMF0pICYmXG4gICAgICAgIGNodW5rc1sxXSA9PT0gb3Bjb2Rlcy5PUF9DSEVDS1NJR1xuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBsZXQgc2NyaXB0VHlwZTogUGFyc2VkU2NyaXB0VHlwZSB8IHVuZGVmaW5lZDtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpbnB1dC5yZWRlZW1TY3JpcHQpICYmIEJ1ZmZlci5pc0J1ZmZlcihpbnB1dC53aXRuZXNzU2NyaXB0KSkge1xuICAgIHNjcmlwdFR5cGUgPSAncDJzaFAyd3NoJztcbiAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoaW5wdXQucmVkZWVtU2NyaXB0KSkge1xuICAgIHNjcmlwdFR5cGUgPSBpc1AycGsoaW5wdXQucmVkZWVtU2NyaXB0KSA/ICdwMnNoUDJwaycgOiAncDJzaCc7XG4gIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKGlucHV0LndpdG5lc3NTY3JpcHQpKSB7XG4gICAgc2NyaXB0VHlwZSA9ICdwMndzaCc7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQudGFwTGVhZlNjcmlwdCkgJiYgaW5wdXQudGFwTGVhZlNjcmlwdC5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHNjcmlwdFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgYm90aCAke3NjcmlwdFR5cGV9IGFuZCB0YXByb290U2NyaXB0UGF0aCBQU0JUIG1ldGFkYXRhLmApO1xuICAgIH1cbiAgICBpZiAoaW5wdXQudGFwTGVhZlNjcmlwdC5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JpdGdvIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgdGFwIGxlYWYgc2NyaXB0IHBlciBpbnB1dC4nKTtcbiAgICB9XG4gICAgc2NyaXB0VHlwZSA9ICd0YXByb290U2NyaXB0UGF0aFNwZW5kJztcbiAgfVxuICBpZiAoaW5wdXQudGFwSW50ZXJuYWxLZXkpIHtcbiAgICBpZiAoc2NyaXB0VHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCBib3RoICR7c2NyaXB0VHlwZX0gYW5kIHRhcHJvb3RLZXlQYXRoIFBTQlQgbWV0YWRhdGEuYCk7XG4gICAgfVxuICAgIHNjcmlwdFR5cGUgPSAndGFwcm9vdEtleVBhdGhTcGVuZCc7XG4gIH1cbiAgaWYgKHNjcmlwdFR5cGUpIHtcbiAgICByZXR1cm4gc2NyaXB0VHlwZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCBwYXJzZSBpbnB1dCcpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlcyhpbnB1dDogUHNidElucHV0VHlwZSk6IFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyIHtcbiAgY29uc3QgcGFydGlhbFNpZ3MgPSBwYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyhpbnB1dCk7XG4gIGlmICghcGFydGlhbFNpZ3MpIHtcbiAgICByZXR1cm4geyBzaWduYXR1cmVzOiB1bmRlZmluZWQsIHBhcnRpY2lwYW50UHVibGljS2V5czogdW5kZWZpbmVkIH07XG4gIH1cbiAgY29uc3Qgc2lnbmF0dXJlcyA9IHBhcnRpYWxTaWdzLm1hcCgocFNpZykgPT4gcFNpZy5wYXJ0aWFsU2lnKTtcbiAgY29uc3QgcGFydGljaXBhbnRQdWJsaWNLZXlzID0gcGFydGlhbFNpZ3MubWFwKChwU2lnKSA9PiBwU2lnLnBhcnRpY2lwYW50UHViS2V5KTtcbiAgcmV0dXJuIGlzVHVwbGU8QnVmZmVyPihzaWduYXR1cmVzKSAmJiBpc1R1cGxlPEJ1ZmZlcj4ocGFydGljaXBhbnRQdWJsaWNLZXlzKVxuICAgID8geyBzaWduYXR1cmVzLCBwYXJ0aWNpcGFudFB1YmxpY0tleXMgfVxuICAgIDogeyBzaWduYXR1cmVzOiBbc2lnbmF0dXJlc1swXV0sIHBhcnRpY2lwYW50UHVibGljS2V5czogW3BhcnRpY2lwYW50UHVibGljS2V5c1swXV0gfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQYXJ0aWFsT3JUYXBTY3JpcHRTaWduYXR1cmVzKHNpZzogUGFydGlhbFNpZ1tdIHwgVGFwU2NyaXB0U2lnW10gfCB1bmRlZmluZWQpOiBTaWduYXR1cmVDb250YWluZXIge1xuICBpZiAoIXNpZz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlczogdW5kZWZpbmVkIH07XG4gIH1cbiAgaWYgKHNpZy5sZW5ndGggPiAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIHNpZ25hdHVyZSBjb3VudCcpO1xuICB9XG4gIGNvbnN0IHNpZ25hdHVyZXMgPSBzaWcubWFwKCh0U2lnKSA9PiB0U2lnLnNpZ25hdHVyZSk7XG4gIHJldHVybiBpc1R1cGxlPEJ1ZmZlcj4oc2lnbmF0dXJlcykgPyB7IHNpZ25hdHVyZXMgfSA6IHsgc2lnbmF0dXJlczogW3NpZ25hdHVyZXNbMF1dIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlU2lnbmF0dXJlcyhcbiAgaW5wdXQ6IFBzYnRJbnB1dFR5cGUsXG4gIHNjcmlwdFR5cGU6IFBhcnNlZFNjcmlwdFR5cGVcbik6IFNpZ25hdHVyZUNvbnRhaW5lciB8IFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyIHtcbiAgcmV0dXJuIHNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJ1xuICAgID8gcGFyc2VUYXByb290S2V5UGF0aFNpZ25hdHVyZXMoaW5wdXQpXG4gICAgOiBzY3JpcHRUeXBlID09PSAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCdcbiAgICA/IHBhcnNlUGFydGlhbE9yVGFwU2NyaXB0U2lnbmF0dXJlcyhpbnB1dC50YXBTY3JpcHRTaWcpXG4gICAgOiBwYXJzZVBhcnRpYWxPclRhcFNjcmlwdFNpZ25hdHVyZXMoaW5wdXQucGFydGlhbFNpZyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU2NyaXB0KFxuICBpbnB1dDogUHNidElucHV0VHlwZSxcbiAgc2NyaXB0VHlwZTogUGFyc2VkU2NyaXB0VHlwZVxuKTogUGFyc2VkUHViU2NyaXB0UDJtcyB8IFBhcnNlZFB1YlNjcmlwdFRhcHJvb3QgfCBQYXJzZWRQdWJTY3JpcHRQMnNoUDJwayB7XG4gIGxldCBwdWJTY3JpcHQ6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnNoJyB8fCBzY3JpcHRUeXBlID09PSAncDJzaFAycGsnKSB7XG4gICAgcHViU2NyaXB0ID0gaW5wdXQucmVkZWVtU2NyaXB0O1xuICB9IGVsc2UgaWYgKHNjcmlwdFR5cGUgPT09ICdwMndzaCcgfHwgc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMndzaCcpIHtcbiAgICBwdWJTY3JpcHQgPSBpbnB1dC53aXRuZXNzU2NyaXB0O1xuICB9IGVsc2UgaWYgKHNjcmlwdFR5cGUgPT09ICd0YXByb290U2NyaXB0UGF0aFNwZW5kJykge1xuICAgIHB1YlNjcmlwdCA9IGlucHV0LnRhcExlYWZTY3JpcHQgPyBpbnB1dC50YXBMZWFmU2NyaXB0WzBdLnNjcmlwdCA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChzY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcpIHtcbiAgICBpZiAoaW5wdXQud2l0bmVzc1V0eG8/LnNjcmlwdCkge1xuICAgICAgcHViU2NyaXB0ID0gaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0O1xuICAgIH0gZWxzZSBpZiAoaW5wdXQudGFwSW50ZXJuYWxLZXkgJiYgaW5wdXQudGFwTWVya2xlUm9vdCkge1xuICAgICAgcHViU2NyaXB0ID0gY3JlYXRlVGFwcm9vdE91dHB1dFNjcmlwdCh7IGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSwgdGFwdHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QgfSk7XG4gICAgfVxuICB9XG4gIGlmICghcHViU2NyaXB0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFBTQlQgc3RhdGUgZm9yICR7c2NyaXB0VHlwZX0uIE1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLmApO1xuICB9XG4gIHJldHVybiBwYXJzZVB1YlNjcmlwdChwdWJTY3JpcHQsIHNjcmlwdFR5cGUpO1xufVxuXG4vKipcbiAqIEByZXR1cm4gcHNidCBtZXRhZGF0YSBhcmUgcGFyc2VkIGFzIHBlciBiZWxvdyBjb25kaXRpb25zLlxuICogcmVkZWVtU2NyaXB0L3dpdG5lc3NTY3JpcHQvdGFwTGVhZlNjcmlwdCBtYXRjaGVzIEJpdEdvLlxuICogc2lnbmF0dXJlIGFuZCBwdWJsaWMga2V5IGNvdW50IG1hdGNoZXMgQml0R28uXG4gKiBQMlNILVAyUEsgPT4gc2NyaXB0VHlwZSwgcmVkZWVtU2NyaXB0LCBwdWJsaWMga2V5LCBzaWduYXR1cmUuXG4gKiBQMlNIID0+IHNjcmlwdFR5cGUsIHJlZGVlbVNjcmlwdCwgcHVibGljIGtleXMsIHNpZ25hdHVyZXMuXG4gKiBQVzJTSCA9PiBzY3JpcHRUeXBlLCB3aXRuZXNzU2NyaXB0LCBwdWJsaWMga2V5cywgc2lnbmF0dXJlcy5cbiAqIFAyU0gtUFcyU0ggPT4gc2NyaXB0VHlwZSwgcmVkZWVtU2NyaXB0LCB3aXRuZXNzU2NyaXB0LCBwdWJsaWMga2V5cywgc2lnbmF0dXJlcy5cbiAqIFAyVFIgYW5kIFAyVFIgTVVTSUcyIHNjcmlwdCBwYXRoID0+IHNjcmlwdFR5cGUgKHRhcHJvb3RTY3JpcHRQYXRoU3BlbmQpLCBwdWJTY3JpcHQgKGxlYWYgc2NyaXB0KSwgY29udHJvbEJsb2NrLFxuICogc2NyaXB0UGF0aExldmVsLCBsZWFmVmVyc2lvbiwgcHVibGljIGtleXMsIHNpZ25hdHVyZXMuXG4gKiBQMlRSIE1VU0lHMiBrZXAgcGF0aCA9PiBzY3JpcHRUeXBlICh0YXByb290S2V5UGF0aFNwZW5kKSwgcHViU2NyaXB0IChzY3JpcHRQdWJLZXkpLCBwYXJ0aWNpcGFudCBwdWIga2V5cyAoc2lnbmVyKSxcbiAqIHB1YmxpYyBrZXkgKHRhcE91dHB1dGtleSksIHNpZ25hdHVyZXMgKHBhcnRpYWwgc2lnbmVyIHNpZ3MpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQc2J0SW5wdXQoaW5wdXQ6IFBzYnRJbnB1dFR5cGUpOiBQYXJzZWRQc2J0UDJtcyB8IFBhcnNlZFBzYnRUYXByb290IHwgUGFyc2VkUHNidFAyc2hQMnBrIHtcbiAgaWYgKGlzUHNidElucHV0RmluYWxpemVkKGlucHV0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmluYWxpemVkIFBTQlQgcGFyc2luZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gIH1cbiAgY29uc3Qgc2NyaXB0VHlwZSA9IGdldFBzYnRJbnB1dFNjcmlwdFR5cGUoaW5wdXQpO1xuICBjb25zdCBwYXJzZWRQdWJTY3JpcHQgPSBwYXJzZVNjcmlwdChpbnB1dCwgc2NyaXB0VHlwZSk7XG4gIGNvbnN0IHNpZ25hdHVyZXMgPSBwYXJzZVNpZ25hdHVyZXMoaW5wdXQsIHNjcmlwdFR5cGUpO1xuXG4gIGlmIChwYXJzZWRQdWJTY3JpcHQuc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnICYmICdwYXJ0aWNpcGFudFB1YmxpY0tleXMnIGluIHNpZ25hdHVyZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucGFyc2VkUHViU2NyaXB0LFxuICAgICAgLi4uc2lnbmF0dXJlcyxcbiAgICB9O1xuICB9XG4gIGlmIChwYXJzZWRQdWJTY3JpcHQuc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnKSB7XG4gICAgaWYgKCFpbnB1dC50YXBMZWFmU2NyaXB0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUFNCVCBzdGF0ZSBmb3IgdGFwcm9vdFNjcmlwdFBhdGhTcGVuZC4gTWlzc2luZyByZXF1aXJlZCBmaWVsZHMuJyk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xCbG9jayA9IGlucHV0LnRhcExlYWZTY3JpcHRbMF0uY29udHJvbEJsb2NrO1xuICAgIGlmICghaXNWYWxpZENvbnRyb2xCb2NrKGNvbnRyb2xCbG9jaykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBQU0JUIHRhcHJvb3RTY3JpcHRQYXRoU3BlbmQgY29udHJvbEJsb2NrLicpO1xuICAgIH1cbiAgICBjb25zdCBzY3JpcHRQYXRoTGV2ZWwgPSBjYWxjdWxhdGVTY3JpcHRQYXRoTGV2ZWwoY29udHJvbEJsb2NrKTtcbiAgICBjb25zdCBsZWFmVmVyc2lvbiA9IGdldExlYWZWZXJzaW9uKGNvbnRyb2xCbG9jayk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBhcnNlZFB1YlNjcmlwdCxcbiAgICAgIC4uLnNpZ25hdHVyZXMsXG4gICAgICBjb250cm9sQmxvY2ssXG4gICAgICBzY3JpcHRQYXRoTGV2ZWwsXG4gICAgICBsZWFmVmVyc2lvbixcbiAgICB9O1xuICB9XG4gIGlmIChcbiAgICBwYXJzZWRQdWJTY3JpcHQuc2NyaXB0VHlwZSA9PT0gJ3Ayc2gnIHx8XG4gICAgcGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICdwMndzaCcgfHxcbiAgICBwYXJzZWRQdWJTY3JpcHQuc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMndzaCdcbiAgKSB7XG4gICAgaWYgKHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlID09PSAncDJzaFAyd3NoJykge1xuICAgICAgcGFyc2VkUHViU2NyaXB0LnJlZGVlbVNjcmlwdCA9IGlucHV0LnJlZGVlbVNjcmlwdDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBhcnNlZFB1YlNjcmlwdCxcbiAgICAgIC4uLnNpZ25hdHVyZXMsXG4gICAgfTtcbiAgfVxuICBpZiAocGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICdwMnNoUDJwaycgJiYgKCFzaWduYXR1cmVzLnNpZ25hdHVyZXMgfHwgIWlzVHVwbGUoc2lnbmF0dXJlcy5zaWduYXR1cmVzKSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucGFyc2VkUHViU2NyaXB0LFxuICAgICAgc2lnbmF0dXJlczogc2lnbmF0dXJlcy5zaWduYXR1cmVzLFxuICAgIH07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHB1YiBzY3JpcHQnKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBzdHJpY3RseSBwYXJzZSB0aGUgaW5wdXQgYW5kIGdldCBzaWduYXR1cmUgY291bnQuXG4gKiB1bnNpZ25lZCgwKSwgaGFsZi1zaWduZWQoMSkgb3IgZnVsbHktc2lnbmVkKDIpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJpY3RTaWduYXR1cmVDb3VudChpbnB1dDogVHhJbnB1dCB8IFBzYnRJbnB1dFR5cGUpOiAwIHwgMSB8IDIge1xuICBjb25zdCBjYWxjdWxhdGVTaWduYXR1cmVDb3VudCA9IChcbiAgICBzaWduYXR1cmVzOiBbQnVmZmVyIHwgMCwgQnVmZmVyIHwgMCwgQnVmZmVyIHwgMF0gfCBbQnVmZmVyLCBCdWZmZXJdIHwgW0J1ZmZlcl0gfCB1bmRlZmluZWRcbiAgKTogMCB8IDEgfCAyID0+IHtcbiAgICBjb25zdCBjb3VudCA9IHNpZ25hdHVyZXMgPyBzaWduYXR1cmVzLmZpbHRlcigocykgPT4gIWlzUGxhY2Vob2xkZXJTaWduYXR1cmUocykpLmxlbmd0aCA6IDA7XG4gICAgaWYgKGNvdW50ID09PSAwIHx8IGNvdW50ID09PSAxIHx8IGNvdW50ID09PSAyKSB7XG4gICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWduYXR1cmUgY291bnQnKTtcbiAgfTtcblxuICBpZiAoJ2hhc2gnIGluIGlucHV0KSB7XG4gICAgaWYgKGlucHV0LnNjcmlwdD8ubGVuZ3RoIHx8IGlucHV0LndpdG5lc3M/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgcGFyc2VkSW5wdXQgPSBwYXJzZVNpZ25hdHVyZVNjcmlwdChpbnB1dCk7XG4gICAgICByZXR1cm4gcGFyc2VkSW5wdXQuc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnID8gMiA6IGNhbGN1bGF0ZVNpZ25hdHVyZUNvdW50KHBhcnNlZElucHV0LnNpZ25hdHVyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlU2lnbmF0dXJlQ291bnQocGFyc2VQc2J0SW5wdXQoaW5wdXQpLnNpZ25hdHVyZXMpO1xuICB9XG59XG5cbi8qKlxuICogQHJldHVybnMgc3RyaWN0bHkgcGFyc2UgaW5wdXQgYW5kIGdldCBzaWduYXR1cmUgY291bnQgZm9yIGFsbCBpbnB1dHMuXG4gKiAwPXVuc2lnbmVkLCAxPWhhbGYtc2lnbmVkIG9yIDI9ZnVsbHktc2lnbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJpY3RTaWduYXR1cmVDb3VudHMoXG4gIHR4OiBVdHhvUHNidCB8IFV0eG9UcmFuc2FjdGlvbjxudW1iZXIgfCBiaWdpbnQ+IHwgUHNidElucHV0VHlwZVtdIHwgVHhJbnB1dFtdXG4pOiAoMCB8IDEgfCAyKVtdIHtcbiAgY29uc3QgaW5wdXRzID0gdHggaW5zdGFuY2VvZiBVdHhvUHNidCA/IHR4LmRhdGEuaW5wdXRzIDogdHggaW5zdGFuY2VvZiBVdHhvVHJhbnNhY3Rpb24gPyB0eC5pbnMgOiB0eDtcbiAgcmV0dXJuIGlucHV0cy5tYXAoKGlucHV0LCBfKSA9PiBnZXRTdHJpY3RTaWduYXR1cmVDb3VudChpbnB1dCkpO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdHJ1ZSBpZmYgaW5wdXRzIGFycmF5IGlzIG9mIFBzYnRJbnB1dFR5cGUgdHlwZVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BzYnRJbnB1dEFycmF5KGlucHV0czogUHNidElucHV0VHlwZVtdIHwgVHhJbnB1dFtdKTogaW5wdXRzIGlzIFBzYnRJbnB1dFR5cGVbXSB7XG4gIHJldHVybiAhaXNUeElucHV0QXJyYXkoaW5wdXRzKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHRydWUgaWZmIGlucHV0cyBhcnJheSBpcyBvZiBUeElucHV0IHR5cGVcbiAqICovXG5leHBvcnQgZnVuY3Rpb24gaXNUeElucHV0QXJyYXkoaW5wdXRzOiBQc2J0SW5wdXRUeXBlW10gfCBUeElucHV0W10pOiBpbnB1dHMgaXMgVHhJbnB1dFtdIHtcbiAgYXNzZXJ0KCEhaW5wdXRzLmxlbmd0aCwgJ2VtcHR5IGlucHV0cyBhcnJheScpO1xuICByZXR1cm4gJ2hhc2gnIGluIGlucHV0c1swXTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmZiBnaXZlbiBwc2J0L3RyYW5zYWN0aW9uL3R4LWlucHV0LWFycmF5L3BzYnQtaW5wdXQtYXJyYXkgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRhcHJvb3Qga2V5IHBhdGggc3BlbmQgaW5wdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kSW5wdXQoXG4gIGRhdGE6IFV0eG9Qc2J0IHwgVXR4b1RyYW5zYWN0aW9uPGJpZ2ludCB8IG51bWJlcj4gfCBQc2J0SW5wdXRbXSB8IFR4SW5wdXRbXVxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGlucHV0cyA9IGRhdGEgaW5zdGFuY2VvZiBVdHhvUHNidCA/IGRhdGEuZGF0YS5pbnB1dHMgOiBkYXRhIGluc3RhbmNlb2YgVXR4b1RyYW5zYWN0aW9uID8gZGF0YS5pbnMgOiBkYXRhO1xuICBpZiAoIWlucHV0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGlzUHNidElucHV0QXJyYXkoaW5wdXRzKSkge1xuICAgIHJldHVybiBpbnB1dHMuc29tZSgoaW5wdXQsIF8pID0+IGdldFBzYnRJbnB1dFNjcmlwdFR5cGUoaW5wdXQpID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcpO1xuICB9XG4gIHJldHVybiBpbnB1dHMuc29tZSgoaW5wdXQsIF8pID0+IHtcbiAgICAvLyBJZiB0aGUgaW5wdXQgaXMgbm90IHNpZ25lZCwgaXQgY2Fubm90IGJlIGEgdGFwcm9vdEtleVBhdGhTcGVuZCBpbnB1dCBiZWNhdXNlIHlvdSBjYW4gb25seVxuICAgIC8vIGV4dHJhY3QgYSBmdWxseSBzaWduZWQgcHNidCBpbnRvIGEgdHJhbnNhY3Rpb24gd2l0aCB0YXByb290S2V5UGF0aFNwZW5kIGlucHV0cy5cbiAgICBpZiAoZ2V0U3RyaWN0U2lnbmF0dXJlQ291bnQoaW5wdXQpID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZVNpZ25hdHVyZVNjcmlwdChpbnB1dCkuc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIFJvb3RXYWxsZXRLZXlzIGFzIHRoZSBnbG9iYWxYcHVicyBvbiB0aGUgcHNidFxuICpcbiAqIFdlIGRvIGFsbCB0aGUgbWF0Y2hpbmcgb2YgdGhlICh0YXApYmlwMzJEZXJpdmF0aW9ucyBtYXN0ZXJGaW5nZXJwcmludCB0byB0aGUgZmluZ2VycHJpbnQgb2YgdGhlXG4gKiBleHRlbmRlZFB1YmtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFhwdWJzVG9Qc2J0KHBzYnQ6IFV0eG9Qc2J0LCByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMpOiB2b2lkIHtcbiAgY29uc3QgeFB1YnMgPSByb290V2FsbGV0S2V5cy50cmlwbGUubWFwKFxuICAgIChiaXAzMik6IEdsb2JhbFhwdWIgPT4gKHtcbiAgICAgIGV4dGVuZGVkUHVia2V5OiBiczU4Y2hlY2suZGVjb2RlKGJpcDMyLnRvQmFzZTU4KCkpLFxuICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IGJpcDMyLmZpbmdlcnByaW50LFxuICAgICAgLy8gVE9ETzogQkctNzM3OTcgLSBiaXAxNzQgY3VycmVudGx5IHJlcXVpcmVzIG0gcHJlZml4IGZvciB0aGlzIHRvIGJlIGEgdmFsaWQgZ2xvYmFsWHB1YlxuICAgICAgcGF0aDogJ20nLFxuICAgIH0pXG4gICk7XG4gIHBzYnQudXBkYXRlR2xvYmFsKHsgZ2xvYmFsWHB1YjogeFB1YnMgfSk7XG59XG5cbi8qKlxuICogdmFsaWRhdGVzIHNpZ25hdHVyZXMgZm9yIGVhY2ggMiBvZiAzIGlucHV0IGFnYWluc3QgdXNlciwgYmFja3VwLCBiaXRnbyBrZXlzIGRlcml2ZWQgZnJvbSByb290V2FsbGV0S2V5cy5cbiAqIEByZXR1cm5zIGFycmF5IG9mIGlucHV0IGluZGV4IGFuZCBpdHMgW2lzIHZhbGlkIHVzZXIgc2lnIGV4aXN0LCBpcyB2YWxpZCBiYWNrdXAgc2lnIGV4aXN0LCBpcyB2YWxpZCB1c2VyIGJpdGdvIGV4aXN0XVxuICogRm9yIHAyc2hQMnBrIGlucHV0LCBbZmFsc2UsIGZhbHNlLCBmYWxzZV0gaXMgcmV0dXJuZWQgc2luY2UgaXQgaXMgbm90IGEgMiBvZiAzIHNpZyBpbnB1dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNpZ25hdHVyZVZhbGlkYXRpb25BcnJheVBzYnQocHNidDogVXR4b1BzYnQsIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyk6IFNpZ25hdHVyZVZhbGlkYXRpb25bXSB7XG4gIHJldHVybiBwc2J0LmRhdGEuaW5wdXRzLm1hcCgoaW5wdXQsIGkpID0+IHtcbiAgICBjb25zdCBzaWdWYWxBcnJheUZvcklucHV0OiBUcmlwbGU8Ym9vbGVhbj4gPVxuICAgICAgZ2V0UHNidElucHV0U2NyaXB0VHlwZShpbnB1dCkgPT09ICdwMnNoUDJwaydcbiAgICAgICAgPyBbZmFsc2UsIGZhbHNlLCBmYWxzZV1cbiAgICAgICAgOiBwc2J0LmdldFNpZ25hdHVyZVZhbGlkYXRpb25BcnJheShpLCB7IHJvb3ROb2Rlczogcm9vdFdhbGxldEtleXMudHJpcGxlIH0pO1xuICAgIHJldHVybiBbaSwgc2lnVmFsQXJyYXlGb3JJbnB1dF07XG4gIH0pO1xufVxuIl19
|
|
397
|
+
/**
|
|
398
|
+
* Extracts the half signed transaction from the psbt for p2ms based script types - p2sh, p2wsh, and p2shP2wsh.
|
|
399
|
+
* The purpose is to provide backward compatibility to keyternal (KRS) that only supports network transaction and p2ms script types.
|
|
400
|
+
*/
|
|
401
|
+
function extractP2msOnlyHalfSignedTx(psbt) {
|
|
402
|
+
assert(!!(psbt.data.inputs.length && psbt.data.outputs.length), 'empty inputs or outputs');
|
|
403
|
+
const tx = psbt.getUnsignedTx();
|
|
404
|
+
function isP2msParsedPsbtInput(parsed) {
|
|
405
|
+
return ['p2sh', 'p2shP2wsh', 'p2wsh'].includes(parsed.scriptType);
|
|
406
|
+
}
|
|
407
|
+
psbt.data.inputs.forEach((input, i) => {
|
|
408
|
+
var _a, _b;
|
|
409
|
+
const parsed = parsePsbtInput(input);
|
|
410
|
+
assert(isP2msParsedPsbtInput(parsed), `unsupported script type ${parsed.scriptType}`);
|
|
411
|
+
assert(((_a = input.partialSig) === null || _a === void 0 ? void 0 : _a.length) === 1, `unexpected signature count ${(_b = input.partialSig) === null || _b === void 0 ? void 0 : _b.length}`);
|
|
412
|
+
const [partialSig] = input.partialSig;
|
|
413
|
+
assert(input.sighashType !== undefined && input.sighashType === bitcoinjs_lib_1.script.signature.decode(partialSig.signature).hashType, 'signature sighash does not match input sighash type');
|
|
414
|
+
// type casting is to address the invalid type checking in payments.p2ms
|
|
415
|
+
const signatures = parsed.publicKeys.map((pk) => partialSig.pubkey.equals(pk) ? partialSig.signature : bitcoinjs_lib_1.opcodes.OP_0);
|
|
416
|
+
const isP2SH = !!parsed.redeemScript;
|
|
417
|
+
const isP2WSH = !!parsed.witnessScript;
|
|
418
|
+
const payment = index_1.payments.p2ms({ output: parsed.pubScript, signatures }, { validate: false, allowIncomplete: true });
|
|
419
|
+
const p2wsh = isP2WSH ? index_1.payments.p2wsh({ redeem: payment }) : undefined;
|
|
420
|
+
const p2sh = isP2SH ? index_1.payments.p2sh({ redeem: p2wsh || payment }) : undefined;
|
|
421
|
+
if (p2sh === null || p2sh === void 0 ? void 0 : p2sh.input) {
|
|
422
|
+
tx.setInputScript(i, p2sh.input);
|
|
423
|
+
}
|
|
424
|
+
if (p2wsh === null || p2wsh === void 0 ? void 0 : p2wsh.witness) {
|
|
425
|
+
tx.setWitness(i, p2wsh.witness);
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
return tx;
|
|
429
|
+
}
|
|
430
|
+
exports.extractP2msOnlyHalfSignedTx = extractP2msOnlyHalfSignedTx;
|
|
431
|
+
/**
|
|
432
|
+
* Clones the psbt without nonWitnessUtxo for non-segwit inputs and witnessUtxo is added instead.
|
|
433
|
+
* It is not BIP-174 compliant, so use it carefully.
|
|
434
|
+
*/
|
|
435
|
+
function clonePsbtWithoutNonWitnessUtxo(psbt) {
|
|
436
|
+
const newPsbt = (0, transaction_1.createPsbtFromHex)(psbt.toHex(), psbt.network);
|
|
437
|
+
const txInputs = psbt.txInputs;
|
|
438
|
+
psbt.data.inputs.forEach((input, i) => {
|
|
439
|
+
if (input.nonWitnessUtxo && !input.witnessUtxo) {
|
|
440
|
+
const tx = UtxoTransaction_1.UtxoTransaction.fromBuffer(input.nonWitnessUtxo, false, 'bigint', psbt.network);
|
|
441
|
+
if (!txInputs[i].hash.equals(tx.getHash())) {
|
|
442
|
+
throw new Error(`Non-witness UTXO hash for input #${i} doesn't match the hash specified in the prevout`);
|
|
443
|
+
}
|
|
444
|
+
newPsbt.data.inputs[i].witnessUtxo = tx.outs[txInputs[i].index];
|
|
445
|
+
}
|
|
446
|
+
delete newPsbt.data.inputs[i].nonWitnessUtxo;
|
|
447
|
+
});
|
|
448
|
+
return newPsbt;
|
|
449
|
+
}
|
|
450
|
+
exports.clonePsbtWithoutNonWitnessUtxo = clonePsbtWithoutNonWitnessUtxo;
|
|
451
|
+
/**
|
|
452
|
+
* Deletes witnessUtxo for non-segwit inputs to make the PSBT BIP-174 compliant.
|
|
453
|
+
*/
|
|
454
|
+
function deleteWitnessUtxoForNonSegwitInputs(psbt) {
|
|
455
|
+
psbt.data.inputs.forEach((input, i) => {
|
|
456
|
+
const scriptType = getPsbtInputScriptType(input);
|
|
457
|
+
if (scriptType === 'p2sh' || scriptType === 'p2shP2pk') {
|
|
458
|
+
delete input.witnessUtxo;
|
|
459
|
+
}
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
exports.deleteWitnessUtxoForNonSegwitInputs = deleteWitnessUtxoForNonSegwitInputs;
|
|
463
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvUHNidC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpQ0FBaUM7QUFHakMsZ0RBQXFEO0FBRXJELHVDQUF1QztBQUN2QywwQ0FBdUM7QUFDdkMsd0RBQXFEO0FBQ3JELG9EQU0wQjtBQUMxQiw2Q0FBaUU7QUFDakUsd0NBQW9EO0FBQ3BELGdEQUE4RTtBQUM5RSx1Q0FBMkQ7QUFFM0QsOENBZXVCO0FBQ3ZCLHNDQUF1RDtBQUN2RCxvQ0FBMkM7QUFDM0MsMkNBQTBEO0FBQzFELGlEQUEyRTtBQUMzRSx1Q0FBZ0Q7QUFDaEQsMENBQStFO0FBcUUvRSxTQUFTLGlCQUFpQixDQUFDLE1BQWMsRUFBRSxVQUE2QjtJQUN0RSxNQUFNLGdCQUFnQixHQUFHLElBQUEsK0JBQWtCLEVBQUMsTUFBTSxFQUFFLHdCQUF3QixDQUFDLENBQUMsVUFBVSxDQUFDO0lBQ3pGLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FDaEUsSUFBQSxnQ0FBZ0IsRUFBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQ3BELENBQUM7UUFDRixJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDZCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDMUY7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsYUFB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cG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgeyBHbG9iYWxYcHViLCBQYXJ0aWFsU2lnLCBQc2J0SW5wdXQsIFRhcFNjcmlwdFNpZyB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgY2hlY2tGb3JJbnB1dCB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnYmlwMzInO1xuaW1wb3J0ICogYXMgYnM1OGNoZWNrIGZyb20gJ2JzNThjaGVjayc7XG5pbXBvcnQgeyBVdHhvUHNidCB9IGZyb20gJy4uL1V0eG9Qc2J0JztcbmltcG9ydCB7IFV0eG9UcmFuc2FjdGlvbiB9IGZyb20gJy4uL1V0eG9UcmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBjcmVhdGVPdXRwdXRTY3JpcHQyb2YzLFxuICBnZXRMZWFmSGFzaCxcbiAgU2NyaXB0VHlwZTJPZjMsXG4gIHNjcmlwdFR5cGVGb3JDaGFpbixcbiAgdG9YT25seVB1YmxpY0tleSxcbn0gZnJvbSAnLi4vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyBEZXJpdmVkV2FsbGV0S2V5cywgUm9vdFdhbGxldEtleXMgfSBmcm9tICcuL1dhbGxldEtleXMnO1xuaW1wb3J0IHsgdG9QcmV2T3V0cHV0V2l0aFByZXZUeCB9IGZyb20gJy4uL1Vuc3BlbnQnO1xuaW1wb3J0IHsgY3JlYXRlUHNidEZyb21IZXgsIGNyZWF0ZVBzYnRGcm9tVHJhbnNhY3Rpb24gfSBmcm9tICcuLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBpc1dhbGxldFVuc3BlbnQsIFdhbGxldFVuc3BlbnQgfSBmcm9tICcuL1Vuc3BlbnQnO1xuXG5pbXBvcnQge1xuICBnZXRMZWFmVmVyc2lvbixcbiAgY2FsY3VsYXRlU2NyaXB0UGF0aExldmVsLFxuICBpc1ZhbGlkQ29udHJvbEJvY2ssXG4gIFBhcnNlZFB1YlNjcmlwdFAybXMsXG4gIFBhcnNlZFB1YlNjcmlwdFRhcHJvb3RTY3JpcHRQYXRoLFxuICBwYXJzZVB1YlNjcmlwdDJPZjMsXG4gIFBhcnNlZFB1YlNjcmlwdFRhcHJvb3QsXG4gIFBhcnNlZFB1YlNjcmlwdFRhcHJvb3RLZXlQYXRoLFxuICBwYXJzZVB1YlNjcmlwdCxcbiAgUGFyc2VkUHViU2NyaXB0UDJzaFAycGssXG4gIFBhcnNlZFNjcmlwdFR5cGUsXG4gIGlzUGxhY2Vob2xkZXJTaWduYXR1cmUsXG4gIHBhcnNlU2lnbmF0dXJlU2NyaXB0LFxuICBQYXJzZWRTY3JpcHRUeXBlMk9mMyxcbn0gZnJvbSAnLi4vcGFyc2VJbnB1dCc7XG5pbXBvcnQgeyBwYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyB9IGZyb20gJy4uL011c2lnMic7XG5pbXBvcnQgeyBpc1R1cGxlLCBUcmlwbGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVUYXByb290T3V0cHV0U2NyaXB0IH0gZnJvbSAnLi4vLi4vdGFwcm9vdCc7XG5pbXBvcnQgeyBvcGNvZGVzIGFzIG9wcywgc2NyaXB0IGFzIGJzY3JpcHQsIFR4SW5wdXQgfSBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCB7IG9wY29kZXMsIHBheW1lbnRzIH0gZnJvbSAnLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgZ2V0UHNidElucHV0U2lnbmF0dXJlQ291bnQsIGlzUHNidElucHV0RmluYWxpemVkIH0gZnJvbSAnLi4vUHNidFV0aWwnO1xuXG4vLyBvbmx5IHVzZWQgZm9yIGJ1aWxkaW5nIGBTaWduYXR1cmVDb250YWluZXJgXG50eXBlIEJhc2VTaWduYXR1cmVDb250YWluZXI8VD4gPSB7XG4gIHNpZ25hdHVyZXM6IFQ7XG59O1xuXG50eXBlIFVuc2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyID0gQmFzZVNpZ25hdHVyZUNvbnRhaW5lcjx1bmRlZmluZWQ+O1xudHlwZSBIYWxmU2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyID0gQmFzZVNpZ25hdHVyZUNvbnRhaW5lcjxbQnVmZmVyXT47XG50eXBlIEZ1bGxTaWduZWRTaWduYXR1cmVDb250YWluZXIgPSBCYXNlU2lnbmF0dXJlQ29udGFpbmVyPFtCdWZmZXIsIEJ1ZmZlcl0+O1xuXG50eXBlIFNpZ25hdHVyZUNvbnRhaW5lciA9IFVuc2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyIHwgSGFsZlNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lciB8IEZ1bGxTaWduZWRTaWduYXR1cmVDb250YWluZXI7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYSBwcmUtZmluYWxpemVkIFBTQlQgSW5wdXQgZm9yIHAydHJNdXNpZzIga2V5IHBhdGggaW4gdGhlIG5vbi1maW5hbGl6ZWQgc3RhdGUuXG4gKiBUIGlzIFtCdWZmZXJdIGZvciBmaXJzdCBzaWduYXR1cmUsIFtCdWZmZXIsIEJ1ZmZlcl0gZm9yIGJvdGggc2lnbmF0dXJlcyBhbmQgYHVuZGVmaW5lZGAgZm9yIG5vIHNpZ25hdHVyZXMuXG4gKi9cbnR5cGUgQmFzZVRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyPFQ+ID0ge1xuICBzaWduYXR1cmVzOiBUO1xuICAvKiogT25seSBjb250YWlucyBwYXJ0aWNpcGFudHMgdGhhdCBoYXZlIGFkZGVkIGEgc2lnbmF0dXJlICovXG4gIHBhcnRpY2lwYW50UHVibGljS2V5czogVDtcbn07XG5cbnR5cGUgVW5zaWduZWRUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lciA9IEJhc2VUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lcjx1bmRlZmluZWQ+O1xudHlwZSBIYWxmU2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXIgPSBCYXNlVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI8W0J1ZmZlcl0+O1xudHlwZSBGdWxsU2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXIgPSBCYXNlVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI8W0J1ZmZlciwgQnVmZmVyXT47XG5cbnR5cGUgVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXIgPVxuICB8IFVuc2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXJcbiAgfCBIYWxmU2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXJcbiAgfCBGdWxsU2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI7XG5cbi8qKlxuICogVG8gaG9sZCBwYXJzZWQgcHNidCBkYXRhIGZvciBwMm1zIGJhc2VkIHNjcmlwdCB0eXBlcyAtIHAyc2gsIHAyd3NoLCBhbmQgcDJzaFAyd3NoXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlZFBzYnRQMm1zID0gUGFyc2VkUHViU2NyaXB0UDJtcyAmIFNpZ25hdHVyZUNvbnRhaW5lcjtcblxuLyoqXG4gKiBUbyBob2xkIHBhcnNlZCBwc2J0IGRhdGEgZm9yIFRhcHJvb3RLZXlQYXRoU3BlbmQgc2NyaXB0IHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlZFBzYnRUYXByb290S2V5UGF0aCA9IFBhcnNlZFB1YlNjcmlwdFRhcHJvb3RLZXlQYXRoICYgVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI7XG5cbi8qKlxuICogVG8gaG9sZCBwYXJzZWQgcHNidCBkYXRhIGZvciBUYXByb290U2NyaXB0UGF0aFNwZW5kIHNjcmlwdCBwYXRoIHNjcmlwdCB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBQYXJzZWRQc2J0VGFwcm9vdFNjcmlwdFBhdGggPSBQYXJzZWRQdWJTY3JpcHRUYXByb290U2NyaXB0UGF0aCAmXG4gIFNpZ25hdHVyZUNvbnRhaW5lciAmIHtcbiAgICBjb250cm9sQmxvY2s6IEJ1ZmZlcjtcbiAgICBsZWFmVmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKiBJbmRpY2F0ZXMgdGhlIGxldmVsIGluc2lkZSB0aGUgdGFwdHJlZS4gKi9cbiAgICBzY3JpcHRQYXRoTGV2ZWw6IG51bWJlcjtcbiAgfTtcblxuZXhwb3J0IHR5cGUgUGFyc2VkUHNidFRhcHJvb3QgPSBQYXJzZWRQc2J0VGFwcm9vdEtleVBhdGggfCBQYXJzZWRQc2J0VGFwcm9vdFNjcmlwdFBhdGg7XG5cbnR5cGUgUDJzaFAycGtTaWduYXR1cmVDb250YWluZXIgPSBVbnNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lciB8IEhhbGZTaWduZWRTaWduYXR1cmVDb250YWluZXI7XG5cbmV4cG9ydCB0eXBlIFBhcnNlZFBzYnRQMnNoUDJwayA9IFBhcnNlZFB1YlNjcmlwdFAyc2hQMnBrICYgUDJzaFAycGtTaWduYXR1cmVDb250YWluZXI7XG5cbmludGVyZmFjZSBXYWxsZXRTaWduZXIge1xuICB3YWxsZXRLZXk6IEJJUDMySW50ZXJmYWNlO1xuICByb290S2V5OiBCSVAzMkludGVyZmFjZTtcbn1cblxuLyoqXG4gKiBwc2J0IGlucHV0IGluZGV4IGFuZCBpdHMgdXNlciwgYmFja3VwLCBiaXRnbyBzaWduYXR1cmVzIHN0YXR1c1xuICovXG5leHBvcnQgdHlwZSBTaWduYXR1cmVWYWxpZGF0aW9uID0gW2luZGV4OiBudW1iZXIsIHNpZ1RyaXBsZTogVHJpcGxlPGJvb2xlYW4+XTtcblxuZnVuY3Rpb24gZ2V0VGFwcm9vdFNpZ25lcnMoc2NyaXB0OiBCdWZmZXIsIHdhbGxldEtleXM6IERlcml2ZWRXYWxsZXRLZXlzKTogW1dhbGxldFNpZ25lciwgV2FsbGV0U2lnbmVyXSB7XG4gIGNvbnN0IHBhcnNlZFB1YmxpY0tleXMgPSBwYXJzZVB1YlNjcmlwdDJPZjMoc2NyaXB0LCAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpLnB1YmxpY0tleXM7XG4gIGNvbnN0IHdhbGxldFNpZ25lcnMgPSBwYXJzZWRQdWJsaWNLZXlzLm1hcCgocHVibGljS2V5KSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSB3YWxsZXRLZXlzLnB1YmxpY0tleXMuZmluZEluZGV4KCh3YWxsZXRQdWJsaWNLZXkpID0+XG4gICAgICB0b1hPbmx5UHVibGljS2V5KHdhbGxldFB1YmxpY0tleSkuZXF1YWxzKHB1YmxpY0tleSlcbiAgICApO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICByZXR1cm4geyB3YWxsZXRLZXk6IHdhbGxldEtleXMudHJpcGxlW2luZGV4XSwgcm9vdEtleTogd2FsbGV0S2V5cy5wYXJlbnQudHJpcGxlW2luZGV4XSB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcHJvb3QgcHVibGljIGtleSBpcyBub3QgYSB3YWxsZXQgcHVibGljIGtleScpO1xuICB9KTtcbiAgcmV0dXJuIFt3YWxsZXRTaWduZXJzWzBdLCB3YWxsZXRTaWduZXJzWzFdXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHNidElucHV0KFxuICBwc2J0OiBVdHhvUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICB1bnNwZW50OiBXYWxsZXRVbnNwZW50PGJpZ2ludD4sXG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5c1xuKTogdm9pZCB7XG4gIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dChwc2J0LmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgY29uc3Qgc2lnbmF0dXJlQ291bnQgPSBnZXRQc2J0SW5wdXRTaWduYXR1cmVDb3VudChpbnB1dCk7XG4gIGNvbnN0IHNjcmlwdFR5cGUgPSBzY3JpcHRUeXBlRm9yQ2hhaW4odW5zcGVudC5jaGFpbik7XG4gIGlmIChzaWduYXR1cmVDb3VudCA9PT0gMCAmJiBzY3JpcHRUeXBlID09PSAncDJ0cicpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgd2FsbGV0S2V5cyA9IHJvb3RXYWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgodW5zcGVudC5jaGFpbiwgdW5zcGVudC5pbmRleCk7XG5cbiAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnRyJykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dC50YXBMZWFmU2NyaXB0KSB8fCBpbnB1dC50YXBMZWFmU2NyaXB0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBTQlQgc3RhdGUuIE1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLicpO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQml0Z28gb25seSBzdXBwb3J0cyBhIHNpbmdsZSB0YXAgbGVhZiBzY3JpcHQgcGVyIGlucHV0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgW3NpZ25lciwgY29zaWduZXJdID0gZ2V0VGFwcm9vdFNpZ25lcnMoaW5wdXQudGFwTGVhZlNjcmlwdFswXS5zY3JpcHQsIHdhbGxldEtleXMpO1xuXG4gICAgY29uc3QgbGVhZkhhc2ggPSBnZXRMZWFmSGFzaCh7XG4gICAgICBwdWJsaWNLZXlzOiB3YWxsZXRLZXlzLnB1YmxpY0tleXMsXG4gICAgICBzaWduZXI6IHNpZ25lci53YWxsZXRLZXkucHVibGljS2V5LFxuICAgICAgY29zaWduZXI6IGNvc2lnbmVyLndhbGxldEtleS5wdWJsaWNLZXksXG4gICAgfSk7XG5cbiAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIHRhcEJpcDMyRGVyaXZhdGlvbjogW3NpZ25lciwgY29zaWduZXJdLm1hcCgod2FsbGV0U2lnbmVyKSA9PiAoe1xuICAgICAgICBsZWFmSGFzaGVzOiBbbGVhZkhhc2hdLFxuICAgICAgICBwdWJrZXk6IHRvWE9ubHlQdWJsaWNLZXkod2FsbGV0U2lnbmVyLndhbGxldEtleS5wdWJsaWNLZXkpLFxuICAgICAgICBwYXRoOiByb290V2FsbGV0S2V5cy5nZXREZXJpdmF0aW9uUGF0aCh3YWxsZXRTaWduZXIucm9vdEtleSwgdW5zcGVudC5jaGFpbiwgdW5zcGVudC5pbmRleCksXG4gICAgICAgIG1hc3RlckZpbmdlcnByaW50OiB3YWxsZXRTaWduZXIucm9vdEtleS5maW5nZXJwcmludCxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoc2lnbmF0dXJlQ291bnQgPT09IDApIHtcbiAgICAgIGNvbnN0IHsgd2l0bmVzc1NjcmlwdCwgcmVkZWVtU2NyaXB0IH0gPSBjcmVhdGVPdXRwdXRTY3JpcHQyb2YzKHdhbGxldEtleXMucHVibGljS2V5cywgc2NyaXB0VHlwZSk7XG4gICAgICBpZiAod2l0bmVzc1NjcmlwdCAmJiBwc2J0LmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdLndpdG5lc3NTY3JpcHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgd2l0bmVzc1NjcmlwdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWRlZW1TY3JpcHQgJiYgcHNidC5kYXRhLmlucHV0c1tpbnB1dEluZGV4XS5yZWRlZW1TY3JpcHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgcmVkZWVtU2NyaXB0IH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgYmlwMzJEZXJpdmF0aW9uOiBbMCwgMSwgMl0ubWFwKChpZHgpID0+ICh7XG4gICAgICAgIHB1YmtleTogd2FsbGV0S2V5cy50cmlwbGVbaWR4XS5wdWJsaWNLZXksXG4gICAgICAgIHBhdGg6IHdhbGxldEtleXMucGF0aHNbaWR4XSxcbiAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IHJvb3RXYWxsZXRLZXlzLnRyaXBsZVtpZHhdLmZpbmdlcnByaW50LFxuICAgICAgfSkpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQHJldHVybiBQU0JUIGZpbGxlZCB3aXRoIG1ldGF0ZGF0YSBhcyBwZXIgaW5wdXQgcGFyYW1zIHR4LCB1bnNwZW50cyBhbmQgcm9vdFdhbGxldEtleXMuXG4gKiBVbnNpZ25lZCBQU0JUIGZvciB0YXByb290IGlucHV0IHdpdGggd2l0bmVzc1V0eG9cbiAqIFVuc2lnbmVkIFBTQlQgZm9yIG90aGVyIGlucHV0IHdpdGggd2l0bmVzc1V0eG8vbm9uV2l0bmVzc1V0eG8sIHJlZGVlbVNjcmlwdC93aXRuZXNzU2NyaXB0LCBiaXAzMkRlcml2YXRpb25cbiAqIFNpZ25lZCBQU0JUIGZvciB0YXByb290IGlucHV0IHdpdGggd2l0bmVzc1V0eG8sIHRhcExlYWZTY3JpcHQsIHRhcEJpcDMyRGVyaXZhdGlvbiwgdGFwU2NyaXB0U2lnXG4gKiBTaWduZWQgUFNCVCBmb3Igb3RoZXIgaW5wdXQgd2l0aCB3aXRuZXNzVXR4by9ub25XaXRuZXNzVXR4bywgcmVkZWVtU2NyaXB0L3dpdG5lc3NTY3JpcHQsIGJpcDMyRGVyaXZhdGlvbiwgcGFydGlhbFNpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9XYWxsZXRQc2J0KFxuICB0eDogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4sXG4gIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PGJpZ2ludD5bXSxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzXG4pOiBVdHhvUHNidCB7XG4gIGNvbnN0IHByZXZPdXRwdXRzID0gdW5zcGVudHMubWFwKCh1KSA9PiB7XG4gICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKHNjcmlwdFR5cGVGb3JDaGFpbih1LmNoYWluKSwgJ3AydHJNdXNpZzInKTtcbiAgICByZXR1cm4gdG9QcmV2T3V0cHV0V2l0aFByZXZUeCh1LCB0eC5uZXR3b3JrKTtcbiAgfSk7XG4gIGNvbnN0IHBzYnQgPSBjcmVhdGVQc2J0RnJvbVRyYW5zYWN0aW9uKHR4LCBwcmV2T3V0cHV0cyk7XG4gIHVuc3BlbnRzLmZvckVhY2goKHUsIGkpID0+IHtcbiAgICBpZiAoaXNXYWxsZXRVbnNwZW50KHUpICYmIHUuaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXBkYXRlUHNidElucHV0KHBzYnQsIGksIHUsIHJvb3RXYWxsZXRLZXlzKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcHNidDtcbn1cblxuLyoqXG4gKiBAcGFyYW0gcHNidFxuICogQHBhcmFtIGlucHV0SW5kZXhcbiAqIEBwYXJhbSBzaWduZXJcbiAqIEBwYXJhbSB1bnNwZW50XG4gKiBAcmV0dXJuIHNpZ25lZCBQU0JUIHdpdGggc2lnbmVyJ3Mga2V5IGZvciB1bnNwZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduV2FsbGV0UHNidChcbiAgcHNidDogVXR4b1BzYnQsXG4gIGlucHV0SW5kZXg6IG51bWJlcixcbiAgc2lnbmVyOiBCSVAzMkludGVyZmFjZSxcbiAgdW5zcGVudDogV2FsbGV0VW5zcGVudDxiaWdpbnQ+XG4pOiB2b2lkIHtcbiAgY29uc3Qgc2NyaXB0VHlwZSA9IHNjcmlwdFR5cGVGb3JDaGFpbih1bnNwZW50LmNoYWluKTtcbiAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnRyJyB8fCBzY3JpcHRUeXBlID09PSAncDJ0ck11c2lnMicpIHtcbiAgICBwc2J0LnNpZ25UYXByb290SW5wdXRIRChpbnB1dEluZGV4LCBzaWduZXIpO1xuICB9IGVsc2Uge1xuICAgIHBzYnQuc2lnbklucHV0SEQoaW5wdXRJbmRleCwgc2lnbmVyKTtcbiAgfVxufVxuXG4vKipcbiAqIEByZXR1cm5zIHNjcmlwdCB0eXBlIG9mIHRoZSBpbnB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHNidElucHV0U2NyaXB0VHlwZShpbnB1dDogUHNidElucHV0KTogUGFyc2VkU2NyaXB0VHlwZSB7XG4gIGNvbnN0IGlzUDJwayA9IChzY3JpcHQ6IEJ1ZmZlcikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjaHVua3MgPSBic2NyaXB0LmRlY29tcGlsZShzY3JpcHQpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2h1bmtzPy5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgQnVmZmVyLmlzQnVmZmVyKGNodW5rc1swXSkgJiZcbiAgICAgICAgYnNjcmlwdC5pc0Nhbm9uaWNhbFB1YktleShjaHVua3NbMF0pICYmXG4gICAgICAgIGNodW5rc1sxXSA9PT0gb3Bjb2Rlcy5PUF9DSEVDS1NJR1xuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBsZXQgc2NyaXB0VHlwZTogUGFyc2VkU2NyaXB0VHlwZSB8IHVuZGVmaW5lZDtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpbnB1dC5yZWRlZW1TY3JpcHQpICYmIEJ1ZmZlci5pc0J1ZmZlcihpbnB1dC53aXRuZXNzU2NyaXB0KSkge1xuICAgIHNjcmlwdFR5cGUgPSAncDJzaFAyd3NoJztcbiAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoaW5wdXQucmVkZWVtU2NyaXB0KSkge1xuICAgIHNjcmlwdFR5cGUgPSBpc1AycGsoaW5wdXQucmVkZWVtU2NyaXB0KSA/ICdwMnNoUDJwaycgOiAncDJzaCc7XG4gIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKGlucHV0LndpdG5lc3NTY3JpcHQpKSB7XG4gICAgc2NyaXB0VHlwZSA9ICdwMndzaCc7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQudGFwTGVhZlNjcmlwdCkgJiYgaW5wdXQudGFwTGVhZlNjcmlwdC5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHNjcmlwdFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgYm90aCAke3NjcmlwdFR5cGV9IGFuZCB0YXByb290U2NyaXB0UGF0aCBQU0JUIG1ldGFkYXRhLmApO1xuICAgIH1cbiAgICBpZiAoaW5wdXQudGFwTGVhZlNjcmlwdC5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JpdGdvIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgdGFwIGxlYWYgc2NyaXB0IHBlciBpbnB1dC4nKTtcbiAgICB9XG4gICAgc2NyaXB0VHlwZSA9ICd0YXByb290U2NyaXB0UGF0aFNwZW5kJztcbiAgfVxuICBpZiAoaW5wdXQudGFwSW50ZXJuYWxLZXkpIHtcbiAgICBpZiAoc2NyaXB0VHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCBib3RoICR7c2NyaXB0VHlwZX0gYW5kIHRhcHJvb3RLZXlQYXRoIFBTQlQgbWV0YWRhdGEuYCk7XG4gICAgfVxuICAgIHNjcmlwdFR5cGUgPSAndGFwcm9vdEtleVBhdGhTcGVuZCc7XG4gIH1cbiAgaWYgKHNjcmlwdFR5cGUpIHtcbiAgICByZXR1cm4gc2NyaXB0VHlwZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCBwYXJzZSBpbnB1dCcpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlcyhpbnB1dDogUHNidElucHV0KTogVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXIge1xuICBjb25zdCBwYXJ0aWFsU2lncyA9IHBhcnNlUHNidE11c2lnMlBhcnRpYWxTaWdzKGlucHV0KTtcbiAgaWYgKCFwYXJ0aWFsU2lncykge1xuICAgIHJldHVybiB7IHNpZ25hdHVyZXM6IHVuZGVmaW5lZCwgcGFydGljaXBhbnRQdWJsaWNLZXlzOiB1bmRlZmluZWQgfTtcbiAgfVxuICBjb25zdCBzaWduYXR1cmVzID0gcGFydGlhbFNpZ3MubWFwKChwU2lnKSA9PiBwU2lnLnBhcnRpYWxTaWcpO1xuICBjb25zdCBwYXJ0aWNpcGFudFB1YmxpY0tleXMgPSBwYXJ0aWFsU2lncy5tYXAoKHBTaWcpID0+IHBTaWcucGFydGljaXBhbnRQdWJLZXkpO1xuICByZXR1cm4gaXNUdXBsZTxCdWZmZXI+KHNpZ25hdHVyZXMpICYmIGlzVHVwbGU8QnVmZmVyPihwYXJ0aWNpcGFudFB1YmxpY0tleXMpXG4gICAgPyB7IHNpZ25hdHVyZXMsIHBhcnRpY2lwYW50UHVibGljS2V5cyB9XG4gICAgOiB7IHNpZ25hdHVyZXM6IFtzaWduYXR1cmVzWzBdXSwgcGFydGljaXBhbnRQdWJsaWNLZXlzOiBbcGFydGljaXBhbnRQdWJsaWNLZXlzWzBdXSB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVBhcnRpYWxPclRhcFNjcmlwdFNpZ25hdHVyZXMoc2lnOiBQYXJ0aWFsU2lnW10gfCBUYXBTY3JpcHRTaWdbXSB8IHVuZGVmaW5lZCk6IFNpZ25hdHVyZUNvbnRhaW5lciB7XG4gIGlmICghc2lnPy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyBzaWduYXR1cmVzOiB1bmRlZmluZWQgfTtcbiAgfVxuICBpZiAoc2lnLmxlbmd0aCA+IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgc2lnbmF0dXJlIGNvdW50Jyk7XG4gIH1cbiAgY29uc3Qgc2lnbmF0dXJlcyA9IHNpZy5tYXAoKHRTaWcpID0+IHRTaWcuc2lnbmF0dXJlKTtcbiAgcmV0dXJuIGlzVHVwbGU8QnVmZmVyPihzaWduYXR1cmVzKSA/IHsgc2lnbmF0dXJlcyB9IDogeyBzaWduYXR1cmVzOiBbc2lnbmF0dXJlc1swXV0gfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTaWduYXR1cmVzKFxuICBpbnB1dDogUHNidElucHV0LFxuICBzY3JpcHRUeXBlOiBQYXJzZWRTY3JpcHRUeXBlXG4pOiBTaWduYXR1cmVDb250YWluZXIgfCBUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lciB7XG4gIHJldHVybiBzY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCdcbiAgICA/IHBhcnNlVGFwcm9vdEtleVBhdGhTaWduYXR1cmVzKGlucHV0KVxuICAgIDogc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnXG4gICAgPyBwYXJzZVBhcnRpYWxPclRhcFNjcmlwdFNpZ25hdHVyZXMoaW5wdXQudGFwU2NyaXB0U2lnKVxuICAgIDogcGFyc2VQYXJ0aWFsT3JUYXBTY3JpcHRTaWduYXR1cmVzKGlucHV0LnBhcnRpYWxTaWcpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVNjcmlwdChcbiAgaW5wdXQ6IFBzYnRJbnB1dCxcbiAgc2NyaXB0VHlwZTogUGFyc2VkU2NyaXB0VHlwZVxuKTogUGFyc2VkUHViU2NyaXB0UDJtcyB8IFBhcnNlZFB1YlNjcmlwdFRhcHJvb3QgfCBQYXJzZWRQdWJTY3JpcHRQMnNoUDJwayB7XG4gIGxldCBwdWJTY3JpcHQ6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnNoJyB8fCBzY3JpcHRUeXBlID09PSAncDJzaFAycGsnKSB7XG4gICAgcHViU2NyaXB0ID0gaW5wdXQucmVkZWVtU2NyaXB0O1xuICB9IGVsc2UgaWYgKHNjcmlwdFR5cGUgPT09ICdwMndzaCcgfHwgc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMndzaCcpIHtcbiAgICBwdWJTY3JpcHQgPSBpbnB1dC53aXRuZXNzU2NyaXB0O1xuICB9IGVsc2UgaWYgKHNjcmlwdFR5cGUgPT09ICd0YXByb290U2NyaXB0UGF0aFNwZW5kJykge1xuICAgIHB1YlNjcmlwdCA9IGlucHV0LnRhcExlYWZTY3JpcHQgPyBpbnB1dC50YXBMZWFmU2NyaXB0WzBdLnNjcmlwdCA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChzY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcpIHtcbiAgICBpZiAoaW5wdXQud2l0bmVzc1V0eG8/LnNjcmlwdCkge1xuICAgICAgcHViU2NyaXB0ID0gaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0O1xuICAgIH0gZWxzZSBpZiAoaW5wdXQudGFwSW50ZXJuYWxLZXkgJiYgaW5wdXQudGFwTWVya2xlUm9vdCkge1xuICAgICAgcHViU2NyaXB0ID0gY3JlYXRlVGFwcm9vdE91dHB1dFNjcmlwdCh7IGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSwgdGFwdHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QgfSk7XG4gICAgfVxuICB9XG4gIGlmICghcHViU2NyaXB0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFBTQlQgc3RhdGUgZm9yICR7c2NyaXB0VHlwZX0uIE1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLmApO1xuICB9XG4gIHJldHVybiBwYXJzZVB1YlNjcmlwdChwdWJTY3JpcHQsIHNjcmlwdFR5cGUpO1xufVxuXG4vKipcbiAqIEByZXR1cm4gcHNidCBtZXRhZGF0YSBhcmUgcGFyc2VkIGFzIHBlciBiZWxvdyBjb25kaXRpb25zLlxuICogcmVkZWVtU2NyaXB0L3dpdG5lc3NTY3JpcHQvdGFwTGVhZlNjcmlwdCBtYXRjaGVzIEJpdEdvLlxuICogc2lnbmF0dXJlIGFuZCBwdWJsaWMga2V5IGNvdW50IG1hdGNoZXMgQml0R28uXG4gKiBQMlNILVAyUEsgPT4gc2NyaXB0VHlwZSwgcmVkZWVtU2NyaXB0LCBwdWJsaWMga2V5LCBzaWduYXR1cmUuXG4gKiBQMlNIID0+IHNjcmlwdFR5cGUsIHJlZGVlbVNjcmlwdCwgcHVibGljIGtleXMsIHNpZ25hdHVyZXMuXG4gKiBQVzJTSCA9PiBzY3JpcHRUeXBlLCB3aXRuZXNzU2NyaXB0LCBwdWJsaWMga2V5cywgc2lnbmF0dXJlcy5cbiAqIFAyU0gtUFcyU0ggPT4gc2NyaXB0VHlwZSwgcmVkZWVtU2NyaXB0LCB3aXRuZXNzU2NyaXB0LCBwdWJsaWMga2V5cywgc2lnbmF0dXJlcy5cbiAqIFAyVFIgYW5kIFAyVFIgTVVTSUcyIHNjcmlwdCBwYXRoID0+IHNjcmlwdFR5cGUgKHRhcHJvb3RTY3JpcHRQYXRoU3BlbmQpLCBwdWJTY3JpcHQgKGxlYWYgc2NyaXB0KSwgY29udHJvbEJsb2NrLFxuICogc2NyaXB0UGF0aExldmVsLCBsZWFmVmVyc2lvbiwgcHVibGljIGtleXMsIHNpZ25hdHVyZXMuXG4gKiBQMlRSIE1VU0lHMiBrZXAgcGF0aCA9PiBzY3JpcHRUeXBlICh0YXByb290S2V5UGF0aFNwZW5kKSwgcHViU2NyaXB0IChzY3JpcHRQdWJLZXkpLCBwYXJ0aWNpcGFudCBwdWIga2V5cyAoc2lnbmVyKSxcbiAqIHB1YmxpYyBrZXkgKHRhcE91dHB1dGtleSksIHNpZ25hdHVyZXMgKHBhcnRpYWwgc2lnbmVyIHNpZ3MpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQc2J0SW5wdXQoaW5wdXQ6IFBzYnRJbnB1dCk6IFBhcnNlZFBzYnRQMm1zIHwgUGFyc2VkUHNidFRhcHJvb3QgfCBQYXJzZWRQc2J0UDJzaFAycGsge1xuICBpZiAoaXNQc2J0SW5wdXRGaW5hbGl6ZWQoaW5wdXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaW5hbGl6ZWQgUFNCVCBwYXJzaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgfVxuICBjb25zdCBzY3JpcHRUeXBlID0gZ2V0UHNidElucHV0U2NyaXB0VHlwZShpbnB1dCk7XG4gIGNvbnN0IHBhcnNlZFB1YlNjcmlwdCA9IHBhcnNlU2NyaXB0KGlucHV0LCBzY3JpcHRUeXBlKTtcbiAgY29uc3Qgc2lnbmF0dXJlcyA9IHBhcnNlU2lnbmF0dXJlcyhpbnB1dCwgc2NyaXB0VHlwZSk7XG5cbiAgaWYgKHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgJiYgJ3BhcnRpY2lwYW50UHVibGljS2V5cycgaW4gc2lnbmF0dXJlcykge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5wYXJzZWRQdWJTY3JpcHQsXG4gICAgICAuLi5zaWduYXR1cmVzLFxuICAgIH07XG4gIH1cbiAgaWYgKHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlID09PSAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpIHtcbiAgICBpZiAoIWlucHV0LnRhcExlYWZTY3JpcHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBQU0JUIHN0YXRlIGZvciB0YXByb290U2NyaXB0UGF0aFNwZW5kLiBNaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4nKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbEJsb2NrID0gaW5wdXQudGFwTGVhZlNjcmlwdFswXS5jb250cm9sQmxvY2s7XG4gICAgaWYgKCFpc1ZhbGlkQ29udHJvbEJvY2soY29udHJvbEJsb2NrKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBTQlQgdGFwcm9vdFNjcmlwdFBhdGhTcGVuZCBjb250cm9sQmxvY2suJyk7XG4gICAgfVxuICAgIGNvbnN0IHNjcmlwdFBhdGhMZXZlbCA9IGNhbGN1bGF0ZVNjcmlwdFBhdGhMZXZlbChjb250cm9sQmxvY2spO1xuICAgIGNvbnN0IGxlYWZWZXJzaW9uID0gZ2V0TGVhZlZlcnNpb24oY29udHJvbEJsb2NrKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucGFyc2VkUHViU2NyaXB0LFxuICAgICAgLi4uc2lnbmF0dXJlcyxcbiAgICAgIGNvbnRyb2xCbG9jayxcbiAgICAgIHNjcmlwdFBhdGhMZXZlbCxcbiAgICAgIGxlYWZWZXJzaW9uLFxuICAgIH07XG4gIH1cbiAgaWYgKFxuICAgIHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlID09PSAncDJzaCcgfHxcbiAgICBwYXJzZWRQdWJTY3JpcHQuc2NyaXB0VHlwZSA9PT0gJ3Ayd3NoJyB8fFxuICAgIHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlID09PSAncDJzaFAyd3NoJ1xuICApIHtcbiAgICBpZiAocGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICdwMnNoUDJ3c2gnKSB7XG4gICAgICBwYXJzZWRQdWJTY3JpcHQucmVkZWVtU2NyaXB0ID0gaW5wdXQucmVkZWVtU2NyaXB0O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucGFyc2VkUHViU2NyaXB0LFxuICAgICAgLi4uc2lnbmF0dXJlcyxcbiAgICB9O1xuICB9XG4gIGlmIChwYXJzZWRQdWJTY3JpcHQuc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMnBrJyAmJiAoIXNpZ25hdHVyZXMuc2lnbmF0dXJlcyB8fCAhaXNUdXBsZShzaWduYXR1cmVzLnNpZ25hdHVyZXMpKSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5wYXJzZWRQdWJTY3JpcHQsXG4gICAgICBzaWduYXR1cmVzOiBzaWduYXR1cmVzLnNpZ25hdHVyZXMsXG4gICAgfTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHViIHNjcmlwdCcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgcGFyc2VkIHNjcmlwdCB0eXBlIGludG8gYW4gYXJyYXkgb2Ygc2NyaXB0IHR5cGVzLlxuICogQHBhcmFtIHBhcnNlZFNjcmlwdFR5cGUgLSBUaGUgcGFyc2VkIHNjcmlwdCB0eXBlLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgU2NyaXB0VHlwZTJPZjMgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhcnNlZCBzY3JpcHQgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU2NyaXB0VHlwZTJPZjNzKHBhcnNlZFNjcmlwdFR5cGU6IFBhcnNlZFNjcmlwdFR5cGUyT2YzKTogU2NyaXB0VHlwZTJPZjNbXSB7XG4gIHJldHVybiBwYXJzZWRTY3JpcHRUeXBlID09PSAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCdcbiAgICA/IFsncDJ0ck11c2lnMicsICdwMnRyJ11cbiAgICA6IHBhcnNlZFNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJ1xuICAgID8gWydwMnRyTXVzaWcyJ11cbiAgICA6IFtwYXJzZWRTY3JpcHRUeXBlXTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBzdHJpY3RseSBwYXJzZSB0aGUgaW5wdXQgYW5kIGdldCBzaWduYXR1cmUgY291bnQuXG4gKiB1bnNpZ25lZCgwKSwgaGFsZi1zaWduZWQoMSkgb3IgZnVsbHktc2lnbmVkKDIpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJpY3RTaWduYXR1cmVDb3VudChpbnB1dDogVHhJbnB1dCB8IFBzYnRJbnB1dCk6IDAgfCAxIHwgMiB7XG4gIGNvbnN0IGNhbGN1bGF0ZVNpZ25hdHVyZUNvdW50ID0gKFxuICAgIHNpZ25hdHVyZXM6IFtCdWZmZXIgfCAwLCBCdWZmZXIgfCAwLCBCdWZmZXIgfCAwXSB8IFtCdWZmZXIsIEJ1ZmZlcl0gfCBbQnVmZmVyXSB8IHVuZGVmaW5lZFxuICApOiAwIHwgMSB8IDIgPT4ge1xuICAgIGNvbnN0IGNvdW50ID0gc2lnbmF0dXJlcyA/IHNpZ25hdHVyZXMuZmlsdGVyKChzKSA9PiAhaXNQbGFjZWhvbGRlclNpZ25hdHVyZShzKSkubGVuZ3RoIDogMDtcbiAgICBpZiAoY291bnQgPT09IDAgfHwgY291bnQgPT09IDEgfHwgY291bnQgPT09IDIpIHtcbiAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZSBjb3VudCcpO1xuICB9O1xuXG4gIGlmICgnaGFzaCcgaW4gaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQuc2NyaXB0Py5sZW5ndGggfHwgaW5wdXQud2l0bmVzcz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBwYXJzZWRJbnB1dCA9IHBhcnNlU2lnbmF0dXJlU2NyaXB0KGlucHV0KTtcbiAgICAgIHJldHVybiBwYXJzZWRJbnB1dC5zY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgPyAyIDogY2FsY3VsYXRlU2lnbmF0dXJlQ291bnQocGFyc2VkSW5wdXQuc2lnbmF0dXJlcyk7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjYWxjdWxhdGVTaWduYXR1cmVDb3VudChwYXJzZVBzYnRJbnB1dChpbnB1dCkuc2lnbmF0dXJlcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcmV0dXJucyBzdHJpY3RseSBwYXJzZSBpbnB1dCBhbmQgZ2V0IHNpZ25hdHVyZSBjb3VudCBmb3IgYWxsIGlucHV0cy5cbiAqIDA9dW5zaWduZWQsIDE9aGFsZi1zaWduZWQgb3IgMj1mdWxseS1zaWduZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmljdFNpZ25hdHVyZUNvdW50cyhcbiAgdHg6IFV0eG9Qc2J0IHwgVXR4b1RyYW5zYWN0aW9uPG51bWJlciB8IGJpZ2ludD4gfCBQc2J0SW5wdXRbXSB8IFR4SW5wdXRbXVxuKTogKDAgfCAxIHwgMilbXSB7XG4gIGNvbnN0IGlucHV0cyA9IHR4IGluc3RhbmNlb2YgVXR4b1BzYnQgPyB0eC5kYXRhLmlucHV0cyA6IHR4IGluc3RhbmNlb2YgVXR4b1RyYW5zYWN0aW9uID8gdHguaW5zIDogdHg7XG4gIHJldHVybiBpbnB1dHMubWFwKChpbnB1dCwgXykgPT4gZ2V0U3RyaWN0U2lnbmF0dXJlQ291bnQoaW5wdXQpKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHRydWUgaWZmIGlucHV0cyBhcnJheSBpcyBvZiBQc2J0SW5wdXRUeXBlIHR5cGVcbiAqICovXG5leHBvcnQgZnVuY3Rpb24gaXNQc2J0SW5wdXRBcnJheShpbnB1dHM6IFBzYnRJbnB1dFtdIHwgVHhJbnB1dFtdKTogaW5wdXRzIGlzIFBzYnRJbnB1dFtdIHtcbiAgcmV0dXJuICFpc1R4SW5wdXRBcnJheShpbnB1dHMpO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdHJ1ZSBpZmYgaW5wdXRzIGFycmF5IGlzIG9mIFR4SW5wdXQgdHlwZVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1R4SW5wdXRBcnJheShpbnB1dHM6IFBzYnRJbnB1dFtdIHwgVHhJbnB1dFtdKTogaW5wdXRzIGlzIFR4SW5wdXRbXSB7XG4gIGFzc2VydCghIWlucHV0cy5sZW5ndGgsICdlbXB0eSBpbnB1dHMgYXJyYXknKTtcbiAgcmV0dXJuICdoYXNoJyBpbiBpbnB1dHNbMF07XG59XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZmYgZ2l2ZW4gcHNidC90cmFuc2FjdGlvbi90eC1pbnB1dC1hcnJheS9wc2J0LWlucHV0LWFycmF5IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB0YXByb290IGtleSBwYXRoIHNwZW5kIGlucHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZElucHV0KFxuICBkYXRhOiBVdHhvUHNidCB8IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQgfCBudW1iZXI+IHwgUHNidElucHV0W10gfCBUeElucHV0W11cbik6IGJvb2xlYW4ge1xuICBjb25zdCBpbnB1dHMgPSBkYXRhIGluc3RhbmNlb2YgVXR4b1BzYnQgPyBkYXRhLmRhdGEuaW5wdXRzIDogZGF0YSBpbnN0YW5jZW9mIFV0eG9UcmFuc2FjdGlvbiA/IGRhdGEuaW5zIDogZGF0YTtcbiAgaWYgKCFpbnB1dHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChpc1BzYnRJbnB1dEFycmF5KGlucHV0cykpIHtcbiAgICByZXR1cm4gaW5wdXRzLnNvbWUoKGlucHV0LCBfKSA9PiBnZXRQc2J0SW5wdXRTY3JpcHRUeXBlKGlucHV0KSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnKTtcbiAgfVxuICByZXR1cm4gaW5wdXRzLnNvbWUoKGlucHV0LCBfKSA9PiB7XG4gICAgLy8gSWYgdGhlIGlucHV0IGlzIG5vdCBzaWduZWQsIGl0IGNhbm5vdCBiZSBhIHRhcHJvb3RLZXlQYXRoU3BlbmQgaW5wdXQgYmVjYXVzZSB5b3UgY2FuIG9ubHlcbiAgICAvLyBleHRyYWN0IGEgZnVsbHkgc2lnbmVkIHBzYnQgaW50byBhIHRyYW5zYWN0aW9uIHdpdGggdGFwcm9vdEtleVBhdGhTcGVuZCBpbnB1dHMuXG4gICAgaWYgKGdldFN0cmljdFNpZ25hdHVyZUNvdW50KGlucHV0KSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VTaWduYXR1cmVTY3JpcHQoaW5wdXQpLnNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJztcbiAgfSk7XG59XG5cbi8qKlxuICogU2V0IHRoZSBSb290V2FsbGV0S2V5cyBhcyB0aGUgZ2xvYmFsWHB1YnMgb24gdGhlIHBzYnRcbiAqXG4gKiBXZSBkbyBhbGwgdGhlIG1hdGNoaW5nIG9mIHRoZSAodGFwKWJpcDMyRGVyaXZhdGlvbnMgbWFzdGVyRmluZ2VycHJpbnQgdG8gdGhlIGZpbmdlcnByaW50IG9mIHRoZVxuICogZXh0ZW5kZWRQdWJrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRYcHVic1RvUHNidChwc2J0OiBVdHhvUHNidCwgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzKTogdm9pZCB7XG4gIGNvbnN0IHNhZmVSb290V2FsbGV0S2V5cyA9IG5ldyBSb290V2FsbGV0S2V5cyhcbiAgICByb290V2FsbGV0S2V5cy50cmlwbGUubWFwKChiaXAzMikgPT4gYmlwMzIubmV1dGVyZWQoKSkgYXMgVHJpcGxlPEJJUDMySW50ZXJmYWNlPixcbiAgICByb290V2FsbGV0S2V5cy5kZXJpdmF0aW9uUHJlZml4ZXNcbiAgKTtcbiAgY29uc3QgeFB1YnMgPSBzYWZlUm9vdFdhbGxldEtleXMudHJpcGxlLm1hcChcbiAgICAoYmlwMzIpOiBHbG9iYWxYcHViID0+ICh7XG4gICAgICBleHRlbmRlZFB1YmtleTogYnM1OGNoZWNrLmRlY29kZShiaXAzMi50b0Jhc2U1OCgpKSxcbiAgICAgIG1hc3RlckZpbmdlcnByaW50OiBiaXAzMi5maW5nZXJwcmludCxcbiAgICAgIC8vIFRPRE86IEJHLTczNzk3IC0gYmlwMTc0IGN1cnJlbnRseSByZXF1aXJlcyBtIHByZWZpeCBmb3IgdGhpcyB0byBiZSBhIHZhbGlkIGdsb2JhbFhwdWJcbiAgICAgIHBhdGg6ICdtJyxcbiAgICB9KVxuICApO1xuICBwc2J0LnVwZGF0ZUdsb2JhbCh7IGdsb2JhbFhwdWI6IHhQdWJzIH0pO1xufVxuXG4vKipcbiAqIHZhbGlkYXRlcyBzaWduYXR1cmVzIGZvciBlYWNoIDIgb2YgMyBpbnB1dCBhZ2FpbnN0IHVzZXIsIGJhY2t1cCwgYml0Z28ga2V5cyBkZXJpdmVkIGZyb20gcm9vdFdhbGxldEtleXMuXG4gKiBAcmV0dXJucyBhcnJheSBvZiBpbnB1dCBpbmRleCBhbmQgaXRzIFtpcyB2YWxpZCB1c2VyIHNpZyBleGlzdCwgaXMgdmFsaWQgYmFja3VwIHNpZyBleGlzdCwgaXMgdmFsaWQgdXNlciBiaXRnbyBleGlzdF1cbiAqIEZvciBwMnNoUDJwayBpbnB1dCwgW2ZhbHNlLCBmYWxzZSwgZmFsc2VdIGlzIHJldHVybmVkIHNpbmNlIGl0IGlzIG5vdCBhIDIgb2YgMyBzaWcgaW5wdXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaWduYXR1cmVWYWxpZGF0aW9uQXJyYXlQc2J0KHBzYnQ6IFV0eG9Qc2J0LCByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMpOiBTaWduYXR1cmVWYWxpZGF0aW9uW10ge1xuICByZXR1cm4gcHNidC5kYXRhLmlucHV0cy5tYXAoKGlucHV0LCBpKSA9PiB7XG4gICAgY29uc3Qgc2lnVmFsQXJyYXlGb3JJbnB1dDogVHJpcGxlPGJvb2xlYW4+ID1cbiAgICAgIGdldFBzYnRJbnB1dFNjcmlwdFR5cGUoaW5wdXQpID09PSAncDJzaFAycGsnXG4gICAgICAgID8gW2ZhbHNlLCBmYWxzZSwgZmFsc2VdXG4gICAgICAgIDogcHNidC5nZXRTaWduYXR1cmVWYWxpZGF0aW9uQXJyYXkoaSwgeyByb290Tm9kZXM6IHJvb3RXYWxsZXRLZXlzLnRyaXBsZSB9KTtcbiAgICByZXR1cm4gW2ksIHNpZ1ZhbEFycmF5Rm9ySW5wdXRdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgaGFsZiBzaWduZWQgdHJhbnNhY3Rpb24gZnJvbSB0aGUgcHNidCBmb3IgcDJtcyBiYXNlZCBzY3JpcHQgdHlwZXMgLSBwMnNoLCBwMndzaCwgYW5kIHAyc2hQMndzaC5cbiAqIFRoZSBwdXJwb3NlIGlzIHRvIHByb3ZpZGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0byBrZXl0ZXJuYWwgKEtSUykgdGhhdCBvbmx5IHN1cHBvcnRzIG5ldHdvcmsgdHJhbnNhY3Rpb24gYW5kIHAybXMgc2NyaXB0IHR5cGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFAybXNPbmx5SGFsZlNpZ25lZFR4KHBzYnQ6IFV0eG9Qc2J0KTogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICBhc3NlcnQoISEocHNidC5kYXRhLmlucHV0cy5sZW5ndGggJiYgcHNidC5kYXRhLm91dHB1dHMubGVuZ3RoKSwgJ2VtcHR5IGlucHV0cyBvciBvdXRwdXRzJyk7XG4gIGNvbnN0IHR4ID0gcHNidC5nZXRVbnNpZ25lZFR4KCk7XG5cbiAgZnVuY3Rpb24gaXNQMm1zUGFyc2VkUHNidElucHV0KFxuICAgIHBhcnNlZDogUGFyc2VkUHNidFAybXMgfCBQYXJzZWRQc2J0VGFwcm9vdCB8IFBhcnNlZFBzYnRQMnNoUDJwa1xuICApOiBwYXJzZWQgaXMgUGFyc2VkUHNidFAybXMge1xuICAgIHJldHVybiBbJ3Ayc2gnLCAncDJzaFAyd3NoJywgJ3Ayd3NoJ10uaW5jbHVkZXMocGFyc2VkLnNjcmlwdFR5cGUpO1xuICB9XG5cbiAgcHNidC5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlUHNidElucHV0KGlucHV0KTtcbiAgICBhc3NlcnQoaXNQMm1zUGFyc2VkUHNidElucHV0KHBhcnNlZCksIGB1bnN1cHBvcnRlZCBzY3JpcHQgdHlwZSAke3BhcnNlZC5zY3JpcHRUeXBlfWApO1xuICAgIGFzc2VydChpbnB1dC5wYXJ0aWFsU2lnPy5sZW5ndGggPT09IDEsIGB1bmV4cGVjdGVkIHNpZ25hdHVyZSBjb3VudCAke2lucHV0LnBhcnRpYWxTaWc/Lmxlbmd0aH1gKTtcbiAgICBjb25zdCBbcGFydGlhbFNpZ10gPSBpbnB1dC5wYXJ0aWFsU2lnO1xuICAgIGFzc2VydChcbiAgICAgIGlucHV0LnNpZ2hhc2hUeXBlICE9PSB1bmRlZmluZWQgJiYgaW5wdXQuc2lnaGFzaFR5cGUgPT09IGJzY3JpcHQuc2lnbmF0dXJlLmRlY29kZShwYXJ0aWFsU2lnLnNpZ25hdHVyZSkuaGFzaFR5cGUsXG4gICAgICAnc2lnbmF0dXJlIHNpZ2hhc2ggZG9lcyBub3QgbWF0Y2ggaW5wdXQgc2lnaGFzaCB0eXBlJ1xuICAgICk7XG5cbiAgICAvLyB0eXBlIGNhc3RpbmcgaXMgdG8gYWRkcmVzcyB0aGUgaW52YWxpZCB0eXBlIGNoZWNraW5nIGluIHBheW1lbnRzLnAybXNcbiAgICBjb25zdCBzaWduYXR1cmVzID0gcGFyc2VkLnB1YmxpY0tleXMubWFwKChwaykgPT5cbiAgICAgIHBhcnRpYWxTaWcucHVia2V5LmVxdWFscyhwaykgPyBwYXJ0aWFsU2lnLnNpZ25hdHVyZSA6IChvcHMuT1BfMCBhcyB1bmtub3duIGFzIEJ1ZmZlcilcbiAgICApO1xuXG4gICAgY29uc3QgaXNQMlNIID0gISFwYXJzZWQucmVkZWVtU2NyaXB0O1xuICAgIGNvbnN0IGlzUDJXU0ggPSAhIXBhcnNlZC53aXRuZXNzU2NyaXB0O1xuXG4gICAgY29uc3QgcGF5bWVudCA9IHBheW1lbnRzLnAybXMoeyBvdXRwdXQ6IHBhcnNlZC5wdWJTY3JpcHQsIHNpZ25hdHVyZXMgfSwgeyB2YWxpZGF0ZTogZmFsc2UsIGFsbG93SW5jb21wbGV0ZTogdHJ1ZSB9KTtcbiAgICBjb25zdCBwMndzaCA9IGlzUDJXU0ggPyBwYXltZW50cy5wMndzaCh7IHJlZGVlbTogcGF5bWVudCB9KSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwMnNoID0gaXNQMlNIID8gcGF5bWVudHMucDJzaCh7IHJlZGVlbTogcDJ3c2ggfHwgcGF5bWVudCB9KSA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChwMnNoPy5pbnB1dCkge1xuICAgICAgdHguc2V0SW5wdXRTY3JpcHQoaSwgcDJzaC5pbnB1dCk7XG4gICAgfVxuICAgIGlmIChwMndzaD8ud2l0bmVzcykge1xuICAgICAgdHguc2V0V2l0bmVzcyhpLCBwMndzaC53aXRuZXNzKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0eDtcbn1cblxuLyoqXG4gKiBDbG9uZXMgdGhlIHBzYnQgd2l0aG91dCBub25XaXRuZXNzVXR4byBmb3Igbm9uLXNlZ3dpdCBpbnB1dHMgYW5kIHdpdG5lc3NVdHhvIGlzIGFkZGVkIGluc3RlYWQuXG4gKiBJdCBpcyBub3QgQklQLTE3NCBjb21wbGlhbnQsIHNvIHVzZSBpdCBjYXJlZnVsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZVBzYnRXaXRob3V0Tm9uV2l0bmVzc1V0eG8ocHNidDogVXR4b1BzYnQpOiBVdHhvUHNidCB7XG4gIGNvbnN0IG5ld1BzYnQgPSBjcmVhdGVQc2J0RnJvbUhleChwc2J0LnRvSGV4KCksIHBzYnQubmV0d29yayk7XG4gIGNvbnN0IHR4SW5wdXRzID0gcHNidC50eElucHV0cztcblxuICBwc2J0LmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpKSA9PiB7XG4gICAgaWYgKGlucHV0Lm5vbldpdG5lc3NVdHhvICYmICFpbnB1dC53aXRuZXNzVXR4bykge1xuICAgICAgY29uc3QgdHggPSBVdHhvVHJhbnNhY3Rpb24uZnJvbUJ1ZmZlcjxiaWdpbnQ+KGlucHV0Lm5vbldpdG5lc3NVdHhvLCBmYWxzZSwgJ2JpZ2ludCcsIHBzYnQubmV0d29yayk7XG4gICAgICBpZiAoIXR4SW5wdXRzW2ldLmhhc2guZXF1YWxzKHR4LmdldEhhc2goKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb24td2l0bmVzcyBVVFhPIGhhc2ggZm9yIGlucHV0ICMke2l9IGRvZXNuJ3QgbWF0Y2ggdGhlIGhhc2ggc3BlY2lmaWVkIGluIHRoZSBwcmV2b3V0YCk7XG4gICAgICB9XG4gICAgICBuZXdQc2J0LmRhdGEuaW5wdXRzW2ldLndpdG5lc3NVdHhvID0gdHgub3V0c1t0eElucHV0c1tpXS5pbmRleF07XG4gICAgfVxuICAgIGRlbGV0ZSBuZXdQc2J0LmRhdGEuaW5wdXRzW2ldLm5vbldpdG5lc3NVdHhvO1xuICB9KTtcblxuICByZXR1cm4gbmV3UHNidDtcbn1cblxuLyoqXG4gKiBEZWxldGVzIHdpdG5lc3NVdHhvIGZvciBub24tc2Vnd2l0IGlucHV0cyB0byBtYWtlIHRoZSBQU0JUIEJJUC0xNzQgY29tcGxpYW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlV2l0bmVzc1V0eG9Gb3JOb25TZWd3aXRJbnB1dHMocHNidDogVXR4b1BzYnQpOiB2b2lkIHtcbiAgcHNidC5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgIGNvbnN0IHNjcmlwdFR5cGUgPSBnZXRQc2J0SW5wdXRTY3JpcHRUeXBlKGlucHV0KTtcbiAgICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3Ayc2gnIHx8IHNjcmlwdFR5cGUgPT09ICdwMnNoUDJwaycpIHtcbiAgICAgIGRlbGV0ZSBpbnB1dC53aXRuZXNzVXR4bztcbiAgICB9XG4gIH0pO1xufVxuIl19
|