@bitgo-beta/sdk-coin-sol 7.6.4-beta.702 → 7.6.4-beta.704
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/cjs/src/lib/serialization/codecs/v1/config.d.ts +21 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/config.js +34 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts +14 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/instruction.js +32 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts +17 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/codecs/v1/message.js +68 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts +30 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/compileTransactionMessage.js +205 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.d.ts +14 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/serialization/wire-transaction.js +51 -0
- package/dist/cjs/test/unit/serialization/transactionV1.d.ts +2 -0
- package/dist/cjs/test/unit/serialization/transactionV1.d.ts.map +1 -0
- package/dist/cjs/test/unit/serialization/transactionV1.js +136 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
- package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
- package/dist/esm/lib/serialization/codecs/v1/message.d.ts +17 -0
- package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
- package/dist/esm/lib/serialization/codecs/v1/message.js +61 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +30 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
- package/dist/esm/lib/serialization/compileTransactionMessage.js +202 -0
- package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
- package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
- package/dist/esm/lib/serialization/wire-transaction.js +48 -0
- package/package.json +7 -7
|
@@ -0,0 +1,136 @@
|
|
|
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 web3_js_1 = require("@solana/web3.js");
|
|
8
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
9
|
+
const tweetnacl_1 = __importDefault(require("tweetnacl"));
|
|
10
|
+
const compileTransactionMessage_1 = require("../../../src/lib/serialization/compileTransactionMessage");
|
|
11
|
+
const wire_transaction_1 = require("../../../src/lib/serialization/wire-transaction");
|
|
12
|
+
const TOKEN_2022_PROGRAM_ID = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb';
|
|
13
|
+
function buildTransfer(feePayer, token) {
|
|
14
|
+
return new web3_js_1.TransactionInstruction({
|
|
15
|
+
keys: [
|
|
16
|
+
{ pubkey: feePayer, isSigner: true, isWritable: true },
|
|
17
|
+
{ pubkey: token, isSigner: false, isWritable: true },
|
|
18
|
+
],
|
|
19
|
+
programId: new web3_js_1.PublicKey(TOKEN_2022_PROGRAM_ID),
|
|
20
|
+
data: Buffer.from([27, 5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 6]),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function buildProof(size) {
|
|
24
|
+
return new web3_js_1.TransactionInstruction({
|
|
25
|
+
keys: [{ pubkey: new web3_js_1.PublicKey(TOKEN_2022_PROGRAM_ID), isSigner: false, isWritable: false }],
|
|
26
|
+
programId: new web3_js_1.PublicKey(TOKEN_2022_PROGRAM_ID),
|
|
27
|
+
data: Buffer.alloc(size, 0xab),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const config = {
|
|
31
|
+
computeUnitLimit: 200000,
|
|
32
|
+
heapSize: 32768,
|
|
33
|
+
loadedAccountsDataSizeLimit: 65536,
|
|
34
|
+
priorityFee: 5000,
|
|
35
|
+
};
|
|
36
|
+
describe('v1 transaction compilation and serialization (plain TS)', () => {
|
|
37
|
+
const feePayer = web3_js_1.Keypair.generate().publicKey;
|
|
38
|
+
const tokenAddress = web3_js_1.Keypair.generate().publicKey;
|
|
39
|
+
const recentBlockhash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
|
|
40
|
+
it('compiles a v1 message with the 0x81 version prefix', () => {
|
|
41
|
+
const bytes = (0, compileTransactionMessage_1.compileTransactionMessage)({
|
|
42
|
+
version: 1,
|
|
43
|
+
instructions: [buildTransfer(feePayer, tokenAddress)],
|
|
44
|
+
feePayer,
|
|
45
|
+
recentBlockhash,
|
|
46
|
+
transactionConfig: config,
|
|
47
|
+
});
|
|
48
|
+
assert_1.default.strictEqual(bytes[0], 0x81);
|
|
49
|
+
// header: 1 signer (fee payer), 0 readonly signers, 0 readonly non-signers
|
|
50
|
+
assert_1.default.strictEqual(bytes[1], 1); // numSignerAccounts
|
|
51
|
+
assert_1.default.strictEqual(bytes[2], 0); // numReadonlySignerAccounts
|
|
52
|
+
assert_1.default.strictEqual(bytes[3], 1); // numReadonlyNonSignerAccounts (the invoked program)
|
|
53
|
+
});
|
|
54
|
+
it('encodes the transaction config mask and values', () => {
|
|
55
|
+
const bytes = (0, compileTransactionMessage_1.compileTransactionMessage)({
|
|
56
|
+
version: 1,
|
|
57
|
+
instructions: [buildTransfer(feePayer, tokenAddress)],
|
|
58
|
+
feePayer,
|
|
59
|
+
recentBlockhash,
|
|
60
|
+
transactionConfig: config,
|
|
61
|
+
});
|
|
62
|
+
// configMask is u32 LE at bytes 4..8: priorityFee(0b11) + cuLimit(0b100) + loaded(0b1000) + heap(0b10000) = 0b11111 = 31
|
|
63
|
+
assert_1.default.strictEqual(bytes[4], 0x1f);
|
|
64
|
+
assert_1.default.strictEqual(bytes[5], 0x00);
|
|
65
|
+
assert_1.default.strictEqual(bytes[6], 0x00);
|
|
66
|
+
assert_1.default.strictEqual(bytes[7], 0x00);
|
|
67
|
+
});
|
|
68
|
+
it('serializes and round-trips a >2048-byte v1 transaction within the size limit', () => {
|
|
69
|
+
const messageBytes = (0, compileTransactionMessage_1.compileTransactionMessage)({
|
|
70
|
+
version: 1,
|
|
71
|
+
instructions: [buildTransfer(feePayer, tokenAddress), buildProof(2300)],
|
|
72
|
+
feePayer,
|
|
73
|
+
recentBlockhash,
|
|
74
|
+
transactionConfig: config,
|
|
75
|
+
});
|
|
76
|
+
const secretKey = web3_js_1.Keypair.generate().secretKey;
|
|
77
|
+
const signature = tweetnacl_1.default.sign.detached(messageBytes, secretKey);
|
|
78
|
+
const wire = (0, wire_transaction_1.serializeWireTransaction)(messageBytes, [signature]);
|
|
79
|
+
assert_1.default.ok(wire.length > 2048);
|
|
80
|
+
assert_1.default.ok(wire.length <= 4096);
|
|
81
|
+
assert_1.default.strictEqual(wire[0], 0x81);
|
|
82
|
+
// message-first framing: message bytes first, then the 64-byte signature
|
|
83
|
+
const sigStart = wire.length - 64;
|
|
84
|
+
assert_1.default.deepStrictEqual(wire.slice(sigStart), signature);
|
|
85
|
+
});
|
|
86
|
+
it('strips ComputeBudget instructions and folds them into the config', () => {
|
|
87
|
+
const cuLimit = web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: 500000 });
|
|
88
|
+
const price = web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 250000 });
|
|
89
|
+
const noBudgetConfig = {
|
|
90
|
+
computeUnitLimit: null,
|
|
91
|
+
heapSize: null,
|
|
92
|
+
loadedAccountsDataSizeLimit: null,
|
|
93
|
+
priorityFee: null,
|
|
94
|
+
};
|
|
95
|
+
const bytes = (0, compileTransactionMessage_1.compileTransactionMessage)({
|
|
96
|
+
version: 1,
|
|
97
|
+
instructions: [cuLimit, price, buildTransfer(feePayer, tokenAddress)],
|
|
98
|
+
feePayer,
|
|
99
|
+
recentBlockhash,
|
|
100
|
+
transactionConfig: noBudgetConfig,
|
|
101
|
+
});
|
|
102
|
+
// configMask = priorityFee(0b11) + cuLimit(0b100) = 0b111 = 7
|
|
103
|
+
assert_1.default.strictEqual(bytes[4], 0x07);
|
|
104
|
+
});
|
|
105
|
+
it('throws on empty instructions or missing config', () => {
|
|
106
|
+
assert_1.default.throws(() => (0, compileTransactionMessage_1.compileTransactionMessage)({
|
|
107
|
+
version: 1,
|
|
108
|
+
instructions: [],
|
|
109
|
+
feePayer,
|
|
110
|
+
recentBlockhash,
|
|
111
|
+
transactionConfig: config,
|
|
112
|
+
}), sdk_core_1.BuildTransactionError);
|
|
113
|
+
assert_1.default.throws(() => (0, compileTransactionMessage_1.compileTransactionMessage)({
|
|
114
|
+
version: 1,
|
|
115
|
+
instructions: [buildTransfer(feePayer, tokenAddress)],
|
|
116
|
+
feePayer,
|
|
117
|
+
recentBlockhash,
|
|
118
|
+
transactionConfig: undefined,
|
|
119
|
+
}), sdk_core_1.BuildTransactionError);
|
|
120
|
+
});
|
|
121
|
+
it('throws on invalid recent blockhash', () => {
|
|
122
|
+
assert_1.default.throws(() => (0, compileTransactionMessage_1.compileTransactionMessage)({
|
|
123
|
+
version: 1,
|
|
124
|
+
instructions: [buildTransfer(feePayer, tokenAddress)],
|
|
125
|
+
feePayer,
|
|
126
|
+
recentBlockhash: 'not-a-valid-blockhash',
|
|
127
|
+
transactionConfig: config,
|
|
128
|
+
}), sdk_core_1.BuildTransactionError);
|
|
129
|
+
});
|
|
130
|
+
it('serializeV1Transaction enforces version prefix, signature count, and size', () => {
|
|
131
|
+
assert_1.default.throws(() => (0, wire_transaction_1.serializeWireTransaction)(new Uint8Array(), []), sdk_core_1.BuildTransactionError);
|
|
132
|
+
assert_1.default.throws(() => (0, wire_transaction_1.serializeWireTransaction)(new Uint8Array([0x80, 1]), [new Uint8Array(64)]), sdk_core_1.BuildTransactionError);
|
|
133
|
+
assert_1.default.throws(() => (0, wire_transaction_1.serializeWireTransaction)(new Uint8Array([0x81, 1, 0, 0]), []), sdk_core_1.BuildTransactionError);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25WMS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9zZXJpYWxpemF0aW9uL3RyYW5zYWN0aW9uVjEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNkNBQW1HO0FBQ25HLG1EQUE2RDtBQUM3RCwwREFBNkI7QUFDN0Isd0dBQXFHO0FBQ3JHLHNGQUEyRjtBQUUzRixNQUFNLHFCQUFxQixHQUFHLDZDQUE2QyxDQUFDO0FBRTVFLFNBQVMsYUFBYSxDQUFDLFFBQW1CLEVBQUUsS0FBZ0I7SUFDMUQsT0FBTyxJQUFJLGdDQUFzQixDQUFDO1FBQ2hDLElBQUksRUFBRTtZQUNKLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7WUFDdEQsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtTQUNyRDtRQUNELFNBQVMsRUFBRSxJQUFJLG1CQUFTLENBQUMscUJBQXFCLENBQUM7UUFDL0MsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDOUUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLElBQVk7SUFDOUIsT0FBTyxJQUFJLGdDQUFzQixDQUFDO1FBQ2hDLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksbUJBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzVGLFNBQVMsRUFB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QUM7SUFFSCxFQUFFLENBQUMsMkVBQTJFLEVBQUUsR0FBRyxFQUFFO1FBQ25GLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsMkNBQXdCLEVBQUMsSUFBSSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxnQ0FBcUIsQ0FBQyxDQUFDO1FBQzNGLGdCQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUFDLElBQUEsMkNBQXdCLEVBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDL0UsZ0NBQXFCLENBQ3RCLENBQUM7UUFDRixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLDJDQUF3QixFQUFDLElBQUksVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxnQ0FBcUIsQ0FBQyxDQUFDO0lBQzVHLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBDb21wdXRlQnVkZ2V0UHJvZ3JhbSwgS2V5cGFpciwgUHVibGljS2V5LCBUcmFuc2FjdGlvbkluc3RydWN0aW9uIH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQgeyBjb21waWxlVHJhbnNhY3Rpb25NZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9zZXJpYWxpemF0aW9uL2NvbXBpbGVUcmFuc2FjdGlvbk1lc3NhZ2UnO1xuaW1wb3J0IHsgc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9zZXJpYWxpemF0aW9uL3dpcmUtdHJhbnNhY3Rpb24nO1xuXG5jb25zdCBUT0tFTl8yMDIyX1BST0dSQU1fSUQgPSAnVG9rZW56UWRCTmJMcVA1VkVoZGtBUzZFUEZMQzFQSG5CcUNYRXBQeHVFYic7XG5cbmZ1bmN0aW9uIGJ1aWxkVHJhbnNmZXIoZmVlUGF5ZXI6IFB1YmxpY0tleSwgdG9rZW46IFB1YmxpY0tleSk6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24ge1xuICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgIGtleXM6IFtcbiAgICAgIHsgcHVia2V5OiBmZWVQYXllciwgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiB0b2tlbiwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgXSxcbiAgICBwcm9ncmFtSWQ6IG5ldyBQdWJsaWNLZXkoVE9LRU5fMjAyMl9QUk9HUkFNX0lEKSxcbiAgICBkYXRhOiBCdWZmZXIuZnJvbShbMjcsIDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsIDZdKSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJvb2Yoc2l6ZTogbnVtYmVyKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbiB7XG4gIHJldHVybiBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAga2V5czogW3sgcHVia2V5OiBuZXcgUHVibGljS2V5KFRPS0VOXzIwMjJfUFJPR1JBTV9JRCksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfV0sXG4gICAgcHJvZ3JhbUlkOiBuZXcgUHVibGljS2V5KFRPS0VOXzIwMjJfUFJPR1JBTV9JRCksXG4gICAgZGF0YTogQnVmZmVyLmFsbG9jKHNpemUsIDB4YWIpLFxuICB9KTtcbn1cblxuY29uc3QgY29uZmlnID0ge1xuICBjb21wdXRlVW5pdExpbWl0OiAyMDBfMDAwLFxuICBoZWFwU2l6ZTogMzJfNzY4LFxuICBsb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQ6IDY1XzUzNixcbiAgcHJpb3JpdHlGZWU6IDVfMDAwLFxufTtcblxuZGVzY3JpYmUoJ3YxIHRyYW5zYWN0aW9uIGNvbXBpbGF0aW9uIGFuZCBzZXJpYWxpemF0aW9uIChwbGFpbiBUUyknLCAoKSA9PiB7XG4gIGNvbnN0IGZlZVBheWVyID0gS2V5cGFpci5nZW5lcmF0ZSgpLnB1YmxpY0tleTtcbiAgY29uc3QgdG9rZW5BZGRyZXNzID0gS2V5cGFpci5nZW5lcmF0ZSgpLnB1YmxpY0tleTtcbiAgY29uc3QgcmVjZW50QmxvY2toYXNoID0gJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJztcblxuICBpdCgnY29tcGlsZXMgYSB2MSBtZXNzYWdlIHdpdGggdGhlIDB4ODEgdmVyc2lvbiBwcmVmaXgnLCAoKSA9PiB7XG4gICAgY29uc3QgYnl0ZXMgPSBjb21waWxlVHJhbnNhY3Rpb25NZXNzYWdlKHtcbiAgICAgIHZlcnNpb246IDEsXG4gICAgICBpbnN0cnVjdGlvbnM6IFtidWlsZFRyYW5zZmVyKGZlZVBheWVyLCB0b2tlbkFkZHJlc3MpXSxcbiAgICAgIGZlZVBheWVyLFxuICAgICAgcmVjZW50QmxvY2toYXNoLFxuICAgICAgdHJhbnNhY3Rpb25Db25maWc6IGNvbmZpZyxcbiAgICB9KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnl0ZXNbMF0sIDB4ODEpO1xuICAgIC8vIGhlYWRlcjogMSBzaWduZXIgKGZlZSBwYXllciksIDAgcmVhZG9ubHkgc2lnbmVycywgMCByZWFkb25seSBub24tc2lnbmVyc1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChieXRlc1sxXSwgMSk7IC8vIG51bVNpZ25lckFjY291bnRzXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ5dGVzWzJdLCAwKTsgLy8gbnVtUmVhZG9ubHlTaWduZXJBY2NvdW50c1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChieXRlc1szXSwgMSk7IC8vIG51bVJlYWRvbmx5Tm9uU2lnbmVyQWNjb3VudHMgKHRoZSBpbnZva2VkIHByb2dyYW0pXG4gIH0pO1xuXG4gIGl0KCdlbmNvZGVzIHRoZSB0cmFuc2FjdGlvbiBjb25maWcgbWFzayBhbmQgdmFsdWVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZSh7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBbYnVpbGRUcmFuc2ZlcihmZWVQYXllciwgdG9rZW5BZGRyZXNzKV0sXG4gICAgICBmZWVQYXllcixcbiAgICAgIHJlY2VudEJsb2NraGFzaCxcbiAgICAgIHRyYW5zYWN0aW9uQ29uZmlnOiBjb25maWcsXG4gICAgfSk7XG4gICAgLy8gY29uZmlnTWFzayBpcyB1MzIgTEUgYXQgYnl0ZXMgNC4uODogcHJpb3JpdHlGZWUoMGIxMSkgKyBjdUxpbWl0KDBiMTAwKSArIGxvYWRlZCgwYjEwMDApICsgaGVhcCgwYjEwMDAwKSA9IDBiMTExMTEgPSAzMVxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChieXRlc1s0XSwgMHgxZik7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ5dGVzWzVdLCAweDAwKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnl0ZXNbNl0sIDB4MDApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChieXRlc1s3XSwgMHgwMCk7XG4gIH0pO1xuXG4gIGl0KCdzZXJpYWxpemVzIGFuZCByb3VuZC10cmlwcyBhID4yMDQ4LWJ5dGUgdjEgdHJhbnNhY3Rpb24gd2l0aGluIHRoZSBzaXplIGxpbWl0JywgKCkgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2VCeXRlcyA9IGNvbXBpbGVUcmFuc2FjdGlvbk1lc3NhZ2Uoe1xuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIGluc3RydWN0aW9uczogW2J1aWxkVHJhbnNmZXIoZmVlUGF5ZXIsIHRva2VuQWRkcmVzcyksIGJ1aWxkUHJvb2YoMjMwMCldLFxuICAgICAgZmVlUGF5ZXIsXG4gICAgICByZWNlbnRCbG9ja2hhc2gsXG4gICAgICB0cmFuc2FjdGlvbkNvbmZpZzogY29uZmlnLFxuICAgIH0pO1xuICAgIGNvbnN0IHNlY3JldEtleSA9IEtleXBhaXIuZ2VuZXJhdGUoKS5zZWNyZXRLZXk7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gbmFjbC5zaWduLmRldGFjaGVkKG1lc3NhZ2VCeXRlcywgc2VjcmV0S2V5KTtcbiAgICBjb25zdCB3aXJlID0gc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uKG1lc3NhZ2VCeXRlcywgW3NpZ25hdHVyZV0pO1xuICAgIGFzc2VydC5vayh3aXJlLmxlbmd0aCA+IDIwNDgpO1xuICAgIGFzc2VydC5vayh3aXJlLmxlbmd0aCA8PSA0MDk2KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2lyZVswXSwgMHg4MSk7XG4gICAgLy8gbWVzc2FnZS1maXJzdCBmcmFtaW5nOiBtZXNzYWdlIGJ5dGVzIGZpcnN0LCB0aGVuIHRoZSA2NC1ieXRlIHNpZ25hdHVyZVxuICAgIGNvbnN0IHNpZ1N0YXJ0ID0gd2lyZS5sZW5ndGggLSA2NDtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHdpcmUuc2xpY2Uoc2lnU3RhcnQpLCBzaWduYXR1cmUpO1xuICB9KTtcblxuICBpdCgnc3RyaXBzIENvbXB1dGVCdWRnZXQgaW5zdHJ1Y3Rpb25zIGFuZCBmb2xkcyB0aGVtIGludG8gdGhlIGNvbmZpZycsICgpID0+IHtcbiAgICBjb25zdCBjdUxpbWl0ID0gQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRMaW1pdCh7IHVuaXRzOiA1MDBfMDAwIH0pO1xuICAgIGNvbnN0IHByaWNlID0gQ29tcHV0ZUJ1ZGdldFByb2dyYW0uc2V0Q29tcHV0ZVVuaXRQcmljZSh7IG1pY3JvTGFtcG9ydHM6IDI1MF8wMDAgfSk7XG4gICAgY29uc3Qgbm9CdWRnZXRDb25maWcgPSB7XG4gICAgICBjb21wdXRlVW5pdExpbWl0OiBudWxsLFxuICAgICAgaGVhcFNpemU6IG51bGwsXG4gICAgICBsb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQ6IG51bGwsXG4gICAgICBwcmlvcml0eUZlZTogbnVsbCxcbiAgICB9O1xuICAgIGNvbnN0IGJ5dGVzID0gY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZSh7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBbY3VMaW1pdCwgcHJpY2UsIGJ1aWxkVHJhbnNmZXIoZmVlUGF5ZXIsIHRva2VuQWRkcmVzcyldLFxuICAgICAgZmVlUGF5ZXIsXG4gICAgICByZWNlbnRCbG9ja2hhc2gsXG4gICAgICB0cmFuc2FjdGlvbkNvbmZpZzogbm9CdWRnZXRDb25maWcsXG4gICAgfSk7XG4gICAgLy8gY29uZmlnTWFzayA9IHByaW9yaXR5RmVlKDBiMTEpICsgY3VMaW1pdCgwYjEwMCkgPSAwYjExMSA9IDdcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnl0ZXNbNF0sIDB4MDcpO1xuICB9KTtcblxuICBpdCgndGhyb3dzIG9uIGVtcHR5IGluc3RydWN0aW9ucyBvciBtaXNzaW5nIGNvbmZpZycsICgpID0+IHtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT5cbiAgICAgICAgY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZSh7XG4gICAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IFtdLFxuICAgICAgICAgIGZlZVBheWVyLFxuICAgICAgICAgIHJlY2VudEJsb2NraGFzaCxcbiAgICAgICAgICB0cmFuc2FjdGlvbkNvbmZpZzogY29uZmlnLFxuICAgICAgICB9KSxcbiAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvclxuICAgICk7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+XG4gICAgICAgIGNvbXBpbGVUcmFuc2FjdGlvbk1lc3NhZ2Uoe1xuICAgICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBbYnVpbGRUcmFuc2ZlcihmZWVQYXllciwgdG9rZW5BZGRyZXNzKV0sXG4gICAgICAgICAgZmVlUGF5ZXIsXG4gICAgICAgICAgcmVjZW50QmxvY2toYXNoLFxuICAgICAgICAgIHRyYW5zYWN0aW9uQ29uZmlnOiB1bmRlZmluZWQgYXMgbmV2ZXIsXG4gICAgICAgIH0pLFxuICAgICAgQnVpbGRUcmFuc2FjdGlvbkVycm9yXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyBvbiBpbnZhbGlkIHJlY2VudCBibG9ja2hhc2gnLCAoKSA9PiB7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+XG4gICAgICAgIGNvbXBpbGVUcmFuc2FjdGlvbk1lc3NhZ2Uoe1xuICAgICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBbYnVpbGRUcmFuc2ZlcihmZWVQYXllciwgdG9rZW5BZGRyZXNzKV0sXG4gICAgICAgICAgZmVlUGF5ZXIsXG4gICAgICAgICAgcmVjZW50QmxvY2toYXNoOiAnbm90LWEtdmFsaWQtYmxvY2toYXNoJyxcbiAgICAgICAgICB0cmFuc2FjdGlvbkNvbmZpZzogY29uZmlnLFxuICAgICAgICB9KSxcbiAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvclxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzZXJpYWxpemVWMVRyYW5zYWN0aW9uIGVuZm9yY2VzIHZlcnNpb24gcHJlZml4LCBzaWduYXR1cmUgY291bnQsIGFuZCBzaXplJywgKCkgPT4ge1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uKG5ldyBVaW50OEFycmF5KCksIFtdKSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4gc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uKG5ldyBVaW50OEFycmF5KFsweDgwLCAxXSksIFtuZXcgVWludDhBcnJheSg2NCldKSxcbiAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvclxuICAgICk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBzZXJpYWxpemVXaXJlVHJhbnNhY3Rpb24obmV3IFVpbnQ4QXJyYXkoWzB4ODEsIDEsIDAsIDBdKSwgW10pLCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICB9KTtcbn0pO1xuIl19
|