@bitgo/sdk-coin-tempo 1.5.2 → 1.6.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.
@@ -7,9 +7,11 @@ const assert_1 = __importDefault(require("assert"));
7
7
  const mocha_1 = require("mocha");
8
8
  const ethers_1 = require("ethers");
9
9
  const transactionBuilder_1 = require("../../src/lib/transactionBuilder");
10
+ const transaction_1 = require("../../src/lib/transaction");
10
11
  const utils_1 = require("../../src/lib/utils");
11
12
  const constants_1 = require("../../src/lib/constants");
12
13
  const statics_1 = require("@bitgo/statics");
14
+ const tempo_1 = require("../resources/tempo");
13
15
  const mockCoinConfig = statics_1.coins.get('ttempo');
14
16
  (0, mocha_1.describe)('TIP-20 Utilities', () => {
15
17
  (0, mocha_1.describe)('amountToTip20Units', () => {
@@ -32,42 +34,25 @@ const mockCoinConfig = statics_1.coins.get('ttempo');
32
34
  (0, mocha_1.describe)('stringToBytes32', () => {
33
35
  (0, mocha_1.it)('should convert string to bytes32', () => {
34
36
  const result = (0, utils_1.stringToBytes32)('12345');
35
- assert_1.default.strictEqual(typeof result, 'string');
36
37
  assert_1.default.strictEqual(result.length, 66);
37
38
  assert_1.default.ok(result.startsWith('0x'));
38
39
  });
39
40
  (0, mocha_1.it)('should throw error for string longer than 32 bytes', () => {
40
- const longString = 'a'.repeat(33);
41
- assert_1.default.throws(() => (0, utils_1.stringToBytes32)(longString), /Memo too long/);
41
+ assert_1.default.throws(() => (0, utils_1.stringToBytes32)('a'.repeat(33)), /Memo too long/);
42
42
  });
43
43
  });
44
44
  (0, mocha_1.describe)('encodeTip20TransferWithMemo', () => {
45
45
  (0, mocha_1.it)('should encode transferWithMemo call', () => {
46
46
  const to = ethers_1.ethers.utils.getAddress('0x742d35cc6634c0532925a3b844bc9e7595f0beb1');
47
- const amount = 1500000n;
48
- const memo = '12345';
49
- const encoded = (0, utils_1.encodeTip20TransferWithMemo)(to, amount, memo);
50
- assert_1.default.strictEqual(typeof encoded, 'string');
47
+ const encoded = (0, utils_1.encodeTip20TransferWithMemo)(to, 1500000n, '12345');
51
48
  assert_1.default.ok(encoded.startsWith('0x'));
52
49
  assert_1.default.ok(encoded.length > 10);
53
50
  });
54
- (0, mocha_1.it)('should encode transferWithMemo without memo', () => {
55
- const to = ethers_1.ethers.utils.getAddress('0x742d35cc6634c0532925a3b844bc9e7595f0beb1');
56
- const amount = 1500000n;
57
- const encoded = (0, utils_1.encodeTip20TransferWithMemo)(to, amount);
58
- assert_1.default.strictEqual(typeof encoded, 'string');
59
- assert_1.default.ok(encoded.startsWith('0x'));
60
- });
61
51
  });
62
52
  (0, mocha_1.describe)('isValidTip20Amount', () => {
63
- (0, mocha_1.it)('should validate correct amounts', () => {
53
+ (0, mocha_1.it)('should validate amounts correctly', () => {
64
54
  assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('1.5'), true);
65
- assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('100'), true);
66
- assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('0.000001'), true);
67
- });
68
- (0, mocha_1.it)('should invalidate incorrect amounts', () => {
69
55
  assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('invalid'), false);
70
- assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)(''), false);
71
56
  assert_1.default.strictEqual((0, utils_1.isValidTip20Amount)('-5'), false);
72
57
  });
73
58
  });
@@ -77,164 +62,60 @@ const mockCoinConfig = statics_1.coins.get('ttempo');
77
62
  const mockRecipient = ethers_1.ethers.utils.getAddress('0x742d35cc6634c0532925a3b844bc9e7595f0beb1');
78
63
  const mockFeeToken = ethers_1.ethers.utils.getAddress('0xabcdefabcdefabcdefabcdefabcdefabcdefabcd');
