@bitgo/sdk-coin-eth 25.15.1 → 25.15.3
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/dist/src/erc7984Token.d.ts +32 -8
- package/dist/src/erc7984Token.d.ts.map +1 -1
- package/dist/src/erc7984Token.js +145 -18
- package/dist/src/eth.d.ts.map +1 -1
- package/dist/src/eth.js +6 -5
- package/dist/test/unit/erc7984Token.js +258 -1
- package/dist/test/unit/ethWallet.js +81 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -705,6 +705,141 @@ describe('verifyTransaction – confidential transfer (SendERC7984)', function (
|
|
|
705
705
|
});
|
|
706
706
|
});
|
|
707
707
|
// ---------------------------------------------------------------------------
|
|
708
|
+
// verifyTransaction – direct confidentialTransfer (hot/TSS EOA wallet) tests
|
|
709
|
+
// ---------------------------------------------------------------------------
|
|
710
|
+
/**
|
|
711
|
+
* Builds a raw tx hex where the EOA calls confidentialTransfer directly on the token
|
|
712
|
+
* contract (no sendMultiSig wrapper). This is the hot/TSS wallet path.
|
|
713
|
+
*/
|
|
714
|
+
async function buildDirectConfidentialTransferTxHex(opts) {
|
|
715
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
|
|
716
|
+
txBuilder.fee({ fee: '1000000000', gasLimit: '200000' });
|
|
717
|
+
txBuilder.counter(1);
|
|
718
|
+
txBuilder.type(sdk_core_1.TransactionType.ContractCall);
|
|
719
|
+
// tx.to = token contract (EOA calls it directly)
|
|
720
|
+
txBuilder.contract(opts.tokenContractAddress);
|
|
721
|
+
// Inner calldata: confidentialTransfer(address, bytes32, bytes) — no sendMultiSig wrapper
|
|
722
|
+
const calldata = new abstract_eth_1.TransferBuilderERC7984()
|
|
723
|
+
.to(opts.recipientAddress)
|
|
724
|
+
.tokenContractAddress(opts.tokenContractAddress)
|
|
725
|
+
.encryptedHandle(opts.encryptedHandle)
|
|
726
|
+
.inputProof(opts.inputProof)
|
|
727
|
+
.build();
|
|
728
|
+
txBuilder.data(calldata);
|
|
729
|
+
const tx = await txBuilder.build();
|
|
730
|
+
return tx.toBroadcastFormat();
|
|
731
|
+
}
|
|
732
|
+
describe('verifyTransaction – direct confidentialTransfer (hot/TSS EOA wallet)', function () {
|
|
733
|
+
const RECIPIENT = '0x19645032c7f1533395d44a629462e751084d3e4c';
|
|
734
|
+
const HANDLE = '0x' + 'ab'.repeat(32);
|
|
735
|
+
const PROOF = '0x' + 'cd'.repeat(50);
|
|
736
|
+
const WRONG_RECIPIENT = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
|
|
737
|
+
const WRONG_TOKEN = '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb';
|
|
738
|
+
const AMOUNT = '1000000';
|
|
739
|
+
let bitgo;
|
|
740
|
+
let coin;
|
|
741
|
+
before(function () {
|
|
742
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
|
|
743
|
+
bitgo.initializeTestVars();
|
|
744
|
+
(0, register_1.register)(bitgo);
|
|
745
|
+
coin = bitgo.coin('hteth:ctest1');
|
|
746
|
+
});
|
|
747
|
+
it('should verify a valid direct confidentialTransfer tx', async function () {
|
|
748
|
+
const txHex = await buildDirectConfidentialTransferTxHex({
|
|
749
|
+
tokenContractAddress: CTEST1_TOKEN_ADDRESS,
|
|
750
|
+
recipientAddress: RECIPIENT,
|
|
751
|
+
encryptedHandle: HANDLE,
|
|
752
|
+
inputProof: PROOF,
|
|
753
|
+
});
|
|
754
|
+
const result = await coin.verifyTransaction({
|
|
755
|
+
txParams: { recipients: [{ address: RECIPIENT, amount: AMOUNT }] },
|
|
756
|
+
txPrebuild: { txHex, buildParams: { recipients: [{ address: RECIPIENT, amount: AMOUNT }] } },
|
|
757
|
+
wallet: {},
|
|
758
|
+
});
|
|
759
|
+
result.should.equal(true);
|
|
760
|
+
});
|
|
761
|
+
it('should verify using buildParams.recipients when txParams has no recipients', async function () {
|
|
762
|
+
const txHex = await buildDirectConfidentialTransferTxHex({
|
|
763
|
+
tokenContractAddress: CTEST1_TOKEN_ADDRESS,
|
|
764
|
+
recipientAddress: RECIPIENT,
|
|
765
|
+
encryptedHandle: HANDLE,
|
|
766
|
+
inputProof: PROOF,
|
|
767
|
+
});
|
|
768
|
+
const result = await coin.verifyTransaction({
|
|
769
|
+
txParams: {},
|
|
770
|
+
txPrebuild: {
|
|
771
|
+
txHex,
|
|
772
|
+
buildParams: { recipients: [{ address: RECIPIENT, amount: AMOUNT }] },
|
|
773
|
+
},
|
|
774
|
+
wallet: {},
|
|
775
|
+
});
|
|
776
|
+
result.should.equal(true);
|
|
777
|
+
});
|
|
778
|
+
it('should throw when token contract address (tx.to) does not match this coin', async function () {
|
|
779
|
+
const txHex = await buildDirectConfidentialTransferTxHex({
|
|
780
|
+
tokenContractAddress: WRONG_TOKEN,
|
|
781
|
+
recipientAddress: RECIPIENT,
|
|
782
|
+
encryptedHandle: HANDLE,
|
|
783
|
+
inputProof: PROOF,
|
|
784
|
+
});
|
|
785
|
+
await coin
|
|
786
|
+
.verifyTransaction({
|
|
787
|
+
txParams: { recipients: [{ address: RECIPIENT, amount: AMOUNT }] },
|
|
788
|
+
txPrebuild: { txHex },
|
|
789
|
+
wallet: {},
|
|
790
|
+
})
|
|
791
|
+
.should.be.rejectedWith(/token contract address mismatch/);
|
|
792
|
+
});
|
|
793
|
+
it('should throw when recipient address does not match txParams', async function () {
|
|
794
|
+
const txHex = await buildDirectConfidentialTransferTxHex({
|
|
795
|
+
tokenContractAddress: CTEST1_TOKEN_ADDRESS,
|
|
796
|
+
recipientAddress: RECIPIENT,
|
|
797
|
+
encryptedHandle: HANDLE,
|
|
798
|
+
inputProof: PROOF,
|
|
799
|
+
});
|
|
800
|
+
await coin
|
|
801
|
+
.verifyTransaction({
|
|
802
|
+
txParams: { recipients: [{ address: WRONG_RECIPIENT, amount: AMOUNT }] },
|
|
803
|
+
txPrebuild: { txHex },
|
|
804
|
+
wallet: {},
|
|
805
|
+
})
|
|
806
|
+
.should.be.rejectedWith(/recipient address mismatch/);
|
|
807
|
+
});
|
|
808
|
+
it('should throw when no recipient info is provided in either txParams or buildParams', async function () {
|
|
809
|
+
const txHex = await buildDirectConfidentialTransferTxHex({
|
|
810
|
+
tokenContractAddress: CTEST1_TOKEN_ADDRESS,
|
|
811
|
+
recipientAddress: RECIPIENT,
|
|
812
|
+
encryptedHandle: HANDLE,
|
|
813
|
+
inputProof: PROOF,
|
|
814
|
+
});
|
|
815
|
+
await coin
|
|
816
|
+
.verifyTransaction({
|
|
817
|
+
txParams: {},
|
|
818
|
+
txPrebuild: { txHex },
|
|
819
|
+
wallet: {},
|
|
820
|
+
})
|
|
821
|
+
.should.be.rejectedWith(/missing expected recipient/);
|
|
822
|
+
});
|
|
823
|
+
it('should throw when txParams amount does not match buildParams amount', async function () {
|
|
824
|
+
const txHex = await buildDirectConfidentialTransferTxHex({
|
|
825
|
+
tokenContractAddress: CTEST1_TOKEN_ADDRESS,
|
|
826
|
+
recipientAddress: RECIPIENT,
|
|
827
|
+
encryptedHandle: HANDLE,
|
|
828
|
+
inputProof: PROOF,
|
|
829
|
+
});
|
|
830
|
+
await coin
|
|
831
|
+
.verifyTransaction({
|
|
832
|
+
txParams: { recipients: [{ address: RECIPIENT, amount: '9999999' }] },
|
|
833
|
+
txPrebuild: {
|
|
834
|
+
txHex,
|
|
835
|
+
buildParams: { recipients: [{ address: RECIPIENT, amount: AMOUNT }] },
|
|
836
|
+
},
|
|
837
|
+
wallet: {},
|
|
838
|
+
})
|
|
839
|
+
.should.be.rejectedWith(/amount mismatch/);
|
|
840
|
+
});
|
|
841
|
+
});
|
|
842
|
+
// ---------------------------------------------------------------------------
|
|
708
843
|
// decodeTokenAddressesFromDelegationCalldata tests
|
|
709
844
|
// ---------------------------------------------------------------------------
|
|
710
845
|
describe('decodeTokenAddressesFromDelegationCalldata', function () {
|
|
@@ -740,4 +875,126 @@ describe('decodeTokenAddressesFromDelegationCalldata', function () {
|
|
|
740
875
|
should_1.default.throws(() => (0, abstract_eth_1.decodeTokenAddressesFromDelegationCalldata)('0xdeadbeef00000000'), /Not a valid delegation calldata/);
|
|
741
876
|
});
|
|
742
877
|
});
|
|
743
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJjNzk4NFRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2VyYzc5ODRUb2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7OztHQVFHO0FBQ0gsb0RBQTRCO0FBQzVCLDRDQUEwQztBQUMxQyw4Q0FBMEQ7QUFDMUQsOENBQWtEO0FBQ2xELHNEQUs2QjtBQUc3Qiw2Q0FBMEM7QUFDMUMsaURBQThDO0FBQzlDLDJEQUE2QztBQUU3Qyw4RUFBOEU7QUFDOUUsWUFBWTtBQUNaLDhFQUE4RTtBQUU5RSwwRUFBMEU7QUFDMUUsTUFBTSxnQkFBZ0IsR0FBRyw0Q0FBNEMsQ0FBQztBQUN0RSxNQUFNLGdCQUFnQixHQUFHLDRDQUE0QyxDQUFDO0FBRXRFLHNFQUFzRTtBQUN0RSxNQUFNLG9CQUFvQixHQUFHLDRDQUE0QyxDQUFDO0FBQzFFLHFFQUFxRTtBQUNyRSxNQUFNLG1CQUFtQixHQUFHLDRDQUE0QyxDQUFDO0FBRXpFLE1BQU0sbUJBQW1CLEdBQUcsNENBQTRDLENBQUM7QUFDekUsTUFBTSxpQkFBaUIsR0FBRyw0Q0FBNEMsQ0FBQztBQUN2RSxNQUFNLGlCQUFpQixHQUFHLDRDQUE0QyxDQUFDO0FBRXZFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFFM0QsOEVBQThFO0FBQzlFLFVBQVU7QUFDViw4RUFBOEU7QUFFOUU7O0dBRUc7QUFDSCxLQUFLLFVBQVUsb0JBQW9CLENBQUMsVUFBa0IsRUFBRSxjQUF3QixFQUFFLEtBQUssR0FBRyxHQUFHO0lBQzNGLE1BQU0sU0FBUyxHQUFHLElBQUEsdUJBQVUsRUFBQyxPQUFPLENBQXVCLENBQUM7SUFDNUQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFF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QUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXO1FBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUEseURBQTBDLEVBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUU7UUFDM0MsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFLENBQUMsSUFBQSx5REFBMEMsRUFBQyxvQkFBb0IsQ0FBQyxFQUN0RSxpQ0FBaUMsQ0FDbEMsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVuaXQgdGVzdHMgZm9yIEVyYzc5ODRUb2tlbi5cbiAqXG4gKiBDb3ZlcnM6XG4gKiAgIC0gZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnXG4gKiAgIC0gdmVyaWZ5VHJhbnNhY3Rpb24gKFRTUyBhbmQgbXVsdGlzaWcgcGF0aHMpXG4gKiAgIC0gdmVyaWZ5VHJhbnNhY3Rpb24gKGNvbmZpZGVudGlhbCB0cmFuc2ZlciAvIFNlbmRFUkM3OTg0IHBhdGgpXG4gKiAgIC0gZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhIChyb3VuZC10cmlwIGFuZCBmb3J3YXJkZXItd3JhcHBlZClcbiAqL1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHtcbiAgYnVpbGRNdWx0aWNhbGxEZWxlZ2F0aW9uQ2FsbGRhdGEsXG4gIHdyYXBJbkNhbGxGcm9tUGFyZW50LFxuICBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEsXG4gIFRyYW5zZmVyQnVpbGRlckVSQzc5ODQsXG59IGZyb20gJ0BiaXRnby9hYnN0cmFjdC1ldGgnO1xuaW1wb3J0IHsgRXJjNzk4NFRva2VuIH0gZnJvbSAnLi4vLi4vc3JjL2VyYzc5ODRUb2tlbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IGdldEJ1aWxkZXIgfSBmcm9tICcuL2dldEJ1aWxkZXInO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuLi8uLi9zcmMvcmVnaXN0ZXInO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL2V0aCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gSG9vZGkgQUNMIGNvbnRyYWN0IGFkZHJlc3MgKE5ldHdvcmtzLnRlc3QuaG9vZGkuemFtYUFjbENvbnRyYWN0QWRkcmVzcylcbmNvbnN0IFpBTUFfQUNMX0FERFJFU1MgPSAnMHg2ZDNmYWY2Zjg2ZTFmZjlmM2IwODMxZGRhOTIwYWJhMWNiZDViZDY4JztcbmNvbnN0IERFTEVHQVRFX0FERFJFU1MgPSAnMHgxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExJztcblxuLy8gaHRldGg6Y3Rlc3QxIHRva2VuIGNvbnRyYWN0IGFkZHJlc3MgKGZyb20gc3RhdGljcy9lcmM3OTg0VG9rZW5zLnRzKVxuY29uc3QgQ1RFU1QxX1RPS0VOX0FERFJFU1MgPSAnMHg3YjFkNTliYmNkMjkxZGFhNTljYjZjOGM1YmMwNGRlMWFmYzRhYmExJztcbi8vIGh0ZXRoOmN1c2R0IHRva2VuIGNvbnRyYWN0IGFkZHJlc3MgKGZyb20gc3RhdGljcy9lcmM3OTg0VG9rZW5zLnRzKVxuY29uc3QgQ1VTRFRfVE9LRU5fQUREUkVTUyA9ICcweDJkZWJiZTA0ODdlZjkyMWRmNDQ1N2Y5ZTM2ZWQwNWJlMmRmMWFjNzUnO1xuXG5jb25zdCBXUk9OR19UT0tFTl9BRERSRVNTID0gJzB4ZGVhZGJlZWZkZWFkYmVlZmRlYWRiZWVmZGVhZGJlZWZkZWFkYmVlZic7XG5jb25zdCBXUk9OR19BQ0xfQUREUkVTUyA9ICcweGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEnO1xuY29uc3QgRk9SV0FSREVSX0FERFJFU1MgPSAnMHgxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwJztcblxuY29uc3QgRVhQSVJZID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgKyAzNjUgKiA4NjQwMDtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBCdWlsZHMgYSByb290LXdhbGxldCBkZWxlZ2F0aW9uIHR4IGhleCAodG8gPSBBQ0wsIGRhdGEgPSBtdWx0aWNhbGwpLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZERlbGVnYXRpb25UeEhleChhY2xBZGRyZXNzOiBzdHJpbmcsIHRva2VuQWRkcmVzc2VzOiBzdHJpbmdbXSwgdmFsdWUgPSAnMCcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCdodGV0aCcpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgdHhCdWlsZGVyLmZlZSh7IGZlZTogJzEwMDAwMDAwMDAnLCBnYXNMaW1pdDogJzIwMDAwMCcgfSk7XG4gIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsKTtcbiAgdHhCdWlsZGVyLmNvbnRyYWN0KGFjbEFkZHJlc3MpO1xuICBjb25zdCBjYWxsZGF0YSA9IGJ1aWxkTXVsdGljYWxsRGVsZWdhdGlvbkNhbGxkYXRhKERFTEVHQVRFX0FERFJFU1MsIHRva2VuQWRkcmVzc2VzLCBFWFBJUlkpO1xuICB0eEJ1aWxkZXIuZGF0YShjYWxsZGF0YSk7XG4gIGlmICh2YWx1ZSAhPT0gJzAnKSB7XG4gICAgdHhCdWlsZGVyLnZhbHVlKHZhbHVlKTtcbiAgfVxuICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICByZXR1cm4gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBmb3J3YXJkZXIgZGVsZWdhdGlvbiB0eCBoZXggKHRvID0gZm9yd2FyZGVyLCBkYXRhID0gY2FsbEZyb21QYXJlbnQoQUNMLCAwLCBtdWx0aWNhbGwpKS5cbiAqIFRoaXMgbWlycm9ycyB3aGF0IERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlci5idWlsZCgpIHJldHVybnMgd2hlbiBmb3J3YXJkZXJBZGRyZXNzIGlzIHNldC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRGb3J3YXJkZXJEZWxlZ2F0aW9uVHhIZXgoXG4gIGZvcndhcmRlckFkZHJlc3M6IHN0cmluZyxcbiAgYWNsQWRkcmVzczogc3RyaW5nLFxuICB0b2tlbkFkZHJlc3Nlczogc3RyaW5nW11cbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ2h0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICB0eEJ1aWxkZXIuZmVlKHsgZmVlOiAnMTAwMDAwMDAwMCcsIGdhc0xpbWl0OiAnMjAwMDAwJyB9KTtcbiAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5Db250cmFjdENhbGwpO1xuICB0eEJ1aWxkZXIuY29udHJhY3QoZm9yd2FyZGVyQWRkcmVzcyk7XG4gIGNvbnN0IGlubmVyQ2FsbGRhdGEgPSBidWlsZE11bHRpY2FsbERlbGVnYXRpb25DYWxsZGF0YShERUxFR0FURV9BRERSRVNTLCB0b2tlbkFkZHJlc3NlcywgRVhQSVJZKTtcbiAgY29uc3Qgb3V0ZXJDYWxsZGF0YSA9IHdyYXBJbkNhbGxGcm9tUGFyZW50KGFjbEFkZHJlc3MsIGlubmVyQ2FsbGRhdGEpO1xuICB0eEJ1aWxkZXIuZGF0YShvdXRlckNhbGxkYXRhKTtcbiAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgcmV0dXJuIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGVzdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5kZXNjcmliZSgnRXJjNzk4NFRva2VuJywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGNvaW46IEVyYzc5ODRUb2tlbjtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIHJlZ2lzdGVyKGJpdGdvKTtcbiAgICBjb2luID0gYml0Z28uY29pbignaHRldGg6Y3Rlc3QxJykgYXMgRXJjNzk4NFRva2VuO1xuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGRlc2NyaWJlKCdnZXRUb2tlbkVuYWJsZW1lbnRDb25maWcnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gcmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQ6IHRydWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBjb2luLmdldFRva2VuRW5hYmxlbWVudENvbmZpZygpO1xuICAgICAgY29uZmlnLnJlcXVpcmVzVG9rZW5FbmFibGVtZW50LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHN1cHBvcnRzTXVsdGlwbGVUb2tlbkVuYWJsZW1lbnRzOiB0cnVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29uZmlnID0gY29pbi5nZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTtcbiAgICAgIGNvbmZpZy5zdXBwb3J0c011bHRpcGxlVG9rZW5FbmFibGVtZW50cy5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZGVzY3JpYmUoJ3ZlcmlmeVRyYW5zYWN0aW9uIOKAkyBub24tZW5hYmxlLXRva2VuJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcm91dGUgdG8gY29uZmlkZW50aWFsIHRyYW5zZmVyIHBhdGggd2hlbiB0eXBlIGlzIG5vdCBlbmFibGV0b2tlbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIE5vbi1lbmFibGV0b2tlbiB0cmFuc2FjdGlvbnMgcm91dGUgdG8gdmVyaWZ5Q29uZmlkZW50aWFsVHJhbnNmZXIuXG4gICAgICAvLyBFbXB0eSByZWNpcGllbnRzIHRyaWdnZXJzIG91ciBFUkM3OTg0LXNwZWNpZmljIHZhbGlkYXRpb24gZXJyb3IsXG4gICAgICAvLyBjb25maXJtaW5nIHRoZSBvdmVycmlkZSBvbmx5IGludGVyY2VwdHMgdGhlIGVuYWJsZXRva2VuIHR5cGUuXG4gICAgICBhd2FpdCBjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW10gfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7fSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9yZWNpcGllbnRzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZW50cnkvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBkZXNjcmliZSgndmVyaWZ5VHJhbnNhY3Rpb24g4oCTIFRTUyBwYXRoJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmVyaWZ5IGEgdmFsaWQgc2luZ2xlLXRva2VuIGRlbGVnYXRpb24gdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkRGVsZWdhdGlvblR4SGV4KFpBTUFfQUNMX0FERFJFU1MsIFtDVEVTVDFfVE9LRU5fQUREUkVTU10pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgdHlwZTogJ2VuYWJsZXRva2VuJyxcbiAgICAgICAgICBlbmFibGVUb2tlbnM6IFt7IG5hbWU6ICdodGV0aDpjdGVzdDEnIH1dLFxuICAgICAgICB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4IH0gYXMgYW55LFxuICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBhIHZhbGlkIG11bHRpLXRva2VuIGRlbGVnYXRpb24gdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkRGVsZWdhdGlvblR4SGV4KFpBTUFfQUNMX0FERFJFU1MsIFtDVEVTVDFfVE9LRU5fQUREUkVTUywgQ1VTRFRfVE9LRU5fQUREUkVTU10pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgdHlwZTogJ2VuYWJsZXRva2VuJyxcbiAgICAgICAgICBlbmFibGVUb2tlbnM6IFt7IG5hbWU6ICdodGV0aDpjdGVzdDEnIH0sIHsgbmFtZTogJ2h0ZXRoOmN1c2R0JyB9XSxcbiAgICAgICAgfSxcbiAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIEFDTCBhZGRyZXNzIGRvZXMgbm90IG1hdGNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZERlbGVnYXRpb25UeEhleChXUk9OR19BQ0xfQUREUkVTUywgW0NURVNUMV9UT0tFTl9BRERSRVNTXSk7XG4gICAgICBhd2FpdCBjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IFt7IG5hbWU6ICdodGV0aDpjdGVzdDEnIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2RvZXMgbm90IG1hdGNoIEFDTCBjb250cmFjdC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGNhbGxkYXRhIGNvbnRhaW5zIHdyb25nIHRva2VuIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkRGVsZWdhdGlvblR4SGV4KFpBTUFfQUNMX0FERFJFU1MsIFtXUk9OR19UT0tFTl9BRERSRVNTXSk7XG4gICAgICBhd2FpdCBjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IFt7IG5hbWU6ICdodGV0aDpjdGVzdDEnIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vdCBmb3VuZCBpbiBkZWxlZ2F0aW9uIGNhbGxkYXRhLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBhIHZhbGlkIGZvcndhcmRlciBkZWxlZ2F0aW9uIHR4IChjYWxsRnJvbVBhcmVudCBzaGFwZSknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkRm9yd2FyZGVyRGVsZWdhdGlvblR4SGV4KEZPUldBUkRFUl9BRERSRVNTLCBaQU1BX0FDTF9BRERSRVNTLCBbQ1RFU1QxX1RPS0VOX0FERFJFU1NdKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgZW5hYmxlVG9rZW5zOiBbeyBuYW1lOiAnaHRldGg6Y3Rlc3QxJyB9XSxcbiAgICAgICAgfSxcbiAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSBmb3J3YXJkZXIgZGVsZWdhdGlvbiB0eCB3aXRoIG11bHRpcGxlIHRva2VucycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGRGb3J3YXJkZXJEZWxlZ2F0aW9uVHhIZXgoRk9SV0FSREVSX0FERFJFU1MsIFpBTUFfQUNMX0FERFJFU1MsIFtcbiAgICAgICAgQ1RFU1QxX1RPS0VOX0FERFJFU1MsXG4gICAgICAgIENVU0RUX1RPS0VOX0FERFJFU1MsXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgZW5hYmxlVG9rZW5zOiBbeyBuYW1lOiAnaHRldGg6Y3Rlc3QxJyB9LCB7IG5hbWU6ICdodGV0aDpjdXNkdCcgfV0sXG4gICAgICAgIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBmb3J3YXJkZXIgY2FsbGRhdGEgY29udGFpbnMgd3JvbmcgdG9rZW4gYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGRGb3J3YXJkZXJEZWxlZ2F0aW9uVHhIZXgoRk9SV0FSREVSX0FERFJFU1MsIFpBTUFfQUNMX0FERFJFU1MsIFtXUk9OR19UT0tFTl9BRERSRVNTXSk7XG4gICAgICBhd2FpdCBjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IFt7IG5hbWU6ICdodGV0aDpjdGVzdDEnIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vdCBmb3VuZCBpbiBkZWxlZ2F0aW9uIGNhbGxkYXRhLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gY2FsbGRhdGEgaGFzIHVucmVjb2duaXNlZCBtZXRob2QgSUQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBCdWlsZCBhIHR4IHdpdGggYXJiaXRyYXJ5IGNhbGxkYXRhIHRoYXQgaXMgbmVpdGhlciBtdWx0aWNhbGwgbm9yIGNhbGxGcm9tUGFyZW50XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCdodGV0aCcpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgIHR4QnVpbGRlci5mZWUoeyBmZWU6ICcxMDAwMDAwMDAwJywgZ2FzTGltaXQ6ICcyMDAwMDAnIH0pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsKTtcbiAgICAgIHR4QnVpbGRlci5jb250cmFjdChaQU1BX0FDTF9BRERSRVNTKTtcbiAgICAgIHR4QnVpbGRlci5kYXRhKCcweGRlYWRiZWVmJyk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhIZXggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBhd2FpdCBjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IFt7IG5hbWU6ICdodGV0aDpjdGVzdDEnIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3VucmVjb2duaXNlZCBjYWxsZGF0YSBtZXRob2QgSUQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB0cmFuc2FjdGlvbiB2YWx1ZSBpcyBub3QgMCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGREZWxlZ2F0aW9uVHhIZXgoWkFNQV9BQ0xfQUREUkVTUywgW0NURVNUMV9UT0tFTl9BRERSRVNTXSwgJzEnKTtcbiAgICAgIGF3YWl0IGNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgICAgdHlwZTogJ2VuYWJsZXRva2VuJyxcbiAgICAgICAgICAgIGVuYWJsZVRva2VuczogW3sgbmFtZTogJ2h0ZXRoOmN0ZXN0MScgfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4IH0gYXMgYW55LFxuICAgICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvZXhwZWN0ZWQgdHJhbnNhY3Rpb24gdmFsdWUgMC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGVuYWJsZVRva2VucyBpcyBlbXB0eScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGREZWxlZ2F0aW9uVHhIZXgoWkFNQV9BQ0xfQUREUkVTUywgW0NURVNUMV9UT0tFTl9BRERSRVNTXSk7XG4gICAgICBhd2FpdCBjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IFtdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2VuYWJsZVRva2VucyBtdXN0IGJlIG5vbi1lbXB0eS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHR4SGV4IGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IFt7IG5hbWU6ICdodGV0aDpjdGVzdDEnIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDoge30gYXMgYW55LFxuICAgICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbWlzc2luZyB0eEhleC8pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGRlc2NyaWJlKCd2ZXJpZnlUcmFuc2FjdGlvbiDigJMgbXVsdGlzaWcgcGF0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZlcmlmeSB2YWxpZCBidWlsZFBhcmFtcyByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgdHlwZTogJ2VuYWJsZXRva2VuJyxcbiAgICAgICAgICByZWNpcGllbnRzOiBbeyB0b2tlbk5hbWU6ICdodGV0aDpjdGVzdDEnLCBhZGRyZXNzOiAnMHhhYmMnLCBhbW91bnQ6ICcwJyB9XSBhcyBhbnksXG4gICAgICAgIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICBidWlsZFBhcmFtczoge1xuICAgICAgICAgICAgdHlwZTogJ2VuYWJsZXRva2VuJyxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFt7IHRva2VuTmFtZTogJ2h0ZXRoOmN0ZXN0MScsIGFkZHJlc3M6ICcweGFiYycsIGFtb3VudDogJzAnIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgYW55LFxuICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0VHlwZTogJ29uY2hhaW4nLFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgbXVsdGlwbGUgdG9rZW4gcmVjaXBpZW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAgeyB0b2tlbk5hbWU6ICdodGV0aDpjdGVzdDEnLCBhZGRyZXNzOiAnMHhhYmMnLCBhbW91bnQ6ICcwJyB9LFxuICAgICAgICAgICAgeyB0b2tlbk5hbWU6ICdodGV0aDpjdXNkdCcsIGFkZHJlc3M6ICcweGFiYycsIGFtb3VudDogJzAnIH0sXG4gICAgICAgICAgXSBhcyBhbnksXG4gICAgICAgIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICBidWlsZFBhcmFtczoge1xuICAgICAgICAgICAgdHlwZTogJ2VuYWJsZXRva2VuJyxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgICAgeyB0b2tlbk5hbWU6ICdodGV0aDpjdGVzdDEnLCBhZGRyZXNzOiAnMHhhYmMnLCBhbW91bnQ6ICcwJyB9LFxuICAgICAgICAgICAgICB7IHRva2VuTmFtZTogJ2h0ZXRoOmN1c2R0JywgYWRkcmVzczogJzB4YWJjJywgYW1vdW50OiAnMCcgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgICB3YWxsZXRUeXBlOiAnb25jaGFpbicsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gYnVpbGRQYXJhbXMgcmVjaXBpZW50cyBoYXZlIHdyb25nIHRva2VuTmFtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgICAgdHlwZTogJ2VuYWJsZXRva2VuJyxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IFt7IHRva2VuTmFtZTogJ2h0ZXRoOmN0ZXN0MScsIGFkZHJlc3M6ICcweGFiYycsIGFtb3VudDogJzAnIH1dIGFzIGFueSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIGJ1aWxkUGFyYW1zOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgICAgIHJlY2lwaWVudHM6IFt7IHRva2VuTmFtZTogJ2h0ZXRoOndyb25ndG9rZW4nLCBhZGRyZXNzOiAnMHhhYmMnLCBhbW91bnQ6ICcwJyB9XSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ29uY2hhaW4nLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbm90IGZvdW5kIGluIGJ1aWxkUGFyYW1zIHJlY2lwaWVudHMvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBhbW91bnQgaXMgbm90IDAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBbeyB0b2tlbk5hbWU6ICdodGV0aDpjdGVzdDEnLCBhZGRyZXNzOiAnMHhhYmMnLCBhbW91bnQ6ICcwJyB9XSBhcyBhbnksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgICBidWlsZFBhcmFtczoge1xuICAgICAgICAgICAgICB0eXBlOiAnZW5hYmxldG9rZW4nLFxuICAgICAgICAgICAgICByZWNpcGllbnRzOiBbeyB0b2tlbk5hbWU6ICdodGV0aDpjdGVzdDEnLCBhZGRyZXNzOiAnMHhhYmMnLCBhbW91bnQ6ICcxMDAnIH1dLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAnb25jaGFpbicsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9leHBlY3RlZCBhbW91bnQgMC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHJlY2lwaWVudHMgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgICAgdHlwZTogJ2VuYWJsZXRva2VuJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICAgIGJ1aWxkUGFyYW1zOiB7fSxcbiAgICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAnb25jaGFpbicsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9taXNzaW5nIGJ1aWxkUGFyYW1zLnJlY2lwaWVudHMvKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyB2ZXJpZnlUcmFuc2FjdGlvbiDigJMgY29uZmlkZW50aWFsIHRyYW5zZmVyIChTZW5kRVJDNzk4NCkgdGVzdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEJ1aWxkIGEgcmF3IHNpZ25lZCBzZW5kTXVsdGlTaWcgdHggaGV4IHRoYXQgd3JhcHMgYSBjb25maWRlbnRpYWxUcmFuc2ZlciBjYWxsLlxuICogVGhlIHdhbGxldCBjb250cmFjdCAoc2VuZE11bHRpU2lnIHdyYXBwZXIpIGlzIGB3YWxsZXRDb250cmFjdEFkZHJlc3NgLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZENvbmZpZGVudGlhbFRyYW5zZmVyVHhIZXgob3B0czoge1xuICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IHN0cmluZztcbiAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZztcbiAgcmVjaXBpZW50QWRkcmVzczogc3RyaW5nO1xuICBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZztcbiAgaW5wdXRQcm9vZjogc3RyaW5nO1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGtleSA9IHRlc3REYXRhLktFWVBBSVJfUFJWLmdldEtleXMoKS5wcnYgYXMgc3RyaW5nO1xuICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCdodGV0aCcpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgdHhCdWlsZGVyLmZlZSh7IGZlZTogJzEwMDAwMDAwMDAnLCBnYXNMaW1pdDogJzEyMTAwMDAwJyB9KTtcbiAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gIHR4QnVpbGRlci5jb250cmFjdChvcHRzLndhbGxldENvbnRyYWN0QWRkcmVzcyk7XG4gIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kRVJDNzk4NCk7XG5cbiAgY29uc3QgdHJhbnNmZXJCdWlsZGVyID0gdHhCdWlsZGVyLnRyYW5zZmVyKCkgYXMgVHJhbnNmZXJCdWlsZGVyRVJDNzk4NDtcbiAgdHJhbnNmZXJCdWlsZGVyXG4gICAgLmZyb20oJzB4MTk2NDUwMzJjN2YxNTMzMzk1ZDQ0YTYyOTQ2MmU3NTEwODRkM2U0ZCcpXG4gICAgLnRvKG9wdHMucmVjaXBpZW50QWRkcmVzcylcbiAgICAudG9rZW5Db250cmFjdEFkZHJlc3Mob3B0cy50b2tlbkNvbnRyYWN0QWRkcmVzcylcbiAgICAuZW5jcnlwdGVkSGFuZGxlKG9wdHMuZW5jcnlwdGVkSGFuZGxlKVxuICAgIC5pbnB1dFByb29mKG9wdHMuaW5wdXRQcm9vZilcbiAgICAuY29udHJhY3RTZXF1ZW5jZUlkKDEpXG4gICAgLmV4cGlyYXRpb25UaW1lKE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgMzYwMClcbiAgICAua2V5KGtleSk7XG5cbiAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlBSSVZBVEVfS0VZIH0pO1xuICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICByZXR1cm4gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbn1cblxuZGVzY3JpYmUoJ3ZlcmlmeVRyYW5zYWN0aW9uIOKAkyBjb25maWRlbnRpYWwgdHJhbnNmZXIgKFNlbmRFUkM3OTg0KScsIGZ1bmN0aW9uICgpIHtcbiAgLy8gV2FsbGV0IGNvbnRyYWN0IHRoYXQgd3JhcHMgdGhlIHNlbmRNdWx0aVNpZyBjYWxsXG4gIGNvbnN0IFdBTExFVF9DT05UUkFDVCA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAvLyBSZWNpcGllbnQgb2YgdGhlIGNvbmZpZGVudGlhbCB0cmFuc2ZlclxuICBjb25zdCBSRUNJUElFTlQgPSAnMHgxOTY0NTAzMmM3ZjE1MzMzOTVkNDRhNjI5NDYyZTc1MTA4NGQzZTRjJztcbiAgLy8gRW5jcnlwdGVkIGhhbmRsZTogc3ludGhldGljIDMyIGJ5dGVzXG4gIGNvbnN0IEhBTkRMRSA9ICcweCcgKyAnYWInLnJlcGVhdCgzMik7XG4gIC8vIElucHV0IHByb29mOiBzeW50aGV0aWMgNTAgYnl0ZXNcbiAgY29uc3QgUFJPT0YgPSAnMHgnICsgJ2NkJy5yZXBlYXQoNTApO1xuICAvLyBBIGRpZmZlcmVudCByZWNpcGllbnQgdG8gdHJpZ2dlciBtaXNtYXRjaFxuICBjb25zdCBXUk9OR19SRUNJUElFTlQgPSAnMHhhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhJztcbiAgLy8gQSBkaWZmZXJlbnQgdG9rZW4gY29udHJhY3QgdG8gdHJpZ2dlciBtaXNtYXRjaFxuICBjb25zdCBXUk9OR19UT0tFTiA9ICcweGJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmInO1xuXG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBsZXQgY29pbjogRXJjNzk4NFRva2VuO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgcmVnaXN0ZXIoYml0Z28pO1xuICAgIGNvaW4gPSBiaXRnby5jb2luKCdodGV0aDpjdGVzdDEnKSBhcyBFcmM3OTg0VG9rZW47XG4gIH0pO1xuXG4gIC8vIFJlcHJlc2VudGF0aXZlIHBsYWludGV4dCBhbW91bnQgaW4gYmFzZSB1bml0cyAoZS5nLiwgMSBjVEVTVDEgPSAxXzAwMF8wMDAgdW5pdHMgYXQgNiBkZWNpbWFscylcbiAgY29uc3QgQU1PVU5UID0gJzEwMDAwMDAnO1xuXG4gIGl0KCdzaG91bGQgdmVyaWZ5IGEgdmFsaWQgY29uZmlkZW50aWFsIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggbWF0Y2hpbmcgYW1vdW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkQ29uZmlkZW50aWFsVHJhbnNmZXJUeEhleCh7XG4gICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IFdBTExFVF9DT05UUkFDVCxcbiAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBDVEVTVDFfVE9LRU5fQUREUkVTUyxcbiAgICAgIHJlY2lwaWVudEFkZHJlc3M6IFJFQ0lQSUVOVCxcbiAgICAgIGVuY3J5cHRlZEhhbmRsZTogSEFORExFLFxuICAgICAgaW5wdXRQcm9vZjogUFJPT0YsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXgsIGJ1aWxkUGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSB9IGFzIGFueSxcbiAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgIH0pO1xuICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBubyByZWNpcGllbnQgaW5mbyBpcyBwcm92aWRlZCBpbiBlaXRoZXIgdHhQYXJhbXMgb3IgYnVpbGRQYXJhbXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZENvbmZpZGVudGlhbFRyYW5zZmVyVHhIZXgoe1xuICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiBXQUxMRVRfQ09OVFJBQ1QsXG4gICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogQ1RFU1QxX1RPS0VOX0FERFJFU1MsXG4gICAgICByZWNpcGllbnRBZGRyZXNzOiBSRUNJUElFTlQsXG4gICAgICBlbmNyeXB0ZWRIYW5kbGU6IEhBTkRMRSxcbiAgICAgIGlucHV0UHJvb2Y6IFBST09GLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgY29pblxuICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHt9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4IH0gYXMgYW55LFxuICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbWlzc2luZyBleHBlY3RlZCByZWNpcGllbnQvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2ZXJpZnkgc3VjY2Vzc2Z1bGx5IHVzaW5nIGJ1aWxkUGFyYW1zLnJlY2lwaWVudHMgd2hlbiB0eFBhcmFtcyBoYXMgbm8gcmVjaXBpZW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkQ29uZmlkZW50aWFsVHJhbnNmZXJUeEhleCh7XG4gICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IFdBTExFVF9DT05UUkFDVCxcbiAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBDVEVTVDFfVE9LRU5fQUREUkVTUyxcbiAgICAgIHJlY2lwaWVudEFkZHJlc3M6IFJFQ0lQSUVOVCxcbiAgICAgIGVuY3J5cHRlZEhhbmRsZTogSEFORExFLFxuICAgICAgaW5wdXRQcm9vZjogUFJPT0YsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgIHR4UGFyYW1zOiB7fSxcbiAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgdHhIZXgsXG4gICAgICAgIGJ1aWxkUGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgIH0gYXMgYW55LFxuICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgfSk7XG4gICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHRva2VuIGNvbnRyYWN0IGFkZHJlc3MgZG9lcyBub3QgbWF0Y2ggdGhpcyBjb2luJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGRDb25maWRlbnRpYWxUcmFuc2ZlclR4SGV4KHtcbiAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogV0FMTEVUX0NPTlRSQUNULFxuICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IFdST05HX1RPS0VOLFxuICAgICAgcmVjaXBpZW50QWRkcmVzczogUkVDSVBJRU5ULFxuICAgICAgZW5jcnlwdGVkSGFuZGxlOiBIQU5ETEUsXG4gICAgICBpbnB1dFByb29mOiBQUk9PRixcbiAgICB9KTtcblxuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3Rva2VuIGNvbnRyYWN0IGFkZHJlc3MgbWlzbWF0Y2gvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHJlY2lwaWVudCBhZGRyZXNzIGRvZXMgbm90IG1hdGNoIHR4UGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGRDb25maWRlbnRpYWxUcmFuc2ZlclR4SGV4KHtcbiAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogV0FMTEVUX0NPTlRSQUNULFxuICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IENURVNUMV9UT0tFTl9BRERSRVNTLFxuICAgICAgcmVjaXBpZW50QWRkcmVzczogUkVDSVBJRU5ULFxuICAgICAgZW5jcnlwdGVkSGFuZGxlOiBIQU5ETEUsXG4gICAgICBpbnB1dFByb29mOiBQUk9PRixcbiAgICB9KTtcblxuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFdST05HX1JFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3JlY2lwaWVudCBhZGRyZXNzIG1pc21hdGNoLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBjYWxsZGF0YSBpcyBub3QgYSBjb25maWRlbnRpYWwgdHJhbnNmZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcignaHRldGgnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgdHhCdWlsZGVyLmZlZSh7IGZlZTogJzEwMDAwMDAwMDAnLCBnYXNMaW1pdDogJzIwMDAwMCcgfSk7XG4gICAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbCk7XG4gICAgdHhCdWlsZGVyLmNvbnRyYWN0KFdBTExFVF9DT05UUkFDVCk7XG4gICAgdHhCdWlsZGVyLmRhdGEoJzB4ZGVhZGJlZWYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhIZXggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgYXdhaXQgY29pblxuICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogUkVDSVBJRU5ULCBhbW91bnQ6IEFNT1VOVCB9XSB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4IH0gYXMgYW55LFxuICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvZmFpbGVkIHRvIGRlY29kZSBjb25maWRlbnRpYWwgdHJhbnNmZXIgY2FsbGRhdGEvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHR4UGFyYW1zIGFtb3VudCBkb2VzIG5vdCBtYXRjaCBidWlsZFBhcmFtcyBhbW91bnQgKHdpdGggdHhIZXgpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGRDb25maWRlbnRpYWxUcmFuc2ZlclR4SGV4KHtcbiAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogV0FMTEVUX0NPTlRSQUNULFxuICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IENURVNUMV9UT0tFTl9BRERSRVNTLFxuICAgICAgcmVjaXBpZW50QWRkcmVzczogUkVDSVBJRU5ULFxuICAgICAgZW5jcnlwdGVkSGFuZGxlOiBIQU5ETEUsXG4gICAgICBpbnB1dFByb29mOiBQUk9PRixcbiAgICB9KTtcblxuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiAnOTk5OTk5OScgfV0gfSxcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHR4SGV4LFxuICAgICAgICAgIGJ1aWxkUGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9hbW91bnQgbWlzbWF0Y2gvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHR4UGFyYW1zIGFtb3VudCBpcyAwICh3aXRoIHR4SGV4KScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkQ29uZmlkZW50aWFsVHJhbnNmZXJUeEhleCh7XG4gICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IFdBTExFVF9DT05UUkFDVCxcbiAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBDVEVTVDFfVE9LRU5fQUREUkVTUyxcbiAgICAgIHJlY2lwaWVudEFkZHJlc3M6IFJFQ0lQSUVOVCxcbiAgICAgIGVuY3J5cHRlZEhhbmRsZTogSEFORExFLFxuICAgICAgaW5wdXRQcm9vZjogUFJPT0YsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBjb2luXG4gICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogJzAnIH1dIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9hbW91bnQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc3RyaW5nLyk7XG4gIH0pO1xuXG4gIC8vIOKUgOKUgCBGaXJzdC1zaWduZXIgKG5vIHR4SGV4KSB0ZXN0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBpdCgnc2hvdWxkIHZlcmlmeSB2YWxpZCBmaXJzdC1zaWduZXIgcGFyYW1zIHdoZW4gbm8gdHhIZXggaXMgcHJlc2VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgIHR4UHJlYnVpbGQ6IHt9IGFzIGFueSxcbiAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgIH0pO1xuICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmVyaWZ5IGZpcnN0LXNpZ25lciBwYXJhbXMgd2hlbiB0eFBhcmFtcyBhbmQgYnVpbGRQYXJhbXMgYW1vdW50cyBtYXRjaCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgIHR4UHJlYnVpbGQ6IHsgYnVpbGRQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogUkVDSVBJRU5ULCBhbW91bnQ6IEFNT1VOVCB9XSB9IH0gYXMgYW55LFxuICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgfSk7XG4gICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHJlY2lwaWVudHMgaXMgZW1wdHkgYW5kIG5vIHR4SGV4IGlzIHByZXNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgY29pblxuICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW10gfSxcbiAgICAgICAgdHhQcmVidWlsZDoge30gYXMgYW55LFxuICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvcmVjaXBpZW50cyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVudHJ5Lyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiByZWNpcGllbnQgYWRkcmVzcyBpcyBpbnZhbGlkIGFuZCBubyB0eEhleCBpcyBwcmVzZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6ICdub3QtYW4tYWRkcmVzcycsIGFtb3VudDogQU1PVU5UIH1dIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHt9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3JlY2lwaWVudCBhZGRyZXNzIGlzIG1pc3Npbmcgb3IgaW52YWxpZC8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IHdoZW4gYW1vdW50IGlzIDAgYW5kIG5vIHR4SGV4IGlzIHByZXNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgY29pblxuICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogUkVDSVBJRU5ULCBhbW91bnQ6ICcwJyB9XSB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7fSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9hbW91bnQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc3RyaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBhbW91bnQgaXMgZW1wdHkgYW5kIG5vIHR4SGV4IGlzIHByZXNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgY29pblxuICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogUkVDSVBJRU5ULCBhbW91bnQ6ICcnIH1dIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHt9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2Ftb3VudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBzdHJpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHR4UGFyYW1zIGFuZCBidWlsZFBhcmFtcyBhbW91bnRzIG1pc21hdGNoIGFuZCBubyB0eEhleCBpcyBwcmVzZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiAnOTk5OTk5OScgfV0gfSxcbiAgICAgICAgdHhQcmVidWlsZDogeyBidWlsZFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0gfSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9hbW91bnQgbWlzbWF0Y2gvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHR4UGFyYW1zIGFuZCBidWlsZFBhcmFtcyByZWNpcGllbnQgYWRkcmVzc2VzIG1pc21hdGNoIGFuZCBubyB0eEhleCBpcyBwcmVzZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIGJ1aWxkUGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFdST05HX1JFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9yZWNpcGllbnQgYWRkcmVzcyBtaXNtYXRjaC8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZlcmlmeSB3aGVuIHR4SGV4IGFic2VudCBhbmQgYnVpbGRQYXJhbXMgaGFzIG1hdGNoaW5nIHJlY2lwaWVudCBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogUkVDSVBJRU5ULCBhbW91bnQ6IEFNT1VOVCB9XSB9LFxuICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICBidWlsZFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0sXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgIH0pO1xuICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmVyaWZ5IGRlY29kZWQgcmVjaXBpZW50IGFnYWluc3QgYnVpbGRQYXJhbXMgd2hlbiB0eFBhcmFtcy5yZWNpcGllbnRzIGlzIGFic2VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkQ29uZmlkZW50aWFsVHJhbnNmZXJUeEhleCh7XG4gICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IFdBTExFVF9DT05UUkFDVCxcbiAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBDVEVTVDFfVE9LRU5fQUREUkVTUyxcbiAgICAgIHJlY2lwaWVudEFkZHJlc3M6IFJFQ0lQSUVOVCxcbiAgICAgIGVuY3J5cHRlZEhhbmRsZTogSEFORExFLFxuICAgICAgaW5wdXRQcm9vZjogUFJPT0YsXG4gICAgfSk7XG5cbiAgICAvLyBObyByZWNpcGllbnRzIGluIHR4UGFyYW1zIOKAlCBmYWxscyBiYWNrIHRvIGJ1aWxkUGFyYW1zIGZvciByZWNpcGllbnQgdmVyaWZpY2F0aW9uXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICB0eFBhcmFtczoge30sXG4gICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgIHR4SGV4LFxuICAgICAgICBidWlsZFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0sXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgIH0pO1xuICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBkZWNvZGVkIHJlY2lwaWVudCBkb2VzIG5vdCBtYXRjaCBidWlsZFBhcmFtcyByZWNpcGllbnQgKHR4UGFyYW1zIGFic2VudCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZENvbmZpZGVudGlhbFRyYW5zZmVyVHhIZXgoe1xuICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiBXQUxMRVRfQ09OVFJBQ1QsXG4gICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogQ1RFU1QxX1RPS0VOX0FERFJFU1MsXG4gICAgICByZWNpcGllbnRBZGRyZXNzOiBSRUNJUElFTlQsXG4gICAgICBlbmNyeXB0ZWRIYW5kbGU6IEhBTkRMRSxcbiAgICAgIGlucHV0UHJvb2Y6IFBST09GLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgY29pblxuICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHt9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgdHhIZXgsXG4gICAgICAgICAgYnVpbGRQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogV1JPTkdfUkVDSVBJRU5ULCBhbW91bnQ6IEFNT1VOVCB9XSB9LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3JlY2lwaWVudCBhZGRyZXNzIG1pc21hdGNoLyk7XG4gIH0pO1xufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhIHRlc3RzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZGVzY3JpYmUoJ2RlY29kZVRva2VuQWRkcmVzc2VzRnJvbURlbGVnYXRpb25DYWxsZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCBkZWNvZGUgYSBzaW5nbGUtdG9rZW4gbXVsdGljYWxsIGNhbGxkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNhbGxkYXRhID0gYnVpbGRNdWx0aWNhbGxEZWxlZ2F0aW9uQ2FsbGRhdGEoREVMRUdBVEVfQUREUkVTUywgW0NURVNUMV9UT0tFTl9BRERSRVNTXSwgRVhQSVJZKTtcbiAgICBjb25zdCBhZGRyZXNzZXMgPSBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEoY2FsbGRhdGEpO1xuICAgIGFkZHJlc3Nlcy5zaG91bGQuZGVlcEVxdWFsKFtDVEVTVDFfVE9LRU5fQUREUkVTUy50b0xvd2VyQ2FzZSgpXSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZGVjb2RlIGEgbXVsdGktdG9rZW4gbXVsdGljYWxsIGNhbGxkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNhbGxkYXRhID0gYnVpbGRNdWx0aWNhbGxEZWxlZ2F0aW9uQ2FsbGRhdGEoXG4gICAgICBERUxFR0FURV9BRERSRVNTLFxuICAgICAgW0NURVNUMV9UT0tFTl9BRERSRVNTLCBDVVNEVF9UT0tFTl9BRERSRVNTXSxcbiAgICAgIEVYUElSWVxuICAgICk7XG4gICAgY29uc3QgYWRkcmVzc2VzID0gZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhKGNhbGxkYXRhKTtcbiAgICBhZGRyZXNzZXMuc2hvdWxkLmRlZXBFcXVhbChbQ1RFU1QxX1RPS0VOX0FERFJFU1MudG9Mb3dlckNhc2UoKSwgQ1VTRFRfVE9LRU5fQUREUkVTUy50b0xvd2VyQ2FzZSgpXSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGFkZHJlc3NlcyBpbiBsb3dlcmNhc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbWl4ZWRDYXNlID0gJzB4N0IxRDU5YmJDRDI5MWRhQTU5Y0I2QzhDNWJjMDREZTFBRkM0YUJBMSc7XG4gICAgY29uc3QgY2FsbGRhdGEgPSBidWlsZE11bHRpY2FsbERlbGVnYXRpb25DYWxsZGF0YShERUxFR0FURV9BRERSRVNTLCBbbWl4ZWRDYXNlXSwgRVhQSVJZKTtcbiAgICBjb25zdCBhZGRyZXNzZXMgPSBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEoY2FsbGRhdGEpO1xuICAgIGFkZHJlc3Nlc1swXS5zaG91bGQuZXF1YWwobWl4ZWRDYXNlLnRvTG93ZXJDYXNlKCkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGhhbmRsZSBjYWxsRnJvbVBhcmVudC13cmFwcGVkIG11bHRpY2FsbCBjYWxsZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpbm5lciA9IGJ1aWxkTXVsdGljYWxsRGVsZWdhdGlvbkNhbGxkYXRhKFxuICAgICAgREVMRUdBVEVfQUREUkVTUyxcbiAgICAgIFtDVEVTVDFfVE9LRU5fQUREUkVTUywgQ1VTRFRfVE9LRU5fQUREUkVTU10sXG4gICAgICBFWFBJUllcbiAgICApO1xuICAgIGNvbnN0IHdyYXBwZWQgPSB3cmFwSW5DYWxsRnJvbVBhcmVudChaQU1BX0FDTF9BRERSRVNTLCBpbm5lcik7XG4gICAgY29uc3QgYWRkcmVzc2VzID0gZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhKHdyYXBwZWQpO1xuICAgIGFkZHJlc3Nlcy5zaG91bGQuZGVlcEVxdWFsKFtDVEVTVDFfVE9LRU5fQUREUkVTUy50b0xvd2VyQ2FzZSgpLCBDVVNEVF9UT0tFTl9BRERSRVNTLnRvTG93ZXJDYXNlKCldKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB3b3JrIHdpdGggY2FsbGRhdGEgbWlzc2luZyAweCBwcmVmaXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY2FsbGRhdGEgPSBidWlsZE11bHRpY2FsbERlbGVnYXRpb25DYWxsZGF0YShERUxFR0FURV9BRERSRVNTLCBbQ1RFU1QxX1RPS0VOX0FERFJFU1NdLCBFWFBJUlkpO1xuICAgIGNvbnN0IG5vUHJlZml4ID0gY2FsbGRhdGEuc2xpY2UoMik7IC8vIHN0cmlwIDB4XG4gICAgY29uc3QgYWRkcmVzc2VzID0gZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhKG5vUHJlZml4KTtcbiAgICBhZGRyZXNzZXMuc2hvdWxkLmRlZXBFcXVhbChbQ1RFU1QxX1RPS0VOX0FERFJFU1MudG9Mb3dlckNhc2UoKV0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGZvciB1bnJlY29nbmlzZWQgY2FsbGRhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgc2hvdWxkLnRocm93cyhcbiAgICAgICgpID0+IGRlY29kZVRva2VuQWRkcmVzc2VzRnJvbURlbGVnYXRpb25DYWxsZGF0YSgnMHhkZWFkYmVlZjAwMDAwMDAwJyksXG4gICAgICAvTm90IGEgdmFsaWQgZGVsZWdhdGlvbiBjYWxsZGF0YS9cbiAgICApO1xuICB9KTtcbn0pO1xuIl19
|
|
878
|
+
// ---------------------------------------------------------------------------
|
|
879
|
+
// verifyTransaction – confidential consolidation (FlushERC7984ForwarderToken)
|
|
880
|
+
// ---------------------------------------------------------------------------
|
|
881
|
+
const MULTISIG_WALLET_CONTRACT = '0x3b58684525564b38a381e46a731703ed03f32122';
|
|
882
|
+
const CONSOLIDATION_FORWARDER = '0xf4bcb366bb5e34ebbee51fae5de98cc876c0146f';
|
|
883
|
+
const CONSOLIDATION_BASE_ADDRESS = '0x3b58684525564b38a381e46a731703ed03f32122';
|
|
884
|
+
const CONSOLIDATION_HANDLE = '0x65df136b609ab395c1a99ae46f7939c7f8b20dff4bff0000000088bb0050';
|
|
885
|
+
const DUMMY_MULTISIG_SIGNATURE = '0x' + '00'.repeat(65);
|
|
886
|
+
async function buildMultisigConsolidationTxHex() {
|
|
887
|
+
const flushCalldata = (0, abstract_eth_1.buildFlushERC7984ForwarderTokenCalldata)(CTEST1_TOKEN_ADDRESS, CONSOLIDATION_BASE_ADDRESS, CONSOLIDATION_HANDLE);
|
|
888
|
+
const sendData = (0, abstract_eth_1.sendMultiSigData)(CONSOLIDATION_FORWARDER, '0', flushCalldata, Math.floor(Date.now() / 1000) + 3600, 14, DUMMY_MULTISIG_SIGNATURE);
|
|
889
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
|
|
890
|
+
txBuilder.fee({ fee: '1000000000', gasLimit: '12100000' });
|
|
891
|
+
txBuilder.counter(1);
|
|
892
|
+
txBuilder.type(sdk_core_1.TransactionType.ContractCall);
|
|
893
|
+
txBuilder.contract(MULTISIG_WALLET_CONTRACT);
|
|
894
|
+
txBuilder.data(sendData);
|
|
895
|
+
const tx = await txBuilder.build();
|
|
896
|
+
return tx.toBroadcastFormat();
|
|
897
|
+
}
|
|
898
|
+
async function buildDirectConsolidationTxHex() {
|
|
899
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
|
|
900
|
+
txBuilder.fee({ fee: '1000000000', gasLimit: '200000' });
|
|
901
|
+
txBuilder.counter(1);
|
|
902
|
+
txBuilder.type(sdk_core_1.TransactionType.FlushERC7984ForwarderToken);
|
|
903
|
+
txBuilder.contract(CONSOLIDATION_FORWARDER);
|
|
904
|
+
txBuilder.forwarderAddress(CONSOLIDATION_FORWARDER);
|
|
905
|
+
txBuilder.tokenContractAddress(CTEST1_TOKEN_ADDRESS);
|
|
906
|
+
txBuilder.parentAddress(CONSOLIDATION_BASE_ADDRESS);
|
|
907
|
+
txBuilder.encryptedHandle(CONSOLIDATION_HANDLE);
|
|
908
|
+
const tx = await txBuilder.build();
|
|
909
|
+
return tx.toBroadcastFormat();
|
|
910
|
+
}
|
|
911
|
+
describe('verifyTransaction – confidential consolidation (FlushERC7984ForwarderToken)', function () {
|
|
912
|
+
let bitgo;
|
|
913
|
+
let coin;
|
|
914
|
+
before(function () {
|
|
915
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
|
|
916
|
+
bitgo.initializeTestVars();
|
|
917
|
+
(0, register_1.register)(bitgo);
|
|
918
|
+
coin = bitgo.coin('hteth:ctest1');
|
|
919
|
+
});
|
|
920
|
+
it('should verify a valid multisig consolidation tx (sendMultiSig → callFromParent → confidentialTransferNoProof)', async function () {
|
|
921
|
+
const txHex = await buildMultisigConsolidationTxHex();
|
|
922
|
+
const wallet = new sdk_core_1.Wallet(bitgo, coin, {
|
|
923
|
+
coinSpecific: { baseAddress: CONSOLIDATION_BASE_ADDRESS },
|
|
924
|
+
});
|
|
925
|
+
const result = await coin.verifyTransaction({
|
|
926
|
+
txParams: { type: 'consolidate' },
|
|
927
|
+
txPrebuild: {
|
|
928
|
+
consolidateId: '6a44ebc0326e1be45c1d797542c8c634',
|
|
929
|
+
txHex,
|
|
930
|
+
recipients: [{ address: CONSOLIDATION_FORWARDER, amount: '0' }],
|
|
931
|
+
},
|
|
932
|
+
wallet,
|
|
933
|
+
});
|
|
934
|
+
result.should.equal(true);
|
|
935
|
+
});
|
|
936
|
+
it('should verify a valid direct callFromParent consolidation tx (TSS shape)', async function () {
|
|
937
|
+
const txHex = await buildDirectConsolidationTxHex();
|
|
938
|
+
const wallet = new sdk_core_1.Wallet(bitgo, coin, {
|
|
939
|
+
coinSpecific: { baseAddress: CONSOLIDATION_BASE_ADDRESS },
|
|
940
|
+
});
|
|
941
|
+
const result = await coin.verifyTransaction({
|
|
942
|
+
txParams: { type: 'consolidate' },
|
|
943
|
+
txPrebuild: {
|
|
944
|
+
consolidateId: '6a44ebc0326e1be45c1d797542c8c634',
|
|
945
|
+
txHex,
|
|
946
|
+
},
|
|
947
|
+
wallet,
|
|
948
|
+
verification: { consolidationToBaseAddress: true },
|
|
949
|
+
});
|
|
950
|
+
result.should.equal(true);
|
|
951
|
+
});
|
|
952
|
+
it('should reject multisig consolidation when parent address does not match wallet base address', async function () {
|
|
953
|
+
const txHex = await buildMultisigConsolidationTxHex();
|
|
954
|
+
const wallet = new sdk_core_1.Wallet(bitgo, coin, {
|
|
955
|
+
coinSpecific: { baseAddress: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' },
|
|
956
|
+
});
|
|
957
|
+
await coin
|
|
958
|
+
.verifyTransaction({
|
|
959
|
+
txParams: { type: 'consolidate' },
|
|
960
|
+
txPrebuild: { consolidateId: 'abc123', txHex },
|
|
961
|
+
wallet,
|
|
962
|
+
})
|
|
963
|
+
.should.be.rejectedWith(/parent address mismatch/);
|
|
964
|
+
});
|
|
965
|
+
it('should verify multisig consolidation using forwarder address from txPrebuild.txInfo.recipients', async function () {
|
|
966
|
+
const txHex = await buildMultisigConsolidationTxHex();
|
|
967
|
+
const wallet = new sdk_core_1.Wallet(bitgo, coin, {
|
|
968
|
+
coinSpecific: { baseAddress: CONSOLIDATION_BASE_ADDRESS },
|
|
969
|
+
});
|
|
970
|
+
// No top-level recipients; forwarder comes from txInfo.recipients
|
|
971
|
+
const result = await coin.verifyTransaction({
|
|
972
|
+
txParams: { type: 'consolidate' },
|
|
973
|
+
txPrebuild: {
|
|
974
|
+
consolidateId: '6a44ebc0326e1be45c1d797542c8c634',
|
|
975
|
+
txHex,
|
|
976
|
+
txInfo: { recipients: [{ address: CONSOLIDATION_FORWARDER, amount: '0' }] },
|
|
977
|
+
},
|
|
978
|
+
wallet,
|
|
979
|
+
});
|
|
980
|
+
result.should.equal(true);
|
|
981
|
+
});
|
|
982
|
+
it('should reject multisig consolidation when txInfo.recipients forwarder address does not match tx forwarder', async function () {
|
|
983
|
+
const txHex = await buildMultisigConsolidationTxHex();
|
|
984
|
+
const wallet = new sdk_core_1.Wallet(bitgo, coin, {
|
|
985
|
+
coinSpecific: { baseAddress: CONSOLIDATION_BASE_ADDRESS },
|
|
986
|
+
});
|
|
987
|
+
await coin
|
|
988
|
+
.verifyTransaction({
|
|
989
|
+
txParams: { type: 'consolidate' },
|
|
990
|
+
txPrebuild: {
|
|
991
|
+
consolidateId: 'abc123',
|
|
992
|
+
txHex,
|
|
993
|
+
txInfo: { recipients: [{ address: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', amount: '0' }] },
|
|
994
|
+
},
|
|
995
|
+
wallet,
|
|
996
|
+
})
|
|
997
|
+
.should.be.rejectedWith(/forwarder address mismatch/);
|
|
998
|
+
});
|
|
999
|
+
});
|
|
1000
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJjNzk4NFRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2VyYzc5ODRUb2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7OztHQVFHO0FBQ0gsb0RBQTRCO0FBQzVCLDRDQUEwQztBQUMxQyw4Q0FBMEQ7QUFDMUQsOENBQTBEO0FBQzFELHNEQU82QjtBQUc3Qiw2Q0FBMEM7QUFDMUMsaURBQThDO0FBQzlDLDJEQUE2QztBQUU3Qyw4RUFBOEU7QUFDOUUsWUFBWTtBQUNaLDhFQUE4RTtBQUU5RSwwRUFBMEU7QUFDMUUsTUFBTSxnQkFBZ0IsR0FBRyw0Q0FBNEMsQ0FBQztBQUN0RSxNQUFNLGdCQUFnQixHQUFHLDRDQUE0QyxDQUFDO0FBRXRFLHNFQUFzRTtBQUN0RSxNQUFNLG9CQUFvQixHQUFHLDRDQUE0QyxDQUFDO0FBQzFFLHFFQUFxRTtBQUNyRSxNQUFNLG1CQUFtQixHQUFHLDRDQUE0QyxDQUFDO0FBRXpFLE1BQU0sbUJBQW1CLEdBQUcsNENBQTRDLENBQUM7QUFDekUsTUFBTSxpQkFBaUIsR0FBRyw0Q0FBNEMsQ0FBQztBQUN2RSxNQUFNLGlCQUFpQixHQUFHLDRDQUE0QyxDQUFDO0FBRXZFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFFM0QsOEVBQThFO0FBQzlFLFVBQVU7QUFDViw4RUFBOEU7QUFFOUU7O0dBRUc7QUFDSCxLQUFLLFVBQVUsb0JBQW9CLENBQUMsVUFBa0IsRUFBRSxjQUF3QixFQUFFLEtBQUssR0FBRyxHQUFHO0lBQzNGLE1BQU0sU0FBUyxHQUFHLElBQUEsdUJBQVUsRUFBQyxPQUFPLENBQXVCLENBQUM7SUFDNUQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFF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QUFNO1NBQ1AsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMkdBQTJHLEVBQUUsS0FBSztRQUNuSCxNQUFNLEtBQUssR0FBRyxNQUFNLCtCQUErQixFQUFFLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxpQkFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUU7WUFDckMsWUFBWSxFQUFFLEVBQUUsV0FBVyxFQUFFLDBCQUEwQixFQUFFO1NBQzFELENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSTthQUNQLGlCQUFpQixDQUFDO1lBQ2pCLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQVM7WUFDeEMsVUFBVSxFQUFFO2dCQUNWLGFBQWEsRUFBRSxRQUFRO2dCQUN2QixLQUFLO2dCQUNMLE1BQU0sRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLDRDQUE0QyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO2FBQzFGO1lBQ1IsTUFBTTtTQUNQLENBQUM7YUFDRCxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVuaXQgdGVzdHMgZm9yIEVyYzc5ODRUb2tlbi5cbiAqXG4gKiBDb3ZlcnM6XG4gKiAgIC0gZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnXG4gKiAgIC0gdmVyaWZ5VHJhbnNhY3Rpb24gKFRTUyBhbmQgbXVsdGlzaWcgcGF0aHMpXG4gKiAgIC0gdmVyaWZ5VHJhbnNhY3Rpb24gKGNvbmZpZGVudGlhbCB0cmFuc2ZlciAvIFNlbmRFUkM3OTg0IHBhdGgpXG4gKiAgIC0gZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhIChyb3VuZC10cmlwIGFuZCBmb3J3YXJkZXItd3JhcHBlZClcbiAqL1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUsIFdhbGxldCB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQge1xuICBidWlsZE11bHRpY2FsbERlbGVnYXRpb25DYWxsZGF0YSxcbiAgYnVpbGRGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbkNhbGxkYXRhLFxuICBzZW5kTXVsdGlTaWdEYXRhLFxuICB3cmFwSW5DYWxsRnJvbVBhcmVudCxcbiAgZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhLFxuICBUcmFuc2ZlckJ1aWxkZXJFUkM3OTg0LFxufSBmcm9tICdAYml0Z28vYWJzdHJhY3QtZXRoJztcbmltcG9ydCB7IEVyYzc5ODRUb2tlbiB9IGZyb20gJy4uLy4uL3NyYy9lcmM3OTg0VG9rZW4nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjL2xpYic7XG5pbXBvcnQgeyBnZXRCdWlsZGVyIH0gZnJvbSAnLi9nZXRCdWlsZGVyJztcbmltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSAnLi4vLi4vc3JjL3JlZ2lzdGVyJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL3Jlc291cmNlcy9ldGgnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbnN0YW50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEhvb2RpIEFDTCBjb250cmFjdCBhZGRyZXNzIChOZXR3b3Jrcy50ZXN0Lmhvb2RpLnphbWFBY2xDb250cmFjdEFkZHJlc3MpXG5jb25zdCBaQU1BX0FDTF9BRERSRVNTID0gJzB4NmQzZmFmNmY4NmUxZmY5ZjNiMDgzMWRkYTkyMGFiYTFjYmQ1YmQ2OCc7XG5jb25zdCBERUxFR0FURV9BRERSRVNTID0gJzB4MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSc7XG5cbi8vIGh0ZXRoOmN0ZXN0MSB0b2tlbiBjb250cmFjdCBhZGRyZXNzIChmcm9tIHN0YXRpY3MvZXJjNzk4NFRva2Vucy50cylcbmNvbnN0IENURVNUMV9UT0tFTl9BRERSRVNTID0gJzB4N2IxZDU5YmJjZDI5MWRhYTU5Y2I2YzhjNWJjMDRkZTFhZmM0YWJhMSc7XG4vLyBodGV0aDpjdXNkdCB0b2tlbiBjb250cmFjdCBhZGRyZXNzIChmcm9tIHN0YXRpY3MvZXJjNzk4NFRva2Vucy50cylcbmNvbnN0IENVU0RUX1RPS0VOX0FERFJFU1MgPSAnMHgyZGViYmUwNDg3ZWY5MjFkZjQ0NTdmOWUzNmVkMDViZTJkZjFhYzc1JztcblxuY29uc3QgV1JPTkdfVE9LRU5fQUREUkVTUyA9ICcweGRlYWRiZWVmZGVhZGJlZWZkZWFkYmVlZmRlYWRiZWVmZGVhZGJlZWYnO1xuY29uc3QgV1JPTkdfQUNMX0FERFJFU1MgPSAnMHhhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhJztcbmNvbnN0IEZPUldBUkRFUl9BRERSRVNTID0gJzB4MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCc7XG5cbmNvbnN0IEVYUElSWSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgMzY1ICogODY0MDA7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQnVpbGRzIGEgcm9vdC13YWxsZXQgZGVsZWdhdGlvbiB0eCBoZXggKHRvID0gQUNMLCBkYXRhID0gbXVsdGljYWxsKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGREZWxlZ2F0aW9uVHhIZXgoYWNsQWRkcmVzczogc3RyaW5nLCB0b2tlbkFkZHJlc3Nlczogc3RyaW5nW10sIHZhbHVlID0gJzAnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcignaHRldGgnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gIHR4QnVpbGRlci5mZWUoeyBmZWU6ICcxMDAwMDAwMDAwJywgZ2FzTGltaXQ6ICcyMDAwMDAnIH0pO1xuICB0eEJ1aWxkZXIuY291bnRlcigxKTtcbiAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbCk7XG4gIHR4QnVpbGRlci5jb250cmFjdChhY2xBZGRyZXNzKTtcbiAgY29uc3QgY2FsbGRhdGEgPSBidWlsZE11bHRpY2FsbERlbGVnYXRpb25DYWxsZGF0YShERUxFR0FURV9BRERSRVNTLCB0b2tlbkFkZHJlc3NlcywgRVhQSVJZKTtcbiAgdHhCdWlsZGVyLmRhdGEoY2FsbGRhdGEpO1xuICBpZiAodmFsdWUgIT09ICcwJykge1xuICAgIHR4QnVpbGRlci52YWx1ZSh2YWx1ZSk7XG4gIH1cbiAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgcmV0dXJuIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZm9yd2FyZGVyIGRlbGVnYXRpb24gdHggaGV4ICh0byA9IGZvcndhcmRlciwgZGF0YSA9IGNhbGxGcm9tUGFyZW50KEFDTCwgMCwgbXVsdGljYWxsKSkuXG4gKiBUaGlzIG1pcnJvcnMgd2hhdCBEZWNyeXB0aW9uRGVsZWdhdGlvbkJ1aWxkZXIuYnVpbGQoKSByZXR1cm5zIHdoZW4gZm9yd2FyZGVyQWRkcmVzcyBpcyBzZXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkRm9yd2FyZGVyRGVsZWdhdGlvblR4SGV4KFxuICBmb3J3YXJkZXJBZGRyZXNzOiBzdHJpbmcsXG4gIGFjbEFkZHJlc3M6IHN0cmluZyxcbiAgdG9rZW5BZGRyZXNzZXM6IHN0cmluZ1tdXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCdodGV0aCcpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgdHhCdWlsZGVyLmZlZSh7IGZlZTogJzEwMDAwMDAwMDAnLCBnYXNMaW1pdDogJzIwMDAwMCcgfSk7XG4gIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsKTtcbiAgdHhCdWlsZGVyLmNvbnRyYWN0KGZvcndhcmRlckFkZHJlc3MpO1xuICBjb25zdCBpbm5lckNhbGxkYXRhID0gYnVpbGRNdWx0aWNhbGxEZWxlZ2F0aW9uQ2FsbGRhdGEoREVMRUdBVEVfQUREUkVTUywgdG9rZW5BZGRyZXNzZXMsIEVYUElSWSk7XG4gIGNvbnN0IG91dGVyQ2FsbGRhdGEgPSB3cmFwSW5DYWxsRnJvbVBhcmVudChhY2xBZGRyZXNzLCBpbm5lckNhbGxkYXRhKTtcbiAgdHhCdWlsZGVyLmRhdGEob3V0ZXJDYWxsZGF0YSk7XG4gIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gIHJldHVybiB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRlc3RzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZGVzY3JpYmUoJ0VyYzc5ODRUb2tlbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBjb2luOiBFcmM3OTg0VG9rZW47XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICd0ZXN0JyB9KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICByZWdpc3RlcihiaXRnbyk7XG4gICAgY29pbiA9IGJpdGdvLmNvaW4oJ2h0ZXRoOmN0ZXN0MScpIGFzIEVyYzc5ODRUb2tlbjtcbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBkZXNjcmliZSgnZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHJlcXVpcmVzVG9rZW5FbmFibGVtZW50OiB0cnVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29uZmlnID0gY29pbi5nZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTtcbiAgICAgIGNvbmZpZy5yZXF1aXJlc1Rva2VuRW5hYmxlbWVudC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBzdXBwb3J0c011bHRpcGxlVG9rZW5FbmFibGVtZW50czogdHJ1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGNvaW4uZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnKCk7XG4gICAgICBjb25maWcuc3VwcG9ydHNNdWx0aXBsZVRva2VuRW5hYmxlbWVudHMuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGRlc2NyaWJlKCd2ZXJpZnlUcmFuc2FjdGlvbiDigJMgbm9uLWVuYWJsZS10b2tlbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJvdXRlIHRvIGNvbmZpZGVudGlhbCB0cmFuc2ZlciBwYXRoIHdoZW4gdHlwZSBpcyBub3QgZW5hYmxldG9rZW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBOb24tZW5hYmxldG9rZW4gdHJhbnNhY3Rpb25zIHJvdXRlIHRvIHZlcmlmeUNvbmZpZGVudGlhbFRyYW5zZmVyLlxuICAgICAgLy8gRW1wdHkgcmVjaXBpZW50cyB0cmlnZ2VycyBvdXIgRVJDNzk4NC1zcGVjaWZpYyB2YWxpZGF0aW9uIGVycm9yLFxuICAgICAgLy8gY29uZmlybWluZyB0aGUgb3ZlcnJpZGUgb25seSBpbnRlcmNlcHRzIHRoZSBlbmFibGV0b2tlbiB0eXBlLlxuICAgICAgYXdhaXQgY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFtdIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDoge30gYXMgYW55LFxuICAgICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvcmVjaXBpZW50cyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVudHJ5Lyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZGVzY3JpYmUoJ3ZlcmlmeVRyYW5zYWN0aW9uIOKAkyBUU1MgcGF0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBhIHZhbGlkIHNpbmdsZS10b2tlbiBkZWxlZ2F0aW9uIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZERlbGVnYXRpb25UeEhleChaQU1BX0FDTF9BRERSRVNTLCBbQ1RFU1QxX1RPS0VOX0FERFJFU1NdKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgZW5hYmxlVG9rZW5zOiBbeyBuYW1lOiAnaHRldGg6Y3Rlc3QxJyB9XSxcbiAgICAgICAgfSxcbiAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSB2YWxpZCBtdWx0aS10b2tlbiBkZWxlZ2F0aW9uIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZERlbGVnYXRpb25UeEhleChaQU1BX0FDTF9BRERSRVNTLCBbQ1RFU1QxX1RPS0VOX0FERFJFU1MsIENVU0RUX1RPS0VOX0FERFJFU1NdKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgZW5hYmxlVG9rZW5zOiBbeyBuYW1lOiAnaHRldGg6Y3Rlc3QxJyB9LCB7IG5hbWU6ICdodGV0aDpjdXNkdCcgfV0sXG4gICAgICAgIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBBQ0wgYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGREZWxlZ2F0aW9uVHhIZXgoV1JPTkdfQUNMX0FERFJFU1MsIFtDVEVTVDFfVE9LRU5fQUREUkVTU10pO1xuICAgICAgYXdhaXQgY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnZW5hYmxldG9rZW4nLFxuICAgICAgICAgICAgZW5hYmxlVG9rZW5zOiBbeyBuYW1lOiAnaHRldGg6Y3Rlc3QxJyB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9kb2VzIG5vdCBtYXRjaCBBQ0wgY29udHJhY3QvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBjYWxsZGF0YSBjb250YWlucyB3cm9uZyB0b2tlbiBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZERlbGVnYXRpb25UeEhleChaQU1BX0FDTF9BRERSRVNTLCBbV1JPTkdfVE9LRU5fQUREUkVTU10pO1xuICAgICAgYXdhaXQgY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnZW5hYmxldG9rZW4nLFxuICAgICAgICAgICAgZW5hYmxlVG9rZW5zOiBbeyBuYW1lOiAnaHRldGg6Y3Rlc3QxJyB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9ub3QgZm91bmQgaW4gZGVsZWdhdGlvbiBjYWxsZGF0YS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSB2YWxpZCBmb3J3YXJkZXIgZGVsZWdhdGlvbiB0eCAoY2FsbEZyb21QYXJlbnQgc2hhcGUpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZEZvcndhcmRlckRlbGVnYXRpb25UeEhleChGT1JXQVJERVJfQUREUkVTUywgWkFNQV9BQ0xfQUREUkVTUywgW0NURVNUMV9UT0tFTl9BRERSRVNTXSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICB0eXBlOiAnZW5hYmxldG9rZW4nLFxuICAgICAgICAgIGVuYWJsZVRva2VuczogW3sgbmFtZTogJ2h0ZXRoOmN0ZXN0MScgfV0sXG4gICAgICAgIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IGEgZm9yd2FyZGVyIGRlbGVnYXRpb24gdHggd2l0aCBtdWx0aXBsZSB0b2tlbnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkRm9yd2FyZGVyRGVsZWdhdGlvblR4SGV4KEZPUldBUkRFUl9BRERSRVNTLCBaQU1BX0FDTF9BRERSRVNTLCBbXG4gICAgICAgIENURVNUMV9UT0tFTl9BRERSRVNTLFxuICAgICAgICBDVVNEVF9UT0tFTl9BRERSRVNTLFxuICAgICAgXSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICB0eXBlOiAnZW5hYmxldG9rZW4nLFxuICAgICAgICAgIGVuYWJsZVRva2VuczogW3sgbmFtZTogJ2h0ZXRoOmN0ZXN0MScgfSwgeyBuYW1lOiAnaHRldGg6Y3VzZHQnIH1dLFxuICAgICAgICB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4IH0gYXMgYW55LFxuICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gZm9yd2FyZGVyIGNhbGxkYXRhIGNvbnRhaW5zIHdyb25nIHRva2VuIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkRm9yd2FyZGVyRGVsZWdhdGlvblR4SGV4KEZPUldBUkRFUl9BRERSRVNTLCBaQU1BX0FDTF9BRERSRVNTLCBbV1JPTkdfVE9LRU5fQUREUkVTU10pO1xuICAgICAgYXdhaXQgY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnZW5hYmxldG9rZW4nLFxuICAgICAgICAgICAgZW5hYmxlVG9rZW5zOiBbeyBuYW1lOiAnaHRldGg6Y3Rlc3QxJyB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9ub3QgZm91bmQgaW4gZGVsZWdhdGlvbiBjYWxsZGF0YS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGNhbGxkYXRhIGhhcyB1bnJlY29nbmlzZWQgbWV0aG9kIElEJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQnVpbGQgYSB0eCB3aXRoIGFyYml0cmFyeSBjYWxsZGF0YSB0aGF0IGlzIG5laXRoZXIgbXVsdGljYWxsIG5vciBjYWxsRnJvbVBhcmVudFxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcignaHRldGgnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHsgZmVlOiAnMTAwMDAwMDAwMCcsIGdhc0xpbWl0OiAnMjAwMDAwJyB9KTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbCk7XG4gICAgICB0eEJ1aWxkZXIuY29udHJhY3QoWkFNQV9BQ0xfQUREUkVTUyk7XG4gICAgICB0eEJ1aWxkZXIuZGF0YSgnMHhkZWFkYmVlZicpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SGV4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgYXdhaXQgY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnZW5hYmxldG9rZW4nLFxuICAgICAgICAgICAgZW5hYmxlVG9rZW5zOiBbeyBuYW1lOiAnaHRldGg6Y3Rlc3QxJyB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC91bnJlY29nbmlzZWQgY2FsbGRhdGEgbWV0aG9kIElELyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gdHJhbnNhY3Rpb24gdmFsdWUgaXMgbm90IDAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkRGVsZWdhdGlvblR4SGV4KFpBTUFfQUNMX0FERFJFU1MsIFtDVEVTVDFfVE9LRU5fQUREUkVTU10sICcxJyk7XG4gICAgICBhd2FpdCBjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IFt7IG5hbWU6ICdodGV0aDpjdGVzdDEnIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2V4cGVjdGVkIHRyYW5zYWN0aW9uIHZhbHVlIDAvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBlbmFibGVUb2tlbnMgaXMgZW1wdHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkRGVsZWdhdGlvblR4SGV4KFpBTUFfQUNMX0FERFJFU1MsIFtDVEVTVDFfVE9LRU5fQUREUkVTU10pO1xuICAgICAgYXdhaXQgY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnZW5hYmxldG9rZW4nLFxuICAgICAgICAgICAgZW5hYmxlVG9rZW5zOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9lbmFibGVUb2tlbnMgbXVzdCBiZSBub24tZW1wdHkvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB0eEhleCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnZW5hYmxldG9rZW4nLFxuICAgICAgICAgICAgZW5hYmxlVG9rZW5zOiBbeyBuYW1lOiAnaHRldGg6Y3Rlc3QxJyB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHt9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL21pc3NpbmcgdHhIZXgvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBkZXNjcmliZSgndmVyaWZ5VHJhbnNhY3Rpb24g4oCTIG11bHRpc2lnIHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgdmFsaWQgYnVpbGRQYXJhbXMgcmVjaXBpZW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgcmVjaXBpZW50czogW3sgdG9rZW5OYW1lOiAnaHRldGg6Y3Rlc3QxJywgYWRkcmVzczogJzB4YWJjJywgYW1vdW50OiAnMCcgfV0gYXMgYW55LFxuICAgICAgICB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgYnVpbGRQYXJhbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBbeyB0b2tlbk5hbWU6ICdodGV0aDpjdGVzdDEnLCBhZGRyZXNzOiAnMHhhYmMnLCBhbW91bnQ6ICcwJyB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICAgIHdhbGxldFR5cGU6ICdvbmNoYWluJyxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IG11bHRpcGxlIHRva2VuIHJlY2lwaWVudHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICB0eXBlOiAnZW5hYmxldG9rZW4nLFxuICAgICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICAgIHsgdG9rZW5OYW1lOiAnaHRldGg6Y3Rlc3QxJywgYWRkcmVzczogJzB4YWJjJywgYW1vdW50OiAnMCcgfSxcbiAgICAgICAgICAgIHsgdG9rZW5OYW1lOiAnaHRldGg6Y3VzZHQnLCBhZGRyZXNzOiAnMHhhYmMnLCBhbW91bnQ6ICcwJyB9LFxuICAgICAgICAgIF0gYXMgYW55LFxuICAgICAgICB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgYnVpbGRQYXJhbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICAgIHsgdG9rZW5OYW1lOiAnaHRldGg6Y3Rlc3QxJywgYWRkcmVzczogJzB4YWJjJywgYW1vdW50OiAnMCcgfSxcbiAgICAgICAgICAgICAgeyB0b2tlbk5hbWU6ICdodGV0aDpjdXNkdCcsIGFkZHJlc3M6ICcweGFiYycsIGFtb3VudDogJzAnIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgYW55LFxuICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0VHlwZTogJ29uY2hhaW4nLFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGJ1aWxkUGFyYW1zIHJlY2lwaWVudHMgaGF2ZSB3cm9uZyB0b2tlbk5hbWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBbeyB0b2tlbk5hbWU6ICdodGV0aDpjdGVzdDEnLCBhZGRyZXNzOiAnMHhhYmMnLCBhbW91bnQ6ICcwJyB9XSBhcyBhbnksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgICBidWlsZFBhcmFtczoge1xuICAgICAgICAgICAgICB0eXBlOiAnZW5hYmxldG9rZW4nLFxuICAgICAgICAgICAgICByZWNpcGllbnRzOiBbeyB0b2tlbk5hbWU6ICdodGV0aDp3cm9uZ3Rva2VuJywgYWRkcmVzczogJzB4YWJjJywgYW1vdW50OiAnMCcgfV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgICAgIHdhbGxldFR5cGU6ICdvbmNoYWluJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL25vdCBmb3VuZCBpbiBidWlsZFBhcmFtcyByZWNpcGllbnRzLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gYW1vdW50IGlzIG5vdCAwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnZW5hYmxldG9rZW4nLFxuICAgICAgICAgICAgcmVjaXBpZW50czogW3sgdG9rZW5OYW1lOiAnaHRldGg6Y3Rlc3QxJywgYWRkcmVzczogJzB4YWJjJywgYW1vdW50OiAnMCcgfV0gYXMgYW55LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgICAgYnVpbGRQYXJhbXM6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2VuYWJsZXRva2VuJyxcbiAgICAgICAgICAgICAgcmVjaXBpZW50czogW3sgdG9rZW5OYW1lOiAnaHRldGg6Y3Rlc3QxJywgYWRkcmVzczogJzB4YWJjJywgYW1vdW50OiAnMTAwJyB9XSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ29uY2hhaW4nLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvZXhwZWN0ZWQgYW1vdW50IDAvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiByZWNpcGllbnRzIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdlbmFibGV0b2tlbicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgICBidWlsZFBhcmFtczoge30sXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ29uY2hhaW4nLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbWlzc2luZyBidWlsZFBhcmFtcy5yZWNpcGllbnRzLyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gdmVyaWZ5VHJhbnNhY3Rpb24g4oCTIGNvbmZpZGVudGlhbCB0cmFuc2ZlciAoU2VuZEVSQzc5ODQpIHRlc3RzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBCdWlsZCBhIHJhdyBzaWduZWQgc2VuZE11bHRpU2lnIHR4IGhleCB0aGF0IHdyYXBzIGEgY29uZmlkZW50aWFsVHJhbnNmZXIgY2FsbC5cbiAqIFRoZSB3YWxsZXQgY29udHJhY3QgKHNlbmRNdWx0aVNpZyB3cmFwcGVyKSBpcyBgd2FsbGV0Q29udHJhY3RBZGRyZXNzYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRDb25maWRlbnRpYWxUcmFuc2ZlclR4SGV4KG9wdHM6IHtcbiAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIHJlY2lwaWVudEFkZHJlc3M6IHN0cmluZztcbiAgZW5jcnlwdGVkSGFuZGxlOiBzdHJpbmc7XG4gIGlucHV0UHJvb2Y6IHN0cmluZztcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBrZXkgPSB0ZXN0RGF0YS5LRVlQQUlSX1BSVi5nZXRLZXlzKCkucHJ2IGFzIHN0cmluZztcbiAgY29uc3QgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcignaHRldGgnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gIHR4QnVpbGRlci5mZWUoeyBmZWU6ICcxMDAwMDAwMDAwJywgZ2FzTGltaXQ6ICcxMjEwMDAwMCcgfSk7XG4gIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICB0eEJ1aWxkZXIuY29udHJhY3Qob3B0cy53YWxsZXRDb250cmFjdEFkZHJlc3MpO1xuICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZEVSQzc5ODQpO1xuXG4gIGNvbnN0IHRyYW5zZmVyQnVpbGRlciA9IHR4QnVpbGRlci50cmFuc2ZlcigpIGFzIFRyYW5zZmVyQnVpbGRlckVSQzc5ODQ7XG4gIHRyYW5zZmVyQnVpbGRlclxuICAgIC5mcm9tKCcweDE5NjQ1MDMyYzdmMTUzMzM5NWQ0NGE2Mjk0NjJlNzUxMDg0ZDNlNGQnKVxuICAgIC50byhvcHRzLnJlY2lwaWVudEFkZHJlc3MpXG4gICAgLnRva2VuQ29udHJhY3RBZGRyZXNzKG9wdHMudG9rZW5Db250cmFjdEFkZHJlc3MpXG4gICAgLmVuY3J5cHRlZEhhbmRsZShvcHRzLmVuY3J5cHRlZEhhbmRsZSlcbiAgICAuaW5wdXRQcm9vZihvcHRzLmlucHV0UHJvb2YpXG4gICAgLmNvbnRyYWN0U2VxdWVuY2VJZCgxKVxuICAgIC5leHBpcmF0aW9uVGltZShNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIDM2MDApXG4gICAgLmtleShrZXkpO1xuXG4gIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5QUklWQVRFX0tFWSB9KTtcbiAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgcmV0dXJuIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG59XG5cbmRlc2NyaWJlKCd2ZXJpZnlUcmFuc2FjdGlvbiDigJMgY29uZmlkZW50aWFsIHRyYW5zZmVyIChTZW5kRVJDNzk4NCknLCBmdW5jdGlvbiAoKSB7XG4gIC8vIFdhbGxldCBjb250cmFjdCB0aGF0IHdyYXBzIHRoZSBzZW5kTXVsdGlTaWcgY2FsbFxuICBjb25zdCBXQUxMRVRfQ09OVFJBQ1QgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgLy8gUmVjaXBpZW50IG9mIHRoZSBjb25maWRlbnRpYWwgdHJhbnNmZXJcbiAgY29uc3QgUkVDSVBJRU5UID0gJzB4MTk2NDUwMzJjN2YxNTMzMzk1ZDQ0YTYyOTQ2MmU3NTEwODRkM2U0Yyc7XG4gIC8vIEVuY3J5cHRlZCBoYW5kbGU6IHN5bnRoZXRpYyAzMiBieXRlc1xuICBjb25zdCBIQU5ETEUgPSAnMHgnICsgJ2FiJy5yZXBlYXQoMzIpO1xuICAvLyBJbnB1dCBwcm9vZjogc3ludGhldGljIDUwIGJ5dGVzXG4gIGNvbnN0IFBST09GID0gJzB4JyArICdjZCcucmVwZWF0KDUwKTtcbiAgLy8gQSBkaWZmZXJlbnQgcmVjaXBpZW50IHRvIHRyaWdnZXIgbWlzbWF0Y2hcbiAgY29uc3QgV1JPTkdfUkVDSVBJRU5UID0gJzB4YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSc7XG4gIC8vIEEgZGlmZmVyZW50IHRva2VuIGNvbnRyYWN0IHRvIHRyaWdnZXIgbWlzbWF0Y2hcbiAgY29uc3QgV1JPTkdfVE9LRU4gPSAnMHhiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiJztcblxuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGNvaW46IEVyYzc5ODRUb2tlbjtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIHJlZ2lzdGVyKGJpdGdvKTtcbiAgICBjb2luID0gYml0Z28uY29pbignaHRldGg6Y3Rlc3QxJykgYXMgRXJjNzk4NFRva2VuO1xuICB9KTtcblxuICAvLyBSZXByZXNlbnRhdGl2ZSBwbGFpbnRleHQgYW1vdW50IGluIGJhc2UgdW5pdHMgKGUuZy4sIDEgY1RFU1QxID0gMV8wMDBfMDAwIHVuaXRzIGF0IDYgZGVjaW1hbHMpXG4gIGNvbnN0IEFNT1VOVCA9ICcxMDAwMDAwJztcblxuICBpdCgnc2hvdWxkIHZlcmlmeSBhIHZhbGlkIGNvbmZpZGVudGlhbCB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIG1hdGNoaW5nIGFtb3VudHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZENvbmZpZGVudGlhbFRyYW5zZmVyVHhIZXgoe1xuICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiBXQUxMRVRfQ09OVFJBQ1QsXG4gICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogQ1RFU1QxX1RPS0VOX0FERFJFU1MsXG4gICAgICByZWNpcGllbnRBZGRyZXNzOiBSRUNJUElFTlQsXG4gICAgICBlbmNyeXB0ZWRIYW5kbGU6IEhBTkRMRSxcbiAgICAgIGlucHV0UHJvb2Y6IFBST09GLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0sXG4gICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4LCBidWlsZFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0gfSBhcyBhbnksXG4gICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICB9KTtcbiAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IHdoZW4gbm8gcmVjaXBpZW50IGluZm8gaXMgcHJvdmlkZWQgaW4gZWl0aGVyIHR4UGFyYW1zIG9yIGJ1aWxkUGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGRDb25maWRlbnRpYWxUcmFuc2ZlclR4SGV4KHtcbiAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogV0FMTEVUX0NPTlRSQUNULFxuICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IENURVNUMV9UT0tFTl9BRERSRVNTLFxuICAgICAgcmVjaXBpZW50QWRkcmVzczogUkVDSVBJRU5ULFxuICAgICAgZW5jcnlwdGVkSGFuZGxlOiBIQU5ETEUsXG4gICAgICBpbnB1dFByb29mOiBQUk9PRixcbiAgICB9KTtcblxuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7fSxcbiAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL21pc3NpbmcgZXhwZWN0ZWQgcmVjaXBpZW50Lyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmVyaWZ5IHN1Y2Nlc3NmdWxseSB1c2luZyBidWlsZFBhcmFtcy5yZWNpcGllbnRzIHdoZW4gdHhQYXJhbXMgaGFzIG5vIHJlY2lwaWVudHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZENvbmZpZGVudGlhbFRyYW5zZmVyVHhIZXgoe1xuICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiBXQUxMRVRfQ09OVFJBQ1QsXG4gICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogQ1RFU1QxX1RPS0VOX0FERFJFU1MsXG4gICAgICByZWNpcGllbnRBZGRyZXNzOiBSRUNJUElFTlQsXG4gICAgICBlbmNyeXB0ZWRIYW5kbGU6IEhBTkRMRSxcbiAgICAgIGlucHV0UHJvb2Y6IFBST09GLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICB0eFBhcmFtczoge30sXG4gICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgIHR4SGV4LFxuICAgICAgICBidWlsZFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0sXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgIH0pO1xuICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB0b2tlbiBjb250cmFjdCBhZGRyZXNzIGRvZXMgbm90IG1hdGNoIHRoaXMgY29pbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkQ29uZmlkZW50aWFsVHJhbnNmZXJUeEhleCh7XG4gICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IFdBTExFVF9DT05UUkFDVCxcbiAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBXUk9OR19UT0tFTixcbiAgICAgIHJlY2lwaWVudEFkZHJlc3M6IFJFQ0lQSUVOVCxcbiAgICAgIGVuY3J5cHRlZEhhbmRsZTogSEFORExFLFxuICAgICAgaW5wdXRQcm9vZjogUFJPT0YsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBjb2luXG4gICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC90b2tlbiBjb250cmFjdCBhZGRyZXNzIG1pc21hdGNoLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiByZWNpcGllbnQgYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB0eFBhcmFtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkQ29uZmlkZW50aWFsVHJhbnNmZXJUeEhleCh7XG4gICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IFdBTExFVF9DT05UUkFDVCxcbiAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBDVEVTVDFfVE9LRU5fQUREUkVTUyxcbiAgICAgIHJlY2lwaWVudEFkZHJlc3M6IFJFQ0lQSUVOVCxcbiAgICAgIGVuY3J5cHRlZEhhbmRsZTogSEFORExFLFxuICAgICAgaW5wdXRQcm9vZjogUFJPT0YsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBjb2luXG4gICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBXUk9OR19SRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9yZWNpcGllbnQgYWRkcmVzcyBtaXNtYXRjaC8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IHdoZW4gY2FsbGRhdGEgaXMgbm90IGEgY29uZmlkZW50aWFsIHRyYW5zZmVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ2h0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgIHR4QnVpbGRlci5mZWUoeyBmZWU6ICcxMDAwMDAwMDAwJywgZ2FzTGltaXQ6ICcyMDAwMDAnIH0pO1xuICAgIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5Db250cmFjdENhbGwpO1xuICAgIHR4QnVpbGRlci5jb250cmFjdChXQUxMRVRfQ09OVFJBQ1QpO1xuICAgIHR4QnVpbGRlci5kYXRhKCcweGRlYWRiZWVmMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnKTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SGV4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL2ZhaWxlZCB0byBkZWNvZGUgY29uZmlkZW50aWFsIHRyYW5zZmVyIGNhbGxkYXRhLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB0eFBhcmFtcyBhbW91bnQgZG9lcyBub3QgbWF0Y2ggYnVpbGRQYXJhbXMgYW1vdW50ICh3aXRoIHR4SGV4KScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkQ29uZmlkZW50aWFsVHJhbnNmZXJUeEhleCh7XG4gICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IFdBTExFVF9DT05UUkFDVCxcbiAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBDVEVTVDFfVE9LRU5fQUREUkVTUyxcbiAgICAgIHJlY2lwaWVudEFkZHJlc3M6IFJFQ0lQSUVOVCxcbiAgICAgIGVuY3J5cHRlZEhhbmRsZTogSEFORExFLFxuICAgICAgaW5wdXRQcm9vZjogUFJPT0YsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBjb2luXG4gICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogJzk5OTk5OTknIH1dIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eEhleCxcbiAgICAgICAgICBidWlsZFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0sXG4gICAgICAgIH0gYXMgYW55LFxuICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvYW1vdW50IG1pc21hdGNoLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB0eFBhcmFtcyBhbW91bnQgaXMgMCAod2l0aCB0eEhleCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZENvbmZpZGVudGlhbFRyYW5zZmVyVHhIZXgoe1xuICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiBXQUxMRVRfQ09OVFJBQ1QsXG4gICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogQ1RFU1QxX1RPS0VOX0FERFJFU1MsXG4gICAgICByZWNpcGllbnRBZGRyZXNzOiBSRUNJUElFTlQsXG4gICAgICBlbmNyeXB0ZWRIYW5kbGU6IEhBTkRMRSxcbiAgICAgIGlucHV0UHJvb2Y6IFBST09GLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgY29pblxuICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogUkVDSVBJRU5ULCBhbW91bnQ6ICcwJyB9XSB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4IH0gYXMgYW55LFxuICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvYW1vdW50IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHN0cmluZy8pO1xuICB9KTtcblxuICAvLyDilIDilIAgRmlyc3Qtc2lnbmVyIChubyB0eEhleCkgdGVzdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgaXQoJ3Nob3VsZCB2ZXJpZnkgdmFsaWQgZmlyc3Qtc2lnbmVyIHBhcmFtcyB3aGVuIG5vIHR4SGV4IGlzIHByZXNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0sXG4gICAgICB0eFByZWJ1aWxkOiB7fSBhcyBhbnksXG4gICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICB9KTtcbiAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZlcmlmeSBmaXJzdC1zaWduZXIgcGFyYW1zIHdoZW4gdHhQYXJhbXMgYW5kIGJ1aWxkUGFyYW1zIGFtb3VudHMgbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0sXG4gICAgICB0eFByZWJ1aWxkOiB7IGJ1aWxkUGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSB9IGFzIGFueSxcbiAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgIH0pO1xuICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiByZWNpcGllbnRzIGlzIGVtcHR5IGFuZCBubyB0eEhleCBpcyBwcmVzZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFtdIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHt9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3JlY2lwaWVudHMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbnRyeS8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IHdoZW4gcmVjaXBpZW50IGFkZHJlc3MgaXMgaW52YWxpZCBhbmQgbm8gdHhIZXggaXMgcHJlc2VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBjb2luXG4gICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiAnbm90LWFuLWFkZHJlc3MnLCBhbW91bnQ6IEFNT1VOVCB9XSB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7fSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9yZWNpcGllbnQgYWRkcmVzcyBpcyBtaXNzaW5nIG9yIGludmFsaWQvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGFtb3VudCBpcyAwIGFuZCBubyB0eEhleCBpcyBwcmVzZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiAnMCcgfV0gfSxcbiAgICAgICAgdHhQcmVidWlsZDoge30gYXMgYW55LFxuICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvYW1vdW50IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHN0cmluZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IHdoZW4gYW1vdW50IGlzIGVtcHR5IGFuZCBubyB0eEhleCBpcyBwcmVzZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiAnJyB9XSB9LFxuICAgICAgICB0eFByZWJ1aWxkOiB7fSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9hbW91bnQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc3RyaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB0eFBhcmFtcyBhbmQgYnVpbGRQYXJhbXMgYW1vdW50cyBtaXNtYXRjaCBhbmQgbm8gdHhIZXggaXMgcHJlc2VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBjb2luXG4gICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogJzk5OTk5OTknIH1dIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgYnVpbGRQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogUkVDSVBJRU5ULCBhbW91bnQ6IEFNT1VOVCB9XSB9IH0gYXMgYW55LFxuICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvYW1vdW50IG1pc21hdGNoLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB0eFBhcmFtcyBhbmQgYnVpbGRQYXJhbXMgcmVjaXBpZW50IGFkZHJlc3NlcyBtaXNtYXRjaCBhbmQgbm8gdHhIZXggaXMgcHJlc2VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBjb2luXG4gICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICBidWlsZFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBXUk9OR19SRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0sXG4gICAgICAgIH0gYXMgYW55LFxuICAgICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvcmVjaXBpZW50IGFkZHJlc3MgbWlzbWF0Y2gvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2ZXJpZnkgd2hlbiB0eEhleCBhYnNlbnQgYW5kIGJ1aWxkUGFyYW1zIGhhcyBtYXRjaGluZyByZWNpcGllbnQgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgYnVpbGRQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogUkVDSVBJRU5ULCBhbW91bnQ6IEFNT1VOVCB9XSB9LFxuICAgICAgfSBhcyBhbnksXG4gICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICB9KTtcbiAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZlcmlmeSBkZWNvZGVkIHJlY2lwaWVudCBhZ2FpbnN0IGJ1aWxkUGFyYW1zIHdoZW4gdHhQYXJhbXMucmVjaXBpZW50cyBpcyBhYnNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZENvbmZpZGVudGlhbFRyYW5zZmVyVHhIZXgoe1xuICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiBXQUxMRVRfQ09OVFJBQ1QsXG4gICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogQ1RFU1QxX1RPS0VOX0FERFJFU1MsXG4gICAgICByZWNpcGllbnRBZGRyZXNzOiBSRUNJUElFTlQsXG4gICAgICBlbmNyeXB0ZWRIYW5kbGU6IEhBTkRMRSxcbiAgICAgIGlucHV0UHJvb2Y6IFBST09GLFxuICAgIH0pO1xuXG4gICAgLy8gTm8gcmVjaXBpZW50cyBpbiB0eFBhcmFtcyDigJQgZmFsbHMgYmFjayB0byBidWlsZFBhcmFtcyBmb3IgcmVjaXBpZW50IHZlcmlmaWNhdGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgdHhQYXJhbXM6IHt9LFxuICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICB0eEhleCxcbiAgICAgICAgYnVpbGRQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogUkVDSVBJRU5ULCBhbW91bnQ6IEFNT1VOVCB9XSB9LFxuICAgICAgfSBhcyBhbnksXG4gICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICB9KTtcbiAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IHdoZW4gZGVjb2RlZCByZWNpcGllbnQgZG9lcyBub3QgbWF0Y2ggYnVpbGRQYXJhbXMgcmVjaXBpZW50ICh0eFBhcmFtcyBhYnNlbnQpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGRDb25maWRlbnRpYWxUcmFuc2ZlclR4SGV4KHtcbiAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogV0FMTEVUX0NPTlRSQUNULFxuICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IENURVNUMV9UT0tFTl9BRERSRVNTLFxuICAgICAgcmVjaXBpZW50QWRkcmVzczogUkVDSVBJRU5ULFxuICAgICAgZW5jcnlwdGVkSGFuZGxlOiBIQU5ETEUsXG4gICAgICBpbnB1dFByb29mOiBQUk9PRixcbiAgICB9KTtcblxuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7fSxcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHR4SGV4LFxuICAgICAgICAgIGJ1aWxkUGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFdST05HX1JFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9yZWNpcGllbnQgYWRkcmVzcyBtaXNtYXRjaC8pO1xuICB9KTtcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIHZlcmlmeVRyYW5zYWN0aW9uIOKAkyBkaXJlY3QgY29uZmlkZW50aWFsVHJhbnNmZXIgKGhvdC9UU1MgRU9BIHdhbGxldCkgdGVzdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEJ1aWxkcyBhIHJhdyB0eCBoZXggd2hlcmUgdGhlIEVPQSBjYWxscyBjb25maWRlbnRpYWxUcmFuc2ZlciBkaXJlY3RseSBvbiB0aGUgdG9rZW5cbiAqIGNvbnRyYWN0IChubyBzZW5kTXVsdGlTaWcgd3JhcHBlcikuIFRoaXMgaXMgdGhlIGhvdC9UU1Mgd2FsbGV0IHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkRGlyZWN0Q29uZmlkZW50aWFsVHJhbnNmZXJUeEhleChvcHRzOiB7XG4gIHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIHJlY2lwaWVudEFkZHJlc3M6IHN0cmluZztcbiAgZW5jcnlwdGVkSGFuZGxlOiBzdHJpbmc7XG4gIGlucHV0UHJvb2Y6IHN0cmluZztcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCdodGV0aCcpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgdHhCdWlsZGVyLmZlZSh7IGZlZTogJzEwMDAwMDAwMDAnLCBnYXNMaW1pdDogJzIwMDAwMCcgfSk7XG4gIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsKTtcbiAgLy8gdHgudG8gPSB0b2tlbiBjb250cmFjdCAoRU9BIGNhbGxzIGl0IGRpcmVjdGx5KVxuICB0eEJ1aWxkZXIuY29udHJhY3Qob3B0cy50b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gIC8vIElubmVyIGNhbGxkYXRhOiBjb25maWRlbnRpYWxUcmFuc2ZlcihhZGRyZXNzLCBieXRlczMyLCBieXRlcykg4oCUIG5vIHNlbmRNdWx0aVNpZyB3cmFwcGVyXG4gIGNvbnN0IGNhbGxkYXRhID0gbmV3IFRyYW5zZmVyQnVpbGRlckVSQzc5ODQoKVxuICAgIC50byhvcHRzLnJlY2lwaWVudEFkZHJlc3MpXG4gICAgLnRva2VuQ29udHJhY3RBZGRyZXNzKG9wdHMudG9rZW5Db250cmFjdEFkZHJlc3MpXG4gICAgLmVuY3J5cHRlZEhhbmRsZShvcHRzLmVuY3J5cHRlZEhhbmRsZSlcbiAgICAuaW5wdXRQcm9vZihvcHRzLmlucHV0UHJvb2YpXG4gICAgLmJ1aWxkKCk7XG4gIHR4QnVpbGRlci5kYXRhKGNhbGxkYXRhKTtcbiAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgcmV0dXJuIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG59XG5cbmRlc2NyaWJlKCd2ZXJpZnlUcmFuc2FjdGlvbiDigJMgZGlyZWN0IGNvbmZpZGVudGlhbFRyYW5zZmVyIChob3QvVFNTIEVPQSB3YWxsZXQpJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBSRUNJUElFTlQgPSAnMHgxOTY0NTAzMmM3ZjE1MzMzOTVkNDRhNjI5NDYyZTc1MTA4NGQzZTRjJztcbiAgY29uc3QgSEFORExFID0gJzB4JyArICdhYicucmVwZWF0KDMyKTtcbiAgY29uc3QgUFJPT0YgPSAnMHgnICsgJ2NkJy5yZXBlYXQoNTApO1xuICBjb25zdCBXUk9OR19SRUNJUElFTlQgPSAnMHhhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhJztcbiAgY29uc3QgV1JPTkdfVE9LRU4gPSAnMHhiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiJztcbiAgY29uc3QgQU1PVU5UID0gJzEwMDAwMDAnO1xuXG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBsZXQgY29pbjogRXJjNzk4NFRva2VuO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgcmVnaXN0ZXIoYml0Z28pO1xuICAgIGNvaW4gPSBiaXRnby5jb2luKCdodGV0aDpjdGVzdDEnKSBhcyBFcmM3OTg0VG9rZW47XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmVyaWZ5IGEgdmFsaWQgZGlyZWN0IGNvbmZpZGVudGlhbFRyYW5zZmVyIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGREaXJlY3RDb25maWRlbnRpYWxUcmFuc2ZlclR4SGV4KHtcbiAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBDVEVTVDFfVE9LRU5fQUREUkVTUyxcbiAgICAgIHJlY2lwaWVudEFkZHJlc3M6IFJFQ0lQSUVOVCxcbiAgICAgIGVuY3J5cHRlZEhhbmRsZTogSEFORExFLFxuICAgICAgaW5wdXRQcm9vZjogUFJPT0YsXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0sXG4gICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4LCBidWlsZFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0gfSBhcyBhbnksXG4gICAgICB3YWxsZXQ6IHt9IGFzIGFueSxcbiAgICB9KTtcbiAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZlcmlmeSB1c2luZyBidWlsZFBhcmFtcy5yZWNpcGllbnRzIHdoZW4gdHhQYXJhbXMgaGFzIG5vIHJlY2lwaWVudHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZERpcmVjdENvbmZpZGVudGlhbFRyYW5zZmVyVHhIZXgoe1xuICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IENURVNUMV9UT0tFTl9BRERSRVNTLFxuICAgICAgcmVjaXBpZW50QWRkcmVzczogUkVDSVBJRU5ULFxuICAgICAgZW5jcnlwdGVkSGFuZGxlOiBIQU5ETEUsXG4gICAgICBpbnB1dFByb29mOiBQUk9PRixcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgIHR4UGFyYW1zOiB7fSxcbiAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgdHhIZXgsXG4gICAgICAgIGJ1aWxkUGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgIH0gYXMgYW55LFxuICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgfSk7XG4gICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHRva2VuIGNvbnRyYWN0IGFkZHJlc3MgKHR4LnRvKSBkb2VzIG5vdCBtYXRjaCB0aGlzIGNvaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZERpcmVjdENvbmZpZGVudGlhbFRyYW5zZmVyVHhIZXgoe1xuICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IFdST05HX1RPS0VOLFxuICAgICAgcmVjaXBpZW50QWRkcmVzczogUkVDSVBJRU5ULFxuICAgICAgZW5jcnlwdGVkSGFuZGxlOiBIQU5ETEUsXG4gICAgICBpbnB1dFByb29mOiBQUk9PRixcbiAgICB9KTtcbiAgICBhd2FpdCBjb2luXG4gICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBSRUNJUElFTlQsIGFtb3VudDogQU1PVU5UIH1dIH0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC90b2tlbiBjb250cmFjdCBhZGRyZXNzIG1pc21hdGNoLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiByZWNpcGllbnQgYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB0eFBhcmFtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkRGlyZWN0Q29uZmlkZW50aWFsVHJhbnNmZXJUeEhleCh7XG4gICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogQ1RFU1QxX1RPS0VOX0FERFJFU1MsXG4gICAgICByZWNpcGllbnRBZGRyZXNzOiBSRUNJUElFTlQsXG4gICAgICBlbmNyeXB0ZWRIYW5kbGU6IEhBTkRMRSxcbiAgICAgIGlucHV0UHJvb2Y6IFBST09GLFxuICAgIH0pO1xuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFdST05HX1JFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9IGFzIGFueSxcbiAgICAgICAgd2FsbGV0OiB7fSBhcyBhbnksXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3JlY2lwaWVudCBhZGRyZXNzIG1pc21hdGNoLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBubyByZWNpcGllbnQgaW5mbyBpcyBwcm92aWRlZCBpbiBlaXRoZXIgdHhQYXJhbXMgb3IgYnVpbGRQYXJhbXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZERpcmVjdENvbmZpZGVudGlhbFRyYW5zZmVyVHhIZXgoe1xuICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IENURVNUMV9UT0tFTl9BRERSRVNTLFxuICAgICAgcmVjaXBpZW50QWRkcmVzczogUkVDSVBJRU5ULFxuICAgICAgZW5jcnlwdGVkSGFuZGxlOiBIQU5ETEUsXG4gICAgICBpbnB1dFByb29mOiBQUk9PRixcbiAgICB9KTtcbiAgICBhd2FpdCBjb2luXG4gICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczoge30sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9taXNzaW5nIGV4cGVjdGVkIHJlY2lwaWVudC8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IHdoZW4gdHhQYXJhbXMgYW1vdW50IGRvZXMgbm90IG1hdGNoIGJ1aWxkUGFyYW1zIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkRGlyZWN0Q29uZmlkZW50aWFsVHJhbnNmZXJUeEhleCh7XG4gICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogQ1RFU1QxX1RPS0VOX0FERFJFU1MsXG4gICAgICByZWNpcGllbnRBZGRyZXNzOiBSRUNJUElFTlQsXG4gICAgICBlbmNyeXB0ZWRIYW5kbGU6IEhBTkRMRSxcbiAgICAgIGlucHV0UHJvb2Y6IFBST09GLFxuICAgIH0pO1xuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiAnOTk5OTk5OScgfV0gfSxcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHR4SGV4LFxuICAgICAgICAgIGJ1aWxkUGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IFJFQ0lQSUVOVCwgYW1vdW50OiBBTU9VTlQgfV0gfSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIHdhbGxldDoge30gYXMgYW55LFxuICAgICAgfSlcbiAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9hbW91bnQgbWlzbWF0Y2gvKTtcbiAgfSk7XG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEgdGVzdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5kZXNjcmliZSgnZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc2hvdWxkIGRlY29kZSBhIHNpbmdsZS10b2tlbiBtdWx0aWNhbGwgY2FsbGRhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY2FsbGRhdGEgPSBidWlsZE11bHRpY2FsbERlbGVnYXRpb25DYWxsZGF0YShERUxFR0FURV9BRERSRVNTLCBbQ1RFU1QxX1RPS0VOX0FERFJFU1NdLCBFWFBJUlkpO1xuICAgIGNvbnN0IGFkZHJlc3NlcyA9IGRlY29kZVRva2VuQWRkcmVzc2VzRnJvbURlbGVnYXRpb25DYWxsZGF0YShjYWxsZGF0YSk7XG4gICAgYWRkcmVzc2VzLnNob3VsZC5kZWVwRXF1YWwoW0NURVNUMV9UT0tFTl9BRERSRVNTLnRvTG93ZXJDYXNlKCldKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBkZWNvZGUgYSBtdWx0aS10b2tlbiBtdWx0aWNhbGwgY2FsbGRhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY2FsbGRhdGEgPSBidWlsZE11bHRpY2FsbERlbGVnYXRpb25DYWxsZGF0YShcbiAgICAgIERFTEVHQVRFX0FERFJFU1MsXG4gICAgICBbQ1RFU1QxX1RPS0VOX0FERFJFU1MsIENVU0RUX1RPS0VOX0FERFJFU1NdLFxuICAgICAgRVhQSVJZXG4gICAgKTtcbiAgICBjb25zdCBhZGRyZXNzZXMgPSBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEoY2FsbGRhdGEpO1xuICAgIGFkZHJlc3Nlcy5zaG91bGQuZGVlcEVxdWFsKFtDVEVTVDFfVE9LRU5fQUREUkVTUy50b0xvd2VyQ2FzZSgpLCBDVVNEVF9UT0tFTl9BRERSRVNTLnRvTG93ZXJDYXNlKCldKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gYWRkcmVzc2VzIGluIGxvd2VyY2FzZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtaXhlZENhc2UgPSAnMHg3QjFENTliYkNEMjkxZGFBNTljQjZDOEM1YmMwNERlMUFGQzRhQkExJztcbiAgICBjb25zdCBjYWxsZGF0YSA9IGJ1aWxkTXVsdGljYWxsRGVsZWdhdGlvbkNhbGxkYXRhKERFTEVHQVRFX0FERFJFU1MsIFttaXhlZENhc2VdLCBFWFBJUlkpO1xuICAgIGNvbnN0IGFkZHJlc3NlcyA9IGRlY29kZVRva2VuQWRkcmVzc2VzRnJvbURlbGVnYXRpb25DYWxsZGF0YShjYWxsZGF0YSk7XG4gICAgYWRkcmVzc2VzWzBdLnNob3VsZC5lcXVhbChtaXhlZENhc2UudG9Mb3dlckNhc2UoKSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgaGFuZGxlIGNhbGxGcm9tUGFyZW50LXdyYXBwZWQgbXVsdGljYWxsIGNhbGxkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlubmVyID0gYnVpbGRNdWx0aWNhbGxEZWxlZ2F0aW9uQ2FsbGRhdGEoXG4gICAgICBERUxFR0FURV9BRERSRVNTLFxuICAgICAgW0NURVNUMV9UT0tFTl9BRERSRVNTLCBDVVNEVF9UT0tFTl9BRERSRVNTXSxcbiAgICAgIEVYUElSWVxuICAgICk7XG4gICAgY29uc3Qgd3JhcHBlZCA9IHdyYXBJbkNhbGxGcm9tUGFyZW50KFpBTUFfQUNMX0FERFJFU1MsIGlubmVyKTtcbiAgICBjb25zdCBhZGRyZXNzZXMgPSBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEod3JhcHBlZCk7XG4gICAgYWRkcmVzc2VzLnNob3VsZC5kZWVwRXF1YWwoW0NURVNUMV9UT0tFTl9BRERSRVNTLnRvTG93ZXJDYXNlKCksIENVU0RUX1RPS0VOX0FERFJFU1MudG9Mb3dlckNhc2UoKV0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHdvcmsgd2l0aCBjYWxsZGF0YSBtaXNzaW5nIDB4IHByZWZpeCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjYWxsZGF0YSA9IGJ1aWxkTXVsdGljYWxsRGVsZWdhdGlvbkNhbGxkYXRhKERFTEVHQVRFX0FERFJFU1MsIFtDVEVTVDFfVE9LRU5fQUREUkVTU10sIEVYUElSWSk7XG4gICAgY29uc3Qgbm9QcmVmaXggPSBjYWxsZGF0YS5zbGljZSgyKTsgLy8gc3RyaXAgMHhcbiAgICBjb25zdCBhZGRyZXNzZXMgPSBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEobm9QcmVmaXgpO1xuICAgIGFkZHJlc3Nlcy5zaG91bGQuZGVlcEVxdWFsKFtDVEVTVDFfVE9LRU5fQUREUkVTUy50b0xvd2VyQ2FzZSgpXSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgZm9yIHVucmVjb2duaXNlZCBjYWxsZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICBzaG91bGQudGhyb3dzKFxuICAgICAgKCkgPT4gZGVjb2RlVG9rZW5BZGRyZXNzZXNGcm9tRGVsZWdhdGlvbkNhbGxkYXRhKCcweGRlYWRiZWVmMDAwMDAwMDAnKSxcbiAgICAgIC9Ob3QgYSB2YWxpZCBkZWxlZ2F0aW9uIGNhbGxkYXRhL1xuICAgICk7XG4gIH0pO1xufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gdmVyaWZ5VHJhbnNhY3Rpb24g4oCTIGNvbmZpZGVudGlhbCBjb25zb2xpZGF0aW9uIChGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbilcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBNVUxUSVNJR19XQUxMRVRfQ09OVFJBQ1QgPSAnMHgzYjU4Njg0NTI1NTY0YjM4YTM4MWU0NmE3MzE3MDNlZDAzZjMyMTIyJztcbmNvbnN0IENPTlNPTElEQVRJT05fRk9SV0FSREVSID0gJzB4ZjRiY2IzNjZiYjVlMzRlYmJlZTUxZmFlNWRlOThjYzg3NmMwMTQ2Zic7XG5jb25zdCBDT05TT0xJREFUSU9OX0JBU0VfQUREUkVTUyA9ICcweDNiNTg2ODQ1MjU1NjRiMzhhMzgxZTQ2YTczMTcwM2VkMDNmMzIxMjInO1xuY29uc3QgQ09OU09MSURBVElPTl9IQU5ETEUgPSAnMHg2NWRmMTM2YjYwOWFiMzk1YzFhOTlhZTQ2Zjc5MzljN2Y4YjIwZGZmNGJmZjAwMDAwMDAwODhiYjAwNTAnO1xuY29uc3QgRFVNTVlfTVVMVElTSUdfU0lHTkFUVVJFID0gJzB4JyArICcwMCcucmVwZWF0KDY1KTtcblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRNdWx0aXNpZ0NvbnNvbGlkYXRpb25UeEhleCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmbHVzaENhbGxkYXRhID0gYnVpbGRGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbkNhbGxkYXRhKFxuICAgIENURVNUMV9UT0tFTl9BRERSRVNTLFxuICAgIENPTlNPTElEQVRJT05fQkFTRV9BRERSRVNTLFxuICAgIENPTlNPTElEQVRJT05fSEFORExFXG4gICk7XG4gIGNvbnN0IHNlbmREYXRhID0gc2VuZE11bHRpU2lnRGF0YShcbiAgICBDT05TT0xJREFUSU9OX0ZPUldBUkRFUixcbiAgICAnMCcsXG4gICAgZmx1c2hDYWxsZGF0YSxcbiAgICBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIDM2MDAsXG4gICAgMTQsXG4gICAgRFVNTVlfTVVMVElTSUdfU0lHTkFUVVJFXG4gICk7XG5cbiAgY29uc3QgdHhCdWlsZGVyID0gZ2V0QnVpbGRlcignaHRldGgnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gIHR4QnVpbGRlci5mZWUoeyBmZWU6ICcxMDAwMDAwMDAwJywgZ2FzTGltaXQ6ICcxMjEwMDAwMCcgfSk7XG4gIHR4QnVpbGRlci5jb3VudGVyKDEpO1xuICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsKTtcbiAgdHhCdWlsZGVyLmNvbnRyYWN0KE1VTFRJU0lHX1dBTExFVF9DT05UUkFDVCk7XG4gIHR4QnVpbGRlci5kYXRhKHNlbmREYXRhKTtcbiAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgcmV0dXJuIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkRGlyZWN0Q29uc29saWRhdGlvblR4SGV4KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ2h0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICB0eEJ1aWxkZXIuZmVlKHsgZmVlOiAnMTAwMDAwMDAwMCcsIGdhc0xpbWl0OiAnMjAwMDAwJyB9KTtcbiAgdHhCdWlsZGVyLmNvdW50ZXIoMSk7XG4gIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5GbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbik7XG4gIHR4QnVpbGRlci5jb250cmFjdChDT05TT0xJREFUSU9OX0ZPUldBUkRFUik7XG4gIHR4QnVpbGRlci5mb3J3YXJkZXJBZGRyZXNzKENPTlNPTElEQVRJT05fRk9SV0FSREVSKTtcbiAgdHhCdWlsZGVyLnRva2VuQ29udHJhY3RBZGRyZXNzKENURVNUMV9UT0tFTl9BRERSRVNTKTtcbiAgdHhCdWlsZGVyLnBhcmVudEFkZHJlc3MoQ09OU09MSURBVElPTl9CQVNFX0FERFJFU1MpO1xuICB0eEJ1aWxkZXIuZW5jcnlwdGVkSGFuZGxlKENPTlNPTElEQVRJT05fSEFORExFKTtcbiAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgcmV0dXJuIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG59XG5cbmRlc2NyaWJlKCd2ZXJpZnlUcmFuc2FjdGlvbiDigJMgY29uZmlkZW50aWFsIGNvbnNvbGlkYXRpb24gKEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuKScsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBjb2luOiBFcmM3OTg0VG9rZW47XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICd0ZXN0JyB9KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICByZWdpc3RlcihiaXRnbyk7XG4gICAgY29pbiA9IGJpdGdvLmNvaW4oJ2h0ZXRoOmN0ZXN0MScpIGFzIEVyYzc5ODRUb2tlbjtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSB2YWxpZCBtdWx0aXNpZyBjb25zb2xpZGF0aW9uIHR4IChzZW5kTXVsdGlTaWcg4oaSIGNhbGxGcm9tUGFyZW50IOKGkiBjb25maWRlbnRpYWxUcmFuc2Zlck5vUHJvb2YpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGRNdWx0aXNpZ0NvbnNvbGlkYXRpb25UeEhleCgpO1xuICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGNvaW4sIHtcbiAgICAgIGNvaW5TcGVjaWZpYzogeyBiYXNlQWRkcmVzczogQ09OU09MSURBVElPTl9CQVNFX0FERFJFU1MgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgdHhQYXJhbXM6IHsgdHlwZTogJ2NvbnNvbGlkYXRlJyB9IGFzIGFueSxcbiAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgY29uc29saWRhdGVJZDogJzZhNDRlYmMwMzI2ZTFiZTQ1YzFkNzk3NTQyYzhjNjM0JyxcbiAgICAgICAgdHhIZXgsXG4gICAgICAgIHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IENPTlNPTElEQVRJT05fRk9SV0FSREVSLCBhbW91bnQ6ICcwJyB9XSxcbiAgICAgIH0gYXMgYW55LFxuICAgICAgd2FsbGV0LFxuICAgIH0pO1xuICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmVyaWZ5IGEgdmFsaWQgZGlyZWN0IGNhbGxGcm9tUGFyZW50IGNvbnNvbGlkYXRpb24gdHggKFRTUyBzaGFwZSknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZERpcmVjdENvbnNvbGlkYXRpb25UeEhleCgpO1xuICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGNvaW4sIHtcbiAgICAgIGNvaW5TcGVjaWZpYzogeyBiYXNlQWRkcmVzczogQ09OU09MSURBVElPTl9CQVNFX0FERFJFU1MgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgdHhQYXJhbXM6IHsgdHlwZTogJ2NvbnNvbGlkYXRlJyB9IGFzIGFueSxcbiAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgY29uc29saWRhdGVJZDogJzZhNDRlYmMwMzI2ZTFiZTQ1YzFkNzk3NTQyYzhjNjM0JyxcbiAgICAgICAgdHhIZXgsXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHdhbGxldCxcbiAgICAgIHZlcmlmaWNhdGlvbjogeyBjb25zb2xpZGF0aW9uVG9CYXNlQWRkcmVzczogdHJ1ZSB9LFxuICAgIH0pO1xuICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmVqZWN0IG11bHRpc2lnIGNvbnNvbGlkYXRpb24gd2hlbiBwYXJlbnQgYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB3YWxsZXQgYmFzZSBhZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGRNdWx0aXNpZ0NvbnNvbGlkYXRpb25UeEhleCgpO1xuICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGNvaW4sIHtcbiAgICAgIGNvaW5TcGVjaWZpYzogeyBiYXNlQWRkcmVzczogJzB4YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYScgfSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGNvaW5cbiAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IHR5cGU6ICdjb25zb2xpZGF0ZScgfSBhcyBhbnksXG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgY29uc29saWRhdGVJZDogJ2FiYzEyMycsIHR4SGV4IH0gYXMgYW55LFxuICAgICAgICB3YWxsZXQsXG4gICAgICB9KVxuICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3BhcmVudCBhZGRyZXNzIG1pc21hdGNoLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmVyaWZ5IG11bHRpc2lnIGNvbnNvbGlkYXRpb24gdXNpbmcgZm9yd2FyZGVyIGFkZHJlc3MgZnJvbSB0eFByZWJ1aWxkLnR4SW5mby5yZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGRNdWx0aXNpZ0NvbnNvbGlkYXRpb25UeEhleCgpO1xuICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGNvaW4sIHtcbiAgICAgIGNvaW5TcGVjaWZpYzogeyBiYXNlQWRkcmVzczogQ09OU09MSURBVElPTl9CQVNFX0FERFJFU1MgfSxcbiAgICB9KTtcblxuICAgIC8vIE5vIHRvcC1sZXZlbCByZWNpcGllbnRzOyBmb3J3YXJkZXIgY29tZXMgZnJvbSB0eEluZm8ucmVjaXBpZW50c1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgdHhQYXJhbXM6IHsgdHlwZTogJ2NvbnNvbGlkYXRlJyB9IGFzIGFueSxcbiAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgY29uc29saWRhdGVJZDogJzZhNDRlYmMwMzI2ZTFiZTQ1YzFkNzk3NTQyYzhjNjM0JyxcbiAgICAgICAgdHhIZXgsXG4gICAgICAgIHR4SW5mbzogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBDT05TT0xJREFUSU9OX0ZPUldBUkRFUiwgYW1vdW50OiAnMCcgfV0gfSxcbiAgICAgIH0gYXMgYW55LFxuICAgICAgd2FsbGV0LFxuICAgIH0pO1xuICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmVqZWN0IG11bHRpc2lnIGNvbnNvbGlkYXRpb24gd2hlbiB0eEluZm8ucmVjaXBpZW50cyBmb3J3YXJkZXIgYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB0eCBmb3J3YXJkZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZE11bHRpc2lnQ29uc29saWRhdGlvblR4SGV4KCk7XG4gICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgY29pbiwge1xuICAgICAgY29pblNwZWNpZmljOiB7IGJhc2VBZGRyZXNzOiBDT05TT0xJREFUSU9OX0JBU0VfQUREUkVTUyB9LFxuICAgIH0pO1xuXG4gICAgYXdhaXQgY29pblxuICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHsgdHlwZTogJ2NvbnNvbGlkYXRlJyB9IGFzIGFueSxcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIGNvbnNvbGlkYXRlSWQ6ICdhYmMxMjMnLFxuICAgICAgICAgIHR4SGV4LFxuICAgICAgICAgIHR4SW5mbzogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiAnMHhhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhJywgYW1vdW50OiAnMCcgfV0gfSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIHdhbGxldCxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvZm9yd2FyZGVyIGFkZHJlc3MgbWlzbWF0Y2gvKTtcbiAgfSk7XG59KTtcbiJdfQ==
|