@bitgo/sdk-coin-canton 1.21.0 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/src/canton.d.ts +6 -1
  2. package/dist/src/canton.d.ts.map +1 -1
  3. package/dist/src/canton.js +105 -2
  4. package/dist/src/lib/cantonCommandBuilder.d.ts +63 -0
  5. package/dist/src/lib/cantonCommandBuilder.d.ts.map +1 -0
  6. package/dist/src/lib/cantonCommandBuilder.js +155 -0
  7. package/dist/src/lib/iface.d.ts +31 -1
  8. package/dist/src/lib/iface.d.ts.map +1 -1
  9. package/dist/src/lib/iface.js +3 -1
  10. package/dist/src/lib/index.d.ts +1 -0
  11. package/dist/src/lib/index.d.ts.map +1 -1
  12. package/dist/src/lib/index.js +4 -2
  13. package/dist/src/lib/resourcesInterface.d.ts +1 -1
  14. package/dist/src/lib/resourcesInterface.d.ts.map +1 -1
  15. package/dist/src/lib/resourcesInterface.js +1 -1
  16. package/dist/src/lib/transaction/transaction.d.ts +4 -0
  17. package/dist/src/lib/transaction/transaction.d.ts.map +1 -1
  18. package/dist/src/lib/transaction/transaction.js +79 -8
  19. package/dist/src/lib/transactionBuilderFactory.d.ts +2 -0
  20. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  21. package/dist/src/lib/transactionBuilderFactory.js +8 -1
  22. package/dist/src/lib/utils.d.ts +27 -1
  23. package/dist/src/lib/utils.d.ts.map +1 -1
  24. package/dist/src/lib/utils.js +294 -1
  25. package/dist/test/resources.d.ts +34 -0
  26. package/dist/test/resources.d.ts.map +1 -1
  27. package/dist/test/resources.js +36 -2
  28. package/dist/test/unit/builder/allocationAllocate/allocationAllocateBuilder.js +33 -1
  29. package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.d.ts +2 -0
  30. package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.d.ts.map +1 -0
  31. package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.js +296 -0
  32. package/dist/test/unit/canton.js +489 -1
  33. package/dist/test/unit/utils.js +252 -1
  34. package/dist/tsconfig.tsbuildinfo +1 -1
  35. package/package.json +6 -6
@@ -7,6 +7,7 @@ const assert_1 = __importDefault(require("assert"));
7
7
  const should_1 = __importDefault(require("should"));
8
8
  const statics_1 = require("@bitgo/statics");
9
9
  const src_1 = require("../../../../src");
10
+ const resources_1 = require("../../../resources");
10
11
  const commandId = 'a1b2c3d4-e5f6-7890-abcd-ef1234567890';
11
12
  const amount = 100;
12
13
  const token = 'canton:amulet-usd';
@@ -305,5 +306,36 @@ describe('AllocationAllocate Builder', () => {
305
306
  txBuilder.setTransaction(prepareCommandResponse);
306
307
  assert_1.default.deepEqual(tx.prepareCommand, prepareCommandResponse);
307
308
  });
309
+ describe('Prepared transaction parsing', () => {
310
+ it('should parse the allocation allocate prepared transaction', function () {
311
+ const txBuilder = new src_1.AllocationAllocateBuilder(statics_1.coins.get('tcanton'));
312
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
313
+ txBuilder.initBuilder(tx);
314
+ txBuilder.commandId(commandId);
315
+ txBuilder.setTransaction(resources_1.CantonAllocationAllocatePrepareResponse);
316
+ const txData = txBuilder.transaction.toJson();
317
+ should_1.default.exist(txData);
318
+ assert_1.default.equal(txData.sender, 'ravi-2-step-party::122092e7d33ac10c0f3d55976342f37555df05da5b742956d56a62ae2367769079d2');
319
+ // receiver = transferLeg.receiver from DvpLegAllocation — the actual settlement counterparty
320
+ assert_1.default.equal(txData.receiver, 'ravi-2-step-party-new::122092e7d33ac10c0f3d55976342f37555df05da5b742956d56a62ae2367769079d2');
321
+ assert_1.default.equal(txData.amount, '50000000000');
322
+ });
323
+ it('should validate the raw allocation allocate transaction', async function () {
324
+ const txBuilder = new src_1.AllocationAllocateBuilder(statics_1.coins.get('tcanton'));
325
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
326
+ txBuilder.initBuilder(tx);
327
+ txBuilder.commandId(commandId);
328
+ txBuilder.setTransaction(resources_1.CantonAllocationAllocatePrepareResponse);
329
+ await txBuilder.validateRawTransaction(resources_1.CantonAllocationAllocatePrepareResponse.preparedTransaction);
330
+ });
331
+ it('should validate the allocation allocate transaction', async function () {
332
+ const txBuilder = new src_1.AllocationAllocateBuilder(statics_1.coins.get('tcanton'));
333
+ const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
334
+ tx.prepareCommand = resources_1.CantonAllocationAllocatePrepareResponse;
335
+ txBuilder.initBuilder(tx);
336
+ txBuilder.setTransaction(resources_1.CantonAllocationAllocatePrepareResponse);
337
+ await txBuilder.validateTransaction(tx);
338
+ });
339
+ });
308
340
  });