79
64
  (0, mocha_1.describe)('addOperation', () => {
80
- (0, mocha_1.it)('should add a single operation without memo', () => {
65
+ (0, mocha_1.it)('should add operation with and without memo', () => {
81
66
  const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
82
- builder.addOperation({
83
- token: mockToken,
84
- to: mockRecipient,
85
- amount: '100.5',
86
- });
67
+ builder.addOperation({ token: mockToken, to: mockRecipient, amount: '100' });
68
+ builder.addOperation({ token: mockToken, to: mockRecipient, amount: '50', memo: '1' });
87
69
  const operations = builder.getOperations();
88
- assert_1.default.strictEqual(operations.length, 1);
89
- assert_1.default.strictEqual(operations[0].token, mockToken);
90
- assert_1.default.strictEqual(operations[0].to, mockRecipient);
91
- assert_1.default.strictEqual(operations[0].amount, '100.5');
70
+ assert_1.default.strictEqual(operations.length, 2);
92
71
  assert_1.default.strictEqual(operations[0].memo, undefined);
72
+ assert_1.default.strictEqual(operations[1].memo, '1');
93
73
  });
94
- (0, mocha_1.it)('should add a single operation with memo', () => {
95
- const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
96
- builder.addOperation({
97
- token: mockToken,
98
- to: mockRecipient,
99
- amount: '100.5',
100
- memo: '202501',
101
- });
102
- const operations = builder.getOperations();
103
- assert_1.default.strictEqual(operations.length, 1);
104
- assert_1.default.strictEqual(operations[0].memo, '202501');
105
- });
106
- (0, mocha_1.it)('should add multiple operations (batch)', () => {
74
+ (0, mocha_1.it)('should throw error for invalid addresses', () => {
107
75
  const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
108
- builder
109
- .addOperation({
110
- token: mockToken,
111
- to: mockRecipient,
112
- amount: '50.0',
113
- memo: '1001',
114
- })
115
- .addOperation({
116
- token: mockToken,
117
- to: mockRecipient,
118
- amount: '30.0',
119
- memo: '1002',
120
- })
121
- .addOperation({
122
- token: mockToken,
123
- to: mockRecipient,
124
- amount: '20.0',
125
- memo: '1003',
126
- });
127
- const operations = builder.getOperations();
128
- assert_1.default.strictEqual(operations.length, 3);
129
- assert_1.default.strictEqual(operations[0].memo, '1001');
130
- assert_1.default.strictEqual(operations[1].memo, '1002');
131
- assert_1.default.strictEqual(operations[2].memo, '1003');
132
- });
133
- (0, mocha_1.it)('should throw error for invalid token address', () => {
134
- const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
135
- assert_1.default.throws(() => {
136
- builder.addOperation({
137
- token: '0xinvalid',
138
- to: mockRecipient,
139
- amount: '100',
140
- });
141
- }, /Invalid token address/);
142
- });
143
- (0, mocha_1.it)('should throw error for invalid recipient address', () => {
144
- const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
145
- assert_1.default.throws(() => {
146
- builder.addOperation({
147
- token: mockToken,
148
- to: '0xinvalid',
149
- amount: '100',
150
- });
151
- }, /Invalid recipient address/);
76
+ assert_1.default.throws(() => builder.addOperation({ token: '0xinvalid', to: mockRecipient, amount: '100' }), /Invalid token address/);
77
+ assert_1.default.throws(() => builder.addOperation({ token: mockToken, to: '0xinvalid', amount: '100' }), /Invalid recipient address/);
152
78
  });
153
79
  (0, mocha_1.it)('should throw error for invalid amount', () => {
154
80
  const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
155
- assert_1.default.throws(() => {
156
- builder.addOperation({
157
- token: mockToken,
158
- to: mockRecipient,
159
- amount: 'invalid-amount',
160
- });
161
- }, /Invalid amount/);
81
+ assert_1.default.throws(() => builder.addOperation({ token: mockToken, to: mockRecipient, amount: 'invalid-amount' }), /Invalid amount/);
162
82
  });
163
83
  (0, mocha_1.it)('should throw error for memo longer than 32 bytes', () => {
164
84
  const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
165
- const longMemo = 'a'.repeat(33);
166
- assert_1.default.throws(() => {
167
- builder.addOperation({
168
- token: mockToken,
169
- to: mockRecipient,
170
- amount: '100',
171
- memo: longMemo,
172
- });
173
- }, /Memo too long/);
85
+ assert_1.default.throws(() => builder.addOperation({ token: mockToken, to: mockRecipient, amount: '100', memo: 'a'.repeat(33) }), /Memo too long/);
174
86
  });
175
87
  });
176
88
  (0, mocha_1.describe)('feeToken', () => {
177
- (0, mocha_1.it)('should set fee token', () => {
89
+ (0, mocha_1.it)('should set and get fee token', () => {
178
90
  const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
179
91
  builder.feeToken(mockFeeToken);
180
92
  assert_1.default.strictEqual(builder.getFeeToken(), mockFeeToken);
181
93
  });
182
94
  (0, mocha_1.it)('should throw error for invalid fee token address', () => {
183
95
  const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
184
- assert_1.default.throws(() => {
185
- builder.feeToken('invalid-address');
186
- }, /Invalid fee token address/);
96
+ assert_1.default.throws(() => builder.feeToken('invalid-address'), /Invalid fee token address/);
187
97
  });
188
98
  });
189
99
  (0, mocha_1.describe)('Transaction parameters', () => {
190
- (0, mocha_1.it)('should set nonce', () => {
100
+ (0, mocha_1.it)('should set nonce, gas, maxFeePerGas, and maxPriorityFeePerGas', () => {
191
101
  const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
192
- builder.nonce(42);
102
+ builder.nonce(42).gas(500000n).maxFeePerGas(1000000000n).maxPriorityFeePerGas(500000000n);
193
103
  assert_1.default.strictEqual(builder._nonce, 42);
194
- });
195
- (0, mocha_1.it)('should throw error for negative nonce', () => {
196
- const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
197
- assert_1.default.throws(() => {
198
- builder.nonce(-1);
199
- }, /Invalid nonce/);
200
- });
201
- (0, mocha_1.it)('should set gas limit', () => {
202
- const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
203
- builder.gas(500000n);
204
104
  assert_1.default.strictEqual(builder._gas, 500000n);
205
- });
206
- (0, mocha_1.it)('should set gas limit from string', () => {
207
- const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
208
- builder.gas('500000');
209
- assert_1.default.strictEqual(builder._gas, 500000n);
210
- });
211
- (0, mocha_1.it)('should throw error for invalid gas limit', () => {
212
- const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
213
- assert_1.default.throws(() => {
214
- builder.gas(0n);
215
- }, /Invalid gas limit/);
216
- });
217
- (0, mocha_1.it)('should set maxFeePerGas', () => {
218
- const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
219
- builder.maxFeePerGas(1000000000n);
220
105
  assert_1.default.strictEqual(builder._maxFeePerGas, 1000000000n);
106
+ assert_1.default.strictEqual(builder._maxPriorityFeePerGas, 500000000n);
221
107
  });
222
- (0, mocha_1.it)('should set maxPriorityFeePerGas', () => {
108
+ (0, mocha_1.it)('should throw error for invalid nonce and gas', () => {
223
109
  const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
224
- builder.maxPriorityFeePerGas(500000000n);
225
- assert_1.default.strictEqual(builder._maxPriorityFeePerGas, 500000000n);
110
+ assert_1.default.throws(() => builder.nonce(-1), /Invalid nonce/);
111
+ assert_1.default.throws(() => builder.gas(0n), /Invalid gas limit/);
226
112
  });
227
113
  });
228
114
  (0, mocha_1.describe)('Method chaining', () => {
229
115
  (0, mocha_1.it)('should support fluent interface', () => {
230
116
  const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
231
117
  const result = builder
232
- .addOperation({
233
- token: mockToken,
234
- to: mockRecipient,
235
- amount: '100',
236
- memo: '9999',
237
- })
118
+ .addOperation({ token: mockToken, to: mockRecipient, amount: '100', memo: '5' })
238
119
  .feeToken(mockFeeToken)
239
120
  .nonce(10)
240
121
  .gas(400000n)
@@ -249,4 +130,169 @@ const mockCoinConfig = statics_1.coins.get('ttempo');
249
130
  assert_1.default.strictEqual(constants_1.TIP20_DECIMALS, 6);
250
131
  });
251
132
  });
252
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixpQ0FBcUM7QUFDckMsbUNBQWdDO0FBQ2hDLHlFQUEyRTtBQUMzRSwrQ0FNNkI7QUFDN0IsdURBQXlEO0FBQ3pELDRDQUF1QztBQUV2QyxNQUFNLGNBQWMsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRTNDLElBQUEsZ0JBQVEsRUFBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7SUFDaEMsSUFBQSxnQkFBUSxFQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtRQUNsQyxJQUFBLFVBQUUsRUFBQyxrREFBa0QsRUFBRSxHQUFHLEVBQUU7WUFDMUQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSwwQkFBa0IsRUFBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN4RCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFBLDBCQUFrQixFQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzFELGdCQUFNLENBQUMsV0FBVyxDQUFDLElBQUEsMEJBQWtCLEVBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLFVBQUUsRUFBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7WUFDL0MsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwwQkFBa0IsRUFBQyxTQUFTLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBQzlFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGdCQUFRLEVBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO1FBQ2xDLElBQUEsVUFBRSxFQUFDLHlEQUF5RCxFQUFFLEdBQUcsRUFBRTtZQUNqRSxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFBLDBCQUFrQixFQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3hELGdCQUFNLENBQUMsV0FBVyxDQUFDLElBQUEsMEJBQWtCLEVBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDNUQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSwwQkFBa0IsRUFBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxnQkFBUSxFQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtRQUMvQixJQUFBLFVBQUUsRUFBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7WUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBQSx1QkFBZSxFQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLGdCQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzVDLGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxVQUFFLEVBQUMsb0RBQW9ELEVBQUUsR0FBRyxFQUFFO1lBQzVELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSx1QkFBZSxFQUFDLFVBQVUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGdCQUFRLEVBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO1FBQzNDLElBQUEsVUFBRSxFQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRTtZQUM3QyxNQUFNLEVBQUUsR0FBRyxlQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUN4QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUM7WUFFckIsTUFBTSxPQUFPLEdBQUcsSUFBQSxtQ0FBMkIsRUFBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzlELGdCQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLGdCQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNwQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxVQUFFLEVBQUMsNkNBQTZDLEVBQUUsR0FBRyxFQUFFO1lBQ3JELE1BQU0sRUFBRSxHQUFHLGVBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7WUFDakYsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO1lBRXhCLE1BQU0sT0FBTyxHQUFHLElBQUEsbUNBQTJCLEVBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3hELGdCQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLGdCQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxnQkFBUSxFQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtRQUNsQyxJQUFBLFVBQUUsRUFBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7WUFDekMsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSwwQkFBa0IsRUFBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFBLDBCQUFrQixFQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BELGdCQUFNLENBQUMsV0FBVyxDQUFDLElBQUEsMEJBQWtCLEVBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLFVBQUUsRUFBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUU7WUFDN0MsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSwwQkFBa0IsRUFBQyxTQUFTLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN6RCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFBLDBCQUFrQixFQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2xELGdCQUFNLENBQUMsV0FBVyxDQUFDLElBQUEsMEJBQWtCLEVBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBQSxnQkFBUSxFQUFDLDRCQUE0QixFQUFFLEdBQUcsRUFBRTtJQUMxQyxNQUFNLFNBQVMsR0FBRyxlQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ3hGLE1BQU0sYUFBYSxHQUFHLGVBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDNUYsTUFBTSxZQUFZLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsNENBQTRDLENBQUMsQ0FBQztJQUUzRixJQUFBLGdCQUFRLEVBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtRQUM1QixJQUFBLFVBQUUsRUFBQyw0Q0FBNEMsRUFBRSxHQUFHLEVBQUU7WUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSw0Q0FBdUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUU1RCxPQUFPLENBQUMsWUFBWSxDQUFDO2dCQUNuQixLQUFLLEVBQUUsU0FBUztnQkFDaEIsRUFBRSxFQUFFLGFBQWE7Z0JBQ2pCLE1BQU0sRUFBRSxPQUFPO2FBQ2hCLENBQUMsQ0FBQztZQUVILE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLGdCQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDbkQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNwRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELGdCQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLFVBQUUsRUFBQyx5Q0FBeUMsRUFBRSxHQUFHLEVBQUU7WUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSw0Q0FBdUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUU1RCxPQUFPLENBQUMsWUFBWSxDQUFDO2dCQUNuQixLQUFLLEVBQUUsU0FBUztnQkFDaEIsRUFBRSxFQUFFLGFBQWE7Z0JBQ2pCLE1BQU0sRUFBRSxPQUFPO2dCQUNmLElBQUksRUFBRSxRQUFRO2FBQ2YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNDLGdCQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsVUFBRSxFQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtZQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLDRDQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTVELE9BQU87aUJBQ0osWUFBWSxDQUFDO2dCQUNaLEtBQUssRUFBRSxTQUFTO2dCQUNoQixFQUFFLEVBQUUsYUFBYTtnQkFDakIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsSUFBSSxFQUFFLE1BQU07YUFDYixDQUFDO2lCQUNELFlBQVksQ0FBQztnQkFDWixLQUFLLEVBQUUsU0FBUztnQkFDaEIsRUFBRSxFQUFFLGFBQWE7Z0JBQ2pCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQztpQkFDRCxZQUFZLENBQUM7Z0JBQ1osS0FBSyxFQUFFLFNBQVM7Z0JBQ2hCLEVBQUUsRUFBRSxhQUFhO2dCQUNqQixNQUFNLEVBQUUsTUFBTTtnQkFDZCxJQUFJLEVBQUUsTUFBTTthQUNiLENBQUMsQ0FBQztZQUVMLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLGdCQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDL0MsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMvQyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxVQUFFLEVBQUMsOENBQThDLEVBQUUsR0FBRyxFQUFFO1lBQ3RELE1BQU0sT0FBTyxHQUFHLElBQUksNENBQXVCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFNUQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNqQixPQUFPLENBQUMsWUFBWSxDQUFDO29CQUNuQixLQUFLLEVBQUUsV0FBa0I7b0JBQ3pCLEVBQUUsRUFBRSxhQUFhO29CQUNqQixNQUFNLEVBQUUsS0FBSztpQkFDZCxDQUFDLENBQUM7WUFDTCxDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsVUFBRSxFQUFDLGtEQUFrRCxFQUFFLEdBQUcsRUFBRTtZQUMxRCxNQUFNLE9BQU8sR0FBRyxJQUFJLDRDQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTVELGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDakIsT0FBTyxDQUFDLFlBQVksQ0FBQztvQkFDbkIsS0FBSyxFQUFFLFNBQVM7b0JBQ2hCLEVBQUUsRUFBRSxXQUFrQjtvQkFDdEIsTUFBTSxFQUFFLEtBQUs7aUJBQ2QsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxFQUFFLDJCQUEyQixDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLFVBQUUsRUFBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7WUFDL0MsTUFBTSxPQUFPLEdBQUcsSUFBSSw0Q0FBdUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUU1RCxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxZQUFZLENBQUM7b0JBQ25CLEtBQUssRUFBRSxTQUFTO29CQUNoQixFQUFFLEVBQUUsYUFBYTtvQkFDakIsTUFBTSxFQUFFLGdCQUFnQjtpQkFDekIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLFVBQUUsRUFBQyxrREFBa0QsRUFBRSxHQUFHLEVBQUU7WUFDMUQsTUFBTSxPQUFPLEdBQUcsSUFBSSw0Q0FBdUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1RCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRWhDLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDakIsT0FBTyxDQUFDLFlBQVksQ0FBQztvQkFDbkIsS0FBSyxFQUFFLFNBQVM7b0JBQ2hCLEVBQUUsRUFBRSxhQUFhO29CQUNqQixNQUFNLEVBQUUsS0FBSztvQkFDYixJQUFJLEVBQUUsUUFBUTtpQkFDZixDQUFDLENBQUM7WUFDTCxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsZ0JBQVEsRUFBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO1FBQ3hCLElBQUEsVUFBRSxFQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtZQUM5QixNQUFNLE9BQU8sR0FBRyxJQUFJLDRDQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTVELE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFL0IsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxVQUFFLEVBQUMsa0RBQWtELEVBQUUsR0FBRyxFQUFFO1lBQzFELE1BQU0sT0FBTyxHQUFHLElBQUksNENBQXVCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFNUQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNqQixPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDdEMsQ0FBQyxFQUFFLDJCQUEyQixDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsZ0JBQVEsRUFBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7UUFDdEMsSUFBQSxVQUFFLEVBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1lBQzFCLE1BQU0sT0FBTyxHQUFHLElBQUksNENBQXVCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQixnQkFBTSxDQUFDLFdBQVcsQ0FBRSxPQUFlLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxVQUFFLEVBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFO1lBQy9DLE1BQU0sT0FBTyxHQUFHLElBQUksNENBQXVCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNqQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxVQUFFLEVBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO1lBQzlCLE1BQU0sT0FBTyxHQUFHLElBQUksNENBQXVCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQixnQkFBTSxDQUFDLFdBQVcsQ0FBRSxPQUFlLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxVQUFFLEVBQUMsa0NBQWtDLEVBQUUsR0FBRyxFQUFFO1lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksNENBQXVCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QixnQkFBTSxDQUFDLFdBQVcsQ0FBRSxPQUFlLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxVQUFFLEVBQUMsMENBQTBDLEVBQUUsR0FBRyxFQUFFO1lBQ2xELE1BQU0sT0FBTyxHQUFHLElBQUksNENBQXVCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxVQUFFLEVBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFO1lBQ2pDLE1BQU0sT0FBTyxHQUFHLElBQUksNENBQXVCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUQsT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNsQyxnQkFBTSxDQUFDLFdBQVcsQ0FBRSxPQUFlLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxVQUFFLEVBQUMsaUNBQWlDLEVBQUUsR0FBRyxFQUFFO1lBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksNENBQXVCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUQsT0FBTyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pDLGdCQUFNLENBQUMsV0FBVyxDQUFFLE9BQWUsQ0FBQyxxQkFBcUIsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxnQkFBUSxFQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtRQUMvQixJQUFBLFVBQUUsRUFBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7WUFDekMsTUFBTSxPQUFPLEdBQUcsSUFBSSw0Q0FBdUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUU1RCxNQUFNLE1BQU0sR0FBRyxPQUFPO2lCQUNuQixZQUFZLENBQUM7Z0JBQ1osS0FBSyxFQUFFLFNBQVM7Z0JBQ2hCLEVBQUUsRUFBRSxhQUFhO2dCQUNqQixNQUFNLEVBQUUsS0FBSztnQkFDYixJQUFJLEVBQUUsTUFBTTthQUNiLENBQUM7aUJBQ0QsUUFBUSxDQUFDLFlBQVksQ0FBQztpQkFDdEIsS0FBSyxDQUFDLEVBQUUsQ0FBQztpQkFDVCxHQUFHLENBQUMsT0FBTyxDQUFDO2lCQUNaLFlBQVksQ0FBQyxXQUFXLENBQUM7aUJBQ3pCLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXJDLGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFBLGdCQUFRLEVBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLElBQUEsVUFBRSxFQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtRQUM1QyxnQkFBTSxDQUFDLFdBQVcsQ0FBQywwQkFBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBkZXNjcmliZSwgaXQgfSBmcm9tICdtb2NoYSc7XG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xuaW1wb3J0IHsgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQge1xuICBhbW91bnRUb1RpcDIwVW5pdHMsXG4gIHRpcDIwVW5pdHNUb0Ftb3VudCxcbiAgc3RyaW5nVG9CeXRlczMyLFxuICBlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8sXG4gIGlzVmFsaWRUaXAyMEFtb3VudCxcbn0gZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBUSVAyMF9ERUNJTUFMUyB9IGZyb20gJy4uLy4uL3NyYy9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5jb25zdCBtb2NrQ29pbkNvbmZpZyA9IGNvaW5zLmdldCgndHRlbXBvJyk7XG5cbmRlc2NyaWJlKCdUSVAtMjAgVXRpbGl0aWVzJywgKCkgPT4ge1xuICBkZXNjcmliZSgnYW1vdW50VG9UaXAyMFVuaXRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29udmVydCBkZWNpbWFsIGFtb3VudCB0byA2LWRlY2ltYWwgdW5pdHMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYW1vdW50VG9UaXAyMFVuaXRzKCcxLjUnKSwgMTUwMDAwMG4pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFtb3VudFRvVGlwMjBVbml0cygnMTAwJyksIDEwMDAwMDAwMG4pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFtb3VudFRvVGlwMjBVbml0cygnMC4wMDAwMDEnKSwgMW4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCBhbW91bnQnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGFtb3VudFRvVGlwMjBVbml0cygnaW52YWxpZCcpLCAvSW52YWxpZCBhbW91bnQgZm9ybWF0Lyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0aXAyMFVuaXRzVG9BbW91bnQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IDYtZGVjaW1hbCB1bml0cyB0byBodW1hbi1yZWFkYWJsZSBhbW91bnQnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGlwMjBVbml0c1RvQW1vdW50KDE1MDAwMDBuKSwgJzEuNScpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRpcDIwVW5pdHNUb0Ftb3VudCgxMDAwMDAwMDBuKSwgJzEwMC4wJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGlwMjBVbml0c1RvQW1vdW50KDFuKSwgJzAuMDAwMDAxJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdHJpbmdUb0J5dGVzMzInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IHN0cmluZyB0byBieXRlczMyJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaW5nVG9CeXRlczMyKCcxMjM0NScpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiByZXN1bHQsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQubGVuZ3RoLCA2Nik7XG4gICAgICBhc3NlcnQub2socmVzdWx0LnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3Igc3RyaW5nIGxvbmdlciB0aGFuIDMyIGJ5dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbG9uZ1N0cmluZyA9ICdhJy5yZXBlYXQoMzMpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBzdHJpbmdUb0J5dGVzMzIobG9uZ1N0cmluZyksIC9NZW1vIHRvbyBsb25nLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBlbmNvZGUgdHJhbnNmZXJXaXRoTWVtbyBjYWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgdG8gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcygnMHg3NDJkMzVjYzY2MzRjMDUzMjkyNWEzYjg0NGJjOWU3NTk1ZjBiZWIxJyk7XG4gICAgICBjb25zdCBhbW91bnQgPSAxNTAwMDAwbjtcbiAgICAgIGNvbnN0IG1lbW8gPSAnMTIzNDUnO1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlVGlwMjBUcmFuc2ZlcldpdGhNZW1vKHRvLCBhbW91bnQsIG1lbW8pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBlbmNvZGVkLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQub2soZW5jb2RlZC5zdGFydHNXaXRoKCcweCcpKTtcbiAgICAgIGFzc2VydC5vayhlbmNvZGVkLmxlbmd0aCA+IDEwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZW5jb2RlIHRyYW5zZmVyV2l0aE1lbW8gd2l0aG91dCBtZW1vJywgKCkgPT4ge1xuICAgICAgY29uc3QgdG8gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcygnMHg3NDJkMzVjYzY2MzRjMDUzMjkyNWEzYjg0NGJjOWU3NTk1ZjBiZWIxJyk7XG4gICAgICBjb25zdCBhbW91bnQgPSAxNTAwMDAwbjtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVRpcDIwVHJhbnNmZXJXaXRoTWVtbyh0bywgYW1vdW50KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgZW5jb2RlZCwgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0Lm9rKGVuY29kZWQuc3RhcnRzV2l0aCgnMHgnKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkVGlwMjBBbW91bnQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IGFtb3VudHMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFRpcDIwQW1vdW50KCcxLjUnKSwgdHJ1ZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFRpcDIwQW1vdW50KCcxMDAnKSwgdHJ1ZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFRpcDIwQW1vdW50KCcwLjAwMDAwMScpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW52YWxpZGF0ZSBpbmNvcnJlY3QgYW1vdW50cycsICgpID0+IHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkVGlwMjBBbW91bnQoJ2ludmFsaWQnKSwgZmFsc2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWRUaXAyMEFtb3VudCgnJyksIGZhbHNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkVGlwMjBBbW91bnQoJy01JyksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1RJUC0yMCBUcmFuc2FjdGlvbiBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBtb2NrVG9rZW4gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcygnMHgxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwJyk7XG4gIGNvbnN0IG1vY2tSZWNpcGllbnQgPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcygnMHg3NDJkMzVjYzY2MzRjMDUzMjkyNWEzYjg0NGJjOWU3NTk1ZjBiZWIxJyk7XG4gIGNvbnN0IG1vY2tGZWVUb2tlbiA9IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCcweGFiY2RlZmFiY2RlZmFiY2RlZmFiY2RlZmFiY2RlZmFiY2RlZmFiY2QnKTtcblxuICBkZXNjcmliZSgnYWRkT3BlcmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWRkIGEgc2luZ2xlIG9wZXJhdGlvbiB3aXRob3V0IG1lbW8nLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcblxuICAgICAgYnVpbGRlci5hZGRPcGVyYXRpb24oe1xuICAgICAgICB0b2tlbjogbW9ja1Rva2VuLFxuICAgICAgICB0bzogbW9ja1JlY2lwaWVudCxcbiAgICAgICAgYW1vdW50OiAnMTAwLjUnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBidWlsZGVyLmdldE9wZXJhdGlvbnMoKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BlcmF0aW9uc1swXS50b2tlbiwgbW9ja1Rva2VuKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zWzBdLnRvLCBtb2NrUmVjaXBpZW50KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zWzBdLmFtb3VudCwgJzEwMC41Jyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BlcmF0aW9uc1swXS5tZW1vLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhZGQgYSBzaW5nbGUgb3BlcmF0aW9uIHdpdGggbWVtbycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuXG4gICAgICBidWlsZGVyLmFkZE9wZXJhdGlvbih7XG4gICAgICAgIHRva2VuOiBtb2NrVG9rZW4sXG4gICAgICAgIHRvOiBtb2NrUmVjaXBpZW50LFxuICAgICAgICBhbW91bnQ6ICcxMDAuNScsXG4gICAgICAgIG1lbW86ICcyMDI1MDEnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBidWlsZGVyLmdldE9wZXJhdGlvbnMoKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BlcmF0aW9uc1swXS5tZW1vLCAnMjAyNTAxJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFkZCBtdWx0aXBsZSBvcGVyYXRpb25zIChiYXRjaCknLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcblxuICAgICAgYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHtcbiAgICAgICAgICB0b2tlbjogbW9ja1Rva2VuLFxuICAgICAgICAgIHRvOiBtb2NrUmVjaXBpZW50LFxuICAgICAgICAgIGFtb3VudDogJzUwLjAnLFxuICAgICAgICAgIG1lbW86ICcxMDAxJyxcbiAgICAgICAgfSlcbiAgICAgICAgLmFkZE9wZXJhdGlvbih7XG4gICAgICAgICAgdG9rZW46IG1vY2tUb2tlbixcbiAgICAgICAgICB0bzogbW9ja1JlY2lwaWVudCxcbiAgICAgICAgICBhbW91bnQ6ICczMC4wJyxcbiAgICAgICAgICBtZW1vOiAnMTAwMicsXG4gICAgICAgIH0pXG4gICAgICAgIC5hZGRPcGVyYXRpb24oe1xuICAgICAgICAgIHRva2VuOiBtb2NrVG9rZW4sXG4gICAgICAgICAgdG86IG1vY2tSZWNpcGllbnQsXG4gICAgICAgICAgYW1vdW50OiAnMjAuMCcsXG4gICAgICAgICAgbWVtbzogJzEwMDMnLFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IGJ1aWxkZXIuZ2V0T3BlcmF0aW9ucygpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9wZXJhdGlvbnMubGVuZ3RoLCAzKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zWzBdLm1lbW8sICcxMDAxJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BlcmF0aW9uc1sxXS5tZW1vLCAnMTAwMicpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9wZXJhdGlvbnNbMl0ubWVtbywgJzEwMDMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgdG9rZW4gYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hZGRPcGVyYXRpb24oe1xuICAgICAgICAgIHRva2VuOiAnMHhpbnZhbGlkJyBhcyBhbnksXG4gICAgICAgICAgdG86IG1vY2tSZWNpcGllbnQsXG4gICAgICAgICAgYW1vdW50OiAnMTAwJyxcbiAgICAgICAgfSk7XG4gICAgICB9LCAvSW52YWxpZCB0b2tlbiBhZGRyZXNzLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIHJlY2lwaWVudCBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFkZE9wZXJhdGlvbih7XG4gICAgICAgICAgdG9rZW46IG1vY2tUb2tlbixcbiAgICAgICAgICB0bzogJzB4aW52YWxpZCcgYXMgYW55LFxuICAgICAgICAgIGFtb3VudDogJzEwMCcsXG4gICAgICAgIH0pO1xuICAgICAgfSwgL0ludmFsaWQgcmVjaXBpZW50IGFkZHJlc3MvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgYW1vdW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFkZE9wZXJhdGlvbih7XG4gICAgICAgICAgdG9rZW46IG1vY2tUb2tlbixcbiAgICAgICAgICB0bzogbW9ja1JlY2lwaWVudCxcbiAgICAgICAgICBhbW91bnQ6ICdpbnZhbGlkLWFtb3VudCcsXG4gICAgICAgIH0pO1xuICAgICAgfSwgL0ludmFsaWQgYW1vdW50Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBtZW1vIGxvbmdlciB0aGFuIDMyIGJ5dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBjb25zdCBsb25nTWVtbyA9ICdhJy5yZXBlYXQoMzMpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hZGRPcGVyYXRpb24oe1xuICAgICAgICAgIHRva2VuOiBtb2NrVG9rZW4sXG4gICAgICAgICAgdG86IG1vY2tSZWNpcGllbnQsXG4gICAgICAgICAgYW1vdW50OiAnMTAwJyxcbiAgICAgICAgICBtZW1vOiBsb25nTWVtbyxcbiAgICAgICAgfSk7XG4gICAgICB9LCAvTWVtbyB0b28gbG9uZy8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmVlVG9rZW4nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgZmVlIHRva2VuJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG5cbiAgICAgIGJ1aWxkZXIuZmVlVG9rZW4obW9ja0ZlZVRva2VuKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXIuZ2V0RmVlVG9rZW4oKSwgbW9ja0ZlZVRva2VuKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgZmVlIHRva2VuIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuZmVlVG9rZW4oJ2ludmFsaWQtYWRkcmVzcycpO1xuICAgICAgfSwgL0ludmFsaWQgZmVlIHRva2VuIGFkZHJlc3MvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIHBhcmFtZXRlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgbm9uY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXIubm9uY2UoNDIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKChidWlsZGVyIGFzIGFueSkuX25vbmNlLCA0Mik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBuZWdhdGl2ZSBub25jZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIubm9uY2UoLTEpO1xuICAgICAgfSwgL0ludmFsaWQgbm9uY2UvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGdhcyBsaW1pdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlci5nYXMoNTAwMDAwbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fZ2FzLCA1MDAwMDBuKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGdhcyBsaW1pdCBmcm9tIHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlci5nYXMoJzUwMDAwMCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKChidWlsZGVyIGFzIGFueSkuX2dhcywgNTAwMDAwbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIGdhcyBsaW1pdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuZ2FzKDBuKTtcbiAgICAgIH0sIC9JbnZhbGlkIGdhcyBsaW1pdC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgbWF4RmVlUGVyR2FzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBidWlsZGVyLm1heEZlZVBlckdhcygxMDAwMDAwMDAwbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fbWF4RmVlUGVyR2FzLCAxMDAwMDAwMDAwbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBtYXhQcmlvcml0eUZlZVBlckdhcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlci5tYXhQcmlvcml0eUZlZVBlckdhcyg1MDAwMDAwMDBuKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9tYXhQcmlvcml0eUZlZVBlckdhcywgNTAwMDAwMDAwbik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdNZXRob2QgY2hhaW5pbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzdXBwb3J0IGZsdWVudCBpbnRlcmZhY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHtcbiAgICAgICAgICB0b2tlbjogbW9ja1Rva2VuLFxuICAgICAgICAgIHRvOiBtb2NrUmVjaXBpZW50LFxuICAgICAgICAgIGFtb3VudDogJzEwMCcsXG4gICAgICAgICAgbWVtbzogJzk5OTknLFxuICAgICAgICB9KVxuICAgICAgICAuZmVlVG9rZW4obW9ja0ZlZVRva2VuKVxuICAgICAgICAubm9uY2UoMTApXG4gICAgICAgIC5nYXMoNDAwMDAwbilcbiAgICAgICAgLm1heEZlZVBlckdhcygyMDAwMDAwMDAwbilcbiAgICAgICAgLm1heFByaW9yaXR5RmVlUGVyR2FzKDEwMDAwMDAwMDBuKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdUSVAtMjAgQ29uc3RhbnRzJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIGhhdmUgY29ycmVjdCBkZWNpbWFsIHBsYWNlcycsICgpID0+IHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoVElQMjBfREVDSU1BTFMsIDYpO1xuICB9KTtcbn0pO1xuIl19
133
+ (0, mocha_1.describe)('TIP-20 Transaction Build', () => {
134
+ const mockToken = ethers_1.ethers.utils.getAddress(tempo_1.TESTNET_TOKENS.alphaUSD.address);
135
+ const mockRecipient = ethers_1.ethers.utils.getAddress(tempo_1.TEST_RECIPIENT_ADDRESS);
136
+ const mockFeeToken = ethers_1.ethers.utils.getAddress(tempo_1.TESTNET_TOKENS.betaUSD.address);
137
+ (0, mocha_1.describe)('Build Transaction', () => {
138
+ (0, mocha_1.it)('should build single-operation transaction', async () => {
139
+ const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
140
+ builder
141
+ .addOperation({ token: mockToken, to: mockRecipient, amount: '100', memo: '1' })
142
+ .feeToken(mockFeeToken)
143
+ .nonce(0)
144
+ .gas(100000n)
145
+ .maxFeePerGas(tempo_1.TX_PARAMS.defaultMaxFeePerGas)
146
+ .maxPriorityFeePerGas(tempo_1.TX_PARAMS.defaultMaxPriorityFeePerGas);
147
+ const tx = (await builder.build());
148
+ assert_1.default.ok(tx instanceof transaction_1.Tip20Transaction);
149
+ assert_1.default.strictEqual(tx.getOperationCount(), 1);
150
+ assert_1.default.strictEqual(tx.getFeeToken(), mockFeeToken);
151
+ });
152
+ (0, mocha_1.it)('should build batch transaction with multiple operations', async () => {
153
+ const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
154
+ builder
155
+ .addOperation({ token: tempo_1.TESTNET_TOKENS.alphaUSD.address, to: mockRecipient, amount: '10', memo: '1' })
156
+ .addOperation({ token: tempo_1.TESTNET_TOKENS.betaUSD.address, to: mockRecipient, amount: '20', memo: '2' })
157
+ .addOperation({ token: tempo_1.TESTNET_TOKENS.thetaUSD.address, to: mockRecipient, amount: '30', memo: '3' })
158
+ .feeToken(mockFeeToken)
159
+ .nonce(42)
160
+ .gas(300000n)
161
+ .maxFeePerGas(tempo_1.TX_PARAMS.defaultMaxFeePerGas)
162
+ .maxPriorityFeePerGas(tempo_1.TX_PARAMS.defaultMaxPriorityFeePerGas);
163
+ const tx = (await builder.build());
164
+ assert_1.default.ok(tx instanceof transaction_1.Tip20Transaction);
165
+ assert_1.default.strictEqual(tx.getOperationCount(), 3);
166
+ assert_1.default.strictEqual(tx.isBatch(), true);
167
+ });
168
+ (0, mocha_1.it)('should build transaction without fee token', async () => {
169
+ const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
170
+ builder
171
+ .addOperation({ token: mockToken, to: mockRecipient, amount: '50' })
172
+ .nonce(1)
173
+ .gas(100000n)
174
+ .maxFeePerGas(tempo_1.TX_PARAMS.defaultMaxFeePerGas)
175
+ .maxPriorityFeePerGas(tempo_1.TX_PARAMS.defaultMaxPriorityFeePerGas);
176
+ const tx = (await builder.build());
177
+ assert_1.default.ok(tx instanceof transaction_1.Tip20Transaction);
178
+ assert_1.default.strictEqual(tx.getFeeToken(), undefined);
179
+ });
180
+ });
181
+ (0, mocha_1.describe)('Build Validation Errors', () => {
182
+ (0, mocha_1.it)('should throw error when no operations added', async () => {
183
+ const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
184
+ builder.nonce(0).gas(100000n).maxFeePerGas(1000000000n).maxPriorityFeePerGas(500000000n);
185
+ await assert_1.default.rejects(async () => await builder.build(), tempo_1.ERROR_MESSAGES.noOperations);
186
+ });
187
+ (0, mocha_1.it)('should throw error when nonce not set', async () => {
188
+ const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
189
+ builder
190
+ .addOperation({ token: mockToken, to: mockRecipient, amount: '100' })
191
+ .gas(100000n)
192
+ .maxFeePerGas(1000000000n)
193
+ .maxPriorityFeePerGas(500000000n);
194
+ await assert_1.default.rejects(async () => await builder.build(), tempo_1.ERROR_MESSAGES.missingNonce);
195
+ });
196
+ (0, mocha_1.it)('should throw error when gas not set', async () => {
197
+ const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
198
+ builder
199
+ .addOperation({ token: mockToken, to: mockRecipient, amount: '100' })
200
+ .nonce(0)
201
+ .maxFeePerGas(1000000000n)
202
+ .maxPriorityFeePerGas(500000000n);
203
+ await assert_1.default.rejects(async () => await builder.build(), tempo_1.ERROR_MESSAGES.missingGas);
204
+ });
205
+ (0, mocha_1.it)('should throw error when maxFeePerGas not set', async () => {
206
+ const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
207
+ builder
208
+ .addOperation({ token: mockToken, to: mockRecipient, amount: '100' })
209
+ .nonce(0)
210
+ .gas(100000n)
211
+ .maxPriorityFeePerGas(500000000n);
212
+ await assert_1.default.rejects(async () => await builder.build(), tempo_1.ERROR_MESSAGES.missingMaxFeePerGas);
213
+ });
214
+ (0, mocha_1.it)('should throw error when maxPriorityFeePerGas not set', async () => {
215
+ const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
216
+ builder
217
+ .addOperation({ token: mockToken, to: mockRecipient, amount: '100' })
218
+ .nonce(0)
219
+ .gas(100000n)
220
+ .maxFeePerGas(1000000000n);
221
+ await assert_1.default.rejects(async () => await builder.build(), tempo_1.ERROR_MESSAGES.missingMaxPriorityFeePerGas);
222
+ });
223
+ });
224
+ (0, mocha_1.describe)('Round-Trip: Build -> Serialize -> Operations Check', () => {
225
+ (0, mocha_1.it)('should preserve operation data through build', async () => {
226
+ const operations = [{ token: mockToken, to: mockRecipient, amount: '123', memo: '1' }];
227
+ const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
228
+ builder
229
+ .addOperation(operations[0])
230
+ .feeToken(mockFeeToken)
231
+ .nonce(10)
232
+ .gas(150000n)
233
+ .maxFeePerGas(2000000000n)
234
+ .maxPriorityFeePerGas(1000000000n);
235
+ const tx = (await builder.build());
236
+ const txOps = tx.getOperations();
237
+ assert_1.default.strictEqual(txOps.length, 1);
238
+ assert_1.default.strictEqual(txOps[0].token, operations[0].token);
239
+ assert_1.default.strictEqual(txOps[0].to, operations[0].to);
240
+ assert_1.default.strictEqual(txOps[0].amount, operations[0].amount);
241
+ assert_1.default.strictEqual(txOps[0].memo, operations[0].memo);
242
+ });
243
+ });
244
+ (0, mocha_1.describe)('Build -> Serialize -> Sign Flow', () => {
245
+ (0, mocha_1.it)('should produce serializable unsigned transaction', async () => {
246
+ const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
247
+ builder
248
+ .addOperation({ token: mockToken, to: mockRecipient, amount: '50', memo: '2' })
249
+ .feeToken(mockFeeToken)
250
+ .nonce(5)
251
+ .gas(100000n)
252
+ .maxFeePerGas(2000000000n)
253
+ .maxPriorityFeePerGas(1000000000n);
254
+ const tx = (await builder.build());
255
+ const unsignedHex = await tx.serialize();
256
+ assert_1.default.ok(unsignedHex.startsWith(constants_1.AA_TRANSACTION_TYPE));
257
+ assert_1.default.ok(/^0x[0-9a-f]+$/i.test(unsignedHex));
258
+ });
259
+ (0, mocha_1.it)('should support full sign and broadcast flow', async () => {
260
+ const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
261
+ builder
262
+ .addOperation({ token: mockToken, to: mockRecipient, amount: '75', memo: '3' })
263
+ .feeToken(mockFeeToken)
264
+ .nonce(123)
265
+ .gas(120000n)
266
+ .maxFeePerGas(2500000000n)
267
+ .maxPriorityFeePerGas(1200000000n);
268
+ const tx = (await builder.build());
269
+ const unsignedHex = await tx.serialize();
270
+ tx.setSignature(tempo_1.SIGNATURE_TEST_DATA.validSignature);
271
+ const broadcastHex = await tx.toBroadcastFormat();
272
+ assert_1.default.ok(broadcastHex.startsWith(constants_1.AA_TRANSACTION_TYPE));
273
+ assert_1.default.ok(broadcastHex.length > unsignedHex.length, 'Signed should be longer');
274
+ });
275
+ });
276
+ (0, mocha_1.describe)('Transaction JSON Representation', () => {
277
+ (0, mocha_1.it)('should produce consistent JSON from built transaction', async () => {
278
+ const builder = new transactionBuilder_1.Tip20TransactionBuilder(mockCoinConfig);
279
+ builder
280
+ .addOperation({ token: mockToken, to: mockRecipient, amount: '100', memo: '4' })
281
+ .feeToken(mockFeeToken)
282
+ .nonce(50)
283
+ .gas(200000n)
284
+ .maxFeePerGas(3000000000n)
285
+ .maxPriorityFeePerGas(1500000000n);
286
+ const tx = (await builder.build());
287
+ const json = tx.toJson();
288
+ assert_1.default.strictEqual(json.type, constants_1.AA_TRANSACTION_TYPE);
289
+ assert_1.default.strictEqual(json.nonce, 50);
290
+ assert_1.default.strictEqual(json.gas, '200000');
291
+ assert_1.default.strictEqual(json.maxFeePerGas, '3000000000');
292
+ assert_1.default.strictEqual(json.maxPriorityFeePerGas, '1500000000');
293
+ assert_1.default.strictEqual(json.callCount, 1);
294
+ assert_1.default.strictEqual(json.feeToken, mockFeeToken);
295
+ });
296
+ });
297
+ });
298
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixpQ0FBcUM7QUFDckMsbUNBQWdDO0FBQ2hDLHlFQUEyRTtBQUMzRSwyREFBNkQ7QUFDN0QsK0NBTTZCO0FBQzdCLHVEQUE4RTtBQUM5RSw0Q0FBdUM7QUFDdkMsOENBTTRCO0FBRTVCLE1BQU0sY0FBYyxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFM0MsSUFBQSxnQkFBUSxFQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtJQUNoQyxJQUFBLGdCQUFRLEVBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO1FBQ2xDLElBQUEsVUFBRSxFQUFDLGtEQUFrRCxFQUFFLEdBQUcsRUFBRTtZQUMxRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFBLDBCQUFrQixFQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3hELGdCQUFNLENBQUMsV0FBVyxDQUFDLElBQUEsMEJBQWtCLEVBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDMUQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBQSwwQkFBa0IsRUFBQyxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsVUFBRSxFQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtZQUMvQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLDBCQUFrQixFQUFDLFNBQVMsQ0FBQyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsZ0JBQVEsRUFBQyxvQkFBb0IsRUFBRSxHQUFH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QU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBkZXNjcmliZSwgaXQgfSBmcm9tICdtb2NoYSc7XG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xuaW1wb3J0IHsgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBUaXAyMFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBhbW91bnRUb1RpcDIwVW5pdHMsXG4gIHRpcDIwVW5pdHNUb0Ftb3VudCxcbiAgc3RyaW5nVG9CeXRlczMyLFxuICBlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8sXG4gIGlzVmFsaWRUaXAyMEFtb3VudCxcbn0gZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBUSVAyMF9ERUNJTUFMUywgQUFfVFJBTlNBQ1RJT05fVFlQRSB9IGZyb20gJy4uLy4uL3NyYy9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgVEVTVE5FVF9UT0tFTlMsXG4gIFRYX1BBUkFNUyxcbiAgRVJST1JfTUVTU0FHRVMsXG4gIFNJR05BVFVSRV9URVNUX0RBVEEsXG4gIFRFU1RfUkVDSVBJRU5UX0FERFJFU1MsXG59IGZyb20gJy4uL3Jlc291cmNlcy90ZW1wbyc7XG5cbmNvbnN0IG1vY2tDb2luQ29uZmlnID0gY29pbnMuZ2V0KCd0dGVtcG8nKTtcblxuZGVzY3JpYmUoJ1RJUC0yMCBVdGlsaXRpZXMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdhbW91bnRUb1RpcDIwVW5pdHMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IGRlY2ltYWwgYW1vdW50IHRvIDYtZGVjaW1hbCB1bml0cycsICgpID0+IHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhbW91bnRUb1RpcDIwVW5pdHMoJzEuNScpLCAxNTAwMDAwbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYW1vdW50VG9UaXAyMFVuaXRzKCcxMDAnKSwgMTAwMDAwMDAwbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYW1vdW50VG9UaXAyMFVuaXRzKCcwLjAwMDAwMScpLCAxbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIGFtb3VudCcsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYW1vdW50VG9UaXAyMFVuaXRzKCdpbnZhbGlkJyksIC9JbnZhbGlkIGFtb3VudCBmb3JtYXQvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RpcDIwVW5pdHNUb0Ftb3VudCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgNi1kZWNpbWFsIHVuaXRzIHRvIGh1bWFuLXJlYWRhYmxlIGFtb3VudCcsICgpID0+IHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0aXAyMFVuaXRzVG9BbW91bnQoMTUwMDAwMG4pLCAnMS41Jyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGlwMjBVbml0c1RvQW1vdW50KDEwMDAwMDAwMG4pLCAnMTAwLjAnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0aXAyMFVuaXRzVG9BbW91bnQoMW4pLCAnMC4wMDAwMDEnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N0cmluZ1RvQnl0ZXMzMicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgc3RyaW5nIHRvIGJ5dGVzMzInLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBzdHJpbmdUb0J5dGVzMzIoJzEyMzQ1Jyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0Lmxlbmd0aCwgNjYpO1xuICAgICAgYXNzZXJ0Lm9rKHJlc3VsdC5zdGFydHNXaXRoKCcweCcpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIHN0cmluZyBsb25nZXIgdGhhbiAzMiBieXRlcycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gc3RyaW5nVG9CeXRlczMyKCdhJy5yZXBlYXQoMzMpKSwgL01lbW8gdG9vIGxvbmcvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VuY29kZVRpcDIwVHJhbnNmZXJXaXRoTWVtbycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGVuY29kZSB0cmFuc2ZlcldpdGhNZW1vIGNhbGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0byA9IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCcweDc0MmQzNWNjNjYzNGMwNTMyOTI1YTNiODQ0YmM5ZTc1OTVmMGJlYjEnKTtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8odG8sIDE1MDAwMDBuLCAnMTIzNDUnKTtcbiAgICAgIGFzc2VydC5vayhlbmNvZGVkLnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgICAgYXNzZXJ0Lm9rKGVuY29kZWQubGVuZ3RoID4gMTApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFRpcDIwQW1vdW50JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYW1vdW50cyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFRpcDIwQW1vdW50KCcxLjUnKSwgdHJ1ZSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZFRpcDIwQW1vdW50KCdpbnZhbGlkJyksIGZhbHNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkVGlwMjBBbW91bnQoJy01JyksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ1RJUC0yMCBUcmFuc2FjdGlvbiBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBtb2NrVG9rZW4gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcygnMHgxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwJyk7XG4gIGNvbnN0IG1vY2tSZWNpcGllbnQgPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcygnMHg3NDJkMzVjYzY2MzRjMDUzMjkyNWEzYjg0NGJjOWU3NTk1ZjBiZWIxJyk7XG4gIGNvbnN0IG1vY2tGZWVUb2tlbiA9IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKCcweGFiY2RlZmFiY2RlZmFiY2RlZmFiY2RlZmFiY2RlZmFiY2RlZmFiY2QnKTtcblxuICBkZXNjcmliZSgnYWRkT3BlcmF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWRkIG9wZXJhdGlvbiB3aXRoIGFuZCB3aXRob3V0IG1lbW8nLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXIuYWRkT3BlcmF0aW9uKHsgdG9rZW46IG1vY2tUb2tlbiwgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzEwMCcgfSk7XG4gICAgICBidWlsZGVyLmFkZE9wZXJhdGlvbih7IHRva2VuOiBtb2NrVG9rZW4sIHRvOiBtb2NrUmVjaXBpZW50LCBhbW91bnQ6ICc1MCcsIG1lbW86ICcxJyB9KTtcblxuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IGJ1aWxkZXIuZ2V0T3BlcmF0aW9ucygpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG9wZXJhdGlvbnMubGVuZ3RoLCAyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvcGVyYXRpb25zWzBdLm1lbW8sIHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3BlcmF0aW9uc1sxXS5tZW1vLCAnMScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCBhZGRyZXNzZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IGJ1aWxkZXIuYWRkT3BlcmF0aW9uKHsgdG9rZW46ICcweGludmFsaWQnIGFzIGFueSwgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzEwMCcgfSksXG4gICAgICAgIC9JbnZhbGlkIHRva2VuIGFkZHJlc3MvXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5hZGRPcGVyYXRpb24oeyB0b2tlbjogbW9ja1Rva2VuLCB0bzogJzB4aW52YWxpZCcgYXMgYW55LCBhbW91bnQ6ICcxMDAnIH0pLFxuICAgICAgICAvSW52YWxpZCByZWNpcGllbnQgYWRkcmVzcy9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIGFtb3VudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5hZGRPcGVyYXRpb24oeyB0b2tlbjogbW9ja1Rva2VuLCB0bzogbW9ja1JlY2lwaWVudCwgYW1vdW50OiAnaW52YWxpZC1hbW91bnQnIH0pLFxuICAgICAgICAvSW52YWxpZCBhbW91bnQvXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgbWVtbyBsb25nZXIgdGhhbiAzMiBieXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gYnVpbGRlci5hZGRPcGVyYXRpb24oeyB0b2tlbjogbW9ja1Rva2VuLCB0bzogbW9ja1JlY2lwaWVudCwgYW1vdW50OiAnMTAwJywgbWVtbzogJ2EnLnJlcGVhdCgzMykgfSksXG4gICAgICAgIC9NZW1vIHRvbyBsb25nL1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ZlZVRva2VuJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2V0IGFuZCBnZXQgZmVlIHRva2VuJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBidWlsZGVyLmZlZVRva2VuKG1vY2tGZWVUb2tlbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlci5nZXRGZWVUb2tlbigpLCBtb2NrRmVlVG9rZW4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCBmZWUgdG9rZW4gYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLmZlZVRva2VuKCdpbnZhbGlkLWFkZHJlc3MnKSwgL0ludmFsaWQgZmVlIHRva2VuIGFkZHJlc3MvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIHBhcmFtZXRlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgbm9uY2UsIGdhcywgbWF4RmVlUGVyR2FzLCBhbmQgbWF4UHJpb3JpdHlGZWVQZXJHYXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXIubm9uY2UoNDIpLmdhcyg1MDAwMDBuKS5tYXhGZWVQZXJHYXMoMTAwMDAwMDAwMG4pLm1heFByaW9yaXR5RmVlUGVyR2FzKDUwMDAwMDAwMG4pO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoKGJ1aWxkZXIgYXMgYW55KS5fbm9uY2UsIDQyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCgoYnVpbGRlciBhcyBhbnkpLl9nYXMsIDUwMDAwMG4pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKChidWlsZGVyIGFzIGFueSkuX21heEZlZVBlckdhcywgMTAwMDAwMDAwMG4pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKChidWlsZGVyIGFzIGFueSkuX21heFByaW9yaXR5RmVlUGVyR2FzLCA1MDAwMDAwMDBuKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgbm9uY2UgYW5kIGdhcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLm5vbmNlKC0xKSwgL0ludmFsaWQgbm9uY2UvKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5nYXMoMG4pLCAvSW52YWxpZCBnYXMgbGltaXQvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ01ldGhvZCBjaGFpbmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgZmx1ZW50IGludGVyZmFjZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IG1vY2tUb2tlbiwgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzEwMCcsIG1lbW86ICc1JyB9KVxuICAgICAgICAuZmVlVG9rZW4obW9ja0ZlZVRva2VuKVxuICAgICAgICAubm9uY2UoMTApXG4gICAgICAgIC5nYXMoNDAwMDAwbilcbiAgICAgICAgLm1heEZlZVBlckdhcygyMDAwMDAwMDAwbilcbiAgICAgICAgLm1heFByaW9yaXR5RmVlUGVyR2FzKDEwMDAwMDAwMDBuKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdUSVAtMjAgQ29uc3RhbnRzJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIGhhdmUgY29ycmVjdCBkZWNpbWFsIHBsYWNlcycsICgpID0+IHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoVElQMjBfREVDSU1BTFMsIDYpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnVElQLTIwIFRyYW5zYWN0aW9uIEJ1aWxkJywgKCkgPT4ge1xuICBjb25zdCBtb2NrVG9rZW4gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyhURVNUTkVUX1RPS0VOUy5hbHBoYVVTRC5hZGRyZXNzKTtcbiAgY29uc3QgbW9ja1JlY2lwaWVudCA9IGV0aGVycy51dGlscy5nZXRBZGRyZXNzKFRFU1RfUkVDSVBJRU5UX0FERFJFU1MpO1xuICBjb25zdCBtb2NrRmVlVG9rZW4gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyhURVNUTkVUX1RPS0VOUy5iZXRhVVNELmFkZHJlc3MpO1xuXG4gIGRlc2NyaWJlKCdCdWlsZCBUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHNpbmdsZS1vcGVyYXRpb24gdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFkZE9wZXJhdGlvbih7IHRva2VuOiBtb2NrVG9rZW4sIHRvOiBtb2NrUmVjaXBpZW50LCBhbW91bnQ6ICcxMDAnLCBtZW1vOiAnMScgfSlcbiAgICAgICAgLmZlZVRva2VuKG1vY2tGZWVUb2tlbilcbiAgICAgICAgLm5vbmNlKDApXG4gICAgICAgIC5nYXMoMTAwMDAwbilcbiAgICAgICAgLm1heEZlZVBlckdhcyhUWF9QQVJBTVMuZGVmYXVsdE1heEZlZVBlckdhcylcbiAgICAgICAgLm1heFByaW9yaXR5RmVlUGVyR2FzKFRYX1BBUkFNUy5kZWZhdWx0TWF4UHJpb3JpdHlGZWVQZXJHYXMpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRpcDIwVHJhbnNhY3Rpb247XG5cbiAgICAgIGFzc2VydC5vayh0eCBpbnN0YW5jZW9mIFRpcDIwVHJhbnNhY3Rpb24pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4LmdldE9wZXJhdGlvbkNvdW50KCksIDEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4LmdldEZlZVRva2VuKCksIG1vY2tGZWVUb2tlbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGJhdGNoIHRyYW5zYWN0aW9uIHdpdGggbXVsdGlwbGUgb3BlcmF0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IFRFU1RORVRfVE9LRU5TLmFscGhhVVNELmFkZHJlc3MsIHRvOiBtb2NrUmVjaXBpZW50LCBhbW91bnQ6ICcxMCcsIG1lbW86ICcxJyB9KVxuICAgICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IFRFU1RORVRfVE9LRU5TLmJldGFVU0QuYWRkcmVzcywgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzIwJywgbWVtbzogJzInIH0pXG4gICAgICAgIC5hZGRPcGVyYXRpb24oeyB0b2tlbjogVEVTVE5FVF9UT0tFTlMudGhldGFVU0QuYWRkcmVzcywgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzMwJywgbWVtbzogJzMnIH0pXG4gICAgICAgIC5mZWVUb2tlbihtb2NrRmVlVG9rZW4pXG4gICAgICAgIC5ub25jZSg0MilcbiAgICAgICAgLmdhcygzMDAwMDBuKVxuICAgICAgICAubWF4RmVlUGVyR2FzKFRYX1BBUkFNUy5kZWZhdWx0TWF4RmVlUGVyR2FzKVxuICAgICAgICAubWF4UHJpb3JpdHlGZWVQZXJHYXMoVFhfUEFSQU1TLmRlZmF1bHRNYXhQcmlvcml0eUZlZVBlckdhcyk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVGlwMjBUcmFuc2FjdGlvbjtcblxuICAgICAgYXNzZXJ0Lm9rKHR4IGluc3RhbmNlb2YgVGlwMjBUcmFuc2FjdGlvbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHguZ2V0T3BlcmF0aW9uQ291bnQoKSwgMyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHguaXNCYXRjaCgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdHJhbnNhY3Rpb24gd2l0aG91dCBmZWUgdG9rZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFkZE9wZXJhdGlvbih7IHRva2VuOiBtb2NrVG9rZW4sIHRvOiBtb2NrUmVjaXBpZW50LCBhbW91bnQ6ICc1MCcgfSlcbiAgICAgICAgLm5vbmNlKDEpXG4gICAgICAgIC5nYXMoMTAwMDAwbilcbiAgICAgICAgLm1heEZlZVBlckdhcyhUWF9QQVJBTVMuZGVmYXVsdE1heEZlZVBlckdhcylcbiAgICAgICAgLm1heFByaW9yaXR5RmVlUGVyR2FzKFRYX1BBUkFNUy5kZWZhdWx0TWF4UHJpb3JpdHlGZWVQZXJHYXMpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRpcDIwVHJhbnNhY3Rpb247XG5cbiAgICAgIGFzc2VydC5vayh0eCBpbnN0YW5jZW9mIFRpcDIwVHJhbnNhY3Rpb24pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4LmdldEZlZVRva2VuKCksIHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCdWlsZCBWYWxpZGF0aW9uIEVycm9ycycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gbm8gb3BlcmF0aW9ucyBhZGRlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlci5ub25jZSgwKS5nYXMoMTAwMDAwbikubWF4RmVlUGVyR2FzKDEwMDAwMDAwMDBuKS5tYXhQcmlvcml0eUZlZVBlckdhcyg1MDAwMDAwMDBuKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSwgRVJST1JfTUVTU0FHRVMubm9PcGVyYXRpb25zKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBub25jZSBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hZGRPcGVyYXRpb24oeyB0b2tlbjogbW9ja1Rva2VuLCB0bzogbW9ja1JlY2lwaWVudCwgYW1vdW50OiAnMTAwJyB9KVxuICAgICAgICAuZ2FzKDEwMDAwMG4pXG4gICAgICAgIC5tYXhGZWVQZXJHYXMoMTAwMDAwMDAwMG4pXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcyg1MDAwMDAwMDBuKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSwgRVJST1JfTUVTU0FHRVMubWlzc2luZ05vbmNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBnYXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IG1vY2tUb2tlbiwgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzEwMCcgfSlcbiAgICAgICAgLm5vbmNlKDApXG4gICAgICAgIC5tYXhGZWVQZXJHYXMoMTAwMDAwMDAwMG4pXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcyg1MDAwMDAwMDBuKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSwgRVJST1JfTUVTU0FHRVMubWlzc2luZ0dhcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gbWF4RmVlUGVyR2FzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFkZE9wZXJhdGlvbih7IHRva2VuOiBtb2NrVG9rZW4sIHRvOiBtb2NrUmVjaXBpZW50LCBhbW91bnQ6ICcxMDAnIH0pXG4gICAgICAgIC5ub25jZSgwKVxuICAgICAgICAuZ2FzKDEwMDAwMG4pXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcyg1MDAwMDAwMDBuKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSwgRVJST1JfTUVTU0FHRVMubWlzc2luZ01heEZlZVBlckdhcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIHdoZW4gbWF4UHJpb3JpdHlGZWVQZXJHYXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IG1vY2tUb2tlbiwgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzEwMCcgfSlcbiAgICAgICAgLm5vbmNlKDApXG4gICAgICAgIC5nYXMoMTAwMDAwbilcbiAgICAgICAgLm1heEZlZVBlckdhcygxMDAwMDAwMDAwbik7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhhc3luYyAoKSA9PiBhd2FpdCBidWlsZGVyLmJ1aWxkKCksIEVSUk9SX01FU1NBR0VTLm1pc3NpbmdNYXhQcmlvcml0eUZlZVBlckdhcyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdSb3VuZC1UcmlwOiBCdWlsZCAtPiBTZXJpYWxpemUgLT4gT3BlcmF0aW9ucyBDaGVjaycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByZXNlcnZlIG9wZXJhdGlvbiBkYXRhIHRocm91Z2ggYnVpbGQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvcGVyYXRpb25zID0gW3sgdG9rZW46IG1vY2tUb2tlbiwgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzEyMycsIG1lbW86ICcxJyB9XTtcblxuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hZGRPcGVyYXRpb24ob3BlcmF0aW9uc1swXSlcbiAgICAgICAgLmZlZVRva2VuKG1vY2tGZWVUb2tlbilcbiAgICAgICAgLm5vbmNlKDEwKVxuICAgICAgICAuZ2FzKDE1MDAwMG4pXG4gICAgICAgIC5tYXhGZWVQZXJHYXMoMjAwMDAwMDAwMG4pXG4gICAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcygxMDAwMDAwMDAwbik7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVGlwMjBUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHR4T3BzID0gdHguZ2V0T3BlcmF0aW9ucygpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHhPcHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eE9wc1swXS50b2tlbiwgb3BlcmF0aW9uc1swXS50b2tlbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHhPcHNbMF0udG8sIG9wZXJhdGlvbnNbMF0udG8pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4T3BzWzBdLmFtb3VudCwgb3BlcmF0aW9uc1swXS5hbW91bnQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4T3BzWzBdLm1lbW8sIG9wZXJhdGlvbnNbMF0ubWVtbyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCdWlsZCAtPiBTZXJpYWxpemUgLT4gU2lnbiBGbG93JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBzZXJpYWxpemFibGUgdW5zaWduZWQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyKG1vY2tDb2luQ29uZmlnKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFkZE9wZXJhdGlvbih7IHRva2VuOiBtb2NrVG9rZW4sIHRvOiBtb2NrUmVjaXBpZW50LCBhbW91bnQ6ICc1MCcsIG1lbW86ICcyJyB9KVxuICAgICAgICAuZmVlVG9rZW4obW9ja0ZlZVRva2VuKVxuICAgICAgICAubm9uY2UoNSlcbiAgICAgICAgLmdhcygxMDAwMDBuKVxuICAgICAgICAubWF4RmVlUGVyR2FzKDIwMDAwMDAwMDBuKVxuICAgICAgICAubWF4UHJpb3JpdHlGZWVQZXJHYXMoMTAwMDAwMDAwMG4pO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRpcDIwVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB1bnNpZ25lZEhleCA9IGF3YWl0IHR4LnNlcmlhbGl6ZSgpO1xuXG4gICAgICBhc3NlcnQub2sodW5zaWduZWRIZXguc3RhcnRzV2l0aChBQV9UUkFOU0FDVElPTl9UWVBFKSk7XG4gICAgICBhc3NlcnQub2soL14weFswLTlhLWZdKyQvaS50ZXN0KHVuc2lnbmVkSGV4KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgZnVsbCBzaWduIGFuZCBicm9hZGNhc3QgZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIobW9ja0NvaW5Db25maWcpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IG1vY2tUb2tlbiwgdG86IG1vY2tSZWNpcGllbnQsIGFtb3VudDogJzc1JywgbWVtbzogJzMnIH0pXG4gICAgICAgIC5mZWVUb2tlbihtb2NrRmVlVG9rZW4pXG4gICAgICAgIC5ub25jZSgxMjMpXG4gICAgICAgIC5nYXMoMTIwMDAwbilcbiAgICAgICAgLm1heEZlZVBlckdhcygyNTAwMDAwMDAwbilcbiAgICAgICAgLm1heFByaW9yaXR5RmVlUGVyR2FzKDEyMDAwMDAwMDBuKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUaXAyMFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdW5zaWduZWRIZXggPSBhd2FpdCB0eC5zZXJpYWxpemUoKTtcblxuICAgICAgdHguc2V0U2lnbmF0dXJlKFNJR05BVFVSRV9URVNUX0RBVEEudmFsaWRTaWduYXR1cmUpO1xuXG4gICAgICBjb25zdCBicm9hZGNhc3RIZXggPSBhd2FpdCB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgYXNzZXJ0Lm9rKGJyb2FkY2FzdEhleC5zdGFydHNXaXRoKEFBX1RSQU5TQUNUSU9OX1RZUEUpKTtcbiAgICAgIGFzc2VydC5vayhicm9hZGNhc3RIZXgubGVuZ3RoID4gdW5zaWduZWRIZXgubGVuZ3RoLCAnU2lnbmVkIHNob3VsZCBiZSBsb25nZXInKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIEpTT04gUmVwcmVzZW50YXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGNvbnNpc3RlbnQgSlNPTiBmcm9tIGJ1aWx0IHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihtb2NrQ29pbkNvbmZpZyk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hZGRPcGVyYXRpb24oeyB0b2tlbjogbW9ja1Rva2VuLCB0bzogbW9ja1JlY2lwaWVudCwgYW1vdW50OiAnMTAwJywgbWVtbzogJzQnIH0pXG4gICAgICAgIC5mZWVUb2tlbihtb2NrRmVlVG9rZW4pXG4gICAgICAgIC5ub25jZSg1MClcbiAgICAgICAgLmdhcygyMDAwMDBuKVxuICAgICAgICAubWF4RmVlUGVyR2FzKDMwMDAwMDAwMDBuKVxuICAgICAgICAubWF4UHJpb3JpdHlGZWVQZXJHYXMoMTUwMDAwMDAwMG4pO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRpcDIwVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChqc29uLnR5cGUsIEFBX1RSQU5TQUNUSU9OX1RZUEUpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGpzb24ubm9uY2UsIDUwKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChqc29uLmdhcywgJzIwMDAwMCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGpzb24ubWF4RmVlUGVyR2FzLCAnMzAwMDAwMDAwMCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGpzb24ubWF4UHJpb3JpdHlGZWVQZXJHYXMsICcxNTAwMDAwMDAwJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoanNvbi5jYWxsQ291bnQsIDEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGpzb24uZmVlVG9rZW4sIG1vY2tGZWVUb2tlbik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=