@bitgo/sdk-coin-sui 5.25.2 → 5.25.4
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/lib/transferBuilder.d.ts +10 -2
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +54 -4
- package/dist/src/sui.js +3 -3
- package/dist/test/unit/transactionBuilder/transferBuilder.js +152 -30
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -290,7 +290,12 @@ describe('Sui Transfer Builder', () => {
|
|
|
290
290
|
});
|
|
291
291
|
describe('fundsInAddressBalance', () => {
|
|
292
292
|
const FUNDS_IN_ADDRESS_BALANCE = '5000000000'; // 5 SUI
|
|
293
|
-
it('should build
|
|
293
|
+
it('should build Path 2b: self-pay, address-balance only — uses withdrawal+redeem_funds, not SplitCoins(GasCoin)', async function () {
|
|
294
|
+
// Regression for production InsufficientCoinBalance failures on consolidation.
|
|
295
|
+
// With payment=[], GasCoin only has gas-budget-worth of balance for PTB operations;
|
|
296
|
+
// SplitCoins(GasCoin, [large_amount]) always fails at command 0.
|
|
297
|
+
// Path 2b must use withdrawal+redeem_funds to materialise the address balance as a
|
|
298
|
+
// coin object and split from that coin instead.
|
|
294
299
|
const gasDataNoPayment = {
|
|
295
300
|
...testData.gasDataWithoutGasPayment,
|
|
296
301
|
payment: [],
|
|
@@ -298,23 +303,131 @@ describe('Sui Transfer Builder', () => {
|
|
|
298
303
|
const txBuilder = factory.getTransferBuilder();
|
|
299
304
|
txBuilder.type(iface_1.SuiTransactionType.Transfer);
|
|
300
305
|
txBuilder.sender(testData.sender.address);
|
|
301
|
-
txBuilder.send(testData.recipients);
|
|
306
|
+
txBuilder.send(testData.recipients); // 2 recipients
|
|
302
307
|
txBuilder.gasData(gasDataNoPayment);
|
|
303
308
|
txBuilder.fundsInAddressBalance(FUNDS_IN_ADDRESS_BALANCE);
|
|
304
309
|
const tx = await txBuilder.build();
|
|
305
310
|
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
306
311
|
const suiTx = tx;
|
|
307
312
|
suiTx.suiTransaction.gasData.payment.length.should.equal(0);
|
|
308
|
-
//
|
|
309
|
-
|
|
310
|
-
|
|
313
|
+
// Path 2b PTB command sequence (2 recipients):
|
|
314
|
+
// 0: MoveCall(redeem_funds) — materialise addrCoin from address balance
|
|
315
|
+
// 1: SplitCoins(addrCoin, [amount0]) — split for recipient 0
|
|
316
|
+
// 2: TransferObjects — send to recipient 0
|
|
317
|
+
// 3: SplitCoins(addrCoin, [amount1]) — split for recipient 1
|
|
318
|
+
// 4: TransferObjects — send to recipient 1
|
|
319
|
+
// 5: MergeCoins(GasCoin, [addrCoin]) — destroy 0-balance addrCoin; gas from accumulator
|
|
320
|
+
const cmds = suiTx.suiTransaction.tx.transactions;
|
|
321
|
+
cmds[0].kind.should.equal('MoveCall', 'command 0 must be MoveCall(redeem_funds)');
|
|
322
|
+
cmds[0].target.should.equal('0x2::coin::redeem_funds');
|
|
323
|
+
cmds[1].kind.should.equal('SplitCoins', 'command 1 must be SplitCoins(addrCoin)');
|
|
324
|
+
cmds[2].kind.should.equal('TransferObjects', 'command 2 must be TransferObjects');
|
|
325
|
+
cmds[3].kind.should.equal('SplitCoins', 'command 3 must be SplitCoins(addrCoin)');
|
|
326
|
+
cmds[4].kind.should.equal('TransferObjects', 'command 4 must be TransferObjects');
|
|
327
|
+
cmds[5].kind.should.equal('MergeCoins', 'command 5 must be MergeCoins(GasCoin, [addrCoin])');
|
|
328
|
+
cmds.length.should.equal(6);
|
|
329
|
+
suiTx.suiTransaction.fundsInAddressBalance.should.equal(FUNDS_IN_ADDRESS_BALANCE);
|
|
330
|
+
// Transaction parser must correctly identify recipients despite the MoveCall preamble
|
|
331
|
+
const parsedRecipients = utils_1.default.getRecipients(suiTx.suiTransaction);
|
|
332
|
+
parsedRecipients.length.should.equal(testData.recipients.length);
|
|
333
|
+
parsedRecipients[0].address.should.equal(testData.recipients[0].address);
|
|
334
|
+
parsedRecipients[0].amount.should.equal(testData.recipients[0].amount);
|
|
335
|
+
const rawTx = tx.toBroadcastFormat();
|
|
336
|
+
should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
|
|
337
|
+
// Round-trip: rebuilt transaction must be bit-for-bit identical
|
|
338
|
+
const rebuilder = factory.from(rawTx);
|
|
339
|
+
rebuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
|
|
340
|
+
const rebuiltTx = await rebuilder.build();
|
|
341
|
+
rebuiltTx.toBroadcastFormat().should.equal(rawTx);
|
|
342
|
+
});
|
|
343
|
+
it('should build Path 2b with a single recipient', async function () {
|
|
344
|
+
const SEND_AMOUNT = '1275170993710'; // realistic consolidation amount (~1275 SUI)
|
|
345
|
+
const ADDR_BAL = '1275177540910'; // fundsInAddressBalance > SEND_AMOUNT + gas budget
|
|
346
|
+
const gasDataNoPayment = {
|
|
347
|
+
...testData.gasDataWithoutGasPayment,
|
|
348
|
+
payment: [],
|
|
349
|
+
};
|
|
350
|
+
const txBuilder = factory.getTransferBuilder();
|
|
351
|
+
txBuilder.type(iface_1.SuiTransactionType.Transfer);
|
|
352
|
+
txBuilder.sender(testData.sender.address);
|
|
353
|
+
txBuilder.send([{ address: testData.recipients[0].address, amount: SEND_AMOUNT }]);
|
|
354
|
+
txBuilder.gasData(gasDataNoPayment);
|
|
355
|
+
txBuilder.fundsInAddressBalance(ADDR_BAL);
|
|
356
|
+
const tx = await txBuilder.build();
|
|
357
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
358
|
+
const suiTx = tx;
|
|
359
|
+
const cmds = suiTx.suiTransaction.tx.transactions;
|
|
360
|
+
// Command sequence for 1 recipient:
|
|
361
|
+
// 0: MoveCall(redeem_funds)
|
|
362
|
+
// 1: SplitCoins(addrCoin, [SEND_AMOUNT])
|
|
363
|
+
// 2: TransferObjects
|
|
364
|
+
// 3: MergeCoins(GasCoin, [addrCoin])
|
|
365
|
+
cmds[0].kind.should.equal('MoveCall');
|
|
366
|
+
cmds[0].target.should.equal('0x2::coin::redeem_funds');
|
|
367
|
+
cmds[1].kind.should.equal('SplitCoins');
|
|
368
|
+
cmds[2].kind.should.equal('TransferObjects');
|
|
369
|
+
cmds[3].kind.should.equal('MergeCoins', 'expected MergeCoins to consume 0-balance addrCoin');
|
|
370
|
+
cmds.length.should.equal(4);
|
|
371
|
+
const parsedRecipients = utils_1.default.getRecipients(suiTx.suiTransaction);
|
|
372
|
+
parsedRecipients.length.should.equal(1);
|
|
373
|
+
parsedRecipients[0].address.should.equal(testData.recipients[0].address);
|
|
374
|
+
parsedRecipients[0].amount.should.equal(SEND_AMOUNT);
|
|
375
|
+
const rawTx = tx.toBroadcastFormat();
|
|
376
|
+
should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
|
|
377
|
+
const rebuilder = factory.from(rawTx);
|
|
378
|
+
rebuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
|
|
379
|
+
const rebuiltTx = await rebuilder.build();
|
|
380
|
+
rebuiltTx.toBroadcastFormat().should.equal(rawTx);
|
|
381
|
+
});
|
|
382
|
+
it('should build Path 2b with ValidDuring expiration (production consolidation scenario)', async function () {
|
|
383
|
+
// Mirrors the real on-chain consolidation that failed: address index 10, wallet
|
|
384
|
+
// 67fe3f15..., txid JDbnybotg3axfjtB53LrnV1YtvGLFBVG8o2Xz5xX1m6Z.
|
|
385
|
+
// The recover() code sets ValidDuring when coinObjectsBalance=0 and
|
|
386
|
+
// fundsInAddressBalance>0 (Case 2). This test verifies both the expiration survives
|
|
387
|
+
// serialization and the PTB uses Path 2b (not the broken SplitCoins(GasCoin) path).
|
|
388
|
+
const GENESIS_CHAIN_ID = 'GAFpCCcRCxTdFfUEMbQbkLBaZy2RNiGAfvFBhMNpq2kT';
|
|
389
|
+
const SEND_AMOUNT = '1275170993710';
|
|
390
|
+
const ADDR_BAL = '1275177540910';
|
|
391
|
+
const gasDataNoPayment = {
|
|
392
|
+
...testData.gasDataWithoutGasPayment,
|
|
393
|
+
payment: [],
|
|
394
|
+
};
|
|
395
|
+
const txBuilder = factory.getTransferBuilder();
|
|
396
|
+
txBuilder.type(iface_1.SuiTransactionType.Transfer);
|
|
397
|
+
txBuilder.sender(testData.sender.address);
|
|
398
|
+
txBuilder.send([{ address: testData.recipients[0].address, amount: SEND_AMOUNT }]);
|
|
399
|
+
txBuilder.gasData(gasDataNoPayment);
|
|
400
|
+
txBuilder.fundsInAddressBalance(ADDR_BAL);
|
|
401
|
+
txBuilder.expiration({
|
|
402
|
+
ValidDuring: {
|
|
403
|
+
minEpoch: { Some: 1156 },
|
|
404
|
+
maxEpoch: { Some: 1157 },
|
|
405
|
+
minTimestamp: { None: null },
|
|
406
|
+
maxTimestamp: { None: null },
|
|
407
|
+
chain: GENESIS_CHAIN_ID,
|
|
408
|
+
nonce: 12345678,
|
|
409
|
+
},
|
|
410
|
+
});
|
|
411
|
+
const tx = await txBuilder.build();
|
|
412
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
413
|
+
const suiTx = tx;
|
|
414
|
+
suiTx.suiTransaction.gasData.payment.length.should.equal(0);
|
|
415
|
+
// Must use Path 2b (MoveCall first), never SplitCoins(GasCoin) first
|
|
416
|
+
const cmds = suiTx.suiTransaction.tx.transactions;
|
|
417
|
+
cmds[0].kind.should.equal('MoveCall', 'Path 2b must start with MoveCall(redeem_funds), not SplitCoins(GasCoin)');
|
|
418
|
+
cmds[0].target.should.equal('0x2::coin::redeem_funds');
|
|
419
|
+
cmds[cmds.length - 1].kind.should.equal('MergeCoins', 'Path 2b must end with MergeCoins to destroy 0-balance addrCoin');
|
|
420
|
+
// ValidDuring expiration must survive BCS round-trip
|
|
311
421
|
const rawTx = tx.toBroadcastFormat();
|
|
312
422
|
should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
|
|
313
|
-
// Round-trip: rebuild from raw
|
|
314
423
|
const rebuilder = factory.from(rawTx);
|
|
315
424
|
rebuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
|
|
316
425
|
const rebuiltTx = await rebuilder.build();
|
|
317
426
|
rebuiltTx.toBroadcastFormat().should.equal(rawTx);
|
|
427
|
+
const expiration = rebuiltTx.toJson().expiration?.ValidDuring;
|
|
428
|
+
should_1.default.exist(expiration, 'ValidDuring expiration must survive round-trip');
|
|
429
|
+
Number(expiration.minEpoch.Some).should.equal(1156);
|
|
430
|
+
Number(expiration.maxEpoch.Some).should.equal(1157);
|
|
318
431
|
});
|
|
319
432
|
it('should build a self-pay transfer with coin objects + address balance (Path 2c)', async function () {
|
|
320
433
|
// Regression test for COINS-331: when both gasData.payment (coin objects) and
|
|
@@ -817,10 +930,12 @@ describe('Sui Transfer Builder', () => {
|
|
|
817
930
|
const bw = bwInput.BalanceWithdrawal ?? bwInput.value?.BalanceWithdrawal;
|
|
818
931
|
bw.reservation.MaxAmountU64.toString().should.equal(AMOUNT);
|
|
819
932
|
});
|
|
820
|
-
it('should
|
|
821
|
-
//
|
|
822
|
-
//
|
|
823
|
-
//
|
|
933
|
+
it('should build Path 2b: self-pay, empty payment — uses withdrawal+redeem_funds instead of SplitCoins(GasCoin)', async function () {
|
|
934
|
+
// With gasData.payment=[] the runtime exposes only the gas-budget amount via GasCoin for
|
|
935
|
+
// PTB SplitCoins operations. SplitCoins(GasCoin, [large_amount]) always fails with
|
|
936
|
+
// InsufficientCoinBalance (confirmed by production failures JDbnybotg3ax..., ATUbeLX3...).
|
|
937
|
+
// Path 2b fixes this by withdrawing from the address accumulator via redeem_funds,
|
|
938
|
+
// splitting from that coin object, and merging the 0-balance remainder into GasCoin.
|
|
824
939
|
const selfPayNoPayment = { ...testData.gasDataWithoutGasPayment, payment: [] };
|
|
825
940
|
const txBuilder = factory.getTransferBuilder();
|
|
826
941
|
txBuilder.type(iface_1.SuiTransactionType.Transfer);
|
|
@@ -835,32 +950,39 @@ describe('Sui Transfer Builder', () => {
|
|
|
835
950
|
suiTx.suiTransaction.gasData.owner.should.equal(testData.sender.address);
|
|
836
951
|
// Payment must be empty — gas funded from address balance by the runtime
|
|
837
952
|
suiTx.suiTransaction.gasData.payment.length.should.equal(0);
|
|
838
|
-
//
|
|
953
|
+
// Path 2b: BalanceWithdrawal input MUST be present (withdrawal+redeem_funds approach)
|
|
839
954
|
const inputs = suiTx.suiTransaction.tx.inputs;
|
|
840
955
|
const bwInput = inputs.find((inp) => inp?.BalanceWithdrawal !== undefined || inp?.value?.BalanceWithdrawal !== undefined);
|
|
841
|
-
should_1.default.
|
|
842
|
-
|
|
956
|
+
should_1.default.exist(bwInput, 'Path 2b: BalanceWithdrawal input must be present');
|
|
957
|
+
const bw = bwInput.BalanceWithdrawal ?? bwInput.value?.BalanceWithdrawal;
|
|
958
|
+
bw.reservation.MaxAmountU64.toString().should.equal(AMOUNT);
|
|
959
|
+
// First command must be MoveCall(redeem_funds), NOT SplitCoins(GasCoin)
|
|
843
960
|
const commands = suiTx.suiTransaction.tx.transactions;
|
|
844
|
-
commands[0].kind.should.equal('
|
|
961
|
+
commands[0].kind.should.equal('MoveCall');
|
|
962
|
+
commands[0].target.should.equal('0x2::coin::redeem_funds');
|
|
963
|
+
// Followed by: SplitCoins(addrCoin), TransferObjects, MergeCoins(GasCoin, addrCoin)
|
|
964
|
+
commands[1].kind.should.equal('SplitCoins');
|
|
965
|
+
commands[2].kind.should.equal('TransferObjects');
|
|
966
|
+
commands[3].kind.should.equal('MergeCoins');
|
|
845
967
|
const rawTx = tx.toBroadcastFormat();
|
|
846
968
|
should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
|
|
847
969
|
const deserialized = transaction_1.Transaction.deserializeSuiTransaction(rawTx);
|
|
848
970
|
deserialized.sender.should.equal(testData.sender.address);
|
|
849
971
|
deserialized.gasData.owner.should.equal(testData.sender.address);
|
|
850
972
|
deserialized.gasData.payment.length.should.equal(0);
|
|
851
|
-
//
|
|
973
|
+
// BalanceWithdrawal must survive BCS round-trip
|
|
852
974
|
const decodedInputs = deserialized.tx.inputs;
|
|
853
|
-
decodedInputs
|
|
854
|
-
|
|
855
|
-
.should.be.true('decoded inputs must contain no FundsWithdrawal for self-pay path');
|
|
975
|
+
const decodedBwInput = decodedInputs.find((inp) => inp?.BalanceWithdrawal !== undefined || inp?.value?.BalanceWithdrawal !== undefined);
|
|
976
|
+
should_1.default.exist(decodedBwInput, 'BalanceWithdrawal must survive BCS round-trip for Path 2b');
|
|
856
977
|
const rebuilder = factory.from(rawTx);
|
|
857
978
|
rebuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
|
|
858
979
|
const rebuiltTx = await rebuilder.build();
|
|
859
980
|
rebuiltTx.toBroadcastFormat().should.equal(rawTx);
|
|
860
981
|
});
|
|
861
|
-
it('should
|
|
862
|
-
//
|
|
863
|
-
// replay attacks.
|
|
982
|
+
it('should build Path 2b with ValidDuring expiration (self-pay, empty payment)', async function () {
|
|
983
|
+
// Path 2b with ValidDuring expiration — required when gasData.payment=[] to prevent
|
|
984
|
+
// replay attacks. Uses withdrawal+redeem_funds to materialise transfer amount from the
|
|
985
|
+
// address accumulator, NOT SplitCoins(GasCoin) which fails with InsufficientCoinBalance.
|
|
864
986
|
const GENESIS_CHAIN_ID = 'GAFpCCcRCxTdFfUEMbQbkLBaZy2RNiGAfvFBhMNpq2kT';
|
|
865
987
|
const selfPayNoPayment = { ...testData.gasDataWithoutGasPayment, payment: [] };
|
|
866
988
|
const txBuilder = factory.getTransferBuilder();
|
|
@@ -885,13 +1007,14 @@ describe('Sui Transfer Builder', () => {
|
|
|
885
1007
|
// Self-pay: owner === sender, payment empty
|
|
886
1008
|
suiTx.suiTransaction.gasData.owner.should.equal(testData.sender.address);
|
|
887
1009
|
suiTx.suiTransaction.gasData.payment.length.should.equal(0);
|
|
888
|
-
//
|
|
1010
|
+
// Path 2b: BalanceWithdrawal input MUST be present
|
|
889
1011
|
const inputs = suiTx.suiTransaction.tx.inputs;
|
|
890
1012
|
const bwInput = inputs.find((inp) => inp?.BalanceWithdrawal !== undefined || inp?.value?.BalanceWithdrawal !== undefined);
|
|
891
|
-
should_1.default.
|
|
892
|
-
// First command: SplitCoins(GasCoin)
|
|
1013
|
+
should_1.default.exist(bwInput, 'Path 2b: BalanceWithdrawal input must be present');
|
|
1014
|
+
// First command: MoveCall(redeem_funds), NOT SplitCoins(GasCoin)
|
|
893
1015
|
const commands = suiTx.suiTransaction.tx.transactions;
|
|
894
|
-
commands[0].kind.should.equal('
|
|
1016
|
+
commands[0].kind.should.equal('MoveCall');
|
|
1017
|
+
commands[0].target.should.equal('0x2::coin::redeem_funds');
|
|
895
1018
|
const rawTx = tx.toBroadcastFormat();
|
|
896
1019
|
should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
|
|
897
1020
|
const deserialized = transaction_1.Transaction.deserializeSuiTransaction(rawTx);
|
|
@@ -903,11 +1026,10 @@ describe('Sui Transfer Builder', () => {
|
|
|
903
1026
|
Number(expiration.maxEpoch?.Some ?? expiration.maxEpoch).should.equal(501);
|
|
904
1027
|
expiration.chain.should.equal(GENESIS_CHAIN_ID);
|
|
905
1028
|
Number(expiration.nonce).should.equal(0xdeadbeef);
|
|
906
|
-
//
|
|
1029
|
+
// BalanceWithdrawal must survive BCS round-trip
|
|
907
1030
|
const decodedInputs = deserialized.tx.inputs;
|
|
908
|
-
decodedInputs
|
|
909
|
-
|
|
910
|
-
.should.be.true('decoded inputs must contain no FundsWithdrawal for self-pay path');
|
|
1031
|
+
const decodedBwInput = decodedInputs.find((inp) => inp?.BalanceWithdrawal !== undefined || inp?.value?.BalanceWithdrawal !== undefined);
|
|
1032
|
+
should_1.default.exist(decodedBwInput, 'BalanceWithdrawal must survive BCS round-trip for Path 2b');
|
|
911
1033
|
const rebuilder = factory.from(rawTx);
|
|
912
1034
|
rebuilder.addSignature({ pub: testData.sender.publicKey }, Buffer.from(testData.sender.signatureHex));
|
|
913
1035
|
const rebuiltTx = await rebuilder.build();
|
|
@@ -930,4 +1052,4 @@ describe('Sui Transfer Builder', () => {
|
|
|
930
1052
|
});
|
|
931
1053
|
});
|
|
932
1054
|
});
|
|
933
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNERBQXlEO0FBQ3pELDhEQUFnRDtBQUNoRCxvREFBNEI7QUFDNUIsOENBQWtEO0FBQ2xELG1FQUEyQztBQUMzQyw4REFBNkU7QUFDN0Usa0RBQTZGO0FBQzdGLDBEQUErRTtBQUUvRSxRQUFRLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsRUFBRSxDQUFDLDRCQUE0QixFQUFFLEtBQUs7WUFDcEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDL0MsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1QyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLEVBQXNELENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFRLENB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TSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQzNELFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUUzRCxvRkFBb0Y7WUFDcEYsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVoQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc3VpJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiBhcyBTdWlUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgU3VpVHJhbnNhY3Rpb25UeXBlLCBUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5pbXBvcnQgeyBNQVhfQ09NTUFORF9BUkdTLCBNQVhfR0FTX09CSkVDVFMgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5cbmRlc2NyaWJlKCdTdWkgVHJhbnNmZXIgQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0c3VpJyk7XG5cbiAgZGVzY3JpYmUoJ1N1Y2NlZWQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICh0eCBhcyBTdWlUcmFuc2FjdGlvbjxUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPikuc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5wYXltZW50IS5zaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICB0ZXN0RGF0YS5jb2luc0dhc1BheW1lbnRcbiAgICAgICk7XG5cbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6ICh0ZXN0RGF0YS5BTU9VTlQgKiAyKS50b1N0cmluZygpLFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMV0uYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLnJlY2lwaWVudHNbMV0uYW1vdW50LFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuVFJBTlNGRVIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHNwb25zb3JlZCB0cmFuc2ZlciB0eCB3aXRoIGlucHV0T2JqZWN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0T2JqZWN0cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG9iamVjdElkOiAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1Njc4OTBhYmNkZWYxMjM0NTY3OCcsXG4gICAgICAgICAgdmVyc2lvbjogMTAwLFxuICAgICAgICAgIGRpZ2VzdDogJzJCOFhLUUo3bWZ4UVBVV3FKSkFHanpCQXppdmtXS3EyY0VhM1c4TEx6MXlCJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9iamVjdElkOiAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYWJjZGVmMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1Njc4OTBhYmNkZWYxMicsXG4gICAgICAgICAgdmVyc2lvbjogMjAwLFxuICAgICAgICAgIGRpZ2VzdDogJ0RvSndYdXo5b1U1WTV2NXZCUmlUZ2lzVlRRdVpRTG1IWldlcUp6ekQ1UVVFJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIC8vIENyZWF0ZSBnYXMgZGF0YSB3aXRoIGRpZmZlcmVudCBvd25lciAoc3BvbnNvcilcbiAgICAgIGNvbnN0IHNwb25zb3JlZEdhc0RhdGEgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGEsXG4gICAgICAgIG93bmVyOiB0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzLCAvLyBEaWZmZXJlbnQgZnJvbSBzZW5kZXJcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7IC8vIFNlbmRlclxuICAgICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShzcG9uc29yZWRHYXNEYXRhKTsgLy8gR2FzIHBhaWQgYnkgc3BvbnNvclxuICAgICAgdHhCdWlsZGVyLmlucHV0T2JqZWN0cyhpbnB1dE9iamVjdHMpOyAvLyBSZXF1aXJlZCBmb3Igc3BvbnNvcmVkIHR4XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuXG4gICAgICBjb25zdCBzdWlUeCA9IHR4IGFzIFN1aVRyYW5zYWN0aW9uPFRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+O1xuXG4gICAgICAvLyBWZXJpZnkgdHJhbnNhY3Rpb24gc3RydWN0dXJlIGZvciBzcG9uc29yZWQgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IHByb2dyYW1tYWJsZVR4ID0gc3VpVHguc3VpVHJhbnNhY3Rpb24udHg7XG4gICAgICBwcm9ncmFtbWFibGVUeC50cmFuc2FjdGlvbnMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcblxuICAgICAgLy8gVmVyaWZ5IHNwb25zb3JlZCB0cmFuc2FjdGlvbiBjaGFyYWN0ZXJpc3RpY3NcbiAgICAgIHN1aVR4LnN1aVRyYW5zYWN0aW9uLnNlbmRlci5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgc3VpVHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5vd25lci5zaG91bGQuZXF1YWwodGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG5cbiAgICAgIC8vIFNob3VsZCBoYXZlIHRyYW5zYWN0aW9ucyBmb3IgbWVyZ2luZy9zcGxpdHRpbmcgYW5kIHRyYW5zZmVycmluZyB3aGVuIHVzaW5nIGlucHV0T2JqZWN0c1xuICAgICAgcHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zLmxlbmd0aC5zaG91bGQuYmUuZ3JlYXRlclRoYW4oMCk7XG5cbiAgICAgIC8vIFZlcmlmeSB3ZSBoYXZlIHRyYW5zZmVyIG9wZXJhdGlvbnMgKHRoZSBleGFjdCBzdHJ1Y3R1cmUgdmFyaWVzIHdpdGggQVBJIHZlcnNpb25zKVxuICAgICAgc2hvdWxkLmV4aXN0KHByb2dyYW1tYWJsZVR4LnRyYW5zYWN0aW9ucyk7XG5cbiAgICAgIC8vIFZlcmlmeSBpbnB1dE9iamVjdHMgYXJlIG5vdCB1c2VkIGluIGdhcyBwYXltZW50ICh0aGV5J3JlIHNlcGFyYXRlKVxuICAgICAgc3VpVHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5wYXltZW50LnNob3VsZC5ub3QuY29udGFpbkRlZXAoaW5wdXRPYmplY3RzKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmV4aXN0KHJhd1R4KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eXBlb2YgcmF3VHgsICdzdHJpbmcnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzcGxpdCBjb2luIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IGFtb3VudCA9IDEwMDAwMDAwMDA7XG4gICAgICBjb25zdCByZWNpcGllbnRzID0gbmV3IEFycmF5KDEwMCkuZmlsbCh7IGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLCBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQocmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgKHR4IGFzIFN1aVRyYW5zYWN0aW9uPFRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+KS5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnBheW1lbnQhLnNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgIHRlc3REYXRhLmNvaW5zR2FzUGF5bWVudFxuICAgICAgKTtcblxuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogKGFtb3VudCAqIDEwMCkudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMTAwKTtcbiAgICAgIHR4Lm91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PlxuICAgICAgICBvdXRwdXQuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsXG4gICAgICAgICAgdmFsdWU6IGFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc3BsaXQgY29pbiB0eCB3aXRoIG1vcmUgdGhhbiAyNTUgaW5wdXQgb2JqZWN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9IDEwMDAwMDAwMDA7XG4gICAgICBjb25zdCBudW1iZXJPZlJlY2lwaWVudHMgPSAxMDtcbiAgICAgIGNvbnN0IG51bWJlck9mUGF5bWVudE9iamVjdHMgPSAxMDAwO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gbmV3IEFycmF5KG51bWJlck9mUmVjaXBpZW50cykuZmlsbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGdhc0RhdGEgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGEsXG4gICAgICAgIHBheW1lbnQ6IHRlc3REYXRhLmdlbmVyYXRlT2JqZWN0cyhudW1iZXJPZlBheW1lbnRPYmplY3RzKSxcbiAgICAgIH07XG5cbiAgICAgIHR4QnVpbGRlci5zZW5kKHJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoZ2FzRGF0YSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBhc3NlcnQodHggaW5zdGFuY2VvZiBTdWlUcmFuc2FjdGlvbik7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiAoYW1vdW50ICogMTApLnRvU3RyaW5nKCksXG4gICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEwKTtcbiAgICAgIHR4Lm91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PlxuICAgICAgICBvdXRwdXQuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgICAgIHZhbHVlOiBhbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0eC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLm93bmVyLnNob3VsZC5lcXVhbChnYXNEYXRhLm93bmVyKTtcbiAgICAgIHR4LnN1aVRyYW5zYWN0aW9uLmdhc0RhdGEucHJpY2Uuc2hvdWxkLmVxdWFsKGdhc0RhdGEucHJpY2UpO1xuICAgICAgdHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5idWRnZXQuc2hvdWxkLmVxdWFsKGdhc0RhdGEuYnVkZ2V0KTtcbiAgICAgIHR4LnN1aVRyYW5zYWN0aW9uLmdhc0RhdGEucGF5bWVudC5sZW5ndGguc2hvdWxkLmVxdWFsKE1BWF9HQVNfT0JKRUNUUyAtIDEpO1xuXG4gICAgICBjb25zdCBwcm9ncmFtbWFibGVUeCA9IHR4LnN1aVRyYW5zYWN0aW9uLnR4O1xuXG4gICAgICAvLyB0b3RhbCBvYmplY3RzIC0gb2JqZWN0cyBzZW50IGFzIGdhcyBwYXltZW50ICsgbm8uIG9mIHJlY2lwaWVudCBhbW91bnRzKHB1cmUpXG4gICAgICAvLyArIG5vLiBvZiB1bmlxdWUgcmVjaXBpZW50IGFkZHJlc3NlcyhkZS1kdXBlZCBvYmplY3RzKVxuICAgICAgcHJvZ3JhbW1hYmxlVHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoXG4gICAgICAgIG51bWJlck9mUGF5bWVudE9iamVjdHMgLSAoTUFYX0dBU19PQkpFQ1RTIC0gMSkgKyBudW1iZXJPZlJlY2lwaWVudHMgKyAxXG4gICAgICApO1xuICAgICAgcHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zWzBdLmtpbmQuc2hvdWxkLmVxdWFsKCdNZXJnZUNvaW5zJyk7XG4gICAgICBwcm9ncmFtbWFibGVUeC50cmFuc2FjdGlvbnNbMF0uc291cmNlcy5sZW5ndGguc2hvdWxkLmVxdWFsKE1BWF9DT01NQU5EX0FSR1MgLSAxKTtcbiAgICAgIHByb2dyYW1tYWJsZVR4LnRyYW5zYWN0aW9uc1sxXS5raW5kLnNob3VsZC5lcXVhbCgnTWVyZ2VDb2lucycpO1xuICAgICAgcHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zWzFdLnNvdXJjZXMubGVuZ3RoLnNob3VsZC5lcXVhbChcbiAgICAgICAgbnVtYmVyT2ZQYXltZW50T2JqZWN0cyAtIChNQVhfQ09NTUFORF9BUkdTIC0gMSkgLSAoTUFYX0dBU19PQkpFQ1RTIC0gMSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICAgIHJlYnVpbHRUeC50b0pzb24oKS5nYXNEYXRhLnBheW1lbnQubGVuZ3RoLnNob3VsZC5lcXVhbChudW1iZXJPZlBheW1lbnRPYmplY3RzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZhaWwnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIHNlbmRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuc2VuZGVyKCdyYW5kb21TdHJpbmcnKSkudGhyb3dFcnJvcignSW52YWxpZCBvciBtaXNzaW5nIHNlbmRlciwgZ290OiByYW5kb21TdHJpbmcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBwYXlUeCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuc2VuZChbdGVzdERhdGEuaW52YWxpZFJlY2lwaWVudHNbMF1dKSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgb3IgbWlzc2luZyBhZGRyZXNzLCBnb3Q6IHJhbmRvbVN0cmluZydcbiAgICAgICk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5zZW5kKFt0ZXN0RGF0YS5pbnZhbGlkUmVjaXBpZW50c1sxXV0pKS50aHJvd0Vycm9yKCdJbnZhbGlkIHJlY2lwaWVudCBhbW91bnQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBnYXNEYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmludmFsaWRHYXNPd25lcikpLnRocm93RXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGdhcyBhZGRyZXNzICR7dGVzdERhdGEuaW52YWxpZEdhc093bmVyLm93bmVyfWBcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGludmFsaWQgZ2FzQnVkZ2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmludmFsaWRHYXNCdWRnZXQpKS50aHJvd0Vycm9yKCdJbnZhbGlkIGdhcyBidWRnZXQgLTEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBnYXNQYXltZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBjb25zdCBpbnZhbGlkR2FzUGF5bWVudCA9IHtcbiAgICAgICAgLi4udGVzdERhdGEuZ2FzRGF0YVdpdGhvdXRHYXNQYXltZW50LFxuICAgICAgICBwYXltZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgb2JqZWN0SWQ6ICcnLFxuICAgICAgICAgICAgdmVyc2lvbjogLTEsXG4gICAgICAgICAgICBkaWdlc3Q6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuZ2FzRGF0YShpbnZhbGlkR2FzUGF5bWVudCkpLnRocm93RXJyb3IoJ0ludmFsaWQgcGF5bWVudCwgaW52YWxpZCBvciBtaXNzaW5nIHZlcnNpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBpbnB1dE9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IGludmFsaWRJbnB1dE9iamVjdHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvYmplY3RJZDogJycsXG4gICAgICAgICAgdmVyc2lvbjogLTEsXG4gICAgICAgICAgZGlnZXN0OiAnJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5pbnB1dE9iamVjdHMoaW52YWxpZElucHV0T2JqZWN0cykpLnRocm93RXJyb3IoXG4gICAgICAgICdJbnZhbGlkIGlucHV0IG9iamVjdCwgaW52YWxpZCBvciBtaXNzaW5nIHZlcnNpb24nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB0cmFuc2ZlciB3aXRoIGRpZmZlcmVudCBnYXMgb3duZXIgYnV0IG5vIGlucHV0T2JqZWN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNwb25zb3JlZEdhc0RhdGEgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGEsXG4gICAgICAgIG93bmVyOiB0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzLCAvLyBEaWZmZXJlbnQgZnJvbSBzZW5kZXJcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7IC8vIFNlbmRlclxuICAgICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShzcG9uc29yZWRHYXNEYXRhKTsgLy8gR2FzIHBhaWQgYnkgc3BvbnNvclxuICAgICAgLy8gTm90ZTogTk9UIHByb3ZpZGluZyBpbnB1dE9iamVjdHMgLSBzaG91bGQgc3RpbGwgd29yayAoZmVlIHNwb25zb3JzaGlwIHdpdGhvdXQgY29pbiBzcG9uc29yc2hpcClcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIGNvbnN0IHN1aVR4ID0gdHggYXMgU3VpVHJhbnNhY3Rpb248VHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG4gICAgICBzaG91bGQubm90LmV4aXN0KHN1aVR4LnN1aVRyYW5zYWN0aW9uLmlucHV0T2JqZWN0cyk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXh0cmFjdCBpbnB1dE9iamVjdHMgZnJvbSB0cmFuc2FjdGlvbiBkYXRhIHZpYSB0b0pzb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnB1dE9iamVjdHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvYmplY3RJZDogJzB4MTIzNDU2Nzg5MGFiY2RlZjEyMzQ1Njc4OTBhYmNkZWYxMjM0NTY3OCcsXG4gICAgICAgICAgdmVyc2lvbjogMTAwLFxuICAgICAgICAgIGRpZ2VzdDogJzJCOFhLUUo3bWZ4UVBVV3FKSkFHanpCQXppdmtXS3EyY0VhM1c4TEx6MXlCJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBzcG9uc29yZWRHYXNEYXRhID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhLFxuICAgICAgICBvd25lcjogdGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcywgLy8gRGlmZmVyZW50IGZyb20gc2VuZGVyXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShzcG9uc29yZWRHYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5pbnB1dE9iamVjdHMoaW5wdXRPYmplY3RzKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gVGVzdCB0aGF0IHRvSnNvbiBleHRyYWN0cyBpbnB1dE9iamVjdHMgZnJvbSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmVcbiAgICAgIGNvbnN0IHR4RGF0YSA9ICh0eCBhcyBhbnkpLnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmV4aXN0KHR4RGF0YS5pbnB1dE9iamVjdHMpO1xuXG4gICAgICAvLyBUaGUgdG9Kc29uIHNob3VsZCBleHRyYWN0IHRoZSBpbnB1dE9iamVjdHMgZnJvbSB0aGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlXG4gICAgICAvLyBUaGlzIHRlc3RzIG91ciBuZXcgZ2V0SW5wdXRPYmplY3RzRnJvbVR4IG1ldGhvZFxuICAgICAgc2hvdWxkLmV4aXN0KHR4RGF0YS5pbnB1dE9iamVjdHMpO1xuICAgICAgQXJyYXkuaXNBcnJheSh0eERhdGEuaW5wdXRPYmplY3RzKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmdW5kc0luQWRkcmVzc0JhbGFuY2UnLCAoKSA9PiB7XG4gICAgY29uc3QgRlVORFNfSU5fQUREUkVTU19CQUxBTkNFID0gJzUwMDAwMDAwMDAnOyAvLyA1IFNVSVxuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHNlbGYtcGF5IHRyYW5zZmVyIHVzaW5nIG9ubHkgYWRkcmVzcyBiYWxhbmNlIChlbXB0eSBwYXltZW50KScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGdhc0RhdGFOb1BheW1lbnQgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGFXaXRob3V0R2FzUGF5bWVudCxcbiAgICAgICAgcGF5bWVudDogW10sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShnYXNEYXRhTm9QYXltZW50KTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoRlVORFNfSU5fQUREUkVTU19CQUxBTkNFKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIGNvbnN0IHN1aVR4ID0gdHggYXMgU3VpVHJhbnNhY3Rpb248VHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG4gICAgICBzdWlUeC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnBheW1lbnQubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgLy8gU2VsZi1wYXkgcGF0aDogU3BsaXRDb2lucyhHYXNDb2luLCBbYW1vdW50XSkg4oCUIG5vIE1vdmVDYWxsIG5lZWRlZFxuICAgICAgY29uc3QgcHJvZ3JhbW1hYmxlVHggPSBzdWlUeC5zdWlUcmFuc2FjdGlvbi50eDtcbiAgICAgIChwcm9ncmFtbWFibGVUeC50cmFuc2FjdGlvbnNbMF0gYXMgYW55KS5raW5kLnNob3VsZC5lcXVhbCgnU3BsaXRDb2lucycpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG5cbiAgICAgIC8vIFJvdW5kLXRyaXA6IHJlYnVpbGQgZnJvbSByYXdcbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzZWxmLXBheSB0cmFuc2ZlciB3aXRoIGNvaW4gb2JqZWN0cyArIGFkZHJlc3MgYmFsYW5jZSAoUGF0aCAyYyknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIENPSU5TLTMzMTogd2hlbiBib3RoIGdhc0RhdGEucGF5bWVudCAoY29pbiBvYmplY3RzKSBhbmRcbiAgICAgIC8vIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZSBhcmUgc2V0LCBTdWkgZG9lcyBOT1QgYXV0b21hdGljYWxseSBtZXJnZSBhZGRyZXNzIGJhbGFuY2UgaW50b1xuICAgICAgLy8gdGhlIGdhcyBjb2luLiAgUGF0aCAyYyBtdXN0IGV4cGxpY2l0bHkgY2FsbCByZWRlZW1fZnVuZHMgKyBNZXJnZUNvaW5zKGdhcywgW2FkZHJDb2luXSlcbiAgICAgIC8vIGJlZm9yZSBTcGxpdENvaW5zIHNvIHRoYXQgdGhlIGdhcyBjb2luIGhvbGRzIHRoZSBmdWxsIHNwZW5kYWJsZSBhbW91bnQuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTsgLy8gbm9uLWVtcHR5IHBheW1lbnQg4oCUIHRyaWdnZXJzIFBhdGggMmNcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoRlVORFNfSU5fQUREUkVTU19CQUxBTkNFKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIGNvbnN0IHN1aVR4ID0gdHggYXMgU3VpVHJhbnNhY3Rpb248VHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG5cbiAgICAgIC8vIFBhdGggMmMgUFRCIGNvbW1hbmQgc2VxdWVuY2UgKGZvciAyIHJlY2lwaWVudHMpOlxuICAgICAgLy8gICAwOiBNb3ZlQ2FsbChyZWRlZW1fZnVuZHMpICAgICDigJQgbWF0ZXJpYWxpemUgYWRkckNvaW4gZnJvbSBhZGRyZXNzIGJhbGFuY2VcbiAgICAgIC8vICAgMTogTWVyZ2VDb2lucyhnYXMsIFthZGRyQ29pbl0p4oCUIGdhcyBjb2luID0gY29pbk9iamVjdHMgKyBhZGRyQmFsIChmdWxsIHNwZW5kYWJsZSBhbW91bnQpXG4gICAgICAvLyAgIDI6IFNwbGl0Q29pbnMoZ2FzKSAgICAgICAgICAgIOKAlCBzcGxpdCBmb3IgcmVjaXBpZW50IDBcbiAgICAgIC8vICAgMzogVHJhbnNmZXJPYmplY3RzICAgICAgICAgICAg4oCUIHNlbmQgdG8gcmVjaXBpZW50IDBcbiAgICAgIC8vICAgNDogU3BsaXRDb2lucyhnYXMpICAgICAgICAgICAg4oCUIHNwbGl0IGZvciByZWNpcGllbnQgMVxuICAgICAgLy8gICA1OiBUcmFuc2Zlck9iamVjdHMgICAgICAgICAgICDigJQgc2VuZCB0byByZWNpcGllbnQgMVxuICAgICAgY29uc3QgcHJvZ3JhbW1hYmxlVHggPSBzdWlUeC5zdWlUcmFuc2FjdGlvbi50eDtcbiAgICAgIGNvbnN0IGNtZHMgPSBwcm9ncmFtbWFibGVUeC50cmFuc2FjdGlvbnMgYXMgYW55W107XG4gICAgICBjbWRzWzBdLmtpbmQuc2hvdWxkLmVxdWFsKCdNb3ZlQ2FsbCcsICdjb21tYW5kIDAgbXVzdCBiZSBNb3ZlQ2FsbChyZWRlZW1fZnVuZHMpJyk7XG4gICAgICBjbWRzWzBdLnRhcmdldC5zaG91bGQuZXF1YWwoJzB4Mjo6Y29pbjo6cmVkZWVtX2Z1bmRzJyk7XG4gICAgICBjbWRzWzFdLmtpbmQuc2hvdWxkLmVxdWFsKCdNZXJnZUNvaW5zJywgJ2NvbW1hbmQgMSBtdXN0IGJlIE1lcmdlQ29pbnMoZ2FzLCBbYWRkckNvaW5dKScpO1xuICAgICAgY21kc1syXS5raW5kLnNob3VsZC5lcXVhbCgnU3BsaXRDb2lucycsICdjb21tYW5kIDIgbXVzdCBiZSBTcGxpdENvaW5zKGdhcywgW2Ftb3VudDBdKScpO1xuICAgICAgY21kc1szXS5raW5kLnNob3VsZC5lcXVhbCgnVHJhbnNmZXJPYmplY3RzJyk7XG4gICAgICBjbWRzWzRdLmtpbmQuc2hvdWxkLmVxdWFsKCdTcGxpdENvaW5zJywgJ2NvbW1hbmQgNCBtdXN0IGJlIFNwbGl0Q29pbnMoZ2FzLCBbYW1vdW50MV0pJyk7XG4gICAgICBjbWRzWzVdLmtpbmQuc2hvdWxkLmVxdWFsKCdUcmFuc2Zlck9iamVjdHMnKTtcblxuICAgICAgLy8gZnVuZHNJbkFkZHJlc3NCYWxhbmNlIG11c3QgYmUgcGVyc2lzdGVkIGluIHRoZSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uXG4gICAgICBzdWlUeC5zdWlUcmFuc2FjdGlvbi5mdW5kc0luQWRkcmVzc0JhbGFuY2UhLnNob3VsZC5lcXVhbChGVU5EU19JTl9BRERSRVNTX0JBTEFOQ0UpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG5cbiAgICAgIC8vIFJvdW5kLXRyaXA6IHJlYnVpbHQgdHJhbnNhY3Rpb24gbXVzdCBiZSBiaXQtZm9yLWJpdCBpZGVudGljYWxcbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzcG9uc29yZWQgdHJhbnNmZXIgd2l0aCBjb2luIG9iamVjdHMgKyBhZGRyZXNzIGJhbGFuY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnB1dE9iamVjdHMgPSB0ZXN0RGF0YS5nZW5lcmF0ZU9iamVjdHMoMik7XG4gICAgICBjb25zdCBzcG9uc29yZWRHYXNEYXRhID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhLFxuICAgICAgICBvd25lcjogdGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHNwb25zb3JlZEdhc0RhdGEpO1xuICAgICAgdHhCdWlsZGVyLmlucHV0T2JqZWN0cyhpbnB1dE9iamVjdHMpO1xuICAgICAgdHhCdWlsZGVyLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZShGVU5EU19JTl9BRERSRVNTX0JBTEFOQ0UpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcblxuICAgICAgY29uc3Qgc3VpVHggPSB0eCBhcyBTdWlUcmFuc2FjdGlvbjxUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPjtcbiAgICAgIHN1aVR4LnN1aVRyYW5zYWN0aW9uLmdhc0RhdGEub3duZXIuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MpO1xuXG4gICAgICAvLyBTcG9uc29yZWQgcGF0aDogTW92ZUNhbGwocmVkZWVtX2Z1bmRzKSArIE1lcmdlQ29pbnMgKyBTcGxpdENvaW5zXG4gICAgICBjb25zdCBwcm9ncmFtbWFibGVUeCA9IHN1aVR4LnN1aVRyYW5zYWN0aW9uLnR4O1xuICAgICAgKHByb2dyYW1tYWJsZVR4LnRyYW5zYWN0aW9uc1swXSBhcyBhbnkpLmtpbmQuc2hvdWxkLmVxdWFsKCdNb3ZlQ2FsbCcpO1xuICAgICAgKHByb2dyYW1tYWJsZVR4LnRyYW5zYWN0aW9uc1swXSBhcyBhbnkpLnRhcmdldC5zaG91bGQuZXF1YWwoJzB4Mjo6Y29pbjo6cmVkZWVtX2Z1bmRzJyk7XG4gICAgICAocHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zWzFdIGFzIGFueSkua2luZC5zaG91bGQuZXF1YWwoJ01lcmdlQ29pbnMnKTtcbiAgICAgIChwcm9ncmFtbWFibGVUeC50cmFuc2FjdGlvbnNbMl0gYXMgYW55KS5raW5kLnNob3VsZC5lcXVhbCgnU3BsaXRDb2lucycpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG5cbiAgICAgIC8vIFJvdW5kLXRyaXBcbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzcG9uc29yZWQgdHJhbnNmZXIgd2l0aCBhZGRyZXNzIGJhbGFuY2Ugb25seSAobm8gY29pbiBpbnB1dE9iamVjdHMpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3BvbnNvcmVkR2FzRGF0YSA9IHtcbiAgICAgICAgLi4udGVzdERhdGEuZ2FzRGF0YSxcbiAgICAgICAgb3duZXI6IHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShzcG9uc29yZWRHYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoRlVORFNfSU5fQUREUkVTU19CQUxBTkNFKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIC8vIFBhdGggMWI6IHdpdGhkcmF3YWwg4oaSIHJlZGVlbV9mdW5kcyDihpIgU3BsaXRDb2lucyhhZGRyQ29pbikg4oaSIFRyYW5zZmVyT2JqZWN0c1xuICAgICAgLy8gU3BvbnNvcidzIGdhcyBjb2lucyByZW1haW4gaW4gZ2FzRGF0YS5wYXltZW50OyB0eC5nYXMgaXMgTk9UIHVzZWQgZm9yIHRoZSB0cmFuc2ZlciBhbW91bnQuXG4gICAgICBjb25zdCBzdWlUeCA9IHR4IGFzIFN1aVRyYW5zYWN0aW9uPFRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+O1xuICAgICAgc3VpVHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5vd25lci5zaG91bGQuZXF1YWwodGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICBjb25zdCBwcm9ncmFtbWFibGVUeCA9IHN1aVR4LnN1aVRyYW5zYWN0aW9uLnR4O1xuICAgICAgKHByb2dyYW1tYWJsZVR4LnRyYW5zYWN0aW9uc1swXSBhcyBhbnkpLmtpbmQuc2hvdWxkLmVxdWFsKCdNb3ZlQ2FsbCcpO1xuICAgICAgKHByb2dyYW1tYWJsZVR4LnRyYW5zYWN0aW9uc1swXSBhcyBhbnkpLnRhcmdldC5zaG91bGQuZXF1YWwoJzB4Mjo6Y29pbjo6cmVkZWVtX2Z1bmRzJyk7XG4gICAgICAocHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zWzFdIGFzIGFueSkua2luZC5zaG91bGQuZXF1YWwoJ1NwbGl0Q29pbnMnKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuXG4gICAgICAvLyBSb3VuZC10cmlwOiByZWJ1aWxkIGZyb20gcmF3XG4gICAgICBjb25zdCByZWJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcmVidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSBhd2FpdCByZWJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHJlYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIFBhdGggMWIgc2VuZC1hbGw6IHNwb25zb3JlZCBhZGRyLWJhbGFuY2Utb25seSwgbm8gY2hhbmdlIChNZXJnZUNvaW5zIGNvbnN1bWVzIGFkZHJDb2luKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFJlcHJvZHVjZXMgdGhlIHJlYWwgb24tY2hhaW4gZmFpbHVyZTogVW51c2VkVmFsdWVXaXRob3V0RHJvcCB7IHJlc3VsdF9pZHg6IDAgfVxuICAgICAgLy8gT2NjdXJzIHdoZW4gcmVkZWVtX2Z1bmRzIHJldHVybnMgYWRkckNvaW4sIFNwbGl0Q29pbnMgZHJhaW5zIGl0IGNvbXBsZXRlbHksIGFuZCB0aGVcbiAgICAgIC8vIDAtYmFsYW5jZSBzb3VyY2UgY29pbiBpcyBuZXZlciBjb25zdW1lZC4gIEZpeDogTWVyZ2VDb2lucyhnYXMsIFthZGRyQ29pbl0pIGF0IHRoZSBlbmQuXG4gICAgICBjb25zdCBTRU5EX0FNT1VOVCA9ICcxMDAwMDAwJzsgLy8gMC4wMDEgU1VJIOKAlCBzYW1lIGFzIHRoZSBmYWlsaW5nIHR4XG4gICAgICBjb25zdCBzcG9uc29yZWRHYXNEYXRhID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhLFxuICAgICAgICBvd25lcjogdGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZChbeyBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIGFtb3VudDogU0VORF9BTU9VTlQgfV0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoc3BvbnNvcmVkR2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuZnVuZHNJbkFkZHJlc3NCYWxhbmNlKFNFTkRfQU1PVU5UKTsgLy8gc2VuZC1hbGw6IGJhbGFuY2UgPT0gcmVjaXBpZW50IGFtb3VudFxuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcblxuICAgICAgY29uc3Qgc3VpVHggPSB0eCBhcyBTdWlUcmFuc2FjdGlvbjxUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPjtcbiAgICAgIGNvbnN0IGNtZHMgPSBzdWlUeC5zdWlUcmFuc2FjdGlvbi50eC50cmFuc2FjdGlvbnMgYXMgYW55W107XG5cbiAgICAgIC8vIEV4cGVjdGVkIGNvbW1hbmQgc2VxdWVuY2UgZm9yIFBhdGggMWIgc2VuZC1hbGw6XG4gICAgICAvLyAgIDA6IE1vdmVDYWxsIChyZWRlZW1fZnVuZHMpICAgICDigJQgd2l0aGRyYXcgYWRkckNvaW5cbiAgICAgIC8vICAgMTogU3BsaXRDb2lucyhhZGRyQ29pbikgICAgICAgIOKAlCBzcGxpdCByZWNpcGllbnQgYW1vdW50IG9mZiBhZGRyQ29pblxuICAgICAgLy8gICAyOiBUcmFuc2Zlck9iamVjdHMoW3NwbGl0XSkgICAg4oCUIHNlbmQgdG8gcmVjaXBpZW50XG4gICAgICAvLyAgIDM6IE1lcmdlQ29pbnMoZ2FzLCBbYWRkckNvaW5dKSDigJQgY29uc3VtZSB0aGUgbm93LXplcm8tYmFsYW5jZSBhZGRyQ29pblxuICAgICAgY21kc1swXS5raW5kLnNob3VsZC5lcXVhbCgnTW92ZUNhbGwnKTtcbiAgICAgIGNtZHNbMF0udGFyZ2V0LnNob3VsZC5lcXVhbCgnMHgyOjpjb2luOjpyZWRlZW1fZnVuZHMnKTtcbiAgICAgIGNtZHNbMV0ua2luZC5zaG91bGQuZXF1YWwoJ1NwbGl0Q29pbnMnKTtcbiAgICAgIGNtZHNbMl0ua2luZC5zaG91bGQuZXF1YWwoJ1RyYW5zZmVyT2JqZWN0cycpO1xuICAgICAgY21kc1szXS5raW5kLnNob3VsZC5lcXVhbCgnTWVyZ2VDb2lucycsICdleHBlY3RlZCBNZXJnZUNvaW5zIHRvIGNvbnN1bWUgMC1iYWxhbmNlIGFkZHJDb2luIGFmdGVyIHNlbmQtYWxsJyk7XG5cbiAgICAgIC8vIFJlY2lwaWVudCBwYXJzaW5nIG11c3Qgbm90IGJlIGFmZmVjdGVkIGJ5IHRoZSB0cmFpbGluZyBNZXJnZUNvaW5zXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gdXRpbHMuZ2V0UmVjaXBpZW50cyhzdWlUeC5zdWlUcmFuc2FjdGlvbik7XG4gICAgICByZWNpcGllbnRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICByZWNpcGllbnRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcyk7XG4gICAgICByZWNpcGllbnRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwoU0VORF9BTU9VTlQpO1xuXG4gICAgICAvLyBSb3VuZC10cmlwXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICBjb25zdCByZWJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcmVidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSBhd2FpdCByZWJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHJlYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIFBhdGggMWIgd2l0aCBjaGFuZ2U6IHNwb25zb3JlZCBhZGRyLWJhbGFuY2Utb25seSwgZXhjZXNzIHJldHVybmVkIHRvIHNlbmRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZSBleGNlZWRzIHRoZSB0b3RhbCByZWNpcGllbnQgYW1vdW50IOKGkiBjaGFuZ2UgbXVzdCBiZSByZXR1cm5lZCB0b1xuICAgICAgLy8gdGhlIHNlbmRlciBhcyBhbiBleHRyYSBUcmFuc2Zlck9iamVjdHMoW2FkZHJDb2luXSwgc2VuZGVyKS4gIFRoZSB0cmFuc2FjdGlvbiBwYXJzZXIgbXVzdFxuICAgICAgLy8gc2tpcCB0aGlzIGNoYW5nZSB0cmFuc2ZlciBhbmQgb25seSByZXBvcnQgYWN0dWFsIHJlY2lwaWVudHMuXG4gICAgICBjb25zdCBTRU5EX0FNT1VOVCA9ICcxMDAnOyAvLyBlYWNoIG9mIHRoZSB0d28gdGVzdERhdGEucmVjaXBpZW50cyBnZXRzIDEwMFxuICAgICAgY29uc3QgRVhDRVNTID0gJzk5OTk5MDAnOyAvLyBmdW5kc0luQWRkcmVzc0JhbGFuY2UgPSAxMF8wMDBfMDAwLCB0b3RhbCBzZW5kID0gMjAwXG4gICAgICBjb25zdCBGVU5EU19CQUxBTkNFID0gKE51bWJlcihTRU5EX0FNT1VOVCkgKiB0ZXN0RGF0YS5yZWNpcGllbnRzLmxlbmd0aCArIE51bWJlcihFWENFU1MpKS50b1N0cmluZygpO1xuXG4gICAgICBjb25zdCBzcG9uc29yZWRHYXNEYXRhID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhLFxuICAgICAgICBvd25lcjogdGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh0ZXN0RGF0YS5yZWNpcGllbnRzKTsgLy8gMiByZWNpcGllbnRzIMOXIDEwMCBNSVNUID0gMjAwIE1JU1QgdG90YWxcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHNwb25zb3JlZEdhc0RhdGEpO1xuICAgICAgdHhCdWlsZGVyLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZShGVU5EU19CQUxBTkNFKTsgLy8gMTBfMDAwXzAwMCA+IDIwMCDihpIgaGFzIGNoYW5nZVxuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcblxuICAgICAgY29uc3Qgc3VpVHggPSB0eCBhcyBTdWlUcmFuc2FjdGlvbjxUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPjtcbiAgICAgIGNvbnN0IGNtZHMgPSBzdWlUeC5zdWlUcmFuc2FjdGlvbi50eC50cmFuc2FjdGlvbnMgYXMgYW55W107XG5cbiAgICAgIC8vIEV4cGVjdGVkIHNlcXVlbmNlIGZvciBQYXRoIDFiIHdpdGggY2hhbmdlICgyIHJlY2lwaWVudHMpOlxuICAgICAgLy8gICAwOiBNb3ZlQ2FsbCAocmVkZWVtX2Z1bmRzKVxuICAgICAgLy8gICAxOiBTcGxpdENvaW5zICDigJQgIHJlY2lwaWVudCAwXG4gICAgICAvLyAgIDI6IFRyYW5zZmVyT2JqZWN0cyAg4oCUICByZWNpcGllbnQgMFxuICAgICAgLy8gICAzOiBTcGxpdENvaW5zICDigJQgIHJlY2lwaWVudCAxXG4gICAgICAvLyAgIDQ6IFRyYW5zZmVyT2JqZWN0cyAg4oCUICByZWNpcGllbnQgMVxuICAgICAgLy8gICA1OiBUcmFuc2Zlck9iamVjdHMoW2FkZHJDb2luXSwgc2VuZGVyKSAg4oCUICBjaGFuZ2UgYmFjayB0byBzZW5kZXJcbiAgICAgIGNtZHNbMF0ua2luZC5zaG91bGQuZXF1YWwoJ01vdmVDYWxsJyk7XG4gICAgICBjbWRzWzBdLnRhcmdldC5zaG91bGQuZXF1YWwoJzB4Mjo6Y29pbjo6cmVkZWVtX2Z1bmRzJyk7XG4gICAgICBjb25zdCBsYXN0Q21kID0gY21kc1tjbWRzLmxlbmd0aCAtIDFdO1xuICAgICAgbGFzdENtZC5raW5kLnNob3VsZC5lcXVhbCgnVHJhbnNmZXJPYmplY3RzJywgJ2xhc3QgY29tbWFuZCBtdXN0IGJlIHRoZSBjaGFuZ2UgdHJhbnNmZXInKTtcblxuICAgICAgLy8gVGhlIGxhc3QgVHJhbnNmZXJPYmplY3RzIHJldHVybnMgY2hhbmdlIHRvIHRoZSAqc2VuZGVyKiwgbm90IGEgcmVjaXBpZW50XG4gICAgICBjb25zdCBjaGFuZ2VBZGRySW5wdXQgPSBzdWlUeC5zdWlUcmFuc2FjdGlvbi50eC5pbnB1dHNbbGFzdENtZC5hZGRyZXNzLmluZGV4XSBhcyBhbnk7XG4gICAgICBjb25zdCBjaGFuZ2VBZGRyID0gdXRpbHMuZ2V0QWRkcmVzcyhjaGFuZ2VBZGRySW5wdXQpO1xuICAgICAgY2hhbmdlQWRkci5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsICdjaGFuZ2UgbXVzdCBnbyBiYWNrIHRvIHNlbmRlcicpO1xuXG4gICAgICAvLyBQYXJzZXIgbXVzdCByZXR1cm4gb25seSB0aGUgYWN0dWFsIHJlY2lwaWVudHMsIG5vdCB0aGUgY2hhbmdlIHRyYW5zZmVyXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gdXRpbHMuZ2V0UmVjaXBpZW50cyhzdWlUeC5zdWlUcmFuc2FjdGlvbik7XG4gICAgICByZWNpcGllbnRzLmxlbmd0aC5zaG91bGQuZXF1YWwodGVzdERhdGEucmVjaXBpZW50cy5sZW5ndGgpO1xuICAgICAgcmVjaXBpZW50c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MpO1xuICAgICAgcmVjaXBpZW50c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKFNFTkRfQU1PVU5UKTtcbiAgICAgIHJlY2lwaWVudHNbMV0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEucmVjaXBpZW50c1sxXS5hZGRyZXNzKTtcbiAgICAgIHJlY2lwaWVudHNbMV0uYW1vdW50LnNob3VsZC5lcXVhbChTRU5EX0FNT1VOVCk7XG5cbiAgICAgIC8vIFJvdW5kLXRyaXBcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzcG9uc29yZWQgdHggZ2FzIHBhaWQgZnJvbSBzcG9uc29yIGFkZHJlc3MgYmFsYW5jZSAoZW1wdHkgcGF5bWVudCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnB1dE9iamVjdHMgPSB0ZXN0RGF0YS5nZW5lcmF0ZU9iamVjdHMoMSk7XG4gICAgICBjb25zdCBzcG9uc29yZWRHYXNEYXRhTm9QYXltZW50ID0ge1xuICAgICAgICBwYXltZW50OiBbXSxcbiAgICAgICAgb3duZXI6IHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MsXG4gICAgICAgIHByaWNlOiB0ZXN0RGF0YS5nYXNEYXRhLnByaWNlLFxuICAgICAgICBidWRnZXQ6IHRlc3REYXRhLmdhc0RhdGEuYnVkZ2V0LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoc3BvbnNvcmVkR2FzRGF0YU5vUGF5bWVudCk7XG4gICAgICB0eEJ1aWxkZXIuaW5wdXRPYmplY3RzKGlucHV0T2JqZWN0cyk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuXG4gICAgICBjb25zdCBzdWlUeCA9IHR4IGFzIFN1aVRyYW5zYWN0aW9uPFRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+O1xuICAgICAgc3VpVHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5vd25lci5zaG91bGQuZXF1YWwodGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG4gICAgICBzdWlUeC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnBheW1lbnQubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgLy8gU3BvbnNvcmVkIHBhdGggd2l0aCBjb2luIG9iamVjdHMsIG5vIGFkZHJlc3MgYmFsYW5jZSB3aXRoZHJhd2FsXG4gICAgICBjb25zdCBwcm9ncmFtbWFibGVUeCA9IHN1aVR4LnN1aVRyYW5zYWN0aW9uLnR4O1xuICAgICAgKHByb2dyYW1tYWJsZVR4LnRyYW5zYWN0aW9uc1swXSBhcyBhbnkpLmtpbmQuc2hvdWxkLmVxdWFsKCdTcGxpdENvaW5zJyk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcm91bmQtdHJpcCBhIHNlbGYtcGF5IHRyYW5zZmVyIHdpdGggRXBvY2ggZXhwaXJhdGlvbiB2aWEgZnJvbUJ5dGVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciB0aGUgQmlnSW50IHJvdW5kLXRyaXAgYnVnOlxuICAgICAgLy8gQkNTLlU2NCBkZXNlcmlhbGl6ZXMgdTY0IGFzIEJpZ0ludCwgYnV0IHRoZSBwcmV2aW91cyBzdXBlcnN0cnVjdCBzY2hlbWEgdXNlZCBpbnRlZ2VyKClcbiAgICAgIC8vIHdoaWNoIHJlamVjdGVkIEJpZ0ludCwgY2F1c2luZyBmcm9tQnl0ZXMoKSB0byB0aHJvdyBhIFN0cnVjdEVycm9yIGF0IFwiZXhwaXJhdGlvblwiLlxuICAgICAgLy8gU3RyaW5nRW5jb2RlZEJpZ2ludCBub3cgYWNjZXB0cyBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsIGZpeGluZyB0aGUgcm91bmQtdHJpcC5cbiAgICAgIGNvbnN0IGdhc0RhdGFOb1BheW1lbnQgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGFXaXRob3V0R2FzUGF5bWVudCxcbiAgICAgICAgcGF5bWVudDogW10sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShnYXNEYXRhTm9QYXltZW50KTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoRlVORFNfSU5fQUREUkVTU19CQUxBTkNFKTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKHsgRXBvY2g6IDMyNCB9KTsgLy8gbnVtYmVyIGlucHV0XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG5cbiAgICAgIC8vIGZyb21CeXRlcyBtdXN0IG5vdCB0aHJvdyBTdHJ1Y3RFcnJvciDigJQgdGhpcyB3YXMgdGhlIGZhaWxpbmcgY2FzZSBiZWZvcmUgdGhlIGZpeFxuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICAgIHNob3VsZC5leGlzdChyZWJ1aWxkZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEZ1bGwgcm91bmQtdHJpcDogcmVidWlsdCB0eCBtdXN0IHNlcmlhbGl6ZSBpZGVudGljYWxseVxuICAgICAgY29uc3QgcmVidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIHJlYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsZGVyLmJ1aWxkKCk7XG4gICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuXG4gICAgICAvLyBFcG9jaCB2YWx1ZSBtdXN0IHN1cnZpdmUgdGhlIHJvdW5kLXRyaXAgcmVnYXJkbGVzcyBvZiBCaWdJbnQvbnVtYmVyIHJlcHJlc2VudGF0aW9uXG4gICAgICBjb25zdCByZWJ1aWx0SnNvbiA9IHJlYnVpbHRUeC50b0pzb24oKTtcbiAgICAgIGNvbnN0IGVwb2NoVmFsID0gKHJlYnVpbHRKc29uLmV4cGlyYXRpb24gYXMgYW55KT8uRXBvY2g7XG4gICAgICBzaG91bGQuZXhpc3QoZXBvY2hWYWwpO1xuICAgICAgTnVtYmVyKGVwb2NoVmFsKS5zaG91bGQuZXF1YWwoMzI0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcm91bmQtdHJpcCBhIHNlbGYtcGF5IHRyYW5zZmVyIHdpdGggVmFsaWREdXJpbmcgZXhwaXJhdGlvbiB2aWEgZnJvbUJ5dGVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVmVyaWZpZXMgdGhlIGZ1bGwgNi1maWVsZCBWYWxpZER1cmluZ0V4cGlyYXRpb24gQkNTIHNjaGVtYTpcbiAgICAgIC8vICAgbWluRXBvY2gvbWF4RXBvY2ggYXMgT3B0aW9uPHU2ND4sIG1pblRpbWVzdGFtcC9tYXhUaW1lc3RhbXAgYXMgT3B0aW9uPHU2ND4gKE5vbmUpLFxuICAgICAgLy8gICBjaGFpbiBhcyAzMi1ieXRlIEJhc2U1OCBPYmplY3REaWdlc3QsIG5vbmNlIGFzIHUzMi5cbiAgICAgIC8vIFVzZXMgYSByZWFsIG1haW5uZXQgZ2VuZXNpcyBjaGVja3BvaW50IGRpZ2VzdCAoMzIgYnl0ZXMsIEJhc2U1OCkuXG4gICAgICBjb25zdCBHRU5FU0lTX0NIQUlOX0lEID0gJ0dBRnBDQ2NSQ3hUZEZmVUVNYlFia0xCYVp5MlJOaUdBZnZGQmhNTnBxMmtUJztcbiAgICAgIGNvbnN0IEZVTkRTX0lOX0FERFJFU1NfQkFMQU5DRSA9ICc1MDAwMDAwMDAwJztcbiAgICAgIGNvbnN0IGdhc0RhdGFOb1BheW1lbnQgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGFXaXRob3V0R2FzUGF5bWVudCxcbiAgICAgICAgcGF5bWVudDogW10sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShnYXNEYXRhTm9QYXltZW50KTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoRlVORFNfSU5fQUREUkVTU19CQUxBTkNFKTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKHtcbiAgICAgICAgVmFsaWREdXJpbmc6IHtcbiAgICAgICAgICBtaW5FcG9jaDogeyBTb21lOiA1MDAgfSxcbiAgICAgICAgICBtYXhFcG9jaDogeyBTb21lOiA1MDEgfSxcbiAgICAgICAgICBtaW5UaW1lc3RhbXA6IHsgTm9uZTogbnVsbCB9LFxuICAgICAgICAgIG1heFRpbWVzdGFtcDogeyBOb25lOiBudWxsIH0sXG4gICAgICAgICAgY2hhaW46IEdFTkVTSVNfQ0hBSU5fSUQsXG4gICAgICAgICAgbm9uY2U6IDB4ZGVhZGJlZWYsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgLy8gZnJvbUJ5dGVzIG11c3Qgbm90IHRocm93IOKAlCBWYWxpZER1cmluZyBmaWVsZHMgbXVzdCBzdXJ2aXZlIGRlc2VyaWFsaXphdGlvblxuICAgICAgY29uc3QgcmVidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIHJlYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIC8vIEJDUyByb3VuZC10cmlwOiBzZXJpYWxpemVkIGJ5dGVzIG11c3QgYmUgaWRlbnRpY2FsXG4gICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuXG4gICAgICAvLyBBbGwgVmFsaWREdXJpbmcgZmllbGRzIG11c3Qgc3Vydml2ZSB0aGUgcm91bmQtdHJpcFxuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IChyZWJ1aWx0VHgudG9Kc29uKCkuZXhwaXJhdGlvbiBhcyBhbnkpPy5WYWxpZER1cmluZztcbiAgICAgIHNob3VsZC5leGlzdChleHBpcmF0aW9uKTtcbiAgICAgIE51bWJlcihleHBpcmF0aW9uLm1pbkVwb2NoPy5Tb21lID8/IGV4cGlyYXRpb24ubWluRXBvY2gpLnNob3VsZC5lcXVhbCg1MDApO1xuICAgICAgTnVtYmVyKGV4cGlyYXRpb24ubWF4RXBvY2g/LlNvbWUgPz8gZXhwaXJhdGlvbi5tYXhFcG9jaCkuc2hvdWxkLmVxdWFsKDUwMSk7XG4gICAgICBleHBpcmF0aW9uLmNoYWluLnNob3VsZC5lcXVhbChHRU5FU0lTX0NIQUlOX0lEKTtcbiAgICAgIE51bWJlcihleHBpcmF0aW9uLm5vbmNlKS5zaG91bGQuZXF1YWwoMHhkZWFkYmVlZik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsYXJnZSBhbW91bnRzIGV4Y2VlZGluZyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUicsICgpID0+IHtcbiAgICAvLyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEuXG4gICAgLy8gVXNpbmcgTnVtYmVyKCkgZm9yIGFtb3VudHMgYWJvdmUgdGhpcyBzaWxlbnRseSByb3VuZHMgdG8gdGhlIG5lYXJlc3QgcmVwcmVzZW50YWJsZSBmbG9hdC5cbiAgICAvLyA5MDA3MTk5MjU0NzQwOTkzIChNQVhfU0FGRV9JTlRFR0VSICsgMikgaXMgTk9UIGV4YWN0bHkgcmVwcmVzZW50YWJsZSBhcyBhIEpTIE51bWJlciDigJQgaXRcbiAgICAvLyByb3VuZHMgZG93biB0byA5MDA3MTk5MjU0NzQwOTkyIOKAlCBzbyBCQ1Mgd291bGQgZW5jb2RlIHRoZSB3cm9uZyB2YWx1ZS5cbiAgICAvLyBCaWdJbnQgcHJlc2VydmVzIHRoZSBleGFjdCB2YWx1ZSBhbmQgaXMgdGhlIGNvcnJlY3QgdHlwZSBmb3IgQkNTIHU2NCBlbmNvZGluZy5cbiAgICAvL1xuICAgIC8vIFRoZSBjb3JlIGNoZWNrIGluIGVhY2ggdGVzdCBpcyB0eC5vdXRwdXRzWzBdLnZhbHVlID09PSBMQVJHRV9BTU9VTlQ6IHRoaXMgcmVhZHMgZnJvbSB0aGVcbiAgICAvLyBpbi1tZW1vcnkgYnVpbGRlciBzdGF0ZSAoYSBCaWdJbnQsIG5vdCBCQ1MtZGVjb2RlZCksIHNvIGl0IGFjY3VyYXRlbHkgZGlzdGluZ3Vpc2hlc1xuICAgIC8vIEJpZ0ludCgpIHZzIE51bWJlcigpIGVuY29kaW5nIGF0IGJ1aWxkIHRpbWUuXG4gICAgY29uc3QgTEFSR0VfQU1PVU5UID0gJzkwMDcxOTkyNTQ3NDA5OTMnOyAvLyBNQVhfU0FGRV9JTlRFR0VSICsgMlxuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHNlbGYtcGF5IHRyYW5zZmVyIChQYXRoIDIpIHdpdGggYW1vdW50ID4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgYW5kIGVuY29kZSBpdCBwcmVjaXNlbHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoW3sgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLCBhbW91bnQ6IExBUkdFX0FNT1VOVCB9XSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIC8vIFdpdGggTnVtYmVyKCkgdGhlIGFtb3VudCB3b3VsZCBiZSBzaWxlbnRseSByb3VuZGVkIHRvIDkwMDcxOTkyNTQ3NDA5OTIg4oCUIEJpZ0ludCBwcmVzZXJ2ZXMgdGhlIGV4YWN0IHZhbHVlXG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbChMQVJHRV9BTU9VTlQpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc3BvbnNvcmVkIHRyYW5zZmVyIHdpdGggY29pbiBvYmplY3RzIChQYXRoIDFhKSB3aXRoIGFtb3VudCA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIGFuZCBlbmNvZGUgaXQgcHJlY2lzZWx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW5wdXRPYmplY3RzID0gdGVzdERhdGEuZ2VuZXJhdGVPYmplY3RzKDIpO1xuICAgICAgY29uc3Qgc3BvbnNvcmVkR2FzRGF0YSA9IHtcbiAgICAgICAgLi4udGVzdERhdGEuZ2FzRGF0YSxcbiAgICAgICAgb3duZXI6IHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoW3sgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLCBhbW91bnQ6IExBUkdFX0FNT1VOVCB9XSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShzcG9uc29yZWRHYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5pbnB1dE9iamVjdHMoaW5wdXRPYmplY3RzKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIC8vIFdpdGggTnVtYmVyKCkgdGhlIGFtb3VudCB3b3VsZCBiZSBzaWxlbnRseSByb3VuZGVkIHRvIDkwMDcxOTkyNTQ3NDA5OTIg4oCUIEJpZ0ludCBwcmVzZXJ2ZXMgdGhlIGV4YWN0IHZhbHVlXG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbChMQVJHRV9BTU9VTlQpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc3BvbnNvcmVkIGFkZHItYmFsYW5jZS1vbmx5IHRyYW5zZmVyIChQYXRoIDFiKSB3aXRoIGFtb3VudCA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIGFuZCByb3VuZC10cmlwIGNvcnJlY3RseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNwb25zb3JlZEdhc0RhdGEgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGEsXG4gICAgICAgIG93bmVyOiB0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKFt7IGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcywgYW1vdW50OiBMQVJHRV9BTU9VTlQgfV0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoc3BvbnNvcmVkR2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuZnVuZHNJbkFkZHJlc3NCYWxhbmNlKExBUkdFX0FNT1VOVCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuXG4gICAgICAvLyBXaXRoIE51bWJlcigpIHRoZSBhbW91bnQgd291bGQgYmUgc2lsZW50bHkgcm91bmRlZCB0byA5MDA3MTk5MjU0NzQwOTkyIOKAlCBCaWdJbnQgcHJlc2VydmVzIHRoZSBleGFjdCB2YWx1ZVxuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoTEFSR0VfQU1PVU5UKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuXG4gICAgICAvLyBGdWxsIHJvdW5kLXRyaXA6IHJlYnVpbGRpbmcgZnJvbSBCQ1MgYnl0ZXMgbXVzdCBwcm9kdWNlIGlkZW50aWNhbCBieXRlc1xuICAgICAgY29uc3QgcmVidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIHJlYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsZGVyLmJ1aWxkKCk7XG4gICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gdXRpbHMuZ2V0UmVjaXBpZW50cyhcbiAgICAgICAgKHJlYnVpbHRUeCBhcyBTdWlUcmFuc2FjdGlvbjxUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPikuc3VpVHJhbnNhY3Rpb25cbiAgICAgICk7XG4gICAgICByZWNpcGllbnRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwoTEFSR0VfQU1PVU5UKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Byb2QgYWRkcmVzcyBiYWxhbmNlIGNvbnNvbGlkYXRpb24gKENFQ0hPLTEyMTApJywgKCkgPT4ge1xuICAgIC8vIEZhaWxlZCBwcm9kIGNvbnNvbGlkYXRpb24gNmExOWNiOGJjZDQ3NTFkYmQ4OTFhNzIyZWUwNGU1NTIgKHR4UmVxdWVzdCBlZTVkNjBkNy1mYTUzLTRmYTQtYWRjZi0yNjQzNWM5MzE3YmYpLlxuICAgIC8vIEJyb2FkY2FzdCBmYWlsZWQgd2l0aCBzdGFsZSBjb2luIG9iamVjdCB2ZXJzaW9uOyB0aGUgYW1vdW50IG11c3Qgc3RpbGwgZW5jb2RlIGxvc3NsZXNzbHkuXG4gICAgY29uc3QgQ09OU09MSURBVElPTl9BTU9VTlQgPSAnMTg1MzY3OTc4NDI2MTM3MDAnOyAvLyB+MTguNU0gU1VJIGluIE1JU1QgKHNlbmRBY2NvdW50aW5nLmFtb3VudFN0cmluZylcbiAgICBjb25zdCBDT05TT0xJREFUSU9OX1NFTkRFUiA9ICcweDQ2YTUzZTI3MTI1NjFmNGUwZDgyNzJiZDI3YTM5NmI2YmY5MzI1ZjkyZjM0Yjk0OTA0MWI4NzgzZDU3NDY5ZGQnO1xuICAgIGNvbnN0IENPTlNPTElEQVRJT05fUkVDSVBJRU5UID0gJzB4M2RhMmNiNjdjODg3YzlhMDNkMTA1MmQ0ODY3MzNhNzcxMDU4MjRmNzQxM2ZjM2NiYmUzNjQxZDRiNjdhZjEwMic7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB0aGUgcHJvZCBjb25zb2xpZGF0aW9uIGFtb3VudCBpbiBpc1ZhbGlkQW1vdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbHMuaXNWYWxpZEFtb3VudChDT05TT0xJREFUSU9OX0FNT1VOVCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKE51bWJlcihDT05TT0xJREFUSU9OX0FNT1VOVCkpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhZGRyZXNzLWJhbGFuY2Utb25seSBjb25zb2xpZGF0aW9uIHdpdGggZXhhY3QgcHJvZCBhbW91bnQgKFBhdGggMiwgZW1wdHkgcGF5bWVudCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBnYXNEYXRhTm9QYXltZW50ID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhV2l0aG91dEdhc1BheW1lbnQsXG4gICAgICAgIHBheW1lbnQ6IFtdLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKENPTlNPTElEQVRJT05fU0VOREVSKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKFt7IGFkZHJlc3M6IENPTlNPTElEQVRJT05fUkVDSVBJRU5ULCBhbW91bnQ6IENPTlNPTElEQVRJT05fQU1PVU5UIH1dKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKGdhc0RhdGFOb1BheW1lbnQpO1xuICAgICAgdHhCdWlsZGVyLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZShDT05TT0xJREFUSU9OX0FNT1VOVCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuXG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiBDT05TT0xJREFUSU9OX1JFQ0lQSUVOVCxcbiAgICAgICAgdmFsdWU6IENPTlNPTElEQVRJT05fQU1PVU5ULFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbChDT05TT0xJREFUSU9OX0FNT1VOVCk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgY29uc3QgZGVzZXJpYWxpemVkID0gU3VpVHJhbnNhY3Rpb24uZGVzZXJpYWxpemVTdWlUcmFuc2FjdGlvbihyYXdUeCk7XG4gICAgICBjb25zdCByZWNpcGllbnRzID0gdXRpbHMuZ2V0UmVjaXBpZW50cyhkZXNlcmlhbGl6ZWQpO1xuICAgICAgcmVjaXBpZW50cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgcmVjaXBpZW50c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChDT05TT0xJREFUSU9OX1JFQ0lQSUVOVCk7XG4gICAgICByZWNpcGllbnRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwoQ09OU09MSURBVElPTl9BTU9VTlQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhZGRyZXNzLWJhbGFuY2UgY29uc29saWRhdGlvbiB3aXRoIGNvaW4gb2JqZWN0cyBhbmQgZXhhY3QgcHJvZCBhbW91bnQgKFBhdGggMiknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBQcm9kIGZhaWx1cmUgcmVmZXJlbmNlZCBzdGFsZSBnYXMvY29pbiBvYmplY3QgdmVyc2lvbnMgYmV0d2VlbiBzaWduIGFuZCBicm9hZGNhc3QuXG4gICAgICAvLyBCdWlsZGVyIG11c3Qgc3RpbGwgZW5jb2RlIHRoZSBmdWxsIGNvbnNvbGlkYXRpb24gYW1vdW50IGluIFNwbGl0Q29pbnMuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoQ09OU09MSURBVElPTl9TRU5ERVIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoW3sgYWRkcmVzczogQ09OU09MSURBVElPTl9SRUNJUElFTlQsIGFtb3VudDogQ09OU09MSURBVElPTl9BTU9VTlQgfV0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoeyAuLi50ZXN0RGF0YS5nYXNEYXRhLCBvd25lcjogQ09OU09MSURBVElPTl9TRU5ERVIgfSk7XG4gICAgICB0eEJ1aWxkZXIuZnVuZHNJbkFkZHJlc3NCYWxhbmNlKENPTlNPTElEQVRJT05fQU1PVU5UKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKENPTlNPTElEQVRJT05fQU1PVU5UKTtcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoQ09OU09MSURBVElPTl9BTU9VTlQpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG5cbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcblxuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IHV0aWxzLmdldFJlY2lwaWVudHMoXG4gICAgICAgIChyZWJ1aWx0VHggYXMgU3VpVHJhbnNhY3Rpb248VHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj4pLnN1aVRyYW5zYWN0aW9uXG4gICAgICApO1xuICAgICAgcmVjaXBpZW50c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChDT05TT0xJREFUSU9OX1JFQ0lQSUVOVCk7XG4gICAgICByZWNpcGllbnRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwoQ09OU09MSURBVElPTl9BTU9VTlQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQmFsYW5jZVdpdGhkcmF3YWwgQkNTIGVuY29kaW5nIChGdW5kc1dpdGhkcmF3YWwgZm9ybWF0KScsICgpID0+IHtcbiAgICBjb25zdCBBTU9VTlQgPSAnMTAwMDAwMDAwJzsgLy8gMC4xIFNVSSBpbiBNSVNUXG4gICAgY29uc3Qgc3BvbnNvcmVkR2FzRGF0YSA9IHtcbiAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGEsXG4gICAgICBvd25lcjogdGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyxcbiAgICB9O1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gYnVpbGRTcG9uc29yZWRUeFdpdGhBZGRyZXNzQmFsYW5jZSgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZChbeyBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIGFtb3VudDogQU1PVU5UIH1dKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHNwb25zb3JlZEdhc0RhdGEpO1xuICAgICAgdHhCdWlsZGVyLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZShBTU9VTlQpO1xuICAgICAgcmV0dXJuIHR4QnVpbGRlci5idWlsZCgpO1xuICAgIH1cblxuICAgIGl0KCdzaG91bGQgZW5jb2RlIEJhbGFuY2VXaXRoZHJhd2FsIGlucHV0IHdpdGggRnVuZHNXaXRoZHJhd2FsIHN0cnVjdHVyZSAocmVzZXJ2YXRpb24vdHlwZUFyZy93aXRoZHJhd0Zyb20pJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZFNwb25zb3JlZFR4V2l0aEFkZHJlc3NCYWxhbmNlKCk7XG4gICAgICBjb25zdCBzdWlUeCA9IHR4IGFzIFN1aVRyYW5zYWN0aW9uPFRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+O1xuICAgICAgY29uc3QgaW5wdXRzID0gc3VpVHguc3VpVHJhbnNhY3Rpb24udHguaW5wdXRzIGFzIGFueVtdO1xuXG4gICAgICBjb25zdCBid0lucHV0ID0gaW5wdXRzLmZpbmQoXG4gICAgICAgIChpbnApID0+IGlucD8uQmFsYW5jZVdpdGhkcmF3YWwgIT09IHVuZGVmaW5lZCB8fCBpbnA/LnZhbHVlPy5CYWxhbmNlV2l0aGRyYXdhbCAhPT0gdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgc2hvdWxkLmV4aXN0KGJ3SW5wdXQsICdCYWxhbmNlV2l0aGRyYXdhbCBpbnB1dCBtdXN0IGJlIHByZXNlbnQnKTtcblxuICAgICAgY29uc3QgYncgPSBid0lucHV0LkJhbGFuY2VXaXRoZHJhd2FsID8/IGJ3SW5wdXQudmFsdWU/LkJhbGFuY2VXaXRoZHJhd2FsO1xuXG4gICAgICBzaG91bGQuZXhpc3QoYncucmVzZXJ2YXRpb24sICdyZXNlcnZhdGlvbiBmaWVsZCBtdXN0IGV4aXN0Jyk7XG4gICAgICBzaG91bGQuZXhpc3QoYncucmVzZXJ2YXRpb24uTWF4QW1vdW50VTY0LCAncmVzZXJ2YXRpb24uTWF4QW1vdW50VTY0IG11c3QgZXhpc3QnKTtcbiAgICAgIGJ3LnJlc2VydmF0aW9uLk1heEFtb3VudFU2NC50b1N0cmluZygpLnNob3VsZC5lcXVhbChBTU9VTlQpO1xuXG4gICAgICBzaG91bGQuZXhpc3QoYncudHlwZUFyZywgJ3R5cGVBcmcgZmllbGQgbXVzdCBleGlzdCcpO1xuICAgICAgc2hvdWxkLmV4aXN0KGJ3LnR5cGVBcmcuQmFsYW5jZSwgJ3R5cGVBcmcuQmFsYW5jZSBtdXN0IGV4aXN0Jyk7XG5cbiAgICAgIHNob3VsZC5leGlzdChidy53aXRoZHJhd0Zyb20sICd3aXRoZHJhd0Zyb20gZmllbGQgbXVzdCBleGlzdCcpO1xuICAgICAgc2hvdWxkLmV4aXN0KFxuICAgICAgICBidy53aXRoZHJhd0Zyb20uU2VuZGVyICE9PSB1bmRlZmluZWQgfHwgYncud2l0aGRyYXdGcm9tLlNwb25zb3IgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgJ3dpdGhkcmF3RnJvbSBtdXN0IGJlIFNlbmRlciBvciBTcG9uc29yJ1xuICAgICAgKTtcblxuICAgICAgLy8gT2xkIGZvcm1hdCBmaWVsZHMgbXVzdCBOT1QgZXhpc3QgZGlyZWN0bHkgb24gYndcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QoYncuYW1vdW50LCAnb2xkIFwiYW1vdW50XCIgZmllbGQgbXVzdCBub3QgZXhpc3Qgb24gQmFsYW5jZVdpdGhkcmF3YWwnKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QoYncudHlwZV8sICdvbGQgXCJ0eXBlX1wiIGZpZWxkIG11c3Qgbm90IGV4aXN0IG9uIEJhbGFuY2VXaXRoZHJhd2FsJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgQkNTIGJ5dGVzIHRoYXQgZGVjb2RlIGJhY2sgdG8gRnVuZHNXaXRoZHJhd2FsIHdpdGggY29ycmVjdCBhbW91bnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkU3BvbnNvcmVkVHhXaXRoQWRkcmVzc0JhbGFuY2UoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgY29uc3QgZGVzZXJpYWxpemVkID0gU3VpVHJhbnNhY3Rpb24uZGVzZXJpYWxpemVTdWlUcmFuc2FjdGlvbihyYXdUeCk7XG4gICAgICBjb25zdCBpbnB1dHMgPSBkZXNlcmlhbGl6ZWQudHguaW5wdXRzIGFzIGFueVtdO1xuXG4gICAgICBjb25zdCBid0lucHV0ID0gaW5wdXRzLmZpbmQoXG4gICAgICAgIChpbnApID0+IGlucD8uQmFsYW5jZVdpdGhkcmF3YWwgIT09IHVuZGVmaW5lZCB8fCBpbnA/LnZhbHVlPy5CYWxhbmNlV2l0aGRyYXdhbCAhPT0gdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgc2hvdWxkLmV4aXN0KGJ3SW5wdXQsICdCYWxhbmNlV2l0aGRyYXdhbCBtdXN0IGJlIHByZXNlbnQgaW4gZGVzZXJpYWxpemVkIGlucHV0cycpO1xuXG4gICAgICBjb25zdCBidyA9IGJ3SW5wdXQuQmFsYW5jZVdpdGhkcmF3YWwgPz8gYndJbnB1dC52YWx1ZT8uQmFsYW5jZVdpdGhkcmF3YWw7XG5cbiAgICAgIC8vIEZ1bmRzV2l0aGRyYXdhbCBzdHJ1Y3R1cmUgKG5vdCBvbGQge2Ftb3VudCwgdHlwZV99KVxuICAgICAgc2hvdWxkLmV4aXN0KGJ3LnJlc2VydmF0aW9uLCAncmVzZXJ2YXRpb24gbXVzdCBzdXJ2aXZlIEJDUyByb3VuZC10cmlwJyk7XG4gICAgICBzaG91bGQuZXhpc3QoYncucmVzZXJ2YXRpb24uTWF4QW1vdW50VTY0LCAnTWF4QW1vdW50VTY0IG11c3Qgc3Vydml2ZSBCQ1Mgcm91bmQtdHJpcCcpO1xuICAgICAgYncucmVzZXJ2YXRpb24uTWF4QW1vdW50VTY0LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKEFNT1VOVCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChidy50eXBlQXJnLCAndHlwZUFyZyBtdXN0IHN1cnZpdmUgQkNTIHJvdW5kLXRyaXAnKTtcbiAgICAgIHNob3VsZC5leGlzdChidy50eXBlQXJnLkJhbGFuY2UsICd0eXBlQXJnLkJhbGFuY2UgbXVzdCBzdXJ2aXZlIEJDUyByb3VuZC10cmlwJyk7XG5cbiAgICAgIHNob3VsZC5leGlzdChidy53aXRoZHJhd0Zyb20sICd3aXRoZHJhd0Zyb20gbXVzdCBzdXJ2aXZlIEJDUyByb3VuZC10cmlwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNlcmlhbGl6ZSB0b0pzb24oKSB3aXRob3V0IGEgQmlnSW50IHJlcGxhY2VyIChubyBUeXBlRXJyb3IpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZFNwb25zb3JlZFR4V2l0aEFkZHJlc3NCYWxhbmNlKCk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KFxuICAgICAgICAoKSA9PiBKU09OLnN0cmluZ2lmeSh0eC50b0pzb24oKSksXG4gICAgICAgICdKU09OLnN0cmluZ2lmeSh0eC50b0pzb24oKSkgbXVzdCBub3QgdGhyb3cg4oCUIEJhbGFuY2VXaXRoZHJhd2FsIGFtb3VudCBtdXN0IG5vdCBiZSBzdG9yZWQgYXMgQmlnSW50J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJlc2VydmUgZnVuZHNJbkFkZHJlc3NCYWxhbmNlIGFtb3VudCB0aHJvdWdoIGZ1bGwgcm91bmQtdHJpcCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRTcG9uc29yZWRUeFdpdGhBZGRyZXNzQmFsYW5jZSgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCByZWJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcmVidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSBhd2FpdCByZWJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcblxuICAgICAgY29uc3Qgc3VpVHggPSByZWJ1aWx0VHggYXMgU3VpVHJhbnNhY3Rpb248VHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG4gICAgICBjb25zdCBpbnB1dHMgPSBzdWlUeC5zdWlUcmFuc2FjdGlvbi50eC5pbnB1dHMgYXMgYW55W107XG4gICAgICBjb25zdCBid0lucHV0ID0gaW5wdXRzLmZpbmQoXG4gICAgICAgIChpbnApID0+IGlucD8uQmFsYW5jZVdpdGhkcmF3YWwgIT09IHVuZGVmaW5lZCB8fCBpbnA/LnZhbHVlPy5CYWxhbmNlV2l0aGRyYXdhbCAhPT0gdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgc2hvdWxkLmV4aXN0KGJ3SW5wdXQpO1xuICAgICAgY29uc3QgYncgPSBid0lucHV0LkJhbGFuY2VXaXRoZHJhd2FsID8/IGJ3SW5wdXQudmFsdWU/LkJhbGFuY2VXaXRoZHJhd2FsO1xuICAgICAgYncucmVzZXJ2YXRpb24uTWF4QW1vdW50VTY0LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKEFNT1VOVCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGVuY29kZSBnYXMtZnJvbS1hZGRyZXNzLWJhbGFuY2UgKHNlbGYtcGF5LCBlbXB0eSBwYXltZW50KSB3aXRoIG5vIEZ1bmRzV2l0aGRyYXdhbCBpbnB1dCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFdoZW4gZ2FzRGF0YS5wYXltZW50PVtdIGFuZCBzZW5kZXI9PT1nYXNEYXRhLm93bmVyLCB0aGUgU3VpIHJ1bnRpbWUgYXV0b21hdGljYWxseVxuICAgICAgLy8gdXNlcyBhZGRyZXNzIGJhbGFuY2UgdG8gZnVuZCBib3RoIGdhcyBhbmQgdGhlIHRyYW5zZmVyIHZpYSBHYXNDb2luLlxuICAgICAgLy8gTm8gQmFsYW5jZVdpdGhkcmF3YWwgQ2FsbEFyZyBpcyBuZWVkZWQg4oCUIHRoZSBydW50aW1lIGhhbmRsZXMgaXQgaW1wbGljaXRseS5cbiAgICAgIGNvbnN0IHNlbGZQYXlOb1BheW1lbnQgPSB7IC4uLnRlc3REYXRhLmdhc0RhdGFXaXRob3V0R2FzUGF5bWVudCwgcGF5bWVudDogW10gfTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKFt7IGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcywgYW1vdW50OiBBTU9VTlQgfV0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoc2VsZlBheU5vUGF5bWVudCk7XG4gICAgICB0eEJ1aWxkZXIuZnVuZHNJbkFkZHJlc3NCYWxhbmNlKEFNT1VOVCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuXG4gICAgICBjb25zdCBzdWlUeCA9IHR4IGFzIFN1aVRyYW5zYWN0aW9uPFRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+O1xuXG4gICAgICAvLyBHYXMgb3duZXIgbXVzdCBlcXVhbCBzZW5kZXIgKHNlbGYtcGF5KVxuICAgICAgc3VpVHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5vd25lci5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgLy8gUGF5bWVudCBtdXN0IGJlIGVtcHR5IOKAlCBnYXMgZnVuZGVkIGZyb20gYWRkcmVzcyBiYWxhbmNlIGJ5IHRoZSBydW50aW1lXG4gICAgICBzdWlUeC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnBheW1lbnQubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgLy8gTm8gQmFsYW5jZVdpdGhkcmF3YWwgaW5wdXQg4oCUIHJ1bnRpbWUgaGFuZGxlcyBhZGRyZXNzIGJhbGFuY2UgYXV0b21hdGljYWxseVxuICAgICAgY29uc3QgaW5wdXRzID0gc3VpVHguc3VpVHJhbnNhY3Rpb24udHguaW5wdXRzIGFzIGFueVtdO1xuICAgICAgY29uc3QgYndJbnB1dCA9IGlucHV0cy5maW5kKFxuICAgICAgICAoaW5wKSA9PiBpbnA/LkJhbGFuY2VXaXRoZHJhd2FsICE9PSB1bmRlZmluZWQgfHwgaW5wPy52YWx1ZT8uQmFsYW5jZVdpdGhkcmF3YWwgIT09IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QoYndJbnB1dCwgJ3NlbGYtcGF5IG11c3QgTk9UIGhhdmUgYSBCYWxhbmNlV2l0aGRyYXdhbCBpbnB1dCDigJQgcnVudGltZSBoYW5kbGVzIGl0Jyk7XG5cbiAgICAgIC8vIEZpcnN0IGNvbW1hbmQgbXVzdCBiZSBTcGxpdENvaW5zKEdhc0NvaW4pIOKAlCBubyByZWRlZW1fZnVuZHMgbmVlZGVkXG4gICAgICBjb25zdCBjb21tYW5kcyA9IHN1aVR4LnN1aVRyYW5zYWN0aW9uLnR4LnRyYW5zYWN0aW9ucyBhcyBhbnlbXTtcbiAgICAgIGNvbW1hbmRzWzBdLmtpbmQuc2hvdWxkLmVxdWFsKCdTcGxpdENvaW5zJyk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgY29uc3QgZGVzZXJpYWxpemVkID0gU3VpVHJhbnNhY3Rpb24uZGVzZXJpYWxpemVTdWlUcmFuc2FjdGlvbihyYXdUeCk7XG4gICAgICBkZXNlcmlhbGl6ZWQuc2VuZGVyLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBkZXNlcmlhbGl6ZWQuZ2FzRGF0YS5vd25lci5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgZGVzZXJpYWxpemVkLmdhc0RhdGEucGF5bWVudC5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuXG4gICAgICAvLyBObyBGdW5kc1dpdGhkcmF3YWwgaW4gZGVjb2RlZCBpbnB1dHMg4oCUIG9ubHkgUHVyZSBhcmdzXG4gICAgICBjb25zdCBkZWNvZGVkSW5wdXRzID0gZGVzZXJpYWxpemVkLnR4LmlucHV0cyBhcyBhbnlbXTtcbiAgICAgIGRlY29kZWRJbnB1dHNcbiAgICAgICAgLmV2ZXJ5KChpbnA6IGFueSkgPT4gaW5wPy5CYWxhbmNlV2l0aGRyYXdhbCA9PT0gdW5kZWZpbmVkICYmIGlucD8udmFsdWU/LkJhbGFuY2VXaXRoZHJhd2FsID09PSB1bmRlZmluZWQpXG4gICAgICAgIC5zaG91bGQuYmUudHJ1ZSgnZGVjb2RlZCBpbnB1dHMgbXVzdCBjb250YWluIG5vIEZ1bmRzV2l0aGRyYXdhbCBmb3Igc2VsZi1wYXkgcGF0aCcpO1xuXG4gICAgICBjb25zdCByZWJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcmVidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSBhd2FpdCByZWJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHJlYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGVuY29kZSBnYXMtZnJvbS1hZGRyZXNzLWJhbGFuY2Ugd2l0aCBWYWxpZER1cmluZyBleHBpcmF0aW9uIChzZWxmLXBheSwgZW1wdHkgcGF5bWVudCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBXaGVuIGdhc0RhdGEucGF5bWVudD1bXSB0aGUgU3VpIG5vZGUgcmVxdWlyZXMgYSBWYWxpZER1cmluZyBleHBpcmF0aW9uIHRvIHByZXZlbnRcbiAgICAgIC8vIHJlcGxheSBhdHRhY2tzLiBHYXMgYW5kIHRyYW5zZmVyIGFyZSBib3RoIGZ1bmRlZCBmcm9tIGFkZHJlc3MgYmFsYW5jZSB2aWEgR2FzQ29pbi5cbiAgICAgIGNvbnN0IEdFTkVTSVNfQ0hBSU5fSUQgPSAnR0FGcENDY1JDeFRkRmZVRU1iUWJrTEJhWnkyUk5pR0FmdkZCaE1OcHEya1QnO1xuICAgICAgY29uc3Qgc2VsZlBheU5vUGF5bWVudCA9IHsgLi4udGVzdERhdGEuZ2FzRGF0YVdpdGhvdXRHYXNQYXltZW50LCBwYXltZW50OiBbXSB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoW3sgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLCBhbW91bnQ6IEFNT1VOVCB9XSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShzZWxmUGF5Tm9QYXltZW50KTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoQU1PVU5UKTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKHtcbiAgICAgICAgVmFsaWREdXJpbmc6IHtcbiAgICAgICAgICBtaW5FcG9jaDogeyBTb21lOiA1MDAgfSxcbiAgICAgICAgICBtYXhFcG9jaDogeyBTb21lOiA1MDEgfSxcbiAgICAgICAgICBtaW5UaW1lc3RhbXA6IHsgTm9uZTogbnVsbCB9LFxuICAgICAgICAgIG1heFRpbWVzdGFtcDogeyBOb25lOiBudWxsIH0sXG4gICAgICAgICAgY2hhaW46IEdFTkVTSVNfQ0hBSU5fSUQsXG4gICAgICAgICAgbm9uY2U6IDB4ZGVhZGJlZWYsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIGNvbnN0IHN1aVR4ID0gdHggYXMgU3VpVHJhbnNhY3Rpb248VHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG5cbiAgICAgIC8vIFNlbGYtcGF5OiBvd25lciA9PT0gc2VuZGVyLCBwYXltZW50IGVtcHR5XG4gICAgICBzdWlUeC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLm93bmVyLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBzdWlUeC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnBheW1lbnQubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgLy8gTm8gQmFsYW5jZVdpdGhkcmF3YWwgaW5wdXQg4oCUIHJ1bnRpbWUgaGFuZGxlcyBHYXNDb2luIGZyb20gYWRkcmVzcyBiYWxhbmNlXG4gICAgICBjb25zdCBpbnB1dHMgPSBzdWlUeC5zdWlUcmFuc2FjdGlvbi50eC5pbnB1dHMgYXMgYW55W107XG4gICAgICBjb25zdCBid0lucHV0ID0gaW5wdXRzLmZpbmQoXG4gICAgICAgIChpbnApID0+IGlucD8uQmFsYW5jZVdpdGhkcmF3YWwgIT09IHVuZGVmaW5lZCB8fCBpbnA/LnZhbHVlPy5CYWxhbmNlV2l0aGRyYXdhbCAhPT0gdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdChid0lucHV0LCAnc2VsZi1wYXkgbXVzdCBOT1QgaGF2ZSBhIEJhbGFuY2VXaXRoZHJhd2FsIGlucHV0Jyk7XG5cbiAgICAgIC8vIEZpcnN0IGNvbW1hbmQ6IFNwbGl0Q29pbnMoR2FzQ29pbikg4oCUIG5vIHJlZGVlbV9mdW5kcyBmb3Igc2VsZi1wYXlcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gc3VpVHguc3VpVHJhbnNhY3Rpb24udHgudHJhbnNhY3Rpb25zIGFzIGFueVtdO1xuICAgICAgY29tbWFuZHNbMF0ua2luZC5zaG91bGQuZXF1YWwoJ1NwbGl0Q29pbnMnKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuXG4gICAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSBTdWlUcmFuc2FjdGlvbi5kZXNlcmlhbGl6ZVN1aVRyYW5zYWN0aW9uKHJhd1R4KTtcbiAgICAgIGRlc2VyaWFsaXplZC5zZW5kZXIuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGRlc2VyaWFsaXplZC5nYXNEYXRhLnBheW1lbnQubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IChkZXNlcmlhbGl6ZWQuZXhwaXJhdGlvbiBhcyBhbnkpPy5WYWxpZER1cmluZztcbiAgICAgIHNob3VsZC5leGlzdChleHBpcmF0aW9uLCAnVmFsaWREdXJpbmcgZXhwaXJhdGlvbiBtdXN0IHN1cnZpdmUgQkNTIHJvdW5kLXRyaXAnKTtcbiAgICAgIE51bWJlcihleHBpcmF0aW9uLm1pbkVwb2NoPy5Tb21lID8/IGV4cGlyYXRpb24ubWluRXBvY2gpLnNob3VsZC5lcXVhbCg1MDApO1xuICAgICAgTnVtYmVyKGV4cGlyYXRpb24ubWF4RXBvY2g/LlNvbWUgPz8gZXhwaXJhdGlvbi5tYXhFcG9jaCkuc2hvdWxkLmVxdWFsKDUwMSk7XG4gICAgICBleHBpcmF0aW9uLmNoYWluLnNob3VsZC5lcXVhbChHRU5FU0lTX0NIQUlOX0lEKTtcbiAgICAgIE51bWJlcihleHBpcmF0aW9uLm5vbmNlKS5zaG91bGQuZXF1YWwoMHhkZWFkYmVlZik7XG5cbiAgICAgIC8vIElucHV0cyBtdXN0IGNvbnRhaW4gbm8gRnVuZHNXaXRoZHJhd2FsIOKAlCBvbmx5IFB1cmUgYXJnc1xuICAgICAgY29uc3QgZGVjb2RlZElucHV0cyA9IGRlc2VyaWFsaXplZC50eC5pbnB1dHMgYXMgYW55W107XG4gICAgICBkZWNvZGVkSW5wdXRzXG4gICAgICAgIC5ldmVyeSgoaW5wOiBhbnkpID0+IGlucD8uQmFsYW5jZVdpdGhkcmF3YWwgPT09IHVuZGVmaW5lZCAmJiBpbnA/LnZhbHVlPy5CYWxhbmNlV2l0aGRyYXdhbCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAuc2hvdWxkLmJlLnRydWUoJ2RlY29kZWQgaW5wdXRzIG11c3QgY29udGFpbiBubyBGdW5kc1dpdGhkcmF3YWwgZm9yIHNlbGYtcGF5IHBhdGgnKTtcblxuICAgICAgY29uc3QgcmVidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIHJlYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsZGVyLmJ1aWxkKCk7XG4gICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgY29ycmVjdGx5IGRlY29kZSBhIE1vdmVDYWxsIHRvIDB4Mjo6Y29pbjo6cmVkZWVtX2Z1bmRzIHdpdGggQmFsYW5jZVdpdGhkcmF3YWwgYXJnJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZFNwb25zb3JlZFR4V2l0aEFkZHJlc3NCYWxhbmNlKCk7XG4gICAgICBjb25zdCBzdWlUeCA9IHR4IGFzIFN1aVRyYW5zYWN0aW9uPFRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+O1xuICAgICAgY29uc3QgY29tbWFuZHMgPSBzdWlUeC5zdWlUcmFuc2FjdGlvbi50eC50cmFuc2FjdGlvbnMgYXMgYW55W107XG5cbiAgICAgIGNvbW1hbmRzWzBdLmtpbmQuc2hvdWxkLmVxdWFsKCdNb3ZlQ2FsbCcpO1xuICAgICAgY29tbWFuZHNbMF0udGFyZ2V0LnNob3VsZC5lcXVhbCgnMHgyOjpjb2luOjpyZWRlZW1fZnVuZHMnKTtcbiAgICAgIGNvbW1hbmRzWzBdLnR5cGVBcmd1bWVudHNbMF0uc2hvdWxkLmVxdWFsKCcweDI6OnN1aTo6U1VJJyk7XG5cbiAgICAgIC8vIFRoZSBhcmd1bWVudCB0byByZWRlZW1fZnVuZHMgbXVzdCByZWZlcmVuY2UgdGhlIEJhbGFuY2VXaXRoZHJhd2FsIGlucHV0IChpbmRleCAwKVxuICAgICAgY29uc3QgYXJnID0gY29tbWFuZHNbMF0uYXJndW1lbnRzWzBdO1xuICAgICAgYXJnLmtpbmQuc2hvdWxkLmVxdWFsKCdJbnB1dCcpO1xuICAgICAgYXJnLmluZGV4LnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIGFyZy50eXBlLnNob3VsZC5lcXVhbCgnb2JqZWN0Jyk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
1055
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNERBQXlEO0FBQ3pELDhEQUFnRDtBQUNoRCxvREFBNEI7QUFDNUIsOENBQWtEO0FBQ2xELG1FQUEyQztBQUMzQyw4REFBNkU7QUFDN0Usa0RBQTZGO0FBQzdGLDBEQUErRTtBQUUvRSxRQUFRLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsRUFBRSxDQUFDLDRCQUE0QixFQUFFLEtBQUs7WUFDcEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDL0MsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1QyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLEVBQXNELENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFRLENB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QUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUUzRCxvRkFBb0Y7WUFDcEYsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVoQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc3VpJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiBhcyBTdWlUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgU3VpVHJhbnNhY3Rpb25UeXBlLCBUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5pbXBvcnQgeyBNQVhfQ09NTUFORF9BUkdTLCBNQVhfR0FTX09CSkVDVFMgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5cbmRlc2NyaWJlKCdTdWkgVHJhbnNmZXIgQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0c3VpJyk7XG5cbiAgZGVzY3JpYmUoJ1N1Y2NlZWQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICh0eCBhcyBTdWlUcmFuc2FjdGlvbjxUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPikuc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5wYXltZW50IS5zaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICB0ZXN0RGF0YS5jb2luc0dhc1BheW1lbnRcbiAgICAgICk7XG5cbiAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6ICh0ZXN0RGF0YS5BTU9VTlQgKiAyKS50b1N0cmluZygpLFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50LFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIHR4Lm91dHB1dHNbMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMV0uYWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHRlc3REYXRhLnJlY2lwaWVudHNbMV0uYW1vdW50LFxuICAgICAgICBjb2luOiAndHN1aScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuVFJBTlNGRVIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHNwb25zb3JlZCB0cmFuc2ZlciB0eCB3aXRoIGlucHV0T2JqZWN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0T2JqZWN0cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG9iamVjdElkOiAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1Njc4OTBhYmNkZWYxMjM0NTY3OCcsXG4gICAgICAgICAgdmVyc2lvbjogMTAwLFxuICAgICAgICAgIGRpZ2VzdDogJzJCOFhLUUo3bWZ4UVBVV3FKSkFHanpCQXppdmtXS3EyY0VhM1c4TEx6MXlCJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9iamVjdElkOiAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYWJjZGVmMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1Njc4OTBhYmNkZWYxMicsXG4gICAgICAgICAgdmVyc2lvbjogMjAwLFxuICAgICAgICAgIGRpZ2VzdDogJ0RvSndYdXo5b1U1WTV2NXZCUmlUZ2lzVlRRdVpRTG1IWldlcUp6ekQ1UVVFJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIC8vIENyZWF0ZSBnYXMgZGF0YSB3aXRoIGRpZmZlcmVudCBvd25lciAoc3BvbnNvcilcbiAgICAgIGNvbnN0IHNwb25zb3JlZEdhc0RhdGEgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGEsXG4gICAgICAgIG93bmVyOiB0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzLCAvLyBEaWZmZXJlbnQgZnJvbSBzZW5kZXJcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7IC8vIFNlbmRlclxuICAgICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShzcG9uc29yZWRHYXNEYXRhKTsgLy8gR2FzIHBhaWQgYnkgc3BvbnNvclxuICAgICAgdHhCdWlsZGVyLmlucHV0T2JqZWN0cyhpbnB1dE9iamVjdHMpOyAvLyBSZXF1aXJlZCBmb3Igc3BvbnNvcmVkIHR4XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuXG4gICAgICBjb25zdCBzdWlUeCA9IHR4IGFzIFN1aVRyYW5zYWN0aW9uPFRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+O1xuXG4gICAgICAvLyBWZXJpZnkgdHJhbnNhY3Rpb24gc3RydWN0dXJlIGZvciBzcG9uc29yZWQgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IHByb2dyYW1tYWJsZVR4ID0gc3VpVHguc3VpVHJhbnNhY3Rpb24udHg7XG4gICAgICBwcm9ncmFtbWFibGVUeC50cmFuc2FjdGlvbnMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcblxuICAgICAgLy8gVmVyaWZ5IHNwb25zb3JlZCB0cmFuc2FjdGlvbiBjaGFyYWN0ZXJpc3RpY3NcbiAgICAgIHN1aVR4LnN1aVRyYW5zYWN0aW9uLnNlbmRlci5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgc3VpVHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5vd25lci5zaG91bGQuZXF1YWwodGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG5cbiAgICAgIC8vIFNob3VsZCBoYXZlIHRyYW5zYWN0aW9ucyBmb3IgbWVyZ2luZy9zcGxpdHRpbmcgYW5kIHRyYW5zZmVycmluZyB3aGVuIHVzaW5nIGlucHV0T2JqZWN0c1xuICAgICAgcHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zLmxlbmd0aC5zaG91bGQuYmUuZ3JlYXRlclRoYW4oMCk7XG5cbiAgICAgIC8vIFZlcmlmeSB3ZSBoYXZlIHRyYW5zZmVyIG9wZXJhdGlvbnMgKHRoZSBleGFjdCBzdHJ1Y3R1cmUgdmFyaWVzIHdpdGggQVBJIHZlcnNpb25zKVxuICAgICAgc2hvdWxkLmV4aXN0KHByb2dyYW1tYWJsZVR4LnRyYW5zYWN0aW9ucyk7XG5cbiAgICAgIC8vIFZlcmlmeSBpbnB1dE9iamVjdHMgYXJlIG5vdCB1c2VkIGluIGdhcyBwYXltZW50ICh0aGV5J3JlIHNlcGFyYXRlKVxuICAgICAgc3VpVHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5wYXltZW50LnNob3VsZC5ub3QuY29udGFpbkRlZXAoaW5wdXRPYmplY3RzKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmV4aXN0KHJhd1R4KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eXBlb2YgcmF3VHgsICdzdHJpbmcnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzcGxpdCBjb2luIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IGFtb3VudCA9IDEwMDAwMDAwMDA7XG4gICAgICBjb25zdCByZWNpcGllbnRzID0gbmV3IEFycmF5KDEwMCkuZmlsbCh7IGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLCBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpIH0pO1xuICAgICAgdHhCdWlsZGVyLnNlbmQocmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgKHR4IGFzIFN1aVRyYW5zYWN0aW9uPFRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+KS5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnBheW1lbnQhLnNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgIHRlc3REYXRhLmNvaW5zR2FzUGF5bWVudFxuICAgICAgKTtcblxuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgICB2YWx1ZTogKGFtb3VudCAqIDEwMCkudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgfSk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMTAwKTtcbiAgICAgIHR4Lm91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PlxuICAgICAgICBvdXRwdXQuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsXG4gICAgICAgICAgdmFsdWU6IGFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc3BsaXQgY29pbiB0eCB3aXRoIG1vcmUgdGhhbiAyNTUgaW5wdXQgb2JqZWN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9IDEwMDAwMDAwMDA7XG4gICAgICBjb25zdCBudW1iZXJPZlJlY2lwaWVudHMgPSAxMDtcbiAgICAgIGNvbnN0IG51bWJlck9mUGF5bWVudE9iamVjdHMgPSAxMDAwO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gbmV3IEFycmF5KG51bWJlck9mUmVjaXBpZW50cykuZmlsbCh7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGdhc0RhdGEgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGEsXG4gICAgICAgIHBheW1lbnQ6IHRlc3REYXRhLmdlbmVyYXRlT2JqZWN0cyhudW1iZXJPZlBheW1lbnRPYmplY3RzKSxcbiAgICAgIH07XG5cbiAgICAgIHR4QnVpbGRlci5zZW5kKHJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoZ2FzRGF0YSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBhc3NlcnQodHggaW5zdGFuY2VvZiBTdWlUcmFuc2FjdGlvbik7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4LmlucHV0c1swXS5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiAoYW1vdW50ICogMTApLnRvU3RyaW5nKCksXG4gICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgIH0pO1xuICAgICAgdHgub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEwKTtcbiAgICAgIHR4Lm91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PlxuICAgICAgICBvdXRwdXQuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgICAgY29pbjogJ3RzdWknLFxuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzLFxuICAgICAgICAgIHZhbHVlOiBhbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0eC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLm93bmVyLnNob3VsZC5lcXVhbChnYXNEYXRhLm93bmVyKTtcbiAgICAgIHR4LnN1aVRyYW5zYWN0aW9uLmdhc0RhdGEucHJpY2Uuc2hvdWxkLmVxdWFsKGdhc0RhdGEucHJpY2UpO1xuICAgICAgdHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5idWRnZXQuc2hvdWxkLmVxdWFsKGdhc0RhdGEuYnVkZ2V0KTtcbiAgICAgIHR4LnN1aVRyYW5zYWN0aW9uLmdhc0RhdGEucGF5bWVudC5sZW5ndGguc2hvdWxkLmVxdWFsKE1BWF9HQVNfT0JKRUNUUyAtIDEpO1xuXG4gICAgICBjb25zdCBwcm9ncmFtbWFibGVUeCA9IHR4LnN1aVRyYW5zYWN0aW9uLnR4O1xuXG4gICAgICAvLyB0b3RhbCBvYmplY3RzIC0gb2JqZWN0cyBzZW50IGFzIGdhcyBwYXltZW50ICsgbm8uIG9mIHJlY2lwaWVudCBhbW91bnRzKHB1cmUpXG4gICAgICAvLyArIG5vLiBvZiB1bmlxdWUgcmVjaXBpZW50IGFkZHJlc3NlcyhkZS1kdXBlZCBvYmplY3RzKVxuICAgICAgcHJvZ3JhbW1hYmxlVHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoXG4gICAgICAgIG51bWJlck9mUGF5bWVudE9iamVjdHMgLSAoTUFYX0dBU19PQkpFQ1RTIC0gMSkgKyBudW1iZXJPZlJlY2lwaWVudHMgKyAxXG4gICAgICApO1xuICAgICAgcHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zWzBdLmtpbmQuc2hvdWxkLmVxdWFsKCdNZXJnZUNvaW5zJyk7XG4gICAgICBwcm9ncmFtbWFibGVUeC50cmFuc2FjdGlvbnNbMF0uc291cmNlcy5sZW5ndGguc2hvdWxkLmVxdWFsKE1BWF9DT01NQU5EX0FSR1MgLSAxKTtcbiAgICAgIHByb2dyYW1tYWJsZVR4LnRyYW5zYWN0aW9uc1sxXS5raW5kLnNob3VsZC5lcXVhbCgnTWVyZ2VDb2lucycpO1xuICAgICAgcHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zWzFdLnNvdXJjZXMubGVuZ3RoLnNob3VsZC5lcXVhbChcbiAgICAgICAgbnVtYmVyT2ZQYXltZW50T2JqZWN0cyAtIChNQVhfQ09NTUFORF9BUkdTIC0gMSkgLSAoTUFYX0dBU19PQkpFQ1RTIC0gMSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICAgIHJlYnVpbHRUeC50b0pzb24oKS5nYXNEYXRhLnBheW1lbnQubGVuZ3RoLnNob3VsZC5lcXVhbChudW1iZXJPZlBheW1lbnRPYmplY3RzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZhaWwnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIHNlbmRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuc2VuZGVyKCdyYW5kb21TdHJpbmcnKSkudGhyb3dFcnJvcignSW52YWxpZCBvciBtaXNzaW5nIHNlbmRlciwgZ290OiByYW5kb21TdHJpbmcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBwYXlUeCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuc2VuZChbdGVzdERhdGEuaW52YWxpZFJlY2lwaWVudHNbMF1dKSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgb3IgbWlzc2luZyBhZGRyZXNzLCBnb3Q6IHJhbmRvbVN0cmluZydcbiAgICAgICk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5zZW5kKFt0ZXN0RGF0YS5pbnZhbGlkUmVjaXBpZW50c1sxXV0pKS50aHJvd0Vycm9yKCdJbnZhbGlkIHJlY2lwaWVudCBhbW91bnQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBnYXNEYXRhJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmludmFsaWRHYXNPd25lcikpLnRocm93RXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGdhcyBhZGRyZXNzICR7dGVzdERhdGEuaW52YWxpZEdhc093bmVyLm93bmVyfWBcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGludmFsaWQgZ2FzQnVkZ2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmludmFsaWRHYXNCdWRnZXQpKS50aHJvd0Vycm9yKCdJbnZhbGlkIGdhcyBidWRnZXQgLTEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBnYXNQYXltZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBjb25zdCBpbnZhbGlkR2FzUGF5bWVudCA9IHtcbiAgICAgICAgLi4udGVzdERhdGEuZ2FzRGF0YVdpdGhvdXRHYXNQYXltZW50LFxuICAgICAgICBwYXltZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgb2JqZWN0SWQ6ICcnLFxuICAgICAgICAgICAgdmVyc2lvbjogLTEsXG4gICAgICAgICAgICBkaWdlc3Q6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuZ2FzRGF0YShpbnZhbGlkR2FzUGF5bWVudCkpLnRocm93RXJyb3IoJ0ludmFsaWQgcGF5bWVudCwgaW52YWxpZCBvciBtaXNzaW5nIHZlcnNpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBmb3IgaW52YWxpZCBpbnB1dE9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IGludmFsaWRJbnB1dE9iamVjdHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvYmplY3RJZDogJycsXG4gICAgICAgICAgdmVyc2lvbjogLTEsXG4gICAgICAgICAgZGlnZXN0OiAnJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5pbnB1dE9iamVjdHMoaW52YWxpZElucHV0T2JqZWN0cykpLnRocm93RXJyb3IoXG4gICAgICAgICdJbnZhbGlkIGlucHV0IG9iamVjdCwgaW52YWxpZCBvciBtaXNzaW5nIHZlcnNpb24nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB0cmFuc2ZlciB3aXRoIGRpZmZlcmVudCBnYXMgb3duZXIgYnV0IG5vIGlucHV0T2JqZWN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNwb25zb3JlZEdhc0RhdGEgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGEsXG4gICAgICAgIG93bmVyOiB0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzLCAvLyBEaWZmZXJlbnQgZnJvbSBzZW5kZXJcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7IC8vIFNlbmRlclxuICAgICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShzcG9uc29yZWRHYXNEYXRhKTsgLy8gR2FzIHBhaWQgYnkgc3BvbnNvclxuICAgICAgLy8gTm90ZTogTk9UIHByb3ZpZGluZyBpbnB1dE9iamVjdHMgLSBzaG91bGQgc3RpbGwgd29yayAoZmVlIHNwb25zb3JzaGlwIHdpdGhvdXQgY29pbiBzcG9uc29yc2hpcClcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIGNvbnN0IHN1aVR4ID0gdHggYXMgU3VpVHJhbnNhY3Rpb248VHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG4gICAgICBzaG91bGQubm90LmV4aXN0KHN1aVR4LnN1aVRyYW5zYWN0aW9uLmlucHV0T2JqZWN0cyk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXh0cmFjdCBpbnB1dE9iamVjdHMgZnJvbSB0cmFuc2FjdGlvbiBkYXRhIHZpYSB0b0pzb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnB1dE9iamVjdHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBvYmplY3RJZDogJzB4MTIzNDU2Nzg5MGFiY2RlZjEyMzQ1Njc4OTBhYmNkZWYxMjM0NTY3OCcsXG4gICAgICAgICAgdmVyc2lvbjogMTAwLFxuICAgICAgICAgIGRpZ2VzdDogJzJCOFhLUUo3bWZ4UVBVV3FKSkFHanpCQXppdmtXS3EyY0VhM1c4TEx6MXlCJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBzcG9uc29yZWRHYXNEYXRhID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhLFxuICAgICAgICBvd25lcjogdGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcywgLy8gRGlmZmVyZW50IGZyb20gc2VuZGVyXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShzcG9uc29yZWRHYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5pbnB1dE9iamVjdHMoaW5wdXRPYmplY3RzKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gVGVzdCB0aGF0IHRvSnNvbiBleHRyYWN0cyBpbnB1dE9iamVjdHMgZnJvbSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmVcbiAgICAgIGNvbnN0IHR4RGF0YSA9ICh0eCBhcyBhbnkpLnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmV4aXN0KHR4RGF0YS5pbnB1dE9iamVjdHMpO1xuXG4gICAgICAvLyBUaGUgdG9Kc29uIHNob3VsZCBleHRyYWN0IHRoZSBpbnB1dE9iamVjdHMgZnJvbSB0aGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlXG4gICAgICAvLyBUaGlzIHRlc3RzIG91ciBuZXcgZ2V0SW5wdXRPYmplY3RzRnJvbVR4IG1ldGhvZFxuICAgICAgc2hvdWxkLmV4aXN0KHR4RGF0YS5pbnB1dE9iamVjdHMpO1xuICAgICAgQXJyYXkuaXNBcnJheSh0eERhdGEuaW5wdXRPYmplY3RzKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmdW5kc0luQWRkcmVzc0JhbGFuY2UnLCAoKSA9PiB7XG4gICAgY29uc3QgRlVORFNfSU5fQUREUkVTU19CQUxBTkNFID0gJzUwMDAwMDAwMDAnOyAvLyA1IFNVSVxuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBQYXRoIDJiOiBzZWxmLXBheSwgYWRkcmVzcy1iYWxhbmNlIG9ubHkg4oCUIHVzZXMgd2l0aGRyYXdhbCtyZWRlZW1fZnVuZHMsIG5vdCBTcGxpdENvaW5zKEdhc0NvaW4pJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gUmVncmVzc2lvbiBmb3IgcHJvZHVjdGlvbiBJbnN1ZmZpY2llbnRDb2luQmFsYW5jZSBmYWlsdXJlcyBvbiBjb25zb2xpZGF0aW9uLlxuICAgICAgLy8gV2l0aCBwYXltZW50PVtdLCBHYXNDb2luIG9ubHkgaGFzIGdhcy1idWRnZXQtd29ydGggb2YgYmFsYW5jZSBmb3IgUFRCIG9wZXJhdGlvbnM7XG4gICAgICAvLyBTcGxpdENvaW5zKEdhc0NvaW4sIFtsYXJnZV9hbW91bnRdKSBhbHdheXMgZmFpbHMgYXQgY29tbWFuZCAwLlxuICAgICAgLy8gUGF0aCAyYiBtdXN0IHVzZSB3aXRoZHJhd2FsK3JlZGVlbV9mdW5kcyB0byBtYXRlcmlhbGlzZSB0aGUgYWRkcmVzcyBiYWxhbmNlIGFzIGFcbiAgICAgIC8vIGNvaW4gb2JqZWN0IGFuZCBzcGxpdCBmcm9tIHRoYXQgY29pbiBpbnN0ZWFkLlxuICAgICAgY29uc3QgZ2FzRGF0YU5vUGF5bWVudCA9IHtcbiAgICAgICAgLi4udGVzdERhdGEuZ2FzRGF0YVdpdGhvdXRHYXNQYXltZW50LFxuICAgICAgICBwYXltZW50OiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh0ZXN0RGF0YS5yZWNpcGllbnRzKTsgLy8gMiByZWNpcGllbnRzXG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShnYXNEYXRhTm9QYXltZW50KTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoRlVORFNfSU5fQUREUkVTU19CQUxBTkNFKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIGNvbnN0IHN1aVR4ID0gdHggYXMgU3VpVHJhbnNhY3Rpb248VHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG4gICAgICBzdWlUeC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnBheW1lbnQubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgLy8gUGF0aCAyYiBQVEIgY29tbWFuZCBzZXF1ZW5jZSAoMiByZWNpcGllbnRzKTpcbiAgICAgIC8vICAgMDogTW92ZUNhbGwocmVkZWVtX2Z1bmRzKSAgICAgICAgICDigJQgbWF0ZXJpYWxpc2UgYWRkckNvaW4gZnJvbSBhZGRyZXNzIGJhbGFuY2VcbiAgICAgIC8vICAgMTogU3BsaXRDb2lucyhhZGRyQ29pbiwgW2Ftb3VudDBdKSDigJQgc3BsaXQgZm9yIHJlY2lwaWVudCAwXG4gICAgICAvLyAgIDI6IFRyYW5zZmVyT2JqZWN0cyAgICAgICAgICAgICAgICAg4oCUIHNlbmQgdG8gcmVjaXBpZW50IDBcbiAgICAgIC8vICAgMzogU3BsaXRDb2lucyhhZGRyQ29pbiwgW2Ftb3VudDFdKSDigJQgc3BsaXQgZm9yIHJlY2lwaWVudCAxXG4gICAgICAvLyAgIDQ6IFRyYW5zZmVyT2JqZWN0cyAgICAgICAgICAgICAgICAg4oCUIHNlbmQgdG8gcmVjaXBpZW50IDFcbiAgICAgIC8vICAgNTogTWVyZ2VDb2lucyhHYXNDb2luLCBbYWRkckNvaW5dKSDigJQgZGVzdHJveSAwLWJhbGFuY2UgYWRkckNvaW47IGdhcyBmcm9tIGFjY3VtdWxhdG9yXG4gICAgICBjb25zdCBjbWRzID0gc3VpVHguc3VpVHJhbnNhY3Rpb24udHgudHJhbnNhY3Rpb25zIGFzIGFueVtdO1xuICAgICAgY21kc1swXS5raW5kLnNob3VsZC5lcXVhbCgnTW92ZUNhbGwnLCAnY29tbWFuZCAwIG11c3QgYmUgTW92ZUNhbGwocmVkZWVtX2Z1bmRzKScpO1xuICAgICAgY21kc1swXS50YXJnZXQuc2hvdWxkLmVxdWFsKCcweDI6OmNvaW46OnJlZGVlbV9mdW5kcycpO1xuICAgICAgY21kc1sxXS5raW5kLnNob3VsZC5lcXVhbCgnU3BsaXRDb2lucycsICdjb21tYW5kIDEgbXVzdCBiZSBTcGxpdENvaW5zKGFkZHJDb2luKScpO1xuICAgICAgY21kc1syXS5raW5kLnNob3VsZC5lcXVhbCgnVHJhbnNmZXJPYmplY3RzJywgJ2NvbW1hbmQgMiBtdXN0IGJlIFRyYW5zZmVyT2JqZWN0cycpO1xuICAgICAgY21kc1szXS5raW5kLnNob3VsZC5lcXVhbCgnU3BsaXRDb2lucycsICdjb21tYW5kIDMgbXVzdCBiZSBTcGxpdENvaW5zKGFkZHJDb2luKScpO1xuICAgICAgY21kc1s0XS5raW5kLnNob3VsZC5lcXVhbCgnVHJhbnNmZXJPYmplY3RzJywgJ2NvbW1hbmQgNCBtdXN0IGJlIFRyYW5zZmVyT2JqZWN0cycpO1xuICAgICAgY21kc1s1XS5raW5kLnNob3VsZC5lcXVhbCgnTWVyZ2VDb2lucycsICdjb21tYW5kIDUgbXVzdCBiZSBNZXJnZUNvaW5zKEdhc0NvaW4sIFthZGRyQ29pbl0pJyk7XG4gICAgICBjbWRzLmxlbmd0aC5zaG91bGQuZXF1YWwoNik7XG5cbiAgICAgIHN1aVR4LnN1aVRyYW5zYWN0aW9uLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZSEuc2hvdWxkLmVxdWFsKEZVTkRTX0lOX0FERFJFU1NfQkFMQU5DRSk7XG5cbiAgICAgIC8vIFRyYW5zYWN0aW9uIHBhcnNlciBtdXN0IGNvcnJlY3RseSBpZGVudGlmeSByZWNpcGllbnRzIGRlc3BpdGUgdGhlIE1vdmVDYWxsIHByZWFtYmxlXG4gICAgICBjb25zdCBwYXJzZWRSZWNpcGllbnRzID0gdXRpbHMuZ2V0UmVjaXBpZW50cyhzdWlUeC5zdWlUcmFuc2FjdGlvbik7XG4gICAgICBwYXJzZWRSZWNpcGllbnRzLmxlbmd0aC5zaG91bGQuZXF1YWwodGVzdERhdGEucmVjaXBpZW50cy5sZW5ndGgpO1xuICAgICAgcGFyc2VkUmVjaXBpZW50c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MpO1xuICAgICAgcGFyc2VkUmVjaXBpZW50c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYW1vdW50KTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuXG4gICAgICAvLyBSb3VuZC10cmlwOiByZWJ1aWx0IHRyYW5zYWN0aW9uIG11c3QgYmUgYml0LWZvci1iaXQgaWRlbnRpY2FsXG4gICAgICBjb25zdCByZWJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcmVidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSBhd2FpdCByZWJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHJlYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIFBhdGggMmIgd2l0aCBhIHNpbmdsZSByZWNpcGllbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBTRU5EX0FNT1VOVCA9ICcxMjc1MTcwOTkzNzEwJzsgLy8gcmVhbGlzdGljIGNvbnNvbGlkYXRpb24gYW1vdW50ICh+MTI3NSBTVUkpXG4gICAgICBjb25zdCBBRERSX0JBTCA9ICcxMjc1MTc3NTQwOTEwJzsgLy8gZnVuZHNJbkFkZHJlc3NCYWxhbmNlID4gU0VORF9BTU9VTlQgKyBnYXMgYnVkZ2V0XG4gICAgICBjb25zdCBnYXNEYXRhTm9QYXltZW50ID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhV2l0aG91dEdhc1BheW1lbnQsXG4gICAgICAgIHBheW1lbnQ6IFtdLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKFt7IGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcywgYW1vdW50OiBTRU5EX0FNT1VOVCB9XSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShnYXNEYXRhTm9QYXltZW50KTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoQUREUl9CQUwpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcblxuICAgICAgY29uc3Qgc3VpVHggPSB0eCBhcyBTdWlUcmFuc2FjdGlvbjxUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPjtcbiAgICAgIGNvbnN0IGNtZHMgPSBzdWlUeC5zdWlUcmFuc2FjdGlvbi50eC50cmFuc2FjdGlvbnMgYXMgYW55W107XG5cbiAgICAgIC8vIENvbW1hbmQgc2VxdWVuY2UgZm9yIDEgcmVjaXBpZW50OlxuICAgICAgLy8gICAwOiBNb3ZlQ2FsbChyZWRlZW1fZnVuZHMpXG4gICAgICAvLyAgIDE6IFNwbGl0Q29pbnMoYWRkckNvaW4sIFtTRU5EX0FNT1VOVF0pXG4gICAgICAvLyAgIDI6IFRyYW5zZmVyT2JqZWN0c1xuICAgICAgLy8gICAzOiBNZXJnZUNvaW5zKEdhc0NvaW4sIFthZGRyQ29pbl0pXG4gICAgICBjbWRzWzBdLmtpbmQuc2hvdWxkLmVxdWFsKCdNb3ZlQ2FsbCcpO1xuICAgICAgY21kc1swXS50YXJnZXQuc2hvdWxkLmVxdWFsKCcweDI6OmNvaW46OnJlZGVlbV9mdW5kcycpO1xuICAgICAgY21kc1sxXS5raW5kLnNob3VsZC5lcXVhbCgnU3BsaXRDb2lucycpO1xuICAgICAgY21kc1syXS5raW5kLnNob3VsZC5lcXVhbCgnVHJhbnNmZXJPYmplY3RzJyk7XG4gICAgICBjbWRzWzNdLmtpbmQuc2hvdWxkLmVxdWFsKCdNZXJnZUNvaW5zJywgJ2V4cGVjdGVkIE1lcmdlQ29pbnMgdG8gY29uc3VtZSAwLWJhbGFuY2UgYWRkckNvaW4nKTtcbiAgICAgIGNtZHMubGVuZ3RoLnNob3VsZC5lcXVhbCg0KTtcblxuICAgICAgY29uc3QgcGFyc2VkUmVjaXBpZW50cyA9IHV0aWxzLmdldFJlY2lwaWVudHMoc3VpVHguc3VpVHJhbnNhY3Rpb24pO1xuICAgICAgcGFyc2VkUmVjaXBpZW50cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgcGFyc2VkUmVjaXBpZW50c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MpO1xuICAgICAgcGFyc2VkUmVjaXBpZW50c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKFNFTkRfQU1PVU5UKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuXG4gICAgICBjb25zdCByZWJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcmVidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSBhd2FpdCByZWJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHJlYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIFBhdGggMmIgd2l0aCBWYWxpZER1cmluZyBleHBpcmF0aW9uIChwcm9kdWN0aW9uIGNvbnNvbGlkYXRpb24gc2NlbmFyaW8pJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gTWlycm9ycyB0aGUgcmVhbCBvbi1jaGFpbiBjb25zb2xpZGF0aW9uIHRoYXQgZmFpbGVkOiBhZGRyZXNzIGluZGV4IDEwLCB3YWxsZXRcbiAgICAgIC8vIDY3ZmUzZjE1Li4uLCB0eGlkIEpEYm55Ym90ZzNheGZqdEI1M0xyblYxWXR2R0xGQlZHOG8yWHo1eFgxbTZaLlxuICAgICAgLy8gVGhlIHJlY292ZXIoKSBjb2RlIHNldHMgVmFsaWREdXJpbmcgd2hlbiBjb2luT2JqZWN0c0JhbGFuY2U9MCBhbmRcbiAgICAgIC8vIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZT4wIChDYXNlIDIpLiBUaGlzIHRlc3QgdmVyaWZpZXMgYm90aCB0aGUgZXhwaXJhdGlvbiBzdXJ2aXZlc1xuICAgICAgLy8gc2VyaWFsaXphdGlvbiBhbmQgdGhlIFBUQiB1c2VzIFBhdGggMmIgKG5vdCB0aGUgYnJva2VuIFNwbGl0Q29pbnMoR2FzQ29pbikgcGF0aCkuXG4gICAgICBjb25zdCBHRU5FU0lTX0NIQUlOX0lEID0gJ0dBRnBDQ2NSQ3hUZEZmVUVNYlFia0xCYVp5MlJOaUdBZnZGQmhNTnBxMmtUJztcbiAgICAgIGNvbnN0IFNFTkRfQU1PVU5UID0gJzEyNzUxNzA5OTM3MTAnO1xuICAgICAgY29uc3QgQUREUl9CQUwgPSAnMTI3NTE3NzU0MDkxMCc7XG4gICAgICBjb25zdCBnYXNEYXRhTm9QYXltZW50ID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhV2l0aG91dEdhc1BheW1lbnQsXG4gICAgICAgIHBheW1lbnQ6IFtdLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKFt7IGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcywgYW1vdW50OiBTRU5EX0FNT1VOVCB9XSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShnYXNEYXRhTm9QYXltZW50KTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoQUREUl9CQUwpO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb24oe1xuICAgICAgICBWYWxpZER1cmluZzoge1xuICAgICAgICAgIG1pbkVwb2NoOiB7IFNvbWU6IDExNTYgfSxcbiAgICAgICAgICBtYXhFcG9jaDogeyBTb21lOiAxMTU3IH0sXG4gICAgICAgICAgbWluVGltZXN0YW1wOiB7IE5vbmU6IG51bGwgfSxcbiAgICAgICAgICBtYXhUaW1lc3RhbXA6IHsgTm9uZTogbnVsbCB9LFxuICAgICAgICAgIGNoYWluOiBHRU5FU0lTX0NIQUlOX0lELFxuICAgICAgICAgIG5vbmNlOiAxMjM0NTY3OCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcblxuICAgICAgY29uc3Qgc3VpVHggPSB0eCBhcyBTdWlUcmFuc2FjdGlvbjxUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPjtcbiAgICAgIHN1aVR4LnN1aVRyYW5zYWN0aW9uLmdhc0RhdGEucGF5bWVudC5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuXG4gICAgICAvLyBNdXN0IHVzZSBQYXRoIDJiIChNb3ZlQ2FsbCBmaXJzdCksIG5ldmVyIFNwbGl0Q29pbnMoR2FzQ29pbikgZmlyc3RcbiAgICAgIGNvbnN0IGNtZHMgPSBzdWlUeC5zdWlUcmFuc2FjdGlvbi50eC50cmFuc2FjdGlvbnMgYXMgYW55W107XG4gICAgICBjbWRzWzBdLmtpbmQuc2hvdWxkLmVxdWFsKCdNb3ZlQ2FsbCcsICdQYXRoIDJiIG11c3Qgc3RhcnQgd2l0aCBNb3ZlQ2FsbChyZWRlZW1fZnVuZHMpLCBub3QgU3BsaXRDb2lucyhHYXNDb2luKScpO1xuICAgICAgY21kc1swXS50YXJnZXQuc2hvdWxkLmVxdWFsKCcweDI6OmNvaW46OnJlZGVlbV9mdW5kcycpO1xuICAgICAgY21kc1tjbWRzLmxlbmd0aCAtIDFdLmtpbmQuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnTWVyZ2VDb2lucycsXG4gICAgICAgICdQYXRoIDJiIG11c3QgZW5kIHdpdGggTWVyZ2VDb2lucyB0byBkZXN0cm95IDAtYmFsYW5jZSBhZGRyQ29pbidcbiAgICAgICk7XG5cbiAgICAgIC8vIFZhbGlkRHVyaW5nIGV4cGlyYXRpb24gbXVzdCBzdXJ2aXZlIEJDUyByb3VuZC10cmlwXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG5cbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcblxuICAgICAgY29uc3QgZXhwaXJhdGlvbiA9IChyZWJ1aWx0VHgudG9Kc29uKCkuZXhwaXJhdGlvbiBhcyBhbnkpPy5WYWxpZER1cmluZztcbiAgICAgIHNob3VsZC5leGlzdChleHBpcmF0aW9uLCAnVmFsaWREdXJpbmcgZXhwaXJhdGlvbiBtdXN0IHN1cnZpdmUgcm91bmQtdHJpcCcpO1xuICAgICAgTnVtYmVyKGV4cGlyYXRpb24ubWluRXBvY2guU29tZSkuc2hvdWxkLmVxdWFsKDExNTYpO1xuICAgICAgTnVtYmVyKGV4cGlyYXRpb24ubWF4RXBvY2guU29tZSkuc2hvdWxkLmVxdWFsKDExNTcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHNlbGYtcGF5IHRyYW5zZmVyIHdpdGggY29pbiBvYmplY3RzICsgYWRkcmVzcyBiYWxhbmNlIChQYXRoIDJjKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgQ09JTlMtMzMxOiB3aGVuIGJvdGggZ2FzRGF0YS5wYXltZW50IChjb2luIG9iamVjdHMpIGFuZFxuICAgICAgLy8gZnVuZHNJbkFkZHJlc3NCYWxhbmNlIGFyZSBzZXQsIFN1aSBkb2VzIE5PVCBhdXRvbWF0aWNhbGx5IG1lcmdlIGFkZHJlc3MgYmFsYW5jZSBpbnRvXG4gICAgICAvLyB0aGUgZ2FzIGNvaW4uICBQYXRoIDJjIG11c3QgZXhwbGljaXRseSBjYWxsIHJlZGVlbV9mdW5kcyArIE1lcmdlQ29pbnMoZ2FzLCBbYWRkckNvaW5dKVxuICAgICAgLy8gYmVmb3JlIFNwbGl0Q29pbnMgc28gdGhhdCB0aGUgZ2FzIGNvaW4gaG9sZHMgdGhlIGZ1bGwgc3BlbmRhYmxlIGFtb3VudC5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpOyAvLyBub24tZW1wdHkgcGF5bWVudCDigJQgdHJpZ2dlcnMgUGF0aCAyY1xuICAgICAgdHhCdWlsZGVyLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZShGVU5EU19JTl9BRERSRVNTX0JBTEFOQ0UpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcblxuICAgICAgY29uc3Qgc3VpVHggPSB0eCBhcyBTdWlUcmFuc2FjdGlvbjxUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPjtcblxuICAgICAgLy8gUGF0aCAyYyBQVEIgY29tbWFuZCBzZXF1ZW5jZSAoZm9yIDIgcmVjaXBpZW50cyk6XG4gICAgICAvLyAgIDA6IE1vdmVDYWxsKHJlZGVlbV9mdW5kcykgICAgIOKAlCBtYXRlcmlhbGl6ZSBhZGRyQ29pbiBmcm9tIGFkZHJlc3MgYmFsYW5jZVxuICAgICAgLy8gICAxOiBNZXJnZUNvaW5zKGdhcywgW2FkZHJDb2luXSnigJQgZ2FzIGNvaW4gPSBjb2luT2JqZWN0cyArIGFkZHJCYWwgKGZ1bGwgc3BlbmRhYmxlIGFtb3VudClcbiAgICAgIC8vICAgMjogU3BsaXRDb2lucyhnYXMpICAgICAgICAgICAg4oCUIHNwbGl0IGZvciByZWNpcGllbnQgMFxuICAgICAgLy8gICAzOiBUcmFuc2Zlck9iamVjdHMgICAgICAgICAgICDigJQgc2VuZCB0byByZWNpcGllbnQgMFxuICAgICAgLy8gICA0OiBTcGxpdENvaW5zKGdhcykgICAgICAgICAgICDigJQgc3BsaXQgZm9yIHJlY2lwaWVudCAxXG4gICAgICAvLyAgIDU6IFRyYW5zZmVyT2JqZWN0cyAgICAgICAgICAgIOKAlCBzZW5kIHRvIHJlY2lwaWVudCAxXG4gICAgICBjb25zdCBwcm9ncmFtbWFibGVUeCA9IHN1aVR4LnN1aVRyYW5zYWN0aW9uLnR4O1xuICAgICAgY29uc3QgY21kcyA9IHByb2dyYW1tYWJsZVR4LnRyYW5zYWN0aW9ucyBhcyBhbnlbXTtcbiAgICAgIGNtZHNbMF0ua2luZC5zaG91bGQuZXF1YWwoJ01vdmVDYWxsJywgJ2NvbW1hbmQgMCBtdXN0IGJlIE1vdmVDYWxsKHJlZGVlbV9mdW5kcyknKTtcbiAgICAgIGNtZHNbMF0udGFyZ2V0LnNob3VsZC5lcXVhbCgnMHgyOjpjb2luOjpyZWRlZW1fZnVuZHMnKTtcbiAgICAgIGNtZHNbMV0ua2luZC5zaG91bGQuZXF1YWwoJ01lcmdlQ29pbnMnLCAnY29tbWFuZCAxIG11c3QgYmUgTWVyZ2VDb2lucyhnYXMsIFthZGRyQ29pbl0pJyk7XG4gICAgICBjbWRzWzJdLmtpbmQuc2hvdWxkLmVxdWFsKCdTcGxpdENvaW5zJywgJ2NvbW1hbmQgMiBtdXN0IGJlIFNwbGl0Q29pbnMoZ2FzLCBbYW1vdW50MF0pJyk7XG4gICAgICBjbWRzWzNdLmtpbmQuc2hvdWxkLmVxdWFsKCdUcmFuc2Zlck9iamVjdHMnKTtcbiAgICAgIGNtZHNbNF0ua2luZC5zaG91bGQuZXF1YWwoJ1NwbGl0Q29pbnMnLCAnY29tbWFuZCA0IG11c3QgYmUgU3BsaXRDb2lucyhnYXMsIFthbW91bnQxXSknKTtcbiAgICAgIGNtZHNbNV0ua2luZC5zaG91bGQuZXF1YWwoJ1RyYW5zZmVyT2JqZWN0cycpO1xuXG4gICAgICAvLyBmdW5kc0luQWRkcmVzc0JhbGFuY2UgbXVzdCBiZSBwZXJzaXN0ZWQgaW4gdGhlIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb25cbiAgICAgIHN1aVR4LnN1aVRyYW5zYWN0aW9uLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZSEuc2hvdWxkLmVxdWFsKEZVTkRTX0lOX0FERFJFU1NfQkFMQU5DRSk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgLy8gUm91bmQtdHJpcDogcmVidWlsdCB0cmFuc2FjdGlvbiBtdXN0IGJlIGJpdC1mb3ItYml0IGlkZW50aWNhbFxuICAgICAgY29uc3QgcmVidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIHJlYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsZGVyLmJ1aWxkKCk7XG4gICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHNwb25zb3JlZCB0cmFuc2ZlciB3aXRoIGNvaW4gb2JqZWN0cyArIGFkZHJlc3MgYmFsYW5jZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0T2JqZWN0cyA9IHRlc3REYXRhLmdlbmVyYXRlT2JqZWN0cygyKTtcbiAgICAgIGNvbnN0IHNwb25zb3JlZEdhc0RhdGEgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGEsXG4gICAgICAgIG93bmVyOiB0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoc3BvbnNvcmVkR2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuaW5wdXRPYmplY3RzKGlucHV0T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZnVuZHNJbkFkZHJlc3NCYWxhbmNlKEZVTkRTX0lOX0FERFJFU1NfQkFMQU5DRSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuXG4gICAgICBjb25zdCBzdWlUeCA9IHR4IGFzIFN1aVRyYW5zYWN0aW9uPFRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+O1xuICAgICAgc3VpVHguc3VpVHJhbnNhY3Rpb24uZ2FzRGF0YS5vd25lci5zaG91bGQuZXF1YWwodGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyk7XG5cbiAgICAgIC8vIFNwb25zb3JlZCBwYXRoOiBNb3ZlQ2FsbChyZWRlZW1fZnVuZHMpICsgTWVyZ2VDb2lucyArIFNwbGl0Q29pbnNcbiAgICAgIGNvbnN0IHByb2dyYW1tYWJsZVR4ID0gc3VpVHguc3VpVHJhbnNhY3Rpb24udHg7XG4gICAgICAocHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zWzBdIGFzIGFueSkua2luZC5zaG91bGQuZXF1YWwoJ01vdmVDYWxsJyk7XG4gICAgICAocHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zWzBdIGFzIGFueSkudGFyZ2V0LnNob3VsZC5lcXVhbCgnMHgyOjpjb2luOjpyZWRlZW1fZnVuZHMnKTtcbiAgICAgIChwcm9ncmFtbWFibGVUeC50cmFuc2FjdGlvbnNbMV0gYXMgYW55KS5raW5kLnNob3VsZC5lcXVhbCgnTWVyZ2VDb2lucycpO1xuICAgICAgKHByb2dyYW1tYWJsZVR4LnRyYW5zYWN0aW9uc1syXSBhcyBhbnkpLmtpbmQuc2hvdWxkLmVxdWFsKCdTcGxpdENvaW5zJyk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgLy8gUm91bmQtdHJpcFxuICAgICAgY29uc3QgcmVidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIHJlYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsZGVyLmJ1aWxkKCk7XG4gICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHNwb25zb3JlZCB0cmFuc2ZlciB3aXRoIGFkZHJlc3MgYmFsYW5jZSBvbmx5IChubyBjb2luIGlucHV0T2JqZWN0cyknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzcG9uc29yZWRHYXNEYXRhID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhLFxuICAgICAgICBvd25lcjogdGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHNwb25zb3JlZEdhc0RhdGEpO1xuICAgICAgdHhCdWlsZGVyLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZShGVU5EU19JTl9BRERSRVNTX0JBTEFOQ0UpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcblxuICAgICAgLy8gUGF0aCAxYjogd2l0aGRyYXdhbCDihpIgcmVkZWVtX2Z1bmRzIOKGkiBTcGxpdENvaW5zKGFkZHJDb2luKSDihpIgVHJhbnNmZXJPYmplY3RzXG4gICAgICAvLyBTcG9uc29yJ3MgZ2FzIGNvaW5zIHJlbWFpbiBpbiBnYXNEYXRhLnBheW1lbnQ7IHR4LmdhcyBpcyBOT1QgdXNlZCBmb3IgdGhlIHRyYW5zZmVyIGFtb3VudC5cbiAgICAgIGNvbnN0IHN1aVR4ID0gdHggYXMgU3VpVHJhbnNhY3Rpb248VHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG4gICAgICBzdWlUeC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLm93bmVyLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgIGNvbnN0IHByb2dyYW1tYWJsZVR4ID0gc3VpVHguc3VpVHJhbnNhY3Rpb24udHg7XG4gICAgICAocHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zWzBdIGFzIGFueSkua2luZC5zaG91bGQuZXF1YWwoJ01vdmVDYWxsJyk7XG4gICAgICAocHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zWzBdIGFzIGFueSkudGFyZ2V0LnNob3VsZC5lcXVhbCgnMHgyOjpjb2luOjpyZWRlZW1fZnVuZHMnKTtcbiAgICAgIChwcm9ncmFtbWFibGVUeC50cmFuc2FjdGlvbnNbMV0gYXMgYW55KS5raW5kLnNob3VsZC5lcXVhbCgnU3BsaXRDb2lucycpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG5cbiAgICAgIC8vIFJvdW5kLXRyaXA6IHJlYnVpbGQgZnJvbSByYXdcbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgUGF0aCAxYiBzZW5kLWFsbDogc3BvbnNvcmVkIGFkZHItYmFsYW5jZS1vbmx5LCBubyBjaGFuZ2UgKE1lcmdlQ29pbnMgY29uc3VtZXMgYWRkckNvaW4pJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gUmVwcm9kdWNlcyB0aGUgcmVhbCBvbi1jaGFpbiBmYWlsdXJlOiBVbnVzZWRWYWx1ZVdpdGhvdXREcm9wIHsgcmVzdWx0X2lkeDogMCB9XG4gICAgICAvLyBPY2N1cnMgd2hlbiByZWRlZW1fZnVuZHMgcmV0dXJucyBhZGRyQ29pbiwgU3BsaXRDb2lucyBkcmFpbnMgaXQgY29tcGxldGVseSwgYW5kIHRoZVxuICAgICAgLy8gMC1iYWxhbmNlIHNvdXJjZSBjb2luIGlzIG5ldmVyIGNvbnN1bWVkLiAgRml4OiBNZXJnZUNvaW5zKGdhcywgW2FkZHJDb2luXSkgYXQgdGhlIGVuZC5cbiAgICAgIGNvbnN0IFNFTkRfQU1PVU5UID0gJzEwMDAwMDAnOyAvLyAwLjAwMSBTVUkg4oCUIHNhbWUgYXMgdGhlIGZhaWxpbmcgdHhcbiAgICAgIGNvbnN0IHNwb25zb3JlZEdhc0RhdGEgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGEsXG4gICAgICAgIG93bmVyOiB0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKFt7IGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcywgYW1vdW50OiBTRU5EX0FNT1VOVCB9XSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShzcG9uc29yZWRHYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoU0VORF9BTU9VTlQpOyAvLyBzZW5kLWFsbDogYmFsYW5jZSA9PSByZWNpcGllbnQgYW1vdW50XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuXG4gICAgICBjb25zdCBzdWlUeCA9IHR4IGFzIFN1aVRyYW5zYWN0aW9uPFRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+O1xuICAgICAgY29uc3QgY21kcyA9IHN1aVR4LnN1aVRyYW5zYWN0aW9uLnR4LnRyYW5zYWN0aW9ucyBhcyBhbnlbXTtcblxuICAgICAgLy8gRXhwZWN0ZWQgY29tbWFuZCBzZXF1ZW5jZSBmb3IgUGF0aCAxYiBzZW5kLWFsbDpcbiAgICAgIC8vICAgMDogTW92ZUNhbGwgKHJlZGVlbV9mdW5kcykgICAgIOKAlCB3aXRoZHJhdyBhZGRyQ29pblxuICAgICAgLy8gICAxOiBTcGxpdENvaW5zKGFkZHJDb2luKSAgICAgICAg4oCUIHNwbGl0IHJlY2lwaWVudCBhbW91bnQgb2ZmIGFkZHJDb2luXG4gICAgICAvLyAgIDI6IFRyYW5zZmVyT2JqZWN0cyhbc3BsaXRdKSAgICDigJQgc2VuZCB0byByZWNpcGllbnRcbiAgICAgIC8vICAgMzogTWVyZ2VDb2lucyhnYXMsIFthZGRyQ29pbl0pIOKAlCBjb25zdW1lIHRoZSBub3ctemVyby1iYWxhbmNlIGFkZHJDb2luXG4gICAgICBjbWRzWzBdLmtpbmQuc2hvdWxkLmVxdWFsKCdNb3ZlQ2FsbCcpO1xuICAgICAgY21kc1swXS50YXJnZXQuc2hvdWxkLmVxdWFsKCcweDI6OmNvaW46OnJlZGVlbV9mdW5kcycpO1xuICAgICAgY21kc1sxXS5raW5kLnNob3VsZC5lcXVhbCgnU3BsaXRDb2lucycpO1xuICAgICAgY21kc1syXS5raW5kLnNob3VsZC5lcXVhbCgnVHJhbnNmZXJPYmplY3RzJyk7XG4gICAgICBjbWRzWzNdLmtpbmQuc2hvdWxkLmVxdWFsKCdNZXJnZUNvaW5zJywgJ2V4cGVjdGVkIE1lcmdlQ29pbnMgdG8gY29uc3VtZSAwLWJhbGFuY2UgYWRkckNvaW4gYWZ0ZXIgc2VuZC1hbGwnKTtcblxuICAgICAgLy8gUmVjaXBpZW50IHBhcnNpbmcgbXVzdCBub3QgYmUgYWZmZWN0ZWQgYnkgdGhlIHRyYWlsaW5nIE1lcmdlQ29pbnNcbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSB1dGlscy5nZXRSZWNpcGllbnRzKHN1aVR4LnN1aVRyYW5zYWN0aW9uKTtcbiAgICAgIHJlY2lwaWVudHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHJlY2lwaWVudHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzKTtcbiAgICAgIHJlY2lwaWVudHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbChTRU5EX0FNT1VOVCk7XG5cbiAgICAgIC8vIFJvdW5kLXRyaXBcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgUGF0aCAxYiB3aXRoIGNoYW5nZTogc3BvbnNvcmVkIGFkZHItYmFsYW5jZS1vbmx5LCBleGNlc3MgcmV0dXJuZWQgdG8gc2VuZGVyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZnVuZHNJbkFkZHJlc3NCYWxhbmNlIGV4Y2VlZHMgdGhlIHRvdGFsIHJlY2lwaWVudCBhbW91bnQg4oaSIGNoYW5nZSBtdXN0IGJlIHJldHVybmVkIHRvXG4gICAgICAvLyB0aGUgc2VuZGVyIGFzIGFuIGV4dHJhIFRyYW5zZmVyT2JqZWN0cyhbYWRkckNvaW5dLCBzZW5kZXIpLiAgVGhlIHRyYW5zYWN0aW9uIHBhcnNlciBtdXN0XG4gICAgICAvLyBza2lwIHRoaXMgY2hhbmdlIHRyYW5zZmVyIGFuZCBvbmx5IHJlcG9ydCBhY3R1YWwgcmVjaXBpZW50cy5cbiAgICAgIGNvbnN0IFNFTkRfQU1PVU5UID0gJzEwMCc7IC8vIGVhY2ggb2YgdGhlIHR3byB0ZXN0RGF0YS5yZWNpcGllbnRzIGdldHMgMTAwXG4gICAgICBjb25zdCBFWENFU1MgPSAnOTk5OTkwMCc7IC8vIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZSA9IDEwXzAwMF8wMDAsIHRvdGFsIHNlbmQgPSAyMDBcbiAgICAgIGNvbnN0IEZVTkRTX0JBTEFOQ0UgPSAoTnVtYmVyKFNFTkRfQU1PVU5UKSAqIHRlc3REYXRhLnJlY2lwaWVudHMubGVuZ3RoICsgTnVtYmVyKEVYQ0VTUykpLnRvU3RyaW5nKCk7XG5cbiAgICAgIGNvbnN0IHNwb25zb3JlZEdhc0RhdGEgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGEsXG4gICAgICAgIG93bmVyOiB0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKHRlc3REYXRhLnJlY2lwaWVudHMpOyAvLyAyIHJlY2lwaWVudHMgw5cgMTAwIE1JU1QgPSAyMDAgTUlTVCB0b3RhbFxuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoc3BvbnNvcmVkR2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuZnVuZHNJbkFkZHJlc3NCYWxhbmNlKEZVTkRTX0JBTEFOQ0UpOyAvLyAxMF8wMDBfMDAwID4gMjAwIOKGkiBoYXMgY2hhbmdlXG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuXG4gICAgICBjb25zdCBzdWlUeCA9IHR4IGFzIFN1aVRyYW5zYWN0aW9uPFRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+O1xuICAgICAgY29uc3QgY21kcyA9IHN1aVR4LnN1aVRyYW5zYWN0aW9uLnR4LnRyYW5zYWN0aW9ucyBhcyBhbnlbXTtcblxuICAgICAgLy8gRXhwZWN0ZWQgc2VxdWVuY2UgZm9yIFBhdGggMWIgd2l0aCBjaGFuZ2UgKDIgcmVjaXBpZW50cyk6XG4gICAgICAvLyAgIDA6IE1vdmVDYWxsIChyZWRlZW1fZnVuZHMpXG4gICAgICAvLyAgIDE6IFNwbGl0Q29pbnMgIOKAlCAgcmVjaXBpZW50IDBcbiAgICAgIC8vICAgMjogVHJhbnNmZXJPYmplY3RzICDigJQgIHJlY2lwaWVudCAwXG4gICAgICAvLyAgIDM6IFNwbGl0Q29pbnMgIOKAlCAgcmVjaXBpZW50IDFcbiAgICAgIC8vICAgNDogVHJhbnNmZXJPYmplY3RzICDigJQgIHJlY2lwaWVudCAxXG4gICAgICAvLyAgIDU6IFRyYW5zZmVyT2JqZWN0cyhbYWRkckNvaW5dLCBzZW5kZXIpICDigJQgIGNoYW5nZSBiYWNrIHRvIHNlbmRlclxuICAgICAgY21kc1swXS5raW5kLnNob3VsZC5lcXVhbCgnTW92ZUNhbGwnKTtcbiAgICAgIGNtZHNbMF0udGFyZ2V0LnNob3VsZC5lcXVhbCgnMHgyOjpjb2luOjpyZWRlZW1fZnVuZHMnKTtcbiAgICAgIGNvbnN0IGxhc3RDbWQgPSBjbWRzW2NtZHMubGVuZ3RoIC0gMV07XG4gICAgICBsYXN0Q21kLmtpbmQuc2hvdWxkLmVxdWFsKCdUcmFuc2Zlck9iamVjdHMnLCAnbGFzdCBjb21tYW5kIG11c3QgYmUgdGhlIGNoYW5nZSB0cmFuc2ZlcicpO1xuXG4gICAgICAvLyBUaGUgbGFzdCBUcmFuc2Zlck9iamVjdHMgcmV0dXJucyBjaGFuZ2UgdG8gdGhlICpzZW5kZXIqLCBub3QgYSByZWNpcGllbnRcbiAgICAgIGNvbnN0IGNoYW5nZUFkZHJJbnB1dCA9IHN1aVR4LnN1aVRyYW5zYWN0aW9uLnR4LmlucHV0c1tsYXN0Q21kLmFkZHJlc3MuaW5kZXhdIGFzIGFueTtcbiAgICAgIGNvbnN0IGNoYW5nZUFkZHIgPSB1dGlscy5nZXRBZGRyZXNzKGNoYW5nZUFkZHJJbnB1dCk7XG4gICAgICBjaGFuZ2VBZGRyLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcywgJ2NoYW5nZSBtdXN0IGdvIGJhY2sgdG8gc2VuZGVyJyk7XG5cbiAgICAgIC8vIFBhcnNlciBtdXN0IHJldHVybiBvbmx5IHRoZSBhY3R1YWwgcmVjaXBpZW50cywgbm90IHRoZSBjaGFuZ2UgdHJhbnNmZXJcbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSB1dGlscy5nZXRSZWNpcGllbnRzKHN1aVR4LnN1aVRyYW5zYWN0aW9uKTtcbiAgICAgIHJlY2lwaWVudHMubGVuZ3RoLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yZWNpcGllbnRzLmxlbmd0aCk7XG4gICAgICByZWNpcGllbnRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcyk7XG4gICAgICByZWNpcGllbnRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwoU0VORF9BTU9VTlQpO1xuICAgICAgcmVjaXBpZW50c1sxXS5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5yZWNpcGllbnRzWzFdLmFkZHJlc3MpO1xuICAgICAgcmVjaXBpZW50c1sxXS5hbW91bnQuc2hvdWxkLmVxdWFsKFNFTkRfQU1PVU5UKTtcblxuICAgICAgLy8gUm91bmQtdHJpcFxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgY29uc3QgcmVidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIHJlYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsZGVyLmJ1aWxkKCk7XG4gICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHNwb25zb3JlZCB0eCBnYXMgcGFpZCBmcm9tIHNwb25zb3IgYWRkcmVzcyBiYWxhbmNlIChlbXB0eSBwYXltZW50KScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0T2JqZWN0cyA9IHRlc3REYXRhLmdlbmVyYXRlT2JqZWN0cygxKTtcbiAgICAgIGNvbnN0IHNwb25zb3JlZEdhc0RhdGFOb1BheW1lbnQgPSB7XG4gICAgICAgIHBheW1lbnQ6IFtdLFxuICAgICAgICBvd25lcjogdGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyxcbiAgICAgICAgcHJpY2U6IHRlc3REYXRhLmdhc0RhdGEucHJpY2UsXG4gICAgICAgIGJ1ZGdldDogdGVzdERhdGEuZ2FzRGF0YS5idWRnZXQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQodGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShzcG9uc29yZWRHYXNEYXRhTm9QYXltZW50KTtcbiAgICAgIHR4QnVpbGRlci5pbnB1dE9iamVjdHMoaW5wdXRPYmplY3RzKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIGNvbnN0IHN1aVR4ID0gdHggYXMgU3VpVHJhbnNhY3Rpb248VHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG4gICAgICBzdWlUeC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLm93bmVyLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzKTtcbiAgICAgIHN1aVR4LnN1aVRyYW5zYWN0aW9uLmdhc0RhdGEucGF5bWVudC5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuXG4gICAgICAvLyBTcG9uc29yZWQgcGF0aCB3aXRoIGNvaW4gb2JqZWN0cywgbm8gYWRkcmVzcyBiYWxhbmNlIHdpdGhkcmF3YWxcbiAgICAgIGNvbnN0IHByb2dyYW1tYWJsZVR4ID0gc3VpVHguc3VpVHJhbnNhY3Rpb24udHg7XG4gICAgICAocHJvZ3JhbW1hYmxlVHgudHJhbnNhY3Rpb25zWzBdIGFzIGFueSkua2luZC5zaG91bGQuZXF1YWwoJ1NwbGl0Q29pbnMnKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByb3VuZC10cmlwIGEgc2VsZi1wYXkgdHJhbnNmZXIgd2l0aCBFcG9jaCBleHBpcmF0aW9uIHZpYSBmcm9tQnl0ZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIHRoZSBCaWdJbnQgcm91bmQtdHJpcCBidWc6XG4gICAgICAvLyBCQ1MuVTY0IGRlc2VyaWFsaXplcyB1NjQgYXMgQmlnSW50LCBidXQgdGhlIHByZXZpb3VzIHN1cGVyc3RydWN0IHNjaGVtYSB1c2VkIGludGVnZXIoKVxuICAgICAgLy8gd2hpY2ggcmVqZWN0ZWQgQmlnSW50LCBjYXVzaW5nIGZyb21CeXRlcygpIHRvIHRocm93IGEgU3RydWN0RXJyb3IgYXQgXCJleHBpcmF0aW9uXCIuXG4gICAgICAvLyBTdHJpbmdFbmNvZGVkQmlnaW50IG5vdyBhY2NlcHRzIHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCwgZml4aW5nIHRoZSByb3VuZC10cmlwLlxuICAgICAgY29uc3QgZ2FzRGF0YU5vUGF5bWVudCA9IHtcbiAgICAgICAgLi4udGVzdERhdGEuZ2FzRGF0YVdpdGhvdXRHYXNQYXltZW50LFxuICAgICAgICBwYXltZW50OiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKGdhc0RhdGFOb1BheW1lbnQpO1xuICAgICAgdHhCdWlsZGVyLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZShGVU5EU19JTl9BRERSRVNTX0JBTEFOQ0UpO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb24oeyBFcG9jaDogMzI0IH0pOyAvLyBudW1iZXIgaW5wdXRcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgLy8gZnJvbUJ5dGVzIG11c3Qgbm90IHRocm93IFN0cnVjdEVycm9yIOKAlCB0aGlzIHdhcyB0aGUgZmFpbGluZyBjYXNlIGJlZm9yZSB0aGUgZml4XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHJlYnVpbGRlcik7XG4gICAgICB9KTtcblxuICAgICAgLy8gRnVsbCByb3VuZC10cmlwOiByZWJ1aWx0IHR4IG11c3Qgc2VyaWFsaXplIGlkZW50aWNhbGx5XG4gICAgICBjb25zdCByZWJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcmVidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSBhd2FpdCByZWJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHJlYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG5cbiAgICAgIC8vIEVwb2NoIHZhbHVlIG11c3Qgc3Vydml2ZSB0aGUgcm91bmQtdHJpcCByZWdhcmRsZXNzIG9mIEJpZ0ludC9udW1iZXIgcmVwcmVzZW50YXRpb25cbiAgICAgIGNvbnN0IHJlYnVpbHRKc29uID0gcmVidWlsdFR4LnRvSnNvbigpO1xuICAgICAgY29uc3QgZXBvY2hWYWwgPSAocmVidWlsdEpzb24uZXhwaXJhdGlvbiBhcyBhbnkpPy5FcG9jaDtcbiAgICAgIHNob3VsZC5leGlzdChlcG9jaFZhbCk7XG4gICAgICBOdW1iZXIoZXBvY2hWYWwpLnNob3VsZC5lcXVhbCgzMjQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByb3VuZC10cmlwIGEgc2VsZi1wYXkgdHJhbnNmZXIgd2l0aCBWYWxpZER1cmluZyBleHBpcmF0aW9uIHZpYSBmcm9tQnl0ZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBWZXJpZmllcyB0aGUgZnVsbCA2LWZpZWxkIFZhbGlkRHVyaW5nRXhwaXJhdGlvbiBCQ1Mgc2NoZW1hOlxuICAgICAgLy8gICBtaW5FcG9jaC9tYXhFcG9jaCBhcyBPcHRpb248dTY0PiwgbWluVGltZXN0YW1wL21heFRpbWVzdGFtcCBhcyBPcHRpb248dTY0PiAoTm9uZSksXG4gICAgICAvLyAgIGNoYWluIGFzIDMyLWJ5dGUgQmFzZTU4IE9iamVjdERpZ2VzdCwgbm9uY2UgYXMgdTMyLlxuICAgICAgLy8gVXNlcyBhIHJlYWwgbWFpbm5ldCBnZW5lc2lzIGNoZWNrcG9pbnQgZGlnZXN0ICgzMiBieXRlcywgQmFzZTU4KS5cbiAgICAgIGNvbnN0IEdFTkVTSVNfQ0hBSU5fSUQgPSAnR0FGcENDY1JDeFRkRmZVRU1iUWJrTEJhWnkyUk5pR0FmdkZCaE1OcHEya1QnO1xuICAgICAgY29uc3QgRlVORFNfSU5fQUREUkVTU19CQUxBTkNFID0gJzUwMDAwMDAwMDAnO1xuICAgICAgY29uc3QgZ2FzRGF0YU5vUGF5bWVudCA9IHtcbiAgICAgICAgLi4udGVzdERhdGEuZ2FzRGF0YVdpdGhvdXRHYXNQYXltZW50LFxuICAgICAgICBwYXltZW50OiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKGdhc0RhdGFOb1BheW1lbnQpO1xuICAgICAgdHhCdWlsZGVyLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZShGVU5EU19JTl9BRERSRVNTX0JBTEFOQ0UpO1xuICAgICAgdHhCdWlsZGVyLmV4cGlyYXRpb24oe1xuICAgICAgICBWYWxpZER1cmluZzoge1xuICAgICAgICAgIG1pbkVwb2NoOiB7IFNvbWU6IDUwMCB9LFxuICAgICAgICAgIG1heEVwb2NoOiB7IFNvbWU6IDUwMSB9LFxuICAgICAgICAgIG1pblRpbWVzdGFtcDogeyBOb25lOiBudWxsIH0sXG4gICAgICAgICAgbWF4VGltZXN0YW1wOiB7IE5vbmU6IG51bGwgfSxcbiAgICAgICAgICBjaGFpbjogR0VORVNJU19DSEFJTl9JRCxcbiAgICAgICAgICBub25jZTogMHhkZWFkYmVlZixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuXG4gICAgICAvLyBmcm9tQnl0ZXMgbXVzdCBub3QgdGhyb3cg4oCUIFZhbGlkRHVyaW5nIGZpZWxkcyBtdXN0IHN1cnZpdmUgZGVzZXJpYWxpemF0aW9uXG4gICAgICBjb25zdCByZWJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcmVidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSBhd2FpdCByZWJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gQkNTIHJvdW5kLXRyaXA6IHNlcmlhbGl6ZWQgYnl0ZXMgbXVzdCBiZSBpZGVudGljYWxcbiAgICAgIHJlYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG5cbiAgICAgIC8vIEFsbCBWYWxpZER1cmluZyBmaWVsZHMgbXVzdCBzdXJ2aXZlIHRoZSByb3VuZC10cmlwXG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gKHJlYnVpbHRUeC50b0pzb24oKS5leHBpcmF0aW9uIGFzIGFueSk/LlZhbGlkRHVyaW5nO1xuICAgICAgc2hvdWxkLmV4aXN0KGV4cGlyYXRpb24pO1xuICAgICAgTnVtYmVyKGV4cGlyYXRpb24ubWluRXBvY2g/LlNvbWUgPz8gZXhwaXJhdGlvbi5taW5FcG9jaCkuc2hvdWxkLmVxdWFsKDUwMCk7XG4gICAgICBOdW1iZXIoZXhwaXJhdGlvbi5tYXhFcG9jaD8uU29tZSA/PyBleHBpcmF0aW9uLm1heEVwb2NoKS5zaG91bGQuZXF1YWwoNTAxKTtcbiAgICAgIGV4cGlyYXRpb24uY2hhaW4uc2hvdWxkLmVxdWFsKEdFTkVTSVNfQ0hBSU5fSUQpO1xuICAgICAgTnVtYmVyKGV4cGlyYXRpb24ubm9uY2UpLnNob3VsZC5lcXVhbCgweGRlYWRiZWVmKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2xhcmdlIGFtb3VudHMgZXhjZWVkaW5nIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSJywgKCkgPT4ge1xuICAgIC8vIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MS5cbiAgICAvLyBVc2luZyBOdW1iZXIoKSBmb3IgYW1vdW50cyBhYm92ZSB0aGlzIHNpbGVudGx5IHJvdW5kcyB0byB0aGUgbmVhcmVzdCByZXByZXNlbnRhYmxlIGZsb2F0LlxuICAgIC8vIDkwMDcxOTkyNTQ3NDA5OTMgKE1BWF9TQUZFX0lOVEVHRVIgKyAyKSBpcyBOT1QgZXhhY3RseSByZXByZXNlbnRhYmxlIGFzIGEgSlMgTnVtYmVyIOKAlCBpdFxuICAgIC8vIHJvdW5kcyBkb3duIHRvIDkwMDcxOTkyNTQ3NDA5OTIg4oCUIHNvIEJDUyB3b3VsZCBlbmNvZGUgdGhlIHdyb25nIHZhbHVlLlxuICAgIC8vIEJpZ0ludCBwcmVzZXJ2ZXMgdGhlIGV4YWN0IHZhbHVlIGFuZCBpcyB0aGUgY29ycmVjdCB0eXBlIGZvciBCQ1MgdTY0IGVuY29kaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIGNvcmUgY2hlY2sgaW4gZWFjaCB0ZXN0IGlzIHR4Lm91dHB1dHNbMF0udmFsdWUgPT09IExBUkdFX0FNT1VOVDogdGhpcyByZWFkcyBmcm9tIHRoZVxuICAgIC8vIGluLW1lbW9yeSBidWlsZGVyIHN0YXRlIChhIEJpZ0ludCwgbm90IEJDUy1kZWNvZGVkKSwgc28gaXQgYWNjdXJhdGVseSBkaXN0aW5ndWlzaGVzXG4gICAgLy8gQmlnSW50KCkgdnMgTnVtYmVyKCkgZW5jb2RpbmcgYXQgYnVpbGQgdGltZS5cbiAgICBjb25zdCBMQVJHRV9BTU9VTlQgPSAnOTAwNzE5OTI1NDc0MDk5Myc7IC8vIE1BWF9TQUZFX0lOVEVHRVIgKyAyXG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc2VsZi1wYXkgdHJhbnNmZXIgKFBhdGggMikgd2l0aCBhbW91bnQgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiBhbmQgZW5jb2RlIGl0IHByZWNpc2VseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZChbeyBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIGFtb3VudDogTEFSR0VfQU1PVU5UIH1dKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcblxuICAgICAgLy8gV2l0aCBOdW1iZXIoKSB0aGUgYW1vdW50IHdvdWxkIGJlIHNpbGVudGx5IHJvdW5kZWQgdG8gOTAwNzE5OTI1NDc0MDk5MiDigJQgQmlnSW50IHByZXNlcnZlcyB0aGUgZXhhY3QgdmFsdWVcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKExBUkdFX0FNT1VOVCk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzcG9uc29yZWQgdHJhbnNmZXIgd2l0aCBjb2luIG9iamVjdHMgKFBhdGggMWEpIHdpdGggYW1vdW50ID4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgYW5kIGVuY29kZSBpdCBwcmVjaXNlbHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpbnB1dE9iamVjdHMgPSB0ZXN0RGF0YS5nZW5lcmF0ZU9iamVjdHMoMik7XG4gICAgICBjb25zdCBzcG9uc29yZWRHYXNEYXRhID0ge1xuICAgICAgICAuLi50ZXN0RGF0YS5nYXNEYXRhLFxuICAgICAgICBvd25lcjogdGVzdERhdGEuZmVlUGF5ZXIuYWRkcmVzcyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZChbeyBhZGRyZXNzOiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFkZHJlc3MsIGFtb3VudDogTEFSR0VfQU1PVU5UIH1dKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHNwb25zb3JlZEdhc0RhdGEpO1xuICAgICAgdHhCdWlsZGVyLmlucHV0T2JqZWN0cyhpbnB1dE9iamVjdHMpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcblxuICAgICAgLy8gV2l0aCBOdW1iZXIoKSB0aGUgYW1vdW50IHdvdWxkIGJlIHNpbGVudGx5IHJvdW5kZWQgdG8gOTAwNzE5OTI1NDc0MDk5MiDigJQgQmlnSW50IHByZXNlcnZlcyB0aGUgZXhhY3QgdmFsdWVcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKExBUkdFX0FNT1VOVCk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzcG9uc29yZWQgYWRkci1iYWxhbmNlLW9ubHkgdHJhbnNmZXIgKFBhdGggMWIpIHdpdGggYW1vdW50ID4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgYW5kIHJvdW5kLXRyaXAgY29ycmVjdGx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc3BvbnNvcmVkR2FzRGF0YSA9IHtcbiAgICAgICAgLi4udGVzdERhdGEuZ2FzRGF0YSxcbiAgICAgICAgb3duZXI6IHRlc3REYXRhLmZlZVBheWVyLmFkZHJlc3MsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoW3sgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLCBhbW91bnQ6IExBUkdFX0FNT1VOVCB9XSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShzcG9uc29yZWRHYXNEYXRhKTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoTEFSR0VfQU1PVU5UKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIC8vIFdpdGggTnVtYmVyKCkgdGhlIGFtb3VudCB3b3VsZCBiZSBzaWxlbnRseSByb3VuZGVkIHRvIDkwMDcxOTkyNTQ3NDA5OTIg4oCUIEJpZ0ludCBwcmVzZXJ2ZXMgdGhlIGV4YWN0IHZhbHVlXG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbChMQVJHRV9BTU9VTlQpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG5cbiAgICAgIC8vIEZ1bGwgcm91bmQtdHJpcDogcmVidWlsZGluZyBmcm9tIEJDUyBieXRlcyBtdXN0IHByb2R1Y2UgaWRlbnRpY2FsIGJ5dGVzXG4gICAgICBjb25zdCByZWJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcmVidWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbSh0ZXN0RGF0YS5zZW5kZXIuc2lnbmF0dXJlSGV4KSk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSBhd2FpdCByZWJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHJlYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChyYXdUeCk7XG5cbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSB1dGlscy5nZXRSZWNpcGllbnRzKFxuICAgICAgICAocmVidWlsdFR4IGFzIFN1aVRyYW5zYWN0aW9uPFRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+KS5zdWlUcmFuc2FjdGlvblxuICAgICAgKTtcbiAgICAgIHJlY2lwaWVudHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbChMQVJHRV9BTU9VTlQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJvZCBhZGRyZXNzIGJhbGFuY2UgY29uc29saWRhdGlvbiAoQ0VDSE8tMTIxMCknLCAoKSA9PiB7XG4gICAgLy8gRmFpbGVkIHByb2QgY29uc29saWRhdGlvbiA2YTE5Y2I4YmNkNDc1MWRiZDg5MWE3MjJlZTA0ZTU1MiAodHhSZXF1ZXN0IGVlNWQ2MGQ3LWZhNTMtNGZhNC1hZGNmLTI2NDM1YzkzMTdiZikuXG4gICAgLy8gQnJvYWRjYXN0IGZhaWxlZCB3aXRoIHN0YWxlIGNvaW4gb2JqZWN0IHZlcnNpb247IHRoZSBhbW91bnQgbXVzdCBzdGlsbCBlbmNvZGUgbG9zc2xlc3NseS5cbiAgICBjb25zdCBDT05TT0xJREFUSU9OX0FNT1VOVCA9ICcxODUzNjc5Nzg0MjYxMzcwMCc7IC8vIH4xOC41TSBTVUkgaW4gTUlTVCAoc2VuZEFjY291bnRpbmcuYW1vdW50U3RyaW5nKVxuICAgIGNvbnN0IENPTlNPTElEQVRJT05fU0VOREVSID0gJzB4NDZhNTNlMjcxMjU2MWY0ZTBkODI3MmJkMjdhMzk2YjZiZjkzMjVmOTJmMzRiOTQ5MDQxYjg3ODNkNTc0NjlkZCc7XG4gICAgY29uc3QgQ09OU09MSURBVElPTl9SRUNJUElFTlQgPSAnMHgzZGEyY2I2N2M4ODdjOWEwM2QxMDUyZDQ4NjczM2E3NzEwNTgyNGY3NDEzZmMzY2JiZTM2NDFkNGI2N2FmMTAyJztcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHRoZSBwcm9kIGNvbnNvbGlkYXRpb24gYW1vdW50IGluIGlzVmFsaWRBbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlscy5pc1ZhbGlkQW1vdW50KENPTlNPTElEQVRJT05fQU1PVU5UKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgTnVtYmVyLmlzU2FmZUludGVnZXIoTnVtYmVyKENPTlNPTElEQVRJT05fQU1PVU5UKSkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFkZHJlc3MtYmFsYW5jZS1vbmx5IGNvbnNvbGlkYXRpb24gd2l0aCBleGFjdCBwcm9kIGFtb3VudCAoUGF0aCAyLCBlbXB0eSBwYXltZW50KScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGdhc0RhdGFOb1BheW1lbnQgPSB7XG4gICAgICAgIC4uLnRlc3REYXRhLmdhc0RhdGFXaXRob3V0R2FzUGF5bWVudCxcbiAgICAgICAgcGF5bWVudDogW10sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoQ09OU09MSURBVElPTl9TRU5ERVIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoW3sgYWRkcmVzczogQ09OU09MSURBVElPTl9SRUNJUElFTlQsIGFtb3VudDogQ09OU09MSURBVElPTl9BTU9VTlQgfV0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoZ2FzRGF0YU5vUGF5bWVudCk7XG4gICAgICB0eEJ1aWxkZXIuZnVuZHNJbkFkZHJlc3NCYWxhbmNlKENPTlNPTElEQVRJT05fQU1PVU5UKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHR4Lm91dHB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGFkZHJlc3M6IENPTlNPTElEQVRJT05fUkVDSVBJRU5ULFxuICAgICAgICB2YWx1ZTogQ09OU09MSURBVElPTl9BTU9VTlQsXG4gICAgICAgIGNvaW46ICd0c3VpJyxcbiAgICAgIH0pO1xuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0eC5pbnB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKENPTlNPTElEQVRJT05fQU1PVU5UKTtcblxuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuXG4gICAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSBTdWlUcmFuc2FjdGlvbi5kZXNlcmlhbGl6ZVN1aVRyYW5zYWN0aW9uKHJhd1R4KTtcbiAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSB1dGlscy5nZXRSZWNpcGllbnRzKGRlc2VyaWFsaXplZCk7XG4gICAgICByZWNpcGllbnRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICByZWNpcGllbnRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKENPTlNPTElEQVRJT05fUkVDSVBJRU5UKTtcbiAgICAgIHJlY2lwaWVudHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbChDT05TT0xJREFUSU9OX0FNT1VOVCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFkZHJlc3MtYmFsYW5jZSBjb25zb2xpZGF0aW9uIHdpdGggY29pbiBvYmplY3RzIGFuZCBleGFjdCBwcm9kIGFtb3VudCAoUGF0aCAyKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFByb2QgZmFpbHVyZSByZWZlcmVuY2VkIHN0YWxlIGdhcy9jb2luIG9iamVjdCB2ZXJzaW9ucyBiZXR3ZWVuIHNpZ24gYW5kIGJyb2FkY2FzdC5cbiAgICAgIC8vIEJ1aWxkZXIgbXVzdCBzdGlsbCBlbmNvZGUgdGhlIGZ1bGwgY29uc29saWRhdGlvbiBhbW91bnQgaW4gU3BsaXRDb2lucy5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXIpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcihDT05TT0xJREFUSU9OX1NFTkRFUik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZChbeyBhZGRyZXNzOiBDT05TT0xJREFUSU9OX1JFQ0lQSUVOVCwgYW1vdW50OiBDT05TT0xJREFUSU9OX0FNT1VOVCB9XSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh7IC4uLnRlc3REYXRhLmdhc0RhdGEsIG93bmVyOiBDT05TT0xJREFUSU9OX1NFTkRFUiB9KTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoQ09OU09MSURBVElPTl9BTU9VTlQpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcblxuICAgICAgdHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoQ09OU09MSURBVElPTl9BTU9VTlQpO1xuICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbChDT05TT0xJREFUSU9OX0FNT1VOVCk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgY29uc3QgcmVidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIHJlYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsZGVyLmJ1aWxkKCk7XG4gICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuXG4gICAgICBjb25zdCByZWNpcGllbnRzID0gdXRpbHMuZ2V0UmVjaXBpZW50cyhcbiAgICAgICAgKHJlYnVpbHRUeCBhcyBTdWlUcmFuc2FjdGlvbjxUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPikuc3VpVHJhbnNhY3Rpb25cbiAgICAgICk7XG4gICAgICByZWNpcGllbnRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKENPTlNPTElEQVRJT05fUkVDSVBJRU5UKTtcbiAgICAgIHJlY2lwaWVudHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbChDT05TT0xJREFUSU9OX0FNT1VOVCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCYWxhbmNlV2l0aGRyYXdhbCBCQ1MgZW5jb2RpbmcgKEZ1bmRzV2l0aGRyYXdhbCBmb3JtYXQpJywgKCkgPT4ge1xuICAgIGNvbnN0IEFNT1VOVCA9ICcxMDAwMDAwMDAnOyAvLyAwLjEgU1VJIGluIE1JU1RcbiAgICBjb25zdCBzcG9uc29yZWRHYXNEYXRhID0ge1xuICAgICAgLi4udGVzdERhdGEuZ2FzRGF0YSxcbiAgICAgIG93bmVyOiB0ZXN0RGF0YS5mZWVQYXllci5hZGRyZXNzLFxuICAgIH07XG5cbiAgICBhc3luYyBmdW5jdGlvbiBidWlsZFNwb25zb3JlZFR4V2l0aEFkZHJlc3NCYWxhbmNlKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlcik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kKFt7IGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcywgYW1vdW50OiBBTU9VTlQgfV0pO1xuICAgICAgdHhCdWlsZGVyLmdhc0RhdGEoc3BvbnNvcmVkR2FzRGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuZnVuZHNJbkFkZHJlc3NCYWxhbmNlKEFNT1VOVCk7XG4gICAgICByZXR1cm4gdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgfVxuXG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgQmFsYW5jZVdpdGhkcmF3YWwgaW5wdXQgd2l0aCBGdW5kc1dpdGhkcmF3YWwgc3RydWN0dXJlIChyZXNlcnZhdGlvbi90eXBlQXJnL3dpdGhkcmF3RnJvbSknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkU3BvbnNvcmVkVHhXaXRoQWRkcmVzc0JhbGFuY2UoKTtcbiAgICAgIGNvbnN0IHN1aVR4ID0gdHggYXMgU3VpVHJhbnNhY3Rpb248VHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG4gICAgICBjb25zdCBpbnB1dHMgPSBzdWlUeC5zdWlUcmFuc2FjdGlvbi50eC5pbnB1dHMgYXMgYW55W107XG5cbiAgICAgIGNvbnN0IGJ3SW5wdXQgPSBpbnB1dHMuZmluZChcbiAgICAgICAgKGlucCkgPT4gaW5wPy5CYWxhbmNlV2l0aGRyYXdhbCAhPT0gdW5kZWZpbmVkIHx8IGlucD8udmFsdWU/LkJhbGFuY2VXaXRoZHJhd2FsICE9PSB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXhpc3QoYndJbnB1dCwgJ0JhbGFuY2VXaXRoZHJhd2FsIGlucHV0IG11c3QgYmUgcHJlc2VudCcpO1xuXG4gICAgICBjb25zdCBidyA9IGJ3SW5wdXQuQmFsYW5jZVdpdGhkcmF3YWwgPz8gYndJbnB1dC52YWx1ZT8uQmFsYW5jZVdpdGhkcmF3YWw7XG5cbiAgICAgIHNob3VsZC5leGlzdChidy5yZXNlcnZhdGlvbiwgJ3Jlc2VydmF0aW9uIGZpZWxkIG11c3QgZXhpc3QnKTtcbiAgICAgIHNob3VsZC5leGlzdChidy5yZXNlcnZhdGlvbi5NYXhBbW91bnRVNjQsICdyZXNlcnZhdGlvbi5NYXhBbW91bnRVNjQgbXVzdCBleGlzdCcpO1xuICAgICAgYncucmVzZXJ2YXRpb24uTWF4QW1vdW50VTY0LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKEFNT1VOVCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChidy50eXBlQXJnLCAndHlwZUFyZyBmaWVsZCBtdXN0IGV4aXN0Jyk7XG4gICAgICBzaG91bGQuZXhpc3QoYncudHlwZUFyZy5CYWxhbmNlLCAndHlwZUFyZy5CYWxhbmNlIG11c3QgZXhpc3QnKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGJ3LndpdGhkcmF3RnJvbSwgJ3dpdGhkcmF3RnJvbSBmaWVsZCBtdXN0IGV4aXN0Jyk7XG4gICAgICBzaG91bGQuZXhpc3QoXG4gICAgICAgIGJ3LndpdGhkcmF3RnJvbS5TZW5kZXIgIT09IHVuZGVmaW5lZCB8fCBidy53aXRoZHJhd0Zyb20uU3BvbnNvciAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAnd2l0aGRyYXdGcm9tIG11c3QgYmUgU2VuZGVyIG9yIFNwb25zb3InXG4gICAgICApO1xuXG4gICAgICAvLyBPbGQgZm9ybWF0IGZpZWxkcyBtdXN0IE5PVCBleGlzdCBkaXJlY3RseSBvbiBid1xuICAgICAgc2hvdWxkLm5vdC5leGlzdChidy5hbW91bnQsICdvbGQgXCJhbW91bnRcIiBmaWVsZCBtdXN0IG5vdCBleGlzdCBvbiBCYWxhbmNlV2l0aGRyYXdhbCcpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdChidy50eXBlXywgJ29sZCBcInR5cGVfXCIgZmllbGQgbXVzdCBub3QgZXhpc3Qgb24gQmFsYW5jZVdpdGhkcmF3YWwnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBCQ1MgYnl0ZXMgdGhhdCBkZWNvZGUgYmFjayB0byBGdW5kc1dpdGhkcmF3YWwgd2l0aCBjb3JyZWN0IGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRTcG9uc29yZWRUeFdpdGhBZGRyZXNzQmFsYW5jZSgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuXG4gICAgICBjb25zdCBkZXNlcmlhbGl6ZWQgPSBTdWlUcmFuc2FjdGlvbi5kZXNlcmlhbGl6ZVN1aVRyYW5zYWN0aW9uKHJhd1R4KTtcbiAgICAgIGNvbnN0IGlucHV0cyA9IGRlc2VyaWFsaXplZC50eC5pbnB1dHMgYXMgYW55W107XG5cbiAgICAgIGNvbnN0IGJ3SW5wdXQgPSBpbnB1dHMuZmluZChcbiAgICAgICAgKGlucCkgPT4gaW5wPy5CYWxhbmNlV2l0aGRyYXdhbCAhPT0gdW5kZWZpbmVkIHx8IGlucD8udmFsdWU/LkJhbGFuY2VXaXRoZHJhd2FsICE9PSB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXhpc3QoYndJbnB1dCwgJ0JhbGFuY2VXaXRoZHJhd2FsIG11c3QgYmUgcHJlc2VudCBpbiBkZXNlcmlhbGl6ZWQgaW5wdXRzJyk7XG5cbiAgICAgIGNvbnN0IGJ3ID0gYndJbnB1dC5CYWxhbmNlV2l0aGRyYXdhbCA/PyBid0lucHV0LnZhbHVlPy5CYWxhbmNlV2l0aGRyYXdhbDtcblxuICAgICAgLy8gRnVuZHNXaXRoZHJhd2FsIHN0cnVjdHVyZSAobm90IG9sZCB7YW1vdW50LCB0eXBlX30pXG4gICAgICBzaG91bGQuZXhpc3QoYncucmVzZXJ2YXRpb24sICdyZXNlcnZhdGlvbiBtdXN0IHN1cnZpdmUgQkNTIHJvdW5kLXRyaXAnKTtcbiAgICAgIHNob3VsZC5leGlzdChidy5yZXNlcnZhdGlvbi5NYXhBbW91bnRVNjQsICdNYXhBbW91bnRVNjQgbXVzdCBzdXJ2aXZlIEJDUyByb3VuZC10cmlwJyk7XG4gICAgICBidy5yZXNlcnZhdGlvbi5NYXhBbW91bnRVNjQudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoQU1PVU5UKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGJ3LnR5cGVBcmcsICd0eXBlQXJnIG11c3Qgc3Vydml2ZSBCQ1Mgcm91bmQtdHJpcCcpO1xuICAgICAgc2hvdWxkLmV4aXN0KGJ3LnR5cGVBcmcuQmFsYW5jZSwgJ3R5cGVBcmcuQmFsYW5jZSBtdXN0IHN1cnZpdmUgQkNTIHJvdW5kLXRyaXAnKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGJ3LndpdGhkcmF3RnJvbSwgJ3dpdGhkcmF3RnJvbSBtdXN0IHN1cnZpdmUgQkNTIHJvdW5kLXRyaXAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2VyaWFsaXplIHRvSnNvbigpIHdpdGhvdXQgYSBCaWdJbnQgcmVwbGFjZXIgKG5vIFR5cGVFcnJvciknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkU3BvbnNvcmVkVHhXaXRoQWRkcmVzc0JhbGFuY2UoKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coXG4gICAgICAgICgpID0+IEpTT04uc3RyaW5naWZ5KHR4LnRvSnNvbigpKSxcbiAgICAgICAgJ0pTT04uc3RyaW5naWZ5KHR4LnRvSnNvbigpKSBtdXN0IG5vdCB0aHJvdyDigJQgQmFsYW5jZVdpdGhkcmF3YWwgYW1vdW50IG11c3Qgbm90IGJlIHN0b3JlZCBhcyBCaWdJbnQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcmVzZXJ2ZSBmdW5kc0luQWRkcmVzc0JhbGFuY2UgYW1vdW50IHRocm91Z2ggZnVsbCByb3VuZC10cmlwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZFNwb25zb3JlZFR4V2l0aEFkZHJlc3NCYWxhbmNlKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuXG4gICAgICBjb25zdCBzdWlUeCA9IHJlYnVpbHRUeCBhcyBTdWlUcmFuc2FjdGlvbjxUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPjtcbiAgICAgIGNvbnN0IGlucHV0cyA9IHN1aVR4LnN1aVRyYW5zYWN0aW9uLnR4LmlucHV0cyBhcyBhbnlbXTtcbiAgICAgIGNvbnN0IGJ3SW5wdXQgPSBpbnB1dHMuZmluZChcbiAgICAgICAgKGlucCkgPT4gaW5wPy5CYWxhbmNlV2l0aGRyYXdhbCAhPT0gdW5kZWZpbmVkIHx8IGlucD8udmFsdWU/LkJhbGFuY2VXaXRoZHJhd2FsICE9PSB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXhpc3QoYndJbnB1dCk7XG4gICAgICBjb25zdCBidyA9IGJ3SW5wdXQuQmFsYW5jZVdpdGhkcmF3YWwgPz8gYndJbnB1dC52YWx1ZT8uQmFsYW5jZVdpdGhkcmF3YWw7XG4gICAgICBidy5yZXNlcnZhdGlvbi5NYXhBbW91bnRVNjQudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoQU1PVU5UKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgUGF0aCAyYjogc2VsZi1wYXksIGVtcHR5IHBheW1lbnQg4oCUIHVzZXMgd2l0aGRyYXdhbCtyZWRlZW1fZnVuZHMgaW5zdGVhZCBvZiBTcGxpdENvaW5zKEdhc0NvaW4pJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gV2l0aCBnYXNEYXRhLnBheW1lbnQ9W10gdGhlIHJ1bnRpbWUgZXhwb3NlcyBvbmx5IHRoZSBnYXMtYnVkZ2V0IGFtb3VudCB2aWEgR2FzQ29pbiBmb3JcbiAgICAgIC8vIFBUQiBTcGxpdENvaW5zIG9wZXJhdGlvbnMuIFNwbGl0Q29pbnMoR2FzQ29pbiwgW2xhcmdlX2Ftb3VudF0pIGFsd2F5cyBmYWlscyB3aXRoXG4gICAgICAvLyBJbnN1ZmZpY2llbnRDb2luQmFsYW5jZSAoY29uZmlybWVkIGJ5IHByb2R1Y3Rpb24gZmFpbHVyZXMgSkRibnlib3RnM2F4Li4uLCBBVFViZUxYMy4uLikuXG4gICAgICAvLyBQYXRoIDJiIGZpeGVzIHRoaXMgYnkgd2l0aGRyYXdpbmcgZnJvbSB0aGUgYWRkcmVzcyBhY2N1bXVsYXRvciB2aWEgcmVkZWVtX2Z1bmRzLFxuICAgICAgLy8gc3BsaXR0aW5nIGZyb20gdGhhdCBjb2luIG9iamVjdCwgYW5kIG1lcmdpbmcgdGhlIDAtYmFsYW5jZSByZW1haW5kZXIgaW50byBHYXNDb2luLlxuICAgICAgY29uc3Qgc2VsZlBheU5vUGF5bWVudCA9IHsgLi4udGVzdERhdGEuZ2FzRGF0YVdpdGhvdXRHYXNQYXltZW50LCBwYXltZW50OiBbXSB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoW3sgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLCBhbW91bnQ6IEFNT1VOVCB9XSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShzZWxmUGF5Tm9QYXltZW50KTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoQU1PVU5UKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIGNvbnN0IHN1aVR4ID0gdHggYXMgU3VpVHJhbnNhY3Rpb248VHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG5cbiAgICAgIC8vIEdhcyBvd25lciBtdXN0IGVxdWFsIHNlbmRlciAoc2VsZi1wYXkpXG4gICAgICBzdWlUeC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLm93bmVyLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAvLyBQYXltZW50IG11c3QgYmUgZW1wdHkg4oCUIGdhcyBmdW5kZWQgZnJvbSBhZGRyZXNzIGJhbGFuY2UgYnkgdGhlIHJ1bnRpbWVcbiAgICAgIHN1aVR4LnN1aVRyYW5zYWN0aW9uLmdhc0RhdGEucGF5bWVudC5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuXG4gICAgICAvLyBQYXRoIDJiOiBCYWxhbmNlV2l0aGRyYXdhbCBpbnB1dCBNVVNUIGJlIHByZXNlbnQgKHdpdGhkcmF3YWwrcmVkZWVtX2Z1bmRzIGFwcHJvYWNoKVxuICAgICAgY29uc3QgaW5wdXRzID0gc3VpVHguc3VpVHJhbnNhY3Rpb24udHguaW5wdXRzIGFzIGFueVtdO1xuICAgICAgY29uc3QgYndJbnB1dCA9IGlucHV0cy5maW5kKFxuICAgICAgICAoaW5wKSA9PiBpbnA/LkJhbGFuY2VXaXRoZHJhd2FsICE9PSB1bmRlZmluZWQgfHwgaW5wPy52YWx1ZT8uQmFsYW5jZVdpdGhkcmF3YWwgIT09IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICAgIHNob3VsZC5leGlzdChid0lucHV0LCAnUGF0aCAyYjogQmFsYW5jZVdpdGhkcmF3YWwgaW5wdXQgbXVzdCBiZSBwcmVzZW50Jyk7XG4gICAgICBjb25zdCBidyA9IGJ3SW5wdXQuQmFsYW5jZVdpdGhkcmF3YWwgPz8gYndJbnB1dC52YWx1ZT8uQmFsYW5jZVdpdGhkcmF3YWw7XG4gICAgICBidy5yZXNlcnZhdGlvbi5NYXhBbW91bnRVNjQudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoQU1PVU5UKTtcblxuICAgICAgLy8gRmlyc3QgY29tbWFuZCBtdXN0IGJlIE1vdmVDYWxsKHJlZGVlbV9mdW5kcyksIE5PVCBTcGxpdENvaW5zKEdhc0NvaW4pXG4gICAgICBjb25zdCBjb21tYW5kcyA9IHN1aVR4LnN1aVRyYW5zYWN0aW9uLnR4LnRyYW5zYWN0aW9ucyBhcyBhbnlbXTtcbiAgICAgIGNvbW1hbmRzWzBdLmtpbmQuc2hvdWxkLmVxdWFsKCdNb3ZlQ2FsbCcpO1xuICAgICAgY29tbWFuZHNbMF0udGFyZ2V0LnNob3VsZC5lcXVhbCgnMHgyOjpjb2luOjpyZWRlZW1fZnVuZHMnKTtcbiAgICAgIC8vIEZvbGxvd2VkIGJ5OiBTcGxpdENvaW5zKGFkZHJDb2luKSwgVHJhbnNmZXJPYmplY3RzLCBNZXJnZUNvaW5zKEdhc0NvaW4sIGFkZHJDb2luKVxuICAgICAgY29tbWFuZHNbMV0ua2luZC5zaG91bGQuZXF1YWwoJ1NwbGl0Q29pbnMnKTtcbiAgICAgIGNvbW1hbmRzWzJdLmtpbmQuc2hvdWxkLmVxdWFsKCdUcmFuc2Zlck9iamVjdHMnKTtcbiAgICAgIGNvbW1hbmRzWzNdLmtpbmQuc2hvdWxkLmVxdWFsKCdNZXJnZUNvaW5zJyk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgY29uc3QgZGVzZXJpYWxpemVkID0gU3VpVHJhbnNhY3Rpb24uZGVzZXJpYWxpemVTdWlUcmFuc2FjdGlvbihyYXdUeCk7XG4gICAgICBkZXNlcmlhbGl6ZWQuc2VuZGVyLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBkZXNlcmlhbGl6ZWQuZ2FzRGF0YS5vd25lci5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgZGVzZXJpYWxpemVkLmdhc0RhdGEucGF5bWVudC5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuXG4gICAgICAvLyBCYWxhbmNlV2l0aGRyYXdhbCBtdXN0IHN1cnZpdmUgQkNTIHJvdW5kLXRyaXBcbiAgICAgIGNvbnN0IGRlY29kZWRJbnB1dHMgPSBkZXNlcmlhbGl6ZWQudHguaW5wdXRzIGFzIGFueVtdO1xuICAgICAgY29uc3QgZGVjb2RlZEJ3SW5wdXQgPSBkZWNvZGVkSW5wdXRzLmZpbmQoXG4gICAgICAgIChpbnA6IGFueSkgPT4gaW5wPy5CYWxhbmNlV2l0aGRyYXdhbCAhPT0gdW5kZWZpbmVkIHx8IGlucD8udmFsdWU/LkJhbGFuY2VXaXRoZHJhd2FsICE9PSB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXhpc3QoZGVjb2RlZEJ3SW5wdXQsICdCYWxhbmNlV2l0aGRyYXdhbCBtdXN0IHN1cnZpdmUgQkNTIHJvdW5kLXRyaXAgZm9yIFBhdGggMmInKTtcblxuICAgICAgY29uc3QgcmVidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIHJlYnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkgfSwgQnVmZmVyLmZyb20odGVzdERhdGEuc2VuZGVyLnNpZ25hdHVyZUhleCkpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgcmVidWlsZGVyLmJ1aWxkKCk7XG4gICAgICByZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwocmF3VHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBQYXRoIDJiIHdpdGggVmFsaWREdXJpbmcgZXhwaXJhdGlvbiAoc2VsZi1wYXksIGVtcHR5IHBheW1lbnQpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gUGF0aCAyYiB3aXRoIFZhbGlkRHVyaW5nIGV4cGlyYXRpb24g4oCUIHJlcXVpcmVkIHdoZW4gZ2FzRGF0YS5wYXltZW50PVtdIHRvIHByZXZlbnRcbiAgICAgIC8vIHJlcGxheSBhdHRhY2tzLiBVc2VzIHdpdGhkcmF3YWwrcmVkZWVtX2Z1bmRzIHRvIG1hdGVyaWFsaXNlIHRyYW5zZmVyIGFtb3VudCBmcm9tIHRoZVxuICAgICAgLy8gYWRkcmVzcyBhY2N1bXVsYXRvciwgTk9UIFNwbGl0Q29pbnMoR2FzQ29pbikgd2hpY2ggZmFpbHMgd2l0aCBJbnN1ZmZpY2llbnRDb2luQmFsYW5jZS5cbiAgICAgIGNvbnN0IEdFTkVTSVNfQ0hBSU5fSUQgPSAnR0FGcENDY1JDeFRkRmZVRU1iUWJrTEJhWnkyUk5pR0FmdkZCaE1OcHEya1QnO1xuICAgICAgY29uc3Qgc2VsZlBheU5vUGF5bWVudCA9IHsgLi4udGVzdERhdGEuZ2FzRGF0YVdpdGhvdXRHYXNQYXltZW50LCBwYXltZW50OiBbXSB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoW3sgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLCBhbW91bnQ6IEFNT1VOVCB9XSk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YShzZWxmUGF5Tm9QYXltZW50KTtcbiAgICAgIHR4QnVpbGRlci5mdW5kc0luQWRkcmVzc0JhbGFuY2UoQU1PVU5UKTtcbiAgICAgIHR4QnVpbGRlci5leHBpcmF0aW9uKHtcbiAgICAgICAgVmFsaWREdXJpbmc6IHtcbiAgICAgICAgICBtaW5FcG9jaDogeyBTb21lOiA1MDAgfSxcbiAgICAgICAgICBtYXhFcG9jaDogeyBTb21lOiA1MDEgfSxcbiAgICAgICAgICBtaW5UaW1lc3RhbXA6IHsgTm9uZTogbnVsbCB9LFxuICAgICAgICAgIG1heFRpbWVzdGFtcDogeyBOb25lOiBudWxsIH0sXG4gICAgICAgICAgY2hhaW46IEdFTkVTSVNfQ0hBSU5fSUQsXG4gICAgICAgICAgbm9uY2U6IDB4ZGVhZGJlZWYsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG5cbiAgICAgIGNvbnN0IHN1aVR4ID0gdHggYXMgU3VpVHJhbnNhY3Rpb248VHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj47XG5cbiAgICAgIC8vIFNlbGYtcGF5OiBvd25lciA9PT0gc2VuZGVyLCBwYXltZW50IGVtcHR5XG4gICAgICBzdWlUeC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLm93bmVyLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBzdWlUeC5zdWlUcmFuc2FjdGlvbi5nYXNEYXRhLnBheW1lbnQubGVuZ3RoLnNob3VsZC5lcXVhbCgwKTtcblxuICAgICAgLy8gUGF0aCAyYjogQmFsYW5jZVdpdGhkcmF3YWwgaW5wdXQgTVVTVCBiZSBwcmVzZW50XG4gICAgICBjb25zdCBpbnB1dHMgPSBzdWlUeC5zdWlUcmFuc2FjdGlvbi50eC5pbnB1dHMgYXMgYW55W107XG4gICAgICBjb25zdCBid0lucHV0ID0gaW5wdXRzLmZpbmQoXG4gICAgICAgIChpbnApID0+IGlucD8uQmFsYW5jZVdpdGhkcmF3YWwgIT09IHVuZGVmaW5lZCB8fCBpbnA/LnZhbHVlPy5CYWxhbmNlV2l0aGRyYXdhbCAhPT0gdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgc2hvdWxkLmV4aXN0KGJ3SW5wdXQsICdQYXRoIDJiOiBCYWxhbmNlV2l0aGRyYXdhbCBpbnB1dCBtdXN0IGJlIHByZXNlbnQnKTtcblxuICAgICAgLy8gRmlyc3QgY29tbWFuZDogTW92ZUNhbGwocmVkZWVtX2Z1bmRzKSwgTk9UIFNwbGl0Q29pbnMoR2FzQ29pbilcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gc3VpVHguc3VpVHJhbnNhY3Rpb24udHgudHJhbnNhY3Rpb25zIGFzIGFueVtdO1xuICAgICAgY29tbWFuZHNbMF0ua2luZC5zaG91bGQuZXF1YWwoJ01vdmVDYWxsJyk7XG4gICAgICBjb21tYW5kc1swXS50YXJnZXQuc2hvdWxkLmVxdWFsKCcweDI6OmNvaW46OnJlZGVlbV9mdW5kcycpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG5cbiAgICAgIGNvbnN0IGRlc2VyaWFsaXplZCA9IFN1aVRyYW5zYWN0aW9uLmRlc2VyaWFsaXplU3VpVHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgICAgZGVzZXJpYWxpemVkLnNlbmRlci5zaG91bGQuZXF1YWwodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgZGVzZXJpYWxpemVkLmdhc0RhdGEucGF5bWVudC5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuXG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gKGRlc2VyaWFsaXplZC5leHBpcmF0aW9uIGFzIGFueSk/LlZhbGlkRHVyaW5nO1xuICAgICAgc2hvdWxkLmV4aXN0KGV4cGlyYXRpb24sICdWYWxpZER1cmluZyBleHBpcmF0aW9uIG11c3Qgc3Vydml2ZSBCQ1Mgcm91bmQtdHJpcCcpO1xuICAgICAgTnVtYmVyKGV4cGlyYXRpb24ubWluRXBvY2g/LlNvbWUgPz8gZXhwaXJhdGlvbi5taW5FcG9jaCkuc2hvdWxkLmVxdWFsKDUwMCk7XG4gICAgICBOdW1iZXIoZXhwaXJhdGlvbi5tYXhFcG9jaD8uU29tZSA/PyBleHBpcmF0aW9uLm1heEVwb2NoKS5zaG91bGQuZXF1YWwoNTAxKTtcbiAgICAgIGV4cGlyYXRpb24uY2hhaW4uc2hvdWxkLmVxdWFsKEdFTkVTSVNfQ0hBSU5fSUQpO1xuICAgICAgTnVtYmVyKGV4cGlyYXRpb24ubm9uY2UpLnNob3VsZC5lcXVhbCgweGRlYWRiZWVmKTtcblxuICAgICAgLy8gQmFsYW5jZVdpdGhkcmF3YWwgbXVzdCBzdXJ2aXZlIEJDUyByb3VuZC10cmlwXG4gICAgICBjb25zdCBkZWNvZGVkSW5wdXRzID0gZGVzZXJpYWxpemVkLnR4LmlucHV0cyBhcyBhbnlbXTtcbiAgICAgIGNvbnN0IGRlY29kZWRCd0lucHV0ID0gZGVjb2RlZElucHV0cy5maW5kKFxuICAgICAgICAoaW5wOiBhbnkpID0+IGlucD8uQmFsYW5jZVdpdGhkcmF3YWwgIT09IHVuZGVmaW5lZCB8fCBpbnA/LnZhbHVlPy5CYWxhbmNlV2l0aGRyYXdhbCAhPT0gdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWRCd0lucHV0LCAnQmFsYW5jZVdpdGhkcmF3YWwgbXVzdCBzdXJ2aXZlIEJDUyByb3VuZC10cmlwIGZvciBQYXRoIDJiJyk7XG5cbiAgICAgIGNvbnN0IHJlYnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICByZWJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5IH0sIEJ1ZmZlci5mcm9tKHRlc3REYXRhLnNlbmRlci5zaWduYXR1cmVIZXgpKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IHJlYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmVidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHJhd1R4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW5kIGNvcnJlY3RseSBkZWNvZGUgYSBNb3ZlQ2FsbCB0byAweDI6OmNvaW46OnJlZGVlbV9mdW5kcyB3aXRoIEJhbGFuY2VXaXRoZHJhd2FsIGFyZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRTcG9uc29yZWRUeFdpdGhBZGRyZXNzQmFsYW5jZSgpO1xuICAgICAgY29uc3Qgc3VpVHggPSB0eCBhcyBTdWlUcmFuc2FjdGlvbjxUcmFuc2ZlclByb2dyYW1tYWJsZVRyYW5zYWN0aW9uPjtcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gc3VpVHguc3VpVHJhbnNhY3Rpb24udHgudHJhbnNhY3Rpb25zIGFzIGFueVtdO1xuXG4gICAgICBjb21tYW5kc1swXS5raW5kLnNob3VsZC5lcXVhbCgnTW92ZUNhbGwnKTtcbiAgICAgIGNvbW1hbmRzWzBdLnRhcmdldC5zaG91bGQuZXF1YWwoJzB4Mjo6Y29pbjo6cmVkZWVtX2Z1bmRzJyk7XG4gICAgICBjb21tYW5kc1swXS50eXBlQXJndW1lbnRzWzBdLnNob3VsZC5lcXVhbCgnMHgyOjpzdWk6OlNVSScpO1xuXG4gICAgICAvLyBUaGUgYXJndW1lbnQgdG8gcmVkZWVtX2Z1bmRzIG11c3QgcmVmZXJlbmNlIHRoZSBCYWxhbmNlV2l0aGRyYXdhbCBpbnB1dCAoaW5kZXggMClcbiAgICAgIGNvbnN0IGFyZyA9IGNvbW1hbmRzWzBdLmFyZ3VtZW50c1swXTtcbiAgICAgIGFyZy5raW5kLnNob3VsZC5lcXVhbCgnSW5wdXQnKTtcbiAgICAgIGFyZy5pbmRleC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICBhcmcudHlwZS5zaG91bGQuZXF1YWwoJ29iamVjdCcpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|