309
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9idWlsZGVyL2FsbG9jYXRpb25BbGxvY2F0ZS9hbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUU1Qiw0Q0FBdUM7QUFFdkMseUNBQXlFO0FBR3pFLE1BQU0sU0FBUyxHQUFHLHNDQUFzQyxDQUFDO0FBQ3pELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUNuQixNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQztBQUNsQyxNQUFNLFVBQVUsR0FBRyw2RUFBNkUsQ0FBQztBQUNqRyxNQUFNLFVBQVUsR0FDZCw0SUFBNEksQ0FBQztBQUMvSSxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQztBQUNuQyxNQUFNLGFBQWEsR0FBRywrQkFBK0IsQ0FBQztBQUN0RCxNQUFNLGNBQWMsR0FBRyw2QkFBNkIsQ0FBQztBQUNyRCxNQUFNLFlBQVksR0FBRyw2QkFBNkIsQ0FBQztBQUNuRCxNQUFNLGVBQWUsR0FBRyw2RUFBNkUsQ0FBQztBQUN0RyxNQUFNLGFBQWEsR0FBRyw2RUFBNkUsQ0FBQztBQUNwRyxNQUFNLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQztBQUUxQywrQ0FBK0M7QUFDL0MsU0FBUyxvQkFBb0IsQ0FBQyxTQUFvQztJQUNoRSxPQUFPLFNBQVM7U0FDYixTQUFTLENBQUMsU0FBUyxDQUFDO1NBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDZCxLQUFLLENBQUMsS0FBSyxDQUFDO1NBQ1osVUFBVSxDQUFDLFVBQVUsQ0FBQztTQUN0QixVQUFVLENBQUMsVUFBVSxDQUFDO1NBQ3RCLE9BQU8sQ0FBQyxPQUFPLENBQUM7U0FDaEIsYUFBYSxDQUFDLGFBQWEsQ0FBQztTQUM1QixjQUFjLENBQUMsY0FBYyxDQUFDO1NB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Q0FBQyxDQUFDLENBQUM7UUFDakQsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixNQUFNLHNCQUFzQixHQUFHO1lBQzdCLHVCQUF1QixFQUFFLFFBQVE7WUFDakMsb0JBQW9CLEVBQUUsMkJBQTJCO1NBQ2xELENBQUM7UUFDRixTQUFTLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDakQsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0lBQzlELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBDYW50b25BbGxvY2F0aW9uQWxsb2NhdGVSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5cbmNvbnN0IGNvbW1hbmRJZCA9ICdhMWIyYzNkNC1lNWY2LTc4OTAtYWJjZC1lZjEyMzQ1Njc4OTAnO1xuY29uc3QgYW1vdW50ID0gMTAwO1xuY29uc3QgdG9rZW4gPSAnY2FudG9uOmFtdWxldC11c2QnO1xuY29uc3Qgb3BlcmF0b3JJZCA9ICcxMjIwNTo6MTIyMDViNGUzNTM3YTk1MTI2ZDkwNjA0NTkyMzQ0ZDhhZDNjM2RkY2NkYTRmNzk5MDE5NTQyODBlZTE5YzU3NjcxNGQnO1xuY29uc3QgY29udHJhY3RJZCA9XG4gICcwMDFiNTQ5YmZhODMzYmFiNjYxYWIzMGU0ZDBhM2FiMGVjMDFmY2M0YTJiZWY1MzY5Nzk1ZjQ5MjgxNDc3MDYzNTNjYTExMTIyMDVhOGQwZTc4MGNmM2IzMTE1Y2Y4YmUwZDYzMTVmNGFlZDZhMWMyNWI2N2U4YzVkNjRjZjk4NDhkMDQ1OGZkMTcnO1xuY29uc3QgdHJhZGVJZCA9ICd0cmFkZS05OTg4Nzc2NjU1JztcbmNvbnN0IHRyYW5zZmVyTGVnSWQgPSAndHJhZGUtOTk4ODc3NjY1NS1zZWN1cml0eS1sZWcnO1xuY29uc3QgYWxsb2NhdGVCZWZvcmUgPSAnMjAyNi0wNS0wNlQxNjo0NjoxNy4xODQ2MDlaJztcbmNvbnN0IHNldHRsZUJlZm9yZSA9ICcyMDI2LTA1LTA3VDE2OjQ2OjE3LjE4NDYwOVonO1xuY29uc3QgcmVjZWl2ZXJQYXJ0eUlkID0gJzEyMjA2OjoxMjIwNmE0ZTM1MzdhOTUxMjZkOTA2MDQ1OTIzNDRkOGFkM2MzZGRjY2RhNGY3OTkwMTk1NDI4MGVlMTljNTc2NzE0ZCc7XG5jb25zdCBzZW5kZXJQYXJ0eUlkID0gJzEyMjA3OjoxMjIwN2E0ZTM1MzdhOTUxMjZkOTA2MDQ1OTIzNDRkOGFkM2MzZGRjY2RhNGY3OTkwMTk1NDI4MGVlMTljNTc2NzE0ZCc7XG5jb25zdCBjb21tZW50ID0gJ3Rlc3QgYWxsb2NhdGlvbiBjb21tZW50JztcblxuLy8gSGVscGVyIHRvIGJ1aWxkIHdpdGggYWxsIHJlcXVpcmVkIGZpZWxkcyBzZXRcbmZ1bmN0aW9uIGJ1aWxkV2l0aEFsbFJlcXVpcmVkKHR4QnVpbGRlcjogQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcik6IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIge1xuICByZXR1cm4gdHhCdWlsZGVyXG4gICAgLmNvbW1hbmRJZChjb21tYW5kSWQpXG4gICAgLmFtb3VudChhbW91bnQpXG4gICAgLnRva2VuKHRva2VuKVxuICAgIC5vcGVyYXRvcklkKG9wZXJhdG9ySWQpXG4gICAgLmNvbnRyYWN0SWQoY29udHJhY3RJZClcbiAgICAudHJhZGVJZCh0cmFkZUlkKVxuICAgIC50cmFuc2ZlckxlZ0lkKHRyYW5zZmVyTGVnSWQpXG4gICAgLmFsbG9jYXRlQmVmb3JlKGFsbG9jYXRlQmVmb3JlKVxuICAgIC5zZXR0bGVCZWZvcmUoc2V0dGxlQmVmb3JlKVxuICAgIC5yZWNlaXZlclBhcnR5SWQocmVjZWl2ZXJQYXJ0eUlkKVxuICAgIC5zZW5kZXJQYXJ0eUlkKHNlbmRlclBhcnR5SWQpO1xufVxuXG5kZXNjcmliZSgnQWxsb2NhdGlvbkFsbG9jYXRlIEJ1aWxkZXInLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgYnVpbGQgdGhlIGFsbG9jYXRpb24gYWxsb2NhdGUgcmVxdWVzdCBvYmplY3Qgd2l0aCBhbGwgZmllbGRzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICBidWlsZFdpdGhBbGxSZXF1aXJlZCh0eEJ1aWxkZXIpLmNvbW1lbnQoY29tbWVudCk7XG4gICAgY29uc3QgcmVxdWVzdE9iajogQ2FudG9uQWxsb2NhdGlvbkFsbG9jYXRlUmVxdWVzdCA9IHR4QnVpbGRlci50b1JlcXVlc3RPYmplY3QoKTtcbiAgICBzaG91bGQuZXhpc3QocmVxdWVzdE9iaik7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcXVlc3RPYmouY29tbWFuZElkLCBjb21tYW5kSWQpO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLmFtb3VudCwgYW1vdW50KTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai50b2tlbiwgdG9rZW4pO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLm9wZXJhdG9ySWQsIG9wZXJhdG9ySWQpO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLmNvbnRyYWN0SWQsIGNvbnRyYWN0SWQpO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLnRyYWRlSWQsIHRyYWRlSWQpO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLnRyYW5zZmVyTGVnSWQsIHRyYW5zZmVyTGVnSWQpO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLmFsbG9jYXRlQmVmb3JlLCBhbGxvY2F0ZUJlZm9yZSk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcXVlc3RPYmouc2V0dGxlQmVmb3JlLCBzZXR0bGVCZWZvcmUpO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLnJlY2VpdmVyUGFydHlJZCwgcmVjZWl2ZXJQYXJ0eUlkKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai5zZW5kZXJQYXJ0eUlkLCBzZW5kZXJQYXJ0eUlkKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai5jb21tZW50LCBjb21tZW50KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCB0aGUgYWxsb2NhdGlvbiBhbGxvY2F0ZSByZXF1ZXN0IG9iamVjdCB3aXRob3V0IG9wdGlvbmFsIGNvbW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIGJ1aWxkV2l0aEFsbFJlcXVpcmVkKHR4QnVpbGRlcik7XG4gICAgY29uc3QgcmVxdWVzdE9iajogQ2FudG9uQWxsb2NhdGlvbkFsbG9jYXRlUmVxdWVzdCA9IHR4QnVpbGRlci50b1JlcXVlc3RPYmplY3QoKTtcbiAgICBzaG91bGQuZXhpc3QocmVxdWVzdE9iaik7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcXVlc3RPYmouY29tbWVudCwgdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzZXQgdGhlIHRyYW5zYWN0aW9uIGlkIHRvIHRoZSBjb21tYW5kSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHR4QnVpbGRlci5jb21tYW5kSWQoY29tbWFuZElkKTtcbiAgICBhc3NlcnQuZXF1YWwodHguaWQsIGNvbW1hbmRJZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgY29tbWFuZElkIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHR4QnVpbGRlclxuICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAudG9rZW4odG9rZW4pXG4gICAgICAub3BlcmF0b3JJZChvcGVyYXRvcklkKVxuICAgICAgLmNvbnRyYWN0SWQoY29udHJhY3RJZClcbiAgICAgIC50cmFkZUlkKHRyYWRlSWQpXG4gICAgICAudHJhbnNmZXJMZWdJZCh0cmFuc2ZlckxlZ0lkKVxuICAgICAgLmFsbG9jYXRlQmVmb3JlKGFsbG9jYXRlQmVmb3JlKVxuICAgICAgLnNldHRsZUJlZm9yZShzZXR0bGVCZWZvcmUpXG4gICAgICAucmVjZWl2ZXJQYXJ0eUlkKHJlY2VpdmVyUGFydHlJZClcbiAgICAgIC5zZW5kZXJQYXJ0eUlkKHNlbmRlclBhcnR5SWQpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRvUmVxdWVzdE9iamVjdCgpLCAvY29tbWFuZElkIGlzIG1pc3NpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBhbW91bnQgaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgdHhCdWlsZGVyXG4gICAgICAuY29tbWFuZElkKGNvbW1hbmRJZClcbiAgICAgIC50b2tlbih0b2tlbilcbiAgICAgIC5vcGVyYXRvcklkKG9wZXJhdG9ySWQpXG4gICAgICAuY29udHJhY3RJZChjb250cmFjdElkKVxuICAgICAgLnRyYWRlSWQodHJhZGVJZClcbiAgICAgIC50cmFuc2ZlckxlZ0lkKHRyYW5zZmVyTGVnSWQpXG4gICAgICAuYWxsb2NhdGVCZWZvcmUoYWxsb2NhdGVCZWZvcmUpXG4gICAgICAuc2V0dGxlQmVmb3JlKHNldHRsZUJlZm9yZSlcbiAgICAgIC5yZWNlaXZlclBhcnR5SWQocmVjZWl2ZXJQYXJ0eUlkKVxuICAgICAgLnNlbmRlclBhcnR5SWQoc2VuZGVyUGFydHlJZCk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9hbW91bnQgaXMgbWlzc2luZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIHRva2VuIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHR4QnVpbGRlclxuICAgICAgLmNvbW1hbmRJZChjb21tYW5kSWQpXG4gICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgIC5vcGVyYXRvcklkKG9wZXJhdG9ySWQpXG4gICAgICAuY29udHJhY3RJZChjb250cmFjdElkKVxuICAgICAgLnRyYWRlSWQodHJhZGVJZClcbiAgICAgIC50cmFuc2ZlckxlZ0lkKHRyYW5zZmVyTGVnSWQpXG4gICAgICAuYWxsb2NhdGVCZWZvcmUoYWxsb2NhdGVCZWZvcmUpXG4gICAgICAuc2V0dGxlQmVmb3JlKHNldHRsZUJlZm9yZSlcbiAgICAgIC5yZWNlaXZlclBhcnR5SWQocmVjZWl2ZXJQYXJ0eUlkKVxuICAgICAgLnNlbmRlclBhcnR5SWQoc2VuZGVyUGFydHlJZCk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC90b2tlbiBpcyBtaXNzaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgb3BlcmF0b3JJZCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5jb21tYW5kSWQoY29tbWFuZElkKVxuICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAudG9rZW4odG9rZW4pXG4gICAgICAuY29udHJhY3RJZChjb250cmFjdElkKVxuICAgICAgLnRyYWRlSWQodHJhZGVJZClcbiAgICAgIC50cmFuc2ZlckxlZ0lkKHRyYW5zZmVyTGVnSWQpXG4gICAgICAuYWxsb2NhdGVCZWZvcmUoYWxsb2NhdGVCZWZvcmUpXG4gICAgICAuc2V0dGxlQmVmb3JlKHNldHRsZUJlZm9yZSlcbiAgICAgIC5yZWNlaXZlclBhcnR5SWQocmVjZWl2ZXJQYXJ0eUlkKVxuICAgICAgLnNlbmRlclBhcnR5SWQoc2VuZGVyUGFydHlJZCk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9vcGVyYXRvcklkIGlzIG1pc3NpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb250cmFjdElkIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHR4QnVpbGRlclxuICAgICAgLmNvbW1hbmRJZChjb21tYW5kSWQpXG4gICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgIC50b2tlbih0b2tlbilcbiAgICAgIC5vcGVyYXRvcklkKG9wZXJhdG9ySWQpXG4gICAgICAudHJhZGVJZCh0cmFkZUlkKVxuICAgICAgLnRyYW5zZmVyTGVnSWQodHJhbnNmZXJMZWdJZClcbiAgICAgIC5hbGxvY2F0ZUJlZm9yZShhbGxvY2F0ZUJlZm9yZSlcbiAgICAgIC5zZXR0bGVCZWZvcmUoc2V0dGxlQmVmb3JlKVxuICAgICAgLnJlY2VpdmVyUGFydHlJZChyZWNlaXZlclBhcnR5SWQpXG4gICAgICAuc2VuZGVyUGFydHlJZChzZW5kZXJQYXJ0eUlkKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci50b1JlcXVlc3RPYmplY3QoKSwgL2NvbnRyYWN0SWQgaXMgbWlzc2luZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIHRyYWRlSWQgaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgdHhCdWlsZGVyXG4gICAgICAuY29tbWFuZElkKGNvbW1hbmRJZClcbiAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgLnRva2VuKHRva2VuKVxuICAgICAgLm9wZXJhdG9ySWQob3BlcmF0b3JJZClcbiAgICAgIC5jb250cmFjdElkKGNvbnRyYWN0SWQpXG4gICAgICAudHJhbnNmZXJMZWdJZCh0cmFuc2ZlckxlZ0lkKVxuICAgICAgLmFsbG9jYXRlQmVmb3JlKGFsbG9jYXRlQmVmb3JlKVxuICAgICAgLnNldHRsZUJlZm9yZShzZXR0bGVCZWZvcmUpXG4gICAgICAucmVjZWl2ZXJQYXJ0eUlkKHJlY2VpdmVyUGFydHlJZClcbiAgICAgIC5zZW5kZXJQYXJ0eUlkKHNlbmRlclBhcnR5SWQpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRvUmVxdWVzdE9iamVjdCgpLCAvdHJhZGVJZCBpcyBtaXNzaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgdHJhbnNmZXJMZWdJZCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5jb21tYW5kSWQoY29tbWFuZElkKVxuICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAudG9rZW4odG9rZW4pXG4gICAgICAub3BlcmF0b3JJZChvcGVyYXRvcklkKVxuICAgICAgLmNvbnRyYWN0SWQoY29udHJhY3RJZClcbiAgICAgIC50cmFkZUlkKHRyYWRlSWQpXG4gICAgICAuYWxsb2NhdGVCZWZvcmUoYWxsb2NhdGVCZWZvcmUpXG4gICAgICAuc2V0dGxlQmVmb3JlKHNldHRsZUJlZm9yZSlcbiAgICAgIC5yZWNlaXZlclBhcnR5SWQocmVjZWl2ZXJQYXJ0eUlkKVxuICAgICAgLnNlbmRlclBhcnR5SWQoc2VuZGVyUGFydHlJZCk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC90cmFuc2ZlckxlZ0lkIGlzIG1pc3NpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBhbGxvY2F0ZUJlZm9yZSBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5jb21tYW5kSWQoY29tbWFuZElkKVxuICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAudG9rZW4odG9rZW4pXG4gICAgICAub3BlcmF0b3JJZChvcGVyYXRvcklkKVxuICAgICAgLmNvbnRyYWN0SWQoY29udHJhY3RJZClcbiAgICAgIC50cmFkZUlkKHRyYWRlSWQpXG4gICAgICAudHJhbnNmZXJMZWdJZCh0cmFuc2ZlckxlZ0lkKVxuICAgICAgLnNldHRsZUJlZm9yZShzZXR0bGVCZWZvcmUpXG4gICAgICAucmVjZWl2ZXJQYXJ0eUlkKHJlY2VpdmVyUGFydHlJZClcbiAgICAgIC5zZW5kZXJQYXJ0eUlkKHNlbmRlclBhcnR5SWQpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRvUmVxdWVzdE9iamVjdCgpLCAvYWxsb2NhdGVCZWZvcmUgaXMgbWlzc2luZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIHNldHRsZUJlZm9yZSBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5jb21tYW5kSWQoY29tbWFuZElkKVxuICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAudG9rZW4odG9rZW4pXG4gICAgICAub3BlcmF0b3JJZChvcGVyYXRvcklkKVxuICAgICAgLmNvbnRyYWN0SWQoY29udHJhY3RJZClcbiAgICAgIC50cmFkZUlkKHRyYWRlSWQpXG4gICAgICAudHJhbnNmZXJMZWdJZCh0cmFuc2ZlckxlZ0lkKVxuICAgICAgLmFsbG9jYXRlQmVmb3JlKGFsbG9jYXRlQmVmb3JlKVxuICAgICAgLnJlY2VpdmVyUGFydHlJZChyZWNlaXZlclBhcnR5SWQpXG4gICAgICAuc2VuZGVyUGFydHlJZChzZW5kZXJQYXJ0eUlkKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci50b1JlcXVlc3RPYmplY3QoKSwgL3NldHRsZUJlZm9yZSBpcyBtaXNzaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgcmVjZWl2ZXJQYXJ0eUlkIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHR4QnVpbGRlclxuICAgICAgLmNvbW1hbmRJZChjb21tYW5kSWQpXG4gICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgIC50b2tlbih0b2tlbilcbiAgICAgIC5vcGVyYXRvcklkKG9wZXJhdG9ySWQpXG4gICAgICAuY29udHJhY3RJZChjb250cmFjdElkKVxuICAgICAgLnRyYWRlSWQodHJhZGVJZClcbiAgICAgIC50cmFuc2ZlckxlZ0lkKHRyYW5zZmVyTGVnSWQpXG4gICAgICAuYWxsb2NhdGVCZWZvcmUoYWxsb2NhdGVCZWZvcmUpXG4gICAgICAuc2V0dGxlQmVmb3JlKHNldHRsZUJlZm9yZSlcbiAgICAgIC5zZW5kZXJQYXJ0eUlkKHNlbmRlclBhcnR5SWQpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRvUmVxdWVzdE9iamVjdCgpLCAvcmVjZWl2ZXJQYXJ0eUlkIGlzIG1pc3NpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBzZW5kZXJQYXJ0eUlkIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHR4QnVpbGRlclxuICAgICAgLmNvbW1hbmRJZChjb21tYW5kSWQpXG4gICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgIC50b2tlbih0b2tlbilcbiAgICAgIC5vcGVyYXRvcklkKG9wZXJhdG9ySWQpXG4gICAgICAuY29udHJhY3RJZChjb250cmFjdElkKVxuICAgICAgLnRyYWRlSWQodHJhZGVJZClcbiAgICAgIC50cmFuc2ZlckxlZ0lkKHRyYW5zZmVyTGVnSWQpXG4gICAgICAuYWxsb2NhdGVCZWZvcmUoYWxsb2NhdGVCZWZvcmUpXG4gICAgICAuc2V0dGxlQmVmb3JlKHNldHRsZUJlZm9yZSlcbiAgICAgIC5yZWNlaXZlclBhcnR5SWQocmVjZWl2ZXJQYXJ0eUlkKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci50b1JlcXVlc3RPYmplY3QoKSwgL3NlbmRlclBhcnR5SWQgaXMgbWlzc2luZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIGNvbW1hbmRJZCBpcyBhbiBlbXB0eSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLmNvbW1hbmRJZCgnJyksIC9jb21tYW5kSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB0b2tlbiBpcyBhbiBlbXB0eSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRva2VuKCcnKSwgL3Rva2VuIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgb3BlcmF0b3JJZCBpcyBhbiBlbXB0eSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLm9wZXJhdG9ySWQoJycpLCAvb3BlcmF0b3JJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIGNvbnRyYWN0SWQgaXMgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5jb250cmFjdElkKCcnKSwgL2NvbnRyYWN0SWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB0cmFkZUlkIGlzIGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudHJhZGVJZCgnJyksIC90cmFkZUlkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgdHJhbnNmZXJMZWdJZCBpcyBhbiBlbXB0eSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRyYW5zZmVyTGVnSWQoJycpLCAvdHJhbnNmZXJMZWdJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIGFsbG9jYXRlQmVmb3JlIGlzIGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuYWxsb2NhdGVCZWZvcmUoJycpLCAvYWxsb2NhdGVCZWZvcmUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBzZXR0bGVCZWZvcmUgaXMgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5zZXR0bGVCZWZvcmUoJycpLCAvc2V0dGxlQmVmb3JlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgcmVjZWl2ZXJQYXJ0eUlkIGlzIGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIucmVjZWl2ZXJQYXJ0eUlkKCcnKSwgL3JlY2VpdmVyUGFydHlJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHNldCB0aGUgcHJlcGFyZUNvbW1hbmQgdmlhIHNldFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICBjb25zdCBwcmVwYXJlQ29tbWFuZFJlc3BvbnNlID0ge1xuICAgICAgcHJlcGFyZWRUcmFuc2FjdGlvbkhhc2g6ICdhYmMxMjMnLFxuICAgICAgaGFzaGluZ1NjaGVtZVZlcnNpb246ICdIQVNISU5HX1NDSEVNRV9WRVJTSU9OX1YyJyxcbiAgICB9O1xuICAgIHR4QnVpbGRlci5zZXRUcmFuc2FjdGlvbihwcmVwYXJlQ29tbWFuZFJlc3BvbnNlKTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHR4LnByZXBhcmVDb21tYW5kLCBwcmVwYXJlQ29tbWFuZFJlc3BvbnNlKTtcbiAgfSk7XG59KTtcbiJdfQ==
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9idWlsZGVyL2FsbG9jYXRpb25BbGxvY2F0ZS9hbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUU1Qiw0Q0FBdUM7QUFFdkMseUNBQXlFO0FBRXpFLGtEQUE2RTtBQUU3RSxNQUFNLFNBQVMsR0FBRyxzQ0FBc0MsQ0FBQztBQUN6RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDbkIsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUM7QUFDbEMsTUFBTSxVQUFVLEdBQUcsNkVBQTZFLENBQUM7QUFDakcsTUFBTSxVQUFVLEdBQ2QsNElBQTRJLENBQUM7QUFDL0ksTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUM7QUFDbkMsTUFBTSxhQUFhLEdBQUcsK0JBQStCLENBQUM7QUFDdEQsTUFBTSxjQUFjLEdBQUcsNkJBQTZCLENBQUM7QUFDckQsTUFBTSxZQUFZLEdBQUcsNkJBQTZCLENBQUM7QUFDbkQsTUFBTSxlQUFlLEdBQUcsNkVBQTZFLENBQUM7QUFDdEcsTUFBTSxhQUFhLEdBQUcsNkVBQTZFLENBQUM7QUFDcEcsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUM7QUFFMUMsK0NBQStDO0FBQy9DLFNBQVMsb0JBQW9CLENBQUMsU0FBb0M7SUFDaEUsT0FBTyxTQUFTO1NBQ2IsU0FBUyxDQUFDLFNBQVMsQ0FBQztTQUNwQixNQUFNLENBQUMsTUFBTSxDQUFDO1NBQ2QsS0FBSyxDQUFDLEtBQUssQ0FBQztTQUNaLFVBQVUsQ0FBQyxVQUFVLENBQUM7U0FDdEIsVUFBVSxDQUFDLFVBQVUsQ0FBQztTQUN0QixPQUFPLENBQUMsT0FBTyxDQUFDO1NBQ2hCLGFBQWEsQ0FBQyxhQUFhLENBQUM7U0FDNUIsY0FBYyxDQUFD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c2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBDYW50b25BbGxvY2F0aW9uQWxsb2NhdGVSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5pbXBvcnQgeyBDYW50b25BbGxvY2F0aW9uQWxsb2NhdGVQcmVwYXJlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMnO1xuXG5jb25zdCBjb21tYW5kSWQgPSAnYTFiMmMzZDQtZTVmNi03ODkwLWFiY2QtZWYxMjM0NTY3ODkwJztcbmNvbnN0IGFtb3VudCA9IDEwMDtcbmNvbnN0IHRva2VuID0gJ2NhbnRvbjphbXVsZXQtdXNkJztcbmNvbnN0IG9wZXJhdG9ySWQgPSAnMTIyMDU6OjEyMjA1YjRlMzUzN2E5NTEyNmQ5MDYwNDU5MjM0NGQ4YWQzYzNkZGNjZGE0Zjc5OTAxOTU0MjgwZWUxOWM1NzY3MTRkJztcbmNvbnN0IGNvbnRyYWN0SWQgPVxuICAnMDAxYjU0OWJmYTgzM2JhYjY2MWFiMzBlNGQwYTNhYjBlYzAxZmNjNGEyYmVmNTM2OTc5NWY0OTI4MTQ3NzA2MzUzY2ExMTEyMjA1YThkMGU3ODBjZjNiMzExNWNmOGJlMGQ2MzE1ZjRhZWQ2YTFjMjViNjdlOGM1ZDY0Y2Y5ODQ4ZDA0NThmZDE3JztcbmNvbnN0IHRyYWRlSWQgPSAndHJhZGUtOTk4ODc3NjY1NSc7XG5jb25zdCB0cmFuc2ZlckxlZ0lkID0gJ3RyYWRlLTk5ODg3NzY2NTUtc2VjdXJpdHktbGVnJztcbmNvbnN0IGFsbG9jYXRlQmVmb3JlID0gJzIwMjYtMDUtMDZUMTY6NDY6MTcuMTg0NjA5Wic7XG5jb25zdCBzZXR0bGVCZWZvcmUgPSAnMjAyNi0wNS0wN1QxNjo0NjoxNy4xODQ2MDlaJztcbmNvbnN0IHJlY2VpdmVyUGFydHlJZCA9ICcxMjIwNjo6MTIyMDZhNGUzNTM3YTk1MTI2ZDkwNjA0NTkyMzQ0ZDhhZDNjM2RkY2NkYTRmNzk5MDE5NTQyODBlZTE5YzU3NjcxNGQnO1xuY29uc3Qgc2VuZGVyUGFydHlJZCA9ICcxMjIwNzo6MTIyMDdhNGUzNTM3YTk1MTI2ZDkwNjA0NTkyMzQ0ZDhhZDNjM2RkY2NkYTRmNzk5MDE5NTQyODBlZTE5YzU3NjcxNGQnO1xuY29uc3QgY29tbWVudCA9ICd0ZXN0IGFsbG9jYXRpb24gY29tbWVudCc7XG5cbi8vIEhlbHBlciB0byBidWlsZCB3aXRoIGFsbCByZXF1aXJlZCBmaWVsZHMgc2V0XG5mdW5jdGlvbiBidWlsZFdpdGhBbGxSZXF1aXJlZCh0eEJ1aWxkZXI6IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIpOiBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyIHtcbiAgcmV0dXJuIHR4QnVpbGRlclxuICAgIC5jb21tYW5kSWQoY29tbWFuZElkKVxuICAgIC5hbW91bnQoYW1vdW50KVxuICAgIC50b2tlbih0b2tlbilcbiAgICAub3BlcmF0b3JJZChvcGVyYXRvcklkKVxuICAgIC5jb250cmFjdElkKGNvbnRyYWN0SWQpXG4gICAgLnRyYWRlSWQodHJhZGVJZClcbiAgICAudHJhbnNmZXJMZWdJZCh0cmFuc2ZlckxlZ0lkKVxuICAgIC5hbGxvY2F0ZUJlZm9yZShhbGxvY2F0ZUJlZm9yZSlcbiAgICAuc2V0dGxlQmVmb3JlKHNldHRsZUJlZm9yZSlcbiAgICAucmVjZWl2ZXJQYXJ0eUlkKHJlY2VpdmVyUGFydHlJZClcbiAgICAuc2VuZGVyUGFydHlJZChzZW5kZXJQYXJ0eUlkKTtcbn1cblxuZGVzY3JpYmUoJ0FsbG9jYXRpb25BbGxvY2F0ZSBCdWlsZGVyJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIGJ1aWxkIHRoZSBhbGxvY2F0aW9uIGFsbG9jYXRlIHJlcXVlc3Qgb2JqZWN0IHdpdGggYWxsIGZpZWxkcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgYnVpbGRXaXRoQWxsUmVxdWlyZWQodHhCdWlsZGVyKS5jb21tZW50KGNvbW1lbnQpO1xuICAgIGNvbnN0IHJlcXVlc3RPYmo6IENhbnRvbkFsbG9jYXRpb25BbGxvY2F0ZVJlcXVlc3QgPSB0eEJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCk7XG4gICAgc2hvdWxkLmV4aXN0KHJlcXVlc3RPYmopO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLmNvbW1hbmRJZCwgY29tbWFuZElkKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai5hbW91bnQsIGFtb3VudCk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcXVlc3RPYmoudG9rZW4sIHRva2VuKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai5vcGVyYXRvcklkLCBvcGVyYXRvcklkKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai5jb250cmFjdElkLCBjb250cmFjdElkKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai50cmFkZUlkLCB0cmFkZUlkKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai50cmFuc2ZlckxlZ0lkLCB0cmFuc2ZlckxlZ0lkKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai5hbGxvY2F0ZUJlZm9yZSwgYWxsb2NhdGVCZWZvcmUpO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLnNldHRsZUJlZm9yZSwgc2V0dGxlQmVmb3JlKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai5yZWNlaXZlclBhcnR5SWQsIHJlY2VpdmVyUGFydHlJZCk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcXVlc3RPYmouc2VuZGVyUGFydHlJZCwgc2VuZGVyUGFydHlJZCk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcXVlc3RPYmouY29tbWVudCwgY29tbWVudCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgdGhlIGFsbG9jYXRpb24gYWxsb2NhdGUgcmVxdWVzdCBvYmplY3Qgd2l0aG91dCBvcHRpb25hbCBjb21tZW50JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICBidWlsZFdpdGhBbGxSZXF1aXJlZCh0eEJ1aWxkZXIpO1xuICAgIGNvbnN0IHJlcXVlc3RPYmo6IENhbnRvbkFsbG9jYXRpb25BbGxvY2F0ZVJlcXVlc3QgPSB0eEJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCk7XG4gICAgc2hvdWxkLmV4aXN0KHJlcXVlc3RPYmopO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLmNvbW1lbnQsIHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc2V0IHRoZSB0cmFuc2FjdGlvbiBpZCB0byB0aGUgY29tbWFuZElkJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0eEJ1aWxkZXIuY29tbWFuZElkKGNvbW1hbmRJZCk7XG4gICAgYXNzZXJ0LmVxdWFsKHR4LmlkLCBjb21tYW5kSWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIGNvbW1hbmRJZCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgLnRva2VuKHRva2VuKVxuICAgICAgLm9wZXJhdG9ySWQob3BlcmF0b3JJZClcbiAgICAgIC5jb250cmFjdElkKGNvbnRyYWN0SWQpXG4gICAgICAudHJhZGVJZCh0cmFkZUlkKVxuICAgICAgLnRyYW5zZmVyTGVnSWQodHJhbnNmZXJMZWdJZClcbiAgICAgIC5hbGxvY2F0ZUJlZm9yZShhbGxvY2F0ZUJlZm9yZSlcbiAgICAgIC5zZXR0bGVCZWZvcmUoc2V0dGxlQmVmb3JlKVxuICAgICAgLnJlY2VpdmVyUGFydHlJZChyZWNlaXZlclBhcnR5SWQpXG4gICAgICAuc2VuZGVyUGFydHlJZChzZW5kZXJQYXJ0eUlkKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci50b1JlcXVlc3RPYmplY3QoKSwgL2NvbW1hbmRJZCBpcyBtaXNzaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgYW1vdW50IGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHR4QnVpbGRlclxuICAgICAgLmNvbW1hbmRJZChjb21tYW5kSWQpXG4gICAgICAudG9rZW4odG9rZW4pXG4gICAgICAub3BlcmF0b3JJZChvcGVyYXRvcklkKVxuICAgICAgLmNvbnRyYWN0SWQoY29udHJhY3RJZClcbiAgICAgIC50cmFkZUlkKHRyYWRlSWQpXG4gICAgICAudHJhbnNmZXJMZWdJZCh0cmFuc2ZlckxlZ0lkKVxuICAgICAgLmFsbG9jYXRlQmVmb3JlKGFsbG9jYXRlQmVmb3JlKVxuICAgICAgLnNldHRsZUJlZm9yZShzZXR0bGVCZWZvcmUpXG4gICAgICAucmVjZWl2ZXJQYXJ0eUlkKHJlY2VpdmVyUGFydHlJZClcbiAgICAgIC5zZW5kZXJQYXJ0eUlkKHNlbmRlclBhcnR5SWQpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRvUmVxdWVzdE9iamVjdCgpLCAvYW1vdW50IGlzIG1pc3NpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB0b2tlbiBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5jb21tYW5kSWQoY29tbWFuZElkKVxuICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAub3BlcmF0b3JJZChvcGVyYXRvcklkKVxuICAgICAgLmNvbnRyYWN0SWQoY29udHJhY3RJZClcbiAgICAgIC50cmFkZUlkKHRyYWRlSWQpXG4gICAgICAudHJhbnNmZXJMZWdJZCh0cmFuc2ZlckxlZ0lkKVxuICAgICAgLmFsbG9jYXRlQmVmb3JlKGFsbG9jYXRlQmVmb3JlKVxuICAgICAgLnNldHRsZUJlZm9yZShzZXR0bGVCZWZvcmUpXG4gICAgICAucmVjZWl2ZXJQYXJ0eUlkKHJlY2VpdmVyUGFydHlJZClcbiAgICAgIC5zZW5kZXJQYXJ0eUlkKHNlbmRlclBhcnR5SWQpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRvUmVxdWVzdE9iamVjdCgpLCAvdG9rZW4gaXMgbWlzc2luZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIG9wZXJhdG9ySWQgaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgdHhCdWlsZGVyXG4gICAgICAuY29tbWFuZElkKGNvbW1hbmRJZClcbiAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgLnRva2VuKHRva2VuKVxuICAgICAgLmNvbnRyYWN0SWQoY29udHJhY3RJZClcbiAgICAgIC50cmFkZUlkKHRyYWRlSWQpXG4gICAgICAudHJhbnNmZXJMZWdJZCh0cmFuc2ZlckxlZ0lkKVxuICAgICAgLmFsbG9jYXRlQmVmb3JlKGFsbG9jYXRlQmVmb3JlKVxuICAgICAgLnNldHRsZUJlZm9yZShzZXR0bGVCZWZvcmUpXG4gICAgICAucmVjZWl2ZXJQYXJ0eUlkKHJlY2VpdmVyUGFydHlJZClcbiAgICAgIC5zZW5kZXJQYXJ0eUlkKHNlbmRlclBhcnR5SWQpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRvUmVxdWVzdE9iamVjdCgpLCAvb3BlcmF0b3JJZCBpcyBtaXNzaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgY29udHJhY3RJZCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5jb21tYW5kSWQoY29tbWFuZElkKVxuICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAudG9rZW4odG9rZW4pXG4gICAgICAub3BlcmF0b3JJZChvcGVyYXRvcklkKVxuICAgICAgLnRyYWRlSWQodHJhZGVJZClcbiAgICAgIC50cmFuc2ZlckxlZ0lkKHRyYW5zZmVyTGVnSWQpXG4gICAgICAuYWxsb2NhdGVCZWZvcmUoYWxsb2NhdGVCZWZvcmUpXG4gICAgICAuc2V0dGxlQmVmb3JlKHNldHRsZUJlZm9yZSlcbiAgICAgIC5yZWNlaXZlclBhcnR5SWQocmVjZWl2ZXJQYXJ0eUlkKVxuICAgICAgLnNlbmRlclBhcnR5SWQoc2VuZGVyUGFydHlJZCk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9jb250cmFjdElkIGlzIG1pc3NpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB0cmFkZUlkIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHR4QnVpbGRlclxuICAgICAgLmNvbW1hbmRJZChjb21tYW5kSWQpXG4gICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgIC50b2tlbih0b2tlbilcbiAgICAgIC5vcGVyYXRvcklkKG9wZXJhdG9ySWQpXG4gICAgICAuY29udHJhY3RJZChjb250cmFjdElkKVxuICAgICAgLnRyYW5zZmVyTGVnSWQodHJhbnNmZXJMZWdJZClcbiAgICAgIC5hbGxvY2F0ZUJlZm9yZShhbGxvY2F0ZUJlZm9yZSlcbiAgICAgIC5zZXR0bGVCZWZvcmUoc2V0dGxlQmVmb3JlKVxuICAgICAgLnJlY2VpdmVyUGFydHlJZChyZWNlaXZlclBhcnR5SWQpXG4gICAgICAuc2VuZGVyUGFydHlJZChzZW5kZXJQYXJ0eUlkKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci50b1JlcXVlc3RPYmplY3QoKSwgL3RyYWRlSWQgaXMgbWlzc2luZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIHRyYW5zZmVyTGVnSWQgaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgdHhCdWlsZGVyXG4gICAgICAuY29tbWFuZElkKGNvbW1hbmRJZClcbiAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgLnRva2VuKHRva2VuKVxuICAgICAgLm9wZXJhdG9ySWQob3BlcmF0b3JJZClcbiAgICAgIC5jb250cmFjdElkKGNvbnRyYWN0SWQpXG4gICAgICAudHJhZGVJZCh0cmFkZUlkKVxuICAgICAgLmFsbG9jYXRlQmVmb3JlKGFsbG9jYXRlQmVmb3JlKVxuICAgICAgLnNldHRsZUJlZm9yZShzZXR0bGVCZWZvcmUpXG4gICAgICAucmVjZWl2ZXJQYXJ0eUlkKHJlY2VpdmVyUGFydHlJZClcbiAgICAgIC5zZW5kZXJQYXJ0eUlkKHNlbmRlclBhcnR5SWQpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRvUmVxdWVzdE9iamVjdCgpLCAvdHJhbnNmZXJMZWdJZCBpcyBtaXNzaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgYWxsb2NhdGVCZWZvcmUgaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgdHhCdWlsZGVyXG4gICAgICAuY29tbWFuZElkKGNvbW1hbmRJZClcbiAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgLnRva2VuKHRva2VuKVxuICAgICAgLm9wZXJhdG9ySWQob3BlcmF0b3JJZClcbiAgICAgIC5jb250cmFjdElkKGNvbnRyYWN0SWQpXG4gICAgICAudHJhZGVJZCh0cmFkZUlkKVxuICAgICAgLnRyYW5zZmVyTGVnSWQodHJhbnNmZXJMZWdJZClcbiAgICAgIC5zZXR0bGVCZWZvcmUoc2V0dGxlQmVmb3JlKVxuICAgICAgLnJlY2VpdmVyUGFydHlJZChyZWNlaXZlclBhcnR5SWQpXG4gICAgICAuc2VuZGVyUGFydHlJZChzZW5kZXJQYXJ0eUlkKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci50b1JlcXVlc3RPYmplY3QoKSwgL2FsbG9jYXRlQmVmb3JlIGlzIG1pc3NpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBzZXR0bGVCZWZvcmUgaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgdHhCdWlsZGVyXG4gICAgICAuY29tbWFuZElkKGNvbW1hbmRJZClcbiAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgLnRva2VuKHRva2VuKVxuICAgICAgLm9wZXJhdG9ySWQob3BlcmF0b3JJZClcbiAgICAgIC5jb250cmFjdElkKGNvbnRyYWN0SWQpXG4gICAgICAudHJhZGVJZCh0cmFkZUlkKVxuICAgICAgLnRyYW5zZmVyTGVnSWQodHJhbnNmZXJMZWdJZClcbiAgICAgIC5hbGxvY2F0ZUJlZm9yZShhbGxvY2F0ZUJlZm9yZSlcbiAgICAgIC5yZWNlaXZlclBhcnR5SWQocmVjZWl2ZXJQYXJ0eUlkKVxuICAgICAgLnNlbmRlclBhcnR5SWQoc2VuZGVyUGFydHlJZCk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9zZXR0bGVCZWZvcmUgaXMgbWlzc2luZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIHJlY2VpdmVyUGFydHlJZCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5jb21tYW5kSWQoY29tbWFuZElkKVxuICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAudG9rZW4odG9rZW4pXG4gICAgICAub3BlcmF0b3JJZChvcGVyYXRvcklkKVxuICAgICAgLmNvbnRyYWN0SWQoY29udHJhY3RJZClcbiAgICAgIC50cmFkZUlkKHRyYWRlSWQpXG4gICAgICAudHJhbnNmZXJMZWdJZCh0cmFuc2ZlckxlZ0lkKVxuICAgICAgLmFsbG9jYXRlQmVmb3JlKGFsbG9jYXRlQmVmb3JlKVxuICAgICAgLnNldHRsZUJlZm9yZShzZXR0bGVCZWZvcmUpXG4gICAgICAuc2VuZGVyUGFydHlJZChzZW5kZXJQYXJ0eUlkKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci50b1JlcXVlc3RPYmplY3QoKSwgL3JlY2VpdmVyUGFydHlJZCBpcyBtaXNzaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgc2VuZGVyUGFydHlJZCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5jb21tYW5kSWQoY29tbWFuZElkKVxuICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAudG9rZW4odG9rZW4pXG4gICAgICAub3BlcmF0b3JJZChvcGVyYXRvcklkKVxuICAgICAgLmNvbnRyYWN0SWQoY29udHJhY3RJZClcbiAgICAgIC50cmFkZUlkKHRyYWRlSWQpXG4gICAgICAudHJhbnNmZXJMZWdJZCh0cmFuc2ZlckxlZ0lkKVxuICAgICAgLmFsbG9jYXRlQmVmb3JlKGFsbG9jYXRlQmVmb3JlKVxuICAgICAgLnNldHRsZUJlZm9yZShzZXR0bGVCZWZvcmUpXG4gICAgICAucmVjZWl2ZXJQYXJ0eUlkKHJlY2VpdmVyUGFydHlJZCk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9zZW5kZXJQYXJ0eUlkIGlzIG1pc3NpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb21tYW5kSWQgaXMgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5jb21tYW5kSWQoJycpLCAvY29tbWFuZElkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgdG9rZW4gaXMgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci50b2tlbignJyksIC90b2tlbiBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIG9wZXJhdG9ySWQgaXMgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5vcGVyYXRvcklkKCcnKSwgL29wZXJhdG9ySWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb250cmFjdElkIGlzIGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuY29udHJhY3RJZCgnJyksIC9jb250cmFjdElkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgdHJhZGVJZCBpcyBhbiBlbXB0eSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRyYWRlSWQoJycpLCAvdHJhZGVJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIHRyYW5zZmVyTGVnSWQgaXMgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci50cmFuc2ZlckxlZ0lkKCcnKSwgL3RyYW5zZmVyTGVnSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBhbGxvY2F0ZUJlZm9yZSBpcyBhbiBlbXB0eSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLmFsbG9jYXRlQmVmb3JlKCcnKSwgL2FsbG9jYXRlQmVmb3JlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgc2V0dGxlQmVmb3JlIGlzIGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuc2V0dGxlQmVmb3JlKCcnKSwgL3NldHRsZUJlZm9yZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIHJlY2VpdmVyUGFydHlJZCBpcyBhbiBlbXB0eSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnJlY2VpdmVyUGFydHlJZCgnJyksIC9yZWNlaXZlclBhcnR5SWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzZXQgdGhlIHByZXBhcmVDb21tYW5kIHZpYSBzZXRUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgY29uc3QgcHJlcGFyZUNvbW1hbmRSZXNwb25zZSA9IHtcbiAgICAgIHByZXBhcmVkVHJhbnNhY3Rpb25IYXNoOiAnYWJjMTIzJyxcbiAgICAgIGhhc2hpbmdTY2hlbWVWZXJzaW9uOiAnSEFTSElOR19TQ0hFTUVfVkVSU0lPTl9WMicsXG4gICAgfTtcbiAgICB0eEJ1aWxkZXIuc2V0VHJhbnNhY3Rpb24ocHJlcGFyZUNvbW1hbmRSZXNwb25zZSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbCh0eC5wcmVwYXJlQ29tbWFuZCwgcHJlcGFyZUNvbW1hbmRSZXNwb25zZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQcmVwYXJlZCB0cmFuc2FjdGlvbiBwYXJzaW5nJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcGFyc2UgdGhlIGFsbG9jYXRpb24gYWxsb2NhdGUgcHJlcGFyZWQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgdHhCdWlsZGVyLmNvbW1hbmRJZChjb21tYW5kSWQpO1xuICAgICAgdHhCdWlsZGVyLnNldFRyYW5zYWN0aW9uKENhbnRvbkFsbG9jYXRpb25BbGxvY2F0ZVByZXBhcmVSZXNwb25zZSk7XG4gICAgICBjb25zdCB0eERhdGEgPSB0eEJ1aWxkZXIudHJhbnNhY3Rpb24udG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXhpc3QodHhEYXRhKTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgdHhEYXRhLnNlbmRlcixcbiAgICAgICAgJ3JhdmktMi1zdGVwLXBhcnR5OjoxMjIwOTJlN2QzM2FjMTBjMGYzZDU1OTc2MzQyZjM3NTU1ZGYwNWRhNWI3NDI5NTZkNTZhNjJhZTIzNjc3NjkwNzlkMidcbiAgICAgICk7XG4gICAgICAvLyByZWNlaXZlciA9IHRyYW5zZmVyTGVnLnJlY2VpdmVyIGZyb20gRHZwTGVnQWxsb2NhdGlvbiDigJQgdGhlIGFjdHVhbCBzZXR0bGVtZW50IGNvdW50ZXJwYXJ0eVxuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICB0eERhdGEucmVjZWl2ZXIsXG4gICAgICAgICdyYXZpLTItc3RlcC1wYXJ0eS1uZXc6OjEyMjA5MmU3ZDMzYWMxMGMwZjNkNTU5NzYzNDJmMzc1NTVkZjA1ZGE1Yjc0Mjk1NmQ1NmE2MmFlMjM2Nzc2OTA3OWQyJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eERhdGEuYW1vdW50LCAnNTAwMDAwMDAwMDAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdGhlIHJhdyBhbGxvY2F0aW9uIGFsbG9jYXRlIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZUJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIHR4QnVpbGRlci5jb21tYW5kSWQoY29tbWFuZElkKTtcbiAgICAgIHR4QnVpbGRlci5zZXRUcmFuc2FjdGlvbihDYW50b25BbGxvY2F0aW9uQWxsb2NhdGVQcmVwYXJlUmVzcG9uc2UpO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyLnZhbGlkYXRlUmF3VHJhbnNhY3Rpb24oQ2FudG9uQWxsb2NhdGlvbkFsbG9jYXRlUHJlcGFyZVJlc3BvbnNlLnByZXBhcmVkVHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB0aGUgYWxsb2NhdGlvbiBhbGxvY2F0ZSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIHR4LnByZXBhcmVDb21tYW5kID0gQ2FudG9uQWxsb2NhdGlvbkFsbG9jYXRlUHJlcGFyZVJlc3BvbnNlO1xuICAgICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIHR4QnVpbGRlci5zZXRUcmFuc2FjdGlvbihDYW50b25BbGxvY2F0aW9uQWxsb2NhdGVQcmVwYXJlUmVzcG9uc2UpO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24odHgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cantonCommandBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cantonCommandBuilder.d.ts","sourceRoot":"","sources":["../../../../../test/unit/builder/cantonCommand/cantonCommandBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const should_1 = __importDefault(require("should"));
8
+ const sdk_core_1 = require("@bitgo/sdk-core");
9
+ const statics_1 = require("@bitgo/statics");
10
+ const cantonCommandBuilder_1 = require("../../../../src/lib/cantonCommandBuilder");
11
+ const transactionBuilderFactory_1 = require("../../../../src/lib/transactionBuilderFactory");
12
+ const transaction_1 = require("../../../../src/lib/transaction/transaction");
13
+ const resources_1 = require("../../../resources");
14
+ const PARTY_A = 'RegRegistrar::1220508e54fb709dcb1a9b4096408ad415d2217d8881ad9034a9850752933ba88ad5';
15
+ const PARTY_B = 'RegProvider::1220508e54fb709dcb1a9b4096408ad415d2217d8881ad9034a9850752933ba88ad5';
16
+ const TEMPLATE_ID = '7a75ef6e69f69395a4e60919e228528bb8f3881150ccfde3f31bcc73864b18ab:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory';
17
+ const CONTRACT_ID = '00f3afdce846a40c6f3f618c4b584b022a0197010057ecd59458200183ab27de0aca1212204aef7ede37a5f41b674a1d95446d42a404461c5558c4e6d1860b65560120ef18';
18
+ const sampleExerciseCommand = {
19
+ ExerciseCommand: {
20
+ templateId: TEMPLATE_ID,
21
+ contractId: CONTRACT_ID,
22
+ choice: 'AllocationFactory_OfferMint',
23
+ choiceArgument: {
24
+ expectedAdmin: PARTY_A,
25
+ mint: { instrumentId: { admin: PARTY_A, id: 'TESTTOKEN' }, amount: '100', holder: PARTY_A, reference: 'test' },
26
+ },
27
+ },
28
+ };
29
+ const sampleCreateCommand = {
30
+ CreateCommand: {
31
+ templateId: TEMPLATE_ID,
32
+ createArguments: { provider: PARTY_B, registrar: PARTY_A, operator: PARTY_B },
33
+ },
34
+ };
35
+ describe('CantonCommandBuilder', () => {
36
+ describe('commandId()', () => {
37
+ it('should set the command ID and transaction ID', function () {
38
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
39
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
40
+ builder.initBuilder(tx);
41
+ builder.commandId('test-cmd-id-123');
42
+ assert_1.default.equal(builder['_commandId'], 'test-cmd-id-123');
43
+ assert_1.default.equal(builder['transaction'].id, 'test-cmd-id-123');
44
+ });
45
+ it('should throw on empty string', function () {
46
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
47
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
48
+ builder.initBuilder(tx);
49
+ assert_1.default.throws(() => builder.commandId(''), /commandId must be a non-empty string/);
50
+ });
51
+ it('should throw on whitespace-only string', function () {
52
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
53
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
54
+ builder.initBuilder(tx);
55
+ assert_1.default.throws(() => builder.commandId(' '), /commandId must be a non-empty string/);
56
+ });
57
+ });
58
+ describe('actAs()', () => {
59
+ it('should set acting parties and update transaction', function () {
60
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
61
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
62
+ builder.initBuilder(tx);
63
+ builder.actAs([PARTY_A]);
64
+ assert_1.default.deepEqual(builder['_actAs'], [PARTY_A]);
65
+ assert_1.default.deepEqual(builder['transaction'].cantonCommandActAsParties, [PARTY_A]);
66
+ });
67
+ it('should throw on empty array', function () {
68
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
69
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
70
+ builder.initBuilder(tx);
71
+ assert_1.default.throws(() => builder.actAs([]), /actAs must be a non-empty array/);
72
+ });
73
+ it('should throw on array with empty strings', function () {
74
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
75
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
76
+ builder.initBuilder(tx);
77
+ assert_1.default.throws(() => builder.actAs(['']), /actAs parties must be non-empty strings/);
78
+ });
79
+ });
80
+ describe('readAs()', () => {
81
+ it('should set read-only parties', function () {
82
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
83
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
84
+ builder.initBuilder(tx);
85
+ builder.readAs([PARTY_B]);
86
+ assert_1.default.deepEqual(builder['_readAs'], [PARTY_B]);
87
+ });
88
+ it('should default to empty array when passed undefined', function () {
89
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
90
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
91
+ builder.initBuilder(tx);
92
+ builder.readAs(undefined);
93
+ assert_1.default.deepEqual(builder['_readAs'], []);
94
+ });
95
+ it('should default to empty array when passed null', function () {
96
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
97
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
98
+ builder.initBuilder(tx);
99
+ builder.readAs(null);
100
+ assert_1.default.deepEqual(builder['_readAs'], []);
101
+ });
102
+ });
103
+ describe('command()', () => {
104
+ it('should set an ExerciseCommand', function () {
105
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
106
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
107
+ builder.initBuilder(tx);
108
+ builder.command(sampleExerciseCommand);
109
+ assert_1.default.deepEqual(builder['_command'], sampleExerciseCommand);
110
+ });
111
+ it('should set a CreateCommand', function () {
112
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
113
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
114
+ builder.initBuilder(tx);
115
+ builder.command(sampleCreateCommand);
116
+ assert_1.default.deepEqual(builder['_command'], sampleCreateCommand);
117
+ });
118
+ it('should throw on non-object input', function () {
119
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
120
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
121
+ builder.initBuilder(tx);
122
+ assert_1.default.throws(() => builder.command(null), /command must be a plain object/);
123
+ });
124
+ });
125
+ describe('resolveContracts()', () => {
126
+ it('should set the spec array', function () {
127
+ const spec = [{ templateId: TEMPLATE_ID, actAs: [PARTY_A], injectAs: 'command.ExerciseCommand.contractId' }];
128
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
129
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
130
+ builder.initBuilder(tx);
131
+ builder.resolveContracts(spec);
132
+ assert_1.default.deepEqual(builder['_resolveContracts'], spec);
133
+ });
134
+ });
135
+ describe('toRequestObject()', () => {
136
+ it('should return correct object with all required fields', function () {
137
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
138
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
139
+ builder.initBuilder(tx);
140
+ builder.commandId('cmd-001').actAs([PARTY_A]).readAs([PARTY_B]).command(sampleExerciseCommand);
141
+ const req = builder.toRequestObject();
142
+ should_1.default.exist(req);
143
+ assert_1.default.equal(req.commandId, 'cmd-001');
144
+ assert_1.default.deepEqual(req.actAs, [PARTY_A]);
145
+ assert_1.default.deepEqual(req.readAs, [PARTY_B]);
146
+ assert_1.default.deepEqual(req.command, sampleExerciseCommand);
147
+ });
148
+ it('should throw when commandId is missing', function () {
149
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
150
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
151
+ builder.initBuilder(tx);
152
+ builder.actAs([PARTY_A]).command(sampleExerciseCommand);
153
+ assert_1.default.throws(() => builder.toRequestObject(), /commandId is missing/);
154
+ });
155
+ it('should throw when actAs is missing', function () {
156
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
157
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
158
+ builder.initBuilder(tx);
159
+ builder.commandId('cmd-001').command(sampleExerciseCommand);
160
+ assert_1.default.throws(() => builder.toRequestObject(), /actAs is missing/);
161
+ });
162
+ it('should throw when command is missing', function () {
163
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
164
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
165
+ builder.initBuilder(tx);
166
+ builder.commandId('cmd-001').actAs([PARTY_A]);
167
+ assert_1.default.throws(() => builder.toRequestObject(), /command is missing/);
168
+ });
169
+ it('should throw when command contains invalid key', function () {
170
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
171
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
172
+ builder.initBuilder(tx);
173
+ builder
174
+ .commandId('cmd-001')
175
+ .actAs([PARTY_A])
176
+ .command({ UnknownCommand: {} });
177
+ assert_1.default.throws(() => builder.toRequestObject(), /command must contain exactly one of/);
178
+ });
179
+ it('should include empty resolveContracts by default', function () {
180
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
181
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
182
+ builder.initBuilder(tx);
183
+ builder.commandId('cmd-002').actAs([PARTY_A]).command(sampleCreateCommand);
184
+ const req = builder.toRequestObject();
185
+ assert_1.default.deepEqual(req.resolveContracts, []);
186
+ });
187
+ });
188
+ describe('initBuilder()', () => {
189
+ it('should correctly initialize from existing transaction with cantonCommandActAsParties', function () {
190
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
191
+ tx.transactionType = sdk_core_1.TransactionType.CantonCommand;
192
+ tx.cantonCommandActAs = [PARTY_A];
193
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
194
+ builder.initBuilder(tx);
195
+ assert_1.default.deepEqual(builder['_actAs'], [PARTY_A]);
196
+ });
197
+ it('should leave _actAs as empty array when transaction has no parties', function () {
198
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
199
+ tx.transactionType = sdk_core_1.TransactionType.CantonCommand;
200
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
201
+ builder.initBuilder(tx);
202
+ assert_1.default.deepEqual(builder['_actAs'], []);
203
+ });
204
+ });
205
+ describe('transactionType', () => {
206
+ it('should return CantonCommand type', function () {
207
+ const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
208
+ assert_1.default.equal(builder.transactionType, sdk_core_1.TransactionType.CantonCommand);
209
+ });
210
+ });
211
+ });
212
+ describe('TransactionBuilderFactory - CantonCommand', () => {
213
+ it('should return a CantonCommandBuilder from getCantonCommandBuilder()', function () {
214
+ const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tcanton'));
215
+ const builder = factory.getCantonCommandBuilder();
216
+ should_1.default.exist(builder);
217
+ assert_1.default.ok(builder instanceof cantonCommandBuilder_1.CantonCommandBuilder);
218
+ assert_1.default.equal(builder.transactionType, sdk_core_1.TransactionType.CantonCommand);
219
+ });
220
+ it('should return a CantonCommandBuilder from from() with CantonCommand raw transaction', function () {
221
+ const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tcanton'));
222
+ const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
223
+ tx.transactionType = sdk_core_1.TransactionType.CantonCommand;
224
+ tx.id = 'test-cmd-001';
225
+ tx.prepareCommand = resources_1.CantonExerciseCommandPrepareResponse;
226
+ const rawTx = tx.toBroadcastFormat();
227
+ const builder = factory.from(rawTx);
228
+ should_1.default.exist(builder);
229
+ assert_1.default.ok(builder instanceof cantonCommandBuilder_1.CantonCommandBuilder);
230
+ });
231
+ });
232
+ describe('Transaction toJson and explainTransaction - CantonCommand', () => {
233
+ let tx;
234
+ beforeEach(() => {
235
+ tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
236
+ tx.transactionType = sdk_core_1.TransactionType.CantonCommand;
237
+ tx.id = 'test-cmd-001';
238
+ tx.prepareCommand = resources_1.CantonExerciseCommandPrepareResponse;
239
+ tx.cantonCommandActAs = [PARTY_A];
240
+ });
241
+ describe('toJson()', () => {
242
+ it('should return cantonCommand summary for CantonCommand transactions', function () {
243
+ const json = tx.toJson();
244
+ should_1.default.exist(json);
245
+ should_1.default.exist(json.cantonCommand);
246
+ });
247
+ it('should include kind, templateId, and actAs in summary', function () {
248
+ const json = tx.toJson();
249
+ const cc = json.cantonCommand;
250
+ assert_1.default.ok(['ExerciseCommand', 'CreateCommand'].includes(cc.kind));
251
+ assert_1.default.ok(cc.templateId.includes(':'));
252
+ assert_1.default.deepEqual(cc.actAs, [PARTY_A]);
253
+ });
254
+ it('should include choice for ExerciseCommand', function () {
255
+ const json = tx.toJson();
256
+ const cc = json.cantonCommand;
257
+ if (cc.kind === 'ExerciseCommand') {
258
+ should_1.default.exist(cc.choice);
259
+ assert_1.default.equal(cc.choice, 'AllocationFactory_OfferMint');
260
+ }
261
+ });
262
+ it('should include contractId for ExerciseCommand when present', function () {
263
+ const json = tx.toJson();
264
+ const cc = json.cantonCommand;
265
+ if (cc.kind === 'ExerciseCommand') {
266
+ should_1.default.exist(cc.contractId);
267
+ }
268
+ });
269
+ });
270
+ describe('explainTransaction()', () => {
271
+ it('should return explanation with cantonCommand field for CantonCommand type', function () {
272
+ const explanation = tx.explainTransaction();
273
+ should_1.default.exist(explanation);
274
+ should_1.default.exist(explanation.cantonCommand);
275
+ });
276
+ it('should have correct structure (id, displayOrder, outputs, inputs, fee, type)', function () {
277
+ const explanation = tx.explainTransaction();
278
+ assert_1.default.ok('id' in explanation);
279
+ assert_1.default.ok('displayOrder' in explanation);
280
+ assert_1.default.ok('outputs' in explanation);
281
+ assert_1.default.ok('inputs' in explanation);
282
+ assert_1.default.ok('fee' in explanation);
283
+ assert_1.default.ok('type' in explanation);
284
+ });
285
+ it('should have correct cantonCommand summary fields', function () {
286
+ const explanation = tx.explainTransaction();
287
+ const cc = explanation.cantonCommand;
288
+ assert_1.default.equal(cc.kind, 'ExerciseCommand');
289
+ assert_1.default.equal(cc.templateId, '7a75ef6e69f69395a4e60919e228528bb8f3881150ccfde3f31bcc73864b18ab:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory');
290
+ assert_1.default.equal(cc.choice, 'AllocationFactory_OfferMint');
291
+ assert_1.default.ok(cc.contractId && cc.contractId.length > 0);
292
+ assert_1.default.deepEqual(cc.actAs, [PARTY_A]);
293
+ });
294
+ });
295
+ });
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudG9uQ29tbWFuZEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYnVpbGRlci9jYW50b25Db21tYW5kL2NhbnRvbkNvbW1hbmRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUU1Qiw4Q0FBOEY7QUFDOUYsNENBQXVDO0FBRXZDLG1GQUFnRjtBQUNoRiw2RkFBMEY7QUFDMUYsNkVBQTBFO0FBRTFFLGtEQUEwRTtBQUUxRSxNQUFNLE9BQU8sR0FBRyxvRkFBb0YsQ0FBQztBQUNyRyxNQUFNLE9BQU8sR0FBRyxtRkFBbUYsQ0FBQztBQUNwRyxNQUFNLFdBQVcsR0FDZixzSUFBc0ksQ0FBQztBQUN6SSxNQUFNLFdBQVcsR0FDZiw0SUFBNEksQ0FBQztBQUUvSSxNQUFNLHFCQUFxQixHQUEwQjtJQUNuRCxlQUFlLEVBQUU7UUFDZixVQUFVLEVBQUUsV0FBVztRQUN2QixVQUFVLEVBQUUsV0FBVztRQUN2QixNQUFNLEVBQUUsNkJBQTZCO1FBQ3JDLGNBQWMsRUFBRTtZQUNkLGFBQWEsRUFBRSxPQUFPO1lBQ3RCLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFO1NBQy9HO0tBQ0Y7Q0FDRixDQUFDO0FBRUYsTUFBTSxtQkFBbUIsR0FBd0I7SUFDL0MsYUFBYSxFQUFFO1FBQ2IsVUFBVSxFQUFFLFdBQVc7UUFDdkIsZUFBZSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7S0FDOUU7Q0FDRixDQUFDO0FBRUYsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcs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LFVBQVUsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNyRCxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCB7IENhbnRvbkNyZWF0ZUNvbW1hbmQsIENhbnRvbkV4ZXJjaXNlQ29tbWFuZCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBDYW50b25Db21tYW5kQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9saWIvY2FudG9uQ29tbWFuZEJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgQ2FudG9uQ29tbWFuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliL2lmYWNlJztcbmltcG9ydCB7IENhbnRvbkV4ZXJjaXNlQ29tbWFuZFByZXBhcmVSZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlcyc7XG5cbmNvbnN0IFBBUlRZX0EgPSAnUmVnUmVnaXN0cmFyOjoxMjIwNTA4ZTU0ZmI3MDlkY2IxYTliNDA5NjQwOGFkNDE1ZDIyMTdkODg4MWFkOTAzNGE5ODUwNzUyOTMzYmE4OGFkNSc7XG5jb25zdCBQQVJUWV9CID0gJ1JlZ1Byb3ZpZGVyOjoxMjIwNTA4ZTU0ZmI3MDlkY2IxYTliNDA5NjQwOGFkNDE1ZDIyMTdkODg4MWFkOTAzNGE5ODUwNzUyOTMzYmE4OGFkNSc7XG5jb25zdCBURU1QTEFURV9JRCA9XG4gICc3YTc1ZWY2ZTY5ZjY5Mzk1YTRlNjA5MTllMjI4NTI4YmI4ZjM4ODExNTBjY2ZkZTNmMzFiY2M3Mzg2NGIxOGFiOlV0aWxpdHkuUmVnaXN0cnkuQXBwLlYwLlNlcnZpY2UuQWxsb2NhdGlvbkZhY3Rvcnk6QWxsb2NhdGlvbkZhY3RvcnknO1xuY29uc3QgQ09OVFJBQ1RfSUQgPVxuICAnMDBmM2FmZGNlODQ2YTQwYzZmM2Y2MThjNGI1ODRiMDIyYTAxOTcwMTAwNTdlY2Q1OTQ1ODIwMDE4M2FiMjdkZTBhY2ExMjEyMjA0YWVmN2VkZTM3YTVmNDFiNjc0YTFkOTU0NDZkNDJhNDA0NDYxYzU1NThjNGU2ZDE4NjBiNjU1NjAxMjBlZjE4JztcblxuY29uc3Qgc2FtcGxlRXhlcmNpc2VDb21tYW5kOiBDYW50b25FeGVyY2lzZUNvbW1hbmQgPSB7XG4gIEV4ZXJjaXNlQ29tbWFuZDoge1xuICAgIHRlbXBsYXRlSWQ6IFRFTVBMQVRFX0lELFxuICAgIGNvbnRyYWN0SWQ6IENPTlRSQUNUX0lELFxuICAgIGNob2ljZTogJ0FsbG9jYXRpb25GYWN0b3J5X09mZmVyTWludCcsXG4gICAgY2hvaWNlQXJndW1lbnQ6IHtcbiAgICAgIGV4cGVjdGVkQWRtaW46IFBBUlRZX0EsXG4gICAgICBtaW50OiB7IGluc3RydW1lbnRJZDogeyBhZG1pbjogUEFSVFlfQSwgaWQ6ICdURVNUVE9LRU4nIH0sIGFtb3VudDogJzEwMCcsIGhvbGRlcjogUEFSVFlfQSwgcmVmZXJlbmNlOiAndGVzdCcgfSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgc2FtcGxlQ3JlYXRlQ29tbWFuZDogQ2FudG9uQ3JlYXRlQ29tbWFuZCA9IHtcbiAgQ3JlYXRlQ29tbWFuZDoge1xuICAgIHRlbXBsYXRlSWQ6IFRFTVBMQVRFX0lELFxuICAgIGNyZWF0ZUFyZ3VtZW50czogeyBwcm92aWRlcjogUEFSVFlfQiwgcmVnaXN0cmFyOiBQQVJUWV9BLCBvcGVyYXRvcjogUEFSVFlfQiB9LFxuICB9LFxufTtcblxuZGVzY3JpYmUoJ0NhbnRvbkNvbW1hbmRCdWlsZGVyJywgKCkgPT4ge1xuICBkZXNjcmliZSgnY29tbWFuZElkKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgdGhlIGNvbW1hbmQgSUQgYW5kIHRyYW5zYWN0aW9uIElEJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDYW50b25Db21tYW5kQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIGJ1aWxkZXIuY29tbWFuZElkKCd0ZXN0LWNtZC1pZC0xMjMnKTtcbiAgICAgIGFzc2VydC5lcXVhbChidWlsZGVyWydfY29tbWFuZElkJ10sICd0ZXN0LWNtZC1pZC0xMjMnKTtcbiAgICAgIGFzc2VydC5lcXVhbChidWlsZGVyWyd0cmFuc2FjdGlvbiddLmlkLCAndGVzdC1jbWQtaWQtMTIzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuY29tbWFuZElkKCcnKSwgL2NvbW1hbmRJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiB3aGl0ZXNwYWNlLW9ubHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDYW50b25Db21tYW5kQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5jb21tYW5kSWQoJyAgICcpLCAvY29tbWFuZElkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY3RBcygpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2V0IGFjdGluZyBwYXJ0aWVzIGFuZCB1cGRhdGUgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IENhbnRvbkNvbW1hbmRCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgYnVpbGRlci5hY3RBcyhbUEFSVFlfQV0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChidWlsZGVyWydfYWN0QXMnXSwgW1BBUlRZX0FdKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoYnVpbGRlclsndHJhbnNhY3Rpb24nXS5jYW50b25Db21tYW5kQWN0QXNQYXJ0aWVzLCBbUEFSVFlfQV0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBlbXB0eSBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuYWN0QXMoW10pLCAvYWN0QXMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBhcnJheSB3aXRoIGVtcHR5IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IENhbnRvbkNvbW1hbmRCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLmFjdEFzKFsnJ10pLCAvYWN0QXMgcGFydGllcyBtdXN0IGJlIG5vbi1lbXB0eSBzdHJpbmdzLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWFkQXMoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNldCByZWFkLW9ubHkgcGFydGllcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBidWlsZGVyLnJlYWRBcyhbUEFSVFlfQl0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChidWlsZGVyWydfcmVhZEFzJ10sIFtQQVJUWV9CXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlZmF1bHQgdG8gZW1wdHkgYXJyYXkgd2hlbiBwYXNzZWQgdW5kZWZpbmVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDYW50b25Db21tYW5kQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIGJ1aWxkZXIucmVhZEFzKHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGJ1aWxkZXJbJ19yZWFkQXMnXSwgW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWZhdWx0IHRvIGVtcHR5IGFycmF5IHdoZW4gcGFzc2VkIG51bGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IENhbnRvbkNvbW1hbmRCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgYnVpbGRlci5yZWFkQXMobnVsbCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGJ1aWxkZXJbJ19yZWFkQXMnXSwgW10pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29tbWFuZCgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2V0IGFuIEV4ZXJjaXNlQ29tbWFuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBidWlsZGVyLmNvbW1hbmQoc2FtcGxlRXhlcmNpc2VDb21tYW5kKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoYnVpbGRlclsnX2NvbW1hbmQnXSwgc2FtcGxlRXhlcmNpc2VDb21tYW5kKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGEgQ3JlYXRlQ29tbWFuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBidWlsZGVyLmNvbW1hbmQoc2FtcGxlQ3JlYXRlQ29tbWFuZCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGJ1aWxkZXJbJ19jb21tYW5kJ10sIHNhbXBsZUNyZWF0ZUNvbW1hbmQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBub24tb2JqZWN0IGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDYW50b25Db21tYW5kQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5jb21tYW5kKG51bGwgYXMgdW5rbm93biBhcyBDYW50b25FeGVyY2lzZUNvbW1hbmQpLCAvY29tbWFuZCBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0Lyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXNvbHZlQ29udHJhY3RzKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgdGhlIHNwZWMgYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzcGVjID0gW3sgdGVtcGxhdGVJZDogVEVNUExBVEVfSUQsIGFjdEFzOiBbUEFSVFlfQV0sIGluamVjdEFzOiAnY29tbWFuZC5FeGVyY2lzZUNvbW1hbmQuY29udHJhY3RJZCcgfV07XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IENhbnRvbkNvbW1hbmRCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgYnVpbGRlci5yZXNvbHZlQ29udHJhY3RzKHNwZWMpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChidWlsZGVyWydfcmVzb2x2ZUNvbnRyYWN0cyddLCBzcGVjKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RvUmVxdWVzdE9iamVjdCgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3Qgb2JqZWN0IHdpdGggYWxsIHJlcXVpcmVkIGZpZWxkcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBidWlsZGVyLmNvbW1hbmRJZCgnY21kLTAwMScpLmFjdEFzKFtQQVJUWV9BXSkucmVhZEFzKFtQQVJUWV9CXSkuY29tbWFuZChzYW1wbGVFeGVyY2lzZUNvbW1hbmQpO1xuICAgICAgY29uc3QgcmVxOiBDYW50b25Db21tYW5kUmVxdWVzdCA9IGJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCk7XG4gICAgICBzaG91bGQuZXhpc3QocmVxKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXEuY29tbWFuZElkLCAnY21kLTAwMScpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXEuYWN0QXMsIFtQQVJUWV9BXSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlcS5yZWFkQXMsIFtQQVJUWV9CXSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlcS5jb21tYW5kLCBzYW1wbGVFeGVyY2lzZUNvbW1hbmQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGNvbW1hbmRJZCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDYW50b25Db21tYW5kQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIGJ1aWxkZXIuYWN0QXMoW1BBUlRZX0FdKS5jb21tYW5kKHNhbXBsZUV4ZXJjaXNlQ29tbWFuZCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9jb21tYW5kSWQgaXMgbWlzc2luZy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGFjdEFzIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IENhbnRvbkNvbW1hbmRCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgYnVpbGRlci5jb21tYW5kSWQoJ2NtZC0wMDEnKS5jb21tYW5kKHNhbXBsZUV4ZXJjaXNlQ29tbWFuZCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9hY3RBcyBpcyBtaXNzaW5nLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gY29tbWFuZCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDYW50b25Db21tYW5kQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIGJ1aWxkZXIuY29tbWFuZElkKCdjbWQtMDAxJykuYWN0QXMoW1BBUlRZX0FdKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci50b1JlcXVlc3RPYmplY3QoKSwgL2NvbW1hbmQgaXMgbWlzc2luZy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGNvbW1hbmQgY29udGFpbnMgaW52YWxpZCBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IENhbnRvbkNvbW1hbmRCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuY29tbWFuZElkKCdjbWQtMDAxJylcbiAgICAgICAgLmFjdEFzKFtQQVJUWV9BXSlcbiAgICAgICAgLmNvbW1hbmQoeyBVbmtub3duQ29tbWFuZDoge30gfSBhcyB1bmtub3duIGFzIENhbnRvbkV4ZXJjaXNlQ29tbWFuZCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9jb21tYW5kIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSBvZi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIGVtcHR5IHJlc29sdmVDb250cmFjdHMgYnkgZGVmYXVsdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBidWlsZGVyLmNvbW1hbmRJZCgnY21kLTAwMicpLmFjdEFzKFtQQVJUWV9BXSkuY29tbWFuZChzYW1wbGVDcmVhdGVDb21tYW5kKTtcbiAgICAgIGNvbnN0IHJlcSA9IGJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlcS5yZXNvbHZlQ29udHJhY3RzLCBbXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbml0QnVpbGRlcigpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGluaXRpYWxpemUgZnJvbSBleGlzdGluZyB0cmFuc2FjdGlvbiB3aXRoIGNhbnRvbkNvbW1hbmRBY3RBc1BhcnRpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICB0eC50cmFuc2FjdGlvblR5cGUgPSBUcmFuc2FjdGlvblR5cGUuQ2FudG9uQ29tbWFuZDtcbiAgICAgIHR4LmNhbnRvbkNvbW1hbmRBY3RBcyA9IFtQQVJUWV9BXTtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGJ1aWxkZXJbJ19hY3RBcyddLCBbUEFSVFlfQV0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBsZWF2ZSBfYWN0QXMgYXMgZW1wdHkgYXJyYXkgd2hlbiB0cmFuc2FjdGlvbiBoYXMgbm8gcGFydGllcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIHR4LnRyYW5zYWN0aW9uVHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5DYW50b25Db21tYW5kO1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDYW50b25Db21tYW5kQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoYnVpbGRlclsnX2FjdEFzJ10sIFtdKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RyYW5zYWN0aW9uVHlwZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBDYW50b25Db21tYW5kIHR5cGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IENhbnRvbkNvbW1hbmRCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGFzc2VydC5lcXVhbChidWlsZGVyLnRyYW5zYWN0aW9uVHlwZSwgVHJhbnNhY3Rpb25UeXBlLkNhbnRvbkNvbW1hbmQpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSAtIENhbnRvbkNvbW1hbmQnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgcmV0dXJuIGEgQ2FudG9uQ29tbWFuZEJ1aWxkZXIgZnJvbSBnZXRDYW50b25Db21tYW5kQnVpbGRlcigpJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0Q2FudG9uQ29tbWFuZEJ1aWxkZXIoKTtcbiAgICBzaG91bGQuZXhpc3QoYnVpbGRlcik7XG4gICAgYXNzZXJ0Lm9rKGJ1aWxkZXIgaW5zdGFuY2VvZiBDYW50b25Db21tYW5kQnVpbGRlcik7XG4gICAgYXNzZXJ0LmVxdWFsKGJ1aWxkZXIudHJhbnNhY3Rpb25UeXBlLCBUcmFuc2FjdGlvblR5cGUuQ2FudG9uQ29tbWFuZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGEgQ2FudG9uQ29tbWFuZEJ1aWxkZXIgZnJvbSBmcm9tKCkgd2l0aCBDYW50b25Db21tYW5kIHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eC50cmFuc2FjdGlvblR5cGUgPSBUcmFuc2FjdGlvblR5cGUuQ2FudG9uQ29tbWFuZDtcbiAgICB0eC5pZCA9ICd0ZXN0LWNtZC0wMDEnO1xuICAgIHR4LnByZXBhcmVDb21tYW5kID0gQ2FudG9uRXhlcmNpc2VDb21tYW5kUHJlcGFyZVJlc3BvbnNlO1xuICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICBzaG91bGQuZXhpc3QoYnVpbGRlcik7XG4gICAgYXNzZXJ0Lm9rKGJ1aWxkZXIgaW5zdGFuY2VvZiBDYW50b25Db21tYW5kQnVpbGRlcik7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdUcmFuc2FjdGlvbiB0b0pzb24gYW5kIGV4cGxhaW5UcmFuc2FjdGlvbiAtIENhbnRvbkNvbW1hbmQnLCAoKSA9PiB7XG4gIGxldCB0eDogVHJhbnNhY3Rpb247XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4LnRyYW5zYWN0aW9uVHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5DYW50b25Db21tYW5kO1xuICAgIHR4LmlkID0gJ3Rlc3QtY21kLTAwMSc7XG4gICAgdHgucHJlcGFyZUNvbW1hbmQgPSBDYW50b25FeGVyY2lzZUNvbW1hbmRQcmVwYXJlUmVzcG9uc2U7XG4gICAgdHguY2FudG9uQ29tbWFuZEFjdEFzID0gW1BBUlRZX0FdO1xuICB9KTtcblxuICBkZXNjcmliZSgndG9Kc29uKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY2FudG9uQ29tbWFuZCBzdW1tYXJ5IGZvciBDYW50b25Db21tYW5kIHRyYW5zYWN0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5leGlzdChqc29uKTtcbiAgICAgIHNob3VsZC5leGlzdChqc29uLmNhbnRvbkNvbW1hbmQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIGtpbmQsIHRlbXBsYXRlSWQsIGFuZCBhY3RBcyBpbiBzdW1tYXJ5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QganNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgY29uc3QgY2MgPSBqc29uLmNhbnRvbkNvbW1hbmQhO1xuICAgICAgYXNzZXJ0Lm9rKFsnRXhlcmNpc2VDb21tYW5kJywgJ0NyZWF0ZUNvbW1hbmQnXS5pbmNsdWRlcyhjYy5raW5kKSk7XG4gICAgICBhc3NlcnQub2soY2MudGVtcGxhdGVJZC5pbmNsdWRlcygnOicpKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoY2MuYWN0QXMsIFtQQVJUWV9BXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGluY2x1ZGUgY2hvaWNlIGZvciBFeGVyY2lzZUNvbW1hbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBjb25zdCBjYyA9IGpzb24uY2FudG9uQ29tbWFuZCE7XG4gICAgICBpZiAoY2Mua2luZCA9PT0gJ0V4ZXJjaXNlQ29tbWFuZCcpIHtcbiAgICAgICAgc2hvdWxkLmV4aXN0KGNjLmNob2ljZSk7XG4gICAgICAgIGFzc2VydC5lcXVhbChjYy5jaG9pY2UsICdBbGxvY2F0aW9uRmFjdG9yeV9PZmZlck1pbnQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5jbHVkZSBjb250cmFjdElkIGZvciBFeGVyY2lzZUNvbW1hbmQgd2hlbiBwcmVzZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QganNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgY29uc3QgY2MgPSBqc29uLmNhbnRvbkNvbW1hbmQhO1xuICAgICAgaWYgKGNjLmtpbmQgPT09ICdFeGVyY2lzZUNvbW1hbmQnKSB7XG4gICAgICAgIHNob3VsZC5leGlzdChjYy5jb250cmFjdElkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2V4cGxhaW5UcmFuc2FjdGlvbigpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGV4cGxhbmF0aW9uIHdpdGggY2FudG9uQ29tbWFuZCBmaWVsZCBmb3IgQ2FudG9uQ29tbWFuZCB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIHNob3VsZC5leGlzdChleHBsYW5hdGlvbik7XG4gICAgICBzaG91bGQuZXhpc3QoZXhwbGFuYXRpb24uY2FudG9uQ29tbWFuZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgY29ycmVjdCBzdHJ1Y3R1cmUgKGlkLCBkaXNwbGF5T3JkZXIsIG91dHB1dHMsIGlucHV0cywgZmVlLCB0eXBlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBhc3NlcnQub2soJ2lkJyBpbiBleHBsYW5hdGlvbik7XG4gICAgICBhc3NlcnQub2soJ2Rpc3BsYXlPcmRlcicgaW4gZXhwbGFuYXRpb24pO1xuICAgICAgYXNzZXJ0Lm9rKCdvdXRwdXRzJyBpbiBleHBsYW5hdGlvbik7XG4gICAgICBhc3NlcnQub2soJ2lucHV0cycgaW4gZXhwbGFuYXRpb24pO1xuICAgICAgYXNzZXJ0Lm9rKCdmZWUnIGluIGV4cGxhbmF0aW9uKTtcbiAgICAgIGFzc2VydC5vaygndHlwZScgaW4gZXhwbGFuYXRpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIGNvcnJlY3QgY2FudG9uQ29tbWFuZCBzdW1tYXJ5IGZpZWxkcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBjb25zdCBjYyA9IGV4cGxhbmF0aW9uLmNhbnRvbkNvbW1hbmQhO1xuICAgICAgYXNzZXJ0LmVxdWFsKGNjLmtpbmQsICdFeGVyY2lzZUNvbW1hbmQnKTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgY2MudGVtcGxhdGVJZCxcbiAgICAgICAgJzdhNzVlZjZlNjlmNjkzOTVhNGU2MDkxOWUyMjg1MjhiYjhmMzg4MTE1MGNjZmRlM2YzMWJjYzczODY0YjE4YWI6VXRpbGl0eS5SZWdpc3RyeS5BcHAuVjAuU2VydmljZS5BbGxvY2F0aW9uRmFjdG9yeTpBbGxvY2F0aW9uRmFjdG9yeSdcbiAgICAgICk7XG4gICAgICBhc3NlcnQuZXF1YWwoY2MuY2hvaWNlLCAnQWxsb2NhdGlvbkZhY3RvcnlfT2ZmZXJNaW50Jyk7XG4gICAgICBhc3NlcnQub2soY2MuY29udHJhY3RJZCAmJiBjYy5jb250cmFjdElkLmxlbmd0aCA+IDApO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChjYy5hY3RBcywgW1BBUlRZX0FdKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==