1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const tslib_1 = require("tslib");
|
4 | const client_common_1 = require("@neo-one/client-common");
|
5 | const bn_js_1 = require("bn.js");
|
6 | const lodash_1 = tslib_1.__importDefault(require("lodash"));
|
7 | class BinaryReader {
|
8 | constructor(buffer, index = 0) {
|
9 | this.buffer = buffer;
|
10 | this.mutableIndex = index;
|
11 | }
|
12 | get index() {
|
13 | return this.mutableIndex;
|
14 | }
|
15 | get remaining() {
|
16 | return this.buffer.length - this.mutableIndex;
|
17 | }
|
18 | get remainingBuffer() {
|
19 | return this.buffer.slice(this.mutableIndex);
|
20 | }
|
21 | hasMore() {
|
22 | return this.mutableIndex < this.buffer.byteLength;
|
23 | }
|
24 | clone() {
|
25 | return new BinaryReader(this.buffer, this.mutableIndex);
|
26 | }
|
27 | readBytes(numBytes) {
|
28 | this.checkRead(numBytes);
|
29 | const result = this.buffer.slice(this.mutableIndex, this.mutableIndex + numBytes);
|
30 | this.mutableIndex += numBytes;
|
31 | return result;
|
32 | }
|
33 | readInt8() {
|
34 | this.checkRead(1);
|
35 | const result = this.buffer.readInt8(this.mutableIndex);
|
36 | this.mutableIndex += 1;
|
37 | return result;
|
38 | }
|
39 | readUInt8() {
|
40 | this.checkRead(1);
|
41 | const result = this.buffer.readUInt8(this.mutableIndex);
|
42 | this.mutableIndex += 1;
|
43 | return result;
|
44 | }
|
45 | readBoolean() {
|
46 | return this.readBytes(1)[0] !== 0;
|
47 | }
|
48 | readInt16LE() {
|
49 | this.checkRead(2);
|
50 | const result = this.buffer.readInt16LE(this.mutableIndex);
|
51 | this.mutableIndex += 2;
|
52 | return result;
|
53 | }
|
54 | readUInt16LE() {
|
55 | this.checkRead(2);
|
56 | const result = this.buffer.readUInt16LE(this.mutableIndex);
|
57 | this.mutableIndex += 2;
|
58 | return result;
|
59 | }
|
60 | readUInt16BE() {
|
61 | this.checkRead(2);
|
62 | const result = this.buffer.readUInt16BE(this.mutableIndex);
|
63 | this.mutableIndex += 2;
|
64 | return result;
|
65 | }
|
66 | readInt32LE() {
|
67 | this.checkRead(4);
|
68 | const result = this.buffer.readInt32LE(this.mutableIndex);
|
69 | this.mutableIndex += 4;
|
70 | return result;
|
71 | }
|
72 | readUInt32LE() {
|
73 | this.checkRead(4);
|
74 | const result = this.buffer.readUInt32LE(this.mutableIndex);
|
75 | this.mutableIndex += 4;
|
76 | return result;
|
77 | }
|
78 | readUInt64LE() {
|
79 | return new bn_js_1.BN(this.readBytes(8), 'le');
|
80 | }
|
81 | readInt64LE() {
|
82 | const buffer = this.readBytes(8);
|
83 | return new bn_js_1.BN(buffer, 'le').fromTwos(buffer.length * 8);
|
84 | }
|
85 | readUInt160() {
|
86 | return client_common_1.common.bufferToUInt160(this.readBytes(client_common_1.common.UINT160_BUFFER_BYTES));
|
87 | }
|
88 | readUInt256() {
|
89 | return client_common_1.common.bufferToUInt256(this.readBytes(client_common_1.common.UINT256_BUFFER_BYTES));
|
90 | }
|
91 | readFixed8() {
|
92 | return this.readInt64LE();
|
93 | }
|
94 | readFixedString(length) {
|
95 | const values = lodash_1.default.takeWhile([...this.readBytes(length)], (value) => value !== 0);
|
96 | return Buffer.from(values).toString('utf8');
|
97 | }
|
98 | readArray(read, max = 0x1000000) {
|
99 | const count = this.readVarUIntLE(new bn_js_1.BN(max)).toNumber();
|
100 | return lodash_1.default.range(count).map(read);
|
101 | }
|
102 | readObject(read, max = 0x1000000) {
|
103 | const count = this.readVarUIntLE(new bn_js_1.BN(max)).toNumber();
|
104 | return lodash_1.default.range(count).reduce((acc) => {
|
105 | const { key, value } = read();
|
106 | return Object.assign({}, acc, { [key]: value });
|
107 | }, {});
|
108 | }
|
109 | readVarBytesLE(max = 0x1000000) {
|
110 | return this.readBytes(this.readVarUIntLE(new bn_js_1.BN(max)).toNumber());
|
111 | }
|
112 | readVarUIntLE(max = new bn_js_1.BN('18446744073709551615', 10)) {
|
113 | const fb = this.readUInt8();
|
114 | let value;
|
115 | switch (fb) {
|
116 | case 0xfd:
|
117 | value = new bn_js_1.BN(this.readUInt16LE());
|
118 | break;
|
119 | case 0xfe:
|
120 | value = new bn_js_1.BN(this.readUInt32LE());
|
121 | break;
|
122 | case 0xff:
|
123 | value = this.readUInt64LE();
|
124 | break;
|
125 | default:
|
126 | value = new bn_js_1.BN(fb);
|
127 | }
|
128 | if (value.gt(max)) {
|
129 | throw new client_common_1.InvalidFormatError(`Integer too large: ${value.toString(10)} > ${max.toString(10)}`);
|
130 | }
|
131 | return value;
|
132 | }
|
133 | readVarString(max = 0x1000000) {
|
134 | return this.readVarBytesLE(max).toString('utf8');
|
135 | }
|
136 | readECPoint() {
|
137 | const firstByte = this.readBytes(1);
|
138 | if (firstByte[0] === client_common_1.common.ECPOINT_INFINITY_BYTE) {
|
139 | return client_common_1.common.ECPOINT_INFINITY;
|
140 | }
|
141 | return client_common_1.common.bufferToECPoint(Buffer.concat([firstByte, this.readBytes(client_common_1.common.ECPOINT_BUFFER_BYTES - 1)]));
|
142 | }
|
143 | checkRead(numBytes) {
|
144 | if (this.remaining < numBytes) {
|
145 | throw new client_common_1.InvalidFormatError(`Insufficient bytes remaining (${this.remaining}): ${numBytes}`);
|
146 | }
|
147 | }
|
148 | }
|
149 | exports.BinaryReader = BinaryReader;
|
150 |
|
151 | //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFHLEdBQUcsU0FBUztRQUNsQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTSxXQUFXO1FBQ2hCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssc0JBQU0sQ0FBQyxxQkFBcUIsRUFBRTtZQUNqRCxPQUFPLHNCQUFNLENBQUMsZ0JBQWdCLENBQUM7U0FDaEM7UUFFRCxPQUFPLHNCQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBTSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFTyxTQUFTLENBQUMsUUFBZ0I7UUFDaEMsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsRUFBRTtZQUM3QixNQUFNLElBQUksa0NBQWtCLENBQUMsaUNBQWlDLElBQUksQ0FBQyxTQUFTLE1BQU0sUUFBUSxFQUFFLENBQUMsQ0FBQztTQUMvRjtJQUNILENBQUM7Q0FDRjtBQXZNRCxvQ0F1TUMiLCJmaWxlIjoibmVvLW9uZS1ub2RlLWNvcmUvc3JjL3V0aWxzL0JpbmFyeVJlYWRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbW1vbiwgRUNQb2ludCwgSW52YWxpZEZvcm1hdEVycm9yLCBVSW50MTYwLCBVSW50MjU2IH0gZnJvbSAnQG5lby1vbmUvY2xpZW50LWNvbW1vbic7XG5pbXBvcnQgeyBCTiB9IGZyb20gJ2JuLmpzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmV4cG9ydCBjbGFzcyBCaW5hcnlSZWFkZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgYnVmZmVyOiBCdWZmZXI7XG4gIHByaXZhdGUgbXV0YWJsZUluZGV4OiBudW1iZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGJ1ZmZlcjogQnVmZmVyLCBpbmRleCA9IDApIHtcbiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICB0aGlzLm11dGFibGVJbmRleCA9IGluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm11dGFibGVJbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVtYWluaW5nKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aCAtIHRoaXMubXV0YWJsZUluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCByZW1haW5pbmdCdWZmZXIoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIuc2xpY2UodGhpcy5tdXRhYmxlSW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGhhc01vcmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubXV0YWJsZUluZGV4IDwgdGhpcy5idWZmZXIuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBjbG9uZSgpOiBCaW5hcnlSZWFkZXIge1xuICAgIHJldHVybiBuZXcgQmluYXJ5UmVhZGVyKHRoaXMuYnVmZmVyLCB0aGlzLm11dGFibGVJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZEJ5dGVzKG51bUJ5dGVzOiBudW1iZXIpOiBCdWZmZXIge1xuICAgIHRoaXMuY2hlY2tSZWFkKG51bUJ5dGVzKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJ1ZmZlci5zbGljZSh0aGlzLm11dGFibGVJbmRleCwgdGhpcy5tdXRhYmxlSW5kZXggKyBudW1CeXRlcyk7XG4gICAgdGhpcy5tdXRhYmxlSW5kZXggKz0gbnVtQnl0ZXM7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHJlYWRJbnQ4KCk6IG51bWJlciB7XG4gICAgdGhpcy5jaGVja1JlYWQoMSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5idWZmZXIucmVhZEludDgodGhpcy5tdXRhYmxlSW5kZXgpO1xuICAgIHRoaXMubXV0YWJsZUluZGV4ICs9IDE7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHJlYWRVSW50OCgpOiBudW1iZXIge1xuICAgIHRoaXMuY2hlY2tSZWFkKDEpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYnVmZmVyLnJlYWRVSW50OCh0aGlzLm11dGFibGVJbmRleCk7XG4gICAgdGhpcy5tdXRhYmxlSW5kZXggKz0gMTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgcmVhZEJvb2xlYW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZEJ5dGVzKDEpWzBdICE9PSAwO1xuICB9XG5cbiAgcHVibGljIHJlYWRJbnQxNkxFKCk6IG51bWJlciB7XG4gICAgdGhpcy5jaGVja1JlYWQoMik7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5idWZmZXIucmVhZEludDE2TEUodGhpcy5tdXRhYmxlSW5kZXgpO1xuICAgIHRoaXMubXV0YWJsZUluZGV4ICs9IDI7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHJlYWRVSW50MTZMRSgpOiBudW1iZXIge1xuICAgIHRoaXMuY2hlY2tSZWFkKDIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MTZMRSh0aGlzLm11dGFibGVJbmRleCk7XG4gICAgdGhpcy5tdXRhYmxlSW5kZXggKz0gMjtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgcmVhZFVJbnQxNkJFKCk6IG51bWJlciB7XG4gICAgdGhpcy5jaGVja1JlYWQoMik7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5idWZmZXIucmVhZFVJbnQxNkJFKHRoaXMubXV0YWJsZUluZGV4KTtcbiAgICB0aGlzLm11dGFibGVJbmRleCArPSAyO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyByZWFkSW50MzJMRSgpOiBudW1iZXIge1xuICAgIHRoaXMuY2hlY2tSZWFkKDQpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYnVmZmVyLnJlYWRJbnQzMkxFKHRoaXMubXV0YWJsZUluZGV4KTtcbiAgICB0aGlzLm11dGFibGVJbmRleCArPSA0O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyByZWFkVUludDMyTEUoKTogbnVtYmVyIHtcbiAgICB0aGlzLmNoZWNrUmVhZCg0KTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5tdXRhYmxlSW5kZXgpO1xuICAgIHRoaXMubXV0YWJsZUluZGV4ICs9IDQ7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHJlYWRVSW50NjRMRSgpOiBCTiB7XG4gICAgcmV0dXJuIG5ldyBCTih0aGlzLnJlYWRCeXRlcyg4KSwgJ2xlJyk7XG4gIH1cblxuICBwdWJsaWMgcmVhZEludDY0TEUoKTogQk4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMucmVhZEJ5dGVzKDgpO1xuXG4gICAgcmV0dXJuIG5ldyBCTihidWZmZXIsICdsZScpLmZyb21Ud29zKGJ1ZmZlci5sZW5ndGggKiA4KTtcbiAgfVxuXG4gIC8vIE5FTyBzcGVjaWZpY1xuICBwdWJsaWMgcmVhZFVJbnQxNjAoKTogVUludDE2MCB7XG4gICAgcmV0dXJuIGNvbW1vbi5idWZmZXJUb1VJbnQxNjAodGhpcy5yZWFkQnl0ZXMoY29tbW9uLlVJTlQxNjBfQlVGRkVSX0JZVEVTKSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZFVJbnQyNTYoKTogVUludDI1NiB7XG4gICAgcmV0dXJuIGNvbW1vbi5idWZmZXJUb1VJbnQyNTYodGhpcy5yZWFkQnl0ZXMoY29tbW9uLlVJTlQyNTZfQlVGRkVSX0JZVEVTKSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZEZpeGVkOCgpOiBCTiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZEludDY0TEUoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkRml4ZWRTdHJpbmcobGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlcyA9IF8udGFrZVdoaWxlKFsuLi50aGlzLnJlYWRCeXRlcyhsZW5ndGgpXSwgKHZhbHVlKSA9PiB2YWx1ZSAhPT0gMCk7XG5cbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVzKS50b1N0cmluZygndXRmOCcpO1xuICB9XG5cbiAgcHVibGljIHJlYWRBcnJheTxUPihyZWFkOiAoKSA9PiBULCBtYXggPSAweDEwMDAwMDApOiByZWFkb25seSBUW10ge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5yZWFkVmFyVUludExFKG5ldyBCTihtYXgpKS50b051bWJlcigpO1xuXG4gICAgcmV0dXJuIF8ucmFuZ2UoY291bnQpLm1hcChyZWFkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkT2JqZWN0PFY+KFxuICAgIHJlYWQ6ICgpID0+IHsgcmVhZG9ubHkga2V5OiBudW1iZXI7IHJlYWRvbmx5IHZhbHVlOiBWIH0sXG4gICAgbWF4PzogbnVtYmVyLFxuICApOiB7IHJlYWRvbmx5IFtrZXk6IG51bWJlcl06IFYgfTtcbiAgcHVibGljIHJlYWRPYmplY3Q8Vj4oXG4gICAgcmVhZDogKCkgPT4geyByZWFkb25seSBrZXk6IHN0cmluZzsgcmVhZG9ubHkgdmFsdWU6IFYgfSxcbiAgICBtYXg/OiBudW1iZXIsXG4gICk6IHsgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogViB9O1xuICBwdWJsaWMgcmVhZE9iamVjdDxWPihcbiAgICByZWFkOiAoKSA9PiB7IHJlYWRvbmx5IGtleTogc3RyaW5nIHwgbnVtYmVyOyByZWFkb25seSB2YWx1ZTogViB9LFxuICAgIG1heCA9IDB4MTAwMDAwMCxcbiAgKTogeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBWIH0ge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5yZWFkVmFyVUludExFKG5ldyBCTihtYXgpKS50b051bWJlcigpO1xuXG4gICAgcmV0dXJuIF8ucmFuZ2UoY291bnQpLnJlZHVjZTx7IHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IFYgfT4oKGFjYykgPT4ge1xuICAgICAgY29uc3QgeyBrZXksIHZhbHVlIH0gPSByZWFkKCk7XG5cbiAgICAgIHJldHVybiB7IC4uLmFjYywgW2tleV06IHZhbHVlIH07XG4gICAgfSwge30pO1xuICB9XG5cbiAgcHVibGljIHJlYWRWYXJCeXRlc0xFKG1heCA9IDB4MTAwMDAwMCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMucmVhZEJ5dGVzKHRoaXMucmVhZFZhclVJbnRMRShuZXcgQk4obWF4KSkudG9OdW1iZXIoKSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZFZhclVJbnRMRShtYXg6IEJOID0gbmV3IEJOKCcxODQ0Njc0NDA3MzcwOTU1MTYxNScsIDEwKSk6IEJOIHtcbiAgICBjb25zdCBmYiA9IHRoaXMucmVhZFVJbnQ4KCk7XG4gICAgbGV0IHZhbHVlOiBCTjtcbiAgICBzd2l0Y2ggKGZiKSB7XG4gICAgICBjYXNlIDB4ZmQ6XG4gICAgICAgIHZhbHVlID0gbmV3IEJOKHRoaXMucmVhZFVJbnQxNkxFKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMHhmZTpcbiAgICAgICAgdmFsdWUgPSBuZXcgQk4odGhpcy5yZWFkVUludDMyTEUoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAweGZmOlxuICAgICAgICB2YWx1ZSA9IHRoaXMucmVhZFVJbnQ2NExFKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFsdWUgPSBuZXcgQk4oZmIpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5ndChtYXgpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEZvcm1hdEVycm9yKGBJbnRlZ2VyIHRvbyBsYXJnZTogJHt2YWx1ZS50b1N0cmluZygxMCl9ID4gJHttYXgudG9TdHJpbmcoMTApfWApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkVmFyU3RyaW5nKG1heCA9IDB4MTAwMDAwMCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVhZFZhckJ5dGVzTEUobWF4KS50b1N0cmluZygndXRmOCcpO1xuICB9XG5cbiAgcHVibGljIHJlYWRFQ1BvaW50KCk6IEVDUG9pbnQge1xuICAgIGNvbnN0IGZpcnN0Qnl0ZSA9IHRoaXMucmVhZEJ5dGVzKDEpO1xuICAgIGlmIChmaXJzdEJ5dGVbMF0gPT09IGNvbW1vbi5FQ1BPSU5UX0lORklOSVRZX0JZVEUpIHtcbiAgICAgIHJldHVybiBjb21tb24uRUNQT0lOVF9JTkZJTklUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tbW9uLmJ1ZmZlclRvRUNQb2ludChCdWZmZXIuY29uY2F0KFtmaXJzdEJ5dGUsIHRoaXMucmVhZEJ5dGVzKGNvbW1vbi5FQ1BPSU5UX0JVRkZFUl9CWVRFUyAtIDEpXSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1JlYWQobnVtQnl0ZXM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlbWFpbmluZyA8IG51bUJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEZvcm1hdEVycm9yKGBJbnN1ZmZpY2llbnQgYnl0ZXMgcmVtYWluaW5nICgke3RoaXMucmVtYWluaW5nfSk6ICR7bnVtQnl0ZXN9YCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|