@bitgo/sdk-coin-ton 3.11.5 → 3.13.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.
- package/dist/src/lib/constants.d.ts +2 -0
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +4 -2
- package/dist/src/lib/tonWhalesDepositBuilder.d.ts +12 -0
- package/dist/src/lib/tonWhalesDepositBuilder.d.ts.map +1 -0
- package/dist/src/lib/tonWhalesDepositBuilder.js +42 -0
- package/dist/src/lib/tonWhalesWithdrawalBuilder.d.ts +30 -0
- package/dist/src/lib/tonWhalesWithdrawalBuilder.d.ts.map +1 -0
- package/dist/src/lib/tonWhalesWithdrawalBuilder.js +60 -0
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +39 -1
- package/dist/src/lib/transactionBuilderFactory.d.ts +4 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +15 -1
- package/dist/src/lib/utils.d.ts +7 -0
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +13 -1
- package/dist/test/resources/ton.d.ts +49 -0
- package/dist/test/resources/ton.d.ts.map +1 -1
- package/dist/test/resources/ton.js +55 -2
- package/dist/test/unit/ton.js +11 -1
- package/dist/test/unit/tonWhalesDepositBuilder.d.ts +2 -0
- package/dist/test/unit/tonWhalesDepositBuilder.d.ts.map +1 -0
- package/dist/test/unit/tonWhalesDepositBuilder.js +114 -0
- package/dist/test/unit/tonWhalesWithdrawalBuilder.d.ts +2 -0
- package/dist/test/unit/tonWhalesWithdrawalBuilder.d.ts.map +1 -0
- package/dist/test/unit/tonWhalesWithdrawalBuilder.js +130 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const should_1 = __importDefault(require("should"));
|
|
40
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
41
|
+
const src_1 = require("../../src"); // Adjust path as needed
|
|
42
|
+
const statics_1 = require("@bitgo/statics");
|
|
43
|
+
const testData = __importStar(require("../resources/ton"));
|
|
44
|
+
const constants_1 = require("../../src/lib/constants");
|
|
45
|
+
describe('Ton Whales Withdrawal Builder', () => {
|
|
46
|
+
const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tton'));
|
|
47
|
+
// Define the scenarios we want to test
|
|
48
|
+
const scenarios = [
|
|
49
|
+
{
|
|
50
|
+
name: 'Partial Withdrawal (10 TON)',
|
|
51
|
+
fixture: testData.signedTonWhalesWithdrawalTransaction,
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'Full Withdrawal (Amount 0)',
|
|
55
|
+
fixture: testData.signedTonWhalesFullWithdrawalTransaction,
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
scenarios.forEach((scenario) => {
|
|
59
|
+
describe(scenario.name, () => {
|
|
60
|
+
const fixture = scenario.fixture;
|
|
61
|
+
it('should parse a raw transaction and extract correct parameters', async function () {
|
|
62
|
+
const txBuilder = factory.from(fixture.tx);
|
|
63
|
+
const builtTx = await txBuilder.build();
|
|
64
|
+
const jsonTx = builtTx.toJson();
|
|
65
|
+
// Verify Business Logic Fields
|
|
66
|
+
should_1.default.equal(builtTx.type, sdk_core_1.TransactionType.TonWhalesWithdrawal);
|
|
67
|
+
// NOTE: In withdrawals, recipient.amount is the FEE, withdrawAmount is the STAKE
|
|
68
|
+
should_1.default.equal(jsonTx.amount, fixture.recipient.amount);
|
|
69
|
+
should_1.default.equal(jsonTx.withdrawAmount, fixture.withdrawAmount);
|
|
70
|
+
should_1.default.equal(jsonTx.destination, fixture.recipient.address);
|
|
71
|
+
should_1.default.equal(jsonTx.sender, fixture.sender);
|
|
72
|
+
// Verify Network Constraints
|
|
73
|
+
should_1.default.equal(jsonTx.seqno, fixture.seqno);
|
|
74
|
+
should_1.default.equal(jsonTx.expirationTime, fixture.expireTime);
|
|
75
|
+
should_1.default.equal(jsonTx.bounceable, fixture.bounceable);
|
|
76
|
+
// Verify Payload Structure
|
|
77
|
+
// Logic: DecimalOpCode + HexQueryId + DecimalAmount
|
|
78
|
+
const msg = builtTx['message'] || '';
|
|
79
|
+
should_1.default.equal(msg.startsWith(constants_1.TON_WHALES_WITHDRAW_OPCODE), true);
|
|
80
|
+
// Ensure the payload ENDS with the decimal amount (either "1000..." or "0")
|
|
81
|
+
should_1.default.equal(msg.endsWith(fixture.withdrawAmount), true);
|
|
82
|
+
});
|
|
83
|
+
it('should parse and rebuild the transaction resulting in the same hex', async function () {
|
|
84
|
+
const txBuilder = factory.from(fixture.tx);
|
|
85
|
+
const builtTx = await txBuilder.build();
|
|
86
|
+
// Verify the parser extracted the signature
|
|
87
|
+
const signature = builtTx.signature[0];
|
|
88
|
+
should_1.default.exist(signature);
|
|
89
|
+
signature.should.not.be.empty();
|
|
90
|
+
// Rebuild from the parsed object
|
|
91
|
+
const builder2 = factory.from(builtTx.toBroadcastFormat());
|
|
92
|
+
const builtTx2 = await builder2.build();
|
|
93
|
+
// The output of the second build should match the original raw transaction
|
|
94
|
+
should_1.default.equal(builtTx2.toBroadcastFormat(), fixture.tx);
|
|
95
|
+
should_1.default.equal(builtTx2.type, sdk_core_1.TransactionType.TonWhalesWithdrawal);
|
|
96
|
+
});
|
|
97
|
+
it('should build a transaction from scratch that byte-for-byte matches the raw fixture', async function () {
|
|
98
|
+
// Get the specific Withdrawal Builder
|
|
99
|
+
const builder = factory.getTonWhalesWithdrawalBuilder();
|
|
100
|
+
// Set Header Info from Fixture
|
|
101
|
+
builder.sender(fixture.sender);
|
|
102
|
+
builder.publicKey(fixture.publicKey);
|
|
103
|
+
builder.sequenceNumber(fixture.seqno);
|
|
104
|
+
builder.expireTime(fixture.expireTime);
|
|
105
|
+
builder.bounceable(fixture.bounceable);
|
|
106
|
+
// Set Destination and ATTACHED VALUE (The Fee)
|
|
107
|
+
builder.send({
|
|
108
|
+
address: fixture.recipient.address,
|
|
109
|
+
amount: fixture.recipient.amount,
|
|
110
|
+
});
|
|
111
|
+
// Set Payload Data (The Unstake Amount)
|
|
112
|
+
// Note: This works for both partial (amount > 0) and full (amount = "0")
|
|
113
|
+
builder.setWithdrawalMessage(fixture.withdrawAmount, fixture.queryId);
|
|
114
|
+
// Attach Signature from Fixture (Mocking the HSM signing process)
|
|
115
|
+
if (fixture.signature) {
|
|
116
|
+
builder.addSignature({ pub: fixture.publicKey }, Buffer.from(fixture.signature, 'hex'));
|
|
117
|
+
}
|
|
118
|
+
// Build Signed Transaction
|
|
119
|
+
const signedBuiltTx = await builder.build();
|
|
120
|
+
const jsonTx = signedBuiltTx.toJson();
|
|
121
|
+
// Verify that the builder correctly set the withdrawal amount on the transaction object
|
|
122
|
+
should_1.default.equal(jsonTx.withdrawAmount, fixture.withdrawAmount);
|
|
123
|
+
// Byte-for-byte equality with the Sandbox output
|
|
124
|
+
should_1.default.equal(signedBuiltTx.toBroadcastFormat(), fixture.tx);
|
|
125
|
+
should_1.default.equal(signedBuiltTx.type, sdk_core_1.TransactionType.TonWhalesWithdrawal);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9uV2hhbGVzV2l0aGRyYXdhbEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdG9uV2hhbGVzV2l0aGRyYXdhbEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsOENBQWtEO0FBQ2xELG1DQUFzRCxDQUFDLHdCQUF3QjtBQUMvRSw0Q0FBdUM7QUFDdkMsMkRBQTZDO0FBQzdDLHVEQUFxRTtBQUVyRSxRQUFRLENBQUMsK0JBQStCLEVBQUUsR0FBRyxFQUFFO0lBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRWpFLHVDQUF1QztJQUN2QyxNQUFNLFNBQVMsR0FBRztRQUNoQjtZQUNFLElBQUksRUFBRSw2QkFBNkI7WUFDbkMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxvQ0FBb0M7U0FDdkQ7UUFDRDtZQUNFLElBQUksRUFBRSw0QkFBNEI7WUFDbEMsT0FBTyxFQUFFLFFBQVEsQ0FBQyx3Q0FBd0M7U0FDM0Q7S0FDRixDQUFDO0lBRUYsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQzdCLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtZQUMzQixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBRWpDLEVBQUUsQ0FBQywrREFBK0QsRUFBRSxLQUFLO2dCQUN2RSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDM0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUs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LGdCQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3hFLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9zcmMnOyAvLyBBZGp1c3QgcGF0aCBhcyBuZWVkZWRcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3Rvbic7XG5pbXBvcnQgeyBUT05fV0hBTEVTX1dJVEhEUkFXX09QQ09ERSB9IGZyb20gJy4uLy4uL3NyYy9saWIvY29uc3RhbnRzJztcblxuZGVzY3JpYmUoJ1RvbiBXaGFsZXMgV2l0aGRyYXdhbCBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0dG9uJykpO1xuXG4gIC8vIERlZmluZSB0aGUgc2NlbmFyaW9zIHdlIHdhbnQgdG8gdGVzdFxuICBjb25zdCBzY2VuYXJpb3MgPSBbXG4gICAge1xuICAgICAgbmFtZTogJ1BhcnRpYWwgV2l0aGRyYXdhbCAoMTAgVE9OKScsXG4gICAgICBmaXh0dXJlOiB0ZXN0RGF0YS5zaWduZWRUb25XaGFsZXNXaXRoZHJhd2FsVHJhbnNhY3Rpb24sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnRnVsbCBXaXRoZHJhd2FsIChBbW91bnQgMCknLFxuICAgICAgZml4dHVyZTogdGVzdERhdGEuc2lnbmVkVG9uV2hhbGVzRnVsbFdpdGhkcmF3YWxUcmFuc2FjdGlvbixcbiAgICB9LFxuICBdO1xuXG4gIHNjZW5hcmlvcy5mb3JFYWNoKChzY2VuYXJpbykgPT4ge1xuICAgIGRlc2NyaWJlKHNjZW5hcmlvLm5hbWUsICgpID0+IHtcbiAgICAgIGNvbnN0IGZpeHR1cmUgPSBzY2VuYXJpby5maXh0dXJlO1xuXG4gICAgICBpdCgnc2hvdWxkIHBhcnNlIGEgcmF3IHRyYW5zYWN0aW9uIGFuZCBleHRyYWN0IGNvcnJlY3QgcGFyYW1ldGVycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGZpeHR1cmUudHgpO1xuICAgICAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IGpzb25UeCA9IGJ1aWx0VHgudG9Kc29uKCk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IEJ1c2luZXNzIExvZ2ljIEZpZWxkc1xuICAgICAgICBzaG91bGQuZXF1YWwoYnVpbHRUeC50eXBlLCBUcmFuc2FjdGlvblR5cGUuVG9uV2hhbGVzV2l0aGRyYXdhbCk7XG5cbiAgICAgICAgLy8gTk9URTogSW4gd2l0aGRyYXdhbHMsIHJlY2lwaWVudC5hbW91bnQgaXMgdGhlIEZFRSwgd2l0aGRyYXdBbW91bnQgaXMgdGhlIFNUQUtFXG4gICAgICAgIHNob3VsZC5lcXVhbChqc29uVHguYW1vdW50LCBmaXh0dXJlLnJlY2lwaWVudC5hbW91bnQpO1xuICAgICAgICBzaG91bGQuZXF1YWwoanNvblR4LndpdGhkcmF3QW1vdW50LCBmaXh0dXJlLndpdGhkcmF3QW1vdW50KTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoanNvblR4LmRlc3RpbmF0aW9uLCBmaXh0dXJlLnJlY2lwaWVudC5hZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGpzb25UeC5zZW5kZXIsIGZpeHR1cmUuc2VuZGVyKTtcblxuICAgICAgICAvLyBWZXJpZnkgTmV0d29yayBDb25zdHJhaW50c1xuICAgICAgICBzaG91bGQuZXF1YWwoanNvblR4LnNlcW5vLCBmaXh0dXJlLnNlcW5vKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGpzb25UeC5leHBpcmF0aW9uVGltZSwgZml4dHVyZS5leHBpcmVUaW1lKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGpzb25UeC5ib3VuY2VhYmxlLCBmaXh0dXJlLmJvdW5jZWFibGUpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBQYXlsb2FkIFN0cnVjdHVyZVxuICAgICAgICAvLyBMb2dpYzogRGVjaW1hbE9wQ29kZSArIEhleFF1ZXJ5SWQgKyBEZWNpbWFsQW1vdW50XG4gICAgICAgIGNvbnN0IG1zZyA9IGJ1aWx0VHhbJ21lc3NhZ2UnXSB8fCAnJztcbiAgICAgICAgc2hvdWxkLmVxdWFsKG1zZy5zdGFydHNXaXRoKFRPTl9XSEFMRVNfV0lUSERSQVdfT1BDT0RFKSwgdHJ1ZSk7XG5cbiAgICAgICAgLy8gRW5zdXJlIHRoZSBwYXlsb2FkIEVORFMgd2l0aCB0aGUgZGVjaW1hbCBhbW91bnQgKGVpdGhlciBcIjEwMDAuLi5cIiBvciBcIjBcIilcbiAgICAgICAgc2hvdWxkLmVxdWFsKG1zZy5lbmRzV2l0aChmaXh0dXJlLndpdGhkcmF3QW1vdW50KSwgdHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBwYXJzZSBhbmQgcmVidWlsZCB0aGUgdHJhbnNhY3Rpb24gcmVzdWx0aW5nIGluIHRoZSBzYW1lIGhleCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGZpeHR1cmUudHgpO1xuICAgICAgICBjb25zdCBidWlsdFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHRoZSBwYXJzZXIgZXh0cmFjdGVkIHRoZSBzaWduYXR1cmVcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYnVpbHRUeC5zaWduYXR1cmVbMF07XG4gICAgICAgIHNob3VsZC5leGlzdChzaWduYXR1cmUpO1xuICAgICAgICBzaWduYXR1cmUuc2hvdWxkLm5vdC5iZS5lbXB0eSgpO1xuXG4gICAgICAgIC8vIFJlYnVpbGQgZnJvbSB0aGUgcGFyc2VkIG9iamVjdFxuICAgICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZnJvbShidWlsdFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICBjb25zdCBidWlsdFR4MiA9IGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgICAgLy8gVGhlIG91dHB1dCBvZiB0aGUgc2Vjb25kIGJ1aWxkIHNob3VsZCBtYXRjaCB0aGUgb3JpZ2luYWwgcmF3IHRyYW5zYWN0aW9uXG4gICAgICAgIHNob3VsZC5lcXVhbChidWlsdFR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpLCBmaXh0dXJlLnR4KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHgyLnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5Ub25XaGFsZXNXaXRoZHJhd2FsKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNhY3Rpb24gZnJvbSBzY3JhdGNoIHRoYXQgYnl0ZS1mb3ItYnl0ZSBtYXRjaGVzIHRoZSByYXcgZml4dHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBzcGVjaWZpYyBXaXRoZHJhd2FsIEJ1aWxkZXJcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VG9uV2hhbGVzV2l0aGRyYXdhbEJ1aWxkZXIoKTtcblxuICAgICAgICAvLyBTZXQgSGVhZGVyIEluZm8gZnJvbSBGaXh0dXJlXG4gICAgICAgIGJ1aWxkZXIuc2VuZGVyKGZpeHR1cmUuc2VuZGVyKTtcbiAgICAgICAgYnVpbGRlci5wdWJsaWNLZXkoZml4dHVyZS5wdWJsaWNLZXkpO1xuICAgICAgICBidWlsZGVyLnNlcXVlbmNlTnVtYmVyKGZpeHR1cmUuc2Vxbm8pO1xuICAgICAgICBidWlsZGVyLmV4cGlyZVRpbWUoZml4dHVyZS5leHBpcmVUaW1lKTtcbiAgICAgICAgYnVpbGRlci5ib3VuY2VhYmxlKGZpeHR1cmUuYm91bmNlYWJsZSk7XG5cbiAgICAgICAgLy8gU2V0IERlc3RpbmF0aW9uIGFuZCBBVFRBQ0hFRCBWQUxVRSAoVGhlIEZlZSlcbiAgICAgICAgYnVpbGRlci5zZW5kKHtcbiAgICAgICAgICBhZGRyZXNzOiBmaXh0dXJlLnJlY2lwaWVudC5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogZml4dHVyZS5yZWNpcGllbnQuYW1vdW50LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTZXQgUGF5bG9hZCBEYXRhIChUaGUgVW5zdGFrZSBBbW91bnQpXG4gICAgICAgIC8vIE5vdGU6IFRoaXMgd29ya3MgZm9yIGJvdGggcGFydGlhbCAoYW1vdW50ID4gMCkgYW5kIGZ1bGwgKGFtb3VudCA9IFwiMFwiKVxuICAgICAgICBidWlsZGVyLnNldFdpdGhkcmF3YWxNZXNzYWdlKGZpeHR1cmUud2l0aGRyYXdBbW91bnQsIGZpeHR1cmUucXVlcnlJZCk7XG5cbiAgICAgICAgLy8gQXR0YWNoIFNpZ25hdHVyZSBmcm9tIEZpeHR1cmUgKE1vY2tpbmcgdGhlIEhTTSBzaWduaW5nIHByb2Nlc3MpXG4gICAgICAgIGlmIChmaXh0dXJlLnNpZ25hdHVyZSkge1xuICAgICAgICAgIGJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBmaXh0dXJlLnB1YmxpY0tleSB9LCBCdWZmZXIuZnJvbShmaXh0dXJlLnNpZ25hdHVyZSwgJ2hleCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJ1aWxkIFNpZ25lZCBUcmFuc2FjdGlvblxuICAgICAgICBjb25zdCBzaWduZWRCdWlsdFR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCBqc29uVHggPSBzaWduZWRCdWlsdFR4LnRvSnNvbigpO1xuXG4gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBidWlsZGVyIGNvcnJlY3RseSBzZXQgdGhlIHdpdGhkcmF3YWwgYW1vdW50IG9uIHRoZSB0cmFuc2FjdGlvbiBvYmplY3RcbiAgICAgICAgc2hvdWxkLmVxdWFsKGpzb25UeC53aXRoZHJhd0Ftb3VudCwgZml4dHVyZS53aXRoZHJhd0Ftb3VudCk7XG5cbiAgICAgICAgLy8gQnl0ZS1mb3ItYnl0ZSBlcXVhbGl0eSB3aXRoIHRoZSBTYW5kYm94IG91dHB1dFxuICAgICAgICBzaG91bGQuZXF1YWwoc2lnbmVkQnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLCBmaXh0dXJlLnR4KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZEJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlRvbldoYWxlc1dpdGhkcmF3YWwpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|